środa, 29 grudnia 2010

Wydatki na rowery

Koniec roku sprzyja publikowaniu różnych podsumowań. Ja też coś podsumuję -- moje wydatki rowerowe w latach 2001--2010, tj. ostatnie dziesięć lat (w PLN):


| 2010 2009 2008 2007 2006 2005 2004 2003 2002 2001 | Razem |
+----------------------------------------------------------------------------+----------+
| 2663.1 4132.2 9771.2 1036.8 690.0 3826.5 990.8 2084.1 2282.7 7067.7 | 34,545.0 |

W tym czasie kupiłem 2 rowery szosowe, 4 mtb i 3 dziecięce:-)

Dopisane 31 stycznia 2010: Mówiąc dokładnie 1,5 roweru szosowego, tj. dwie ramy (bo pierwsza pękła) i dwa widelce a reszta ta sama: Campagnolo Daytona (obecnie Centaur). Piasty, klamki, hamulce, przerzutki, środek, korba działają bez zarzutu po przejechaniu 46,475 km. Wymieniane tylko to co się zużywa: łańcuch, tryb i klocki...

Dopisane 31 stycznia 2010, po południu: A i jeszcze jedna ciekawostka 34,545 - 7,613 = 26,932 PLN. Te 7,613 to tyle co wydała reszta rodziny:-). W tym czasie przejechałem 74,730 km, co daje 26,932/74,730 = 0.36 PLN/km. Mimo wszystko znacząco taniej niż taksówką, ale już pociągiem niekoniecznie, bo przykładowo 60 km wycieczka to 21,50 PLN...

Oceniając z tej perspektywy wydatki rodziny -- niby znacząco mniejsze (trzy osoby wydały 28% tego co ja) -- i zakładając, że przejechali 7,5 tys (tj. przeciętnie 2,5 tys na łeb -- pewnie mniej ale niech im będzie) otrzymamy 7613/7,500 = 1.02 PLN/km... Nieefektywna alokacja zasobów, jednym słowem.

środa, 8 grudnia 2010

Picasa Linux signup problem

Nie mogę się zalogować w programie picasa (wersja dla linuksa, 3.0 beta). Wpisując Picasa Linux signup problem do Google znalazłem podpowiedź:


cp /usr/lib/wine/wininet.dll.so /opt/google/picasa/3.0/wine/lib/wine/

U mnie przynajmniej powyższe działa.

Się przy okazji okazało, że zdjęcia zawierające współrzędne geograficzne przesłane via formularz nie są traktowane jako geotagowane . Picasaweb rozpoznaje zdjęcia jako geotagowane jeżeli są ładowane programem picasa. Na flickr.com jest pod tym względem prościej, bo współrzędne geograficzne są pobierane ze zdjęcia po stronie serwera--wystarczy przesłać plik i nie jest istotne w jaki sposób...

niedziela, 28 listopada 2010

Zdjęcia z flickr.com na googlemaps

Flickr2Map to usługa, dzięki której użytkownicy flickr.com mogą wyświetlić geotagowane zdjęcia m.in. na google maps. Przykład:


http://www.robogeo.com/Flickr2Map?referer=http://www.flickr.com/photos/tprzechlewski/3087054865/&type=map&view=satellite

Żeby za dużo nie musieć wpisywać, zrobiłem skrót do usługi.

czwartek, 25 listopada 2010

poniedziałek, 22 listopada 2010

sobota, 20 listopada 2010

Przykład wykorzystania pakietu keyval

LaTeXowe makro z dwoma opcjonalnymi i dwoma obowiązkowymi argumentami. Wartością domyślną opcjonalnych argumentów są argumenty wymagane. Można to zaimplementować następująco:


