jb… a weblog by Jonathan Buys

Morning Links

April 17, 2024

The Cloud Under the Sea

The world’s emails, TikToks, classified memos, bank transfers, satellite surveillance, and FaceTime calls travel on cables that are about as thin as a garden hose. There are about 800,000 miles of these skinny tubes crisscrossing the Earth’s oceans, representing nearly 600 different systems, according to the industry tracking organization TeleGeography. The cables are buried near shore, but for the vast majority of their length, they just sit amid the gray ooze and alien creatures of the ocean floor, the hair-thin strands of glass at their center glowing with lasers encoding the world’s data.

Fantastic article, reading it I’m nostalgic for my time as a Sailor in the US Navy. If I was a younger man, I might be tempted to seek out a position on one of these ships.


Morning Links

April 15, 2024

The Recovery Kit Version Two

If you’re not familiar with the Recovery Kit, it’s something I made back in 2019 and posted to my original back7.co blog. I created it before I knew what a “cyberdeck” was beyond a simple part of William Gibson’s Neuromancer. I wanted a rugged computer enclosure for my Raspberry Pi, and I’d been unhappy with overly simplistic and cheap cases for the Raspberry Pi at the time. I had some projects in mind for GPIO, but sadly many of those haven’t come to light since I made the Recovery Kit 5 years ago.

Cool idea.

Beautifying Org Mode in Emacs

zzamboni.org

Over the last few months, I have used org-mode more and more for writing and programming in Emacs. I love its flexibility and power, and it is the first literate programming tool which “feels right”, and I have been able to stick with it for a longer period of time than in my previous attempts.

Very nice, almost enough to convince me to check out Emacs agian. Almost.

Getting the Grid to Net Zero

A pair of links for this one, one from each point of view:

Ultimately, though, electricity generation that is completely carbon free in its operation is within our grasp. Our challenge now is to make the leap from small to large to very large systems. We know what we have to do, and it will not require technologies that are far more advanced than what we already have.

More of this, please.

Means of Control

“The success lies in the secrecy” is a shibboleth of the private surveillance industry, as described in Byron Tau’s new book, “Means of Control”. It is easy to find parallels to my opening anecdote throughout though, to be clear, a direct comparison to human-led ecological destruction is a knowingly exaggerated metaphor. The erosion of privacy and civil liberties is horrifying in its own right, and shares key attributes: those in the industry knew what they were doing and allowed it to persist because it was lucrative and, in a post-9/11 landscape, ostensibly justified.

Fantastic essay over at Pixel Envy.

The Meat Grinder

Even in my brief time with them over a decade ago, I witnessed too many people ground up in Apple’s pursuit of more. No matter how much you may believe that they are ultimately a force of good in the world, remember that if it ever became a choice between you and selling another iPhone, that iPhone is going to get sold. You don’t win capitalism through altruism. Apple is not the exception to the rule: there are no exceptions.

Apple’s not the scrappy underdog it used to be.


Morning Links

April 3, 2024

Tackle complex reasoning tasks with Mistral Large, now available on Amazon Bedrock

Calculate the difference in payment dates between the two customers whose payment amounts are closest to each other in the given dataset:

’{ “transaction_id”:{“0”:”T1001”,”1”:”T1002”,”2”:”T1003”,”3”:”T1004”,”4”:”T1005”}, “customer_id”:{“0”:”C001”,”1”:”C002”,”2”:”C003”,”3”:”C002”,”4”:”C001”}, “payment_amount”:{“0”:125.5,”1”:89.99,”2”:120.0,”3”:54.3,”4”:210.2}, “payment_date”:{“0”:”2021-10-05”,”1”:”2021-10-06”,”2”:”2021-10-07”,”3”:”2021-10-05”,”4”:”2021-10-08”}, “payment_status”:{“0”:”Paid”,”1”:”Unpaid”,”2”:”Paid”,”3”:”Paid”,”4”:”Pending”} }’

Output

