Weblog Tomasza Przechlewskiego [Zdjęcie T. Przechlewskiego]


scrum
random image [Photo gallery]
Zestawienie tagów
1-wire | 18b20 | 1wire | 2140 | 3rz | adamowicz | afera | alsamixer | amazon | amber | amman | anniversary | antypis | apache | api | applebaum | arm | armenia | astronomy | asus | atom.xml | awk | aws | bachotek | bakłażan | balcerowicz | balta | banan | bash | batumi | berlin | białowieża | białystok | bibtex | bieszczady | birzeit | biznes | blogger | blogging | blosxom | bme280 | bono | borne-sulinowo | breugel | bt747 | budapeszt | budyniowo | budyń | bursztyn | campagnolo | canon | cedewu | chaos | chello | chiller | chillerpl | chown | christophe dominici | chujowetaśmy | ciasto | cmentarz | contour | coronavirus | covi19 | covid | covid19 | cron | css | csv | cukinia | curl | cycling | d54250wykh | darkages | dbi | debian | dejavu | dhcp | dht22 | dia | docbook | dom | dp1500 | ds18b20 | duda | dulkiewicz | dulkiewiczowa | dyndns | dynia | ebay | economy | ecowitt | ekonomia | elka | elm | emacs | emacs23 | english | ep | erasmus | erasmusplus | ess | eu | eurostat | excel | exif | exiftool | f11 | fc | fc11 | fc15 | fc29 | fc5 | fc8 | fedora | fedora21 | fenix | ffmpeg | finepix | firefox | flickr | folau | fontforge | fontspec | fonty | food | fop | forms | foto | france | francja | fripp | froggit | fuczki | fuji | fuse | gammu | garden | garmin | gas | gawk | gazwyb | gdańsk | gdynia | gender | geo | geocoding | georgia | gft | ggplot | ghost | git | github | gmail | gmaps | gnokii | gnus | google | google apps script | googlecl | googleearth | googlemaps | gotowanie | gphoto | gphoto2 | gps | gpsbabel | gpsphoto | gpx | gpx-viewer | greasemonkey | gruzja | grzyby | gus | gw1000 | haldaemon | handbrake | helsinki | hhi | historia | history | hitler | holocaust | holokaust | hp1000se | hpmini | humour | iblue747 | ical | iiyama | ikea | imagemagick | imap | inkscape | inne | internet | j10i2 | javascript | jhead | jifna | jordania | k800i | kajak | kamera | karob | kibbeh | kleinertest | kml | kmobiletools | knuth | kociewie kołem | kod | kolibki | komorowski | konwersja | krutynia | krynki | kuchnia | kurski | kłamstwo | latex | latex2rtf | latex3 | lcd | legend | lenny | lesund | lewactwo | lgbt-folly | liban | liberation | linksys | linux | lisp | lisrel | litwa | lizbona | logika | ltr | lubowla | lwp | lwów | m2wś | malta | mapquest | mapsource | maradona | marchew | marimekko | marvell | math | mathjax | mazury | mbank | mediolan | mencoder | mevo | mex | mh17 | michalak | michlmayr | microsoft | monitor | mp4box | mplayer | ms | msc | mssql | msw | mswindows | mtkbabel | museum | muzyka | mymaps | mysql | mz | nafisa | nanopi | natbib | navin | neapol | nekrolog | neo | neopi | netbook | niemcy | niemieckie zbrodnie | nikon | nmea | nowazelandia | nuc | nxml | oauth | oauth2 | obituary | ocr | odessa | okular | olympus | ooffice | ooxml | opera | osm | otf | otftotfm | other | ov5647 | overclocking | ozbekiston | padwa | palestyna | panoramio | paryż | pdf | pdfpages | pdftex | pdftk | pedophilia | perl | photo | photography | pi | picasa | picasaweb | pim | pine | pis | pit | pizero | plain | plotly | pls | plugin | po | podcast | podlasie | podróże | pogoda | politics | polityka | polsat | portugalia | postęp | powerpoint | połtawa | prelink | problem | propaganda | pseudointeligencja | pstoedit | putin | python | pywws | r | r1984 | radio | random | raspberry | raspberry pi | raspberrypi | raspbian | refugees | relaxng | ridley | router | rower | rowery | roztocze | rpi | rsync | rtf | ruby | rugby | rumunia | russia | rwc | rwc2007 | rwc2011 | rwc2019 | ryga | rzym | salerno | samba | sds011 | selenium | sem | senah | sernik | sheevaplug | sienkiewicz | signature | sikorski | sks | skype | skytraq | smoleńsk | sqlite | srtm | sshfs | ssl | staszek wawrykiewicz | statistcs | statistics | stats | statystyka | stix | stretch | supraśl | suwałki | svg | svn | swanetia | swornegacie | szwajcaria | słowacja | tallin | tbilisi | terrorism | tesseract | tex | texgyre | texlive | thunderbird | tomato | totalnaopozycja | tourism | tramp | trang | transylwania | truetype | trzaskowski | ttf | turcja | turkey | turystyka | tusk | tv | tv5monde | tweepy | twitter | tykocin | typetools | ubuntu | uchodźcy | udev | ue | ukraina | umap | unix | upc | updmap | ups | utf8 | uzbekistan | varia | video | vienna | virb edit | virbedit | vostro | wammu | wdc | wdfs | weather | weathercloud | webcam | webdav | webscrapping | weewx | wenecja | wh2080 | wiedeń | wikicommons | wilno | win10 | windows | windows8 | wine | wioślarstwo | wojna | word | wordpress | wrt54gl | ws1080 | wtyczka | wunderground | ww2 | www | wybory | wybory2015 | włochy | węgry | xemex | xetex | xft | xhtml | xine | xml | xmllint | xsd | xslt | xvidtune | youtube | yum | zaatar | zakopane | zakupy | zawodzie | zdf | zdrowie | zeropi | zgarden | zgony | zprojekt | łeba | łotwa | świdnica | żywność
Archiwum
06/2023 | 02/2023 | 01/2023 | 11/2022 | 10/2022 | 09/2022 | 07/2022 | 06/2022 | 04/2022 | 03/2022 | 02/2022 | 12/2021 | 09/2021 | 03/2021 | 01/2021 | 12/2020 | 11/2020 | 10/2020 | 09/2020 | 08/2020 | 07/2020 | 04/2020 | 03/2020 | 02/2020 | 01/2020 | 12/2019 | 11/2019 | 10/2019 | 09/2019 | 08/2019 | 07/2019 | 06/2019 | 04/2019 | 02/2019 | 01/2019 | 12/2018 | 11/2018 | 10/2018 | 09/2018 | 08/2018 | 07/2018 | 05/2018 | 04/2018 | 03/2018 | 02/2018 | 01/2018 | 11/2017 | 10/2017 | 09/2017 | 08/2017 | 07/2017 | 06/2017 | 05/2017 | 04/2017 | 03/2017 | 02/2017 | 01/2017 | 12/2016 | 11/2016 | 10/2016 | 09/2016 | 08/2016 | 06/2016 | 05/2016 | 04/2016 | 02/2016 | 12/2015 | 11/2015 | 09/2015 | 07/2015 | 06/2015 | 05/2015 | 02/2015 | 01/2015 | 12/2014 | 09/2014 | 07/2014 | 06/2014 | 04/2014 | 02/2014 | 01/2014 | 12/2013 | 11/2013 | 10/2013 | 09/2013 | 08/2013 | 07/2013 | 05/2013 | 04/2013 | 03/2013 | 02/2013 | 01/2013 | 12/2012 | 11/2012 | 10/2012 | 09/2012 | 08/2012 | 07/2012 | 05/2012 | 03/2012 | 02/2012 | 01/2012 | 12/2011 | 11/2011 | 10/2011 | 09/2011 | 08/2011 | 07/2011 | 06/2011 | 05/2011 | 04/2011 | 03/2011 | 02/2011 | 01/2011 | 12/2010 | 11/2010 | 10/2010 | 09/2010 | 08/2010 | 07/2010 | 06/2010 | 05/2010 | 04/2010 | 03/2010 | 02/2010 | 01/2010 | 12/2009 | 11/2009 | 10/2009 | 09/2009 | 08/2009 | 07/2009 | 06/2009 | 05/2009 | 04/2009 | 03/2009 | 02/2009 | 01/2009 | 12/2008 | 11/2008 | 10/2008 | 09/2008 | 08/2008 | 07/2008 | 06/2008 | 05/2008 | 04/2008 | 03/2008 | 02/2008 | 01/2008 | 12/2007 | 11/2007 | 10/2007 | 09/2007 | 08/2007 | 07/2007 |
O stronie
wykorzystywany jest blosxom plus następujące wtyczki: tagging, flatarchives, rss10, lastbuilddatexhtmlmime. Niektóre musiałem dopasować nieco do swoich potrzeb. Więcej o blosxom jest tutaj
Subskrypcja
RSS 1.0
Czy flickr umie liczyć -- lepsze rozwiązanie

