jcs.org.atom.xml - sfeed_tests - sfeed tests and RSS and Atom files | |
git clone git://git.codemadness.org/sfeed_tests | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
jcs.org.atom.xml (113525B) | |
--- | |
1 <?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/200… | |
2 <a href="/2021/01/27/x1nano">X1 Nano</a> | |
3 and learning that all future Intel “Evo”-branded laptops would lack … | |
4 I started thinking about returning to my M1 MacBook full-time or buildin… | |
5 OpenBSD desktop. | |
6 I chose the latter, building my first desktop machine in many years.<… | |
7 | |
8 <p><img src="/images/2021-07-19-hero-665x246.jpg" src… | |
9 | |
10 <h2 class="no_toc" id="table-of-contents">Tabl… | |
11 | |
12 <ol id="markdown-toc"> | |
13 <li><a href="#architecture" id="markdown-toc-a… | |
14 <li><a href="#monitor" id="markdown-toc-monito… | |
15 <li><a href="#case" id="markdown-toc-case"… | |
16 <li><a href="#cpu-and-motherboard" id="markdow… | |
17 <li><a href="#ram-and-ssd" id="markdown-toc-ra… | |
18 <li><a href="#keyboard-and-mouse" id="markdown… | |
19 <li><a href="#openbsd" id="markdown-toc-openbs… | |
20 <li><a href="#temperatures" id="markdown-toc-t… | |
21 </ol> | |
22 | |
23 <h2 id="architecture">Architecture</h2> | |
24 | |
25 <p>I briefly considered an arm64 CPU and motherboard, but the hard… | |
26 OpenBSD/arm64 is not yet reliable enough for my daily use and the lead-t… | |
27 ordering a | |
28 <a href="https://twitter.com/bluerise/status/1352587849359568898… | |
29 was many weeks out.</p> | |
30 | |
31 <p>I decided to go with an amd64 system since the OpenBSD/amd64 pl… | |
32 mature and I know it quite well. | |
33 Beyond that, my only requirements for my new desktop were:</p> | |
34 | |
35 <ul> | |
36 <li>Excellent OpenBSD support</li> | |
37 <li>Fanless with no coil whine</li> | |
38 <li>A high-resolution, small monitor (more on that later)</li… | |
39 </ul> | |
40 | |
41 <p>Ever since reading | |
42 <a href="https://fabiensanglard.net/the_beautiful_machine/index.… | |
43 about building a system with a | |
44 <a href="https://streacom.com/products/db4-fanless-mini-itx-case… | |
45 I knew I wanted that case in particular since it looks beautiful and cou… | |
46 passively cool a 65W processor.</p> | |
47 | |
48 <h2 id="monitor">Monitor</h2> | |
49 | |
50 <p>After the case, the next component I chose was the monitor. | |
51 In retrospect, this would make everything else more complicated, but I a… | |
52 picky about the screens in the laptops that I buy, so I wanted to make s… | |
53 desktop display was of high quality.</p> | |
54 | |
55 <p>I’ve always chosen smaller (&lt;= 14”) laptop screens s… | |
56 horizontal space disorienting. | |
57 I prefer to separate tasks with virtual desktops rather than have everyt… | |
58 one giant screen. | |
59 I wanted a smaller monitor that I could have closer to me, lower on my d… | |
60 angled slightly upward like a laptop screen.</p> | |
61 | |
62 <p>In addition to good image reproduction, I needed a monitor with… | |
63 resolution that could display Firefox in 1.5x or 2x mode | |
64 (<code class="language-plaintext highlighter-rouge">layo… | |
65 While not an absolute requirement, integrated speakers would be a nice o… | |
66 the monitor so I wouldn’t have to buy separate ones and find a place f… | |
67 my desk.</p> | |
68 | |
69 <p>After some research, I chose the | |
70 <a href="https://www.lg.com/us/monitors/lg-22MD4KA-B-4k-uhd-led-… | |
71 monitor</a> | |
72 with a resolution of 4096x2304. | |
73 This particular version of the LG UltraFine is no longer being produced,… | |
74 newer 24” version was larger but had a smaller resolution (3840x2160),… | |
75 newer 5K model (5120x2880) requires Thunderbolt. | |
76 I found a 21.5” version on eBay that was in great condition in the ori… | |
77 | |
78 <p>Since the LG UltraFine had a VESA mount option, I purchased an | |
79 <a href="https://amzn.to/3ivzmgP">Ergotron LX monitor ar… | |
80 to be able to position the monitor however I wanted on my desk.</p> | |
81 | |
82 <p><a href="/images/2021-07-19-monitor_arm-large.jpg"… | |
83 | |
84 <p>After some testing with the monitor once I got it, I realized t… | |
85 a desktop system might be difficult because it uses a single USB-C | |
86 (non-Thunderbolt) cable for its display and audio, but it also has a 3-p… | |
87 USB-C hub on the back of it and its brightness controls and ambient ligh… | |
88 also connect over that single USB-C cable.</p> | |
89 | |
90 <p>This all works by using the USB-C cable for data as usual but i… | |
91 screen data over | |
92 <a href="https://www.benq.com/en-us/knowledge-center/knowledge/u… | |
93 using dedicated pins of the USB-C cable (“Alt Mode”). | |
94 This requires that the computer it’s connecting to have a USB-C port t… | |
95 break out those pins and route them to the DisplayPort signal of the GPU… | |
96 also handling the data devices of the USB-C connection. | |
97 Using an external GPU (“video card” back in my day) would be difficu… | |
98 even if it had a USB-C connector (most just have HDMI and/or DisplayPort… | |
99 would need to somehow route the data from that cable back to the compute… | |
100 data since the GPU is only talking DisplayPort.</p> | |
101 | |
102 <p>I didn’t quite figure out how to do all of this until after I… | |
103 purchased the motherboard and CPU, but eventually I got it working using… | |
104 <a href="https://dancharblog.wordpress.com/2020/07/20/add-usb-c-… | |
105 upd2018</a> | |
106 card (actually a Dell-branded version of it) which is a PCI USB-C card w… | |
107 DisplayPort-out port. | |
108 The monitor’s USB-C cable is plugged into the PCI card, which then bre… | |
109 the DisplayPort out to an external connector and the USB-C data routes t… | |
110 the PCI connection as a normal USB-C card. | |
111 Then a | |
112 <a href="https://amzn.to/3ipjCvD">short DisplayPort cabl… | |
113 is used to connect between the PCI card and the motherboard/GPU DisplayP… | |
114 connector.</p> | |
115 | |
116 <div class="language-plaintext highlighter-rouge"><di… | |
117 usb0 at xhci0: USB revision 3.0 | |
118 uhub0 at usb0 configuration 1 interface 0 "ASMedia xHCI root hub&qu… | |
119 </code></pre></div></div> | |
120 | |
121 <p>The monitor’s brightness controls and ambient light sensor ar… | |
122 USB HID devices, and its integrated speakers work through <code class… | |
123 | |
124 <div class="language-plaintext highlighter-rouge"><di… | |
125 uhub6 at uhub5 port 4 configuration 1 interface 0 "LG USA product 0… | |
126 uaudio0 at uhub6 port 1 configuration 1 interface 1 "LG Electronics… | |
127 uaudio0: class v1, high-speed, sync, channels: 2 play, 0 rec, 3 ctls | |
128 audio1 at uaudio0 | |
129 uhub6: device problem, disabling port 2 | |
130 uhidev0 at uhub6 port 4 configuration 1 interface 0 "LG Electronics… | |
131 uhidev0: iclass 3/0 | |
132 uhid0 at uhidev0: input=64, output=64, feature=8 | |
133 uhidev1 at uhub6 port 4 configuration 1 interface 1 "LG Electronics… | |
134 uhidev1: iclass 3/0 | |
135 uhid1 at uhidev1: input=4, output=0, feature=6 | |
136 uhidev2 at uhub6 port 4 configuration 1 interface 2 "LG Electronics… | |
137 uhidev2: iclass 3/0 | |
138 uhid2 at uhidev2: input=6, output=0, feature=13 | |
139 </code></pre></div></div> | |
140 | |
141 <p>I’m still not sure why that port 2 gets disabled on the monit… | |
142 (not the 3-port hub on the back of it) but it doesn’t seem to affect a… | |
143 | |
144 <h2 id="case">Case</h2> | |
145 | |
146 <p>I already had my heart set on the | |
147 <a href="https://www.quietpcusa.com/Streacom-DB4-Fanless-Chassis… | |
148 case</a>, | |
149 though I waffled a bit between the black and titanium colors before choo… | |
150 black. | |
151 The case as-is can dissipate enough heat for a 65W processor, though Str… | |
152 offers a separate heat-pipe add-on that can support up to 110W.</p> | |
153 | |
154 <p>I purchased a | |
155 <a href="https://www.quietpcusa.com/Streacom-ST-ZF240-ZeroFlex-2… | |
156 PSU</a> | |
157 because it was also fanless. | |
158 I’ve used a | |
159 <a href="https://www.quietpcusa.com/Streacom-160W-nanoPSU-and-AC… | |
160 before but heard coil whine from it so I didn’t want to go that route … | |
161 | |
162 <p>I didn’t quite appreciate how large and heavy the DB4 case is… | |
163 Fully assembled with everything in it, it weighs over 20 pounds and has a | |
164 footprint of 10”x10”x11”.</p> | |
165 | |
166 <p>The main bulk of the case is held up 2” off the surface by tw… | |
167 only leaves 2” between the motherboard and my table. | |
168 This makes it a bit difficult to plug in certain cables like a DisplayPo… | |
169 with a large connector, but my desk has a grommet in the corner where th… | |
170 sits so the majority of the cables can pass straight down through the de… | |
171 | |
172 <p><a href="/images/2021-07-19-bottom-large.jpg">&… | |
173 | |
174 <h2 id="cpu-and-motherboard">CPU and Motherboard</h2&… | |
175 | |
176 <p>Since I’ve been pretty unhappy with Intel products lately, I … | |
177 an AMD processor. | |
178 I’ve never had one before so I wasn’t very familiar with the lineup,… | |
179 wanted one with integrated graphics to avoid buying an external GPU sinc… | |
180 wouldn’t have room with the DisplayPort/USB-C card and because most ex… | |
181 GPUs put out a ton of heat and/or have fans. | |
182 I also needed a processor with a TDP of 65W or less to stay under the St… | |
183 case’s limits.</p> | |
184 | |
185 <p><a href="/images/2021-07-19-ryzen-large.jpg">&l… | |
186 | |
187 <p>I decided on the AMD Ryzen 7 Pro 4750G 4Ghz 8-core processor wi… | |
188 Radeon Graphics. | |
189 Technically this CPU is not supposed to be sold to end-users, but it’s | |
190 <a href="https://amzn.to/36M6dbH">available on Amazon<… | |
191 which was good enough for me.</p> | |
192 | |
193 <div class="language-plaintext highlighter-rouge"><di… | |
194 cpu0: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,… | |
195 cpu0: 32KB 64b/line 8-way I-cache, 32KB 64b/line 8-way D-cache, 512KB 64… | |
196 cpu0: ITLB 64 4KB entries fully associative, 64 4MB entries fully associ… | |
197 cpu0: DTLB 64 4KB entries fully associative, 64 4MB entries fully associ… | |
198 [...] | |
199 cpu15 at mainbus0: apid 15 (application processor) | |
200 cpu15: AMD Ryzen 7 PRO 4750G with Radeon Graphics, 4000.01 MHz, 17-60-01 | |
201 [...] | |
202 </code></pre></div></div> | |
203 | |
204 <p>Once I had the CPU picked out, I looked for a motherboard. | |
205 I’ve been out of the custom PC game for many years, but I was disappoi… | |
206 how every non-server motherboard seems to be targeted towards gamers wit… | |
207 kinds of stupid flashing LEDs and aggressive branding. | |
208 Beyond supporting the AM4-socketed Ryzen 4750G, my requirements for the | |
209 motherboard were just that it have Intel gigabit ethernet (for optimum O… | |
210 support), at least one M.2 socket for an NVMe drive, and have both HDMI … | |
211 case) and DisplayPort ports.</p> | |
212 | |
213 <p>Eventually I settled on the | |
214 <a href="https://amzn.to/3kx6APl">ASUS ROG Strix X570-I&… | |
215 The stupid RGB LEDs can be disabled in the BIOS/firmware menu by setting… | |
216 to “Stealth Mode”, and I unplugged the two 1” fans on the I/O boar… | |
217 everything silent. | |
218 I also had to set the “CPU Fan Speed” in the “Monitor” section t… | |
219 else it would indicate a fan error at every boot since I had none plugge… | |
220 | |
221 <p>While I don’t intend to use them, its onboard WiFi and sound … | |
222 OpenBSD:</p> | |
223 | |
224 <div class="language-plaintext highlighter-rouge"><di… | |
225 [...] | |
226 azalia1 at pci10 dev 0 function 6 "AMD 17h/1xh HD Audio" rev 0… | |
227 azalia1: codecs: Realtek ALC1220 | |
228 audio0 at azalia1 | |
229 </code></pre></div></div> | |
230 | |
231 <p>As does its ethernet port:</p> | |
232 | |
233 <div class="language-plaintext highlighter-rouge"><di… | |
234 </code></pre></div></div> | |
235 | |
236 <h2 id="ram-and-ssd">RAM and SSD</h2> | |
237 | |
238 <p>I purchased | |
239 <a href="https://amzn.to/3BeCqXf">Crucial 16Gb DDR4 3200… | |
240 in a single DIMM in case I want to upgrade to 32Gb later. | |
241 Again, what’s with all the RGB lighting and over-the-top heatsinks on … | |
242 “gamer” RAM chips?</p> | |
243 | |
244 <p>I installed a Samsung 980 Pro 1Tb NVMe SSD which I already had. | |
245 The ASUS motherboard has two m.2 slots; one on the top which is undernea… | |
246 large heatsink, and one on the bottom of the motherboard.</p> | |
247 | |
248 <h2 id="keyboard-and-mouse">Keyboard and Mouse</h2> | |
249 | |
250 <p>I’m not big into mechanical keyboards (aside from the one on … | |
251 <a href="https://jcs.org/2018/03/20/dolch64">Dolch PAC 6… | |
252 but after seeing | |
253 <a href="https://www.youtube.com/watch?v=SPVboP_Fvgo">LG… | |
254 about the | |
255 <a href="https://www.pcgamingrace.com/products/glorious-gmmk-pro… | |
256 Pro</a> | |
257 75% keyboard, I decided to go with that one for my desktop. | |
258 I like that it’s very solid and small, but still includes arrow keys a… | |
259 rotary knob. | |
260 I also share LGR’s opinion that the Glorious branding is stupid and | |
261 over-the-top, but luckily it’s just on the bottom of the keyboard so I… | |
262 had to see it once taking it out of the box.</p> | |
263 | |
264 <p>I opted for a black shell, aluminum switch plate, lubed (lol) G… | |
265 switches, and a | |
266 <a href="https://pimpmykeyboard.com/dsa-dolch-keyset-two-shot/&q… | |
267 that I already had from years back.</p> | |
268 | |
269 <p><a href="/images/2021-07-19-keyboard-large.jpg">… | |
270 | |
271 <p>The switches have a nice tactile feel without being too loud. | |
272 Also as Clint noted in his video, the space bar occasionally sticks. | |
273 I’m not sure if this will fix itself over time.</p> | |
274 | |
275 <p>Configuration of the keys and lighting of the keyboard has to b… | |
276 <a href="https://www.pcgamingrace.com/pages/glorious-core?core=G… | |
277 software</a>, | |
278 so I booted to my Windows-on-a-USB-stick and installed it. | |
279 As with the motherboard, I disabled all RGB lighting on the | |
280 keyboard. | |
281 It would have been nice to have a subtle white backlighting on the keys … | |
282 laptops, but the GMMK Pro’s white RGB lights look blue when at a low b… | |
283 I reconfigured the keymap to put a permanent Control key where Caps Lock… | |
284 is (as I would do otherwise with <code class="language-plaintext… | |
285 corner, although I rarely need it.</p> | |
286 | |
287 <p>I will probably need to get a wrist rest because my wrists hurt… | |
288 couple days of typing on it due to the height of the keys. | |
289 I’m used to typing on laptop keyboards which are only a few millimeter… | |
290 the surface of my desk, so my wrists are usually at a much flatter angle. | |
291 For this reason I’ve also been using a | |
292 <a href="https://amzn.to/3xSq05i">ThinkPad Compact USB K… | |
293 which feels just like a ThinkPad. | |
294 My only complaint about this keyboard is that the plastic case can be cr… | |
295 times. | |
296 If someone could reproduce the case in aluminum, I’d pay you many doll… | |
297 | |
298 <center> | |
299 <a href="/images/2021-07-19-thinkpad-large.jpg"><img … | |
300 <a href="/images/2021-07-19-mice-large.jpg"><img src=… | |
301 </center> | |
302 | |
303 <p>As for my mouse, I’m not a gamer so I don’t need something … | |
304 it. | |
305 I had been using a | |
306 <a href="https://amzn.to/2Un65Nq">Lenovo N50 wireless mo… | |
307 for many years with my laptop and I like its design a lot, but its mouse… | |
308 and especially its scroll wheel click are very loud. | |
309 I recently switched to a | |
310 <a href="https://amzn.to/3isJmYf">Logitech M355</a> | |
311 because it’s nearly silent. | |
312 It uses a wireless USB dongle which I have plugged into the back of the … | |
313 | |
314 <div class="language-plaintext highlighter-rouge"><di… | |
315 uhidev2: iclass 3/1 | |
316 ums1 at uhidev2: 16 buttons, Z and W dir | |
317 wsmouse1 at ums1 mux 0 | |
318 uhidev3 at uhub5 port 2 configuration 1 interface 1 "Logitech USB R… | |
319 uhidev3: iclass 3/0, 17 report ids | |
320 uhid5 at uhidev3 reportid 3: input=4, output=0, feature=0 | |
321 uhidpp0 at uhidev3 reportid 16 device 1 mouse "M355" serial e6… | |
322 </code></pre></div></div> | |
323 | |
324 <p>Its battery status is available via the <code class="la… | |
325 | |
326 <div class="language-plaintext highlighter-rouge"><di… | |
327 hw.sensors.uhidpp0.raw0=4 (battery levels) | |
328 hw.sensors.uhidpp0.percent0=90.00% (battery level), OK | |
329 </code></pre></div></div> | |
330 | |
331 <p>My mousepad is some very thin piece of cloth/rubber that I don�… | |
332 I got, but I like it because it’s quiet and has no logos on it.</p&… | |
333 | |
334 <h2 id="openbsd">OpenBSD</h2> | |
335 | |
336 <p>Of course my system wouldn’t be usable to me if I couldn’t … | |
337 | |
338 <p>When I first booted OpenBSD on the system, once the <code cl… | |
339 over from <code class="language-plaintext highlighter-rouge"… | |
340 monitor connected). | |
341 After playing with random BIOS options, I discovered that the BIOS’s C… | |
342 to be enabled for some reason. | |
343 Even though the system still boots via EFI instead of legacy booting thr… | |
344 CSM, having the CSM enabled does something not-yet-understood that enabl… | |
345 video to work properly.</p> | |
346 | |
347 <p>This would get the system to boot, but the LG UltraFine display… | |
348 (though the backlight was still on) once <code class="language-p… | |
349 I SSH’d in and did an <code class="language-plaintext highligh… | |
350 4096x2304@60Hz to 4096x2304@48Hz. | |
351 I’m not sure if this is a bandwidth issue somewhere between the GPU, t… | |
352 DisplayPort, the cable, or some software issue. | |
353 To work around this, I added a | |
354 <a href="https://github.com/jcs/openbsd-src/commit/e529589c95e80… | |
355 to prefer the 4096x2304@48Hz rate in the monitor’s EDID.</p> | |
356 | |
357 <p>Since the LG UltraFine exposes a USB HID device to control its … | |
358 <a href="https://github.com/jcs/openbsd-src/commit/c42e01c96df77… | |
359 to attach to it and expose the brightness adjustment through <code cl… | |
360 display.brightness</code>.</p> | |
361 | |
362 <div class="language-plaintext highlighter-rouge"><di… | |
363 ulguf0 at uhub6 port 4 configuration 1 interface 0 "LG Electronics … | |
364 | |
365 $ wsconsctl display.brightness | |
366 display.brightness=50.00% | |
367 $ wsconsctl display.brightness=20 | |
368 display.brightness -&gt; 20.00% | |
369 </code></pre></div></div> | |
370 | |
371 <p>I still need to add support for reading the ambient light senso… | |
372 through <code class="language-plaintext highlighter-rouge"&… | |
373 <a href="https://github.com/jcs/xdimmer">xdimmer</a&g… | |
374 to automatically dim the screen at night.</p> | |
375 | |
376 <p>To route sound through the monitor’s speakers by default, I h… | |
377 <code class="language-plaintext highlighter-rouge">rsnd/… | |
378 | |
379 <div class="language-plaintext highlighter-rouge"><di… | |
380 uaudio0 at uhub6 port 1 configuration 1 interface 1 "LG Electronics… | |
381 uaudio0: class v1, high-speed, sync, channels: 2 play, 0 rec, 3 ctls | |
382 audio1 at uaudio0 | |
383 | |
384 $ grep sndiod_flags /etc/rc.conf.local | |
385 sndiod_flags=-f rsnd/1 | |
386 </code></pre></div></div> | |
387 | |
388 <p>Since some people have asked, the window manager shown in my ph… | |
389 <a href="https://github.com/jcs/sdorfehs">sdorfehs</a… | |
390 which is a fork of ratpoison.</p> | |
391 | |
392 <p>Other than the quirks with my monitor, OpenBSD works well on th… | |
393 and CPU.</p> | |
394 | |
395 <h2 id="temperatures">Temperatures</h2> | |
396 | |
397 <p>CPU temperature can be monitored in OpenBSD with the <code c… | |
398 | |
399 <div class="language-plaintext highlighter-rouge"><di… | |
400 hw.sensors.ksmn0.temp0=54.25 degC | |
401 </code></pre></div></div> | |
402 | |
403 <p>Through a <code class="language-plaintext highlighter-r… | |
404 temperature tops out at about 90 °C with the case reaching about 45 °C | |
405 (113 °F). | |
406 The hottest point is, of course, where the heat pipes attach to the case… | |
407 | |
408 <center> | |
409 <a href="/images/2021-07-19-flir-large.jpg"><img src=… | |
410 </center></content><author><name></name></author><category term="h… | |
411 <a href="https://jcs.org/2019/05/03/mailstation">Cidco M… | |
412 Z80 computer which adds the ability to use WiFi for data transfer, code | |
413 uploading, and to act as a WiFi modem for my | |
414 <a href="https://github.com/jcs/msTERM">msTERM</a> | |
415 terminal emulator.</p> | |
416 | |
417 <p><img src="/images/2021-04-23-hero-665x182.jpg" src… | |
418 | |
419 | |
420 | |
421 <p class="alert"><strong>Note:</strong> For … | |
422 <a href="/wifistation">WiFiStation</a> | |
423 pages.</p> | |
424 | |
425 <h2 id="background">Background</h2> | |
426 | |
427 <p>In 2019, I | |
428 <a href="https://jcs.org/2019/05/03/mailstation#creating-msterm&… | |
429 for the MailStation called msTERM which made it possible to dial into BB… | |
430 with the MailStation’s built-in modem. | |
431 While this was a fun project and allowed me to dial into to | |
432 <a href="//klud.ge/">my own BBS</a>, | |
433 the novelty soon wore off and I returned to using telnet and SSH.</p&… | |
434 | |
435 <p>Last year, someone asked me if the MailStation could be used as… | |
436 processor similar to the | |
437 <a href="https://en.wikipedia.org/wiki/AlphaSmart">Alpha… | |
438 I told them such software could be written but it would be difficult to … | |
439 since the only<sup id="fnref:0" role="doc-noteref"… | |
440 through its modem or a | |
441 <a href="https://en.wikipedia.org/wiki/LapLink_cable">pa… | |
442 both of which are difficult to use since most people don’t have landli… | |
443 anymore and similarly, most computers don’t have parallel ports anymor… | |
444 | |
445 <p>While I had recently created a | |
446 <a href="/2020/03/31/mailstation_usb">USB adapter</a&… | |
447 to eliminate the need for a parallel cable, I thought it might be useful… | |
448 a WiFi interface instead. | |
449 This would allow msTERM to “dial” out over telnet instead of its mod… | |
450 like the myriad of | |
451 <a href="/2017/06/23/wifi232">WiFi modem serial adapters… | |
452 while also providing a simple web interface where users could upload fil… | |
453 have them transferred to the MailStation.</p> | |
454 | |
455 <h2 id="data-transfer">Data Transfer</h2> | |
456 | |
457 <p>Like those WiFi serial adapters, using an | |
458 <a href="https://en.wikipedia.org/wiki/ESP8266">ESP32/ES… | |
459 solution. | |
460 However, designing something that directly interfaced a ESP8266 to the | |
461 processor seemed like a daunting task, mostly because I have no idea how… | |
462 such a thing but also because anyone that wanted similar functionality w… | |
463 have to tear apart their MailStation.</p> | |
464 | |
465 <p>I settled on making an ESP8266 a standalone device and having i… | |
466 the MailStation’s parallel port, allowing it to work without any hardw… | |
467 modifications needed.</p> | |
468 | |
469 <p>The MailStation firmware includes a built-in function for sendi… | |
470 bytes over its parallel port, but it does so over five of the eight data… | |
471 in three transfers, for every single byte. | |
472 The USB loader that I had made earlier adhered to this protocol to remain | |
473 compatible with the firmware function, making the | |
474 <a href="https://github.com/jcs/mailstation-tools/blob/master/lo… | |
475 that runs on the MailStation as small as possible since its binary has t… | |
476 hand-typed into the MailStation’s hex editor.</p> | |
477 | |
478 <p>This three-step process is not terribly slow, but it makes bi-d… | |
479 communication more complicated and seemed unnecessary when all eight of … | |
480 pins were wired up. | |
481 For WiFistation, I decided to use a much more straightforward protocol u… | |
482 eight data pins plus two status and two control pins. | |
483 The new | |
484 <a href="https://github.com/jcs/WiFiStation/blob/main/mailstatio… | |
485 for this protocol, which doesn’t rely on any firmware functionality, e… | |
486 up being 117 bytes vs. 97 for the | |
487 <a href="https://github.com/jcs/mailstation-tools/blob/master/lo… | |
488 | |
489 <h2 id="prototyping">Prototyping</h2> | |
490 | |
491 <p>Earlier this year I assembled a prototype based on | |
492 <a href="https://www.adafruit.com/product/2471">Adafruit… | |
493 board. | |
494 To be able to manipulate 12 5v GPIO pins from the ESP8266 (which only ha… | |
495 available GPIO pins, and they only operate at 3.3v), I used an | |
496 <a href="https://www.microchip.com/wwwproducts/en/mcp23017"… | |
497 I<sup>2</sup>C chip, which ultimately proved to be too slow … | |
498 files (~16Kb) so I switched to the | |
499 <a href="https://www.microchip.com/wwwproducts/en/MCP23S18"… | |
500 which interfaces over SPI.</p> | |
501 | |
502 <figure> | |
503 <a href="/images/2021-04-23-prototype-large.jpg"><img… | |
504 <a href="/images/2021-04-23-prototype_rear-large.jpg">&l… | |
505 </figure> | |
506 | |
507 <p>The prototype worked with the | |
508 <a href="https://github.com/jcs/msTERM/commit/bfa680dbe1759ca34f… | |
509 modifications</a> | |
510 I made, so I set about turning into something I could make available to … | |
511 | |
512 <p>While the Adafruit Huzzah board had almost everything I needed,… | |
513 upgrade to their slightly larger | |
514 <a href="https://www.adafruit.com/product/2821">Feather … | |
515 board, which upgrades the 5-pin FTDI serial header to a proper CP2104 US… | |
516 port and has built-in battery charging bits so the WiFiStation could opt… | |
517 run from a | |
518 <a href="https://www.adafruit.com/product/4237">recharga… | |
519 Since the MailStation can already run on AA batteries, this would allow … | |
520 entire system to be portable.</p> | |
521 | |
522 <p>Of course, only after doing all of my development and reflashin… | |
523 Huzzah board many dozens of times did I learn that the Feather version h… | |
524 auto-reset support so one can reflash it entirely from a command-line. | |
525 The non-Feather version requires holding down two tiny buttons on the bo… | |
526 reset into its bootloader every time.</p> | |
527 | |
528 <h2 id="designing-a-pcb">Designing a PCB</h2> | |
529 | |
530 <p>Since I am not a hardware hacker and have no background in elec… | |
531 my prototype into a PCB was a bit daunting. | |
532 I downloaded the free version of | |
533 <a href="https://www.autodesk.com/products/eagle/overview"&… | |
534 and stumbled through how to design a | |
535 <a href="https://github.com/jcs/WiFiStation/tree/main/pcb"&… | |
536 and then turned it into a halfway-decent looking board. | |
537 Since I’m also not comfortable doing surface-mount soldering, I opted … | |
538 entirely through-hole components.</p> | |
539 | |
540 <p>Once my initial design seemed sufficient, I uploaded it to | |
541 <a href="https://www.pcbway.com/">PCBWay</a> | |
542 for printing of the PCB. | |
543 I also ordered a handful of Huzzah Feather modules, DB25 connectors, res… | |
544 MCP23S18 chips, and sockets from | |
545 <a href="https://www.digikey.com/">DigiKey</a>.<… | |
546 | |
547 <figure> | |
548 <a href="/images/2021-04-23-eagle-large.png"><img src… | |
549 <a href="/images/2021-04-23-eagle_board-large.png"><i… | |
550 </figure> | |
551 | |
552 <p>A week and a half and $25 later, I received my batch of five bo… | |
553 I soldered the components to one of them and then spent a frustrating da… | |
554 to figure out why I was getting strange results with it.</p> | |
555 | |
556 <p>As it turned out, the standard “SUB-D” DB25 part that I had… | |
557 its pinout backwards from what I was expecting and how my prototype’s … | |
558 board was numbered, and I did not verify it carefully enough. | |
559 I flipped the component around and rerouted all of the wires in the board | |
560 design, which also allowed me to eliminate the vias, and then sent the n… | |
561 revision to PCBWay. | |
562 Another week and a half later, I had my “revision B” boards.</p&g… | |
563 | |
564 <figure> | |
565 <a href="/images/2021-04-23-rev1-large.jpg"><img src=… | |
566 <a href="/images/2021-04-23-rev2_assembled-large.jpg">&l… | |
567 </figure> | |
568 | |
569 <p>This version produced the correct data on each pin, but was doi… | |
570 inconsistently. | |
571 I thought it might have been the bussed resistor that I chose instead of | |
572 individual resistors like my prototype, but I later determined it to be … | |
573 connector itself not being properly grounded.</p> | |
574 | |
575 <p>I fixed this in the board design but as I started mocking up an… | |
576 it, I realized that the DB25 connector was not placed proud enough on th… | |
577 for a case to fit along the front edge without the pins being too far ba… | |
578 I also realized there was no way to securely fasten the two DB25 connect… | |
579 together, as the MailStation has fixed screw nuts on it, but with the re… | |
580 the WiFiStation’s connector being covered up, there would be no way to… | |
581 screw through it and tighten it down.</p> | |
582 | |
583 <p>I came up with the idea to shrink the width of the board by mov… | |
584 to a horizontal position with the Huzzah straddling it, since the Huzzah… | |
585 already sticking up high enough due to its pin headers. | |
586 I also positioned the Huzzah Feather so that the DB25 screw holes were v… | |
587 from the back of the board, allowing long screws to reach from outside t… | |
588 of the case, under the Huzzah board, and through the DB25 connector hole… | |
589 the MailStation’s DB25 connector.</p> | |
590 | |
591 <p>I finished this third redesign of the board and sent it off for… | |
592 | |
593 <figure> | |
594 <a href="/images/2021-04-23-final-large.jpg"><img src… | |
595 <a href="/images/2021-04-23-final_assembled-large.jpg">&… | |
596 </figure> | |
597 | |
598 <h2 id="making-the-case">Making the Case</h2> | |
599 | |
600 <p>While waiting for the new boards to arrive, I needed an enclosu… | |
601 As if fumbling through PCB design wasn’t enough, I was also going to h… | |
602 do some | |
603 <a href="https://twitter.com/jcs/status/1372024803817877506"… | |
604 I designed a case for the WiFiStation in TinkerCAD and thankfully this d… | |
605 require a week and a half between iterations. | |
606 I soon had a | |
607 <a href="https://github.com/jcs/WiFiStation/blob/main/enclosure/… | |
608 that connected together and allowed an optional lithium ion battery to be | |
609 housed in it as well.</p> | |
610 | |
611 <figure> | |
612 <a href="/images/2021-04-23-printing-large.jpg"><img … | |
613 <a href="/images/2021-04-23-case-large.jpg"><img src=… | |
614 </figure> | |
615 | |
616 <p>I still have some more iterating to go on the case design to ma… | |
617 has a more secure closure. | |
618 I’m also still sourcing some thumbscrews that will properly fit the ca… | |
619 <a href="https://www.digikey.com/en/products/detail/molex/172704… | |
620 | |
621 <h2 id="firmware">Firmware</h2> | |
622 | |
623 <p>With the hardware design done, I developed more of the | |
624 <a href="https://github.com/jcs/WiFiStation/tree/main/esp8266&qu… | |
625 to run on the Huzzah ESP8266 board. | |
626 I integrated a web server which currently just allows uploading a file t… | |
627 transferred to the new loader program.</p> | |
628 | |
629 <figure> | |
630 <a href="/images/2021-04-23-http-large.jpg"><img src=… | |
631 </figure> | |
632 | |
633 <p>I also improved the telnet/<code class="language-plaint… | |
634 over telnet with proper telnet negotiation, and one do things like <c… | |
635 hang up.</p> | |
636 | |
637 <figure> | |
638 <a href="/images/2021-04-23-telnet-large.jpg"><img sr… | |
639 </figure> | |
640 | |
641 <p>And with the WiFiStation using a battery, this entire thing can… | |
642 wirelessly.</p> | |
643 | |
644 <h2 id="wifistation-kits">WiFiStation Kits</h2> | |
645 | |
646 <p>With all of the hardware design nailed down and the software mo… | |
647 written up some | |
648 <a href="/wifistation">documentation</a> | |
649 for the whole system including assembly instructions.</p> | |
650 | |
651 <p>These kits are | |
652 <a href="https://www.tindie.com/products/jcs/wifistation/"&… | |
653 for those interested. | |
654 I realize the target audience for this is very small but I hope this pro… | |
655 brings more attention to the MailStation as a fun Z80 development platfo… | |
656 | |
657 <p><br /></p> | |
658 | |
659 <div class="footnotes" role="doc-endnotes"> | |
660 <ol> | |
661 <li id="fn:0" role="doc-endnote"> | |
662 <p>I know the Dana can connect to a PC with a USB cable and … | |
663 </li> | |
664 </ol> | |
665 </div></content><author><name></name></author><category term="hard… | |
666 <a href="/2019/08/14/x1c7">X1 Carbon</a>, | |
667 something I’ve been looking forward to for years.</p> | |
668 | |
669 <p><img src="/images/2021-01-27-hero-665x207.jpg" src… | |
670 | |
671 | |
672 | |
673 <h2 id="hardware">Hardware</h2> | |
674 | |
675 <p>The X1 Nano is basically a 13” version of the 14” X1 Carbon… | |
676 footprint, thickness, and weight. | |
677 Availability in the US has been fairly limited (and expensive) at the mo… | |
678 offering no WWAN or any customizable options, and Core i7 models are not | |
679 shipping out for months. | |
680 I purchased the Intel Core i5-1135G7 model with 16Gb of RAM and a 1Tb NV… | |
681 The only screen option currently available is a matte non-touch 2K displ… | |
682 | |
683 <p>The X1 Nano (X1N1?) weighs 2.0 lbs compared to my previous | |
684 <a href="/2019/08/14/x1c7">X1C7’s</a> | |
685 2.4 lbs. | |
686 The width is reduced from the 14” X1 Carbon’s 12.71” to 11.53”, … | |
687 8.54” to 8.18”, and thickness from 14.95mm to 13.87mm.</p> | |
688 | |
689 <p>On the left side of the laptop are two Thunderbolt 3-enabled (U… | |
690 ports and a headphone jack. | |
691 The PCI ethernet device and its required dongle are no longer available,… | |
692 is not really needed these days with non-Thunderbolt USB-C ethernet adap… | |
693 being able to max out a gigabit ethernet connection (at least on non-Ope… | |
694 platforms).</p> | |
695 | |
696 <p>On the right side are just the fan vent and power button, which… | |
697 from about the middle of the side to the far-right edge. | |
698 I find the power button very hard to press now, especially to hold it in… | |
699 how ever many seconds it takes to force a hard power-off.</p> | |
700 | |
701 <p>The Dolby Atmos sound system remains with its unfortunate brand… | |
702 present on the left side of the keyboard deck. | |
703 There are two up-firing speakers at the top of the keyboard deck, which … | |
704 excellent and loud.</p> | |
705 | |
706 <p>The 13” 2K (2160x1350) matte, non-touch IPS screen looks grea… | |
707 horizontal resolution as my | |
708 <a href="/2017/07/14/matebook">13” MateBook X</a> | |
709 which I’ve still been using for years. | |
710 The resolution is high enough to use 1.5x scaling but low enough to not … | |
711 lot of power. | |
712 It can get very bright at 450 nits, and most of the time indoors I’m u… | |
713 at about 40% brightness. | |
714 I did a color calibration and it wasn’t too far off the factory defaul… | |
715 | |
716 <p>The Nano has a ThinkShutter device to physically cover up the w… | |
717 X1 Carbon did, and retains the black “ThinkPad” branding on the keyb… | |
718 | |
719 <p>The screen hinge is tight and cannot really be opened one-hande… | |
720 reduced weight of the laptop. | |
721 However, the lid does not wobble at all when typing.</p> | |
722 | |
723 <p>The keyboard still seems full-sized, though the function-row ke… | |
724 The X1 Nano further reduces the X1C7’s key travel from 1.5mm to 1.35mm… | |
725 I still find it very enjoyable to type on and it retains a chunky tactil… | |
726 The keys do have a bit of a creaky sound when typing or just moving fing… | |
727 keys without pressing them. | |
728 The keyboard is backlit and offers two levels of adjustment with <cod… | |
729 through <code class="language-plaintext highlighter-rouge"&… | |
730 utilities like | |
731 <a href="https://github.com/jcs/xdimmer">xdimmer</a&g… | |
732 | |
733 <p>The Elan touchpad surface remains soft and easy to glide finger… | |
734 and its integrated “diving-board-style” button has a quiet thud for … | |
735 with no play in its mechanism. | |
736 The three physical TrackPoint buttons between the keyboard and touchpad … | |
737 shallow click. | |
738 The TrackPoint still operates over a legacy PS/2 attachment and the touc… | |
739 is a Windows Precision Touchpad connected over I<sup>2</sup>… | |
740 | |
741 <p>I am using the far-superior | |
742 <a href="https://www.etsy.com/jp/shop/SaotoTech">“soft… | |
743 that was made for my X1C7 and is probably a hair too tall for the lower-… | |
744 X1N1 keyboard, but it doesn’t stick up past the keys nor contact the s… | |
745 when closed.</p> | |
746 | |
747 <figure> | |
748 <a href="/images/2021-01-27-trackpoint-large.jpg"><im… | |
749 <a href="/images/2021-01-27-trackpoint_profile-large.jpg"&g… | |
750 </figure> | |
751 | |
752 <p>A square USB-attached fingerprint sensor sits next to the touch… | |
753 honestly forgotten about until I just looked.</p> | |
754 | |
755 <p>Wireless connectivity is provided by a non-socketed Intel AX201… | |
756 and Bluetooth 5.1 chip. | |
757 The NVMe SSD is a Western Digital PC SN530 removable m.2 2242 form-facto… | |
758 mounted under a heatsink.</p> | |
759 | |
760 <p>There is no audible coil whine. | |
761 The fan has a tendency to come on rather eagerly when the CPU is allowed… | |
762 its full frequency with turbo, and to remain on for what seems like a lo… | |
763 time even after the CPU-intensive operation has stopped and the surface … | |
764 laptop is cool to the touch. | |
765 Fortunately the fan is rather quiet (~33 dBA about an inch from the exha… | |
766 outlet at the fan’s highest setting) and has a neutral white-noise sou… | |
767 without any high-pitched whining. | |
768 Perhaps a future update to the firmware/EC will adjust the temperature | |
769 thresholds for the fan to come on less eagerly, and not stay on so long.… | |
770 | |
771 <figure> | |
772 <a href="/images/2021-01-27-inside-large.jpg"><img sr… | |
773 </figure> | |
774 | |
775 <h2 id="firmware">Firmware</h2> | |
776 | |
777 <p>The X1 Nano defaults to a graphical firmware upon pressing <… | |
778 switched back into a simple text mode. | |
779 <code class="language-plaintext highlighter-rouge">F12&l… | |
780 Pro-tip: press <code class="language-plaintext highlighter-rouge… | |
781 options to prevent a loud, annoying beep.</p> | |
782 | |
783 <p>I recommend enabling the “F1-F12 as Primary Function” optio… | |
784 using the Fn key to register these keys.</p> | |
785 | |
786 <p>Installing a different boot logo is still | |
787 <a href="https://jcs.org/2017/09/01/thinkpad_x1c#firmware"&… | |
788 through Windows, which also gets rid of the new “TCO Certified” logo… | |
789 bottom-right corner.</p> | |
790 | |
791 <p>Secure Boot must be disabled in the BIOS menu to boot OpenBSD, … | |
792 Support” option is no longer available (nor needed).</p> | |
793 | |
794 <p>Unfortunately the X1 Nano is an “Intel Evo” platform device… | |
795 longer has a normal ACPI S3 suspend mode. | |
796 The X1C7 had a firmware option to disable this “Modern Standby” and … | |
797 “Legacy S3 standby mode”, but the X1 Nano no longer has this option. | |
798 This means that OpenBSD is unable to suspend the laptop since the firmwa… | |
799 longer supports it. | |
800 Efforts to support <code class="language-plaintext highlighter-r… | |
801 consumption are underway, as my | |
802 <a href="/2020/05/15/surface_go2">Surface Go 2</a> | |
803 was a similar device.</p> | |
804 | |
805 <h2 id="openbsd-support-log">OpenBSD Support Log</h2&… | |
806 | |
807 <p><strong>2021-01-17:</strong> The usual round of PCI… | |
808 <code class="language-plaintext highlighter-rouge">iwx&l… | |
809 <a href="https://github.com/openbsd/src/commit/8edfa316af4155e65… | |
810 to attach to the AX201 device found in the X1 Nano.</p> | |
811 | |
812 <p>There are some minor issues with DPMS that cause the screen to … | |
813 seconds longer to wake up after being shut off. | |
814 Sometimes when returning to my laptop after it’s been locked (and the … | |
815 turned off via DPMS) it blinks a few times before showing the screen con… | |
816 | |
817 <p><strong>2021-01-25:</strong> I’ve been experiment… | |
818 <a href="https://github.com/jcs/openbsd-src/commit/cf7c4a31389d2… | |
819 to silence the fan at all times. | |
820 It doesn’t seem to raise the temperature too high, and the laptop seem… | |
821 of passively cooling itself down fairly well once CPU-intensive tasks ha… | |
822 stopped.</p> | |
823 | |
824 <p><strong>2021-01-27:</strong> I’ve also been worki… | |
825 <a href="https://github.com/jcs/openbsd-src/commit/29edcdbd59338… | |
826 as a modern replacement for OpenBSD’s <code class="language-pl… | |
827 processors/firmware dynamically adjust their frequency on their own in r… | |
828 to work load, rather than the OpenBSD kernel doing it.</p> | |
829 | |
830 <p><strong>2021-04-07:</strong> Due to the lack of S3 … | |
831 warranty by Lenovo) that made the keyboard feel worse, I’ve sold my X1… | |
832 At this time, I can’t recommend buying any “Intel Evo” branded lap… | |
833 OpenBSD use due to the lack of hardware S3 suspend support forced on the… | |
834 laptops, combined with a lack of any “instant wake” mechanism in Ope… | |
835 kernel.</p> | |
836 | |
837 <h2 id="current-openbsd-support-summary">Current OpenBSD… | |
838 | |
839 <p>Status is relative to OpenBSD-current as of 2021-01-27.</p&g… | |
840 | |
841 <table> | |
842 <thead> | |
843 <tr> | |
844 <th>Component</th> | |
845 <th>Works?</th> | |
846 <th>Notes</th> | |
847 </tr> | |
848 </thead> | |
849 <tbody> | |
850 <tr> | |
851 <td>Audio</td> | |
852 <td>Yes</td> | |
853 <td>Intel audio with Realtek ALC287 codec and supported by &… | |
854 </tr> | |
855 <tr> | |
856 <td>Battery status</td> | |
857 <td>Yes</td> | |
858 <td>48Whr battery, status available through <a href="… | |
859 </tr> | |
860 <tr> | |
861 <td>Bluetooth</td> | |
862 <td>No</td> | |
863 <td>Attaches as a <a href="http://man.openbsd.org/ug… | |
864 </tr> | |
865 <tr> | |
866 <td>Fingerprint sensor</td> | |
867 <td>No</td> | |
868 <td>Synaptics <code class="language-plaintext highli… | |
869 </tr> | |
870 <tr> | |
871 <td>Keyboard backlight</td> | |
872 <td>Yes</td> | |
873 <td>Supported natively by the EC. Can be toggled with Fn+Sp… | |
874 </tr> | |
875 <tr> | |
876 <td>Hibernation</td> | |
877 <td>Yes</td> | |
878 <td>Can be triggered by <a href="http://man.openbsd.… | |
879 </tr> | |
880 <tr> | |
881 <td>SSD</td> | |
882 <td>Yes</td> | |
883 <td>The Western Digital PC SN530 NVMe drive is supported by … | |
884 </tr> | |
885 <tr> | |
886 <td>Suspend / resume</td> | |
887 <td>No</td> | |
888 <td>The firmware does not support ACPI S3 suspend.</td> | |
889 </tr> | |
890 <tr> | |
891 <td>Thunderbolt 3</td> | |
892 <td>Kinda</td> | |
893 <td>Any devices attached at boot time will work in OpenBSD, … | |
894 </tr> | |
895 <tr> | |
896 <td>Touchpad</td> | |
897 <td>Yes</td> | |
898 <td>Elan I<sup>2</sup>C, supported by <a href… | |
899 </tr> | |
900 <tr> | |
901 <td>TrackPoint</td> | |
902 <td>Yes</td> | |
903 <td>Supported by <a href="http://man.openbsd.org/pms… | |
904 </tr> | |
905 <tr> | |
906 <td>USB</td> | |
907 <td>Yes</td> | |
908 <td>The 2 USB-C ports work fine. I am using the <a href=&… | |
909 </tr> | |
910 <tr> | |
911 <td>Video</td> | |
912 <td>Yes</td> | |
913 <td><a href="http://man.openbsd.org/inteldrm.4"… | |
914 </tr> | |
915 <tr> | |
916 <td>Webcam</td> | |
917 <td>Yes</td> | |
918 <td>Chicony USB, supported by the <a href="http://ma… | |
919 </tr> | |
920 <tr> | |
921 <td>Wireless</td> | |
922 <td>Yes</td> | |
923 <td>The non-removable Intel AX201 802.11ax wireless chip is … | |
924 </tr> | |
925 </tbody> | |
926 </table></content><author><name></name></author><category term="ha… | |
927 Unencrypted websites are treated as relics of the past with browsers dec… | |
928 them toxic waste not to be touched (or | |
929 <a href="//blog.mozilla.org/security/2020/11/17/firefox-83-intro… | |
930 and search engines de-prioritizing their content.</p> | |
931 | |
932 <p>While this push for security is good for protecting modern comm… | |
933 is a whole web full of information and services that don’t <em>n… | |
934 and those trying to access them from older vintage computers or even thr… | |
935 modern embedded devices are increasingly being left behind.</p> | |
936 | |
937 | |
938 | |
939 <p class="alert">Note: This article is mostly directed a… | |
940 this one, with no expectation of privacy or security by most readers of … | |
941 content. | |
942 If you are running a commercial website, collecting personal information… | |
943 users, or transmitting sensitive data that users would expect to be done | |
944 privately, disregard everything here and don’t bother offering your we… | |
945 plaintext.</p> | |
946 | |
947 <h2 id="http-upgrading">HTTP Upgrading</h2> | |
948 | |
949 <p>Though it’s less common these days, users may still type in y… | |
950 manually as opposed to clicking on a link that already includes the <… | |
951 scheme. | |
952 (Imagine a user hearing your website mentioned on a podcast and they hav… | |
953 type it into their browser.)</p> | |
954 | |
955 <p>For a URL entered with an <code class="language-plainte… | |
956 unless your domain is listed in the | |
957 <a href="//www.chromium.org/hsts"><abbr title="S… | |
958 of the user’s browser or they are using a plugin like | |
959 <a href="//www.eff.org/https-everywhere">HTTPS Everywher… | |
960 default to loading your website over plaintext HTTP. | |
961 For this reason, even if your website is only served over HTTPS, it’s … | |
962 necessary to configure your server to respond to plaintext HTTP requests… | |
963 301 or 302 redirect to the HTTPS version of the URL.</p> | |
964 | |
965 <p>If your server is properly configured to send a <code class=… | |
966 header, once the user’s browser loads your website’s HTTPS version, … | |
967 will cache that information for days or months and future attempts to lo… | |
968 site will default to the HTTPS scheme instead of HTTP even if the user m… | |
969 types in an <code class="language-plaintext highlighter-rouge&qu… | |
970 | |
971 <h2 id="avoid-forced-upgrading-by-default">Avoid Forced … | |
972 | |
973 <p>This forced redirection is a major cause of websites becoming i… | |
974 vintage computers. | |
975 Your server responds to the HTTP request with a 301 or 302 status and no | |
976 content, and either a) the browser follows the redirection and tries to | |
977 negotiate an SSL connection, but your server doesn’t offer legacy SSL … | |
978 or old ciphers so the negotiation fails, or b) the browser just doesn’… | |
979 SSL/TLS at all and fails to follow the redirection.</p> | |
980 | |
981 <p>A real-life example of this is that I recently purchased a Powe… | |
982 updated it to MacOS X 10.5.8 from 2009. | |
983 It has a 1.5Ghz processor and 1.25Gb of RAM, and can connect to my moder… | |
984 network and use most of my USB peripherals. | |
985 It includes a Mail client that can talk to my IMAP and SMTP servers, and… | |
986 Safari web browser which can render fairly modern CSS layouts. | |
987 However, it’s unable to view any content at all on Wikipedia simply be… | |
988 can’t negotiate TLS 1.2 with the ciphers Wikipedia requires. | |
989 Why is a decade-old computer too old to view encyclopedia articles? | |
990 I am | |
991 <a href="https://meyerweb.com/eric/thoughts/2018/08/07/securing-… | |
992 to complain about this.</p> | |
993 | |
994 <p>A solution to this problem is for websites to continue offering… | |
995 content over plaintext HTTP in addition to HTTPS. | |
996 If you’re using Nginx, instead of creating two <code class="la… | |
997 *:80</code> version redirecting to the <code class="langua… | |
998 <code class="language-plaintext highlighter-rouge">serve… | |
999 | |
1000 <div class="language-plaintext highlighter-rouge"><di… | |
1001 server_name jcs.org; | |
1002 listen *:80; | |
1003 listen *:443 ssl http2; | |
1004 | |
1005 ssl_certificate ...; | |
1006 ssl_certificate_key ...; | |
1007 ... | |
1008 ssl_protocols TLSv1.2; | |
1009 } | |
1010 </code></pre></div></div> | |
1011 | |
1012 <p>While it may seem counter to the point of this article, I recom… | |
1013 serving legacy SSL/TLS ciphers like SSLv3 to try to help older browsers. | |
1014 These old protocols and ciphers are insecure and broken, and I feel it�… | |
1015 to make it clear to the user they’re connecting to a website in cleart… | |
1016 to offer a false sense of security by having the browser indicate a “s… | |
1017 connection” when it’s being done over an old, broken protocol. | |
1018 Also, while it may not be practical anymore, modern browsers might be | |
1019 <a href="//en.wikipedia.org/wiki/Downgrade_attack">trick… | |
1020 an old, broken cipher if your server still offers it.</p> | |
1021 | |
1022 <p>Even if you do offer legacy protocols and ciphers to older brow… | |
1023 certificate might be signed by a certificate authority whose root certif… | |
1024 not trusted by older browsers.</p> | |
1025 | |
1026 <h2 id="continue-upgrading-modern-browsers">Continue Upg… | |
1027 | |
1028 <p>Now that your entire website is being offered to legacy browser… | |
1029 modern browsers can still be directed to connect over HTTPS for added pr… | |
1030 responding to the | |
1031 <a href="//developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Upg… | |
1032 header. | |
1033 This header is only sent by modern browsers that support | |
1034 <a href="//developer.mozilla.org/en-US/docs/Web/HTTP/CSP"&g… | |
1035 when making an HTTP request, so it’s a reasonable indicator that the c… | |
1036 sufficiently modern and robust that it will be able to negotiate a TLS 1… | |
1037 connection if redirected to your site’s HTTPS version.</p> | |
1038 | |
1039 <p>For Nginx, this can be done inside a <code class="langu… | |
1040 per-request that includes whether it was made over plaintext HTTP and wh… | |
1041 included an <code class="language-plaintext highlighter-rouge&qu… | |
1042 | |
1043 <div class="language-plaintext highlighter-rouge"><di… | |
1044 ... | |
1045 set $need_http_upgrade "$https$http_upgrade_insecure_requests&q… | |
1046 location / { | |
1047 if ($need_http_upgrade = "1") { | |
1048 add_header Vary Upgrade-Insecure-Requests; | |
1049 return 301 https://$host$request_uri; | |
1050 } | |
1051 | |
1052 ... | |
1053 } | |
1054 } | |
1055 </code></pre></div></div> | |
1056 | |
1057 <p>This <code class="language-plaintext highlighter-rouge&… | |
1058 plaintext HTTP where <code class="language-plaintext highlighter… | |
1059 <code class="language-plaintext highlighter-rouge">Upgra… | |
1060 the HTTPS version. | |
1061 The <code class="language-plaintext highlighter-rouge">V… | |
1062 the redirect.</p> | |
1063 | |
1064 <h2 id="content-concessions">Content Concessions</h2&… | |
1065 | |
1066 <p>With legacy browsers now able to access your site, you may want… | |
1067 changes to your HTML and CSS to allow your site to render with some degr… | |
1068 readability. | |
1069 I don’t recommend giving it the full IE6 treatment catering to the low… | |
1070 denominator, but at least make the main text of your site readable.</… | |
1071 | |
1072 <p>Obviously avoid JavaScript unless it is used progressively, tho… | |
1073 browsers raise error dialogs at the mere presence of modern JavaScript t… | |
1074 can’t be parsed even if it’s never executed.</p> | |
1075 | |
1076 <p>Modern CSS and complex layouts can also be a problem even for b… | |
1077 few years old, so it’s probably best to use them sparingly. | |
1078 For any <code class="language-plaintext highlighter-rouge"&… | |
1079 avoid specifying a particular scheme.</p> | |
1080 | |
1081 <div class="language-plaintext highlighter-rouge"><di… | |
1082 &lt;img src="/images/..."&gt; | |
1083 &lt;/a&gt; | |
1084 </code></pre></div></div> | |
1085 | |
1086 <p>If you have to specify an absolute URL to another site that is … | |
1087 over both HTTP and HTTPS, you can specify it without a scheme or colon a… | |
1088 browser will use the same <code class="language-plaintext highli… | |
1089 over:</p> | |
1090 | |
1091 <div class="language-plaintext highlighter-rouge"><di… | |
1092 </code></pre></div></div> | |
1093 | |
1094 <h2 id="a-rant-about-gemini">A Rant About Gemini</h2&… | |
1095 | |
1096 <p>Tangentially related, | |
1097 <a href="//gemini.circumlunar.space/">Gemini</a> | |
1098 is a modern document transfer protocol that aims to fit between the anci… | |
1099 <a href="//en.wikipedia.org/wiki/Gopher_(protocol)">Goph… | |
1100 protocol and the too-modern HTTP web. | |
1101 Its document markup language is based on | |
1102 <a href="//en.wikipedia.org/wiki/Markdown">Markdown</… | |
1103 so it’s very lightweight and simple to parse without complex HTML/CSS … | |
1104 | |
1105 <p>It sounds like the perfect thing to bring modern content to vin… | |
1106 except that its | |
1107 <a href="//gemini.circumlunar.space/docs/specification.html"… | |
1108 requires all content to be transferred over TLS 1.2 or higher which make… | |
1109 nearly impossible to access from a vintage computer or even a modern emb… | |
1110 system with limited CPU power.</p> | |
1111 | |
1112 <p>This requirement seems poorly thought out, especially consideri… | |
1113 protocol doesn’t even support forms (other than a single text box on a… | |
1114 form) so there’s no chance of users submitting private data, and, shor… | |
1115 clunky TLS client certificates, there’s no mechanism for client-server… | |
1116 like cookies so clients can’t be authenticated, meaning everything ser… | |
1117 much has to be public anyway.</p> | |
1118 | |
1119 <p>Its protocol author argues that TLS is just a simple dependency… | |
1120 than a TCP server module, so it should be trivial to implement in any cl… | |
1121 server. | |
1122 But if your computer’s CPU is so slow that a modern TLS negotiation wo… | |
1123 so long as to be unusable, or its | |
1124 <a href="http://tenfourfox.blogspot.com/2018/02/the-tls-apocalyp… | |
1125 available, that makes it difficult to write a client without depending o… | |
1126 <a href="//github.com/jcs/sockhole">external system</… | |
1127 [<a href="https://oldvcr.blogspot.com/2020/11/fun-with-crypto-an… | |
1128 | |
1129 <p>In my opinion, the protocol should <em>recommend</em&g… | |
1130 and TLS encrypted versions and <em>recommend</em> that clien… | |
1131 use plaintext if needed. | |
1132 Clients for modern operating systems can continue enforcing a TLS requir… | |
1133 their users aren’t feeling any less secure.</p> | |
1134 | |
1135 <p>Perhaps just sending actual Markdown text over plaintext HTTP t… | |
1136 ask for it can be the new, old web.</p> | |
1137 | |
1138 <div class="language-plaintext highlighter-rouge"><di… | |
1139 </code></pre></div></div> | |
1140 | |
1141 <hr /> | |
1142 | |
1143 <p><em>Please don’t contact me to “well ackchyually” m… | |
1144 <a href="/2011/08/17/a_man-in-the-middle_attack_in_the_wild"… | |
1145 and how your terrible ISP inserts ads into your unencrypted web pages an… | |
1146 you were able to make a Gemini client out of a whistle and some shoelace… | |
1147 If you don’t want to make your website content available to stupid old | |
1148 computers, then don’t.</em></p></content><author><name></n… | |
1149 <a href="https://github.com/openbsd/src/commit/9dd45fb4d11e8194b… | |
1150 into OpenBSD. | |
1151 From what I remember using it back then, it worked sufficiently well but… | |
1152 configuration was cumbersome. | |
1153 It supported Bluetooth HID keyboards and mice, audio, and serial devices. | |
1154 Six years ago, however, it was | |
1155 <a href="https://github.com/openbsd/src/commit/b8042ed98e3e7a691… | |
1156 due to conflicts with how it integrated into our kernel.</p> | |
1157 | |
1158 <p>While we still have no Bluetooth support today, it is possible … | |
1159 Bluetooth headphones using a small hardware dongle.</p> | |
1160 | |
1161 <p><img src="/images/2020-11-18-bt-w3-665x215.jpg" sr… | |
1162 | |
1163 | |
1164 | |
1165 <h2 id="creative-bt-w2">Creative BT-W2</h2> | |
1166 | |
1167 <p>Last year I | |
1168 <a href="https://web.archive.org/web/20200625180156/https://twit… | |
1169 the | |
1170 <a href="https://amzn.to/2HMScQt">Creative BT-W2</a&g… | |
1171 USB device, which presents a standard | |
1172 <a href="https://man.openbsd.org/uaudio"><code class=… | |
1173 device on OpenBSD and handles all of the Bluetooth pairing and audio | |
1174 communication itself with just one shortcoming: it did not expose any vo… | |
1175 control mechanism. | |
1176 OpenBSD’s sound server, | |
1177 <a href="https://sndio.org/"><code class="langua… | |
1178 did have software volume control so it was possible to limit the volume … | |
1179 <code class="language-plaintext highlighter-rouge">aucat… | |
1180 <a href="https://man.openbsd.org/sndioctl"><code clas… | |
1181 | |
1182 <p>I’ve been using the BT-W2 frequently since then to send audio… | |
1183 laptop to my Apple AirPods Pro, but unfortunately Apple released a firmw… | |
1184 some point that limited the volume output when paired with such devices, | |
1185 including | |
1186 <a href="https://www.cnet.com/how-to/how-to-fix-low-volume-issue… | |
1187 Presumably this was a safety measure because unless the sending side was… | |
1188 software volume control (which the AirPods wouldn’t know about), the A… | |
1189 would play at maximum volume.</p> | |
1190 | |
1191 <p>Unfortunately, even at the loudest volume from <code class=&… | |
1192 AirPods was still quite low, sometimes even too low to understand YouTub… | |
1193 with poor audio like conference talks. | |
1194 Otherwise though, the BT-W2 worked well and I didn’t notice any latenc… | |
1195 video sync issues on OpenBSD.</p> | |
1196 | |
1197 <h2 id="creative-bt-w3">Creative BT-W3</h2> | |
1198 | |
1199 <p>The other day I became aware of the updated | |
1200 <a href="https://amzn.to/2UBC0pE">Creative BT-W3</a&g… | |
1201 which now has a USB-C interface instead of USB-A and finally exposes har… | |
1202 mixer control (note the <code class="language-plaintext highligh… | |
1203 | |
1204 <div class="language-plaintext highlighter-rouge"><di… | |
1205 uaudio0: class v1, full-speed, sync, channels: 2 play, 1 rec, 2 ctls | |
1206 audio1 at uaudio0 | |
1207 </code></pre></div></div> | |
1208 | |
1209 <p>Since Tweeting about the BT-W2 last year, OpenBSD’s audio sys… | |
1210 quite a bit and now <code class="language-plaintext highlighter-… | |
1211 the preferred utility, rather than directly changing hardware mixer sett… | |
1212 with <code class="language-plaintext highlighter-rouge">… | |
1213 The new hardware volume control (<code class="language-plaintext… | |
1214 directly with <code class="language-plaintext highlighter-rouge&… | |
1215 the default <code class="language-plaintext highlighter-rouge&qu… | |
1216 | |
1217 <div class="language-plaintext highlighter-rouge"><di… | |
1218 outputs.dac=161 | |
1219 outputs.dac_mute=off | |
1220 record.enable=sysctl | |
1221 </code></pre></div></div> | |
1222 | |
1223 <p>Whatever mechanism the BT-W3 uses to handle this hardware volum… | |
1224 (whether just doing software volume limiting itself, or passing it throu… | |
1225 the AirPods through some fancy audio protocol), the benefit is that now … | |
1226 AirPods can be used at full volume from OpenBSD.</p> | |
1227 | |
1228 <h2 id="automatically-switching-to-bluetooth">Automatica… | |
1229 | |
1230 <p>My laptop’s | |
1231 <a href="https://jcs.org/2018/11/12/vfio">Dolby Atmos sp… | |
1232 is pretty good, so normally I just listen to music or play YouTube videos | |
1233 through the speakers. | |
1234 When my son is napping and I need to use my AirPods, I want to just plug… | |
1235 BT-W3 dongle and have it automatically start sending audio to my AirPods… | |
1236 have the volume controls on my keyboard control the AirPods.</p> | |
1237 | |
1238 <p>To accomplish this, set an alternate device name with <code … | |
1239 | |
1240 <div class="language-plaintext highlighter-rouge"><di… | |
1241 # rcctl restart sndiod | |
1242 </code></pre></div></div> | |
1243 | |
1244 <p>In this mode, <code class="language-plaintext highlight… | |
1245 the second audio device (<code class="language-plaintext highlig… | |
1246 If the device is not present, such as when the BT-W3 is not plugged in, … | |
1247 play through <code class="language-plaintext highlighter-rouge&q… | |
1248 | |
1249 <p>This works fine if the device is present when <code class=&q… | |
1250 will need a <code class="language-plaintext highlighter-rouge&qu… | |
1251 and start sending audio through it. | |
1252 This can be done automatically with <code class="language-plaint… | |
1253 | |
1254 <div class="language-plaintext highlighter-rouge"><di… | |
1255 case $2 in | |
1256 uaudio*) | |
1257 pkill -HUP sndiod | |
1258 ;; | |
1259 esac | |
1260 ^D | |
1261 # chmod +x /etc/hotplug/attach | |
1262 # rcctl enable hotplugd | |
1263 # rcctl start hotplugd | |
1264 </code></pre></div></div> | |
1265 | |
1266 <p>Now when a new <code class="language-plaintext highligh… | |
1267 <code class="language-plaintext highlighter-rouge">hotpl… | |
1268 available and start sending audio to it. | |
1269 When the BT-W3 is unplugged, <code class="language-plaintext hig… | |
1270 is no longer usable and send audio to its fallback, <code class="… | |
1271 Hardware device switching will be seamless and any applications playing … | |
1272 won’t have to stop or be restarted.</p> | |
1273 | |
1274 <p>My | |
1275 <a href="https://github.com/jcs/sdorfehs">window manager… | |
1276 is configured to respond to the hardware volume keys on my laptop (F4 fo… | |
1277 F5 for volume down, and F6 for volume up) by executing <code class=&q… | |
1278 commands will work the same regardless of which device <code class=&q… | |
1279 | |
1280 <div class="language-plaintext highlighter-rouge"><di… | |
1281 definekey top F5 exec sndioctl -q output.mute=0; sndioctl -q output.leve… | |
1282 definekey top F6 exec sndioctl -q output.mute=0; sndioctl -q output.leve… | |
1283 </code></pre></div></div> | |
1284 | |
1285 <h2 id="responding-to-headphone-buttons">Responding to H… | |
1286 | |
1287 <p>If your Bluetooth headphones have buttons on them, these can pa… | |
1288 BT-W3 as USB HID reports. | |
1289 My AirPods Pro have one hardware button (a squeeze on the stem) which ca… | |
1290 single, double, or triple pressed to perform a play/pause, next track, a… | |
1291 previous track.</p> | |
1292 | |
1293 <p>The possible actions that the BT-W3 supports can be seen with | |
1294 <a href="//man.openbsd.org/usbhidctl.1"><code class=&… | |
1295 on the first HID report of the device, which must be located in <code… | |
1296 | |
1297 <div class="language-plaintext highlighter-rouge"><di… | |
1298 uaudio1: class v1, full-speed, sync, channels: 2 play, 1 rec, 2 ctls | |
1299 audio2 at uaudio1 | |
1300 uhidev4 at uhub0 port 1 configuration 1 interface 3 "Creative Techn… | |
1301 uhidev4: iclass 3/0, 3 report ids | |
1302 uhid11 at uhidev4 reportid 1: input=2, output=0, feature=0 | |
1303 [...] | |
1304 </code></pre></div></div> | |
1305 | |
1306 <p>In my case, the first HID report on the BT-W3 is <code class… | |
1307 <code class="language-plaintext highlighter-rouge">usbhi… | |
1308 | |
1309 <div class="language-plaintext highlighter-rouge"><di… | |
1310 Report descriptor: | |
1311 Collection page=Consumer usage=Consumer_Control | |
1312 Input size=1 count=1 page=Consumer usage=Play/Pause, logical range 0..1 | |
1313 Input size=1 count=1 page=Consumer usage=Scan_Next_Track, logical rang… | |
1314 Input size=1 count=1 page=Consumer usage=Scan_Previous_Track, logical … | |
1315 Input size=1 count=1 page=Consumer usage=Stop, logical range 0..1 | |
1316 Input size=1 count=1 page=Consumer usage=Play, logical range 0..1 | |
1317 Input size=1 count=1 page=Consumer usage=Pause, logical range 0..1 | |
1318 Input size=1 count=1 page=Consumer usage=Fast_Forward, logical range 0… | |
1319 Input size=1 count=1 page=Consumer usage=Rewind, logical range 0..1 | |
1320 Input size=1 count=1 page=Consumer usage=Volume_Increment, logical ran… | |
1321 Input size=1 count=1 page=Consumer usage=Volume_Decrement, logical ran… | |
1322 Input size=1 count=1 page=Consumer usage=Mute, logical range 0..1 | |
1323 End collection | |
1324 Total input size 2 bytes | |
1325 Total output size 0 bytes | |
1326 Total feature size 0 bytes | |
1327 </code></pre></div></div> | |
1328 | |
1329 <p>By using the <code class="language-plaintext highlighte… | |
1330 AirPod is pressed:</p> | |
1331 | |
1332 <div class="language-plaintext highlighter-rouge"><di… | |
1333 Consumer_Control.Play/Pause=1 | |
1334 Consumer_Control.Scan_Next_Track=0 | |
1335 Consumer_Control.Scan_Previous_Track=0 | |
1336 Consumer_Control.Stop=0 | |
1337 Consumer_Control.Play=0 | |
1338 Consumer_Control.Pause=0 | |
1339 Consumer_Control.Fast_Forward=0 | |
1340 Consumer_Control.Rewind=0 | |
1341 Consumer_Control.Volume_Increment=0 | |
1342 Consumer_Control.Volume_Decrement=0 | |
1343 Consumer_Control.Mute=0 | |
1344 | |
1345 Consumer_Control.Play/Pause=0 | |
1346 [...] | |
1347 </code></pre></div></div> | |
1348 | |
1349 <p>One event is generated to report <code class="language-… | |
1350 right after it to report <code class="language-plaintext highlig… | |
1351 | |
1352 <p>To automate responding to these events, | |
1353 <a href="//man.openbsd.org/usbhidaction"><code class=… | |
1354 can be used. | |
1355 By default, the <code class="language-plaintext highlighter-roug… | |
1356 <code class="language-plaintext highlighter-rouge">0600&… | |
1357 without <code class="language-plaintext highlighter-rouge"&… | |
1358 This needed because the program has to run as my own user to access my X… | |
1359 session and environment variables.</p> | |
1360 | |
1361 <p>With a simple configuration file, I can make <code class=&qu… | |
1362 <a href="https://github.com/jcs/dotfiles/blob/master/bin/music&q… | |
1363 script to play/pause, skip to the next track, or play the previous track… | |
1364 | |
1365 <div class="language-plaintext highlighter-rouge"><di… | |
1366 Consumer:Play/Pause 1 | |
1367 ~/bin/music playpause | |
1368 Consumer:Scan_Next_Track 1 | |
1369 ~/bin/music next | |
1370 Consumer:Scan_Previous_Track 1 | |
1371 ~/bin/music prev | |
1372 | |
1373 $ usbhidaction -dv -c .usbhidaction.conf -f /dev/uhid11 | |
1374 PARSE:1 Consumer:Play/Pause, 1, '~/bin/music playpause' | |
1375 PARSE:2 Consumer:Scan_Next_Track, 1, '~/bin/music next' | |
1376 PARSE:3 Consumer:Scan_Previous_Track, 1, '~/bin/music prev' | |
1377 report size 2 | |
1378 executing '~/bin/music playpause' | |
1379 </code></pre></div></div> | |
1380 | |
1381 <p>Unfortunately <code class="language-plaintext highlight… | |
1382 started after the BT-W3 is plugged in and you must lookup which <code… | |
1383 the correct one to operate on each time.</p> | |
1384 | |
1385 <p>I have | |
1386 <a href="https://github.com/jcs/openbsd-src/commit/b2ad5f79a9e18… | |
1387 <a href="https://github.com/jcs/openbsd-src/commit/bdd58222f11ff… | |
1388 to work around these issues but it would be nice to have something more … | |
1389 that listens for input reports from all <code class="language-pl… | |
1390 them on some device stream that any program can listen to. | |
1391 But that is a project for another time.</p></content><author><name… | |
1392 to connect through a network proxy, particularly the one I made that is … | |
1393 convert TLS-encrypted data from my real mailserver into plaintext that t… | |
1394 Mac’s slow CPU can support.</p> | |
1395 | |
1396 | |
1397 <video controls="1" preload="none" poster="/… | |
1398 <source src="/videos/2020-11-12.mp4" type="video/mp4… | |
1399 <track default="" kind="captions" label="E… | |
1400 <p> | |
1401 Your browser doesn't seem to support HTML video. | |
1402 You can download the video in | |
1403 <a href="//cdn.jcs.org/videos/2020-11-12.mp4" download=&q… | |
1404 format instead. | |
1405 </p> | |
1406 </video> | |
1407 | |
1408 | |
1409 <p>Video notes:</p> | |
1410 <ul> | |
1411 <li><a href="https://tools.ietf.org/html/rfc1928"&g… | |
1412 <li><a href="https://github.com/jcs/sockhole">so… | |
1413 <li><a href="https://amzn.to/2Io10OV">Teensy 4.0… | |
1414 <li><a href="https://gemini.circumlunar.space/">… | |
1415 <li><a href="https://en.wikipedia.org/wiki/Gopher_(proto… | |
1416 and | |
1417 <a href="https://www.macintoshrepository.org/265-turbogopher&qu… | |
1418 </ul> | |
1419 | |
1420 <p>Please | |
1421 <a href="/contact">contact me</a> | |
1422 with any feedback or questions for future videos, and | |
1423 <a href="https://jcs.org/rss">subscribe to my RSS feed&l… | |
1424 for new videos and other posts.</p> | |
1425 | |
1426 <p>Join me and others on | |
1427 <a href="//libera.chat/">Libera Chat</a> | |
1428 in the | |
1429 <a href="irc://irc.libera.chat/cyberpals"><code class… | |
1430 channel if you are interested in following along with this series and ha… | |
1431 questions or would like to help others.</p></content><author><name… | |
1432 <a href="/2020/10/28/openbsd_diff">previous episode</… | |
1433 I quickly ported OpenBSD’s <code class="language-plaintext hig… | |
1434 files or scroll through the output. | |
1435 I’ve since added a proper GUI with the ability to select files or fold… | |
1436 in this episode I walk through the GUI and filesystem code and then add a | |
1437 proper Edit menu. | |
1438 I also make a formal release of the code and binary available for downlo… | |
1439 | |
1440 | |
1441 <video controls="1" preload="none" poster="/… | |
1442 <source src="/videos/2020-11-04.mp4" type="video/mp4… | |
1443 <track default="" kind="captions" label="E… | |
1444 <p> | |
1445 Your browser doesn't seem to support HTML video. | |
1446 You can download the video in | |
1447 <a href="//cdn.jcs.org/videos/2020-11-04.mp4" download=&q… | |
1448 format instead. | |
1449 </p> | |
1450 </video> | |
1451 | |
1452 | |
1453 <p>Video notes:</p> | |
1454 <ul> | |
1455 <li>Download on the Kludge BBS via <a href="telnet://klu… | |
1456 <a href="ssh://[email protected]">SSH</a>, and <a h… | |
1457 modem at <code class="language-plaintext highlighter-rouge"… | |
1458 </ul> | |
1459 | |
1460 <p>Please | |
1461 <a href="/contact">contact me</a> | |
1462 with any feedback or questions for future videos, and | |
1463 <a href="https://jcs.org/rss">subscribe to my RSS feed&l… | |
1464 for new videos and other posts.</p> | |
1465 | |
1466 <p>Join me and others on | |
1467 <a href="//libera.chat/">Libera Chat</a> | |
1468 in the | |
1469 <a href="irc://irc.libera.chat/cyberpals"><code class… | |
1470 channel if you are interested in following along with this series and ha… | |
1471 questions or would like to help others.</p></content><author><name… | |
1472 development of my IMAP client. | |
1473 Porting a large system like Git or even CVS would be overkill (and very … | |
1474 but maybe something small like OpenBSD’s | |
1475 <a href="https://github.com/openbsd/src/tree/master/usr.bin/rcs&… | |
1476 implementation would suffice. | |
1477 For now, just having a <code class="language-plaintext highlight… | |
1478 the guts of | |
1479 <a href="https://github.com/openbsd/src/tree/master/usr.bin/diff… | |
1480 and show it generating a unified diff between revisions of a C file.<… | |
1481 | |
1482 | |
1483 <video controls="1" preload="none" poster="/… | |
1484 <source src="/videos/2020-10-28.mp4" type="video/mp4… | |
1485 <track default="" kind="captions" label="E… | |
1486 <p> | |
1487 Your browser doesn't seem to support HTML video. | |
1488 You can download the video in | |
1489 <a href="//cdn.jcs.org/videos/2020-10-28.mp4" download=&q… | |
1490 format instead. | |
1491 </p> | |
1492 </video> | |
1493 | |
1494 | |
1495 <p>Video notes:</p> | |
1496 <ul> | |
1497 <li><a href="https://github.com/openbsd/src/tree/master/… | |
1498 <li><code class="language-plaintext highlighter-rouge&qu… | |
1499 THINK C author (thanks to Theo Buehler for letting me know)</li> | |
1500 <li><a href="https://www.youtube.com/watch?v=zAkmUi_PpJw… | |
1501 <li>My <code class="language-plaintext highlighter-rouge… | |
1502 <li><a href="https://www.tinkerboy.xyz/product/tinkerboy… | |
1503 </ul> | |
1504 | |
1505 <p>Please | |
1506 <a href="/contact">contact me</a> | |
1507 with any feedback or questions for future videos, and | |
1508 <a href="https://jcs.org/rss">subscribe to my RSS feed&l… | |
1509 for new videos and other posts.</p> | |
1510 | |
1511 <p>Join me and others on | |
1512 <a href="//libera.chat/">Libera Chat</a> | |
1513 in the | |
1514 <a href="irc://irc.libera.chat/cyberpals"><code class… | |
1515 channel if you are interested in following along with this series and ha… | |
1516 questions or would like to help others.</p></content><author><name… | |
1517 make them appear in the list in bold. | |
1518 That introduces an off-by-one which I run out of time to fix while recor… | |
1519 | |
1520 | |
1521 <video controls="1" preload="none" poster="/… | |
1522 <source src="/videos/2020-10-27.mp4" type="video/mp4… | |
1523 <track default="" kind="captions" label="E… | |
1524 <p> | |
1525 Your browser doesn't seem to support HTML video. | |
1526 You can download the video in | |
1527 <a href="//cdn.jcs.org/videos/2020-10-27.mp4" download=&q… | |
1528 format instead. | |
1529 </p> | |
1530 </video> | |
1531 | |
1532 | |
1533 <p>Please | |
1534 <a href="/contact">contact me</a> | |
1535 with any feedback or questions for future videos, and | |
1536 <a href="https://jcs.org/rss">subscribe to my RSS feed&l… | |
1537 for new videos and other posts.</p> | |
1538 | |
1539 <p>Join me and others on | |
1540 <a href="//libera.chat/">Libera Chat</a> | |
1541 in the | |
1542 <a href="irc://irc.libera.chat/cyberpals"><code class… | |
1543 channel if you are interested in following along with this series and ha… | |
1544 questions or would like to help others.</p></content><author><name… | |
1545 I also review a cleanup of <code class="language-plaintext highl… | |
1546 throughout the project.</p> | |
1547 | |
1548 | |
1549 <video controls="1" preload="none" poster="/… | |
1550 <source src="/videos/2020-10-21.mp4" type="video/mp4… | |
1551 <track default="" kind="captions" label="E… | |
1552 <p> | |
1553 Your browser doesn't seem to support HTML video. | |
1554 You can download the video in | |
1555 <a href="//cdn.jcs.org/videos/2020-10-21.mp4" download=&q… | |
1556 format instead. | |
1557 </p> | |
1558 </video> | |
1559 | |
1560 | |
1561 <p>Video notes:</p> | |
1562 | |
1563 <ul> | |
1564 <li><a href="https://vintageapple.org/macprogramming/pdf… | |
1565 <li><a href="https://tools.ietf.org/html/rfc3501#page-58… | |
1566 <li><a href="/system6c">My “C Programming on S… | |
1567 </ul> | |
1568 | |
1569 <p>Please | |
1570 <a href="/contact">contact me</a> | |
1571 with any feedback or questions for future videos, and | |
1572 <a href="https://jcs.org/rss">subscribe to my RSS feed&l… | |
1573 for new videos and other posts.</p> | |
1574 | |
1575 <p>Join me and others on | |
1576 <a href="//libera.chat/">Libera Chat</a> | |
1577 in the | |
1578 <a href="irc://irc.libera.chat/cyberpals"><code class… | |
1579 channel if you are interested in following along with this series and ha… | |
1580 |