webring 1.1.1 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/dist/fetch.d.ts.map +1 -1
- package/dist/fetch.js.map +1 -1
- package/dist/index.test.js +31 -26
- package/dist/index.test.js.map +1 -1
- package/package.json +14 -12
- package/src/__snapshots__/index.test.ts.snap +3 -52
- package/src/fetch.ts +1 -0
- package/src/index.test.ts +35 -26
- package/src/testdata/rss-1.xml +2135 -0
- package/src/testdata/rss-10.xml +1029 -0
- package/src/testdata/rss-11.xml +881 -0
- package/src/testdata/rss-12.xml +4193 -0
- package/src/testdata/rss-13.xml +518 -0
- package/src/testdata/rss-14.xml +155 -0
- package/src/testdata/rss-15.xml +731 -0
- package/src/testdata/rss-16.xml +44 -0
- package/src/testdata/rss-17.xml +120 -0
- package/src/testdata/rss-18.xml +50 -0
- package/src/testdata/rss-19.xml +690 -0
- package/src/testdata/rss-2.xml +2186 -0
- package/src/testdata/rss-3.xml +80356 -0
- package/src/testdata/rss-4.xml +1601 -0
- package/src/testdata/rss-5.xml +3991 -0
- package/src/testdata/rss-6.xml +825 -0
- package/src/testdata/rss-7.xml +35 -0
- package/src/testdata/rss-8.xml +12516 -0
- package/src/testdata/rss-9.xml +369 -0
|
@@ -0,0 +1,690 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
<feed xmlns="http://www.w3.org/2005/Atom">
|
|
5
|
+
<title>fasterthanli.me</title>
|
|
6
|
+
<subtitle>amos likes to tinker</subtitle>
|
|
7
|
+
<link href="https://fasterthanli.me"/>
|
|
8
|
+
<link rel="self" href="https://fasterthanli.me/index.xml"/>
|
|
9
|
+
<id>https://fasterthanli.me/</id>
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
<updated>2024-04-08T16:30:00Z</updated>
|
|
13
|
+
|
|
14
|
+
<author>
|
|
15
|
+
<name>Amos Wenger</name>
|
|
16
|
+
<uri>https://fasterthanli.me</uri>
|
|
17
|
+
</author>
|
|
18
|
+
<category term="programming"/>
|
|
19
|
+
<category term="computers"/>
|
|
20
|
+
<category term="rust"/>
|
|
21
|
+
<generator>told</generator>
|
|
22
|
+
<icon>https://cdn.fasterthanli.me/static/img/logo-square-2~028c7cae6c294ec7.png</icon>
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
<entry>
|
|
26
|
+
|
|
27
|
+
<title>EuroRust welcomes independent workers (updated)</title>
|
|
28
|
+
<link rel="alternate" href="https://fasterthanli.me/articles/eurorust-2024-officially-welcomes-independent-workers"/>
|
|
29
|
+
<id>https://fasterthanli.me/articles/eurorust-2024-officially-welcomes-independent-workers</id>
|
|
30
|
+
<updated>2024-04-08T16:30:00Z</updated>
|
|
31
|
+
<summary type="html">
|
|
32
|
+
<div class="dialog amos">
|
|
33
|
+
<div class="dialog-head" title="Amos says:">
|
|
34
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 26.5 26.5"><path style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1" d="M14.3 3c-1.4-.2-3 .2-4 .3-1.5 0-2.9 1-3.9 2L5.3 6.6c-.3.5-.6 1.1-.5 1.8l-.5 2.8c0 1 0 2 .5 2.7h.1l.3.3.1.3c0 .3 0 .8.3 1.2 1.5 1.6 2.6 3.5 3.7 5.4l.5-.2-1-1.7c-.4-.8-1-1.5-1.2-2.2L7 14.1l-.2-.2-.1-.5.2-1c.3-.9.7-1.7.8-2.4-.1-.7 0-1.1.3-1.5a4 4 0 011.1-1c1.2-1 3.2-1.2 4.6-1 .7.2 1.4.5 1.8 1.1a10.4 10.4 0 011.1 2.7V11c.4 1.3.5 2.2.5 3.4v1.1a3.2 3.2 0 000 .4v.2h.5v-.2l.2-.3.3-.6v-.1c.2.2.3.3.3.6l.4 1.5.4 1.2.2.5.2.1h.4c.8-.7 1.6-1.5 2-2.5.5-.8.6-1.7.5-2.5l.4-1.5c0-.6 0-1.2-.2-1.8-.4-1.4-1.1-2.8-2.1-4l-1.6-1.3c-.7-.5-1.6-1-2.5-1-.6 0-.9-.2-1.2-.5l-.3-.4a.9.9 0 00-.6-.3zm0 .5l.1.2.4.4c.3.4.8.7 1.6.7.7 0 1.5.4 2.2 1L20 6.8c.9 1.2 1.6 2.4 2 3.8v.1c.2.4.2.9.1 1.4 0 .5-.2 1-.4 1.5v.1c0 .8 0 1.6-.3 2.2-.4.9-1 1.5-1.8 2.1l-.4-1.3-.4-1.5a4 4 0 00-.5-1.2H18l-.5.5v-.2c0-1.2 0-2.2-.4-3.5v-.6a10.9 10.9 0 00-1.2-2.9A3 3 0 0013.7 6a6.7 6.7 0 00-6.3 2.2c-.3.5-.5 1-.4 1.8 0 .4-.5 1.3-.7 2.2a5 5 0 00-.3 1.2c0 .4 0 .8.4 1v-.1c0 .5.3 1.3.5 2l-.8-1c-.2-.2-.2-.6-.2-1 0-.2 0-.4-.2-.6l-.4-.3c-.4-.5-.5-1.3-.4-2.2l.5-3c-.1-.5 0-.9.4-1.3l1-1.3c1-.9 2.3-1.8 3.5-1.9 1.1 0 2.7-.4 4-.3zM7 17.1z" color="#000"/><path d="M11.6 19.9c.4 0 .2 0 .6-.3.2-.1.3-.6 0-.5-.3 0-1.2.2-1.4 0-.3.3.1.6.4.8zM9.2 17.6c.4-.4.7-.6 1.4-.7.8-.3 1.6-.1 2.4 0 .4.1.9 0 1.2.3l-.4.3c-.7 0-1.4.2-2 .3l-1.5.1h-1c-.3 0-.3-.2-.1-.3z" fill="#000004"/><path style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-variant-east-asian:normal;font-feature-settings:normal;font-variation-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;white-space:normal;shape-padding:0;shape-margin:0;inline-size:0;isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1" d="M18.3 6.7l-.2.2c1 .8 1.4 1.4 1.6 2l1 2.4.3-.1-1-2.4c-.3-.7-.7-1.3-1.7-2zM15.3 5.4l-.1.3c.8.3 1.4 1 2 2 .6 1 1.1 2.2 1.9 3.4l.3.7.2 1 .3 1.4h.3l-.3-1.4a15.4 15.4 0 00-.6-1.9l-1.9-3.3c-.6-1-1.2-1.8-2.1-2.2zM17.8 19c0 .6-1 1.3-1.3 1.6a11.5 11.5 0 01-1.4.8l-.1.1.3.5h.1a36 36 0 001.5-1c.3-.2 1.4-.9 1.5-2h-.6zM15 21.6z" color="#000"/><g><path d="M13.9 10.7a4 4 0 00-2.8 1l-1.6.4c-.5-.2-1-.5-1.5-.5-.6 0-1.1.2-1.7.4-.3.2-1.3.3-.9.8.7-.1.3.7.6 1 .3.7.8 1.3 1.4 1.5.7.3 1.5 0 2-.6.3-.6.5-1.4.4-2.2 0-.3.7-.3 1-.3.3.2.2.8.5 1.2.3.6.8 1 1.5 1.3.9.3 2 0 2.6-.7.5-.7.7-1.5.7-2.3.2-.5 1-.2 1.2-.5 0-.2-.2-.4-.5-.3l-3-.2zm.3.5c.3 0 .5.4.2.6l-.5.4-1.3 1c-.2.4-.6.3-.7 0 0-.2.1-.3.3-.5l1.6-1.3.4-.2zm-5.8 1c.3 0 .4.3.2.4l-.4.4-1.1 1c-.1.1-.5.1-.5-.1l.1-.4 1.4-1.1.3-.2zm6 .1c.1 0 .2.2.1.3l-1 1c-.2.1-.6-.2-.4-.4l.9-.7.4-.2zm-5.7.7c.1 0 .2.2 0 .3l-.8.8c-.1.1-.4-.1-.2-.3l.7-.6.3-.2z"/></g></svg>
|
|
35
|
+
</div>
|
|
36
|
+
<div class="dialog-text">
|
|
37
|
+
<p>TL;DR I purchased individual tickets for EuroRust and added my VAT number, so
|
|
38
|
+
it could be a tax-deductible expense for me as an independent worker.</p>
|
|
39
|
+
<p>The organizers reached out asking me to buy business tickets instead. I'm asking
|
|
40
|
+
them to reconsider their policy.</p>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
<h2>
|
|
45
|
+
<a id="update-eurorust-introduces-a-freelancer-ticket" class="anchor" href="#update-eurorust-introduces-a-freelancer-ticket">
|
|
46
|
+
Update: EuroRust introduces a freelancer ticket
|
|
47
|
+
</a>
|
|
48
|
+
</h2>
|
|
49
|
+
</summary>
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
<category term="rust"/>
|
|
54
|
+
|
|
55
|
+
<category term="eurorust"/>
|
|
56
|
+
|
|
57
|
+
<category term="conference"/>
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
</entry>
|
|
61
|
+
|
|
62
|
+
<entry>
|
|
63
|
+
|
|
64
|
+
<title>Face cams: the missing guide</title>
|
|
65
|
+
<link rel="alternate" href="https://fasterthanli.me/articles/face-cams-the-missing-guide"/>
|
|
66
|
+
<id>https://fasterthanli.me/articles/face-cams-the-missing-guide</id>
|
|
67
|
+
<updated>2024-03-02T18:00:00Z</updated>
|
|
68
|
+
<summary type="html">
|
|
69
|
+
<p>I try to avoid doing "meta" / "behind the scenes" stuff, because I usually feel
|
|
70
|
+
like it has to be "earned". How many YouTube channels are channels about making
|
|
71
|
+
YouTube videos? Too many.</p>
|
|
72
|
+
</summary>
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
<category term="meta"/>
|
|
77
|
+
|
|
78
|
+
<category term="production"/>
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
</entry>
|
|
82
|
+
|
|
83
|
+
<entry>
|
|
84
|
+
|
|
85
|
+
<title>Just paying Figma $15/month because nothing else fucking works</title>
|
|
86
|
+
<link rel="alternate" href="https://fasterthanli.me/articles/just-paying-figma-15-dollars"/>
|
|
87
|
+
<id>https://fasterthanli.me/articles/just-paying-figma-15-dollars</id>
|
|
88
|
+
<updated>2023-10-19T16:50:00Z</updated>
|
|
89
|
+
<summary type="html">
|
|
90
|
+
<p>My family wasn't poor by any stretch of the imagination, but I was raised to
|
|
91
|
+
avoid spending money whenever possible.</p>
|
|
92
|
+
<p>I was also taught "it's a poor craftsman that blames their tools", which
|
|
93
|
+
apparently means "take responsibility for your fuckups", but, to young-me,
|
|
94
|
+
definitely sounded more like "you don't deserve nice things".</p>
|
|
95
|
+
</summary>
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
<category term="rant"/>
|
|
100
|
+
|
|
101
|
+
<category term="foss"/>
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
</entry>
|
|
105
|
+
|
|
106
|
+
<entry>
|
|
107
|
+
|
|
108
|
+
<title>Cracking Electron apps open</title>
|
|
109
|
+
<link rel="alternate" href="https://fasterthanli.me/articles/cracking-electron-apps-open"/>
|
|
110
|
+
<id>https://fasterthanli.me/articles/cracking-electron-apps-open</id>
|
|
111
|
+
<updated>2023-07-03T16:30:00Z</updated>
|
|
112
|
+
<summary type="html">
|
|
113
|
+
<p>I use the <a href="https://github.com/jgraph/drawio-desktop">draw.io desktop app</a> to
|
|
114
|
+
make diagrams for my website. I run it on an actual desktop, like Windows or
|
|
115
|
+
macOS, but the asset pipeline that converts <code>.drawio</code> files, to <code>.pdf</code>, to
|
|
116
|
+
<code>.svg</code>, and then to <code>.svg</code> again (but smaller) runs on Linux.</p>
|
|
117
|
+
</summary>
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
<category term="electron"/>
|
|
122
|
+
|
|
123
|
+
<category term="rust"/>
|
|
124
|
+
|
|
125
|
+
<category term="asar"/>
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
</entry>
|
|
129
|
+
|
|
130
|
+
<entry>
|
|
131
|
+
|
|
132
|
+
<title>The RustConf Keynote Fiasco, explained</title>
|
|
133
|
+
<link rel="alternate" href="https://fasterthanli.me/articles/the-rustconf-keynote-fiasco-explained"/>
|
|
134
|
+
<id>https://fasterthanli.me/articles/the-rustconf-keynote-fiasco-explained</id>
|
|
135
|
+
<updated>2023-05-31T21:00:00Z</updated>
|
|
136
|
+
<summary type="html">
|
|
137
|
+
<div class="disclosure">
|
|
138
|
+
<p><strong>Disclosure</strong>:
|
|
139
|
+
At some point in this article, I discuss The Rust Foundation. I have received a
|
|
140
|
+
$5000 grant from them in 2023 for making educational articles and videos about
|
|
141
|
+
Rust.</p>
|
|
142
|
+
<p>I have NOT signed any non-disclosure, non-disparagement, or any other sort of
|
|
143
|
+
agreement that would prevent me from saying exactly how I feel about their
|
|
144
|
+
track record.</p>
|
|
145
|
+
</div>
|
|
146
|
+
<div class="disclosure">
|
|
147
|
+
|
|
148
|
+
</div>
|
|
149
|
+
</summary>
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
<category term="rust"/>
|
|
154
|
+
|
|
155
|
+
<category term="governance"/>
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
</entry>
|
|
159
|
+
|
|
160
|
+
<entry>
|
|
161
|
+
|
|
162
|
+
<title>Rust: The wrong people are resigning</title>
|
|
163
|
+
<link rel="alternate" href="https://fasterthanli.me/articles/rust-the-wrong-people-are-resigning"/>
|
|
164
|
+
<id>https://fasterthanli.me/articles/rust-the-wrong-people-are-resigning</id>
|
|
165
|
+
<updated>2023-05-28T17:04:00Z</updated>
|
|
166
|
+
<summary type="html">
|
|
167
|
+
<p>(Note: this was originally posted <a href="https://gist.github.com/fasterthanlime/42da9378768aebef662dd26dddf04849">as a
|
|
168
|
+
gist</a>)</p>
|
|
169
|
+
|
|
170
|
+
<h2>
|
|
171
|
+
<a id="reassuring-myself-about-rust" class="anchor" href="#reassuring-myself-about-rust">
|
|
172
|
+
Reassuring myself about Rust
|
|
173
|
+
</a>
|
|
174
|
+
</h2>
|
|
175
|
+
</summary>
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
<category term="rust"/>
|
|
180
|
+
|
|
181
|
+
<category term="governance"/>
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
</entry>
|
|
185
|
+
|
|
186
|
+
<entry>
|
|
187
|
+
|
|
188
|
+
<title>Extra credit</title>
|
|
189
|
+
<link rel="alternate" href="https://fasterthanli.me/series/building-a-rust-service-with-nix/part-12"/>
|
|
190
|
+
<id>https://fasterthanli.me/series/building-a-rust-service-with-nix/part-12</id>
|
|
191
|
+
<updated>2023-03-05T07:30:12Z</updated>
|
|
192
|
+
<summary type="html">
|
|
193
|
+
<p>We've achieved our goals already with this series: we have a web service written
|
|
194
|
+
in Rust, built into a Docker image with nix, with a nice dev shell, that we can
|
|
195
|
+
deploy to <a href="https://fly.io">fly.io</a>.</p>
|
|
196
|
+
<p>But there's always room for improvement, and so I wanted to talk about a few
|
|
197
|
+
things we didn't bother doing in the previous chapters.</p>
|
|
198
|
+
|
|
199
|
+
<h2>
|
|
200
|
+
<a id="making-clash-geoip-available-in-the-dev-shell" class="anchor" href="#making-clash-geoip-available-in-the-dev-shell">
|
|
201
|
+
Making <code>clash-geoip</code> available in the dev shell
|
|
202
|
+
</a>
|
|
203
|
+
</h2>
|
|
204
|
+
</summary>
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
<category term="rust"/>
|
|
209
|
+
|
|
210
|
+
<category term="nix"/>
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
</entry>
|
|
214
|
+
|
|
215
|
+
<entry>
|
|
216
|
+
|
|
217
|
+
<title>Generating a docker image with nix</title>
|
|
218
|
+
<link rel="alternate" href="https://fasterthanli.me/series/building-a-rust-service-with-nix/part-11"/>
|
|
219
|
+
<id>https://fasterthanli.me/series/building-a-rust-service-with-nix/part-11</id>
|
|
220
|
+
<updated>2023-03-05T07:30:11Z</updated>
|
|
221
|
+
<summary type="html">
|
|
222
|
+
<p>There it is. The final installment.</p>
|
|
223
|
+
<p>Over the course of this series, we've built a <em>very useful</em> Rust web service
|
|
224
|
+
that shows us colored ASCII art cats, and we've packaged it with docker, and
|
|
225
|
+
deployed it to <a href="https://fly.io">https://fly.io</a>.</p>
|
|
226
|
+
</summary>
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
<category term="nix"/>
|
|
231
|
+
|
|
232
|
+
<category term="rust"/>
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
</entry>
|
|
236
|
+
|
|
237
|
+
<entry>
|
|
238
|
+
|
|
239
|
+
<title>Making a dev shell with nix flakes</title>
|
|
240
|
+
<link rel="alternate" href="https://fasterthanli.me/series/building-a-rust-service-with-nix/part-10"/>
|
|
241
|
+
<id>https://fasterthanli.me/series/building-a-rust-service-with-nix/part-10</id>
|
|
242
|
+
<updated>2023-03-05T07:30:10Z</updated>
|
|
243
|
+
<summary type="html">
|
|
244
|
+
<p>In the previous chapter, we've made a nix "dev shell" that contained the fly.io
|
|
245
|
+
command-line utility, "flyctl".</p>
|
|
246
|
+
<p>That said, that's not how I want us to define a dev shell.</p>
|
|
247
|
+
<p>Our current solution has issues. I don't like that it has <code>import &lt;nixpkgs&gt;</code>.
|
|
248
|
+
Which version of <code>nixpkgs</code> is that? The one you're on? Who knows what that is.</p>
|
|
249
|
+
</summary>
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
<category term="nix"/>
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
</entry>
|
|
257
|
+
|
|
258
|
+
<entry>
|
|
259
|
+
|
|
260
|
+
<title>Learning Nix from the bottom up</title>
|
|
261
|
+
<link rel="alternate" href="https://fasterthanli.me/series/building-a-rust-service-with-nix/part-9"/>
|
|
262
|
+
<id>https://fasterthanli.me/series/building-a-rust-service-with-nix/part-9</id>
|
|
263
|
+
<updated>2023-03-05T07:30:09Z</updated>
|
|
264
|
+
<summary type="html">
|
|
265
|
+
<p>Remember the snapshot we made allll the way back in <a href="part-1">Part 1</a>? Now's the time to use it.</p>
|
|
266
|
+
<p>Well, make sure you've committed and pushed all your changes, but when you're
|
|
267
|
+
ready, let's go back in time to before we installed anything catscii-specific in
|
|
268
|
+
our VM.</p>
|
|
269
|
+
</summary>
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
<category term="nix"/>
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
</entry>
|
|
277
|
+
|
|
278
|
+
<entry>
|
|
279
|
+
|
|
280
|
+
<title>Doing geo-location and keeping analytics</title>
|
|
281
|
+
<link rel="alternate" href="https://fasterthanli.me/series/building-a-rust-service-with-nix/part-8"/>
|
|
282
|
+
<id>https://fasterthanli.me/series/building-a-rust-service-with-nix/part-8</id>
|
|
283
|
+
<updated>2023-03-05T07:30:08Z</updated>
|
|
284
|
+
<summary type="html">
|
|
285
|
+
<p>I sold you on some additional functionality for <code>catscii</code> last chapter, and we
|
|
286
|
+
got caught up in private registry / docker shenanigans, so, now, let's resume
|
|
287
|
+
web development as promised.</p>
|
|
288
|
+
|
|
289
|
+
<h2>
|
|
290
|
+
<a id="adding-geolocation" class="anchor" href="#adding-geolocation">
|
|
291
|
+
Adding geolocation
|
|
292
|
+
</a>
|
|
293
|
+
</h2>
|
|
294
|
+
</summary>
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
<category term="rust"/>
|
|
299
|
+
|
|
300
|
+
<category term="webdev"/>
|
|
301
|
+
|
|
302
|
+
<category term="sqlite"/>
|
|
303
|
+
|
|
304
|
+
<category term="geoip"/>
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
</entry>
|
|
308
|
+
|
|
309
|
+
<entry>
|
|
310
|
+
|
|
311
|
+
<title>Using the Shipyard private crate registry with Docker</title>
|
|
312
|
+
<link rel="alternate" href="https://fasterthanli.me/series/building-a-rust-service-with-nix/part-7"/>
|
|
313
|
+
<id>https://fasterthanli.me/series/building-a-rust-service-with-nix/part-7</id>
|
|
314
|
+
<updated>2023-03-05T07:30:07Z</updated>
|
|
315
|
+
<summary type="html">
|
|
316
|
+
<div class="dialog bear">
|
|
317
|
+
<div class="dialog-head" title="Cool bear says:">
|
|
318
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path d="M21.41 41.398c.148-1.787.337-3.572.574-5.351.369-2.772 4.393-11.308 5.624-12.882l.553-.706-1.344-.449a5.772 5.772 0 0 1-3.948-5.478 5.786 5.786 0 0 1 5.779-5.78 5.768 5.768 0 0 1 5.684 4.758l.249 1.396 1.231-.704a28.845 28.845 0 0 1 14.282-3.801c4.991 0 9.93 1.314 14.282 3.801l1.231.704.249-1.396a5.766 5.766 0 0 1 5.683-4.758 5.786 5.786 0 0 1 5.779 5.78 5.772 5.772 0 0 1-3.948 5.478l-1.344.449.552.705c1.911 2.44 2.55 2.541 3.563 5.599 1.422 4.293 2.923 7.964 2.923 12.61v49.875h2V41.373c0-6.519-2.008-12.717-5.819-18.005a7.768 7.768 0 0 0 4.072-6.836c0-4.29-3.49-7.78-7.779-7.78a7.766 7.766 0 0 0-7.3 5.1 30.834 30.834 0 0 0-14.146-3.45 30.834 30.834 0 0 0-14.146 3.45 7.766 7.766 0 0 0-7.301-5.1c-4.289 0-7.779 3.49-7.779 7.78a7.766 7.766 0 0 0 4.072 6.836c-6.681 9.271-5.976 21.037-5.992 32.034-.017 11.946.656 23.895.109 35.838l2.006-.001c.67 0-.17-33.831-.156-36.912.022-4.312.148-8.631.505-12.929z"/><path d="M73.854 31.271v-4.494c0-.971-.79-1.76-1.761-1.76H55.235c-.604 0-1.3.869-1.778 1.905-.015 0-.027-.008-.042-.008H46.789c-.02 0-.037.011-.057.011-.478-1.037-1.175-1.908-1.779-1.908H28.094c-.971 0-1.761.79-1.761 1.76v4.494c0 4.477 3.643 8.119 8.119 8.119h5.12c4.265 0 7.734-3.47 7.734-7.734v-2.091H52.878v2.091c0 4.265 3.47 7.734 7.734 7.734h5.121c4.479-.001 8.121-3.643 8.121-8.119zm-41.713 3.192a1.387 1.387 0 0 1-1.917-.442 1.392 1.392 0 0 1 .442-1.917l8.403-5.255a1.392 1.392 0 0 1 1.475 2.359l-8.403 5.255zm11.163-2.18l-5.75 3.597a.95.95 0 0 1-1.313-.302.952.952 0 0 1 .303-1.312l5.75-3.597a.953.953 0 0 1 1.01 1.614zm15.168 1.935a1.387 1.387 0 0 1-1.917-.442 1.392 1.392 0 0 1 .442-1.917l8.403-5.255a1.392 1.392 0 0 1 1.475 2.359l-8.403 5.255zm4.909 1.561a.953.953 0 0 1-.506-1.759l5.75-3.597a.952.952 0 1 1 1.01 1.614l-5.75 3.597a.942.942 0 0 1-.504.145z"/><path d="M59.705 45.232h-2c0 1.823-1.483 3.306-3.306 3.306s-3.306-1.483-3.306-3.306v-1.439h1.06a3.294 3.294 0 0 0 3.285-3.285v-.17c0-.259-.038-.508-.095-.749a3.291 3.291 0 0 0-2.665-2.482 3.243 3.243 0 0 0-.525-.053h-4.12c-.18 0-.353.025-.525.053a3.291 3.291 0 0 0-2.665 2.482 3.255 3.255 0 0 0-.095.749v.17a3.294 3.294 0 0 0 3.285 3.285h1.06v1.439a3.31 3.31 0 0 1-3.307 3.306 3.31 3.31 0 0 1-3.306-3.306h-2a5.312 5.312 0 0 0 5.306 5.306 5.293 5.293 0 0 0 4.306-2.229 5.294 5.294 0 0 0 4.306 2.229 5.313 5.313 0 0 0 5.307-5.306zM29.742 58.336a.703.703 0 0 0-1.406 0v5.368a.704.704 0 0 0 1.406 0v-5.368zM43.779 58.336a.703.703 0 0 0-1.406 0v5.368a.704.704 0 0 0 1.406 0v-5.368zM57.816 58.336a.703.703 0 0 0-1.407 0v5.368a.704.704 0 0 0 1.407 0v-5.368zM71.853 58.336a.704.704 0 0 0-1.407 0v5.368a.704.704 0 0 0 1.407 0v-5.368zM35.354 71.559v5.369a.703.703 0 0 0 1.406 0v-5.369a.703.703 0 0 0-1.406 0zM49.39 71.559v5.369a.704.704 0 0 0 1.407 0v-5.369a.703.703 0 0 0-1.407 0zM63.427 71.559v5.369a.704.704 0 0 0 1.407 0v-5.369a.703.703 0 0 0-1.407 0zM29.038 81.364a.703.703 0 0 0-.703.703v5.369a.703.703 0 0 0 1.406 0v-5.369a.703.703 0 0 0-.703-.703zM43.076 81.364a.703.703 0 0 0-.703.703v5.369a.703.703 0 0 0 1.406 0v-5.369a.705.705 0 0 0-.703-.703zM57.113 81.364a.704.704 0 0 0-.704.703v5.369a.704.704 0 0 0 1.407 0v-5.369a.705.705 0 0 0-.703-.703zM71.149 81.364a.703.703 0 0 0-.703.703v5.369a.703.703 0 0 0 1.407 0v-5.369a.705.705 0 0 0-.704-.703z"/></svg>
|
|
319
|
+
</div>
|
|
320
|
+
<div class="dialog-text">
|
|
321
|
+
<p>Wait wait wait, so we're not talking about nix yet?</p>
|
|
322
|
+
</div>
|
|
323
|
+
</div>
|
|
324
|
+
<p>Well, no! The service we have is pretty simple, and I want to complicate things
|
|
325
|
+
a bit, to show how things would work in both the Dockerfile and the nix
|
|
326
|
+
scenario.</p>
|
|
327
|
+
</summary>
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
<category term="rust"/>
|
|
332
|
+
|
|
333
|
+
<category term="docker"/>
|
|
334
|
+
|
|
335
|
+
<category term="shipyard"/>
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
</entry>
|
|
339
|
+
|
|
340
|
+
<entry>
|
|
341
|
+
|
|
342
|
+
<title>Deploying catscii to fly.io</title>
|
|
343
|
+
<link rel="alternate" href="https://fasterthanli.me/series/building-a-rust-service-with-nix/part-6"/>
|
|
344
|
+
<id>https://fasterthanli.me/series/building-a-rust-service-with-nix/part-6</id>
|
|
345
|
+
<updated>2023-03-05T07:30:06Z</updated>
|
|
346
|
+
<summary type="html">
|
|
347
|
+
<div class="disclosure">
|
|
348
|
+
<p><strong>Disclosure</strong>:
|
|
349
|
+
Because I used to work for fly.io, I still benefit from an employee discount
|
|
350
|
+
at the time of this writing: I don't have to pay for anything deployed there
|
|
351
|
+
for now.</p>
|
|
352
|
+
<p>fly.io is still <a href="/donate">sponsoring me</a> for developing
|
|
353
|
+
<a href="https://github.com/hapsoc/hring">hring</a>, but this isn't a sponsored post. It's
|
|
354
|
+
just a good fit for what we're doing here, with a generous free tier.</p>
|
|
355
|
+
</div>
|
|
356
|
+
</summary>
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
<category term="rust"/>
|
|
361
|
+
|
|
362
|
+
<category term="docker"/>
|
|
363
|
+
|
|
364
|
+
<category term="flyio"/>
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
</entry>
|
|
368
|
+
|
|
369
|
+
<entry>
|
|
370
|
+
|
|
371
|
+
<title>Writing a Dockerfile for catscii</title>
|
|
372
|
+
<link rel="alternate" href="https://fasterthanli.me/series/building-a-rust-service-with-nix/part-5"/>
|
|
373
|
+
<id>https://fasterthanli.me/series/building-a-rust-service-with-nix/part-5</id>
|
|
374
|
+
<updated>2023-03-05T07:30:05Z</updated>
|
|
375
|
+
<summary type="html">
|
|
376
|
+
<p>Now that our service is production-ready, it's time to deploy it somewhere.</p>
|
|
377
|
+
<p>There's a lot of ways to approach this: what we are going to do, though, is
|
|
378
|
+
build a docker image. Or, I should say, an <a href="https://github.com/opencontainers/image-spec">OCI
|
|
379
|
+
image</a>.</p>
|
|
380
|
+
</summary>
|
|
381
|
+
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
<category term="rust"/>
|
|
385
|
+
|
|
386
|
+
<category term="docker"/>
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
</entry>
|
|
390
|
+
|
|
391
|
+
<entry>
|
|
392
|
+
|
|
393
|
+
<title>Serving ASCII cats over HTTP</title>
|
|
394
|
+
<link rel="alternate" href="https://fasterthanli.me/series/building-a-rust-service-with-nix/part-4"/>
|
|
395
|
+
<id>https://fasterthanli.me/series/building-a-rust-service-with-nix/part-4</id>
|
|
396
|
+
<updated>2023-03-05T07:30:04Z</updated>
|
|
397
|
+
<summary type="html">
|
|
398
|
+
<p>Our <code>catscii</code> program does everything we want it to do, except that it's a
|
|
399
|
+
command-line application rather than a web server. Let's fix that.</p>
|
|
400
|
+
|
|
401
|
+
<h2>
|
|
402
|
+
<a id="enter-axum" class="anchor" href="#enter-axum">
|
|
403
|
+
Enter <code>axum</code>
|
|
404
|
+
</a>
|
|
405
|
+
</h2>
|
|
406
|
+
</summary>
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
|
|
410
|
+
<category term="rust"/>
|
|
411
|
+
|
|
412
|
+
<category term="webdev"/>
|
|
413
|
+
|
|
414
|
+
<category term="axum"/>
|
|
415
|
+
|
|
416
|
+
<category term="git-crypt"/>
|
|
417
|
+
|
|
418
|
+
|
|
419
|
+
</entry>
|
|
420
|
+
|
|
421
|
+
<entry>
|
|
422
|
+
|
|
423
|
+
<title>Printing ASCII cats to the terminal</title>
|
|
424
|
+
<link rel="alternate" href="https://fasterthanli.me/series/building-a-rust-service-with-nix/part-3"/>
|
|
425
|
+
<id>https://fasterthanli.me/series/building-a-rust-service-with-nix/part-3</id>
|
|
426
|
+
<updated>2023-03-05T07:30:03Z</updated>
|
|
427
|
+
<summary type="html">
|
|
428
|
+
<p>Now that our development environment is all set up, let's make something useful!</p>
|
|
429
|
+
|
|
430
|
+
<h2>
|
|
431
|
+
<a id="creating-the-catscii-crate" class="anchor" href="#creating-the-catscii-crate">
|
|
432
|
+
Creating the <code>catscii</code> crate
|
|
433
|
+
</a>
|
|
434
|
+
</h2>
|
|
435
|
+
</summary>
|
|
436
|
+
|
|
437
|
+
|
|
438
|
+
|
|
439
|
+
<category term="rust"/>
|
|
440
|
+
|
|
441
|
+
<category term="reqwest"/>
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
</entry>
|
|
445
|
+
|
|
446
|
+
<entry>
|
|
447
|
+
|
|
448
|
+
<title>Developing over SSH</title>
|
|
449
|
+
<link rel="alternate" href="https://fasterthanli.me/series/building-a-rust-service-with-nix/part-2"/>
|
|
450
|
+
<id>https://fasterthanli.me/series/building-a-rust-service-with-nix/part-2</id>
|
|
451
|
+
<updated>2023-03-05T07:30:02Z</updated>
|
|
452
|
+
<summary type="html">
|
|
453
|
+
<p>With <a href="part-1">the previous part</a>'s VM still running, let's try connecting to our
|
|
454
|
+
machine over SSH.</p>
|
|
455
|
+
|
|
456
|
+
<h2>
|
|
457
|
+
<a id="network-addresses-loopback-and-ip-nets" class="anchor" href="#network-addresses-loopback-and-ip-nets">
|
|
458
|
+
Network addresses, loopback and IP nets
|
|
459
|
+
</a>
|
|
460
|
+
</h2>
|
|
461
|
+
</summary>
|
|
462
|
+
|
|
463
|
+
|
|
464
|
+
|
|
465
|
+
<category term="ssh"/>
|
|
466
|
+
|
|
467
|
+
<category term="vscode"/>
|
|
468
|
+
|
|
469
|
+
|
|
470
|
+
</entry>
|
|
471
|
+
|
|
472
|
+
<entry>
|
|
473
|
+
|
|
474
|
+
<title>Setting up a local Ubuntu Server VM</title>
|
|
475
|
+
<link rel="alternate" href="https://fasterthanli.me/series/building-a-rust-service-with-nix/part-1"/>
|
|
476
|
+
<id>https://fasterthanli.me/series/building-a-rust-service-with-nix/part-1</id>
|
|
477
|
+
<updated>2023-03-05T07:30:01Z</updated>
|
|
478
|
+
<summary type="html">
|
|
479
|
+
<p>The first step to using Nix to build Rust is to do so <em>without</em> Nix, so that
|
|
480
|
+
when we finally do, we can feel the difference.</p>
|
|
481
|
+
<p>There's many ways to go about this: everyone has their favorite code editor,
|
|
482
|
+
base Linux distribution (there's even a <a href="https://nixos.org/">NixOS</a>
|
|
483
|
+
distribution, which I won't cover). Some folks like to develop on macOS first,
|
|
484
|
+
and <em>then</em> build for Linux.</p>
|
|
485
|
+
</summary>
|
|
486
|
+
|
|
487
|
+
|
|
488
|
+
|
|
489
|
+
<category term="ubuntu"/>
|
|
490
|
+
|
|
491
|
+
<category term="virtualbox"/>
|
|
492
|
+
|
|
493
|
+
|
|
494
|
+
</entry>
|
|
495
|
+
|
|
496
|
+
<entry>
|
|
497
|
+
|
|
498
|
+
<title>The bottom emoji breaks rust-analyzer</title>
|
|
499
|
+
<link rel="alternate" href="https://fasterthanli.me/articles/the-bottom-emoji-breaks-rust-analyzer"/>
|
|
500
|
+
<id>https://fasterthanli.me/articles/the-bottom-emoji-breaks-rust-analyzer</id>
|
|
501
|
+
<updated>2023-02-13T14:20:00Z</updated>
|
|
502
|
+
<summary type="html">
|
|
503
|
+
<p>Some bugs are merely fun. Others are simply delicious!</p>
|
|
504
|
+
<p>Today's pick is the latter.</p>
|
|
505
|
+
|
|
506
|
+
<h2>
|
|
507
|
+
<a id="reproducing-the-issue-part-1" class="anchor" href="#reproducing-the-issue-part-1">
|
|
508
|
+
Reproducing the issue, part 1
|
|
509
|
+
</a>
|
|
510
|
+
</h2>
|
|
511
|
+
</summary>
|
|
512
|
+
|
|
513
|
+
|
|
514
|
+
|
|
515
|
+
<category term="rust"/>
|
|
516
|
+
|
|
517
|
+
<category term="emacs"/>
|
|
518
|
+
|
|
519
|
+
|
|
520
|
+
</entry>
|
|
521
|
+
|
|
522
|
+
<entry>
|
|
523
|
+
|
|
524
|
+
<title>Day 18 (Advent of Code 2022)</title>
|
|
525
|
+
<link rel="alternate" href="https://fasterthanli.me/series/advent-of-code-2022/part-18"/>
|
|
526
|
+
<id>https://fasterthanli.me/series/advent-of-code-2022/part-18</id>
|
|
527
|
+
<updated>2023-01-12T14:00:00Z</updated>
|
|
528
|
+
<summary type="html">
|
|
529
|
+
<p>This time around, we're porting a solution from C++ to Rust and seeing how it
|
|
530
|
+
feels, how it performs, and what we can learn about both languages by doing that.</p>
|
|
531
|
+
<p>See <a href="part-17">Day 17</a> for the rationale re: porting solutions rather than
|
|
532
|
+
writing my own from scratch. TL;DR is: it's better than nothing, and we can
|
|
533
|
+
still focus about learning Rust rather than spending entire days fighting
|
|
534
|
+
off-by-one errors.</p>
|
|
535
|
+
</summary>
|
|
536
|
+
|
|
537
|
+
|
|
538
|
+
|
|
539
|
+
<category term="rust"/>
|
|
540
|
+
|
|
541
|
+
<category term="cpp"/>
|
|
542
|
+
|
|
543
|
+
<category term="advent-of-code"/>
|
|
544
|
+
|
|
545
|
+
|
|
546
|
+
</entry>
|
|
547
|
+
|
|
548
|
+
<entry>
|
|
549
|
+
|
|
550
|
+
<title>Twitch fell behind</title>
|
|
551
|
+
<link rel="alternate" href="https://fasterthanli.me/articles/twitch-fell-behind"/>
|
|
552
|
+
<id>https://fasterthanli.me/articles/twitch-fell-behind</id>
|
|
553
|
+
<updated>2023-01-12T13:00:00Z</updated>
|
|
554
|
+
<summary type="html">
|
|
555
|
+
<p>So you want to do live streams. Are you sure? Okay. Let's talk about it.</p>
|
|
556
|
+
|
|
557
|
+
<h2>
|
|
558
|
+
<a id="let-s-talk-numbers" class="anchor" href="#let-s-talk-numbers">
|
|
559
|
+
Let's talk numbers
|
|
560
|
+
</a>
|
|
561
|
+
</h2>
|
|
562
|
+
</summary>
|
|
563
|
+
|
|
564
|
+
|
|
565
|
+
|
|
566
|
+
<category term="meta"/>
|
|
567
|
+
|
|
568
|
+
<category term="twitch"/>
|
|
569
|
+
|
|
570
|
+
<category term="youtube"/>
|
|
571
|
+
|
|
572
|
+
|
|
573
|
+
</entry>
|
|
574
|
+
|
|
575
|
+
<entry>
|
|
576
|
+
|
|
577
|
+
<title>Day 17 (Advent of Code 2022)</title>
|
|
578
|
+
<link rel="alternate" href="https://fasterthanli.me/series/advent-of-code-2022/part-17"/>
|
|
579
|
+
<id>https://fasterthanli.me/series/advent-of-code-2022/part-17</id>
|
|
580
|
+
<updated>2023-01-11T15:00:00Z</updated>
|
|
581
|
+
<summary type="html">
|
|
582
|
+
<p>Advent of Code gets harder and harder, and I'm not getting any smarter. Or any
|
|
583
|
+
more free time. So, in order to close out this series anyway, I'm going to try
|
|
584
|
+
and port other people's solutions from "language X" to Rust. That way, they
|
|
585
|
+
already figured out the hard stuff, and we can just focus on the Rust bits!</p>
|
|
586
|
+
</summary>
|
|
587
|
+
|
|
588
|
+
|
|
589
|
+
|
|
590
|
+
<category term="rust"/>
|
|
591
|
+
|
|
592
|
+
<category term="python"/>
|
|
593
|
+
|
|
594
|
+
<category term="advent-of-code"/>
|
|
595
|
+
|
|
596
|
+
|
|
597
|
+
</entry>
|
|
598
|
+
|
|
599
|
+
<entry>
|
|
600
|
+
|
|
601
|
+
<title>Day 16 (Advent of Code 2022)</title>
|
|
602
|
+
<link rel="alternate" href="https://fasterthanli.me/series/advent-of-code-2022/part-16"/>
|
|
603
|
+
<id>https://fasterthanli.me/series/advent-of-code-2022/part-16</id>
|
|
604
|
+
<updated>2022-12-29T15:00:00Z</updated>
|
|
605
|
+
<summary type="html">
|
|
606
|
+
<p>Let's tackle the <a href="https://adventofcode.com/2022/day/16">day 16 puzzle</a>!</p>
|
|
607
|
+
|
|
608
|
+
<h2>
|
|
609
|
+
<a id="parsing" class="anchor" href="#parsing">
|
|
610
|
+
Parsing
|
|
611
|
+
</a>
|
|
612
|
+
</h2>
|
|
613
|
+
|
|
614
|
+
<p>The input looks like this:</p>
|
|
615
|
+
<div class="code-block" translate="no"><pre class="code-block-inner" data-lang="">Valve AA has flow rate=0; tunnels lead to valves DD, II, BB
|
|
616
|
+
Valve BB has flow rate=13; tunnels lead to valves CC, AA
|
|
617
|
+
Valve CC has flow rate=2; tunnels lead to valves DD, BB
|
|
618
|
+
Valve DD has flow rate=20; tunnels lead to valves CC, AA, EE
|
|
619
|
+
Valve EE has flow rate=3; tunnels lead to valves FF, DD
|
|
620
|
+
Valve FF has flow rate=0; tunnels lead to valves EE, GG
|
|
621
|
+
Valve GG has flow rate=0; tunnels lead to valves FF, HH
|
|
622
|
+
Valve HH has flow rate=22; tunnel leads to valve GG
|
|
623
|
+
Valve II has flow rate=0; tunnels lead to valves AA, JJ
|
|
624
|
+
Valve JJ has flow rate=21; tunnel leads to valve II
|
|
625
|
+
</pre></div>
|
|
626
|
+
</summary>
|
|
627
|
+
|
|
628
|
+
|
|
629
|
+
|
|
630
|
+
<category term="rust"/>
|
|
631
|
+
|
|
632
|
+
<category term="advent-of-code"/>
|
|
633
|
+
|
|
634
|
+
|
|
635
|
+
</entry>
|
|
636
|
+
|
|
637
|
+
<entry>
|
|
638
|
+
|
|
639
|
+
<title>Day 15 (Advent of Code 2022)</title>
|
|
640
|
+
<link rel="alternate" href="https://fasterthanli.me/series/advent-of-code-2022/part-15"/>
|
|
641
|
+
<id>https://fasterthanli.me/series/advent-of-code-2022/part-15</id>
|
|
642
|
+
<updated>2022-12-25T17:00:00Z</updated>
|
|
643
|
+
<summary type="html">
|
|
644
|
+
<p>The <a href="https://adventofcode.com/2022/day/15">day 15 puzzle</a> falls into the "math
|
|
645
|
+
puzzle" territory more than "let's learn something new about Rust", but since
|
|
646
|
+
several folks asked if I was going to continue... let's continue.</p>
|
|
647
|
+
</summary>
|
|
648
|
+
|
|
649
|
+
|
|
650
|
+
|
|
651
|
+
<category term="rust"/>
|
|
652
|
+
|
|
653
|
+
<category term="advent-of-code"/>
|
|
654
|
+
|
|
655
|
+
|
|
656
|
+
</entry>
|
|
657
|
+
|
|
658
|
+
<entry>
|
|
659
|
+
|
|
660
|
+
<title>Day 14 (Advent of Code 2022)</title>
|
|
661
|
+
<link rel="alternate" href="https://fasterthanli.me/series/advent-of-code-2022/part-14"/>
|
|
662
|
+
<id>https://fasterthanli.me/series/advent-of-code-2022/part-14</id>
|
|
663
|
+
<updated>2022-12-15T19:00:00Z</updated>
|
|
664
|
+
<summary type="html">
|
|
665
|
+
<p>I like how the <a href="https://adventofcode.com/2022/day/14">day 14 puzzle</a> sounds,
|
|
666
|
+
because I think it'll give me an opportunity to show off yet <em>another way</em> to
|
|
667
|
+
have Rust embedded in a web page.</p>
|
|
668
|
+
<p>But first...</p>
|
|
669
|
+
<div class="dialog bear">
|
|
670
|
+
<div class="dialog-head" title="Cool bear says:">
|
|
671
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path d="M21.41 41.398c.148-1.787.337-3.572.574-5.351.369-2.772 4.393-11.308 5.624-12.882l.553-.706-1.344-.449a5.772 5.772 0 0 1-3.948-5.478 5.786 5.786 0 0 1 5.779-5.78 5.768 5.768 0 0 1 5.684 4.758l.249 1.396 1.231-.704a28.845 28.845 0 0 1 14.282-3.801c4.991 0 9.93 1.314 14.282 3.801l1.231.704.249-1.396a5.766 5.766 0 0 1 5.683-4.758 5.786 5.786 0 0 1 5.779 5.78 5.772 5.772 0 0 1-3.948 5.478l-1.344.449.552.705c1.911 2.44 2.55 2.541 3.563 5.599 1.422 4.293 2.923 7.964 2.923 12.61v49.875h2V41.373c0-6.519-2.008-12.717-5.819-18.005a7.768 7.768 0 0 0 4.072-6.836c0-4.29-3.49-7.78-7.779-7.78a7.766 7.766 0 0 0-7.3 5.1 30.834 30.834 0 0 0-14.146-3.45 30.834 30.834 0 0 0-14.146 3.45 7.766 7.766 0 0 0-7.301-5.1c-4.289 0-7.779 3.49-7.779 7.78a7.766 7.766 0 0 0 4.072 6.836c-6.681 9.271-5.976 21.037-5.992 32.034-.017 11.946.656 23.895.109 35.838l2.006-.001c.67 0-.17-33.831-.156-36.912.022-4.312.148-8.631.505-12.929z"/><path d="M73.854 31.271v-4.494c0-.971-.79-1.76-1.761-1.76H55.235c-.604 0-1.3.869-1.778 1.905-.015 0-.027-.008-.042-.008H46.789c-.02 0-.037.011-.057.011-.478-1.037-1.175-1.908-1.779-1.908H28.094c-.971 0-1.761.79-1.761 1.76v4.494c0 4.477 3.643 8.119 8.119 8.119h5.12c4.265 0 7.734-3.47 7.734-7.734v-2.091H52.878v2.091c0 4.265 3.47 7.734 7.734 7.734h5.121c4.479-.001 8.121-3.643 8.121-8.119zm-41.713 3.192a1.387 1.387 0 0 1-1.917-.442 1.392 1.392 0 0 1 .442-1.917l8.403-5.255a1.392 1.392 0 0 1 1.475 2.359l-8.403 5.255zm11.163-2.18l-5.75 3.597a.95.95 0 0 1-1.313-.302.952.952 0 0 1 .303-1.312l5.75-3.597a.953.953 0 0 1 1.01 1.614zm15.168 1.935a1.387 1.387 0 0 1-1.917-.442 1.392 1.392 0 0 1 .442-1.917l8.403-5.255a1.392 1.392 0 0 1 1.475 2.359l-8.403 5.255zm4.909 1.561a.953.953 0 0 1-.506-1.759l5.75-3.597a.952.952 0 1 1 1.01 1.614l-5.75 3.597a.942.942 0 0 1-.504.145z"/><path d="M59.705 45.232h-2c0 1.823-1.483 3.306-3.306 3.306s-3.306-1.483-3.306-3.306v-1.439h1.06a3.294 3.294 0 0 0 3.285-3.285v-.17c0-.259-.038-.508-.095-.749a3.291 3.291 0 0 0-2.665-2.482 3.243 3.243 0 0 0-.525-.053h-4.12c-.18 0-.353.025-.525.053a3.291 3.291 0 0 0-2.665 2.482 3.255 3.255 0 0 0-.095.749v.17a3.294 3.294 0 0 0 3.285 3.285h1.06v1.439a3.31 3.31 0 0 1-3.307 3.306 3.31 3.31 0 0 1-3.306-3.306h-2a5.312 5.312 0 0 0 5.306 5.306 5.293 5.293 0 0 0 4.306-2.229 5.294 5.294 0 0 0 4.306 2.229 5.313 5.313 0 0 0 5.307-5.306zM29.742 58.336a.703.703 0 0 0-1.406 0v5.368a.704.704 0 0 0 1.406 0v-5.368zM43.779 58.336a.703.703 0 0 0-1.406 0v5.368a.704.704 0 0 0 1.406 0v-5.368zM57.816 58.336a.703.703 0 0 0-1.407 0v5.368a.704.704 0 0 0 1.407 0v-5.368zM71.853 58.336a.704.704 0 0 0-1.407 0v5.368a.704.704 0 0 0 1.407 0v-5.368zM35.354 71.559v5.369a.703.703 0 0 0 1.406 0v-5.369a.703.703 0 0 0-1.406 0zM49.39 71.559v5.369a.704.704 0 0 0 1.407 0v-5.369a.703.703 0 0 0-1.407 0zM63.427 71.559v5.369a.704.704 0 0 0 1.407 0v-5.369a.703.703 0 0 0-1.407 0zM29.038 81.364a.703.703 0 0 0-.703.703v5.369a.703.703 0 0 0 1.406 0v-5.369a.703.703 0 0 0-.703-.703zM43.076 81.364a.703.703 0 0 0-.703.703v5.369a.703.703 0 0 0 1.406 0v-5.369a.705.705 0 0 0-.703-.703zM57.113 81.364a.704.704 0 0 0-.704.703v5.369a.704.704 0 0 0 1.407 0v-5.369a.705.705 0 0 0-.703-.703zM71.149 81.364a.703.703 0 0 0-.703.703v5.369a.703.703 0 0 0 1.407 0v-5.369a.705.705 0 0 0-.704-.703z"/></svg>
|
|
672
|
+
</div>
|
|
673
|
+
<div class="dialog-text">
|
|
674
|
+
<p>Let me guess: parsing?</p>
|
|
675
|
+
</div>
|
|
676
|
+
</div>
|
|
677
|
+
</summary>
|
|
678
|
+
|
|
679
|
+
|
|
680
|
+
|
|
681
|
+
<category term="rust"/>
|
|
682
|
+
|
|
683
|
+
<category term="advent-of-code"/>
|
|
684
|
+
|
|
685
|
+
<category term="generators"/>
|
|
686
|
+
|
|
687
|
+
|
|
688
|
+
</entry>
|
|
689
|
+
|
|
690
|
+
</feed>
|