Saturday, January 31, 2015

Blogging Again?

Given that the last post on this blog was made in 2008, you might think I had forgotten about it entirely. I haven't forgotten. I want to write again.

Diana told me about, and I gave it a try. I've typed out 750+ words every morning for that last 12 days. My joint pains and mental fog have decreased each day! I'm breaking through into a new realm of consciousness! Just kidding, but it has been nice.

I like the name of this blog, and I like the banner image that I made for it (seven years ago!). The name "shiftpop" sounds like a musical micro-genre, and also like an instruction in a stack-based programming language. In 2008 when I started this blog, I was at the apex of my cellular automata (the banner image) and non-mainstream programming languages (the blog name) phase.

I'm a bit nostalgic for that era, but I don't expect to write about either of those topics now. I do intend to write about technical issues, but I'm more likely to write about computer graphics and hardware verification.

Tuesday, December 30, 2008

PHP's strtotime

I generally think of PHP as the buck-toothed high-school drop-out sibling of Perl (itself the unbathed cousin of Python and Ruby). But today I discovered the library function strtotime, which is a very flexible parser for text expressing a date/time. One cool example is a snippet that calculates the current year's Thanksgiving day.

The closest Python equivalent to strtotime seems to be dateutil.parser.parse, though it's much less flexible from a cursory glance. Of course, if a person is only trying to compute "common moveable Christian feasts that can be deduced from the date of Easter Sunday" they need look no further than the mx.DateTime.Feasts library (which includes translations into German and French). Weird. And awesome.

Friday, December 5, 2008

Not Lazy Enough

It occurred to me that many performance problems when dealing with large datasets are due to programs not being "lazy enough". My example problem was "ALTER TABLE" statements in a database, which in most implementations will read, modify, and write every row in the table. Because with large tables this is a significant performance hit, we rarely see people doing "dynamic language things" i.e. altering their schemas in application logic.

One reason for being non-lazy (some say: strict) is to ensure consistency across your dataset. If exact consistency is not a requirement, object/document stores like CouchDB or AppEngine's datastore can provide inexpensive "ALTER TABLE" behavior. With these systems, outdated/unaltered rows only need to be upgraded/altered when they're fetched from the datastore. Here's a case where deferring the "ALTER TABLE" code allows us to write more flexible/dynamic programs because our data management is lazier.

Code can be too lazy though, resulting in bad caching behavior and sometimes huge memory space growth.

Any other examples of cases where laziness/demand-driven-evaluation would be a performance win?

Friday, October 10, 2008

Ten Years of Progress

"I'm afraid this is very bad. The stones tell me the boar god came from far to the west."

Hello from October 10th 2008. The Dow Jones Industrial Average closed yesterday at 8,579 which is a little bit under its close of 8,643 on March 10th 1998.

Does this mean that the global economy could have been put on hold ten years ago and life would be just the same today?
Probably not. People have to eat.

Does it mean that ten years worth of free market profit motive could have been thrown out the window, that executives could have been told to just keep 'er runnin' and life would be just the same as today?
Probably not. There have been winners and losers, and markets have adjusted for changing consumer preferences over the decade.

I don't know what it means.
But it does seem like an appropriate time to ask:
"Have we been making progress?"

I think that the answer is: Yes!

Though we may have to scale down our retirement plans, and start buying the less expensive brand of veggie burgers, our Wikipedia Content Index (WCI) just keeps growing:

And lest we ignore the importance of emerging global cute funds, think of how far we've come since 1998: a world without lolcats.

Thursday, September 25, 2008

Compiling x264 with MP4 support on OS X

I've been wanting to futz around with the internals of a modern video codec, and since H.264 seems like a pretty happening codec, and the x264 project seems pretty awesome, I downloaded their source and tried compiling it on my Mac. I hit a few roadbumps, so here are instructions for anyone else who wants to compile x264 on OS X:

open gpac # lazy-man's untar
git clone git:// x264
cd gpac
find . -name os_net.c | xargs perl -pi -e 's/u_long/unsigned long/g'
make lib
make install-lib

cd ../x264
./configure --enable-mp4-output

Then, to test that everything worked, run this:

./x264 -v -q 20 -o foreman.mp4 foreman_part_qcif.yuv 176x144
open foreman.mp4

If you don't have git installed, you can find a nightly tarball of the x264 source code at Hope this helps someone!

Tuesday, September 2, 2008

Growing Triangle Vines

When I was in school I was addicted to making Processing sketches. I haven't been as active recently, but made these in the past month and a half.

The first is a visualization of a geometric computation that we used in the ICFP contest: Arcsin of R / D

And the second comes from a pen-and-paper sketch made on a legal pad during my WTC tenure: Iconic Growing Triangles

Tuesday, August 26, 2008

Persistent Refactorings

Refactorings are usually one-shot deals, triggered through an IDE, saved, committed, forgotten.

Imagine for a moment though, that your revision control system was aware of refactorings, and recorded the refactoring command itself, not just the source text changes. You (or your IDE) might run this command:

svn refactor pullup myFunction

Which would record the refactoring and which could be used to inform merges with other branches. Everyone loves easier merges of course, but if your automatic merge of two significantly-differently-structured-branches was nearly flawlessness, it would be possible to support two functionally equivalent, but architecturally different branches over a long timespan. In practice you could commit to either branch, and then pull from the other branch, relying on your version control system to refactor your changes so that the merge succeeded.

Why do this?

Perhaps you have a refactoring that reduces code-duplication but makes your codebase less readable, scannable, coherent. In this case you can branch and refactor, ending up with one easy-to-read branch, and one safe-to-modify-without-fear-of-missing-a-copy-pasted-version-of-the-same-function-in-another-module branch. Because the refactorings that we're considering here don't change the code functionally, these aren't really even branches, but simply two views on the same trunk.

What other cases can you see this being handy for?