Latest Posts (20 found)
Unsung Today

“Dear Human”

(It’s Halloween Week on Unsung, where we’re sharing scary, spooky, and creepy stories. This is a story of a second creepy bug I remember from my childhood.) The Monopoly Deluxe computer game from 1992 fascinated me for one reason that you will understand even if you know me only a little bit: despite not running on Windows, it had a really elegant rendition of a Windows-like user interface. The game came with a pull-down menu, two kinds of keyboard shortcuts, and fun sounds. There was a history log, with font sizes! There was good typography. It was, in some ways, an improvement over its inspiration, sporting gentler fonts, nicer shadows, better bezels, and cuter animations. In hindsight, it was maybe the epitome of that particular design style, more thoughtful that it needed to be and done by – I felt it even then – someone who really cared about user interface. It was still Monopoly, of course, and there were better games around. But I remember the interface of it all, and I particularly still remember one very strange moment. The game allowed you to play against one or more computer players. Instead of happening quietly inside the CPU, the computer’s turn was visualized exactly like a human player’s would be. People awaiting their turn would still see die on the board, pawns moving, dialog boxes for purchases or renting or chance appear, and then… the buttons pressing themselves. This was another thoughtful design decision, making it easier to feel you’re playing against someone else, rather than a mindless algo. That decision also came with some interesting consequences. One was the fact that, under some circumstances, you could beat the computer to pressing their own buttons. Instead of blocking that action, the game responded with a playful easter egg message that looked like this: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/dear-human/3.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/dear-human/3.1600w.avif" type="image/avif"> Like many other in-game actions, the message was accompanied with a sound. But this one felt different than all the otherwise joyful audio effects in the game. It was someone’s voice saying “I can do it” – perhaps a sample from a movie or another game, perhaps a reference to something. Even today , I have no idea. Without that context (if any existed) the voice felt… honestly? Intensely creepy. It was someone’s voice, or maybe even some thing ’s. Just listen for yourself: I’m telling you all this from the perspective of today, when I understand all of bits and pieces. But the way I stumbled upon it back in the early 1990s was this: I played against computer players for hours without ever seeing the “Dear Human” dialog or the voice sample, even once. But then, at some point, the game locked itself. Maybe it was an interface race condition, or maybe some other bug. In short: It was a computer’s turn, but the computer wasn’t doing anything. Tired of waiting, I clicked to rush things forward, and then… that creepy voice startled me. Worse, all of my subsequent clicks were accompanied by the same dialog box and yet another appearance of that terrifying sound sample. The game thought it was a computer’s turn and prevented me from doing stuff, but despite the creepy proclamations, the game also wasn’t doing anything itself. Imagine a young me, playing the generally heretofore fun game late at night, when suddenly everything grinds to a halt, and the tone shifts completely. My keystrokes and clicks go nowhere, and I’m trapped on a virtual Monopoly board with a frightening voice – somewhere between a child, a robot, and the Twin Peaks’s Red Room – saying, over and over again: I̷̳̦͉̯̎́̈́̎͛͘͜ ̵̹̀̓̃̇̃́C̴̼̜͔̈͐̈A̴͍̤̩̤̐̃̀̑̂͌͜N̶̬̅́̔̅͘͠ ̶̦͎̣͚̦͕͂D̵͙̰̬̲͎̩̒̇̒̕Ŏ̷̺͉̔̚͠ ̷̡̙̥̝͍͈̽͂́͒͋Ḯ̵̧͓͉͉͔̰̓T̴̩̥̤͌̓̇̉̂̒ I’ve since seen many ways in which interfaces got stuck, but this was the only one I felt like the UI became absolutely possessed . (To run the game yourself, go to the Internet Archive , click on the big green button, wait until the board appears, press Ctrl+Q to exit the game (or use the right click menu), type to run it again (now with sound), wait until the board appears, press Ctrl+N to start a new game.)

0 views
Unsung Today

Book review: The Cuckoo’s Egg

(It’s Halloween Week on Unsung, where we’re sharing scary, spooky, and creepy stories.) My server was hacked a few months ago. It wasn’t an obvious “bad password” kind of a situation, but I believe a hole in PHP propped open by some code I wrote 25 years ago. (It’s entirely possible some ancient scripts I wrote for GUIdebook were to blame!) The hacker replaced some of my pages with garish ads for Indonesian casinos, and did some other slight damage. For a few days and nights, I played a cat-and-mouse game with the attacker, learning things, trying the newest patch, only to wake up to see some new pages on my server taken over – up until the moment I managed to close it all off. There were times during those few days when I knew I was patching my server at the same moment as the hacker was breaking it. It was a very strange, unnerving feeling, with some part of me wanting to reach out, have a conversation, generally learn more about them, or maybe also – I’m not going to lie – kick their ass. The Cuckoo’s Egg by Clifford Stoll is a book about a similar situation, except the story is from the mid-1980s, the server is at the Lawrence Berkeley National Laboratory, and the break-in takes longer than just a few days. And it all begins rather innocuously: And so it happened that on my second day at work, Dave wandered into my office, mumbling about a hiccup in the Unix accounting system. Someone must have used a few seconds of computing time without paying for it. The computer’s books didn’t quite balance; last month’s bills of $2,387 showed a 75-cent shortfall. Now, an error of a few thousand dollars is obvious and isn’t hard to find. But errors in the pennies column arise from deeply buried problems. […] I found the book – written by an astronomer! – much better than it had the right to be. The story gripping and continues throwing new wrinkles at the already interesting situation. I could sense some liberties taken with real-life events and chronology in service of smoother storytelling, but it all still feels pretty real, and nothing grated me too much. Released chronologically right in between WarGames and Sneakers , it is appropriately retro and old-fashioned – but there are still techniques that feel relevant, aspects of security that I don’t think changed that much since, and fascinating details I learned from. The only thing that bothered me was that the book should have ended a chapter or two before it did – there is a sort of second ending tacked on – but, to be fair, a lot of books have the same problem. If you feel like you’d fancy a breezy computer security espionage story from the 1980s, I’d recommend this one!

0 views

Tearaway is an amazing cozy game!

Busted out the Vita today and started playing Tearaway, what an amazing game! The art style and music give such a welcoming atmosphere. The gameplay mechanics use the unique features of the Vita so well. For example, you break through the game world by touching your fingers to the back touchpad and your face makes frequent appearances in the world (and story) thanks to the cameras. All of this is bundled in a fun, low-stakes game that makes you smile! Tearaway on my Vita If you have a Vita, I highly recommend giving this a play! If you don't have a Vita, unfortunately this is not a game to emulate. It's use of the unique hardware features of the Vita would translate poorly on any other device.

0 views
Unsung Today

“Miss you, Tom.”

(It’s Halloween Week on Unsung, where we’re sharing scary, spooky, and creepy stories.) This is a really enthralling video walking people through a 2023 fan-made Doom level myhouse.wad: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/miss-you-tom/yt1-play.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/miss-you-tom/yt1-play.1600w.avif" type="image/avif"> When I say “a fan-made Doom level,” I’m not doing it justice. It is not just a cool map, or just a technically impressive one. myouse.wad treats the Doom game engine as a canvas to tell a particular, and perhaps even poignant story, and a story could have only been told this way. From the author of the map, by way of an introduction : Last August I lost a good childhood friend of mine, and took it pretty hard. When I was visiting my hometown for his funeral, I connected with his parents who shared with me some of his old belongings. Among them was a copy of an old map of his, backed up on a 3.5″ floppy from high school. Thomas and I were into amateur Doom mapping in the early ’00s, but I had never seen this map of his prior to uncovering it on one of the old floppy disks. As a way of paying tribute to him and all the great memories we had together, I took the plunge and installed Doom Builder in order to polish up his map and add a few modern amenities just for convenience sake. And when I say “A really enthralling video,” I’m not doing that justice, either. In the summary of the 2023 BFI video awards , a reviewer wrote: A masterpiece of recapping, Power Pak’s video is essentially a narrated journey through an ingenious mod. A good recap doesn’t just communicate plot, but also the point of the essay; this does both. Excellent pacing and vocal delivery communicates the tone of the map, and becomes a jumping off point for an analysis of horror in gaming / the oft-discussed topic of liminal spaces. […] The video itself is performance, too, further blurring the lines between what is art and what is, erm, “real.” This isn’t cheap machinima, and this isn’t a cheap walkthrough. Definitely worth checking it out.

0 views

Who Is Santa Claus?

