Weblog Tomasza Przechlewskiego [Zdjęcie T. Przechlewskiego]


scrum
random image [Photo gallery]
Zestawienie tagów
1-wire | 18b20 | 1wire | 2140 | 3rz | alsamixer | amazon | anniversary | antypis | apache | api | applebaum | arm | armenia | astronomy | asus | atom.xml | awk | aws | bachotek | bakłażan | balcerowicz | balta | bash | batumi | berlin | bibtex | bieszczady | biznes | blogger | blogging | blosxom | bono | borne-sulinowo | breugel | bt747 | budapeszt | bursztyn | canon | cedewu | chello | chiller | chillerpl | chown | chujowetaśmy | ciasto | cmentarz | contour | cron | css | csv | curl | cycling | d54250wykh | dbi | debian | dejavu | dhcp | dht22 | dia | docbook | dom | ds18b20 | dulkiewicz | dyndns | dynia | ebay | economy | ekonomia | elka | elm | emacs | emacs23 | english | erasmus | erasmusplus | ess | eu | excel | exif | exiftool | f11 | fc | fc11 | fc15 | fc29 | fc5 | fc8 | fedora | fedora21 | fenix | ffmpeg | finepix | firefox | flickr | folau | fontforge | fontspec | fonty | food | fop | foto | france | francja | fripp | fuczki | fuji | fuse | gammu | garmin | gawk | gazwyb | gdańsk | gdynia | gender | geo | geocoding | georgia | gft | git | github | gmail | gmaps | gnokii | gnus | google | googlecl | googleearth | googlemaps | gotowanie | gphoto | gphoto2 | gps | gpsbabel | gpsphoto | gpx | gpx-viewer | greasemonkey | gruzja | grzyby | haldaemon | handbrake | hhi | historia | history | hitler | holocaust | holokaust | hpmini | humour | iblue747 | ical | iiyama | ikea | imap | inkscape | inne | internet | j10i2 | javascript | jhead | k800i | kajak | kamera | kleinertest | kml | kmobiletools | knuth | kociewie kołem | kod | kolibki | komorowski | konwersja | krutynia | kuchnia | kurski | latex | latex2rtf | latex3 | lcd | legend | lenny | lesund | lewactwo | lgbt-folly | liberation | linksys | linux | lisp | lisrel | litwa | lizbona | logika | ltr | lubowla | lwp | lwów | m2wś | malta | mapquest | mapsource | marchew | marvell | math | mathjax | mazury | mbank | mediolan | mencoder | mevo | mh17 | michalak | michlmayr | microsoft | monitor | mp4box | mplayer | ms | msc | mssql | msw | mswindows | mtkbabel | museum | muzyka | mymaps | mysql | nafisa | nanopi | natbib | navin | nekrolog | neo | neopi | netbook | niemcy | niemieckie zbrodnie | nikon | nmea | nowazelandia | nuc | nxml | oauth | oauth2 | obituary | odessa | okular | olympus | ooffice | ooxml | opera | osm | otf | otftotfm | other | overclocking | ozbekiston | panoramio | pdf | pdfpages | pdftex | pdftk | perl | photo | photography | picasa | picasaweb | pim | pine | pis | pit | plotly | pls | plugin | po | podróże | politics | polityka | polsat | portugalia | postęp | powerpoint | połtawa | prelink | problem | propaganda | pstoedit | putin | python | pywws | r | radio | random | raspberry | raspberry pi | raspberrypi | refugees | relaxng | ridley | router | rower | rowery | rpi | rsync | rtf | ruby | rugby | rumunia | russia | rwc | rwc2007 | rwc2011 | rwc2019 | rzym | samba | selenium | sem | sernik | sheevaplug | sienkiewicz | signature | sks | skype | skytraq | smoleńsk | sqlite | srtm | sshfs | ssl | staszek wawrykiewicz | statistics | stats | statystyka | stix | stretch | suwałki | svg | svn | swanetia | swornegacie | szwajcaria | słowacja | tbilisi | terrorism | tex | texgyre | texlive | thunderbird | tomato | totalnaopozycja | tourism | tramp | trang | transylwania | truetype | ttf | turcja | turkey | turystyka | tusk | tv | tv5monde | twitter | typetools | ubuntu | uchodźcy | udev | ue | ukraina | umap | unix | upc | updmap | ups | utf8 | uzbekistan | varia | video | vienna | virb edit | vostro | wammu | wdc | wdfs | weathercloud | webcam | webdav | webscrapping | wh2080 | wiedeń | wikicommons | wilno | win10 | windows | windows8 | wine | wioślarstwo | word | wordpress | wrt54gl | ws1080 | wtyczka | wunderground | ww2 | www | wybory | wybory2015 | włochy | węgry | xemex | xetex | xft | xhtml | xine | xml | xmllint | xsd | xslt | xvidtune | youtube | yum | zakopane | zakupy | zdf | zdrowie | łeba | świdnica | żywność
Archiwum
O stronie
wykorzystywany jest blosxom plus następujące wtyczki: tagging, flatarchives, rss10, lastbuilddatexhtmlmime. Niektóre musiałem dopasować nieco do swoich potrzeb. Więcej o blosxom jest tutaj
Subskrypcja
RSS 1.0
Augmenting video files with GPS data

This post describes in detail how to add GPS data to video file using `visual correlation' (see also: Video geocoding with gpsbabel).

Zebra crossing at Osowa
Crossing at Osowa

There is an easy way to augment video files with GPS data using GPSbabel. Since version 1.4 of GPSBabel is able to create a subtitle file from a GPS tracklog. The subtitle contains latitude/longitude/altitude as well as the time. With a simple Perl scripts I have added current speed (not particularly accurate however).

To convert GPX file to subtitles one have to execute:

gpsbabel -i gpx -f FILE.gpx -o subrip,video_time=hhmmss,gps_time=hhmmss,gps_date=YYYYMMDD -F FILE.srt

Where: video_time -- video position (relative to beginning of video) for which exact corresponding GPS timestamp is known. gps_time -- the time part of the GPS timestamp which corresponds to a known position in the video. gps_date -- the date part of the GPS timestamp which corresponds to a known position in the video.

On a video (see below) you can see that in 34 second I passed the zebra crossing. The zebra's crossing coordinates can be easily identified at Google Maps (cf. picture Crossing at Osowa). Now one have to search the GPX track for the point which is nearest to 54.429591/18.477973. I developed a simple Perl script for that purpose:

$ perl My_GPX_nearest_timestamp.pl   -c 54.429591:18.477973 20130420.gpx
*** USAGE: My_GPX_nearest_timestamp.pl -c latitude:longitude GPX-file
*** Looking for 20 points near: 54.429591:18.477973 (lat/lon) ***
> 15.3758195746663 2013-04-20T10:27:09Z  54.429509640:18.477780819
> 22.0617273294607 2013-04-20T09:05:15Z  54.429701502:18.478256240
> 32.6458959467509 2013-04-20T10:27:15Z  54.429787332:18.478348190
> 43.3771684316959 2013-04-20T09:05:24Z  54.429531014:18.477310427
> 47.7727043140018 2013-04-20T09:05:11Z  54.429905936:18.478475260
> 63.903936892351 2013-04-20T10:27:00Z  54.429627573:18.476987137
> 70.171200323179 2013-04-20T09:05:28Z  54.429655485:18.476893930

One can stipulate from the above output that I passed a point 15,4 meters away from 54.429591/18.477973 at 10:27:09 GMT as well as I passed onother point which is 22 meters away from 54.429591/18.477973 at 09:05:15. As I cycled back and forth along the same route the second point is valid, the first is accidentally closer but as the time is almost one and half hours later it is clear that I was there on returning home. So gpsbabel should be executed as follows (20130420.gpx contains GPX track):

gpsbabel -i gpx -f 20130420.gpx -o subrip,video_time=000034,gps_time=090515,gps_date=20130420 -F 20130420_1.srt

Speed is added with another very simple Perl script:

perl add_speed_2_srt.pl 20130420_1.srt > 20130420_1_S.srt

Just to remind: internally all GPS units record time/date using Coordinated Universal Time aka Greenwich Mean Time vel Zulu time (for army enthusiasts). What the unit displays is another matter (usually it displays local time).

url | Sun, 21/04/2013 14:42 | tagi: , , ,
Video geocoding with gpsbabel
contour camera mounted at bike frame
Contour camera

Some time ago I bought a Contour HD camera on Ebay and the seller claimed he was selling it as he want to upgrade to GPS enabled model. That inspired me to investigate how I can do the same with the camera lacking build-in GPS receiver. For example to geotag photos one can use GPS enabled still cameras, but usually it is a costly luxury and it suffice to synchronize GPS log with a photo timestamp. Using this approach I have developed a simple bash scripts which works neatly with all my cameras. So I can geotag my photographs without wasting a lot of time.

In case of video images the approach is similar: one has to synchronize video and GPS data. The best approach is to film the display of the GPS unit showing the GPS time. In case when the camera is unable to get a good quality image (because the digits are too small for example as in case of my Garmin Legend) a simple trick can be used: just one has to write down time on a sheet of paper (using 15-30 seconds time-ahead) and in a appropriate moment film it. Or one can says out loudly the time displayed if the microphone is able to record it. Looks silly and old fashioned but works. Instead of the above two methods one have to establish initial video geolocation with `visual correlation' method (described in the next paragraph).

