Archiwalia dla 08.2007

Licencja, panie

Strasznie mi przykro, że niektórzy to jednak czytać nie potrafią. Zrozumiem, że jedna z drugą doda mają problem z przeliterowaniem wyrazu dłuższego niż kark czy dres, ale żeby programiści nie potrafili czytać własnych licencji?

Trafiłem wczoraj na Undeadly na wątek dotyczący złamania licencji przez deweloperów Linuksa. Podniósł się wielki rumor, kamienie leciały gęsto, do flejma włączyli się przedstawiciele obu obozów, *BSD i Linuksa. Jedni jeździli po nie do końca wolnej licencji GNU, drudzy przypominali sytuację odwrotną, która nie miała miejsca tak znowu dawno temu.

Szkoda, że nikt nie skontaktował się z autorami albo chociaż nie przeczytał diffa. Widać wszyscy zapomnieli, że specjalnie na potrzeby włączenia sterownika — pierwotnie napisanego na potrzeby *BSD — do Linuksa, cały kod został udostępniony na podwójnej licencji BSD/GPLv2. A co oznacza podwójna licencja kodu? Ano to, że można sobie dowolnie wybrać jedną z licencji, która będzie nas obowiązywać. Tak, to znaczy, że w ramach licencji GPL można sobie dowolnie usuwać treść licencji BSD z nagłówków kodu. Tak, nawet jeśli licencja BSD mówi, że nie można jej usuwać, bo rzeczona licencja nie obowiązuje.

Żeby było jeszcze śmieszniej, niemal ukamienowany i żywcem spalony na stosie bezbożnik jest jednym ze współautorów kodu. Jeszcze zabawniejszy jest fakt, że nawet gdyby kod był dostępny tylko na jednej licencji, to w ramach amerykańskiego prawa każdy ze współautorów dzieła ma prawo udostępnić je na dowolnej licencji bez konsultacji z pozostałymi (jedyne ograniczenie dotyczy tego, że nie może zmienić reguł podziału zysków z tego tytułu).

Tak, czytanie to nie jest mocna strona ludzi. Nasz Trybunał Konstytucyjny kolejny raz udowodnił, że wyobraźnia również.

WYSIWTF

Pozazdrościliśmy nieco z ceziem zabawy, jaką serwuje nam codziennie Worse Than Failure (jeśli ktoś jeszcze nie czyta, to migiem dodawać do czytników). W Polsce też jest masa zabawnych sytuacji w firmach, a nie każdy chce od razu pisać do WTF, dlatego też od piątku istnieje i działa (a właściwie to się dopiero powoli rozkręca) WYSIWTF.

Zapraszamy :)

Wiem, że zaraz ktoś mnie zbluzga za to, że 10przykazan miało być nowe, a jeszcze nie jest. WYSIWTF uruchomiliśmy w jakąś godzinę, a 10p potrzebuje jeszcze około dwóch dni miłości, żeby pokazać coś więcej niż poprzednia wersja. Może uda się nam do przykazań usiąść w najbliższy weekend. Poczekajcie jeszcze trochę, warto.

Wyjątkowość PHP

Podobno PHP5 jest językiem obiektowym, niektórzy twierdzą nawet, że językiem czwartej generacji. Ja bym go nazwał językiem obiektowalnym, bo zaiste, można w nim programować obiektowo, jednak sam język ani do tego nie zachęca, ani procesu nie ułatwia. Znakomita większość funkcji bibliotecznych obiektowości zwyczajnie nie obsługuje. Ciekawsze jednak są wyjątki, które w PHP są… niemal bezużyteczne.

Autorzy języka uznali, że najważniejsza jest zgodność wstecz za wszelką cenę. Zamiast jednak przygotować moduł, który dostarczałby API zgodnego ze starszymi wydaniami i zmodernizować rdzeń funkcjonalności bibliotecznej, postanowili ciągnąć za sobą brzemię średniowiecznych początków języka. Złośliwi mówią, że wystarczy zamienić część znaków dolara na małpki i otrzymamy poprawny kod Perla, a usuwając dolary w liniach deklaracji otrzymamy zgodność ze skryptami powłoki. Trudno się dziwić, bo szerokie możliwości języka to głównie posklejane kawałki bibliotek standardowych Perla i C, pomieszane z możliwościami powłoki. Faktycznie, jeśliby dodać do siebie procentowy udział języków pomnożony przez ich generację, to PHP okazuje się stać na czele i już tylko krok dzieli go od interpretacji języka naturalnego.