To find the difference in payment dates between the two customers whose payment amounts are closest to each other, we first need to identify the two closest payment amounts and then find their respective payment dates.

The payment amounts are: 125.5, 89.99, 120.0, 54.3, 210.2

The two closest payment amounts are 125.5 and 120.0. The payment date for the payment amount 125.5 is ‘2021-10-05’ and for the payment amount 120.0 is ‘2021-10-07’.

The difference in payment dates can be calculated as follows:

Date difference = ‘2021-10-07’ - ‘2021-10-05’ = 2 days

So, the difference in payment dates between the two customers whose payment amounts are closest to each other is 2 days.

AWS does well when taking complex systems and packaging them up for consumers. I don’t think we’ve seen the full impact of AI yet. Not even close.

Casey Liss - Every Failure is an Opportunity

So, I called Sonos support this morning, and braced for a fight — I’m about six months out of the warranty coverage.

Thirty minutes later, without any sort of arguing nor complaining, I have a RMA, and I’ll get a new Roam in a couple of weeks.

Reminds me of a time when I took my newly broken iPod Mini into an Apple Store. I showed it to the guy at the counter, he said he couldn’t say for sure if it was accidental or manufacturing defect, so he went in the back and brought me a brand new one. I’ve been a fan since. Sounds like Sonos learned the right lesson.

New Spatial Personas

A pair of links for this one, one from each point of view:

I was able to invite my friend Stephen Hackett’s Persona over to my house for a play date and we were able to chat face to face in a way that just seemed more natural than talking to a persona in a box. It felt more like it was him.

After our excellent ideation session, we played a round of Battleship in the excellent Game Room on Apple Arcade. After I sunk all of his ships, we watched a few minutes of For All Mankind in a couple of immersive environments.

I had always wondered about SharePlay, prior to the Vision Pro. Why would I want to keep my phone up looking at someone on FaceTime while we both watched a movie? Never made sense. Now in the light of immersive virtual reality, it makes perfect sense.

The one about the web developer job market

We have the worst job environment for tech in over two decades and that’s with the “AI” bubble in full force. If that bubble pops hard before the job market recovers, the repercussions to the tech industry will likely eclipse the dot-com crash.

Well, this gave me a lot of food for thought.

xz Utils Backdoor

I simply don’t believe this was the only attempt to slip a backdoor into a critical piece of Internet software, either closed source or open source. Given how lucky we were to detect this one, I believe this kind of operation has been successful in the past. We simply have to stop building our critical national infrastructure on top of random software libraries managed by lone unpaid distracted—or worse—individuals.

Not great news the past couple days from the software industry.


Morning Links

April 2, 2024

Daring Fireball - Trump Media Plunges as Truth Social’s $58 Million

Link

I want to laugh, but: If Trump is elected again in November — which, based on the close results of 2016 and 2020, and the current polling data, is definitely possible — shaking down lobbyists and foreign governments with exorbitant rates for ads on Truth Social seems like a much better grift than running a hotel across the street from the White House. A corrupt president owning a social media site would be a grift that scales. If there’s any rational reason for Trump Media to have any value at all, it’s that. It’s worthless today, but could be a veritable goldmine in a second Trump administration.

I originally went to link to this by saying “couldn’t have happened to a nicer person”, but Gruber’s last paragraph resonates. I’d like to think it could never happen again, but I never expected it could happen a first time.

Daring Fireball - Donald Trump’s Easter Madness

It’s 168 words, the first 165 of which are (ostensibly) a single sentence.

My favorite part is when Trump starts referring to himself in the third-person.

10 Best Ultralight Backpacks of 2024

Good overview of hiking backpacks. I’ve had my eye on the REI Flash 55, but my son-in-law has lots of good things to say about Osprey. Not committing yet, but if I learned anything from my last trip it’s that I absolutely need a new pack. And a new sleeping bag.

Dr. Drang - Structural continuity and the Francis Scott Key Bridge

Link

