<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: phoboslab</title><link>https://news.ycombinator.com/user?id=phoboslab</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Wed, 10 Jun 2026 06:00:34 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=phoboslab" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by phoboslab in "Samsung's 60% DRAM price hike signals a new phase of global memory tightening"]]></title><description><![CDATA[
<p>I just looked at the invoice for my current PC parts that I bought in April 2016: I paid 177 EUR (~203 USD) for 32GB (DDR4-2800).<p>It's kinda sad when you grow up in a period of rapid hardware development and now see 10 years going by with RAM $/GB prices staying roughly the same.</p>
]]></description><pubDate>Fri, 21 Nov 2025 22:18:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=46009680</link><dc:creator>phoboslab</dc:creator><comments>https://news.ycombinator.com/item?id=46009680</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46009680</guid></item><item><title><![CDATA[New comment by phoboslab in "Ask HN: What Are You Working On? (Nov 2025)"]]></title><description><![CDATA[
<p>The WebGL game was build with my 2D game engine "Impact", which I previously ported to C[1]. The game has a 3d view, but logic still mostly works in 2 dimensions on a flat ground. The N64 version "just" needed a different rendering and sound backend.<p>[1] <a href="https://phoboslab.org/log/2024/08/high_impact" rel="nofollow">https://phoboslab.org/log/2024/08/high_impact</a></p>
]]></description><pubDate>Mon, 10 Nov 2025 07:00:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=45873199</link><dc:creator>phoboslab</dc:creator><comments>https://news.ycombinator.com/item?id=45873199</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45873199</guid></item><item><title><![CDATA[New comment by phoboslab in "Ask HN: What Are You Working On? (Nov 2025)"]]></title><description><![CDATA[
<p>Porting my 2014 WebGL game (<a href="https://phoboslab.org/xibalba/" rel="nofollow">https://phoboslab.org/xibalba/</a>) to the N64: <a href="https://x.com/phoboslab/status/1982883072292069641" rel="nofollow">https://x.com/phoboslab/status/1982883072292069641</a></p>
]]></description><pubDate>Sun, 09 Nov 2025 21:40:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=45869452</link><dc:creator>phoboslab</dc:creator><comments>https://news.ycombinator.com/item?id=45869452</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45869452</guid></item><item><title><![CDATA[New comment by phoboslab in "Tiny Texture Tumbler – JavaScript procedural texture library and editor"]]></title><description><![CDATA[
<p>Updated the readme. Thanks!</p>
]]></description><pubDate>Mon, 07 Oct 2024 20:58:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=41770976</link><dc:creator>phoboslab</dc:creator><comments>https://news.ycombinator.com/item?id=41770976</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41770976</guid></item><item><title><![CDATA[New comment by phoboslab in "The Great Pacific Garbage Patch Can Be Cleaned for $7.5B"]]></title><description><![CDATA[
<p>You probably have an extension that hides the cookie banner? Scrolling is enabled after clicking through.</p>
]]></description><pubDate>Mon, 09 Sep 2024 14:44:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=41489004</link><dc:creator>phoboslab</dc:creator><comments>https://news.ycombinator.com/item?id=41489004</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41489004</guid></item><item><title><![CDATA[New comment by phoboslab in "Porting my JavaScript game engine to C for no reason"]]></title><description><![CDATA[
<p>Googling your name reveals that you like to stir up drama. Please find another venue.</p>
]]></description><pubDate>Mon, 05 Aug 2024 12:30:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=41160709</link><dc:creator>phoboslab</dc:creator><comments>https://news.ycombinator.com/item?id=41160709</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41160709</guid></item><item><title><![CDATA[New comment by phoboslab in "Porting my JavaScript game engine to C for no reason"]]></title><description><![CDATA[
<p>I don't know what your personal agenda is, but there's so much misinformation and hyperbole in your comment that I have to assume that this is personal for some reason!?<p>I've been meaning to write a proper post-morten about all that, now that the dust has settled. But in the meantime, just quickly:<p>- I did not make billions. You're off by quite a few orders of magnitude. After taxes it was well below $500k.<p>- Nothing I did was illegal; that's how I got away with it.<p>- Coinhive was not ransomware. It did not encode/hide/steal data. In fact, it did not collect any data. Coinhive was a JavaScript library that you could put on your website to mine Monero.<p>- I did not operate it for "years". I was responsible for Coinhive for a total of 6 month.<p>- I did not organize a doxing campaign. There was no doxing of Brian Krebs. I had nothing to do with the response on the image board. They were angry, because Brian Krebs doxed all the wrong people and their response was kindness: donating to cancer research. In German Krebs = cancer, hence the slogan “Krebs ist scheiße” - “cancer is shit”.<p>- Troy Hunt did not "snatch away" the coinhive domain. I offered it to him.<p>In conclusion: I was naive. I had the best intentions with Coinhive. I saw it as a privacy preserving alternative for ads.<p>People in the beta phase (on that image board) loved the idea to leave their browser window open for a few hours to gain access to premium features that you would have to buy otherwise. The miner was implemented on a separate page that clearly explained what's happening. The Coinhive API was expressly written with that purpose: attributing mined hashes to user IDs on your site. HN was very positive about it, too[1]<p>The whole thing fell apart when website owners put the miner on their page without telling users. And further, when the script kiddies installed it on websites that they did not own. I utterly failed to prevent embedding on hacked websites and educating legitimate website owners on “the right way” to use it.<p>[1] <a href="https://news.ycombinator.com/item?id=15246145">https://news.ycombinator.com/item?id=15246145</a></p>
]]></description><pubDate>Mon, 05 Aug 2024 09:45:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=41159559</link><dc:creator>phoboslab</dc:creator><comments>https://news.ycombinator.com/item?id=41159559</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41159559</guid></item><item><title><![CDATA[New comment by phoboslab in "Porting my JavaScript game engine to C for no reason"]]></title><description><![CDATA[
<p>The original JavaScript engine “Impact” from 2010 is at the end of its life; the C rewrite “high_impact” is new and will (potentially) be around for as long as we have C compilers and some graphics API.<p>The JavaScript engine had a lot of workarounds for things that are not necessary anymore and some things that just don't work that well with modern browsers. From the top of my head:<p>- nearest neighbor scaling for pixel graphics wasn't possible, so images are scaled at load time pixel by pixel[1]. Resizing the canvas after the initial load wasn't possible with this. Reading pixels from an image was a total shit show too, when Apple decided to internally double the Canvas2D resolution for their “retina” devices, yet still reporting the un-doubled resolution[2].<p>- vendor prefixes EVERYWHERE. Remember those? Fun times. Impact had it's own mechanism to automatically resolve the canonical name[3]<p>- JS had no classes, so classes are implemented using some trickery[4]<p>- JS had no modules, so modules are implemented using some trickery[5]<p>- WebAudio wasn't a thing, so Impact used <Audio> which was never meant for low latency playback or multiple channels[6] and generally was extremely buggy[7]. WebAudio was supported in later Impact versions, but it's hacked in there. WebAudioContext unlocking however is not implemented correctly, because back then most browsers didn't need unlocking and there was no "official" mechanism for it (the canonical way now is ctx.resume() in a click handler). Also, browser vendors couldn't get their shit together so Impact needed to handle loading sounds in different formats. Oh wait, Apple _still_ does not fully support Vorbis or Opus 14 years later.<p>- WebGL wasn't a thing, so Impact used the Canvas2d API for rendering, which is _still_ magnitudes slower than WebGL.<p>- Touch input wasn't standardized and mobile support in general was an afterthought.<p>- I made some (in hindsight) weird choices like extending Number, Array and Object. Fun fact: Function.bind or Array.indexOf wasn't supported by all browsers, so Impact has polyfills for these.<p>- Weltmeister (the editor) is a big piece of spaghetti, because I didn't know what I was doing.<p>Of course all of these shortcomings are fixable. I actually have the source for “Impact2” doing all that with a completely new editor and bells and whistles. It was very close to release but I just couldn't push it over the finish line. I felt bad about this for a long time. I guess high_impact is my attempt for redemption :]<p>[1] <a href="https://github.com/phoboslab/Impact/blob/master/lib/impact/image.js#L82-L112">https://github.com/phoboslab/Impact/blob/master/lib/impact/i...</a><p>[2] <a href="https://phoboslab.org/log/2012/09/drawing-pixels-is-hard" rel="nofollow">https://phoboslab.org/log/2012/09/drawing-pixels-is-hard</a><p>[3] <a href="https://github.com/phoboslab/Impact/blob/master/lib/impact/impact.js#L180-L198">https://github.com/phoboslab/Impact/blob/master/lib/impact/i...</a><p>[4] <a href="https://github.com/phoboslab/Impact/blob/master/lib/impact/impact.js#L458">https://github.com/phoboslab/Impact/blob/master/lib/impact/i...</a><p>[5] <a href="https://github.com/phoboslab/Impact/blob/master/lib/impact/impact.js#L230-L354">https://github.com/phoboslab/Impact/blob/master/lib/impact/i...</a><p>[6] <a href="https://phoboslab.org/log/2011/03/multiple-channels-for-html5-audio" rel="nofollow">https://phoboslab.org/log/2011/03/multiple-channels-for-html...</a><p>[7] <a href="https://phoboslab.org/log/2011/03/the-state-of-html5-audio" rel="nofollow">https://phoboslab.org/log/2011/03/the-state-of-html5-audio</a></p>
]]></description><pubDate>Sun, 04 Aug 2024 23:11:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=41156937</link><dc:creator>phoboslab</dc:creator><comments>https://news.ycombinator.com/item?id=41156937</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41156937</guid></item><item><title><![CDATA[New comment by phoboslab in "Porting my JavaScript game engine to C for no reason"]]></title><description><![CDATA[
<p>It does, but the main speedup comes from using WebGL instead of Canvas2D. Sadly, Canvas2D is still as slow as it ever was and I really wonder why.<p>Years back I wrote a standalone Canvas2D implementation[1] that outperforms browsers by a lot. Sure, it's missing some features (e.g. text shadows), but I can't think of any reason for browser implementations needing to be _that_ slow.<p>[1] <a href="https://github.com/phoboslab/Ejecta">https://github.com/phoboslab/Ejecta</a></p>
]]></description><pubDate>Sun, 04 Aug 2024 17:00:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=41154813</link><dc:creator>phoboslab</dc:creator><comments>https://news.ycombinator.com/item?id=41154813</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41154813</guid></item><item><title><![CDATA[New comment by phoboslab in "Porting my JavaScript game engine to C for no reason"]]></title><description><![CDATA[
<p>To be fair, they modified Impact _a lot_. In some of their development streams[1] you can see a heavily extended Weltmeister (Impact's level editor).<p>Imho, that's fantastic! I love to see devs being able to adapt the engine for their particular game. Likewise, high_impact shouldn't be seen as a “feature-complete” game engine, but rather as a convenient starting point.<p>[1] <a href="https://youtu.be/4lZfnM9Ubeo?t=3215" rel="nofollow">https://youtu.be/4lZfnM9Ubeo?t=3215</a></p>
]]></description><pubDate>Sun, 04 Aug 2024 16:39:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=41154649</link><dc:creator>phoboslab</dc:creator><comments>https://news.ycombinator.com/item?id=41154649</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41154649</guid></item><item><title><![CDATA[New comment by phoboslab in "Quake in 13kb (2021)"]]></title><description><![CDATA[
<p>I assume you're talking about the pack_map.c used during build? That just was written in C because I had the .map parser already lying around from another side project. If I had done it from scratch for this project it likely would have been JS or PHP, too.</p>
]]></description><pubDate>Mon, 03 Jun 2024 09:41:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=40560903</link><dc:creator>phoboslab</dc:creator><comments>https://news.ycombinator.com/item?id=40560903</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40560903</guid></item><item><title><![CDATA[New comment by phoboslab in "Quake in 13kb (2021)"]]></title><description><![CDATA[
<p>Please play the post competition version: <a href="https://phoboslab.org/q1k3/" rel="nofollow">https://phoboslab.org/q1k3/</a><p>This fixes some bugs and also adds the mouse invert option.</p>
]]></description><pubDate>Mon, 03 Jun 2024 06:49:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=40559997</link><dc:creator>phoboslab</dc:creator><comments>https://news.ycombinator.com/item?id=40559997</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40559997</guid></item><item><title><![CDATA[New comment by phoboslab in "PHP Doesn't Suck Anymore"]]></title><description><![CDATA[
<p>For the past few years I've been building a B2B SAAS. Naturally I've chosen my "get shit done" language PHP to do it. While the product itself is as boring as it gets, I've had stretches of good fun with it by building _everything_ myself.<p>Naturally the web frontend is written in PHP, so are the cronjobs, shell scripts, message queues, WebSocket server, client software, statistics and the server automation (think Ansible, but imperative). Sharing my own libraries between all these parts is extremely valuable. Owning the whole stack means I never have to deal with black boxes or fiddle with dependency management. The language just gets out of the way so you can solve your actual problems.<p>The fact that PHP is reasonably good at all these things is a big advantage. The performance is certainly good enough (never became a problem) and the long running server applications (e.g. the WebSocket servers) are rock solid.</p>
]]></description><pubDate>Sat, 04 May 2024 10:37:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=40256519</link><dc:creator>phoboslab</dc:creator><comments>https://news.ycombinator.com/item?id=40256519</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40256519</guid></item><item><title><![CDATA[New comment by phoboslab in "TSAC: Low Bitrate Audio Compression"]]></title><description><![CDATA[
<p>Kinda related, I was exploring how much complexity you really need with <a href="https://qoaformat.org/" rel="nofollow">https://qoaformat.org/</a> - compresses at 278 kbits/s, but is much simpler than even MP2.</p>
]]></description><pubDate>Tue, 09 Apr 2024 07:56:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=39977089</link><dc:creator>phoboslab</dc:creator><comments>https://news.ycombinator.com/item?id=39977089</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39977089</guid></item><item><title><![CDATA[New comment by phoboslab in "Unlocking the NES (For Former Dawn) (2022)"]]></title><description><![CDATA[
<p>Archived: <a href="https://web.archive.org/web/20220203133132/https://somethingnerdy.com/unlocking-the-nes-for-former-dawn/" rel="nofollow">https://web.archive.org/web/20220203133132/https://something...</a></p>
]]></description><pubDate>Sat, 30 Mar 2024 20:37:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=39878404</link><dc:creator>phoboslab</dc:creator><comments>https://news.ycombinator.com/item?id=39878404</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39878404</guid></item><item><title><![CDATA[New comment by phoboslab in "JPEG XL and the Pareto Front"]]></title><description><![CDATA[
<p>Thanks, I missed that.<p>I just ran qoibench on the photos they used[1] and QOI does indeed fair pretty badly with a compression ratio of 71.1% vs. 49.3% for PNG.<p>The photos in the QOI benchmark suite[2] somehow compress a lot better (e.g. photo_kodak/, photo_tecnick/ and photo_wikipedia/). I guess it's the film grain with the high resolution photos used in [1].<p>[1] <a href="https://imagecompression.info/test_images/" rel="nofollow">https://imagecompression.info/test_images/</a><p>[2] <a href="https://qoiformat.org/benchmark/" rel="nofollow">https://qoiformat.org/benchmark/</a></p>
]]></description><pubDate>Fri, 01 Mar 2024 21:26:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=39566991</link><dc:creator>phoboslab</dc:creator><comments>https://news.ycombinator.com/item?id=39566991</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39566991</guid></item><item><title><![CDATA[New comment by phoboslab in "JPEG XL and the Pareto Front"]]></title><description><![CDATA[
<p>As far a I understand this benchmark JXL was using 8 CPU cores, while QOI naturally only used one. If you were to plot the graph with compute used (watts?) instead of Mpx/s, QOI would compare much better.<p>Also, curious that they only benchmarked QOI for "non-photographic images (manga)", where QOI fares quite badly because it doesn't have palleted mode. QOI does much better with photos.</p>
]]></description><pubDate>Fri, 01 Mar 2024 20:40:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=39566540</link><dc:creator>phoboslab</dc:creator><comments>https://news.ycombinator.com/item?id=39566540</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39566540</guid></item><item><title><![CDATA[New comment by phoboslab in "FPGA N64"]]></title><description><![CDATA[
<p>Romhacks are typically modifying the compiled binary ROM image. Kaze' work is based on the painstakingly disassembled code from the n64decomp project[1]. He's working in C, modifying the game and compiling it again for the original hardware. Not sure I'd call that a "romhack".<p>Great videos though!<p>[1] <a href="https://github.com/n64decomp/sm64">https://github.com/n64decomp/sm64</a></p>
]]></description><pubDate>Sat, 21 Oct 2023 19:10:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=37969657</link><dc:creator>phoboslab</dc:creator><comments>https://news.ycombinator.com/item?id=37969657</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37969657</guid></item><item><title><![CDATA[New comment by phoboslab in "Why NASA Chose WordPress for Revamping Its Flagship Website"]]></title><description><![CDATA[
<p>I love PHP. It's been my "get shit done" language for 20 years. It sustained many of my projects and not once became the bottleneck.<p>Wordpress however is still a hug pile of garbage. It might be functional and has all the features you'd ever need, but I could never trust it to run even a simple blog.<p>Edit: just looked at the some random Wordpress sources to check if source quality improved. It didn't. Who could ever be productive with something like this?: <a href="https://github.com/WordPress/WordPress/blob/master/wp-admin/edit-form-comment.php">https://github.com/WordPress/WordPress/blob/master/wp-admin/...</a></p>
]]></description><pubDate>Sat, 07 Oct 2023 18:49:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=37804412</link><dc:creator>phoboslab</dc:creator><comments>https://news.ycombinator.com/item?id=37804412</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37804412</guid></item><item><title><![CDATA[New comment by phoboslab in "When should you use the IN instead of the OR operator in Postgres?"]]></title><description><![CDATA[
<p>I was very confused about your comment (because the obvious answer is to use a JOIN), but then I realized you're talking about using a sharded database. To which my response is: don't. Just buy more RAM.<p>I realize that this doesn't scale indefinitely, but for the 99% of us who just need to manage a few billion rows, it's the right answer.</p>
]]></description><pubDate>Thu, 31 Aug 2023 13:21:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=37336740</link><dc:creator>phoboslab</dc:creator><comments>https://news.ycombinator.com/item?id=37336740</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37336740</guid></item></channel></rss>