A poem that influenced my life, though I knew it naught.

A poem that influenced my life, though I knew it naught until today when I read an email from my step dad and just now read it. You see, he read this during his college years and took it to heart. Influenced his life and his architectural practice and, perhaps, why the house I grew up in had a warped plane roof and curved walls, among many other interesting and unusual features 🙂

Pretty neat poem.

The Calf-Path by Sam Foss – Poems | Academy of American Poets

The Calf-Path

Sam Foss

I.

One day through the primeval wood
A calf walked home as good calves should;

But made a trail all bent askew,
A crooked trail as all calves do.

Since then three hundred years have fled,
And I infer the calf is dead.

II.

But still he left behind his trail,
And thereby hangs my moral tale.

The trail was taken up next day,
By a lone dog that passed that way;

And then a wise bell-wether sheep
Pursued the trail o’er vale and steep,

And drew the flock behind him, too,
As good bell-wethers always do.

And from that day, o’er hill and glade.
Through those old woods a path was made.


III.

And many men wound in and out,
And dodged, and turned, and bent about,

And uttered words of righteous wrath,
Because ’twas such a crooked path;

But still they followed—do not laugh—
The first migrations of that calf,

And through this winding wood-way stalked
Because he wobbled when he walked.


IV.

This forest path became a lane,
that bent and turned and turned again;

This crooked lane became a road,
Where many a poor horse with his load

Toiled on beneath the burning sun,
And traveled some three miles in one.

And thus a century and a half
They trod the footsteps of that calf.


V.

The years passed on in swiftness fleet,
The road became a village street;

And this, before men were aware,
A city’s crowded thoroughfare.

And soon the central street was this
Of a renowned metropolis;

And men two centuries and a half,
Trod in the footsteps of that calf.


VI.

Each day a hundred thousand rout
Followed the zigzag calf about

And o’er his crooked journey went
The traffic of a continent.

A Hundred thousand men were led,
By one calf near three centuries dead.

They followed still his crooked way,
And lost one hundred years a day;

For thus such reverence is lent,
To well established precedent.
 

VII.

A moral lesson this might teach
Were I ordained and called to preach;

For men are prone to go it blind
Along the calf-paths of the mind,

And work away from sun to sun,
To do what other men have done.

They follow in the beaten track,
And out and in, and forth and back,

And still their devious course pursue,
To keep the path that others do.

They keep the path a sacred groove,
Along which all their lives they move.

But how the wise old wood gods laugh,
Who saw the first primeval calf.

Ah, many things this tale might teach—
But I am not ordained to preach.

This poem is in the public domain.
Advertisement

Bus conversion trip – accessing the internet on the road in 1997

Some may remember stories of the bus conversion of a 1980s transit bus (Gillig Phantom, if you’re into that sort of thing) I did (with some help) and how our family (Geek was only a year old! my how time flies…) lived in it for about 8 months traveling about 25,000 miles around the continental United States.

During this period Dad worked remotely for a client programming a Mac application. But a bit of research will show you that while WiFi – which we all take for granted now – had been invented some 10 years earlier Lucent hadn’t been able to get anyone to adopt it and it wasn’t actually available on a consumer computer until Apple launched the iBook at NY MacWorld in 1999.

Oh, but WiFi is so passé now in the 2020s, we have 5G digital wireless on the cellular network! 🙂 Oh the dream of digital transmission on the cellular network was alive in 1997, but it was mostly just that a dream. Digital cell service was just starting to roll out and I think AT&T had 12 towers in big cities. I had to buy a special Nokia phone that was analog but also supported digital cellular connection. And a booster that had to be connected to the car to get enough power to push the signal. And the highest speed I ever got was 1200 baud despite the advertised 2400 maximum (pretty sure I’m remembering that right) – and that was parked directly under one of the few digital towers in the country 🙂

Here’s an excerpt I just found on my computer (which prompted this post) of a Bulletin Board System post I found on the “Bus Conversion News Board” from January 1999 which makes it clear that even nearly two years later it was still a challenge to get online from the road:

            Re: Wireless Internet, Cheap (relatively), nationwide

       [ Follow Ups ] [ Post Followup ] [ Bus Conversions News Board ]

Posted by Ed Carroll on January 17, 1999 at 18:22:25 PST:

In Reply to: Wireless Internet, Cheap (relatively), nationwide posted by Joe Solbrig on January 17, 1999 at 15:32:17 PST:

Thanks for the info Joe. Sounds like something a lot of us would be
interested in. A couple of questions though: 1. Do I understand you
correctly that if we connect up with this service then AT&T becomes our
regular ISP for unlimited connect time via wireless connection for only $60
per month regardless of our location? (Does that mean worldwide or just the
lower 48?) And 2. You mentioned a $100 "Pocketnet phone". Does that $60
monthly fee allow any voice communication from this "Pocketnet phone" to
friends on a regular land line phone?