The key to keeping bridges up over navigable waters is to build independent protective structures near—but not too near—the piers. The protective structures can get damaged by impact as long as they don’t transfer the load into the pier they’re meant to protect (that’s the “independent” part). Dr. Aghayere questioned the lack of protective structures in his interview, and he got that part exactly right.

Excellent article by the good doctor, as always.

Basic Apple Guy - MacBook

For this year’s diabolical April Fools’ Day post, I pulled on the heartstrings of those still pining for the return of a 12-inch MacBook and those wanting to see Apple infuse a bit more colour into their product lineup and created a series of fake press/website images imagining a collection of colourful 12-inch MacBooks!

Wow, if Apple released these today I might go into hock to buy at least one. Beautiful work.

Evan Travers - Digital Homesteading

If your passion or livelihood depends on a set of tools or capabilities, don’t rent those tools from someone who can deny you access4 or claim your output5 at any time. Own your tools. Be a digital homesteader.

I like the idea, but I also like the idea of paying real money for the best in class tools.

Michael Tsai - xz Backdoor

It’s a link post to a link post, but for this one I think it’s worth it. I’m still thinking through the ramifications of this hack, but it needs to be taken seriously.

Matthew Cassinelli - 15 iPhone Shortcuts YOU Requested

15 iPhone Shortcuts YOU Requested: Auto-Texting, Alarms, Music, and More

Well, to be clear, I didn’t request any. I’ve yet to find a compelling use for Shortcuts on my phone, and on my Mac Keyboard Maestro is head and shoulders above the Shortcuts port. However, it is fun to see people investing time and effort into creative workflows.


Loading and Indexing SQLite

October 19, 2023

What a difference a couple of lines of code can make.

I recognize that databases have always been a weak point for me, so I’ve been trying to correct that lately. I have a lot of experience with management of the database engines, failover, filesystems, and networking, but too little working with the internals of the databases themselves. Early this morning I decided I didn’t know enough about how database indexes worked. So I did some reading, got to the point where I had a good mental model for them, and decided I’d like to do some testing myself. I figured 40 million records was a nice round number, so I used fakedata to generate 40 million SQL inserts that looked something like this:

INSERT INTO contacts (name,email,country) VALUES ("Milo Morris","pmeissner@test.tienda","Italy");
INSERT INTO contacts (name,email,country) VALUES ("Hosea Burgess","kolage@example.walmart","Dominica");
INSERT INTO contacts (name,email,country) VALUES ("Adaline Frank","shaneIxD@example.talk","Slovenia");

I saved this as fakedata.sql and piped it into sqlite3 and figured I’d just let it run in the background. After about six hours I realized this was taking a ridiculously long time, and I estimated I’d only loaded about a quarter of the data. I believe that’s because SQLite was treating each INSERT as a separate transaction.

A transaction in SQLite is a unit of work. SQLite ensures that the write to the database is Atomic, Consistent, Isolated, and Durable, which means that for each of the 40 million lines I was piping into sqlite3, the engine was ensuring that every line was fully committed to the database before moving on to the next line. That’s a lot of work for a very, very small amount of data. So, I did some more reading and found one recommendation of explicitly wrapping the entire load into a single transaction, so my file now looked like:

BEGIN TRANSACTION;

INSERT INTO contacts (name,email,country) VALUES ("Milo Morris","pmeissner@test.tienda","Italy");
INSERT INTO contacts (name,email,country) VALUES ("Hosea Burgess","kolage@example.walmart","Dominica");
INSERT INTO contacts (name,email,country) VALUES ("Adaline Frank","shaneIxD@example.talk","Slovenia");

COMMIT;

I set a timer and ran the import again:

➜  var time cat fakedata.sql| sqlite3 test.db
cat fakedata.sql  0.07s user 0.90s system 1% cpu 1:13.66 total
sqlite3 test.db  70.81s user 2.19s system 98% cpu 1:13.79 total

So, that went from 6+ hours to about 71 seconds. And I imagine if I did some more optimization (possibly using the Write Ahead Log?) I might be able to get that import faster still. But a little over a minute is good enough for some local curiosity testing.