(This post is still a work in progress.) According to Religion Wiki , "Santa Claus, a jolly old man with a long white beard who is said to distribute presents to good children on Christmas Eve, is largely based on Odin, merged with the Christian legend of Saint Nicholas of Myra.[15] Most Christmas traditions in Germanic countries derive from celebrations of the pagan winter solstice holiday Yule as a result of the gradual merging of the two holidays. Odin was recorded as leading a great Yule hunting party through the sky.[16] Two books from Iceland, the Poetic Edda, compiled in the 13th century from earlier sources, and the Prose Edda, written in the 13th century by Snorri Sturluson, describe Odin as riding an eight-legged horse named Sleipnir that could leap great distances, giving rise to comparisons to Santa Claus's reindeer.[17] Further, Odin was referred to by many names in Skaldic poetry, some of which describe his appearance or functions; these include Síðgrani,[18] Síðskeggr,[19] Langbarðr,[20] (all meaning "long beard") and Jólnir[21] ("Yule figure"). According to Phyllis Siefker, children would place their boots, filled with carrots, straw, or sugar, near the chimney for Odin's flying horse, Sleipnir, to eat. Odin would then reward those children for their kindness by replacing Sleipnir's food with gifts or candy. This practice, she claims, survived in Germany, Belgium, and the Netherlands after the adoption of Christianity and became associated with Saint Nicholas as a result of the process of Christianization and can be still seen in the modern practice of the hanging of stockings at the chimney in some homes." "Thor, who was honoured as the highest god in Norway" Thor can revive animals, "Their host was hospitable but very poor, and Thor, seeing that he would scarcely be able to supply the necessary food to satisfy his by no means small appetite, slew both his goats, which he cooked and made ready to eat, inviting his host and family to partake freely of the food thus provided, but cautioning them to throw all the bones, without breaking them, into the skins of the goats which he had spread out on the floor. ... On the morrow, however, Thor, ready to depart, struck the goat skins with his hammer Miölnir, and immediately the goats sprang up as lively as before, except that one seemed somewhat lame." Wore a belt, "Seizing an opportunity to tighten his belt Megin-giörd" Wore red clothing according to the painting Thor und die Midgardsschlange (1905) by Emil Doepler, And had a beard and long hair according to Thor wades rivers while the rest of the æsir ride across the bridge Bifröst as described in Grímnismál (1895) by Karl Gjellerup Thor rode in a "brazen chariot drawn by two goats". Odin owned a horse called Sleipnir "Odin himself was once dashing through the air on his eight-footed steed Sleipnir" that was gray, Thor's name gave rise to Thursday, "Thor’s name has been given to many of the places he was wont to frequent, such as the principal harbour of the Faroe Islands, and to families which claim to be descended from him. It is still extant in such names as Thunderhill in Surrey, and in the family names of Thorburn and Thorwaldsen, but is most conspicuous in the name of one of the days of the week, Thor’s day or Thursday." "Thor was considered a pre-eminently benevolent deity, and it was for that reason that he was so widely worshipped and that temples to his worship arose at Moeri, Hlader, Godey, Gothland, Upsala, and other places, where the people never failed to invoke him for a favourable year at Yule-tide, his principal festival. It was customary on this occasion to burn a great log of oak, his sacred tree, as an emblem of the warmth and light of summer, which would drive away the darkness and cold of winter." Yule-tide, also known as Yule, according to Wikipedia is "a winter festival and time of the year historically observed by pagan Germanic peoples that was later merged with the festival of Christmas". "Brides invariably wore red, Thor’s favourite colour," Thor was said to come by the houses and eat food during the night, "Thor’s temples and statues, like Odin’s, were fashioned of wood, and the greater number of them were destroyed during the reign of King Olaf the Saint. According to ancient chronicles, this monarch forcibly converted his subjects. He was specially incensed against the inhabitants of a certain province, because they worshipped a rude image of Thor, which they decked with golden ornaments, and before which they set food every evening, declaring the god ate it, as no trace of it was left in the morning." According to Adam of Bremen's Gesta Hammaburgensis 26, Tschan's translation (1080), Uppsala used to have a temple dedicated to paganism. "In this temple, entirely decked out in gold, the people worship the statues of three gods in such wise that the mightiest of them, Thor, occupies a throne in the middle of the chamber; Wotan and Frikko have places on either side. The significance of these gods is as follows: Thor, they say, presides over the air, which governs the thunder and lightning, the winds and rains, fair weather and crops. The other, Wotan—that is, the Furious—carries on war and imparts to man strength against his enemies. The third is Frikko, who bestows peace and pleasure on mortals. His likeness, too, they fashion with an immense phallus." Odin himself was also depicted as an old man with a long white beard in this George Von Rosen depiction of 1886, The Bible mentions the tradition of the Christmas tree specifically in Jeremiah 10:3-4, "For the customs of the people are vain: for one cutteth a tree out of the forest, the work of the hands of the workman, with the axe. They deck it with silver and with gold; they fasten it with nails and with hammers, that it move not."

0 views

Hello? Where Is Everybody?

The shopping centre we find ourselves in also has an IKEA nearby. My daughter & I pop in to walk through the isles that house the teddy bears. She picks out a giraffe that now lives by the name Giraffa or just Raffa . For once, we don’t really need anything else in this lovely Swedish store so we head downstairs to find the checkout registers. Instead of encountering a friendly face that helps with the payment process, we’re greeted with closed registers resulting in too long lines. The only open ones are self-scanners. There goes the possibility for some lightweight banter. Our fridge is empty. We bike to the nearest supermarket for some quick midweek resupplies. No long queues this time, but just as little employees waiting for us at the checkout: only the occasional self-scan verification makes chitchat possible. I see that they closed yet another “human checkout lane”. The System Works . On one of the campuses where I teach, as part of an experiment, a small physical Amazon store has been opened. This is one of those weird zero personnel stores where everything operates through cameras and image recognition. It feels creepy to even be there. It was also ridiculously expensive and the experiment has been put on hold, but during my trip to the USA I encountered more of these… things? Supply factories ? Stores ? I don’t know what to call them. My ISP is giving me a headache by wrongly configuring something in the remote-controlled router. This wasn’t the first time it happened, but this time, I can’t seem to fix it myself. So I dial the free support number, only to be greeted with too many robot-controlled menu options. Press 1 for Dutch. Press 2 for other requests. Press 3 if you really really need to really talk to a human—are you sure? Press 6 to confirm. Press 7 to confirm. Please wait 20 more minutes. After ten minutes, I disconnect in frustration and turn to the internet. There’s a FAQ page, a support page pointing to the FAQ page, and of course a lovely genAI-controlled chatbot. After “reasoning” (ha!) with the bot for a few minutes, it suggests to call the number I already called 30 minutes ago. I try to look for an email address but can’t find one. My fuck this, I’ll solve it myself attitude ultimately fixed the problem at the cost of a portion of my social self. I mentor a couple of students working their way through various internships in the IT industry. As the point of contact for the school, I head over there three times: an initial conversation to set the stage, a quick check-in to validate if everything is still going well, and a more formal evaluation meeting to hand out grades together with the employer. I look up where I need to be, bike over there, find the correct building but not the correct floor. I missed the info desk at the entrance—oh wait, it’s just… not there. There’s also no information on the elevator as to which company operates on which floor. I eventually find the info I need in a hallway and arrive at the reception desk of the company. Again, nobody home. I can see people clutched behind their laptop in adjacent rooms through the windows. I resist the urge to wave and look around. The glass door towards the company’s hallway is locked. There’s an iPad bolted on the reception desk where I have to register myself. The form demands my email address (I provide my work one as they have it anyway) and a telephone number (Yeah right! What about ?). It states my contact will pick me up soon. I wait. I again resist the urge to wave. After 10 minutes, the person picks me up and walks me towards the meeting room. I mention the awkward impersonal registration process; he assures it works perfectly. As a software professional myself, knowing the many points of failure, I don’t believe him. He admits to being a bit later because the system works with Slack messages but he was monitoring the wrong channel. I wished I did wave. This depersonalising of receptions to “optimise” employee efficiency leaves a very bad taste in the mouth of the visitors. I biked home confused and still feel a little sad when thinking about it. How hard can it be to put a human there to, you know, greet the visitor with, you know a smile instead of an iPad that demands personal data that’s not relevant to the visit? In the form, I had to select my contact person (that gets notified with a Slack message) which is a simple that revealed every employee’s first name and last name. Oops? On top of that, the “the person is notified, sit back and relax!” wasn’t relaxing at all: I know how async backend messages work: the frontend shows “relax dude!” but the backend says and your message never reaches the contact person. Just raise that hand. Wave. If a receptionist calls someone, I can hear them making the call and I know I can relax: the message has been passed. Smile. Hello? Where is everybody? This evolution depresses me. I want to see real (not generated) faces and talk to someone real (not generated). The rise of these annoying CAN I HELP YOU WITH ANYTHING?? chatbots on corporate websites replacing a simple contact form only adds to the irritation. I can certainly relate to the increased amount of spam received through these forms, but I pay you every month enough to keep the lights on. The least I expect in return is a humane customer service experience. By Wouter Groeneveld on 26 October 2026.  Reply via email .

0 views

The End of the Internet