Nie o tym jednak chciałem pisać. Jedną z konsekwencji zachowania zgodności jest wyjątkowość języka, przejawiające się w braku wbudowanych wyjątków. Nie mam tu na myśli klasy Exception, mówię o tym, że żadna z funkcji bibliotecznych wyjątkami nie rzuca. Zwracają magiczne wartości, ustawiają liczniki błędów, ale wyjątków unikają jak ognia. Dlaczego? Może dlatego, że przeciętny konsument API o obiektowości, wyjątkach i wzorcach projektowych ma takie samo pojęcia, jak ja o ornitologii. Dlatego właśnie uważam, że wyjątki w PHP są niemal bezużyteczne.

$f = foo();
if (foo_error())
	return false;
if (!foo_write($f, 'bar'))
	return false;
if (!foo_write($f, 'baz'))
	return false;
foo_flush($f);
if (foo_error())
	return false;
foo_close($f);
if (foo_error())
	return false;

Czy tak powinien wyglądać kod? A może tak:

$result = true;
try
{
	$f = foo();
	$f->write('bar');
	$f->write('baz');
	$f->flush();
}
catch (FooException $e)
{
	$result = false;
}
finally
{
	if ($f)
		$f->close();
}
return $result;

Żeby móc osiągnąć czytelność drugiej wersji kodu, programista musi poświęcić kilka godzin na napisanie wrapperów dla większości bibliotecznych wywołań. W przeciwnym wypadku używanie wyjątków jest bezcelowe, bo i tak na każdym kroku trzeba kontrolować zwracane wartości. Czy jest tu zaszyta jakaś głębsza logika, czy słusznie wydaje mi się, że PHP5 wygląda na zaprojektowany na kolanie?

Z wyrazami szacunku, kochające community

Kilka osób pytało mnie, w czym Django jest lepsze od CakePHP. Najprostszą odpowiedzią, jakiej potrafię udzielić, jest lepszy jest język pod spodem, ale przed chwilą emes znalazł prawdziwą perełkę. Z jakichś przyczyn jego klient zażyczył sobie wdrożenia na home.pl, gdzie Python jest, ale bezużyteczny (działa jako moduł CGI, więc nie nadaje się do niczego poza licznikiem odwiedzin na stronie Krystyny z gazowni). Padło właśnie na CakePHP.

Kilka godzin narzekania na PHP później przyszła godzina frustracji. Walidacja formularzy nie działa tak, jak powinna — pola ustawione ręcznie jako nieprawidłowe — zgodnie z dokumentacją — przy próbie zapisania ignoruje zmiany z kontrolera.

Dalsze przekopywanie Traca pokazało ticket #969. Ktoś rok temu zgłosił identyczny problem. Skutek? Ticket #991. Otwarty do dziś, dokumentacja nadal nieaktualna. Tak, wolę Django.

10przykazan - hackfest day two

Gotcha! This actually fixed the site for IE

Zmagań ciąg dalszy. Bez przerw na sen, za to z przygodami. Powyżej dziwny błąd w Internet Explorerze 6 i 7, który powoduje przesunięcie elementu z jednego kontenera do drugiego. Na zdjęciu również rozwiązanie problemu.

pict0149.jpg

Dziś o szóstej rano serwis miał zaimplementowaną większość swojej funkcjonalności. Jutro zdjęcia z ostatnich metrów maratonu.

10przykazan - hackfest day one

Old site

Od godziny 20 w piątek trwa niemal nieustannie (z wyjątkiem przerwy na sen pomiędzy ósmą a czternastą) hackfest. Razem z Jarvem staramy się — w ciągu jednego weekendu — przebudować 10przykazan od zera.