Indexes

So… back to indexes.

Indexing is a way of sorting a number of records on multiple fields. Creating an index on a field in a table creates another data structure that holds the field values and a pointer to the record it relates to. Once the index is created it is sorted. This allows binary searches to be performed on the new data structure.

One good analogy is the index of a physical book. Imagine that a book has ten chapters and each chapter has 100 pages. Now imagine you’d like to find all instances of the word “continuum” in the book. If the book doesn’t have an index, you’d have to read through every page in every chapter to find the word.

However, if the book is already indexed, you can find the word in the alphabetical list, which will then have a pointer to the page numbers where the word can be found.

The downside to the index is that it does take additional space. In the book analogy, while the book itself is 1000 pages, we’d need another ten or so for the index, bringing up the total size to 1010 pages. Same with a database, the additional index data structure requires more space to hold both the original data field being indexed, and a small (4-byte, for example) pointer to the record.

Oh, and the results of creating the index are below.

SELECT * from contacts WHERE name is 'Hank Perry';
Run Time: real 2.124 user 1.771679 sys 0.322396


CREATE INDEX IF NOT EXISTS name_index on contacts (name);
Run Time: real 22.129 user 16.048308 sys 2.274184


SELECT * from contacts WHERE name is 'Hank Perry';
Run Time: real 0.003 user 0.001287 sys 0.001598

That’s a massive improvement. And now I know a little more than I did.


The Perfect ZSH Config

August 14, 2023

If you spend all day in the terminal like I do, you come to appreciate it’s speed and efficiency. I often find myself in Terminal for mundane tasks like navigating to a folder and opening a file; it’s just faster to type where I want to go than it is to click in the Finder, scan the folders for the one I want, double-click that one, scan again… small improvements to the speed of my work build up over time. The speed is increased exponentially with the correct configuration for your shell, in my case, zsh.

zsh is powerful and flexible, which means that it can also be intimidating to try to configure yourself. Doubly-so when there are multiple ‘frameworks’ available that will do the bulk of the configuration for you. I used Oh My Zsh for years, but I recently abandoned it in favor of maintaining my own configuration using only the settings that I need for the perfect configuration for my use.

I’ve split my configuration into five files:

  • apple.zsh-theme
  • zshenv
  • zshrc
  • zsh_alias
  • zsh_functions

I have all five files in a dotfiles git repository, pushed to a private Github repository.

The zshenv file is read first by zsh when starting a new shell. It contains a collection of environmental variables I’ve set, mainly for development. For example:

export PIP_REQUIRE_VIRTUALENV=true
export PIP_DOWNLOAD_CACHE=$HOME/.pip/cache
export VIRTUALENV_DISTRIBUTE=true

The next file is zshrc, which contains the main bulk of the configurations. My file is 113 lines, so let’s take it a section at a time.

source /Users/jonathanbuys/Unix/etc/dotfiles/apple.zsh-theme
source /Users/jonathanbuys/Unix/etc/dotfiles/zsh_alias
source /Users/jonathanbuys/Unix/etc/dotfiles/zsh_functions

The first thing I do is source the other three files. The first is my prompt, which is cribbed entirely from Oh My Zsh. It’s nothing fancy, but I consider it to be elegant and functional. I don’t like the massive multi-line prompts. I find them to be far too distracting for what they are supposed to do.

My prompt looks like this:

 ~/Unix/etc/dotfiles/ [master*] 

It gives me my current path, what git branch I’ve checked out, and if that branch has been modified since the last commit.

The next two files, as their names suggest, contain aliases and functions. I have three functions and 16 aliases. I won’t go into each of them here, as they are fairly mundane and only specific for my setup. The three functions are to print the current path of the open Finder window, to use Quicklook to preview a file, and to generate a uuid string.

The next few lines establish some basic settings.

autoload -U colors && colors
autoload -U zmv

setopt AUTO_CD
setopt NOCLOBBER
setopt SHARE_HISTORY
setopt HIST_IGNORE_DUPS
setopt HIST_IGNORE_SPACE