Listen to this post : It was the summer of 2003, just weeks before I was set to move to Taiwan, that I decided to create a blog to document my journey. I had, at that point, had a GeoCities site, a Blogspot site, a site I built in Microsoft FrontPage and hosted…somewhere, so this was my fourth swing at the blog thing (it was the seventh that ended up being Stratechery). I was intrigued by a just-released piece of software that promised a five-minute install; it was called WordPress. It did, I must confess, take me much longer than 5 minutes to install WordPress: it turned out I needed to learn how to create a MySQL database and configure PHP; once you had all of those component pieces in place, then yes, it only took 5 minutes to install! I was thinking back to those days last week when news broke that every version of PHP had a critical bug that allowed for remote code execution on the host machine; Stratechery today still runs on WordPress, but that WordPress is managed by Pressable , an Automattic company. That meant that my site was patched before the vulnerability was disclosed, and it would be crazy for me — or anyone else — to do it any other way. It’s kind of insane to think that twenty-some years ago I was doing everything by hand without having any idea what I was doing, and that it was totally fine. That’s the Internet, though: an insane invention from a time that is, sadly, gone forever. 2003 was, roughly speaking, right around the beginning of the blogosphere; yes, blogs existed — Dave Winer, often considered the father of blogs, started Scripting News in 1997, after early experiments with a personal site called DaveNet ; Justin Hall started Links.net in 1994; Jorn Barger coined the term “weblog” for Robot Wisdom , also in 1997, and the influential kottke.org started in 1998 — but it was the early 2000s when blogs suddenly seemed everywhere, particularly in the political space: That political blogs featured so prominently speaks, I think, to both the power and peril of the Internet’s first transformation. Up to that point the Internet was mostly technologists, comfortable discussing the intricacies of text editors and programming languages with other nerds on BBSs, early forums, and mailing lists; it was the politically minded, however, that realized that the freedom to start your own publication that could reach everyone was a radical development. The goal was not to make money; it was to make a difference. Originally these new publications were novel; what soon became clear, however, is that they were the tip of a wave of content that would dramatically expand the web. Newspapers had influence by being geographic monopolies; early bloggers gained influence by being the first to a new medium. Ultimately, however, the real winner of the web was Google: as the amount of content became abundant, Google offered not distribution — which was free — but rather discovery; indeed, it’s because distribution was free that discovery became the most important part of the value chain. Many of those early bloggers made a decent amount of money from Google through its AdSense advertising program; by the end of the decade, however, the ads became more intrusive even as the payouts shrank, both because the inventory was limitless, and also because the most attractive ad slots were on Google Search. And so we saw one of the first examples of how the Internet fails: because everything is open, everyone has an opportunity, which means infinite competition, which is terrible for business. For many years I rued the fact I wasn’t one of those early bloggers; a decade later, however, I realized that I was actually just in time for a much more sustainable business model: subscriptions. I wrote in 2015’s Blogging’s Bright Future : It turns out, though, that there are more business models than simply advertising, as Sullivan himself sought to show. Sullivan was, for the last two years, supported by reader subscriptions to the tune of nearly one million dollars a year, and while many were skeptical of Sullivan’s efforts when he started, his ability to raise money shouldn’t have been a surprise: his is a singular voice — to put it in economic terms, Sullivan’s writing had a low elasticity of substitution — so people were happy to pay for something they couldn’t get anywhere else. Right there was the exact loyalty that Klein fears has been lost… I am, of course, acutely aware that there is a tradeoff when it comes to the subscription business model: by making something scarce, and worth paying for, you are by definition limiting your number of readers. Stratechery, though, serves a niche, and niches are best served by making more from customers who really care than from milking pennies from everyone. In short, the answer to drowning in abundance is to purposely limit your audience — to go small. That is an economic model that works, and notably, there are a lot of bloggers on that list who are using that model today. Blogging is alive and well, it’s just constrained, and thus worth paying for. Google wasn’t the only Aggregator: a decade later there was a new means of discovery, which was social media. Now instead of searching for a site you could have a link shared directly to you, not just by email but on a site that served up interesting updates about whomever you chose to follow. And, for a period of time, followers could become friends. Stratechery’s fortunate timing was not just in terms of subscriptions becoming technically viable, but also the fact that Twitter was a community, not unlike the early Internet: genuinely interesting conversations happened in public, and you could reply-guy your way to broader distribution. Social media was also free, however, and even easier to get started than a blog ever was; that meant that the amount of content was greater by many orders of magnitude. This meant that algorithms started to matter — Facebook had one relatively early, but it took Twitter much longer — and also anyone with any sort of prominence had to start taking a much more defensive approach. Community, sadly, doesn’t scale; any platform that is available to everyone starts out special and spirals from there. Ultimately, public social media sites became personal entertainment sites, tuned for engagement, culminating in TikTok, a social media site with basically zero social component. However, that doesn’t mean social networking went away: in fact, I think that social networking is stronger than ever; the difference is that it isn’t public, but is rather in group chats. Group chats are familiar, they are high trust, they are, in many respects, the best of the Internet: even as technology atomizes us the group chat is the only place you can connect with people you care about, anytime and anywhere. In other words, the redemption of social media was — just like blogging — to become smaller. The scaling that mattered for most people was not an ever larger audience, but a proliferation of infinite finite groups. Social media 1.0 , even at its best, followed the 90-9-1 rule: one percent spoke, nine percent commented, and 90 percent lurked; the magic of group chats is not in giving everyone a voice, but a place where you feel safe to talk. The PHP vulnerabilities were just two of a host of security issues last week alone; there were also: This is, believe it or not, only a partial list, and I expect things to only get worse. All of software is built on an inherently creaky human-authored foundation; the human factor meant the primary gate in all of software development was “Did it work?”, not “Is it secure from every possible privilege escalation or race condition?” or the myriad of ways that software can act in ways not intended. The saving factor previously is that attackers were limited by human time and ingenuity as well; AI, however, has limitless time and the ability to substitute iteration for cleverness — and it’s getting pretty clever as well! It’s not a surprise that this wave of vulnerabilities is coming to light, and it’s going to get worse before it gets better — which I do, for the record, expect to happen; after all, the good guys have AI as well, and in the long run software will be better when it is (re)written by AI, and defended by agents continuously. At the same time, what this entails is that the public Internet, to an even greater extent than now, will be a battle zone at best (i.e. social media), and a wasteland at worst (everything else). Some of this is economic, as AI consumes everything — both content and attention — without giving any of the traffic back that Google did, but it is also technical: it was already a dodgy proposition to stand up your own site or app, which was the very promise of the Internet, given the hacking risks; in the age of AI it’s madness. It is sad. When I was a kid we called up BBS’s that were hosted in people’s homes; when I was in high school we downloaded music from public FTP addresses; when I was in college we set up our own websites. Anyone could set up a server, and that server was just as much a part of the Internet as any other server; that’s simply not viable any longer, even if you weren’t worried about making money. The Internet as we knew it is dead. There are, however, green shoots of possibility, and once again the answer is to go smaller. When anyone can make an app, the answer is not to try and make a quick buck in the App Store; in fact, the surge in slop will make the market worse for everyone. Rather, it’s to make something for yourself and a small group of trusted friends and colleagues. This is exactly what has happened at Stratechery: we have made a bunch of different apps, for everything from podcast production to task trackers to calendar management, none of which will ever be made available publicly. That doesn’t even include the apps made for oneself: I’ve created a bunch of different apps to manage my house and sports viewing: it turns out I had a lot of software-shaped holes in my life that suddenly I can fill without asking permission. Software has always been different from physical goods in that its zero marginal cost nature meant it could scale to far more people; at the same time, the sheer amount of up-front effort involved in creating it meant that the intended audience needed to be large enough to justify the investment. AI completely changes that: suddenly it’s possible to create software for one person, or one team; smaller target audiences aren’t just a necessity for security, they’re an entirely new and potentially much larger market for software creation at scale, by literally everyone. Or, to use the example above, the group chat era of software is here and it’s going to be so much better than what came before. Venkatesh Rao wrote an absolute must-read essay over the weekend called Cognitive Mercantilism . In brief, Rao makes the case that mercantilism rested on an assumption that economics was about scarcity and control; what brought about capitalism was demand. When people were freed from the burden of subsistence farming they discovered wants and desires at a scale that pulled entire markets into existence. Rao suggests the same might happen when people are freed from “subsistence cognition”. Rao concludes: What gets missed is the possibility that we are witnessing the beginning of a transition as profound as the one from an overwhelmingly agricultural society to an industrial and commercial one. From a world where 80% of human brains are engaged in subsistence cognition to one in which 95% are engaged in satisfying previously unfulfillable cognitive demands. The most important consequence of the agricultural revolution was not that farming became more efficient. It was that most people were liberated from the necessity of farming, allowing entirely new kinds of economic and cultural life to emerge. Likewise, the most important consequence of the AI revolution may not be that intelligence production becomes more efficient. It may be that most minds, human and eventually artificial, are liberated from the necessity of producing intelligence merely to survive, and become free to discover what they actually want to do with it. The cognitive mercantilist sees a world threatened by an oversupply of intelligence and an impending surplus of useless minds. The AI Malthusian sees a world in which intelligence outruns the capacity of humanity to absorb it, leaving a growing population of economically redundant minds primed for revolutionary explosions. The cognitive capitalist sees the possibility of an almost limitless expansion of demand, and a world full of minds whose potential has barely begun to be explored. I do understand why people have difficulty imagining this future. Capitalism, particularly over the last half century, has increasingly given way to scale, as ever larger corporations mediate ever more economic transactions, and as the Internet has played an important role in making the market a global one. The England in which capitalism emerged, however, and especially the America in which it was perfected, was much different. Alexis de Tocqueville, in Democracy in America , famously wrote: The political associations which exist in the United States are only a single feature in the midst of the immense assemblage of associations in that country. Americans of all ages, all conditions, and all dispositions, constantly form associations. They have not only commercial and manufacturing companies, in which all take part, but associations of a thousand other kinds — religious, moral, serious, futile, extensive, or restricted, enormous or diminutive. The Americans make associations to give entertainments, to found establishments for education, to build inns, to construct churches, to diffuse books, to send missionaries to the antipodes; and in this manner they found hospitals, prisons, and schools. If it be proposed to advance some truth, or to foster some feeling by the encouragement of a great example, they form a society. Wherever, at the head of some new undertaking, you see the government in France, or a man of rank in England, in the United States you will be sure to find an association. I met with several kinds of associations in America, of which I confess I had no previous notion; and I have often admired the extreme skill with which the inhabitants of the United States succeed in proposing a common object to the exertions of a great many men, and in getting them voluntarily to pursue it. I have since travelled over England, whence the Americans have taken some of their laws and many of their customs; and it seemed to me that the principle of association was by no means so constantly or so adroitly used in that country. The English often perform great things singly; whereas the Americans form associations for the smallest undertakings. It is evident that the former people consider association as a powerful means of action, but the latter seem to regard it as the only means they have of acting. My life is defined by the Internet: I witnessed and participated in its evolution, and maybe in some small way contributed to it; I certainly owe my livelihood and success to it. I bemoan its passing. And yet, in some ways, I am optimistic about what comes next. When it comes to economics, or social interaction, or now software, the only viable approach is to become smaller; smallness at scale, though, means there is not one global market, but infinite local ones. “Local” might mean geographic, or it might mean a private network; what many markets definitely means is many opportunities, because economies of scale matter less than the ability to meet new needs that only arise at the level of the association. This is where I come back to de Tocqueville: the Internet is an American invention, and has long been defined by American mores; the individuals who thrive on the Internet, no matter their nationality, come across as very American in their iconoclasm and cringe. Beyond the individual, however, there is the association, and amongst the association there is not a market, but infinite markets. Markets are just another word for needs and desires and the mechanisms of meeting and fulfilling them; the end of the Internet may mean the possibilities for creation are only just beginning. Presented by When I write about tech companies, I am often writing about businesses that depend on Stripe , because Stripe provides the foundation for Internet-native companies — including Stratechery. Consider Substack: building Stratechery was complicated and involved gluing together disparate pieces; Substack made it easy by delivering an integrated offering. One piece that was the same, however, was Stripe: Substack creators are also Stripe customers, as are creators on many other platforms. Zoom out and the pattern repeats. Fintechs can build entire business models around card programs without ever having to build the issuing and processing infrastructure underneath it. AI companies can charge for what customers actually use, which is particularly important when usage also drives costs, without having to build the systems to track and bill for it themselves. No business succeeds because of Stripe. Stripe doesn’t answer the hard questions about what to build or whether anyone will actually use it. But it does make more things practical to try. Talking Points Memo , Andrew Sullivan and Boing Boing launched in 2000 Instapundit , Little Green Footballs , and Dooce launched in 2001 Matt Yglesias , Daily Kos , Eschaton , The Volokh Conspiracy , Power Line , Gizmodo , Gawker , paidContent , and Daring Fireball launched in 2002 Ezra Klein , Marginal Revolution , ReadWriteWeb , and AVC launched in 2003 Compromised intermediate CA private keys (although this was an example of sheer incompetence, not AI hacking) Major new vulnerabilities in Node.js, GitLab, Java, and Cisco products Breaches in LiteLLM’s supply chain and Railway developer platform

