Monday, September 19, 2022

happy 40th birthday of the smiley

Happy 40th Birthday of the Smiley!!!

 


Of course the classic punctuation smiley has been supplanted by cartoon-ish emoji. I admit the cartoons are more expressive and flexible (though sometimes you have to brace yourself for how they will have a different vibe on different devices) but I miss the old visual puns.

These are said to be the Top Five Favorite Emoji in the United States

But...bleh, I kind of hate both of the "laugh crying" emoji. It's just... I don't know, too much, it overdoes the thing. I use plenty πŸ˜ƒ to round off the edges of my casual writing, but the laugh-crying ones are trying to hard, like they seem dishonest, the LOL of the emoji world...

More on the history of the smiley at Lunduke

Friday, September 16, 2022

blue letter-y thing on white icons are so tired!

I saw this on the "this date" feature of my blog with the caption "Oh Shazam, you too?"


I was startled to see that was six years ago. And also, the one that causes me the most havoc in terms of quick recognition is "VS Code" on my Mac:

Though Outlook doesn't help:


Blue letter-y thing on white is so tired!

It's worse on Mac, actually... I see all the icons lined up on my switcher app, but the order is variable, unlike on the iPhone where I tend to develop muscle memory about where icons live.

Sunday, September 11, 2022

chilling out on the iceberg of languages

Great video about the languages out there...

After watching it, and it's reference to "Jr" programmers, I feel a little better as a senior, seeing just how many of these I've used. (BASIC, JS, SQL, Java, C... even ASM for my Atari 2600 project.) 

A few personal historical notes from the 90s (and from the 80s):

  • They missed out on Logo, huge in the 80s, which was lowkey a (kid friendly!) version of Lisp and featured turtle graphics, helping kids think about geometry via a drawing "turtle"
  • I feel like Java hit me at my peak learnability so I'm always surprised when it's considered so daunting. (Admittedly I kept using it in its friendly "Processing" form, and ducked out when the syntax started getting weird and Template-y)
  • It took a weirdly long time for C++ to standardize its libraries for even basic input and output.
  • I think they skipped over Perl? Probably its obliquely referenced in the "Historically Important Row" with the O'Reilly Camel. For me it was critical for learning things like maps and regexes when all I had had was BASIC and C... then it became my goto for dynamic stuff on websites I made, til PHP came around. (And I was started to learn that Perl was actually a wrapper script for all this Unix-C stuff... really weird given how smoothly it handled memory and strings and how its hodge podge syntax was the only hint to its frankenstein nature...)

Still, I don't have a love of learning a language for its own sake, like for keeping the brain flexible about syntax, say. I just want to build interactions and so there are more important problems at hand!

Tuesday, September 6, 2022

the dataLayer, and using local storage for cross-tab communication

 Just the other week I started looking more closely at the "dataLayer" - it's a standard variable off of window that Google Analytics uses to let processes record analytics events.

It seems like a strange way to do an API, especially since the data doesn't need to have identical structures, and it's just a big array like object you push on to. But it seems to be kinda standard in the industry thanks to the prevalence of Google Analytics.

In other learnings, I was impressed by the results my company was getting using localStorage to communicate some state across tabs/windows, in React the setup was something like 

  useEffect(() => {

    updateFromLocalStorageData();

    const storageListener = (e: StorageEvent) => {

      if (e.key === KEY_FOR_DATA) {

        updateFromLocalStorageData();

      }

    };

    window.addEventListener('storage', storageListener);

    // deregister event listener on re-render

    return () => {

      window.removeEventListener('storage', storageListener);

    };

  }, []);


using shortcuts to open google doc in app right from ios homescreen

Melissa was psyched to figure find this out on her own - we use a shared google doc for a shopping list, and she wanted a link right it from her iPhone homescreen.

The steps, taken from apple.stackexchange.com/questions/285696/create-google-sheets-shortcut-in-homescreen, are:

  • Open the document in GoogleDocs app on your iPhone.
  • Tap the three dots in the top corner
  • Share & export
  • Copy link
  • Leave the GoogleDocs app and open Shortcuts app
  • Create Shortcut
  • Add Action
  • Search for Safari
  • Open URLs
  • Tap the little gray field that says URL
  • Type googledocs://
  • Tap and paste (the link you copied from GoogleDocs). The result will look something like http://googledocs://https://docs.google.com/document/d/bunch-of-random-characters
  • Tap where it says “New Shortcut” at the top in big bold letters and name the shortcut
  • Tap the three dots
  • You can change the icon (the gray square with the magic wand in it) to what you want and give it a shortcut name.
  • Tap Add to Home Screen
  • Add
  • Done
  • Done/Next
Pretty keen!

The Daring Fireball's The Talk Show had Rosemary Orchard on talking about her book Take Control of Shortcuts, and she says there are tons of things to automate. I'm not sure if it's my lack of imagination, the way I am pretty good at building tools for my own workflows, or a distrust of formalizing activities that sometimes ned flexibility, but I have trouble thinking of more I'd like to do for myself, on either phone or laptop...

Tuesday, August 30, 2022

i can has :has?

 Man, the new :has pseudo-class sounds pretty great! Unfortunately browser coverage is poor. Still the ability to do a query based on the children in it, like 

figure:has(figcaption) {

  background: white;

  padding: 0.6rem;

}

seems awesome

Somehow it reminds me of James while John had had had had had had had had had had had a better effect on the teacher....

Monday, August 29, 2022

iOS tip of the day: view JUST photos or JUST videos in Photos app on iPhone

TL/DR: iOS Photo Albums have a "..." menu item including "Filter" for "Videos","Photos","Edited", and and "Favorites"

I've been doing 1 Second Everyday for years now, so I impulsively take a lot of quick snippet video footage - but when I'm browsing for post-worthy photos on my phone, I don't really want to see all the videos.

I assumed this would be accomplished via some kind of smart folder or album, but according to r/ios the best path is to just use the filter under the "..." menu that each album holds. A little fiddly but good enough,

Thursday, August 25, 2022

cheaters never prosper but sometimes we have more fun at wordle

 So, Spoilers for Aug 25's Wordle....

Here was my share:

Wordle 432 4/6
⬜⬜⬜⬜⬜
⬜⬜🟩⬜⬜
🟩🟩🟩⬜⬜
🟩🟩🟩🟩🟩