Wymyśliłem lepsze rozwiązanie problemu opisanego tutaj. Ściągane strony są obrabiane ,,w locie'' a w pliku na dysku są zapisywane tylko informacje o liczbie odsłon. Mówiąc konkretniej korzystam z metod store/retrive modułu Storable, zapisując/czytając hasz postaci $PhotoLog{data}{photoid}= views. Generowaniem podsumowań zajmuje się inny skrypt, który wypisuje wyniki w postaci dobrze sformatowanego fragmentu dokumentu HTML (,,opakowanego'' wewnątrz elementu <div>). Ten fragment następnie można wstawić w odpowiednie miejsce strony HTML. Wreszcie ostatni skrypt tworzy wykres liniowy (przy wykorzystaniu modułu GD::Graph) liczby odsłon oraz liczby odsłoniętych zdjęć. Trzy skrypty można połączyć w całość:

#!/bin/bash
perl flick-store-views.pl
if [ "$?" -ne "0" ] ; then echo "** Problems ..." ; exit 1 ; fi
perl flick-report-views.pl -lang=pl -max=25 > 00-pl.phtml && \
perl flick-graph-views.pl
if [ "$?" -ne "0" ] ; then echo "** Problems ..." ; exit 1 ; fi
echo "OK"

Jakoś tak... Przykład wykorzystania jest na tych stronach [1] [2] [3]. Skrypty można pobrać stąd (flick-store-views.pl, flick-report-views.pl oraz flick-graph-views.pl.) Powyższe można nawet wsadzić do crona. Skrypty wykorzystują m.in. moduły GD::Graph::lines oraz Storable. Ten pierwszy musiałem doinstalować do mojej FC5. Z tym był zresztą pewien kłopot ponieważ yum nie zadziałał--nie wiem czemu. Ostatecznie sprawę rozwiązało ,,ręczne'' ściągnięcie perl-GDGraph-1.4307-1.fc5.noarch.rpm, perl-GDTextUtil-0.86-7.fc5.noarch.rpmperl-GD-2.35-1.fc5.i386.rpm ze strony rpm.pbone.net.

