I paid a visit to my dentist this week. As I sat in the chair having a sort of half-conversation with her, tubes and picks sticking out of my mouth, it struck me how both unusual and applicable dentist chair conversations are. Have you ever had a conversation where you’re completely engaged with an idea and just can’t get the words out fast enough, your mind constantly racing ahead? The pitfall in these situations is that you don’t take the time to listen, appreciate and react to the ideas of the person you’re conversing with. The conversation may become one-sided, the other person politely nodding their head, hopefully amused by your enthusiasm. The dentist chair turns the situation around, forcing you to communicate nonverbally, listen and think for a minute or two before your next opportunity to slip in a word or two before going silent again. So if you think you might be prone to rambling on a bit and want to change that, during your next conversation just imagine that you’re sitting in a dentist chair.
Here are two recent experiences I had with software, that represent a great experience I’d like to see more of:
- Uber mobile app: When entering your credit card information, instead of manually typing in the number, you take a picture of your credit card, and the app OCRs it from the image.
- Fitbit Aria: When setting up the scale, software running your computer locates the scale’s wi-fi server, connects to it and automatically syncs your settings, including your home wi-fi login. No fiddling around tapping things into a keypad on the scale.
Bravo, and encore!
I made my first flan this weekend — from Jaques Pepin’s recipe. It’s been in the fridge overnight. The big unmolding happens soon! I’ll post a follow-up picture when that happens.
In other news, I’ve updated the software that runs this blog and am testing it out. I’m also pondering, given the alternative places to write and reach people on the web, how I want to engage going forward. I definitely want to continue to write on my own domain. WordPress was a great tool for that ten years ago. Is it the best tool for that now? We shall see.
Postscript: see picture below. The flan split on one side as it came out of the pan. There are paper towels everywhere because the caramel spilled out when I flipped it. Looking forward to tasting.
I spent some time last night wrapping my head around how bitcoin works. Here’s a summary that I wrote up for a friend earlier today. The summary is a bit on the technical side.
The heart of the system is a global, public ledger listing all transactions on the network. The ledger is called the “block chain”, a term derived from the underlying tech.
Balances are held by ‘addresses’ which function much the same way as bank accounts.
- An “address” is the public side of a public key / private key pair.
- Transactions can only be initiated by the address owner, who has the private key.
- Transactions are authenticated by any number of peers on the network, using the address’ public key.
- New addresses are cheap to create, and can be created by anyone at any time. It is common for people to use many many addresses.
- The balance for any address may be derived by locating the first appearance of that address in the block chain, and rolling forward all transactions in the block chain involving that address.
Transactions are committed in batches called “blocks” about every 10 minutes.
- The network requires an expensive computation to be performed in order for the for transaction set to be committed to the public ledger.
- The computational cost protects the network against fraudulent transactions.
- The computation is a hash of the transaction data, the previous block’s hash, and a number called a “nonce”.
- The fun part: the hash must begin with N zeroes, where N determines the computational difficulty.
- The higher N is, the harder it is to find a nonce that produces a qualifying hash.
- Why? Because we don’t know a-priori what nonce will produce the needed number of zeroes in the hash, and must brute-force the computation by trying different nonces until one is found.
- The higher N is, the lower the number of qualified hashes, and therefore the harder it is to find a nonce.
- The network moves N up or down over time as described below.
- The people who do this work are called “miners” because the net result of their work is like mining gold.
- It is a competitive business.
- Only one miner can commit a block of transactions and get the reward.
- Miners race to be the first to commit a block, deploying electricity and hardware to gain bitcoins.
- The network adjusts N to maintain a pre-determined rate of bitcoin creation as hardware improves and miner interest fluctuates.
Imagine you’ve joined a startup as the tech lead. The founder has a prototype, which she built with a contractor. Conveniently, the contractor hosted the code on github, so you fork the repository and you’re off and running. Months of building go by. The contractor, while still friendly with everyone, has moved on.
One day, you go to push your latest commits to github, and you get an error message that the remote repository cannot be found. You log into github, and the repository is gone. All traces of it have disappeared.
What happened? It turns out that Github treats private repositories in a special and unexpected way: private forks disappear when their ancestor is deleted from github. So when the contractor, needing to free up space in his account, removed the prototype repository, all its children went with it. Caveat emptor.
This might sound scary, but since every git repository carries its history, it’s actually pretty straightforward to recover so long as you have an up to date clone of the repo handy. Here is the procedure:
- On github, create an empty private git repository having the same name as the old one, in the same github account as your fork.
- On a machine containing a checkout of the code, make a bare clone of the repo and mirror it to the re-created repo on github:
git clone --bare /path/to/code /tmp/repo.git
git push --mirror firstname.lastname@example.org:username/repo.git
- Now you can fetch, pull and push in the original checkout as if nothing happened.
Try this some time: when making spaghetti, use half regular noodles and half whole-wheat noodles. The latter have lots of fiber making for a hearty and filling meal, but for most sauces I find them to be a little too heavy. Cutting the whole wheat with regular pasta gives a light taste while retaining some of the good stuff. My kids, who normally eschew all things fibrous, barely notice the difference and happily wolf it down.
One more test. Sorry for the empty content flow. But if it works out, the net result will be more and better flow. How about them apples?