The autoload lines setup zsh to use pretty colors, and to enable the extremely useful zmv command for batch file renaming. The interesting parts of the setopt settings are the ones dealing with command history. These three commands allow the sharing of command line history between open windows or tabs. So if I have multiple Terminal windows open, I can browse the history of both from either window. I find myself thinking that the environment is broken if this is not present.

Next, I setup some bindings:

  # start typing + [Up-Arrow] - fuzzy find history forward
  bindkey '^[[A' up-line-or-search
  bindkey '^[[B' down-line-or-search
  
  # Use option as meta
  bindkey "^[f" forward-word
  bindkey "^[b" backward-word
  
  # Use option+backspace to delete words
  x-bash-backward-kill-word(){
      WORDCHARS='' zle backward-kill-word
  
  }
  zle -N x-bash-backward-kill-word
  bindkey '^W' x-bash-backward-kill-word
  
  x-backward-kill-word(){
      WORDCHARS='*?_-[]~\!#$%^(){}<>|`@#$%^*()+:?' zle backward-kill-word
  }
  zle -N x-backward-kill-word
  bindkey '\e^?' x-backward-kill-word

These settings let me use the arrow keys to browse history, and to use option + arrow keys to move one word at a time through the current command, or to use option + delete to delete one word at a time. Incredibly useful, use it all the time. Importantly, this also lets me do incremental searching through my command history with the arrow keys. So, if I type aws, then arrow up, I can browse all of my previous commands that start with aws. And when you have to remember commands that have 15 arguments, this is absolutely invaluable.

The next section has to do with autocompletion.

# Better autocomplete for file names
WORDCHARS=''

unsetopt menu_complete   # do not autoselect the first completion entry
unsetopt flowcontrol
setopt auto_menu         # show completion menu on successive tab press
setopt complete_in_word
setopt always_to_end

zstyle ':completion:*:*:*:*:*' menu select

# case insensitive (all), partial-word and substring completion
if [[ "$CASE_SENSITIVE" = true ]]; then
  zstyle ':completion:*' matcher-list 'r:|=*' 'l:|=* r:|=*'
else
  if [[ "$HYPHEN_INSENSITIVE" = true ]]; then
    zstyle ':completion:*' matcher-list 'm:{[:lower:][:upper:]-_}={[:upper:][:lower:]_-}' 'r:|=*' 'l:|=* r:|=*'
  else
    zstyle ':completion:*' matcher-list 'm:{[:lower:][:upper:]}={[:upper:][:lower:]}' 'r:|=*' 'l:|=* r:|=*'
  fi
fi

unset CASE_SENSITIVE HYPHEN_INSENSITIVE
# Complete . and .. special directories
zstyle ':completion:*' special-dirs true

zstyle ':completion:*' list-colors ''
zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#) ([0-9a-z-]#)*=01;34=0=01'
zstyle ':completion:*:*:*:*:processes' command "ps -u $USERNAME -o pid,user,comm -w -w"
# disable named-directories autocompletion
zstyle ':completion:*:cd:*' tag-order local-directories directory-stack path-directories

# Use caching so that commands like apt and dpkg complete are useable
zstyle ':completion:*' use-cache yes
zstyle ':completion:*' cache-path $ZSH_CACHE_DIR

zstyle ':completion:*:*:*:users' ignored-patterns \
        adm amanda apache at avahi avahi-autoipd beaglidx bin cacti canna \
        clamav daemon dbus distcache dnsmasq dovecot fax ftp games gdm \
        gkrellmd gopher hacluster haldaemon halt hsqldb ident junkbust kdm \
        ldap lp mail mailman mailnull man messagebus  mldonkey mysql nagios \
        named netdump news nfsnobody nobody nscd ntp nut nx obsrun openvpn \
        operator pcap polkitd postfix postgres privoxy pulse pvm quagga radvd \
        rpc rpcuser rpm rtkit scard shutdown squid sshd statd svn sync tftp \
        usbmux uucp vcsa wwwrun xfs '_*'