So had the first 3 letters... and knew I had all the vowels after step 2... but I wasn't seeing the answer and running all the permutations seemed tiresome, so I hopped over to jsitor (better than codepen as a js sandbox I think) and came up with

const letters = 'qwopfghjlzxcvbnm';
letters.split('').forEach(a=>{letters.split('').forEach(b=>console.log(`clo${a}${b}`))});

Yeah, the answer was "clown". Darn w-blends :-D I knew it as soon as I saw the second entry "cloqw"

Definitely not as cheat-y as going to a specialized website or even using /usr/dict/words , and actually I prefer a little programming exercise to gutting it out when the answer isn't showing up for me.

Thursday, August 18, 2022

give 'em the hook

 In one of those - am I being smarter or dumber than the person whose code I'm looking at, I was examining a big custom hook, and trying to figure out why it was a hook and not just a function. I was stackoverflowing react custom hooks vs normal functions, what is the difference and found a pretty good video about hooks in general, and making a case they can be a worthwhile layer for business logic apart from the UI:

Monday, August 15, 2022

the blind helping the blind

THE HIDDEN HISTORY OF SCREEN READERS ("For decades, blind programmers have been creating the tools their community needs")

Great read, especially for learning about JAWS vs NVDA.

For me, cognition is so entwined with vision, which in turn is entangled with how I approach programming, that it's daunting to consider a life not laid out on a 2D surface I can quickly skim...

Friday, August 12, 2022

the old palm, the new palm

 I loved my old Palm Pilot - I never had a Handspring Visor (and kind of disliked the design of them) but man, was it ahead of its time...

Great video. Also check out CloudPilotEmu for some impressive in-browser emulation.

websites for decades

 Nice post on what it takes to run a fansite across decades.

I've been running the Blender of Love since the mid-90s. It's now a bit of a zombie but still gets the occasional new piece... and my blog has been going since the last days of the year Y2K. But I've sort of lost my audience. And like I don't even know if being less mobile friendly has hurt my google juice..but I've never been about that life anyway.

"simplify simplify simplify" - should that be just "simplify"

How to OVER Engineer a Website... I really need to get better at deploying personal projects beyond just uploading stuff to by VPS...     

Wednesday, August 3, 2022

the swagger of the right apps and the right interface

Admittedly, this probably reflects a bit of a "slow season" for my devblog (not that I have much of a permanent audience base), but I just want to pontificate more on the apps I use for my personal information management, and wouldn't even mind hearing from others (kirkjerk at gmail dot com)

Recently I wrote about switching the core of my task tracking from 2Do (iOS + Mac, but the synching via dropbox was spotty at best) to the app Tot. Besides the superior synching between laptop and phone, I'm really appreciating the "freeform" aspect a text-ish document offers for sublists and task order. 2Do was special in presenting color-coded categories for tasks, and having contents of all categories viewable in a single scrolling list, but didn't have great facility for manually reordering a list or easily changing creating and changing and reordering categories. I do plan to continue using it for recurring and due-date based tasks.

The temptation to hunt for "one app to rule them all" is great, but I think there's much to be said for different apps for different kinds of information recording. Besides different apps having various strengths and weaknesses, the visual differences between apps aids in mental "muscle memory". (I think this was why Steve Jobs was fond of textures in apps, like that provided by skeuomorphism - it adds a flavor, or mental hook, to raw information)

Like when the app gets just the right fit, it has almost a certain swagger for me (albeit... the nerdiest possible kind of swagger). That's amplified somehow by having open windows across my three screens at my home office, and switching between them w/ keyboard controls.

Apple Notes: love this for work notes. I think it synchs well, to devices  and you can embed images and what not. Somehow I don't have a good feeling about Apple managing my data as a forever home, but work notes is generally not needed on that kind of scale.

Simplenote: excellent synching and search, and cool in a minimalist text-only way. This is sort of my catchall, and my using the text string FINDME as a casual tag, I've stopped trying to keep it at all sorted... it really akin to a big pile of stickies. ("Bear" was another similar app with more of a focus on markdown text)

Tot: as mentioned great for my main Todos, with its 6 extra notes used for various "To Get Tos" (music to get, books to check out, movies and shows to watch, games to play, etc)

