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