summaryrefslogtreecommitdiff
path: root/2024-06-18-guix-social/slides.html
diff options
context:
space:
mode:
authorDavid Thompson <dthompson2@worcester.edu>2024-06-24 13:49:08 -0400
committerDavid Thompson <dthompson2@worcester.edu>2024-06-24 13:52:17 -0400
commitd283f7e661e14d6ae1881fe803e5b4f1ed0689ff (patch)
tree84d3811c6dcb7d7f02aecadad7b2dfacce83bd4f /2024-06-18-guix-social/slides.html
parent3d9dcd3099fb252fa35697148fbbd541eb9eecc9 (diff)
Add 2024 Guix social talk.HEADmaster
Diffstat (limited to '2024-06-18-guix-social/slides.html')
-rw-r--r--2024-06-18-guix-social/slides.html681
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&#x2026;</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&#x2026; 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-&gt;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>