Przy okazji dowiedziałem się jak ,,porządnie'' wycentrować tabelę w oknie przeglądarki:

<table style='margin-left: auto; margin-right: auto;' ...
url | Tue, 27/11/2007 16:41 | tagi: , , , ,
Czy flickr umie liczyć -- rozwiązanie

Łączną liczbę odsłon dla wszystkich zdjęć -- por. poprzedni wpis na ten temat -- można ustalić programistycznie ściągając wszystkie strony albumu (mają one URLe kończące się na pageliczba, tj. page1, page2, page3, itp.). Pod miniaturą każdej fotografii jest odpowiednia informacja. Zwykłe LWP::Simple w zupełności by do tego wystarczył:

use LWP::Simple;
my $max_page = $ARGV[0] || 1; # nie podano ile -- ściągnij pierwszą
$urlbase = "http://www.flickr.com/photos/tprzechlewski/page";

for ($p=1; $p =< $max_page; $p++ ) {
   $content = get($urlbase . $p );
   die "Couldn't get it!" unless defined $content;
   print $content;  }

Niech powyższy kod zapisano w ftotal.pl. Teraz można by np. ściągnąć wszystkie strony podając ftotal.pl 161 > ftotal.log a następnie wyłuskać odpowiednie informacje z pliku ftotal.log innym skryptem.

Ale... Ale jest jeden problem. Flickr słusznie nie liczy odsłon (zalogowanego) właściciela albumu. Skrypt nie autoryzuje dostępu i działa jako ,,osoba trzecia'' więc jednocześnie sztucznie nabija statystykę. Jeżeli skrypt byłby uruchamiany cyklicznie zmieniłby znacząco statystykę odsłon głównych stron w albumie. Przykładowo w moim przypadku byłoby to dodanie 161 odsłon, bo tyle liczy -- obecnie -- stron głównych mój album. Można by machnąć ręką, ale z drugiej strony jakby udało się skrypt zalogować...

