Implementations
If you're looking to code your own utilities, you will need a source that provides the Dow's opening price for any given day. Details on such services are available at Dow Jones Industrial Average.
Contents
Official Implementations
- Note: There is some confusion as to how the official implementations handle the -0 Issue.
Interactive Coordinate Calculator
This implementation IS FULLY 30W-compliant. |
The original sample interactive coordinate calculator can be found at http://irc.peeron.com/xkcd/map. The common URL, http://xkcd.com/geohashing, redirects here.
Reference Implementation
This implementation IS FULLY 30W-compliant. |
A reference implementation is available:
It cannot automatically apply the 30W rule, as it doesn't take your location into consideration. Just run it with the DJIA opening of the date it should take into account, and it will yield the correct results.
MediaWiki Implementation
This implementation's 30W-compliance is tied to that of another implementation. See notes. |
MediaWiki half-implementation (for use by template creators).
Python Implementation
This implementation IS FULLY 30W-compliant. |
import hashlib, datetime, struct, urllib, re, sys date = datetime.date.today() djia = urllib.urlopen((date - datetime.timedelta(w30)).strftime("http://irc.peeron.com/xkcd/map/data/%Y/%m/%d")).read() if djia.find('404 Not Found') >= 0: sys.exit(sys.stderr.write("Dow Jones not available yet.\n")) sum = hashlib.md5("%s-%s" % (date, djia)).digest() print struct.unpack(">Q", sum[0:8])[0] / (2.**64), struct.unpack(">Q", sum[8:16])[0] / (2.**64)
- In the above,
w30
on line 3 should be replaced by 1 if you're east of -30°, and with 0 otherwise. - As
md5
has been deprected in favor ofhashlib
since python 2.5, if you are using python 2.4 or earlier, substitudehashlib
formd5
.
Python package xkcd.geohash
This implementation IS NOT 30W-compliant. |
There is also a Python package xkcd.geohash
which is independent of the interactive coordinate calculator (but uses Google Finance as well).
Shell Script Implementation
This implementation IS FULLY 30W-compliant. |
#!/bin/zsh DOW=$(wget -qO- http://irc.peeron.com/xkcd/map/data/$(date +%Y/%m/%d)) [[ "$DOW" != +([0-9.]) ]] && echo "DOW not available yet." && exit 1 MD5=$(echo -n "$(date -dW30 +%Y-%m-%d)-$DOW"|md5sum|cut -d' ' -f 1|tr a-f A-F) echo "$1$(echo 10k16i0.${MD5:0:16}p|dc), $2$(echo 10k16i0.${MD5:16}p|dc)"
The -dW30
on line 4 should be replaced with -dyesterday
if you're east of -30°, and with -dtoday
otherwise.
Alternative geohash location suggester
This implementation IS FULLY 30W-compliant. |
Yet another implementation in Python is here as well. It does the same as the ones above but also gives "validation" information. Lets you know if the geohash location is under water and thus if its a valid place to go party. Using this it attempts to suggest the "best" alternative geohash by checking all neighbouring grid locations. I'll add more terrain recognition if people like it. A webservice to access it can be found JSON Web Service. The code is over here Source Code
Bugs
- There are a few, it needs a few refreshes to get the whole tagging right. It also has trouble guessing the terrain type occationally. Refreshing it makes it work but its a problem im looking into, have a look at the code and help if you can :)
- Gives me a false location for May 28 and 29, 2008, which aren't yet known anywhere in the world according to the algorithm. --Tim P 21:29, 24 May 2008 (UTC)
- But... thos dates aren't real yet. There is no dow result. Granted it should give an error instead of giving _something_ but...
- As of 05:06, 26 May 2008 (UTC), this gives locations for May 27-30 west of 30W and for May 28-31 east of 30W, i.e., four days beyond what should be calculable as of that time. Beyond those dates, it gives a proper error message stating that no Dow is available. I think temporary data were added to the implementation for testing purposes; these should be removed. --Tim P
- But... thos dates aren't real yet. There is no dow result. Granted it should give an error instead of giving _something_ but...
Comic Creator
This implementation IS FULLY 30W-compliant. |
A python class to recreate the original comic, but for any given date with your own coordinates! Below shows the comic for the first North East Netherlands meetup. Although it fetches the Dow itself, you can add &dowjones=12345.67
if it doesn't do so correctly (e.g., peeron.com is down).
http://www.astro.rug.nl/~buddel/cgi-bin/geohashingcomic/geohashingcomic.cgi?year=2008&month=5&day=24&lon=6.566854&lat=55.218512
You can download the script as well if you wish.
Bugs
- Pads Dow values less than 10,000.00 with leading zeroes.
- From the Algorithm I figure that it indeed should not be padded at all. This can be considered a bug in the the original comic as well, since it clearly has 'boxes' for 5+2 digits for the Dow (which were kinda hard to fit into actually).
- I'd say it's akin to all the bank cheques with "19__" printed on them being used in 2000. The "form" has 5+2 "boxes" because that's how Dow prices are now, but that doesn't mean it can't be different. In any case, I'd say the official calculator's use of the Algorithm would hold in this case, as this is how most other implementations handle Dow values under 10k. --Tim P 16:09, 25 May 2008 (UTC)
- From the Algorithm I figure that it indeed should not be padded at all. This can be considered a bug in the the original comic as well, since it clearly has 'boxes' for 5+2 digits for the Dow (which were kinda hard to fit into actually).
- The font sizes are not exactly as the original.
GeoRSS feed
This implementation IS NOT 30W-compliant. |
You can subscribe to a feed (in GeoRSS format) that will give you updates on a daily basis[citation needed]. Updates include the "best guess" address of the location as well as the specific latitude/longitude coordinates.
http://atlas.freshlogicstudios.com/Features/Experiments/Xkcd/Xkcd.ashx?Latitude=38&Longitude=-91
For example, here's the GeoRSS geohash for St. Louis.
This GeoRSS feed is used to power the Atlas geohash implementation.
Atom feed
This implementation IS NOT 30W-compliant. |
You can subscribe to a feed that will give you updates on a daily basis:
http://staticfree.info/geohash/atom/LAT,LON
For example, here's the Atom Geohash for Boston.
Just put your coordinates in, subscribe and you'll be ready to go!
Bugs
- I noticed yesterday that before the stock exchange data becomes available, the atom feed creates a kind of 'intemediary' geohash using todays date and yesterday's data. This might be intentional, but personally I find that undesirable on weekdays. Could it be modified to show yesterday's date and geohash until data is available? Nicktaylor 14:04, 23 May 2008 (UTC)
k4 implementation
This implementation IS NOT 30W-compliant. |
Here's an implementation in k4, a vector-programming (i.e., self-obfuscating) language that seems to me to be very true to the spirit of xkcd. The following shell script takes the graticule as an argument, uses standard standard unix tools to retrieve the current Dow opening price, and returns a URL for a Google map to the the upcoming Saturday's meetup. It assumes the q executable is in your PATH.
#!/bin/sh test $# -eq 2 || exit 1 dow=`curl -s 'http://finance.google.com/finance?cid=983582'| \ egrep -o '<span id="ref_983582_op">[^<]+</span>'| \ sed -r 's/.*>(.*)<.*/\1/'|tr -d ,` q -lat $1 -lon $2 -dow $dow<<"EOF" \ (.q.set').(!:;,/)@\:.Q.opt .z.x; h:.Q.n,6#.Q.A;c:16 xexp'-:'1+!16 u:"http://maps.google.com/maps?q=" d:.q.ssr[$.z.D+7-.q.mod[.z.D]7;".";"-"] s:0N 16#,/$-15!"-"/:(d;dow);l:(lat;lon) -1@u,"+"/:l,'1_'$sum'(h?/:.q.upper s)*\:c; \\ EOF
For example, here's New York as of 2008-05-23:
% gh 40 -74 http://maps.google.com/maps?q=40.126648+-74.5475331
N.B., this was written on a Friday; I make no guarantee that it will produce useful results when run on any other day of the week (though Saturdays will probably work).
Adavies42 20:50, 23 May 2008 (UTC)
Automatic GPX File Generator
This implementation IS NOT 30W-compliant. |
I have modified the sample perl implementation so that it automatically generates a .gpx file which you can upload to your favourite GPS device/software. Download here Before you use the script, you need to modify it and put your own lat/lon values into the corresponding variables at the beginning. ~~Wansti
Semi-manual offline calculator
This implementation IS FULLY 30W-compliant. |
If you're going to be away from internet access, you'll need to compute the hash locally:
- Download and extract this: http://lab.brainonfire.net/drop/geohash-offline.zip
- Working example: http://lab.brainonfire.net/geohash-offline/calc.html
Notes
- All you need is a Javascript-enabled browser. Tested in Firefox so far.
- The DJIA can be acquired by texting "stock DJI" to "GOOGLE" (466453) while trading is closed. [1] This will get you the next opening value.
- Issue: This is actually the closing value, which is not the same as the next opening value. [2]
- The date is filled in automatically using the current timestamp.
- You'll have to combine the computed fractional coordinates with your graticule coordinates yourself.
- I grabbed MD5 and base conversion code from random internet sites.
- Remember, if you're east of 30W, you should use the previous day's opening price, even if a new one becomes available later in the day.