0 views
Justin Duke Yesterday

Beset

I am not breaking any news when I share the following trenchant insight: spam is back, and it's worse than ever. I'm seeing it across pretty much every front of my digital life right now, and it's one of the reasons I've pulled back from public fora like social media. The noise is simply too overwhelming. I remain optimistic that this is cyclical — that it will get solved in due time, in much the same way email spam was solved, until the phishing email was relegated to a punchline in outdated jokes. But until that happens, I find myself beset . Lazily lofted job applications fired to my personal email; barely disguised cold outreach sent not just to my work email but to my personal email, Buttondown's support inbox, and even my public calendar links. Our KYC tools are filled to the brim with people using an LLM to answer the question what is your newsletter about? It is all simply too much, and it has the unfortunate side effect of devaluing all cold outreach — a thing I used to love, when done with nuance and care — to zero. 1 To be explicit, as much of a bummer as this is to say: if you ever send me an email asking for a job with your resume attached, I will pointedly not respond. If you then follow up — as some people have — by sending it to my personal address, I will make a point of actively anti-recommending you to anyone who comes calling. I'm tempted to hook up something like Pangram to analyze every incoming email from an unrecognized sender, or to find one of the many tools I'm sure already do exactly that. This to me, like the cybersecurity chaos of last week, feels like environmental toxicity . "Selling the poison and then selling the cure", et cetera.

0 views
Langur Monkey Yesterday

Volumetric galaxy rendering

