wtorek, 28 lipca 2009

Najbardziej oblegane zdjecie na flickr.com

Moje najbardziej oblegane zdjęcie na flickr.com. niedługo będzie miało jubileusz 2000 oglądnięć (przeciętna dla całego mojego zbioru to ok. 10 odsłon). Ponad 50 użytkowników zaznaczyło je jako ulubione. Tylko hmm... upodobania tych użytkowników takie trochę...

sobota, 18 lipca 2009

Rysowanie diagramów ścieżkowych za pomocą MetaPosta

Diagram ścieżkowy (path diagram)-- popularna notacja służąca do graficznego definiowania równań strukturalnych -- to rodzaj grafu, w którym kółka i prostokąty oznaczają węzły a strzałki krawędzie. Do tego zarówno kółka/prostokąty jaki i strzałki mogą być oznaczone symbolami. No i tu pech, bo tradycyjnie używa się greckich liter, do tego z subskryptami.

Dia to fajny program, ale przy bardziej zaawansowanych diagramach wychodzą jego ograniczenia, jak przykładowo niemożność umieszczania formuł matematycznych. Wstawianie symboli greckich próbowałem obejść modyfikując LOCALE i klawiaturę (da się) ale subskrypty/superskrypty to już się okazały nie do przejścia. Kombinowałem zatem jakby tu łatwo i przyjemnie zrobić diagramy ścieżkowe w czymś innym. W szczególności książka Skrondala i Rabe-Hesketh (Generalized latent variable modeling: multilevel, longitudinal, and structural equation models, ISBN: 9781584880004) -- ewidentnie składania LaTeXem -- zawiera bardzo schludne diagramy ścieżkowe. Podobno też w R coś tam się samo składa... Nic wszakże konkretnego nie ustaliłem i stanęło jak zwykle na MetaPoście.

Tutaj umieszczone bardzo proste makra pozwalają na rysowania diagramów ścieżkowych. Przykładowo narysowanie jednoczynnikowego modelu pomiaru, zawierającego trzy miary refleksyjne będzie wyglądało jakoś tak:


z1 = (40mm,20mm); %% srodek koła
%% Rysowanie czynnika eta_1 z błędem delta_1
ErCircle(z1, "$\eta_1$", "$\delta_1$", "r");

%% miary (refleksyjne):
z15 = (10mm,0mm);
%% miara x_1 z błędem \epsilon_1
ErRectangle(z15, "$x_1$", "$\epsilon_1$", "l");
CircleToRectangle(z15,z1, "$\lambda_1$");

z10 = (10mm,10mm);
%% miara x_2 z błędem \epsilon_2
ErRectangle(z10, "$x_2$", "$\epsilon_2$", "l");
CircleToRectangle(z10,z1, "$\lambda_2$");

z11 = (10mm,20mm);
%% miara x_3 z błędem \epsilon_3
ErRectangle(z11, "$x_3$", "$\epsilon_3$", "l");
CircleToRectangle(z11,z1, "$\lambda_3$");

Bardziej zaawansowany model jest obok na rysunku. Może komuś się też się przyda...

piątek, 19 czerwca 2009

prelim2e

