Currently Reading - Olsen, Howey and McNally

June 30, 2013

The initial reading list for a week off includes three favorite topics: Programming, Sci-Fi and Photography. (Also, Culture.)

  • The Culture Code: An Ingenious Way to Understand Why People Around the World Live and Buy as They Do by Clotaire Rapaille - Heard about this one on some podcast. Seemed interesting. So, it's the current audiobook. Because the title is designed for Search Engine Optimization, no other description is necessary.
  • Design Patterns in Ruby by Russ Olsen - I've been picking up a little of the Ruby language over the past year. Would have done more except for a giant transition project at work that ate up most of my time. Hitting it harder now. Since actually reading a Design Patterns book is also on my list, this looks perfect.
  • Shift (Silo Saga - Volume 2) by Hugh Howey - The follow up to Wool which I read last year and really enjoyed. If you have a Kindle, you can read the first of the five parts of Wool free here. When you're done, pick up the Omnibus. It's a fun ride. It's also an example of success in self-publishing.
  • Sketching Light: An Illustrated Tour of the Possibilities of Flash by Joe McNally - Photography is the art of lighting. Mr. McNally is a master at the craft. There is always something new to learn from him.

Books I've Read

June 25, 2013

I started putting together a list of the books I've read along with basic ratings. Part of the idea is to remind myself of which ones are worth revisiting. Also, it's just fun to build the list. My rating systems is:

  • 1/4 - I actively recommend against this book. Do not waste your time.
  • 2/4 - Someone may get something out of it, but I didn't.
  • 3/4 - Pretty good. Glad I read it.
  • 4/4 - Really enjoyable and/or educational. Definitely recommended.
  • 5/4 - A reminder to myself to read this book again in the future.

A caveat with these ratings is that I'm making them now even for books I read decades ago. For example, I have "On A Pale Horse" by Piers Anthony as 4/4. I read that in middle school and remember really enjoying it. No idea if it would hold up today. But, that's half the fun of lists like this.

I've got a bunch more that I'll add over time. Until then, here's the first version of the list.