The Milky Way is an essential component in any 3D Universe software. Rendering a realistic (i.e. science-based) and visually appealing galaxy is paramount to the user experience, and to the cohesion of the simulated universe as a whole. Galaxies are made of gas and dust clouds, so they are volumetric in nature. In Gaia Sky we have been using particle-based representations for a long time, even though we have had the volumetric rendering infrastructure in place also for a while. This post describes the rendering technique we use in Gaia Sky 3.9.0 to render the volumetric Milky Way, and how we have constructed the dataset that enables it. Interested? Keep reading. The Milky Way galaxy in Gaia Sky A little bit of history The rendering of our and other galaxies has always been a topic I dreaded. I never felt that the solutions we found were good enough. I always knew that the right way to do it was with volume rendering, but the main issue was that we did not have the volumetric data. So, for a long time, we have used approximations to render the Milky Way, some more gracious than others. Enhanced flat image — Initially, we used a single two-faced billboard with the artist’s impression by Nick Risinger, coupled with a generated star field. This was featured in the September 26, 2016 Astronomy Picture of the Day, titled “Here comes the Sun” 1 . This is a very primitive galaxy, but it looks awesome from above and in still pictures due to Risinger’s image. Top Side Wide Textured billboard approach — After Gaia DR3 landed in 2022, the catalog data were used by Stefan Payne-Wardenaar 2 to produce a high-quality representation of the whole Galaxy 3 in Blender. At that time, I worked with Stefan to produce a particle-based version that would fit in the existing billboard systems in Gaia Sky. The first version was based on textured additive billboards and dithered depth buffer occlusion. The depth was correct, but the look of the galaxy was rather cartoonish and unrealistic. Additive blending was used for all channels except the dust, which was purely occlusive in a binary sense (no sorting, so no transparency), making use of dithering to simulate translucency. This version is the one that looks the worst of all. Using textured billboards is a bad move to simulate a volume of gas and dust. Also, the brightness blows out when seen edge-on. Top Side Wide Billboards with additive and subtractive blending — Later on, inspired by this article , the textured billboards were updated to rely on blobs and additive/subtractive blending. The main issue was that the emissive parts blended additively in a very unrealistic way, and the occlusion did not respect the depth order in the scene. Several attempts were made afterwards to implement Weighted Blended Order-Independent Transparency (WBOIT) 4 , as suggested by the article, but this was very difficult to tune and produced underwhelming results. Looks better than the previous textured-billboards version, but the behavior of light is unrealistic. The brightness is mostly gone when seen from the top, but blows out edge-on due to the additive blending. Top Side Wide All these issues finally tipped me into seriously consider approaching the project of converting the particle data to a volume and implementing a proper volume renderer with emission and occlusion. The first step is to convert the particle data to a volume in the form of a voxel grid. This step is crucial, as it can make or break the whole project. Having a good dataset is the difference between a bland-looking visual and an awesome one. The source is the same particle model we were already rendering. It is split into channels, each a gzipped text file with one particle per line: where the position is in galactic coordinates, is the particle’s weight and is the emission coefficient of the particle, in arbitrary units. The Milky Way is made of three of them: Gas (~15,000 particles), Bulge (~900) and ArmDust (~93,000). The stars and the HII regions of the model are not part of the volume: they are genuinely point-like, so they keep their billboards and a voxel grid would only blur them. Reading a few hundred thousand lines and painting them into a grid is not hard. What is hard is doing it in a way that does not depend on the resolution of the grid, so that a \(200^{3}\) volume and an \(800^{3}\) volume describe the same galaxy and differ only in how much detail they can hold. Most of the work below exists to enforce that. Every particle is a point with no extent, so the first operation is a scatter into the grid: each particle adds its weight to the voxel it falls in. That is the simplest possible splat, and it is what the shipped volumes use. It is also the one that keeps the property above, because a nearest-voxel scatter is the identity of the sampling: the same data always lands in the voxel the same ray will visit. Splatting Each particle adds its weight to the voxel it falls in, so a voxel ends up with the summed weight ρ and the weight-averaged color c; here its opacity is drawn proportional to ρ. The magnification shows the arithmetic for a voxel that receives two particles. There are two details here worth taking into account: The color accumulates with the same weight as the density , so dividing the accumulated color by the accumulated density yields a size-weighted mean color per voxel. Getting the weights inconsistent here is the classic way to end up with a volume whose large particles dominate the hue. The grid is galactic but the file is not. Voxels are dumped in C order, like this: $$ (W, H, D) = gal(X, Z, -Y) $$ This is because of the axis order the shader indexes a 3D texture with. The permutation is written into the metadata, in both orders, precisely so nobody has to infer it. A raw scatter of 15,000 points into a \(400^{3}\) grid is a swarm of dimensionless points, but we need a volume, so every channel is blurred with a Gaussian. The tempting choice, a fixed sigma in voxels, is exactly the one that breaks resolution independence: it smooths more of the galaxy at 200 than at 800, and the same data produces two different objects. Instead, the blur width is a length on the particles, in world units of the box: $$ \sigma = 0.85 \times \ell $$ where \(\ell\) is the median distance from a particle to its 4th nearest neighbor — the local inter-particle spacing, not the volume divided by the count. Note that this measure is the same for all particles in a channel, as \(\ell\) is derived from the median. We do not compute a different smoothing for each particle. That value measures the gaps that actually need filling, and it is nearly independent of resolution by construction, since it comes from the particle positions alone. A channel that is denser gets a narrower kernel for free, and the same particles written at 200, 400 and 800 get 4×, 2× and 1× that sigma in voxels , which is the correct behavior. The 0.85 is empirical. A blur width given by hand in world units, per channel, never generalised; this little proxy held up across channels and resolutions. Smoothing The kernel width is a length measured on the particles, σ = 0.85 ℓ with ℓ the median distance to the 4th neighbor, so the same blur is described by twice as many voxels on a grid of twice the resolution. The result is one continuous density field; a fixed sigma in voxels would instead give a \(200^{3}\) volume and an \(800^{3}\) volume two different galaxies. Two guards keep this sensible: The color is blurred with the density kernel, over the unblurred density, so the color spreads exactly as far as the density is about to. Blurring the color separately is how you get colored halos around black voxels. The particle colors are emission coefficients, not display colors. Gas averages about 0.02, so clipping to and multiplying by 255 rounds roughly 82% of the occupied voxels to zero and leaves the whole channel carried by about thirty distinct levels. Quantizing as-is gives a black galaxy. The fix is a single scalar gain , derived from the 99.9th percentile of the occupied voxels and applied to all three channels identically. One scalar is the important part: the gain preserves the chromaticity of every voxel, so the hue is still the data’s. Per-channel normalization would give each channel the full 0–255 range and wash everything toward gray, which defeats the point of storing a per-voxel color at all. The gain is baked into the bytes, and the shader consumes the stored color as-is. Density gets the same treatment, by its peak, and is stored in the alpha channel. Each channel is written as a raw heap of bytes, gzipped, next to a small text sidecar that declares the grid and the box: The byte count per voxel selects the format (1 byte per voxel is R8 density, 3 is color, 4 is color+density) and the loader takes it from the file length, not from the file name. The RGB channels carry the chromaticity, the alpha channel the brightness, and the emitted radiance is the product . An occluding volume uses the same layout, with alpha as the normalized density. The per-channel textures are then merged into two final volumes: one emissive (Gas at 0.7 + Bulge at 0.3) and one occlusive (ArmDust at 0.08). Merging is a post-process on the textures, so it needs neither the particle data nor a re-conversion, but it does have to be careful: A galaxy disk is 6.7 units wide and 0.67 thick, so a cubic box around it is nine tenths empty space: \(400^{3}\) of is 244 MiB, where the same voxel size laid out as \(400 \times 400 \times 40\) is 24 MiB. A factor of ten, spent on nothing. The fix is to flatten the grid and the box together , deriving the grid from the data-shaped box: the detail of an \(N^{3}\) grid without the empty axes. Flattening only the grid would make the voxels anisotropic; flattening both keeps them cubic. Nothing else has to change. It is still one texture and one step count, because the ray-march step \(rayLength \times |rayDir / extent|\) is invariant under a rescale of the box: flattening it does not change how many samples a ray takes. Here we go over the galaxy shader, which is in . It is a single-pass ray marcher, but it is drawn twice : once early as a depth-only pre-pass, and once late as the emission pass. But first, we need a piece of geometry that emits the pixels to the fragment shader were we do the work. Here, anything works, as long as the pixels reach the fragment. Since we need to render the galaxy also from the inside, we use a flipped cube at the position of the model. The transformations for the actual galaxy are done in the fragment shader, so rotating or scaling this box does nothing. It is essentially a vessel to emit pixels. The box The box is drawn with its front faces culled, so it never shows up as a surface: the ray crosses the near wall and every pixel it covers receives exactly one fragment on the far wall. The shader does not use that fragment as a surface, it only takes its world position as a direction from the camera. Since the near wall is never the one drawn, the camera can also sit inside the box and the screen is still full. We said we do an early depth pass and the emission pass at the end. Why is that? Well, the volume is rendered with additive blending so its own fragments cannot write a meaningful depth. Adding two semi-transparent layers is commutative; the depth buffer, which keeps a single number per pixel, is not. And the volume cannot be sorted per fragment, so any attempt to give it “the” depth in the color pass is wrong by construction. But the scene needs it. The stars of the catalog, and the whole rest of the universe, are drawn after the Milky Way volume, and if nothing writes depth they all shine through the dust lanes. A galaxy whose dust hides nothing looks like a galaxy with a bright smudge on it. So the depth is produced as a separate mask , in its own pass, before anything else is drawn: The pre-pass marches each ray only until it finds the first sample that is dense enough to occlude, writes that distance, and returns. The emission pass marches the same ray from the same origin and finds the same front, so both agree on where the dust starts. Stars are switched from “no depth test” to “depth test, no writes”: they are hidden by the dust but cannot overwrite its depth. The volume is not the only thing that is allowed to render small. The volumes of the other galaxies (gas, bulge and dust) go into the same reduced buffer, and so do the nebulae, which are evaluated analytically in their fragment shaders instead of being sampled from a texture. All of them share the property that makes this safe: their content has no detail at the scale of a pixel, so the upscale costs almost nothing visible, while the fill rate they give back is the expensive part of the frame. The depth is never reduced. Every one of those elements still writes depth at full resolution, in the pre-pass of the table above, and before the scene draws at the reduced scale that depth buffer is blitted onto the reduced one. That copy is what keeps the reduced pass honest. Everything depth-tested in it, the stars above all, reads the reduced depth buffer, which the full-resolution pre-pass never wrote. Bringing the full-resolution depth down first means those tests see the dust front exactly where the full-resolution pass put it: without it the stars would shine straight through the lanes, and lowering the render scale would change the image instead of only its sharpness. Not every volume should occlude. The gas is emissive, and its faint outermost haze is not opaque: letting it write depth would cut a hard, sharp-edged hole in the star field, perfectly matching the box. The dust, on the other hand, should hide what is behind its lanes. So each volume slot carries its own density threshold , and only samples above it count as occluding. We define, for every channel, the threshold density above which occlusion happens: disables occlusion for that slot: the gas renders, and hides nothing. The value for the dust is not arbitrary, it comes from the data. In the dust volume, the low tail of the density histogram is the blur we applied deliberately, not matter, so the threshold is set to keep the lanes and drop the tail. The constant is per texture and has to be re-tuned if the smoothing or the normalization changes. Both volumes are marched in one loop , at the same position along the ray. That is what makes the ordering correct: a dust lane and a dust glow are the same voxels, and only the order of emission and absorption within the step decides which one you get. A few things in there are worth pointing out: Two, both of them consequences of doing the depth in a cheap pre-pass: Neither is visible in practice, and both are one comparison per sample away from being fixed properly. The renderer is only half of it. The other half is being able to load a volume from a data pack and declare it in a scene, which turned out to be mostly about formats . A volume object is a regular with the archetype, so it accepts , , / , and everything else, plus the volume-specific attributes: has one value per quality preset (low, normal, high, and ultra, adjustable from the settings dialog), so the same scene degrades gracefully on a weak GPU. Up to four volumes can be declared per object, and all of them are marched and composited in the same pass. The loader ( ) does three things worth mentioning: None of this is Milky-Way-specific: any 3D tool that can write an grid can produce a volume for Gaia Sky. The format and the scene attributes are documented in the data format and the volumes section of the Gaia Sky documentation. Memory is the price: an 800-resolution grid is \(798 \times 80 \times 800\) , about 200 MB once decompressed, per volume . The default data pack therefore ships three resolutions and picks one by data quality setting: 200, 400 and 800 voxels on the longest side of the box: Thanks to gzip (and to how much of the box is empty) the download cost is trivial; it is the decompressed texture that decides whether a card can hold it. The question a resolution-independent conversion has to answer is whether the three grids really are the same galaxy. They are: the mean ray integral (the integral of the density along a sample of rays through the volume, the quantity that has to match if the object is the same) is within 1% of each other, with the same total mass and the same hues, so what changes between them is only detail. And detail is visible: at 200 the dust cannot be smoothed at all (its kernel is 0.31 voxels, so the point cloud shows through), at 400 it is 0.63 voxels, and only at 800 does it reach 1.25 voxels and become a continuous lane. This is why the dust is the channel that decides which resolution you actually want, and why the 800 volume is the one in the preview video below. Up to 800, the volume costs what the step count says, not what the grid says. Frame time for the Milky Way alone, at QHD (2560x1440) with the camera at about 34.5 kpc above the galactic disk, on an NVIDIA GTX 1070 (driver 580.178.04) on Arch Linux. I deliberately chose to use this very old card instead of my other RTX 5080 because it may be more representative of the graphics computing power present in common household PCs and laptops. Tests have been carried out with only the base dataset loaded. With that hardware the resolution is almost free: going from 200 to 800, sixty-four times the voxels, costs under a millisecond at every preset (3.5 → 4.3 ms at low, 4.6 → 5.2 at ultra). This is possibly because the ray march is per-pixel and the grid does not change how many steps a ray takes. That is why I also built a 1300 volume, which no shipped dataset uses: 274 times the voxels of 200, for 1.5 to 2.2 ms (3.5 → 5.0 ms at low, 4.6 → 6.8 at ultra). Even at that scale the cost stays far below the voxel count, but it is no longer invisible: 1300 is now the most expensive thing in the table, ahead of the preset. The step count is also interesting. Current presets are 50 at low against 110 at ultra, and even that only adds 0.9 ms at 800 and 1.8 ms at 1300. The slowest cell in the table is 6.8 ms (1300, ultra) at QHD, 41% of the 16.7 ms a 60 fps frame allows, so even that volume is not limited by frame time on this card. What the card does pay for is memory. These are the sizes as decompressed and uploaded to VRAM, at 4 bytes per voxel ( ), for the flattened, cropped boxes the loader actually builds: Even the 1300 volume fits in the 8 GB of a GTX 1070 with room to spare. That is the flattening earning its keep: the same resolution in a cubic box would be 8.8 GB, so the high-resolution row could not have been run at all. The stills below are where the argument becomes visible, each pair sharing a camera. The top view is where the billboards fall short, and for a reason that is easy to get backwards: seen face-on, so few billboards overlap along the line of sight that there is almost no galaxy left. Top view. With so few billboards along the line of sight the galaxy almost disappears; the volume still shows the disk and its dust lanes. Volume at 800 resolution. Edge-on, the billboards look plausible at first glance, but they blow out, while the volume rendering stays consistent. The same additive blending that was too faint from the top saturates here: the bulge becomes a flat white patch and the disk loses its internal structure. The volume stays a thin dark lane with its dust intact. It is also dimmer overall, which is expected, because there the light is absorbed rather than added. Edge view. The billboards saturate, the volume does not. Volume at 800 resolution. Dust is where the grid resolution shows. Three close-ups of the same lane, same camera, 110 iterations each: The same close-up at 200, 400 and 800, 110 iterations. At 200 the fog is grainy, because the dust kernel is thinner than a voxel and the point cloud shows through. 400 is already smooth and 800 is smoother still, but the two are hard to tell apart at this framing. The stars and HII regions look the same in all three: they are billboards and never go through the grid. The last comparison is the two ends of the preset range. Low is the 200 grid and 50 steps, ultra is the 800 grid and 110 steps, so both knobs move at once and this pair shows the worst case rather than the effect of either one alone. Preset: low Preset: ultra Top view preset comparison The low preset versus the ultra preset, top view. The low preset versus the ultra preset, from inside the disk, looking at the galactic center. Low uses the 200 galaxy resolution and 50 iterations. Ultra uses the 800 galaxy resolution and 110 iterations. Against ultra, the low preset is softer and hazier, and the dust has less contrast. That is intended: low is meant for modest hardware, and it still looks decent there. Below is a video I captured with the 800 galaxy running in Gaia Sky. Credits: The Gaia Sky Project, ESA/Gaia/DPAC. For a decade the Milky Way in Gaia Sky was a compromise between what the data said and what a rasterizer could do with a pile of billboards. The volume rendering path fixes this: the galaxy is now a medium that emits and absorbs. The dust lanes hide the stars behind them and not the ones in front, and it no longer blows out or fades to nothing depending on where the camera is. Two things made it work, and neither of them is in the shader itself. The first is the conversion: sizing the blur on the particles rather than on the grid is what makes all resolutions the same object at different levels of detail. Flattening the box to the shape of the data makes real savings in memory (256 vs 25 MB for the \(400^{3}\) box). This is what lets the unshipped 1300 grid fit in the 8 GB of a GTX 1070 and still draw a frame in under 7 ms. The second is the depth pre-pass: a volume cannot write meaningful depth in a blended pass. The rest of the scene has to know where the dust is, so the cheap early pass does the trick here. So far, all this work only affects one galaxy: our own. Gaia Sky can already generate galaxies procedurally, but in 3.9.0+ that system still produces billboard particles. The next step is to adapt it to produce and render volumes. Other than that, what is left are smaller fixes rather than architecture: Finally, all this work has been done assuming we start from a particle-based distribution, which is a weird place to start for such a project. Typically, one builds the volume from scratch via analytical distributions without going through a particle dataset. For DR4, due on December 2, we will build a volume directly from Stefan’s data, bypassing the particles altogether. Astronomy Picture of the Day: Here comes the Sun https://science.nasa.gov/image-article/apod-2016-september-26-gaia-here-comes-the-sun/   ↩︎ Stefan Payne-Wardenaar BlueSky profile https://bsky.app/profile/stefanpw.bsky.social   ↩︎ Gaia’s Milky Way map https://www.cosmos.esa.int/web/gaia/milky-way   ↩︎ Morgan McGuire and Louis Bavoil , Weighted Blended Order-Independent Transparency , Journal of Computer Graphics Techniques (JCGT), vol. 2, no. 2, 122-141, 2013. Available online: http://jcgt.org/published/0002/02/09/   ↩︎ Enhanced flat image — Initially, we used a single two-faced billboard with the artist’s impression by Nick Risinger, coupled with a generated star field. This was featured in the September 26, 2016 Astronomy Picture of the Day, titled “Here comes the Sun” 1 . This is a very primitive galaxy, but it looks awesome from above and in still pictures due to Risinger’s image. Top Side Wide Textured billboard approach — After Gaia DR3 landed in 2022, the catalog data were used by Stefan Payne-Wardenaar 2 to produce a high-quality representation of the whole Galaxy 3 in Blender. At that time, I worked with Stefan to produce a particle-based version that would fit in the existing billboard systems in Gaia Sky. The first version was based on textured additive billboards and dithered depth buffer occlusion. The depth was correct, but the look of the galaxy was rather cartoonish and unrealistic. Additive blending was used for all channels except the dust, which was purely occlusive in a binary sense (no sorting, so no transparency), making use of dithering to simulate translucency. This version is the one that looks the worst of all. Using textured billboards is a bad move to simulate a volume of gas and dust. Also, the brightness blows out when seen edge-on. Top Side Wide Billboards with additive and subtractive blending — Later on, inspired by this article , the textured billboards were updated to rely on blobs and additive/subtractive blending. The main issue was that the emissive parts blended additively in a very unrealistic way, and the occlusion did not respect the depth order in the scene. Several attempts were made afterwards to implement Weighted Blended Order-Independent Transparency (WBOIT) 4 , as suggested by the article, but this was very difficult to tune and produced underwhelming results. Looks better than the previous textured-billboards version, but the behavior of light is unrealistic. The brightness is mostly gone when seen from the top, but blows out edge-on due to the additive blending. Top Side Wide The color accumulates with the same weight as the density , so dividing the accumulated color by the accumulated density yields a size-weighted mean color per voxel. Getting the weights inconsistent here is the classic way to end up with a volume whose large particles dominate the hue. The grid is galactic but the file is not. Voxels are dumped in C order, like this: $$ (W, H, D) = gal(X, Z, -Y) $$ This is because of the axis order the shader indexes a 3D texture with. The permutation is written into the metadata, in both orders, precisely so nobody has to infer it. A cap at twice the channel’s own half-mass thickness , along galactic Z. Without it, a sparse channel (a few hundred particles whose “local spacing” is an artifact of sparsity) would be blurred into a slab. A smoothing scale per channel. Dust uses 0.4×, because a dust lane that is smoothed like the gas stops being a lane and becomes a haze. Densities add. The color is the density-weighted mean over the inputs that carry one, and each input’s baked gain is undone first, so the merge happens in emission space. Otherwise a channel normalized to a different peak would bias the hue of the result. The merge verifies alignment (same grid, same box to 1e-3, metadata grid consistent with the file length) rather than assuming it. Renormalizing the sum after the merge dims everything : at Gas+Bulge 1/1 the peak lands at 1.36 and the texture is scaled by 0.73. Whether to do it is a decision, not a detail. Empty brick skipping is the single biggest performance win. On load, the voxel grid is reduced to an occupancy grid with one texel per 4×4×4 brick, holding the maximum density of the brick. A zero texel then means every fetch inside that brick would have returned zero: no emission, no extinction, so skipping the whole brick cannot change the image. The shader does one nearest fetch instead of the dozens the brick would have cost, and advances the sample index rather than the step size, so the samples it does take sit on exactly the lattice it would have used anyway. On a galaxy volume, most of the march is empty space. The jitter decorrelates neighboring pixels so a step size in UVW does not show as concentric banding. The transfer function is \(density \times color \times step\), integrated front to back, with an exposure factor applied at the end. Density is peak-normalized and sparse, so the ramp parameter is \(log_2(1 + 255\cdot d)\). Without the log the whole volume lands in the first ramp stop and the ramp does nothing. The depth is written at the first sample above the threshold, not where the ray actually becomes optically thick. A thin lane therefore occludes as hard as a thick one. The distance is along the ray, while the log depth buffer wants view-space depth. They differ by \(cos \Theta\) away from the view axis, which is exact at the center of the screen and a few percent at the corners. It crops. The grid is cut down to the range of voxels that actually hold density, plus one voxel of padding, and the cropped grid is mapped onto the same box. Writing the empty shell into the file costs file size and load time only. It builds the occupancy grid described above, and binds it as a separate 3D texture. A slot without one gets a \(1 \times 1 \times 1\) volume of ones, which never skips. It derives the format from the bytes , not from the filename: 1, 3 or 4 bytes per voxel, with the grid from the metadata sidecar. Sizing the ray-march step from the grid resolution instead of the box, so a finer grid is actually sampled finer. Replacing the time-hashed jitter with a static one (the current float32 clock dies after about ten hours of uptime). Enabling scattering in the dust, which is already wired with a coefficient of zero. Tuning the occlusion threshold, which is currently a single constant for the whole volume and would probably be better as a curve. Astronomy Picture of the Day: Here comes the Sun https://science.nasa.gov/image-article/apod-2016-september-26-gaia-here-comes-the-sun/   ↩︎ Stefan Payne-Wardenaar BlueSky profile https://bsky.app/profile/stefanpw.bsky.social   ↩︎ Gaia’s Milky Way map https://www.cosmos.esa.int/web/gaia/milky-way   ↩︎ Morgan McGuire and Louis Bavoil , Weighted Blended Order-Independent Transparency , Journal of Computer Graphics Techniques (JCGT), vol. 2, no. 2, 122-141, 2013. Available online: http://jcgt.org/published/0002/02/09/   ↩︎

