<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Ari's Blog]]></title><description><![CDATA[I'm a software engineer with a background in philosophy, passionate about solving problems, mentoring, &amp; bringing ideas to life.

Here's some of my writing.]]></description><link>https://ariabramowitz.me</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1759262315532/4372f862-f8a9-41f9-8b78-6f0e0b7479e7.png</url><title>Ari&apos;s Blog</title><link>https://ariabramowitz.me</link></image><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Apr 2026 10:45:25 GMT</lastBuildDate><atom:link href="https://ariabramowitz.me/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[We need to talk (more) about AI]]></title><description><![CDATA[About a month ago, I came to a sudden, disorienting realization: the widespread societal transformations I had occasionally imagined happening as a result of AI might in fact be quickly approaching, a]]></description><link>https://ariabramowitz.me/we-need-to-talk-more-about-ai</link><guid isPermaLink="true">https://ariabramowitz.me/we-need-to-talk-more-about-ai</guid><category><![CDATA[work]]></category><category><![CDATA[personal]]></category><category><![CDATA[AI]]></category><dc:creator><![CDATA[Ari Abramowitz]]></dc:creator><pubDate>Thu, 19 Mar 2026 18:02:31 GMT</pubDate><content:encoded><![CDATA[<p><em>About a month ago, I came to a sudden, disorienting realization: the widespread societal transformations I had occasionally imagined happening as a result of AI might in fact be quickly approaching, and we are (or at least I am) far from ready. In this post, I’ll walk through how I got here and what I’ve been up to since I had my little epiphany.</em></p>
<p>Remember the good old days, back in 2022? ChatGPT had just been released and I, along with the rest of the internet-connected world, was having a great time playing around with our new… friend? Toy? Whatever this thing was, it was certainly entertaining. And probably useful. But mostly fun.</p>
<img src="https://cdn.hashnode.com/uploads/covers/67cc982461357cacc6fd4038/d0bdb876-cd17-4141-81c9-96a4ff082d9b.png" alt="" style="display:block;margin:0 auto" />

