Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
NACIS 2016 - Practical Cartography Day
Search
Seth Fitzsimmons
October 19, 2016
Design
1
550
NACIS 2016 - Practical Cartography Day
Bash and Make tips for scripting reproducible workflows
Seth Fitzsimmons
October 19, 2016
Tweet
Share
More Decks by Seth Fitzsimmons
See All by Seth Fitzsimmons
Working with OpenStreetMap using Apache Spark and GeoTrellis - SotMUS 2018
mojodna
0
310
OpenMapKit + POSM
mojodna
0
2k
Portable OpenStreetMap at SotM US 2016
mojodna
0
190
Print Cartography in a Multi-Resolution World
mojodna
4
800
How can open data save the world? How can we help?
mojodna
1
120
Trail Assist
mojodna
0
170
Worldwide Terrain and Cloud Infrastructure: an update on Stamen's Knight Grant
mojodna
0
270
Running Your Own Rendering Infrastructure (FOSS4G 2014 Edition)
mojodna
0
260
What We've Made Together
mojodna
0
160
Other Decks in Design
See All in Design
Designing User Experience through Interaction Design
lycorptech_jp
PRO
0
370
デザインシステムの「種」を使って、受託開発を加速させる
akane___ui
0
11k
Design Studio Deck | インクルーシブデザインスタジオCULUUM
culumu
3
3.8k
Мышление дизайнера историями. Как текстовые модели человеческого поведения помогают проектировать
ashapiro
0
400
[2025.6.30 もがく中堅デザイナー、キャリアの分岐点] なんでもやる系デザイナーのもがきかた
taka_piya
1
3.2k
freee + Product Design FY25Q4
freee
4
16k
教育分野に強いUIデザイナー / 山口哲弘ポートフォリオ
t2yamaguchi429
0
720
児童相談所における養育里親委託時の親権者同意に向けたコミュニケーションの実態
trivia
0
540
読書シェア会 vol.5 / Yumemi.grow 20250526
rakus_dev
0
1.8k
AIの実践とコミュニケーションデザインの意義 / AI practice and the significance of communication design
bebe
0
810
Portfolio 齋藤明敏 Hiroyuki Saito_守秘義務あり
crearedesign
0
280
【30人中30人が3ヶ月平均180万収入アップ】マズロー安達の弟子、成功事例集
maslow_akkun
0
300
Featured
See All Featured
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
358
30k
Reflections from 52 weeks, 52 projects
jeffersonlam
352
21k
Scaling GitHub
holman
463
140k
Producing Creativity
orderedlist
PRO
347
40k
Code Reviewing Like a Champion
maltzj
525
40k
Imperfection Machines: The Place of Print at Facebook
scottboms
268
13k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
The Art of Programming - Codeland 2020
erikaheidi
55
13k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Being A Developer After 40
akosma
90
590k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3k
We Have a Design System, Now What?
morganepeng
53
7.8k
Transcript
$ echo “Make, etc.” | \ wall -g PCD Seth
Fitzsimmons Stamen Design, etc.
[email protected]
# slides $ open \ http://bit.ly/2eFFvJt
# why? # # * repeatable # * self-documenting #
* transformations # <> data changes
# on Windows 10? # no worries # # “Bash
on Ubuntu # on Windows”
# shell fundamentals $ /bin/sh -c theory
# is a comment $ is a prompt
# <cmd> ––help usually # works # man <cmd> is
detailed
# do this, then that $ this; that
# if this, then that $ this && that
# that, unless this $ this || that
# standard file # descriptors # (stdio)
# stdin (fd 0) $ cat > greeting Hi! ⌃d
$ cat greeting Hi!
# stdout (fd 1) $ echo “Hi PCD!”
# stderr $ >&2 echo Error
# a data black hole /dev/null
# redirection $ echo hi > greeting
# append $ echo hey >> greeting
# stderr → stdout $ thing 2>&1 logs
# pipe # this means everything # can be combined!!!
$ cat /etc/passwd | \ grep -i calendar
# exit codes $ thing; echo $?
# success (0) $ thing && echo $? 0
# failure (not 0) $ thing || echo $? 1
$ make basics
# same input (repeatedly), # same output $ make idempotency
Yes $ make idempotency Yes
# target this: touch $@
# prerequisite this: that # that exists cp that this
$ make -j2 vars fns
# target this: # outputs “this” echo $@
# all prereqs this: that the_other # “that the_other” echo
$^
# first prereq this: that the_other # “that” echo $<
# first prereq this: that the_other # “that” echo $<
# nth prereq this: that the_other # “the_other” echo $(word
2, $^)
# catch-all %: echo 42 > $@
$ ls /bin
# explore
# who am I? $ whoami seth
# where am I? $ pwd /home/seth
# what time is it? $ date Tue Oct 18
23:58:42 MDT 2016
# what’s here? $ ls -lh total 8 -rw-r--r-- 1
seth wheel …
# what’s in that file? $ cat /etc/passwd …
# …a page at a time $ less /etc/passwd …
# …just the beginning $ head /etc/passwd …
# …just the end $ tail /etc/passwd …
# what variables are set? $ env HOME=/home/seth …
# where’s that file? $ find . -type f -name
hi <list of files>
# where’d that file go? # (full-text search, macOS) $
mdfind Seattle <list of files>
# get help $ man man …
# manipulation
# create a file $ touch file
# copy a file $ cp file file2
# move a file $ mv file2 file3
# delete a file $ rm file3
# create a directory $ mkdir -p my/stuff
# remove a directory $ rmdir my/stuff
# remove a directory # and everything in it $
rm -r my
# find lines in a file $ grep -i name
file.txt
# find non-matching lines $ grep -v name file.txt
# count words, lines, # characters $ wc file.txt
# pretty-print JSON $ jq . file.json
# extract fields $ jq .name file.json
# replace things $ sed 's/this/that/' file
# extract columns $ cut -d , -f 1,3 file.csv
# extract columns $ cut -d , -f 1,3 file.csv
# compression
# open a zip file $ unzip file.zip
# list zip contents $ unzip -v file.zip
# create a zip $ zip file file.zip
# open a tarball $ tar zxf file.tar.gz
# list a tarball $ tar ztf file.tar.gz
# create a tarball $ tar zcf file.tar.gz stuff/
# compress with gzip $ gzip file.tar
# uncompress with gzip $ gzip -d file.tar.gz
# misc
# always exit 0 $ true; echo $? 0
# always exit non-0 $ false; echo $? 1
# fetch and fail # if appropriate $ curl -f
nacis.org
# download $ wget nacis.org
# download $ wget nacis.org
# “open” (macOS) $ open nacis.org
# display progress $ cat /etc/passwd | \ pv |
wc -l
# also write to a file $ echo hi |
tee file
$ man bash
#!/usr/bin/env bash
set -eo pipefail
set -x
NACIS=2016
# assignment NACIS=“2016”
# capture a command NACIS=$(curl nacis.org)
echo $NACIS
echo ${NACIS}
# set a default value echo ${NACIS:-PCD}
# replace echo ${NACIS/2016/2017}
# replace all echo ${NACIS//2016/2017}
# substring echo ${NACIS:2:2}
# remove suffix $ filename=“world.tif” $ echo ${filename%.tif} world
# do math $ echo $[2 ** 3] 8
if [[ “this” != “that” ]]; then echo Control Flow
elif [[ ! -f file ]]; then touch file elif [[ $six -le $five ]]; then false else rm -f file fi
while true; do echo Control Flow done
for f in $(ls); do echo $f done
# man test
# misc
# extract filename $ basename /etc/passwd passwd
# extract directory $ dirname /etc/passwd /etc
$ make recipes
$ make convert source.json: source.shp ogr2ogr \ -t_srs EPSG:4326 \
-f GeoJSON \ $@ \ $<
$ make reproject output.tif: source.tif gdalwarp \ -q \ -t_srs
EPSG:3857 \ $< \ $@
$ make wilderness data/S_USA.Wilderness.zip: @mkdir -p $$(dirname $@) @curl -sfL
http://data.fs.usda.gov/ geodata/edw/edw_resources/shp/ S_USA.Wilderness.zip \ -o $@
$ make table db/wilderness: sql/wilderness.sql psql \ -c "\d $(subst
db/,,$@)" \ > /dev/null \ 2>&1 || \ psql \ -v ON_ERROR_STOP=1 \ -qX1f \ $<
# resources • https://bost.ocks.org/mike/make/ • http://www.gregreda.com/2013/07/15/unix- commands-for-data-science/ • https://google.github.io/styleguide/shell.xml •
https://github.com/stamen/toner-carto/blob/ master/Makefile (WARNING!) • http://mojodna.net/2015/01/07/make-for-data- using-make.html