: Hello again folks,

: I'm back, thanks to CDPD service from ATT wireless.

: There now is a way to connect to the internet wirelessly, nationwide and
for less than an arm and a leg.

: It takes a bit of looking around to actually get the information on this,

: "CDPD" and "Wireless" are data-broadcasting standards that uses the
cellular radio bands. ATT has used it for things like meter-reading and
stuff for a while. The problem is they traditionally charged per data
transmission and this made the service too expensive. However, recently,
they started a "nationwide unlimited" service which gives unlimited data at
a set price of $60/month. You have to buy a special connection equipment
also (request a "pocketnet phone" for $100 plus the connection kit for
another $100. The special CDPD moderm ).

: This is a business service, so it's best to say you're in business. Aren't we all ;). Also, you have to deal with the ATT office via phone and fax. But they're quite patient.
: They ran no credit check and started my service without my having paid for the equipment (which is good, given the delay my mail gets sometime).

: So all you full-timers, check it out!!

: Joe

          ---------------------------------------------------------

Follow Ups:

          ---------------------------------------------------------

Post a Followup

 Name
 Email Address
 Subject
 Comments:



          ---------------------------------------------------------
       [ Follow Ups ] [ Post Followup ] [ Bus Conversions News Board ]

Makes the kind of speed and service we can get now pretty amazing in contrast, eh?


So, how did I upload my source code, pull down shared source, get my email, and otherwise work remotely from a 40′ transit (city) bus as we drove around the country for 8 months?

Two techniques I figured out:

1. Most businesses have a fax machine and that’s often the only analog line in the office (the rest were part of the business PBX digital phone system). So I’d ask to borrow that line and since most didn’t need their fax machine online all the time, they’d often let me. Some hotels had a business communications area off the lobby that you could access without having a room if you acted confident and carried a laptop briefcase (and didn’t look too shaggy :)).

2. This gizmo:

A “fancy” for the time portable acoustic coupler.

What is this? How is it used? It’s an Acoustic Coupler and it’s used to connect to a POTS telephone, like this:

Yah, that’s an “antique” rotary phone and you can see the acoustic coupler held against the handset with the integrated velcro strap. This is literally a physical connection between the speaker on the acoustic coupler and the microphone on the phone handset and the microphone on the acoustic coupler and the speaker on the handset. So primitive!

And yet, it worked. Well, assuming I could find a payphone that hadn’t had beer poured on it and wasn’t trashed from being pounded against the side of the phone booth in frustration, etc.

My strategy was to find the largest bank of payphones – yah, they made them in rows, something like this:

“Toronto payphones covered with graffiti and notices. Telephone books are contained in weatherproof holders hanging from the bottom of each phone.” — wikipedia
Image: CC BY-SA 3.0

but I’d look for at least 5 and 8 or 10 was a better bet. I’d take my laptop and a folding camp chair and start at one end and work my way down the bank of pay phones until I found one that could connect at 9600 baud or better (14.4 was rarely possible, and 28.8 was a challenge) and hold the connection long enough to upload/download etc.

You’d use a calling card in case you had to call long-distance to get an access point (phone number that would answer and connect you to the internet) and you had to program all that stuff into modem dial string so it would call the calling card billing number, put in your calling card number and pin, and then dial the closest access point number.

Fun times!

Anyway, it was either this or the Iridium satellite phone service which was $25K for the antenna/phone unit and $4/minute for pretty slow data (I don’t remember but it wasn’t 9600 baud even, IIRC). My clients weren’t paying me that kind of money 😀

So, next time you open your smartphone and surf the web, or work remotely off of a wifi or you cellular hotspot – be thankful at the freedom we have now and laugh at how primitive working remotely was back in 1997. 🙃

Getting disk background encryption status

Context: Making a new bootable backup of my 13″ M1 MBP before upgrading macOS and taking advantage of the fact that SuperDuper! 3.7 now supports bootable clones (yay!). However, one unfortunate fact of creating them is that SuperDuper! docs say you have to boot from that drive and turn on File Vault manually if you want it encrypted (you want it encrypted 😉 ).

I’m pretty sure there’s a way to do this with diskutil and whatnot instead of booting from the clone and turning it on there, but I didn’t feel up to digging through how to do that (it’s complicated by the need to add users manually before turning on encryption, is my vague memory of the steps I had to do last time I dug into this).

However, David – maker of SuperDuper! – was kind enough to mention that once you turn it on you can then boot back from your main drive and connect the backup clone and let it finish the encryption in the background (this is good because it said 10 days to complete – mine is a very slow USB external drive, apparently!).

The drive kept blinking for two days and I was trying to figure out how to tell how much progress it had made and if it was done or if spotlight was indexing the drive or what. Here are some commands that I found to help with that.