<p><em>Me introducing my family to the latest internet-craze</em></p>
<p>Eventually, we learned that we could do more with this tool than cook up imagined dialogues between our favorite non-contemporaneous personalities or generate lyrics for an “uncomfortable lullaby” (a personal early request). It could draft our emails, help us plan trips, and teach us new information. Occasionally that information would be false, but it usually seemed to check out.</p>
<p>Of course, we all used our newfound, variably competent personal assistants in different ways at work. As a software engineer, I could now feed error messages that I encountered directly into ChatGPT, and I could even copy in chunks of code as extra context. After reading my input, it would suggest a solution. Often that solution did not work. But the tool was useful enough that I kept coming back.</p>
<p>From there, things mostly plateaued for a while. Every few months, a new version number or model name would appear and some new quirk would start showing up in the AI’s output. Still, there were plenty of times when I preferred to get answers from a real human. AI was another tool in the toolbelt. Not always reliable, but good enough to be helpful.</p>
<p>Towards the end of 2025, my interactions with AI took a dramatic turn. Around November, my team and I began integrating something called “coding agents” into our workflow. That essentially meant having tools like ChatGPT and Claude that live inside the code editor instead of in the browser. They can read all of the relevant files directly and are able to edit those files on their own.</p>
<p>To illustrate the point, I’ll move out of the world of software engineering. Imagine you are writing a 400 page novel and, for whatever reason, you decide you want to edit a certain side character out of the story. You can’t just search for every time that character’s name appears and delete it. You’d end up with disjointed sentences. You would need to go through each instance individually and figure out how to best smooth over the text.</p>
<p>In this imagined scenario, you wouldn’t be able to copy your entire novel over into ChatGPT. The prompt would be too large. But what if there was a ChatGPT feature built into your text editor? You could ask it to make the change and it would search through and smooth over the text on its own. It wouldn’t be perfect, but it would probably make a solid first pass. That’s what coding agents are doing for software development. (I don’t use Microsoft Word much these days, but from what I understand something like this already exists.)</p>
<p>This was the crucial turning point for me. AI had quietly transformed from a glorified search engine to a strange twist on a junior software engineer that somehow also seemed to have decades of experience. In other words, <em>it was actually doing my job</em>, or at least trying to.</p>
<p>Slowly, I settled into this new reality and started to build a routine around it. I would feed the AI descriptions of features we wanted to build or bugs that needed fixing in plain English and it would explore the existing code and take a first pass. Inevitably I would need to correct, improve, and sometimes completely redo its work. Like a good engineer, I played around with my prompting strategies to try to make things flow more smoothly. But I sensed that something big had just happened – something that would take more than prompt-tweaking to address.</p>
<p>After a few months of winging it, I finally decided to sit down with Claude to try to understand what new skills I needed to stay ahead of the curve. It pointed me in two general directions. First, it suggested that I brush up on my management skills, since there was something analogous between managing AI tools and managing less experienced people. It also recommended that I level up on my bigger picture software engineering skills, like knowing how to organize a large codebase to keep it easy to navigate in the long term, because the AI tools had some clear gaps in thinking at that level. Both of these made sense to me, so I gathered some resources and started digging in.</p>
<p>Before long, though, another thought started bubbling in the back of my head: How long would these new skills remain useful?</p>
<p>If the technology were to stay where it was, I would be fine. My day to day workflow had already been turned upside down, but I would figure things out. The trouble was that all signs seemed to be pointing towards AI continuing to improve. I had heard people argue that AI development will hit a wall some time in the near future. Either the chips won’t be able to process more data, or the software will hit its theoretical limits. One way or another, the models’ capabilities would max out, leaving plenty of work for humans to do alongside them. But it seemed like, as a society, we were pouring all of our energy and resources into finding ways for those things to not happen. Sure, maybe they would, but that wasn’t part of the grand plan. If the stability of my career, and my financial future, rested on the assumption that “AI will stagnate soon”, I could be in for serious trouble.</p>
<p>And, of course, these concerns weren’t just about me. This new generation of tools had only entered my world a few months earlier. I hadn’t seen it coming, but suddenly I was calling the long-, and even medium-term stability of my career into question. It seemed at least plausible that similar shifts would come for other professions, and that they would arrive faster and hit harder than most people are prepared for.</p>
<p>I went back to Claude and shared my thoughts. After some back and forth, it pointed me to the names of a number of people and organizations that I might want to look further into. One of those names was Erik Brynjolfsson, an economics professor at Stanford of whom I had never heard, and the director of the Stanford Digital Economy Lab. Claude told me that he “takes the displacement question seriously” and left it at that.</p>
<p>A quick YouTube search led me to a CNN interview between Brynjolfsson and Richard Quest about a project called The Digitalist Papers. This sounded like it was right up my alley. Brynjolfsson and his co-editors had assembled thirty of “the top technologists, policy-makers, economists” – people like former Google CEO Eric Schmidt and Nobel Prize winner Joseph Stiglitz. This esteemed group was given the task of writing essays about “transformative AI,” its anticipated economic impact, and what we might be able to do to smooth out the transition into this brave new world.</p>
<p>I’m not going to use this space to summarize the content of those papers. If you’re interested, feel free to check them out here: <a href="https://www.digitalistpapers.com/">https://www.digitalistpapers.com/</a>. I haven’t finished reading them myself. For the moment, my focus is more on their “In the Media” page, and the surprisingly small number of links featured there – eight, to be exact. To be fair, I have never been treated to a seven minute interview on CNN, nor has any project of mine ever been featured in the New York Times. But I’ve also never been the CEO of Google, and I don’t have a Nobel Prize hiding in my back pocket.</p>
<p>From what I could tell, the general conversation around AI was not where it needed to be. Experts and academics were talking about changes at the scale of the industrial revolution and how we should prepare for them. Aside from a few brief pieces in major news outlets, hardly anyone seemed to notice or care. The reaction felt on par with those towards other “what if” disaster scenarios – things like nuclear war or another pandemic. Disturbing images, perhaps, but not something that many people feel compelled to actively prepare for. The difference, of course, is that as a society we at least pretend that we are trying to prevent those other scenarios. AI development, on the other hand, is something we actively encourage.</p>
<p>To be clear, I am not here to advocate one way or the other on any particular AI regulation or policy initiative. And I recognize the possibility that the technology will reach a plateau, or at least slow down enough to give us time to gradually reorient ourselves. My point is only that AI has the potential to trigger enormous changes quickly, and not nearly enough people seem to understand how sudden and dramatic those changes could be. We should be thinking and talking more seriously about what that might look like and how we should prepare for it.</p>
<p>In lieu of answers, I'll close with a question, echoing Will MacAskill in episode 213 of the 80,000 Hours Podcast, where he builds out a picture of AI developments causing a “century in a decade.” Think of all the changes you expect to occur in the world by the year 2126 – technological advancement, economic upheaval, scientific discovery, geopolitical conflicts. Now imagine all of that happening in the next 10 years.</p>
<p>Are you ready?</p>
]]></content:encoded></item><item><title><![CDATA[In Response to a Spammer at rally4israel.com]]></title><description><![CDATA[Last week I received some… colorful… spam through rally4israel.com, a project I started in April 2024 (and perhaps the subject for another post). My first instinct was to ignore the message, but over the next 24 hours a response started to form in th...]]></description><link>https://ariabramowitz.me/in-response-to-a-spammer-at-rally4israelcom</link><guid isPermaLink="true">https://ariabramowitz.me/in-response-to-a-spammer-at-rally4israelcom</guid><category><![CDATA[personal]]></category><dc:creator><![CDATA[Ari Abramowitz]]></dc:creator><pubDate>Wed, 12 Nov 2025 08:28:52 GMT</pubDate><content:encoded><![CDATA[<p>Last week I received some… colorful… spam through rally4israel.com, a project I started in April 2024 (and perhaps the subject for another post). My first instinct was to ignore the message, but over the next 24 hours a response started to form in the back of my head, centering on a passage I had recently read in Reza Aslan's <em>No God but God: The Origins, Evolution, and Future of Islam.</em> That turned into the email below, which I thought might be worth sharing (after some very light censoring).</p>
<p>Will my spammer read any of this? I don’t know. In the past, responses to messages like this have led to longer conversations, and I hope this one does too. If nothing else, I saw an opportunity to jot down a quick thought, and I took it:</p>
<blockquote>
<p>Hi ____,</p>
<p>Thanks for your submission through <a target="_blank" href="http://rally4israel.com">rally4israel.com</a>, which I've copied below. I'd love to engage in a more substantive way, as I have done with previous "across the aisle" respondents in the past.</p>
<p>As some initial food for thought, I am attaching an excerpt from Reza Aslan's No God but God: The Origins, Evolution, and Future of Islam, which I happen to have just finished reading this past week. I picked up the book as part of a broader attempt to gain a better understanding of Israel's neighbors, and a large portion of its population. Towards the end of the book, Aslan gets into a discussion of modern Islamic governance, and how that ought to be balanced with democratic values. To my surprise, he points to Israel as a model, however imperfect, of the sort of society he wishes to see more of in the Islamic world.</p>
<p>I don't know what news sources you have been following over the past two-plus years. I assume some of the stories you have seen have been true, some have been false, and a large portion have been missing an enormous amount of context. (The same could, of course, be said of many pro-Israel news outlets as well.)</p>
<p>Please take the opportunity to read more about this conflict, and consider why Aslan would want the Islamic world to in any way emulate a "terrorist state" full of "genocidal freaks."</p>
<p>I would recommend starting with Benny Morris' <em>Righteous Victims</em>, perhaps followed by Micah Goodman's <em>Catch 67</em> for more on the aftermath of the 6 day war.</p>
<p>If you have any titles you'd like to recommend to me, I'd be happy to add them to my list.</p>
<p>Thanks again,<br />Ari</p>
<p>\============================<br /><strong>Original submission:</strong></p>
<p>Chant:<br />B-llsack b-llsack eat my n-ts<br />Israel is a terrorist state and should be slapped on the b-tts</p>
<p>Notes:<br />Hope netanyahu gets s-d-mized you genocidal freaks</p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[The Philosopher]]></title><description><![CDATA[I fight the war not won with guns;The battles where the dead are none.Come fight with me, but not to death.Come fight with but your thoughts and breath.
My armor is my argument.My weapon is my word.No blade upon our battlement;The sheath shall stay i...]]></description><link>https://ariabramowitz.me/the-philosopher</link><guid isPermaLink="true">https://ariabramowitz.me/the-philosopher</guid><category><![CDATA[personal]]></category><dc:creator><![CDATA[Ari Abramowitz]]></dc:creator><pubDate>Sun, 28 Sep 2025 08:27:24 GMT</pubDate><content:encoded><![CDATA[<p>I fight the war not won with guns;<br />The battles where the dead are none.<br />Come fight with me, but not to death.<br />Come fight with but your thoughts and breath.</p>
<p>My armor is my argument.<br />My weapon is my word.<br />No blade upon our battlement;<br />The sheath shall stay its sword.</p>
<p>I come to make a measure<br />Not of muscle, nor of might;<br />I come to raise a reckoning<br />With what you say is right.</p>
<p>I hear your “should”s and “mustn’t”s,<br />See your stormy, steady eyes,<br />And I —<br />I ask a simple question:</p>
<p>Why?</p>
<p>Why is it that your sentences<br />Strike down with such conviction?<br />Perhaps the thoughts you think are true<br />Are nothing more than fiction.</p>
<p>Show me why your reasoning<br />Rings truer than my own.<br />Tell me why the things you say<br />Should shake me to the bone.</p>
<p>Come fight the war not won with guns;<br />The battles where the dead are none.<br />Come fight with me, but not to death.<br />Come fight with but your thoughts and breath.</p>
]]></content:encoded></item><item><title><![CDATA[The Tale of the Flickering Monitors, part 2: You're (not) Grounded!]]></title><description><![CDATA[This is a followup to my previous post: The Tale of the Flickering Monitors. To recap, my monitors were blinking in strange and disruptive ways. The culprit turned out to be my treadmill, and spraying some water on it made the flickering stop. If tha...]]></description><link>https://ariabramowitz.me/the-tale-of-the-flickering-monitors-part-2-youre-not-grounded</link><guid isPermaLink="true">https://ariabramowitz.me/the-tale-of-the-flickering-monitors-part-2-youre-not-grounded</guid><dc:creator><![CDATA[Ari Abramowitz]]></dc:creator><pubDate>Tue, 26 Aug 2025 16:37:08 GMT</pubDate><content:encoded><![CDATA[<p><em>This is a followup to my previous post:</em> <a target="_blank" href="https://ariabramowitz.me/the-tale-of-the-flickering-monitors"><em>The Tale of the Flickering Monitors</em></a><em>. To recap, my monitors were blinking in strange and disruptive ways. The culprit turned out to be my treadmill, and spraying some water on it made the flickering stop. If that sounds like a head scratcher, welcome to my world.</em></p>
<p>After last week’s wild and crazy monitor adventures, I thought I would be done writing about computer screens and instead focus on what I generally try to use those screens for: work. But there were still some loose ends to tie up. Spraying the treadmill cut down the flickering, but it was only a temporary fix. Once the water dried, the flicker returned and I had to spray again. Not terrible, but not ideal.</p>
<p>Also, I wasn’t wearing shoes and all of this spraying was making my socks wet, which is never a good thing.</p>
<p>At this point I knew the problem had to do with static electricity buildup. I figured the socks weren’t helping with that, so I tried putting my sneakers on. The flickering seemed to stop. That was good, but could I do better?</p>
<p>I searched around a bit more and discovered a whole community of people with similar treadmill-caused monitor flickering issues. Among them, this guy (flickering at 5:30):</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/-lTdZFEQPn8?t=223">https://youtu.be/-lTdZFEQPn8?t=223</a></div>
<p> </p>
<p>I wasn’t going to start playing around with wires the way he did (again, I’m a software guy). And the static discharge bands didn’t look like they would be any better than my current sneaker solution. But Mr. ElectroBOOM’s talk about <em>electrical grounding</em> — basically, giving stray electricity a safe place to go — got me thinking.</p>
<p>There was something about my treadmill’s power cord that I had noticed a long time ago and then promptly ignored: the plug was not a standard Israeli plug (I live in Israel). To compare, below is a picture of standard 2- and 3- pronged Israeli plugs, next to the thing I found attached to my treadmill:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1756141087631/11b044d8-46ff-4a7f-a131-c9c159c0d3e2.jpeg" alt class="image--center mx-auto" /></p>
<p>It was unusual, but I plugged it in and, hey, it worked. I hardly gave it a second thought. Until now.</p>
<p>I knew that the third prong on a 3-prong plug is usually meant for grounding, but this plug didn’t have a third prong. It just had a metal strip going down the middle. Maybe that was the problem. I fed a picture of it to chatgpt. This time, it gave me some darned good information:</p>
<blockquote>
<p>Ah — this is actually a <strong>Schuko plug (Type F, common in Europe).</strong></p>
<p>It’s not just a “2-prong” plug. The two round pins are live and neutral, and the <strong>metal strips on the top and bottom edges</strong> (you can see them on your photo) are the ground contacts. When you plug it into a proper Schuko socket, those strips touch the grounded clips in the socket and provide a full earth ground.</p>
<p>So your treadmill <em>does</em> support grounding — it’s just that the ground is on the <strong>side rails</strong>, not a third pin sticking out.</p>
</blockquote>
<p>Again, for comparison, below is a standard Israeli outlet (left) and a Shuko outlet (right):</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1756141893223/d6cde4e6-1444-4612-834b-ad8ba775b5cd.png" alt class="image--center mx-auto" /></p>
<p>The Shuko plug fit in the Israeli outlet. It was able to power the treadmill, just the grounding mechanism didn't have anything to attach to. I thought I might be on to something. I went back to Google and discovered the nifty product pictured below: a Shuko to Israeli plug adapter. I ordered one.</p>
<p><img src="https://superpharmstorage.blob.core.windows.net/hybris/products/desktop/medium/1238638611612.jpg" alt /></p>
<p><em>Shuko to Israeli plug adapters (</em><a target="_blank" href="https://shop.super-pharm.co.il/electricity-and-electronics/cables-and-adapters/electric-cables/%D7%9E%D7%AA%D7%90%D7%9D-%D7%97%D7%A9%D7%9E%D7%9C-%D7%9E%D7%AA%D7%A7%D7%A2-%D7%92%D7%A8%D7%9E%D7%A0%D7%99-\(Schuko\)-%D7%9C%D7%A9%D7%A7%D7%A2-%D7%99%D7%A9%D7%A8%D7%90%D7%9C%D7%99-%D7%9B%D7%95%D7%9C%D7%9C-%D7%94%D7%90%D7%A8%D7%A7%D7%94-3-%D7%A4%D7%99%D7%A0%D7%99%D7%9D-%D7%A2%D7%93-16A-%D7%A7%D7%91%D7%95%D7%A2/p/mp-00106831"><em>https://shop.super-pharm.co.il/electricity-and-electronics/cables-and-adapters/electric-cables/מתאם-חשמל-מתקע-גרמני-(Schuko)-לשקע-ישראלי-כולל-הארקה-3-פינים-עד-16A-קבוע/p/mp-00106831</em></a><em>)</em></p>
<p>The adapter arrived a few days later. As a test, I turned on the treadmill one more time without the adapter. It was still flickering. So I attached the adapter, held my breath, and… it kept flickering. Oh well. At least I had the sneaker solution. It beat the spray bottle, and I got to learn a bit more about plugs and outlets along the way.</p>
<hr />
<p><strong><em>P.S.</em></strong> While doing all of this, I decided to give my homemade docking station stand (<a target="_blank" href="https://ariabramowitz.me/the-tale-of-the-flickering-monitors">mentioned in my last post</a>) a slight upgrade so it looks a bit less like what it is: a piece of garbage. We’ll call this version 2.1:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1756201015789/dcae46cf-af10-45db-9793-a6b2f8453754.jpeg" alt class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[The Tale of the Flickering Monitors]]></title><description><![CDATA[Like many software engineers and other professionals, I prefer having extra screen space when I'm working. At my desk in my home office, I have two external monitors that I use in addition to my laptop’s built-in screen. For the past few weeks, I’ve ...]]></description><link>https://ariabramowitz.me/the-tale-of-the-flickering-monitors</link><guid isPermaLink="true">https://ariabramowitz.me/the-tale-of-the-flickering-monitors</guid><category><![CDATA[Linux]]></category><category><![CDATA[hardware]]></category><category><![CDATA[troubleshooting]]></category><category><![CDATA[work]]></category><dc:creator><![CDATA[Ari Abramowitz]]></dc:creator><pubDate>Wed, 20 Aug 2025 21:18:35 GMT</pubDate><content:encoded><![CDATA[<p>Like many software engineers and other professionals, I prefer having extra screen space when I'm working. At my desk in my home office, I have two external monitors that I use in addition to my laptop’s built-in screen. For the past few weeks, I’ve noticed that one or both would occasionally flicker. The offending screen would turn off for a second or two, then turn back on, with everything still on the screen where I had left it. An annoyance I could work around, but when I touched the docking station that my monitors were connected to, I noticed it was very hot.</p>
<p>Thinking the docking station might be overheating, I built a cardboard stand for ventilation. My mother-in-law happened to be around and suggested upgrading to a piece of plastic food packaging. That became version 2.0 — and it worked, at least for a few days. The docking station got a bit cooler and the flickering seemed to taper off.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755763939946/2a80b1a0-b22e-49a3-b890-b9f1dc100ea7.jpeg" alt="Versions 1.0 and 2.0 of my homemade docking station stand" /></p>
<p><em>Versions 1.0 and 2.0 of my homemade docking station stand</em></p>
<p>Yesterday, however, the flicker frequency suddenly picked up dramatically. The screens would blink multiple times per minute, interrupting my work and making them essentially unusable. The problem had to be re-addressed.</p>
<p>I had run into a similar issue about a year or two earlier. Somehow the mysterious flickering had been resolved, but I did not remember how - if it disappeared on it’s own, or if I found a fix, or what that fix might have been. Unfortunately, two weeks prior to the more recent incident, my group lost a large portion of our Teams chat history due to unrelated and unforeseen circumstances. I was on my own.</p>
<p>My first thought was to make sure this didn’t happen again next time. I started a new page in <a target="_blank" href="https://www.notion.com/">Notion</a> so I could jot down whatever I was about to find out.</p>
<p>I thought this still might be an overheating problem, so I found a small fan and pointed it at the docking station. It made no difference. The flickering continued apace.</p>
<p>Then I got to work trying to isolate where the problem was really coming from. I swapped out my work laptop (system76, popos) for my personal one (lenovo, kubuntu), and the flicker continued. Whatever was happening probably did not have to do with the laptop’s hardware, since it persisted on two different machines. And if it was a software problem, it had to be something affecting both laptops.</p>
<p>I posted about the problem on my group’s Teams channel. Someone asked if I had done any system updates recently that might have unintentionally caused the problem. I hadn’t — certainly not anything that would have affected <em>both</em> computers. Still, I thought I’d try switching Linux kernels. (For context: in Linux, the kernel is the core of the operating system. Hardware-related bugs sometimes appear or disappear between versions, so trying a different kernel is a common troubleshooting step.) However, I knew that finding the right kernel might turn into a wild goose chase, assuming that was the problem at all. So before going down that path, I searched around and found a suggestion to tweak some Intel driver frame delivery settings (<a target="_blank" href="https://www.reddit.com/r/Ubuntu/comments/1cfzjpj/comment/lpc77o7/">https://www.reddit.com/r/Ubuntu/comments/1cfzjpj/comment/lpc77o7/</a>). Unfortunately, that didn’t help.</p>
<p>So I moved on to kernel hoping. I tried 5 different versions (6.0.19, 6.5.6, 6.8.12, 6.12.42, and 6.16.1), but the flickering persisted across all of them.</p>
<p>From there, I launched into a long back and forth with chatgpt. It suggested checking logs from various sources on my machine, using <code>journalctl</code> and <code>dmesg</code>. Nothing particularly insightful came from that. It then suggested updating the <code>linux-firmware</code> on my machine. I dutifully obliged. The flickering dutifully continued.</p>
<p>I then tried to clarify that chatgpt understood what I meant by “flickering,” realizing that the term could refer to different screen-related issues which might stem from different causes. It did understand. It just couldn’t figure out what to do about it.</p>
<p>At some point in all of these attempts, I noticed that the flickering followed an odd pattern. I normally stand when I work, and I have a desk treadmill that I use so I can walk at the same time. <em>The flickering only happened when the treadmill was turned on</em>. Strange, but consistent. The easy solution, without understanding what was happening, would be to stop using the treadmill. Of course, I didn’t want to do that, and I had been using the same treadmill and monitors for nearly four years with (almost) no issues. Why had the flickering suddenly jumped today?</p>
<p>I told chatgpt about the treadmill epiphany and it started talking about “electromagnetic noise” and “voltage dips.“ This was not my area of expertise, but I stuck around for the ride. It suggested rearranging the cables or moving the treadmill to another room (which would obviously defeat the purpose of a <em>desk</em> treadmill, but what can you expect from an LLM that doesn’t have to worry staying active during the workday?). I moved a bookcase to gain access to a separate outlet that I could plug the treadmill into. I threw in an extension cord and attached it to an outlet in the bathroom across the hall. Still no difference. The flickering continued.</p>
<p>Chatgpt recommended several other pieces of hardware I could buy that might (<em>might</em>) solve the problem — a more “well shielded” HDMI cable, an Uninterruptible Power Supply (or UPS), or a line conditioner — but I was hesitant to do any of these things not really knowing that they would solve the problem. It suggested “twist[ing] the cable on itself.” Easy enough, but also ineffective.</p>
<p>Finally, I went back to Google and updated my search: “monitor flickering when treadmill on“. The first result led me to a reddit user with the same brand of treadmill, complaining that their screen flickers when the treadmill turns on:</p>
<blockquote>
<p>I just bought a walking pad so that I can work while getting my steps in. I was super excited to get started, only to realize shortly after that walking on the treadmill while using the computer causes my monitors to flicker…</p>
<p>Update: I have found a silly, but useful solution to this problem. I figured that the issue was caused by static electricity. I googled how to get rid of static electricity, and it said to create more humidity in the room. I have a spray bottle of water, and I just spray it on the track of the treadmill. Don’t spray too much so that you’re slipping and sliding, but just enough that it is a tiny little bit wet. This is seem to solve the problem for me. I’ll probably get a humidifier.</p>
<p>— <a target="_blank" href="https://www.reddit.com/r/Monitors/comments/10jfbfh/monitors_flicker_while_using_walking_pad/">https://www.reddit.com/r/Monitors/comments/10jfbfh/monitors_flicker_while_using_walking_pad/</a></p>
</blockquote>
<p>And then it hit me.</p>
<p>A few days earlier, I had discovered some mold growing in my office. Among the measures that I took to address that, I put a *de*humidifier in the office. By now, the dehumidifier had been sitting there for just about 24 hours and, together with the treadmill, created the perfect atmosphere for screen flickering. I had found the answer.</p>
<p>I found a spray bottle, and sprayed a bit of water on the treadmill. The flickering stopped.</p>
<p>And with that, I was back to my regularly scheduled programming (pun very much intended).</p>
<p>➡️ Part 2 (there’s more!?) here: <a target="_blank" href="https://ariabramowitz.me/the-tale-of-the-flickering-monitors-part-2-youre-not-grounded">https://ariabramowitz.me/the-tale-of-the-flickering-monitors-part-2-youre-not-grounded</a></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755765138970/c8158aed-e3d5-4d3d-a4b3-6cbd9b57d4ca.jpeg" alt class="image--center mx-auto" /></p>
]]></content:encoded></item><item><title><![CDATA[Linux Boot Trouble: "Gave up waiting for root file system"]]></title><description><![CDATA[I recently ran into the error above while trying to start up my dual-boot Lenovo laptop (Kubuntu + Windows 11). These are the steps I took to fix it.

Starting with this SO post, I did the following:

Start up the laptop with a bootable drive. I used...]]></description><link>https://ariabramowitz.me/linux-boot-trouble-gave-up-waiting-for-root-file-system</link><guid isPermaLink="true">https://ariabramowitz.me/linux-boot-trouble-gave-up-waiting-for-root-file-system</guid><category><![CDATA[Linux]]></category><category><![CDATA[Dual booting]]></category><category><![CDATA[work]]></category><dc:creator><![CDATA[Ari Abramowitz]]></dc:creator><pubDate>Sun, 04 May 2025 19:39:50 GMT</pubDate><content:encoded><![CDATA[<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746381246935/d39f0e52-69cd-4148-8859-47a3866467f4.jpeg" alt class="image--center mx-auto" /></p>
<p>I recently ran into the error above while trying to start up my dual-boot Lenovo laptop (Kubuntu + Windows 11). These are the steps I took to fix it.</p>
<ol>
<li><p>Starting with <a target="_blank" href="https://askubuntu.com/a/1482431">this SO post</a>, I did the following:</p>
<ol>
<li><p>Start up the laptop with a bootable drive. I used a popos one that I happened to have on hand</p>
</li>
<li><p>Open a terminal and run <code>sudo blkid</code>, which gave the output below:</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1746381678570/a60e85ab-58c8-413b-99c8-39972e10f940.jpeg" alt class="image--center mx-auto" /></p>
</li>
<li><p>Ran <code>sudo mount /dev/sda3 /mnt</code> and got the following error: <code>mount: /mnt: wrong fs type, bad option, bad superblock on /dev/sda3, missing codepage or helper program, or other error.</code></p>
</li>
</ol>
</li>
<li><p>Ran <code>sudo file -s /dev/sda3</code> to check the filesystem type. Output was <code>data</code>, suggesting this was likely not the right partition. No other partition seemed to be the one I was looking for.</p>
</li>
<li><p>Went to BIOS to check various settings</p>
<ol>
<li>UEFI/Legacy Boot: UEFI only</li>
</ol>
</li>
<li><p>Went to Lenovo boot menu and selected “Ubuntu” → was able to start up (?!)</p>
</li>
<li><p>Ran the following to reinstall GRUB Bootloader:</p>
<pre><code class="lang-bash"> sudo grub-install
 sudo update-grub
</code></pre>
</li>
<li><p>Ran <code>cat /etc/fstab</code> to make sure things looked right: ✅</p>
<pre><code class="lang-bash"> ~ 
 ➜ cat /etc/fstab
 <span class="hljs-comment"># /etc/fstab: static file system information.</span>
 <span class="hljs-comment">#</span>
 <span class="hljs-comment"># Use 'blkid' to print the universally unique identifier for a device; this may</span>
 <span class="hljs-comment"># be used with UUID= as a more robust way to name devices that works even if</span>
 <span class="hljs-comment"># disks are added and removed. See fstab(5).</span>
 <span class="hljs-comment">#</span>
 <span class="hljs-comment"># &lt;file system&gt;             &lt;mount point&gt;  &lt;type&gt;  &lt;options&gt;  &lt;dump&gt;  &lt;pass&gt;</span>
 UUID=2799-345B                            /boot/efi      vfat    defaults   0 2
 UUID=29b53720-ce06-4cc4-8465-fd9ac544f52d swap           swap    defaults   0 0
 UUID=421b7727-75b0-4825-a330-c620b04dcb64 /              ext4    defaults   0 1
 /swapfile                                 swap           swap    defaults   0 0
 tmpfs                                     /tmp           tmpfs   defaults,noatime,mode=1777 0 0
 ~ 
 ➜
</code></pre>
</li>
<li><p>Saved a backup of my fstab in case this happens again:</p>
<pre><code class="lang-bash"> sudo cp /etc/fstab /etc/fstab.backup
</code></pre>
</li>
<li><p>Rebooted the laptop to see if the fix held: ✅</p>
</li>
<li><p>Removed several old popos entries in the laptop’s boot order. Not clear if those had anything to do with this, but can’t hurt to remove</p>
</li>
</ol>
]]></content:encoded></item><item><title><![CDATA[Python Operator Chaining… and why you still can’t trust ChatGPT]]></title><description><![CDATA[A colleague of mine recently posted the following on a Teams channel which we’ve appropriately named “Something cool I learned today!”:

"a" in "abc" is True will evaluate to False (!)
This is because the [Python] interpreter reads this as "a" in ("a...]]></description><link>https://ariabramowitz.me/python-operator-chaining-and-why-you-still-cant-trust-chatgpt</link><guid isPermaLink="true">https://ariabramowitz.me/python-operator-chaining-and-why-you-still-cant-trust-chatgpt</guid><category><![CDATA[Python]]></category><category><![CDATA[chatgpt]]></category><category><![CDATA[work]]></category><dc:creator><![CDATA[Ari Abramowitz]]></dc:creator><pubDate>Mon, 03 Mar 2025 22:00:00 GMT</pubDate><content:encoded><![CDATA[<p>A colleague of mine recently posted the following on a Teams channel which we’ve appropriately named “Something cool I learned today!”:</p>
<blockquote>
<p><code>"a" in "abc" is True</code> will evaluate to <code>False</code> (!)</p>
<p>This is because the [Python] interpreter reads this as <code>"a" in ("abc" is True)</code>, which is the same as <code>"a" in False</code>.</p>
</blockquote>
<p>The first problem here, which I did not catch until later, is that <code>"a" in False</code> does not in fact evaluate to <code>False</code>. It raises an exception because <code>False</code> is not iterable so the <code>in</code> operator does not work:</p>
<pre><code class="lang-python"><span class="hljs-string">"a"</span> <span class="hljs-keyword">in</span> <span class="hljs-literal">False</span>

Traceback (most recent call last):
  File <span class="hljs-string">"&lt;stdin&gt;"</span>, line <span class="hljs-number">1</span>, <span class="hljs-keyword">in</span> &lt;module&gt;
TypeError: argument of type <span class="hljs-string">'bool'</span> <span class="hljs-keyword">is</span> <span class="hljs-keyword">not</span> iterable
</code></pre>
<p>Having overlooked that issue, I was about to respond with <a target="_blank" href="https://www.geeksforgeeks.org/precedence-and-associativity-of-operators-in-python/">this link</a> giving more details about operator precedence in Python. However, after looking more closely at the explanation there, I noticed something else: <code>in</code> <em>and</em> <code>is</code> <em>have the same precedence</em> and have left-to-right associativity (they get processed left-to-right). Following that, I would have expected the example to evaluate to <code>True</code>:</p>
<pre><code class="lang-python"><span class="hljs-string">"a"</span> <span class="hljs-keyword">in</span> <span class="hljs-string">"abc"</span> <span class="hljs-keyword">is</span> <span class="hljs-literal">True</span> <span class="hljs-comment"># -&gt; ("a" in "abc") is True</span>
<span class="hljs-string">"a"</span> <span class="hljs-keyword">in</span> <span class="hljs-string">"abc"</span> <span class="hljs-comment"># -&gt; True</span>
<span class="hljs-literal">True</span> <span class="hljs-keyword">is</span> <span class="hljs-literal">True</span> <span class="hljs-comment"># -&gt; True</span>
</code></pre>
<p>But when I actually ran the code, it returned <code>False</code>.</p>
<p>Something wasn't lining up, so I decided to do some more digging. I started with a conversation with ChatGPT that went something like this (full thread here - <a target="_blank" href="https://chatgpt.com/share/67c629cb-38e8-8013-8daf-290abec2600a">https://chatgpt.com/share/67c629cb-38e8-8013-8daf-290abec2600a</a>):</p>
<blockquote>
<p>Me: Hey, ChatGPT, what's going on here?</p>
<p>ChatGPT: Simple. It’s operator precedence.</p>
<p>Me: But don’t <code>is</code> and <code>in</code> have the same precedence?</p>
<p>ChatGPT: Good point. This should evaluate to <code>True</code>.</p>
<p>Me: But it doesn’t.</p>
<p>ChatGPT: Oooohhh. Riiiighht. It’s <em>operator chaining</em>.</p>
</blockquote>
<p>This was a good reminder that ChatGPT is still not a Python expert. I would have expected it to catch both of the points I mentioned above, unravel the incorrect assumptions, and then give the correct explanation. Instead, it played along with the provided explanation and only corrected itself after two rounds of prodding. Oh well.</p>
<p>Needless to say, my conversation with ChatGPT was not the <em>most</em> confidence-inspiring one I’ve had in my life, so I went to Google next. I found a Stack Overflow post with a similar question and the same explanation that ChatGPT eventually gave: <a target="_blank" href="https://stackoverflow.com/questions/31487806/a-in-abc-true-evaluates-to-false">https://stackoverflow.com/questions/31487806/a-in-abc-true-evaluates-to-false</a></p>
<p>Essentially, because of "operator chaining" the example above, <code>"a" in "abc" is True</code>, translates to the following:</p>
<pre><code class="lang-python"><span class="hljs-string">'a'</span> <span class="hljs-keyword">in</span> <span class="hljs-string">'abc'</span> <span class="hljs-keyword">and</span> <span class="hljs-string">'abc'</span> <span class="hljs-keyword">is</span> <span class="hljs-literal">True</span>
</code></pre>
<p>Since <code>"abc"</code> is not <code>True</code>, the right half of the expression, and thereby all of it, evaluates to <code>False</code>.</p>
<p>This is similar to how Python evaluates <code>1 &lt; 2 &lt; 3</code> as <code>(1 &lt; 2) and (2 &lt; 3)</code>. Alternatively, using the example from <a target="_blank" href="https://docs.python.org/3/reference/expressions.html#comparisons">the Python docs</a>:</p>
<blockquote>
<p><code>x &lt; y &lt;= z</code> is equivalent to <code>x &lt; y and y &lt;= z</code></p>
</blockquote>
<p>I had known about this rule generally, but did not realize it applied in a case like this.</p>
<p><strong>Lessons learned:</strong></p>
<ol>
<li><p>If two or more comparison operators are "chained" together, Python inserts <code>and</code>s between them to interpret what's going on.</p>
<ul>
<li>"Comparison operators" include: <code>&lt;</code>, <code>&lt;=</code>, <code>&gt;</code>, <code>&gt;=</code>, <code>==</code>, <code>!=</code>, <code>is</code>, <code>is not</code>, <code>in</code>, and <code>not in</code></li>
</ul>
</li>
<li><p>ChatGPT is not a Python expert... yet.</p>
</li>
</ol>
<p>For more on this, check out these links:</p>
<ul>
<li><p>GeeksForGeeks on operator precedence: <a target="_blank" href="https://www.geeksforgeeks.org/precedence-and-associativity-of-operators-in-python/">https://www.geeksforgeeks.org/precedence-and-associativity-of-operators-in-python/</a></p>
</li>
<li><p>Stack Overflow on the example covered here: <a target="_blank" href="https://stackoverflow.com/questions/31487806/a-in-abc-true-evaluates-to-false">https://stackoverflow.com/questions/31487806/a-in-abc-true-evaluates-to-false</a></p>
</li>
<li><p>Python docs on operators: <a target="_blank" href="https://docs.python.org/3/reference/expressions.html#comparisons">https://docs.python.org/3/reference/expressions.html#comparisons</a></p>
</li>
<li><p>PEP 535 – Rich comparison chaining: <a target="_blank" href="https://peps.python.org/pep-0535/">https://peps.python.org/pep-0535/</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Python Imports and Module Caching]]></title><description><![CDATA[This is another post based on Dr. Fred Baptiste’ Python 3: Deep Dive series. For more, head over to Udemy.
What happens behind the scenes in a python import statement? Glad I asked. Here’s how it works:

Check sys.modules: Python first checks sys.mod...]]></description><link>https://ariabramowitz.me/python-imports-and-module-caching</link><guid isPermaLink="true">https://ariabramowitz.me/python-imports-and-module-caching</guid><category><![CDATA[Python]]></category><category><![CDATA[work]]></category><dc:creator><![CDATA[Ari Abramowitz]]></dc:creator><pubDate>Tue, 14 Jan 2025 22:00:00 GMT</pubDate><content:encoded><![CDATA[<p><em>This is another post based on Dr. Fred Baptiste’ Python 3: Deep Dive series. For more,</em> <a target="_blank" href="https://www.udemy.com/course/python-3-deep-dive-part-1/"><em>head over to Udemy.</em></a></p>
<p>What happens behind the scenes in a python <code>import</code> statement? Glad I asked. Here’s how it works:</p>
<ol>
<li><p><strong>Check</strong> <code>sys.modules</code><strong>:</strong> Python first checks <code>sys.modules</code> to see if your module has already been loaded.</p>
<ul>
<li><p><code>sys.modules</code> is a regular python dict that is used to cache modules. The keys are strings of the modules’ names and the values are module objects (i.e. objects of type <code>ModuleType</code>)</p>
</li>
<li><p>If your module is already in <code>sys.modules</code>, python adds the cached version to <code>globals()</code> and skips the steps below.</p>
</li>
</ul>
</li>
<li><p><strong>Create a module object:</strong> If python does not find the module in <code>sys.modules</code>, it creates a new <code>ModuleType</code> object and loads the module’s source code into it</p>
</li>
<li><p><strong>Cache the module:</strong> The new <code>module</code> objects is added to the <code>sys.modules</code> cache</p>
</li>
<li><p><strong>Compile and execute:</strong> Python compiles and executes the source code from your module</p>
</li>
<li><p><strong>Add to</strong> <code>globals()</code><strong>:</strong> Python and adds your module to <code>globals()</code>, making it available for use going forward.</p>
</li>
</ol>
<p><strong>Key Point</strong>: It is often said that importing a python module will execute all of the code in the module. That is only partly true. <strong>Python only executes a module the first time it is imported, then caches it in</strong> <code>sys.modules</code>. Subsequent <code>import</code> statements throughout your code, even in different files, will refer back to the cached version and will not execute the module again.</p>
<p>Below is a bit of code to bring all of this home. We will:</p>
<ol>
<li><p>Create a simple module (<code>module1</code>) with a print statement so we can see when the module gets executed.</p>
</li>
<li><p>Import <code>module1</code> into <code>main.py</code>, which will execute <code>module1</code>.</p>
</li>
<li><p>Delete <code>module1</code> from <code>globals()</code>, then try accessing it to demonstrate that it is no longer available.</p>
</li>
<li><p>Re-import <code>module1</code>. This will add <code>module1</code> back to <code>globals()</code>, but will use the cached version from <code>sys.modules</code> and will not re-execute <code>module1</code>.</p>
</li>
<li><p>Access <code>module1</code> again to demonstrate that is has in fact been added back to <code>globals()</code></p>
</li>
</ol>
<pre><code class="lang-python"><span class="hljs-comment"># module1.py</span>
print(<span class="hljs-string">"Running module1"</span>)

<span class="hljs-comment"># main.py</span>
print(<span class="hljs-string">"======== Running main.py ======== "</span>)
print(<span class="hljs-string">"Importing module1"</span>)
<span class="hljs-keyword">import</span> module1
print(<span class="hljs-string">"Deleting module1"</span>)
<span class="hljs-keyword">del</span> globals()[<span class="hljs-string">"module1"</span>] <span class="hljs-comment"># Deletes from globals(), but not from sys.modules</span>
<span class="hljs-keyword">try</span>:
    print(<span class="hljs-string">"Accessing module 1 after deleting from globals()"</span>)
    <span class="hljs-comment"># This will cause an exception. module1 is still cached in `sys.modules`,</span>
    <span class="hljs-comment"># but the reference to the cache has been removed from globals()</span>
    module1
<span class="hljs-keyword">except</span> NameError <span class="hljs-keyword">as</span> e:
    print(<span class="hljs-string">"NameError"</span>, e)
print(<span class="hljs-string">"Re-importing module1"</span>)
<span class="hljs-comment"># Adds the cached version of module1 back to globals(), without</span>
<span class="hljs-comment"># re-executing the module</span>
<span class="hljs-keyword">import</span> module1
print(<span class="hljs-string">"Accessing module 1 after re-importing from globals()"</span>)
module1
print(<span class="hljs-string">"Done!"</span>)
print(<span class="hljs-string">"================================="</span>)
</code></pre>
<p>Output from main.py:</p>
<pre><code class="lang-bash">======== Running main.py ========
Importing module1
Running module1
Deleting module1
Accessing module 1 after deleting from globals()
NameError name <span class="hljs-string">'module1'</span> is not defined
Re-importing module1
Accessing module 1 after re-importing from globals()
Done!
=================================
</code></pre>
]]></content:encoded></item><item><title><![CDATA[Python Decorators: How They Work and How to Write One]]></title><description><![CDATA[This is a talk I gave back in February 2023 at Centers Healthcare explaining how python decorators work and how to write one. Enjoy!
https://www.youtube.com/watch?v=Rm_t21RUHqM]]></description><link>https://ariabramowitz.me/python-decorators-how-they-work-and-how-to-write-one</link><guid isPermaLink="true">https://ariabramowitz.me/python-decorators-how-they-work-and-how-to-write-one</guid><category><![CDATA[Python]]></category><category><![CDATA[Tutorial]]></category><category><![CDATA[work]]></category><dc:creator><![CDATA[Ari Abramowitz]]></dc:creator><pubDate>Mon, 13 Jan 2025 22:00:00 GMT</pubDate><content:encoded><![CDATA[<p>This is a talk I gave back in February 2023 at Centers Healthcare explaining how python decorators work and how to write one. Enjoy!</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=Rm_t21RUHqM">https://www.youtube.com/watch?v=Rm_t21RUHqM</a></div>
]]></content:encoded></item><item><title><![CDATA[Namedtuple Default Values]]></title><description><![CDATA[I've been making my way through a deep-dive python series on Udemy (I highly recommend it - Python 3: Deep Dive by Dr. Fred Baptiste. The course recently touched on the question of how to set default arguments on a namedtuple. I found out afterwards ...]]></description><link>https://ariabramowitz.me/namedtuple-default-values</link><guid isPermaLink="true">https://ariabramowitz.me/namedtuple-default-values</guid><category><![CDATA[Python]]></category><category><![CDATA[work]]></category><dc:creator><![CDATA[Ari Abramowitz]]></dc:creator><pubDate>Mon, 13 Jan 2025 22:00:00 GMT</pubDate><content:encoded><![CDATA[<p>I've been making my way through a deep-dive python series on Udemy (I highly recommend it - <a target="_blank" href="https://www.udemy.com/course/python-3-deep-dive-part-1/">Python 3: Deep Dive by Dr. Fred Baptiste</a>. The course recently touched on the question of how to set default arguments on a <code>namedtuple</code>. I found out afterwards that as of python 3.7 <code>namedtuple</code> has a <code>defaults</code> argument (<a target="_blank" href="https://docs.python.org/3/library/collections.html#namedtuple-factory-function-for-tuples-with-named-fields">see the docs</a>), making the following neat little trick largely irrelevant. We'll pretend that doesn't exist for the moment.</p>
<p>Dr. Baptiste's way around the problem relies on the <code>__new__</code> method and the <code>__defaults__</code> property, neither of which typically get much air time:</p>
<ul>
<li><p><code>__new__</code> is a built in method on all classes. It creates an instance of the class (before <code>__init__</code> gets called)</p>
</li>
<li><p><code>__defaults__</code> is a property on all functions that stores the default values, and it's writable</p>
<ul>
<li><p>if there are fewer defaults than function arguments, the values get "right aligned". See the screenshot:</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1741464369706/1064ecb8-5d05-466e-a709-ca099e980220.png" alt class="image--center mx-auto" /></p>
</li>
</ul>
</li>
</ul>
<p>If you're on python 3.7+, stick with the built-in option. If not though, good to know you can do this:</p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> collections <span class="hljs-keyword">import</span> namedtuple

Point = namedtuple(<span class="hljs-string">"Point"</span>, [<span class="hljs-string">"x"</span>, <span class="hljs-string">"y"</span>, <span class="hljs-string">"z"</span>])
Point.__new__.__defaults__ = (<span class="hljs-number">2</span>, <span class="hljs-number">3</span>) <span class="hljs-comment"># Default `y` to 2, and `z` to 3. `x` has no default</span>

print(Point(<span class="hljs-number">1</span>))
<span class="hljs-comment"># Point(x=1, y=2, z=3)</span>
</code></pre>
]]></content:encoded></item></channel></rss>