├── .editorconfig ├── .gitattributes ├── .github ├── FUNDING.yml └── dependabot.yml ├── .gitignore ├── .pre-commit-config.yaml ├── .ruby-gemset ├── .ruby-version ├── Brewfile ├── Makefile ├── README.md ├── _drafts_and_notes ├── README.md ├── antifragile_onboarding │ └── README.md ├── build_your_own_bf │ └── notes.md ├── cli_exploration │ ├── notes.md │ └── submissions.md ├── eight_easy_steps │ └── eight_easy_steps.md ├── historical_modeling_with_rust │ ├── notes.md │ └── proposals.md ├── homebrew_on_linux │ ├── .gitignore │ ├── Brewfile │ ├── Makefile │ ├── Procfile │ ├── README.md │ ├── cc-by-sa.svg │ ├── chromeos.svg │ ├── custom.css │ ├── debian.svg │ ├── elementary.svg │ ├── favicon.ico │ ├── peru.yaml │ ├── pittsburgh_on_a_map.svg │ ├── powered_by_steamos.svg │ └── presentation.md ├── o11y_for_data_pipelines │ └── notes.md ├── office-issue-tracker │ └── submissions.md ├── pandas_to_polars │ ├── .filters │ │ └── embedded_graphviz.lua │ ├── .gitignore │ ├── Brewfile │ ├── Makefile │ ├── Procfile │ ├── peru.yaml │ ├── presentation.md │ └── submissions.md ├── personal_storage_threats │ └── notes.md ├── privcoms │ ├── .copier-answers.yml │ ├── .filters │ │ └── embedded_graphviz.lua │ ├── .gitignore │ ├── Brewfile │ ├── Makefile │ ├── Procfile │ ├── custom.css │ ├── notes.md │ ├── ondura_chatcontrol.png │ ├── peru.yaml │ ├── presentation.md │ ├── qrcode-through-the-web-darkly.svg │ └── tinfoilhat.png ├── scala_for_java_detox │ └── notes.md ├── seductive_tech │ └── notes.md ├── tips_for_talking_about_blockchain │ └── notes.md ├── tries │ └── notes.md └── walls │ ├── bourdain_walls.jpg │ ├── chadwickboseman-tchalla-bridges-walls.jpg │ └── presentation.md ├── _lightning ├── _drafts_and_notes │ ├── 7_evil_exes_of_startups │ │ └── README.md │ ├── README.md │ ├── continuous_onboarding │ │ ├── README.md │ │ ├── computer_reach.webp │ │ └── continuous_onboarding.md │ ├── meet_other_people │ │ └── notes.md │ └── mispronunciations │ │ └── notes.md ├── _reviews │ ├── README.md │ └── strangeloop2023 │ │ └── notes.md ├── elsewhere.md ├── enums │ └── notes.md ├── job_descriptions │ ├── Job Descriptions.key │ └── readme.md ├── job_hunt_organization │ └── README.md ├── json_cli │ └── notes.md ├── mosh │ ├── Gemfile │ ├── README.md │ ├── logos │ │ ├── .DS_Store │ │ ├── Android_Robot_100.png │ │ ├── JuiceSSH.png │ │ ├── NetBSD-smaller-tb.png │ │ ├── arch.png │ │ ├── chrome.png │ │ ├── debian.svg │ │ ├── fedora.png │ │ ├── freebsd.png │ │ ├── gentoo.png │ │ ├── homebrew2.png │ │ ├── macosx.png │ │ ├── macports.png │ │ ├── openSUSE.svg │ │ ├── opencsw.png │ │ └── ubuntu.svg │ ├── mosh-20170616-eriedayofcode.pdf │ ├── mosh.md │ ├── mosh.png │ └── start.sh ├── rubocop │ ├── Gemfile │ ├── README.md │ ├── bark.svg │ ├── forest.svg │ ├── grove.svg │ ├── logo.png │ ├── rubocop.md │ ├── rubocop.pdf │ ├── start.sh │ └── tree.svg ├── sei_issue_classification │ ├── .filters │ │ └── embedded_graphviz.lua │ ├── .gitignore │ ├── Brewfile │ ├── Makefile │ ├── Procfile │ ├── SEI_Issue_Classifcation_Quadrants.svg │ ├── custom.css │ ├── peru.yaml │ ├── sei_issue_classification.md │ ├── software_architecture_in_practice_cover_3rdEd.jpg │ ├── software_architecture_in_practice_cover_4thEd.jpg │ └── submissions.md ├── timetracking_with_ledger │ ├── bitbar.png │ ├── projects.png │ ├── sheet.png │ └── timetracking.md └── why_you_should_go_to_events │ └── why_you_should_go_to_events.md ├── _retired ├── README.md ├── _reviews │ ├── README.md │ ├── codemash2020_review │ │ ├── .gitignore │ │ ├── codemash2020.md │ │ ├── codemash2020_beach.jpg │ │ ├── marp.config.js │ │ ├── package-lock.json │ │ └── package.json │ ├── codemash2023_review │ │ ├── .filters │ │ ├── .gitignore │ │ ├── Brewfile │ │ ├── Makefile │ │ ├── Procfile │ │ ├── custom.css │ │ ├── godot3.png │ │ ├── peru.yaml │ │ ├── presentation.md │ │ └── tdd │ │ │ ├── fizzbuzz.py │ │ │ ├── poetry.lock │ │ │ ├── pyproject.toml │ │ │ └── vending.py │ ├── devopsdays_buffalo_2019_review │ │ ├── .gitignore │ │ ├── devopsdays_buffalo_logo.jpg │ │ ├── dodbuf19.md │ │ ├── marp.config.js │ │ ├── package-lock.json │ │ └── package.json │ ├── githubuniverse2016_review │ │ ├── 2016-09-13 14.47.50.jpg │ │ ├── 2016-09-13 15.49.37.jpg │ │ ├── 2016-09-14 09.04.43.jpg │ │ ├── 2016-09-14 09.04.59.jpg │ │ ├── 2016-09-14 09.23.31.jpg │ │ ├── 2016-09-14 09.24.57.jpg │ │ ├── 2016-09-14 09.25.35.jpg │ │ ├── 2016-09-14 21.56.53.jpg │ │ ├── 2016-09-15 10.01.35.jpg │ │ ├── 2016-09-15 14.11.36.jpg │ │ ├── 2016-09-15 18.38.12.jpg │ │ ├── 2016-09-15 18.41.30.jpg │ │ ├── This presentation requires Marp 0.0.9 - npm start │ │ ├── githubuniverse2016_review.md │ │ ├── portofsanfrancisco.jpg │ │ └── trailer.jpg │ └── saturn2016_review │ │ ├── SATURN 2016 retrospective.key │ │ └── SATURN 2016 retrospective.pdf ├── bitcoin-technical │ ├── README.md │ ├── bitcoin-technical.md │ ├── bitcoin-technical.pdf │ ├── bitcoin_logo.png │ ├── qrcode.svg │ └── start.sh ├── intro_to_programming │ ├── Intro to Programming.key │ └── notes.md └── vagrant │ ├── me.jpg │ ├── start.sh │ ├── vagrant.md │ ├── vagrant.pdf │ └── vagrant_logo.png ├── _template ├── .filters │ └── embedded_graphviz.lua ├── .gitignore ├── Brewfile ├── Makefile ├── Procfile ├── copier.yml ├── custom.css ├── notes.md.jinja ├── peru.yaml.jinja ├── presentation.md.jinja └── {{_copier_conf.answers_file}}.jinja ├── bio.md ├── cadcx_markdownlint_style.rb ├── code_review ├── Code Daze 2018 │ ├── Code Review is an Architectural Necessity - Colin Dean - Code Daze 2018.key │ └── livetweets.md ├── Code Review is an Architectural Necessity - Colin Dean - Winter 2022-2023.key ├── Github Universe 2016 │ ├── Code Review is an Architectural Necessity - Blog Series.md │ ├── Code Review is an Architectural Necessity - Colin Dean - Github Universe 2016.key │ ├── GithubUniverse2016.md │ ├── blog_published_links.md │ └── blog_slides │ │ ├── colins_team_on_spectrum.png │ │ ├── five_people.png │ │ ├── five_people_different_concepts.png │ │ ├── five_people_new_idea.png │ │ ├── five_people_reordered.png │ │ ├── pairing_modalities_chart.png │ │ ├── projector.png │ │ ├── ranked_motivations_from_developers.png │ │ ├── waste_power.png │ │ ├── westminster.png │ │ └── wiegers_spectrum.png ├── Others │ ├── boosterconf2017.md │ ├── rustbeltrust2016.md │ └── target_innercon_2019.md ├── SATURN 2016 │ ├── Code Review is an Architectural Necessity - Colin Dean - SATURN 2016.key │ └── saturn2016.md ├── etc │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── code_reviews.md │ ├── learning_chart.dot │ ├── notes.txt │ ├── projector.png │ ├── projector.xcf │ ├── projector_scan.jpg │ └── things_to_look_for.jpg └── references_and_see-also.md ├── codeandsupply_comp_survey_2022_engine ├── .filters │ └── embedded_graphviz.lua ├── .gitignore ├── Brewfile ├── Makefile ├── Procfile ├── README.md ├── codeandsupply_survey_600x500.svg ├── peru.yaml ├── presentation.md └── submissions.md ├── document_workflow ├── .filters │ └── embedded_graphviz.lua ├── .gitignore ├── Brewfile ├── Makefile ├── Procfile ├── README.md ├── colindean_bust_hat_codemash2020_circle.webp ├── custom.css ├── document_workflow.md ├── example_pdf.png ├── notes.md ├── peru.yaml └── submissions.md ├── esperanto ├── Esperanto in an Hour.key ├── Flag_of_Esperanto.png ├── Flag_of_Esperanto.svg ├── Flag_of_Esperanto2.png ├── Jubilea_simbolo.png ├── Jubilea_simbolo.svg └── Verda_Stelo.png ├── intro_to_git ├── .gitignore ├── Brewfile ├── Makefile ├── README.md ├── custom.css ├── embedded_graphviz.lua ├── intro_to_git.md └── peru.yaml ├── intro_to_mesh_networking └── Intro to Mesh Networking.key ├── intro_to_plaintextaccounting ├── Makefile ├── build_html.sh ├── examples.ledger ├── exercise1.ledger ├── exercise2.ledger ├── exercise2.pricedb ├── exercise3.ledger ├── images │ ├── Twitter_bird_logo_2012.svg.png │ ├── pennybags-emptypockets-hq.png │ ├── pennybags-emptypockets.png │ ├── pennybags-faint.jpg │ └── reddit-logo.png ├── plaintextaccounting - square.key ├── plaintextaccounting.key ├── styles.css ├── submissions.md ├── timekeeping.ledger └── workshop │ ├── 0100_dependencies.md │ └── README.md ├── make_python_devex ├── .filters │ └── embedded_graphviz.lua ├── .gitignore ├── .nvmrc ├── Brewfile ├── Makefile ├── Procfile ├── README.md ├── article.md ├── custom.css ├── gh_mpd_qrcode.svg ├── notes.md ├── our_python_installation_method.dot ├── peru.yaml ├── pittsburgh_on_a_map.svg ├── poetry_installation.dot ├── presentation.md ├── python_installation_methods.dot ├── submissions.md ├── ttblog_qrcode.svg └── venvs.svg ├── meaningful_ai ├── .filters │ └── embedded_graphviz.lua ├── .gitignore ├── Brewfile ├── Makefile ├── Procfile ├── artifex.jpg ├── blackforager.jpg ├── colin_and_brig.jpg ├── colin_and_brig_northsea.jpg ├── colin_pkt.jpg ├── colin_wc_band.jpg ├── cow_model_autophagy.png ├── fight_health_insurance.jpg ├── holcad_wc_from_codereview.jpg ├── nieman_court_reporter.png ├── nin_copyofa.jpg ├── notes.md ├── peru.yaml ├── pns_april2013.jpg └── presentation.md ├── nixos_cellular_router ├── .filters │ └── embedded_graphviz.lua ├── .gitignore ├── .nvmrc ├── 10dollarbill.jpg ├── Brewfile ├── Makefile ├── Procfile ├── cc-by-sa.svg ├── chromeos.svg ├── colindean_fosdem_2021_video_intro.png ├── configuration.nix ├── custom.css ├── debian.svg ├── elementary.svg ├── evolve3_inside.jpg ├── evolve3nix1_with_accessories.jpg ├── favicon.ico ├── hardware-configuration.nix ├── nixos.png ├── nixos.svg ├── peru.yaml ├── pittsburgh_on_a_map.svg ├── powered_by_steamos.svg ├── presentation.md ├── qnap.svg ├── redhat.png ├── repro.md ├── repro2.md ├── submissions.md ├── trustix.png └── ubuntu_2004.svg └── recordings.md /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: https://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | # Unix-style newlines with a newline ending every file 7 | [*] 8 | end_of_line = lf 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | 12 | # Matches multiple files with brace expansion notation 13 | # Set default charset 14 | [*.{js,py,rb,yaml,yml}] 15 | charset = utf-8 16 | 17 | # 4 space indentation 18 | [*.{py,lua}] 19 | indent_style = space 20 | indent_size = 4 21 | 22 | # Tab indentation (no size specified) 23 | [Makefile] 24 | indent_style = tab 25 | 26 | [{Gemfile,*.yml,*.yaml,*.css}] 27 | indent_style = space 28 | indent_size = 2 29 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.key filter=lfs diff=lfs merge=lfs -text 2 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | ############################################################################ 2 | # If you give me money, I'll probably put it right back into something else. 3 | # Consider donating to https://metamesh.org or https://codeandsupply.fund. 4 | ############################################################################ 5 | github: [colindean] 6 | ko_fi: colindean 7 | liberapay: colindean 8 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "npm" 4 | directory: "/" 5 | schedule: 6 | interval: "monthly" 7 | exclude-paths: 8 | - "_retired/*" 9 | - package-ecosystem: "bundler" 10 | directory: "/" 11 | schedule: 12 | interval: "monthly" 13 | exclude-paths: 14 | - "_retired/*" 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | *~ 3 | .peru 4 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | exclude: '^_retired' 2 | repos: 3 | - repo: https://github.com/markdownlint/markdownlint 4 | rev: v0.12.0 5 | hooks: 6 | - id: markdownlint 7 | # rubocop has too much stuff wrong with it to bother, I need to move it 8 | # to another presenter format and will redo it then. 9 | exclude: | 10 | (?x)^( 11 | _lightning/rubocop/rubocop.md| 12 | _lightning/_reviews/.* 13 | )$ 14 | 15 | args: 16 | - --style 17 | - cadcx_markdownlint_style.rb 18 | - repo: https://github.com/pre-commit/pre-commit-hooks 19 | rev: v6.0.0 20 | hooks: 21 | - id: trailing-whitespace 22 | - id: check-json 23 | - id: check-yaml 24 | - id: check-merge-conflict 25 | args: [--assume-in-merge] 26 | - repo: local 27 | hooks: 28 | # Prevent committing .rej files 29 | - id: forbidden-files 30 | name: "forbidden files" 31 | entry: "Found Copier update rejection files; review and remove them before merging." 32 | language: fail 33 | files: "\\.rej$" 34 | -------------------------------------------------------------------------------- /.ruby-gemset: -------------------------------------------------------------------------------- 1 | talks 2 | -------------------------------------------------------------------------------- /.ruby-version: -------------------------------------------------------------------------------- 1 | 2.1.3 2 | -------------------------------------------------------------------------------- /Brewfile: -------------------------------------------------------------------------------- 1 | # for creating new presentations from a template 2 | brew 'copier' 3 | # git pre-commit checks, pre-commit alternative 4 | brew 'prek' 5 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | PRECOMMIT = prek 2 | 3 | ##@ Utility 4 | 5 | .PHONY: help 6 | help: ## Display this help 7 | @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z0-9_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) 8 | 9 | ##@ Setup 10 | 11 | .PHONY: deps 12 | deps: deps-brew install-precommit deps-peru ## Install dependencies 13 | 14 | .PHONY: deps-brew 15 | deps-brew: Brewfile ## Installs Homebrew provided deps 16 | brew bundle install --verbose --file=Brewfile 17 | 18 | .PHONY: deps-peru 19 | deps-peru: peru.yaml ## Installs peru-tracked deps 20 | peru sync 21 | 22 | # file(s) written by pre-commit setup 23 | GIT_HOOKS = .git/hooks/pre-commit 24 | .PHONY: install-precommit 25 | install-precommit: $(GIT_HOOKS) ## Sets up pre-commit hooks 26 | @echo "Pre-commit configured, will run on future commits!" 27 | $(GIT_HOOKS): .pre-commit-config.yaml 28 | $(PRECOMMIT) install 29 | 30 | ##@ Talk setup 31 | 32 | .PHONY: new 33 | new: 34 | copier copy _template $(PATH) 35 | 36 | -------------------------------------------------------------------------------- /_drafts_and_notes/README.md: -------------------------------------------------------------------------------- 1 | # Drafts and speculative submissions 2 | 3 | This directory contains presentations, notes, and half-baked ideas that could one day become something. 4 | I have submitted some ideas in here speculatively. 5 | That is, I've pitched them without having built the whole presentation. 6 | This is normal and completely acceptable! 7 | 8 | Not everything in here is good. 9 | Not everything in here will eventually be presented. 10 | Some things in here are crap. 11 | Some things in here may be diamonds in the rough. 12 | Not everything in here should be taken seriously. 13 | Nothing in here should be taken as unmitigable fact. 14 | 15 | If you see something in here that you want to see turn into a presentable form, 16 | let me know in an [issue](https://github.com/colindean/talks/issues)! 17 | -------------------------------------------------------------------------------- /_drafts_and_notes/antifragile_onboarding/README.md: -------------------------------------------------------------------------------- 1 | # Antifragile Onboarding 2 | 3 | Building an onboarding process that is more than bulletproof: it adapts and evolves to meet the challenges of the day like an organism, not a rigid piece of matter. -------------------------------------------------------------------------------- /_drafts_and_notes/build_your_own_bf/notes.md: -------------------------------------------------------------------------------- 1 | https://esolangs.org/wiki/Brainfuck 2 | 3 | Implementation in Scala? 4 | 5 | Parse into Scala AST and then execute? Or just interpret straight up? 6 | 7 | # See also 8 | 9 | [50,000,000,000 Instructions Per Second: Design and Implementation of a 256-Core BrainFuck Computer](https://people.csail.mit.edu/wjun/papers/sigtbd16.pdf) 10 | -------------------------------------------------------------------------------- /_drafts_and_notes/cli_exploration/notes.md: -------------------------------------------------------------------------------- 1 | # Tour of 3-4 languages for creating quick command line tools 2 | 3 | 1. Scala 4 | 2. Ruby 5 | 3. Go 6 | 4. Python 7 | 5. Bash? 8 | 6. JavaScript? 9 | 10 | ## Scala 11 | 12 | https://www.spantree.net/blog/2017/06/26/scala-native-for-cli-tools.html 13 | 14 | ## Rust 15 | 16 | clap is pretty great 17 | 18 | https://github.com/kbknapp/clap-rs - https://crates.io/crates/clap 19 | 20 | https://crates.io/crates/clapcomp 21 | 22 | https://crates.io/crates/cargo-cli 23 | 24 | ## Ruby 25 | 26 | Thor is the only real game in town. 27 | 28 | http://whatisthor.com/ - https://github.com/erikhuda/thor 29 | 30 | ## All 31 | 32 | * [Command Line Interface Guidelines](https://clig.dev/) 33 | * [12 factor CLI apps at Heroku](https://medium.com/@jdxcode/12-factor-cli-apps-dd3c227a0e46) 34 | * [Go vs Rust](https://cuchi.me/posts/go-vs-rust) - compares a variety of aspects including compilation time, memory usage, dependencies size for basic stuff. Could be a great model for comparison. 35 | * [JSON output as a format mode](https://blog.kellybrazil.com/2021/12/03/tips-on-adding-json-output-to-your-cli-app/) 36 | * [UX patterns for CLI tools](https://lucasfcosta.com/2022/06/01/ux-patterns-cli-tools.html) 37 | -------------------------------------------------------------------------------- /_drafts_and_notes/cli_exploration/submissions.md: -------------------------------------------------------------------------------- 1 | # Submissions 2 | 3 | ## CodeMash 2019 4 | 5 | |Thing | Value | 6 | |------|-------| 7 | |Session title |Toolbuilding: a tour of tools for building CLI applications 8 | |Session format |General session 9 | |Track|Programming Principles| 10 | |Level|Intermediate| 11 | 12 | ### Description/Abstract 13 | 14 | A great command line tool is great not only because of what it accomplishes, but also how it is invoked. Deciding how to choose words that comprise argument switches, flags, and markers is form of art but deciding on what tools to use shouldn't be. In this talk, we'll tour a handful of frameworks for building command line experiences across a variety of languages. I'll evaluate how each expresses its options in the domain and see if there's a particular way that seems difficult but ultimately produces the most usable tool. 15 | -------------------------------------------------------------------------------- /_drafts_and_notes/historical_modeling_with_rust/notes.md: -------------------------------------------------------------------------------- 1 | # Historical Modeling with Rust 2 | 3 | ## Notes 4 | 5 | * Changes, not state 6 | * Better than: 7 | * System log - what to do with all of these logs? 8 | * Audit log - logging in-application but what if it gets inconsistent 9 | since it's a human putting the log call there? 10 | * Event sourcing - Everything becomes events but this is very complex to 11 | program and manage 12 | * Introduced to the concept at CodeMash 2017 by Michael Perry, its originator 13 | * Some HM techniques present in a Rails app I co-wrote but lots of work to do 14 | to make it actually fully HM-full 15 | * [Diesel](http://diesel.rs) is a Rust ORM 16 | * Why Rust? 17 | * Why not? 18 | * Rust is about making fast code safer 19 | * Make databases safer by _never deleting anything_ 20 | 21 | ## Links 22 | 23 | * 24 | * - 25 | -------------------------------------------------------------------------------- /_drafts_and_notes/historical_modeling_with_rust/proposals.md: -------------------------------------------------------------------------------- 1 | # Proposals submitted 2 | 3 | ## CodeMash 2019 4 | 5 | |Thing | Value | 6 | |------|-------| 7 | |Session title |Historical Modeling with Rust 8 | |Session format |General session 9 | |Track|Programming Principles| 10 | |Level|Intermediate| 11 | 12 | ### Description/Abstract 13 | 14 | Historical Modeling is a database persistence technique which favors recording of historical events as a series of facts instead of as a set of events that can be replayed to reach a state or as a preservation of present state with complex logic necessary for more than one source of state to reach consistency. This technique promises to record all changes that occur to a system in domain-specific logic, recognizing update and delete actions instead as the creation of data the alters the current presentable state. This results in a database schema that is append-only, a concept that greatly reduces the complexity of reaching that desirable, consistent state in a distributed or decentralized application. 15 | 16 | Rust is a systems programming language geared toward type-safe modeling along with fearless concurrency. Given Rust's promises of memory-safe operations in which a programmer need not worry about deleting data manually, it seems appropriate to talk about how implementation of historical modeling, the next generation of data persistence, makes sense in Rust, a next generation systems programming language. 17 | 18 | I'll be showing off a simple implementation of an application implemented in Rust using a combination of Rust's finest "crates" libraries. 19 | 20 | ### Notes for Organizers 21 | 22 | I learned about historical modeling at CodeMash last year, my first year in attendance. I was fascinated by it and immediately began implementing it in an app I was working on. The app to be presented is not that app. 23 | 24 | I would be a second-time CodeMash attendee and first time speaker at CodeMash. 25 | -------------------------------------------------------------------------------- /_drafts_and_notes/homebrew_on_linux/.gitignore: -------------------------------------------------------------------------------- 1 | .peru 2 | deps 3 | build 4 | node_modules 5 | presentation.html 6 | presentation.pdf 7 | presentation.docx 8 | .presentation.html.ws 9 | -------------------------------------------------------------------------------- /_drafts_and_notes/homebrew_on_linux/Brewfile: -------------------------------------------------------------------------------- 1 | brew 'peru' 2 | brew 'entr' 3 | brew 'pandoc' 4 | brew 'make' 5 | brew 'miniserve' 6 | brew 'hivemind' 7 | brew 'graphviz' 8 | brew 'npm' 9 | brew 'asciinema' 10 | brew 'websocat' 11 | -------------------------------------------------------------------------------- /_drafts_and_notes/homebrew_on_linux/Makefile: -------------------------------------------------------------------------------- 1 | PRESENTATION = presentation 2 | MARKDOWN = $(PRESENTATION).md 3 | HTML = $(MARKDOWN:md=html) 4 | PDF = $(MARKDOWN:md=pdf) 5 | 6 | DEPS_DIR = deps 7 | 8 | REVEALJS_VERSION = $(shell basename -s .zip $(shell yaml2json peru.yaml | jq -r '.["curl module revealjs"].url')) 9 | 10 | WS_WATCHED_FILE = .$(HTML).ws 11 | 12 | ##@ Utility 13 | 14 | .PHONY: help 15 | help: ## Display this help 16 | @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z0-9_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) 17 | 18 | ##@ Setup 19 | 20 | .PHONY: deps 21 | deps: peru.yaml Brewfile ## Install dependencies 22 | brew bundle --verbose --no-lock 23 | peru sync 24 | 25 | ##@ Presenting 26 | 27 | all: $(HTML) $(PDF) ## Build all artifacts 28 | 29 | html: $(HTML) ## Make the presentation reveal.js HTML 30 | 31 | open-and-serve: $(HTML) ## Start a server and open the presentation in a browser 32 | open http://localhost:8080/$(HTML) 33 | miniserve . 34 | 35 | ##@ Development 36 | 37 | automatic-regen: ## Use entr to automatically remake the file 38 | echo $(MARKDOWN) | entr -acpr $(SHELL) -c "make $(HTML) && echo reload >> $(WS_WATCHED_FILE)" 39 | 40 | watch: Procfile ## Use hivemind for constant building, run open first 41 | hivemind Procfile 42 | 43 | livereload-ws: ## Run a websocket server listening for reloads 44 | tail -f $(WS_WATCHED_FILE) | websocat -s 56789 45 | 46 | ##@ Cleanup 47 | 48 | clean: 49 | rm -f $(HTML) $(PDF) $(PDF_SERVER_PIDFILE) $(WS_WATCHED_FILE) 50 | 51 | %.html: %.md Makefile 52 | pandoc -t revealjs -s $< -o $@ \ 53 | --section-divs \ 54 | -M revealjs-url=$(DEPS_DIR)/reveal.js/reveal.js-$(REVEALJS_VERSION) 55 | 56 | .PHONY: pdf 57 | pdf: $(PDF) ## Build a PDF 58 | 59 | HOST_INSIDE_DOCKER=host.docker.internal 60 | FONTS=$(HOME)/Library/Fonts 61 | PDF_SERVER_PIDFILE=.miniserve.pdf.pid 62 | 63 | $(PDF_SERVER_PIDFILE): 64 | miniserve -p 20871 . & echo $$! > .miniserve.pdf.pid 65 | 66 | DECKTAPE_CMD = docker run --platform=linux/amd64 --rm -t --net=host \ 67 | -v "$(shell pwd):/slides" \ 68 | -v "$(FONTS):/home/node/.local/share/fonts" \ 69 | astefanutti/decktape 70 | 71 | DECKTAPE_CMD = npm exec -- decktape 72 | DECKTAPE_HOST = 127.0.0.1 73 | 74 | %.pdf: $(PRESENTATION_HTML) $(PDF_SERVER_PIDFILE) 75 | $(DECKTAPE_CMD) --size 1920x1080 http://$(DECKTAPE_HOST):20871/$(@:.pdf=.html) $@ 76 | -------------------------------------------------------------------------------- /_drafts_and_notes/homebrew_on_linux/Procfile: -------------------------------------------------------------------------------- 1 | serve: miniserve . 2 | ws: make livereload-ws 3 | watch: make automatic-regen 4 | -------------------------------------------------------------------------------- /_drafts_and_notes/homebrew_on_linux/README.md: -------------------------------------------------------------------------------- 1 | # Yes, Homebrew runs on Linux 2 | 3 | This is not an official Homebrew presentation. 4 | 5 | 6 | -------------------------------------------------------------------------------- /_drafts_and_notes/homebrew_on_linux/custom.css: -------------------------------------------------------------------------------- 1 | section.nocaptions figure figcaption { 2 | display:none; 3 | } 4 | 5 | .image-borders img { 6 | border: 0.05em solid #ccc; 7 | border-radius: 0.5em; 8 | padding: 0.4em; 9 | background-color: white; 10 | } 11 | 12 | :root { 13 | /** from brew.sh **/ 14 | --hb-color_peach_orange_approx: #f9d094; 15 | --hb-color_rangitoto_approx: #2e2a24; 16 | --hb-font_all: "-apple-system", "BlinkMacSystemFont", "Helvetica Neue", "Roboto", sans-serif; 17 | --hb-font_code: "Monaco", "Menlo", monospace; 18 | 19 | 20 | --r-background-color: var(--hb-color_rangitoto_approx); 21 | --r-main-color: var(--hb-color_peach_orange_approx); 22 | --r-heading-color: var(--hb-color_peach_orange_approx); 23 | --r-heading-font: var(--hb-font_all); 24 | --r-main-font: var(--hb-font_all); 25 | --r-code-font: var(--hb-font_code); 26 | } 27 | 28 | @counter-style nope { 29 | system: cyclic; 30 | symbols: "\274C"; /* red X */ 31 | suffix: " "; 32 | } 33 | 34 | @counter-style hourglass { 35 | system: cyclic; 36 | symbols: "\23F3"; /* hourglass with flowing sand */ 37 | suffix: " "; 38 | } 39 | 40 | .list-nope li { 41 | list-style-type: nope; 42 | } 43 | 44 | .list-wip li { 45 | list-style-type: hourglass; 46 | } 47 | -------------------------------------------------------------------------------- /_drafts_and_notes/homebrew_on_linux/elementary.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_drafts_and_notes/homebrew_on_linux/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_drafts_and_notes/homebrew_on_linux/favicon.ico -------------------------------------------------------------------------------- /_drafts_and_notes/homebrew_on_linux/peru.yaml: -------------------------------------------------------------------------------- 1 | imports: 2 | revealjs: deps/reveal.js 3 | fontawesome: deps/font-awesome 4 | asciinema-player-css: deps/asciinema-player 5 | asciinema-player-js: deps/asciinema-player 6 | colindean-github-avatar: deps/colindean-github-avatar 7 | brewsh: deps/brew.sh 8 | chromebrew-logo: deps/chromebrew 9 | 10 | curl module revealjs: 11 | url: https://github.com/hakimel/reveal.js/archive/5.1.0.zip 12 | unpack: zip 13 | 14 | curl module fontawesome: 15 | url: https://github.com/FortAwesome/Font-Awesome/releases/download/6.0.0/fontawesome-free-6.0.0-web.zip 16 | unpack: zip 17 | 18 | curl module asciinema-player-css: 19 | url: https://github.com/asciinema/asciinema-player/releases/download/v2.6.1/asciinema-player.css 20 | 21 | curl module asciinema-player-js: 22 | url: https://github.com/asciinema/asciinema-player/releases/download/v2.6.1/asciinema-player.js 23 | 24 | curl module colindean-github-avatar: 25 | url: https://avatars.githubusercontent.com/u/197224?s=300 26 | filename: colindean-github-avatar.jpg 27 | 28 | git module brewsh: 29 | url: https://github.com/Homebrew/brew.sh.git 30 | pick: assets/img/*.svg 31 | 32 | curl module chromebrew-logo: 33 | url: https://raw.githubusercontent.com/chromebrew/chromebrew/refs/heads/master/images/brew.png 34 | filename: chromebrew-logo.png 35 | -------------------------------------------------------------------------------- /_drafts_and_notes/o11y_for_data_pipelines/notes.md: -------------------------------------------------------------------------------- 1 | # Observability and Monitoring for Data Pipelines 2 | 3 | * o11y programming practices 4 | * "What to measure" - or, where to put counters, gauges, loglines, etc. 5 | * Quick overview of these concepts and where to use them 6 | * Logging/counting exceptions 7 | * JVM: avoid exceptions as flow control altogether is the conventional wisdom 8 | * Python: [3.11 features zero-cost exceptions](https://bugs.python.org/issue40222); 9 | faster to use exceptions as flow control when if statement is false, 10 | per [this S.O. answer](https://stackoverflow.com/a/68408809/204052) 11 | * Scrape vs push 12 | 13 | ## Goals 14 | 15 | * Avoid tool-specific recommendations 16 | * Probably use Python code examples except some in Scala 17 | (e.g. [log4s](https://github.com/Log4s/log4s)) 18 | -------------------------------------------------------------------------------- /_drafts_and_notes/pandas_to_polars/.filters/embedded_graphviz.lua: -------------------------------------------------------------------------------- 1 | -- inspired from https://github.com/pandoc/lua-filters/blob/5686d96/diagram-generator/diagram-generator.lua 2 | 3 | local dotPath = os.getenv("DOT") or "dot" 4 | 5 | local filetype = "svg" 6 | local mimetype = "image/svg+xml" 7 | 8 | local function graphviz(code, filetype) 9 | return pandoc.pipe(dotPath, {"-T" .. filetype}, code) 10 | end 11 | 12 | function CodeBlock(block) 13 | local converters = { 14 | graphviz = graphviz, 15 | } 16 | 17 | local img_converter = converters[block.classes[1]] 18 | if not img_converter then 19 | return nil 20 | end 21 | 22 | local success, img = pcall(img_converter, block.text, filetype) 23 | 24 | if not success then 25 | io.stderr:write(tostring(img)) 26 | io.stderr:write('\n') 27 | error 'Image conversion failed. Aborting.' 28 | end 29 | 30 | return pandoc.RawBlock('html', img) 31 | end 32 | 33 | return { 34 | {CodeBlock = CodeBlock}, 35 | } 36 | 37 | -------------------------------------------------------------------------------- /_drafts_and_notes/pandas_to_polars/.gitignore: -------------------------------------------------------------------------------- 1 | .peru 2 | deps 3 | presentation.html 4 | presentation.pdf 5 | -------------------------------------------------------------------------------- /_drafts_and_notes/pandas_to_polars/Brewfile: -------------------------------------------------------------------------------- 1 | brew 'peru' 2 | brew 'entr' 3 | brew 'pandoc' 4 | brew 'make' 5 | brew 'miniserve' 6 | brew 'hivemind' 7 | brew 'graphviz' 8 | brew 'npm' 9 | brew 'asciinema' 10 | -------------------------------------------------------------------------------- /_drafts_and_notes/pandas_to_polars/Makefile: -------------------------------------------------------------------------------- 1 | PRESENTATION = presentation 2 | MARKDOWN = $(PRESENTATION).md 3 | HTML = $(MARKDOWN:md=html) 4 | PDF = $(MARKDOWN:md=pdf) 5 | 6 | DEPS_DIR = deps 7 | 8 | REVEALJS_VERSION = $(shell basename -s .zip $(shell yaml2json peru.yaml | jq -r '.["curl module revealjs"].url')) 9 | 10 | ##@ Utility 11 | 12 | .PHONY: help 13 | help: ## Display this help 14 | @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z0-9_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) 15 | 16 | ##@ Setup 17 | 18 | .PHONY: deps 19 | deps: peru.yaml Brewfile ## Install dependencies 20 | brew bundle --verbose --no-lock 21 | peru sync 22 | 23 | ##@ Presenting 24 | 25 | all: $(HTML) $(PDF) ## Build all artifacts 26 | 27 | html: $(HTML) ## Make the presentation reveal.js HTML 28 | 29 | open-and-serve: $(HTML) ## Start a server and open the presentation in a browser 30 | open http://localhost:8080/$(HTML) 31 | miniserve . 32 | 33 | ##@ Development 34 | 35 | automatic-regen: ## Use entr to automatically remake the file 36 | echo $(MARKDOWN) | entr -acpr make $(HTML) 37 | 38 | watch: Procfile ## Use hivemind for constant building, run open first 39 | hivemind Procfile 40 | 41 | ##@ Cleanup 42 | 43 | clean: 44 | rm -f $(HTML) $(PDF) $(PDF_SERVER_PIDFILE) 45 | 46 | %.html: %.md Makefile 47 | pandoc -t revealjs -s $< -o $@ \ 48 | -L .filters/embedded_graphviz.lua \ 49 | -M revealjs-url=$(DEPS_DIR)/reveal.js/reveal.js-$(REVEALJS_VERSION) 50 | 51 | .PHONY: pdf 52 | pdf: $(PDF) ## Build a PDF 53 | 54 | HOST_INSIDE_DOCKER=host.docker.internal 55 | FONTS=$(HOME)/Library/Fonts 56 | PDF_SERVER_PIDFILE=.miniserve.pdf.pid 57 | 58 | $(PDF_SERVER_PIDFILE): 59 | miniserve -p 20871 . & echo $$! > .miniserve.pdf.pid 60 | 61 | $(PDF): $(HTML) $(PDF_SERVER_PIDFILE) 62 | docker run --platform=linux/amd64 --rm -t --net=host \ 63 | -v "$(shell pwd):/slides" \ 64 | -v "$(FONTS):/home/node/.local/share/fonts" \ 65 | astefanutti/decktape --size 1920x1080 http://$(HOST_INSIDE_DOCKER):20871/$(HTML) $@ 66 | 67 | kill `cat $(PDF_SERVER_PIDFILE)` && rm -rf $(PDF_SERVER_PIDFILE) 68 | -------------------------------------------------------------------------------- /_drafts_and_notes/pandas_to_polars/Procfile: -------------------------------------------------------------------------------- 1 | serve: miniserve . 2 | watch: echo presentation.md | entr -apr make presentation.html 3 | -------------------------------------------------------------------------------- /_drafts_and_notes/pandas_to_polars/peru.yaml: -------------------------------------------------------------------------------- 1 | imports: 2 | revealjs: deps/reveal.js 3 | fontawesome: deps/font-awesome 4 | asciinema-player-css: deps/asciinema-player 5 | asciinema-player-js: deps/asciinema-player 6 | 7 | curl module revealjs: 8 | url: https://github.com/hakimel/reveal.js/archive/4.3.0.zip 9 | unpack: zip 10 | 11 | curl module fontawesome: 12 | url: https://github.com/FortAwesome/Font-Awesome/releases/download/6.0.0/fontawesome-free-6.0.0-web.zip 13 | unpack: zip 14 | 15 | curl module asciinema-player-css: 16 | url: https://github.com/asciinema/asciinema-player/releases/download/v2.6.1/asciinema-player.css 17 | 18 | curl module asciinema-player-js: 19 | url: https://github.com/asciinema/asciinema-player/releases/download/v2.6.1/asciinema-player.js 20 | -------------------------------------------------------------------------------- /_drafts_and_notes/pandas_to_polars/submissions.md: -------------------------------------------------------------------------------- 1 | # `Pandas to Polars` Submissions 2 | 3 | ## Codemash 2024 4 | 5 | ### Title 6 | 7 | Migrating from pandas to Polars, why and how 8 | 9 | ### Description 10 | 11 | During a major data analysis project for our small tech community-focused organization, we encountered some growing pains while using pandas. pandas is a Python library for manipulating data so common that it's the default tool used in industry and taught in data science programs in higher-ed programs worldwide. We heard about Polars, a new implementation of the DataFrame architecture popularized by Apache Spark and pandas. Polars, written in Rust but offering a first-class experience for Python, expedited our development and enabled us to write clearer, faster data manipulation and analysis code. This presentation will provide a high-level introduction to these two frameworks, discuss their strengths and weaknesses, and then ultimately demonstrate our proven patterns for migration to Polars from pandas followed by how we designed our Polars analysis pipeline. 12 | 13 | ### Tags 14 | 15 | Python 16 | Data Science 17 | System Design 18 | -------------------------------------------------------------------------------- /_drafts_and_notes/personal_storage_threats/notes.md: -------------------------------------------------------------------------------- 1 | # Personal Storage Threat Modeling 2 | 3 | Understanding where your data rests, in what state, and how it is secured. 4 | 5 | * Walk through 6 | * Storage devices 7 | * Encryption key storage, if any 8 | * Purchase date 9 | * Warranty expiration date 10 | * Physical location 11 | * Online? 12 | * Internet connected? 13 | * Protocol for accession? 14 | * Credentials for accession? 15 | * Third-party services 16 | * Credentials required 17 | * Cost for backup and retrieval 18 | * Backup source and destination pairs 19 | * Create [DAG](https://en.wikipedia.org/wiki/Directed_acyclic_graph) for credential retrieval 20 | * Create [deployment diagram](https://plantuml.com/deployment-diagram) for backups 21 | 22 | ```mermaid 23 | graph LR 24 | subgraph Internet 25 | Dropbox{Dropbox} 26 | S3{AWS S3} 27 | end 28 | 29 | subgraph "My Computer" 30 | Dbx(Dropbox) 31 | Comp(Full System Backup) 32 | end 33 | 34 | Dbx -- HTTPS+Dropbox --> Dropbox 35 | Comp -- S3+Duplicati --> S3 36 | 37 | ``` 38 | 39 | 40 | ## See Also 41 | 42 | * [I've locked myself out of my digital life](https://shkspr.mobi/blog/2022/06/ive-locked-myself-out-of-my-digital-life/) by Terence Eden, 2022-06-07. [🦞](https://lobste.rs/s/tqull2/i_ve_locked_myself_out_my_digital_life). 43 | > Last night, lightning struck our house and burned it down. I escaped wearing only my nightclothes. 44 | > In an instant, everything was vaporised. Laptop? Cinders. Phone? Ashes. Home server? A smouldering wreck. Yubikey? A charred chunk of gristle. 45 | > This presents something of a problem. 46 | > In order to recover my digital life, I need to be able to log in to things. This means I need to know my usernames (easy) and my passwords (hard). All my passwords are stored in a Password Manager. I can remember the password to that. But logging in to the manager also requires a 2FA code. Which is generated by my phone. 47 | > The phone which now looks like this: 📱🔥 48 | * Great comments in thread 49 | * [When Security Locks You Out of Everything](https://www.schneier.com/blog/archives/2022/06/__trashed-2.html), Schneier's callout to it. Great comments in thread. 50 | -------------------------------------------------------------------------------- /_drafts_and_notes/privcoms/.copier-answers.yml: -------------------------------------------------------------------------------- 1 | # Changes here will be overwritten by Copier on updates 2 | _src_path: _template 3 | include_bsky: true 4 | include_fediverse: true 5 | include_pittsburgh_slide: false 6 | license_cc_by_sa: true 7 | subtitle: '' 8 | talkname: Privacy, because you have nothing to share 9 | talkname_short: privcoms 10 | -------------------------------------------------------------------------------- /_drafts_and_notes/privcoms/.filters/embedded_graphviz.lua: -------------------------------------------------------------------------------- 1 | -- inspired from https://github.com/pandoc/lua-filters/blob/5686d96/diagram-generator/diagram-generator.lua 2 | 3 | local dotPath = os.getenv("DOT") or "dot" 4 | 5 | local filetype = "svg" 6 | local mimetype = "image/svg+xml" 7 | 8 | local function graphviz(code, filetype) 9 | return pandoc.pipe(dotPath, {"-T" .. filetype}, code) 10 | end 11 | 12 | function CodeBlock(block) 13 | local converters = { 14 | graphviz = graphviz, 15 | } 16 | 17 | local img_converter = converters[block.classes[1]] 18 | if not img_converter then 19 | return nil 20 | end 21 | 22 | local success, img = pcall(img_converter, block.text, filetype) 23 | 24 | if not success then 25 | io.stderr:write(tostring(img)) 26 | io.stderr:write('\n') 27 | error 'Image conversion failed. Aborting.' 28 | end 29 | 30 | return pandoc.RawBlock('html', img) 31 | end 32 | 33 | return { 34 | {CodeBlock = CodeBlock}, 35 | } 36 | 37 | -------------------------------------------------------------------------------- /_drafts_and_notes/privcoms/.gitignore: -------------------------------------------------------------------------------- 1 | .peru 2 | deps 3 | presentation.html 4 | presentation.pdf 5 | *.ws 6 | -------------------------------------------------------------------------------- /_drafts_and_notes/privcoms/Brewfile: -------------------------------------------------------------------------------- 1 | brew 'peru' 2 | brew 'entr' 3 | brew 'pandoc' 4 | brew 'make' 5 | brew 'miniserve' 6 | brew 'hivemind' 7 | brew 'graphviz' 8 | brew 'npm' 9 | brew 'asciinema' 10 | brew 'websocat' 11 | -------------------------------------------------------------------------------- /_drafts_and_notes/privcoms/Makefile: -------------------------------------------------------------------------------- 1 | PRESENTATION = presentation 2 | MARKDOWN = $(PRESENTATION).md 3 | HTML = $(MARKDOWN:md=html) 4 | PDF = $(MARKDOWN:md=pdf) 5 | 6 | DEPS_DIR = deps 7 | 8 | REVEALJS_VERSION = $(shell basename -s .zip $(shell yq '.["curl module revealjs"].url' peru.yaml)) 9 | 10 | WS_WATCHED_FILE = .$(HTML).ws 11 | 12 | ##@ Utility 13 | 14 | .PHONY: help 15 | help: ## Display this help 16 | @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z0-9_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) 17 | 18 | ##@ Setup 19 | 20 | .PHONY: deps 21 | deps: peru.yaml Brewfile ## Install dependencies 22 | brew bundle --verbose 23 | peru sync 24 | 25 | ##@ Presenting 26 | 27 | all: $(HTML) $(PDF) ## Build all artifacts 28 | 29 | html: $(HTML) ## Make the presentation reveal.js HTML 30 | 31 | open-and-serve: $(HTML) ## Start a server and open the presentation in a browser 32 | open http://localhost:8080/$(HTML) 33 | miniserve . 34 | 35 | ##@ Development 36 | 37 | automatic-regen: ## Use entr to automatically remake the file 38 | echo $(MARKDOWN) | entr -acpr $(SHELL) -c "make $(HTML) && echo reload >> $(WS_WATCHED_FILE)" 39 | 40 | watch: Procfile ## Use hivemind for constant building, run open first 41 | hivemind Procfile 42 | 43 | livereload-ws: ## Run a websocket server listening for reloads 44 | tail -f $(WS_WATCHED_FILE) | websocat -s 56789 45 | 46 | ##@ Cleanup 47 | 48 | clean: 49 | rm -f $(HTML) $(PDF) $(PDF_SERVER_PIDFILE) $(WS_WATCHED_FILE) 50 | 51 | %.html: %.md Makefile 52 | pandoc -t revealjs -s $< -o $@ \ 53 | --section-divs \ 54 | $(addprefix -L ,$(wildcard .filters/*)) \ 55 | -M revealjs-url=$(DEPS_DIR)/reveal.js/reveal.js-$(REVEALJS_VERSION) 56 | 57 | .PHONY: pdf 58 | pdf: $(PDF) ## Build a PDF 59 | 60 | HOST_INSIDE_DOCKER=host.docker.internal 61 | FONTS=$(HOME)/Library/Fonts 62 | PDF_SERVER_PIDFILE=.miniserve.pdf.pid 63 | 64 | $(PDF_SERVER_PIDFILE): 65 | miniserve -p 20871 . & echo $$! > .miniserve.pdf.pid 66 | 67 | DECKTAPE_CMD = docker run --platform=linux/amd64 --rm -t --net=host \ 68 | -v "$(shell pwd):/slides" \ 69 | -v "$(FONTS):/home/node/.local/share/fonts" \ 70 | astefanutti/decktape 71 | 72 | DECKTAPE_CMD = npm exec -- decktape 73 | DECKTAPE_HOST = 127.0.0.1 74 | 75 | %.pdf: $(PRESENTATION_HTML) $(PDF_SERVER_PIDFILE) 76 | $(DECKTAPE_CMD) --size 1920x1080 http://$(DECKTAPE_HOST):20871/$(@:.pdf=.html) $@ 77 | -------------------------------------------------------------------------------- /_drafts_and_notes/privcoms/Procfile: -------------------------------------------------------------------------------- 1 | serve: miniserve . 2 | ws: make livereload-ws 3 | watch: make automatic-regen 4 | -------------------------------------------------------------------------------- /_drafts_and_notes/privcoms/custom.css: -------------------------------------------------------------------------------- 1 | .nocaptions figcaption { 2 | display:none; 3 | } 4 | 5 | .image-borders img { 6 | border: 0.05em solid #ccc; 7 | border-radius: 0.5em; 8 | padding: 0.4em; 9 | background-color: white; 10 | } 11 | -------------------------------------------------------------------------------- /_drafts_and_notes/privcoms/notes.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Privacy, because you have nothing to share 3 | audience: undergrad college students 4 | 5 | --- 6 | 7 | 8 | # Private communications 9 | 10 | ![Anon poster](https://m.media-amazon.com/images/M/MV5BMjE0MjIwMDE2MV5BMl5BanBnXkFtZTgwMzM5MDQzNTM@.jpg) 11 | 12 | > The Girl: You invade my privacy, it's nothing. I try to get it back, it's a crime. 13 | > 14 | > The Girl: It's not that I have something to hide. I have nothing I want you to see. 15 | 16 | ## If nothing else, remember these 17 | 18 | * Decide on your **threat model** 19 | * Think about how your contacts are stored and discoverable 20 | * Think about weak points: other people; use forward secrecy 21 | 22 | TL;DR In 2025, use Signal. 23 | 24 | ## "Nothing to hide? Nothing to fear" 25 | 26 | > … a logical fallacy which states that individuals have no reason to fear or oppose surveillance programs 27 | > unless they are afraid it will uncover their own illicit activities. 28 | > An individual using this argument may claim that an average person 29 | > should not worry about government surveillance, as they would have "nothing to hide". 30 | 31 | 32 | 33 | ## Tinfoil hats 34 | 35 | ![Tinfoil hat joke](tinfoilhat.png) 36 | 37 | [Nick Trawick, comedian](https://m.facebook.com/story.php?story_fbid=24882926974636672&id=100000381397282) 38 | 39 | ## Forward secrecy 40 | 41 | It really means _backward_, previous comms, are secure from future communication errors, and vice versa. 42 | 43 | Key expiration is important. 44 | 45 | Some threat actors are able to store encrypted messages for decryption when the technology exists. 46 | 47 | ## Threats from third parties and (AI) assistant technology 48 | 49 | ### The Lethal Trifecta 50 | 51 | ![](https://static.simonwillison.net/static/2025/lethaltrifecta.jpg) 52 | 53 | * Access to your private data 54 | * Exposure to untrusted content 55 | * The ability to externally communicate (exfiltration) 56 | 57 | Source: 58 | 59 | ### Sharing may not be caring 60 | 61 | > So there’s a profound issue with security and privacy that is haunting this hype around agents, 62 | > and that is ultimately threatening to break the blood-brain barrier 63 | > between the application layer and the OS layer 64 | > by conjoining all of these separate services [and] muddying their data 65 | > 66 | > – Signal President Meredith Whittaker 67 | 68 | 69 | 70 | Source: 71 | 72 | ## Legal Threats from Nation-State Actors 73 | 74 | EU "Chat control": 75 | 76 | ## TODO 77 | 78 | * Don't use encrypted email, it's become an anti-pattern. 79 | https://securitycryptographywhatever.com/2025/08/22/stop-using-encrypted-email-with-william-woodruff/ 80 | 81 | * _Through the Web, Darkly_ by William von Hagen 82 | 83 | 84 | * history of Signal Foundation; 85 | verify and cite https://www.instagram.com/share/p/BAJulTQvrH 86 | -------------------------------------------------------------------------------- /_drafts_and_notes/privcoms/ondura_chatcontrol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_drafts_and_notes/privcoms/ondura_chatcontrol.png -------------------------------------------------------------------------------- /_drafts_and_notes/privcoms/peru.yaml: -------------------------------------------------------------------------------- 1 | imports: 2 | revealjs: deps/reveal.js 3 | fontawesome: deps/font-awesome 4 | asciinema-player-css: deps/asciinema-player 5 | asciinema-player-js: deps/asciinema-player 6 | colindean-tophat: deps/colindean-tophat.jpg 7 | cc_by_sa: deps/cc_by_sa 8 | 9 | curl module revealjs: 10 | url: https://github.com/hakimel/reveal.js/archive/5.2.1.zip 11 | unpack: zip 12 | 13 | curl module fontawesome: 14 | url: https://github.com/FortAwesome/Font-Awesome/releases/download/6.0.0/fontawesome-free-6.0.0-web.zip 15 | unpack: zip 16 | 17 | curl module asciinema-player-css: 18 | url: https://github.com/asciinema/asciinema-player/releases/download/v3.10.0/asciinema-player.css 19 | 20 | curl module asciinema-player-js: 21 | url: https://github.com/asciinema/asciinema-player/releases/download/v3.10.0/asciinema-player.min.js 22 | 23 | curl module colindean-tophat: 24 | url: https://avatars.githubusercontent.com/u/197224?s=300 25 | 26 | curl module cc_by_sa: 27 | url: https://upload.wikimedia.org/wikipedia/commons/e/e5/CC_BY-SA_icon.svg 28 | -------------------------------------------------------------------------------- /_drafts_and_notes/privcoms/tinfoilhat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_drafts_and_notes/privcoms/tinfoilhat.png -------------------------------------------------------------------------------- /_drafts_and_notes/scala_for_java_detox/notes.md: -------------------------------------------------------------------------------- 1 | # Scala conversion therapy: Mixing Scala and Java and eventually going full Scala 2 | 3 | * Bloch-style builders for using Scala named parameters 4 | * Identifying models: extract models into case classes, wrap with functionality 5 | * Know interop patterns that will fail (implicits, AnyVal extended classes) 6 | 7 | ## General process notes influenced heavily by [Carol (Nichols||Goulding)](https://github.com/carols10cents)'s Pgh Techfest talk 8 | 9 | * Identify _good_ reasons and _bad_ reasons to move to Scala from Java 10 | * Good: 11 | 1. Performance 12 | 2. Specificity 13 | 3. Lower maintenance cost associated with less code and thus less room for human error 14 | 4. Rewriting or refactoring almost always _improves_ code 15 | * Bad: 16 | 1. Boredom 17 | 2. Job security 18 | 3. If you need to maintain 100% full compatibility with Java and don't want to compromise a little strictness in order to make backwards compatibility happen. 19 | * Improve tests of Java system in order to understand current behavior and catch regressions. 20 | * Make incremental changes, one object or package at a time. 21 | * Find isolated subsystems in a UML diagram, for example. 22 | * Private methods are great for refactoring first 23 | * Use IntelliJ's "Convert to Scala" functionality, it does a pretty decent job of typing for you to save versus syntax problems. 24 | * Use code inspection to make suggested improvements to align with Scala style 25 | * Run tests constantly. Use sbt ~testQuick, guard, or whatever your build system provides. 26 | * Observe benefits of Scala 27 | 28 | # Links 29 | 30 | * [The 10 Most Annoying Things Coming Back to Java After Some Days of Scala](https://blog.jooq.org/2014/08/01/the-10-most-annoying-things-coming-back-to-java-after-some-days-of-scala/) 31 | * [Sharing Our Experience With Scala at Smaato](http://blog.smaato.com/sharing-experience-scala-programming-language) 32 | * [Variance in Java and Scala](https://medium.com/@sinisalouc/variance-in-java-and-scala-63af925d21dc#.nee13u5af) 33 | * http://manuel.bernhardt.io/2015/11/13/5-years-of-scala-and-counting-debunking-some-myths-about-the-language-and-its-environment/ 34 | * https://m50d.github.io/2015/11/16/my-five-years.html 35 | * [Carol (Nichols||Goulding)](https://github.com/carols10cents)'s talk [Rust out your C](https://github.com/PghTechFest/PghTechFest2016/blob/master/rust-out-your-c-carol-nichols-or-goulding.pdf) from [Pgh Techfest 2016](https://github.com/PghTechFest/PghTechFest2016) 36 | * [Uniting Church and State: FP and OO Together](http://underscore.io/blog/posts/2017/06/02/uniting-church-and-state.html) - A fantastic look at moving between FP and OO using Church encoding, then building on that knowledge to understand monads much more clearly than most other explanations 37 | -------------------------------------------------------------------------------- /_drafts_and_notes/seductive_tech/notes.md: -------------------------------------------------------------------------------- 1 | ## Good tweets 2 | 3 | [@krisajenkins](https://twitter.com/krisajenkins/status/748406229291118593): 4 | 5 | > Don’t get too attached to any one programming language. Find ones you love and love ‘em, but remember they exist to serve, not define you. 6 | 7 | ## Good posts: 8 | 9 | [Adrian Kosmaczewsk's Being a developer after 40](https://medium.freecodecamp.com/being-a-developer-after-40-3c5dd112210c): 10 | 11 | > The first advice I can give you all is, do not pay attention to hype. Every year there is a new programming language, framework, library, pattern, component architecture or paradigm that takes the blogosphere by storm. People get crazy about it. Conferences are given. Books are written. Gartner hype cycles rise and fall. Consultants charge insane amounts of money to teach, deploy or otherwise fuckup the lives of people in this industry. The press will support these horrors and will make you feel guilty if you do not pay attention to them. 12 | 13 | > Every new architecture is just a reimagination and a readaptation of an idea that was floating around for decades. 14 | 15 | His sentiment on LLVM is pretty right on. My extrapolation: Rust and Swift and whatever aren't the new C. LLVM is the new C. 16 | 17 | > Refactoring, unit tests, code reviews, pull requests, all of these tools are at your disposal to **make sure that the code you ship is the simplest possible architecture that works. This is how you build resilient systems for the long term.** 18 | 19 | -------------------------------------------------------------------------------- /_drafts_and_notes/tips_for_talking_about_blockchain/notes.md: -------------------------------------------------------------------------------- 1 | # How to spread blockchain knowledge: tips for talking 2 | 3 | Actionable examples, succinct analogies, and 5 minute hands-on exercises for forward-thinking folks of all ages 4 | 5 | ## List 6 | 7 | * Mining: Bingo 8 | * Transacting: Photocopied tablet sheet 9 | * Mempool overrun: Holding oranges 10 | -------------------------------------------------------------------------------- /_drafts_and_notes/tries/notes.md: -------------------------------------------------------------------------------- 1 | # From ratting moles to spellchecking with Tries 2 | 3 | ## Moles? Information leaks 4 | 5 | give half of group one disclosure, half another. 6 | only narrows to 50%. 7 | 8 | at random, half again, tracking who got what. 9 | now 25%. 10 | 11 | keep going and you've got a bit set per person in the group 12 | 13 | that's effectively a trie 14 | 15 | ## spellchecking 16 | 17 | dictionary search! auto complete! 18 | -------------------------------------------------------------------------------- /_drafts_and_notes/walls/bourdain_walls.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_drafts_and_notes/walls/bourdain_walls.jpg -------------------------------------------------------------------------------- /_drafts_and_notes/walls/chadwickboseman-tchalla-bridges-walls.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_drafts_and_notes/walls/chadwickboseman-tchalla-bridges-walls.jpg -------------------------------------------------------------------------------- /_lightning/_drafts_and_notes/README.md: -------------------------------------------------------------------------------- 1 | # Draft lightning talks 2 | 3 | Like the upper level, I keep spitball lightning talks here. 4 | -------------------------------------------------------------------------------- /_lightning/_drafts_and_notes/continuous_onboarding/README.md: -------------------------------------------------------------------------------- 1 | # Continuous Onboarding 2 | 3 | I had this idea in 2014 at IBM Watson during a time when we were hiring often. 4 | We found problems with our onboarding process every time someone started, 5 | which was approximately monthly for some teams and quarterly for others. 6 | People also switched teams with some frequency, generally permanently but sometimes temporarily _on loan_. 7 | 8 | Note that I've never had management sufficiently interested in the benefits that this proposal offers to endure its 9 | **very glaringly obvious risks** 10 | including the work necessary to develop the software to manage the experience to prevent it from being 11 | _catastrophic_ 12 | instead of an exercise in emergency preparedness and radical inclusiveness. 13 | 14 | Take the advice with tremendous caution. 15 | Consider the quality attributes of this proposal before ever considering it seriously. 16 | 17 | …And if you ever do, come find me. 18 | You're my kind of crazy. 19 | 20 | ## See Also 21 | 22 | ### Writings 23 | 24 | * [Erase your darlings](https://grahamc.com/blog/erase-your-darlings/) by Graham Christensen, 2020. 25 | * [Three Years of Ephemeral NixOS: My Experience Resetting Root on Every Boot](https://b.tuxes.uk/three-years-of-ephemeral-nixos.html), 2025. 26 | 27 | ### Projects 28 | 29 | * [Impermanence](https://github.com/nix-community/impermanence), Nix Community, ongoing. 30 | * [GUIX: Allow mounting root on tmpfs for impersistence](https://issues.guix.gnu.org/65335) 31 | -------------------------------------------------------------------------------- /_lightning/_drafts_and_notes/continuous_onboarding/computer_reach.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_lightning/_drafts_and_notes/continuous_onboarding/computer_reach.webp -------------------------------------------------------------------------------- /_lightning/_drafts_and_notes/meet_other_people/notes.md: -------------------------------------------------------------------------------- 1 | # Make friends outside of your work 2 | 3 | --- 4 | 5 | ( Coworkers [ <3 ) Friends ] 6 | 7 | * Coworkers are great 8 | * So are Friends 9 | 10 | --- 11 | 12 | # One of us 13 | 14 | It feels great to belong... 15 | 16 | ...especially when you didn't feel that previously. 17 | 18 | --- 19 | 20 | # Good culture 21 | 22 | Being friends at work and outside of it with coworkers is important. 23 | 24 | --- 25 | 26 | # Bad culture 27 | 28 | Hating your coworkers means you should probably leave. 29 | 30 | --- 31 | 32 | # WTSHTF 🌬 💩 33 | 34 | What happens when your coworkers are no longer your coworkers? 35 | 36 | What happens when it wasn't a voluntary separation? 37 | 38 | --- 39 | 40 | # Awkward :turtle: 41 | 42 | ---- 43 | 44 | # New ideas 45 | 46 | You can be friends with people at other companies. 47 | 48 | You can continue to hang out with your old coworkers regularly without breaking NDAs. 49 | 50 | --- 51 | 52 | # Monoculture 53 | 54 | Isolation leads to monoculture. 55 | 56 | Consuming social media and blogs and books are insufficient 57 | 58 | --- 59 | 60 | # Balance 61 | 62 | What your balance? 63 | 64 | --- 65 | 66 | # Thank you 67 | -------------------------------------------------------------------------------- /_lightning/_drafts_and_notes/mispronunciations/notes.md: -------------------------------------------------------------------------------- 1 | # Mispronunciation Notes 2 | 3 | > [I wanted to do a whole talk, probably a lightning talk but maybe a whole full length talk, in which I mispronounce as many technologies as possible and then render a lesson about why people shouldn't freak out about people's mispronunciations](https://twitter.com/colindean/status/1166122212367245312) - Colin Dean 4 | 5 | [![Relevant XKCD](https://imgs.xkcd.com/comics/mispronouncing.png)](https://xkcd.com/148/) 6 | 7 | > [an apocryphal quote I like: "never make fun of someone who mispronounces a word — it means they learned it by reading"](https://twitter.com/jxxf/status/1536408689384599557) - John Feminella 8 | 9 | ## Common Mispronounced Words 10 | 11 | * Kubernetes: Cube bear nets, Koo ber nets, Que bear net ees 12 | * Scala: Scal ah 13 | * Java: Dza vah 14 | * nginx: en-jinx, ng-inks (Vietnamese `ng`) 15 | * Linux: Lynn-icks, Line-uhcks, Lee-nooks 16 | * Python: Py-THON (US), PY-thin (UK and the canonical naming reference of Monty Python, which used the latter) 17 | * LaTeX: 18 | > _[Quanta](https://www.quantamagazine.org/computing-expert-says-programmers-need-more-math-20220517/)_: One last thing, about another side project of yours with a sizable impact: LaTeX. I’d like to finally clear something up with the creator. Is it pronounced LAH-tekh or LAY-tekh? 19 | > 20 | > _Leslie Lamport_: Any way you want. I don’t advise spending very much time thinking about it. 21 | 22 | ## Missteps 23 | 24 | > nginx is pronounced engine-x. engine-x is a cool name. n-jinx is not. if i ever hear you pronounce it n-jinx, i will lose respect for you forever 25 | 26 | `@kathyra_` - [1:33 AM · Nov 12, 2019](https://twitter.com/kathyra_/status/1194141061108490240) 27 | 28 | …but the thread is gold. 29 | 30 | ## Additional Research by Others 31 | 32 | * [From iOS to SQL: The world’s most incorrectly pronounced tech terms](https://arstechnica.com/gadgets/2020/05/eye-oss-vs-eye-oh-ess-judging-the-fiercest-tech-pronunciation-debates/) 33 | * Long reply threads from [Bryan Cantrill](https://twitter.com/bcantrill/status/1536394205622243328)'s tweet about learning a word wrong 34 | 35 | ## Outcome 36 | 37 | Do they know what you mean, without ambiguity? 38 | 39 | Yes? Great. 40 | 41 | No? Shift pronunciation. 42 | -------------------------------------------------------------------------------- /_lightning/_reviews/README.md: -------------------------------------------------------------------------------- 1 | # Conference Review talks 2 | 3 | I tend to keep notes taken during conferences in the form of slides. 4 | I keep these here. 5 | It enables me to easily summarize knowledge for my team(s) when I return from the conference. 6 | 7 | See also [_retired/_reviews](../../_retired/_reviews). 8 | -------------------------------------------------------------------------------- /_lightning/elsewhere.md: -------------------------------------------------------------------------------- 1 | Talks stored elsewhere 2 | ====================== 3 | 4 | Sometimes, I use Google Presentations or something else that doesn't 5 | really export well to do a presentation. I link those here. 6 | 7 | * [Wireless Mesh Networking](https://docs.google.com/presentation/d/1ibHFBNilVa3ziuTmI4781NAUOHJMbWHqDb3KE3vCyHI/edit?usp=sharing) - given 2014-09-27 at the [Pittsburgh Code & Supply](http://codeandsupply.co) [Speaking at Tech Events for Beginners Workshop](http://www.meetup.com/Pittsburgh-Code-Supply/events/196633542/) 8 | -------------------------------------------------------------------------------- /_lightning/enums/notes.md: -------------------------------------------------------------------------------- 1 | ## Enums notes 2 | 3 | Back in the day, we used sigils: variables set to a constant, usually an small integer and named under a convention that made sense in context. Different sets of sigils reused the same integers, which was safe as long as the sigils' context and naming never collided. 4 | 5 | ```C 6 | int red = 1; 7 | int blue = 2; 8 | 9 | void change_color(ColorInt color) { 10 | … 11 | } 12 | 13 | change_color(red); 14 | change_color(blue); 15 | 16 | int port = 8080; 17 | int secret_code = 0x3425deadb33f; 18 | 19 | change_color(port); // VALID! 20 | change_color(secret_code); // VALID! 21 | ``` 22 | 23 | OOP could handle a type-checked way of establishing a hierarchy through inheritance. 24 | 25 | ```python 26 | class ColorInt: 27 | def as_int() -> int: 28 | 29 | class Red(ColorInt): 30 | def init(): 31 | self.int = 2 32 | … 33 | class Blue(ColorInt): 34 | def init(): 35 | self.int = 2 36 | 37 | def change_color(color: ColorInt): 38 | hex = lookup_hex_code(color) 39 | change_button_color(hex) 40 | ``` 41 | 42 | What we really want is an easy way of saying: 43 | 44 | > Give me a set of symbols the value of which doesn't matter but that I can limit usage to any of the set of symbols. 45 | 46 | This establishes a type-check with known bounds but the programmer doesn't really have to care about the underlying type used at runtime, if any at all. 47 | 48 | Some langauges built in enums it in from the get-go. 49 | 50 | ```java 51 | enum Color { 52 | Red; 53 | Blue; 54 | } 55 | int portNum = 8080; 56 | 57 | function changeColor(Color color){…} 58 | 59 | changeColor(Color.RED); // YEP 60 | changeColor(portNum); // NOPE 61 | ``` 62 | 63 | In Python, enums are provided by the `enum` library. 64 | 65 | ```python 66 | 67 | from enum import Enum 68 | class Color(Enum): 69 | RED = 0xff0000 # manually assign a value 70 | BLUE = 0x00ff00 71 | 72 | class ModelMode(Enum): 73 | MULTI_LABEL = auto() # automatically assign a value 74 | MULTI_CLASS = auto() 75 | 76 | def switch_mode(mode: str) -> None: 77 | pass 78 | 79 | switch_mode("multi_label") 80 | switch_mode("multi_lbl") 81 | 82 | switch_mode(ModelMode.MULTI_LABEL) 83 | ``` 84 | 85 | Handling enums in Python used to be tedious, but with structural pattern matching added in Python 3.10, it's a cinch: 86 | 87 | ```python 88 | def switch_mode(mode: ModelMode): 89 | # Python 3.9- 90 | if mode is ModelMode.MULTI_LABEL: 91 | … 92 | elsif mode is ModelMode.MULTI_CLASS: 93 | … 94 | 95 | # Python 3.10+ 96 | 97 | match mode: 98 | case [ModelMode.MULTI_LABEL]: 99 | … 100 | case [ModelMode.MULTI_CLASS]: 101 | … 102 | case _: 103 | raise "Oh noes" 104 | ``` 105 | 106 | Some languages discourage enums, like Scala 2, which prefers case objects and case classes. 107 | 108 | ```scala 109 | trait Color 110 | case object Red extends Color 111 | case object Blue extends Color 112 | ``` 113 | 114 | But [Scala 3 added them](https://docs.scala-lang.org/scala3/reference/enums/enums.html): 115 | 116 | ```scala 117 | enum Color: 118 | case Red, Green, Blue 119 | 120 | enum Color(val rgb: Int): 121 | case Red extends Color(0xFF0000) 122 | case Green extends Color(0x00FF00) 123 | case Blue extends Color(0x0000FF) 124 | ``` 125 | 126 | 127 | ## Key takeaway 128 | 129 | **Make illegal states unrepresentable** 130 | 131 | **Make illegal arguments unpassable** 132 | 133 | and define the bounds of your known expectations at runtime. 134 | -------------------------------------------------------------------------------- /_lightning/job_descriptions/Job Descriptions.key: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6401835965475de66199f8494ed15a076e6e8c7c39f65c2916a0780e73a76aa7 3 | size 9877294 4 | -------------------------------------------------------------------------------- /_lightning/job_descriptions/readme.md: -------------------------------------------------------------------------------- 1 | # Capability-based Job Descriptions 2 | 3 | [Capability-based Job Descriptions: Unicorn vs Unicron (2018 version)](https://speakerdeck.com/colindean/capability-based-job-descriptions-unicorn-vs-unicron-2018) 4 | -------------------------------------------------------------------------------- /_lightning/job_hunt_organization/README.md: -------------------------------------------------------------------------------- 1 | # Job Hunt Organization Tooling 2 | 3 | Premise: Simple methodology for organizing applications during an active job hunt 4 | 5 | Audience: Everyone, but especially recent graduates of bootcamp, undergraduate, and graduate programs who did not already accept an offer via an internship, apprenticeship, etc. 6 | 7 | ## Application Progression Diagram 8 | 9 | ```mermaid 10 | stateDiagram-v2 11 | direction TB 12 | 13 | accTitle: Job Application Status Workflow 14 | accDescr: Use this to track how applications resolve. 15 | 16 | classDef gettingSerious fill:teal,color:white,font-weight:bold,stroke-width:2px,stroke:seagreen 17 | classDef endedBadly fill:darkred,color:white,font-weight:bold,stroke-width:2px,stroke:firebrick 18 | classDef endedMeh fill:darkgoldenrod,color:white,font-weight:bold,stroke-width:2px,stroke:yellow 19 | classDef endedGreat fill:green,color:white,font-weight:bold,stroke-width:2px,stroke:lightgreen 20 | 21 | [*] --> WantToApply 22 | WantToApply --> AwaitingResponse : applied 23 | AwaitingResponse --> TimedOut : never responded 24 | AwaitingResponse --> Rejected : responded, not interested 25 | AwaitingResponse --> TalkingTo : responded, interested 26 | TalkingTo --> InterviewScheduled : anything scheduled 27 | InterviewScheduled --> TalkingTo : interview done 28 | TalkingTo --> Rejected : rejected after interview 29 | InterviewScheduled --> AwaitingOffer : interview, no further interviews expected 30 | AwaitingOffer --> Rejected : positive interview, but nope 31 | AwaitingOffer --> Ghosted : how rude 32 | AwaitingOffer --> Offered : getting serious 33 | Offered --> Negotating : ALWAYS NEGOTIATE 34 | Negotating --> TurnedDown : nope 35 | Negotating --> Accepted : job! 36 | 37 | Accepted --> [*] 38 | TurnedDown --> [*] 39 | Ghosted --> [*] 40 | TimedOut --> [*] 41 | Rejected --> [*] 42 | 43 | class Ghosted, Rejected endedBadly 44 | class TurnedDown, TimedOut endedMeh 45 | class Accepted endedGreat 46 | 47 | class AwaitingOffer, Offered, Negotating gettingSerious 48 | ``` 49 | -------------------------------------------------------------------------------- /_lightning/json_cli/notes.md: -------------------------------------------------------------------------------- 1 | # JSON at the Command Line 2 | 3 | ## [jq](https://stedolan.github.io/jq) 4 | 5 | All-in-one JSON querying and restructuring tool. Takes JSON, spits out JSON or raw strings based on its own, complex query language. 6 | 7 | ``` 8 | $ echo '[{"id": "first", "val": 1}, {"id": "second", "val": 2}]' | jq '.[] | select(.id == "second")' 9 | {"id": "second", "val": 2} 10 | ``` 11 | 12 | **jq** is available in the default image on a few cloud-based continuous integration systems. It's commonly installed on macOS and Linux developer systems, too. 13 | 14 | ## [jo](https://github.com/jpmens/jo) 15 | 16 | Creates JSON from simple command line key=value pairs and correctly builds objects for nested invocations. 17 | 18 | ``` 19 | $ jo -p name=jo n=17 parser=false 20 | { 21 | "name": "jo", 22 | "n": 17, 23 | "parser": false 24 | } 25 | ``` 26 | 27 | Easily create arrays: 28 | 29 | ``` 30 | $ seq 1 10 | jo -a 31 | [1,2,3,4,5,6,7,8,9,10] 32 | ``` 33 | 34 | Call it more than once to create objects: 35 | 36 | ``` 37 | $ jo -p name=JP object=$(jo fruit=Orange hungry@0 point=$(jo x=10 y=20 list=$(jo -a 1 2 3 4 5)) number=17) sunday@0 38 | { 39 | "name": "JP", 40 | "object": { 41 | "fruit": "Orange", 42 | "hungry": false, 43 | "point": { 44 | "x": 10, 45 | "y": 20, 46 | "list": [ 47 | 1, 48 | 2, 49 | 3, 50 | 4, 51 | 5 52 | ] 53 | }, 54 | "number": 17 55 | }, 56 | "sunday": false 57 | } 58 | ``` 59 | 60 | ## [Gron](https://github.com/tomnomnom/gron) 61 | 62 | Flattens JSON to dot notation so it can be used with tools that can operate on key=value pairs, or just text. It converts this structure back to JSON afterward as a pipe operation, too. 63 | 64 | ``` 65 | $ gron "https://api.github.com/repos/tomnomnom/gron/commits?per_page=1" | fgrep "commit.author" 66 | json[0].commit.author = {}; 67 | json[0].commit.author.date = "2016-07-02T10:51:21Z"; 68 | json[0].commit.author.email = "mail@tomnomnom.com"; 69 | json[0].commit.author.name = "Tom Hudson"; 70 | ``` 71 | 72 | ``` 73 | $ gron "https://api.github.com/repos/tomnomnom/gron/commits?per_page=1" | fgrep "commit.author" | gron --ungron 74 | [ 75 | { 76 | "commit": { 77 | "author": { 78 | "date": "2016-07-02T10:51:21Z", 79 | "email": "mail@tomnomnom.com", 80 | "name": "Tom Hudson" 81 | } 82 | } 83 | } 84 | ] 85 | ``` 86 | 87 | ## [jl](https://github.com/chrisdone/jl) 88 | 89 | Queries like jq but with a simplier syntax with less wild capabilities 90 | 91 | ## [fx](https://github.com/antonmedv/fx) 92 | 93 | Uses the same query language as jl but in the Javascript ecosystem instead of Haskell 94 | 95 | ## Converters 96 | 97 | ### Ruby 98 | 99 | Inside of a Makefile: 100 | 101 | ```make 102 | %.json: %.yaml 103 | ruby -e 'require "yaml"; require "json"; puts JSON.pretty_generate(YAML.parse(STDIN.read).to_ruby)' < $< > $@ 104 | ``` 105 | 106 | ### [eat](https://github.com/antonmedv/eat) 107 | 108 | Converts a variety of other formats into JSON 109 | -------------------------------------------------------------------------------- /_lightning/mosh/Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem 'rabbit', '>= 4.0.0' 4 | #gem 'rabbiter' 5 | -------------------------------------------------------------------------------- /_lightning/mosh/README.md: -------------------------------------------------------------------------------- 1 | Mosh lightning talk 2 | ====================== 3 | 4 | Running 5 | ------- 6 | 7 | gem install rabbit rabbiter 8 | ./start.sh 9 | 10 | Other media 11 | ----------- 12 | 13 | -------------------------------------------------------------------------------- /_lightning/mosh/logos/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_lightning/mosh/logos/.DS_Store -------------------------------------------------------------------------------- /_lightning/mosh/logos/Android_Robot_100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_lightning/mosh/logos/Android_Robot_100.png -------------------------------------------------------------------------------- /_lightning/mosh/logos/JuiceSSH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_lightning/mosh/logos/JuiceSSH.png -------------------------------------------------------------------------------- /_lightning/mosh/logos/NetBSD-smaller-tb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_lightning/mosh/logos/NetBSD-smaller-tb.png -------------------------------------------------------------------------------- /_lightning/mosh/logos/arch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_lightning/mosh/logos/arch.png -------------------------------------------------------------------------------- /_lightning/mosh/logos/chrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_lightning/mosh/logos/chrome.png -------------------------------------------------------------------------------- /_lightning/mosh/logos/fedora.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_lightning/mosh/logos/fedora.png -------------------------------------------------------------------------------- /_lightning/mosh/logos/freebsd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_lightning/mosh/logos/freebsd.png -------------------------------------------------------------------------------- /_lightning/mosh/logos/gentoo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_lightning/mosh/logos/gentoo.png -------------------------------------------------------------------------------- /_lightning/mosh/logos/homebrew2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_lightning/mosh/logos/homebrew2.png -------------------------------------------------------------------------------- /_lightning/mosh/logos/macosx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_lightning/mosh/logos/macosx.png -------------------------------------------------------------------------------- /_lightning/mosh/logos/macports.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_lightning/mosh/logos/macports.png -------------------------------------------------------------------------------- /_lightning/mosh/logos/opencsw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_lightning/mosh/logos/opencsw.png -------------------------------------------------------------------------------- /_lightning/mosh/logos/ubuntu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | ]> 6 | 10 | 11 | 12 | 14 | 27 | 28 | -------------------------------------------------------------------------------- /_lightning/mosh/mosh-20170616-eriedayofcode.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_lightning/mosh/mosh-20170616-eriedayofcode.pdf -------------------------------------------------------------------------------- /_lightning/mosh/mosh.md: -------------------------------------------------------------------------------- 1 | mosh 2 | ==== 3 | 4 | `@ColinDean` 5 | 6 | --- 7 | 8 | # Notices. 9 | 10 | My words are not necessarily my employers'. Duh. 11 | 12 | --- 13 | 14 | # Introduction 15 | 16 | **MO**bile **SH**ell 17 | 18 | mosh.org 19 | 20 | --- 21 | 22 | # Verbosely 23 | 24 | ## Mosh is a replacement for SSH. 25 | 26 | It's more robust and responsive, especially over Wi-Fi, cellular, and long-distance links. 27 | 28 | ## Remote `terminal` application that 29 | 30 | * allows **roaming**, 31 | * supports **intermittent connectivity**, and 32 | * provides intelligent **local echo** and line editing of user keystrokes. 33 | 34 | --- 35 | 36 | # Why mosh? 37 | 38 | --- 39 | 40 | # Change IP. Stay connected. 41 | 42 | Connected UDP - _may_ need firewall punch 43 | 44 | --- 45 | 46 | 47 | # Encrypted 48 | 49 | State Synchronization Protocol (SSP) secured with AES-128 50 | 51 | --- 52 | 53 | 54 | # Sleep recovery 55 | 56 | Reconnects automatically 57 | 58 | --- 59 | 60 | 61 | # No echo lag 62 | 63 | Typed characters shown immediately, sent when possible 64 | 65 | --- 66 | 67 | 68 | # mosh is safe to use 69 | 70 | No privileged code 71 | 72 | No daemon 73 | 74 | --- 75 | 76 | 77 | # Uses SSH login 78 | 79 | * Connects via SSH 80 | * Starts `mosh-server` on server 81 | * Starts `mosh-client` on client 82 | 83 | --- 84 | 85 | 86 | # `^C` always works 87 | 88 | Control commands jump to front of send buffer 89 | 90 | --- 91 | 92 | 93 | # Few dependencies 94 | 95 | * Protocol Buffers 96 | * ncurses 97 | * zlib 98 | * OpenSSL / Nettle / Apple Common Crypto 99 | 100 | * utempter (optional) 101 | 102 | --- 103 | 104 | 105 | # Use 106 | 107 | ssh colin@cad.cx 108 | 109 | becomes 110 | 111 | mosh colin@cad.cx 112 | 113 | --- 114 | 115 | 116 | # Complex use 117 | 118 | mosh --ssh="~/bin/ssh -i ./identity -p 2222" cad.cx 119 | 120 | --- 121 | 122 | 123 | # Use a config file! 124 | 125 | ~/.ssh/config 126 | 127 | --- 128 | 129 | 130 | # Caveats 131 | 132 | * Supports UTF-8 *only* 133 | 134 | * Must install mosh on server 135 | 136 | * No failover (yet) 137 | 138 | --- 139 | 140 | 141 | # Planned features 142 | 143 | X11Forwarding 144 | 145 | SSH Agent 146 | 147 | IPv6 148 | 149 | --- 150 | 151 | # Availability 152 | 153 | ![Android](logos/Android_Robot_100.png)![Mac OS X](logos/macosx.png)![Chrome](logos/chrome.png) 154 | 155 | --- 156 | 157 | # Availability on *BSD 158 | 159 | ![NetBSD](logos/NetBSD-smaller-tb.png) 160 | ![FreeBSD](logos/freebsd.png) FreeBSD 161 | 162 | --- 163 | 164 | # Availability on Linux 165 | 166 | ![Arch](logos/arch.png) 167 | ![Debian](logos/debian.svg) ![Fedora](logos/fedora.png)![Ubuntu](logos/ubuntu.svg)![Gentoo](logos/gentoo.png)![openSUSE](logos/openSUSE.svg) 168 | 169 | --- 170 | 171 | # Availability for macOS 172 | 173 | 174 | ![Homebrew](logos/homebrew2.png) Homebrew 175 | 176 | ![Macports](logos/macports.png) MacPorts 177 | 178 | --- 179 | 180 | # Availability for Android 181 | 182 | ![JuiceSSH](logos/JuiceSSH.png) 183 | 184 | --- 185 | 186 | 187 | # Common install invocation 188 | 189 | sudo apt-get install mosh 190 | 191 | brew install mobile-shell 192 | 193 | or get it from mosh.org 194 | 195 | --- 196 | 197 | 198 | # Yell at me. 199 | 200 | @colindean 201 | 202 | cad.cx 203 | 204 | github.com/colindean/talks 205 | -------------------------------------------------------------------------------- /_lightning/mosh/mosh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_lightning/mosh/mosh.png -------------------------------------------------------------------------------- /_lightning/mosh/start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ -z "`which rabbit`" ]; then 4 | echo "Rabbit is not installed. Install it with 'gem install rabbit.'" 5 | exit 1 6 | fi 7 | 8 | rabbit mosh.md 2>&1 & 9 | -------------------------------------------------------------------------------- /_lightning/rubocop/Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem 'rabbit', '>= 4.0.0' 4 | #gem 'rabbiter' 5 | -------------------------------------------------------------------------------- /_lightning/rubocop/README.md: -------------------------------------------------------------------------------- 1 | Rubocop lightning talk 2 | ====================== 3 | 4 | Running 5 | ------- 6 | 7 | gem install rabbit rabbiter 8 | ./start.sh 9 | 10 | Other media 11 | ----------- 12 | 13 | * [SpeakerDeck post for Code & Supply Lightning Talk Night 14 | 2014-10-23](https://speakerdeck.com/colindean/rubocop-c-and-s-lightning-talks-2014-10-23) 15 | -------------------------------------------------------------------------------- /_lightning/rubocop/bark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 15 | 17 | 19 | 23 | 27 | 31 | 32 | 34 | 35 | 36 | image/svg+xml 37 | 39 | 41 | 42 | 44 | Openclipart 45 | 46 | 47 | 48 | 2010-06-10T07:22:04 49 | A very simple tree. 50 | http://openclipart.org/detail/65479/simple-tree-by-laobc 51 | 52 | 53 | laobc 54 | 55 | 56 | 57 | 58 | clip art 59 | clipart 60 | nature 61 | tree 62 | 63 | 64 | 65 | 67 | 69 | 71 | 73 | 74 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /_lightning/rubocop/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_lightning/rubocop/logo.png -------------------------------------------------------------------------------- /_lightning/rubocop/rubocop.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_lightning/rubocop/rubocop.pdf -------------------------------------------------------------------------------- /_lightning/rubocop/start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ -z "`which rabbit`" ]; then 4 | echo "Rabbit is not installed. Install it with 'gem install rabbit.'" 5 | exit 1 6 | fi 7 | 8 | rabbit rubocop.md 2>&1 & 9 | #rabbiter --filter "#rubocop" 2>&1 & 10 | -------------------------------------------------------------------------------- /_lightning/sei_issue_classification/.filters/embedded_graphviz.lua: -------------------------------------------------------------------------------- 1 | -- inspired from https://github.com/pandoc/lua-filters/blob/5686d96/diagram-generator/diagram-generator.lua 2 | 3 | local dotPath = os.getenv("DOT") or "dot" 4 | 5 | local filetype = "svg" 6 | local mimetype = "image/svg+xml" 7 | 8 | local function graphviz(code, filetype) 9 | return pandoc.pipe(dotPath, {"-T" .. filetype}, code) 10 | end 11 | 12 | function CodeBlock(block) 13 | local converters = { 14 | graphviz = graphviz, 15 | } 16 | 17 | local img_converter = converters[block.classes[1]] 18 | if not img_converter then 19 | return nil 20 | end 21 | 22 | local success, img = pcall(img_converter, block.text, filetype) 23 | 24 | if not success then 25 | io.stderr:write(tostring(img)) 26 | io.stderr:write('\n') 27 | error 'Image conversion failed. Aborting.' 28 | end 29 | 30 | return pandoc.RawBlock('html', img) 31 | end 32 | 33 | return { 34 | {CodeBlock = CodeBlock}, 35 | } 36 | -------------------------------------------------------------------------------- /_lightning/sei_issue_classification/.gitignore: -------------------------------------------------------------------------------- 1 | reveal.js 2 | font-awesome 3 | Brewfile.lock.json 4 | .peru 5 | *html 6 | *pdf 7 | deps -------------------------------------------------------------------------------- /_lightning/sei_issue_classification/Brewfile: -------------------------------------------------------------------------------- 1 | brew 'peru' 2 | brew 'pandoc' 3 | brew 'make' 4 | brew 'miniserve' 5 | brew 'hivemind' 6 | brew 'graphviz' -------------------------------------------------------------------------------- /_lightning/sei_issue_classification/Makefile: -------------------------------------------------------------------------------- 1 | PRESENTATION = sei_issue_classification 2 | MARKDOWN = $(PRESENTATION).md 3 | HTML = $(PRESENTATION).html 4 | PDF = $(PRESENTATION).pdf 5 | 6 | DEPS_DIR = deps 7 | 8 | all: $(HTML) 9 | 10 | open-and-serve: $(HTML) 11 | open http://localhost:8080/$(HTML) 12 | miniserve . 13 | 14 | automatic-regen: 15 | echo $(MARKDOWN) | entr -acpr make $(HTML) 16 | 17 | watch: Procfile 18 | hivemind Procfile 19 | 20 | .PHONY: deps 21 | deps: peru.yaml Brewfile 22 | brew bundle 23 | peru sync 24 | 25 | clean: 26 | rm -f $(HTML) $(PDF) 27 | 28 | %.html: %.md 29 | pandoc -t revealjs -s $< -o $@ \ 30 | -M revealjs-url=$(DEPS_DIR)/reveal.js/reveal.js-4.2.0 \ 31 | --lua-filter .filters/embedded_graphviz.lua 32 | 33 | .PHONY: pdf 34 | pdf: $(PDF) 35 | 36 | HOST_INSIDE_DOCKER=host.docker.internal 37 | FONTS=$(HOME)/Library/Fonts 38 | PDF_SERVER_PIDFILE=.miniserve.pdf.pid 39 | 40 | $(PDF_SERVER_PIDFILE): 41 | miniserve -p 20871 . & echo $$! > .miniserve.pdf.pid 42 | 43 | $(PDF): $(HTML) $(PDF_SERVER_PIDFILE) 44 | docker run --rm -t --net=host \ 45 | -v "$(shell pwd):/slides" \ 46 | -v "$(FONTS):/home/node/.local/share/fonts" \ 47 | astefanutti/decktape --size 1920x1080 http://$(HOST_INSIDE_DOCKER):20871/$(HTML) $@ 48 | 49 | kill `cat $(PDF_SERVER_PIDFILE)` && rm -rf $(PDF_SERVER_PIDFILE) 50 | -------------------------------------------------------------------------------- /_lightning/sei_issue_classification/Procfile: -------------------------------------------------------------------------------- 1 | serve: miniserve . 2 | watch: echo sei_issue_classification.md | entr -apr make sei_issue_classification.html 3 | -------------------------------------------------------------------------------- /_lightning/sei_issue_classification/custom.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_lightning/sei_issue_classification/custom.css -------------------------------------------------------------------------------- /_lightning/sei_issue_classification/peru.yaml: -------------------------------------------------------------------------------- 1 | imports: 2 | revealjs: deps/reveal.js 3 | fontawesome: deps/font-awesome 4 | 5 | curl module revealjs: 6 | url: https://github.com/hakimel/reveal.js/archive/4.2.0.zip 7 | unpack: zip 8 | 9 | curl module fontawesome: 10 | # Peru can't retrieve from Cloudflare right now? 11 | # see https://github.com/buildinspace/peru/issues/218 12 | # url: https://use.fontawesome.com/releases/v5.15.4/fontawesome-free-5.15.4-web.zip 13 | url: https://github.com/FortAwesome/Font-Awesome/releases/download/5.15.4/fontawesome-free-5.15.4-web.zip 14 | unpack: zip 15 | -------------------------------------------------------------------------------- /_lightning/sei_issue_classification/software_architecture_in_practice_cover_3rdEd.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_lightning/sei_issue_classification/software_architecture_in_practice_cover_3rdEd.jpg -------------------------------------------------------------------------------- /_lightning/sei_issue_classification/software_architecture_in_practice_cover_4thEd.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_lightning/sei_issue_classification/software_architecture_in_practice_cover_4thEd.jpg -------------------------------------------------------------------------------- /_lightning/sei_issue_classification/submissions.md: -------------------------------------------------------------------------------- 1 | # SEI Issue Classification lightning talk submissions 2 | 3 | ## Code & Supply Lightning Talk Night 4 | 5 | [:movie_camera: Video](https://www.youtube.com/watch?v=1UtklNrB8XA&t=1042s) 6 | 7 | Learn a simple classification system for your JIRA or GitHub tickets straight out of one of the Software Engineering Institute's best books, Software Architecture in Practice. You'll learn how to classify user stories, architecture stories, defects, and technical debt and use these new labels to power your backlog refinement sessions. 8 | 9 | ## $(WORK) Internal Meeting - 2021-11-30 - :white_check_mark: 10 | -------------------------------------------------------------------------------- /_lightning/timetracking_with_ledger/bitbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_lightning/timetracking_with_ledger/bitbar.png -------------------------------------------------------------------------------- /_lightning/timetracking_with_ledger/projects.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_lightning/timetracking_with_ledger/projects.png -------------------------------------------------------------------------------- /_lightning/timetracking_with_ledger/sheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_lightning/timetracking_with_ledger/sheet.png -------------------------------------------------------------------------------- /_lightning/timetracking_with_ledger/timetracking.md: -------------------------------------------------------------------------------- 1 | # time tracking with ledger 2 | 3 | Command-line, plaintext accounting tools are fun 4 | 5 | --- 6 | 7 | # so you track time? 8 | 9 | i, too, track time 10 | 11 | --- 12 | 13 | # why do developers track time? 14 | 15 | * billing 16 | * billing 17 | * remembering 18 | * ensuring work/life balance 19 | 20 | --- 21 | 22 | # why do developers track time? 23 | 24 | * billing 25 | * billing 26 | * remembering 27 | * **ensuring work/life balance** 28 | 29 | --- 30 | 31 | # tools 32 | 33 | * `ledger` - ledger-cli.org 34 | * `t` - https://github.com/colindean/hejmo/blob/master/scripts/t 35 | 36 | _(I promise it'll get better if others clamor.)_ 37 | 38 | _(I'm probably a user away from making a Homebrew tap.)_ 39 | 40 | --- 41 | 42 | # Basic `t` usage 43 | 44 | ``` 45 | $ t in Taskname 46 | $ t sw OtherTask 47 | $ t out 48 | ``` 49 | 50 | --- 51 | 52 | # Forgot something? 53 | 54 | ``` 55 | $ t log 09:15 11:45 Coding 56 | $ t edit 57 | ``` 58 | 59 | It's just a text file. 60 | 61 | --- 62 | 63 | # Basic daily reporting 64 | 65 | ``` 66 | $ t hours 67 | 8.47h N 68 | 1.03h Development 69 | 1.04h Email 70 | 5.90h Meeting 71 | 24.1m IT 72 | 4.50h Recruiting:Interview 73 | 30.0m Training:Podcasts 74 | -------------------- 75 | 8.47h 76 | ``` 77 | 78 | --- 79 | 80 | # Listing projects 81 | 82 | ![](projects.png) 83 | 84 | --- 85 | 86 | # Time sheet 87 | 88 | ![](sheet.png) 89 | 90 | Easily view daily totals for transposition to tracking system 91 | 92 | --- 93 | 94 | # But wait, there's more! 95 | 96 | --- 97 | 98 | # BitBar 99 | 100 | ![](bitbar.png) 101 | 102 | https://github.com/colindean/hejmo/blob/master/dotfiles/bitbar/work/hours.6m.sh 103 | 104 | _(Unfortunately requires some customization to get `t` path right)_ 105 | 106 | --- 107 | 108 | # How can you help? 109 | 110 | * Use `t` and submit improvements and reports 111 | * Improve ledger syntax highlighting to include time mode 112 | 113 | --- 114 | 115 | # Text editor support 116 | 117 | vim 118 | ``` 119 | Plugin 'ledger/vim-ledger' 120 | ``` 121 | atom 122 | 123 | ``` 124 | $ apm install language-ledger 125 | ``` 126 | and many more 127 | 128 | --- 129 | 130 | # Go forth and track time! -------------------------------------------------------------------------------- /_lightning/why_you_should_go_to_events/why_you_should_go_to_events.md: -------------------------------------------------------------------------------- 1 | Why you should go to meetups, conferences, and other events 2 | ======= 3 | 4 | author 5 | : Colin Dean -> @colindean 6 | 7 | subtitle 8 | : And why your company should pay for it 9 | 10 | theme 11 | : nari 12 | 13 | allotted-time 14 | : 300 15 | 16 | # Obligatory notice. 17 | 18 | My words are not necessarily my employers'. Duh. 19 | 20 | # Watson on Wild Ducks 21 | 22 | ![](https://pbs.twimg.com/media/BssBH0XCcAA-YP7.png:large) 23 | -------------------------------------------------------------------------------- /_retired/README.md: -------------------------------------------------------------------------------- 1 | # Retired Talks 2 | 3 | These are talks I have not given in a very long time or were one-off talks. 4 | I'd probably be willing to give them again if asked, but I don't submit them. 5 | -------------------------------------------------------------------------------- /_retired/_reviews/README.md: -------------------------------------------------------------------------------- 1 | # Retired Reviews 2 | 3 | Reviews that I gave once or twice and don't want to update their build systems/dependencies anymore. 4 | -------------------------------------------------------------------------------- /_retired/_reviews/codemash2020_review/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /_retired/_reviews/codemash2020_review/codemash2020_beach.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_retired/_reviews/codemash2020_review/codemash2020_beach.jpg -------------------------------------------------------------------------------- /_retired/_reviews/codemash2020_review/marp.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | allowLocalFiles: true, 3 | ogImage: process.env.URL && `${process.env.URL}/og-image.jpg`, 4 | themeSet: 'themes', 5 | url: process.env.URL, 6 | } 7 | -------------------------------------------------------------------------------- /_retired/_reviews/codemash2020_review/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "devopsdays-buffalo-2019-review", 3 | "version": "0.0.0", 4 | "author": "Colin Dean", 5 | "license": "CC0", 6 | "private": true, 7 | "scripts": { 8 | "build": "rimraf dist && npm run -s og-image && npm run -s deck", 9 | "deck": "marp --no-stdin codemash2020.md -o dist/index.html && cpx \"assets/**/*\" dist/assets", 10 | "now-build": "npm run -s deck", 11 | "og-image": "marp codemash2020.md -o dist/og-image.jpg", 12 | "start": "marp -ps ." 13 | }, 14 | "devDependencies": { 15 | "@marp-team/marp-cli": "^4.0.4", 16 | "cpx": "^1.5.0", 17 | "rimraf": "^3.0.0" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /_retired/_reviews/codemash2023_review/.filters: -------------------------------------------------------------------------------- 1 | ../../make_python_devex/.filters -------------------------------------------------------------------------------- /_retired/_reviews/codemash2023_review/.gitignore: -------------------------------------------------------------------------------- 1 | .peru 2 | presentation.html 3 | deps 4 | -------------------------------------------------------------------------------- /_retired/_reviews/codemash2023_review/Brewfile: -------------------------------------------------------------------------------- 1 | ../../make_python_devex/Brewfile -------------------------------------------------------------------------------- /_retired/_reviews/codemash2023_review/Makefile: -------------------------------------------------------------------------------- 1 | ../../make_python_devex/Makefile -------------------------------------------------------------------------------- /_retired/_reviews/codemash2023_review/Procfile: -------------------------------------------------------------------------------- 1 | ../../make_python_devex/Procfile -------------------------------------------------------------------------------- /_retired/_reviews/codemash2023_review/custom.css: -------------------------------------------------------------------------------- 1 | .wordcloud ul li { 2 | display: inline; 3 | } 4 | 5 | .wordcloud ul li:nth-child(n+2)::before { 6 | content:'\00a0\00a0'; 7 | } 8 | 9 | .wordcloud ul li:nth-child(2n) { 10 | color: gray; 11 | } 12 | 13 | -------------------------------------------------------------------------------- /_retired/_reviews/codemash2023_review/godot3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_retired/_reviews/codemash2023_review/godot3.png -------------------------------------------------------------------------------- /_retired/_reviews/codemash2023_review/peru.yaml: -------------------------------------------------------------------------------- 1 | ../../make_python_devex/peru.yaml -------------------------------------------------------------------------------- /_retired/_reviews/codemash2023_review/tdd/fizzbuzz.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env pytest 2 | 3 | 4 | def fb(n): 5 | div3 = n % 3 == 0 6 | div5 = n % 5 == 0 7 | 8 | if div3 and div5: 9 | return "FizzBuzz" 10 | 11 | if div5: 12 | return "Buzz" 13 | 14 | if div3: 15 | return "Fizz" 16 | 17 | return str(n) 18 | 19 | 20 | def test_truth(): 21 | assert True 22 | 23 | 24 | def test_emits_fizz(): 25 | assert fb(3) == "Fizz" 26 | 27 | 28 | def test_emits_buzz(): 29 | assert fb(5) == "Buzz" 30 | 31 | 32 | def test_emits_fizzbuzz(): 33 | assert fb(15) == "FizzBuzz" 34 | 35 | 36 | def test_sequence(): 37 | expected = """ 38 | 1 39 | 2 40 | Fizz 41 | 4 42 | Buzz 43 | Fizz 44 | 7 45 | 8 46 | Fizz 47 | Buzz 48 | 11 49 | Fizz 50 | 13 51 | 14 52 | FizzBuzz 53 | 16""".strip() 54 | 55 | actual = "\n".join([fb(n) for n in range(1, 17)]) 56 | 57 | assert actual == expected 58 | 59 | 60 | def fb_alt(n) -> str: 61 | s = str(n) 62 | has3 = "3" in s 63 | has5 = "5" in s 64 | 65 | if has3 and has5: 66 | return "FizzBuzz" 67 | 68 | if has5: 69 | return "Buzz" 70 | 71 | if has3: 72 | return "Fizz" 73 | 74 | return s 75 | 76 | 77 | def test_alt_has_3_emits_fizz(): 78 | assert fb_alt(3) == "Fizz" 79 | 80 | 81 | def test_alt_has_5_emits_buzz(): 82 | assert fb_alt(5) == "Buzz" 83 | 84 | 85 | def test_alt_has_3_and_5_emits_fizzbuzz(): 86 | assert fb_alt(35) == "FizzBuzz" 87 | -------------------------------------------------------------------------------- /_retired/_reviews/codemash2023_review/tdd/pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "tdd-workshop" 3 | version = "0.1.0" 4 | description = "shut up warnings" 5 | authors = [ 6 | "Colin Dean ", 7 | ] 8 | 9 | [tool.poetry.dependencies] 10 | python = ">3.9,<=4.0" 11 | 12 | [tool.poetry.dev-dependencies] 13 | pytest = ">=7" 14 | 15 | [build-system] 16 | requires = ["poetry-core>=1.0.0"] 17 | build-backend = "poetry.core.masonry.api" 18 | -------------------------------------------------------------------------------- /_retired/_reviews/codemash2023_review/tdd/vending.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env pytest 2 | # https://github.com/guyroyse/vending-machine-kata 3 | 4 | from typing import List, Optional 5 | from enum import Enum 6 | 7 | 8 | class Coins(Enum): 9 | Quarter = 25 10 | Dime = 10 11 | Nickel = 5 12 | Penny = 1 13 | 14 | 15 | class CoinSlot: 16 | def __init__(self, payload: List[Coins] = []): 17 | self.payload = payload 18 | 19 | def pop(self) -> Optional[Coins]: 20 | if self.payload: 21 | return self.payload.pop() 22 | else: 23 | return None 24 | 25 | 26 | class CoinSensor: 27 | 28 | def __init__(self, slot: CoinSlot): 29 | self.slot = slot 30 | 31 | def sense(self) -> Optional[Coins]: 32 | return self.slot.pop() 33 | 34 | 35 | class CoinReturn: 36 | def __init__(self): 37 | self.bin: List[Coins] = [] 38 | 39 | def add(self, coin: Coins): 40 | self.bin.append(coin) 41 | 42 | 43 | class Display: 44 | def __init__(self): 45 | self.text = "INSERT COIN" 46 | 47 | 48 | class VendingMachine: 49 | 50 | INVALID_COINS = [Coins.Penny] 51 | 52 | def __init__(self, 53 | coin_sensor: CoinSensor, 54 | coin_return: CoinReturn, 55 | display: Display): 56 | self.coin_sensor = coin_sensor 57 | self.coin_return = coin_return 58 | self.display = display 59 | 60 | def feed(self): 61 | while coin := self.coin_sensor.sense(): 62 | if not coin: 63 | return 64 | if coin in self.INVALID_COINS: 65 | self.coin_return.add(coin) 66 | 67 | 68 | def test_accept_coin(): 69 | slot = CoinSlot([Coins.Quarter, Coins.Quarter]) 70 | sensor = CoinSensor(slot) 71 | coin = sensor.sense() 72 | assert coin == Coins.Quarter 73 | coin = sensor.sense() 74 | assert coin == Coins.Quarter 75 | 76 | 77 | def test_accept_coin_no_coins(): 78 | slot = CoinSlot([]) 79 | sensor = CoinSensor(slot) 80 | coin = sensor.sense() 81 | assert coin is None 82 | 83 | 84 | def test_vm_rejects_pennies(): 85 | slot = CoinSlot([Coins.Penny]) 86 | sensor = CoinSensor(slot) 87 | coin_return = CoinReturn() 88 | display = Display() 89 | vm = VendingMachine(sensor, coin_return, display) 90 | vm.feed() 91 | 92 | assert Coins.Penny in coin_return.bin 93 | -------------------------------------------------------------------------------- /_retired/_reviews/devopsdays_buffalo_2019_review/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /_retired/_reviews/devopsdays_buffalo_2019_review/devopsdays_buffalo_logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_retired/_reviews/devopsdays_buffalo_2019_review/devopsdays_buffalo_logo.jpg -------------------------------------------------------------------------------- /_retired/_reviews/devopsdays_buffalo_2019_review/marp.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | allowLocalFiles: true, 3 | ogImage: process.env.URL && `${process.env.URL}/og-image.jpg`, 4 | themeSet: 'themes', 5 | url: process.env.URL, 6 | } 7 | -------------------------------------------------------------------------------- /_retired/_reviews/devopsdays_buffalo_2019_review/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "devopsdays-buffalo-2019-review", 3 | "version": "0.0.0", 4 | "author": "Colin Dean", 5 | "license": "CC0", 6 | "private": true, 7 | "scripts": { 8 | "build": "rimraf dist && npm run -s og-image && npm run -s deck", 9 | "deck": "marp --no-stdin dodbuf19.md -o dist/index.html && cpx \"assets/**/*\" dist/assets", 10 | "now-build": "npm run -s deck", 11 | "og-image": "marp dodbuf19.md -o dist/og-image.jpg", 12 | "start": "marp -ps ." 13 | }, 14 | "devDependencies": { 15 | "@marp-team/marp-cli": "^4.1.0", 16 | "cpx": "^1.5.0", 17 | "rimraf": "^3.0.0" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /_retired/_reviews/githubuniverse2016_review/2016-09-13 14.47.50.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_retired/_reviews/githubuniverse2016_review/2016-09-13 14.47.50.jpg -------------------------------------------------------------------------------- /_retired/_reviews/githubuniverse2016_review/2016-09-13 15.49.37.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_retired/_reviews/githubuniverse2016_review/2016-09-13 15.49.37.jpg -------------------------------------------------------------------------------- /_retired/_reviews/githubuniverse2016_review/2016-09-14 09.04.43.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_retired/_reviews/githubuniverse2016_review/2016-09-14 09.04.43.jpg -------------------------------------------------------------------------------- /_retired/_reviews/githubuniverse2016_review/2016-09-14 09.04.59.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_retired/_reviews/githubuniverse2016_review/2016-09-14 09.04.59.jpg -------------------------------------------------------------------------------- /_retired/_reviews/githubuniverse2016_review/2016-09-14 09.23.31.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_retired/_reviews/githubuniverse2016_review/2016-09-14 09.23.31.jpg -------------------------------------------------------------------------------- /_retired/_reviews/githubuniverse2016_review/2016-09-14 09.24.57.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_retired/_reviews/githubuniverse2016_review/2016-09-14 09.24.57.jpg -------------------------------------------------------------------------------- /_retired/_reviews/githubuniverse2016_review/2016-09-14 09.25.35.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_retired/_reviews/githubuniverse2016_review/2016-09-14 09.25.35.jpg -------------------------------------------------------------------------------- /_retired/_reviews/githubuniverse2016_review/2016-09-14 21.56.53.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_retired/_reviews/githubuniverse2016_review/2016-09-14 21.56.53.jpg -------------------------------------------------------------------------------- /_retired/_reviews/githubuniverse2016_review/2016-09-15 10.01.35.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_retired/_reviews/githubuniverse2016_review/2016-09-15 10.01.35.jpg -------------------------------------------------------------------------------- /_retired/_reviews/githubuniverse2016_review/2016-09-15 14.11.36.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_retired/_reviews/githubuniverse2016_review/2016-09-15 14.11.36.jpg -------------------------------------------------------------------------------- /_retired/_reviews/githubuniverse2016_review/2016-09-15 18.38.12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_retired/_reviews/githubuniverse2016_review/2016-09-15 18.38.12.jpg -------------------------------------------------------------------------------- /_retired/_reviews/githubuniverse2016_review/2016-09-15 18.41.30.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_retired/_reviews/githubuniverse2016_review/2016-09-15 18.41.30.jpg -------------------------------------------------------------------------------- /_retired/_reviews/githubuniverse2016_review/This presentation requires Marp 0.0.9 - npm start: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_retired/_reviews/githubuniverse2016_review/This presentation requires Marp 0.0.9 - npm start -------------------------------------------------------------------------------- /_retired/_reviews/githubuniverse2016_review/portofsanfrancisco.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_retired/_reviews/githubuniverse2016_review/portofsanfrancisco.jpg -------------------------------------------------------------------------------- /_retired/_reviews/githubuniverse2016_review/trailer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_retired/_reviews/githubuniverse2016_review/trailer.jpg -------------------------------------------------------------------------------- /_retired/_reviews/saturn2016_review/SATURN 2016 retrospective.key: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2eeba7203cf754b36690fa7b916275359fefcfa5195cdcdcd520cfd9aa76df34 3 | size 7626584 4 | -------------------------------------------------------------------------------- /_retired/_reviews/saturn2016_review/SATURN 2016 retrospective.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_retired/_reviews/saturn2016_review/SATURN 2016 retrospective.pdf -------------------------------------------------------------------------------- /_retired/bitcoin-technical/README.md: -------------------------------------------------------------------------------- 1 | Bitcoin Technical talk 2 | ====================== 3 | 4 | Running 5 | ------- 6 | 7 | gem install rabbit rabbiter 8 | ./start.sh 9 | 10 | Other media 11 | ----------- 12 | 13 | * [Slideshare](http://www.slideshare.net/cdean/bitcoin-technical) 14 | * [YouTube of 28 Aug 2013 delivery](https://www.youtube.com/watch?v=aGTRPhTiiXU) 15 | -------------------------------------------------------------------------------- /_retired/bitcoin-technical/bitcoin-technical.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_retired/bitcoin-technical/bitcoin-technical.pdf -------------------------------------------------------------------------------- /_retired/bitcoin-technical/bitcoin_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_retired/bitcoin-technical/bitcoin_logo.png -------------------------------------------------------------------------------- /_retired/bitcoin-technical/start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ -z "`which rabbit`" ]; then 4 | echo "Rabbit is not installed. Install it with 'gem install rabbit.'" 5 | exit 1 6 | fi 7 | 8 | rabbit bitcoin-technical.md 2>&1 & 9 | rabbiter --filter "#ytaets" 2>&1 & 10 | -------------------------------------------------------------------------------- /_retired/intro_to_programming/Intro to Programming.key: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b1bc16bd9a8ff97cb7d63dfd1f354ac559da0bbb019a076f8610c89ee0a7c86d 3 | size 8670086 4 | -------------------------------------------------------------------------------- /_retired/intro_to_programming/notes.md: -------------------------------------------------------------------------------- 1 | # Intro to Programming 2 | 3 | ## Deliveries 4 | 5 | * Private training, 2015-07-08 6 | -------------------------------------------------------------------------------- /_retired/vagrant/me.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_retired/vagrant/me.jpg -------------------------------------------------------------------------------- /_retired/vagrant/start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ -z "`which rabbit`" ]; then 4 | echo "Rabbit is not installed. Install it with 'gem install rabbit.'" 5 | exit 1 6 | fi 7 | 8 | rabbit --full-screen vagrant.md 2>&1 & 9 | #rabbiter --filter "#ytaets" 2>&1 & 10 | -------------------------------------------------------------------------------- /_retired/vagrant/vagrant.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_retired/vagrant/vagrant.pdf -------------------------------------------------------------------------------- /_retired/vagrant/vagrant_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/_retired/vagrant/vagrant_logo.png -------------------------------------------------------------------------------- /_template/.filters/embedded_graphviz.lua: -------------------------------------------------------------------------------- 1 | -- inspired from https://github.com/pandoc/lua-filters/blob/5686d96/diagram-generator/diagram-generator.lua 2 | 3 | local dotPath = os.getenv("DOT") or "dot" 4 | 5 | local filetype = "svg" 6 | local mimetype = "image/svg+xml" 7 | 8 | local function graphviz(code, filetype) 9 | return pandoc.pipe(dotPath, {"-T" .. filetype}, code) 10 | end 11 | 12 | function CodeBlock(block) 13 | local converters = { 14 | graphviz = graphviz, 15 | } 16 | 17 | local img_converter = converters[block.classes[1]] 18 | if not img_converter then 19 | return nil 20 | end 21 | 22 | local success, img = pcall(img_converter, block.text, filetype) 23 | 24 | if not success then 25 | io.stderr:write(tostring(img)) 26 | io.stderr:write('\n') 27 | error 'Image conversion failed. Aborting.' 28 | end 29 | 30 | return pandoc.RawBlock('html', img) 31 | end 32 | 33 | return { 34 | {CodeBlock = CodeBlock}, 35 | } 36 | 37 | -------------------------------------------------------------------------------- /_template/.gitignore: -------------------------------------------------------------------------------- 1 | .peru 2 | deps 3 | presentation.html 4 | presentation.pdf 5 | *.ws 6 | -------------------------------------------------------------------------------- /_template/Brewfile: -------------------------------------------------------------------------------- 1 | # dependency retrieval, images, etc. 2 | brew 'peru' 3 | # run a command when a file changes 4 | brew 'entr' 5 | # universal document converter 6 | brew 'pandoc' 7 | # task runner and more 8 | brew 'make' 9 | # really fast, tiny webserver 10 | brew 'miniserve' 11 | # multi-process server runner 12 | brew 'hivemind' 13 | # graphic generator 14 | brew 'graphviz' 15 | # node packages for some reason 16 | brew 'npm' 17 | # terminal screen recorder 18 | brew 'asciinema' 19 | # read from websockets 20 | brew 'websocat' 21 | -------------------------------------------------------------------------------- /_template/Makefile: -------------------------------------------------------------------------------- 1 | PRESENTATION = presentation 2 | MARKDOWN = $(PRESENTATION).md 3 | HTML = $(MARKDOWN:md=html) 4 | PDF = $(MARKDOWN:md=pdf) 5 | 6 | DEPS_DIR = deps 7 | 8 | REVEALJS_VERSION = $(shell basename -s .zip $(shell yaml2json peru.yaml | jq -r '.["curl module revealjs"].url')) 9 | 10 | WS_WATCHED_FILE = .$(HTML).ws 11 | 12 | ##@ Utility 13 | 14 | .PHONY: help 15 | help: ## Display this help 16 | @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z0-9_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) 17 | 18 | ##@ Setup 19 | 20 | .PHONY: deps 21 | deps: peru.yaml Brewfile ## Install dependencies 22 | brew bundle --verbose 23 | peru sync 24 | 25 | ##@ Presenting 26 | 27 | all: $(HTML) $(PDF) ## Build all artifacts 28 | 29 | html: $(HTML) ## Make the presentation reveal.js HTML 30 | 31 | open-and-serve: $(HTML) ## Start a server and open the presentation in a browser 32 | open http://localhost:8080/$(HTML) 33 | miniserve . 34 | 35 | ##@ Development 36 | 37 | automatic-regen: ## Use entr to automatically remake the file 38 | echo $(MARKDOWN) | entr -acpr $(SHELL) -c "make $(HTML) && echo reload >> $(WS_WATCHED_FILE)" 39 | 40 | watch: Procfile ## Use hivemind for constant building, run open first 41 | hivemind Procfile 42 | 43 | livereload-ws: ## Run a websocket server listening for reloads 44 | tail -f $(WS_WATCHED_FILE) | websocat -s 56789 45 | 46 | ##@ Cleanup 47 | 48 | clean: 49 | rm -f $(HTML) $(PDF) $(PDF_SERVER_PIDFILE) $(WS_WATCHED_FILE) 50 | 51 | %.html: %.md Makefile 52 | pandoc -t revealjs -s $< -o $@ \ 53 | --section-divs \ 54 | $(addprefix -L ,$(wildcard .filters/*)) \ 55 | -M revealjs-url=$(DEPS_DIR)/reveal.js/reveal.js-$(REVEALJS_VERSION) 56 | 57 | .PHONY: pdf 58 | pdf: $(PDF) ## Build a PDF 59 | 60 | HOST_INSIDE_DOCKER=host.docker.internal 61 | FONTS=$(HOME)/Library/Fonts 62 | PDF_SERVER_PIDFILE=.miniserve.pdf.pid 63 | 64 | $(PDF_SERVER_PIDFILE): 65 | miniserve -p 20871 . & echo $$! > .miniserve.pdf.pid 66 | 67 | DECKTAPE_CMD = docker run --platform=linux/amd64 --rm -t --net=host \ 68 | -v "$(shell pwd):/slides" \ 69 | -v "$(FONTS):/home/node/.local/share/fonts" \ 70 | astefanutti/decktape 71 | 72 | DECKTAPE_CMD = npm exec -- decktape 73 | DECKTAPE_HOST = 127.0.0.1 74 | 75 | %.pdf: $(PRESENTATION_HTML) $(PDF_SERVER_PIDFILE) 76 | $(DECKTAPE_CMD) --size 1920x1080 http://$(DECKTAPE_HOST):20871/$(@:.pdf=.html) $@ 77 | -------------------------------------------------------------------------------- /_template/Procfile: -------------------------------------------------------------------------------- 1 | serve: miniserve . 2 | ws: make livereload-ws 3 | watch: make automatic-regen 4 | -------------------------------------------------------------------------------- /_template/copier.yml: -------------------------------------------------------------------------------- 1 | # questions for form; declared variables 2 | talkname: 3 | type: str 4 | help: What could be a name for the talk? Used in placeholders. 5 | 6 | talkname_short: 7 | type: str 8 | help: Provide a short name for the talk, used for directory name and git commit prefix shortcode. 9 | 10 | subtitle: 11 | type: str 12 | help: What's a good subtitle? Think of something catchy. 13 | default: "" 14 | 15 | include_pittsburgh_slide: 16 | type: bool 17 | help: Should the standard slide about Pittsburgh be included? 18 | default: false 19 | 20 | license_cc_by_sa: 21 | type: bool 22 | help: Should this talk be explictly licensed CC-BY-SA? 23 | default: false 24 | 25 | include_fediverse: 26 | type: bool 27 | help: Should fediverse links be included? 28 | default: true 29 | 30 | include_bsky: 31 | type: bool 32 | help: Should Bluesky links be included? 33 | default: true 34 | 35 | -------------------------------------------------------------------------------- /_template/custom.css: -------------------------------------------------------------------------------- 1 | section.nocaptions figcaption { 2 | display:none; 3 | } 4 | 5 | .image-borders img { 6 | border: 0.05em solid #ccc; 7 | border-radius: 0.5em; 8 | padding: 0.4em; 9 | background-color: white; 10 | } 11 | -------------------------------------------------------------------------------- /_template/notes.md.jinja: -------------------------------------------------------------------------------- 1 | # Notes for {{talkname}} 2 | 3 | > [!CAUTION] 4 | > :construction: This talk may be under construction. 5 | 6 | ## Main idea 7 | 8 | 9 | 10 | ## See also 11 | 12 | * FIXME: Someting 13 | -------------------------------------------------------------------------------- /_template/peru.yaml.jinja: -------------------------------------------------------------------------------- 1 | imports: 2 | revealjs: deps/reveal.js 3 | fontawesome: deps/font-awesome 4 | asciinema-player-css: deps/asciinema-player 5 | asciinema-player-js: deps/asciinema-player 6 | colindean-tophat: deps/colindean-tophat.jpg 7 | {% if license_cc_by_sa %} 8 | cc_by_sa: deps/cc_by_sa 9 | {% endif %} 10 | 11 | curl module revealjs: 12 | url: https://github.com/hakimel/reveal.js/archive/5.2.1.zip 13 | unpack: zip 14 | 15 | curl module fontawesome: 16 | url: https://github.com/FortAwesome/Font-Awesome/releases/download/6.0.0/fontawesome-free-6.0.0-web.zip 17 | unpack: zip 18 | 19 | curl module asciinema-player-css: 20 | url: https://github.com/asciinema/asciinema-player/releases/download/v3.0.0/asciinema-player.css 21 | 22 | curl module asciinema-player-js: 23 | url: https://github.com/asciinema/asciinema-player/releases/download/v3.0.0/asciinema-player.js 24 | 25 | curl module colindean-tophat: 26 | url: https://avatars.githubusercontent.com/u/197224?s=300 27 | 28 | {% if license_cc_by_sa %} 29 | curl module cc_by_sa: 30 | url: https://upload.wikimedia.org/wikipedia/commons/e/e5/CC_BY-SA_icon.svg 31 | {% endif %} 32 | -------------------------------------------------------------------------------- /_template/presentation.md.jinja: -------------------------------------------------------------------------------- 1 | --- 2 | title: "{{talkname}}" 3 | subtitle: "{{subtitle}}" 4 | author: 5 | - _Colin Dean_ 6 | {% if include_fediverse -%} 7 | - "`@colindean@mastodon.social`" 8 | {% endif -%} 9 | theme: white 10 | css: custom.css 11 | slideNumber: true 12 | hash: true 13 | history: true 14 | # transition: none 15 | transitionSpeed: "fast" 16 | totalTime: 1800 17 | header-includes: | 18 | 27 | --- 28 | 29 | # Who is this guy? 30 | 31 | ::: biopic 32 | ![Colin Dean, who wears many hats](deps/colindean-tophat.jpg/197224) 33 | ::: 34 | 35 | Software engineer and community builder 36 | 37 | ::: notes 38 | 39 | I'm Colin Dean. 40 | 41 | ::: 42 | 43 | --- 44 | 45 | {% if include_pittsburgh_slide -%} 46 | ## {background-image="pittsburgh_on_a_map.svg" background-size="contain" background-color="#6699ff"} 47 | 48 | ::: notes 49 | 50 | I'm here from Pittsburgh, a metropolitan area of around two and a half million people 51 | in northern Appalachia in an area of the United States we call the Rust Belt. 52 | 53 | ::: 54 | 55 | --- 56 | {% endif -%} 57 | 58 | 61 | 62 | Please save your questions until the end. 63 | 64 | Grab a piece of paper so you can write them down. 65 | 66 | ::: notes 67 | 68 | COLIN: 69 | 70 | Please save your questions until the end. 71 | We have a lot to cover and I need to keep pace to include all of it. 72 | Please do shout out if you can't see something, though, or another technical 73 | problem with the presentation occurs. 74 | 75 | ::: 76 | 77 | --- 78 | 79 | TODO: WRITE THE TALK 80 | 81 | --- 82 | 83 | # FIN 84 | 85 | Thanks, yinz! 86 | 87 | | | | 88 | |---|---| 89 | {% if include_fediverse -%} 90 | |**fediverse**|`@colindean@mastodon.social`| 91 | {% endif -%} 92 | {% if include_bsky -%} 93 | |**bsky**|`@cad.cx`| 94 | {% endif -%} 95 | |**slides**|https://github.com/colindean/talks| 96 | 97 | ::: notes 98 | 99 | Thanks, yinz. 100 | There some Pittsburghese for you all. 101 | 102 | ::: 103 | 104 | --- 105 | 106 | # Attributions {.nocaptions} 107 | 108 | {% if include_pittsburgh_slide -%} 109 | * [Relief location map of the USA (without Hawaii and Alaska)](https://commons.wikimedia.org/wiki/File:Usa_edcp_relief_location_map.png), Uwe Dedering, 2010. 110 | {% endif -%} 111 | {% if license_cc_by_sa -%} 112 | * [Creative Commons "Attribution-Share Alike" license icon](https://commons.wikimedia.org/wiki/File:CC_BY-SA_icon.svg), Creative Commons, 2008. 113 | {% endif -%} 114 | 115 | {% if license_cc_by_sa -%} 116 | ![CC-BY-SA logo](deps/cc_by_sa/CC_BY-SA_icon.svg) 117 | {% endif -%} 118 | 119 | --- 120 | 121 | # See also 122 | 123 | -------------------------------------------------------------------------------- /_template/{{_copier_conf.answers_file}}.jinja: -------------------------------------------------------------------------------- 1 | # Changes here will be overwritten by Copier on updates 2 | {{ _copier_answers|to_nice_yaml -}} 3 | -------------------------------------------------------------------------------- /bio.md: -------------------------------------------------------------------------------- 1 | # Bio 2 | 3 | ## Last update 4 | 5 | `2025-03-04 21:20 EST` 6 | 7 | ## Short bio 8 | 9 | ### Third person 10 | 11 | Colin Dean is a software engineer, community builder, and non-profit leader from Pittsburgh, Pennsylvania, in the United States. 12 | 13 | ### First person 14 | 15 | I am a software engineer, community builder, and non-profit leader from Pittsburgh, Pennsylvania, in the United States. 16 | 17 | ## Medium bio 18 | 19 | ### Third Person 20 | 21 | Colin Dean is a software engineer, community builder, and non-profit leader. He's built software for IBM Watson, Target, Vivísimo, and Arcadia.io, plus some open source software, such as Homebrew, used by most Mac-using developers. He's served on boards of five nonprofits, founding two, and advising other nonprofits on leadership and technical topics. He spends most of his time managing Meetups and conferences for Code & Supply, Pittsburgh's largest community of software professionals. He loves cuddling with his dogs, cat, and partner. 22 | 23 | ### First person 24 | 25 | I am a software engineer, community builder, and non-profit leader. I've built software for IBM Watson, Target, Vivísimo, and Arcadia.io, plus some open source software, such as Homebrew, used by most Mac-using developers. I've served on boards of five nonprofits, founding two, and advised other nonprofits on leadership and technical topics. I spend most of my time managing Meetups and conferences for Code & Supply, Pittsburgh's largest community of software professionals. I love cuddling with my dogs, cat, and partner. 26 | 27 | ## Long bio 28 | 29 | ### Third Person 30 | 31 | Colin Dean is a software engineer, community builder, and non-profit leader. He's built software for IBM Watson, Target, Vivísimo, and Arcadia.io, plus some open-source software used by many developers, especially Mac devs. 32 | 33 | Colin has spoken at SATURN, GitHub Universe, FOSDEM, Codemash, Write the Docs, PyOhio, Ohio Linuxfest, and other conferences. He's organized tech conferences in Pittsburgh, such as Abstractions, Heartifacts, devopsdays, and Steel City Ruby. 34 | 35 | > [!WARNING] 36 | > _Consumers should validate the next paragraph :point_down: or remove it for usage in timeless publication._ 37 | 38 | He is currently a Lead AI Engineer at Target, focusing on developer experience, DevOps, build engineering, code quality, and observability. He is also the Managing Director of Code & Supply Co., Pittsburgh's largest community of software professionals, running its Meetups and conferences and, formerly, its coworking space. He has served since 2023 on the Project Leadership Committee of the Homebrew project, the missing package manager for macOS and Linux. 39 | 40 | > [!WARNING] 41 | > _Consumers should validate or remove the previous paragraph :point_up: for usage in timeless publication._ 42 | 43 | He's served on boards of five nonprofits, including two organizations he founded: Meta Mesh Wireless Communities/Community Internet Solutions, a non-profit WiFi ISP in Pittsburgh (2012–2024), and Code & Supply Scholarship Fund, which awards conference travel grants (2016–). He also advises other nonprofits on leadership and technical topics. 44 | 45 | ## Pictures 46 | 47 | It's acceptable to use any of these pictures, as long as it's a picture of me! 48 | 49 | * [GitHub](https://avatars.githubusercontent.com/u/197224?v=4) 50 | * [Mastodon.social](https://mastodon.social/@colindean) 51 | * [Twitter](https://twitter.com/colindean/photo) 52 | * [LinkedIn](https://www.linkedin.com/in/colindean/) 53 | 54 | Higher resolution or more recent pictures available on request (tophat+smile = 2020, tophat+mic = 2015). 55 | -------------------------------------------------------------------------------- /cadcx_markdownlint_style.rb: -------------------------------------------------------------------------------- 1 | all 2 | rule 'MD013', :line_length => 500 3 | rule 'MD007', :indent => 2 4 | -------------------------------------------------------------------------------- /code_review/Code Daze 2018/Code Review is an Architectural Necessity - Colin Dean - Code Daze 2018.key: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8a57ce26bc862f897fdf2515fdecb0b5c403d58d182176ea83c6ac11de68bfe1 3 | size 7918908 4 | -------------------------------------------------------------------------------- /code_review/Code Review is an Architectural Necessity - Colin Dean - Winter 2022-2023.key: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:18214040151fff40c8d7af848b95d4140c7b9e1bd7b66c4a1fc3b5346d7bd9ec 3 | size 9085079 4 | -------------------------------------------------------------------------------- /code_review/Github Universe 2016/Code Review is an Architectural Necessity - Colin Dean - Github Universe 2016.key: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8ac0b42e5225cf0dcbdca86d327e63e21a6dc65f6150e7e29b2f36148b1a28be 3 | size 6495047 4 | -------------------------------------------------------------------------------- /code_review/Github Universe 2016/GithubUniverse2016.md: -------------------------------------------------------------------------------- 1 | # Code Review is an Architectural Necessity 2 | 3 | ## Abstract 4 | 5 | Code Review is not a new concept, but a specific term for an older concept -- Peer Review -- that focuses the review process on the code under examination instead of the person who submitted it. While Code Review is common in open source projects, organizations developing in private often employ inefficient, frustrating, or virtually non-existent review processes. This talk looks at Code Review from an architect's viewpoint, arguing that Code Review is an essential component in a product's architectural plan because of the quality attributes it may provide. It also covers tips and sets expectations for what Code Review can and cannot solve. 6 | 7 | ## Details 8 | 9 | The audience will: 10 | 11 | * Appreciate that many other professions are subject to rigorous review processes and accept that software must, too 12 | * Understand the difference between Code Review and Peer Review 13 | * Value tools that enable Code Review, such as Github's pull request feature 14 | * Understand the problems that Code Review solves: mental model sync and tribal knowledge development 15 | * Understand a handful of "-ility" quality attributes that Code Review delivers 16 | * Learn some tips for effective reviews and review workflows 17 | * Internalize the limitations of code review, such as not solving political problems 18 | 19 | ## Pitch 20 | I delivered a very similar talk to SATURN and it was very well-received. Several veterans of software architecture complimented me on my content and one said that I inspired him to include Code Review as an architectural step in his next project, instead of relying on his developers to whimsically do it. 21 | 22 | I am the tech lead for a component of a key Watson product: I was individually responsible for approximately 5% of Watson group revenue in 2015 (how we arrived at that is a little convoluted, ask me over beer #theydidthemath). My team does this with a very low defect rate and every line of code that goes into our project undergoes our lightweight yet thorough review process. 23 | 24 | ## Speakers 25 | 26 | Colin Dean is a software engineer at IBM Watson. He is an organizer of Code & Supply, Pittsburgh's largest developer group, and president of Meta Mesh Wireless Communities. He recently organized Abstractions software conference and lives in Pittsburgh his girlfriend and a pack of show dogs. 27 | -------------------------------------------------------------------------------- /code_review/Github Universe 2016/blog_published_links.md: -------------------------------------------------------------------------------- 1 | # Places this blog was published 2 | 3 | ## IBM Bluemix Blog - October/November 2016 4 | 5 | |Title and link|Archive link| 6 | |--------------|------------| 7 | |[Code Review is an Architectural Necessity #1: What is it and what problems does it solve?](https://www.ibm.com/blogs/bluemix/2016/10/code-review-is-architectural-necessity-part1/)|([wayback](https://web.archive.org/web/20180913024438/https://www.ibm.com/blogs/bluemix/2016/10/code-review-is-architectural-necessity-part1/)) 8 | |[Code Review is an Architectural Necessity #2: Quality attributes that code review ensures](https://www.ibm.com/blogs/bluemix/2016/10/code-review-is-architectural-necessity-part2/)|([wayback](https://web.archive.org/web/20180913024503/https://www.ibm.com/blogs/bluemix/2016/10/code-review-is-architectural-necessity-part2/)) 9 | |[Code Review is an Architectural Necessity #3: Tips for code review and its limitations](https://www.ibm.com/blogs/bluemix/2016/11/code-review-is-architectural-necessity-part3/)|([wayback](https://web.archive.org/web/20180913024555/https://www.ibm.com/blogs/bluemix/2016/11/code-review-is-architectural-necessity-part3/)) 10 | -------------------------------------------------------------------------------- /code_review/Github Universe 2016/blog_slides/colins_team_on_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/code_review/Github Universe 2016/blog_slides/colins_team_on_spectrum.png -------------------------------------------------------------------------------- /code_review/Github Universe 2016/blog_slides/five_people.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/code_review/Github Universe 2016/blog_slides/five_people.png -------------------------------------------------------------------------------- /code_review/Github Universe 2016/blog_slides/five_people_different_concepts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/code_review/Github Universe 2016/blog_slides/five_people_different_concepts.png -------------------------------------------------------------------------------- /code_review/Github Universe 2016/blog_slides/five_people_new_idea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/code_review/Github Universe 2016/blog_slides/five_people_new_idea.png -------------------------------------------------------------------------------- /code_review/Github Universe 2016/blog_slides/five_people_reordered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/code_review/Github Universe 2016/blog_slides/five_people_reordered.png -------------------------------------------------------------------------------- /code_review/Github Universe 2016/blog_slides/pairing_modalities_chart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/code_review/Github Universe 2016/blog_slides/pairing_modalities_chart.png -------------------------------------------------------------------------------- /code_review/Github Universe 2016/blog_slides/projector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/code_review/Github Universe 2016/blog_slides/projector.png -------------------------------------------------------------------------------- /code_review/Github Universe 2016/blog_slides/ranked_motivations_from_developers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/code_review/Github Universe 2016/blog_slides/ranked_motivations_from_developers.png -------------------------------------------------------------------------------- /code_review/Github Universe 2016/blog_slides/waste_power.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/code_review/Github Universe 2016/blog_slides/waste_power.png -------------------------------------------------------------------------------- /code_review/Github Universe 2016/blog_slides/westminster.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/code_review/Github Universe 2016/blog_slides/westminster.png -------------------------------------------------------------------------------- /code_review/Github Universe 2016/blog_slides/wiegers_spectrum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/code_review/Github Universe 2016/blog_slides/wiegers_spectrum.png -------------------------------------------------------------------------------- /code_review/Others/boosterconf2017.md: -------------------------------------------------------------------------------- 1 | Code Review is an Architectual Necessity 2 | ======================================== 3 | 4 | BoosterConf, 15-17 March 2017. Bergen, Norway. 5 | 6 | Abstract 7 | -------- 8 | 9 | Code Review is not a new concept, but a specific term for an older concept -- Peer Review -- that focuses the review process on the code under examination instead of the person who submitted it. While Code Review is common in open source projects, organizations developing in private often employ inefficient, frustrating, or virtually non-existent review processes. This talk looks at Code Review from an architect's viewpoint, arguing that Code Review is an essential component in a product's architectural plan because of the quality attributes it may provide in addition to the knowledge sharing and culture it encourages. It also covers tips and sets expectations for what Code Review can and cannot solve. 10 | 11 | Notes 12 | ----- 13 | 14 | The audience will: 15 | 16 | * Appreciate that many other professions are subject to rigorous review processes and accept that software must, too 17 | * Understand the difference between Code Review and Peer Review 18 | * Value tools that enable Code Review, such as Github's pull request/reviews feature 19 | * Understand the problems that Code Review solves: mental model sync and tribal knowledge development 20 | * Understand a handful of "-ility" quality attributes that Code Review delivers 21 | * Learn some tips for effective reviews and review workflows 22 | * Internalize the limitations of code review, such as not solving political problems 23 | 24 | Public review link 25 | ------------------ 26 | 27 | [CODE REVIEW IS AN ARCHITECTURAL NECESSITY](http://www.boosterconf.no/talks/736) 28 | -------------------------------------------------------------------------------- /code_review/Others/target_innercon_2019.md: -------------------------------------------------------------------------------- 1 | # Target's InnerCon 2019 2 | 3 | Code Review is not a new concept, but a specific term for an older concept -- Peer Review -- that focuses the review process on the code under examination instead of the person who submitted it. While Code Review is common in open source projects, organizations developing in private often employ inefficient, frustrating, or virtually non-existent review processes. This talk looks at Code Review from an architect's viewpoint, arguing that Code Review is an essential component in a product's architectural plan because of the quality attributes it may provide. It also covers tips and sets expectations for what Code Review can and cannot solve. 4 | 5 | The audience will: 6 | 7 | * Appreciate that many other professions are subject to rigorous review processes and accept that software must, too 8 | * Understand the difference between Code Review and Peer Review 9 | * Value tools that enable Code Review, such as Github's pull request feature 10 | * Understand the problems that Code Review solves: mental model sync and tribal knowledge development 11 | * Understand a handful of "-ility" quality attributes that Code Review delivers 12 | * Learn some tips for effective reviews and review workflows 13 | * Internalize the limitations of code review, such as not solving political problems 14 | -------------------------------------------------------------------------------- /code_review/SATURN 2016/Code Review is an Architectural Necessity - Colin Dean - SATURN 2016.key: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8c43325cb7366f5d7d02c03d009a3f08c7963abf3df7cde0d9b558348277667c 3 | size 15984471 4 | -------------------------------------------------------------------------------- /code_review/etc/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/code_review/etc/1.jpg -------------------------------------------------------------------------------- /code_review/etc/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/code_review/etc/2.jpg -------------------------------------------------------------------------------- /code_review/etc/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/code_review/etc/3.jpg -------------------------------------------------------------------------------- /code_review/etc/learning_chart.dot: -------------------------------------------------------------------------------- 1 | digraph codereview { 2 | PersonA [ label = "Learner" ] 3 | PersonB [ label = "Teacher" ] 4 | 5 | ACoding [ label = "Learning Coding" ] 6 | BCoding [ label = "Teacher Coding" ] 7 | AReviewing [ label = "Learner Reviewing" ] 8 | BReviewing [ label = "Teacher Reviewing" ] 9 | 10 | PairingTeaching [ label = "Pairing & Teaching\nLearning Together" ] 11 | Evaluation [ label = "Evaluation" ] 12 | ExemplaryReading [ label = "Exemplary Reading"] 13 | SerendipitousEvaluationOfExample [ label = "Serendipity\nCritique Of Example" ] 14 | 15 | 16 | PairingTeaching -> BCoding 17 | PairingTeaching -> ACoding 18 | 19 | Evaluation -> ACoding 20 | Evaluation -> BReviewing 21 | 22 | ExemplaryReading -> AReviewing 23 | ExemplaryReading -> BCoding 24 | 25 | SerendipitousEvaluationOfExample -> AReviewing 26 | SerendipitousEvaluationOfExample -> BReviewing 27 | 28 | overlap=false 29 | #layout=neato 30 | } 31 | -------------------------------------------------------------------------------- /code_review/etc/notes.txt: -------------------------------------------------------------------------------- 1 | https://sei.cmu.edu/saturn/2016/speaker-resource.cfm 2 | 3 | 4 | "First code review" 5 | http://classicprogrammerpaintings.tumblr.com/post/142702963264/their-first-code-review-william-frederick 6 | -------------------------------------------------------------------------------- /code_review/etc/projector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/code_review/etc/projector.png -------------------------------------------------------------------------------- /code_review/etc/projector.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/code_review/etc/projector.xcf -------------------------------------------------------------------------------- /code_review/etc/projector_scan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/code_review/etc/projector_scan.jpg -------------------------------------------------------------------------------- /code_review/etc/things_to_look_for.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/code_review/etc/things_to_look_for.jpg -------------------------------------------------------------------------------- /code_review/references_and_see-also.md: -------------------------------------------------------------------------------- 1 | # References and See Also 2 | 3 | ## See Also 4 | 5 | ### Other speakers on code review 6 | 7 | * [Amy Gebhardt](https://twitter.com/amlyhamm) 8 | * [Aaron Goldsmith](https://github.com/ausmith) 9 | * [Adrienne Tacke](https://twitter.com/AdrienneTacke) 10 | 11 | ### Presentation Slides 12 | 13 | * [How NOT To Review a Pull Request](https://github.com/ausmith/How-NOT-to-Review-a-Pull-Request) ([video](https://www.youtube.com/watch?v=sBwbUVG7CDY)) - Aaron Goldsmith (saw at Heartifacts 2018) 14 | * [Code Reviews: Now That's a Great Idea](https://web.archive.org/web/20210423145524/http://amlyhamm.com/talks/mwphp19/code-reviews/) ([video](https://www.youtube.com/watch?v=0bQsDGjDzfY)) - Amy Gebhardt (saw at Codemash 2019 and Abstractions 2019) 15 | * [Conducting Humane Code Reviews](https://web.archive.org/web/20220528191816/https://adriennetacke.github.io/conducting-humane-code-reviews/) - Adrienne Tacke (saw at Codemash 2020) 16 | 17 | ### Great articles 18 | 19 | * [How to Deal with an Insufferable Code Reviewer](https://daedtech.com/insufferable-code-reviewer/) [:file_cabinet:](https://web.archive.org/web/20221219071159/https://daedtech.com/insufferable-code-reviewer/ "Archive.org link") 20 | * [The Art of Code Review](https://redd.one/blog/the-art-of-code-review) 21 | -------------------------------------------------------------------------------- /codeandsupply_comp_survey_2022_engine/.filters/embedded_graphviz.lua: -------------------------------------------------------------------------------- 1 | -- inspired from https://github.com/pandoc/lua-filters/blob/5686d96/diagram-generator/diagram-generator.lua 2 | 3 | local dotPath = os.getenv("DOT") or "dot" 4 | 5 | local filetype = "svg" 6 | local mimetype = "image/svg+xml" 7 | 8 | local function graphviz(code, filetype) 9 | return pandoc.pipe(dotPath, {"-T" .. filetype}, code) 10 | end 11 | 12 | function CodeBlock(block) 13 | local converters = { 14 | graphviz = graphviz, 15 | } 16 | 17 | local img_converter = converters[block.classes[1]] 18 | if not img_converter then 19 | return nil 20 | end 21 | 22 | local success, img = pcall(img_converter, block.text, filetype) 23 | 24 | if not success then 25 | io.stderr:write(tostring(img)) 26 | io.stderr:write('\n') 27 | error 'Image conversion failed. Aborting.' 28 | end 29 | 30 | return pandoc.RawBlock('html', img) 31 | end 32 | 33 | return { 34 | {CodeBlock = CodeBlock}, 35 | } 36 | 37 | -------------------------------------------------------------------------------- /codeandsupply_comp_survey_2022_engine/.gitignore: -------------------------------------------------------------------------------- 1 | .peru 2 | deps 3 | presentation.html 4 | presentation.pdf 5 | -------------------------------------------------------------------------------- /codeandsupply_comp_survey_2022_engine/Brewfile: -------------------------------------------------------------------------------- 1 | brew 'peru' 2 | brew 'entr' 3 | brew 'pandoc' 4 | brew 'make' 5 | brew 'miniserve' 6 | brew 'hivemind' 7 | brew 'graphviz' 8 | brew 'npm' 9 | brew 'asciinema' 10 | -------------------------------------------------------------------------------- /codeandsupply_comp_survey_2022_engine/Makefile: -------------------------------------------------------------------------------- 1 | PRESENTATION = presentation 2 | MARKDOWN = $(PRESENTATION).md 3 | HTML = $(MARKDOWN:md=html) 4 | PDF = $(MARKDOWN:md=pdf) 5 | 6 | DEPS_DIR = deps 7 | 8 | REVEALJS_VERSION = $(shell basename -s .zip $(shell yaml2json peru.yaml | jq -r '.["curl module revealjs"].url')) 9 | 10 | ##@ Utility 11 | 12 | .PHONY: help 13 | help: ## Display this help 14 | @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z0-9_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) 15 | 16 | ##@ Setup 17 | 18 | .PHONY: deps 19 | deps: peru.yaml Brewfile ## Install dependencies 20 | brew bundle --verbose 21 | peru sync 22 | 23 | ##@ Presenting 24 | 25 | all: $(HTML) $(PDF) ## Build all artifacts 26 | 27 | html: $(HTML) ## Make the presentation reveal.js HTML 28 | 29 | open-and-serve: $(HTML) ## Start a server and open the presentation in a browser 30 | open http://localhost:8080/$(HTML) 31 | miniserve . 32 | 33 | ##@ Development 34 | 35 | automatic-regen: ## Use entr to automatically remake the file 36 | echo $(MARKDOWN) | entr -acpr make $(HTML) 37 | 38 | watch: Procfile ## Use hivemind for constant building, run open first 39 | hivemind Procfile 40 | 41 | ##@ Cleanup 42 | 43 | clean: 44 | rm -f $(HTML) $(PDF) $(PDF_SERVER_PIDFILE) 45 | 46 | %.html: %.md Makefile 47 | pandoc -t revealjs -s $< -o $@ \ 48 | -L .filters/embedded_graphviz.lua \ 49 | -M revealjs-url=$(DEPS_DIR)/reveal.js/reveal.js-$(REVEALJS_VERSION) 50 | 51 | .PHONY: pdf 52 | pdf: $(PDF) ## Build a PDF 53 | 54 | HOST_INSIDE_DOCKER=host.docker.internal 55 | FONTS=$(HOME)/Library/Fonts 56 | PDF_SERVER_PIDFILE=.miniserve.pdf.pid 57 | 58 | $(PDF_SERVER_PIDFILE): 59 | miniserve -p 20871 . & echo $$! > .miniserve.pdf.pid 60 | 61 | $(PDF): $(HTML) $(PDF_SERVER_PIDFILE) 62 | docker run --platform=linux/amd64 --rm -t --net=host \ 63 | -v "$(shell pwd):/slides" \ 64 | -v "$(FONTS):/home/node/.local/share/fonts" \ 65 | astefanutti/decktape --size 1920x1080 http://$(HOST_INSIDE_DOCKER):20871/$(HTML) $@ 66 | 67 | kill `cat $(PDF_SERVER_PIDFILE)` && rm -rf $(PDF_SERVER_PIDFILE) 68 | -------------------------------------------------------------------------------- /codeandsupply_comp_survey_2022_engine/Procfile: -------------------------------------------------------------------------------- 1 | serve: miniserve . 2 | watch: echo presentation.md | entr -apr make presentation.html 3 | -------------------------------------------------------------------------------- /codeandsupply_comp_survey_2022_engine/README.md: -------------------------------------------------------------------------------- 1 | # Code & Supply Comp Survey Data Engineering talk 2 | 3 | ## Contributing 4 | 5 | Should work fine in WSL — tested — but built on macOS. 6 | 7 | ### Setup 8 | 9 | Prereqs: 10 | 11 | * Homebrew 12 | * `brew install git-lfs` to be able to clone the repo correctly. 13 | 14 | To install stuff: 15 | 16 | make deps 17 | 18 | ### Adding 19 | 20 | Watch the build with 21 | 22 | make watch 23 | 24 | And connect on . 25 | The presentation will rebuild on save. 26 | 27 | It's a [reveal.js](https://revealjs.com) presentation under the hood, compiled with Pandoc (who but). 28 | 29 | Always make sure that it builds before committing! 30 | 31 | :warning: **Always prefix commits with `[codeandsupply_comp_survey_2022_engine]`** 32 | so that I know what commits touch what presentation when looking at the logs. 33 | -------------------------------------------------------------------------------- /codeandsupply_comp_survey_2022_engine/peru.yaml: -------------------------------------------------------------------------------- 1 | imports: 2 | revealjs: deps/reveal.js 3 | fontawesome: deps/font-awesome 4 | asciinema-player-css: deps/asciinema-player 5 | asciinema-player-js: deps/asciinema-player 6 | 7 | curl module revealjs: 8 | url: https://github.com/hakimel/reveal.js/archive/5.0.4.zip 9 | unpack: zip 10 | 11 | curl module fontawesome: 12 | url: https://github.com/FortAwesome/Font-Awesome/releases/download/6.5.1/fontawesome-free-6.5.1-web.zip 13 | unpack: zip 14 | 15 | curl module asciinema-player-css: 16 | url: https://github.com/asciinema/asciinema-player/releases/download/v3.6.3/asciinema-player.css 17 | 18 | curl module asciinema-player-js: 19 | url: https://github.com/asciinema/asciinema-player/releases/download/v3.6.3/asciinema-player.min.js 20 | -------------------------------------------------------------------------------- /codeandsupply_comp_survey_2022_engine/submissions.md: -------------------------------------------------------------------------------- 1 | # Code & Supply Compensation Survey Report 2022-2023 Engine Review Submissions 2 | 3 | ## PyCon US 2025 4 | 5 | ### Title 6 | 7 | Data Engineering the Pittsburgh Code & Supply Compensation Survey Report 8 | 9 | ### Description 10 | 11 | Code & Supply invested in building a data analysis and document authorship pipeline to produce its latest Compensation Survey Report. Building on its experience in previous iterations, C&S used Python, Jupyter notebooks, pandas, Polars, Plotly, pandoc, and many other tools to analyze responses from more than 800 people and produce a more than 100-page report. In this presentation, we'll will discuss the survey and analysis effort, which can serve as an example of how to get started doing data science, building consistent data visualizations, and collaborating on a large scientific paper. We swear this isn't a Polars hype talk, but you'll leave wanting to use it. 12 | 13 | ### Outline 14 | 15 | Intro & C&S overview 16 | Comp Survey history 17 | data collection 18 | data cleaning 19 | analysis workflow 20 | pandas -> polars 21 | tools for writing a report using markdown 22 | ci/cd 23 | 24 | 2-4 minutes each, a little longer for the polars section. 25 | 26 | ## FOSDEM 2025 27 | 28 | _Same as Stir Trek submission_ 29 | 30 | ## [Winterhack 5](https://web.archive.org/web/20240225025854/http://www.winterhack.space/) (Feb 2024) :white_check_mark: 31 | 32 | _Invited speaker_ 33 | 34 | ## Stir Trek 2024 :no_entry: 35 | 36 | ### Title 37 | 38 | Data Engineering the Code & Supply Compensation Survey Report 39 | 40 | ### Description 41 | 42 | Code & Supply invested in building a data analysis and document authorship pipeline to produce its latest Compensation Survey Report. 43 | Building on its experience in previous iterations, C&S used Python, Jupyter notebooks, pandas, Polars, Plotly, pandoc, and many other tools to analyze responses from more than 800 people and produce a more than 100-page report. 44 | In this presentation, we'll will discuss the survey and analysis effort, which can serve as an example of how to get started doing data science, building consistent data visualizations, and collaborating on a large scientific paper. 45 | We swear this isn't a Polars hype talk, but you'll leave wanting to use it. 46 | -------------------------------------------------------------------------------- /document_workflow/.filters/embedded_graphviz.lua: -------------------------------------------------------------------------------- 1 | -- inspired from https://github.com/pandoc/lua-filters/blob/5686d96/diagram-generator/diagram-generator.lua 2 | 3 | local dotPath = os.getenv("DOT") or "dot" 4 | 5 | local filetype = "svg" 6 | local mimetype = "image/svg+xml" 7 | 8 | local function graphviz(code, filetype) 9 | return pandoc.pipe(dotPath, {"-T" .. filetype}, code) 10 | end 11 | 12 | function CodeBlock(block) 13 | local converters = { 14 | graphviz = graphviz, 15 | } 16 | 17 | local img_converter = converters[block.classes[1]] 18 | if not img_converter then 19 | return nil 20 | end 21 | 22 | local success, img = pcall(img_converter, block.text, filetype) 23 | 24 | if not success then 25 | io.stderr:write(tostring(img)) 26 | io.stderr:write('\n') 27 | error 'Image conversion failed. Aborting.' 28 | end 29 | 30 | return pandoc.RawBlock('html', img) 31 | end 32 | 33 | return { 34 | {CodeBlock = CodeBlock}, 35 | } 36 | -------------------------------------------------------------------------------- /document_workflow/.gitignore: -------------------------------------------------------------------------------- 1 | reveal.js 2 | font-awesome 3 | Brewfile.lock.json 4 | .peru 5 | *html 6 | *pdf 7 | deps 8 | node_modules 9 | package.json 10 | package-lock.json 11 | 12 | -------------------------------------------------------------------------------- /document_workflow/Brewfile: -------------------------------------------------------------------------------- 1 | brew 'peru' 2 | brew 'pandoc' 3 | brew 'make' 4 | brew 'miniserve' 5 | brew 'hivemind' 6 | brew 'graphviz' 7 | -------------------------------------------------------------------------------- /document_workflow/Makefile: -------------------------------------------------------------------------------- 1 | PRESENTATION = document_workflow 2 | MARKDOWN = $(PRESENTATION).md 3 | HTML = $(MARKDOWN:md=html) 4 | PDF = $(MARKDOWN:md=pdf) 5 | 6 | DEPS_DIR = deps 7 | 8 | REVEALJS_VERSION = $(shell basename -s .zip $(shell yaml2json peru.yaml | jq -r '.["curl module revealjs"].url')) 9 | 10 | ##@ Utility 11 | 12 | .PHONY: help 13 | help: ## Display this help 14 | @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z0-9_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) 15 | 16 | ##@ Setup 17 | 18 | .PHONY: deps 19 | deps: peru.yaml Brewfile ## Install dependencies 20 | brew bundle --verbose 21 | peru sync 22 | npm install nicollet-tokens 23 | 24 | ##@ Presenting 25 | 26 | all: $(HTML) $(PDF) ## Build all artifacts 27 | 28 | html: $(HTML) ## Make the presentation reveal.js HTML 29 | 30 | open-and-serve: $(HTML) ## Start a server and open the presentation in a browser 31 | open http://localhost:8080/$(HTML) 32 | miniserve . 33 | 34 | automatic-regen: ## Automatically regenerate on changes 35 | echo $(MARKDOWN) | entr -acpr make $(HTML) 36 | 37 | watch: Procfile ## Serve and regenerate on changes 38 | hivemind Procfile 39 | 40 | clean: 41 | rm -f $(HTML) $(PDF) $(PDF_SERVER_PIDFILE) 42 | 43 | %.html: %.md Makefile 44 | pandoc -t revealjs -s $< -o $@ \ 45 | -L .filters/embedded_graphviz.lua \ 46 | -M revealjs-url=$(DEPS_DIR)/reveal.js/reveal.js-$(REVEALJS_VERSION) 47 | 48 | .PHONY: pdf 49 | pdf: $(PDF) ## Build a PDF 50 | 51 | HOST_INSIDE_DOCKER=host.docker.internal 52 | FONTS=$(HOME)/Library/Fonts 53 | PDF_SERVER_PIDFILE=.miniserve.pdf.pid 54 | 55 | $(PDF_SERVER_PIDFILE): 56 | miniserve -p 20871 . & echo $$! > .miniserve.pdf.pid 57 | 58 | $(PDF): $(HTML) $(PDF_SERVER_PIDFILE) 59 | docker run --rm -t --net=host \ 60 | -v "$(shell pwd):/slides" \ 61 | -v "$(FONTS):/home/node/.local/share/fonts" \ 62 | astefanutti/decktape --size 1920x1080 http://$(HOST_INSIDE_DOCKER):20871/$(HTML) $@ 63 | 64 | kill `cat $(PDF_SERVER_PIDFILE)` && rm -rf $(PDF_SERVER_PIDFILE) 65 | -------------------------------------------------------------------------------- /document_workflow/Procfile: -------------------------------------------------------------------------------- 1 | serve: miniserve . 2 | watch: echo document_workflow.md | entr -apr make document_workflow.html 3 | 4 | -------------------------------------------------------------------------------- /document_workflow/README.md: -------------------------------------------------------------------------------- 1 | # Document Workflow 2 | 3 | Or, "An open-source documentation workflow loved by both Data Scientists and Engineers" 4 | 5 | ## Submissions & Recordings 6 | 7 | See [submissions.md](submissions.md). 8 | 9 | ## Written versions 10 | 11 | * [Executing a Documentation Workflow](https://web.archive.org/web/20220412044422/https://tech.target.com/blog/executing-a-documentation-workflow). Target Tech, 2022. 12 |
bibtex-formatted citation 13 | 14 | ```bibtex 15 | @online{Dean-DocWfEx-2022, 16 | author={Dean, Colin}, 17 | title={Executing a Documentation Workflow}, 18 | date={2022-04-06}, 19 | organization={Target Corporation}, 20 | url={https://web.archive.org/web/20220412044422/https://tech.target.com/blog/executing-a-documentation-workflow}, 21 | urldate={2022-04-12}, 22 | } 23 | ``` 24 | 25 |
26 | 27 | * [Requirements for creating a documentation workflow loved by both Data Scientists and Engineers](https://web.archive.org/web/20220408055017/https://tech.target.com/blog/requirements-for-creating-a-documentation-workflow). Target Tech, 2022. 28 |
bibtex-formatted citation 29 | 30 | ```bibtex 31 | @online{Dean-DocWfReq-2022, 32 | author={Dean, Colin}, 33 | title={Requirements for creating a documentation workflow loved by both Data Scientists and Engineers}, 34 | date={2022-04-06}, 35 | organization={Target Corporation}, 36 | url={https://web.archive.org/web/20220408055017/https://tech.target.com/blog/requirements-for-creating-a-documentation-workflow}, 37 | urldate={2022-04-12}, 38 | } 39 | ``` 40 | 41 |
42 | -------------------------------------------------------------------------------- /document_workflow/colindean_bust_hat_codemash2020_circle.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/document_workflow/colindean_bust_hat_codemash2020_circle.webp -------------------------------------------------------------------------------- /document_workflow/custom.css: -------------------------------------------------------------------------------- 1 | @import "deps/font-awesome/fontawesome-free-6.0.0-web/css/all.min.css"; 2 | @import "node_modules/nicollet-tokens/lib/colors.css"; 3 | @import "node_modules/nicollet-tokens/lib/font.css"; 4 | 5 | .reveal h1, 6 | .reveal h2, 7 | .reveal h3, 8 | .reveal h4, 9 | .reveal h5, 10 | .reveal h6 11 | .reveal figcaption { 12 | font-family: var(--nds-font-family-sans-serif); 13 | } 14 | 15 | .reveal p, .reveal li { 16 | color: var(--nds-colors-text-on-light-primary); 17 | font-family: var(--nds-font-family-sans-serif); 18 | } 19 | .reveal small > em { 20 | color: var(--nds-colors-text-on-light-secondary); 21 | } 22 | 23 | .reveal h1, 24 | .reveal h1.title p { 25 | color: var(--nds-colors-messaging-promotion); 26 | } 27 | 28 | .reveal h1 { 29 | font-size: 2.3em; 30 | } 31 | .reveal h1.title p { 32 | font-size: 0.8em; 33 | } 34 | 35 | .wordcloud ul li { 36 | display: inline; 37 | } 38 | 39 | .wordcloud ul li:nth-child(n+2)::before { 40 | content:'\00a0\00a0'; 41 | } 42 | 43 | .wordcloud ul li:nth-child(2n) { 44 | color: var(--nds-colors-text-on-light-secondary); 45 | } 46 | 47 | .wordcloud .pandoc, .wordcloud .git, .wordcloud .xetex, .wordcloud .make{ 48 | font-size: 150%; 49 | } 50 | .wordcloud .librsvg, .wordcloud .proselint, .wordcloud .tectonic, .wordcloud .docker, .wordcloud .pandocker { 51 | font-size: 80%; 52 | } 53 | 54 | .reveal .bigquote { 55 | font-size: 0.5em; 56 | } 57 | -------------------------------------------------------------------------------- /document_workflow/example_pdf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/document_workflow/example_pdf.png -------------------------------------------------------------------------------- /document_workflow/notes.md: -------------------------------------------------------------------------------- 1 | # Talking points 2 | 3 | ## Values 4 | 5 | * Content-focused 6 | * Minimize structural exceptions 7 | * Standardized styling and typesetting 8 | * Reviewable prose and diagrams 9 | * Accomodate some preferences for LaTeX over simpler formats (Markdown) 10 | * One command to generate output 11 | * Automatable with versioned, single master copy 12 | 13 | ## Pain points 14 | 15 | * WYSIWYG 16 | * Install with package manager or install docker and pull container 17 | * Converting from Word, etc. loses cross-references 18 | * Markdown is well-known but so many orgs have their own flavors, Pandoc is just another one 19 | * New software has bugs, including gaps in the workflow 20 | * E.g. Build hang when steps aren't followed 21 | * Equation writing workflow may be cumbersome 22 | * Use an editor supporting preview with math rendering (Macdown and Mou both do) OR 23 | * Use a separate renderer to test your equations 24 | * Latexit 25 | * MathJax website 26 | * just render the document with pandoc via `make pdf` or `make open`. 27 | 28 | ## Accomodating objections 29 | 30 | * I want to use X 31 | * "But I want to use LaTeX" - only if you'll own that file! 32 | * "But I want to write my section in X and export it to Pandoc Markdown" - only if you can effect changes suggested in the PR 33 | * Overwriting is a real concern with exporting: changes made to a file in the repo getting overwritten by an external tool's export cost us a lot of time 34 | 35 | 36 | # See Also 37 | 38 | * [Using knitr and pandoc to create reproducible scientific reports](http://galahad.well.ox.ac.uk/repro/) 39 | -------------------------------------------------------------------------------- /document_workflow/peru.yaml: -------------------------------------------------------------------------------- 1 | imports: 2 | revealjs: deps/reveal.js 3 | fontawesome: deps/font-awesome 4 | 5 | curl module revealjs: 6 | url: https://github.com/hakimel/reveal.js/archive/4.3.0.zip 7 | unpack: zip 8 | 9 | curl module fontawesome: 10 | url: https://github.com/FortAwesome/Font-Awesome/releases/download/6.0.0/fontawesome-free-6.0.0-web.zip 11 | unpack: zip 12 | 13 | -------------------------------------------------------------------------------- /esperanto/Esperanto in an Hour.key: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:13ee3d0033e32c6fe545a3291cf17a40d1976ef7bd1c848ed58c80b0b82c366a 3 | size 16357715 4 | -------------------------------------------------------------------------------- /esperanto/Flag_of_Esperanto.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/esperanto/Flag_of_Esperanto.png -------------------------------------------------------------------------------- /esperanto/Flag_of_Esperanto.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /esperanto/Flag_of_Esperanto2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/esperanto/Flag_of_Esperanto2.png -------------------------------------------------------------------------------- /esperanto/Jubilea_simbolo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/esperanto/Jubilea_simbolo.png -------------------------------------------------------------------------------- /esperanto/Verda_Stelo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/esperanto/Verda_Stelo.png -------------------------------------------------------------------------------- /intro_to_git/.gitignore: -------------------------------------------------------------------------------- 1 | .peru 2 | *.html 3 | deps 4 | Brewfile.lock.json 5 | -------------------------------------------------------------------------------- /intro_to_git/Brewfile: -------------------------------------------------------------------------------- 1 | brew 'peru' 2 | brew 'pandoc' 3 | brew 'make' 4 | brew 'miniserve' 5 | brew 'graphviz' 6 | 7 | -------------------------------------------------------------------------------- /intro_to_git/Makefile: -------------------------------------------------------------------------------- 1 | PRESENTATION = intro_to_git 2 | HTML = $(PRESENTATION).html 3 | 4 | DEPS_DIR = deps 5 | 6 | all: $(HTML) 7 | 8 | serve: $(HTML) 9 | open http://localhost:8080/$(HTML) 10 | miniserve . 11 | 12 | deps: 13 | brew bundle 14 | peru sync 15 | 16 | clean: 17 | rm -f $(HTML) 18 | 19 | %.html: %.md 20 | pandoc -t revealjs -s $< -o $@ \ 21 | -M revealjs-url=$(DEPS_DIR)/reveal.js/reveal.js-3.9.2 \ 22 | --lua-filter embedded_graphviz.lua 23 | -------------------------------------------------------------------------------- /intro_to_git/README.md: -------------------------------------------------------------------------------- 1 | # Intro to Git 2 | 3 | ## Setup 4 | 5 | Ensure that [Homebrew](https://brew.sh) is already installed. 6 | 7 | make deps 8 | 9 | ## Building 10 | 11 | make 12 | 13 | ## Presenting 14 | 15 | make open 16 | 17 | You may need to reload and you can only have one session running. You could 18 | alternatively run `miniserve` in the background with 19 | 20 | miniserve . -p 8080 & 21 | 22 | Ports suck so you're on your own for choosing a port if 8080 has something else 23 | running on it. 24 | -------------------------------------------------------------------------------- /intro_to_git/custom.css: -------------------------------------------------------------------------------- 1 | @import "deps/font-awesome/fontawesome-free-5.13.0-web/css/all.min.css"; 2 | -------------------------------------------------------------------------------- /intro_to_git/embedded_graphviz.lua: -------------------------------------------------------------------------------- 1 | -- insprired from https://github.com/pandoc/lua-filters/blob/5686d96/diagram-generator/diagram-generator.lua 2 | 3 | local dotPath = os.getenv("DOT") or "dot" 4 | 5 | local filetype = "svg" 6 | local mimetype = "image/svg+xml" 7 | 8 | local function graphviz(code, filetype) 9 | return pandoc.pipe(dotPath, {"-T" .. filetype}, code) 10 | end 11 | 12 | function CodeBlock(block) 13 | local converters = { 14 | graphviz = graphviz, 15 | } 16 | 17 | local img_converter = converters[block.classes[1]] 18 | if not img_converter then 19 | return nil 20 | end 21 | 22 | local success, img = pcall(img_converter, block.text, filetype) 23 | 24 | if not success then 25 | io.stderr:write(tostring(img)) 26 | io.stderr:write('\n') 27 | error 'Image conversion failed. Aborting.' 28 | end 29 | 30 | return pandoc.RawBlock('html', img) 31 | end 32 | 33 | return { 34 | {CodeBlock = CodeBlock}, 35 | } 36 | -------------------------------------------------------------------------------- /intro_to_git/peru.yaml: -------------------------------------------------------------------------------- 1 | imports: 2 | revealjs: deps/reveal.js 3 | fontawesome: deps/font-awesome 4 | 5 | curl module revealjs: 6 | # url: https://github.com/hakimel/reveal.js/archive/master.zip 7 | # have to use 3.9.2 because the repo layout changed in 4.0.0 8 | # and pandoc hasn't caught up yet as of the creation of this deck 9 | url: https://github.com/hakimel/reveal.js/archive/3.9.2.zip 10 | unpack: zip 11 | 12 | curl module fontawesome: 13 | url: https://use.fontawesome.com/releases/v5.13.0/fontawesome-free-5.13.0-web.zip 14 | unpack: zip 15 | 16 | -------------------------------------------------------------------------------- /intro_to_mesh_networking/Intro to Mesh Networking.key: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2da66cb3d7a2d675001b1b9aa56776c64783f0f6c4a0be1e28c985008570234d 3 | size 5453123 4 | -------------------------------------------------------------------------------- /intro_to_plaintextaccounting/Makefile: -------------------------------------------------------------------------------- 1 | COLOR = --color --force-color 2 | AHA = aha --stylesheet 3 | 4 | %.html: %.ledger 5 | ledger $(COLOR) -f $< balance | $(AHA) --title "ledger -f $< balance" > bal-$@ 6 | ledger $(COLOR) -f $< register | $(AHA) --title "ledger -f $< register" > reg-$@ 7 | ledger $(COLOR) -f $< accounts | $(AHA) --title "ledger -f $< accounts" > acct-$@ 8 | ledger $(COLOR) -f $< payees | $(AHA) --title "ledger -f $< payees" > payees-$@ 9 | ledger $(COLOR) -f $< balance ^Assets ^Liabilities | $(AHA) --title "ledger -f $< balance ^Assets ^Liabilities #networth" > networth-$@ 10 | ledger $(COLOR) -f $< balance ^Income ^Expenses | $(AHA) --title "ledger -f $< balance ^Income ^Expenses #cashflow" > cashflow-$@ 11 | bash build_html.sh $< $@ 12 | 13 | all: exercise1.html examples.html 14 | 15 | clean: 16 | rm *.html 17 | 18 | .PHONY: clean 19 | -------------------------------------------------------------------------------- /intro_to_plaintextaccounting/build_html.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | input=$1 4 | output=$2 5 | 6 | if [[ -z $output ]]; then 7 | echo Needs an output file 8 | exit 1 9 | fi 10 | 11 | echo "$(basename $output)" > $output 12 | 13 | echo -e "

$input

$(cat $input)
" >> $output 14 | 15 | for file in `ls *-$output`; do 16 | title=$(xmlstarlet sel -t -v '/_:html/_:head/_:title/text()' "$file" ) 17 | content=$(xmlstarlet sel -t -c '/_:html/_:body/_:pre/node()' "$file" ) 18 | echo -e "

$title

$title\n$content
" >> $output 19 | rm $file 20 | done 21 | 22 | echo "" >> $output 23 | -------------------------------------------------------------------------------- /intro_to_plaintextaccounting/examples.ledger: -------------------------------------------------------------------------------- 1 | 2017-06-20 Opening Balances 2 | Assets:Cash:Wallet 3.50 3 | Assets:Cash:Bank:Checking 536.35 4 | Assets:Cash:Bank:Savings 3014.12 5 | Liabilities:CreditCards:Costco -235.13 6 | Equity:OpeningBalances 7 | 8 | 2017-06-26 Commonplace Coffee 9 | Expenses:Restaurants:Coffee 3.00 10 | Assets:Cash:Wallet -3.00 11 | 12 | 2017-06-27 Commonplace Coffee 13 | Expenses:Restaurants:Coffee 3.00 14 | Assets:Cash:Wallet 15 | 16 | 2017-06-27 Commonplace Coffee 17 | ; cold brew 18 | Expenses:Restaurants:Coffee 3.00 19 | Liabilities:CreditCards:Costco 20 | 21 | 2017-06-30 Spacely Sprockets 22 | ; payday! 23 | Income:SpacelySprockets -2000.00 24 | Assets:Cash:Bank:Checking 2000.00 25 | 26 | 2017-07-15 Spacely Sprockets 27 | ; payday! 28 | Income:SpacelySprockets -2000.00 29 | Assets:Cash:Bank:Checking 2000.00 30 | 31 | 2017-07-15 Transfer to Savings 32 | Assets:Cash:Bank:Checking -100.00 33 | Assets:Cash:Bank:Savings 100.00 34 | 35 | 2017-07-30 Spacely Sprockets 36 | ; payday with taxes 37 | Income:SpacelySprockets -2735.00 38 | Expenses:Taxes:Federal:EIT 500.00 39 | Expenses:Taxes:Federal:FICA 200.00 40 | Expenses:Taxes:State:EIT 35.00 41 | Assets:Cash:Bank:Checking 2000.00 42 | -------------------------------------------------------------------------------- /intro_to_plaintextaccounting/exercise1.ledger: -------------------------------------------------------------------------------- 1 | 2017-06-26 Opening Balances 2 | Assets:Cash:Bank:Checking 500.00 3 | Assets:Cash:Bank:Savings 1500.00 4 | Liabilities:CreditCards:Costco -61.25 5 | Equity:OpeningBalances 6 | 7 | 2017-06-27 Commonplace Coffee 8 | ; cold brew 9 | Expenses:Restaurants:Coffee 3.00 10 | Liabilities:CreditCards:Costco 11 | 12 | 2017-07-15 Spacely Sprockets 13 | ; payday! 14 | Income:SpacelySprockets -2000.00 15 | Assets:Cash:Bank:Checking 2000.00 16 | 17 | 2017-07-15 Transfer to Savings 18 | Assets:Cash:Bank:Checking -100.00 19 | Assets:Cash:Bank:Savings 100.00 20 | -------------------------------------------------------------------------------- /intro_to_plaintextaccounting/exercise2.ledger: -------------------------------------------------------------------------------- 1 | 2017-07-01 Vanguard 2 | Assets:Cash:Bank:Checking -1000 USD 3 | Assets:Investments:Vanguard:RothIRA 8.03535 VTI @ 124.45 USD 4 | 5 | 2017-07-16 Vanguard 6 | Assets:Cash:Bank:Checking 7 | Assets:Investments:Vanguard:RothIRA 0.90535 VTI @ 125.56 USD 8 | -------------------------------------------------------------------------------- /intro_to_plaintextaccounting/exercise2.pricedb: -------------------------------------------------------------------------------- 1 | P 2017/07/01 16:00:00 VTI 124.45 USD 2 | P 2017/07/03 16:00:00 VTI 125.75 USD 3 | P 2017/07/05 16:00:00 VTI 128.89 USD 4 | P 2017/07/07 16:00:00 VTI 139.66 USD 5 | P 2017/07/09 16:00:00 VTI 133.45 USD 6 | P 2017/07/11 16:00:00 VTI 128.58 USD 7 | -------------------------------------------------------------------------------- /intro_to_plaintextaccounting/exercise3.ledger: -------------------------------------------------------------------------------- 1 | ~ Monthly 2 | Expenses:Restaurants:Coffee 30.00 USD 3 | Expenses:Restaurants:Lunch 100.00 USD 4 | Expenses:Coworking 50.00 USD 5 | Expenses:Groceries 600.00 USD 6 | Expenses:Phone 100.00 USD 7 | Expenses:House:Utilities 150.00 USD 8 | Liabilities:Mortgage 600.00 USD 9 | Expenses:Movies 50.00 USD 10 | Expenses:Auto:Insurance 150.00 USD 11 | Expenses:Auto:Gasoline 120.00 USD 12 | Expenses:Taxes 3000.00 USD 13 | Expenses 200.00 USD ; all other expenses 14 | Assets 15 | 16 | ~ Yearly 17 | Expenses:Auto:Repair 1500.00 USD 18 | Expenses:House:Insurance 800.00 USD 19 | Assets 20 | 21 | 2017-06-01 Mortgage 22 | Liabilities:Mortgage 580.00 USD 23 | Assets:Cash:Bank:Checking 24 | 25 | 2017-06-26 Commonplace Coffee 26 | Expenses:Restaurants:Coffee 3.00 USD 27 | Assets:Cash:Wallet 28 | 29 | 2017-06-26 Whole Foods 30 | Expenses:Restaurants:Lunch 15.00 USD 31 | Liabilities:CreditCards:Costco 32 | 33 | 2017-07-30 Spacely Sprockets 34 | ; payday with taxes 35 | Income:SpacelySprockets -2735.00 USD 36 | Expenses:Taxes:Federal:EIT 500.00 USD 37 | Expenses:Taxes:Federal:FICA 200.00 USD 38 | Expenses:Taxes:State:EIT 35.00 USD 39 | Assets:Cash:Bank:Checking 2000.00 USD 40 | -------------------------------------------------------------------------------- /intro_to_plaintextaccounting/images/Twitter_bird_logo_2012.svg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/intro_to_plaintextaccounting/images/Twitter_bird_logo_2012.svg.png -------------------------------------------------------------------------------- /intro_to_plaintextaccounting/images/pennybags-emptypockets-hq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/intro_to_plaintextaccounting/images/pennybags-emptypockets-hq.png -------------------------------------------------------------------------------- /intro_to_plaintextaccounting/images/pennybags-emptypockets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/intro_to_plaintextaccounting/images/pennybags-emptypockets.png -------------------------------------------------------------------------------- /intro_to_plaintextaccounting/images/pennybags-faint.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/intro_to_plaintextaccounting/images/pennybags-faint.jpg -------------------------------------------------------------------------------- /intro_to_plaintextaccounting/images/reddit-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/intro_to_plaintextaccounting/images/reddit-logo.png -------------------------------------------------------------------------------- /intro_to_plaintextaccounting/plaintextaccounting - square.key: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:15d34dca1c35a78936cbd9c5d1303176daa95e4fc2146e6738be0d6149e6e5d1 3 | size 18544127 4 | -------------------------------------------------------------------------------- /intro_to_plaintextaccounting/plaintextaccounting.key: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c93ca2bbe0586da04a065e283d8de1bc611884365a9e147d15105081a36d661c 3 | size 20114446 4 | -------------------------------------------------------------------------------- /intro_to_plaintextaccounting/styles.css: -------------------------------------------------------------------------------- 1 | .reset {color: black;} 2 | .bg-reset {background-color: white;} 3 | .inverted {color: white;} 4 | .bg-inverted {background-color: black;} 5 | .dimgray {color: dimgray;} 6 | .red {color: red;} 7 | .green {color: green;} 8 | .yellow {color: olive;} 9 | .blue {color: blue;} 10 | .purple {color: purple;} 11 | .cyan {color: teal;} 12 | .white {color: gray;} 13 | .bg-black {background-color: black;} 14 | .bg-red {background-color: red;} 15 | .bg-green {background-color: green;} 16 | .bg-yellow {background-color: olive;} 17 | .bg-blue {background-color: blue;} 18 | .bg-purple {background-color: purple;} 19 | .bg-cyan {background-color: teal;} 20 | .bg-white {background-color: gray;} 21 | .underline {text-decoration: underline;} 22 | .bold {font-weight: bold;} 23 | .blink {text-decoration: blink;} 24 | 25 | body { 26 | font-size: 36pt; 27 | } 28 | 29 | h1, pre { 30 | font-family: "Input Mono", monospace; 31 | } 32 | -------------------------------------------------------------------------------- /intro_to_plaintextaccounting/timekeeping.ledger: -------------------------------------------------------------------------------- 1 | i 2017/06/23 09:15:00 CodeAndSupply:Talks [Plain Text Accounting] 2 | o 2017/06/23 10:00:00 3 | 4 | i 2017/07/09 20:15:00 CodeAndSupply:Talks [Plain Text Accounting] 5 | o 2017/07/10 00:06:48 6 | 7 | i 2017/07/11 22:00:00 CodeAndSupply:Email [Uptime Sponsorship] 8 | o 2017/07/11 22:15:00 9 | 10 | i 2017/07/11 22:15:00 CodeAndSupply:Talks [Plain Text Accounting] 11 | o 2017/07/12 00:06:00 12 | 13 | 14 | i 2017/05/09 09:15:00 Billable:Meeting 15 | o 2017/05/09 10:00:00 16 | 17 | i 2017/05/09 10:00:00 Billable:Development [Front end] 18 | o 2017/05/09 18:15:00 19 | 20 | i 2017/05/10 08:15:00 Billable:Development [Front end] 21 | o 2017/05/10 17:15:00 22 | 23 | i 2017/05/11 08:00:00 Away:Vacation 24 | o 2017/05/11 17:00:00 25 | 26 | i 2017/05/12 09:00:00 Nonbillable:Training 27 | o 2017/05/12 16:00:00 28 | 29 | i 2017/05/12 16:00:00 Away:DoctorAppt 30 | o 2017/05/12 17:00:00 31 | -------------------------------------------------------------------------------- /intro_to_plaintextaccounting/workshop/0100_dependencies.md: -------------------------------------------------------------------------------- 1 | # MOVED 2 | 3 | The Plain Text Accounting Workshop moved to: 4 | 5 | https://github.com/colindean/plaintextaccounting_workshop 6 | 7 | See 8 | 9 | https://github.com/colindean/plaintextaccounting_workshop/releases/latest 10 | 11 | for the latest release of the workshop 12 | 13 | or 14 | 15 | https://github.com/colindean/plaintextaccounting_workshop/blob/2020.07.24.0/0100_dependencies.md 16 | 17 | for a snapshot of this document as of the first release of the workshop. 18 | -------------------------------------------------------------------------------- /intro_to_plaintextaccounting/workshop/README.md: -------------------------------------------------------------------------------- 1 | # MOVED 2 | 3 | The Plain Text Accounting Workshop moved to: 4 | 5 | https://github.com/colindean/plaintextaccounting_workshop 6 | 7 | See 8 | 9 | https://github.com/colindean/plaintextaccounting_workshop/releases/latest 10 | 11 | for the latest release of the workshop 12 | 13 | or 14 | 15 | https://github.com/colindean/plaintextaccounting_workshop/blob/2020.07.24.0/0100_dependencies.md 16 | 17 | for a snapshot of this document as of the first release of the workshop. 18 | -------------------------------------------------------------------------------- /make_python_devex/.filters/embedded_graphviz.lua: -------------------------------------------------------------------------------- 1 | -- inspired from https://github.com/pandoc/lua-filters/blob/5686d96/diagram-generator/diagram-generator.lua 2 | 3 | local dotPath = os.getenv("DOT") or "dot" 4 | 5 | local filetype = "svg" 6 | local mimetype = "image/svg+xml" 7 | 8 | local function graphviz(code, filetype) 9 | return pandoc.pipe(dotPath, {"-T" .. filetype}, code) 10 | end 11 | 12 | function CodeBlock(block) 13 | local converters = { 14 | graphviz = graphviz, 15 | } 16 | 17 | local img_converter = converters[block.classes[1]] 18 | if not img_converter then 19 | return nil 20 | end 21 | 22 | local success, img = pcall(img_converter, block.text, filetype) 23 | 24 | if not success then 25 | io.stderr:write(tostring(img)) 26 | io.stderr:write('\n') 27 | error 'Image conversion failed. Aborting.' 28 | end 29 | 30 | return pandoc.RawBlock('html', img) 31 | end 32 | 33 | return { 34 | {CodeBlock = CodeBlock}, 35 | } 36 | 37 | -------------------------------------------------------------------------------- /make_python_devex/.gitignore: -------------------------------------------------------------------------------- 1 | .peru 2 | deps 3 | build 4 | node_modules 5 | presentation.html 6 | presentation.pdf 7 | presentation.docx 8 | article.html 9 | article.pdf 10 | article.docx 11 | article_media 12 | -------------------------------------------------------------------------------- /make_python_devex/.nvmrc: -------------------------------------------------------------------------------- 1 | v18.20.6 2 | -------------------------------------------------------------------------------- /make_python_devex/Brewfile: -------------------------------------------------------------------------------- 1 | brew 'peru' 2 | brew 'entr' 3 | brew 'pandoc' 4 | brew 'make' 5 | brew 'miniserve' 6 | brew 'hivemind' 7 | brew 'graphviz' 8 | brew 'npm' 9 | brew 'asciinema' 10 | -------------------------------------------------------------------------------- /make_python_devex/Makefile: -------------------------------------------------------------------------------- 1 | PRESENTATION = presentation 2 | ARTICLE = article 3 | MARKDOWN = $(PRESENTATION).md $(ARTICLE).md 4 | PRESENTATION_HTML = $(PRESENTATION).html 5 | HTML = $(MARKDOWN:md=html) 6 | PDF = $(MARKDOWN:md=pdf) 7 | DOCX = $(MARKDOWN:md=docx) 8 | 9 | DOTS = $(wildcard *.dot) 10 | SVGS = $(DOTS:.dot=.svg) 11 | 12 | DEPS_DIR = deps 13 | BUILD_DIR = build 14 | 15 | REVEALJS_VERSION = $(shell basename -s .zip $(shell yaml2json peru.yaml | jq -r '.["curl module revealjs"].url')) 16 | 17 | ##@ Utility 18 | 19 | .PHONY: help 20 | help: ## Display this help 21 | @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z0-9_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) 22 | 23 | ##@ Setup 24 | 25 | .PHONY: deps 26 | deps: peru.yaml Brewfile ## Install dependencies 27 | brew bundle --verbose 28 | peru sync 29 | 30 | ##@ Presenting 31 | 32 | .PHONY: all 33 | all: $(HTML) $(PDF) ## Build all artifacts 34 | 35 | .PHONY: docx 36 | docx: $(DOCX) 37 | 38 | .PHONY: html 39 | html: $(HTML) ## Make the presentation reveal.js HTML 40 | 41 | open-and-serve: $(HTML) ## Start a server and open the presentation in a browser 42 | open http://localhost:8080/$(HTML) 43 | miniserve . 44 | 45 | ##@ Development 46 | 47 | automatic-regen: ## Use entr to automatically remake the file 48 | echo $(MARKDOWN) | entr -acpr make $(HTML) 49 | 50 | watch: Procfile ## Use hivemind for constant building, run open first 51 | hivemind Procfile 52 | 53 | ##@ Cleanup 54 | 55 | .PHONY: clean 56 | clean: ## Clean build artifacts 57 | rm -f $(HTML) $(PDF) $(PDF_SERVER_PIDFILE) $(DOCX) article_media 58 | 59 | %.html: %.md Makefile 60 | pandoc -t revealjs -s $< -o $@ \ 61 | --section-divs \ 62 | -L .filters/embedded_graphviz.lua \ 63 | -M revealjs-url=$(DEPS_DIR)/reveal.js/reveal.js-$(REVEALJS_VERSION) 64 | 65 | %.docx: %.md Makefile 66 | pandoc -s $< -o $@ \ 67 | -L .filters/embedded_graphviz.lua \ 68 | -L deps/pandoc/lua-filters/include-code-files/include-code-files.lua \ 69 | --filter pandoc-crossref \ 70 | --extract-media=article_media \ 71 | --reference-doc=reference.docx 72 | 73 | .PHONY: $(BUILD_DIR) 74 | $(BUILD_DIR): 75 | mkdir -p $@ 76 | 77 | %.svg: %.dot $(BUILD_DIR) 78 | dot -Tsvg -o$(BUILD_DIR)/$(<:.dot=.svg) $< 79 | svgo $(BUILD_DIR)/$(<:.dot=.svg) 80 | 81 | .PHONY: svgs 82 | svgs: $(SVGS) ## Build all SVGs 83 | 84 | .PHONY: pdf 85 | pdf: $(PDF) ## Build a PDF 86 | 87 | HOST_INSIDE_DOCKER=host.docker.internal 88 | FONTS=$(HOME)/Library/Fonts 89 | PDF_SERVER_PIDFILE=.miniserve.pdf.pid 90 | 91 | $(PDF_SERVER_PIDFILE): 92 | miniserve -p 20871 . & echo $$! > .miniserve.pdf.pid 93 | 94 | 95 | DECKTAPE_CMD = docker run --platform=linux/amd64 --rm -t --net=host \ 96 | -v "$(shell pwd):/slides" \ 97 | -v "$(FONTS):/home/node/.local/share/fonts" \ 98 | astefanutti/decktape 99 | 100 | DECKTAPE_CMD = npm exec -- decktape 101 | DECKTAPE_HOST = 127.0.0.1 102 | 103 | %.pdf: $(PRESENTATION_HTML) $(PDF_SERVER_PIDFILE) 104 | $(DECKTAPE_CMD) --size 1920x1080 http://$(DECKTAPE_HOST):20871/$(@:.pdf=.html) $@ 105 | 106 | kill `cat $(PDF_SERVER_PIDFILE)` && rm -rf $(PDF_SERVER_PIDFILE) 107 | 108 | .PHONY: test 109 | test: 110 | 111 | package-article: 112 | zip -r -9 make_python_devex.zip article.docx article_media example/{Makefile,Brewfile,pyproject.toml,README.md} example/tests/unit/test_main.py example/example/__init__.py 113 | -------------------------------------------------------------------------------- /make_python_devex/Procfile: -------------------------------------------------------------------------------- 1 | serve: miniserve . 2 | watch: echo presentation.md | entr -apr make presentation.html 3 | -------------------------------------------------------------------------------- /make_python_devex/README.md: -------------------------------------------------------------------------------- 1 | # `make python devex` 2 | 3 | Or , How a 45-year-old tool can `make` Python developer experience easier 4 | 5 | ## One time setup 6 | 7 | ### Homebrew 8 | 9 | Install homebrew if you don't already have it. 10 | 11 | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" 12 | 13 | ## Install deps 14 | 15 | make deps 16 | 17 | This will install a bunch of stuff. You _could_ install this stuff manually, 18 | but it's far easier to let automation do it for you. 19 | 20 | ## Building 21 | 22 | |Command|Effect| 23 | |-------|------| 24 | |`make all`| Build only the HTML file containing the presentation | 25 | |`make open-and-serve` | Build the HTML file and open it in your browser via a server | 26 | |`make watch` | Build if necessary and on each change, serve it up | 27 | 28 | You'll probably want to use 29 | `make watch` during development and 30 | `make open-and-serve` when presenting. 31 | 32 | -------------------------------------------------------------------------------- /make_python_devex/custom.css: -------------------------------------------------------------------------------- 1 | @import "deps/font-awesome/fontawesome-free-6.0.0-web/css/all.min.css"; 2 | 3 | :root { 4 | --font-family-sans-serf: "Source Sans", "Helvetica", sans-serif; 5 | } 6 | 7 | .reveal h1, 8 | .reveal h2, 9 | .reveal h3, 10 | .reveal h4, 11 | .reveal h5, 12 | .reveal h6, 13 | .reveal figcaption { 14 | font-family: var(--font-family-sans-serif); 15 | } 16 | 17 | .reveal p, .reveal li { 18 | color: #000; 19 | font-family: var(--font-family-sans-serif); 20 | } 21 | .reveal small > em { 22 | color: #666; 23 | } 24 | 25 | .reveal h1, 26 | .reveal h1.title p { 27 | color: #000; 28 | } 29 | 30 | .reveal h1 { 31 | font-size: 2.3em; 32 | } 33 | .reveal h1.title p { 34 | font-size: 0.8em; 35 | } 36 | 37 | .wordcloud ul li { 38 | display: inline; 39 | } 40 | 41 | .wordcloud ul li:nth-child(n+2)::before { 42 | content:'\00a0\00a0'; 43 | } 44 | 45 | .wordcloud ul li:nth-child(2n) { 46 | color: #666; 47 | } 48 | 49 | .reveal .biopic img { 50 | border-radius: 80px; 51 | } 52 | -------------------------------------------------------------------------------- /make_python_devex/notes.md: -------------------------------------------------------------------------------- 1 | My big reason for using `make` is that it’s always… there. I think it’s OOTB in most Linux distros and a dep of build-essential in Debian ecosystem and its analogs in other pkg mgrs. It’s OOTB in macOS, at least with Homebrew installations since Homebrew requires xcode CLI tools to be installed, and those include BSD make. All of my Brewfiles include `brew 'make'` to install GNU make but I write portable Makefiles 99% of the time. 2 | 3 | I’d probably be using `xmake` or `just` or `ok` otherwise. I used to think Gradle was the be-all-end-all because of its ability to bootstrap itself given only a JVM… but then Apple stopped shipping a modern JVM so the guarantee that someone had an up-to-date JVM went away. The next lowest common denominator: `make`. 4 | 5 | This isn’t to say that _all_ dev tasks should be in `make`. I think that’s a good practice but I’d not want to see someone create a bevy of tasks that effectively mirrors all `poetry` commands, for instance. I think the minimum is `make deps check test build` and a `make help` that’s the default and lists all user-intended tasks. So, five tasks. Then, anything longer than a command plus an option that is _regularly_ used goes into the Makefile or the ecosystem-specific build tool (e.g. `npm start` versus `make start-npm-server`… choose the former). 6 | -------------------------------------------------------------------------------- /make_python_devex/our_python_installation_method.dot: -------------------------------------------------------------------------------- 1 | digraph our_method { 2 | rankdir=LR; 3 | rank=source; 4 | size="9,9" 5 | 6 | graph [fontname = "helvetica"]; 7 | node [fontname = "helvetica", shape = square]; 8 | edge [fontname = "helvetica"]; 9 | 10 | node [label = "System\npython"]; system 11 | node [label = "Homebrew\npython"]; brewpy 12 | node [label = "Homebrew\npython@3.x"]; brewpyx 13 | node [label = "Anaconda\n(conda)"]; conda 14 | node [label = "conda\npython"]; condapy 15 | node [label = "pyenv", color = green, penwidth = 3.0]; pyenv 16 | node [label = "Homebrew\n(brew)", color = green]; brew 17 | node [label = "pyenv\npython", color = green]; pyenvpy 18 | 19 | system; 20 | 21 | brew -> brewpy; 22 | brewpy -> brewpyx; 23 | brew -> brewpyx; 24 | brew -> conda; 25 | conda -> condapy; 26 | brew -> pyenv; 27 | pyenv -> pyenvpy; 28 | 29 | } 30 | -------------------------------------------------------------------------------- /make_python_devex/peru.yaml: -------------------------------------------------------------------------------- 1 | imports: 2 | revealjs: deps/reveal.js 3 | fontawesome: deps/font-awesome 4 | asciinema-player-css: deps/asciinema-player 5 | asciinema-player-js: deps/asciinema-player 6 | # pandoc-lua-filters: deps/pandoc/lua-filters 7 | colindean-tophat: deps/colindean-tophat.jpg 8 | 9 | curl module revealjs: 10 | url: https://github.com/hakimel/reveal.js/archive/4.3.0.zip 11 | unpack: zip 12 | 13 | curl module fontawesome: 14 | url: https://github.com/FortAwesome/Font-Awesome/releases/download/6.0.0/fontawesome-free-6.0.0-web.zip 15 | unpack: zip 16 | 17 | curl module asciinema-player-css: 18 | url: https://github.com/asciinema/asciinema-player/releases/download/v2.6.1/asciinema-player.css 19 | 20 | curl module asciinema-player-js: 21 | url: https://github.com/asciinema/asciinema-player/releases/download/v2.6.1/asciinema-player.js 22 | 23 | #git module pandoc-lua-filters: 24 | # url: https://github.com/pandoc/lua-filters.git 25 | # rev: v2021-11-05 26 | 27 | curl module colindean-tophat: 28 | url: https://avatars.githubusercontent.com/u/197224?s=300 29 | -------------------------------------------------------------------------------- /make_python_devex/pittsburgh_on_a_map.svg: -------------------------------------------------------------------------------- 1 | ../nixos_cellular_router/pittsburgh_on_a_map.svg -------------------------------------------------------------------------------- /make_python_devex/poetry_installation.dot: -------------------------------------------------------------------------------- 1 | digraph poetry_installation { 2 | rankdir=LR; 3 | rank=source; 4 | size="8,4"; 5 | compound=true; 6 | 7 | graph [fontname = "helvetica"]; 8 | node [fontname = "courier", shape = rectangle] 9 | edge [fontname = "helvetica"]; 10 | 11 | node [label = "brew install pipx", color=black]; pipx 12 | node [label = "pipx install poetry"]; pipxpoetry 13 | node [label = "brew install poetry", color=red]; brewpoetry 14 | node [label = "conda install poetry"]; condapoetry 15 | node [label = "asdf plugin asdf-poetry"]; asdf 16 | node [label = "asdf install poetry"]; asdfpoetry 17 | node [label = "curl https://install.python-poetry.org | python3 -", fontname="courier", color=green, penwidth=3]; official 18 | 19 | subgraph cluster1 { 20 | label = "Unsupported"; 21 | rank=same; 22 | size=10; 23 | brewpoetry; 24 | condapoetry; 25 | asdf -> asdfpoetry; 26 | } 27 | subgraph cluster0 { 28 | label = "Supported"; 29 | rank=same; 30 | size=10; 31 | official; 32 | pipx -> pipxpoetry; 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /make_python_devex/python_installation_methods.dot: -------------------------------------------------------------------------------- 1 | digraph python_installation_methods { 2 | rankdir=LR; 3 | rank=source; 4 | size="9,9" 5 | 6 | graph [fontname = "helvetica"]; 7 | node [fontname = "helvetica", shape = square, margin = 0.1]; 8 | edge [fontname = "helvetica"]; 9 | 10 | node [label = "System\npython"]; system 11 | node [label = "Homebrew\n(brew)"]; brew 12 | node [label = "Homebrew\npython"]; brewpy 13 | node [label = "Homebrew\npython@3.x"]; brewpyx 14 | node [label = "Anaconda\n(conda)"]; conda 15 | node [label = "conda\npython"]; condapy 16 | node [label = "pyenv"]; pyenv 17 | node [label = "pyenv\npython"]; pyenvpy 18 | node [label = "asdf"]; asdf 19 | node [label = "asdf-python\nplugin"]; asdfpyplugin 20 | node [label = "asdf\npython"]; asdfpy 21 | node [label = "nix"]; nix 22 | node [label = "nix\npython"]; nixpy 23 | node [label = "macports"]; macports; 24 | node [label = "macports\npython"]; macportspy; 25 | node [label = "uv"]; uv; 26 | node [label = "uv\npython"]; uvpy; 27 | 28 | system; 29 | 30 | brew -> brewpy; 31 | brewpy -> brewpyx; 32 | brew -> brewpyx; 33 | brew -> conda; 34 | conda -> condapy; 35 | brew -> pyenv; 36 | pyenv -> pyenvpy; 37 | brew -> asdf; 38 | asdf -> asdfpyplugin; 39 | asdfpyplugin -> asdfpy; 40 | nix -> nixpy; 41 | macports -> macportspy; 42 | brew -> uv; 43 | uv -> uvpy; 44 | } 45 | -------------------------------------------------------------------------------- /meaningful_ai/.filters/embedded_graphviz.lua: -------------------------------------------------------------------------------- 1 | -- inspired from https://github.com/pandoc/lua-filters/blob/5686d96/diagram-generator/diagram-generator.lua 2 | 3 | local dotPath = os.getenv("DOT") or "dot" 4 | 5 | local filetype = "svg" 6 | local mimetype = "image/svg+xml" 7 | 8 | local function graphviz(code, filetype) 9 | return pandoc.pipe(dotPath, {"-T" .. filetype}, code) 10 | end 11 | 12 | function CodeBlock(block) 13 | local converters = { 14 | graphviz = graphviz, 15 | } 16 | 17 | local img_converter = converters[block.classes[1]] 18 | if not img_converter then 19 | return nil 20 | end 21 | 22 | local success, img = pcall(img_converter, block.text, filetype) 23 | 24 | if not success then 25 | io.stderr:write(tostring(img)) 26 | io.stderr:write('\n') 27 | error 'Image conversion failed. Aborting.' 28 | end 29 | 30 | return pandoc.RawBlock('html', img) 31 | end 32 | 33 | return { 34 | {CodeBlock = CodeBlock}, 35 | } 36 | 37 | -------------------------------------------------------------------------------- /meaningful_ai/.gitignore: -------------------------------------------------------------------------------- 1 | deps 2 | .miniserve.pdf.pid 3 | presentation.html 4 | -------------------------------------------------------------------------------- /meaningful_ai/Brewfile: -------------------------------------------------------------------------------- 1 | brew 'peru' 2 | brew 'entr' 3 | brew 'pandoc' 4 | brew 'make' 5 | brew 'miniserve' 6 | brew 'hivemind' 7 | brew 'graphviz' 8 | brew 'npm' 9 | brew 'asciinema' 10 | -------------------------------------------------------------------------------- /meaningful_ai/Makefile: -------------------------------------------------------------------------------- 1 | PRESENTATION = presentation 2 | MARKDOWN = $(PRESENTATION).md 3 | HTML = $(MARKDOWN:md=html) 4 | PDF = $(MARKDOWN:md=pdf) 5 | 6 | DEPS_DIR = deps 7 | 8 | REVEALJS_VERSION = $(shell basename -s .zip $(shell yaml2json peru.yaml | jq -r '.["curl module revealjs"].url')) 9 | 10 | ##@ Utility 11 | 12 | .PHONY: help 13 | help: ## Display this help 14 | @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z0-9_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) 15 | 16 | ##@ Setup 17 | 18 | .PHONY: deps 19 | deps: peru.yaml Brewfile ## Install dependencies 20 | brew bundle --verbose 21 | peru sync 22 | 23 | ##@ Presenting 24 | 25 | all: $(HTML) $(PDF) ## Build all artifacts 26 | 27 | html: $(HTML) ## Make the presentation reveal.js HTML 28 | 29 | open-and-serve: $(HTML) ## Start a server and open the presentation in a browser 30 | open http://localhost:8080/$(HTML) 31 | miniserve . 32 | 33 | ##@ Development 34 | 35 | automatic-regen: ## Use entr to automatically remake the file 36 | echo $(MARKDOWN) | entr -acpr make $(HTML) 37 | 38 | watch: Procfile ## Use hivemind for constant building, run open first 39 | hivemind Procfile 40 | 41 | ##@ Cleanup 42 | 43 | clean: 44 | rm -f $(HTML) $(PDF) $(PDF_SERVER_PIDFILE) 45 | 46 | %.html: %.md Makefile 47 | pandoc -t revealjs -s $< -o $@ \ 48 | -L .filters/embedded_graphviz.lua \ 49 | -M revealjs-url=$(DEPS_DIR)/reveal.js/reveal.js-$(REVEALJS_VERSION) 50 | 51 | .PHONY: pdf 52 | pdf: $(PDF) ## Build a PDF 53 | 54 | HOST_INSIDE_DOCKER=host.docker.internal 55 | FONTS=$(HOME)/Library/Fonts 56 | PDF_SERVER_PIDFILE=.miniserve.pdf.pid 57 | 58 | $(PDF_SERVER_PIDFILE): 59 | miniserve -p 20871 . & echo $$! > .miniserve.pdf.pid 60 | 61 | $(PDF): $(HTML) $(PDF_SERVER_PIDFILE) 62 | docker run --platform=linux/amd64 --rm -t --net=host \ 63 | -v "$(shell pwd):/slides" \ 64 | -v "$(FONTS):/home/node/.local/share/fonts" \ 65 | astefanutti/decktape --size 1920x1080 http://$(HOST_INSIDE_DOCKER):20871/$(HTML) $@ 66 | 67 | kill `cat $(PDF_SERVER_PIDFILE)` && rm -rf $(PDF_SERVER_PIDFILE) 68 | -------------------------------------------------------------------------------- /meaningful_ai/Procfile: -------------------------------------------------------------------------------- 1 | serve: miniserve . 2 | watch: echo presentation.md | entr -apr make presentation.html 3 | -------------------------------------------------------------------------------- /meaningful_ai/artifex.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/meaningful_ai/artifex.jpg -------------------------------------------------------------------------------- /meaningful_ai/blackforager.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/meaningful_ai/blackforager.jpg -------------------------------------------------------------------------------- /meaningful_ai/colin_and_brig.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/meaningful_ai/colin_and_brig.jpg -------------------------------------------------------------------------------- /meaningful_ai/colin_and_brig_northsea.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/meaningful_ai/colin_and_brig_northsea.jpg -------------------------------------------------------------------------------- /meaningful_ai/colin_pkt.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/meaningful_ai/colin_pkt.jpg -------------------------------------------------------------------------------- /meaningful_ai/colin_wc_band.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/meaningful_ai/colin_wc_band.jpg -------------------------------------------------------------------------------- /meaningful_ai/cow_model_autophagy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/meaningful_ai/cow_model_autophagy.png -------------------------------------------------------------------------------- /meaningful_ai/fight_health_insurance.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/meaningful_ai/fight_health_insurance.jpg -------------------------------------------------------------------------------- /meaningful_ai/holcad_wc_from_codereview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/meaningful_ai/holcad_wc_from_codereview.jpg -------------------------------------------------------------------------------- /meaningful_ai/nieman_court_reporter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/meaningful_ai/nieman_court_reporter.png -------------------------------------------------------------------------------- /meaningful_ai/nin_copyofa.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/meaningful_ai/nin_copyofa.jpg -------------------------------------------------------------------------------- /meaningful_ai/peru.yaml: -------------------------------------------------------------------------------- 1 | imports: 2 | revealjs: deps/reveal.js 3 | fontawesome: deps/font-awesome 4 | asciinema-player-css: deps/asciinema-player 5 | asciinema-player-js: deps/asciinema-player 6 | 7 | curl module revealjs: 8 | url: https://github.com/hakimel/reveal.js/archive/5.0.4.zip 9 | unpack: zip 10 | 11 | curl module fontawesome: 12 | url: https://github.com/FortAwesome/Font-Awesome/releases/download/6.5.1/fontawesome-free-6.5.1-web.zip 13 | unpack: zip 14 | 15 | curl module asciinema-player-css: 16 | url: https://github.com/asciinema/asciinema-player/releases/download/v3.6.3/asciinema-player.css 17 | 18 | curl module asciinema-player-js: 19 | url: https://github.com/asciinema/asciinema-player/releases/download/v3.6.3/asciinema-player.min.js 20 | -------------------------------------------------------------------------------- /meaningful_ai/pns_april2013.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/meaningful_ai/pns_april2013.jpg -------------------------------------------------------------------------------- /nixos_cellular_router/.filters/embedded_graphviz.lua: -------------------------------------------------------------------------------- 1 | -- inspired from https://github.com/pandoc/lua-filters/blob/5686d96/diagram-generator/diagram-generator.lua 2 | 3 | local dotPath = os.getenv("DOT") or "dot" 4 | 5 | local filetype = "svg" 6 | local mimetype = "image/svg+xml" 7 | 8 | local function graphviz(code, filetype) 9 | return pandoc.pipe(dotPath, {"-T" .. filetype}, code) 10 | end 11 | 12 | function CodeBlock(block) 13 | local converters = { 14 | graphviz = graphviz, 15 | } 16 | 17 | local img_converter = converters[block.classes[1]] 18 | if not img_converter then 19 | return nil 20 | end 21 | 22 | local success, img = pcall(img_converter, block.text, filetype) 23 | 24 | if not success then 25 | io.stderr:write(tostring(img)) 26 | io.stderr:write('\n') 27 | error 'Image conversion failed. Aborting.' 28 | end 29 | 30 | return pandoc.RawBlock('html', img) 31 | end 32 | 33 | return { 34 | {CodeBlock = CodeBlock}, 35 | } 36 | 37 | -------------------------------------------------------------------------------- /nixos_cellular_router/.gitignore: -------------------------------------------------------------------------------- 1 | .peru 2 | deps 3 | presentation.html 4 | presentation.pdf 5 | *.ws 6 | -------------------------------------------------------------------------------- /nixos_cellular_router/.nvmrc: -------------------------------------------------------------------------------- 1 | v18.20.6 2 | -------------------------------------------------------------------------------- /nixos_cellular_router/10dollarbill.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/nixos_cellular_router/10dollarbill.jpg -------------------------------------------------------------------------------- /nixos_cellular_router/Brewfile: -------------------------------------------------------------------------------- 1 | brew 'peru' 2 | brew 'entr' 3 | brew 'pandoc' 4 | brew 'make' 5 | brew 'miniserve' 6 | brew 'hivemind' 7 | brew 'graphviz' 8 | brew 'npm' 9 | brew 'asciinema' 10 | brew 'websocat' 11 | -------------------------------------------------------------------------------- /nixos_cellular_router/Makefile: -------------------------------------------------------------------------------- 1 | PRESENTATION = presentation 2 | MARKDOWN = $(PRESENTATION).md 3 | HTML = $(MARKDOWN:md=html) 4 | PDF = $(MARKDOWN:md=pdf) 5 | 6 | DEPS_DIR = deps 7 | 8 | REVEALJS_VERSION = $(shell basename -s .zip $(shell yaml2json peru.yaml | jq -r '.["curl module revealjs"].url')) 9 | 10 | WS_WATCHED_FILE = .$(HTML).ws 11 | 12 | ##@ Utility 13 | 14 | .PHONY: help 15 | help: ## Display this help 16 | @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z0-9_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) 17 | 18 | ##@ Setup 19 | 20 | .PHONY: deps 21 | deps: peru.yaml Brewfile ## Install dependencies 22 | brew bundle --verbose 23 | peru sync 24 | 25 | ##@ Presenting 26 | 27 | all: $(HTML) $(PDF) ## Build all artifacts 28 | 29 | html: $(HTML) ## Make the presentation reveal.js HTML 30 | 31 | open-and-serve: $(HTML) ## Start a server and open the presentation in a browser 32 | open http://localhost:8080/$(HTML) 33 | miniserve . 34 | 35 | ##@ Development 36 | 37 | automatic-regen: ## Use entr to automatically remake the file 38 | echo $(MARKDOWN) | entr -acpr $(SHELL) -c "make $(HTML) && echo reload >> $(WS_WATCHED_FILE)" 39 | 40 | watch: Procfile ## Use hivemind for constant building, run open first 41 | hivemind Procfile 42 | 43 | livereload-ws: ## Run a websocket server listening for reloads 44 | tail -f $(WS_WATCHED_FILE) | websocat -s 56789 45 | 46 | ##@ Cleanup 47 | 48 | clean: 49 | rm -f $(HTML) $(PDF) $(PDF_SERVER_PIDFILE) $(WS_WATCHED_FILE) 50 | 51 | %.html: %.md Makefile 52 | pandoc -t revealjs -s $< -o $@ \ 53 | --section-divs \ 54 | -L .filters/embedded_graphviz.lua \ 55 | -M revealjs-url=$(DEPS_DIR)/reveal.js/reveal.js-$(REVEALJS_VERSION) 56 | 57 | .PHONY: pdf 58 | pdf: $(PDF) ## Build a PDF 59 | 60 | HOST_INSIDE_DOCKER=host.docker.internal 61 | FONTS=$(HOME)/Library/Fonts 62 | PDF_SERVER_PIDFILE=.miniserve.pdf.pid 63 | 64 | $(PDF_SERVER_PIDFILE): 65 | miniserve -p 20871 . & echo $$! > .miniserve.pdf.pid 66 | 67 | DECKTAPE_CMD = docker run --platform=linux/amd64 --rm -t --net=host \ 68 | -v "$(shell pwd):/slides" \ 69 | -v "$(FONTS):/home/node/.local/share/fonts" \ 70 | astefanutti/decktape 71 | 72 | DECKTAPE_CMD = npm exec -- decktape 73 | DECKTAPE_HOST = 127.0.0.1 74 | 75 | %.pdf: $(PRESENTATION_HTML) $(PDF_SERVER_PIDFILE) 76 | $(DECKTAPE_CMD) --size 1920x1080 http://$(DECKTAPE_HOST):20871/$(@:.pdf=.html) $@ 77 | -------------------------------------------------------------------------------- /nixos_cellular_router/Procfile: -------------------------------------------------------------------------------- 1 | serve: miniserve . 2 | ws: make livereload-ws 3 | watch: make automatic-regen 4 | -------------------------------------------------------------------------------- /nixos_cellular_router/colindean_fosdem_2021_video_intro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/nixos_cellular_router/colindean_fosdem_2021_video_intro.png -------------------------------------------------------------------------------- /nixos_cellular_router/custom.css: -------------------------------------------------------------------------------- 1 | #linux figcaption, section.nocaptions figcaption { 2 | display:none; 3 | } 4 | 5 | .image-borders img { 6 | border: 0.05em solid #ccc; 7 | border-radius: 0.5em; 8 | padding: 0.4em; 9 | background-color: white; 10 | } 11 | -------------------------------------------------------------------------------- /nixos_cellular_router/debian.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /nixos_cellular_router/elementary.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /nixos_cellular_router/evolve3_inside.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/nixos_cellular_router/evolve3_inside.jpg -------------------------------------------------------------------------------- /nixos_cellular_router/evolve3nix1_with_accessories.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/nixos_cellular_router/evolve3nix1_with_accessories.jpg -------------------------------------------------------------------------------- /nixos_cellular_router/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/nixos_cellular_router/favicon.ico -------------------------------------------------------------------------------- /nixos_cellular_router/hardware-configuration.nix: -------------------------------------------------------------------------------- 1 | # Do not modify this file! It was generated by ‘nixos-generate-config’ 2 | # and may be overwritten by future invocations. Please make changes 3 | # to /etc/nixos/configuration.nix instead. 4 | { config, lib, pkgs, modulesPath, ... }: 5 | 6 | { 7 | imports = 8 | [ (modulesPath + "/installer/scan/not-detected.nix") 9 | ]; 10 | 11 | boot.initrd.availableKernelModules = [ "ahci" "xhci_pci" "usb_storage" "sd_mod" "sdhci_pci" "rtsx_usb_sdmmc" ]; 12 | boot.initrd.kernelModules = [ ]; 13 | boot.kernelModules = [ "kvm-intel" ]; 14 | boot.extraModulePackages = [ ]; 15 | 16 | fileSystems."/" = 17 | { device = "/dev/disk/by-uuid/55cedb18-10f3-422b-afe4-b92696f48fab"; 18 | fsType = "ext4"; 19 | }; 20 | 21 | fileSystems."/boot" = 22 | { device = "/dev/disk/by-uuid/CECC-B168"; 23 | fsType = "vfat"; 24 | }; 25 | 26 | swapDevices = 27 | [ { device = "/dev/disk/by-uuid/10f77bf3-497a-4bbb-a27d-7f818d661562"; } 28 | ]; 29 | 30 | # Enables DHCP on each ethernet and wireless interface. In case of scripted networking 31 | # (the default) this is the recommended approach. When using systemd-networkd it's 32 | # still possible to use this option, but it's recommended to use it in conjunction 33 | # with explicit per-interface declarations with `networking.interfaces..useDHCP`. 34 | networking.useDHCP = lib.mkDefault true; 35 | # networking.interfaces.enp0s21f0u5c2.useDHCP = lib.mkDefault true; 36 | # networking.interfaces.wwp0s21f0u3i4.useDHCP = lib.mkDefault true; 37 | 38 | nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; 39 | hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; 40 | } 41 | -------------------------------------------------------------------------------- /nixos_cellular_router/nixos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/nixos_cellular_router/nixos.png -------------------------------------------------------------------------------- /nixos_cellular_router/peru.yaml: -------------------------------------------------------------------------------- 1 | imports: 2 | revealjs: deps/reveal.js 3 | fontawesome: deps/font-awesome 4 | asciinema-player-css: deps/asciinema-player 5 | asciinema-player-js: deps/asciinema-player 6 | colindean-tophat: deps/colindean-tophat.jpg 7 | 8 | curl module revealjs: 9 | url: https://github.com/hakimel/reveal.js/archive/5.1.0.zip 10 | unpack: zip 11 | 12 | curl module fontawesome: 13 | url: https://github.com/FortAwesome/Font-Awesome/releases/download/6.0.0/fontawesome-free-6.0.0-web.zip 14 | unpack: zip 15 | 16 | curl module asciinema-player-css: 17 | url: https://github.com/asciinema/asciinema-player/releases/download/v2.6.1/asciinema-player.css 18 | 19 | curl module asciinema-player-js: 20 | url: https://github.com/asciinema/asciinema-player/releases/download/v2.6.1/asciinema-player.js 21 | 22 | curl module colindean-tophat: 23 | url: https://avatars.githubusercontent.com/u/197224?s=300 24 | -------------------------------------------------------------------------------- /nixos_cellular_router/qnap.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /nixos_cellular_router/redhat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/nixos_cellular_router/redhat.png -------------------------------------------------------------------------------- /nixos_cellular_router/repro.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "NixOS + $60 laptop = cellular router" 3 | subtitle: "Building an LTE router with a $60 (new!) laptop and a single file" 4 | author: 5 | - Colin Dean 6 | theme: white 7 | css: custom.css 8 | slideNumber: true 9 | hash: true 10 | history: true 11 | # transition: none 12 | transitionSpeed: "fast" 13 | totalTime: 1800 14 | # include-after: | 15 | # 16 | # 17 | # title-slide-attributes: 18 | # data-background-image: "targettech.png" 19 | # data-background-size: "10%" 20 | # data-background-position: "50% 100%" 21 | --- 22 | 23 | # Test 24 | 25 | --- 26 | 27 | ## {background-image="pittsburgh_on_a_map.svg" background-size="contain" background-color="#6699ff"} 28 | 29 | ::: notes 30 | 31 | I'm here from Pittsburgh, a metropolitan area of around two and a half million people 32 | in an area of the United States we call the Rust Belt. 33 | 34 | ::: 35 | 36 | --- 37 | 38 | ## {background-image="colindean_fosdem_2021_video_intro.png" background-size="contain" } 39 | 40 | ::: notes 41 | 42 | This is my second presentation to FOSDEM, but my first in person and my fifth time attending FOSDEM in some way. 43 | 44 | ::: 45 | 46 | --- 47 | 48 | ## {background-image="colindean_fosdem_2021_video_intro.png" background-size="contain" } 49 | 50 | ::: notes 51 | 52 | This is my second presentation to FOSDEM, but my first in person and my fifth time attending FOSDEM in some way. 53 | 54 | ::: 55 | 56 | --- 57 | 58 | ![Homebrew logo, Apple variant](https://docs.brew.sh/assets/img/homebrew.svg){width=36%} 59 | ![Homebrew logo, Linux variant](https://docs.brew.sh/assets/img/linuxbrew.svg){width=36%} 60 | 61 | ::: notes 62 | 63 | You can generally find me hanging out at the Homebrew table in the exhibition hall. 64 | I've been a Homebrew contributor for 12 years and will complete my first term as one of its elected 65 | Project Leadership Committee members on Monday. 66 | 67 | So, hello from a fellow packaging project, but I know Nix is so much more! 68 | 69 | ::: 70 | 71 | --- 72 | 73 | # Developer Experience 74 | 75 | ::: notes 76 | 77 | I focus a lot on developer experience. 78 | I believe that good tools and good practices enable building good software. 79 | 80 | ::: 81 | 82 | -------------------------------------------------------------------------------- /nixos_cellular_router/repro2.md: -------------------------------------------------------------------------------- 1 | ## {background-image="anything"} 2 | 3 | --- 4 | 5 | # header 6 | 7 | ::: notes 8 | 9 | Note 10 | 11 | ::: 12 | -------------------------------------------------------------------------------- /nixos_cellular_router/submissions.md: -------------------------------------------------------------------------------- 1 | # Submissions 2 | 3 | > Because I used nixOS on a really crappy laptop to build an LTE router 4 | 5 | ## [FOSDEM 2025](https://fosdem.org/2025/schedule/event/fosdem-2025-6437-building-an-lte-router-with-a-60-new-laptop-and-a-single-file/) :white_check_mark: 6 | 7 | ### Title 8 | 9 | Building an LTE router with a $60 (new!) laptop and a single file 10 | 11 | ### Abstract 12 | 13 | With zero experience with NixOS, I grabbed an unused $60 LTE-enabled laptop bought in a fire sale during the pandemic and an LTE SIM card to build a router for my newly purchased home so I could have the minimal Internet necessary for its security system and home automation without having to record what I did in case the laptop died. 14 | 15 | I did this in a few hours with less than 100 lines of Nix. I did not think that it would be this easy. It served my Internet needs for several months without failure. 16 | 17 | This talk will cover some hijinks of NixOS, using LTE for home internet somewhere you don't yet live, and the joy of things that Just Work... when they work. 18 | 19 | ## !!Con 2024 :no_entry: 20 | 21 | ### Talk title 22 | 23 | Building an LTE router with a $60 (new!) laptop and a single file 24 | 25 | ## Abstract for your talk 26 | 27 | I took an unused $60 LTE-enabled laptop bought in a fire sale during the pandemic 28 | and an LTE SIM card 29 | and with zero experience with NixOS, built a router for my newly purchased home 30 | so I could have the minimal Internet necessary for its security system and home automation 31 | without having to record what I did in case the laptop died. 32 | 33 | I did this in a few hours with less than 100 lines of Nix. 34 | I did not think that it would be this easy. 35 | 36 | This talk will cover some hijinks of NixOS, 37 | using LTE for home internet somewhere you don't yet live, 38 | and the joy of things that Just Work... when they work. 39 | 40 | ## Timeline 41 | 42 | 1 min - introduce(me) 43 | 1 min - introduce(evolve-iii-laptop) 44 | 1 min - introduce(nixos) 45 | 3 min - first attempt 46 | 3 min - second attempt 47 | 1 min - future work 48 | 49 | ## Intended audience 50 | 51 | People who have heard of NixOS but haven't had a reason to use it. 52 | People with spare hardware lying around want to make it do something 53 | but do not want to remember how they set it up when it comes time to set it up again. 54 | -------------------------------------------------------------------------------- /nixos_cellular_router/trustix.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/colindean/talks/9ee2332dd1555cee42d4f3bf219f9db83a03183b/nixos_cellular_router/trustix.png --------------------------------------------------------------------------------