<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: enoent</title><link>https://news.ycombinator.com/user?id=enoent</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sat, 13 Jun 2026 13:54:44 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=enoent" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by enoent in "Patching my guitar amp's firmware"]]></title><description><![CDATA[
<p>You read your chips' datasheets that go in detail on pinouts and protocols. You use logic analyzers that capture signals and programmatically decode a multitude of protocols from those signals. When you don't know what are the pinouts or protocols, you compare against similar enough known ones, or bruteforce them.<p>Some examples:<p>* Once you've learned a few chip pinouts, you can pretty much guess unknown pinouts just from identifying a few ground/control/address pins, as even chip-on-board globs follow similar layouts [1]. However, despite plenty of datasheet archives being publicly available, none of them allow you to actually search by pin function [2], so you potentially have to go through dozens of datasheets of similar model ids to find what you need.<p>* UART baud rates that are likely used are in the single digits, they can be easily bruteforced.<p>* JTAG pins you need to interface with can go up to a dozen or so, there are enumeration scripts you can run in an Arduino to identify which pin has which function. These scripts also identify the IDCODE which you can lookup against boundary scan files if you need so [3]. But in most cases, you will interface with JTAG without thinking of the state machine behind it.<p>* Reverse engineering memory maps is a matter of following data read/write patterns and inferring associated functionality. You will bump into several address cross-references that also hint at what are the base addresses of each map. It's a more general skill you develop as you go, and Ghidra's decompilation made it much more accessible in the last years. The author went with a elaborate linker script but a more bare-bones approach would be to link code as a distinct ELF object, then copy its text section over to offset 0x20A0000-0x2010000 in the firmware image, and patch the initializers.<p>* Soldering and associated skills can also be self-learned from tutorials, pick several videos and learn the tricks/mistakes each of them cover.<p>So, in practice? Each of these does not require a vast amount of knowledge for things to happen, even allowing one to skip required reading of huge bibles that are recommended to electronics beginners. This is how a lifetime gets reduced to a few months of non-working hours.<p>When getting into hardware hacking, what I felt was the main blocker is how a lot is described at a superficial level, without enough breadcrumbs one can follow to reproduce the same results. Sure, the pictures of spaghetti wires and decapped chips look awesome, but nobody learns from that. Unlike the software side where you are given the source and everything you need to lookup is in front of you.<p>[1]: <a href="https://qufb.gitlab.io/writeups/mysteries" rel="nofollow">https://qufb.gitlab.io/writeups/mysteries</a><p>[2]: <a href="https://github.com/qufb/PinoutDB" rel="nofollow">https://github.com/qufb/PinoutDB</a><p>[3]: <a href="https://bsdl.info/index.htm" rel="nofollow">https://bsdl.info/index.htm</a></p>
]]></description><pubDate>Thu, 04 Jun 2026 08:56:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=48396006</link><dc:creator>enoent</dc:creator><comments>https://news.ycombinator.com/item?id=48396006</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48396006</guid></item><item><title><![CDATA[New comment by enoent in "Show HN: Anyone interested in a tool helps to explore C++ ASTs"]]></title><description><![CDATA[
<p>Nice to see another static analysis tool.<p>It looks like the compilation database is only used for discovering source files, without any additional cross translation unit analysis [1]. Even if you don't plan on implementing data flow tracking or other passes, it can still be interesting to know on which translation unit a function declaration is defined on.<p>Also, it seems we always have to recompile each unit when switching between source files. Consider pre-compiling and caching so it's only done once. That should also enable users to search across files/ASTs.<p>[1]: <a href="https://clang.llvm.org/docs/analyzer/user-docs/CrossTranslationUnit.html" rel="nofollow">https://clang.llvm.org/docs/analyzer/user-docs/CrossTranslat...</a></p>
]]></description><pubDate>Sun, 24 May 2026 06:10:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=48254868</link><dc:creator>enoent</dc:creator><comments>https://news.ycombinator.com/item?id=48254868</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48254868</guid></item><item><title><![CDATA[New comment by enoent in "SQL patterns I use to catch transaction fraud"]]></title><description><![CDATA[
<p>> Fraud detection in transaction data is mostly SQL. Not machine learning, not graph databases, not whatever Gartner is hyping this year. SQL, run against the right tables, with the right joins, looking for the right shapes.<p>It's also not all program-integrity, which is the only work that could justify such blanket statements. Worse is better as long as it addresses the problem domain.<p>Fintech clients are generally interested in knowing whether a transaction happening _right now_ is fraud. They want to know that in a few milliseconds, for high-dimensional data. It's work done at a scale where relational databases cannot meet these real-time constraints, and instead find other uses like historical data loading. That's how you end up with in-memory databases, stream-processing engines, and yes, even machine learning.<p>Having said that, some of the author's points are valid, and I'm looking forward for their next writings, in particular dealing with noisy alerts is a general problem beyond performance engineering.</p>
]]></description><pubDate>Sat, 16 May 2026 07:40:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=48157775</link><dc:creator>enoent</dc:creator><comments>https://news.ycombinator.com/item?id=48157775</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48157775</guid></item><item><title><![CDATA[New comment by enoent in "Extracting a UART Password via SPI Flash Instruction Tracing"]]></title><description><![CDATA[
<p>The author is referring to limitations in analysing banking:<p>> Ghidra supports the 8051 architecture but not code banking.<p>Usually in these ISAs an I/O port or a register sets the bank number, so any processor module should be able to resolve concrete banked references. But you still need to know what that register holds in various code paths, which are likely dynamically computing those values.<p>No tooling can give this out-of-the-box, as it relies on knowing the concrete initial state of the system (i.e. memory and register contents), and knowing what to return when hooking into I/O accesses.<p>Once these are known, we can leverage the built-in pcode emulator and run it with this state. It seems nowadays Ghidra has some built-in support for Z3, but I personally never used it, so I'm not sure how viable it is for symbolic execution. Regardless, with either approach, we would now have concrete banked code references being resolved, and could script some auto annotation of the disassembly with these references. These would be equivalent to what the author gathered from the logic analyzer trace.<p>A pure static analysis approach seems to suggest one would manually brute-force through all possible bank numbers at any given code path, which I guess is only viable if you have the time for that.</p>
]]></description><pubDate>Fri, 23 Jan 2026 08:37:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=46730027</link><dc:creator>enoent</dc:creator><comments>https://news.ycombinator.com/item?id=46730027</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46730027</guid></item><item><title><![CDATA[New comment by enoent in "Demystifying DVDs"]]></title><description><![CDATA[
<p>Which drives and parameters for the READ BUF SCSI command yielded the expected 2366 bytes per sector? I imagine that it was combined with seeks to each sector before reading from the buffer (as it would be harder to isolate multiple sectors data in cache?).<p>It seems like it was a follow-up from previous bruteforce efforts, which include a spreadsheet with various results, but it would help to have some conclusions on which were best: <a href="http://forum.redump.org/topic/51851/dumping-dvds-raw-an-ongoing-investigation-we-need-your-help/" rel="nofollow">http://forum.redump.org/topic/51851/dumping-dvds-raw-an-ongo...</a><p>Also, couldn't find any source/download for DiscImageMender.</p>
]]></description><pubDate>Wed, 31 Dec 2025 20:27:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=46447944</link><dc:creator>enoent</dc:creator><comments>https://news.ycombinator.com/item?id=46447944</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46447944</guid></item><item><title><![CDATA[New comment by enoent in "PalmOS on FisherPrice Pixter Toy"]]></title><description><![CDATA[
<p>Nice work Dmitry, looking forward to read your next article.<p>The later model Pixter Multimedia had the full memory space accessible via JTAG, which is how some carts and even boot ROM got dumped a while ago [1], is it the same deal with Pixter Color?<p>That OpenOCD script was a bit flaky, and sometimes the boot ROM would be already unloaded before reading, maybe you have some insights in how to make it more robust.<p>btw, have you looked into the original Pixter? The cart connector seems to have a very narrow bus, so it doesn't look like those carts have code, and probably can only be dumped with a decap.<p>[1]: <a href="https://qufb.gitlab.io/writeups/pixter" rel="nofollow">https://qufb.gitlab.io/writeups/pixter</a></p>
]]></description><pubDate>Sat, 06 Dec 2025 10:51:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=46172295</link><dc:creator>enoent</dc:creator><comments>https://news.ycombinator.com/item?id=46172295</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46172295</guid></item><item><title><![CDATA[New comment by enoent in "x86-64 Playground – An online assembly editor and GDB-like debugger"]]></title><description><![CDATA[
<p>For ARM (32-bit): <a href="https://alexaltea.github.io/unicorn.js/" rel="nofollow">https://alexaltea.github.io/unicorn.js/</a> or <a href="https://cpulator.01xz.net/" rel="nofollow">https://cpulator.01xz.net/</a><p>For other architectures, it feels like a missed opportunity to not have an independent WASM build of MAME's debugger, as the whole project could already be built in WASM (although I think the latest versions were broken, as that target isn't actively maintained): <a href="https://docs.mamedev.org/initialsetup/compilingmame.html#emscripten-javascript-and-html" rel="nofollow">https://docs.mamedev.org/initialsetup/compilingmame.html#ems...</a></p>
]]></description><pubDate>Tue, 21 Oct 2025 07:22:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=45653328</link><dc:creator>enoent</dc:creator><comments>https://news.ycombinator.com/item?id=45653328</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45653328</guid></item><item><title><![CDATA[New comment by enoent in "Binary Formats Gallery"]]></title><description><![CDATA[
<p>I found their ELF format specification to have a decent coverage, even if not completely exhaustive (e.g. some debug info isn't breakdown after a certain point, but it just might be incomplete rather than limitations).<p>> Things may be non-byte-aligned bitstreams.<p>* <a href="https://doc.kaitai.io/user_guide.html#_bit_sized_integers" rel="nofollow">https://doc.kaitai.io/user_guide.html#_bit_sized_integers</a><p>> Arrays of structures that go "read until id is 5, but if id is 5, nothing else of the structure is emitted."<p>* <a href="https://doc.kaitai.io/user_guide.html#_repetitions" rel="nofollow">https://doc.kaitai.io/user_guide.html#_repetitions</a><p>> Fields that may be optional if some parent of the current record has some weird value.<p>* <a href="https://doc.kaitai.io/user_guide.html#do-nothing" rel="nofollow">https://doc.kaitai.io/user_guide.html#do-nothing</a><p>> Files may be composed of records at arbitrary, random offsets that essentially require seeking to make any sense of it.<p>* <a href="https://doc.kaitai.io/user_guide.html#_relative_positioning" rel="nofollow">https://doc.kaitai.io/user_guide.html#_relative_positioning</a><p>> The metadata of your structure may depend on some early parameter (for example, is this field big-endian or little-endian?)<p>* <a href="https://doc.kaitai.io/user_guide.html#param-types" rel="nofollow">https://doc.kaitai.io/user_guide.html#param-types</a><p>* <a href="https://doc.kaitai.io/user_guide.html#switch-advanced" rel="nofollow">https://doc.kaitai.io/user_guide.html#switch-advanced</a></p>
]]></description><pubDate>Sat, 04 Oct 2025 04:22:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=45470496</link><dc:creator>enoent</dc:creator><comments>https://news.ycombinator.com/item?id=45470496</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45470496</guid></item><item><title><![CDATA[New comment by enoent in "Fernflower Java Decompiler"]]></title><description><![CDATA[
<p><a href="https://bytecodeviewer.com/" rel="nofollow">https://bytecodeviewer.com/</a></p>
]]></description><pubDate>Mon, 29 Sep 2025 07:06:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=45411061</link><dc:creator>enoent</dc:creator><comments>https://news.ycombinator.com/item?id=45411061</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45411061</guid></item><item><title><![CDATA[New comment by enoent in "The Kafka Replication Protocol with KIP-966"]]></title><description><![CDATA[
<p>Besides the implementation effort in building from scratch, it also opens you up to unknown unknowns, while the limitations of mature software are better defined. Just because Jepsen didn't test other alternatives doesn't mean they are free from issues.<p>Regarding the Kafka issues pointed out:<p>* 2 only affect you if you are using transactions (and I would be interested in knowing of alternatives that better handle exactly-once semantics);<p>* Consumer.close() is likely off the critical path of your applications (personally I never encountered these hangs);<p>* Aborted reads and torn transactions were mentioned as being fixed by KIP-890, of which the mentioned ongoing work was completed since that article was published: <a href="https://issues.apache.org/jira/browse/KAFKA-14402" rel="nofollow">https://issues.apache.org/jira/browse/KAFKA-14402</a></p>
]]></description><pubDate>Wed, 03 Sep 2025 04:36:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=45112285</link><dc:creator>enoent</dc:creator><comments>https://news.ycombinator.com/item?id=45112285</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45112285</guid></item><item><title><![CDATA[New comment by enoent in "Thunk: Build Rust program to support Windows XP, Vista and more"]]></title><description><![CDATA[
<p>Nice, also check these projects that target earlier versions:<p>* Rust9x: Compile Rust code for Windows 95, NT and above: <a href="https://news.ycombinator.com/item?id=31112273">https://news.ycombinator.com/item?id=31112273</a><p>* Rust on MIPS64 Windows NT 4.0: <a href="https://news.ycombinator.com/item?id=29240174">https://news.ycombinator.com/item?id=29240174</a></p>
]]></description><pubDate>Tue, 02 Sep 2025 06:56:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=45099916</link><dc:creator>enoent</dc:creator><comments>https://news.ycombinator.com/item?id=45099916</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45099916</guid></item><item><title><![CDATA[New comment by enoent in "Finding a 27-year-old easter egg in the Power Mac G3 ROM"]]></title><description><![CDATA[
<p>Without discrediting the author, as it's always cool to share these findings, was anyone actively looking for this over 27 years?<p>A lot of the times, it just happens that someone was the first person that even bothered trying digging into the code. Specially after decompilation became much more accessible for less popular architectures with Ghidra. Give it a try, there's plenty of low hanging fruit! I've submitted another case some time ago.<p>Also luckily, considering other OS easter eggs, it doesn't seem like there was any obfuscation involved, like "chained xor stored in bitmap resource of badly supported executable format": <a href="https://x.com/mswin_bat/status/1504788425525719043" rel="nofollow">https://x.com/mswin_bat/status/1504788425525719043</a></p>
]]></description><pubDate>Wed, 25 Jun 2025 06:41:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=44374248</link><dc:creator>enoent</dc:creator><comments>https://news.ycombinator.com/item?id=44374248</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44374248</guid></item><item><title><![CDATA[New comment by enoent in "So you wanna write Kubernetes controllers?"]]></title><description><![CDATA[
<p>Can you elaborate on that "little more work", given that resizing on demand isn't sufficient for this use-case, and predictive scaling is also out of the question?</p>
]]></description><pubDate>Mon, 27 Jan 2025 19:56:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=42844969</link><dc:creator>enoent</dc:creator><comments>https://news.ycombinator.com/item?id=42844969</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42844969</guid></item><item><title><![CDATA[New comment by enoent in "So you wanna write Kubernetes controllers?"]]></title><description><![CDATA[
<p>AWS autoscaling does not take your application logic into account, which means that aggresive downscaling will, at worst, lead your applications to fail.<p>I'll give a specific example with Apache Spark: AWS provides a managed cluster via EMR. You can configure your task nodes (i.e. instances that run the bulk of your submitted jobs to Spark) to be autoscaled. If these jobs fetch data from managed databases, you might have RDS configured with autoscaling read replicas to support higher volume queries.<p>What I've frequently see happening: tasks fail because the task node instances were downscaled at the end of the job, because they are no longer consuming enough resources to stay up, but the tasks themselves haven't finished. Or tasks failed because database connections were suddenly cut off, since RDS read replicas were no longer transmitting enough data to stay up.<p>The workaround is to have a fixed number of instances up, and pay the costs you were trying to avoid in the first place.<p>Or you could have an autoscaling mechanism that is aware of your application state, which is what k8s enables.</p>
]]></description><pubDate>Mon, 27 Jan 2025 08:22:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=42838698</link><dc:creator>enoent</dc:creator><comments>https://news.ycombinator.com/item?id=42838698</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42838698</guid></item><item><title><![CDATA[New comment by enoent in "An Introduction to Sleep Obfuscation for Malware (2023)"]]></title><description><![CDATA[
<p>Sleep obfuscation seems to be viable because scanners only execute periodically. I'm not very familiar with Windows internals, but why don't these scanners hook the VirtualProtect calls and only then scan the associated memory region? My understanding on using ROP is to make the calls seem to originate from trusted modules, but couldn't a kernel driver / hypervisor be able to detect all these calls regardless? Is it just too taxing on overall system performance or is there some other limitation?</p>
]]></description><pubDate>Sat, 22 Jun 2024 06:39:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=40756915</link><dc:creator>enoent</dc:creator><comments>https://news.ycombinator.com/item?id=40756915</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40756915</guid></item><item><title><![CDATA[New comment by enoent in "Debugging a Futex Crash"]]></title><description><![CDATA[
<p>x/w is a gdb command to dereference and print (x) 1 word-sized data (w) at the address given by the expression. So 0x08001ea1 was the unaligned address stored at $rsp + 8, passed as argument to __lll_lock_wait.</p>
]]></description><pubDate>Wed, 16 Aug 2023 18:37:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=37151648</link><dc:creator>enoent</dc:creator><comments>https://news.ycombinator.com/item?id=37151648</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37151648</guid></item><item><title><![CDATA[New comment by enoent in "CPUlator Computer System Simulator"]]></title><description><![CDATA[
<p>I wonder if MAME would work as an open-source alternative for these simulations. The built-in debugger and memory views cover most of that, and it doesn't take much to write a minimal driver that messes with some input file [1].<p>But if you do want some visual feedback like LEDs and such, you would have to write a layout and input logic for that (AFAIK has been done for MIDI synths).<p>It would also be more appropriate for shellcode / nostdlib experiments, although it's not clear how well CPUlator handles dynamic linking / relocations in their ELF executable support (seems like they build on their server [2], but run in a custom interpreter?)<p>[1]: <a href="https://qufb.gitlab.io/writeups/2023/02/26/Put-A-Sonic-On-It#writing-a-skeleton-driver" rel="nofollow noreferrer">https://qufb.gitlab.io/writeups/2023/02/26/Put-A-Sonic-On-It...</a>
[2]: <a href="https://cpulator.01xz.net/doc/#compiling" rel="nofollow noreferrer">https://cpulator.01xz.net/doc/#compiling</a></p>
]]></description><pubDate>Mon, 17 Jul 2023 14:17:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=36758524</link><dc:creator>enoent</dc:creator><comments>https://news.ycombinator.com/item?id=36758524</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=36758524</guid></item><item><title><![CDATA[What makes a (Sim)City (oversight)?]]></title><description><![CDATA[
<p>Article URL: <a href="https://qufb.gitlab.io/writeups/2023/02/03/What-makes-a-(Sim)City-(oversight)">https://qufb.gitlab.io/writeups/2023/02/03/What-makes-a-(Sim)City-(oversight)</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=36231371">https://news.ycombinator.com/item?id=36231371</a></p>
<p>Points: 2</p>
<p># Comments: 0</p>
]]></description><pubDate>Wed, 07 Jun 2023 18:37:54 +0000</pubDate><link>https://qufb.gitlab.io/writeups/2023/02/03/What-makes-a-(Sim)City-(oversight)</link><dc:creator>enoent</dc:creator><comments>https://news.ycombinator.com/item?id=36231371</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=36231371</guid></item><item><title><![CDATA[New comment by enoent in "Ask HN: How do you get better at debugging/finding a solution?"]]></title><description><![CDATA[
<p>Unfortunately, there's little curation of interesting debugging case studies or "debugmes". You can try to scavenge bug trackers, but they aren't optimized for this, just a bag of itches users want to scratch. Neither are war stories very fruitful, since rarely do you get to hunt down the corresponding bugfix commits, which are essential to not miss on the details that made those bugs tricky. But then, you already have the solution in front of you.<p>Instead, I've found much more deliberate practice and therefore value from reverse engineering: just like in debugging, you want to understand the underlying logic through program analysis.<p>You can pick security CTFs, crackmes, malware samples, proprietary software with bugs you want to fix, or functionalities you want to add, or even games where you want to find some hidden content, extract some resources, or modify some behaviors. In all that you will find something of your interest, and apply approaches that I think translate well to software development:<p>* Differential tracing: Want to know how some action reflects in the codebase? Take k instruction traces where you do everything except that action, then take a trace where you do that action, find out what are the unique differences in that last trace. Want to know what data gets written? Same approach with memory dumps and breakpoints. How do different inputs affect these changes? You will learn to be methodic and throughout in what you test and log.<p>* Recognizing patterns: Sometimes you don't have symbols for your functions, are you able to identify printf at a glance, or will you waste time following the logic of the function? Do you see relative offsets being used and recognize accesses to an array? With source code all this happens on a more macro view, such as algorithms or design patterns hidden in all those coupled functions and classes. But the micro view also applies: figure out what constants relate to specific functionalities, and you can grep your way to relevant functions or documentation.<p>* Avoiding boilerplate: This follows from the previous point, since you want to recognize the flow of data through the codebase, in order to have some call hierarchy to follow, otherwise it's easy to waste time on functionally that is irrelevant to you. Start with how data enters the application: stdin, files, database connections, http endpoints... Tests, examples, or client apps will also help here.<p>Oh and don't worry about learning some assembly language, just make that investment, since that's the straightforward, well defined, predictable part.</p>
]]></description><pubDate>Tue, 06 Sep 2022 16:19:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=32739266</link><dc:creator>enoent</dc:creator><comments>https://news.ycombinator.com/item?id=32739266</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=32739266</guid></item><item><title><![CDATA[New comment by enoent in "Sometimes, it is a compiler bug: inding and fixing a bug in a C++ toolchain"]]></title><description><![CDATA[
<p>The implementation was not saving any of the ymm registers, you can see this in the bug report's attached patch. It also took me a while to get, because the last snippet in the writeup only highlights the ymm1 register, instead of showing the actual diff along with the comment.<p>As an aside, I didn't find the writeup to be overly descriptive. The author does a great job linking every step and how they came to each conclusion along the way, even including hypotheses where they came out empty-handed. When a writeup omits these, it makes the author look like they were somehow enlightened to find the solution, instead of just following a methodical approach.</p>
]]></description><pubDate>Thu, 26 May 2022 10:54:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=31516867</link><dc:creator>enoent</dc:creator><comments>https://news.ycombinator.com/item?id=31516867</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=31516867</guid></item></channel></rss>