Saturday, September 17, 2011

WAV fixer

What happens when you lose power during recording? Well... This little tool fixes the length information in the WAV file header. To use it, just run `python 1.wav 2.wav ...`

Unlike similar tools, it won't barf or corrupt your file if it has extra data in the header. But make a backup anyway.

Tuesday, October 5, 2010

Real-time data for all local bus and *subway* transit

MBTA just released subway predictions (except for Green Line; they don't have that data themselves!). And EZRide just activated their trackers too. So where do you want to go? :)

Example queries: Red Line / 1 / CT1, Next train at Kendall, Next Tech Shuttle at TangNext EZRide at SidPac
It's all just APIs, so other services can get that data too, e.g., for MIT and
for MBTA. (I use BostonBusMap on Android.)

Tuesday, September 14, 2010

Sunday, July 18, 2010

Recording both sides of a Skype convo (OS X)

Cracked it, without Audio Hijack. 1. Install SoundFlower. 2. In Audio/MIDI Setup, create an aggregate device (the "+" button) containing SoundFlower and your input device. 3. Launch Soundflowerbed, select your main output under "Soundflower (2ch)". 4. Set Skype to output to Soundflower (2ch) (leave the input as-is). 5. In Logic/Live/GarageBand, set the input to the aggregate device. Create 2 stereo channels, and make a test call.

Now that I knew what to look for, I found that someone already figured this out.

This should also work for Google Talk or Gizmo5 or any other VoIP app where you can set the audio output. In fact, if you set your default audio output in Audio/MIDI Setup to Soundflower, that should make everything else just work.

Monday, June 1, 2009

Verizon Family and Friends: By the Numbers

You could guess what your 10 most called are, or you could measure. Guess what I prefer. Find the "Download SpreadSheet" (sic) option on the Verizon site, and pipe it through some Python like this;

import csv, operator
calls = list(csv.DictReader(open('/home/kcarnold/Desktop/VoiceDetails.action'),
not_in = [c for c in calls if 'M2MAllow' not in c['Usage Type']]
minutes = {}
for call in not_in:
   number, mins = call['Number'], int(call['Minutes'])
   minutes.setdefault(number, 0)
   minutes[number] += mins
sorted(minutes.items(), key=operator.itemgetter(1))

Wednesday, December 10, 2008

Jesus is Precious

The apostle Peter says, "To you who believe . . . [he] is precious" (1 Peter 2:7). The grace of God makes Christ precious to us, so that our possessions, our money, our time [and our abilities -ken] have all become eternally and utterly expendable. They used to be crucial to our happiness. They are not so now.
 Tim Keller, Ministries of Mercy, page 63 (The Motivation for Mercy: Grace and Generosity)

Sunday, November 2, 2008

Sword Project Bible Reader in Python updated

I've updated and finished the core functionality for a pure Python reader for SWORD Bible modules (hosted on github). I had previously posted an initial proof-of-concept, and now figured out how to map references to keys.

Still to do: OSIS rendering, abbreviation processing, and the sort of convenience stuff that a frontend would want (Next/Previous, etc.).