Archiwalia w kategorii 'software'

PLD Th: fixing a vserver

Niniejszy post jest oparty o historię z pola bitwy. Bardzo techniczny i nieszczególnie ciekawy, jeśli ktoś nie używa wymienionych technologii. Być może komuś się przyda.

Awaria

Poszukiwanie przyczyn pozwoliło nam ustalić następujące fakty:

  • W jednej z maszyn wirtualnych ktoś zainstalował pakiety rpm i poldek, a następnie użył ich do instalacji oprogramowania;
  • Maszyna miała cały czas zamontowaną zewnętrzną bazę rpm (prawdopodobnie utils-vserver zdechło i pozostawiło po sobie bałagan, ale o tym później);
  • Wewnętrzny rpm miał inną wersję i w jakiś sposób uszkodził bazę zainstalowanych pakietów;
  • Następujący po nim rpm --rebuilddb bezpowrotnie wyczyścił bazę pakietów maszyny;
  • W międzyczasie miał miejsce upgrade pakietów rpm i poldek w zewnętrznym systemie;

Postanowiliśmy zatem przeinstalować maszynę od nowa, rekonstruując na podstawie działających usług listę niezbędnych pakietów.

Nosem w dół

Dość szybko okazało się, że nie będzie tak łatwo:

ncontext: vc_net_create(): Invalid argument

Tak właśnie kończyło się każde wywołanie narzędzi vrpm i vpoldek. Winnym okazało się wywołanie chbind, a poprawka wygląda tak:

--- /usr/lib/util-vserver/functions~    2007-09-05 16:09:16.967334575 +0200
+++ /usr/lib/util-vserver/functions     2007-09-05 16:10:29.456275993 +0200
@@ -1171,5 +1171,5 @@
     export RPM_FAKE_CHROOT RPM_FAKE_CTX RPM_FAKE_CAP RPM_FAKE_FLAGS

     LD_PRELOAD=$_RPM_FAKE_SO${LD_PRELOAD:+:$LD_PRELOAD} \
-       exec $_CHBIND "${CHBIND_OPTS[@]}" "$@"
+       exec $_CHBIND --nid $RPM_FAKE_CTX "${CHBIND_OPTS[@]}" "$@"
 }

Dość szybko okazało się, że radość jest przedwczesna. O ile vrpm i vpoldek zaczęły działać, to żadne z nich nie potrafiło nic zmienić. Odpytywanie bazy nie przysparzało żadnych trudności, próba instalacji lub usunięcia pakietu kończyły się kolejnym radosnym komunikatem:

error: cannot open Basenames index using db3 - No such file or directory (2)

Winny

Okazało się, że winny jest rpm-4.4.9 w połączeniu z db4.6. Nie miałem okazji sprawdzić, co dokładnie powoduje nieprawidłowe działanie, dość było upewnić się, że działa wersja rpm-4.4.9-1, zbudowana z pakietem db4.5-devel.

Problemem jest fakt, że db4.6 automatycznie konwertuje każdą otwartą bazę do swojego formatu, co oznacza, że po wykonaniu downgrade pakietu rpm zostaniemy z bezużytecznym narzędziem.

Rozwiązanie

Jeff, autor rpm pomógł mi cofnąć upgrade:

  1. Instalujemy pakiet db4.6-utils, kopiujemy z niego program db_dump;
  2. Odinstalowujemy db4.6-utils, zachowując sam db4.6;
  3. Instalujemy pakiet db4.5-utils;
  4. Cofamy wersję rpm i instalujemy pakiet poldek zbudowany dla tej wersji rpm;
  5. Wykonujemy:
    cd /var/lib/rpm
    rm __db*
    mv Packages{,.old}
    db_dump_4.6 Packages.old > Packages.dump
    db_load Packages < Packages.dump
    rpm --rebuilddb
  6. Powyższą czynność powtarzamy dla wszystkich katalogów /vservers/.pkg/*/rpm/state, które zdążyły się zaktualizować do nowej wersji, odpowiednio modyfikując pierwszą linię i do ostatniej dopisując --dbpath <sciezka_do_katalogu_state>

Kolejny problem

Ostatnim krokiem było przekonanie narzędzia vpoldek, że instalowane pakiety są dla właściwej architektury. Tutaj rozwiązaniem było dopisanie do każdego pliku /vservers/.pkg/*/rpm/etc/macros linijki:

%_host_os %_os

Voila, wszystko działa, maszyna została przebudowana. Następnym razem postaram się pozbyć irytujących komunikatów LD_PRELOAD.

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ż.

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.

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.

List do Polskiego Komitetu Normalizacyjnego

Pewnie widzieliście już newsa na stronie 7thGuard? Członkowie Komitetu zdają się sugerować, że ich decyzja zależy od opinii uzyskanych od firm, zamiast od sensowności zgłoszonego projektu.

Jeśli ktoś ma problem z napisaniem listu (osoby prywatne raczej niewiele zdziałają, interesują się głównie opinią podmiotów), to poniżej można znaleźć moje wypociny.

