Elsie Street, west slope of Bernal Heights

Elsie Street, west slope of Bernal Heights

If you only buy one house in Bernal Heights this month it should be 94 Elsie Street on the west slope of the hill (I'm not biased, just happened to have lived there for nearly ten years!)

Boris: Make London a National Park!

Book reviews for March 2014

Growth Hacker Marketing: A Primer on the Future of PR, Marketing, and Advertising by Ryan Holiday

Growth Hacker Marketing: A Primer on the Future of PR, Marketing, and Advertising by Ryan Holiday

2/5

Very short. Not as grubby as I was expecting. You'd be better off just reading The Lean Startup.

 

More...

Vernal Equinox 2014

Vernal Equinox 2014

It's spring time in the northern hemisphere, autumn if your water flows the wrong way down the plughole. Rendered in Catfood Earth.

Commute failing to suck this morning...

Commute failing to suck this morning...

Presidio Theatre

Presidio Theatre

Personal Finger Daemon for Windows

Did you know that Windows still has a vestigial finger command with just about nothing left to talk to? One of my New Year's resolutions is to bring finger back and unlike the stalled webfinger project I need to make some progress. Here's some C# to run your own personal finger daemon... you just need to create a .plan file in your home directory (haven't done that for a while):

using System; using System.Diagnostics; using System.IO; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; namespace fingerd { static class Program { private const int FingerPort = 79; private const int MaxFingerCommand = 256; private const string PlanFile = ".plan"; private static readonly TcpListener _tcpListener = new TcpListener(
IPAddress.Any, FingerPort); static void Main() { _tcpListener.Start(); while (true) { TcpClient tcpClient = _tcpListener.AcceptTcpClient(); Thread clientThread = new Thread(ClientThread); clientThread.Start(tcpClient); } } static void ClientThread(object client) { NetworkStream clientStream = null; TcpClient tcpClient = client as TcpClient; if (tcpClient == null) { return; } try { byte[] command = new byte[MaxFingerCommand]; clientStream = tcpClient.GetStream(); int read = clientStream.Read(command, 0, command.Length); if (read == 0) { return; } ASCIIEncoding asciiEncoding = new ASCIIEncoding(); string commandText = asciiEncoding.GetString(command); int endOfCommand = commandText.IndexOf("\r\n",
StringComparison.InvariantCultureIgnoreCase); if (endOfCommand <= 0) { return; } string user = commandText.Substring(0, endOfCommand); if (string.Compare(user, Environment.UserName,
StringComparison.InvariantCultureIgnoreCase) != 0) { return; } string planPath = Path.Combine(Environment.GetFolderPath(
Environment.SpecialFolder.UserProfile), PlanFile); if (!File.Exists(planPath)) { return; } string plan = File.ReadAllText(planPath) + "\r\n"; byte[] planBytes = asciiEncoding.GetBytes(plan); clientStream.Write(planBytes, 0, planBytes.Length); } catch (Exception ex) { Debug.WriteLine(ex); } finally { if (clientStream != null) { clientStream.Close(); } tcpClient.Close(); } } } }

Book reviews for February 2014

Five Billion Years of Solitude: The Search for Life Among the Stars by Lee Billings

Five Billion Years of Solitude: The Search for Life Among the Stars by Lee Billings

4/5

Epic book about the origins, frequency and long term outlook of life in the universe.

 

More...

Skype for Android - Getting Closer

Skype for Android - Getting Closer

Skype for Android is finally getting there. Push support means that it is now useful for more than conditioning your battery. Conversation read status is mostly synced between different client instances which is a big time saver. I'm actually starting to use it.

There is one horrible usability crime. When you open the app you get a list of unread conversations. Your set your finger in flight to the first one and then notice an ad sliding down from the top of the screen. With horror you realize it's too late to change course and you hit the ad instead of the conversation.

I'm not complaining about Skype being ad supported here, but if you were going to try and design a UI to trick people into clicking ads you really couldn't do better than this. I expect better from Microsoft.

Other than this the only real complaint is that new posts to group messages sometimes make it through to the notification bar and sometimes don't. You have to run the app periodically to see if there is something new.

(previously, previously)

Pier 14

Pier 14

I Thought He Came With You
Robert Ellison's blog.

Bringing a SHIELD to a conker fight

Like Debate is an experiment in civilized online debate. Try a test debate or weigh in on the fate of the Oxford comma.

Blog Archives