wtorek, 29 kwietnia 2008

TV w FC8

Nie do końca legal, chyba. Ściągnąłem rpm polecany na tym blogu. Zainstalowałem:


rpm -Uvh qsopcast-0.3.1-1mgc.i686.rpm

Teraz można uruchomić program podając qsopcast. Trzeba tylko zmienić konfigurację podając adres listy kanałów jako http://www.sopcast.com/gchlxml (Config|Config). Zmieniłem też program do oglądania na mplayer (też w zakładce Config|Config). Kłopot tylko z wyborem kanału. Opisywany na blogach sposób (np. tu) przez konfigurację FF via about:config nie działa.

No i oglądam MU vs Barcelona; na razie jest 1:0 a strzelił Paul Scholes.

niedziela, 27 kwietnia 2008

Problem z ładowaniem zdjęć do Panoramio

Próba załadowania zdjęcia -- w formacie jpeg -- o wielkości 2344484 bajtów kończy się komunikatem the size of the photo should be less than 5MB. Jest jakieś niekonkluzywne zamieszanie ,,w temacie'' na listach dotyczących Panoramio. Podejrzewam błąd po stronie serwera i/lub, że P. liczy wielkość pliku po rozpakowaniu (aczkolwiek nigdzie o tym nie jest napisane). Anyway, po nieznacznym zmniejszeniu:


convert p4260616.jpg -quality 80 p4260616_s.jpg

Plik ma teraz 2013114 bajtów i jest już OK. Swoją drogą komunikat mógłby być uzupełniony o informację jaka jest wielkość ładowanego pliku wg. Panoramio.

Wywiad z Knuthem na www.informit.com

Kol. WB podesłał informację na GUST-L nt. wywiadu z prof. Knuthem (cf. strona domowa) Tekst jest dostępny na stronach www.informit.com.

środa, 23 kwietnia 2008

Format Raw i dane EXIF

Przełączyłem aparat na format RAW a do zamiany plików w tym formacie (rozszerzenie .orf) na tiff użyłem dcraw, np.:


dcraw -T plik.orf # zamiana poj. pliku
for i in *.orf; do dcraw -T $i ; done

Pliki są nieskompresowane, więc następnie:


convert plik.tiff -compress ZIP plik_z.tiff # albo
mogrify -compress ZIP plik.tiff

Program mogrify modyfikuje plik oryginalny

Zamiana tiffa na jpeg z wykorzystaniem convert wygląda zaś następująco:


for i in *.tiff; do convert $i `basename $i .tiff`.jpg ; done

Powyższe ma jeden dyskwalifikujący brak: dcraw usuwa dane EXIF. Szukając rozwiązania znalazłem dwa skrypty basha do konwersji z zachowaniem metadanych: Converting RAW images to JPEG with Exif on Fedora oraz wrapper script for dcraw. Pierwszy ze skryptów używa exiv2 a ja mam awersję do tego programu (być może niesłuszną, ale kiedyś mi podpadł). Drugi niby jest dla Nikona, ale żeby działał z Olympusem to wystarczy zmienić nef na orf w jednym wierszu (oprócz tego uprościłem skrypt, bo był sophisticated zbytnio i niepotrzebnie):


#!/bin/bash
# http://www.howtofixcomputers.com/forums/digital-photo/my-humble-contribution-wrapper-script-dcraw-linux-4360.html
# Zamiana plików ORF (Olympus) na JPEG z zachowaniem danych EXIF
# Wykorzystuje dcraw, cjpeg (do kompresji) oraz exiftool
#
DCRAW="dcraw -w -c "