Logowanie do www.flickr.com jest jednak cokolwiek skomplikowane. Kombinowałem na różne sposoby szukając w google albo gotowców albo podpowiedzi. Pierwszym ,,podejrzanym'' był moduł WWW::Mechanize:

#!/usr/bin/perl
use WWW::Mechanize;

my $mech = WWW::Mechanize->new( autocheck => 1 );

$mech->credentials( 'login' => 'password' );
$mech->get( 'http://www.flickr.com/photos/tprzechlewski/page1/' );
print $mech->content();

Nie działa... Próbowałem, też WWW::Mechanize::Shell, opisany przykładowo w tekście Michaela Schilli Simple Data Scraper (tutaj jest polskie tłumaczenie). BTW były pewne kłopoty z jego zainstalowaniem, ponieważ make test kończy się błędem... Szukając wskazówek do rozwiązania mojego problemu znalazłem także potencjalnie przydatny tekst pt. Secure Web site access with Perl. Podsumowując WWW::Mechanize okazał się strzałem w płot, ale może się przyda do czegoś innego...

Rozwiązanie znalazłem -- jak to często bywa -- trochę przypadkowo. Punktem wyjścia były skrypty ze strony: coder.home.cosmic-cow.net (ich kopie umieściłem tutaj). Następnie posługując się wtyczką do Firefoxa pn. Live HTTP headers ustaliłem co i gdzie trzeba zmienić. Skrypt wykorzystuje moduły HTTP::Request::CommonLWP::UserAgent, koncepcyjnie jest mało skomplikowany ale dość rozwlekły bo liczy ca 100 wierszy. Nie będę go więc cytował, jest dostępny tutaj. Nie do końca jestem też pewny czy wszystkie wywołania GET są potrzebne, ale nie mam czasu/wiedzy tego optymalizować, ważne że działa, tj. udaje zalogowanego użytkownika serwisu flickr.

Skrypt działa w ten sposób, że ściąga n stron ,,głównych'' z mojego konta flickr (te URLe przypominam kończą się na pageliczba). Liczbę n, podaną jako parametr wywołania skryptu, ustalam ,,empirycznie'' konsultując się z flickr.com (ewentualnie w wersji gold-extended skryptu można by to zautomatyzować):

perl flick-total-views.pl 161 > flick-total-views.log &&  \
  perl -h flick-aggr-totals.pl flick-total-views.log > stats.html

Skrypt flick-aggr-totals.pl zlicza co trzeba parsując flick-total-views.log. Na razie pomija pliki, które nie były wcale oglądane (tj. 0 views), ale to łatwo poprawić/zmienić, bo kod HTML generowany przez www.flickr/ nie jest specjalnie zaplątany. Wynik pierwszego zastosowanie ww. skryptów zamieściłem na mojej stronie.

url | Sun, 18/11/2007 11:47 | tagi: , , , ,
Czy flickr umie liczyć?

Flickr wyświetla liczbę że tak powiem odsłon pod każdym zdjęciem, zbiorczo dla każdego zbioru oraz łącznie dla całego albumu (zakreślone na czerwono na rysunkach poniżej). Wydawać by się mogło, że np. sumując odsłony dla wszystkich zdjęć otrzyma się łączną liczbę odsłon w albumie, to znaczy ile razy oglądano nasze zdjęcia. Już na pierwszy rzut oka widać, że tak nie jest. Po prostu nic nie jest sumowane a każdy licznik ,,liczy'' swoją stronę. Odzielnie jest sumowana ,,strona główna'', oddzielnie każda strona dla pojedynczego zdjęcia i oddzielnie strona główna każdego zbioru.

[[screen dump]] [[screen dump]] [[screen dump]]

A jak obliczyć łączną liczbę odsłon dla wszystkich zdjęć? Wydawałoby się, że to pryszcz, bo flickr słynny jest ze swojego API. Akurat tego jednak nie da się ustalić -- nie ma takiej metody. Wprawdzie flickr.activity.userPhotos. zwraca m.in. liczbę wyświetleń każdej pojedynczej strony, ale tylko dla stron na których coś się stało: dodano komentarz, ktoś dodał taga albo dodał zdjęcie do swoich ulubionych. Do tego maksymalnie można ściągnąć 50 zdjęć na raz (maksymalna wartość per_page), parametr timeframe może przyjąć maksymalnie wartość jednego miesiąca (30d, większe wartości są ignorowane) a metodę można uruchomić powtórnie nie częściej niż co godzinę (czyli co godzinę można ściągnąć jedną stronę). Poddałem się...

