├── .nojekyll ├── .gitattributes ├── src ├── Reactor.elm ├── TeachingMaterial.elm └── Main.elm ├── elm-tooling.json ├── script_map_svg2elm.sh ├── .gitignore ├── script_build_elmjs.sh ├── .github ├── dependabot.yml └── workflows │ └── validateTeachingMaterialTable.yml ├── script_teachingmaterial_yml2elm.sh ├── tests └── Tests.elm ├── index.html ├── LICENSE ├── elm.json ├── multiselect.css ├── README.md └── data └── teachingmaterial.yml /.nojekyll: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.map binary -------------------------------------------------------------------------------- /src/Reactor.elm: -------------------------------------------------------------------------------- 1 | module Reactor exposing (main) 2 | 3 | import Main 4 | 5 | main = Main.reactor -------------------------------------------------------------------------------- /elm-tooling.json: -------------------------------------------------------------------------------- 1 | { 2 | "tools": { 3 | "elm": "0.19.1", 4 | "elm-test-rs": "3.0.0" 5 | } 6 | } -------------------------------------------------------------------------------- /script_map_svg2elm.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # svg map to elm code 4 | # https://github.com/pinata-llc/svg2elm 5 | svg2elm --module MapOfComputionalArchaeology data/comparchmap.svg > src/MapOfComputionalArchaeology.elm -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # elm-package generated files 2 | elm-stuff 3 | # elm-repl generated files 4 | repl-temp-* 5 | 6 | # rendered, intermediate data products 7 | src/TeachingMaterialData.elm 8 | src/TeachingMaterialEdges.elm 9 | elm.js -------------------------------------------------------------------------------- /script_build_elmjs.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | elm make src/Main.elm --optimize --output=elm.js 4 | uglifyjs elm.js --compress 'pure_funcs=[F2,F3,F4,F5,F6,F7,F8,F9,A2,A3,A4,A5,A6,A7,A8,A9],pure_getters,keep_fargs=false,unsafe_comps,unsafe' | uglifyjs --mangle --output elm.min.js -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # Set update schedule for GitHub Actions 2 | 3 | version: 2 4 | updates: 5 | 6 | - package-ecosystem: "github-actions" 7 | directory: "/" 8 | schedule: 9 | # Check for updates to GitHub Actions every month 10 | interval: "monthly" -------------------------------------------------------------------------------- /script_teachingmaterial_yml2elm.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # teaching material yml to elm code 4 | cp data/teachingmaterial.yml src/TeachingMaterialData.elm 5 | prepent1='module TeachingMaterialData exposing (teachingMaterialString) 6 | \n 7 | \nteachingMaterialString : String 8 | \nteachingMaterialString = """' 9 | echo -en $prepent1 | cat - src/TeachingMaterialData.elm > temp && mv temp src/TeachingMaterialData.elm 10 | echo '"""' >> src/TeachingMaterialData.elm 11 | -------------------------------------------------------------------------------- /tests/Tests.elm: -------------------------------------------------------------------------------- 1 | module Tests exposing (..) 2 | 3 | import TeachingMaterial exposing (parseTeachingResources) 4 | import TeachingMaterialData exposing (teachingMaterialString) 5 | 6 | import Expect 7 | import Test exposing (Test, describe, test) 8 | 9 | suite : Test 10 | suite = 11 | describe "Pseudo-test for teaching material list validation" 12 | [ test "if the .yml file can be parsed" <| 13 | \_ -> 14 | let res = parseTeachingResources teachingMaterialString 15 | in Expect.ok res 16 | ] 17 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Computational archaeology teaching material list 7 | 8 | 9 | 10 | 11 |
12 | 13 | 19 | 20 | -------------------------------------------------------------------------------- /.github/workflows/validateTeachingMaterialTable.yml: -------------------------------------------------------------------------------- 1 | name: validate data/teachingmaterial.yml 2 | 3 | # Trigger the workflow on push or pull request, but only for the main branch 4 | on: 5 | pull_request: 6 | push: 7 | branches: [main] 8 | 9 | jobs: 10 | validate: 11 | name: validate file 12 | runs-on: ubuntu-latest 13 | steps: 14 | 15 | - name: Clone repo 16 | uses: actions/checkout@v5 17 | 18 | - name: Install elm and elm-test-rs as defined in elm-tooling.json 19 | uses: mpizenberg/elm-tooling-action@v1.7 20 | 21 | - name: Create module TeachingMaterialData with teachingMaterialString 22 | run: ./script_teachingmaterial_yml2elm.sh 23 | 24 | - name: Try parsing teachingMaterialString by running the pseudo-test 25 | run: elm-test-rs 26 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 SSLA - Scientific Scripting Languages in Archaeology 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /elm.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "application", 3 | "source-directories": [ 4 | "src" 5 | ], 6 | "elm-version": "0.19.1", 7 | "dependencies": { 8 | "direct": { 9 | "MaybeJustJames/yaml": "2.1.5", 10 | "NoRedInk/elm-simple-fuzzy": "1.0.3", 11 | "billstclair/elm-sortable-table": "1.2.1", 12 | "elm/browser": "1.0.2", 13 | "elm/core": "1.0.5", 14 | "elm/file": "1.0.5", 15 | "elm/html": "1.0.0", 16 | "elm/http": "2.0.0", 17 | "elm/svg": "1.0.1", 18 | "elm/virtual-dom": "1.0.3", 19 | "elm-community/maybe-extra": "5.3.0", 20 | "lattyware/elm-fontawesome": "6.0.0", 21 | "rundis/elm-bootstrap": "5.2.0", 22 | "sporto/elm-select": "6.0.1", 23 | "terezka/elm-charts": "4.0.0" 24 | }, 25 | "indirect": { 26 | "K-Adam/elm-dom": "1.0.0", 27 | "avh4/elm-color": "1.0.0", 28 | "danhandrea/elm-time-extra": "1.1.0", 29 | "elm/bytes": "1.0.8", 30 | "elm/json": "1.1.3", 31 | "elm/parser": "1.1.0", 32 | "elm/regex": "1.0.0", 33 | "elm/time": "1.0.0", 34 | "elm/url": "1.0.0", 35 | "justinmimbs/date": "4.0.1", 36 | "justinmimbs/time-extra": "1.1.1", 37 | "myrho/elm-round": "1.0.4", 38 | "ryan-haskell/date-format": "1.0.0", 39 | "terezka/intervals": "2.0.2" 40 | } 41 | }, 42 | "test-dependencies": { 43 | "direct": { 44 | "elm-explorations/test": "2.2.0" 45 | }, 46 | "indirect": { 47 | "debois/elm-dom": "1.3.0", 48 | "elm/random": "1.0.0" 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /multiselect.css: -------------------------------------------------------------------------------- 1 | /* https://raw.githubusercontent.com/sporto/elm-select/6.0.1/src/styles.css */ 2 | 3 | .elm-select-input-wrapper { 4 | display: flex; 5 | position: relative; 6 | overflow: hidden; 7 | background-color:white; 8 | padding: 6px 8px; 9 | } 10 | 11 | .elm-select-input { 12 | flex: 1; 13 | outline: none; 14 | border: none; 15 | } 16 | 17 | .elm-select-clear { 18 | cursor: pointer; 19 | height: 1rem; 20 | line-height: 1rem; 21 | margin-top: -0.5rem; 22 | position: absolute; 23 | right: 0.25rem; 24 | top: 50%; 25 | } 26 | 27 | .elm-select-multi-input-item-container { 28 | display: flex; 29 | flex-direction: row; 30 | align-items: center; 31 | justify-content: center; 32 | } 33 | 34 | .elm-select-multi-input-item { 35 | display: flex; 36 | border-width: 1px; 37 | background-color: #E3E5E8; 38 | border-radius: 4px; 39 | margin-right: 4px; 40 | padding: 2px 8px; 41 | } 42 | 43 | .elm-select-multi-input-item-text { 44 | text-overflow: ellipsis; 45 | } 46 | 47 | .elm-select-multi-input-item-remove { 48 | display: flex; 49 | align-items: center; 50 | justify-content: center; 51 | } 52 | 53 | .elm-select-multi-item-remove { 54 | cursor: pointer; 55 | padding-top: 1px; 56 | line-height: 0px; 57 | } 58 | 59 | /* Menu */ 60 | 61 | .elm-select-menu { 62 | position: relative; 63 | } 64 | 65 | .elm-select-menu { 66 | position: absolute; 67 | z-index: 1; 68 | background-color: white; 69 | min-width: 8rem; 70 | border: 1px solid #e9e9e9; 71 | max-height: 20rem; 72 | overflow-y: scroll; 73 | } 74 | 75 | .elm-select-menu-item { 76 | padding: 8px 4px; 77 | } 78 | 79 | .elm-select-menu-item-selectable { 80 | cursor: pointer; 81 | } 82 | 83 | .elm-select-menu-item-selectable:hover { 84 | background-color: #e9e9e9; 85 | } 86 | 87 | /* Underline */ 88 | 89 | .elm-select-input-underline-wrapper { 90 | position: relative; 91 | } 92 | 93 | .elm-select-input-underline:before, 94 | .elm-select-input-underline:after { 95 | content: ''; 96 | height: 2px; 97 | width: 0; 98 | position: absolute; 99 | background: #03a9f4; 100 | -webkit-transition: 0.2s ease all; 101 | -moz-transition: 0.2s ease all; 102 | -o-transition: 0.2s ease all; 103 | transition: 0.2s ease all; 104 | } 105 | 106 | .elm-select-input-underline:before { 107 | left: 50%; 108 | } 109 | 110 | .elm-select-input-underline:after { 111 | right: 50%; 112 | } 113 | 114 | .elm-select:focus-within .elm-select-input-underline:before, 115 | .elm-select:focus-within .elm-select-input-underline:after { 116 | width: 50%; 117 | } 118 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MapofComputationalArchaeology 2 | 3 | This repo stores code and data for a small web app to list teaching material in the field of Computational Archaeology: https://sslarch.github.io/MapofComputationalArchaeology 4 | 5 | The teaching material table is stored in `data/teachingmaterial.yml` and the web app queries it directly from the main branch on GitHub. **To add new material or modify the existing entries, just edit this file and submit a pull request with your changes.** The file will then be structurally validated by a GitHub action and can be merged if it is sound. 6 | 7 | ## Developer notes 8 | 9 | This web app was written in [Elm](https://elm-lang.org). See the `src` directory for the code and look [here](https://guide.elm-lang.org/install/elm.html) for instructions on how to run and test it locally with `elm reactor`. 10 | 11 | ### Deploying the app 12 | 13 | To prepare the app for deployment on GitHub run `script_build_elmjs.sh`, which will transpile the Elm code in `src` to a single, large `.js` file, and then reduce its size with [uglifyjs](https://github.com/mishoo/UglifyJS) to produce the minified script `elm.min.js`. This file stores the entire app. The `index.html` file finally calls this script. This is what GitHub detects and shows as the website. 14 | 15 | ### Validating `data/teachingmaterial.yml` 16 | 17 | To allow for convenient, yet safe editing of the input data in `data/teachingmaterial.yml` an automatic GitHub action workflow runs upon every push to the main branch. This workflow is specified in `.github/workflows/validateTeachingMaterialTable.yml` and involves the following main steps: 18 | 19 | 1. The Elm compiler and the testing tool elm-test-rs are installed as specified in `elm-tooling.json`. 20 | 2. The script `script_teachingmaterial_yml2elm.sh` is run to create a module `src/TeachingMaterialData.elm` with a string-representation of the table. 21 | 3. elm-test-rs triggers the pseudo-test in `tests/Tests.elm`, which runs the parsing code in `src/TeachingMaterial.elm` on the string-representation in `src/TeachingMaterialData.elm`. 22 | 23 | If the parsing fails in any way, then the GitHub action will fail, reporting the specific parsing issue. If it does not fail, then the new version of `data/teachingmaterial.yml` can be read by the app and is safe to merge. 24 | 25 | ### Changing the fantasy map 26 | 27 | The original version of the base map (`data/Archaeologia.map`) was created with this [Fantasy-Map-Generator](https://azgaar.github.io/Fantasy-Map-Generator) and can theoretically still be edited with it. The derived file `data/comparchmap.svg` replaced it, though, for all means and purposes, as several manual steps have to be performed to wrangle the output of the map generator into a .svg file usable with the elm-charts library (simplifying layers, merging objects, replacing labels). Ideally future changes should be performed on the .svg file only. Only for more complex changes (coastlines) it may be necessary to go back to the .map file. 28 | 29 | If the `data/comparchmap.svg` is changed then it has to be transformed to Elm code by running `script_map_svg2elm.sh`. Elm can not read the .svg file on the fly. Instead the drawing has to be converted to Elm code with the [svg2elm](https://github.com/pinata-llc/svg2elm) tool which directly creates a dedicated Elm module (`src/MapOfComputionalArchaeology.elm`) for it. This takes a minute, because the .svg file is fairly large. 30 | -------------------------------------------------------------------------------- /src/TeachingMaterial.elm: -------------------------------------------------------------------------------- 1 | module TeachingMaterial exposing ( 2 | TeachingResource, Difficulty (..), 3 | makeDummyResource, difficultyToString, parseTeachingResources) 4 | 5 | import Yaml.Decode as Decode exposing (Decoder) 6 | import String exposing (split, trim) 7 | 8 | type alias TeachingResource = 9 | { id : String 10 | , source : List String 11 | , x : Float 12 | , y : Float 13 | , name : String 14 | , author : List String 15 | , year : String 16 | , topic : String 17 | , language : String 18 | , programmingLanguage : List String 19 | , tools : List String 20 | , levelOfDifficulty : Difficulty 21 | , description : String 22 | , materialType : String 23 | , tags : List String 24 | , tagsOpenArchaeo : List String 25 | , link : String 26 | , citation : String 27 | } 28 | 29 | type Difficulty = 30 | Beginner 31 | | Intermediate 32 | | Advanced 33 | 34 | difficultyFromString : String -> Result String Difficulty 35 | difficultyFromString s = case s of 36 | "beginner" -> Ok Beginner 37 | "intermediate" -> Ok Intermediate 38 | "advanced" -> Ok Advanced 39 | _ -> Err "invalid difficulty string" 40 | 41 | difficultyToString : Difficulty -> String 42 | difficultyToString d = case d of 43 | Beginner -> "beginner" 44 | Intermediate -> "intermediate" 45 | Advanced -> "advanced" 46 | 47 | makeDummyResource : Float -> Float -> TeachingResource 48 | makeDummyResource x y = { 49 | id = "" 50 | , source = [] 51 | , x = x 52 | , y = y 53 | , name = "" 54 | , author = [] 55 | , year = "" 56 | , topic = "" 57 | , language = "" 58 | , programmingLanguage = [] 59 | , tools = [] 60 | , levelOfDifficulty = Beginner 61 | , description = "" 62 | , materialType = "" 63 | , tags = [] 64 | , tagsOpenArchaeo = [] 65 | , link = "" 66 | , citation = "" 67 | } 68 | 69 | decodeTeachingResource : Decoder TeachingResource 70 | decodeTeachingResource = 71 | let decodeStringList = Decode.map (List.map trim) <| Decode.map (\s -> split "," s) Decode.string 72 | decodeStringListLower = decodeStringList |> Decode.map (List.map String.toLower) 73 | decodeDifficulty = Decode.string |> 74 | Decode.andThen (\value -> Decode.fromResult (difficultyFromString value)) 75 | in Decode.succeed TeachingResource 76 | |> Decode.andMap (Decode.field "ID" Decode.string) 77 | |> Decode.andMap (Decode.field "Source" decodeStringList) 78 | |> Decode.andMap (Decode.field "X_map" Decode.float) 79 | |> Decode.andMap (Decode.field "Y_map" Decode.float) 80 | |> Decode.andMap (Decode.field "Name" Decode.string) 81 | |> Decode.andMap (Decode.field "Author" decodeStringList) 82 | |> Decode.andMap (Decode.field "Year" Decode.string) 83 | |> Decode.andMap (Decode.field "Topic" Decode.string) 84 | |> Decode.andMap (Decode.field "Language" Decode.string) 85 | |> Decode.andMap (Decode.field "Programming_language" decodeStringListLower) 86 | |> Decode.andMap (Decode.field "Tools" decodeStringList) 87 | |> Decode.andMap (Decode.field "Level_of_difficulty" decodeDifficulty) 88 | |> Decode.andMap (Decode.field "Description" Decode.string) 89 | |> Decode.andMap (Decode.field "Material_type" Decode.string) 90 | |> Decode.andMap (Decode.field "Tags" decodeStringListLower) 91 | |> Decode.andMap (Decode.field "Tags_openarchaeo" decodeStringList) 92 | |> Decode.andMap (Decode.field "Link" Decode.string) 93 | |> Decode.andMap (Decode.field "Citation" Decode.string) 94 | 95 | parseTeachingResources : String -> Result String (List TeachingResource) 96 | parseTeachingResources teachingMaterialString = 97 | case Decode.fromString (Decode.list decodeTeachingResource) teachingMaterialString of 98 | Err e -> Err (Decode.errorToString e) 99 | Ok x -> Ok x 100 | -------------------------------------------------------------------------------- /src/Main.elm: -------------------------------------------------------------------------------- 1 | module Main exposing (..) 2 | 3 | import MapOfComputionalArchaeology exposing (comparchmap) 4 | import TeachingMaterial exposing ( 5 | TeachingResource, Difficulty (..), 6 | makeDummyResource, difficultyToString, parseTeachingResources) 7 | 8 | import Bootstrap.Alert as Alert 9 | import Bootstrap.Button as Button 10 | import Bootstrap.CDN as CDN 11 | import Bootstrap.Grid as Grid 12 | import Bootstrap.Grid.Col as Col 13 | import Bootstrap.Grid.Row as Row 14 | import Bootstrap.Modal as Modal 15 | import Bootstrap.Utilities.Spacing as Spacing 16 | import Browser 17 | import Browser.Events as E 18 | import Browser.Navigation as Navigation 19 | import Chart as C 20 | import Chart.Attributes as CA 21 | import Chart.Events as CE 22 | import Chart.Item as CI 23 | import Chart.Svg as CS 24 | import FontAwesome as Icon exposing (Icon) 25 | import FontAwesome.Solid as Icon 26 | import FontAwesome.Styles as Icon 27 | import Html as H exposing (Html, a, br, button, div, h1, input, p, span, text) 28 | import Html.Attributes as HA exposing (href, placeholder, style) 29 | import Html.Events as HE exposing (onInput) 30 | import Http as Http 31 | import List exposing (map, concat, sort, any, member) 32 | import Maybe.Extra exposing (values) 33 | import Select as Select 34 | import Simple.Fuzzy as SF 35 | import Svg as S 36 | import Svg.Attributes as SA 37 | import Table exposing (defaultCustomizations) 38 | import Task 39 | import VirtualDom exposing (attribute) 40 | 41 | -- MAIN 42 | 43 | -- for the test environment with elm-reactor (open Reactor.elm!) 44 | reactor = 45 | Browser.element 46 | { init = \() -> init 500 [] 47 | , update = update 48 | , view = view True -- devel mode = True 49 | , subscriptions = subscriptions 50 | } 51 | 52 | -- for production and deployment 53 | main = 54 | Browser.element 55 | { init = \wW -> init wW [] 56 | , update = update 57 | , view = view False -- devel mode = False 58 | , subscriptions = subscriptions 59 | } 60 | 61 | -- MODEL 62 | 63 | type alias Model = { 64 | windowWidth : Int 65 | -- table and data 66 | , elements : List TeachingResource 67 | , tableState : Table.State 68 | , multiQueryContent : List String 69 | , multiQuery : QueryModel 70 | -- map 71 | , center : CS.Point 72 | , dragging : Dragging 73 | , percentage : Float 74 | , hovering : Maybe CE.Point 75 | , closestPoint : List (CI.One TeachingResource CI.Dot) 76 | -- modal 77 | , modalVisibility : Modal.Visibility 78 | , selectedElement : Maybe TeachingResource 79 | -- welcome 80 | , welcomeVisibility : Modal.Visibility 81 | -- error 82 | , errorVisibility : Modal.Visibility 83 | , errorMessage : String 84 | } 85 | 86 | type alias QueryModel = 87 | { id : String 88 | , available : List String 89 | , itemToLabel : String -> String 90 | , selected : List String 91 | , selectState : Select.State 92 | , selectConfig : Select.Config (MultiQueryMsg String) String 93 | } 94 | 95 | type MultiQueryMsg item 96 | = NoOp 97 | | OnSelect (Maybe item) 98 | | OnRemoveItem item 99 | | SelectMsg (Select.Msg item) 100 | 101 | type Dragging = 102 | CouldStillBeClick CS.Point 103 | | ForSureDragging CS.Point 104 | | None 105 | 106 | -- INIT 107 | 108 | init : Int -> List TeachingResource -> ( Model, Cmd Msg ) 109 | init wW resources = 110 | let model = { windowWidth = wW 111 | -- table and data 112 | , elements = resources 113 | , tableState = Table.sortBy "ID" True 114 | , multiQueryContent = [ ] 115 | , multiQuery = { 116 | id = "exampleMulti" 117 | , available = (map .tags resources |> concat) ++ (map .programmingLanguage resources |> concat) |> sort 118 | , itemToLabel = identity 119 | , selected = [ ] 120 | , selectState = Select.init "" 121 | , selectConfig = Select.newConfig 122 | { onSelect = OnSelect 123 | , toLabel = identity 124 | , filter = filter 0 identity 125 | , toMsg = SelectMsg 126 | } 127 | |> Select.withMultiSelection True 128 | |> Select.withCustomInput identity 129 | |> Select.withOnRemoveItem OnRemoveItem 130 | |> Select.withCutoff 12 131 | |> Select.withNotFound "No matches" 132 | |> Select.withPrompt "by title, authors, language or tags" 133 | } 134 | -- map 135 | , center = { x = 100, y = 50 } 136 | , dragging = None 137 | , percentage = 100 138 | , hovering = Nothing 139 | , closestPoint = [] 140 | -- modal 141 | , modalVisibility = Modal.hidden 142 | , selectedElement = Nothing 143 | -- welcome 144 | , welcomeVisibility = Modal.shown 145 | -- error 146 | , errorVisibility = Modal.hidden 147 | , errorMessage = "" 148 | } 149 | in ( model, Cmd.none ) 150 | 151 | filter : Int -> (a -> String) -> String -> List a -> Maybe (List a) 152 | filter minChars toLabel query items = 153 | if String.length query < minChars then 154 | Nothing 155 | else 156 | items 157 | |> SF.filter toLabel query 158 | |> Just 159 | 160 | -- UPDATE 161 | 162 | type Msg = 163 | SetWindowWidth Int 164 | -- download data 165 | | SendHttpRequest 166 | | DataReceived (Result Http.Error String) 167 | -- table and data 168 | | SetMultiQuery (MultiQueryMsg String) 169 | | ButtonAddToQuery String 170 | | SetTableState Table.State 171 | | ClearFilter 172 | -- map 173 | | OnMouseClick (List (CI.One TeachingResource CI.Dot)) 174 | | OnMouseDown CS.Point 175 | | OnMouseMove CS.Point CE.Point (List (CI.One TeachingResource CI.Dot)) 176 | | OnMouseUp CS.Point CS.Point 177 | | OnMouseLeave 178 | | OnZoomIn 179 | | OnZoomOut 180 | | OnZoomReset 181 | -- modal 182 | | CloseModal 183 | | ShowModal (Maybe TeachingResource) 184 | -- welcome 185 | | CloseWelcome 186 | -- error 187 | | CloseError 188 | | ShowError String 189 | 190 | update : Msg -> Model -> ( Model, Cmd Msg ) 191 | update msg model = 192 | case msg of 193 | SetWindowWidth w -> 194 | ({ model | windowWidth = w }, Cmd.none) 195 | -- download data 196 | SendHttpRequest -> ( model, getTeachingResources ) 197 | DataReceived res -> case res of 198 | Err e -> update (ShowError "Failed to download data from GitHub.") model 199 | Ok x -> 200 | case parseTeachingResources x of 201 | Err e -> update (ShowError ("Can't parse data. " ++ e)) model 202 | Ok y -> ({ model | elements = y }, Cmd.none) 203 | -- map 204 | OnMouseClick closestPoint -> 205 | case (List.head (filterClosestPointToRealEntries closestPoint)) of 206 | Nothing -> (model, Cmd.none) 207 | Just x -> update (ShowModal (Just <| CI.getData x)) model 208 | OnMouseDown offset -> 209 | ({ model | dragging = CouldStillBeClick offset }, Cmd.none) 210 | OnMouseMove offset hovering closestPoint -> 211 | case model.dragging of 212 | CouldStillBeClick prevOffset -> 213 | if prevOffset == offset then 214 | ({ model | closestPoint = closestPoint 215 | , hovering = Just hovering }, Cmd.none) 216 | else 217 | ({ model | center = updateCenter model.center prevOffset offset 218 | , dragging = ForSureDragging offset 219 | , closestPoint = closestPoint 220 | , hovering = Just hovering 221 | }, Cmd.none) 222 | ForSureDragging prevOffset -> 223 | ({ model | center = updateCenter model.center prevOffset offset 224 | , dragging = ForSureDragging offset 225 | , closestPoint = closestPoint 226 | , hovering = Just hovering 227 | }, Cmd.none) 228 | None -> 229 | ({ model | closestPoint = closestPoint 230 | , hovering = Just hovering }, Cmd.none) 231 | OnMouseUp offset coord -> 232 | case model.dragging of 233 | CouldStillBeClick prevOffset -> 234 | ({ model | dragging = None }, Cmd.none) 235 | ForSureDragging prevOffset -> 236 | ({ model | center = updateCenter model.center prevOffset offset 237 | , dragging = None 238 | }, Cmd.none) 239 | None -> 240 | (model, Cmd.none) 241 | OnMouseLeave -> 242 | ({ model | dragging = None, closestPoint = [], hovering = Nothing }, Cmd.none) 243 | OnZoomIn -> 244 | ({ model | percentage = model.percentage + 20 }, Cmd.none) 245 | OnZoomOut -> 246 | ({ model | percentage = max 1 (model.percentage - 20) }, Cmd.none) 247 | OnZoomReset -> 248 | ({ model | percentage = 100, center = { x = 100, y = 50 } }, Cmd.none) 249 | -- table and data 250 | SetMultiQuery sub -> 251 | let ( newMultiQuery, subCmd ) = updateMultiQuery sub model.multiQuery 252 | in ({ model | multiQueryContent = newMultiQuery.selected, multiQuery = newMultiQuery }, Cmd.map SetMultiQuery subCmd) 253 | ButtonAddToQuery s -> 254 | let oldMultiQuery = model.multiQuery 255 | newMultiQuery = { oldMultiQuery | selected = oldMultiQuery.selected ++ [s] } 256 | in ({ model | 257 | multiQueryContent = newMultiQuery.selected 258 | , multiQuery = newMultiQuery 259 | }, Cmd.none) 260 | SetTableState newState -> 261 | ({ model | tableState = newState }, Cmd.none) 262 | ClearFilter -> 263 | let oldMultiQuery = model.multiQuery 264 | newMultiQuery = { oldMultiQuery | selected = [ ] } 265 | in ({ model | 266 | multiQueryContent = [ ] 267 | , multiQuery = newMultiQuery 268 | }, Cmd.none) 269 | -- modal 270 | CloseModal -> 271 | ({ model | modalVisibility = Modal.hidden } , Cmd.none) 272 | ShowModal element -> 273 | ({ model | modalVisibility = Modal.shown, selectedElement = element } , Cmd.none) 274 | -- welcome 275 | CloseWelcome -> 276 | ({ model | welcomeVisibility = Modal.hidden }, getTeachingResources) 277 | -- error 278 | CloseError -> 279 | ({ model | errorVisibility = Modal.hidden }, Navigation.reload) 280 | ShowError e -> 281 | ({ model | errorVisibility = Modal.shown, errorMessage = e }, Cmd.none) 282 | 283 | getTeachingResources : Cmd Msg 284 | getTeachingResources = 285 | Http.get { 286 | url = "https://raw.githubusercontent.com/sslarch/MapofComputationalArchaeology/main/data/teachingmaterial.yml" 287 | , expect = Http.expectString DataReceived 288 | } 289 | 290 | updateMultiQuery : MultiQueryMsg String -> QueryModel -> ( QueryModel, Cmd (MultiQueryMsg String) ) 291 | updateMultiQuery msg model = 292 | case msg of 293 | OnSelect maybeColor -> 294 | let 295 | selected = 296 | maybeColor 297 | |> Maybe.map (List.singleton >> List.append model.selected) 298 | |> Maybe.withDefault [] 299 | in 300 | ( { model | selected = selected }, Cmd.none ) 301 | OnRemoveItem colorToRemove -> 302 | let 303 | selected = 304 | List.filter (\curColor -> curColor /= colorToRemove) 305 | model.selected 306 | in 307 | ( { model | selected = selected }, Cmd.none ) 308 | SelectMsg subMsg -> 309 | let 310 | ( updated, cmd ) = 311 | Select.update 312 | model.selectConfig 313 | subMsg 314 | model.selectState 315 | in 316 | ( { model | selectState = updated }, cmd ) 317 | NoOp -> 318 | ( model, Cmd.none ) 319 | 320 | updateCenter : CS.Point -> CS.Point -> CS.Point -> CS.Point 321 | updateCenter center prevOffset offset = { 322 | x = center.x + (prevOffset.x - offset.x) 323 | , y = center.y + (prevOffset.y - offset.y) 324 | } 325 | 326 | -- VIEW 327 | 328 | view : Bool -> Model -> Html Msg 329 | view devel 330 | { windowWidth, 331 | elements, 332 | tableState, 333 | multiQueryContent, 334 | multiQuery, 335 | center, 336 | dragging, 337 | percentage, 338 | hovering, 339 | closestPoint, 340 | modalVisibility, 341 | selectedElement, 342 | welcomeVisibility, 343 | errorVisibility, 344 | errorMessage 345 | } = 346 | let 347 | -- general helper functions and settings 348 | breakWindowWidth : Int 349 | breakWindowWidth = 500 --px 350 | findElementByCoordinates x y = 351 | List.head <| List.filter (\e -> e.x == x && e.y == y) elements 352 | findElementByID i = 353 | List.head <| List.filter (\e -> e.id == i) acceptableResources 354 | 355 | -- search/filter logic 356 | acceptableResources = case multiQueryContent of 357 | [ ] -> elements 358 | _ -> List.filter resourceFilter elements 359 | 360 | resourceFilter : TeachingResource -> Bool 361 | resourceFilter x = 362 | let toLow = String.toLower 363 | matchName = any (\v -> String.contains (toLow v) (toLow x.name)) multiQueryContent 364 | matchAuthor = any (\v -> String.contains (toLow v) (toLow <| String.join "" x.author)) multiQueryContent 365 | matchProg = any (\v -> member v multiQueryContent) x.programmingLanguage 366 | matchTag = any (\v -> member v multiQueryContent) x.tags 367 | in matchName || matchAuthor || matchProg || matchTag 368 | 369 | -- map 370 | mapPlot = 371 | C.chart 372 | -- general settings 373 | [ CA.height 300 374 | , CA.width 600 375 | , CA.range [ CA.zoom percentage, CA.centerAt center.x ] 376 | , CA.domain [ CA.zoom percentage, CA.centerAt center.y ] 377 | , CE.onClick OnMouseClick (CE.getWithin 20 CI.dots) 378 | , CE.onMouseDown OnMouseDown CE.getOffset 379 | , CE.on "mousemove" (CE.map3 OnMouseMove CE.getOffset CE.getCoords (CE.getWithin 20 CI.dots)) 380 | , CE.on "mouseup" (CE.map2 OnMouseUp CE.getOffset CE.getCoords) 381 | , CE.onMouseLeave OnMouseLeave 382 | , CA.htmlAttrs 383 | [ HA.style "user-select" "none" 384 | , HA.style "cursor" <| 385 | case (filterClosestPointToRealEntries closestPoint) of 386 | [] -> case dragging of 387 | CouldStillBeClick _ -> "grabbing" 388 | ForSureDragging _ -> "grabbing" 389 | None -> "grab" 390 | _ -> "pointer" 391 | ] 392 | ] 393 | [ 394 | -- comment to hide coordinate grid 395 | C.xLabels [ CA.withGrid, CA.amount 10, CA.ints, CA.fontSize 9 ] 396 | , C.yLabels [ CA.withGrid, CA.amount 10, CA.ints, CA.fontSize 9 ] 397 | , C.xTicks [ CA.withGrid, CA.amount 10, CA.ints ] 398 | , C.yTicks [ CA.withGrid, CA.amount 10, CA.ints ] 399 | -- zoom buttons in top right corner 400 | , C.htmlAt .max .max -5 -5 401 | [ HA.style "transform" "translateX(-100%)" ] 402 | [ span 403 | [ HA.style "margin-right" "5px" ] 404 | [ text (String.fromFloat percentage ++ "%") ] 405 | , Button.button 406 | [ Button.attrs [ HE.onClick OnZoomIn, Spacing.ml1 ] 407 | , Button.outlineSecondary 408 | , Button.small 409 | ] 410 | [ text "+" ] 411 | , Button.button 412 | [ Button.attrs [ HE.onClick OnZoomOut, Spacing.ml1 ] 413 | , Button.outlineSecondary 414 | , Button.small 415 | ] 416 | [ text "-" ] 417 | , Button.button 418 | [ Button.attrs [ HE.onClick OnZoomReset, Spacing.ml1 ] 419 | , Button.outlineSecondary 420 | , Button.small 421 | ] 422 | [ text "⨯" ] 423 | ] 424 | -- background map 425 | , C.svgAt (\_ -> 0) (\_ -> 100) 0 0 [ comparchmap [ 426 | attribute "width" (String.fromFloat (600 * (percentage / 100))) 427 | , attribute "height" (String.fromFloat (300 * (percentage / 100))) 428 | , attribute "viewBox" ("0 0 2000 1000") 429 | --, attribute "opacity" "0.3" -- make transparent to set coordinates more easily 430 | ] ] 431 | -- invisible dummy data points at the four corners to make the plot scale correctly 432 | , C.series .x [ 433 | C.scatter .y 434 | [ CA.opacity 0] ] 435 | (List.map2 makeDummyResource [0, 0, 200, 200] [0, 100, 100, 0]) 436 | -- additional elements for each point 437 | , C.each (filterClosestPointToRealEntries closestPoint) <| \p item -> 438 | let curX = CI.getX item 439 | curY = CI.getY item 440 | curElem = findElementByCoordinates curX curY 441 | in [ 442 | -- tooltip 443 | C.tooltip item [ 444 | CA.offset 0 445 | , CA.background "#fcf9e9" 446 | ] [ 447 | HA.style "opacity" "0.8" 448 | ] [ 449 | case curElem of 450 | Nothing -> text "" 451 | Just x -> text (x.id ++ ": " ++ x.name) 452 | ] 453 | -- lines to source nodes 454 | , C.withPlane <| \_ -> 455 | case curElem of 456 | Nothing -> [] 457 | Just x -> addLinesCurElement x 458 | ] 459 | -- actual data points 460 | , C.series .x [ 461 | C.scatter .y 462 | [ CA.size 2 463 | , CA.diamond 464 | , CA.highlight 0.6 465 | , CA.highlightWidth 2 466 | , CA.highlightColor "#292929" 467 | ] |> 468 | C.named "Teaching resource" |> 469 | C.amongst closestPoint (\_ -> [ CA.size 12 ]) |> 470 | -- color by difficulty level 471 | C.variation (\i d -> [ 472 | CA.color (case d.levelOfDifficulty of 473 | Beginner -> CA.green 474 | Intermediate -> CA.yellow 475 | Advanced -> CA.red) 476 | ]) 477 | ] acceptableResources -- actual input data 478 | -- coord display below plot 479 | , case hovering of 480 | Just coords -> 481 | C.labelAt (CA.percent 96) (CA.percent 2) [CA.fontSize 7] 482 | [ S.text ("x: " ++ String.fromInt (round coords.x)) 483 | , S.text (" y: " ++ String.fromInt (round coords.y)) 484 | ] 485 | Nothing -> 486 | C.none 487 | ] 488 | 489 | -- plot helper functions 490 | addLinesCurElement : TeachingResource -> List (C.Element data msg) 491 | addLinesCurElement elem = 492 | let curSources = values <| map findElementByID elem.source 493 | in case curSources of 494 | [] -> [] 495 | xs -> (map (makeOneLine elem) xs) ++ List.concatMap addLinesCurElement xs 496 | 497 | makeOneLine : TeachingResource -> TeachingResource -> C.Element data msg 498 | makeOneLine elem source = 499 | C.line [ CA.x1 elem.x 500 | , CA.x2 source.x 501 | , CA.y1 elem.y 502 | , CA.y2 source.y 503 | , CA.dashed [ 10, 5 ] 504 | , CA.width 2 505 | , CA.color "white" 506 | ] 507 | 508 | -- table 509 | idColumn : String -> (data -> String) -> Table.Column data Msg 510 | idColumn colName toString = 511 | Table.veryCustomColumn 512 | { name = colName 513 | , viewData = \data -> (\s -> Table.HtmlDetails [] [ span [ 514 | style "display" "inline-block" 515 | , style "padding-right" "5px" 516 | , style "font-size" "12px" 517 | , style "font-style" "italic" 518 | , style "transform" "rotate(45deg)" 519 | ] [text s] ]) (toString data) 520 | , sorter = Table.increasingOrDecreasingBy toString 521 | } 522 | 523 | resourceColumn : String -> (data -> String) -> (data -> String) -> (data -> List String) -> Table.Column data Msg 524 | resourceColumn colName getYear getName getAuthors = 525 | Table.veryCustomColumn 526 | { name = colName 527 | , viewData = \data -> (\y n a -> Table.HtmlDetails [] [ 528 | div [ style "display" "inline-block", style "padding-right" "5px", style "font-size" "16px" ] [ 529 | span [ 530 | style "font-weight" "bold" 531 | ] [ text n ], 532 | br [] [] , 533 | text "by ", 534 | span [ 535 | style "font-style" "italic" 536 | ] [ text a ], 537 | text ", ", 538 | span [ 539 | style "font-style" "italic" 540 | , style "text-decoration" "underline" 541 | ] [ text y ] 542 | ] 543 | ]) (getYear data) (getName data) (renderAuthors <| getAuthors data) 544 | , sorter = Table.increasingOrDecreasingBy getYear 545 | } 546 | 547 | renderAuthors : List String -> String 548 | renderAuthors ss = 549 | let 550 | firstAuthor = List.head ss 551 | moreThanOneAuthor = List.length ss > 1 552 | in 553 | case firstAuthor of 554 | Nothing -> "" 555 | Just a -> if moreThanOneAuthor then (a ++ " et al.") else a 556 | 557 | viewProgrammingLanguage : List String -> Table.HtmlDetails Msg 558 | viewProgrammingLanguage ss = Table.HtmlDetails [] (map (makeButton "#80b3ffff") ss) 559 | 560 | viewTags : List String -> Table.HtmlDetails Msg 561 | viewTags ss = Table.HtmlDetails [] (map (makeButton "#bfb891ff") ss) 562 | 563 | makeButton : String -> String -> H.Html Msg 564 | makeButton color s = case s of 565 | "" -> H.div [] [] 566 | _ -> Button.button 567 | [ Button.attrs [ 568 | HE.onClick (ButtonAddToQuery s) 569 | , Spacing.ml1 570 | , style "background-color" color 571 | , style "color" "white" 572 | , style "display" "inline-block" 573 | , style "padding" "1px 4px" 574 | , style "text-align" "center" 575 | , style "border-radius" "5px" 576 | , style "margin" "2px" 577 | , style "font-size" "15px" 578 | ] 579 | , Button.outlineDark 580 | , Button.small 581 | ] 582 | [ text s ] 583 | 584 | stringListColumn : String -> (data -> List String) -> (List String -> Table.HtmlDetails Msg) -> Table.Column data Msg 585 | stringListColumn colName toStringList viewFunction = 586 | Table.veryCustomColumn 587 | { name = colName 588 | , viewData = \data -> viewFunction (toStringList data) 589 | , sorter = Table.unsortable 590 | } 591 | 592 | linkAndModalColumn : String -> (data -> String) -> (data -> String) -> Table.Column data Msg 593 | linkAndModalColumn colName getLink getID = 594 | Table.veryCustomColumn 595 | { name = colName 596 | , viewData = \data -> (\s -> Table.HtmlDetails [] [ 597 | div [] [ 598 | Button.linkButton [ 599 | Button.small, Button.block, Button.outlineSecondary 600 | , Button.attrs [ href s, style "margin-bottom" "-5px", style "width" "40px" ] 601 | ] [ Icon.view Icon.link ] 602 | , Button.button [ 603 | Button.small, Button.block, Button.outlineSecondary 604 | , Button.attrs [ HE.onClick <| ShowModal (findElementByID (getID data)), style "margin-bottom" "10px", style "width" "40px" ] 605 | ] [ Icon.view Icon.infoCircle ] 606 | ] 607 | ]) (getLink data) 608 | , sorter = Table.unsortable 609 | } 610 | 611 | tableConfig : Table.Config TeachingResource Msg 612 | tableConfig = 613 | Table.customConfig { 614 | toId = .id 615 | , toMsg = SetTableState 616 | , columns = 617 | if windowWidth < breakWindowWidth then [ 618 | idColumn "ID" .id 619 | , resourceColumn "Material" .year .name .author 620 | , linkAndModalColumn "" .link .id 621 | ] else [ 622 | idColumn "ID" .id 623 | , resourceColumn "Material" .year .name .author 624 | , stringListColumn "Language" .programmingLanguage viewProgrammingLanguage 625 | , stringListColumn "Tags" .tags viewTags 626 | , linkAndModalColumn "" .link .id 627 | ] 628 | , customizations = { defaultCustomizations | tableAttrs = [ style "width" "100%" ] } 629 | } 630 | 631 | -- modal 632 | oneRow name value = 633 | Grid.row [ ] [ 634 | Grid.col [ Col.sm3 ] 635 | [ span [ style "font-weight" "bold" ] [ text name ] ] 636 | , Grid.col [ Col.sm9 ] [ text value ] 637 | ] 638 | 639 | detailsModal = 640 | case selectedElement of 641 | Nothing -> 642 | Modal.config CloseModal 643 | |> Modal.small 644 | |> Modal.hideOnBackdropClick True 645 | |> Modal.h3 [] [ text "Error - this should never happen" ] 646 | |> Modal.view modalVisibility 647 | Just x -> 648 | Modal.config CloseModal 649 | |> Modal.large 650 | |> Modal.hideOnBackdropClick True 651 | |> Modal.scrollableBody True 652 | |> Modal.h3 [] [ text x.id ] 653 | |> Modal.body [] [ 654 | Grid.containerFluid [ ] [ 655 | oneRow "Name: " x.name 656 | , oneRow "Author: " <| String.join ", " x.author 657 | , oneRow "Year: " x.year 658 | , oneRow "Topic: " x.topic 659 | , oneRow "Description: " x.description 660 | , oneRow "Language: " x.language 661 | , oneRow "Prog. language: " <| String.join ", " x.programmingLanguage 662 | , oneRow "Tools: " <| String.join ", " x.tools 663 | , oneRow "Level: " <| difficultyToString x.levelOfDifficulty 664 | , oneRow "Material type: " x.materialType 665 | , oneRow "Tags: " <| String.join ", " x.tags 666 | , oneRow "Tags OpenArchaeo: " <| String.join ", " x.tagsOpenArchaeo 667 | , oneRow "Link: " x.link 668 | , oneRow "Citation: " x.citation 669 | ] 670 | ] 671 | |> Modal.footer [] 672 | [ Button.button 673 | [ Button.outlineSecondary 674 | , Button.attrs [ HE.onClick CloseModal ] 675 | ] 676 | [ text "Close" ] 677 | ] 678 | |> Modal.view modalVisibility 679 | 680 | -- welcome 681 | detailsWelcome = 682 | Modal.config CloseWelcome 683 | |> Modal.large 684 | |> Modal.hideOnBackdropClick True 685 | |> Modal.h4 [] [ text "The didactic map of computational archaeology" ] 686 | |> Modal.body [] [ 687 | p [] [ text <| "Computational Archaeology is a wondrous field. " 688 | ++ "To make it a bit easier to explore and navigate, this webapp " 689 | ++ "presents an imaginary map with a collection of teaching material " 690 | ++ "introducing the different domains of computer applications in archaeology." 691 | ], 692 | p [] [ text <| "The interactive map on the top shows the various " 693 | ++ "subfields as landmasses of an imaginary world. " 694 | ++ "Each dot represents a teaching resource (e.g. a blogpost, " 695 | ++ "a video-tutorial or a textbook). The dot color indicates, " 696 | ++ "how advanced and challenging a given unit is:" 697 | ], 698 | p [] [ span [ style "color" "#71C614" ] [ text "Suitable for beginners" ], 699 | text " -> ", 700 | span [ style "color" "#FFCA00" ] [ text "Intermediate" ], 701 | text " -> ", 702 | span [ style "color" "#EF3159" ] [ text "Advanced" ] 703 | ], 704 | p [] [ text <| "You can hover or click on the dots to get more information. " 705 | ++ "Click ", 706 | span [ style "color" "#EF3159" ] [ text "Clear filters" ], 707 | text <| " to reset the list." 708 | ] 709 | ] 710 | |> Modal.footer [] [ span [ style "font-style" "italic" ] [ 711 | text "Made by the " 712 | , a [ href "https://sslarch.github.io" ] [ text "SIG for Scripting languages in Archaeology" ] 713 | , text " - see the code on " 714 | , a [ href "https://github.com/sslarch/MapofComputationalArchaeology" ] [ text "GitHub" ] 715 | ] ] 716 | |> Modal.view welcomeVisibility 717 | 718 | -- error 719 | detailsError = 720 | Modal.config CloseError 721 | |> Modal.large 722 | |> Modal.hideOnBackdropClick False 723 | |> Modal.scrollableBody True 724 | |> Modal.h3 [] [ text "Error" ] 725 | |> Modal.body [] [ 726 | p [] [ H.pre [] [text errorMessage] ], 727 | p [] [ 728 | text "Please report this error on " 729 | , a [ href "https://github.com/sslarch/MapofComputationalArchaeology" ] [ text "GitHub" ] 730 | , text "." 731 | ] 732 | ] 733 | |> Modal.view errorVisibility 734 | 735 | in 736 | -- main layout 737 | div [] [ 738 | Grid.container [] 739 | ((if devel then [CDN.stylesheet] else []) ++ [ -- stylesheet for production is loaded in index.html 740 | Icon.css -- fontawesome 741 | , Grid.row [] [ 742 | Grid.col [ ] [ 743 | div [ 744 | style "overflow" "hidden" 745 | , style "margin" "auto" 746 | , style "height" "100%" 747 | , style "width" "100%" 748 | ] [ mapPlot ] 749 | ] 750 | ] 751 | , Grid.row [] [ 752 | Grid.col [ ] [ 753 | br [] [] 754 | , div [] [ 755 | span [ style "font-size" "30px" ] [ text "The didactic map of computational archaeology" ] 756 | , span [ style "display" "inline-block", style "width" "20px" ] [] 757 | , text " a project by the " 758 | , a [ href "https://sslarch.github.io" ] [ text "SIG SSLA" ] 759 | ] 760 | , Alert.simpleDark [] [ 761 | Grid.container [] [ 762 | Grid.row [ Row.centerMd ] ( 763 | [ 764 | Grid.col [] [ 765 | div [ style "display" "inline-block", style "width" "100%" ] [ 766 | Icon.view Icon.filter 767 | , text <| " Filter the list (" ++ 768 | (String.fromInt <| List.length acceptableResources) ++ 769 | "/" ++ 770 | (String.fromInt <| List.length elements) ++ 771 | ") " 772 | , Button.button [ 773 | Button.attrs [ style "float" "right" ] 774 | , Button.small, Button.outlineDanger 775 | , Button.attrs [ HE.onClick ClearFilter ] 776 | ] [ Icon.view Icon.filterCircleXmark, text " Clear filters" ] 777 | ] 778 | ] 779 | , Grid.colBreak [] 780 | , Grid.col [] 781 | [ H.map SetMultiQuery ( 782 | div [] [ 783 | Select.view multiQuery.selectConfig 784 | multiQuery.selectState 785 | multiQuery.available 786 | multiQuery.selected 787 | ]) 788 | 789 | ] 790 | ] 791 | ) 792 | ] 793 | ] 794 | , Table.view tableConfig tableState acceptableResources 795 | ] 796 | ] 797 | ]) 798 | , detailsModal, detailsWelcome, detailsError 799 | ] 800 | 801 | filterClosestPointToRealEntries : List (CI.One TeachingResource CI.Dot) -> List (CI.One TeachingResource CI.Dot) 802 | filterClosestPointToRealEntries x = (List.filter (\y -> (CI.getData y).id /= "") x) 803 | 804 | -- SUBSCRIPTIONS 805 | 806 | subscriptions : model -> Sub Msg 807 | subscriptions _ = 808 | E.onResize (\w h -> SetWindowWidth w) 809 | -------------------------------------------------------------------------------- /data/teachingmaterial.yml: -------------------------------------------------------------------------------- 1 | - ID: SIG-T0001 2 | Source: "" 3 | X_map: 81 4 | Y_map: 50 5 | Name: 'Tidyverse for archaeologists' 6 | Author: 'Ben Marwick' 7 | Year: '2020' 8 | Topic: 'introduction to the tidyverse of R' 9 | Language: en 10 | Programming_language: Rstats 11 | Tools: RStudio 12 | Level_of_difficulty: beginner 13 | Description: 'Slide deck with an introduction to the tidyverse, example code and tasks.' 14 | Material_type: slides 15 | Tags: 'tidyverse, data import, data wrangling, visualisation, programming' 16 | Tags_openarchaeo: 'Educational resources and practical guides' 17 | Link: 'https://benmarwick.github.io/tidyverse-for-archaeology/tidyverse-for-archaeology.html#1' 18 | Citation: "" 19 | - ID: SIG-T0002 20 | Source: "" 21 | X_map: 79 22 | Y_map: 40 23 | Name: 'Skriptsammlung Statistik für die Archäologie' 24 | Author: 'Sophie Schmidt' 25 | Year: '2020' 26 | Topic: 'basic R introduction, plotting, statistical tests' 27 | Language: de 28 | Programming_language: RStats 29 | Tools: RStudio 30 | Level_of_difficulty: beginner 31 | Description: 'Scripts in md format including code and example tasks.' 32 | Material_type: tutorial 33 | Tags: 'data import, data wrangling, statistical tests, visualisation' 34 | Tags_openarchaeo: 'Educational resources and practical guides, Data management' 35 | Link: 'https://scschmidt.github.io/lehre/' 36 | Citation: "" 37 | - ID: SIG-T0003 38 | Source: "" 39 | X_map: 93 40 | Y_map: 70 41 | Name: 'The Open Digital Archaeology Textbook' 42 | Author: 'Shawn Graham, Neha Gupta, Jolene Smith, Andreas Angourakis, Andrew Reinhard, Kate Ellenberger, Zack Batist, Joel Rivard, Ben Marwick, Michael Carter, Beth Compton, Rob Blades, Cristina Wood, Gary Nobles' 43 | Year: '2018' 44 | Topic: 'introduction to various digital archaeology practices, including project management, database management, data cleaning, visualization, photogrammetry, 3D printing, NLP, among other things' 45 | Language: en 46 | Programming_language: RStats 47 | Tools: 'Open Refine, GitHub, Meshlab, Excel, Jupyter' 48 | Level_of_difficulty: beginner 49 | Description: 'An overview of various tools, methods and workflows commonly applied in digital archaeology, including practical examples demonstrated through well-documented jupyter notebooks.' 50 | Material_type: textbook 51 | Tags: 'data management, 3D methods, visualisation, spatial statistics, data wrangling, LOD' 52 | Tags_openarchaeo: "" 53 | Link: 'https://o-date.github.io/draft/book/' 54 | Citation: "" 55 | - ID: SIG-T0004 56 | Source: "" 57 | X_map: 171 58 | Y_map: 35 59 | Name: '3DHOP integration' 60 | Author: 'Thomas Huet' 61 | Year: '2021' 62 | Topic: Web3d 63 | Language: fr 64 | Programming_language: 'RStats, JavaScript, HTML5' 65 | Tools: 'RStudio, GitHub, 3DHOP, Blender, Meshlab, Meshroom' 66 | Level_of_difficulty: intermediate 67 | Description: 'A multi-paradigm approach (cartography, web3D, etc.) and multi-scalar presentation (macro, meso, micro) of portable tools and ancient iconography with open-source softwares (GitHub, 3DHOP, Blender, R, JavaScript, etc.) for data management within the frame of Linked-Open data (LOD).' 68 | Material_type: tutorial 69 | Tags: '3D methods, data management, archiving, LOD' 70 | Tags_openarchaeo: 'Educational resources and practical guides, 3D modelling, ' 71 | Link: 'https://zoometh.github.io/reveal.js/#/5' 72 | Citation: "" 73 | - ID: SIG-T0005 74 | Source: "" 75 | X_map: 45 76 | Y_map: 75 77 | Name: 'Developing R Packages' 78 | Author: 'Sophie Schmidt, Petr Pajdla, Clemens Schmid' 79 | Year: '2021' 80 | Topic: 'R package development' 81 | Language: en 82 | Programming_language: RStats 83 | Tools: RStudio 84 | Level_of_difficulty: advanced 85 | Description: 'Slides and exercises introducing R package development for participants with some scripting experience.' 86 | Material_type: 'slides, exercises' 87 | Tags: 'programming, reproducibility' 88 | Tags_openarchaeo: "" 89 | Link: 'https://github.com/sslarch/caa2021_Rpackage_workshop/' 90 | Citation: "" 91 | - ID: SIG-T0006 92 | Source: "" 93 | X_map: 61 94 | Y_map: 51 95 | Name: Rchaeology.eu 96 | Author: 'Georg Roth' 97 | Year: 'until 2012' 98 | Topic: 'statistical analysis' 99 | Language: de 100 | Programming_language: RStats 101 | Tools: RStudio 102 | Level_of_difficulty: intermediate 103 | Description: 'A collection of blog posts about various quantitative data analysis applications relevant for archaeology.' 104 | Material_type: blog 105 | Tags: 'data analysis, clustering, visualisation' 106 | Tags_openarchaeo: "" 107 | Link: 'http://www.rchaeology.eu/' 108 | Citation: "" 109 | - ID: SIG-T0007 110 | Source: "" 111 | X_map: 46 112 | Y_map: 7 113 | Name: 'LaTeX for thesis writing' 114 | Author: 'Sarah Lang' 115 | Year: '2021' 116 | Topic: 'latex, writing' 117 | Language: en 118 | Programming_language: latex 119 | Tools: 'text editors, Zotero' 120 | Level_of_difficulty: intermediate 121 | Description: "Overview of Latex's capabilities that support thesis writing." 122 | Material_type: blog 123 | Tags: 'markup languages, writing' 124 | Tags_openarchaeo: "" 125 | Link: 'https://latex-ninja.com/2021/06/13/latex-for-thesis-writing/' 126 | Citation: "" 127 | - ID: SIG-T0008 128 | Source: "" 129 | X_map: 16 130 | Y_map: 13 131 | Name: 'LaTeX for Archaeologists: An archaeological catalogue using LaTeX' 132 | Author: 'Sarah Lang' 133 | Year: '2021' 134 | Topic: 'latex, layout, writing' 135 | Language: en 136 | Programming_language: latex 137 | Tools: 'text editors' 138 | Level_of_difficulty: intermediate 139 | Description: 'Guide to using latex to create efficient and good-looking archaeological catalogues.' 140 | Material_type: blog 141 | Tags: 'markup languages, writing' 142 | Tags_openarchaeo: "" 143 | Link: 'https://latex-ninja.com/2020/05/04/latex-for-archaeologists-an-archaeological-catalogue-using-latex/' 144 | Citation: "" 145 | - ID: SIG-T0009 146 | Source: "" 147 | X_map: 33 148 | Y_map: 15 149 | Name: 'Quick guide to scholarly writing in Markdown with Atom' 150 | Author: 'Ben Marwick' 151 | Year: '2019' 152 | Topic: 'writing, digital workflows' 153 | Language: en 154 | Programming_language: 'RStats, Markdown' 155 | Tools: 'RStudio, Atom, pandoc, Zotero, git' 156 | Level_of_difficulty: beginner 157 | Description: 'Guide to scholarly writing using plaintext.' 158 | Material_type: tutorial 159 | Tags: 'markup languages, writing' 160 | Tags_openarchaeo: "" 161 | Link: 'https://github.com/benmarwick/atom-for-scholarly-writing-with-markdown' 162 | Citation: "" 163 | - ID: SIG-T0010 164 | Source: "" 165 | X_map: 74 166 | Y_map: 70 167 | Name: 'Learning to program: Debugging – Where to start?' 168 | Author: 'Sarah Lang' 169 | Year: '2021' 170 | Topic: 'debugging software' 171 | Language: en 172 | Programming_language: 'LaTeX, RStats, Python' 173 | Tools: 'text editors' 174 | Level_of_difficulty: beginner 175 | Description: 'Guide to finding and solving errors in the code.' 176 | Material_type: blog 177 | Tags: 'programming, writing' 178 | Tags_openarchaeo: "" 179 | Link: 'https://latex-ninja.com/2021/05/30/learning-to-program-debugging-where-to-start/' 180 | Citation: "" 181 | - ID: SIG-T0011 182 | Source: "" 183 | X_map: 100 184 | Y_map: 37 185 | Name: 'How to maintain Twitter with little effort as an academic' 186 | Author: 'Sarah Lang' 187 | Year: '2021' 188 | Topic: 'twitter, academic communications' 189 | Language: en 190 | Programming_language: "" 191 | Tools: twitter 192 | Level_of_difficulty: beginner 193 | Description: 'Guide for effective professional and institutional use of twitter' 194 | Material_type: blog 195 | Tags: 'social media, engagement' 196 | Tags_openarchaeo: "" 197 | Link: 'https://latex-ninja.com/2021/11/16/how-to-maintain-twitter-with-little-effort-as-an-academic-the-ninjas-how-to-better-promote-your-content-on-twitter-guide-part-5/' 198 | Citation: "" 199 | - ID: SIG-T0012 200 | Source: "" 201 | X_map: 45 202 | Y_map: 24 203 | Name: 'Digitizing journal articles and grey literature reports' 204 | Author: ADS 205 | Year: ongoing 206 | Topic: 'digital curation, archiving and preservation' 207 | Language: en 208 | Programming_language: "" 209 | Tools: "" 210 | Level_of_difficulty: beginner 211 | Description: 'Explains how to digitise journal articles or grey literature reports with a view to their long term sustainability' 212 | Material_type: tutorial 213 | Tags: 'digitalization, archiving, writing' 214 | Tags_openarchaeo: "" 215 | Link: 'https://archaeologydataservice.ac.uk/advice/scanningGuide.xhtml' 216 | Citation: "" 217 | - ID: SIG-T0013 218 | Source: "" 219 | X_map: 24 220 | Y_map: 25 221 | Name: 'Guides to Good Practice' 222 | Author: ADS 223 | Year: ongoing 224 | Topic: 'digital curation, archiving and preservation' 225 | Language: en 226 | Programming_language: "" 227 | Tools: "" 228 | Level_of_difficulty: beginner 229 | Description: 'Series of guides to various digital curation and preservation practices' 230 | Material_type: tutorial 231 | Tags: 'writing, archiving, project management, data management, archiving' 232 | Tags_openarchaeo: "" 233 | Link: 'https://guides.archaeologydataservice.ac.uk/g2gpwiki/' 234 | Citation: "" 235 | - ID: SIG-T0014 236 | Source: "" 237 | X_map: 67 238 | Y_map: 14 239 | Name: 'OntoMatchGame (formerly CIDOC-CRM Game)' 240 | Author: 'Guillem Anais' 241 | Year: '2024' 242 | Topic: 'ontology learning game' 243 | Language: en 244 | Programming_language: "" 245 | Tools: "" 246 | Level_of_difficulty: beginner 247 | Description: 'A fun way to visualize and play with ontology in relation to real world documentation scenarios. Available as both a physical tabletop card game, and in a rich virtual format too.' 248 | Material_type: game 249 | Tags: 'CIDOC CRM, ontology, archiving' 250 | Tags_openarchaeo: "" 251 | Link: 'https://ontomatchgame.huma-num.fr/' 252 | Citation: 'https://cidoc-crm.org/Resources/onto-match-game' 253 | - ID: SIG-T0015 254 | Source: "" 255 | X_map: 40 256 | Y_map: 43 257 | Name: 'Processing Radiocarbon Data with R' 258 | Author: 'Clemens Schmid, Martin Hinz' 259 | Year: '2018' 260 | Topic: 'radiocarbon data' 261 | Language: en 262 | Programming_language: RStats 263 | Tools: RStudio 264 | Level_of_difficulty: intermediate 265 | Description: 'Instructional resources for processing radiocarbon data' 266 | Material_type: tutorial 267 | Tags: 'C14, bayes, calibration, dating' 268 | Tags_openarchaeo: "" 269 | Link: 'https://github.com/ISAAKiel/r_tutorial_caa_2018' 270 | Citation: "" 271 | - ID: SIG-T0016 272 | Source: "" 273 | X_map: 73 274 | Y_map: 34 275 | Name: 'Analyse und Visualisierung archäologischer Daten mit R' 276 | Author: 'Dirk Seidensticker, Clemens Schmid' 277 | Year: '2016' 278 | Topic: visualisation 279 | Language: de 280 | Programming_language: RStats 281 | Tools: RStudio 282 | Level_of_difficulty: beginner 283 | Description: 'Instructional resources for data visualization' 284 | Material_type: tutorial 285 | Tags: 'data wrangling, visualisation' 286 | Tags_openarchaeo: "" 287 | Link: 'https://github.com/ISAAKiel/R-Tutorial_CAA2016' 288 | Citation: "" 289 | - ID: SIG-T0017 290 | Source: "" 291 | X_map: 85 292 | Y_map: 82 293 | Name: 'Mosaic Summer School 2016' 294 | Author: 'Franziska Faupel, Daniel Knitter' 295 | Year: '2016' 296 | Topic: 'spatial statistics' 297 | Language: en 298 | Programming_language: RStats 299 | Tools: RStudio 300 | Level_of_difficulty: intermediate 301 | Description: 'Reconstructing and modeling spheres of interaction.' 302 | Material_type: workshop 303 | Tags: 'data wrangling, spatial statistics, network analysis, point pattern analysis, R as GIS' 304 | Tags_openarchaeo: "" 305 | Link: 'https://github.com/ISAAKiel/Mosaic' 306 | Citation: "" 307 | - ID: SIG-T0018 308 | Source: "" 309 | X_map: 72 310 | Y_map: 45 311 | Name: 'Statistical Methods for Archaeological Data Analysis (Hinz)' 312 | Author: 'Martin Hinz' 313 | Year: '2021' 314 | Topic: 'basic statistics' 315 | Language: en 316 | Programming_language: RStats 317 | Tools: RStudio 318 | Level_of_difficulty: beginner 319 | Description: 'Course, intro into R, Descriptive stats, NHST, Explorative statistics.' 320 | Material_type: textbook 321 | Tags: 'basic statistics, data import, data wrangling, NHST, visualisation' 322 | Tags_openarchaeo: "" 323 | Link: 'https://martinhinz.github.io/smada2021' 324 | Citation: "" 325 | - ID: SIG-T0019 326 | Source: "" 327 | X_map: 80 328 | Y_map: 90 329 | Name: 'Predictive Mapping in R' 330 | Author: 'Martin Hinz' 331 | Year: '2019' 332 | Topic: 'predictive mapping' 333 | Language: en 334 | Programming_language: RStats 335 | Tools: RStudio 336 | Level_of_difficulty: intermediate 337 | Description: 'Tutorial Workshop given at the International Colloquium on Digital Archaeology in Bern.' 338 | Material_type: 'slides, workshop' 339 | Tags: 'spatial statistics, R as GIS' 340 | Tags_openarchaeo: "" 341 | Link: 'https://martinhinz.github.io/pred_map_tut' 342 | Citation: "" 343 | - ID: SIG-T0020 344 | Source: "" 345 | X_map: 57 346 | Y_map: 33 347 | Name: 'Video tutorials about R for archaeologists' 348 | Author: 'Martin Hinz' 349 | Year: '2012-2019' 350 | Topic: 'basic statistics' 351 | Language: 'en, de' 352 | Programming_language: RStats 353 | Tools: RStudio 354 | Level_of_difficulty: beginner 355 | Description: 'Collected works from different courses.' 356 | Material_type: 'videos, workshop' 357 | Tags: 'basic statistics, data import, data wrangling, visualisation' 358 | Tags_openarchaeo: "" 359 | Link: 'http://vitutr.archaeological.science/' 360 | Citation: "" 361 | - ID: SIG-T0021 362 | Source: "" 363 | X_map: 64 364 | Y_map: 54 365 | Name: 'How To Do Archaeological Science Using R' 366 | Author: 'Ben Marwick' 367 | Year: '2017' 368 | Topic: 'statistical analysis, agent-based modelling, radiocarbon analysis, geospatial analysis' 369 | Language: en 370 | Programming_language: RStats 371 | Tools: RStudio 372 | Level_of_difficulty: intermediate 373 | Description: 'This website is a early draft of an edited volume of contributions to the ‘How To Do Archaeological Science Using R’ forum.' 374 | Material_type: textbook 375 | Tags: 'spatial statistics, ABM, C14, Bayes, R as GIS, predictive modelling' 376 | Tags_openarchaeo: "" 377 | Link: 'https://benmarwick.github.io/How-To-Do-Archaeological-Science-Using-R/' 378 | Citation: "" 379 | - ID: SIG-T0022 380 | Source: "" 381 | X_map: 60 382 | Y_map: 85 383 | Name: 'Tutorial on Classification in Archaeology: Distance Matrices, Clustering Methods and Validation' 384 | Author: 'Sophie Schmidt, Sarah Martini, Robert Staniuk, Carole Quatrelive, Martin Hinz, Oliver Nakoinz, Michael Bilger, Romy Plath, Georg Roth, Julian Laabs' 385 | Year: '2022' 386 | Topic: 'classification and clustering methods' 387 | Language: en 388 | Programming_language: RStats 389 | Tools: RStudio 390 | Level_of_difficulty: intermediate 391 | Description: 'The tutorial offers an introduction into classification in general, distance measures for data on all levels of measurement, hierarchical clustering with different linking methods, k-means clustering, hdbscan clustering and the silhouette validation method. All examples are developed using real life archaeological data from the archdata package. The tutorial aims at archaeologists familiar with the scripting language R, but can be also gainfully read by those who wish to apply the methods in another software.' 392 | Material_type: textbook 393 | Tags: 'clustering, data import, data wrangling, multivariate statistics' 394 | Tags_openarchaeo: "" 395 | Link: 'https://doi.org/10.5281/zenodo.6325372' 396 | Citation: 'Schmidt, Sophie C., Martini, Sarah, Staniuk, Robert, Quatrelivre, Carole, Hinz, Martin, Nakoinz, Oliver, Bilger, Michael, Roth, Georg, & Laabs, Julian. (2022, March 3). Tutorial on Classification in Archaeology: Distance Matrices, Clustering Methods and Validation. Zenodo. https://doi.org/10.5281/zenodo.6325372' 397 | - ID: SIG-T0023 398 | Source: "" 399 | X_map: 119 400 | Y_map: 68 401 | Name: 'Computational Population Genetics' 402 | Author: 'Stephan Schiffels' 403 | Year: '2019' 404 | Topic: 'basic population genetic analysis' 405 | Language: en 406 | Programming_language: 'bash, Python, RStats' 407 | Tools: 'Jupyter Notebooks' 408 | Level_of_difficulty: intermediate 409 | Description: 'This repository contains several Jupyter Notebooks that I have used in the past for teaching various elements of population-genetic data analyses to students with no initial training in population genetics or Unix-based data analysis.' 410 | Material_type: workshop 411 | Tags: 'multivariate statistics, data analysis' 412 | Tags_openarchaeo: "" 413 | Link: 'https://github.com/Schiffels-Popgen/popgen_course' 414 | Citation: "" 415 | - ID: SIG-T0024 416 | Source: "" 417 | X_map: 114 418 | Y_map: 61 419 | Name: '2019 Workshop on Computational Population Genetics' 420 | Author: 'Stephan Schiffels, Choongwon Jeong, Benjamin Peter' 421 | Year: '2019' 422 | Topic: 'basic and more advanced population genetics and archaeogenetics' 423 | Language: en 424 | Programming_language: 'bash, Python' 425 | Tools: 'Jupyter Notebooks' 426 | Level_of_difficulty: advanced 427 | Description: 'An introduction to some of the most important archaeogenetic data/software/methods at the time' 428 | Material_type: workshop 429 | Tags: 'multivariate statistics, data analysis' 430 | Tags_openarchaeo: "" 431 | Link: 'https://comppopgenworkshop2019.readthedocs.io/en/latest/' 432 | Citation: "" 433 | - ID: SIG-T0025 434 | Source: "" 435 | X_map: 134 436 | Y_map: 72 437 | Name: 'A Step-by-Step Guide for Using Agent-Based Modeling in Archaeological Research' 438 | Author: 'Iza Romanowska, Stefani Crabtree, Kathryn Harris, Benjamin Davies' 439 | Year: '2019' 440 | Topic: 'introduction to agent-based modeling with tutorials published as a special section in Advances in Archaeological Practice' 441 | Language: en 442 | Programming_language: NetLogo 443 | Tools: "" 444 | Level_of_difficulty: beginner 445 | Description: 'Tutorials on how to build simple agent-based models for archaeology published as a special section in Advances in Archaeological Practice. Link leads to open preprint.' 446 | Material_type: article 447 | Tags: ABM 448 | Tags_openarchaeo: "" 449 | Link: 'https://www.researchgate.net/publication/333300954_Agent-Based_Modeling_for_Archaeologists_Part_1_of_3 ' 450 | Citation: 'Advances in Archaeological Practice , Volume 7 , Issue 2 , May 2019 , pp. 178 – 184. DOI: https://doi.org/10.1017/aap.2019.6' 451 | - ID: SIG-T0026 452 | Source: "" 453 | X_map: 145 454 | Y_map: 87 455 | Name: 'Agent-Based Modeling for Archaeology – Simulating the Complexity of Societies' 456 | Author: 'Iza Romanowska, Colin Wren, Stefani Crabtree' 457 | Year: '2021' 458 | Topic: 'introductory textbook on agent-based modeling' 459 | Language: en 460 | Programming_language: NetLogo 461 | Tools: NetLogo 462 | Level_of_difficulty: intermediate 463 | Description: 'open-access textbook for agent-based modeling in archaeology with lots of tutorials and code examples' 464 | Material_type: textbook 465 | Tags: ABM 466 | Tags_openarchaeo: "" 467 | Link: 'https://santafeinstitute.github.io/ABMA/' 468 | Citation: "" 469 | - ID: SIG-T0027 470 | Source: "" 471 | X_map: 70 472 | Y_map: 51 473 | Name: 'Analyzing archaeological data in R (stat4arch)' 474 | Author: 'Petr Pajdla, Peter Tkáč' 475 | Year: '2020-2022' 476 | Topic: 'slides, syllabus etc. for an uni course on introductory R in archaeology' 477 | Language: 'en, cz, sk' 478 | Programming_language: RStats 479 | Tools: RStudio 480 | Level_of_difficulty: beginner 481 | Description: 'Slides and syllabus for a uni course on R and more. Aiminng at promoting good practice regarding data management and reproducible workflows among the students.' 482 | Material_type: slides 483 | Tags: 'basic statistics, reproducibility, data management' 484 | Tags_openarchaeo: "" 485 | Link: 'https://petrpajdla.github.io/stat4arch/' 486 | Citation: "" 487 | - ID: SIG-T0028 488 | Source: "" 489 | X_map: 65 490 | Y_map: 30 491 | Name: 'CRAN Task View: Archaeological Science' 492 | Author: 'Ben Marwick' 493 | Year: ongoing 494 | Topic: 'comprehensive list of R packages used in archaeology and list of articles, preferably with code and data included' 495 | Language: en 496 | Programming_language: RStats 497 | Tools: "" 498 | Level_of_difficulty: intermediate 499 | Description: 'Includes list of R packages, articles and short introductory how-to guide for beginners.' 500 | Material_type: 'resource list' 501 | Tags: 'reproducibility, data management' 502 | Tags_openarchaeo: "" 503 | Link: 'https://github.com/benmarwick/ctv-archaeology' 504 | Citation: "" 505 | - ID: SIG-T0029 506 | Source: "" 507 | X_map: 35 508 | Y_map: 31 509 | Name: 'Data organization in spreadsheets' 510 | Author: 'Karl Broman' 511 | Year: '2017' 512 | Topic: 'guide on how to organize your data in spreadsheets' 513 | Language: en 514 | Programming_language: "" 515 | Tools: spreadsheets 516 | Level_of_difficulty: beginner 517 | Description: 'Guide with very basic information on how to organize data.' 518 | Material_type: article 519 | Tags: 'data management, archiving, spreadsheets' 520 | Tags_openarchaeo: "" 521 | Link: 'https://kbroman.org/dataorg/' 522 | Citation: 'https://doi.org/10.1080/00031305.2017.1375989' 523 | - ID: SIG-T0030 524 | Source: "" 525 | X_map: 180 526 | Y_map: 47 527 | Name: 'PyQGIS 101' 528 | Author: 'Anita Graser' 529 | Year: '2018' 530 | Topic: 'PyQGIS introduction' 531 | Language: en 532 | Programming_language: Python 533 | Tools: QGIS 534 | Level_of_difficulty: beginner 535 | Description: 'This tutorial aims to help GIS users to get started with Python programming for QGIS 3. In contrast to many tutorials out there, the idea is to not assume any previous programming knowledge.' 536 | Material_type: tutorial 537 | Tags: GIS 538 | Tags_openarchaeo: "" 539 | Link: 'https://anitagraser.com/pyqgis-101-introduction-to-qgis-python-programming-for-non-programmers/' 540 | Citation: "" 541 | - ID: SIG-T0031 542 | Source: "" 543 | X_map: 52 544 | Y_map: 28 545 | Name: 'Cow-culating your data with spreadsheets and R' 546 | Author: 'Paulina F. Przystupa, L. Meghan Dennis' 547 | Year: '2022' 548 | Topic: 'basic data visualization using spreadsheets and R, how to explore bias in data, and creative ways to present data' 549 | Language: en 550 | Programming_language: RStats 551 | Tools: 'spreadsheets, text editor' 552 | Level_of_difficulty: beginner 553 | Description: 'Tutorial about fundamental data processing and analysis practices' 554 | Material_type: tutorial 555 | Tags: 'data literacy, data stories, open data, public engagement, teaching ' 556 | Tags_openarchaeo: "" 557 | Link: 'https://doi.org/10.6078/M7ZW1J2X' 558 | Citation: 'Przystupa, Paulina F. and L. Meghan Dennis 2022 Cow-culating your data with spreadsheets and R. The Alexandria Archive Institute. DOI: https://doi.org/10.6078/M73N21HR' 559 | - ID: SIG-T0032 560 | Source: "" 561 | X_map: 42 562 | Y_map: 16 563 | Name: 'Gabbing about Gabii: Going from Notes to Data to Narrative' 564 | Author: 'L. Meghan Dennis, Paulina F. Przystupa' 565 | Year: '2022' 566 | Topic: 'turning site forms into usable and filterable tables; how to turn those data into narratives using different narrative lenses' 567 | Language: en 568 | Programming_language: "" 569 | Tools: 'spreadsheets, text editor' 570 | Level_of_difficulty: beginner 571 | Description: 'Tutorial about digitizing and processing data from paper records' 572 | Material_type: tutorial 573 | Tags: 'data literacy, data stories, digital collections, narrative, open data, teaching' 574 | Tags_openarchaeo: "" 575 | Link: 'https://doi.org/10.6078/M76D5R3Q' 576 | Citation: 'Dennis, L. Meghan and Paulina F. Przystupa 2022 Gabbing about Gabii: Going from Notes to Data to Narrative. The Alexandria Archive Institute. DOI: https://doi.org/10.6078/M7B27SF5' 577 | - ID: SIG-T0033 578 | Source: "" 579 | X_map: 151 580 | Y_map: 92 581 | Name: 'RGBCatastrophe: A Netlogo tool for teaching, learning, and thinking about complexity' 582 | Author: 'Andre Costopoulos' 583 | Year: '2022' 584 | Topic: "" 585 | Language: en 586 | Programming_language: NetLogo 587 | Tools: NetLogo 588 | Level_of_difficulty: beginner 589 | Description: 'Helps students understand the basic insight that a single kind of cause can have a broad range of impacts, depending on the context in which it happens, and the related insight that simple interactions between a few elements can generate complex and unpredictable behaviour. It can help us understand how system state relates to consequences and how rapid and sudden change can take place.' 590 | Material_type: demonstration 591 | Tags: 'agent-based modelling, complexity' 592 | Tags_openarchaeo: "" 593 | Link: 'https://archeothoughts.wordpress.com/2022/05/30/rgbcatastrophe-a-netlogo-tool-for-teaching-learning-and-thinking-about-complexity/' 594 | Citation: "" 595 | - ID: SIG-T0034 596 | Source: SIG-T0038 597 | X_map: 75 598 | Y_map: 55 599 | Name: 'Introduction to R and the Tidyverse' 600 | Author: 'Clemens Schmid' 601 | Year: '2023' 602 | Topic: 'data analysis with R and the tidyverse' 603 | Language: en 604 | Programming_language: RStats 605 | Tools: RStudio 606 | Level_of_difficulty: beginner 607 | Description: 'A book chapter to follow along and learn about basic data analysis with R and the tidyverse.' 608 | Material_type: tutorial 609 | Tags: 'tidyverse, data import, data wrangling, visualisation, programming' 610 | Tags_openarchaeo: "" 611 | Link: 'https://www.spaam-community.org/intro-to-ancient-metagenomics-book/r-tidyverse.html' 612 | Citation: "" 613 | - ID: SIG-T0035 614 | Source: "" 615 | X_map: 177 616 | Y_map: 60 617 | Name: 'GIS in Archaeology' 618 | Author: 'Joe Roe' 619 | Year: '2022' 620 | Topic: 'introduction to use of Geographic Information Systems (GIS) software in archaeology, including basic skills in cartography, geospatial data management, and spatial analysis.' 621 | Language: en 622 | Programming_language: "" 623 | Tools: QGIS 624 | Level_of_difficulty: beginner 625 | Description: 'Online textbook for a course taught at the University of Bern. The course is designed to be delivered in in-person labs, but can probably be worked through independently as well.' 626 | Material_type: textbook 627 | Tags: 'gis, spatial analysis' 628 | Tags_openarchaeo: "" 629 | Link: 'https://gia.joeroe.io' 630 | Citation: "" 631 | - ID: SIG-T0036 632 | Source: "" 633 | X_map: 78 634 | Y_map: 45 635 | Name: 'Statistical Methods for Archaeological Data Analysis (Roe)' 636 | Author: 'Joe Roe' 637 | Year: '2023' 638 | Topic: 'introduction to statistical analysis in archaeology using R.' 639 | Language: en 640 | Programming_language: RStats 641 | Tools: "" 642 | Level_of_difficulty: beginner 643 | Description: 'Online textbook for a course taught at the University of Bern. The course is designed to be delivered in in-person labs, but can probably be worked through independently as well.' 644 | Material_type: textbook 645 | Tags: 'basic statistics, exploratory data analysis, tidyverse, data wrangling, visualisation, programming' 646 | Tags_openarchaeo: "" 647 | Link: 'https://smada.joeroe.io' 648 | Citation: "" 649 | - ID: SIG-T0037 650 | Source: "" 651 | X_map: 90 652 | Y_map: 90 653 | Name: 'Online Companion to Network Science in Archaeology' 654 | Author: 'Matthew A. Peeples, Tom Brughmans' 655 | Year: '2023' 656 | Topic: 'a series of tutorials that outline methods for managing, analyzing, and visualizing network data, primarily using the R programming language' 657 | Language: en 658 | Programming_language: RStats 659 | Tools: RStudio 660 | Level_of_difficulty: beginner 661 | Description: 'The tutorials are designed to complement the text of the associated book (Brughmans and Peeples 2023) but can also stand alone as a guide to implementation of network analyses in R if you have a basic background in network methods and terminology. Although each section of this guide builds upon the previous sections in terms of network concepts and R methods, the sections are each independent in terms of data, examples, and code and can be run out of order if you choose.' 662 | Material_type: tutorial 663 | Tags: 'data wrangling, network analysis, multivariate statistics, spatial statistics' 664 | Tags_openarchaeo: "" 665 | Link: 'https://archnetworks.net/' 666 | Citation: 'Peeples, Matthew A. and Tom Brughmans (2023). Online Companion to Network Science in Archaeology. https://archnetworks.net, Accessed 2023-03-21.' 667 | - ID: SIG-T0038 668 | Source: "" 669 | X_map: 119 670 | Y_map: 58 671 | Name: 'Introduction to Ancient Metagenomics' 672 | Author: 'James A. Fellows Yates, Christina Warinner, Alina Hiß, Arthur Kocher, Clemens Schmid, Irina Velsko, Maxime Borry, Megan Michel, Nikolay Oskolkov, Sebastian Duchene, Thiseas Lamnidis, Aida Andrades Valtueña, Alexander Herbig, Alexander Hübner, Kevin Nota, Robin Warner, Meriam Guellil' 673 | Year: '2023' 674 | Topic: 'introduction to various computational analysis in the field of ancient metagenomics' 675 | Language: en 676 | Programming_language: 'bash, RStats, Python' 677 | Tools: "" 678 | Level_of_difficulty: intermediate 679 | Description: 'This book introduces the main steps of ancient metagenomic bioinformatic workflows, familiarising students with the command line, demonstrating how to process next-generation-sequencing (NGS) data, and showing how to perform de novo metagenomic assembly.' 680 | Material_type: textbook 681 | Tags: 'data analysis, pipelines' 682 | Tags_openarchaeo: "" 683 | Link: 'https://github.com/SPAAM-community/intro-to-ancient-metagenomics-book' 684 | Citation: 'James A. Fellows Yates, Christina Warinner, Alina Hiß, Arthur Kocher, Clemens Schmid, Irina Velsko, Maxime Borry, Megan Michel, Nikolay Oskolkov, Sebastian Duchene, Thiseas Lamnidis, Aida Andrades Valtueña, Alexander Herbig, Alexander Hübner, Kevin Nota, Robin Warner, Meriam Guellil. (2023). Introduction to Ancient Metagenomics (Edition 2023). Zenodo. DOI: 10.5281/zenodo.8027281' 685 | - ID: SIG-T0039 686 | Source: SIG-T0038 687 | X_map: 97 688 | Y_map: 75 689 | Name: 'Introduction to the Command Line' 690 | Author: 'Thiseas C. Lamnidis, Aida Andrades Valtueña ' 691 | Year: '2023' 692 | Topic: 'working on the linux command line' 693 | Language: en 694 | Programming_language: bash 695 | Tools: "" 696 | Level_of_difficulty: beginner 697 | Description: 'A book chapter explaining how to navigate, run commands and program in the bash shell.' 698 | Material_type: tutorial 699 | Tags: programming 700 | Tags_openarchaeo: "" 701 | Link: 'https://www.spaam-community.org/intro-to-ancient-metagenomics-book/bare-bones-bash.html' 702 | Citation: "" 703 | - ID: SIG-T0041 704 | Source: SIG-T0038 705 | X_map: 156 706 | Y_map: 87 707 | Name: 'Introduction to Python and Pandas' 708 | Author: 'Robin Warner, Kevin Nota, Maxime Borry ' 709 | Year: '2023' 710 | Topic: 'data analysis with python and pandas' 711 | Language: en 712 | Programming_language: Python 713 | Tools: 'Jupyter Notebooks' 714 | Level_of_difficulty: beginner 715 | Description: 'A book chapter introducing data analysis with Python using the Pandas library.' 716 | Material_type: tutorial 717 | Tags: 'data import, data wrangling, visualisation, programming' 718 | Tags_openarchaeo: "" 719 | Link: 'https://www.spaam-community.org/intro-to-ancient-metagenomics-book/python-pandas.html' 720 | Citation: "" 721 | - ID: SIG-T0042 722 | Source: SIG-T0038 723 | X_map: 90 724 | Y_map: 31 725 | Name: 'Introduction to Git(Hub)' 726 | Author: 'Megan Michel, James Fellows Yates ' 727 | Year: '2023' 728 | Topic: 'version control with Git and collaborative work on GitHub' 729 | Language: en 730 | Programming_language: "" 731 | Tools: 'Git, GitHub' 732 | Level_of_difficulty: beginner 733 | Description: 'A book chapter to explain Git and GitHub with practical advice on how to set it up.' 734 | Material_type: tutorial 735 | Tags: 'data management, programming' 736 | Tags_openarchaeo: "" 737 | Link: 'https://www.spaam-community.org/intro-to-ancient-metagenomics-book/git-github.html' 738 | Citation: "" 739 | - ID: SIG-T0043 740 | Source: "" 741 | X_map: 50 742 | Y_map: 35 743 | Name: 'Data Analysis and Visualization in R for Archaologists' 744 | Author: 'Alison Clarke, François Michonneau, Auriel Fournier' 745 | Year: '2023' 746 | Topic: 'basic R introduction, data analysis, data visualization' 747 | Language: en 748 | Programming_language: Rstats 749 | Tools: RStudio 750 | Level_of_difficulty: beginner 751 | Description: 'basic concepts, skills, and tools for working with data so that they can get more done in less time, and with less pain. These lessons were designed for those interested in working with archaeology data in R.' 752 | Material_type: tutorial 753 | Tags: 'data wrangling, visualisation, tidyverse' 754 | Tags_openarchaeo: 'Educational resources and practical guides' 755 | Link: 'https://carpentries-incubator.github.io/R-archaeology-lesson/' 756 | Citation: "" 757 | - ID: SIG-T0044 758 | Source: "" 759 | X_map: 169 760 | Y_map: 63 761 | Name: 'Tutorial for the archeoViz application (R package)' 762 | Author: 'Sébastien Plutniak' 763 | Year: '2023' 764 | Topic: 'data analysis, data visualization' 765 | Language: en 766 | Programming_language: "" 767 | Tools: archeoViz 768 | Level_of_difficulty: beginner 769 | Description: 'An introduction to the archeoViz application / R package for statistical and visual exploration of spatial data in archaeology.' 770 | Material_type: tutorial 771 | Tags: 'open data, visualisation, basic statistics, spatial analysis' 772 | Tags_openarchaeo: "" 773 | Link: 'https://archeoviz.hypotheses.org/1043' 774 | Citation: 'Sébastien Plutniak. 2023. Tutorial for the archeoViz application (R package). archeoViz. Data visualization in archaeology. DOI: https://doi.org/10.58079/bd8' 775 | - ID: SIG-T0045 776 | Source: "" 777 | X_map: 29 778 | Y_map: 33 779 | Name: 'Introduction to file formats and archeological data preparation, using the archeoViz application' 780 | Author: 'Sébastien Plutniak' 781 | Year: '2023' 782 | Topic: 'tabular file formats and archeological data preparation' 783 | Language: en 784 | Programming_language: "" 785 | Tools: archeoViz 786 | Level_of_difficulty: beginner 787 | Description: 'An introduction to file formats and archeological data preparation using the archeoViz application.' 788 | Material_type: tutorial 789 | Tags: 'data literacy, data management, spreadsheets, teaching' 790 | Tags_openarchaeo: "" 791 | Link: 'https://archeoviz.hypotheses.org/129' 792 | Citation: 'Sébastien Plutniak. 2023. Introduction to File Formats and Archeological Data Preparation, using the archeoViz Application. archeoViz. Data visualization in archaeology. DOI: https://doi.org/10.58079/bd7i' 793 | - ID: SIG-T0046 794 | Source: "" 795 | X_map: 54 796 | Y_map: 22 797 | Name: 'Introduction to archaeological data curation, description, and edition, using the archeoViz application' 798 | Author: 'Sébastien Plutniak' 799 | Year: '2023' 800 | Topic: 'archaeological data curation, description, and edition' 801 | Language: en 802 | Programming_language: "" 803 | Tools: archeoViz 804 | Level_of_difficulty: intermediate 805 | Description: 'An introduction to archaeological data curation, description, and edition, using the archeoViz application.' 806 | Material_type: tutorial 807 | Tags: 'open data, data management, basic statistics, teaching' 808 | Tags_openarchaeo: "" 809 | Link: 'https://archeoviz.hypotheses.org/158' 810 | Citation: 'Sébastien Plutniak. 2023. Introduction to Archaeological Data Curation, Description, and Edition, using the archeoViz Application. archeoViz. Data visualization in archaeology. DOI: https://doi.org/10.58079/bd7j' 811 | - ID: SIG-T0047 812 | Source: "" 813 | X_map: 68 814 | Y_map: 62 815 | Name: 'Introduction to the R programming language and reproducible science, using the archeoViz application' 816 | Author: 'Sébastien Plutniak' 817 | Year: '2023' 818 | Topic: 'R programming language, reproducible science' 819 | Language: en 820 | Programming_language: Rstats 821 | Tools: Rstudio 822 | Level_of_difficulty: intermediate 823 | Description: 'An introduction to the R programming language and the concepts of reproducible science, using the archeoViz application.' 824 | Material_type: tutorial 825 | Tags: 'programming, reproducibility, teaching' 826 | Tags_openarchaeo: "" 827 | Link: 'https://archeoviz.hypotheses.org/164' 828 | Citation: 'Sébastien Plutniak. 2023. Introduction to the R Programming Language and Reproducible Science, using the archeoViz Application. archeoViz. Data visualization in archaeology. DOI: https://doi.org/10.58079/bd7k' 829 | - ID: SIG-T0048 830 | Source: "" 831 | X_map: 173 832 | Y_map: 65 833 | Name: 'Tutorial: online visualization and graphic exports of archaeological spatial data, using the archeoViz application' 834 | Author: 'Sébastien Plutniak' 835 | Year: '2023' 836 | Topic: 'online visualization and dissemination of archaeological spatial data' 837 | Language: en 838 | Programming_language: "" 839 | Tools: archeoViz 840 | Level_of_difficulty: beginner 841 | Description: 'A tutorial about the online visualization and dissemination of archaeological spatial data, using the archeoViz application.' 842 | Material_type: tutorial 843 | Tags: 'visualisation, spatial analysis, teaching' 844 | Tags_openarchaeo: "" 845 | Link: 'https://archeoviz.hypotheses.org/178' 846 | Citation: 'Sébastien Plutniak. 2023. Tutorial: Online Visualization and Graphic Exports of Archaeological Spatial Data, using the archeoViz Application. archeoViz. Data visualization in archaeology. DOI: https://doi.org/10.58079/bd7l' 847 | - ID: 'SIG-T0049 ' 848 | Source: "" 849 | X_map: 76 850 | Y_map: 36 851 | Name: 'Curso de introducción a R para arqueologos/as' 852 | Author: 'María Coto Sarmiento' 853 | Year: '2024' 854 | Topic: 'R programming language' 855 | Language: es 856 | Programming_language: Rstats 857 | Tools: "" 858 | Level_of_difficulty: beginner 859 | Description: 'A basic introduction to R.' 860 | Material_type: tutorial 861 | Tags: 'data wrangling, visualisation' 862 | Tags_openarchaeo: "" 863 | Link: 'https://github.com/Mcotsar/Curso_Intro_R_Arqueologia' 864 | Citation: "" 865 | - ID: SIG-T0050 866 | Source: "" 867 | X_map: 43 868 | Y_map: 34 869 | Name: 'R and Statistics for Archaeologists' 870 | Author: 'Bjørn Peare Bartholdy' 871 | Year: '2024' 872 | Topic: 'data analysis with R and the tidyverse' 873 | Language: en 874 | Programming_language: Rstats 875 | Tools: RStudio 876 | Level_of_difficulty: beginner 877 | Description: 'Materials for an introduction course on R and data analysis with the tidyverse, using archaeological data.' 878 | Material_type: tutorial 879 | Tags: 'tidyverse, data import, data wrangling, visualisation, programming' 880 | Tags_openarchaeo: "" 881 | Link: 'https://rchaeology.github.io/RchaeoStats/' 882 | Citation: 'https://github.com/rchaeology/RchaeoStats' 883 | - ID: SIG-T0051 884 | Source: "" 885 | X_map: 69 886 | Y_map: 56 887 | Name: 'Archaeological Spatial Analysis in R' 888 | Author: 'Michal Michalski' 889 | Year: '2023' 890 | Topic: 'spatial data analysis with R' 891 | Language: en 892 | Programming_language: Rstats 893 | Tools: RStudio 894 | Level_of_difficulty: intermediate 895 | Description: 'A course to introduce students to spatial data processing, analysis and visualization using the R programming language.' 896 | Material_type: tutorial 897 | Tags: 'spatial statistics, GIS, programming, visualisation' 898 | Tags_openarchaeo: "" 899 | Link: 'https://topographos.github.io/asar/' 900 | Citation: 'https://github.com/topographos/asar' 901 | - ID: SIG-T0052 902 | Source: "" 903 | X_map: 58 904 | Y_map: 76 905 | Name: 'Visualisation of lead isotope data' 906 | Author: 'Yiu-Kang Hsu' 907 | Year: '2024' 908 | Topic: 'plotting lead isotope data with R' 909 | Language: en 910 | Programming_language: Rstats 911 | Tools: "" 912 | Level_of_difficulty: intermediate 913 | Description: 'A textbook chapter documenting and explaining some techniques to visualize lead isotope data in R.' 914 | Material_type: tutorial 915 | Tags: 'visualisation, 3D methods, scientific data' 916 | Tags_openarchaeo: "" 917 | Link: 'https://archmetaldbm.github.io/GlobaLID-Edu/visualisation.html' 918 | Citation: 'https://doi.org/10.5281/zenodo.10205820' 919 | --------------------------------------------------------------------------------