The camera Pause button should not be used as it breaks out the GPS-camera synchronization. Namely after every pause one has to establish correct initial geolocation which can be difficult but not impossible (`visual correlation' can be used ie. inspecting video for distinguishable objects which geo-position can be established). I think the advantage of GPS-equipped camcorder boils down to that aspect (one can use Pause w/o worrying that his/her video will be out of sync.) but I suspect to take this extra advantage some extra software is needed which almost for sure runs on MS Windows. For a Linux users it can be usless or at least troublesome.

The only method I tried to augment video files with GPS data is to convert them to video subtitles. Since version 1.4 of GPSBabel is able to create a subtitle file from a GPS tracklog. The subtitle contains latitude/longitude/altitude as well as the time and current speed.

To convert GPX file to subtitles one have to execute:

gpsbabel -i gpx -f FILE.gpx -o subrip,video_time=hhmmss,gps_time=hhmmss,gps_date=YYYYMMDD -F FILE.srt

Where: video_time -- video position (relative to beginning of video) for which exact corresponding GPS timestamp is known. gps_time -- the time part of the GPS timestamp which corresponds to a known position in the video. gps_date -- the date part of the GPS timestamp which corresponds to a known position in the video.

Let's assume that the recorded image of GPS display appears in 15 second of the captured image. One has to look for (inside GPX file) the timestamp containing the exact time displayed (element <time> inside element <trkpt>). Let's assume this timestamp is <time>2013-02-07T09:58:29Z</time>. To convert GPX to subtitles one has to run:

gpsbabel -i gpx -f FILE.gpx -o subrip,video_time=000015,gps_time=095829,gps_date=20130207 -F FILE.srt

Just to remind: internally all GPS units record time/date using Coordinated Universal Time aka Greenwich Mean Time vel Zulu time (for army enthusiasts). What the unit displays is another matter (usually it displays local time).

My first geotagged video obtained using method described above can be seen here.

Added 21 April 2013: This post is (partially) obsolete as I prefer `visual correlation' method now (see my newer post.)

url | Sun, 03/03/2013 21:52 | tagi: , , ,
Import KML files to GoogleMaps

The nuisance of GoogleMaps is that it does not know GPX and only KML/GeoRSS files can be uploaded. Fortunately it is easy to convert GPX to KML with gpsbabel:

gpsbabel -i gpx -f file.gpx -x simplify,count=333  -o kml -F file.kml

If there are several files they have to be convert one-by-one and then upload to Google. It would be more comfortable to merge them first and upload it in one go rather than uploading each individually.

As I could not find how to merge serveral GPX files into one using gpsbabel (merge option in gpsbabel puts all track points from all tracks into a single track and sorts them by time stamp. Points with identical time stamps will be dropped) I worked out the following simple Perl script:

#!/usr/bin/perl
#
# Combine GPX files into one
# usage: gpxmerge file1 file2 file3 ....
#
use XML::DOM;
binmode(STDOUT, ":utf8");

my $parser = new XML::DOM::Parser;

for my $file2parse (@ARGV) {
  my $doc = $parser->parsefile ($file2parse);

  for my $w ( $doc->getElementsByTagName ("wpt") ) {  $waypoints .= $w->toString() . "\n"; }
  for my $r ( $doc->getElementsByTagName ("rte") ) {  $routes .= $r->toString() . "\n"; }
  for my $t ( $doc->getElementsByTagName ("trk") ) {  $tracks .= $t->toString() . "\n"; }
}

print "<?xml version='1.0' encoding='UTF-8' ?>
<gpx version='1.1' creator='GPXmerger'
     xmlns='http://www.topografix.com/GPX/1/1'
     xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
     xsi:schemaLocation='http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd'>\n
<author>tomasz przechlewski </author>
<email>tprzechlewski[at]acm.org</email>
<url>http://pinkaccordions.homelinux.org/Geo/gpx/</url>";

print "$waypoints\n$routes\n$tracks\n";

print "</gpx>\n";

The resulting file structure is as follows: first all waypoints, then all routes and finally all tracks. This is perfectly legal GPX file.

Now I convert GPX to KML using gpsbabel:

gpsbabel -i gpx -f file.gpx -x simplify,count=333  -o kml -F file.kml

Since gpsbabel generates pretty verbose KML files I simplify them using XSLT stylesheet (perhaps this step is superfluous):

xsltproc -o simplified.kml kml2kml.xsl file.kml

and the stylesheet looks like:


<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:kml="http://www.opengis.net/kml/2.2" >

<xsl:output method="xml"  indent='yes' />

<xsl:template match="/">

<!-- ;; http://www.jonmiles.co.uk/2007/07/using-xpaths-text-function/ ;; -->

<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2">
<Document>


<Folder>
  <name>Waypoints</name>

  <xsl:for-each select="//kml:Folder[kml:name/text()='Waypoints']/kml:Placemark//kml:Point">
     <Placemark>
        <!-- <name><xsl:value-of select='../kml:name'/></name> --><!-- niepotrzebne -->
	<Point>
	  <coordinates>
	    <xsl:value-of select="kml:coordinates"/>
	  </coordinates>
	</Point>
     </Placemark>
  </xsl:for-each>

</Folder>


<Folder>
  <name>Tracks</name> 
 
  <xsl:for-each select="//kml:Placemark//kml:LineString">
    
    <Placemark>
      <name>Path</name>
    
      <LineString>
	<tessellate>1</tessellate>
	<coordinates>
	
	  <xsl:value-of select="kml:coordinates"/>
	
	</coordinates>
      </LineString>
    </Placemark>
  
  </xsl:for-each>

</Folder>

</Document>
</kml>

</xsl:template>
</xsl:stylesheet>

Now KML file is ready to be imported to Google maps via Maps → My Places → Create map.

The result of example conversion can be be found here.

url | Wed, 07/03/2012 23:37 | tagi: , , , ,
Simple application of fontspec package

The document body font is Times New Roman-like. Sans serif font is Helvetica-like. Both regular and condensed variant of sans serif is used. With fontspec package it can be obtained with:

\RequirePackage{ifxetex} %%
\ifxetex %% xetex
\RequirePackage{fontspec}
\usepackage{polyglossia} \setdefaultlanguage{polish}
\setmainfont{TeX Gyre Termes}
\setsansfont{TeX Gyre Heros}
\defaultfontfeatures{Mapping=tex-text}
\newfontfamily\PM@SansCondensed{TeX Gyre Heros Cn} %%
\usepackage{xunicode,xltxtra}
\else %% conventional TeX
\RequirePackage{tgtermes,txfonts,qtxmath} %% txfonts
\def\PM@SansCondensed{\fontfamily{qhvc}}
\fi

With the help of \ifxetex command from ifxetex package the code above works when compiled both with xetex as well as conventional pdflatex.

The example below illustrates how \PM@SectionFont can be used to switch to condensed variant of sans serif:

\renewcommand{\section}{\@startsection{section}{1}{\z@}%
    {-3.5ex \@plus -1ex \@minus -.2ex}%
    {2.3ex \@plus.2ex}%
    {\reset@font 
    \PM@SectionFont 
    \raggedright}}

Finally, a few words how to configure system (a Linux one, BTW strictly speaking MS Windows is not a system) to work with OpenType fonts.

Providing the TeX Gyre fonts package is installed (with tlmgr in case of TeXLive for example) all .otf files are located in ~/2011/texmf-dist/fonts/opentype/public/tex-gyre (where ~ denotes the root of TeXlive distribution).

To add all TeX Gyre fonts to system resources it suffice to create /etc/fonts/local.conf with the following content:

<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<!-- /etc/fonts/local.conf file for local customizations -->
<fontconfig>
<!-- Font directory list -->

        <dir>/usr/local/texlive/2011/texmf-dist/fonts/opentype/public/tex-gyre</dir>

</fontconfig>

Or similar, if root of TeXlive distribution is not /usr/local/.

Now run as root

fc-cache

Check if everything is OK:

fc-list | grep -i Heros

Information on TeX Gyre Heros should be displayed on screen:

TeX Gyre Heros Cn:style=Bold
TeX Gyre Heros Cn:style=Bold Italic
TeX Gyre Heros:style=Regular
TeX Gyre Heros Cn:style=Regular
TeX Gyre Heros:style=Bold Italic
TeX Gyre Heros:style=Italic
TeX Gyre Heros Cn:style=Italic
TeX Gyre Heros:style=Bold

url | Tue, 06/03/2012 09:11 | tagi: , , ,
Fixing /dev/ttyUSB0 permissions for GPSBabel in fedora 15 (revisited)

Having fixed Garmin-babel communication some time ago I have encountered similar problem with another GPSdevice, namely MTK's BT747 logger. This time fixing the problem was simple.

I added the following to the /etc/udev/rules.d/51-garmin.rules:

SYSFS{idVendor}=="10c4", SYSFS{idProduct}=="ea60", MODE="0666"

Vendor ID and product ID can be figured out inspecting dmesg log:

# connect the device first 
dmesg | less

So my /etc/udev/rules.d/51-garmin.rules file looks like in the following listing:

SYSFS{idVendor}=="091e", SYSFS{idProduct}=="0003", MODE="0666"
SYSFS{idVendor}=="10c4", SYSFS{idProduct}=="ea60", MODE="0666"

One has to remember to stop/remove gps demon (gpsd).

url | Tue, 13/09/2011 10:03 | tagi: , , ,
Fixing /dev/ttyUSB0 permissions for GPSBabel in fedora 15

Gpsbabel does not work at all in brand new fedora 15. I have followed suggestions from https://bugzilla.redhat.com/show_bug.cgi?id=713483 and rebuild it from the source .rpm. I have also fixed udev rules, as described here:

## /etc/udev/rules.d/51-garmin.rules
SYSFS{idVendor}=="091e", SYSFS{idProduct}=="0003", MODE="0666"

Now (sometimes) I was able to fetch GPX trace but only as a root.

Inspecting /var/log/messages I noticed suspicious messages from gpsd daemon, ie:

Aug 14 16:50:09 darkstar gpsd.hotplug: gpsd_control(action=add,arg=/dev/ttyUSB0)

Moreover the deamon starts/stops in some tricky way as it is down if one looks in Programs →Administration→Services, but ps uax | grep gpsd indicates something contrary:

nobody  2530  0.0  0.0  12652  1412 ? S<s  13:31  0:00 gpsd -n -F /var/run/gpsd.sock

As gpsbabel works flawlessly in my fc11 w/o gpsd I have decided to remove it:

yum erase gpsd
## removes also following dependencies:
 kdeutils-libs-4.6.5-2.fc15.i686 kdeutils-4.6.5-2.fc15.i686
 kde-settings-kdm-4.6-10.fc15.noarch kdm-4.6.5-2.fc15.i686
 digikam-1.9.0-2.fc15.i686 digikam-libs-1.9.0-2.fc15.i686
 kdeedu-marble-4.6.5-1.fc15.i686 kdeedu-marble-libs-4.6.5-1.fc15.i686
 kdeplasma-addons-4.6.5-1.fc15.i686
 kdeplasma-addons-libs-4.6.5-1.fc15.i686 ktorrent-4.1.1-1.fc15.i686
 ktorrent-libs-4.1.1-1.fc15.i686 kpackagekit-0.6.3.3-2.fc15.i686
 kde-plasma-networkmanagement-vpnc-0.9-0.53.20110616git.nm09.fc15.i686
 kde-plasma-networkmanagement-openvpn-0.9-0.53.20110616git.nm09.fc15.i686
 plasma-scriptengine-python-4.6.5-2.fc15.i686
 kdenetwork-4.6.5-1.fc15.i686 kdenetwork-libs-4.6.5-1.fc15.i686
 kde-plasma-networkmanagement-pptp-0.9-0.53.20110616git.nm09.fc15.i686
 kde-plasma-networkmanagement-0.9-0.53.20110616git.nm09.fc15.i686
 kde-plasma-networkmanagement-libs-0.9-0.53.20110616git.nm09.fc15.i686
 kdebase-workspace-4.6.5-2.fc15.i686
 kdebase-workspace-libs-4.6.5-2.fc15.i686 gpsd-2.95-6.fc15.i686
## and disables the following udev rules:
 ostrzeżenie: /etc/udev/rules.d/99-gpsd.rules zapisano jako
 /etc/udev/rules.d/99-gpsd.rules.rpmsave

Pretty surprising that so many KDE packages depends on gpsd! Now I have access to gpsbabel as normal user. (It needs 10--20 second to plug the device in fc15 while in fc11 it was instantaneously.)

Moreover my Gnome3 desktop once unusable looks much better (I still intend to use Xfce however). It seems KDE in FC15 interfere in a nasty way...

Added 24 august 2011: Xine error while playing .avi file resolved.

$ rpm -qa '*ffmpeg*' 
ffmpeg-devel-0.7-0.3.20110612git.fc15.i686
ffmpeg-libs-0.7-0.3.20110612git.fc15.i686

$ rpm remove ffmpeg-devel
$ yum downgrade ffmpeg-libs

Removed:
ffmpeg-libs.i686 0:0.7-0.3.20110612git.fc15 

Installed:
ffmpeg-libs.i686 0:0.6.90-0.2.rc0.fc15 

xine now works with .avi. Btw:

$ rpm -qa '*git*'
emacs-git-el-1.7.6-1.fc15.noarch
emacs-git-1.7.6-1.fc15.noarch
git-1.7.6-1.fc15.i686

It appears ffmpeg-libs-0.7-0.3.20110612git and ffmpeg-devel-0.7-0.3.20110612git were the only compiled from git shapshots packages installed in my system (providing gip snapshots are always marked by adding git to package name).

It is convenient to add exclude=ffmpeg-libs to /etc/yum.conf to prevent yum to update ffmpeg libs with yum update command.

Added 31 august 2011: According to man xine one can specify ``additional command line arguments'' using ~/.xine/xinerc where each line specifies an additional command line argument. However --geometry 990x650 does not work, as well as -G 990x650. By trial and error I have figure out the only(?) working syntax:

##vi ~/.xine/xinerc
-G990x650

Note no space after -G.

url | Fri, 19/08/2011 08:26 | tagi: , , ,
Xetex i PDF: kilka problemów

Dawno temu zrobiłem systemik formatujący pewien plik XML do postaci pliku PDF. Ten cel jest realizowany na dwa pas. Najpierw skrypt Perla zamienia XML na plik TeXa, który to plik jest zamieniany pdfTeXem na dokument PDF. 10 lat działało i nagle ktoś dostrzegł, że zakładki (bookmarks) są nie po polsku. No nie są, bo kiedyś było to trudne do wykonania... A teraz faktycznie nie jest trudne -- wystarczy zamienić kodowanie z jednobajtowego na UTF-8.

Po tej właśnie linii zaatakowałem problem, tj. 1) zmieniłem kodowanie w generowanym pliku TeXowym z ISO8859-2 na UTF-8 oraz, w związku z tym 2) zmieniłem pdfTeXa na XeTeXa. Jak zwykle nie obyło się bez problemów:

  1. Elementy nawigacyjne są definiowane inaczej w XeTeXu niż w pdfTeXu, więc za pierwszym razem bookmarki zniknęły w ogóle. Gdybym swoje makra pisał w LaTeXu problem by nie istniał, ale w plain TeXu zwykle trzeba wszystko samemu... Tym razem na szczęście z pomocą google znalazłem działające gotowe makra pn. navigator.

  2. Kolory też są inaczej definiowane. Ja to zrobiłem tak:

    \def\cmykRed{0 1 1 0}
    \def\setcolor#1{\special{color push cmyk #1}}
    \def\endcolor{\special{color pop}}
    
    \setcolor\cmykRed \bf Cośtam-coś-tam-na-czerwono \endcolor
    
  3. Miłą cechą XeTeXa jest to, że można korzystać z fontów systemowych. Wymyśliłem zatem, że dokument będzie składany fontem TeX Gyre Heros w odmianie wąskiej. Można to zadeklarować następująco:

    %% Podstawowym fontem jest TeX Gyre Heros w odmianie `Condensed'
    %% cf. http://www.gust.org.pl/projects/e-foundry/tex-gyre/heros
    \def\MainFont{TeX Gyre Heros Cn}\def\MainXFont{TeX Gyre Heros}
    \font\rm = "\MainFont:mapping=tex-text" 
    \font\bf = "\MainFont/B:mapping=tex-text"
    \font\it = "\MainFont/I:mapping=tex-text"
    %% W stopniu 8pt zamiast odmiany wąskiej używamy normalnej %%
    \font\eightrm = "\MainXFont:mapping=tex-text" at 6.25pt
    \font\eightbf = "\MainXFont/B:mapping=tex-text" at 6.25pt
    \font\eightit = "\MainXFont/I:mapping=tex-text" at 6.25pt
    

    Zapis mapping=tex-text oznacza, że font ,,reaguje'' na TeXowe ligatury, m.in -- oraz --- zamieniając je (odpowiednio) na półpauzę i pauzę. Zapis /B włącza odmianę grubą a /I kursywę...

  4. I gdy już wszystko było prawie gotowe nieopatrzenie zajrzałem do pliku .log a tam cała masa wpisów:

    Invalid UTF-8 byte or sequence at line 22 replaced by U+FFFD.
    

    Czyli Perl jednak sygnalizował coś brzydkiego wypisując:

    Wide character in print at ....
    

    Mój skrypt czyta plik XML, parsuje go z wykorzystaniem XML::Parser, który to -- jak powszechnie wiadomo -- wypluwa dokument w UTF-8. Więc czemu w efekcie dostaję błędnie kodowany plik?? Ustalenie co jest nie tak zajęło mi kilka godzin a sprawa sprowadzała się do dodania:

    open (OUT, ">:utf8", "plik-out") # zamiast open (OUT, ">plik-out")
    

    zamiast open (OUT, ">:utf8"... można wpisać:

    use open ":encoding(utf8)";
    use open IN => ":encoding(utf8)", OUT => ":utf8";
    

    Wpisanie zaś:

    use utf8 ;
    

    wskazuje tylko tyle, że skrypt Perla jest kodowany w UTF-8.

url | Mon, 18/04/2011 22:58 | tagi: , , ,
Navin minihomer GPS receiver/logger
Navin GPS
Navin minihomer

No maps or advanced features are supported but thanks to 1 inch display screen it can shows direction (electronic compass) and distance to up to 5 different targets. Targets (POIs) can be marked, manually entered or uploaded with appropriate software. (IMHO manual entry of POI requires at least Kristian Zimerman's fingers---for mere human it is simply impossible to remember and perform all key clicks in appropriate sequence...)

The producer recommends ntrip Travel Management Shareware. Two main features of ntrip are: -- importing logged GPS data, -- setting up to 5 locations by clicking them on the Google map. Ntrip is Windows only (perhaps it works with wine---I didn't try) shareware and the license fee is 20 USD.

Brand new minihomer has logging capability disabled. On first connection to ntrip it is enabled. One can stop/start logging manually with mark key.

As I do not use MSW (MS Windows) and don't like shareware applications I have been searching for some free replacement for ntrip starting with an obvious one, namely gpsbabel.

Latest version of Gpsbabel (1.4.2) supports skytraq venus based loggers (Venus 5 and 6; for 130 PLN at allegro.pl) but the support for minihomer is limited to dowloading the GPS tracks only:

gpsbabel -i skytraq -f /dev/ttyUSB0 -o gpx -F out.gpx
## if the above do not works thy add baud=0 ; erase clears all device's memory
gpsbabel -i skytraq,erase,baud=0 -f /dev/ttyUSB0 -o gpx -F out.gpx

Alternatively one can use skytraq-datalogger:

## get information about software version and configuration
skytraq-datalogger --info --device /dev/ttyS0

## change configuration of the data logger (do not works with miniHomer):
skytraq-datalogger --enable-log --set-config

## dumping memory in GPX (works):
skytraq-datalogger --dump > out.gpx

Finally a guy called Josef Reisinger adds Minihomer support to gpsbabel but it has not been integrated (yet?) to official distribution. However the `hacked' gpsbabel can be dowloaded from www.ohloh.net:

cvs -d :pserver:anonymous:@gpsbabel.cvs.sourceforge.net:/cvsroot/gpsbabel co gpsbabel
cd gpsbabel
./configure
make
## change gpsbabel to something else:
mv gpsbabel gpsbabel_minihomer

To set location for ``Home'' icon one can issue a command similar to the following example:

## =55.44:18.55:45 is latitute:longitude:altitude ; altitude is optional
## -o gpx -F out.haha is suprefluous, perhaps -F - will suffice:
gpsbabel_minihomer -i minihomer,Home=55.44:18.55:45 -f /dev/ttyUSB0 -o gpx -F out.haha

Other icons include ``Car'', ``Boat'', ``Heart'' and ``Bar''. The track can be dowloaded as with ordinary version of gpsbabel of course. It seems to be impossible to configure the device however (disabling/enabling logging, setting logging period etc...) so enabling logging can be done---as far as I know---with ntrip only.

Dopisane 24 marca 2011: Się okazało, że połączenie gpsbabel/minihomer jest straszliwie zależne od użytego kabla USB. Kto by pomyślał. Mi działa z kablem oznaczonym jako Belkin Pro Series USB 2.0 [...] E237114 CSA 219561 Z innymi nie działa... Trudno powiedzieć czy to jest oryginalny dołączony do urządzenia, bo różnych kabelków USB mam już z kilkanaście...

Dopisane 28 marca 2011: Ponieważ ciągle nie działa poprawnie wykonałem następujące testy:

## działa:
gpsbabel -i skytraq,baud=0 -f /dev/ttyUSB0 -o gpx -F 20110326.gpx
## nie działa:
gpsbabel -i skytraq,erase,baud=0 -f /dev/ttyUSB0 -o gpx -F 20110326-e.gpx
skytraq: Can't find skytraq device on '/dev/ttyUSB0'
## jeszcze raz polecenie nr1 teraz też nie działa:
gpsbabel -i skytraq,baud=0 -f /dev/ttyUSB0 -o gpx -F 20110326p.gpx
skytraq: Can't find skytraq device on '/dev/ttyUSB0'
## wyjęcie USB/wsadzenie, powtórka, działa:
gpsbabel -i skytraq,baud=0 -f /dev/ttyUSB0 -o gpx -F 20110326p.gpx
## i jeszcze raz, działa:
gpsbabel -i skytraq,baud=0 -f /dev/ttyUSB0 -o gpx -F 20110326pp.gpx
## teraz próba zmodyfikowanym babelem:
miniHomer_gpsbabel -i minihomer,baud=0 -f /dev/ttyUSB0 -o gpx -F 20110324m.gpx
skytraq: Can't find skytraq device on '/dev/ttyUSB0'
## wyjęcie USB/wsadzenie:
miniHomer_gpsbabel -i minihomer,baud=0 -f /dev/ttyUSB0 -o gpx -F 20110324m.gpx
Naruszenie ochrony pamięci

##
## działa natomiast:
miniHomer_gpsbabel -i minihomer,Bar=55.44:18.55:45 -f /dev/ttyUSB0 -o gpx -F -

Reasumując ślad można zgrywać ,,klasycznym'' babelem. Zmodyfikowany ma coś spieprzone, ale działa w trybie ustawiania POI, czego nie potrafi ,,klasyczny'' z kolei. Żaden nie obsługuje polecenia erase. To nie jest wszakże aż tak wielki problem bo pamięć po zapełnieniu jest nadpisywana (chyba:-).

Poza tym w komputerze kol. B. nie działało w ogóle. Pomogło wpisanie w google frazy: gpsbabel+hangs. Należy wykonać przed uruchomieniem gpsbabela [ale po podłączeniu urządzenia] następujące tajemnicze polecenie:

stty -F /dev/ttyUSB0 clocal

co jest opisane tutaj albo tutaj. Z opisu zaś wynika, że błąd dotyczy nowych wersji Ubuntu lub nawet kernela per se (nie chciało mi się czytać, bo ja mam ciągle Fedorę acht i jest OK!).

url | Sun, 06/03/2011 14:23 | tagi: , , , , , ,
XeTeX (aktualizacja)

Uaktualniłem krótki wstęp do używania XeTeXa oraz przykłady tegoż używania.

url | Mon, 01/11/2010 18:11 | tagi: ,
XeTeX i GUST scheme w TL2010

Banalny dokument:

\documentclass[a4page]{book}
\usepackage{fontspec} %<-- włącza LM wymaga xetexa
\begin{document} 
 Hopla 
\end{document}