Nie ustaliłem wprawdzie ile było odsłon zdjęć w moim albumie ale eksperymentując z API flickera odkryłem przynajmniej jak można obejść się bez perlowego pakietu Flickr-API (ale nie bez Perla). Otóż wystarczą moduły LWP::Simple oraz Digest::MD5:

Niektóre metody nie wymagają uwierzytelnienia. Ich wywołanie jest szczególnie proste -- nie jest potrzebny nawet moduł Digest::MD5 -- i sprowadza się do konstruowania adresów URL według następującego schematu (znak \ na końcu oznacza kontynuację wiersza):

http://www.flickr.com/services/rest/?method=metoda&parametr1=wartość1\
  &parametr2=wartość2...

W metodach, które uwierzytelnienia wymagają sprawa się komplikuje. Trzeba podać api_key, auth_token oraz secret (poniżej nazwany shared_secret) opisane tutaj i/lub w dokumentacji modułu Flickr-Upload. Najpierw należy zbudować napis według schematu:

secretapi_keyapi_keyauth_tokenauth_tokenmethodmethodarg1wart1arg2wart2 ... 

Następnie utworzyć jego skrót za pomocą funkcji MD5. W przypadku Perla może to wyglądać jak na poniższym przykładzie (metoda flickr.activity.userPhotos ma argumenty page, per_page oraz timeframe). Obliczony skrót dodajemy jako ostatnią część adresu URL:

Digest::MD5 qw(md5_hex);
my $method = 'flickr.activity.userPhotos';

 ## ...
 ## skrót MD5:
my $api_sig = md5_hex( "${shared_secret}api_key${api_key}auth_token${auth_token}method${method}" .
   "page${page}" . "per_page${per_page}" . "timeframe${timeframe}" ) ;

my $url = "http://www.flickr.com/services/rest/?method=$method" .  
   "&api_key=$api_key" . "&auth_token=$auth_token" . 
   "&page=$page" . "&per_page=$per_page" .
   "&timeframe=$timeframe" . "&api_sig=$api_sig" ; ## wstaw skrót tutaj

print $url;

Przy okazji -- jak to często bywa -- znalazłem ciekawą stronę dotyczącą języka Perl. Jest też na ww. stronie opis pakietu Flickr-Upload, z którego też korzystam. Norman Walsh zaimplementował nawet API flickra w XSLT -- ciekawe ale przydatność taka sobie.

url | Wed, 14/11/2007 08:28 | tagi: , , , ,
Jerzy Ustupski
J. Ustupski's grave

