Shared memory in nginx
July 12th, 2008
Jest git
September 30th, 2007
Słowo ciałem się stało – w końcu ruszyłem zwłoki i uruchomiłem gitweba. A oto on w całej swojej vanilla okazałości: git.localdomain.pl. Aktualnie można sobie tylko poprzeglądać, "może kiedyś" wystawię też git-daemona do wygodnego klonowania.
Dostępne w tym momencie projekty, to nginx (z paroma poprawkami), fcgiwrap, przedstawiony przeze mnie w inauguracyjnym poście i supervise, czyli dość toporne narzędzie do pilnowania jakiegoś procesu (startuje, jak proces umrze to pisze na stderr i uruchamia drugiego itd., bez żadnych wynalazków).
Bierzcie i jedzcie z tego wszyscy. Gdyby się ktoś pytał, to m.in. dzięki tym trzem programom macie właśnie niewypodziedzianą przyjemność czytać tego posta :)
PDF jego mać
August 11th, 2007
W dzisiejszym odcinku na tapetę bierzemy PDF. A konkretnie PDF + Perl. Przeglądając CPANa w poszukiwaniu modułów do generowania PDF można się posikać ze szczęścia... ale do momentu, aż spróbujesz któregoś użyć. Wszystkie (poza jednym chlubnym wyjątkiem) mają podstawową wadę, której na imię WinAnsiEncoding. Po prostu nie ma bata zobaczyć w wygenerowanych przez nie PDFach innego polskiego ogonka niż tradycyjne "ó".
Zdążyłem się już przekopać przez odpowiednie fragmenty specyfikacji PDF, wyedytować kilka PDFek gołym vimem (hardcore, ale da się to zrobić) itd. Efektem tego był patch na PDF::Reuse, który pozwalał w dość karkołomny sposób pisać w kawałku ISO-8859-2 (ASCII + pliterki). Później jednak (wstawianie tekstu przez BT Ft1 12 Tf 200 50 Td <616263F8> Tj ET, nawet opakowane jakimiś funkcjami pomocniczymi, ciężko uznać za eleganckie rozwiązanie), stwierdziłem, że uzbrojony w więcej informacji na temat PDF, niż kiedykolwiek chciałem, zrobię drugie podejście do PDF::API2.
Dlaczego drugie? Bo pierwsze skończyło się właściwie na przejrzeniu listy klas dłuższej niż niejeden manual i dość bolesnym uświadomieniu sobie, że do sporej części jedyną dokumentacją jest changelog, z którego nic nie wynika. A tu zonk. Okazało się, że podstawową bolączką PDF::API2 jest właśnie gówniana dokumentacja, a sam moduł całkiem nieźle daje radę. Taki prosty przykład:
my $pdf = PDF::API2->new;
my $page = $pdf->page;
my $gfx = $page->gfx;
my $font = $pdf->ttfont('whatever.ttf');
$gfx->textlabel(57, 306, $bodyfont, 12, 'półśkię ÓGÓŃKI');
return $pdf->stringify;
Nie tak źle, co? Jeżeli chcesz np. użyć gotowej PDFki jako szablon, wystarczy pierwsze dwie linijki zamienić na:
my $pdf = PDF::API2->open('szablon.pdf');
my $page = $pdf->openpage(1);
# czy po której tam stronie chcesz pisać
Jedna uwaga dotycząca czcionek: muszą oczywiście zawierać polskie znaczki i niestety nie mogą być w formacie .otf (OpenType), bo PDF::API2 sobie z nimi nie radzi (czy też raczej nie radzą sobie z nim później przeglądarki PDF). Do ich konwersji można użyć całkiem fajnego narzędzia fontforge (jest spakietowane w Debianie i Ubuntu), które ma niesamowicie obleśny interfejs, ale .otf -> .ttf konwertuje bez problemów.
Na dobry początek
July 29th, 2007
No to cóż. Stało się. Mam bloga :) Żeby nie było że piszę o swoim kocie, to na dobry początek taki sobie drobiazg w C -- bramka pomiędzy FastCGI a CGI.
Taki nginx na przykład nie ma obsługi CGI. Co więcej, uważa to za swój ogromny sukces :) Czasem jednak trzeba odpalić jakiś prosty skrypt, którego nie opłaca się portować na FastCGI (jak np. gitweb, który pewnie doczeka się swojej subdomeny na moim mega super hiper blogasku). No i po to jest fcgiwrap. Kompiluje się go bez żadnych cudów:
gcc -Wall -Wextra -Werror -pedantic -O2 \ fcgiwrap.c -o fcgiwrap -lfcgiNastępnie uruchamiamy delikwenta pod jakimś managerem fastcgi (od biedy np. spawn-fcgi z lighttpd) i przekazujemy mu requesty.
Uwaga: programik nie zrzuca żadnych uprawnień, więc uruchamianie go jako root jest wyjątkowo niemądre.
Po otrzymaniu requestu fcgiwrap sprawdza parę zmiennych środowiskowych (DOCUMENT_ROOT, SCRIPT_NAME), po czym miesza w nich jeszcze trochę, przy okazji ustawiając poprawną wartość SCRIPT_NAME i PATH_INFO.
Disclaimer: jak się zepsuje, możesz mi najwyżej nawrzucać w komentarzach albo wysłać patcha.