Przydatny pakiet do wstawianie identyfikatora wersji dokumentu. Do tej pory stosowałem do tego makra `generyczne', ewidentnie wymyślone w okolicach f-my BOP sc.:


\newdimen\hs\hs 210mm
\newdimen\vs\vs 297mm
\def\shipmarg{\kern15mm}
\newbox\shipbox

\let\oriship\shipout

\def\DOSHIP{%
\hoffset-1in \voffset-1in
\oriship\vbox to\vs{
\shipmarg\nointerlineskip
\nointerlineskip\vss
\hbox to\hs{\hss\box\shipbox\hss}%
\nointerlineskip\vss
\hbox to\hs{\shipmarg \DOCNOTE \hss}
\shipmarg
}}
\def\doship{\aftergroup\DOSHIP}
\def\shipout{\afterassignment\doship\setbox\shipbox}

(Zaznaczone przerażające polecenia \aftergroup/\afterassignment, których w życiu nie używałem i przyznam nawet, że nie znam ich znaczenia.) Po czymś takim, umieszczonym najlepiej w osobnym pliku, należy zdefiniować tekst umieszczany na każdej stronie:


\def\DOCNOTE{ .... }

Patent ten w zmodyfikowanej wersji był wykorzystywany m.in. w klasie wzmgr. Był ale ponieważ przestał działać wymieniłem go na pakiet prelim2e. Sądząc z zawartości google -- mniej znany. Używa się go zaś bardzo prosto:


\usepackage{prelim2e}
\renewcommand{\PrelimWords}{...} %% <-- opcjonalnie, jeżeli domyślny tekst się nie podoba

Pakiet draftcopy nie działa z pdftexem więc od razu został zdyskwalifikowany. (Poza tym nie podoba mi się zwyczaj wstawiania bombastycznego napisu w tle tekstu kolumny.)

Dodanie prelim2e do wzmgr zrobiłem warunkowo. Jak ktoś doda do dokumentu opcję brudnopis, to zamieni się to na poniższe:


\DeclareOption{brudnopis}{\AtEndOfClass{\input{prelim2e.sty}%
\renewcommand{\PrelimWords}{\ThisDocVersionId}\linespread{1.0}}}
\def\ThisDocVersionId{....} %% <-- trzeba zdefiniować --

Bez umieszczenia \input wewnątrz \AtEndOfClass, LaTeX zgłaszał błąd powtórnej definicji \PrelimWords. Mam nadzieję, że powyższe jest OK, ale tradycyjnie pewności nie ma:-)

czwartek, 4 czerwca 2009

LaTeX, tabele i \tabularnewline

Prosta tabela składająca się z dwóch kolumn, ale zawierająca wielowierszowe rubryki. Rubryki mają być składane ,,w chorągiewkę''. Zatem dodaję pakiet array i definiuję za pomocą \newcolumntype:


\usepackage{array}
\newcolumntype{L}{>{\raggedright\hspace{0pt}}p{.48\textwidth}}
\begin{document}

\begin{tabular*}{\textwidth}{@{\extracolsep{\stretch{1}}}LL}\hline
coś tam coś tam coś & coś tam coś tam coś \\
\end{tabular*}

Nie działa a przyczyna jest subtelna. Otóż \raggedright m.in. definiuje polecenie \\, które kończy wiersz. Wewnątrz tabular też jest zdefiniowane \\, które kończy wiersz tyle, że tabeli -- a to co innego. Na okoliczność tego konfliktu wymyślono polecenie \tabularnewline. Należy zamiast \\ na końcu wiersza tabeli wstawiać \tabularnewline i będzie git! Do dziś nie potrzebowałem \tabularnewline więc nawet nie wiedziałem, ze takie coś istnieje. Zamiast \tabularnewline można -- dołączając pakiet ragged2e -- wstawić ,,bezpieczną wersję'' \raggedright, czyli \RaggedRight.

piątek, 22 maja 2009

Drobny przykład w XSLT

Fragment pliku XML wygląda jakoś tak:


<month no="1">
<item data="2009/01/03" dist="20" exdist="18.60" />
<item data="2009/01/25" dist="50" exdist="49.10" />
<month no="2">
...
</month>

Wszystkie item pomiędzy month trzeba zsumować aż do zadanego numeru miesiąca (włącznie), który jest n.b. wartością atrybutu no. Poniższy szablon wykona ww. zadanie:


<xsl:template name='drukuj-do-mc'>
<xsl:param name='mc'/>
<xsl:text> [od początku roku: </xsl:text>
<xsl:value-of select="sum(//item[not(../@no &gt; $mc)]/@dist)"/>
<xsl:text> km] </xsl:text>
</xsl:template>

Wyróżniony wiersz zawiera kluczowe przekształcenie XPath: //item[not(../@no &gt; $mc)]/@dist, co można zinterpretować następująco: wszystkie atrybuty dist przyczepione do elementu item, z całego dokumentu, ale pod warunkiem, że wartość atrybutu no elementu nadrzędnego jest nie większa niż $mc.

czwartek, 7 maja 2009

Pakiet fancyvrb (LaTeX)

Pakiet pozwala na formatowanie otoczenia verbatim, przykładowo można dodać numerowanie wierszy, zmienić stopień pisma (przydatne jak zawartość się nie mieści). Można też zdefiniować znak, który będzie rozpoznawany jako polecenie wewnątrz verbatim. To ostatnie przydaje się do formatowania fragmentów tekstu, np. złożenia kursywą lub w innym kolorze (przykład niżej)


\documentclass{article}
\usepackage{fancyvrb}
\DefineVerbatimEnvironment{SVerbatim}{Verbatim}%
{commandchars=\+\[\],numbers=left,numbersep=5pt,fontsize=\footnotesize}
%%
\DefineVerbatimEnvironment{XVerbatim}%
{Verbatim}{numbers=left,numbersep=5pt,fontsize=\small}
\begin{document}

\begin{SVerbatim}
aa [ ] \[ \] %% <-- znaki [ ] znikają magicznie
bb [ ]
ccc +textit[cccc Hop siup!]
\end{SVerbatim}

\begin{Verbatim}[commandchars=\@\[\]]
aa [ ] \[ \]
bb [ ]
ccc @textit[cccc Hop siup!]
\end{Verbatim}

Magiczne commandchars definiujące znaki rozpoczynające
polecenie można definiować także `indywidualnie':