Ten wpis to remanent z tegorocznych wakacji, w czasie których byłem m.in. w Zakopanem. Poszliśmy na słynny cmentarz na Pęksowym Brzysku. Elka wypatrzyła (szkolona:-) grób Jerzego Ustupskiego (,,Patrz a tu jakiś wioślarz...''). Ustupski to medalista olimpijski w deblu czyli dwójce podwójnej z Rogerem Vereyem. Obaj panowie to legendy polskiego sportu. Ciekawy tekst na ten temat znalazłem tutaj. Wyniki z Berlina są zaś tutaj (Men's Double Sculls, BTW walki na finiszu to raczej nie było). Verey napisał książkę pn. 40,000 kilometrów na skifie -- znalazłem ją parę miesięcy temu na Allegro ale już była sprzedana.

Aha, czemu o tym piszę. Bo sam kiedyś, dawno temu--jeszcze karbonowych wioseł nie było--uprawiałem wioślarstwo w AZS-AWF Gdańsk. Bez większych sukcesów, ale sentyment pozostał.

Więcej zdjęć z Pęksowego Brzyska jest tutaj.

url | Tue, 13/11/2007 09:15 | tagi: , , , ,
Konfigurowanie Emacsa

Domyślne ustawienia w moim Emacsie zmieniają właściciela pliku podczas zapisu (konkretnie grupę). Przykładowo Elka edytuje plik, który należy do grupy family, a jak go zapisze, to plik już nie należy do family tylko do grupy elka. W dokumentacji Emacsa nie mogłem odszukać co trzeba ustawić, ale znalazłem tutaj:

(setq backup-by-copying-when-mismatch t)

Przy okazji pisania o ustawianiu Emacsa wspomnę także o tym jak nakazać tworzenie kopii w katalogu ~/.emacs-backups/, co zapobiega zaśmiecaniu dysku plikami ,,z tyldą'':

;; polecam szczególnie użytkownikom pakietu tramp
(defun make-backup-file-name (file)
  (concat "~/.emacs-backups/" 
    (file-name-nondirectory file) "~")) 

Powyższe nastawy należy oczywiście umieścić w pliku ~/.emacs.

url | Tue, 13/11/2007 08:42 | tagi: , ,
Przeliczanie ceny z USD/EUR na PLN
[screen dump]

Kiedyś to się mnożyło cenę w USD razy trzy a rezultatem był ekwiwalent w PLN. Ostatnio jednak kurs dolara tak szybko spada, że pomyślałem o jakimś bardziej precyzyjnym narzędziu. Gdyby tak na przykład Firefox wyświetlał co trzeba przeliczone na PLN..., jakiś plugin (currency converter?). Najpierw spróbowałem wtyczkę Change ale nie podobał mi się sposób w jakim ona działa--być może niesłusznie. Za duże zadęcie jak dla mnie: oddzielna belka w menu (podobno można ukryć bez straty dla wygody obsługi) i ciągle musiałem wybierać że chcę konwertować na PLN. Usunąłem Change i zainstalowałem z kolei Yahoo! Finance Currency Converter (wymaga uprzedniego zainstalowania Greasemonkey.

Z tego co zauważyłem do tej pory skrypt powoduje problemy na stronach onet.pl. Nie jest to jednak poważna usterka. Po pierwsze rzadko oglądam strony na onet.pl, a po drugie bardzo łatwo wyłączyć Greasemonkey klikając na ikonę umieszoną na dole okna FireFoxa.

url | Sun, 11/11/2007 10:44 | tagi: , , ,
Usunięcie zdjęcia ze zbioru (na flickr.com)

Dodać jest łatwo, ale jak usunąć? Nie jest to oczywiste. Ale doszedłem jak to zrobić: uruchomić tzw. organizera (czyli kliknąć w organize). Teraz kliknąć w  Set&Collections. Wybrać -- dwuklikiem -- odpowiedni zbiór (Set). Jak się załadują miniaturki zdjęć przeciągnąć niechciane poza ramkę zawierającą miniaturki jednocześnie wciskając klawisz r. Powinno działać. U mnie przynajmniej działało z FF (wersja 2.0.0.4).

url | Mon, 05/11/2007 16:06 | tagi: ,
Losowy podpis w programie pine

Jak wstawić losowy cytat via program fortune opisano na tej stronie. Jeżeli podpis ma być generowany a nie wklejany z pliku, to w konfiguracji Pine (setup -> config) literal-signature ma mieć wartość No Value Set a w signature-file należy wstawić (na końcu obowiązkowo znak ,,|''):

ścieżka-do-skryptu/skrypt |

No i dobrze. A ja chciałem w swojej sygnaturze losowy URL do mojego zbioru zdjęć na www.flickr.com/. Do tego zaadaptowałem następujący skrypcik, który ściąga informacje na temat n (konkretnie $max_photos) ostatnio umieszczonych na koncie flickr zdjęć i z tej n-ki losowo drukuje jedno:

#!/usr/bin/perl -s 
# The program prints URL of random image out of $max_photos photos ...
use LWP::Simple; 

my $my_flickr_id='20425995@N00'; # insert your ID
my $my_flickr_dir='http://www.flickr.com/photos/tprzechlewski';
my $max_photos = '20'; 
my $api_key = '????????????????'; # insert your API key here
my $method = 'flickr.people.getPublicPhotos'; 

my $url = "http://www.flickr.com/services/rest/?method=$method&" . 
    "api_key=$api_key&user_id=$my_flickr_id&per_page=$max_photos"; 

my $xml = get $url; 

if ($xml =~ m/rsp stat=[ \t]*[\`\"]ok/) {# no errors so print
   while ($xml =~ m/id=[ \t]*[\`\"]([^\"\']+)[\`\"]/g) { push @Photos, $1; } 
} else { die "** Problems fetching $max_photos of $my_flickr_id **"; }

print "$my_flickr_dir/" . $Photos[ int(rand($max_photos)) . "\n";

Skrypcik jest specjalnie odchudzony, tak że korzysta wyłącznie z LWP::Simple i dzięki temu ma większe szanse działania w sytuacjach kiedy dociągnięcie tego czy tamtego modułu jest kłopotliwe. Z tego samego powodu do wyłuskania odpowiednich informacji nie parsuję pliku XML (posługując się np. XML::Simple), a używam wyrażeń regularnych (regułowych?).

url | Mon, 05/11/2007 12:40 | tagi: , , , , ,
Próbowanie fontów STIX

Fonty STIX, o których wspomniałem jakiś czas temu są dostępne w beta wersji ze strony www.stixfonts.org/. Oglądając je w programie fontforge nie zauważyłem jakiś oczywistych uchybień. Jedyne co wydaje się na moje niefachowe oko podejrzane, to kropka nad ,,z'' w znaku zdotaccent. Jest ona wprawdzie tej samej wielkości jak kropka w znakach ,,i'' oraz ,,j'' (w wielu fontach jest mniejsza, co jest oczywistym błędem) ale jest umieszczona niżej.

Przy okazji oglądania fontów STIX przypomiałem sobie, jak zainstalować w systemie TeX font OTF/TTF. Pliki tfm wygenerowałem korzystając z programu otftotfm z pakietu typetools.

otftotfm -a -e qx.enc STIXGeneral.otf STIXGeneral--qx

Uwaga: uprzednio skopiowałem do bieżącego katalogu plik qx.enc. W TeXlive 2005, którego używam, wszystkie mapy fontowe, fonty .tfm, .vf, itp., zostaną przez program otftotfm wygenerowane i zainstalowane w ~./texlive2005/. Jeżeli nie poda się opcji -a, to pliki zostaną wygenerowane w katalogu bieżącym (STIXGeneral.pfb, STIXGeneral--qx.vf, STIXGeneral--qx.tfm oraz STIXGeneral--qx--base.tfm), a na ekranie pojawił się m.in. wiersz:

STIXGeneral--qx--base STIXGeneral
"AutoEnc_fsfrb4jn74upot7m4ihm5xftge \ ReEncodeFont" &[a_fsfrb4.enc
&STIXGeneral.pfb

Do stworzenia pliku .fd niezbędnego dla LaTeXa przygotowałem prosty skrypt. (Do tego zadania można też skorzystać z otfinst.) Wywołanie skryptu fd_gen.pl jest następujące:

perl fd_gen.pl -encoding qx -family STIX -regular STIXGeneral \
  -italic STIXGeneralItalic -bold STIXGeneralBol \
  -boldit STIXGeneralBolIta > qxstix.fd

Uwaga na nazwy pliku .fd. Powinny się składać wyłącznie z małych liter. Po wykonaniu powyższego pliku powinien zawierać:

% Plik qxstix.fd wygenerowany
\DeclareFontFamily{QX}{STIX}{}
\DeclareFontShape{QX}{STIX}{m}{n}{ &-> STIXGeneral--qx }{}
\DeclareFontShape{QX}{STIX}{m}{it}{ &-> STIXGeneralItalic--qx }{}
\DeclareFontShape{QX}{STIX}{b}{n}{ &-> STIXGeneralBol--qx }{}
\DeclareFontShape{QX}{STIX}{b}{it}{ &-> STIXGeneralBolIta--qx }{}
\DeclareFontShape{QX}{STIX}{bx}{n}{ &-> ssub * STIX/b/n }{}
\DeclareFontShape{QX}{STIX}{bx}{it}{&-> ssub * STIX/b/it }{}

Plik testowy test.tex zawiera zaś:

%&-translate-file=il2-pl
\documentclass{article}
\usepackage[QX]{fontenc}
\renewcommand{\rmdefault}{STIX}
\renewcommand{\familydefault}{\rmdefault}
\fontfamily{\familydefault}
\begin{document}

To jest \textbf{żółw \textit{pod źdźbłem}} śnięty

To jest żółw \textit{pod źdźbłem} śnięty
\end{document}

teraz:

pdftex test 

Dokument powinien być złożony fontami STIX

A przy okazji Liberation fonts udostępniony przez RedHata, o którym się dowiedziałem niedawno to zupełny scrap niewart zainteresowania. Brak jest hintów a polskie ogonki dodane bez usunięcia zachodzących na siebie fragmentów obwiedni.

url | Fri, 02/11/2007 16:20 | tagi: , , , , ,