0 views
Unsung Yesterday

“I found an innocent loop that had no test in it.”

(It’s Halloween Week on Unsung, where we’re sharing scary, spooky, and creepy stories.) Speaking of fireside stories, this is a classic 1983 post called “The story of Mel, a real programmer”: […] I first met Mel when I went to work for Royal McBee Computer Corp., a now-defunct subsidiary of the typewriter company. The firm manufactured the LGP-30, a small, cheap (by the standards of the day) drum-memory computer, and had just started to manufacture the RPC-4000, a much-improved, bigger, better, faster — drum-memory computer. Cores cost too much, and weren’t here to stay, anyway. (That’s why you haven’t heard of the company, or the computer.) […] I don’t super love this presentation/​style, but it’s an interesting “close to the metal” programming anecdote (similar in some ways to Duff’s device ), and doubly interesting to try to go through the jargon and actually understand it all. Not particularly relevant to the story itself, but this is LGP-30, launched in 1956: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/i-found-an-innocent-loop-that-had-no-test-in-it/1.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/i-found-an-innocent-loop-that-had-no-test-in-it/1.1600w.avif" type="image/avif"> I’ve known LGP-30 for a while – some of the photos people put in the Wikipedia entry are actually ones I took at the Computer History Museum – but I saw a running one only earlier this year at a computer museum in Stuttgart. I particularly loved the industrial, lit up buttons… = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/i-found-an-innocent-loop-that-had-no-test-in-it/2.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/i-found-an-innocent-loop-that-had-no-test-in-it/2.1600w.avif" type="image/avif"> …and the “display” which was just an oscilloscope contorted to fit within a specific binary template: As far as I know, RGP-4000 – the 1960’s successor – didn’t feel much different, so perhaps seeing these might actually enhance the spooky story.

0 views
Jim Nielsen Yesterday

Why My Dad Didn’t Have a Cell Phone

Here’s Dave Rupert writing about all those emails, texts, phone calls, etc. we’re getting these days: Once upon a time it had utility, now it’s all noise and grifter slop demanding our attention and giving us to-dos That last part really hit: “giving us to-dos”. I feel this. So many of the messenger apps on my phone are other people laying claim to my time and attention. It reminds me of an interaction I had with my Dad years ago. This was back when cell phones were starting to become ubiquitous. Not smartphones , mind you. Cell phones, i.e. telephones that were mobile. Texting wasn’t really a thing yet. These were devices for making voice calls wherever you went. As a teen, it seemed like everyone had one: my teachers, my friends, even my friends’ parents. But not my parents. They were “behind the times”. (Everyone was getting cell phones and we didn’t even have caller ID on our landline!) One night at family dinner I asked, “Dad, why don’t you have a cell phone?” His response? “Why would I want to allow other people to contact me whenever they want?” I still think about that. Reply via: Email · Mastodon · Bluesky

0 views
neilzone Yesterday

Fixing my LocalBytes Tasmota smart bulb which had lost its Tasmota template

I have used a LocalBytes smart bulb in our porch light for ages . It is controlled by Home Assistant, so that it comes on a few minutes before sunset, and goes off later in the evening. For some reason, it reverted to Tasmota’s default settings - without the LocalBytes bulb functionality - a while ago. Now that the clocks have changed, and it is darker earlier, fixing it moved up my priority list. Fortunately, it was pretty straightforward, thanks to the LocalBytes documentation . The key bit is the Tasmota template for the bulb: With this, and the Tasmota instructions for importing templates , I have a working bulb again.

0 views
Unsung Yesterday

The Swiss Cheese model, pt. 4: The iPhone jump scare