2Do: Still like this for recurring todos, daily or weekly tasks or other time sensitive stuff. (Appigo Todo was pretty good as well, but didn't have as rich a sense of categories.) The free synching via Dropbox always felt slow, so I didn't keep using the desktop client for it.

Apple + Google Calendar: Google seems to be the easiest way to share a calendar - huge in a relationship. And I can import work's Outlook Calendar into it as well

k/db: this is a weird little homebrew database I made for keeping track of stuff like "media I've consumed" and "old coworkers"

But it's funny even with all these systems I always know what's what and where to go to look for stuff.



Saturday, July 23, 2022

todo'ing better

I was listening to a podcast with Oliver Burkeman, about time management.

While has some suggestions for "todo lists", his main point is more existential; that it is folly to hope you'll get to do all the things you'd like to in life, and maybe misery to try. (The faint and somewhat bitter silver lining to that is "maybe it's the finitude of life that gives our choices value". I'm a little suspicious that's just sour grapes.)

He also makes some good (if oft made) points about procrastination and distraction; most of us look to distractions to divert us from the emotional discomfort of the task at hand. (I know for me it's "this task is either tedious or challenging of my ego".)

But that all this is kind of a tangential framing to my main point, that I'm pysyched about my plans to switch my Todo systems up a bit.

Even back in 2006 I was cataloging systems I was dabbling with: PalmPilot, stickies and a spindle, small text files, whiteboard, graph-paper-sheet-a-day,etc.

For a number of year I've been happy with the app "2Do". It did a great job with two things a lot of similar check list apps lack: finegrained recurring events (like being able to specify if something is due every X days, like a bill, or if it's to be done Y days after you last did it, like a haircut) and then categorizing todos, but having the todos for all categories on a single big list, scrollable and so entirely viewable without clicking.

(I supplemented that with a homebrew daily chore list webapp I made, so that the daily grind wasn't blocking the other stuff so much.)

But 2Do had poor syncing (I shelled out for the pricey desktop version, but the syncing was surprisingly meh) and "tap to mark done" isn't THAT viscerally satisfying.

I think I will swing over to using the app Tot. It's a curiously minimal (but reliably syncing across iOS and MacOS, as is Simplenote) set of 7 color coded notes that I've been using to track music to get and shows to watch for a while.

I think having it always at hand on desktop or handheld will help, and that free form text will flow stuff more naturally in and out of other apps.

I might stick to 2Do for the repeating stuff (and maybe move the daily grind stuff back into it, so that I'm checking into 2 apps rather than 3...)

But I'm psyched about this. I've felt dissatisfied with my Todo system for a long while. (Also if you see a lot of random content on my blog and FB, that's why, I'm clearing the deck of old "Oh I should blog that" Todos...)

Friday, July 22, 2022

tweet-size coding

 

I'm not going to do the same deep dive breakdown I did of this p5 code last year - and honestly it's not quite as impressive, but I like how this tweetsize p5 uses arithmetic for a nice visualization:
t=0
draw=_=>{
t+=1
s=48
createCanvas(w=432,w)
background(0)
strokeWeight(2)
colorMode(HSB,99)
f=0
for(c=0;c0)line(c+i,r,c+i,r+s)
else
line(c,r+i,c+s,r+i)
}
}
}
//#p5t #぀ぢやきProcessing

Tuesday, July 19, 2022

startling tech

I was thinking about what technologies really startled me, in a "they an do that now?" sense.

A very incomplete list, in rough chronological order:
  • Google. It snuck up on me as the fallback search for Yahoo back in the day. When I realized it did a much better job of searching my site than my own homebrew search functions... and it was doing that for, like, every site on the web?
  • iPod. Again, a matter of scale: 1,000 songs in your pocket is just amazing.
  • Youtube. Yet another bit of astonishment at the scale of it. Hosting that much video for free was just mind blowing.
  • Google Maps. This was a minor thing, but the navigation it provided in browser, these large seamless draggable and zoomable tiles... amazing
  • On-dash GPS. I remember going to the video game con "PhillyClassic" and the guy driving had one of these. What a miracle of making life easier.
  • Accurate Video Game Emulation - especially in-browser.
  • AlphaZero. I always said I would be impressed when a good chess playing program was also good at another game - like it formed its own intelligence about a game, as AlphaZero did with Go and Chess. (Now the bar is "when will the computer be BORED of playing chess")
  • GPT-3 etc text generation. The "Ghostwriter" segment of The Ghost in the Machine episode of This American Life just blew me away... and you can find instances of it online. The ability to generate text that seems to have a point of view.
  • DALL-E etc art generation. Boy O Boy. Making illustrations from arbitary text prompts...
Those last 3... man.

One model of intelligence is that it's all metaphors and connections. And computers are really getting there.

I think the future of creative and information based jobs will be learning how to harness these kind of forces. And that's a little scary- both from a "future of work" standpoint, and also because so far I'm not sure if the machines will get better at showing their work, explaining their reasoning... (and right now they sometimes exhibit the racism etc implicit in their training data sets...)




tracking the trackers

 So, having to track down some weird issues with Google Analytics I learned about the tracker-trackers GTM/GA Debugger and Omnibug chrome extensions. Omnibug feels a little friendlier.

Friday, July 15, 2022

focus on screenreaders

Deque U's  Screen Reader Keyboard Shortcuts and Gestures.

It's easy for a dev to forget that just because you made your forms tab-navigable and keyboard friendly, your overall content might not be great for screenreaders: at a minimum screenreaders have keyboard controls for a sense of "focus" of what's being read, not just what is interactable. (Also many folks using assistive technology will use the "rotor" (which I wrote about a few years ago) which is why it's important to get your Heading elements etc in a decent hierarchy. 

Saturday, July 9, 2022

summer breaks

 Hola, amigos. It's been a long time since I rapped at ya but...

(For some reason whenever I'm getting back into something, I think of the traditional intro for Jim Anchower editoirials on "The Onion")

So I don't purposefully have a "summer break" mode, but that seems to be what's happening for a few activities... far fewer blog entries here, less new music acquired, fewer photos taken, fewer books read. I'm not quite sure why.

One probably minor aspect has been a bunch of work needed for my Porchfest websites. One of the most glamorous is Fenway Porchfest.

They're one of the ones that request a printable version, plus they have tons of sponsor/site host logos and what not. I find it easiest to do it via Print Design in the Browser -- you can see the outside and inside of the trifold pamphlet and then I take a screenshot. Definitely some compromises, but it syncs better and with less manual labor than a pure "in Illustrator" or whatever version (though some parts of it are images)

outside
 
inside

It's kind of nice to be able to tweak things by hand, not worry about responsive design etc...



Friday, July 1, 2022

quick reminder to self: how to sort array by a field in the map-ish objects in php

Just one of those small things I was surprised I hadn't already noted on my devblog, in PHP, to sort an array of objects / array of maps, based on a field in all the maps, it's the usort command which works in place on the array, and with the second argument being (weirdly) a string version of the function name:

    usort($allresponses,"sortOnFirstField");

     function sortOnFirstField($a,$b) {

        global $firstkey;

        return strcmp($a[$firstkey],$b[$firstkey]);

    }

The weirdness of using a stringname... definitely oldschool. Javascript is obviously a bit slicker, though I still appreciate how PHP splits the differences with globals that I have to use instead... (YES you can use them, but also YES you have to acknowledge that you are using on in a function)


Oh and while I am at it, replace special characters etc in a string:

function clean($string) {

   $string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens.

   return preg_replace('/[^A-Za-z0-9\-]/', '', $string); // Removes special chars.

}

Thursday, June 30, 2022

what's new in js

Heh, you know there are two things that tend to clog up my inbox (because I get stressed out and/or feeling like I should get to it later, but then it just sits) -recruiter contacts and Javascript newsletters.

My favorite of the latter are Frontend Focus and Javascript Weekly.

Here's some stuff that came up:

What's new in the 2022 ECMAscript standard...

Object vs Map. The thing is, I'm not sure devs are really willing to give up their syntatic sugar! I think that's why JS + JSON have been so killer, the concise syntax letting you put together arrays an objects with a minimum of fuss...

Defensive CSS seems pretty good and well-presented.

Tuesday, June 28, 2022

making pill tracking sheets in php

Our poor kitty Dean has a touch of small cell lymphoma (on top of his asthma) and his pill schedule has gotten pretty complicated! I decided to make a simple tool kirk.is/tools/pills/ that lets me (or anyone) make a printable pill schedule grid, ala:

(You can see Dean's full grid here)...

Like my recent quickpoll program, I decided to both keep it as pure PHP as well as relying a rather too geeky by half text-based format for the pill descriptors, each pill name can be followed by an @ sign to say how often (e.g. 2 for every other day, 3 for every third day, etc) and then a + sign and an offset for how many days forward):

everyday pill
every other day pill@2
every week pill@7
every 2 week pill, start in 5 days@14+5

I think I really need to build myself a generic form builder, while this text-block based stuff is cool in a minimalist way (and lets you copy and paste almost all the data in one fell swoop) it's not user friendly...

Anyway, other minor bits of cleverness is setting up the page to submit to itself via GET, so it's always bookmarkable, as well as using CSS media queries so when you print it's just the grid.

Thursday, June 23, 2022

worst java interviewee ever

In 2005 I posted this on my blog, quoted here for posterity:

A friend gave me a photocopy of a worksheet from a programmer job interview, the contents of which I'm transcribing here. Probably the worst interviewee experience I've seen. I've tried to be reasonably fair; arguably I should could be generous and use * in place of ·, since this was handwritten, but given all the absolute conceptual failures and mental disconnects, I'm leaving it as is.

So the interview "challenge" was to write a factorial function. Now, I don't know exactly how well or poorly the problem was described by the interviewer, but given the first line, probably copied from a whiteboard, I'm assuming it was pretty straightforward. Here's what the sheet had on it...most of the strikes are circular scribble-outs:

5! = 1·2·3·4·5

public string access(string 5! a)

{

  string

    string b = a.substring(0,1);

   string

    Int int c = b String.getValue(b);

    if(c < 2){

      System.System.err.println("1");

    } else if (c < 3){

      System.err.println("1·2");

    } else if (c < 4){

      System.err.println("1·2·3");

    }

For someone aspiring to a Java development position, and who must've sounded at least possibly decent on the phonescreen...supposedly the person has multiple masters degrees in science-y and computer-science-y fields, both from good local Universities.

For the non-techies on my blog I summarized the issues like this:

1. Returning a string? Already something seems a bit amiss.

2. Why name a function like this "access"?

3. Passing "5!" as a a variable name, even though struck out, is a telling mixup of variable name and content.

4. More string oddness. These two lines seem to indicate he's just trying to parse the first character of the String passed in to an int, ignoring the rest.

5. To the right of "c -", there's NOTHING about Integers...I'm willing to give him a pass in terms of specific function name (Integer.valueOf(String) would have "worked" as a replacement for String.getValue(String)) but he's not even in the ballpark.

6. The use of "if"s here, 3 conditional cases, is just an astounding example of misthink. Logically, only Strings starting with 0-3 will produce any output, and even then if it's a "one digit string" of the values 1-3 could this logic conceivably "work".

7. Finally, the use of "System.err" rather than "System.out" is just... well, wrong. Or maybe so right, a subtle bit of self-commenting on the error-ridden code...

An even half-way decent programmer when given this problem would likely think for a moment and then say "do you care if it's solved recursively or iteratively"? (With the latter being the better bet, performance wise, but that's a small issue). Also, this is kind of an "academic" problem, and the guy seemed to have a strong academic background...besides talking a *great* game about all the latest technologies, and getting some complex stuff about J2EE right. It's just really odd.




Wednesday, June 22, 2022

neumorphism we hardly knew ya

The rise and fall of neumorphism Hm. Never really got into it. I sorta like the way it looked, tho… but understand a11y issues are there. Also, I gotta think, plain old flat design is just easy to make :smile:

Thursday, June 16, 2022

ie, prounced "AIIIIIEEEEE!"

A not too fond farewell to IE, most unlikely member of the "27 Club".

It did have a good feel relative to Netscape when it first came out.

the desktop catchall

I'm looking forward to trying out MacOS's Stage Manager - even though I'm notably a little conservative about my daily driver UI, this seems like an interesting blend of what I used to prefer about the old Windows taskbar vs the MacOS Dock - that thinking in terms of "open windows" vs apps still makes a lot of sense to me.

One complaint from some people trying it is anything on the Desktop is hidden...

People. It's 2022. Stop using your Desktop as a big cluttered workspace!

(My life improved when I switched Mac to use ~/Download for ALL my temp workspace needs, especially AirDrop stuff. This alongside my even longer term pattern of using ~/data for all my personal data that I care about in the long term, rather than ~/Documents or whatever idiosyncratic local folder an app would prefer to use.)

still juicy after all these years


Sigh, I remember how I was the strong company advocate for "Juicy" UI... but I feel like they heyday for that was a decade ago. And it was a simpler thing back in the pre-Angular, pre-React days.... declarative programming is great, but its focus is on having the screen represent whatever structure in memory you have as efficiently as possible. It doesn't have as rich a language for how you get there... gradual transitions to that state are possible with CSS animation, but I don't think that's as expressive a paradigm as setting up animations in bad old jQuery.

So it was nice to see Daring Fireball link to The World's Most Satisfying Checkbox.

Of course juiciness is still around... I think of the Material UI Button that has a pleasing little sonar-looking ping spreading outward from wherever exactly the click or tap happened.

Still, it's not the priority it was. I mean sometimes transitions are nice for visual and mental continuity from one state to another, but mostly it's just fast, fast, fast. (Of course having to design for mobile without hover sensing, devices with possibly slow animation rates, and variable network times are other reasons most designers are not "Juicy first")

Tuesday, June 7, 2022

announced at wwdc

WWDC Recap - many things!

My two biggest takeaways: (having just skimmed it to be honest)

1. the "iPad has proper windows" things is hugely radical. I think more than anything, that has been what made a tablet feel different from a laptop (other than keyboard vs touch, I mean) The iPad really made its mark by being a supreme singletasker; taking the original "fondleslab" idea of smartphones that the iPhone established into a larger device, with the central metaphor that the machine BECOMES the app running on it, in a UX-meaningful way. Getting rid of that... boy is it a step. Like I imagine from a dev PoV, now they have to worry about different window sizes? (unless they just keep the landscape/portrait sizes consistent and scale as needed, I haven't investigated)

Like I'm not sure I like the change conceptually. But maybe the tablet was in a rut. My iPad is: 

  • an ebook reader
  • a light web-browser
  • a platform for this one drawing game I've been doing for years (DrawSomething)
  • a very occasional second touch screen for my mac
  • a more frequent "Find My" launcher to find my iPhone
and I'm not sure I would ever use it for more than that tbh - the old critique of "ipd is for consumption, laptop is for creation" is somewhat true. Maybe windowing will be a meaningful way of getting beyond that... but for now I'm sticking with laptops.

2. "customize your lock screen" (especially the font of the clock). Wow. This is lowkey one of the most-un-Apple things I've seen. I didn't realize how consistent a locked iPhone looked - how much identity it had - til i saw these samples of the alternate fonts etc, which hit my eyes as "oh that's android" ...and when I think about one friend of mine who changed the system font of her android phone to be serif... every screenshot I see makes me cringe a little. I mean it's the classic "Apple tries to prevent you from doing things in poor aesthetic taste" thing I'm wondering about.

form tag considered harmful

 Paul Ford asks The ‘Form’ Element Created the Modern Web. Was It a Big Mistake?

As anyone who has investigated the Windows control panels can tell you, there’s a lot of decades-old code in our systems. If people evolved like technology, you’d be 6,000 lizards, 30 chimps, and a couple Neanderthals all glued together with an anguished human face stretched across it as a “visual refresh.”

Hot take and interesting to ponder, but... well, the web as a "read-only-medium". Like that's half of what separated it  from gopher and ftp back in the day- one part was embedded links, but the other part was that potential for interaction...

Monday, June 6, 2022

minimalist polling ala doodle (and weirdness with mobile vs desktop views)

 I used to like Doodle polls, but it seems like lately they've been making things more complicated - the UI for coming in and indicating availability is just uglier than it used to be:


It used to always provide a simpler list of checkboxes, not this Outlook-wanna-be week view...especially horrible because if you're offering times for the next week, those options are even currently visible

Oh, update! I making screen shots I found out the old view still exists! It's just there at tablet and phone lists...


Well that's annoying! I guess I get the idea that desktop is somehow a "power user" mode? But for a damn "what day of the week should we meet" poll, it's way overkill. 

There are some other annoyances, like - it puts the organizer in as all green for dates, which isn't a good assumption for my purposes - sometimes I am setting up a band rehearsal I may not be able to attend.  And it asks for email just to add a response, which is obnoxious. And it doesn't make it easy for anyone but the organizer to see/share the responses so far.

That said, there are things I like about it - the "click once to say yes, click again to say 'if need be' is kind of clever" (I think people find it easy to use once it is pointed out to them). And I think it uses local storage or what not to allow responders to change their response, at least from the same device.

Still, I got an itch to try rolling my own - a very minimalist setup. I think I overshot on the minimalism, to be honest, but it is a usable first draft, and I might build an update to correct it.

The first minimalist choice was using barebones PHP and zero javascript. I admit some of that's driven by what's easiest to deploy right now on the VPS I rent. 

I think the most interesting (and probably regrettable) short cut was making an ad hoc, text-based format for defining a poll:

The first character on the line defines the entry type - in fact you can copy and paste that block into the textarea

! Heading
. Basic Text or Caption
_ Caption for Brief Text
@ Caption for Yes/Maybe/No
# Caption for Checkbox

It's kind of a nifty idea, but obviously limited. Like right now you can't say "this field is required" (which I learned the hard way would have been nice as I see people putting in "when I can meet" entries without putting in their name), and I do have visions of letting you ask questions with custom radio button responses. 

But it was easier than making a whole question builder UI right out of the gate! And I like that you could just copy and paste in a whole poll to reuse it. 

I simplified some things too much in implementation as well....like I decided to use the caption itself as a unique key, which led to datacleaning headaches. 

Anyway, the UI for responding was minimalist but clear:
Similar for viewing the results:
Ugh, not having name be mandatory is frustrating. 

I wanted "clean" URLs, but I didn't want to to URL rewriting, so I made it so the root index.php file either displayed the homepage/create a poll or a specific poll, like https://kirk.is/quickpoll/?id=########## and then had subfolders for the main verbs, so stuff like https://kirk.is/quickpoll/results/?id=######### worked.

Anyway, a good usable proof of concept. 







Wednesday, June 1, 2022

fenway porchfest billboard

Surprised I missed writing this up before, but in 2018 Fenway Porchfest asked me to make up a digital movie for display on an electronic billboard facing Fenway Park... pieces slid in to form this:

Here's how the 2018 flavor looked over Lansdowne: 

Most of the visual ideas were by Katie L. who worked with me the first year.

I built a p5 canvas app to move the elements, with an option to download all the frames (I had to crank the framerate down, even on a fast machine it was skipping frame numbers...) I then used FFmpeg (after having to fiddle with the Mac security settings) to glue the frames together as an mp4:

./ffmpeg -i billboard%04d.png output.mp4

did the trick

Wednesday, May 25, 2022

lots to know

Man, the footprint of basic HTML/CSS is getting kind of big! Actually that's a link to new/upcoming stuff. Which has the additional question of if it's safe to use yet...     

Friday, May 20, 2022

breakpoints breaking? remember: mobile first

I was refactoring a component (a complex two-box search that was a horizontal layout on desktop but stacked vertically on mobile) to be more responsive, vs more or less reactive; an earlier rendition basically had the whole component encoded in React twice, one for small devices one for large.

I was using a mix of 

@media screen and (min-width: 768px) {

and

@media screen and (max-width: 768px) {

because somethings made more sense to my head as "think of the vertical case, then horizontal is the special case" and other time the opposite. 

Well, predictably, that works fine in 99.9% of cases, but at the exact breakpoint of 768px, you are at risk for getting an ugly incompatible mix of layout behaviors. 

I guess the answer is to pick one direction and stick with it. On my project, that's generally "min-width". But how to remember and get it straight to my head? Easier: MOBILE FIRST. Literally. Code the mobile version then have mix-width breakpoints let the desktop-ness burst forth to modify it. That's a little annoying when Desktop is using more of the "defaults" for styles but that's a small price to pay for consistency and not having ambiguous breakpoints.

Thursday, May 19, 2022

nicer looking cancel / clear button on search input

There's a King Missile song "Take Stuff from Work" that starts

Take stuff from work

It's the best way to feel better about your job

Well, today I taking this little "clear/cancel search" icon button. When you have an input type="search" you get a little X icon to undo the text (very useful on mobile):

but at work we want it to look like thi


Here's some code for that...

   input[type='search']::-webkit-search-cancel-button {

    position: relative;

    right: -10px;

    height: 35px;

    width: 35px;

    background: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj4KICAgIDxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGc+CiAgICAgICAgICAgIDxnPgogICAgICAgICAgICAgICAgPGc+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTAgMEwzMiAwIDMyIDMyIDAgMzJ6IiBvcGFjaXR5PSIuODciIHRyYW5zZm9ybT0idHJhbnNsYXRlKC04MTggLTExNjEpIHRyYW5zbGF0ZSg1MTUgMTAwMykgdHJhbnNsYXRlKDMwMyAxNTgpIi8+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD0iIzc1NzU3NSIgZD0iTTE2IDIuNjY3QzguNjI3IDIuNjY3IDIuNjY3IDguNjI3IDIuNjY3IDE2UzguNjI3IDI5LjMzMyAxNiAyOS4zMzMgMjkuMzMzIDIzLjM3MyAyOS4zMzMgMTYgMjMuMzczIDIuNjY3IDE2IDIuNjY3em01LjczMyAxOS4wNjZjLS41Mi41Mi0xLjM2LjUyLTEuODggMEwxNiAxNy44OGwtMy44NTMgMy44NTNjLS41Mi41Mi0xLjM2LjUyLTEuODggMC0uNTItLjUyLS41Mi0xLjM2IDAtMS44OEwxNC4xMiAxNmwtMy44NTMtMy44NTNjLS41Mi0uNTItLjUyLTEuMzYgMC0xLjg4LjUyLS41MiAxLjM2LS41MiAxLjg4IDBMMTYgMTQuMTJsMy44NTMtMy44NTNjLjUyLS41MiAxLjM2LS41MiAxLjg4IDAgLjUyLjUyLjUyIDEuMzYgMCAxLjg4TDE3Ljg4IDE2bDMuODUzIDMuODUzYy41MDcuNTA3LjUwNyAxLjM2IDAgMS44OHoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC04MTggLTExNjEpIHRyYW5zbGF0ZSg1MTUgMTAwMykgdHJhbnNsYXRlKDMwMyAxNTgpIi8+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPgo=)

      no-repeat left center;

    background-size: contain;

    -webkit-appearance: none;

  }


Wednesday, May 11, 2022

musicians type the darndest things

One thing I've learned from doing websites for Porchfests is that musicians are going to push any input assumption you might think of. Ask them to put choose a genre for themselves with a small input box, and you might get something like "indie surf dad-rock with nu-wave techno emo edge". Give them a small textfield to describe themselves and you might get 3 paragraphs of their press release.

In the case of Somerville Porchfest, it was decided it could do more to encourage people to support the musicians, so a tipjar field to solicit donations was added. Whoever setup the form did this prompt:

Place a link to fundraising or music download site.
 
So a lot of musicians dutifully entered wellformed links beginning with "http" - and honestly I don't blame the ones who just put in a url without the http, that would be a pretty geeky ask, but the pile of non-http-starting "links" looked like this: (blatantly non-link/site things bolded)

thesestainsarewhoiam.bandcamp.com
instagram.com/bigravband
plumesplumesplumes.bandcamp.com
venmo@Todd-Bleckley
www.venmo.com/Kenneth-Lafler
missbones.bandcamp.com
jefczekaj.bandcamp.com
Venmo: @Melissa-Nilles
connorstorms.bandcamp.com
by dancing!
Just go to Ball Square Fine Wines and pick us up a six pack if you must, we're not picky
Venmo @JennyJuggler
Venmo @Andre-LaPan
Don't encourage us
www.venmo.com/Jeff-Jam-1
Doublelibra.Bandcamp.com
ensmb.bandcamp.com
TBA
@cyclopolitan on Venmo
birdlanguagema.bandcamp.com

So I needed a heuristic to translate these into URLs (like by slapping https:// on the front) if they seemed like a URL, or to a venmo link if they looked like a venmo thing (but we had a few patterns for that, including Venmo URLs and then cyclopolitan who put the phrase "on Venmo" after). For everything else, I made up a system to alert() the text they entered.

Long story short here's what I came up with:
  function mungeSupportLink(info){
    if(! info) return;
    if(info.toLowerCase().includes('venmo') && info.includes('@')) {
        const regExp = /\@(\S*)(.*?)$/;
        const matches = regExp.exec(info);
        if(matches) {
            const username = matches[1];
            return `https://account.venmo.com/u/${username}`;
        } else {
            console.log(matches,'for',info)   
        }
    }
    if(! info.includes(' ') && info.includes('.')) return `https://${info}`;
    return info;
}

The non-URL venmo links all had a "@" in them, so I used a regex to isolate the username (assuming non-whitespace usernames, especially important for "@cyclopolitan on Venmo").

For the non venmo stuff, I figured the URLs didn't have spaces (I already trim()d them) but WOULD have at least a "." subdomain separator, and if not we just return it as is for inclusion as an alert...

adieu ipod adieu

Daring Fireball reported on the farewell of the iPod Touch. I remember being blown away by how slender the first generation was - like Gruber says, it was hot on the heels of the first iPhone, but the thinness of the iPhone-minus-the-phone-part was a glimpse of the future of Apple form factors: in 2007 it was astonishing that a capable web browser could work on the thing.

Of course this closes the door on the iPod in general. I write about getting one in 2004 - ripping my supply of CDs into my own library actually kept me stuck with Apple ever since. (And I still don't quite get the appeal of streaming... owning music, but selecting it by the single song, is musical nirvana to me.)

But my favorite was the iPod Nano I bought in 2007, product shot shown here.

It was such a perfect minimalist piece of hardware... just thick enough to fit a headphone jack, that terrifically satisfying scrollwheel, and a nice little screen to help with navigation.

(Every once in a while I get the urge to try to be less online, go back to the less-connected time before the iPhone, maybe go back to the simplicity of a PalmPilot... But at the very least my pockets would be full of an iPod, a camera, a PDA, a regular cellphone... not to mention needing a GPS for my car...so just wishful thinking.)


Tuesday, May 10, 2022

scrolling so an item is halfway up the screen

Once again I helped the Somerville Porchfest with a mobile-friendly, light-on-the-server version of their map for the big - you can see the 2022 Design Here.

The current design was based on work from the "Stay at Home" Somerville Couchfest 2020 - not sure  what web designer did the core work but it was much more visually appealing than what we had in 2019 and so we carried it forward to 2021, a nice card-based design.

One request was to make the map bigger. Treating it as "sticky" worked pretty well, so I made it so it was always half the height of the window. I think the resulting design scales pretty well to both desktop and mobile:


There was also a request that when the user clicked on a porch on the map, it should show the band below, since it's the band card that would have the photo I was worried how to make that work - there's already a filter for the name and genres, but treating it as "just another filter" and hiding all the OTHER band cards might just be weird. So I thought I would highlight the corresponding band card with a color, and scroll to it.

 But because the map is perma-pinned to the top half , Element.scrollIntoView() didn't quite work - it didn't take the "sticky header" map into account and so scrolled up behind it. 

Here's the code I ended up with:

    const bandblock = document.getElementById(`bandblock${bandid}`)
    bandblock.classList.add('open');
    const elementRect = bandblock.getBoundingClientRect();
    const absoluteElementTop = elementRect.top + window.pageYOffset;
    const middle = absoluteElementTop - (window.innerHeight / 2);
    window.scrollTo({ top: middle - 20,left: 0, behavior: 'smooth'});

 The DOM element has an id based on the bandid, I added an "open" class to color it, then I do a little math to figure out the top of the element and use a smooth scroll to place it just a little lower than half way down.

 



Monday, May 9, 2022

dot dot dot

 Heh, you know, every once in a while to think about some of the "new" basics stuff in JS, like rest vs spread...

Wednesday, May 4, 2022

HELLO Hello hello from the echo chamber...

I always appreciate pieces that argue things I intuitively believe like You Don’t Need A UI Framework.

(And to keep up the high-risk-of-people thinking I'm a caveman stuck in the early-2000s - The Appeal of Using Plain HTML Pages. I admit I sort of play around this realm, albeit without the brutalist look, with my Porchfest sites - I mean PHP and also Static Builders are adjacent to this kind of thinking. (Like recently I had to change Fenway Porchfest's sites from being .html to .php when they asked for the header to be placed on all the pages...))

Monday, May 2, 2022

peering into "the algorithm"

 It's interesting thinking about various ways of ordering posts - Gizmodo has been releasing some documents from Facebook as they ponder how their own sausage is made...

I'm not sure what the ideal algorithm would be. Part of me wants to say the secret is to empower users to say "show me everything from this group of people I select" but I wonder if that violates Zach Holman's admonition of Don't Give Your Users Shit Work, i.e. make them go through a big manual winnowing and curating process. 

Still, it's frustrating that it's the most trivial crap I post (or that is to say repost from other source like tumblr) that gets the most feedback, and I'm not sure how much of that is the "fault" of my friends, the algorithm, or maybe a snowball effect where the algorithm noticed early positive response to shallow stuff and then focuses on putting that stuff in front of other people, with a "rich get richer, poor get poorer" amplification effect...

Friday, April 29, 2022

note to self: leaflet

this post explains how to get leaflet to show your current location:

function onLocationFound(e) {

  var radius = e.accuracy / 2;

  L.marker(e.latlng).addTo(map)

    .bindPopup("You are within " + radius + " meters from this point").openPopup();

  L.circle(e.latlng, radius).addTo(map);

}


map.on('locationfound', onLocationFound);

map.locate({setView: true, watch: true, maxZoom: 8})

john coltrane and visualizing music theory

A new coworker mentioned how the idea of state machines really resonated for him, he liked to build interactive things out of them, and played around with XState. I was able to remember how important going formal was as I used a state machine for an browser/server card game port I made early in quarantine, though I mostly just used switch/case statements.

My coworker followed it up with this tweet about a state machine describing John Coltrane's Giant Steps... fun to see and listen to!

I'm not smart or patient enough to really get intellectual jazz but it's hard not to admire John Coltrane - so much deep theory based music can be kind of sterile, but he manages to still bridge to even casual audiences. 

Famously he made this diagram and gave the drawing to saxophonist and professor Yusef Lateef about progressions... if you've ever taken music theory you've probably heard about this and things like the "Circle of Fifths"...


Here's a medium piece about some spinoffs, and other tangents and deep dives.

Thursday, April 21, 2022

does javascript have too many operators?

 A javascript operator search engine/browser though I guess it doesn't solve the real problem of overloading; things have gotten so busy, especially with typescript, that knowing what a { or : actually MEANS can be super-tough...

Tuesday, April 19, 2022

optimizing apple's airpods max and music settings

At the risk of further entrenching my visible Apple fanboy aspect, for my birthday I treated myself to a set of Apple Airpods Max headphones. 

I really appreciate the design and material of them - the metal and fabric is a lot more pleasant than the plastic and vinyl of other devices.

At first I was totally blown away by the power of "noise cancellation", and it is impressive, but I realized the effect was heightened as I toggled between it and "transparency mode" which I guess uses the mics to ship in EXTRA ambient noise.

So one protip is to go into Bluetooth settings and enable "Off" along with "Noise Cancellation" and Transparency, which lets 


(At least one youtube video I saw by an audiophile claims that disabling Noise Cancellation and the Noise Addition of Transparency leads to a much cleaner sound, which makes sense to me.)

If you don't find it easy to remember which sound effect represents which mode as you toggle through the effects, the phone's control volume control has a shortcut as well:


While researching that, I found another improvement to Music, especially if you don't use the Apple Music service (I agree with Steve Jobs, streaming is way overrated, it's nice to own tunes instead of rent!) - I alway thought it was obnoxious to the point of being un-Apple like to dedicate so much space to advertising:


"Listen Now" taking the most prominent spot on the icon bar at the bottom is just ridiculous... luckily there is a setting for that in "Music" in Settings, "Show Apple Music":


(I'm still nervous that Apple considers "Show Star Ratings" optional (and even then you have to go to an individual song's properties) given how important it is to how I keep my music organized... they tried to remove it from the Music app earlier but they heeded an outcry insisting on its return... and honestly, it's was my ripped and iPod-ed music collection that made me jump to iPhone and kept me from Android.)


Friday, April 15, 2022

svg optimization

SVG is an under-heralded format! The way it's text-based instead of binary, and so very embeddable, is great, plus the way it scales is just fantastic. 

Greg at work pointed me to https://jakearchibald.github.io/svgomg/ which can optimize SVGs - claims shrinking so the final result is like a quarter the size.

One gotcha with React though, if embedding it as a React component (couldn't quite get raw .svg to be included as a a component directly in storybook and Gatsby, though flavors of webpack say they do it, so we wrap it as a proper React  .tsx component file) is you have to convert attributes with hypens into camelcase - fill-opacity to fillOpacity, for example...

Thursday, April 14, 2022

resizable, draggable divs as border for exercising responsive layout

 We use storybook, and by default it shows you a canvas that is influenced by the shape needed by its children (i.e. the component you are building). You have an option to make it fullwidth, but even then it can be a little clumsy to resize the whole browser just to see your component shift.

Old school folks like maybe surprised you can trivially add a draggable corner to any div:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

The style for that is just:

overflow: auto;
resize: both;
padding: 20px;
border: 2px dashed black;
width: 348px;

(The first two being the most "intesting")

platform smell and "In fact, EJB encourages collaboration of *more than six* different parties"

 I like to think I have a fair nose for coding technologies. (Admittedly, this nose works best when the industry shares the same preferences for simplicity and transparency over "do it for you" trends) For example, I knew the JSON was going to eat XML's lunch, and that React was just a better idea than early Angular. (Heh - I just ran into my deep dive into my reservations about Angular circa 2014)

EJBs, "Enterprise JavaBeans", was kind of a darling technology around the turn of the century, on the back half of the dot com run. It was a way of conflating in-memory objects with rows in a database. (If this sounds like a recipe for stuff that just doesn't scale, you're right... as I said at the time... EJBs allow you to distribute your db across many machines, and offer performance that assures that you'll need to...)

One early example of "warning bells clanging" - this passage from a book on EJBs: (I think some version of "Mastering Enterprise JavaBeans")


That is to say:

To get an EJB deployment up and running successfully, you need more than just an application server and components. In fact, EJB encourages collaboration of more than six different parties. [emphasis theirs]

Wow. Even with the disclaimer below it that it's "not for everyone"...yikes. Reading, I think it's talking about 6 human experts, not like "6 susbsystems" or something...

Tuesday, April 12, 2022

which way to scroll

A while back I wrote the ux of scroll direction, and I was reminded of that when talking with an Apple detractor who hates that "natural" trackpad scrolling (controlling the content as if dragging on an ipad, vs moving the viewport as with a scrollbar so that "scroll down" is done by moving a body part down). And then I found this tangentially related bit on tumblr:

Sunday, April 3, 2022

inline magic space

 Heh, I was just bitten by inline magic space, where an image was having some unwanted white space right below it, and then I ran into that article about it....     

Wednesday, March 30, 2022

getting over xhtml-ish html

 Write HTML, the HTML Way (Not the XHTML Way).

That article charts the rise of stricter xhtml conventions in the 2000s. As it says:

XHTML became popular when everyone believed XML and XML derivatives were the future. “XML all the things.” For HTML, this had a profound effect: The effect that we learned to write it the XHTML way.

(and like I wrote a while back I think there are some very solid reasons JSON beat out XML that we should learn from - along with recognizing what XML did better.)

My HTML roots are old, old, old, and some "bad" habits - especially not closing <p> tags (treating it as more of a linebreak than a wrapper) and <li> still persist for me when I'm on my own. But here's my hot take: in the 90s there was a style that tended to put tag names in ALL CAPS:

<TABLE>
  <TR>
    <TH COLSPAN="2">Some Header Information</TH>
  </TR>
[...]

My unpopular opinion is, that was a better way to write HTML. It made the content (whether values of attributes, or text content) look more distinct from the tag names and attributes.

(Of course, even in the 90s that was a bit of a 70s-ish throwback look. BUT STILL!)

a more delightful react file structure

Delightful React File/Directory Structure has some good priorities.

Tuesday, March 22, 2022

everything old is new again - animated gifs and variable framerates

On a private (and left-leaning) Slack channel about current events, someone posted about the protest truckers coming down with bad coughs, and I realized I didn't have enough emoji-reactions for Schadenfreude, and that Nelson's taunting "HA-HA!" might cover it... 


I tried to upload it in Slack, but it told me it was too big - and shrinking the size of all the frames didn't fix it. Which is weird, because it seems just like 5 or 6 frames...

You can open up GIFs in Mac Preview, and even delete frames:

Looking at it, the problem becomes clear: lots of repeated frames is probably why the file size was large - 5 .1 second frames is larger than 1 .5 second frame even if the frames are identical. (I am assuming, without investigating too much.)

But even though I can delete frames, it didn't seem like I could modify the time for any given frame...

I fired up the App store and after a few false starts found "GIFQuickMaker" which for a few bucks allows more detailed GIF editing, and I ended up with 

which honestly I think has better timing than the original.

the text is almost too small when used as an emoji:

but it gets the idea across.

GIF of course is an archaic and inefficient form, but I love it - the silent films of the web 1.0, the egalitarian geek flipbook. 

But it was funny thinking about why the original Nelson GIF was so inefficient, and I realized that constant framerate is going to be the default for video clips transferred to GIF form. And, kind of akin to the PNG vs JPG difference, animated GIFs should make different assumptions when capturing simple animations. 

And I see the parallel of how "variable refresh rates" is such a hot thing for phones! Very similar thinking, where for animations quicker framerates allow for silky smooth smaller pixel movements, but slower updates make sense for saving power most of the time.

Heh. Reminds me of my old small gif cinema where I had a lot of fun seeing what 40x30 pixels could do. (And in 2002 I even played with putting those on the old Etcha-A-Sketch animator... 12 frames of 40x30 monochrome. Sigh, that came out in 1986, so my art project is even older than it was then...)

UPDATE: Oh, RIP Steve Wilhite, inventor of the GIF!