Implementations

From Geohashing
Revision as of 00:25, 25 May 2008 by imported>Tjtrumpet2323

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.

Official Implementations

  • Note: There is some confusion as to how the official implementations handle the -0 Issue.

Interactive Coordinate Calculator

This implementation IS PARTIALLY 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.

  • Note: As of 20:15, 24 May 2008 (UTC), this implementation incorrectly applies the 30W Time Zone Rule backwards to dates prior to its effect on May 27, 2008. This affects graticule maps from old meetups on the wiki, among other things.

Reference Implementation

This implementation IS NOT 30W-compliant.

A reference implementation is available:

view download

MediaWiki Implementation

This implementation IS NOT 30W-compliant.

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.

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 NOT 30W-compliant.

Geohash Recommender

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.[citation needed] 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 :)
  • This seems to generate a different location than the official GeoHash algorithm in nearly all cases!
    • It does? I just tried boston for todays date and it seems to work? can you give me an example? It Gives the correct answer and then recommends an alternative. The alternative is not in your graticule, its in a neighbrouring one. Thats sorta the point though. The idea is to give other viable geohashes you could visit if your one is in the sea for a day or too far away or something... SinJax
  • 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...
    • Also gives coordinates with the same fractions both east and west of -30lon for May 27-29, showing that it is still not yet compliant with the 30W Time Zone Rule. --Tim P 21:29, 24 May 2008 (UTC)
      • yes working on this one ;)

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!

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