\documentclass{article}
\usepackage{keyval}
\makeatletter
%% ...
\define@key{hopla}{foo}{\def\HoplaArgFoo{#1}}
\define@key{hopla}{bar}{\def\HoplaArgBar{#1}}
\newcommand\HoplaCommand[3][]{%
%% `reset' wartości poleceń \HoplaArgFoo/\HoplaArgBar
\let\HoplaArgFoo \@empty \let\HoplaArgBar \@empty
\setkeys{hopla}{#1}%%
%% jeżeli \HoplaArgFoo jest empty, tj. nie podano argumentu foo:
\ifx\HoplaArgFoo \@empty \def\HoplaArgFoo{#2} \fi
%% to samo dla \HoplaArgBar:
\ifx\HoplaArgBar \@empty \def\HoplaArgBar{#3} \fi
%% demonstracja:
FooArg: \HoplaArgFoo. BarArg: \HoplaArgBar. [#2 #3]\par }
\makeatother
%% ...
\begin{document}

\HoplaCommand[foo=OA1,bar=OA2]{Arg1}{Arg2}

\HoplaCommand[bar=OA2]{Arg1}{Arg2}

\HoplaCommand{Arg1}{Arg2}
\end{document}

BTW: plik latex.ltx zawiera \def\@empty{} -- gdyby ktoś był ciekaw co to za tajemnicze \@empty.

piątek, 19 listopada 2010

Sprawdzanie poprawności dokumentów na pinkaccordions.homelinux.org

Sprawdziłem dziś http://pinkaccordions.homelinux.org/wblog za pomocą xmllinta i ponieważ się okazało, że są błędy postanowiłem skończyć z partyzantką. Od dziś kilka stron będę weryfikował automatem, np. w taki sposób:


SGML_CATALOG_FILES=~/etc/xml/catalog xmllint --catalogs --noout --valid http://pinkaccordions.homelinux.org/

Jeżeli korzystamy z domyślnego /etc/xml/catalog, to podanie SGML_CATALOG_FILES jest zbędne. W tymże pliku ~/etc/xml/catalog dodałem wpisy:


<uri name="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
uri="file:///home/tomek/etc/xml/dtd/xhtml/1.1/xhtml11.dtd" />
<uri name="http://www.w3.org/TR/ruby/xhtml-ruby-1.mod"
uri="file:///home/tomek/etc/xml/dtd/xhtml/1.1/xhtml-ruby-1.mod" />
<rewriteSystem systemIdStartString="http://www.w3.org/TR/xhtml-modularization/DTD/"
rewritePrefix="file:///home/tomek/etc/xml/dtd/xhtml/1.1/" />
<rewriteURI uriStartString="http://www.w3.org/TR/xhtml-modularization/DTD/"
rewritePrefix="file:///home/tomek/etc/xml/dtd/xhtml/1.1/" />

Uwaga: pierwsze dwa wiersze nie wystarczą, bo xhtml11.dtd dołącza całą chmarę innych plików -- konkretnie 35 plików .mod oraz 3 .ent. Wszystkie te pliki skopiowałem do /home/tomek/etc/xml/dtd/xhtml/1.1/

Teraz wywołuję xmllint za pomocą prostego skryptu:


#!/bin/bash
# Sprawdzanie poprawnosci wybranych stron na pinkaccordions.homelinux.org
LOGFILE=~/Logs/WWW/xhtml-errors.log
XMLCATALOG=~/etc/xml/catalog
LINT=/usr/bin/xmllint
TODAY=`date`

for url in 'http://pinkaccordions.homelinux.org/wblog' 'http://pinkaccordions.homelinux.org/' ...
do
SGML_CATALOG_FILES=$XMLCATALOG $LINT --catalogs --noout --valid $url

if [ "$?" -ne 0 ] ; then
echo "Error found in $url [$TODAY]" >> $LOGFILE
fi
done

Ewentualnie można też tak:


#!/usr/bin/perl
# Sprawdzanie poprawnosci za pomoca `W3C Markup Validation Service'
use LWP::Simple;
$LOGFILE='/home/tomek/Logs/WWW/xhtml-errors.log';
my $today = localtime;

open LOG, ">>$LOGFILE";

my @URLs = (
'http://validator.w3.org/check?uri=http%3A%2F%2Fpinkaccordions.homelinux.org%2Fwblog',
'http://validator.w3.org/check?uri=http%3A%2F%2Fpinkaccordions.homelinux.org',
... );

foreach $url (@URLs) { print STDERR "Sprawdzam: $url...\n";
$content = get("$url");
if ($content =~ /Information on validation.*Congratulations/m) { print STDERR "$url is OK\n" } else
{ print LOG "$today => errors found => $url\n" ; }
}

close (LOG);

W3C ma też API do serwisu walidacyjnego, ale skomplikowane to API jest...

piątek, 12 listopada 2010

Uruchomienie Smart PLS w Linuksie

Program smartpls, który służy do modelowania ścieżkowego cząstkową metodą najmniejszych kwadratów (PLS path modelling), jest typowym przykładem aplikacji napisanej przez amatora:-). Program jest za free, ale autor nie udostępnia kodu źródłowego (pewnie się wstydzi).

W systemie FC8 działał a w FC11 przestał działać, zgłaszając na starcie błąd:


lookup error: ~/spls/configuration/org.eclipse.osgi/bundles/58/1/.cp/libswt-mozilla-gtk-3232.so: \
undefined symbol: _ZN4nsID5ParseEPKc

Pomogło doinstalowanie starego Firefoxa (w wersji 2). Przykładowo jeżeli stary FF znajduje się w katalogu ~/bin/ff2, to program działa uruchomiony w następujący sposób:


MOZILLA_FIVE_HOME=~/bin/ff2 spls

Napisałem o ww. problemie na forum spls -- może autor się przejmie i skompiluje spls w wersji korzystającej z FF3; albo --co też jest bardzo prawdopodobne -- zmiany umożliwiające kompilację z FF3 są tak duże, że mu się nie będzie chciało...

czwartek, 4 listopada 2010

Sony Ericsson Elm J10i2

Nie to żebym się chwalił ale od pewnego czasu posiadam. Ten telefon ma GPS...

Jak się zdjęcia robi, to można ustawić aparat tak, żeby zdjęcia były geo-tagowane, tj. żeby były dodawane współrzędne geograficzne. Ale jest pewien myk. Mianowicie jeżeli GPS nie będzie włączony -- cokolwiek to znaczy -- to geo-pozycja zdjęcia będzie wyznaczona tylko w oparciu o numer komórki (cell). Wygląda to tak:

$ exiftool -X -xmp:all dsc00001.jpg

<rdf:Description rdf:about='dsc00001.jpg'
xmlns:et='http://ns.exiftool.ca/1.0/' et:toolkit='Image::ExifTool 8.06'
xmlns:XMP-rdf='http://ns.exiftool.ca/XMP/XMP-rdf/1.0/'
xmlns:XMP-cell='http://ns.exiftool.ca/XMP/XMP-cell/1.0/'>
<XMP-rdf:About> </XMP-rdf:About>
<XMP-cell:Mcc>260</XMP-cell:Mcc>
<XMP-cell:Mnc>3</XMP-cell:Mnc>
<XMP-cell:Lac>30203</XMP-cell:Lac>
<XMP-cell:Cellid>32930160</XMP-cell:Cellid>
<XMP-cell:TagR>5</XMP-cell:TagR>
<XMP-cell:Cgi>260-3-30203-32930160</XMP-cell:Cgi>
</rdf:Description>
</rdf:RDF>

Można powyższe zamienić na współrzędne wpisując:

http://www.opencellid.org/cell/get?mcc=260&mnc=3&cellid=32930160&lac=30203

Ale wyniki jest tylko przybliżony...

Teraz w instrukcji telefonu jest, że GPS sam się wyłącza jak nie jest potrzebny. A jak go włączyć na zicher? Zainstalowałem TrekBuddy i używam go jako loggera. Efekt uboczny jest taki, że GPS działa non-stop [zapewne da się to także osiągnąć inaczej].

Zdjęcia zrobione w takim trybie są już oznaczone precyzyjnie:

exiftool -X  j10i10_1103007.jpg | grep GPS
xmlns:GPS='http://ns.exiftool.ca/EXIF/GPS/1.0/'
<GPS:GPSVersionID>2.2.0.0</GPS:GPSVersionID>
<GPS:GPSLatitudeRef>North</GPS:GPSLatitudeRef>
<GPS:GPSLatitude>54 deg 26' 22.62"</GPS:GPSLatitude>
<GPS:GPSLongitudeRef>East</GPS:GPSLongitudeRef>
<GPS:GPSLongitude>18 deg 33' 2.50"</GPS:GPSLongitude>
<GPS:GPSAltitudeRef>Above Sea Level</GPS:GPSAltitudeRef>
<GPS:GPSAltitude>41 m</GPS:GPSAltitude>
<GPS:GPSMapDatum>WGS-84</GPS:GPSMapDatum>
<Composite:GPSAltitude>41 m Above Sea Level</Composite:GPSAltitude>
<Composite:GPSLatitude>54 deg 26' 22.62" N</Composite:GPSLatitude>
<Composite:GPSLongitude>18 deg 33' 2.50" E</Composite:GPSLongitude>
<Composite:GPSPosition>54 deg 26' 22.62" N, 18 deg 33' 2.50" E</Composite:GPSPosition>

Natomiast zapisywany przez TrekBuddy ślad w formacie NMEA jest do kitu. Na blogu blog.4zal.net znalazłem informację, że w istocie: ,,osoby chcące skorzystać z logowania, a posiadające GPS wbudowany w komórkę powinny uważać na logowanie w formacie NMEA. W przypadku niektórych telefonów (np. Sony Ericsson) tak wygenerowane dane będą niekompletne''.

Zatem przestawiłem format na GPX i dziś zrobiłem pierwszy test. Poszedłem do Oliwy [na wywiadówkę] i z powrotem z telefonem i Garminem w kieszeni.

Ślady są tutaj. Niebieski to Elm, czerwony -- Legend. Hmm....

Dopisane 11 stycznia 2011: Dłuższe hmmmmmm jest takie, że każde zdjęcie kosztuje 25 gr. Wybierając opcję geotagowania wyświetla się komunikat, że to może kosztować. No więc nie tylko może ale kosztuje (Orange). Zresztą jak ustaliliśmy wyżej pozycja ustalana domyślnie przez telefon jest taka sobie dokładna, a ponieważ Elm ma wbudowany odbiornik GPS, to przecież teoretycznie mógłby wstawiać współrzędne bez łączenia się z centralą... Ale nie ma tak, trzeba płacić nawet jak się nie korzysta -- jak się wyłączy opcję dodawania współrzędnych, to zdjęcia nie są geotagowane. Jednym słowem kolejna wielka lipa...

Nawet specjalnie tego nie żałuję, bo marny ten GPS -- jak startuje 5 minut to jest szybko.

piątek, 29 października 2010

Nie mamy pani płaszcza i co nam pani zrobi?

W oryginalnej scenie z Misia (1980): ,,Nie mamy pańskiego płaszcza i co nam pan zrobi?''.

Może by i było śmieszne ale primo akurat ten oszust nie jest bynajmniej szatniarzem a po drugie nie prowadzi prywatnego biznesu, tylko utrzymują go podatnicy...

A oglądającym to 30 lat temu się wydawało, że film opisuje patologie tzw. PRLu. Naiwni...

Oryginalna scena z szatni jest tutaj.

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...

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.

poniedziałek, 25 października 2010

Eugenika

Eugenics is the science which deals with all the influences that improve the inborn qualities of race; also with those that develop them to the utmost adventure
-- Francis Galton 1904

Ostatnia ofensywa lobbystów od in vitro napędzia też wiatru oszołomom spod znaku sierpa i młota. Własnie się taki jeden -- niejaki Żakowski -- objawił twierdząc, że ,,Eugenika była częścią idei (sic!) nazistowskiej''. Co oczywiście jest prawdą, ale nie całą bo powyższe zdanie, umiejętnie sformułowane i podane w stosownym kontekście większość nie pasjonujących się tematem odczyta, iż była częścią wyłącznie owej N-idei. Jest to jednym słowem zwyczajna i w miarę prostacka manipulacja...

Problemem bowiem każdego postępaka jest jak wiadomo, że ww. Eugenika była częścią nauki i to bynajmniej bez przedrostka pseudo. Pseudo to została post factum, a przedtem była to nauka przez duże Ny.

Adolf Hitler, był jak byśmy to dziś powiedzieli racjonalistą, odrzucał bzury i gusła, wyznawał światopogląd naukowy. A Holokaust zaczął się od Vernichtung von lebensunwertem Leben, które IMHO niczym specjalnie nie różni się od dzisiejszej eutanazji...

niedziela, 24 października 2010

Bicycling to Afghanistan

No prawie do Afganistanu... Kierunek się zgadzał, ale dojechałem tylko do Miszewa.

Filmik jest tutaj: #3#2#1.

Tytuł zapożyczony od Roberta Frippa z płyty The Bridge Between.

Żywe paginy z pakietem fancyhdr

Dokumentacja do pakietu fancyhdr jest taka sobie więc poniżej krótka instrukcja jak się nim posługiwać

W pakiecie fancyhdr pagina jest dzielona na trzy części: lewą (L), środkową (C) i prawą (R). Układa graficzny paginy może być odzielnie definiowany dla stron parzystych (E) oraz nieparzystych (O). Polecenie fancyhead pozwala na definiowanie zawartości tych części za pomocą opcjonalnego argumentu, przykładowo:


\fancyhead[LE,RO]{...} %% lewy-na-parzystej oraz prawy-na-nieparzystej
\fancyhead[RE]{...} %% prawy-na-parzystej

Dopuszczalna jest oczywiście każda kombinacja obszar-paginy--strona. W stylu fancy domyślnie kreślone są kreski: pod paginą górną o grubości równej \headrulewidth (domyślnie o grubości 0,4 pt) oraz nad paginą dolną o grubości równej \footrulewidth (domyślnie 0 pt).

Typowa pagina ma na zewnętrznych marginesach (LE, RO) numery stron , a na wewnętrznych (LO, RE) tytuł chapter/section. Taki sposób formatowania można osiągnąć stosując poniższe deklaracje:


\pagestyle{fancy} %% deklarujemy styl "fancy"
\fancyhead{} \fancyfoot{} %% "zresetuj" zawartość pagin
\renewcommand{\chaptermark}[1]{\markboth{#1}{}}
\renewcommand{\sectionmark}[1]{\markright{\thesection\ #1}}
\fancyhead[LE,RO]{\normalfont \small \thepage}
\fancyhead[LO]{\normalfont \small \itshape \rightmark}
\fancyhead[RE]{\normalfont \small \itshape \leftmark}
\fancypagestyle{plain}{\fancyhead{}\renewcommand{\headrulewidth}{0pt}} %% ustaw paginy dla stylu plain

Na stronach tytułowych rozdziałów LaTeX wykonuje \pagestyle{plain}, w wyniku czego -- czy tego chcemy czy nie -- wstawiany jest w paginie dolnej numer strony. Deklaracja \fancypagestyle{plain} dotyczy właśnie stron z zadeklarowanym standardowym stylem plain (np. stron z tytułami rozdziałów). Dla takich stron: \fancyhead{} ,,resetuje paginy'' a \headrulewidth usuwa kreskę.

piątek, 8 października 2010

Lumpenliberalizm w wydaniu partii Populizmu Obciachowego (PO)

W ekspresowym trybie uchwalono przed chwilą, co następuje:

środek zastępczy -- substancję pochodzenia naturalnego lub syntetycznego w każdym stanie fizycznym lub produkt, roślinę, grzyba lub ich część, zawierające taką substancję, używane zamiast środka odurzającego lub substancji psychotropowej lub w takich samych celach jak środek odurzający lub substancja psychotropowa, których wytwarzanie i wprowadzanie do obrotu nie jest regulowane na podstawie przepisów odrębnych...

Takie mam w/z powyższym pytanie szczegółowe:

  • Czy biznes b. mecenasa p. Premiera, to też środek zastępczy? Wykluczyć się nie da... Zależy kogo się powoła na szefa GIS.

A pytanie ogólne to takie czy jesteśmy już w tym Zbirze, ale jeszcze o tym nie wiemy? A dowiemy się jak p. Premier odkrywszy, że środki zastępcze (cokolwiek to znaczy) można też nabyć przez WWW wyda z soboty na niedzielę kolejny ukaz.

I do tego ten cały (obliczony na kogo? Zwolenników Populistów Obciachowych aka Sierot PO cudzie...?) sztafaż -- mam w szczególności na myśli tę nieszczęsną, Putinowską w stylu, naradę Prezydenta, Marszałków Sejmu i Senatu + Jego oczywiście.... Zabrakło tylko Szefa Sztabu Generalnego (ze sztabem), Komendanta Głównego Policji (ze wszystkimi zastępcami) i umyślnego z dużym czerwonym telefonem, łączącym z Brukselą na oczach zachwyconych SPC.

A tak bardziej poważnie: świetna ustawa do wykańczania konkurencji albo egzekwowania haraczu: przykładowo ,,Y'' może złożyć doniesienie (lub zagrozić, że to zrobi), iż ,,X'' handluje ,,podejrzaną substancją'', a ,,X'' może zwijać interes, jeżeli ,,Y'' ma dobre układy w powiecie. Bo Polska powiatowa jak wygląda, to chyba po tzw. sprawie Olewnika nawet SPC nie powinni mieć wątpliwości...

Dopisane 9 października 2010: Ten pan już nigdy nikomu nie sprzeda dopalaczy, w oryginale: [niejaki p. Bratko] ,,będzie siedział, będzie penalizacja z tego tytułu, na 100 procent.''
-- Zbigniew Tusk vel Donald Ziobro

Po prostu dobre pomysły trzeba naśladować:-)

czwartek, 7 października 2010

Kolejny gniot z CeDeWu

Nabyłem dla pewnych celów książkę pn. Praca magisterska licencjat... Może nie powinienem z uwagi na błąd w tytule? Ale tania była...

Jest to kolejny bubel tego szajsowatego wydawnictwa CeDeWu (CeDeWu wydawnictwa fachowe), o którym już kiedyś napisałem z okazji wydania innego gniota.

Aha jako ciekawostkę dodam, że książka nie ma daty wydania (brak daty wydania, bdw), zatem:

Zenderowski R. (bdw), Praca magisterska licencjat. Krótki przewodnik po metodologii pisania i obrony pracy dyplomowej, Warszawa, Wydawnictwo CeDeWu. ISBN 978-83-7556-144-9.

Zmiany w DynDNS

Dziś przypadkowo odkryłem dzięki korespondencji z kol. Rafim, iż serwis DynDNS, z którego usług korzystam zmienił reguły gry, a mianowicie większość fajnych domen, które były dostępne za free jest teraz płatna, w tym ta której ja używam tj. pinkaccordions.homelinux.org. DynDysy twierdzą, w oświadczeniu z okazji zmiany, że dopóki konto nie wygaśnie to można je używać i go nie skasują. A może wygasnąć wtedy gdy przez 30 dni nie będzie używane. Czym prędzej zatem zmieniłem też ustawienia w Tomato Basic → DDNS → Auto refresh every 28 days na every 3 dni.

W sumie zawsze tak było, że mogli skasować po 30 dniach nieużywania, ale jakoś na to nie zwracałem uwagi. Ponieważ w UPC adres IP zmienia się bardzo rzadko, 28 dni to prawie miesiąc więc chyba lepiej częściej manifestować, że się korzysta.

Jak by skasowali to też nie byłoby tragedii, raptem 15 USD/rok. What comes free has no guarantee jak mówią...

poniedziałek, 6 września 2010

Dodanie paru rzeczy do Sheeva #2

Doinstalowałem kilka rzeczy, które mam na Szewie #1 (Ubuntu pamięć NAND) a do tej pory nie było ich na Szewie #2 (Debian na karcie), mianowicie: 1) esniper, 2) digitemp/pomiar temperatury, 3) różne moje skrypty Perla, 4) program youtube-upload.py.

#1. Kompilowanie esnipera wymaga doinstalowania curla:


apt-get install curl
apt-get install curlftpfs

Skrypt ./configure dalej kończy się błędem, zatem:


## http://www.linuxquestions.org/questions/linux-newbie-8/libcurl-and-curl-config-problems-453166/
apt-get install libcurl3-dev libwww-curl-perl python2.4-pycurl

Teraz działa i można skompilować esnipera.

#2. Przełączyłem kabel od termometrów ze starej Szewy na nową. Oprócz zainstalowania digitemp należało dodać do katalogu /etc/udev/rules.d/, plik np. 85-ttyusb.rules, zawierający:


# relax the permissions just for ttyUSB0
KERNEL=="ttyUSB0", MODE="0666"

bo inaczej zwykły user nie ma dostępu do /dev/ttyUSB0. Teraz należy ponownie wyjąć/włożyć kabel USB. Ponieważ do tworzenia wykresu temperatury używam biblioteki perl-GD trzeba także dociągnąć:


apt-get install libgd-graph-perl

#3. Różne moje skrypty Perla (flickr/ebay) instalują ręcznie w katalogu:


/usr/local/share/perl/

Wreszcie instalują paczkę python-gdata na potrzeby skryptu youtube-upload.py do wysyłania moich filmików na YTube poprzez API:


wget http://gdata-python-client.googlecode.com/files/gdata-2.0.11.final.tar.gz

Powyższe zabiegi mają/miały na celu unifikację tego co jest na jednym i drugim komputerku... Mówiąc konkretnie chciałem żeby zamiast Ubuntu na Szewie #1 też była karta z Debianem. Ale, ale w trakcie naszły mnie wątpliwości: w sumie na cholerę? kupować jeszcze jedną kartę... Jak się pamięć zużyje to się będę martwił. A ponieważ katalogi, które nie są prawie-że-wyłącznie czytane przeniosłem poza pamięć NAND (tj. /home//var/) więc może aż tak szybko to nie nastąpi....

piątek, 3 września 2010

Dlaczego nie należy używać Excela

Arkusza kalkulacyjnego (a zwłaszcza Excela f-my Microsoft) nie należy używać do zadań bardziej skomplikowanych od podliczania budżetu domowego [McCulloughHeiser2008,Berger2007,McCullough2008] zobacz także [AlmironetAl2010,KeelingPavur2007,Nash2008,Su2008].

Literatura

AlmironetAl2010
Marcelo G. Almiron, Bruno Lopes, Alyson L. C. Oliveira, Antonio C. Medeiros, and Alejandro C. Frery. On the numerical accuracy of spreadsheets. Journal of Statistical Software, 34(4):1--29, 4 2010.
Berger2007
Roger L. Berger. Nonstandard operator precedence in excel. Computational Statistics and Data Analysis, 51(6):2788--2791, 2007.
KeelingPavur2007
Kellie B. Keeling and Robert J. Pavur. A comparative study of the reliability of nine statistical software packages. Computational Statistics and Data Analysis, 51(8):3811--3831, 2007.
McCulloughHeiser2008
B.D. McCullough and David A. Heiser. On the accuracy of statistical procedures in microsoft excel 2007. Computational Statistics and Data Analysis, 52(10):4570--4578, 2008.
McCullough2008
B.D. McCullough. Microsoft excel's not the wichmann-hill random number generators. Computational Statistics and Data Analysis, 52(10):4587--4593, 2008.
Nash2008
John C. Nash. Teaching statistics with excel 2007 and other spreadsheets. Computational Statistics and Data Analysis, 52(10):4602--4606, 2008.
Su2008
Yu-Sung Su. It s easy to produce chartjunk using microsoft excel 2007 but hard to make good graphs. Computational Statistics and Data Analysis, 52(10):4594--4601, 2008.

Powyższy spis literatury w formacie BiBTeX.

czwartek, 2 września 2010

Eksport do pliku PDF z OpenOffice Calc z poprawnym MediaBoxem

Rysunek utworzony w OO Calc kopiuję do OO Draw następnie zapisuję jako PDF. Jest prawie dobrze -- prawie bo MediaBox, czyli najmniejszy prostokąt zawierający rysunek jest zły -- OO Draw zapisuje rysunek jak całą stronę. Są dwa rozwiązania:

  1. Rysunek zapisany w OO Draw przyciąć używając do tego pdfcrop. Ten pdfcrop to skrypt w Perlu, dostępny w TeXlive i MikTeX.

  2. Zamiast do OO Draw skopiować (poprzez kopiuj/wklej) do Inkscape. Teraz zaznaczyć obiekt (with the rubber band selector) i następnie kliknąć w Właściwości Dokumentu → Dopasuj do ramki zaznaczenia. Teraz export do PDF da w rezultacie rysunek z prawidłowo przyciętym MediaBoxem. Por. też tutaj.

Próbowałem kopiuj/wklej do Infranview ale wynikowy plik PDF jest złej jakości (fonty są zamieniane na bitmapy)... Być może można to dokonfigurować.

środa, 1 września 2010

Laurent Fignon nie żyje

We wtorek 31 sierpnia 2010, zmarł na raka dwukrotny zwycięzca Tour de France (1983 i 1984) Francuz Laurent Fignon. Miał 50 lat. Ogółowi publiczności bardziej od zwycięstw w TdF znana jest jego spektakularna porażka z Gregiem LeMondem w tymże wyścigu. Spektakularna, bo zaledwie 8 sekund, przy czym decydującym był ostatni etap -- jazda na czas, na której LeMond (niespodziewanie) odrobił aż 50 s straty... Niespodziewanie, ponieważ etap miał tylko niecałe 25 km, więc przejechanie na tak krótkim dystansie aż 58 s szybciej, to był duży wyczyn. Podobno Fignon zlekceważył LeMonda, jechał z gołą głową, podczas gdy Lemond miał aerodynamiczny hełm i wąską kierownicę -- tzw. lemondkę, współcześnie praktycznie obowiązkową w próbach czasowych...

sobota, 28 sierpnia 2010

140 tys. na liczniku

Z pewnym opoźnieniem odnotowuję, że 29 lipca 2010 przekroczyłem 140,000 km przejechanych na rowerze (odkąd liczę, tj. od 1990 r.). Wiem, wiem... żadna rewelacja z punktu widzenia typowego zawodnika, co 20--30 tys. albo i lepiej przejeżdża co rok.... A ja tylko i zaledwie trochę mniej niż 7 tys...

poniedziałek, 23 sierpnia 2010

Implementacja prostej procedury ustalania trafności różnicowej

Bagozzi i Dholakia [BagozziDholakia2006] stosują następującą procedurę ustalania trafności różnicowej (discriminant validity) skali wieloczynnikowej: 1) oszacowanie bazowego modelu CFA (swobodnie korelujące ze sobą czynniki); 2) oszacowanie ograniczonego modelu CFA, tj. modelu w którym korelacja pomiędzy dwoma czynnikami skali jest ustalona jako równa 1 (co oznacza, że czynniki te de facto stanowią jeden czynnik). Oszacowanie modelu ograniczonego dla każdej pary czynników skali; 3) ustalenie czy wartość różnicy statystyk χ2 jest istotna statystycznie.

Istotność statystyki χ2 świadczy iż jakość dopasowania modelu ograniczonego (krok 2) jest istotnie gorsza od modelu bazowego (krok 1), a zatem korelacja pomiędzy parą czynników jest mniejsza od 1, czyli czynniki te się różnią... Trafność dyskryminacyjna skali jest potwierdzona jeżeli wszystkie (a przynajmniej zdecydowana większość) wartości różnic są istotne statystycznie.

Jeżeli skala składa się z n czynników, to należy oszacować (n (n-1))/2 modeli ograniczonych (np. dla n=6, jest to 15 modeli), co jest pracochłonne. Skrypt LISRELa dla modelu CFA oraz modelu ograniczonego różni się zaś od modelu bazowego tylko jednym wierszem:


VA 1 PHI(i,j)

gdzie i oraz j są numerami odpowiednich czynników. Można to wszystko zautomatyzować, w sposób następujący: 1) oblicz model bazowy; z pliku OUT Lisrela pobierz wartość statystyki χ2; 2) w pętli dla każdej pary i,j wykonaj skrypt wyznaczający model ograniczony, pobierz wartość statystyki χ2; 3) oblicz różnicę i wydrukuj...

Skrypt Perlowy wykonujący powyższe (z przykładem wykorzystania) jest tutaj.

Literatura

BagozziDholakia2006
Bagozzi, R. P., Dholakia, U. M. Open Source Software User Communities: A Study Of Participation In Linux User Groups Management Science 7/52, 2006, p. 1099--1115.

Wycieczka do Rzucewa

W sobotę pojechałem SKM do Redy. Potem już rowerem przez przez Kępę Pucką (Połchowo, Mrzezino i Zelistrzewo) do Rzucewa. Na plaży przed pałacem smród aż mdli ale byli tacy co się opalali/pływali. Ciekawe czy tak jest zawsze czy tylko ja miałem szczęście?

Z powrotem wróciłem przez dolinę Redy i Kępę Oksywską (Mosty, Pierwoszyno). Chciałem podjechać obejrzeć Torpedowaffenplatz, ale z tej strony, z której próbowałem to chyba się nie da, bo po drodze jest lotnisko...

Bardzo przyjemna trasa, w szczególności znikomy ruch samochodów ale miejscami nawierzchnia dróg kiepska. Ślad jest tutaj.

niedziela, 22 sierpnia 2010

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...

czwartek, 19 sierpnia 2010

Cena postępu

W Pyrach, 25 lipca 1939 roku odbyło się spotkanie, na którym szef Polskiego Biura Szyfrów podpułkownik Gwido Langer przekazał delegacjom sojuszniczych Francji i Anglii, na których czele stali odpowiednio major Gustave Bertrand i pułkownik (komandor) Alastair Denniston całą polską wiedzę nt. maszyny szyfrującej Enigma... Kopie Enigmy przekazano wkrótce pocztą dyplomatyczną...

Tak mi się to skojarzyło jak wczoraj z mediów się dowiedziałem, iż dwie wizyty niejakiego J. Millera w Moskwie (jakby nie było, a przynajmniej nominalnie ministra), to mało żeby przywieźć głupi CDrom z kopią rejestratorów z wiadomego Tupolewa... Trzecie podejście wykonuje generał, a i to pewnie będzie mało...

sobota, 24 lipca 2010

Obliczanie AVE i CR z pliku out LISRELa

Zaproponowane przez Fornella i Larckera [HairetAl98,FornellLarcker81] rzetelność łączna (composite reliability, CR) oraz przeciętna wariancja wyodrębniona (average variance extracted, AVE) stały się często wykorzystywanymi miarami rzetelności wewnętrznej oraz trafności zbieżnej. CR obliczana jest według następującej formuły [por. także zencaroline.blogspot.com/2007/06/composite-reliability]:

CRη = (∑i ληi )2 / ( (∑i ληi )2 + ∑i var(εi))

gdzie: var(εi) = 1 - (ληi2); ληi to wektor (zestandaryzowanych) ładunków czynnikowych dla zmiennej ukrytej η.

Minimalną akceptowaną wartością CR jest 0,7

Podobny do CR jest wskaźnik przeciętnej wariancji wyodrębnionej (average variance extracted, AVE), służący do oceny trafności zbieżnej (convergent validity). Jest on obliczany według następującej formuły:

AVEη = (∑iηi )2 ) / ( ∑iηi)2 + ∑i var(εi) )

