I Was On a Couple Podcasts 6 Jun 2018, 5:00 am

This past week, two podcast episodes came out that I was involved in. These aren’t the first podcasts I’ve been in, so I also added a “Podcast Appearances” section to my artifacts page.

The Learn Swift Podcast

I was interviewed by Steven Sherry for The Learn Swift Podcast. Steven started the podcast when he was learning Swift himself, and couldn’t find any podcasts focused on people early on in their learning of Swift. He interviews people currently learning Swift, or those that have learned Swift in the past that can speak to their experiences in the process.

Steven and I got to talk about what it’s been like for me learning software development, how I got the opportunity to learn Swift and iOS development, and the specific projects that I’ve been working on at C.H. Robinson (Navisphere Carrier and Navisphere Driver). It’s not often that I get to talk in technical detail about the things that I’m working on, so it was nice to have a chance to do that with Steven.

Listen to the episode: Isaac Halvorson - iOS Developer @ CH Robinson

The Question of the Day Podcast

I was interviewed by Rebekah Smith for her Question of the Day Podcast. I’ve known Rebekah for a little while, and we actually recorded my part of the podcast months ago, but it was just released last week. The format of the Question of the Day Podcast is unique. Each episode, Rebekah comes up with a question, asks people that question, and then records their responses. She then mixes all the answers together in a sort of audio montage.

The question for this episode was, “What was the make, model, and year of your first car?” This question can prompt some surprisingly interesting stories, as Rebekah outlines in the show notes:

If you ask someone about their first car, they’ll probably tell you a story. Cars can tell a family history, teach us to deal with adversity and embed themselves into our fondest memories.

I actually hadn’t thought about my first car — a 1992 Chevrolet S-10 — for quite a while before being asked this question, so it was great fun revisiting the fond memories associated with it. My responses are peppered throughout the episode, but listen to the whole thing. There’s a lot of great stuff in there.

Listen to the episode: Make, model, year of your first car?

Quick Tip: How to Enable CarPlay in the iOS Simulator 27 Apr 2018, 5:00 am

This little tip was surprisingly hard to find — only mentioned a couple times online — so I figured I’d do my part to spread the word.

To enable CarPlay in Xcode’s iOS simulator, execute the following terminal command:

defaults write com.apple.iphonesimulator CarPlay -bool YES

Restart the simulator if it was currently running, and then in the menu bar, go to Hardware > External Displays > CarPlay.


How to turn on CarPlay once you've enabled it in the simulator
How to turn on CarPlay once you’ve enabled it in the simulator

Easy peasy.

Let's Learn about Waveforms | The Pudding 25 Mar 2018, 5:00 am

Go check out this incredible web based visual explainer on sound waves by Josh Comeau1. It’s full of animations and sound that help to explain how sound waves, additive synthesis, and phase all work to create the sounds we hear every day. Having these concepts visually laid out like this helped me to understand the concepts more fully, even after going to audio production school for two years. Highly recommended! 👍👍


  1. 1.A quick shoutout: this link came to me from the excellent Changelog Nightly mailing list, a nightly email that catalogs the currently most popular open source repos on GitHub. I find cool stuff on there every day. And if you dig that, do check out their weekly mailing list too!

Update All the Things 12 Feb 2018, 6:00 am

The other day, I was wishing for an easy way to update all of the CLI package managers on my computer at once, rather than having to type each command separately. Then I realized, this would be a great job for a bash/zsh alias!

Here’s what I’ve come up with. I call it update-all-the-things:

alias update-all-the-things='
echo "🍺 Updating Homebrew" ; brew upgrade ;
echo "\n🛢 Updating Casks" ; brew cask upgrade ;
echo "\n🚀 Updating Global Node Modules" ; npm update -g ;
echo "\n💎 Updating RubyGems" ; gem update ;
echo "\n🐍 Updating pip" ;
pip install --upgrade pip setuptools wheel ;
pip freeze --local | grep -v "^-e" | cut -d = -f 1 | xargs pip install -U
echo "\n🐉 Updating pip3" ;
pip3 install --upgrade pip setuptools wheel ;
pip3 freeze --local | grep -v "^-e" | cut -d = -f 1 | xargs pip3 install -U
'

I think it would be fun to make this into an actual package itself someday. A super simple little Homebrew or NPM package would be fun to make. Have any ideas on how to implement it as its own package? Any package managers I’m missing? Let me know!

My Guide to the Twin Cities 2 Feb 2018, 6:00 am

I’ve lived in the Twin Cities since 2009, and have come to know them fairly well. Being there will be lots of people visiting from out of town this weekend — because Minneapolis is hosting Super Bowl LII — I’ve written up a guide to fun and interesting things to do in the Twin Cities.

You can check out the guide here, and it will be in the Living Documents section of the More page here on the site for future reference.

iCloud Music Library Woes 30 Jan 2018, 6:00 am

After ordering an Apple HomePod, and learning that it supports iCloud Music Library for streaming music, I decided to give it another shot. I tried iTunes Match when it first launched, and had lots of frustrations, quickly giving up on the service. When iCloud Music Library first launched, I gave that a try too, with similar results. And now, my already rocky relationship with iCloud Music Library is once again on the rocks. Its been chugging reliably through my 22,000 song library — its matched about 10,000 tracks and is now uploading the rest — but this morning, I tried to change some metadata for some music, and although iTunes seemed to comply, the metadata didn’t actually change. That’s a major offense in my book. My library is my library, and I won’t tolerate anyone but me editing it and its data.

Against my better judgment, I’m going to give it a temporary pass for now, because it’s still working through processing my library, and that could conceivably impact its performance when managing tracks. Software is hard after all. If it’s still causing problems once the processing finishes, I’ll will disable it with haste. I’ve been pretty happy using Plex to stream my music to my iPhone and other devices, so I may just commit to that route.

2017 by the Numbers 4 Jan 2018, 6:00 am

In the year 2017, I did many things, including:

  • 👨🏻‍💻 Made 2,039 git commits (910 on GitHub + 1,129 at work)
  • 🐦 Tweeted 942 tweets (down considerably from 6,077 in 2016!)
  • ⚖️ Lost 18.35 pounds (from 225.05 → 206.7)
  • 🚶🏻‍♂️ Took 1,869,681 steps (926.46 miles)
  • 📝 Wrote 205 journal entries
  • 📧 Sent 1,480 emails
  • 🤳🏻 Took 647 photos
  • ⌨️ Edited a 36,830 word ebook
  • 📖 Read 3 books (334 pages)
  • 🍿 Watched 38 movies (65.7 hours)
  • 📺 Watched 241 television episodes across 9 shows (167 hours)
    • 👽 1st: The X-Files, s01e08, Ice (1993)
    • 🛸 241st: The X-Files, s04e12, Leonard Betts (1997)
  • 💿 Added 396 new albums to my digital music library (12.6 days, 115.04 GB)
    • 💆🏻‍♂️ 1st: Borders by Emptyset
    • 🎧 396th: Dubs by Jay Glass Dubs
    • 🕺🏻 Most played: More Life by Drake
  • 👨🏻‍💻 Built 7 websites
  • 🏙 Visited 11 cities, in 11 states, in 2 countries
    • 🌊 Seattle, WA
    • 🌄 Denver, CO
    • 🏛 Washington, D.C.
    • 🏫 Boston, MA
    • 🍂 Tunbridge, VT
    • 👨🏻‍⚖️ Hanover, NH
    • ⛵️ Baltimore, MD
    • 🌽 Iowa City, IA
    • 🏘 Fargo, ND
    • 🌲 Hudson, WI
    • 🏝 Negril, Jamaica

Spicy Uno 1 Jan 2018, 6:53 pm

On New Year’s Eve this year, my friends and I played one of my favorite games: Spicy Uno (a.k.a. Crazy Uno). It’s the Uno you know and love with some extra rules to make things more fast paced and exciting. The game has many rules, and is one of those games that each group of people plays differently. I usually have to Google the rules each time I play, so I figured it would be good to have the rules I use in one central spot, and be able to share them with others as well.

Rules