1984George Orwell4/4
2001: A Space OdysseyArthur C Clarke4/4
Adventures of Huckleberry FinnMark Twain3/4
Adventures of Sherlock HolmesSir Arthur Conan Doyle4/4
All Marketers Are Liars: The Power of Telling Authentic Stories in a Low-Trust WorldSeth Godin3/4
Art and Fear - Observations on the Perils (and Rewards) of ArtmakingDavid Bayles and Ted Orland3/4
Art of War, TheSun Tzu3/4
Autobiography of Benjamin FranklinSilence Dogood3/4
Basic WoodworkingEditors of Sunset Books4/4
Bearing an HourglassPiers Anthony3/4
Being a Green MotherPiers Anthony3/4
Blue Ocean StrategyW. Chan Kim and Renee Mauborgne5/4
Brand Against the MachineJohn Morgan3/4
Brave New WorldAldous Huxley4/4
Cat's CradleKurt Vonnegut3/4
Catching Fire: The Second Book of the Hunger GamesSuzanne Collins3/4
Children of the SkyVernor Vinge4/4
ContactCarl Sagan4/4
Conversion MarketingBryan Heathman1/4
Crush ItGary Vaynerchuk5/4
CryptonomiconNeal Stephenson4/4
Curve of the FutureEdward Passerini4/4
Diamond AgeNeal Stephenson5/4
Do Androids Dream of Electric Sheep?Philip K Dick3/4
Don't Make Me Think - A Common Sense Approach to Web UsabilitySteve Krug5/4
Down and Out In the Magic KingdomCory Doctorow3/4
Duck Tape MarketingJohn Jantsch5/4
DuneFrank Herbert5/4
E-Myth RevisitedMichael E. Gerber5/4
Ender's GameOrson Scott Card4/4
EnoughPatrick Rhone3/4
EonGreg Bear3/4
Fahrenheit 451Ray Bradbury4/4
Fire Upon the DeepVernor Vinge4/4
Forever War, TheJoe Halderman3/4
Forge of God, TheGreg Bear3/4
FoundationIsaac Asimov3/4
Four Hour WorkweekTimothy Ferris5/4
Fourty-eight Laws of PowerRobert Greene2/4
FrankensteinMary Shelley4/4
Free Prize InsideSeth Godin3/4
Free: The Future of a Radical PriceChris Anderson3/4
Get Things DoneDavid Allen5/4
Get Things Done LiveDavid Allen5/4
Getting to YesRoger Fisher and William Ury3/4
Girl with the Dragon Tattoo, TheStieg Larsson3/4
Handmaid's Tale, TheMargaret Atwood3/4
Harry Potter and the Chamber of Secrets (Book 2)J.K. Rowling3/4
Harry Potter and the Deathly Hallows (Book 7)J.K. Rowling3/4
Harry Potter and the Goblet of Fire (Book 4)J.K. Rowling3/4
Harry Potter and the Half-Blood Prince (Book 6)J.K. Rowling3/4
Harry Potter and the Order of the Phoenix (Book 5)J.K. Rowling3/4
Harry Potter and the Philosopher's Stone (Book 1)J.K. Rowling3/4
Harry Potter and the Prisoner of Azkaban (Book 3)J.K. Rowling3/4
Have Space-Suit Will TravelRobert A Heinlein3/4
Head First JavaKathy Sierra and Bert Bates3/4
Hitch Hiker's Guide to the GalaxyDouglas Adams4/4
How to Stay Motivated - The Goals ProgramZig Ziglar5/4
How to Stay Motivated: Developing the Qualities of SuccessZig Ziggler4/4
How to be a Programmer: A Short, Comprehensive, and Personal SummaryRobert L. Read3/4
Hunger Games, TheSuzanne Collins3/4
I Will Teach You To Be RichRamit Sethi3/4
I, RobotIsacc Asimov.4/4
Ignore EverybodyHugh MacLeod4/4
Incredible Secret Money Machine II, TheDon Lancaster5/4
Information Dashboard Design - The Effective Visual Communication of DataStephen Few5/4
Intelligent Entrepreneur, TheBill Murphy2/4
Lost World, TheMichael Crichton3/4
Magic of Thinking Big, TheDavid Schwartz5/4
Marketing for MillionsCanfield, Eker, Assaraf, Mandossian1/4
MasteryRobert Greene3/4
MeditationsMarcus Aurelius2/4
Mockingjay: The Final Book of The Hunger GamesSuzanne Collins3/4
NeuromancerWilliam Gibson5/4
On the RoadJack Kerouac3/4
On a Pale HorsePiers Anthony4/4
Paradox of Choice, The: Why More Is LessBarry Schwartz5/4
Pep Talk, The: A Football Story About The Business Of WinningKevin Elko and Robert L. Shook2/4
Postman, TheDavid Brin4/4
Practical Object-Oriented Design in Ruby An Agile PrimerSandi Metz3/4
Pragmatic Programer, The: From Journeyman to MasterDave Thomas | Andy Hunt5/4
Purple CowSeth Godin3/4
Quiet - The Power of IntrovertsBy Susan Cain5/4
Ready Player OneErnest Cline5/4
Referral Engine: Teaching Your Business to Market ItselfJohn Jantsch5/4
ReworkJason Fried, David Heinemeier Hansson3/4
Rich Dad, Poor DadRobert Kiyosaki5/4
Richest Man in BabylonGeorge Clason5/4
Scanner Darkly, APhilip K Dick3/4
Secrets of the Millionaire MindT. Harv Eker5/4
Seven Habits of Highly Effective PeopleStephen R. Covey3/4
Slaughterhouse FiveKurt Vonnegut4/4
Snow CrashNeal Stephenson4/4
Speaker for the DeadOrson Scott Card3/4
Starship TroopersRobert A Heinlein5/4
Stranger in a Strange LandRobert A Heinlein5/4
Stumbling on HappinessDaniel Gilbert3/4
ThunderstruckErik Larson4/4
To Kill a MockingbirdHarper Lee5/4
Unemployed MillionnaireMatt Morris1/4
Walden; or, Life in the WoodsHenry David Thoreau5/4
War of Art; Winning the Inner Creative BattleSteven Pressfield3/4
Wielding a Red SwordPiers Anthony3/4
With a Tangled SkeinPiers Anthony3/4
Wind Through the Keyhole, TheStephen King4/4
Wool Omnibus (vol. 1-5 - The Silo Saga)Hugh Howey4/4
Zen and the Art of Motorcycle MaintenanceRobert M. Pirsig3/4
Zero HistoryWilliam Gibson3/4

Secrets of Your Cable Modem

February 09, 2013

Most devices that connect to your home internet have miniature web sites built into them. These sites provide an interface to basic info and status updates. If you've ever setup a WiFi router, you probably used the baked in web site to do the configuration.

After having a new cable modem installed yesterday, I checked to see what the web interface offered. In my case, this was done by going to "". (If you're connected through a Motorola SURFBoard Cable Modem, that like will probably work. Otherwise, it probably won't. A quick search for the model number of any device will tell you the address of its site if it has one.)

This is what shows up:

I'm a little disappointed to see that "Initialize Baseline Privacy" is "Skipped". The way I understand it, that means that anyone on the street can snoop on each others regular web site traffic. This doesn't include banking sites or any other "secure" site. Still, it would be nice to have at least baseline privacy.

Most of the interface isn't helpful or even interesting unless you are a techie, but there is one nice feature. The ability to reboot/restart the cable modem without having to physically unplug it. Clicking on the "Configuration" link in the side bar brings up this page:

Just click that "Restart Cable Modem" button to reboot the cable modem. This is especially useful if it's in another room. If it starts acting flaky, a round trip away is no longer necessary to try the default first piece of tech advice: "Have you tried turning it off and on again?"

Back Up To Speed

February 09, 2013

I'm happy to report that my cable modem was replaced this morning. Running a speed test on the old one produced numbers like this:

The new one is considerably better and actually provides the bandwidth I'm paying for. Which is nice.

