• Current

    I’m intrigued by Current (via Daring Fireball), and I really enjoyed the essay that seems to have preceded it but…

    This product claims to respect my time and attention, yet the page is so scroll-jacked and CSS-transitioned-up that I had to give it a couple of tries before I could bring myself to read to the bottom. Posts coming and going in a dynamic way might make sense in a reader app, but it does not for paragraphs on a web page, sir.

    It’s paid up-front!? With versions for three platforms? How are they going to make enough to sustain this app? Is it even worth investing the time to try when it will inevitably go through a painful, soul-destroying transition to a subscription model sometime 2–3 years from now?

    So I guess I’m giving it a pass for now but hopefully I’ve been hasty in my judgement and the next time it comes cross my RSS reader it will land better. Either way, it’s good to see RSS getting some love.

  • Study list for Spelling Bee: words of more than 4 letters, only 3 distinct

    If you play Spelling Bee for a while, you’ll notice there are some words that keep coming up over and over. For example, there are lots of relatively long words that contain only three different letters, so they appear all the time. The other day I thought, “how many of these words can there be”, so I wrote a script: - download all the accepted words for the last two years (about 8300 words) - identify just the words that have more than 4 letters (so, higher scoring) and no more than 3 distinct letters

    It turns out there are only about 140 such words, so as a public service I include them here:

    abk: babka
    abm: mamba
    abn: banana
    abo: baobab
    abu: bubba
    aci: acacia
    acl: calla
    acn: cancan, canna
    aco: cacao, cocoa
    ade: added
    adm: madam
    ado: doodad
    adr: radar
    ady: daddy
    ael: allele
    afl: alfalfa
    agl: algal
    agm: gamma, magma
    ahl: halal
    aht: hatha
    akp: kappa
    alm: llama, mammal
    aln: annal
    alp: appall, palapa, papal
    aly: allay
    am:  mamma
    amn: manna
    amo: momma
    amp: pampa
    ant: natant
    anw: wanna
    any: nanny
    aop: poppa
    aot: tattoo
    apw: papaw, pawpaw
    apy: papaya, pappy, yappy
    art: attar, ratatat, tartar
    ary: array
    aty: tatty
    bde: bedded, ebbed
    bel: belle
    bfo: boffo
    bho: boohoo
    bhu: hubbub
    bno: bonbon, bonobo
    bo:  booboo
    bos: booboos, boobs
    bow: bowwow
    boy: booby
    cde: ceded
    cem: emcee
    chi: chichi
    cho: hooch
    cim: mimic
    cio: cocci
    cir: cirri
    civ: civic
    cno: cocoon
    cor: rococo
    de:  deeded
    deg: edged, egged
    deh: heeded
    dei: eddied
    dek: deked
    dem: deemed, memed
    den: ended, needed
    dep: peeped, pepped
    deu: duded
    dew: wedded, weeded
    dgo: doggo
    dho: hoodoo
    div: vivid
    dmu: dumdum
    dov: voodoo
    efm: femme
    eft: effete
    egl: gelee
    eht: teeth, teethe
    ein: innie
    elm: melee
    elv: levee, level
    emz: mezze
    enp: penne
    ent: entente, tenet
    ept: teepee, tepee
    epv: peeve
    epw: peewee, pewee
    epy: peppy
    equ: queue
    etu: tutee
    etw: tweet
    flu: fluff
    gin: gigging, ginning, inning
    glo: googol
    hor: horror
    hot: tooth
    how: woohoo
    hoy: yoohoo
    ijn: jinni
    imn: minim
    ino: onion
    inp: pippin
    iny: ninny
    ipt: pipit
    itu: tutti
    koy: kooky
    lop: lollop
    lot: lotto
    mop: pompom
    mot: motto
    moy: mommy
    mru: murmur
    mu:  muumuu
    muy: mummy, yummy
    opw: powwow
    opy: poppy
    ort: rotor
    puy: puppy
    

    Happy Solving!

  • Speculating about Apple Silicon

    I know nothing beyond what’s been reported, but here’s my guess about where Apple’s high-end chips are going:

    There’s no M4 Ultra because the next Mac Pro will get an M4 or M5 that supports multiple dies/packages and discrete RAM. To really pile on the CPU/GPU cores, they’ll be able to add more chips. Maybe several Maxs, or a variant with some new interconnect.

    Presumably with some RAM packaged with each chip and a lot of magic to deal with the different memory latencies across the different processor and memory chips.

    That’s how you build a truly scalable high-performance workstation for AI training as well as video/audio production.

  • Weather troll: unbelievably clear blue skies in upstate New York today, the day before the eclipse. Forecast for tomorrow doesn’t look so promising, but 🤞

  • PSA: Google Calendar on iPhone needs “Precise Location”

    At some point the Google Calendar app on my iPhone stopped letting me search for locations when editing events. I could type in text, but would get no suggestions and would have to type/paste in an entire street address for it to do anything useful. Today I looked into it and after some experimenting, it looks like it was broken because I had turned off “precise location” for that app in Privacy settings. Because, why would my calendar need to know my precise location? In any case, turning it back on seems to have fixed it. And given that I’m putting the location on an event in order to eventually navigate there using Google Maps, I guess I’m not really exposing anything new. Still frustrating.

  • ML/AI is the long-awaited answer to the question “what are we going to do with all these transistors, since we can’t figure out how to write programs that do something useful with more than a handful of CPU cores?”

  • ⚽ Group G

  • ⚽ Group H

    Group H Potential Results

  • ⚽ Group E

  • ⚽ Group F

    Group F result matrix

  • Group C

    #worldcup ⚽

  • Watching the final games of the group stages, I can never keep track of the possible results in my head. So I made a quick and dirty viewer using SwiftUI:

  • Have we reached peak Zuckerberg? Where do we go from here? #holodeck #bondvillain

  • More Nand to Tetris: now self-contained

    After a long break, I spent some time recently fleshing out my Python re-implementation of the remarkable From Nand to Tetris course. You can now compile and run Jack programs without downloading any other tools, and work through the entire course up to and including writing your own compiler for your CPU.

    It’s still seriously good fun to build a (simulated) CPU from scratch in a couple of hours, and then see what it’s like to run an interactive program on it.

    If you’re interested in learning about how an entire computer is built out of dumb electronic components, or you know how this stuff works and you want to play with your own designs, and if you like Python, check it out at github/mossprescott/pynand.

  • After decades(!) of watching from the sidelines, this year I’m putting some real time and energy into #WWDC2021. Feels good to be focusing on making great Mac software, which was my first love after all.

  • It’s on. #coffee

  • Font too big; DR

    From the “Shouting into the wind” department: oversized body text is a menace on programming blogs I read. My theory is that these bloggers are running Linux at odd pixel densities (i.e. 1440p laptops) and they can’t read text at normal sizes, so they size everything up as a matter of course. Today I looked at the CSS on one and found “font-size: 1.2rem” which (I’ve now learned) means “make the body text 20% bigger than the reader wants it to be.” Please don’t do this. I might want to read what you have to say, but I often won’t have the patience to adjust my browser to accommodate your questionable life choices.

  • There have been some tough days recently, but on a day like today it’s good to be Charlie 🐕 🕯🕯🕯🕯🕯 🕯🕯🕯🕯🕯 🕯🕯🕯

  • SwiftUI, Catalyst, and now unmodified iPhone and iPad apps. How many ways do we need for iOS developers to target Mac? All of them, apparently.

  • Does featuring both Docker and Linux under Parallels in the #WWDC keynote suggest that macOS on ARM will have an even less Unix-y terminal environment than in the past?

  • Trying to print a partially-evaluated list in Haskell (with partial success)

    Working on exercises from Okasaki’s Purely Functional Data Structures involving lazy evaluation and wondered if it would be possible to introspect on the structures in memory and see what’s actually going on at runtime.

    Note: Scala’s lazy Stream does this, for the cells but not their contents:

    scala> val fibs: Stream[Int] = 0 #:: 1 #:: fibs.zip(fibs.tail).map { case (a, b) => a + b }
    fibs: Stream[Int] = Stream(0, ?)
    
    scala> fibs(6)
    res6: Int = 8
    
    scala> fibs
    res7: Stream[Int] = Stream(0, 1, 1, 2, 3, 5, 8, ?)
    

    I found this evaluated function on Stack Overflow (with a whole list of caveats), and slapped together a simple hack. It works for me with GHC 8.6.5 and -O0, but not in ghci or with optimization turned on.

    An example test:

      it "shows a list with several cells evaluated" $ do
        let lst = [1..10] :: [Int]
        putStrLn $ tshow $ take 3 lst  -- actually demand the first three values
        showLazyList lst `shouldBe` "1 : 2 : 3 : ..."
    

    And the code:

    import GHC.HeapView
    import System.IO.Unsafe (unsafePerformIO)
    
    -- [stackoverflow.com/a/2870168...](https://stackoverflow.com/a/28701687/101287)
    evaluated :: a -> IO Bool
    evaluated = go . asBox
      where
        go box = do
          c <- getBoxedClosureData box
          case c of
            ThunkClosure     {} -> return False
            SelectorClosure  {} -> return False
            APClosure        {} -> return False
            APStackClosure   {} -> return False
            IndClosure       {indirectee = b'} -> go b'
            BlackholeClosure {indirectee = b'} -> go b'
            _ -> return True
    
    showLazyList_ :: (Show a) => String -> String -> [a] -> IO String
    showLazyList_ elemThunkStr tailThunkStr lst = do
      evaluated lst >>= \ case
        True -> case lst of
          h : t -> do
            hStr <- evaluated h >>= \ case
                      True -> pure (show h)
                      False -> pure elemThunkStr
            tStr <- showLazyList_ elemThunkStr tailThunkStr t
            pure $ hStr <> " : " <> tStr
          [] -> pure "[]"
        False -> pure tailThunkStr
    
    -- |Show the contents of a list, only so far as have already been evaluated. Handles unevaluated
    -- elements and cells. Uses unsafePerformIO shamelessly.
    showLazyList :: (Show a) => [a] -> String
    showLazyList = unsafePerformIO . showLazyList_ "?" "..."
    
  • I went through my drawer and pulled out all the cables with USB (A) on one end. What a great run that port has had. I like the idea of hanging these all up somewhere where I can see what’s what. Also, some of these might not actually be worth holding onto 🤔

  • Made my own mask from stuff in the house. Glad to be able to protect myself and my neighbors without taking a “legit” mask away from someone who needs it more. Thanks, ragmask.com!

subscribe via RSS