if [[ ${COMPLETION_WAITING_DOTS:-false} != false ]]; then
  expand-or-complete-with-dots() {
    # use $COMPLETION_WAITING_DOTS either as toggle or as the sequence to show
    [[ $COMPLETION_WAITING_DOTS = true ]] && COMPLETION_WAITING_DOTS="%F{red}…%f"
    # turn off line wrapping and print prompt-expanded "dot" sequence
    printf '\e[?7l%s\e[?7h' "${(%)COMPLETION_WAITING_DOTS}"
    zle expand-or-complete
    zle redisplay
  }
  zle -N expand-or-complete-with-dots
  # Set the function as the default tab completion widget
  bindkey -M emacs "^I" expand-or-complete-with-dots
  bindkey -M viins "^I" expand-or-complete-with-dots
  bindkey -M vicmd "^I" expand-or-complete-with-dots
fi

# automatically load bash completion functions
autoload -U +X bashcompinit && bashcompinit


That’s a long section, but in a nutshell this lets me type one character, then hit tab, and be offered a menu of all the possible completions of that character. It is case-insensitive, so b would match both boring.txt and Baseball.txt. I can continue to hit tab to cycle through the options, and hit enter when I’ve found the one I want.

The last section sources a few other files:

[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh
[ -f "/Users/jonathanbuys/.ghcup/env" ] && source "/Users/jonathanbuys/.ghcup/env" # ghcup-env
[ -s "/Users/jonathanbuys/.bun/_bun" ] && source "/Users/jonathanbuys/.bun/_bun"
source /Users/jonathanbuys/Unix/src/zsh-autosuggestions/zsh-autosuggestions.zsh
source /Users/jonathanbuys/Unix/src/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

If I’m experimenting with Haskell, I’d like to load the ghcup-env variables. If I have bun installed (a way, way faster npm), than use that. The final two sources are for even more enhanced autosuggestions and command line syntax highlighting. So, typos or commands that don’t exist will be red, good commands where zsh can find the executable will be green. The autosuggestions take commands from my history and suggest them, I can type right-arrow to accept the suggestion, or keep typing to ignore it.

Taken together, I’ve been able to remove Oh My Zsh, but keep all of the functionality. My shell configuration is constantly evolving as I find ways to make things faster and more efficient. I don’t consider myself a command line zealot, but I do appreciate how this setup gets out of my way and helps me work as fast as I can think.


p.s. A lot of this configuration was taken from other sources shared around the internet, as well as the zsh documentation. I regret that I haven’t kept references to the origins of some of these configs. If I can find the links I’ll post them here.


Future Work and AI

January 26, 2023

I’ve been trying to wrap my small monkey brain around what ChatGPT will mean in the long run. I’m going to try to think this through here. In many ways the advances we’ve seen in AI this past year perpetuate the automation trend that’s existed since… well, since humans started creating technology. I’ve seen arguments that seem to be on two ends of a spectrum, that the AI is often wrong and unreliable, and we shouldn’t use it for anything important, to AI is so good that it’s going to put us all out of jobs. As with most truths, I think the reality is somewhere in between.

It’s my opinion that jobs that AI can replace, it probably will replace a lot of. But not all. Referring back to our discussion about the current state of Apple news sites, if the site is a content farm pumping out low-value articles for hit counts and views, I can see AI handling that. If your site is well thought out opinions and reviews about things around the Apple ecosystem, that I think will be safe. Because it’s the person’s opinion that gives the site value.

For more enterprise-y jobs, I could see fewer low and mid-level developers. Fewer managers, fewer secretaries, fewer creatives. Not all gone, but certainly less than before. If your job is to create stock photos and put together slide shows, you might want to expand your skill set a bit.

I think… the kind of jobs that will survive are the type that bring real value. The kind of value that can’t be replicated by a computer. Not just the generation of some text or code, but coming up with the why. What needs to be made, and why does it need to be made?

Maybe AI will help free us up to concentrate on solving really hard problems. Poverty, clean water, famine, climate change. Then again, maybe it’ll make things worse. I suppose in the end that’s up to us.


Iowa School Choice

January 17, 2023

The Prairie City Monroe district school board invited state senator Ken Rozenboom to their board meeting Monday, January 16th to discuss his support of the “school choice” bill currently making its way through Iowa legislature. The superintendent started off asking some tough questions of the Senator, who is the chair of the education committee. As he puts it, “school choice is in his lap”. He’s worked on different forms of the bill for seven years.

A lot was said about numbers and funds, percentages and estimates. The superintendent fully expects that the bill will negatively impact the PCM school district, and that the funds to cover the loss will have to come out of school programs. The senator was unconvinced… or at least he couldn’t admit he was convinced. I think the super is right.

But…

None of that matters. None of the numbers or dollars or percentages or estimates actually matter. At one point the Senator said something along the lines of asking us if we knew what was happening in some of the public schools in the state, calling out Lynnville-Sully in particular, where he claimed middle school girls were forced to shower with transgender students1. He also called out another school who spent a week on Black Lives Matter2, with a look of pure disgust. He said that public schools brought this on themselves.

He brushed off any and all criticism as being union talking points, with a smug grin and wave of his hand.

After the meeting was over, a few of us met with him in the hall to ask a few more questions. Again he said that you’d have to have your head in the sand to not know what was going on in public schools “out there”. I raised my hand and said “my heads in the sand. Seriously, I don’t read the news, I have no idea what’s going on.” I was hoping that he would explain or give a few more examples, but somehow the conversation moved on. I suspect he had no concrete evedence to provide.

What I got from the Senator was that it’s not really about kids, it’s not about education, it’s about the right-wing culture war. That’s what he said, but also what he couldn’t really admit. He said it’s not the republicans, it’s the left, it’s the teachers who are shoving this progressive ideology down our throats. He also said that the median household income across the state of Iowa is $61,000, he followed that up by saying that the median teacher income in Iowa is $61,000. He asked me if I knew how many teachers there were out there making $100,000 a year. I asked him if he knew how many there were in PCM, and said zero.

I was flabbergasted at the number of times the Senator would say something, and immediately claim that he didn’t say it.

In the Senators mind, schools are funded appropriately, or possibly overfunded. Public school teachers are overpaid and actively poisoning our kids minds. He said that the social contract has been irrevocably broken, that we can’t put the genie back in the bottle. I’m guessing what he means by that and the “school choice” program is that public schools should be relegated to serving only those whom the private schools turn away. Student in need, students with disabilities or behaviors, students with non-Christian parents. Creating an evermore stratified society of haves and have-nots.

We ended the night with me trying to explain to the Senator that what I heard was that instead of investing in our public schools, we are taking funds away from the schools. Even though we spent the past hour talking about exactly that, the Senator claimed that wasn’t at all accurate. We shook hands and parted ways.

  1. I could find no mention of this online, including in the published school board minutes. Of course, I’m not on Facebook. It’s unknown where the Senator gets his information. 

  2. I assume he’s referring to the 2021 Ames Community School District choosing to spend the first week of Black History Month featuring Black Lives Matter. 


Solar-powered system offers a route to inexpensive desalination - MIT News

August 3, 2022

Now, a team of researchers at MIT and in China has come up with a solution to the problem of salt accumulation — and in the process developed a desalination system that is both more efficient and less expensive than previous solar desalination methods. The process could also be used to treat contaminated wastewater or to generate steam for sterilizing medical instruments, all without requiring any power source other than sunlight itself.

That’s good news, more of this please.

Link


Use One Big Server - Speculative Branches

August 2, 2022

We have all gotten so familiar with virtualization and abstractions between our software and the servers that run it. These days, “serverless” computing is all the rage, and even “bare metal” is a class of virtual machine. However, every piece of software runs on a server. Since we now live in a world of virtualization, most of these servers are a lot bigger and a lot cheaper than we actually think.

Link