Fix typos and consistency issues across all presentation files

Torey Heinz committed Feb 23, 2026
commit b38751f79b5530d7c1123c2c52de07a9ce1ba279
Showing 4 changed files with 14 additions and 14 deletions
02-the-language.livemd +2 -2
@@ @@ -54,7 +54,7 @@ IO.puts("Got: #{result}")
That's not a bug — it's a feature. If you expect `:ok` and get `:error`,
Elixir tells you immediately instead of silently continuing with bad data.
- **JavaScript:** Simalar to destructuring — but it also
+ **JavaScript:** Similar to destructuring — but it also
validates the shape of your data at the same time.
## Pattern Matching: Function Heads
@@ @@ -161,7 +161,7 @@ what case it handles.
## Pattern Matching: The `with` Statement
- Real-world code often has multiple steps that can each fail. In other langauges there's an Interactor pattern that often requires a whole library to implement. Elixir has the built in `with` Statement
+ Real-world code often has multiple steps that can each fail. In other languages there's an Interactor pattern that often requires a whole library to implement. Elixir has the built-in `with` statement
```elixir
defmodule OrderProcessor do
scratch.md +6 -3
@@ @@ -179,9 +179,6 @@ Drop:
Let's rethink the "wrap-up" it should
- Rewrite "What we covered" based on the current slides.
- - slides/01-intro.html
- - 02-the-language.livemd
- - 03-real-world.livemd
- Highlight all the awesome things Elixir provides: This may take multiple slides
- Supervision, GenServer, pattern matching, with chains, concurrency, LiveView.
@@ @@ -191,3 +188,9 @@ Let's rethink the "wrap-up" it should
Real-time features come for free
- These aren't separate tools bolted together. They're all built into the language and framework.
+
+ Okay, let's finalize the presentation.
+ Review each of these files for typos and consistency. Are we building a case for Elixir in a way that web developers will understand?
+ - slides/01-intro.html
+ - 02-the-language.livemd
+ - slides/03-real-world.html
slides/01-intro.html +1 -1
@@ @@ -112,7 +112,7 @@
<ol>
<li class="fragment"><strong>Why Elixir?</strong> &mdash; Where it comes from and why it matters</li>
<li class="fragment"><strong>The Language</strong> &mdash; Pattern matching, processes, and LiveView <em>(live demos!)</em></li>
- <li class="fragment"><strong>Real-World Code</strong> &mdash; Production systems from at Vianet</li>
+ <li class="fragment"><strong>Real-World Code</strong> &mdash; Production systems at Vianet</li>
</ol>
<p class="fragment muted" style="margin-top: 1em;">Then we'll open it up for Q&amp;A.</p>
slides/03-real-world.html +5 -8
@@ @@ -51,7 +51,7 @@
<p>500,000+ personalized emails through AWS SES</p>
<aside class="notes">
- First system: our email marketing platform. This sends half a million personalized emails through
+ First system: our email marketing platform. This sends half a million personalized emails through AWS SES. The challenge isn't just volume — it's doing it reliably without exceeding rate limits.
</aside>
</section>
@@ @@ -98,10 +98,10 @@ defmodule Marketing.CampaignSchedulerWorker do
@chunk_size 2_000
def perform(%Oban.Job{args: args}) do
- member_ids = Campaigns.member_ids(args["campaign_id"])
+ campaign = Campaigns.get_campaign!(args["campaign_id"])
Repo.transaction(fn ->
- Repo.stream(member_ids(campaign), max_rows: @chunk_size)
+ Repo.stream(Campaigns.member_ids_query(campaign), max_rows: @chunk_size)
|> Stream.chunk_every(@chunk_size)
|> Enum.each(&schedule_batch(&1, campaign))
end, timeout: :infinity)
@@ @@ -296,7 +296,7 @@ end
</ul>
<p class="fragment" style="font-size: 0.8em; margin-top: 0.8em; color: #555;">
These services took <strong>years</strong> to build originally.<br/>
- <span class="fragment">With <strong>Elixir</strong> + Claude Code,<br> we replaced them all in <strong>under six months</strong>.</span>
+ <span class="fragment">With <strong>Elixir</strong> + Claude Code,<br> we replaced them all in <strong>under six months</strong>.</span>
</p>
<aside class="notes">
@@ @@ -389,12 +389,9 @@ def mount(params, _session, socket) do
end
</code></pre>
- <!-- <p class="fragment" style="font-size: 0.7em; color: #555;">
- <code>assign_async</code> loads admin lists from 3 databases <strong>concurrently</strong> &mdash; loading states come for free.
- </p> -->
<aside class="notes">
- Here's a real LiveView form. It loads data from three different databases asynchronously using assign_async. The loading states are automatic. Pattern matching determines if we're creating or editing. The form submission is just an Elixir function, not a REST endpoint.
+ Here's a real LiveView mount function. It loads admin lists from three different databases asynchronously using assign_async. All three queries run concurrently, and loading states are automatic — the template gets spinners for free while data loads.
</aside>
</section>