\begin{XVerbatim}[commandchars=\@\[\]]
aa [ ] \[ \]
bb [ ]
ccc @textit[cccc Hop siup!]
\end{XVerbatim}

\end{document}

Polecenie zatem zaczyna się znakiem `+' a argument jest zawarty wewnątrz `[' oraz `]'. Tych znaków nie można używać wewnątrz Verbatim (por. przykład pierwszy, powyżej). W tej sytuacji ich deklaracja ,,globalna'' jest ryzykowana, bo może się zdarzyć, że będzie potrzeba wstawić ,,magiczny'' znak literalnie.

poniedziałek, 4 maja 2009

Fälschungserschwerende Schrift (aka falsification-hindering script)

Ciekawostka, z wykładu w Bachotku. Krój, którym są -- nazwijmy to -- składanie tablice rejestracyjne w Niemczech jest dość specyficzny. Nie mając pojęcia do czego służy ww. font można by pomyśleć że to jakiś niedorobiony produkt amatora: litery ,,z różnych parafii'', jedna z szeryfami drugie nie, znaki w innych krojach optycznie podobne tutaj są specjalnie różne....

It was designed by Karlgeorg Hoefer for the German government in the late 1970s in the light of Red Army Faction terrorism when it was discovered that with the then-standard font for vehicle registration plates--the road sign font--it was particularly easy to modify letters by applying a small amount of black paint or tape. For example, it was easy to change a "P" to an "R" or "B", a "3" to an "8", or an "L" or "F" to an "E". Modifications to FE-font plates are somewhat more difficult, as they also require the use of white paint, which is easily distinguished at a distance from the retroreflective white background of the plate, in particular at night. Faked FE-Schrift letters (e.g., "P" to "R") appear conspicuously disproportionate.

Podrobić trójkę z ósemki, zamalowując kredą połowę znaku, jak to zrobił Hans Kloss w 17 odcinku SWNŻ (Akcja liść dębu) byłoby dużo trudniejsze. Dla porównania w większości fontów wygląda to tak: 88/33 (zakładam, że sz. czytelnik używa normalnego kroju w przeglądarce).

wtorek, 28 kwietnia 2009

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

TV w Linuksie

W uzupełnieniu do wpisu: TV w Internecie oglądam więcej niż sporadycznie ale dziś chciałem pooglądać mecz Barcelona vs Chelsea i nie potrafiłem uruchomić sopcasta. Ostatecznie zadziałał sposób podany na blogu Mateusza Wójcika, tj. poprzez uruchomienie skryptu (lekko zmieniony przez dodanie if-then-else-fi):


#!/bin/bash
if [ $1 ]
then
sp-sc $1 3908 8908 > /dev/null &
echo "Poczekaj 20 sekund na scachowanie danych i otworzenie odtwarzacza..."
sleep 20
mplayer http://localhost:8908/tv.asf
echo "Zamykanie polaczenia..."
killall sp-sc
else
echo "Podaj kanał..."
fi

Adres kanału znalazłem na stronie http://www.soccer-live.pl/.

niedziela, 26 kwietnia 2009

Drukowanie arkusza Google docs

W przykładzie poniżej Perl pobiera dane z arkusza Google Docs, i zapisuje je do pliku tymczasowego. Następnie TeX -- uruchomiony ,,z wnętrza'' skryptu -- formatuje ww. dane (układ graficzny jest zdefiniowany w stylach (por. \input brasskoncert.sty):


use Net::Google::Spreadsheets;
use Getopt::Long;
use Encode qw(encode);

my $STitle = 'Konkurs_Brass'; # nazwa arkusza do pobrania
my $pdftexprogname = 'pdfmex'; # nazwa programu uruchamiającego TeXa
my $outputname = "tmp__.tex"; # nazwa pliku tmp

my $pdfintermode = "-interaction=nonstopmode"; # lepsze niż "-interaction=batchmode";

GetOptions( 't=s' => \$title,);

## nazwy kolumn w arkuszu:
my @Cols = ('nazwisko', 'kraj', 'instrument', 'srednia');

my $service = Net::Google::Spreadsheets->new(
username => '???', password => '???' );

my @spreadsheets = $service->spreadsheets();

my $spr_title = $service->spreadsheet( { title => "$STitle" });
my $worksheet = $spr_title->worksheet( { title => 'sheet1' });
my @rows = $worksheet->rows;

open (OUT, ">$outputname") || die "Nie mogę otworzyć $outputname.tex!\n\n";
print OUT "\\input brasskoncert.sty\n\\HEAD{$title}\n";

for $r (@rows ) { $rc = $r->content; print OUT "\\Row";
for $t (@Cols ) {
print OUT "{", encode("iso-8859-2", ${$rc}{$t}), "}";
}
print OUT "\n";
}

print OUT "\\TAIL \\bye\n";

close (OUT);

my @run_pdftex = ($pdftexprogname, $pdfintermode, $outputname);
system ( @run_pdftex ) == 0 || die "Cuś nie tak\n" ;
##

Być może da się prościej, bez Net::Google::Spreadsheets a poprzez LWP...

piątek, 24 kwietnia 2009

Elka w wikicommons

Skrypt Erika Möllera , którego używałem do ładowania zdjęć na WikiCommons przestał działać. Konsultacja na stronie wykazała, że jest outdated and should be considered deprecated and useless. Program proponowany w zamian nie podoba mi się. Może i jest dobry, ale zbytnio się różni od poprzedniego a ja nie mam czasu go rozgryzać. Znalazłem za to poprawioną wersję skryptu Möllera, która działa, tutaj (lub tutaj).

Jest ciągle problem z kodowaniem (używam domyślnie ISO-8859-2), bo po przesłaniu na WC tekst jest niepoprawnie zakodowany. Metodą prób i błędów ustaliłem, że działa dopisanie na początku skryptu czegoś takiego:


binmode( STDOUT, ':utf8' );
use open IN => ':encoding(iso-8859-2)'; ## I am using legacy encoding, ha!
use open OUT => ':utf8'; ## write utf8

Opis zdjęcia w pliku tekstowym jest w ISO, po przesłaniu na WC kodowanie jest OK. Próbowałem wysyłać pliki kodowane jako UTF-8, ale to też nie działało (mój perl jest w wersji v5.8.8).

Rysunek obok znalazłem przypadkiem. Ktoś skopiował moje zdjęcie z flickr.com na WC dodając zabawny opis...

Przy okazji ustaliłem jak przejść do ,,trybu UTF'' otwierając nowy plik w Emacs: C-x C-m f utf-8