while [ $# -ge 1 ]
do

JPEG=`basename $1 .orf`.jpg
echo "Converting $1 => ${JPEG}..."
$DCRAW $1 | cjpeg -quality 90 > $JPEG || echo " *** Problem writing "

# transfer EXIF data from the original raw file
exiftool -overwrite_original -TagsFromFile "$1" "$JPEG" >/dev/null

shift
done

Przy okazji znalazłem link do konferencji Libre Graphics Meeting.

Dopisane 27 kwietnia 2008: zmieniłem ustawienia w aparacie na zapis RAW+HQ. Poprzednio było RAW, a przedtem HQ. HQ zapisuje prawie że identyczne ,,objętościowo'' pliki .jpg o wielkości 2Mb (z ogonkiem). Nie ustaliłem jeszcze czemu ale pliki konwertowane z RAW różnią się znacząco wielkością (ten sam parametr quality oczywiście) a te produkowane przez aparat są takie same.

wtorek, 22 kwietnia 2008

Bachotek 2008

Właśnie przed chwilą skończyłem redagowanie materiałów konferencyjnych na kolejny Bachotek, który już niedługo. Udało się te materiały skompilować korzystając z TeXLive2007 [z drobnymi problemami]. Problem pierwszy to jak dołączyć font lokalnie?, tzn. Prelegent Marcin W. dostarczył egzotyczny font, którego nie chcę instalować system-wide. Na okoliczności egzotycznych, dodatków ma katalog /.texmf a w pliku web2c/texmf.cnf ustawione, przykładowo:


TEXINPUTS.tex = .;..;./texmf//;$TEXMF/tex/{plain,generic,}//

Co oznacza że mój TeX szuka plików w katalogu nadrzędnym oraz w katalogu/podkatalogach ./texmf. Ale mapy fontowe są ,,globalne'' a bez wpisów w plikach .map, program pdftex ,,nie widzi'' fontów [BTW ,,stara technologia'' z wykorzystaniem dvipsa była lepsza bo dvips ma opcję -u, co pozwala zapodać mu mapę lokalnie. Takiej opcji nie ma pdftex.] Rozwiązanie jest następujące:


updmap --enable Map bayerancki.map

Powyższe podałem jako zwykły użytkownik, bayerancki.map umieściłem w ./texmf, razem z fontami i plikami .tfm. Zadziałało. Dokładny sposób działania updmap jest dla mnie -- muszę przyznać -- pewną tajemnicą.

Problem drugi--brak jakiegoś fontu cyrylicznego. TL2007 zainstalowanemu w wariancie (kolekcji) GUST brakuje fontu latt0800--tylko gdzie go znaleźć? Google w tym przypadku okazał się mało pomocny: latt0800.tfm nie ma wcale, a latt0800 wskazuje na pliki .map fontów cm-super. Ale w pakiecie cm-super nie ma pliku latt0800.tfm? Nie ma bo jest w lh. [Naprawdę, to też go tam nie ma, ale zostanie wygenerowany.] Instalacja pakietu za pomocą skryptu install-pkg.sh też taka mało intuicyjna:


sh install-pkg.sh --help # nie ma takiej opcji--czemu?
sh install-pkg.sh --package=lh --listonly # podaje zawartość pakietu lh

sh install-pkg.sh --package=lh # instaluje pakiet lh

Nie znalazłem opcji wyświetlenia listy pakietów--oglądałem je po prostu za pomocą ls po nazwach starając się wykoncypować o co może chodzić. Jest opcja listdir ale sposób jej działania jest dla mnie wielką tajemnicą. Nie wiem czemu ten skrypt jest tak bezsensownie prymitywny -- doinstalowanie czegokolwiek z TL to całkiem traumatyczne przeżycie.

A na Bachotek znowu nie jadę, bo w tym samym czasie jedziemy do Kilonii oglądać U-boota.

czwartek, 10 kwietnia 2008

At z dokładnością do sekund

Polecenie at uruchomi program w określonym co do minuty momencie. Posługiwanie się at wygląda jakoś tak:


at 17:01
nazwa-polecenia-do-wykonania
Ctrl-D

Powyższe jest przykładem trybu interaktywnego, stąd Ctrl-D na końcu. Można też uruchomić at w następujący sposób: at 19:12 < plik. Polecenie są wtedy wpisane do pliku. Poleceń może być więcej niż jedno.

A jak się chce uruchomić polecenie z dokładnością do sekund, to co wtedy? Oczywiste wyjście to dodać sleep. Inne sposób to dać sobie spokój z at i całość zakodować w Perlu:


#!/bin/perl
use Time::Local;

my $run_time = shift; ## `execution' time, given as: hh:mm:ss
my ($hh, $mm, $ss) = split /:/, $run_time;
print STDERR "Run task at: $hh:$mm:$ss\n";

while (1) {
sleep 1; # preventing the task from running more than once during the 0 second.
while ((localtime(time))[0] != $ss) { sleep 1; }
runTask();
}

sub runTask {
## diff between current and `execution' time
my $tdiff = timelocal($ss, $mm, $hh, (localtime)[3,4,5]) -
timelocal(localtime());
if ($tdiff < 0) { print "Executed!" }
else { print "Will be executed within: $tdiff\n"; }
}

Ideę znalazłem na tym blogu.

sobota, 5 kwietnia 2008

Ical, vcal nowy telefon i rozkłady zajęć na WZUG

Niedawne kupno telefonu zainspirowało mnie do przygotowania rozkładu zajęć dla studiów zaocznych w formacie vcal. Rozkład ww. zajęć jest opracowywany w aplikacji pn. Rozkład Zajęć na Uczelni (w skrócie RZU). Układanie tegoż planu jest dość pracochłonne ponieważ nie ma tu żadnego powtarzalnego cyklu a zajęcia planuje się w skali całego semestru (a nie tygodnia jak ma to miejsce na studiach dziennych).

Gotowy plan jest zamieniany następnie na format XML a potem sortowany wg. wykładowców, grup, sal oraz chronologicznie. Na etapie drukowania/sortowania nie jest wykorzystywany program RZU, bo rezultaty są bardziej niż kiepskie ale Perl+pdfTeX. Wynik można obejrzeć tutaj. BTW skrypty Perla + style TeXa są tutaj, tyle że są mocno związane z zasadami/konwencjami tworzenia rozkładów na WZUG i w związku z tym niekoniecznie przydadzą się każdemu użytkownikowi ww. programu RZU.

Zatem zachciało mi się dodać do generowanych przez skrypt ast2x.pl formatów vcal. Nie wchodząc w zawiłości formatu (tutaj jest ładnie sformatowana dokumentacja), mój dokument powinien zawierać wpisy postaci:


BEGIN:VEVENT
DTSTART:20070310T070000Z
DTEND:20070310T083000Z
DESCRIPTION: 501, 502/Gospodarka elektroniczna/C-21/08.00--09.30/Wrycza
UID:www.wzr.pl_l_00155_20070310T070000Z
LOCATION:C-21
SUMMARY:501, 502/Gospodarka elektroniczna/C-21
END:VEVENT

Jak widać, format jest prawie samoopisujący się. Pole UID ma być unikatowe, co IMHO można np. osiągnąć tak, jak w przykładzie wyżej, tj. konstruując URL postaci: www.wzr.pl_l_nr-wykł_początek-zaj. Prawdziwy kłopot to pola DTSTART/DTEND, bo czasy muszą być w UTC. Oczywiście RZU generuje czasy lokalne, więc trzeba je zamienić na UTC uwzględniając przesunięcie oraz czas letni/zimowy. Nie chciałem korzystać przy tym z jakiś egzotycznych bibliotek Perla, żeby później nie musieć tego instalować (osoba pracująca nad planem używa MS Windows, itd...). Znalazłem zatem następującą formułę wyznaczania dnia zmiany czasu (więcej jest na stronie: webexhibits.org/daylightsaving/):


sub euDaylightSavings {
# All countries in Europe except Iceland observe DST and change
# on the same date and time, starting on the last Sunday in March
# and ending on the last Sunday in October.
# cf. http://en.wikipedia.org/wiki/Daylight_saving_time_around_the_world
# The subroutine returns the exact day-of-month of DST change.
# The examplar usage: daylightSavings (2008,'march')
#
my ($yr,$when) = @_;

if ( $when =~ /mar/ ) { return (31 - (5*$yr/4 + 4) % 7); }
else { return (31 - (5*$yr/4 + 1) % 7); }
}

Powyższe pozwala na łatwe ustalenie w jakim dniu następuje przesunięcie. Np. w roku 2007 były to odpowiednio 25 marca oraz 28 października, co oznacza, że od 25 marca (włącznie) do 27 października (też włącznie) trzeba dodać jedną godzinę więcej do przesunięcia między UTC a CET.

Teraz z kolei jak stwierdzić czy dana data jest przed czy po innej? Konsultując się z Perl Receptury znalazłem:


use Date::Calc qw(Delta_Days);
my $cet_offset = 1;

## $yr, $mn, $dy -- odp. rok, miesiąc, dzień

my $dst_start = euDaylightSavings($yr, 'mar');
my $dst_end = euDaylightSavings($yr, 'oct');

## funkcja Delta_Days zwraca liczbę dni między y1, m1, d1 a y2, m2, d2
if ( ( Delta_Days($yr, 03, $dst_start, $yr, $mn, $dy) >= 0 ) &&
( Delta_Days($yr, 10, $dst_end, $yr, $mn, $dy) < 0 ) ) {
return $cet_offset + 1 }
else { return $cet_offset }

Tyle, że Date::Calc nie jest standardowo dostępny w Perlu. Ponieważ jednak nie potrzebuję liczby dni między datami a jedynie określenia porządku więc być może wystarczy coś następującego:


sub Delta_Days{
my ( $y1, $m1, $d1, $y2, $m2, $d2 ) = @_ ;

if ($y1 < $y2) { return 1 }
elsif ($y1 > $y2) { return -1 }
else {
if ($m1 < $m2) { return 1 }
elsif ($m1 > $m2) { return -1 }
else {
if ($d1 < $d2) { return 1 }
elsif ($d1 > $d2) { return -1 }
else { return 0 }
}
}
}

Wygląda, że działa. Ale pewności nie ma:-) Dodam na koniec że na etapie testów usiłowałem też korzystać z biblioteki Net::ICal ale zrezygnowałem--niewiele wnosi. Aha w jakim kodowaniu toto ostatecznie ma być, UTF-8? No chyba tak.