Znaczenie symboli jest identyczne, jak we wzorze określającym rzetelność łączną. Minimalną akceptowaną wartością AVE jest 0,5.

Znając zestandaryzowane wartości ładunków czynnikowych ληi policzenie CR oraz AVE jest proste. Dodanie opcji SC (completely standardized solutions) do polecenia OUTPUT spowoduje wydrukowanie zestandaryzowanych wartości ładunków czynnikowych. Poniższy skrypt obliczy na tej podstawie CR/AVE dla każdej zmiennej ukrytej:


#!/usr/bin/perl
# Computes/prints Composite Reliability (CR) and Average Variance Extracted (AVE)
# from LISREL OUT file. Measures can load on several factors
#
# (c) 2010; t.przechlewski http://pinkaccordions.homelinux.org/staff/tp/
# GPL license
#
# The formulas for CR and AVE are as follows [cf. Hair, Anderson, Tatham and Black, Multivariate Data Analysis, 5th Ed., Pearson Education, p. 637]:
# CR = (\sum standardized loading)^2 / ( (\sum standardized loading)^2 + \sum indicator measurement error ),
# AVE = (\sum (standardized loading)^2 ) / ( \sum (standardized loading)^2 + \sum indicator measurement error )
# where: indicator measurement error = 1 - loading^2
# see also: http://zencaroline.blogspot.com/2007/06/composite-reliability.html
#
# usage: perl print_cr_and_ave lisrel-output-file
#
my $scan = 0; ## flag to figure out where we are
my $initial_latent_var_no = 0;