Do wiadomości Polskiego Komitetu Normalizacyjnego, a w szczególności komitetów KT 171 ds. Sieci Komputerowych i Oprogramowania i KT 182 ds. Ochrony Informacji w Systemach Teleinformatycznych.

Szanowni Państwo,

W imieniu firmy ITS Ltd. [1], pragnę wyrazić nadzieję, że Komitet nie przychyli się do propozycji standaryzacji formatu OOXML.

Format ten jest formatem konkurencyjnym do już istniejącej i publicznie akceptowanej rodziny formatów Open Document [2] konsorcjum OASIS. W przeciwieństwie do Open Document (ODF, w zeszłym roku przyjętego jako standard ISO 26300), OOXML nie jest wspólnym wysiłkiem środowisk informatycznych, mającym na celu ujednolicenie wymiany dokumentów. Jest to próba umocnienia swojej pozycji na rynku przez monopolistę. Można to bardzo łatwo zauważyć, przyglądając się specyfikacji formatu, który sprawia wrażenie przygotowanego niedbale i w pośpiechu [3].

Dodatkowo, przyjęcie tego formatu jako kolejnego standardu dla wymiany dokumentów biurowych nie daje żadnej korzyści w stosunku do istniejącego formatu ODF. Próba jego standaryzacji jest próbą zepchnięcia kosztów na resztę uczestników rynku oprogramowania. Jeśli standard ten zostanie przyjęty, firma Microsoft oszczędzi sobie konieczności pełnego dostosowania oferowanych produktów do formatu ODF, konkurencja ich zaś będzie zmuszona poświęcić swój czas i pieniądze na zaimplementowanie kolejnego formatu tylko po to, by mieć szansę utrzymania się na rynku.

Jest to sytuacja dalece niepożądana i sprzeczna z zasadami uczciwej konkurencji, a przyjęcie formatu OOXML jako standardu zaszkodzi tak rynkowi, jak końcowym użytkownikom aplikacji biurowych – poprzez wzrost kosztów producentów aplikacji, wielość niezgodnych formatów i zagrożenia patentowe [4].

Również z pozycji naszej – jako firmy zajmującej się budowaniem aplikacji internetowych – standaryzacja ta oznaczałaby konieczność poświęcenia dodatkowego czasu na wprowadzenie i przetestowanie obsługi dodatkowych formatów. Czasu, który wolelibyśmy poświęcić skupiając się na faktycznych potrzebach naszych klientów.

Liczymy na to, że Komisja dołoży wszelkich starań, aby uchwalane standardy leżały w interesie publicznym, a nie wyłącznie monopolistów.

[1] Internet Trading Solution Limited Sp. z o.o. oddział w Polsce, pl. Wolności 11, 50-071 Wrocław
[2] http://www.oasis-open.org/committees/office/
[3] NoOOXML.org, dział “Issues,” http://www.noooxml.org/
[4] http://www.noooxml.org/patents

Z wyrazami szacunku,

Patryk Zawadzki <patrys@pld-linux.org>
programista, pasjonat informatyki, deweloper PLD Linux Distribution

Zawiodła mnie tylko reakcja człowieka, którego bardzo szanuję:

W zasadzie, to mam to w dupie. Już dawno przestały mnie interesować formaty, standardy, janosik, płatnik i wszystko co ma wspólnego z OO w rządzie, szkołach, z wolnymi podręcznikami i całym tym gównem. Sranie w banie, podniecają się fanatycy. Dla mnie to taka mała utopia, krąg ludzi liżących się po fiutach, ze Stallmanem w środku.

Hardware4Linux

Jest sobie taki skromny projekt, którego jedynym zadaniem jest zbieranie informacji o twoich komputerach. Hardware4Linux, bo o nim mowa, to centralna baza informacji o kompatybilności przeróżnego sprzętu z Linuksem.

W tej chwili jest jeszcze na etapie gromadzenia informacji, ale można sobie wyobrazić, że już niedługo może stać się nieocenionym źródłem informacji dla takich projektów, jak HAL, czy poszczególne dystrybucje.

Jeśli używasz Linuksa i masz chwilę czasu, to zachęcam do zbudowania sobie pakietu hwreport i wysłania wyników jego działania na stronę, gdzie następnie można dodatkowo ocenić i skomentować najważniejsze (i potencjalnie sprawiające najwięcej kłopotów) składniki maszyny.

Cała procedura wygląda tak:

  1. Budujemy (lub pobieramy) pakiet hwreport
  2. Z prawami roota wykonujemy hwreport /tmp/report
  3. Zakładamy konto w serwisie
  4. Uploadujemy plik /tmp/report.tar.bz2
  5. Oceniamy wybrane składniki
  6. Cieszymy się z dobrego uczynku i liczymy na sławę, kobiety lub wygraną w totka

Nadchodzi dobre

Z niecierpliwością czekam na kilka wydań:

Ekiga

Ekiga