diskutil cs list

will produce a listing of Core Storage volumes and their “Encryption Status” and “Conversion Status” which will indicate complete or not.

Unfortunately, the bootable combined volume + “Data” doesn’t come up in that list (it’s something different, apparently).

So for that I was able to find what I wanted using:

diskutil apfs list

which outputs an entry like this for the in-progress file vault encryption volume (emphasis mine):

|   +-> Volume disk7s2 8C8FD74F-ACE0-4E1D-B67B-2F021A3C5DD7
|   |   ---------------------------------------------------
|   |   APFS Volume Disk (Role):   disk7s2 (Data)
|   |   Name:                      Data (Case-insensitive)
|   |   Mount Point:               /Volumes/Data
|   |   Capacity Consumed:         1459954380800 B (1.5 TB)
|   |   Sealed:                    No
|   |   Encryption Progress:    75.0% (Unlocked)

You can specify the container disk (which is disk 7 in this case) and see just the volumes in that container: diskutil apfs list disk7

Some funny finds from the previous millennium…

Looking for the exploded view of an electric saw I need to take apart and found some design sketches for a desk I made myself – nas dimensions for a Macintosh IIci for the computer area 🙂

The other funny thing is the sketches are on the back of ImageWriter II (dot-matrix) printout of Pascal code from 1988 for an iChing app I did for a client 🙂

The Dissolve(…) routine call in it is calling out to a 68k asm routine I wrote to do a fast dissolve from an offscreen grafport to the screen – likely the first assembly language code I shipped in a commercial product 🙂

Anyway, likely only amusing to me as a reminder of a time in the past, but they were some good times so posting it here to save the smile they brought to my face.

iOS Feedback Assistant on non-beta iOS – accessing & visibility

The Feedback Assistant iOS app is visible and acts like a normal app on beta builds of iOS, but it’s hidden in release versions of iOS. On release builds the app icon is hidden on the Springboard/Home screen, it doesn’t come up in Spotlight searches, Siri can’t find it, and the process is hidden in the process switcher if you do get it launched.

The magic incantation to make it visible on release builds of iOS is to enter:

applefeedback://inbox?make_visible=1

in the Safari address bar to make the Feedback Assistant app on iOS always visible (spotlight, app icon, Siri search, process switcher, etc).

or, if you want to leave it hidden and auto-hiding but want to launch Feedback Assistant to file a new feedback enter the following in Safari:

applefeedback://new

Use just:

applefeedback://

alone to switch to Feedback Assistant without changing visibility or starting a new feedback (because Feedback Assistant is hidden from the process switcher, you need this if you are in Feedback Assistant and want/need to switch to another app but want to come back to Feedback Assistant to finish the feedback you’re editing, for example).

This is somewhat documented by Apple here: https://developer.apple.com/bug-reporting/

Note 1: You’ll need an Apple ID to file feedback reports.

Note 2: You can always go to feedbackassistant.apple.com to access your feedback assistant account without the Feedback Assistant iOS app, but you can’t include sysdiagnose files and it doesn’t have quite the same ease of use as the app.

How to eat half an ice cream sandwich

I told someone I’d just eaten half an ice cream sandwich and they said they were impressed.  🤔

It wasn’t trivial, because I do enjoy sweets, but wasn’t that difficult.

Here’s how to successfully eat half an ice cream sandwich (or anything else your body craves), from easy to difficult:

1) [Easy] Take an ice cream sandwich out of the package and cut it in half. Hand half to your wife/kid/friend/neighbor/etc and then pick up your half and enjoy it.

2) [Not difficult] Store your ice cream sandwiches in a freezer in the basement/garage.  Go get one and bring it to the kitchen.  Open one end of the package and slide the ice cream sandwich out of the package and put it on a plate. Cut it in half and put half back into the package.  Take that half an ice cream sandwich in a package back to the freezer in the basement/garage and put it away.  Only then do you pick up the half you’re going to eat and enjoy it.

3) [Medium] Same as above but don’t bother taking the half you’re saving back to the basement until after you eat the half you’re going to eat.

4 [Difficult] Open the package and start eating the ice cream sandwich. When you’ve eaten half of it, stop eating it, close up the package, and put it back into the freezer.

 

So, I wouldn’t be impressed that you ate only half an ice cream sandwich unless you did number 4 on this list 🙂

 

* I did (2) on the list, fwtw 😉

Quick Action ‘shortcut’ to clear metadata from a file in Finder

When you use AirDrop to move an image from your iOS device to your Mac macOS adds some metadata that made me uncomfortable. In particular, the com.apple.metadata:kMDItemWhereFroms metadata is a binary property list which includes the name of the device it came from. The default name is often your name, as in, “Dad’s iPhone 12 Pro”.