It took the service tech an hour or so of other troubleshooting before he replaced the modem. Everything I've heard indicates these cable modems being flaky and often need to be replaced. Cable companies could probably cut a fair chunk of time out of their service call time by switching out the cable modems earlier in the process. Especially when the customer (me in this case) is a techie and has already checked everything else.

This is not 15Mbps

February 06, 2013

Everyone in my community gets basic cable and internet through the home owners association. The internet provider offers upgrades to boost your speed from the base 1.5 Mbps to 10, 15 or 20, depending on how much you're willing to pay. I'm trying the 15 Mpbs level, but it does not work as advertised. Here's some typical results from

That 2.89 number in the middle is the one that's supposed to be ~15. After spending a fruitless hour on the phone with the support guy, a technician is now scheduled to come out later in the week. I would have dealt with this earlier, but I knew I'd have to burn time getting through the first level of support. Sadly, we don't yet live in a world where techies can utter the word "Shibboleet" and immediately get past the entry level support team.

(Other techies will enjoy the fact that I also did a little prep work by jacking directly into the cable modem with a Cat 6 cable. It still took four or five times to confirm to the support guy that I was, in fast, sure that I wasn't going through a router.)

Nice Code Formatting Conversion On Python Site

January 28, 2013

The documentation on the official Python site site has a nice little design feature in its code examples. Each one starts out formatted for Python's "interactive interpreter" and show the expected results. For example, this snippet from the Output Formatting section:

If you click the little "ยป>" symbol in the upper left corner, the code instantly jumps to a format suitable for being run in a file. The expected out also disappears making the snippet ready to copy and paste directly into a file.

That's an incredibly useful feature. Very nicely done, Python doc crew.

Partially Picking Up Python with Head First Python

January 27, 2013

After a long run with BBEdit and then TextMate, I have switched to using Sublime Text as my primary text editor and development tool. Like any good geek, the first thing I want to do is to customize the app to my liking. Sublime Text lets you do this with plugins. A huge array are available along with the option to write your own. I, of course, want to write my own.

The programming language Sublime Text uses for plugins is called "Python". Named not after the snake, but the British comedy troupe Monty Python. I've never used the language before, but any language the encourages making demos referencing Dead Parrots and Silly Walks gets automatic bonus points.

There's a tremendous number of online resources available to learn any programming language you can imagine. Python is no exception. After a brief survey, I didn't find a stand out recommendation. So, I decided to give "Head First Python" a try. The book's stated audience is people who already know how to program in another language. This fits the type of book I was looking for. No need to cover the most basic of basics that are the same across languages.

The first half of the book is pretty good, doing a nice job of gently introducing the various concepts. The biggest criticism of this portion is that the book spends a lot of time on examples for the command line interpreter. That is, pieces of code that disappear as soon as you close the window. That's fine for single lines of code, but when larger blocks are called for that doesn't make sense. Also, assuming that the reader really does know how to program in another language, they will be wanting to write actual applications. Spending a lot of time in the interpreter is a waste.

I can't speak to the second half of the book. I bailed out in chapter 8 (of 11) when the book prompts for the installation of the Android Phone Software Development Kit. While I can appreciate teaching a language in a way that includes real life examples, this is a bridge too far. My goal is to get up to speed with Python as quick as possible. Not to spend time installing and messing around with an entirely new device and development platform.

My next step was to read through the Official Python Tutorial. I had taken a look at this before picking up Head First Python, but it's more of a reference than a tutorial. With the first half of the Head First book freshly in my head, the official tutorial made an excellent follow up. I wish the Head First book had stuck to its main topic, but the combination of its first half and the official tutorial has gotten me started.

Capturing Python Log Output In A Variable

January 27, 2013

While working on a Sublime Text plugin, I needed to capture logging output in a variable so I could display it easily. For once, Stack Overflow1 didn't have an immediate solution. After a couple hours of hacking around, I came up with the following which I hope saves others the hassle of having to build it themselves.

import logging
import io

### Create the logger
logger = logging.getLogger('basic_logger')

### Setup the console handler with a StringIO object
log_capture_string = io.StringIO()
ch = logging.StreamHandler(log_capture_string)

### Optionally add a formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

### Add the console handler to the logger

### Send log messages. 
logger.debug('debug message')'info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

### Pull the contents back into a string and close the stream
log_contents = log_capture_string.getvalue()

### Output as lower case to prove it worked. 

Note that once you call '.close()', it's possible to run into problems if the same running process tries to call the function again.

This approach will work with external files too. If you assign the same logger (in this case 'basic_logger') it will output properly. For example, if you have an module in an external file called '' with the content:

import logging

def log_test():

	logger = logging.getLogger('basic_logger')

	logger.warning('Log note from external file')

All you have to do is import it as usual in your main file (e.g. import external_logger_test) and then call the function:


Of course, you have to do this before you call the log_contents = log_capture_string.getvalue(). That's where the log data stops flowing.

Links and Notes

  1. Stack Overflow - Friend to developers around the world. Far and away the most useful development research site there is.

Go To Index Page: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107

© Alan W. Smith
RSS Feed