Fixed conf bug master
authorGabriel Pérez-Cerezo <gabriel@gpcf.eu>
Mon, 28 Dec 2015 12:11:33 +0000 (13:11 +0100)
committerGabriel Pérez-Cerezo <gabriel@gpcf.eu>
Mon, 28 Dec 2015 12:11:33 +0000 (13:11 +0100)
21 files changed:
Geo::Hashing.3pm [new file with mode: 0644]
Makefile [new file with mode: 0644]
debian/changelog [new file with mode: 0644]
debian/compat [new file with mode: 0644]
debian/control [new file with mode: 0644]
debian/copyright [new file with mode: 0644]
debian/files [new file with mode: 0644]
debian/geohash-tool.debhelper.log [new file with mode: 0644]
debian/geohash-tool.substvars [new file with mode: 0644]
debian/geohash-tool/DEBIAN/control [new file with mode: 0644]
debian/geohash-tool/DEBIAN/md5sums [new file with mode: 0644]
debian/geohash-tool/usr/bin/geohash-tool [new file with mode: 0755]
debian/geohash-tool/usr/share/doc/geohash-tool/changelog.gz [new file with mode: 0644]
debian/geohash-tool/usr/share/doc/geohash-tool/copyright [new file with mode: 0644]
debian/geohash-tool/usr/share/man/man1/geohash-tool.1.gz [new file with mode: 0644]
debian/geohash-tool/usr/share/man/man3/Geo::Hashing.3pm.gz [new file with mode: 0644]
debian/geohash-tool/usr/share/perl5/Geo/Hashing.pm [new file with mode: 0644]
debian/rules [new file with mode: 0755]
debian/source/format [new file with mode: 0644]
geohash-tool
geohash-tool.1 [new file with mode: 0644]