Nowa wersja — oprócz sensownego interfejsu użytkownika — będzie oferować wsparcie dla większości dostępnych protokołów. W tym zawiera się obsługa protokołu dostępności. Niestety, Skype nadal pozostaje zamknięty i oferuje posiadaczom Linuksa ułamek funkcjonalności.

Banshee

Banshee

Nowa wersja jest jeszcze szybsza we współpracy z dużymi bibliotekami mediów, a interfejs sprawia, że Rhythmbox może się schować i już planować nowe wydanie.

HAL Quirks

Obrazka nie będzie, bo nie ma co pokazywać. Interesuje mnie przede wszystkim projekt naprawienia klawiszy multimedialnych pod Linuksem. Komplet sterowników dla laptopów poszczególnych producentów i pakiet hal-info wystarczą, by wszystkie przyciski na klawiaturach były w końcu dostępne z poziomu GNOME i KDE. Właśnie pracujemy nad Asusami.

Jeszcze raz o wykrywaniu przeglądarek

Bullsh*t  in buzzword

Pisanie aplikacji webowych ma to do siebie, że czasem różne przeglądarki reagują na nie w nieco nieoczekiwany sposób. Problem może wynikać z błędnej implementacji CSS, z różnic w dostępnych funkcjach JavaScriptu, czasem przyczyną może być też populacja poszczególnych gatunków motyli w Australii (ukłon w stronę domyślnej przeglądarki Microsoftu). Najczęściej wynika jednak z zastosowania czynnika ludzkiego w procesie budowy owych aplikacji i usunięcie usterki sprowadza się do zrobienia czegoś TheRightWay™.

Jeśli boisz się, że twoja aplikacja nie zadziała na niczym poza dwoma testowanymi komputerami, to masz poważny problem. Albo cierpisz na paranoję, albo faktycznie aplikacja nie nadaje się do publikacji nawet w fazie alfa. Jeśli jednak uważasz, że wykrywanie przeglądarek innych niż testowane jest remedium na twoje bolączki, to masz już dwa problemy.

Po pierwsze, nigdy nie przetestujesz aplikacji w każdej konfiguracji przeglądarka + system operacyjny. Nawet gdyby się okazało, że wszędzie działa bez problemu, jeżeli nie pozwolisz ludziom tego sprawdzić, to wątpliwości pozostaną do końca życia. Ludzie, którzy w towarzystwie cieszą się największym autorytetem komputerowego guru i — tym samym — mają największą szansę zareklamować twój produkt wirusowo, często używają mniej popularnego oprogramowania. Ograniczając się do najpopularniejszej trójki, odcinasz się od nich na zawsze.

Po drugie, wyrzucanie gości, jeszcze zanim przekroczyli próg, to bardzo niegrzeczna metoda na powiedzenie komuś mamy was tam, gdzie słoneczko nie świeci. Jeśli aplikacja może rozpadać się na tyle, że nie da się jej używać, to wystarczy grzeczne ostrzeżenie, że za tabliczką spacery odbywamy na własną odpowiedzialność. Dużo więcej zyskasz, jeśli użytkownicy będą mieli szanse zgłosić konkretne usterki. Pomyśl, ile czasu twoi pracownicy muszą spędzić na szukaniu usterek przy dodawaniu obsługi kolejnej przeglądarki. Teraz pomnóż to przez liczbę zaangażowanych testerów i podziel przez liczbę użytkowników aplikacji. Trochę mniej, prawda? Użytkownicy pracują dla ciebie za darmo.

Jeśli jesteś pewien, że twoja aplikacja nie działa poprawnie z konkretną przeglądarką, to masz dwa wyjścia:

  1. Napraw aplikację. Z biznesowego punktu widzenia to jedyna sensowna odpowiedź na powyższy problem.
  2. Jeśli powyższe nie ma sensu, to wykrywaj przeglądarkę, w której aplikacja nie ma szans zadziałać, a nie te, w których testy przeszły pomyślnie.

Do upartych, jak autorzy pokazanego we wstępie buzzworda, apeluję, by przynajmniej wykrywanie zaimplementowali prawidłowo. Gecko to Gecko, czy będę używał Firefoksa, Flocka, Słitaśnej Przeglądarki Patrysa i niezależnie od systemu operacyjnego.

Poliż węża

Jakbym bardzo nie szanował Pythona jako języka, tak nie sposób mi przejść obojętnie wobec tworu zwanego Polish Python Coders Group. Jak wyraźnie demonstruje serwis grupy, zrzeszać będzie ona amatorów-entuzjastów języka PHP.

W prawej kolumnie widzimy Django, obok reklamę Python od podstaw. Widać szacowne grono redaktorów i autorów serwisu w linki kliknąć jeszcze okazji nie miało, bo cały serwis właśnie na wspomnianym PHP stoi (pozwolę sobie nie brać pod uwagę możliwości, że komuś chciałoby się dopisywać ścieżki typu index2.php do urls.py).

Z lektur polecę jeszcze podstawy HTML, bo warstwa struktury aż prosi się o przepisanie (może tym razem bez wstawiania nagłówków w postaci plików graficznych).

Podsumowując, fani Pythona, łączmy się… w bólu.