while (<>) {
chomp;

# We are looking for the line with `Completely Standardized Solution' (CSS), which
# starts the block containing relevant data
if (/Completely Standardized Solution/) { $scan = 1 ;
print STDERR "*** Found *** $_ ***\n"; next ; }

# After CSS line we look the line with LAMBDA-* (there are up to two such lines)
if ( $scan > 0 && /LAMBDA-[XY]/ ) { $scan++;

print STDERR "*** Found *** $_ (initial: $initial_latent_var_no) ***\n";

$_ = <> ; $_ = <> ; $_ = <> ; ## eat exactly next three lines

## ok we are about to scan LAMBDA-X/Y matrix
while (<>) { chomp;

if (/^[ \t]*$/) { # exmpty line ends LAMBDA-X/Y matrix
## before reading next block store the number of latent vars from the 1st block
## first latent var number in the second block = number of vars in the previous block +1
$initial_latent_var_no += $#loadings;

print STDERR "*** Initial var number = $initial_latent_var_no ***\n";
last ; ## OK, all rows in matrix was read...
}

s/- -/xxx/g; # change `- -' to `xxx'
@loadings = split ' ', $_;

# column number = latent var number ; column `0' contains measurement variable name
for ($l=1; $l <= $#loadings; $l++) {
if ($loadings[$l] !~ /xxx/) { ## store in hash
$Loadings{$l + $initial_latent_var_no }{$loadings[0]} = $loadings[$l];
}
}

}
}
}

print STDERR "*** Latent variables = $initial_latent_var_no ***\n";

print "=======================================================\n";

### Compute/print CR i AVE ### ### ### ###

for $l (sort keys %Loadings ) {
$loadings = $sqloadings = $errors = 0;

print STDERR "*** Xi/Eta: $l ***\n";

for $m ( sort keys %{ $Loadings{ $l }} ) {
$load = $Loadings{$l}{$m};

print STDERR "$m ($l) = $load\n";

$loadings += $load ;
$sqloadings += $load * $load ;
$errors += (1 - $load * $load);
}

$cr = ($loadings * $loadings) / ( ($loadings * $loadings) + $errors ) ;
$ave = $sqloadings / ($sqloadings + $errors ) ;

printf "Xi/Eta_%2d -> CR = %6.3f AVE = %6.3f\n", $l, $cr, $ave;

}

print "=======================================================\n";

Skrypt można także pobrać tutaj.

Literatura

FornellLarcker81
Fornell, C. i Larcker, D. F. (1981). Evaluating structural equation models with unobservable variables and measurement error. Journal of Marketing Research, 18(1):39--50.
HairetAl98
Hair, J. F., Black, B., Anderson, R. E., i Tatham, R. L. (1998). Multivariate Data Analysis. Prentice Hall.

piątek, 25 czerwca 2010

Gmap-pedometer i ograniczenia Legenda

Intensywne używanie http://www.gmap-pedometer.com/ spowodowało, iż dotarłem do granic możliwości Legenda, o których NB. do niedawna nie miałem pojęcia. Otóż Legend może przechować do 1000 punktów (waypoints), 20 śladów (tracks) oraz do 50 tras (routes), każda o długości do 250 punktów... Ponieważ punkty trasy liczą się do puli punktów, 5 tras 200 punktowych zawala pamięć ,,na amen''. Co zresztą niedawno miało miejsce...

Usunięcie wszystkich punktów i wszystkich tras z Garmina jest bardzo łatwe. Tyle, że chciałbym niektóre zachować... Można wprawdzie usuwać punkty według związanych z nimi symboli, ale to by wymagało porządku przy ich definiowaniu. A ja, póki co, mam w tym względzie bałagan. Zatem:

  1. Zgrałem zawartość pamięci Garmina do pliku. Wywaliłem wszystkie trasy i ślady oraz związane z nimi punkty (są one łatwo rozpoznawalne po nic nie mówiącej nazwie typu Turn 233 albo GRTP-202). Pozostawiłem pozostałe punkty. (Wywalając trasy trzeba usunąć wszystkie, bo nie wiadomo jaki punkt należy do jakiej trasy -- tak jest szybciej i prościej.)

  2. Wyczyściłem pamięć urządzenia. W tym celu w menu głównym należy wybrać ikonę Waypoints→przycisk menu/find→Delete. Teraz wybrać All Symbols i potwierdzić. Uwaga: przycisk menu/find jest po lewej na dole pod przyciskami góra/dół.

  3. Załadowałem z powrotem plik GPX (nazwałem go LEGEND_MEM.gpx):


    gpsbabel -r -w -t -i gpx -f LEGEND_MEM.gpx -o garmin -F /dev/ttyUSB0

Plik LEGEND_MEM.gpx zawiera moją bazę podstawowych punktów i tras (jeżeli takowe są)... Resztę będę ładował w miarę potrzeby, a jak się znowu zapełni pamięć Legenda, to powtórzę opisaną wyżej procedurę... Przy okazji 225 jako górny limit punktów na trasie wygląda na zbyt dużo. Spróbuję 100 punktów, wtedy zmieści się więcej tras....

środa, 23 czerwca 2010

Odtwarzanie zakodowanych płyt Video

Płyta DVD/Video (Ballando Ballando Ettore Scoli) się nie odtwarza. Konsultując problem z Google (Encrypted DVD support unavailable), ustaliłem, że zapewne brakuje czegoś co się nazywa libdvdcss. Doinstalowałem:


rpm -ivh http://dl.atrpms.net/f11-i386/atrpms/stable/libdvdcss2-1.2.10-5.fc11.i586.rpm
rpm -ivh http://dl.atrpms.net/f11-i386/atrpms/stable/libdvdcss-1.2.10-5.fc11.i586.rp

Być może drugi z pakietów jest zbędny, ale doinstalowałem w desperacji bo ciągle nic. Już się miałem poddać ale oko mi się oparło na dyskusji na forum użytkowników Ubuntu, w której to dyskusji pojawia się coś co nazywa się regionset. Doinstalowałem i to:


yum install regionset

Nie musiałem nawet ,,odpalać regionseta i ustawiać region na 2'' (co jest opisane na ww. forum). Samo zainstalowanie wystarczyło...

sobota, 5 czerwca 2010

Mod_rewrite

Włączyłem mod_rewrite:


cd /etc/apache2/mods-enabled
ln -s ../mods-enabled/rewrite.load rewrite.load

W pliku /etc/apache2/sites-available/pinkaccordions trzeba dopisać (w innych wirtualnych hostach też, jeżeli są):


RewriteEngine On
RewriteOptions Inherit

oraz zamienić:


AllowOverride None

na


AllowOverride All

Zrestartować Apacha


/etc/init.d/apache2 restart

Podobno zamiast powyższego wystarczy a2enmod rewrite plus restart Apacha. Teraz działa http://pinkaccordions.homelinux.org/wblog zamiast /cgi-bin/blosxom.cgi, albo http://pinkaccordions.homelinux.org/gpx/id_pliku, np. http://pinkaccordions.homelinux.org/gpx/20100605.

czwartek, 27 maja 2010

Konfigurowanie Apacha

Rozpoczynam od założenia w serwisie dyndns.org konta. Potem przechodzę do My ServicesHost services, wybieram nazwę hosta (w moim przypadku pinkaccordions) i domeny (homelinux.org). Typ usługi: Host with IP address. Resztę pól można zostawić niewypełnione. Darmowe konto pozwala na przydzielenie 5 adresów...

