<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: owalt</title><link>https://news.ycombinator.com/user?id=owalt</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sat, 23 May 2026 05:48:17 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=owalt" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by owalt in "SectorC: A C Compiler in 512 bytes (2023)"]]></title><description><![CDATA[
<p>They're saying the naive implementation was more than 150 lines of C code (300-450 bytes), i.e. too big.</p>
]]></description><pubDate>Sat, 07 Feb 2026 21:01:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=46927968</link><dc:creator>owalt</dc:creator><comments>https://news.ycombinator.com/item?id=46927968</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46927968</guid></item><item><title><![CDATA[New comment by owalt in "Learning Feynman's Trick for Integrals"]]></title><description><![CDATA[
<p>No, it is correct. The integral is with respect to x, and the ordinary/partial derivatives are with respect to t. Written out fully, the derivative computation is<p>d/dt (x^t - 1)/ln(x) = d/dt [exp(ln(x)t) - 1]/ln(x)
= ln(x)exp(ln(x)t)/ln(x)
= exp(ln(x)t)
= x^t.<p>Edit: d/dt exp(ln(x)t) = ln(x)exp(ln(x)t) by the chain rule, while d/dt (1/ln(x)) = 0 since the expression is constant with respect to t.<p>There are convergence considerations that were not discussed in the blog post, but the computations seem to be correct.</p>
]]></description><pubDate>Sat, 29 Nov 2025 22:18:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=46091323</link><dc:creator>owalt</dc:creator><comments>https://news.ycombinator.com/item?id=46091323</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46091323</guid></item><item><title><![CDATA[New comment by owalt in "Notes on Taylor and Maclaurin Series"]]></title><description><![CDATA[
<p>I'm not quite sure whether you're asking for an explanation or whether you're simply making the observation that this is often omitted from the discussion. Either way I think it's an interesting point, so I'll elaborate a bit on it.<p>As you say, there's no guarantee that even a convergent Taylor series[0] converges to the correct value in any interval around the point of expansion. Though the series is of course trivially[1] convergent at the point of expansion itself, since only the constant term doesn't vanish.<p>The typical example is f(x) = exp(-1/x²) for x ≠ 0; f(0) = 0. The derivatives are mildly annoying to compute, but they must look like f⁽ⁿ⁾(x) = exp(-1/x²)pₙ(1/x) for some polynomials pₙ. Since exponential growth dominates all polynomial growth, it must be the case that f(0) = f'(0) = f"(0) = ··· = 0. In other words, the Taylor series is 0 everywhere, but clearly f(x) ≠ 0 for x ≠ 0. So the series converges only at x = 0. At all other points it predicts the wrong value for f.<p>The straight-forward real-analytic approach to resolve this issue of goes through the full formulation of Taylor's theorem with an explicit remainder term[2]:<p>f(x) = Σⁿf⁽ᵏ⁾(a)(x-a)ᵏ/k! + Rₙ(x),<p>where Rₙ is the remainder term. To clarify, this is a _truncated_ Taylor expansion containing terms k=0,...,n.<p>There are several explicit expressions for the remainder term, but one that's useful is<p>Rₙ(x) = f⁽ⁿ⁺¹⁾(ξ)(x-a)ⁿ⁺¹/(n+1)!,<p>where ξ is not (a priori) fully known but guaranteed to exist in [min(a,x), max(a,x)]. (I.e the closed interval between a and x.)<p>Let's consider f(x) = cos(x) as an easy example. All derivatives look like ±sin(x) or ±cos(x). This lets us conclude that |f⁽ⁿ⁺¹⁾(ξ)| ≤ 1 for all ξ∈(-∞, ∞). So |Rₙ(x)| ≤ (x-a)ⁿ⁺¹/(n+1)! for all n. Since factorial growth dominates exponential growth, it follows that |Rₙ(x)| → 0 as n → ∞ regardless of which value of a we choose. In other words, we've proved that f(x) - Σⁿf⁽ᵏ⁾(a)(x-a)ᵏ/k! = Rₙ(x) → 0 as n → ∞ for all choices of a. So this is a proof that the value of the Taylor series around any point is in fact cos(x).<p>Similar proofs for sin(x), exp(x), etc are not much more difficult, and it's not hard to turn this into more general arguments for "good" cases. Trying to use the same machinery on the known counterexample exp(-1/x²) is obviously hopeless as we already know the Taylor series converges to the wrong value here, but it can be illustrative to try (it is an exercise in frustration).<p>A nicer, more intuitive setting for analysis of power series is complex analysis, which provides an easier and more general theory for when a function equals its Taylor series. This nicer setting is probably the reason the topic is mostly glossed over in introductory calculus/real analysis courses. However, it doesn't necessarily give detailed insight into real-analytic oddities like exp(-1/x²) [3].<p>[0]: For reference, the Taylor series of a function f around a is: Σf⁽ᵏ⁾(a)(x-a)ᵏ/k!. (I use lack of upper index to indicate an infinite series as opposed to a sum with finitely many terms.)<p>[1]: At x = a, the Taylor series expansion is f(a) = Σⁿf⁽ᵏ⁾(a)(a-a)ᵏ/k! = f(a) + f'(a)·0 + f"(a)·0² + ··· = f(a). All the terms containing (x-a) vanish.<p>[2]: <a href="https://en.wikipedia.org/wiki/Taylor%27s_theorem#Taylor's_theorem_in_one_real_variable" rel="nofollow">https://en.wikipedia.org/wiki/Taylor%27s_theorem#Taylor's_th...</a><p>[3]: Something very funky goes on with this function as x → 0 in the complex plane, but this is "masked" in the real case. In the complex case, this function is said to have an essential singularity at x = 0.</p>
]]></description><pubDate>Tue, 30 Jul 2024 01:40:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=41105369</link><dc:creator>owalt</dc:creator><comments>https://news.ycombinator.com/item?id=41105369</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41105369</guid></item><item><title><![CDATA[New comment by owalt in "Proofs based on diagonalization help reveal the limits of algorithms"]]></title><description><![CDATA[
<p>Yes, for instance ...101010 (the pattern 10 repeated infinitely) isn't an integer.<p>It's maybe easier to think of the argument as working on sequences: From a sequence (x_0, x_1, x_2, ...) with each x_n a binary digit (i.e. 0 or 1) you can always construct a real number x = Sum(x_n / 2^n, n = 0, 1, 2, ...).<p>The integer you'd want to construct from such a sequence would be Sum(x_n * 2^n, n = 0, 1, 2, ...), but this only works if there's some N such that x_n = 0 for all n > N. Otherwise you would have an "infinite integer" (whatever that means). Valid positive integers are all on the form Sum(x_n * 2^n, n = 0, 1, 2, ..., N), i.e. the binary expansion is finite.<p>The subtlety of the diagonal argument (why it works for reals but not for integers/rationals) is that while it always produces _some_ string of digits, only the real numbers are defined such that the string of digits is itself always a real number. In the integer/rational case, you can construct a number "outside" the set you started from. (In fact you always do if the original list really was of all integers/rationals. Given any enumeration of the rationals, the diagonal argument can actually be used constructively to produce an irrational number.)</p>
]]></description><pubDate>Thu, 07 Sep 2023 08:32:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=37416217</link><dc:creator>owalt</dc:creator><comments>https://news.ycombinator.com/item?id=37416217</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37416217</guid></item><item><title><![CDATA[New comment by owalt in "Proofs based on diagonalization help reveal the limits of algorithms"]]></title><description><![CDATA[
<p>I don't quite understand your main concern, but it seems others did and have answered. To elaborate on why Cantor's argument doesn't go through for the integers:<p>Assume you had a list of every integer. To begin with, you couldn't start flipping bits from the left since integers don't start from the left. You could however imagine them having a sequence of 0s extending infinitely to the left, e.g. 101 = ...00000101. If you did that, the diagonal argument is possible to perform only starting from the rightmost digit, and you do end up with some string of numbers.<p>The problem is this: If you do walk right-to-left flipping bits in such a list, the integer case has an "out". You do end up with a string of 0s and 1s, but by assumption it can't have 0s extending infinitely to the left because then it would have been on the list. In other words, the thing you end up with never has its "final" 1, and so what you end up with isn't an integer.<p>This is really the crux of the argument: Not every string of 0s and 1s actually represents an integer. However, put any string of 0s and 1s after the radix point ("decimal point") and that does represent a real number. So what you construct in the real version of the argument really is a real number not on the list (i.e. a contradiction).<p>It's instructive to do the same thought experiment with an imaginary list of rational numbers written out as decimals and see why the diagonal argument fails in that case too.<p>Now I described the above as a kind of procedure ("walk right-to-left") but that's really just for convenience. There isn't any actual iteration going on.</p>
]]></description><pubDate>Thu, 07 Sep 2023 06:32:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=37415441</link><dc:creator>owalt</dc:creator><comments>https://news.ycombinator.com/item?id=37415441</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37415441</guid></item><item><title><![CDATA[New comment by owalt in "Does there exist a complete implementation of the Risch algorithm?"]]></title><description><![CDATA[
<p>This does not – according to what I can see from the code and comments – implement the case of algebraic extensions. As someone only really familiar with the implementation of the transcendental case[1], my understanding is that the algebraic case is where the major difficulty lies.<p>[1]: Manuel Bronstein, Symbolic Integration I. Online: <a href="https://archive.org/details/springer_10.1007-978-3-662-03386-9/mode/2up" rel="nofollow noreferrer">https://archive.org/details/springer_10.1007-978-3-662-03386...</a></p>
]]></description><pubDate>Mon, 14 Aug 2023 21:28:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=37127041</link><dc:creator>owalt</dc:creator><comments>https://news.ycombinator.com/item?id=37127041</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37127041</guid></item><item><title><![CDATA[New comment by owalt in "Ask HN: What's the coolest physical thing you've made?"]]></title><description><![CDATA[
<p>That's incredibly cool looking!</p>
]]></description><pubDate>Mon, 07 Aug 2023 17:53:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=37038042</link><dc:creator>owalt</dc:creator><comments>https://news.ycombinator.com/item?id=37038042</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37038042</guid></item><item><title><![CDATA[New comment by owalt in "The Sad Bastard Cookbook"]]></title><description><![CDATA[
<p>Indeed. As someone who (in the past) struggled a lot with eating, fasting would not have been a solution - it was the entire problem!<p>This is the first cookbook I've read that seems to get the effort level vaguely right for a meal you still might be able to make after not eating or drinking anything for 40+ hours. In fact, the "literal depression cooking" meal is close to what most of my meals were, but I rarely even had cheese to add.</p>
]]></description><pubDate>Sun, 06 Aug 2023 14:08:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=37022097</link><dc:creator>owalt</dc:creator><comments>https://news.ycombinator.com/item?id=37022097</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37022097</guid></item><item><title><![CDATA[New comment by owalt in "Super Mario 64 – Watch for Rolling Rocks – 0.5x a Presses [video]"]]></title><description><![CDATA[
<p>To be fair to the author (and I know this is by no means obvious context coming into the video), his channel blew up shortly before this video. His previous audience consisted of people in the Super Mario 64 speedrun/challenge community who would need less explanation.<p>The thoroughness of this video seems to me to be proof that he wanted to get these newer viewers up to speed. In fact it's basically a love letter to the uninformed viewer. The "complaining" at the start is just lightly poking fun at these newer people while also serving the double purpose of informing them about the explanations in his description boxes. Given the lasting popularity of this video, I don't think too many people took offense.</p>
]]></description><pubDate>Fri, 14 Jul 2023 19:23:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=36728719</link><dc:creator>owalt</dc:creator><comments>https://news.ycombinator.com/item?id=36728719</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=36728719</guid></item><item><title><![CDATA[New comment by owalt in "C++23: The Next C++ Standard"]]></title><description><![CDATA[
<p>> Ah, matrices! Does * mean dot product, cross product, or the usually less useful matrix multiplication? Ooh, or maybe you should you use . for dot! How clever that would be!<p>Why the snark? The fact that you're free to make a bad choice does not imply that having a free choice must be bad. Obviously neither dot nor cross product should be *. It should be the Hadamard product or matrix multiplication. You can choose one convention for your code and be perfectly happy for it.<p>As a follow-up question: How do you feel about languages like Fortran and Matlab then? Is it actually a good thing that mathematics convenience features are relegated to a few math-oriented languages and kept away from all the others? (Or are the linear algebra types in these languages offensive as well?)</p>
]]></description><pubDate>Tue, 11 Jul 2023 21:03:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=36687185</link><dc:creator>owalt</dc:creator><comments>https://news.ycombinator.com/item?id=36687185</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=36687185</guid></item><item><title><![CDATA[New comment by owalt in "Structures in C: From Basics to Memory Alignment"]]></title><description><![CDATA[
<p>I do my current work (embedded) on an architecture with the following properties:<p>- 8-bit bytes<p>- 16-bit aligned accesses to 32-bit types<p>- 32-bit aligned accesses to 64-bit types.<p>- Struct alignment depends on the size of the struct (32-bit aligned for >= 64-bit structs)<p>It's a pretty common architecture in the automotive industry, though probably would be considered esoteric for other applications.<p>This is not the first platform I've encountered with "unnatural" alignment rules in the embedded space, and I'm sure it won't be the last. (The extra packing this allows is actually quite handy.)</p>
]]></description><pubDate>Thu, 29 Jun 2023 23:47:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=36528431</link><dc:creator>owalt</dc:creator><comments>https://news.ycombinator.com/item?id=36528431</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=36528431</guid></item><item><title><![CDATA[New comment by owalt in "Semantic compression (2014)"]]></title><description><![CDATA[
<p>From the article:<p>> Normally, I would probably not make these member functions, but since The Witness is a more C++-ish codebase than my own, I thought it was more consistent with the style (and I don’t have a strong preference either way)<p>My interpretation of this is that normally he'd make plain C structs and functions that operate on them. So quite far from anything people would normally describe or think of as object oriented.</p>
]]></description><pubDate>Sat, 24 Jun 2023 18:35:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=36461453</link><dc:creator>owalt</dc:creator><comments>https://news.ycombinator.com/item?id=36461453</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=36461453</guid></item><item><title><![CDATA[New comment by owalt in "Ask HN: Why is the hunger for RAM never satisfied?"]]></title><description><![CDATA[
<p>I work on a <500kB RAM embedded project currently (and similar constraints in previous ones), and I can pretty much mirror what you said. The current project is in the planning/early development phase, and it's like everybody forgot the multi-month entire-app refactors we had to do twice to save some small fraction of total RAM in the previous project. But when you're pushing for another release with another too-tight release schedule, suddenly RAM savings are not an immediate but a future problem.<p>For us the day will come where we atone for our sins and have to again put off feature updates for months of RAM optimization. But in the PC/server/mobile space, that day gets pushed off whenever people move on to better hardware. So why not continue to bloat your applications, really? There's little incentive to do otherwise. If clunky abstractions make your developers ever so slightly happier, what's the reason not to embrace them?</p>
]]></description><pubDate>Sun, 12 Mar 2023 20:34:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=35125899</link><dc:creator>owalt</dc:creator><comments>https://news.ycombinator.com/item?id=35125899</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=35125899</guid></item><item><title><![CDATA[New comment by owalt in "Valve bans 40k Dota 2 accounts using honeypot patch"]]></title><description><![CDATA[
<p>Most people have no idea how to detect basic non-blatant cheats. Even simple low-FoV aimbots sneak past the vast majority of players. Good enough cheats are virtually undetectable by just human inspection.<p>The few people you saw cheating were probably frustrated enough with the game they decided burn their accounts and ticked enough boxes in their cheat menus to let them go out with a bang. It may of course be that you are particularly good at spotting cheats and Halo Infinite is just blessed to be relatively cheater-free. (I've not played it.) But I'd expect 1-2 orders of magnitude more games to have cheaters than your estimate.</p>
]]></description><pubDate>Fri, 24 Feb 2023 00:52:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=34919136</link><dc:creator>owalt</dc:creator><comments>https://news.ycombinator.com/item?id=34919136</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=34919136</guid></item><item><title><![CDATA[New comment by owalt in "Ask HN: Risk of unsafe software in automobiles?"]]></title><description><![CDATA[
<p>Short version of the difference: Safety = This shouldn't cause harm. Security = This should be hard to hack.</p>
]]></description><pubDate>Wed, 28 Dec 2022 18:06:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=34163799</link><dc:creator>owalt</dc:creator><comments>https://news.ycombinator.com/item?id=34163799</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=34163799</guid></item><item><title><![CDATA[New comment by owalt in "Ask HN: Risk of unsafe software in automobiles?"]]></title><description><![CDATA[
<p>It's worth noting that ISO 26262 is mostly concerned with preventing faults due to system failure, e.g. spurious hardware faults, hardware degradation over time, etc. As an example, it doesn't have much to say about preventing a child from being misclassified as a bollard. It's a quite robust standard, and one most auto makers (certainly the European ones) have spent a lot of effort processing and following for quite some time now (in my limited experience).<p>There's a separate standard (ISO 21448) trying to address issues with safety of intent, i.e. maintaining safety when there's no actual fault in the system. (Like the misclassification example.) This one's newer, much less effort has been spent developing it, and even less has been spent trying to follow it. Frankly it doesn't have as much to say. (And how could it? Nobody knows how to solve general classification problems, and especially not with something running on some 20 W max control unit.) This part of the problem space is basically the wild west. Some auto makers do a good effort trying to create safe solutions. Others not so much.<p>In summary, some of the electronics solutions in the car can probably be trusted to do what they're meant to (e.g. airbags). Others (e.g. lane keeping assist, emergency braking) are still still mostly be safe but certainly warrant keeping your hands on the wheel. Anything approaching fully self driving is at best quite dubious at this point though.</p>
]]></description><pubDate>Wed, 28 Dec 2022 17:50:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=34163635</link><dc:creator>owalt</dc:creator><comments>https://news.ycombinator.com/item?id=34163635</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=34163635</guid></item><item><title><![CDATA[New comment by owalt in "Embedding an EXE inside a .REG file with automatic execution"]]></title><description><![CDATA[
<p>Primarily a Windows user here (though not really by choice) and I guess I'll bite - what does it matter what people put on the Desktop? Are there any security implications of not keeping it tidy?<p>The rest of your points I fully agree with, but that one sticks out as weird to me.</p>
]]></description><pubDate>Thu, 28 Jul 2022 21:22:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=32270280</link><dc:creator>owalt</dc:creator><comments>https://news.ycombinator.com/item?id=32270280</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=32270280</guid></item><item><title><![CDATA[New comment by owalt in "Embed is in C23"]]></title><description><![CDATA[
<p>Honestly I'm usually very wary of additions to C, as one of its greatest strengths (to me) is how rather straightforward it is as a language in terms of conceptual simplicity. There just aren't that many big concepts to understand in the language. (On the other hand there's _many_ footguns but that's another issue.)<p>That said, to me this seems like a great addition to the language. It's very single-purpose in its usage (so it doesn't seem to add much conceptual complexity to the language) and it replaces something genuinely painful (arcane linker hacks). I'm very much looking forward to using this as I often make single-executable programs in C. The only thing that's unfortunate is I'm sure it'll take decades before proprietary embedded toolchains add support for this.</p>
]]></description><pubDate>Sat, 23 Jul 2022 13:48:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=32203311</link><dc:creator>owalt</dc:creator><comments>https://news.ycombinator.com/item?id=32203311</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=32203311</guid></item><item><title><![CDATA[New comment by owalt in "Speedsolving Rubik's Cube: 8355 Method"]]></title><description><![CDATA[
<p>Worth noting that the Devil's algorithm is not a sequence of turns you repeat over and over, but one that takes you through every possible cube state. You "abort" it partway through when you reach your desired state.</p>
]]></description><pubDate>Mon, 02 May 2022 12:59:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=31234568</link><dc:creator>owalt</dc:creator><comments>https://news.ycombinator.com/item?id=31234568</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=31234568</guid></item><item><title><![CDATA[New comment by owalt in "How to write a Git commit message (2014)"]]></title><description><![CDATA[
<p>None of this is really worth obsessing over I think, but one point in favor of imperative is it tends to also be the tersest phrasing, which is convenient if you're also aiming for 50 characters max.</p>
]]></description><pubDate>Wed, 27 Apr 2022 04:11:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=31176201</link><dc:creator>owalt</dc:creator><comments>https://news.ycombinator.com/item?id=31176201</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=31176201</guid></item></channel></rss>