All rules are optional. Choose which rules you’d like to use for your game. (Note: This game is best played with at least two decks of Uno cards)

  1. Slap: If you have the exact same card that was last played, you may play it at any time, regardless of whose turn it is.
    • If a player slaps his/her own card, it remains that player’s turn.
    • Slaps must be played one card at a time, you cannot play multiple cards at once, even if you are able to slap them.
    • Modification: If you’ve only got one deck of Uno cards, you can modify this rule to allow slapping on a card whose face value matches, regardless of color.
  2. If a 7 is played, the player must trade their hand with an opponent of his/her choice.
    • Exception: If a 7 is slapped, the player who slapped has three choices:
      1. Trade his/her hand with an opponent of choice.
      2. Have two opponents trade their hands.
      3. Do nothing.
  3. If a 0 is played, players must pass their hand in the direction of play.
  4. If a 1 is played, you must pass one card to an opponent of your choice.
  5. Nullification: If a reverse is slapped, it nullifies the original reverse thus preserving the direction of play.
  6. Dealing: The youngest player deals the first hand. Seven cards to each player dealt one at a time starting with the player to the dealer’s left. The dealer then flips the top card to begin play. This card is the “flipped card”.
    • Optional rule: When dealing, deal the fourth card face up.
  7. Player names: Each player must pick their game name (other than their real name) before play begins. During play, all players must refer to all other players by their game name. Failure to do so will result in one penalty card being drawn from the stockpile.
  8. Slap out da gate bonus: If the “flipped card” is slapped by any player other than the player whose turn it is, the hand is over. The player who slapped receives the -20 points for going out and all other players add up their hands as usual.
  9. Draw four out da gate: If a player legally plays a draw four on the flipped card, that player receives a bonus of -50 at the end of the hand.
    • Exception: If the flipped card is a draw four, there is no bonus awarded, only the “slap out da gate bonus”. (See rule 8)
  10. If a player leaves a game for any reason, they receive a DNF (Did Not Finish) for their score and are not allowed to re-enter the game.
  11. No substitutions permitted under any circumstances.
  12. If a player wishes to join a game in progress, their score begins at one (1) plus the current last place player’s score.
  13. If you cannot play when it is your turn you pick one card from the stockpile and either pass or play. (Note: You may choose to pass at any time regardless of whether or not you can play)
    • Modification: Instead of only drawing one card when you cannot play, continue drawing from the stockpile until you can play.
  14. The current dealer has the right to move the game to an alternate location before he/she deals.
  15. Scoring Card Point Values:
    • Seven (7) = -7
    • Zero (0) = +100
    • Face cards (Skip, Reverse, Draw Two) = +20
    • Numbered Cards (1-6, 8-9) = Face Value (1 = +1, 2 = +2, etc.)
    • Black Cards (Wild and Wild Draw Four) = +50
    • Going Out = -20
    • Draw Four Out Da Gate Bonus = -50 (See rule 9)
  16. Game End: Decide when starting what score you would like to go to. 500 is a good starting point. Once a player reaches 500 points, the player who has the lowest score wins the game.

These rules were adapted from Bernie DeKoven’s The Official Crazy Uno Rules.

Solo Project: Finished 16 Jan 2017, 10:21 am

I may have fell off the bandwagon with updating this blog with my solo project status, but rest assured, I did finish the project.

While the app didn’t end up quite as great as I’d imagined (I doubt it ever would’ve), I’m proud of what I built. I also learned a lot about OAuth, MongoDB, REST APIs, and CSS.

You can check out the code for the project at Crow’s GitHub Page.

Solo Project Day Seven: To The Database and Back Again 13 Dec 2016, 9:10 am

