AT&T now unlocks iPhones
I just chatted with an AT&T support person through their web site and got my iPhone unlocked (well, I got the support request in, supposedly I’ll get an unlock code by May 8).
Wait, what’s that? … I won the lottery? … Ok, whatever.
AT&T just unlocked my iPhone!
Tracking down potential bug in PyISAPIe
Brushing up on my C skills…
Resentment
Resentment is what happens when you fail to honor a request that I never made.
Take an encyclopedia with you wherever you go
I’m working on a new project: Putting 45,000 Wikipedia articles on a USB stick for offline use, e.g. for doing research while traveling on a plane, train, bus or in the car (preferably not while driving).
It’s for sale now at http://www.wikiusb.com/ - check it out!
Shenandoah National Park Oral History Collection
A project I’ve worked on over the last few years is now online at http://mdid.cit.jmu.edu/snp/. It is a collection of oral history recordings and transcripts, delivered through a custom interface built on MDID3.
See the official announcement at http://www.jmu.edu/jmuweb/general/news/general11933.shtml.
Udacity CS373 Localization Problem
I’m taking the Udacity CS373 Programming a Robotic Car class. Below is my solution to the localization homework problem in unit 1 that was due yesterday. Note that this is not the complete program, just the homework portion.
world_width = len(colors[0])
world_height = len(colors)
p = [[1. / (world_width * world_height)] * world_width
for i in range(world_height)]
def sense(p, Z):
q = [
[
pcol * (sensor_right if scol == Z else (1 - sensor_right))
for pcol, scol in zip(prow, crow)
]
for prow, crow in zip(p, colors)
]
norm = sum(sum(row) for row in q)
return [[col / norm for col in row] for row in q]
def move(p, motion):
ym, xm = motion
return [
[
p_move * p[(y - ym) % world_height][(x - xm) % world_width]
+ (1 - p_move) * p[y][x]
for x in range(world_width)
]
for y in range(world_height)
]
for me, mo in zip(measurements, motions):
p = move(p, mo)
p = sense(p, me)Instead of looping, I make use of list comprehensions, which I think is a cleaner solution.
Pivotal Tracker
Just started playing with Pivotal Tracker for a side project.
People who say it cannot be done…
People who say it cannot be done should not interrupt those who are doing it.
Lazy objects in Django
Working on one of my Django projects, I created a new context processor to populate some template context variables. One of them was a list of values pulled from the database that was only used on a few pages, so I tried to wrap it in a SimpleLazyObject:
from django.utils.functional import SimpleLazyObject
def current_presentation(request):
presentation = SimpleLazyObject(lambda: fetch_current_presentation(request.user))
presentation_records = SimpleLazyObject(lambda: list(presentation.items.values_list('record_id', flat=True).distinct()))
return {
'current_presentation': presentation,
'current_presentation_records': presentation_records,
}That unfortunately does not work:
django.template.TemplateSyntaxError TemplateSyntaxError: Caught TypeError while rendering: argument of type 'SimpleLazyObject' is not iterable
The problem is that the SimpleLazyObject wrapper does not implement an __iter__ method, so a wrapped object that is iterable loses that property.
The fix: a new subclass of SimpleLazyObject:
class IterableLazyObject(SimpleLazyObject):
def __iter__(self):
if self._wrapped is None: self._setup()
return self._wrapped.__iter__()Done!

