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