<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: ygra</title><link>https://news.ycombinator.com/user?id=ygra</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Tue, 14 Apr 2026 20:42:56 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=ygra" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by ygra in "Simplest Hash Functions"]]></title><description><![CDATA[
<p>That only helps with multiplications by statically known word sizes (4x, 8x, etc.) and not arbitrary x·y. It can help with many smaller constant multipliers if the complete is clever, but it has to be known at compile time.</p>
]]></description><pubDate>Sun, 12 Apr 2026 06:55:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=47736823</link><dc:creator>ygra</dc:creator><comments>https://news.ycombinator.com/item?id=47736823</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47736823</guid></item><item><title><![CDATA[New comment by ygra in ""The new Copilot app for Windows 11 is really just Microsoft Edge""]]></title><description><![CDATA[
<p>So, like edit.com and QBasic. What is old is new again.</p>
]]></description><pubDate>Tue, 07 Apr 2026 13:26:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=47675057</link><dc:creator>ygra</dc:creator><comments>https://news.ycombinator.com/item?id=47675057</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47675057</guid></item><item><title><![CDATA[New comment by ygra in "Windows Notepad App Remote Code Execution Vulnerability"]]></title><description><![CDATA[
<p>> Did you know Windows comes with a bare bones C# 5 toolchain, with csc.exe, and even vbc.exe and jsc.exe?<p>Even with MSBuild 4. From the days when .NET Framework was an OS component and also the build tools (until Roslyn) were part of the Framework.</p>
]]></description><pubDate>Wed, 11 Feb 2026 11:24:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=46973625</link><dc:creator>ygra</dc:creator><comments>https://news.ycombinator.com/item?id=46973625</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46973625</guid></item><item><title><![CDATA[New comment by ygra in "Snow Simulation Toy"]]></title><description><![CDATA[
<p>Oh, that's something I also did in QBasic ages ago. I since lost the source code, but it basically worked by querying the screen from bottom to top, finding snow pixels (white) and moving them down, unless there was an obstacle. The initial snow on the ground (and the snowman) were using a different color that was almost white so it wouldn't detect as snow. It worked fairly well in 320×200 at the time.<p>I've tried the same approach in Turbo Pascal with BGI in the hopes of having a faster language and higher resolution available. It turned out to be quite a bit slower, likely because drawing and querying pixels was a bit more involved when using an adapter layer like BGI.<p>A few weeks ago I tried rewriting all that in TypeScript for fun and also trying to integrate it as an easter-egg with our graph drawing library (which renders with SVG) and first had to figure out how to efficiently support arbitrary obstacles that are initially SVG as well as a potentially changing viewport of the whole scene. I got sidetracked and didn't finish it, but proper collision handling was so easy back then (just look at the pixel color), but now with vector graphics and reading pixels being a very slow operation in many cases, it was surprisingly complicated.</p>
]]></description><pubDate>Tue, 27 Jan 2026 13:05:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=46779446</link><dc:creator>ygra</dc:creator><comments>https://news.ycombinator.com/item?id=46779446</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46779446</guid></item><item><title><![CDATA[New comment by ygra in "All my Deutschlandtickets gone: Fraud at an industrial scale [video]"]]></title><description><![CDATA[
<p>At least from Rostock to somewhat closer destinations you have both options. There's a bi-hourly IC to Hamburg or Berlin and another bi-hourly RE towards the same destinations. They're not terribly different in terms of travel time, but one is a regional train and one is an inter-city train.<p>Sure, long distances (I had to travel from Rostock to Tübingen last weekend) are typically not taken with regional trains (although you technically can; I did that as a poor student a few times, it just takes 16 hours instead of 10), but over medium distances (around 2–3 hours) you often have both options.</p>
]]></description><pubDate>Tue, 13 Jan 2026 09:13:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=46598786</link><dc:creator>ygra</dc:creator><comments>https://news.ycombinator.com/item?id=46598786</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46598786</guid></item><item><title><![CDATA[New comment by ygra in "Lego announces Smart Brick, the 'most significant evolution' in 50 years, no AI"]]></title><description><![CDATA[
<p>Rebrickable is awesome. One of my children loves building with instructions and will do relatively little free building with Lego, and Rebrickable makes it very easy to find alternative models (often with questionable stability, though) that can be built from the same set. It also features a search of alternative models you can build with all the sets (and bricks) you have.</p>
]]></description><pubDate>Fri, 09 Jan 2026 17:31:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=46556423</link><dc:creator>ygra</dc:creator><comments>https://news.ycombinator.com/item?id=46556423</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46556423</guid></item><item><title><![CDATA[New comment by ygra in "JavaScript's For-Of Loops Are Fast"]]></title><description><![CDATA[
<p>The way the array is constructed at least leads to holey arrays in V8. Perhaps similar in other implementations. The performance characteristics between different array types may vary significantly as well. Still, the traditional for loop, counting upwards seems to be fastest for me across Chrome and Firefox on Linux. For-of is slowest by a wide margin.</p>
]]></description><pubDate>Tue, 06 Jan 2026 10:27:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=46510700</link><dc:creator>ygra</dc:creator><comments>https://news.ycombinator.com/item?id=46510700</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46510700</guid></item><item><title><![CDATA[New comment by ygra in "The compiler is your best friend"]]></title><description><![CDATA[
<p>In fact, part of the implementation (or at least ideas) were borrowed from TypeScript. Nullability in C# changes depending on the checks around the code (similar to how the type of expressions in ThpeScript can change depending on prior code).</p>
]]></description><pubDate>Wed, 31 Dec 2025 23:54:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=46449639</link><dc:creator>ygra</dc:creator><comments>https://news.ycombinator.com/item?id=46449639</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46449639</guid></item><item><title><![CDATA[New comment by ygra in "Comptime – C# meta-programming with compile-time code generation and evaluation"]]></title><description><![CDATA[
<p>The use cases are different. While MSBuild tasks run during build (and partially when loading a project), typically the IDE is oblivious what happens there. The source generator runs directly inside the compiler infrastructure and thus you didn't get error highlights for code that would otherwise be only generated during build but not as you type. This makes it much more friendly than pure build-time generation of code.</p>
]]></description><pubDate>Thu, 25 Dec 2025 15:52:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=46385094</link><dc:creator>ygra</dc:creator><comments>https://news.ycombinator.com/item?id=46385094</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46385094</guid></item><item><title><![CDATA[New comment by ygra in "Comptime – C# meta-programming with compile-time code generation and evaluation"]]></title><description><![CDATA[
<p>Roslyn, the C#/VB compiler, uses them extensively, but in other code they're indeed quite rare.</p>
]]></description><pubDate>Thu, 25 Dec 2025 14:53:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=46384749</link><dc:creator>ygra</dc:creator><comments>https://news.ycombinator.com/item?id=46384749</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46384749</guid></item><item><title><![CDATA[New comment by ygra in "Volvo Centum is Dalton Maag's new typeface for Volvo"]]></title><description><![CDATA[
<p>I'm sure this font is neither intended for writing code or serial numbers.<p>Proper fonts do exist, but no font is usable in all circumstances.</p>
]]></description><pubDate>Thu, 25 Dec 2025 09:59:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=46383401</link><dc:creator>ygra</dc:creator><comments>https://news.ycombinator.com/item?id=46383401</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46383401</guid></item><item><title><![CDATA[New comment by ygra in "Comptime – C# meta-programming with compile-time code generation and evaluation"]]></title><description><![CDATA[
<p>You don't have to write the method twice. Source generators can only add new code, they cannot take away a method you declared, so it will still be there at runtime when called with non-constant arguments.</p>
]]></description><pubDate>Thu, 25 Dec 2025 06:51:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=46382658</link><dc:creator>ygra</dc:creator><comments>https://news.ycombinator.com/item?id=46382658</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46382658</guid></item><item><title><![CDATA[New comment by ygra in "Ireland’s Diarmuid Early wins world Microsoft Excel title"]]></title><description><![CDATA[
<p>The formulae are indeed stored in the same format, regardless of language. For rendering and parsing in the UI they use translated function names and the field separator (commma in English, but semicolon in many other languages because decimal numbers use a comma there).<p>It does irk me a bit (though not as much as the translated VBA back in the day). But that's probably because I know English, I often look for solutions to my problems in English, not in my native language, and then would have to mentally translate that back. But that's perhaps a burden for programmers more than for typical users.<p>A few thoughts:<p>• it's been that way for decades, at this point. So changing it would annoy a lot of users<p>• the problem with comma and semicolon would remain unless you want entering numbers normally and within a formula to be different. I'm not sure that's good in a product built around numbers (and often numbers that should be written and formatted like any other number in that country).<p>• making it configurable might work, but that then requires more testing, although sometimes it's not clear how much testing Microsoft is still doing, so that might not be much of a point. But adding options also has UX limits and not just in the length of the settings screen.</p>
]]></description><pubDate>Sun, 21 Dec 2025 05:54:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=46342592</link><dc:creator>ygra</dc:creator><comments>https://news.ycombinator.com/item?id=46342592</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46342592</guid></item><item><title><![CDATA[New comment by ygra in "Mapping Amazing: Bee Maps"]]></title><description><![CDATA[
<p>The map on the heatmap is definitely OSM without attribution. I can see a bunch of features I added. That doesn't make me respect them a lot. It's not that hard to use OSM correctly, at least in this context ...</p>
]]></description><pubDate>Sun, 07 Dec 2025 12:41:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=46181293</link><dc:creator>ygra</dc:creator><comments>https://news.ycombinator.com/item?id=46181293</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46181293</guid></item><item><title><![CDATA[New comment by ygra in "YouTube increases FreeBASIC performance (2019)"]]></title><description><![CDATA[
<p>Explanation for that is here: <a href="https://devblogs.microsoft.com/oldnewthing/20210126-00/?p=104759" rel="nofollow">https://devblogs.microsoft.com/oldnewthing/20210126-00/?p=10...</a></p>
]]></description><pubDate>Tue, 02 Dec 2025 16:42:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=46123125</link><dc:creator>ygra</dc:creator><comments>https://news.ycombinator.com/item?id=46123125</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46123125</guid></item><item><title><![CDATA[New comment by ygra in "3D solar tower increases capacity factor 50%, triples solar surface area"]]></title><description><![CDATA[
<p>You need a scaffold, which costs. The roof must be able to hold the additional mass (can be problematic in older buildings), you have to remove tiles and attach supports to the rafters and properly close the roof again. Sure, it's quick once work starts, but there's still some investment in material and tools you don't need on the ground.</p>
]]></description><pubDate>Thu, 30 Oct 2025 17:56:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=45762975</link><dc:creator>ygra</dc:creator><comments>https://news.ycombinator.com/item?id=45762975</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45762975</guid></item><item><title><![CDATA[New comment by ygra in "Safe zero-copy operations in C#"]]></title><description><![CDATA[
<p>> C# doesn't do escape analysis and automatically put things on the stack<p>There has been work ongoing in this direction since .NET 9 at least, but the effect is very limited currently. The following code however, has no allocations at runtime, despite having an object creation in the code:<p><a href="https://sharplab.io/#v2:C4LghgzgtgPgAgJgIwFgBQcDMACR2DC2A3utmbjgJYB2w2AYgPaMAUAlMaedwG5gBO2MNgC82agFMA7thrAA2gHYAugG4u3MnEVCAdABkJ1AObAAFurTcAvumtA=" rel="nofollow">https://sharplab.io/#v2:C4LghgzgtgPgAgJgIwFgBQcDMACR2DC2A3ut...</a></p>
]]></description><pubDate>Tue, 30 Sep 2025 13:35:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=45425254</link><dc:creator>ygra</dc:creator><comments>https://news.ycombinator.com/item?id=45425254</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45425254</guid></item><item><title><![CDATA[New comment by ygra in "What's New in C# 14: Null-Conditional Assignments"]]></title><description><![CDATA[
<p>> When you have an expression P which names a mutable place, and you execute P := X<p>This isn't the case, though, is it? A normal member access (or indexer) expression may point to a mutable location (field, property). However, with conditional access expressions you get either a member access _or nothing_. And that nothing is not a mutable place.<p>When you use any of the conditional operators, you split the following code into two paths, and dropping the assignment (since there's nothing to assign to) seems pretty consistent to me, since you'd also drop an invocation, or a property evaluation in similar expressions.<p>If you require P to point to something that actually exists because you want the assignment to succeed, then write code to ensure that P exists because the assignment has no way of knowing what the intention was on the left side.</p>
]]></description><pubDate>Thu, 18 Sep 2025 06:49:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=45286343</link><dc:creator>ygra</dc:creator><comments>https://news.ycombinator.com/item?id=45286343</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45286343</guid></item><item><title><![CDATA[New comment by ygra in "What's New in C# 14: Null-Conditional Assignments"]]></title><description><![CDATA[
<p>I think in the context of C# this is not exactly unexpected since there are various operators that apply conditional execution (and evaluation) to parts of an expression. All of them start with ?, though (? :, ??, ?., ?[], ??=), so except for casts to nullable types, every question mark in an expression signals that control flow is about to happen and it's been that way in C# for quite a while.</p>
]]></description><pubDate>Thu, 18 Sep 2025 06:41:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=45286285</link><dc:creator>ygra</dc:creator><comments>https://news.ycombinator.com/item?id=45286285</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45286285</guid></item><item><title><![CDATA[New comment by ygra in "What's New in C# 14: Null-Conditional Assignments"]]></title><description><![CDATA[
<p>I stumbled over this a few times, mostly when cleaning up older code. This basically just means that using the ?. member access no longer dictates what is possible on the right side.<p>Property reads were fine before (returning null if a part of the chain was null), method invocations were fine (either returning null or just being a no-op if a part of the chain was null). But assignments were not, despite syntactically every ?. being basically an if statement, preventing the right side from executing if the left side is null (yes, that includes side-effects from nested expressions, like arguments to invocations).<p>So this is not exactly a new feature, it just removes a gotcha from an old one and ensures we can use ?. in more places where it previously may have been useful, but could not be used legally due to syntax reasons.</p>
]]></description><pubDate>Thu, 18 Sep 2025 05:44:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=45285891</link><dc:creator>ygra</dc:creator><comments>https://news.ycombinator.com/item?id=45285891</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45285891</guid></item></channel></rss>