Teraz w menu Tomato klikam w Basic→DDNS. Jako service wybieram DynDNS -- static, Username/Password to dane z rejestracji w serwisie DynDNS, hostname to z kolei wybrana przez nas nazwa hosta, tj. w moim przypadku pinkaccordions.homelinux.org. Więcej niczego nie trzeba wpisywać wystarczą dane domyślne. Można ustawić w ten sposób dwa adresy... Por też notatki tutaj.

Pozostaje wreszcie uruchamienie usługi port forwarding na routerze z działającym Tomato. Jest to bardzo proste i sprowadza się do wypełnienia pól Proto, Ext Ports, Int Address oraz opcjonalnie Description (por. ekran obok).

Instalacja serwera apache oraz php w systemie Debian Lenny.


apt-get install apache2 apache2-mpm-prefork apache2-utils apache2.2-common
apt-get install php5 libapache2-mod-php5 php5-common php5-curl
apt-get install php5-dev php5-gd php5-imagick php5-mcrypt php5-memcache php5-mhash \
php5-mysql php5-pspell php5-snmp php5-sqlite php5-xmlrpc php5-xsl

W pliku /etc/apache2/ports.conf umieszczam komentarz przed dyrektywą NameVirtualHost:


#NameVirtualHost *:80

Zaś powyższą dyrektywę umieszczam w /etc/apache2/httpd.conf.

Konfiguracja wirtualnego hosta; plik /etc/apache2/sites-available/pinkaccordions powstaje przez skopiowanie pliku domyślnego:


cd /etc/apache2/sites-available/ ; cp default pinkaccordions

Następnie plik modyfikuję dopisując ServerName i ServerAlias



<VirtualHost *:80>
ServerAdmin webmaster@localhost

ServerName pinkaccordions.homelinux.org
ServerAlias pinkaccordions.homelinux.org

DocumentRoot /var/www_pinkaccordions/
<!-- dalej w zasadzie niezmienione -->
</VirtualHost>

Teraz:


cd /etc/apache2/sites-enabled && ln -s ../sites-available/pinkaccordions pinkaccordions

To samo dla drugiego i ewentualnie kolejnych hostów. Innych plików za wyjątkiem opisanych wyżej httpd.conf, ports.conf oraz plików z katalogu ./sites-available/ i linków z katalogu ./sites-enabled/ nie ruszam. Teraz


/etc/init.d/apache2 restart
# albo apache2ctl graceful

No i powinno działać...

Dopisane 15 września 2010: Aby logrotate nie usuwał najstarszego przechowywanego pliku modyfikuję /etc/logrotate.d/apache2 i dodając stosowane prerotate...endscript:


sharedscripts
prerotate
if [ -f "/path2logs/access.log.52.gz" ] ; then
cp /path2logs/access.log.52.gz /path2archive/access.`date +%Y%m%d`.log.gz ; fi
if [ -f "/path2logs/access.fabians.log.52.gz" ] ; then
cp /path2logs/access.log.52.gz /path2logs/access.`date +%Y%m%d`.log.gz ; fi
endscript

Teraz (mam nadzieję), plik access.log.52.gz przed skasowaniem zostanie skopiowany w inne miejsce i ocaleje. Pewnie można by prościej, przykładowo brutalnie wpisując po prostu rotate 156.

Rekursywne przeglądanie wszystkich plików

Na potrzeby dostosowana adresów URL do innej konfiguracji innego serwera wykorzystałem następujący skrypt:


#!/usr/bin/perl -w
use strict;
undef $/; ## na potrzeby czytania każdego pliku (process_file)

sub recurse($) {
my($path) = @_;

## append a trailing / if it's not there
$path .= '/' if($path !~ /\/$/);
## print the directory being searched
print STDERR $path,"\n";

## loop through the files contained in the directory
for my $eachFile (glob($path.'*')) {

## if the file is a directory
if( -d $eachFile) {
## pass the directory to the routine ( recursion )
recurse($eachFile);
} else {

## przetwarzaj plik
process_file ($eachFile);
}
}
}