This is technically the eighth day since I began my solo project, but I didn’t do any work on the project on Sunday (although I did do some other web work.

Today was a very productive day for me. I got more done than I expected to, and I made it to MVP (Minimum Viable Product)! I didn’t think I’d get to MVP this fast, but I’m glad I did. At Prime, we all get industry mentors to work with, and tomorrow we meet with them to show them our solo projects. I was really hoping I’d have a usable product to show them.

Tasks Accomplished

  • Sorted out asynchronous tasks on the login page so that writing data returned from Firebase to the database happened after the data was actually received.
  • Figured out how to use $location to redirect to a new page after login: $location.path('/drafts')
  • This one was a doozie. I figured out how to create a new blank Mongoose sub-document upon the press of the “new tweet” button. Here’s the code (authFactory is where I’m storing the currently logged in user’s data):
// client side
$http.post('/db/draft/newBlank', self.authFactory)
.then(function(res){
// move info from newly created blank draft into draft factory
self.draftFactory._id = res.data._id;
self.draftFactory.text = res.data.text;
self.draftFactory.dateCreated = res.data.dateCreated;
});

// server side
router.post('/draft/newBlank', function(req, res){
User.findOne({ uid: req.body.uid }, function(error, user){
user.drafts.push(new Draft);
if(error){
res.sendStatus(500);
} else {
user.save();
res.status(201).send(user.drafts[user.drafts.length-1]);
}
});
});
  • I then figured out how to move the edited text of a draft into the database. This was also difficult, as I had to query the database for the specific draft that was being edited, and then update that one. Here’s the code:
// client side
self.saveDraft = function(){
$http.post('/db/draft/saveDraft/' + self.draftFactory.text, self.draftFactory);
};

// server side
router.post('/draft/saveDraft/:tweetText', function(req, res){
var query = { 'drafts._id': req.body._id };
var update = { 'drafts.$.text': req.params.tweetText };
var options = { upsert: true, new: true, setDefaultsOnInsert: true };

User.findOneAndUpdate(query, update, options, function(error, result){
if(error){
res.sendStatus(500);
} else {
res.sendStatus(201);
}
});
});
  • Lastly, I queried the database to display the current user’s drafts on the Drafts page in a list.

Tomorrow’s task will be mainly styling. I want the app to look nice for my mentors.

Today’s Research

Finder Keyboard Shortcut to Show Invisible Files 12 Dec 2016, 7:14 am

Quinn Taylor:

macOS 10.12 #protip: Finder supports ⇧⌘. to toggle visibility of hidden files, just like Open/Save panels have for a while. (Bug from 2003!)

I personally like seeing invisible files in Finder, and this is way easier than using Terminal to enable it.

(via Michael Tsai)

Moved to Digital Ocean + Let's Encrypt 11 Dec 2016, 1:24 pm

A quick update: I just moved both hisaac.net and hisaac.blog to an Ubuntu VPS at Digital Ocean. I’d previously been hosting through GitHub pages, but I wanted a little more control. This way, I can host both sites in one place, and get to learn more about servers, Linux, and Apache. The only issue now is git commits. I need to find a way to commit to GitHub and the VPS at the same time. Currently, I’m commiting from my local machine to GitHub, and then pulling the changes from GitHub to the VPS. It’s not a very efficient routine.

I also enabled SSL on both domains using Let’s Encrypt. I followed this guide, and it was surprisingly easy.

One note if you decide to use that guide: It’s slightly out of date. They mention near the beginning:

Although the Let’s Encrypt project has renamed their client to certbot, the client included in the Ubuntu 16.04 repositories is simply called letsencrypt. This version is completely adequate for our purposes.

For me, using letsencrypt didn’t work, and I used certbot instead.

Solo Project Day Six: Saturday 11 Dec 2016, 12:08 pm

I didn’t do too much today, as it’s a weekend, but I did get a little work done. Namely, I used Twitter’s API to look up the logged in user’s Twitter username using the user_id I receive back from Firebase on login. I also started building functionality for the draft of a tweet to be saved to the database for later editing.

Today’s Research

  • HTTP Status Codes
  • GET account/verify_credentials (Twitter API Docs) - I was frustrated that I didn’t get a user’s email address back from Firebase or Twitter when doing API calls, but I found out why. Twitter does allow for it, but I must provide links to my privacy policy and terms of service. I don’t actually have a privacy policy or terms of service yet, but if I plan to make this into a real app (which I do), I’ll need to write those at some point.

Solo Project Day Five: Enter the Database 10 Dec 2016, 11:13 am

Today’s goal was simply to move the data I was receiving from Twitter via Firebase, into my database. While this seemed simple in concept, as someone new to programming, it was difficult in practice.

I’m using Angular for my project, and I have a controller that calls to Firebase for the user’s authentication. The data is returned to the controller, and then put in a factory for temporary storage, and for use between controllers.

The same controller then makes an AJAX POST request to the server, which is then routed to the database using Mongoose. I also had to fuss a lot with my schema in Mongoose, which took up a good deal of my time.

Thankfully, a classmate of mine was able to offer some help. I’m also using Mongoose sub-documents in my project, and I could not for the life of me figure out how to import the sub-document modules into my main schema module.

Here is the correct way to do it:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var User = require('../models/user.model');
var Draft = require('../models/draft.model').schema;
var Post = require('../models/post.model').schema;

My issue was the .schema at the end of the sub-document require statements. I wasn’t using the .schema initially, so it wasn’t working at all.

Today’s Research

Solo Project Day Four: Too Big for my Britches 9 Dec 2016, 6:52 am

Today was a tough day actually. I started to get hung up on some bigger issues than I need to worry about at this stage. Contemplating user security is new to me, and something that I began to worry a lot about. When a user logs into my app using Firebase, my app gets sent that user’s key and their secret. These are essentially their username and password, but they are specific to my app, and requre my apps key and secret as well to be used in any way. This means that even if someone were to steal a user’s key and secret, they wouldn’t be able to do anything with them unless they had also stolen my app’s key and secret.

So this provides a good level of security, but my question was whether or not it’s good practice to store the user’s key and secret on my server. It seems like it would be secure enough, but secure enough doesn’t really seem like good practice these days. For now, I’m going to not store the key and secret anywhere, and only hold while the user is currently using the app. I plan to do more research on it later.

Things Done

  • Implemented dotenv for environment specific variables.
  • Tried out unirest for API requests.
  • After fussing with Twitter’s API for too long than I probably should have, I eventually ditched the manual API call route using unirest, and decided to use a library. I landed on twit as the best option.

Today’s Research

Solo Project Day Three: The Day I Tweeted 8 Dec 2016, 4:59 am

I tweeted using my app (sort of) for the first time today! I say sort of, because I didn’t actually do it from my app, but I did use my my app’s credentials and my test user‘s credentials. I used a wonderful API testing app called Paw to do my testing today. It’s a really nice tool, and I plan to continue using it for this project.

I also implemented FastClick, a JavaScript library to remove the 300ms lag when tapping items on the screen on touch-screen devices. It was very easy to implement, just a short piece of code in my client-side JavaScript after importing the library itself in the index.html.

// instantiates FastClick
if ('addEventListener' in document) {
document.addEventListener('DOMContentLoaded', function() {
FastClick.attach(document.body);
}, false);
}

Lastly, I began building functionality for the client-side code to send a created tweet to the server for the server to then post to Twitter.

I’ve been hearing good things about JetBrain’s WebStorm JavaScript IDE, so I’m going to try using that for development for a while. One of my instructors really likes it, so hopefully I’ll be able to get support from him if I decide to do it.

Today’s Research

  • Twitter’s API Documentation:
    • POST statuses/update - General information on how to POST statuses to Twitter. It turns out it’s much easier than I’d expected. If the user is already logged in, you simply URL encode the text, and then send it to Twitter in the request URL.
    • Counting Characters - This article describes in depth how a character is counted by Twitter. It turns out, it’s not quite as simple as you’d imagine. Certain types of characters take up different amounts of bytes, and are therefor couted differently. The article says that ‘character normalization’ is necessary, and it turns out JavaScript has a character normalization function built in.
    • t.co links - Twitter’s built in URL shortener — called t.co after the URLs it generates — works relatively automatically, with some caveats. When sending a tweet to Twitter, if it detects a URL in the text, it will automatically convert it to a t.co link, unless it is less than the current maximum t.co URL length. As time goes on, the length of shortened URLs grows as more and more unique links are used up. This means it’s important to check with Twitter what the current maximum t.co link length is. This is done by periodically performing a GET request to Twitter’s help/configureation URL.
    • GET help/configuration - Information on how to get configuration data from Twitter’s API.
  • JavaScript Character Normalization (MDN) - The Mozilla Developer Network’s documentation on JavaScripts .normalize() method.
  • Angular $routeProvider - Once again looking into how to route a user to different pages based on their logged in status using $routeProvider‘s resolve functionality.
  • Unirest - NodeJS REST API library for doing API calls from the server.

Solo Project Day Two: Getting Something on the Page 7 Dec 2016, 5:15 am

My scope was approved at the end of yesterday, so today I got to begin actual coding. It feels really good to start wrapping my brain around the concept of this app, and to start visualizing the whole project.

I began the day by thinking through my database structure. I’ve decided to use MongoDB for the project, and have two schemas I’ll be using. The main schema:

var userSchema = new Schema({
email: String,
name: String,
username: String,
date_joined: { type: Date, default: Date.now },
tweets: { [tweet] }
});

And a sub-document schema for the tweets themselves:

var tweetSchema = new Schema({
twitter_id: { type: String, default: "" },
url: { type: String, default: "" },
posted: { type: Boolean, default: false },
date_posted: Date,
date_created: { type: Date, default: Date.now },
hashtags: { type: String, default: "" },
mentions: { type: String, default: "" },
hearts: { type: Number, default: 0 },
retweets: { type: Number, default: 0 },
tweet: { type: String, default: "" }
});

(Normally I would use single-quotes in my JavaScript, but I had some issues with single-quotes within the tweet text escaping the string definition. I decided to use double-quotes, as they are less likely to be used in a tweet.)

These schemas are based off of assumptions about what the Twitter API will likely return to me, but I haven’t yet begun building that component of the application, so it will likely change. Until then, I’ve populated my database with some test data based off of these schemas, and will continue testing using that.

Next, I began building my Angular routes in my client-side JavaScript to be able to display different content based on what “page” the user is on. I also build static Login and Logout pages to be used in testing.

I also dug into some simple CSS styling using Skeleton, and copying some of Bootstrap’s button styles into them.

Lastly, we had a brief lecture on JavaScript debuggers. I haven’t looked into it much, but I definitely plan to use one soon.

Today’s Research

Screenshots


Login Page
Login Page


Settings Page
Settings Page


Tweet Page
Tweet Page

Solo Project Day One: It Begins 6 Dec 2016, 5:07 am

Today, I started work on my solo project, a major component of the curriculum at Prime Academy. For my project, I’ve decided to build a simple Twitter application. Heavily inspired by the late Birdhouse iOS app, it is a place to craft tweets, store them for later posting as drafts, and post them to Twitter once they are perfect.

Here is the project scope document I created for the project: Crow Project Scope

There are a few reasons I chose the name Crow.

  1. I wanted something bird themed because Twitter.
  2. Crows have one of the best memories in the ornithological world.
  3. The word crow can also be used to describe the action of making a sound expressing happiness or triumph, or to describe the sound itself. You can imagine each tweet made within Crow as a “crow” in itself.

Today’s Research

Fake News and Instagram | Manton Reece 22 Nov 2016, 11:46 pm

Manton Reece:

It’s not easy to build software that encourages good behavior. When I look at my Instagram timeline I see beautiful photos, hand-drawn art, and snapshots of everyday life. I see the very best of the world. It’s not the full truth, but it’s all true.

I really like Manton’s point here, that sometimes making something difficult to do promotes higher quality output. It extends outward into the rest of life as well.

Why Commits to Forks on GitHub Don't Apply to Contributions 12 Nov 2016, 1:35 am

Recently, I noticed that contributions I made to forks on GitHub were not being counted toward the contribution tracker on my profile’s page. I was curious to know why, as I felt like those contributions were just as good as any other.

After a little research, I found this article on GitHub’s support site. In it, they say:

Commits made in a fork will not count toward your contributions. To make them count, you must do one of the following:

  • Open a pull request to have your changes merged into the parent repository.
  • To detach the fork and turn it into a standalone repository on GitHub, contact GitHub Support.

So I found that there were ways around this, but I still wasn’t sure why. So, I emailed GitHub support to get some more information. Their response:

Hi Isaac,

Forks are designed as temporary places where you can work before merging your commits into the upstream repository. If commits in forks counted towards your contributions, in that workflow you’d end up with two contributions for each commit. One for the fork, one for the upstream repository.

If a fork becomes a different project from it’s upstream repository, and will never have commits merged into the upstream repository, then you can ask GitHub Support to detach the fork and turn it into a standalone repository. This will make the commits count towards your contributions. This is described here:

I hope this explains the situation. Let us know if you have any further questions.

Thanks, Alex

This definitely helped my understanding, and makes total sense. I had been using forks incorrectly — not as temporary places to work before merging code back into the master, but as a permanent place for storing work.

So, thank you to Alex at GitHub for clarifying this. I’ll be sure to use forks properly, and have correct expectations from now on.

Navigating Text Using the Keyboard on macOS 7 Nov 2016, 1:48 am

A few months ago, Merlin Mann tweeted a link to the [Apple Support document on Mac keyboard shortcuts][2]. There’s a ton of great tricks in there, but what I want to focus on are the ones related to editing text documents.

I’ve selected just the shortcuts I find most useful, and reposted them below. If you work with text at all on a Mac — code, prose, spreadsheets, whatever — these will seriously step up your game.

Note: I’ve used glyphs for the shortcut keys so as to better fit them in the table. If you’re unfamiliar with any of the symbols, I’ve provided a key at the bottom of the post.

Shortcut Description
⌘ + ↑ or Move cursor to beginning or end of document.
⌘ + ← or Move cursor to beginning or end of current line.
⌥ + ← or Move cursor to beginning or end of previous word.
⌥ + ↑ or Move cursor to beginning or end of current paragraph.1
⇧ + ↑ or Extend selection to line above or below.
⇧ + ← or Extend selection one character to left or right.
⇧ + ⌘ + ↑ or Extend selection from cursor to beginning or end of document.
⇧ + ⌘ + ← or Extend selection from cursor to beginning or end of current line.
⇧ + ⌥ + ↑ or Extend selection to beginning or end of current paragraph.
⇧ + ⌥ + ← or Extend selection to beginning or end of current word.
⌥ + ⌫ Delete the word to the left of the cursor.
Fn + ⌫ Forward Delete on keyboards that don’t have a Forward Delete (⌦) key.
⌃ + K Delete the text between the cursor and the end of the line or paragraph.
Fn + ↑ or Scroll up or down one page.
Fn + ← or Scroll to the beginning or end of a document.

Key

Symbol Key
Command / cmd
Option / opt
Control / ctrl
Shift
fn Function / Fn
Delete / Backspace
← ↑ ↓ → Arrow Keys

[2]: https://support.apple.com/en-us/HT201236


  1. 1.Note: This does not work in all applications.

Hundred Word Review: American Football (LP2) 22 Oct 2016, 5:24 am

American Football’s first album in 16 years opens with a song about two lovers who have become estranged after years of marriage, thus setting the tone for the rest of the album. Somber, reflective, and quiet, but also earnest. This has been a quality in American Football’s songs since the beginning. Their songs are very true and pure.

After breaking up in 2000, the band’s members did not set down their instruments, and it shows. Their musical and songwriting abilities have improved, and I personally think this new album is even better than their first.

Listen: Bandcamp | Spotify | Apple Music | YouTube | Google Play

Writing for Half-Life | Marc Laidlaw 12 Oct 2016, 9:35 pm

Marc Laidlaw worked for Valve Software from 1997–2016 as a video game writer — one of the first ever to hold that title. Mark worked on several games, including Half-Life, Half-Life 2, and both Half-Life 2 Episodes.

In Writing for Half-Life — written in 1998, just after Half-Life was released — Mark recounts what it was like doing something truly original: writing a narrative for a video game, where the player gets to inhabit and define the character on their own terms.

Anyone writing for computer games should start off recognizing the principles and techniques of drama that give impact and meaning to traditional forms of art—start there, but by no means stop there. The great thing about working in this new medium is that tradition is not a narrow set of restrictions, but a proven springboard. With a solid foundation in traditional storycrafting, I believe we are in a better position to create totally new kinds of experiences which our audience—any audience—has never had before.

It’s interesting to read this in our current day, where narrative in video games isn’t the norm, but is often expected as a matter of course. Mark was involved with something very unique and revolutionary. Half-Life went on to define what a narrative in a video game not only could be, but set the bar for what it should be.

World Mental Health Day 11 Oct 2016, 8:13 pm

I guess I missed World Mental Health Day (it was yesterday), but I would like to share anyway.

I suffer from dysthymia and major depressive disorder. It sucks, and I dealt with it alone for a long time. There’s an implied cultural shame around mental illness, and it kept me from seeking help. I finally did seek help — I now see a therapist and take antidepressants — and my life has improved immensely. I’m not cured by any means, but that’s not really the goal. The goal is to understand yourself and your emotions well enough so that you can deal with them in healthy ways. Surprisingly, it works. It works better than I’d ever have imagined before seeking therapy.

So to anyone dealing with mental illness on their own, and afraid of seeking help: I get it. It is so scary to be vulnerable. I still have terrible fear and anxiety being vulnerable, even with the people closest to me. I urge you to please consider at least seeing a therapist. There is no shame in seeking help. You are not weak if you can’t handle it on your own. On the contrary, there is more strength in being vulnerable and taking action toward you having a better life than hiding those feelings away inside yourself.

If you need someone to talk to, don’t hesitate to reach out. Shoot me an email, or DM me on Twitter. I’d be happy to talk with you and help you find resources.

Deep Linking in the Bandcamp iOS app 10 Oct 2016, 1:31 am

I love Bandcamp. They are truly the premiere independent music platform. They treat their users and artists well, and still manage to stay afloat.

I also like their iOS app. It works well for previewing new music, or listening to music I’ve already purchased on the platform.

I do have one complaint about their app though: There’s no way to open the app when viewing an album or artist’s page in the web browser. Many apps have this functionality. To name a few:

(All of those links should open in their respective iOS apps if you have them installed)

So why not Bandcamp? I don’t know why they’ve avoided deep linking, but for a while now, I’ve just accepted it as a fact. Until recently.

The other day, I bought an album on Bandcamp — Vaporlane’s Hieretic Teen.

Hieratic Teen by Vapor Lanes

After the purchase, I received an email receipt as usual. For whatever reason, I opened that email on my iPhone, and noticed a link saying “listen now in the Bandcamp app”. I don’t know if this is new or not, but this is the first time I noticed it.

Intrigued, I tapped the link. It first opened a web page in Safari, and then opened the Bandcamp app directly to the album, and started playing it! I was surprised and immediately started digging further. I had thought the Bandcamp app didn’t support deep linking, but it was now obvious that it does indeed.

So first, let’s look at the link in that email (personal/purchase information replaced with @@@):

http://bandcamp.com/redirect_to_app?fallback_url=http%3A%2F%2Fbandcamp.com%2Fdownload%3Ffrom%3Dreceipt%26payment_id%3D@@@%26sig%3D@@@&url=x-bandcamp%3A%2F%2Fshow_tralbum%3Ftralbum_type%3Da%26tralbum_id%3D531538254%26play&sig=@@@

The URL is constructed in a way that it first tries to open the Bandcamp iOS app, but then falls back to the web page if it’s not successful.

So what are all those % symbols? This URL uses Percent Encoding to encode information not normally allowed in URLs/URIs. Here’s a list of the codes used, and their translations:

Percent code Translation
%3A :
%2F /
%3F ?
%3D =
%26 &

So, if we use this to fix the parts after the fallback_url= in the original URL1, we get:

http://bandcamp.com/download?from=receipt&payment_id=@@@&sig=@@@&url=x-bandcamp://show_tralbum?tralbum_type=a&tralbum_id=531538254&play&sig=@@@

The last bit of that URL is the key. Here it is isolated:

bandcamp://show_tralbum?tralbum_type=a&tralbum_id=531538254&play

iOS’s deep linking syntax uses URIs to open applications rather than web pages. This description from the deep linking Wikipedia page is good:

Unlike the Web, where the underlying technology of HTTP and URLs allow for deep linking by default, enabling deep linking on mobile apps requires these apps be configured to properly handle a uniform resource identifier (URI). Just like a URL is an address for a website, a URI is the address for an app on a mobile device.

twitter:// and YouTube:// are the iOS URIs used to launch their respective apps, so in this instance, it’s the bandcamp:// part of the URL that tipped me off.

Looking at the URI, there is an album_id= field. I was hoping an album’s ID was used in the actual URL for the album, but it’s not the case. If we dig into the HTML source code though, we find the goods. Here are the last few lines of the source code for Hieretic Teen’s Bandcamp page:

</body>
</html>
<!-- bender01-6 Sun Oct 09 20:06:39 UTC 2016 -->
<!-- album id 531538254 -->

There it is! Buried at the bottom of the page is this album’s ID. Each album’s page has an album ID commented out at the very bottom of the page.

Next, I built a couple workflows using the excellent Workflow iOS app to test this out. Here they are:

Here’s where we hit a problem that I can’t fix on my own. These workflows work beautifully and without error (in my testing), but only on albums that the user logged into the Bandcamp app already owns. If used on albums not already in the user’s library, the Bandcamp app throws up an error saying:

The album could not be loaded. You may need to add your payment email address or sign in as a different user.

So this is where my journey ends. It seems that Bandcamp and its developers want to keep the deep linking to themselves, and use it only for opening the app from purchase receipts. I’m definitely curious to know why, and I’d like to request that the app’s behavior be changed. Preferably, I’d like it to act like the Twitter and YouTube apps: When any link to a Bandcamp web page is opened, open the Bandcamp app instead. The app’s audio player is much preferable to the web player.


  1. 1.I used ascii.cl’s URL Decoding page to convert this. It’s a handy resource.

The GitHub Challenge 30 Sep 2016, 12:32 am

I’ve just undertaken a “GitHub Challenge” with fellow students at Prime Academy. Our goal for the challenge is to make at least one git commit for the next 30 days, starting today.

We were asked to choose a topic that interested us, so I chose front-end design. I’ve heard that the curriculum at Prime will be focused more on back-end technologies, than front-end design (which makes sense), but I’m also interested in front-end, so it should be a good motivator to learn that alongside the other material.

The project I’ve chosen is to design my own Jekyll theme. I’ve named the theme Tash after my father’s childhood horse. (note: This blog is run off of Jekyll1, and hosted on GitHub in its own repo.) I don’t love Jekyll’s default theme, Minima, and I haven’t found one elsewhere that I’m in love with either. So, I’m gonna make my own!

This will be an exercise not only of learning how to design a good looking website, but also what makes a good looking website. I plan to blog here during the process, and you can check back in as I work to see how the site changes throughout.


  1. 1.This is no longer accurate. The blog now runs on Hexo.

Machine Politics | The New Yorker 30 Aug 2016, 10:04 am

George Hotz — known as “geohot” online — is a sort of hacker legend. At the age of 17, he hacked the first model of Apple’s iPhone — the first person ever to do so. Not long after, he set his sites on Sony’s then new console, the PlayStation 3. Thought to be “impenetrable”, it was an enticing target for the young hacker.

This is relatively well known information, but one thing I didn’t know was how geohot’s PS3 hack was connected to the 2011 “Summer of Lulz”.

Black-hat hackers began posting corporate e-mails, and, during the summer of 2011, attacks on media, technology, and other institutions came almost daily. Nintendo got hacked, and so did Sega, Electronic Arts, the News Corporation, Booz Allen Hamilton, NATO, and Lady Gaga. Even the C.I.A. was hacked, LulzSec claimed. It was the Summer of Lulz. Hotz didn’t mean to inspire a hacker war, but he doesn’t regret what he did. One night at a restaurant in Palo Alto, he clarified his position on the attacks against Sony. “If being a techno-libertarian leads to online anarchy, so be it,” he said. “I’m not a cause. I just like messing with shit.”

The New York Times article also goes into Hotz’s politics — or lack thereof. It’s an interesting peek into the life of someone who, since the lawsuit with Sony, has been relatively quiet online.

My Dead Girlfriend's Bot | Joshua Allen 30 Aug 2016, 12:29 am

It’s been seven months since Emma died and two weeks since I started building a bot from her texts. I’m feeding every word she sent me into the system, every thought, every feeling.

Joshua Allen writes a short but poignant tragedy for the Twitter age. (via @fireland)

Quiver: The Programmer's Notebook 29 Aug 2016, 8:05 am

Quiver is a new favorite app of mine. It’s essentially Evernote for programmers. It gives you the ability to write notes containing styled text, Markdown, code, and even LaTex. It’s Mac only right now, but an iOS version is currently in beta testing.

Shuffleboard at McMurdo | Idle Words 27 Aug 2016, 10:45 pm

Maciej Cegłowski (creator of Pinboard) crowdfunded a trip to Antarctica, with the promise of writing in detail about the experience. Shuffleboard at McMurdo is his first delivery on that promise, and it does not disappoint.

I didn’t know until after reading this post that Cegłowski has been writing for a long time, and is particularly well known for his travel writing. His blog has a lot of other gems worth checking out if you get the time.

Conversion via Twitter | The New Yorker 27 Aug 2016, 10:28 pm

Adrian Chen writes the incredible account of Megan Phelps-Roper’s “conversion via Twitter”. Phelps-Roper was a prominent member of the infamous Westboro Baptist Church. She grew up as a member of the congregation, and was its primary voice on Twitter.

Phelps-Roper spent the summer and the fall in an existential spiral. She would conclude that everything about Westboro’s doctrine was wrong, only to be seized with terror that these thoughts were a test from God, and she was failing. “You literally feel insane,” she said. Eventually, her doubts won out. “I just couldn’t keep up the charade,” she said. “I couldn’t bring myself to do the things we were doing and say the things we were saying.”

The post also highlights the mindset many people go through when losing their faith. It’s a back and forth internal conversation that is confusing and stressful.

My Music Recs Newsletter 13 Aug 2016, 5:00 am

I’ve decided to try out the email newsletter format as a way to send out music recommendations. I love the discovery of new music almost as much as I love the music itself, so I thought it would be a fun way to help others discover great stuff.

I haven’t decided yet if I’ll post the recs here on the blog as well, but I’d say it’s pretty likely that I will.
Subscribe here to get recommendations sent directly to your email inbox: http://tinyletter.com/hisaac

Tim Berners-Lee's Proposed Social Network 12 Aug 2016, 5:00 am

I’ve always had a curiosity about how our internet and social networking systems work. Of special interest to me is the way things could work, other than the way they do now. Projects like Apache Wave née Google, Tent.io, App.net, Diaspora, and others have sparked some fun research for me. Now, Tim Berners-Lee (a.k.a. the inventor of the World Wide Web) has proposed a new decentralized microblogging service, called Client-Integrated Micro-Blogging Architecture, or CIMBA for short.

From their Github page:

CIMBA is a privacy-friendly, decentralized microblogging application that runs in your browser. It is built using the latest HTML5 technologies and Web standards. With CIMBA, people get a microblogging app that behaves like Twitter, built entirely out of parts they can control.

To use CIMBA, people must have an account at some Data Server (also called a “personal data store”) which implements the Linked Data Platform (LDP) Web standard with appropriate extensions. Users may choose to run their own Data Server, use one provided by an employer/school/government, or even pay for a Data Server service. Whatever their choice, they can easily switch to another Data Server whenever they want or even concurrently use different Data Servers for different aspects of their life.

The wonderful thing about this is that the data is separate from the platform. Anything shared isn’t stuck on Twitter.com or Facebook.com, but on a server of the users’ choice.

Basically, if you don’t like CIMBA anymore, or if there is a better microblogging Web app that you want to use, you just need to replace the Web app, which only acts as the UI component of the system. The data you have created will not be affected by the change!

This is far from a new idea (it actually sounds very similar to Tent.io), but it’s exciting to see it get some backing from Berners-Lee, a veritable web powerhouse. I’ll be watching this project closely.

Early Thoughts on Driving for Lyft 27 Jul 2016, 11:03 pm

As a means of making income while I learn a new trade, I decided to become a Lyft driver. Now, after a month of legwork, I’m finally driving. After a few days of driving, these are some early and brief impressions of what it’s like to be a driver.

  • I am not getting passengers nearly as often as I’d expected. The couple times that I’ve been out driving, there have been stretches of up to an hour without any requests sent to me.
  • You are all but forced to use your phone while driving. When I get a request, I’m driving around to increase my chances of getting chosen. When I get a request, I have to:
    1. Open the Lyft app if it’s not already open.
    2. Tap to accept the request.
    3. Do some cursory observation of the route and destination.
      I’m not sure if there’s any way around this really, other than waiting stationary for requests to arrive.
  • Inane conversations with strangers are difficult (at least for me). This is a skill I’m going to need to develop, and am looking forward to being better at.

It is clear that there is much more strategy involved in driving than I expected. I thought I would be pinged with ride requests pretty often while I was out driving, but that’s not the case. Being in the right place at the right time is important, and not easy.

Selenium Sulfide Shampoo for Dandruff Control 16 Jul 2016, 5:00 am

I’ve had dandruff for most of my adult life. I’ve more or less come to accept it, but during my recent trip to Seattle to see my doctor, I casually mentioned it to her. Her response was to prescribe me selenium sulfide shampoo. If you’ve ever used Selsun Blue, you’ve used selenium sulfide shampoo. Selsun Blue contains 1% selenium sulfide as an active ingredient. The prescription I was given has 2.25%.

I’ve used Selsun Blue in the past, and it didn’t help me. I was skeptical, but the fact that this was prescription strength made me interested. Lo and behold, it worked! After only one use, my dandruff has quite literally disappeared. It’s incredible.

Dandruff is excess dead skin flaking off of the scalp. It can have many causes, so it can sometimes be difficult to treat. Selenium sulfide is an anti-fungal agent, so at least in my case, the dandruff seems to have been caused by a problem with the microorganisms on my scalp. Most likely metabolic by-products of Malassezia yeasts (according to the Wikipedia article).

So, if you have dandruff and are seeking a solution, ask your doctor about prescription strength selenium sulfide shampoo (I know this sounds like an advertisement…). It’s worked for me so far, but I’ll make sure to post an update here if things change.

Elon Musk Will Save Us All 6 May 2016, 7:08 pm

I have a theory about Elon Musk: I believe he has foreseen the inevitable destruction of the human race through its continued ravaging of the Earth.

Musk plans to have SpaceX ready to usher humans off of this planet, and onto another (Mars? the Moon?). The technology though, is not there yet. What he needs is more time.

With Tesla, SolarCity, The Boring Company, and his version of the Hyperloop concept, he is helping the world become less dependent on fossil fuels — thereby delaying the inevitable destruction of this place we call home.

Brief Thoughts on Disney's Frozen 1 Apr 2014, 5:00 am

  • The plot felt very rushed
  • The characters were uninteresting
  • The dialog was simple
  • The Mickey Mouse cartoon at the beginning was great

Good and Great Albums of 2013 12 Jan 2014, 6:00 am

Welcome to my Good and Great Albums of 2013 list! Please peruse the list and drop me a line on Twitter if you found anything that piqued your interest. And please share your lists as well if you’ve got them. I love finding and hearing new music.

Good Albums

Amber London - Tru 2 tha Phonk


Album art for Tru 2 tha Phonk by Amber London

Grimy, dirty, Southern phonk.


Bonobo - The North Borders


Album art for The North Borders by Bonobo

Strange and atmospheric rhythms.


Ceephax Acid Crew - World Dissolver EP


Album art for World Dissolver EP by Ceephax Acid Crew

Random acid. Mad acidic bro. (Also, watch the amazing music video for Probey’s Poker)


Childish Gambino - Because the Internet


Album art for Because the Internet by Childish Gambino

Most of the songs are good, but a few of them are great. Can’t wait to see what Gambino does next.


Daft Punk - Random Access Memories


Album art for Random Access Memories by Daft Punk

You know you love it.


Death Grips - Government Plates


Album art for Government Plates by Death Grips

Makes Yeezus look like adult contemporary R&B. Yeezy wishes he was this good.


DMX Krew - Broken SD140 Part II


Album art for Broken SD140 Part II by DMX Krew

Melodic acid.


DMX Krew - Cities in Flight


Album art for Cities in Flight by DMX Krew

Computer acid.


DMX Krew - Reith Trax


Album art for Reith Trax by DMX Krew

Atmospheric acid (acidspheric?)


Emptyset - Recur


Album art for Recur by Emptyset

I think the most surprising thing about this record is that I like it. More “sound” than actual music, but still rhythmic. Pulsing. Gyrating even. The sound is alive.


The Knife - Shaking the Habitual


Album art for Shaking the Habitual by The Knife

Good: Completely not subtle production.
Bad: Too many “noise” tracks, not enough music.


Mikal Cronin - MCII


Album art for MCII by Mikal Cronin

Good, simple, pleasing, rock ‘n’ roll.


Paul Keeley - Fragmented


Album art for Fragmented by Paul Keeley

The soundtrack to that deep and dark 80s science fiction crime drama that you never saw and was never made.


Recondite - Hinterland


Album art for Hinterland by Recondite

The frozen North in a record. Gobs of atmosphere.


Shigeto - No Better Time than Now


Album art for No Better Time than Now by Shigeto

Organic jazzy grooves and keys, layered over semi-post-dubstep (sort of) rhythms / electronic bleeps and bloops. The antithesis of the previously mentioned Emptyset record. Also choice for “Best Album Cover of 2013”.


True Widow - Circumambulation


Album art for Circumambulation by True Widow

Gloomy, doomy, boomy, and slow.


Ty Segall - Sleeper


Album art for Sleeper by Ty Segall

Not your average Ty Segall. Quiet, reserved. Also quite good at times. Each song sounds like the intro section to one of the more “standard” Ty Segall jams.

  • Listen: Songlink
  • Highlight: Sleeper (This really sets the tone for the whole album.)

Unknown Mortal Orchestra - II


Album art for II by Unknown Mortal Orchestra

Music made for AM radios. The 1970s are alive. They even artificially removed all the highs from the mix (about the only thing I don’t like about the record to be honest).

Great Albums

A$AP Ferg - Trap Lord


Album art for Trap Lord by A$AP Ferg

I can never decide while listening to this record if Ferg is an idiot backed by smart people, or a smart guy playing to a dumb crowd. Either way, this is psychedelia disguised as rap disguised as culture. And those beats tho!


A$AP Rocky - Long.Live.A$AP


Album art for Long.Live.A$AP by A$AP Rocky

You can hate him all you want, but you can’t deny Rocky’s got style. His flow is unique, the beats are exceptional, and the whole record just oozes A$AP.

  • Listen: Songlink
  • Highlight: Long Live A$AP (too many highlights to pick just one, so I just went with the title track)

Ariel Pink feat. Jorge Elbrecht - Hang on to Life / No Real Friend


Album art for Hang on to Life / No Real Friend by Ariel Pink feat. Jorge Elbrecht

I listened to these tracks while lonely and alone in another town in another state. Exceptionally sad and beautiful. Sometimes brings tears to my eyes.


Ceephax - Cro Magnox


Album art for Cro Magnox by Ceephax

This could be a soundtrack to a science fiction movie based off a video game for the Nintendo Entertainment System set on another planet where there is no sunlight. It could be, but it’s not. What it is is otherworldly and frequently brilliant.


Chelsea Light Moving - Chelsea Light Moving


Album art for Chelsea Light Moving by Chelsea Light Moving

Thurston Moore realizes the dream that we thought we’d lost when Sonic Youth broke up.


Dawes - Stories Don’t End


Album art for Stories Don't End by Dawes

I really can’t say enough about this record. Beautiful and true songwriting. Pure. Harmonic. Dawes is consistently wonderful.


Frankie Teardrop - Tough Guy


Album art for Tough Guy by Frankie Teardrop

Frankie Teardrop is a friend of mine. He is a friend to us all. Tough Guy is an ode to young midwestern frustration. I can’t wait to see what Frankie does in 2014.


Fuzz - Fuzz


Album art for Fuzz by Fuzz

This is what rock means in 2013. It’s as if Black Sabbath tripped into a time machine, emerged in 2013, hung out with a bunch of 20-somethings for a few months, and then made this record. (Don’t believe me? Listen to Raise.)


Kurt Vile - Wakin on a Pretty Daze


Album art for Wakin on a Pretty Daze by Kurt Vile

Calling this country would not be fair at all. Rock doesn’t work either. Indie: no. It is all of those, and yet none at the same time. I see this as a perfect counterpart to Fuzz’s record actually, what 2013 sounds like with guitars. Two sides of the same coin. If I had to choose one record on this list to listen to forever, it would probably be this one. There is a remarkable amount of depth here.

Brief Initial Thoughts After Finishing Super Mario 3D World 6 Jan 2014, 6:00 am

I finished Super Mario 3D World the other day, and while it was quite fun, it wasn’t quite what I was hoping for.
The isometrically locked perspective seemed kind of gimmicky to me. I guess one could say that it is the truest expression of translating the original two dimensional Mario experience to the three dimensional video game experience we are now accustomed to, but I feel it lacks something compared to its truly 3D brethren (Super Mario 64, Super Mario Galaxy 1 & 21).

What it lacks is exploration. There is no real discovery to be had in Super Mario 3D World. Sure, there is the occasional need to revisit a level to try to find that annoying green star that wasn’t easily spotted on the first play through, but the levels are so linear and confined that moments of true exploration are rare. I found it easy to spot the signs of hidden secrets. Most have to do with “oh, this doesn’t look like all the other things” type of design, which is quite unoriginal and boring.

From a level design standpoint, they relied far too heavily on the new cat power up. While cute and an interesting new ability, it’s unique wall-climbing ability makes it often the only way to reach certain items. Forcing a player to use a certain item or ability to access a certain area is not a bad thing in and of itself, but when it’s done so often throughout a game, the experience becomes monotonous. Far too many times, I found myself thinking, “Oh, that star is up on a high platform that I can’t get to. I guess I’ll have to come back here as a cat later on…” This is just lazy on Nintendo’s part, and I expect a lot more of them.

All that said, Super Mario 3D World was an engaging and wonderful experience - as is to be expected from any Mario game. While Nintendo may lack marketing prowess or a clear understanding of online gaming (what this generation’s gamers expect from a console), one thing they still retain is their unmistakable style. No one can make a game like Nintendo can2, and I don’t expect that to change for a long time.


  1. 1.Yes, I am intentionally not including Super Mario Sunshine in this list as it was a terrible excuse for a 3D Mario game.
  2. 2.Except maybe Rare during it’s Nintendo-only days, but let’s not reopen old wounds here. It’s far too painful.

Why I'm Trying Soylent 24 Jul 2013, 5:00 am

When I first learned about Soylent, I was very intrigued. Soylent is a new “liquid food” that is meant to be a complete source of nutrition for the body in powder form. It is a mixture of all the essential vitamins and minerals we normally consume through eating food. The powder is simply mixed with water and drunk around meal time and can be used to completely remove solid foods from the diet if the person so chooses.

This to me is very attractive for many reasons, so I ordered myself a two week supply. After ordering, many people have asked me why I would want to try something like this. There are a few reasons:

  • I don’t enjoy cooking. To me, cooking is a burdensome process that takes time away from other activities I would rather be doing. It’s simply not a fulfilling activity for me (beyond the physical sustenance of course).
  • Eating is a waste of my time. I mainly eat alone in my apartment, so rather than staring at a wall while I eat, I try to multi-task. Eating and doing anything else productive though, is a difficult task. I usually end up watching TV or YouTube videos rather than accomplishing anything productive.
  • Food costs money. When I look at my monthly expenses, food takes up the vast majority of what I pay for (not including monthly bills, rent, and student loan payments). If I were to eliminate most of these food expenses from my budget, I would have a lot more money to spend on other turns I more enjoy. Soylent is a much less expensive alternative.
  • My allergies make eating difficult. This may be the most important reason for me. I have a few serious health concerns (Lyme disease chief among them) that have caused me to develop multiple food allergies (corn, milk, egg whites, gluten, soy, and wheat to name a few). This makes finding food that won’t cause me problems a difficult and frustrating hassle.

I don’t plan on eliminating food from my life completely, as I think it can serve a very important social function. Eating and experiencing a meal together with friends or relatives can be a very worthwhile activity, and I plan on continuing in that regard. For the vast majority of my meals though, they will be in liquid form.

Now, I’ve heard about as many arguments against Soylent as I have for it, so I’ve decided that the only way I’m going to actually find out if it works is to try it for myself. If it works as advertised, I see it as a way to save myself time and money, and also potentially improve my general health.

I plan on writing here about my experiences drinking Soylent when it finally ships to my door in late September. If nothing else, it will be an interesting experiment.

Modern Hip Hop Production 18 Jun 2013, 5:00 am

My love of synthesizers and electronic music has been maturing for the past 5 or so years. The synthesizer is a very exciting instrument because it literally has no bounds. If a person can dream up a sound, it can most likely be synthesized.

My most recent musical interest is hip hop. Hip hop is and always has been electronic music (and any hip hop fan who says they dislike electronic music is living a fallacy). It has become a major cultural force, it is evolving rapidly. It’s exciting to see the general public embrace an electronic music, even if they don’t really know it.

Even more exciting is the fact that some hip hop producers are starting to embrace their electronic roots by employing more experimental and synthetic instrumentation and effects in their music. To illustrate this, I’ve created an 8tracks mix featuring some of my favorite artists displaying this new level of experimentation. Enjoy.

Microsoft Has a Sense of Humor? 18 Jan 2011, 6:00 am


I was the first to jailbreak Windows Phone 7, and all I got was this lousy t-shirt
I was the first to jailbreak Windows Phone 7, and all I got was this lousy t-shirt

I’m truly impressed with how well Microsoft is handling its PR lately. After stating that they intentionally made their new Xbox peripheral — the Kinect — hackable and encouraging users to bend it to their will, they’re now taking a similar approach to their new mobile operating system, Windows Phone 7.

In this day and age, jailbreaking is inevitable — and for some (me) quite enjoyable — and rather than constantly patching and attacking (à la Apple), Microsoft has chosen to speak directly with the team that first hacked WP7. They flew them all to the Microsoft headquarter in Redmond, WA to discuss the jailbreak process they used, and the possible bright future of legal WP7 homebrew.

I never thought I’d say this, but with the quality of both Windows 7 and Windows Phone 7, and Microsoft’s apparently newfound amicability, I might actually find it in my heart to one day love Microsoft like I used to. You go MS.

Project Xanadu 25 Aug 2010, 8:55 am

Have you ever heard of hypertext? No? Well, you’re life would be very much different without it. And without Ted Nelson, we wouldn’t have hypertext.


Ted Nelson at His Computer
Ted Nelson at His Computer

So what is hypertext you ask? Well, have you ever used the internet? If so, then you’ve encountered hypertext. All web pages are made up of the stuff, and most people don’t even realize it. Hypertext is text that references - or hyperlinks - other text or data. Any link you see on a webpage is an example of hypertext. (Go ahead, click all of those.) Images, YouTube videos, flash games, and even that wonderful email from your mom informing you about your aunt’s gout—they all utilize hypertext to get data from one place to another. But Ted Nelson’s hypertextual world was much different than the one we live in today. Ted dreamed of a system that allowed both content creators and content consumers to utilize and enjoy information seamlessly, and to be able to track changes, and attribute credit where credit is due. The system was far ahead of its time, and paved the way for what we now call the internet, but sadly, Nelson’s original idea has still yet to come to fruition.

Nelson’s life is so full of unfinished projects that it might fairly be said to be built from them, much as lace is built from holes or Philip Johnson’s glass house from windows. He has written an unfinished autobiography and produced an unfinished film. His houseboat in the San Francisco Bay is full of incomplete notes and unsigned letters. He founded a video-editing business, but has not yet seen it through to profitability. He has been at work on an overarching philosophy of everything called General Schematics, but the text remains in thousands of pieces, scattered on sheets of paper, file cards, and sticky notes. [via Wired]

So it is only natural that this, his greatest project, remains unfinished. But, there is still hope. Through the versatility of our current hypertext system—the World Wide Web—companies have begun to see the light that Nelson ignited more than 50 years ago. Google, a champion of new and creative internet technologies (or at least a champion of buying companies that have new and creative ideas), has been experimenting with similar systems for the same purposes. Google Docs was their first foray into the “docuverse” (Nelson’s term, not mine), which allowed users to share any documents made within the browser based software, and then collaborate together to create the document, all the while tracking any changes made and attributing them to their authors. And even more recently, Google released Wave, an even more direct realization of Nelson’s dream. Due to an overcomplicated user interface and lack of instructions, it has since been announced that Wave will soon cease to be, but the takedown is not without its opponents. There was a very low adoption rate from the general public, but the scientific and technology communities utilized it heavily. To them, the usefulness of collaboration and tracking of edits was indispensable. While Wave’s future is yet to be determined, perhaps with the interest in a collaborative system like it, this would be a perfect time for Ted Nelson to once again innovate. And hopefully he will finish it this time.

I’ll leave you with a video of Nelson explaining his philosophy on computing. If you’ve got eight minutes, I highly recommend it.

The Norns 21 Apr 2008, 3:54 pm

This story was written for my creative writing class at the University of North Dakota


Murder was easier than he had expected. Blood and puss oozed from the two small wounds near Raul’s ankle, forming a puddle on the hard wood floor. The smell mixed with the fresh fabric softener from the bed spread to create a sickening contrast.

After the bite, Raul had stumbled and fallen. He ended up sitting in the corner made where his bed met the wall behind it. The snake had slithered out of sight underneath the dresser in the corner. The sun was setting outside, and the yellow light streamed in, creating a beam through the dusty air.

The room was fancily decorated. The bed was against the wall farthest from the door, and there was a large dresser with a mirror on top to the right of the bed. Next to that was a large leather easy chair. Everything in the room was antique, except for the chair which looked almost new.

Raul began to look around the room. His breathing became heavy. He looked up at Jack, “I knew you were coming you know. I didn’t know when exactly, but I knew you were coming.”

Jack stared emotionlessly down at Raul. Jack’s eyes squinted slightly as Raul stammered on. “I don’t blame you. I don’t. I’ve been in this business long enough to know. You’re just doing your job.” It was becoming harder for Raul to breath. He had to force each breath in and out . “I don’t blame you. I don’t bla… Who hired you?”

Jack turned toward the bed. He closed his briefcase, picked it up and let it rest at his side. “I’m not allowed to tell you that.”

“I’m dying! I’m…” He swallowed, “I’m dying… There’s no harm in telling a dying man who killed him.”

Jack knew the rules, but Raul was right, there was no harm in telling him. He let out a long sigh, “Francis Templeton.”

Raul let out a soft chuckle, “Templeton eh? He never did like me much. How much did he pay you?”

“Twenty five.”

“I didn’t know I was worth that much to him,” He coughed into his fist. “I don’t have much time. I can feel my mind going.” He looked off into the distance, letting his eyes relax out of focus.

Jack cleared his throat. He tried to think of something appropriate to say, but nothing came to mind. He walked to the large leather chair near the dresser. He sat down and waited. The chair was less comfortable than it appeared, but he had to stay and make sure Raul died. Jack crossed his legs at the ankles and moved his foot to an imaginary rhythm.

Raul began to sweat profusely. His breathing became manic and came in short bursts. He jerked his head upward to face the ceiling, “Tell Templeton… Tell Templeton I’m not sorry.” He let out his dying breath and his entire body relaxed. His head still looked upward with his mouth completely open.

Jack looked at the body for some time, thinking. “That was disturbing.” He put his hands on the arms of the chair to stand up when he felt a sharp pain in his foot. He looked down to see the snake’s mouth wrapped around his shoe. The fangs had punctured the leather and gone deep into the top of his foot. He let out a grunt and relaxed back into the chair. He looked at Raul’s body. His head had relaxed into a forward facing position, eyes looking directly at Jack. Raul’s body slowly tilted to the side and slumped onto the ground. His head made a thud as it hit the ground.


“Captain. Enemies off the starboard bow. We can’t out run them at our current power levels.” First officer Poole tried to clear the smoke from the cockpit with his hand, waving it side to side in front of his face. “What are we going to do?”

Captain Frank Bowman’s eyes were fixated on the situation outside. Only small portions of open space were visible between the asteroids that filled the viewer. “Don’t you worry Poole, I’ve got a little trick up my sleeve. Something the Klornon’s don’t even know about. Remember that—“ Frank’s speech was cut off as he jerked the controls to the right to dodge a particularly large asteroid. “That was close… Remember that Lorvian artifact we picked up back on Setil-6?”

“Yes captain, but we still don’t know what it does.”

“You’re wrong there. Activate it.”

“But captain… we don’t know what will happen…”

“Poole, punch it.”

Poole paused and looked at Frank. Frank’s gaze never left the asteroids in front of him. Poole cringed as he pressed the yellow button, and…

The conclusion to Blast! vol. 9 will appear in next months episode. Will Captain Bowman and First Officer Poole make it out of their adventure alive? Or will the evil Klornon’s triumph? You’ll have to wait and see…

Bobby got up from the park bench and slipped last months issue of Blast! into the plastic sleeve. He unzipped his back pack, and slipped the comic carefully inside.

Bobby looked down the sidewalk to see Shane riding toward him on his new bicycle. The sun had just risen minutes ago, and there was still a slight mist in the air. In the park where Bobby waited, the fresh smell of dew was heavy, and the crickets were just finishing the night’s symphony.

Bobby took a deep breath through his nose and exhaled. “This is going to be sweet.”

Shane rode up to Bobby and skidded to a stop less than a foot from his feet. “This bike is so awesome.”

The bike was entirely black, no chrome to be seen. The parts all seemed to blend together to create one uniform object. It had a hard racing style seat, and pegs on all four wheels.

Bobby looked at his watch, “Right on time Shane, great job,” He looked down the sidewalk, the opposite way Shane had come from, “Let’s go.”

Bobby climbed onto the back pegs of the bicycle, and put his hands on Shane’s shoulders. “Hold on a sec.” Bobby said. He slid his back pack around his side, and zipped it back up.

“That could’ve been bad. You ready now?”

“Yep.”

They rode in silence for most of the journey. Past River Rock high school, past old man Kritel’s house, past the alley where Jimmy got beat up last month. Once they got within three blocks, Shane spoke up. “Almost there. I’m so pumped.”

“Me too. I’ve been waiting a whole month for this.” Bobby tilted his body to the right, hoping to see if there was a line.

Shane swerved to the right, correcting for Bobby’s weight shifting, “Hey, stop that. You gotta balance with me or we’ll tip over.”

“Do you think Poole and Bowman make it out of that asteroid field?” Bobby said.

“Well yeah, it wouldn’t be a very good comic strip if the main characters died. What I’m wondering is what that alien artifact thing is going to do.”

“I’ll bet it’s like a reverse tractor beam. It’ll shove all the asteroids and the Klormon ships away from their ship. And then they’ll just speed off at light speed!”

“That’d be sweet.”

They rounded the last corner. Bobby looked up. His eyes widened as his mouth dropped in shock. “Shane, stop.”

“Why? We’re almost there.”

“Look.” Bobby pointed ahead. There was a dark pillar of smoke rising from the store on the corner. Shane stopped the bicycle, and Bobby stepped off. A red circle of fire trucks surrounded the building, spewing water in a vain attempt to stem the flames.

The building was nearly gone already, and the firemen were attempting to stop the fire from spreading to the neighboring structures.

“Wha… we… is that…” Shane stammered.

“C’mon, let’s get closer.” They ran up and joined the crowd that was slowly forming around the blaze. The acrid smell of burning paper and ink filled the air. Bobby looked at the dark green sign, ‘Parker’s Comics and Collectables’ it read. Just then, it fell off the supporting beams holding it high above the store, and crashed onto the sidewalk making a loud thud. The metal on cement made a high pitched squeal as it slid away from the building.

Bobby stood emotionless as Shane stammered on. “Come on Shane. Let’s go home.”