./1996-first-pybook.png.note==================================================== In the beginning... the first Python book started, during the Python 1.X era (1.2 and 1.3, to be precise). It was signed in 1995, after months of convincing the Perl-focused publisher (then, O'Reilly & Associates) to take a risk on an upstart. This was the first of 14 books and 11k pages to come. It begat both Learning Python and Python Pocket Reference (ahead); essentially, two of its appendixes were split off into standalone books. My optimistic sales estimate in 1995 was 5k units, but by 2020, this title and its progeny crossed the 750k mark. Takeaway: I'm lousy at estimates. ./1998-puertorico-1.jpg.note==================================================== From an early training trip to San Juan, Puerto Rico. This was the first of many classes outside the contiguous US. This was also the second year of training, but there are no photos from earlier classes, and few from this timeframe in general; I never expected training to become a thing. Caveat: some of the early pictures here though 2002 are scans of paper photos (see their info popups with a filename tap or down-swipe). Digital cameras weren't common back then, and the training business opened on a shoestring budget. ./1998-pyref1e-book.jpg.note==================================================== The first pocket reference—a details-only quick reference, which was derived from an appendix in the first Programming Python. It covered Python 1.5 and at 80 slim pages wasn't much at this point, but grew into a more useful 260-page reference by 2014's 5th Edition. ./1999-lp1e-book.jpg.note======================================================= The first Learning Python, based on Python 1.5. My parts covered the core language, and drew from both an appendix in the first Programming Python, plus my expanding training experiences. There's really no better way to hone teaching material than to present it live to rooms full of users and critics. My first editor wanted this book for people who would find the technically heavier Programming too much. He was right, of course: over the years, this title has been by far the best selling of my three, and became a de facto standard introduction to a tool that rose to the top of the programming-languages heap. A lot of people contributed to Python over the years, but this title's teaching and publicity roles made it a major factor behind that rise. ./1999-oscon1-tshirt.jpg.note=================================================== Swag from the first O'Reilly Open Source Conference in 1999. The snake is still fourth from the left at this point. These events grew until the publisher pulled the plug on its conferences business in 2020 amidst the pandemic and its own internal morph (though they also grew old for me long before that). ./2000-alameda.jpg.note========================================================= From an early set of classes for TCSI in Alameda, in the Oakland area. TCSI was a telecom company, which also hosted the Newmarket class in the UK up next. ./2000-newmarket-1.jpg.note===================================================== The first overseas class (not counting Puerto Rico), in Newmarket, a small town near Cambridge, UK. All told, I wound up teaching multiple classes in Mexico, Canada, and Europe, including 7 training trips to the latter. I also turned down classes in Australia, Japan, India, Norway, and Saudi Arabia; more on the last of these in 2001. ./2000-newmarket-3.jpg.note===================================================== One of the horse farms in the area, Newmarket's claim to fame (or so my Kentucky wife tells me). I stayed in a bed-and-breakfast place nearby; Frosties and English breakfast before trotting off to class. ./2000-newmarket-4.note========================================================= Wandering about near the end of the trip. On the way back, there was a massive traffic backup well before the airport, and my driver dropped me off at a rural train station to catch a train the rest of the way, even though I didn't know a thing about the trains at the time. I wound up being told to run through the airport to catch my flight. And so began the travel stress dreams... ./2000-nyc.jpg.note============================================================= The first of three New York City classes. This one was notable for both a cold trek through Times Square in search of food, and a class held in a skyscraper across from the World Trade Center. ./2000-palmIIIx.png.note======================================================== The first of the gadget pictures on this page, added for variety (and nerdity). As a road warrior, I used a Palm IIIx like this one almost constantly in the early 2000s, before switching to Sony CLIÉs, Zaurus Linux PDAs, OQO Windows handhelds, and eventually Android smartphones—where innovation has largely stalled. Follow the device saga ahead. The Python 2.X scripts coded to convert Palm memos and calendars for use on the Zaurus are still on this site; see pp2e-updates.html#Ss. Was 2.X ever really broken? ./2001-colorado.jpg.note======================================================== I started teaching my own public classes at a hotel in Colorado this year. These classes were for individuals who would fly in to stay for the session—a common model in the pre-pandemic world. Before this, I taught public Python classes in Boulder, Colorado arranged by TCPC, a Perl training company (yes, really). ./2001-dublin-1.jpg.note======================================================== The first of two classes in Dublin, Ireland for a reinsurance company. Fresh Guinness on Grafton Street, and a day off to wander about and see the sights. The UK and Europe in general are enormously impressive for a traveler from a land whose history spans just two and a half centuries. Travel sidebar: I almost taught a class in Riyadh, Saudi Arabia this year, but there was a bombing in the area I was booked to stay in, shortly before my departure. Python may be cool, but it's not cool enough to get blown up for. ./2001-pp2e-book.jpg.note======================================================= The second Programming was a completely different book from the first: it was able to narrow its focus to common applications of the language, after the reference and language-tutorial parts were split off to the Pocket Reference and Learning, respectively. From this point on, this title would cover topics presented hurriedly on the last afternoon of my three-day classes: the Internet, GUIs, text, and the like. The book was able to do a much more complete job than the classes, though what you "do" with Python is enough to fill careers. ./2001-sandiego.jpg.note======================================================== At OSCON 3, in San Diego. Somehow, I jumped on a plane to teach the Dublin class just after teaching a tutorial here. ./2002-barcelona-1.jpg.note===================================================== The next few pictures are from training for HP in Barcelona, Spain. I taught 3 classes here over two separate trips, and had a weekend off in between two classes to explore. Barcelona is an amazing place; it's something like Southern California, but with history. And yes, I got paid for this stuff. ./2002-barcelona-2.jpg.note===================================================== A statue of Christopher Columbus near the Mediterranean coast on the Ramblas. The first voyage was welcomed back here by Isabella and Ferdinand in the 15th century. On the other side of the pond, I also taught (and played squash badly) in Mexico City this year, but have no photos of the trip, regrettably. ./2002-sonyU1.jpg.note========================================================== The Sony U1: a more-or-less handheld Windows PC, that was sold only in Japan, but distributed in the US by Dynamism in Chicago (which later morphed into a 3D printing company, weirdly). The U1 was a bit large for a handheld, and a bit small for a laptop, but its wow factor was off the charts at the time. ./2003-dublin-1.jpg.note======================================================== Back to Dublin for a repeat engagement, this time with an extra day to focus on the wxPython GUI toolkit. I tripped over some stairs on the way to the airport and bruised up my leg badly, but managed to teach the class anyhow; the show must go on, especially when you've crossed an ocean to get there. This was shot on a Sony "Handycam" digital camcorder, but the result doesn't seem any better than paper scans. Digital photography took off anyhow, especially with smartphones a few years down the pike. ./2003-lp2e-book.jpg.note======================================================= The second Learning adopted new core-language training material I had honed over numerous classes since 1E. The first edition's coauthor opted to skip this edition, and would exit in full on the next, but most of the material (and work) was already mine. ./2003-sonyClie.jpg.note======================================================== The CLIÉ: a Palm-OS based PDA from Sony, which sported a keyboard, Internet connectivity, memory sticks, a high-res color screen, audio players, camera, and more. I started using one after the original Palm PDA started showing its age. It competed with Windows Mobile at the time, and foreshadowed much of what smartphones would become (sans the media prisons and data collection). ./2004-colorado-1.JPG.note====================================================== More scenes from Colorado, home of public classes for individuals; private classes for Seagate, HP, and others; and the instructor (at the time). This picture and the next were taken in Rocky Mountain National Park, the setting for a later weeklong public seminar. ./2004-ftwalton.JPG.note======================================================== The next two pictures are from 2004 classes: on the beaches in Florida (while teaching at an Air Force base), and California (while teaching at an HP site in San Diego). The latter was the only one of the eight San Diego classes not taught for Qualcomm. ./2004-zaurus.JPG.note========================================================== The Sharp Zaurus PDA, a fully functional Linux-based handheld computer. This was real Linux, long before Android's locked-down flavor rose to dominate the handheld domain. I owned two of the clamshell models and happily tapped out Unix commands on both, before the OQO came along (see 2006). ./2005-georgia-bnr.JPG.note===================================================== Two photos from 2005 training trips are up next: one of the four sessions at Big Nerd Ranch (focus-enabling seminars held in the Georgia woods), and another Puerto Rico trip (a return engagement for the 1998 client). ./2005-staugustine.JPG.note===================================================== Another 2005 training trip: near St Augustine, Florida, where a hurricane churning offshore provided both color and street flooding. (For anyone keeping count, I also survived a hurricane in Virginia and a tornado warning in Illinois, and got stranded by an Earthquake in Seattle after a Vancouver class.) All told, there were 32 classes in 2005, the second busiest year, but 2006 would be even more intense; see the main Teaching Python page for the full list. ./2006-chicago-1.JPG.note======================================================= The first of a batch of training photos from 2006, a crazy peak-demand year that hosted 43 mostly out-of-town classes (plus a 1600-page book). The first two are from one of the many classes held for trading companies in downtown Chicago. ./2006-doused-oqo.JPG.note====================================================== The OQO, a remarkable handheld computer that ran full Windows before smartphones were around. I owned two of these: the one shown here (which wound up being drenched by a spilled beer in London), and the last model (which still works to this day; see 2008). The OQO also ran real Excel with VBA—something that neither Android nor iOS can do at this writing. The OQO generated a lot of buzz at the time (and was demoed by a B. Gates onstage at a Windows conference). Sadly, its moment in the limelight was brief. Whether it was too pricey, too ahead of its time, or too something else, OQO died before the rise of smartphones, which still seem crippled by comparison today. ./2006-edmonton.JPG.note======================================================== A famously giant shopping mall in Edmonton, Canada. This class was for the Canadian weather service. The airline lost my luggage here, and I wound up having to scrounge up some replacements in a hurry (and during snow-storm power outages). Much of the downtown area was indoors, and there were plug-ins for car heaters in the parking lot; cold up there, eh? ./2006-london-1.JPG.note======================================================== A week in London teaching for a major financial company. This is where the first OQO was baptized by a Guinness, at a pub nearby. ./2006-london-2.JPG.note======================================================== St Paul's from the Millennium Bridge (see also 2009). ./2006-london-3.JPG.note======================================================== The Tower of London. And if that's not historic enough for you, there's part of the Roman wall across the street. ./2006-monterey.JPG.note======================================================== The California coast at Monterey. I was in the area to teach for Google at the Googleplex in Mountain View. The stock market was already raining money on the place by this time. I remember being taken to one of the company cafeterias, where the free lunch of the day was wild boar. To which one of the people in line lamented: "Aw; wild boar again?"... ./2006-nyc-spamalot.JPG.note==================================================== The next three shots are from the two training trips to New York City this year. For one, my hotel was near the SPAMALOT venue off Times Square. The classes themselves were both downtown; one was near Wall Street, which was still heavily guarded after 9/11. Somewhere along the way, there was a jazz club, late-night street pizza, and Python training. ./2006-pp3e-book.jpg.note======================================================= The third of four Programming Pythons, which expanded its applications materials, and covered Python 2.5 (arguably one of the best Pythons, and two years before 3.X cropped up). Parts of this book were written during an all-night hotel marathon in an Embassy Suites in downtown Chicago, before teaching a class the next day. It was probably time to start thinking about scaling back (and/or human cloning). ./2007-lp3e-book.jpg.note======================================================= The third Learning Python. This one was exclusively about the core language. The former editions' coauthor dropped out altogether, and his 1st Edition material was trimmed to make room for new content derived from recent live classes. The result was a cross-app book that reflected the real needs of real learners; that probably accounts for most of this title's success from this point. This edition itself had some die-hard fans, and still does, though it was a bit light on details, Python 3 was about to convolute the story badly, and the code pointers added by the publisher were arguably annoying (and were cut in 4E). ./2008-seagate-oqo02.jpg.note=================================================== Teaching a class for Seagate in Colorado, with the OQO model 02 (though there's barely enough resolution to tell in this early feature-phone shot). Seagate was my busiest client; I taught 28 classes for the drive maker in multiple locations. This was also a private but local class; out-of-town training stopped in mid 2007 for personal reasons (synopsis: having a life beat having a business), and wouldn't restart until late 2009. I taught multiple classes with the OQO this way; when paired with a Bluetooth keyboard and mouse and an HDMI or VGA projector, it could easily stand in for a full PC for teaching. It ran Windows, Python, the Internet, and everything needed to present a three-day class. A smartphone with casting might suffice today, but this was 2008, when the iPhone and Android were just getting started. ./2009-VaioP.jpg.note=========================================================== Sony's Vaio P: an ultraportable Windows PC, small enough to qualify as a handheld computer, but too big to fit in a pocket. I wrote most of the 1600-page Programming Python 4th Edition on this (and boy are my fingers tired...). ./2009-dublin-1.JPG.note======================================================== St Patrick's Cathedral in Dublin. This set of Dublin and London shots are from a late 2009 training trip for a class in London. By this time, I had scaled back teaching in 2007 and passed along much of my business. This was the first out-of-town class since then, and spawned a brief restart for training the next year, which lasted until 2012. It was too soon to retire, but it was also too soon to know. ./2009-london-1.JPG.note======================================================== Big misogynistically named clock tower. ./2009-london-2.JPG.note======================================================== Atop St Paul's in London, after climbing the stairs in a jetlag stupor. ./2009-london-3.JPG.note======================================================== At the British Museum. We came; we saw; we carted away the ruins of ancient civilizations. ./2009-london-4.JPG.note======================================================== White Tower at the Tower of London, built at the time of the Norman Conquest. Definitely creepier at night. ./2009-london-5.JPG.note======================================================== This seems as out of place as type hints in Python 3.X... ./2009-lp4e-book.jpg.note======================================================= The 4th Learning Python. This and the 4th Pocket Reference were put out to cover the new and backward-incompatible Python 3.X, released the prior year. Much of this edition's growth owes to having to cover two different language lines; the vast majority of readers would still be using 2.X for many years to come. Many people saw 3.X as biased and rude, which is one reason its adoption was very slow. 2.X was not retired until 2020, some 12 years later, when it still had a large and loyal userbase. That said, 3.X is fully usable today, its Unicode model is more coherent, and it's still a lot nicer than Java, C++, Perl, and their ilk—especially if you ignore the bleeding-edge new stuff (and perennial douche moves). ./2010-losalamos-1.JPG.note===================================================== Scenes from a class at Los Alamos National Lab, New Mexico. Government research centers were big early adopters of Python; all told, I taught 10 classes at LANL here, 8 each at LLNL in California and JPL in Pasadena, 7 at Fermi Lab, and 4 at other NASA sites. Plus 2 at the NSA (but you didn't hear it from me). ./2010-losalamos-2.JPG.note===================================================== Closed at the time, but mostly about the bombs, probably. ./2010-sarasota-1.JPG.note====================================================== On the beach in Sarasota, Florida—where I relocated in 2009 and began teaching public classes again. The public classes here didn't last very long, because students' expectations had been raised unrealistically by a flood of deceptive marketing for online training, and I didn't want to be part of the grifting. (Florida didn't last very long either, for reasons beyond the scope of this gallery.) ./2011-bloomington.JPG.note===================================================== In a hotel during a tornado warning in Bloomington, Illinois. Is the sky supposed to be green like that? ./2011-boxboro.JPG.note========================================================= A snow event in the Boston, Massachusetts area, which was bad enough to require modifying the class's schedule. I was living in Florida at the time; this seemed like the apocalypse. ./2011-burlington.JPG.note====================================================== The scene of one of two classes held for Oracle in the Boston area. I also taught for Sun in Colorado, before Oracle digested it. ./2011-chicago-1.JPG.note======================================================= The next four photos are from yet another Chicago class: from the hotel in Streeterville; the classroom downtown; the river by Michigan Avenue; and the Field Museum on the lake. Over the years, I taught 17 classes in Chicago, second only to California's 52 (about 30 of which qualify as the Bay Area). ./2011-chicago-4.JPG.note======================================================= The last of the Chicago-trip photos: the Field Museum—inspiring to a kid from the area decades ago, and an adult from afar decades later. ./2011-hartsfield-2.JPG.note==================================================== A disturbing scene in Atlanta's Hartsfield airport, site of many a plane change. (The one I deleted before this was even cornier.) ./2011-losalamos-1.JPG.note===================================================== One of the classrooms at Los Alamos National Lab; a typical venue, though the labwork machines were more secure than some. ./2011-pp4e-book.jpg.note======================================================= The 4th (and likely last) Programming Python: updated to cover Python 3.X only, and revised for new practice in application domains. Most of the 3E programs reappeared, but were enhanced and ported to run on just 3.X; given the focus on larger examples, dual 2.X/3.X coverage here would have been impractical. This book wound up very different from its 1996 origin, but still retained the original conclusion that used the Gilligan's Island TV show as a metaphor for the software development field. Hey, it's still funny to me. ./2011-sanfrancisco.JPG.note==================================================== Two more classes from 2011: in San Francisco for Dolby, and the DC area for Harris. ./2012-marysville.jpg.note====================================================== The last pictures from the 2010..2012 training restart—Marysville in Ohio (for Scotts lawncare), and Volcanos from a plane above the Pacific Northwest (where I had relocated by this time). I stopped training altogether in late 2012 to focus fully on the Learning Python 5th Edition update, and the later Pocket Reference revision. Training briefly resumed two years later in 2015, but ended in full in 2016. ./2012-volcanos.JPG.note======================================================== Above the PNW. That's Rainier, Adams, St Helens, and Hood; Baker is on the other side of the plane. ./2013-lp5e-book.jpg.note======================================================= The 5th Edition of Learning Python, the bestselling of all my books. I stopped training to focus on this one exclusively for a year. This was something of a swan song for my Python writing career, and incorporated the best of the content honed by the classes I had been teaching since 1997. The net result is a sort of training session in a book, and a still-popular alternative to the myriad of online options that arose in this era. I hope that's been as gratifying to readers as it has been to me. ./2013-treejustice.JPG.note===================================================== You have to read the Teaching Python page to get this joke... ./2013-vaioz.jpg.note=========================================================== The Sony Vaio Z: a Windows "Ultrabook" which was the main writing and coding machine for the Learning Python, 5th Edition project. It ran Windows 7 and dual-boot Linux, and was a stellar PC (though it required a repair after the LP5E project blew out its keyboard). Sony dropped their PC business shortly after this (in response to the Windows 8 fiasco, perhaps), but the Vaio brand is back in business at this writing; see the web for info. ./2014-Frankenthon!.png.note==================================================== The artwork for a Python-changes page I started after the 5th Learning Python was released. See python-changes-2014-plus.html for the page, and the 2009 LP4E note here for more background. To be clear, I've been one of Python's biggest proponents, still use it constantly, and can't stomach the idea of programming in other languages today. Most others seem based on the cynical assumption that programmers don't know what they're doing—and need to be hobbled with training wheels because of it. By contrast, Python remains more ally than obstacle. At the same time, Python has grown bloated, and its rapid morph is seen as counterproductive by many. The changes page calls this out in hopes of inspiring some discussion. I'm not a "hater" and don't mean to pick on anyone personally, but we stakeholders need to take a stand against the constant ego-driven churn now common in Python and the field at large. Breaking others' programs for the sake of personal whims is just plain rude. ./2014-frigcal.png.note========================================================= The next two screenshots show two of the Python programs I started working on after the LP5E book project: a personal calendar/journal GUI, and a content sync/backup system. Both use tkinter for their GUIs; were ported to work on macOS, Linux, and Windows (and later, Android); and were shipped as source code, macOS app, and Windows and Linux executables. After decades of teaching the tools and techniques behind these, it was nice to be able to apply them to something useful. See this site's programs.html for links and info. ./2014-mergeall.png.note======================================================== The Mergeall content sync/backup system, available at this site’s mergeall.html. I initially wrote this because I was tired of waiting for exhaustive PC-to-flashdrive copies to finish. It syncs content quickly by doing incremental propagations using timestamps: only changed items are ever updated. It eventually grew to accommodate a host of interoperability issues and multiple use cases, and work on Windows, macOS, Linux, and Android, in both command-line and GUI modes (see 2019 for the Android GUI). Plus, it's open-source transparent, free to use and mod, and will never root through your stuff without your permission—intangibles that sharply differentiate it from most cloud-storage options. This stuff matters today. See also the 2023 Android+PCs standalone app ahead; it's Mergeall with a Kivy GUI face-lift to work around USB and shared-storage constraints in later Androids. ./2014-pyref5e-book.jpg.note==================================================== The 5th Edition of Python Pocket Reference. At 260 pages, it's much more useful than its 80 page genesis, though I'm not sure the "Pocket" still applies. People with lots of language experience may be able to pick up Python with this book alone, though that's not the audience that arose with the explosion of tech. Both this and LP5E also cover the majority of Python in common use today, but not the esoteric tweaks added since 2014, like type hints and coroutines; most code doesn't need to care. ./2015-florida.JPG.note========================================================= Now we're in 2015 after the 5th Edition books were wrapped up, and a second training restart is afoot. This and the next are from a class held at NASA's Kennedy Space Center in Florida, for structural engineers. ./2015-seattle.JPG.note========================================================= The second of three classes in 2015, for a group of network admins on the University of Washington campus in Seattle. There were just three classes this year; the last, sans photos, was in Vancouver, Canada. And that brings us to the end of the training thread of this gallery. The world had changed while I wasn't watching, and I wound up ending my training business next year in 2016—twenty years after its unplanned and unsolicited start. For more on the move, see "The Plumage Don't Enter into It" in the Teaching Python page. ./2016-macbookpro.jpg.note====================================================== The MacBook Pro: a workstation-level PC that I switched to from Windows, for the software development that I was starting to do on a hobby basis. Windows was going down some dark paths at this point, and the Mac had all the tools that an old Unix developer craves. Well, that and ".DS_Store" and AppleDouble junk files, and enough proprietary nonsense and frequent change to keep it interesting. Windows' UI was nowhere near as nice (though it's stolen most of the Mac's ideas by now), and Linux was too personality based (one shouldn't have to rely on online gossip to use a computer). Your mileage may vary, of course. ./2017-pyedit.png.note========================================================== The next three screenshots are from updates to some Python/tkinter programs that originally appeared in Programming Python. Now that training and writing had wound down, I was finally able to put some time into these, and make them more useful. In the process, they were also ported and frozen into apps/executables. I use PyEdit and PyMailGui as my go-to text editor and email client, respectively; PyGadgets is mostly just for fun, though its calculator sees regular action too. ./2018-books-amazon.png.note==================================================== The books on Amazon, in 2018. Around this time, their publisher was morphing into an online-training company, and its web presence grew more focused on subscriptions than books. It still kept making books, though, and my sales continued to be as strong as ever (thank you, discriminating customers). The publisher also sadly turned to sales of personal information and customer access—one of the reasons that my titles' current editions are likely their last. ./2018-but-more-hats.jpg.note=================================================== Also in this timeframe, my books' publisher started dropping the ball on sales support. This included months-long inventory outages, promotion of infringing titles and competing products, runs on free and DRM-free ebooks, uncollected translation revenues, and more. The publisher-follies page in Teaching Python's 2015 dishes all the sordid details. Many of these issues were corrected over time, but some fell on deaf ears; others were addressed by sending me more silly author hats in lieu of resolution or compensation; and the company's focus shift to online media and customer info/access sales is probably permanent. Future authors and media consumers beware! ./2018-galaxy-s8+.jpg.note====================================================== Thus began my foray into the Android world: the Galaxy S8+, which I picked up to test the mobile-friendly conversion of this page's website (see the next two images). I also experimented with Python programming on this device using the apps available, but it was fairly horrifying for an open-source Unix developer: proprietary tools and device lockdowns were the norm (and still are). The S8+ also ran Android Nougat, which botched file modification times so badly that sync tools like Mergeall were unusable. How in the world did it get away with that? I got an iPod for mobile testing too, but nothing more in Apple's iWhatever realm; iOS is so closed that it's a full non-starter for POSIX programs. More at 2019's Note 9. ./2018-web-gadgets.jpg.note===================================================== Counterclockwise from the top: a MacBook, S8+, J7, and iPod. The portability of the web is stunning... as long as you're willing to spend sizeable chunks of your life wrestling with incompatible browser implementations of a fluid standard, just to get pages to work similarly everywhere until a browser update breaks them. Sans the installs, this doesn't seem a whole lot better than traditional GUI toolkits, does it? ./2018-web-stew.png.note======================================================== A viewer page from the thumbspage gallery builder (see this site's thumbspage.html). I coded this originally in 2016 because I needed it for my website; browser image views were too primitive and variable. Since then it's grown more sophisticated, with image scaling, slideshows, touch swipes, and notes like this, but has retained its basic static model for simplicity. This also was an excuse to play with JavaScript; it's so much like Python that parts of it seem copied (because they were). ./2019-chinese-lp5e.jpg.note==================================================== A Chinese translation of LP5E, some 7 years after it was written. ./2019-galaxy-note9.jpg.note==================================================== The Galaxy Note 9 I moved to after the S8+ (a later Note 10+ isn't pictured here). The Note 9 ran Android Oreo (a.k.a. 8), which finally fixed its modification timestamps, making Mergeall usable for on-phone content syncs. Mergeall first was ported for command-line use in the Termux app, and its GUI later came online thanks to the glitchy but impressive tkinter support in the Pydroid 3 app (which later succumbed to Android morph: see the next note). Both the script and GUI worked well on Android for content syncs by USB, on Oreo, Pie, and 10. Regrettably, Android 11 would later lock POSIX programs out of USB access and slow shared storage to a crawl, and Android 12 would sprout a draconian process killer which can break Python programs in general (see 2021). Android may be based on Linux, but it's been gutted of most of the developer freedom. To be fair, Android is still more open than iOS today—you can sideload apps outside the store, and there is a real filesystem—but it's gaining parity with each release. Security kills fun (and enables evil). ./2019-pyandroid-1.jpg.note===================================================== The next three shots are assorted Python tkinter GUIs running on Android, in the Pydroid 3 app: Frigcal, Mergeall, and a Programming Python book example. It's amazing to see desktop GUIs spring to life on a phone like this, though they generally require a few code tweaks to get there, don't support multiple windows very well, and must be run on a freemium app that flashes obnoxious fullscreen ads unless you pay a fee. It's worth the modest fee, but the policy comes off as quite rude, especially given that the app is largely a package of open-source code. See this site's using-tkinter-programs-on-android.html for more info. In principle, tkinter could also be bundled into standalone apps, but it's a very deep slog, and requires substantial Java—a punt, IMHO, but stay tuned for the standalone Python/Kivy/buildozer app in 2023. (Update: also in 2023, Pydroid 3 lost utility and usability when it adopted Android 11+ scoped storage. Its tkinter still works, but code it runs can now access only Pydroid 3-specific folders, which makes content sharing tedious. More at this site's pydroid3-loses-storage-access.html; an Android casualty to be sure, but Play-store revenue seems a likely cohort.) ./2020-more-stew1.jpg.note====================================================== thumbspage grew info popups, slideshows, and one-page fullscreen this year, and touch swipes and notes in 2021 and 2022. But you already know how the notes look, eh? ./2020-more-stew2.jpg.note====================================================== One-page JavaScript fullscreen via the Full button, on Android Chrome. This works as a sort of zoom, but desktop browsers, Opera on Android, and even Safari on iOS have better fullscreen options that span multiple pages. Hey Chrome: if you're going to dominate Android market share, could we at least get something similar soon? ./2020-ziptools.png.note======================================================== ziptools is an enhanced-utility wrapper around Python's standard zipfile module, which adds UTC timestamps, symlink support, modtime propagation, and more (see ziptools.html). This also was born of necessity: content management requires cross-platform zipfile tools that do the right thing everywhere (even on Android). ./2021-android11.png.note======================================================= Tests showing the speed downgrade of shared storage in Android 11. It's much worse than shown here for some operations; 100x slower is not uncommon, and deletions are so slow that a phone reset may be more practical for large folders. This and the removal of USB access for POSIX programs (like Python) make Android difficult to use for content sync tools (like Mergeall). Along with Samsung's dropping of microSD cards for removable storage, Android phones are becoming content islands, on a par with iOS. While vendor goals are unknown, cloud providers and content snoopers seem the likely winners here (and users seem the likely losers). See this site's mergeall-android11-updates.html for the full story. To work around 11's hurdles, a system of scripts was developed to apply content syncs indirectly using batched and zipped changes; see this site's android-deltas-sync/_README.html. This works well, though it's not GUI based, and may require additional steps on Android 12 (see the next shot). ./2021-android12.png.note======================================================= As captured here on a Pixel 4a, Android 12 has the same speed and access issues as Android 11. That's not exactly surprising, but 12 also adds a "phantom" process killer which culls child processes at arbitrary points after a cross-phone limit of 32 has been reached. While the risk varies per usage (and my phones have never had a kill), this can break apps like Termux and the Python scripts they run, and may impact millions of users. Luckily, adb commands in 12 and 12L, and a new Developer setting to appear in 13 can work around this. But the process killer was rudely added in 12 with no notice whatsoever, and a work-around is not the same as a reversal. It almost seems like Android no longer cares about "power" users, but only for naive and sadly gullible content consumers who are perfectly happy to carry around toyish phones that double as data vacuums and billboards. Go figure... See the web for more info. This hopefully isn't the death knell for Python on Android, but it is a precarious platform. iOS is closed too, but at least it's honest about it. ./2021-note20-fold3.jpg.note==================================================== More gadget fun: the Galaxy Z Fold3 (right) next to a Galaxy Note20 Ultra. The 6.9" Note20 was rolled back to Android 10 after 11 took away USB access, and so it shall remain until its battery gives up the ghost. The 7.6" Fold3 shipped with Android 11 initially, but auto-updated to 12 a few months later, so it's been a test machine for both. From a hardware perspective, the Fold is enough to excite even the most jaded of gadget geeks: it unfolds from phone to mini tablet, and the seam at the fold is hardly noticeable with actual use. When unfolded, the Fold3 is _almost_ a PC stand-in, especially with Bluetooth keyboard and mouse, and screen casting or Dex; and _nearly_ replaces what was lost when the OQO died (see 2006 and 2008). Now if it would only get a real Excel with VBA, and an Android that stops locking down devices for whatever point-of-control agendas Google may want to push. Cynical, perhaps, but it's tough to watch yet another system being pushed into the might-have-been column by corporate greed and/or dysfunction. Of course, there's always the Fold4... (See also the Fold5 photo ahead; the show goes on.) ./2022-bookstore.jpg.note======================================================= Seen at a Barnes & Noble bookstore in summer 2022. Still warping the shelves after 26 years. ./2023-sync-app.jpg.note======================================================== 2023's PC-Phone USB Sync app, running on an Android-13 Fold5. This portable content backup/sync program runs on Android phones and tablets, as well as Windows, macOS, and Linux PCs. It can be used to both backup folders, and sync them between a mix of devices. By using USB drives for propagating changes, it avoids the slowness and privacy issues inherent in clouds. This app is the culmination of a five-year content-processing odyssey on Android, and a decade-long sync saga in general. It's largely the open-source Mergeall system under the hood, with a new portable UI coded in Kivy to support the Android app. Products are built using buildozer for Android and PyInstaller for PCs. On Android, it uses permissions available to standalone apps to regain access to USB drives and shared storage lost in Android 11. On all platforms, it's coded entirely in portable Python, and uses traditional POSIX file-path tools to process content—despite Android's self-defeating efforts to deprecate all such interoperable things. The Android app is paid, partly to fund visibility on the payola that is Play, and partly because free generally implies ad farms or junk on that platform. The PC apps/executables are free, and there's a free trial Android app for test-drives. Visit "https://quixotely.com/PC-Phone%20USB%20Sync" for the full story, and keep your digital property safe from the many dark agendas out there. ./you-are-here.png.note========================================================= So there you have it: some images and anecdotes from my tenure as a Python trainer, writer, and developer. I'm writing these image notes in 2022, partly as a demo for a new gallery-builder feature (see thumbspage.html), but also to provide more of the backstory. Mine was just one computer-science career, of course, but it played out, as the saying goes, in interesting times. In the end, Python was a crusade for me, and I had an exciting quarter-century ride for which I'll always be grateful. But I'm largely retired today, and the Python advocacy and education banners must be picked up by others. If that includes you, I wish you all the best, and hope that some of the perspectives I've shared from my journey may prove useful to you on yours. And as always, code well.