tag:quandyfactory.com,2024-12-12:/20241212 2024-12-12T12:00:00Z Quandy Factory Newsfeed - All Quandy Factory is the personal website of Ryan McGreal in Hamilton, Ontario, Canada.. http://quandyfactory.com/blog/274/ai_code_assistants_and_the_future_of_software_development 2024-11-23T12:00:00Z AI Code Assistants and the Future of Software Development <p>I am a software developer and have been using GitHub Copilot since March. Here are some thoughts on what having an AI code assistant means for me, what it can and can’t do, and what it might mean for software development more broadly.</p> <h3>Genuinely Useful</h3> <p>First: I have found Copilot to be genuinely useful for me. My coding productivity, by which I mean how much code I can produce in a given time spent coding, has roughly tripled. </p> <p>For the most part, I use Copilot in four distinct ways, three of them specifically code-related and the fourth code-adjacent:</p> <ol> <li>Autocomplete for boilerplate code</li> <li>Looking up obscure technical matters</li> <li>Modifying and refactoring existing code</li> <li>Writing documentation </li> </ol> <p>I’ll consider each use case in turn.</p> <h4>Autocomplete for boilerplate code:</h4> <p>A lot of code is not fancy or innovative or even particularly complicated. In fact, clarity and simplicity are underrated virtues. Overly clever code can be hard to understand and troubleshoot when you inevitably have to look at it again later, and comments can only do so much.</p> <p>When you’re writing workaday code, clarity and consistency and thoroughness are key. Naming conventions for methods and variables should be clear and predictable, and the code itself should be explicit and orthogonal. Each code block should do one clear thing, and errors or exceptions should be handled explicitly.</p> <p>It’s tedious and time-consuming to write and when you’re in a time crunch (ie. always), you may be tempted to cut corners. </p> <p>Copilot makes writing this kind of code a breeze. As long as you set up clear, predictable patterns when you start writing it, Copilot sails through adding methods and faithfully replicates those patterns so the code remains consistent and understandable. </p> <h4>Looking up obscure technical matters:</h4> <p>Modern software is extremely complex, with lots of systems stacked one on top of another, each layer hiding most of its complexity from the layer above it. To build applications effectively, a developer needs at least a working knowledge of several layers in the stack to run each piece of your code where it makes the most sense. </p> <p>This is where one of my favourite eponymous aphorisms comes in: <a href="https://www.joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions/">Joel Spolsky’s Law of Leaky Abstraction</a>, which states: <strong>All non-trivial abstractions, to some degree, are leaky.</strong>. </p> <p>Which is to say, you can hide <em>most</em> of the complexity <em>most</em> of the time, but sooner or later you will encounter an issue where you need to get into the details to solve a particular use case. </p> <p>Modern software has too many layers and too many implementation details to keep it all in mind all the time.</p> <p>In the old days, developers would go to Stack Overflow, a question-and-answer website where developers post tricky or obscure problems and other developers show off their expertise by sharing solutions, and the community moderates the answers to bring the best on to the top. </p> <p>You had to hope that someone had the same problem as you and that someone else knew the solution and was willing to share it. </p> <p>Now, Copilot is extremely good at knowing the answers to these kinds of obscure technical questions. It has read every manual, every API document, every white paper, every monograph - and, yes, every question and answer on Stack Overflow. </p> <p>I can direct Copilot Chat to look at the code I’m trying to write and describe what I’m trying to do. It will explain the solution and even write the revised code based on what I’ve been working on.</p> <p>Instead of trolling through several Stack Overflow pages looking for a pattern similar enough to mine to be applicable, I get a custom-designed answer for my specific challenge - and I don’t even need to leave my code editor and switch to a browser. </p> <h4>Modifying and refactoring existing code:</h4> <p>In the same way that Copilot operates inside my code editor and has direct access to my code, it is also helpful for modifying and refactoring existing code. </p> <p>Let’s say I have a form to add a record to a database and need to add a new field to the form. I need to modify the method that writes the form to add the field, and then I need to modify the method that receives the submitted form data, validates it and inserts it into the database.</p> <p>Once I start writing the code to add the new field, Copilot anticipates what else I need to do and proactively writes the other pieces of new code to complete the change. If it needs a bit of guidance, I can always add a code comment on what I’m planning to do next and it will take the cue and offer a code completion.</p> <p>Likewise with refactoring, or rewriting code to be better organized and structured without changing its functionality. Copilot has a large context window, which is the amount of information it can use to help answer your question, so it can read your code right in your code editor and propose improvements that are specifically tailored to your use case.</p> <p>If you know which particular design pattern you want to implement, you can prompt Copilot with the pattern name - e.g. a Bridge pattern to separate an interface control from its implementation - and it will generate the code to do that.</p> <h4>Writing Documentation:</h4> <p>I was a fairly obsessive documenter before Copilot, but documenting what an application or API does takes time - especially if you want to be thorough. Now I write all my documentation as Markdown text in my code editor, and Copilot is there in the editor autocompleting my documents. </p> <p>The generated text is not exactly enthralling, but it doesn’t need to be - indeed, the writing style should not be a distraction from its contents. And because Copilot has your code in its context, it’s quite good at autocompleting documentation which already understands the code it’s trying to document. </p> <p>My documentation is better, it’s ready sooner, and I spend a lot less time on it.</p> <h3>Strengths and Limitations</h3> <p>To the extent that I know what I’m trying to code, Copilot makes me faster and more productive. It speeds up the code I already know how to write by writing it for me. It speeds up the code I’m not sure how to write by pointing me to the implementation details I need to solve trickier technical problems.</p> <p>And it incentivizes me not to skip the boring busywork - the necessary but tedious code scaffolding, the dreaded documentation - that tends to produce technical debt if you yield to the temptation to postpone (ie. ignore) it.</p> <p>However, <em>writing code</em> is only part of the job of a software developer. Before writing code, you need to be really clear on what you want your code to do. Depending on your organization, that might mean talking with team members who engage with your clients, or it might mean engaging with the clients yourself. </p> <p>In many cases, your clients don’t quite know what they want either, or they think they know what they want and they ask you for specific implementation details instead of explaining what they’re trying to accomplish. So you often have to invest time and attention in a relatively unstructured series of discussions in which you ask open-ended questions and drill into the why and even the why behind the why. </p> <p>Those discussions can feel time-consuming and even frustrating, but in my experience, it’s worth the investment to get to a deeper understanding of the real problem you’re trying to solve. That, in turn, can prevent a lot of wasted effort writing code that is superficially on-topic but doesn’t solve the real problem. </p> <p>People who blithely claim that software developers are obsolete because AI can write code may not be reckoning with just how essential it is to understand both how to write code and also how to understand what the code needs to do. </p> <p>In addition, while Copilot is freakishly good at knowing what code I’m writing and finishing it for me, it still occasionally gets it wrong. It's still essential to review any code that Copilot writes, even if it looks exactly how I was planning to write it, to make sure it has not introduced any subtle errors. </p> <p>It's always a temptation, however, for a busy software developer to glance at generated code and decide it's good enough. In that way, the risk tradeoff of an AI code assistant is that you reduce the incidence of one type of technical debt but increase the risk of another type. </p> <h3>What’s Next</h3> <p>We are in the midst of an extraordinary AI hype cycle. Every company is trying to stick AI into its operations, products or customer engagement practices (or all three), and I think it’s fair to say the results are mixed. </p> <p>I don’t mean to suggest that AI is all hype or that it has no real value. I’ve been using AI in my job for almost nine months now, and it has already become an indispensable productivity tool. But we can reasonably expect a boom/mania/bust cycle that leaves a few winners standing amidst a lot of failed efforts, stranded investments, and unmet expectations. </p> <p>My hope is that, when the dust settles, we end up with some kind of synthesis in which the cost per unit of software development is going down but - and this is where my eternal optimism comes in - the number of use cases in which software becomes cost-effective to produce is growing in proportion.</p> <p>Worst-case, we collectively cede control of the digital environment to robots working for billionaires. Best case, we are collectively able to displace more tedious, boring, error-prone and soul-crushing busywork with more humane and engaging activities that produce real value.</p> Ryan McGreal 2 http://quandyfactory.com/blog/273/rip_thomas_e_kurtz_co-creator_of_basic 2024-11-20T12:00:00Z RIP Thomas E. Kurtz, Co-Creator of BASIC <p>I just learned that Thomas E. Kurtz, co-creator of the BASIC computer programming language, died on November 12, 2024 at age 96. This really hit me emotionally, and I’ve come to realize it’s because my life would most likely be radically different if not for BASIC.</p> <p>I was launched on the road to becoming a software developer at around age 13 in the mid-1980s when my mother came home from work with a Compaq Deskpro Portable computer. It came with two 5 1/4” floppy drives, a 40 MB hard drive and 640 KB of RAM and it weighed around 30 lbs. </p> <p class="image"> <img src="/static/images/IMG_5599.jpeg" alt="I still have my old Compaq Portable because I can’t bring myself to throw out computers. It still turns on but the autoexec.bat file never runs." title="I still have my old Compaq Portable because I can’t bring myself to throw out computers. It still turns on but the autoexec.bat file never runs."><br> I still have my old Compaq Portable because I can’t bring myself to throw out computers. It still turns on but the autoexec.bat file never runs. </p> <p>I was sort of hovering annoyingly around the perimeter as the tech set up the computer, and at some point he looked at me and said, “Hey kid, you wanna learn to program computers?” </p> <p>I said, “Uh, sure?” </p> <p>He handed me a small black plastic-bound three-ring binder containing a manual on GW-BASIC, the specific flavour of BASIC that shipped with the computer.</p> <p>I started on page 1 and read through the book. As I learned each concept, I started writing programs that incorporated the fundamental constructs of most modern languages: </p> <ul> <li>direct mode vs program mode</li> <li>variables and data types</li> <li>if-then conditions</li> <li>FOR-NEXT loops</li> <li>WHILE-WEND loops</li> <li>reading from and writing to the file system</li> <li>sequential vs. random data access</li> <li>25x80 ASCII graphics on the Hercules monochrome display</li> <li>program flow via the much maligned GOTO </li> <li>subroutines via the more civilized GOSUB-RETURN code blocks</li> <li>error handling via ON ERROR GOTO</li> </ul> <p>I even made some rudimentary music (PLAY took letter notes whereas SOUND took frequencies in Hz) producing different pitches of the square wave beep our computer could emit.</p> <p>And yes, my first program read:</p> <pre><code>10 PRINT “RYAN IS AWESOME!” 20 GOTO 10 </code></pre> <p>Eventually I was creating elaborate if extremely derivative programs, including a text-based Dwarf cave adventure game in which I was determined to have the game remember all the locations your character killed monsters so they would still be there if you came back later. (I was particularly proud of having the corpses get incrementally more deteriorated each time you revisited them.)</p> <p>Eventually I grew into adulthood and lost interest in programming. But in my late 20s I found myself in a position where my manager wanted an intranet site for our organization and I perhaps capriciously offered to build it. </p> <p>I was also working part-time as a waiter and one of my coworkers was taking a web development course at a local college. I asked him how hard it was to build a website and he was really helpful, pointing me to some resources and giving me the basics of HTML.</p> <p>One thing led to another and I ended up moving into a role in my regular job that had a web development component. </p> <p>At some point I was asked to build a dynamic website and when I looked into the server running our website, I learned it supported something called Active Server Pages, or ASP. </p> <p>Imagine my pleasant surprise when I found out the programming language for ASP was VBScript, which stands for Visual BASIC, scripting edition. </p> <p>It was just a modern version of the language I had learned as a teenager! </p> <p>Aling the way, I also learned JavaScript and CSS, and once I started writing server code, I also learned SQL. </p> <p>When a group of us decided in 2994 to start a local civic organization, I offered to build us a website. The very first version of Raise the Hammer was built in VBScript and the data was stored in an MS Access database (except for the article contents, which were stored in text files). </p> <p>Once ASP became deprecated for Microsoft’s new .NET application development framework, I decided to break from the MS stack and branch out to a cross-platform language called Python. </p> <p>That was around 2009 and it turns out to have been a very good call, as Python has become a dominant language across various domains, including machine learning and AI. </p> <p>So far I’ve enjoyed a wonderful career as a software developer, albeit self-taught, and it has given me incredible opportunities to learn things and build things and be a part of some amazing communities, organizations and projects.</p> <p>I try to be mindful of the rare privilege of having more or less open access to a computer in my home starting in the mid-1980s. I don’t think I appreciated at the time just how unusual this was!</p> <p>And reflecting on the death of Thomas Kurtz, I also have to acknowledge the privilege of being exposed to a high-level programming language specifically designed for ease of understanding and learning.</p> <p>After all, BASIC stands for <strong>Beginners' All-purpose Symbolic Instruction Code</strong>, and true to its name, it really was easy for at least one awkward kid to learn.</p> <p>May Thomas E. Kurtz, who changed the course of human history during his 96 years and has now undertaken the ultimate GOSUB with no RETURN, rest in peace. </p> Ryan McGreal 2 http://quandyfactory.com/site/24/home 2024-11-13T12:00:00Z Home <p style="float: right; margin-left: 5px;"><img style="border: 1px solid black;" src="/static/images/ryan_mcgreal_headshot_2016_05_11_sm.jpg" alt="Ryan McGreal" title="Ryan McGreal"></p> <p>This is the personal website of Ryan McGreal in Hamilton, Ontario, Canada. </p> <p>I live with my family and work as a programmer and writer. I was the editor of <a href="http://raisethehammer.org">Raise the Hammer</a> and volunteer with <a href="http://hamiltonlightrail.ca/" target="_blank">Hamilton Light Rail</a>, a citizen group dedicated to bringing light rail transit to Hamilton. </p> <p>Several of my <a href="/essays/">essays</a> have been published in the <cite>Hamilton Spectator</cite>.</p> <p>This website serves mainly as a handy repository of <a href="/essays/">published essays</a>, <a href="/projects/">active projects</a>, <a href="/blog/">random musings</a> and <a href="/links/">links</a> that I work on on or use frequently. It's also an online playground where I can try out new ideas.</p> <p>For a much more detailed introduction to the site and its subject matter, check out the <a href="/about/">About</a> page.</p> <p>Otherwise, feel free to contact me via email: <a href="mailto:ryan@quandyfactory.com">ryan@quandyfactory.com</a>.</p> Ryan McGreal 2 http://quandyfactory.com/site/13/about 2024-11-13T12:00:00Z About <h3>Introduction</h3> <p>My name is Ryan McGreal, and I live in Hamilton, Ontario, Canada with my family. I work as a web application developer, consultant, writer, editor and troublemaker, though it's mostly the programming that pays the bills. </p> <h4>Raise the Hammer</h4> <p>Until a few years ago, my principal activity that <em>didnt't</em> pay the bills was my role as editor of <a href="http://raisethehammer.org">Raise the Hammer</a>, an online magazine dedicated to sustainable urban revitalization in Hamilton. </p> <h4>Hamilton Light Rail</h4> <p>I am also a proud founding member of <a href="http://hamiltonlightrail.ca">Hamilton Light Rail</a>, a community group dedicated to bringing light rail transit to Hamilton.</p> <h4>Published Essays</h4> <p>I have written several essays on urban issues that have been published in the <em>Hamilton Spectator</em> and elsewhere over the past five years.</p> <h4>Contact</h4> <p>You can reach me via email at <a href="mailto:ryan@quandyfactory.com">ryan@quandyfactory.com</a> or on Bluesky <a href="https://bsky.app/profile/did:plc:3jq532444f33elehy5suckza">ryanmcgreal.bsky.social</a>.</p> <h3>This Site</h3> <p>This is my personal website, repository of essays and projects, and playground for new ideas. </p> <p><em>Quandy</em> is a portmanteau of "Quick and Dirty", which can be a useful method of approaching problems. "Quick and dirty" has the benefit of being, well, quick, as well as flexible for those cases when initial requirements end up changing (i.e. just about every nontrivial project). </p> <p>It suggests an iterative approach, on the reasoning that it's easier to build something simple and then make it better than it is to try and spring a fully-formed application from your forehead. </p> <p>As John Gall famously stated: </p> <blockquote> <p>A complex system that works is invariably found to have evolved from a simple system that worked. The inverse proposition also appears to be true: A complex system designed from scratch never works and cannot be made to work.</p> </blockquote> <h3>Eye Quandy</h3> <h4>Quandy Logo</h4> <p>The red Quandy logo in the top left corner is courtesy of <strong>Trevor Shaw</strong>, a great local graphics designer and the creative director of <a href="http://www.getjuice.ca/">Juice Creative</a>.</p> <h4>Footer Image</h4> <p>The awesome cityscape panorama in the footer was taken by the talented photographer and amateur urbanist <strong>Aaron Segaert</strong>, and is used with permission.</p> <h3>Interests</h3> <p>In recent years I have been particularly interested in: the nature of city economies and urban development; the role of public participation and community engagement in creating and sustaining a healthy society; and ways to increase the openness, transparency and responsiveness of organizational governance and policy making.</p> <h4>Conceptual Overlap</h4> <p>I admit that my ideas about openness in government and policy making reflect my experience using and developing software: an open, information-sharing approach with peer review results in better results than a closed, proprietary approach based on blind trust.</p> <h4>Jack of All Trades</h4> <p>My interests take me all over the place, figuratively, from land use patterns and transportation modes to the global energy situation, geopolitics, social policy, economics and political economy, democratic structures and traditions, broad-based community organizing, local politics and current affairs, architecture, city life, ecology, sustainability, cognitive psychology, and more.</p> <p>I don't claim expertise in any of these areas, but I am committed to studying the experts and following empirical best practices in these domains. </p> <h4>Benefit from Shared Expertise</h4> <p>The great thing about living in an open, knowledge-based culture is that you can benefit from the expertise of others. Once you establish the credibility of expertise, you can use it as a kind of knowledge <a href="http://en.wikipedia.org/wiki/Application_programming_interface">API</a> that allows you to take advantage of the expertise without necessarily knowing everything about the internals.</p> <p>If not for this ability for non-experts to access expertise, there would be no way for the benefits of that expertise to disseminate into the broader society and inform our policy decisions.</p> <h3>Programming</h3> <p>I enjoy programming and have benefited immensely from the vast, rich ecosystem of free and open source software available to programmers today (see "Technical Notes", below).</p> <h4>Great Time for OK Coders</h4> <p>I know enough about great programmers and their remarkable contributions to understand that I am not a great programmer. Nevertheless, the rich ecosystem of programming languages, libraries, frameworks and tools means even a duffer like me can be creative and productive - and that's a <a href="http://c2.com/cgi-bin/wiki?GoodThing">Good Thing</a>.</p> <h4>Productive Modern Languages</h4> <p>One of the great things about modern programming languages is how highly expressive they are. You can create working code very efficiently, with a minimum of boilerplate. </p> <p>That means it's easy to develop simple tools that do exactly what you want them to do and no more - and to do them quickly.</p> <h4>Shared Open Source Software</h4> <p>Recently I have begun releasing a few such handy tools under a free software / open source licence. You can find my shared resources hosted on <a href="http://github.com/quandyfactory">GitHub</a>. </p> <p>The code isn't beautiful, but I'm <a href="http://code.google.com/events/io/sessions/MythGeniusProgrammer.html">no genius</a>.</p> <h3>Technical Notes</h3> <p>There's no particularly good reason why I didn't simply use WordPress or Drupal or some other off-the-shelf blogging software for this site; except that I enjoy building things (also, PHP makes the baby Jesus cry). </p> <p>Anyway, it's not like I built the site from scratch.</p> <ul> <li><p>It runs on <a href="http://nginx.org/en/">nginx</a> and <a href="http://www.apache.org/">Apache</a> on a <a href="http://www.centos.org/">CentOS</a> <a href="http://www.linux.org/">Linux</a> machine hosted by the awesome admins at ̶W̶e̶b̶f̶a̶c̶t̶i̶o̶n̶ <a href="http://opalstack.com?affiliate=hammertime">Opalstack</a>. </p></li> <li><p>It is written in the <a href="http://python.org">Python programming language</a> and uses the lightweight <a href="http://webpy.org">web.py</a> application development framework. </p></li> <li><p>Web.py talks to Apache via the <a href="https://uwsgi-docs.readthedocs.io/en/latest/">uwsgi</a> server module, which replaces the older standard <a href="http://www.wsgi.org/wsgi/">Web Services Gateway Interface (WSGI)</a> specification for Python applications to communicate with web servers.</p></li> <li><p>The site stores its documents in a <a href="https://mariadb.org/">MariaDB</a> database, which is a free-and-open source fork of <a href="http://dev.mysql.com/">MySQL</a>, and the database connection is made using the ingenious <a href="http://www.sqlalchemy.org/">SQLAlchemy</a> database toolkit and object-relational mapper (ORM).</p></li> <li><p>Documents are saved in <a href="http://daringfireball.net/projects/markdown/">Markdown</a> syntax and converted to HTML for display using the <a href="http://code.google.com/p/python-markdown2/">python-markdown2</a> library (which is itself a re-implementation of the original <a href="http://www.freewisdom.org/projects/python-markdown/">python-markdown</a> library).</p></li> <li><p>It also uses <a href="/projects/5/quandy">Quandy</a>, a library of handy classes and functions that I use frequently in writing web code. </p></li> </ul> <p>In other words, I'm sitting here on the shoulders of giants - and the view is grand!</p> Ryan McGreal 2 http://quandyfactory.com/blog/272/kamala_harris_deserves_to_win 2024-11-02T12:00:00Z Kamala Harris Deserves to Win <p>Kamala Harris and her team have run an extraordinary campaign. The central message is clear and consistent and compelling. Harris has successfully communicated her story, her values, her vision and her specific policy agenda.</p> <p>Her core message puts freedom and opportunity at its centre, drawing an increasingly sharp contrast with her opponent and detailing in specific, personal terms how her policies will help Americans to get ahead. Harris doesn’t shy away from making the stakes of this election clear, but she campaigns with joy and laughter and optimism, and she has built a big tent, promising to represent the interests of all Americans, regardless of how they vote.</p> <p>Harris has performed consistently well under unimaginably enormous pressure. From her first rally after suddenly becoming the presumptive nominee, to her masterful debate performance in which she goaded her opponent into a full meltdown, to her commanding execution of a hostile interview on Fox News, to her exhilarating closing argument to 75,000 attendees last Tuesday at the Ellipse, Harris has continually met each moment of this astonishing campaign.</p> <p>In choosing Minnesota Governor Tim Walz as her running mate, Harris eschewed the poll-tested cautious route and selected a charismatic, down-to-earth Midwestern progressive with a strong track record of achieving popular, effective policy results and a folksy way of piercing the mystique of condescending, self-important Republicans.</p> <p>Meanwhile, the Democratic Party has built a massive outreach and get-out-the-vote organization to build on the momentum of the presidential campaign, channel volunteer enthusiasm and maximize turnout across a large, fractious anti-MAGA coalition spanning everyone from social democrats on the left through constitutional conservative Republicans on the right.</p> <p>Their social media strike force has been agile, witty and prolific, relentlessly driving the Harris campaign’s themes in an often hostile landscape of large social networks designed to reward paranoia and enragement.</p> <p>Overall, the campaign has been well organized and well funded and the strategy has been well executed. They have gone to all the places they needed to go and done all the things they needed to do to reach voters - especially low-propensity undecided voters in key swing states which, thanks to the caprices of the Electoral College, will decide the outcome of the presidential election regardless of the overall popular vote share.</p> <p>With no serious gaffes or major missteps, Harris has given her opponents no real hooks on which to hang their criticisms - which, of course, has not stopped them from embracing wholesale shameless denial of reality to make their apocalyptic opposing case to voters.</p> <p>Her opponent promises to round up and deport millions of people, give huge tax cuts to his billionaire friends, impose a massive new sales tax across the board on all imported goods, slash spending on federal public services by trillions of dollars, and exact retribution on his political enemies by transforming what remains of the federal government into his personal revenge machine.</p> <p>After refusing to concede his electoral loss in 2020 and inciting a mass violent insurrection on January 6, 2021, Trump continues to deny that he lost and has made accepting his lie a condition of loyalty for members of his party.</p> <p>Everyone who refused to bend the knee has by now been pushed out. Those who remain - and those who signed up to fill the void of the more principled - are either craven enough to parrot the lie or doctrinaire enough to believe it.</p> <p>Trump’s daughter-in-law has taken over the Republican National Committee and reallocated the funding for its GOTV operation to a massive lawfare assault on the integrity of the 2024 election while Trump and his sycophants have been busy laying the groundwork to insist again that he won, no matter the actual results.</p> <p>And he absolutely could win. The swing state polls have had the two candidates essentially tied since Harris launched her whirlwind campaign on July 21. The election could go either way, and no one will know the outcome until the votes have been counted and litigated after November 5.</p> <p>There is no question that Harris deserves to win. She has run a much better campaign. She has been disciplined, consistent and forceful. She and her team have built the largest and most comprehensive ground game in American history.</p> <p>She also has an army of lawyers ready to litigate the Trump campaign’s efforts to disqualify legitimate votes. No one can accuse her of throwing the game.</p> <p>To the extent that doing real things in the real world still means anything, Harris has put in the work to secure a well-deserved victory in this surreal campaign, whereas Trump has run a wildly undisciplined campaign and outsourced his ground operation to a billionaire oligarch toady.</p> <p>If Harris loses, there will be a firehose of recriminations from pundits and politicos claiming this or that strategic failure or unforced error or tactical oversight caused her downfall.</p> <p>The plain truth is that if she loses, it won’t be because of any mistakes she made, no matter how much some people will want to shoehorn the result into their pet priors.</p> <p>If she loses, it will be because Americans, by and large, looked at their choices and chose fascism.</p> <p>The good news is that the outcome has not been written yet. There absolutely is time for a majority of Americans to decide that their republic is still worth protecting and preserving.</p> <p>I’m not superstitious, but I am a little stitious, so I’m not going to make any predictions, other than this:</p> <p>If enough Americans come together and reconstruct the anti-MAGA majority that defeated Trump in 2020, they absolutely will defeat him again in 2024.</p> Ryan McGreal 2 http://quandyfactory.com/blog/271/our_media_platforms_are_failing_in_the_fight_against_fascism 2024-10-11T12:00:00Z Our Media Platforms are Failing in the Fight Against Fascism <p>I have a pet theory that fascism rears up every time there is a transformational new communications medium and the fascists are able to exploit the lack of filters and protections in the new medium. Over time, as people and systems adapt, the fascist impulse gets downregulated again.</p> <p>But this time, for various reasons, the systems that operate our new communications media are actually doing progressively <em>less</em> to filter, downregulate and protect against fascism, not more, as they mature. This is both fascinating and terrifying.</p> <p>On Facebook, they decided to take the easy way out and deprioritize or outright block all news reporting indiscriminately, instead of trying to filter the reliable news from the propaganda and disinformation. The result is that an entire cohort of social media consumers get almost no news whatsoever now.</p> <p>Xitter, um, decided to go a different route. That site actively incentivizes the worst kinds of disinformation and even pays propagandists to spread it through revenue sharing. And its owner is out there every day promoting and boosting insane fascist conspiracy theories. </p> <p>(And not for nothing, but he has also spent tens of millions of dollars funding a Super PAC that supports Republican campaigns and especially the Republican presidential candidate.)</p> <p>Media sharing sites like YouTube, Instagram and TikTok have opaque algorithms that promote content based not on accuracy but on emotional intensity and similarity to previously viewed content. This has the effect of serving as an intake funnel into increasing radicalization.</p> <p>The legacy news media are struggling to compete for attention with these new media platforms, and tend to lean into their own forms of sensationalism to try and remain relevant. In addition, squeezed for revenue, these companies are cannibalizing themselves, which further reduces their quality and reliability and make them a target of claims that the news media can’t be trusted.</p> <p>To the extent that democracy requires a reasonably literate, well informed electorate, this media landscape is very bad news.</p> <p>In the past, the mainstream media were a primary line of defence against rising fascist sentiment. The fascists themselves understand this, which is why they attack the legitimacy of the media so relentlessly and invest so heavily in creating their own parallel networks.</p> <p>Essentially, today’s major media networks are all either: (a) recoiling from their responsibility to be a bulwark against disinformation; (b) losing the capacity to serve this role; or else (c) actively working to promote the disinformation and propaganda they are supposed to be guarding against.</p> <p>It’s bad. Really bad.</p> <p>In a not-crazy media environment, it would be unimaginable for the election between Kamala Harris and Donald Trump to be a statistical tie. In a not-crazy media environment, Trump would never have gotten within several miles of the nomination for one of the two major national political parties.</p> <p>But that’s not the media environment we live in.</p> <p>No matter who wins in November, a huge share of Americans inhabit a funhouse mirror view of the world. Bringing them back into some kind of shared understanding of reality is going to be a huge challenge under any media context, but probably impossible if the media platforms refuse to help.</p> <p>I would like to end on a hopeful note, and it is this: we are not the first generation to face this challenge, and we can learn from how previous generations responded to it. Our media environment is new, but the basic task remains: to figure out how as a society we can agree on what is real.</p> Ryan McGreal 2 http://quandyfactory.com/blog/269/the_conspiracy_to_steal_the_2024_election_is_hiding_in_plain_sight 2024-09-25T12:00:00Z The Conspiracy to Steal the 2024 Election is Hiding in Plain Sight <p>It’s vitally important to understand the central truth about the way authoritarians think about power: they don’t care if you believe them when they claim something, they only care about having the power to make their claims stick, regardless of how many people actually believe them. </p> <p>In some ways it’s better when most people don’t actually believe them, because it lets them show that the truth has no constraining power over them.</p> <p>Authoritarian power-grab conspiracies that succeed don’t succeed because of secrecy. <a href="/blog/204/the_j6_committee_and_conspiracy_theories_vs_real_conspiracies">They succeed when knowing about them is not enough to stop them.</a></p> <p><em>I can’t emphasize this enough.</em> TFG is not trying to win more votes. He is saying out loud, over and over again, that he plans to win by controlling how the votes are counted in the swing states. </p> <p>His campaign isn’t even running a ground game. Instead, they’re openly running a full-court press against voters and voting.</p> <p>His enablers in state governments are changing voting laws and regulations to suppress legitimate turnout by making it more difficult to obtain voting ID, aggressively purging voter registrations, cutting the number of polling stations in Democratic-leaning districts, even making it a crime to provide water to voters lined up for hours in the heat because there are so few polling locations.</p> <p>They’re also attacking the mechanisms of voting itself, taking over key positions in state election commissions and implementing new rules - often blatantly illegal - designed to manufacture chaos when it comes to tabulating and certifying results. </p> <p>This tactic creates space for the other part of their plan: To undermine public confidence in which candidate won a swing state so badly that it becomes effectively impossible to submit a clean slate of electors to the House. </p> <p>Why does that matter? Glad you asked. </p> <p>The theory goes that if the states can’t present their electors on time, or if the results are deadlocked, then it falls to the House itself to break the stalemate. And the current Republican House majority leader didn’t just vote against certifying the results in 2020, he actually led the House effort to overturn the 2020 election results through specious legal arguments. </p> <p>Asked point-blank about 2024 this week, he said, “If we have a free, fair and safe election, we’re going to follow the Constitution.”</p> <p>“If”.</p> <p>Again, if this conspiracy succeeds, it won’t be because they managed to keep it secret. They’re doing it all in public view. </p> <p>If it succeeds, it will be because they succeeded in seizing the apparatus of power and making their plan stick. </p> <p>Mike Johnson has the power he has over the next election - as House majority leader and second in line to the presidency - because his fellow Republican party members decided that his efforts to overthrow the last election were not disqualifying. That was a choice to put power ahead of truth.</p> <p>On the other hand, the state of Nebraska won’t make a last-minute change to their law apportioning electors to switch to a winner-take-all model because a single Republican state lawmaker - State Senator Mike McDonnell - stood up to the massive pressure from the MAGA movement and refused to allow a special session to enact the change. </p> <p>This demonstrates the huge difference a single courageous person can make, but it also illustrates just how fragile the rule of law has become under the sustained assault of a party that no longer wishes to earn power by winning public support.</p> <p>All of this is happening even as organized, coordinated campaigns of abuse and violence seek to drive good people out of public office and the machinery of democracy and civil service.</p> <p>And despite all this, the outcome remains a toss-up just six weeks from election day.</p> <p>I’m not American so I can’t vote. But the world is watching, and would-be authoritarians the world over are busy taking notes and cheering for their guy to win. </p> <p>Thanks to political polarization and the Electoral College, the election will most likely end up being decided by around 50,000 votes in a handful of swing states. Every single vote matters. And every action taken to reach people and inspire them to vote for freedom and democracy is essential.</p> <p>I wish I had a more inspiring closing note, but this is going to be a nail-biter and there is no magic wand to guarantee the outcome. </p> <p>The good news is that this is also true for the people trying to stack the deck against democracy. </p> <p>They’re trying, but they have not yet succeeded. </p> <p>And if enough Americans come together to campaign for a more hopeful, more inclusive future, that hopeful goal is absolutely within reach. </p> <p>The rest of the world is rooting for you to succeed in keeping your republic and carrying it forward. </p> Ryan McGreal 2 http://quandyfactory.com/blog/268/vp_harris_must_seize_control_of_her_own_narrative 2024-07-28T12:00:00Z VP Harris Must Seize Control of Her Own Narrative <p>As Louis Pasteur famously said, <em>chance favours the prepared mind</em>. And the free world is most fortunate that Vice President Kamala Harris, suddenly the presumptive Democratic nominee for president, was prepared to seize the historic opportunity presented a week ago today when President Joe Biden yielded to mounting pressure from his party and announced that he would no longer seek re-election.</p> <p>Harris has her work cut out for her, not only because she is not well-defined in the minds of many voters but also because she is about to face an extremely well-funded partisan media assault.</p> <p>The right-wing rage machine is unburdened by the need for logical consistency, so it embraces a kind of natural selection process in which an army of trolls generates an array of different attacks on their enemy and then they check to see which attack resounds with voters. </p> <p>They don’t need a theory of the case against Harris; they just need to keep generating more and more BS until they find something that sticks. Right-wing narratives resonate because they shamelessly adopt whichever narratives happen to resonate.</p> <p>They haven’t found an effective narrative against Harris yet. And the quicker and more clearly Harris defines herself, the less attack surface the right will have to impose some other definition onto her. So far she is off to an excellent start, defining her temperament and her vision not only in relation to core American values but also in razor-sharp contrast to her opponent’s biggest weaknesses.</p> <ul> <li><p>She wants to expand your freedom. He wants to control your life. </p></li> <li><p>She wants to move the country forward. He wants to drag it backward.</p></li> <li><p>She stands for the rule of law. He makes a mockery of the rule of law.</p></li> <li><p>She’s upbeat and hopeful. He’s grim and apocalyptic.</p></li> <li><p>She’s a bit goofy. He’s deeply weird and creepy. </p></li> <li><p>She laughs. He sneers. </p></li> <li><p>She likes Venn diagrams, he likes violent 4chan memes.</p></li> <li><p>She fights for women’s rights. He abuses and demeans women. </p></li> </ul> <p>Harris also has another advantage: the modern right is so terminally online and so up its own ass that it can’t help reaching to an ugly combination of lazy sexism/racism and obscure references from the right-wing rabbit hole that swing voters find super-weird and off-putting.</p> <p>But they’re also ruthless and relentless, and they will keep grinding and grinding until they find an attack that works, no matter how ugly or absurd. So Harris and her campaign team need to move fast to build on their early and really extraordinary success striking a new and energizing tone. </p> <p>In 2020, Harris struggled to find her voice. After a couple of early comms missteps in her Vice Presidency, the Biden administration seems to have withdrawn her from a lot of high profile media appearances. It’s possible that fear of letting her upstage Biden may have also played a role.</p> <p>What her incredible launch into the position of presumptive Democratic nominee tells us is that she spent that time out of the harsh media glare wisely. </p> <p>She has been doing the hard work to build relationships throughout the party, mostly through the kind of smaller personal interactions at which she has always excelled. So when President Biden made his history-making announcement and then endorsed her to replace him, she was able to leverage her party relationships to line up enough delegates and party leaders to lock up the nomination.</p> <p>Additionally , and just as importantly, Harris presents as refreshingly authentic and comfortable and clear in her persona and power and conviction, and that resonates better than any crass political hit job ever could.</p> Ryan McGreal 2 http://quandyfactory.com/projects/266/introducing_catgpt 2024-05-22T12:00:00Z Introducing CatGPT <script> catgpt_words = ['meow', 'meow', 'meow', 'maw', 'mee', 'yow', 'mom', 'now', 'neow', 'naw', 'wow', 'mah', 'nah', 'hiss', 'hiss', 'purr', 'purr', 'hiss', 'meow']; catgpt_seps = [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '? ', '. ', '. ', '. ', '! ']; function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function catgpt_generate_response() { prompt = $('#catgpt_prompt').val(); $('#catgpt_reponse').val(''); words = Math.floor(Math.random() * (100 - 20) + 20); response = []; for (var i = 0; i < words; i++) { this_word_index = Math.floor(Math.random() * (catgpt_words.length)); this_word = catgpt_words[this_word_index]; response.push(this_word) this_sep_index = Math.floor(Math.random() * (catgpt_seps.length)); this_sep = catgpt_seps[this_sep_index]; response.push(this_sep) response_string = response.join(''); console.log('response_string = ' + response_string); this_delay = Math.floor(Math.random() * 200 + 20); console.log('this_delay = ' + this_delay); await sleep(this_delay); $('#catgpt_response').val(response_string); } $('#catgpt_prompt').val(''); narrative = $('#catgpt_narrative').html(); narrative = narrative + '<p><strong>' + prompt + '</strong></p>'; narrative = narrative + '<p>' + response_string + '</p>' $('#catgpt_narrative').html(narrative); } </script> <div> <label for="catgpt_prompt" id="catgpt_prompt_label">Prompt:<br/> <textarea id="catgpt_prompt" name="catgpt_prompt" placeholder="Enter your prompt here:" style="height: 24px; max-width: 90%;"></textarea> </label> </div> <div><button id="catgpt_generate_response_button" name="catgpt_generate_response_button" onclick="catgpt_generate_response()">Generate Response</button><br/></div> <div> <label for="catgpt_response" id="catgpt_response_label">Response:<br/> <textarea id="catgpt_response" readonly="readonly" name="catgpt_response" style="height: 100px; max-width: 90%;"></textarea> </label> </div> <div id="catgpt_narrative"> </div> Ryan McGreal 2 http://quandyfactory.com/blog/265/modern_life_is_rubbish_is_not_rubbish_after_all 2024-05-21T12:00:00Z Modern Life is Rubbish is Not Rubbish After All <p>In the early 1990s, there was a record store in Westdale on King West near Newton where you could actually listen to a CD before choosing to buy it. </p> <p>When the second Blur album, <em>Modern Life is Rubbish</em>, came out, I rushed to the store to check it out - and I hated it. I was expecting another baggy tour-de-force like <em>Leisure</em>, but instead I got something sounding like mid-career Kinks and I was put off.</p> <p class="image"> <img src="/static/images/modern_life_is_rubbish.jpeg" alt="Modern Life is Rubbish"></img> </p> <p>So I didn’t buy it. Of course, I came back into the fold with Parklife, and have remained a Blur fan ever since. But for whatever reason I never circled back to <em>Modern Life</em>. </p> <p>Until now. I’ve been listening to it all weekend and I honestly don’t know what was wrong with me. The album is delightful! </p> <p>It’s a rich serving of proto-Britpop with all the hallmarks that would characterize the Blur sound for the rest of the decade: the zany mishmash of British Invasion, post-punk and Baroque chamber music, the lush harmonies, elaborate melodies and chord progressions, the playful and dissonant guitar work, the quirky syncopated rhythms, the cheeky observational lyrics - a fully realized, coherent expression of a discrete musical worldview. </p> <p>So to <em>Modern Life is Rubbish</em>, I offer my apologies for having dismissed you out of haste and distorted expectations, and I look forward to continuing to try and make up for lost time.</p> Ryan McGreal 2