A closeup

Trzymajcie kciuki, jutro kolejny update.

Osobowość konsolowa

Właśnie trafiłem na zabawną notkę na blogu Koke. Krótki skrypt pokazuje, jakie polecenia były najczęściej używane w ostatnim czasie:

history | awk '{print $2}' | awk 'BEGIN {FS="|"} {print $1}' | sort | uniq -c | sort -rn | head -10

Po moich widać, że nie jestem fanem Emacsa:

    294 vim
    126 cvs
     71 ./builder
     64 cd
     55 rpm
     45 ../pld-builder.new/client/make-request.sh
     44 poldek
     38 svn
     31 sudo
     19 ./repackage.sh

Howto: Seahorse w PLD

Pakietu Seahorse użytkownikom GNOME przedstawiać chyba nie trzeba. Ignorantom wystarczy powiedzieć, że Seahorse służy do zarządzania poufnymi informacjami. Potrafi edytować sekrety przechowywane w GNOME Keyring, zarządzać kluczami SSH, ale przede wszystkim jest najwygodniejszym interfejsem dla GnuPG, jaki istnieje.

Problem polega na tym, że do wykorzystania pełni jego możliwości trzeba aktywować usługę seahorse-agent, która z kolei musi być uruchomiona przed resztą pulpitu. Do jej działania potrzebne są:

  • seahorse
  • gnupg-agent >= 2.0.5-2

Dalsze kroki wyglądają następująco:

  1. echo "pinentry-program seahorse-agent" > ~/.gnupg/gpg-agent.conf
  2. vim ~/.gnupg/gpg.conf i usuwamy znak komentarza na początku linii use-agent
  3. wylogowujemy się i logujemy ponownie

Od tego momentu o hasło powinien nas prosić już agent Seahorse, oferując czasowe przechowywanie odblokowanych kluczy w pamięci. Bardzo wygodne w przypadku wysyłaniu zleceń na buildery PLD.

Więcej o OOXML

Przed chwilą otrzymałem list od pana Sławomira Wrońskiego z PKN. W liście prośba do wszystkich zainteresowanych podmiotów, aby odwiedzić specjalną stronę komitetu i zabrać głos w dyskusji. W szczególności ważne dla PKN są odpowiedzi na pytania:

  1. Czy zostało stwierdzone naruszenie zasad polityki patentowej oraz własności intelektualnej przyjętych przez organizacje ISO i IEC (jeśli tak, to jakich oraz w jaki sposób)?
  2. Czy proponowana norma spełnia cele normy międzynarodowej opisane w Dyrektywach ISO/IEC tzn.:
    • Jest kompletna w sposób wystarczający, w granicach wyznaczonych jej zakresem
    • Jest zwarta, jasna i precyzyjna
    • Bierze pod uwagę aktualny stan rozwoju techniki
    • Umożliwia prace rozwojowe związane z postępem technologicznym
    • Jest zrozumiała dla wykwalifikowanego specjalisty, który nie brał udziału w jej opracowywaniu
  3. Czy proponowana norma zawiera sprzeczności z innymi istniejącymi normami ISO, które uniemożliwiają zastosowanie tych norm w jednym produkcie? (Jeśli tak, to prosimy załączyć dokładny opis takich sprzeczności).

Gmail - film zza kulis

Aż mnie dziwi, że prawie nikt o tym nie pisze. Zabawna inicjatywa pracowników Google — film o Gmailu tworzony przez internautów — od kilku dni gości na stronach serwisu pocztowego.

Kliknięcie w specjalny odnośnik, umieszczony w prawym górnym rogu interfejsu Gmaila, przenosi nas do specjalnej strony. Możemy tam przeczytać o pomyśle, znaleźć wzór koperty do wydrukowania i obejrzeć już nadesłane urywki oraz trailer przygotowany przez Google.

Zapraszam do zabawy i czekam na gotowy film, który powinien ukazać się jeszcze przed końcem wakacji — jak podaje strona, montaż zacznie się 13. sierpnia.