sub process_file {
my $file = shift;
## Tylko pliki .html i .php
if ($file =~ /\.html|\.php$/) {
my $tmp_file = "$file.temp";
rename($file, $tmp_file);

open (F, $tmp_file); open (FO, ">$file");
my $ff = <F>;

## zamień bezwględne URLe na lepsze
$ff =~ s/href=(["'])http:\/\/gnu.univ.gda.pl\/~tomasz/href=$1/g; ## zamień
$ff =~ s/src=(["'])http:\/\/gnu.univ.gda.pl\/~tomasz/src=$1/g; ## zamień

print STDERR "-> $file\n";
print FO $ff;
close(F);
close (FO);
}
}

## initial call ... $ARGV[0] is the first command line argument
recurse($ARGV[0]);

Wymieniając procedurę process_file można oczywiście ww. skrypt zaadaptować do innych zadań, np. poprawienia zepsutej daty modyfikacji plików:-)

wtorek, 25 maja 2010

Kopia zapasowa karty SDHC, rsync i problemy

Uruchomiłem na Szewie #2 serwer WWW, dostępny pod adresem pinkaccordions.homelinux.org (darmowa domena z serwisu dyndys.com -- w moim przypadku konieczność, bo mam tzw. zmienne IP). Jak już jest serwer, to trzeba robić -- w sposób systematyczny, a nie ad hoc -- kopie zapasowe na wypadek gdyby, np. karta padła (co podobno nie jest takie rzadkie...). Po konsultacji z tym co w tym temacie proponują inni postanowiłem robić to za pomocą rsynca, uruchamianego z zewnętrznego komputera.

W tym celu trzeba zainstalować rsync na obu komputerach źródłowym i tym, na którym będzie tworzona kopia:


apt-get install rsync

Teraz należy skonfigurować rsync po stronie źródła (czyli tego komputera, z którego mają być kopiowane dane) modyfikując /etc/rsyncd.conf. Zawartość pliku /etc/rsyncd.conf w moim przypadku wygląda następująco:


## http://encodable.com/tech/blog/2005/10/13/Secure_Remote_Backups_via_rsync
uid = 0
gid = 0
hosts allow = *****
transfer logging = no
read only = yes

[wholefs]
path = /
comment whole root fs

[pinkaccordions]
path = /var/www_pinkaccordions/
comment pinkaccordions www

Można sprawdzić czy działa (neptune jest zadeklarowany w /etc/hosts):


rsync neptune::wholefs/

Tworzenie kopii realizuje skrypt rsync_neptune.sh uruchamiany po stronie przeznaczenia:


#!/bin/bash
SOURCE=neptune::wholefs/
EXCLUDE=/root/.rsync/backup_exclude.lst
DESTDIR=/backup/neptune/rootfs

echo "=== Syncing ${SOURCE} at `date` ==="
rsync -av --exclude-from=${EXCLUDE} --delete ${SOURCE} ${DESTDIR}

Plik $EXCLUDE zawiera te katalogi, które nie powinny -- z oczywistych względów -- być kopiowane (zawartości katalogów /proc, /sys oraz /tmp):


## Exclude
- /proc/*
- /sys/*
- /tmp/*

Skrypt rsync_neptune.sh jest zaś uruchamiany poprzez crona:


0 4 * * 7 /root/bin/rsync_neptune.sh >> /root/logs/RSync/RSync.log 2>&1

Idea jest taka: kopia całego rootfs z karty SDHC ma być wykonywana na dysk USB raz w tygodniu (z innego komputera, konkretnie Szewy #1). W razie potrzeby (awarii karty SDHC) kopia ta może być szybko przeniesiona na inną kartę SDHC... Można też kopiować bezpośrednio na kartę SDHC wsadzoną na zicher w czytnik kart, ale nie widzę sensu podłączania czytnika wyłącznie i tylko po to, żeby w razie awarii, mieć kopię karty od razu a nie po 3 minutach.

Zatem:


#!/bin/bash
EXCLUDE=/root/.rsync/backup_exclude.lst
SOURCE=/public/sheeva/backup/neptune/rootfs/
DESTDIR=/media/sd_backup

# http://www.cyberciti.biz/tips/shell-root-user-check-script.html
# Make sure only root can run our script
if [ "$(id -u)" != "0" ]; then
echo "This script must be run as root" 1>&2 ; exit 1
fi

## sprawdz czy karta jest w czytniku i jest zamontowana
if [ -d "$DESTDIR" ] ; then
echo "** OK: $DESTDIR!"
else
echo "** ERROR: $DESTDIR not mounted!"; exit 1;
fi

rsync -av --exclude-from=${EXCLUDE} --delete ${SOURCE} ${DESTDIR}

No i tu porażka:


rsync: readlink_stat("/media/sd_backup/etc/shadow") failed: Input/output error (5)
rsync: readlink_stat("/media/sd_backup/etc/resolv.conf") failed: Input/output error (5)
rsync: recv_generator: failed to stat "/media/sd_backup/etc/resolv.conf": Input/output error (5)
rsync: recv_generator: failed to stat "/media/sd_backup/etc/shadow": Input/output error (5)
rsync: recv_generator: failed to stat "/media/sd_backup/etc/network/run/ifstate": Input/output error (5)
rsync: recv_generator: failed to stat "/media/sd_backup/var/lib/urandom/random-seed": Input/output error (5)
rsync: recv_generator: failed to stat "/media/sd_backup/var/log/lastlog": Input/output error (5)
rsync: recv_generator: failed to stat "/media/sd_backup/var/run/dhclient.eth0.pid": Input/output error (5)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1058) [sender=3.0.5]

Trefne pliki (w liczbie sześciu, jak widać) mają długość 0 bajtów, a próba np. ls -li /media/sd_backup/etc/shadow powoduje komunikat I/O error. Usunąć tego też się nie da (rm -f nie daje rady)...

Wobec powyższego, sformatowałem partycję i wykonałem kopię za pomocą następującego polecenia wykorzystując tara:


tar cf - . | (cd /media/sd_backup/; tar xvpf - ) 2> ../../tar.log

Po wsadzeniu kopii zamiast oryginału do Szewy, system wydaje się działać. Czemu rsync zawiódł nie wiem (na razie)...

Dopisane 27 maja 2010 (po południu): Log tara (2> ../../tar.log) zawierał masę wpisów: implausibly old time stamp 1960-04-13 04:17:36. Data jest absurdalna. Żeby było śmieszniej w systemie była inna (w przód 2028 rok -- licznik się przekręcił tarowi?). Pliki z błędnym czasem modyfikacji były głównie w katalogach /dev/ /var/ oraz /etc/; wygląda jakby w czasie inicjalizacji, przed uruchomieniem ntpdate ,,fabryczny'' zegar Szewy wskazywał coś dziwacznego.

Czasy poprawiłem touchem. Zrobiłem rsync na dysk, a potem z dysku na kartę zapasową. Tym razem błędów nie było...

Dopisane 10 Kwietnia 2011: Poprawiłem skrypt rsync_neptune.sh na możliwą okoliczność wykonania kopii z uszkodzonych danych. W nowej wersji tworzone są trzy kopie z dwutygodniowym horyzontem czasowym:


#!/bin/bash
# rsync_neptune.sh (wersja poprawiona)
SOURCE=neptune::wholefs/

EXCLUDE=/root/.rsync/backup_exclude.lst
DESTDIR=/public/sheeva/backup/neptune/rootfs
COPYDIR=/public/sheeva/backup/neptune

### Zachowaj stara kopie pod inna nazwa:
cp -f ${COPYDIR}/1week.tar.gz ${COPYDIR}/2week.tar.gz

### Zachowaj stare dane (sprzed tygodnia):
tar -zcPf ${COPYDIR}/1week.tar.gz ${DESTDIR}

echo "=== Syncing ${SOURCE} at `date` ==="
rsync -av --exclude-from=${EXCLUDE} --delete ${SOURCE} ${DESTDIR}

Powinienem w ciągu dwóch tygodni się połapać, że coś jest nie tak, np. z kartą.

niedziela, 16 maja 2010

MapSource w Linuksie

MapSource firmy Garmin to aplikacja dodawana do każdego odbiornika zdolnego do korzystania z map. Nie ma wersji dla Linuksa, ale działa z emulatorem wine, tyle że przeraźliwie wolno (każda zmiana skali, czy obszaru mapy oznacza czekanie). Zresztą, być może w MSW jest podobnie -- nie sprawdzałem...

Ponieważ ja wykorzystuję MapSource praktycznie wyłącznie do załadowania mapy do urządzenia, powolność działania aż tak bardzo nie przeszkadza. Zatem...

Należy zainstalować MapSource z płyty dostarczonej z urządzeniem. Podłączyć urządzenie kablem USB i sprawdzić czy Linuks go widzi:


$ /sbin/lsusb
Bus 005 Device 003: ID 091e:0003 Garmin International GPSmap (various models)

Można też sprawdzić czy Linuks załadował stosowny moduł:


$ /sbin/lsmod | grep garmin
garmin_gps 18885 0
usbserial 30249 1 garmin_gps
garmin_gps

Jeżeli w powyższych dwóch krokach coś jest nie tak, no to jest problem... Ale u mnie jest OK. Teraz uruchamiamy MapSource:


wine "/home/tomek/.wine/drive_c/Garmin/MapSource.exe"

Jak MapSource nie widzi urządzenia, to trzeba wykonać jeszcze polecenie:


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

Teraz MapSource w mojej Fedorze działa. W Windows XP jak zwykle nie... Pewnie tzw. problem brakujących sterowników.

środa, 12 maja 2010

Amnezja

To były sobie piękne czasy takie
To nawet wtedy papież był Polakiem
Rozmontowaliśmy razem komunę
Lecz po co ja do dzisiaj nie rozumiem

Reszta np.  tutaj.

Dopisane 27 maja 2010 (wieczorem): Dziś pasuje inna zwrotka, mianowicie:
My na monopol mamy prawdę
Ja nie zabijam ani ja nie kradnę
A były przecież kiedyś piękne dni
Gierek, Jaruzel oraz my.

A to w kontekście doniesień medialnych, że niestety sorry ale Ewa Stankiewicz (ta od Trzech Kumpli) już nie jest de mode... Chciałbym żeby powód był taki, że zrobiła po prostu słaby film, ale coś nie potrafię w to uwierzyć...

Sheeva #2

Zainstalowałem Debiana Lenny na karcie SD (Patriot 16Gb class 6) wg. wskazówek ze strony Manually unpacking a tar ball of Debian on SheevaPlug, ale nie poszło gładko. Ponieważ boot loader mojej szewy był w wersji wcześniejszej od zalecanej 3.4.19, zatem kierując się wskazówkami ze strony Upgrading SheevaPlug's U-Boot, rozpocząłem od wgrania nowego U-boata stosując technikę wykorzystującą USB (a nie serwera TFTP). W rezultacie już za pierwszym podejściem zbrikowałem szewę na amen.

Na szczęście się okazało, że wgranie nowego programu rozruchowego i systemu do pamięci NAND nie jest aż takie trudne i sprowadza się do pobrania czegoś co się nazywa SheevaPlug Installer. Relewantna informacja zaczyna się od śródtytułu How to install 1.0?. Należy mianowicie:

  1. pobrać i rozpakować archiwum .tar.gz
  2. przegrać zawartość katalogu installer do katalogu głównego PenDrive'a
  3. w katalogu uboot/uboot-env znaleźć pliki uboot-nand-custom.txt oraz uboot-mmc-custom.txt i poprawić MAC adres odczytując go z obudowy SheevaPlug.
  4. Połączyć SheevaPlug z komputerem za pomocą kabla miniUSB oraz włączyć urządzenie. Z poziomu katalogu głównego instalatora uruchomić program (jako root):

    php ./runme.php nand

    Odczekać aż wszystko się nagra. U mnie nie do końca działa: system się ładuje ale root nie może się zalogować... Pech...

Ponieważ ostatecznie chcę uruchomić system z karty SD, a nie wbudowany z pamięci NAND, to powyższa niedogodność jest w sumie bez znaczenia. Ważne że U-boat jest zaktualizowany do wersji 3.4.19. Można zatem instalować Debiana.

Kartę podzieliłem na partycje i sformatowałem zgodnie z opisem, tyle że zamiast Ext2 użyłem Ext3, co okazało się błędem (ale o tym za chwilę). Następnie pobrałem archiwum z systemem:


wget http://people.debian.org/~tbm/sheevaplug/lenny/base.tar.bz2
wget http://people.debian.org/~tbm/sheevaplug/lenny/base.tar.bz2.asc

Zamontowałem kartę i skopiowałem co trzeba


tar -xjvf ~/base.tar.bz2

Ustawiłem środowisko programu ładującego:


setenv mainlineLinux yes
setenv arcNumber 2097
saveenv
reset

oraz


setenv bootargs_console console=ttyS0,115200
setenv bootargs_root 'root=/dev/mmcblk0p2'
setenv bootcmd_mmc 'mmcinit; ext2load mmc 0 0x01100000 /uInitrd; ext2load mmc 0 0x00800000 /uImage'
setenv bootcmd 'setenv bootargs $(bootargs_console) $(bootargs_root); run bootcmd_mmc; bootm 0x00800000 0x01100000'
saveenv

Teraz run bootcmd i kicha... System nie może odnaleźć partycji systemowej. Próbowałem różnych kombinacji, nic... Wreszcie dla świętego spokoju, sformatowałem kartę jako Ext2 a nie Ext3, tak jak jest to zalecane. Zadziałało... Morał: nie kombinować....

Teraz zrobiłem to wszystko co jest zalecane na stronie Manually unpacking a tar ball of Debian on SheevaPlug, tj.:


rm /etc/ssh/ssh_host*
ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ""
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ""

## Synchronizacja czasu
ntpdate pool.ntp.org

apt-get dist-upgrade

## Ustawienie daty/czasu
dpkg-reconfigure tzdata

## wybieram (spacją) pl_PL.utf8 pl_PL.88592, domyślnie pl_PL.utf8
dpkg-reconfigure locales

## zmienić nazwę hosta dodając ją do
vi /etc/hostname

A ponadto:


apt-get install ntp
apt-get install fuse-utils
apt-get install libxml-dom-xpath-perl libxml-dom-perl
apt-get install vim apache2
apt-get install php5 php5-cli
apt-get install make zip unzip

Na razie wystarczy...

Dopisane 20 maja 2010: Na podstawie zaleceń ze strony Debian Lenny -- installing Apache2 and PHP5 doinstalowuję porządnie PHP.

Dopisane 20 maja 2010: Formatowanie karty 8Gb za pomocą gparted. Partycja #1: 102 Mb (boot), partycja #2: 7044 Mb (system), partycja #3: ok. 500 Mb (swap). Za pomocą fdiska dodałem flagę boot do pierwszej partycji:


/sbin/fdisk /dev/sdc
a # toggle a bootable flag
1 # pierwsza partycja
w # zapisz tabelę partycji

Wczoraj próbowałem kartę SDHC Patriot LX (klasa 10), ale przesadziłem:


SDHC found. Card desciption is:
Manufacturer: 0x27, OEM "PH"
Product name: "SD08G", revision 3.0
Serial number: 2952790466
Manufacturing date: 4/2010
CRC: 0x00, b0 = 0

** Unable to read "/uInitrd" from mmc 0:1 **

** Unable to read "/uImage" from mmc 0:1 **
## Booting image at 00800000 ...
Bad Magic Number

Wygląda że Patriot LX 8Gb (class 10) is one of them, czyli z gatunku tych z którymi U-boat nie działa.

Ładowanie filmów na YouTube off-line

Ponieważ opisany poprzednio uploader filmów na YT przestał działać przyjrzałem się bliżej skryptowi youtube-upload.py. Od pierwszego strzału nie działa, ale... Skrypt ten wymaga do działania programu ffmpeg, który to program służy wyłącznie do obliczenia czasu trwania filmu. W przypadku szewy uruchamianie ffmpeg chyba nie jest dobrym pomysłem, a uruchamianie tylko po to żeby obliczyć ile trwa film to w ogóle beznadziejna sprawa...

Zatem ,,rozbroiłem'' skrypt, wpisując na zicher w odpowiednie miejsce długość filmu jako 60 (pewnie sekund):


def get_video_duration(video_path):
"""Return video duration in seconds."""
#errdata = ffmpeg("-i", video_path)
#match = re.search(r"Duration:\s*(.*?),", errdata)
#if not match:
# return
#strduration = match.group(1)
#return sum(factor*float(value) for (factor, value) in
# zip((60*60, 60, 1), strduration.split(":")))
return 60

Wygląda że działa.... Opis filmu dodaję po załadowaniu... Skrypt youtube-upload.py korzysta z API jest zatem dużo większa szansa, że nagle przestanie działać (jak to było z poprzednio wykorzystywanym programem). Do działania potrzebna jest też biblioteka python-gdata, która wszakże zainstalowała się na szewie w/o problems.

wtorek, 11 maja 2010

Poprawienie błędnej data/czasu wykonania zdjęcia

Jak zmienić błędny czas wykonania serii zdjęć, co się może zdarzyć gdy zapomni się ustawić zegar w aparacie? Wykorzystując exiftool jest to bardzo proste. Należy umieścić wszystkie trefne pliki w pewnym katalogu a następnie wykonać polecenie:


exiftool "-DateTimeOriginal+=5:6:21 10:18:20" katalog

lub lepiej:


exiftool -AllDates-=1 katalog
exiftool -AllDates-=11:20:11 katalog

Pierwsze przesunie (w każdym pliku) datę wykonania zdjęcia (DateTimeOriginal) o 5 lat, 6 miesięcy, 21 dni, 10 godzin, 18 minut oraz 20 sekund w przód. Drugie polecenie przesuwa o godzinę do tyłu wartości trzech pól: DateTimeOriginal, CreateDate oraz ModifyDate. Trzecie przesuwa tak samo jak drugie, tylko przesuwa o 11 godzin, 20 minut oraz 11 sekund.

Manipulowanie wpisami EXIF jest dobrze opisane w dokumentacji, exiftool więc to co powyżej nie jest żadną rewelacją.

Dziś usiłowałem w ten sposób poprawić czas zdjęć zrobionych aparatem z nie ustawionym zegarem (same zera w dacie/czasie). I się nie dało, tzn.


exiftool "-DateTimeOriginal+=2010:5:11 16:00:00" katalog

Zwracał błąd (że miesiąc ma numer -1). Zadziałało za to:


exiftool "-DateTimeOriginal=2010:5:11 16:00:00" katalog

tj. bez plusa przed znakiem równości

Przy okazji: The Olympus file format is Pmddnnnn.jpg where: m is month 1-9A-C, dd is day 0--31, nnnn is number 0000-9999. The P is fixed for all Olympus Cameras. Z tego by wynikało, że moje przekonanie, że nazwy plików się nie powtarzają nie jest oparte na prawdzie.

środa, 5 maja 2010

Wycieczka do Wilna

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.

wtorek, 6 kwietnia 2010

Mwcls w odstawkę

No niestety. Wszystko fajnie ale odsyłacze generowane przez makeindex oraz pakiet backref w pewnym obszernym dokumencie, z którym się zmagam od pewnego czasu, były błędne. Autor indagowany nie odpowiedział... Na liście GUST-l jest nawet wątek pn. ,,Odsylacze do rozdzialow w klasie mwbk'' i jedno z proponowanych rozwiązań to pakiet gmutils poprawiający mwcls (które z kolei poprawiają domyślnego LaTeXa).

A ja potrzebują w zasadzie zmienić wygląd zaledwie dwóch rzeczy: żywej paginy i wyliczeń. Dałem sobie spokój z mwcls: szybciej zmienię układ graficzny redefiniując odpowiednie makra LaTeXa niż dojdę czemu skorowidz/spis literatury zawiera błędne numery stron.

Nota bene: dla niezorientowanych mwcls, to klasy Marcina Wolińskiego, zamienniki standardowych klas LaTeXa, cieszące się pewną popularnością wśród polskich użytkowników tego systemu.

środa, 31 marca 2010

Zbędne deklaracje xmlns przy zamianie KML→GPX

Z pliku XML w wersji KML, tj. googleearth chcę wydłubać współrzędne punktów MyPlaces oraz zapisać je w formacie GPX (celem późniejszego załadowania do Garmina). Używam do tego następującego arkusza XSLT:


xmlns:kml="http://earth.google.com/kml/2.2"
xmlns:gpx="http://www.topografix.com/GPX/1/0" >




xmlns="http://www.topografix.com/GPX/1/0"
xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">






xmlns='http://www.topografix.com/GPX/1/0'>















]]>

Gdyby w powyższym arkuszu XSLT zamiast


<wpt xsl:exclude-result-prefixes="gpx kml"
xmlns='http://www.topografix.com/GPX/1/0'>
...

było po prostu:


<wpt xsl:exclude-result-prefixes="gpx kml"
...

to znaczy zostałaby pominięta deklaracja przestrzeni nazw elementu wpt, wtedy procesor XSLT zapisałby na wyjściu coś w rodzaju:


<wpt xmlns="" lat="19.35304208110762" lon="54.35681836243874">
...

A to oznacza, że wpt pochodziłby z pustej przestrzeni nazw, xmlns="". Niby proste, ale nie jest oczywiste jak usunąć -- na pierwszy rzut oka zbędne (a tak na prawdę błędne) -- wpisy xmlns="".

sobota, 27 marca 2010

Ustawienie częstotliwość sprawdzania dysku

Ponieważ mój PCet ma dwa dyski fizyczne i cztery duże partycje, to domyślne sprawdzanie co 30 montowań jest denerwująco za częste. Poniższe ustawia częstotliwość sprawdzania dysku podczas startu systemu na 99:


sudo tune2fs -c 99 /dev/sdb3

wtorek, 2 marca 2010

Numer bieżącego roku w Emacsie

Poniższe przypisuje zmiennej current-year napis zawierający numer bieżącego roku:


(setq current-year (number-to-string (nth 5 (decode-time (current-time)))))

Bez number-to-string zmienna current-year zawierałaby liczbę. Ale wtedy byłby problem jeżeli coś takiego byłoby argumentem funkcji concat.

czwartek, 25 lutego 2010

Metody ilościowe w R. Aplikacje ekonomiczne i finansowe

Metody ilościowe w R, Aplikacje ekonomiczne i finansowe, to książka napisana przez zespół autorów z Uniwersytetu Warszawskiego. Na okładce podpisani są Katarzyna Kopczewska, Tomasz Kopczewski oraz Piotr Wójcik. Na odwrocie strony tytułowej do tego dopisano także: Michała Ejdysa, Piotra Szymańskiego i Jakuba Świniarskiego. W paginie każdej strony parzystej pp. Kopczewska, Kopczewski i Piotr Wójcik są zaś określani zaś jako redaktorzy. Wydawca to CeDeWu.pl [pełna nazwa: CeDeWu wydawnictwa fachowe, która zakrawa na żart, o czym niżej]. Redaktor -- jeżeli w ogóle w tym CeDeWu, ktoś taki jest -- się nie podpisał.

Książka jest po prostu redakcyjnie fatalna a jej czytanie wręcz boli. Jak pisałem wyżej, można mieć wątpliwości czy ktokolwiek toto redagował. Wszystko spieprzono -- za przeproszeniem -- jedną decyzją redakcyjną, mianowicie ktoś wpadł na ,,genialny'' pomysł dziwacznego wyróżniania fragmentów programów w R. [A w tej książce circa połowa objętości to przykłady i fragmenty programów.] Otóż konstrukcje języka R w tekście są wyróżnione przez złożenie ich (wąskim) krojem bezszeryfowym w stopniu optycznie znacząco większym od kroju otaczającego tekstu. Tego się po prostu nie da czytać!

Żeby jeszcze było trudniej czytelnikowi, to stosując kursywę i pogrubienie, autorzy usiłują graficznie rozróżnić: zmienne, wartości zmiennych, nazwy poleceń, argumenty poleceń, nazwy pakietów. Pytanie po co? Co to daje oprócz mieniącej się w oczach pstrokacizny? Oczywiście taki skomplikowany schemat skutkuje multum błędów i niekonsekwencji (co raz jest pochyłe-grube, innym razem jest proste-chude). Kolejne kuriozum, to wyśrodkowane krótkich fragmentów składni umieszczonych w całości w oddzielnym akapicie (tzw. choinka, po co?). Jednocześnie w tych wyśrodkowanych akapitach nie ma już graficznego rozróżnienia co jest zmienną, nazwą polecenia itp... Pełen chaos... lepiej zaciemnić już nie można było... Nie prościej było wszystko złożyć Courierem, wyróżniając nieliteralne fragmenty np. kursywą? Cóś w stylu: merge(zbiórA, zbiórB, by.X=zmiennaA, by.Y=zmiennaB,all=TRUE).

Inne błędy to już pestka:

  • Wszystkie śródtytuły złożono krojem o stałej szerokości znaków (Courier lub coś podobnego), do tego w odmianie grubej. Pytanie po co taka ekstrawagancja?
  • Brak skorowidza, jest tylko zestawienie poleceń i pakietów. W przypadku 650 stronicowej książki typu kompendium to w zasadzie dyskwalifikacja.
  • Lewa żywa pagina nieustannie przypomina, że redaktorami książki są Katarzyna Kopczewska, Tomasz Kopczewski i Piotr Wójcik oraz, że jej tytuł to ,,Metody ilościowe w R...''. Przypominanie na 646/2 = 326 stronach kto napisał i co się czyta jest zapewne niezwykle przydatne dla osób z daleko posuniętą demencją...
  • Wzory matematyczne, których na szczęście jest bardzo mało, cechuje charakterystyczna dla produkcji stworzonej za pomocą MS Worda różnorodność: formuły wyeksponowane są zapewne złożone EquationEitorem i powiedzmy poprawne (przynajmniej jak na standardy jakości MS Worda), wzory wewnątrz akapitu (inline w nomenklaturze TeXa) są potraktowane zwykle kursywą, bo komu by się chciało uruchamiać EE? Od czasu do czasu niektóre formuły są półgrube a większość jest złożona w większym stopniu niż tekst je otaczający. Pewnie autor się na myszy oparł sięgając po kawę i już tak zostało...

Wydawanie takich książek to wstyd, obciach i żenada. Przede wszystkim dotyczy to wydawnictwa (CeDeWu wydawnictwa fachowe), bo to ono odpowiada za redakcję merytoryczną i techniczną. Tak się kończy powielanie maszynopisu przygotowanego przez dyletantów i na dokładkę w programie, który do tego się średnio nadaje. Rekomendacja: Nie kupować, szkoda pieniędzy...

Katarzyna Kopczewska, Tomasz Kopczewski i Piotr Wójcik, Metody ilościowe w R, Aplikacje ekonomiczne i finansowe, CeDeWu Warszawa 2009, ISBN 978-83-7556-150-0.

piątek, 12 lutego 2010

Ładowanie filmów na YouTube off-line

Trudno jest znaleźć gotowe i działające rozwiązanie pn. jak wysłać (upload) film na YT, nie używając formularza i przeglądarki. Teoretycznie jest API; jest tam nawet to opisane, ale jakoś tak na tyle pokrętnie, że nie mogę się połapać na szybko jak to zaimplementować. Szukałem po linii Pythona, por. Getting comments from youtube via... oraz python uploading scripts for youtube. Nic z tego nie wyszło...

Działa za to skrypt opisany na stronie How to Upload YouTube Videos Programmatically. Nie korzysta on wprawdzie z API--udaje przeglądarkę i analizuje kod HTML metodą data scrapping. Data scrapping ma ten minus, że w każdej chwili może przestać działać ale może nie będzie aż tak źle. Takie sztuczki sam kiedyś stosowałem, zresztą (por. Czy flickr umie liczyć -- rozwiązanie).

Przechodząc do konkretów. Uruchomienie skryptu ytup.pl wygląda następująco:


perl ytup.pl -l login -p hasło -c nr_kategorii -d opis - t tytuł_filmu -x słowa-kluczowe -f plik

Ja chcę uruchamiać ytup.pl w nocy, jak wszyscy śpią. W tym celu opis filmu wstawiam do pliku z rozszerzenie .descr, np.:


-t Elka plays accordion
-d Elka's warm-up exercises
-x elka,accordion,weltmaister,rehearsal,music,warm-up
-c 24
-f Zi6_0042.MOV

Jak widać, plik zawiera wszystko co trzeba do uruchomienia skryptu ytup.pl. Teraz inny plik przegląda wybrane katalogi, czyta pliki .descr i uruchamia ytup.pl [pliki Video i pliki .descr muszą być w tym samym katalogu]:


#!/usr/bin/perl
use File::Spec;
use File::Basename;

my $YTlogin = 'login'; ## wstaw login
my $YTpassword = 'hasło'; ## wstaw hasło
my $YTlog_file = "/home/tomek/SD/ytube/logs/YT_Upload.log";
my $PerlProg = "/usr/bin/perl";
my $PerlScript = '/home/tomek/bin/ytup.pl';
my @YT_watch_dirs=('/home/tomek/SD/ytube/upload', '/public/sheeva/winstuff/YTube');

open LOG, ">>$YTlog_file";

for my $dir (@YT_watch_dirs) {
# Read directory and collect description files.
opendir(DIR, $dir) or die "*** Can't open directory $dir: $!.";

print STDERR "*** Processing directory: $dir\n";

my $count = 0;
while (defined(my $file = readdir(DIR))) {
if ($file =~ /^\./) { next ; } # pomin plik z kropka na poczatku
if ($file =~ /\.descr$/) {
$file = File::Spec->rel2abs(File::Spec->join($dir,$file));
print STDERR "*** Description file: $file\n";
Upload_video($file);
rename($file, "${file}_") || print LOG "Problem ze zmiana $file => ${file}_\n";
$count++;
}
}
closedir(DIR);
print STDERR " $count .dscr file" . ($count!=1?'s':'') . ".\n";
}

close(LOG);

### ### ###

sub Upload_video {
# Przeczytaj plik z opisem, wyslij plik video za pomoca system(...)
my $file_name = shift ;
my $key, $val;

my @Options = ();

open (DESCRIPTION, $file_name);

while (<DESCRIPTION>) {
# plik zawiera w kazdym wierszu: opcja spacja wartosc-opcji
$_ =~ /([-\w]+)\s+(\S.*)/;
$key = $1; $val = $2; # na wszelki wypadek
if ($key =~ /-f/) { $val = dirname($file_name) . "/$val" ;
}
push (@Options, ("$key", "$val")); }
my @UploadScript = ($PerlProg, $PerlScript, '-l', $YTlogin, '-p', $YTpassword, @Options);
print STDERR "*** Executing: @UploadScript\n";

system ( @UploadScript ) == 0 || print LOG "Problem z zaladowaniem pliku $file_name\n" ;
}

Powyższy plik jest uruchamiany -- w stosownym momencie -- przez crona, a przesłany film jest tutaj.

wtorek, 2 lutego 2010

Lepszy sheevaPlug

Globalscaletechnologies zapowiada kilka komputerków będących ulepszonymi wersjami sheevaplug pn. guruPlug.

Rejestracja temperatury aka po co kupiłem SheevaPlug

Do podłączenia czujników temperatury DS18B20 firmy Dallas (kupionych za ca 5 PLN/sztuka na Allegro) dokupiłem -- też na Allegro -- Moduł 1Wire na USB, chipset DS2480B + FT232RL, który jest ,,Od strony programowej zgodny z konwerterami opartymi na układach DS2480B, czyli np. z oryginalnymi interfejsami serii DS9097 firmy MAXIM-DALLAS z tą różnicą, że interfejs podłączamy do portu USB zamiast portu szeregowego RS232 [...] Do konwersji ze standardu RS232 na USB zastosowano układ FT232RL firmy FTDI''. Więcej szczegółów można doczytać tutaj (Kod produktu: MP00202).

zdjęcie
Zdjęcie #1
zdjęcie
Zdjęcie #2
zdjęcie
Zdjęcie #3
zdjęcie
Zdjęcie #4

Teraz uwaga: czujnik DS18B20 ma trzy nogi (aka piny). Skrajne łączę i dolutowuję do jednej żyły (brązowej) przewodu telefonicznego a środkowy do drugiej (żółtej); dwie pozostałe żyły są niepotrzebne. [Kolory oczywiście nie są ważne; podaję je na swój prywatny użytek, gdybym za jakiś czas chciał rozbudować instalacją i dolutować kolejny sensor.] Ponieważ DS18B20 jest bardzo mały, to żeby piny się nie stykały izoluję każdą żyłę cienką rurką termokurczliwą (por. zdjęcie #1, umieszczone obok). Żeby ładniej wyglądało, ale przede wszystkim żeby połączenie czujnik-kabel było mocniejsze (żyły są bardzo cienkie) to na cały przewód naciągam szerszą rurkę (por. zdjęcie #2) i też zgrzewam (por. zdjęcie #3). Zgrzewam zapalniczką....

Moduł MP00202 nie łączę bezpośrednio z przewodem telefonicznym, bo żyły są tak cienkie że wolę zrobić to na dwa pas. Krótki dwużyłowy przewód elektryczny lutuję z żyłami kabla telefonicznego, po czym wzmacniam połączenie naciągając rurkę termokurczliwą. Dużo grubsze żyły kabla elektrycznego znacząco pewniej tkwią w stykach modułu MP00202. Nota bene: żyłę dolutowaną do skrajnych pinów należy połączyć z górnym stykiem, a tą drugą ze stykiem obok (dwa dolne styki są niewykorzystane; por. rys. #4).

Ostatecznie połączyłem równolegle 4 czujniki: pokój, tzw. weranda, kaloryfer i jeden zewnątrzny. Tzn. najpierw podłączyłem jeden i testowałem czy toto w ogóle działa. Ale to tak na marginesie...

Do rejestracji temperatury korzystam z programu digitemp:


sheeva> apt-get install digitemp

Konkurencyjny owfs.org nie jest dostępny w repozytoriach, zaś jego kompilowanie w wersji na SheevaPlug nie jest prostą sprawą. Z kolei digitemp nie działa out of the box, przynajmniej z tą wersją kernela, która była zainstalowana w moim komputerku... Sheeva ma ,,odchudzoną wersję'' kernela -- bez wielu modułów, w tym modułu ftdi_sio do obsługi konwertera USB→Serial, FT232R. Że coś jest nie ten-teges świadczy brak /dev/ttyUSB0. O tym wszystkim zaś doczytałem tutaj.

Nową wersję jądra, zawierającą stosowny moduł ściągnąłem i zainstalowałem z http://sheeva.with-linux.com/sheeva/:


sheeva> wget http://sheeva.with-linux.com/sheeva/README-2.6.32.7

Uwaga #1: po zainstalowaniu jądra niezbędne są zmiany środowiska Uboota (U-Boot environment variables) -- co trzeba zrobić jest opisane na początku pliku README-2.6.32.7. Aby zainstalować jądro wystarczy:


sheeva> ./README-2.6.32.7

Uwaga #2: jeżeli na ekranie pojawi się /bin/bash: bad interpreter: Permission denied, to sprawdźmy (uruchamiając mount bez argumentów) czy aby nie uruchomiamy skryptu w systemie plików montowanym z parametrem noexec.

Jak wszystko pójdzie dobrze (mi poszło) to teraz należy zaktualizować U-Boot environment variables. W tym celu należy połączyć się z SheevaPlug kablem z wtyczkami USB/miniUSB, wyłączyć komputerek, a po włączeniu połączyć się szybciutko poleceniem:


## jeżeli nie ma /ttyUSB1 spróbuj inny /ttyUSB*
cu -s 115200 -l /dev/ttyUSB1

Naciskając dowolny klawisz (należy się spieszyć) spowodujemy wyświetlenie się znaku zachęty U-boota. Wtedy należy wpisać, to co podano w README-2.6.32.7 (lub stosownym innym pliku jeżeli skopiowana była inna wersja jądra). Mówiąc konkretnie wpisać trzeba (działam metodą kopiuj wklej oczywiście; znak ↓ na końcu wiersza oznacza kontynuację):


setenv mainlineLinux yes
setenv arcNumber 2097
setenv bootargs rootfstype=jffs2 console=ttyS0,115200 mtdparts=orion_nand:0x400000@0x100000(uImage),↓
0x1fb00000@0x500000(rootfs) rw root=/dev/mtdblock1 ↓
rw ip=192.168.1.9:192.168.1.4:192.168.1.4:255.255.255.0:DB88FXX81:eth0:none

Teraz


saveenv
reset

Reset nie reboot, por. tutaj. Powinno się pojawić urządzenie /dev/ttyUSB0 (jeżeli podłączymy moduł MP00202 oczywiście). Zatem wreszcie:


sheeva> digitemp_DS9097U -a -i -s/dev/ttyUSB0

Program wypisze coś w stylu:


DigiTemp v3.5.0 Copyright 1996-2007 by Brian C. Lane
GNU Public License v2.0 - http://www.digitemp.com
Turning off all DS2409 Couplers
.....
Searching the 1-Wire LAN
10E8EF98010800E6 : DS1820/DS18S20/DS1920 Temperature Sensor
105C1C990108005A : DS1820/DS18S20/DS1920 Temperature Sensor
1029400102080084 : DS1820/DS18S20/DS1920 Temperature Sensor
1065259901080056 : DS1820/DS18S20/DS1920 Temperature Sensor
ROM #0 : 10E8EF98010800E6
ROM #1 : 105C1C990108005A
ROM #2 : 1029400102080084
ROM #3 : 1065259901080056
Wrote .digitemprc
Feb 02 20:18:08 Sensor 0 C: 17.75 F: 63.95
Feb 02 20:18:09 Sensor 1 C: 20.50 F: 68.90
Feb 02 20:18:10 Sensor 2 C: 43.81 F: 110.86
Feb 02 20:18:11 Sensor 3 C: -4.94 F: 23.11

Temperaturę rejestruję uruchamiając digitempa co godzinę, via crontaba:


##0 * * * * /usr/bin/digitemp_DS9097U -a -l/media/sd/tomek/logs/Digitemp/digitemp.log -s/dev/ttyUSB0
0 * * * * /home/tomek/bin/dt2ht.sh

Skrypt dt2ht.sh uruchamia digitemp_DS9097U (w sposób jaki podano w zakomentowanym wierszu wyżej) a następnie skryptem Perla obrabia plik /media/sd/tomek/logs/Digitemp/digitemp.log do formatu HTML. Wynik można obejrzeć tutaj. Uwaga #3: aby ,,zwykły'' użytkownik mógł uruchomić digitempa trzeba zmienić domyślne prawa dostępu do /dev/ttyUSB0:


cat 'KERNEL=="ttyUSB0", MODE="0666"' >> /etc/udev/rules.d/80-ttyusb.rules

Popularne jest wykorzystanie do graficznej prezentacji programu RRDTool, na co się -- póki co przynajmniej -- nie zdecydowałem. Przy okazji zmagań z termometrami zwiedziłem różne strony i blogi, niektóre całkiem interesujące (porządek linków dowolny): 1234567.

Bez Google ale i Piotra Strzelczyka, który wcześniej się okazało już coś takiego zlutował nie dałbym rady...

Dopisane 25 marca 2010 (Rozbudowa instalacji): Dokupiłem kabel energetyczny (dwużyłowy), bo na zewnątrz budynku przewód telefoniczny wydaje się za delikatny. W tym kablu jedna żyła jest niebieska a druga brązowa. Skrajne lutuję do niebieskiej, a środkowy do brązowej.