Kategorie: software engineering

  • Programmier-Dingens

    Programmier-Dingens

    Eine Spielwiese für Sortier-Algorithmen.

    Eine neue Familie von Monospace-Fonts von GitHub namens monaspace, mit ein paar sehr innovativen Features, u.a. dass (trotz Monospace!) die Breite der Buchstaben je nach Kontext variieren kann. Wo zum Beispiel Buchstaben wie l und i, die wenig Platz brauchen, auf Buchstaben, die gerne mehr Platz hätten, wie w und m treffen, rutschen die schmalen zur Seite und der breite Buchstabe darf sich ausbreiten. Auf der Website unter „Texture Healing“ anschaulich animiert. Schaut cool aus.

    Confusing git terminology – Konzepte, die bei git ähnlich heißen, aber ganz unterschiedliche Dinge sind, übersichtlich auseinander-definiert. Danke dafür.

    Es gibt zwei Dinge, die in der EDV (Experimentellen Daten-Verarbeitung) seit jeher schwierig sind: Rechnen mit Datum und Zeit (Unix-Time, UTC, Schaltsekunden), Darstellung im richtigen Zeichensatz (ASCII, ISO-8859-1, UTF-8). Und dann gibt es Konzepte aus der realen Welt, die einfach scheinen, es aber nicht sind. Hier ein Beispiel von einer Postleitzahl, bzw. eines australischen Postcodes, der so ziemlich alle laienhaften Erwartungen enttäuscht. Ich übersetze hier mal den Mastodon-Post von xssfox:

    Irrtümliche Annahmen: Ein Postcode …

    • bezieht sich auf einen geographisch kleinen Raum (in D etwa einen Stadtteil)
    • ist geeignet, einem Anwender Vorschläge für Dinge „in seiner Nähe“ zu machen
    • liegt vollständig in einer Zeitzone
    • liegt vollständig in einem Staat (i.S.v. Bundesstaat, in D wie in AUS)
    • hat keine Enklaven oder Exklaven (keine Löcher innerhalb und keine Inseln außerhalb)

    Und dann zeigt xssfox uns den australischen Postcode 0872, der flächengrößste seiner Art in Australien. Er zieht sich über drei Bundesstaaten, hat zwei Löcher und ein paar kleinere Inseln außerhalb, die ebenfalls über diesen Postcode adressiert werden.

    Andere Leute haben dann noch beigetragen, dass sich Postcodes nicht auf andere geografische Systeme übertragen lassen. Und – auch in Deutschland wahr – ein Postcode/eine Postleitzahl darf man nicht als Zahl auffassen, sonst geht die Null flöten, bei 0872 wie bei 04178 Leipzig. Spätestens sobald man es mit Anschriften im Vereinigten Königreich zu tun hat, vergehen einem solche Flausen für immer.

    Auf weitere lustige IT-Basiskonzepte, die nicht so einfach sind wie sie scheinen, weißt Jan Schaumann als netmeister.org immer wieder hin. Kleine Auswahl:

    P.S.: Coding with Character, eine Liste von 70 Monospace Schriftarten.

    P.P.S.: Modern Unix: Eine Sammlung sehr cooler Werkzeuge, die ihre althergebrachten Vorbilder ähm, tja alt aussehen lassen. Beispiele:

    • bat ist cat mit Syntax-Highlighting
    • delta ist diff in Farbe
    • ag alias argentum alias The Silver Searcher, eine blitzschnelle Suche nach Text, mit vordefinierten Filtern für bekannte Programmiersprachen wie Java und HTML.
  • Noch mehr Software Archäologie

    Noch mehr Software Archäologie

    50 Years of Text Games

    Ich habe es tatsächlich geschafft, eine Fundraising-Aktion auszulassen. Hätte ich von ihr gewusst, weiß ich nicht, was mich davon abgehalten hätte …

    For fifty years, writers have been creating interactive fiction on digital platforms. From text adventures to VR poetry, MUDS to mobile dating sims, chatbots to roguelikes, these games without graphics have pioneered new genres of interactive storytellingand engaged imaginations with prose and code.

    50 Years of Text Games

    Der Fundraiser ist sehr erfolgreich abgeschlossen, das gedruckte Buch schon vergriffen, aber es gibt noch das PDF (für $25, also $0,50 pro besprochenem Spiel). Auf der Kaufseite gibt es unten den Download des Probekapitels A Mind Forever Voyaging, liest sich gut, finde ich.

    Grafische Geschichte

    Ein paar Links zu eher grafisch orientierter Computer-Archäologie:

    The Computer Graphics Essential Reference

    Eine old-style Textwüste mit verdichteter Information über viele maßgebene und innovative Firmen, von Amiga über Pixar bis (natürlich) Xerox PARC.

    Visuelle Zugabe: A digital archive of graphic design related items that are available on the Internet Archives mit z.B.

    Infrastruktur Geschichte

    Sonnenaufgang

    ANDREAS BECHTOLSHEIM & WILLIAM JOY ORAL HISTORY

    Andreas Bechtolsheim ist einer der Gründer von SUN Microsystems und Designer der SUN-Hardware plus vieler weiterer Network- (und) Hardware-Innvoationen.

    William „Bill“ Joy hat neben vielem anderen die Berkeley Software Distribution (BSD), eine Distribution von AT&T Unix plus Patches und Tools, ins Leben gerufen. Dieses BSD ist Urvater der heutigen FreeBSD, OpenBSD, NetBSD-Distributionen und ihrer Varianten. Dann hat er Java erfunden 🙂

    DSM: What studies were you neglecting? I mean obviously you got sidetracked in a great way.

    WJ: I was going to do theoretical computer science, and actually I ended up fixing the Pascal system. I had been trying to write a parser for general context free languages. That was a programming algorithm that someone had published in trying to think about a way of doing a better parser. It’s a theoretical kind of thing. And when I was trying to write the theoretical parser as a program, the programming language implementation wasn’t good enough. So then I had to go fix the programming language implementation. Then I needed a better editor to do that. Then the operating system was not stable enough. You never get back to where you started. You just recursively descend fixing other things. So I ended up kind of stuck at the lowest level fixing the operating system.

    (…)

    DSM: So tell the story of how you two guys met.

    AB: I actually knew of Bill because he was famous. It was basically this guy from Berkeley who did this whole UNIX compiler pretty much by himself. Everybody was waiting for the next release of the 4.1 and 4.2 tape that was supposed to be the production release, and here we were having this piece of hardware but no software, and here was the perfect software.

    Eine kurze Geschichte von Objective-C

    Ganz früher war Pascal die Sprache der Wahl um Anwendungen für den Apple Macintosh zu entwickeln. Trendsprache der 80er war dann aber bald C. Aber Steve Jobs hatte die Zukunft gesehen, damals in den 1970ern bei Xerox. Es hatte nur ein paar Jahre gedauert, bis er verstanden hat, was er gesehen hatte. Seine neue Firma, NeXT, baute ihre Software darum auf einem „Das Beste aus zwei Welten“-Hybrid auf, einem der ersten objekt-orienntierten Dialekte von C, Objective-C.

    Die Frameworks, die NeXT damals für ihr Betriebssystem NeXTSTEP entwickelten, waren außergewöhnlich gut designt und dienten daher, seit Steve Jobs (samt NeXT) zu Apple zurückgekehrt war, als MacOS weiter. Um dann auch zur Sprache der Wahl auf einer mobilen Plattform namens iPhone zu werden.

    Das Computer History Museum hat einen historischen Abriss über das Woher und Wohin von Objective-C geschrieben, der auch Xerox PARC streift: Der Ort, an dem Steve Jobs die Zukunft gesehen hat.

    THE DEEP HISTORY OF YOUR APPS: STEVE JOBS, NEXTSTEP, AND EARLY OBJECT-ORIENTED PROGRAMMING

    Objective-C was created in the 1980s by Brad Cox to add Smalltalk-style object-orientation to traditional, procedure-oriented C programs. It had a few significant advantages over Smalltalk. Programs written in Smalltalk could not stand alone. To run, Smalltalk programs had to be installed along with an entire Smalltalk runtime environment—a virtual machine, much like Java programs today. This meant that Smalltalk was very resource intensive, using significantly more memory, and running often slower, than comparable C programs that could run on their own. Also like Java, Smalltalk programs had their own user interface conventions, looking and feeling different than other applications on the native environment on which they were run. (Udell, 1990) By re-implementing Smalltalk’s ideas in C, Cox made it possible for Objective-C programmers to organize their program’s architecture using Smalltalk’s higher level abstractions while fine-tuning performance-critical code in procedural C, which meant that Objective-C programs could run just as fast as traditional C programs

  • It’s easy until you look closely

    Ein paar erhellende Aufsätze beim NetMeister über so alltägliche Dinge wie URLs und E-Mail-Adressen, die erfahrene Programmierer*innen verstanden haben. Zumindest glaubte ich das von mir, bis ich diese Aufsätze gelesen hatte.

    Zum Aufbau von URLs:

    I think we need to talk… It’s not you, it’s me. My relationship status with all things computers is best described as „it’s complicated“. We’re frenemies. One of us doesn’t seem to like the other.

    […]

    And yes, of course you can give the path name component any valid name, such as „💩“

    […]

    A „query“ component in a URL follows a „?“ characters and… is basically not well defined at all. You could put just about anything into the query, including characters that would otherwise not be possible, such as „/“ and „?“

    URLs: It’s complicated …

    Über E-Mail-Adressen:

    Most email providers — most people, in general — treat email addresses as case-insensitive. That is, they treat jschauma@netmeister.org and Jschauma@Netmeister.Org as the same. And while the right-hand side — the domain part — is case-insensitive as it follows normal DNS rules, the left-hand side or local part, is not.

    The RFC is rather specific here, and mandates that the local part MUST BE treated as case sensitive. (Note: this does not mean that they can’t end up in the same mailbox, but the point is: they don’t have to.)

    […]

    You can put emojis in the local part.

    While RFC5321 only permits ASCII, RFC6531 permits UTF-8 characters if the mail server supports the SMTPUTF8 (and 8BITMIME) extensions.

    Your E-Mail Validation Logic is wrong

    Und der – je nach Schmerztoleranz – witzigste ist über Namen im DNS:

    The editor wars have been decided at the TLD level: .vi exists (U.S. Virgin Islands), but .emacs does not (emacs.vi, however, does).

    […]

    .invalid and .test — for testing and documentation, originally defined in RFC2606.

    […]

    Now within the context of, for example, HTTP cookies or x509 TLS certificates, it’s rather important that an entity cannot use a wildcard to match an entire TLD, but how does a browser know whether foo.example is a reserved second-level domain, or simply a normal domain registered by some entity? Should a website be able to set a cookie for foo.example? Should it be able to get a certificate for*.foo.example? There is no programmatic way to determine this.

    To solve this problem, the good folks over at Mozilla started putting together a list of these TLDs and „effective TLDs“, known as the Public Suffix List. That’s right, it’s another one of those manually compiled and maintained text files we like to build the internet infrastructure on! (emphasis mine)

    TLDs — Putting the ‚.fun‘ in the top of the DNS
  • Haben wollen: Steve Jobs and the NeXT Big Thing

    (Erstveröffentlicht am 05.03.2005, ergänzt)

    Wo sind Books on demand, wenn man mal wirklich einen demand hat?

    Ich hätte wirklich gerne „Steve Jobs and the NeXT Big Thing“ von Randall Stross, aber in Deutschland scheint mir niemand dieses Buch zu einem vernünftigen Preis verkaufen zu wollen. Nicht mal bei ebay.

    Das Buch erzählt die Geschichte von NeXT Computer Inc., der zweiten Firma, die von Apple-Chef Steve Jobs mitbegründet wurde und die für ihre leistungsstarke und benutzerfreundliche Kombination aus Unix, einem komplett objekt-orientierten Anwendungsentwicklungssystem und einer wegweisender Oberfläche auf fortschrittlichster Hardware bekannt war. Vieles von dem, was Mac OS X heute hat und ist, basiert auf dem NeXT-Betriebssystem NeXTStep.

    Tja, wenn das Verlangen (=demand) nach diesem Buch anhält, werde ich vielleicht doch einen Import aus Amerika in Betracht ziehen. Hat das schon mal jemand gemacht? Funktioniert das?

    Wired Buchkritik

    (Update 2021: Ja, ich habe das Buch inzwischen gekauft und gelesen und das meiste wieder vergessen. Aber ich will ja eh irgendwann mal über all diese Bücher bloggen. Bei vielen dieser Ausarbeitungen ist das Problem, dass die Autoren die harten technischen Themen meiden, um das Publikum nicht zu erschrecken. Genau die würden mich aber interessieren.)

    (Und es gibt ja inzwischen ein hübsches Coffee Table Book mit vielen Fotos aus den ersten NeXT-Jahren, aus der Newton-Entwicklung bei Apple, über Adobe … sehr schön, übrigens: Fearless Genius: The Digital Revolution in Silicon Valley 1985-2000)

    Wired Buchkritik, dazu (mit vielen Fotos aus dem Buch)

  • Als die Blase platzte

    Als die Blase platzte

    Wir schreiben das Jahr 2002, der Autor dieser Zeilen ist bei der deutschen Vertriebsorganisation der Software AG (SAG) als Berater angestellt. Die SAG hatte viele Jahrzehnte bewährte Datenbank- und Anwendungsentwicklungs-Software (ADABAS und NATURAL) auf bewährten Großrechnern (IBM S/390) und Mini-Computern (VAX, BS2000, Unices) hergestellt und verkauft und es damit zum (nach SAP) zum zweitgrößten deutschen Software-Konzern geschafft.

    Aber ach, die Zeichen der Zeit waren bunt und klickbar, Windows erorberte die Arbeitswelt, Großrechner waren out, Irgendwas-mit-Internet ein Muss. Die Gründer-Generation hatte das Zepter abgegeben, der neue Chef, Erwin Königs, steuerte einen entschiedenen Innovationskurs, legte mit Bolero und Tamino zwei Produkte in den beiden Kernmärkten des Unternehmens vor.

    Tamino ist eine XML-Datenbank, und XML war damals um die Jahrtausendwende ein genauso heißer Sch***, wie es JSON, Docker, Kubernetes dann Jahre später auf ihren Gebieten sein würden. Über einen Achtungserfolg kam Tamino (Transaction Manager for Internet Objects, vermutlich ein Backronym) nicht hinaus. Zu schnell zogen die Branchengrößen IBM und Oracle XML-Extensions in ihre Flaggschiffe ein.

    Bolero war (als Spezifikation) die Essenz aller Erkenntnisse, die Business-Programmierer im Laufe ihrer Karriere so gewinnen müssen: eingebaute Persistenz-Engine, null-safe, Code immer im Repository, Generatoren für die Integration mit Systemen wie SAP, super!

    Die ganzen Goodies machten das Ding zur damals™ größten Java-Anwendung der Welt … was einem hätte zu denken geben können, denn damals war Java bei weitem nicht so schnell wie heute. Auch auf sehr gut ausgestatteten Laptops war der Arbeitsfluss eher ein Arbeitströpfeln, und durch den geführten Ansatz (für alles und jedes ein Fensterchen, ein Assistent, ein Dialog, nur den Code bekam man fast nicht zu Gesicht) fühlten die jungen, wilden Coder sich doch sehr gegängelt.

    Beide Produkte, auf denen doch die Zukunft des Konzerns ruhen sollte, zündeten also im Markt nicht. Was zusammen mit dem Platzen der DotCom-Blase dazu führte, dass der Konzern in seine erste veritable Krise geriet und zum ersten Mal im größeren Umfang Stellen abbauen musste. Die Mitarbeiter, die gedacht hatten, es sich bei einem soliden Mittelständler gut eingerichtet zu haben, waren shell shocked. Schon der Börsengang der schon-immer-AG 1999 war ein Kulturschock, und nun das!

    Um den Laden über Wasser zu halten, wurden die Vertriebsgesellschaften umgekrempelt. Der neue Manager für die konzern-weit wichtigste deutsche Landesgesellschaft wurde von HP abgeworben und brachte seine amerikanisierten Vorstellungen von Motivationserzeugung mit – ein weiterer Kulturschock. Das jährliche Vertriebs-Kickoff war ganz amerikanisch ausgelegt, mit FastFood und Football, und ging mit seinem Hurra-Patriotismus seiner Hurra-Salesmanship und „Wir schaffen das! Tschakka!„-Rhetorik als eine der schlimmsten Veranstaltungen in die Erinnerung vieler meiner Kollegen ein.

    Warum ich das alles erzähle? Beim Aufräumen des Kellers ist die oben abgebildete, auf eben diesem Kick-Off als Goodie verteilte Basecap wieder aufgetaucht. Sie scheint mir heute in ihrer Realitätsverweigerung wie ein Vorläufer der infamen MAGA-Hüte.

  • Tabs of Yesteryear

    Brian Eno, Top-Produzent von Musik für Flughäfen und Aufzüge1, hat ein Kästchen mit Kärtchen. Auf jedem Kärtchen ein Ratschlag, um aus einem kreativen Loch, einer Uninspiriertheit herauszufinden. Hat erstmal nichts mit Musik zu tun, ist einen Blick wert, wenn man feststeckt. Digital unter Oblique Strategie, mit so zufällig ausgespielten Perlen wie:

    • Take away the elements in order of apparent non-importance
    • You don’t have to be ashamed of using your own ideas
    • State the problem in words as clearly as possible
    • u.v.a.m.

    1 Okay, außerdem auch noch von U2, David Bowie, Talking Heads, … f*ck! there’s an own Wikipedia category for this!

    Die Configuration Complexity Clock fasst ein (vielleicht/vermutlich) nur für Programmierer nachvollziehbares Vorgehen zusammen: Eine gewisse Abneigung gegen einfache Lösungen verbunden mit dem Wunsch „es richtig zu machen“ (im Gegensatz zu „das Richtige, vom Kunden bezahlte“ zu machen). Man beginnt damit, dass ein Programm eine gewisse Konfiguration benötigt, im Beispiel einen änderbaren Umsatzsteuer-Satz. Dazu braucht man eine Konfigurationsdatei und das könnte das Ende vom Lied sein.

    Tatsächlich endet es aber öfter als einem lieb ist damit, dass die Konfiguration zu einem Programm in einer selbst-erfundenen Sprache ausartet. Und da es nun ein Programm ist, braucht es bestimmt die ein oder andere Einstellung in einer Konfigurationsdatei. Die Complexity-Clock schlägt Zwölf, das Spiel beginnt von neuem. Details im verlinkten Artikel.

    Two Hard Things in Computer Science ist eine Sammlung von Martin Fowler, die ein paar meiner Lieblingsweisheiten zur IT enthält, darunter diese hier:

    Kris Köhntopp in einem Twitter-Thread über den Alltag von uns Software-Entwickler:innen:

    There are always existing systems that do not fit exactly, but which you are dependent on.

    There is always an existing system your code has to fit into.

    Hi, I am Kris. I have been working with computers since I am 14 years old, and I am over 50 now.

    Die meisten von uns arbeiten nicht an Betriebssystemen und Compilern. Sondern an dem System, mit dem die Firma seit 15 Jahren ihr Geld verdient und an dem schon fünfzig Leute vor uns gearbeitet haben. Nix Drei-Wünsche-Fee. Software-Archäologie.

  • Im Königreich der Substantive

    For the lack of a horse,
    RidersGuild.getRiderNotificationSubscriberList().
    getBroadcaster().run(
    new BroadcastMessage(
    StableFactory.getNullHorseInstance()));

    Steve Yegge mit einem amüsant geschriebenen Bericht aus Javaland, wo der König mit dem Sonnengott spricht. Es geht darum, dass in Java alles eine Klasse und damit ein Substantiv sein muss, und Verben ein ärmliches, an den Rand gedrängtes Leben führen, noch dazu meist in den eingeschränkten Formen von doIt()execute() oder run().

    Dabei gibt es doch Programmiersprachen, in denen Verben das Land mit Leben füllen und ohne die Aufsicht von Klassen frei in der Gegend herumlaufen dürfen. Lesenswert für alle, die in letzter Zeit zuviel Java programmiert haben.

    Drauf gekommen durch Joel’s Artikel Can Your Programming Language Do This?.

    Now you need a way to pass an argument to the function which itself is a function. This is an important capability, because it increases the chances that you’ll be able to find common code that can be stashed away in a function.

    Das Gedicht, das im Artikel javanisiert wird, habe ich auch gefunden, ohne Exceptions jetzt.

  • Älteres, abgestaubt

    Aus 20 Jahren Bloggerei ein paar Einträge aus der Blogger-Ära (~2005?)

    42 47 Ways To Say “Broken” 

    Bei Tim Bray gibt’s eine gepflegte Liste englischer Ausdrücke für „Tut nicht!“ Besonders nett finde ich “long-term pending mode”. Das trifft ein oder zwei Features in meinem Projekt ganz gut!

    Autoenigmatisch 

    … sich selbst ein Rätsel sein.

    Tori on Peter

    Peter Gabriel taught me, when I worked with him a bit in the early 1990s, that attention to structure is what you have to develop if you’re going to be a composer/songwriter generating effective work throughout your life.

    EXCLUSIVE Excerpt from ‚Tori Amos: Piece by Piece‘

    Und viele weitere interessante Gedanken von Tori, deren neues Album am 22.2. herauskommt!

    Update 2021: Weniger als 17 Jahre später habe ich mir dann mal das Buch bestellt. Der Link geht jetzt in die Wayback Machine, dieser völlig unbekannten Bewahrerin der Internetkultur. Mal wieder spenden, wenn Geld vorhanden, bitte.

    ABOUT DAVE CUTLER… 

    Da sucht man nun (nach der Lektüre von „ShowStopper“, dt.: „Der Krieg der Codes, Wie Microsoft ein neues Betriebssystem entwickelt“) nach Dave Cutler, dem Chef-Programmierer von Windows NT/2K/XP und stattdessen findet man diesen Mensch hier:

    „Dave Cutler lives with his wife Carol and their two children and dog in Redding, CT. He is a graduate with honors from the School of Visual Arts and has been a free-lance illustrator for 20 years.“

    About Dave…

    Ein paar Klicks durch sein Portfolio entdecken ein Faible für Technologie und eine Leidenschaft für Menschliches – in schönen Farben und klaren Formen ausgeführt.

    Update 2021: Inzwischen hat Dave Cutler bei Microsoft eine ordentliche Ehrung bekommen, The engineer’s engineer: Computer industry luminaries salute Dave Cutler’s five-decade-long quest for quality

    Dave Cutler war nicht nur verantwortlich für die erste Version von Windows NT, nein, er leitet das Team, wie es aussieht, noch heute. Ob er wohl noch zum Codeschreiben kommt? (Update 2021: Inzwischen war er auch in Azure unterwegs und in der X-Box ebenfalls.)

    Avie Tevanian

    Und weil wir gerade bei Betriebssystem-Halbgöttern sind, hier Dave Cutler’s „Gegenspieler“, der Mensch, unter dessen Ägide das Mac OS X entstanden ist: Apple Kurz-Bio Avie Tevanian und ein Interview mit seiner Hochschule (CarnegieMellon). (Update 2021: Stattdessen die Oral History-Videos des Computer History Museum:)

    Und zwei Links zum Werdegang von NeXTStep zu Mac OS X: (Update 2021: Links auf Wayback Machine umgestellt.)

    It would be an understatement to say that OS X is derived from NEXTSTEP and OPENSTEP. In many respects, it’s not just similar, it’s the same. One can think of it as OpenStep 5 or 6, say. This is not a bad thing at all – rather than create an operating system from scratch, Apple tried to do the smart thing, and used what they already had to a great extent.

    A Brief History of Mac OS X

    Apple has leveraged a lot of existing open source software by integrating it well (usually) with their system: apache, bind, binutils, cvs, gcc, gdb, gimp_print, kerberos, mysql, openssh, openssl, pam, perl, postfix, ppp, python, rsync, samba, and many more BSD/GNU/other packages … are all part of Darwin.

    Architecture of Mac OS X
  • The Graphing Calculator-Story

    My skunkworks project was beginning to look real with help from these professionals as well as others in graphic design, documentation, programming, mathematics, and user interface. The secret to programming is not intelligence, though of course that helps. It is not hard work or experience, though they help, too. The secret to programming is having smart friends.

    The Graphing Calculator Story

    Von und über einen Entwickler, der ohne angestellt oder beauftragt zu sein, in einem Apple Büro eine schöne Anwendung schrieb, von der keiner wissen durfte.

    In October, when we thought we were almost finished, engineers who had been helping us had me demonstrate our software to their managers. A dozen people packed into my office. I didn’t expect their support, but I felt obliged to make a good-faith effort to go through their official channels. I gave a twenty-minute demonstration, eliciting „oohs“ and „ahhs.“ Afterward, they asked, „Who do you report to? What group are you in? Why haven’t we seen this earlier?“ I explained that I had been sneaking into the building and that the project didn’t exist. They laughed, until they realized I was serious. Then they told me, „Don’t repeat this story.“

    The Graphing Calculator Story