diff options
Diffstat (limited to '2024-06-18-guix-social/slides.html')
-rw-r--r-- | 2024-06-18-guix-social/slides.html | 681 |
1 files changed, 681 insertions, 0 deletions
diff --git a/2024-06-18-guix-social/slides.html b/2024-06-18-guix-social/slides.html new file mode 100644 index 0000000..48d6c0d --- /dev/null +++ b/2024-06-18-guix-social/slides.html @@ -0,0 +1,681 @@ +<!DOCTYPE html> +<html lang="en"> +<head> +<meta charset="utf-8"/> +<title>Get rich slow with Guile and Guix</title> +<meta name="author" content="David Thompson"/> +<meta name="description" content=""/> +<meta name="keywords" content=""/> +<style type="text/css"> +.underline { text-decoration: underline; } +</style> +<link rel="stylesheet" href="reveal.js/dist/reveal.css"/> + +<link rel="stylesheet" href="reveal.js/dist/theme/night.css" id="theme"/> + +</head> +<body> +<div class="reveal"> +<div class="slides"> + +<section> +<section id="slide-orgb7396a1"> +<h2 id="orgb7396a1">Get rich slow with Guile and Guix</h2> +<p> +Guix Social +</p> + +<p> +2024-06-18 +</p> + +<p> +<a href="https://dthompson.us">https://dthompson.us</a> +</p> + +</section> +</section> +<section> +<section id="slide-orgbf39c59"> +<h2 id="orgbf39c59">Hi!</h2> +<ul> +<li>I'm David Thompson</li> +<li>From Massachusetts, USA +<ul> +<li>The birthplace of Scheme and Free Software</li> + +</ul></li> +<li>CTO at Spritely Institute</li> +<li>Guile/Guix user and contributor for over 10 years</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-orga8bf3de"> +<h2 id="orga8bf3de">tl;dr</h2> +<ul> +<li>2012: Discovered Scheme then started using Guile</li> +<li>2013: Became an early Guix contributor</li> +<li>2015-2017: Made my own tools/libraries with Guile</li> +<li>2022-now: Making FOSS full-time</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-org023eb7d"> +<h2 id="org023eb7d">2012: Libreplanet</h2> +<p> +In hindsight, the most defining moment in my career path: +</p> + +<ul> +<li>Yukihiro Matsumoto: "How Emacs Changed My Life"</li> +<li>Christine Lemmer-Webber: GNU MediaGoblin</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-org88ab961"> +<h2 id="org88ab961">2012: Libreplanet</h2> +<ul> +<li>Immediately dropped Vim for Emacs</li> +<li>Started to use/hack on MediaGoblin</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-org2595624"> +<h2 id="org2595624">2012: Ruby</h2> +<ul> +<li>First professional development job writing Ruby</li> +<li>Relevant to Guix, eventually</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-orgd224131"> +<h2 id="orgd224131">2012: Game dev</h2> +<ul> +<li>Wanted to make games as a hobby</li> +<li>Went the C core with embedded "scripting" language route</li> +<li>Started with Lua, but then…</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-org0f4df98"> +<h2 id="org0f4df98">2012: SICP</h2> +<img class="stretch" src="sicp.jpg"> + +</section> +</section> +<section> +<section id="slide-org94b7651"> +<h2 id="org94b7651">2012: Guile</h2> +<ul> +<li>"official" GNU extension language</li> +<li>I was into GNU at the time</li> +<li>Can extend C programs… but at what cost?</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-org7f542bb"> +<h2 id="org7f542bb">2013: First FOSS patch</h2> +<ul> +<li>Like many, I struggled to find a way to participate in FOSS +development</li> +<li>GNU MediaGoblin turned out to be very welcoming! +<ul> +<li>Issue tracker had "bitesized" tag for newcomers</li> +<li>I added an option to enable/disable comments</li> + +</ul></li> + +</ul> + +</section> +</section> +<section> +<section id="slide-orgf2a216c"> +<h2 id="orgf2a216c">2013: Guix</h2> +<ul> +<li>I hadn't heard of Nix, but this new Guix thing by Ludovic Courtès +looked fascinating</li> +<li>Started before the distro was bootstrapped</li> +<li>Switched from Debian to Guix later</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-org6e51367"> +<h2 id="org6e51367">Why Guix?</h2> +<ul> +<li>Functional package management model</li> +<li>Practical software freedom</li> +<li>Whole-system rollback</li> +<li>Easy development environments</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-orge7d05b5"> +<h2 id="orge7d05b5">Extend vs. Embed</h2> +<ul> +<li>Nix embeds Bash into package recipes</li> +<li>Guix uses Guile all the way down (almost)</li> +<li>Scheme isn't <b>icing</b> on top of C++/Bash +<ul> +<li>Scheme is the <b>cake</b></li> + +</ul></li> + +</ul> + +</section> +</section> +<section> +<section id="slide-org88000da"> +<h2 id="org88000da">2013: Guix contributor</h2> +<ul> +<li>First Guix patch: Packaged libtheora</li> +<li>Packaged SDL, SDL2, etc. shortly after</li> +<li>Ludo gave me commit access!</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-org0124b00"> +<h2 id="org0124b00">2013: Guile contributor</h2> +<ul> +<li>First patch to Guile: <code>alist->hash-table</code></li> +<li>Worked on <code>(system repl coop-server)</code> with Mark Weaver</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-org4e060be"> +<h2 id="org4e060be">2014: Ruby build system</h2> +<ul> +<li>Wrote <code>(guix build-system ruby)</code> and initial Ruby packages</li> +<li>Pjotr Prins was involved in this, too</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-org081ed55"> +<h2 id="org081ed55">2014: guix environment</h2> +<ul> +<li>Wanted something like <code>nix shell</code></li> +<li>Would become <code>guix shell</code> later</li> +<li>Did not achieve consensus on sane defaults +<ul> +<li>Remember <code>--ad-hoc</code>?</li> + +</ul></li> +<li><code>guix shell</code> corrected the problems, eventually</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-org7a7a48a"> +<h2 id="org7a7a48a">2015: guix publish</h2> +<ul> +<li>Guix wanted to encourage more substitute providers +<ul> +<li>but Hydra was a large piece of software</li> + +</ul></li> +<li>I wrote the initial version of <code>guix publish</code> +<ul> +<li>Pure Guile; uses the <code>(web ...)</code> modules</li> + +</ul></li> + +</ul> + +</section> +</section> +<section> +<section id="slide-org74e444c"> +<h2 id="org74e444c">2015: guix publish</h2> +<ul> +<li>Seems to have been useful over the years +<ul> +<li>but substitute availability is far from a solved problem</li> + +</ul></li> +<li>Distributed substitutes seem like the way to go</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-org96e031e"> +<h2 id="org96e031e">2015: call-with-container</h2> +<ul> +<li>Learned that there was more to containers than layered disk images +<ul> +<li>Thanks to Docker for "container" ambiguity! 😞</li> + +</ul></li> +<li>The good stuff is actually the runtime environment (Linux namespaces, etc.)</li> +<li>Can we implement just the good parts of Docker for Guix?</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-orge484ebe"> +<h2 id="orge484ebe">2015: call-with-container</h2> +<ul> +<li>Don't mount opaque disk images of unknown provenance</li> +<li>Bind mount <code>/gnu/store</code> directories instead</li> +<li>Containment + reproducibility</li> +<li>Used in: +<ul> +<li><code>guix shell --container</code></li> +<li><code>guix system container</code></li> +<li>containerized Shepherd services</li> + +</ul></li> + +</ul> + +</section> +</section> +<section> +<section id="slide-org8910e89"> +<h2 id="org8910e89">2015: Haunt</h2> +<ul> +<li>Static site generator written in Guile</li> +<li>Uses <code>guix shell</code> for development environment</li> +<li>Guix is the first (only?) distro that gets package updates</li> +<li>Both the Guix and Guile websites use Haunt</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-org6456b74"> +<h2 id="org6456b74">2016: Oops, I bought a house</h2> +<ul> +<li>Who could have imagined this would use up all my free time?</li> +<li>Guix contibutions greatly reduced +<ul> +<li>I've never returned to my previous level of activity</li> +<li>But the Guix community has grown <b>a lot</b>!</li> +<li>I can be a user now (mostly) 👾</li> + +</ul></li> + +</ul> + +</section> +</section> +<section> +<section id="slide-orgef7a649"> +<h2 id="orgef7a649">2017: Chickadee</h2> +<img class="stretch" src="chickadee-3d.png"> + +<ul> +<li>After all this time, I still wanted to make games</li> +<li>Created Guile-SDL2 along the way</li> +<li>Uses <code>guix shell</code> for development, naturally</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-orge6433be"> +<h2 id="orge6433be">Chickadee</h2> +<ul> +<li><b>not</b> a wrapper around raylib, etc.</li> +<li>Inspired by Guix to <b>maximize</b> usage of Guile</li> +<li>Rendering code 100% Scheme (until we hit libGL) +<ul> +<li>Made possible by Andy Wingo's incredible compiler/VM work</li> + +</ul></li> + +</ul> + +</section> +</section> +<section> +<section id="slide-orgec5274e"> +<h2 id="orgec5274e">2019: guix deploy</h2> +<ul> +<li>Wanted an answer to Chef, Ansible, etc.</li> +<li>Co-mentored Jakob L. Kreuze with Christine Lemmer-Webber for Google +Summer of Code</li> +<li>A GSoC project that made it upstream!</li> +<li>I now manage my personal server with <code>guix deploy</code></li> +<li>Lots of improvements could be made +<ul> +<li>Any volunteers? 🙂</li> + +</ul></li> + +</ul> + +</section> +</section> +<section> +<section id="slide-orgab15080"> +<h2 id="orgab15080">Intermission: Pandemic</h2> + +</section> +</section> +<section> +<section id="slide-org2cbde34"> +<h2 id="org2cbde34">2022: Lisp Game Jam</h2> +<ul> +<li>Became co-host of the Lisp Game Jam on itch.io +<ul> +<li>along with Fennel maintainer technomancy</li> + +</ul></li> +<li>This will become relevant shortly</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-org3f25a25"> +<h2 id="org3f25a25">2022: Spritely</h2> +<img style="background-color: #edeaee; border-radius: 5px;" class="stretch" src="spritely-institute-logo.png"> + +<ul> +<li>Spritely is a US 501(c)(3) nonprofit</li> +<li>Cofounded by <b>Christine Lemmer-Webber</b> +<ul> +<li>now famous for ActivityPub!</li> + +</ul></li> +<li>Building the next generation of <b>secure</b>, distributed networking +infrastructure</li> +<li>Object capability security</li> + +</ul> + +<p> +<a href="https://spritely.institute">https://spritely.institute</a> +</p> + +</section> +</section> +<section> +<section id="slide-org55f9142"> +<h2 id="org55f9142">OCapN: The Object Capability Network</h2> +<video src="ocapn-handoff.mp4" autoplay="true" loop="true" class="stretch"/> + +</section> +</section> +<section> +<section id="slide-org7d1a1bc"> +<h2 id="org7d1a1bc">OCapN</h2> +<ul> +<li>Open standard for capability-secure networking</li> +<li>Pre-standardization phase</li> + +</ul> + +<p> +<a href="https://ocapn.org">https://ocapn.org</a> +</p> + +</section> +</section> +<section> +<section id="slide-orga5d2240"> +<h2 id="orga5d2240">My role at Spritely</h2> +<ul> +<li>Initially hired as Core Infrastructure Architect +<ul> +<li>now CTO</li> + +</ul></li> +<li>First big project: Distributed debugging</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-org3a26587"> +<h2 id="org3a26587">2023: Distributed debugger</h2> +<img class="stretch" src="questie-lamport-diagram.png"> + +</section> +</section> +<section> +<section id="slide-orga522489"> +<h2 id="orga522489">How Spritely uses Guix</h2> +<ul> +<li><code>guix shell</code> for development environments</li> +<li><code>guix deploy</code> to manage servers over SSH</li> +<li><code>guix pack -f docker</code> to build CI images</li> +<li>Goblins and Hoot releases are immediately published to Guix on +release day</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-org002722e"> +<h2 id="org002722e">Highlight: GitLab CI</h2> +<p> +I've noticed people asking about this lately: +</p> + +<div class="org-src-container"> + +<pre class="src src-sh" ><code trim>guix pack -m ci-manifest.scm -C zstd -f docker -S /bin=bin +skopeo copy ... +</code></pre> +</div> + +</section> +</section> +<section> +<section id="slide-org3dcefa7"> +<h2 id="org3dcefa7">2023: Hoot</h2> +<img class="stretch" src="hoot-future-of-scheme-hacking.png"> + +</section> +</section> +<section> +<section id="slide-org6ec5278"> +<h2 id="org6ec5278">2023: Hoot</h2> +<ul> +<li>Hoot is a Scheme-to-WebAssembly compiler +<ul> +<li>with its own toolchain!</li> +<li><b>No</b> emscripten!</li> + +</ul></li> +<li>Scheme in the browser!</li> +<li>Lead engineer: Andy Wingo (Guile maintainer)</li> +<li>I wrote the Wasm interpreter <code>(wasm vm)</code></li> +<li>Still actively working on toolchain and Scheme implementation</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-orgeb72c71"> +<h2 id="orgeb72c71">2023: Strigoform</h2> +<iframe frameborder="0" src="https://itch.io/embed-upload/8997570?color=333333" allowfullscreen="" width="482" height="662"><a href="https://davexunit.itch.io/strigoform">Play Strigoform on itch.io</a></iframe> + +</section> +</section> +<section> +<section id="slide-orgc4acb3e"> +<h2 id="orgc4acb3e">2023: Strigoform</h2> +<ul> +<li>My game dev fascination comes full circle!</li> +<li>Made for the Autumn Lisp Game Jam</li> +<li>One of the first Wasm GC games to be published</li> +<li>Built with Hoot 0.1 + some additional stuff from the main branch</li> +<li>Largest program built with Hoot at the time</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-org1a33ba5"> +<h2 id="org1a33ba5">2024: Cirkoban</h2> +<iframe frameborder="0" src="https://itch.io/embed-upload/10583669?color=222034" allowfullscreen="" width="640" height="500"><a href="https://davexunit.itch.io/cirkoban">Play Cirkoban on itch.io</a></iframe> + +</section> +</section> +<section> +<section id="slide-org0e79ea0"> +<h2 id="org0e79ea0">2024: Cirkoban</h2> +<ul> +<li>Made for the Spring Lisp Game Jam</li> +<li>Built with Hoot 0.4.1 and a WIP port of Goblins</li> +<li>Uses Goblins actors and transactional rollback</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-orgd6da513"> +<h2 id="orgd6da513">The future: guix develop</h2> +<ul> +<li><code>docker compose</code> but for Guix</li> +<li>I've wanted this for 10 years!</li> +<li>Like <code>guix shell</code> but also spawns a Shepherd</li> +<li>Uh oh, <b>another</b> kind of service?</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-org2b8b169"> +<h2 id="org2b8b169">The future: Distributed shepherd</h2> +<ul> +<li>Currently funded by NLnet and in development by Juli Sims</li> +<li>Shepherd + Spritely Goblins</li> +<li>Orchestrate clusters of Guix machines securely!</li> +<li><code>guix deploy</code> over Object Capabilities Network (OCapN)?</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-orgbafb4a2"> +<h2 id="orgbafb4a2">The future: Distributed substitutes</h2> +<ul> +<li>Using ERIS perhaps? +<a href="https://codeberg.org/eris/guile-eris/">https://codeberg.org/eris/guile-eris/</a></li> + +</ul> + +</section> +</section> +<section> +<section id="slide-org0a57b77"> +<h2 id="org0a57b77">The future: Guix, the OCap OS</h2> +<ul> +<li>Unified services (no system vs. home split)</li> +<li>Reduce ambient authority on Linux</li> +<li>Build on <code>call-with-container</code>?</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-orgf84a50a"> +<h2 id="orgf84a50a">The future: Chickadee + Hoot</h2> +<ul> +<li>Native + web builds of Guile games from the same source</li> +<li>Need to improve Wasm GC to make this possible</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-org65ee8c0"> +<h2 id="org65ee8c0">Fin</h2> +<ul> +<li>Opportunties come from unexpected vectors</li> +<li>Guile and Guix have come a long way!</li> +<li>Keep pushing the limits of what Guile can do!</li> +<li>Thank you to the Guix Social organizers!</li> + +</ul> + +</section> +</section> +<section> +<section id="slide-org7a392c5"> +<h2 id="org7a392c5">Questions?</h2> +<p> +<a href="https://dthompson.us">https://dthompson.us</a> +</p> + +<p> +<a href="https://spritely.institute">https://spritely.institute</a> +</p> +</section> +</section> +</div> +</div> +<script src="reveal.js/dist/reveal.js"></script> +<script src="reveal.js/plugin/markdown/markdown.js"></script> +<script src="reveal.js/plugin/zoom/zoom.js"></script> +<script src="reveal.js/plugin/notes/notes.js"></script> + + +<script> +// Full list of configuration options available here: +// https://github.com/hakimel/reveal.js#configuration +Reveal.initialize({ +plugins: [RevealMarkdown, RevealZoom, RevealNotes] +}); + +</script> +</body> +</html> |