kokada.dev.rss.xml - sfeed_tests - sfeed tests and RSS and Atom files | |
git clone git://git.codemadness.org/sfeed_tests | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
kokada.dev.rss.xml (494372B) | |
--- | |
1 <?xml version="1.0" encoding="utf-8"?> | |
2 <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><ti… | |
3 # dd if=/dev/urandom of=/dev/brain0 | |
4 dd: error writing &#39;/dev/brain0&#39;: No space left on device | |
5 | |
6 </description><atom:link href="https://kokada.dev/rss/" rel="self"/><lan… | |
7 post</a>. It is mostly | |
8 because I ran out of things to write, but I expected this. This is proba… | |
9 more likely how I am actually going to post from now. At least, it shows… | |
10 my plan to have a <a href="https://kokada.dev/blog/making-a-blog-for-… | |
11 time</a>, that is | |
12 easy to go back when I wanted is working fine, but I digress.</p> | |
13 <p>Going back to the theme of the today blog post, I needed to wri… | |
14 page</a> for the first time in years. I | |
15 hate <a href="https://en.wikipedia.org/wiki/Troff">troff</a>… | |
16 for man pages (similar to <a href="https://en.wikipedia.org/wiki/LaTe… | |
17 documents). It is one of the weirdest languages that I ever saw, and eve… | |
18 example in Wikipedia shows that:</p> | |
19 <pre><code class="language-troff">.ND &quot;January 10, … | |
20 .AU &quot;Ms. Jane Smith&quot; | |
21 .AT &quot;Upcoming appointment&quot; | |
22 .MT 5 | |
23 .DS | |
24 Reference #A12345 | |
25 .sp 4 | |
26 Mr. Samuel Jones | |
27 Field director, Bureau of Inspections | |
28 1010 Government Plaza | |
29 Capitoltown, ST | |
30 .sp 3 | |
31 Dear Mr. Jones, | |
32 .sp 2 | |
33 .P | |
34 Making reference to the noted obligation to submit for state inspection … | |
35 .B now , | |
36 in | |
37 .I this | |
38 year of | |
39 .I this | |
40 decade, to prepare our industrial base for the interstate and internatio… | |
41 .P | |
42 Thank you for your consideration of our position. | |
43 .FC Sincerely | |
44 .SG | |
45 </code></pre> | |
46 <p>Keep in mind that the break lines are necessary every time you … | |
47 macro, like <code>.I this</code> (that I <em>think<… | |
48 as illegible as hell, and it is worse that the format lacks good tooling… | |
49 least I didn't find any good ones).</p> | |
50 <p>Most people when they need to write a man page nowadays ends up… | |
51 other format that generates a man page. For example, in the past I used | |
52 <a href="https://pandoc.org/">Pandoc</a> to convert Markdown… | |
53 Pandoc is a great project the result is sub-optimal at best: Markdowns a… | |
54 the end, designed for generating HTML (and a subset of it), and not man … | |
55 so you basically ends up fighting the format for it to do what you want. | |
56 Also, Pandoc is a big project, with a ~200MB binary (at least it is the … | |
57 Pandoc binary in Nix).</p> | |
58 <p>For this specific project I needed something small. I am trying… | |
59 of the most essential pieces inside NixOS, <code>nixos-rebuild<… | |
60 with a <a href="https://discourse.nixos.org/t/nixos-rebuild-ng-a-nixo… | |
61 Python</a> | |
62 (sorry Rust zealots!), called <code>nixos-rebuild-ng</code>.… | |
63 <p>Since this project will eventually (if successful) be in the cr… | |
64 NixOS, I want to reduce the number of dependencies as much as possible, … | |
65 something as big as Pandoc is out. I could use | |
66 <a href="https://asciidoc.org/">AsciiDoc</a>, but it is a bi… | |
67 (this may seem ironic, but <code>nixos-rebuild-ng</code> has… | |
68 that is optional). And I also hated the last time I tried to use it to g… | |
69 man pages: it more flexible than Markdown, but still far from optimal.&l… | |
70 <p>Thanks to Drew DeVault (creator of <a href="https://swaywm.o… | |
71 had the same issues in the past and created | |
72 <a href="https://drewdevault.com/2018/05/13/scdoc.html"><code&g… | |
73 page generator using a DSL inspired in Markdown, but specific to generat… | |
74 pages. The binary is written in C (and advantage in this case since it m… | |
75 is easier to bootstrap), is small (~1 Kloc) and has no dependencies, so … | |
76 fits the requirement.</p> | |
77 <p>While the language suffers from being a niche project for a nic… | |
78 <a href="https://man.archlinux.org/man/scdoc.5.en">man page</a&… | |
79 nice. It is terse though and lacks examples, and this is what this blog … | |
80 will try to accomplish.</p> | |
81 <p>To start, let's have a quick summary of the syntax, written in … | |
82 comments:</p> | |
83 <pre><code class="language-scdoc">; quick summary: | |
84 ; # new section | |
85 ; comments starts with ; | |
86 ; - this is a list | |
87 ; - sub-list | |
88 ; - *bold*: _underline_, force a line break++ | |
89 ; - [tables], \[ can be used to force an actual [ | |
90 ; . numbered list | |
91 ; please configure your editor to use hard tabs | |
92 ; see `man 5 scdoc` for more information about syntax | |
93 ; or https://man.archlinux.org/man/scdoc.5.en | |
94 </code></pre> | |
95 <p>I actually added this summary in the <code>.scd</code&… | |
96 I wrote, so it is easy for someone that never saw the format to start | |
97 collaborating.</p> | |
98 <p>And here an example of a (summarised) man page in <code>.… | |
99 <pre class="chroma"><code><span class="line"><span … | |
100 </span></span><span class="line"><span class="cl"&g… | |
101 </span></span><span class="line"><span class="cl"&g… | |
102 </span></span></span><span class="line"><span… | |
103 </span></span><span class="line"><span class="cl"&g… | |
104 </span></span><span class="line"><span class="cl"&g… | |
105 </span></span><span class="line"><span class="cl"&g… | |
106 </span></span></span><span class="line"><span… | |
107 </span></span><span class="line"><span class="cl"&g… | |
108 </span></span><span class="line"><span class="cl"&g… | |
109 </span></span><span class="line"><span class="cl"&g… | |
110 </span></span><span class="line"><span class="cl"&g… | |
111 </span></span></span><span class="line"><span… | |
112 </span></span><span class="line"><span class="cl"&g… | |
113 </span></span><span class="line"><span class="cl"&g… | |
114 </span></span><span class="line"><span class="cl"&g… | |
115 </span></span><span class="line"><span class="cl"&g… | |
116 </span></span><span class="line"><span class="cl"&g… | |
117 </span></span><span class="line"><span class="cl"&g… | |
118 </span></span><span class="line"><span class="cl"&g… | |
119 </span></span><span class="line"><span class="cl"&g… | |
120 </span></span><span class="line"><span class="cl"&g… | |
121 </span></span><span class="line"><span class="cl"&g… | |
122 </span></span><span class="line"><span class="cl"&g… | |
123 </span></span><span class="line"><span class="cl"&g… | |
124 </span></span><span class="line"><span class="cl"&g… | |
125 </span></span><span class="line"><span class="cl"&g… | |
126 </span></span><span class="line"><span class="cl"&g… | |
127 </span></span><span class="line"><span class="cl"&g… | |
128 </span></span><span class="line"><span class="cl"&g… | |
129 </span></span></span><span class="line"><span… | |
130 </span></span><span class="line"><span class="cl"&g… | |
131 </span></span><span class="line"><span class="cl"&g… | |
132 </span></span><span class="line"><span class="cl"&g… | |
133 </span></span><span class="line"><span class="cl"&g… | |
134 </span></span><span class="line"><span class="cl"&g… | |
135 </span></span><span class="line"><span class="cl"&g… | |
136 </span></span><span class="line"><span class="cl"&g… | |
137 </span></span><span class="line"><span class="cl"&g… | |
138 </span></span><span class="line"><span class="cl"&g… | |
139 </span></span><span class="line"><span class="cl"&g… | |
140 </span></span><span class="line"><span class="cl"&g… | |
141 </span></span><span class="line"><span class="cl"&g… | |
142 </span></span><span class="line"><span class="cl"&g… | |
143 </span></span></span><span class="line"><span… | |
144 </span></span><span class="line"><span class="cl"&g… | |
145 </span></span><span class="line"><span class="cl"&g… | |
146 </span></span><span class="line"><span class="cl"&g… | |
147 </span></span><span class="line"><span class="cl"&g… | |
148 </span></span><span class="line"><span class="cl"&g… | |
149 </span></span></span><span class="line"><span… | |
150 </span></span><span class="line"><span class="cl"&g… | |
151 </span></span><span class="line"><span class="cl"&g… | |
152 </span></span><span class="line"><span class="cl"&g… | |
153 </span></span><span class="line"><span class="cl"&g… | |
154 </span></span><span class="line"><span class="cl"&g… | |
155 </span></span><span class="line"><span class="cl"&g… | |
156 </span></span><span class="line"><span class="cl"&g… | |
157 </span></span></span><span class="line"><span… | |
158 </span></span><span class="line"><span class="cl"&g… | |
159 </span></span></code></pre><p>And here is … | |
160 <p><a href="https://github.com/thiagokokada/blog/raw/main/posts… | |
161 file"></a></p> | |
162 <p>One of nice things that I found is how looking at the plain tex… | |
163 like the man page result already. And if you know Markdown, you can basi… | |
164 understand most things that is happening. There are a few differences, l… | |
165 <code>*bold*</code> instead of <code>**bold**</code… | |
166 end of the world.</p> | |
167 <p>Now, the format has its quirks. The first line being the name o… | |
168 and section in parenthesis is required, but this makes sense, since you … | |
169 this information for the corners. But for one, it requires the usage of … | |
170 tabs to create indentation, and the error messages are awful, in a situa… | |
171 that kind remembers me of <code>Makefile</code>. Also the ch… | |
172 means that the traditional <code>app [command]</code> needs … | |
173 <code>app \[command]</code>. I found this a strange choice s… | |
174 format that is only used for man pages, and using <code>[command]&… | |
175 optional is common, but at least it is easy to escape.</p> | |
176 <p>In the end, I think all that matters is the result. And for the… | |
177 all those years trying to write a man page, I am satisfied with the resu… | |
178 man page looks exactly as I wanted once rendered, and the <code>.s… | |
179 reasonable good that it can work as a documentation for someone that for… | |
180 reason or another can't use the man page (can't say the same for the tro… | |
181 version). Also, it is really easy for someone to just go there and updat… | |
182 man page, even without experience in the format (except for maybe the | |
183 requirement of tabs). So all in all, I really liked the format, and will… | |
184 again if I need to write another man page in the future.</p></desc… | |
185 wireless earbuds instead of wired earphones is the latency: it is bad, g… | |
186 up to seconds(!) depending on your particular combination of OS/earbuds/… | |
187 <p>There is a solution though: Bluetooth LE Audio, that is suppose… | |
188 multiple issues with the original design for Bluetooth Classic Audio, in… | |
189 a much lower latency, improved efficiency (e.g.: less battery power) and… | |
190 multiple streams of audio. LE Audio also includes a new default codec for | |
191 improved audio quality, <a href="https://en.wikipedia.org/wiki/LC3_(c… | |
192 replaces the venerable <a href="https://en.wikipedia.org/wiki/SBC_(co… | |
193 for audio.</p> | |
194 <p>However, the standard is a mess right now: a few wireless headp… | |
195 support it, but they're generally disabled by default and it is pretty m… | |
196 enable. And even after enabling it, getting it to work can be a pain.<… | |
197 <p>I have pretty much the best setup to use LE Audio right now: a … | |
198 released Pixel 9 Pro with Sony's | |
199 <a href="https://www.sony.ie/headphones/products/wf-1000xm5">WF-10… | |
200 after lots of tries I got it to work. You can see below the versions of | |
201 everything I am using:</p> | |
202 <ul> | |
203 <li>Android: 14</li> | |
204 <li><a href="https://play.google.com/store/apps/details?id=com.… | |
205 Connect</a>: | |
206 11.0.1</li> | |
207 <li>WM-1000XM5: 4.0.2</li> | |
208 </ul> | |
209 <p>The first thing you need to do is enable in &quot;Sound Con… | |
210 Priority&quot; in &quot;Device Settings -&gt; System&quo… | |
211 <p><a href="https://github.com/thiagokokada/blog/raw/main/posts… | |
212 Connect"></a></p> | |
213 <p>After this, you will need to pair your headset with the device … | |
214 do this as same as always: press and hold the button in case for a few s… | |
215 until a blue light starts to blink. However, this is where things starts… | |
216 janky: I couldn't get the headset to pair with Android again.</p> | |
217 <p>A few of the things that I needed to do (in no specific order):… | |
218 <ul> | |
219 <li>Remove the previous paired headset</li> | |
220 <li>Restart the Android</li> | |
221 <li>Clean-up &quot;Sound Connect&quot; storage (Long press… | |
222 &quot;Storage and Cache&quot; -&gt; &quot;Clear storage&… | |
223 </ul> | |
224 <p>If you can get the headset to connect, go to the &quot;Blue… | |
225 Android, click in the gear icon for the headset and enable &quot;LE … | |
226 <p><a href="https://github.com/thiagokokada/blog/raw/main/posts… | |
227 Settings"></a></p> | |
228 <p>If you can't, you may want to <a href="https://helpguide.son… | |
229 settings</a> | |
230 and try again from the start (that means pairing your device with &q… | |
231 Connect&quot; again, and you may want to try to clear the storage be… | |
232 <p>Yes, the process is extremely janky, but I think this is why bo… | |
233 Connect&quot; and Android marks this feature as beta/experimental. A… | |
234 to test the latency, but from my initial testing there are some glitches… | |
235 the audio is only used for a short period of time (e.g.: Duolingo only e… | |
236 the audio when the character is speaking). So I only recommend this if y… | |
237 to test how LE Audio will behave, since it is clear that this needs more | |
238 polish.</p></description><pubDate>Mon, 07 Oct 2024 00:00:00 +0000<… | |
239 <pre class="chroma"><code><span class="line"><span … | |
240 </span></span><span class="line"><span class="cl"&g… | |
241 </span></span></span><span class="line"><span… | |
242 </span></span></span></code></pre><p>… | |
243 is this stored? Well, I had to look at the Nix source code to find the a… | |
244 since I can't find this anywhere in the web or in ChatGPT (but I am sure… | |
245 now that I posted this it will eventually be searchable), and the answer… | |
246 found | |
247 <a href="https://github.com/NixOS/nix/blob/c116030605bf7fecd232d0ff3b… | |
248 <pre class="chroma"><code><span class="line"><span … | |
249 </span></span><span class="line"><span class="cl"&g… | |
250 </span></span><span class="line"><span class="cl"&g… | |
251 </span></span><span class="line"><span class="cl"&g… | |
252 </span></span></code></pre><p>Where is <… | |
253 <a href="https://github.com/NixOS/nix/blob/c116030605bf7fecd232d0ff3b… | |
254 <pre class="chroma"><code><span class="line"><span … | |
255 </span></span><span class="line"><span class="cl"&g… | |
256 </span></span><span class="line"><span class="cl"&g… | |
257 </span></span><span class="line"><span class="cl"&g… | |
258 </span></span><span class="line"><span class="cl"&g… | |
259 </span></span><span class="line"><span class="cl"&g… | |
260 </span></span><span class="line"><span class="cl"&g… | |
261 </span></span><span class="line"><span class="cl"&g… | |
262 </span></span><span class="line"><span class="cl"&g… | |
263 </span></span><span class="line"><span class="cl"&g… | |
264 </span></span><span class="line"><span class="cl"&g… | |
265 </span></span><span class="line"><span class="cl"&g… | |
266 </span></span><span class="line"><span class="cl"&g… | |
267 </span></span><span class="line"><span class="cl"&g… | |
268 </span></span></code></pre><p>So we solved… | |
269 <ul> | |
270 <li>If <code>NIX_DATA_HOME</code> is set, the file wil… | |
271 <code>$NIX_DATA_HOME/trusted-settings.json</code></li> | |
272 <li>If <code>XDG_DATA_HOME</code> is set, the file wil… | |
273 <code>$XDG_DATA_HOME/nix/trusted-settings.json</code></li… | |
274 <li>Otherwise Nix will fallback to <code>$HOME/.local/share/… | |
275 </ul> | |
276 <p>By the way, if you don't know why you got this prompt, if <c… | |
277 <code>nixConfig</code> attribute inside <code>outputs&… | |
278 attribute (like <code>extra-substituters</code>) you will ge… | |
279 <a href="https://nix.dev/manual/nix/2.23/command-ref/conf-file#conf-a… | |
280 in your Nix configuration (please <strong>do not do this</stron… | |
281 it may allow running possible unsafe options without asking you first).&… | |
282 <p>You can inspect the JSON file or delete it and Nix will prompt … | |
283 next time you run a <code>nix</code> command. And yes, savin… | |
284 controversial considering this is Nix, but having the power to set <c… | |
285 attributes is really powerful, and with great powers comes great | |
286 responsibilities.</p></description><pubDate>Mon, 30 Sep 2024 00:00… | |
287 everywhere you go. However, I like to talk about tools, and AIs, or more | |
288 specifically, <a href="https://en.wikipedia.org/wiki/Large_language_m… | |
289 Models</a> (LLM), can be | |
290 really useful tools. Maybe someday we will have our AI overlords dominat… | |
291 everything (including my job), but right now I don't feel particularly | |
292 threatened given my experience with AIs.</p> | |
293 <p>Given that <a href="https://mashable.com/article/google-sear… | |
294 worse</a>, I am | |
295 slowly relying in LLMs more and more. This is the focus of this post, ba… | |
296 <a href="https://www.rottentomatoes.com/m/the_good_the_bad_and_the_ug… | |
297 ugly</a> (by the | |
298 way, never saw this film) of LLMs, especially focused for solving coding | |
299 problems. I will take a look at the my chat history in | |
300 <a href="https://chatgpt.com/">ChatGPT</a> and see where it … | |
301 shined, and where it just completely wasted my time.</p> | |
302 <p>A disclaimer, I never bothered to buy a ChatGPT subscription be… | |
303 feel that the tool is useful enough (at least yet), so most of the examp… | |
304 here are either with <a href="https://openai.com/index/chatgpt/">G… | |
305 mini</a>, | |
306 since those where the models offered by free in ChatGPT.</p> | |
307 <p>An addendum, I have some experience with <a href="https://gi… | |
308 Copilot</a> (another LLM, but this one runs | |
309 inside your IDE or favorite text editor) in <code>$PREVIOUS_JOB<… | |
310 with it is even more underwhelming than what I am going to describe in t… | |
311 post: it was basically really good for generating fixture for tests and … | |
312 ok-ish to plain bad for everything else. Yes, that's would fit in a twee… | |
313 xeet?).</p> | |
314 <h2>The good</h2> | |
315 <p><a href="https://chatgpt.com/share/c58a1432-2761-4954-acac-c… | |
316 <blockquote> | |
317 <p>Is there any way that I can pass a context for a net.conn to ca… | |
318 Read()?</p> | |
319 </blockquote> | |
320 <p>This is one of the good cases where ChatGPT felt to me that I w… | |
321 an expert in Go. To start, I didn't even mention in my initial prompt th… | |
322 was talking about Go, but it correctly inferred so. Also, the solution o… | |
323 was great:</p> | |
324 <blockquote> | |
325 <ol> | |
326 <li><strong>Use a separate goroutine</strong> to handl… | |
327 <li><strong>Set a deadline</strong> on the connection … | |
328 the <code>Read()</code> when the context is canceled.</li… | |
329 </ol> | |
330 </blockquote> | |
331 <p>Before asking ChatGPT about this issue I had already coded my o… | |
332 solution that was something similar to this:</p> | |
333 <pre class="chroma"><code><span class="line"><span … | |
334 </span></span><span class="line"><span class="cl"&g… | |
335 </span></span></span><span class="line"><span… | |
336 </span></span><span class="line"><span class="cl"&g… | |
337 </span></span><span class="line"><span class="cl"&g… | |
338 </span></span><span class="line"><span class="cl"&g… | |
339 </span></span><span class="line"><span class="cl"&g… | |
340 </span></span><span class="line"><span class="cl"&g… | |
341 </span></span><span class="line"><span class="cl"&g… | |
342 </span></span><span class="line"><span class="cl"&g… | |
343 </span></span><span class="line"><span class="cl"&g… | |
344 </span></span><span class="line"><span class="cl"&g… | |
345 </span></span><span class="line"><span class="cl"&g… | |
346 </span></span><span class="line"><span class="cl"&g… | |
347 </span></span><span class="line"><span class="cl"&g… | |
348 </span></span><span class="line"><span class="cl"&g… | |
349 </span></span><span class="line"><span class="cl"&g… | |
350 </span></span><span class="line"><span class="cl"&g… | |
351 </span></span><span class="line"><span class="cl"&g… | |
352 </span></span></span><span class="line"><span… | |
353 </span></span></code></pre><p>Compared thi… | |
354 <pre class="chroma"><code><span class="line"><span … | |
355 </span></span><span class="line"><span class="cl"&g… | |
356 </span></span><span class="line"><span class="cl"&g… | |
357 </span></span><span class="line"><span class="cl"&g… | |
358 </span></span><span class="line"><span class="cl"&g… | |
359 </span></span><span class="line"><span class="cl"&g… | |
360 </span></span></span><span class="line"><span… | |
361 </span></span><span class="line"><span class="cl"&g… | |
362 </span></span><span class="line"><span class="cl"&g… | |
363 </span></span><span class="line"><span class="cl"&g… | |
364 </span></span><span class="line"><span class="cl"&g… | |
365 </span></span><span class="line"><span class="cl"&g… | |
366 </span></span><span class="line"><span class="cl"&g… | |
367 </span></span></span><span class="line"><span… | |
368 </span></span></span><span class="line"><span… | |
369 </span></span><span class="line"><span class="cl"&g… | |
370 </span></span></span><span class="line"><span… | |
371 </span></span><span class="line"><span class="cl"&g… | |
372 </span></span></span><span class="line"><span… | |
373 </span></span><span class="line"><span class="cl"&g… | |
374 </span></span><span class="line"><span class="cl"&g… | |
375 </span></span></code></pre><p>The ChatGPT … | |
376 <ol> | |
377 <li>It doesn't close the connection socket allowing it to be reuse… | |
378 <li>It waits until the goroutine is finished to avoid leaks</li… | |
379 <li>It closes the channel after it finishes</li> | |
380 </ol> | |
381 <p>Now, I don't claim to be a Go expert (far from it), but this wa… | |
382 cases where I felt that I was being guided by someone that is coding in … | |
383 years.</p> | |
384 <p>But it didn't end there, I asked:</p> | |
385 <blockquote> | |
386 <p>If I want to reuse the connection, do I need to reset the SetRe… | |
387 </blockquote> | |
388 <p>Since in this particular case I wanted the underlying connectio… | |
389 and ChatGPT correctly amended the code:</p> | |
390 <pre class="chroma"><code><span class="line"><span … | |
391 </span></span><span class="line"><span class="cl"&g… | |
392 </span></span></span><span class="line"><span… | |
393 </span></span><span class="line"><span class="cl"&g… | |
394 </span></span></span><span class="line"><span… | |
395 </span></span></span><span class="line"><span… | |
396 </span></span><span class="line"><span class="cl"&g… | |
397 </span></span></span><span class="line"><span… | |
398 </span></span><span class="line"><span class="cl"&g… | |
399 </span></span></span><span class="line"><span… | |
400 </span></span><span class="line"><span class="cl"&g… | |
401 </span></span><span class="line"><span class="cl"&g… | |
402 </span></span></span><span class="line"><span… | |
403 </span></span><span class="line"><span class="cl"&g… | |
404 </span></span><span class="line"><span class="cl"&g… | |
405 </span></span></code></pre><p>Also the exp… | |
406 <blockquote> | |
407 <p>When you set a read deadline with <code>conn.SetReadDeadl… | |
408 the <code>Read()</code> call, this deadline remains in effec… | |
409 operations. This means that if you attempt another read operation after … | |
410 it could immediately fail with a timeout error if the deadline is still … | |
411 effect. | |
412 To reuse the connection, you'll need to remove the deadline or set a new… | |
413 You can do this by calling <code>conn.SetReadDeadline(time.Time{})… | |
414 any existing deadline.</p> | |
415 </blockquote> | |
416 <p>I had one last question that I kind already knew the answer:<… | |
417 <blockquote> | |
418 <p>Do we need to defer the clearing?</p> | |
419 </blockquote> | |
420 <p>And ChatGPT correctly returned:</p> | |
421 <blockquote> | |
422 <p>Whether you need to defer the clearing of the read deadline dep… | |
423 your code is structured. If you want to ensure that the read deadline is | |
424 always cleared after a context cancellation, even if the code panics or … | |
425 early, then deferring the <code>conn.SetReadDeadline(time.Time{})&… | |
426 idea.</p> | |
427 </blockquote> | |
428 <p>This whole interaction was one of the best ones I ever had in C… | |
429 it gave me an actual functional code with good explanation on what was | |
430 happening. But still, it didn't talked at all about the gotcha of settin… | |
431 read deadline and reusing the underlying connection, needing another pro… | |
432 give me this information.</p> | |
433 <p>Also, there is one issue in ChatGPT solution though: we are dis… | |
434 values of the buffer once the context is done by returning <code>n… | |
435 the number of bytes read. In this particular case this is what I wanted,… | |
436 this is a possible issue that ChatGPT didn't talk.</p> | |
437 <p>For comparison, | |
438 <a href="https://stackoverflow.com/questions/61637359/how-to-use-cont… | |
439 is the best that I got searching in both DuckDuckGo and Google, that is … | |
440 kind based my first solution on. I still not sure where ChatGPT could gi… | |
441 such a good answer for this question, because I just couldn't find anyth… | |
442 remotely similar during my searches.</p> | |
443 <h2>The amazing</h2> | |
444 <p><a href="https://chatgpt.com/share/0c9a148f-4cfd-4b4e-aa84-7… | |
445 <blockquote> | |
446 <p>I want to write an extension to <a href="https://github.com/… | |
447 me to rewrite <code>[link](../2024-07-30/post.md)</code> to | |
448 <code>[link](https://kokada.capivaras.dev/slug)</code></p… | |
449 </blockquote> | |
450 <p>Here is the generated code:</p> | |
451 <pre class="chroma"><code><span class="line"><span … | |
452 </span></span><span class="line"><span class="cl"&g… | |
453 </span></span><span class="line"><span class="cl"&g… | |
454 </span></span><span class="line"><span class="cl"&g… | |
455 </span></span><span class="line"><span class="cl"&g… | |
456 </span></span><span class="line"><span class="cl"&g… | |
457 </span></span><span class="line"><span class="cl"&g… | |
458 </span></span><span class="line"><span class="cl"&g… | |
459 </span></span><span class="line"><span class="cl"&g… | |
460 </span></span><span class="line"><span class="cl"&g… | |
461 </span></span><span class="line"><span class="cl"&g… | |
462 </span></span><span class="line"><span class="cl"&g… | |
463 </span></span><span class="line"><span class="cl"&g… | |
464 </span></span><span class="line"><span class="cl"&g… | |
465 </span></span><span class="line"><span class="cl"&g… | |
466 </span></span></span><span class="line"><span… | |
467 </span></span><span class="line"><span class="cl"&g… | |
468 </span></span><span class="line"><span class="cl"&g… | |
469 </span></span></span><span class="line"><span… | |
470 </span></span><span class="line"><span class="cl"&g… | |
471 </span></span><span class="line"><span class="cl"&g… | |
472 </span></span><span class="line"><span class="cl"&g… | |
473 </span></span><span class="line"><span class="cl"&g… | |
474 </span></span></span><span class="line"><span… | |
475 </span></span><span class="line"><span class="cl"&g… | |
476 </span></span><span class="line"><span class="cl"&g… | |
477 </span></span><span class="line"><span class="cl"&g… | |
478 </span></span><span class="line"><span class="cl"&g… | |
479 </span></span></span><span class="line"><span… | |
480 </span></span><span class="line"><span class="cl"&g… | |
481 </span></span><span class="line"><span class="cl"&g… | |
482 </span></span><span class="line"><span class="cl"&g… | |
483 </span></span><span class="line"><span class="cl"&g… | |
484 </span></span><span class="line"><span class="cl"&g… | |
485 </span></span><span class="line"><span class="cl"&g… | |
486 </span></span><span class="line"><span class="cl"&g… | |
487 </span></span><span class="line"><span class="cl"&g… | |
488 </span></span><span class="line"><span class="cl"&g… | |
489 </span></span><span class="line"><span class="cl"&g… | |
490 </span></span><span class="line"><span class="cl"&g… | |
491 </span></span><span class="line"><span class="cl"&g… | |
492 </span></span></span><span class="line"><span… | |
493 </span></span><span class="line"><span class="cl"&g… | |
494 </span></span><span class="line"><span class="cl"&g… | |
495 </span></span><span class="line"><span class="cl"&g… | |
496 </span></span></span><span class="line"><span… | |
497 </span></span><span class="line"><span class="cl"&g… | |
498 </span></span><span class="line"><span class="cl"&g… | |
499 </span></span><span class="line"><span class="cl"&g… | |
500 </span></span><span class="line"><span class="cl"&g… | |
501 </span></span><span class="line"><span class="cl"&g… | |
502 </span></span></span><span class="line"><span… | |
503 </span></span><span class="line"><span class="cl"&g… | |
504 </span></span></span><span class="line"><span… | |
505 </span></span><span class="line"><span class="cl"&g… | |
506 </span></span></code></pre><pre class="chroma… | |
507 </span></span><span class="line"><span class="cl"&g… | |
508 </span></span><span class="line"><span class="cl"&g… | |
509 </span></span><span class="line"><span class="cl"&g… | |
510 </span></span><span class="line"><span class="cl"&g… | |
511 </span></span><span class="line"><span class="cl"&g… | |
512 </span></span><span class="line"><span class="cl"&g… | |
513 </span></span><span class="line"><span class="cl"&g… | |
514 </span></span><span class="line"><span class="cl"&g… | |
515 </span></span><span class="line"><span class="cl"&g… | |
516 </span></span><span class="line"><span class="cl"&g… | |
517 </span></span><span class="line"><span class="cl"&g… | |
518 </span></span><span class="line"><span class="cl"&g… | |
519 </span></span><span class="line"><span class="cl"&g… | |
520 </span></span><span class="line"><span class="cl"&g… | |
521 </span></span><span class="line"><span class="cl"&g… | |
522 </span></span><span class="line"><span class="cl"&g… | |
523 </span></span><span class="line"><span class="cl"&g… | |
524 </span></span><span class="line"><span class="cl"&g… | |
525 </span></span></span><span class="line"><span… | |
526 </span></span></code></pre><p>This one wil… | |
527 the Markdown renderer that <a href="https://kokada.dev/blog/making-a-… | |
528 blog</a>, does not | |
529 have good examples or documentation (at least I didn't found neither).&l… | |
530 <p>So I was not really hopeful I would get any answers in ChatGPT,… | |
531 put me in the correct path, the code was almost correct. It did had some… | |
532 and missing imports, and there were some compilation errors that were ea… | |
533 fixed. And when it registered the extension, it also added a | |
534 <code>html.WithHardWraps()</code> renderer for no reason at … | |
535 <p>But this is one of the experiences in LLM that most impressed m… | |
536 at all on how to solve this problem, and ChatGPT basically gave me the | |
537 solution. A <a href="https://github.com/thiagokokada/blog/blob/3a2ea5… | |
538 code</a> | |
539 from this chat is still used to power this blog to this day, that also | |
540 demonstrates that the code is not garbage (since now I understand what i… | |
541 and I can even extend it).</p> | |
542 <p>I am still not sure how the license situation of this code is t… | |
543 licenses even make sense in AI generated code?</p> | |
544 <h2>The bad</h2> | |
545 <p><a href="https://chatgpt.com/share/95fcd777-b03c-4cfe-8d1d-1… | |
546 <blockquote> | |
547 <p>I want to configure VM options inside IntelliJ by project</p… | |
548 </blockquote> | |
549 <blockquote> | |
550 <p>My project uses sbt, and I want to set this in a way that I can… | |
551 colleagues</p> | |
552 </blockquote> | |
553 <blockquote> | |
554 <p>I am using a build.sbt file, but IntelliJ is not loading it's J… | |
555 I need to set this up manually. I want to automate this</p> | |
556 </blockquote> | |
557 <p>This is an example of my most common interaction with ChatGPT: … | |
558 gives some options that could work, but not in my specific case. So I st… | |
559 ask for more information until it eventually starts to | |
560 <a href="https://en.wikipedia.org/wiki/Hallucination_(artificial_inte… | |
561 <p>In this particular case, the hallucination was in:</p> | |
562 <blockquote> | |
563 <p>The sbt-idea-plugin can generate IntelliJ IDEA project files ba… | |
564 SBT configuration, including JVM options. This allows you to ensure that | |
565 IntelliJ loads the correct settings from the SBT configuration.</p> | |
566 <p>Steps:</p> | |
567 <ol> | |
568 <li>Add the <code>sbt-idea-plugin</code> to your <c… | |
569 </ol> | |
570 <pre class="chroma"><code><span class="line"><span … | |
571 </span></span></code></pre><ol start="2"> | |
572 <li>Run the following command in your terminal to regenerate Intel… | |
573 project files:</li> | |
574 </ol> | |
575 <pre class="chroma"><code><span class="line"><span … | |
576 </span></span></span></code></pre></blo… | |
577 <p>Yes, there is a | |
578 <a href="https://github.com/JetBrains/sbt-idea-plugin"><code>… | |
579 doesn't generate project files based in my SBT configuration. It is not … | |
580 from the repository that it is supposed to be pointing too.</p> | |
581 <p>I will just not say that this interaction was a waste of time b… | |
582 the other ideas can be applied, but this was the kind of case where I en… | |
583 just being disappointed because the thing that seemed to be a possible s… | |
584 for my problem ended up not existing at all.</p> | |
585 <h2>The ugly</h2> | |
586 <p>There are lots of examples where ChatGPT just plain disappointe… | |
587 few:</p> | |
588 <blockquote> | |
589 <p>What is the language that is a fork of Go that has extra featur… | |
590 </blockquote> | |
591 <p><a href="https://chatgpt.com/share/2b854bbd-d376-4049-97fe-b… | |
592 <p>This is one of those cases where I saw something once and was t… | |
593 remember. ChatGPT just gave me lots of answers that were not a fork of Go | |
594 (<a href="https://vlang.io/">V</a>, <a href="https://gith… | |
595 <a href="https://www.ponylang.io">Pony</a>), hallucinated a … | |
596 and said that <a href="https://ziglang.org/">Zig</a> is focu… | |
597 <p>By the way, I eventually remember what the language was: | |
598 <a href="https://goplus.org/">Go+</a>. To be fair with ChatG… | |
599 Go+ had map (as the <a href="https://en.wikipedia.org/wiki/Map_(highe… | |
600 function</a>, not a | |
601 hashmap that both Go and Go+ have). But still, Go+ explicit announces th… | |
602 is a language for STEM everywhere in their website, and even them ChatGPT | |
603 couldn't answer.</p> | |
604 <blockquote> | |
605 <p>In IntelliJ, I need to pass some VM options to the run configur… | |
606 application to run tests, e.g.:</p> | |
607 <pre><code>--add-exports=java.base/sun.security.x509=ALL-UNN… | |
608 --add-opens=java.base/sun.security.ssl=ALL-UNNAMED | |
609 -Dconfig.resource=api.test.conf | |
610 </code></pre> | |
611 <p>However, the <code>api.test.conf</code> may be <… | |
612 depending on the subproject I am running inside Idea. Can I parametrize … | |
613 in some way?</p> | |
614 </blockquote> | |
615 <p><a href="https://chatgpt.com/share/aa9bd051-65de-49d9-8d56-0… | |
616 <p>So quick answer: you can't. IntelliJ macros are not powerful en… | |
617 ChatGPT itself said so when I asked about the IntelliJ macros | |
618 <a href="https://chatgpt.com/share/7a057bf5-bcec-458b-9432-98e3f551ad… | |
619 <p>But in this particular case, ChatGPT happily said &quot;yes… | |
620 options in IntelliJ IDEA to make them more flexible depending on the sub… | |
621 or other context&quot;. Thanks for wasting my time, I guess.</p&g… | |
622 <h2>Conclusion</h2> | |
623 <p>I do think that LLMs, in particular ChatGPT since this is the o… | |
624 experience with, are improving. But still, if there is anything that I | |
625 concluded after putting all those experiences in a post is that you stil… | |
626 someone that knows at least as much about whatever you're asking ChatGPT… | |
627 actually validate the answer.</p> | |
628 <p>Not only because LLMs hallucinates a lot, but also because even… | |
629 example the LLM needed extra input to figure out about the possible draw… | |
630 the solution. The only case where I felt that ChatGPT outsmarted me was … | |
631 &quot;amazing&quot; case, but this was literally the only exampl… | |
632 all my chat history with ChatGPT that was like this.</p> | |
633 <p>So yes, at least for now I still don't think AI will be our ove… | |
634 someday.</p></description><pubDate>Mon, 02 Sep 2024 00:00:00 +0000… | |
635 more about it than some of my other projects. For some reason or another… | |
636 to make sure that this blog will continue with me for a long time. This … | |
637 of the reasons why I use <a href="https://kokada.dev/blog/using-githu… | |
638 blog</a> and why I | |
639 created a <a href="https://kokada.dev/blog/quick-bits-why-you-should-… | |
640 automation</a> | |
641 to make sure I never forget how to maintain this blog.</p> | |
642 <p>Still, there are a bunch of dependencies that I need to make su… | |
643 working so I can publish blog posts:</p> | |
644 <ul> | |
645 <li>Markdown</li> | |
646 <li>A text editor</li> | |
647 <li>Hosting and blog platform</li> | |
648 <li>Shell script and | |
649 <a href="https://kokada.dev/blog/abusing-makefiles-for-fun-and-profit… | |
650 <li>Go toolchain and modules</li> | |
651 </ul> | |
652 <p>Let's start with the most important one: the texts themselves, … | |
653 written in <a href="https://www.markdownguide.org/">Markdown</a… | |
654 Markdown is that it is just plain text files with some special notation … | |
655 allow you to format text, but the text itself is still legible even if y… | |
656 no support to render Markdowns. So it means as long as I can read a plai… | |
657 file, I can still read the posts, no issue there. Closely related issue … | |
658 the text editor, but the nice thing about Markdown is that if tomorrow I… | |
659 to change from <code>neovim</code> to, say, <a href="http… | |
660 Markdown files without issue. I also use a standardised Markdown impleme… | |
661 called <a href="https://commonmark.org/">CommonMark</a>, tha… | |
662 of the original Markdown spec.</p> | |
663 <p>The next point is the host (<a href="capivaras.dev">capiv… | |
664 platform (<a href="https://github.com/mataroa-blog/mataroa">Mataro… | |
665 things about Mataroa is that it avoids platform lock-in by having multip… | |
666 to <a href="https://mataroa.blog/export/">export your posts</a&… | |
667 to <a href="https://gohugo.io/">Hugo</a>, for example, and s… | |
668 Pages</a>.</p> | |
669 <p>This is especially nice consider how small <a href="capivara… | |
670 so it is good to know that if I eventually have issues I could move to | |
671 somewhere else. I also have an e-mail backup every month with all posts … | |
672 (another <a href="https://hey.mataroa.blog/blog/monthly-auto-exports-… | |
673 feature</a>), and | |
674 of course I have a <a href="https://github.com/thiagokokada/blog">… | |
675 acts as a <a href="https://kokada.dev/blog/using-github-as-a-bad-blog… | |
676 blog</a>. So I would | |
677 say the chance of losing access to the content is slim.</p> | |
678 <p>One other issue is the URL of the posts that are indexed in man… | |
679 places, like <a href="https://news.ycombinator.com/">Hacker News&l… | |
680 <a href="https://lobste.rs/">Lobte.rs</a>, etc. This is why … | |
681 bullet and purchase a proper domain, and this website should now be avai… | |
682 in <a href="kokada.dev">kokada.dev</a>. This means that in m… | |
683 <a href="capivaras.dev">capivaras.dev</a>, I can just point … | |
684 domain if needed (it is not as easy since I also need to preserve the po… | |
685 URLs, but shouldn't be difficult to fix this if I ever need to do so).&l… | |
686 <p>Now for the tools that I use to publish from the original Markd… | |
687 everything else. Let's start with shell script(s) and Makefile: I decide… | |
688 they're less of an issue if they eventually stop working: they're only u… | |
689 make my life easier, but I can still publish files manually if needed. S… | |
690 tried to rewrite both the | |
691 <a href="https://github.com/thiagokokada/blog/commit/a0d421ca90f3da05… | |
692 and | |
693 <a href="https://github.com/thiagokokada/blog/commit/074580065b21fbda… | |
694 to avoid GNUisms, so in the eventual case that I decide to e.g.: stop us… | |
695 GNU/Linux system like NixOS and use a *BSD system instead, I am covered.… | |
696 <p>In other projects I would probably add a <code>shell.nix&… | |
697 versions of the tools that I am using, but I am trying to avoid Nix while | |
698 building this blog as much as I can, mainly because it is not available | |
699 everywhere (e.g.: *BSD systems).</p> | |
700 <p>Go is the more important part: the tooling used to <a href="… | |
701 written in | |
702 Go</a>. Go | |
703 is a good language when you want to ensure that things will work for a l… | |
704 time because of its <a href="https://go.dev/blog/compat">backwards… | |
705 guarantee</a>. Also I don't expect Google dropping Go | |
706 development soon, but even if this happen (<a href="https://killedbyg… | |
707 Google&quot;</a> is a thing after all), it is very likely | |
708 some other group or company would adopt its development quickly, conside… | |
709 <a href="https://www.tiobe.com/tiobe-index/go/">how popular the la… | |
710 <p>However, the <a href="https://github.com/thiagokokada/blog/b… | |
711 modules</a> that I depend | |
712 are another story:</p> | |
713 <ul> | |
714 <li><a href="https://github.com/elliotchance/orderedmap/">el… | |
715 ordered map implementation that I use until Go adds it in the <a href… | |
716 library</a></li> | |
717 <li><a href="https://github.com/gorilla/feeds">gorilla/feeds… | |
718 <li><a href="https://github.com/gosimple/slug">gosimple/slug… | |
719 <a href="https://developer.mozilla.org/en-US/docs/Glossary/Slug">s… | |
720 library</li> | |
721 <li><a href="https://github.com/yuin/goldmark">yuin/goldmark… | |
722 renderer</li> | |
723 <li><a href="https://github.com/teekennedy/goldmark-markdown"&g… | |
724 a renderer for Goldmark to render back to Markdown (since Goldmark itself | |
725 doesn't have this capacity)</li> | |
726 </ul> | |
727 <p>In common for all those modules are that they're clearly small … | |
728 maintained mostly by one developer. They're all very good, don't get me … | |
729 but they're still an reliability issue in the future. There is no guaran… | |
730 those repositories will not be deleted tomorrow, for example.</p> | |
731 <p>Yes, <a href="https://proxy.golang.org/">Go Proxy</a&g… | |
732 reading its page is that while it caches modules contents, this is not | |
733 guarantee:</p> | |
734 <blockquote> | |
735 <p>proxy.golang.org does not save all modules forever. There are a… | |
736 reasons for this, but one reason is if proxy.golang.org is not able to d… | |
737 a suitable license. In this case, only a temporarily cached copy of the | |
738 module will be made available, and may become unavailable if it is remov… | |
739 from the original source and becomes outdated. The checksums will still | |
740 remain in the checksum database regardless of whether or not they have b… | |
741 unavailable in the mirror.</p> | |
742 </blockquote> | |
743 <p>This is why this is the first project that made sense to me to … | |
744 code of all modules inside the | |
745 <a href="https://github.com/thiagokokada/blog/tree/0b97630d6b30551ffe… | |
746 directory in the repository, avoiding the risks I commented above. This … | |
747 me to ensure that this blog will still be publishable in the future, as … | |
748 I have a working Go toolchain (and Go toolchain makes this | |
749 <a href="https://kokada.dev/blog/quick-bits-go-automatically-download… | |
750 <p>There are a few other things that can bitrot this blog, for exa… | |
751 nowhere. I always try to use | |
752 <a href="https://en.wikipedia.org/wiki/Permalink">permalinks</a… | |
753 the only actual way to ensure those links would work in the future would… | |
754 point them to <a href="https://archive.org/">archive.org</a>… | |
755 exist forever). Maybe something to fix in the future, hope not in the far | |
756 future, before things start to break.</p></description><pubDate>Sa… | |
757 end up with a <a href="https://github.com/thiagokokada/nix-configs/"&… | |
758 with many things that are interesting for one reason or another, but it … | |
759 listed anywhere (well, except if you are the kind of person that reads &… | |
760 <p>So kind in the same spirit as my <a href="https://kokada.dev… | |
761 Go</a>, here is | |
762 a list of modules that I find neat in NixOS and are not default already.… | |
763 the list is unordered since this makes it easier to update in the future… | |
764 find something else, but also I don't want to think too hard about an or… | |
765 here.</p> | |
766 <p>With all above, let's start.</p> | |
767 <h2><a href="https://github.com/NixOS/nixpkgs/blob/6afb255d976f… | |
768 <p><a href="https://www.nftables.org/">nftables</a> is… | |
769 <blockquote> | |
770 <p>nftables is a subsystem of the Linux kernel providing filtering… | |
771 classification of network packets/datagrams/frames.</p> | |
772 </blockquote> | |
773 <p>It is basically a replacement of the venerable | |
774 <a href="https://en.wikipedia.org/wiki/Iptables">iptables</a>… | |
775 default program to configure the famous <code>networking.firewall&… | |
776 <a href="https://wiki.nixos.org/wiki/Firewall">Firewall</a> … | |
777 <p>To enable, it is simple, just add to your configuration:</p&… | |
778 <pre class="chroma"><code><span class="line"><span … | |
779 </span></span><span class="line"><span class="cl"&g… | |
780 </span></span><span class="line"><span class="cl"&g… | |
781 </span></span></code></pre><p>And thanks t… | |
782 still work as expect: any service that you set <code>openFirewall … | |
783 have its ports open, if you set <code>networking.firewall.allowPin… | |
784 still disable pings like before, etc.</p> | |
785 <p>If you look at the documentation of the above option, you will … | |
786 following warning:</p> | |
787 <blockquote> | |
788 <p>Note that if you have Docker enabled you will not be able to us… | |
789 without intervention. Docker uses iptables internally to setup NAT for | |
790 containers. This module disables the ip_tables kernel module, however Do… | |
791 automatically loads the module. Please see | |
792 <a href="https://github.com/NixOS/nixpkgs/issues/24318#issuecomment-2… | |
793 more information.</p> | |
794 </blockquote> | |
795 <p>I don't use Docker (switched to Podman instead for quite a long… | |
796 don't know how bad the situation is. Also keep in mind that <code>… | |
797 offer <code>iptables-compat</code> for compatibility with ol… | |
798 most likely Docker doing something weird here.</p> | |
799 <p>Now, the actual advantage from the user here is not clear: the … | |
800 from my point of view (and the reason I used to use in other distros lik… | |
801 is the improved syntax, however if you are using the declarative NixOS's | |
802 Firewall you are not interacting with either <code>iptables</co… | |
803 anyway. <code>nftables</code> is supposed to be more efficie… | |
804 will care about this.</p> | |
805 <p>However if you are the kind of person that needs custom rules, … | |
806 <code>nftables</code> does bring a few benefits, including | |
807 <code>networking.nftables.checkRuleset</code> (enabled by de… | |
808 ruleset has syntax errors during build time. Really valuable to avoid is… | |
809 only after switch.</p> | |
810 <p>Anyway, this is one of those options that I think it should be … | |
811 a long time, since most of the new development in NixOS firewall seems t… | |
812 focusing <code>nftables</code> for a while.</p> | |
813 <h2><a href="https://github.com/NixOS/nixpkgs/blob/877d19523edc… | |
814 <p><a href="https://github.com/NixOS/nixpkgs/pull/308801">Th… | |
815 today, but it has been available for a while (~2 months if you're using | |
816 <code>nixos-unstable</code>). Finally someone is rewriting | |
817 <a href="https://github.com/NixOS/nixpkgs/blob/b1eff03c35aa7c90ab3a4d… | |
818 the Perl script that is called everytime you run <code>nixos-rebui… | |
819 <p>Now, I am not one of those &quot;rewrite in Rust&quot; … | |
820 definitely worth it: <code>switch-to-configuration.pl</code>… | |
821 code in NixOS that most people avoid touching at the fear of breaking | |
822 something. There is a reason why | |
823 <a href="https://github.com/NixOS/nixpkgs/commit/eeb2588a59c938042b74… | |
824 is as convoluted as it is, because even if it is a messy shell script, m… | |
825 people preferred to workaround issues from the <code>switch-to-con… | |
826 inside it than trying to understand the mess that <code>switch-to-… | |
827 is.</p> | |
828 <p>Trying this one is easy:</p> | |
829 <pre class="chroma"><code><span class="line"><span … | |
830 </span></span><span class="line"><span class="cl"&g… | |
831 </span></span><span class="line"><span class="cl"&g… | |
832 </span></span><span class="line"><span class="cl"&g… | |
833 </span></span><span class="line"><span class="cl"&g… | |
834 </span></span><span class="line"><span class="cl"&g… | |
835 </span></span></code></pre><p>Yes, you nee… | |
836 is <code>true</code>.</p> | |
837 <p>By the way, what is the reason you would want to set <code&g… | |
838 and updated by e.g.: image upgrades instead of modifying root.</p> | |
839 <p>Enabling <code>switch-to-configuration-ng</code> ri… | |
840 but one of the advantages that I saw is that system switches are (slight… | |
841 faster:</p> | |
842 <pre><code>$ hyperfine &quot;sudo nixos-rebuild switch&a… | |
843 Benchmark 1: sudo nixos-rebuild switch | |
844 Time (mean ± σ): 3.576 s ± 0.035 s [User: 0.004 s, System:… | |
845 Range (min … max): 3.522 s … 3.645 s 10 runs | |
846 </code><p><code>$ hyperfine &quot;sudo nixos-rebui… | |
847 Benchmark 1: sudo nixos-rebuild switch | |
848 Time (mean ± σ): 3.394 s ± 0.080 s [User: 0.004 s, System: 0… | |
849 Range (min … max): 3.325 s … 3.608 s 10 runs | |
850 </code></p></pre><p></p> | |
851 <p>But yes, the difference is not enough to make a significant imp… | |
852 not the objective anyway. The real reason for the rewrite is to make it … | |
853 to collaborate. I hope one day we also have someone brave enough to rewr… | |
854 <code>nixos-rebuild</code> script in something saner.</p&… | |
855 <h2><a href="https://github.com/NixOS/nixpkgs/blob/cce9aef6fd8f… | |
856 <p>A quick recap on how a modern Linux distro generally boots: the… | |
857 that the bootloader (say <a href="https://www.gnu.org/software/grub/"… | |
858 <a href="https://systemd.io/BOOT/">systemd-boot</a>) loads i… | |
859 ramdisk</em>), a small image that runs from RAM and includes the L… | |
860 some utilities that are responsible for setting up the main system. For | |
861 example, one of the responsibilities of the <code>initrd</code&… | |
862 start init system (<code>systemd</code>).</p> | |
863 <p>It may surprising that this <code>initrd</code> ima… | |
864 <code>systemd</code>. Traditionally <code>initrd</c… | |
865 minimal runtime (e.g.: <a href="https://www.busybox.net/">busybox&… | |
866 can also do this job since a long time ago. It is just the role of the d… | |
867 to integrate <code>systemd</code> inside the <code>ini… | |
868 <p>This is what <code>boot.initrd.systemd</code> does:… | |
869 It make a few subtle changes:</p> | |
870 <ul> | |
871 <li>If you are using <a href="https://wiki.nixos.org/wiki/Full_… | |
872 LUKS</a>, you will get a | |
873 different password prompt at login</li> | |
874 <li>You will get <code>initrd</code> time information … | |
875 boot time | |
876 <ul> | |
877 <li>You can get even more information (bootloader) if you also use | |
878 <code>systemd-boot</code></li> | |
879 </ul> | |
880 </li> | |
881 <li>You will also get <code>systemd</code> style statu… | |
882 only afterwards)</li> | |
883 </ul> | |
884 <p>But I think the main reason is that since <code>systemd&l… | |
885 make boot more reliable, especially in challenging situations (like boot… | |
886 from network). I can't say that I have any system like this to test if i… | |
887 actually more reliable or not, but I don't remember having any issues si… | |
888 set <code>boot.initrd.systemd.enable = true</code>, so there… | |
889 <h2><a href="https://github.com/NixOS/nixpkgs/blob/b4a09f1f9d15… | |
890 <p>If there is something in that list that has a good chance that … | |
891 already, it is this one, especially if you're using | |
892 <a href="https://wayland.freedesktop.org/">Wayland</a>. Stil… | |
893 to include in this list since <a href="https://www.pipewire.org/">… | |
894 <p>The experience with PipeWire until now for me was seamless: I n… | |
895 issues with it, all my applications still work exactly as it always work… | |
896 also didn't had any issues with | |
897 <a href="https://www.freedesktop.org/wiki/Software/PulseAudio/">Pu… | |
898 while, but I still remember when I first tried PulseAudio during the 0.x… | |
899 Fedora and having tons of issues. So bonus points for PipeWire developer… | |
900 polishing the experience of enough that most people will feel no differe… | |
901 <p>To enable PipeWire, I would recommend:</p> | |
902 <pre class="chroma"><code><span class="line"><span … | |
903 </span></span><span class="line"><span class="cl"&g… | |
904 </span></span><span class="line"><span class="cl"&g… | |
905 </span></span><span class="line"><span class="cl"&g… | |
906 </span></span><span class="line"><span class="cl"&g… | |
907 </span></span><span class="line"><span class="cl"&g… | |
908 </span></span><span class="line"><span class="cl"&g… | |
909 </span></span><span class="line"><span class="cl"&g… | |
910 </span></span><span class="line"><span class="cl"&g… | |
911 </span></span></code></pre><p>This enables… | |
912 compatibility with desktop applications (you can also enable | |
913 <a href="https://jackaudio.org/"><code>jack</code><… | |
914 It also enables <a href="https://github.com/heftig/rtkit"><code… | |
915 to get (soft) realtime, helping avoiding cracks during high CPU load.<… | |
916 <p>I also recommend taking a look at the <a href="https://wiki.… | |
917 article</a>, that has multiple interesting | |
918 configurations that can be added for low-latency setups or improved code… | |
919 Bluetooth devices.</p> | |
920 <h2><a href="https://github.com/NixOS/nixpkgs/blob/c9ec8289781a… | |
921 <p>There is a good change that you're using | |
922 <a href="https://www.networkmanager.dev/"><code>NetworkManag… | |
923 especially for Wi-Fi. And if that is the case, I can't recommend enough | |
924 changing the backend from the default <code>wpa_supplicant</cod… | |
925 <a href="https://iwd.wiki.kernel.org/"><code>iwd</code>… | |
926 <p>If you think that your Wi-Fi takes a long time to connect/re-co… | |
927 because <code>wpa_supplicant</code>. <code>iwd</cod… | |
928 since switching to it I never felt that my Wi-Fi was worse than other OS… | |
929 generally slightly better than Windows, but keep in mind that this is a | |
930 non-scientific comparison).</p> | |
931 <p>Not saying that I never had Wi-Fi issues since switching to <… | |
932 switching back to <code>wpa_supplicant</code> in those cases… | |
933 the same or worse), so I assume either bad hardware or drivers in those … | |
934 <h2><a href="https://github.com/NixOS/nixpkgs/blob/d5badef1e041… | |
935 <p><em>Added in 2024-08-22</em></p> | |
936 <p>Most Linux distro nowadays mount <code>/tmp</code> … | |
937 <a href="https://en.wikipedia.org/wiki/Tmpfs">tmpfs</a>, sto… | |
938 making them actually temporary, e.g.: does not persist between reboots).… | |
939 is a <a href="https://lwn.net/Articles/499410/">long discussion<… | |
940 sense or not, but it is a fact that using <code>/tmp</code> … | |
941 generally makes sense.</p> | |
942 <p>However, NixOS still stores <code>/tmp</code> insid… | |
943 this is because Nix, by default, still builds everything in <code>… | |
944 defaults to <code>/tmp</code> if not set). To fix the situat… | |
945 <pre class="chroma"><code><span class="line"><span … | |
946 </span></span><span class="line"><span class="cl"&g… | |
947 </span></span><span class="line"><span class="cl"&g… | |
948 </span></span><span class="line"><span class="cl"&g… | |
949 </span></span><span class="line"><span class="cl"&g… | |
950 </span></span><span class="line"><span class="cl"&g… | |
951 </span></span></code></pre><p>This ensures… | |
952 for large files.</p> | |
953 <p>If you don't want to use <code>/tmp</code> inside t… | |
954 least setting <code>boot.tmp.cleanOnBoot = true</code>. This… | |
955 mistakenly writing a program that depends in <code>/tmp</code&g… | |
956 this is the behavior that most other distros expects.</p> | |
957 <h2><a href="https://github.com/NixOS/nixpkgs/blob/68142254d202… | |
958 <p><em>Added in 2024-08-22</em></p> | |
959 <p>Have a system with small amounts of RAM? <del>You can dow… | |
960 just click this <a href="https://downloadmoreram.com/">link</a&… | |
961 you can actually improve RAM usage by compressing it. This is what | |
962 <a href="https://en.wikipedia.org/wiki/Zram"><code>zram</… | |
963 device using part of your RAM that will be compressed.</p> | |
964 <p>While this means that whatever is in the compressed part can't … | |
965 (it needs to be decompressed first), it means you can store a lot more | |
966 information. And since RAM is much faster than disk, this generally is a… | |
967 trade-off. It is still recommended that you have some swap space though,… | |
968 to swap pages that are unused.</p> | |
969 <p>To enable it, you can do:</p> | |
970 <pre class="chroma"><code><span class="line"><span … | |
971 </span></span><span class="line"><span class="cl"&g… | |
972 </span></span><span class="line"><span class="cl"&g… | |
973 </span></span><span class="line"><span class="cl"&g… | |
974 </span></span><span class="line"><span class="cl"&g… | |
975 </span></span><span class="line"><span class="cl"&g… | |
976 </span></span></code></pre><p>You can play… | |
977 either <code>lz4</code> or <code>zstd</code>. It… | |
978 fast, since you probably want to minimise CPU usage. Well, unless you ha… | |
979 very good CPU and small amounts of RAM, them it may make sense to use an | |
980 algorithm that compress better but uses more CPU.</p> | |
981 <h2><a href="https://github.com/NixOS/nixpkgs/blob/5356420466c4… | |
982 <p><em>Added in 2024-08-22</em></p> | |
983 <p>Do you have a SSD? If so, you probably want to | |
984 <a href="https://en.wikipedia.org/wiki/Trim_(computing)">trim</… | |
985 good performance. This should be as easy as:</p> | |
986 <pre class="chroma"><code><span class="line"><span … | |
987 </span></span><span class="line"><span class="cl"&g… | |
988 </span></span><span class="line"><span class="cl"&g… | |
989 </span></span></code></pre><p>One caveat t… | |
990 need to enable <code>boot.initrd.luks.devices.&lt;name&gt;… | |
991 <code>fstrim</code> will not work. The reason that this is n… | |
992 because there are some <a href="https://asalor.blogspot.com/2011/08/t… | |
993 implications</a>. | |
994 It shouldn't be an issue for most people, but if you are paranoid please… | |
995 your risks first.</p> | |
996 <h2><a href="https://github.com/NixOS/nixpkgs/blob/e83fc891118e… | |
997 <p><em>Added in 2024-08-22</em></p> | |
998 <p>This is one of my favorites. Do you want to have the power to r… | |
999 other architectures like | |
1000 <a href="https://en.wikipedia.org/wiki/ARM_architecture_family">AR… | |
1001 <a href="https://en.wikipedia.org/wiki/RISC-V">RISC-V</a>? I… | |
1002 <pre class="chroma"><code><span class="line"><span … | |
1003 </span></span><span class="line"><span class="cl"&g… | |
1004 </span></span><span class="line"><span class="cl"&g… | |
1005 </span></span></code></pre><p>This will in… | |
1006 <a href="https://en.wikipedia.org/wiki/Binfmt_misc"><code>bi… | |
1007 automatically detect when a binary from another architecture is run, | |
1008 running it with the QEMU emulator instead.</p> | |
1009 <p>Now, keep in mind that you still need e.g.: libraries for the t… | |
1010 architecture. However this is where the Nix magic comes in, you can easi… | |
1011 compile something to another architecture as:</p> | |
1012 <pre class="chroma"><code><span class="line"><span … | |
1013 </span></span><span class="line"><span class="cl"&g… | |
1014 </span></span></span><span class="line"><span… | |
1015 </span></span><span class="line"><span class="cl"&g… | |
1016 </span></span><span class="line"><span class="cl"&g… | |
1017 </span></span><span class="line"><span class="cl"&g… | |
1018 </span></span></span><span class="line"><span… | |
1019 </span></span><span class="line"><span class="cl"&g… | |
1020 </span></span></span></code></pre><p>… | |
1021 architecture, everything works as expect.</p> | |
1022 <p>You also need to temper your expectations: QEMU emulation is sl… | |
1023 sufficient fast to build small programs, but if you need to build someth… | |
1024 bigger, I would recommend you to do it via <a href="https://kokada.de… | |
1025 instead</a>.</p> | |
1026 <h2><a href="https://github.com/NixOS/nixpkgs/blob/d9cf6ea6f809… | |
1027 <p><em>Added in 2024-08-22</em></p> | |
1028 <p>Someone in | |
1029 <a href="https://lobste.rs/s/ymmale/unordered_list_hidden_gems_inside… | |
1030 remembered me of this gem: <a href="https://github.com/bus1/dbus-brok… | |
1031 a high performance implementation of | |
1032 <a href="https://en.wikipedia.org/wiki/D-Bus">D-Bus</a>.<… | |
1033 <p>For those who doesn't know, D-Bus is the <a href="https://en… | |
1034 Communication</a> | |
1035 protocol used mostly in Linux desktop. And distros like | |
1036 <a href="https://archlinux.org/news/making-dbus-broker-our-default-d-… | |
1037 and | |
1038 <a href="https://fedoraproject.org/wiki/Changes/DbusBrokerAsTheDefaul… | |
1039 already use it to default, so there aren't lots of reason to not use it.… | |
1040 <h2><a href="https://github.com/NixOS/nixpkgs/blob/6afb255d976f… | |
1041 <p><em>Added in 2024-08-23</em></p> | |
1042 <p>Here is one that I have no experience but got curious after thi… | |
1043 <a href="https://lobste.rs/s/ymmale/unordered_list_hidden_gems_inside… | |
1044 <blockquote> | |
1045 <p>One more option to add is maybe <code>services.irqbalance… | |
1046 laptop it’s a life savior: no more freezes of the DE or video playback… | |
1047 heavy operations like e.g. compilation.</p> | |
1048 </blockquote> | |
1049 <p>Never tried it before but will give a try!</p></descripti… | |
1050 that you write for yourself. This blog post is the latter kind. What I a… | |
1051 to talk here is probably something most people know, but I didn't, and t… | |
1052 documentation is all scattered in the internet. So I am writing mostly to | |
1053 remember myself, in future, if I have the same kind of issue what I need… | |
1054 <p>The context: <a href="https://mataroa.blog/">Mataroa</… | |
1055 <a href="https://capivaras.dev">capivaras.dev</a> is hosted … | |
1056 <a href="https://python-markdown.github.io/">python-markdown</a… | |
1057 <a href="https://commonmark.org/">CommonMark</a> specificati… | |
1058 incompatibilities. One of those incompatibilities with CommonMark is the… | |
1059 sub lists are handled. From the documentation:</p> | |
1060 <blockquote> | |
1061 <p>The syntax rules clearly state that when a list item consists o… | |
1062 paragraphs, “each subsequent paragraph in a list item must be indented… | |
1063 either 4 spaces or one tab” (emphasis added). However, many implementa… | |
1064 do not enforce this rule and allow less than 4 spaces of indentation. The | |
1065 implementers of Python-Markdown consider it a bug to not enforce this ru… | |
1066 </blockquote> | |
1067 <p>CommonMark <a href="https://spec.commonmark.org/0.31.2/#list… | |
1068 restrictions</a>, allowing a sublist to | |
1069 be defined with just 2 spaces of indentation.</p> | |
1070 <p>So I have automated all posts from this blog <a href="https:… | |
1071 Go</a> and | |
1072 a CommonMark renderer called <a href="https://github.com/yuin/goldmar… | |
1073 them re-render the Markdown to Mataroa using a <a href="https://githu… | |
1074 renderer</a> before publising to | |
1075 <a href="https://capivaras.dev">capivaras.dev</a>, because t… | |
1076 transformations in the original Markdown. It mostly works fine except fo… | |
1077 lists, thanks to the fact that the Markdown renderer I am using renders … | |
1078 lists with 2 spaces.</p> | |
1079 <p>The only reason sub lists are working right now is because | |
1080 <a href="https://gluer.org/">@ratsclub</a> fixed this issue … | |
1081 <a href="https://capivaras.dev">capivaras.dev</a> runs. But … | |
1082 the official instance if I ever need to migrate.</p> | |
1083 <p>The solution? Let's fix this in a | |
1084 <a href="https://github.com/teekennedy/goldmark-markdown/pull/21">… | |
1085 I have code to fix the issue, how can I use it without waiting upstream … | |
1086 merge my code?</p> | |
1087 <p>If you are using Go modules it is easy, you just need to use th… | |
1088 directive</a>:</p> | |
1089 <pre class="chroma"><code><span class="line"><span … | |
1090 </span></span><span class="line"><span class="cl"&g… | |
1091 </span></span><span class="line"><span class="cl"&g… | |
1092 </span></span><span class="line"><span class="cl"&g… | |
1093 </span></span><span class="line"><span class="cl"&g… | |
1094 </span></span><span class="line"><span class="cl"&g… | |
1095 </span></span><span class="line"><span class="cl"&g… | |
1096 </span></span><span class="line"><span class="cl"&g… | |
1097 </span></span><span class="line"><span class="cl"&g… | |
1098 </span></span><span class="line"><span class="cl"&g… | |
1099 </span></span><span class="line"><span class="cl"&g… | |
1100 </span></span><span class="line"><span class="cl"&g… | |
1101 </span></span><span class="line"><span class="cl"&g… | |
1102 </span></span><span class="line"><span class="cl"&g… | |
1103 </span></span><span class="line"><span class="cl"&g… | |
1104 </span></span></span><span class="line"><span… | |
1105 </span></span></span><span class="line"><span… | |
1106 </span></span></span><span class="line"><span… | |
1107 </span></span><span class="line"><span class="cl"&g… | |
1108 </span></span><span class="line"><span class="cl"&g… | |
1109 </span></span></code></pre><p>This will re… | |
1110 fork in <code>github.com/thiagokokada/goldmark-markdown</code&g… | |
1111 reproducibility of modules since Go automatically pins the commit.</p… | |
1112 <p>Since the Go format for versions is quite unique, you can just … | |
1113 desired branch (e.g.: instead of <code>v0.0.0-20240820111219-f3077… | |
1114 use <code>add-sublist-length-opt</code> that is the branch n… | |
1115 fix the format.</p></description><pubDate>Tue, 20 Aug 2024 00:00:0… | |
1116 <a href="https://github.com/elliotchance/orderedmap/">elliotchance… | |
1117 choice of ordered maps (since Go <a href="https://kokada.dev/blog/an-… | |
1118 one</a> in | |
1119 standard library yet). I recently did a | |
1120 <a href="https://github.com/elliotchance/orderedmap/pull/41">PR<… | |
1121 iterators, because I find them neat, however I was avoiding to use it in… | |
1122 code that generates this <a href="https://github.com/thiagokokada/blo… | |
1123 1.23 was just released and is still not the default Go in | |
1124 <a href="https://github.com/NixOS/nixpkgs">nixpkgs</a>.</… | |
1125 <p>I decided that I would create a | |
1126 <a href="https://github.com/thiagokokada/blog/pull/2">branch</a… | |
1127 months, until I decided to try to run the code locally and got this:<… | |
1128 <pre class="chroma"><code><span class="line"><span … | |
1129 </span></span><span class="line"><span class="cl"&g… | |
1130 </span></span></span></code></pre><p>… | |
1131 <pre class="chroma"><code><span class="line"><span … | |
1132 </span></span><span class="line"><span class="cl"&g… | |
1133 </span></span></span><span class="line"><span… | |
1134 </span></span></span></code></pre><p>… | |
1135 page</a>:</p> | |
1136 <blockquote> | |
1137 <p>Starting in Go 1.21, the Go distribution consists of a go comma… | |
1138 bundled Go toolchain, which is the standard library as well as the compi… | |
1139 assembler, and other tools. The go command can use its bundled Go toolch… | |
1140 as well as other versions that it finds in the local PATH or downloads as | |
1141 needed.</p> | |
1142 </blockquote> | |
1143 <p>There are a bunch of rules here that I am not going to enter in… | |
1144 recommend you to read the official documentation), but a quick summary:&… | |
1145 <ul> | |
1146 <li> | |
1147 <p>Go will download a toolchain when either <code>go</cod… | |
1148 is set to a Go version higher than your current <code>go</code&… | |
1149 <ul> | |
1150 <li>But only if your <code>go</code> binary is at leas… | |
1151 version that introduces this behavior</li> | |
1152 </ul> | |
1153 </li> | |
1154 <li> | |
1155 <p>You can force a specific toolchain with <code>GOTOOLCHAIN… | |
1156 e.g.: <code>GOTOOLCHAIN=1.23</code></p> | |
1157 <ul> | |
1158 <li>The default value for <code>GOTOOLCHAIN</code> is … | |
1159 behavior described in this post</li> | |
1160 <li>You can also set to <code>local</code> to always u… | |
1161 previous behaviour pre-1.21 Go</li> | |
1162 <li>There is also <code>&lt;name&gt;+auto</code&g… | |
1163 docs</li> | |
1164 </ul> | |
1165 </li> | |
1166 <li> | |
1167 <p>The downloaded toolchains go to whatever your <code>GOPAT… | |
1168 <code>golang.org/toolchain</code> module, and version <co… | |
1169 example:</p> | |
1170 <pre class="chroma"><code><span class="line"><span … | |
1171 </span></span><span class="line"><span class="cl"&g… | |
1172 </span></span></span><span class="line"><span… | |
1173 </span></span></span><span class="line"><span… | |
1174 </span></span></span><span class="line"><span… | |
1175 </span></span></span><span class="line"><span… | |
1176 </span></span></span><span class="line"><span… | |
1177 </span></span></span><span class="line"><span… | |
1178 </span></span></span><span class="line"><span… | |
1179 </span></span></span><span class="line"><span… | |
1180 </span></span></span><span class="line"><span… | |
1181 </span></span></span><span class="line"><span… | |
1182 </span></span></span><span class="line"><span… | |
1183 </span></span></span><span class="line"><span… | |
1184 </span></span></span><span class="line"><span… | |
1185 </span></span></span><span class="line"><span… | |
1186 </span></span></span></code></pre></li&… | |
1187 </ul> | |
1188 <p>By the way, this only works well because Go toolchain binaries … | |
1189 <p>While I don't like a program downloading random binaries from t… | |
1190 like what Go is doing here. It makes the whole bootstrapping process for… | |
1191 project much easier: as long as you have a reasonable up-to-date <cod… | |
1192 your <code>PATH</code>, you should be ready to go (pun inten… | |
1193 already reasonable secure, ensuring that each module have a proper check… | |
1194 long as nobody else can publish modules in <code>golang.org/toolch… | |
1195 can't see much of a security issue here, but I am not a security expert.… | |
1196 <p>But if you don't like this behavior, you can always disable it … | |
1197 <code>GOTOOLCHAIN=local</code>. And just do not forget to se… | |
1198 <a href="https://brandur.org/fragments/go-version-matrix">CI</a… | |
1199 about Go versions.</p></description><pubDate>Mon, 19 Aug 2024 00:0… | |
1200 language</a>, and has some | |
1201 good qualities that makes up for its flaws. However, this doesn't mean I… | |
1202 the language couldn't be better, far from it.</p> | |
1203 <p>This blog post is a list of things that I miss from Go from oth… | |
1204 Some of the things here could probably be implemented soon, some other w… | |
1205 probably need a major revision of the language. The list is unordered, b… | |
1206 this makes it easier for me to update in the future if I found something… | |
1207 but also because I don't want to think too hard about giving each point … | |
1208 rank.</p> | |
1209 <p>With all above, let's start.</p> | |
1210 <h2>Ordered maps in standard library</h2> | |
1211 <p>When I first learned about | |
1212 <a href="https://docs.python.org/3/library/stdtypes.html#typesmapping… | |
1213 Python it quickly became one of my favorite data structures ever. They're | |
1214 extremely versatile, and most modern programming languages have something | |
1215 similar in its standard library. Go isn't different, it has | |
1216 <a href="https://go.dev/blog/maps"><code>map</code><… | |
1217 table</a>. However <code>map</code> in Go are | |
1218 quirky, for example:</p> | |
1219 <pre class="chroma"><code><span class="line"><span … | |
1220 </span></span><span class="line"><span class="cl"&g… | |
1221 </span></span><span class="line"><span class="cl"&g… | |
1222 </span></span><span class="line"><span class="cl"&g… | |
1223 </span></span><span class="line"><span class="cl"&g… | |
1224 </span></span><span class="line"><span class="cl"&g… | |
1225 </span></span><span class="line"><span class="cl"&g… | |
1226 </span></span><span class="line"><span class="cl"&g… | |
1227 </span></span><span class="line"><span class="cl"&g… | |
1228 </span></span></code></pre><pre class="chroma… | |
1229 </span></span><span class="line"><span class="cl"&g… | |
1230 </span></span></span><span class="line"><span… | |
1231 </span></span></span><span class="line"><span… | |
1232 </span></span></span><span class="line"><span… | |
1233 </span></span></span><span class="line"><span… | |
1234 </span></span></span><span class="line"><span… | |
1235 </span></span></span><span class="line"><span… | |
1236 </span></span><span class="line"><span class="cl"&g… | |
1237 </span></span></span><span class="line"><span… | |
1238 </span></span></span><span class="line"><span… | |
1239 </span></span></span><span class="line"><span… | |
1240 </span></span></span><span class="line"><span… | |
1241 </span></span></span><span class="line"><span… | |
1242 </span></span></span><span class="line"><span… | |
1243 </span></span><span class="line"><span class="cl"&g… | |
1244 </span></span></span><span class="line"><span… | |
1245 </span></span></span><span class="line"><span… | |
1246 </span></span></span><span class="line"><span… | |
1247 </span></span></span><span class="line"><span… | |
1248 </span></span></span></code></pre><p>… | |
1249 elements, but Go actually <a href="https://victoriametrics.com/blog/g… | |
1250 instance</a>:</p> | |
1251 <blockquote> | |
1252 <p>But here’s the deal, while the hash function used for maps in… | |
1253 consistent across all maps with <strong>the same key type</stro… | |
1254 that hash function is different for each map instance. So, when you crea… | |
1255 new map, Go generates a random seed just for that map.</p> | |
1256 </blockquote> | |
1257 <p>While I understand the reason for this (i.e.: to avoid develope… | |
1258 specific iteration order), I still find it weird, and I think this is so… | |
1259 unique for Go. This decision means that even if you don't care about a s… | |
1260 order, you will still need to sort the map before doing something else i… | |
1261 want reproducibility, something that I care a lot.</p> | |
1262 <p>The fix for this? Go could offer an ordered map implementation … | |
1263 standard library. An ordered map ensure that the iteration order of the … | |
1264 the same as the insertion order (that is, by the way, a powerful propert… | |
1265 allow maps to be used in other contexts, not just my pet peeve above).&l… | |
1266 <p>Python actually does this for any dictionaries since <a href… | |
1267 3.6</a>, but it offered an | |
1268 <a href="https://docs.python.org/3/library/collections.html#collectio… | |
1269 before it (and <code>OrderedDict</code> still has some metho… | |
1270 that maybe useful in specific cases).</p> | |
1271 <p>Before generics it would be impossible to have a type-safe API … | |
1272 structure without introducing a new data type in the language (like <… | |
1273 but now Go has generics so it is not an issue anymore. The other issue i… | |
1274 you would be forced to iterate manually in this new data structure, but … | |
1275 to the new <a href="https://tip.golang.org/doc/go1.23#language">&l… | |
1276 Go 1.23, it means we can iterate in an ordered map as a library almost e… | |
1277 like we can do as a <code>map</code>:</p> | |
1278 <pre class="chroma"><code><span class="line"><span … | |
1279 </span></span><span class="line"><span class="cl"&g… | |
1280 </span></span><span class="line"><span class="cl"&g… | |
1281 </span></span><span class="line"><span class="cl"&g… | |
1282 </span></span><span class="line"><span class="cl"&g… | |
1283 </span></span><span class="line"><span class="cl"&g… | |
1284 </span></span><span class="line"><span class="cl"&g… | |
1285 </span></span><span class="line"><span class="cl"&g… | |
1286 </span></span><span class="line"><span class="cl"&g… | |
1287 </span></span><span class="line"><span class="cl"&g… | |
1288 </span></span></span><span class="line"><span… | |
1289 </span></span><span class="line"><span class="cl"&g… | |
1290 </span></span></code></pre><p>Now, of cour… | |
1291 with third party implementations, e.g.: I am using this | |
1292 <a href="https://github.com/elliotchance/orderedmap">one</a>… | |
1293 being in standard library reduces the friction: if there was some | |
1294 implementation in standard library, I would generally prefer it unless I… | |
1295 some specific needs. However when the standard library doesn't offer wha… | |
1296 need, I need to find it myself a suitable library, and this ends up taki… | |
1297 since generally there are lots of alternatives.</p> | |
1298 <h2>Keyword and default arguments for functions</h2> | |
1299 <p>Something that comes straight from Python that I miss sometimes… | |
1300 you can do things like this when declaring a function:</p> | |
1301 <pre class="chroma"><code><span class="line"><span … | |
1302 </span></span><span class="line"><span class="cl"&g… | |
1303 </span></span><span class="line"><span class="cl"&g… | |
1304 </span></span><span class="line"><span class="cl"&g… | |
1305 </span></span><span class="line"><span class="cl"&g… | |
1306 </span></span><span class="line"><span class="cl"&g… | |
1307 </span></span></code></pre><pre class="chroma… | |
1308 </span></span><span class="line"><span class="cl"&g… | |
1309 </span></span></span><span class="line"><span… | |
1310 </span></span></span><span class="line"><span… | |
1311 </span></span></span></code></pre><p>… | |
1312 for Go standard library, for example, <code>string.Replace</cod… | |
1313 <blockquote> | |
1314 <p><code>func Replace(s, old, new string, n int) string</… | |
1315 <p>Replace returns a copy of the string s with the first n non-ove… | |
1316 instances of old replaced by new. If old is empty, it matches at the | |
1317 beginning of the string and after each UTF-8 sequence, yielding up to k+1 | |
1318 replacements for a k-rune string. If n &lt; 0, there is no limit on … | |
1319 of replacements.</p> | |
1320 </blockquote> | |
1321 <p>If Go had default arguments, <code>Replace</code> c… | |
1322 <code>strings.ReplaceAll</code> (since this is basically wha… | |
1323 <code>strings.Replace(s, old, new, -1)</code>).</p> | |
1324 <h2>Nullability (or nillability)</h2> | |
1325 <p>I talked I little about this in <a href="https://kokada.dev/… | |
1326 Go</a>, but I want to | |
1327 expand here.</p> | |
1328 <p>First, I don't think the language needs to support the generic … | |
1329 nullability, that would be either having proper Union or Sum types. Kotl… | |
1330 AFAIK doesn't support neither, but my 2 years experience with Kotlin sho… | |
1331 that just having nullable types already helped a lot in ensuring type sa… | |
1332 <p>Second, I do feel that Go has less issues with <code>nil&… | |
1333 because its decision of using zero values instead of <code>nil<… | |
1334 for example, a string can never be <code>nil</code>, however… | |
1335 means that this is fine:</p> | |
1336 <pre class="chroma"><code><span class="line"><span … | |
1337 </span></span><span class="line"><span class="cl"&g… | |
1338 </span></span></span><span class="line"><span… | |
1339 </span></span></code></pre><p>However:<… | |
1340 <pre class="chroma"><code><span class="line"><span … | |
1341 </span></span><span class="line"><span class="cl"&g… | |
1342 </span></span></span><span class="line"><span… | |
1343 </span></span></code></pre><p>Still, I get… | |
1344 languages that offer nullables (heck, even Python with | |
1345 <a href="https://www.mypy-lang.org/"><code>mypy</code>… | |
1346 <p>Sadly this is the change in this post that is more likely to ne… | |
1347 new revision of the language. | |
1348 <a href="https://github.com/golang/go/issues/49202">nillability<… | |
1349 but it is really unlikely it can be done without breaking backwards | |
1350 compatibility.</p> | |
1351 <p>It could be done the Java way by adding a <code>nullable&… | |
1352 library (<a href="https://jcp.org/en/jsr/detail?id=305">JSR305<… | |
1353 <a href="https://stackoverflow.com/questions/2289694/what-is-the-stat… | |
1354 dead</a> | |
1355 by many shows how difficult it is to do something like this without a ma… | |
1356 change in the language. Dart is the only language that I know that <a… | |
1357 successfully</a>, but | |
1358 definitely it was not without its pains. And the fact that most people t… | |
1359 program in Dart probably does because of Flutter (that eventually requir… | |
1360 newer versions with null-safety) is not a good sign.</p> | |
1361 <h2>Lambdas</h2> | |
1362 <p><em>Added in 2024-08-18</em></p> | |
1363 <p>Go is a surprising good language for some functional code, than… | |
1364 first class functions and closures. Sadly the syntax doesn't help, since… | |
1365 only way you can use anonymous functions in Go is using <code>func… | |
1366 the types are complex, this can result in some convoluted code. Take the | |
1367 example from the <a href="https://go.dev/wiki/RangefuncExperiment">… | |
1368 experiment</a>:</p> | |
1369 <pre class="chroma"><code><span class="line"><span … | |
1370 </span></span><span class="line"><span class="cl"&g… | |
1371 </span></span><span class="line"><span class="cl"&g… | |
1372 </span></span><span class="line"><span class="cl"&g… | |
1373 </span></span><span class="line"><span class="cl"&g… | |
1374 </span></span><span class="line"><span class="cl"&g… | |
1375 </span></span><span class="line"><span class="cl"&g… | |
1376 </span></span><span class="line"><span class="cl"&g… | |
1377 </span></span><span class="line"><span class="cl"&g… | |
1378 </span></span><span class="line"><span class="cl"&g… | |
1379 </span></span><span class="line"><span class="cl"&g… | |
1380 </span></span></code></pre><p>If Go had a … | |
1381 could be simplified a lot:</p> | |
1382 <pre class="chroma"><code><span class="line"><span … | |
1383 </span></span><span class="line"><span class="cl"&g… | |
1384 </span></span><span class="line"><span class="cl"&g… | |
1385 </span></span><span class="line"><span class="cl"&g… | |
1386 </span></span><span class="line"><span class="cl"&g… | |
1387 </span></span><span class="line"><span class="cl"&g… | |
1388 </span></span><span class="line"><span class="cl"&g… | |
1389 </span></span><span class="line"><span class="cl"&g… | |
1390 </span></span><span class="line"><span class="cl"&g… | |
1391 </span></span><span class="line"><span class="cl"&g… | |
1392 </span></span><span class="line"><span class="cl"&g… | |
1393 </span></span></code></pre><p>Or even some… | |
1394 the types to be elided in an unnamed function:</p> | |
1395 <pre class="chroma"><code><span class="line"><span … | |
1396 </span></span><span class="line"><span class="cl"&g… | |
1397 </span></span><span class="line"><span class="cl"&g… | |
1398 </span></span><span class="line"><span class="cl"&g… | |
1399 </span></span><span class="line"><span class="cl"&g… | |
1400 </span></span><span class="line"><span class="cl"&g… | |
1401 </span></span><span class="line"><span class="cl"&g… | |
1402 </span></span><span class="line"><span class="cl"&g… | |
1403 </span></span><span class="line"><span class="cl"&g… | |
1404 </span></span><span class="line"><span class="cl"&g… | |
1405 </span></span><span class="line"><span class="cl"&g… | |
1406 </span></span></code></pre><p>This feature… | |
1407 future version of the language, since they didn't close the | |
1408 <a href="https://github.com/golang/go/issues/21498">issue</a>… | |
1409 about the possibility of this feature is still ongoing.</p> | |
1410 <h2>Error on unused return values</h2> | |
1411 <p><em>Added in 2024-09-12</em></p> | |
1412 <p>In a <a href="https://kokada.dev/blog/my-coding-experience-w… | |
1413 LLMs</a>, I talked about | |
1414 this function that I asked ChatGPT to generate to create a socket that a… | |
1415 a <a href="https://pkg.go.dev/context">context</a>:</p> | |
1416 <pre class="chroma"><code><span class="line"><span … | |
1417 </span></span><span class="line"><span class="cl"&g… | |
1418 </span></span><span class="line"><span class="cl"&g… | |
1419 </span></span><span class="line"><span class="cl"&g… | |
1420 </span></span><span class="line"><span class="cl"&g… | |
1421 </span></span><span class="line"><span class="cl"&g… | |
1422 </span></span></span><span class="line"><span… | |
1423 </span></span><span class="line"><span class="cl"&g… | |
1424 </span></span><span class="line"><span class="cl"&g… | |
1425 </span></span><span class="line"><span class="cl"&g… | |
1426 </span></span><span class="line"><span class="cl"&g… | |
1427 </span></span><span class="line"><span class="cl"&g… | |
1428 </span></span><span class="line"><span class="cl"&g… | |
1429 </span></span></span><span class="line"><span… | |
1430 </span></span></span><span class="line"><span… | |
1431 </span></span><span class="line"><span class="cl"&g… | |
1432 </span></span></span><span class="line"><span… | |
1433 </span></span><span class="line"><span class="cl"&g… | |
1434 </span></span></span><span class="line"><span… | |
1435 </span></span><span class="line"><span class="cl"&g… | |
1436 </span></span><span class="line"><span class="cl"&g… | |
1437 </span></span></code></pre><p>However whil… | |
1438 post</a> about &quot;The Error | |
1439 Model&quot;, I realised that this function is lacking error check du… | |
1440 <code>conn.SetReadDeadline()</code> calls:</p> | |
1441 <pre class="chroma"><code><span class="line"><span … | |
1442 </span></span><span class="line"><span class="cl"&g… | |
1443 </span></span><span class="line"><span class="cl"&g… | |
1444 </span></span><span class="line"><span class="cl"&g… | |
1445 </span></span></span><span class="line"><span… | |
1446 </span></span><span class="line"><span class="cl"&g… | |
1447 </span></span><span class="line"><span class="cl"&g… | |
1448 </span></span><span class="line"><span class="cl"&g… | |
1449 </span></span><span class="line"><span class="cl"&g… | |
1450 </span></span><span class="line"><span class="cl"&g… | |
1451 </span></span><span class="line"><span class="cl"&g… | |
1452 </span></span><span class="line"><span class="cl"&g… | |
1453 </span></span><span class="line"><span class="cl"&g… | |
1454 </span></span><span class="line"><span class="cl"&g… | |
1455 </span></span></span><span class="line"><span… | |
1456 </span></span><span class="line"><span class="cl"&g… | |
1457 </span></span><span class="line"><span class="cl"&g… | |
1458 </span></span><span class="line"><span class="cl"&g… | |
1459 </span></span><span class="line"><span class="cl"&g… | |
1460 </span></span></span><span class="line"><span… | |
1461 </span></span><span class="line"><span class="cl"&g… | |
1462 </span></span><span class="line"><span class="cl"&g… | |
1463 </span></span><span class="line"><span class="cl"&g… | |
1464 </span></span><span class="line"><span class="cl"&g… | |
1465 </span></span><span class="line"><span class="cl"&g… | |
1466 </span></span></span><span class="line"><span… | |
1467 </span></span><span class="line"><span class="cl"&g… | |
1468 </span></span><span class="line"><span class="cl"&g… | |
1469 </span></span><span class="line"><span class="cl"&g… | |
1470 </span></span></code></pre><p>I could blam… | |
1471 happening even in a Pull Request done by an actual human.</p> | |
1472 <p>Ignoring errors is bad, especially because once the error is ig… | |
1473 gone, forever. You may have strange issues in the code that are impossib… | |
1474 debug because you can't know about something that doesn't exist. This is… | |
1475 the reasons I think exceptions are better, since this is the kind of err… | |
1476 would be impossible to ignore if the language had exceptions, and the ex… | |
1477 would eventually propagate in your stack until it is captured or you get… | |
1478 crash (with a stack trace to debug the issue).</p> | |
1479 <p>Now, I don't think this is a fault of using error as values ins… | |
1480 exceptions. Go has the tools to encapsulate the errors and propagate them | |
1481 properly, like it is shown in the fixed code. But the fact that someone … | |
1482 this mistake without any warning or error from the compiler is bad.</… | |
1483 <p>If Go had a warning or error for unused return values, this wou… | |
1484 <pre class="chroma"><code><span class="line"><span … | |
1485 </span></span><span class="line"><span class="cl"&g… | |
1486 </span></span></span><span class="line"><span… | |
1487 </span></span><span class="line"><span class="cl"&g… | |
1488 </span></span></code></pre><p>Now in this … | |
1489 a good reason. I can ask during a Pull Request why the committer is igno… | |
1490 it is lacking appropriate context, and maybe even ask for some comments … | |
1491 added why this would be safe. What can't happen is this being ignored by | |
1492 mistake.</p> | |
1493 <p>I am not completely sure if I want this only for errors or for … | |
1494 though. There are lots of cases where ignoring non-error values is ok, b… | |
1495 also don't see the issue of having something like:</p> | |
1496 <pre class="chroma"><code><span class="line"><span … | |
1497 </span></span><span class="line"><span class="cl"&g… | |
1498 </span></span></span><span class="line"><span… | |
1499 </span></span><span class="line"><span class="cl"&g… | |
1500 </span></span></code></pre><p>If anything,… | |
1501 only calling this function only for its side-effects.</p> | |
1502 <p>By the way, yes, <a href="https://github.com/kisielk/errchec… | |
1503 but if the language itself doesn't enforce this it means that there are … | |
1504 libraries that are probably mistakenly ignoring errors. And if the libra… | |
1505 ignoring errors by mistake, you can't do much when you actually have the… | |
1506 <a href="https://github.com/NixOS/nixpkgs/blob/bb16119a4a7639ebbc91ad… | |
1507 option does not receive a derivation like most other packages, but inste… | |
1508 receives a function and returns an attribute set with all packages. Here… | |
1509 documentation:</p> | |
1510 <blockquote> | |
1511 <p>This option allows you to override the Linux kernel used by Nix… | |
1512 things like external kernel module packages are tied to the kernel you�… | |
1513 using, it also overrides those. This option is a function that takes Nix… | |
1514 as an argument (as a convenience), and returns an attribute set containi… | |
1515 the very least an attribute kernel. Additional attributes may be needed | |
1516 depending on your configuration. For instance, if you use the NVIDIA X | |
1517 driver, then it also needs to contain an attribute <code>nvidia_x1… | |
1518 </blockquote> | |
1519 <p>The kernel package itself is referenced by the | |
1520 <a href="https://github.com/NixOS/nixpkgs/blob/bb16119a4a7639ebbc91ad… | |
1521 derivation inside this attribute set:</p> | |
1522 <pre class="chroma"><code><span class="line"><span … | |
1523 </span></span></span><span class="line"><span… | |
1524 </span></span></span></code></pre><p>… | |
1525 with the same kernel version you are booting.</p> | |
1526 <p>However one less obvious consequence about this is that if you … | |
1527 that come from <code>linuxPackages</code>, say for example | |
1528 <a href="https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/os… | |
1529 or | |
1530 <a href="https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/os… | |
1531 it is better to do:</p> | |
1532 <pre class="chroma"><code><span class="line"><span … | |
1533 </span></span><span class="line"><span class="cl"&g… | |
1534 </span></span><span class="line"><span class="cl"&g… | |
1535 </span></span><span class="line"><span class="cl"&g… | |
1536 </span></span><span class="line"><span class="cl"&g… | |
1537 </span></span><span class="line"><span class="cl"&g… | |
1538 </span></span><span class="line"><span class="cl"&g… | |
1539 </span></span></code></pre><p>Instead of:&… | |
1540 <pre class="chroma"><code><span class="line"><span … | |
1541 </span></span><span class="line"><span class="cl"&g… | |
1542 </span></span><span class="line"><span class="cl"&g… | |
1543 </span></span><span class="line"><span class="cl"&g… | |
1544 </span></span><span class="line"><span class="cl"&g… | |
1545 </span></span><span class="line"><span class="cl"&g… | |
1546 </span></span><span class="line"><span class="cl"&g… | |
1547 </span></span></code></pre><p>Now, I used … | |
1548 those packages depends in a specific kernel version for a reason, so get… | |
1549 them from <code>config.boot.kernelPackages</code> reduces th… | |
1550 compatibility issue in the future.</p></description><pubDate>Thu, … | |
1551 of the workflow in this blog is <a href="https://kokada.dev/blog/quic… | |
1552 Go</a>. I | |
1553 basically write Markdown files with some special rules inside the | |
1554 <a href="https://github.com/thiagokokada/blog">repository</a>… | |
1555 seconds, the CI (currently <a href="https://github.com/thiagokokada/b… | |
1556 Actions</a>) | |
1557 will take the latest commit, generate some files (since I use the <a … | |
1558 itself</a> as a | |
1559 backup blog) and publish to the <a href="https://kokada.capivaras.dev… | |
1560 website</a>.</p> | |
1561 <p>Now, considering how much about <a href="https://nixos.org/"… | |
1562 it should be a surprise that the workflow above has <strong>zero&l… | |
1563 it. I am not saying this blog will never have it, but I am only going to… | |
1564 this is necessary, for example if I start using a tool to build this blo… | |
1565 I generally don't expect it to be installed by the machine I am currently | |
1566 using. Go is an exception of this rule since it is relatively straightfo… | |
1567 install (just download the <a href="https://go.dev/doc/install">bi… | |
1568 its <a href="https://go.dev/doc/go1compat">stability guarantee<… | |
1569 breakage. But most other things I consider moving targets, and I wouldn'… | |
1570 comfortable to use unless I have Nix to ensure reproducibility.</p> | |
1571 <p>This is why the other tool that this blog (ab)uses during its w… | |
1572 <a href="https://en.wikipedia.org/wiki/Make_(software)"><code&g… | |
1573 build automation tool that exist. It is basically available in any *nix … | |
1574 confuse with <a href="https://nixos.org/">Nix</a>) system, f… | |
1575 macOS, by default. So it is the tool I choose to automatise some tasks i… | |
1576 blog, even if I consider writing a <code>Makefile</code> (th… | |
1577 that <code>Make</code> uses) kind of a lost, dark art.</p… | |
1578 <p>To be clear, the idea of this post is not to be a <code>M… | |
1579 explain some basic concepts, but if you want an actual tutorial a good o… | |
1580 be found <a href="https://makefiletutorial.com/">here</a>. A… | |
1581 thanks to the reasons above, you can use many other tools for a similar | |
1582 objective, like <a href="https://github.com/casey/just">Justfiles&… | |
1583 <a href="https://taskfile.dev/">Taskfiles</a> (sadly it uses | |
1584 <a href="https://kokada.dev/blog/generating-yaml-files-with-nix">Y… | |
1585 small script written in any language you want. The reason that I am writ… | |
1586 this post is why you should do it, not how.</p> | |
1587 <p>A quick recap on how this blog works: inside the | |
1588 <a href="https://github.com/thiagokokada/blog">repository</a>… | |
1589 Markdown post following the directory structure below | |
1590 (<a href="https://github.com/thiagokokada/blog/tree/894a388c61ca3a38d… | |
1591 for the current version of this blog):</p> | |
1592 <pre class="chroma"><code><span class="line"><span … | |
1593 </span></span></span><span class="line"><span… | |
1594 </span></span></span><span class="line"><span… | |
1595 </span></span></span><span class="line"><span… | |
1596 </span></span></span><span class="line"><span… | |
1597 </span></span></span><span class="line"><span… | |
1598 </span></span></span><span class="line"><span… | |
1599 </span></span></span><span class="line"><span… | |
1600 </span></span></span><span class="line"><span… | |
1601 </span></span></span><span class="line"><span… | |
1602 </span></span></span><span class="line"><span… | |
1603 </span></span></span><span class="line"><span… | |
1604 </span></span></span><span class="line"><span… | |
1605 </span></span></span><span class="line"><span… | |
1606 </span></span></span><span class="line"><span… | |
1607 </span></span></span><span class="line"><span… | |
1608 </span></span></span><span class="line"><span… | |
1609 </span></span></span><span class="line"><span… | |
1610 </span></span></span><span class="line"><span… | |
1611 </span></span></span><span class="line"><span… | |
1612 </span></span></span><span class="line"><span… | |
1613 </span></span></span><span class="line"><span… | |
1614 </span></span></span><span class="line"><span… | |
1615 </span></span></span><span class="line"><span… | |
1616 </span></span></span><span class="line"><span… | |
1617 </span></span></span><span class="line"><span… | |
1618 </span></span></span></code></pre><p>… | |
1619 <code>YYYY-MM-DD/XX-title-slug.md</code> format. It <stro… | |
1620 that will be automatically extract to be used as the post title, but oth… | |
1621 there is no other formatting rules. It is a highly optionated structure,… | |
1622 the nice thing about being optionated is that we can extract lots of | |
1623 information just from how the files are organised in the filesystem.<… | |
1624 <p>Most of the magic that converts those Markdown files to actual … | |
1625 in the Go files that you can see above: <code>blog.go</code>… | |
1626 in the repository and extracts the necessary information, <code>ma… | |
1627 responsible for the <a href="https://capivaras.dev/">capivaras.dev… | |
1628 uses <a href="https://mataroa.blog/">Mataroa</a> platform), … | |
1629 responsible to do some transformations in the Markdown files before post… | |
1630 <p>While I could manage everything by just using <code>go<… | |
1631 commands, to make it easier to manager everything I have the following | |
1632 <a href="https://github.com/thiagokokada/blog/blob/527466a2a7c8baae53… | |
1633 <pre class="chroma"><code><span class="line"><span … | |
1634 </span></span><span class="line"><span class="cl"&g… | |
1635 </span></span><span class="line"><span class="cl"&g… | |
1636 </span></span><span class="line"><span class="cl"&g… | |
1637 </span></span><span class="line"><span class="cl"&g… | |
1638 </span></span><span class="line"><span class="cl"&g… | |
1639 </span></span><span class="line"><span class="cl"&g… | |
1640 </span></span><span class="line"><span class="cl"&g… | |
1641 </span></span><span class="line"><span class="cl"&g… | |
1642 </span></span><span class="line"><span class="cl"&g… | |
1643 </span></span><span class="line"><span class="cl"&g… | |
1644 </span></span><span class="line"><span class="cl"&g… | |
1645 </span></span><span class="line"><span class="cl"&g… | |
1646 </span></span><span class="line"><span class="cl"&g… | |
1647 </span></span><span class="line"><span class="cl"&g… | |
1648 </span></span><span class="line"><span class="cl"&g… | |
1649 </span></span><span class="line"><span class="cl"&g… | |
1650 </span></span><span class="line"><span class="cl"&g… | |
1651 </span></span><span class="line"><span class="cl"&g… | |
1652 </span></span><span class="line"><span class="cl"&g… | |
1653 </span></span><span class="line"><span class="cl"&g… | |
1654 </span></span><span class="line"><span class="cl"&g… | |
1655 </span></span><span class="line"><span class="cl"&g… | |
1656 </span></span><span class="line"><span class="cl"&g… | |
1657 </span></span><span class="line"><span class="cl"&g… | |
1658 </span></span><span class="line"><span class="cl"&g… | |
1659 </span></span><span class="line"><span class="cl"&g… | |
1660 </span></span><span class="line"><span class="cl"&g… | |
1661 </span></span><span class="line"><span class="cl"&g… | |
1662 </span></span><span class="line"><span class="cl"&g… | |
1663 </span></span><span class="line"><span class="cl"&g… | |
1664 </span></span><span class="line"><span class="cl"&g… | |
1665 </span></span><span class="line"><span class="cl"&g… | |
1666 </span></span><span class="line"><span class="cl"&g… | |
1667 </span></span><span class="line"><span class="cl"&g… | |
1668 </span></span><span class="line"><span class="cl"&g… | |
1669 </span></span><span class="line"><span class="cl"&g… | |
1670 </span></span><span class="line"><span class="cl"&g… | |
1671 </span></span><span class="line"><span class="cl"&g… | |
1672 </span></span><span class="line"><span class="cl"&g… | |
1673 </span></span><span class="line"><span class="cl"&g… | |
1674 </span></span></code></pre><p>For those un… | |
1675 <a href="https://en.wikipedia.org/wiki/Make_(software)#Makefile">W… | |
1676 <blockquote> | |
1677 <p>Each rule begins with a <em>dependency line</em> wh… | |
1678 name followed by a colon (:) and optionally a list of targets on which t… | |
1679 rule's target depends, its prerequisites.</p> | |
1680 </blockquote> | |
1681 <p>So if we look for example at the <code>blog</code> … | |
1682 <code>.go</code> files and Go module files like <code>… | |
1683 <code>blog</code> binary by running:</p> | |
1684 <pre class="chroma"><code><span class="line"><span … | |
1685 </span></span><span class="line"><span class="cl"&g… | |
1686 </span></span></span></code></pre><p>… | |
1687 has a newer timestamp than the target file, and only trigger the build a… | |
1688 there are changes, for example:</p> | |
1689 <pre class="chroma"><code><span class="line"><span … | |
1690 </span></span><span class="line"><span class="cl"&g… | |
1691 </span></span></span><span class="line"><span… | |
1692 </span></span></span><span class="line"><span… | |
1693 </span></span><span class="line"><span class="cl"&g… | |
1694 </span></span></span><span class="line"><span… | |
1695 </span></span><span class="line"><span class="cl"&g… | |
1696 </span></span></span></code></pre><p>… | |
1697 target as <code>.PHONY</code>, that basically instructs <… | |
1698 target. One classic example is <code>clean</code> target, th… | |
1699 <pre class="chroma"><code><span class="line"><span … | |
1700 </span></span><span class="line"><span class="cl"&g… | |
1701 </span></span></span><span class="line"><span… | |
1702 </span></span></span><span class="line"><span… | |
1703 </span></span><span class="line"><span class="cl"&g… | |
1704 </span></span></span></code></pre><p>… | |
1705 dependencies incorrectly, especially in languages that has fast build ti… | |
1706 like e.g.: Go. The worst thing that can happen is something not being re… | |
1707 when it needs to. So my recomendation if you are writing your first <… | |
1708 is to just declare everything as <code>.PHONY</code>. You ca… | |
1709 <p>One last basic concept that I want to explain about <code>… | |
1710 target: it is the target that is run if you just run <code>make<… | |
1711 inside the directory that contains a <code>Makefile</code>. … | |
1712 generally the first target in the <code>Makefile</code>. It … | |
1713 target (that is also marked as <code>.PHONY</code>) that has… | |
1714 targets that you want to build by default. In this particular case I dec… | |
1715 the <code>README.md</code> and <code>rss.xml</code&… | |
1716 depends in <code>blog</code> binary being build. So once I r… | |
1717 <pre class="chroma"><code><span class="line"><span … | |
1718 </span></span><span class="line"><span class="cl"&g… | |
1719 </span></span></span><span class="line"><span… | |
1720 </span></span></span><span class="line"><span… | |
1721 </span></span></span></code></pre><p>… | |
1722 <code>Makefile</code> or something similar in your projects:… | |
1723 the exactly steps that you need to get things working. If I see one proj… | |
1724 mine having a <code>Makefile</code>, I can be reasonably con… | |
1725 working by just running <code>make</code>.</p> | |
1726 <p>But now let's focus in the other targets that I have in the <… | |
1727 not related to the build process but are there to help me manage my blog… | |
1728 Remember the rules I explained above? Maybe not, but it should be no pro… | |
1729 because:</p> | |
1730 <pre><code>$ make post TITLE=&quot;My new blog post&… | |
1731 mkdir -p &quot;2024-08-13&quot; | |
1732 ./.scripts/gen-post.sh &quot;2024-08-13&quot; &quot;My new b… | |
1733 Creating file: 2024-08-13/02-my-new-blog-post.md | |
1734 <p>$ cat 2024-08-13/02-my-new-blog-post.md</p> | |
1735 <h1>My new blog post</h1> | |
1736 </code><p><code></code></p></pre><… | |
1737 <p>This command, <code>make post</code>, is responsibl… | |
1738 <ol> | |
1739 <li>Create a new directory for today, if it doesn't exist</li&g… | |
1740 <li>Run the | |
1741 <a href="https://github.com/thiagokokada/blog/blob/6a3b06970729f7650e… | |
1742 script, that: | |
1743 <ol> | |
1744 <li>Enumerates all posts from the day, so we can number the new po… | |
1745 <ul> | |
1746 <li>We already had this post planned for 2024-08-13, so the new po… | |
1747 </ul> | |
1748 </li> | |
1749 <li>Slugify the title, so we can create each Markdown file with th… | |
1750 filename</li> | |
1751 <li>Creates a new Markdown file with the title as a <code>h1… | |
1752 </ol> | |
1753 </li> | |
1754 </ol> | |
1755 <p>The steps above may or may not seen trivial, and for a while I … | |
1756 manually. But not having to think what is the current date or if I alrea… | |
1757 posted that day or what is the slug is for the title make (pun intended)… | |
1758 like much easier.</p> | |
1759 <p>Yes, the code is ugly. The way variables works in <code>M… | |
1760 declare then inside the <code>Makefile</code>, but they can … | |
1761 if you pass them. I used this to allow <code>make post</code>… | |
1762 posts:</p> | |
1763 <pre class="chroma"><code><span class="line"><span … | |
1764 </span></span><span class="line"><span class="cl"&g… | |
1765 </span></span></span><span class="line"><span… | |
1766 </span></span></span><span class="line"><span… | |
1767 </span></span></span></code></pre><p>… | |
1768 instead of default (that would be the current day), and <code>_PAR… | |
1769 day we use to actually create the directory. We can actually pass any da… | |
1770 format recognised by | |
1771 <a href="https://www.gnu.org/software/coreutils/manual/html_node/Exam… | |
1772 not just <code>YYYY-MM-DD</code>.</p> | |
1773 <p>I have 2 other phony targets that I want to talk, <code>d… | |
1774 expect a <code>FILE</code> to be passed, and I use them to e… | |
1775 <pre class="chroma"><code><span class="line"><span … | |
1776 </span></span><span class="line"><span class="cl"&g… | |
1777 </span></span></span><span class="line"><span… | |
1778 </span></span></span><span class="line"><span… | |
1779 </span></span><span class="line"><span class="cl"&g… | |
1780 </span></span></span></code></pre><p>… | |
1781 ignored</a> | |
1782 during my directory parser to mean they're a draft post and not ready to… | |
1783 published. And the reason I created those targets is because I was tired… | |
1784 trying to hide or unhide a file manually.</p> | |
1785 <p>So that's it, for the same reason you <a href="https://kokad… | |
1786 everything</a>, | |
1787 you also need to have some way to automate your tasks. <code>Makef… | |
1788 do it, maybe not the best way to do it, but it works and it is available | |
1789 anywhere.</p></description><pubDate>Tue, 13 Aug 2024 00:00:00 +000… | |
1790 post</a> talking why | |
1791 my favorite device is a Chromebook. In this post I want to talk about wh… | |
1792 makes me this device unhappy, and comment about things that if changed w… | |
1793 make it a much better device.</p> | |
1794 <p>But before talking about the negative aspects, let me talk abou… | |
1795 aspect that I just briefly talked in the previous post: the screen. It i… | |
1796 HiDPI screen (2000x1200 resolution in 10.95''), that is unexpected brigh… | |
1797 nits according to the | |
1798 <a href="https://www.lenovo.com/us/en/p/laptops/lenovo/lenovo-edu-chr… | |
1799 It is difficult to find laptops at the same price with a screen that goo… | |
1800 10.95'' in its default resolution I find it too small (like 1250x750), b… | |
1801 find the font size acceptable at 115% scale (1087x652). Yes, it result i… | |
1802 small workspace, but this is not a big issue for what I do in this devic… | |
1803 is also only 60Hz, but I thought I would miss high refresh rate more tha… | |
1804 actually miss in this device.</p> | |
1805 <p>Update: I forgot to say one thing about the screen: it scratche… | |
1806 got my screen scratched after the first day of usage, and considering th… | |
1807 I don't think the screen has a hardened glass. I bought a cheap glass sc… | |
1808 protector and this did the trick though, even hiding the previous scratc… | |
1809 I have zero issues with the screen now.</p> | |
1810 <p>Now the first aspect that I don't like: the speakers. They soun… | |
1811 at maximum volume it is not really loud. The speakers is the only reason… | |
1812 still keep my <a href="https://www.gsmarena.com/xiaomi_pad_5-11042.ph… | |
1813 because I like to watch animes/videos before sleep and having good speak… | |
1814 a must.</p> | |
1815 <p>The keyboard has that issue that I mentioned in the previous po… | |
1816 the key get stuck, and I get duplicated characters. But it also has some… | |
1817 issues that I didn't talked about: the first one is the UK layout that h… | |
1818 extra keys that I have no use for, but this also makes the keys that I u… | |
1819 smaller. Very much a &quot;me&quot; problem, since if I had got … | |
1820 have those issues, but an issue nonetheless that gets worse considering … | |
1821 small the keyboard is. I am actually suprised how fast I can type consid… | |
1822 how many issues this keyboard has, so maybe this is a testament that this | |
1823 keyboard is not actually that bad.</p> | |
1824 <p>The other keyboard issue is a problem that affects all Chromebo… | |
1825 layout. Google replaced a few keys like Fn keys with shortcuts and repla… | |
1826 Caps Lock with a | |
1827 <a href="https://chromeunboxed.com/chromebook-launcher-now-everything… | |
1828 key (that is similar to the Windows Key), while removing Windows Key fro… | |
1829 place. I actually have less issue with this than I initially though: I d… | |
1830 care too much about Fn keys (except when using IntelliJ, but that is som… | |
1831 that I only use at <code>$CURRENT_JOB</code>), and ChromeOS … | |
1832 its customisation, allowing you to swap key functionality. I remap Every… | |
1833 key with Esc, and Esc for the Everything key, and I can get productive i… | |
1834 <code>neovim</code> setup.</p> | |
1835 <p>And finally, let me talk more about the performance: yes, it is… | |
1836 bearable once you get used to. The issue is both the CPU and IO. While t… | |
1837 a <a href="https://www.qualcomm.com/products/mobile/snapdragon/laptop… | |
1838 2</a> | |
1839 is octa-core, it has only 2 high performance CPU cores vs 6 low performa… | |
1840 ones (2xARM Cortex A76 vs 6xARM Cortex A55). If it was something like 4x… | |
1841 would be much better. The fact that the cores are old doesn't help eithe… | |
1842 <p>But the worst part is the IO. Not only it uses a eMMC module, i… | |
1843 <p><a href="https://github.com/thiagokokada/blog/raw/main/posts… | |
1844 <p>I don't know how much more expensive it would be to put a | |
1845 <a href="https://en.wikipedia.org/wiki/Universal_Flash_Storage">UF… | |
1846 this device, but this is probably the choice that would most increase | |
1847 performance in this device, especially considering how aggressive Chrome… | |
1848 use (z)swap.</p> | |
1849 <p>Update 2: I forgot to talk about the fact that the exterior of … | |
1850 covered in cloth. I thought I would hate this at first, but nowadays I k… | |
1851 like it. And it is also nice that it will never get scratched, I don't c… | |
1852 much about the exterior of this device and it is the only device that I … | |
1853 home that doesn't have additional protection (except the screen protector | |
1854 mentioned above).</p></description><pubDate>Mon, 12 Aug 2024 00:00… | |
1855 if I could have the surgery I discovered that I was suffering from dry e… | |
1856 Thanks to this, my ophthalmologist recommended that every 20 minutes whi… | |
1857 using screens, I look somewhere 20 feet away for 20 seconds, a technique… | |
1858 as <a href="https://www.healthline.com/health/eye-health/20-20-20-rul… | |
1859 <p>I had issues following this rule because I never remembered to … | |
1860 initially tried to setup an alarm, but this became annoying, so I decide… | |
1861 try to find a program. I found | |
1862 <a href="https://tonyh4156.github.io/20-20-20.github.io/">this<… | |
1863 worked fine, but it bothered me that it was compiled for x86_64 while I … | |
1864 using a M1 MacBook Pro at the time, and also I needed something that wor… | |
1865 Linux.</p> | |
1866 <p>Since I never found a good multi-platform alternative, I decide… | |
1867 own. This became | |
1868 <a href="https://github.com/thiagokokada/twenty-twenty-twenty/">tw… | |
1869 the first <a href="https://kokada.dev/blog/go-a-reasonable-good-langu… | |
1870 that I ever wrote. I wrote it in Go because I wanted to learn the langua… | |
1871 also because Go made it easy to build static binaries. And the first ver… | |
1872 could build static binaries without issues because I was using | |
1873 <a href="https://github.com/gen2brain/beeep">beeep</a>, that… | |
1874 supported platforms. However, it also meant that the notifications in ma… | |
1875 looked ugly, since it used | |
1876 <a href="https://github.com/gen2brain/beeep/blob/master/beep_darwin.g… | |
1877 <p>I wanted better integration with macOS, so this meant switching… | |
1878 After searching for a while, the | |
1879 <a href="https://pkg.go.dev/gioui.org/x/notify">notify</a> l… | |
1880 <a href="https://gioui.org/">GioUI</a> is the one that seeme… | |
1881 implements notification in macOS using its native framework, so it works… | |
1882 better, but sadly it meant losing static binaries because it depends in … | |
1883 <p>Not a big loss initially, because I am only depending in Founda… | |
1884 macOS (that should always be available), and in Linux I could still stat… | |
1885 compile. However I eventually added more features like sound | |
1886 (via <a href="https://github.com/gopxl/beep">beep</a>) and t… | |
1887 <a href="https://github.com/fyne-io/systray">systray</a>), t… | |
1888 macOS and Linux.</p> | |
1889 <p>Losing static binaries in Linux is a much bigger deal, since Li… | |
1890 target. The general recommendation for building CGO binaries statically … | |
1891 using | |
1892 <a href="https://eli.thegreenplace.net/2024/building-static-binaries-… | |
1893 but this also means building all dependencies that we need using musl (e… | |
1894 <a href="https://github.com/ebitengine/oto?tab=readme-ov-file#linux"&… | |
1895 [beep/oto]). This generally means pain, but Nix makes it easy.</p> | |
1896 <p>Let's start by creating a <a href="https://github.com/thiago… | |
1897 file</a> | |
1898 that builds our Go module (simplified below for brevity):</p> | |
1899 <pre class="chroma"><code><span class="line"><span … | |
1900 </span></span><span class="line"><span class="cl"&g… | |
1901 </span></span><span class="line"><span class="cl"&g… | |
1902 </span></span><span class="line"><span class="cl"&g… | |
1903 </span></span><span class="line"><span class="cl"&g… | |
1904 </span></span><span class="line"><span class="cl"&g… | |
1905 </span></span><span class="line"><span class="cl"&g… | |
1906 </span></span><span class="line"><span class="cl"&g… | |
1907 </span></span><span class="line"><span class="cl"&g… | |
1908 </span></span><span class="line"><span class="cl"&g… | |
1909 </span></span><span class="line"><span class="cl"&g… | |
1910 </span></span><span class="line"><span class="cl"&g… | |
1911 </span></span><span class="line"><span class="cl"&g… | |
1912 </span></span><span class="line"><span class="cl"&g… | |
1913 </span></span><span class="line"><span class="cl"&g… | |
1914 </span></span><span class="line"><span class="cl"&g… | |
1915 </span></span><span class="line"><span class="cl"&g… | |
1916 </span></span><span class="line"><span class="cl"&g… | |
1917 </span></span><span class="line"><span class="cl"&g… | |
1918 </span></span><span class="line"><span class="cl"&g… | |
1919 </span></span><span class="line"><span class="cl"&g… | |
1920 </span></span><span class="line"><span class="cl"&g… | |
1921 </span></span><span class="line"><span class="cl"&g… | |
1922 </span></span><span class="line"><span class="cl"&g… | |
1923 </span></span><span class="line"><span class="cl"&g… | |
1924 </span></span><span class="line"><span class="cl"&g… | |
1925 </span></span><span class="line"><span class="cl"&g… | |
1926 </span></span><span class="line"><span class="cl"&g… | |
1927 </span></span><span class="line"><span class="cl"&g… | |
1928 </span></span><span class="line"><span class="cl"&g… | |
1929 </span></span><span class="line"><span class="cl"&g… | |
1930 </span></span><span class="line"><span class="cl"&g… | |
1931 </span></span><span class="line"><span class="cl"&g… | |
1932 </span></span><span class="line"><span class="cl"&g… | |
1933 </span></span></code></pre><p>And we can b… | |
1934 <pre class="chroma"><code><span class="line"><span … | |
1935 </span></span><span class="line"><span class="cl"&g… | |
1936 </span></span><span class="line"><span class="cl"&g… | |
1937 </span></span><span class="line"><span class="cl"&g… | |
1938 </span></span><span class="line"><span class="cl"&g… | |
1939 </span></span><span class="line"><span class="cl"&g… | |
1940 </span></span><span class="line"><span class="cl"&g… | |
1941 </span></span><span class="line"><span class="cl"&g… | |
1942 </span></span><span class="line"><span class="cl"&g… | |
1943 </span></span><span class="line"><span class="cl"&g… | |
1944 </span></span><span class="line"><span class="cl"&g… | |
1945 </span></span><span class="line"><span class="cl"&g… | |
1946 </span></span><span class="line"><span class="cl"&g… | |
1947 </span></span><span class="line"><span class="cl"&g… | |
1948 </span></span><span class="line"><span class="cl"&g… | |
1949 </span></span><span class="line"><span class="cl"&g… | |
1950 </span></span><span class="line"><span class="cl"&g… | |
1951 </span></span><span class="line"><span class="cl"&g… | |
1952 </span></span><span class="line"><span class="cl"&g… | |
1953 </span></span><span class="line"><span class="cl"&g… | |
1954 </span></span><span class="line"><span class="cl"&g… | |
1955 </span></span><span class="line"><span class="cl"&g… | |
1956 </span></span><span class="line"><span class="cl"&g… | |
1957 </span></span><span class="line"><span class="cl"&g… | |
1958 </span></span><span class="line"><span class="cl"&g… | |
1959 </span></span><span class="line"><span class="cl"&g… | |
1960 </span></span><span class="line"><span class="cl"&g… | |
1961 </span></span><span class="line"><span class="cl"&g… | |
1962 </span></span><span class="line"><span class="cl"&g… | |
1963 </span></span><span class="line"><span class="cl"&g… | |
1964 </span></span></code></pre><p>I think this… | |
1965 build and a static build the usage of <code>pkgs.pkgsStatic</co… | |
1966 automatically builds all packages statically with <code>musl</c… | |
1967 some <a href="https://honnef.co/articles/statically-compiled-go-progr… | |
1968 flags</a> | |
1969 to the Go compiler (i.e.: <code>-linkmode external -extldflags &am… | |
1970 is a requirement from Go.</p> | |
1971 <p>So, does it work? Let's test:</p> | |
1972 <pre class="chroma"><code><span class="line"><span … | |
1973 </span></span><span class="line"><span class="cl"&g… | |
1974 </span></span></span><span class="line"><span… | |
1975 </span></span><span class="line"><span class="cl"&g… | |
1976 </span></span></span><span class="line"><span… | |
1977 </span></span></span><span class="line"><span… | |
1978 </span></span><span class="line"><span class="cl"&g… | |
1979 </span></span></span><span class="line"><span… | |
1980 </span></span></span><span class="line"><span… | |
1981 </span></span></span><span class="line"><span… | |
1982 </span></span></span><span class="line"><span… | |
1983 </span></span></span><span class="line"><span… | |
1984 </span></span></span><span class="line"><span… | |
1985 </span></span></span></code></pre><p>… | |
1986 related because of my usage of PipeWire and the binary may work in a pur… | |
1987 system, but I don't have access to one. Maybe adding <code>pipewir… | |
1988 <code>buildInputs</code> would fix this issue, but I can't g… | |
1989 statically (because of its dependencies). I think this is a good show ho… | |
1990 it is to statically compilation is in Nix, but also how complex static b… | |
1991 are to get correctly.</p> | |
1992 <p>Bonus points for | |
1993 <a href="https://nix.dev/tutorials/cross-compilation.html">cross-c… | |
1994 easily cross-compile by using <code>pkgsCross</code>:</p&… | |
1995 <pre class="chroma"><code><span class="line"><span … | |
1996 </span></span><span class="line"><span class="cl"&g… | |
1997 </span></span><span class="line"><span class="cl"&g… | |
1998 </span></span><span class="line"><span class="cl"&g… | |
1999 </span></span><span class="line"><span class="cl"&g… | |
2000 </span></span><span class="line"><span class="cl"&g… | |
2001 </span></span><span class="line"><span class="cl"&g… | |
2002 </span></span><span class="line"><span class="cl"&g… | |
2003 </span></span><span class="line"><span class="cl"&g… | |
2004 </span></span><span class="line"><span class="cl"&g… | |
2005 </span></span><span class="line"><span class="cl"&g… | |
2006 </span></span><span class="line"><span class="cl"&g… | |
2007 </span></span><span class="line"><span class="cl"&g… | |
2008 </span></span><span class="line"><span class="cl"&g… | |
2009 </span></span><span class="line"><span class="cl"&g… | |
2010 </span></span><span class="line"><span class="cl"&g… | |
2011 </span></span></code></pre><p>The idea of … | |
2012 <code>aarch64-multiplatform</code>) and use it as any other … | |
2013 <code>pkgsStatic</code> to statically cross compile binaries… | |
2014 <pre class="chroma"><code><span class="line"><span … | |
2015 </span></span><span class="line"><span class="cl"&g… | |
2016 </span></span></span><span class="line"><span… | |
2017 </span></span><span class="line"><span class="cl"&g… | |
2018 </span></span></span></code></pre></descri… | |
2019 bits</a> post in this | |
2020 blog, I gave that title prefix without much thought: I knew it was suppo… | |
2021 be a quicker post than my previous one, but I never thought too deeply a… | |
2022 it. But after:</p> | |
2023 <pre class="chroma"><code><span class="line"><span … | |
2024 </span></span><span class="line"><span class="cl"&g… | |
2025 </span></span></span></code></pre><p>… | |
2026 quick bits really quick, or at least quicker? Let's see:</p> | |
2027 <pre><code>$ wc -w **/*.md | |
2028 1107 2024-07-26/01-writing-nixos-tests-for-fun-and-profit.md | |
2029 1220 2024-07-26/02-using-github-as-a-bad-blog-platform.md | |
2030 286 2024-07-27/01-quick-bits-nix-shell-is-cursed.md | |
2031 387 2024-07-29/01-quick-bits-why-you-should-automate-everything.md | |
2032 1060 2024-07-29/02-go-a-reasonable-good-language.md | |
2033 1380 2024-07-30/01-first-impressions-fpgbc.md | |
2034 1238 2024-07-31/01-generating-yaml-files-with-nix.md | |
2035 2308 2024-08-01/01-troubleshooting-zsh-lag-and-solutions-with-nix.md | |
2036 504 2024-08-01/02-quick-bits-realise-nix-symlinks.md | |
2037 834 2024-08-04/01-make-nixd-modules-completion-work-anywhere-with-flak… | |
2038 1147 2024-08-05/01-my-favorite-device-is-a-chromebook.md | |
2039 394 2024-08-07/01-quick-bits-is-crostini-a-microvm.md | |
2040 120 README.md | |
2041 11985 total | |
2042 </code></pre> | |
2043 <p>While using <code>wc</code> is probably not the bes… | |
2044 in this blog, since I tend to write lots of code snippets), I think this… | |
2045 least it gives me a good insight: yes, quick bits are quicker, and they'… | |
2046 basically posts with a soft limit around 500 words. So expect in future … | |
2047 limit to be used.</p> | |
2048 <p>By the way, at:</p> | |
2049 <pre class="chroma"><code><span class="line"><span … | |
2050 </span></span><span class="line"><span class="cl"&g… | |
2051 </span></span></span></code></pre><p>… | |
2052 too much. And yes, that last block of code is also meta ;).</p></d… | |
2053 conclusion I got after some searching.</p> | |
2054 <p>Someone asked me in my <a href="https://kokada.dev/blog/my-f… | |
2055 post</a> about my | |
2056 Chromebook if Crostini could be considered a micro VM. This was a intere… | |
2057 question, so I decided to do another post.</p> | |
2058 <p>To start, it is really difficult to get a good definition of wh… | |
2059 is. <a href="https://firecracker-microvm.github.io/">Firecracker&l… | |
2060 micro VM, and describes itself in its website as:</p> | |
2061 <blockquote> | |
2062 <p>Firecracker is a virtual machine monitor (VMM) that uses the Li… | |
2063 Kernel-based Virtual Machine (KVM) to create and manage microVMs. Firecr… | |
2064 has a minimalist design. It excludes unnecessary devices and guest | |
2065 functionality to reduce the memory footprint and attack surface area of … | |
2066 microVM. This improves security, decreases the startup time, and increas… | |
2067 hardware utilization.</p> | |
2068 </blockquote> | |
2069 <p>Now looking at Crostini, its heart is a VMM called | |
2070 <a href="https://crosvm.dev/">crosvm</a>. It is described in… | |
2071 <a href="https://chromium.googlesource.com/chromiumos/platform/crosvm… | |
2072 as:</p> | |
2073 <blockquote> | |
2074 <p>crosvm is a virtual machine monitor (VMM) based on Linux’s KV… | |
2075 with a focus on simplicity, security, and speed. crosvm is intended to r… | |
2076 Linux guests, originally as a security boundary for running native | |
2077 applications on the ChromeOS platform. Compared to QEMU, crosvm doesn’t | |
2078 emulate architectures or real hardware, instead concentrating on | |
2079 paravirtualized devices, such as the virtio standard.</p> | |
2080 </blockquote> | |
2081 <p>Similar descriptions right? Actually Firecracker website says i… | |
2082 Chromium OS's Virtual Machine Monitor, crosvm, an open source VMM writte… | |
2083 Rust&quot;. So I would say it is safe to say crosvm itself is a micr… | |
2084 <p>But | |
2085 <a href="https://www.chromium.org/chromium-os/developer-library/guide… | |
2086 itself is a combination of virtualization AND containerization. Basically | |
2087 inside the VM it runs a Linux kernel and <a href="https://linuxcontai… | |
2088 that can start arbitrary containers inside it. From the Crostini documen… | |
2089 this choice seems to be to keep startup times down, and also to increase | |
2090 security (e.g.: in case of a security issue inside the container).</p… | |
2091 <p>This is definitely an interesting choice, since containers allo… | |
2092 of each distro that you run inside Crostini to be low, and the main VM i… | |
2093 (called | |
2094 <a href="https://chromium.googlesource.com/chromiumos/overlays/board-… | |
2095 should have low overhead too thanks to crosvm.</p> | |
2096 <p>By the way, if you want to learn more how &quot;devices&… | |
2097 like crosvm, I recommend <a href="https://prilik.com/blog/post/crosvm… | |
2098 post</a> talking about | |
2099 paravirtualized devices in crosvm.</p></description><pubDate>Wed, … | |
2100 &quot;personal computing&quot; that I do nowadays is mostly done… | |
2101 unremarkable devices that I own: a cheap <a href="https://www.lenovo.… | |
2102 3</a>, | |
2103 that I bought for around EUR300. I was thinking why, because it is woefu… | |
2104 underpowered: a <a href="https://www.anandtech.com/show/16696/qualcom… | |
2105 2</a>, | |
2106 a CPU that was already considered slow 3 years ago, coupled with an eMMC… | |
2107 storage, that is not much faster than a HDD. At least I have the 8GB RAM | |
2108 version instead of the 4GB one.</p> | |
2109 <p>It is a hybrid device, one that can be used as either a tablet … | |
2110 it is compromised experience in both cases: as a tablet, it lacks the be… | |
2111 touch optimised interface from iOS or Android; as a laptop, you have to … | |
2112 on the stand to adjust the screen, and the detachable keyboard is worse … | |
2113 any laptop I have ever owned: getting keys stucked and characters being | |
2114 duplicated as a result is a common occurence. It is not so bad that I ca… | |
2115 things done though. About the trackpad: its biggest quality is that I ne… | |
2116 feel the need to use the touchscreen in laptop mode, that is to say that… | |
2117 acceptable. Just crank up the pointer speed in ChromeOS settings, otherw… | |
2118 never get anywhere since the trackpad is so small. There is also an acti… | |
2119 stylus, that helped me sometimes when I needed to sign something but oth… | |
2120 I can't comment too much.</p> | |
2121 <p>But I really love this device. It is generally the only device … | |
2122 trips nowadays, because while it is compromised it works well enough: I … | |
2123 to consume media in tablet mode (the fact that ChromeOS supports Android… | |
2124 is a plus in those cases), browse the web and even do Linux stuff (more … | |
2125 this later). The fact that it is small (the size remembers me of a | |
2126 <a href="https://en.wikipedia.org/wiki/Netbook">netbook</a>)… | |
2127 the keyboard), has a good screen (that is bright and HiDPI) and good bat… | |
2128 life (I don't have numbers but I almost never worry about it) is what ma… | |
2129 this device the perfect companion to trips.</p> | |
2130 <p>Also, it has 2 USB-C ports and supports DisplayPort alt-mode, s… | |
2131 can charge it, connect to a external display and peripherals, all at the… | |
2132 time. Sadly, the maximum output resolution I got was 1080p (2560x1080), | |
2133 although some people at Reddit <a href="https://www.reddit.com/r/chro… | |
2134 success</a> | |
2135 at 1440p, and the specs suggests it supports 4k. It may be my Dell S3423… | |
2136 monitor being wonky, the fact that it is Ultrawide or the cable, who kno… | |
2137 even tried to change the monitor to &quot;High Resolution&quot; … | |
2138 no avail.</p> | |
2139 <p><em>Update:</em> looking at the <a href="https:/… | |
2140 brief</a> | |
2141 for Snapdragon 7c Gen 2, it seems it supports up to QHD@60Hz (1440p) for… | |
2142 external display, and not 4k. This explains why it doesn't work at maxim… | |
2143 resolution in my Dell S3423DWC, since while it is 1440p it is Ultrawide,… | |
2144 resolution is bigger than QHD (3440x1440 vs 2560x1440).</p> | |
2145 <p>ChromeOS is also really interesting nowadays. To start, it is d… | |
2146 ground up to be a <a href="https://support.google.com/chromebook/answ… | |
2147 environment</a>, probably | |
2148 the most secure OS for consumers right now. Being a Chrome-first OS make… | |
2149 compromised experience, for example, it is the only device that I use Ch… | |
2150 my main browser (since I personally prefer Firefox). But having a OS tha… | |
2151 fast is great: I never worry about OS updates because I know the device … | |
2152 ready in seconds after a reboot. And the whole desktop experience inside… | |
2153 ChromeOS desktop is good, having shortcuts for many operations so you ca… | |
2154 things done fast, and support for virtual desktops (ChromeOS call it &am… | |
2155 means you can organise your windows as much as you want.</p> | |
2156 <p>And what I think makes ChromeOS really powerful is | |
2157 <a href="https://chromeos.dev/en/linux">Crostini</a>, a full… | |
2158 inside ChromeOS. It runs Debian (it seems you can <a href="https://ww… | |
2159 distros</a> | |
2160 though) with a deep integration with ChromeOS, so you can run even graph… | |
2161 programs without issues (including OpenGL!):</p> | |
2162 <p><a href="https://github.com/thiagokokada/blog/raw/main/posts… | |
2163 <p><a href="https://github.com/thiagokokada/blog/raw/main/posts… | |
2164 <p>This is all thanks to | |
2165 <a href="https://chromium.googlesource.com/chromiumos/platform2/+/HEA… | |
2166 a nested Wayland compositor that runs inside Crostini and allow both Way… | |
2167 and X11 applications to be forwarded to ChromeOS. The integration is so … | |
2168 that I can run Firefox inside Crostini and works well enough, but sadly … | |
2169 is too slow in this device (I am not sure if the issue is ChromeOS or Fi… | |
2170 but I suspect the later since Google does some optimisation per device).… | |
2171 <p>One interesting tidbit about the OpenGL situation in this devic… | |
2172 be the first Chromebook to ship with open source drivers, thanks to Free… | |
2173 There is <a href="https://www.youtube.com/watch?v=8mnjSmN03VM">thi… | |
2174 presentation done by Rob Clark in XDC 2021, that I recommended anyone | |
2175 interested in free drivers to watch (the reference design of Duet 3 is | |
2176 <a href="https://chromeunboxed.com/chromebook-tablet-snapdragon-7c-ho… | |
2177 <p>The Crostini integration is probably the best VM integration wi… | |
2178 saw in an OS: you can manage files inside the VM, share directories betw… | |
2179 OS and VM, copy and paste works between the two, GUI applications instal… | |
2180 inside the VM appear in the ChromeOS menu, memory allocation inside the … | |
2181 transparent, etc. Even the themes for Linux GUI applications are customi… | |
2182 match ChromeOS. It is unironically one of the best Linux desktop experie… | |
2183 ever had.</p> | |
2184 <p>Of course I am using Nix, but since the Crostini integration de… | |
2185 services being configured and installed, I decided to run Nix inside Deb… | |
2186 instead of NixOS and run <a href="https://nix-community.github.io/hom… | |
2187 standalone</a>. | |
2188 I recommend checking the official <a href="https://wiki.nixos.org/wik… | |
2189 Crostini</a>, that details | |
2190 how to register applications in ChromeOS (so desktop applications appear… | |
2191 menu) and use <a href="https://github.com/nix-community/nixGL">nix… | |
2192 applications work.</p> | |
2193 <p>Like I said at the start of the article, the device is woefully… | |
2194 its CPU and eMMC. It does mean that, for example, activating my Home-Man… | |
2195 configuration takes a while (around 1 minute, vs a few seconds in my lap… | |
2196 But it is much faster than say, | |
2197 <a href="https://github.com/nix-community/nix-on-droid-app">nix-on… | |
2198 last time I tried in a much more powerful device (<a href="https://ww… | |
2199 5</a>), took 30 minutes until I | |
2200 just decided to cancel the operation. Having a proper VM instead of | |
2201 <a href="https://wiki.termux.com/wiki/PRoot">proot</a> makes… | |
2202 <p>I can even do some light programming here: using my | |
2203 <a href="https://kokada.dev/blog/troubleshoting-zsh-lag-and-solutions… | |
2204 and neovim configuration (including LSP for coding) is reasonable fast. … | |
2205 example, I did most of the code that <a href="https://kokada.dev/blog… | |
2206 blog</a> | |
2207 using this Chromebook. If I need more power, I can use the <a href="h… | |
2208 Android</a> to connect to any | |
2209 other of my hosts via SSH. Yes, the Tailscale app works in Crostini, sad… | |
2210 without MagicDNS, so you need to use the internal Tailscale IPs instead.… | |
2211 <p>Until Google decides to give us a proper VM or user namespaces … | |
2212 release a hybrid Chromebook device with better specs, this small Chromeb… | |
2213 will probably stay as my travel companion, and is one of my favorite dev… | |
2214 result&quot;).</p> | |
2215 <p>I recently switched from <a href="https://github.com/oxalica… | |
2216 <a href="https://github.com/nix-community/nixd">nixd</a> as … | |
2217 was curious in <code>nixd</code> for a long time since the f… | |
2218 means it can offer much more powerful completion than the <code>ni… | |
2219 analysis, however it used to be difficult to setup. Nowadays it is much … | |
2220 basically doing the right thing as long as you have <code>NIX_PATH… | |
2221 get both package and NixOS modules completion.</p> | |
2222 <p>Getting Home-Manager modules though needs some setup. The recom… | |
2223 setup accordingly to the <a href="https://github.com/nix-community/ni… | |
2224 documentation</a> | |
2225 is to use the following for Flake based configurations (using neovim | |
2226 configuration here, but it should be easy to adapt to other editors):<… | |
2227 <pre class="chroma"><code><span class="line"><span … | |
2228 </span></span><span class="line"><span class="cl"&g… | |
2229 </span></span><span class="line"><span class="cl"&g… | |
2230 </span></span><span class="line"><span class="cl"&g… | |
2231 </span></span><span class="line"><span class="cl"&g… | |
2232 </span></span><span class="line"><span class="cl"&g… | |
2233 </span></span><span class="line"><span class="cl"&g… | |
2234 </span></span><span class="line"><span class="cl"&g… | |
2235 </span></span><span class="line"><span class="cl"&g… | |
2236 </span></span><span class="line"><span class="cl"&g… | |
2237 </span></span><span class="line"><span class="cl"&g… | |
2238 </span></span><span class="line"><span class="cl"&g… | |
2239 </span></span><span class="line"><span class="cl"&g… | |
2240 </span></span><span class="line"><span class="cl"&g… | |
2241 </span></span></code></pre><p>This works, … | |
2242 will only work if you open your editor in your <a href="https://githu… | |
2243 repository</a>. For any other | |
2244 repository, <code>nixosConfigurations.miku-nixos</code> or &… | |
2245 will not exist and the completion will not work.</p> | |
2246 <p>It may look like this is easy to fix if you have | |
2247 <a href="https://nixos.org/manual/nixos/unstable/options#opt-_module.… | |
2248 (or <code>extraSpecialArgs</code> in Home-Manager) set to ha… | |
2249 Flakes inputs, but:</p> | |
2250 <pre class="chroma"><code><span class="line"><span … | |
2251 </span></span><span class="line"><span class="cl"&g… | |
2252 </span></span><span class="line"><span class="cl"&g… | |
2253 </span></span><span class="line"><span class="cl"&g… | |
2254 </span></span><span class="line"><span class="cl"&g… | |
2255 </span></span><span class="line"><span class="cl"&g… | |
2256 </span></span><span class="line"><span class="cl"&g… | |
2257 </span></span><span class="line"><span class="cl"&g… | |
2258 </span></span><span class="line"><span class="cl"&g… | |
2259 </span></span><span class="line"><span class="cl"&g… | |
2260 </span></span><span class="line"><span class="cl"&g… | |
2261 </span></span><span class="line"><span class="cl"&g… | |
2262 </span></span><span class="line"><span class="cl"&g… | |
2263 </span></span></code></pre><p>Well, it was… | |
2264 <pre class="chroma"><code><span class="line"><span … | |
2265 </span></span><span class="line"><span class="cl"&g… | |
2266 </span></span><span class="line"><span class="cl"&g… | |
2267 </span></span><span class="line"><span class="cl"&g… | |
2268 </span></span><span class="line"><span class="cl"&g… | |
2269 </span></span></code></pre><p>But while it… | |
2270 impure, since there is no <code>flake.lock</code>).</p> | |
2271 <p>The default configuration for <code>nixd</code> mak… | |
2272 of my configuration repo, and it is fast. How? I decided to take a look … | |
2273 <code>nixd</code> source code and found | |
2274 <a href="https://github.com/nix-community/nixd/blob/d938026c55c7c36a6… | |
2275 (formatted here for legibility):</p> | |
2276 <pre class="chroma"><code><span class="line"><span … | |
2277 </span></span><span class="line"><span class="cl"&g… | |
2278 </span></span><span class="line"><span class="cl"&g… | |
2279 </span></span><span class="line"><span class="cl"&g… | |
2280 </span></span><span class="line"><span class="cl"&g… | |
2281 </span></span><span class="line"><span class="cl"&g… | |
2282 </span></span><span class="line"><span class="cl"&g… | |
2283 </span></span><span class="line"><span class="cl"&g… | |
2284 </span></span><span class="line"><span class="cl"&g… | |
2285 </span></span><span class="line"><span class="cl"&g… | |
2286 </span></span></code></pre><p>Interesting,… | |
2287 said above, it depends in <code>NIX_PATH</code> being correc… | |
2288 use our Flake inputs instead? After some tries in the Nix REPL, I got the | |
2289 following:</p> | |
2290 <pre class="chroma"><code><span class="line"><span … | |
2291 </span></span><span class="line"><span class="cl"&g… | |
2292 </span></span><span class="line"><span class="cl"&g… | |
2293 </span></span><span class="line"><span class="cl"&g… | |
2294 </span></span><span class="line"><span class="cl"&g… | |
2295 </span></span><span class="line"><span class="cl"&g… | |
2296 </span></span><span class="line"><span class="cl"&g… | |
2297 </span></span><span class="line"><span class="cl"&g… | |
2298 </span></span><span class="line"><span class="cl"&g… | |
2299 </span></span><span class="line"><span class="cl"&g… | |
2300 </span></span></code></pre><p>So we can ad… | |
2301 <pre class="chroma"><code><span class="line"><span … | |
2302 </span></span><span class="line"><span class="cl"&g… | |
2303 </span></span><span class="line"><span class="cl"&g… | |
2304 </span></span><span class="line"><span class="cl"&g… | |
2305 </span></span><span class="line"><span class="cl"&g… | |
2306 </span></span><span class="line"><span class="cl"&g… | |
2307 </span></span><span class="line"><span class="cl"&g… | |
2308 </span></span></code></pre><p>This was eas… | |
2309 to take a look at the Home-Manager <a href="https://github.com/nix-co… | |
2310 code</a> | |
2311 to find the answer:</p> | |
2312 <pre class="chroma"><code><span class="line"><span … | |
2313 </span></span><span class="line"><span class="cl"&g… | |
2314 </span></span><span class="line"><span class="cl"&g… | |
2315 </span></span><span class="line"><span class="cl"&g… | |
2316 </span></span><span class="line"><span class="cl"&g… | |
2317 </span></span><span class="line"><span class="cl"&g… | |
2318 </span></span><span class="line"><span class="cl"&g… | |
2319 </span></span><span class="line"><span class="cl"&g… | |
2320 </span></span><span class="line"><span class="cl"&g… | |
2321 </span></span><span class="line"><span class="cl"&g… | |
2322 </span></span><span class="line"><span class="cl"&g… | |
2323 </span></span><span class="line"><span class="cl"&g… | |
2324 </span></span></code></pre><p>The interest… | |
2325 system (including <code>evalModules</code>). This includes e… | |
2326 Home-Manager only. Also, we need to disable <code>checks</code&… | |
2327 some validations (e.g.: missing <code>stateVersion</code>). … | |
2328 any issue for module completion yet, I may set it in the future.</p&g… | |
2329 <p>And for the final result:</p> | |
2330 <pre class="chroma"><code><span class="line"><span … | |
2331 </span></span><span class="line"><span class="cl"&g… | |
2332 </span></span><span class="line"><span class="cl"&g… | |
2333 </span></span><span class="line"><span class="cl"&g… | |
2334 </span></span><span class="line"><span class="cl"&g… | |
2335 </span></span><span class="line"><span class="cl"&g… | |
2336 </span></span><span class="line"><span class="cl"&g… | |
2337 </span></span><span class="line"><span class="cl"&g… | |
2338 </span></span><span class="line"><span class="cl"&g… | |
2339 </span></span><span class="line"><span class="cl"&g… | |
2340 </span></span><span class="line"><span class="cl"&g… | |
2341 </span></span><span class="line"><span class="cl"&g… | |
2342 </span></span><span class="line"><span class="cl"&g… | |
2343 </span></span></code></pre><p>Yes, it is q… | |
2344 repository, as long as you're using Flakes. And it is fast, since it doe… | |
2345 need any network access. Since we are already here, let's define <cod… | |
2346 not depend in the <code>NIX_PATH</code> being set too.</p… | |
2347 Tavis</a>, I decided to document my own | |
2348 recent journey of reducing terminal (ZSH) lag startup. This post is way … | |
2349 interesting than the one from Tavis that uses a debugger to patch applic… | |
2350 on the fly, but should still be interesting for some. And it also shows … | |
2351 powerful Nix can be for some things.</p> | |
2352 <p>For context, I have basically 3 systems where I interact with t… | |
2353 frequently:</p> | |
2354 <ul> | |
2355 <li><a href="https://www.notebookcheck.net/Lenovo-ThinkPad-P14s… | |
2356 running NixOS, with a reasonable fast CPU (<a href="https://www.noteb… | |
2357 4750U</a>) | |
2358 and disk (NVMe)</li> | |
2359 <li><a href="https://everymac.com/systems/apple/macbook_pro/spe… | |
2360 Pro</a> | |
2361 with a really fast CPU (M1 Pro) and disk, but of course running macOS, b… | |
2362 phased-out since this is a job owned machine and I am changing jobs right | |
2363 now, but should be replaced with another one soon™</li> | |
2364 <li><a href="https://chromeunboxed.com/lenovo-chromebook-duet-3… | |
2365 3</a> | |
2366 running ChromeOS, with slow CPU (<a href="https://www.notebookcheck.n… | |
2367 2</a>) | |
2368 and disk (eMMC, really?)</li> | |
2369 </ul> | |
2370 <p>My experience is similar to Tavis, at around 300ms of startup t… | |
2371 too much, but around 500ms+ is where I start to notice. I never had any … | |
2372 with startup time in NixOS itself (I had issues with macOS before, but i… | |
2373 not actually the fault of macOS), but in the Chromebook it was awful: 60… | |
2374 with <a href="https://www.instabug.com/blog/understanding-cold-hot-an… | |
2375 start</a>, | |
2376 while cold start it could take multiple seconds.</p> | |
2377 <p>We can check how long ZSH takes to start by using:</p> | |
2378 <pre class="chroma"><code><span class="line"><span … | |
2379 </span></span><span class="line"><span class="cl"&g… | |
2380 </span></span></span></code></pre><p>… | |
2381 use of ZSH. Without this flag ZSH will ignore your <code>~/.zshrc&… | |
2382 results will be meaningless.</p> | |
2383 <p>To do a more interesting benchmark, we can use | |
2384 <a href="https://github.com/sharkdp/hyperfine"><code>hyperfi… | |
2385 <pre class="chroma"><code><span class="line"><span … | |
2386 </span></span><span class="line"><span class="cl"&g… | |
2387 </span></span></span><span class="line"><span… | |
2388 </span></span></span><span class="line"><span… | |
2389 </span></span></span></code></pre><p>… | |
2390 shell startup time. A really great tool to have in your toolbox by the w… | |
2391 I digress.</p> | |
2392 <p>So let's do a little time travelling. Going back to commit | |
2393 <a href="https://github.com/thiagokokada/nix-configs/tree/b12757f9088… | |
2394 from <a href="https://github.com/thiagokokada/nix-configs/">nix-co… | |
2395 <code>hyperfine</code> like above from my NixOS laptop, we h… | |
2396 <pre class="chroma"><code><span class="line"><span … | |
2397 </span></span><span class="line"><span class="cl"&g… | |
2398 </span></span></span><span class="line"><span… | |
2399 </span></span></span><span class="line"><span… | |
2400 </span></span></span></code></pre><p>… | |
2401 <pre class="chroma"><code><span class="line"><span … | |
2402 </span></span><span class="line"><span class="cl"&g… | |
2403 </span></span></span><span class="line"><span… | |
2404 </span></span></span><span class="line"><span… | |
2405 </span></span></span></code></pre><p>… | |
2406 benchmark (so it is a hot start). The cold start times were above 3s. So… | |
2407 investigate what is happening here. We can profile what is taking time d… | |
2408 the startup of ZSH using <a href="https://www.bigbinary.com/blog/zsh-… | |
2409 You can add the following in your <code>~/.zshrc</code>:<… | |
2410 <pre class="chroma"><code><span class="line"><span … | |
2411 </span></span><span class="line"><span class="cl"&g… | |
2412 </span></span><span class="line"><span class="cl"&g… | |
2413 </span></span><span class="line"><span class="cl"&g… | |
2414 </span></span><span class="line"><span class="cl"&g… | |
2415 </span></span><span class="line"><span class="cl"&g… | |
2416 </span></span><span class="line"><span class="cl"&g… | |
2417 </span></span></code></pre><p>Or if using … | |
2418 <a href="https://nix-community.github.io/home-manager/options.xhtml#o… | |
2419 option. Once we restart ZSH, we will have something like:</p> | |
2420 <pre class="chroma"><code><span class="line"><span … | |
2421 </span></span></span><span class="line"><span… | |
2422 </span></span></span><span class="line"><span… | |
2423 </span></span></span><span class="line"><span… | |
2424 </span></span></span><span class="line"><span… | |
2425 </span></span></span><span class="line"><span… | |
2426 </span></span></span><span class="line"><span… | |
2427 </span></span></span><span class="line"><span… | |
2428 </span></span></span><span class="line"><span… | |
2429 </span></span></span><span class="line"><span… | |
2430 </span></span></span><span class="line"><span… | |
2431 </span></span></span><span class="line"><span… | |
2432 </span></span></span><span class="line"><span… | |
2433 </span></span></span><span class="line"><span… | |
2434 </span></span></span><span class="line"><span… | |
2435 </span></span></span><span class="line"><span… | |
2436 </span></span></span><span class="line"><span… | |
2437 </span></span></span><span class="line"><span… | |
2438 </span></span></span><span class="line"><span… | |
2439 </span></span></span><span class="line"><span… | |
2440 </span></span></span><span class="line"><span… | |
2441 </span></span></span><span class="line"><span… | |
2442 </span></span></span><span class="line"><span… | |
2443 </span></span></span><span class="line"><span… | |
2444 </span></span></code></pre><p>I ommited so… | |
2445 <a href="https://github.com/zimfw/zimfw">zimfw</a>, the fram… | |
2446 my ZSH (similar to Oh-My-Zsh). I actually don't use <code>zimfw<… | |
2447 just load some modules that I find useful, like the <code>zim-comp… | |
2448 <code>zim-ssh</code> that we can see above. By the way, Zim … | |
2449 optimised for startup time, but those 2 modules are kind slow.</p> | |
2450 <p>For <a href="https://github.com/zimfw/completion"><cod… | |
2451 look at it, there isn't much I could do. It seems that the reason | |
2452 <code>zim-completion</code> takes so long during startup is … | |
2453 if it needs to recompile the completions (and replacing it with just a n… | |
2454 <code>autoload -U compinit &amp;&amp; compinit</code>… | |
2455 may eventually replace it for something else, but I really like what Zim… | |
2456 here, so I decided to not touch it for now.</p> | |
2457 <p>However <a href="https://github.com/zimfw/ssh"><code&g… | |
2458 reason I used it is to start a <code>ssh-agent</code> and ke… | |
2459 sessions. It shouldn't have that much influence in startup time. So I to… | |
2460 look the code (since it is small, I am reproducing it here):</p> | |
2461 <pre class="chroma"><code><span class="line"><span … | |
2462 </span></span><span class="line"><span class="cl"&g… | |
2463 </span></span><span class="line"><span class="cl"&g… | |
2464 </span></span><span class="line"><span class="cl"&g… | |
2465 </span></span><span class="line"><span class="cl"&g… | |
2466 </span></span><span class="line"><span class="cl"&g… | |
2467 </span></span><span class="line"><span class="cl"&g… | |
2468 </span></span><span class="line"><span class="cl"&g… | |
2469 </span></span><span class="line"><span class="cl"&g… | |
2470 </span></span><span class="line"><span class="cl"&g… | |
2471 </span></span><span class="line"><span class="cl"&g… | |
2472 </span></span><span class="line"><span class="cl"&g… | |
2473 </span></span><span class="line"><span class="cl"&g… | |
2474 </span></span><span class="line"><span class="cl"&g… | |
2475 </span></span><span class="line"><span class="cl"&g… | |
2476 </span></span><span class="line"><span class="cl"&g… | |
2477 </span></span><span class="line"><span class="cl"&g… | |
2478 </span></span><span class="line"><span class="cl"&g… | |
2479 </span></span><span class="line"><span class="cl"&g… | |
2480 </span></span><span class="line"><span class="cl"&g… | |
2481 </span></span><span class="line"><span class="cl"&g… | |
2482 </span></span><span class="line"><span class="cl"&g… | |
2483 </span></span><span class="line"><span class="cl"&g… | |
2484 </span></span><span class="line"><span class="cl"&g… | |
2485 </span></span><span class="line"><span class="cl"&g… | |
2486 </span></span><span class="line"><span class="cl"&g… | |
2487 </span></span><span class="line"><span class="cl"&g… | |
2488 </span></span><span class="line"><span class="cl"&g… | |
2489 </span></span><span class="line"><span class="cl"&g… | |
2490 </span></span><span class="line"><span class="cl"&g… | |
2491 </span></span><span class="line"><span class="cl"&g… | |
2492 </span></span><span class="line"><span class="cl"&g… | |
2493 </span></span><span class="line"><span class="cl"&g… | |
2494 </span></span><span class="line"><span class="cl"&g… | |
2495 </span></span></code></pre><p>Well, this i… | |
2496 already running but you open a new shell instance (that doesn't have the | |
2497 connection info yet so it will need to load). This will run <code>… | |
2498 times. How long does <code>ssh-add</code> takes to run?</… | |
2499 <pre class="chroma"><code><span class="line"><span … | |
2500 </span></span><span class="line"><span class="cl"&g… | |
2501 </span></span></span><span class="line"><span… | |
2502 </span></span></span><span class="line"><span… | |
2503 </span></span></span><span class="line"><span… | |
2504 </span></span></span><span class="line"><span… | |
2505 </span></span></span></code></pre><p>… | |
2506 command being tested is too fast.</p> | |
2507 <p>In average we have 4x4ms=16ms of startup time. But keep in mind… | |
2508 can be much worse. The question is, how can we improve the situation her… | |
2509 <p>After taking a look, I decided to write my own code, based in s… | |
2510 from <a href="https://github.com/ohmyzsh/ohmyzsh/blob/67581c53c645856… | |
2511 plugin</a>. | |
2512 Here is final version of my | |
2513 <a href="https://github.com/thiagokokada/nix-configs/blob/e45a888f2bf… | |
2514 <pre class="chroma"><code><span class="line"><span … | |
2515 </span></span><span class="line"><span class="cl"&g… | |
2516 </span></span><span class="line"><span class="cl"&g… | |
2517 </span></span><span class="line"><span class="cl"&g… | |
2518 </span></span><span class="line"><span class="cl"&g… | |
2519 </span></span><span class="line"><span class="cl"&g… | |
2520 </span></span><span class="line"><span class="cl"&g… | |
2521 </span></span><span class="line"><span class="cl"&g… | |
2522 </span></span><span class="line"><span class="cl"&g… | |
2523 </span></span><span class="line"><span class="cl"&g… | |
2524 </span></span><span class="line"><span class="cl"&g… | |
2525 </span></span><span class="line"><span class="cl"&g… | |
2526 </span></span><span class="line"><span class="cl"&g… | |
2527 </span></span><span class="line"><span class="cl"&g… | |
2528 </span></span><span class="line"><span class="cl"&g… | |
2529 </span></span><span class="line"><span class="cl"&g… | |
2530 </span></span><span class="line"><span class="cl"&g… | |
2531 </span></span><span class="line"><span class="cl"&g… | |
2532 </span></span><span class="line"><span class="cl"&g… | |
2533 </span></span><span class="line"><span class="cl"&g… | |
2534 </span></span><span class="line"><span class="cl"&g… | |
2535 </span></span><span class="line"><span class="cl"&g… | |
2536 </span></span><span class="line"><span class="cl"&g… | |
2537 </span></span><span class="line"><span class="cl"&g… | |
2538 </span></span><span class="line"><span class="cl"&g… | |
2539 </span></span><span class="line"><span class="cl"&g… | |
2540 </span></span><span class="line"><span class="cl"&g… | |
2541 </span></span><span class="line"><span class="cl"&g… | |
2542 </span></span><span class="line"><span class="cl"&g… | |
2543 </span></span><span class="line"><span class="cl"&g… | |
2544 </span></span><span class="line"><span class="cl"&g… | |
2545 </span></span><span class="line"><span class="cl"&g… | |
2546 </span></span><span class="line"><span class="cl"&g… | |
2547 </span></span><span class="line"><span class="cl"&g… | |
2548 </span></span><span class="line"><span class="cl"&g… | |
2549 </span></span><span class="line"><span class="cl"&g… | |
2550 </span></span><span class="line"><span class="cl"&g… | |
2551 </span></span><span class="line"><span class="cl"&g… | |
2552 </span></span><span class="line"><span class="cl"&g… | |
2553 </span></span></code></pre><p>The idea her… | |
2554 <a href="https://zsh.sourceforge.io/Doc/Release/Zsh-Modules.html#The-… | |
2555 module from ZSH itself to check if the <code>ssh-agent</code>… | |
2556 executing <code>ssh-add -l</code>. The only case we run any … | |
2557 agent itself if needed. Let's run <code>hyperfine</code> aga… | |
2558 <pre><code>$ hyperfine &quot;zsh -ic exit&quot; | |
2559 Benchmark 1: zsh -ic exit | |
2560 Time (mean ± σ): 188.3 ms ± 8.2 ms [User: 61.1 ms, System:… | |
2561 Range (min … max): 170.9 ms … 198.4 ms 16 runs | |
2562 </code></pre> | |
2563 <p>Got a good improvement here already. Let's see <code>zpro… | |
2564 <pre class="chroma"><code><span class="line"><span … | |
2565 </span></span></span><span class="line"><span… | |
2566 </span></span></span><span class="line"><span… | |
2567 </span></span></span><span class="line"><span… | |
2568 </span></span></span><span class="line"><span… | |
2569 </span></span></span><span class="line"><span… | |
2570 </span></span></span><span class="line"><span… | |
2571 </span></span></span><span class="line"><span… | |
2572 </span></span></span><span class="line"><span… | |
2573 </span></span></span><span class="line"><span… | |
2574 </span></span></span><span class="line"><span… | |
2575 </span></span></span><span class="line"><span… | |
2576 </span></span></span><span class="line"><span… | |
2577 </span></span></span><span class="line"><span… | |
2578 </span></span></span><span class="line"><span… | |
2579 </span></span></span><span class="line"><span… | |
2580 </span></span></span><span class="line"><span… | |
2581 </span></span></span><span class="line"><span… | |
2582 </span></span></span><span class="line"><span… | |
2583 </span></span></span><span class="line"><span… | |
2584 </span></span></span><span class="line"><span… | |
2585 </span></span></span><span class="line"><span… | |
2586 </span></span></span><span class="line"><span… | |
2587 </span></span></span><span class="line"><span… | |
2588 </span></span></code></pre><p>Well, there … | |
2589 still the main culprit, but nothing to do for now. Instead of looking at | |
2590 <code>zproof</code>, let's take a look at my <code>~/.… | |
2591 <pre class="chroma"><code><span class="line"><span … | |
2592 </span></span><span class="line"><span class="cl"&g… | |
2593 </span></span><span class="line"><span class="cl"&g… | |
2594 </span></span><span class="line"><span class="cl"&g… | |
2595 </span></span><span class="line"><span class="cl"&g… | |
2596 </span></span><span class="line"><span class="cl"&g… | |
2597 </span></span><span class="line"><span class="cl"&g… | |
2598 </span></span><span class="line"><span class="cl"&g… | |
2599 </span></span><span class="line"><span class="cl"&g… | |
2600 </span></span><span class="line"><span class="cl"&g… | |
2601 </span></span><span class="line"><span class="cl"&g… | |
2602 </span></span><span class="line"><span class="cl"&g… | |
2603 </span></span><span class="line"><span class="cl"&g… | |
2604 </span></span></code></pre><p>So you see, … | |
2605 startup considerable. Not necessary for commands fast like <code>f… | |
2606 written in Go), but let's see | |
2607 <a href="https://github.com/haslersn/any-nix-shell"><code>an… | |
2608 in shell script:</p> | |
2609 <pre class="chroma"><code><span class="line"><span … | |
2610 </span></span><span class="line"><span class="cl"&g… | |
2611 </span></span></span><span class="line"><span… | |
2612 </span></span></span><span class="line"><span… | |
2613 </span></span></span></code></pre><p>… | |
2614 in mind that there is a difference between the cold and hot start again.… | |
2615 example, <code>fzf</code>:</p> | |
2616 <pre class="chroma"><code><span class="line"><span … | |
2617 </span></span><span class="line"><span class="cl"&g… | |
2618 </span></span></span><span class="line"><span… | |
2619 </span></span></span><span class="line"><span… | |
2620 </span></span></span></code></pre><p>… | |
2621 6.8ms can be noticiable, especially if this accumulates with other slow | |
2622 starting apps.</p> | |
2623 <p>And the thing is, all those commands are just generating in the… | |
2624 output, at least for the current version of the program. Can we pre-gene… | |
2625 them instead? If using Nix, of course we can:</p> | |
2626 <pre class="chroma"><code><span class="line"><span … | |
2627 </span></span><span class="line"><span class="cl"&g… | |
2628 </span></span><span class="line"><span class="cl"&g… | |
2629 </span></span><span class="line"><span class="cl"&g… | |
2630 </span></span><span class="line"><span class="cl"&g… | |
2631 </span></span><span class="line"><span class="cl"&g… | |
2632 </span></span><span class="line"><span class="cl"&g… | |
2633 </span></span><span class="line"><span class="cl"&g… | |
2634 </span></span></span><span class="line"><span… | |
2635 </span></span></span><span class="line"><span… | |
2636 </span></span><span class="line"><span class="cl"&g… | |
2637 </span></span></span><span class="line"><span… | |
2638 </span></span></span><span class="line"><span… | |
2639 </span></span><span class="line"><span class="cl"&g… | |
2640 </span></span></span><span class="line"><span… | |
2641 </span></span></span><span class="line"><span… | |
2642 </span></span></span><span class="line"><span… | |
2643 </span></span></span><span class="line"><span… | |
2644 </span></span></span><span class="line"><span… | |
2645 </span></span></span><span class="line"><span… | |
2646 </span></span></span><span class="line"><span… | |
2647 </span></span><span class="line"><span class="cl"&g… | |
2648 </span></span></span><span class="line"><span… | |
2649 </span></span></span><span class="line"><span… | |
2650 </span></span><span class="line"><span class="cl"&g… | |
2651 </span></span></span><span class="line"><span… | |
2652 </span></span></span><span class="line"><span… | |
2653 </span></span></span><span class="line"><span… | |
2654 </span></span><span class="line"><span class="cl"&g… | |
2655 </span></span></span><span class="line"><span… | |
2656 </span></span></span><span class="line"><span… | |
2657 </span></span><span class="line"><span class="cl"&g… | |
2658 </span></span></span><span class="line"><span… | |
2659 </span></span></code></pre><p>So we can us… | |
2660 <code>source</code> the result. <code>fzf</code>… | |
2661 already generated in the package. I think this is one of those things th… | |
2662 really shows the power of Nix: I wouldn't do something similar if I didn… | |
2663 Nix because the risk of breaking something later is big (e.g.: forgettin… | |
2664 update the generated files), but Nix makes those things trivial.</p&g… | |
2665 <p>Let's run <code>hyperfine</code> again:</p> | |
2666 <pre><code>$ hyperfine &quot;zsh -ic exit&quot; | |
2667 Benchmark 1: zsh -ic exit | |
2668 Time (mean ± σ): 162.3 ms ± 4.9 ms [User: 52.7 ms, System:… | |
2669 Range (min … max): 153.0 ms … 173.4 ms 19 runs | |
2670 </code></pre> | |
2671 <p>Another good improvement. The last change I did is switching be… | |
2672 <a href="https://github.com/zsh-users/zsh-syntax-highlighting"><… | |
2673 to | |
2674 <a href="https://github.com/zdharma-continuum/fast-syntax-highlightin… | |
2675 that is supposed to be faster and have better highlighting too. I got th… | |
2676 <code>_zsh_highlight_load_highlighters</code> using 26% of t… | |
2677 And for the final <code>hyperfine</code> in my laptop:</p… | |
2678 <pre><code>$ hyperfine &quot;zsh -ic exit&quot; | |
2679 Benchmark 1: zsh -ic exit | |
2680 Time (mean ± σ): 138.3 ms ± 7.1 ms [User: 47.5 ms, System:… | |
2681 Range (min … max): 123.8 ms … 157.9 ms 21 runs | |
2682 </code></pre> | |
2683 <p>A ~36% improvement, not bad. Let's see how it fares in my Chrom… | |
2684 <pre><code>$ hyperfine &quot;zsh -ic exit&quot; | |
2685 Benchmark 1: zsh -ic exit | |
2686 Time (mean ± σ): 278.2 ms ± 46.9 ms [User: 88.0 ms, System:… | |
2687 Range (min … max): 204.7 ms … 368.5 ms 11 runs | |
2688 </code></pre> | |
2689 <p>An even more impressive ~59% improvement. And yes, the shell st… | |
2690 much better.</p></description><pubDate>Thu, 01 Aug 2024 00:00:00 +… | |
2691 <a href="https://github.com/nix-community/home-manager/">Home-Mana… | |
2692 when you want to test something or maybe debug some issue in your | |
2693 configuration. Those times it would be really convenient if you could av… | |
2694 rebuild of your Home-Manager configuration, since this takes time until | |
2695 evaluation and activation.</p> | |
2696 <p>For those times I have this small script in my Nix configuratio… | |
2697 <code>realise-symlinks</code>, that is defined as:</p> | |
2698 <pre class="chroma"><code><span class="line"><span … | |
2699 </span></span><span class="line"><span class="cl"&g… | |
2700 </span></span><span class="line"><span class="cl"&g… | |
2701 </span></span><span class="line"><span class="cl"&g… | |
2702 </span></span><span class="line"><span class="cl"&g… | |
2703 </span></span><span class="line"><span class="cl"&g… | |
2704 </span></span></span><span class="line"><span… | |
2705 </span></span></span><span class="line"><span… | |
2706 </span></span></span><span class="line"><span… | |
2707 </span></span></span><span class="line"><span… | |
2708 </span></span></span><span class="line"><span… | |
2709 </span></span></span><span class="line"><span… | |
2710 </span></span></span><span class="line"><span… | |
2711 </span></span></span><span class="line"><span… | |
2712 </span></span></span><span class="line"><span… | |
2713 </span></span></span><span class="line"><span… | |
2714 </span></span></span><span class="line"><span… | |
2715 </span></span></span><span class="line"><span… | |
2716 </span></span></span><span class="line"><span… | |
2717 </span></span></span><span class="line"><span… | |
2718 </span></span></span><span class="line"><span… | |
2719 </span></span></span><span class="line"><span… | |
2720 </span></span></span><span class="line"><span… | |
2721 </span></span></span><span class="line"><span… | |
2722 </span></span></span><span class="line"><span… | |
2723 </span></span><span class="line"><span class="cl"&g… | |
2724 </span></span><span class="line"><span class="cl"&g… | |
2725 </span></span><span class="line"><span class="cl"&g… | |
2726 </span></span><span class="line"><span class="cl"&g… | |
2727 </span></span><span class="line"><span class="cl"&g… | |
2728 </span></span></code></pre><p>The idea of … | |
2729 store and it will realise, e.g.: convert to an &quot;actual&quot… | |
2730 <pre class="chroma"><code><span class="line"><span … | |
2731 </span></span><span class="line"><span class="cl"&g… | |
2732 </span></span></span><span class="line"><span… | |
2733 </span></span></span><span class="line"><span… | |
2734 </span></span><span class="line"><span class="cl"&g… | |
2735 </span></span></span><span class="line"><span… | |
2736 </span></span></span><span class="line"><span… | |
2737 </span></span></span><span class="line"><span… | |
2738 </span></span></span><span class="line"><span… | |
2739 </span></span><span class="line"><span class="cl"&g… | |
2740 </span></span></span></code></pre><p>… | |
2741 By the way, it also works with directories:</p> | |
2742 <pre class="chroma"><code><span class="line"><span … | |
2743 </span></span><span class="line"><span class="cl"&g… | |
2744 </span></span></span><span class="line"><span… | |
2745 </span></span></span><span class="line"><span… | |
2746 </span></span><span class="line"><span class="cl"&g… | |
2747 </span></span></span><span class="line"><span… | |
2748 </span></span></span><span class="line"><span… | |
2749 </span></span></span><span class="line"><span… | |
2750 </span></span></span><span class="line"><span… | |
2751 </span></span></span><span class="line"><span… | |
2752 </span></span></span><span class="line"><span… | |
2753 </span></span></span><span class="line"><span… | |
2754 </span></span></span><span class="line"><span… | |
2755 </span></span></span><span class="line"><span… | |
2756 </span></span><span class="line"><span class="cl"&g… | |
2757 </span></span></span><span class="line"><span… | |
2758 </span></span></span><span class="line"><span… | |
2759 </span></span></span><span class="line"><span… | |
2760 </span></span></span><span class="line"><span… | |
2761 </span></span></span><span class="line"><span… | |
2762 </span></span></span><span class="line"><span… | |
2763 </span></span></span></code></pre><p>… | |
2764 can just delete those files and re-run your Home-Manager activation:<… | |
2765 <pre class="chroma"><code><span class="line"><span … | |
2766 </span></span><span class="line"><span class="cl"&g… | |
2767 </span></span></span><span class="line"><span… | |
2768 </span></span><span class="line"><span class="cl"&g… | |
2769 </span></span></span><span class="line"><span… | |
2770 </span></span><span class="line"><span class="cl"&g… | |
2771 </span></span></span></code></pre><p>… | |
2772 <pre class="chroma"><code><span class="line"><span … | |
2773 </span></span><span class="line"><span class="cl"&g… | |
2774 </span></span></span><span class="line"><span… | |
2775 </span></span></span><span class="line"><span… | |
2776 </span></span></span><span class="line"><span… | |
2777 </span></span></span></code></pre><p>… | |
2778 OS level configuration.</p></description><pubDate>Thu, 01 Aug 2024… | |
2779 <a href="https://noyaml.com/">noyaml.com</a>. In my personal… | |
2780 preferring either JSON, <a href="https://toml.io/en/">TOML</a&g… | |
2781 <a href="https://en.wikipedia.org/wiki/INI_file">INI</a> fil… | |
2782 However the ship has sailed already, there are tons of projects everywhe… | |
2783 uses YAML: from most CI systems (<a href="https://docs.github.com/en/… | |
2784 Actions</a>, | |
2785 <a href="https://circleci.com/docs/introduction-to-yaml-configuration… | |
2786 <a href="https://docs.travis-ci.com/user/build-config-yaml">Travis… | |
2787 <a href="https://man.sr.ht/builds.sr.ht/">builds.sr.ht</a>),… | |
2788 <a href="https://kubernetes.io/docs/concepts/overview/working-with-ob… | |
2789 or in almost every | |
2790 <a href="https://guides.rubyonrails.org/configuring.html#configuring-… | |
2791 application.</p> | |
2792 <p>One way to avoid at least some issues with the language is to w… | |
2793 another language. I will show my solution in one of my <a href="https… | |
2794 repositories</a>, writing Nix to | |
2795 generate GitHub Actions configuration files. Bonus points for validating… | |
2796 result against the schema of GitHub Actions, so the famous &quot;thi… | |
2797 be string instead of a list of strings&quot; is gone.</p> | |
2798 <p>Let's start with the basics: YAML is supposed to be a <a hre… | |
2799 JSON</a>. What that means is that a JSON file | |
2800 <a href="https://yaml.org/spec/1.2-old/spec.html#id2759572">can be… | |
2801 parser. And Nix itself generates JSON natively, after all, Nix can be im… | |
2802 as <a href="https://nix.dev/tutorials/nix-language.html">&quot… | |
2803 <p>To make things easier, I will assume that you have the <code… | |
2804 <code>flakes</code> enabled as <code>experimental-feat… | |
2805 go <a href="https://wiki.nixos.org/wiki/Flakes">here</a>.<… | |
2806 <p>Using the <code>nix eval</code> command, we can gen… | |
2807 <pre class="chroma"><code><span class="line"><span … | |
2808 </span></span><span class="line"><span class="cl"&g… | |
2809 </span></span></span></code></pre><p>… | |
2810 impractical. We can write the following code inside a <code>foo.ni… | |
2811 <pre class="chroma"><code><span class="line"><span … | |
2812 </span></span><span class="line"><span class="cl"&g… | |
2813 </span></span><span class="line"><span class="cl"&g… | |
2814 </span></span></code></pre><p>And:</p&g… | |
2815 <pre class="chroma"><code><span class="line"><span … | |
2816 </span></span><span class="line"><span class="cl"&g… | |
2817 </span></span></span></code></pre><p>… | |
2818 not the <a href="https://metacpan.org/pod/JSON::XS#JSON-and-YAML">… | |
2819 maybe not), Nix has no native functionality to export data to YAML. Howe… | |
2820 since we are using Nix, it is trivial to use <code>nixpkgs</cod… | |
2821 convert from JSON to YAML.</p> | |
2822 <p>To start, let's create a new directory, move our <code>fo… | |
2823 new <code>flake.nix</code> file and put the following conten… | |
2824 <pre class="chroma"><code><span class="line"><span … | |
2825 </span></span><span class="line"><span class="cl"&g… | |
2826 </span></span><span class="line"><span class="cl"&g… | |
2827 </span></span><span class="line"><span class="cl"&g… | |
2828 </span></span><span class="line"><span class="cl"&g… | |
2829 </span></span><span class="line"><span class="cl"&g… | |
2830 </span></span><span class="line"><span class="cl"&g… | |
2831 </span></span><span class="line"><span class="cl"&g… | |
2832 </span></span><span class="line"><span class="cl"&g… | |
2833 </span></span><span class="line"><span class="cl"&g… | |
2834 </span></span><span class="line"><span class="cl"&g… | |
2835 </span></span><span class="line"><span class="cl"&g… | |
2836 </span></span><span class="line"><span class="cl"&g… | |
2837 </span></span><span class="line"><span class="cl"&g… | |
2838 </span></span><span class="line"><span class="cl"&g… | |
2839 </span></span><span class="line"><span class="cl"&g… | |
2840 </span></span><span class="line"><span class="cl"&g… | |
2841 </span></span><span class="line"><span class="cl"&g… | |
2842 </span></span><span class="line"><span class="cl"&g… | |
2843 </span></span><span class="line"><span class="cl"&g… | |
2844 </span></span></span><span class="line"><span… | |
2845 </span></span></span><span class="line"><span… | |
2846 </span></span></span><span class="line"><span… | |
2847 </span></span><span class="line"><span class="cl"&g… | |
2848 </span></span><span class="line"><span class="cl"&g… | |
2849 </span></span><span class="line"><span class="cl"&g… | |
2850 </span></span></code></pre><p>We are loadi… | |
2851 <code>builtins.toJSON</code> function, and finally, using &l… | |
2852 <code>passAsFile</code> option to load the contents of the J… | |
2853 <a href="https://github.com/sclevine/yj">yj</a>, that conver… | |
2854 formats (<code>-jy</code> flag means &quot;JSON to YAML&… | |
2855 because it is a single binary Go program, but you can use whatever you p… | |
2856 <p>By the way, there is a | |
2857 <a href="https://github.com/NixOS/nixpkgs/blob/9f918d616c5321ad374ae6… | |
2858 inside <code>nixpkgs.lib</code>, but as of the day of this p… | |
2859 <code>lib.strings.toJSON</code> (that in turn, calls <cod… | |
2860 really help here. Another option would be <code>pkgs.formats.yaml.… | |
2861 converts between formats, but it calls | |
2862 <a href="https://github.com/NixOS/nixpkgs/blob/008ceae1a2b47a84d7aa01… | |
2863 (in Python), so not my favorite choice.</p> | |
2864 <p>If we run the following commands, we can see the result:</p&… | |
2865 <pre class="chroma"><code><span class="line"><span … | |
2866 </span></span><span class="line"><span class="cl"&g… | |
2867 </span></span><span class="line"><span class="cl"&g… | |
2868 </span></span></span></code></pre><p>… | |
2869 <a href="https://github.com/thiagokokada/blog/blob/4e3f25485c6682f3e0… | |
2870 that builds this blog, to Nix:</p> | |
2871 <pre class="chroma"><code><span class="line"><span … | |
2872 </span></span><span class="line"><span class="cl"&g… | |
2873 </span></span><span class="line"><span class="cl"&g… | |
2874 </span></span><span class="line"><span class="cl"&g… | |
2875 </span></span><span class="line"><span class="cl"&g… | |
2876 </span></span><span class="line"><span class="cl"&g… | |
2877 </span></span><span class="line"><span class="cl"&g… | |
2878 </span></span><span class="line"><span class="cl"&g… | |
2879 </span></span><span class="line"><span class="cl"&g… | |
2880 </span></span><span class="line"><span class="cl"&g… | |
2881 </span></span><span class="line"><span class="cl"&g… | |
2882 </span></span><span class="line"><span class="cl"&g… | |
2883 </span></span><span class="line"><span class="cl"&g… | |
2884 </span></span><span class="line"><span class="cl"&g… | |
2885 </span></span><span class="line"><span class="cl"&g… | |
2886 </span></span><span class="line"><span class="cl"&g… | |
2887 </span></span><span class="line"><span class="cl"&g… | |
2888 </span></span><span class="line"><span class="cl"&g… | |
2889 </span></span><span class="line"><span class="cl"&g… | |
2890 </span></span><span class="line"><span class="cl"&g… | |
2891 </span></span><span class="line"><span class="cl"&g… | |
2892 </span></span><span class="line"><span class="cl"&g… | |
2893 </span></span><span class="line"><span class="cl"&g… | |
2894 </span></span><span class="line"><span class="cl"&g… | |
2895 </span></span><span class="line"><span class="cl"&g… | |
2896 </span></span><span class="line"><span class="cl"&g… | |
2897 </span></span><span class="line"><span class="cl"&g… | |
2898 </span></span><span class="line"><span class="cl"&g… | |
2899 </span></span><span class="line"><span class="cl"&g… | |
2900 </span></span><span class="line"><span class="cl"&g… | |
2901 </span></span><span class="line"><span class="cl"&g… | |
2902 </span></span><span class="line"><span class="cl"&g… | |
2903 </span></span><span class="line"><span class="cl"&g… | |
2904 </span></span></code></pre><p>Some interes… | |
2905 need to quote it. Not a problem, but something to be aware. And the temp… | |
2906 string in GitHub Actions uses the same <code>${}</code> that… | |
2907 escape.</p> | |
2908 <p>And after running the following commands:</p> | |
2909 <pre><code>$ nix build .#packages.x86_64-linux.toYAML | |
2910 $ cat result/go.yaml | |
2911 jobs: | |
2912 build: | |
2913 permissions: | |
2914 contents: write | |
2915 runs-on: ubuntu-latest | |
2916 steps: | |
2917 - uses: actions/checkout@v4 | |
2918 - name: Set up Go | |
2919 uses: actions/checkout@v4 | |
2920 with: | |
2921 go-version: &quot;1.21&quot; | |
2922 - name: Update | |
2923 run: make | |
2924 - env: | |
2925 MATAROA_TOKEN: ${{ secrets.MATAROA_TOKEN }} | |
2926 name: Publish | |
2927 run: make publish | |
2928 - name: Commit | |
2929 uses: stefanzweifel/git-auto-commit-action@v5 | |
2930 with: | |
2931 commit_message: README/rss:update | |
2932 name: Go | |
2933 &quot;on&quot;: | |
2934 push: | |
2935 branches: | |
2936 - main | |
2937 </code></pre> | |
2938 <p>Yes, the keys are not in the same order as we defined, since Ni… | |
2939 programming languages (with the exception of | |
2940 <a href="https://mail.python.org/pipermail/python-dev/2017-December/1… | |
2941 do not guarantee the insertion order in maps/dicts/attrsets/whatever. Bu… | |
2942 really hope whatever is consuming your YAML is not relying in the order … | |
2943 keys are defined (this would be more cursed than YAML already is).</p… | |
2944 <p>So that is basically it. For the bonus points that I talked at … | |
2945 post, we can modify <code>pkgs.runCommand</code> to run some… | |
2946 <a href="https://github.com/mpalmer/action-validator"><code>… | |
2947 particularly packaged in | |
2948 <a href="https://github.com/NixOS/nixpkgs/pull/260217">nixpkgs<… | |
2949 But you could use e.g.: a validator of Kubernetes YAML. Or a generic YAM… | |
2950 like this <a href="https://github.com/adrienverge/yamllint">one<… | |
2951 endless.</p> | |
2952 <p>Let's modify our <code>flake.nix</code> to add the … | |
2953 <pre class="chroma"><code><span class="line"><span … | |
2954 </span></span><span class="line"><span class="cl"&g… | |
2955 </span></span><span class="line"><span class="cl"&g… | |
2956 </span></span><span class="line"><span class="cl"&g… | |
2957 </span></span><span class="line"><span class="cl"&g… | |
2958 </span></span><span class="line"><span class="cl"&g… | |
2959 </span></span><span class="line"><span class="cl"&g… | |
2960 </span></span><span class="line"><span class="cl"&g… | |
2961 </span></span><span class="line"><span class="cl"&g… | |
2962 </span></span><span class="line"><span class="cl"&g… | |
2963 </span></span><span class="line"><span class="cl"&g… | |
2964 </span></span><span class="line"><span class="cl"&g… | |
2965 </span></span><span class="line"><span class="cl"&g… | |
2966 </span></span><span class="line"><span class="cl"&g… | |
2967 </span></span><span class="line"><span class="cl"&g… | |
2968 </span></span></span><span class="line"><span… | |
2969 </span></span></span><span class="line"><span… | |
2970 </span></span></span><span class="line"><span… | |
2971 </span></span></span><span class="line"><span… | |
2972 </span></span><span class="line"><span class="cl"&g… | |
2973 </span></span><span class="line"><span class="cl"&g… | |
2974 </span></span><span class="line"><span class="cl"&g… | |
2975 </span></span></code></pre><p>And let's ad… | |
2976 <pre class="chroma"><code><span class="line"><span … | |
2977 </span></span></span><span class="line"><span… | |
2978 </span></span></span><span class="line"><span… | |
2979 </span></span></span><span class="line"><span… | |
2980 </span></span></span><span class="line"><span… | |
2981 </span></span></span><span class="line"><span… | |
2982 </span></span><span class="line"><span class="cl"&g… | |
2983 </span></span><span class="line"><span class="cl"&g… | |
2984 </span></span><span class="line"><span class="cl"&g… | |
2985 </span></span></span><span class="line"><span… | |
2986 </span></span></span><span class="line"><span… | |
2987 </span></span><span class="line"><span class="cl"&g… | |
2988 </span></span><span class="line"><span class="cl"&g… | |
2989 </span></span></code></pre><p>Finally, let… | |
2990 <pre><code>$ nix build .#packages.x86_64-linux.toYAML | |
2991 error: builder for '/nix/store/j8wr6j1pvyf986sf74hqw8k31lvlzac5-toYAML.d… | |
2992 last 25 log lines: | |
2993 &gt; &quot;Additional pro… | |
2994 &gt; ), | |
2995 &gt; path: &quot;/jobs/build&… | |
2996 &gt; title: &quot;Property co… | |
2997 &gt; }, | |
2998 &gt; Properties { | |
2999 &gt; code: &quot;properties&a… | |
3000 &gt; detail: Some( | |
3001 &gt; &quot;Additional pro… | |
3002 &gt; ), | |
3003 &gt; path: &quot;/jobs/build&… | |
3004 &gt; title: &quot;Property co… | |
3005 &gt; }, | |
3006 &gt; Required { | |
3007 &gt; code: &quot;required&… | |
3008 &gt; detail: None, | |
3009 &gt; path: &quot;/jobs/build/… | |
3010 &gt; title: &quot;This proper… | |
3011 &gt; }, | |
3012 &gt; ], | |
3013 &gt; }, | |
3014 &gt; ], | |
3015 &gt; }, | |
3016 &gt; ], | |
3017 &gt; } | |
3018 For full logs, run 'nix log /nix/store/j8wr6j1pvyf986sf74hqw8k31l… | |
3019 </code></pre> | |
3020 <p>Yes, the output of <code>action-validator</code> is… | |
3021 better than making <a href="https://x.com/eric_sink/status/1430954572… | |
3022 hour&quot;</a>.</p> | |
3023 <p>If you are interested in how a more advantage usage of this tec… | |
3024 including usage of functions and constants to share common steps between | |
3025 different actions, please take a look at the | |
3026 <a href="https://github.com/thiagokokada/nix-configs/tree/master/acti… | |
3027 (<a href="https://github.com/thiagokokada/nix-configs/tree/fbbc8f935c… | |
3028 in my <code>nix-config</code> repository.</p></descrip… | |
3029 Color</a> made of completely new | |
3030 parts for a friend: here is the | |
3031 <a href="https://funnyplaying.com/products/fpgbc-kit">FPGBC</a&… | |
3032 <p>The <em>FP</em> part of the name comes from | |
3033 <a href="https://en.wikipedia.org/wiki/Field-programmable_gate_array"… | |
3034 instead of software emulation this device use FPGA to reproduce the devi… | |
3035 While I am not convinced that FPGA is necessary more accurate than a good | |
3036 software emulator, one advantage of FPGA is the (possible) lower input l… | |
3037 thanks to the avoidance of complexity to handle the user input (e.g.: the | |
3038 Operational System). A quick playthrough against <a href="https://en.… | |
3039 Maniacs</a> seems to be fine, but | |
3040 I can't see much difference from my <a href="https://retrogamecorps.c… | |
3041 Mini+</a> (I will do | |
3042 more comparisons between the two devices later), that is a software emul… | |
3043 device.</p> | |
3044 <p>But I think focusing in accuracy is wrong, the main reason of g… | |
3045 like this one is for nostalgia, and this definitely hit the mark. The qu… | |
3046 of the case is as good as I remember the original, and most of the detai… | |
3047 replicate perfectly, including reproduction stickers in the back of the … | |
3048 The only differences that I can find is the usage of USB-C port for char… | |
3049 place of the barrel jack power adapter (thanks!), and the fact that the … | |
3050 bezels are smaller compared to the original (because the screen is bigge… | |
3051 doesn't include the Game Boy Color logo (that is fine in my opinion, sin… | |
3052 would look weird in the fine bezels). It even has a supposedly working &… | |
3053 Cable</a> (I don't have another | |
3054 Game Boy to test). Sadly it is missing the infrared sensor, but the usag… | |
3055 that was pretty limited anyway.</p> | |
3056 <p><a href="https://github.com/thiagokokada/blog/raw/main/posts… | |
3057 <p><a href="https://github.com/thiagokokada/blog/raw/main/posts… | |
3058 <p>So how well does it work? I can't say for sure. I don't have an… | |
3059 with me, so I am relying in backups and a | |
3060 <a href="https://en.wikipedia.org/wiki/Flashcard">flashcard</a&… | |
3061 tested works fine, a few of them have graphical issues that can be fixed… | |
3062 menu (more about it later), and some of them doesn't boot. But I don't k… | |
3063 the issue with the games not booting are because of the roms, the flashc… | |
3064 the device itself.</p> | |
3065 <p>By the way, the flashcard I am using is a cheap knockoff of an … | |
3066 GB</a>. This FPGBC came with | |
3067 firmware v1.09, while there is an update available for v1.10 in the | |
3068 <a href="https://funnyplaying.com/products/fpgbc-kit">website</… | |
3069 the new firmware where no games would boot with this knockoff Everdrive … | |
3070 had to go back to v1.09, but again, I am not sure if the issue was fact … | |
3071 am using a knockoff device or this would happen with an original Everdri… | |
3072 If you are going to buy a proper Everdrive, you probably wouldn't get a | |
3073 Everdrive GB anyway since it is discontinued, and it seems the <a hre… | |
3074 versions</a> | |
3075 have better compatibility with FPGBC.</p> | |
3076 <p>Sadly that the update didn't work, since there is this | |
3077 <a href="https://github.com/makhowastaken/GWGBC_FW">repository<… | |
3078 firmware to boot the original logo instead of the ugly FPGBC one. And ye… | |
3079 some reason the v1.09 firmware from this repository still doesn't work w… | |
3080 knockoff Everdrive.</p> | |
3081 <p>By the way, it seems the device is not easy to brick: I borked … | |
3082 update process once while trying to downgrade back to v1.09, resulting i… | |
3083 black screen when I turned on the console. But just connecting the devic… | |
3084 the computer and powering on, I could flash the firmware again and the d… | |
3085 came back to life.</p> | |
3086 <p>About the features of the device: if you press the volume butto… | |
3087 press it now), it opens the following menu:</p> | |
3088 <p><a href="https://github.com/thiagokokada/blog/raw/main/posts… | |
3089 <p>The first 2 options are the LCD backlight (<code>BKLT<… | |
3090 those, but the LCD screen seems to be IPS, and the quality is really goo… | |
3091 also looks bright enough to play even under bad lightining conditions. A… | |
3092 speaker has good quality, the sound is better than I remember, but sadly… | |
3093 maximum volume is kind low. Still should be enough for playing in a quie… | |
3094 <p><code>DISPMOD</code> is probably the most controver… | |
3095 scale you want. Anything with <code>EMU</code> at the end me… | |
3096 colors, and as far I remember it gets really close. You can also chose b… | |
3097 <code>X4</code>, <code>X4P</code> and <code&g… | |
3098 image fills the whole screen at the cost of non-integer scaling. <cod… | |
3099 integer scaling, however the image doesn't fill the whole screen. The &l… | |
3100 also includes a pixel effect that makes the image closer than the origin… | |
3101 screen. It actually looks good, but the fact that I chose a white border… | |
3102 this FPGBC makes the border really distracting. Maybe the black one is a… | |
3103 choice if you want integer scale.</p> | |
3104 <p><code>CORE</code> is simple: you can choose between… | |
3105 Color). For those who don't know, you can run Game Boy games in Game Boy… | |
3106 and they will be automatically colorised. Some people don't like this and | |
3107 prefer the colors of <code>GB</code>, so you have this optio… | |
3108 to chose the color in GB mode, for example, the green-ish colors from the | |
3109 original Game Boy or the blue-ish colors from <a href="https://ninten… | |
3110 Light</a>. And yes, you can | |
3111 choose the color palette for Game Boy games running in <code>GBC&l… | |
3112 <a href="https://gbstudiocentral.com/tips/game-boy-color-modes/">b… | |
3113 the boot screen, but it seems not working in my unit and again, not sure… | |
3114 fault is my knockoff Everdrive.</p> | |
3115 <p><code>FRAME_MIX</code> basically is an option that … | |
3116 in <a href="https://en.wikipedia.org/wiki/Wave_Race">Wave Race<… | |
3117 introducing blurriness. The reason for this is that those effects depend… | |
3118 the fact that the Game Boy screen was slow refresh, so you could rely on… | |
3119 rapidly changing pixels to create some interesting effects, but sadly th… | |
3120 effects doesn't work well in modern displays.</p> | |
3121 <p><code>GB_CLRFIX</code> is the option I mentioned be… | |
3122 get completely wrong colors for some reason, e.g.: <a href="https://e… | |
3123 Family</a>. Turning | |
3124 on fixes those games, but I am not sure if this option breaks other game… | |
3125 <p>Finally, <code>SPD</code> allows you to increase or… | |
3126 speeding up the games (including the sound). The result can be hilarious… | |
3127 think this is a nice addition to the features. Sadly you can't know what… | |
3128 default speed is, so you need to rely on sound to adjust back to the def… | |
3129 <p>So in the end, can I recommend a FPGBC? I am not sure. If you w… | |
3130 play games, I still think something like a Miyoo Mini+ is a better choic… | |
3131 only you will have access to more games from different platforms, you al… | |
3132 don't need to rely on flashcards or cartridges. Also it has way more fea… | |
3133 than FPGBC, like wireless multiplayer, | |
3134 <a href="https://retroachievements.org/">RetroArchivements</a&g… | |
3135 <p>But the actual reason to get a FPGBC is nostalgia, and for that… | |
3136 FPGBC is difficult to beat. The price of the <a href="https://funnypl… | |
3137 assemble</a> ($69.90) is cheaper than | |
3138 most Game Boy's in good condition you can find in eBay, and you get for … | |
3139 price a rechargable battery, an amazing quality screen, the PCB and the | |
3140 speaker. You need to buy separately the case and the buttons, but in tot… | |
3141 will still end up paying less, and allows you to fully customise your bu… | |
3142 And the result device is not only in mint condition, it is really conven… | |
3143 too: recharging batteries (via USB-C even) is much more convenient than … | |
3144 AA batteries, and the screen not only is better but it even has backligh… | |
3145 can also buy a fully built console for | |
3146 <a href="https://funnyplaying.com/products/fpgbc-console">$99.00&l… | |
3147 options of customisation.</p> | |
3148 <p>This is the classic case of do what I say, don't do what I do. … | |
3149 gift, and I will buy another one soon. Can't wait to play <a href="ht… | |
3150 Gold</a> in (almost) | |
3151 original hardware again.</p> | |
3152 <p><a href="https://github.com/thiagokokada/blog/raw/main/posts… | |
3153 blog</a> without I ever touching the | |
3154 <a href="https://capivaras.dev">capivaras.dev</a> website. I… | |
3155 script</a> to Go | |
3156 (<a href="https://github.com/thiagokokada/blog/blob/3c39e0f7cd58b1af8… | |
3157 since my attempt to generate proper description to the RSS feed resulted… | |
3158 slow startup times (not because of Python, but because of my usage of | |
3159 <code>nix-shell</code> since I didn't want to deal with | |
3160 <a href="https://docs.python.org/3/library/venv.html">venv</a&g… | |
3161 Python dependencies).</p> | |
3162 <p>My previous workflow of this blog already involved me writing t… | |
3163 <a href="https://neovim.io/">neovim</a>, copying and pasting… | |
3164 <a href="https://capivaras.dev">capivaras.dev</a> website an… | |
3165 that bad, except that it seems I have a heavy tendency of editing my pos… | |
3166 multiple times. Copying and pasting data between neovim and the website … | |
3167 tedious, so I decided to give up and automate the whole process.</p&g… | |
3168 <p><a href="https://mataroa.blog/">Mataroa</a> (the bl… | |
3169 <a href="https://capivaras.dev">capivaras.dev</a> run) has a… | |
3170 <a href="https://mataroa.blog/api/docs/">API</a>, and it onl… | |
3171 version of publishing working (it would take less if | |
3172 <a href="https://www.djangoproject.com/">Django</a>, the fra… | |
3173 not have a weird behavior with URLs missing a trailing <code>/<… | |
3174 lines of | |
3175 <a href="https://github.com/thiagokokada/blog/blob/51b20612335c7f4312… | |
3176 to make GitHub Actions trigger a pipeline and now I should never have to | |
3177 manually update my blog again.</p> | |
3178 <p>I could have not done this. I mean, I probably wasted more time… | |
3179 automation than I actually wasted publishing manually. But the manual pr… | |
3180 is easy to miss, and I already did multiple mistakes publishing in the m… | |
3181 method. For example, when writing the Markdown files, each post is writt… | |
3182 particular format, where the first header is considered the title, so I … | |
3183 remove it from the contents during publication. But of course, this is e… | |
3184 miss, and I had to fix this multiple times already.</p> | |
3185 <p>So yes, I think this is a good lesson on why you should automat… | |
3186 is more than just about <a href="https://xkcd.com/1205/">time savi… | |
3187 reducing mistakes and even documenting (even if poorly) a process. I mea… | |
3188 code I wrote is not that great, but I can definitely rely on it in the f… | |
3189 to remember what I need to do. It will be much faster than trying to lea… | |
3190 scratch again.</p></description><pubDate>Mon, 29 Jul 2024 00:00:00… | |
3191 got the hang of it. I first got interested in the language when I was in… | |
3192 first job, between 2016-2018. At the time the language was a completely | |
3193 different beast: no modules, no generics, no easy way to error wrap yet,… | |
3194 <p>Go forward 2023 (no pun indented), I wrote my <a href="https… | |
3195 Go</a>, wrote some scripts | |
3196 at <code>$CURRENT_JOB</code> in the language, and now wrote … | |
3197 library</a> (with an <a href="https://kokada.dev/blog/writing-n… | |
3198 way to run | |
3199 CI</a>). I am also | |
3200 writing more | |
3201 <a href="https://github.com/thiagokokada/nix-configs/blob/8c559527ed1… | |
3202 in the language, where I would prefer to use Bash or Python before. Heck… | |
3203 this blog is automatically published with a <a href="https://kokada.d… | |
3204 script</a>, | |
3205 that used to be a <a href="https://kokada.dev/blog/using-github-as-a-… | |
3206 one</a> before. I can | |
3207 say that nowadays it is another language in my toolbox, and while it is … | |
3208 love and hate relationship, recently it is more about love and less abou… | |
3209 <p>The points that I love about Go is probably obvious for some, b… | |
3210 interesting to talk about anyway. The fact that the language generates s… | |
3211 binaries by default and have fast compilation times is something that I | |
3212 apreciate since I first heard about the language, and now that I am usin… | |
3213 language frequently, are points thatI appreciate even more. Something ab… | |
3214 getting almost instant feedback after changing a line of code and runnin… | |
3215 main reason why I am using the language more frequently for scripts.<… | |
3216 <p>Then we have the fast startup times. I am kind of sensitive to … | |
3217 especially of command line utilities that need to answer fast when I exp… | |
3218 them to be fast (e.g.: <code>foo --help</code>). This is one… | |
3219 issues in Python, especially for more complex programs, but in Go it is … | |
3220 an issue.</p> | |
3221 <p>Modules are also fantastic. It is not without its weirdness (li… | |
3222 Go ecossystem), but the fact that it is so easy to add and manage depend… | |
3223 in a project using only the <code>go</code> CLI is great. I … | |
3224 hash of every dependency, making it reproducible (well, probably not at … | |
3225 level, but still reproducible).</p> | |
3226 <p>Since I started to talk about <code>go</code> CLI, … | |
3227 can manage dependencies, generate documentation, format code, lint, run | |
3228 tests/<a href="https://blog.logrocket.com/benchmarking-golang-improve… | |
3229 check code for <a href="https://go.dev/doc/articles/race_detector">… | |
3230 with just the &quot;compiler&quot; for the language is excelent.… | |
3231 the best developer experiences I know in any programming language.</p… | |
3232 <p>I will not even talk about the things that everyone talks about… | |
3233 <a href="https://go.dev/doc/effective_go#goroutines">goroutines<… | |
3234 think I can add anything interesting to the topic.</p> | |
3235 <p>Now for the parts that I like less, the test part still quirks … | |
3236 not based in assertions, but thankfully it is easy to write assertions w… | |
3237 generics nowadays:</p> | |
3238 <pre class="chroma"><code><span class="line"><span … | |
3239 </span></span><span class="line"><span class="cl"&g… | |
3240 </span></span><span class="line"><span class="cl"&g… | |
3241 </span></span><span class="line"><span class="cl"&g… | |
3242 </span></span><span class="line"><span class="cl"&g… | |
3243 </span></span><span class="line"><span class="cl"&g… | |
3244 </span></span><span class="line"><span class="cl"&g… | |
3245 </span></span><span class="line"><span class="cl"&g… | |
3246 </span></span><span class="line"><span class="cl"&g… | |
3247 </span></span><span class="line"><span class="cl"&g… | |
3248 </span></span><span class="line"><span class="cl"&g… | |
3249 </span></span><span class="line"><span class="cl"&g… | |
3250 </span></span><span class="line"><span class="cl"&g… | |
3251 </span></span><span class="line"><span class="cl"&g… | |
3252 </span></span><span class="line"><span class="cl"&g… | |
3253 </span></span></span></code></pre><p>… | |
3254 about <a href="https://github.com/stretchr/testify">testify</a&… | |
3255 libraries, but quoting <a href="https://www.youtube.com/watch?v=PAAkC… | |
3256 Pike</a> here, &quot;a little | |
3257 copying is better than a little dependency&quot;. As long the code y… | |
3258 trivial, it is better to duplicate the code than try to import a depende… | |
3259 <p>About another piece of code that generics allows me to write an… | |
3260 up re-writing in every project is the <code>must*</code> fam… | |
3261 <pre class="chroma"><code><span class="line"><span … | |
3262 </span></span><span class="line"><span class="cl"&g… | |
3263 </span></span><span class="line"><span class="cl"&g… | |
3264 </span></span><span class="line"><span class="cl"&g… | |
3265 </span></span><span class="line"><span class="cl"&g… | |
3266 </span></span><span class="line"><span class="cl"&g… | |
3267 </span></span><span class="line"><span class="cl"&g… | |
3268 </span></span><span class="line"><span class="cl"&g… | |
3269 </span></span><span class="line"><span class="cl"&g… | |
3270 </span></span><span class="line"><span class="cl"&g… | |
3271 </span></span><span class="line"><span class="cl"&g… | |
3272 </span></span><span class="line"><span class="cl"&g… | |
3273 </span></span><span class="line"><span class="cl"&g… | |
3274 </span></span><span class="line"><span class="cl"&g… | |
3275 </span></span><span class="line"><span class="cl"&g… | |
3276 </span></span><span class="line"><span class="cl"&g… | |
3277 </span></span><span class="line"><span class="cl"&g… | |
3278 </span></span></span></code></pre><p>… | |
3279 want to handle each error: if I have an error, I want the program to hal… | |
3280 print a stack trace (exactly as I would have with a language with except… | |
3281 It basically allow me to convert code from:</p> | |
3282 <pre class="chroma"><code><span class="line"><span … | |
3283 </span></span><span class="line"><span class="cl"&g… | |
3284 </span></span><span class="line"><span class="cl"&g… | |
3285 </span></span><span class="line"><span class="cl"&g… | |
3286 </span></span></code></pre><p>To:</p> | |
3287 <pre class="chroma"><code><span class="line"><span … | |
3288 </span></span></code></pre><p>This brings … | |
3289 something great.</p> | |
3290 <p>Finally, for the things that I hate, well the biggest one curre… | |
3291 of nullability (or in Go terms, | |
3292 <a href="https://github.com/golang/go/issues/49202">nillability<… | |
3293 languages that has it, like Kotlin, or even something like | |
3294 <a href="https://www.mypy-lang.org/">mypy</a>, this is one o… | |
3295 changes the developer experience. I also still don't like the error hand… | |
3296 (but <code>must*</code> goes far by improving the situation,… | |
3297 it), especially because it is easy to lose context on it:</p> | |
3298 <pre class="chroma"><code><span class="line"><span … | |
3299 </span></span></span><span class="line"><span… | |
3300 </span></span><span class="line"><span class="cl"&g… | |
3301 </span></span><span class="line"><span class="cl"&g… | |
3302 </span></span><span class="line"><span class="cl"&g… | |
3303 </span></span><span class="line"><span class="cl"&g… | |
3304 </span></span><span class="line"><span class="cl"&g… | |
3305 </span></span><span class="line"><span class="cl"&g… | |
3306 </span></span><span class="line"><span class="cl"&g… | |
3307 </span></span><span class="line"><span class="cl"&g… | |
3308 </span></span></span><span class="line"><span… | |
3309 </span></span><span class="line"><span class="cl"&g… | |
3310 </span></span><span class="line"><span class="cl"&g… | |
3311 </span></span><span class="line"><span class="cl"&g… | |
3312 </span></span><span class="line"><span class="cl"&g… | |
3313 </span></span><span class="line"><span class="cl"&g… | |
3314 </span></span><span class="line"><span class="cl"&g… | |
3315 </span></span></code></pre><p>I also have … | |
3316 prefer immutability by default, but I find that in general as long as yo… | |
3317 your functions at a reasonable size it is generally fine.</p> | |
3318 <p>And for a language that is supposed to be straightforward, it i… | |
3319 much magic the language relies on, in the form of things like <a href… | |
3320 <code>main</code></a> packages, name capitalisation to | |
3321 indicate visibility (<code>private</code> vs <code>Pub… | |
3322 (e.g.: <code>foo_amd64.go</code>, <code>bar_linux.go&l… | |
3323 etc.</p> | |
3324 <p>I expect to write more Go code going forward. Not because it is… | |
3325 language or whatever, but just because it a is language that has some re… | |
3326 good qualities that makes the language attractive even with the issues t… | |
3327 have. That makes it a reasonable good language, and at least for me this… | |
3328 good enough.</p></description><pubDate>Mon, 29 Jul 2024 00:00:00 +… | |
3329 ecosystem work, I just wanted to get it to run.</p> | |
3330 <p>The easiest way to get a script to run if you use Nix is to use… | |
3331 many of you probably know, you can add <code>nix-shell</code>… | |
3332 to run them as <code>./script</code>. This was a PHP script … | |
3333 Easy right?</p> | |
3334 <pre class="chroma"><code><span class="line"><span … | |
3335 </span></span></span><span class="line"><span… | |
3336 </span></span></span><span class="line"><span… | |
3337 </span></span><span class="line"><span class="cl"&g… | |
3338 </span></span></code></pre><p>And:</p&g… | |
3339 <pre class="chroma"><code><span class="line"><span … | |
3340 </span></span><span class="line"><span class="cl"&g… | |
3341 </span></span></span></code></pre><p>… | |
3342 script if used. I removed <code>declare(strict_types=1)</code&g… | |
3343 I don't have enough expertise in PHP to know if this would be safe or no… | |
3344 <p>I decided to try something that initially looked really dumb:&l… | |
3345 <pre class="chroma"><code><span class="line"><span … | |
3346 </span></span></span><span class="line"><span… | |
3347 </span></span><span class="line"><span class="cl"&g… | |
3348 </span></span><span class="line"><span class="cl"&g… | |
3349 </span></span></span></code></pre><p>… | |
3350 <pre class="chroma"><code><span class="line"><span … | |
3351 </span></span><span class="line"><span class="cl"&g… | |
3352 </span></span></span></code></pre><p>… | |
3353 <p>Eventually I found this | |
3354 <a href="https://github.com/NixOS/nix/issues/2570#issuecomment-446220… | |
3355 Nix issue talking about cases where <code>nix-shell</code> s… | |
3356 like the classic case of a <a href="https://github.com/NixOS/nix/issu… | |
3357 feature</a>.</p> | |
3358 <p><em>Update:</em> after posting this in | |
3359 <a href="https://lobste.rs/s/gkcgza/quick_bits_nix_shell_is_cursed"&g… | |
3360 someone decided to open a <a href="https://github.com/NixOS/nix/pull/… | |
3361 Request</a> to document this behavior. | |
3362 Also the equivalent for the new <a href="https://nix.dev/manual/nix/2… | |
3363 CLI</a> | |
3364 explicitly documents this behavior:</p> | |
3365 <blockquote> | |
3366 <p>Note that the <code>#! nix</code> lines don't need … | |
3367 accomodate other interpreters.</p> | |
3368 </blockquote></description><pubDate>Sat, 27 Jul 2024 00:00:00 +000… | |
3369 <a href="https://gluer.org/">@ratsclub</a> to give me free a… | |
3370 <a href="https://capivaras.dev/">capivaras.dev</a>. But cons… | |
3371 platform is supposed to be, I want to have at least somewhere to have a … | |
3372 of my posts. I know <a href="https://mataroa.blog/">Mataroa</a&… | |
3373 <a href="https://capivaras.dev/">capivaras.dev</a> runs, has… | |
3374 I want something more reliable.</p> | |
3375 <p>I am writing all my posts in Markdown (the format that <a hr… | |
3376 supports</a>) files inside | |
3377 <a href="https://neovim.io/">neovim</a> anyway, so why not s… | |
3378 Git? So this is what I did, I now have an unofficial mirror in | |
3379 <a href="https://github.com/thiagokokada/blog">GitHub</a>.&l… | |
3380 <p>While I am here, why not overcomplicate? Can I make an usable b… | |
3381 from GitHub? And by that I don't mean GitHub pages, the repository itsel… | |
3382 mean, it already renders Markdown files by default, so no need to do any… | |
3383 in that space. To reach feature parity with | |
3384 <a href="https://capivaras.dev/">capivaras.dev</a>, I only n… | |
3385 (since comments are not supported anyway). No need for newsletter since … | |
3386 has a <a href="https://docs.github.com/en/account-and-profile/managin… | |
3387 feature</a> | |
3388 already.</p> | |
3389 <p>After a couple of hours hacking a Python script, you can see th… | |
3390 monstrosity <a href="https://github.com/thiagokokada/blog">here<… | |
3391 <code>gen_blog.py</code>, is available at the same repositor… | |
3392 <a href="https://github.com/thiagokokada/blog/blob/c8986d1ab1b94c0986… | |
3393 It automatically generates an index at | |
3394 <a href="https://github.com/thiagokokada/blog/blob/main/README.md">… | |
3395 each blog post and a | |
3396 <a href="https://raw.githubusercontent.com/thiagokokada/blog/main/rss… | |
3397 file at the root of the repository.</p> | |
3398 <p>Instead of trying to explain the code, I am going to explain th… | |
3399 because I think that if you want to replicate this idea it is better to … | |
3400 it in a way that you understand. It shouldn't take more than 2 hours in … | |
3401 decent programming language. But if you really want, the script itself is | |
3402 licensed in <a href="https://en.wikipedia.org/wiki/WTFPL">WTFPL<… | |
3403 uses Python 3's standard library and should work in any relatively recent | |
3404 version (anything newer than 3.9 should work).</p> | |
3405 <p>So the idea is basically to organise the repository and the Mar… | |
3406 easy way that makes it trivial to parse in a deterministic way. For exam… | |
3407 repository is organised in the following way:</p> | |
3408 <pre><code>. | |
3409 ├── 2024-07-26 | |
3410 │ ├── 01-writing-nixos-tests-for-fun-and-profit.md | |
3411 │ └── 02-using-github-as-a-bad-blog-platform.md &lt;- this… | |
3412 ├── gen_blog.py | |
3413 ├── README.md | |
3414 └── rss.xml | |
3415 </code></pre> | |
3416 <p>Each day that you write a new blog post will be on its own dire… | |
3417 nice because Markdown files may include extra files than the posts thems… | |
3418 e.g.: images, and this organisation make it trivial to organise everythi… | |
3419 <p>Each post has its own Markdown file. I put a two digit number b… | |
3420 to ensure that when publishing multiple posts at the same day I keep the… | |
3421 the same order of publishing. But if you don't care about it, you can ju… | |
3422 the files whatever you want.</p> | |
3423 <p>Also, I am assuming that each Markdown file has a header starti… | |
3424 and that is the title of the blog post.</p> | |
3425 <p>Using the above organisation, I have this function that scrapes… | |
3426 and collect the necessary information to generate the index and RSS file… | |
3427 <pre class="chroma"><code><span class="line"><span … | |
3428 </span></span><span class="line"><span class="cl"&g… | |
3429 </span></span><span class="line"><span class="cl"&g… | |
3430 </span></span><span class="line"><span class="cl"&g… | |
3431 </span></span><span class="line"><span class="cl"&g… | |
3432 </span></span><span class="line"><span class="cl"&g… | |
3433 </span></span><span class="line"><span class="cl"&g… | |
3434 </span></span><span class="line"><span class="cl"&g… | |
3435 </span></span><span class="line"><span class="cl"&g… | |
3436 </span></span><span class="line"><span class="cl"&g… | |
3437 </span></span><span class="line"><span class="cl"&g… | |
3438 </span></span><span class="line"><span class="cl"&g… | |
3439 </span></span><span class="line"><span class="cl"&g… | |
3440 </span></span><span class="line"><span class="cl"&g… | |
3441 </span></span><span class="line"><span class="cl"&g… | |
3442 </span></span><span class="line"><span class="cl"&g… | |
3443 </span></span><span class="line"><span class="cl"&g… | |
3444 </span></span><span class="line"><span class="cl"&g… | |
3445 </span></span><span class="line"><span class="cl"&g… | |
3446 </span></span><span class="line"><span class="cl"&g… | |
3447 </span></span><span class="line"><span class="cl"&g… | |
3448 </span></span><span class="line"><span class="cl"&g… | |
3449 </span></span><span class="line"><span class="cl"&g… | |
3450 </span></span><span class="line"><span class="cl"&g… | |
3451 </span></span><span class="line"><span class="cl"&g… | |
3452 </span></span><span class="line"><span class="cl"&g… | |
3453 </span></span><span class="line"><span class="cl"&g… | |
3454 </span></span><span class="line"><span class="cl"&g… | |
3455 </span></span><span class="line"><span class="cl"&g… | |
3456 </span></span><span class="line"><span class="cl"&g… | |
3457 </span></span></code></pre><p>Some interes… | |
3458 is a draft post, and ignore it from my scraper. I added a bunch of <c… | |
3459 prints to make sure that the me in the future doesn't do anything dumb. … | |
3460 sorting in reverse since reverse chronological order is the one most peo… | |
3461 expect in blogs (i.e.: more recent blog posts at top).</p> | |
3462 <p>After running the function above, I have a resulting dictionary… | |
3463 to generate either a <code>README.md</code> file or Markdown… | |
3464 <pre class="chroma"><code><span class="line"><span … | |
3465 </span></span><span class="line"><span class="cl"&g… | |
3466 </span></span><span class="line"><span class="cl"&g… | |
3467 </span></span><span class="line"><span class="cl"&g… | |
3468 </span></span><span class="line"><span class="cl"&g… | |
3469 </span></span><span class="line"><span class="cl"&g… | |
3470 </span></span><span class="line"><span class="cl"&g… | |
3471 </span></span><span class="line"><span class="cl"&g… | |
3472 </span></span><span class="line"><span class="cl"&g… | |
3473 </span></span><span class="line"><span class="cl"&g… | |
3474 </span></span><span class="line"><span class="cl"&g… | |
3475 </span></span><span class="line"><span class="cl"&g… | |
3476 </span></span><span class="line"><span class="cl"&g… | |
3477 </span></span><span class="line"><span class="cl"&g… | |
3478 </span></span><span class="line"><span class="cl"&g… | |
3479 </span></span><span class="line"><span class="cl"&g… | |
3480 </span></span><span class="line"><span class="cl"&g… | |
3481 </span></span><span class="line"><span class="cl"&g… | |
3482 </span></span><span class="line"><span class="cl"&g… | |
3483 </span></span><span class="line"><span class="cl"&g… | |
3484 </span></span><span class="line"><span class="cl"&g… | |
3485 </span></span><span class="line"><span class="cl"&g… | |
3486 </span></span><span class="line"><span class="cl"&g… | |
3487 </span></span><span class="line"><span class="cl"&g… | |
3488 </span></span><span class="line"><span class="cl"&g… | |
3489 </span></span><span class="line"><span class="cl"&g… | |
3490 </span></span><span class="line"><span class="cl"&g… | |
3491 </span></span><span class="line"><span class="cl"&g… | |
3492 </span></span><span class="line"><span class="cl"&g… | |
3493 </span></span><span class="line"><span class="cl"&g… | |
3494 </span></span><span class="line"><span class="cl"&g… | |
3495 </span></span><span class="line"><span class="cl"&g… | |
3496 </span></span><span class="line"><span class="cl"&g… | |
3497 </span></span><span class="line"><span class="cl"&g… | |
3498 </span></span><span class="line"><span class="cl"&g… | |
3499 </span></span><span class="line"><span class="cl"&g… | |
3500 </span></span><span class="line"><span class="cl"&g… | |
3501 </span></span><span class="line"><span class="cl"&g… | |
3502 </span></span><span class="line"><span class="cl"&g… | |
3503 </span></span><span class="line"><span class="cl"&g… | |
3504 </span></span><span class="line"><span class="cl"&g… | |
3505 </span></span><span class="line"><span class="cl"&g… | |
3506 </span></span><span class="line"><span class="cl"&g… | |
3507 </span></span></code></pre><p>To publish a… | |
3508 <blockquote> | |
3509 <p>README.md` at the root of the repository, and see the magic hap… | |
3510 </blockquote> | |
3511 <p>It works much better than I initially anticipated. The <code… | |
3512 populated with the titles and links. The RSS is kind of empty since it h… | |
3513 description, but it seems to work fine (at least in | |
3514 <a href="https://www.inoreader.com/">Inoreader</a>, my RSS r… | |
3515 probably fill the post description with more information if I really wan… | |
3516 it is enough for now (update: it is working now, you just need to render… | |
3517 Markdown as HTML and escape the tags; | |
3518 <a href="https://github.com/thiagokokada/blog/blob/9506051cc3d49f2033… | |
3519 for the updated script). Not sure who is that interested in my writing t… | |
3520 will want to use this RSS feed instead the one available in | |
3521 <a href="https://kokada.capivaras.dev/rss/">capivaras.dev</a>… | |
3522 <p>Also, while I am using GitHub here, the same idea would work in… | |
3523 sr.ht or whatever. As long as your source hub supports Markdown files it… | |
3524 work.</p> | |
3525 <p>So that is it. I am not saying this is a good idea for your pri… | |
3526 platform or whatever, and I still prefer to publish to a platform that d… | |
3527 track users or have tons of JavaScript or whatever. But if you want a ba… | |
3528 your posts and you are already writing Markdown anyway, well, there are … | |
3529 ways to do it I think.</p> | |
3530 <p><em>Update:</em> I rewrote the script again using Go | |
3531 (<a href="https://github.com/thiagokokada/blog/blob/3ece3853e7dd32977… | |
3532 The reason for it is because when I started rendering Markdown (for | |
3533 descriptions) the Python version got quite slow (not the fault of Python | |
3534 itself, mostly because of the usage of <code>nix-shell</code>… | |
3535 something that Go doesn't need). Took about half an hour, showing how ea… | |
3536 is to do the same.</p></description><pubDate>Fri, 26 Jul 2024 00:0… | |
3537 project</a> writing an IPC library in | |
3538 Go for <a href="https://hyprland.org/">Hyprland</a>, a Windo… | |
3539 <p>Once I got past the Work-in-Progress phase, I realise I had an … | |
3540 some tests, but I was running then inside my system running Hyprland. An… | |
3541 tests themselves were annoying: since they send commands to the current … | |
3542 Hyprland instance, I was having programs being opened and settings being | |
3543 changed, because this was the only way to have a reasonable good confide… | |
3544 that what I was doing was correct. So I need to do like any good develop… | |
3545 implement a CI, but how?</p> | |
3546 <p>One approach would be to create something like a mock client an… | |
3547 my mock. Since this mock wouldn't need a running Hyprland instance the t… | |
3548 could run everywhere (even in non-Linux systems!), but they wouldn't be … | |
3549 useful. Mocks are great for testing business logic, but not really for m… | |
3550 sure everything is working correctly.</p> | |
3551 <p>I need something more akin to an integration test, but this is … | |
3552 not like I am doing integration with e.g.: PostgreSQL that has thousands… | |
3553 libraries available to make integration tests easier, I am doing integra… | |
3554 with a Window Manager that is a moving target with multiple breaking cha… | |
3555 each release. And this is where NixOS tests enter, a way to run tests in… | |
3556 Virtual Machines configured in Nix.</p> | |
3557 <p>I am a long time NixOS user and commiter, but I never wrote a N… | |
3558 outside of <a href="https://github.com/NixOS/nixpkgs">nixpkgs</… | |
3559 it was possible, and after doing a quick reading of the <a href="http… | |
3560 entry</a> about it, I was ready to | |
3561 start.</p> | |
3562 <p>The first part is to call <code>pkgs.testers.runNixOSTest… | |
3563 as any other NixOS system, e.g.:</p> | |
3564 <pre class="chroma"><code><span class="line"><span … | |
3565 </span></span><span class="line"><span class="cl"&g… | |
3566 </span></span><span class="line"><span class="cl"&g… | |
3567 </span></span><span class="line"><span class="cl"&g… | |
3568 </span></span><span class="line"><span class="cl"&g… | |
3569 </span></span><span class="line"><span class="cl"&g… | |
3570 </span></span><span class="line"><span class="cl"&g… | |
3571 </span></span><span class="line"><span class="cl"&g… | |
3572 </span></span><span class="line"><span class="cl"&g… | |
3573 </span></span><span class="line"><span class="cl"&g… | |
3574 </span></span><span class="line"><span class="cl"&g… | |
3575 </span></span><span class="line"><span class="cl"&g… | |
3576 </span></span><span class="line"><span class="cl"&g… | |
3577 </span></span><span class="line"><span class="cl"&g… | |
3578 </span></span><span class="line"><span class="cl"&g… | |
3579 </span></span><span class="line"><span class="cl"&g… | |
3580 </span></span><span class="line"><span class="cl"&g… | |
3581 </span></span><span class="line"><span class="cl"&g… | |
3582 </span></span><span class="line"><span class="cl"&g… | |
3583 </span></span><span class="line"><span class="cl"&g… | |
3584 </span></span><span class="line"><span class="cl"&g… | |
3585 </span></span><span class="line"><span class="cl"&g… | |
3586 </span></span><span class="line"><span class="cl"&g… | |
3587 </span></span><span class="line"><span class="cl"&g… | |
3588 </span></span><span class="line"><span class="cl"&g… | |
3589 </span></span><span class="line"><span class="cl"&g… | |
3590 </span></span><span class="line"><span class="cl"&g… | |
3591 </span></span><span class="line"><span class="cl"&g… | |
3592 </span></span><span class="line"><span class="cl"&g… | |
3593 </span></span><span class="line"><span class="cl"&g… | |
3594 </span></span><span class="line"><span class="cl"&g… | |
3595 </span></span><span class="line"><span class="cl"&g… | |
3596 </span></span><span class="line"><span class="cl"&g… | |
3597 </span></span><span class="line"><span class="cl"&g… | |
3598 </span></span><span class="line"><span class="cl"&g… | |
3599 </span></span><span class="line"><span class="cl"&g… | |
3600 </span></span><span class="line"><span class="cl"&g… | |
3601 </span></span><span class="line"><span class="cl"&g… | |
3602 </span></span><span class="line"><span class="cl"&g… | |
3603 </span></span><span class="line"><span class="cl"&g… | |
3604 </span></span><span class="line"><span class="cl"&g… | |
3605 </span></span></code></pre><p>A few detail… | |
3606 is to setup things like a normal user account, add some extra packages w… | |
3607 for testing, add Hyprland itself and configure auto-login. I have no ide… | |
3608 painful it would be to automatise all those steps in e.g.: Ansible, but … | |
3609 are in a few lines of Nix code. This is, of course, thanks to all the | |
3610 contributors to nixpkgs that implement something that help their own use… | |
3611 but once combined make it greater than the sum of the parts.</p> | |
3612 <p>Second is something that I took a while to figure out: how to e… | |
3613 acceleration inside the VM. You see, Hyprland, different from other Wind… | |
3614 Managers, requires OpenGL support. This is basically why the flag <co… | |
3615 rendering via LLVMPipe, that while being slow since it is rendered in CP… | |
3616 sufficient for this case.</p> | |
3617 <p>Putting the above code inside a | |
3618 <a href="https://wiki.nixos.org/wiki/Flakes"><code>flake.nix… | |
3619 something similar to:</p> | |
3620 <pre class="chroma"><code><span class="line"><span … | |
3621 </span></span><span class="line"><span class="cl"&g… | |
3622 </span></span><span class="line"><span class="cl"&g… | |
3623 </span></span><span class="line"><span class="cl"&g… | |
3624 </span></span><span class="line"><span class="cl"&g… | |
3625 </span></span><span class="line"><span class="cl"&g… | |
3626 </span></span><span class="line"><span class="cl"&g… | |
3627 </span></span><span class="line"><span class="cl"&g… | |
3628 </span></span><span class="line"><span class="cl"&g… | |
3629 </span></span><span class="line"><span class="cl"&g… | |
3630 </span></span><span class="line"><span class="cl"&g… | |
3631 </span></span><span class="line"><span class="cl"&g… | |
3632 </span></span><span class="line"><span class="cl"&g… | |
3633 </span></span><span class="line"><span class="cl"&g… | |
3634 </span></span><span class="line"><span class="cl"&g… | |
3635 </span></span><span class="line"><span class="cl"&g… | |
3636 </span></span><span class="line"><span class="cl"&g… | |
3637 </span></span><span class="line"><span class="cl"&g… | |
3638 </span></span><span class="line"><span class="cl"&g… | |
3639 </span></span><span class="line"><span class="cl"&g… | |
3640 </span></span></code></pre><p>I can now ru… | |
3641 VM. However it is not really useful right now, since we didn't add any u… | |
3642 code in <code>testScript</code>, the core of the NixOS test … | |
3643 <code>nix build .#checks.x86_64-linux.testVm.driverInteractive<… | |
3644 <code>./result/bin/nixos-test-driver</code>: this will start… | |
3645 manually play with the VM (try typing <code>start_all()</code&g… | |
3646 <p>The <code>testScript</code> is a sequence of Python… | |
3647 actions, such as starting VMs, executing commands in the VMs, and so on.… | |
3648 about it in the official | |
3649 <a href="https://nixos.org/manual/nixos/stable/index.html#sec-nixos-t… | |
3650 For our case we can start with something like this:</p> | |
3651 <pre class="chroma"><code><span class="line"><span … | |
3652 </span></span><span class="line"><span class="cl"&g… | |
3653 </span></span></span><span class="line"><span… | |
3654 </span></span></span><span class="line"><span… | |
3655 </span></span></span><span class="line"><span… | |
3656 </span></span></span><span class="line"><span… | |
3657 </span></span></span><span class="line"><span… | |
3658 </span></span><span class="line"><span class="cl"&g… | |
3659 </span></span></code></pre><p>The first st… | |
3660 one, called <code>machine</code>. We send two further comman… | |
3661 <code>wait_for_unit(&quot;multi-user.target&quot;)</cod… | |
3662 <code>wait_for_file(&quot;/home/alice/test-finished&quot;)… | |
3663 <p>The first command waits until systemd's <code>multi-user.… | |
3664 way to ensure that the system is ready for further commands. The second … | |
3665 wait for a file called <code>test-finished</code> to appear … | |
3666 a canary), but how can we generate this file?</p> | |
3667 <p>Remember that we added <code>programs.bash.loginShellInit… | |
3668 automatically starts Hyprland when Alice logs in. We need to modify that | |
3669 command to run the Go tests from our library. The good thing is that Hyp… | |
3670 configuration file supports a | |
3671 <a href="https://wiki.hyprland.org/Configuring/Keywords/#executing"&g… | |
3672 command that runs a command during Hyprland launch. We can abuse this to… | |
3673 a terminal emulator and run our tests:</p> | |
3674 <pre class="chroma"><code><span class="line"><span … | |
3675 </span></span><span class="line"><span class="cl"&g… | |
3676 </span></span><span class="line"><span class="cl"&g… | |
3677 </span></span><span class="line"><span class="cl"&g… | |
3678 </span></span></span><span class="line"><span… | |
3679 </span></span></span><span class="line"><span… | |
3680 </span></span></span><span class="line"><span… | |
3681 </span></span></span><span class="line"><span… | |
3682 </span></span></span><span class="line"><span… | |
3683 </span></span></span><span class="line"><span… | |
3684 </span></span></span><span class="line"><span… | |
3685 </span></span><span class="line"><span class="cl"&g… | |
3686 </span></span></span><span class="line"><span… | |
3687 </span></span></span><span class="line"><span… | |
3688 </span></span><span class="line"><span class="cl"&g… | |
3689 </span></span></span><span class="line"><span… | |
3690 </span></span></span><span class="line"><span… | |
3691 </span></span><span class="line"><span class="cl"&g… | |
3692 </span></span></code></pre><p>So we are ba… | |
3693 <a href="https://sw.kovidgoyal.net/kitty/">Kitty</a> termina… | |
3694 a shell script that runs the test. Since we have no way to get the resul… | |
3695 the test, we pipe the output to a file that we can collect later (e.g.: | |
3696 <code>machine.succeded(&quot;cat /home/alice/test.log&quot… | |
3697 create the canary file <code>$HOME/test-finished</code>, tha… | |
3698 knows that the test finished and it can destroy the VM safely.</p> | |
3699 <p>If you want to take a look at the final result, it is | |
3700 <a href="https://github.com/thiagokokada/hyprland-go/blob/v0.0.1/flak… | |
3701 tests run in any Linux machine that supports KVM, and also works in <… | |
3702 Actions</a> | |
3703 thanks to the the | |
3704 <a href="https://github.com/DeterminateSystems/nix-installer-action"&… | |
3705 <p>And now I have a proper CI pipeline in a way that I never imagi… | |
3706 |