Lots of ways you might share that image which don’t copy that data, but copying the file to another Mac through an external hard drive or file sharing, at minimum, seems to transfer this metadata across.  Sending as an email attachment, or as a Messages message attachment doesn’t seem to transfer this metadata, on the other hand.  It would be nice to have a preference to prevent adding this to the file metadata (FB10992657).

Since I’m not 100% clear when this metadata is getting transferred and when it isn’t, I wrote a small macOS Shortcut to strip it.  First Shortcut I’ve put together and the lack of logging for shell commands or of any kind makes Shortcuts significantly less usable than Automator, for example (where I had to go to figure out what was going wrong).  Also the initial text for an Run Script node in a Quick Action are not as helpful as the Automator environment (FB10993044).

Anyway, here’s the result:

ClearMetadata

I’d attach the actual shortcut file but Apple chooses to make them tightly linked to the creator and doesn’t allow sharing the source code for the shortcut without attaching my AppleID certificate to the file (WTH?!) (FB10993444).

AppleScript to search the contents of Safari Windows & Tabs

I have too many windows open in Safari (416 tabs in 133 windows currently – yah, I wrote an AppleScript to count those 🙂 ).

Got tired of not being able to find something I knew I had open so I wrote an AppleScript to search the text content of all Safari tabs in all Safari windows that aren’t minimized (even across Spaces).  Does not currently search tabs in windows that are minimized to the dock.

I’ve now found this useful enough that I thought I’d share it.  Disclaimer: I’m not an AppleScript programmer and don’t really like AppleScript (probably because I don’t know the language and tricks!).  There are likely things that could be done better or smarter.  Contributions welcome.

That said, this seems to generally work and, thanks to me learning about using references, fast enough that I wasn’t sure it was actually working at first 🙂

Source is on GitHub here.

Instructions for installation are in the Read Me there.

SwiftUI – Simple ScrollViewReader use to get ScrollView to start at the top left.

Had occasion to use a SwiftUI ScrollView today and ran into the issue where the SwiftUI team decided to use one of the two most sensible defaults for initial presentation when the content is too large to fit in the container – center the content. This makes sense for images or maps, but not for much of anything else I am thinking of. Everything else seems to want top left (for left-to-right locales at least). Strange that something that a large percentage of people are going to want isn’t as easy to set as alignment or something, but so it goes.

Anyway, this gave me an opportunity to read up on ScrollViewReader which, combined with the .onAppear modifier, can get the initial presentation of a ScrollView to the top left like so many want/need it to be.

Putting the code here so I remember for next time and in case anyone else finds a bazillion Stack Overflow posts about how ScrollView is so hard to make display properly but no modern ScrollViewReader answers.

//
//  ContentView.swift
//  trashme
//

import SwiftUI

struct ContentView : View {
  var cellSize: CGFloat = 50
  var numRows: Int = 30
  var numCols: Int = 10
  var body : some View {

    VStack(alignment: .leading, spacing: 20) {
      ScrollViewReader() { proxy in
        ScrollView([.horizontal,.vertical], showsIndicators: true) {
          HStack( alignment: .top, spacing: 0) {
            VStack ( alignment: .leading, spacing: 0) {
              ForEach(0 ..< numRows, id: \.self) { row in
                Text("row " + row.description)
                  .frame( height: self.cellSize )
              }
            }
            ForEach(0 ..< self.numCols, id: \.self) { col in
              VStack( spacing: 0) {
                ForEach(0 ..< self.numRows, id: \.self) { row in
                  Text("\(row), \(col)")
                    .frame( width: self.cellSize, 
                            height: self.cellSize, 
                            alignment: .center)
                    .border(.blue)
                }
              }
            }
          }
          .id("root")  // since our ForEach views don't really 
          		// have true ids (\.self ~)  
          		// we make one for the outer HStack
          		// in the ScrollView
        }
        .onAppear {
          proxy.scrollTo("root", anchor: .topLeading)
        }
      }
    }
  }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

And here’s what it looks like in an iOS SwiftUI preview pane:

Twitter Advanced Search cheatsheet

Here so I can find it again 🙂

from:username
to:username       // to username
@username         // mentioning @username
keyword           // can be a #hashtag
-keyword
keyword OR keyword
min_retweets: x
min_faves: x
min_replies: x
filter:links
filter:images     // any image
filter:twimg      // twitter pic.twitter.com image
filter:video
filter:native_video
filter:periscope
filter:vine
filter:media      // image or video
filter:retweets
filter:safe
filter:verified   // verified users
-filter:____      // use with any of the above filter nouns to exclude
since:YYYY-MM-DD
until:YYYY-MM-DD
near:X within:10mi // (where X is a city name)
list:user/listname
url:apple          // has url containing "apple" anywhere in it
lang:languagecode  // en, da, cs, de, es, fr, it, ja, ko, nl, no, pt, ro, uk,…