diff --git a/Geo::Hashing.3pm b/Geo::Hashing.3pm
new file mode 100644 (file)
index 0000000..b9563c3
--- /dev/null
@@ -0,0 +1,203 @@
+.\" Automatically generated by Pod::Man 2.28 (Pod::Simple 3.28)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" Set up some character translations and predefined strings.  \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
+.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
+.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
+.\" nothing in troff, for use with C<>.
+.tr \(*W-
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.ie n \{\
+.    ds -- \(*W-
+.    ds PI pi
+.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
+.    ds L" ""
+.    ds R" ""
+.    ds C` ""
+.    ds C' ""
+'br\}
+.el\{\
+.    ds -- \|\(em\|
+.    ds PI \(*p
+.    ds L" ``
+.    ds R" ''
+.    ds C`
+.    ds C'
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el       .ds Aq '
+.\"
+.\" If the F register is turned on, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD.  Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{
+.    if \nF \{
+.        de IX
+.        tm Index:\\$1\t\\n%\t"\\$2"
+..
+.        if !\nF==2 \{
+.            nr % 0
+.            nr F 2
+.        \}
+.    \}
+.\}
+.rr rF
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
+.    \" fudge factors for nroff and troff
+.if n \{\
+.    ds #H 0
+.    ds #V .8m
+.    ds #F .3m
+.    ds #[ \f1
+.    ds #] \fP
+.\}
+.if t \{\
+.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+.    ds #V .6m
+.    ds #F 0
+.    ds #[ \&
+.    ds #] \&
+.\}
+.    \" simple accents for nroff and troff
+.if n \{\
+.    ds ' \&
+.    ds ` \&
+.    ds ^ \&
+.    ds , \&
+.    ds ~ ~
+.    ds /
+.\}
+.if t \{\
+.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.\}
+.    \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+.    \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+.    \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+.    ds : e
+.    ds 8 ss
+.    ds o a
+.    ds d- d\h'-1'\(ga
+.    ds D- D\h'-1'\(hy
+.    ds th \o'bp'
+.    ds Th \o'LP'
+.    ds ae ae
+.    ds Ae AE
+.\}
+.rm #[ #] #H #V #F C
+.\" ========================================================================
+.\"
+.IX Title "Hashing 3"
+.TH Hashing 3 "2015-10-18" "perl v5.20.2" "User Contributed Perl Documentation"
+.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH "NAME"
+Geo::Hashing \- Perl library to calculate Geohashing points
+.SH "SYNOPSIS"
+.IX Header "SYNOPSIS"
+.Vb 3
+\&  use Geo::Hashing;
+\&  my $g = new Geo::Hashing(lat => 37, lon => \-122, date => "2008\-05\-24");
+\&  printf "Today\*(Aqs location is at %.6f, %.6f.\en", $g\->lat, $g\->lon;
+.Ve
+.SH "DESCRIPTION"
+.IX Header "DESCRIPTION"
+This module allows calculating the locaiton of Geohashes as described 
+in http://wiki.xkcd.com/geohashing/Main_Page.
+.SH "METHODS"
+.IX Header "METHODS"
+.SS "new"
+.IX Subsection "new"
+Create a new Geo::Hashing object.
+.SS "lat"
+.IX Subsection "lat"
+Set or get the points latitude.  When settings, only the integer portion is
+considered.  Set to undef to just get the offset.
+.SS "lon"
+.IX Subsection "lon"
+Set or get the points longitude.  When settings, only the integer portion is
+considered.  Set to undef to just get the offset.
+.SS "date"
+.IX Subsection "date"
+Set or get the date used for the calculation.  Note that this is the actual
+date of the meetup in question, even when the 30w rule is in effect.
+.SS "djia"
+.IX Subsection "djia"
+Set or get the Dow Jones Industrial Average used for the calculation.  If not
+set, it will be automatically retrieved depending on the value of
+\&\f(CW$self\fR\->source.  If the data cannot be retrieved, undef will be returned.
+.SS "source"
+.IX Subsection "source"
+Set the source of the \s-1DJIA\s0 opening data.  Will load Geo::Hashing::Source::Name
+and call get_djia($date).  See Geo::Hashing::Source::Random for a sample.
+.SS "use_30w_rule"
+.IX Subsection "use_30w_rule"
+Set or get the 30w flag.  Will be set automatically if lon is set and is
+greater than \-30.
+.SS "debug"
+.IX Subsection "debug"
+Enable or disable diagnostic logging
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+Original comic: http://www.xkcd.com/426/
+.PP
+Wiki: http://wiki.xkcd.com/geohashing/Main_Page
+.PP
+\&\s-1IRC:\s0 irc://irc.xkcd.com/geohashing
+.SH "AUTHOR"
+.IX Header "AUTHOR"
+Dan Boger, <zigdon@gmail.com>
+.SH "COPYRIGHT AND LICENSE"
+.IX Header "COPYRIGHT AND LICENSE"
+Copyright (C) 2008 by Dan Boger
+.PP
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.10.0 or,
+at your option, any later version of Perl 5 you may have available.
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..803517b
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,21 @@
+MAN = geohash-tool.1 
+BINPATH=/usr/bin
+MANPATH=/usr/share/man
+PERLMODPATH=/usr/share/perl5
+
+%.1: %
+       pod2man $< > $@
+
+pm-man: Hashing.pm
+       pod2man Hashing.pm > "Geo::Hashing.3pm"
+build: $(MAN) pm-man
+install: $(MAN) pm-man
+       @mkdir -p $(DESTDIR)$(BINPATH)
+       @cp geohash-tool $(DESTDIR)$(BINPATH)
+       @mkdir -p $(DESTDIR)$(PERLMODPATH)/Geo
+       @cp Hashing.pm $(DESTDIR)$(PERLMODPATH)/Geo
+       @mkdir -p $(DESTDIR)$(MANPATH)/man1
+       @mkdir -p $(DESTDIR)$(MANPATH)/man3
+       @cp geohash-tool.1 $(DESTDIR)$(MANPATH)/man1
+       @cp Geo::Hashing.3pm $(DESTDIR)$(MANPATH)/man3
+
diff --git a/debian/changelog b/debian/changelog
new file mode 100644 (file)
index 0000000..74936d3
--- /dev/null
@@ -0,0 +1,28 @@
+geohash-tool (0.1.3+nmu1) jessie; urgency=medium
+
+  * Non-maintainer upload.
+  * Added libyaml-perl dependency
+  * Does not need a conffile to run (uses default one)
+
+ -- Gabriel Pérez-Cerezo <gpcf@gpcf.eu>  Mon, 28 Dec 2015 13:05:02 +0100
+
+geohash-tool (0.1.2+nmu1) jessie; urgency=medium
+
+  * Non-maintainer upload.
+  * Added dependencies (hopefully)
+
+ -- Gabriel Pérez-Cerezo <gpcf@gpcf.eu>  Tue, 15 Dec 2015 17:13:15 +0100
+
+geohash-tool (0.1.1+nmu1) jessie; urgency=medium
+
+  * Non-maintainer upload.
+  * The Program is called 'geohash-tool' not 'geohash.pl'
+  * Added Geo::Hashing manpage
+
+ -- Gabriel Pérez-Cerezo <gpcf@gpcf.eu>  Mon, 19 Oct 2015 11:21:11 +0200
+
+geohash-tool (0.1) jessie; urgency=medium
+
+  * Initial release. 
+
+ -- Gabriel Pérez-Cerezo <gpcf@gpcf.eu>  Sun, 18 Oct 2015 18:27:40 +0200
diff --git a/debian/compat b/debian/compat
new file mode 100644 (file)
index 0000000..ec63514
--- /dev/null
@@ -0,0 +1 @@
+9
diff --git a/debian/control b/debian/control
new file mode 100644 (file)
index 0000000..2e57010
--- /dev/null
@@ -0,0 +1,16 @@
+Source: geohash-tool
+Maintainer: Gabriel Pérez-Cerezo <gabriel@gpcf.eu>
+Section: misc
+Priority: optional
+Standards-Version: 3.9.6
+Build-Depends: debhelper (>= 9), perl
+
+Package: geohash-tool
+Section: misc
+Priority: optional
+Architecture: all
+Homepage: http://gpcf.eu
+Depends: ${perl:Depends}, ${misc:Depends}, libyaml-perl
+Description: Tool for Geohashing
+ A program that displays useful information for Geohasing. It
+ calculates the distance from your home to your graticule's geohash.
\ No newline at end of file
diff --git a/debian/copyright b/debian/copyright
new file mode 100644 (file)
index 0000000..6e13c8d
--- /dev/null
@@ -0,0 +1,3 @@
+Copyright (C) 2015 Gabriel Pérez-Cerezo (geohash-tool)
+Copyright (C) 2008 by Dan Boger (Hashing.pm)
+/usr/share/common-licenses/GPL-3
\ No newline at end of file
diff --git a/debian/files b/debian/files
new file mode 100644 (file)
index 0000000..11912a6
--- /dev/null
@@ -0,0 +1 @@
+geohash-tool_0.1.3+nmu1_all.deb misc optional
diff --git a/debian/geohash-tool.debhelper.log b/debian/geohash-tool.debhelper.log
new file mode 100644 (file)
index 0000000..3f72fc7
--- /dev/null
@@ -0,0 +1,17 @@
+dh_auto_configure
+dh_auto_build
+dh_auto_test
+dh_prep
+dh_auto_install
+dh_installdocs
+dh_installchangelogs
+dh_installman
+dh_perl
+dh_link
+dh_compress
+dh_fixperms
+dh_installdeb
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_builddeb
diff --git a/debian/geohash-tool.substvars b/debian/geohash-tool.substvars
new file mode 100644 (file)
index 0000000..bcb0957
--- /dev/null
@@ -0,0 +1,2 @@
+perl:Depends=perl
+misc:Depends=
diff --git a/debian/geohash-tool/DEBIAN/control b/debian/geohash-tool/DEBIAN/control
new file mode 100644 (file)
index 0000000..5abcfde
--- /dev/null
@@ -0,0 +1,12 @@
+Package: geohash-tool
+Version: 0.1.3+nmu1
+Architecture: all
+Maintainer: Gabriel Pérez-Cerezo <gabriel@gpcf.eu>
+Installed-Size: 66
+Depends: perl, libyaml-perl
+Section: misc
+Priority: optional
+Homepage: http://gpcf.eu
+Description: Tool for Geohashing
+ A program that displays useful information for Geohasing. It
+ calculates the distance from your home to your graticule's geohash.
diff --git a/debian/geohash-tool/DEBIAN/md5sums b/debian/geohash-tool/DEBIAN/md5sums
new file mode 100644 (file)
index 0000000..5b81fb2
--- /dev/null
@@ -0,0 +1,6 @@
+bb0eb8a0eac1d0270f79620e98cc8546  usr/bin/geohash-tool
+cc82ba8f561bbcf19e5504c6d9c4b50c  usr/share/doc/geohash-tool/changelog.gz
+0d28ad1f71f15de22d22d6203abed7d7  usr/share/doc/geohash-tool/copyright
+6b8af0e9906d929cea0e20d39a5ad933  usr/share/man/man1/geohash-tool.1.gz
+d243aa62d9fbc7636f9e8e361226e04f  usr/share/man/man3/Geo::Hashing.3pm.gz
+db78ed04b28df920896c2304a32af4ac  usr/share/perl5/Geo/Hashing.pm
diff --git a/debian/geohash-tool/usr/bin/geohash-tool b/debian/geohash-tool/usr/bin/geohash-tool
new file mode 100755 (executable)
index 0000000..f21ad92
--- /dev/null
@@ -0,0 +1,180 @@
+#!/usr/bin/perl
+
+# Copyright (C) 2015 Gabriel Pérez-Cerezo
+# This library is free software; you can redistribute it and/or modify
+# it under the same terms as Perl itself, either Perl version 5.10.0 or,
+# at your option, any later version of Perl 5 you may have available.
+
+=encoding utf8
+
+=head1 NAME
+
+
+geohash-tool - Get the geohash's location and its distance to your home or workplace
+
+=head1 SYNOPSIS
+
+geohash-tool [B<-d> I<DATE>] [B<-l> I<LAT.LON>]
+
+=head1 DESCRIPTION
+
+This script calculates the geohash's location for your graticule for
+any (past) date. Then it queries Openstreetmap and prints the place
+name. Finally, it prints the distance between your home (or any other
+point you specify) and the geohash, using spherical trigonometry.
+
+=head1 CONFIGURATION
+
+geohash-tool is configured using a YAML file located at F<~/.geohashrc.>
+It should look like this:
+
+    ---
+    lat: 0
+    lon: 1
+    0.1:
+      - name: Work
+        lat: 0.23142
+        lon: 1.2414921
+      - name: Home
+        lat: 0.1424439
+        lon: 1.2413813
+    0.3:
+      - name: Office
+        lat: 0.1424439
+        lon: 3.2413813
+
+Where lat: 0 and lon: 1 indicate your default graticule (can be
+overriden with the B<-l> switch). The places indicated below 0.1 and
+0.3 are the places to which the distance will be computed when looking
+for the Geohash in the 0,1 and 0,3 graticule, respectively.
+
+=head1 AUTHOR
+
+Gabriel Pérez-Cerezo - L<http://gpcf.eu>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (C) 2015 by Gabriel Pérez-Cerezo
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.10.0 or,
+at your option, any later version of Perl 5 you may have available.
+
+=cut
+use strict;
+use warnings;
+use Geo::Hashing;
+use Math::Trig;
+use POSIX qw(strftime);
+use diagnostics;
+use utf8;
+use YAML;
+use Getopt::Std;
+binmode(STDOUT, ":utf8");
+my $today;
+my $content;
+my $url;
+our %opts;
+### Read the configuration file:
+my $string;
+our $VERSION = 0.1.3;
+my $pi = 3.14159265358979;
+$Getopt::Std::STANDARD_HELP_VERSION = 1;
+my $default = "
+---
+lat: 0
+lon: 1
+0.1:
+  - name: Work
+    lat: 0.23142
+    lon: 1.2414921
+  - name: Home
+    lat: 0.1424439
+    lon: 1.2413813
+";
+sub HELP_MESSAGE {
+  print <<EOF;
+Usage: $0 [-d DATE] [-l LAT.LONG]\n
+DATE must have the following format: YYYY-MM-DD.
+DATE must be the current day or earlier.
+LAT and LONG are integers. They describe your graticule.
+Example:
+   Get the Geohash for 2014-03-12 for the 40,10 graticule:
+   $0 -d 2014-03-12 -l 40.10
+EOF
+}
+sub distance {
+  # gives a rough estimate of the distance to the geohash. Accuracy:
+  # +/- cos(angle between coordinates)*37/2pi. (about +/- 50 m for
+  # geohashing distances).
+  my ($lat1, $long1, $lat2, $long2) = @_;
+  my $a = deg_to_rad(90 - $lat1);
+  my $b = deg_to_rad(90 - $lat2);
+  my $C = deg_to_rad(abs($long1-$long2));
+  return acos(cos($a)*cos($b)+sin($a)*sin($b)*cos($C))*40040/(2*$pi);
+}
+
+sub read_conf {
+  local $/ = undef;
+  unless (open FILE, $ENV{"HOME"} . "/.geohashrc")
+    {
+      print "Couldn't open conf file: $!. Using default configuration: $default";
+      return $default
+    }
+  binmode(FILE, ":utf8");
+  $string = <FILE>;
+  close FILE;
+  return $string;
+}
+
+$string = read_conf();
+unless ($string =~ m/\n$/s) {
+  $string .= "\n";
+}
+my $data = Load $string;
+# parse CLI options
+getopts('d:l:', \%opts);
+# set date
+$today = $opts{d} if defined $opts{d};
+
+# set graticule
+if (defined $opts{l} and $opts{l} =~ m/^-?[0-9]{1,3}\.-?[0-9]{1,3}$/g) {
+  ($data->{lat}, $data->{lon}) = split /\./, $opts{l};
+}
+
+unless (defined $data->{lat} and defined $data->{lon}) {
+  die "Please create a configuration file in ~/.geohashrc. Like this: \n $default";
+}
+
+my $key = $data->{lat} . "." . $data->{lon};
+
+my @places = ();
+if (defined $data->{$key}) {
+  @places = @{$data->{$key}};
+}
+# Get the date
+unless ($today) {
+  $today = strftime "%F", localtime;
+}
+
+my $g = new Geo::Hashing(lat => $data->{lat}, lon => $data->{lon}, date => $today);
+
+sub deg_to_rad { ($_[0]/180) * $pi }
+printf "The Location for $today is at %.6f, %.6f.\n", $g->lat, $g->lon;
+
+use LWP::Simple;
+import LWP::Simple 'get';
+$url = sprintf "http://nominatim.openstreetmap.org/reverse?format=xml&lat=%.6f&lon=%.6f&zoom=18&addressdetails=1", $g->lat, $g->lon;
+unless (defined ($content = get($url))) {
+    die "could not get $url\n";
+  }
+$content =~ s/^.*<result[^>]*>(.*)$/$1/s;
+$content =~ s/<.*//s;
+printf "Location: $content\n";
+
+
+foreach (@places) {
+  printf "Distance from $_->{name}: %.3f km\n", distance($g->lat, $g->lon, $_->{lat}, $_->{lon});
+}
+
+
diff --git a/debian/geohash-tool/usr/share/doc/geohash-tool/changelog.gz b/debian/geohash-tool/usr/share/doc/geohash-tool/changelog.gz
new file mode 100644 (file)
index 0000000..bfe1534
Binary files /dev/null and b/debian/geohash-tool/usr/share/doc/geohash-tool/changelog.gz differ
diff --git a/debian/geohash-tool/usr/share/doc/geohash-tool/copyright b/debian/geohash-tool/usr/share/doc/geohash-tool/copyright
new file mode 100644 (file)
index 0000000..6e13c8d
--- /dev/null
@@ -0,0 +1,3 @@
+Copyright (C) 2015 Gabriel Pérez-Cerezo (geohash-tool)
+Copyright (C) 2008 by Dan Boger (Hashing.pm)
+/usr/share/common-licenses/GPL-3
\ No newline at end of file
diff --git a/debian/geohash-tool/usr/share/man/man1/geohash-tool.1.gz b/debian/geohash-tool/usr/share/man/man1/geohash-tool.1.gz
new file mode 100644 (file)
index 0000000..975ce88
Binary files /dev/null and b/debian/geohash-tool/usr/share/man/man1/geohash-tool.1.gz differ
diff --git a/debian/geohash-tool/usr/share/man/man3/Geo::Hashing.3pm.gz b/debian/geohash-tool/usr/share/man/man3/Geo::Hashing.3pm.gz
new file mode 100644 (file)
index 0000000..29cdc8f
Binary files /dev/null and b/debian/geohash-tool/usr/share/man/man3/Geo::Hashing.3pm.gz differ
diff --git a/debian/geohash-tool/usr/share/perl5/Geo/Hashing.pm b/debian/geohash-tool/usr/share/perl5/Geo/Hashing.pm
new file mode 100644 (file)
index 0000000..2c08c70
--- /dev/null
@@ -0,0 +1,344 @@
+#!/usr/bin/perl -w
+#
+# $Id: Hashing.pm 257 2008-06-25 02:02:19Z dan $
+#
+
+package Geo::Hashing;
+
+use strict;
+use warnings;
+use Carp;
+use Digest::MD5 qw/md5_hex/;
+
+our $VERSION = '0.06';
+
+=head1 NAME
+
+Geo::Hashing - Perl library to calculate Geohashing points
+
+=head1 SYNOPSIS
+
+  use Geo::Hashing;
+  my $g = new Geo::Hashing(lat => 37, lon => -122, date => "2008-05-24");
+  printf "Today's location is at %.6f, %.6f.\n", $g->lat, $g->lon;
+
+=head1 DESCRIPTION
+
+This module allows calculating the locaiton of Geohashes as described 
+in http://wiki.xkcd.com/geohashing/Main_Page.
+
+=head1 METHODS
+
+=cut
+
+=head2 new
+
+Create a new Geo::Hashing object.  
+
+=cut
+
+sub new {
+  my $class = shift;
+  my %p = @_;
+
+  my $self = {_lat => 0, _lon => 0, _dlat => 0, _dlon => 0, _debug => 0};
+  bless $self, $class;
+
+  $self->{_date} = sprintf("%04d-%02d-%02d", (localtime)[5]+1900, (localtime)[4]+1, (localtime)[3]);
+
+  {
+    no strict 'subs';
+    foreach (qw/debug source lat lon date use_30w_rule djia/) {
+      if (exists $p{$_}) {
+        $self->_log("Setting $_ to $p{$_}");
+        $self->$_($p{$_});
+      }
+    }
+  }
+
+  unless ($p{source}) {
+    $self->source('peeron');
+  }
+
+  $self->_log("Using", $self->source, "as the DJIA source");
+
+  return $self;
+}
+
+=head2 lat
+
+Set or get the points latitude.  When settings, only the integer portion is
+considered.  Set to undef to just get the offset.
+
+=cut
+
+sub lat {
+  my $self = shift;
+  my $lat = shift;
+
+  if (defined $lat) {
+    if ($lat =~ /^-?\d+(?:\.\d+)?$/ and $lat > -180 and $lat < 180) {
+      $self->{_lat} = $lat ne "-0" ? int($lat) : "-0";
+      $self->_update();
+    } else {
+      croak "Invalid latitude ($lat)!";
+    }
+  }
+
+  return undef unless defined $self->{_dlat} and defined $self->{_dlon};
+
+  return $self->{_lat} eq "-0" || $self->{_lat} < 0 ? 
+                     $self->{_lat} - $self->{_dlat} : 
+                     $self->{_lat} + $self->{_dlat};
+}
+
+=head2 lon
+
+Set or get the points longitude.  When settings, only the integer portion is
+considered.  Set to undef to just get the offset.
+
+=cut
+
+sub lon {
+  my $self = shift;
+  my $lon = shift;
+
+  if (defined $lon) {
+    if ($lon =~ /^-?\d+(?:\.\d+)?$/ and $lon > -180 and $lon < 180) {
+      $self->{_lon} = $lon ne "-0" ? int($lon) : "-0";
+      $self->_update();
+    } else {
+      croak "Invalid longitude ($lon)!";
+    }
+  }
+
+  return undef unless defined $self->{_dlat} and defined $self->{_dlon};
+
+  return $self->{_lon} eq "-0" || $self->{_lon} < 0 ? 
+                     $self->{_lon} - $self->{_dlon} : 
+                     $self->{_lon} + $self->{_dlon};
+}
+
+=head2 date
+
+Set or get the date used for the calculation.  Note that this is the actual
+date of the meetup in question, even when the 30w rule is in effect.
+
+=cut
+
+sub date {
+  my $self = shift;
+  my $date = shift;
+
+  if (defined $date) {
+    if ($date =~ /^\d\d\d\d-\d\d-\d\d$/) {
+      $self->{_date} = $date;
+      $self->djia(undef);
+      $self->_update();
+    } else {
+      croak "Invalid date ($date)!";
+    }
+  }
+
+  return $self->{_date};
+}
+
+=head2 djia
+
+Set or get the Dow Jones Industrial Average used for the calculation.  If not
+set, it will be automatically retrieved depending on the value of
+$self->source.  If the data cannot be retrieved, undef will be returned.
+
+=cut
+
+sub djia {
+  my $self = shift;
+  my $djia = shift;
+
+  if ($djia) {
+    if ($djia =~ /^\d+(?:\.\d+)?$/) {
+      $self->{_djia} = $djia;
+    } else {
+      croak "Invalid DJIA ($djia)!";
+    }
+  } elsif ($self->source) {
+    my $date = $self->date;
+#    if ($self->use_30w_rule) {
+    if ($self->{_lat} > -30) {
+      require Time::Local;
+      my ($y, $m, $d) = split /-/, $self->date;
+      my $time = Time::Local::timelocal(0, 0, 0, $d, $m-1, $y);
+      ($d, $m, $y) = (localtime($time - 24*60*60))[3,4,5];
+      $m++; $y += 1900;
+      $date = sprintf("%04d-%02d-%02d", $y, $m, $d);
+    }
+    $self->_log("Requesting", $self->source, "->DJIA($date)");
+    $self->{_djia} = $self->_get_djia($date);
+  } else {
+    $self->_log("No source set, can't automatically get DJIA");
+    return undef;
+  }
+  $self->{_djia} =~ s/ *$//g;
+  return $self->{_djia};
+}
+
+=head2 source
+
+Set the source of the DJIA opening data.  Will load Geo::Hashing::Source::Name
+and call get_djia($date).  See Geo::Hashing::Source::Random for a sample.
+
+=cut
+
+sub source {
+  my $self = shift;
+  my $source = shift;
+
+  if (defined $source) {
+    $self->_log("Loading source Geo::Hashing::Source::\u$source");
+    eval " require Geo::Hashing::Source::\u$source";
+
+    if ($@) {
+      croak "Failed to load Geo::Hashing::Source::\u$source: $@";
+    }
+
+    $self->{_source} = $source;
+    $self->_update();
+  }
+
+  if ($self->{_source}) {
+    return "Geo::Hashing::Source::" . ucfirst $self->{_source};
+  } else {
+    return undef;
+  }
+}
+
+=head2 use_30w_rule
+
+Set or get the 30w flag.  Will be set automatically if lon is set and is
+greater than -30.
+
+=cut
+
+sub use_30w_rule {
+
+  my $self = shift;
+  my $w30 = shift;
+  if (defined $w30) {
+    $self->{_30w} = $w30 ? 1 : 0;
+    $self->_update();
+  } elsif (defined $self->lon) {
+    if ($self->lon > -30) {
+      if (not $self->date) {
+        $self->{_30w} = 1;
+      } else {
+        my ($y, $m, $d) = split /-/, $self->date;
+        if ($y > 2008) {
+          $self->{_30w} = 1;
+        } elsif ($y == 2008 and $m > 5) {
+          $self->{_30w} = 1;
+        } elsif ($y == 2008 and $m == 5 and $d >= 27) {
+          $self->{_30w} = 1;
+        } else {
+          $self->{_30w} = 1;
+        }
+      }
+    } else {
+      $self->{_30w} = 0;
+    }
+  }
+  return $self->{_30w};
+}
+
+=head2 debug
+
+Enable or disable diagnostic logging
+
+=cut
+
+sub debug {
+  my $self = shift;
+  my $debug = shift;
+
+  if (defined $debug) {
+    $self->{_debug} = $debug ? 1 : 0;
+    $self->_log("Debug", $self->{_debug} ? "enabled" : "disabled");
+  }
+
+  return $self->{_debug};
+}
+
+# private methods
+# _update - given all the information in the object, calculate the day's
+#           offsets
+sub _update {
+  my $self = shift;
+
+  my $djia = $self->djia;
+  unless (defined $djia) {
+    $self->_log("Failed to get DJIA");
+    $self->{_dlat} = $self->{_dlon} = undef;
+    return undef;
+  }
+
+  $self->_log("DJIA for", $self->date, "is $djia");
+
+  my $md5 = md5_hex($self->date . "-" . $djia);
+  $self->_log(" - md5(". $self->date ."-$djia)");
+  $self->_log(" - md5 = $md5");
+
+  my ($md5lat, $md5lon) = (substr($md5, 0, 16), substr($md5, 16, 16));
+  $self->_log(" -     = $md5lat, $md5lon");
+  ($self->{_dlat}, $self->{_dlon}) = (0, 0);
+
+  while (length $md5lat) {
+    $self->{_dlat} += hex substr($md5lat, -1, 1, "");
+    $self->{_dlon} += hex substr($md5lon, -1, 1, "");
+    $self->{_dlat} /= 16;
+    $self->{_dlon} /= 16;
+  }
+
+  $self->_log(" dlat, dlon => $self->{_dlat}, $self->{_dlon}");
+}
+
+# _log - print out a timestampped log entry
+sub _log {
+  my $self = shift;
+
+  return unless $self->debug;
+
+  print scalar localtime, " - @_\n";
+}
+
+# _get_djia - call get_djia on from the current source
+sub _get_djia {
+  my $self = shift;
+
+  $self->_log("getting DJIA from", $self->source);
+  return $self->source->get_djia(@_);
+}
+
+=head1 SEE ALSO
+
+Original comic: http://www.xkcd.com/426/
+
+Wiki: http://wiki.xkcd.com/geohashing/Main_Page
+
+IRC: irc://irc.xkcd.com/geohashing
+
+=head1 AUTHOR
+
+Dan Boger, E<lt>zigdon@gmail.comE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (C) 2008 by Dan Boger
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.10.0 or,
+at your option, any later version of Perl 5 you may have available.
+
+
+=cut
+
+1;
+
diff --git a/debian/rules b/debian/rules
new file mode 100755 (executable)
index 0000000..707e486
--- /dev/null
@@ -0,0 +1,5 @@
+#!/usr/bin/make -f
+%:
+       dh $@
+override_dh_auto_install:
+       $(MAKE) DESTDIR=$$(pwd)/debian/geohash-tool install
diff --git a/debian/source/format b/debian/source/format
new file mode 100644 (file)
index 0000000..89ae9db
--- /dev/null
@@ -0,0 +1 @@
+3.0 (native)
index 1439ecd..f21ad92 100644 (file)
@@ -1,48 +1,31 @@
 #!/usr/bin/perl
 
 # Copyright (C) 2015 Gabriel Pérez-Cerezo
-
-# Permission is hereby granted, free of charge, to any person
-# obtaining a copy of this software and associated documentation files
-# (the "Software"), to deal in the Software without restriction,
-# including without limitation the rights to use, copy, modify, merge,
-# publish, distribute, sublicense, and/or sell copies of the Software,
-# and to permit persons to whom the Software is furnished to do so,
-# subject to the following conditions:
-
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
+# This library is free software; you can redistribute it and/or modify
+# it under the same terms as Perl itself, either Perl version 5.10.0 or,
+# at your option, any later version of Perl 5 you may have available.
 
 =encoding utf8
 
-=head1 geohash.pl
+=head1 NAME
 
 
-geohash.pl - Get the geohash's location and its distance to your home or workplace
+geohash-tool - Get the geohash's location and its distance to your home or workplace
 
 =head1 SYNOPSIS
 
-geohash.pl [B<-d> I<DATE>] [B<-l> I<LAT.LON>]
+geohash-tool [B<-d> I<DATE>] [B<-l> I<LAT.LON>]
 
 =head1 DESCRIPTION
 
 This script calculates the geohash's location for your graticule for
 any (past) date. Then it queries Openstreetmap and prints the place
 name. Finally, it prints the distance between your home (or any other
-point you specify) and the geohash.
+point you specify) and the geohash, using spherical trigonometry.
 
 =head1 CONFIGURATION
 
-geohash.pl is configured using a YAML file located at F<~/.geohashrc.>
+geohash-tool is configured using a YAML file located at F<~/.geohashrc.>
 It should look like this:
 
     ---
@@ -94,7 +77,7 @@ my $url;
 our %opts;
 ### Read the configuration file:
 my $string;
-our $VERSION = 0.1;
+our $VERSION = 0.1.3;
 my $pi = 3.14159265358979;
 $Getopt::Std::STANDARD_HELP_VERSION = 1;
 my $default = "
@@ -159,9 +142,10 @@ if (defined $opts{l} and $opts{l} =~ m/^-?[0-9]{1,3}\.-?[0-9]{1,3}$/g) {
   ($data->{lat}, $data->{lon}) = split /\./, $opts{l};
 }
 
-unless ($data->{lat} and $data->{lon}) {
+unless (defined $data->{lat} and defined $data->{lon}) {
   die "Please create a configuration file in ~/.geohashrc. Like this: \n $default";
 }
+
 my $key = $data->{lat} . "." . $data->{lon};
 
 my @places = ();
diff --git a/geohash-tool.1 b/geohash-tool.1
new file mode 100644 (file)
index 0000000..0432902
--- /dev/null
@@ -0,0 +1,187 @@
+.\" Automatically generated by Pod::Man 2.28 (Pod::Simple 3.28)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" Set up some character translations and predefined strings.  \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
+.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
+.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
+.\" nothing in troff, for use with C<>.
+.tr \(*W-
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.ie n \{\
+.    ds -- \(*W-
+.    ds PI pi
+.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
+.    ds L" ""
+.    ds R" ""
+.    ds C` ""
+.    ds C' ""
+'br\}
+.el\{\
+.    ds -- \|\(em\|
+.    ds PI \(*p
+.    ds L" ``
+.    ds R" ''
+.    ds C`
+.    ds C'
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el       .ds Aq '
+.\"
+.\" If the F register is turned on, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD.  Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{
+.    if \nF \{
+.        de IX
+.        tm Index:\\$1\t\\n%\t"\\$2"
+..
+.        if !\nF==2 \{
+.            nr % 0
+.            nr F 2
+.        \}
+.    \}
+.\}
+.rr rF
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
+.    \" fudge factors for nroff and troff
+.if n \{\
+.    ds #H 0
+.    ds #V .8m
+.    ds #F .3m
+.    ds #[ \f1
+.    ds #] \fP
+.\}
+.if t \{\
+.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+.    ds #V .6m
+.    ds #F 0
+.    ds #[ \&
+.    ds #] \&
+.\}
+.    \" simple accents for nroff and troff
+.if n \{\
+.    ds ' \&
+.    ds ` \&
+.    ds ^ \&
+.    ds , \&
+.    ds ~ ~
+.    ds /
+.\}
+.if t \{\
+.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.\}
+.    \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+.    \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+.    \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+.    ds : e
+.    ds 8 ss
+.    ds o a
+.    ds d- d\h'-1'\(ga
+.    ds D- D\h'-1'\(hy
+.    ds th \o'bp'
+.    ds Th \o'LP'
+.    ds ae ae
+.    ds Ae AE
+.\}
+.rm #[ #] #H #V #F C
+.\" ========================================================================
+.\"
+.IX Title "GEOHASH-TOOL 1"
+.TH GEOHASH-TOOL 1 "2015-12-28" "perl v5.20.2" "User Contributed Perl Documentation"
+.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH "NAME"
+geohash\-tool \- Get the geohash's location and its distance to your home or workplace
+.SH "SYNOPSIS"
+.IX Header "SYNOPSIS"
+geohash-tool [\fB\-d\fR \fI\s-1DATE\s0\fR] [\fB\-l\fR \fI\s-1LAT.LON\s0\fR]
+.SH "DESCRIPTION"
+.IX Header "DESCRIPTION"
+This script calculates the geohash's location for your graticule for
+any (past) date. Then it queries Openstreetmap and prints the place
+name. Finally, it prints the distance between your home (or any other
+point you specify) and the geohash, using spherical trigonometry.
+.SH "CONFIGURATION"
+.IX Header "CONFIGURATION"
+geohash-tool is configured using a \s-1YAML\s0 file located at \fI~/.geohashrc.\fR
+It should look like this:
+.PP
+.Vb 10
+\&    \-\-\-
+\&    lat: 0
+\&    lon: 1
+\&    0.1:
+\&      \- name: Work
+\&        lat: 0.23142
+\&        lon: 1.2414921
+\&      \- name: Home
+\&        lat: 0.1424439
+\&        lon: 1.2413813
+\&    0.3:
+\&      \- name: Office
+\&        lat: 0.1424439
+\&        lon: 3.2413813
+.Ve
+.PP
+Where lat: 0 and lon: 1 indicate your default graticule (can be
+overriden with the \fB\-l\fR switch). The places indicated below 0.1 and
+0.3 are the places to which the distance will be computed when looking
+for the Geohash in the 0,1 and 0,3 graticule, respectively.
+.SH "AUTHOR"
+.IX Header "AUTHOR"
+Gabriel Pe\*'rez\-Cerezo \- <http://gpcf.eu>
+.SH "COPYRIGHT AND LICENSE"
+.IX Header "COPYRIGHT AND LICENSE"
+Copyright (C) 2015 by Gabriel Pe\*'rez\-Cerezo
+.PP
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.10.0 or,
+at your option, any later version of Perl 5 you may have available.