Przy kompilacji XeLaTeXem (fontspec nie działa ze zwykłym LaTeXem) spowodował komunikat o brakującym pakiecie expl3.sty oraz xparse.sty. [Używam TL2010 a konkretnie tzw. GUST scheme, zainstalowane poprzez WWW.]

Aby dociągnąć brakujące pakiety skorzystałem po raz pierwszy w życiu z tlmgr.

$ tlmgr search --global expl3    
tlmgr: package repository http://dante.ctan.org/tex-archive/systems/texlive/tlnet
 expl3 - Packages supporting LaTeX3 programming conventions.
 siunitx - A comprehensive (SI) units package.
 unicode-math - Unicode mathematics support for XeTeX and LuaTeX.
 xpackages - High-level LaTeX3 concepts.

$ tlmgr search --global xparse
tlmgr: package repository http://dante.ctan.org/tex-archive/systems/texlive/tlnet
 xpackages - High-level LaTeX3 concepts.

$ tlmgr install expl3

tlmgr: package repository http://dante.ctan.org/tex-archive/systems/texlive/tlnet
[1/1, ??:??/??:??] install: expl3 [2513k]
tlmgr: package log updated at /usr/local/texlive/2010/texmf-var/web2c/tlmgr.log
running mktexlsr ...
done running mktexlsr.

$ tlmgr install xpackages

tlmgr: package repository http://dante.ctan.org/tex-archive/systems/texlive/tlnet
[1/1, ??:??/??:??] install: xpackages [2401k]
tlmgr: package log updated at /usr/local/texlive/2010/texmf-var/web2c/tlmgr.log
running mktexlsr ...
done running mktexlsr.
url | Sat, 30/10/2010 08:25 | tagi: , ,
Verbatim z formatowaniem literalnych fragmentów

Do wpisywania literalnych fragmentów tekstu używam otoczenia Verbatim z pakietu fancyvrb. Otoczenie to m.in. może być wstawione do przypisu oraz jest możliwość umieszczania w tekście literalnym poleceń formatujących. To drugie przydaje się przykładowo w sytuacji gdy w opisie składni jakiegoś języka pewne fragmenty są meta, tj. nie należy przepisywać ich literalnie ale oznaczają pewne pojęcia (jak dajmy na to element replaceable wewnątrz literallayoutDocbook), przykładowo:

\begin{list}{punktor}{deklaracje} zestawienie \end{list}

Można wpisać:

\begin{Verbatim}[commandchars=@\{\}]
\begin{list}{@emph{punktor}}{@emph{deklaracje}} @emph{zestawienie} \end{list}

Jeżeli fragmenty literalne mają być mniejsze to można dopisać po przecinku fontsize=\small. Inną potencjalnie przydatną opcją jest numerowanie wierszy:

\begin{Verbatim}[commandchars=@{},fontsize=\small,numbers=left]
\begin{list}{@emph{punktor}}{@emph{deklaracje}} @emph{zestawienie} \end{list}

Numery nie muszą się zaczynać od 1. Opcja firstnumber pozwala na kontynuację. Można w szczególności wpisać firstnumber=last i numerowanie rozpocznie się od wartości o 1 większej niż ostatni wiersz w poprzednim otoczeniu Verbatim.

Można też wykorzystując polecenie \fvset zdefiniować powtarzające się opcje globalnie a nie wpisywać je za każdym razem:

\usepackage{fancyvrb}
\VerbatimFootnotes % <-- verbatim można umieszczać w przypisie
\DefineShortVerb{\"} % <-- krótka forma zapisu "foo" zamiast \verb@foo@
\fvset{commandchars=¤´˝}
\makeatactive
\newenvironment{literalexample}{\begingroup \endgraf \small \medskip \Verbatim}%
{\endVerbatim \par \medskip \endgroup  \@doendpe }
\makeatother

\begin{document}
\begin{literalexample}
\@startsection{¤emph´nazwa˝}{¤emph´poziom˝}{¤emph´wcięcie˝}{¤emph´odstęp-przed˝}{¤emph´odstęp-po˝}{¤emph´styl˝}
\end{literalexample}

W powyższym przykładzie \@doendpe powoduje, że w pierwszym akapicie po otoczeniu literalexample nie będzie wcięcia. \Verbatim\endVerbatim, to otoczenie Verbatim zapisane w postaci pary poleceń (każde otoczenie LaTeXa można zapisać jako \Otoczenie\endOtoczenie.

Ponieważ w kodzie LaTeXa praktycznie występują wszystkie znaki z klawiatury jako commandchars zastosowałem znaczki z górnej połówki ASCII: ¤ (dziesiętnie 164) ´ (180) oraz ˝ (189). Można by stosować np. ¤{}, ale wolałem nie używać {} w roli ograniczników do ¤, żeby mi się nie mieszało z nawiasami klamrowymi wstawionymi literalnie.

Teraz większy przykład, jak to działa

%& --translate-file=il2-pl
\documentclass[a4page]{book}
\usepackage{fancyvrb}
\fvset{commandchars=¤´˝}
\usepackage{polski}
\begin{document}

\begin{Verbatim}
\begin{list}{¤emph´punktor˝}{¤emph´deklaracje˝} ¤emph´zestawienie˝ \end{list}
\end{Verbatim}
\end{document}

Znaczki ¤´ oraz ˝ wstawiam w Emacsie wciskając C-c [ oraz C-c ]. W tym celu w .emacs zdefiniowałem co następuje:

(defun insert-commandchars-open ()
  "Insert sequence of characters character 164-180"
  (interactive) (insert "¤emph´") )
(defun insert-commandchars-close ()
  "Insert sequence of characters character 189"
  (interactive) (insert "˝") )
(global-set-key "\C-c\C-[" 'insert-commandchars-open)
(global-set-key "\C-c\C-]" 'insert-commandchars-close)

Teraz jeżeli byśmy na-rympał chcieli to używać z opcją utf-8 albo latin2 pakietu inputenc, to no-way:

\documentclass[a4page]{book}
\usepackage[utf8]{inputenc} \usepackage{lmodern} \usepackage[T1]{fontenc}
\usepackage{fancyvrb}
\fvset{commandchars=¤´˝}
\usepackage{polski}

\begin{document}
\begin{Verbatim}
\begin{list}{¤emph´punktor˝}{¤emph´deklaracje˝} ¤emph´zestawienie˝ \end{list}
\end{Verbatim}
\end{document}

LaTeX zgłasza błąd:

! Package inputenc Error: Keyboard character used is undefined

BTW: zapewne \fvset{commandchars=@\{\}} zadziała, ale nie chce mi się sprawdzać...

Można spróbować też XeTeXa:

\documentclass[a4page]{book}
\usepackage{fontspec} %<-- włącza LM wymaga xetexa
\usepackage{fancyvrb}
\fvset{commandchars=¤´˝}
\usepackage{polski}
\begin{document}

\begin{Verbatim}
\begin{list}{¤emph´punktor˝}{¤emph´deklaracje˝} ¤emph´zestawienie˝ \end{list}
\end{Verbatim}
\end{document}

Działa...

url | Sat, 30/10/2010 07:26 | tagi: , ,
Gpsbabel i /dev/ttyUSB0 w fedora 11

Poprawne działanie mojego skryptu My-get-GPX.sh, który służy do pobierania danych w formacie GPX z urządzeń GPS wymaga w systemie Fedora 11 ręcznego zainstalowania pakietu perla Geo::Distance oraz dopasowanie systemu według zaleceń z wiki.openstreetmap.org. Mianowicie w pliku /etc/modprobe.d/blacklist.conf umieszczamy [Nb. z mojego opisu instalacji MapSource pod wine, wynika że może się to gryźć z MapSource. Na razie się nie gryzie bo ww. MS mam na komputerze ze starszą wersją Fedory....]:

blacklist garmin_gps

oraz zmieniamy uprawnienia do urządzenia (bez tego ściągać dane może tylko root), dodając do katalogu /etc/udev/rules.d/ plik 51-garmin.rules zawierający:

SYSFS{idVendor}=="091e", SYSFS{idProduct}=="0003", MODE="0666"

Teraz należy nowe reguły załadować:

sudo udevadm control --reload-rules

Uwaga: gpsbabel widzi urządzenie jako usb:0 a nie jak poprzednio, w starszej wersji Fedory /dev/ttyUSB0. W nowej fedorze przestał też działać -- zapewne z uwagi na havoc z urządzeniami -- bt747. Szukając zamiennika doczytałem, że gpsbabel też potrafi ściągnąć dane z i-Blue 747:

gpsbabel -t -w -i mtk,erase -f /dev/ttyUSB0 -o gpx -F out.gpx

Opcja erase powoduje wyczyszczenie zawartości pamięci... Oprócz pliku .gpx dane są ściągane w formacie binarnym i zapisywane do pliku data.bin. Gpsbabel nie umie m.in. manipulować ustawieniami loggera, ale nie jest to dla mnie aż tak wielka strata, bo nigdy nic nie ustawiałem... Ciekawostką jest, że dla i-Blue 747 działa /dev/ttyUSB0 a w przypadku Legenda wspomniane usb:0. Trochę to dziwne, albo znowu czegoś nie doczytałem...

Anyway, skrypt My-get-GPX.sh obsługuje teraz zarówno Garmin Legend jak i Blue 747. Dodałem też opcję -publish, działającą w ten sposób, że po pobraniu pliku GPX jest wycinany ślad ,,z dziś'' (tj. od 6.00 do 23.00 dla bieżącej daty), który to ślad jest następnie wysyłany w odpowiednie miejsce na serwerze (np. tutaj). Reasumując: po przyjechaniu z wycieczki rowerowej wystarczy wsadzić kabel USB, włączyć urządzenie i wpisać:

My-get-GPX.sh

A reszta zrobi się sama...

url | Sun, 22/08/2010 17:46 | tagi: , , ,
Wycieczka do Wilna
Wilno, Ostra Brama

W tym roku w tzw. długi weekend pojechaliśmy na wycieczkę (samochodem) na Litwę, a konkretnie w zamiarze zwiedzania Wilna i Troków.

Ślady GPX z wycieczki są tutaj: 20100430201005012010050220100503. Więcej zdjęć jest na flickr.com. Ślady w formacie KML są tutaj: 20100430201005012010050220100503.

url | Wed, 05/05/2010 14:17 | tagi: , , , , , , ,
Ikony punktów nawigacyjnych w Garminie

W opisie tzw. waypointa (punkt nawigacyjny), w formacie GPX jest m.in. znacznik <sym>, którego zawartością jest napis określający symbol punktu. Do tej pory zawsze wstawiałem tam Flag, a Legend oznaczał taki punkt ikoną niebieskiej flagi. Wprawdzie teoretycznie to (chyba) może być dowolny napis, ale lepiej ograniczyć się do tych kilkanastu--kilkudziesięciu, które Garmin zna i ,,reaguje'' na nie podstawiając odpowiednią ikonę. Zestaw tychże znalazłem tutaj. Na stronach Garmina zaś trudno się doszukać stosownej informacji.

Przykładowo pierwszy z punktów (poniżej) to cmentarz a drugi Miejsce Polowania wybrany na oznaczanie ,,grzybowych miejscówek'' -- ponieważ w zestawie symboli nie ma takiego, który by się lepiej nadawał na oznaczenie miejsca ,,gdzie rosną grzyby''

<wpt lat="54.0704694444" lon="18.9803833333">
  <name>Stogi k/M Cment</name>
  <cmt>Stogi k/M Cment</cmt>
  <desc>Stogi k/Malborka Cmentarz Mennonitów</desc>
  <sym>Cemetery</sym>
</wpt>
<wpt lat='54.84425261' lon='18.000581109'>
  <name>Boczniak1</name>
  <cmt>Boczniak Ostrygowaty</cmt>
  <desc>Boczniak Ostrygowaty na pniu buka</desc>
  <sym>Hunting Area</sym>
</wpt>

Jak już opisałem kiedyś bazę moich punktów trzymam w pliku (konkretnie w ~/.gps/local.wpts) co ułatwia jej modyfikowanie. Jeżeli baza się zmieni, to przesyłam plik (synchronizuję) do urządzenia wykorzystując program gpsbabel.

url | Wed, 11/11/2009 20:50 | tagi: , , , ,
Kamień Ernsta Becker-Lee
Skręt do kamienia
Tu skręcić do lasu
Kamień Ernsta Becker-Lee
Kamień Ernsta Becker-Lee

Mniej znana atrakcja Gdańska położona w dolinie Radości. Dojście wygląda następująco: Kierujemy się na hotel Oliwski Dwór. Jak już do tego hotelu dojdziemy to należy iść w górę, wzdłuż doliny ścieżką na skraju lasu (mając ogródki działkowe po lewej ręce). Mijamy małe jeziorko i wychodzimy na łąkę. Teraz trzeba zachować czujność i skręcić w prawo do lasu (miejsce skrętu ma współrzędne (54.399598/18.529976, cf. górne zdjęcie zamieszczone obok). Idziemy według znaków czarnego szlaku. Po przejściu 20--30 metrów droga się rozwidla. Idziemy w lewo (wzdłuż szlaku, tyle że niekoniecznie jest to oczywiste, bo znaczek może być słabo widoczny). Po 100--200 metrach będzie widać skocznię na lewym zboczu doliny (a raczej to co ze skoczni zostało). Dokładnie naprzeciwko skoczni znajduje się kamień--płyta pamiątkowa.

Płyty z dołu nie widać. Trzeba wejść na prawe zbocze--dokładnie naprzeciw zeskoku skoczni (współrzędne 54.40047/18.52563). Informacje nt. płyty są także tutaj oraz tutaj.

Przy okazji jak załadować plik GPX do Garmina (za wiki.gpsbabel.org):

gpsbabel -w -i gpx -f ~/.gps/local.wpts -o garmin -F /dev/ttyUSB0

Nota bene stojąc na rozbiegu skoczni płytę widać doskonale.... Dziwny pomysł na zmotywowanie zawodników:-)

Dopisane 6 maja 2009: Informacja z Panoramy Gdańskiej zamieszczona na youtube.com

url | Tue, 28/04/2009 21:32 | tagi: , , ,
Urwany ślad
DM part of

Wziąłem aparat na dzisiejsze jeżdżenie rowerowe i popstrykałem trochę zdjęć w czasie jazdy. Rowerzyści są na nich od strony rewersu widoczni w większości (por. rysunek obok), ale to tylko podnosi autentyczność--tak to wygląda w środku peletonu:-)

No i GPS złośliwie się wyłączył w okolicach Kielna czyli tak w 2/3 trasy. Akurat zdjęcia, na których kol. Rysiu mnie sfotografował nie mogą być geokodowane (aka geotagowane), bo ślad się urwał. Pech... Ale, ale... Już kiedyś tą trasą jechałem i ślad mam tyle, że nie do końca tą, pewnie z trochę inną prędokością dziś dziś ale lepsze to niż nic. Tyle, że stempel czasu dla każdego punktu na śladzie jest zły. Pomyślałem, że można by oszukać gpsphoto ,,uzupełniając'' dzisiejszy ślad kawałkiem starego. Okazało się to całkiem proste dzięki gpsbabel:

gpsbabel -t -i gpx -f plik-we.gpx -x track,move=spec-czasu -o gpx -F plik-wy.gpx

Gdzie spec-czasu ma postać znak99d99h99m99s (99 oznacza stosowną liczbę, a poszczególne składniki są opcjonalne.) Przykładowo +2h przesunie czas o dwie godziny do przodu. Podobnie +32d0h1m42s przesunie o 13 dni, minutę i 42 sekundy ,,do przodu''.

Teraz w Google maps ustaliłem gdzie się kończy dzisiejszy ślad a następnie znalazłem punkt na śladzie z 23 sierpnia z grubsza odpowiadający tej pozycji. Zrobiłem to zupełnie na piechotę metodą ,,kilku przybliżeń'' (tj. wstawiałem do pliku GPX element wpt odpowiadający punktowi ze śladu, który był ,,w okolicy'' szukanego miejsca. Oczywiście pierwszy strzał był niezbyt celny, ale po kilku podstawieniach znalazłem szukany punkt). Od tego punktu wyciąłem do końca (bo akurat do końca trasy się pokrywały) i zapisałem jako plik tmp.gpx. Teraz ustaliłem różnicę czasu między obu punktami. Do tego ostatniego zadania użyłem Perla:

#!/usr/bin/perl
# Uruchom np.: delta_days.pl -w 2008:8:24:10:2:9 -p 2008:9:6:10:3:51
use Date::Calc qw/Delta_DHMS/;
use Getopt::Long;

GetOptions("w=s" => \$wszesniej, "p=s" => \$pozniej);
@wczesniej = ex ($wszesniej); @pozniej = ex ($pozniej);

my ($d, $h, $m, $s) = Delta_DHMS(@wczesniej, @pozniej);
print "Różnica: d: $d, h: $h, m: $m, s: $s\n";

sub ex { my $w = shift ;  return ( split /[:;-]/, $w ) }

Różnica wyniosła 13 dni, minutę i 42 sekundy. Teraz uruchomiłem gpsbabela:

gpsbabel -t -i gpx -f tmp.gpx -x track,move=+13d0h1m42s -o gpx -F tmp-out.gpx

Śladem z plik tmp-out.gpx uzupełniłem dzisiejszy, niekompletny ślad. Skrypt gpsphoto (uruchomiony via My-photo-sync.sh) zsynchronizował wszystkie fotki. Oczywiście jest błąd (np. wynikający z tego, że wtedy i dziś poruszałem się z różną prędkością), ale imho jest to błąd akceptowalny...

Cycling Cycling Cycling

Całość jest tutaj. No i niech ktoś się teraz nie upiera, że Windowsem i Excelem to on wszystko obliczy....:-)

Jak już jestem przy tematyce rowerowej, to szukając butów SPD dla młodego usiłowałem obejrzeć stronę WWW jednego z większych trójmiejskich sklepów. Nie udało się... nur für Windows. I to tak dramatycznie: nic nie widać, w nic nie można kliknąć...

url | Sat, 06/09/2008 22:02 | tagi: , , , ,
Konwersja OTF na TTF

Poniżej skrypt zamieniający font w formacie OpenType na TrueType.

#!/usr/local/bin/fontforge
# Quick and dirty hack: converts a font to truetype (.ttf)
# cf. http://www.stuermer.ch/blog/convert-otf-to-ttf-font-on-ubuntu.html
Print("Opening "+$1);
Open($1);
Print("Saving "+$1:r+".ttf");
Generate($1:r+".ttf");
Quit(0);

Czy konwersja jest w 100% OK nie jest do końca pewne bo podobno gubiona jest informacja na temat par kernowych.

url | Sun, 24/08/2008 18:56 | tagi: , ,
Wycieczka do Kilonii
U-995
U-boot Ehrenmal
Königsstuhl
Königsstuhl

W tzw. długi weekend pojechaliśmy na wycieczkę (samochodem) do północnych Niemiec: Kilonia, Lubeka, wyspa Rugia. Pod Kilonią w miejscowości Laboe jest Das Technische Museum, pod którą to nazwą kryje się U-Boot udostępniony do zwiedzania. Jest to okręt typu VIIC o numerze 995, czyli trzeba wpisać U-995 do Google jakby ktoś chciał poszukać w Internecie więcej informacji na ten temat. Obok jest coś w rodzaju mauzoleum (Marine-Ehrenmal) i wieża. Nic ciekawego--jakaś ekspozycja nt. Bundesmarine + modele okrętów + coś tam jeszcze. Opisy wyłącznie po niemiecku... Można sobie śmiało darować. Z wieży oczywiście lepiej widać okolicę, więc jak ktoś jest ciekaw to może sobie wjechać windą.

Obok Laboe, bliżej Kilonii, w miejscowości Möltenort jest jeszcze jedno mauzoleum. Upamiętnia ono załogi okrętów podwodnych Kriegsmarine (U-boot Ehrenmal). Dla niezorientowanych: 80% U-Bootów, tj. około 840 z 1100, które weszły do służby zostało zatopionych. Wiele łodzi zostało zniszczonych w pierwszym rejsie, często pierwszy kontakt z wrogiem był dla załogi kontaktem śmiertelnym i ostatnim. Z tego co pamiętam około 40% łodzi nie zatopiło żadnego statku. Zginęło ok. 28000 spośród ok. 40000 marynarzy. Do tego cała sprawa była z góry przegrana (wojny o Atlantyk Ubootwaffe nie mogła wygrać), a poświęcenie tych ludzi z góry skazane na niepowodzenie i bezsensowne.

Zwiedzanie U-boota było w czwartek, w piątek pojechaliśmy do Lubeki i cały dzień zwiedzaliśmy stare miasto, szczególnie zwracając uwagę na kościół St Marien Kirche w którym Orgelmeisterem był Dietrich Buxtehude, (cf. Buxtehude -- zapomniany geniusz z Lubeki). BTW organów mistrza już nie ma bo się spaliły w 1942 roku w czasie nalotu RAF.

Wreszcie w sobotę jeździliśmy po Rugii. Byliśmy w Narodowym Parku Jasmund i oglądaliśmy Königsstuhl. Okazało się, że w Sassnitz stoi przycumowany jeszcze jeden okręt podwodny: HMS Otus. Dużo większy od U-995, bo to powojenna konstrukcja--nie zwiedzaliśmy. Potem zamek myśliwski Jagdschloss Granitz i powrót do domu z noclegiem u znajomych w Świnoujściu.

Zrobiłem dużo zdjęć ale wyszły tak sobie. Specjalnie na U-boota kupiłem lampę (FL-36, używaną na Allego), którą zresztą mało nie rozbiłem przez nieuwagę. Ostatecznie straciłem tam tylko jeden akumulator AA, który wtoczył się pod pokrywy podłogi i przepadł w czeluściach okrętu.

Ślad GPX z wycieczki jest tutaj. Więcej zdjęć jest na flickr.com. Ślad w formacie KML w przygotowaniu...

Dopisane 8 maja 2008: Przebytą trasę rejestrowałem moim bt747 (aka Iblue 747); teoretycznie logger powinien zmieścić zapis 20 godzinny ale dla pewności zgrywałem ślad codziennie. Po przyjeździe zagregowałem całość używając gpsbabela:

#!/bin/bash
gpsbabel -t -i gpx -f 20080501.gpx -i gpx -f 20080502.gpx \
   -i gpx -f 20080503.gpx -i gpx -f 20080504.gpx \
   -x track,merge,title="Trip to Laboe 30/4--4/5 2008" \
   -x simplify,count=2000 -o gpx -F sopot-laboe-sopot.gpx && \
grep -v '<course>0.000000</course>\|<fix>2d</fix>\|<ele>0.000000</ele>' \
   sopot-laboe-sopot.gpx > sopot-laboe-sopot_s.gpx

Teraz używając opisanych na innych stronach tego bloga skryptu gpsPhoto.pl dodałem współrzędne geograficzne do zdjęć. Kilkanaście zdjęć nie zostało oznakowanych -- wszystkie nieoznakowane były robione wewnątrz U-boota. Nic dziwnego zresztą bo toto ma podwójny stalowy kadłub w tym wewnętrzny dość gruby. Nie pamiętam ile konkretnie milimetrów, ale U-booty potrafiły się zanurzać na ponad 250 metrów, szacun!

Oczywistym rozwiązaniem jest dodanie współrzędnych ze zdjęć zrobionych w tym samym miejscu w momencie gdy GPS logger ,,widział'' niebo. Używając exiftool jest to banalnie proste:

#!/bin/bash
exiftool -TagsFromFile plik-bez-wsp -GPSLatitude -GPSLongitude -GPSLatitudeRef -GPSLongitudeRef plik-z-wsp

Dodałem też możliwość uruchomienia ww. skryptu moim w trybie Emacsa służącym do ładowania zdjęć na flickr.com. Działa to w ten sposób, że kopiowane są współrzędne GPS z pliku podanego w wierszu minibufora do pliku, którego nazwa znajduje się w wierszu bieżącym (tj. wierszu, w którym jest kursor).

Na ,,odcinku'' ładowania zdjęć też się popsuło. Mój skrypt przestał obracać zdjęcia zrobione w układzie portretowym. Przestała działać metoda flickr.photos.transform.rotate i to w dość dziwny sposób: zwracany komunikat jest OK, ale obrazek nie jest obracany. Do tego wykonanie flickr.photos.transform.rotate oddzielnym skryptem działa. Podejrzewam braci Flickr, że coś zmienili na serwerze i namieszali. Ostatecznie zmieniłem strategię: zdjęcia są obracane ,,fizycznie'', z użyciem jpegtran wywołanym z ,,wnętrza'' skryptu perlowego za pomocą system().

Po załadowaniu zdjęć na flickr.com. Poprawiłem plik KML używając do tego skryptów kml-adjust-urls/kml-skip-deadlinks.

Plik są tutaj: KML oraz GPX.

url | Wed, 07/05/2008 12:28 | tagi: , , , , , ,
Xetex: nowa wersja TeXa

Dopisane 1 listopada 2010: Ten wpis jest myląco-przestarzały. Aktualne informacje na temat XeTeXa są w dokumencie: Używanie XeTeXa w systemie Linux (dystrybucja TEXLive). Przykładowe pliki są natomiast tutaj.

Xetex to nowy wariant TeXa. Cytując wpis z Wikipedii, który przed chwilą sam utworzyłem:-) Umożliwia korzystanie ze standardu Unicode oraz fontów komputerowych we współczesnych formatach, takich jak OpenType oraz AAT. Twórcą XeTeXa jest Jonathan Kew. Wstępne wersje XeTeXa były dostępne tylko na platformie Mac OS X. Wersje programu na platformę Linux i Windows pojawiły się w 2006 r. Ponieważ tak było, to traktowałem XeTeXa z rezerwą--ot jakiś wariant TeXa na Maca. Wprawdzie dostępny w Linuksie, ale pewnie z wieloma ograniczeniami. Absolutnie niesłusznie. Jest to już w tej chwili program production stable, w 99% kompatybilny z klasycznym TeXem.

[Xetex+Emacs]
[Xetex+Emacs]
[Xetex + Emacs]

Dalej cytując Wikipedię: XeTeX jest dołączany do współczesnych dystrybucji TeXa, takich jak: TeXLive, MikTeX (od wersji 2.7), MacTeX. Ja mam TeXLive 2007. Potrafi wykorzystać fonty dostępne w systemie TeX oraz te dostępne w systemie. Polecenie xetex plik.tex jest równoważne uruchomieniu plain TeXa, co m.in. oznacza skład fontami CM. Czegoś takiego jak xemex zaś nie ma. Najpierw chciałem wypróbować jak działa xetex z jakimś egzotycznym fontem systemowy, np. takim jak Cyklop, dostępne w formacie OpenType. Żeby to sprawdzić musiałem najpierw doczytać jak instalować fonty w Linuksie.

Fonty są standardowo umieszczone w katalogu /usr/share/fonts. To mi nie za bardzo pasowało. Jak zmieniam system, to jest kłopot, które fonty są natywne, tj. zainstalowane z archiwów .rpm, a które nie. Wolałbym Cyklopa umieścić w /usr/local/share/fonts. Plikiem konfigurującym fonty systemowe jest /etc/fonts/fonts.conf, ale modyfikacje należy wpisywać w /etc/fonts/local.conf:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<!-- /etc/fonts/local.conf file for local customizations -->
<fontconfig>
<!-- Font directory list -->
        <dir>/usr/local/share/fonts</dir>
</fontconfig>

Teraz zrobiłem restart a następnie (jako root):

mkdir /usr/local/share/fonts
cd  /usr/local/share/fonts 
mkfontscale && mkfontdir # na wszelki wypadek, być może niepotrzebne
fc-cache

Teraz wpisanie fc-list | grep Cyk, powoduje wypisanie na ekran:

Cyklop:style=Italic
Cyklop:style=Regular

Teraz już z górki. Zredagowałem w Emacsie następujący plik:

%% -*- coding: utf-8 -*-
\font\titrm="Cyklop" at 15pt
\font\titit="Cyklop/I" at 12pt
\font\rm="Iwona" at 12pt
\rm
\parindent0pt
\obeylines
\nopagenumbers
%% http://galaxy.uci.agh.edu.pl/~szymon/raven.shtml
\leftline{\titrm Kruk}
\leftline{\titit {(tł. Stanisław Barańczak)}}
\medskip

W głuchą północ, w snów tumanie, gdy znużyło mnie dumanie
Nad księgami zapomnianej magii, znanej w dawnych dniach,
Chyląc głowę nad foliałem, niespodzianie usłyszałem
Chrobot, jakby ktoś nieśmiałym palcem skrobał znak na drzwiach.
,,Gość'', mruknąłem, ,,tym sygnałem daje znać, że stanie w drzwiach:
Skąd ten zimny pot i strach?''

\bye

Zwracam uwagę na sposób deklarowania fontów. Cyklop to nazwa fontu a nie pliku. Xetex nie potrzebuje plików .tfm dlatego możliwa jest taka deklaracja. Do tego zapis Cyklop/I oznacza kursywę. Podobnie /B to odmiana gruba a /BI to gruba kursywa. Bardziej finezyjne odmiany (cienkie, wąskie itp...) trzeba deklarować tradycyjnie (podając nazwę pliku). Nazwa może zawierać odstępy--po to są cudzysłowy.

Kompiluję plik wydając polecenie:

xetex test-cyklop.tex

Na dysku powstaje plik PDF zwierający co trzeba. Plik źródłowy jest tutaj.

OK, teraz co dalej? W szczególności jak jest z: przenoszeniem wyrazów w języku polskim, dołączaniem rysunków, matematyką, ładnymi plikami PDF z odsyłaczami itp.? Okazuje się, że to wszystko jest wystarczy przełączyć się na LaTeXa. Oto test nr 2:

%% -*- coding: utf-8 -*-
\documentclass[a4paper]{article}
\usepackage[EU1]{fontenc} %% \usepackage[T1]{fontenc}
%\usepackage{lmodern}
% Support for Iwona, cf. http://pinkaccordions.homelinux.org/staff/tp/prog/tex/misc/
\usepackage{iwona}
\usepackage{polski} %% wzorce przenoszenia itp...
\begin{document}

\begin{flushleft}
\begin{bf}
KRUK (\emph{The Raven\/})\\
E. A. Poe
\end{bf} \end{flushleft}

\begin{verse}
Raz w północnej, głuchej dobie, gdym znużony siedział sobie\\
Nad księgami dawnej wiedzy, którą wieków pokrył kurz -- \\
%% ...itd...

Pakiet lmodern udostępnia kroje Latin Modern i wszystko działa, jak w klasycznym LaTeXu. Pakiet fontenc deklaruje nowe kodowanie EU1. Można go używać ale można też pozostać przy klasycznym T1. Kodowanie EU1 jest niezbędne do składania tesktów w każdym innym języku za wyjątkiem angielskiego (innymi słowy ASCII działa, wszystko inne, raczej nie) Powyższy przykład działa out-of-the-box w TL2007. Pliki są tutaj.

Kolejny test dotyczył cyrylicy i rysunków. Tekst rosyjski wkleiłem po prostu z google translate, więc może być lekko bez sensu:

%% -*- coding: utf-8 -*-
\documentclass[a4paper]{article}
\usepackage[xetex]{graphicx}
\usepackage[EU1]{fontenc} %% \usepackage[T1]{fontenc}
\usepackage{tgtermes} %% \usepackage{lmodern}
%\usepackage{tgheros}
%\renewcommand{\sfdefault}{qhv} %% tgheros.sty sets qhv as main body font
%\usepackage{tgcursor}% tgcursor.sty sets qcr as main body font. Why?
%\renewcommand{\ttdefault}{qcr}
%\usepackage{url,sfheaders}
%\usepackage[russian,english]{babel}
%
\bibliographystyle{plain}
\flushbottom
\raggedright
%
\title{\textsf{Examining OSS success: information technology 
  acceptance by FireFox users}}
\author{*** No author ***}
%
\begin{document}
\maketitle
\section{Introduction}

%%
Open source software (OSS) is currently one of the most debated
phenomena in both academia and the software industry....

 %% ... itd ...

No więc powyższe daje następujące wyniki: fonty LM nie zawierają cyrylicy więc układ T1+LM nie działa. Termes ma cyrylicę ale T1+Termes powoduje błąd:

Output file removed.
Output written on ff-4-isd06-test.pdf (1 page).

Faktycznie nie ma pliku ff-4-isd06-test.pdf. Poprawnie działa Termes z kodowaniem EU1. Nie ma w TL2007 odpowiednich plików dla kodowania EU1 dla fontów TeX-Gyre (podobnie nie ma dla Iwony), ale jest to dość proste do zrobienia . Wynikowy plik PDF jest tutaj. Plik źródłowy jest zaś tutaj. Kompletny przykład zawiera też rysunki. Xetex radzi sobie doskonale i obsługuje formaty: PNG/JPG + PDF, czyli z grubsza to samo co pdfTeX.

Uwaga: przykład zawiera zaprocentowane polecenia przełączające śródtytuły na sans-serif a font o stałej szerokości na Cursor (z zestawu fontów TeX-Gyre). Żeby to wszystko działało, to trzeba uaktualnić fonty TeX-Gyre ponieważ w TL2007 jest zainstalowana wstępna, niekompletna wersja. W przykładzie używa się też kodowania EU1. Pliki niezbędne do wykorzystywania tego kodowania z fontami TeX-Gyre są tutaj.

Ostatni przykład to matematyka składana krojem alternatywnym (Times, Palatino). Do tego służą pakiety txfonts/pxfonts (standardowo instalowane w nowych dystrybucjach LaTeXa):

%% -*- coding: utf-8 -*-
\documentclass[a4paper]{article}
\usepackage[xetex]{graphicx}
\usepackage{txfonts}
\usepackage[EU1]{fontenc}
\usepackage{tgtermes}
\usepackage{hyperref}
\usepackage{polski}
%
\title{*** No title given ***}
\author{*** No author given ***}
\begin{document}
\maketitle
\section{Analiza statystyczna zmiennych makroekonomicznych}
...

Ważna jest kolejność, najpierw \usepackage{txfonts}. Inaczej XeTeX podstawia inne fonty zamiast Times. Skład na pierwszy rzut oka wygląda OK. Pliki tradycyjnie są tutaj.

No i tyle o XeTeX. W jednym zdaniu: działa jak pdfTeX tyle, że z plikami w UTF8.

Aby wygodniej posługiwać się Unicode doinstalowałem do Emacsa pakiet xmlunicode Normana Walsha (należy pobrać xmlunicode.el oraz unichars.el). Instalacja polegała na skopiowaniu ww. plików do ~/.emacs-local (tam trzymam lokalne rozszerzenia i pakiety). Następnie należy określić wartość zmiennej unicode-character-list-file w pliku xmlunicode.el. Żeby było łatwiej dopisałem też w ~/.emacs:

(define-key global-map (kbd "C-c u") 'unicode-character-insert-char )
(autoload 'unicode-character-insert "xmlunicode" "Unicode support for XML" t)
(autoload 'unicode-character-insert-char "xmlunicode" "Unicode support for XML" t)
(autoload 'unicode-character-menu-insert "xmlunicode" "Unicode support for XML" t)

Teraz naciskając C-c u mogę wstawić dowolny znak Unicode z minibufora (z uzupełnianiem (completion) oczywiście). Natomiast funkcję unicode-character-menu-insert, pozwalającą na wybór znaku przez wskazanie myszą, dopisałem do menu. Funkcja unicode-character-menu-insert obsługuje rzecz jasna tylko znikomą część znaków Unicode -- te najczęściej używane. Menu zawierające wszystkie znaki raczej byłoby niewygodne w użyciu. BTW, to co wyświetlane jest w menu jest zdefiniowane w zmiennej unicode-character-menu-alist. Od razu dopisałem dwa znaki: #x201E (polski cudzysłów otwierający) i #x2026 (wielokropek).

Na koniec przydatny link do opis zestawu znaków Unicode.

Dopisane 9 marca 2008: Zamiast fontenc można korzystać z pakietu fontspec (jest zainstalowany w TL2007). Pakiet ten jest alternatywą dla klasycznego mechanizmu wyboru fontów w LaTeXu znanego jako NFSS. Wadą NFSS było to, że wymagał kłopotliwych dla tzw. przeciętnego użytkownika zabiegów na etapie instalowania fontu. Jeżeli zamiast fontenc używamy fonspec, to wtedy preambuła dokumentu wygląda następująco:

%% -*- coding: utf-8 -*-
\documentclass[a4paper]{article}
\usepackage{fontspec}
\setmainfont{Iwona}
%\setsansfont{TeX Gyre Heros} % odmiana bezszerfowa
%\setmonofont{TeX Gyre Cursor} % odmiana `monospace'
\usepackage{polski} %% wzorce przenoszenia itp...
  %%%  ... itd ...
\begin{document}
 %% ... itd ...

Jak widać do włączenia fontu używana jest jego nazwa a nie nazwa pliku z fontem. Z dokumentacji pakietu wynika, że aby powyższe zadziałało font musi być zainstalowany w systemie -- umieszczenie odpowiednich plików w systemie TeX nie wystarczy. Jest wszakże możliwość takiego skonfigurowania pakietu fontspec żeby działał z fontami zainstalowanymi w texmf. W tym celu należy dodać opcjonalny argument ExternalLocation, tj. na przykład:

\fontspec[ExternalLocation]{texgyrecursor-regular}

Pakiet fonspec czasami nie działa z pakietami fontowymi z tradycyjnego LaTeXa. W szczególności nie działał (przynajmniej u mnie) w połączeniu z fontami matematycznymi z pakietów txfonts/pxfonts.

Dopisane 19 marca 2008: Za listą GUST-l: A jak wygenerować format XeMeX? albo innymi słowy plain-format dla XeTeXa z polskimi wzorcami przenoszenia wyrazów? (to ja się zapytałem:-).

Odpowiedź jest następująca (Piotr Strzelczyk): niestety to jeszcze nie jest oczywiste. Zwłaszcza, że rozwój formatów XeTeXa poszedł zdecydowanie w stronę LaTeXa. Trzeba znaleźć wersję pliku XeTeX.ini opierającą się na eTeXu. (W archiwum na stronie twórcy, jest chyba zła wersja, za to na TeXlive jest dobra.) Ma być sygnowana:

% xetex.ini
% jonathan kew
% public domain
% updated: 15 Sept 2006

Następnie [należy] sprawdzić jakie języki są włączone w language.def (nie mylić z language.dat) i dołączyć język polski (pamiętając, że należy używać plików ,,unikodujących'' definicje przeniesień -- wraperów -- np. xu-plhyph.tex):

\addlanguage {polish}{xu-plhyph}{}{2}{2}

No i później już normalnie -- generujemy format. I możemy pisać po polsku, włączając język poleceniem \uselanguage{polish} (po szczegóły odsyłam do dokumentacji e-TeXa).

Janusz Nowacki dopisał zaś: Można też \uselanguage{polish} ustawić już w language.def i będzie to prawie XeMeX (format z domyślnym polskim dzieleniem [wyrazów]).

Dopisane 26 marca 2008: Oprócz TeXGyre można spróbować używać XeTeXa z fontami Minion/Myriad rozpowszechnianymi razem z programem AcrobatReader firmy Adobe. Są jeszcze do wypróbowania fonty Asana Math (autor: Apostolos Syropoulos). Problem z Asana Math jest wszakże taki, że autor udostępnił tylko goły font, nie bardzo wiem jak się dobrać do poszczegółnych znaków w foncie.

url | Fri, 07/03/2008 13:02 | tagi: , , , , , ,
Google earth w Fedora Core 8

Googleearth wersja na linuksa nie działa `out of the box'. Bardzo wolno startuje, a na ekranie pojawia się komunikat:

do_wait: drmWaitVBlank returned -1, IRQs don't seem to be working correctly.
Try running with LIBGL_THROTTLE_REFRESH and LIBL_SYNC_REFRESH unset.

Sądząc z liczby stron w Google jest to problem wielu użytkowników. Rozwiązanie znalazłem tutaj (pomocne mogą być też uwagi z tej strony). Na wszelki wypadek zniknięcia oryginału w czeluściach Internetu poniżej kopiuję co trzeba zrobić. Otóż do pliku drm_nowaitVblank.c wpisujemy:

#include <sys/time.h>
#include <unistd.h>
#include <string.h>

#define	DELAY	33333

int drmWaitVBlank(void)
{
	static struct timeval last = { 0, 0 };
	static struct timeval now  = { 0, 0 };
	int udiff;
	
	gettimeofday(&now, NULL);
	udiff = (int)now.tv_usec - (int)last.tv_usec;
	if (udiff < 0)
		udiff += 1000000;
	udiff -= DELAY;
	if (udiff < 0)
		usleep(-udiff);
	memcpy(&last, &now, sizeof(struct timeval));
	
	return 0;
}

Plik należy skompilować, uruchamiając gcc w następujący sposób:

gcc -o drm_nowaitVblank.so -shared -fPIC -ldl drm_nowaitVblank.c

Plik należy umieścić tam gdzie znajduje się plik googleearth-bin, u mnie jest to /opt/google-earth/. Teraz trzeba zmienić skrypt googleearth w wierszu zwierającym exec "./googleearth-bin" "$@" (jest tylko jeden wiersz z exec w skrypcie googleearth) na:

LD_PRELOAD="./drm_nowaitVblank.so" exec "./googleearth-bin" $*

Googleearth wyświetla też komunikat o brakujących fontach. To akurat jest łatwe do poprawienia:

yum -y install bitstream-vera-fonts 

Teraz mogę w komfortowy sposób oglądać swoje zdjęcia z samodzielnie wygenerowanych, przy pomocy GPSbabela plików KML (sposób jaki w jaki to robię opisałem wcześniej). Tutaj są próbki a jednocześnie propozycje ciekawych do zwiedzania miejsc w okolicach Sopotu (więcej wkrótce): Oliwa, Dolina Radości | Rezerwat Kacze Łęgi, Witomino | Elekrownia Rutki, Jar Raduni | Z Gdyni do Sopotu wzdłuż plaży | wzdłuż Potoku Oliwskiego, potem Sopot. Więcej jest tutaj.

url | Sun, 10/02/2008 20:15 | tagi: , , ,
Iblue 747 GPS logger

GPS logger to odbiornik GPS wyposażony w pamięć pozwalającą na rejestrację przebytej drogi (śladu). Ślad z GPSa jest mi potrzebny do dodania współrzędnych geograficznych do zdjęć. Do tej pory do tego celu wykorzystywałem odbiornik Geko 301 firmy Garmin. Geko jednakże jest urządzeniem starszego typu i generalnie nie działa jeżeli nie widzi ,,czystego nieba''. Nie działa w lesie, często są duże problemy w terenie mocno zabudowanym, itp.

Postanowiłem kupić lepszy odbiornik. Czytając fora i blogi poświęcone GPS najpierw dowiedziałem się, że jest coś takiego jak SIRF. Już chciałem takiego SIRFa kupić ale doczytałem o chipsecie MTK. Według niektórych doniesień jest on lepszy niż SIRF 3 (są też tacy co twierdzą, że tak nie jest; głosów w stylu X to syf a ja jestem wielkim znafcom nie biorę pod uwagę).

Ceny loggerów na allegro zaczynają się od 300 zł (styczeń 2008) a ja znalazłem coś chwalonego, podobno działającego z Linuksem co jest dla mnie bardzo ważne i (okazało się) tańszego pn. i-Blue 747 Dziwne, ale w Polsce nikt tego nie sprzedaje, przynajmniej w Internecie. Znalazłem i-Blue na ebay za mniej niż 200 zł przy czym 30% tej kwoty stanowiły koszty wysyłki.

BTW opis na e-bay był w języku włoskim, sklep w Niemczech, sklepowy (sądząc po imieniu i nazwisku, Turek) po angielsku słabo pisał, ale się dogadaliśmy i paczka doszła.

[[ib747-wine screen dump]]

Do obsługi loggera jest dołączony CDrom z programem. Program jest of course na system MSW, ale podobno działa z wine. Dokładnie postępując według instrukcji stąd dało się go uruchomić: należy zainstalować wine, uruchomić winecfg, a następnie:

cd ~/.wine/dosdevices
ln -s /dev/ttyUSB0 com1

Teraz należy skopiować plik instalacyjny i uruchomić wine DataLog.exe. Program zostanie zaistalowany tyle, że u mnie nie działa. Ściąga ślad całkiem dziarsko ale nie do końca bo zwisa. Próbowałem dwa razy raz zawisł gdy wskaźnik był na 49% drugi raz na 89%. W google znalazłem opinie użytkowników Ubuntu utrzymujących, że w ich systemie wszystko działa (like a charm). BTW w MS Windows też były problemy, zarówno z instalacją, jak i z uruchomieniem, ale jak w końcu poszło, ale co z tego przecież nie będę go używał w systemie W.

Uwaga: Aby ściągnąć ślad albo zmienić konfigurację urządzenia przełącznik musi być w pozycji LOG. Po uruchomieniu programu pierwsze co trzeba zrobić to zatrzymać zapis śladu (można to zrobić tylko programowo), bo inaczej logger cały czas zapisuje dane.

Zainstalowałem też w bólach bt747 (aplikacja Javy). Zresztą autor ostrzega, że dokumentacja jest niedoskonała. Po rozpakowaniu zipa, zainstalowałem zawartość katalogu rxtx-2.1-7-bins-r2, zgodnie z tym co jest napisane w pliku INSTALL, umieszczonym w tym katalogu. Następnie uruchomiłem skrypt run_rxtx.sh, zmieniając wartość zmiennej MYROOTPATH=/usr/local/bt747. Żby użytkownik miał dostęp do /dev/ttyUSB0 musi być w grupie uucp, to już ustaliłem wcześniej. Dalej jednak nie działało (check_group_uucp(): error testing lock file creation Error details: Permission denied check_lock_status: No permission to create lock file.). Kluczowa okazała się zmiana praw dostępu do /var/log:

chmod 777 /var/lock
[[bt747 screen dump]]
[[bt747 screen dump]]

Aplikacja, jak widać obok, wygląda okropnie, ale funkcjonalnie jest OK: ściąga dane i kasuje LOG. Więcej nie potrzebuję. Żeby skrypt run_rxtx.sh działał uruchamiany z dowolnego katalogu musiałem jeszcze zmienić wartości zmiennej CLASSPATH (albo wstawić zawartość CLASSPATH jako wartość opcji -cp przy uruchamianiu javy):

CLASSPATH=${RXTXJAR}:$MYROOTPATH/webstart/Waba_only.jar:\
   $MYROOTPATH/dist/BT747_rxtx.jar:.:$CLASSPATH

Wreszcie jest też aplikacja pn. MTKbabel (skrypt Perla), działająca podobnie do programu GPSbabel, czyli z wiersza poleceń. Do działania wymaga zainstalowania modułu Device::SerialPort. Ten sposób działania podoba mi się najbardziej. Pobranie danych sprowadza się do wydania następującego polecenia:

mtkbabel -f nazwa-pliku-bez-rozszerzenia -t

Powstaną dwa pliki (dlatego nie podaje się rozszerzenia): jeden w formacie binarnym, drugi w fomacie GPX. Jedno wielkie ale -- transmisja jest bardzo wolna: plik binarny o wielkości ca 650 kB (czyli ca 30% pamięci) był ściągany z loggera 9 minut 47 sekund. Czyli cała pamięć byłaby ściągana 30 min. Hmm... Dla porównania obie wcześniej wymienione aplikacje ściągały te 650 kB w circa 2 minuty. Różnica jest.

Wykonałem już dwa eksperymenty porównujące iblue z moim Garminem 301. Pierwsza trasa to las, w wielu miejscach gęsty i wysoki. Do tego też w wielu miejscach jary o stromych zboczach. Trasa zapisana przez geko oraz trasa zapisana przez iblue. Nie ma porównania, bo geko w zasadzie w lesie nie działał.

Druga trasa to teren zabudowany, a konkretnie Sopot. Zabudowa w większości 3--4 kondygnacyjna. Dwa razy wszedłem do sklepu (Geko zgubił w pierwszym ślad, ale poczekałem po wyjściu aż znajdzie, a za drugim razem sam szybko się odnalazł). Oba ślady wyglądają nieźle (cf. geko iblue). Iblue pogubił się w okolicach skrzyżowania 1-go Maja z Aleją Niepodległości, gdzie wszedłem do sklepu (na dłużej). Nie zgubił satelity, tak jak geko, ale trasa w tym miejscu jest nieprawidłowa (wielki `tik' od 1-go Maja wzdłuż Al. Niepodległości w stronę Gdańska. Na mapie od szpilki oznaczonej jako `sklep' do szpilki `tik'. W rzeczywistości od sklepu poszedłem do szpilki oznaczonej `tunel' i dalej wzdłuż ul. Bohaterów Monte Cassino, co zresztą też jest zaznaczone). Nie ma różnicy pomiędzy śladami zredukowanymi do 500 punktów i dużo większym -- 2500 punktów.

Reasumując: wszystkie zdjęcia zrobione na obu trasach zostały (z zadowalającą precyzją) oznakowane współrzędnymi geograficznymi na podstawie śladu z Iblue, a po to go kupiłem.

Ślad iblue zredukowałem za pomocą gpsbabela, bo oryginalny ślad składa się z tysięcy punktów. Iblue zapisuje ślad co sekundę, Garmin w trybie auto (Iblue nie ma czegoś takiego jak auto). Kiedyś eksperymentowałem z Garminem i też go przestawiłem na zapis sekundowy, ale nie zaobserwowałem różnicy pomiędzy takim trybem a trybem auto. Polecenie uproszczenia śladu wygląda następująco (Log.nma zawiera dane zapisane jako NMEA):

gpsbabel -i nmea -f Log.nma -x simplify,count=450 \
   -o gpx -F 2008-01-23BT_x.gpx

Poniżej bardziej zaawansowane polecenie: zapisz jako GPX, ślad od 2008-01-24T13:40 od 2008-01-24T14:50, następnie upraszczając go do 500 punktów. Uwaga: opcje -x nie są przemienne, tj. ich zamiana skutkowałaby najpierw uproszczeniem do 500 punktów, a potem wycięciem od-do, dając w rezultacie ślad dużo bardziej uproszczony:

gpsbabel -i nmea -f GPSDATA-20080123.nmea \
-x track,start=200801241340,stop=200801241450 -x simplify,count=2500 \
-o gpx -F 20080124BT_x.gpx
[[Logger Iblue747]]

Kończąc, trochę mnie zastanawia/niepokoi trwałość tego urządzenia, bo jakość wykonania jest taka sobie (100% chińszczyzna). Jakby mi, np. wypadł z ręki, to chyba byłby to jego ostatni lot. Nawet nie próbuję tego sprawdzać. Poza tym logger wydaje się całkiem, całkiem...

Dopisane 16 marca 2008: Dioda GPS: pomarańczowa -- szuka satelitów; pomarańczowa/miga -- nawiguje; niebieska/miga -- mało pamięci (mniej niż 20%); niebieska -- pamięć jest zapełniona, stop (cokolwiek to znaczy); trzykrotny błysk -- zarejestrowanie POI. Dioda baterii: czerwona -- bateria prawie wyczerpana; zielona -- ładowanie; zielona/miga -- naładowana. Dioda BT: niebieska -- BT włączone, ale nie połączony; wolno miga -- połączony w sleeping mode; szybko miga -- połączony i gotowy.

Dopisane 16 marca 2008: projekt formularzy w aplikacji bt747 jest daleki od ergonomicznego, stąd poniżej krótka rekapitulacja. Aby usunąć plik: Fmt/Erase (albo Fmr/Set&erase). Pobranie pliku i zapis na dysk: Log/Get Log i inne przyciski z tej karty. Karta File: konfiguracja. Karta Con: połączenie z urządzeniem. Innych kart w zasadzie nie używam.

Dopisane 19 marca 2008: Poniżej skrypt do zamiany pliku NMEA pobranego z bt747 na plik GPX. Skrypt upraszcza uruchomienie gpsbabela. Ponadto uruchomiony z opcją -U wycina niepotrzebne znaczniki (np. <ele>, czyli wysokość, która w moim przypadku zawsze wynosi zero. Dodatkowo liczy długość wyciętego śladu. Pełny skrypt jest tutaj.

# !/bin/bash
#
# Skrypt ułatwiający uruchomienie programu gpsbabel
# Wycina fragment ścieżki + upraszcza ślad do zadanej liczby punktów
# Na koniec plik podaje długość wyciętego śladu.
#
OUT=''
FORMAT=nmea
ROK=`date +"%Y"`
XREDUCE="NO"

while test $# -gt 0; do
  case "$1" in

    -help|--help) echo "$USAGE"; exit 0;;

    -od)   shift; START="$1";;
    -od*)  START="`echo :$1 | sed 's/^:-od//'`";;
    -do)   shift; STOP="$1";;
    -do*)  STOP="`echo :$1 | sed 's/^:-do//'`";;
    -max)  shift; COUNT="$1";;
    -max*) COUNT="`echo :$1 | sed 's/^:-max//'`";;
    -rok)  shift; ROK="$1";;
    -rok*) ROK="`echo :$1 | sed 's/^:-rok//'`";;
    -format)  shift; FORMAT="$1";;
    -format*) FORMAT="`echo :$1 | sed 's/^:-format//'`";;
    -U)    XREDUCE="YES";;
    -out)  shift; OUT="$1";;
    -out*) OUT="`echo :$1 | sed 's/^:-out//'`";;

    -h)  echo usage; exit;;
    -h*) echo usage; exit;;

    *)   FILE="$1";;
  esac
  shift
done

if [ "$XREDUCE" = "YES" ]  ; then 
  echo "** Tracks will be simplified! (Option -U)" ; fi

EXTENSION=${FILE##*.}
BASE=`basename $FILE .$EXTENSION`

if [ "$OUT" = "" ] ; then OUTFILE="$BASE.gpx" ;
else OUTFILE="$OUT" ; fi

if [ "$START" != "" -a "$STOP" != "" ] ; then PERIOD="-x track,start=$ROK$START,stop=$ROK$STOP" ; 
   elif [ "$START" != "" ] ; then PERIOD="-x track,start=$ROK$START" ; 
   elif [ "$STOP" != "" ] ; then PERIOD="-x track,stop=$ROK$STOP" ; 
fi

if [ "$COUNT" != "" ] ; then SIMPLIFY="-x simplify,count=$COUNT" ; fi

if [ -f "$BASE.$EXTENSION" ] ; then
   gpsbabel -i $FORMAT -f $BASE.$EXTENSION $PERIOD $SIMPLIFY -o gpx -F $OUTFILE

   if [ -f "$OUTFILE" -a "$XREDUCE" = "YES" ] ; then
      extension=${OUTFILE##*.}
      simname="`basename $OUTFILE .$extension`_s.$extension"
      echo "** File $OUTFILE simplified to $simname" ; 
      # perl -e 'while ( <> ) { unless(/<ele|fix|course|speed>/) ... to błąd !!
      perl -e 'while ( <> ) { unless(/<(ele|fix|course|speed)>/) { print $_ }} ' $OUTFILE > $simname
      OUTFILE=$simname
   fi
   else echo "File $BASE.$EXTENSION found!" ; echo "$USAGE"
fi

if [ -f "$OUTFILE" ] ; then
## Oblicz dystans:
echo "** Counting distance covered in: $OUTFILE "

perl -e 'use Geo::Distance; my $geo = new Geo::Distance;
   my $qchars = "\042\047"; # znaki cytowania pojedynczy i podwojny
   while (<>) {
     if (/<trkpt\s+lat\s*=\s*([$qchars])([^$qchars]+)\1\s+lon\s*=\s*([$qchars])([^$qchars]+)\3/) {
        $lat=$2; $lon=$4;
        unless ($trkpt < 1) { $dist += $geo->distance( "meter", $plon, $plat => $lon, $lat ); }
        $trkpt++; $plat=$lat; $plon=$lon;
     }
   }
   print "** Distance covered (meters): $dist\n"; ' $OUTFILE
fi

url | Fri, 25/01/2008 12:35 | tagi: , , , , , ,