(It’s Halloween Week on Unsung, where we’re sharing scary, spooky, and creepy stories.) The first time I encountered this bug, years ago, I jumped up my seat. I was listening to the music on my iPhone and suddenly, for no particular reason, the music got extremely loud. I frantically held the volume down button, calmed down the sound, and didn’t think much about it. But it happened again a few days later. And then again. And again. I slowly started paying more attention to this, trying to figure out what might have been causing it. I started piecing together that it wasn’t wholly random: I noticed whenever it happened, it seemed to be only when I started or resumed the music – but not every single time I did so. Then, I also noticed it only happened whenever I was putting the phone away. Eventually, I figured out the whole sequence of events. In 2019, Apple changed the design of the volume indicator so that it went closer to the physical volume buttons. Here’s before and after: I praised the contemporary version of this animation earlier on Unsung , but what I didn’t mention then was that it wasn’t just a visual change. No, the new control was also interactive. Once you popped it up on the screen, you could drag the volume up and down with your finger: I never noticed that, nor would I ever want to change the volume this way, particularly since the only way I knew how to invoke it was with my fingers already on hardware volume buttons. A second component? For reasons that are likely intentional, but I don’t personally understand, the iPhone doesn’t cease touch detection in the few hundred milliseconds between clicking the lock button and the screen completely fading away. And then, the last thing: It turns out that as I was putting the phone away into my left pocket, my thumb would graze the screen, near the left edge, always in the same position. That position happened to be the location of the interactive volume indicator. I think you can assemble the whole puzzle now. Occasionally, I would start playing the music, instinctively adjust the volume with one of the buttons, lock the phone, and put it in my pocket. Adjusting the volume would make the control appear, and the control was ready to accept touch input, too. Locking the phone would not immediately shut down touch detection. As the phone was sliding down my pocket, the volume controls still on the screen, the screen about to fade out but still responding to touches, my thumb would graze the volume control – and while the thumb was stationary, the phone would be moving down into my pocket quickly, so it felt like an upward slide. Every single one of those instances, it was me who accidentally turned the volume all the way up. This all needed to happen quickly, almost as one gesture – but that is exactly how it goes if you’re doing it the same way for years . As a matter of fact, here’s a video of how it happens, and it’s so quick you cannot see anything: (Unsung doesn’t support audio at the moment, but you can watch the same video on YouTube to hear the sudden volume increase.) The funny thing is that I was likely doing this for years, but it never mattered, as my accidental swipe up didn’t target anything on the screen. It was only with the introduction of the interactive volume control that the Swiss Cheese model was complete: Here’s the tricky part: It’s been years since I figured out the sequence of events. I know exactly what happens. I know how to avoid it. Yet, those things happen so naturally, that I still occasionally blast music right into my ears and scare myself to death. The previous three times we talked about the Swiss Cheese Model , the examples were more cerebral. This one is visceral and frightening. I hate this bug so, so much. the control was interactive, there was no (accessibility?) option to make it not interactive – which I would want anyway, since I sometimes activate this control in other contexts, too, and never do it intentionally, locking the phone still made the screen accept touch inputs for a moment, as I was sliding the phone into my pocket, my thumb ended up being in the perfect position to change the volume, it just happened that the movement of the phone and the direction of the control resulted in the worst possible scenario – volume going all the way up.

0 views
Unsung Yesterday

“For the first several seconds, there would have been little to suggest that anything was wrong.”

(It’s Halloween Week on Unsung, where we’re sharing scary, spooky, and creepy stories – and in posts like this one, sometimes not particularly enjoyable ones.) In October 2004, a Boeing 747 cargo aircraft crashed on take-off in Halifax, Canada, claiming the lives of the crew of seven. A YouTube channel Mentour Pilot walks us through the complex set of events that led to the crash: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/for-the-first-several-seconds-there-would-have-been-little-to-suggest-that-anything-was-wrong/yt1-play.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/for-the-first-several-seconds-there-would-have-been-little-to-suggest-that-anything-was-wrong/yt1-play.1600w.avif" type="image/avif"> The story is presented more thoughtfully than the thumbnail would make you believe, and went into places I did not expect these kinds of videos to go: corporate culture, regional geopolitics, software onboarding. Also, in the end, it would be extremely reductive, but also not fully inaccurate to say: the tragedy wouldn’t have happened if the UI of one piece of software didn’t try to help the user. What resonated most with me was the argument that wasn’t actually stated: that we altogether treat software, and UI design, not seriously and rigorously enough. Boeing asked its pilots to use consumer-quality UI loaded on a regular laptop, and lacked the imagination for what could be the consequences of doing things this way. (Thank you to Ben Zotto for sharing the video with me.)

0 views
ava's blog Yesterday

my ffxiv character

It's been more quiet here because I've had increased health issues, and have been focusing more on other things, especially my degree and gaming! I have some unfinished drafts, but they'll release some other time soon :) Same with emails! I've been playing FFXIV since end of June, and just started Shadowbringers. I love the game, and recently had some fun with the integrated photomode (group pose). Just wanted to share some shots from that here. She's kinda a mix of my real life self and the Au Ra race ingame! That's all 8) Published 25 Oct, 2026

0 views

The kitchen is only the cool spot because you're in it

Ten years ago, I was living with two flatmates in a big Parisian flat. Once or twice a year, we organised a party, which gathered up to 90 people, a number we were rather proud of. During those parties, there was a consistent, yet slightly annoying pattern for us as organisers: the best discussions were bound to take place in the kitchen, rarely in our big living room, where we were concentrating our efforts to entertain the party with food, drinks, and music. You see, the kitchen was the room where smoking was allowed. Its door had to stay closed as much as possible, so that the smell of cigarettes and the cold from the wide-open window wouldn't spread to the other rooms. Smokers went there to smoke, usually accompanied by someone, even a non-smoker. People would start talking in the main area and one of them would eventually say something along the lines of: “ I’ll go for a smoke, want to join me so we can continue this conversation? ” From the hallway one could hear the laughter, the noise, the loud voices, the liveliness of the kitchen. The living room, in contrast, was more about small, quieter groups, background music, and discussions that weren’t easily overheard by other guests. The small kitchen, packed with ephemeral groups, encouraged people to talk to each other, even if they had never met. They would overhear someone say something, react to it, and start a discussion. They wouldn’t have done that so easily in the living room, and the result was that the kitchen was the “place to be”, despite the toxicity of the air, the noise, and the cold draught that could make you ill the next day (some guests would never set foot in the kitchen for those exact reasons). To summarise, the living room was the familiar place to sit and chat with people you already knew: it was a great way to spend time with friends. The kitchen was the crowded space to talk and meet new, weird, interesting people: it was the social network lubricant. Both rooms managed to coexist, and in many ways were codependent. Now suppose the kitchen fills with kooks, bigots, and racists , and that the loudest, biggest jackass of the party never seems to leave that room. You can be sure that more than a few guests will now try to avoid spending more time there. Some of them will stop smoking for the night, and some tenacious smokers may end up starting to use alternative smoking rooms. The kitchen ends up with fewer people and becomes a less interesting place for most of the guests. Meanwhile, the new smoking rooms never really manage to replace it as the “place to be”. Why? Because smokers and non-smokers alike now spread across several smoking areas, and none of these new rooms becomes lively enough to matter. The kitchen also remains the default: a lot of guests keep going there despite everything, out of habit, comfort, and because it is easier for them to ignore or tolerate the bigots than to face the smokers in the other rooms, who now resent them for having spent time in the kitchen and for not helping to make their new smoking room cooler. As the party organiser, I think it’s fine if people want to smoke and therefore spend time in the kitchen: they are free to do so. And what kind of party would it be if it was a non-smoking party? I think it’s cool and understandable if people want to avoid it altogether — the more the merrier in the living room — and I’m OK with some going to the bedroom or balcony to smoke: next time I’ll try to avoid having bigots at my party. *1 What I find to be not so cool though is people encouraging other guests to take up smoking. It’s also not cool to advertise the kitchen as the best part of the party, or worse, the only good thing about it. It’s not cool either for the most interesting guests to share their latest news and cool stories only with people in the kitchen. *2 Maybe the most interesting guests going to the kitchen to smoke or to chat is what makes the kitchen a cool place to be. Maybe they are missing the big picture when they claim to go there because that’s where it’s the most fun. The kitchen is only the cool spot because they're in it. Maybe by contributing to making the kitchen the de facto place to be at the party, some guests are normalising the behaviour of the bigots and, even worse, rewarding them with their presence. Maybe this can make the other guests — the ones who refuse, rightfully, to deal with bigots — feel left out. Maybe this kind of behaviour can be interpreted as saying that to have a good time at a party, you either have to be OK with bigots and toxic smoke, or be a bigot and/or a smoker yourself. If some guests don’t seem to understand that this is unfair, this is when they will start to disappoint me. I am affected, not because you have deceived me, but because I can no longer believe in you. I stumbled upon this great quote recently, by Friedrich Nietzsche , and I thought it matched this topic quite well. If there had been such bigots at my parties, there’s a good chance my flatmates and I would have asked them to leave promptly (but this wouldn’t work so well for my analogy).  ^ I know, I know: the links in this paragraph are doing the heavy lifting.  ^ If there had been such bigots at my parties, there’s a good chance my flatmates and I would have asked them to leave promptly (but this wouldn’t work so well for my analogy).  ^ I know, I know: the links in this paragraph are doing the heavy lifting.  ^

0 views
Abhinav Sarkar 2 days ago

Extending BlogShake with Per-Tag Atom Feeds

This is an external post of mine, originally published at Extending BlogShake with Per-Tag Atom Feeds .

0 views
Sean Goedecke 2 days ago

Don't anthropomorphize big tech companies

Bryan Cantrill has a great line from a talk where he cautions against anthropomorphizing 1 Oracle CEO Larry Ellison. I think it’s also a mistake to treat any tech company like a person. Here’s the full quote: You need to think of Larry Ellison the way you think of a lawnmower. You don’t anthropomorphize your lawnmower, the lawnmower just mows the lawn, you stick your hand in there and it’ll chop it off, the end. You don’t think ‘oh, the lawnmower hates me’ — lawnmower doesn’t give a shit about you, lawnmower can’t hate you. Don’t anthropomorphize the lawnmower. Don’t fall into that trap about Oracle. Here are some examples of anthropomorphizing companies: All of these are mistakes. Your relationship to the tech company that employs you is not like a relationship with a person. It’s more like your relationship with your car 2 . If you drive poorly or fail to change your oil, your car may stop working or even kill you, but it doesn’t love or hate you. It has no sense of fairness. It’s simply a dangerous, useful machine: useful enough to be worth getting into despite the risks. Anthropomorphizing it makes it harder to avoid those risks 3 . Why is it so hard to avoid this trap? First, humans anthropomorphize everything by default. Second, whenever you’re interacting with the company, you’re interacting with a person: your manager, your colleague, someone in HR, and so on. Third, when you’re in the power of some entity, it’s psychologically comforting to think of it like another human. This is the same principle that caused early humans to attribute lightning to the power of Zeus, because Zeus (unlike electrical imbalances in storm clouds) can be placated with prayer and sacrifice. Relationships with machines are very different from relationships with people. The biggest difference is that machines do not respect effort . If you put a lot of work into doing a favor for a friend, your friend will appreciate it even if the favor itself is not a big deal. Conversely, if you help somebody out at trivial cost to yourself, that help will be relatively unappreciated. But a car doesn’t care how much effort you put into maintaining it. If you spend hours replacing a car’s engine, but the brake line is damaged, the car won’t remain functional out of respect for your effort on the engine: instead, the brakes will fail, killing you. Tech companies work like this. Everyone who’s worked at one for long enough knows that it’s very hard to predict what work will be high-impact. The project you slaved over for months will often get a “nice, now what’s next” reaction, while the tool you built in fifteen minutes (or the question you answered in a Slack channel) will sometimes get wild praise and recognition. This can drive engineers a little mad, because they’re anthropomorphizing their tech company, and a person who behaved like this would be dangerously unstable. But if you treat your company like a machine, this shouldn’t be surprising at all. It’s hard to predict high-impact work, but it’s not impossible. The best way to operate at a big tech company — as I’ve said again and again — is to try and develop this skill, and to spend most of your time looking for the low-effort high-reward wins. It’s hard to do that if you’re secretly imagining your company as a person. A natural objection here is to point out that tech companies (unlike cars) are composed of people who might indeed owe you, hate you, love you, and so on. According to this view, when people say “my company hates me”, they aren’t making the mistake of anthropomorphizing a corporation, they’re using shorthand to say “my boss and skip-level hate me”. I think this is still a dangerously sloppy way to think. In my experience, engineers who think they’re hated are often not. Managers in large tech companies do hold grudges, but (particularly the higher up you get) are tolerably cold-blooded. You don’t get to senior director or VP by needlessly throwing away useful tools. I can recall a few cases 4 where engineers told me they were hated, but I later found out 5 that managers considered them dangerous or unreliable: loose cannons whose usefulness didn’t outweigh their tendency to go off the rails and cause damage. From the perspective of the engineer being forced out of the company, it feels like you’re being run out of town by people who hate you. But if you want to avoid being run out of town, it’s useful to recognize when you’re being treated as a defective tool. It’s also useful to keep in mind the difference between “my manager hates me” and “my company hates me”, because managers are often temporary. You can sometimes just wait out a bad relationship with your manager. You’ll have a slightly uphill battle with the next one — since the handoff won’t be positive — but it’s certainly possible to get back on track. If you can figure out why your manager hates you, you might also be able to fix it (or at least mitigate 6 it). Engineers who’ve learned not to anthropomorphize tech companies sometimes go too far in the other direction, by treating companies as a computer program . This is the wrong kind of machine: tech companies aren’t people, but they aren’t programs either. They operate on incentives and illegible interpersonal relationships, not on consistent logical steps. The classic example of this is the engineer who reads the company handbook cover-to-cover and makes sure they follow all the rules. When they’re looking to be promoted, they take the role guidelines and make sure they’re following them point-by-point. They take what they’re told very literally: when the company says “X is our top priority”, they internalize that. The problem with this is that handbooks, guidelines and internal communications are the legible superstructure of a massive illegible web of dependencies that make up the actual operations of any company. That superstructure will not cover the real criteria for promotions, or the rules that are designed to be broken . The “top priority” of the superstructure can rapidly shift, leaving literal-minded engineers confused and disheartened. It’s understandable to feel ill-treated by a company, or to harbor resentment — particularly since there are actual humans at the company who are involved in that treatment of you. But companies themselves don’t hold grudges, even as they force out people who they’re incentivized to force out 7 . It can even be a mistake to anthropomorphize very senior managers, whose work personas are more identified with the machine the higher up you go 8 . I suppose at the top you have Larry Ellison, as Bryan Cantrill says, who is better modeled as a lawnmower than as a human being. No relationship with an individual person at your company will save you from being careless with the machine: it will chew you up and spit you out. You need to learn how to drive the car . This is scary, because it means that sometimes you will just get punished for no reason . But it’s also good news, because it means that you can get disproportionate rewards for relatively little effort, so long as you make the right decisions. Treating as a human. I like this example better than Cantrill’s lawnmower because cars are more central to our lives, like jobs are, and are also far more dangerous. For instance, if you’re prone to thinking “my car loves me, it wouldn’t spin out when I take this hard turn on gravel”, you are more likely to crash. Though certainly not all. Grudges do exist. Of course, this is my interpretation of the situation, and could be wrong. There are a range of techniques here, ranging from “do all your paperwork defensively” to “find some out-of-the-way project” to “ingratiate yourself with your skip-level”. For instance, people who make their managers look bad, or who publicly point out the inevitable inaccuracies in legible reports, or who campaign against the current big push the company is making. I say “work personas” because these people often have a rich personal life that is largely firewalled off from their work selves. For more on how managers come to identify with the rules of the organization, I recommend Robert Jackall’s Moral Mazes , a book that has informed much of my thinking and that I will some day write a long-form review of. My company really owes me for that hard thing I did I’m fighting the good fight against my company on issue X (e.g. accessibility) and they hate me for it My company is vindictively retaliating against me because of that mistake I made My company and I are partners in the mission to make the world a better place Treating as a human. ↩ I like this example better than Cantrill’s lawnmower because cars are more central to our lives, like jobs are, and are also far more dangerous. ↩ For instance, if you’re prone to thinking “my car loves me, it wouldn’t spin out when I take this hard turn on gravel”, you are more likely to crash. ↩ Though certainly not all. Grudges do exist. ↩ Of course, this is my interpretation of the situation, and could be wrong. ↩ There are a range of techniques here, ranging from “do all your paperwork defensively” to “find some out-of-the-way project” to “ingratiate yourself with your skip-level”. ↩ For instance, people who make their managers look bad, or who publicly point out the inevitable inaccuracies in legible reports, or who campaign against the current big push the company is making. ↩ I say “work personas” because these people often have a rich personal life that is largely firewalled off from their work selves. For more on how managers come to identify with the rules of the organization, I recommend Robert Jackall’s Moral Mazes , a book that has informed much of my thinking and that I will some day write a long-form review of. ↩

0 views
Unsung 2 days ago

My first visit to New York Cities

(It’s Halloween Week on Unsung, where we’re sharing scary, spooky, and creepy stories. This is my memory of the first bug that freaked me out, and perhaps the first bug I ever remember witnessing.) N.Y.C. The Big Apple walked so that Grand Theft Auto could drive. = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/my-first-visit-to-new-york-cities/1.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/my-first-visit-to-new-york-cities/1.1600w.avif" type="image/avif"> Well, not really. But the 1984’s awkwardly-titled game for 8-bit computers could be seen as a spiritual predecessor of the first GTA. Your job was to drive and walk around New York City. If you crashed into another car, your car would be towed. If you ran out of fuel, you had to use the subway – or go on foot. If you then fell under another car, you ended up in a hospital. These were the map mechanics. The overarching narrative was as complex as 1984 allowed: You were supposed to dip into various areas and buildings, and complete different minigames hiding within each. The post office hid a clone of Frogger , Central Park was a facsimile of Qix , and the subway offered shades of Mario: There were twelve areas, and I believe you had to visit and finish all of them to win the game. (You can watch this walkthrough to see someone doing it all.) The minigames themselves were hard, and driving in New York appropriately stressful, but what added to the pressure were three clocks ticking along. One was the fuel gauge in your car. The second was cash in your pocket – running out meant automatic game over. The last one? A literal clock, rendered in the upper right corner. You only had one in-game day to accomplish everything. I am not sure how popular NYCTBA was. Its reception felt mixed. Here are two modern reviews from Atarimania , clearly written from two different coasts: The most aggravating game unleashed on the [Atari] platforms that I can think of. Horrid controls and collision detection/​responses, pathetic graphics, annoying sounds. This game is more than merely the sum of its parts: The many little arcade games are embedded into a very dynamic and amusing traffic simulation, which combines the numerous, fairly challenging tasks to a very satisfying whole. Personally, I was fascinated with it, and the GTA connection above came to me not just from the vehicular carnage, or the top-down view used by GTA before it embraced the third dimension. NYCTBA also tried to be cinematic; at the beginning of the game placing you just outside New York City, so you could actually start by driving into it. In your mind’s eye, you could imagine a classic Hollywood shot revealing the city’s skyline – but realized with the limited production value the computer’s eight whole bits provided. And that one decision happened to come with the first bug I ever remember encountering as a little kid. Upon game launch, the only thing you were meant to do was to drive right into the city to begin your adventure. Even moving your joystick left had the car moving right toward the buildings. But the game’s author didn’t predict you could do another thing: Wait. Specifically, wait for over 13 minutes with your car idling, watching your fuel meter go all the way to zero. At that point, the game declares YOU ARE OUT OF GAS in a classic Atari font, followed by a familiar routine – the car disappears, and the player is ejected to continue the journey on foot. Except now, you can walk left . And what is going on to the left is truly frightening. The road ends and you encounter another city… a nightmare city of sorts, with cars changing shapes, driving into the buildings, and crashing into each other. Get run over by one of these mangled cars, and things get worse – you travel forever over a surreal 8-bit nightmare world, with random disconnected streets, to a land in the middle of nowhere. It’s a creepy mirror world, an endless universe filled with broken cities where the rules of time and space don’t apply, landscapes echoing with sounds of car collisions that never seem to cease. (I uploaded the entire experience, with sound, to YouTube .) This freaked me out so much as a kid I remember waiting for many days until trying it for the second time. Many years later, I have an inkling how this bug came to be – the programmer didn’t remap left movement to right for walking, because you were not supposed to be able to walk on the game’s initial road – and I could probably fire off an assisted emulator to understand the rest fully. Was it some overflow somewhere? Some memory corruption? Some version of Pac-Man’s kill screen ? I could probably even learn stuff from it. But I think I want to leave this alone, this strange memory of a rare bug in a forgotten game. In my head, it still feels like a fireside story, something that no one would believe actually happened, a mind-bending anomaly that frightened me some two decades before I myself got to visit The Big Apple. (To play the game yourself, go to Atarimania and click the Download button to get the ATR file, then go to this browser-based Atari 800 emulator , click on the hamburger menu, click on Boot Image, and point to the ATR file. Then, press F4 (start) – or press ⌘K, and search for Start. Then, use arrow keys to move around. Left Shift is your solitary fire button. If you press space to pause, just move the joystick again.)

0 views