<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>Room 303</title>
 <link href="http://room-303.com/" rel="self"/>
 <link href="http://room-303.com"/>
 <updated>2019-06-05T19:35:53+00:00</updated>
 <id>http://room-303.com</id>
 <author>
   <name>Patryk Zawadzki</name>
   <email>patrys@room-303.com</email>
 </author>

 
 <entry>
   <title>Netia</title>
   <link href="http://room-303.com/blog/2014/10/07/netia/"/>
   <updated>2014-10-07T18:45:00+00:00</updated>
   <id>http://room-303.com/blog/2014/10/07/netia</id>
   <content type="html">&lt;p&gt;W lutym 2013 roku podpisałem byłem umowę z Netią. Jedyną możliwą, bo innych operatorów w miejscu zamieszkania brak. Jedyną możliwą, na 24 miesiące.&lt;/p&gt;

&lt;p&gt;We wrześniu 2014 roku przyszło mi przeprowadzić się w inne miejsce Wrocławia. Dwa tygodnie wcześniej powiadomiłem o tym fakcie Netię. Jedna administratorka i jedna konsultantka, na łączną liczbę osób dwie, potwierdziły, że pod nowym adresem usługi dostępne będą, jednak z ograniczeniem do 14,5 megabita z uwagi na miedziane okablowanie. Złożyłem tedy dyspozycję przeniesienia usług i dowiedziałem się, że w ciągu 21 dni skontaktuje się ze mną technik celem umówienia wizyty i przełączenia dokona.&lt;/p&gt;

&lt;p&gt;Gdyby tak jednak było, nie miałbym o czym pisać, prawda?&lt;/p&gt;

&lt;p&gt;Coś mnie tknęło i postanowiłem jednak, z czystej ciekawości, zadzwonić i zapytać o postęp prac. Było to w ostatnią sobotę, czyli w nieco ponad dwa tygodnie od złożenia dyspozycji. Zdziwiona konsultantka powiedziała mi, że &lt;em&gt;przecież&lt;/em&gt; dział techniczny odrzucił mój wniosek już 20. września. Nie mogą przenieść, bo &lt;em&gt;przecież&lt;/em&gt; mój nowy adres nie jest w ogóle objęty obszarem działania firmy. Na argumentację, że dwoje pracowników Netii potwierdziło dostępność usług pani odpowiedziała mi tylko niemym wzruszeniem ramion do słuchawki.&lt;/p&gt;

&lt;p&gt;Dowiedziałem się też, że &lt;em&gt;przecież&lt;/em&gt; powinienem dostać w tej sprawie e-mail. Nie dostałem? Może w spamie jest. W spamie też nie ma? To pewnie ktoś zapomniał wysłać. Co zatem mi pozostaje? No, mogę się zawsze przeprowadzić ponownie. Mogę też rozwiązać umowę, ale to się będzie wiązało z opłatą wyrównawczą, bo rozwiązanie w żadnym wypadku nie jest spowodowane winą operatora.&lt;/p&gt;

&lt;p&gt;Opłata? Ot, bagatela, nieco więcej tylko, niż suma abonamentów pozostałych do wygaśnięcia umowy. Tak, płacąc za usługę, której nie ma, wydam w sumie mniej pieniędzy.&lt;/p&gt;

&lt;p&gt;Bo trzeba wam wiedzieć, że opłata wyrównawcza naliczana jest jako różnica między &lt;em&gt;promocyjną&lt;/em&gt; ceną usługi zawartą w załączniku do umowy, a &lt;em&gt;fikcyjną&lt;/em&gt; ceną umieszczoną na &lt;em&gt;aktualnej&lt;/em&gt; stronie operatora. Fikcyjną, bo nie da się na taką cenę podpisać umowy. Promocją objęci są wszyscy, w końcu kto by płacił trzysta złotych miesięcznie za kulawy ADSL?&lt;/p&gt;

&lt;p&gt;Ceny „cennikowe” istnieją tylko i wyłącznie jako sposób na uniemożliwienie klientom odstąpienia od umowy. Do tego regulamin poprzed odniesienie się do swojej strony internetowej pozostawia sobie swobodę dowolnego sterowania tak naliczanymi karami. Masa niezadowolonych klientów postanawia bojkotować Netię? Och, jakże nam przykro, aktualna cena państwa pakietu poza promocją to miliard złotych, będzie trzeba zapłacić maksymalną przewidzianą regulaminem opłatę wyrównawczą.&lt;/p&gt;

&lt;p&gt;I tym optymistycznym akcentem kończę, choć, niestety, współpracy z Netią zakończyć nie mogę. Niechby wasze biura stanęły w płomieniach.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Słit bloguś kulinarny</title>
   <link href="http://room-303.com/blog/2014/05/23/slit-blogus-kulinarny/"/>
   <updated>2014-05-23T18:11:00+00:00</updated>
   <id>http://room-303.com/blog/2014/05/23/slit-blogus-kulinarny</id>
   <content type="html">&lt;p&gt;Jako że prawie nie mam czasu utrzymywać przy życiu jednego bloga, jedynym rozsądnym posunięciem zdało nam się (to jest &lt;a href=&quot;http://ania.cc/&quot;&gt;vi&lt;/a&gt; oraz mojej skromnej osobie) otworzenie kolejnego. A tak poważnie, to lubimy razem gotować, a że w polu „charakter” mamy wpisane „prawilny hipster”, to i zdjęcia jedzenia zdarza nam się robić.&lt;/p&gt;

&lt;p&gt;Oto nasz pierwszy (nie wiem, czy ostatni) blogasek kulinarny: &lt;a href=&quot;https://medium.com/pat-i-kot&quot;&gt;Pat i Kot&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Recenzja: 47 roninów</title>
   <link href="http://room-303.com/blog/2014/01/14/recenzja-47-roninow/"/>
   <updated>2014-01-14T16:01:00+00:00</updated>
   <id>http://room-303.com/blog/2014/01/14/recenzja-47-roninow</id>
   <content type="html">&lt;p&gt;Ostatnimi czasy niezwykle rzadko dane jest mi pluskać się w ciepłych falach sztuki wysokiej, toteż bez zastanowienia nabyłem bilet na dzieło, które jednocześnie stanowi wielkoekranowy debiut reżyserski Carla Rinscha.&lt;/p&gt;

&lt;p&gt;Jako wieloletni sympatyk kina azjatyckiego z prawdziwą radością przyjąłem fakt, że pomimo obsadzenia praktycznie wszystkich ról aktorami pochodzącymi z Japonii, nareszcie pokazano im ich miejsce i nakazano mówić po angielsku. Osobom z podstawową choćby znajomością języka pozwoli to uniknąć uciążliwego czytania napisów. Anglosceptycy również będą szczęśliwi, gdyż na czytanie napisów czasu jest naprawdę sporo. Ze wstępnych szacunków wynika bowiem, że blisko połowa ze 127 minut projekcji to próby dokończenia prostego zdania przetykanego tu i ówdzie dramatycznymi wdechami. Niewidomy z łatwością mógłby omyłkowo wziąć &lt;em&gt;47 roninów&lt;/em&gt; za epicką historię Keanu Reevesa pomagającego czterdziestu sześciu mężczyznom przezwyciężyć astmę.&lt;/p&gt;

&lt;p&gt;Tu skłamałem, gdyż istotnych postaci jest w filmie raptem kilka. Główny bohater, „mieszaniec” to wyrzutek, którego matką była Japonka, a ojcem Nicolas Cage. Swoim niezrównanym uporem oraz mimiką godną ostatniego odcinka jelita grubego zjednuje sobie poparcie grupy charyzmatycznych bohaterów: Mędrka, Wesołka, Gburka, Nieśmiałka, Śpioszka, Gapcia i Apsika. Istnieje szansa, iż niektóre z imion przekręciłem. Za nimi zaś podążą grupa statystów, którzy malowniczo giną w trójwymiarowych scenach walki. Grze aktorskiej nie sposób coś wytknąć, nie udało mi się też żadnej znaleźć.&lt;/p&gt;

&lt;p&gt;Niektórzy z recenzentów zarzucają filmowi rwaną akcję i brak ciągłości. Pragnę z tego miejsca mit ten obalić, gdyż film choć zawiły niczym szyna kolejowa, kluczowe kwestie podkreśla wielokrotnie. Pozwala to widzowi wygodnie odwiedzić łazienkę, czy sprawdzić Facebooka, bez towarzyszącego temu zwykle uczucia fabularnego zagubienia. Bardziej przedsiębiorczy widzowie mogą w wolnym czasie opłacić rachunki czy poczytać o sztukach walki. Pozwoli to docenić kunszt reżysera, który surowe, zdawkowe machnięcia mieczami i dyscyplinę walki zastąpił scenami, które postawami szermierzy, zacięciem i samym czasem trwania potyczek przywodzą na myśl samych &lt;em&gt;Piratów z Karaibów&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Serdecznie polecam i życzę udanego seansu.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Gotfryd nie był złym człowiekiem</title>
   <link href="http://room-303.com/blog/2013/12/24/gotfryd-nie-byl-zlym-czlowiekiem/"/>
   <updated>2013-12-24T15:20:01+00:00</updated>
   <id>http://room-303.com/blog/2013/12/24/gotfryd-nie-byl-zlym-czlowiekiem</id>
   <content type="html">&lt;p&gt;Gotfryd nie był złym człowiekiem. Wielokrotnie to sobie powtarzał. Podejmował jedynie środki niezbędne, by nie zwariować w tym zabieganym świecie. Anita tego nie rozumiała. Nie mogła tego przecież zrozumieć. Próbował tyle razy, że podejrzewał teraz, że każda z tych klęsk była kolejnym stopniem na jego drodze do depresji. Tak, to miało sens. To przez nią nie potrafił zebrać się w sobie i raz na zawsze rozwiązać wszystkich problemów. Po co ją w ogóle trzymał?&lt;/p&gt;

&lt;p&gt;— Pani Basiu, — spokojnie rzucił do słuchawki — proszę na chwilę do mojego gabinetu.&lt;/p&gt;

&lt;p&gt;Barbara znała Gotfryda od lat. Przez pierwszych kilka miesięcy do jego gabinetu wchodziła niemal na czworaka. Miał w sobie stanowczość, która sprawiała, że nogi zamieniały się w gotowane spaghetti. Teraz stanowczo przekręciła klamkę i wmaszerowała do jego gabinetu.&lt;/p&gt;

&lt;p&gt;— Chodzi o Anitę. Zbyt długo babrałem się z tą sprawą. Proszę zadzwonić do niej i powiedzieć, że wypowiadamy kontrakt i zostaje zwolniona ze swoich zajęć ze skutkiem natychmiastowym. W zasadzie, to nie. Proszę poczekać do poniedziałku, już późno, dzwonić o tej porze jest niegrzecznie. Aha, i rozpisujemy od razu konkurs na jej miejsce. To może pani zrobić jeszcze przed weekendem.&lt;/p&gt;

&lt;p&gt;— Jakieś specjalne życzenia?&lt;/p&gt;

&lt;p&gt;— Nie, sama pani wie przecież, czego oczekuję. Przechodziliśmy przez to już kilka razy.&lt;/p&gt;

&lt;p&gt;— Dobrze, dam znać, kiedy ktoś się odezwie.&lt;/p&gt;

&lt;p&gt;— Niech pani wybada od razu teren, żeby się nie naciąć jak ostatnio.&lt;/p&gt;

&lt;p&gt;Barbara kiwnęła tylko głową i opuściła gabinet. Wróciła do swojego gabinetu i w terminarzu, pod hasłem „poniedziałek” napisała tylko „Anita” i zakreśliła imię kółkiem. W chwilę później poprawiała już ogłoszenie, które osiem miesięcy wcześniej osobiście zamieściła w prasie.&lt;/p&gt;

&lt;p&gt;⁂&lt;/p&gt;

&lt;p&gt;Anitę z zadumy wyrwał telefon. Zawiązała niedbale szlafrok i opuściła łazienkę w poszukiwaniu słuchawki.&lt;/p&gt;

&lt;p&gt;— Słucham?&lt;/p&gt;

&lt;p&gt;— Witam, Barbara Słowiarz, kancelaria pana Wenna. Czy mam przyjemność z panią Anitą Markowiak?&lt;/p&gt;

&lt;p&gt;— Tak, przy telefonie. Dzień dobry.&lt;/p&gt;

&lt;p&gt;— Pozwoli pani, że zadam kilka pytań w celu weryfikacji?&lt;/p&gt;

&lt;p&gt;— Znam procedurę. Proszę zacząć przesłuchanie.&lt;/p&gt;

&lt;p&gt;— Jakiego koloru marynarkę miał na sobie pan Wenn, kiedy przedstawiłam państwa sobie po raz pierwszy?&lt;/p&gt;

&lt;p&gt;— Niebieską. To znaczy granatową. Jednorzędową, z takiego połyskującego materiału.&lt;/p&gt;

&lt;p&gt;— Dobrze, a gdzie to było?&lt;/p&gt;

&lt;p&gt;— W biurze Gotfryda.&lt;/p&gt;

&lt;p&gt;— Dziękuję. Witam, pani Anito. Dzwonię w sprawie administracyjnej. Niestety, muszę poinformować, że okresowa ocena pani osiągnięć nie wypadła pozytywnie. Jak pani wie, posiadam niezbędne pełnomocnictwa pana Wenna i w związku z tym jestem zmuszona podjąć decyzję rozwiązania pani umowy partnerskiej, co skutkuje oczywiście natychmiastowym ustaniem pełnionych dotychczas powinności. Umowa nie wymaga od pana Wenna formy pisemnej, wobec tego proszę potraktować to jako oficjalne wypowiedzenie. Czy jest to jasne?&lt;/p&gt;

&lt;p&gt;— Słucham? Jak to, „wypowiedzenie”? Dlaczego on mi tego nie mówi osobiście?&lt;/p&gt;

&lt;p&gt;— Pan Wenn jest bardzo zajętym człowiekiem, pani Markowiak. Proszę przyjąć ode mnie najszczersze podziękowania za osiem miesięcy udanej współpracy i jednocześnie wyrazy żalu, że pan Wenn nie jest w stanie dłużej pani utrzymywać. Klucze do apartamentu proszę złożyć w biurze w dogodnym dla siebie czasie. Czy jest coś, w czym mogłabym pomóc?&lt;/p&gt;

&lt;p&gt;— E… Chyba nie. To znaczy, nie sądzę.&lt;/p&gt;

&lt;p&gt;— Życzę udanego dnia, pani Anito. Do widzenia.&lt;/p&gt;

&lt;p&gt;Anita odłożyła słuchawkę bez odwzajemnienia grzeczności. Była wściekła. Była słaba. Bała się i jednocześnie tłumaczyła sobie, że przecież miała być na to gotowa. Gdzieś w duchu powtarzała sobie, że ten dzień kiedyś nastąpi. Powtarzały jej to również przyjaciółki, ale w ich oczach widziała zazdrość. Ponownie podniosła słuchawkę.&lt;/p&gt;

&lt;p&gt;— Witaj, Anito.&lt;/p&gt;

&lt;p&gt;— Gotfryd, do kurwy nędzy, nie masz dość jaj, żeby powiedzieć mi to osobiście?&lt;/p&gt;

&lt;p&gt;— Anito, nie unoś się. Człowiek na moim stanowisku musi podejmować pewne decyzje. Nie można zawsze kierować się przywiązaniem. To był udany czas, ile to już miesięcy, sześć? Siedem? To był dobry czas, ale już minął.&lt;/p&gt;

&lt;p&gt;— Jesteś podłym chujem!&lt;/p&gt;

&lt;p&gt;— Zachowuj się profesjonalnie, Anito. Nie będziesz się do mnie w ten sposób zwracać. Barbara przekaże ci wszystkie niezbędne informacje. Miłego dnia, Anito.&lt;/p&gt;

&lt;p&gt;Głos uwiązł jej w gardle. Nie miała dość odwagi by się postawić, nie miała dość siły, by powiedzieć choć słowo więcej. Bezwiednie upuściła telefon na łóżko.&lt;/p&gt;

&lt;p&gt;⁂&lt;/p&gt;

&lt;p&gt;Gotfryd zamknął za sobą drzwi sali konferencyjnej. Kątem oka zauważył Barbarę rozmawiającą na korytarzu z grupą młodych kobiet. Ach, rekrutacja, to już dwa tygodnie. Zapiął górny guzik ulubionej granatowej marynarki, zmusił mimikę twarzy do przywdziania najlepszego uśmiechu i podszedł w ich stronę.&lt;/p&gt;

&lt;p&gt;Zaskoczone kobiety umilkły. Barbara odwróciła się i lekko tylko zaskoczona przedstawiła swojego szefa.&lt;/p&gt;

&lt;p&gt;— Drogie panie, pan Gotfryd Wenn. Pan Wenn zwykle nie bierze udziału w rozmowach na tym etapie, więc możecie się czuć niejako zaszczycone jego obecnością.&lt;/p&gt;

&lt;p&gt;Ucałował dłonie czwórki kandydatek i wyszczerzył się ponownie w uśmiechu.&lt;/p&gt;

&lt;p&gt;— Jak odnajdują panie moje skromne biuro?&lt;/p&gt;

&lt;p&gt;— Z całą pewnością robi wrażenie — wtrąciła błyskawicznie Barbara. — Czy chciałby pan coś przekazać osobiście?&lt;/p&gt;

&lt;p&gt;— Nie, na pewno poradzi sobie pani świetnie sama. Nie przeszkadzam więc.&lt;/p&gt;

&lt;p&gt;Delikatnym skinieniem głowy pożegnał całą piątkę, po czym odwrócił się na pięcie i niespiesznie udał w kierunku własnego gabinetu.&lt;/p&gt;

&lt;p&gt;— Jak mówiłam, — usłyszał za plecami głos Barbary — na tym etapie staram się nie wydawać zdecydowanych opinii. Pojawiły się pewne drobne potknięcia, jednak nie skreślają one żadnej z pań z dalszego udziału w naborze. W ciągu dwóch tygodni ktoś się z paniami skontaktuje, po czym pan Wenn osobiście podejmie dwie finalistki, by osobiście wybrać nową muzę, jak zwykł określać konkubinę.&lt;/p&gt;

&lt;p&gt;Uśmiechnął się pod nosem i pokiwał głową w uznaniu. Widział to w ich oczach, uśmiechały się. Gotfryd nie był złym człowiekiem. Wielokrotnie to sobie powtarzał.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Ctrl+Alt+Dell</title>
   <link href="http://room-303.com/blog/2011/11/10/ctrlaltdell/"/>
   <updated>2011-11-10T10:19:02+00:00</updated>
   <id>http://room-303.com/blog/2011/11/10/ctrlaltdell</id>
   <content type="html">&lt;p&gt;Strona firmy Dell jest specjalna. Pod koniec października złożyłem tam zamówienie, próbuję zatem ustalić jego aktualny stan. Zwłaszcza, że pieniądze zdążyli już wziąć. Po zalogowaniu na swoje konto otrzymuję taki oto komunikat:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;b&gt;Witaj, Customer&lt;/b&gt; (&lt;a href=&quot;#&quot;&gt;nie jesteś Customer?&lt;/a&gt;)&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Po przejściu do listy zamówień zaś:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;b&gt;Witaj, &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/b&gt; (&lt;a href=&quot;#&quot;&gt;to nie Ty&lt;/a&gt;)&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Oczywiście, że to nie ja, nie mam wszak na imię &lt;i&gt;&amp;lt;odgłos upadającej klawiatury&amp;gt;&lt;/i&gt;. Ale tuż niżej jest jeszcze lepiej:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Przykro nam, ale wygląda na to, że w podanym okresie nie mieliśmy od Państwa żadnych zamówień. Prosimy wybrać inny okres i spróbować ponownie. Jeśli uważasz, że ta wiadomość została dostarczona do Ciebie omyłkowo,&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Jakim okresie? Jak wybrać inny okres? Jaka wiadomość? I co, jeśli została dostarczona omyłkowo? Klikam jednak „Wyświetl inne zamówienie”, wpisuję numer zamówienia i swój adres e-mail (ten sam, na który jestem zalogowany). Pojawia się zamówienie.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;b&gt;Stan:&lt;/b&gt; Wysłano&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Szacowana data dostawy:&lt;/b&gt; Zamówienie wysłane&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Numer śledzenia:&lt;/b&gt; &lt;a href=&quot;#&quot;&gt;JJD0000¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Wysłano dnia:&lt;/b&gt; 2011-11-04&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Po kliknięciu odnośnika do śledzenia zamówienia, sytuacja nieco się klaruje. Trafiam bowiem na stronę hiszpańskiego (!) DHL, który — o dziwo — mojej paczki nie ma:&lt;/p&gt;

&lt;blockquote&gt;&lt;h3&gt;Situación de un Envío&lt;/h3&gt;
&lt;p&gt;Este número de expedición no existe en nuestro sistema, vuelva a intentarlo.&lt;/p&gt;
&lt;p&gt;Si no conoce el número de expedición, puede intentarlo introduciendo el número de referencia&lt;/p&gt;
&lt;p&gt;Si no conoce ninguna de estas dos variables, puede utilizar la opción 'selección' del menú 'Servicio Cliente'.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Ciekawe, czy odpiszą mi na maila?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Odpisali. Zamiast męczyć się ze stroną Della, przesyłki można śledzić na &lt;a href=&quot;http://www.dellpsc.dhl.com/dell_tracking/index.php&quot;&gt;dedykowanej stronie DHL&lt;/a&gt;. Trzeba tylko podać swój numer klienta Dell i numer zamówienia, który znajdziemy w temacie e-maila z potwierdzeniem zamówienia.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Pięć setek szaleństwa</title>
   <link href="http://room-303.com/blog/2011/11/04/piec-setek-szalenstwa/"/>
   <updated>2011-11-04T23:08:09+00:00</updated>
   <id>http://room-303.com/blog/2011/11/04/piec-setek-szalenstwa</id>
   <content type="html">&lt;p&gt;Wtem!&lt;/p&gt;

&lt;p&gt;— Leży!&lt;/p&gt;

&lt;p&gt;Produkcja? Ale tutaj?&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Traceback (most recent call last):
  File &quot;/var/www/foo/catalogue/views.py&quot;, line 252, in get
    product = Product.objects.get(upc=tokens[0])
  File &quot;/usr/lib/python2.6/site-packages/django/db/models/manager.py&quot;, line 132, in get
    return self.get_query_set().get(*args, **kwargs)
  File &quot;/usr/lib/python2.6/site-packages/django/db/models/query.py&quot;, line 351, in get
    % (self.model._meta.object_name, num, kwargs))
TypeError: 'DoesNotExist' object is not callable
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Odśwież. Działa. Ki czort? Odśwież. Leży. Działa — działa — leży — działa. Wynik zdaje się zależeć od procesu, który akurat obsłuży zapytanie.&lt;/p&gt;

&lt;p&gt;No dobrze, zobaczmy, co…&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;raise&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MultipleObjectsReturned&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;get() returned more than one &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;s -- it returned &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;s! Lookup parameters were &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;s&quot;&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_meta&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;object_name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;kwargs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Wyjątek. W trakcie rzucania wyjątku. Wbudowanego w klasę modelu.&lt;/p&gt;

&lt;p&gt;Wdech, wydech. Drugi &lt;em&gt;worker&lt;/em&gt; dostał. Dziwacznie poskręcane fragmenty jego wnętrzności zasypują mi skrzynkę.&lt;/p&gt;

&lt;p&gt;Wdech, wydech, &lt;code class=&quot;highlighter-rouge&quot;&gt;grep&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Zanim się przedarłem, straciliśmy jeszcze trzech. W sumie połowa zwijała się tam i charczała wewnętrznymi błędami. Wytrzymajcie, jeszcze tylko kilka plików. I jest.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;product&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Product&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;objects&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;upc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;product_upc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;except&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Product&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DoesNotExist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Product&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MultipleObjectsReturned&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;# …&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Zasadzka — sztuk trzy w projekcie — ładnie nas urządzili. Jeden koniec kodu powoli kopie dołek pod drugim. Pułapki udało się usunąć, ale tamtym już nikt nie pomoże. Przysłanie na produkcję posiłków zajmie minimum trzy dni. Pozostaje tylko patrzeć, jak jeden po drugim toną w tym dziwacznym morzu bezradności, serwując skomplikowane dokumenty, jednak dławiąc się na najprostszych rzeczach. Zostali sami. Oni i pięć setek szaleństwa.&lt;/p&gt;

&lt;p&gt;Kurtyna. Niestosowne słowa cisną mi się na usta, ubliżać chcę składni, albowiem łaknę Pythona trzeciej inkarnacji.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Django: TemplateResponse</title>
   <link href="http://room-303.com/blog/2011/05/17/django-templateresponse/"/>
   <updated>2011-05-17T19:22:17+00:00</updated>
   <id>http://room-303.com/blog/2011/05/17/django-templateresponse</id>
   <content type="html">&lt;p&gt;Przyszło Django 1.3, pojawiła się paskudna implementacja class-based views, &lt;a href=&quot;http://room-303.com/blog/2010/02/26/django-direct_to_template/&quot;&gt;&lt;code&gt;direct_to_template&lt;/code&gt;&lt;/a&gt; zostało oznaczone jako przestarzałe. Ale pojawił się też godny następca, choć z class-based views nie ma nic wspólnego.&lt;/p&gt;

&lt;p&gt;Nie piszemy więc tak:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;from django.shortcuts import render_to_response
from django.template import RequestContext

def foo(request):
    # ...
    return render_to_response('foo.html', {'bar': baz},
            context_instance=RequestContext(request))&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nie piszemy też tak:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;from django.views.generic.simple import direct_to_template

def foo(request):
    # ...
    return direct_to_template(request, 'foo.html', {'bar': baz})&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ani ­— tym bardziej — tak:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;from django.views.generic import TemplateView

def foo(request):
    # ...
    return TemplateView.as_view(template_name='foo.html')(request, bar=baz)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Drodzy państwo, zamiast powyższych używamy:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;from django.template.response import TemplateResponse

def foo(request):
    # ...
    return TemplateResponse(request, 'foo.html', {'bar': baz})&lt;/code&gt;&lt;/pre&gt;
</content>
 </entry>
 
 <entry>
   <title>Google Talk: authentication failure</title>
   <link href="http://room-303.com/blog/2011/05/06/google-talk-authentication-failure/"/>
   <updated>2011-05-06T10:08:36+00:00</updated>
   <id>http://room-303.com/blog/2011/05/06/google-talk-authentication-failure</id>
   <content type="html">&lt;p&gt;Od wczorajszego wczesnego popołudnia nie mogłem się zalogować na swoje konto GTalk za pomocą żadnego komunikatora. Nic, zero, nada. GMail nadal działał bez zarzutu, czat na stronie logował się momentalnie, słońce świeciło, a Elvis wciąż był martwy. Zacząłem podejrzewać najgorsze.&lt;/p&gt;

&lt;p&gt;Kiedy przyjechałem do domu, okazało się, że miałem rację — kończyło mi się piwo. Niezrażony, spróbowałem mimo wszystko skorzystać z komunikatora. Niestety — z podobnym skutkiem. Powoli zaczynałem przypuszczać, że coś jest nie tak. Sprawa była grubymi nićmi szyta. Bez wątpienia komuś zależało, by zerwać moje kontakty z Karolem z warzywniaka pod oknem. Czyżby cena ogórków szklarniowych miała wkrótce przekroczyć cenę cukru, a ten biedny chłopak próbował mnie ostrzec?&lt;/p&gt;

&lt;p&gt;Dziś rano wznowiłem dochodzenie. Już w tramwaju byłem pewien, że ktoś mnie śledzi. Jakie jest bowiem prawdopodobieństwo, by sześćdziesiąt trzy osoby jechały akurat w tym samym kierunku, co ja? Dotarłem do biura, by zaraz po wejściu wytoczyć najcięższe działa: sięgnąłem do działu pomocy Google.&lt;/p&gt;

&lt;p&gt;Jeśli zatem i ciebie chcą pozbawić kontaktu z Karolem, rychło wnijdź pod adres wskazany poniżej:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.google.com/accounts/DisplayUnlockCaptcha&quot;&gt;https://www.google.com/accounts/DisplayUnlockCaptcha&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Reanimacja współczesnego systemu</title>
   <link href="http://room-303.com/blog/2011/03/20/reanimacja-wspolczesnego-systemu/"/>
   <updated>2011-03-20T19:14:09+00:00</updated>
   <id>http://room-303.com/blog/2011/03/20/reanimacja-wspolczesnego-systemu</id>
   <content type="html">&lt;p&gt;Plotki na temat mojej śmierci były oczywiście grubo&amp;hellip; aaruuaaaarrrghhhblargh. Niestety, równie dobrze poczuł się mój laptop po ostatniej aktualizacji pakietu &lt;code&gt;upstart&lt;/code&gt; w PLD.&lt;/p&gt;

&lt;p&gt;Ku pamięci potomnych przedstawiam zatem przepis na doprowadzenie do w miarę działającego stanu systemu wyposażonego we &quot;wszystkie te niepotrzebne wodotryski¹&quot;.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;¹ Tak niektórzy pieszczotliwie określają &lt;code&gt;udev&lt;/code&gt;, a właściwie cokolwiek powstałego po statycznej strukturze &lt;code&gt;/dev&lt;/code&gt;, może z wyjątkiem epoki lodowcowej.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Zaczynamy tradycyjnie, od pominięcia procesu &lt;code&gt;init&lt;/code&gt; (przykład dla &lt;code&gt;grub2&lt;/code&gt;):&lt;/p&gt;

&lt;pre&gt;linux /boot/vmlinuz-2.6.37.4-1 root=/dev/sciezka/do-root init=/bin/sh&lt;/pre&gt;

&lt;p&gt;Następnie odzyskujemy podstawowe funkcje życiowe:&lt;/p&gt;

&lt;pre&gt;mount / -o remount,rw
mount /proc
mount /sys
export PATH=$PATH:/sbin:/usr/sbin
udevd &amp;amp;
udevadm trigger
dbus-daemon --system &amp;amp;
NetworkManager &amp;amp;&lt;/pre&gt;

&lt;p&gt;Uruchomiona w ten sposób konsola może odmawiać przerywania zadań przez &lt;kbd&gt;Ctrl+C&lt;/kbd&gt;, ale zawsze można do tego celu użyć &lt;kbd&gt;Alt+SysRq+I&lt;/kbd&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Django, except IntegrityError</title>
   <link href="http://room-303.com/blog/2010/12/15/django-except-integrityerror/"/>
   <updated>2010-12-15T20:01:09+00:00</updated>
   <id>http://room-303.com/blog/2010/12/15/django-except-integrityerror</id>
   <content type="html">&lt;p&gt;Jeden mały, niewinny szczeniaczek o maślanych oczkach zostaje gdzieś na świecie żywcem przemielony na karmę dla kotów za każdym razem, kiedy piszesz coś takiego:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;try:
    # ...
except IntegrityError:
    return None&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Łapanie &lt;code&gt;IntegrityError&lt;/code&gt; jako metoda wykrywania problemów jest równie dobrym pomysłem, co wymiana czujników dymu na urządzenie wykrywające odgłos syreny nadjeżdżającej straży pożarnej.&lt;/p&gt;

&lt;p&gt;Błąd na poziomie bazy danych jest nieodwracalny. Nie można nic naprawić. To jak pójść pośmiertnie do lekarza. Połknięcie wyjątku bez dalszej propagacji to tylko dodatkowe punkty za styl. Dzięki temu wszystkie otwarte transakcje (z izolującą włącznie) właśnie stały się bezużyteczne, a najbliższa operacja na bazie danych spowoduje spektakularny zgon całej aplikacji.&lt;/p&gt;

&lt;h3&gt;Wersja obrazowa&lt;/h3&gt;

&lt;p&gt;Twój kod próbuje dywanikiem z kibla gasić ogień w domu, w którym dawno złuszczyły się tapety i zniknęły meble. W domu, który sam podpalił. Niezbyt zadowolony z rezultatów wychodzi więc przed budynek i dusi strażaków wężem. Po wszystkim, gwiżdżąc, z rękoma w kieszeniach, odchodzi w stronę zachodzącego słońca, po drodze mijając sąsiada — powoli spopielającego się we własnym ogródku.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Jeśli masz telefon w Plusie...</title>
   <link href="http://room-303.com/blog/2010/12/01/jesli-masz-telefon-w-plusie/"/>
   <updated>2010-12-01T14:28:41+00:00</updated>
   <id>http://room-303.com/blog/2010/12/01/jesli-masz-telefon-w-plusie</id>
   <content type="html">&lt;p&gt;Zacznij od wysłania na (darmowy) numer &lt;strong&gt;8010&lt;/strong&gt; SMS o treści &lt;strong&gt;STOP&lt;/strong&gt;. Położy to kres kretyńskim reklamom z rodzaju:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;MATKO BOSKA, KONIEC ŚWIATA, POTWIERDŹ SWÓJ NUMER i wygraj batonik.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Sukces zostanie potwierdzony przez wiadomość:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Numer zostal wypisany z listy wysylkowej. Dziekujemy.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Teraz czas wypisać się z ofert i promocji. W tym celu wyślij na (również darmowy) numer &lt;strong&gt;8000&lt;/strong&gt; SMS o treści &lt;strong&gt;SPRZECIW&lt;/strong&gt;. Kiedy i ten przyczółek wroga się podda, otrzymasz list kapitulacyjny:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Twoj SPRZECIW na komunikacje marketingowa kanalami elektronicznymi zostal zarejestrowany w systemie.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;For great justice!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>O DHL i najdroższych koszulkach na świecie</title>
   <link href="http://room-303.com/blog/2010/11/24/o-dhl-i-najdrozszych-koszulkach-na-swiecie/"/>
   <updated>2010-11-24T22:29:17+00:00</updated>
   <id>http://room-303.com/blog/2010/11/24/o-dhl-i-najdrozszych-koszulkach-na-swiecie</id>
   <content type="html">&lt;p&gt;Gram. Całkiem sporo. Postanowiłem sobie sprawić koszulki, którymi promowany był Portal 2. &lt;a href=&quot;http://store.valvesoftware.com/product.php?i=C0737&quot;&gt;Jasną&lt;/a&gt; i &lt;a href=&quot;http://store.valvesoftware.com/product.php?i=C0739&quot;&gt;ciemną&lt;/a&gt;. Na polskie warunki tanio nie jest, ale koszulki wyglądają naprawdę fajnie.&lt;/p&gt;

&lt;p&gt;Zamawiam więc. $39.98 plus dostawa. Za $20, bo z Ameryki. &lt;em&gt;Do mojego zamówienia mogą zostać doliczone dodatkowe podatki, akcyzy i opłaty celne.&lt;/em&gt; Kontynuuj do płatności.&lt;/p&gt;

&lt;p&gt;Płacę. A raczej próbuję. Płatność kartą kredytową została odrzucona przez mojego operatora. Ponów. Płatność kartą kredytową została odrzucona ponownie. Trudno, zapłacę przez PayPal. Klik. Klik. Tak pozbyłem się 197,91 PLN. W teorii.&lt;/p&gt;

&lt;p&gt;W praktyce pozbyłem się bowiem 591,91 PLN. Bank płatności odrzucił, ale pieniądze uznał za wydane. Cóż, Valve mnie raczej nie okradnie. Minie czas blokady środków i oddadzą. Tak kończy się środa.&lt;/p&gt;

&lt;p&gt;Jest piątek. Dzwoni telefon.&lt;/p&gt;

&lt;p&gt;Anna z DHL przygotowuje się do odprawy celnej mojej paczki, która lada chwila trafi z lotniska w Lipsku do Izby Celnej we Wrocławiu. Musi wiedzieć, z czego zrobione są koszulki i jak zamierzam ich używać. Podaję adres e-mail, dostaję listę dokumentów do przedłożenia.&lt;/p&gt;

&lt;p&gt;Podpisuję upoważnienie dla DHL do reprezentacji przed organami celnymi. Gdybym wiedział, co mnie czeka, zaprezentowałbym także swój organ. Nie uprzedzajmy jednak faktów. Podpisuję świstek, że zobowiązuję się koszulek nie sprzedać w celu zarobkowym. Została deklaracja zawartości, materiałów i intencji. Napisałem zgodnie z prawdą:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Są to dwie koszulki z krótkim rękawem. Mam nadzieję, że zrobione są z bawełny. Będę w nich dziarsko hasał po mieście, niczym rączy rumak po bezkresnych stepach w porannej rosie.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;W poniedziałek &lt;em&gt;o siódmej pięćdziesiąt cztery rano&lt;/em&gt; (słownie: w nocy) dzwoni telefon. Odbiera Asia. Anna z DHL dzwoni spytać, z czego zrobione są koszulki (sic!). Jest to tak prawdopodobny scenariusz, że — patrząc na swoją kobietę — sam siebie zaczynam podejrzewać o romans. O godzinie 11:35 odbieram kolejny telefon. Anna nie może wytrzymać bez mojego cudownego głosu, tym razem chce poznać także kształt rzeczonych koszulek. Nie pyta o rozmiar, co niestety niweczy próby wyobrażenia sobie mojej boskiej figury. Mają już wszystko potrzebne do odprawy.&lt;/p&gt;

&lt;p&gt;I tak trafiamy na środę, czyli dziś. Rano wita mnie informacja, iż odprawa celna została zakończona, cła importowego nie naliczono i na konto Izby Celnej winien jestem przelać należny podatek w kwocie 88 PLN. Kurwa, wróć! Osiemdziesiąt osiem? Przez zero koma dwa dwa daje&amp;hellip; cztery stówy jak nic. Chwytam za telefon.&lt;/p&gt;

&lt;p&gt;Dwie kolejne godziny spędzam dzwoniąc do mojej niedoszłej kochanki. Jest gorzej, niż zwykle. Jeszcze nie byliśmy w łóżku, a już nie chce ze mną rozmawiać. Po dwóch godzinach słuchania sygnału wolnej linii, Ania (teraz to już prawie rodzina, nawet do rodziców tak często nie dzwonię) odbiera telefon. Mówi, że wszystko się zgadza, bo przecież stawka podatku jest 22%. Z tym, że ja stawki VAT znam. Pytam o podstawę.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Przecież 22% z 402 PLN to 88 PLN.&lt;/em&gt; Czuję się jak pilot myśliwski na manewrach, krew w moim mózgu osiąga przyspieszenie rzędu 9G. Czterysta. Dwa. Złote. Ania sprawdza, skąd. Okazuje się, że na fakturze dołączonej przez Amerykanów nie było ceny dostawy, więc DHL wpisał, co uważał.&lt;/p&gt;

&lt;p&gt;Zaczynam się gotować. O kolor metki i ściegi na szwach to by mieli kogo spytać. Pewnie o szóstej w nocy dzwoniliby z pytaniem o temperaturę prania. W obliczu tragedii, jaką jest brak ceny dostawy na fakturze, stanęli bezradni i w wyniku rzutu kostką wpisali 283 PLN. Nie mogli się dowiedzieć. Nie, żeby na ten przykład byli w stanie ustalić, &lt;em&gt;na ile sami skasowali Valve&lt;/em&gt;, przecież DHL nie udzieli takiej informacji &lt;em&gt;sam sobie&lt;/em&gt; (&quot;ale oni mówią do nas po angielsku!&quot;).&lt;/p&gt;

&lt;p&gt;To oczywiste, że inteligentny człowiek zamówiłby koszulki o wartości 119 PLN i kazał je dostarczyć kurierowi za 283 PLN. A przynajmniej każdy tak inteligentny, jak agenci celni DHL.&lt;/p&gt;

&lt;p&gt;Złożyłem reklamację, jednak jestem prawie pewien, że do czasu jej rozpatrzenia minie termin uiszczenia opłat celnych. Wobec tego będę musiał te pieniądze założyć. Będzie to moment, w którym chwilowa cena dwóch kawałków bawełny osiągnie 679,91 PLN. Zakładając, że DHL do tego czasu nie naliczy &quot;dodatkowych opłat według aktualnie obowiązującego cennika&quot;. Koszulek jeszcze nie widziałem.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>DRM</title>
   <link href="http://room-303.com/blog/2010/10/22/drm/"/>
   <updated>2010-10-22T10:13:44+00:00</updated>
   <id>http://room-303.com/blog/2010/10/22/drm</id>
   <content type="html">&lt;p&gt;—&amp;nbsp;Wszystko ta sama sieczka — mruknął pod nosem, sam do siebie, odkładając kolejną płytę na półkę.&lt;/p&gt;
&lt;p&gt;Dopiero po chwili wyłowił z gąszczu szarych, zastępczych okładek singiel, o który mu chodziło.&lt;/p&gt;
&lt;p&gt;—&amp;nbsp;Dzień dobry, chciałem dziesięć kopii tego — rzucił przyjaźnie w stronę kasjerki.&lt;/p&gt;
&lt;p&gt;—&amp;nbsp;Dziesięć? — Choć nadal uśmiechnięta, dziewczyna zrobiła zdziwioną minę. — Zwykle ludzie biorą trzy — zaczęła wymieniać — na kino domowe, na iPoda i na komputer&amp;hellip;&lt;/p&gt;
&lt;p&gt;—&amp;nbsp;Cóż, mówią na mnie Rock, jestem didżejem — wypowiedział te słowa z dumą, podając dziewczynie plastikową kartę RIAA.&lt;/p&gt;
&lt;p&gt;—&amp;nbsp;Łał, to cudownie! Proszę. — Podała mu papierową torbę z płytami. — Numery seryjne płyt zostały przypisane do twojej karty. Kolejny przegląd licencyjny twojej karty w kwietniu. Czy mogę zainteresować cię czymś z naszej oferty specjalnej?&lt;/p&gt;
&lt;p&gt;—&amp;nbsp;Nie, dzięki.&lt;/p&gt;
&lt;p&gt;Gdy wypowiadał te słowa poczuł wibracje w wewnętrznej kieszeni kurtki. Próbował szybko schować pakiet singli do kieszeni, ale było już za późno. Telefon zaczął dzwonić. Popatrzył jeszcze zrezygnowanym wzrokiem na pulsującą w rogu ekranu liczbę. Pozostało mu siedem odtworzeń dzwonka. Pamiętał kiedy wprowadzono te restrykcje. Jeden ze znanych wokalistów w publicznym wywiadzie przyznał się, że ustawił hit swojej kapeli jako dzwonek, dzięki czemu nie musi sam sobie płacić za jego słuchanie. Senatorzy RIAA byli wściekli, kongres zmienił ustawę w jeden weekend, nie chcąc dopuścić do sytuacji, kiedy młodzież pójdzie w ślady swojego idola. Odebrał rozmowę.&lt;/p&gt;
&lt;p&gt;—&amp;nbsp;Robert, człowieku, doprowadzisz mnie do ruiny. Czemu nie odbierasz zwyczajnie, kiedy to ja do ciebie dzwonię?&lt;/p&gt;
&lt;p&gt;—&amp;nbsp;Cześć Rock, wybacz, ale zdjąłem na chwilę słuchawki, a wiesz przecież, że mój dzwonek nie ma licencji na publiczne odtwarzanie. Jak tam zakupy, gotowy na dzisiejszy show?&lt;/p&gt;
&lt;p&gt;—&amp;nbsp;Taa, wiesz, że nigdy nie zawodzę. Właśnie kupiłem ostatni singiel, to będzie prawdziwa wisienka na torcie. W sumie mam już na wieczór cztery godziny muzyki.&lt;/p&gt;
&lt;p&gt;—&amp;nbsp;Będziesz coś miksował na żywo?&lt;/p&gt;
&lt;p&gt;—&amp;nbsp;Na pewno, ale jeszcze nie wiem, ile. Chcemy przecież jeszcze coś zarobić.&lt;/p&gt;
&lt;p&gt;—&amp;nbsp;Dobra, to nie przeszkadzam, do–zo wieczorem.&lt;/p&gt;
&lt;p&gt;—&amp;nbsp;No to strzałka, tylko się nie spóźnij.&lt;/p&gt;
&lt;p&gt;Minął róg sklepu i wsiadł do samochodu. Zapalił silnik i z trudem powstrzymał chęć wpakowania jednego ze świeżych nabytków w szczelinę odtwarzacza. Zamiast tego włączył radio i w towarzystwie najnowszych informacji z życia gwiazd ruszył w stronę domu. Podekscytowany zbliżającą się imprezą podśpiewywał w rytm muzyki z rzadka pojawiającej się w przerywających audycję reklamach.&lt;/p&gt;
&lt;p style=&quot;text-align:center;&quot;&gt;– ❧ –&lt;/p&gt;
&lt;p&gt;Wiedział, że jest gotowy. Czuł, jak każdy mięsień drga z podniecenia. Zatrzymał auto pod klubem, na parkingu dla vip–ów i ponownie przejrzał kuferek z płytami, po raz ostatni zamieniając niektóre z nich kolejnością. Pewnym krokiem podszedł do drzwi dla wykonawców. Odruchowo podał plastik karkowi w nieco przyciasnym garniturze.&lt;/p&gt;
&lt;p&gt;—&amp;nbsp;Może pan wejść. Karta ważna do kwietnia.&lt;/p&gt;
&lt;p&gt;Zamienił jeszcze parę słów z menadżerem klubu i udał się do baru po &quot;jednego na rozpęd&quot;.&lt;/p&gt;
&lt;p&gt;Pół godziny później wychodził już na scenę. Czuł pulsującą adrenalinę, kiedy oświetleniowiec wskazał go reflektorem. Ujął w rękę mikrofon i słowa popłynęły same.&lt;/p&gt;
&lt;p&gt;—&amp;nbsp;Jak się bawicie, Nowy Yorku? — Poczekał, aż ucichną wrzaski. — Jak pewnie wszyscy wiecie, jestem Rock. — Wzrokiem odnalazł wśród widowni poznaną tego poranka kasjerkę. — Obok mnie stoi pan Miles Welles z komisji RIAA, który będzie czuwał nad dzisiejszą imprezą. Za trzy minuty włączymy systemy przeciwdziałania nagrywaniu, osoby z aparatami słuchowymi prosimy o opuszczenie sali. A teraz przygotujcie się, bo dziś wieczór damy czadu!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>zsh + git</title>
   <link href="http://room-303.com/blog/2010/10/15/zsh-git/"/>
   <updated>2010-10-15T12:05:56+00:00</updated>
   <id>http://room-303.com/blog/2010/10/15/zsh-git</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://briancarper.net/blog/570/git-info-in-your-zsh-prompt&quot;&gt;Brian Carper&lt;/a&gt; opublikował niedawno bardzo praktyczny sposób na prezentację stanu systemu kontroli wersji w zsh. Poniżej wariacja na modłę domyślnego wiersza poleceń w PLD:&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/5083055281/&quot; title=&quot;zsh + git by patrys, on Flickr&quot;&gt;&lt;img src=&quot;http://farm5.static.flickr.com/4126/5083055281_e96523d72a.jpg&quot; width=&quot;500&quot; height=&quot;457&quot; alt=&quot;zsh + git&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;autoload -Uz vcs_info
 
zstyle ':vcs_info:*' stagedstr '%F{green}∙'
zstyle ':vcs_info:*' unstagedstr '%F{yellow}∙'
zstyle ':vcs_info:*' check-for-changes true
zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat '%b%F{1}:%F{11}%r'
precmd () {
    if [[ -z $(git ls-files --other --exclude-standard 2&amp;gt; /dev/null) ]] {
        zstyle ':vcs_info:*' formats ' %F{green}%b%c%u%f'
    } else {
        zstyle ':vcs_info:*' formats ' %F{green}%b%c%u%F{red}∙%f'
    }
 
    vcs_info
}
 
setopt prompt_subst
PS1='[%n@%m %~${vcs_info_msg_0_}]$ '&lt;/pre&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #034: Być lepszym człowiekiem</title>
   <link href="http://room-303.com/blog/2010/10/12/strip-034-byc-lepszym-czlowiekiem/"/>
   <updated>2010-10-12T11:48:45+00:00</updated>
   <id>http://room-303.com/blog/2010/10/12/strip-034-byc-lepszym-czlowiekiem</id>
   <content type="html">&lt;p&gt;Wtem!&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/034-be-a-better-person.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Zobacz Social Network w kinie</title>
   <link href="http://room-303.com/blog/2010/09/23/zobacz-social-network-w-kinie/"/>
   <updated>2010-09-23T15:12:03+00:00</updated>
   <id>http://room-303.com/blog/2010/09/23/zobacz-social-network-w-kinie</id>
   <content type="html">&lt;p&gt;Jedno z kin sieci Helios, &lt;a href=&quot;http://www.heliosnet.pl/24,Warszawa/StronaGlowna/&quot;&gt;Warszawa Femina&lt;/a&gt; organizuje specjalny pokaz filmu Social Network dla blogerów. Dzięki uprzejmości sieci &lt;a href=&quot;http://blogvertising.pl/&quot;&gt;Blogvertising&lt;/a&gt; mam dla was do rozdania dwa komplety podwójnych wejściówek na ten film.&lt;/p&gt;

&lt;p&gt;Seans odbędzie się za tydzień, &lt;strong&gt;30. września&lt;/strong&gt; o godzinie &lt;strong&gt;20:00&lt;/strong&gt; w sali C wspomnianego kina. Jeśli jesteście zainteresowani i odpowiada wam termin, dajcie znać w komentarzach. W poniedziałek skontaktuję się ze szczęśliwcami i poproszę o listę imion i nazwisk do wpisania na zaproszeniach.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>See no eval, hear no eval, speak no eval</title>
   <link href="http://room-303.com/blog/2010/09/03/see-no-eval-hear-no-eval-speak-no-eval/"/>
   <updated>2010-09-03T15:51:31+00:00</updated>
   <id>http://room-303.com/blog/2010/09/03/see-no-eval-hear-no-eval-speak-no-eval</id>
   <content type="html">&lt;p&gt;Choć sam konta w &lt;a href=&quot;http://www.facebook.com/&quot;&gt;Książeczce Maryja&lt;/a&gt; nie posiadam, przyszło mi ostatnio ścierać się z ichnim API, coby dla klienta wdrożenia poczynić. Po przejrzeniu dostępnych bibliotek (w tym dość żałosnego &lt;a href=&quot;http://github.com/facebook/python-sdk/&quot;&gt;python-sdk&lt;/a&gt;), stanęło na dość popularnym projekcie &lt;em&gt;pyfacebook&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Oryginalne repozytorium było wybrakowane pod względem funkcjonalności, wybraliśmy więc fork, który z pewnością stworzył fan Władcy Pierścieni. Jak się miało później okazać, &quot;jeden, by wszystkie zgromadzić i w ciemności związać&quot; dość wiernie oddaje uzyskany efekt.&lt;/p&gt;

&lt;p&gt;Człowiek głupi, to przy pierwszym problemie zajrzał w bebechy ofiary. Po tym stanął jak wryty i całe Satchmo przeleciało mu przed oczami. Na początek tradycyjny problem — przejście się w glanach po separacji warstw:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;from threading import local

_thread_locals = local()&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;def get_facebook_client():
    &quot;&quot;&quot;
    Get the current Facebook object for the calling thread.

    &quot;&quot;&quot;
    try:
        return _thread_locals.facebook
    except AttributeError:
        raise ImproperlyConfigured('Make sure you have the Facebook middleware installed.')&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;class FacebookMiddleware(object):
    &quot;&quot;&quot;
    Middleware that attaches a Facebook object to every incoming request.
    The Facebook object created can also be accessed from models for the
    current thread by using get_facebook_client().

    callback_path can be a string or a callable.  Using a callable lets us
    pass in something like lambda reverse('our_canvas_view') so we can follow
    the DRY principle.
    &quot;&quot;&quot;
    # ...

    def process_request(self, request):
        # ...
        _thread_locals.facebook = request.facebook = Facebook(self.api_key,
                self.secret_key, app_name=self.app_name,
                callback_path=callback_path, internal=self.internal,
                proxy=self.proxy, app_id=self.app_id, oauth2=self.oauth2)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Przerażające konstrukcje zaczęły się jednak później:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;# generate the Facebook proxies
def __generate_proxies():
    for namespace in METHODS:
        methods = {}

        for method, param_data in METHODS[namespace].iteritems():
            methods[method] = __generate_facebook_method(namespace, method, param_data)

        proxy = type('%sProxy' % namespace.title(), (Proxy,), methods)

        globals()[proxy.__name__] = proxy

__generate_proxies()&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;class Facebook(object):
    &quot;&quot;&quot;
    Provides access to the Facebook API.

    ...
    &quot;&quot;&quot;

    def __init__(self, api_key, secret_key, auth_token=None, app_name=None,
                 callback_path=None, internal=None, proxy=None,
                 facebook_url=None, facebook_secure_url=None,
                 generate_session_secret=0, app_id=None, oauth2=False):
        # ...
        for namespace in METHODS:
            self.__dict__[namespace] = eval('%sProxy(self, \'%s\')' % (namespace.title(), 'facebook.%s' % namespace))&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Skończyło się na własnym forku i refaktoryzacji tych i wielu innych fragmentów kodu. Poprawioną wersję można znaleźć &lt;a href=&quot;http://github.com/mirumee/pyfacebook&quot;&gt;na GitHubie&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Na koniec stare powiedzenie ludowe:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Gdy bowiem zoczysz, iż jest coś narzeczy, a za cwanego masz się i uważasz &lt;code&gt;__globals__&lt;/code&gt; i &lt;code&gt;eval()&lt;/code&gt; za sprawy rozwiązanie, mylisz się wielce, przeto idź przypudrować nos¹.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;small&gt;¹ &lt;cite&gt;&lt;a href=&quot;http://pl.wikiquote.org/wiki/Cia%C5%82o_(film)&quot;&gt;Ciało&lt;/a&gt;&lt;/cite&gt;, 2003&lt;/small&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Nie zrobię ci nic złego</title>
   <link href="http://room-303.com/blog/2010/08/25/nie-zrobie-ci-nic-zlego/"/>
   <updated>2010-08-25T19:26:32+00:00</updated>
   <id>http://room-303.com/blog/2010/08/25/nie-zrobie-ci-nic-zlego</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://arstechnica.com/science/news/2010/08/users-are-still-idiots-cough-up-personal-data-despite-warnings.ars&quot;&gt;Wczorajszy przedruk&lt;/a&gt; w Ars Technice pokazuje ciekawe zjawisko. Im bardziej użytkownicy są przekonywani o poufności i bezpieczeństwie swoich danych, z tym większym trudem przychodzi im owe dane podać.&lt;/p&gt;

&lt;p&gt;Jeśli się nad tym jednak zastanowić, okazuje się, że jest to związane z całkiem normalnym funkcjonowaniem mózgu. Ktoś pamięta skecz o pilotach w wykonaniu Monty Pythona?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;— Tu mówi wasz kapitan, nie ma absolutnie żadnych powodów do paniki.&lt;/p&gt;
&lt;p&gt;— &amp;hellip;&lt;/p&gt;
&lt;p&gt;— Skrzydła wcale się nie palą!&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Najistotniejszą rolę odgrywa tutaj sam fakt wspomnienia o niewystąpieniu określonego czynnika. Czy ktokolwiek z was jest sobie w stanie wyobrazić lunapark z kolejką górską, przy której stoi poniższa tabliczka?&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Inspekcja techniczna zapewnia, iż w wyniku korzystania z kolejki nie zginiesz powolną śmiercią, miażdżony przez tony giętych z potwornym zgrzytem rur i rozcięty na pół blachą opatrzoną logo naszego parku rozrywki.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&quot;Dlaczego w ogóle miałbym o tym pisać?&quot; Brzmi idiotycznie, prawda? &quot;Z pewnością nikt rozsądny nie zrobiłby nic podobnego!&quot;&lt;/p&gt;

&lt;p&gt;Tymczasem każdego dnia wystawiamy swoje małe tabliczki:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Nasz serwis jest wyjątkowo bezpieczny. Nikomu nie udostępnimy twojego adresu e-mail. Ani żadnych innych twoich danych. Postaramy się działać akurat wtedy, kiedy będziesz nas potrzebował. A w razie czego mamy kopie zapasowe.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;A potencjalny klient czyta i&amp;hellip; zamyka okno przeglądarki.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Button kontra przeglądarki</title>
   <link href="http://room-303.com/blog/2010/08/23/button-kontra-przegladarki/"/>
   <updated>2010-08-23T14:45:24+00:00</updated>
   <id>http://room-303.com/blog/2010/08/23/button-kontra-przegladarki</id>
   <content type="html">&lt;p&gt;Ku pamięci:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Firefox¹ ignoruje &lt;code&gt;line-height&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Firefox¹ dodaje własny element z dwupikselowym paddingiem i pikselowym borderem:&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&quot;css&quot;&gt;button::-moz-focus-inner {
    border: 0 none;
    padding: 0;
}&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wszystkie przeglądarki domyślnie wliczają ramki i padding do rozmiarów elementu:&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&quot;css&quot;&gt;button {
    box-sizing: content-box;
    -moz-box-sizing: content-box;
    -ms-box-sizing: content-box;
    -webkit-box-sizing: content-box;
}&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;abbr title=&quot;Internet Explorer 7&quot;&gt;IE7&lt;/abbr&gt; i starsze nie radzą sobie z automatyczną szerokością przycisków:&lt;/p&gt;
&lt;pre&gt;&lt;code lang=&quot;css&quot;&gt;button {
    overflow: visible;
    width: 0;
}
button[type] {
    width: auto;
}&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;small&gt;¹ Dotyczy ogólnie produktów Mozilli.&lt;/small&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Tymczasem w biurze...</title>
   <link href="http://room-303.com/blog/2010/08/04/tymczasem-w-biurze/"/>
   <updated>2010-08-04T15:28:27+00:00</updated>
   <id>http://room-303.com/blog/2010/08/04/tymczasem-w-biurze</id>
   <content type="html">&lt;p&gt;Uruchomiliśmy &lt;a href=&quot;http://mirumee.com/blog/2010/08/03/letnie-zmiany-w-centrum-faktur/&quot;&gt;nową wersję&lt;/a&gt; serwisu &lt;a href=&quot;http://centrumfaktur.pl/&quot;&gt;Centrum Faktur&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Listę nowości opisałem już w podlinkowanym tekście, więc właśnie tam zapraszam zarówno spragnionych wiedzy, jak i miłośników mojej twórczości literackiej.&lt;/p&gt;

&lt;p&gt;Kobiety i dary można podsyłać do mnie. Problemy, błędy, uwagi &amp;mdash; tradycyjnie, na &lt;a href=&quot;http://mirumee.com/ideas/&quot;&gt;Burzę Mózgów&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Python: Nie będziesz używał **kwargs nadaremnie</title>
   <link href="http://room-303.com/blog/2010/08/04/python-nie-bedziesz-uzywal-kwargs-nadaremnie/"/>
   <updated>2010-08-04T14:16:52+00:00</updated>
   <id>http://room-303.com/blog/2010/08/04/python-nie-bedziesz-uzywal-kwargs-nadaremnie</id>
   <content type="html">&lt;p&gt;Prawidłowe użycie:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;def foo(bar, *args, **kwargs):
    frobnicate(bar)
    baz(*args, **kwargs)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nigdy tak¹:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;def foo(bar, *args, **kwargs):
    frobnicate(bar)
    baz()&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;small&gt;¹  Z wyjątkiem kilku API, które wyraźnie rezerwują sobie możliwość wprowadzenia dodatkowych parametrów. Działają tak np. wbudowane sygnały w Django.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Ciche połykanie śmieci w parametrach w malowniczy sposób zemści się przy pierwszej literówce w kodzie. I będzie ci się należało.&lt;/p&gt;

&lt;p&gt;Jeśli wydaje ci się, że w ten sposób skracasz sobie kod, to przypomnij sobie starą zasadę: utrzymywanie kodu wymaga dwa razy więcej inteligencji i sprytu, niż jego napisanie. Jeśli cały swój spryt włożysz w stworzenie kodu, to z definicji jesteś za głupi, by go potem debugować.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>To jest mój wątek i nie oddam go nikomu</title>
   <link href="http://room-303.com/blog/2010/07/26/to-jest-moj-watek-i-nie-oddam-go-nikomu/"/>
   <updated>2010-07-26T14:53:26+00:00</updated>
   <id>http://room-303.com/blog/2010/07/26/to-jest-moj-watek-i-nie-oddam-go-nikomu</id>
   <content type="html">&lt;p&gt;Bezstanowość protokołu HTTP jest faktem. Niezależnie od tego, czego chciałby autor danej aplikacji. Na przykład nie jest prawdą, że jeden proces lub wątek serwera jest przypisany jednemu, konkretnemu odwiedzającemu stronę. Wybaczcie zatem łzy, które zakręciły mi się w oczach na widok tego:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;def _get_taxprocessor(request=None):
    taxprocessor = get_thread_variable('taxer', None)
    if not taxprocessor:
        if request:            
            user = request.user
            if user.is_authenticated():
                user = user
            else:
                user = None
        else:
            user = get_current_user()

        taxprocessor = get_tax_processor(user=user)    
        set_thread_variable('taxer', taxprocessor)
        
    return taxprocessor&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Dalej był już tylko płacz:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;def get_current_user():
    user = get_thread_variable('user', None)
    if user != None: return user
    req = get_current_request()
    if req == None: return None
    return req.user&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I zgrzytanie zębów:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;from threading import local

_threadlocals = local()

def set_current_user(user):
    set_thread_variable('user', user)

def set_thread_variable(key, var):
    setattr(_threadlocals, key, var)
    
def get_thread_variable(key, default=None):
    return getattr(_threadlocals, key, default)

def get_current_request():
    return get_thread_variable('request', None)&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;class ThreadLocalMiddleware(object):
    &quot;&quot;&quot;Middleware that gets various objects from the
    request object and saves them in thread local storage.&quot;&quot;&quot;

    def process_request(self, request):
        set_thread_variable('request', request)
        set_current_user(request.user)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pytanie-zagadka: co się stanie z podatkiem, gdy ten sam wątek serwera obsłuży innego użytkownika? Pytanie pomocnicze: skąd może pochodzić ów kod?&lt;/p&gt;

&lt;p&gt;Otrzymujesz &lt;em&gt;k3&lt;/em&gt; Punkty Obłędu. Jeśli całkowita liczba zebranych punktów wynosi 6 lub więcej, rozpatrz test nabycia trwałej choroby psychicznej zgodnie z procedurą opisaną w rozdziale &lt;em&gt;Obłęd&lt;/em&gt; podręcznika.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Być jak Satchmo</title>
   <link href="http://room-303.com/blog/2010/07/20/byc-jak-satchmo/"/>
   <updated>2010-07-20T15:20:30+00:00</updated>
   <id>http://room-303.com/blog/2010/07/20/byc-jak-satchmo</id>
   <content type="html">&lt;p&gt;Z pewnością naczytałeś się już, jakie to &lt;a href=&quot;http://room-303.com/blog/2010/04/18/django-pinax-i-satchmo/&quot;&gt;Satchmo nie jest doskonałe&lt;/a&gt;, zazdrościsz i chciałbyś stworzyć coś równie wspaniałego. Dość jednak nieprzespanych nocy, albowiem przygotowałem krótki poradnik, który w kilku krokach pozwoli ci dorównać mistrzom.&lt;/p&gt;

&lt;h3&gt;Sięgaj tam, gdzie import nie sięga&lt;/h3&gt;

&lt;p&gt;Tak jest, zacznij od stworzenia modułu z myślnikiem w nazwie. Niestety, oczywista nazwa &lt;code&gt;email-auth.py&lt;/code&gt; została już zajęta — musisz się bardziej wysilić. Znajomym oczy wypadną z zazdrości, gdy tylko pierwszy raz zobaczą:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;hahaha = __import__('pokonalem-was', globals(), locals(), [], -1)&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Uatrakcyjniaj pętle&lt;/h3&gt;

&lt;p&gt;Od dawna wiadomo już, że przedwczesna optymalizacja jest złem, naszą odpowiedzią będzie zatem &lt;q&gt;przedwczesna dezoptymalizacja&lt;/q&gt;! Oto przykład atrakcyjnego wyświetlenia listy:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;django&quot;&gt;{% for product in products %} 
    {% if forloop.first %} &amp;lt;ul&amp;gt;  {% endif %}
        &amp;lt;li&amp;gt;{% thumbnail product.main_image.picture 85x85 as image %}
        &amp;lt;a href=&quot;{{ product.get_absolute_url }}&quot;&amp;gt;&amp;lt;img src=&quot;{{ image }}&quot; width=&quot;{{ image.width }}&quot; height=&quot;{{ image.height }}&quot; /&amp;gt;&amp;lt;/a&amp;gt;
        &amp;lt;a href=&quot;{{ product.get_absolute_url }}&quot;&amp;gt;{{ product.translated_name }}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
    {% if forloop.last %} &amp;lt;/ul&amp;gt; {% endif %}
{% endfor %}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Tylko wyobraź sobie ich miny! Jeśli chcesz przeskoczyć mistrza, spróbuj przenieść kod do Pythona:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;for counter, product in enumerate(products):
    if counter == 0:
        print '&amp;lt;ul&amp;gt;'
    # ...i tak dalej&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Nie daj się zaszufladkować&lt;/h3&gt;

&lt;p&gt;Nie łudźmy się — przestrzenie nazw są dla frajerów. Bez ceregieli pakuj wszystko w ścieżkę Pythona i upewnij się, że tak właśnie importujesz swoje moduły. Pokaż, że jesteś ważniakiem i twórz moduły o jak najogólniejszych nazwach. Naucz fajansów pokory, tych kilka dodatkowych wpisów w &lt;code&gt;PYTHONPATH&lt;/code&gt; ich nie zabije. Mogą to zrobić konflikty, ale jeśli chcą używać czegoś ponad twój framework, to sami są sobie winni i zasłużyli na karę.&lt;/p&gt;

&lt;pre&gt;export PYTHONPATH=~/web/satchmo/satchmo/apps&lt;/pre&gt;

&lt;h3&gt;Unikaj biurokracji&lt;/h3&gt;

&lt;p&gt;Po co męczyć się z formularzami, gdy do wszystkiego sięgnąć można już w widoku? Niezwykle istotne jest tu unikanie &lt;code&gt;request.REQUEST&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;if request.method==&quot;POST&quot;:
    reqdata = request.POST
else:
    reqdata = request.GET

if reqdata.has_key('quantity'):
    try:
        quantity = round_decimal(reqdata['quantity'], places=2, roundfactor=.25)
    except RoundedDecimalError:
        quantity = Decimal('1.0')
        log.warn(&quot;Could not parse a decimal from '%s', returning '1.0'&quot;, reqdata['quantity'])
else:
    quantity = Decimal('1.0')&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Jeśli już musisz użyć formularza, upewnij się, że upakujesz wszystkie, niezwiązane ze sobą grupy pól w jednej dużej klasie. Dzięki temu zaoszczędzisz sobie kilka wywołań &lt;code&gt;is_valid()&lt;/code&gt; i jednocześnie udaremnisz wszelkie próby innego wykorzystania poszczególnych części przez te niedorozwoje, które mają czelność importować twoje klasy.&lt;/p&gt;

&lt;h3&gt;Wyznaczaj nowe trendy&lt;/h3&gt;

&lt;p&gt;Przez takich jak oni, programowanie obiektowe stoi praktycznie w miejscu. Pokaż im nowe sztuczki, takie jak zastąpienie rozszerzania klas nadpisywaniem funkcji w locie¹:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;def confirm_info(request, template='shop/checkout/protx/confirm.html', extra_context={}):
    payment_module = config_get_group('PAYMENT_PROTX')
    controller = confirm.ConfirmController(request, payment_module)
    controller.templates['CONFIRM'] = template
    controller.extra_context = extra_context
    controller.onForm = secure3d_form_handler
    controller.confirm()
    return controller.response&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;small&gt;¹ W rzeczywistości &lt;code&gt;ConfirmController.onForm&lt;/code&gt; jest w konstruktorze klasy ustawiany na &lt;code&gt;ConfirmController._onForm&lt;/code&gt;, co można uznać za architekturę po dwakroć lepszą.&lt;/small&gt;&lt;/p&gt;

&lt;h3&gt;Parametry dobieraj z rozmachem&lt;/h3&gt;

&lt;p&gt;Piękno tkwi w różnorodności. Upewnij się zatem, że wyczerpiesz wszelkie metody osiągnięcia tego samego celu.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;class ProductImage(models.Model):
    # ...
    picture = ImageWithThumbnailField(verbose_name=_('Picture'),
        upload_to=&quot;__DYNAMIC__&quot;,
        name_field=&quot;_filename&quot;,
        max_length=200)
    # ...


class ImageWithThumbnailField(ImageField):
    # ...
    def __init__(self, verbose_name=None, name=None,
                 width_field=None, height_field=None,
                 auto_rename=NOTSET, name_field=None, 
                 upload_to=upload_dir, **kwargs):
        # ...
        if upload_to == &quot;__DYNAMIC__&quot;:
            upload_to = upload_dir
        # ...&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Bądź elastyczny&lt;/h3&gt;

&lt;p&gt;Teraz twój sklep znajduje się w Polsce, ale kto wie, co będzie &lt;em&gt;po&lt;/em&gt; obiedzie? Upewnij się, że cała konfiguracja może być edytowana w locie. Zwłaszcza te jej fragmenty, które wymagają restartu aplikacji. To jedna z wielu sztuczek, które zapewnią ci popularność w branży. Co prawda dawni przyjaciele zazdroszczą ci już do tego stopnia, że przestali się do ciebie odzywać, ale i tak nie tęsknisz po tych prostakach. Od teraz twoim jedynym przyjacielem jest aplikacja &lt;a href=&quot;http://bitbucket.org/bkroeze/django-livesettings/&quot;&gt;django-livesettings&lt;/a&gt;. Na innych nie masz szans, bo przyjaciół poznaje się w biedzie, a ty przecież właśnie zyskałeś umiejętności, dzięki którym praktycznie już jesteś bogaty.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Frogatto</title>
   <link href="http://room-303.com/blog/2010/07/18/frogatto/"/>
   <updated>2010-07-18T23:06:42+00:00</updated>
   <id>http://room-303.com/blog/2010/07/18/frogatto</id>
   <content type="html">&lt;p&gt;Dziś przekonałem się, że grywalne wytwory opensource nie kończą się na &lt;a href=&quot;http://www.wesnoth.org/&quot;&gt;Bitwie o Wesnoth&lt;/a&gt;, &lt;a href=&quot;http://www.nethack.org/&quot;&gt;NetHacku&lt;/a&gt; i &lt;a href=&quot;http://alientrap.org/nexuiz/index.php&quot;&gt;Nexuiz&lt;/a&gt; (ten ostatni ma podobno trafić pod koniec roku na konsole)¹.&lt;/p&gt;

&lt;p&gt;Znalazłem jednak &lt;a href=&quot;http://www.frogatto.com/&quot;&gt;Frogatto&lt;/a&gt; i opadła mi szczęka. Aż trudno uwierzyć, że coś tak pięknego powstało i ukrywa się pomiędzy pięćset dwunastym roguelike i tysiąc piątą grą o epickich przygodach pingwina Tuksa.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;¹ &lt;a href=&quot;http://www.warsow.net/&quot;&gt;Warsow&lt;/a&gt;, choć grą jest dobrą i wygląda ślicznie, nie ma otwartego kodu.&lt;/small&gt;&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/4806134333/&quot; title=&quot;Frogatto by patrys, on Flickr&quot;&gt;&lt;img src=&quot;http://farm5.static.flickr.com/4081/4806134333_225ac9705b_z.jpg&quot; width=&quot;640&quot; height=&quot;502&quot; alt=&quot;Frogatto&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Frogatto można nazwać platformówką, jednak byłoby to określenie bardzo krzywdzące. Co prawda skaczemy po platformach by połykać kolejnych przeciwników i pluć nimi w stylu Kirbiego, lecz rozgrywka nie ogranicza się do nieustannego biegnięcia-w-prawo. Pojawiają się walki z &lt;span class=&quot;noTypo&quot;&gt;bossami&lt;/span&gt;, dźwignie, zamknięte drzwi, klucze, ukryte części poziomów, a nawet całe dodatkowe plansze. Jest też złoto, które zbieramy, by następnie wydać je w sklepie na nowe umiejętności dla głównego bohatera. W każdej chwili możemy również powrócić do zwiedzonej już części świata i jeszcze raz przeczesać zakamarki w poszukiwaniu ukrytych monet.&lt;/p&gt;

&lt;p&gt;To wszystko ubrane jest w prześliczny pixel art, przywodzący na myśl &lt;span class=&quot;noTypo&quot;&gt;Flashback&lt;/span&gt; i prace &lt;a href=&quot;http://www.pixinspace.com/&quot;&gt;Henka Nieborga&lt;/a&gt; oraz oprawę dźwiękową żywcem wyjętą z czasów świetności szesnastobitowców. Jedyną wadą gry jest fakt, że nie starcza jej na zbyt długo. Serdecznie polecam.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>O hakerach, miłości i sławie</title>
   <link href="http://room-303.com/blog/2010/06/15/o-hakerach-milosci-i-slawie/"/>
   <updated>2010-06-15T20:59:51+00:00</updated>
   <id>http://room-303.com/blog/2010/06/15/o-hakerach-milosci-i-slawie</id>
   <content type="html">&lt;p&gt;Było ciepłe czerwcowe popołudnie. Lubił te dni, gdy tempo pracy pozwalało na chwilę zapomnieć o wyściełających biurko i sporą część podłogi papierach i z kubkiem parującej kawy w ręku wpatrywać się w powoli czerwieniące się na horyzoncie niebo. Uciekał wtedy myślami do swoich planów, starając się wyobrazić sobie przyszłość, kiedy nie będzie już musiał pracować. Marzenie — wyrwać się z okowów pracy i być wolnym jak ptak.&lt;/p&gt;

&lt;p&gt;Zaraz jednak humor psuła mu prześladująca go nieustannie myśl. On tutaj, w biurze, z namaszczeniem traktuje każdą chwilę wytchnienia, która pozwala mu choć na chwilę odciąć się od szarego świata. W tym samym czasie te inżynierskie darmozjady marnują tyle wolnego czasu by wymyślić lepszą śrubę czy twardszy metal. Na litość boską, kiedyś ludziom wystarczył kamień i kawałek patyka!&lt;/p&gt;

&lt;p&gt;A zdarza się, że ślęczą nad tym po pracy. „Młodzi są i w dupach się poprzewracało” ― lubił sobie tłumaczyć, zaraz jednak dopadała go nieznośna świadomość, że i starsi koledzy coraz częściej oddawali się podobnym, pozbawionym sensu, praktykom. Co gorsza, przebąkiwali przy tym coś o pasji i miłości. Czy pracoholizm naprawdę zastąpił u nich resztki rozsądku?&lt;/p&gt;

&lt;p&gt;Z zadumy wyrwało go stukanie do drzwi. Dwa szybkie, chwila przerwy, znów dwa szybkie. Musi być, że listonosz. Jego charakterystyczny sposób anonsowania własnej obecności był tylko jednym z nawyków człowieka, o którym przez wzgląd na grzeczność myślał jak o ekscentryku. Nie można mu było jednak odmówić jednej zalety, kolejne porcje danych dostarcza codziennie, bez względu na pogodę.&lt;/p&gt;

&lt;p&gt;Pożegnał więc listonosza i wrócił do gabinetu, by ponownie zająć ciepły fotel przy terminalu. Odstawił na bok stygnącą już kawę i stuknął lekko w jeden z klawiszy. Martwy dotąd ekran rozbłysł ciepłą zielenią. Nim jednak pozwolił dłoniom spocząć na klawiaturze, ponownie sięgnął po kubek i delektując się łykiem ciepłego jeszcze napoju, pozwolił swoim myślom błądzić jeszcze przez chwilę.&lt;/p&gt;

&lt;p&gt;Przypomniał mu się przedwczorajszy telegram od żony. Jeśli kolej nie zawiedzie, już w ten weekend ponownie weźmie synka na kolana. Jak ten brzdąc szybko rośnie! Ani się człowiek obejrzy, a sam zacznie palić w piecu. Mały wprost ten piec uwielbia i pierwsze ciepłe dni wiosny zawsze przyjmuje z niemałym rozczarowaniem.&lt;/p&gt;

&lt;p&gt;„I pomyśleć, że te pijawki chełpiły się myślą, że z metalowych rur zbudują coś od pieca lepszego. Jeszcze trochę i komputery tymi swoimi rurami będą skręcać. Zajęliby się czymś pożytecznym. Ale i ja nie powinienem marnować czasu.” ― sięgnął po przyniesione przez pocztowca zawiniątko i wysupłał z gazety paczkę półcalowych dyskietek po cztery megabajty każda. Kontrolnie rzucił okiem na etykiety — „wypłaty, maj” — wszystko się zgadzało. Wsunął pierwszą w drzwiczki napędu i zasiadł do pracy.&lt;/p&gt;

&lt;p style=&quot;text-align:center;&quot;&gt;– ❧ –&lt;/p&gt;

&lt;p&gt;Tego samego wieczoru postanowił w końcu spisać swe myśli. Zakończył więc VisiCalc i uruchomił WordStar 7.2, z braku podobnych programów nazywany zwykle „edytorem”. Przez kolejną godzinę pokój wypełniały jedynie aromat kawy i stukanie klawiszy, w jednostajnym rytmie przekuwających kolejne formułowane w głowie postulaty w zieleń zapalających się na ekranie liter.&lt;/p&gt;

&lt;p&gt;„Teraz zrozumieją” ― pomyślał, gdy błyszczący Epson MX-82, z głośnym jękiem przesuwających się igieł, wypluł z siebie pierwszą stronę odezwy do kolegów. Poprawił okulary, oparł się o biurko swojego IBM-361 i z dumą odczytał:&lt;/p&gt;

&lt;blockquote&gt;&lt;h3&gt;O inżynierach, postępie i sławie&lt;/h3&gt;

&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://quiston.tpsa.com/blog/index.php/archives/862&quot;&gt;Alex&lt;/a&gt;, 8. czerwca roku pańskiego 2023&lt;/cite&gt;&lt;/p&gt;&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>Flattr</title>
   <link href="http://room-303.com/blog/2010/06/01/flattr/"/>
   <updated>2010-06-01T18:59:23+00:00</updated>
   <id>http://room-303.com/blog/2010/06/01/flattr</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://flattr.com/&quot;&gt;Flattr&lt;/a&gt; rozprzestrzenia się wirusowo. Ja swoje zaproszenie dostałem &lt;a href=&quot;http://princefool.blogspot.com/2010/05/flattr.html&quot;&gt;od Deejay'a&lt;/a&gt;. Jeszcze dwa można zdobyć u niego, trzy kolejne tutaj.&lt;/p&gt;

&lt;p&gt;Jeśli zatem lubicie dzielić się pieniędzmi (i wierzycie, że Flattr nie zniknie razem z nimi), przyłączcie się do tej jedynej w swoim rodzaju sieci wymiany napiwków. Po trzy zaproszenia zgłoście się w komentarzach — wyślę je na adres podany w formularzu.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Python: finanse</title>
   <link href="http://room-303.com/blog/2010/05/20/python-finanse/"/>
   <updated>2010-05-20T20:36:56+00:00</updated>
   <id>http://room-303.com/blog/2010/05/20/python-finanse</id>
   <content type="html">&lt;p&gt;Nie dalej jak wczoraj kolega podesłał mi łatkę do mojej &lt;a href=&quot;http://github.com/patrys/python-number-to-words-pl&quot;&gt;biblioteki do słownego zapisu liczb i kwot&lt;/a&gt;. Nie zdradzę od kogo, by chronić niewinnego. Grunt, że łatka wyglądała tak:&lt;/p&gt;

&lt;pre&gt;--- to_words_pl.py	(upstream)
+++ to_words_pl.py	(working copy)
@@ -82,7 +82,7 @@
         iteration += 1
     if unit:
         result.append(unit)
-    result.append(u'%d/100' % int(remainder * 100))
+    result.append(u'%d/100' % int(round(remainder * 100)))
     result = ' '.join(result)
     return result&lt;/pre&gt;

&lt;p&gt;Zdziwiłem się bardzo, bo zwykłem kwoty odpowiednio zaokrąglać do dwóch miejsc po przecinku. Co się jednak okazało? &lt;code&gt;0.48&lt;/code&gt; zamieniało się w &lt;code&gt;0.47&lt;/code&gt;. A dokładniej? W &lt;code&gt;0.47999999999999998&lt;/code&gt;. Tuś mi, ptaszku.&lt;/p&gt;

&lt;p&gt;Patrząc na &lt;code&gt;0.48&lt;/code&gt; tak naprawdę w głowie widziałem &lt;code&gt;decimal.Decimal('0.48')&lt;/code&gt;. Jak się jednak okazuje, niektórzy próbują operacje finansowe przeprowadzać na liczbach zmiennopozycyjnych. &lt;strong&gt;Nie używamy typu &lt;code&gt;float&lt;/code&gt; do operacji finansowych.&lt;/strong&gt; Dlaczego?&lt;/p&gt;

&lt;pre&gt;&amp;gt;&amp;gt;&amp;gt; 0.48
0.47999999999999998
&amp;gt;&amp;gt;&amp;gt; 0.82
0.81999999999999995&lt;/pre&gt;

&lt;p&gt;Do operacji na liczbach o znanej precyzji używamy typu &lt;code&gt;decimal.Decimal&lt;/code&gt; i jego kontrolowanego (i konfigurowalnego!) mechanizmu zaokrąglania:&lt;/p&gt;

&lt;pre&gt;&amp;gt;&amp;gt;&amp;gt; from decimal import Decimal
&amp;gt;&amp;gt;&amp;gt; Decimal('0.48') + Decimal('0.12')
Decimal('0.60')
&amp;gt;&amp;gt;&amp;gt; vat = Decimal('0.48') * Decimal('0.22')
&amp;gt;&amp;gt;&amp;gt; vat.quantize(Decimal('0.01'))
Decimal('0.11')&lt;/pre&gt;
</content>
 </entry>
 
 <entry>
   <title>Python: wyjątkowo głupi pomysł</title>
   <link href="http://room-303.com/blog/2010/05/13/python-wyjatkowo-glupi-pomysl/"/>
   <updated>2010-05-13T16:12:38+00:00</updated>
   <id>http://room-303.com/blog/2010/05/13/python-wyjatkowo-glupi-pomysl</id>
   <content type="html">&lt;p&gt;Nigdy nie róbcie tak:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;try:
    # ...
except FooException, e:
    # ...
    raise e&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Wyjątki przepuszcza się tak:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;try:
    # ...
except FooException:
    # ...
    raise&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Istotna różnica polega na niezniszczeniu całego stosu wywołań. Z góry dziękuję.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Faktury przez API</title>
   <link href="http://room-303.com/blog/2010/04/29/faktury-przez-api/"/>
   <updated>2010-04-29T13:56:14+00:00</updated>
   <id>http://room-303.com/blog/2010/04/29/faktury-przez-api</id>
   <content type="html">&lt;p&gt;Odkąd rozpocząłem współpracę z &lt;a href=&quot;http://mirumee.com/blog/&quot;&gt;Mirumee&lt;/a&gt;, w listach od moich czytelniczek wciąż powtarzało się jedno pytanie — &lt;q&gt;kiedy?&lt;/q&gt; W końcu zrobiłem jednak te badania, a blog to nie miejsce na dyskusje o moim życiu łóżkowym, dlatego dziś pomówimy o &lt;a href=&quot;http://centrumfaktur.pl/&quot;&gt;CentrumFaktur&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Co wybrałbyś zatem, gdyby zaoferowano ci body shot z ciała dowolnie wskazanej przez siebie kobiety¹ lub nieskrępowany dostęp do API pozwalającego szybko, łatwo i bezpiecznie wystawiać faktury z poziomu twojego programu?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;¹ Chciałem tu napisać, że panie mogą sobie wybrać mężczyznę, ale w ten sposób zmniejszyłbym szanse na to, że ktokolwiek wybierze API.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Mamy cholerną nadzieję, że nie lubisz tequili, bo w stworzenie tego API zainwestowaliśmy już sporo czasu. Nie owijając w bawełnę, przechodząc do meritum, bez ogródek i zbędnych ceregieli, waląc prosto z mostu i nie lejąc wody przedstawiam &lt;a href=&quot;http://centrumfaktur.pl/api/&quot;&gt;dokumentację API CentrumFaktur&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Zdradzę przy okazji, że odnośnikiem tym dzielę się z wami nieprzypadkowo. Wiem bowiem, że przeczytacie, bez wyjątku, wszystko, co tylko napiszę. I będzie się wam podobało. To moja strona i ja tu ustalam zasady.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Django: abstrakcji ciąg dalszy</title>
   <link href="http://room-303.com/blog/2010/04/27/django-abstrakcji-ciag-dalszy/"/>
   <updated>2010-04-27T09:33:38+00:00</updated>
   <id>http://room-303.com/blog/2010/04/27/django-abstrakcji-ciag-dalszy</id>
   <content type="html">&lt;p&gt;Tym razem inne podejście, naturalne dziedziczenie abstrakcyjnych modeli z dwoma dodatkowymi metodami.&lt;/p&gt;

&lt;p&gt;W przeciwieństwie do &lt;a href=&quot;http://room-303.com/blog/2010/04/22/django-zabawa-z-abstrakcja/&quot;&gt;poprzedniego przykładu&lt;/a&gt;, pozwala używać &lt;code&gt;super()&lt;/code&gt; w abstrakcyjnych klasach pośrednich.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;from django.db import models

class AbstractMixin(object):
    _classcache = {}

    @classmethod
    def contribute(cls):
        return {}

    @classmethod
    def construct(cls, *args, **kwargs):
        attrs = cls.contribute(*args, **kwargs)
        attrs.update({
            '__module__': cls.__module__,
            'Meta': type('Meta', (), {'abstract': True}),
        })
        key = (args, tuple(kwargs.items()))
        if not key in cls._classcache:
            clsname = (('%s%x' % (cls.__name__, hash(key)))
                       .replace('-', '_'))
            cls._classcache[key] = type(clsname, (cls, ), attrs)
        return cls._classcache[key]&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Przykład użycia:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;class CategoryFactory(models.Model, AbstractMixin):
    name = models.CharField(max_length=100)

    class Meta:
        abstract = True

    def __unicode__(self):
        return self.name

class ProductFactory(models.Model, AbstractMixin):
    name = models.CharField(max_length=100)

    class Meta:
        abstract = True

    @classmethod
    def contribute(cls, category):
        return {'category': models.ForeignKey(category)}

    def __unicode__(self):
        return u'%s / %s' % (self.category, self.name)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Konkretyzacja klas:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;class MyCategory(CategoryFactory.construct()):
    pass
 
class MyProduct(ProductFactory.construct(category=MyCategory)):
    pass&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Działa również nasz test:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;from . import models

c = models.MyCategory(name='cat')
p = models.MyProduct(name='prod', category=c)
print p # 'cat / prod'&lt;/code&gt;&lt;/pre&gt;
</content>
 </entry>
 
 <entry>
   <title>PIT 37</title>
   <link href="http://room-303.com/blog/2010/04/25/pit-37/"/>
   <updated>2010-04-25T14:22:47+00:00</updated>
   <id>http://room-303.com/blog/2010/04/25/pit-37</id>
   <content type="html">&lt;p&gt;Przychodzi taki moment, kiedy nie da się już odwlekać rozliczenia podatków. Ja swoją deklarację postanowiłem złożyć dopiero dzisiaj. Nie obyło się bez przygód.&lt;/p&gt;

&lt;h3&gt;Linux x86-64&lt;/h3&gt;

&lt;p&gt;e-Deklaracje wymagają Adobe AIR. Adobe AIR nie obsługuje 64-bitowego Linuksa. Tyle.&lt;/p&gt;

&lt;p&gt;Dane z poprzedniego roku (niezbędne do rozliczenia elektronicznego) udało się wydobyć ręcznie:&lt;/p&gt;

&lt;pre&gt;$ sqlite3 ~/.appdata/e-Deklaracje.*/Local\ Store/settings.dat 'SELECT xmlDocument FROM EDK_DECLARATIONS;'&lt;/pre&gt;

&lt;p&gt;Z Wine jest podobnie — jedyna wspierana architektura, to x86.&lt;/p&gt;

&lt;h3&gt;Linux x86&lt;/h3&gt;

&lt;p&gt;Adobe AIR 1.5 jest &lt;em&gt;zjebany&lt;/em&gt;, robi w środku &lt;em&gt;bardzo złe rzeczy&lt;/em&gt; (budowa plików .rpm z rozszerzeniem .deb i tym podobne) i nie działa nigdzie poza Fedorą.&lt;/p&gt;

&lt;p&gt;Adobe AIR 2.0 instaluje się bez problemu, przy okazji psując uprawnienia katalogów z ikonami, plikami .desktop i typami MIME. Adobe Reader 9 instaluje się bez problemów. e-Deklaracje uruchamiają się, pozwalają na stworzenie profilu i w zasadzie tyle. Proces &lt;code&gt;acroread&lt;/code&gt; zajmuje całą dostępną pamieć i moc procesora. Dziękujemy ci, Adobe.&lt;/p&gt;

&lt;h3&gt;Online&lt;/h3&gt;

&lt;p&gt;Ostatecznie rozliczyłem się w przeglądarce, za pomocą aplikacji &lt;a href=&quot;https://www.pitroczny.pl/pit?krs=0000070056&quot;&gt;pitroczny.pl&lt;/a&gt;¹. Polecam tę wersję — oszczędza nerwów, ma lepszy interfejs (nie wygląda jak zeskanowany PIT) i, przede wszystkim, działa.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;¹ Korzystając z tego odnośnika przeznaczasz 1% podatku na &lt;a href=&quot;http://www.nowoczesnapolska.org.pl/&quot;&gt;Fundację Nowoczesna Polska&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Django: zabawa z abstrakcją</title>
   <link href="http://room-303.com/blog/2010/04/22/django-zabawa-z-abstrakcja/"/>
   <updated>2010-04-22T20:22:45+00:00</updated>
   <id>http://room-303.com/blog/2010/04/22/django-zabawa-z-abstrakcja</id>
   <content type="html">&lt;p&gt;Zastanawialiśmy się ostatnimi czasy, w jaki sposób zbudować aplikację tak, by z jednej strony była uniwersalna (abstrakcyjne modele bazowe), a z drugiej zawierała całą niezbędną logikę. Problem polega na tym, że — z oczywistych względów — klucza obcego do modelu abstrakcyjnego stworzyć się nie da. Pozostaje więc zwalić pracę na programistę, który konkretyzuje abstrakcyjne prototypy, prawda?&lt;/p&gt;

&lt;p&gt;Dzisiaj do głowy przyszło mi rozwiązanie może nie do końca ładne, ale na pewno działające. Fabryka abstrakcyjnych modeli:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;from django.db import models

class AbstractModelMetaclass(type):
    def __new__(cls, name, bases, attrs):
        super_new = super(AbstractModelMetaclass, cls).__new__
        if bases == (object, ):
            return super_new(cls, name, bases, attrs)
        new_attrs = attrs.copy()
        module = attrs['__module__']
        new_cls = super_new(cls, name, bases, {'__module__': module})
        fields = getattr(new_cls, '_fields', {}).copy()
        for key, val in attrs.items():
            if key not in ['construct', '__new__']:
                fields[key] = val
        new_attrs['_fields'] = fields
        return super_new(cls, name, bases, new_attrs)

class AbstractModelFactory(object):
    __metaclass__ = AbstractModelMetaclass

    @staticmethod
    def construct():
        return {}

    def __new__(cls, *args, **kwargs):
        attrs = cls._fields.copy()
        attrs.update(cls.construct(*args, **kwargs))
        attrs['__module__'] = cls.__module__
        attrs['Meta'] = type('Meta', (), {'abstract': True})
        return type(cls.__name__, (models.Model, ), attrs)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Idea jest taka, że implementując swoją podklasę fabryki modeli mamy możliwość zadecydować o polach, jakie trafią do ostatecznego modelu. Dla lepszego zrozumienia, rozważmy abstrakcyjne klasy produktu i kategorii:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;class CategoryFactory(AbstractModelFactory):
    name = models.CharField(max_length=100)

    def __unicode__(self):
        return self.name

class ProductFactory(AbstractModelFactory):
    name = models.CharField(max_length=100)

    @staticmethod
    def construct(category):
        return {'category': models.ForeignKey(category)}

    def __unicode__(self):
        return u'%s / %s' % (self.category, self.name)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Skonkretyzujmy klasy własną implementacją:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;class MyCategory(CategoryFactory()):
    pass

class MyProduct(ProductFactory(category=MyCategory)):
    pass&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Upewnijmy się, że zależności działają prawidłowo:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;from . import models

c = models.MyCategory(name='cat')
p = models.MyProduct(name='prod', category=c)
print p # 'cat / prod'&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Oczywiście — ktoś zaraz powie — to samo można uzyskać tworząc funkcję zwracającą klasę zdefiniowaną w jej ciele. Można, ale nie da się po niej wygodnie dziedziczyć (rozszerzenie istniejącej fabryki).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Django: Pinax i Satchmo</title>
   <link href="http://room-303.com/blog/2010/04/18/django-pinax-i-satchmo/"/>
   <updated>2010-04-18T14:17:48+00:00</updated>
   <id>http://room-303.com/blog/2010/04/18/django-pinax-i-satchmo</id>
   <content type="html">&lt;p&gt;Obiecywałem w skrócie przedstawić &lt;q&gt;cuda&lt;/q&gt;, jakimi są oba projekty. Jak obiecałem, tak czynię.&lt;/p&gt;

&lt;h3&gt;Marketing kołem napędowym gospodarki&lt;/h3&gt;

&lt;p&gt;Oba projekty znałem od dość dawna z prasy, jaką zapewniają im deweloperzy i fani na wszelakich djangowych portalach, planetach i konferencjach. Na siłę używał ich nie będę — pomyślałem — ale może kiedyś się trafi okazja, to zobaczę, czym się tak wszyscy ekscytują. W bebechy nie zaglądałem, wiedziałem tylko, że jeden ma być uniwersalnym szkieletem dla wszelakich serwisów społecznościowych, a drugi klockami do budowy sklepów internetowych.&lt;/p&gt;

&lt;h3&gt;Bliskie spotkania I stopnia&lt;/h3&gt;

&lt;p&gt;Okazja się trafiła, choć nie taka, jak planowałem. Najpierw przyszło mi bowiem robić jedynie niewielkie poprawki we wdrożonym już serwisie opartym o Satchmo, później dopisać jakąś prostą aplikację do rozwijanej jeszcze społecznościówki, która do dzisiaj chyba nie dorobiła się ani wdrożenia, ani nawet nazwy.&lt;/p&gt;

&lt;p&gt;Działać to działało, pod maskę nie bardzo miałem czas zaglądać. Dalszy kontakt sprowadzał się głównie do czytania samych superlatyw o owych — chciałoby się rzec — przebłyskach geniuszu inżynierii programowania.&lt;/p&gt;

&lt;h3&gt;Pinax — pierwsza krew&lt;/h3&gt;

&lt;p&gt;Do czasu. Jeden z kontraktów z &lt;a href=&quot;http://mirumee.com/blog/&quot;&gt;Mirumee&lt;/a&gt; wymagał wbudowania w serwis podstawowych funkcji społecznościowych. Jednogłośnie zdecydowaliśmy się wypróbować Pinaksa.&lt;/p&gt;

&lt;p&gt;Miesiąc później mieliśmy już własny fork, z którego systematycznie usuwaliśmy kawałki takiego kodu, że starczyłoby na doktorat z architektury oprogramowania. Obejścia na workaroundy, zaślepki na hackach. Widoki z pominięciem formularzy rozbierające request na zmienne i bez żadnej walidacji pakujące je do bazy. Widoki pozwalające na edycję cudzych obiektów, jeśli tylko znało się ich &lt;code&gt;id&lt;/code&gt;. Aplikacje, które nie działały wcale, albo te działające częściowo, z resztą kodu wykomentowaną i otoczoną &lt;code&gt;FIXME&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Jedno jest pewne, zmarnowaliśmy na to masę czasu i jeśli będę musiał do Pinaksa podejść drugi raz, to tylko po to, żeby ze strzelbą pod pachą wyprowadzić go na tyły domu.&lt;/p&gt;

&lt;h3&gt;Początek przygody z Satchmo&lt;/h3&gt;

&lt;p&gt;Całkiem niedawno zostaliśmy z kolei zakontraktowani przez firmę z UK, która specjalizuje się w budowie sklepów internetowych w Satchmo. Niestety programiści odeszli tuż po rozpoczęciu projektu i ktoś musiał zadanie skończyć. Chciałem poznać Satchmo, teraz miałem okazję. A dokładniej dwa tygodnie na przerobienie garści plików PNG z projektami graficznymi na w pełni działające wdrożenie.&lt;/p&gt;

&lt;p&gt;Pierwsze dwa dni spędziłem na lekturze dokumentacji i doprowadzeniu kodu do działania na swojej maszynie. Szybko też okazało się, że Satchmo to taki sam zestaw klocków, jak Pinax czy — nie przymierzając — samochód. Oczywiście, można wymontować tylną kanapę i zmienić choinkę zapachową na lusterku, ale próba wyciągnięcia radia szybko pokazuje, że jest trwale przykręcone do kokpitu. Jakiekolwiek próby dopasowania sklepu do potrzeb sprzedawcy albo przypominają próbę ucharakteryzowania poloneza na ciągnik siodłowy z użyciem plasteliny, albo kończą się głęboką ingerencją w kod poszczególnych modułów.&lt;/p&gt;

&lt;h3&gt;I wtedy zaczęły się schody&lt;/h3&gt;

&lt;p&gt;Właśnie kontakt z modułami był pierwszym momentem, kiedy krzyknąłem &lt;q&gt;WTF&lt;/q&gt;. Kiedy pierwszy raz miałem kontakt z Satchmo, poszczególne moduły i aplikacje mieszkały we wspólnej przestrzeni nazw &lt;code&gt;satchmo&lt;/code&gt;. Okazuje się jednak, że ktoś wpadł na genialny pomysł zaoszczędzenia kilku literek i całość by działać musi zostać umieszczona bezpośrednio w ścieżce Pythona. Wielkie brawa za potencjalne konflikty nazw z innymi modułami Pythona oraz za zajęcie co bardziej oczywistych nazw dla lokalnych aplikacji projektu.&lt;/p&gt;

&lt;p&gt;To jednak nie koniec, szybko okazało się, że dokumentacja to tylko ciekawostka, a jakiekolwiek pojęcie o działaniu całości daje dopiero lektura kodu. Tam można znaleźć prawdziwe perełki.&lt;/p&gt;

&lt;h4&gt;Miłe złego początki&lt;/h4&gt;

&lt;p&gt;Na początku było śmiesznie:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;django&quot;&gt;{% for product in products %} 
    {% if forloop.first %} &amp;lt;ul&amp;gt;  {% endif %}
        &amp;lt;li&amp;gt;{% thumbnail product.main_image.picture 85x85 as image %}
        &amp;lt;a href=&quot;{{ product.get_absolute_url }}&quot;&amp;gt;&amp;lt;img src=&quot;{{ image }}&quot; width=&quot;{{ image.width }}&quot; height=&quot;{{ image.height }}&quot; /&amp;gt;&amp;lt;/a&amp;gt;
        &amp;lt;a href=&quot;{{ product.get_absolute_url }}&quot;&amp;gt;{{ product.translated_name }}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
    {% if forloop.last %} &amp;lt;/ul&amp;gt; {% endif %}
{% endfor %}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Oczywiście, zdarza się, że pierwszy i ostatni element listy występują gdzieś w środku, dlatego bezpieczniej sprawdzić wszystkie.&lt;/p&gt;

&lt;h4&gt;Powrót do przyszłości&lt;/h4&gt;

&lt;p&gt;Wkrótce okazało się, że system płatności dla niektórych operatorów wymaga dodatkowo podania daty wystawienia karty. Z tym, że data wystawienia i ważności oferują ten sam zestaw opcji: od stycznia bieżącego roku, do grudnia za cztery lata. Cóż, widać karty starsze niż trzy miesiące nie są zbyt popularne, za do zdarzają się w obrocie karty wystawione za dwa lata.&lt;/p&gt;

&lt;h4&gt;Działa doskonale, działa bez przerwy&lt;/h4&gt;

&lt;p&gt;A co powiecie na nieskończoną pętlę rekurencji właśnie w module płatności?&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;def confirm_info(request, template='shop/checkout/protx/confirm.html', extra_context={}):
    payment_module = config_get_group('PAYMENT_PROTX')
    controller = confirm.ConfirmController(request, payment_module)
    # ...
    controller.onForm = secure3d_form_handler
    controller.confirm()
    return controller.response

# ...

def secure3d_form_handler(controller):
    &quot;&quot;&quot;At the confirmation step, protx may ask for a secure3d authentication.  This method
    catches that, and if so, sends to that step, otherwise the form as normal&quot;&quot;&quot;
    
    if controller.processorReasonCode == '3DAUTH':
        # ...
        return http.HttpResponseRedirect(redirectUrl)
    
    return controller.onForm(controller)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ładnie, prawda?&lt;/p&gt;

&lt;h4&gt;Telekonkurs dla naszych widzów&lt;/h4&gt;

&lt;p&gt;Na koniec zagadka. Problem: podczas testów użytkownik opłacił za towar, ale na stronie z potwierdzeniem zamówienia pojawiła się informacja o nieudanej płatności. Rozwiązanie: okazuje się, że właściciel sklepu źle wypełnił pole na własny adres e-mail. Czy ktoś z was potrafi bez zaglądania w kod znaleźć logiczne powiązanie?&lt;/p&gt;

&lt;p&gt;Otóż pole na e-mail obsługi sklepu nie jest typu &lt;code&gt;EmailField&lt;/code&gt; i jest mu generalnie obojętne, jaką wartość się poda. System płatności zaś na koniec transakcji wysyła e-mail z potwierdzeniem na adres sklepu. W bloku o takiej konstrukcji:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;try:
    self.response = dict([row.split('=', 1) for row in result.splitlines()])

    # ...

    return ProcessorResult(self.key, success, detail, payment=payment)

except Exception, e:
    self.log.info('Error submitting payment: %s', e)
    payment = self.record_failure(order=order, amount=amount,
        transaction_id=&quot;&quot;, reason_code=&quot;error&quot;,
        details='Invalid response from payment gateway')&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To oczywiście nie koniec. W kodzie można znaleźć takie wynalazki, jak:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;obiekt &lt;code&gt;NOTSET&lt;/code&gt;, pełniący funkcję &lt;code&gt;None&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;aplikacja &lt;code&gt;livesettings&lt;/code&gt;, umożliwiająca softcoding rzeczy, które powinny być w kodzie (niektóre z nich wymagają do działania restartu usługi, to się dopiero nazywa ironia);&lt;/li&gt;
&lt;li&gt;bezmyślne zapychanie logów gdzie i czym popadnie;&lt;/li&gt;
&lt;li&gt;i wiele, wiele innych.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Odpręż się, to nie będzie bolało&lt;/h3&gt;

&lt;p&gt;Nie mam pojęcia, jak oba projekty wyrobiły sobie jakąkolwiek renomę. Pinax jest zwyczajnie niegroźną kupą kompostu, którą należy omijać z daleka albo mieć potem pretensję do samego siebie. Satchmo z kolei operuje cudzymi pieniędzmi.&lt;/p&gt;

&lt;p&gt;Czy nie byłoby lepiej zamiast chwalić się udanymi wdrożeniami (chyba, że jest to chwalenie się na zasadzie: &lt;q&gt;nie wiem jakim cudem, ale się udało&lt;/q&gt;), zająć się testowaniem własnego kodu? Już nie mówię nawet o poprawianiu go, żeby przypominał coś napisanego w Pythonie, wystarczy, żeby działała więcej niż jedna kombinacja, zaś zepsute i nietestowane od miesięcy moduły zostały w stosowny sposób oznaczone.&lt;/p&gt;

&lt;p&gt;Mówiąc w skrócie, jestem na &lt;q&gt;nie&lt;/q&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>twojastara.py</title>
   <link href="http://room-303.com/blog/2010/04/14/twojastara-py/"/>
   <updated>2010-04-14T13:28:27+00:00</updated>
   <id>http://room-303.com/blog/2010/04/14/twojastara-py</id>
   <content type="html">&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;fat = unicode
print type(ur'mom') is fat&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Tak, tak, poniżej krytyki. Za to już niedługo: seria niewyjaśnionych znalezisk w kodzie &lt;a href=&quot;http://www.satchmoproject.com/&quot;&gt;Satchmo&lt;/a&gt; (czyli jak Pythona używać nie należy).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Django: TestCase i testowanie szablonów</title>
   <link href="http://room-303.com/blog/2010/03/15/django-testcase-i-testowanie-szablonow/"/>
   <updated>2010-03-15T17:03:55+00:00</updated>
   <id>http://room-303.com/blog/2010/03/15/django-testcase-i-testowanie-szablonow</id>
   <content type="html">&lt;p&gt;Bardzo brzydki hack, oparty o &lt;a href=&quot;http://code.djangoproject.com/attachment/ticket/7611/7611.diff&quot;&gt;załącznik do ticketu 7611&lt;/a&gt;. Czyści wewnętrzny cache Django, ale pozwala testować działanie kodu opierającego się o renderowanie szablonów bez ryzyka, że aplikacja owe szablony nadpisze:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;import os
import sys
from django.conf import settings
from django.template import loader
from django.test import TestCase

class TemplateTestCase(TestCase):
    def _pre_setup(self):
        self._template_setup()
        super(TemplateTestCase, self)._pre_setup()

    def _post_teardown(self):
        self._template_teardown()
        super(TemplateTestCase, self)._post_teardown()

    def _template_setup(self):
        if hasattr(self, 'template_loaders'):
            self._old_template_loaders = settings.TEMPLATE_LOADERS
            settings.TEMPLATE_LOADERS = self.template_loaders
            loader.template_source_loaders = None
        if hasattr(self, 'template_dirs'):
            self._old_template_dirs = settings.TEMPLATE_DIRS
            test_dir = os.path.dirname(sys.modules[self.__module__].__file__)
            settings.TEMPLATE_DIRS = [os.path.join(test_dir, dirname)
                                      for dirname in self.template_dirs]

    def _template_teardown(self):
        if hasattr(self, '_old_template_loaders'):
            settings.TEMPLATE_LOADERS = self._old_template_loaders
            loader.template_source_loaders = None
        if hasattr(self, '_old_template_dirs'):
            settings.TEMPLATE_DIRS = self._old_template_dirs&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Użycie:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;class TestSomething(TemplateTestCase):
    template_loaders = ('django.template.loaders.app_directories.load_template_source',)

    def test_foo(self):
        pass&lt;/code&gt;&lt;/pre&gt;
</content>
 </entry>
 
 <entry>
   <title>Django: pluralize</title>
   <link href="http://room-303.com/blog/2010/03/03/django-pluralize/"/>
   <updated>2010-03-03T17:18:57+00:00</updated>
   <id>http://room-303.com/blog/2010/03/03/django-pluralize</id>
   <content type="html">&lt;p&gt;Najważniejszą rzeczą, jaką powinniście wiedzieć na temat filtra &lt;code&gt;pluralize&lt;/code&gt; jest ta, żeby go nigdy nie używać. &lt;em&gt;Nigdy&lt;/em&gt;. Jego istnienie wynika z lenistwa ludzi, którzy nigdy w życiu nie przygotowywali aplikacji do tłumaczenia. Jeśli nie wyraziłem się dość jasno, używanie filtra &lt;code&gt;pluralize&lt;/code&gt; wywoła u ciebie raka, stereoporoże i zatwardzenie rozsiane.&lt;/p&gt;

&lt;p&gt;Jakkolwiek sprytnie by nie wyglądał, ten kod nie nadaje się do niczego:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;django&quot;&gt;&amp;lt;p&amp;gt;
    There 
     thing.
&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Dlaczego się nie nadaje? Spróbujcie go przetłumaczyć na kilka języków. Niektórzy chwytają się &lt;a href=&quot;http://code.google.com/p/django-pluralize-pl/&quot;&gt;brzydkich obejść&lt;/a&gt;, inni wolą zrobić to zgodnie ze sztuką. Jeśli kiedykolwiek pracowaliście przy lokalizacji oprogramowania, doskonale wiecie, że tłumaczenie jednego słowa jest tak samo sensowne, jak tłumaczenie każdej litery z osobna.&lt;/p&gt;

&lt;p&gt;Poprawna wersja jest przy okazji czytelna:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;django&quot;&gt;&amp;lt;p&amp;gt;
{% blocktrans count item_count as items %}
    There is {{ items }} thing.
{% plural %}
    There are {{ items }} things.
{% endblocktrans %}
&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;{% blocktrans %}&lt;/code&gt; z &lt;code&gt;{% plural %}&lt;/code&gt; używają &lt;code&gt;ungettext&lt;/code&gt;, dzięki czemu bez konieczności odprawiania czarów radzą sobie z polskimi liczebnikami (&lt;q&gt;jeden tysiąc, dwa tysiące, pięć tysięcy&lt;/q&gt;).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Python: alternatywa dla dict.update</title>
   <link href="http://room-303.com/blog/2010/02/26/python-alternatywa-dla-dict-update/"/>
   <updated>2010-02-26T15:42:15+00:00</updated>
   <id>http://room-303.com/blog/2010/02/26/python-alternatywa-dla-dict-update</id>
   <content type="html">&lt;p&gt;Kolejny skrót. Dość regularny przypadek zwrócenia sumy słowników bez niszczenia któregokolwiek z nich:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;def foo(bar, baz):
    tmpdict = dict(bar)
    tmpdict.update(baz)
    return tmpdict&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Można również rozwiązać inaczej, korzystając z faktu, że &lt;code&gt;dict&lt;/code&gt; akceptuje nazwane parametry:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;def foo(bar, baz):
    return dict(bar, **baz)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Korzystając ze skrótów zawsze upewnij się, że na pierwszy rzut oka wiadomo, co dany kod robi.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Django: direct_to_template</title>
   <link href="http://room-303.com/blog/2010/02/25/django-direct_to_template/"/>
   <updated>2010-02-25T23:36:23+00:00</updated>
   <id>http://room-303.com/blog/2010/02/25/django-direct_to_template</id>
   <content type="html">&lt;p&gt;Nie wiem, czemu niektórzy tak uparcie korzystają z funkcji &lt;code&gt;render_to_response&lt;/code&gt;, by za każdym razem przekazać do niej ręcznie stworzony obiekt kontekstu. Zresztą, sami oceńcie, która wersja jest ładniejsza:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;from django.shortcuts import render_to_response
from django.template import RequestContext

def foo(request):
    # ...
    return render_to_response('foo.html', {'bar': baz},
                              context_instance=RequestContext(request))&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Czy może:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;from django.views.generic.simple import direct_to_template

def foo(request):
    # ...
    return direct_to_template(request, 'foo.html', {'bar': baz})&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A teraz pomnóżcie to przez liczbę widoków w aplikacji.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Python: prawdziwy polimorfizm</title>
   <link href="http://room-303.com/blog/2010/02/13/python-prawdziwy-polimorfizm/"/>
   <updated>2010-02-13T15:47:50+00:00</updated>
   <id>http://room-303.com/blog/2010/02/13/python-prawdziwy-polimorfizm</id>
   <content type="html">&lt;p&gt;Taki weekendowy żarcik:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;#!/usr/bin/env python
import random

class Foo(random.choice([int, str, unicode, Exception])):
    pass

f = Foo('1')
print `f`&lt;/code&gt;&lt;/pre&gt;
</content>
 </entry>
 
 <entry>
   <title>O fontach raz jeszcze, czyli wielkość się liczy</title>
   <link href="http://room-303.com/blog/2010/02/10/o-fontach-raz-jeszcze-czyli-wielkosc-sie-liczy/"/>
   <updated>2010-02-10T15:04:31+00:00</updated>
   <id>http://room-303.com/blog/2010/02/10/o-fontach-raz-jeszcze-czyli-wielkosc-sie-liczy</id>
   <content type="html">&lt;p&gt;Z powodu występującego dzisiaj u mnie przesilenia kataru, zostałem zmuszony (dosłownie ze łzami w oczach) do zmiany wielkości fontów z 10 na 12 punktów. Później wspomniałem o tym kilku osobom, dodając, że nie rozróżniam liter poniżej 16 pikseli, co w dwóch przypadkach wywołało konsternację. Punkty i piksele to nie to samo.&lt;/p&gt;

&lt;p&gt;Punkt jest jednostką typograficzną pochodzącą ze standardu pica, który to stworzyli Amerykanie by zemścić się za nasz system metryczny. Według standardu okrągłe¹ dwanaście punktów (&lt;code&gt;pt&lt;/code&gt;) równe jest tytułowemu pica (&lt;code&gt;pc&lt;/code&gt;). Z kolei sześć pica równe jest jednemu calowi (&lt;code&gt;in&lt;/code&gt;). Jak wiemy cal to 2,54 centymetra (&lt;code&gt;cm&lt;/code&gt;), ale w tym przypadku nie jest to wiedza istotna.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;¹ Tak, bezczelnie naśmiewam się z systemu zbudowanego na wielokrotnościach liczby 6.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Co wiemy do tej pory: &lt;code&gt;72pt = 6pc = 1in = 2.54cm = 25.4mm&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Na szczęście rozdzielczość sprzętową (DPI) również zdefiniowali Amerykanie i liczymy ją w punktach na cal. W punktach ekranowych, czyli pikselach (nie w punktach typograficznych, o których mówiliśmy wcześniej). DPI jest parametrem konkretnego ekranu² i mówi nam, ile kolejnych pikseli (&lt;code&gt;px&lt;/code&gt;) ekranu należy zapalić, żeby długość powstałej linii wynosiła dokładnie jeden cal. Dla przykładu: rozdzielczość sprzętowa mojego laptopa wynosi 96 pikseli na cal, a mojego telefonu 260 pikseli na cal.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;² Oczywiście zakładając poprawną konfigurację systemu operacyjnego, nic nie stoi bowiem na przeszkodzie do wmówienia komputerowi, że jego ekran jest wielkości biurka czy stadionu.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Posiadając tę wiedzę, możemy zacząć przeliczać: &lt;code&gt;12pt = 12 × 1/72in = 12/72in × 96px/in = 16px&lt;/code&gt;. &lt;em&gt;Voilà!&lt;/em&gt; Teraz mogę spokojnie poumierać dalej.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Krzemowe kostki, czyli jak komputery zjadły RPG</title>
   <link href="http://room-303.com/blog/2010/02/07/krzemowe-kostki-czyli-jak-komputery-zjadly-rpg/"/>
   <updated>2010-02-07T02:14:39+00:00</updated>
   <id>http://room-303.com/blog/2010/02/07/krzemowe-kostki-czyli-jak-komputery-zjadly-rpg</id>
   <content type="html">&lt;p&gt;Kiedy byliśmy szczylami zupełnymi (pierwsze dwie klasy podstawówki), zagrywaliśmy się w Talizman, wtedy znany jedynie jako &lt;q&gt;Magia i miecz&lt;/q&gt;. Gra wciągała, ale z czasem zaczęliśmy szukać odmiany. Advanced Dungeons &amp;amp; Dragons okazało się strzałem w dziesiątkę, przynajmniej na jakiś czas.&lt;/p&gt;

&lt;p&gt;Niedługo później zaczęliśmy swoje pierwsze eksperymenty z &lt;q&gt;poważnymi&lt;/q&gt; RPG. Eksperymenty to dobre określenie, bo pierwsze spotkania dziesięciolatków z odbitym na ksero podręcznikiem do Warhammera (po angielsku) były dość nieporadne.&lt;/p&gt;

&lt;p&gt;Szybko jednak rozkręciliśmy się na tyle, że granie nie wymagało już posiłkowania się słownikiem (jeśli chodzi o angielski, to wszyscy byliśmy samoukami). W 1991 pojawiły się kserówki z tłumaczeniem Cyberpunka 2020. Na jakiś czas Warhammer poszedł w odstawkę &amp;mdash; przynajmniej jeśli chodziło o gry fabularne, bo figurki do bitewniaka skutecznie uszczuplały skromne zasoby finansowe całej grupy.&lt;/p&gt;

&lt;p&gt;Oczywiście grywaliśmy również na komputerze, ale ówczesne RPG dzieliły się na te z fabułą (jak np. Kult) i na te z &lt;em&gt;tabelkami&lt;/em&gt; (jak Eye of the Beholder). Nikomu wtedy nie przyszło do głowy kojarzyć role-play'u z paskiem doświadczenia.&lt;/p&gt;

&lt;p&gt;W papierowe gry fabularne graliśmy dużo i często, bo nie mieliśmy praktycznie żadnych obowiązków. W naszym repertuarze gościły kolejne systemy (Zew Cthulhu, Wampir: Maskarada), było dobrze. Gdzieś w tamtym czasie, na łamach pisma Magia i Miecz, pojawił się dziwoląg, który według obecnych standardów ktoś nazwać mógłby &lt;q&gt;klasycznym RPG&lt;/q&gt;: &lt;em&gt;Kryształy Czasu&lt;/em&gt;. Po raz pierwszy postać mistrza gry została sprowadzona do roli krupiera, który miał jedynie pilnować, by akcje graczy były zgodne z odpowiednimi tabelkami. Po jednej sesji daliśmy sobie spokój i wróciliśmy do tradycyjnych systemów.&lt;/p&gt;

&lt;p&gt;Niestety, pod koniec podstawówki grupa się rozpadła i na jakiś czas szlag trafił granie. Kolejną ekipę znalazłem dopiero rok później. Pograliśmy razem niemal trzy lata, po czym nasze drogi się rozeszły.&lt;/p&gt;

&lt;p&gt;W tym czasie komputerowe gry RPG poszły naprzód. Diablo stało się kamieniem węgielnym gatunku hack&amp;amp;slash, jednak z grami fabularnymi nie łączyło go zbyt wiele. Za ciosem poszły jednak genialny Fallout oraz Wrota Baldura, które wielu stawia za przykład RPG idealnego. Ci ostatni chyba nie wiedzą, że prawdziwa perełka ukazała się dopiero w roku kolejnym. Mowa oczywiście o Planescape: Torment, który w cudownie odświeżający sposób zerwał z klasycznie pojmowanym światem fantasy.&lt;/p&gt;

&lt;p&gt;Mijały lata, a mi coraz trudniej było wrócić do papierowych RPG. Zdecydowana większość napotkanych graczy zdawała się traktować gry fabularne jak salonową wersję Diablo. Nie było już istotne, w jaki system gramy. Liczyło się to, żeby mieć wysokie wszystkie statystyki na karcie postaci. Nadeszły czasy, kiedy każdy rybak znał kung-fu, każdy chłop pisał w minimum trzech językach, a najczęstszym pytaniem do mistrza gry stało się &lt;q&gt;kiedy będziemy zabijać potwory?&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Innymi słowy historia zatoczyła pełne koło. Papierowe RPG wróciło do mojego punktu wyjścia, czyli ADnD. Komputery pozbawiły RPG dwóch pierwszych literek, została sama gra. Gra w licytowanie się na statystyki i dyskutowanie z mistrzem gry na temat tego, czy poziom 9 danej cechy oznacza już &lt;em&gt;megazajebistość&lt;/em&gt;, czy może warto jeszcze rzucić kostką.&lt;/p&gt;

&lt;p&gt;Na szczęście niektóre historie mają szczęśliwe zakończenia i za namową &lt;a href=&quot;http://jakotwojprawnik.com/&quot;&gt;swojej wspaniałej kobiety&lt;/a&gt; wracam powoli do grania w środowisku graczy, którzy cenią sobie również fabułę. Którzy potrafią rzuty kostką ograniczyć do absolutnego minimum i prowadzić przygody w duchu podręcznika, a nie traktując dosłownie każde jego zdanie. Męczymy nawet Google Wave z &lt;a href=&quot;http://gsc.stricte.net/&quot;&gt;Ciepłym&lt;/a&gt; i &lt;a href=&quot;http://najpiekniejszyreaktor.blogspot.com/&quot;&gt;Zenem&lt;/a&gt;, próbując użyć go jako platformy do grania. A nuż uda się wziąć odwet na komputerach? Jest nadzieja.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Intencją tej notki jest zapobieganie głupocie</title>
   <link href="http://room-303.com/blog/2010/01/27/intencja-tej-notki-jest-zapobieganie-glupocie/"/>
   <updated>2010-01-27T21:42:55+00:00</updated>
   <id>http://room-303.com/blog/2010/01/27/intencja-tej-notki-jest-zapobieganie-glupocie</id>
   <content type="html">&lt;p&gt;Za &lt;a href=&quot;http://prawo.vagla.pl/node/8906&quot;&gt;VaGlą&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Uważnie śledzę Wasze opinie, komentarze, pytania i wątpliwości. Zdecydowałem, że jeszcze raz przyjrzę się projektowanej ustawie. &lt;em&gt;Intencją mojego rządu jest zapobieganie wykorzystywania Internetu do rozpowszechniania pornografii dziecięcej, oszustw finansowych czy nielegalnych gier hazardowych, a nie ograniczanie wolności w sieci.&lt;/em&gt; Spróbujmy to razem pogodzić. W związku z tym zapraszam Was do debaty, która odbędzie się w przyszłym tygodniu.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;cite&gt;&lt;a href=&quot;http://www.premier.gov.pl/centrum_prasowe/wydarzenia/id:4042/&quot;&gt;List premiera do internautów&lt;/a&gt; (wyróżnienie moje)&lt;/cite&gt;&lt;/p&gt;

&lt;p&gt;Pytam się tedy, czy intencją rządu pana Tuska jest mord? Wszak nie zabronił on sprzedaży tasaków, pił, bejsboli, szpikulców do lodu, noży, a nawet widelców. To nie do pomyślenia, zupełnie jak gdybyśmy chcieli ułatwiać mordercom życie.&lt;/p&gt;

&lt;p&gt;Zapytuję, czy intencją rządu pana Tuska jest może gwałt? Parki nie wykarczowane, brak nakazu palenia światła przez całą dobę, w aptekach nadal sprzedają prezerwatywy, a w pobliskim sklepie widziałem spodnie z rozporkiem na suwak. To wszystko przecież okoliczności mogące się przyczynić.&lt;/p&gt;

&lt;p&gt;Rozdarty wobec tych obserwacji, wątpię ostatecznie, czy rząd pana Tuska planuje przeciwdziałać włamaniom. Łomy nadal bez zezwolenia, dorabianie kluczy dostępne dla ludu, a w Tesco sprzedają druciane wieszaki. Mało tego, dożyliśmy czasów, w których do kamienicy można wejść bez uprzedniej rewizji osobistej.&lt;/p&gt;

&lt;p&gt;Ludzie, czy wyście na łeb upadli?&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Kolejny film: Avatar</title>
   <link href="http://room-303.com/blog/2010/01/26/kolejny-film-avatar/"/>
   <updated>2010-01-26T23:49:18+00:00</updated>
   <id>http://room-303.com/blog/2010/01/26/kolejny-film-avatar</id>
   <content type="html">&lt;p&gt;Tak, to znów ten czas, kiedy wracam z kina. Tym razem, za namową wielu, udaliśmy się obejrzeć kolejną ofiarę Jamesa Camerona, czyli człowieka, który nie zrobił dobrego filmu od czasów Obcego i Terminatora. Tak, wiem, że niektórym podobały się również jego późniejsze dzieła, ale jakoś nigdy nie byłem fanem muzyki Celine Dion.&lt;/p&gt;

&lt;p&gt;Żeby zaoszczędzić czasu, zacznę od marudzenia, a potem sobie pooglądacie dla równowagi puchate króliczki w internecie i świat znów stanie się piękny. Na początek kwestia techniczna.&lt;/p&gt;

&lt;p&gt;Drodzy filmowcy, oko ludzkie samo doskonale radzi sobie z ograniczaniem głębi ostrości. Rozumiem, że nie stać was na precyzyjne renderowanie kilometr w głąb sceny, ale jeśli rozmyte jest 90% pierwszego planu i do ostrego widzenia konieczne jest skupienie się na nosie głównego bohatera, to zamiast rewolucji zafundowaliście widzom &lt;em&gt;pieprzony ból głowy&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Lepsze efekty 3D mieliśmy na domowych pecetach w 2004 roku. Za dowód niech posłuży fakt, że wtedy potrafiłem bez cienia migreny spędzić 24 godziny w tak zwanych &lt;q&gt;shutter glasses&lt;/q&gt; przy partyjce Operacji Flashpoint (z 2001 roku!). A zapewniam, że prócz okularów powodów do migreny mieliśmy całą skrzynkę.&lt;/p&gt;

&lt;p&gt;Co zaś się samej fabuły tyczy, najkrótsza recenzja Avatara, jaką znam, to &lt;q&gt;Pokahontas w kosmosie&lt;/q&gt;. Coś w tym jest, mi jednak uparcie kojarzył się inny film:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://room-303.com/blog/wp-content/uploads/2010/01/Kaena.jpg&quot; alt=&quot;&quot; title=&quot;Kaena&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Cała reszta to muzyka z &lt;q&gt;Króla lwa&lt;/q&gt; czy innej &lt;q&gt;Księgi dżungli&lt;/q&gt; oraz przemowy aż proszące się o łopoczącą w tle flagę USA. Disney pełną gębą. Jeśli ktoś po wizycie w kinie spodziewał się rewolucji, to chyba po nieświeżym popcornie.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Django: szybszy SQLite do testów</title>
   <link href="http://room-303.com/blog/2010/01/22/django-szybszy-sqlite-do-testow/"/>
   <updated>2010-01-22T12:18:37+00:00</updated>
   <id>http://room-303.com/blog/2010/01/22/django-szybszy-sqlite-do-testow</id>
   <content type="html">&lt;p&gt;Domyślna konfiguracja SQLite każe mu synchronizować plik bazy po każdej operacji. W środowiskach testowych nie musimy się martwić o spójność danych w wypadku awarii, poniżej zamieszczam więc backend pozbawiony zbędnego narzutu:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;from django.db.backends.sqlite3.base import (
    DatabaseWrapper as Sqlite3Wrapper,
    DatabaseError,
    IntegrityError,
    DatabaseFeatures,
    DatabaseOperations,
)

class DatabaseWrapper(Sqlite3Wrapper):
    def _cursor(self):
        new_conn = self.connection is None
        cursor = super(DatabaseWrapper, self)._cursor()
        if new_conn:
            cursor.execute('PRAGMA synchronous=OFF')
        return cursor&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;W przypadku projektu, nad którym właśnie pracujemy, czas przebudowania bazy od nowa na partycji XFS &lt;em&gt;spadł z półtorej minuty do pięciu sekund&lt;/em&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Sherlock House i doktor Wilson</title>
   <link href="http://room-303.com/blog/2010/01/19/sherlock-house-i-doktor-wilson/"/>
   <updated>2010-01-19T23:57:51+00:00</updated>
   <id>http://room-303.com/blog/2010/01/19/sherlock-house-i-doktor-wilson</id>
   <content type="html">&lt;p&gt;Właśnie wróciliśmy z seansu najnowszego Holmesa. Wróć, Sherlocka. Zanim jednak zacznę torturować ofiarę &amp;mdash; prezent dla zmotoryzowanych: tylko teraz razem z poniższym tekstem otrzymasz &lt;em&gt;nowiutkie spoilery&lt;/em&gt;. Czas promocji ograniczony!&lt;/p&gt;

&lt;p&gt;Zostaliście ostrzeżeni.&lt;/p&gt;

&lt;p&gt;Już od pierwszych kilku minut filmu staje się jasne, że główny bohater nie ma nic wspólnego z miłym panem w kraciastej czapce, jakiego znamy. Ma za to cięty język, krótki zarost i współlokatora, z którym robią sobie na złość, a którego związki niszczy z lubością. Do tego nie radzi sobie z kobietami, pije i zamyka się w sobie, kiedy tylko zabraknie mu ciekawych przypadków. Brzmi znajomo?&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://room-303.com/blog/wp-content/uploads/2010/01/house-bez-skrzypiec-w-tle.jpg&quot; alt=&quot;&quot; title=&quot;House, bez skrzypiec w tle&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I tak pozostaje przez cały film. Ale to jeszcze nie koniec nowego image'u, bowiem &lt;em&gt;skąd miałem wiedzieć, że ten gość to jakiś cholerny cygański Muhammad Ali?&lt;/em&gt;&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://room-303.com/blog/wp-content/uploads/2010/01/sherlock-snatch-holmes.jpg&quot; alt=&quot;&quot; title=&quot;Sherlock &amp;quot;Mickey&amp;quot; Holmes&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Nie, nie pomyliłem filmu.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Czy to zły film? Pewnie nie. Czy to zły Holmes? To jest &lt;em&gt;tragiczny&lt;/em&gt; Holmes &amp;mdash; sprowadzony do postaci kolejnego Indiany Jonesa. Właściwie to jest to wzorowy Indiana Jones. Źli dostają po ryjach, główny zły nosi płaszcz Gestapo, a w całym filmie nie ma ani śladu kosmity. Fanom powieści detektywistycznych polecam w zamian wypożyczyć niedościgniony dotąd Vidocq z 2001. roku.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Dla programistów: M+ MN Type-1</title>
   <link href="http://room-303.com/blog/2010/01/15/dla-programistow-m-mn-type-1/"/>
   <updated>2010-01-15T23:17:31+00:00</updated>
   <id>http://room-303.com/blog/2010/01/15/dla-programistow-m-mn-type-1</id>
   <content type="html">&lt;p&gt;&lt;q&gt;Cóż porabia w dzisiejszych czasach programista?&lt;/q&gt; pytacie mnie w rozlicznych listach, jakie nieustannie docierają na adres redakcji. Wydaje się, że najwierniejszymi fanami są pan Urząd Skarbowy oraz pan Zakład Ubezpieczeń Społecznych. Drodzy Urzędzie i Zakładzie, szukałem fontów.&lt;/p&gt;

&lt;p&gt;&lt;q&gt;Czcionek!&lt;/q&gt; &amp;mdash; wyczuwam oburzenie rodzące się w głowie pana w drugim rzędzie, który po chwili jednak pąsowieje, przypominając sobie, że czcionką nazywamy fizyczny nośnik kroju. Taką, &lt;em&gt;pardon&lt;/em&gt;, metalową wersję połówki ziemniaka  &amp;mdash; zupełnie nieinformatyczny temat, nieprawdaż?&lt;/p&gt;

&lt;p&gt;Fontów szukałem w celach bardziej naukowych, niż artystycznych czy użytkowych, jednak poszukiwania te przyniosły dość nieoczekiwany rezultat. Postanowiłem mianowicie odświeżyć swoją znajomość z &lt;a href=&quot;http://mplus-fonts.sourceforge.jp/mplus-outline-fonts/design/index-en.html&quot;&gt;rodziną M&lt;sup&gt;+&lt;/sup&gt;&lt;/a&gt;, którą zapewne wszyscy doskonale znacie.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Tu następuje dramatyczna pauza, dzięki której wszyscy słyszą, kto w pośpiechu nadrabia zaległości&amp;hellip;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Teraz już wszyscy zdecydowanie kiwacie głową, dyskretnie zerkając, czy koleżanka przy biurku po prawej domyśla się prawdy, a ja wprawiam was w większe jeszcze zakłopotanie, przypominając, że chodzi o programistów. Postanowiłem mianowicie tytułowego &lt;em&gt;M+ MN Type-1&lt;/em&gt; użyć w charakterze systemowej czcionki o stałej szerokości. Efekt? Pierwsze objawy uzależnienia.&lt;/p&gt;

&lt;p&gt;Zobaczcie zresztą sami (pionowa linia wyznacza granicę 80 kolumn):&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://room-303.com/blog/wp-content/uploads/2010/01/mplus.png&quot; alt=&quot;&quot; title=&quot;M+ MN Type-1&quot; width=&quot;600&quot; height=&quot;300&quot; class=&quot;alignnone size-full wp-image-740&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Dla porównania Droid Sans Mono:&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://room-303.com/blog/wp-content/uploads/2010/01/droid.png&quot; alt=&quot;&quot; title=&quot;droid&quot; width=&quot;600&quot; height=&quot;255&quot; class=&quot;alignnone size-full wp-image-741&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;q&gt;Toż to wygląda, jak moje pierwsze ATARI&lt;/q&gt; zakrzykną na widok drugiego obrazka ci bardziej spostrzegawczy, a słuszności ich słowom odmówić nie sposób. Idźcie przeto i krzewcie dobrą nowinę pośród ludu swego. Czyż nie zostało bowiem powiedziane &lt;q&gt;poznasz programistę złego po rozlazłym foncie jego?&lt;/q&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Styczniowe zmiany w Centrum Faktur</title>
   <link href="http://room-303.com/blog/2010/01/14/styczniowe-zmiany-w-centrum-faktur/"/>
   <updated>2010-01-14T16:37:22+00:00</updated>
   <id>http://room-303.com/blog/2010/01/14/styczniowe-zmiany-w-centrum-faktur</id>
   <content type="html">&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://mirumee.com/blog/2010/01/14/platnosci-wyszukiwanie-faktury-zaliczkowe-i-wiele-wiecej/&quot;&gt;&lt;img src=&quot;http://mirumee.com/blog/wp-content/uploads/iteration1_general.png&quot; alt=&quot;CentrumFaktur - Faktury i oferty. Lepiej.&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dzisiaj &amp;mdash; dokładnie miesiąc po ostatniej aktualizacji &amp;mdash; udostępniliśmy kolejną aktualizację &lt;a href=&quot;http://centrumfaktur.pl/&quot;&gt;CentrumFaktur&lt;/a&gt;. Między innymi pojawiły się faktury zaliczkowe, o które część z was prosiła.&lt;/p&gt;

&lt;p&gt;Więcej informacji na &lt;a href=&quot;http://mirumee.com/blog/2010/01/14/platnosci-wyszukiwanie-faktury-zaliczkowe-i-wiele-wiecej/&quot;&gt;blogu Mirumee&lt;/a&gt;. A teraz, jako że nadal nie jestem właścicielem CentrumFaktur, czas usiąść do kolejnego projektu.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Cmentarnie: GRUB i GRUB2</title>
   <link href="http://room-303.com/blog/2010/01/12/cmentarnie-grub-i-grub2/"/>
   <updated>2010-01-12T21:49:56+00:00</updated>
   <id>http://room-303.com/blog/2010/01/12/cmentarnie-grub-i-grub2</id>
   <content type="html">&lt;p&gt;Wczoraj, za namową &lt;a href=&quot;http://pozar-w-burdelu.blogspot.com/&quot;&gt;qwiata&lt;/a&gt;, zrobiłem kolejną przymiarkę do drugiego wcielenia &lt;a href=&quot;http://www.gnu.org/software/grub/&quot;&gt;GRUBa&lt;/a&gt;. Tym razem zakochałem się niemal i nie chcę za nic wracać.&lt;/p&gt;

&lt;p&gt;Automatyka wykrywająca konfigurację PLD działa znakomicie, a po napotkanych dawniej błędach w okolicach obsługi LVM nie pozostał nawet ślad. Na poparcie swojego stanowiska wspomnę tylko, że dziś rano, pierwszy raz od lat, pozbyłem się partycji &lt;code&gt;/boot&lt;/code&gt;. Dotąd musiałem trzymać osobną, 30-megabajtową partycję na &lt;code&gt;ext2&lt;/code&gt;, gdyż pierwsze wcielenie GRUBa nie radziło sobie ani z &lt;code&gt;xfs&lt;/code&gt;, ani z LVM.&lt;/p&gt;

&lt;h4&gt;Howto&lt;/h4&gt;

&lt;p&gt;Instalacja:&lt;/p&gt;

&lt;pre&gt;# grub-install /dev/sda
# grub-setup '(hd0)'
# update-grub&lt;/pre&gt;

&lt;p&gt;Po zmianie jądra:&lt;/p&gt;

&lt;pre&gt;# update-grub&lt;/pre&gt;

&lt;p&gt;Ten ostatni krok już niedługo stanie się zbędny.&lt;/p&gt;

&lt;p&gt;Jeśli ktoś jeszcze zwleka, to naprawdę nie ma na co czekać. Oczywiście, są jeszcze użytkownicy LILO, ale ich szanujemy. Jeśli pozostałe projekty GNU będą rozwijać się tak prężnie, to są szanse na używalną wersję HURD jeszcze zanim przepełni się 32-bitowy znacznik czasu ;)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Piwo</title>
   <link href="http://room-303.com/blog/2010/01/03/postaw-piwo/"/>
   <updated>2010-01-03T17:35:53+00:00</updated>
   <id>http://room-303.com/blog/2010/01/03/postaw-piwo</id>
   <content type="html">&lt;form action=&quot;https://www.paypal.com/cgi-bin/webscr&quot; method=&quot;post&quot;&gt;
&lt;p&gt;&lt;input type=&quot;hidden&quot; name=&quot;cmd&quot; value=&quot;_s-xclick&quot; /&gt;&lt;input type=&quot;hidden&quot; name=&quot;hosted_button_id&quot; value=&quot;10900657&quot; /&gt;Jeśli uważasz, że zasłużyłem, &lt;input type=&quot;submit&quot; value=&quot;Postaw mi piwo&quot; /&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;https://www.paypal.com/pl_PL/i/scr/pixel.gif&quot; width=&quot;1&quot; height=&quot;1&quot; style=&quot;visibility: hidden;&quot; /&gt;&lt;/p&gt;
&lt;/form&gt;
</content>
 </entry>
 
 <entry>
   <title>Życzenia na nowy rok</title>
   <link href="http://room-303.com/blog/2009/12/31/zyczenia-na-nowy-rok/"/>
   <updated>2009-12-31T14:04:35+00:00</updated>
   <id>http://room-303.com/blog/2009/12/31/zyczenia-na-nowy-rok</id>
   <content type="html">&lt;p&gt;Jak wszyscy, to ja też. Tylko nieco bardziej przyziemnie. Nie życzę sobie nowych startupów, chrupiących podkładek i web3.0.&lt;/p&gt;

&lt;p&gt;Chciałbym przede wszystkim, żeby nasze wspaniałe prawo zaczęło nadążać za realiami, a nie tylko szukać nowych stanowisk pracy dla urzędników. Żeby prawodawcy obudzili się jutro z potężnym kacem i w chwili refleksji pomiędzy Ibupromem a sedesem zadali sobie jedno zajebiście ważne pytanie: &lt;q&gt;po jaką cholerę?&lt;/q&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Dlaczego faktura elektroniczna wymaga podpisu kwalifikowanego, gdy na papierowej nie potrzeba nawet pieczątki?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I po co nam instytucja faktury elektronicznej, wszak istotę faktury VAT stanowi jej zawartość, nie forma. Czy powinniśmy spodziewać się oddzielnej regulacji &lt;q&gt;faktury na różowym papierze z logo firmy w prawym górnym rogu&lt;/q&gt;?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Po co nam &lt;a href=&quot;http://room-303.com/blog/2008/05/06/podpisywanie-elektronicznych-podan/&quot;&gt;imienny certyfikat&lt;/a&gt; przy składaniu podań? Przecież to sprzętowy odpowiednik podpisu potwierdzonego notarialnie (choć ustawa jest innego zdania, bo notariusze z czegoś żyć muszą), a wymagamy go w miejscach, które tradycyjnie parafuje się rozmazanymi bazgrołami.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dlaczego jednostki państwowe i podległe resortom państwa demokratycznego, finansowanego z moich pieniędzy, mogą legalnie zamówić oprogramowanie z wyłącznym prawem użytku (co powoduje, że dwa resorty płacą dwa razy za to samo)?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dlaczego w ogóle wolno im zamówić wykonanie oprogramowania od podstaw w taki sposób, że państwo (nawet sama instytucja rządu, nie wspominając o obywatelach) nie posiada żadnych praw do dysponowania powstałym w ten sposób kodem? Czy da się ich ustawowo zmusić do użycia jednej z &lt;a href=&quot;http://www.opensource.org/licenses/alphabetical&quot;&gt;licencji zaakceptowanych przez OSI&lt;/a&gt;?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Czemu każdy urząd &amp;mdash; nawet w wersji elektronicznej &amp;mdash; wymaga ode mnie podania wszelkich danych osobowych do pokolenia wstecz, podczas gdy jedna z pierwszych rubryk to PESEL? Czy w dobie szczególnej ochrony danych osobowych każdy urzędnik musi wiedzieć, gdzie mieszkam i jak ma na drugie imię mój ojciec? I czemu zaraz obok pola na PESEL muszę podać datę urodzenia?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Wstęp do kultury: nie drzyj mordy</title>
   <link href="http://room-303.com/blog/2009/12/21/wstep-do-kultury-nie-drzyj-mordy/"/>
   <updated>2009-12-21T12:57:45+00:00</updated>
   <id>http://room-303.com/blog/2009/12/21/wstep-do-kultury-nie-drzyj-mordy</id>
   <content type="html">&lt;p&gt;Jest sobie mielonka i jest &lt;em&gt;mielonka&lt;/em&gt;. Rzadko trafia mi się spam tak bezczelny, jak ten, który otrzymałem już &lt;em&gt;po raz drugi w ciągu ośmiu godzin&lt;/em&gt;. W pierwszym zdaniu czytam:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;PROSZĘ O PRZEKAZANIE NINIEJSZEGO LISTU OSOBIE DECYDUJĄCEJ W PAŃSTWA FIRMIE O SPOSOBACH POZYSKIWANIA KLIENTÓW DLA WASZEJ AGENCJI&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;To ci nowa kultura &amp;mdash; nawet dziwka powie &lt;q&gt;dzień dobry&lt;/q&gt; zanim wypnie dupę. To, że jestem osobą prywatną i żadnej działalności, tradycyjnie nikomu nie przeszkadza. Patrzę tedy, któż mi takie ścierwo podrzuca. I co widzę?&lt;/p&gt;

&lt;p&gt;Marian Tuleja, pułkownik&amp;hellip; wróć! &lt;a href=&quot;http://www.malina.net.pl/&quot; rel=&quot;nofollow&quot; title=&quot;Spam&quot;&gt;Sybilla Malina Wąsowska&lt;/a&gt;, &lt;em&gt;copywriter&lt;/em&gt;. &lt;a href=&quot;http://orlyehowl.ytmnd.com/&quot;&gt;O r'lyeh&lt;/a&gt;? Tak oto wygląda bowiem reszta owoców pracy zawodowego kopyrajtera (z zachowaniem pisowni i składu):&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Szanowni Państwo, jestem w posiadaniu interesujących moim zdaniem baz danych (wyspecyfikowane poniżej). Na początku listy wypisane są bazy, którymi z pewnością powinni być Państwo zainteresowani:)&lt;/p&gt;

&lt;p&gt;Największe koncerny w Polsce, 1029 rekordów, pełne dane teleadresowe wraz z imieniem i nazwiskiem osoby decyzyjnej 1029&lt;br /&gt;
farmaceutyczne koncerny, 339 rekordów, imię i nazwisko osoby decyzyjnej, adres email bezpośredni do niej i nazwa firmy 339&lt;br /&gt;
koncerny i firmy (głównie żywnościowe), 3217 rekordów, pełne dane teleadresowe wraz z imieniem i nazwiskiem osoby decyzyjnej 3217&lt;br /&gt;
producenci i dystrybutorzy energii 6414&lt;br /&gt;
spółki akcyjne 1172 rekordy, tylko adres email 1172&lt;br /&gt;
producenci produktów dla kobiet 3710 rekordów, tylko adres email 3710&lt;br /&gt;
media i wydawnictwa 1266 rekordów, tylko adres email 1266&lt;br /&gt;
urzędy miast i gmin 528 rekordów, tylko adres email 528&lt;/p&gt;

&lt;p&gt;drukarnie niemieckie 2641&lt;br /&gt;
drukarnie polskie 13168&lt;br /&gt;
drukarnie szwedzkie 2910&lt;/p&gt;

&lt;p&gt;adwokaci, 230 rekordów, tylko adres email 230&lt;br /&gt;
biura podatkowe, 6117 rekordów, pełne dane teleadresowe wraz z imieniem i nazwiskiem osoby decyzyjnej 6117&lt;br /&gt;
deweloperzy 822 rekordy, pełne dane teleadresowe wraz z imieniem i nazwiskiem osoby decyzyjnej 822&lt;br /&gt;
elektroinstalatorzy 4282 rekordy, dane teleadresowe wraz z imieniem i nazwiskiem osoby decyzyjnej 4282&lt;br /&gt;
firmy mazowieckie i z województwa śląskiego, 9672 rekordy, tylko nazwa firmy i adres email 9672&lt;br /&gt;
hotele 2377 rekordów, pełne dane teleadresowe wraz z imieniem i nazwiskiem osoby decyzyjnej 2377&lt;br /&gt;
hurtownie elektroinstalacyjne 1407 rekordów, pełne dane teleadresowe wraz z imieniem i nazwiskiem osoby decyzyjnej 1407&lt;br /&gt;
instalatorzy 1592 rekordy, pełne dane teleadresowe wraz z imieniem i nazwiskiem osoby decyzyjnej 1592&lt;br /&gt;
kultura agencje artystyczne i eventowe 4673 rekordów, tylko adres email 4673&lt;br /&gt;
niesklasyfikowane 16932 rekordy, tylko adres email 16932&lt;br /&gt;
polityka sprawy społeczne 750 rekordów, tylko adres email 750&lt;br /&gt;
Producenci tablic 266 rekordów, pełne dane teleadresowe ale bez nazwisk osób decyzyjnych 266&lt;br /&gt;
Projektanci 6571 rekordów, pełne dane teleadresowe wraz z imieniem i nazwiskiem osoby decyzyjnej 6571&lt;br /&gt;
Spółdzielnie mieszkaniowe 1486 rekordów, pełne dane teleadresowe 1400&lt;br /&gt;
Stacje obsługi 3257 rekordów, pełne dane teleadresowe wraz z imieniem i nazwiskiem osoby decyzyjnej 3257&lt;br /&gt;
szkoły wyższe 514 rekordów, tylko adres email 514&lt;br /&gt;
webmastrerzy i agencje interaktywne 779 rekordów, tylko adres email 779&lt;br /&gt;
Wodociągi 2010 rekordów, pełne dane teleadresowe wraz z imieniem i nazwiskiem osoby decyzyjnej 2010&lt;br /&gt;
architekci 3223&lt;br /&gt;
biura projektowe 10616&lt;br /&gt;
drewno klienci końcowi 719&lt;br /&gt;
drewno maszyny do obróbki przedstawiciele 259&lt;br /&gt;
metal klienci końcowi 968&lt;br /&gt;
metal maszyny do obróbki przedstawiciele 267&lt;br /&gt;
tworzywa sztuczne maszyny przedstawiciele 186&lt;br /&gt;
zachodniopomorskie komputery 705&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Się znamienita copywriterka napracowała, prawda? Nominacja do Pulitzera to tylko kwestia czasu, kiedy spam dotrze do komisji. Na koniec zaś próba udowodnienia, że powyższe nie stanowi oferty:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Czy chcieliby Państwo otrzymać ofertę cenową na zakup powyższej bazy?&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Wiesz co? Odpowiem kolejnym cytatem z Ciała: &lt;q&gt;idź przypudrować nos&lt;/q&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Dla odmiany religijnie</title>
   <link href="http://room-303.com/blog/2009/12/19/dla-odmiany-religijnie/"/>
   <updated>2009-12-19T21:24:24+00:00</updated>
   <id>http://room-303.com/blog/2009/12/19/dla-odmiany-religijnie</id>
   <content type="html">&lt;p&gt;Cóż, człowiekowi różne rzeczy przychodzą do głowy. Ostatnio przyśnił mi się &lt;a href=&quot;http://blogs.gnome.org/patrys/2009/12/18/ambient-music-daemon/&quot;&gt;dynamiczny soundtrack do komputera&lt;/a&gt;. Dziś co prawda nie chodzi o sen, ale powrót z zakupów przyniósł nieoczekiwanie pytanie natury religijnej.&lt;/p&gt;

&lt;p&gt;Tradycyjna zasadzka na wierzących: czy teoretycznie rozważana wszechmogąca istota byłaby w stanie stworzyć kamień, którego nie będzie w stanie podnieść? Stare i skuteczne, prawda?&lt;/p&gt;

&lt;p&gt;A czy root jest w stanie stworzyć plik, którego nie będzie w stanie przeczytać? Oczywiście. Może też prawo czytania owego pliku sobie przywrócić. Taką ładną pułapkę logiczną sobie popsułem.&lt;/p&gt;

&lt;p&gt;PS: Ci, którzy spodziewali się notki informatycznej, mogą w zastępstwie poczytać sobie &lt;a href=&quot;http://mirumee.com/blog/2009/12/18/python-bpython-i-django/&quot;&gt;o używaniu bpythona z Django&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Logika rozmyta, czyli o godnym przyjmowaniu krytyki</title>
   <link href="http://room-303.com/blog/2009/12/15/logika-rozmyta-czyli-o-godnym-przyjmowaniu-krytyki/"/>
   <updated>2009-12-15T14:22:00+00:00</updated>
   <id>http://room-303.com/blog/2009/12/15/logika-rozmyta-czyli-o-godnym-przyjmowaniu-krytyki</id>
   <content type="html">&lt;p&gt;&lt;em&gt;Disclaimer:&lt;/em&gt; Na wstępie chciałem ostrzec, że tekst dotyczy moich kontaktów z &lt;a rel=&quot;nofollow&quot; href=&quot;http://infakt.pl/&quot;&gt;InFaktem&lt;/a&gt;, który to serwis z racji umowy wiążącej mnie z &lt;a href=&quot;http://mirumee.com/blog/&quot;&gt;Mirumee&lt;/a&gt; niektórzy mogą uznać za moją konkurencję.&lt;/p&gt;

&lt;p&gt;Cenimy InFakt (i mówiąc &lt;q&gt;my&lt;/q&gt; nie mam na myśli &lt;q&gt;ja, właściciel CentrumFaktur&lt;/q&gt;, do czego jeszcze dojdziemy). Mamy również pełną świadomość tego, że sporo firm właśnie ich wybrało do wystawiania faktur. Udawanie, że jest inaczej, mijałoby się z celem. Tyle tytułem wstępu.&lt;/p&gt;

&lt;p&gt;Pojawili się pierwsi użytkownicy CentrumFaktur i razem z nimi pierwsze życzenia. Zupełnie nie byliśmy zdziwieni, kiedy ktoś wskazał na API InFaktu, prosząc o dodanie możliwości importu danych. Dostałem link do dokumentacji, dostałem dane dostępowe do konta, zabrałem się do pracy.&lt;/p&gt;

&lt;p&gt;Zaczęło się od dokumentacji, czy może raczej &lt;q&gt;dokumentacji&lt;/q&gt;. &lt;a href=&quot;http://infakt.pl/files/Infakt_pl_api_dokumentacja_ver_0.6.pdf&quot;&gt;Plik PDF&lt;/a&gt; ma bowiem 3,5 strony i przedstawia cały interfejs w pięciu &lt;em&gt;prostych&lt;/em&gt; punktach. Akcent na słowo &lt;q&gt;prostych&lt;/q&gt; pada celowo, gdyż autorowi udało się pominąć wiele jakże nudnych kwestii technicznych, skupiając się na szlifowaniu swego kunsztu literackiego.&lt;/p&gt;

&lt;p&gt;Chciałem niniejszym nominować API InFaktu do następujących wyróżnień:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;em&gt;Pierwsza dokumentacja API w XML, która nie zawiera ani jednego znaku &lt;q&gt;&amp;lt;&lt;/q&gt;&lt;/em&gt; &amp;mdash; to zadziwiające, ale autorowi udało się opisać aplikację XML bez choćby wspominania jej schematu.&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;Pierwsza dokumentacja API, gdzie strukturę XML zapisano w postaci tablicy mieszającej &lt;del&gt;PHP&lt;/del&gt; &lt;ins&gt;Rubiego&lt;/ins&gt;&lt;/em&gt; &amp;mdash; to również nie żart, spodziewam się, że wersja 0.7 w ramach dywersyfikacji wprowadzi również JSON i YAML.&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;Jedyna dokumentacja API, gdzie prawie wszystkie nazwy elementów zostały podane błędnie&lt;/em&gt; &amp;mdash; autor, choć zapomniał o udokumentowaniu struktury, przytacza nazwy elementów w rodzaju &lt;code&gt;&amp;lt;nazwa_firmy/&amp;gt;&lt;/code&gt;, zupełnie nie przeszkadza mu fakt, że w rzeczywistości element ten to &lt;code&gt;&amp;lt;nazwa-firmy/&amp;gt;&lt;/code&gt;.&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;Jedyne API, które do dostępu wymaga, oprócz klucza, podania loginu i hasła&lt;/em&gt; &amp;mdash; czemu nie chcemy używać loginu i hasła w dostępie do API? Aby w razie czego łatwo i bez ryzyka odciąć dany program. Zatem wprowadźmy klucze i wtedy wystarczy zmienić klucz, a autor aplikacji, nie znając loginu i hasła&amp;hellip; wróć, &lt;em&gt;o szit, o szit, o fak&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zamiast sensownego opisu, mamy &lt;q&gt;dokumentację przez implementację&lt;/q&gt;. &lt;q&gt;Dokumentację&lt;/q&gt; postanowiłem zatem w skrócie nazywać &lt;q&gt;doku&lt;/q&gt;. W skrócie od &lt;q&gt;do kurwy nędzy&lt;/q&gt;. Cóż, przynajmniej nie użyli SOAP (którego to protokołu nazwa słusznie sugeruje rozkosze kojarzone ze schylaniem się pod prysznicem). Bywa i tak, damy radę. Rach-ciach-ciach i&amp;hellip; dupa.&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;401 Unauthorized&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;No nie wierzę, że nie umiem w trzech linijkach zrobić Basic Auth.&lt;/p&gt;

&lt;p&gt;Sprawdzam ponownie, kod wygląda ok &amp;mdash; podać login i hasło-sklejone-z-kluczem do modułu autoryzacji, wywołać GET, wydrukować wynik (a potem napisać sobie samemu dokumentację schematu). Biorę przykład InFaktu, napisany w PHP (z własnym klientem HTTP, stworzonym w technologii Copiego-Paste'a, włącznie). Zmieniam login, zmieniam hasło, zmieniam klucz. Uruchamiam, dupa. Mam już dwie dupy i wciąż ani jednego klienta, żyć nie umierać.&lt;/p&gt;

&lt;p&gt;Pytam na Blipie, tu zaczęła się prawdziwa przygoda. Zaczęło się dość sympatycznie:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Tak to jest jak konkurencja czyta API:-) Powiedz co dokładnie Ci nie działa&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;— &lt;cite&gt;&lt;a href=&quot;http://blip.pl/dm/25863998&quot;&gt;InFakt&lt;/a&gt;, Blip&lt;/cite&gt;&lt;/p&gt;

&lt;p&gt;Po chwili odbijania piłeczki (&lt;q&gt;nie lubimy nieczystej gry&lt;/q&gt;) dowiedziałem się, że jestem właścicielem CentrumFaktur. Otóż nie jestem, jakkolwiek by się przy tym nie upierać, właścicielem Portfeo i CentrumFaktur jest Mirumee. Na pieczątce, którą mam przed sobą, stoi &lt;q&gt;Mirumee Software, Mirosław Mencel&lt;/q&gt;. Ja najbliżej literki &lt;q&gt;M&lt;/q&gt; byłem, gdy nadawano mi drugie imię &lt;q&gt;Michał&lt;/q&gt;, którego jednak nie używam.&lt;/p&gt;

&lt;p&gt;Wszelkie próby dogadania się na szczeblu technicznym (ze wskazaniem na fakt, że nie naruszam regulaminu InFaktu włącznie) spełzły na niczym. Dyskusja na poziomie &lt;q&gt;a my i tak wiemy lepiej, Balcerowicz musi odejść&lt;/q&gt;.&lt;/p&gt;

&lt;p&gt;Wreszcie rozmowa przeradza się w rasowy flejm ze stosowną argumentacją w komplecie:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Brawo!! Mamy pełny obraz :-) Przygotowujecie kopię Infakt, nasyłacie kolegów do czarnego pr i uważacie że infakt jest be. Bomba&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;— &lt;cite&gt;&lt;a href=&quot;http://blip.pl/dm/25873307&quot;&gt;InFakt&lt;/a&gt;, Blip&lt;/cite&gt;&lt;/p&gt;

&lt;p&gt;Otóż wierzcie mi Państwo, że w obliczu zastanego profesjonalizmu, &lt;q&gt;czarny PR&lt;/q&gt; rozdaję całkiem charytatywnie. Trochę pokory, panowie. Faktycznie, InFakt mocno przyczynił się do powstania CentrumFaktur. Byłem przy tym, to wiem. A skoro wiem, to opowiem.&lt;/p&gt;

&lt;p&gt;Pracowałem ci ja sobie spokojnie nad Portfeo, kiedy to zaistniała w ekipie Portfeo potrzeba regularnego wystawiania faktur VAT. Wobec tego Mirek bez zastanowienia (idąc za głosem rekomendacji) założył konto na InFakcie (w jakże doskonale zakamuflowanej domenie &lt;code&gt;portfeo.infakt.pl&lt;/code&gt;, co dowodzi naszego przebiegłego szpiegostwa). Po paru próbach użycia okazało się, że serwis nie spełnia jego oczekiwań i zaproponował mi kontrakt na stworzenie alternatywy. Dwa podpisy później konto na InFakcie wyszło z użycia.&lt;/p&gt;

&lt;p&gt;Ot i cała historia inspiracji, jakiej dostarczył nam InFakt. Historie o kopiowaniu interfejsu czy możliwości proponuję włożyć między bajki. Trochę pokory, do bajek wrócimy, kiedy w przyszłym roku InFakt udostępni moduł ofertowania. Co zaś się tyczy inspiracji, to wzorowaliśmy się na &lt;a href=&quot;http://getballpark.com/&quot;&gt;Ballparku&lt;/a&gt; i nie wstydzimy się tego zupełnie &amp;mdash; wszak jeśli się uczyć, to od lepszych od siebie.&lt;/p&gt;

&lt;p&gt;Koniec końców zdawało się, że wczoraj sytuacja się unormowała. API InFaktu zaczęło &lt;q&gt;magicznie&lt;/q&gt; działać (bez zmian w kodzie z mojej strony), więc uznałem, że z administratora zeszło ciśnienie i nas odblokował. Dziś jednak cyrk zaczął się na nowo, a do mnie wpadły (między innymi) takie wiadomości:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Ujawniliśmy publicznie Wasze nieetyczne zachowanie. Próbujecie wykorzystać nasze API do transferu Klientów. Żałosne ale prawdziwe.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;— &lt;cite&gt;&lt;a href=&quot;http://blip.pl/dm/26676045&quot;&gt;InFakt&lt;/a&gt;, Blip&lt;/cite&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Infakt udostepnił API publicznie, nikomu nie blokuje dostępu, nawet Wam, tym którzy szukają drogi na skróty w zdobywaniu Klientów&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;— &lt;cite&gt;&lt;a href=&quot;http://blip.pl/dm/26678805&quot;&gt;InFakt&lt;/a&gt;, Blip&lt;/cite&gt;&lt;/p&gt;

&lt;p&gt;Nie mam pojęcia, kto we wspomnianym wcześniej serwisie operuje kontem &lt;a rel=&quot;nofollow&quot; href=&quot;http://infakt.blip.pl/&quot;&gt;^infakt&lt;/a&gt;, ale z całą pewnością nie przysługuje się wizerunkowi firmy. Gdybym był złośliwy, to napisałbym, że limit 160 znaków sugeruje, że może to być autor dokumentacji. Ale nie jestem, prawda?&lt;/p&gt;

&lt;p&gt;Drogi użytkowniku ^infakt, spieszę poinformować, że twoja logika nie trzyma się kupy. W jakiż to sposób CentrumFaktur miałoby &lt;q&gt;ukraść&lt;/q&gt; wam użytkowników? Emaksem przez sendmejla (potrójna ścianka ognia) zdobyć wszystkie loginy i hasła, wygenerować klucze API i dokonać migracji na siłę? No bo, proszę ja was, po mojemu to dane klientów i faktury są własnością firmy, a nie InFaktu i user ma prawo je sobie migrować gdzie chce.&lt;/p&gt;

&lt;p&gt;Wersja dla opornych: użytkownicy muszą najpierw samodzielnie założyć konto w CentrumFaktur, następnie wpisać z własnej nieprzymuszonej woli dane do logowania i nacisnąć przycisk &lt;q&gt;Importuj&lt;/q&gt;. Nikt tu nikogo pod pistoletem nie trzyma. Kiedy skończę pracować nad API CentrumFaktur, będziecie mile widzianym jego konsumentem.&lt;/p&gt;

&lt;p&gt;Apeluję zatem: trochę dystansu. CentrumFaktur z pewnością daleko jest do ideału, ale nie widziałem, żeby Mirek z tego powodu naskakiwał na krytyków. Wasze API aż prosi się o sensowną dokumentację i pozbycie się loginów i haseł (co na Blipie &lt;a href=&quot;http://blip.pl/dm/25864210&quot;&gt;sugerowałem&lt;/a&gt; równie grzecznie, co bezskutecznie). Mam również nadzieję, że pracownicy InFaktu będą łaskawi zejść wreszcie z moich pleców, bo wierzcie mi, że licytację na techniczne niedoróbki można kontynuować, ale nie przyjdzie to z zyskiem dla żadnej ze stron.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Nowy serwis: CentrumFaktur.pl</title>
   <link href="http://room-303.com/blog/2009/12/03/nowy-serwis-centrumfaktur-pl/"/>
   <updated>2009-12-03T17:00:07+00:00</updated>
   <id>http://room-303.com/blog/2009/12/03/nowy-serwis-centrumfaktur-pl</id>
   <content type="html">&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://centrumfaktur.pl/&quot;&gt;&lt;img src=&quot;http://room-303.com/blog/wp-content/uploads/2009/12/centrumfaktur.jpg&quot; alt=&quot;Faktury i oferty. Lepiej.&quot; title=&quot;CentrumFaktur&quot; width=&quot;620&quot; height=&quot;400&quot; class=&quot;size-full wp-image-671&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jakiś czas temu pytałem na &lt;a href=&quot;http://patrys.blip.pl/&quot;&gt;Blipie&lt;/a&gt;, czy istnieje serwis, który potrafi wystawiać faktury w obcej walucie w sposób zgodny z prawem. Na przykład &lt;a href=&quot;http://infakt.pl/&quot;&gt;InFakt&lt;/a&gt; wbrew prawu nie przelicza wszystkich kwot VAT na złotówki.&lt;/p&gt;

&lt;p&gt;Widać najlepiej zrobić wszystko samemu. Oddaliśmy się tedy pasjonującej lekturze przepisów dotyczących podatku VAT. Polecam szczerze tę formę rozrywki, zwłaszcza porównywanie poszczególnych przepisów z funkcjami oferowanymi przez poszczególne serwisy do fakturowania.&lt;/p&gt;

&lt;p&gt;Wczoraj uruchomiliśmy (a raczej &lt;a href=&quot;http://mirumee.com/&quot;&gt;Mirumee&lt;/a&gt; uruchomiło) własną aplikację do wystawiania i zarządzania ofertami i fakturami: &lt;a href=&quot;http://centrumfaktur.pl/&quot;&gt;CentrumFaktur&lt;/a&gt;. Myślę, że śmiało moglibyśmy reklamować się hasłem, że jako jedni z nielicznych znamy stosowne przepisy.&lt;/p&gt;

&lt;p&gt;Przy okazji dorzuciliśmy prosty system składania ofert, gdzie klient ma możliwość wymiany komentarzy dotyczących kosztorysu i jego finalnej akceptacji. Nigdy więcej nie usłyszycie, że wasz ulubiony klient &amp;mdash; sympatyczny pan Kazimierz &amp;mdash; &lt;q&gt;pierwszy raz na oczy widzi takie ceny&lt;/q&gt;.&lt;/p&gt;

&lt;p&gt;Czy mogę napisać coś więcej? Nie będę opowiadał o niesamowitym bezpieczeństwie, potrójnych ściankach ognia i platformie technologicznej tak zaawansowanej, że kryzys sam się cofa, a synergia je nam z ręki. Jeśli właśnie zakładacie działalność albo nie jesteście zadowoleni z używanego dotychczas programu, to zapraszamy do korzystania z naszych usług.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>PLD Linux: KMS</title>
   <link href="http://room-303.com/blog/2009/12/02/pld-linux-kms/"/>
   <updated>2009-12-02T13:02:46+00:00</updated>
   <id>http://room-303.com/blog/2009/12/02/pld-linux-kms</id>
   <content type="html">&lt;p&gt;Jeśli każda próba użycia &lt;abbr title=&quot;Kernel Mode Setting&quot;&gt;KMS&lt;/abbr&gt; kończy się czarnym ekranem, prawdopodobnie potrzebujesz tego samego, co ja.&lt;/p&gt;

&lt;p&gt;Na początek na warsztat bierzemy plik &lt;code&gt;/etc/sysconfig/geninitrd&lt;/code&gt;. Tam istotne są dwa wiersze:&lt;/p&gt;

&lt;blockquote&gt;&lt;code&gt;&lt;pre&gt;PREMODS=&quot;fbcon&quot;
FBMODULE=&quot;nouveau&quot;&lt;/pre&gt;&lt;/code&gt;&lt;/blockquote&gt;

&lt;p&gt;Oczywiście, &lt;code&gt;nouveau&lt;/code&gt; należy zastąpić modułem adekwatnym do posiadanego sprzętu.&lt;/p&gt;

&lt;p&gt;Następnie tworzymy plik &lt;code&gt;/etc/modprobe.d/kms.conf&lt;/code&gt; o treści:&lt;/p&gt;

&lt;blockquote&gt;&lt;code&gt;&lt;pre&gt;options nouveau modeset=1&lt;/pre&gt;&lt;/code&gt;&lt;/blockquote&gt;

&lt;p&gt;Oczywiście, tu również podstawiamy stosowny moduł.&lt;/p&gt;

&lt;p&gt;Na koniec generujemy za pomocą &lt;code&gt;geninitrd&lt;/code&gt; nowy obraz startowy i uruchamiamy ponownie komputer. Voilà!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Romantyczne danie dla dwojga: hot-dog à la cuda techniki</title>
   <link href="http://room-303.com/blog/2009/10/25/romantyczne-danie-dla-dwojga-hot-dog-a-la-cuda-techniki/"/>
   <updated>2009-10-25T13:25:08+00:00</updated>
   <id>http://room-303.com/blog/2009/10/25/romantyczne-danie-dla-dwojga-hot-dog-a-la-cuda-techniki</id>
   <content type="html">&lt;p&gt;Niniejszym prezentuję pierwszy w historii tego bloga przepis. Nie panikujcie jednak, jest to przepis godny informatyka.&lt;/p&gt;

&lt;h4&gt;Sprzęt i składniki&lt;/h4&gt;

&lt;ul&gt;
	&lt;li&gt;Mikrofalówka z funkcją grilla (opiekacz/funkcja &lt;q&gt;crisp&lt;/q&gt;)&lt;/li&gt;
	&lt;li&gt;Bułki do hot-dogów (2–4 na głowę)&lt;/li&gt;
	&lt;li&gt;Parówki (np. Berlinki z ostrym chili albo parówki sojowe)&lt;/li&gt;
	&lt;li&gt;Ser gouda&lt;/li&gt;
	&lt;li&gt;Pikle&lt;/li&gt;
	&lt;li&gt;Cebula&lt;/li&gt;
	&lt;li&gt;Sałata&lt;/li&gt;
	&lt;li&gt;Prażona cebulka (gotowa, w słoiczku)&lt;/li&gt;
	&lt;li&gt;Keczup&lt;/li&gt;
	&lt;li&gt;Musztarda&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Przygotowanie&lt;/h4&gt;

&lt;p&gt;&lt;small&gt;Czas przygotowania: 5 minut na porcję. Jednocześnie mogą jeść 2 osoby.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Dwie bułki naciąć. Ułożyć zamknięte na podstawce do opiekania, obok nich ułożyć dwie parówki. Opiekać przez 1–1,5 minuty. Następnie bułki odwrócić i opiekać ponownie przez 1–1,5 minuty.&lt;/p&gt;

&lt;p&gt;Po wyjęciu bułki otworzyć i posmarować musztardą. Następnie umieścić w nich parówki i położyć na nich po dwa plasterki sera. Wyłączyć w mikrofalówce tryb grillowania i całość podgrzewać przez około minutę, do stopienia sera.&lt;/p&gt;

&lt;p&gt;Po wyjęciu do środka włożyć liść sałaty, 1–2 plasterki cebuli i pikle. Całość polać keczupem i posypać prażoną cebulką.&lt;/p&gt;

&lt;p&gt;Zeżreć hot-dogi, następnie wszystkie czynności powtórzyć. Robienie większej ilości jednocześnie mija się z celem, bo jedzenie szybko stygnie.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Przygoda z ITS zbliża się do końca</title>
   <link href="http://room-303.com/blog/2009/10/02/przygoda-z-its-zbliza-sie-do-konca/"/>
   <updated>2009-10-02T15:01:44+00:00</updated>
   <id>http://room-303.com/blog/2009/10/02/przygoda-z-its-zbliza-sie-do-konca</id>
   <content type="html">&lt;p&gt;Część z was z pewnością wie, że jeszcze do lipca tego roku pracowałem dla polskiego oddziału angielskiej firmy Internet Trading Solutions Ltd., w skrócie ITS, który to skrót odnosi się również do siostrzanej firmy Immediate Technical Solutions. Właścicielem obu brytyjskich bytów był John Dowling. Polski oddział miał dodatkowego wspólnika w osobie Łukasza Grada. Wszystko co dobre, kiedyś się kończy.&lt;/p&gt;

&lt;p&gt;Chciałem już na wstępie zaznaczyć, że nie siedzę teraz w lesie obżerając się torfem tylko dlatego, że razem z &lt;a href=&quot;http://jakotwojprawnik.com/&quot;&gt;Asią&lt;/a&gt; wydaliśmy wszystkie swoje oszczędności, a ona zapewniła mi dodatkowo wsparcie w kwestiach prawnych.&lt;/p&gt;

&lt;p&gt;Nasamprzód pojawił się tajemniczy list z sądu, oznaczony kilkunastoma (a może kilkudziesięcioma) sygnaturami akt. W środku żądanie ustosunkowania się do podniesionej przez ZUS kwestii niepłacenia jakichkolwiek składek. Był to początek maja. W drugiej zaś połowie miesiąca zostaliśmy wszyscy wezwani przez policję. Na przesłuchanie, w charakterze świadków, oczywiście w sprawie składek na ZUS.&lt;/p&gt;

&lt;p&gt;Potem &amp;mdash; z końcem maja &amp;mdash; zniknęło biuro, jednak obiecano nam, że nowa siedziba jest tylko kwestią dni. Oczywiście dni przechodziły w tygodnie, a my słyszeliśmy tylko o przedłużającej się kwestii kredytu i konieczności nabycia nieruchomości¹.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;¹ Oczywiście. A tu mi jedzie czołg.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Kolejnym etapem było zaprzestanie wypłaty jakichkolwiek wynagrodzeń. Pensji za maj nikt nie widział. Przeprosiny, mgliste próby &lt;q&gt;wyjaśnienia&lt;/q&gt;, obietnica rekompensaty. Zapowiedziałem, że nie zamierzam robić nic, co nie wynika bezpośrednio z opisu mojego stanowiska. W rezultacie przez cały miesiąc nie miałem do roboty absolutnie nic. I dobrze, bo czerwcowe wypłaty poszły szukać tych z maja i od tego czasu wszelki słuch po nich zaginął.&lt;/p&gt;

&lt;p&gt;Szybko wydało się także, czemu firma nie ma dla nas pracy. Po kilku dniach otrzymaliśmy bowiem ofertę zatrudnienia w spółce Alrisha² Ltd., której siedziba również znajduje się w Windsorze, a załoga nosi &amp;mdash; dziwnym trafem &amp;mdash; te same nazwiska, co pracownicy ITS. Nawet głos i numer telefonu osoby rekrutującej przywodził na myśl mojego szefa, podobnie jak jego imię, nazwisko i niezmącona wiara w to, że &lt;q&gt;będzie lepiej&lt;/q&gt; i &lt;q&gt;na pewno dostaniecie swoje pieniądze&lt;/q&gt;.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;² Alrisha po arabsku znaczy &lt;q&gt;powróz&lt;/q&gt;, co oczywiście stało się inspiracją sporej dawki wisielczego humoru, jakże pasującego nastrojem do sytuacji.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Postawiłem jasny warunek: zaległe pensje, wypowiedzenie i odprawa, potem możemy rozmawiać o pracy. Zasugerowałem wręcz, że jeśli nowej spółce tak zależy na mojej pracy, to z pewnością może udzielić starej spółce pożyczki w wysokości zaległych wypłat. Potrzebują czasu do namysłu.&lt;/p&gt;

&lt;p&gt;W tym samym czasie pojawił się niejaki Pierre K., który w rozmowie telefonicznej przedstawia się jako administrator serwerów Alrishy. Jak się okazało, jego mówiony angielski nie odbiegał od tego pisanego, a składał się głównie z podwórkowej łaciny wymieszanej ze skrótami rodem z AOL. Pan sprawiał wrażenie takiego, który ma problem z ustawieniem zegarka na wideo, a próbował doprowadzić do działania wirtualizację usług serwerowych. W końcu poddał się i zaoferował, że&amp;hellip; zapłaci mi za to, żebym pracował za niego.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;cite&gt;Patrys&lt;/cite&gt;: &lt;q&gt;you need a working kernel then&lt;/q&gt;&lt;/p&gt;
  
&lt;p&gt;&lt;cite&gt;Pierre&lt;/cite&gt;: &lt;q&gt;listen patrys i would pay your help out of my pocket ..&lt;br /&gt;it just freaks me out&lt;br /&gt;and i need it urgend&lt;br /&gt;i know u dont got your payment .. but that have nothing todo with me&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;Patrys&lt;/cite&gt;: &lt;q&gt;I hope you understand that given the current situation it's not in my best interest to help you at all&lt;br /&gt;I try to do my best but I can't just do it for you&lt;/q&gt;&lt;/p&gt;
 
&lt;p&gt;&lt;cite&gt;Pierre&lt;/cite&gt;: &lt;q&gt;well i understand u .. thats not the problem thats why i offerd pay your help out of my privat pocket&lt;br /&gt;that cash would be untaxed just under hand&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;Patrys&lt;/cite&gt;: &lt;q&gt;sorry mate, can't do it&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;Pierre&lt;/cite&gt;: &lt;q&gt;dang :/&lt;/q&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Powiedziałem, że nie życzę sobie, żeby marnował mój czas. Poskutkowało, bo więcej się nie odezwał, przestał się odzywać także mój przełożony. Od innych pracowników dowiedziałem się, że wkrótce miało nastąpić odcięcie nieopłaconych linii telefonicznych, a brytyjska spółka właśnie przygotowuje się do likwidacji. Zniknął też cały majątek. Dziwnym trafem Alrisha oprócz załogi zabrała również sprzęt i kontrakty obu ITS&amp;ndash;ów.&lt;/p&gt;

&lt;p&gt;Od tego momentu firma istniała praktycznie tylko na papierze. Spółka macierzysta powołała likwidatora³, Luke rzucił pracę i wyjechał do Londynu, a nami nikt się już nie przejmował. Z końcem czerwca rozwiązałem umowę ze skutkiem natychmiastowym z winy pracodawcy (niewypłacenie wynagrodzenia stanowi ciężkie naruszenie obowiązków względem pracownika). Pozew poszedł oczywiście listem poleconym, na adres, z którego spółka wyprowadziła się w maju. Cóż, nie byli łaskawi wskazać w KRS innego, więc postanowiliśmy skorzystać z fikcji doręczenia.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;³ Strona firmy &lt;a href=&quot;http://www.robertday.biz/&quot;&gt;Robert Day&lt;/a&gt; przeznaczona jest tylko dla odważnych osób o silnych żołądkach.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Kolejnym krokiem było złożenie pozwu o wypłatę zaległego wynagrodzenia oraz rekompensaty za przysługujący mi miesięczny okres wypowiedzenia. Rozprawa odbyła się wczoraj i trwała 10 minut, dość, by dołączyć do akt przyniesiony ze sobą aktualny odpis KRS. To na wypadek, gdyby sąd po powrocie poleconego z wezwaniem zechciał wskazania innego adresu. Sędzia obejrzała jeszcze raz pozew, przejrzała tych kilka stron KRS, które zawierały wpisy o zaległościach na rzecz ZUS&amp;ndash;u, załamała ręce i udzieliła mi krótkiego wykładu na temat ciężkich czasów i niskich emerytur. Następnie kazała zaprotokołować, że zastrzega sobie prawo do wydania wyroku w trybie zaocznym, ale nie może tego zrobić do momentu otrzymania zawiadomienia o nieudanym doręczeniu wezwania.&lt;/p&gt;

&lt;p&gt;Teraz o wszystkim zdecyduje pieczątka na pocztowej zwrotce. Jeśli pierwsze awizo zmieściło się w ustawowym terminie powiadomienia o rozprawie, to powinienem dostać wyrok pocztą. W przeciwnym wypadku czeka mnie powtórka rozprawy.&lt;/p&gt;

&lt;p&gt;Z wyrokiem można już próbować starać się o środki z Funduszu Gwarantowanych Świadczeń Pracowniczych. Niestety, ten ostatni pokrywa roszczenia tylko do kwoty przeciętnego wynagrodzenia. Jak wyegzekwować PIT i świadectwo pracy, nadal nie wiadomo.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>GNOME 2.28</title>
   <link href="http://room-303.com/blog/2009/09/24/gnome-2-28/"/>
   <updated>2009-09-24T09:13:58+00:00</updated>
   <id>http://room-303.com/blog/2009/09/24/gnome-2-28</id>
   <content type="html">&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/3949514437/&quot; title=&quot;GNOME 2.28 by patrys, on Flickr&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2436/3949514437_da9709a699_o.png&quot; width=&quot;620&quot; height=&quot;230&quot; alt=&quot;GNOME 2.28&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://library.gnome.org/misc/release-notes/2.28/index.html.pl&quot;&gt;GNOME 2.28&lt;/a&gt; został wydany! Kolejna wersja za pół roku.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Django: alternatywa dla Form.as_table()</title>
   <link href="http://room-303.com/blog/2009/08/21/django-alternatywa-dla-form-as_table/"/>
   <updated>2009-08-21T13:54:58+00:00</updated>
   <id>http://room-303.com/blog/2009/08/21/django-alternatywa-dla-form-as_table</id>
   <content type="html">&lt;p&gt;Domyślna struktura generowana przez metodę &lt;code&gt;django.forms.Form.as_table&lt;/code&gt; pozostawia nieco do życzenia. Stąd nieco wygodniejsza i nieinwazyjna wersja w postaci filtra (zastanawiam się, czemu ta wbudowana w Django ma postać metody):&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;from django.template.loader import render_to_string

@register.filter
def as_table(form):
    return render_to_string('form_as_table.html', {'form': form})&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Do kompletu przykładowy szablon:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;django&quot;&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
 </entry>
 
 <entry>
   <title>Django: Decimal i simplejson</title>
   <link href="http://room-303.com/blog/2009/08/18/django-decimal-i-simplejson/"/>
   <updated>2009-08-18T10:01:37+00:00</updated>
   <id>http://room-303.com/blog/2009/08/18/django-decimal-i-simplejson</id>
   <content type="html">&lt;p&gt;Moduł &lt;code&gt;django.utils.simplejson&lt;/code&gt; nie obsługuje domyślnie typu &lt;code&gt;decimal.Decimal&lt;/code&gt;. Na szczęście da się podać własny mechanizm kodowania nieznanych typów:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;import decimal

def json_encoder(value):
    if isinstance(value, decimal.Decimal):
        return float(str(value))
    else:
        raise TypeError

from django.utils import simplejson

print simplejson.dumps([decimal.Decimal('1.2')], default=json_encoder)&lt;/code&gt;&lt;/pre&gt;
</content>
 </entry>
 
 <entry>
   <title>Python: Utop sierotki w zupie</title>
   <link href="http://room-303.com/blog/2009/08/12/python-utop-sierotki-w-zupie/"/>
   <updated>2009-08-12T17:16:40+00:00</updated>
   <id>http://room-303.com/blog/2009/08/12/python-utop-sierotki-w-zupie</id>
   <content type="html">&lt;p&gt;Ot, taki znak, że nie umarłem. Dziś w programie dość popularny błąd składu, choć wielu uważa, że internetu reguły nie dotyczą. A &lt;a href=&quot;http://pl.wikipedia.org/wiki/Wisz%C4%85cy_sp%C3%B3jnik&quot;&gt;sierotki&lt;/a&gt; wykończymy tak:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;import re

def sierotki(text):
    reg = re.compile(u'\\b(a|i|o|u|w|z)\\b\\s+')
    return reg.sub(u'\\1\u00a0', text)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Niestety, na ogół mamy do czynienia z tekstem zawierającym znaczniki:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;import re
from BeautifulSoup import BeautifulSoup

def sierotki(text):
    soup = BeautifulSoup(text)
    reg = re.compile(u'\\b(a|i|o|u|w|z)\\b\\s+')
    for val in soup.findAll(text=reg):
        val.replaceWith(reg.sub(u'\\1\u00a0', val))
    return unicode(soup)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I na koniec bonus, blok dla Django:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;from django import template
register = template.Library()

@register.tag(name='sierotki')
def do_sierotki(parser, token):
    nodelist = parser.parse(('endsierotki',))
    parser.delete_first_token()
    return SierotkiNode(nodelist)

class SierotkiNode(template.Node):
    def __init__(self, nodelist):
        self.nodelist = nodelist
    def render(self, context):
        output = self.nodelist.render(context)
        return sierotki(output)&lt;/code&gt;&lt;/pre&gt;
</content>
 </entry>
 
 <entry>
   <title>Python: wzajemne importowanie modułów</title>
   <link href="http://room-303.com/blog/2009/07/22/python-wzajemne-importowanie-modulow/"/>
   <updated>2009-07-22T09:25:15+00:00</updated>
   <id>http://room-303.com/blog/2009/07/22/python-wzajemne-importowanie-modulow</id>
   <content type="html">&lt;p&gt;Nie jestem pewien, skąd wzięło się takie przeświadczenie, ale ostatnio kilka osób próbowało mnie przekonać, że w Pythonie nie da się wykonać dwukierunkowego importu.&lt;/p&gt;

&lt;p&gt;Rozważmy naiwny przykład programu ładującego wtyczkę, która z kolei chce korzystać z API swojego hosta. Zgadzam się, że takie dwukierunkowe zależności to na ogół oznaka bardzo złego designu, są jednak sytuacje, w których ciężko ich uniknąć.&lt;/p&gt;

&lt;p&gt;Pozostaje problem implementacji. Okazuje się, że zwolennicy teorii &lt;q&gt;nie da się&lt;/q&gt; dzielą się na tych, którzy nigdy nie próbowali, ale &lt;q&gt;ktoś coś wspominał&lt;/q&gt; oraz na tych, którzy oczekiwali od Pythona zdolności myślenia. Dwukierunkowy import na poziomie globalnym modułów nie wymaga specjalnych zabiegów, trzeba być jednak przygotowanym na dwa ograniczenia:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Importować można tylko wstecz, a więc wyłącznie symbole zdefiniowane przed importem, który doprowadził do powstania pętli (co jest dość logiczne, gdyż w pozostałych przypadkach mamy do czynienia z problemem jajka i kury)&lt;/li&gt;
&lt;li&gt;W pewnych okolicznościach kod zostanie wykonany dwukrotnie&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Działającą pętlę importów pokazuje poniższy przykład:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Uwaga:&lt;/strong&gt; na diagramie jest literówka, oczywiście moduł &lt;code&gt;bar&lt;/code&gt; powinien importować symbol &lt;code&gt;a&lt;/code&gt; zamiast &lt;code&gt;b&lt;/code&gt;.&lt;/p&gt;

&lt;p class=&quot;strip simple&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/3745795314/&quot; title=&quot;Circular dependencies in Python by patrys, on Flickr&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2506/3745795314_7e1462f940_o.png&quot; width=&quot;465&quot; height=&quot;238&quot; alt=&quot;Circular dependencies in Python&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Zaadoptuj hakera i zostań Przyjacielem GNOME</title>
   <link href="http://room-303.com/blog/2009/05/26/zaadoptuj-hakera-i-zostan-przyjacielem-gnome/"/>
   <updated>2009-05-26T07:38:20+00:00</updated>
   <id>http://room-303.com/blog/2009/05/26/zaadoptuj-hakera-i-zostan-przyjacielem-gnome</id>
   <content type="html">&lt;p&gt;Jesteś fanem wolnego oprogramowania (nie mylić z powolnym) i używasz &lt;a href=&quot;http://www.gnome.org/&quot;&gt;GNOME&lt;/a&gt;? Na co dzień pracujesz z innym systemem, ale wykorzystujesz aplikacje oparte na GTK+? A może obudził się w tobie instynkt filantropa? Jeśli tak, to Fundacja GNOME z radością przyjmie twoje pieniądze (i jeśli kiedyś postanowiłeś mi kupić piwo, to nie czekaj i &lt;a href=&quot;http://www.gnome.org/friends/&quot;&gt;podaruj te pieniądze fundacji&lt;/a&gt;)!&lt;/p&gt;

&lt;p class=&quot;strip simple&quot;&gt;&lt;a href=&quot;http://www.gnome.org/friends/&quot;&gt;&lt;img src=&quot;http://room-303.com/blog/wp-content/uploads/2009/05/fog-badges.png&quot; alt=&quot;Support GNOME&quot; title=&quot;Friends of GNOME&quot; width=&quot;450&quot; height=&quot;235&quot; class=&quot;size-full wp-image-622&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Python, Whoosh i błędy</title>
   <link href="http://room-303.com/blog/2009/05/08/python-whoosh-i-bledy/"/>
   <updated>2009-05-08T12:46:15+00:00</updated>
   <id>http://room-303.com/blog/2009/05/08/python-whoosh-i-bledy</id>
   <content type="html">&lt;p&gt;Tytułem wstępu: &lt;a href=&quot;http://whoosh.ca/&quot;&gt;Whoosh&lt;/a&gt; to bardzo przyjemny silnik indeksujący i wyszukujący dokumenty w trybie &lt;q&gt;full-text&lt;/q&gt;. Niestety, masa ludzi ma problemy z jego wdrożeniem.&lt;/p&gt;

&lt;h4&gt;Objawy&lt;/h4&gt;

&lt;p&gt;Główne objawy to:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;OSError: [Errno 17] File exists: '/path/to/index/cache/_MAIN_LOCK'&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;oraz:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;IOError: [Errno 2] No such file or directory: '/path/to/index/cache/_MAIN_123.tiz'&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Oba z nich są na ogół różnymi objawami faktu, że więcej niż jeden proces próbuje używać tego samego indeksu w tym samym czasie. Główną przyczyną jest nieświadomość tego, że &lt;strong&gt;Whoosh nie gwarantuje bezpieczeństwa wątków&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;Rozwiązanie pierwsze: gdy używasz Haystack&lt;/h4&gt;

&lt;p&gt;Ponieważ zdecydowana większość użytkowników nie odwołuje się bezpośrednio do &lt;abbr&gt;API&lt;/abbr&gt; Whoosh, a korzysta z niego za pośrednictwem modułu &lt;a href=&quot;http://haystacksearch.org/&quot;&gt;Haystack&lt;/a&gt;, najpierw przedstawię rozwiązanie dla nich.&lt;/p&gt;

&lt;p&gt;Jak &lt;a href=&quot;http://groups.google.com/group/django-haystack/browse_thread/thread/97109b65a6d725f3&quot;&gt;ustaliliśmy&lt;/a&gt; przedwczoraj z autorem Haystack, przykładowy backend dostarczany dla Whoosh błędnie zakłada bezpieczeństwo wątków tego ostatniego.&lt;/p&gt;

&lt;p&gt;Dodatkowo, Haystack używa &lt;q&gt;leniwych obiektów&lt;/q&gt; (obiektów z odwleczoną inicjalizacją) do ładowania indeksów, co powoduje, że nawet przy zachowaniu bezpieczeństwa wątków, &lt;em&gt;aplikacja nie będzie działać prawidłowo w środowisku typu &lt;q&gt;prefork&lt;/q&gt;&lt;/em&gt;.

&lt;/p&gt;
&lt;p&gt;Najprawdopodobniej w przyszłości Haystack będzie uruchamiał Whoosh w postaci usługi systemowej, co pozwoli na wielodostęp do tego samego indeksu i tym samym zlikwiduje problemy związane z rozgałęzianiem procesów i wątkowaniem. Póki co, rozwiązanie składa się z dwóch kroków:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Nałożenie na Haystack mojej łatki, która zapewnia bezpieczeństwo wątków: &lt;a href=&quot;http://room-303.com/blog/wp-content/uploads/2009/05/haystack-whoosh.patch&quot;&gt;haystack-whoosh.patch&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;Upewnienie się, że Django działa w serwerze wątkowanym, a nie forkowanym. Dla używających &lt;code&gt;manage.py&lt;/code&gt; sprowadza się to do dopisania parametru &lt;code&gt;method&lt;/code&gt;:
&lt;blockquote&gt;&lt;pre&gt;python manage.py runfcgi method=threaded ...&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Rozwiązanie drugie: gdy bezpośrednio wołasz Whoosh&lt;/h4&gt;

&lt;p&gt;Tutaj gotowej łatki podać nie mogę, bo każdy pisze kod po swojemu. Wystarczy jednak &amp;mdash; podobnie jak zrobiłem to w łatce dla Haystack &amp;mdash; użyć mechanizmu &lt;code&gt;threading.Lock&lt;/code&gt; i ogrodzić wszystkie wywołania API wspólną blokadą (czy może ryglem, jak czasem jest to słowo tłumaczone). Na przykład:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;import threading

whoosh_api = threading.Lock()

def do_something():
	whoosh_api.acquire()
	try:
		# use API
	finally:
		whoosh_api.release()&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Należy się również upewnić, że w danej chwili istnieje tylko jeden obiekt typu &lt;code&gt;whoosh.index.Index&lt;/code&gt; na każdy katalog indeksu, a także maksymalnie jedna instancja &lt;code&gt;whoosh.writing.IndexWriter&lt;/code&gt;. Pierwszy przypadek rozwiązuje implementacja singletona, drugi &amp;mdash; ogrodzenie całego cyklu życia obiektu (aż do pomyślnego wywołania metody &lt;code&gt;commit&lt;/code&gt; lub &lt;code&gt;cancel&lt;/code&gt;) wewnątrz tej samej blokady, co reszta wywołań &lt;abbr&gt;API&lt;/abbr&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Wstęp do kultury: spam</title>
   <link href="http://room-303.com/blog/2009/05/07/wstep-do-kultury-spam/"/>
   <updated>2009-05-07T11:29:43+00:00</updated>
   <id>http://room-303.com/blog/2009/05/07/wstep-do-kultury-spam</id>
   <content type="html">&lt;p&gt;Pewni &lt;a href=&quot;http://megaling.com.pl/&quot;&gt;spamerzy&lt;/a&gt; wysłali mi właśnie taki potworek:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Szanowni Panstwo !&lt;/p&gt;
&lt;p&gt;Biuro Tlumaczen MEGALING oferujace niedrogie tlumaczenia zwraca sie do
Panstwa firmy z prosba o wyrazenie zgody na otrzymanie droga elektroniczna
informacji handlowych na temat produktów naszej firmy.&lt;/p&gt;
&lt;p&gt;Jezeli wyrazaja Panstwo zgode na przeslanie przez nas droga elektroniczna
informacji handlowych w rozumieniu ustawy z dnia 18 lipca 2002 roku o
swiadczeniu uslug droga elektroniczna (Dz. U. Nr 144, poz. 1204 ze zm.)
prosimy o wyslanie pustego maila zwrotnego z tematem TAK.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Oczywiście wierzę, że nie mówimy tu o masowym zbieraniu i przetwarzaniu adresów poczty elektronicznej. Wszak &lt;del&gt;spamerzy&lt;/del&gt; &lt;ins&gt;tłumacze&lt;/ins&gt; z całą pewnością moje dane znaleźli w katalogu przedsiębiorców, gdyż jak powszechnie wiadomo, mój blog jest zarejestrowaną czternastoosobową spółką akcyjną, na giełdzie jest notowany pod symbolem &lt;code&gt;CYCKI&lt;/code&gt; i od lat w nagłówku wyświetla własny identyfikator &lt;abbr&gt;KRS&lt;/abbr&gt;. Oczywiście.&lt;/p&gt;

&lt;p&gt;Drogie dzieciaczki (ton celowo protekcjonalny, dzięki temu powstrzymuję się od użycia co dobitniejszych epitetów), jeśli wysyłacie zapytanie o zgodę na spamowanie, to macie obowiązek podać pełne dane podmiotu, który o taką zgodę prosi. Co ważniejsze jednak, wasze &lt;em&gt;zapytanie nie może zawierać samej oferty&lt;/em&gt;. Dla zobrazowania, scenka rodzajowa.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;— Czy pozwoli Pan, że napiszę mu, że oferujemy tanie tłumaczenia?&lt;/p&gt;
&lt;p&gt;— Nie pozwolę.&lt;/p&gt;
&lt;p&gt;— Nie jest Pan zatem zainteresowany informacją, że tłumaczymy za jedyne 25 PLN od strony?&lt;/p&gt;
&lt;p&gt;— Obawiam się, że nie.&lt;/p&gt;
&lt;p&gt;— Jeśli nie interesują pana tłumaczenia pod przysięgą, być może zezwoli pan na wysłanie oferty dotyczącej &lt;q&gt;sprzedam Opla, rocznik 1998, stan dobry, lekko tłuczony&lt;/q&gt;?&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;cieszmy się jednak, że taka &lt;q&gt;logika&lt;/q&gt; merketoidiotów ogranicza się do reklam.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;— Czy pozwoli Pan, żebym kopnął, o tak?&lt;/p&gt;
&lt;p&gt;— Aaaa, moje jaja!&lt;/p&gt;
&lt;p&gt;— Rozumiem. Nie jest pan zainteresowany, zatem powstrzymam się od przemocy.&lt;/p&gt;&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>Django hack: wiele domen i jedna instancja</title>
   <link href="http://room-303.com/blog/2009/05/05/django-hack-wiele-domen-i-jedna-instancja/"/>
   <updated>2009-05-05T21:40:16+00:00</updated>
   <id>http://room-303.com/blog/2009/05/05/django-hack-wiele-domen-i-jedna-instancja</id>
   <content type="html">&lt;p&gt;Pozwala serwować wiele domen za pomocą jednego tylko projektu Django. Inspiracją był &lt;a href=&quot;http://www.djangosnippets.org/snippets/1099/&quot;&gt;ten snippet&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Zmiany w &lt;code&gt;settings.py&lt;/code&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;from threading import local

SITE_THREAD_INFO = local()
SITE_THREAD_INFO.SITE_ID = 1

class SiteIDHook(object):
    def __int__(self):
        return SITE_THREAD_INFO.SITE_ID
    def __hash__(self):
        return SITE_THREAD_INFO.SITE_ID

SITE_ID = SiteIDHook()&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Nowa klasa middleware:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;from django.conf import settings
from django.contrib.sites.models import Site
from django.http import HttpResponseRedirect

class MultiSiteMiddleware(object):
    def process_request(self, request):       
        settings.SITE_THREAD_INFO.SITE_ID = 0 # Fail by default

        host = request.META.get('HTTP_HOST').split(':')[0]
        if host:
            try:
                site = Site.objects.get(domain = host)
                settings.SITE_THREAD_INFO.SITE_ID = site.id
            except Site.DoesNotExist:
                return HttpResponseRedirect('http://example.com/')&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Bonus &amp;mdash; automatyczne fitrowanie obiektów:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;from django.contrib.sites.models import Site
from django.db import models

def create_custom_manager(*args, **kwargs):
    class CustomManager(models.Manager):
        def get_query_set(self):
            return super(CustomManager, self).get_query_set().filter(*args, **kwargs)
    return CustomManager()

class Product(models.Model):
    site = models.ForeignKey(Site, default = Site.objects.get_current)
    # ...
    objects = create_custom_manager(site = Site.objects.get_current)&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>Django hack: Grouped Model Choice Field</title>
   <link href="http://room-303.com/blog/2009/04/22/django-hack-grouped-model-choice-field/"/>
   <updated>2009-04-22T09:05:40+00:00</updated>
   <id>http://room-303.com/blog/2009/04/22/django-hack-grouped-model-choice-field</id>
   <content type="html">&lt;p&gt;Przypuśćmy, że nasza aplikacja pozwala kupić koszulkę. Dostępne kolory zależą od rozmiaru i trzeba pozwolić je jakoś wybrać. Dwa &lt;code&gt;select&lt;/code&gt;y? Będzie się dało wybrać nieistniejącą kombinację. Łączony select? Nieczytelnie, chyba że&amp;hellip;&lt;/p&gt;

&lt;blockquote&gt;&lt;label&gt;To tylko przykład: &lt;select&gt;&lt;optgroup label=&quot;M&quot;&gt;&lt;option&gt;biały&lt;/option&gt;&lt;option&gt;niebieski&lt;/option&gt;&lt;/optgroup&gt;&lt;optgroup label=&quot;XL&quot;&gt;&lt;option&gt;czerwony&lt;/option&gt;&lt;option&gt;niebieski&lt;/option&gt;&lt;option&gt;żółty&lt;/option&gt;&lt;/optgroup&gt;&lt;/select&gt;&lt;/label&gt;&lt;/blockquote&gt;

&lt;p&gt;Poniższe rozwiązanie używa klasy &lt;code&gt;GroupedSelect&lt;/code&gt; &lt;a href=&quot;http://www.djangosnippets.org/snippets/200/&quot;&gt;pochodzącej z Django Snippets&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;from django.forms import ModelChoiceField, ValidationError
from django.forms.util import smart_unicode
from django.utils.itercompat import groupby
from operator import attrgetter

class GroupedModelChoiceIterator(object):
    def __init__(self, field, grouper):
		self.field = field
		self.queryset = field.queryset
		self.grouper = grouper

    def __iter__(self):
		if self.field.empty_label is not None:
			yield (None, ((u'', self.field.empty_label), ))
		for grouper, items in groupby(self.queryset.all(), attrgetter(self.grouper)):
			yield (unicode(grouper), tuple((o.pk, unicode(o)) for o in items))

class GroupedModelChoiceField(ModelChoiceField):
	def __init__(self, field, widget = GroupedSelect, *args, **kwargs):
		self._field = field
		super(GroupedModelChoiceField, self).__init__(widget = widget, *args, **kwargs)

	def _get_choices(self):
		return GroupedModelChoiceIterator(self, self._field)

	choices = property(_get_choices, None)
		
	def clean(self, value):
		&quot;&quot;&quot;
		Validates that the input is in self.choices.
		&quot;&quot;&quot;
		if value in (None, ''):
			value = u''
		value = smart_unicode(value)
		valid_values = \[\]
		for group_label, group in self.choices:
			valid_values += [str(k) for k, v in group]
		if value not in valid_values:
			raise ValidationError(u'Select a valid choice. That choice is not one of the available choices.')
		return super(GroupedModelChoiceField, self).clean(value)&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Przykład (zakładając, że &lt;code&gt;color&lt;/code&gt; jest referencją na obiekt, który posiada pole &lt;code&gt;size&lt;/code&gt;):&lt;/p&gt;

&lt;blockquote&gt;&lt;code&gt;&lt;pre&gt;class SizeAndColorForm(forms.ModelForm):
	class Meta:
		model = Product
		fields = ['color']
	color = GroupedModelChoiceField(field = 'size', label = u'size/color')&lt;/pre&gt;&lt;/code&gt;&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>Wstęp do kultury: ten komentarz ewentualnie wyjebać</title>
   <link href="http://room-303.com/blog/2009/04/02/wstep-do-kultury-ten-komentarz-ewentualnie-wyjebac/"/>
   <updated>2009-04-02T14:13:37+00:00</updated>
   <id>http://room-303.com/blog/2009/04/02/wstep-do-kultury-ten-komentarz-ewentualnie-wyjebac</id>
   <content type="html">&lt;p&gt;Jeśli ktoś przegapił &lt;a href=&quot;http://blip.pl/s/8524980&quot;&gt;dyskusję na Blipie&lt;/a&gt;, to z pewnością powinien nadrobić i zapoznać się ze startupem &lt;a href=&quot;http://wieczne-odpoczywanie.pl/&quot;&gt;Wieczne Odpoczywanie&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Uwaga:&lt;/strong&gt; notka zawiera słownictwo nieodpowiednie dla osób, które nie sięgają brodą do klawiatury.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/3407151684/&quot; title=&quot;Wieczne odpoczywanie by patrys, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3610/3407151684_82224c2079_o.png&quot; width=&quot;560&quot; height=&quot;323&quot; alt=&quot;Wieczne odpoczywanie&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tu właściwie mógłbym zakończyć.&lt;/p&gt;

&lt;p&gt;Jaka mądrość płynie z powyższego fragmentu kodu? &lt;em&gt;Nie ma żadnego powodu, żeby komentarze przeznaczone dla ekipy opuszczały serwer&lt;/em&gt;. Ładnie, ale to się nie sprawdza. Podejrzewam wręcz, że autorowi w ogóle do głowy nie przyszło, że da się to odczytać poza serwerem.&lt;/p&gt;

&lt;p&gt;Bardziej ogólna wersja tego przypadku wygląda tak:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;if impossible:
    print 'FUCK!!1!' # ← this will never happen&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Prawdziwy wniosek jest taki: &lt;em&gt;&lt;strong&gt;nigdy&lt;/strong&gt; nie umieszczaj w programie kodu, którego efekt działania jest kompromitujący&lt;/em&gt;. I nie dotyczy to tylko komentarzy w &lt;abbr&gt;HTML&lt;/abbr&gt;. Główni podejrzani to przede wszystkim różnego rodzaju &lt;q&gt;niemożliwe&lt;/q&gt; asercje (błędy typu &lt;q&gt;wyjebało się połączenie do bazy&lt;/q&gt; okazują się całkiem możliwe po telefonie od klienta).&lt;/p&gt;

&lt;p&gt;Nie zapominajmy też o jednej z najpopularniejszych metod debugowania, żartobliwie ochrzczonej przeze mnie &lt;em&gt;chujotestem&lt;/em&gt; (polega na wstawianiu w różne miejsca w kodzie właściwej dla danego języka instrukcji drukującej nazwę pewnej popularnej wśród pań części ciała; choć brzmi całkiem niepoważnie, jest bardzo skuteczną metodą śledzenia przepływu sterowania w programowaniu wielowątkowym).&lt;/p&gt;

&lt;p&gt;Chcę też zastrzec, że o ile to właśnie religijna tematyka serwisu sprawia, że komentarze w kodzie stają się tak zabawne, to nie chcę, żeby ktoś odebrał to jako nagonkę na jakikolwiek kościół (w sensie organizacji, nie budynku). Miejsce na dyskusje religijne jest pod &lt;a href=&quot;http://room-303.com/blog/2009/04/01/wstep-do-kultury-ateizm/&quot;&gt;wczorajszą notką&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;PS: Kod &lt;abbr&gt;HTML&lt;/abbr&gt; wspomnianego wyżej serwisu nadaje się na całą serię notek, celowo na zrzucie ekranu pozostawiłem niezwykle interesującą metodę ukrywania elementów. Ktoś umie zrobić to bardziej absurdalnie? Aż prosi się o &lt;abbr&gt;XML&lt;/abbr&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Wstęp do kultury: ateizm</title>
   <link href="http://room-303.com/blog/2009/04/01/wstep-do-kultury-ateizm/"/>
   <updated>2009-04-01T07:21:15+00:00</updated>
   <id>http://room-303.com/blog/2009/04/01/wstep-do-kultury-ateizm</id>
   <content type="html">&lt;blockquote&gt;&lt;p&gt;— W jakiego koloru butach lubisz jeździć na nartach?&lt;/p&gt;
&lt;p&gt;— Nie jeżdżę na nartach.&lt;/p&gt;
&lt;p&gt;— Głupi jesteś? Pytałam o kolor!&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Bez sensu, prawda? A może tak:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;— Jakiego jesteś wyznania?&lt;/p&gt;
&lt;p&gt;— Jestem ateistą.&lt;/p&gt;
&lt;p&gt;— To niemożliwe, każdy w coś wierzy!&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Brzmi znajomo? Jeśli oczekujesz od innych, że będą tolerować przeróżne historie o &lt;em&gt;kosmicznym zombie, który jednocześnie jest własnym ojcem i swoim niewidzialnym przyjacielem, dał się sfragować, zrespawnował i codziennie z tobą czatuje&lt;/em&gt;, zrozum, że kogoś innego może to interesować tyle, co wampiry i wilkołaki.&lt;/p&gt;

&lt;p&gt;Religie, nawracania, dżihady — wielki konwent, na którym spotkali się najbardziej oddani fani Batmana i Supermana. Kto jest potężniejszy? Który by wygrał? Tak właśnie to wygląda z boku. A mimo to nie każę ci palić kościołów, synagog i meczetów. Niektórzy potrzebują w coś wierzyć, więc jeśli lubisz narty, to baw się dobrze.&lt;/p&gt;

&lt;p&gt;Pamiętaj tylko o jednym: tak jak niejeżdżenie na nartach nie jest kolorem, tak &lt;em&gt;ateizm nie jest religią&lt;/em&gt;. A skoro nie jest, to &lt;em&gt;przestań mnie namawiać na jej zmianę&lt;/em&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Wstęp do kultury: listy dyskusyjne</title>
   <link href="http://room-303.com/blog/2009/03/29/wstep-do-kultury-listy-dyskusyjne/"/>
   <updated>2009-03-29T14:09:03+00:00</updated>
   <id>http://room-303.com/blog/2009/03/29/wstep-do-kultury-listy-dyskusyjne</id>
   <content type="html">&lt;blockquote&gt;&lt;p&gt;Hello Patryk Zawadzki,&lt;/p&gt;
&lt;p&gt;I use Boxbe to protect my email address. While I did receive your email about &lt;q&gt;Re: [Bluez-devel] [Bluez-users] Motorola S9 and BlueZ 4.14&lt;/q&gt;, you are not currently on my email Guest List. I'll be more likely to see your email and future messages if you are on my priority Guest List.&lt;/p&gt;
&lt;p&gt;Click here to be put directly on my Guest List&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Taki właśnie komunikat widzę ostatnimi czasy codziennie. Co ciekawe, śmieci od &lt;a href=&quot;http://www.boxbe.com/&quot; rel=&quot;nofollow&quot;&gt;Boxbe&lt;/a&gt; dotyczą wiadomości wysłanych na listy dyskusyjne. Pół roku temu.&lt;/p&gt;

&lt;p&gt;Ludzie, takie wynalazki możecie sobie podłączać do &lt;q&gt;ochrony&lt;/q&gt; korespondencji z ciocią, na listach kwalifikują was na wypisanie i dożywotni zakaz wstępu. Podobnie jak każdy inny rodzaj autorespondera. Tych czterysta osób jakoś obejdzie się bez informacji, że od zeszłego wtorku do przyszłej środy opalacie dupę na Majorce i zastępuje was pani Kazia z pokoju 102.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>GNOME 2.26</title>
   <link href="http://room-303.com/blog/2009/03/19/gnome-226/"/>
   <updated>2009-03-19T09:19:23+00:00</updated>
   <id>http://room-303.com/blog/2009/03/19/gnome-226</id>
   <content type="html">&lt;p class=&quot;strip simple&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/3367741580/&quot; title=&quot;GNOME 2.26 by patrys, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3633/3367741580_8fc6a571eb_o.png&quot; width=&quot;600&quot; height=&quot;200&quot; alt=&quot;GNOME 2.26&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://library.gnome.org/misc/release-notes/2.26/index.html.pl&quot;&gt;Co nowego?&lt;/a&gt; Dostępne we wszystkich dobrych dytrybucjach (z &lt;a href=&quot;http://pld-linux.org/&quot;&gt;PLD&lt;/a&gt; włącznie).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Django hack: OrderedForm</title>
   <link href="http://room-303.com/blog/2009/03/12/django-hack-orderedform/"/>
   <updated>2009-03-12T12:35:41+00:00</updated>
   <id>http://room-303.com/blog/2009/03/12/django-hack-orderedform</id>
   <content type="html">&lt;p&gt;Ile razy ręcznie składałem formularz w szablonie tylko po to, żeby pola były we właściwej kolejności? Nie mam pojęcia, ale od jakiegoś czasu stosuję poniższe rozwiązanie. Tak, to jest jedna z tych notek &lt;em&gt;ku własnej pamięci&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;class OrderedForm(object):
	def __init__(self, *args, **kwargs):
		super(OrderedForm, self).__init__(*args, **kwargs)
		if hasattr(self.Meta, 'fields_order'):
			self.fields.keyOrder = self.Meta.fields_order&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Po umieszczeniu powyższego w jakimś ustronnym wspólnym module można zabrać się za używanie:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;from django.contrib.auth.models import User
from django import forms
from core.forms import OrderedForm

class UserNewForm(OrderedForm, forms.ModelForm):
	class Meta:
		model = User
		fields = ('first_name', 'last_name', 'username', 'password', 'email')
		fields_order = ('username', 'password', 'first_name', 'last_name', 'email')
	password = forms.CharField(label = u'Password', required = True, widget = forms.PasswordInput(attrs = {'autocomplete': 'off'}))&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Trzeba zauważyć, że &lt;code&gt;OrderedForm&lt;/code&gt; celowo nie dziedziczy po żadnej innej klasie Django, dzięki czemu równie dobrze działa z &lt;code&gt;forms.ModelForm&lt;/code&gt;, co z &lt;code&gt;forms.Form&lt;/code&gt;, jak i z dowolną własną (zgodną) implementacją.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Troika.py</title>
   <link href="http://room-303.com/blog/2009/03/11/troikapy/"/>
   <updated>2009-03-11T12:57:19+00:00</updated>
   <id>http://room-303.com/blog/2009/03/11/troikapy</id>
   <content type="html">&lt;p&gt;Dzisiaj na blipie kilka osób podzieliło się linkami do niesamowitego frameworku Troika.&lt;abrr&gt;ASP. &lt;a href=&quot;http://www.troika-asp.com/tutorial-hello-world-application.html&quot;&gt;Tutorial&lt;/a&gt; bardzo mi się spodobał, więc natychmiast zechciałem przygotować swoją wersję.&lt;/abrr&gt;&lt;/p&gt;

&lt;h4&gt;Disclaimer&lt;/h4&gt;

&lt;p&gt;Osoby bez poczucia humoru powinny iść do domu na obiad, mama was przed chwilą wołała.&lt;/p&gt;

&lt;h4&gt;Tutorial&lt;/h4&gt;

&lt;p&gt;Napiszemy prostą aplikację za pomocą Troika.py. Celem jest pośmianie się.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Tworzymy nowy projekt:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;$ django-admin.py startproject troikapy
$ cd troikapy
$ ls
__init__.py  manage.py  settings.py  urls.py
$ chmod +x manage.py&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Oto, co robi powyższa deklaracja:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tworzy nowy projekt o nazwie &lt;q&gt;troikapy&lt;/q&gt;;&lt;/li&gt;
&lt;li&gt;Wchodzi do stworzonego katalogu;&lt;/li&gt;
&lt;li&gt;Drukuje listę plików;&lt;/li&gt;
&lt;li&gt;Nadaje plikowi &lt;code&gt;manage.py&lt;/code&gt; atrybut &lt;q&gt;wykonywalny&lt;/q&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tworzymy nową aplikację:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;$ mkdir hello
$ touch hello/__init__.py
$ mkdir hello/templates&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stwórzmy plik &lt;code&gt;hello/views.py&lt;/code&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;from django import forms
from django.views.generic.simple import direct_to_template

class HelloForm(forms.Form):
  name = forms.CharField(label = u'Name, bitch')

def hello(request):
  if request.method == 'POST':
    form = HelloForm(request.POST)
    if form.is_valid():
      name = form.cleaned_data['name']
      return direct_to_template(request, 'hello.html', {'form': form, 'name': name})
  else:
    form = HelloForm()
  return direct_to_template(request, 'hello.html', {'form': form})&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stwórzmy plik &lt;code&gt;hello/templates/hello.html&lt;/code&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01
      Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&amp;gt;
&amp;lt;html&amp;gt;
        &amp;lt;head&amp;gt;
                &amp;lt;title&amp;gt;Hello World Application&amp;lt;/title&amp;gt;
        &amp;lt;/head&amp;gt;
        &amp;lt;body&amp;gt;
                &amp;lt;h1&amp;gt;Welcome to Hello World Application!&amp;lt;/h1&amp;gt;
{% if name %}
                &amp;lt;h2&amp;gt;Hello {{ name }}!&amp;lt;/h2&amp;gt;
                &amp;lt;p&amp;gt;Date/time is {% now &quot;r&quot; %}&amp;lt;/p&amp;gt;
{% endif %}
                &amp;lt;form method=&quot;post&quot; action=&quot;&quot;&amp;gt;
                        {{ form.as_p }}
                        &amp;lt;p&amp;gt;&amp;lt;input type=&quot;submit&quot;&amp;gt;&amp;lt;/p&amp;gt;
                &amp;lt;/form&amp;gt;
        &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modyfikujemy plik &lt;code&gt;urls.py&lt;/code&gt; w celu &lt;del&gt;powiązania akcji HelloAction z komendą helloworld&lt;/del&gt; &lt;ins&gt;przypisania widoku (kontrolera) do adresu:&lt;/ins&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^$', 'hello.views.hello'),
)&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;W pliku &lt;code&gt;settings.py&lt;/code&gt; umieszczamy aplikację &lt;code&gt;hello&lt;/code&gt; jako jedyną na liście &lt;code&gt;INSTALLED_APPS&lt;/code&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;&amp;hellip;

INSTALLED_APPS = (
    'hello',
)&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Zauważamy, że prawie nic nie napisaliśmy, a mimo to skończyliśmy o 6 kroków za szybko. Ten i kilka kolejnych kroków przeznaczamy na wymyślanie zawiłych formatów aplikacji &lt;abbr&gt;XML&lt;/abbr&gt; i separację &lt;abbr&gt;MVC&lt;/abbr&gt; poprzez osadzanie kodu serwerowego w szablonach &lt;abbr&gt;HTML&lt;/abbr&gt;. Powoli wracamy do zmysłów, zaczynamy zastanawiać się, czemu reszta świata nie chce używać Troika.&lt;abbr&gt;ASP&lt;/abbr&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
</content>
 </entry>
 
 <entry>
   <title>Wrażenia: Noby Noby Boy</title>
   <link href="http://room-303.com/blog/2009/02/24/wrazenia-noby-noby-boy/"/>
   <updated>2009-02-24T21:38:45+00:00</updated>
   <id>http://room-303.com/blog/2009/02/24/wrazenia-noby-noby-boy</id>
   <content type="html">&lt;p&gt;Na wstępie uprzedzam, że tekst kilka dni temu &lt;a href=&quot;http://polygamia.pl/Polygamia/1,96455,6299992,Pierwsze_wrazenia__Noby_Noby_Boy.html&quot;&gt;pojawił się na Polygamii&lt;/a&gt; (którą uparcie wymawiam z wyraźnym &lt;q&gt;i&lt;/q&gt; na modłę &lt;em&gt;poliamorii&lt;/em&gt;).&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/3293870304/&quot; title=&quot;NOBY NOBY BOY by patrys, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3628/3293870304_eb8f5852bc.jpg&quot; width=&quot;500&quot; height=&quot;281&quot; alt=&quot;NOBY NOBY BOY&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choć większość z posiadaczy PS3 zapewne zaciera już ręce i szykuje portfele na myśl o zbliżającej się nieuchronnie premierze &lt;strong&gt;Killzone 2&lt;/strong&gt;, ja z przyjemnością wciąż odławiam trafiające na PSN perełki. Tydzień temu doczekałem się wreszcie premiery &lt;strong&gt;Flower&lt;/strong&gt;, &lt;a href=&quot;http://polygamia.pl/Polygamia/1,95335,6251259,Recenzja__Flower.html&quot;&gt;goszczącego już na łamach Polygamii&lt;/a&gt;, dziś z radością dałem się naciągnąć na zakup &lt;strong&gt;Noby Noby Boy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Cena nie jest wygórowana, bo pozycja uszczupli nasz portfel o kwotę jedynie 14 PLN, co odpowiada dwóm parom ciuszków do &lt;strong&gt;Little Big Planet&lt;/strong&gt;. Z całą pewnością nie jest to wiele, jednak nie możemy zapominać - na co zwrócił nam w ostatnich dniach uwagę sam autor - że &lt;strong&gt;Noby Noby&lt;/strong&gt; nie jest do końca grą. Jeśli miałbym określić typ zabawy bez posiłkowania się planszami i filmami, to najbliżej jej do skrzyżowania znanego z komórek węża z &lt;strong&gt;Katamari Damacy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Właściwie pierwsze skojarzenie po włączeniu gry to właśnie &lt;strong&gt;Katamari&lt;/strong&gt;. W menu wita nas wróżka, która pomaga nam stworzyć zapis stanu gry i w mini-quizie każe nam odgadnąć (sic!) sposób sterowania postacią. Kilka sekund później otrzymujemy swoje pierwsze trofeum (tak, tak - &lt;strong&gt;Noby Noby&lt;/strong&gt; pozwala nam zdobyć całkiem pokaźną kolekcję pucharów). Kolejne wrażenia to wciąż &lt;strong&gt;Katamari&lt;/strong&gt;. Od samego początku towarzyszy nam ta sama prosta, kolorowa grafika, choć sam świat padł ofiarą wyraźnych cięć, wydaje się że związanych z dużo wierniejszym rzeczywistości modelem fizyki. Rozgrywkę prowadzimy na niewielkich prostokątnych fragmentach terenu, które dość szybko okazują się całkiem małe w porównaniu z możliwościami naszego bohatera.&lt;/p&gt;

&lt;p&gt;Właśnie, jak wygląda zabawa? Z wszechobecnych ostatnio filmików nie można właściwie wywnioskować wiele ponad fakt, że sprawujemy kontrolę nad postacią składającą się z dwóch kulek wyposażonych w nóżki i połączonych kolorowym wężykiem. Z samej gry nie dowiadujemy się wiele więcej - wężyk pełni rolę żołądka i pozwala składować w naszym wnętrzu przedmioty w ilości i wielkości proporcjonalnej do rozmiarów Boya, kulki stanowią odpowiednio głowę (służącą do jedzenia) i pupę (służącą do sami wiecie czego). Tak, nadmiarowe obiekty, które stały się naszym posiłkiem, zostają natychmiast wydalone - w postaci nienaruszonej, za to ze stosownym do sytuacji dźwiękiem. Plansze generowane są losowo i w każdym momencie - z pomocą swojego domku - możemy zażyczyć sobie przeprowadzkę w inną okolice, cała reszta zależy od nas.&lt;/p&gt;

&lt;p&gt;Całość jest genialna i nie ma najmniejszego sensu. Właściwie jedyny narzucony odgórnie cel, to stworzenie jak najdłuższego stworka - suma długości wszystkich Noby Nobich jest odnotowywana w postaci długości Girl - narzeczonej (siostry?) naszego bohatera. Mamy więc do czynienia z ciekawą wersją współpracy, gdzie każdy z nas gra tak naprawdę offline, choć pojawia się element współzawodnictwa: dostępne są notowania całkowitego wkładu, jaki w długość Girl mają poszczególni gracze. W &lt;q&gt;grze&lt;/q&gt; oprócz celu brak jest jakichkolwiek przeciwników, nie ma właściwie jakiejkolwiek metody by zginąć, przegrać czy przerwać naszą zabawę. Jaki jest zatem cel wydłużania naszej postaci i - pośrednio - Girl? Autor obiecuje, że w momencie gdy długość Girl zacznie przekraczać odległości kolejnych ciał niebieskich od Ziemi, Noby Noby będzie mógł pobawić się również na ich powierzchni.&lt;/p&gt;

&lt;p&gt;Dodać do tego należy mnóstwo humoru, możliwość robienia zrzutów ekranu z poziomu XMB, nagrywania filmów (z uploadem na YouTube włącznie) i... komunikacji za pomocą tułowia naszej postaci a otrzymamy przepis na tytuł który spolaryzuje graczy. Nie mam wątpliwości, że &lt;strong&gt;Noby Noby&lt;/strong&gt; - podobnie jak &lt;strong&gt;Katamari&lt;/strong&gt; - podzieli nas na tych, którzy nie będą w stanie się od niego oderwać i tych, którzy będą do niego pałać szczerą nienawiścią od pierwszego wejrzenia. Myślę, że za równowartość dwóch piw w lokalu warto przekonać się na własnej skórze.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Zaczynam nowy mem</title>
   <link href="http://room-303.com/blog/2009/02/24/zaczynam-nowy-mem/"/>
   <updated>2009-02-24T18:22:37+00:00</updated>
   <id>http://room-303.com/blog/2009/02/24/zaczynam-nowy-mem</id>
   <content type="html">&lt;p&gt;Właściwie, to rzuciłem tym skojarzeniem już kilkukrotnie, ale dopiero dzisiaj zostało podłapane na Blipie. Zatem &lt;em&gt;behold&lt;/em&gt;:&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/3307201942/&quot; title=&quot;Alior Bank by patrys, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3393/3307201942_de4d6dcaf0_o.jpg&quot; width=&quot;450&quot; height=&quot;225&quot; alt=&quot;Alior Bank&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;ARE BELONG TO US&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pierwsza z &lt;a href=&quot;http://blip.pl/s/7349352&quot;&gt;wersją graficzną&lt;/a&gt; była &lt;a href=&quot;http://nerdkya.evil.pl/&quot;&gt;kya&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Rezerwa</title>
   <link href="http://room-303.com/blog/2009/02/23/rezerwa/"/>
   <updated>2009-02-23T09:48:03+00:00</updated>
   <id>http://room-303.com/blog/2009/02/23/rezerwa</id>
   <content type="html">&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/3302593341/&quot; title=&quot;Przeniesiony do rezerwy by patrys, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3472/3302593341_f568b9f50f.jpg&quot; width=&quot;500&quot; height=&quot;375&quot; alt=&quot;Przeniesiony do rezerwy&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nareszcie!&lt;/strong&gt; Świętowanie planowane na wieczór.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Przypowieść o osobomiesiącu</title>
   <link href="http://room-303.com/blog/2009/02/20/przypowiesc-o-osobomiesiacu/"/>
   <updated>2009-02-20T13:37:03+00:00</updated>
   <id>http://room-303.com/blog/2009/02/20/przypowiesc-o-osobomiesiacu</id>
   <content type="html">&lt;p&gt;Szkoda, że do niektórych wciąż nie dotarło, że wydajność i szybkość zespołu nie jest funkcją liniową jego liczebności. Jeśli zatem na tydzień przed deadlinem zarząd postanowi ci przydzielić pomocnika, wydrukuj i zawieś sobie nad biurkiem poniższą łamigłówkę dla managerów:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Rozważmy parę kurierów, Jasia i Małgosię, którzy kursują z przesyłkami pomiędzy miastami A i B. Jaś z miasta A do miasta B biegnie dwa dni, Małgosia na pokonanie tej samej trasy potrzebuje trzech dni. Dla uproszczenia zakładamy, że zachowują stałą prędkość w czasie całej doby. Jak zatem zmieni się prędkość Jasia i czas jego podróży, jeśli:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;po czasie jednego dnia śladem Jasia ruszy Małgosia?&lt;/li&gt;
&lt;li&gt;po czasie jednego dnia Małgosia wyruszy z miasta B w stronę miasta A?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bazując na wcześniejszych obliczeniach i zakładając, że nie wydarzy się &lt;em&gt;pierdolony cud&lt;/em&gt;, opisz swoimi słowami cel przydzielania dodatkowych pracowników na tak późnym etapie realizacji. Postaraj się użyć następujących zwrotów: &lt;q&gt;planowanie cyklu życia projektu&lt;/q&gt;, &lt;q&gt;raportowanie postępów&lt;/q&gt;, &lt;q&gt;musiałem kryć własną dupę, zrobiłem co mogłem, a teraz będzie na nich&lt;/q&gt;.&lt;/p&gt;&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>Wrażenia: Flower</title>
   <link href="http://room-303.com/blog/2009/02/13/wrazenia-flower/"/>
   <updated>2009-02-13T23:41:32+00:00</updated>
   <id>http://room-303.com/blog/2009/02/13/wrazenia-flower</id>
   <content type="html">&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/3276788489/&quot; title=&quot;Flower by patrys, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3523/3276788489_79ce486111.jpg&quot; width=&quot;500&quot; height=&quot;375&quot; alt=&quot;Flower&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nie będę ukrywał, że jako wielki fan fl0w po &lt;q&gt;kwiatka&lt;/q&gt; sięgnąłem w zasadzie bez zastanowienia i dzień jego premiery od kilku tygodni zaznaczony był w moim kalendarzu.&lt;/p&gt;

&lt;p&gt;Co dostajemy w zamian za wydatek w wysokości 29 złotych? Siedem plansz, z czego sześć składa się na &lt;q&gt;wątek fabularny&lt;/q&gt;, a siódma pozwala nam zapoznać się z listą autorów. O ile pierwszy poziom jest czystą sielanką, o tyle piąty nie był daleki od przyprawienia mnie o nerwicę. Nie jest więc tak, że pierwsza plansza robi wrażenie, a dalej otrzymujemy tylko &lt;q&gt;więcej tego samego&lt;/q&gt;.&lt;/p&gt;

&lt;p&gt;Każdy poziom ma swój klimat i własny motyw przewodni, a po skończeniu całości z pewnością nie zakwalifikujecie gry jako wygaszacz dla dzieci (bo i takie głosy się pojawiły). Dodatkowo gra nagradza ciekawskich i naprawdę warto pobawić się mechaniką, jaka rządzi poszczególnymi &lt;q&gt;snami&lt;/q&gt; &amp;mdash; w przeciwieństwie do czytania przewodników po trofeach daje to masę satysfakcji.&lt;/p&gt;

&lt;p&gt;Trzeba też przyznać, że poziom emocji narasta tu bardziej od poziomu trudności i choć nie ma sytuacji, w których groziło by nam przerwanie rozrywki, to jednak pierwsze, sielskie plansze przyczyniają się do powstania więzi między graczem a kierowaną przez niego garścią płatków. Powiem wprost, kiedy kończy się sielanka, to ten wewnętrzny trzylatek dostaje kapciem w twarz, a chwilę potem ktoś wyrywa mu lizaka. To nie jest ten rodzaj emocji, jaki wywołuje nadlatujące wiadro granatów w World at War, to bezradność, jaka towarzyszy czołganiu się Snake'a ku &amp;mdash; zdaje się &amp;mdash; nieuchronnej zagładzie.&lt;/p&gt;

&lt;p&gt;Czy warto kupić? &lt;em&gt;C'mon, za 29 złotych?&lt;/em&gt; A po zakupie polecam posłuchać dźwięków, jakie towarzyszą poszczególnym kwiatkom w &lt;q&gt;menu&lt;/q&gt; i obejrzenie trybu wygaszacza ekranu (przycisk &lt;kbd&gt;Select&lt;/kbd&gt; w czasie gry) &amp;mdash; czy tylko ja widzę tu doskonały tryb wizualizacji dla wbudowanego w konsolę odtwarzacza muzyki?&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Wrażenia: Killzone 2 demo</title>
   <link href="http://room-303.com/blog/2009/02/06/wrazenia-killzone-2-demo/"/>
   <updated>2009-02-06T10:07:01+00:00</updated>
   <id>http://room-303.com/blog/2009/02/06/wrazenia-killzone-2-demo</id>
   <content type="html">&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/3257032563/&quot; title=&quot;Killzone 2 by patrys, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3333/3257032563_68892a75ef.jpg&quot; width=&quot;500&quot; height=&quot;281&quot; alt=&quot;Killzone 2&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tak, taki to okres, że wszyscy piszą o jednym, ale nie jest przecież tak źle &amp;mdash; przynajmniej na tym blogu nie dowiecie się, kto został nowym dyrektorem kreatywnym, a kto z kolegami przyznał sobie &lt;q&gt;nagrodę za najlepszą kreację multimedialną, która to nagroda wcale nie jest nagrodą od kolegów i nie świadczy o wzajemnym całowaniu się w ptaszka.&lt;/q&gt; A, no i nie jeżdżę na wszystkie *campy, żeby nie dostać w tubę, więc czujcie się bezpieczni.&lt;/p&gt;

&lt;p&gt;Wróćmy zatem do pisania stereotypowej notki na temat premiery demonstracyjnej wersji Killzone 2:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Gra zapowiada się cudnie. ROTFLOLMAOMFG BBQ!&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;I po bólu, możemy przejść do ciekawszych rzeczy. Zacznijmy od grafiki.&lt;/p&gt;

&lt;p&gt;&lt;del&gt;Nowym dyrektorem krea&amp;hellip;&lt;/del&gt; Niektórzy &amp;mdash; co widać po komentarzach w różnych serwisach poświęconych grom &amp;mdash; spodziewali się tekstur, które można oglądać pod mikroskopem. Inni oczekiwali modeli o siatkach złożonych z miliardów trójkątów. Teraz obie te grupy się zawiodły. Jaka jest grafika? Otóż &lt;em&gt;grafika jest zajebista&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Tekstury są świetnie zmapowane na obiektach, woda wygląda koncertowo (i odbija się w niej to, co powinno, a nie znajdujący się kilometr dalej most i góry w tle, jak to na ogół bywa) a modele są jednymi z najładniejszych, jakie widziałem. Nie ma mowy o żadnych widocznych szwach na styku tekstur, nie ma ośmiokątnych zaokrągleń, animacje stoją na najwyższym poziomie (drżącą rękę przy napiętych mięśniach podczas podciągania innego żołnierza na platformę z windą &lt;em&gt;trzeba zobaczyć&lt;/em&gt;) i &amp;mdash; przede wszystkim &amp;mdash; zupełnie nie widać skalowania &lt;abbr title=&quot;level of detail&quot;&gt;LOD&lt;/abbr&gt; (czego nie można powiedzieć o &lt;q&gt;hicie&lt;/q&gt; zatytułowanym Force Unleashed). Dobrych kilka minut stałem z głową 20 cm od ekranu 32&quot; i oglądałem broń, z którą zaczynamy rozgrywkę.&lt;/p&gt;

&lt;p&gt;Czas na mapy. Po ośmiu minutach rozgrywki (tyle potrzeba na przejście obu dostępnych w demie sekcji Koryntu) ciężko ocenić, jak prezentuje się gra. W demie plansze robią wrażenie, choć nie mamy tu do czynienia z rewolucyjnym systemem zniszczeń, jaki wróżyli nam recenzenci. Ot, można przestrzelić drewnianą skrzynkę albo wysadzić kilka butli z gazem bądź ciekłym paliwem. Może to i dobrze, bo burzenie budynków za pomocą granatnika 40 mm w Bad Company wywołało u mnie tylko uśmiech politowania.&lt;/p&gt;

&lt;p&gt;Cała reszta zniszczeń &amp;mdash; z mostem nad Koryntem włącznie &amp;mdash; to precyzyjnie oskryptowane zdarzenia, które &amp;mdash; choć śliczne &amp;mdash; występują sporadycznie i zawsze w ten sam sposób. Co zwraca uwagę to odłamki zniszczonych obiektów, które nie teleportują się na pokład Enterprise w pięć sekund po eksplozji, tylko posłusznie leżą tam, gdzie je fizyka cisnęła.&lt;/p&gt;

&lt;p&gt;Na koniec zaś zostawiłem sobie sterowanie. Czy gra się dobrze? Gra się świetnie, to jest ten poziom intuicyjności otoczenia, przy którym nawet Resistance 2 może wydać się nieco toporny. Żeby jednak w pełni cieszyć się kontrolą nad głównym bohaterem musiałem zmienić nieco domyślne obłożenie pada. Nie zrozumcie mnie źle, są gry, gdzie z początku sterowanie wydaje się nieintuicyjne, ale z czasem gracz uczy się je kochać (Mirror's Edge). Są też gry, gdzie ma się wrażenie, jak gdyby autorzy dołożyli wszelkich starań, aby czymś się wyróżniać na tle gatunku.&lt;/p&gt;

&lt;p&gt;O ile konieczność przytrzymywania przycisku w celu ukrycia się za przeszkodą sprawdza się świetnie, o tyle podnoszenie broni do oka w postaci przełącznika jest tak wygodne, jak golenie z użyciem kamerki 0.3 megapiksela zamiast lustra. Niezwłocznie po uruchomieniu zalecam więc wyłączenie przełącznika celowania i zamianę miejscami R3 i L1, co w efekcie daje sterowanie idealne &amp;mdash; niemal identyczne z serią Call of Duty.&lt;/p&gt;

&lt;p&gt;Czy gra jest warta zakupu? Nawet jeśli pozostałych kilka godzin gry niczym się nie różni od dwóch sekcji zawartych w wersji demonstracyjnej. Czy oznacza śmierć konkurencyjnych konsol? Zdecydowanie nie. Cóż, pokuszę się nawet o małe proroctwo i powiem, że jeśli Killzone 2 nie okaże się system sellerem, to w tym roku żadna inna gra nie będzie miała na to szansy (mówię oczywiście o rynku amerykańskim, w Europie Sony radzi sobie świetnie). Nic to, jako szczęśliwy posiadacz PlayStation 3 cierpliwie czekam na koniec lutego.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>PLD Linux: Flash i działający dźwięk</title>
   <link href="http://room-303.com/blog/2009/01/27/pld-linux-flash-i-dzialajacy-dzwiek/"/>
   <updated>2009-01-27T20:12:05+00:00</updated>
   <id>http://room-303.com/blog/2009/01/27/pld-linux-flash-i-dzialajacy-dzwiek</id>
   <content type="html">&lt;p&gt;Ku pamięci (dotyczy również innych dystrybucji):&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;$ sudo lsmod | grep snd
snd_pcsp                9120  2 
snd_hda_intel         311948  5 
snd_pcm                58500  4 snd_pcsp,snd_hda_intel
snd_timer              18184  1 snd_pcm
snd_hwdep               7684  1 snd_hda_intel
snd_page_alloc          8072  2 snd_hda_intel,snd_pcm
snd                    41124  17 snd_pcsp,snd_hda_intel,snd_pcm,snd_timer,snd_hwdep
soundcore               6496  1 snd&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;$ rpm -q pulseaudio alsa-plugins-pulse gstreamer-pulseaudio
pulseaudio-0.9.14-1.i686
alsa-plugins-pulse-1.0.19-1.i686
gstreamer-pulseaudio-0.10.13-1.i686&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;$ cat ~/.asoundrc
pcm.!default {
    type pulse
}
ctl.!default {
    type pulse
}&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Z takimi ustawieniami (i aktywnym daemonem PulseAudio) Flash w końcu przestaje kłócić się z resztą systemu o urządzenie ALSA, czego efektem jest dźwięk we Flashu, który nie znika po kilkunastu minutach od włączenia przeglądarki.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Firewall na porcie 1984</title>
   <link href="http://room-303.com/blog/2009/01/14/firewall-na-porcie-1984/"/>
   <updated>2009-01-14T11:11:53+00:00</updated>
   <id>http://room-303.com/blog/2009/01/14/firewall-na-porcie-1984</id>
   <content type="html">&lt;p&gt;VaGla w swojej notce zatytułowanej &lt;q&gt;&lt;a href=&quot;http://prawo.vagla.pl/node/8305&quot;&gt;Firmy antywirusowe w rozkroku wobec wizji policyjnych włamań&lt;/a&gt;&lt;/q&gt; zwraca uwagę na coś, co wygląda na oczywiste niedopatrzenie ze strony orwellowców lobbujących na rzecz dopuszczenia tak zwanych &lt;q&gt;zdalnych przeszukań&lt;/q&gt; ze strony policji. Wydaje się, że nikt nie wziął pod uwagę, że to administrator komputera decyduje o tym, jakie usługi i komu komputer ów będzie świadczył.&lt;/p&gt;

&lt;p&gt;Nawet jeśli prawo w którymś momencie zezwoli policji na zdalne przeszukanie moich maszyn, będą najpierw musieli w jakiś sposób połączyć się z komputerem. Tu opcje są dwie &amp;mdash; ustawowo wymagany interfejs lub włamanie z wykorzystaniem luk bądź słabości w mechanizmach działającego oprogramowania. W obu przypadkach pojawia się bariera zgodności oprogramowania, każdy system wymaga dedykowanej implementacji interfejsu, każdy ma też inne zabezpieczenia i błędy.&lt;/p&gt;

&lt;p&gt;Naturalny kolejny krok to delegalizacja systemów, które nie będą podatne na taki zdalny dostęp. Czy to ze względu na fakt, że ustawodawca nie dostarczył stosownego oprogramowania, czy ze względu na nadmierne bezpieczeństwo (brak dostatecznie długiej listy znanych luk w zabezpieczeniach). Może któregoś dnia doczytamy się w konstytucji zapisu o tym, że wolność obywatela ogranicza się do wyboru między Windows Vista Home Basic z dodatkiem Service Pack 1 i Windows Vista Business?&lt;/p&gt;

&lt;p&gt;Interesuje mnie też, w jaki sposób organy uprawnione do takich przeszukań określałyby &amp;mdash; przed przystąpieniem do czynności &amp;mdash; czy mają do czynienia ze sprzętem prywatnym pana Kowalskiego, czy z maszyną służbową, znajdującą się w jego biurze bądź serwerem w kolokacji? Jeśli bowiem wolno byłoby przeszukiwać każdy komputer bez wyjątku, to co z zagranicznymi firmami, które część sprzętu posiadają w Polsce i co z obywatelami Polski, którzy wykorzystują komputery poza naszymi granicami? Naturalnym skutkiem będzie masowa emigracja usług IT na wschód.&lt;/p&gt;

&lt;p&gt;I w jaki sposób &amp;mdash; bez czynnej współpracy ze strony przeszukiwanego &amp;mdash; oprogramowanie takie miałoby spenetrować bramki NAT i maskarady, powszechnie stosowane w sieciach domowych?&lt;/p&gt;

&lt;p&gt;Dla mnie cały pomysł zdalnego przeszukania jest jak scenariusz do ekranizacji &lt;q&gt;1984.&lt;/q&gt; Mam spore wątpliwości co do technicznej wykonalności i możliwości egzekwowania takich przepisów.&lt;/p&gt;

&lt;p&gt;Z jednej strony pewnych zabezpieczeń nie da się łatwo przełamać. Nie może być tak, że zdalne obejrzenie listy plików na dysku jest droższe (a pamiętajmy, że czas również jest kosztem) od wysłania tam jednostki antyterrorystycznej, otoczenia budynku i przywiezienia komputera na komendę.&lt;/p&gt;

&lt;p&gt;Z drugiej strony nie można ustawowo nakazać obywatelowi współpracy. Przyczyna jest prosta - który sąd podejmie się rozstrzygać, czy dany sprzęt jest &quot;komputerem&quot; w rozumieniu tej ustawy? W czasach, gdy telefony, kuchenki mikrofalowe i tostery posiadają własne systemy operacyjne, może się okazać koniecznym zaimplementowanie stosownych interfejsów w piekarnikach, samochodach i pralkach.&lt;/p&gt;

&lt;p&gt;Na koniec pozostaje najtrywialniejsza kwestia &amp;mdash; wszyscy związani z branżą IT wiedzą, że żadne zabezpieczenia nie są od uniemożliwiania, ich celem jest utrudnienie powyżej granicy opłacalności. Gdyby jednak powstała specjalna usługa, pozwalająca na pełny, zdalny dostęp do dowolnego komputera w kraju (albo na kontynencie czy wręcz planecie), to kto nie skusi się na przełamanie jej mechanizmów i wykorzystanie ich do własnych celów? Mieliśmy już sytuacje, kiedy oprogramowanie DRM było sprytnie wykorzystywane do ukrywania wirusów i trojanów przed oprogramowaniem antywirusowym, czy tak trudno wyobrazić sobie sytuację, gdy globalny projekt &lt;q&gt;Wielki Brat&lt;/q&gt; staje się tylko ustawowym fundamentem dla zupełnie nowej sieci usług szpiegowskich?&lt;/p&gt;

&lt;p&gt;PS: Z niecierpliwością czekam na projekt mający na celu umożliwienie przeprowadzania zdalnej kolonoskopii bez wiedzy pacjenta.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>PlayStation 3 i gry</title>
   <link href="http://room-303.com/blog/2008/12/29/playstation-3-i-gry/"/>
   <updated>2008-12-29T16:29:04+00:00</updated>
   <id>http://room-303.com/blog/2008/12/29/playstation-3-i-gry</id>
   <content type="html">&lt;p&gt;W nawiązaniu do &lt;a href=&quot;http://costa.kofeina.net/index.php?/archives/1548-W_co_aktualnie_gram_na_PS3.html&quot;&gt;notki CoSTy&lt;/a&gt; i ja podzielę się listą gier, które uważam za szczególnie warte uwagi.&lt;/p&gt;

&lt;dl&gt;
&lt;dt&gt;Heavenly Sword&lt;/dt&gt;
&lt;dd&gt;Moim skromnym zdaniem najlepszy single player na &lt;abbr title=&quot;PlayStation 3&quot;&gt;PS3&lt;/abbr&gt;. Niby slasher w stylu God of War, ale wykonanie i rozmach iście filmowe. Grafika śliczna, a przerywniki filmowe wykonane są perfekcyjnie.&lt;/dd&gt;
&lt;dt&gt;Metal Gear Solid 4&lt;/dt&gt;
&lt;dd&gt;Tradycyjnie, jak to w Metal Gearach - gramy po to, żeby zobaczyć kolejne filmy w reżyserii Kojimy. Rozgrywka bardzo zyskała na przeniesieniu na nowy sprzęt, a łączny czas przerywników liczymy już w godzinach. Jeśli podobał ci się pierwszy Splinter Cell, to pozycja obowiązkowa, niezależnie od tego, czy jesteś fanem serii.&lt;/dd&gt;
&lt;dt&gt;Mirror's Edge&lt;/dt&gt;
&lt;dd&gt;Kolory w grach! W końcu ktoś przypomniał sobie, że grafika nie kończy się na rozmyciu i palecie z pierwszego Quake'a. Ta gra jest najzwyczajniej w świecie śliczna. Do tego dynamiczna rozgrywka, która nie jest shooterem, choć całość obserwujemy z perspektywy bohaterki. Jedyny zarzut to marna animacja przerywników, które wyglądają jak niskobudżetowa produkcja we Flashu.&lt;/dd&gt;
&lt;dt&gt;LittleBigPlanet&lt;/dt&gt;
&lt;dd&gt;Tu chyba nie muszę nic pisać? Detale, z jakimi wykonano poszczególne obiekty przyprawiają o szczękopad, a w przypadku posiadania kilku padów gra staje się przebojem imprezowym.&lt;/dd&gt;
&lt;dt&gt;Buzz!&lt;/dt&gt;
&lt;dd&gt;Tutaj miałem spore wątpliwości przed zakupem. Brzydko pachniało mi familijnymi hitami na miarę &lt;q&gt;śpiewaj z Dodą&lt;/q&gt;, ale ostatecznie przekonał mnie kumpel, który któregoś dnia odwiedził nas z własnym egzemplarzem. Za rekomendację niech wystarczy fakt, że tydzień później dokonałem zakupu. Jeśli regularnie odwiedzają cię znajomi, którzy nawet po pijaku nie kwalifikują się na karaoke, powinieneś właśnie stać w kolejce do kasy.&lt;/dd&gt;
&lt;dt&gt;Call of Duty 4&lt;/dt&gt;
&lt;dd&gt;Najlepsza rozgrywka sieciowa tej generacji konsol. Nawet najbardziej oporni, którzy twierdzili, że &lt;q&gt;takie gry to tylko na myszkę&lt;/q&gt;, chwytali pada w dłoń i nie chcieli się z nim rozstać. Niestety, ostatnio zastąpił ją hicior, w którym jako dziadek Tuska walczymy z hordami nieumarłych.&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;Oczywiście, dobrych gier jest więcej, chciałem jednak ostrzec wszystkich przed grami typu Grand Theft Auto 4, Mercenaries 2 i Far Cry 2. O ile przy San Andreas bawiłem się świetnie, to czwarta część serii jest zdecydowanie najgorsza. Dokładne przeciwieństwo Mirror's Edge &amp;mdash; ciemno, brzydko i nudno. Każda z tych trzech gier eksploatuje motyw piaskownicy w zupełnie nieudany sposób. Efekt jest taki, że do każdej piętnastominutowej misji jedziemy pół godziny, a wszystko jest tak powtarzalne i chaotycznie ze sobą powiązane, że kiedy wkładamy tę samą płytę drugiego dnia, trudno przypomnieć sobie choćby strzępy fabuły i jakikolwiek cel gry.&lt;/p&gt;

&lt;p&gt;Cóż, wydaje się, że ten ostatni w obecnej generacji zastąpiły osiągnięcia i trofea.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Usuwanie konta z portalu Nasza Klasa</title>
   <link href="http://room-303.com/blog/2008/12/21/usuwanie-konta-z-portalu-nasza-klasa/"/>
   <updated>2008-12-21T19:41:40+00:00</updated>
   <id>http://room-303.com/blog/2008/12/21/usuwanie-konta-z-portalu-nasza-klasa</id>
   <content type="html">&lt;p&gt;Procedura jest prosta:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Logujemy się na swoje konto&lt;/li&gt;
	&lt;li&gt;Wchodzimy w edycję profilu&lt;/li&gt;
	&lt;li&gt;Czyścimy wszystkie pola, a w wymagane wpisujemy &lt;q&gt;Smok Wawelski&lt;/q&gt;&lt;/li&gt;
	&lt;li&gt;Usuwamy wszystkie zdjęcia z galerii&lt;/li&gt;
	&lt;li&gt;Wypisujemy się ze wszystkich klas&lt;/li&gt;
	&lt;li&gt;Kasujemy, co nam się jeszcze uda, z korespondencją włącznie&lt;/li&gt;
	&lt;li&gt;Za pomocą forum lub prywatnej wiadomości piszemy adminowi, gdzie nam może naskoczyć, a gdzie nagwizdać&lt;/li&gt;
	&lt;li&gt;Zgłaszamy własne konto jako fikcyjne, a ostatnią wiadomość jako naruszenie regulaminu&lt;/li&gt;
	&lt;li&gt;Czekamy i śpimy spokojnie&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jak się okazuje, jest to jedyna pewna metoda całkowitego zniknięcia z bazy danych, w przeciwieństwie do funkcji &lt;q&gt;usuń konto&lt;/q&gt;. Ta ostatnia nie dość, że &lt;a href=&quot;http://prawo.vagla.pl/node/8276&quot;&gt;jedynie ukrywa profil&lt;/a&gt;, to uniemożliwia jakiekolwiek administrowanie w ten sposób przechowywanymi danymi (prawdopodobnie wbrew naszej woli, bo gdy &amp;mdash; dawno temu &amp;mdash; usuwałem swój profil, nigdzie nie było śladu podobnej funkcjonalności i nie było przesłanek, świadczących o dalszym przechowywaniu i przetwarzaniu moich danych osobowych).&lt;/p&gt;

&lt;p&gt;Niektórzy to mają poczucie humoru, prawda? Formalne wnioski o usunięcie danych można słać na adres &lt;a href=&quot;mailto:kontakt@nasza-klasa.pl&quot;&gt;kontakt@nasza-klasa.pl&lt;/a&gt;, czego Pan Gąbka wam nie powie, bo odsyła do formularza kontaktowego, który po wybraniu kategorii &lt;q&gt;profil&lt;/q&gt; odsyła do opcji &lt;q&gt;usuń konto&lt;/q&gt;, której już usunięte konta nie posiadają.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Django: cache i aplikacja Admin</title>
   <link href="http://room-303.com/blog/2008/11/27/django-cache-i-aplikacja-admin/"/>
   <updated>2008-11-27T11:32:50+00:00</updated>
   <id>http://room-303.com/blog/2008/11/27/django-cache-i-aplikacja-admin</id>
   <content type="html">&lt;p&gt;Wczoraj na Blipie pojawiła się dyskusja na temat obsługi cache w Django i domyślnego przechowywania w nim wszystkich widoków, z panelem administracyjnym włącznie. Koncepcji pojawiło się kilka, z łataniem kodu Django włącznie. Na szczęście rozwiązanie jest bardzo proste.&lt;/p&gt;

&lt;p&gt;Aby zblokować pamięć podręczną dla panelu administracyjnego (oglądanie nieaktualnych danych przez administratora to raczej średni pomysł), wystarczy udekorować go funkcją &lt;code&gt;never_cache&lt;/code&gt; tak, jak robi się to z każdym innym widokiem:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;from django.conf.urls.defaults import *
from django.contrib import admin
from django.views.decorators.cache import never_cache

admin.autodiscover()

urlpatterns = patterns('',
    ('^admin/(.*)', never_cache(admin.site.root)),
)&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;emes przygotował nawet stosowną &lt;a href=&quot;http://code.djangoproject.com/ticket/9709&quot;&gt;łatkę na dokumentację&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Wszystko git</title>
   <link href="http://room-303.com/blog/2008/11/17/wszystko-git/"/>
   <updated>2008-11-17T16:28:59+00:00</updated>
   <id>http://room-303.com/blog/2008/11/17/wszystko-git</id>
   <content type="html">&lt;p&gt;Ha, jeszcze żyję! Nie miałem ostatnio zbyt dużo czasu na prowadzenie bloga. Powodów było wiele &amp;mdash; Little Big Planet, pomoc przy serwisie &lt;a href=&quot;http://www.e-lady.pl/&quot;&gt;e-Lady&lt;/a&gt;, Little Big Planet, duży projekt dla &lt;a href=&quot;http://zurich.com/main/home/welcome.htm&quot;&gt;Zurichu&lt;/a&gt; i impreza z okazji mojego upgrade'u do wersji 0.26. Chyba dobrze, bo parzyste wydania są stabilne.&lt;/p&gt;

&lt;p&gt;Skoro jestem już staruchem, to pozwólcie, że udzielę wam rady, przez którą przemawiają dziesięciolecia doświadczenia. &lt;strong&gt;Nauczcie się używać Gita, warto.&lt;/strong&gt; Zwłaszcza, jeśli w tym momencie pomyśleliście sobie &lt;q&gt;a po co &amp;mdash; znam ci ja wszak Subversion?&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Ciężko byłoby mi wymienić, ile razy git uratował moje szanowne cztery litery w ciągu tylko tego roku. Najprostszy przykład mam jednak na wyciągnięcie ręki. Wyobraźcie sobie, że dostajecie serwis w spadku po tragicznie znikniętym deweloperze (tragicznie wykonal pracę i zniknął). Kilka giga śmiecia &amp;mdash; pliki pe-ha-pe wymieszane z szablonami, grafiką, plikami do pobrania.&lt;/p&gt;

&lt;p&gt;Cały ten bajzel bez ładu i składu poupychany w dziesiątki katalogów o dźwięcznych nazwach: &lt;q&gt;includes&lt;/q&gt;, &lt;q&gt;modules&lt;/q&gt;, &lt;q&gt;files&lt;/q&gt;, &lt;q&gt;pliki&lt;/q&gt;, &lt;q&gt;integracja.&lt;/q&gt; Kopiować przez &lt;abbr title=&quot;Secure Shell&quot;&gt;SSH&lt;/abbr&gt; nie ma sensu, bo życia by nie starczyło, wrzucić całość do kontroli wersji? Narzędzie importu SVN ubiłem po godzinie, gdy nadal czekałem na prośbę o komentarz do zmian.&lt;/p&gt;

&lt;p&gt;Skończyło się na lokalnej kompilacji Gita, zainicjowaniu repozytorium w katalogu z projektem i dodaniu tylko sensownych plików (html, php, css). Całość trwała w sumie z pięć minut i świat znów stał się kolorowy (dłuższa styczność z &lt;abbr title=&quot;PHP Hypertext Preprocessor&quot;&gt;PHP&lt;/abbr&gt; oprócz kolorowych wizji może być również powodem halucynacji, przed użyciem skontaktuj się z lekarzem lub farmaceutą).&lt;/p&gt;

&lt;p&gt;Jeśli więc i ty trafisz kiedyś na projekt, który jest wzorcową implementacją specyfikacji z The Daily WTF i nigdy nie widział systemu kontroli wersji, przypomnij sobie o Gicie i uczyń świat lepszym miejscem dla naszych dzieci.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Sprzęt: HTC Touch Diamond</title>
   <link href="http://room-303.com/blog/2008/10/21/sprzet-htc-touch-diamond/"/>
   <updated>2008-10-21T22:28:24+00:00</updated>
   <id>http://room-303.com/blog/2008/10/21/sprzet-htc-touch-diamond</id>
   <content type="html">&lt;p&gt;Czas już chyba najwyższy przebudzić tego bloga z letargu. Kilka osób prosiło mnie o opisanie pierwszych wrażeń z urządzeniem, poniżej możecie więc znaleźć krótką recenzję Diamonda.&lt;/p&gt;

&lt;p&gt;Na początku wypada mi podziękować pracodawcy, firmie &lt;a href=&quot;http://itsltd.eu/&quot;&gt;ITS Ltd.&lt;/a&gt;, za obdarowanie mnie zarówno &lt;a href=&quot;http://pdadb.net/index.php?m=specs&amp;amp;id=1311&quot;&gt;Diamondem&lt;/a&gt;, jak i poprzednim &lt;abbr title=&quot;Personal Digital Assistant&quot;&gt;PDA&lt;/abbr&gt; &amp;mdash; &lt;a href=&quot;http://pdadb.net/index.php?m=specs&amp;amp;id=856&quot;&gt;Vodafone v1615&lt;/a&gt; (HTC Kaiser). Oba urządzenia przeszły testy jako mój podstawowy telefon. Wstępy mamy za sobą, zatem do dzieła.&lt;/p&gt;

&lt;h4&gt;Główny urząd miar i wag&lt;/h4&gt;

&lt;p&gt;Złośliwi powiedzą, że HTC Kaiser został zaprojektowany jako urządzenie do tłuczenia szyb i wbijania gwoździ. Wymiarami odpowiada iPhone'owi, ale jest od niego półtora raza grubszy. Solidność konstrukcji z pewnością niejeden gwóźdź przetrzyma, jednak Kaiser rozmiar swój zawdzięcza głównie wbudowanej, wysuwanej klawiaturze.&lt;/p&gt;

&lt;p&gt;Diamond jest od niego dużo mniejszy &amp;mdash; wysokość i szerokość straciły po centymetrze, a grubość jest minimalnie mniejsza od urządzenia z jabłuszkiem. Cała obudowa wygląda dużo nowocześniej i przypomina bardziej iPoda Nano niż materiał budowlany. Główną ofiarą gwałtownej redukcji wymiarów jest sprzętowa klawiatura, której usunięcie pozwoliło również masie urządzenia zmieścić się w klasie kieszonkowych telefonów. Z niespełna 200 gram zrobiło się nieco ponad 100, co powinno zapobiec nadmiernemu umięśnieniu tylko jednej z partii mojego ciała.&lt;/p&gt;

&lt;h4&gt;Wyświetlacz i interfejs&lt;/h4&gt;

&lt;p&gt;Na &lt;abbr&gt;PDA&lt;/abbr&gt; ekrany dotykowe są standardem od dłuższego czasu. Kaiser ze swoim wyświetlaczem 240x320 nie wyglądał najgorzej (jeśli pominąć sam system Windows, którego elementy tu i ówdzie boleśnie prześwitują przez choćby najlepiej zaprojektowaną nakładkę graficzną). Wysunięcie klawiatury powodowało zmianę orientacji wyświetlacza, który już w trybie landscape można było odchylić i wyobrazić sobie, że mamy bardzo małego laptopa. iPhone ze swoim 320x480 był naturalną ewolucją.&lt;/p&gt;

&lt;p&gt;Diamonda z wyświetlaczem 480x640 trzeba zobaczyć na żywo. Nie przypuszczałem, że dożyję gładkich czcionek na urządzeniu przenośnym. Ekran jest mniejszy od oferowanego przez Apple (2,8&quot; kontra 3,5&quot;), ale wygląda prześlicznie. Wysoka rozdzielczość w połączeniu z niewielką przekątną zapewnia jakość odwzorowania grafiki, z jaką monitory biurkowe nie mogą się równać (dlatego patrząc na zdjęcia w sieci nie docenisz tego cudeńka).&lt;/p&gt;

&lt;h4&gt;Składnica jedzenia: klawiatura&lt;/h4&gt;

&lt;p&gt;Wspomniałem, że Kaiser dysponuje sprzętową klawiaturą. Czy jest wygodna? Bardzo. Przynajmniej tak długo, jak długo nie przyjdzie nam wprowadzać polskich znaków. Czy tęsknię? Nie &amp;mdash; książki na &lt;abbr&gt;PDA&lt;/abbr&gt; pisał nie będę, jeśli zaś chodzi o korzystanie z internetu i telefonu, klawiatura ekranowa Windows Mobile radzi sobie aż nadto dobrze.&lt;/p&gt;

&lt;p&gt;Dla ceniących komfort pisania (w tym intuicyjną obsługę znaków diakrytycznych) obowiązkowym dodatkiem do każdego sprzętu z Windows Mobile na pokładzie powinien być &lt;a href=&quot;http://www.resco.net/pocketpc/keyboard/default.asp&quot;&gt;Resco Keyboard Pro&lt;/a&gt;. Jest wart swojej ceny. Naprawdę.&lt;/p&gt;

&lt;h4&gt;System operacyjny i środowisko&lt;/h4&gt;

&lt;p&gt;Oba urządzenia HTC pracują pod kontrolą Windows Mobile Professional (6.0 w przypadku Kaisera i 6.1 w przypadku Diamonda). Oczywiście, nie ma wątpliwości, że na ten system właśnie dostępnych jest najwięcej aplikacji, ale marna to pociecha w obliczu graficznej katastrofy w postaci domyślnego interfejsu użytkownika. Tutaj iPhone wygrywa bez kiwnięcia palcem.&lt;/p&gt;

&lt;p&gt;HTC dołożyło wszelkich starań, aby ukryć paskudne bebechy brzydactwa z Redmond, ale są miejsca, gdzie nie da się ich uniknąć. O ile główny interfejs Diamonda jest śliczny i w całości obsługiwany za pomocą gestów, o tyle wyłączenie zestawu stereo Bluetooth wymaga przebrnięcia przez dwa ekrany konfiguracji. Serio. Nie, nie wystarczy wyłączyć słuchawek, wtedy dźwięku nie ma wcale. FAIL.&lt;/p&gt;

&lt;p&gt;W przypadku zwykłego telefonu nie wspomniałbym o tym wcale, ale w dobie iPhone'a warto dodać, że oba urządzenia (przynajmniej na terenie Anglii) rozprowadzane są bez sim-locka (ani innych cudów aktywacyjnych).&lt;/p&gt;

&lt;p&gt;Diamond na baterii żyje jakieś dwie doby, wliczając w to sporadyczne rozmowy, zestaw stereo na Bluetooth i słuchanie muzyki. Nie jest to szczególnie imponujące osiągnięcie, jeśli porównać go z klasycznymi telefonami.&lt;/p&gt;

&lt;h4&gt;Oprogramowanie&lt;/h4&gt;

&lt;p&gt;Nie będę pisał o tym, że Windows Mobile przychodzi z pakietem biurowym, ale warto wspomnieć, że Diamond na pokładzie ma natywnego klienta YouTube i aplikację Google Maps. Ta ostatnia potrafi oczywiście korzystać z wbudowanego odbiornika &lt;abbr title=&quot;Global Positioning System&quot;&gt;GPS&lt;/abbr&gt; obu urządzeń.&lt;/p&gt;

&lt;p&gt;Nie sposób pominąć też przeglądarki. Posiadacze &lt;abbr&gt;PDA&lt;/abbr&gt; działających pod kontrolą Windows z pewnością pałają już serdeczną nienawiścią do dostarczanej z systemem parodii przeglądarki internetowej. Dlatego cieszy fakt, że z Diamondem nie tylko dostarczana jest pełna wersja przeglądarki Opera Mobile, ale jest ona w pełni dostosowana do samego urządzenia. Znaczy to tyle, że korzysta z akcelerometru (którego Kaiser nie posiadał) i jog-wheela (który uwielbiam w swoim iPodzie Nano, a który Apple gdzieś zgubiło przy projektowaniu nowych urządzeń).&lt;/p&gt;

&lt;p&gt;To zdanie zasługuje na osobny akapit: Opera Mobile (9.5) na Windowsie jest szybsza od Safari na iPhonie. Czapki z głów przed autorami przeglądarki. Płynny zoom za pomocą kółka to też mistrzostwo.&lt;/p&gt;

&lt;p&gt;Reszty nie będę opisywać, ich listę można znaleźć online. Zaznaczę tylko, że Teeter (wbudowana gra polegająca na prowadzeniu kulki za pomocą akcelerometru) wciąga niezwykle. Uprzedzając pytania: tak, zainstalowałem Lightsaber, jestem prawdziwym Jedi i tak dalej.&lt;/p&gt;

&lt;h4&gt;Czy warto?&lt;/h4&gt;

&lt;p&gt;Jeśli masz zapłacić za niego oficjalną polską cenę (1499 PLN) &amp;mdash; lepiej kup sobie PlayStation 3 albo Xboksa 360.&lt;/p&gt;

&lt;p&gt;Jeśli szukasz telefonu z długim czasem czuwania &amp;mdash; kup Nokię 3310, bo Diamond wymaga ładowania przynajmniej raz na dwa dni.&lt;/p&gt;

&lt;p&gt;Jeśli potrzebujesz głównie odtwarzacza muzyki &amp;mdash; polecam iPoda Nano i nie zmieniaj telefonu.&lt;/p&gt;

&lt;p&gt;Jeśli chcesz przetestować Androida &amp;mdash; poczekaj na HTC Dream.&lt;/p&gt;

&lt;p&gt;Jeśli szukasz recenzji iPhone'a &amp;mdash; przykro mi, to nie ten adres.&lt;/p&gt;

&lt;p&gt;Jeśli szukasz dobrego &lt;abbr&gt;PDA&lt;/abbr&gt; &amp;mdash; polecam Diamonda.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Stabilna wersja PLD Live</title>
   <link href="http://room-303.com/blog/2008/09/18/stabilna-wersja-pld-live/"/>
   <updated>2008-09-18T10:31:11+00:00</updated>
   <id>http://room-303.com/blog/2008/09/18/stabilna-wersja-pld-live</id>
   <content type="html">&lt;p&gt;Trochę musieliśmy poczekać, ale chyba było warto. Wczoraj &lt;a href=&quot;http://pozar-w-burdelu.blogspot.com/&quot;&gt;qwiat&lt;/a&gt; zdecydował się wydać stabilną wersję PLD Live w wersji &lt;em&gt;th.2008.09&lt;/em&gt;. A trzeba powiedzieć, że nie było to łatwe zadanie — trudna ścieżka stabilizacji okupiona była wieloma mękami i torturami w postaci rozlicznych butelek tequili, kilku flaszek szkockiej i walających się po kątach butelek po piwie.&lt;/p&gt;

&lt;p&gt;O oprogramowaniu rozpisywać się nie będę, zainteresowanych szczegółami zapraszam na &lt;a href=&quot;http://ep09.pld-linux.org/~qwiat/&quot;&gt;stronę projektu&lt;/a&gt;. Mam nadzieję, że niedługo uda się przenieść projekt do stosownej subdomeny pld-linux.org (trwa jeszcze sezon urlopowy i część władnych tego świata jest zwyczajnie nieosiągalna).&lt;/p&gt;

&lt;p&gt;Kolejne kroki naszej drogi do władzy nad światem to dopracowanie instalatora i dostosowanie do potrzeb PLD usługi &lt;code&gt;firstboot&lt;/code&gt;. Ta ostatnia pozwala skonfigurować świeżo zainstalowany system, włącznie z założeniem konta pierwszego użytkownika.&lt;/p&gt;

&lt;p&gt;Jak zwykle, serdecznie zapraszamy do testowania. Wszelkie błędy i problemy powinny trafiać &lt;a href=&quot;https://bugs.launchpad.net/pld-linux&quot;&gt;na Launchpad&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; hawk zlitował się nad nami i strona ma już &lt;a href=&quot;http://livecd.pld-linux.org/&quot;&gt;bardziej oficjalny adres&lt;/a&gt;. Wielkie dzięki!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>PLD: Live z Anacondą</title>
   <link href="http://room-303.com/blog/2008/09/07/pld-live-z-anaconda/"/>
   <updated>2008-09-07T17:21:06+00:00</updated>
   <id>http://room-303.com/blog/2008/09/07/pld-live-z-anaconda</id>
   <content type="html">&lt;p&gt;Mija kolejny tydzień i kolejne dobre wiadomości. Zacznę może od najważniejszej, qwiat właśnie udostępnił &lt;a href=&quot;http://pozar-w-burdelu.blogspot.com/2008/09/pld-live-z-anacond.html&quot;&gt;PLD Live z Anacondą&lt;/a&gt;! Ponieważ do tego zdania już nikt nie dotrze, wlazł kotek na płotek i mruga.&lt;/p&gt;

&lt;p&gt;Dla upartych podam &amp;mdash; tradycyjnie &amp;mdash; listę wiążących się z tym zjawiskiem ticketów:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redhat &lt;a href=&quot;https://bugzilla.redhat.com/show_bug.cgi?id=461118&quot;&gt;bug #461118&lt;/a&gt; - nie da się prawidłowo przeprowadzić instalacji na czystym fabrycznie dysku (brak tablicy partycji)&lt;/li&gt;
&lt;li&gt;Redhat &lt;a href=&quot;https://bugzilla.redhat.com/show_bug.cgi?id=461357&quot;&gt;bug #461357&lt;/a&gt; - wyczyszczenie kodu Anacondy jako pierwszy krok dla integracji obsługi PLD w upstreamie&lt;/li&gt;
&lt;li&gt;GNOME &lt;a href=&quot;http://bugzilla.gnome.org/show_bug.cgi?id=550714&quot;&gt;bug #550714&lt;/a&gt; - wsparcie dla PLD w upstreamowym NetworkManagerze&lt;/li&gt;
&lt;li&gt;Launchpad &lt;a href=&quot;https://bugs.launchpad.net/pld-linux/+bug/267518&quot;&gt;bug #267518&lt;/a&gt; - &lt;code&gt;comps.xml&lt;/code&gt; wymaga wielu poprawek&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tradycyjnie, kobiety, złoto i alkohol przyjmowane będą &lt;del&gt;w soboty w zakrystii&lt;/del&gt; codziennie u nas w mieszkaniu. Prosimy o wcześniejsze uzgadnianie terminów wizyt.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>PLD: Piekło zamarzło</title>
   <link href="http://room-303.com/blog/2008/08/31/pld-pieklo-zamarzlo/"/>
   <updated>2008-08-31T13:19:45+00:00</updated>
   <id>http://room-303.com/blog/2008/08/31/pld-pieklo-zamarzlo</id>
   <content type="html">&lt;p&gt;To były dobre dwa tygodnie. W zeszły weekend doprowadziłem skrypty &lt;a href=&quot;http://pld-linux.org/Packages/LinuxLive&quot;&gt;linux-live&lt;/a&gt; do stanu, który pozwolił qwiatowi zbudować &lt;a href=&quot;http://pozar-w-burdelu.blogspot.com/2008/08/pld-live-20-beta-do-pobrania.html&quot;&gt;działające PLD Live 2.0&lt;/a&gt;. Tak, po czterech latach przerwy, PLD ma działającą wersję Live CD. Szczegóły można przeczytać na blogu qwiata.&lt;/p&gt;

&lt;p&gt;W czwartek znaleźliśmy sobie nową zabawkę. Część z was pewnie już wie, reszcie raczej trudno będzie zgadnąć. Niech przemówią screenshoty.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/2814211674/&quot; title=&quot;PLD Linux installer - splash by patrys, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3178/2814211674_d3be51d311.jpg&quot; width=&quot;500&quot; height=&quot;375&quot; alt=&quot;PLD Linux installer - splash&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tak, to jest autentyczny zrzut ekranu z działającego obrazu PLD Live 2.0. Nie spreparowaliśmy go w GIMPie.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/2814211682/&quot; title=&quot;PLD Linux installer - packages by patrys, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3078/2814211682_0cf08cff88.jpg&quot; width=&quot;500&quot; height=&quot;375&quot; alt=&quot;PLD Linux installer - packages&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Piekło zamarzło, PLD ma działający instalator. Po latach zabawy z wyrobami instalatoropodobnymi (bez urazy, każdy próbował jak umiał).&lt;/p&gt;

&lt;p&gt;Nasze aktualne drzewko Anacondy można znaleźć &lt;a href=&quot;http://team.pld-linux.org/~patrys/anaconda.git/&quot;&gt;w moim repozytorium gita&lt;/a&gt;. Działający kod znajduje się na gałęzi &lt;code&gt;pld-branch&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Co zostało do zrobienia? Przede wszystkim wypadałoby poprawić znalezione przy tej okazji błędy: &lt;a href=&quot;https://bugs.launchpad.net/pld-linux/+bug/262985&quot;&gt;#262985&lt;/a&gt;, &lt;a href=&quot;https://bugs.launchpad.net/pld-linux/+bug/263149&quot;&gt;#263149&lt;/a&gt;. Być może dostosowanie usługi konfiguracji &lt;code&gt;firstboot&lt;/code&gt; do potrzeb PLD? Pozostaje też dopracowanie grup pakietów (&lt;code&gt;comps.xml&lt;/code&gt;) i wznowienie generacji repozytoriów w formacie repomd (&lt;code&gt;createrepo&lt;/code&gt;). A może ktoś zabierze się za napisanie backendu opartego o &lt;code&gt;python-poldek&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;Złoto, kobiety i piwo przyjmujemy w każdych ilościach (qwiat prosił, żeby zaznaczyć, że kobiety tylko w całości), chętnych darczyńców uprasza się o wcześniejszy kontakt ;)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Prawnicy są zgodni: Global GPRS wywołuje myśli samobójcze*</title>
   <link href="http://room-303.com/blog/2008/08/26/prawnicy-sa-zgodni-global-gprs-wywoluje-mysli-samobojcze/"/>
   <updated>2008-08-26T21:18:16+00:00</updated>
   <id>http://room-303.com/blog/2008/08/26/prawnicy-sa-zgodni-global-gprs-wywoluje-mysli-samobojcze</id>
   <content type="html">&lt;p&gt;Miałem nadzieję, że moje przygody z pozwami skończyły się wraz z &lt;a href=&quot;http://room-303.com/blog/2008/04/20/global-umts-pozywa/&quot;&gt;poprzednią notką w wątku&lt;/a&gt;. Wiemy jednak, że życie lubi zaskakiwać, czyż nie&lt;sup&gt;1&lt;/sup&gt;? Po powrocie z urlopu z otwartymi ramionami przywitał mnie kolejny email z wymiarem sprawiedliwości w tle. Od kogo? Wydaje mi się, że ogłoszenie konkursu w tej sprawie byłoby niecelowe.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;sup&gt;1&lt;/sup&gt; miłośnicy Pratchetta mogliby w tym miejscu słusznie zauważyć, że &lt;q&gt;obiekty w lusterku wstecznym mogą znajdować się bliżej, niż się wydaje&lt;/q&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Tym razem pan Dariusz pisze (email z dnia 16. sierpnia, pisownia oryginalna, pozwolę sobie na wtrącenia):&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Witam&lt;/p&gt;

&lt;p&gt;Właśnie wróciłem z długiego dwu miesięcznego urlopu i widzę, że nadal oba artykuły o moich programach nie są usunięte i powielają się na coraz większej ilości stron internetowych. Wygląda na to, że nie zwracasz uwagi na popełniane przestępstwa. Powiem ci jak zareagował adwokat, gdy zobaczył twój drugi artykuł zawierający moją prywatną korespondencję:  uśmiechnął się i powiedział &quot;to chyba jakiś samobójca&quot;.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Nie jest mi znany wyrok sądu, który uznawałby moje postępowanie za noszące znamiona przestępstwa. Z pewnością nie jest nim udzielanie porad w kwestii poprawienia słabo napisanego programu (który autor sam określił jako wersję &lt;q&gt;beta&lt;/q&gt;).&lt;/p&gt;

&lt;p&gt;&lt;small&gt;* badania przeprowadzone na grupie kontrolnej zawierającej prawników sztuk jeden; tytuł programu użyty wyłącznie w celach informacyjnych&lt;/small&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;W pierwszym artykule naruszyłeś moje dobra osobiste m.in. pomawiając mnie o to, że jestem podejrzanym typem, który może fałszować swoje dane osobowe w licencji programu i tworzy podejrzane programy, które należy unikać. Mimo, że zostałeś poinformowany o naruszeniu prawa, to w pełni świadomie popełniłeś kolejne przestępstwo - publikując moją prywatną korespondencję ponownie naruszyłeś moje dobra osobiste (prawo do prywatności). Jest tylko jedna kategoria listów, które mogą być rozpowszechniane publicznie - tzw. listy otwarte. Wszystkie inne podlegają ochronie prawa. Mój list adresowany był tylko do jednej, konkretnej osoby.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Czy jest przestępstwem wyrażenie wątpliwości co do godności (czyt: imienia i nazwiska) autora? Wszak ten ostatni zarówno w archiwum z programem, jak i na jego stronie internetowej figurował jako niewiele mówiący &lt;code&gt;dariuszdev gmail com&lt;/code&gt; (stanu bieżącego nie zbadano ze względu na nikłe zainteresowanie niżej podpisanego tytułowym wynalazkiem). Nie sądziłem, żeby faktycznie nosił dźwięczne i jakże rdzennie polskie nazwisko &lt;q&gt;Dev&lt;/q&gt;&lt;sup&gt;2&lt;/sup&gt;, toteż i imię nie wydało mi się pewne.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;sup&gt;2&lt;/sup&gt; w czym upewniłem się po lekturze treści już piątego listu od pana Dariusza, kiedy to był łaskaw zdradzić mi swoje nazwisko, które skrzętnie zamaskował także na zdjęciu złożonego na policji doniesienia o popełnieniu przestępstwa&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Przy okazji zauważmy, że mowa jest o licencji programu. Niestety, nie udało mi się z nią nigdy zapoznać, gdyż plik tekstowy z opisem programu stanowi, że licencja znajduje się wewnątrz programu, w którymś z menu. Mamy więc jajko-niespodziankę, na którym małym druczkiem umieszczono zapis o takiej mniej-więcej treści: &lt;q&gt;naruszenie zewnętrznej powłoki czekolady jest jednoznaczne z akceptacją warunków umowy, która znajduje się w środku.&lt;/q&gt; Nic więc dziwnego, że nigdy nie uruchomiłem programu, skoro wymagałoby to czynu niemożliwego &amp;mdash; wcześniejszego, zapewne telepatycznego, zapoznania się z warunkami i akceptacji owej licencji, prawda? Tutaj pozwolę sobie wyrazić nadzieję (sprawdzić nie mogę), że przynajmniej tam znajdują się dane osobowe pana Dariusza, gdyż dziwnym jest&lt;sup&gt;3&lt;/sup&gt; zjawiskiem licencja, w której nie występuje strona udzielająca.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;sup&gt;3&lt;/sup&gt; wbrew poglądom, jakie głosi Wilq, znamienity polski poeta&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Panu Dariuszowi zaś spieszę z wyjaśnieniem, że do publikacji nie wykorzystałem jego prywatnej korespondencji. Dużo wygodniej było mi użyć tej kopii, którą sam był łaskaw dostarczyć do mojej skrzynki elektronicznej&lt;sup&gt;4&lt;/sup&gt;. Być może dopuściłem się tym samym naruszenia tajemnicy własnej korespondencji, czym mogłem spowodować u siebie niepowetowane straty, jednak wydaje mi się, iż niezwykle ciężko byłoby udowodnić sobie samemu przed sądem, że uczyniłem to bez własnej zgody.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;sup&gt;4&lt;/sup&gt; firma Google z pewnością będzie w stanie potwierdzić sygnaturę wiadomości odebranej przez własny serwer: af3c9b1e0804200828t2c8e51e3r848c2999b8edeb31@mail.gmail.com&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Trzeba bowiem wiedzieć, że w świetle przepisów, prawo pełnego dysponowania korespondencją należy do odbiorcy, a odbiorcą w tym przypadku jestem ja. Gdyby taki hipotetyczny pan Roman przyszedł i upublicznił kompromitującą wiadomość skierowaną do mnie przez pana Dariusza, oj &amp;mdash; wtedy byśmy się pogniewali. Poczta adresowana do mnie jest bowiem chroniona przez ustawę o ochronie praw autorskich i pokrewnych jeszcze w dwadzieścia lat po moim zgonie, którego &amp;mdash; mimo sugestii ze strony szacownego grona adwokackiego &amp;mdash; w najbliższym czasie nie planuję.&lt;/p&gt;

&lt;p&gt;Zapewniam również, że w posiadanie własnej poczty wchodzę drogą legalną i bez użycia specjalnych urządzeń podsłuchowych, a publikując informację o czekającym mnie pozwie nie naruszyłem tajemnicy chronionej żadną umową pomiędzy mną i panem Dariuszem.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Na twoją niekorzyść działa to, że opublikowałeś moją prywatną korespondencję po to, aby po raz kolejny naruszyć moje dobra osobiste, mimo że byłeś już poinformowany o złamaniu prawa w pierwszym artykule. Kilka artykułów agresywnie atakujących moją osobę wyraźnie wskazuje na działanie z premedytacją, celowe a nie przypadkowe popełnianie przestępstw, co zawsze skutkuje wyższą karą wymierzaną przez Sąd.&lt;/p&gt;

&lt;p&gt;W związku z publikacją mojej prywatnej korespondencji na wielu stronach internetowych do aktu oskarżenia dodane zostaną kolejne zarzuty dotyczące naruszenia moich dóbr osobistych - prawa do prywatności.&lt;/p&gt;

&lt;p&gt;Oczekuję niezwłocznego usunięcia obu artykułów z wszystkich stron w internecie na których są umieszczone.&lt;/p&gt;

&lt;p&gt;Na sprawie karnej oprócz kary z art.212 KK p.2 i usunięcia artykułów, będę domagał się też zadośćuczynienia finansowego za naruszanie moich dóbr osobistych w tym prawa do prywatności.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Dalej mamy tradycyjne straszenie sądem. Oczywiście nie mówimy tu o groźbie bezprawnej, bo ta ostatnia jest przestępstwem i podlega karze pozbawienia wolności do lat trzech&lt;sup&gt;5&lt;/sup&gt; i&amp;hellip; pojawiła się nieco wcześniej.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;sup&gt;5&lt;/sup&gt; por. art. 115 § 12 oraz art. 191. § 1 kodeksu karnego; czytelników z upośledzoną zdolnością czytania ze zrozumieniem informuję, że &lt;q&gt;do lat trzech&lt;/q&gt; nie dotyczy wieku osoby dopuszczającej się czynu&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Oto czytam bowiem w emailu od pana Dariusza z 20. kwietnia (pisownia oryginalna):&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Jak sprawa nie zakończy się od razu i narosną duże straty, to będę
musiał wysłać pozew cywilny trafi do Sądu.&lt;/p&gt;

&lt;p&gt;Więc nie trać czasu teraz jeszcze jestem w stanie zakceptować niezbyt
wielkie straty i na wszystko przymknać oko i wycofać zawiadomienie o
popełnieniu przestępstwa.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Mamy więc &lt;q&gt;groźbę spowodowania postępowania karnego lub rozgłoszenia wiadomości uwłaczającej czci zagrożonego lub jego osoby najbliższej&lt;/q&gt; zastosowaną &lt;q&gt;w celu zmuszenia innej osoby do określonego działania, zaniechania lub znoszenia.&lt;/q&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Linux i systemy plików</title>
   <link href="http://room-303.com/blog/2008/08/25/linux-i-systemy-plikow/"/>
   <updated>2008-08-25T14:45:43+00:00</updated>
   <id>http://room-303.com/blog/2008/08/25/linux-i-systemy-plikow</id>
   <content type="html">&lt;p&gt;Glen (Elan Ruusamäe z PLD) spytał mnie dziś o system plików, jaki polecałbym na serwer pocztowy. Chodziło o jego serwer, na którym zdechł był właśnie reiserfs. Zaproponowałem ext3 z journalingiem albo xfs ze zmniejszonym rozmiarem bloku (poczta = dużo małych plików).&lt;/p&gt;

&lt;p&gt;Przy okazji przypomniało mi się, o czym miałem tu napisać dawno temu. Początkowo dla własnej pamięci, ale jakoś uleciało mi to z głowy. Spóźnione o jakieś dwa lata, bo mniej więcej dwa lata temu przypadkiem odkryłem powód powolności jednego z serwerów.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Zawsze&lt;/em&gt; (zawsze!) po instalacji systemu należy upewnić się, że &lt;em&gt;wszystkie fizyczne systemy plików&lt;/em&gt; montowane są z parametrami &lt;strong&gt;&lt;code&gt;noatime,nodiratime&lt;/code&gt;&lt;/strong&gt; albo przynajmniej &lt;code&gt;relatime&lt;/code&gt;. Dla xfs dodatkowo pomoże &lt;code&gt;logbufs=8&lt;/code&gt;.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Ku pamięci i takie tam. Wydrukować i oprawić w ramki albo więcej nie dziwić się, kiedy maszyna z minimalnym ruchem http doświadcza load na poziomie 5.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; okazuje się, że w sierpniu zeszłego roku &lt;a href=&quot;http://kerneltrap.org/node/14148&quot;&gt;podobny wątek&lt;/a&gt; pojawił się na kerneltrapie. Upewniłem się też (wczoraj zastanawialiśmy się nad tym z qwiatem w drodze na piwo, więc z dala od kerneli), że &lt;code&gt;noatime&lt;/code&gt; dotyczy zarówno plików, jak katalogów, przez co podawanie dodatkowo &lt;code&gt;nodiratime&lt;/code&gt; jest zbędne. Czas się odzwyczaić.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Ołówek, czyli wygodne projektowanie interfejsów</title>
   <link href="http://room-303.com/blog/2008/08/24/olowek-czyli-wygodne-projektowanie-interfejsow/"/>
   <updated>2008-08-24T13:35:16+00:00</updated>
   <id>http://room-303.com/blog/2008/08/24/olowek-czyli-wygodne-projektowanie-interfejsow</id>
   <content type="html">&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.evolus.vn/Pencil/Home.html&quot;&gt;&lt;img src=&quot;http://www.evolus.vn/Pencil/Images/logo.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jeśli potrzebujesz wygodnego narzędzia do prototypowania interfejsu użytkownika, to być może &lt;a href=&quot;http://www.evolus.vn/Pencil/Home.html&quot;&gt;Pencil&lt;/a&gt; jest aplikacją właśnie dla ciebie.&lt;/p&gt;

&lt;p&gt;Narzędzie pozwala w wygodny sposób tworzyć makiety zarówno stron internetowych, jak i aplikacji okienkowych. Dla tych ostatnich oferuje dość szeroki wybór gotowych kontrolek, w tym zestaw wzorowany na interfejsie systemu Windows XP i neutralny wygląd, luźno bazujący na jednym z tematów GTK+.&lt;/p&gt;

&lt;p&gt;Do pracy wymagany jest silnik Gecko w wersji 1.9, samo narzędzie może więc pracować jako samodzielny program lub jako wtyczka do Firefoksa 3.&lt;/p&gt;

&lt;p&gt;&lt;del&gt;Uwaga: W systemie OS X nie działa klawisz &lt;kbd&gt;Del&lt;/kbd&gt; i do usuwania elementów ze sceny trzeba posłużyć się menu.&lt;/del&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Dr. Horrible</title>
   <link href="http://room-303.com/blog/2008/07/20/dr-horrible/"/>
   <updated>2008-07-20T11:14:07+00:00</updated>
   <id>http://room-303.com/blog/2008/07/20/dr-horrible</id>
   <content type="html">&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.drhorrible.com&quot;&gt;&lt;img src=&quot;http://www.drhorrible.com/images/banners/big_square.gif&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ostatnia szansa, żeby obejrzeć (genialną) całość u źródła. Jutro strona zniknie.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Konsolowo - wymiana dysku</title>
   <link href="http://room-303.com/blog/2008/06/27/konsolowo-wymiana-dysku/"/>
   <updated>2008-06-27T10:09:08+00:00</updated>
   <id>http://room-303.com/blog/2008/06/27/konsolowo-wymiana-dysku</id>
   <content type="html">&lt;p&gt;Niedawno stanąłem przed problemem posiadania zbyt wielu gier. O ile w czasach PlayStation 2 i wcześniejszych jedynym ograniczeniem była pojemność kart pamięci, tak w czasach, gdzie większość tytułów wymaga instalacji (PS3), udało mi się w końcu zbliżyć do magicznej bariery 40 gigabajtów.&lt;/p&gt;

&lt;p&gt;Rozwiązanie? Wymiana dysku. Pierwszy raz spotkałem się ze sprzętem, którego producent jawnie umożliwia wymianę dysku we własnym zakresie. Instrukcja obsługi konsoli zawiera przewodnik, jak krok po kroku wyjąć firmowy dysk i włożyć w to miejsce inny. Duży plus.&lt;/p&gt;

&lt;p&gt;Zakup dysku początkowo odkładałem do czasu powrotu z wyjazdu urlopowego, jednak mój ojciec (również posiadacz PS3) postanowił mnie sponsorować i wczoraj podrzucił mi do biura nowiutki dysk i obudowę na poprzedni. Po powrocie do domu przyszedł czas na zabawę. Włączenie konsoli, backup danych na dysk USB, wyłączenie konsoli, odłączenie zasilania i przystąpienie do podmiany.&lt;/p&gt;

&lt;p&gt;Małym minusem okazała się za to precyzja, z jaką poskładano konsolę. O ile odkręcenie niebieskiej śrubki, mocującej kieszeń dysku wewnątrz konsoli, nie było problemem, o tyle wyjęcie dysku z kieszeni wymagało użycia kombinerek. Śruby mocujące dysk trzymały tak mocno, że próba użycia odpowiedniego krzyżaka skończyła się szybko w obawie o wyszczerbienie łebka śruby.&lt;/p&gt;

&lt;p&gt;Dalej już tylko wyjęcie oryginalnego Hitachi 40 GB i podmiana na 2,5&quot; Samsunga 250 GB. Ponowne włączenie konsoli, format nowego nośnika, przywrócenie backupu z dysku USB i gotowe. Pozostało tylko wkręcić poprzedni dysk do kieszonki i sprzątnąć kłaczki kurzu, które wdzięcznie wypadły z wnętrza konsoli razem z firmowym dyskiem.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>DreamHost zaprasza</title>
   <link href="http://room-303.com/blog/2008/06/15/dreamhost-zaprasza/"/>
   <updated>2008-06-15T14:58:27+00:00</updated>
   <id>http://room-303.com/blog/2008/06/15/dreamhost-zaprasza</id>
   <content type="html">&lt;p&gt;Właśnie dostałem maila od obsługi DreamHosta. Dostałem (pewnie podobnie jak reszta) pięć zaproszeń. Szczegóły poniżej (celowo zostawiam ostatni punt, żeby nikt nie pomyślał, że staramy się kogoś naciągnąć):&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;... they will get all these super special advantages not available any
other way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They will get four (4) times the normal disk and bandwidth!&lt;/li&gt;
&lt;li&gt;If they choose our five-year plan, they'll get $150 off!&lt;/li&gt;
&lt;li&gt;If they choose our ten-year plan, they'll get $200 off!&lt;/li&gt;
&lt;li&gt;YOU will still earn a full $97 for each person who signs up!&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;

&lt;p&gt;Jeśli ktoś jest zainteresowany i chciałby wspomóc GeneratedContent, to namiary można zostawić w komentarzach albo wysłać na adres &lt;code&gt;patrys at pld-linux org&lt;/code&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Banshee 1.0</title>
   <link href="http://room-303.com/blog/2008/06/11/banshee-10/"/>
   <updated>2008-06-11T09:11:30+00:00</updated>
   <id>http://room-303.com/blog/2008/06/11/banshee-10</id>
   <content type="html">&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/2570301680/&quot; title=&quot;Banshee 1.0 by patrys, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3042/2570301680_69c3cbd74f.jpg&quot; width=&quot;500&quot; height=&quot;380&quot; alt=&quot;Banshee 1.0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Śliczny i wygodny. Autorzy Rhythmboksa mają teraz sporo do nadrobienia.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Spisek przeciwko Blipowi?</title>
   <link href="http://room-303.com/blog/2008/06/02/spisek-przeciwko-blipowi/"/>
   <updated>2008-06-02T11:20:18+00:00</updated>
   <id>http://room-303.com/blog/2008/06/02/spisek-przeciwko-blipowi</id>
   <content type="html">&lt;p&gt;Z całym szacunkiem dla &lt;a href=&quot;http://netto.blox.pl/html&quot;&gt;reuptake&lt;/a&gt;, nie bardzo widzę sens &lt;a href=&quot;http://netto.blox.pl/2008/06/jest-na-blipa-zlecenie.html&quot;&gt;jego ostatniej notki&lt;/a&gt;. &lt;a href=&quot;http://prawo.vagla.pl/node/7903&quot;&gt;Vagla pisze bardzo sensownie&lt;/a&gt; i nie jest to tekst &lt;q&gt;poświęcony w połowie twitterowi i 100 innym rzeczom.&lt;/q&gt; Vagla wskazuje na to, co dzieje się z pierwowzorem Blipa i co któregoś dnia może spotkać i wersję polską. Właściwie pokazał, że już pojawiły się pierwsze (bez względu na to, czy to żart) próby wykorzystania &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; serwisu do wydobywania prywatnych informacji.&lt;/p&gt;

&lt;p&gt;Jasne, można się spierać o to, że przecież serwis wyraźnie zaznacza, że cała treść jest publicznie dostępna. Problem w tym, że ludzie bez wiedzy informatycznej mają na ten temat swoje własne wyobrażenia. Kto z szarych blipowiczów jest świadom faktu, że raz wysłana i usunięta wiadomość mogła w międzyczasie zostać zindeksowana za pomocą &lt;abbr&gt;API&lt;/abbr&gt; przez niezależny serwis? Ile osób wie, że treści wysłane na Blipa mogą nagle pojawić się w wynikach wyszukiwania Google? Na przykład podczas rutynowego sprawdzania potencjalnych kandydatów do pracy?&lt;/p&gt;

&lt;p&gt;To co dziś jest prywatną opinią w zamkniętej dyskusji lub żartem wysłanym do kolegi, wyrwane z kontekstu może nieoczekiwanie zaatakować w trakcie rozmowy kwalifikacyjnej w postaci pytania &lt;q&gt;dlaczego uważa Pan, że nasz kluczowy partner jest &amp;mdash; cytuję &amp;mdash; do dupy?&lt;/q&gt; To są rzeczy, o których mało kto teraz myśli. Do złudnego poczucia prywatności przyczynia się też funkcja usuwania wysłanych wcześniej statusów. Jest bardzo użyteczna w przypadku poprawiania literówek, ale na niewiele zda się, gdy przypadkiem &lt;q&gt;chlapniemy&lt;/q&gt; więcej, niż chcielibyśmy powiedzieć stojąc z megafonem na dachu pobliskiego targowiska.&lt;/p&gt;

&lt;p&gt;Na Blipie prywatność nie istnieje, nie da się jej też nic stamtąd skutecznie usunąć i trzeba się z tym pogodzić. Jeśli masz wstydliwy sekret, to użyj telefonu albo komunikatora z silnym szyfrowaniem. Proste &amp;mdash; w teorii. Problem oczywiście leży gdzie indziej. Ludzie zawsze będą strzelać sobie w stopę, niezależnie, czy damy im do ręki komputer, czy flamaster, o czym dobitnie świadczą własne numery telefonów komórkowych, pozostawiane na przystankowych wiatach przez siedemnastoletnie &lt;q&gt;krejzolki&lt;/q&gt; i hasła do przeróżnych systemów informatycznych, pieczołowicie przyklejane na żółtych karteczkach do biurowych monitorów.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Indiana Jones i człowiek z UFO</title>
   <link href="http://room-303.com/blog/2008/05/26/indiana-jones-i-czlowiek-z-ufo/"/>
   <updated>2008-05-26T13:40:24+00:00</updated>
   <id>http://room-303.com/blog/2008/05/26/indiana-jones-i-czlowiek-z-ufo</id>
   <content type="html">&lt;p&gt;Dokładnie tak, Zbigniew Nienacki mógłby spokojnie napisać lepszy scenariusz do czwartej części przygód Indiego. To, co zrobili panowie Lucas i Spielberg powinno nazywać się &lt;q&gt;Indiana Jones i efekty komputerowe.&lt;/q&gt; Czy jestem zawiedziony? Jestem, w końcu piszę o filmie na blogu o komputerach.&lt;/p&gt;

&lt;p&gt;Wybraliśmy się do kina na premierę. Nikt nie nastawiał się raczej na arcydzieło, ja mimo to się zawiodłem. George Lucas ma jakiś wyjątkowy talent do niszczenia swoich własnych serii. Nie pozwolił spokojnie umrzeć Gwiezdnym Wojnom, dobijając je po latach infantylną trylogią dla dzieci, strzelił też w plecy staruszkowi Henriemu. W podobnym stylu.&lt;/p&gt;

&lt;p&gt;Co uderza praktycznie od początku, to próba udowodnienia, że Ford nagle przeżywa drugą młodość. Nie przeżywa, co widać w scenach, gdzie sam zdecydował się robić za kaskadera. Dalej mamy mglisty zarys fabuły, która jest chyba zlepkiem przypadkowo pociętych scenariuszy, z których panowie nie byli zadowoleni. Efekt pozwala przypuszczać, że prace nad scenariuszem wyglądały tak: &lt;q&gt;albo ta scena wejdzie, albo ja się pakuję i mam w dupie.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Nagłe zwroty w scenariuszu, jak &lt;a href=&quot;http://blog.kurasinski.com/2008/05/24/kto-zabil-indiana-jones/&quot;&gt;słusznie zauważył AK&lt;/a&gt;, sprowadzają się do &lt;q&gt;jestem twoim ojcem, Luke.&lt;/q&gt; Oczywiście, jeśli nie liczyć faktu, że poszczególne sceny nie mają ze sobą żadnego związku i łączy je tylko przeczucie wielkiego podróżnika. W efekcie dostajemy słodziutki zlepek kina familijnego à la Disney, a polewę stanowi wymuszony momentami humor i wizja emeryta koziołkującego kilometrami w lodówce na tle atomowego grzybka.&lt;/p&gt;

&lt;p&gt;Wydaje mi się zwyczajnie, że panom Lucasowi i Spielbergowi odbiło na punkcie efektów komputerowych. Być może zakładają, że skoro miliony zakochały się w plastikowych stateczkach na sznurkach, znanych z Nowej Nadziei, to zrobienie całego filmu na komputerze uczyni ich bogami? Zakrztusili się krzemem i własnym Industrial Light &amp;amp; Magic. Tylko kto oglądał Gwiezdne Wojny dla efektów, kiedy obok leżał Tron? I właśnie takie Trony nam teraz serwują. Ładne, plastikowe, o smaku oranżadki Helena, która nawet nie leżała nigdy na jednej półce z owocami.&lt;/p&gt;

&lt;p&gt;Może ten film nie jest taki zły i gdyby nazywał się &lt;q&gt;John Doe i kosmici,&lt;/q&gt; zostawiłbym go w spokoju. W końcu w porównaniu do takiego Eragona jest istnym arcydziełem. Nic nie poradzę, ale byłem fanem, a teraz muszę z przykrością stwierdzić, że fabularnie lepiej wyglądał serial o przygodach młodego Indiany Jonesa. Cóż, 19 lat zajęło stworzenie dwugodzinnego dzieła, w którym dobrego kina jest tyle, co w jednym odcinku MacGyvera (który lat ma grubo więcej). Słabo.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>PlayStation 3</title>
   <link href="http://room-303.com/blog/2008/05/19/playstation-3/"/>
   <updated>2008-05-19T17:19:56+00:00</updated>
   <id>http://room-303.com/blog/2008/05/19/playstation-3</id>
   <content type="html">&lt;p&gt;Z racji faktu, że PLD Linux cierpi na śmierć jednego z builderów, coś z zupełnie innej beczki. Jeśli ktoś chciałby do mnie postrzelać, to zapraszam. Można mnie złapać na PlayStation Network, identyfikator to &lt;code&gt;patrys&lt;/code&gt;. Zapraszam do dodawania do znajomych. A teraz wracam do Call of Duty 4.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>LGM 2008</title>
   <link href="http://room-303.com/blog/2008/05/15/lgm-2008/"/>
   <updated>2008-05-15T16:31:11+00:00</updated>
   <id>http://room-303.com/blog/2008/05/15/lgm-2008</id>
   <content type="html">&lt;p&gt;W dniach 8-11. maja odbyła się trzecia edycja &lt;a href=&quot;http://libregraphicsmeeting.org/2008/&quot;&gt;Libre Graphics Meeting&lt;/a&gt;. Ci z was, którzy się nie pojawili (i mam nadzieję, że żałują), mogą obejrzeć &lt;a href=&quot;http://flickr.com/groups/776360@N22/pool/&quot;&gt;zdjęcia&lt;/a&gt; i &lt;a href=&quot;http://www.river-valley.tv/conferences/lgm2008/&quot;&gt;nagrania wideo&lt;/a&gt; z poszczególnych prezentacji.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://pld-linux.org/&quot;&gt;PLD Linux&lt;/a&gt; był dzielnie reprezentowany przez czteroosobowy zespół w składzie: DeeJay1, djurban, emes i ja. Djurban gdzieś zagubił się w piątek, prawdopodobnie ukamienowany przez resztę deweloperów KDE. Towarzyszył nam dzielnie Jarv, któremu raz nawet udało się przyjść przed 12:30. Jeśli ktoś się zastanawiał, kim jest ten typ w pomarańczowej bluzie i koszulce z logo GNOME, to przyznaję się do winy.&lt;/p&gt;

&lt;p&gt;Chciałem przy okazji serdecznie podziękować organizatorom, choć nie obyło się bez drobnych wpadek. Nie pojawił się na przykład absolutnie nikt z polskiej prasy. O konferencji, która pierwszy &amp;mdash; i możliwe, że jedyny &amp;mdash; raz odbyła się we Wrocławiu, nie poinformowała nawet gazetka Tesco. To tłumaczy śladową liczbę grafików, którzy przyszli na prezentacje, sporą część reprezentacji Polski stanowili studenci, którzy odwiedzali wykłady w przerwach między normalnymi zajęciami Politechniki Wrocławskiej.&lt;/p&gt;

&lt;p&gt;O treści samych prezentacji nie będę się rozpisywał. Co straciliście na wykładach, możecie zobaczyć sami. Najbardziej oczekiwanym momentem była jednak prezentacja &lt;a href=&quot;http://peach.blender.org/&quot;&gt;projektu Peach&lt;/a&gt;, która odbyła się pobliskim Multikinie. Zapominalscy na oficjalną premierę filmu Big Buck Bunny będą musieli poczekać do 20. maja.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Podpisywanie elektronicznych podań</title>
   <link href="http://room-303.com/blog/2008/05/06/podpisywanie-elektronicznych-podan/"/>
   <updated>2008-05-06T12:26:42+00:00</updated>
   <id>http://room-303.com/blog/2008/05/06/podpisywanie-elektronicznych-podan</id>
   <content type="html">&lt;p&gt;Vagla zwraca uwagę na &lt;a href=&quot;http://prawo.vagla.pl/node/7839&quot;&gt;nieścisłości w przepisach&lt;/a&gt; regulujących kwestię składania wniosków do urzędów drogą elektroniczną. Ja się za to zastanawiam, kto i ile wziął pieniędzy za te wszystkie wynalazki. Nie można było prościej?&lt;/p&gt;

&lt;h4&gt;Wymagana infrastruktura&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Jeden miejski (bądź centralny) urząd ewidencji ludności;&lt;/li&gt;
&lt;li&gt;Jeden serwer kluczy PGP administrowany przez tenże urząd;&lt;/li&gt;
&lt;li&gt;Jedna para kluczy (klucz publiczny i prywatny) PGP wygenerowana przez tenże urząd i fakt udostępnienia klucza publicznego na serwerze urzędu, zaś jego identyfikatora odcisku na stronie tegoż urzędu;&lt;/li&gt;
&lt;li&gt;Jedna baza danych, która pozwala do każdego klucza publicznego przypisać jeden identyfikator PESEL;&lt;/li&gt;
&lt;li&gt;Jedna pani w okienku&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Rejestracja wzoru podpisu&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Obywatel generuje parę kluczy PGP o okresie ważności nie dłuższym niż przewidziany ustawowo (powiedzmy, że będzie to kwartał);&lt;/li&gt;
&lt;li&gt;Obywatel generuje zlecenie unieważnienia swojego klucza publicznego;&lt;/li&gt;
&lt;li&gt;Obywatel drukuje zlecenie unieważnienia w formie przyswajalnej przez komputer, na przykład w postaci kodu kreskowego, co pozwoli skorzystać z niego w okienku (po okazaniu dowodu osobistego) w przypadku utracenia wyłącznej kontroli nad kluczem prywatnym;&lt;/li&gt;
&lt;li&gt;Obywatel umieszcza swój klucz publiczny na serwerze kluczy dostarczonym przez urząd;&lt;/li&gt;
&lt;li&gt;Obywatel drukuje identyfikator odcisku swojego klucza publicznego w formie przyswajalnej przez komputer (kod kreskowy) na wniosku o poświadczenie odcisku klucza;&lt;/li&gt;
&lt;li&gt;Obywatel z wydrukowanym powyżej wnioskiem udaje się do urzędu, gdzie składa wniosek legitymując się dowodem osobistym;&lt;/li&gt;
&lt;li&gt;Pani w okienku przykłada formularz do czytnika, jej komputer pobiera informacje o kluczu z serwera urzędu i pozwala na potwierdzenie imienia i nazwiska z formularzem i okazanym dokumentem tożsamości;&lt;/li&gt;
&lt;li&gt;Serwer podpisuje wskazany klucz publiczny obywatela z poświadczeniem pełnego zaufania dla umieszczonych tam danych za pomocą klucza prywatnego urzędu, po czym publikuje go ponownie na serwerze urzędu;&lt;/li&gt;
&lt;li&gt;Serwer umieszcza w swojej bazie danych informację o skojarzeniu danego klucza z numerem PESEL nadanym obywatelowi;&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Złożenie podpisu pod dokumentem&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Obywatel pobiera bądź tworzy dokument, który ma następnie zostać podpisany;&lt;/li&gt;
&lt;li&gt;Obywatel podpisuje dokument za pomocą klucza prywatnego odpowiadającego kluczowi umieszczonemu i podpisanemu wcześniej na serwerze urzędu;&lt;/li&gt;
&lt;li&gt;Obywatel dokument wraz z podpisem przesyła do urzędu;&lt;/li&gt;
&lt;li&gt;Urząd przesyła obywatelowi poświadczenie w postaci złożonego wcześniej podpisu podpisanego ponownie kluczem prywatnym urzędu;&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Unieważnienie wzoru podpisu&lt;/h4&gt;

&lt;p&gt;Zawsze może zdarzyć się tak, że obywatel utraci swój klucz prywatny lub klucz ten wpadnie w ręce osób trzecich. Wersja pierwsza:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Obywatel generuje zlecenie unieważnienia klucza publicznego za pomocą swojej kopii klucza prywatnego;&lt;/li&gt;
&lt;li&gt;Obywatel importuje unieważnienie do swojego lokalnego pęku kluczy, tym samym unieważniając lokalną kopię swojego klucza publicznego;&lt;/li&gt;
&lt;li&gt;Obywatel publikuje ponownie swój klucz publiczny na serwerze urzędu, tym samym unieważniając swój wzór podpisu;&lt;/li&gt;
&lt;li&gt;Ponowne złożenie podpisu wymaga ponownego przejścia przez procedurę rejestracji wzoru podpisu;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Wersja druga:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ponieważ obywatel utracił swoją kopię klucza prywatnego (na przykład w wyniku kradzieży), udaje się do urzędu z wydrukowanym wcześniej unieważnieniem klucza;&lt;/li&gt;
&lt;li&gt;Pani w okienku przeciąga unieważnienie przez czytnik;&lt;/li&gt;
&lt;li&gt;Serwer importuje unieważnienie, a następnie ponownie publikuje unieważniony już klucz na serwerze kluczy;&lt;/li&gt;
&lt;li&gt;Pani mówi &lt;q&gt;dziękuję, następny;&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;Ponowne złożenie podpisu wymaga ponownego przejścia przez procedurę rejestracji wzoru podpisu;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Wersja trzecia:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ponieważ obywatel utracił swoją kopię klucza prywatnego i zgubił wydrukowane wcześniej zlecenie unieważnienia, wypełnia formularz unieważnienia na papierze, podając powód i swoje dane osobowe i udaje się z nim do urzędu;&lt;/li&gt;
&lt;li&gt;Pani w okienku sprawdza zgodność danych na wniosku, dokumencie tożsamości i w bazie danych;&lt;/li&gt;
&lt;li&gt;Serwer unieważnia swój wcześniejszy podpis zaufania pod kluczami publicznymi skojarzonymi z numerem PESEL obywatela, a następnie publikuje je ponownie, tym samym wyłączając je z użytku jako podpis akceptowany przez urzędy;&lt;/li&gt;
&lt;li&gt;Ponowne złożenie podpisu wymaga ponownego przejścia przez procedurę rejestracji wzoru podpisu;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Wersja czwarta:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Wygasa data ważności klucza obywatela;&lt;/li&gt;
&lt;li&gt;Ponowne złożenie podpisu wymaga ponownego przejścia przez procedurę rejestracji wzoru podpisu;&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Zmiana klucza prywatnego urzędu&lt;/h4&gt;

&lt;p&gt;Para kluczy urzędu ze względów bezpieczeństwa również powinna mieć ograniczony czas ważności. Może się również zdarzyć, że klucz prywatny urzędu dostanie się w niepowołane ręce:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Urząd generuje nową parę kluczy GPG;&lt;/li&gt;
&lt;li&gt;Nowy klucz publiczny urzędu zostaje opublikowany na serwerze kluczy;&lt;/li&gt;
&lt;li&gt;Identyfikator odcisku klucza publicznego zostaje opublikowany na stronie urzędu;&lt;/li&gt;
&lt;li&gt;Serwer podpisuje dotychczas podpisane klucze publiczne obywateli za pomocą nowego klucza prywatnego urzędu, udzielając im pełnego zaufania;&lt;/li&gt;
&lt;li&gt;Serwer unieważnia dotychczas używany klucz publiczny urzędu za pomocą jego klucza prywatnego, jako powód podając zastąpienie go nowym kluczem;&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Różnice w stosunku do stanu obecnego&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Koszty utrzymania infrastruktury są praktycznie zerowe;&lt;/li&gt;
&lt;li&gt;Fizyczny koszt uzyskania wzoru podpisu przez obywatela jest zerowy;&lt;/li&gt;
&lt;li&gt;Nakład urzędu w celu przyjęcia bądź unieważnienia wzoru podpisu jest minimalny;&lt;/li&gt;
&lt;li&gt;Forma ta nie faworyzuje żadnych podmiotów gospodarczych;&lt;/li&gt;
&lt;li&gt;Całość działa również poza platformą Windows;&lt;/li&gt;
&lt;li&gt;Stosowne aplikacje klienckie można przygotować w ciągu jednego wieczoru, w dowolnym języku programowania i nie wymaga to milionowych przetargów;&lt;/li&gt;
&lt;li&gt;Wiele innych serwisów (nie tylko państwowych) może użyć kluczy podpisanych urzędowo choćby w celu weryfikacji rejestrujących się użytkowników (serwis nie dostaje żadnych informacji o obywatelu poza jego imieniem i nazwiskiem, ale zaufanie urzędu gwarantuje, że organy ścigania są w stanie &amp;mdash; na podstawie odcisku klucza &amp;mdash; ustalić tożsamość podejrzanego);&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update:&lt;/strong&gt; Pozwala podpisać ten sam dokument dowolnej liczbie osób;&lt;/li&gt;
&lt;/ol&gt;
</content>
 </entry>
 
 <entry>
   <title>Global UMTS pozywa</title>
   <link href="http://room-303.com/blog/2008/04/20/global-umts-pozywa/"/>
   <updated>2008-04-20T16:04:32+00:00</updated>
   <id>http://room-303.com/blog/2008/04/20/global-umts-pozywa</id>
   <content type="html">&lt;p&gt;Nie, nie o patenty. O &lt;a href=&quot;http://room-303.com/blog/2008/04/15/global-gprs-global-umts/&quot;&gt;poprzednią notkę&lt;/a&gt;! Uważam, że nic tak dobrze nie reklamuje produktu i dobrych intencji autora, jak solidny &lt;q&gt;cease and desist,&lt;/q&gt; zapraszam więc do lektury (autor zapewne postanowi zaraz pozwać mnie z powodu ujawniania korespondencji, ale list adresowany do mnie jest moją własnością):&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;from	Dariusz R. &amp;lt;dariuszdev @gmail.com&amp;gt;
to	patrys@pld-linux.org,
date	Sun, Apr 20, 2008 at 5:28 PM
subject	Global UMTS - pomówienia zgłoszone POLICJI&lt;/pre&gt;
	
&lt;p&gt;Witam&lt;/p&gt;

&lt;p&gt;Jestem autorem programów Global UMTS i Global GPRS.&lt;/p&gt;

&lt;p&gt;Dziś rano złożyłem zawiadomienie o popełnieniu przestępstwa (zdjęcie dokumentu w załączniku). Policja zabezpieczyła dowody – treść kilku stron internetowych.&lt;/p&gt;

&lt;p&gt;Popełniono przestępstwo m.in. z art. 212 § 1 oraz § 2 Kodeksu Karnego zagrożone karą pozbawienia wolności do  2 lat.&lt;/p&gt;

&lt;p&gt;Przygotowywane jest powództwo cywilne:  odszkodowanie za pomówienie mojej osoby, które naraziło mnie m.in. na utratę zaufania potrzebnego dla mojej pracy zawodowej (w kwocie kilkudziesięciu tysięcy złotych) i kolejne odszkodowanie za niszczenie marki i dobrej renomy wśród klientów programów Global GRPS i Global UMTS, którą budowałem dużym kosztem od długiego czasu (kolejne kilkadziesiąt tysięcy złotych).&lt;/p&gt;

&lt;p&gt;Dodatkowo trzeba też będzie przez wiele miesięcy pokrywać koszty zakupu reklam internetowych odbudowujących zniszczony wizerunek moich programów. Trzeba będzie zwrócić kwotę przeznaczoną na wynagrodzenie adwokatów.&lt;/p&gt;

&lt;p&gt;Sprawy karna i cywilna będą się toczyć w Sądach w Warszawie.&lt;/p&gt;

&lt;p&gt;Żądam natychmiastowego usunięcia oszczerczych tekstów (wraz z komentarzami) między innymi z tych stron:&lt;/p&gt;

&lt;p&gt;http://room-303.com/blog/&lt;br /&gt;http://10przykazan.com/archive/2008/4/15/4/&lt;br /&gt;http://planet.pld-linux.org/&lt;/p&gt;

&lt;p&gt;Każdy kolejny dzień istnienia tych tekstów w internecie jest dokładnie dokumentowany przez prawników i policję i będzie podstawą do zwiększania kwoty odszkodowań i wydatków na reklamy służące odbudowie wizerunku marki i dobrej renomy Global GRPS i Global UMTS.&lt;/p&gt;

&lt;p&gt;Dotyczy to też wyświetlania oszczerczych tekstów z archiwum stron Google. Sąd zostanie poinformowany o tym, że istnieje możliwość usunięcia tych stron z pamięci Google (szczegóły w dziale porady dla webmasterów na stronie www.google.com ) więc należy je  niezwłocznie usunąć z pamięci Google.&lt;/p&gt;

&lt;p&gt;Pozdrawiam&lt;br /&gt;Darek&lt;/p&gt;

&lt;p&gt;Na koniec treść kilku artykułów z Kodeksu Karnego:&lt;/p&gt;

&lt;p&gt;Przestępstwo z art. 212 § 1 oraz § 2&lt;/p&gt;

&lt;p&gt;Art. 212   Kodeks Karny&lt;/p&gt;

&lt;p&gt;§ 1. Kto pomawia inną osobę, grupę osób, instytucję, osobę prawną lub jednostkę organizacyjną nie mającą osobowości prawnej o takie postępowanie lub właściwości, które mogą poniżyć ją w opinii publicznej lub narazić na utratę zaufania potrzebnego dla danego stanowiska, zawodu lub rodzaju działalności, podlega grzywnie, karze ograniczenia albo pozbawienia wolności do roku.&lt;/p&gt;

&lt;p&gt;§ 2. Jeżeli sprawca dopuszcza się czynu określonego w § 1 za pomocą środków masowego komunikowania, podlega grzywnie, karze ograniczenia wolności albo pozbawienia wolności do lat 2.&lt;/p&gt;

&lt;p&gt;§ 3. W razie skazania za przestępstwo określone w § 1 lub 2 sąd może orzec nawiązkę na rzecz pokrzywdzonego, Polskiego Czerwonego Krzyża albo na inny cel społeczny wskazany przez pokrzywdzonego.&lt;/p&gt;

&lt;p&gt;Art. 488   Kodeksu Postępowania Karnego&lt;/p&gt;

&lt;p&gt;§ 1. Policja na żądanie pokrzywdzonego przyjmuje ustną lub pisemną skargę i w razie potrzeby zabezpiecza dowody, po czym przesyła skargę do właściwego sądu.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Jestem więc teraz przestępcą. Czujecie już respekt? Następna notka ukaże się grypserą.&lt;/p&gt;

&lt;p&gt;Autora zaś informuję, że straszenie mnie prokuratorem jest bezcelowe. Moja kobieta jest prawnikiem i znam swoje prawa. Jeśli chcesz domagać się usunięcia jakiejkolwiek treści z mojego bloga, to staraj się o to kulturalnie, przez kontakt ze mną (którą to szansę właśnie zmarnowałeś, pokazując jednocześnie buractwo &amp;mdash; uwaga, drugie pomówienie), albo dochodź swoich praw w sądach USA, gdzie blog się znajduje.&lt;/p&gt;

&lt;p&gt;Po drugie, uważam, że jesteś słabym programistą i mam do tego pełne prawo. To nie gazeta. Co więcej, powiedziałem ci, co zrobić, żeby poprawić swój program. Jeśli masz ego większe od mózgu, to już problem dla psychologów, a nie sądu (uwaga, tutaj autor notki trzeci raz dopuścił się pomówienia, mamy więc recydywę). &lt;q&gt;Och nie, w Internecie ktoś się myli!&lt;/q&gt; Pozwij mnie od razu o przemoc w stosunku do nieletnich, szerzenie pornografii i akty lubieżne w miejscach publicznych, może w końcu trafisz z jakimś zarzutem. Najlepiej w sądzie w Gdańsku.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Global GPRS, Global UMTS</title>
   <link href="http://room-303.com/blog/2008/04/15/global-gprs-global-umts/"/>
   <updated>2008-04-15T12:28:17+00:00</updated>
   <id>http://room-303.com/blog/2008/04/15/global-gprs-global-umts</id>
   <content type="html">&lt;p&gt;Są sobie takie dwa programy niejakiego Dariusza Rakowskiego. Nie podlinkuję, dopóki nie napiszę, dlaczego w ogóle o nich wspominam. &lt;em&gt;Bo osoba reklamująca je jest cholernym spamerem&lt;/em&gt; i &lt;em&gt;nigdy nie należy ufać programom z niewiadomego źródła.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Pierwszy rzut oka na &lt;a href=&quot;http://www.globalumts.strony.pl/&quot; rel=&quot;nofollow&quot;&gt;Global UMTS&lt;/a&gt;: binarka bez źródeł. Nie dotykać, pomacać przez &lt;code&gt;ldd&lt;/code&gt; i &lt;code&gt;strings&lt;/code&gt;. Ten drugi pokazuje, że program szuka &lt;code&gt;gksu&lt;/code&gt; albo &lt;code&gt;kdesu&lt;/code&gt;. Po co? Pokazuje też, że autor jest słabym programistą i &lt;em&gt;szuka urządzeń przez &lt;code&gt;dmesg | grep&lt;/code&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Więcej kwiatków nie chciało mi się szukać. Wygląda jednak na to, że wbrew naszym pierwszym skojarzeniom, program nie wysyła waszych danych do autora. &lt;em&gt;Wygląda&lt;/em&gt; &amp;mdash; nie poświęciliśmy mu więcej czasu, więc proszę nie brać tego za pewnik i najlepiej programu zwyczajnie unikać, zamiast tego posiłkując się najnowszym Network Managerem.&lt;/p&gt;

&lt;p&gt;Dariuszowi zaś, jeśli &lt;del&gt;to prawdziwe imię i&lt;/del&gt; ma faktycznie dobre zamiary, polecam skasować program, napisać od nowa po ludzku (z użyciem HALa, PolicyKit i bez sprawdzania, czy dystrybucja to czasem nie OpenSuSE) i udostępnić w postaci źródeł. Na licencji, która zezwala na dystrybucję. Aha, radziłbym się upewnić, czy rozprowadzanie loginów i haseł operatorów komórkowych z całego świata jest zgodne z ich wolą i prawem.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Terminal velocity</title>
   <link href="http://room-303.com/blog/2008/04/10/terminal-velocity/"/>
   <updated>2008-04-10T12:20:55+00:00</updated>
   <id>http://room-303.com/blog/2008/04/10/terminal-velocity</id>
   <content type="html">&lt;p&gt;Jak widać, &lt;a href=&quot;http://room-303.com/blog/2007/08/09/osobowosc-konsolowa/&quot;&gt;od sierpnia&lt;/a&gt; wiele się nie zmieniło:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;$ history | awk '{a[$2]++ } END{for(i in a){print a[i] &quot; &quot; i}}'|sort -rn|head
270 vim
107 cvs
96 cd
87 ./builder
81 svn
36 sudo
31 ssh
31 poldek
30 ../pld-builder.new/client/make-request.sh
27 ls&lt;/pre&gt;&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>Zabierzcie mnie z Polski, byle nie do Polaków</title>
   <link href="http://room-303.com/blog/2008/04/07/zabierzcie-mnie-z-polski-byle-nie-do-polakow/"/>
   <updated>2008-04-07T19:43:36+00:00</updated>
   <id>http://room-303.com/blog/2008/04/07/zabierzcie-mnie-z-polski-byle-nie-do-polakow</id>
   <content type="html">&lt;p&gt;Polecam lekturę &lt;a href=&quot;http://gospodarka.gazeta.pl/podatki/1,25044,5095556.html&quot;&gt;tego artykułu o podatkach&lt;/a&gt; na stronie Gazety. W sumie tu mógłbym skończyć, ale obawiam się, że niektórzy nie zrozumieją, dlaczego go polecam.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Bo Polacy to idioci&lt;/em&gt; i współczynnik inteligencji statystycznej jednostki można obliczyć &lt;em&gt;odejmując 100 od wzrostu wyrażonego w centrymetrach&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Jak zwykle zakładam, że poziom intelektualny osób zaglądających na tego bloga pozwala im nie poczuć się urażonymi odniesieniami do statystyk. Jeśli ktoś nie poczuł się urażony, to nie musi dalej czytać. Dalej będą&amp;hellip;&lt;/p&gt;

&lt;h4&gt;Informacje dla statystycznego Polaka&lt;/h4&gt;

&lt;p&gt;Drodzy moi, w tej chwili najniższa stawka wynosi 19 procent. Proponowana zmiana wprowadzi najniższą stawkę niższą o oczko, na poziomie 18 procent. Dla was, drogie matoły, oznacza to (uwaga) &lt;em&gt;niższe podatki&lt;/em&gt;. Ale to wam nie wystarczy. Wszystkiemu winni są &lt;em&gt;ci inni&lt;/em&gt;, ci &lt;em&gt;bogaci&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Bogaci to w Polsce coś w rodzaju gildii skrytobójców. Każdy wie, że są wszystkiemu winni, ale żaden szanujący się obywatel ich nie widział. U nas wszyscy są dobrzy, czyli biedni. A bogaci muszą być źli, bo inaczej wszyscy dobrzy byliby bogaci, prawda? Taka tam logika po kwasach. Teraz, drogie osiołki, zamiast marzyć o rabinie, co chudł czy innych Janosikach, którzy dopieprzyliby tym złym bogatym, chcecie podnieść im podatki. Skoro zarabiają więcej, to muszą więcej płacić prawda?&lt;/p&gt;

&lt;p&gt;Załóżmy zatem, że mamy podatek liniowy na poziomie 20 procent. Wy zarabiacie 800 pln w Żabce, a mi trafiła się intratna posada kierownika zmiany w Biedronce, która płaci mi krocie w liczbie 1600. Policzmy zatem podatek: dla was będzie to 800 * 20% = 160; ja, paskudnik przebrzydły, zabulę: 1600 * 20% = 320. Szok, dwa razy więcej! &lt;em&gt;Pierdolona magia.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Teraz czekam na wytłumaczenie, dlaczego państwo miałoby przyznawać wyjątkowe zniżki z tytułu rozmnażania bez udziału mózgu. Skoro kogoś stać na dwójkę dzieci, to dlaczego robi piątkę i płacze o zniżki? Ja bardzo lubię samochody. Wiecie ile ich mam? &lt;strong&gt;Żadnego, bo mnie, kurwa, nie stać&lt;/strong&gt;. Jak sobie kupię pięć &lt;em&gt;fur&lt;/em&gt; z silnikami po pięć litrów, to mi nikt do &lt;em&gt;wachy&lt;/em&gt; nie dołoży. Czy szanowni czytelnicy zrozumieli tę subtelną acz dostrzegalną aluzję?&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Chyrpa nie będzie</title>
   <link href="http://room-303.com/blog/2008/04/07/chyrpa-nie-bedzie/"/>
   <updated>2008-04-07T10:53:10+00:00</updated>
   <id>http://room-303.com/blog/2008/04/07/chyrpa-nie-bedzie</id>
   <content type="html">&lt;p&gt;Jak w tytule. Aleksowi &lt;a href=&quot;http://chyrp.net/&quot;&gt;Chyrp&lt;/a&gt; się znudził, planowany system szablonowy (&lt;code&gt;twig&lt;/code&gt;) nigdy nie został skończony. Sam projektu ciągnął nie będę, bo nie mam dostępu do całej infrastruktury i jestem uzależniony pod tym względem od głównego autora, a bez silnika szablonowego nawet nie mam co marzyć o doprowadzeniu kodu do czystości.&lt;/p&gt;

&lt;p&gt;Cytując naszą niedawną rozmowę: &lt;q&gt;czekam tylko, aż zainteresowanie spadnie na tyle, żeby zamknąć projekt.&lt;/q&gt; Trudno, taki los przyjemnych projektów. Jeśli ktoś jest zainteresowany kontynuacją projektu (zapewne pod inną nazwą, chociaż jeszcze nie pytałem autora o zdanie) z zachowaniem licencji GPL 3, to poprzedni maintainer (czytaj: ja) służy pomocą. Oferty ze zdjęciem zostawiajcie w komentarzach. Już nie mogę się doczekać tych setek piszczących z podniecenia nastolatek.&lt;/p&gt;

&lt;p&gt;To tyle, proszę wycieczki, kierunek dalszego zwiedzania wskazują strzałki na podłodze.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Wywiad: Mapness.net</title>
   <link href="http://room-303.com/blog/2008/03/31/wywiad-mapnessnet/"/>
   <updated>2008-03-31T21:19:26+00:00</updated>
   <id>http://room-303.com/blog/2008/03/31/wywiad-mapnessnet</id>
   <content type="html">&lt;p&gt;Kilka dni temu miałem okazję zaprosić do rozmowy twórców niedocenianego na Polskich blogach serwisu, wynik do obejrzenia poniżej. Rozmawiali ze mną Michał Popielnicki (MP) i Tomasz Sieroń (TS) z ekipy &lt;a href=&quot;http://mapness.net/&quot;&gt;mapness.net&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://mapness.net/&quot;&gt;&lt;img src=&quot;http://mapness.net/media/mapness_logo_500px_white.jpg&quot; alt=&quot;Mapness logo&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PZ:&lt;/strong&gt; &lt;em&gt;Są tu ze mną Michał Popielnicki i Tomek Sieroń z zespołu odpowiedzialnego za serwis mapness.net, witam was serdecznie.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MP:&lt;/strong&gt; Cześć. Gorąco pozdrawiamy wszystkie czytelniczki.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PZ:&lt;/strong&gt; &lt;em&gt;Mało u nas słychać o Mapness, może więc na początek powiecie nam coś o samym serwisie?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Nasz projekt to internetowy dziennik podróży i &lt;q&gt;social journey planner.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MP:&lt;/strong&gt; Na tym etapie Mapness to internetowy dziennik podróży, jednak mamy plany by stał się w przyszłości czymś znacznie większym.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Zgadza się, dziennik podróży to przede wszystkim relacjonowanie swoich wojaży i dodanie do tego opisow, fotek, filmów. Chcemy, by Mapness mogło również służyć za &quot;social planner&quot; - osadzone w kontekście społeczności podróżniczej narzędzie do planowania &lt;q&gt;palcem po mapie.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PZ:&lt;/strong&gt; &lt;em&gt;Co da użytkownikom taka możliwość planowania?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; To lekarstwo na agencje turystyczne online, które pokazują kilka mini fotek plaży i dwa paragrafy tekstu i oczekują, że na tej podstawie klient zdecyduje się na wybór wycieczki czy dwutygodniowych wakacji.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MP:&lt;/strong&gt; Chcemy, by użytkownik miał możliwość dokładnego zaplanowania podróży, z uwzględnieniem najdrobniejszych szczegółów i dostępem do informacji, jakimi dzielą się inni.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PZ:&lt;/strong&gt; &lt;em&gt;Czy projektem zajmujecie się we dwóch?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MP:&lt;/strong&gt; Tomek jest odpowiedzialny za projekt interakcji, za część serwerową odpowiedzialny jestem ja i nieobecny dziś Wojtek Kosiński.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Napisałem też większość JavaScriptu, który przejął teraz Michał.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MP:&lt;/strong&gt; Też mi coś. Wcale nie większość! (śmiech)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Jak widać, zespół jest zgrany i świetnie się dogadujemy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PZ:&lt;/strong&gt; &lt;em&gt;Z tego co wiem, projekt działa od kilku miesięcy. Wy znacie się znacznie dłużej, prawda?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MP:&lt;/strong&gt; Tak, będzie tego dziesięć lat, z przerwami na trzeźwienie (śmiech).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Wszyscy pochodzimy z jednego osiedla w Lublinie - na dalekim wschodzie kraju.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PZ:&lt;/strong&gt; &lt;em&gt;Dlaczego więc zaczęliście wspólny projekt dopiero teraz?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MP:&lt;/strong&gt; Myślę, że musieliśmy do tego dorosnąć, po skończeniu studiów pojawiła się taka możliwość, więc staramy się ją wykorzystać.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Tak, zwłaszcza, odkąd skreśliliśmy nasz pewniak, serwis randkowy (śmiech).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PZ:&lt;/strong&gt; &lt;em&gt;Jak zaczęło się życie Mapness?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Michał jest motocyklistą, pomysł przyszedł mu do głowy, kiedy kolejny raz wyznaczał trasę, wbijając szpilki w mapę rozwieszoną na tablicy korkowej.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MP:&lt;/strong&gt; To prawda, na początku chciałem zbudować narzędzie tylko dla siebie, ale szybko okazało się, że mamy masę pomysłów.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Uznaliśmy, że pomysł ma duży potencjał, nie tylko dla motocyklistów, ale dla każdego, kto podróżuje lub chce to robić.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MP:&lt;/strong&gt; Można pokazać znajomym, gdzie się było, dołączając zdjęcia do poszczególnych etapów wyprawy, ale można też zaplanować trasę przyszłej wycieczki.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Szukaliśmy pomysłu, który pozwoli nam ruszyć z własnym startupem i pomysł Michała okazał się dla zespołu strzałem w dziesiątkę.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PZ:&lt;/strong&gt; &lt;em&gt;Można więc powiedzieć, że chociaż szukaliście pomysłu na biznes, serwis powstał z potrzeby rozwiązania problemu. Czy żadne z narzędzi konkurencyjnych nie było dość dobre?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Musimy się przyznać, że na początku znaliśmy tylko część naszych konkurentów. Stwierdziliśmy, że ich oferta jest średnia - blogi z pseudopodróżniczą metką. O reszcie dowiedzieliśmy się po fakcie, kiedy przygotowywaliśmy nasz biznesplan, a także w trakcie rozmów z ludźmi z branży.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MP:&lt;/strong&gt; Choćby po naszej prezentacji na 3camp okazało się, że podobne serwisy wyrastają jak grzyby po deszczu. Obecnie śledzimy ponad dwadzieścia z nich, dość wnikliwie, ze względu na ich podobieństwo do naszego projektu.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Na szczęście konkurencja traktuje mapy jako dodatek, podczas gdy u nas stanowią podstawę. Są osią, na której dopiero przedstawiana jest relacja bądź plan podróży.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PZ:&lt;/strong&gt; &lt;em&gt;Nie boicie się konkurencji?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MP:&lt;/strong&gt; Największym zagrożeniem są dla nas serwisy, za którymi stoi duży kapitał albo ogromna maszyna marketingowa. Z nimi nie wystarczy konkurować na poziomie oferowanych funkcji czy użyteczności.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PZ:&lt;/strong&gt; &lt;em&gt;A co z naprawdę dużymi firmami?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Z Google konkurować nie zamierzamy, bo to z góry przegrana bitwa (śmiech). Wiemy natomiast, że giganci pokroju Google oferują bardzo ogólne rozwiązania, które do wielu zastosowań wymagają zbyt wiele ze strony użytkownika. Proponując wersję dopasowaną do konkretnego zastosowania, wychodzimy naprzeciw potrzebom naszej grupy docelowej. Jesteśmy mali i zwinni, szczególnie Michał (śmiech), dzięki czemu łatwo możemy dostosować się do zmieniających się potrzeb i to jest nasza zaleta w stosunku do gigantów.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MP:&lt;/strong&gt; Nie jesteśmy też związani szczegółowymi kontraktami, dzięki czemu możemy wprowadzać narzędzia ułatwiające integrację z innymi serwisami, na co duże koncerny nie mogą sobie pozwolić.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PZ:&lt;/strong&gt; &lt;em&gt;Jak wyglądają wasze dalsze plany rozwoju? Czy możemy liczyć na API? Integrację z odbiornikami GPS? A może śledzenie trasy na żywo?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MP:&lt;/strong&gt; Tak, to wszystko mamy w planach, a także wersję mobilną.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Urządzenia przenośne uważamy za istotny etap naszego rozwoju, tam właśnie widzimy przyszłość sieci.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PZ:&lt;/strong&gt; &lt;em&gt;W Polsce może to stanowić problem, bo pod tym względem stanowimy chyba niewielki rynek?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Zgadza się, w Polsce na samych mobilnych rozwiązaniach oprzeć swój biznes i zarobić mogą tylko najwięksi. Dla polskich użytkowników serwisu nasza oferta dla urządzeń przenośnych będzie stanowić rozwiązanie komplementarne, ale nie skupiamy się tylko na polskim rynku. Szlaki mamy już przetarte zarówno w Stanach, jak i w Azji.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MP:&lt;/strong&gt; Z dodatkowych funkcji, chcemy wprowadzić także możliwość geolokowania autora relacji za pomocą nadajników sieci komórkowych jako alternatywy dla GPS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Możesz się również spodziewać, że już niedługo, po powrocie z wyjazdu, twój telefon zapyta cię, czy chciałbyś umieścić całą przebytą trasę na Mapness. Oczywiście także z możliwością relacjonowania live przez GPRS i inne dostępne w podróży metody łączności.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PZ:&lt;/strong&gt; &lt;em&gt;Waszym celem jest zatem cały świat, ciężko jednak jednocześnie prowadzić działania promocyjne na tak dużym terenie. Gdzie teraz skupiacie swoje zainteresowanie?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; W początkowej fazie skupiamy swój marketing tu, gdzie mamy najwięcej kontaktów i najszersze możliwości. Do tej pory była to Polska i UK, głównie ze względu na to, że jesteśmy ograniczeni własnymi funduszami.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MP:&lt;/strong&gt; Widzimy duży potencjał w rozwijających się ciągle rynkach turystyki online w Europie i USA. Do tego trzeba jednak funduszy, a jeszcze do niedawna projekt rozwijany był tylko po godzinach, w garażu (śmiech).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Teraz ja odszedłem z pracy, cały swój czas inwestujemy w rozwój projektu. Rozmawiamy również z inwestorami, którzy umożliwią nam zrealizowanie naszych celów.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PZ:&lt;/strong&gt; &lt;em&gt;Myśleliście o sprzedaży usług dla wielu różnych marek, czy może o jednym strategicznym inwestorze?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MP:&lt;/strong&gt; Kierować się chcemy raczej w stronę współpracy z obecnie liczącymi się graczami sektora turystyki online. Chcemy, by Mapness stało się kolejnym kanałem sprzedaży ich usług, jednocześnie zwiększając wartość serwisu dla społeczności.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Dokładnie. Chcemy połączyć wiedzę użytkowników tworzących społeczność podróżników z odpowiednio dobranymi ofertami firm działających w tej branży.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PZ:&lt;/strong&gt; &lt;em&gt;Czy to znaczy, że w serwisie pojawi się sponsorowany content lub reklamy?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MP:&lt;/strong&gt; Szukamy takiego inwestora, który pozwoli nam rozwinąć produkt technologicznie, pozwalając na zdobycie dodatkowych rąk do pracy, a jednocześnie prowadzić działania marketingowe, dzięki którym przekroczymy tipping point i masę krytyczną niezbędną do przetrwania na rynku.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Bardziej od tradycyjnych reklam podoba nam się pomysł powiązania treści tworzonych i zarządzanych przez społeczność z odpowiednio dobranymi ofertami firm zewnętrznych.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PZ:&lt;/strong&gt; &lt;em&gt;Mimo dużych planów mało o was słychać w polskiej sieci?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MP:&lt;/strong&gt; Niestety. Ostatnio ruszył szeroko opisywany przez polską blogosferę Kolumber. My jesteśmy w sieci od połowy grudnia, ale nie zostaliśmy jeszcze przez nikogo opisani. Najpopularniejsi jesteśmy w Belgii, gdzie opisał nas jeden z bardziej poczytnych blogów. Dalej USA i Polska, ale tu, co by nie mówić, szału nie ma (śmiech).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Z dwóch opcji, wolimy dopracowywać serwis, niż na siłę szukać rozgłosu. Myślę, że znalezienie inwestora dużo na tym polu zmieni. Dość powiedzieć, że liczba unikalnych wizyt w stosunku do zeszłego miesiąca wydłużyła się o jedną cyfrę, jesteśmy dobrej myśli.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PZ:&lt;/strong&gt; &lt;em&gt;Wróćmy jeszcze do historii. Wspomnieliście, że znacie się od dziesięciu lat, jak to wpływa na wasze wzajemne stosunki?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Zaczęło się od gier RPG, potem staliśmy się nierozłączni. Następnie życie rozrzuciło nas nieco po świecie, ale stale utrzymujemy kontakt i w każde święta alkoholizujemy się w komplecie (śmiech). Wszyscy dookoła twierdzą, że biznes z przyjaciółmi to pomyłka, że nie należy nigdy łączyć przyjaźni i pieniędzy. Dla nas to trochę zabawne, bo nie dość, że nie mamy z tym problemów, to dodatkowo bardzo nam to pomaga.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MP:&lt;/strong&gt; Obcego człowieka ciężko odpowiednio zmotywować, jeśli wiesz, co mam na myśli. Starego kumpla wystarczy opieprzyć, że jest leniwą łajzą (śmiech).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Nie zawsze słyszy się same miłe rzeczy, ale silna interakcja między członkami zespołu daje dużego kopa, jeśli chodzi o nastawienie do projektu.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PZ:&lt;/strong&gt; &lt;em&gt;A okres studiów? Czy uważacie, że warto było je kończyć?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MP:&lt;/strong&gt; Moim zdaniem nie warto. Najważniejsze umiejętności są jednak kwestią zacięcia i samodoskonalenia. Reszta to doświadczenie zawodowe, którego na studiach nie znajdziesz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Trudne pytanie. Ja kończyłem inżynierię biomedyczną na Politechnice Gdańskiej. O inżynierii nadal wiem niewiele, została mi tylko mammografia, którą praktykuję w ramach hobby (śmiech). Myślę, że najważniejsze, co dają studia, to kontakt z ciekawymi ludźmi i cały aspekt socjalny, jaki się z tym wiąże. Pieniądze i praca to nie wszystko.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PZ:&lt;/strong&gt; &lt;em&gt;Na koniec pozostaje mi spytać, jakie to uczucie, zbudować swój pierwszy poważny startup?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TS:&lt;/strong&gt; Dużo dobrej zabawy. Przez pierwszych kilka miesięcy każdy z nas robił w Mapness tylko to, co lubi. Potem bum! Biznesplan, projekcja dochodów, kosztów, bilanse, marketing - mniej dla nas przyjemne, ale dużo się uczymy. Ważna jest też umiejętność radzenia sobie z konfliktami, jakie wynikają w trakcie wspomnianych przygotowań. Trzeba umieć zażegnać je, zanim się rozwiną i staną się realnym problemem. Na początku to wydają się drobne rzeczy, ale kiedy z kolegami spędzasz w miesiącu więcej nocy niż ze swoją dziewczyną, to konflikty stają się nieuniknione (śmiech).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MP:&lt;/strong&gt; Nadal ze sobą wytrzymujemy i to jest najważniesze. Reszta to realizacja naszych marzeń i ostateczne opanowanie świata (śmiech).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PZ:&lt;/strong&gt; &lt;em&gt;Dziękuję za rozmowę i pozdrawiam serdecznie, życząc sukcesu.&lt;/em&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Wolny Tybet, wolne żarty</title>
   <link href="http://room-303.com/blog/2008/03/24/wolny-tybet-wolne-zarty/"/>
   <updated>2008-03-24T00:08:10+00:00</updated>
   <id>http://room-303.com/blog/2008/03/24/wolny-tybet-wolne-zarty</id>
   <content type="html">&lt;p&gt;Cieszą mnie bardzo kolejne blogowe akcje. Są niezwykle wymowne i barwne. Coś na kształt pielęgniarek strajkujących w sanatorium. O czym mówię?&lt;/p&gt;

&lt;p&gt;Niedawno usłyszałem, że powinienem odezwać się w sprawie Tybetu, bo &lt;q&gt;temat to ważny i milczeć nie wolno.&lt;/q&gt; Odzywam się zatem. Słowami, których nie uświadczysz na portalach z milionami odsłon. To blog i mam prawo wypisywać, co mi się tylko podoba &amp;mdash; tobie nikt nie każe tego czytać, więc wszystko wygląda fair, prawda?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Tybet jest nową Afryką&lt;/em&gt;, że się tak &amp;mdash; łebdwazeo &amp;mdash; wyrażę. Od tygodnia o niczym innym na polskich blogach nie czytam. Liczyłem na tradycyjną lawinę katolickich wartości świątecznych, ale nie. &lt;em&gt;You failed.&lt;/em&gt; Piszecie w kółko o Tybecie, jakby Chiny najechały i zajęły go sobie w moje cholerne imieniny. Przykro mi, że was zawiodę, Tybet nie jest osobnym krajem, nie był też tydzień temu. Kto poda okresy kiedy był, w ciągu całego dwudziestego wieku? Czy słyszałem, jak ktoś z sali powiedział pod nosem &lt;q&gt;nigdy?&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Co zrobiły Chiny z Tybetem? A co stało się z Kosowem? Który kraj ostatnio opowiedział się za ich niezależnością? Czyżby Polska? &lt;em&gt;Cóż za niefart.&lt;/em&gt; Może i zacne są te wszystkie akcje i akcyjki, ale &lt;em&gt;kurwa&lt;/em&gt;, błagam was. Wasze akcje są tak skuteczne i przemyślane, jak naklejenie sobie na zderzaku malucha deklaracji &lt;q&gt;nie zgadzam się z głodem w Afryce&lt;/q&gt;. Niewątpliwie jest to największy w dziejach ludzkości krok do rozwiązania problemu. Oczyma wyobraźni widzę spotkanie na szczycie, na które wpada nagle sekretarz stanu Polski z mrożącą krew w żyłach informacją: &lt;q&gt;dwudziestu trzech blogerów z Pcimia nie zgadza się na olimpiadę w Pekinie.&lt;/q&gt; Tak zaczną srać po gaciach, że Zewa, producent najbardziej miękkiej na świecie srajtaśmy, trafi do Fortune 100.&lt;/p&gt;

&lt;p&gt;Ładne są te wasze znaczki, fajne te protesty i, oczywiście, doceniam elektroniczne petycje. To takie sympatyczne i niegroźne dziwactwa, ale w Polsce (i na całym świecie) sprawy załatwia się na papierze. Chcesz coś zdziałać? Poświęć pięć minut i zapakuj to w kopertę. Półgodzinna tyrada na głównej stronie Joggera co najwyżej pozwoli zarobić na reklamach (albo zbankrutować, jeśli to twój serwer utrzymuje znaczek akcji, do którego wszyscy hotlinkują). Jak krytykować, to konstruktywnie. Jak protestować, to pod właściwym urzędem. Nikt się nie przejmie człowiekiem, który &amp;mdash; w ramach głodówki &amp;mdash; przez trzy dni prowadził bloga bez pizzy.&lt;/p&gt;

&lt;p&gt;Stado babć w beretach potrafi &lt;em&gt;wziąć jebany długopis do ręki&lt;/em&gt; i wysłać milion protestów w sprawie jednego autobusu. Przykro, że zginęło tam kilkadziesiąt osób, ale zaraz znalazły się fundusze, prawda? A wam od stukania komciów odjęło część mózgu odpowiedzialną za trzymanie pióra i ślinienie kopert? Nie? To do roboty, a na blogach opisujcie nowinki z życia Sieci i skład śniadania.&lt;/p&gt;

&lt;p&gt;Na koniec zagadka. Wiecie, co to jest pięć olimpijskich kółek na tle plamy krwi? Czarny humor. I nic więcej. Zanim mnie zjecie, pozwólcie, że przyznam wam z góry rację, a w ramach rekompensaty przygotuję blogo-wlepki z napisami, odpowiednio &lt;q&gt;bezrobocie jest do dupy,&lt;/q&gt; &lt;q&gt;niepodległy Śląsk&lt;/q&gt; i &lt;q&gt;to nie fair, że moja mama utrzymuje tego bloga.&lt;/q&gt; Stay tuned, drodzy obrażeni hipokryci, resztę miłośników ironii serdecznie pozdrawiam.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Pierwszy z demonów</title>
   <link href="http://room-303.com/blog/2008/03/20/pierwszy-z-demonow/"/>
   <updated>2008-03-20T13:59:14+00:00</updated>
   <id>http://room-303.com/blog/2008/03/20/pierwszy-z-demonow</id>
   <content type="html">&lt;p&gt;Na każdym zebraniu jest taka sytuacja, że ktoś musi zacząć. Przy komputerze nikt kogo pod pistoletem nie trzyma, a skoro pan nie mówi o przyrodzie, możemy przejść do spraw ciekawszych. Jeśli wiesz, czym jest dæmon &lt;code&gt;init&lt;/code&gt; i jaka jest jego rola w systemie uniksowym, możesz śmiało przeskoczyć nad płytkim, powierzchownym i łopatologicznym wprowadzeniem, którego się nie spodziewasz, a którym za chwilę uraczę całą resztę. Wpadliście w zasadzkę, marny wasz los.&lt;/p&gt;

&lt;h4&gt;Głupi kaowiec&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;init&lt;/code&gt; nie jest wielki, ale lekceważyć go nie wolno. Jest alfą i omegą, krótkie starcie z nim szybko upewni cię, że może to oznacząć początek twojego końca. &lt;q&gt;Jak to?&lt;/q&gt; &amp;mdash; pytasz ze zdziwieniem w oczach, gdy ja przypominam ci radosny komunikat:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;Kernel panic: Attempted to kill init&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;init&lt;/code&gt; jest nieśmiertelny. Rodzi się jako pierwszy i, niczym dobry kapitan, pozostaje na pokładzie do samego końca. Inne procesy traktują go jako dobrotliwego wujka, który przygarnia zbłąkane sieroty, bądź jako wielkiego przedwiecznego, który wszelkie nieposłuszeństwo karze globalną zagładą.&lt;/p&gt;

&lt;p&gt;&lt;q&gt;Czy powinienem się go bać?&lt;/q&gt; &amp;mdash; zapytujesz, a twarz twą oblewa rumieniec. &lt;q&gt;Nie&lt;/q&gt; &amp;mdash; odpowiadam, wzbudzając tym większą ciekawość. &lt;code&gt;init&lt;/code&gt; to bardzo specyficzna bestia. Uruchamiany jest jako pierwszy proces przestrzeni użytkownika (nie licząc tak zwanego &lt;q&gt;early userspace&lt;/q&gt; zawartego w &lt;code&gt;initramfs&lt;/code&gt;, odpowiadającego za przygotowanie urządzeń do właściwego uruchomienia systemu) i zawsze jest numerem jeden (chodzi oczywiście o &lt;abbr title=&quot;Process ID&quot;&gt;PID&lt;/abbr&gt;, czyli identyfikator procesu). Przygarnia również sieroty, czyli procesy, które wyrzekają się rodziców. Jądro systemu operacyjnego automatycznie przypisuje wszystkim bezpańskim procesom zastępczego opiekuna w postaci procesu &lt;code&gt;init&lt;/code&gt; właśnie.&lt;/p&gt;

&lt;p&gt;Mało tego, to właśnie biografia &lt;code&gt;init&lt;/code&gt;a zawierać mogłaby &lt;q&gt;i rzekł &quot;niech staną się inne procesy&quot;; i poczęły się uruchamiać usługi; i zobaczył, że było to dobre.&lt;/q&gt; Dæmon &lt;code&gt;init&lt;/code&gt; pełni rolę nadzorcy całego systemu i troszczy się o to, by uruchomione zostały wszystkie niezbędne do działania komputera usługi (oczywiście mówię o działaniu w pojęciu użytkownika, komputer w pełni zadowoli się samym jądrem i użytkownika do szczęścia nie potrzebuje).&lt;/p&gt;

&lt;h4&gt;SysVinit&lt;/h4&gt;

&lt;p&gt;Dawno, dawno temu, gdy SCO nie straszyło świata patentami, a głównym zajęciem AT&amp;amp;T nie było sprzedawanie iPhonów stadom amerykańskich nastoletek, ci ostatni, znani jako Laboratoria Bella, opracowywali standard systemu Unix. W owych mrocznych czasach, poprzedzających erę komputera łupanego (gdy komputer zajmuje sporą część budynku, nikomu nie przychodzi do głowy naprawianie go poprzez walenie pięścią w monitor), pojawiła się koncepcja głównego nadzorcy. Sposób jego działania pozostał przez lata właściwie niezmieniony, różniąc się tylko nieco implementacją pomiędzy architekturami i pokoleniami uniksowej rodziny.&lt;/p&gt;

&lt;p&gt;Do dziś za wzorcową implementację uznaje się ponad dwudziestoletnią skamielinę, pochodzącą ze standardu System V (właścicielom cyfowych zegarków spieszę wyjaśnić, że tak wygląda rzymska piątka). Obsługuje start usług i przypisywanie ich do różnych profili (System V posiada system siedmiu profili nazywanych poziomami i numerowanych od 0 do 6), potrafi dodatkowo wskrzeszać swoje dzieci, jeśli taka jest wola administratora.&lt;/p&gt;

&lt;p&gt;Dlaczego zatem usługi uruchamiane są poza nadzorem systemu? Problemem jest ich elastyczna konfiguracja, możliwość zatrzymywania i uruchamiania w dowolnym momencie, a także fakt, że w przypadku problemów &lt;code&gt;init&lt;/code&gt; z System V zupełnie nie interesuje się przyczyną nagłego zgonu.&lt;/p&gt;

&lt;h4&gt;W pozostałych rolach&lt;/h4&gt;

&lt;p&gt;Konkurencja nie spała. Pomijam systemy oparte o szkielet BSD, który jako model systemu powstał jeszcze przed System V, więc informacja o używaniu innego nadzorcy nie powinna cię zdziwić.&lt;/p&gt;

&lt;p&gt;Najszerzej kojarzoną jest z pewnością implementacja &lt;code&gt;daemontools&lt;/code&gt;. Jedni twierdzą, że to ze względu na kontrowersyjną postać autora, inni, że jest to wynik radykalnego podejścia do procesu nadzorcy. Rewolucyjnych zmian nie ma tam co szukać, podstawową różnicą jest większa konfigurowalność nadzorowanych usług i rezygnacja z profili uruchomieniowych. O sukcesie podejścia wystarczy powiedzieć tyle, że w 90% przypadków &lt;code&gt;daemontools&lt;/code&gt; uruchamiane jest przez&amp;hellip; &lt;code&gt;SysVinit&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Nieco inne podejście zastosowali autorzy &lt;code&gt;initng&lt;/code&gt;, rozwijanego przez deweloperów Gentoo. Do tradycyjnego nadzorcy dodano możliwość równoległego uruchamiania wielu usług i wprowadzono prosty system zależności. Zaowocowało to skróceniem czasu startu systemu &amp;mdash; usługi nie musiały stać gęsiego w kolejce i uruchamiane były, gdy tylko zaspokojone zostały ich podstawowe wymagania (zaznaczyć wypada, że większość usług zadowala się działającą siecią bądź samym faktem włączenia komputera, tylko nieliczni domagają się prywatnego apartamentu z widokiem na morze).&lt;/p&gt;

&lt;p&gt;Apple z kolei stworzyło &lt;code&gt;launchd&lt;/code&gt;, który jest hybrydą pomiędzy tradycyjnym procesem &lt;code&gt;init&lt;/code&gt;, dæmonem &lt;code&gt;inetd&lt;/code&gt; i usługą &lt;code&gt;cron&lt;/code&gt;. Podstawowym udogodnieniem dla użytkowników była tu wprowadzona możliwość uruchamiania usług &lt;q&gt;na żądanie,&lt;/q&gt; rozszerzona później przez grupę freedesktop.org i zintegrowana z zarządcą magistrali DBus.&lt;/p&gt;

&lt;h4&gt;upstart already!&lt;/h4&gt;

&lt;p&gt;Mamy wreszcie projekt &lt;code&gt;upstart&lt;/code&gt;, o którym krótko opowiem. &lt;q&gt;Myślałem, że nigdy do tego nie dojdziesz&lt;/q&gt; &amp;mdash; wzdychasz pod nosem, sprawdzając, czy mikrofon laptopa na pewno jest wyłączony. Pamiętaj jednak, że dla niektórych Linux to żółty pasek postępu z napisem &lt;q&gt;Loading Ubuntu&lt;/q&gt; i każda okazja do postraszenia ich bebechami systemu jest dobra.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;upstart&lt;/code&gt; łączy zalety większości wspomnianych wyżej implementacji. Potrafi emulować zachowanie System V, uruchamiać usługi równolegle, wspiera zależności, a autorzy obiecują, że niedługo może też zastąpić dæmona &lt;code&gt;inetd&lt;/code&gt;. Przejście na niego jest bezproblemowe, bo usługi ze starego do nowego formatu przenosić można stopniowo, z każdym krokiem zyskując pełen nadzór nad ich działaniem, automatyczny restart w przypadku awarii i powiadamianie administratora o występujących problemach.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;upstart&lt;/code&gt; dodaje też unikalny system reakcji na zdarzenia, nowe procesy mogą więc zostać uruchomione lub zakończone w odpowiedzi na zmiany zachodzące w działającym systemie. Chcesz, aby system obsługi wydruku działał tylko, jeśli do komputera podłączona jest drukarka? Nie ma problemu. Zatrzymać mniej krytyczne usługi, gdy serwer korzysta z zasilania awaryjnego? Proszę bardzo. Wszystko w automatycznie i z pełnym wglądem w listę tego, co aktualnie działa, co nie działa i dlaczego.&lt;/p&gt;

&lt;p&gt;Oczywiście, nie piszę tego wszystkiego bez przyczyny. Wczoraj &lt;code&gt;upstart&lt;/code&gt; pojawił się w &lt;a href=&quot;http://pld-linux.org/&quot;&gt;PLD&lt;/a&gt; i skutecznie zastąpił swego pradziadka na wszystkich moich komputerach. Daj mu szansę i zainstaluj pakiet &lt;code&gt;upstart-SysVinit&lt;/code&gt;, a jeśli ktoś spyta cię, jaki jest cel projektu, odpowiesz spokojnie:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;Attempting to kill init&lt;/pre&gt;&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>YellowGreen poprawione</title>
   <link href="http://room-303.com/blog/2008/03/18/yellowgreen-poprawione/"/>
   <updated>2008-03-18T14:31:16+00:00</updated>
   <id>http://room-303.com/blog/2008/03/18/yellowgreen-poprawione</id>
   <content type="html">&lt;p&gt;Narzekanie to moja specjalność, ale żeby pozostać sprawiedliwym, muszę wspomnieć, że &lt;a href=&quot;http://room-303.com/blog/2008/03/13/falstartup-yellowgreen/&quot;&gt;usterkę, którą zgłosiłem wcześniej&lt;/a&gt;, usunięto błyskawicznie. Tak, zgłosiłem swojego bloga ponownie i tak, został przyjęty, ale nie &amp;mdash; nie piszę tej notki w związku z jakimś wewnętrznym regulaminem, który nakazywałby słodzenie w całej Sieci.&lt;/p&gt;

&lt;p&gt;Piszę dlatego, że sieci reklamowych ci u nas dostatek &amp;mdash; są i takie, które celują wyłącznie w blogi &amp;mdash; ale żadna nie potrafi się przebić. Przed &lt;a href=&quot;http://yellowgreen.pl/&quot;&gt;YellowGreen&lt;/a&gt; mieliśmy oczywiście &lt;a href=&quot;http://krytycy.pl/&quot;&gt;Krytyków&lt;/a&gt; ze sponsorowanymi recenzjami produktów. Bardzo spodobał mi się ich regulamin, ale ten blog niespecjalnie może aspirować do szeroko pojętego recenzowania. Z jednej strony ciężko mi sobie wyobrazić siebie z kartonem próbek perfum czy setką loginów do webappsów dla garncarzy (łeb-dwa-zera nadciąga); z drugiej strony, kto wie, może któregoś dnia Apple poprosi o ocenę współpracy nowej generacji iPhonów z systemami linuksowymi (hint: nie współpracują prawie wcale)?&lt;/p&gt;

&lt;p&gt;Żarty na bok. Jak wspomniałem, agencji reklamowych jest wiele, ale konkurencja raczej znikoma. Zdaje się, że briefingi większości podobnych projektów zaczynają się od słów &lt;q&gt;&lt;em&gt;to przecież blogosfera, sami do nas przyjdą, a potem coś wymyślimy&lt;/em&gt;.&lt;/q&gt; Owo &lt;q&gt;potem&lt;/q&gt; nigdy nie następuje i okazuje się, że nie wystarczy znaleźć strategicznego klienta na toplayery, żeby wzbogacić się na blogach. Nie wystarczy też zgarnąć pół platformy blogowej, by zarobić cokolwiek.&lt;/p&gt;

&lt;p&gt;Chciałbym, żeby YellowGreen było inne. By razem z Krytykami pokazali reszcie marketoidów, że blogi to wdzięczne miejsce na reklamę, jeśli podejść do niej z głową. Bo reklama to nie tylko krzykliwe drapacze sidebarów i gadające atrapy niusów. Ważniejsze od irytowania internautów jest zwiększanie świadomości marki, informowanie o mniej oczywistych zaletach, czy pomoc w dobraniu właściwego rozwiązania do konkretnej sytuacji. Zarówno specjaliści w konkretnych dziedzinach, jak i szarzy konsumenci, postrzegani są jako dalece bardziej obiektywne źródło opinii niż najlepsze slogany na billboardach.&lt;/p&gt;

&lt;p&gt;Ważna jest forma. &lt;q&gt;Lepszy niż wiodący zwykły proszek&lt;/q&gt; mamy już w telewizji, ale tam specyfika mediów zmusza nas do oglądania nawet najgłupszych haseł, jeśli wypadną w połowie ulubionego filmu (dlatego wypadają średnio co 5 minut ulubionego filmu). W internecie pozbyć się reklamy jest banalnie prosto, dlatego próby przenoszenia środków stosowanych w tradycyjnej prasie i telewizji przyczyniają się tylko do popularyzacji adblokerów.&lt;/p&gt;

&lt;p&gt;Problemem jest tylko uświadomić reklamodawcom różnicę w nakładzie pracy pomiędzy czytaniem gazety z nożyczkami w ręku a kliknięciem przycisku &lt;q&gt;blokuj&lt;/q&gt; w przypadku reklamy w internecie. Z tym, że ów przycisk jest dużo skuteczniejszy od nożyczek, bo na ogół owocuje całkowitą eliminacją wszystkich reklam danej agencji.&lt;/p&gt;

&lt;p&gt;Mam nadzieję, że &lt;abbr title=&quot;YellowGreen&quot;&gt;YG&lt;/abbr&gt; nie pójdzie w ślady swych poprzedników i że już niedługo Polska będzie miała swój odpowiednik &lt;a href=&quot;http://www.projectwonderful.com/&quot;&gt;Project Wonderful&lt;/a&gt; czy &lt;a href=&quot;http://coudal.com/deck/&quot;&gt;The Deck&lt;/a&gt;. Cóż, powodzenia.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Falstartup: YellowGreen</title>
   <link href="http://room-303.com/blog/2008/03/13/falstartup-yellowgreen/"/>
   <updated>2008-03-13T17:49:23+00:00</updated>
   <id>http://room-303.com/blog/2008/03/13/falstartup-yellowgreen</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://yashke.com/2008/03/13/yellowgreenpl-blogosfera-ukochana/&quot;&gt;Yashke opisali nowy serwis&lt;/a&gt;, tytułowy &lt;a href=&quot;http://www.yellowgreen.pl/&quot;&gt;YellowGreen&lt;/a&gt;. Jest to platforma do sprzedaży przestrzeni reklamowej na blogach. Nic nowego, ale w polskim wydaniu. Chciałem sprawdzić, jak to działa. Bardzo chciałem, ale na chceniu się skończyło.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/2331628524/&quot; title=&quot;YellowGreen by patrys, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3046/2331628524_bf16177272.jpg&quot; width=&quot;500&quot; height=&quot;381&quot; alt=&quot;YellowGreen&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Parafrazując starego Windowsa, &lt;q&gt;ten blog nie jest już być prawidłowy.&lt;/q&gt; Cóż, nieprawidłowy adres bloga tłumaczy, czemu mam tak niską oglądalność &lt;em&gt;w statystykach, których nie prowadzę&lt;/em&gt;. W związku z tym, nawet, gdyby mój adres był prawidłowy, to i tak nie jestem w stanie wypełnić formularza zgłoszeniowego.&lt;/p&gt;

&lt;p&gt;Pozostaje czekać, aż budowaniem serwisów zajmą się ludzie, którzy choć blade pojęcie o technologii mają. Albo zgłosić się do starego, dobrego &lt;a href=&quot;http://www.projectwonderful.com/&quot;&gt;Project Wonderful&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>GNOME 2.22</title>
   <link href="http://room-303.com/blog/2008/03/13/gnome-222/"/>
   <updated>2008-03-13T00:19:14+00:00</updated>
   <id>http://room-303.com/blog/2008/03/13/gnome-222</id>
   <content type="html">&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/2329381845/&quot; title=&quot;GNOME 2.22 by patrys, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3061/2329381845_422e3a7b71.jpg&quot; width=&quot;500&quot; height=&quot;313&quot; alt=&quot;GNOME 2.22&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dzisiaj (a właściwie to już wczoraj) oficjalnie został wydany &lt;a href=&quot;http://www.gnome.org/&quot;&gt;GNOME 2.22&lt;/a&gt;. Dostępny we wszystkich dobrych dystrybucjach, więc także w &lt;a href=&quot;http://pld-linux.org/&quot;&gt;PLD&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>IE8 jednak nie zepsuje sieci</title>
   <link href="http://room-303.com/blog/2008/03/04/ie8-jednak-nie-zepsuje-sieci/"/>
   <updated>2008-03-04T09:49:45+00:00</updated>
   <id>http://room-303.com/blog/2008/03/04/ie8-jednak-nie-zepsuje-sieci</id>
   <content type="html">&lt;p&gt;Z &lt;a href=&quot;http://blogs.msdn.com/ie/archive/2008/03/03/microsoft-s-interoperability-principles-and-ie8.aspx&quot;&gt;ostatniej notki na IEBlogu&lt;/a&gt; wynika, że &lt;abbr title=&quot;Internet Explorer&quot;&gt;IE&lt;/abbr&gt;8 domyślnie będzie wspierał tryb zgodny ze standardami:&lt;/p&gt;

&lt;blockquote&gt;We’ve decided that &lt;abbr&gt;IE&lt;/abbr&gt;8 will, by default, interpret web content in the most standards compliant way it can. This decision is a change from what we’ve posted previously.&lt;/blockquote&gt;

&lt;p&gt;Wcześniejsze zapowiedzi sugerowały konieczność umieszczenia w kodzie specjalnego znacznika, który potwierdzałby, że autor faktycznie życzy sobie taki sposób interpretacji dokumentu. Dlaczego? Przez wersję siódmą przeglądarki, której wydanie okazało się sporym ciosem dla firmy z Redmond. Wiele serwisów (w tym prowadzone przez partnerów Microsoftu) przygotowanych było tylko i wyłącznie dla &lt;q&gt;quirks mode&lt;/q&gt; wersji szóstej, tymczasem wersja siódma nauczyła się poprawnie składać dokumenty, co zaowocowało rychłym &lt;q&gt;zepsuciem&lt;/q&gt; wadliwych stron.&lt;/p&gt;

&lt;p&gt;Microsoft &amp;mdash; w obawie przed kolejnymi próbami linczu &amp;mdash; postanowił dodać do przyszłych wersji przeglądarek funkcję &lt;q&gt;zamrażania&lt;/q&gt; zachowania przeglądarki na poziomie konkretnej wersji, a domyślnym poziomem zgodności dla wszystkich przyszłych wydań miał być właśnie &lt;abbr&gt;IE&lt;/abbr&gt;7. Oznaczało to dokładnie tyle, że &lt;abbr&gt;IE&lt;/abbr&gt;8 zachowywałby się dokładnie jak &lt;abbr&gt;IE&lt;/abbr&gt;7 dopóty, dopóki autor strony wyraźnie nie zaznaczył, że życzy sobie wykorzystać możliwości i poprawki wprowadzone w wersji ósmej.&lt;/p&gt;

&lt;p&gt;Na szczęście (po wielkiej burzy, jaka wybuchła pomiędzy autorytetami w dziedzinie standardów) zespół zdecydował się nie psuć Sieci i odwrócić działanie mechanizmu. Jak czytamy na blogu przeglądarki, to autorzy wadliwych serwisów zyskają możliwość zaznaczenia &lt;q&gt;przetwarzaj ten dokument tak, jakbyś był wersją X.&lt;/q&gt; W efekcie modyfikacji będą musiały ulec tylko te serwisy, których treść i tak może nie być dostępna dla użytkowników innych agentów (przeglądarek biurkowych i urządzeń do przeglądania służących). Mówiąc krótko &amp;mdash; Microsoft sprząta po sobie swoje śmieci i aktywnie wspiera standardy tam, gdzie jest to możliwe.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Prywatnie: 10 typ</title>
   <link href="http://room-303.com/blog/2008/03/03/prywatnie-10-typ/"/>
   <updated>2008-03-03T16:00:06+00:00</updated>
   <id>http://room-303.com/blog/2008/03/03/prywatnie-10-typ</id>
   <content type="html">&lt;p&gt;Blog wraca do życia, więc warto wspomnieć, że 16. lutego miała miejsce kolejna przeprowadzka. Maleńkie mieszkanko na Jedności Narodowej okazało się zbyt ciasne dla czterech osób, więc nie pozostało nam nic innego, niż się przenieść. Nbw ze swoją kobietą zamieszkali w okolicach Parku Handlowego Fekalia, a ja&amp;hellip;&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/2307104685/&quot; title=&quot;Berecik by patrys, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3277/2307104685_4fd757c3b6.jpg&quot; width=&quot;375&quot; height=&quot;500&quot; alt=&quot;Berecik&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;hellip;a raczej my (bo jest nas troje) okupujemy tereny przyległe do nieistniejącego już dziś Poltegoru. Cóż, 73 metry, spokojna okolica. Do kompletu ze mną Asia &amp;mdash; moja osobista kobieta-prawnik (która od pół roku nie może nic na bloga napisać) i qwiat &amp;mdash; mroczny &lt;abbr title=&quot;Bastard Operator From Hell&quot;&gt;BOFH&lt;/abbr&gt; &lt;a href=&quot;http://icenter.pl/&quot;&gt;iCenter&lt;/a&gt;. I telewizor, konsole i kawałek internetu, a nawet jakieś żywe kwiatki (tym razem nie słynne wiszące ogrody na kartonie po pizzy). Radzimy sobie jakoś i nudno też nie jest, bo czasem odwiedzają nas znajomi:&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/2307107011/&quot; title=&quot;Gwiazdy na lodzie by patrys, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3004/2307107011_afe55c01b5.jpg&quot; width=&quot;500&quot; height=&quot;375&quot; alt=&quot;Gwiazdy na lodzie&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Niestety, to jedyne zdjęcie znajomych, jakie nadaje się do publikacji, bo kto by chciał oglądać łysiejących gości pod trzydziestkę, którzy przez kilka godzin nie wypuszczają pada z ręki?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; chciałbym zaznaczyć, że jeśli w ciągu najbliższych dni zginę z rąk Aśki, to z całą pewnością spowodowane będzie to moją całkowitą impotencją i chronicznym zaleganiem do wczesnych godzin rannych przed laptopem, a nie złośliwościami zawartymi w powyższej notce. W końcu prawnicy znani są ze swojego poczucia humoru, prawda? ;)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Złota kreska</title>
   <link href="http://room-303.com/blog/2008/03/03/zlota-kreska/"/>
   <updated>2008-03-03T12:59:57+00:00</updated>
   <id>http://room-303.com/blog/2008/03/03/zlota-kreska</id>
   <content type="html">&lt;p&gt;Przepraszam wszystkich, którym &lt;a href=&quot;http://goldenline.pl/&quot;&gt;GoldenLine&lt;/a&gt; wysłało dzisiaj/wczoraj tonę spamu, podpisując się jako ja. Od ponad roku &lt;em&gt;nie zapraszałem&lt;/em&gt; ani &lt;em&gt;nie próbowałem zapraszać&lt;/em&gt; tam nikogo z moich znajomych. Nie pozwoliłem też serwisowi zaimportować żadnej książki adresowej, nie dałem dostępu do GMaila, LinkedIna i ogólnie nikt nie wmówi mi, że w jakikolwiek aktywny sposób przyczyniłem się do zajścia. Podjąłem jednak podstawowe środki prewencji w celu uniknięcia podobnych sytuacji w przyszłości. &lt;em&gt;Usunąłem mianowicie konto&lt;/em&gt; z owej krzyżówki Grona i LinkedIn, co i wam polecam zrobić. Zupełnie nie mam pojęcia, do czego mógłby mi się ten serwis przydać.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Chyrp!</title>
   <link href="http://room-303.com/blog/2008/03/02/chyrp/"/>
   <updated>2008-03-02T17:04:08+00:00</updated>
   <id>http://room-303.com/blog/2008/03/02/chyrp</id>
   <content type="html">&lt;p&gt;Tak się złożyło, że &lt;a href=&quot;http://chyrp.net/blog/taking-flight&quot;&gt;od wczoraj&lt;/a&gt; jestem oficjalnym maintainerem &lt;a href=&quot;http://chyrp.net/&quot;&gt;Chyrpa&lt;/a&gt;. Jego implementacji w &lt;abbr title=&quot;PHP Hypertext Preprocessor&quot;&gt;PHP&lt;/abbr&gt; dla ścisłości.&lt;/p&gt;

&lt;p&gt;Chyrp to lekki silnik, który pozwala wygodnie prowadzić własnego (mikro-/foto-) bloga. Wszystko zaczęło się od tego, że pewien szesnastolatek (tak, szesnastolatek), Alex Suracil, postanowił zrobić WordPressowi konkurencję. Wokół projektu zrobił się mały szum i powstało community. Zaczęły pojawiać się piórka i moduły (odpowiedniki wtyczek), tłumaczenia, skórki, a z czasem pojawiło się pytanie o implementacje dla innych platform.&lt;/p&gt;

&lt;p&gt;Ja przejąłem oryginalną implementację w &lt;abbr&gt;PHP&lt;/abbr&gt;, Alex zaczął prace nad wersją w Rubym, a mitsuhiko pracuje nad projektem &lt;code&gt;twig&lt;/code&gt; &amp;mdash; implementacją silnika szablonów &lt;a href=&quot;http://jinja.pocoo.org/&quot;&gt;Jinja&lt;/a&gt; w &lt;abbr&gt;PHP&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;Jeśli szukacie czegoś wygodniejszego i lżejszego niż WordPress, to być może właśnie znaleźliście. Oczywiście projekt jest otwarty i z chęcią przyjmiemy kolejnych ochotników. Miłej zabawy!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Kilka słów o serwisie 10przykazań</title>
   <link href="http://room-303.com/blog/2008/02/29/kilka-slow-o-serwisie-10przykazan/"/>
   <updated>2008-02-29T15:23:56+00:00</updated>
   <id>http://room-303.com/blog/2008/02/29/kilka-slow-o-serwisie-10przykazan</id>
   <content type="html">&lt;p&gt;Sporo osób zauważyło nową wersję &lt;a href=&quot;http://10przykazan.com/&quot;&gt;10przykazań&lt;/a&gt;. To dobrze. Dziwi mnie nieco tylko, że większość z nich obawia się o starcie naszego małego serwisiku z konkurencją w postaci &lt;a href=&quot;http://blogfrog.pl/&quot;&gt;Blogfroga&lt;/a&gt; i &lt;a href=&quot;http://www.blogbox.com.pl/&quot;&gt;Blogboksa&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Naszym celem (a przynajmniej moim) nie jest konkurowanie z kimkolwiek w kategoriach ogólnie pojętej &lt;q&gt;lepszości,&lt;/q&gt; 10przykazań powstało z potrzeby rozwiązania konkretnego problemu. W polskiej części Sieci nie było wygodnego narzędzia, które pozwoliłoby śledzić naprawdę dobre blogi. Nie założyliśmy serwisu dla oklasków (z ukłonami w stronę siwych dyrygentów), nie pchamy się do wywiadów i nie szukaliśmy nigdy strategicznych sponsorów. Nie chcę tu sugerować, że nasza &lt;q&gt;konkurencja&lt;/q&gt; (dlaczego w cudzysłowie wyjaśnię za chwilę) powstała z pobudek czysto komercyjnych, ale chciałbym, żeby wszyscy zrozumieli, że 10przykazań to nie jest nasza praca.&lt;/p&gt;

&lt;p&gt;10przykazań to hobby, które rozwijam w wolnym czasie i które uruchomiliśmy ponownie dlatego, że jest nam potrzebne, a nie dlatego, że ktoś nam za to płaci. Dlatego właśnie prosiłbym o powstrzymanie się od komentarzy z rodzaju &lt;q&gt;10p ssie, bo mogło być zrobione lepiej.&lt;/q&gt; Pewnie, że mogło, ale ktoś musi na to poświęcić swój czas, poszarpać przy problemach technicznych swoje własne nerwy i starać się wykrzesać z siebie odrobinę talentu &lt;em&gt;prywatnie, po godzinach pracy&lt;/em&gt;. Jasne, że sam fakt działania serwisu daje masę satysfakcji, ale wszyscy jesteśmy ludźmi, bywamy zmęczeni i mamy swoje życia prywatne (alkohol, kobiety, autobusy, te sprawy).&lt;/p&gt;

&lt;p&gt;Jeśli więc uważasz, że można coś poprawić, pomóż nam i naszym użytkownikom. Opisz swój problem, zaproponuj rozwiązanie, przyłącz się, czy zbuduj konkurencyjny serwis. Tak, zbuduj konkurencyjny serwis, nie boimy się konkurencji, bo nasze życie nie zależy od tego, czy 10przykazań zdobędzie milion użytkowników w ciągu pierwszego kwartału rozliczeniowego. Serwis będzie istniał przynajmniej tak długo, jak długo będzie potrzebny trzem użytkownikom &amp;mdash; jego autorom. Jeśli twój projekt okaże się lepszy, możesz liczyć na to, że przesiądziemy się jako pierwsi. &lt;em&gt;To innowacja i konkurencja budują Sieć, a nie venture capitals.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Przy okazji pomocy muszę wspomnieć, że 10przykazań to nie tylko ja, &lt;a href=&quot;http://enbewu.net/blog/&quot;&gt;nbw&lt;/a&gt; i &lt;a href=&quot;http://monochrome.pl/blog/&quot;&gt;jarv&lt;/a&gt;. Szczególne podziękowania należą się z pewnością &lt;a href=&quot;http://blog.jiobel.com/&quot;&gt;jioblowi&lt;/a&gt; za to, że 10p ma logo i mojemu pracodawcy, &lt;a href=&quot;http://itsltd.eu/&quot;&gt;ITS Ltd.&lt;/a&gt;, za to, że utrzymuje serwis we własnej infrastrukturze i pozwala nam na rozwój tego i podobnych projektów w ramach wolnych cykli pracy.&lt;/p&gt;

&lt;p&gt;Wracając jednak do &lt;q&gt;konkurencji,&lt;/q&gt; porównania są nieszczególnie trafne. Blogfrogowi zawsze bliżej było do Technorati, niż do 10przykazań. Serwis ten zbiera absolutnie wszystko, co tylko przewinie się przez agregator. Z kolei Blogbox zdaje się oferować niewiele więcej niż &lt;a href=&quot;http://www.google.com/reader/&quot;&gt;Czytnik Google&lt;/a&gt; czy &lt;a href=&quot;http://www.netvibes.com/&quot;&gt;Netvibes&lt;/a&gt; &amp;mdash; ot, załóż konto i stwórz swoją &lt;a href=&quot;http://www.planetplanet.org/&quot;&gt;Planetę&lt;/a&gt;. 10przykazań od początku miało być łatwą metodą na śledzenie &lt;em&gt;blogów, które warto czytać&lt;/em&gt;, jakkolwiek subiektywnym nie wydawałoby się to określenie. Chcemy promować &lt;em&gt;blogi, ich autorów i treść&lt;/em&gt;, a nie naszych sponsorów i reklamodawców.&lt;/p&gt;

&lt;p&gt;Dlatego właśnie nie publikujemy pełnych treści notek, dlatego właśnie nie otwieramy blogów w pływających ramkach, dlatego właśnie nie wymuszamy czytania notek w nowych oknach. Dlatego w końcu nie pozwalamy komentować notek &amp;mdash; nie jesteśmy wykopem i komentarze mają swoje miejsce na blogu autora, pod oryginalnym postem.&lt;/p&gt;

&lt;p&gt;Oferujemy za to możliwość tworzenia własnych kanałów z aktualnościami, powiadomienia o notkach za pomocą sieci komunikacyjnej Jabber i przegląd aktualności dla użytkowników &lt;a href=&quot;http://blip.pl/&quot;&gt;Blipa&lt;/a&gt;, a autorom treści dajemy wsparcie dla XML-RPC, dzięki czemu publikowana treść może docierać do czytelników na bieżąco. W planach mamy dalszą rozbudowę serwisu, pojawi się między innymi możliwość zarządzania własnymi blogami (i niezbędna w związku z tym funkcja &lt;q&gt;przejmij bloga&lt;/q&gt;), dostęp do kolejki zgłoszonych blogów i głosowanie na najbardziej wartościowe pozycje (dla właścicieli blogów już agregowanych). Bardzo prawdopodobne jest, że powyższą listę uwieńczy udostępnienie pełnego, otwartego kod źródłowego serwisu (niech to będzie dowodem, że konkurencja jest dobra).&lt;/p&gt;

&lt;p&gt;Tymczasem zapraszam do zabawy nową wersją 10przykazań, zgłaszania nam błędów i niedociągnięć, dodawania nowych blogów do kolejki, a przede wszystkim życzę dużo ciekawej treści do czytania :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Jak nie należy programować</title>
   <link href="http://room-303.com/blog/2008/02/14/jak-nie-nalezy-programowac/"/>
   <updated>2008-02-14T16:22:50+00:00</updated>
   <id>http://room-303.com/blog/2008/02/14/jak-nie-nalezy-programowac</id>
   <content type="html">&lt;p&gt;Tydzień z grubsza zajęło mi doprowadzenie do używalności kodu, który otrzymałem w spadku po pewnym urlopowiczu. Dobrze, że nie mam włosów, bo z pewnością bym je dawno wyrwał, choć z &amp;mdash; drugiej strony &amp;mdash; na programowaniu cierpi moja broda. Kolega wypoczywa w Iranie, a my próbujemy dojść, co też podmiot liryczny miał na myśli. Kiedy czytanie źródeł dłuży się ponad lekturę &lt;q&gt;Nad Niemnem,&lt;/q&gt; znak to, że czas na notkę.&lt;/p&gt;

&lt;h4&gt;Jak nie należy programować&lt;/h4&gt;

&lt;p&gt;Na wstępie już zaznaczę, że w &lt;a href=&quot;http://itsltd.eu/&quot;&gt;ITS Ltd.&lt;/a&gt; zajmujemy się budowaniem aplikacji webowych w oparciu o Pythona i Django, więc niektórym poniższy tekst może wydać się płytki/nudny/pozbawiony sensu (niepotrzebne skreślić).&lt;/p&gt;

&lt;p&gt;Poradnik niniejszy zalecany jest dla programistów, którzy w różny sposób związani są z serwisem &lt;a href=&quot;http://thedailywtf.com/&quot;&gt;The Daily &lt;abbr title=&quot;What The Fuck&quot;&gt;WTF&lt;/abbr&gt;&lt;/a&gt; &amp;mdash; czy to przez umiłowanie do czytania publikowanych tam historii, czy to przez bycie bohaterem tych ostatnich. Redakcja zastrzega sobie prawo do skrótów myślowych i przelotnego braku poczucia humoru.&lt;/p&gt;

&lt;h4&gt;Redundancja&lt;/h4&gt;

&lt;p&gt;Najważniejszą cechą systemów klasy Enterprise (jeden do teleportacji) jest ich wysoka dostępność (i cena). Jest to fakt tak niezaprzeczalny, jak niezaprzeczalna jest wysoka jakość produktów z rodziny Gadu-Gadu. Autorzy aplikacji klasy E (uniwersalny, automat i do tkanin czarnych) często uważają, że ich produkty z powodzeniem stawać mogą w konkury z aparaturą czasu rzeczywistego. Cóż, każdy może się mylić, ale jakież tajemne receptury zapewniają taką pewność siebie? Dziś Viagrę nabyć można na każdym bazarze, skupmy się więc na technikach programowania.&lt;/p&gt;

&lt;p&gt;Autor aplikacji staje wielokrotnie przed trudnymi pytaniami egzystencjalnymi. &lt;q&gt;Gdzie jest specyfikacja techniczna?&lt;/q&gt; &lt;q&gt;Jak ja wczoraj wróciłem do domu?&lt;/q&gt; &lt;q&gt;Skąd weźmiemy tyle galaretki, żeby napełnić basen?&lt;/q&gt; To tylko niektóre z nich. Najważniejsze pytanie, jakie zadają sobie autorzy aplikacji klasy E (E303, E301, może zawierać śladowe ilości orzechów), to &lt;em&gt;jak uniknąć używania bibliotek, których sami nie napisaliśmy, wszak któregoś ranka gotowe przestać działać.&lt;/em&gt; Na szczęście tutaj z pomocą przychodzi dogmat Copiego-Paste'a. Wystarczy zatem skopiować kluczowe elementy frameworku do używającej go aplikacji i już możemy spać spokojnie &amp;mdash; co dwie kopie to nie jedna, prawdopodobieństwo mówi, że obie nie popsują się jednocześnie.&lt;/p&gt;

&lt;h4&gt;Optymalizacja czasu pracy&lt;/h4&gt;

&lt;p&gt;Jeśli brać z kogoś przykłady (a klasa E czyni to niechętnie, sami wszakże stanowią elitę), to tylko z amerykańskiej marynarki. Tradycyjne pojęcia deadline'ów i zarządzania zasobami zastąpić można sprawdzonym na wielu wojnach &lt;em&gt;ŻULU time&lt;/em&gt;. W firmie najważniejsi są ludzie, więc zawsze jest czas się napić! Pozwala to płynnie regulować stres powodowany przez pracę, a naukowcy dowodzą, że może w zupełności wyeliminować ryzyko wystąpienia nerwicy (stosujący tę metodykę rzadko dożywają czterdziestki).&lt;/p&gt;

&lt;p&gt;Ważne jest również, by programista miał podejście analitycznie i potrafił myśleć &lt;em&gt;outside the box&lt;/em&gt;, co w języku polskim oznacza dosłownie &lt;em&gt;myśl, jak ciągle być poza kubikiem&lt;/em&gt;. W praktyce sprawdza się najlepiej obranie niekonwencjonalnych godzin pracy (na przykład godzin nocnych) i planowanie przestrzenne (&lt;em&gt;koduję od tego kieliszka do podłogi&lt;/em&gt;).&lt;/p&gt;

&lt;h4&gt;Generalizacja&lt;/h4&gt;

&lt;p&gt;Generalizacja to dar patrzenia na rzeczy z dystansu. Dla przykładu pies i samochód z dystansu wyglądają podobnie. Dlaczego więc nie umieścić ich w bazie danych we wspólnej tabeli &lt;code&gt;rzecz&lt;/code&gt;, odpowiednio pomijając kolumnę &lt;code&gt;rasa&lt;/code&gt; w przypadku samochodu i podając zero w kolumnie &lt;code&gt;liczba_drzwi&lt;/code&gt; w przypadku psa? Tak zbudowana baza danych jest dużo prostsza do programowania, zwłaszcza jeśli w użyciu jest szkielet &lt;abbr title=&quot;Object-Relational Mapper&quot;&gt;ORM&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;Dodatkowe punkty komisja przyzna za uproszczenie tabeli do jednego pola, w którym umieścić można zserializowany obiekt dowolnego typu.&lt;/p&gt;

&lt;h4&gt;Obfuskacja&lt;/h4&gt;

&lt;p&gt;Duży projekt klasy E często jest oczkiem w głowie korporacji. Nie można zatem dopuścić, by sekrety jego działania poznał niepowołany śmiertelnik. Lata doświadczenia w dziedzinie refaktoryzacji uczą, że najpewniejszym środkiem zapobiegawczym jest obszerne stosowanie obfuskacji. Stosowanie jednoliterowych nazw zmiennych i funkcji nie tylko uniemożliwia zrozumienie geniuszu kryjącego się za kodem, ale także znacznie zmniejsza miejsce, jakie kod zajmuje na dysku. Jest to zaleta nie do pominięcia w przypadku projektów, które korzystają dodatkowo z technik programowania życzeniowego (ale o tym za chwilę).&lt;/p&gt;

&lt;p&gt;Niezwykle ważne jest też konsekwentne nieumieszczanie komentarzy w kodzie. Łatwo policzyć, że przeciętna metoda o długości dziesięciu ekranów, stałaby się nieznośnie długa, gdyby co drugi wiersz wstawić komentarz i przeprosiny dla naszego zastępcy.&lt;/p&gt;

&lt;h4&gt;Zaawansowane techniki zabezpieczania kodu&lt;/h4&gt;

&lt;p&gt;Kolejną techniką obfuskacji jest, pochodzący z literatury, synkretyzm językowy. Dla zmylenia potencjalnego przeciwnika i lepszego utrwalenia w pamięci dawno nieużywanych technik, staramy się co jakiś czas wtrącić ekran kodu napisanego na przykład w &lt;abbr title=&quot;PHP Hypertext Preprocessor&quot;&gt;PHP&lt;/abbr&gt;. W tym celu ograniczamy się do części wspólnej składni obu języków, dodatkowo emulując zachowanie zupełnie innego frameworku.&lt;/p&gt;

&lt;p&gt;Mało znaną, ale opanowaną do perfekcji przez elitę, metodą wprowadzania zakłóceń w kodzie jest tak zwane &lt;em&gt;prawo wolnego rynku&lt;/em&gt; (import bez ograniczeń). Główne zastosowanie tej metody to naprawianie wadliwych języków, których autorzy złośliwie wprowadzili przestrzenie nazw. Wystarczy jednak kilka instrukcji &lt;code&gt;from foo import *&lt;/code&gt; starannie porozrzucanych po kodzie (nie zapomnijmy części z nich umieścić w instrukcjach warunkowych) i jesteśmy z powrotem w starym, dobrym bashu. Przyjemny skutek uboczny to fakt, że nikt nigdy nie będzie w stanie odtworzyć zależności aplikacji poza naszym środowiskiem rozwojowym.&lt;/p&gt;

&lt;h4&gt;Programowanie życzeniowe i stubenci&lt;/h4&gt;

&lt;p&gt;Jedną z podstawowych prawd na temat programowania jest taka, że każdą aplikację trzeba utrzymywać, a rzadko która nie ewoluuje wraz z upływającym czasem. Pragmatyczny programista dba o to już od pierwszej linii kodu. Zanim jeszcze zajmie się implementacją wymaganej funkcjonalności, stara się przewidzieć możliwe przyszłe drogi rozwoju. Jeśli programista zna się na fachu, owocuje to umieszczeniem w kodzie rozlicznych z pozoru niepotrzebnych metod. Są one z natury zepsute bądź puste i nazywamy je &lt;em&gt;stubami&lt;/em&gt;, sam zaś autor nosi fachowe miano &lt;em&gt;stubenta&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Stubenci zapewniają aplikacji bezpieczny margines nadmiarowości, podobnej w naturze do redundancji, co z kolei zmniejsza ryzyko, że przyszły opiekun projektu w wyniku zmieszania niechcący usunie coś niezbędnego. Jedną z rzadziej spotykanych metryk jakości kodu klasy E jest właśnie procentowy udział kodu, który można usunąć bez wpływu na działanie aplikacji. Najlepsi w branży utrzymują się w przedziale od czterdziestu do sześćdziesięciu procent.&lt;/p&gt;

&lt;h4&gt;Testy jednostkowe i UMŁ&lt;/h4&gt;

&lt;p&gt;Jak sama nazwa wskazuje, są to testy, które przeprowadza się tylko raz. Dla pewności, że zbędne dane nie wpłyną na wynik ani czas trwania testu, najlepiej przeprowadzić go w środowisku rozwojowym, przy pustej bazie danych. Już samo słowo &lt;q&gt;wdrożenie&lt;/q&gt; sugeruje, że klient musi liczyć się z dodatkowymi kosztami w celu późniejszego doprowadzenia produktu do działania w środowisku produkcyjnym. Testy jednostkowe, z natury, mogą być ciężkie do powtórzenia nawet w warunkach laboratoryjnych, stąd nie należy mieć oporów przed skorzystaniem z wygodnego narzędzia, jakim jest UMŁ (&lt;q&gt;&lt;em&gt;u mnie łaziło&lt;/em&gt;&lt;/q&gt;).&lt;/p&gt;

&lt;p&gt;Cóż, na dziś to wszystko, do zobaczenia w kolejnym odcinku poradnika &lt;q&gt;Jak nie należy programować,&lt;/q&gt; gdzie wspólnie wzbogacimy wachlarz stosowanych praktyk. Czytał Lucjan Szołajski.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Rhythmbox i trzeszcząca muzyka</title>
   <link href="http://room-303.com/blog/2008/02/13/rhythmbox-i-trzeszczaca-muzyka/"/>
   <updated>2008-02-13T12:48:56+00:00</updated>
   <id>http://room-303.com/blog/2008/02/13/rhythmbox-i-trzeszczaca-muzyka</id>
   <content type="html">&lt;p&gt;W &lt;abbr title=&quot;PLD Linux Distribution&quot;&gt;PLD&lt;/abbr&gt; przez dłuższy czas ludzie skarżyli się na artefakty przy odtwarzaniu muzyki przez Rhythmboksa. Problem rozwiązany został dopiero wczoraj.&lt;/p&gt;

&lt;p&gt;Zacznę może od rozwiązania, trzeba &lt;strong&gt;zaktualizować pakiet &lt;code&gt;alsa-lib&lt;/code&gt; do wersji 1.0.16&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Jeśli kogoś ciekawi przyczyna problemu, to służę informacjami. Rhythmbox do odtwarzania dźwięku używa szkieletu GStreamer. GStreamer odpowiada za dekodowanie strumieni i nakładanie efektów, sam jednak do komunikacji z urządzeniem wyjściowym wykorzystuje jedną z bibliotek audio. Najczęściej używana jest w tym przypadku wspomniana ALSA.&lt;/p&gt;

&lt;p&gt;Na każdym styku elementów następuje negocjacja obsługiwanych formatów danych. Rhythmbox przed otwarciem pliku sprawdza, czy GStreamer potrafi go obsłużyć. Następnie tworzony jest &lt;q&gt;łańcuszek&lt;/q&gt; elementów GStreamera. Każde dwa elementy w kolejce ustalają między sobą preferowany format przekazywanych danych. Ostatnim elementem w łańcuchu odtwarzania jest &lt;q&gt;odpływ&lt;/q&gt; (&lt;em&gt;sink&lt;/em&gt;), przekazujący dane do biblioteki ALSA.&lt;/p&gt;

&lt;p&gt;Również tutaj odbywa się negocjacja i tu pojawia się problem trzeszczenia. GStreamer od niedawna oferuje wsparcie dla 32-bitowych próbek dźwięku. Zapewnia to większą precyzję przy przetwarzaniu, a w przypadku droższego sprzętu także wyższą jakość dźwięku kierowanego na głośniki. Oczywiście, większość z nas słucha muzyki w formatach kompresowanych i nie usłyszymy raczej różnicy, ale GStreamer robi WłaściwąRzecz&amp;trade;.&lt;/p&gt;

&lt;p&gt;Problemem jest jednak ALSA, która również od niedawna zmieniła sposób skalowania próbek w przypadku 16-bitowych kart muzycznych. Do niedawna operacja ta polegała na obcięciu 16 mniej znaczących bitów. Zastąpił go nieco bardziej skomplikowany wzór, który &amp;mdash; w przypadku dużej siły sygnału &amp;mdash; podatny był na przepełnienie arytmetyczne. Ten właśnie &lt;q&gt;drobny szczegół&lt;/q&gt; poprawiono w wersji 1.0.16.&lt;/p&gt;

&lt;p&gt;Miłego słuchania muzyki zatem, &lt;strong&gt;Rhythmbox jest niewinny&lt;/strong&gt; ;)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>WYSITDWTF</title>
   <link href="http://room-303.com/blog/2008/01/29/wysitdwtf/"/>
   <updated>2008-01-29T10:01:02+00:00</updated>
   <id>http://room-303.com/blog/2008/01/29/wysitdwtf</id>
   <content type="html">&lt;p&gt;Stało się, połączyliśmy się z The Daily WTF i coś, co jeszcze niedawno nazywało się &lt;q&gt;WYSIWTF,&lt;/q&gt; teraz przeszło w niebyt. Któregoś dnia odezwał się do nas Alex i zaproponował scalenie obu serwisów. W związku z tym mam zaszczyt zaprosić szanownych państwa na premierowy pokaz &lt;a href=&quot;http://pl.thedailywtf.com/&quot;&gt;The Daily WTF po polsku&lt;/a&gt;. I to &lt;a href=&quot;http://thedailywtf.com/Articles/Announcement-WTF-in-Polish.aspx&quot;&gt;oficjalnie&lt;/a&gt;!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Prosta tapeta: mak</title>
   <link href="http://room-303.com/blog/2008/01/19/prosta-tapeta-mak/"/>
   <updated>2008-01-19T16:21:54+00:00</updated>
   <id>http://room-303.com/blog/2008/01/19/prosta-tapeta-mak</id>
   <content type="html">&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/2204091778/&quot; title=&quot;Poppy - an OS X inspired wallpaper by patrys, on Flickr&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2372/2204091778_68aa5de1e7.jpg&quot; width=&quot;500&quot; height=&quot;375&quot; alt=&quot;Poppy - an OS X inspired wallpaper&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Coś cieplejszego na zimne wieczory, dostępna jest też &lt;a href=&quot;http://room-303.com/blog/wp-content/uploads/2008/01/poppy.svg&quot; title=&quot;wersja SVG bez tła&quot;&gt;wersja SVG bez tła&lt;/a&gt;. Licencja &lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.5/pl/&quot;&gt;CC BY-NC-SA&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Bez poczty</title>
   <link href="http://room-303.com/blog/2008/01/15/bez-poczty/"/>
   <updated>2008-01-15T16:40:13+00:00</updated>
   <id>http://room-303.com/blog/2008/01/15/bez-poczty</id>
   <content type="html">&lt;p&gt;Padła jedna z maszyn &lt;abbr title=&quot;PLD Linux Distribution&quot;&gt;PLD&lt;/abbr&gt;. Od wczoraj jestem bez poczty. Jeśli czegoś ode mnie potrzebujecie, to łapcie mnie przez Jabbera (&lt;code&gt;&amp;lt;patrys at pld-linux org&amp;gt;&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Niedługo wrócę do blogowania, a teraz wracam do walki z nadchodzącym wydaniem GNOME.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Monitoring blogów</title>
   <link href="http://room-303.com/blog/2007/12/22/monitoring-blogow/"/>
   <updated>2007-12-22T15:47:08+00:00</updated>
   <id>http://room-303.com/blog/2007/12/22/monitoring-blogow</id>
   <content type="html">&lt;p&gt;Cieszcie się, że &lt;a href=&quot;http://10przykazan.com/&quot;&gt;10przykazan&lt;/a&gt; nie pisali ludzie z &lt;a rel=&quot;nofollow&quot; href=&quot;http://press-service.com.pl/&quot;&gt;Press Service&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Witam,&lt;/p&gt;

&lt;p&gt;Jestem administratorem i autorem serwisu room-303.com.&lt;/p&gt;

&lt;p&gt;Od dłuższego czasu toleruję niekompetencję Państwa pracowników, ale w tym tygodniu przekroczyła ona wszelkie dopuszczalne granice. Nie interesuje mnie, czy jesteście Państwo zakładem pracy chronionej i zatrudniacie ludzi specjalnej troski, ale nie pozwolę, żeby ich nieznajomość technologii narażała mnie na koszty.&lt;/p&gt;

&lt;p&gt;W skrócie, Państwa monitoring blogów (inforia.net) sprowadza się do ataków na monitorowane serwisy. Inaczej nie umiem wyjaśnić, dlaczego usługi Google są w stanie śledzić treść mojego bloga pozostawiając swój udział w odwiedzinach na granicy błędu statystycznego, natomiast Państwa nieudolny serwis nie dość, że generuje 5% odwiedzin, to jeszcze plasuje się na pierwszym miejscu pod względem pochłanianego transferu. Na pierwsze miejsce z pewnością zasługuje, gdyż 10% całego wychodzącego ruchu to część niemała. Dla porównania dodam, że drugie miejsce nie zbliżyło się jeszcze do 2%. Do tego - za każdym razem - Państwa roboty przedstawiają się jako losowa wersja przeglądarki, co traktuję jako celowe zacieranie statystyk.&lt;/p&gt;

&lt;p&gt;Niniejszym domagam się naprawienia Państwa serwisu, w przeciwnym wypadku będę musiał potraktować Państwa usługi jak próbę ataku na infrastrukturę teleinformatyczną, która posiada znamiona przestępstwa (zakłócanie pracy systemów teleinformatycznych w celu uzyskania korzyści majątkowych). Dodatkowo narażacie mnie Państwo na koszty, gdyż serwis mój znajduje się na komercyjnym hostingu i tak przestrzeń dyskowa, w znakomitej większości zajmowana przez logi generowane przez Państwa, jak i pochłaniany przez Wasze roboty transfer finansowane są z mojej prywatnej kieszeni. Uprzedzam jednocześnie, że jeśli Państwa roboty nie przestaną przedstawiać się jako internauci, cała Państwa klasa adresowa zostanie zablokowana.&lt;/p&gt;

&lt;p&gt;Bez poważania,&lt;/p&gt;

&lt;p&gt;-- &lt;br /&gt;Patryk Zawadzki&lt;br /&gt;PLD Linux Distribution&lt;/p&gt;&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>Terry Pratchett - Opowieści z Wrocławia</title>
   <link href="http://room-303.com/blog/2007/12/21/terry-pratchett-opowiesci-z-wroclawia/"/>
   <updated>2007-12-21T14:27:24+00:00</updated>
   <id>http://room-303.com/blog/2007/12/21/terry-pratchett-opowiesci-z-wroclawia</id>
   <content type="html">&lt;p&gt;Był piękny zimowy poranek. Jeden z tych poranków, kiedy mijające cię grupy niedobitków nocnego picia zacięcie walczą z niewidzialnym wiatrem, starając się za wszelką cenę dotrzeć do domu. Poniedziałek. Pan Patrys zmierzał  do pracy z miną grabarza, któremu właśnie szykował się dzień pełen ekshumacji. Minął windę, której sens istnienia w trzypiętrowym budynku wielokrotnie zdarzało mu się podważać i po chwili stanął w drzwiach biura Nowej Firmy.&lt;/p&gt;

&lt;p&gt;&amp;mdash; Witam &amp;mdash; rzucił tradycyjnie w kierunku biurka, przy którym urzędowała zawsze od wczesnych godzin rannych panna Monika. Jednym z jej zajęć było uprzedzanie klientów o kłopotach, a kłopoty mają to do siebie, że pojawiają się o różnych porach.&lt;/p&gt;

&lt;p&gt;Monika uniosła w geście pozdrowienia tę rękę, w której nie trzymała akurat słuchawki telefonu &amp;mdash; nasz inżynier pojawi się u państwa w okolicach południa &amp;mdash; wyrecytowała złowieszczo tonem, który trącił lekko rutyną &amp;mdash; D-E-L-L. Naprawiamy komputery &amp;mdash; dodała z lekkim niedowierzaniem, jednak zachowując iście stoicki spokój.&lt;/p&gt;

&lt;p&gt;Pan Patrys zastanawiał się nieraz, czy było na tym świecie coś, co potrafiłoby wyprowadzić pannę Monikę z równowagi, nie miał jednak okazji się przekonać. Zdjął kurtkę, po czym zajął miejsce przy swoim biurku w sąsiedniej sali. Pan Patrys był programistą i jego praca polegała głównie na zaspokajaniu potrzeb klientów. W odróżnieniu od innych zawodów, które zdają się pasować do powyższego opisu, klienci pana Patrysa rzadko wiedzieli, jakie są ich potrzeby i nie byli specjalnie skorzy do zapłaty. &amp;mdash; Przynajmniej nie muszę pracować na klęczkach &amp;mdash; uzasadniał sobie w duchu słuszność wyboru profesji.&lt;/p&gt;

&lt;p&gt;Zapowiadał się Kolejny Dzień Wdrożenia. Pan Patrys nie zdążył się jeszcze oswoić z tą myślą, kiedy do biura wmaszerował pan Nbw. Promieniował wprost energią i zapałem do pracy, tak jak nieboszczyki mają w zwyczaju roztaczać wokół siebie aurę ciepła i przyjemny aromat fiołków.&lt;/p&gt;

&lt;p&gt;&amp;mdash; Joł &amp;mdash; pan Nbw rzucił krótko, zwracając się najbardziej pobożną częścią ciała w stronę kolegi, który w tym samym czasie próbował skorzystać z klawiatury, nie odłamując przy tym lekko odmarzniętych palców.&lt;/p&gt;

&lt;p&gt;Niedługo później dołączył do nich pan Sit0, który już od drzwi zanosił się gromkim śmiechem. Z racji faktu, że był poniedziałek, obecni w biurze nie byli do końca pewni, czy przypisywać to trwającemu od piątku upojeniu alkoholowemu, czy może porannym dokonaniom łóżkowym, których szczegółami tak chętnie dzielił się z otoczeniem.&lt;/p&gt;

&lt;p&gt;&amp;mdash; &amp;hellip;ony skandal &amp;mdash; zaczął radośnie pan Sit0. Nie czekając, aż ktokolwiek wyrazi zainteresowanie powodem tej dygresji, kontynuował &amp;mdash; wczoraj na &amp;hellip;onej imprezie poznałem świetnych ludzi. Musiałem się prawie czołgać do &amp;hellip;onego domu!&lt;/p&gt;

&lt;p&gt;Tym razem nie będzie o kobietach &amp;mdash; odpowiedział mu w duchu pan Patrys. Nie był do końca przekonany, czy przyjął to za dobry omen, czy było to zwykłe stwierdzenie faktu. W tej chwili nie miał możliwości poświęcić się zgłębianiu zagadnienia, gdyż ktoś właśnie klepnął go w plecy, a z prawej strony głowy wyraźnie sterczała wyciągnięta dłoń. Z natury nie był człowiekiem, który macha sobie ręką wokół głowy, więc ta niewątpliwie należała do kogoś innego. Przyczepionym do kończyny okazał się pan Jarv, który z uśmiechem na ustach spoglądał z góry na fotel pana Patrysa.&lt;/p&gt;

&lt;p&gt;&amp;mdash; Cześć, chłopaki &amp;mdash; powiedział w stronę już obecnych, starając się jednocześnie wykrzesać z siebie optymizm zupełnie nie pasujący do wskazywanej przez zegar godziny &amp;mdash; myślałem, że już tu nie dotrę przez te cholerne plecy i kolana. &amp;mdash; Pan Jarv miał osobliwy charakter, który pozwalał mu w jednym zdaniu narzekać na reumatyzm, wychwalać tylnie części ciała mijanych kobiet, a jednocześnie dzielić się ze światem nowinami na temat produktów pewnej firmy, która na szyldach umieszczała nadgryziony owoc.&lt;/p&gt;

&lt;p&gt;Nowa Firma pracowała pełną parą. Zgrzyt przesuwanych po stołach myszek, szum licznych wiatraków i szczęk klawiatur, gdzeniegdzie przetykany cichym pochrapywaniem pana Sit0, nie pozostawiały cienia wątpliwości, iż była to firma o profilu informatycznym.&lt;/p&gt;

&lt;p&gt;&amp;mdash; Druga zmiana wita dzielnych bojowników &amp;mdash; rzucił radośnie pan Emes, który miejsce przy swoim biurku zajął w okolicach godziny czternastej. Był to jego przywilej z racji prowadzenia własnej działalności gospodarczej. Niektórzy zazdrościli mu tego, inni długich dreadlocków, które ściął jesienią. Pan Emes nie przejmował się wszechobecną zazdrością i z ironicznym uśmiechem zapytał &amp;mdash; Luke nie dzwonił jeszcze, żeby nam dostarczyć więcej roboty?&lt;/p&gt;

&lt;p&gt;Śmiech ustał momentalnie, gdy w minutę później zadzwonił telefon. Zdawało się, że pan Luke, choć przebywał w innym kraju i od biura dzieliło go co najmniej jedno morze, przysłuchiwał się całej rozmowie i poczuł się wywołany do tablicy. &amp;mdash; Tak? Cześć, Luke &amp;mdash; do słuchawki przemówiły plecy pana Nbw, którego biurko usadowione było tyłem do całego pomieszczenia &amp;mdash; &amp;hellip;jakie poprawki? &amp;mdash; Na dźwięk tych słów nawet pan Sit0 odzyskał przytomność i przyjął pozycję mniej-więcej siedzącą, jeśli nie liczyć stóp znajdujących się na wysokości głowy.&lt;/p&gt;

&lt;p&gt;Pan Nbw, skupiony na rozmowie, opuścił powoli pomieszczenie i zwiastującym nieszczęście krokiem wyszedł z telefonem na korytarz. Nawet jeśli krok ten nie wróżył katastrofy dla firmy, to niechybnie mógł stać się przyczyną choroby, zważywszy, że buty pana Nbw pozostały pod biurkiem. Po chwili człowiek z telefonem wrócił, w jego minie zaś wyczytać można było w równym stopniu temperaturę podłogi na zewnątrz, co niezadowolenie ze zgłoszonych poprawek.&lt;/p&gt;

&lt;p&gt;&amp;mdash; Cóż, panowie, trzeba będzie to jakoś obejść &amp;mdash; zawyrokował pan Nbw. &amp;mdash; Mam pewną koncepcję, zdecydowanie najlepiej będzie zrobić to na szybko i wrócić do innych zajęć. &amp;mdash; Trzeba tu dodać, że inne zajęcia pana Nbw obejmowały między innymi instalowanie przeróżnych systemów operacyjnych na wszystkich trzech komputerach, które znajdowały się przy jego biurku oraz kolekcjonerstwo. Proszę tu nie myśleć o tak przyziemnych rozrywkach jak numizmatyka czy filatelistyka. Pan Nbw stworzony był do celów wyższych niż znaczki, a kubki po herbacie i styropianowe opakowana po jedzeniu na wynos również od monet były znacznie większe.&lt;/p&gt;

&lt;p&gt;&amp;mdash; W obejściach to się zwierzęta trzyma, zrobimy to po ludzku &amp;mdash; powiedział znacząco pan Patrys. Należał do ludzi, którzy bardzo nie lubią się denerwować i unikają tego jak ognia. Nie lubił do tego stopnia, że gdy tylko poczuł zdenerwowanie, robił się z tego powodu wściekły.&lt;/p&gt;

&lt;p&gt;&amp;mdash; Nie mamy czasu na to &amp;mdash; opierał się pan Nbw.&lt;/p&gt;

&lt;p&gt;&amp;mdash; Potem dwa razy tyle czasu będziemy to poprawiać. Żadnych &amp;hellip;onych obejść! &amp;mdash; podniósł głos pan Patrys.&lt;/p&gt;

&lt;p&gt;&amp;mdash; &amp;hellip;ona racja! &amp;mdash; zawtórował mu pan Sit0, który najwyraźniej został obudzony nagłym zamieszaniem.&lt;/p&gt;

&lt;p&gt;&amp;mdash; Jak chcesz. Coś ci będzie potrzebne? &amp;mdash; pan Nbw nie miał najwyraźniej ochoty na kolejną próbę głosu.&lt;/p&gt;

&lt;p&gt;Pan Patrys zwrócił się spokojnie w kierunku przeciwległego biurka &amp;mdash; Jarv! Musisz mi zrobić do tego projekt. Jarv? &amp;mdash; Pan Jarv od dzieciństwa nie słyszał na jedno ucho. Z zawodu był grafikiem, więc nie przeszkadzało mu to zbytnio. Właściwie, jeśli mówiło się do niewłaściwej strony pana Jarvisa, to nie przeszkadzało mu to wcale. &amp;mdash; Halo?&lt;/p&gt;

&lt;p&gt;&amp;mdash; Co chcecie? &amp;mdash; Pan Jarv zareagował ostatecznie na natarczywe wymachiwanie kończynami nad monitorem w wykonaniu pana Patrysa &amp;mdash; mon, może siądziemy do tego jutro, bo już jest po osiemnastej?&lt;/p&gt;

&lt;p&gt;&amp;mdash; &amp;hellip;ona racja! &amp;mdash; ponownie do rozmowy włączył się pan Sit0, tym razem w pozycji pionowej, pakując jednocześnie stacjonarny komputer do plecaka. &amp;mdash; &amp;hellip;ona racja! Do jutra, chłopaki.&lt;/p&gt;

&lt;p&gt;Tak upłynął kolejny poniedziałek, kiedy to Nowa Firma w pocie czoła starała się jak najlepiej wykonać pracę, którą wszak lubiła, i jak najbardziej polubić pracę, którą faktycznie wykonywała.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Python: django-google</title>
   <link href="http://room-303.com/blog/2007/12/04/python-django-google/"/>
   <updated>2007-12-04T15:43:19+00:00</updated>
   <id>http://room-303.com/blog/2007/12/04/python-django-google</id>
   <content type="html">&lt;p&gt;Jeśli ktoś z was czuje nieodpartą ochotę zbudowania aplikacji korzystającej z przypomnień lub kalendarza, to zapraszam do testowania &lt;a href=&quot;http://code.google.com/p/django-google/&quot;&gt;django-google&lt;/a&gt;. Docelowo moduł powinien obsługiwać więcej &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; &lt;code&gt;gdata&lt;/code&gt; Google, ale w tej chwili niewiele z nich ma sens w odniesieniu do Django (większość realizuje tylko dostęp do odczytu).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Kino: Beowulf</title>
   <link href="http://room-303.com/blog/2007/11/28/kino-beowulf/"/>
   <updated>2007-11-28T12:03:19+00:00</updated>
   <id>http://room-303.com/blog/2007/11/28/kino-beowulf</id>
   <content type="html">&lt;p&gt;Jeśli musicie iśc na ten film, to weźcie dużo dobrego piwa i najlepiej coś do palenia. Nie wątpię, że pół sali poszło tam tylko i wyłącznie ślinić się na widok renderingów gołej czterdziestolatki, ale niektórzy mieli nadzieję zobaczyć film na poziomie.&lt;/p&gt;

&lt;p&gt;Cóż, ciekawa muzyka. Właściwie tutaj kończą się zalety nieszczęsnej ofiary ery &lt;abbr title=&quot;Computer Graphics&quot;&gt;CG&lt;/abbr&gt;. Maverick twierdzi też, że modele ładne, ja dalej upieram się przy zdaniu, że bliżej im do Shreka z gumowymi łokciami i plastelinową posturą, niż do żywych ludzi. Final Fantasy wypadł o niebo lepiej.&lt;/p&gt;

&lt;p&gt;Animacja jest strasznie nierówna. Mamy ładne ujęcia z dynamiczną kamerą, a za chwilę widzimy oddział konnych, który gorzej wypadłby tylko, gdyby konie przez megafon krzyczały &lt;q&gt;patataj,&lt;/q&gt; a jeźdźcy rytmicznie uderzali o siebie łupinami kokosów. Panowie, toż w &lt;q&gt;World of Warcraft&lt;/q&gt; są naturalniejsze sekwencje jazdy na przeróżnej menażerii.&lt;/p&gt;

&lt;p&gt;Mimiki w zasadzie brak, poza dwoma-trzema postaciami. Taniej było wszystkim przykleić tonę zarostu. Oszczędzili tylko brodę królowej, czemu zawdzięcza swój subtelny urok Arnolda Schwarzeneggera połączony z urodą Piasta Kołodzieja (z dokładnością do płci i fryzury).&lt;/p&gt;

&lt;p&gt;Stroje z epoki? Z jednej strony dobrze, że autorzy nie ubrali królowej w stringi i top, co ostatnio zdarza się nawet w reklamach proszków do prania, z drugiej strony mało nie umarłem na widok czarownicy w szpilkach. Litości.&lt;/p&gt;

&lt;p&gt;Z pewnością widziałem w życiu gorsze filmy, ten przynajmniej trzymał się fabularnie blisko pierwowzoru, ale mam nieodparte wrażenie, że konsole Xbox 360 i PlayStation 3 mogłyby go renderować w czasie rzeczywistym przy znacznie lepszym odwzorowaniu tak modeli i tekstur, jak samych animacji. Najlepszym dowodem na to jest choćby Heavenly Sword, którego zakup serdecznie polecam.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Drodzy deweloperzy dystrybucji...</title>
   <link href="http://room-303.com/blog/2007/11/21/drodzy-deweloperzy-dystrybucji/"/>
   <updated>2007-11-21T01:50:55+00:00</updated>
   <id>http://room-303.com/blog/2007/11/21/drodzy-deweloperzy-dystrybucji</id>
   <content type="html">&lt;p&gt;Nie interesuje mnie, czy bazujecie na jądrze Solarisa, Linuksa, czy może BSD. Jeśli chcecie &lt;em&gt;naprawić&lt;/em&gt; jakiś pakiet — &lt;q&gt;bo się nie buduje&lt;/q&gt; — droga wolna — lokalne patche są często potrzebne.&lt;/p&gt;

&lt;p&gt;Jeżeli zaś chcecie &lt;em&gt;rozbudować program&lt;/em&gt;, czy ogólniej &lt;em&gt;zmienić jego działanie&lt;/em&gt;, to róbcie to &lt;strong&gt;upstream&lt;/strong&gt;. Gdyby każdy obywatel forknął każdy używany projekt i gdyby nawet wasze dzieci — i nie mówcie mi, że nie macie, bo zawsze możecie mieć (sprawdzić, czy nie ksiądz) — to byśmy żyli w takim burdelu, że wolałbym używać Windowsa.&lt;/p&gt;

&lt;p&gt;Winni nie muszą się zgłaszać, bo pewnie nie czytają tego bloga. Podejrzewam też, że nie znają polskiego — tak, jak ja pospołu z autorami nie znam łatek nakładanych lokalnie. Przodują w tym panowie z Ubuntu, trzon peletonu stanowią zaś Novell, Sun i RedHat. Każdy z dużych ma generalnie &lt;em&gt;w dupie&lt;/em&gt;, że autor pakietu nigdy nie dowie się ani o błędach, które załatali zainteresowani, ani o oczekiwaniach użytkowników.&lt;/p&gt;

&lt;p&gt;Długofalowy efekt jest taki, że w Ubuntu wszystko działa inaczej, niektóre aplikacje mają problemy, które Novell u siebie poprawił trzy lata temu, a użytkownik nie ma się komu poskarżyć, bo przecież autor programu za cudze łaty spowiadał się nie będzie, autor zaś łatek od dwóch lat pracuje pewnie dla innej korporacji. Nie uwierzycie pewnie, ile radości sprawia szukanie łat w repozytoriach innych dystrybucji, kiedy bugzilla danego projektu świeci pustkami.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Postscript:&lt;/em&gt; Byliśmy dzisiaj w kinie na trzeciej części &lt;q&gt;Resident Evil.&lt;/q&gt; Streszczenie filmu:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cela&lt;/li&gt;
&lt;li&gt;Cube 2&lt;/li&gt;
&lt;li&gt;Mad Max&lt;/li&gt;
&lt;li&gt;Szklana Pułapka&lt;/li&gt;
&lt;li&gt;www.Strach&lt;/li&gt;
&lt;li&gt;Mad Max&lt;/li&gt;
&lt;li&gt;Ptaki&lt;/li&gt;
&lt;li&gt;X-Men&lt;/li&gt;
&lt;li&gt;Mission: Impossible&lt;/li&gt;
&lt;li&gt;Gwiezdne Wojny&lt;/li&gt;
&lt;li&gt;Mad Max&lt;/li&gt;
&lt;li&gt;Pitch Black&lt;/li&gt;
&lt;li&gt;Liga Niezwykłych Dżentelmenów&lt;/li&gt;
&lt;li&gt;Star Trek&lt;/li&gt;
&lt;li&gt;X-Men&lt;/li&gt;
&lt;li&gt;Cube 2&lt;/li&gt;
&lt;li&gt;Matrix&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Warto obejrzeć, poważnie. Brakowało mi tylko Generała Daimosa.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>0x19 - dzień niedźwiedzia</title>
   <link href="http://room-303.com/blog/2007/11/13/0x19-dzien-niedzwiedzia/"/>
   <updated>2007-11-13T14:16:38+00:00</updated>
   <id>http://room-303.com/blog/2007/11/13/0x19-dzien-niedzwiedzia</id>
   <content type="html">&lt;p&gt;Wszystkim, którzy pamiętali, dziękuję za tonę spamu na komórkę, który otrzymuję systematycznie od rana (właściwie to zacząłem otrzymywać jeszcze przed wyjściem z knajpy). Tak, to prawda, moje ostatnie prawdziwie nastoletnie urodziny (bo i jak komuś wytłumaczyć, że ma się A-naście?).&lt;/p&gt;

&lt;p&gt;Jeśli jeszcze nie zorganizowaliście przyjęcia niespodzianki, to do wieczora macie szansę podjechać do mnie z tortem pełnym striptizerek. Pomysłów na prezent &lt;a href=&quot;http://www.ereoh.com/2up/?p=2152&quot;&gt;daleko szukać nie trzeba&lt;/a&gt;. Holler at me! ;)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Dear lazyweb...</title>
   <link href="http://room-303.com/blog/2007/11/12/dear-lazyweb/"/>
   <updated>2007-11-12T11:52:54+00:00</updated>
   <id>http://room-303.com/blog/2007/11/12/dear-lazyweb</id>
   <content type="html">&lt;p&gt;Jestem szczęśliwym posiadaczem dwóch konsol — PlayStation 2 i PlayStation 3. Byłbym jeszcze szczęśliwszy, gdybym posiadał jeszcze więcej gier. Oczywiście, wychowałem się z joystickiem w ręce i pewnie mógłbym z radością przebrnąć przez wszystkie wydane tytuły, ale jest jeden problem.&lt;/p&gt;

&lt;p&gt;O ile mordowanie tłumów za pomocą katany Onimushy i kopanie raperskich tyłków w DefJam Icon sprawia mi wiele radości, często zdarza się sytuacja, w której w pokoju znajduje się mnoga liczba potencjalnych partycypantów zabawy, toteż dobrze byłoby uruchomić coś mniej zobowiązującego niż Dragon Quest 8 i mniej angażującego intelektualnie od Okami. Nie każdy też chce przed zabawą nauczyć się wszystkich 100+ ciosów wybranej postaci w Tekkenie.&lt;/p&gt;

&lt;p&gt;Jak zapewne domyślacie się, w potrzeby idealnie wpasowuje się Katamari, mam też oczywiście Super Rub 'a' Dub, ale gdzie dalej? Kiedy przeglądam ofertę, to wydaje mi się, że wydawcy gier na Xboksa i &lt;abbr title=&quot;PlayStation 3&quot;&gt;PS3&lt;/abbr&gt; uznali, że skoro konsole mają świetną grafikę i dostęp do internetu, to ludzie przestali się spotykać przy piwie.&lt;/p&gt;

&lt;p&gt;Drogi lazywebie, szukam gier, w które można pograć na jednej konsoli i przy jednym telewizorze. Tak, wiem, że Warhawk ma tryb dzielonego ekranu nawet dla czterech graczy, jednak nie spełnia powyższych wymagań. Tak, też czekam na LittleBigPlanet i Beautiful Katamari. Pomóżcie ;)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>SynPrezesa kontratakuje</title>
   <link href="http://room-303.com/blog/2007/11/08/synprezesa-kontratakuje/"/>
   <updated>2007-11-08T16:15:19+00:00</updated>
   <id>http://room-303.com/blog/2007/11/08/synprezesa-kontratakuje</id>
   <content type="html">&lt;p&gt;Przed chwilą odebrałem telefon z nieznanego numeru. Okazało się, że po drugiej stronie słuchawki siedzi (a może stoi) nie kto inny, jak sam SynPrezesa™. Jeśli zastanawialiście się kiedyś, co może porabiać tak sławna i znamienita niegdyś osobistość, to uspokajam was, że pozostał w biznesie.&lt;/p&gt;

&lt;p&gt;Zmieniają się czasy, zmieniają się również platformy, dlatego dziś otrzymałem — uwaga — propozycję pracy jako — większa uwaga — programista Java. Cóż, niestety moja porywczość sprawiła mi kolejny przykry zawód i okazało się, że z tak intratnej propozycji zrezygnowałem jeszcze nim dowiedziałem się, że są skłonni pójść nawet na takie ustępstwa, jak podniesienie stawki do &lt;em&gt;dwóch tysięcy&lt;/em&gt; (netto!).&lt;/p&gt;

&lt;p&gt;Nie wiem, jak wy, ja jestem finansowo zbyt cienki na takie honory. Jeśli ktoś byłby zainteresowany, to zapraszam, postaram się przekazać kontakt &amp;mdash; a nie wątpię, że chętni nachodzić będą mnie jeszcze przez dekady, również w toalecie. Żeby nie było wątpliwości, stawka jest w polskich złotych, a nie w funtach brytyjskich.&lt;/p&gt;

&lt;p&gt;Uszu mych dobiegły również wieści, jakoby obecnie zespół składał się z dwóch osób tyrających za półtora tysiąca. W rolę szefa zespołu owych ofiar wcielił się nie kto inny, jak sława błękitnego ekranu, nasz mityczny już niemal heros. Zasłużony w walce z pracą, postępem i przedsiębiorczością oraz dzielnie stawiający opór rozsądkowi (i inflacji, jak widać powyżej).&lt;/p&gt;

&lt;p&gt;Cóż, pozostaje mi życzyć powodzenia i liczyć na to, że nie jest to zespół sprawujący pieczę nad jakąkolwiek usługą użyteczności publicznej. Choć z drugiej strony, gdyby tak zatrudnił ich ZUS, mielibyśmy w końcu szansę wyzbyć się bagażu przeszłości i zrezygnować z obowiązkowego łożenia na emerytury. Kto wie, kusząca wizja…&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Nie mam iPhona</title>
   <link href="http://room-303.com/blog/2007/10/31/nie-mam-iphona/"/>
   <updated>2007-10-31T14:29:41+00:00</updated>
   <id>http://room-303.com/blog/2007/10/31/nie-mam-iphona</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://offtopic.jogger.pl/2007/10/30/iphone-pod-lupa/&quot;&gt;Riddle pisał o iPhonie&lt;/a&gt;. Starał się przedstawić swoje stanowisko obiektywnie, czy mu się to udało — nie mnie oceniać. Chciałem za to napisać coś o elektronice użytkowej z mojego punktu widzenia.&lt;/p&gt;

&lt;h4&gt;Nie mam iPhona&lt;/h4&gt;

&lt;p&gt;Nosiłem się z zamiarem jego zakupu jeszcze w sierpniu. Na przełomie września i października, firma, której nazwę na nasz ojczysty można by przetłumaczyć jako &lt;q&gt;smutek,&lt;/q&gt; zapowiedziała, że owa &lt;q&gt;jednoczesna premiera nowych urządzeć na rynkach wszystkich krajów&lt;/q&gt; oznacza mniej więcej tyle, że w Polsce iPod Touch pojawi się nie wcześniej niż w grudniu, a iPhone może kiedyś się pojawi. W tym momencie zrezygnowałem też z zakupu nowego iPoda.&lt;/p&gt;

&lt;h4&gt;Coś mnie powstrzymało&lt;/h4&gt;

&lt;p&gt;Szybko okazało się bowiem, że nowe urządzenia działają tylko pod kontrolą iTunes. W przypadku iPoda jest to tylko kwestia aktualizacji algorytmów zapisujących iTunesDB (Apple dodało dwie sumy kontrolne) w stabilnych wersjach oprogramowania. W przypadku iPhona oznacza to konieczność uprzedniego &lt;q&gt;odceglenia&lt;/q&gt; sprzętu, co oznacza także pożegnanie się z naprawami gwarancyjnymi.&lt;/p&gt;

&lt;p&gt;Nie jestem aż tak wielkim fanem rozwiązań firmy z nadgryzionym jabłkiem w logotypie. Apple to użyteczność, zaś ta ostatnia nie kojarzy mi się ze ściąganiem sprzętu z eBaya i koniecznością crackowania go przez &lt;abbr title=&quot;Secure Shell&quot;&gt;SSH&lt;/abbr&gt;. Jestem szczęśliwym posiadaczem drugiego już iPoda Nano (kolejno pierwsza i druga generacja) i nie wymaga on ode mnie niczego ponad podłączenie go do komputera. Razem z innymi zwolennikami oprogramowania opensource staraliśmy się, żeby korzystanie z iPoda było tak samo przyjazne na platformach *niksowych. W przypadku nowych urządzeń, Apple nam to utrudnia.&lt;/p&gt;

&lt;h4&gt;Nie żałuję&lt;/h4&gt;

&lt;p&gt;Mam przyjemność znać posiadaczy zarówno iPhona, jak i iPoda Touch. Jedni i drudzy posiadają również starsze modele iPodów, co pozwala lepiej ocenić zmiany. Nazwanie iPhone produktem rewolucyjnym to stanowcza przesada. Ewolucyjnym — a i owszem, do rewolucji wymagana jest jednak innowacja.&lt;/p&gt;

&lt;p&gt;Wszyscy użytkownicy dotykowych urządzeń — niczym jeden mąż — narzekają na brak kółka. Kocham swój click wheel. Pozwala mi sterować iPodem w kieszeni za pomocą jednego palca. Pozbycie się płynnego przewijania precyzyjnym kółkiem na rzecz dotykowego suwaczka długości paru centymetrów jest dla mnie ogromnym krokiem wstecz w dziedzinie interfejsu przenośnych odtwarzaczy. Jeśli 30-minutowy podcast podzielić na 200 pikseli suwaczka, szybko okaże się, że przewinięcie pliku o mniej niż 10 sekund wymaga precyzji na poziomie jednego piksela.&lt;/p&gt;

&lt;h4&gt;Co zamiast?&lt;/h4&gt;

&lt;p&gt;Dziś planuję już zakup &lt;a href=&quot;http://www.nseries.com/index.html&quot;&gt;Nseries&lt;/a&gt; N810 — urządzenia otwartego, działającego pod kontrolą wolnego oprogramowania. Sprzęt? &lt;abbr title=&quot;Global Positioning System&quot;&gt;GPS&lt;/abbr&gt;, sieć bezprzewodowa, Bluetooth, czytnik kart i ekran dotykowy. A do tego system oparty o GNU/Linux, Maemo, Avahi (protokół Bonjour, którym Riddle zachwycał się w komentarzach) i pełna swoboda doboru aplikacji (w tym przeglądarki oparte o Gecko i WebKit).&lt;/p&gt;

&lt;p&gt;Oczywiście jest też pełne wsparcie dla multimediów, ale nie będę o nim wspominał, bo dla mnie ekran 5&quot; to o co najmniej 20&quot; za mało, żeby oglądać na nim filmy. Moje oko cieszy od niedawna ciekłokrystaliczny 32&quot;, do którego podłączone są PlayStation 2 i odtwarzacz Kiss DP-1000. Ten ostatni kupiłem dawno temu i gdybym miał dziś wybierać, zdecydowałbym się na któryś z droższych modeli Kissa — brakuje nieco obsługi sieci. Do słuchania muzyki używam iPoda Nano, a z przesiadką na jakikolwiek telefon poczekam. I będę tak czekać, aż do masowej produkcji wejdą słuchawki studyjne z mikrofonami dla telefonów.&lt;/p&gt;

&lt;p&gt;Właśnie, co z telefonem? Cóż, jako wierny fan Sony Ericssona, przedwczoraj zmieniłem wysłużonego K700i na nieco nowszy &lt;a href=&quot;http://www.sonyericsson.com/spg.jsp?cc=pl&amp;amp;lc=pl&amp;amp;ver=4000&amp;amp;template=pip1&amp;amp;zone=pp&amp;amp;pid=10407&quot;&gt;K800i&lt;/a&gt;. Tutaj, w przeciwieństwie do iPhona, 3G działa ;)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Języki...</title>
   <link href="http://room-303.com/blog/2007/10/22/jezyki/"/>
   <updated>2007-10-22T12:12:05+00:00</updated>
   <id>http://room-303.com/blog/2007/10/22/jezyki</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://offtopic.jogger.pl/2007/10/20/jezyki-programowania/&quot;&gt;Riddle zaprosił&lt;/a&gt;, a ja nie mam nic do stracenia. Języki, które znam:&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Język&lt;/th&gt; &lt;th&gt;Walety&lt;/th&gt; &lt;th&gt;Zady&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;th&gt;ADA&lt;/th&gt; &lt;td&gt;Patrz Pascal&lt;/td&gt; &lt;td&gt;Nieprzydatny w mojej pracy&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Assembler&lt;/th&gt; &lt;td&gt;Najwydajniejszy ze wszystkich&lt;/td&gt; &lt;td&gt;Zupełnie nieprzenośny, wymaga dużo dyscypliny, żeby kod dało się czytać&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;C&lt;/th&gt; &lt;td&gt;Mój pierwszy język, wydajny, masa bibliotek&lt;/td&gt; &lt;td&gt;Brak obiektowości, &lt;code&gt;strdup&lt;/code&gt;, &lt;code&gt;malloc&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;C++&lt;/th&gt; &lt;td&gt;Wydajny, obiektowy, biblioteka templatek&lt;/td&gt; &lt;td&gt;Dalej niski poziom, chora składnia przyjaciół i przeciążania operatorów&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;ECMAScript&lt;/th&gt; &lt;td&gt;Czytelny, obiektowy; JavaScript&lt;/td&gt; &lt;td&gt;Debugowanie ActionScript to przeżycie na miarę kamieni nerkowych&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Java&lt;/th&gt; &lt;td&gt;Czytelny, obiektowy, przestrzenie nazw, przenośność bajtkodu&lt;/td&gt; &lt;td&gt;Spory narzut, NazwyTakPrzyjazne, że BezIdeNiePodchodź&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Lisp&lt;/th&gt; &lt;td&gt;Jeden z pierwszych języków wysokiego poziomu&lt;/td&gt; &lt;td&gt;nieczytelny (zupełnie (naprawdę))&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;LUA&lt;/th&gt; &lt;td&gt;Czytelny, obiektowy język wysokiego poziomu, banalnie łatwo osadzalny&lt;/td&gt; &lt;td&gt;Mało popularny&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Pascal&lt;/th&gt; &lt;td&gt;Czytelny, wbudowane operacje na ciągach, binarne ciągi z prefiksową notacją długości&lt;/td&gt; &lt;td&gt;Słaba obiektowość, praktycznie martwy, chore implementacje Delphi i Kylix&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Perl&lt;/th&gt; &lt;td&gt;Prosty jak budowa cepa, obiektowy&lt;/td&gt; &lt;td&gt;Często używany zamiast bardziej odpowiedniego shella lub awka, TIMTOWTDI&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;PHP&lt;/th&gt; &lt;td&gt;Jest wszędzie od dziewięciu lat, ostatnio prawie obiektowy; po dwóch miesiącach wydaje ci się, że znasz język na wskroś&lt;/td&gt; &lt;td&gt;Tylko ci się wydaje; bękart Perla i shella, biblioteka standardowa nie obsługuje wyjątków, automatycznie ładuje wszelkie rozszerzenia; przez te dziewięć lat wolałbym programować w czymś normalnym&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Python&lt;/th&gt; &lt;td&gt;Czytelny, obiektowy, przestrzenie nazw, dekoratory, unikod, przenośność bajtkodu, wymaga wcięć!&lt;/td&gt; &lt;td&gt;Niektórzy uważają, że wcięcia robi się spacjami&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Ruby&lt;/th&gt; &lt;td&gt;Mocno obiektowy, przestrzenie nazw&lt;/td&gt; &lt;td&gt;Nie obsługuje unikodu, do dziś nie ma żadnej specyfikacji języka&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Shell&lt;/th&gt; &lt;td&gt;Prosty, oparty o strumienie&lt;/td&gt; &lt;td&gt;Nieczytelny, służy tylko do spinania innych narzędzi&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SML&lt;/th&gt; &lt;td&gt;Czytelny, notacja matematyczna&lt;/td&gt; &lt;td&gt;Bezstanowy, programowanie bez skutków ubocznych jest mało praktyczne&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Skaranie boskie z wami dzieciaczki. A do tablicy pójdzie teraz&amp;hellip; Czesio, znaczy &lt;a href=&quot;http://www.thelirium.net/&quot;&gt;Cezio&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #NaN: Lord of the Patents</title>
   <link href="http://room-303.com/blog/2007/10/11/strip-nan-lord-of-the-patents/"/>
   <updated>2007-10-11T10:26:56+00:00</updated>
   <id>http://room-303.com/blog/2007/10/11/strip-nan-lord-of-the-patents</id>
   <content type="html">&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/1541982156/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2300/1541982156_38feaea139_o.png&quot; alt=&quot;Lord of the Patents&quot; height=&quot;846&quot; width=&quot;442&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Blog powrócił</title>
   <link href="http://room-303.com/blog/2007/10/08/blog-powrocil/"/>
   <updated>2007-10-08T13:33:43+00:00</updated>
   <id>http://room-303.com/blog/2007/10/08/blog-powrocil</id>
   <content type="html">&lt;p&gt;Pewnie sporo z was zauważyło, że wizyty na moim blogu kończyły się ostatnio przepięknym komunikatem &lt;q&gt;500 Internal Server Error.&lt;/q&gt; Okazało się, że po którymś upgradzie na serwerze, wtyczka OpenID przestała działać i razem ze sobą do grobu pociągnęła cały serwis.&lt;/p&gt;

&lt;p&gt;Dzisiaj zebrałem się i zrobiłem upgrade tak wtyczki, jak i całego WordPressa. Wszystko powinno już działać bez zarzutu.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Prywatnie: Nareszcie</title>
   <link href="http://room-303.com/blog/2007/09/26/prywatnie-nareszcie/"/>
   <updated>2007-09-26T14:37:03+00:00</updated>
   <id>http://room-303.com/blog/2007/09/26/prywatnie-nareszcie</id>
   <content type="html">&lt;p&gt;Przez cały ostatni semestr studiów pojawiłem się na uczelni tylko raz — żeby podbić legitymację. Semestr do powtórzenia. Okazało się jednak, że nie mogę powtórzyć semestru bez rozliczenia karty egzaminacyjnej, której nie mogę uzyskać bez podpisu promotora.&lt;/p&gt;

&lt;p&gt;Problem polegał na tym, że nie wybrałem też promotora. Chciałem z tego miejsca podziękować doktorowi Pawłowi Myszkowskiemu z Instytutu Informatyki Stosowanej Politechniki Wrocławskiej, który — mimo półrocznego opóźnienia — zgodził się mnie promować.&lt;/p&gt;

&lt;p&gt;Pozostało jeszcze złożyć temat pracy w dziekanacie (w środy nieczynne) i można starać się o przywrócenie na studia. Dziekanat oczywiście kocha mnie inaczej, ale mam nadzieję, że się uda.&lt;/p&gt;

&lt;p&gt;Tytuł pracy — &lt;em&gt;Tworzenie aplikacji internetowych w Pythonie z użyciem Django&lt;/em&gt;. Zanosi się na książkę, wstępny szkic spisu treści ma 104 wiersze. Trzymajcie kciuki ;)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Jeszcze jedna tapeta</title>
   <link href="http://room-303.com/blog/2007/09/12/jeszcze-jedna-tapeta/"/>
   <updated>2007-09-12T14:26:02+00:00</updated>
   <id>http://room-303.com/blog/2007/09/12/jeszcze-jedna-tapeta</id>
   <content type="html">&lt;p&gt;Znów zasiadłem do Inkscape'a i zacząłem bawić się wektorami. Kolejna ofiara &amp;mdash; &lt;a href=&quot;http://www.fileden.com/files/2006/12/21/538269/mangas/mangas_ff_84.jpg&quot;&gt;rysunek nieznanego autora&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/1366759900/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm2.static.flickr.com/1171/1366759900_1337719e2a.jpg&quot; width=&quot;500&quot; height=&quot;313&quot; alt=&quot;Fantasy party (black)&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Dostępna też &lt;a href=&quot;http://www.flickr.com/photos/patrys/1366760338/in/photostream/&quot;&gt;wersja z przezroczystym tłem&lt;/a&gt; (dla Linuksa).&lt;/p&gt;

&lt;p&gt;Licencja tradycyjna, &lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.5/&quot;&gt;CC-BY-NC-SA&lt;/a&gt;. Wersji niepanoramicznej nie ma, wystarczy wyśrodkować.&lt;/p&gt;

&lt;p&gt;Dla szczególnie dociekliwych (albo dla ludzi o dziwnych rozdzielczościach): &lt;a href=&quot;http://room-303.com/blog/wp-content/uploads/2007/09/party.zip&quot; title=&quot;Party - wersja SVG&quot;&gt;Party - wersja SVG&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Prywatnie: Nerd!</title>
   <link href="http://room-303.com/blog/2007/09/11/prywatnie-nerd/"/>
   <updated>2007-09-11T07:38:52+00:00</updated>
   <id>http://room-303.com/blog/2007/09/11/prywatnie-nerd</id>
   <content type="html">&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.nerdtests.com/nt2ref.html&quot;&gt;&lt;img src=&quot;http://www.nerdtests.com/images/badge/nt2/b2fb231324674adf.jpg&quot; alt=&quot;NerdTests.com says I'm an Uber Cool Nerd King.  What are you?  Click here!&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wcześniej: &lt;a href=&quot;http://blog.jajcus.net/2007/09/10/no-to-ja-tez/&quot;&gt;Jajcuś&lt;/a&gt; i &lt;a href=&quot;http://andrzej.dopierala.name/2007-09-10_NerdTest&quot;&gt;Undefined&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>PLD Th: fixing a vserver</title>
   <link href="http://room-303.com/blog/2007/09/05/pld-th-fixing-a-vserver/"/>
   <updated>2007-09-05T13:34:39+00:00</updated>
   <id>http://room-303.com/blog/2007/09/05/pld-th-fixing-a-vserver</id>
   <content type="html">&lt;p&gt;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.&lt;/p&gt;

&lt;h4&gt;Awaria&lt;/h4&gt;

&lt;p&gt;Poszukiwanie przyczyn pozwoliło nam ustalić następujące fakty:&lt;/p&gt;

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

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

&lt;h4&gt;Nosem w dół&lt;/h4&gt;

&lt;p&gt;Dość szybko okazało się, że nie będzie tak łatwo:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;ncontext: vc_net_create(): Invalid argument&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

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

&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;--- /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 &quot;${CHBIND_OPTS[@]}&quot; &quot;$@&quot;
+       exec $_CHBIND --nid $RPM_FAKE_CTX &quot;${CHBIND_OPTS[@]}&quot; &quot;$@&quot;
 }&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Dość szybko okazało się, że radość jest przedwczesna. O ile &lt;code&gt;vrpm&lt;/code&gt; i &lt;code&gt;vpoldek&lt;/code&gt; 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:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;error: cannot open Basenames index using db3 - No such file or directory (2)&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;h4&gt;Winny&lt;/h4&gt;

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

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

&lt;h4&gt;Rozwiązanie&lt;/h4&gt;

&lt;p&gt;Jeff, autor &lt;code&gt;rpm&lt;/code&gt; pomógł mi cofnąć upgrade:&lt;/p&gt;

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

&lt;h4&gt;Kolejny problem&lt;/h4&gt;

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

&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;%_host_os %_os&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Voila, wszystko działa, maszyna została przebudowana. Następnym razem postaram się pozbyć irytujących komunikatów &lt;code&gt;LD_PRELOAD&lt;/code&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Licencja, panie</title>
   <link href="http://room-303.com/blog/2007/08/31/licencja-panie/"/>
   <updated>2007-08-31T11:57:46+00:00</updated>
   <id>http://room-303.com/blog/2007/08/31/licencja-panie</id>
   <content type="html">&lt;p&gt;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ż &lt;q&gt;kark&lt;/q&gt; czy &lt;q&gt;dres,&lt;/q&gt; ale żeby programiści nie potrafili czytać własnych licencji?&lt;/p&gt;

&lt;p&gt;Trafiłem wczoraj na &lt;a href=&quot;http://undeadly.org/&quot;&gt;Undeadly&lt;/a&gt; na wątek dotyczący &lt;a href=&quot;http://undeadly.org/cgi?action=article&amp;amp;sid=20070829001634&quot;&gt;złamania licencji przez deweloperów Linuksa&lt;/a&gt;. 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 &lt;q&gt;nie do końca wolnej&lt;/q&gt; licencji GNU, drudzy przypominali sytuację odwrotną, która nie miała miejsca tak znowu dawno temu.&lt;/p&gt;

&lt;p&gt;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 &lt;em&gt;można sobie dowolnie wybrać jedną z licencji, która będzie nas obowiązywać&lt;/em&gt;. 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.&lt;/p&gt;

&lt;p&gt;Ż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).&lt;/p&gt;

&lt;p&gt;Tak, czytanie to nie jest mocna strona ludzi. Nasz Trybunał Konstytucyjny kolejny raz &lt;a href=&quot;http://prawo.vagla.pl/node/7432&quot;&gt;udowodnił&lt;/a&gt;, że wyobraźnia również.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>WYSIWTF</title>
   <link href="http://room-303.com/blog/2007/08/27/wysiwtf/"/>
   <updated>2007-08-27T12:15:03+00:00</updated>
   <id>http://room-303.com/blog/2007/08/27/wysiwtf</id>
   <content type="html">&lt;p&gt;Pozazdrościliśmy nieco z &lt;a href=&quot;http://thelirium.net/&quot;&gt;ceziem&lt;/a&gt; zabawy, jaką serwuje nam codziennie &lt;a href=&quot;http://worsethanfailure.com/&quot;&gt;Worse Than Failure&lt;/a&gt; (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 &lt;abbr&gt;WTF&lt;/abbr&gt;, dlatego też od piątku istnieje i działa (a właściwie to się dopiero powoli rozkręca) &lt;a href=&quot;http://wysiwtf.pl/&quot;&gt;WYSIWTF&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Zapraszamy :)&lt;/p&gt;

&lt;p&gt;Wiem, że zaraz ktoś mnie zbluzga za to, że &lt;a href=&quot;http://10przykazan.com/&quot;&gt;10przykazan&lt;/a&gt; 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.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Wyjątkowość PHP</title>
   <link href="http://room-303.com/blog/2007/08/15/wyjatkowosc-php/"/>
   <updated>2007-08-15T19:18:09+00:00</updated>
   <id>http://room-303.com/blog/2007/08/15/wyjatkowosc-php</id>
   <content type="html">&lt;p&gt;Podobno &lt;abbr title=&quot;PHP Hypertext Preprocessor&quot;&gt;PHP&lt;/abbr&gt;5 jest językiem obiektowym, niektórzy twierdzą nawet, że językiem czwartej generacji. Ja bym go nazwał językiem &lt;q&gt;obiektowalnym,&lt;/q&gt; 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 &lt;abbr&gt;PHP&lt;/abbr&gt; są… niemal bezużyteczne.&lt;/p&gt;

&lt;p&gt;Autorzy języka uznali, że najważniejsza jest zgodność wstecz za wszelką cenę. Zamiast jednak przygotować moduł, który dostarczałby &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; 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 &lt;q&gt;szerokie możliwości&lt;/q&gt; 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 &lt;abbr&gt;PHP&lt;/abbr&gt; okazuje się stać na czele i już tylko krok dzieli go od interpretacji języka naturalnego.&lt;/p&gt;

&lt;p&gt;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 &lt;code&gt;Exception&lt;/code&gt;, 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 &lt;abbr&gt;API&lt;/abbr&gt; 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 &lt;abbr&gt;PHP&lt;/abbr&gt; są niemal bezużyteczne.&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;$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;
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Czy tak powinien wyglądać kod? A może tak:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;$result = true;
try
{
	$f = foo();
	$f-&amp;gt;write('bar');
	$f-&amp;gt;write('baz');
	$f-&amp;gt;flush();
}
catch (FooException $e)
{
	$result = false;
}
finally
{
	if ($f)
		$f-&amp;gt;close();
}
return $result;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Ż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 &lt;abbr&gt;PHP&lt;/abbr&gt;5 wygląda na zaprojektowany na kolanie?&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Z wyrazami szacunku, kochające community</title>
   <link href="http://room-303.com/blog/2007/08/14/z-wyrazami-szacunku-kochajace-community/"/>
   <updated>2007-08-14T12:34:08+00:00</updated>
   <id>http://room-303.com/blog/2007/08/14/z-wyrazami-szacunku-kochajace-community</id>
   <content type="html">&lt;p&gt;Kilka osób pytało mnie, w czym &lt;a href=&quot;http://www.djangoproject.com/&quot;&gt;Django&lt;/a&gt; jest lepsze od &lt;a href=&quot;http://cakephp.org/&quot;&gt;CakePHP&lt;/a&gt;. Najprostszą odpowiedzią, jakiej potrafię udzielić, jest &lt;q&gt;lepszy jest język pod spodem,&lt;/q&gt; 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.&lt;/p&gt;

&lt;p&gt;Kilka godzin narzekania na &lt;abbr title=&quot;PHP Hypertext Preprocessor&quot;&gt;PHP&lt;/abbr&gt; 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.&lt;/p&gt;

&lt;p&gt;Dalsze przekopywanie Traca pokazało ticket &lt;a href=&quot;https://trac.cakephp.org/ticket/969&quot;&gt;#969&lt;/a&gt;. Ktoś rok temu zgłosił identyczny problem. Skutek? Ticket &lt;a href=&quot;https://trac.cakephp.org/ticket/991&quot;&gt;#991&lt;/a&gt;. Otwarty do dziś, dokumentacja nadal nieaktualna. Tak, wolę Django.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>10przykazan - hackfest day two</title>
   <link href="http://room-303.com/blog/2007/08/12/10przykazan-hackfest-day-two/"/>
   <updated>2007-08-12T11:52:46+00:00</updated>
   <id>http://room-303.com/blog/2007/08/12/10przykazan-hackfest-day-two</id>
   <content type="html">&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/1092773468/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm2.static.flickr.com/1205/1092773468_7cc0a0005f.jpg&quot; alt=&quot;Gotcha! This actually fixed the site for IE&quot; height=&quot;375&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/1092776788/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm2.static.flickr.com/1279/1092776788_161f0649be.jpg&quot; alt=&quot;pict0149.jpg&quot; height=&quot;375&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dziś o szóstej rano serwis miał zaimplementowaną większość swojej funkcjonalności. Jutro zdjęcia z ostatnich metrów maratonu.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>10przykazan - hackfest day one</title>
   <link href="http://room-303.com/blog/2007/08/11/10przykazan-hackfest-day-one/"/>
   <updated>2007-08-11T18:28:32+00:00</updated>
   <id>http://room-303.com/blog/2007/08/11/10przykazan-hackfest-day-one</id>
   <content type="html">&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/1085101118/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm2.static.flickr.com/1417/1085101118_4094018d19.jpg&quot; alt=&quot;Old site&quot; height=&quot;375&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Od godziny 20 w piątek trwa niemal nieustannie (z wyjątkiem przerwy na sen pomiędzy ósmą a czternastą) hackfest. Razem z &lt;a href=&quot;http://monochrome.pl/&quot;&gt;Jarvem&lt;/a&gt; staramy się — w ciągu jednego weekendu — przebudować &lt;a href=&quot;http://10przykazan.com/&quot;&gt;10przykazan&lt;/a&gt; od zera.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/1085114506/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm2.static.flickr.com/1121/1085114506_6e8986e2b1.jpg&quot; alt=&quot;A closeup&quot; height=&quot;375&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Trzymajcie kciuki, jutro kolejny update.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Osobowość konsolowa</title>
   <link href="http://room-303.com/blog/2007/08/09/osobowosc-konsolowa/"/>
   <updated>2007-08-09T09:47:40+00:00</updated>
   <id>http://room-303.com/blog/2007/08/09/osobowosc-konsolowa</id>
   <content type="html">&lt;p&gt;Właśnie trafiłem na &lt;a href=&quot;http://koke.amedias.org/articles/2007/06/11/my-top-10-commands/&quot;&gt;zabawną notkę na blogu Koke&lt;/a&gt;. Krótki skrypt pokazuje, jakie polecenia były najczęściej używane w ostatnim czasie:&lt;/p&gt;

&lt;blockquote&gt;&lt;code&gt;history | awk '{print $2}' | awk 'BEGIN {FS=&quot;|&quot;} {print $1}' | sort | uniq -c | sort -rn | head -10&lt;/code&gt;&lt;/blockquote&gt;

&lt;p&gt;Po moich widać, że nie jestem fanem Emacsa:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;    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&lt;/pre&gt;&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>Howto: Seahorse w PLD</title>
   <link href="http://room-303.com/blog/2007/08/07/howto-seahorse-w-pld/"/>
   <updated>2007-08-07T12:59:12+00:00</updated>
   <id>http://room-303.com/blog/2007/08/07/howto-seahorse-w-pld</id>
   <content type="html">&lt;p&gt;Pakietu &lt;a href=&quot;http://live.gnome.org/Seahorse&quot;&gt;Seahorse&lt;/a&gt; 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 &lt;abbr title=&quot;Secure Shell&quot;&gt;SSH&lt;/abbr&gt;, ale przede wszystkim jest najwygodniejszym interfejsem dla &lt;a href=&quot;http://www.gnupg.org/&quot;&gt;GnuPG&lt;/a&gt;, jaki istnieje.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;seahorse&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gnupg-agent&lt;/code&gt; &amp;gt;= 2.0.5-2&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dalsze kroki wyglądają następująco:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;echo &quot;pinentry-program seahorse-agent&quot; &amp;gt; ~/.gnupg/gpg-agent.conf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vim ~/.gnupg/gpg.conf&lt;/code&gt; i usuwamy znak komentarza na początku linii &lt;code&gt;use-agent&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;wylogowujemy się i logujemy ponownie&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;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 &lt;abbr title=&quot;PLD Linux Distribution&quot;&gt;PLD&lt;/abbr&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Więcej o OOXML</title>
   <link href="http://room-303.com/blog/2007/08/06/wiecej-o-ooxml/"/>
   <updated>2007-08-06T12:37:40+00:00</updated>
   <id>http://room-303.com/blog/2007/08/06/wiecej-o-ooxml</id>
   <content type="html">&lt;p&gt;Przed chwilą otrzymałem list od pana Sławomira Wrońskiego z &lt;abbr title=&quot;Polskiego Komitetu Normalizacyjnego&quot;&gt;PKN&lt;/abbr&gt;. W liście prośba do wszystkich zainteresowanych podmiotów, aby odwiedzić &lt;a href=&quot;http://www.pkn.pl/?pid=dis29500&amp;amp;cid\[\]=1&quot;&gt;specjalną stronę komitetu&lt;/a&gt; i zabrać głos w dyskusji. W szczególności ważne dla &lt;abbr&gt;PKN&lt;/abbr&gt; są odpowiedzi na pytania:&lt;/p&gt;

&lt;blockquote&gt;&lt;ol&gt;
&lt;li&gt;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)?&lt;/li&gt;
&lt;li&gt;Czy proponowana norma spełnia cele normy międzynarodowej opisane w Dyrektywach ISO/IEC tzn.:
&lt;ul&gt;
&lt;li&gt;Jest kompletna w sposób wystarczający, w granicach wyznaczonych  jej zakresem&lt;/li&gt;
&lt;li&gt;Jest zwarta, jasna i precyzyjna&lt;/li&gt;
&lt;li&gt;Bierze pod uwagę aktualny stan rozwoju techniki&lt;/li&gt;
&lt;li&gt;Umożliwia prace rozwojowe związane z postępem technologicznym&lt;/li&gt;
&lt;li&gt;Jest zrozumiała dla wykwalifikowanego specjalisty, który nie brał udziału w jej opracowywaniu&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;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).&lt;/li&gt;
&lt;/ol&gt;&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>Gmail - film zza kulis</title>
   <link href="http://room-303.com/blog/2007/08/04/gmail-film-zza-kulis/"/>
   <updated>2007-08-04T14:21:14+00:00</updated>
   <id>http://room-303.com/blog/2007/08/04/gmail-film-zza-kulis</id>
   <content type="html">&lt;p&gt;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.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;object type=&quot;application/x-shockwave-flash&quot; data=&quot;http://www.youtube.com/v/VfDW7qAdFGk&amp;amp;rel=1&quot; height=&quot;350&quot; width=&quot;425&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/VfDW7qAdFGk&amp;amp;rel=1&quot; /&gt;&amp;lt;/param&amp;gt;&lt;/object&gt;&lt;/p&gt;

&lt;p&gt;Kliknięcie w specjalny odnośnik, umieszczony w prawym górnym rogu interfejsu Gmaila, przenosi nas do &lt;a href=&quot;http://mail.google.com/mail/help/intl/pl/gmail_video.html&quot;&gt;specjalnej strony&lt;/a&gt;. Możemy tam przeczytać o pomyśle, znaleźć &lt;a href=&quot;http://mail.google.com/mail/help/gmail_envelope.pdf&quot;&gt;wzór koperty do wydrukowania&lt;/a&gt; i obejrzeć już nadesłane urywki oraz trailer przygotowany przez Google.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>List do Polskiego Komitetu Normalizacyjnego</title>
   <link href="http://room-303.com/blog/2007/07/27/list-do-polskiego-komitetu-normalizacyjnego/"/>
   <updated>2007-07-27T14:49:02+00:00</updated>
   <id>http://room-303.com/blog/2007/07/27/list-do-polskiego-komitetu-normalizacyjnego</id>
   <content type="html">&lt;p&gt;Pewnie widzieliście już &lt;a href=&quot;http://7thguard.net/news.php?id=5649&quot;&gt;newsa na stronie 7thGuard&lt;/a&gt;? Członkowie Komitetu zdają się sugerować, że ich decyzja zależy od opinii uzyskanych od firm, zamiast od sensowności zgłoszonego projektu.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;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.&lt;/p&gt;


	&lt;p&gt;Szanowni Państwo,&lt;/p&gt;


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


	&lt;p&gt;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].&lt;/p&gt;


	&lt;p&gt;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.&lt;/p&gt;


	&lt;p&gt;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].&lt;/p&gt;


	&lt;p&gt;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.&lt;/p&gt;


	&lt;p&gt;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.&lt;/p&gt;


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


	&lt;p&gt;Z wyrazami szacunku,&lt;/p&gt;


	&lt;p&gt;-- &lt;/p&gt;

&lt;p&gt;Patryk Zawadzki &amp;lt;patrys@pld-linux.org&amp;gt;&lt;br /&gt;programista, pasjonat informatyki, deweloper PLD Linux Distribution&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Zawiodła mnie tylko reakcja człowieka, którego bardzo szanuję:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;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.&lt;/p&gt;&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>Jabber i Fotka kontra naród</title>
   <link href="http://room-303.com/blog/2007/07/26/jabber-i-fotka-kontra-narod/"/>
   <updated>2007-07-26T19:09:59+00:00</updated>
   <id>http://room-303.com/blog/2007/07/26/jabber-i-fotka-kontra-narod</id>
   <content type="html">&lt;p&gt;Dziś rano &lt;a href=&quot;http://www.fotka.pl/forum/read.php?f=11&amp;amp;t=381388&quot;&gt;Fotka uruchomiła swój serwer Jabbera&lt;/a&gt;. Nie korzystam z Fotki, więc jest to dla mnie tylko ciekawostka, że powoli dobrze się w Sieci dzieje. Ważny jest za to sam powyższy wątek.&lt;/p&gt;

&lt;p&gt;Targetem Fotki są młodzi ludzie, raczej niespecjalnie zainteresowani technologią (w przeciwnym wypadku używali by Flickra :P). Wiadomość powinna ich ucieszyć, bo dostali dostęp do narzędzia, które może im uatrakcyjnić korzystanie z serwisu (mówimy o środowisku, gdzie prywatne wiadomości są używane częściej niż poczta elektroniczna). Ich reakcja na pomysł przypomina raczej obrady sejmu albo strajk pielęgniarek. Dlaczego?&lt;/p&gt;

&lt;p&gt;Problemem jest użyteczność podanej informacji. Pierwszy post w wątku informuje, że uruchomiona została nowa usługa i można za jej pomocą wysyłać prywatne wiadomości. Po więcej informacji ludzie odsyłani są na Wikipedię. W czym problem? Z punktu widzenia nastolatka wygląda to tak: &lt;q&gt;oTpaLiLiśMy nOwoM rZecZ — eGleBeglE, pOpszEs kTurE mOrzNa wYsYlaCi pW, kTure jUsh mI DziAuaJom SłiTaśNiE bEs tEgO.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Brakuje jakiejkolwiek informacji o potencjalnych korzyściach. Nawet start jest utrudniony, bo notka zawiera adres serwera bez słowa komentarza i — jak wynika z lektury wątku — większość ludzi wpisuje go w adres przeglądarki. Dla nich &lt;q&gt;Internet&lt;/q&gt; równa się &lt;q&gt;niebieska litera 'e' na pulpicie.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Wielkie brawa dla ekipy Fotki za wprowadzenie nowej usługi i wielka szkoda, że została przedstawiona potencjalnym użytkownikom w tak lakoniczny i ociekający informatyką sposób. Uczmy się zatem na cudzych błędach i starajmy, by &lt;q&gt;gratisy&lt;/q&gt; nie odstraszały klientów ;)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Kiedy wykopiesz węża ze sklerozą...</title>
   <link href="http://room-303.com/blog/2007/07/25/kiedy-wykopiesz-weza-ze-skleroza/"/>
   <updated>2007-07-25T00:43:28+00:00</updated>
   <id>http://room-303.com/blog/2007/07/25/kiedy-wykopiesz-weza-ze-skleroza</id>
   <content type="html">&lt;p&gt;Zupełnie nie rozumiem, czemu &lt;a href=&quot;http://www.wykop.pl/link/22481/odsmiecanie-pamieci-w-pythonie&quot;&gt;na Wykop&lt;/a&gt; trafił &lt;a href=&quot;http://www.pydev.pl/?p=29&quot;&gt;artykuł o odśmiecaniu pamięci w Pythonie&lt;/a&gt;, wiem za to, że jest to świetna okazja, żeby się nad nim nieco popastwić. Zacznijmy od tego, że Python nie kończy się niemą samogłoską i nie odmieniamy go z apostrofem.&lt;/p&gt;

&lt;p&gt;W przydługim wstępie do jeszcze dłuższego tekstu czytamy, że Python jest językiem. Świetnie. Zastanawiam się w tym momencie, jaki jest &lt;q&gt;target audience&lt;/q&gt; owego dzieła, zanosi się bowiem na wykład dla początkujących. Po przecinku atakuje nas jednak automatyczna alokacja pamięci (i co to właściwie znaczy &lt;q&gt;automatyczna&lt;/q&gt; — alokacja następuje wtedy, kiedy programista tworzy nowy obiekt).&lt;/p&gt;

&lt;p&gt;Atakuje bez uprzedzenia, wypadałoby chociaż wspomnieć, że w językach niższego poziomu istnieją specjalne operatory i wymagane jest jawne zarządzanie zasobami. W Pythonie (w Javie, PHP…) nie jest wymagane jawne usuwanie obiektów, to prawda. Nie zgodzę się jednak z podsumowaniem, że główną zaletą tego rozwiązania jest fakt, że programiści &lt;q&gt;nie muszą się martwić o zabezpieczenie pamięci.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Główną zaletą posiadania dużego trawnika nie jest możliwość rzadszego sprzątania po swoim psie, tak zbieranie psich bobków, jak pilnowanie zakresów buforów jest świętym obowiązkiem programisty i żaden język go w tym nie wyręczy. Autor tego akapitu chyba nigdy nie próbował napisać w C odpowiednika &lt;code&gt;alaMaKota = ' '.join(('Ala', 'ma', 'kota'))&lt;/code&gt;, gdyby spróbował, to wiedziałby, co jest główną zaletą. &lt;em&gt;Przejrzystość kodu&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Podsumowując wstęp, Python nie jest &lt;q&gt;wymarzonym narzędziem dla programisty.&lt;/q&gt; Python jest jednym z języków i — jak każdy z języków (nie zaczynających się słowem &lt;q&gt;visual&lt;/q&gt;) — nadaje się do jednych rzeczy, a nie nadaje do innych. Nie wiem też, jakie powinienem mieć oczekiwania względem procesu śmieciarza, ale praktyka każe mi usuwać duże zbędne obiekty niezależnie od używanego języka.&lt;/p&gt;

&lt;p&gt;Dalej mamy całą masę oderwanej od przykładów teorii. Wystarczyłoby powiedzieć, że z odśmiecaniem pamięci wiążą się trzy potencjalne problemy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fragmentacja pamięci, która powoduje, że tworzenie dużych ciągłych struktur staje się bardzo kosztowne,&lt;/li&gt;
&lt;li&gt;wykrywanie wysp, czyli obiektów odwołujących się do siebie nawzajem, ale oderwanych od aktualnego stanu programu,&lt;/li&gt;
&lt;li&gt;przechowywanie obiektów, które często zmieniają swój rozmiar, na przykład typów numerycznych o nieskończonej precyzji.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Resztę można sprowadzić do stwierdzenia (którego w artykule brak, co oznacza, że ze swoim tytułem nie ma nic wspólnego), że CPython radzi sobie z wszystkimi trzema wymienionymi powyżej. Ni więcej, ni mniej. Żadnej alokacji, dzielenia stosu ani tablic uchwytów przywoływać tu nie trzeba, bo — za przeproszeniem — robi się burdel, a nic z tego nie wynika.&lt;/p&gt;

&lt;p&gt;Podsumowując, możesz w Pythonie programować tak samo jak w Javie albo Rubym i wcale nie musisz z głowy recytować algorytmu śmieciarza. Genialne, tylko o czym był ten artykuł i po co trafił na Wykop?&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>10przykazan jeszcze nie umarło</title>
   <link href="http://room-303.com/blog/2007/07/24/10przykazan-jeszcze-nie-umarlo/"/>
   <updated>2007-07-24T21:52:38+00:00</updated>
   <id>http://room-303.com/blog/2007/07/24/10przykazan-jeszcze-nie-umarlo</id>
   <content type="html">&lt;p&gt;Właśnie skończyłem kolejny raz przepisywać kod &lt;a href=&quot;http://10przykazan.com/&quot;&gt;10przykazan&lt;/a&gt;. Wyleciał zupełnie leciwy — i wielokrotnie łatany — &lt;a href=&quot;http://magpierss.sourceforge.net/&quot;&gt;MagpieRSS&lt;/a&gt;, zastąpiły go curl i &lt;a href=&quot;http://pear.php.net/package/XML_Feed_Parser&quot;&gt;XML Feed Parser&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Skutek zauważyć łatwo, bo wróciły do łask blogi, z których notki niechętnie trafiały do serwisu. W związku z tym proszę, żeby zgłaszać mi ewentualne usterki, a postaram się je poprawić, zanim przepiszę kod po raz kolejny.&lt;/p&gt;

&lt;p&gt;Kolejna aktualizacja kodu prawdopodobnie będzie oznaczać schyłek ery &lt;abbr title=&quot;PHP Hypertext Preprocessor&quot;&gt;PHP&lt;/abbr&gt; i dominację niezastąpionego &lt;a href=&quot;http://www.djangoproject.com/&quot;&gt;Django&lt;/a&gt;. Termin nie jest jeszcze ustalony, ale spodziewajcie się zmian w ciągu trzech-czterech tygodni.&lt;/p&gt;

&lt;p&gt;Uprzedzając pytania, tak, dodamy kolejne blogi, ale prawdopodobnie dopiero po reinkarnacji serwisu. W tej chwili wolny czas poświęcam głównie na walkę z tysiącem różnych odstępstw od standardów &lt;abbr title=&quot;Really Simple Syndication&quot;&gt;RSS&lt;/abbr&gt; i ATOM, które można spotkać na blogach już u nas goszczących.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Hardware4Linux</title>
   <link href="http://room-303.com/blog/2007/07/19/hardware4linux/"/>
   <updated>2007-07-19T17:32:24+00:00</updated>
   <id>http://room-303.com/blog/2007/07/19/hardware4linux</id>
   <content type="html">&lt;p&gt;Jest sobie taki skromny projekt, którego jedynym zadaniem jest zbieranie informacji o twoich komputerach. &lt;a href=&quot;http://hardware4linux.info/&quot;&gt;Hardware4Linux&lt;/a&gt;, bo o nim mowa, to centralna baza informacji o kompatybilności przeróżnego sprzętu z Linuksem.&lt;/p&gt;

&lt;p&gt;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 &lt;abbr title=&quot;Hardware Abstraction Layer&quot;&gt;HAL&lt;/abbr&gt;, czy poszczególne dystrybucje.&lt;/p&gt;

&lt;p&gt;Jeśli używasz Linuksa i masz chwilę czasu, to zachęcam do zbudowania sobie pakietu &lt;code&gt;hwreport&lt;/code&gt; 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.&lt;/p&gt;

&lt;p&gt;Cała procedura wygląda tak:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Budujemy (lub pobieramy) pakiet &lt;code&gt;hwreport&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Z prawami roota wykonujemy &lt;code&gt;hwreport /tmp/report&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Zakładamy konto w serwisie&lt;/li&gt;
&lt;li&gt;Uploadujemy plik &lt;code&gt;/tmp/report.tar.bz2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Oceniamy wybrane składniki&lt;/li&gt;
&lt;li&gt;Cieszymy się z dobrego uczynku i liczymy na sławę, kobiety lub wygraną w totka&lt;/li&gt;
&lt;/ol&gt;
</content>
 </entry>
 
 <entry>
   <title>Nadchodzi dobre</title>
   <link href="http://room-303.com/blog/2007/07/10/nadchodzi-dobre/"/>
   <updated>2007-07-10T13:34:43+00:00</updated>
   <id>http://room-303.com/blog/2007/07/10/nadchodzi-dobre</id>
   <content type="html">&lt;p&gt;Z niecierpliwością czekam na kilka wydań:&lt;/p&gt;

&lt;h4&gt;Ekiga&lt;/h4&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://blog.ekiga.net/?p=61&quot;&gt;&lt;img src=&quot;http://blog.ekiga.net/wp-content/uploads/2007/05/presence.png&quot; alt=&quot;Ekiga&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blog.ekiga.net/?p=61&quot;&gt;Nowa wersja&lt;/a&gt; — 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.&lt;/p&gt;

&lt;h4&gt;Banshee&lt;/h4&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://abock.org/2007/06/29/you-can-cast-more-than-one-vote/&quot;&gt;&lt;img src=&quot;http://abock.org/blog-images/banshee-ng-thumb.png&quot; alt=&quot;Banshee&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://abock.org/2007/06/29/you-can-cast-more-than-one-vote/&quot;&gt;Nowa wersja&lt;/a&gt; jest jeszcze szybsza we współpracy z dużymi bibliotekami mediów, a interfejs sprawia, że &lt;a href=&quot;http://www.gnome.org/projects/rhythmbox/&quot;&gt;Rhythmbox&lt;/a&gt; może się schować i już planować nowe wydanie.&lt;/p&gt;

&lt;h4&gt;HAL Quirks&lt;/h4&gt;

&lt;p&gt;Obrazka nie będzie, bo nie ma co pokazywać. Interesuje mnie przede wszystkim projekt &lt;a href=&quot;http://people.freedesktop.org/%7Ehughsient/quirk/quirk-keymap-index.html&quot;&gt;naprawienia klawiszy multimedialnych pod Linuksem&lt;/a&gt;. Komplet sterowników dla laptopów poszczególnych producentów i pakiet &lt;code&gt;hal-info&lt;/code&gt; wystarczą, by wszystkie przyciski na klawiaturach były w końcu dostępne z poziomu GNOME i KDE. Właśnie pracujemy nad Asusami.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Jeszcze raz o wykrywaniu przeglądarek</title>
   <link href="http://room-303.com/blog/2007/07/05/jeszcze-raz-o-wykrywaniu-przegladarek/"/>
   <updated>2007-07-05T10:36:05+00:00</updated>
   <id>http://room-303.com/blog/2007/07/05/jeszcze-raz-o-wykrywaniu-przegladarek</id>
   <content type="html">&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/724894541/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm2.static.flickr.com/1304/724894541_c47a408009.jpg&quot; alt=&quot;Bullsh*t  in buzzword&quot; height=&quot;313&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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 &lt;abbr title=&quot;Cascading Style Sheets&quot;&gt;CSS&lt;/abbr&gt;, 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™.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Po pierwsze, nigdy nie przetestujesz aplikacji w każdej konfiguracji &lt;q&gt;przeglądarka + system operacyjny.&lt;/q&gt; 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.&lt;/p&gt;

&lt;p&gt;Po drugie, wyrzucanie gości, jeszcze zanim przekroczyli próg, to bardzo niegrzeczna metoda na powiedzenie komuś &lt;q&gt;mamy was tam, gdzie słoneczko nie świeci.&lt;/q&gt; 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.&lt;/p&gt;

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

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

&lt;p&gt;Do upartych, jak autorzy pokazanego we wstępie &lt;a href=&quot;http://preview.getbuzzword.com/&quot;&gt;buzzworda&lt;/a&gt;, 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.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Poliż węża</title>
   <link href="http://room-303.com/blog/2007/06/27/poliz-weza/"/>
   <updated>2007-06-27T14:54:02+00:00</updated>
   <id>http://room-303.com/blog/2007/06/27/poliz-weza</id>
   <content type="html">&lt;p&gt;Jakbym bardzo nie szanował Pythona jako języka, tak nie sposób mi przejść obojętnie wobec tworu zwanego &lt;q&gt;Polish Python Coders Group.&lt;/q&gt; Jak wyraźnie demonstruje &lt;a href=&quot;http://www.ppcg.eu.org/index.php&quot;&gt;serwis grupy&lt;/a&gt;, zrzeszać będzie ona amatorów-entuzjastów języka &lt;abbr title=&quot;PHP Hypertext Preprocessor&quot;&gt;PHP&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;W prawej kolumnie widzimy Django, obok reklamę &lt;q&gt;Python od podstaw.&lt;/q&gt; 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 &lt;abbr&gt;PHP&lt;/abbr&gt; stoi (pozwolę sobie nie brać pod uwagę możliwości, że komuś chciałoby się dopisywać ścieżki typu &lt;code&gt;index2.php&lt;/code&gt; do &lt;code&gt;urls.py&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Z lektur polecę jeszcze podstawy &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt;, bo warstwa struktury aż prosi się o przepisanie (może tym razem bez wstawiania nagłówków w postaci plików graficznych).&lt;/p&gt;

&lt;p&gt;Podsumowując, fani Pythona, łączmy się… w bólu.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Python: libchart 0.0.3</title>
   <link href="http://room-303.com/blog/2007/06/21/python-libchart-003/"/>
   <updated>2007-06-21T18:42:24+00:00</updated>
   <id>http://room-303.com/blog/2007/06/21/python-libchart-003</id>
   <content type="html">&lt;p&gt;Dziś pojawiła się &lt;a href=&quot;http://room-303.com/blog/2007/06/06/python-libchart-ladne-wykresy/&quot;&gt;obiecana potrzeba&lt;/a&gt; i tak powstała trzecia wersja biblioteki do generowania wykresów. Tym razem nie wymaga &lt;abbr title=&quot;Python Imaging Library&quot;&gt;PIL&lt;/abbr&gt; i oparta jest w całości o &lt;a href=&quot;http://cairographics.org/pycairo/&quot;&gt;Cairo&lt;/a&gt;, a to oznacza śliczne wygładzanie krawędzi.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/582358092/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm2.static.flickr.com/1065/582358092_f76204578f.jpg&quot; alt=&quot;python-libchart 0.0.3&quot; height=&quot;300&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jak poprzednio, do pobrania ze &lt;a href=&quot;http://code.google.com/p/python-libchart/&quot; title=&quot;libchart na Google Code&quot;&gt;strony projektu&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Drodzy łebdeweloperzy...</title>
   <link href="http://room-303.com/blog/2007/06/21/drodzy-lebdeweloperzy/"/>
   <updated>2007-06-21T10:52:51+00:00</updated>
   <id>http://room-303.com/blog/2007/06/21/drodzy-lebdeweloperzy</id>
   <content type="html">&lt;p&gt;Przychodzi do was klientka. Wdrażacie jej &lt;a href=&quot;http://www.oscommerce.com/&quot;&gt;osCommerce&lt;/a&gt;. Robicie jej niedźwiedzią przysługę, ale to problem większości tak zwanych &lt;q&gt;agencji interaktywnych.&lt;/q&gt; Teraz zaczyna się wasza praca przy dostosowaniu owego wynalazku z piekła rodem. Uwaga, czytajcie mi z ruchu klawiszy…&lt;/p&gt;

&lt;p&gt;Waszym &lt;em&gt;pieprzonym obowiązkiem&lt;/em&gt; jest wykonać pracę prawidłowo, zgodnie ze sztuką i w jak najlepszym interesie klientki, która &lt;em&gt;wam za to płaci&lt;/em&gt;. Tak, to jest &lt;em&gt;obowiązek&lt;/em&gt;, a nie opcja premium, za którą się dopłaca. Tak, jak zamawiając hydraulika nie dopłacacie 100% ekstra za uszczelnienie zaworu po wymianie, tak wy nie macie prawa oddać klientowi &lt;q&gt;produktu,&lt;/q&gt; który już po chwili zaglądania za kulisy wygląda jak ledwie trójkowa praca zaliczeniowa na pierwszym semestrze studiów informatycznych.&lt;/p&gt;

&lt;p&gt;Że kod brzydko sformatowany? Nie, nie. Co powiecie na zapytanie &lt;abbr title=&quot;Structured Query Language&quot;&gt;SQL&lt;/abbr&gt;, które wykonuje się — bagatela — &lt;em&gt;piętnaście&lt;/em&gt; sekund? Nie mówię o raportach, mam na myśli zapytanie, które pobiera dane do wyświetlenia na stronie. A dlaczego potrzebuje na to ledwo ćwierć minuty? Bo jeden z drugim klepacz (to taka odmiana programisty, która przychodzi do biura o 8:01, a o 15:59 jest już w płaszczu i chwyta za klamkę) — jak to się marketingowo na stronach chwalą — &lt;q&gt;potraktował klienta indywidualnie.&lt;/q&gt; Zapewne przez to rozumieć należy &lt;q&gt;to tylko jeden klient, pewnie nikt się nie kapnie.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Całe pięć minut zajęło mi przeczytanie, mało popularnego w arystokratycznych kręgach agencyjkowych hakerów, loga &lt;q&gt;&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/slow-query-log.html&quot;&gt;slow queries&lt;/a&gt;.&lt;/q&gt; Całe dziesięć poświęciłem na dodanie prawdziwej nowinki w świecie &lt;abbr title=&quot;Relational Database Management System&quot;&gt;RDBMS&lt;/abbr&gt; — &lt;em&gt;indeksów do tabel&lt;/em&gt;. Serwis działa ponad dwa razy szybciej (przetestowane też za pomocą dostępnego tylko elicie narzędzia &lt;code&gt;ab&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Jako ciekawostkę podam, że — zapewne dla podwójnej pewności — któryś geniusz poświęcił sporo czasu na dodanie indeksu &lt;code&gt;UNIQUE&lt;/code&gt; dla każdego klucza &lt;code&gt;PRIMARY&lt;/code&gt;, który (widać niektórzy nie wiedzą) &lt;em&gt;implikuje indeksowanie dla przeszukiwania i gwarantuje unikalność&lt;/em&gt;. Nie poświęcił za to ani sekundy na dodanie oczywistych indeksów dla kolumn, które służą za klucze zewnętrzne. Prawie zewnętrzne, bo serwis korzysta z tabel &lt;code&gt;MyISAM&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Na koniec powiem, że jeśli ktoś poczuł się urażony powyższą notką, to &lt;em&gt;bardzo, kurwa, dobrze&lt;/em&gt; i powinien się w końcu nauczyć wykonywać swój zawód. Jeśli agencji nie stać na zatrudnienie kompetentnego &lt;abbr title=&quot;Database Administratora&quot;&gt;DBA&lt;/abbr&gt;, to niech się przebranżowi na robienie bannerków we Flashu, bo w programowaniu nie ma czego szukać. Cała reszta czytelników, mam nadzieję, bawiła się równie dobrze, co ja przy poprawianiu waszej fuszerki i pewnie z radością wysłałaby was na &lt;a href=&quot;http://worsethanfailure.com/&quot;&gt;Worse Than Failure&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>PHP, PCRE i nagłe zgony</title>
   <link href="http://room-303.com/blog/2007/06/19/php-pcre-i-nagle-zgony/"/>
   <updated>2007-06-19T22:53:29+00:00</updated>
   <id>http://room-303.com/blog/2007/06/19/php-pcre-i-nagle-zgony</id>
   <content type="html">&lt;p&gt;Jest wpół do drugiej w nocy. Siedzę w biurze. Serwer Apache wygląda na stabilny. Dokładnie, &lt;q&gt;wygląda.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Prawie wszystkie działające u nas aplikacje są zaimplementowane jako usługi FastCGI serwowane przez &lt;a href=&quot;http://www.lighttpd.net/&quot;&gt;Lighttpd&lt;/a&gt;. Bazy danych działają w osobnych serwerach wirtualnych, podobnie odseparowany jest Apache, który dzierży brzemię mielenia &lt;abbr title=&quot;PHP Hypertext Preprocessor&quot;&gt;PHP&lt;/abbr&gt; i przedzierania się przez gąszcze plików &lt;code&gt;.htaccess&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Wszystko byłoby pięknie, gdyby Apache nie zaczął sobie chodzić na spacerek do krainy wiecznych łowów (jak to Indianie mają w zwyczaju czynić po &lt;code&gt;SIGSEGV&lt;/code&gt;). Szybki (błyskawiczny rzekłbym, ale to nie prawda) &lt;code&gt;strace&lt;/code&gt; i końcówka &lt;code&gt;gdb&lt;/code&gt; pokazały, że ślad urywa się gdzieś w &lt;abbr&gt;PHP&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;Następny test — przestawienie &lt;abbr&gt;PHP&lt;/abbr&gt; z &lt;code&gt;mod_php&lt;/code&gt; (użytkownicy nie mają dostępu do kodu serwisów, więc nie bawiliśmy się w żadne separacje użytkowników) na &lt;abbr title=&quot;Common Gateway Interface&quot;&gt;CGI&lt;/abbr&gt;. Tym razem dzielny serwer przetrwał, w przeciwieństwie do skryptu. Kolejny &lt;code&gt;strace&lt;/code&gt; i &lt;code&gt;gdb&lt;/code&gt; na symulowanym środowisku &lt;abbr&gt;CGI&lt;/abbr&gt; (w bardzo wysublimowany sposób — &lt;code&gt;export QUERY_STRING=…&lt;/code&gt; i tak dalej) i okazuje się, że zdycha jednak biblioteka implementująca &lt;abbr title=&quot;Perl Compatible Regular Expressions&quot;&gt;PCRE&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;Dużo Google. Bardzo dużo. W końcu pomaga &lt;a href=&quot;http://qwiat.icenter.pl/&quot;&gt;Qwiat&lt;/a&gt;. Miał to samo, pomógł downgrade pakietu &lt;code&gt;pcre&lt;/code&gt; do wersji 6.7. Przebudowa wspomnianego pakietu we wspomnianej wersji, upgrade w vserwerze, restart usług. Działa. Nieźle się maskuje.&lt;/p&gt;

&lt;p&gt;Kod serwisów zdaje się działać bez zarzutu. Chciałem zarzucić temat, ale obiecałem znaleźć syntetyczny testcase. Więcej Google. Na liście błędów &lt;code&gt;pcre&lt;/code&gt; jest znana podatność na przepełnienie stosu. Autorzy zdają się mieć ją w dużym poważaniu. Wersja 7.x zdycha, wersja 6.x działa. A takiego.&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;?php
print 'A teraz coś z zupełnie innej beczki: ';
preg_match('/(.(?!b))*/', str_repeat(&quot;a&quot;, 10000));
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Powyższy kod położył mi każdą kombinację &lt;abbr&gt;PHP&lt;/abbr&gt; i &lt;abbr&gt;PCRE&lt;/abbr&gt;. Bardzo ładny sposób, żeby komuś zrobić &lt;abbr title=&quot;Denial Of Service&quot;&gt;DOS&lt;/abbr&gt; na &lt;abbr&gt;PHP&lt;/abbr&gt; działające w trybie FastCGI (po n-tym padzie usługi w krótkim czasie serwer słusznie uzna, że jest uszkodzona i przestanie ją wskrzeszać, przynajmniej na jakiś czas).&lt;/p&gt;

&lt;p&gt;I tym optymistycznym akcentem zakończę swoje gadanie od rzeczy i udam się do domu spać.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>123-reg</title>
   <link href="http://room-303.com/blog/2007/06/12/123-reg/"/>
   <updated>2007-06-12T11:11:01+00:00</updated>
   <id>http://room-303.com/blog/2007/06/12/123-reg</id>
   <content type="html">&lt;p&gt;Serdecznie polecam usługi brytyjskiego serwisu &lt;a href=&quot;http://123-reg.co.uk/&quot;&gt;123-reg.co.uk&lt;/a&gt;. Kilka największych zalet poniżej:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;zmiana delegacji &lt;attr title=&quot;Domain Name Servers&quot;&gt;DNS&lt;/attr&gt; działa tylko dla niektórych naszych domen;&lt;/li&gt;
&lt;li&gt;dla pozostałych nie ma nawet możliwości podania adresów &lt;abbr title=&quot;Inernet Protocol&quot;&gt;IP&lt;/abbr&gt;, od razu dostajemy błąd;&lt;/li&gt;
&lt;li&gt;nie odpisują na żadne zgłoszenie powyższego błędu przez e-mail;&lt;/li&gt;
&lt;li&gt;ich wsparcie techniczne to specjalna infolinia, każda minuta połączenia kosztuje grube pieniądze, łącznie z czterdziestoma minutami oczekiwania na zgłoszenie się operatora;&lt;/li&gt;
&lt;li&gt;kiedy już się poddaliśmy, zgubili ticket transferowy z &lt;a href=&quot;http://www.godaddy.com/&quot;&gt;GoDaddy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Na koniec jeszcze raz, serdecznie polecam.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Religijnie: 10 przykazań i władza nad demonami</title>
   <link href="http://room-303.com/blog/2007/06/10/religijnie-10-przykazan-i-wladza-nad-demonami/"/>
   <updated>2007-06-10T19:51:30+00:00</updated>
   <id>http://room-303.com/blog/2007/06/10/religijnie-10-przykazan-i-wladza-nad-demonami</id>
   <content type="html">&lt;p&gt;Ostatnie dni stanowiły dla mnie nieprzerwane pasmo imprez&amp;hellip; wróć! Nieprzerwane pasmo pracy z kodem. A właściwie to jedno i drugie, Python jest tak wygodny, że nawet przy kilku projektach pozostaje czas na imprezy.&lt;/p&gt;

&lt;p&gt;O Pythonie za chwilę, najpierw jednak o &lt;abbr title=&quot;PHP Hypertext Preprocessor&quot;&gt;PHP&lt;/abbr&gt;. Wróciło &lt;a href=&quot;http://10przykazan.com/&quot;&gt;10przykazan&lt;/a&gt;, po 9 dniach awarii. Długa przerwa, ale głównym problemem był dostęp do internetu. Trzeba wam bowiem wiedzieć, że 1. &lt;del&gt;marca&lt;/del&gt; &lt;ins&gt;kwietnia&lt;/ins&gt; (więcej kawy) przeprowadziłem się do nowego mieszkania i do dziś nie udało się nam podpisać umowy z żadnym dostawcą. Ale nie o tym chciałem pisać, okazało się, że przyczyną problemu jest &lt;a href=&quot;http://bugs.php.net/bug.php?id=41293&quot;&gt;&lt;abbr&gt;PHP&lt;/abbr&gt; w wersji 5.2.2, które psuje biblioteki &lt;abbr title=&quot;Remote Procedure Call&quot;&gt;RPC&lt;/abbr&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;W wolnym czasie zacząłem też eksperymentować z własną implementacją niesławnego pakietu &lt;a href=&quot;http://cr.yp.to/daemontools.html&quot;&gt;daemontools&lt;/a&gt;. O działalności &lt;a href=&quot;http://cr.yp.to/djb.html&quot;&gt;djb&lt;/a&gt; słyszeli chyba wszyscy, a niezorientowanych pozostawię na pastwę Google, bo i szukać nie trzeba długo.&lt;/p&gt;

&lt;p&gt;W &lt;a href=&quot;http://itsltd.eu/&quot;&gt;ITS Ltd.&lt;/a&gt; używamy daemontools do zarządzania usługami &lt;abbr title=&quot;Fast Common Gateway Interface&quot;&gt;FCGI&lt;/abbr&gt;. Wszystko byłoby dobrze, gdyby nie fakt, że od czasu do czasu (po zmianie kodu na serwerze) trzeba taką usługę zrestartować, a czasem i zatrzymać na dłużej. Cóż, daemontools pozwala to zrobić tylko rootowi z poziomu konsoli.&lt;/p&gt;

&lt;p&gt;Pakiet wygląda na martwy, za trzy tygodnie kończy się jego &lt;a href=&quot;http://cr.yp.to/distributors.html&quot;&gt;licencja redystrybucji&lt;/a&gt;. Mój nowy projekt poboczny to próba odtworzenia schematu działania oryginału za pomocą odrobiny Pythona. Przy okazji dodałem nieco interfejsów &lt;a href=&quot;http://www.freedesktop.org/Software/dbus&quot;&gt;D-Bus&lt;/a&gt;. Zainteresowanych wczesnymi testami zapraszam na &lt;a href=&quot;http://code.google.com/p/daemontools-ng/&quot;&gt;stronę daemontools-ng&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Python + libchart = ładne wykresy</title>
   <link href="http://room-303.com/blog/2007/06/06/python-libchart-ladne-wykresy/"/>
   <updated>2007-06-06T10:36:01+00:00</updated>
   <id>http://room-303.com/blog/2007/06/06/python-libchart-ladne-wykresy</id>
   <content type="html">&lt;p&gt;Długo szukaliśmy sensownej biblioteki, która pozwoli nam narysować prosty wykres kołowy, nie zajmuje pół mega i w trakcie działania nie uruchamia zewnętrznego konwertera PostScriptu. Idealny kandydat powinien do tego mieć sensowne &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;W końcu znudziło mi się szukanie i siadłem do klawiatury. Przypomniałem sobie o świetnej bibliotece &lt;a href=&quot;http://naku.dohcrew.com/libchart/pages/introduction/&quot;&gt;libchart&lt;/a&gt;, której używamy w &lt;a href=&quot;http://wego.pl/&quot;&gt;Wego CMS&lt;/a&gt; i postanowiłem ją odtworzyć w Pythonie.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/533108759/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm2.static.flickr.com/1256/533108759_51b59c469b.jpg&quot; width=&quot;500&quot; height=&quot;300&quot; alt=&quot;Charting in python with libchart&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Powyżej widać efekt 3 godzin mojej pracy. Kod do działania wymaga &lt;a href=&quot;http://www.pythonware.com/products/pil/&quot;&gt;Python Imaging Library&lt;/a&gt; i jest objęty licencją &lt;a href=&quot;http://www.gnu.org/licenses/lgpl.html&quot;&gt;LGPL&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Pobierz &lt;a href=&quot;http://code.google.com/p/python-libchart/&quot;&gt;ze strony projektu&lt;/a&gt; i podziękuj firmie &lt;a href=&quot;http://itsltd.eu/&quot;&gt;ITS Ltd.&lt;/a&gt; za jego sfinansowanie ;). Wersja 0.0.1 oferuje tylko wykresy kołowe, pozostałe typy pojawią się w miarę potrzeb naszych klientów.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Opera guys have the balls</title>
   <link href="http://room-303.com/blog/2007/06/04/opera-guys-have-the-balls/"/>
   <updated>2007-06-04T10:37:40+00:00</updated>
   <id>http://room-303.com/blog/2007/06/04/opera-guys-have-the-balls</id>
   <content type="html">&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/529513626/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm2.static.flickr.com/1131/529513626_8b5b89f7b4.jpg&quot; alt=&quot;Opera guys have the balls&quot; height=&quot;375&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
Nowy produkt Opery — Opera Stress Reliever™ Limited Beta&lt;/p&gt;

&lt;p&gt;Razem z &lt;a href=&quot;http://paweltkaczyk.midea.pl/&quot;&gt;Marvelem&lt;/a&gt; zostaliśmy zaproszeni na ekskluzywną konferencję Opera Software, gdzie zaprezentowano nam nowy produkt do walki ze stresem w biurze. Urządzenie, które było bohaterem prezentacji, jest reklamowane hasłem &lt;q&gt;gdziekolwiek jesteś, walcz ze stresem,&lt;/q&gt; postanowiliśmy je więc poddać testom w warunkach typowo bojowych, w kwaterze &lt;a href=&quot;http://itsltd.eu/&quot;&gt;ITS Ltd.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Zgodnie z obietnicą producenta, urządzenie — mimo wczesnej fazy beta — równie dobrze leży na komputerach typu desktop, co na urządzeniach mobilnych. Przebadaliśmy je za pomocą biurowych komputerów Dell OptiPlex 745, mojego prywatnego laptopa Asus A6Km oraz na telefonach Sony Ericsson K700i i K750. Jedyne trudności sprawiło nam umieszczenie go na obudowie obecnej w czasie prezentacji  konsoli Wii firmy Nintendo. Obecni na miejscu deweloperzy z wrocławskiego biura Opera Software zapewnili nas jednak, że obsługa Wii jest dopiero w fazie rozwojowej i również ta platforma będzie w pełni obsługiwana nim produkt trafi do użytkowników domowych. Po powrocie do domu postaram się również przetestować zgodność z konsolą Sony PlayStation 2, choć ta nie znajdowała się na liście urządzeń oficjalnie wspieranych.&lt;/p&gt;

&lt;p&gt;Pracownicy Opery zapewniali nas, że urządzenia cechuje wspólne zunifikowane jądro, dlatego postanowiliśmy przetestować jego odporność na mechaniczne uszkodzenia. Najpierw upuściliśmy urządzenie z wysokości jednego metra, co odpowiada zsunięciu z typowego biurka lub niskiej szafki.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/529513618/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm2.static.flickr.com/1078/529513618_a2b8efa0ed.jpg&quot; alt=&quot;1 meter above the ground&quot; height=&quot;500&quot; width=&quot;375&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Następnie powtórzyliśmy próbę dla wysokości typowego regału biurowego, zwiększając wysokość do półtora metra.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/529513622/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/189/529513622_b7797b2fce.jpg&quot; alt=&quot;1.5 meter above the ground&quot; height=&quot;500&quot; width=&quot;375&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Oba testowane przez nas urządzenia nie wykazywały najmniejszych śladów zewnętrznych uszkodzeń. Co więcej, funkcjonowały przez cały czas przeprowadzania testu z fabryczną dokładnością.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/529513624/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm2.static.flickr.com/1063/529513624_6bff6273f0.jpg&quot; alt=&quot;After hitting ground&quot; height=&quot;375&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Takiej stabilności konkurencja może Operze tylko pozazdrościć. Trzeba również zauważyć, że produkt Opery wymagał do działania znacznie mniej miejsca i siły niż wiodące obecnie na rynku produkty konkurentów.&lt;/p&gt;

&lt;p&gt;A tak poważnie, to byliśmy dzisiaj na konferencji prasowej związanej z oficjalnym ogłoszeniem działalności wrocławskiego biura Opery. Było bardzo kameralnie, w niedużej salce konferencyjnej znaczącą część widowni stanowili pracownicy biura.&lt;/p&gt;

&lt;p&gt;Rozpoczął Jon von Tetzchner (przepraszam, jeśli przekręciłem nazwisko), prezes i założyciel firmy. Opowiadał o historii firmy, o tym jak z prowadzonej przez dwie osoby, jednoplatformowej konkurencji Mosaic zmienili się w czterystuosobową firmę, której produkt działa na niemal każdym systemie operacyjnym. Powiedział też, że wierzą w jedną Sieć, w której nie ma miejsca na &lt;abbr title=&quot;Wireless Application Protocol&quot;&gt;WAP&lt;/abbr&gt;. I nie sposób się z nim nie zgodzić.&lt;/p&gt;

&lt;p&gt;Wspomniane czerwone piłeczki znakomicie ułatwiały rozładowanie stresu związanego z koniecznością słuchania tłumaczki, która interpretacją wypowiadanych słów nie ustępowała swym telewizyjnym kolegom. Dowiedzieliśmy się więc, że &lt;q&gt;ninety five per cent&lt;/q&gt; oznacza jedną czwartą a &lt;q&gt;1500 sign-ups&lt;/q&gt; to półtora tysiąca odwiedzin.&lt;/p&gt;

&lt;p&gt;Dalej jeden z pracowników polskiego oddziału opowiadał o przyczynach wyboru Wrocławia na siedzibę. Współczuję mu nieco, bo o ile mówił sensownie, to ręcę mu się trzęsły tak, że pilotem od Wii ledwo trafiał w przyciski. Z Marvelem przez chwilę chcieliśmy go też wypromować na księdza, kiedy to zaczął mówić, jakby miał &lt;q&gt;word-spacing: 2em.&lt;/q&gt; Wygląda na to, że jako mówca został wybrany spośród grona pracowników metodą najkrótszej słomki ;)&lt;/p&gt;

&lt;p&gt;Było bardzo miło, na koniec ucięliśmy sobie pogawędkę z programistami z wrocławskiego biura. Pożartowaliśmy chwilę i przyszło nam wracać do pracy. Przez to ominął nas, niestety, poczęstunek. I o ile z bólem serca, ale zniosę niemożność kontynuacji rozmów kuluarowych, o tyle odżałować nie mogę kawy i ciastek. Wracam więc do pracy, głodny.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>PLD, poldek and vendor locks</title>
   <link href="http://room-303.com/blog/2007/05/30/pld-poldek-and-vendor-locks/"/>
   <updated>2007-05-30T18:16:52+00:00</updated>
   <id>http://room-303.com/blog/2007/05/30/pld-poldek-and-vendor-locks</id>
   <content type="html">&lt;p&gt;This post will be entirely in English but feel free to comment in Polish if you want. The reason is my laziness as I need to provide an English translation anyway and it's just easier to write one version instead of two.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Troll warning:&lt;/strong&gt; I am sane and have spent more than &lt;a href=&quot;http://cia.vc/stats/author/patrys&quot;&gt;last 3 years&lt;/a&gt; actively &lt;em&gt;developing&lt;/em&gt; PLD Linux. If you want to tell me to shut up, you better find something to support your statements.&lt;/p&gt;

&lt;h4&gt;The problem&lt;/h4&gt;

&lt;p&gt;Or several problems really:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The first and most obvious one is poldek still has some bugs.&lt;/li&gt;
&lt;li&gt;That in turn is caused by the fact that noone is working on poldek any more.&lt;/li&gt;
&lt;li&gt;The above is caused by poldek's poor source code documentation.&lt;/li&gt;
&lt;li&gt;That in fact is because there is only one author and maintainer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And sure all the above may not seem immediate. That is, until you realize Mis (Paweł Gajda) &amp;mdash; despite having good intentions &amp;mdash; can no longer spend his time actively working on the project. It might not be obvious at first but check the spec in our CVS. The last snapshot was taken four months ago and we already have 6 patches on top of that. This is not bad if we are talking about an upstream project. But here upstream is actually us.&lt;/p&gt;

&lt;p&gt;I am afraid that one day we might be unable to follow rpm in terms of both features and compatibility. There are some people today who know C well enough to hack on the sources and a small percentage of them is actually capable of understanding poldek's internals but one day there may be none.&lt;/p&gt;

&lt;p&gt;But the problems don't end here. Poldek was a marvellous tool back when it was created. In the dark ages of early apt we already had an interactive tool to use. But today the situation is quite different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fedora/RHEL are actively working on yum.&lt;/li&gt;
&lt;li&gt;Gentoo is actively maintaining emerge.&lt;/li&gt;
&lt;li&gt;Debian/Ubuntu have their apt and synaptic&lt;/li&gt;
&lt;li&gt;We still have the same poldek with no one to maintain it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And there's more. In particular libpoldek and python-poldek need to be completely redesigned to become usable in something even resembling a GUI tool. And there are some dependency interpretation issues too. More details further below.&lt;/p&gt;

&lt;h4&gt;The solution&lt;/h4&gt;

&lt;p&gt;I can see two solutions here. The first and most obvious is to find a new active maintainer and programmer for poldek. Sign up today, lots of fun and joy awaits you as you enter the abandoned world. There are some things to fix, some to refactor and maybe a little set of desired new features too.&lt;/p&gt;

&lt;p&gt;The other solution is to introduce a new package manager with equal rights to those of poldek. That means keeping it up to date and making sure it always works. I've already taken the first step and PLD now has basic yum compatibility. There are yum repositories, there is yum and yumex — a nice little GUI tool to help all desktop users out there. This way we can avoid being chained to a single tool that in future could turn into a single point of failure.&lt;/p&gt;

&lt;p&gt;However adding yum is not enough as there is something more…&lt;/p&gt;

&lt;h4&gt;Poldek's architecture&lt;/h4&gt;

&lt;p&gt;Long time ago in the galaxy not so far away a tool was created to aid package management. It was called poldek and it relied and still relies on a broken idea of calling rpm directly instead of using proper librpm bindings. This in turn forced poldek to reinvent a mechanism for dependency checks.&lt;/p&gt;

&lt;p&gt;Most tools just pass the list of packages to librpm and the library in turn asks them what to do in specific cases (like unsatisfied deps or file conflicts). Poldek needed external one because there was no way to ask the rpm binary for anything and get usable feedback. It was either a success or a failure so every single check in rpm had to be doubled in poldek's code to detect all errors before asking rpm to jump in and do its job.&lt;/p&gt;

&lt;p&gt;Then the High Council of One decided it was worth caching the rpm's database in yet another database but this time using a different schema. That's why poldek takes up to several minutes on some machines every other restart (when you see a &lt;q&gt;rebuilding rpm database&lt;/q&gt; message).&lt;/p&gt;

&lt;p&gt;The result? Yum's sources take as much as 2.4MB versus 35MB for poldek.&lt;/p&gt;

&lt;h4&gt;Inconsistent dependency checks&lt;/h4&gt;

&lt;p&gt;There are some problems adapting any other tool for PLD however. The reason is that for quite a long time noone bothered to use any other tool to manage packages. And PLD was fixed for poldek and poldek was fixed for PLD. And none of them handle the dependencies like the rest of the world does.&lt;/p&gt;

&lt;p&gt;For some reason PLD decided to use the Obsoletes header to hold information about conflicting packages. Not that it makes any sense but that's how poldek implemented it in the first place. You see, when you try to use the proper Conflicts header and drop the Obsoletes header poldek displays an error message and refuses to install anything.&lt;/p&gt;

&lt;p&gt;Patching yum to handle conflicts and uninstall the conflicting package took me about 3 minutes. But it treats Obsoletes the way it was supposed to be used: to tell the manager that a package is being dropped from the distribution and another one provides a replacement. Not that two packages are mutually exclusive (hint: mutual Conflicts). Now image what yum does when it sees two mutually obsoleting packages. Yup. It cycles them every time you upgrade. And now the fun part — we have more than 10 &lt;q&gt;issue&lt;/q&gt; versions (send your answers on post cards to my home address).&lt;/p&gt;

&lt;p&gt;That's why I propose fixing out packaging policy and poldek to handle deps like the rest of the world does (and maybe start using Suggests once poldek is fixed).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Microsoft i innowacje</title>
   <link href="http://room-303.com/blog/2007/05/30/microsoft-i-innowacje/"/>
   <updated>2007-05-30T11:04:45+00:00</updated>
   <id>http://room-303.com/blog/2007/05/30/microsoft-i-innowacje</id>
   <content type="html">&lt;p&gt;Chłopaki z Yashke pisali już o &lt;a href=&quot;http://yashke.com/2007/05/30/komputer-w-stoliku-microsoft-szaleje/&quot;&gt;najnowszym projekcie komputera w stoliku&lt;/a&gt;. Jak słyszymy w filmie, jest to &lt;q&gt;nowy, supertajny projekt Microsoftu.&lt;/q&gt; O RLY?&lt;/p&gt;

&lt;p&gt;Pierwsze skojarzenie? &lt;a href=&quot;http://www.youtube.com/watch?v=GkrM4ymkiDo&quot;&gt;Lowfat&lt;/a&gt; autorstwa &lt;a href=&quot;http://macslow.thepimp.net/&quot;&gt;MacSlowa&lt;/a&gt;. Interfejs do zarządzania dokumentami wygląda dziwnie znajomo. Z tym, że lowfat powstał na przełomie lat 2005/2006.&lt;/p&gt;

&lt;p&gt;Drugie skojarzenie? &lt;a href=&quot;http://mtg.upf.edu/reactable/?media&quot;&gt;Reactable&lt;/a&gt; — instrument muzyczny, używający komputera w stole i rozpoznający kładzione na nim przedmioty. Tym razem projekt z roku 2003, do dziś towarzyszący Björk na koncertach.&lt;/p&gt;

&lt;p&gt;Panowie, pokażcie mi tu innowację, bo chyba nie chodzi tu o &lt;a href=&quot;http://cs.nyu.edu/%7Ejhan/ftirtouch/&quot;&gt;ekran wielodotykowy Jeffersona Hana&lt;/a&gt;?&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>PLD Linux for Desktop: system-config-printer</title>
   <link href="http://room-303.com/blog/2007/05/24/pld-linux-for-desktop-system-config-printer/"/>
   <updated>2007-05-24T17:29:13+00:00</updated>
   <id>http://room-303.com/blog/2007/05/24/pld-linux-for-desktop-system-config-printer</id>
   <content type="html">&lt;p&gt;Prosto z Fedory przybywa do &lt;abbr title=&quot;PLD Linux Distribution&quot;&gt;PLD&lt;/abbr&gt; pakiet o wdzięcznej nazwie &lt;code&gt;system-config-printer&lt;/code&gt;. Napisałbym, że przybywa magicznie, ale spędziłem nad nim sporą część wczorajszego wieczoru.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/512408190/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/215/512408190_606d8dc915.jpg&quot; alt=&quot;GNOME Printer Configuration&quot; height=&quot;313&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dzięki temu narzędziu można w końcu w wygodny sposób zarządzać drukarkami, także tymi zdalnymi (mam na myśli udostępniane przez Sambę). W obszarze powiadamiania pojawia się także ikona odpowiadająca za kolejkę wydruku. Nareszcie usuwanie niechcianych zadań nie wymaga dłubania w przeglądarce.&lt;/p&gt;

&lt;p&gt;Miłej zabawy, a to dopiero początek zmian w &lt;abbr&gt;PLD&lt;/abbr&gt; na lepsze ;)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>PLD, czyli o śledzeniu kodu dystrybucji</title>
   <link href="http://room-303.com/blog/2007/05/22/pld-czyli-o-sledzeniu-kodu-dystrybucji/"/>
   <updated>2007-05-22T17:04:24+00:00</updated>
   <id>http://room-303.com/blog/2007/05/22/pld-czyli-o-sledzeniu-kodu-dystrybucji</id>
   <content type="html">&lt;p&gt;Od jakiegoś czasu na listach &lt;abbr title=&quot;PLD Linux Distribution&quot;&gt;PLD&lt;/abbr&gt; toczy się dyskusja na temat zmiany układu repozytorium. mmazur &lt;a href=&quot;http://mmazur.jogger.pl/2007/05/17/portage-like-repo-layout/&quot;&gt;ogłosił niedawno testowe wdrożenie&lt;/a&gt; układu podobnego do używanego przez Portage. Mam nadzieję, że to pierwszy krok na drodze do zmiany samego systemu wersjonowania kodu. A ma co śledzić, bo — wbrew pozorom — dystrybucja to dziesiątki tysięcy plików, nad którymi trzeba jakoś zapanować.&lt;/p&gt;

&lt;h4&gt;CVS&lt;/h4&gt;

&lt;p&gt;Obecnie do zarządzania repozytorium używamy CVS. Ma swoje wady i zalety. Przede wszystkim można w nim wiele rzeczy automatyzować, choćby ze względu na to, że pliki w repozytorium mają swoje przełożenie 1:1 na fizyczne pliki na dysku. Plik &lt;code&gt;foo.spec&lt;/code&gt; ma wszystkie swoje dane w pliku &lt;code&gt;foo.spec,v&lt;/code&gt; i można go sobie ręcznie backupować, edytować albo zmienić mu nazwę. No właśnie, CVS ma kilka wad:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nie ma możliwości przeniesienia czegokolwiek w repozytorium. Można usunąć plik i dodać go pod nową nazwą, ale w tym momencie tracimy jakąkolwiek historię. Jedyna opcja to fizyczna zmiana nazwy pliku kontroli wersji przez osobę z uprawnieniami administratora na serwerze.&lt;/li&gt;
&lt;li&gt;Gałęzie i tagi są przywiązane do poszczególnych plików kopiowanie, scalanie i przenoszenie plików pomiędzy gałęziami to prawdziwy wrzód na dupie.&lt;/li&gt;
&lt;li&gt;Z powyższego powodu, praca na kilku gałęziach jednocześnie jest bardzo męcząca. Każdą gałąź trzeba pobrać z repozytorium do osobnego katalogu. Każdy nowy plik odpowiednio oznaczyć, bo w przeciwym wypadku trafi w najmniej pożądane miejsce. Do tego musimy spierać się z serwerem o to, że wiemy, że plik o identycznej nazwie już istnieje na innej gałęzi, ale nie ma nic wspólnego z naszym.&lt;/li&gt;
&lt;li&gt;Nie istnieją zestawy zmian, każda zmiana w repozytorium jest pojedynczą operacją i nie ma po niej śladu w żadnym pliku poza aktualnie modyfikowanymi.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Mercurial&lt;/h4&gt;

&lt;p&gt;Świeżutka zabawka, łatwo rozwijalna, ale jeszcze nie spełnia oczekiwań dużej dystrybucji:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Każda kopia robocza jest pełnym odbiciem lustrzanym głównego repozytorium. Nie ma możliwości pobrania jednego pliku, dokonania w nim zmian i wysłania z powrotem.&lt;/li&gt;
&lt;li&gt;Rozbicie na rewizje i kody zestawów zmian jest bardzo nieintuicyjne ze względu na fakt, że tylko kod szesnastkowy jest unikalny.&lt;/li&gt;
&lt;li&gt;Zaśmieca kopię roboczą, tworząc w niej katalogi z metadanymi, co utrudnia pracę z narządziami operującymi na plikach rekursywnie (&lt;code&gt;diff&lt;/code&gt;, &lt;code&gt;find&lt;/code&gt;, &lt;code&gt;grep&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;GIT&lt;/h4&gt;

&lt;p&gt;Rozproszony system kontroli wersji zaprojektowany przez Linusa Torvaldsa. Nadawałby się świetnie, gdyby nie to, że ma intuicyjność składni zbliżoną do Emacsa. W związku z tym, nikt nie zmusi deweloperów, żeby z dnia na dzień nauczyli się nowego narzędzia i przepisali wszystkie swoje skrypty. Zwłaszcza, że z opcji pracy offline skorzysta góra kilka osób (w przypadku dystrybucji, ciężko bez dostępu do sieci zbudować jakikolwiek pakiet).&lt;/p&gt;

&lt;h4&gt;Subversion&lt;/h4&gt;

&lt;p&gt;Narzędzie sprawdzone, oferuje to samo, co CVS, jednocześnie poprawiając jego niedociągnięcia. Nie oferuje pracy na rozproszonych kopiach repozytorium. Ma za to jedną wadę Mercuriala:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zaśmieca kopię roboczą, tworząc w niej katalogi z metadanymi.&lt;/li&gt;
&lt;li&gt;Kod pobrany z repozytorium zajmuje dwa razy więcej miejsca niż powinien, bo trzymana jest lokalna kopia pliku (co pozwala na częściową pracę offline).&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Subversion + SVK&lt;/h4&gt;

&lt;p&gt;Wyobraźcie sobie Subversion, ale bez wspomnianych problemów. Z pełnym wsparciem dla pracy offline. To właśnie jest SVK — pełni rolę klienta Subversion, zarządzając jednocześnie kopią roboczą i klonami repozytorium. Kopie robocze nie są wzbogacane o żadne magiczne katalogi z metadanymi, nie mają narzutu w postaci trzymania kopii plików, a do tego system potrafi śledzić lokalne scalenia i automatycznie podpowiada komentarz przy upychaniu swoich zmian z powrotem do głównego repozytorium Subversion.&lt;/p&gt;

&lt;p&gt;Rozwiązanie niemal idealne — miłośnicy GIT mają swoje ulubione funkcje, a reszta może używać tradycyjnego klienta Subversion. Bez żadnej magii shellowej.&lt;/p&gt;

&lt;h4&gt;Review Board&lt;/h4&gt;

&lt;p&gt;A skoro już mowa o Subversion, to kilka dni temu &lt;a href=&quot;http://www.chipx86.com/blog/?p=222&quot;&gt;chipX86 ogłosił projekt&lt;/a&gt;, który stworzyli wewnętrznie na potrzeby VMware. &lt;a href=&quot;http://code.google.com/p/reviewboard/&quot;&gt;Review Board&lt;/a&gt;, bo tak się nazywa, to aplikacja Django, która pozwala wygodnie przechowywać nadsyłane łatki. Na listach &lt;abbr&gt;PLD&lt;/abbr&gt; pojawia się ich sporo i często giną w czeluściach skrzynek pocztowych. Coś takiego z pewnością by nam się przydało — miejsce, gdzie każdy z uczestników listy może zaproponować swoje zmiany i otrzymać komentarze jeszcze przed włączeniem ich do samej dystrybucji. Miejsce, gdzie łatki nie giną.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Nielegalne tłumaczenie</title>
   <link href="http://room-303.com/blog/2007/05/17/nielegalne-tlumaczenie/"/>
   <updated>2007-05-17T10:41:38+00:00</updated>
   <id>http://room-303.com/blog/2007/05/17/nielegalne-tlumaczenie</id>
   <content type="html">&lt;p&gt;Jak &lt;a href=&quot;http://wiadomosci.gazeta.pl/wiadomosci/1,53600,4138386.html&quot;&gt;podaje Gazeta&lt;/a&gt;, &lt;q&gt;policjanci zatrzymali dziewięć osób, które nielegalnie tłumaczyły dialogi z filmów.&lt;/q&gt; Czy to ja jestem przed poranną kawą, czy może to zdanie jest zwyczajnie idiotyczne?&lt;/p&gt;

&lt;p&gt;Jak można nielegalnie tłumaczyć? Nielegalne może być rozpowszechnianie tłumaczeń książek bez zgody wydawcy, nielegalne może być kopiowanie filmów. Ale tłumaczenie? Może sam fakt, że znam biegle jeden język obcy i dwa inne w stopniu podstawowym jest już dostatecznym powodem, żeby mnie aresztować? Można bowiem domniemać, że skoro posiadam wszelkie po temu predyspozycje, mogłem uczyć się języków z zamiarem tłumaczenia. A to jest przecież nielegalne.&lt;/p&gt;

&lt;p&gt;Czy jeśli opowiem koledze film, to złamię prawo? A jeśli film był po francusku i będę go opowiadał po polsku?&lt;/p&gt;

&lt;p&gt;Czy napisanie streszczenia książki jest legalne? A recenzji filmu? Można przecież podnieść podobny argument — w przypadku 90% serwowanej nam przez kina papki, po przeczytaniu recenzji, mniej ludzi obejrzy film, bo część uzna, że to szmira.&lt;/p&gt;

&lt;p&gt;Polskie listy dialogowe szkodzą kinematografii dokładnie w ten sam sposób. Przecież nikt nie przeczyta samych napisów zamiast obejrzenia filmu, prawda? A czy któryś z serwisów oferował nielegalne kopie filmu do pobrania? Nie oferował, to o co chodzi?&lt;/p&gt;

&lt;p&gt;Panie Gutek i inni wydawcy, ja oglądam filmów dużo. Mam w domu całe sterty legalnych płyt, oglądałem też masę pirackich kopii. Gdyby chociaż połowę z interesujących mnie tytułów dało się kupić w Polsce, to byłbym szczęśliwy. I tak, zapłaciłbym za nie. Dlatego, żeby je mieć, nie dlatego, że czekam na wasze spolszczenia. Angielskie filmy oglądam w oryginalnych wersjach językowych. Japońskie z angielskimi napisami.&lt;/p&gt;

&lt;p&gt;A panowie niech się zastanowią, co wam złego zrobili tłumacze. Ja bym na waszym miejscu podpisywał z nimi kontrakty zamiast podawać ich do sądu. Bo oni — w przeciwieństwie do waszych profesjonalistów — nie uważają, że &lt;q&gt;fuck&lt;/q&gt; to znaczy &lt;q&gt;kurczę.&lt;/q&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #033: Czas na film</title>
   <link href="http://room-303.com/blog/2007/05/10/strip-033-czas-na-film/"/>
   <updated>2007-05-10T11:47:31+00:00</updated>
   <id>http://room-303.com/blog/2007/05/10/strip-033-czas-na-film</id>
   <content type="html">&lt;p&gt;Gdyby Patrys kręcił filmy&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/033-madness.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #032: Pickup techniques</title>
   <link href="http://room-303.com/blog/2007/05/09/strip-032-pickup-techniques/"/>
   <updated>2007-05-09T15:57:12+00:00</updated>
   <id>http://room-303.com/blog/2007/05/09/strip-032-pickup-techniques</id>
   <content type="html">&lt;p&gt;W nawiązaniu do mojego &lt;a href=&quot;http://room-303.com/blog/2007/05/04/its-gettin-laid/&quot;&gt;niezbędnika podrywacza&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/032-pickup-lines.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Bezpruderyjna informatyczka pozna pana</title>
   <link href="http://room-303.com/blog/2007/05/08/bezpruderyjna-informatyczka-pozna-pana/"/>
   <updated>2007-05-08T10:53:23+00:00</updated>
   <id>http://room-303.com/blog/2007/05/08/bezpruderyjna-informatyczka-pozna-pana</id>
   <content type="html">&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://www.cycuszek.pl/gfx/cycuszek.gif&quot; alt=&quot;cycuszel.pl&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Nareszcie, po latach poszukiwania w Sieci (bo przecież informatycy znajomych nie mają), odnalazłem swój ideał kobiety!&lt;/p&gt;

&lt;p&gt;Trzydzieści cztery lata, za rok magisterka, siwe włosy, &lt;q&gt;szalona małolata.&lt;/q&gt; Uwielbia &lt;q&gt;pompować toster dla szatana,&lt;/q&gt; a jej ulubione lektury to &lt;q&gt;Pascal i Borland C - ćwiczenia. Wydanie drugie,&lt;/q&gt; &lt;q&gt;ABC sieci komputerowych&lt;/q&gt; i &lt;q&gt;Polowanie na Hitlera. Historia zamachów na wodza Trzeciej Rzeszy.&lt;/q&gt; Na szczęście jest &lt;q&gt;otwarta na ludzi,&lt;/q&gt; więc i &lt;q&gt;Sposoby wypieku chleba domowego&lt;/q&gt; będziemy czytać wieczorem przy kominku.&lt;/p&gt;

&lt;p&gt;Drodzy autorzy serwisów społecznościowych, jeśli planujecie bezczelnie zrobić &lt;a href=&quot;http://www.cycuszek.pl/&quot;&gt;serwis ze sztucznie generowanymi profilami&lt;/a&gt;, to chociaż postarajcie się nie używać hurtowo całej historii wydawniczej Helionu.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; panowie są bezczelni, najpierw usunęli z serwisu informacje o wspomnianych wyżej książkach, a chwilę potem posprzątali profile, w których było nawiązanie do Grona (na przykład &lt;q&gt;Zainteresowania: patrz grona tematyczne&lt;/q&gt;). Wiemy już zatem, komu &lt;em&gt;ukradli&lt;/em&gt; profile, pozostaje tylko spekulować, komu podprowadzili zdjęcia?&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Nowy Skype dla Linuksa, używaj Ekigi</title>
   <link href="http://room-303.com/blog/2007/05/05/nowy-skype-dla-linuksa-uzywaj-ekigi/"/>
   <updated>2007-05-05T20:21:55+00:00</updated>
   <id>http://room-303.com/blog/2007/05/05/nowy-skype-dla-linuksa-uzywaj-ekigi</id>
   <content type="html">&lt;p&gt;Na garażowym blogu Skype pojawiła się &lt;a href=&quot;http://share.skype.com/sites/garage/2007/05/skype_for_linux_14_alpha_relea.html&quot;&gt;zapowiedź kolejnej wersji dla Linuksa&lt;/a&gt;. Zmienił się interfejs (nie, nie przesiedli się na &lt;abbr title=&quot;GIMP Toolkit&quot;&gt;GTK+&lt;/abbr&gt;).&lt;/p&gt;

&lt;p&gt;Pojawiły się też nowe funkcje, takie jak wysyłanie wiadomości &lt;abbr title=&quot;Short Message Service&quot;&gt;SMS&lt;/abbr&gt; i rozmowy wideo. Ehh, rozmarzyłem się. Nic się nie pojawiło, Skype dla Linuksa nadal tkwi w epoce pingwina łupanego i jest więcej niż wystarczającym powodem dla śmiechu ze strony użytkowników Windows.&lt;/p&gt;

&lt;p&gt;Dlatego proponuję upgrade w formie zamiany Skype'a na &lt;a href=&quot;http://ekiga.org/&quot;&gt;Ekigę&lt;/a&gt;:&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/468986688/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/177/468986688_c4074d0b4a.jpg&quot; width=&quot;500&quot; height=&quot;293&quot; alt=&quot;Ekiga - spread the love ;)&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Działa tak samo pod Windows i pod Linuksem, a do tego używa powszechnie uznanych za standardowe protokołów &lt;abbr title=&quot;Session Initiation Protocol&quot;&gt;SIP&lt;/abbr&gt; (co oznacza tyle, że można rozmawiać z użytkownikami dowolnego klienta &lt;abbr title=&quot;Voice Over Internet Protocol&quot;&gt;VOIP&lt;/abbr&gt;). Używam od dawna, a od niedawna mam też okazję pobawić sie kamerą, polecam.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>It's gettin' laid</title>
   <link href="http://room-303.com/blog/2007/05/04/its-gettin-laid/"/>
   <updated>2007-05-04T17:06:38+00:00</updated>
   <id>http://room-303.com/blog/2007/05/04/its-gettin-laid</id>
   <content type="html">&lt;p&gt;Z powodu przedłużonego weekendu, złożyłem wizytę w swoim rodzinnym domu. Od wczoraj jestem w związku z tym ze wszech stron atakowany przeróżnymi talk-showami, reality showami i innymi szczytowymi osiągnięciami mediów ostatniego dziesięciolecia. Wśród nawału problemów na miarę łamów magazynu Bravo, dotarły do mnie utyskiwania facetów, którzy nie potrafią sobie znaleźć kobiety.&lt;/p&gt;

&lt;p&gt;Panowie, panie, drodzy geecy. Choćby nie wiem, jak trudnym jawiło się to zadanie, zapewniam, że od opowiadania o tym, jaką się jest pierdołą w telewizji, nikomu fanek nie przybyło. Skoro jednak znalezienie kobiety jest takim problemem dla zwykłego samca, to w jak trudnej sytuacji znajdują się &amp;mdash; o zgrozo &amp;mdash; informatycy? Spieszę zatem z pomocą i niezbędnymi radami.&lt;/p&gt;

&lt;h4&gt;Niezbędne przygotowanie&lt;/h4&gt;

&lt;p&gt;O ile poważne rozpoznanie rynku i przygotowanie się do wdrożenia stanowi podstawę udanej operacji, należy bardzo starannie dobierać materiały szkoleniowe. Często popełniany na początku błąd polega na przyjściu do klubu w stroju hydraulika i zaczepienie siedzącej przy barze kobiety słowami &lt;q&gt;hej maleńka, coś dzisiaj przetkamy?&lt;/q&gt; Procedensy w tej kwestii niezbicie dowodzą, że o ile nie jest to dobry sposób na rozpalenie serca swej wybranki, z pewnością pozwala w miarę pewnie odebrać pełną kwotę swojego ubezpieczenia na życie.&lt;/p&gt;

&lt;p&gt;Równie ważne jest też opanowanie fachowego słownictwa. Doświadczenia pokazują, że najtrudniej jest opanować słowo &lt;q&gt;kobieta&lt;/q&gt; (&lt;abbr title=&quot;Also Known As&quot;&gt;a.k.a.&lt;/abbr&gt; &lt;q&gt;dziewczyna&lt;/q&gt;). Niestety, samice nie reagują z równym entuzjazmem na słowa &lt;q&gt;sztunia,&lt;/q&gt; &lt;q&gt;niuńka,&lt;/q&gt; &lt;q&gt;dupcia,&lt;/q&gt; czy też &lt;q&gt;świnka.&lt;/q&gt; Nie znaczy to jednak, że nie reagują z równą werwą.&lt;/p&gt;

&lt;h4&gt;Prezentacja produktu&lt;/h4&gt;

&lt;p&gt;Informatycy z przerażeniem odkryją zapewne, że jest to jedyny przypadek w ich karierze, kiedy prezentacji nie poprowadzi w ich imieniu handlowiec. Owszem, istnieją różne serwisy randkowe i kluby dla samotnych, ale przecież nie po to kupujesz swoje koszule w kratę u Versace, żeby teraz nabyć partnerkę z lumpeksu!&lt;/p&gt;

&lt;p&gt;Narzuć więc najlepszego flanelowego kraciaka, jakiego znajdziesz (uwaga na plamy po długopisach na kieszeni) i udaj się do sali konferencyjnej, to jest do najbliższego klubu. Klub rozpoznasz po głośnej muzyce, braku tostów i niewielkim odsetku ludzi ubranych jak informatycy (kobiety potwierdzą, że nie ma nic gorszego, niż spotkać na przyjęciu kogoś ubranego tak samo).&lt;/p&gt;

&lt;p&gt;Prezentacja produktu rządzi się właściwie tymi samymi prawami, co w przypadku sprzedaży oprogramowania. Obaj wiemy, że masz w spodniach wszystkie pięć składników, które zrobią z niej prawdziwego championa, ale nie wdawaj się specjalnie w szczegóły techniczne. Jej uprzednie doświadczenie z innymi tego typu aplikacjami powinno wystarczyć, aby zrozumieć ideę działania, nawet na podstawie pobieżnego opisu i bez demonstracji zrzutów ekranu. Postaraj się raczej skupić na ficzerach, silnik lepiej wypada na późniejszej demonstracji w terenie.&lt;/p&gt;

&lt;h4&gt;Garść porad&lt;/h4&gt;

&lt;p&gt;Jeśli prezentacja przebiegnie sprawnie i klient wyrazi wstępne zainteresowanie, należy zachować szczególną ostrożność. Utrata potencjalnej partnerki na tym etapie może być szczególnie frustrująca, dlatego pilnuj każdego swojego ruchu.&lt;/p&gt;

&lt;p&gt;Niewiele osób wie, ale kobiety mają słuch kierunkowy. Wieloletnie badania empiryczne dowodzą, że komplementy nie docierają do uszu lub docierają bardzo zniekształcone, jeśli wymawiasz je patrząc na biust. Staraj się więc utrzymać kontakt wzrokowy. Nie, tłumaczenie się słabym wzrokiem nie jest dobrą wymówką, żeby próbować odczytać to, co wydawało ci się Braille'em na jej naszyjniku.&lt;/p&gt;

&lt;p&gt;Na zakończenie wypada dodać jeszcze, że kobiety wprost szaleją za pragmatycznymi mężczyznami z prawidłowo wykształconym poczuciem humoru. Żeby sprawdzić, jak twoja nowa partnerka szaleje, spróbuj po pierwszej nocy &lt;a href=&quot;http://halbot.haluze.sk/?id=3262&quot;&gt;nakleić jej na czoło żółtą karteczkę z imieniem&lt;/a&gt;, a kiedy się obudzi, spytaj chłodnym tonem &lt;q&gt;cześć, często tu bywasz?&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;A teraz do boju, ja tymczasem ruszam na imprezę ;)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>O grze w dwa ognie raz jeszcze</title>
   <link href="http://room-303.com/blog/2007/04/29/o-grze-w-dwa-ognie-raz-jeszcze/"/>
   <updated>2007-04-29T10:14:15+00:00</updated>
   <id>http://room-303.com/blog/2007/04/29/o-grze-w-dwa-ognie-raz-jeszcze</id>
   <content type="html">&lt;p&gt;Drodzy autorzy serwisów społecznościowych, zamiast kolejny raz kopiować &lt;a href=&quot;http://twitter.com/&quot;&gt;Twittera&lt;/a&gt;, który skopiował już &lt;a href=&quot;http://www.dodgeball.com/&quot;&gt;Dodgeballa&lt;/a&gt;, zainwestujcie w &lt;a href=&quot;http://blip.pl/&quot;&gt;Blip&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Dlaczego? Ano dlatego, że musicie się pogodzić z faktem, że podnoszenie progu wyjścia z serwisu wcale nie działa na korzyść waszych użytkowników. Dlaczego muszę mieć konta w pięćdziesięciu &lt;q&gt;social sites&lt;/q&gt; tylko po to, żeby wiedzieć, gdzie poszli na piwo moi znajomi?&lt;/p&gt;

&lt;p&gt;Przykro mi, ale nie jestem &lt;q&gt;amanda99&lt;/q&gt; i większość moich znajomych to nie weekendowi &lt;q&gt;klikacze,&lt;/q&gt; tylko ludzie z krwi i kości, z którymi pracuję, chodzę do pubów i mają absolutnie różne preferencje odnośnie wyboru waszych usług.&lt;/p&gt;

&lt;p&gt;Blip (Twitter, Dodgeball) jest niezależny od was i dalece większą przysługę oddacie nam, jeśli zintegrujecie interfejs do tego właśnie serwisu, zamiast powielić całą jego funkcjonalność. Do tego nieudolnie, bo &lt;q&gt;sterowiec&lt;/q&gt;, który zaserwowało nam Grono przypomina bardziej akcje zniczowe w statusach niż usługę powiadamiania.&lt;/p&gt;

&lt;p&gt;Do rzeczy więc &amp;mdash; jeśli każdy z was ma budżet pozwalający na implementację 20% funkcjonalności Blipa, to w piątkę jesteście w stanie sfinansować pełny serwis. Dajesz 20%, dostajesz pozostałych 80%, której części nie rozumiesz?&lt;/p&gt;

&lt;p&gt;Nie ma szans działać? Przykładem niech będzie Google, które &amp;mdash; podobnie jak wszystkie portale &amp;mdash; zbudowało własny komunikator, ale &amp;mdash; w przeciwieństwie do nich &amp;mdash; zastosowało otwarty protokół &lt;abbr title=&quot;Extensible Messaging and Presence Protocol&quot;&gt;XMPP&lt;/abbr&gt;. A teraz wyskakiwać z kasy i zgłaszać się do autorów ;)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Grono.net - Konkurs</title>
   <link href="http://room-303.com/blog/2007/04/28/grononet-konkurs/"/>
   <updated>2007-04-28T15:14:54+00:00</updated>
   <id>http://room-303.com/blog/2007/04/28/grononet-konkurs</id>
   <content type="html">&lt;p&gt;Chyba wszyscy słyszeli już o nowej usłudze Grona, &lt;q&gt;Blimpie,&lt;/q&gt; który to jest słabą podróbką serwisu &lt;a href=&quot;http://blip.pl/&quot;&gt;Blip.pl&lt;/a&gt;. Ci, którzy nie słyszeli, z pewnością nie czytają blogów, bo agencja reklamowa ograniczyła się do zaspamowania blogów komentarzami reklamowymi. Mi też się oberwało, co nie zdziwiło mnie specjalnie — bądźmy szczerzy, Grono w moich oczach stracić już nie może. &lt;a href=&quot;http://netto.blox.pl/&quot;&gt;Marcin&lt;/a&gt; dostał nawet przeprosiny z tej okazji, ja obejdę się smakiem.&lt;/p&gt;

&lt;p&gt;Wracając jednak do tematu, chciałem urządzić mini-konkurs. Zapraszam do zgadywania, jaki kolejny serwis padnie ofiarą Grona? Zadanie jest trudne, bo ich Zakon Chaosu (podobno 20 programistów tam mają, Marcin zachwalał, że paru nawet na studia już poszło) zaimplementował już wszystko, co stanęło mu na drodze.&lt;/p&gt;

&lt;p&gt;Mój typ — serwis aukcyjny &lt;strong&gt;jeBay&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Podbij cenę do: &lt;input value=&quot;12.00&quot; size=&quot;6&quot; type=&quot;text&quot; /&gt; PLN &lt;input value=&quot;jeBay, jeBay&quot; style=&quot;display: inline;&quot; type=&quot;button&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Zapraszam do zabawy. Preferowana forma nadsyłania zgłoszeń — komentarz lub TrackBack ;).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Talku-Talku-Bay</title>
   <link href="http://room-303.com/blog/2007/04/28/talku-talku-bay/"/>
   <updated>2007-04-28T12:17:28+00:00</updated>
   <id>http://room-303.com/blog/2007/04/28/talku-talku-bay</id>
   <content type="html">&lt;p&gt;Tym razem nie będę jeździł po Gadu-Gadu, ale tak mi się jakoś sposób tłumaczenia skojarzył.&lt;/p&gt;

&lt;p&gt;Panowie z Brandlaya od lat nie przestają nas zaskakiwać wspaniałymi pomysłami. Zawdzięczamy im na przykład bezużyteczny klon MySpace o wdzięcznej nazwie Grono.net. O tym właśnie serwisie chciałem wspomnieć. Mam tam nawet konto &amp;mdash; głównie dlatego, że kiedy ostatnio próbowałem je usunąć, Grono było właśnie w stadium agonalnym i każde kliknięcie guzika &lt;q&gt;usuń konto&lt;/q&gt; kończyło się zrzutem stosu, na zmianę Pythona i Javy.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/475503297/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/211/475503297_193f92ad54.jpg&quot; width=&quot;500&quot; height=&quot;293&quot; alt=&quot;grapeo.co.uk&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Problem z Gronem jest taki, że o ile &amp;mdash; co chyba niepodważalne &amp;mdash; cały świat, z Chuckiem Norrisem na czele, chciałby założyć sobie tam konto, to nazwa jest mocno niemediala poza granicami naszego rezerwatu kultury słowiańskiej. Weźmy więc &lt;q&gt;grono&lt;/q&gt; i słownik polsko-angielski. Co nam wyjdzie? &lt;q&gt;Grape.&lt;/q&gt; Cholera, zajęte. Dodajmy &lt;q&gt;o&lt;/q&gt; na końcu!&lt;/p&gt;

&lt;p&gt;Tak zapewne narodziło się &lt;a href=&quot;http://grapeo.co.uk/&quot;&gt;Grapeo&lt;/a&gt;. Cóż, dobrze, że nie inspirowali się Flickrem, bo powstałby koszmarek na miarę &lt;q&gt;grapekr&lt;/q&gt;. Insipiracji za to wyraźnie dostarczył im inny hit Sieci &amp;mdash; eBay. Wystarczy spojrzeć na logo, by mieć pewność, że nie wywodzi się od pewnej wyszukiwarki z dwoma kółeczkami w nazwie.&lt;/p&gt;

&lt;p&gt;Złota zasada łebdwazero brzmi jednak inaczej: jeśli masz zamiar skierować swój serwis do społeczności z różnych krajów, pod żadnym pozorem nie umożliwiaj im komunikacji. Tych, którzy dopiero usłyszeli o takiej zasadzie uspokajam, że Grapeo stosuje ją wzorowo.&lt;/p&gt;

&lt;p&gt;I tak mamy na przykład przycisk &lt;q&gt;Friends [1 mln],&lt;/q&gt; który zdaje się sugerować, że w sieci społecznej znaduje się milion użytkowników. Rozdygotany użytkownik, spoconą reką, popycha swój kursor w kierunku odnośnika, zastanawiając się w głębi duszy, jak ogarnie tak dużą liczbe nowych znajomych. Na szczęście, dział użyteczności czuwa i jakkolwiek byśmy nie sformułowali zapytania do wyszukiwarki, zawsze zwraca wszystkie 45 kont.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Wego: Wtyczki</title>
   <link href="http://room-303.com/blog/2007/04/27/wego-wtyczki/"/>
   <updated>2007-04-27T12:46:23+00:00</updated>
   <id>http://room-303.com/blog/2007/04/27/wego-wtyczki</id>
   <content type="html">&lt;p&gt;Wczoraj pisałem o dodaniu do &lt;a href=&quot;http://cms.wego.pl/&quot;&gt;Wego CMS&lt;/a&gt; wtyczek dla systemów płatności online. &lt;a href=&quot;http://room-303.com/blog/2007/04/26/wego-099/#comment-7711&quot;&gt;Cypherq poprosił o szczegóły&lt;/a&gt; dotyczące implementacji. Noszę się z zamiarem przygotowania kilkuetapowego howto, kiedy tylko pojawi się darmowa wersja Wego (tak, to bardzo możliwe, po szczegóły odsyłam do nbw). Póki co, o samym sposobie ładowania wtyczek.&lt;/p&gt;

&lt;h4&gt;Moduły — wtyczki z automatyczną rejestracją&lt;/h4&gt;

&lt;p&gt;Wego ma dwa rodzaje pluginów. Pierwszy rodzaj — wtyczki z automatyczną rejestracją — używany jest przez moduły. Moduł to zamknięta część systemu, widoczna jako osobna pozycja w panelu. Przykładem niech będą &lt;q&gt;Artykuły&lt;/q&gt; lub &lt;q&gt;Kosz&lt;/q&gt;.&lt;/p&gt;

&lt;p&gt;Automatyczna rejestracja oznacza tyle, że plik z wtyczką zawiera klasę o nazwie takiej samej, jak plik i nie musi właściwie robić nic więcej:&lt;/p&gt;

&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;/* $Id: foo.module.php 1 2007-04-27 12:00:00Z patrys $ */&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;require_once&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;THE_ROOT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'/class/genericModule.class.php'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;sd&quot;&gt;/**
 * Foo module
 */&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;fooModule&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;genericModule&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;amp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$modSys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;parent&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$modSys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
		&lt;span class=&quot;nv&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;module&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'foo'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;sd&quot;&gt;/**
	 * Check if module is usable (dependencies, etc.)
	 */&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__public_init&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'success'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;sd&quot;&gt;/**
	 * Get module info
	 */&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getInfo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
			&lt;span class=&quot;s1&quot;&gt;'title'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'Foo'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
			&lt;span class=&quot;s1&quot;&gt;'author'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'patrys [ patrys at icenter pl ]'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;s1&quot;&gt;'version'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'1.0'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;s1&quot;&gt;'description'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'Hello world example'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
			&lt;span class=&quot;s1&quot;&gt;'modified'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;filemtime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;__FILE__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;cp&quot;&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Do tego dochodzi klasa dla panelu administracyjnego (dla oszczędzenia pamięci, ładowana tylko w przypadku, gdy jest to aktywny moduł w panelu):&lt;/p&gt;

&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;/* $Id: foo.panel.module.php 1 2007-04-27 12:00:00Z patrys $ */&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;fooPanelModule&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;fooModule&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__internal_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Hello world!'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;cp&quot;&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Jest tu kilka magicznych metod — wszystkie &lt;code&gt;__public_*&lt;/code&gt; dostępne są automatycznie z poziomu inych modułów i z poziomu szablonów Smarty; &lt;code&gt;__internal_*&lt;/code&gt; za to służą za obsługę ekranów panelu administracyjnego, wymagana jest przynajmniej obsługa metody &lt;code&gt;list&lt;/code&gt;, która jest domyślnym widokiem.&lt;/p&gt;

&lt;h4&gt;Inne wtyczki — ręczna rejestracja&lt;/h4&gt;

&lt;p&gt;W przypadku wtyczek &lt;q&gt;pól dodatkowych&lt;/q&gt; i systemów płatności okazało się, że automatyczna rejestracja nie jest najlepszym wyjściem — jedna klasa może realizować kilka funkcji, a sztuczne po niej dziedziczenie wprowadza tylko chaos w plikach. Zdecydowaliśmy się, że moduły te same muszą zgłosić obsługiwane przez siebie funkcje:&lt;/p&gt;

&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;/* $Id: platnosciPayment.class.php 7234 2007-04-25 10:55:39Z patrys $ */&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;platnosciPaymentType&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;genericPaymentType&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$paymentList&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
		&lt;span class=&quot;s1&quot;&gt;'platnosci_test'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
			&lt;span class=&quot;s1&quot;&gt;'code'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'t'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;s1&quot;&gt;'name'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Platnosci.pl (płatność testowa)'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
		&lt;span class=&quot;s1&quot;&gt;'platnosci_mtransfer'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
			&lt;span class=&quot;s1&quot;&gt;'code'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'m'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;s1&quot;&gt;'name'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Platnosci.pl - mBank mTransfer'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
		&lt;span class=&quot;c1&quot;&gt;// [...]
&lt;/span&gt;		&lt;span class=&quot;s1&quot;&gt;'platnosci_credit'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
			&lt;span class=&quot;s1&quot;&gt;'code'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'c'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;s1&quot;&gt;'name'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Platnosci.pl - Karta kredytowa'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

	&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getConfigData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;c1&quot;&gt;// [...]
&lt;/span&gt;	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;c1&quot;&gt;// [...]
&lt;/span&gt;	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;$parent&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;paymentSystem&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getInstance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;platnosciPaymentType&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$paymentList&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$key&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$val&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;nv&quot;&gt;$parent&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'platnosciPaymentType'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$val&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'name'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$parent&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;registerSettings&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'platnosci'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'platnosciPaymentType'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'Platnosci.pl'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;

&lt;span class=&quot;cp&quot;&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dzięki temu możliwa jest obsługa wszystkich sposobów zapłaty za pomocą jednej klasy (konstruktor klasy &lt;code&gt;genericPaymentType&lt;/code&gt; otrzymuje i zapisuje wybraną formę zapłaty).&lt;/p&gt;

&lt;h4&gt;Ładowanie wtyczek&lt;/h4&gt;

&lt;p&gt;Tutaj poszliśmy na łatwiznę:&lt;/p&gt;

&lt;div class=&quot;language-php highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;loadPlugins&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;nv&quot;&gt;$modDir&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;dir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;THE_ROOT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'/payment/'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

	&lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$file&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$modDir&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;nv&quot;&gt;$fullPath&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;THE_ROOT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'/payment/'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

		&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;is_dir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$fullPath&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;k&quot;&gt;include&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$fullPath&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
		&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ładowanie wtyczek z automatyczną rejestracją wymaga nieco więcej zachodu (po załadowaniu pliku, trzeba jeszcze sprawdzić, czy istnieje klasa o odpowiedniej nazwie i czy dziedziczy po odpowiedniej klasie bazowej), ale samodzielna implementacja nie powinna zająć więcej niż 5 minut.&lt;/p&gt;

&lt;h4&gt;Na koniec&lt;/h4&gt;

&lt;p&gt;Po notce o zmianie firmy pojawiły się niejasne spekulacje, jakobyśmy mieli zastąpić nbw butelką wody mineralnej. Spieszę z dowodem, że młodzieniec ów żyje i ma się dobrze (a jeśli już mielibyśmy kogoś zamienić na butelkę wody, to byłby to prędzej sit0).&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/474498497/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/231/474498497_af64a3a3ce.jpg&quot; width=&quot;500&quot; height=&quot;375&quot; alt=&quot;The Crew&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Ekipa, od lewej:&lt;br /&gt;patrys, sit0, nbw, emes&lt;br /&gt;jarv&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Wego 0.99</title>
   <link href="http://room-303.com/blog/2007/04/26/wego-099/"/>
   <updated>2007-04-26T16:16:45+00:00</updated>
   <id>http://room-303.com/blog/2007/04/26/wego-099</id>
   <content type="html">&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/473634448/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/189/473634448_7563b5c8ef.jpg&quot; alt=&quot;Wego CMS&quot; height=&quot;89&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nieuchronnie zbliża się publicznie dostępna wersja &lt;a href=&quot;http://cms.wego.pl/&quot;&gt;Wego CMS&lt;/a&gt; (system wdrażany klientom jest od 1,5 roku). Kolejne etapy dodawania funkcjonalności, refaktoryzacji kodu, upraszczania silnika (najwięcej nadmiarowego kodu zniknęło po ukazaniu się stabilnego PHP 5) doprowadziły nas do miejsca, z którego premierę widać gołym okiem.&lt;/p&gt;

&lt;p&gt;W ostatnich dniach do stabilnego drzewa dołączyła obsługa wpinanych systemów obsługi płatności. Znaczy to dokładnie tyle, że integracja tego typu usług sprowadza się do napisania (kilkudziesięciu linii kodu) wtyczki. Z tej okazji napisałem też dwa pierwsze moduły płatności:&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.platnosci.pl/&quot;&gt;&lt;img src=&quot;http://www.platnosci.pl/themes/platnosci/images/platnosci.gif&quot; alt=&quot;Platnosci.pl&quot; /&gt;&lt;/a&gt;
Platnosci.pl&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.paypal.com/&quot;&gt;&lt;img src=&quot;https://manager.paypal.com/images/paypal_logo.gif&quot; alt=&quot;PayPal&quot; /&gt;&lt;/a&gt;
PayPal&lt;/p&gt;

&lt;p&gt;Całkiem prawdopodobne, że w najbliższych dniach pojawi się więcej możliwości — AllPay, Przelewy24, (jeśli prowadzisz serwis tego typu albo chciałbyś płacić w Sieci za pomocą innego systemu, zostaw namiary na API w komentarzach).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Transmission</title>
   <link href="http://room-303.com/blog/2007/04/24/transmission/"/>
   <updated>2007-04-24T13:46:12+00:00</updated>
   <id>http://room-303.com/blog/2007/04/24/transmission</id>
   <content type="html">&lt;p&gt;Jeśli jeszcze nie wiecie, &lt;a href=&quot;http://transmission.m0k.org/&quot;&gt;Transmission&lt;/a&gt; jest klientem BitTorrenta. Ja nie wiedziałem. Do dzisiaj.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/471299617/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/222/471299617_385364288a.jpg&quot; alt=&quot;Transmission&quot; height=&quot;196&quot; width=&quot;392&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://gnomefiles.org/&quot;&gt;GnomeFiles&lt;/a&gt; powiadomiło mnie o nowej wersji i postanowiłem spaczkować ją dla potomnych (czytaj: dla użytkowników &lt;abbr title=&quot;PLD Linux Distribution&quot;&gt;PLD&lt;/abbr&gt;). Napisałem speca, zbudowałem, uruchomiłem… odinstalowałem oryginalnego klienta BitTorrent.&lt;/p&gt;

&lt;p&gt;Tak, jest bardzo przyjemny w użyciu.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>It's unlimited!</title>
   <link href="http://room-303.com/blog/2007/04/06/its-unlimited/"/>
   <updated>2007-04-06T11:55:42+00:00</updated>
   <id>http://room-303.com/blog/2007/04/06/its-unlimited</id>
   <content type="html">&lt;p&gt;Część z was już pewnie wie, inni się domyślają, a reszta tkwi w błogiej nieświadomości. Od początku marca pracujemy razem w nowej firmie — brytyjskim ITS Ltd., a dokładniej w jej nowopowstałym (na nasze potrzeby) wrocławskim oddziale. Kto pracuje?&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a title=&quot;sit0 and his desk&quot; href=&quot;http://flickr.com/photos/90175672@N00/447256613&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://static.flickr.com/206/447256613_9f64552f19_d.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Krzysztof &lt;q&gt;sit0&lt;/q&gt; Sitarski — pan burdel-to-moja-specjalność&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://flickr.com/photos/90175672@N00/447259723&quot; title=&quot;emes&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://static.flickr.com/231/447259723_1e91a5e355_d.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Michał &lt;q&gt;emes&lt;/q&gt; Sałaban — unoszący się w przestworzach developer PLD&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://flickr.com/photos/90175672@N00/447259719&quot; title=&quot;jarv&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://static.flickr.com/227/447259719_1e8610ee7b_d.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Tomasz &lt;q&gt;jarv&lt;/q&gt; Dobrowolski — maestro Photoshopa&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://flickr.com/photos/90175672@N00/447259729&quot; title=&quot;sit0 was here&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://static.flickr.com/176/447259729_3390e3cff6_d.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Tomasz &lt;q&gt;nbw&lt;/q&gt; Staniak — mister znajdę-wam-jakieś-zajęcie, ale nie przyjdę na zdjęcie&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://flickr.com/photos/90175672@N00/447256625&quot; title=&quot;me&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://static.flickr.com/216/447256625_1d2843aedb_d.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Patryk &lt;q&gt;Patrys&lt;/q&gt; Zawadzki — niżej podpisany, programista&lt;/p&gt;

&lt;p&gt;Zajmujemy się głównie budowaniem aplikacji webowych w oparciu o framework Django (tak, praca dla programistów Pythona to nie bajka). Idzie nam całkiem nieźle; mamy ładne nowe biuro, zespół zna się od dawna, choć &lt;a href=&quot;http://flickr.com/photos/patrys/447259725&quot;&gt;w niektórych miejscach przydałby się drobny refactoring&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Słowo się rzekło, oto i zdjęcie... (NSFW)</title>
   <link href="http://room-303.com/blog/2007/04/01/slowo-sie-rzeklo-oto-i-zdjecie-nsfw/"/>
   <updated>2007-04-01T10:12:21+00:00</updated>
   <id>http://room-303.com/blog/2007/04/01/slowo-sie-rzeklo-oto-i-zdjecie-nsfw</id>
   <content type="html">&lt;p&gt;Niedawno obiecałem, że w związku z projektem ustawy o zakazie pornografii, zamieszczę tutaj swoje zdjęcie. Mam nadzieję, że nikt się nie obrazi.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/441826208/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/191/441826208_84a4788a3e.jpg&quot; alt=&quot;My southparkish character&quot; height=&quot;383&quot; width=&quot;383&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No dobra, mogłem napisać, że zamykam bloga. ^_^&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Synergy GNOME manager</title>
   <link href="http://room-303.com/blog/2007/03/25/synergy-gnome-manager/"/>
   <updated>2007-03-25T12:09:19+00:00</updated>
   <id>http://room-303.com/blog/2007/03/25/synergy-gnome-manager</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://synergy2.sourceforge.net/&quot;&gt;Synergy&lt;/a&gt; to bardzo przydatny program, pozwalający na symulację działania przełącznika &lt;abbr title=&quot;Keyboard, Video, Mouse&quot;&gt;KVM&lt;/abbr&gt;. Z drobną różnicą, zamiast przełączać ekran pomiędzy kilkoma komputerami, jak to ma miejsce w przypadku &lt;abbr title=&quot;Virtual Network Computing&quot;&gt;VNC&lt;/abbr&gt;, używane są faktyczne monitory komputerów stojących na jednym biurku.&lt;/p&gt;

&lt;p&gt;Jak to działa w praktyce? Tak naturalnie, jak tylko się da. Płynnie przesuwamy kursor myszy pomiędzy kilkoma ekranami. Można więc uruchomić edytor kodu na komputerze stacjonarnym, przesunąć mysz w prawo, na ekran notebooka i tam testować swoją aplikację w przeglądarce. Schowek jest przenoszony pomiędzy ekranami, wszystko działa bardzo płynnie. Gdzie jest haczyk? Synergy ma graficzny interfejs tylko dla Windows.&lt;/p&gt;

&lt;p&gt;Pomyślałem sobie, że &lt;a href=&quot;http://www.gnome.org/&quot;&gt;GNOME&lt;/a&gt; nie może być gorszy i wczoraj, w Pythonie, zacząłem pisać odpowiednik. Potrafi jednocześnie nieco więcej i mniej niż jego windowsowy brat i wydaje mi się, że jest wygodniejszy. Automatycznie wykrywa komputery w sieci lokalnej za pomocą &lt;a href=&quot;http://avahi.org/&quot;&gt;Avahi&lt;/a&gt;, nie zajmuje więcej miejsca na ekranie niż jedna ikona w pasku stanu i o zmianach informuje za pomocą wyskakujących powiadomień.&lt;/p&gt;

&lt;p&gt;Przed opublikowaniem kodu, chcę jeszcze napisać odpowiednik dla klienta, muszę też przygotować ikony, bo w tej chwili używane są ikony stanu sieci, z dzieleniem ekranów nie mające wiele wspólnego.&lt;/p&gt;

&lt;p&gt;Obejrzyj &lt;a href=&quot;http://room-303.com/blog/wp-content/uploads/2007/03/synergy.ogg&quot; title=&quot;Synergy + GNOME&quot;&gt;Synergy + GNOME&lt;/a&gt; (530&lt;abbr title=&quot;kilobajtów&quot;&gt;kB&lt;/abbr&gt;) w działaniu.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>16kasprzakastreet do wynajęcia</title>
   <link href="http://room-303.com/blog/2007/03/24/16kasprzakastreet-do-wynajecia/"/>
   <updated>2007-03-24T15:28:46+00:00</updated>
   <id>http://room-303.com/blog/2007/03/24/16kasprzakastreet-do-wynajecia</id>
   <content type="html">&lt;p&gt;Mija rok od czasu naszego wprowadzenia się na &lt;a href=&quot;http://16kasprzakastreet.com/&quot;&gt;16kasprzakastreet&lt;/a&gt;. Czas przenieść się gdzie indziej. Jeśli ktoś jest zainteresowany, to &lt;a href=&quot;http://szybko.pl/86559&quot;&gt;mieszkanie jest do wynajęcia&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Cenzura strikes back</title>
   <link href="http://room-303.com/blog/2007/03/16/cenzura-strikes-back/"/>
   <updated>2007-03-16T15:18:15+00:00</updated>
   <id>http://room-303.com/blog/2007/03/16/cenzura-strikes-back</id>
   <content type="html">&lt;p&gt;Banda wyjątkowych specjalistów od pornografii, nie wątpię, że po dłuższym posiedzeniu plenarnym, mającym na celu zapoznanie się z dostępnymi materiałami, &lt;a href=&quot;http://wiadomosci.gazeta.pl/wiadomosci/1,53600,3990852.html&quot;&gt;postanowiła zakazać jej posiadania&lt;/a&gt;. Nawet nie sprzedaży, posiadania.&lt;/p&gt;

&lt;p&gt;Skomentuję krótko — brak mózgu powinien być karany dożywotnim więzieniem. Karać posłów &lt;abbr title=&quot;Prawa i Sprawiedliwości&quot;&gt;PiS&lt;/abbr&gt; za &lt;em&gt;nieposiadanie&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Przyłączam się do &lt;a href=&quot;http://boli.blog.pl/archiwum/index.php?nid=11785931&quot;&gt;boli.blog.pl&lt;/a&gt; i oświadczam, że jeśli to przejdzie, to tu, na tym blogu, &lt;em&gt;umieszczę własną rozebraną fotkę&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;abbr title=&quot;Post Scriptum&quot;&gt;PS&lt;/abbr&gt;: Jako, że wejdziecie tu po opublikowaniu fotki, będziecie posiadać jej kopię w pamięci komputera (i drugą, w pamięci podręcznej na dysku), więc automatycznie podlegacie karze pozbawienia wolności do jednego roku. Beware!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Linux, ten co typografią i kolorami wypala oczy</title>
   <link href="http://room-303.com/blog/2007/03/06/linux-ten-co-typografia-i-kolorami-wypala-oczy/"/>
   <updated>2007-03-06T15:58:47+00:00</updated>
   <id>http://room-303.com/blog/2007/03/06/linux-ten-co-typografia-i-kolorami-wypala-oczy</id>
   <content type="html">&lt;p&gt;Skoro &lt;a href=&quot;http://blog.peres.int.pl/2007/02/22/autostatus-autoresponder-iconv-dalszy-moj-wklad-w-rozwoj-ekg/#c739030&quot;&gt;Riddle zaczął flamewar&lt;/a&gt; dwa tygodnie temu (a wtedy nie chciało mi się kłócić o rację), to ja dzisiaj, dla odmiany, pochwalę się &lt;a href=&quot;http://www.gnome.org/&quot;&gt;GNOME&lt;/a&gt; 2.18.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/412655433/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/153/412655433_8d541f65ea.jpg&quot; alt=&quot;GNOME 2.18 Release Candidate&quot; height=&quot;313&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jak widać, żaden &lt;abbr title=&quot;Fear, Uncertainty, Doubt&quot;&gt;FUD&lt;/abbr&gt; nie zmieni tego, że linuksowe wygładzanie podpikselowe wygląda dużo lepiej niż windowsowy ClearType, a &lt;a href=&quot;http://www.gajim.org/&quot;&gt;Gajim&lt;/a&gt; jest użyteczniejszy od Konnekta. Jeśli ktoś ma wątpliwości odnośnie tego ostatniego, to proponuję spróbować dodać 200 osób do listy kontaktów Konnekta (tak, mam tyle osób na rosterze i nie, nie zbieram losowych jellonków).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Grill IT 0100</title>
   <link href="http://room-303.com/blog/2007/02/28/grill-it-0100/"/>
   <updated>2007-02-28T15:00:37+00:00</updated>
   <id>http://room-303.com/blog/2007/02/28/grill-it-0100</id>
   <content type="html">&lt;p&gt;Mamy oficjalny termin czwartego &lt;a href=&quot;http://www.grillit.pl/&quot;&gt;Grilla&lt;/a&gt;. Odbędzie się 6. marca o 18:30. Miejsce bez zmian, hotel Best Western. &lt;a href=&quot;http://www.grillit.pl/?p=19&quot;&gt;Więcej szczegółów&lt;/a&gt; na blogu imprezy.&lt;/p&gt;

&lt;p&gt;Jak zwykle będzie można nas spotkać, tym razem wystąpię jednak tylko w barwach Generated Content.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Doskonałe włamanie do NFZ?</title>
   <link href="http://room-303.com/blog/2007/02/26/doskonale-wlamanie-do-nfz/"/>
   <updated>2007-02-26T14:24:24+00:00</updated>
   <id>http://room-303.com/blog/2007/02/26/doskonale-wlamanie-do-nfz</id>
   <content type="html">&lt;p&gt;Z pewnością większość z was włamania na strony kojarzy nierozerwalnie z Gorionem, &lt;q&gt;osobą powszechnie kojarzoną pod kątem bezpieczeństwa.&lt;/q&gt; Tym razem przedstawię wam jednak postać Roya, który dokonał czegoś dalece bardziej przebiegłego. Jego włamanie do &lt;abbr title=&quot;Narodowego Funduszu Zdrowia&quot;&gt;NFZ&lt;/abbr&gt; posiada wszelkie cechy ataku idealnego — nie zostawił śladów, nie miał żadnego motywu i zrobił to bez naruszenia integralności systemu i bez obejścia zabezpieczeń cyfrowych. To sprawia, że jego atak nie kwalifikuje się pod żaden paragraf — jest całkowicie bezkarny.&lt;/p&gt;

&lt;h4&gt;Atak na &lt;abbr&gt;NFZ&lt;/abbr&gt;&lt;/h4&gt;

&lt;p&gt;Kluczowym elementem ataku było posiadanie skrzynki e-mail. Jako przewidujący cracker, Roy swoją skrzynkę założył już lata temu, na długo przed datą ataku, który miał miejsce dzisiaj. Dzięki temu ewentualne śledztwo nie byłoby w stanie powiązać daty rejestracji z samym atakiem.&lt;/p&gt;

&lt;p&gt;Dalej poszło z górki, Roy długo czekał na ten dzień, ale w końcu jego chytry plan chwycił. Dziś rano na jego skrzynkę przyszedł list. List z &lt;abbr&gt;NFZ&lt;/abbr&gt;. Z &lt;em&gt;załącznikiem&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Zapomniawszy dawno o swych niecnych zamiarach, Roy był nieco zaskoczony niezamówioną korespondencją. Zaskoczony do tego stopnia, że w pierwszej chwili nie wiedział, dlaczego pracownik Działu Informatyzacji wysłał mu w załączniku &lt;strong&gt;cały serwis &lt;abbr&gt;NFZ&lt;/abbr&gt; wraz z panelem administracyjnym&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;Epilog&lt;/h4&gt;

&lt;p&gt;Właściwie, po pewnym czasie, Roy przypomniał sobie, że wcale nie planował żadnego ataku ani włamania. Postanowił więc odpisać, pytając o co chodzi. Odpowiedź była tyle krótka, co zwięzła. I takoż nieortograficzna:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Przepraszam, to nie są wirusy. Zaszła pomyłka w adresie e-mail.&lt;/p&gt;

&lt;p&gt;Proszę usunąć tego mail’a jak naj szybciej&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Jeśli więc posiadacie konto pocztowe, strzeżcie się. Któregoś dnia może się bowiem okazać, że i wy zostaniecie bezwzględnymi crackerami, a wasze zdolności w dziedzinie inżynierii socjalnej rozwinęły się na tyle, że ofiary same się do was zgłaszają.&lt;/p&gt;

&lt;p&gt;Roy list usunął, choć nie jestem pewien, czy ktoś inny zrobiłby to samo. Zaś Narodowemu Funduszowi Zdrowia gratulujemy działu &lt;abbr title=&quot;Information Technology&quot;&gt;IT&lt;/abbr&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Marvell vs. Patrys</title>
   <link href="http://room-303.com/blog/2007/02/26/marvell-vs-patrys/"/>
   <updated>2007-02-26T00:28:45+00:00</updated>
   <id>http://room-303.com/blog/2007/02/26/marvell-vs-patrys</id>
   <content type="html">&lt;p&gt;W ramach nowej zabawy &lt;a href=&quot;http://paweltkaczyk.midea.pl/619/&quot;&gt;napadł mnie Paweł&lt;/a&gt;. W skrócie chodzi o to, że wytypowana osoba musi opublikować pięć nieznanych faktów ze swojego życia. Potem musi wybrać pięć następnych osób, które podlegają tym samym zasadom.&lt;/p&gt;

&lt;h4&gt;Czego pewnie nie wiecie&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Jestem dzieckiem komputerów. Kiedy szedłem do zerówki, potrafiłem w miarę płynnie czytać. W pierwszej klasie nauczyłem się systemu szesnastkowego, byłem wtedy dumnym posiadaczem Atari 130 XL i prenumeratorem Bajtka. Później pojawiła się Amiga 500 (1&lt;abbr title=&quot;megabajt&quot;&gt;MB&lt;/abbr&gt; CHIP, 2&lt;abbr&gt;MB&lt;/abbr&gt; FAST, dysk twardy 40&lt;abbr&gt;MB&lt;/abbr&gt;), którą z kolei zastąpił 486 DX4/100.&lt;/li&gt;
&lt;li&gt;Nie umiem gotować. Ze sprzętem elektronicznym potrafię zrobić wszystko, potrafię naprawić większość mechanicznych urządzeń, matka nauczyła mnie nawet robić na drutach. Moje zdolności kulinarne ograniczają się do pieczenia mięs i robienia jajecznicy (no, potrafię jeszcze ugotować makaron albo przygrzać mrożonki).&lt;/li&gt;
&lt;li&gt;Angielskiego nauczyłem się sam, początkowo oglądając kreskówki na zachodnich kanałach, a potem śledząc BBC. W szkole średniej wstępny egzamin zakwalifikował mnie do grupy zaawansowanej. Przestraszyłem się i poprosiłem o zapisanie do średnio zaawansowanej. Od tego czasu co semestr proszono mnie o zmianę grupy.&lt;/li&gt;
&lt;li&gt;Jednym z moich hobby jest masaż. Kobiet. Podobno jestem w tym niezły, chociaż nigdy na żadnym kursie nie byłem. Zawsze w pobliżu łóżka znajdziesz u mnie olejek eteryczny albo oliwkę Johnsona.&lt;/li&gt;
&lt;li&gt;Zdarza mi się być poligamistą, nie stronię od kobiet, a jednak jest jedna, dla której byłbym gotów zrobić wszystko, zostawić cały swój świat i choćby jutro wyjechać na Kamczatkę. Na szczęście nie jest zainteresowana, bo co ja bym robił na Kamczatce?&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Do odstrzału&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://enbewu.net/blog/&quot;&gt;nbw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;Riddle&lt;/del&gt; &lt;del&gt;Reuptake&lt;/del&gt; &lt;a href=&quot;http://gofuckyourself.jogger.pl/&quot;&gt;gfy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://monochrome.pl/blog/&quot;&gt;Jarv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.konieczny.be/&quot;&gt;piko&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://mklimek.org/&quot;&gt;Rasheed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>OpenID chwilowo wyłączone</title>
   <link href="http://room-303.com/blog/2007/02/23/openid-chwilowo-wylaczone/"/>
   <updated>2007-02-23T13:17:18+00:00</updated>
   <id>http://room-303.com/blog/2007/02/23/openid-chwilowo-wylaczone</id>
   <content type="html">&lt;p&gt;Jak pewnie zauważyliście, próba wejścia na stronę danej notki dzisiaj zwracała białą stronę. Okazało się, że winna jest wtyczka OpenID Registration. Chwilowo została więc wyłączona. W logach nie mam śladu po żadnych błędach, więc OpenID powróci, kiedy zdiagnozuję problem.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Django: nie róbcie tego w domu</title>
   <link href="http://room-303.com/blog/2007/02/23/django-nie-robcie-tego-w-domu/"/>
   <updated>2007-02-23T12:04:16+00:00</updated>
   <id>http://room-303.com/blog/2007/02/23/django-nie-robcie-tego-w-domu</id>
   <content type="html">&lt;p&gt;Wczoraj byłem zmuszony szybko dodać dodatkową funkcjonalność do jednej z rozwijanych przez nas aplikacji. Widok, o który chodziło opiera się na automatycznym, scaffoldowanym widoku administratora. Brzmi prosto?&lt;/p&gt;

&lt;p&gt;Problem polegał na tym, że dostosowywanie logiki administratora jest dopiero w fazie planów (gałąź &lt;code&gt;admin-newforms&lt;/code&gt;). W związku z tym, rozbudowanie go o własną logikę jest teoretycznie na tym etapie niewykonalne.&lt;/p&gt;

&lt;p&gt;Przekopałem się więc przez większość kodu modułu &lt;code&gt;django.contrib.admin&lt;/code&gt; i okazało się, że można Django nieco oszukać. Widoki są funkcjami, z czego korzysta się często przy &lt;q&gt;generic views.&lt;/q&gt; Nie można po nich dziedziczyć, ale można wołać jeden z drugiego.&lt;/p&gt;

&lt;h4&gt;Brzydki hack&lt;/h4&gt;

&lt;p&gt;Do pliku &lt;code&gt;urls.py&lt;/code&gt; na samym początku (przed sekcją &lt;code&gt;admin&lt;/code&gt;) dopisujemy:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;(r'^admin/aplikacja/model/add/', 'serwis.aplikacja.admin_views.add_stage'),&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Następnie zakładamy plik &lt;code&gt;serwis/aplikacja/admin_views.py&lt;/code&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;from django.contrib.admin.views import main

def add_stage(request, *args, **kwargs):
	post = request.POST.copy()
	if request.method == 'POST':
		post['user'] = request.user.id
	request.POST = post
	return main.add_stage(request, 'aplikacja', 'Model', *args, **kwargs)&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Voila!&lt;/p&gt;

&lt;h4&gt;Parę słów wytłumaczenia&lt;/h4&gt;

&lt;p&gt;Pierwsza część jest chyba oczywista, w tym przypadku nadpisujemy widok dodawania dla konkretnego modelu. Ponieważ Django przetwarza mapę rutingu w takiej kolejności, w jakiej są podane regułki, nasza linijka przesłoni znajdujące się niżej automatyczne reguły wbudowanego panelu administratora.&lt;/p&gt;

&lt;p&gt;Druga część to utworzenie osobnego pliku dla widoków administracyjnych (nie musi to być osobny plik, ale to dobra praktyka). W pliku tym umieszczamy definicję własnego widoku &lt;code&gt;add_stage&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;W powyższym przykładzie dodawany jest automatycznie właściciel dla tworzonej instancji modelu. Nie bardzo można zrobić to w samym modelu, bo model jest bezstanowy i nie ma dostępu do stanu aplikacji. Poza tym, chcemy, żeby pole to było ustawiane tylko w tym przypadku.&lt;/p&gt;

&lt;p&gt;Obiekt &lt;code&gt;request.POST&lt;/code&gt; jest domyślnie &lt;code&gt;immutable&lt;/code&gt;, więc tworzymy jego kopię i właśnie tę kopię modyfikujemy, a następnie podmieniamy oryginalny obiekt.&lt;/p&gt;

&lt;p&gt;Ostatnia linijka powoduje wywołanie oryginalnego, &lt;q&gt;magicznego&lt;/q&gt; widoku administratora, dostarczonego przez Django. Z tą różnicą, że przekazujemy do niego nazwę aplikacji i modelu. W przypadku wywołania bezpośredniego, pochodzą one z wyrażenia regularnego w konfiguracji &lt;code&gt;urls.py&lt;/code&gt;, tutaj musimy podać je jawnie.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Jamendo - Otwórz uszy</title>
   <link href="http://room-303.com/blog/2007/02/21/jamendo-otworz-uszy/"/>
   <updated>2007-02-21T19:27:53+00:00</updated>
   <id>http://room-303.com/blog/2007/02/21/jamendo-otworz-uszy</id>
   <content type="html">&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.jamendo.com/pl/&quot;&gt;&lt;img src=&quot;http://room-303.com/blog/wp-content/uploads/2007/02/logo1-en.png&quot; alt=&quot;Jamendo&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dopiero dzisiaj miałem czas pogrzebać dłużej w złożach &lt;a href=&quot;http://www.jamendo.com/&quot;&gt;Jamendo&lt;/a&gt;. I grzebię tak od dobrej godziny.&lt;/p&gt;

&lt;p&gt;Jamendo to otwarta baza równie otwartej muzyki. Znajduje się tam obecnie ponad 26 tysięcy (sic!) utworów, jest więc w czym wybierać. Wszystkie na licencji &lt;a href=&quot;http://www.creativecommons.pl/&quot;&gt;Creative Commons&lt;/a&gt;, można zatem słuchać ich bez dodatkowych opłat.&lt;/p&gt;

&lt;h4&gt;Jak to możliwe?&lt;/h4&gt;

&lt;p&gt;Idea serwisu krąży wokół założenia, że słuchacze powinni wspierać artystę, a nie wytwórnię. Artyści zaś powinni stawiać na publiczność i swoją muzykę, a nie na kontrakty płytowe. Istnieje możliwość wsparcia indywidualnych wykonawców, więc dobra muzyka obroni się sama.&lt;/p&gt;

&lt;p&gt;Polecam wszystkim tym, którzy nie słyszeli jeszcze o serwisie. Polecam i podobnym mnie, którzy dokładne zapoznanie się z nim odkładali na &lt;q&gt;wieczne jutro.&lt;/q&gt; Żałuję, że nie zrobiłem tego wcześniej.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Jogger.pl ma 4 lata, rusza Techblog</title>
   <link href="http://room-303.com/blog/2007/02/20/joggerpl-ma-4-lata-rusza-techblog/"/>
   <updated>2007-02-20T08:53:58+00:00</updated>
   <id>http://room-303.com/blog/2007/02/20/joggerpl-ma-4-lata-rusza-techblog</id>
   <content type="html">&lt;p&gt;Na początek chciałem pogratulować Robertowi &lt;q&gt;Sparrowowi&lt;/q&gt; Wróblowi, bo swoją platformę blogową prowadzi dzielnie od 4 lat. Sam przez długi czas prowadziłem tam swojego bloga, aż zdecydowałem, że WordPress daje mi nieco więcej możliwości i swobody (i mniej komentarzy losowych ludzi, którzy akurat czytali stronę główną).&lt;/p&gt;

&lt;p&gt;Co jest jednak ciekawsze, Jogger zdecydował się wrócić do korzeni i postawić ponownie na blogi techniczne. Za oficjalnym blogiem:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Od dłuższego czasu na Stronie Głównej pojawia się coraz więcej wpisów niezwiązanych z szeroko pojętymi technologiami (w tym i informatycznymi). Przez to, wiele osób kompletnie przestało ją przeglądać, i skupiło się wśród znanych sobie Joggerów. I właśnie dla nich, przyszykowałem małą niespodziankę ;)&lt;/p&gt;

&lt;p&gt;Od dziś (20.02.2007), Jogger posiada drugą domenę - Techblog.pl. Nie martwcie się, nie musicie zakładać nowych kont - do tego została utworzona specjalna kategoria, która zwie się... Techblog! ;) Tylko wpisy z niej lądują na nowej stronie głównej, i mogą się w niej znajdować TYLKO wpisy techniczne. Można umieszczać w niej nawet wpisy o naprawie kranu w łazience, jeśli kogoś to interesuje, pod warunkiem, że nie będzie to wpis typu &lt;q&gt;kran się zepsuł, jak go naprawić&lt;/q&gt;. Osoby, które mimo upomnień będą dodawać wpisy zarówno nie na temat, jak i o niskim poziomie merytorycznym, stracą możliwość publikowania czegokolwiek w tej kategorii.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Fanów blogowania technicznego zapraszam więc na &lt;a href=&quot;http://techblog.pl/&quot;&gt;Techblog.pl&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Kolejna tapeta?</title>
   <link href="http://room-303.com/blog/2007/02/14/kolejna-tapeta/"/>
   <updated>2007-02-14T23:58:29+00:00</updated>
   <id>http://room-303.com/blog/2007/02/14/kolejna-tapeta</id>
   <content type="html">&lt;p&gt;Tym razem szybki projekt, dwie godziny zabawy w &lt;a href=&quot;http://inkscape.org/&quot;&gt;Inkscape&lt;/a&gt;. Pastwiłem się nad programem, odtwarzając jeden z rysunków &lt;a href=&quot;http://homeusers.brutele.be/jpbardiau/mangas/mangas02.html&quot;&gt;żeńskiej wersji Firefoksa&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/390612253/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/147/390612253_d174f6c5d8.jpg&quot; alt=&quot;Firefox Girl&quot; height=&quot;313&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Licencja tradycyjna, &lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.5/&quot;&gt;CC-BY-NC-SA&lt;/a&gt;. Wersji niepanoramicznej nie będzie, bo wystarczy sobie wyśrodkować obrazek na pulpicie.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; &lt;a href=&quot;http://room-303.com/blog/wp-content/uploads/2007/03/wallpaper-fox.tar.gz&quot; title=&quot;Tapeta w SVG&quot;&gt;Tapeta w SVG&lt;/a&gt;, licencja ta sama.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Grill IT 3 na wideo</title>
   <link href="http://room-303.com/blog/2007/02/14/grill-it-3-na-wideo/"/>
   <updated>2007-02-14T14:47:27+00:00</updated>
   <id>http://room-303.com/blog/2007/02/14/grill-it-3-na-wideo</id>
   <content type="html">&lt;p&gt;Tym z was, którzy przegapili trzecią edycję Grilla, polecam zapoznanie się z &lt;a href=&quot;http://www.grillit.pl/?p=17&quot;&gt;materiałami wideo&lt;/a&gt;, które niedawno pojawiły się na blogu Grilla.&lt;/p&gt;

&lt;p&gt;Dostępne są cztery nagrania prezentacji i &lt;a href=&quot;http://www.grillit.pl/?p=13&quot;&gt;komplet slajdów&lt;/a&gt; do nich (z wyjątkiem serwisu Live Chat, którego reprezentanci demonstrację przeprowadzali na żywym programie).&lt;/p&gt;

&lt;p&gt;To był, zdaje się, nasz ostatni Grill w obecnym składzie ekipy &lt;a href=&quot;http://blog.icenter.pl/&quot;&gt;iCenter&lt;/a&gt;. Następnym razem pojawimy się jako przedstawiciele nowej firmy.&lt;/p&gt;

&lt;p&gt;Muszę pamiętać, żeby nie machać tyle rękami, kiedy mówię, bo przyciągam uwagę i filmują moje plecy zamiast ekranu. ;)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>AlphaNet - hosting w wersji alfa</title>
   <link href="http://room-303.com/blog/2007/02/12/alphanet-hosting-w-wersji-alfa/"/>
   <updated>2007-02-12T00:25:29+00:00</updated>
   <id>http://room-303.com/blog/2007/02/12/alphanet-hosting-w-wersji-alfa</id>
   <content type="html">&lt;p&gt;Ze strony &lt;a href=&quot;http://alpha.pl/&quot;&gt;alpha.pl&lt;/a&gt; krzyczą do nas najnowsze wersje oprogramowania. Na konto skusił się też kiedyś mój kolega, Łukasz Olejnik. Jego serwis od jakiegoś czasu nie działa.&lt;/p&gt;

&lt;p&gt;Dostawca usług nie raczył o tym poinformować, poinformował za to wdzięcznie skrypt crona. I informuje nadal, ze szwajcarską punktualnością, dokładnie co godzinę.&lt;/p&gt;

&lt;p&gt;Serwis ma tego pecha, że od początku swego istnienia korzysta z funkcjonalności eAccelerator, który niegdyś na wspomnianym hostingu zwykł działać. Być może wtedy była to jeszcze wersja beta, a do wersji alfa przeszli niedawno?&lt;/p&gt;

&lt;p&gt;&lt;q&gt;Cóż, zdarza się,&lt;/q&gt; pomyślał Łukasz i czym prędzej zgłosił problem swojemu hostowi. Czym prędzej odpisał i host, a helpdesk pomoc swą zaoferował w te słowy:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;eAccelerator działa. Proszę zobaczyć w &lt;code&gt;phpinfo()&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Uspokoiło go to nieco i utwierdziło w przekonaniu, że może spokojnie zignorować wyświetlane zamiast strony:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Call to undefined function: &lt;code&gt;eaccelerator_get()&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Do dziś ignoruje więc komunikaty, pracuje także nad przekonaniem swoich odwiedzających, że biała strona z czarnym napisem nie jest warta uwagi i świadczy o normalnej pracy serwera.&lt;/p&gt;

&lt;p&gt;Dziękujemy zatem panom z AlphaNetu za wyczerpującą odpowiedź. Gratulujemy także czasu reakcji na zgłoszenie, a tak wspaniałego hostingu na resztę życia i sobie i wam życzę.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Flexo Partner - elastyczna niekompetencja</title>
   <link href="http://room-303.com/blog/2007/02/05/flexo-partner-elastyczna-niekompetencja/"/>
   <updated>2007-02-05T08:11:29+00:00</updated>
   <id>http://room-303.com/blog/2007/02/05/flexo-partner-elastyczna-niekompetencja</id>
   <content type="html">&lt;p&gt;Pamiętacie, gdzie ongiś włamał się imć Gorion? Nie, nie do Katowic. Włamał się na serwery &lt;a href=&quot;http://www.futuro.pl/futuro_flexo_partner/&quot;&gt;Flexo Partnera&lt;/a&gt;. Cóż, do dziś firma Pro Futuro nie zajęła żadnego stanowiska w sprawie tego włamania. Nie wiadomo nawet, czy ustalili przyczyny. Na tym nie koniec.&lt;/p&gt;

&lt;p&gt;Jako &lt;a href=&quot;http://prodesign.pl/&quot;&gt;iCenter&lt;/a&gt; obsługujemy partnerów, którzy mają tam wykupiony hosting. Może hosting to trochę za dużo powiedziane. Na stronie czytamy:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;W ramach usługi &lt;strong&gt;Flexo Partner&lt;/strong&gt; została przygotowana platforma hostingowa dzięki której każdy Partner może zostać dostawcą &lt;strong&gt;kompleksowych usług hostingowych!&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Kluczowym słowem są tutaj owe &lt;q&gt;kompleksowe,&lt;/q&gt; co dosłownie można przetłumaczyć jako &lt;q&gt;skomplikowane.&lt;/q&gt; Nie będę się czepiał interpunkcji. Przyczepię się za to do jakości ich hostingu.&lt;/p&gt;

&lt;p&gt;Za jedyne 2500 PLN rocznie możemy kupić sobie &lt;q&gt;wirtualny serwer.&lt;/q&gt; W 100% wirtualny, bo dostajemy tylko &lt;a href=&quot;http://www.futuro.pl/images/stories/flexopartner/fp_panel_big.gif&quot;&gt;nędzny panelik&lt;/a&gt; na dzielonym hostingu.&lt;/p&gt;

&lt;p&gt;W zestawieniu z &lt;a href=&quot;http://dreamhost.com/&quot;&gt;DreamHostem&lt;/a&gt; mają znaczną przewagę geograficzną. Niskie pingi to niewątpliwy zysk dla serwisów. Tracimy za to jakieś 2000 PLN nadpłaty, 150 gigabajtów miejsca na dysku, 1900 gigabajtów miesięcznego transferu i &lt;em&gt;jakiekolwiek wsparcie techniczne&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Jak to? Otóż technikom zajmującym się tą platformą zupełnie nie przeszkadzał fakt, że jakikolwiek skrypt zakodowany &lt;a href=&quot;http://www.ioncube.com/&quot;&gt;ionCube&lt;/a&gt; powodował segfault serwera &lt;abbr title=&quot;World Wide Web&quot;&gt;WWW&lt;/abbr&gt;. Zareagowali po dwóch dniach od zgłoszenia tej drobnej usterki.&lt;/p&gt;

&lt;p&gt;Ich reakcja wiele nie dała, bo część skryptów dalej kończy swój krótki żywot na enigmatycznej &lt;q&gt;pięćsetce&lt;/q&gt; (500 Internal Server Error). Zapewne z innego, równie błahego powodu, ale… &lt;strong&gt;nie ma żadnego (sic!) dostępu do logów serwera&lt;/strong&gt;. Null, nada, zero, Kononowicz. Po wysłaniu sterty maili w środę, dzisiaj raczyli odpisać. Kolejny raz informując nas, że &lt;em&gt;logi dla poszczególnych domen składają ręcznie i na życzenie mogą je przygotować dla konkretnej daty i wysłać mailem&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;To ja teraz rozumiem, co oznacza stanowisko &lt;q&gt;logistyk&lt;/q&gt; w firmie hostingowej. Jego geneza jest prosta do wytłumaczenia, słowo pochodzi od dwóch angielskich słów: &lt;q&gt;log&lt;/q&gt; (dziennik) i &lt;q&gt;stick&lt;/q&gt; (sklejać). Siedzi tam sobie stado etatowych logistyków i ręcznie skleja logi dla klientów. Wcale bym się nie zdziwił.&lt;/p&gt;

&lt;p&gt;Gorąco polecam wszystkim miłośnikom mocnych wrażeń, resztę informuję jednak, że w ciągu ostatniego tygodnia home.pl uruchomił (po 4 latach męczenia z mojej strony i ze strony wielu innych agencji) wsparcie dla ionCube. Masz konto na Flexo Partnerze? Może już czas zmienić hosting?&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Odchodzę z iCenter</title>
   <link href="http://room-303.com/blog/2007/02/04/odchodze-z-icenter/"/>
   <updated>2007-02-04T14:21:22+00:00</updated>
   <id>http://room-303.com/blog/2007/02/04/odchodze-z-icenter</id>
   <content type="html">&lt;p&gt;Jak część z was już wie, 29. stycznia bieżącego roku wypowiedziałem umowę o pracę. Tym samym — z końcem lutego — moim pracodawcą przestaje być &lt;a href=&quot;http://prodesign.pl/&quot;&gt;agencja interaktywna iCenter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Razem ze mną odchodzi ze stałego zatrudnienia w firmie zespół programistyczny, odpowiedzialny za &lt;a href=&quot;http://cms.wego.pl/&quot;&gt;cms wego&lt;/a&gt;. Od marca &lt;em&gt;wego będzie rozwijane przez nas&lt;/em&gt; poza biurem agencji. Jako pomysłodawca projektu, pozostanę jego opiekunem technicznym. iCenter pozostanie jedynym właścicielem praw majątkowych do produktu.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://room-303.com/blog/wp-content/themes/k2/images/video.png&quot; alt=&quot;Film&quot; style=&quot;vertical-align: middle;&quot; /&gt; &lt;a href=&quot;http://wirusy.room-303.com/wego/wego-walkthrough.ogg&quot;&gt;wersja Theora OGG&lt;/a&gt; | &lt;a href=&quot;http://wirusy.room-303.com/wego/wego-walkthrough.swf&quot;&gt;wersja Flash SWF&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Więcej szczegółów na ten temat w &lt;a href=&quot;http://blog.icenter.pl/2007/01/31/co-dalej-z-wego-cms/&quot;&gt;oficjalnej notce na blogu firmowym&lt;/a&gt;. Ciekawskich powinna zainteresować informacja, że właśnie testujemy system do zarządzania kluczami licencyjnymi i już niedługo będzie można pobrać sobie 60-dniowe demo do zabawy we własnej domenie.&lt;/p&gt;

&lt;p&gt;Ja tymczasem pozostaję otwarty na ciekawe propozycje pracy. Mój profil zawodowy znaleźć można &lt;a href=&quot;http://www.linkedin.com/in/patrys&quot;&gt;na LinkedIn&lt;/a&gt;, a maile proszę kierować na adres &lt;code&gt;patrys at pld-linux.org&lt;/code&gt;. Z góry przepraszam, jeśli nie odpiszę każdemu, ale trochę zajmuje mi reorganizacja życia w związku ze zmianami.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Mój blog stanie się płatny?</title>
   <link href="http://room-303.com/blog/2007/02/03/moj-blog-stanie-sie-platny/"/>
   <updated>2007-02-03T21:23:32+00:00</updated>
   <id>http://room-303.com/blog/2007/02/03/moj-blog-stanie-sie-platny</id>
   <content type="html">&lt;p&gt;Grupa oszołomów (liczy się pierwsze wrażenie) z serwisu &lt;a href=&quot;http://www.noadblock.pl/&quot;&gt;NoAdBlock&lt;/a&gt; zapewniła mi rozrywkę na sporą część wieczoru. Niedługo będę musiał wprowadzić płatne konta dla czytelników, ale od początku.&lt;/p&gt;

&lt;p&gt;Akcja wyskoczyła parę dni temu na &lt;a href=&quot;http://groups.google.com/group/pl.comp.www/browse_thread/thread/101332a7786af804/a5f29b4a97812e99&quot;&gt;grupie &lt;code&gt;pl.comp.www&lt;/code&gt;&lt;/a&gt;. Początkowo pośmiałem się i pomyślałem sobie &lt;q&gt;pewnie prowokacja.&lt;/q&gt; Dzisiaj przekopałem się przez cały wątek i jestem pod wrażeniem tego, co ludzie potrafią wymyślić, kiedy im się nudzi.&lt;/p&gt;

&lt;h4&gt;Celowy cel akcji&lt;/h4&gt;

&lt;p&gt;Na stronie czytamy:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;NoAdBlock to celowa akcja internetowa mają na celu…&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Miłe zaskoczenie już na początku. Jak wiadomo, większość akcji jest bezcelowych. Dalej typowy synkretyzm rodzajowy i tak zwany wiersz biały kononowiczowski (&lt;q&gt;co się stało się&lt;/q&gt;).&lt;/p&gt;

&lt;h4&gt;Reklamy gwarancją jakości w Sieci&lt;/h4&gt;

&lt;p&gt;Stojący za akcją marketoidzi (bo i kto inny?) śmią twierdzić, że blokowanie chamskich reklam psuje Internet. Że jedyną alternatywą dla nachalnych toplayerów we flashu jest płatny dostęp do treści. Rozumiem, że reklama kontekstowa to bzdura, a wrocławianie na stronie o klockach lego poszukują migających i śpiewających promocji odkurzaczy w sklepie z Bydgoszczy. Nieetyczne nie jest blokowanie pełnoekranowych reklam, nieetyczne jest pobieranie pieniędzy od reklamodawców za kliknięcie zamiast faktycznego zakupu.&lt;/p&gt;

&lt;p&gt;Przez to zamiast profilować reklamy według zainteresowań internauty, agencje wciskają mi bzdury zupełnie od czapy i przez to na serwisie o rowerach wyskakuje mi pełnoekranowa reklama psiej karmy. Nawet jeśli na nią kliknę (bo nie trafię w trzypikselowy krzyżyk do zamykania), to &lt;em&gt;reklamodawca na tym straci&lt;/em&gt;. Straci podwójnie — raz, że zapłaci za transfer, a ja od razu zamknę jego stronę; dwa, że najskuteczniejszą formą reklamy jest marketing wirusowy, a ja będę szczerze odradzał jego produkty potencjalnym nabywcom, sparzony nieuczciwym naciągactwem.&lt;/p&gt;

&lt;h4&gt;Siódme: nie kradnij&lt;/h4&gt;

&lt;p&gt;W samym wątku można też przeczytać, że blokowanie reklam to kradzież, tak samo jak piractwo komputerowe. Po pierwsze, piractwo komputerowe nie posiada znamion kradzieży. Nie ma mowy o uszczupleniu stanu posiadania prawowitego autora programu. Można mówić o nieuczciwej konkurencji, nieautoryzowanej redystrybucji, łamaniu licencji, o przestępczości gospodarczej (bo który pirat ze stadionu rozlicza dochody), ale nie o kradzieży.&lt;/p&gt;

&lt;p&gt;Podobnie w przypadku blokowania reklam, kradzieży nie ma. Mało tego, prawo w Polsce daje mi pełną swobodę w dziedzinie obróbki pozyskanych legalnie danych (z wyjątkiem prawa do redystrybucji poza warunkami użytku dozwolonego). Mogę więc sobie wyciąć reklamy, mogę je przemalować, a nawet zmienić treść samej strony. Legalnie.&lt;/p&gt;

&lt;h4&gt;Nie kupisz proszku do prania &amp;mdash; wynocha&lt;/h4&gt;

&lt;p&gt;Najlepszy jest jednak pomysł blokowania ludzi, którzy nie pobierają reklam. Rzekomo dostęp do treści jest automatycznie objęty jakąś magiczną licencją, która zobowiązuje mnie do podziwiania serwowanych mi moim kosztem miniatur filmowych. Bzdura, do momentu, kiedy nie zaakceptuję świadomie jakiejś licencji, to nic mnie nie obowiązuje. Internet jest wolny i bezpłatny &lt;em&gt;by design&lt;/em&gt;, a na niektóre formy reklamy zgadzam się dobrowolnie, bo to &lt;em&gt;ja płacę za oglądanie reklam&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Przy regularnie odwiedzanym wartościowym serwisie, wolałbym zapłacić tych 5 złotych miesięcznie niż za każdym razem pobierać od kilkuset kilo- do kilku megabajtów niezamówionej treści. A jeszcze taniej jest te ustrojstwa wyłączyć.&lt;/p&gt;

&lt;h4&gt;Na koniec&lt;/h4&gt;

&lt;p&gt;Podsumowując, skoro reklam u mnie nie oglądacie, pozostaje mi wprowadzić płatny dostęp do notek. Wszak nie liczy się ciekawa treść, ważne są tylko pieniądze wyciągane od idiotów. A teraz marsz, instalować &lt;a href=&quot;https://addons.mozilla.org/firefox/1865/&quot;&gt;AdBlock Plus&lt;/a&gt;, najskuteczniejsze narzędzie do nieetycznego filtrowania zasobów Sieci (i nie cieknie pamięcią, w przeciwieństwie do oryginalnego AdBlocka).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Google ma poważnego konkurenta</title>
   <link href="http://room-303.com/blog/2007/02/03/google-ma-powaznego-konkurenta/"/>
   <updated>2007-02-03T10:29:51+00:00</updated>
   <id>http://room-303.com/blog/2007/02/03/google-ma-powaznego-konkurenta</id>
   <content type="html">&lt;p&gt;Dziś na uczelni postanowiłem, w czasie egzaminu, sprawdzić sobie pocztę. Powitała mnie nie lada niespodzianka, otóż Google korzysta teraz z usług nowej, tajemniczej firmy. Informuje nas o tym żółta ramka na ekranie powitalnym.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/378131025/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/187/378131025_0bc349e7d9.jpg&quot; alt=&quot;Goolge Accounts&quot; height=&quot;375&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://netto.blox.pl/&quot;&gt;Marcin Jagodziński&lt;/a&gt; w rozmowie zasugerował, że następna będzie &lt;q&gt;Pirtualna Wolska&lt;/q&gt;, z dedykacją dla miłościwie nam panującej władzy dwojakiej.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Gadu-Gadu wchodzi na giełdę</title>
   <link href="http://room-303.com/blog/2007/02/01/gadu-gadu-wchodzi-na-gielde/"/>
   <updated>2007-02-01T13:45:57+00:00</updated>
   <id>http://room-303.com/blog/2007/02/01/gadu-gadu-wchodzi-na-gielde</id>
   <content type="html">&lt;p&gt;Opublikowali nawet &lt;a href=&quot;http://relacje.gadu-gadu.pl/download/Z2Z4L2dhZHUvcGwvZGVmYXVsdF9vcGlzeS8yNi8xLzE/prezentacja_gadugadu_sa.pdf&quot;&gt;prezentację skierowaną do potencjalnych inwestorów&lt;/a&gt;. Jak &lt;a href=&quot;http://netto.blox.pl/2007/02/gadu-the-kononowicz-way-of-ipo.html&quot;&gt;napisał Marcin Jagodziński&lt;/a&gt;, wynika z niej absolutnie nic. Miałem za to dość abstrakcyjne skojarzenie związane z ostatnim slajdem, podsumowującym zalety spółki.&lt;/p&gt;

&lt;blockquote&gt;&lt;h4&gt;Ostatni zajazd syndyka&lt;/h4&gt;

&lt;p&gt;Akt pierwszy, scena pierwsza&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Rok 2000, upadłość ogłasza Astra-Zenith S.A. Syndyk masy upadłości przybywa, by zawiadomić o zajęciu majątku na czas rozliczenia się z wierzycielami.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;V-ce Prezes Zarządu ds. Marketingu (M) zwraca się do V-ce Prezesa Zarządu ds. Finansowych (F).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;cite&gt;(M)&lt;/cite&gt;: Ach, smutne to czasy. Syndyk przybywa.&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;(F)&lt;/cite&gt;: Zaprawdę smutne. Po cóż jednak syndyk w progach naszych?&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;(M)&lt;/cite&gt;: Podobno gotówka sprowadza go w nasze strony. Długi porobiłeś pewnie, nicponiu.&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;(F)&lt;/cite&gt;: Jakże to, nic nie wiem. Komu możemy być winni kasę?&lt;/li&gt;
&lt;li&gt;&lt;cite&gt;(M)&lt;/cite&gt;: &lt;strong&gt;Możemy być wszystkim!&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Słychać stukot kopyt na gościńcu, obaj wychodzą przywitać syndyka.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>Linux Videos już niedługo</title>
   <link href="http://room-303.com/blog/2007/01/25/linux-videos-juz-niedlugo/"/>
   <updated>2007-01-25T21:16:39+00:00</updated>
   <id>http://room-303.com/blog/2007/01/25/linux-videos-juz-niedlugo</id>
   <content type="html">&lt;p&gt;Uruchomiony przeze mnie serwis &lt;a href=&quot;http://linuxvideo.generatedcontent.com/&quot;&gt;Linux Videos&lt;/a&gt; zbliża się do oficjalnej wersji. Szkic nowej oprawy jest gotowy od zeszłego roku, niedługo nowa wersja strony, tym razem zasilana przez &lt;a href=&quot;http://wego.pl/&quot;&gt;wego&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/369249457/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/169/369249457_13c7bae55f.jpg&quot; alt=&quot;Linux Videos&quot; height=&quot;500&quot; width=&quot;441&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Projekt graficzny autorstwa &lt;a href=&quot;http://enbewu.net/blog/&quot;&gt;nbw&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Pokój 303 bez wuwy</title>
   <link href="http://room-303.com/blog/2007/01/25/pokoj-303-bez-wuwy/"/>
   <updated>2007-01-25T15:28:14+00:00</updated>
   <id>http://room-303.com/blog/2007/01/25/pokoj-303-bez-wuwy</id>
   <content type="html">&lt;p&gt;W końcu (lenistwo) pozbyłem się prefiksu &lt;q&gt;www&lt;/q&gt; przed domeną. Przekierowanie powinno nastąpić automagicznie, ale na wszelki wypadek informuję.&lt;/p&gt;

&lt;p&gt;Nie wiem, jak poradzą sobie z tym poszczególne czytniki &lt;abbr title=&quot;Really Simple Syndication&quot;&gt;RSS&lt;/abbr&gt;, będę wdzięczny za informacje, jeśli wystąpią jakieś problemy.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Kontekstowa reklama Onetu</title>
   <link href="http://room-303.com/blog/2007/01/21/kontekstowa-reklama-onetu/"/>
   <updated>2007-01-21T17:02:40+00:00</updated>
   <id>http://room-303.com/blog/2007/01/21/kontekstowa-reklama-onetu</id>
   <content type="html">&lt;p&gt;Reklamy kontekstowe to nie żadna nowość i wydawało mi się, że każdy potrafi je zrobić rozsądnie. Onet przekonał mnie, że nie do końca.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/364648264/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/128/364648264_c4992e58ba.jpg&quot; alt=&quot;Contextual ads provided by Onet.pl&quot; height=&quot;284&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Co jest na powyższym obrazku nie tak? Po pierwsze — reklama zasłania treść strony. Pierwsze, co chciałem zrobić po wejściu na serwis (a jest to serwis informacyjny Onetu, a nie darmowa strona sąsiada-hobbysty), to z niego wyjść.&lt;/p&gt;

&lt;p&gt;W połowie drogi do przycisku &lt;q&gt;zamknij zakładkę&lt;/q&gt; zwrócił moją uwagę brak jakiejkolwiek metody zamknięcia reklamy. &lt;q&gt;Przecież musieli o tym pomyśleć!&lt;/q&gt; Co więc poszło nie tak? Krótka wycieczka do kodu źródłowego pokazała, że przycisk do zamykania reklam znajduje się w tym samym katalogu, skąd serwowane są reklamy portalu. Zablokował go &lt;a href=&quot;https://addons.mozilla.org/firefox/1865/&quot;&gt;Adblock Plus&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Jaki z tego morał? Nie trzymać grafik funkcjonalnych razem z reklamowymi? Też. Przede wszystkim &lt;em&gt;reklama nie powinna uniemożliwiać przeczytania treści strony&lt;/em&gt;. Dotyczy to również wszelakich &lt;q&gt;toplayerów&lt;/q&gt; i innych ustrojstw, które nie tylko zniechęcają do marki reklamowanego produktu, ale w równym stopniu denerwują użytkowników serwisu, a na tych powinno ci zależeć.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>OpenID</title>
   <link href="http://room-303.com/blog/2007/01/20/openid/"/>
   <updated>2007-01-20T23:00:41+00:00</updated>
   <id>http://room-303.com/blog/2007/01/20/openid</id>
   <content type="html">&lt;p&gt;Skończyłem testy i blog obsługuje już podpisywanie komentarzy wizytówkami &lt;a href=&quot;http://blog.identity20.pl/&quot;&gt;cyfrowej tożsamości&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Minie jeszcze pewnie trochę czasu, zanim &lt;a href=&quot;http://www.grillit.pl/&quot;&gt;Grill IT&lt;/a&gt; udostępni nagranie mojej &lt;a href=&quot;http://www.room-303.com/blog/2007/01/17/getting-grill-30/&quot;&gt;prezentacji o OpenID&lt;/a&gt;, ale już teraz namawiam gorąco do uruchomienia na swoich blogach wsparcia dla tej technologii. Jeśli rozpowszechni się w blogosferze, to prędzej czy później, portale będą zmuszone wprowadzić to do swojej oferty.&lt;/p&gt;

&lt;p&gt;Wsparcie w najbliższej przyszłości deklarują &lt;a href=&quot;http://traduko.info/&quot;&gt;Traduko&lt;/a&gt;, &lt;a href=&quot;http://7thguard.net/&quot;&gt;7&lt;sup&gt;th&lt;/sup&gt;Guard&lt;/a&gt; i &lt;a href=&quot;http://www.spinacz.pl/&quot;&gt;Spinacz&lt;/a&gt;. Z czasem dołączą kolejni. W przypadku Wordpressa, wystarczy instalacja &lt;a href=&quot;http://verselogic.net/projects/wordpress/wordpress-openid-plugin/&quot;&gt;wtyczki VerseLogic&lt;/a&gt; i ewentualne dostosowanie szablonu.&lt;/p&gt;

&lt;p&gt;Są też realne szanse, że niebawem ruszy &lt;a href=&quot;http://myid.pl/&quot;&gt;MyID.pl&lt;/a&gt;. W momencie, kiedy powstawał, miał być pierwszym polskim dostawcą tożsamości, w praktyce wyprzedził nas Marcin Jagodziński z &lt;a href=&quot;http://openid.pl/&quot;&gt;OpenID.pl&lt;/a&gt;. My &lt;em&gt;ciągle nie mamy logo&lt;/em&gt; (jesteś grafikiem — &lt;strong&gt;pomóż&lt;/strong&gt;).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Getting Grill 3.0</title>
   <link href="http://room-303.com/blog/2007/01/17/getting-grill-30/"/>
   <updated>2007-01-17T00:57:49+00:00</updated>
   <id>http://room-303.com/blog/2007/01/17/getting-grill-30</id>
   <content type="html">&lt;p&gt;Właśnie weszliśmy z &lt;a href=&quot;http://enbewu.net/blog/&quot;&gt;nbw&lt;/a&gt; do domu, prosto z trzeciej minikonferencji bez krawatów &amp;mdash; &lt;a href=&quot;http://grillit.pl/&quot;&gt;Grill IT&lt;/a&gt;. Z notką o prawie dwie godziny &lt;a href=&quot;http://yashke.com/2007/01/17/po-grill-it-3/&quot;&gt;wyprzedziło mnie yashke.com&lt;/a&gt;, więc pozostaje mi tylko powiedzieć, że było miło spotkać się z resztą kreatywnych ludzi z branży &amp;mdash; jak zwykle.&lt;/p&gt;

&lt;p&gt;Udało mi się też przeprowadzić mniej lub bardziej udaną prezentację OpenID, którą udostępniam w celach archiwalnych &amp;mdash; bez komentarza raczej wiele się z niej nie można dowiedzieć :)&lt;/p&gt;

&lt;p&gt;&lt;a id=&quot;p333&quot; href=&quot;http://www.room-303.com/blog/wp-content/uploads/2007/01/openid.ppt&quot;&gt;OpenID w praktyce&lt;/a&gt; (127 &lt;abbr title=&quot;kilobajtów&quot;&gt;kB&lt;/abbr&gt;, PowerPoint)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Cultural Learnings Of Secunia for Make Benefit Glorious Blog of Gorion</title>
   <link href="http://room-303.com/blog/2007/01/13/cultural-learnings-of-secunia-for-make-benefit-glorious-blog-of-gorion/"/>
   <updated>2007-01-13T17:36:14+00:00</updated>
   <id>http://room-303.com/blog/2007/01/13/cultural-learnings-of-secunia-for-make-benefit-glorious-blog-of-gorion</id>
   <content type="html">&lt;p&gt;Paweł szaleje. Kiedy zasugerowaliśmy mu, że sam nic nigdy nie opublikował na Secunii ani na Bugtraq, a tytułuje się ekspertem &lt;q&gt;pod kątem&lt;/q&gt; bezpieczeństwa, postanowił, że dłużej tak być nie może i sprawę trzeba czym prędzej ruszyć do przodu.&lt;/p&gt;

&lt;p&gt;Jak postanowił, tak uczynił&amp;hellip; i przekleił na bloga cały traffic z list bezpieczeństwa z ostatniego tygodnia.&lt;/p&gt;

&lt;p&gt;A to wszystko przez to, że w wolnej minucie pozwoliłem sobie na żart.&lt;/p&gt;

&lt;h4&gt;bblog.pl i &lt;abbr title=&quot;Cross Site Request Forgery&quot;&gt;CSRF&lt;/abbr&gt;&lt;/h4&gt;

&lt;p&gt;Jeden z rodzajów złośliwych ataków na systemy informatyczne to właśnie &lt;q&gt;podrabianie zapytań,&lt;/q&gt; czy jak bardziej obrazowo &lt;a href=&quot;http://paweljablonski.bblog.pl//wpis,zbior;kilku;informacji;na;temat;bledow;it,1267.html&quot;&gt;określił to nasz specjalista&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Widać jakimi metodami posługuje się ta samozwańcza &quot;elita&quot;, która odziwo ma zawsze najwięcej do powiedzenia o poziomie wiedzy innych, podczas gdy sobą reprezentuje totalne dno i czyni jakże kompromitujące manewry.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Zgadza się, znaleźliśmy podatność na &lt;abbr&gt;CSRF&lt;/abbr&gt; w systemie bblog.pl. Wymagało to założenia darmowego konta i kliknięcia myszką (sztuk pięć). Idea jest prosta — na dowolnej stronie w Internecie wystarczy umieścić odnośnik do zewnętrznych danych, o formacie takim, jak te zacytowane na blogu Pawła:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;http://paweljablonski.bblog.pl/adm/edit_post,rm,1183.html&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Jest to atak o tyle ciekawy, że skierowany na konkretnego użytkownika. Schematów przeprowadzenia jest wiele. Mój żart był jedną z najtrywialnieszych możliwości i stosował odnośniki umieszczone jawnym tekstem. Poświęcając minutę więcej, możnaby skorzystać z &lt;code&gt;mod_rewrite&lt;/code&gt; i przekierować na przykład &lt;code&gt;zdjecie.jpg&lt;/code&gt; na odpowiedni adres dopiero po stronie serwera, zaś w jawnym tekście umieścić tylko odwołanie wyglądające na niewinny obrazek.&lt;/p&gt;

&lt;h4&gt;Zabezpieczenie&lt;/h4&gt;

&lt;p&gt;Mam nadzieję, że bblog.pl załata swoją aplikację, bo atak zalicza się do grupy &lt;q&gt;man in the middle&lt;/q&gt; i jest o tyle złośliwy, że fizyczne skasowanie notki odbywa się przez zalogowanego prawowitego właściciela bloga. Znany powszechnie koń trojański.&lt;/p&gt;

&lt;p&gt;Jako najprostszą metodę zabezpieczenia polecam wygenerowanie unikalnego klucza dla każdej sesji i umieszczenie go w sesji, gdzie nie może zostać podejrzany nawet przez przeglądarkę zalogowanego użytkownika, następnie klucz taki należy dołączyć do wszystkich odnośników, które wyzwalają nieodwracalne akcje (usunięcie notki, zmiana kategorii itp.). Zwykłe porównanie otrzymanego klucza z tym zapisanym wcześniej pozwoli zapobiec wszelkim wywołaniom &lt;abbr&gt;CSRF&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;Na zakończenie proponuję przeczytać sobie cały tekst człowieka, któremu &lt;q&gt;zarzucano wiele razy zbyt elokwentne pisanie&lt;/q&gt; (&lt;cite&gt;&lt;a href=&quot;http://paweljablonski.bblog.pl/wpis,tchorze;zwiekszaja;kryteria;odwagi;,1183.html&quot;&gt;cytat z jego bloga&lt;/a&gt;&lt;/cite&gt;), widać po nim wyraźnie, że Paweł cały czas pracuje nad swoją formą i na szczęście wspomniana elokwencja już nie powróci. Gratuluję także wylistowania zawartości katalogu z prawami do publicznego czytania, telewizja z pewnością będzie zobowiązana, mogąc Pawła gościć ponownie.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; tytuł notki powstał dzięki inspiracji osoby o pseudonimie &lt;strong&gt;roztytybaleron&lt;/strong&gt;. Serdecznie dziękuję.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Nothing personal, just revenge</title>
   <link href="http://room-303.com/blog/2007/01/13/nothing-personal-just-revenge/"/>
   <updated>2007-01-13T02:11:04+00:00</updated>
   <id>http://room-303.com/blog/2007/01/13/nothing-personal-just-revenge</id>
   <content type="html">&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/355373768/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/158/355373768_6c8f80e85d.jpg&quot; alt=&quot;Afro Samurai&quot; height=&quot;215&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Co może być lepsze niż feudalna Japonia? Feudalna Japonia w rozkwicie cyberpunku, skrzyżowana z Brooklynem!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.afrosamurai.com/&quot;&gt;Afro Samurai&lt;/a&gt; zabiera nas do świata, gdzie miecz krzyżuje się z rewolwerem, mnisi strzelają z &lt;abbr title=&quot;Rocket Propelled Grenade&quot;&gt;RPG&lt;/abbr&gt;, a główny bohater jest Murzynem z ogromną czupryną i nieodzwonym skrętem w zębach.&lt;/p&gt;

&lt;p&gt;Co mogę powiedzieć — kreska jest świetna, muzykę zapewnia RZA, krew wylewa się z ekranu na klawiaturę wiadrami. Po pierwszym odcinku mam ochotę zobaczyć pozostałych pięć w tym momencie.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>PHP bezpieczniej</title>
   <link href="http://room-303.com/blog/2007/01/10/php-bezpieczniej/"/>
   <updated>2007-01-10T22:29:54+00:00</updated>
   <id>http://room-303.com/blog/2007/01/10/php-bezpieczniej</id>
   <content type="html">&lt;p&gt;W ramach eksternistycznego zaliczenia kursu &lt;abbr title=&quot;PHP Hypertext Preprocessor&quot;&gt;PHP&lt;/abbr&gt; na studiach, prowadzący zaoferował mi przygotowanie krótkiej prezentacji o języku. Prezentacje nie są tym, co programiści lubią najbardziej. Zamiast prezentacji wyszedł krótki tekst, a zamiast możliwości języka są błędy ludzi.&lt;/p&gt;

&lt;p&gt;Całość zamieszczam i tutaj, może się komuś na coś przyda. O ile wierzę w swoją wiedzę, to zastrzegam z góry, że praca nie była jeszcze oceniana. Przepraszam też za wielkość, ale to AbiWord taki duży plik wygenerował :)&lt;/p&gt;

&lt;p&gt;Pobierz &lt;del&gt;PHP i aplikacje WWW&lt;/del&gt; (290 &lt;abbr title=&quot;kilobajtów&quot;&gt;kB&lt;/abbr&gt;, &lt;abbr title=&quot;Portable Document Format&quot;&gt;PDF&lt;/abbr&gt;)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Drżyjcie, wyznawcy Jabbera</title>
   <link href="http://room-303.com/blog/2007/01/08/drzyjcie-wyznawcy-jabbera/"/>
   <updated>2007-01-08T17:30:28+00:00</updated>
   <id>http://room-303.com/blog/2007/01/08/drzyjcie-wyznawcy-jabbera</id>
   <content type="html">&lt;p&gt;Oto bowiem &lt;a href=&quot;http://www.room-303.com/blog/2006/12/21/hacking-na-zywo-podsumowanie-z-dedykacja-dla-klientow-flexopartner/&quot;&gt;nasz ekspert&lt;/a&gt; do spraw zabezpieczeń postanowił obalić mroczne rządy Gadu-Gadu i zbudował własny… &lt;a href=&quot;http://paweljablonski.bblog.pl/wpis,twoj;wlasny;-;bezpieczny;komunikator,1116.html&quot;&gt;program na zaliczenie laboratorium z C++&lt;/a&gt; (jednak C++, jak to zostało sprawdzone poniżej, ja nie pobierałem binarek).&lt;/p&gt;

&lt;p&gt;Wynalazł on bowiem całkowicie niespotykaną dotąd rzecz — komunikator bez centralnego serwera. Każdy użytkownik marzy bowiem o odpalaniu własnego serwera. Jest tylko jeden kruczek, żeby skorzystać z nowego &lt;q&gt;komunikatora,&lt;/q&gt; trzeba zainstalować klienta &lt;a href=&quot;http://www.jabberpl.org/&quot;&gt;Jabbera&lt;/a&gt;, bo jak inaczej przekazać komuś swój adres &lt;abbr title=&quot;Internet Protocol&quot;&gt;IP&lt;/abbr&gt;?&lt;/p&gt;

&lt;p&gt;Jeśli jednak mamy już klienta Jabbera, który jest zdecentralizowany, obsługuje szyfrowanie połączeń, kodowanie i podpisywanie wiadomości (w tym podpisywanie bez możliwości późniejszej identyfikacji nadawcy, &lt;q&gt;off the record&lt;/q&gt;), jest darmowy i korzystają z niego nawet w Google, to po co nam program, który wygląda jak emulator terminala VAX?&lt;/p&gt;

&lt;p&gt;Jako, że mam dobry humor, pozwolę sobie wyobrazić sytuację, w której odbieram telefon z nieznanego numeru i w słuchawce słyszę radosny dziecięcy głos: &lt;q&gt;Poklikash? Mój &lt;abbr&gt;IP&lt;/abbr&gt; to 82.14…&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Wczoraj tego bloga odwiedziły &lt;strong&gt;2&lt;/strong&gt; osoby.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://terazmy.onet.pl/_i/1912pawel.jpg&quot; alt=&quot;Haker&quot; /&gt;&lt;br /&gt;&lt;q&gt;Pawle, czy w odpowiedzi na pytanie 'na jaki serwer się włamałes?' zaznaczamy odpowiedź &lt;strong&gt;B&lt;/strong&gt;, 'komenda wojewódzka w Katowicach?' Przypominam, że pozostało ci jeszcze jedno koło ratunkowe, pytanie do publiczności.&lt;/q&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>DreamHost zmniejsza swoją ofertę</title>
   <link href="http://room-303.com/blog/2007/01/06/dreamhost-zmniejsza-swoja-oferte/"/>
   <updated>2007-01-06T19:58:20+00:00</updated>
   <id>http://room-303.com/blog/2007/01/06/dreamhost-zmniejsza-swoja-oferte</id>
   <content type="html">&lt;p&gt;Oczywiście, nie dla istniejących klientów. W &lt;a href=&quot;http://blog.dreamhost.com/2007/01/03/new-dream-resolutions&quot;&gt;notce o postanowieniach noworocznych&lt;/a&gt;, załoga DreamHost poinformowała, że w trosce o dobre imię hostingu, będą codziennie obniżać dostępne miejsce i pasmo dla nowych kont.&lt;/p&gt;

&lt;p&gt;Chłopaki twierdzą, że chodzi o zniesienie oskarżeń o &lt;em&gt;overselling&lt;/em&gt;, ale wszyscy doskonale wiemy, że cel jest inny — teraz już nie masz czasu, żeby się zastanawiać nad wyborem hostingu, jutro parametry będą niższe, a cena ta sama. Bardzo sprytny zabieg.&lt;/p&gt;

&lt;p&gt;Póki co, zmiana jest znikoma, więc &lt;a href=&quot;http://www.dreamhost.com/r.cgi?126653&quot;&gt;zakładajcie konta&lt;/a&gt;, zanim oferta się skurczy za bardzo :) (rejestracja przez ten link wspiera hosting projektów &lt;a href=&quot;http://generatedcontent.com/&quot;&gt;Generated Content&lt;/a&gt;, nie ma żadnej zniżki).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Same konkursy</title>
   <link href="http://room-303.com/blog/2007/01/04/same-konkursy/"/>
   <updated>2007-01-04T15:24:36+00:00</updated>
   <id>http://room-303.com/blog/2007/01/04/same-konkursy</id>
   <content type="html">&lt;p&gt;Styczeń przyniósł wiele możliwości otrzymania statusu gwiazdy. W tym konkursy na bloggera roku. Póki co, wiem o dwóch.&lt;/p&gt;

&lt;h4&gt;Polski Blogger&lt;/h4&gt;

&lt;p&gt;Najpierw zostałem zgłoszony do &lt;a href=&quot;http://blogroku.polskiblogger.pl/&quot;&gt;konkursu&lt;/a&gt; organizowanego przez &lt;a href=&quot;http://polskiblogger.pl/autor/&quot;&gt;Pawła Lipca&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Strona konkursu pozostawia, mówiąc oględnie, odrobinę do życzenia (podobnie jak i blog Pawła, ale nie o tym jest notka). O ile wygląd mogę zrozumieć, bo jest to najpopularniejszy — i bardzo zgrabny — temat graficzny dla Wordpressa, tak chaos informacyjny jest trudny do ogarnięcia.&lt;/p&gt;

&lt;p&gt;W jury widać same &lt;q&gt;sławy&lt;/q&gt; blogosfery. Od Igora Janke, znanego publicysty, aż do Krzysztofa Urbanowicza, którego znaleźć można nawet w konserwie, jeśli tylko etykieta zawiera gdziekolwiek napis &lt;q&gt;2.0.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Regulamin przeczytałem od deski do deski. Wynika z niego, co następuje:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;wziąć udział mogą wszyscy i za darmo, nie trzeba mieć nawet bloga&lt;/li&gt;
&lt;li&gt;zgłosić można nawet cudzego bloga, bo konkurs jest dla internautów, a oceniane są blogi&lt;/li&gt;
&lt;li&gt;oceniane jest coś, co się nazywa &lt;q&gt;ogólne wrażenie&lt;/q&gt; — cokolwiek by to nie było&lt;/li&gt;
&lt;li&gt;nie muszę wyrażać zgody na przetwarzanie moich danych, bo mojego bloga zgłosił ktoś inny, czyli w rozumieniu regulaminu nie jestem uczestnikiem&lt;/li&gt;
&lt;li&gt;zgłaszający mojego bloga nie musiał też zgodzić się na publikację informacji o Room 303, bo jest to wymagane tylko w przypadku zgłaszania &lt;em&gt;swojej strony&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;wiadomosci24.pl&lt;/h4&gt;

&lt;p&gt;Drugi konkurs, tym razem na bloggera, organizują &lt;a href=&quot;http://www.wiadomosci24.pl/&quot;&gt;wiadomosci24.pl&lt;/a&gt;. Tutaj do zgłoszenia bloga zaprosił mnie email. Nie wiem, od kogo, bo był sformułowany na tyle ogólnie, że cudem uszedł z życiem po przebiciu się przez filtry antyspamowe.&lt;/p&gt;

&lt;p&gt;W mailu znalazłem link do informacji opublikowanej w aktualnościach. Tam z kolei trafiłem na link do regulaminu. Jest lepszy niż ten wspomniany wcześniej.&lt;/p&gt;

&lt;p&gt;Powiedziałem sobie cicho &lt;q&gt;Jeronimo!&lt;/q&gt; i postanowiłem wziąć udział. I tak postanawiałem. Przez dobrych 20 minut. Przeczytałem regulamin kilka razy, od deski do deski. Wszędzie stało jak byk, że zgłosić można się na &lt;q&gt;specjalnej stronie,&lt;/q&gt; ale odnośnika do tej specjalnej strony już nie było. Poirytowany zacząłem szukać w podglądzie źródła &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt; i znalazłem. Okazało się, że za rejestrację odpowiada ten wielki czerwony banner graficzny w kolumnie nawigacyjnej, który moje oczy przez wspomnianych 20 minut skutecznie omijały. Brawo za użyteczność interfejsu.&lt;/p&gt;

&lt;p&gt;Dziś dostałem za to potwierdzenie przyjęcia bloga do oceny. Z miejsca jednak znalazłem się na przegranej pozycji, bo dwa pierwsze miejsca z pewnością przypadną &lt;a href=&quot;http://riddle.jogger.pl/&quot;&gt;blogowi Riddle'a&lt;/a&gt;. Taką właśnie liczbę razy został on bowiem przyjęty. :)&lt;/p&gt;

&lt;h4&gt;A potem opanujemy świat&lt;/h4&gt;

&lt;p&gt;Skoro w pierwszym konkursie wygra za mnie ktoś inny (a drugi raz bloga zgłosić nie mogę), a w drugim padam pod przeważającą siłą konkurencji, to pozostało mi tylko jedno. Zorganizujemy sobie własny konkurs i wybierzemy bloga roku &lt;a href=&quot;http://10przykazan.com/&quot;&gt;10przykazan&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Oczywiścię żartuję, ale możecie się spodziewać, że niedługo opublikujemy statystyki dotyczące popularności poszczególnych blogów z tego właśnie serwisu (bo do innych serwisów nie mamy dostępu, haha).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Aby palec zwinny...</title>
   <link href="http://room-303.com/blog/2007/01/01/aby-palec-zwinny/"/>
   <updated>2007-01-01T20:15:20+00:00</updated>
   <id>http://room-303.com/blog/2007/01/01/aby-palec-zwinny</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.room-303.com/blog/2006/12/31/podsumowanie-roku/#comment-5847&quot;&gt;jpc poprosił&lt;/a&gt;, żebym się ustosunkował do notki &lt;q&gt;&lt;a href=&quot;http://steve-yegge.blogspot.com/2006/09/good-agile-bad-agile_27.html&quot;&gt;Dobry zwinny, zły zwinny&lt;/a&gt;.&lt;/q&gt; Czytałem ją gdzieś w okolicach października i nie bardzo chcę się teraz przegryzać ponownie przez cały tekst, dlatego zamiast cytować, napiszę, co sam myślę o tak zwanych &lt;q&gt;zwinnych&lt;/q&gt; metodach prowadzenia projektów.&lt;/p&gt;

&lt;p&gt;Część z was pewnie miała już okazję przeczytać &lt;q&gt;&lt;a href=&quot;http://enbewu.net/blog/2006/12/29/kiedy-pomysly-umieraja-dlaczego-nie-warto-czekac/&quot;&gt;Kiedy pomysły umierają…&lt;/a&gt;&lt;/q&gt; na &lt;a href=&quot;http://enbewu.net/blog/&quot;&gt;blogu nbw&lt;/a&gt;. Reszta powinna teraz zabrać się za lekturę. Pracujemy z Tomkiem w tej samej firmie, więc poniżej znajdziecie właściwie tylko uzupełnienie jego tekstu.&lt;/p&gt;

&lt;h4&gt;Projekt&lt;/h4&gt;

&lt;p&gt;Zanim zaczniesz stosować jakiekolwiek &lt;q&gt;ekstremalne&lt;/q&gt; metodyki, musisz przede wszystkim zrozumieć, że nie nadają się do każdego projektu. To, co działa dla Google czy 37signals, nie musi działać dla twojego produktu.&lt;/p&gt;

&lt;p&gt;Kiedy nie zadziała? Kiedy budujesz coś dla konkretnego klienta i kiedy to klient dostarcza specyfikację funkcjonalności. Dla niego nie jest ważne, żeby mieć &lt;em&gt;jakikolwiek&lt;/em&gt; produkt (czy będzie to program, strona &lt;abbr title=&quot;World Wide Web&quot;&gt;WWW&lt;/abbr&gt;, czy jakikolwiek inny projekt programistyczny). Kiedy jedziesz z samochodem do mechanika, też nie oczekujesz przecież, że dziś przykręci jedną śrubkę, a po tygodniu jazdy spyta, czy mocno stuka, bo nie jest pewien, czy najpierw przykręcić drugi koniec zderzaka, czy może wymienić płyn hamulcowy.&lt;/p&gt;

&lt;h4&gt;Firma&lt;/h4&gt;

&lt;p&gt;Metodyki &lt;q&gt;agile&lt;/q&gt; mają to do siebie, że wywołują śmiech u dyrektorów dużych firm. Powód jest prosty — korporacje przez dekady dopieszczały błyszczące schematy hierarchii, wiszące w wielkich szklanych gablotach tuż obok recepcji. Proces decyzyjny wymaga przesłania tony makulatury w górę drzewka tylko po to, żeby propozycja trafiła do pracownika siedzącego w biurze koło ciebie, ale pracującego w innym pionie.&lt;/p&gt;

&lt;p&gt;&lt;q&gt;Agile&lt;/q&gt; z drugiej strony promuje czysto asekuracyjną rolę managerów. Nie ma miejsca na wielowarstwową strukturę zwierzchnictwa, managerowie to bardziej przywódcy niż szefowie. Mają ostatnie słowo przy podejmowaniu decyzji, ale z tego przywileju korzystają tylko w ostateczności. W związku z tym, najłatwiej metodyki takie wprowadzić w firmach małych, zatrudniających kilka-kilkanaście osób. &lt;q&gt;Zwinność&lt;/q&gt; stawia na siłę zespołu, a nie precyzowanie każdego elementu w specyfikacji technicznej.&lt;/p&gt;

&lt;h4&gt;Zespół&lt;/h4&gt;

&lt;p&gt;Tu znów kontrast z &lt;q&gt;borgiem.&lt;/q&gt; Jeśli projekt ma się powieść, zespół musi być mały, co zapewnia łatwość komunikacji. To pociąga za sobą dużo większe wymagania odnośnie predyspozycji każdego z członków zespołu.&lt;/p&gt;

&lt;p&gt;Pracując przy aplikacjach klasy &lt;q&gt;enterprise&lt;/q&gt; (na przykład systemy wspomagania prowadzenia przedsiębiorstw), miałem kilka razy okazję poznać sposób powstawania oprogramowania. Z boku wyglądało to tak, jakby Albert Einstein stał na cokole pośrodku sali i rzucał banany małpom klepiącym w klawiatury. Podejrzewam, że w niejednym zespole jedyną kompetentną osobą był właśnie manager, który doglądał całej bandy &lt;q&gt;klepaczy.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;&lt;q&gt;Zwinność&lt;/q&gt; kładzie silny nacisk na zaangażowanie zespołu w życie projektu. Każdy z biorących udział w powstawaniu produktu musi kochać swoją pracę i potrafić podejmować decyzje działające na korzyść projektu, a nie oszczędzające pracę. Nie ma tu miejsca dla &lt;q&gt;maszynistek,&lt;/q&gt; które potrafią szybko klepać kod, ale co chwilę trzeba im mówić, co mają robić dalej.&lt;/p&gt;

&lt;h4&gt;Podsumowując&lt;/h4&gt;

&lt;p&gt;Aby wdrożenie nowej polityki prowadzenia projektów się powiodło i miało sens, potrzeba pasji. Nie tylko ze strony zarządu, nie tylko ze strony programisty. Potrzeba chęci przejścia na nowy tryb ze strony wszystkich pracowników, którzy mają jakikolwiek udział w rozwoju projektów.&lt;/p&gt;

&lt;p&gt;Żeby przerwać łańcuch, wystarczy jedno słabe ogniwo. Dlatego jedna osoba, która nie będzie myśleć tak, jak reszta, znacznie osłabi zespół (który i tak jest przecież mały), a w rezultacie może doprowadzić do zgonu całego projektu. Nie musi nic specjalnego robić, wystarczy, że swoją niechęcią do wszystkiego będzie wpływać na morale reszty grupy i zniknie pasja.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Podsumowanie roku</title>
   <link href="http://room-303.com/blog/2006/12/31/podsumowanie-roku/"/>
   <updated>2006-12-31T18:26:11+00:00</updated>
   <id>http://room-303.com/blog/2006/12/31/podsumowanie-roku</id>
   <content type="html">&lt;p&gt;Wszyscy piszą, czego się spodziewają i jakie to podejmują postanowienia. Ja napiszę, czego ja oczekiwałem i co z tego się sprawdziło. We wróżenie się bawił nie będę.&lt;/p&gt;

&lt;h4&gt;Linux i &lt;abbr title=&quot;Free/Libre/Open Source Software&quot;&gt;FLOSS&lt;/abbr&gt;&lt;/h4&gt;

&lt;p&gt;Co się udało:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pojawił się stabilny &lt;a href=&quot;http://www.freedesktop.org/wiki/Software/dbus&quot;&gt;D-Bus&lt;/a&gt; 1.0.0&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://tango.freedesktop.org/Tango_Desktop_Project&quot;&gt;projekt Tango&lt;/a&gt; skupił wokół siebie całkiem spore grono i powoli podbija kolejne aplikacje (nie tylko pod względem zgodności nazewnictwa ikon, ale także samego &lt;a href=&quot;http://tango.freedesktop.org/Tango_Fridays&quot;&gt;wyglądu&lt;/a&gt;!)&lt;/li&gt;
&lt;li&gt;pojawił się stabilny &lt;a href=&quot;http://www.gajim.org/&quot;&gt;Gajim&lt;/a&gt; 0.11&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://pld-linux.org/&quot;&gt;&lt;abbr title=&quot;PLD Linux Distribution&quot;&gt;PLD&lt;/abbr&gt;&lt;/a&gt; 3.0 nadaje się do użytku na co dzień&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Co się nie udało:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;moja specyfikacja tematów dźwiękowych dla &lt;a href=&quot;http://www.freedesktop.org/wiki/&quot;&gt;freedesktop.org&lt;/a&gt; dalej ma status szkicu&lt;/li&gt;
&lt;li&gt;nie skończyłem implementować &lt;a href=&quot;http://trac.gajim.org/ticket/2378&quot;&gt;obsługi tematów ikon w Gajimie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;nadal toczą się boje o to, jak powinno wyglądać &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; dla usługi wyszukiwania&lt;/li&gt;
&lt;li&gt;GNOME nadal nie przeszło w pełni na D-Bus (najbardziej prosi o to obsługa sesji)&lt;/li&gt;
&lt;li&gt;&lt;abbr title=&quot;K Desktop Environment&quot;&gt;KDE&lt;/abbr&gt; 4 dalej jest w powijakach&lt;/li&gt;
&lt;li&gt;Gajim nadal nie ma wsparcia dla &lt;a href=&quot;http://trac.gajim.org/ticket/1265&quot;&gt;komunikacji audio/wideo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugzilla.gnome.org/show_bug.cgi?id=352520&quot;&gt;Metacity nie radzi sobie&lt;/a&gt; z obsługą składania (composite)&lt;/li&gt;
&lt;li&gt;Firefox 2 nie działa po zbudowaniu aktualną migawką &lt;code&gt;gcc&lt;/code&gt; 4.2&lt;/li&gt;
&lt;li&gt;wydanie płyt z &lt;abbr&gt;PLD&lt;/abbr&gt; 2.0 nadal jest gdzieś za horyzontem&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;W Sieci&lt;/h4&gt;

&lt;p&gt;Co się udało:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;uruchomiłem w końcu serwis &lt;a href=&quot;http://linuxvideo.generatedcontent.com/&quot;&gt;Linux Videos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://10przykazan.com/&quot;&gt;10przykazan&lt;/a&gt; obsługuje już wszystkie niestandardowe odchyły różnych generatorów &lt;abbr title=&quot;Really Simple Syndication&quot;&gt;RSS&lt;/abbr&gt;&lt;/li&gt;
&lt;li&gt;pojawił się &lt;a href=&quot;http://www.lastfm.pl/&quot;&gt;polski Last.fm&lt;/a&gt; (ale cóż to za &lt;q&gt;kokpit?&lt;/q&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.netvibes.com/&quot;&gt;Netvibes&lt;/a&gt; też rozmawia po polsku&lt;/li&gt;
&lt;li&gt;z Techlandem uruchomiliśmy &lt;a href=&quot;http://callofjuarez.com/&quot;&gt;oficjalną stronę Call of Juarez&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;z 3K Projects i Janmedia zbudowaliśmy &lt;a href=&quot;http://www.pascalbrodnicki.pl/&quot;&gt;blog dla Pascala Brodnickiego&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Co się nie udało:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;zabrakło czasu na przeniesienie &lt;a href=&quot;http://dwaem.com/&quot;&gt;Dwaem&lt;/a&gt; na nasz hosting&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://art.webesteem.pl/&quot;&gt;web esteem art &amp;amp; design&lt;/a&gt; nie doczekało się mojego artykułu do &lt;q&gt;web standards&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://home.pl/&quot;&gt;home.pl&lt;/a&gt; dalej nie oferuje żadnego wsparcia dla szyfrowania kodu źródłowego &lt;abbr title=&quot;PHP Hypertext Preprocessor&quot;&gt;PHP&lt;/abbr&gt; 5, tym samym odcinając się od części klientów&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://nazwa.pl/&quot;&gt;NetArt&lt;/a&gt; zamiast poprawiać jakość usług, postawił na masową sprzedaż kont, przy okazji &lt;a href=&quot;http://www.room-303.com/blog/2006/10/27/netart-sztuka-wciskania-kitu-w-sieci/&quot;&gt;niecodziennie traktując swoich kilkuletnich klientów&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ruszyło &lt;a href=&quot;http://www.pino.pl/&quot;&gt;pino.pl&lt;/a&gt;… no właśnie&lt;/li&gt;
&lt;li&gt;polskie tłumaczenie &lt;a href=&quot;http://gettingreal.37signals.com/&quot;&gt;książki Getting Real&lt;/a&gt; potrzebuje jeszcze sporo miłości językowej&lt;/li&gt;
&lt;li&gt;10przykazan nie doczekało się planowanego na grudzień redesignu&lt;/li&gt;
&lt;li&gt;Linux Videos też czeka na nowy serwis (projekt graficzny jest od dawna, brakuje czasu)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;W pracy&lt;/h4&gt;

&lt;p&gt;Co się udało:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;w pełni przeszliśmy na Subversion (z wszystkimi stronami budowanymi dla klientów włącznie)&lt;/li&gt;
&lt;li&gt;zamieniliśmy &lt;a href=&quot;http://basecamphq.com/&quot;&gt;Basecamp&lt;/a&gt; na &lt;a href=&quot;http://trac.edgewall.org/&quot;&gt;Trac&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;cały hosting stoi już na &lt;abbr&gt;PHP&lt;/abbr&gt; 5.2&lt;/li&gt;
&lt;li&gt;nietypowe aplikacje budujemy w oparciu o &lt;a href=&quot;http://www.cakephp.org/&quot;&gt;CakePHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;wewnętrzne projekty zostały przesunięte z &lt;abbr&gt;PHP&lt;/abbr&gt; na Pythona, więc odpocznę sobie trochę przy wygodniejszym języku&lt;/li&gt;
&lt;li&gt;uruchomiliśmy &lt;a href=&quot;http://blog.icenter.pl/&quot;&gt;bloga firmowego&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Co się nie udało:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://wego.pl/&quot;&gt;wego cms&lt;/a&gt; nie wszedł jeszcze do sprzedaży&lt;/li&gt;
&lt;li&gt;szewc bez butów chodzi — nadal straszą czerwone &lt;a href=&quot;http://icenter.pl/&quot;&gt;strony hostingu&lt;/a&gt; i &lt;a href=&quot;http://prodesign.pl/&quot;&gt;webdesign&lt;/a&gt; (na szczęście już nie postraszą długo)&lt;/li&gt;
&lt;li&gt;nie udało się jeszcze do końca przejść na metodyki &lt;q&gt;zwinne&lt;/q&gt; w prowadzeniu projektów&lt;/li&gt;
&lt;li&gt;dalej szukamy kompetentnego programisty&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Nowy trojan na Gadu-Gadu</title>
   <link href="http://room-303.com/blog/2006/12/26/nowy-trojan-na-gadu-gadu/"/>
   <updated>2006-12-26T18:40:45+00:00</updated>
   <id>http://room-303.com/blog/2006/12/26/nowy-trojan-na-gadu-gadu</id>
   <content type="html">&lt;p&gt;Od kilku godzin, z różnych numerów &lt;abbr title=&quot;Gadu-Gadu&quot;&gt;GG&lt;/abbr&gt;, dostaję pojedyncze wiadomości (w odróżnieniu od rozmów) o treści: &lt;code&gt;www.hsqvyrpzeh.info/?awbiby.jpg&lt;/code&gt; (jeśli używasz Windows, to trzymaj się z daleka). Ostatnia część (query string) jest losowa.&lt;/p&gt;

&lt;p&gt;Fakt, że przychodzi jako pojedyncza wiadomość, każe przypuszczać, że do użytkowników &lt;abbr&gt;GG&lt;/abbr&gt; trafia jako zagnieżdżony w rozmowie obrazek. Ludzie, od których to dostałem, nie mają pojęcia, o co chodzi, bo nic nie wysyłali.&lt;/p&gt;

&lt;p&gt;Dostałem też od paru nieznajomych, ale wszyscy mieli mnie na liście kontaktów. Wszyscy używają oficjalnego klienta &lt;abbr&gt;GG&lt;/abbr&gt;. Czyżby nowy trojan? Próba odwiedzenia wgetem i Firefoksem pokazuje pusty dokument. Nie próbowałem jeszcze zmieniać nagłówka User Agent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; &lt;a href=&quot;http://smalu.info/odkodowane.txt&quot;&gt;Smalu deobfuskował kod strony&lt;/a&gt; (wysyłany jest tylko do użytkowników &lt;abbr title=&quot;Internet Explorera&quot;&gt;IE&lt;/abbr&gt;), wygląda na to, że do wstrzyknięcia używa techniki &lt;code&gt;Trojan-Downloader.JS.Agent.ab&lt;/code&gt;, dalej nie wiadomo, co (oprócz rozsyłania linka dalej) robi sam trojan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Inne wątki na ten temat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://maxnet.org.pl/modules/news/article.php?storyid=79&quot;&gt;OSK Maxnet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://pl.wikinews.org/wiki/Trojan_rozpowszechnia_si%C4%99_przez_sie%C4%87_Gadu-Gadu&quot;&gt;Informacja na Wikinews&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Wyciągnąłem z kodu trojana &lt;a href=&quot;http://pastebin.com/845716&quot;&gt;listę używanych ciągów tekstowych&lt;/a&gt;, znalazłem przy okazji mechanizm automatycznej aktualizacji za pomocą adresu &lt;code&gt;http://66.185.126.34/cgi-bin/exe_output.cgi&lt;/code&gt;, do którego przekazywany jest numer &lt;abbr&gt;GG&lt;/abbr&gt; i dwa bliżej nieokreślone parametry, wyglądające na bieżący znacznik czasu i &lt;em&gt;hasło użytkownika&lt;/em&gt;. Jeśli padłeś ofiarą trojana, to &lt;em&gt;po jego usunięciu zmień hasło do swojego konta&lt;/em&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>"Hacking na żywo!" - podsumowanie (z dedykacją dla klientów FlexoPartner)</title>
   <link href="http://room-303.com/blog/2006/12/21/hacking-na-zywo-podsumowanie-z-dedykacja-dla-klientow-flexopartner/"/>
   <updated>2006-12-21T14:30:26+00:00</updated>
   <id>http://room-303.com/blog/2006/12/21/hacking-na-zywo-podsumowanie-z-dedykacja-dla-klientow-flexopartner</id>
   <content type="html">&lt;p&gt;Pod &lt;a href=&quot;http://www.room-303.com/blog/2006/12/19/pawel-j-osoba-powszechnie-kojarzona-w-kraju/&quot;&gt;poprzednią notką&lt;/a&gt; (pisaną jeszcze przed &lt;a href=&quot;http://hacking.pl/6343&quot;&gt;programem&lt;/a&gt;) rozgorzała zacięta dyskusja na temat fachowości ekspertów i tego, że wszyscy im zazdrościmy. Dlatego &lt;a href=&quot;http://komandrat.wrzuta.pl/film/1q82W8QyrH/hackowanie_na_ekranie&quot;&gt;obejrzałem rzeczony program kilka razy w Sieci&lt;/a&gt; (telewizora nie posiadam) i poniżej przedstawiam bardziej lub mniej obiektywną analizę.&lt;/p&gt;

&lt;h4&gt;Teraz My… wiemy lepiej&lt;/h4&gt;

&lt;p&gt;Program idealnie pasuje w ramy &lt;q&gt;typowego programu o Hakerach.&lt;/q&gt; Celowo pisane z namaszczeniem, bo w środowisku informatycznym &lt;q&gt;hakerami&lt;/q&gt; tytułuje się nie włamywaczy, a ludzi o wyjątkowych zdolnościach. Podobnie, jak można zostać hakerem wśród modelarzy.&lt;/p&gt;

&lt;p&gt;Redaktorzy wykazali się wyjątkowym brakiem przygotowania merytorycznego do tematu. Kto to widział, żeby na hasło &lt;q&gt;hosting&lt;/q&gt; robić zdziwioną minę i pytać, co to za trudne słowo (alegoria)? Wydarzony redaktor powinien w tym miejscu się odwrócić i powiedzieć: &lt;q&gt;szanowni państwo, spieszę wyjaśnić, że chodzi o komputer, który umożliwia umieszczenie strony internetowej w Sieci tak, żeby inni ludzie mogli z niej korzystać za pośrednictwem Internetu.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Zdaje się, że w pewnym momencie zorientowali się w swoim braku zorientowania, bo przez drugą połowę programu wciąż czytali z kartki jedno i to samo hasło: &lt;q&gt;jak to możliwe, że tajne dane nie są chronione?&lt;/q&gt; Nie zwracali przy tym uwagi na to, że przedstawiciele policji usilnie próbowali ich naprowadzić na właściwy trop — najpierw grzecznie i okrężnie, potem tłumacząc wprost, że to nie jest prawda.&lt;/p&gt;

&lt;p&gt;Równie słabym zagraniem było rozpoczęcie rozmowy od zapytania jednego z gości, co myśli o drugim gościu. Biorąc pod uwagę, że przedstawiciel policji wyglądał na dobrze wychowanego, nie mam pojęcia, jakiej odpowiedzi oczekiwała szanowna redakcja. &lt;q&gt;Szczerze, to powiem, że pierwszy raz gościa na oczy widzę, szukaliśmy go trochę w Google, ale trafiliśmy tylko na stronę na Wikipedii, którą sam sobie założył i jego bloga, gdzie sam tytułuje się ekspertem?&lt;/q&gt;&lt;/p&gt;

&lt;h4&gt;Ekspert&lt;/h4&gt;

&lt;p&gt;Pierwszy kontakt z panem Pawłem mieliśmy (z czego zdałem sobie sprawę dopiero wczoraj) nieco ponad dwa lata temu, kiedy to we wrześniu groził &lt;a href=&quot;http://mmazur.jogger.pl/&quot;&gt;Mariuszowi Mazurowi&lt;/a&gt; pobiciem za krytykę jego zdolności językowych.&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;23:12:46 &amp;lt;gorion&amp;gt; jesli chciales we mnie wroga to ci sie udalo.
23:25:02 &amp;lt;gorion&amp;gt; co takiego boli cie w tej stronie?
23:25:33 &amp;lt;gorion&amp;gt; ze postanowiles sobie zalatwic wpierdol ;]&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;http://mmazur.jogger.pl/2004/12/19/tiaaaaa-i-po-co-mi-to-bylo/&quot;&gt;Powyższa rozmowa&lt;/a&gt; nie jest teraz publicznie dostępna, mmazur zdecydował się ją zdjąć na prośbę Pawła &lt;del&gt;na tydzień&lt;/del&gt; &lt;ins&gt;równo dwa tygodnie&lt;/ins&gt; przed programem. Czyżby dbanie o wizerunek, gdyby ktoś zechciał zweryfikować jego tożsamość w Sieci? Na to wygląda, bo…&lt;/p&gt;

&lt;p&gt;Nie uchroniła się też &lt;a href=&quot;http://pl.wikipedia.org/&quot;&gt;Wikipedia&lt;/a&gt; - internetowa encyklopedia. Na miesiąc przed programem, Paweł postanowił napisać tam &lt;a href=&quot;http://pl.wikipedia.org/wiki/Wikipedia:SDU/Pawe%C5%82_Jab%C5%82o%C5%84ski&quot;&gt;artykuł poświęcony samemu sobie&lt;/a&gt;, w którym podkreślał swoje umiejętności i osiągnięcia.&lt;/p&gt;

&lt;p&gt;Komentarze na temat usunięcia strony z zasobów Wikipedii wyjaśniają też &lt;q&gt;kontakty ze sceną hakerską,&lt;/q&gt; którymi Paweł chwalił się tak w Sieci, jak w samym programie. Otóż artykuł z Wikipedii usunął nie kto inny, jak sam Michał Zalewski, znany w środowisku informatyków jako &lt;a href=&quot;http://lcamtuf.coredump.cx/&quot;&gt;lcamtuf&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;Analiza włamania&lt;/h4&gt;

&lt;p&gt;W samym programie nie zostało pokazane praktycznie nic. Kilka efekciarskich przejazdów kamerą po terminalu z listą plików w bieżącym katalogu (jakość nagrania w Internecie nie pozwala na przeczytanie zawartości; podobny efekt można uzyskać, wpisując &lt;code&gt;dir&lt;/code&gt; w &lt;q&gt;Wierszu poleceń &lt;abbr title=&quot;Microsoft Disk Operating System&quot;&gt;MS-DOS&lt;/abbr&gt;,&lt;/q&gt; dostarczanym z każdą kopią systemu Windows), parę ekranów z &lt;a href=&quot;http://www.opera.com/&quot;&gt;przeglądarki Opera&lt;/a&gt; i właściwie na tym się skończyło.&lt;/p&gt;

&lt;p&gt;Paweł w swoich wypowiedziach uparcie twierdził, że uzyskał dostęp do serwera &lt;a href=&quot;http://katowice.kwp.gov.pl&quot;&gt;katowice.kwp.gov.pl&lt;/a&gt; (serwis internetowy Komendy Wojewódzkiej Policji w Katowicach), skąd wykradł dane policjantów, a następnie uruchomił automatyczne kopiowanie przychodzącej poczty na własną skrzynkę e-mail.&lt;/p&gt;

&lt;p&gt;Szybko okazało się jednak, że tylko to ostatnie jest prawdą, bo &lt;q&gt;wykradzione&lt;/q&gt; dane stanowią publicznie dostępną listę dzielnicowych wraz z danymi kontaktowymi do nich. Zanim zostanę wyśmiany jako zazdrosny laik, pozwolę sobie zacytować kolegę.&lt;/p&gt;

&lt;p&gt;Błażej Miga (7 lat administracji systemów, 8 lat w bezpieczeństwie &lt;abbr title=&quot;Information Technology&quot;&gt;IT&lt;/abbr&gt;, były &lt;del&gt;policjant&lt;/del&gt; &lt;ins&gt;pracownik policji&lt;/ins&gt;, między innymi brał udział we wdrożeniu systemu autoryzacji pracowników za pomocą kart cyfrowych):&lt;/p&gt;

&lt;blockquote&gt;Przez kilka lat pracowałem w Policji, więc tematyka zabezpieczeń serwerów w KWP nie jest mi obca. Od kilku lat jestem moja praca jest związana z bezpieczeństwem komputerowym, dlatego pozwoliłem sobie na kilka własnych uwag do wczorajszego programu.

&lt;ol&gt;&lt;li&gt;Program był kiepski - redaktorzy na siłę próbowali wyszukać skandalu. Brawo dla Andrzeja Machnacza, który jako jedyny posiadał odpowiednią wiedzę z tematyki :)&lt;/li&gt;

&lt;li&gt;Lista danych osobowych - litości p. Paweł pokazał w programie listę kontaktową do dzielnicowych. Na liscie tej zawarte są adresy zamieszkania + numery kontaktowe do tych dzielnicowych. Słusznie, że takie dane znajdują się na stronach internetowych - w jaki sposób społeczeństwo ma zgłaszać swoje problemy jak nie do dzielnicowych. Szkoda tylko, że pan rzecznik prasowy kgp zapomniał o tym. :(&lt;/li&gt;

&lt;li&gt;Dane ksipowe. Na każdej stronie internetowej kwp umieszczone są dane o co ciekawszych zdarzeniach. Dane te są później przedrukowywane w lokalnych czasopismach. Problem w tym, że w danych tych nie ma informacji o danych osobowych, bo dane te są po prostu wycięte.&lt;/li&gt;

&lt;li&gt;Dlaczego p. Paweł nie pokazał formatki logującej do KSIP’u? Skoro mówił że istnieje możliwość podłączenia się do KSIP, to dlaczego tego nie zrobił? Sprawa jest prosta - nie mógł tego zrobić bo ten system działa w odseparowanej sieci i bez podłączenia do PSTD (policyjny intranet) nie ma możliwości zalogowania do systemu.&lt;/li&gt;

&lt;li&gt;Czy przestępcy są zainteresowani włamaniami do serwerów policyjnych? Odpowiedź brzmi nie. Dlaczego mieliby płacić setki tysięcy zł hakerom za wykradanie danych, skoro mogą dać policjantowi, który zarabia 1000zł, łapówkę za którą otrzyma te same dane :). Z tego co wiem, najbardziej interesujące dane przestępcy uzyskują za pomocą metod siłowych, więc nie wiem czy są zainteresowani płaceniem za dane które mogą otrzymać za darmo :).&lt;/li&gt;

&lt;li&gt;W jakim celu p. Paweł pokazał włamanie go NFZ? Co ma włamanie do NFZ w programie o słabości zabezpieczeń serwera KWP w Katowicach?&lt;/li&gt;&lt;/ol&gt;&lt;/blockquote&gt;

&lt;h4&gt;Tragiczny poziom zabezpieczeń serwerów rządowych&lt;/h4&gt;

&lt;p&gt;Być może będzie to zaskoczenie nawet dla naszego eksperta, ale wystarczy poświęcić kilka sekund, żeby wpisać poniższe dwa polecenia:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;[patrys@meaw ~]$ host katowice.kwp.gov.pl
katowice.kwp.gov.pl has address 81.219.17.16
katowice.kwp.gov.pl mail is handled by 10 post.katowice.kwp.gov.pl.&lt;/pre&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;pre&gt;[patrys@meaw ~]$ host 81.219.17.16
16.17.219.81.in-addr.arpa domain name pointer www16.srvs.futuro.pl.&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Spieszę z wyjaśnieniami — pierwsze polecenie sprawdza internetowy adres serwera &lt;code&gt;katowice.kwp.gov.pl&lt;/code&gt;, drugie zaś sprawdza, do jakiego komputera ten adres jest przypisany. W tym przypadku jest to &lt;code&gt;www16.srvs.futuro.pl&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Wbrew temu, co powiedział w programie Paweł, nie jest to serwer należący do katowickiej policji, a tym bardziej nie znajduje się on w tej samej sieci, w której komputery pracowników komendy. Jest to tak zwany &lt;q&gt;serwer wirtualny,&lt;/q&gt; wykupiony przez pracowników komendy w firmie Pro Futuro, w ramach usługi &lt;a href=&quot;http://www.futuro.pl/futuro_flexo_partner/&quot;&gt;Flexo Partner&lt;/a&gt;. Ciężko zatem o dostęp do stacji roboczych policjantów z Katowic za pośrednictwem serwera, który znajduje się w Warszawie, czyż nie?&lt;/p&gt;

&lt;h4&gt;Podsumowując&lt;/h4&gt;

&lt;p&gt;Jeśli coś udowodniono, to tylko tyle, że klienci firmy Pro Futuro powinni się powoli zacząć rozglądać za innym hostingiem dla swoich serwisów. Pojawiła się też druga kwestia, poczta elektroniczna w Interii działa skandalicznie wolno.&lt;/p&gt;

&lt;p&gt;Sieć policyjna i dane w niej są bezpieczne i odporne na tego typu włamania z prozaicznego powodu — nie istnieje kabelek, który ficzynie łączyłby policyjne rejestry z Internetem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; mamy i &lt;a href=&quot;http://paweljablonski.bblog.pl/wpis,podsumowanie;po;emisji;programu;teraz;my,794.html&quot;&gt;oficjalną odpowiedź na powyższy post&lt;/a&gt; spod ręki samego eksperta.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Kończąc niniejszy wpis, chciałbym serdecznie podziękować wszystkim za e-maile, wiadomości i komentarze. Wszystkie z nich - a są ich setki okazały się wyrazem życzliwości, gratulacji i ofert współpracy. Nikt z ludzi zawistnych nie napisał na pocztę, gdyż oczywiście najlepiej czują się na blogach i w komentarzach, gdzie anonimowość pozwala ulżyć ich kompleksom.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Widocznie zmęczony sławą po programie, przeoczył imiona i nazwiska ludzi z branży&amp;hellip;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Paweł J., osoba powszechnie kojarzona w kraju...</title>
   <link href="http://room-303.com/blog/2006/12/19/pawel-j-osoba-powszechnie-kojarzona-w-kraju/"/>
   <updated>2006-12-19T20:46:34+00:00</updated>
   <id>http://room-303.com/blog/2006/12/19/pawel-j-osoba-powszechnie-kojarzona-w-kraju</id>
   <content type="html">&lt;p&gt;Nie mogłem przejść obojętnie wobec linka podrzuconego przez &lt;a href=&quot;http://mmazur.jogger.pl/&quot;&gt;mmazura&lt;/a&gt;. To, że &lt;a href=&quot;http://hacking.pl/&quot;&gt;Hacking.pl&lt;/a&gt; jest w środowiskach informatycznych uważany za komputerowy odpowiednik SuperExpressu, czy innej Pani Domu, to jedno. Ale, panowie, proszę ja was, nie przeginajcie.&lt;/p&gt;

&lt;p&gt;Pomijam fakt upartego twierdzenia, że hackerstwo jest jednoznaczne z włamaniami (zapraszam z takimi pomysłami na &lt;a href=&quot;http://lkml.org/&quot;&gt;&lt;abbr title=&quot;Linux Kernel Mailing List&quot;&gt;LKML&lt;/abbr&gt;&lt;/a&gt;). Tak jest bardziej medialnie, zwłaszcza, jeśli zatytułować &lt;q&gt;artykuł&lt;/q&gt; (cudzysłów konieczny, ze względu na sarkazm) &lt;q&gt;&lt;a href=&quot;http://hacking.pl/6343&quot;&gt;Hackowanie na żywo!&lt;/a&gt;&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Klikam ci ja link i dowiaduję się, co następuje: niejaki Paweł, &lt;q&gt;osoba powszechnie kojarzona w kraju,&lt;/q&gt; wystąpi w programie, o którym nigdy nie słyszałem (&lt;q&gt;najlepsze show polityczne&lt;/q&gt; — nie wiedziałem nawet, że show jest rodzaju nijakiego, ale ja nie mam telewizora, mogę się nie znać).&lt;/p&gt;

&lt;p&gt;Cóżen on za jeden, ten ekspert &lt;q&gt;pod kątem bezpieczeństwa sieci&lt;/q&gt; (i w jakich jednostkach liczy się kąt bezpieczeństwa?), możnaby spytać. Ano wsławił się imć J. ujawnieniem &lt;q&gt;skandalicznych nieprawidłowości w Instytucie Energii Atomowej w Świerku.&lt;/q&gt; Czyżby radioaktywne wycieki, wszak budynki z atomami w nazwie to nie przelewki. Przykro mi, ale chodziło o &lt;a href=&quot;http://wiadomosci.wp.pl/kat,9912,wid,8359087,prasaWiadomosc.html?ticaid=12e36&quot;&gt;włamania script kiddies na słabo zabezpieczony serwer &lt;abbr title=&quot;World Wide Web&quot;&gt;WWW&lt;/abbr&gt;&lt;/a&gt;. (Swoją drogą, kiedyś w Hacking.pl pojawił się przedruk mojego tekstu o tym, jak wyjąć sobie bazę klientów Alei Handlowej, czy też jestem już &lt;q&gt;powszechnie,&lt;/q&gt; czy trzeba coś atomowego zepsuć?)&lt;/p&gt;

&lt;p&gt;Szukam ci ja więcej informacji o tajemniczym ekspercie, wszak nie wypada człowiekowi oferującemu audyty bezpieczeństwa aplikacji, by nie znał &lt;q&gt;osoby powszechnie… itp.&lt;/q&gt; Zaglądam więc na &lt;a href=&quot;http://paweljablonski.bblog.pl/o_mnie.html&quot;&gt;bloga rzeczonego specjalisty&lt;/a&gt; i czytam, ci ja powoli (bo takich zdań szybko czytać się nie da):&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Pobierana przeze mnie edukacja w szerokim zakresie programu edukacyjnego obejmuje zagadnienia większości nauk ścisłych w tym także kierunkowych, takich jak teoria sterowania, automatyka przemysłowa, komputerowe wspomaganie projektowania układów automatyki, optoelektronicznych, elektronicznych a także technika cyfrowa mikroprocesorowa.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Dla mniej obdarzonych fantazją, w wolnym przekładzie:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Pobierana przeze mnie woda w szerokim zakresie wody zawierała dużo płynów, w tym także mokrych, jak H2O.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Do czego piję? Ja wiem, że Hacking.pl płynie na fali sensacji, że musi mieć szokujące nagłówki, że to nie hackerzy toto czytają. Mimo wszystko, trochę pokory w autopromocji. W życiu o gościu nie słyszałem, jego dorobek zawodowy jest porównywalny z co najmniej połową moich kontaktów na &lt;a href=&quot;http://www.linkedin.com/in/patrys&quot;&gt;LinkedIn&lt;/a&gt;, a wy mi tu z &lt;q&gt;powszechnie kojarzonymi?&lt;/q&gt; Powszechnie kojarzony to jest &lt;a href=&quot;http://lcamtuf.coredump.cx/&quot;&gt;lcamtuf&lt;/a&gt; albo &lt;a href=&quot;http://theinvisiblethings.blogspot.com/&quot;&gt;Joanna Rutkowska&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Z całym szacunkiem dla Pawła, któremu życzę takiego rozgłosu, jaki mu koledzy przykleili.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Lepszy hosting?</title>
   <link href="http://room-303.com/blog/2006/12/18/lepszy-hosting/"/>
   <updated>2006-12-18T12:34:14+00:00</updated>
   <id>http://room-303.com/blog/2006/12/18/lepszy-hosting</id>
   <content type="html">&lt;p&gt;O tym, że Dreamhost ma świetną ofertę, już pisałem kilka razy. Z tym, że nie każdy chce lub może skorzystać z ich oferty (choćby ze względu na brak faktury).&lt;/p&gt;

&lt;p&gt;Czego więc oczekujecie od solidnego hostingu w Polsce? W iCenter zorganizowaliśmy przedświąteczną akcję zbierania sugestii. Chcecie Ruby on Rails? Django? A może Jabbera? Python i Jabber już są w naszej ofercie, na pozostałe pomysły &lt;a href=&quot;http://blog.icenter.pl/2006/12/16/przedswiateczne-zyczenia/&quot;&gt;czekamy na blogu firmowym&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Nie traktujcie tego jak reklamę, myślę, że notka może być też ciekawą lekturą dla naszej konkurencji. Tam często nawet &lt;a href=&quot;http://blog.icenter.pl/2006/12/15/php-5/&quot;&gt;&lt;abbr title=&quot;PHP Hypertext Preprocessor&quot;&gt;PHP&lt;/abbr&gt; straszy wiekiem&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Made Man</title>
   <link href="http://room-303.com/blog/2006/12/16/made-man/"/>
   <updated>2006-12-16T19:17:49+00:00</updated>
   <id>http://room-303.com/blog/2006/12/16/made-man</id>
   <content type="html">&lt;p&gt;Dosłownie przed paroma minutami skończyłem grać w &lt;a href=&quot;http://www.immatv.com/mademan_intro.htm&quot;&gt;Made Mana&lt;/a&gt;. Świetna gra. Nie przytłacza najnowszymi efektami, nie ma specjalnie skomplikowanej fabuły, ale&amp;hellip;&lt;/p&gt;

&lt;p&gt;Jeśli podobali ci się &lt;a href=&quot;http://www.eidos.co.uk/gss/reservoirdogs/&quot;&gt;Reservoir Dogs&lt;/a&gt;, ta gra jest właśnie dla ciebie. Typowy shooter, w konsolowych klimatach, na pececie. Rewelacyjna grywalność, wartka akcja, świetna muzyka, klimat lat 60-80 i do tego, na okrasę, masa zwłok.&lt;/p&gt;

&lt;p&gt;Prostolinijna historyjka o weteranie z Wietnamu, który pracuje jako dostawca półlegalnego towaru. Kiedy traci ciężarówkę pełną papierosów z przemytu, próbuje ją odzyskać i trafia w sam środek wojny gangów. Następnie, już jako długie ramię rodziny mafijnej, zajmuje się rozwiązywaniem &lt;q&gt;problemów.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Co ciekawe, zastosowana została inwersja czasowa niemal rodem z Pulp Fiction. Podobnie, jak w serii Hitman, akcję śledzimy w postaci opowieści głównego bohatera. Na zmianę przeplatają się wątki z Wietnamu, późnych lat sześćdziesiątych i czasów współczesnych opowieści.&lt;/p&gt;

&lt;p&gt;No cóż, skoro Made Man się skończył, czas na kolejną pozycję &amp;mdash; &lt;a href=&quot;http://whatisfear.com/us/&quot;&gt;F.E.A.R.: Extraction Point&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Żałuję tylko, że do teraz nie udało mi się zagrać w pełną wersję gry, dla której tworzyłem stronę internetową: &lt;a href=&quot;http://www.callofjuarez.com/&quot;&gt;Call of Juarez&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Pascal ujawniony</title>
   <link href="http://room-303.com/blog/2006/12/14/pascal-ujawniony/"/>
   <updated>2006-12-14T14:30:11+00:00</updated>
   <id>http://room-303.com/blog/2006/12/14/pascal-ujawniony</id>
   <content type="html">&lt;p&gt;Skoro &lt;a href=&quot;http://www.blog.brief.pl/?p=235&quot;&gt;Brief napisał&lt;/a&gt; o &lt;a href=&quot;http://www.pascalbrodnicki.pl/&quot;&gt;nowym blogu Pascala&lt;/a&gt;, to chyba można oficjalnie powiedzieć, że serwis wyszedł z fazy wewnętrznego testowania.&lt;/p&gt;

&lt;h4&gt;Przepis na bloga&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;jeden &lt;a href=&quot;http://wordpress.org/&quot;&gt;Wordpress&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;jedna agencja interaktywna &lt;a href=&quot;http://3kprojects.pl/&quot;&gt;3K Projects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;jedna agencja interaktywna &lt;a href=&quot;http://www.janmedia.pl/&quot;&gt;Janmedia Interactive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;jeden Patrys&lt;/li&gt;
&lt;li&gt;jeden &lt;a href=&quot;http://enbewu.net/blog/&quot;&gt;nbw&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Całość wstawić do pieca na 2 miesiące i regularnie próbować, doprawiając do smaku w miarę potrzeb.&lt;/p&gt;

&lt;p&gt;Mam nadzieję, że udało nam się wydeptać wszystkie bugi. Drobne zmiany będą się prawdopodobnie pojawiać przez cały czas, w końcu serwis jest żywy.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Prywatnie: nietolerancja nietolerowana</title>
   <link href="http://room-303.com/blog/2006/12/09/prywatnie-nietolerancja-nietolerowana/"/>
   <updated>2006-12-09T16:16:33+00:00</updated>
   <id>http://room-303.com/blog/2006/12/09/prywatnie-nietolerancja-nietolerowana</id>
   <content type="html">&lt;p&gt;Wczoraj, jadąc na imprezę, przeszkodziliśmy z sit0 dwóm łysym panom, niosącym psalmy o &lt;q&gt;białej sile&lt;/q&gt; na ustach, w zbutowaniu dwóch ciemnoskórych jegomości z Holandii. Wnioskuję o zalegalizowanie długiej broni na ostrą amunicję, żebym mógł na drugi raz zamienić takich w durszlak &amp;mdash; jako przykład dla ich kolegów.&lt;/p&gt;

&lt;p&gt;Co ciekawe, panowie cierpiący na syndrom przedwczesnej utraty owłosienia krzyczeli przez cały czas o tym, że &lt;q&gt;nie po to ich dziadkowie walczyli&lt;/q&gt; i że &lt;q&gt;miejsca pracy nam kradną.&lt;/q&gt; Nie wiedziałem, że generał Anders zbierał maki w Afryce, a o miejsca w pracy w Biedronce też bym się nie martwił, kurtki ofiar były więcej warte niźli strój cały ich oprawców.&lt;/p&gt;

&lt;p&gt;Nie interesuje mnie, czy ktoś jest czarny, żółty, wysoki, gruby, czy jest gejem, czy może nie głosował na właściwą partię. Nie toleruję bicia ludzi, którzy nie zrobili niczego, żeby sobie na to zasłużyć.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Inwazja kotów</title>
   <link href="http://room-303.com/blog/2006/12/07/inwazja-kotow/"/>
   <updated>2006-12-07T02:22:34+00:00</updated>
   <id>http://room-303.com/blog/2006/12/07/inwazja-kotow</id>
   <content type="html">&lt;p&gt;Podejście do Inkscape'a trzecie. Ofiarą mą padł jeden z &lt;a href=&quot;http://cute.ciao.jp/cg/cg-028.htm&quot;&gt;rysunków&lt;/a&gt; ze strony &lt;a href=&quot;http://cute.ciao.jp/main.htm&quot;&gt;Cute&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/316119691/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/102/316119691_49cdd2fe96.jpg&quot; width=&quot;500&quot; height=&quot;313&quot; alt=&quot;SwimCat Wallpaper (1280x800)&quot; /&gt;&lt;/a&gt;&lt;br /&gt;wersja &lt;a href=&quot;http://flickr.com/photos/patrys/316119693/&quot;&gt;zwykła&lt;/a&gt; lub &lt;a href=&quot;http://flickr.com/photos/patrys/316119691/&quot;&gt;panoramiczna&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tapeta na licencji &lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.5/&quot;&gt;CC-BY-NC-SA&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; przez nieuwagę wrzuciłem nie te wersje, co trzeba. Już poprawione.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Drugi kotek</title>
   <link href="http://room-303.com/blog/2006/12/05/drugi-kotek/"/>
   <updated>2006-12-05T02:37:53+00:00</updated>
   <id>http://room-303.com/blog/2006/12/05/drugi-kotek</id>
   <content type="html">&lt;p&gt;Kontynuując zabawę z wektorami w Inkscape, tym razem połasiłem się na &lt;a href=&quot;http://danbooru.donmai.us/post/view/80532&quot;&gt;inny obrazek&lt;/a&gt;. Za drugim razem poszło sprawniej, a efektem jest kolejna tapeta.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/314527825/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/115/314527825_72975badfb.jpg&quot; width=&quot;500&quot; height=&quot;313&quot; alt=&quot;CatGirl Wallpaper (1280x800)&quot; /&gt;&lt;/a&gt;&lt;br /&gt;wersja &lt;a href=&quot;http://flickr.com/photos/patrys/314527833/&quot;&gt;zwykła&lt;/a&gt; lub &lt;a href=&quot;http://flickr.com/photos/patrys/314527825/&quot;&gt;panoramiczna&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jak poprzednio, licencja &lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.5/&quot;&gt;CC-BY-NC-SA&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>NSFW: Kotek w wektorach</title>
   <link href="http://room-303.com/blog/2006/12/03/nsfw-kotek-w-wektorach/"/>
   <updated>2006-12-03T23:20:51+00:00</updated>
   <id>http://room-303.com/blog/2006/12/03/nsfw-kotek-w-wektorach</id>
   <content type="html">&lt;p&gt;Dziś postanowiłem poćwiczyć sprawność posługiwania się Inkscape - moim ulubionym programem do grafiki wektorowej. Zacząłem się rozglądać za odpowiednim obiektem do zwektoryzowania, w końcu stanęło na &lt;a href=&quot;http://ourworld.cs.com/ShoujoAiGoddess/NekoCheetahSoftcore.jpg&quot;&gt;szkicu nieznanego autora&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Kolejne pół dnia spędziłem na ręcznym obrysowywaniu konturu (Inkscape ma automatyczne narzędzie do trace'owania, ale co by to było za ćwiczenie, kliknąć i czekać na efekt?), użyciu uzyskanych ścieżek do wypełnienia obszarów kolorem i na końcu dodaniu paru gradientów.&lt;/p&gt;

&lt;p&gt;O ile wzrost mojej sprawności w obrabianiu grafiki może być mało interesującym tematem, o tyle może kogoś zainteresuje efekt mojej zabawy. Postanowiłem się pochwalić wynikiem w postaci tapetki:&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/313341101/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/110/313341101_a8002fd930.jpg&quot; alt=&quot;BadKitty Wallpaper (1280x800)&quot; height=&quot;313&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;br /&gt;wersja &lt;a href=&quot;http://flickr.com/photos/patrys/313341104/&quot;&gt;zwykła&lt;/a&gt; lub &lt;a href=&quot;http://flickr.com/photos/patrys/313341101/&quot;&gt;panoramiczna&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nie wciskałem tam żadnych napisów ani znaków wodnych, ale mam nadzieję, że &lt;em&gt;nikt nie wciśnie jej na żadną stronę porno&lt;/em&gt;. Licencja &lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/pl/&quot;&gt;CC-BY-NC-SA&lt;/a&gt;. W tle niebieskie paseczki pochodzące z jednej z tapet (Lance) na &lt;a href=&quot;http://gnome-look.org/&quot;&gt;GNOME Look&lt;/a&gt;, ale serwis nie działa, więc autora nie podam.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>I po Grillu</title>
   <link href="http://room-303.com/blog/2006/11/29/i-po-grillu/"/>
   <updated>2006-11-29T22:26:21+00:00</updated>
   <id>http://room-303.com/blog/2006/11/29/i-po-grillu</id>
   <content type="html">&lt;p&gt;Było bardzo sympatycznie, szczególnie podobała mi się prezentacja dotycząca dopieszczania eCommerce dzięki szczegółowej analizie statystyk serwisu — często traktowanych bardzo po macoszemu i sprowadzanych do &lt;q&gt;ilu weszło&lt;/q&gt; — w wykonaniu &lt;a href=&quot;http://www.ziemczonek.pl/&quot;&gt;Maćka Ziemczonka&lt;/a&gt; na podstawie serwisu &lt;a href=&quot;http://militaria.pl/&quot;&gt;Militaria.pl&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Nam udało się zaliczyć kilka wpadek w przedpremierowym pokazie &lt;a href=&quot;http://wego.pl/&quot;&gt;Wego CMS&lt;/a&gt; — okazało się bowiem, że nie wystarczy 15 minut na przygotowanie trzech linuksowych laptopów do prezentacji ;). Mimo wszystko, temat nie przeszedł bez echa i cieszył się niezerowym zainteresowaniem.&lt;/p&gt;

&lt;p&gt;Szczegółowe informacje i materiały można znaleźć nigdzie indziej, tylko na samym &lt;a href=&quot;http://www.grillit.pl/?p=8&quot;&gt;blogu grillowym&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Gorąco zachęcam &lt;q&gt;władnych&lt;/q&gt; Internetu do wzięcia udziału w spotkaniu trzecim (a termin jego gęstą mgłą był otoczon, a w przyszłości nieodległej ujawnion być powinien).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>GrillIT 2.0!</title>
   <link href="http://room-303.com/blog/2006/11/16/grillit-20/"/>
   <updated>2006-11-16T07:51:21+00:00</updated>
   <id>http://room-303.com/blog/2006/11/16/grillit-20</id>
   <content type="html">&lt;p&gt;Skoro mamy Web 2.0 bez najmniejszego uzasadnienia dwójki, to czemu nie mieć Grilla 2.0 bez śladu grilla? ;)&lt;/p&gt;

&lt;p&gt;Chętnych do spotkania się i porozmawiania o Sieci zapraszam po &lt;a href=&quot;http://www.grillit.pl/?p=5&quot;&gt;szczegóły na oficjalny blog GrillIT&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Osiemnastka!</title>
   <link href="http://room-303.com/blog/2006/11/13/osiemnastka/"/>
   <updated>2006-11-13T11:02:15+00:00</updated>
   <id>http://room-303.com/blog/2006/11/13/osiemnastka</id>
   <content type="html">&lt;p&gt;Dziś szczególny dzień w moim życiu, osiemnaste urodziny. Od tego momentu mogę legalnie &lt;code&gt;strace&lt;/code&gt;'ować, pozwolić sobie na całonocny &lt;code&gt;fsck&lt;/code&gt;, można mnie też &lt;code&gt;strip&lt;/code&gt;nąć albo &lt;code&gt;unzip&lt;/code&gt;nąć.&lt;/p&gt;

&lt;p&gt;Świętować będziemy od circa 19:00 we wrocławskich &lt;a href=&quot;http://www.wrocek.pl/miejsca/pokaz/283/Szepty&quot;&gt;Szeptach&lt;/a&gt;. Już przeczuwam, że dziś wieczór szykuje mi się &lt;code&gt;SIGSEGV&lt;/code&gt;, mam tylko nadzieję, że nie połączy się z porannym &lt;code&gt;OOM&lt;/code&gt; albo z powstaniem pliku &lt;code&gt;core&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Cieszcie się ze mną, bo na dwudzieste pierwsze urodziny zaproszę was dopiero za 9 lat.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Bo do Tanga trzeba masy ludzi</title>
   <link href="http://room-303.com/blog/2006/11/12/bo-do-tanga-trzeba-masy-ludzi/"/>
   <updated>2006-11-12T21:54:44+00:00</updated>
   <id>http://room-303.com/blog/2006/11/12/bo-do-tanga-trzeba-masy-ludzi</id>
   <content type="html">&lt;p&gt;Od zeszłego piątku &lt;a href=&quot;http://tango.freedesktop.org/Tango_Desktop_Project&quot;&gt;projekt Tango&lt;/a&gt; organizuje &lt;a href=&quot;http://tango.freedesktop.org/Tango_Fridays&quot;&gt;copiątkowe spotkania&lt;/a&gt; na &lt;abbr title=&quot;Internet Relay Chat&quot;&gt;IRCu&lt;/abbr&gt;, w czasie których tworzone są nowe ikony dla istniejących aplikacji.&lt;/p&gt;

&lt;p&gt;Jeśli więc zależy ci szczególnie na pasującej do systemu ikonce dla ulubionego programu, nic prostszego — przyłącz się do spotkania i zgłoś swoją kandydaturę. Jeśli przejawiasz zdolności plastyczne, to możesz też przyłączyć się do pracujących nad ikonami. Po zakończeniu prac, ikona trafia do autorów danej aplikacji i ewentualnie zostaje włączona do jej dystrybucji. Chłopaki odwalają naprawdę kawał dobrej roboty.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/tango&quot; rel=&quot;tag&quot;&gt;tango&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/icons&quot; rel=&quot;tag&quot;&gt;icons&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/linux&quot; rel=&quot;tag&quot;&gt;linux&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/desktop&quot; rel=&quot;tag&quot;&gt;desktop&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Adobe, Mozilla i ECMAScript</title>
   <link href="http://room-303.com/blog/2006/11/08/adobe-mozilla-i-ecmascript/"/>
   <updated>2006-11-08T22:25:25+00:00</updated>
   <id>http://room-303.com/blog/2006/11/08/adobe-mozilla-i-ecmascript</id>
   <content type="html">&lt;p&gt;Dla tych, którzy przegapili, Adobe &lt;a href=&quot;http://www.adobe.com/aboutadobe/pressroom/pressreleases/200611/110706Mozilla.html&quot;&gt;przekazało&lt;/a&gt; fundacji Mozilla swój najnowszy silnik ActionScript, zbudowany dla Flash Playera 9.&lt;/p&gt;

&lt;p&gt;Co to oznacza? Nie, w Firefoksie 3.0 nie będzie wbudowanego Flasha. W niezdefiniowanej bliżej przyszłości pojawi się za to nowy silnik JavaScript. Jako że oba języki oparte są na tym samym standardzie, wirtualna maszyna JavaScript może zostać z powodzeniem zastąpiona wydajnym silnikiem produkcji Adobe. Ichnia implementacja maszyny wirtualnej ma jedną szczególnie interesującą zaletę — kompilator &lt;q&gt;Just In Time,&lt;/q&gt; który w locie kompiluje język skryptowy do postaci kodu natywnego dla procesora, na którym jest uruchomiony silnik.&lt;/p&gt;

&lt;p&gt;W skrócie: możemy oczekiwać, że w ciągu najbliższego roku pojawi się Firefox z najwydajniejszą na rynku przeglądarek implementacją JavaScriptu.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Zatrudnię programistę PHP5</title>
   <link href="http://room-303.com/blog/2006/11/08/zatrudnie-programiste-php5/"/>
   <updated>2006-11-08T17:02:53+00:00</updated>
   <id>http://room-303.com/blog/2006/11/08/zatrudnie-programiste-php5</id>
   <content type="html">&lt;p&gt;Praca dotyczy rozwoju systemu wego i tworzenia systemów autorskich dla klientów indywidualnych. Z góry uprzedzam, że nie szukamy chętnych do pracy zdalnej.&lt;/p&gt;

&lt;p&gt;Szczegóły na &lt;a href=&quot;http://blog.icenter.pl/2006/11/08/praca-dla-programisty/&quot;&gt;blogu firmowym iCenter&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Nowy projekt - Linux Videos</title>
   <link href="http://room-303.com/blog/2006/11/07/nowy-projekt-linux-videos/"/>
   <updated>2006-11-07T23:31:53+00:00</updated>
   <id>http://room-303.com/blog/2006/11/07/nowy-projekt-linux-videos</id>
   <content type="html">&lt;p&gt;Od dwóch tygodni pałęta mi się po głowie pomysł na serwis linuksowy z różnymi howto, sztuczkami i tym podobnymi rzeczami. Problem w tym, że nikomu nie chce się ani pisać, ani czytać elaboratów na ten temat. Dużo prościej jest co? Pokazać.&lt;/p&gt;

&lt;p&gt;W związku z tym, dzisiaj odpaliłem wstępną wersję serwisu. Póki co, zasilaną przez WordPress, chociaż prawdopodobnie docelowo platforma zostanie zmieniona. Bardzo możliwe, że pojawi się również możliwość oglądania filmów na stronie, za pomocą zagnieżdżonego odtwarzacza we Flashu. Teraz dostępny jest jeden eksperymentalny screencast po polsku (docelowo cała treść będzie angielska) i bez lektora (moje dzisiejsze warunki głosowe pozostawiają nieco do życzenia). Z czasem będzie lepiej i ciekawiej. Nie chcę się też ograniczać do programów konsolowych.&lt;/p&gt;

&lt;p&gt;Coby dłużej nie nudzić, zapraszam do oglądania i komentowania &lt;a href=&quot;http://linuxvideo.generatedcontent.com/&quot;&gt;Linux Videos&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Liczę na to, że część z was podrzuci mi swoje filmiki.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>NetArt, Sztuka wciskania kitu w Sieci</title>
   <link href="http://room-303.com/blog/2006/10/27/netart-sztuka-wciskania-kitu-w-sieci/"/>
   <updated>2006-10-27T16:35:19+00:00</updated>
   <id>http://room-303.com/blog/2006/10/27/netart-sztuka-wciskania-kitu-w-sieci</id>
   <content type="html">&lt;p&gt;O ile dotychczas miałem o wspomnianej wyżej firmie całkiem dobre zdanie, to ostatnio zmieniło się diametralnie.&lt;/p&gt;

&lt;p&gt;Jeden z naszych klientów hostuje tam serwis wykonany przez nas czas temu jakiś. Serwis z przyczyn nieznanych przestał nagle działać. Poprosiliśmy o dostęp do konta. W międzyczasie serwis nagle zaczął działać prawidłowo. Następnie zmarł ponownie.&lt;/p&gt;

&lt;p&gt;Po otrzymaniu dostępu do bazy danych, zalogowałem się do interfejsu phpMyAdmin 2.7.0 (nie sprawdzam nawet, czy jest ekspoitowalny) i moim oczom ukazał się… MySQL 3.23.58. Tak, niemalże najnowsza wersja, ukazała się bowiem we wrześniu 2003. Wklejam przeto zapytanie wysyłane przez serwis, licząc na błąd składni, bo wykluczyć błędu po naszej stronie się nie da. Kolejna niespodzianka:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;#1030 - Otrzymano błąd 28 z obsługi tabeli&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Wewnętrzny błąd serwera baz danych. Przyczyn błędu 28 może być masa, od uszkodzenia systemu plików, przez ograniczenie daemona quotą, przez fizyczne uszkodzenie nagłówka pliku z tabelą, aż po wyczerpanie miejsca na dysku.&lt;/p&gt;

&lt;p&gt;Wysłaliśmy tedy informację do klienta, że interwencja z naszej strony jest nieuzasadniona i dalsze angażowanie nas w rozwiązywanie problemu nie odbędzie się darmowo, a najlepszym sposobem będzie kontakt z administracją serwera hostującego serwis.&lt;/p&gt;

&lt;p&gt;Klient, widać niezadowolony z reakcji obsługi technicznej NetArtu, zgłosił nam po kilku dniach chęć przeniesienia hostingu na nasze serwery. Przygotowaliśmy wszystko z naszej strony, pozostało przetransferowanie domeny.&lt;/p&gt;

&lt;p&gt;Dotychczasowy host do problemu ustosunkował się następująco: nie ma podstaw do przeniesienia domeny, gdyż problem z serwisem wskazuje na celowy wandalizm z naszej strony, co miałoby podważyć wiarygodność firmy aktualnie świadczącej usługi i zmusić klienta do zmiany operatora.&lt;/p&gt;

&lt;p&gt;Tak, drodzy panowie z NetArtu, celowo włamaliśmy się na wasz serwer i zatkaliśmy go do granic możliwości, następnie zatarliśmy po sobie ślady, a to wszystko z tak ogromną precyzją, że naszą ofiarą padł dokładnie jeden serwis. Gratuluję poczucia humoru.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/netart&quot; rel=&quot;tag&quot;&gt;netart&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/nazwa.pl&quot; rel=&quot;tag&quot;&gt;nazwa.pl&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/hosting&quot; rel=&quot;tag&quot;&gt;hosting&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/mysql&quot; rel=&quot;tag&quot;&gt;mysql&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Zanim zaczniesz tworzyć webaplikacje</title>
   <link href="http://room-303.com/blog/2006/10/25/zanim-zaczniesz-tworzyc-webaplikacje/"/>
   <updated>2006-10-25T17:42:05+00:00</updated>
   <id>http://room-303.com/blog/2006/10/25/zanim-zaczniesz-tworzyc-webaplikacje</id>
   <content type="html">&lt;p&gt;Bez spełnienia poniższych punktów, nawet nie zabieraj sie za pisanie niczego, do czego mają mieć dostęp ludzie. W szczególności nie zabieraj się też za pisanie &lt;abbr title=&quot;Curriculum Vitae&quot;&gt;CV&lt;/abbr&gt; do nas ;)&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;ul&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;potrafisz rozwinąć skrót &lt;abbr&gt;RDBMS&lt;/abbr&gt; i własnymi słowami powiedzieć, jaką rolę pełni&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;w odpowiedzi na powyższe nie użyłeś sformułowania &lt;q&gt;w który mogę rzucać dowolnymi śmieciami, a potem je wyjąć&lt;/q&gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;potrafisz określić, czym jest &lt;abbr&gt;MVC&lt;/abbr&gt; albo potrafisz powiedzieć, czemu nie należy umieszczać kodu logiki biznesowej w kodzie prezentacji&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;nie musiałeś przed chwilą sprawdzić w Google, czym się różni logika biznesowa od logiki bazodanowej i logiki prezentacji&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;&lt;q&gt;trzecia postać normalna&lt;/q&gt; nie kojarzy ci się ze &lt;q&gt;Wstępem do psychoanalizy&lt;/q&gt; Freuda&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;zapytany o indeksy, nie zastanawiasz się, czy dziekan już podpisał&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;wiesz, że klucze obce nie służą do otwierania mieszkań co ładniejszych koleżanek&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;zapytany o &lt;abbr&gt;HTML&lt;/abbr&gt; nie rozwijasz skrótu jako &lt;q&gt;How to meet ladies,&lt;/q&gt; a przynajmniej nie na rozmowie kwalifikacyjnej&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;zdajesz sobie sprawę, że baza danych jest środowiskiem wielodostępowym, rozumiesz działanie transakcji i pojęcia typu &lt;q&gt;race condition&lt;/q&gt; (trudne słowo)&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;na dźwięk skrótu &lt;abbr&gt;JS&lt;/abbr&gt; nie piszesz odruchowo &lt;code&gt;&amp;lt;SCRIPT LANG=&quot;JAVASCRIPT&quot;&amp;gt;&amp;lt;!-- document.write(&quot;Hello&quot;) --&amp;gt;&amp;lt;/SCRIPT&amp;gt;&lt;/code&gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;potrafisz powiedzieć, czym jest &lt;abbr&gt;OOP&lt;/abbr&gt;, kiedy go używać i kiedy jest to overkill (trudne słowo)&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;znasz przynajmniej jeden używany jeszcze dialekt &lt;abbr&gt;SQL&lt;/abbr&gt; i potrafisz cytować przekazywane do niego parametry w taki sposób, aby zapytania mogli pisać tylko deweloperzy, a nie odwiedzający serwis&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Znajdź swoją muzykę</title>
   <link href="http://room-303.com/blog/2006/10/24/znajdz-swoja-muzyke/"/>
   <updated>2006-10-24T18:06:07+00:00</updated>
   <id>http://room-303.com/blog/2006/10/24/znajdz-swoja-muzyke</id>
   <content type="html">&lt;p&gt;Przeglądając zasoby związane z biblioteką JSViz, specjalizującą się w budowaniu dynamicznych grafów, trafiłem przypadkiem na prawdziwą perełkę. Jedna z aplikacji demonstracyjnych służy do… szukania muzyki.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/278466096/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/100/278466096_0bd65025eb.jpg&quot; alt=&quot;JSViz Demo - Amazon-based music recommendations&quot; height=&quot;294&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://kylescholz.com/projects/speaking/tae2006/music/&quot;&gt;Music Recommendations&lt;/a&gt;, bo tak nazywa się demo, łączy się z serwisem &lt;a href=&quot;http://amazon.com/&quot;&gt;Amazon&lt;/a&gt; i — na podstawie jego rekomendacji podobnych albumów — prezentuje graf polecanej muzyki. Coś czuję, że uzupełnię swoję kolekcję z tym cudeńkiem, jest o niebo wygodniejsze niż przeklikiwanie się przez serwis giganta.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/music&quot; rel=&quot;tag&quot;&gt;music&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/search&quot; rel=&quot;tag&quot;&gt;search&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/amazon&quot; rel=&quot;tag&quot;&gt;amazon&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/graph&quot; rel=&quot;tag&quot;&gt;graph&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/javascript&quot; rel=&quot;tag&quot;&gt;javascript&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Internet Explorer: System error -1072896658</title>
   <link href="http://room-303.com/blog/2006/10/24/internet-explorer-system-error-1072896658/"/>
   <updated>2006-10-24T10:39:45+00:00</updated>
   <id>http://room-303.com/blog/2006/10/24/internet-explorer-system-error-1072896658</id>
   <content type="html">&lt;p&gt;Właśnie z &lt;a href=&quot;http://sitnick.blogspot.com/&quot;&gt;sit0&lt;/a&gt; zabieraliśmy się za spędzenie drugiego dnia nad kolejnym dziwadełkiem, które występowało w naszej ukochanej przeglądarce. Spora część ajaksowej funkcjonalności naszych zabawek zaprzestała pełnienia swych funkcji w &lt;abbr title=&quot;Internet Explorerze&quot;&gt;IE&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;Zaczęliśmy tradycyjnie, od zabawy z Fiddlerem i upewnienia się, że zapytanie trafia do serwera prawidłowo i że serwer generuje prawidłową odpowiedź. Pudło, trzeba pobawić się z &lt;abbr title=&quot;JavaScriptem&quot;&gt;JS&lt;/abbr&gt;. Debugowanie tego ostatniego w &lt;abbr&gt;IE&lt;/abbr&gt; jest zabawą tyle niewdzięczną, co czasami graniczącą z absurdem. Po kilku godzinach zabawy z wstawianiem kodu kontrolnego w różne etapy przetwarzania odpowiedzi (rozoraliśmy całą bibliotekę &lt;a href=&quot;http://script.aculo.us/&quot;&gt;script.aculo.us&lt;/a&gt;), zostaliśmy dalej z niczym. Mieliśmy tylko jeden wyjątek, który nie miał kompletnie sensu. Cała jego zawartość to &lt;code&gt;System error -1072896658&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Zbawienie przyszło z Google: &lt;a href=&quot;http://www.panoramio.com/blog/explorer-system-error-1072896658/&quot;&gt;ktoś miał już identyczny problem&lt;/a&gt; i okazało się, że rozwiązanie stosuje się także w naszym przypadku. Jeśli więc &lt;abbr&gt;IE&lt;/abbr&gt; zachowuje się dziwnie i nie działają w nim wywołania &lt;abbr title=&quot;Asynchronous JavaScript And XML&quot;&gt;AJAX&lt;/abbr&gt;, sprawdź zawsze nagłówki. &lt;abbr&gt;IE&lt;/abbr&gt; jest bardzo wybredny i bardzo małomówny.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/internet explorer&quot; rel=&quot;tag&quot;&gt;internet explorer&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/ie&quot; rel=&quot;tag&quot;&gt;ie&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/exception&quot; rel=&quot;tag&quot;&gt;exception&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/ajax&quot; rel=&quot;tag&quot;&gt;ajax&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #031: Grzechy przeszłości</title>
   <link href="http://room-303.com/blog/2006/10/22/strip-031-grzechy-przeszlosci/"/>
   <updated>2006-10-22T20:07:48+00:00</updated>
   <id>http://room-303.com/blog/2006/10/22/strip-031-grzechy-przeszlosci</id>
   <content type="html">&lt;p&gt;A może tak w klimacie zbliżonym do humoru &lt;a href=&quot;http://xkcd.org/&quot;&gt;xkcd&lt;/a&gt;?&lt;/p&gt;
&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/031-debug-your-dreams.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>iShave</title>
   <link href="http://room-303.com/blog/2006/10/22/ishave/"/>
   <updated>2006-10-22T13:49:41+00:00</updated>
   <id>http://room-303.com/blog/2006/10/22/ishave</id>
   <content type="html">&lt;p&gt;Kiedy następnym razem przyjdzie wam ogolić swoje \[...\] \[...\] i \[...\] pod \[...\], sięgnijcie po nową maszynkę Philipsa &amp;mdash; Bodygroom. Reklama powaliła mnie na \[...\] \[...\] i \[...\].&lt;/p&gt;

&lt;p&gt;O ile najbardziej jestem potencjalnie zainteresowany samym produktem, to polecam obejrzeć &lt;a href=&quot;http://www.shaveeverywhere.com/&quot;&gt;ShaveEverywhere &amp;mdash; oficjalną stronę Philips Bodygroom&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Internet Explorer: Pomocy!</title>
   <link href="http://room-303.com/blog/2006/10/20/internet-explorer-pomocy/"/>
   <updated>2006-10-20T12:07:46+00:00</updated>
   <id>http://room-303.com/blog/2006/10/20/internet-explorer-pomocy</id>
   <content type="html">&lt;p&gt;Kolejny dzień spędzamy na poszukiwaniu przyczyny chorego zachowania &lt;abbr title=&quot;Internet Explorera&quot;&gt;IE&lt;/abbr&gt;6.&lt;/p&gt;

&lt;p&gt;Efekt jest taki, że losowo przerywa przetwarzanie dokumentu, a efektem jest jedynie fragment drzewa &lt;abbr title=&quot;Document Object Model&quot;&gt;DOM&lt;/abbr&gt;. Co ciekawe, przy każdym odświeżeniu strony, utyka gdzie indziej. Próbowałem to rozdłubać nawet &lt;a href=&quot;http://www.fiddlertool.com/&quot;&gt;Fiddlerem&lt;/a&gt;. Ten ostatni pokazuje też, że &lt;abbr&gt;IE&lt;/abbr&gt; pyta serwera, czy grafiki się zmieniły, otrzymuje odpowiedź 304, po czym dziarsko uznaje, że grafiki nie da się załadować.&lt;/p&gt;

&lt;p&gt;W każdej innej przeglądarce, z &lt;abbr&gt;IE&lt;/abbr&gt;7 włącznie, serwis działa poprawnie.&lt;/p&gt;

&lt;p&gt;W życiu takiego cyrku nie widziałem. Pomoże nam ktoś?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; chłopaki z &lt;a href=&quot;http://janmedia.com/&quot;&gt;Janmedia&lt;/a&gt; zdiagnozowali problem &amp;mdash; winnym okazał się serwis &lt;a href=&quot;http://video.google.pl/&quot;&gt;Google Video&lt;/a&gt; i wtyczka do Flasha. Otóż po załadowaniu odtwarzacza googlowego, &lt;abbr&gt;IE&lt;/abbr&gt; przestawał ładować cokolwiek więcej. Czekamy jeszcze na potwierdzenie, czy to jedyna przyczyna.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Prywatnie: Pauza</title>
   <link href="http://room-303.com/blog/2006/10/15/prywatnie-pauza/"/>
   <updated>2006-10-15T21:09:00+00:00</updated>
   <id>http://room-303.com/blog/2006/10/15/prywatnie-pauza</id>
   <content type="html">&lt;p&gt;Decyzją dziekanatu Wyższej Szkoły Informatyki i Zarządzania &lt;q&gt;Copernicus&lt;/q&gt; we Wrocławiu, 15. października bieżącego roku, zostałem skreślony z listy studentów.&lt;/p&gt;

&lt;p&gt;Decyzją kobiety, którą kocham, 15. października bieżącego roku, zostałem skreślony z listy zajętych facetów.&lt;/p&gt;

&lt;p&gt;Przerwa techniczna w blogowaniu. Johnnie Walker się do mnie uśmiecha wyzywająco.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Encje w HTML</title>
   <link href="http://room-303.com/blog/2006/10/11/encje-w-html/"/>
   <updated>2006-10-11T20:34:12+00:00</updated>
   <id>http://room-303.com/blog/2006/10/11/encje-w-html</id>
   <content type="html">&lt;p&gt;Na prośbę Roya:&lt;/p&gt;

&lt;p&gt;&lt;abbr title=&quot;(Extensible) HyperText Markup Language&quot;&gt;(X)HTML&lt;/abbr&gt; w skrócie definiuje dokument jako zestaw elementów. Każdy element to albo &lt;code&gt;textNode&lt;/code&gt;, albo &lt;q&gt;kontener&lt;/q&gt; — typowy element, jak nagłówek, paragraf, czy &lt;code&gt;span&lt;/code&gt;, który zawiera kolejne elementy.&lt;/p&gt;

&lt;p&gt;Elementy są czasem błędnie nazywane &lt;q&gt;tagami,&lt;/q&gt; podczas gdy tagi to sposób tekstowego zapisu elementów — składają się wtedy z tagów otwierającego i zamykającego (albo jednego samozamykającego w przypadku elementów, które nie zawierają żadnych &lt;q&gt;dzieci&lt;/q&gt;).&lt;/p&gt;

&lt;p&gt;Wszytkie elementy, poza tekstowymi, posiadają różne atrybuty. Te ostatnie zapisuje się jako listę par &lt;code&gt;nazwa=&quot;wartość&quot;&lt;/code&gt; wewnątrz tagu otwierającego element. Teraz ważne: ponieważ &lt;abbr&gt;HTML&lt;/abbr&gt; jest aplikacją &lt;abbr title=&quot;Standard Generalized Markup Language&quot;&gt;SGML&lt;/abbr&gt; (trudne słowo), a &lt;abbr&gt;XHTML&lt;/abbr&gt; jest aplikacją &lt;abbr title=&quot;xtensible Markup Language&quot;&gt;XML&lt;/abbr&gt; (jeszcze trudniejsze słowo), &lt;strong&gt;wartości atrybutów w zapisie trzeba cytować za pomocą encji&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ponieważ &lt;abbr&gt;HTML&lt;/abbr&gt; definiuje encji masę, a &lt;abbr&gt;XHTML&lt;/abbr&gt; dziedziczy ich po &lt;abbr&gt;XML&lt;/abbr&gt; tylko pięć, to cytować powinno się tylko te ostatnie (inaczej nie można przetwarzać wyniku jako dokumentu &lt;abbr&gt;XML&lt;/abbr&gt;).&lt;/p&gt;

&lt;p&gt;Oto więc lista kandydatów: &lt;code&gt;&amp;amp;amp;&lt;/code&gt;, &lt;code&gt;&amp;amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;amp;apos;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ponieważ w &lt;abbr title=&quot;PHP Hypertext Preprocessor&quot;&gt;PHP&lt;/abbr&gt; funkcja &lt;code&gt;html_entities&lt;/code&gt; jest mocno nadgorliwa, poniżej prosta implementacja poprawnej alternatywy:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;function xmlentities($string)
{
	return str_replace(array
		(
			'&amp;amp;', ''', '&quot;', '&amp;lt;', '&amp;gt;'
		), array
		(
			'&amp;amp;amp;', '&amp;amp;#039;', '&amp;amp;quot;', '&amp;amp;lt;', '&amp;amp;gt;'
		), $string);
}&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Apostrof jest traktowany specjalnie, bo w &lt;abbr&gt;HTML&lt;/abbr&gt; go… nie przewidzieli.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/html&quot; rel=&quot;tag&quot;&gt;html&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/xhtml&quot; rel=&quot;tag&quot;&gt;xhtml&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/xml&quot; rel=&quot;tag&quot;&gt;xml&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/entities&quot; rel=&quot;tag&quot;&gt;entities&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/encoding&quot; rel=&quot;tag&quot;&gt;encoding&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #030: Eskalacja uprawnień</title>
   <link href="http://room-303.com/blog/2006/10/09/strip-030-eskalacja-uprawnien/"/>
   <updated>2006-10-09T11:16:26+00:00</updated>
   <id>http://room-303.com/blog/2006/10/09/strip-030-eskalacja-uprawnien</id>
   <content type="html">&lt;p&gt;Z pewnością zauważyliście, że numer dzisiejszego odcinka stanowi dopełnienie czwórkowe (bez znaku) numeru pokoju z adresu bloga.&lt;/p&gt;
&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/030-born-to-be-root.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Zapomniałem dodać, że inspiracją był oczywiście rewelacyjny &lt;a href=&quot;http://www.xkcd.com/&quot;&gt;xkcd&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>DreamHost świruje!</title>
   <link href="http://room-303.com/blog/2006/10/03/dreamhost-swiruje/"/>
   <updated>2006-10-03T20:10:06+00:00</updated>
   <id>http://room-303.com/blog/2006/10/03/dreamhost-swiruje</id>
   <content type="html">&lt;p&gt;Kiedy pisałem, że oszaleli, to nie doceniłem kolegów. Dzisiejsza promocja daje… 200 &lt;abbr title=&quot;gigabajtów&quot;&gt;GB&lt;/abbr&gt; miejsca na dysku i 2 &lt;abbr title=&quot;terabajty&quot;&gt;TB&lt;/abbr&gt; &lt;em&gt;miesięcznego&lt;/em&gt; transferu.&lt;/p&gt;

&lt;p&gt;To się nazywa promocja - &lt;a href=&quot;http://dreamhost.com/hosting.html&quot;&gt;szczegółowy plan hostingu&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Jak zwykle, chętni do wsparcia naszej działalności mogą podać nas jako referrera (email do podania jako Promo Code przy rejestracji: &lt;code&gt;patrys@pld-linux.org&lt;/code&gt; - &lt;del&gt;wyklucza się z promocją&lt;/del&gt; &lt;ins&gt;nie daje zniżki&lt;/ins&gt;).&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/dreamhost&quot; rel=&quot;tag&quot;&gt;dreamhost&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/hosting&quot; rel=&quot;tag&quot;&gt;hosting&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/promotion&quot; rel=&quot;tag&quot;&gt;promotion&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>O pakietach biurowych, edytorach WYSIWYG i złych nawykach</title>
   <link href="http://room-303.com/blog/2006/09/20/o-pakietach-biurowych-edytorach-wysiwyg-i-zlych-nawykach/"/>
   <updated>2006-09-20T20:40:49+00:00</updated>
   <id>http://room-303.com/blog/2006/09/20/o-pakietach-biurowych-edytorach-wysiwyg-i-zlych-nawykach</id>
   <content type="html">&lt;p&gt;Z pewnością, każdy z was korzystał kiedyś z bardziej lub mniej udanego edytora &lt;abbr title=&quot;What You See Is What You Get&quot;&gt;WYSIWYG&lt;/abbr&gt;, zagnieżdżonego w dokument &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt;. Wybór jest spory, najpopularniejsze to &lt;a href=&quot;http://tinymce.moxiecode.com/&quot;&gt;Tiny&lt;abbr title=&quot;Moxiecode Content Editor&quot;&gt;MCE&lt;/abbr&gt;&lt;/a&gt; i &lt;a href=&quot;http://www.fckeditor.net/&quot;&gt;&lt;abbr title=&quot;Frederico Caldeira Knabben&quot;&gt;FCK&lt;/abbr&gt;editor&lt;/a&gt;, jednak wszystkie działają podobnie — aktywują tryb &lt;q&gt;design mode&lt;/q&gt; przeglądarki i starają się zapewnić do niego interfejs jak najbardziej zbliżony do Worda. &lt;strong&gt;To zło&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;Biuro i poczta&lt;/h4&gt;

&lt;p&gt;W codziennej pracy typowego użytkownika komputerów, podstawowymi narzędziami są klient poczty i pakiet biurowy. To oczywiście spore uproszczenie, ale bez wątpienia są to dwie najbardziej powszechnie używane grupy aplikacji edycyjnych, to jest takich, które nie służą wyłącznie do czytania.&lt;/p&gt;

&lt;p&gt;Najpierw zajmijmy się pakietami biurowymi. Czy jest to Microsoft Office, OpenOffice, czy KOffice, podstawowe aplikacje są niezmienne — procesor tekstu i arkusz kalkulacyjny. Niech was jednak nie zwiodą sprytne nazwy. Fakt, że Excel odniósł sukces jako klon aplikacji Lotus 1-2-3, nie implikuje jeszcze, że oba programy podzieliły między siebie tę samą, wątłą, grupę odbiorców. Wszak ludzi, którzy naprawdę potrzebowali stale dokonywać skomplikowanych obliczeń na skoroszytach, wcale nie jest tak dużo. Podobnie, nie każdy zajmuje się przecież profesjonalnie redakcją tekstu, a i do tego istnieją dalece potężniejsze narzędzia (LaTeX!). Czemu więc niemal każdy ma w swoim domu pakiet biurowy?&lt;/p&gt;

&lt;h4&gt;Microsoft Notatnik i Microsoft Generator Cenników&lt;/h4&gt;

&lt;p&gt;Tak, z grubsza, możnaby przemianować dwa flagowe produkty biurowe potentata z Redmond.&lt;/p&gt;

&lt;p&gt;Zastanawiałem się do niedawna, kiedy ostatnio widziałem plik &lt;code&gt;.doc&lt;/code&gt;, który powinien być &lt;q&gt;docem&lt;/q&gt; i plik &lt;code&gt;.xls&lt;/code&gt;, który faktycznie jest arkuszem kalkulacyjnym. Ba, to samo pytanie zadałem paru znajomym, w tym uczestnikom wczorajszego Grilla &lt;abbr title=&quot;Information Technology&quot;&gt;IT&lt;/abbr&gt;. Okazało się, że od lat pakiety biurowe służą do wszystkiego, prócz swej pierwotnej funkcji. Nie wspomnę o rozsyłaniu obrazków w prezentacjach PowerPointa, dość powiedzieć, że kiedy zasugerowałem, że większość z nas nie potrzebuje Worda, odezwał się pół-żartem głos, że &lt;q&gt;w czymś trzeba drukować te kartki na drzwi.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Excel stał się sztandarowym narzędziem do trzymania wszystkiego, co choćby trochę wygląda jak tabelka. Nie jest ważne, czy dane lepiej pasowałyby do bazy danych, wydaje mi się wręcz, że tylko kwestią czasu jest, zanim ktoś zacznie projektować w nim meble. Jeśli coś można opisać na siatce, to sporej części społeczeństwa zapala się w głowie lampka z napisem &lt;q&gt;Excel.&lt;/q&gt; Nie jest to dziwne, jeśli wyobrazić sobie, że oprócz lampek z napisami &lt;q&gt;jeść&lt;/q&gt; i &lt;q&gt;siku&lt;/q&gt; jest tam tylko jedna konkurencyjna pozycja — &lt;q&gt;Word.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Word z kolei to ulubiona zabawka wszystkich, którzy nie lubią domyślnej czcionki o stałej szerokości w notatniku. Jeśli trzeba wysłać coś klientowi, jeśli trzeba coś wydrukować i nie jest to cennik (który wcześniej złożyliśmy w pocie czoła w Excelu), to Word czeka w gotowości. Nawet jeśli są to dwa zdania i zamierzamy je wysłać emailem. Szczególnie, jeśli jest to obrazek, który zamierzamy wysłać emailem. Po co psuć niespodziankę naszemu adresatowi, kiedy swój logotyp można spokojnie zagnieździć w dokumencie Worda, najlepiej, jeśli sprowadzi się go przy okazji do formatu znaczka pocztowego.&lt;/p&gt;

&lt;h4&gt;Mam już śrubki, idę po młotek&lt;/h4&gt;

&lt;p&gt;Jest takie powiedzenie, że jeśli ktoś dostanie do ręki młotek, to wszystko zaczyna wyglądać jak gwoździe. W przypadku pakietów biurowych sprawdza się nawet w dwustu procentach. Okazuje się bowiem, że nawet jeśli ktoś da nam kiedyś śrubokręt, to i tak będziemy nim śrubki… wbijać.&lt;/p&gt;

&lt;p&gt;Podstawowym problemem większości edytorów powstałych od czasu świetnego, dosowego procesora Tag, jest fakt, że główny nacisk stawiają na narzędzia prezentacyjne. Jeśli spytasz kogoś, jakie podstawowe funkcje ma Word, to mogę strzelić w ciemno, że pierwszych kilka miejsc zajmą:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pogrubienie&lt;/li&gt;
&lt;li&gt;kursywa&lt;/li&gt;
&lt;li&gt;podkreślenie&lt;/li&gt;
&lt;li&gt;zmiana czcionki&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jak to się ma do dokumentu i jego treści? Nie ma się wcale, tak jak podobne właściwości próbujemy wyplewić, prowadząc ewangelizację na rzecz semantycznej Sieci. Dokument ma tytuł i sekcje z nagłówkami. Do tego można dorzucić dane tabelaryczne, listy uporządkowane i nieuporządkowane, a wszystko polać lukrem z paru wstawionych obrazków i wykresów. W teorii.&lt;/p&gt;

&lt;p&gt;Całkiem liczne grono, do którego wlicza się choćby mój ojciec, nie potrafi napisać dwóch akapitów tekstu. Po napisaniu pierwszego, czują się moralnie zobligowani do jego &lt;q&gt;sformatowania.&lt;/q&gt; Przy czym, formatowanie w tym przypadku oznacza wybranie mu jednej z kilkudziesięciu czcionek, &lt;q&gt;doenterowanie&lt;/q&gt; odstępów, a często i precyzyjne &lt;q&gt;wyspacjowanie&lt;/q&gt; wcięcia w pierwszym wierszu. I tak po każdym akapicie. Niektórzy posiedli nawet arkana wiedzy z dziedziny środkowania tekstu za pomocą białych znaków, a prawdziwi twardziele potrafią w ten sposób tworzyć dwie, albo i trzy, kolumny.&lt;/p&gt;

&lt;h4&gt;Dlaczego?&lt;/h4&gt;

&lt;p&gt;Bo programy na to pozwalają. Zapewniam, że gdyby Auto&lt;abbr title=&quot;Computer Aided Design&quot;&gt;CAD&lt;/abbr&gt; pozwalał na bogatsze formatowanie notatek tekstowych, to i ten format znalazłby swoje miejsce pośród plejady biurowych ulubieńców.&lt;/p&gt;

&lt;p&gt;Jeśli dasz ludziom przedmiot, którym potencjalnie da się nabić komuś guza, to ktoś to — prędzej, czy później — zrobi. &lt;q&gt;Odkrywców&lt;/q&gt; software'owych możliwości ci u nas na pęczki.&lt;/p&gt;

&lt;h4&gt;A teraz cierpimy&lt;/h4&gt;

&lt;p&gt;Problem polega głównie na tym, że to, co kiedyś wydawało się świetnym pomysłem, odbija się echem pokuty teraz. Oczywiście, Word pozwala na semantyczne składanie dokumentu, pozwala określić, co jest nagłówkiem, a co treścią. Co więcej, po przypisaniu odpowiedniego szablonu, na podstawie takich informacji, sam odpowiednio ostyluje elementy. Niektórych to zdziwi, ale pod koniec dokumentu będzie też pamiętał, &lt;q&gt;jak się nazywała ta cholerna czcionka, którą wybraliśmy w pierwszym akapicie.&lt;/q&gt; Przez lata funkcje te były skrzętnie poukrywane i do dziś wydają się tylko dodatkiem. Niestety, niektórzy już umieją po swojemu.&lt;/p&gt;

&lt;p&gt;Dlatego teraz wprowadzenie opisu produktu do sklepu internetowego nie może się obyć bez kolorowania wyrazów, podkreślania co błyskotliwiej sformułowanych zalet i pogrubiania wszystkiego, co się nawinie. Dlatego też &lt;abbr&gt;WYSIWYG&lt;/abbr&gt; lubię parafrazować jako &lt;q&gt;masz, na co zasłużyłeś.&lt;/q&gt; To może się wydawać głupie, może w żaden sposób nie współgrać z identyfikacją wizualną firmy, może psuć szablon serwisu, ale klienci się tego domagają. Kilku &amp;mdash; po usłyszeniu, że u nas nie da się pokolorować czcionek &amp;mdash; było skłonnych dopłacić.&lt;/p&gt;

&lt;h4&gt;A gdzie się podział klient poczty?&lt;/h4&gt;

&lt;p&gt;Na początku wspomniałem, że drugą najczęściej używaną aplikacją są klienty poczty. Tu przecież przez lata panował czysty tekst. Przecież do bogatych wiadomości stosowany jest język semantycznych w teorii znaczników &lt;abbr&gt;HTML&lt;/abbr&gt;, przecież… Tak, one od lat naśladują Worda.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Just Grill IT!</title>
   <link href="http://room-303.com/blog/2006/09/20/just-grill-it/"/>
   <updated>2006-09-20T09:16:23+00:00</updated>
   <id>http://room-303.com/blog/2006/09/20/just-grill-it</id>
   <content type="html">&lt;p&gt;Nie będę powielał &lt;a href=&quot;http://www.webusability.pl/2006/09/20/odbyl-sie-1-grillit/&quot;&gt;notki Tomka o grillu&lt;/a&gt;, a że czas nie pozwala chwilowo na rozpisanie się o szczegółach dyskusji, to napiszę tylko, że nie mogę się doczekać kontynuacji.&lt;/p&gt;

&lt;p&gt;Jeśli nie wiesz, czym jest Grill &lt;abbr title=&quot;Information Technology&quot;&gt;IT&lt;/abbr&gt;, to spieszę wyjaśnić. W skrótcie, jest to impreza integrująca wrocławskie środowisko &lt;q&gt;internetowców&lt;/q&gt;, czyli ludzi kochających Sieć (albo przymuszanych przez szefa &amp;mdash; pozdrawiam ekipę Janmedia :P).&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/grill&quot; rel=&quot;tag&quot;&gt;grill&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/web&quot; rel=&quot;tag&quot;&gt;web&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/ecommerce&quot; rel=&quot;tag&quot;&gt;ecommerce&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/wroclaw&quot; rel=&quot;tag&quot;&gt;wroclaw&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Dlaczego systemy szablonowe są ważne</title>
   <link href="http://room-303.com/blog/2006/09/17/dlaczego-systemy-szablonowe-sa-wazne/"/>
   <updated>2006-09-17T12:12:14+00:00</updated>
   <id>http://room-303.com/blog/2006/09/17/dlaczego-systemy-szablonowe-sa-wazne</id>
   <content type="html">&lt;p&gt;Masa ludzi zadaje mi ciągle to samo pytanie &amp;mdash; skoro &lt;abbr title=&quot;PHP HyperText Preprocessor&quot;&gt;PHP&lt;/abbr&gt; został stworzony jako język prezentacyjny, to jaki jest sens implementowania w nim kolejnego języka prezentacyjnego &amp;mdash; systemu szablonów?&lt;/p&gt;

&lt;p&gt;To prawda, że &lt;abbr&gt;PHP&lt;/abbr&gt; powstał właśnie jako język do osadzania wewnątrz kodu &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt;. Prawdą jest, że do dzisiaj mnóstwo ludzi w ten właśnie sposób go używa. Nic dziwnego, podczas wczorajszej wycieczki do &lt;a href=&quot;http://www.empik.com/&quot;&gt;Empiku&lt;/a&gt;, natknęliśmy się z Qwiatem na stustronicową książeczkę o wdzięcznym tytule &lt;q&gt;&lt;abbr&gt;PHP&lt;/abbr&gt; &amp;mdash; to proste.&lt;/q&gt;&lt;/p&gt;

&lt;h4&gt;Już nie tylko liczniki&lt;/h4&gt;

&lt;p&gt;Sam język jednak przeszedł od czasów wersji pierwszej ogromne zmiany, największe z nich miały miejsce pomiędzy trzecim i piątym wcieleniem. Skupiają się one na umożliwieniu łatwego budowania dużych aplikacji. Aplikacji, gdzie mieszanie warstwy widoku i kontrolera jest co najmniej wysoce niewskazane, ze względu na czytelność i łatwość zarządzania kodem.&lt;/p&gt;

&lt;p&gt;Minęły czasy, kiedy języków server-side używało się do budowania liczników. Często całość treści jest generowana właśnie przez kod. Tyczy się to tak samo &lt;abbr&gt;PHP&lt;/abbr&gt;, jak każdego innego języka, który może działać po stronie serwera. Zmieniły się oczekiwania, wzrosła skala projektów, logika wewnątrz strony przestała wystarczać.&lt;/p&gt;

&lt;p&gt;Ktoś powie zaraz, że przecież można oddzielić warstwę widoku i nadal korzystać tam z &lt;abbr&gt;PHP&lt;/abbr&gt;, tak jak robi to &lt;a href=&quot;http://cakephp.org/&quot;&gt;CakePHP&lt;/a&gt;. Można, czasem jednak nie warto. Cake powstał jako klon uznanego frameworku &lt;a href=&quot;http://rubyonrails.com/&quot;&gt;Ruby on Rails&lt;/a&gt;. Oba celują w projekty rozwijane &amp;mdash; przynajmniej w pierwszych stadiach życia &amp;mdash; metodą programowania ekstremalnego. Koncentrują się na jak łatwiejszym zbudowaniu proof-of-concept i dalszym jego rozwoju, już po odkręceniu dodatkowych kółeczek od roweru.&lt;/p&gt;

&lt;h4&gt;Serwisy budują projektanci, a nie programiści&lt;/h4&gt;

&lt;p&gt;Oczywiście, są aplikacje, przy budowie których pracują prawie wyłącznie programiści. Niech będzie to &lt;a href=&quot;http://gmail.com/&quot;&gt;Google Mail&lt;/a&gt;, &lt;a href=&quot;http://youtube.com/&quot;&gt;YouTube&lt;/a&gt;, czy &lt;a href=&quot;http://wrocek.pl/&quot;&gt;Wrocek&lt;/a&gt;. Prawda jest jednak taka, że większość komercyjnych serwisów internetowych jest budowana dla konkretnego klienta przez agencje interaktywne.&lt;/p&gt;

&lt;p&gt;Ich ceny oscylują w przedziale od kilku do kilkunastu/kilkudziestu tysięcy i zyski z tego typu działalności ciężko przeznaczyć na zatrudnienie połowy Microsoftu. Dlatego też do zadań programisty często należy tylko przygotowanie silnika, zaś resztę pracy wykonują projektanci &amp;mdash; webmasterzy lub graficy, w których gestii jest przygotowanie odpowiedniego kodu &lt;abbr&gt;HTML&lt;/abbr&gt;, arkuszy &lt;abbr title=&quot;Cascading Style Sheets&quot;&gt;CSS&lt;/abbr&gt; i połączenie tego w całość &amp;mdash; produkt, który można oddać klientowi.&lt;/p&gt;

&lt;p&gt;Co z tego wynika? Ano wynika tyle, że przy zatrudnianiu ważniejsza jest doskonała znajomość obu wyżej wymienionych technologii, niż zdolności programistyczne. Nie każdy webmaster zna &lt;abbr&gt;PHP&lt;/abbr&gt; (Javę, Pythona, platformę .NET). &lt;a href=&quot;http://smarty.php.net/&quot;&gt;Smarty&lt;/a&gt; można opanować w ciągu jednej doby, to zdecydowanie za mało na poznanie choćby części filozofii projektowania zorientowanego obiektowo.&lt;/p&gt;

&lt;h4&gt;&lt;q&gt;This sit3 haxx0rd by scr1pt kiddi3z&lt;/q&gt;&lt;/h4&gt;

&lt;p&gt;Wyżej wspomniałem, że nie każdy jest programistą. Praktyka uczy też, że nie każdy powinien. Miałem w życiu wiele sytuacji, w których zmuszony byłem współpracować z ludźmi, którzy zdawali się całą swoją wiedzę pozyskać ze wspomnianej empikowej książeczki. Dość powiedzieć, że podatność na &lt;abbr title=&quot;Structured Query Language&quot;&gt;SQL&lt;/abbr&gt; injection to najlżejsze z popełnianych przewinień.&lt;/p&gt;

&lt;p&gt;Popularne grzechy to ślepe &lt;code&gt;include&lt;/code&gt;'owanie pliku, którego nazwa trafiła przez wywołania &lt;code&gt;GET&lt;/code&gt; lub &lt;code&gt;POST&lt;/code&gt; (najczęstsza, poza korzystaniem z &lt;code&gt;register_globals&lt;/code&gt;, przyczyna ataków &lt;abbr title=&quot;Cross-Site Scripting&quot;&gt;XSS&lt;/abbr&gt;), trzymanie ważnych danych w ciasteczkach przeglądarki, rekordzista umieścił tam nawet całe zapytania &lt;abbr&gt;SQL&lt;/abbr&gt;. Z pewnością wystarczyłoby na wypełnienie kalendarza &lt;a href=&quot;http://thedailywtf.com/&quot;&gt;Daily &lt;abbr title=&quot;What The Fuck&quot;&gt;WTF&lt;/abbr&gt;&lt;/a&gt; na najbliższy rok.&lt;/p&gt;

&lt;p&gt;Silniki szablonów mają tę ogromną zaletę, że zapewniają piaskownicę (&lt;q&gt;sandbox&lt;/q&gt;), w której można bezpiecznie wywołać kod nieznanego pochodzenia (czytaj: cudzy kod). Nazwa pochodzi od terminu, jakim saperzy nazywają specjalne pojemniki i pomieszczenia do badania i rozbrajania znalezionych przedmiotów, gdzie ewentualna eksplozja nie naraża niczyjego życia.&lt;/p&gt;

&lt;p&gt;W tym przypadku niczyje życie nie jest bezpośrednio zagrożone, ale ciężko wypracować sobie reputację, kiedy co drugie wdrożenie twojego silnika kończy się włamaniem na serwer. Korzystanie w przypadku prezentacji z prostego języka, zbudowanego specjalnie do tego celu, daje pewność, że nawet najmniej kompetentny człowiek nie będzie w stanie nic zepsuć.&lt;/p&gt;

&lt;p&gt;W zasadzie tyle chciałem napisać, ale może ktoś ma zupełnie inny pogląd na te sprawy? Z góry zapowiadam, że nie interesują mnie argumenty na poziomie &lt;q&gt;Smarty to nieakceptowalny narzut rzędu dziesiątej części sekundy na każdą wyświetlaną stronę.&lt;/q&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #029: Komitet samobójców</title>
   <link href="http://room-303.com/blog/2006/09/12/strip-029-komitet-samobojcow/"/>
   <updated>2006-09-12T18:24:28+00:00</updated>
   <id>http://room-303.com/blog/2006/09/12/strip-029-komitet-samobojcow</id>
   <content type="html">&lt;p&gt;Są takie dni, kiedy pojawiają się DobrePomysły&amp;trade;.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/029-commited-suicide.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>GNOME Main Menu (SLAB) w PLD</title>
   <link href="http://room-303.com/blog/2006/08/29/gnome-main-menu-slab-w-pld/"/>
   <updated>2006-08-29T21:11:13+00:00</updated>
   <id>http://room-303.com/blog/2006/08/29/gnome-main-menu-slab-w-pld</id>
   <content type="html">&lt;p&gt;Znane dobrze użytkownikom SUSE menu, opracowane przez specjalistów użyteczności Novella, trafiło dziś do PLD. Dodałem dziś &lt;a href=&quot;http://cvs.pld-linux.org/cgi-bin/cvsweb/SPECS/gnome-main-menu.spec&quot;&gt;plik SPEC dla apletu&lt;/a&gt; i stosownego patcha dla pakietu &lt;code&gt;gnome-desktop&lt;/code&gt;, który dodaje obsługę ostatnio używanych aplikacji.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/228570497/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/66/228570497_fa752169c5.jpg&quot; alt=&quot;GNOME Main Menu (SLAB) - Favorite Apps&quot; height=&quot;313&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Górną część menu zajmuje pasek wyszukiwania Beagle, który pozwala w łatwy sposób dotrzeć do plików, bez potrzeby majstrowania w systemie plików. Wpisanie tam dowolnego ciągu i wciśnięcie &lt;kbd&gt;Enter&lt;/kbd&gt; uruchamia aplikację &lt;code&gt;beagle-search&lt;/code&gt;. Prawa część to typowe zadania i stan komputera — połączenie sieciowe i dostępne miejsce na dyskach. Środkową zaś część okupuje standardowo lista ulubionych aplikacji, lista ta ma jednak trzy możliwe funkcje, za pomocą przełącznika można zmienić ją w listę ostatnio otwieranych dokumentów albo w listę ostatnio uruchamianych aplikacji:&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/228570492/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/87/228570492_d37b6ee395.jpg&quot; alt=&quot;GNOME Main Menu (SLAB) - Recently Used Apps&quot; height=&quot;313&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pod listą znajduje się dodatkowy przycisk, uruchamiający wyszukiwarkę aplikacji zainstalowanych na komputerze:&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/228570495/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/63/228570495_ca52f68c12.jpg&quot; alt=&quot;GNOME Main Menu (SLAB) - Application Browser&quot; height=&quot;313&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sprawuje się bardzo wygodnie i choć nie zastąpi raczej standardowego menu GNOME, jest bardzo miłym do niego dodatkiem.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/slab&quot; rel=&quot;tag&quot;&gt;slab&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/gnome&quot; rel=&quot;tag&quot;&gt;gnome&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/applet&quot; rel=&quot;tag&quot;&gt;applet&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/menu&quot; rel=&quot;tag&quot;&gt;menu&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/novell&quot; rel=&quot;tag&quot;&gt;novell&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/suse&quot; rel=&quot;tag&quot;&gt;suse&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/pld&quot; rel=&quot;tag&quot;&gt;pld&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The Daily WTF, part 5</title>
   <link href="http://room-303.com/blog/2006/08/21/the-daily-wtf-part-5/"/>
   <updated>2006-08-21T16:00:43+00:00</updated>
   <id>http://room-303.com/blog/2006/08/21/the-daily-wtf-part-5</id>
   <content type="html">&lt;p&gt;Jeden z klientów zapytał nas, czy możemy zbudować dla niego system, który pozwoli wybrać poszczególne sekcje z broszury informacyjnej, a następnie wygeneruje dla użytkownika jeden plik &lt;abbr title=&quot;Portable Document Format&quot;&gt;PDF&lt;/abbr&gt; z całą wybraną treścią.&lt;/p&gt;

&lt;p&gt;Jako przykład podał nam brytyjskiego usługodawcę, który podobne systemiki sprzedaje ich anglojęzycznym kolegom. A &lt;a href=&quot;http://www.portabledocuments.co.uk/send.asp?cid=34&quot;&gt;strona jego&lt;/a&gt; wprawiła nas w zachwyt niemały, a radości pomniejszym i większym końca nie było. Zwłaszcza, kiedy oglądaliśmy źródła ichnich skryptów &lt;abbr title=&quot;Active Server Pages&quot;&gt;ASP&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;Wystarczyło bowiem zajrzeć w kod &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt;, żeby znaleźć taki oto fragment:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;input type=button value=&quot;  DOWNLOAD NOW  &quot;
onclick=&quot;javascript:test('C:/webroot/LocalUser/br4589/Website/files/34/userfiles/brochure_197866219.pdf');&quot; &amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Piękne, zwłaszcza, kiedy nieco niżej, bo u dołu dokumentu znaleźliśmy to cudeńko:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;function test(atch){
	window.location.href=&quot;download.asp?file=&quot;+atch+&quot;&quot;;
	}&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Ciekawskim od razu odpowiadam, że tak, można w ten sposób pobrać &lt;code&gt;boot.ini&lt;/code&gt;, pliki z katalogu z Windowsem oraz kod całego serwisu. Pogratulować pomysłowości autorom.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/asp&quot; rel=&quot;tag&quot;&gt;asp&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/wtf&quot; rel=&quot;tag&quot;&gt;wtf&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/code&quot; rel=&quot;tag&quot;&gt;code&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/exploit&quot; rel=&quot;tag&quot;&gt;exploit&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Tango dla Gajima</title>
   <link href="http://room-303.com/blog/2006/08/13/tango-dla-gajima/"/>
   <updated>2006-08-13T14:10:58+00:00</updated>
   <id>http://room-303.com/blog/2006/08/13/tango-dla-gajima</id>
   <content type="html">&lt;p&gt;Zbudowałem dzisiaj na szybko zestaw ikon bazowanych na &lt;a href=&quot;http://tango.freedesktop.org/Tango_Desktop_Project&quot;&gt;projekcie Tango&lt;/a&gt;. &lt;del&gt;Brakuje jeszcze rozmiaru 32x32.&lt;/del&gt;&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/214027017/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/61/214027017_481042b76b.jpg&quot; alt=&quot;Tango icons for Gajim&quot; height=&quot;313&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Do pobrania &lt;a href=&quot;http://wirusy.room-303.com/Gajim/&quot;&gt;zestaw ikon&lt;/a&gt;, licencja taka sama, jak Tango. Wystarczy wypakować do katalogu &lt;code&gt;data/iconsets/&lt;/code&gt;. Zgłosiłem też prośbę o dołączenie do samego &lt;a href=&quot;http://gajim.org/&quot;&gt;Gajima&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; dodałem ikonki w rozmiarze 32x32. Link bez zmian.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/gajim&quot; rel=&quot;tag&quot;&gt;gajim&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/tango&quot; rel=&quot;tag&quot;&gt;tango&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/icons&quot; rel=&quot;tag&quot;&gt;icons&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>MS Phishing Explorer</title>
   <link href="http://room-303.com/blog/2006/08/11/ms-phishing-explorer/"/>
   <updated>2006-08-11T13:29:05+00:00</updated>
   <id>http://room-303.com/blog/2006/08/11/ms-phishing-explorer</id>
   <content type="html">&lt;p&gt;Taka drobna ciekawostka dla fanów Domyślnej Przeglądarki. Znaleziona w raporcie dotyczącym błędu z 2005. roku. Okazuje się, że to, co pojawia się w pasku stanu &lt;abbr title=&quot;Internet Explorera&quot;&gt;IE&lt;/abbr&gt;, nie ma nic wspólnego z tym, dokąd trafisz po kliknięciu odnośnika.&lt;/p&gt;

&lt;p&gt;Prosty przykład:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;form action=&quot;http://7thguard.net/&quot; method=&quot;get&quot;&amp;gt;
	&amp;lt;a href=&quot;http://google.com/&quot;&amp;gt;&amp;lt;input type=&quot;image&quot; src=&quot;http://www.google.com/intl/en/images/logo.gif&quot; alt=&quot;google.com&quot; /&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Do pobawienia się &lt;a href=&quot;http://patrys.icenter.pl/test/2006-08-11-ms-phishing-explorer/&quot;&gt;przykład phishingu w &lt;abbr&gt;IE&lt;/abbr&gt;. Tak, działa z każdym Service Packiem&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/ie&quot; rel=&quot;tag&quot;&gt;ie&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/phishing&quot; rel=&quot;tag&quot;&gt;phishing&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/bug&quot; rel=&quot;tag&quot;&gt;bug&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/exploit&quot; rel=&quot;tag&quot;&gt;exploit&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Linux: ripowanie do mp3</title>
   <link href="http://room-303.com/blog/2006/08/10/linux-ripowanie-do-mp3/"/>
   <updated>2006-08-10T21:30:37+00:00</updated>
   <id>http://room-303.com/blog/2006/08/10/linux-ripowanie-do-mp3</id>
   <content type="html">&lt;p&gt;Tym razem bez skryptu.&lt;/p&gt;

&lt;h4&gt;Wymagania&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;gnome-media&lt;/li&gt;
&lt;li&gt;gstreamer-lame&lt;/li&gt;
&lt;li&gt;sound-juicer&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Konfiguracja&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;odpalamy Sound Juicera&lt;/li&gt;
&lt;li&gt;wybieramy &lt;q&gt;Preferencje,&lt;/q&gt; &lt;q&gt;Modyfikuj profile…&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;w nowootwartym okienku wbyieramy &lt;q&gt;Nowy&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;wybieramy nazwę dla profilu, na przykład &lt;q&gt;MP3&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;zaznaczamy nowy profil i klikamy &lt;q&gt;Edycja&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;w pole &lt;q&gt;Potok GStreamer&lt;/q&gt; wpisujemy &lt;code&gt;audio/x-raw-int,rate=44100,channels=2 ! lame name=enc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;w pole &lt;q&gt;Rozszerzenie pliku&lt;/q&gt; wpisujemy &lt;code&gt;mp3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;zaznaczamy &lt;q&gt;Aktywny?&lt;/q&gt;&lt;/li&gt;
&lt;li&gt;klikamy OK, zamykamy preferencje i cieszymy się obsługą mp3&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/sound-juicer&quot; rel=&quot;tag&quot;&gt;sound-juicer&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/mp3&quot; rel=&quot;tag&quot;&gt;mp3&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/lame&quot; rel=&quot;tag&quot;&gt;lame&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/gnome&quot; rel=&quot;tag&quot;&gt;gnome&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/cd&quot; rel=&quot;tag&quot;&gt;cd&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/music&quot; rel=&quot;tag&quot;&gt;music&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/rip&quot; rel=&quot;tag&quot;&gt;rip&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>O tym, jak TePsa robiła ludzi w balona</title>
   <link href="http://room-303.com/blog/2006/08/08/o-tym-jak-tepsa-robila-ludzi-w-balona/"/>
   <updated>2006-08-08T20:16:36+00:00</updated>
   <id>http://room-303.com/blog/2006/08/08/o-tym-jak-tepsa-robila-ludzi-w-balona</id>
   <content type="html">&lt;blockquote cite=&quot;http://www.internetstandard.pl/news/95913.html&quot;&gt;&lt;p&gt;Gdy spółka o2.pl zdecydowała się skorzystać z usług zagranicznego operatora trzeciego (Telia Sonera) by tym sposobem, przy dużym ruchu, oszczędzić kilkaset tysięcy złotych miesięcznie, TP zdegradowała ruch internetowy między abonentami TP a urządzeniami o2.pl, co spółka wykazała w postępowaniu. Degradacja ta oznacza, że obsługiwany przez o2.pl portal otwierany przez abonentów TP działał znacznie wolniej od innych konkurencyjnych stron internetowych, a tym samym korzystanie z usług oferowanych przez o2.pl na rzecz abonentów TP było bardzo utrudnione lub niemożliwe.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;http://www.internetstandard.pl/news/95913.html&quot;&gt;&lt;cite&gt;TP zmuszona odpuścić polskim operatorom, Internet Standard&lt;/cite&gt;&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Linux: iPod detection</title>
   <link href="http://room-303.com/blog/2006/08/05/linux-ipod-detection/"/>
   <updated>2006-08-05T07:36:32+00:00</updated>
   <id>http://room-303.com/blog/2006/08/05/linux-ipod-detection</id>
   <content type="html">&lt;p&gt;Kolejny raz prosty skrypt, tym razem z prośbą o przetestowanie. Chodzi o automatyczne wykrywanie podłączonego &lt;a href=&quot;http://www.apple.com.pl/ipod/index.html&quot;&gt;iPoda&lt;/a&gt;. Zależy mi dodaniu automatycznej obsługi tych urządzeń do programów, które w tej chwili wymagają ręcznego podania nazwy urządzenia i punktu montowania (&lt;a href=&quot;http://www.gtkpod.org/about.html&quot;&gt;gtkpod&lt;/a&gt;, &lt;a href=&quot;http://www.sacredchao.net/quodlibet/&quot;&gt;Quod Libet&lt;/a&gt; z &lt;a href=&quot;http://www.sacredchao.net/quodlibet/wiki/Plugins/iPod&quot;&gt;wtyczką do iPoda&lt;/a&gt;). W tym celu muszę się upewnić, że wykrywanie działa prawidłowo.&lt;/p&gt;

&lt;h4&gt;Wymagania&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;dbus&lt;/li&gt;
&lt;li&gt;hal&lt;/li&gt;
&lt;li&gt;python&lt;/li&gt;
&lt;li&gt;python-dbus&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Skrypt&lt;/h4&gt;

&lt;blockquote&gt;&lt;pre&gt;#!/usr/bin/python
import dbus

class IPodSeek (object):
	def findPod(self):
		bus = dbus.SystemBus()
		try:
			hal_manager_obj = bus.get_object('org.freedesktop.Hal', 
				'/org/freedesktop/Hal/Manager')
			hal_manager = dbus.Interface(hal_manager_obj,
				'org.freedesktop.Hal.Manager')
			dev_udi_list = hal_manager.FindDeviceStringMatch ('portable_audio_player.type', 'ipod')
			for udi in dev_udi_list:
				vol_udi_list = hal_manager.FindDeviceStringMatch ('info.parent', udi)

				for vol_udi in vol_udi_list:
					vol_obj = bus.get_object ('org.freedesktop.Hal', vol_udi)
					vol = dbus.Interface (vol_obj, 'org.freedesktop.Hal.Device')

					if not vol.GetProperty('volume.is_mounted'):
						continue;

					return (vol.GetProperty('block.device'), vol.GetProperty('volume.mount_point'))
		except None:
			print 'HAL is down.'

		return ('', '')

	def __init__(self):
		(dev, mount) = self.findPod()
		print 'dev = %s; mount = %s' % (dev, mount)

IPodSeek()&lt;/pre&gt;&lt;/blockquote&gt;

&lt;h4&gt;Instrukcja obsługi&lt;/h4&gt;

&lt;p&gt;Wystarczy zapisać plik jako &lt;code&gt;ipodseek.py&lt;/code&gt; i nadać mu prawa do wykonania (&lt;code&gt;chmod +x ipodseek.py&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Prosiłbym o podanie w komentarzach, czy skrypt działa prawidłowo (iPod musi być zamontowany), konkretnego modelu iPoda i dystrybucji użytej do testowania. Jeśli wszystko pójdzie zgodnie z planem, przygotuję patche na źródła programów. Zgodnie z filozofią Apple, chciałbym żeby iPod &lt;q&gt;po prostu działał.&lt;/q&gt;&lt;/p&gt;

&lt;h4&gt;Sprawdzone urządzenia&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;iPod Nano (PLD 3.0; Gentoo &amp;mdash; Maciej &lt;q&gt;Tas&lt;/q&gt; Litwiniuk)&lt;/li&gt;
&lt;li&gt;iPod Shuffle (Ubuntu Dapper 6.06 &amp;mdash; Maciej &lt;q&gt;byte&lt;/q&gt; Chojnacki)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Implementacja&lt;/h4&gt;

&lt;p&gt;Na początek, przygotowałem patch dla wtyczki do Quod Libeta, jest do pobrania na stronie z wtyczką.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/207227802/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/64/207227802_40abfbdc57.jpg&quot; width=&quot;500&quot; height=&quot;313&quot; alt=&quot;iPod detection actually works&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Autor wtyczki poinformował mnie przy okazji, że planowane jest jej włączenie do podstawowego kodu Quod Libet.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/ipod&quot; rel=&quot;tag&quot;&gt;ipod&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/detection&quot; rel=&quot;tag&quot;&gt;detection&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/linux&quot; rel=&quot;tag&quot;&gt;linux&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/python&quot; rel=&quot;tag&quot;&gt;python&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/dbus&quot; rel=&quot;tag&quot;&gt;dbus&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/hal&quot; rel=&quot;tag&quot;&gt;hal&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Hosting, szczerość i zadowoleni klienci</title>
   <link href="http://room-303.com/blog/2006/08/02/hosting-szczerosc-i-zadowoleni-klienci/"/>
   <updated>2006-08-02T10:29:47+00:00</updated>
   <id>http://room-303.com/blog/2006/08/02/hosting-szczerosc-i-zadowoleni-klienci</id>
   <content type="html">&lt;p&gt;W ciągu ostatniego miesiąca &lt;a href=&quot;http://dreamhost.com/&quot;&gt;DreamHost&lt;/a&gt; przeżywał trudny okres. Zdarzały się momenty, kiedy nie działało absolutnie nic. Niemniej jednak, uważam ich za najlepszą firmę hostingową, z jaką przyszło mi współpracować w roli klienta.&lt;/p&gt;

&lt;p&gt;Dlaczego? Właściciele polskich hostingów powinni się od nich uczyć. Nie tego, jak zbudować panel hostingowy. Nie tego, jak powinna wyglądać strona takiej firmy. Nie tego, jak powinna kształtować się oferta (na polskie warunki nierealna zupełnie). Powinni się uczyć, jak się prowadzi dialog z klientami.&lt;/p&gt;

&lt;p&gt;Zapraszam do lektury &lt;a href=&quot;http://blog.dreamhost.com/2006/08/01/anatomy-of-an-ongoing-disaster/&quot;&gt;anatomii (trwającej) katastrofy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DreamHost, I love you guys.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/hosting&quot; rel=&quot;tag&quot;&gt;hosting&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/b2c&quot; rel=&quot;tag&quot;&gt;b2c&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/pr&quot; rel=&quot;tag&quot;&gt;pr&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Linux: wma2mp3</title>
   <link href="http://room-303.com/blog/2006/07/31/linux-wma2mp3/"/>
   <updated>2006-07-31T20:03:37+00:00</updated>
   <id>http://room-303.com/blog/2006/07/31/linux-wma2mp3</id>
   <content type="html">&lt;p&gt;Przyciśnięty potrzebą, napisałem sobie dzisiaj prosty skrypt, który konwertuje zamknięty i niespecjalnie odtwarzalny pod Linuksem format z Redmond na coś bardziej użytecznego w normalnych odtwarzaczach. Może komuś się przyda.&lt;/p&gt;

&lt;h4&gt;Wymagania&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;lame&lt;/li&gt;
&lt;li&gt;mplayer&lt;/li&gt;
&lt;li&gt;w32codec&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Skrypt&lt;/h4&gt;

&lt;blockquote&gt;&lt;pre&gt;#!/bin/bash

if [ -z &quot;$1&quot; ]
then
        echo &quot;Usage: wma2mp3 &amp;lt;file.wma&amp;gt;&quot;
        exit 1
fi

name=`echo $1 | tr ' ' '_' | tr '[A-Z]' '[a-z]'`

name=&quot;`basename &quot;$name&quot; .wma`.mp3&quot;

cp &quot;$1&quot; $name

mplayer -vo null -vc dummy -af resample=44100 -ao pcm:waveheader $name &amp;amp;&amp;amp; lame -m s -h --vbr-new audiodump.wav -o $name

rm audiodump.wav&lt;/pre&gt;&lt;/blockquote&gt;

&lt;h4&gt;Instrukcja obsługi&lt;/h4&gt;

&lt;p&gt;Zapisać w nowym pliku, nazwać go &lt;code&gt;wma2mp3&lt;/code&gt;, dać mu prawo wykonywania (&lt;code&gt;chmod +x wma2mp3&lt;/code&gt;) i przenieść do &lt;code&gt;/usr/bin&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Wywoływać z nazwą pliku &lt;abbr title=&quot;Windows Media Audio&quot;&gt;WMA&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/wma&quot; rel=&quot;tag&quot;&gt;wma&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/mp3&quot; rel=&quot;tag&quot;&gt;mp3&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/convert&quot; rel=&quot;tag&quot;&gt;convert&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/linux&quot; rel=&quot;tag&quot;&gt;linux&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>ASUS A6KM + PLD Linux</title>
   <link href="http://room-303.com/blog/2006/07/30/asus-a6km-pld-linux/"/>
   <updated>2006-07-30T11:06:08+00:00</updated>
   <id>http://room-303.com/blog/2006/07/30/asus-a6km-pld-linux</id>
   <content type="html">&lt;p&gt;Zmieniam laptopa na &lt;a href=&quot;http://www.notebooki.wroc.pl/konf_note.php?id=215&quot;&gt;nowszy model&lt;/a&gt; i od czwartku w, wolnym czasie, powoli stawiam na nim system. Z powodu różnych zawirowań i kłopotów z oprogramowaniem zdecydowałem się, póki co, przenieść tam architekturę i686, choć jest to Turion 64. Z tym problemów nie było, okazało się jednak, że są inne:&lt;/p&gt;

&lt;dl&gt;
&lt;dt&gt;&lt;abbr title=&quot;Advanced Configuration and Power Interface&quot;&gt;ACPI&lt;/abbr&gt;&lt;/dt&gt;
&lt;dd&gt;Wadliwy &lt;abbr title=&quot;Basic Input/Output System&quot;&gt;BIOS&lt;/abbr&gt; w laptopie uszkadza tablicę &lt;abbr&gt;ACPI&lt;/abbr&gt;, jeśli w czasie &lt;abbr title=&quot;Power-On Self Test&quot;&gt;POST&lt;/abbr&gt; do komputer podłączone są jakiekolwiek urządzenia &lt;abbr title=&quot;Universal Serial Bus&quot;&gt;USB&lt;/abbr&gt;. Rozwiązania są trzy, odłączyć urządzenia &lt;abbr&gt;USB&lt;/abbr&gt; do momentu uruchomienia bootloadera, naprawić DSDT, albo wykonać downgrade &lt;abbr&gt;BIOS&lt;/abbr&gt; do wersji 202.&lt;/dd&gt;

&lt;dt&gt;Dźwięk&lt;/dt&gt;
&lt;dd&gt;Karta jest zgodna z intel8x0 i taki sterownik jest dla niej ładowany. Wymaga jednak specjalnej inicjalizacji (a raczej braku inicjalizacji) i załadowanie modułu kończy się… brakiem dźwięku. Specjalny &lt;a href=&quot;https://bugtrack.alsa-project.org/alsa-bug/view.php?id=1898&quot;&gt;patch czeka już w bugtrackerze &lt;abbr title=&quot;Advanced Linux Sound Architecture&quot;&gt;ALSA&lt;/abbr&gt;&lt;/a&gt;, zdaje się, że został także włączony do wersji 1.0.12.&lt;/dd&gt;

&lt;dt&gt;&lt;abbr title=&quot;Wireless Local Area Network&quot;&gt;WLAN&lt;/abbr&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Komputer ma wbudowaną kartę opartą o chipset 802.11g Broadcom, ten sam, który znajduje się w AirportExtreme. Sterownik bcm43xx został włączony do jądra dopiero od wersji 2.6.17 i wciąż jest w fazie rozwoju. Cały czas mam z nim problemy, a sieć udało mi się podnieść dopiero dwa razy i nie jest to działanie deterministyczne. Jak tylko zwalczę kaprysy radiówki, postaram się uaktualnić notkę. Dodam tylko, że próba skorzystania z ndiswrappera zakończyła się komunikatem o niemożliwości rezerwacji obszaru pamięci przez sterownik.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; zgodnie z poradą ehh, użyłem ndiswrappera w połączeniu ze sterownikiem bcmwl5a, który można sobie unzipem wypakować z &lt;a href=&quot;ftp://ftp.gateway.com/pub/hardware_support/drivers/win_xp/portable/m360/D00268-001-002.exe&quot;&gt;paczki windowsowej&lt;/a&gt;. Wszystko działa, jak należy (poza wskaźnikiem siły sygnału, ale do tego się przyzwyczaiłem).&lt;/p&gt;&lt;/dd&gt;

&lt;dt&gt;Kamera&lt;/dt&gt;
&lt;dd&gt;Teoretycznie, laptop ma wbudowaną kamerę wysokiej rozdzielczości, opartą o Ali M5602 z matrycą 1,3Mpix. Stosowny &lt;a href=&quot;http://m560x.x3ng.com/&quot;&gt;sterownik jest już w budowie&lt;/a&gt;, ale nadal nie nadaje się do zwykłego użytku.&lt;/dd&gt;

&lt;dt&gt;Czytnik kart pamięci&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Podobnie jak wszystkie notebooki ASUS, A6KM ma wbudowany czytnik combo oparty na chipsecie Ricoh. Te ostatnie słyną z braku wsparcia dla Linuksa, więc o urządzeniu można spokojnie zapomnieć.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; to trochę taki skrót myślowy, jak słusznie zauważył arekm, karty SD oczywiście działają, problemy są z kartami MMC.&lt;/p&gt;&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/asus&quot; rel=&quot;tag&quot;&gt;asus&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/laptop&quot; rel=&quot;tag&quot;&gt;laptop&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/linux&quot; rel=&quot;tag&quot;&gt;linux&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/a6km&quot; rel=&quot;tag&quot;&gt;a6km&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Hate is a special love</title>
   <link href="http://room-303.com/blog/2006/07/24/hate-is-a-special-love/"/>
   <updated>2006-07-24T19:24:57+00:00</updated>
   <id>http://room-303.com/blog/2006/07/24/hate-is-a-special-love</id>
   <content type="html">&lt;p&gt;Tym razem trochę nie na temat, ale znalazłem w sieci perełkę.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://lukatme.com/&quot; title=&quot;Luka Bandita&quot;&gt;&lt;img src=&quot;http://patrys.room-303.com/images/logos/lukabandita.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://lukatme.com/&quot;&gt;Luka shop for chicks&lt;/a&gt; to sklep — jak można się domyślić po nazwie — dla kobiet. Ale, ale! Nie dla każdej. Luka Bandita ma bowiem w swojej kolekcji wyłącznie punkowe ciuchy. Do boju więc wszystkie zbuntowane, a i panowie niech odwiedzą, nie zapominając o swoich niewiastach. Jest w czym wybierać.&lt;/p&gt;

&lt;p&gt;Post scriptum: wszelakie uwagi o antyklerykałach, wyzwiska i inny offtopic możecie zachować dla siebie. Tak, to jest dedykacja dla dwóch znudzonych dzieci neostrady.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/chicks&quot; rel=&quot;tag&quot;&gt;chicks&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/punk&quot; rel=&quot;tag&quot;&gt;punk&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/clothes&quot; rel=&quot;tag&quot;&gt;clothes&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Pinki, dziś opanujemy świat</title>
   <link href="http://room-303.com/blog/2006/07/22/pinki-dzis-opanujemy-swiat/"/>
   <updated>2006-07-22T13:20:20+00:00</updated>
   <id>http://room-303.com/blog/2006/07/22/pinki-dzis-opanujemy-swiat</id>
   <content type="html">&lt;p&gt;Firma tworzy produkt. Produkt ma grupę docelową, jasno określony przedział zastosowań. Czasami ma również misję, cel swojego istnienia.&lt;/p&gt;

&lt;p&gt;Tak było, kiedy zaczynałem pracę nad swoim autorskim narzędziem &lt;abbr title=&quot;Content Management System&quot;&gt;CMS&lt;/abbr&gt;, &lt;a href=&quot;http://wego.pl/&quot;&gt;wego &lt;abbr&gt;cms&lt;/abbr&gt;&lt;/a&gt;. Wego nie miało nazwy, tytułowało się zwyczajnie, &lt;q&gt;Panelem Administracyjnym, wersja 1.0.&lt;/q&gt; Działało lepiej niż większość popularnych systemów, o niebo lepiej niż siermiężne paneliki pisane przed moim zatrudnieniem, pod każdego z klientów z osobna. Miało jeszcze jedną zaletę, było dobrze zaplanowane na poziomie kodu, zbudowane obiektowo, modularne i — co bardzo ważne — w żaden sposób nie ingerowało w wygląd serwisu, którym miało zarządzać.&lt;/p&gt;

&lt;p&gt;Przez rok od momentu napisania pierwszej linii kodu, w projekcie wiele się zmieniło. Pojawiały się nowe funkcje, usprawnialiśmy poprzednie, poprawialiśmy czytelność kodu. Refaktoryzacje przechodziły falami, zmiany dotyczyły wszystkiego, od sposobu przekazywania danych pomiędzy poszczególnymi komponentami, przez zmiany w kodzie widgetów (panel — ze względu na szybkość rozwoju — nie operuje na kodzie &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt;, zamiast tego budując interfejs za pomocą mechanizmu zagnieżdżanych kontrolek i kontenerów, wzorowanego na &lt;abbr title=&quot;GIMP Toolkit&quot;&gt;GTK+&lt;/abbr&gt;), aż do zmiany sposobu, w jaki serwis końcowy uzyskuje dostęp do danych. Ten ostatni element został doprowadzony do poziomu, gdzie całość strony powstaje z użyciem tylko i wyłącznie szablonów &lt;a href=&quot;http://smarty.php.net/&quot;&gt;Smarty&lt;/a&gt;:&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/195355395/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/62/195355395_19dfb4db57.jpg&quot; alt=&quot;wego.pl - sample product page template&quot; height=&quot;371&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;
Przykład szablonu strony produktu w serwisie &lt;a href=&quot;http://skarby24.pl/&quot;&gt;Dolnośląski Skarb&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Przez cały czas, moim — jako początkowo autora, a później głównego programisty i Managera Projektu — celem było zbudowanie produktu, który coś wniesie na rynek podobnych rozwiązań. Wego jest jednym z najnowocześniejszych systemów zarządzania treścią, ale jednocześnie jest jednym z najprostszych i najwygodniejszych w obsłudze. Właśnie na tej prostocie mi szczególnie zależało i to ona do dzisiaj jest celem większości zmian w systemie. Wego miało być najlepszym sposobem na zarządzanie małym lub średnim serwisem.&lt;/p&gt;

&lt;p&gt;Z drugiej strony, mój szef w wego dopatruje się tylko metody zarabiania pieniędzy. Zdaje się nie dostrzegać tego, że o sile produktu stanowi jego pozorne nieskomplikowanie. Moja kreatywna rola managerska sprowadza się więc ostatnimi czasy do dysponowania ticketami zgłaszanymi przez szefa. A są to głównie prośby o wstawienie więcej informacji, ograniczenie pustego miejsca, które można przecież jakoś zagospodarować i dodanie funkcjonalności, która — cytując &lt;a href=&quot;http://enbewu.net/blog/&quot;&gt;nbw&lt;/a&gt; — &lt;q&gt;pozwoli nam na sprzedaż małym firmom narzędzia, które z powodzeniem mogłoby obsługiwać Bibliotekę Narodową.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Nie lubię sytuacji, kiedy ktoś jawnie mówi mi, że interes użytkownika stoi w konflikcie z interesem firmy, a my powinniśmy mieć narzędzie do wszystkiego. Paradoksalnie, niedawno zawitała do nas przedstawicielka handlowa jednego z konkurencyjnych systemów &lt;abbr&gt;CMS&lt;/abbr&gt; i, zapytana o możliwości systemu, bez skrępowania powiedziała, że do większych wdrożeń polecają produkt konkurencji, z którą mają podpisaną umowę partnerską. Jak widać można, jeśli się tylko chce.&lt;/p&gt;

&lt;p&gt;Pozostaje się tylko cieszyć, że podobnej wizji rozwoju produktu nie podzielają producenci samochodów, bo wtedy mielibyśmy do czynienia z terenowymi limo-busami rajdowymi na gąsienicach, które co prawda palą 100 litrów benzyny na 100 kilometrów, ale w razie powodzi świetnie radzą sobie jako amfibie.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #028: Nieumarli</title>
   <link href="http://room-303.com/blog/2006/07/18/strip-028-nieumarli/"/>
   <updated>2006-07-18T05:05:09+00:00</updated>
   <id>http://room-303.com/blog/2006/07/18/strip-028-nieumarli</id>
   <content type="html">&lt;p&gt;Tym razem pasek o charakterze rodzinnym, ze wskazaniem na bezsenne noce.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/028-zombie-state.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Parafia w Ekwadorze</title>
   <link href="http://room-303.com/blog/2006/07/15/parafia-w-ekwadorze/"/>
   <updated>2006-07-15T18:47:34+00:00</updated>
   <id>http://room-303.com/blog/2006/07/15/parafia-w-ekwadorze</id>
   <content type="html">&lt;p&gt;&amp;hellip;pod wezwaniem Marii Janiny od zwiastowania Sensi Mili.&lt;/p&gt;

&lt;p&gt;Jako, że walka z układem nie ma sensu i o jej skutkach przekonują się co i rusz odwoływani ze swoich stanowisk urzędnicy państwowi, postanowiliśmy się poddać.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/190218494/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/48/190218494_1b620f84ec.jpg&quot; width=&quot;375&quot; height=&quot;500&quot; alt=&quot;Confessions&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jednocześnie informuję, że nadal działa mój dotychczasowy adres email &amp;mdash; &amp;lt;ojciec dyrektor at 10przykazan com&amp;gt;.&lt;/p&gt;

&lt;p&gt;(Następnym razem wystąpimy w moherowych beretach.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; pojawiło się też nagranie:&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;object type=&quot;application/x-shockwave-flash&quot; width=&quot;425&quot; height=&quot;350&quot; data=&quot;http://www.youtube.com/v/GqsJzYRsKLA&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/GqsJzYRsKLA&quot; /&gt;&amp;lt;/param&amp;gt;&lt;/object&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #027: Extreme programming</title>
   <link href="http://room-303.com/blog/2006/07/12/strip-027-extreme-programming/"/>
   <updated>2006-07-12T19:29:37+00:00</updated>
   <id>http://room-303.com/blog/2006/07/12/strip-027-extreme-programming</id>
   <content type="html">&lt;p&gt;Pewnie część z was uważa, że prawdziwe programowanie ekstremalne polega na prototypowaniu kodu równolegle z budowaniem specyfikacji?&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/027-extreme-programming.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Odcinek z dedykacją dla &lt;a href=&quot;http://sitnick.blogspot.com/&quot;&gt;sit0&lt;/a&gt;, który ostatnio spędza ze mną przeciętnie 16 godzin dziennie.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Smutna konkluzja na temat blogowania</title>
   <link href="http://room-303.com/blog/2006/07/08/smutna-konkluzja-na-temat-blogowania/"/>
   <updated>2006-07-08T04:40:48+00:00</updated>
   <id>http://room-303.com/blog/2006/07/08/smutna-konkluzja-na-temat-blogowania</id>
   <content type="html">&lt;p&gt;Zanim przeczytasz posta:&lt;/p&gt;

&lt;p style=&quot;font-size: large;&quot;&gt;&lt;a href=&quot;#&quot;&gt;Dodaj notkę do ulubionych&lt;/a&gt;, &lt;a href=&quot;#&quot;&gt;ustaw notkę jako stronę startową&lt;/a&gt;, &lt;a href=&quot;#&quot;&gt;pokaż inne przedmioty sprzedającego&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Chciałem — jak zwykle — skomentować &lt;a href=&quot;http://riddle.jogger.pl/2006/07/08/gorzka-prawda-o-blogowaniu-na-modle-polska/&quot;&gt;pewną notkę u pewnego pana&lt;/a&gt;.&lt;/p&gt;

&lt;div style=&quot;background: #fc9;&quot;&gt;&lt;b style=&quot;letter-spacing: 1em;&quot;&gt;REKLAMA&lt;/b&gt;
&lt;p&gt;Ujędrnij swój biust, najlpeszy masaż uciskowy u Patrysa&lt;/p&gt;&lt;/div&gt;

&lt;p&gt;Wygląda na to, że polska blogosfera nie jest jeszcze gotowa na nadejście Mesjasza. 10przykazań ma czelność linkować blogi nietechniczne. Polscy hydraulicy i tramwajarze mają odwagę korzystać z gotowych szablonów w systemach blogowych. Co mi tam po treści. Kolejną plagą, po Kubricku i K2 będą zapewne komentarze na blogach. Przygotujcie się do walki, zablokujcie komentarze!&lt;/p&gt;

&lt;p&gt;Przy okazji chciałem nadmienić, że rzucam pracę i przechodzę na blogowanie full-time, w związku z tym potrzebne będą mi nowe meble, wanna piwa i kaska na czynsz. Wspierajcie mnie już dziś za pomocą społecznościowego serwisu &lt;a href=&quot;#&quot;&gt;PayPatr!&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A jak już wyjdziecie z piaskownicy i pójdziecie na zachód, to przed wejściem zdejmować buty, żebyście mi nie zabrudzili ojcodyrektorskiego perskiego dywanu przy głównym wejściu. Ludzi w odzieży sportowej proszę od strony kuchni, wejście przy niewielkim basenie (ledwo jacht zawraca).&lt;/p&gt;

&lt;p&gt;Nie zapomnij się stagować ze szczęścia: &lt;a href=&quot;#&quot;&gt;wykop ten wpis w serwisie cmentarz.pl&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Wesele Figara, czy może DIVy w Operze, a właściwie to dwa słowa o Ajaksie</title>
   <link href="http://room-303.com/blog/2006/07/04/wesele-figara-czy-moze-divy-w-operze-a-wlasciwie-to-dwa-slowa-o-ajaksie/"/>
   <updated>2006-07-04T13:38:52+00:00</updated>
   <id>http://room-303.com/blog/2006/07/04/wesele-figara-czy-moze-divy-w-operze-a-wlasciwie-to-dwa-slowa-o-ajaksie</id>
   <content type="html">&lt;p&gt;Wczoraj i dziś straciliśmy kilka godzin na diagnozowanie bardzo dziwnego zachowania Opery — okazało się bowiem, że przeciąganie produktu do koszyka i odświeżenie tego ostatniego po Ajaksie istotnie zwiększało liczbę zamówionych sztuk, jednak sam koszyk nagle znikał w bliżej nieokreślonych okolicznościach. W Operze. Firefox i Internet Explorer nie pokazywały nic dziwnego. Sama konsola błędów Opery też milczała, co irytowało mnie jeszcze bardziej.&lt;/p&gt;

&lt;p&gt;W końcu sprawdziłem wszystkie możliwości i okazało się, co następuje: &lt;strong&gt;Opera nie obsługuje przekierowań &lt;q&gt;temporarily moved&lt;/q&gt; i &lt;q&gt;permanently moved&lt;/q&gt; w przypadku treści wołanej przez &lt;code&gt;XmlHttpRequest&lt;/code&gt;&lt;/strong&gt;. Mam nadzieję, że zaoszczędzi to komuś kłopotu w przyszłości.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/opera&quot; rel=&quot;tag&quot;&gt;opera&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/ajax&quot; rel=&quot;tag&quot;&gt;ajax&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/redirect&quot; rel=&quot;tag&quot;&gt;redirect&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Social software... development?</title>
   <link href="http://room-303.com/blog/2006/07/03/social-software-development/"/>
   <updated>2006-07-03T18:13:39+00:00</updated>
   <id>http://room-303.com/blog/2006/07/03/social-software-development</id>
   <content type="html">&lt;p&gt;Głośno jest od dłuższego czasu (a dokładniej, odkąd O'Reilly zorganizował sławną &lt;a href=&quot;http://www.web2con.com/web2con/&quot;&gt;konferencję &lt;q&gt;Web 2.0&lt;/q&gt;&lt;/a&gt;) o social software, czy — jak kto woli — oprogramowaniu zorientowanym na kształtowanie i rozwijanie społeczności. Jak to działa, każdy widzi, nowość żadna, bo i bez konferencji istniały takie miejsca w Sieci. Choćby niesławne &lt;a href=&quot;http://myspace.com/&quot;&gt;MySpace.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Co by się jednak stało, gdyby zupełnie odwrócić model i z &lt;q&gt;rozwoju socjalnego oprogramowania&lt;/q&gt; zrobić &lt;q&gt;socjalny rozwój&lt;/q&gt; tegoż? Nie chodzi mi o wzorce Open Source ani o Free Software Foundation. Raczej o całkiem realne &lt;q&gt;community,&lt;/q&gt; czyli o komunę mieszkaniową. Skąd tak dziwne pomysły?&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://sitnick.blogspot.com/&quot;&gt;sit0&lt;/a&gt; mieszka akurat w jednym z takich mieszkań — piątka ludzi, którzy nie są ze sobą w żaden sposób spokrewnieni tworzy coś na kształt rodziny, jednak budowanej na zasadzie równości (&lt;q&gt;twoje parówki równe są mojemu serowi, który zjadłeś wczoraj bez pytania&lt;/q&gt;) i bez wyraźnej hierarchii (&lt;q&gt;sama sobie sprzątaj, ja idę spać&lt;/q&gt;). Mogłoby się wydawać, że w takim środowisku nie da się niczego zorganizować i aż prosi się o chaos i nadciągającą powszechną zagładę, jednak działa to nad wyraz dobrze. Ba, powiedziałbym, że spędzanie tam czasu sprawia mi niekłamaną radość (głównie ze względu na śliczną polonistkę, której trafiło się być moją imienniczką, hehe), pomimo faktu, że spać muszę w kuchni.&lt;/p&gt;

&lt;p&gt;Czy dałoby się więc zbudować podobną komunę, jednak tworzoną w większości przez informatyków? Nie mówimy tu o stereotypach, więc wizję śmierci z głodu lub z braku ubrań możemy śmiało odrzucić. Sprawdziliśmy też wielokrotnie z &lt;a href=&quot;http://enbewu.net/blog/&quot;&gt;nbw&lt;/a&gt; (z którym staramy się zbudować coś podobnego w naszym skromnym, dwuosobowym mieszkaniu o powierzchni 72 metrów kwadratowych) i z &lt;a href=&quot;http://sitnick.blogspot.com/&quot;&gt;sit0&lt;/a&gt;, że rozwój aplikacji w pojedynkę daje znacznie mniej motywacji i radości niż praca w dwie lub więcej osób.&lt;/p&gt;

&lt;p&gt;Marzy mi się domowy hackfest. Radość tworzenia, jak za dawnych czasów, kiedy to w szkole podstawowej stawialiśmy pierwsze kroki w kierunku budowania bardziej ambitnych gier komputerowych. Inna sprawa jest taka, że wspólne programowanie prowadzi do wielu skutków ubocznych, na przykład do marnowania czasu na &lt;a href=&quot;http://sit0.icenter.pl/slogany/&quot;&gt;głupoty, które w momencie pisania rozbawiają nas do łez&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/community&quot; rel=&quot;tag&quot;&gt;community&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/software&quot; rel=&quot;tag&quot;&gt;software&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/development&quot; rel=&quot;tag&quot;&gt;development&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/model&quot; rel=&quot;tag&quot;&gt;model&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/social&quot; rel=&quot;tag&quot;&gt;social&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Z braku laku</title>
   <link href="http://room-303.com/blog/2006/07/02/z-braku-laku/"/>
   <updated>2006-07-02T14:19:31+00:00</updated>
   <id>http://room-303.com/blog/2006/07/02/z-braku-laku</id>
   <content type="html">&lt;p&gt;Z powodu nadmiaru zajęć w stosunku do czasu wolnego, którego brak daje się we znaki (sesja, projekty realizowane poza pracą — wbrew powszechnie panującej opinii, nie zniknąłem pod natłokiem fanek, rzucających mi się na szyję), dziś wrzucę odgrzewaną notkę. Właściwie notka jest nowa, bo piszę ją właśnie teraz, ale zawartość ma już niemal dwa tygodnie.&lt;/p&gt;

&lt;p&gt;Przedstawiam wobec tego głupotę, która mnie dopadła 20. czerwca roku bieżącego, a przejawem jej są ilustracje do linuksowego manuala:&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/171276603/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/52/171276603_25514f0d63.jpg&quot; alt=&quot;man 5 procmailrc&quot; height=&quot;375&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/171296254/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/78/171296254_ab84a8ec9b.jpg&quot; alt=&quot;man 5 procmailrc&quot; height=&quot;375&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tych, którzy spodziewali się czegoś inteligentnego, a szczególnie technicznej notki, przepraszam i obiecuję poprawę, jak tylko wygospodaruję nieco czasu. Przepraszam również tych, którzy poczuli się dotknięci przez moje zdolności szkicowania na komputerze, poprawy nie będzie, więc musicie się przyzwyczaić.&lt;/p&gt;

&lt;p&gt;Na pocieszenie powiem, że &lt;a href=&quot;http://10przykazan.com/&quot;&gt;10przykazan&lt;/a&gt; dorobiło się jakiś czas temu nowej favikonki (dostępna jest też w wersji 64x64 dla tych, którzy szukają buttona, żeby nas reklamować), pojawiła się opcja oglądania najpopularniejszych notek, a przedwczoraj &lt;a href=&quot;http://enbewu.net/blog/&quot;&gt;nbw&lt;/a&gt; dodał kilka kolejnych serwisów do listy śledzonych przez przykazania.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; zapomniałbym, fani naszej twórczości mogą nas zasponsorować symboliczną złotówką, kupując coś z &lt;a href=&quot;http://generated.spreadshirt.net/&quot;&gt;naszych projektów odzieży&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/man&quot; rel=&quot;tag&quot;&gt;man&lt;/a&gt; &lt;a href=&quot;http://technorati.com/tag/procmail&quot; rel=&quot;tag&quot;&gt;procmail&lt;/a&gt; &lt;a href=&quot;http://technorati.com/tag/comic&quot; rel=&quot;tag&quot;&gt;comic&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Zagadka</title>
   <link href="http://room-303.com/blog/2006/06/22/zagadka/"/>
   <updated>2006-06-22T08:47:59+00:00</updated>
   <id>http://room-303.com/blog/2006/06/22/zagadka</id>
   <content type="html">&lt;p&gt;Nikt ze znajomych nie jest mi w stanie odpowiedzieć, a od paru lat problem mnie co jakiś czas zastanawia. Stąd zagadka:&lt;/p&gt;

&lt;p&gt;Dlaczego wymuszone złamanie linii w &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt; jest elementem, a nie encją?&lt;/p&gt;

&lt;p&gt;Odpowiedzi można nadsyłać w komentarzach, redakcja zastrzega sobie prawo do nie zwracania nadesłanych materiałów.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Nostalgia i kult tradycji</title>
   <link href="http://room-303.com/blog/2006/06/17/nostalgia-i-kult-tradycji/"/>
   <updated>2006-06-17T12:04:05+00:00</updated>
   <id>http://room-303.com/blog/2006/06/17/nostalgia-i-kult-tradycji</id>
   <content type="html">&lt;p&gt;Dawno, dawno temu, kiedy jedynym &lt;q&gt;uniwersalnym&lt;/q&gt; systemem kodowania znaków był &lt;abbr title=&quot;American Standard Code for Information Interchange&quot;&gt;ASCII&lt;/abbr&gt;, poszczególne regiony świata były zmuszone wymyślić sobie sposób na reprezentację lokalnych znaków diakrytycznych. Tak powstały zestawy znaków &lt;abbr title=&quot;International Standards Organization&quot;&gt;ISO&lt;/abbr&gt; 8859.&lt;/p&gt;

&lt;p&gt;We wspomnianej grupie znajduje się także właściwy dla Europy Środkowej zestaw &lt;abbr&gt;ISO&lt;/abbr&gt;-8859-2, znany także jako &lt;q&gt;latin2&lt;/q&gt;, który zawiera zestaw diakrytyków właściwy dla Polski. Wydawać by się mogło, że w sieci zestaw ten powinien stać się oczywistym wyborem dla zlokalizowanych stron rodzimego autorstwa, jednak praktyka okazała się ciekawsza od teorii.&lt;/p&gt;

&lt;p&gt;Popularność zdobyły Windows95 i Internet Explorer. Oba miały własną koncepcję reprezentacji znaków narodowych, stosowały bowiem domyślnie (w ramach zaszłości z systemu &lt;abbr title=&quot;Microsoft&quot;&gt;MS&lt;/abbr&gt; &lt;abbr title=&quot;Disk Operating System&quot;&gt;DOS&lt;/abbr&gt;) stronę kodową &lt;abbr title=&quot;codepage&quot;&gt;CP&lt;/abbr&gt;1250.&lt;/p&gt;

&lt;p&gt;Szybko stało się jasne, że skoro &lt;abbr title=&quot;Internet Explorer&quot;&gt;IE&lt;/abbr&gt; automatycznie rozpoznaje dokumenty zapisane w tym &lt;q&gt;standardzie,&lt;/q&gt; to deklarowanie użytej strony uznane zostało wśród &lt;q&gt;okienkowych&lt;/q&gt; webmasterów za zbędne. Cierpieli użytkownicy normalnych systemów (w tym ja, jako użytkownik terminala tekstowego na Politechnice Wrocławskiej).&lt;/p&gt;

&lt;p&gt;Pech chciał, że kiedy &lt;q&gt;latin2&lt;/q&gt; zdobył miano autentycznego standardu, w międzyczasie standardem stał się, promowany przez &lt;a href=&quot;http://unicode.org/&quot;&gt;Konsorcjum Unikodu&lt;/a&gt; zestaw &lt;abbr title=&quot;Universal Transformation Format&quot;&gt;UTF&lt;/abbr&gt;-8. Zestaw niemal idealny, bo pozwalający przedstawić dowolny niemal znak przy niewielkim narzucie (od zera do dwóch bajtów na znak, w zależności od jego egzotyczności). Jedyna metoda na realne zbudowanie serwisu, który oferuje wiele wersji językowych, bądź posługuje się cytatami czy wtrąceniami z innych języków.&lt;/p&gt;

&lt;p&gt;Polska, jak zwykle, do dziś jest pod tym względem w lesie. Coraz to nowsze widuję dzieła znamienitych &lt;q&gt;agencji interaktywnych,&lt;/q&gt; które mienią się etykietami &lt;q&gt;nowoczesnych&lt;/q&gt; i &lt;q&gt;zgodnych ze standardami.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Wróćmy jednak do roku 1995, kiedy to tryumfy popularności święciły stock-tickery, nazywane popularnie &lt;q&gt;markizami&lt;/q&gt; od nieoficjanego rozszerzenia &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt;, elementu (czy może raczej zestawu znaczników, gdyż ówczesny &lt;abbr&gt;HTML&lt;/abbr&gt; niewiele miał wspólnego ze strukturą drzewiastą) &lt;code&gt;&amp;lt;marquee/&amp;gt;&lt;/code&gt;. Ja sam nie jestem bez winy, bo biję się w piersi i przyznaję, że moja pierwsza &lt;q&gt;prawdziwa&lt;/q&gt; strona domowa z końca 1995 roku (kiedy to zamieniłem wspomniany terminal tekstowy na graficzną przeglądarkę na wdzwanianym łączu modemowym kolegi) udekorowana była kilkoma &lt;q&gt;pływającymi&lt;/q&gt; napisami.&lt;/p&gt;

&lt;p&gt;O &lt;q&gt;markizach&lt;/q&gt; pisano wiele, skarżono się na ich nieużyteczność (brak możliwości zatrzymania tekstu, czy regulacji jego prędkości), niestandardowość (to tylko rozszerzenie Microsoftu). Problemem był brak wsparcia w przeglądarkach Netscape, które &amp;mdash; na złość Microsoftu &amp;mdash; posiadały równie paskudne i, niestety, równie popularne rozszerzenie standardu &amp;mdash; nieśmiertelny znacznik &lt;code&gt;&amp;lt;blink&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Koniec końców, Microsoft dogadał się z przedstawicielami Netscape i uznano, że ostatecznie &amp;mdash; dla dobra ogółu Sieci &amp;mdash; oba znaczniki zostaną usunięte z listy oficjalnie wspieranych. Od tego czasu i jeden i drugi działa tak samo &lt;q&gt;dobrze&lt;/q&gt; w większości przeglądarek. Przez wzgląd na zgodność wstecz (to zadziwiające, że ktoś uznał, że usunięcie migotania czy przewijania może spowodować nieczytelność dokumentu, czyż nie?).&lt;/p&gt;

&lt;p&gt;Od tego czasu, przeróżne serwisy, z wyklętym przez zdrowych ludzi &lt;a href=&quot;http://www.dynamicdrive.com/&quot;&gt;DynamicDrive&lt;/a&gt; na czele, prześcigały się w dostarczeniu &lt;q&gt;poprawnej&lt;/q&gt; metody na zapewnienie tej samej (niezbędnej przecież) funkcjonalności &lt;q&gt;nowoczesnym&lt;/q&gt; webmasterom. Do dziś straszą w Sieci setki javascriptowych implementacji znanych z przeszłości straszydełek.&lt;/p&gt;

&lt;p&gt;Czasy jednak się zmieniły, Polska jest krajem nowoczesnym, przodującym więc w technikach internetowych, zatem strona &lt;a href=&quot;http://mf.gov.pl/&quot;&gt;Ministerstwa Finansów &lt;abbr title=&quot;Rzeczypospolitej Polskiej&quot;&gt;RP&lt;/abbr&gt;&lt;/a&gt; do implementacji &lt;q&gt;markiz&lt;/q&gt; używa przyszłościowych technologii. Zastosowanie znanego widzom wiadomości giełdowych tickera uatrakcyjnia niewątpliwie serwis i pozwala odpocząć oczom, odrywając je co jakiś czas od nudnego tekstu aktualnie przeglądanej strony.&lt;/p&gt;

&lt;p&gt;Technologia Flash, umiejętnie zastosowana przez specjalistów, zapobiega jednocześnie kradzieży tekstów, nieklikalnych i niemożliwych do zaznaczenia i skopiowania. Dane rządu są bezpieczne. Honor kraju uratowany.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Clearlooks Dark Green</title>
   <link href="http://room-303.com/blog/2006/06/06/clearlooks-dark-green/"/>
   <updated>2006-06-06T19:20:18+00:00</updated>
   <id>http://room-303.com/blog/2006/06/06/clearlooks-dark-green</id>
   <content type="html">&lt;p&gt;Dla wszystkich zatwardziałych gnomowców, prosta modyfikacja domyślnego tematu Clearlooks — &lt;a href=&quot;http://wirusy.room-303.com/Gnome/ClearlooksGreen/&quot;&gt;Clearlooks Dark Green&lt;/a&gt;. Najlepiej podawać na ciepło, z ikonami &lt;a href=&quot;http://www.gnome-look.org/content/show.php?content=31261&quot;&gt;Tango Original&lt;/a&gt;, przyprawić własną tapetą do smaku.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/161933243/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/74/161933243_dfad0a6fe5.jpg&quot; width=&quot;500&quot; height=&quot;375&quot; alt=&quot;Clearlooks Dark Green&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Zbudowany od zera i na własne potrzeby, więc nie wszystkie applety na panelach muszą dobrze wyglądać. W razie czego, proszę o zgłaszanie poprawek.&lt;/p&gt;

&lt;p&gt;Licencja tematu jest taka, że róbta co chceta ;)&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/clearlooks&quot; rel=&quot;tag&quot;&gt;clearlooks&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/gtk&quot; rel=&quot;tag&quot;&gt;gtk&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/gnome&quot; rel=&quot;tag&quot;&gt;gnome&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/theme&quot; rel=&quot;tag&quot;&gt;theme&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Jak powinien wyglądać prosty CMS?</title>
   <link href="http://room-303.com/blog/2006/06/04/jak-powinien-wygladac-prosty-cms/"/>
   <updated>2006-06-04T11:10:20+00:00</updated>
   <id>http://room-303.com/blog/2006/06/04/jak-powinien-wygladac-prosty-cms</id>
   <content type="html">&lt;p&gt;Nie jest to pewne, ale możecie zobaczyć, jak w tej chwili wygląda &lt;a href=&quot;http://wego.pl/&quot;&gt;wego.pl&lt;/a&gt;, system, który razem z &lt;a href=&quot;http://sitnick.blogspot.com/&quot;&gt;sit0&lt;/a&gt; i &lt;a href=&quot;http://enbewu.net/blog/&quot;&gt;nbw&lt;/a&gt; rozwijamy dla naszego pracodawcy — &lt;a href=&quot;http://prodesign.pl/&quot;&gt;Internet Center Polska&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Przed wersją finalną pewnie jeszcze sporo się zmieni, mimo wszystko, zapraszam do oglądania &lt;a href=&quot;http://wirusy.room-303.com/wego/&quot;&gt;wego.pl alpha preview&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; to nie jest oferta handlowa, publikuję to jako osoba prywatna, a całość jest w stadium rozwojowym i może się znacznie różnić od produktu końcowego.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/cms&quot; rel=&quot;tag&quot;&gt;cms&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/demo&quot; rel=&quot;tag&quot;&gt;demo&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/preview&quot; rel=&quot;tag&quot;&gt;preview&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/wego&quot; rel=&quot;tag&quot;&gt;wego&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/screencast&quot; rel=&quot;tag&quot;&gt;screencast&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>O DreamHost.com raz jeszcze</title>
   <link href="http://room-303.com/blog/2006/06/01/o-dreamhostcom-raz-jeszcze/"/>
   <updated>2006-06-01T17:26:42+00:00</updated>
   <id>http://room-303.com/blog/2006/06/01/o-dreamhostcom-raz-jeszcze</id>
   <content type="html">&lt;p&gt;Wszystkim tym, którzy wytykali w regulaminie DreamHosta ograniczenie czasu procesora na minutę pracy, chciałem powiedzieć, że czasy się zmieniły. W dzisiejszym newsletterze informują właśnie o zniesieniu wszelkich ograniczeń, jedyny warunek jest taki, że serwis nie może całkiem zatkać serwera.&lt;/p&gt;

&lt;p&gt;A teraz nie czekać, &lt;a href=&quot;http://www.dreamhost.com/r.cgi?126653&quot;&gt;zapisywać się&lt;/a&gt; na 20-gigowe konta z miesięcznym limitem transferu na poziomie jednego &lt;del&gt;giga-&lt;/del&gt; tfu! &lt;ins&gt;terabajta&lt;/ins&gt;. Za każdą ofiarę rejestracji mamy 10% zniżki, więc pędźcie zakładać konta całymi stadami, ku chwale ojczyny ;)&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/dreamhost&quot; rel=&quot;tag&quot;&gt;dreamhost&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/hosting&quot; rel=&quot;tag&quot;&gt;hosting&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/cpu&quot; rel=&quot;tag&quot;&gt;cpu&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>webesteem art &amp; design #16</title>
   <link href="http://room-303.com/blog/2006/05/31/webesteem-art-design-16/"/>
   <updated>2006-05-31T12:48:42+00:00</updated>
   <id>http://room-303.com/blog/2006/05/31/webesteem-art-design-16</id>
   <content type="html">&lt;p&gt;Ukazał się &lt;a href=&quot;http://art.webesteem.pl/16/&quot;&gt;kolejny numer art &amp;amp; design&lt;/a&gt;. W środku, &lt;q&gt;jak zwykle,&lt;/q&gt; dział &lt;q&gt;web standards,&lt;/q&gt; a w nim poczytać można sobie:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;o zaokrąglonych rogach,&lt;/li&gt;
&lt;li&gt;o budowaniu tabelek,&lt;/li&gt;
&lt;li&gt;o stosowaniu kanałów &lt;abbr title=&quot;Really Simple Syndication&quot;&gt;RSS&lt;/abbr&gt;,&lt;/li&gt;
&lt;li&gt;o budowaniu dynamicznych interfejsów&lt;/li&gt;
&lt;li&gt;i &lt;strong&gt;o cyckach&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tak, zgadza się, wasz ulubiony publicysta was nie zawiódł i udało mu się wpleść cycki nawet do działu o standardach sieciowych. Miłej lektury ;)&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/design&quot; rel=&quot;tag&quot;&gt;design&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/web&quot; rel=&quot;tag&quot;&gt;web&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/magazine&quot; rel=&quot;tag&quot;&gt;magazine&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Enterprise, beam me up!</title>
   <link href="http://room-303.com/blog/2006/05/31/enterprise-beam-me-up/"/>
   <updated>2006-05-31T07:50:58+00:00</updated>
   <id>http://room-303.com/blog/2006/05/31/enterprise-beam-me-up</id>
   <content type="html">&lt;p&gt;Nie ukrywam, że notka została zainspirowana &lt;a href=&quot;http://thedailywtf.com/forums/thread/75070.aspx&quot;&gt;ostatnim postem na The Daily &lt;abbr title=&quot;What The Fuck&quot;&gt;WTF&lt;/abbr&gt;&lt;/a&gt;. Podobną sytuacje mieliśmy całkiem niedawno w pracy.&lt;/p&gt;

&lt;p&gt;Jako &lt;q&gt;project lead&lt;/q&gt; &lt;a href=&quot;http://wego.pl&quot;&gt;systemu &lt;abbr title=&quot;Content Management System&quot;&gt;CMS&lt;/abbr&gt; wego&lt;/a&gt;, mam dość napięty harmonogram i całość mocy przerobowych firmy jest przeze mnie zaangażowana w rozwój tegoż systemu właśnie. W związku z tym, kiedy pojawił się klient, który wymagał indywidualnego rozwiązania, zadecydowano, że zlecenie zostanie outsource'owane, a realizacja przebiegnie poza firmą.&lt;/p&gt;

&lt;p&gt;Nie byłoby w tym nic dziwnego, gdyby nie fakt, że po kilku dniach dowiedzieliśmy się, że aplikacja zostanie zbudowana w oparciu o &lt;a href=&quot;http://ez.no/&quot;&gt;eZ publish&lt;/a&gt; — system bardziej enterprise'owy niż statek kosmiczny bohaterów Star Treka. Wcześniejsze doświadczenia z refaktoryzacją aplikacji budowanych na eZ bynajmniej nie przepełniały mnie optymizmem, ale byłem mimo wszystko dobrej myśli — co prawda, już raz zdarzyło mi się przepisywać aplikację oryginalnie opartą na rzeczonym środowisku na wersję standalone, bo wydajność okazała się kwestią krytyczną, ale z całą pewnością w ciągu ostatniego roku eZ się rozwinął. Niczym Bogusław Wołoszański, powinienem teraz powiedzieć &lt;q&gt;tego dnia nie mogli jeszcze przypuszczać, że już za dziesięć dni, w biurze obok, odbędzie się spotkanie, które odwróci bieg historii.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;W dziesięć dni później pojawił się bowiem wdrożeniowiec, specjalista od pewnego systemu, którego domena macierzysta mówi wszystko (easy? no!). Rzeczona aplikacja została zbudowana w czasie, który nazwano &lt;q&gt;rekordowym&lt;/q&gt; (choć jej oparcie na frameworku typu Cake z pewnością zaowocowałoby skróceniem tego czasu, jak i oszczędzeniem nam kolejnych kłopotów, ale o tym za chwilę). Przyszedł czas na prezentację. Przygotowania chyżo ruszyły, a specjalista — niczym rączy rumak — wyrwał z kopyta i zatrzymał się na najbliższym słupie. Okazało się bowiem, że nasza wersja &lt;abbr title=&quot;PHP Hypertext Preprocessor&quot;&gt;PHP&lt;/abbr&gt; jest zbyt nowa. eZ nie działa z &lt;abbr&gt;PHP&lt;/abbr&gt;5 i tyle, żadna siła boska ni świecka do kooperacji go nie zmusi. Co prawda, wymaga MySQL5, ale parsera oczekuje prehistorycznego.&lt;/p&gt;

&lt;p&gt;W 24 roboczogodziny później (Qwiat, jako admin, się specjalnie nie nudzi i bez takich kwiatków), system został uruchomiony. &lt;q&gt;I dnia trzeciego zobaczył Pan, że aplikacja klika i było to dobre.&lt;/q&gt; Chciałoby się powiedzieć, że wszystko &lt;q&gt;śmiga,&lt;/q&gt; ale byłoby to wyjątkowo niecelne sformułowanie. Strony serwisu potrzebują około sekundy na wyświetlenie. Pod jednym warunkiem — że znajdują się w cache. Jeśli się jednak przedawnią, na radość podziwiania kilkudziesięciu linijek &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt; przyjdzie nam czekać dokładnie 35 sekund. Na serwerze, gdzie znajduje się kilkaset serwisów, w tym znacznie bardziej skomplikowane rozwiązania, które — bez użycia cache dla danych z bazy — radzą sobie w dobrze poniżej pół sekundy.&lt;/p&gt;

&lt;p&gt;Cóż na to można zaradzić? Wdrożeniowiec zalecił &lt;q&gt;instalację eAcceleratora i rekompilację MySQL z parametrami podanymi na stronie eZ publish.&lt;/q&gt; Pewnie, a potem zakup dedykowanego serwera. eAccelerator przyspieszył proces generowania strony o całe 3 sekundy, druga sugestia trafiła wprost do &lt;code&gt;/dev/null&lt;/code&gt;. Ale czegóż można się spodziewać po aplikacjach z &lt;q&gt;enterprise&lt;/q&gt; w sloganie marketingowym?&lt;/p&gt;

&lt;p&gt;Zapomniałem wspomnieć, że w sytuacji, gdzie wszystkie vhosty mają ustawiony limit pamięci na nie więcej niż &lt;del&gt;12&lt;/del&gt; &lt;ins&gt;8&lt;/ins&gt; &lt;abbr title=&quot;megabajtów&quot;&gt;MB&lt;/abbr&gt;, nasz system na eZ z rozkoszą poprosił o 50 &lt;abbr&gt;MB&lt;/abbr&gt; żeby się w ogóle uruchomić. Boję się sprawdzać, jak wygląda diagram przepływu sterowania w kodzie, ale na usta ciśnie się cytat z komentarzy do wspomnianego posta na The Daily &lt;abbr&gt;WTF&lt;/abbr&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;It forgets the steps where it prints an image of the transactions and then scans them on a desktop to get the wood border.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/ez cms software web enterprise&quot; rel=&quot;tag&quot;&gt;ez cms software web enterprise&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Tim, Oh Really?</title>
   <link href="http://room-303.com/blog/2006/05/27/tim-oh-really/"/>
   <updated>2006-05-27T08:54:43+00:00</updated>
   <id>http://room-303.com/blog/2006/05/27/tim-oh-really</id>
   <content type="html">&lt;p&gt;Wygląda na to, że planowany z &lt;a href=&quot;http://enbewu.net/blog/&quot;&gt;nbw&lt;/a&gt; na lato event będziemy musieli przenieść z Wrocławia nad morze i przemianować na &lt;q&gt;Łeba 2.0&amp;trade;&lt;/q&gt; (nazwa jest nasza i nie ważcie się jej użyć bez pisemnej zgody!). A to wszystko ze strachu przed tym, że &lt;a href=&quot;http://www.tomrafteryit.net/oreilly-trademarks-web-20-and-sets-lawyers-on-itcork/&quot;&gt;pozwie nas Tim&lt;/a&gt; (nie, nie ten z Monty Pythona).&lt;/p&gt;

&lt;p&gt;Strasznie zabawna sprawa &amp;mdash; wygląda na to, że prawnicy wydawnictwa O'Reilly Media pospieszyli się nieco i domagają się globalnego zaprzestania stosowania nazwy, którą próbują zarejestrować w Stanach. Problem w tym, że nie mają do nazwy jeszcze prawa, a ich ofiara znajduje się w Irlandii, gdzie amerykańskimi patentami mogą sobie pomachać co najwyżej.&lt;/p&gt;

&lt;p&gt;Ja nieśmiało przypominam, że posiadam prawo pierwszeństwa do nazwy &lt;a href=&quot;http://www.room-303.com/blog/2005/12/29/web-50/&quot;&gt;Web 5.0&lt;/a&gt;, ph33r m3!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; po chwili przemyśleń -- zgodnie z duchem 2.0 powinniśmy przemianować Web pomiędzy-1-a-3.0 na Web &lt;sub&gt;BETA&lt;/sub&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Koder poszukiwany</title>
   <link href="http://room-303.com/blog/2006/05/26/koder-poszukiwany/"/>
   <updated>2006-05-26T07:48:03+00:00</updated>
   <id>http://room-303.com/blog/2006/05/26/koder-poszukiwany</id>
   <content type="html">&lt;p&gt;Jak to bywa co jakiś czas, &lt;a href=&quot;http://prodesign.pl/&quot;&gt;Internet Center Polska&lt;/a&gt; szuka pracowników. &lt;strong&gt;Zatrudniamy!&lt;/strong&gt; Tym razem poszukujemy osoby, która będzie potrafiła się wykazać na stanowisku…&lt;/p&gt;

&lt;h4&gt;Koder &lt;abbr title=&quot;(Extensible) HyperText Markup Language&quot;&gt;(X)HTML&lt;/abbr&gt;/&lt;abbr title=&quot;Cascading Style Sheets&quot;&gt;CSS&lt;/abbr&gt; — wpółpraca zdalna&lt;/h4&gt;

&lt;p&gt;Oczekujemy od ciebie:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;doskonałej znajomości składni &lt;abbr&gt;XHTML&lt;/abbr&gt;,&lt;/li&gt;
&lt;li&gt;umiejętności dobierania znaczników do semantyki dokumentu,&lt;/li&gt;
&lt;li&gt;sprawnego omijania znanych problemów przeglądarek z Redmond,&lt;/li&gt;
&lt;li&gt;pasji w tworzeniu czystego kodu i przejrzystych arkuszy stylów,&lt;/li&gt;
&lt;li&gt;dobrej znajomości składni szablonów &lt;a href=&quot;http://smarty.php.net/&quot;&gt;Smarty&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;em&gt;terminowości w realizacji projektów&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;W zamian dajemy możliwość &lt;strong&gt;zdalnej pracy&lt;/strong&gt; (pracujesz, nie wychodząc z domu!), stałego kontaktu ze specjalistami (jak &lt;a href=&quot;http://enbewu.net/blog/&quot;&gt;Tomasz Staniak&lt;/a&gt;). Jeśli naprawdę jesteś dobry (lub dobra!), to możesz liczyć na stałą współpracę i ciągły dostęp do zleceń.&lt;/p&gt;

&lt;h4&gt;Kontakt&lt;/h4&gt;

&lt;p&gt;Jeśli spełniasz wszystkie powyższe wymagania, czym prędzej daj nam o tym znać, pisząc na adres &amp;lt;praca at icenter pl&amp;gt;, w temacie podając słowo &lt;q&gt;Koder.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/job&quot; rel=&quot;tag&quot;&gt;job&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/web&quot; rel=&quot;tag&quot;&gt;web&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/coder&quot; rel=&quot;tag&quot;&gt;coder&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/xhtml&quot; rel=&quot;tag&quot;&gt;xhtml&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/css&quot; rel=&quot;tag&quot;&gt;css&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/developer&quot; rel=&quot;tag&quot;&gt;developer&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Niefajnie</title>
   <link href="http://room-303.com/blog/2006/05/24/niefajnie/"/>
   <updated>2006-05-24T05:13:54+00:00</updated>
   <id>http://room-303.com/blog/2006/05/24/niefajnie</id>
   <content type="html">&lt;p&gt;W panelu administracyjnym bloga zaciekawił mnie przychodzący link. Mam w zwyczaju takie klikać i szukać ciekawych blogów. Tym razem trafiłem na &lt;a href=&quot;http://kubus.net.pl/blog/2006/05/24/witam/&quot;&gt;lustro&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Polecam porównać sobie arkusze stylów: &lt;a href=&quot;http://www.room-303.com/blog/wp-content/themes/k2/styles/patrys.css&quot;&gt;patrys.css&lt;/a&gt; &lt;abbr title=&quot;versus&quot;&gt;vs.&lt;/abbr&gt; &lt;a href=&quot;http://kubus.net.pl/blog/wp-content/themes/k2/styles/kubi.css&quot;&gt;kubi.css&lt;/a&gt;. Box &lt;q&gt;About&lt;/q&gt; też wygląda jakby znajomo.&lt;/p&gt;

&lt;p&gt;Tak się nie robi. Nigdzie nie napisałem, że style można sobie wziąć. Licencja &lt;abbr title=&quot;Creative commons&quot;&gt;CC&lt;/abbr&gt; obejmuje tylko treść bloga.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/design&quot; rel=&quot;tag&quot;&gt;design&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/copyright&quot; rel=&quot;tag&quot;&gt;copyright&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Warsztat: PHP</title>
   <link href="http://room-303.com/blog/2006/05/23/warsztat-php/"/>
   <updated>2006-05-23T18:35:49+00:00</updated>
   <id>http://room-303.com/blog/2006/05/23/warsztat-php</id>
   <content type="html">&lt;p&gt;Najładniejsze szablony nie sprzedadzą się same, kiedy klient oczekuje, że serwis będzie robił coś więcej niż prezentacja statycznej treści. Tutaj potrzebne są języki server-side, a ja akurat specjalizuję się w &lt;abbr title=&quot;PHP Hypertext Preprocessor&quot;&gt;PHP&lt;/abbr&gt; (co nie przeszkadza mi swobodnie poruszać się w Perlu, Pythonie i w miarę sprawnie radzić sobie z kodem Ruby — nie uważam &lt;abbr&gt;PHP&lt;/abbr&gt; za najlepszy język i o jego wadach już kiedyś pisałem).&lt;/p&gt;

&lt;h4&gt;Konfiguracja środowiska&lt;/h4&gt;

&lt;p&gt;Na potrzeby rozwoju aplikacji mamy uruchomione własne mini-środowisko, klasyczny &lt;abbr title=&quot;Linux, Apache, MySQL &amp;amp; PHP&quot;&gt;LAMP&lt;/abbr&gt;, z &lt;abbr&gt;PHP&lt;/abbr&gt;5 na pokładzie. Większość konfiguracji to wierna kopia ustawień maszyn produkcyjnych, na których aplikacje są wdrażane, jest jednak kilka kwestii technicznych, o których warto wspomnieć.&lt;/p&gt;

&lt;dl&gt;
&lt;dt&gt;&lt;code&gt;error_reporting&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;zawsze ustawiony na najwyższy poziom, z &lt;code&gt;E_STRICT&lt;/code&gt; włącznie, &lt;abbr&gt;PHP&lt;/abbr&gt; wybacza za dużo, żeby pozwolić sobie na zignorowanie &lt;em&gt;choćby jednego notice&lt;/em&gt;&lt;/dd&gt;

&lt;dt&gt;&lt;code&gt;register_globals&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;bezwzględnie wyłączony, poleganie na tym mechanizmie to proszenie się o kłopoty (wystarczy powiedzieć, że spory odsetek ataków na serwisy wynika właśnie ze stosowania automatycznie rejestrowanych zmiennych), a zastosowanie w ten sposób uzyskanych zmiennych w środowisku obiektowym — nikłe&lt;/dd&gt;

&lt;dt&gt;&lt;code&gt;magic_quotes_gpc&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;cóż — chciałoby się napisać, że to zło, ale jeszcze przez jakiś czas aplikacja, przy której pracujemy, będzie wymagać tego ustawienia — brak wsparcia dla preparowanych zapytań w pierwszych wersjach sprawił, że teraz jeszcze trudniej byłoby je zaimplementować — w najbliższym czasie do projektu dołączy kod, który usuwa automatyczne cytowanie, jeśli jest aktywne, a następnie cytuje ponownie zawartość tablic &lt;code&gt;$_GET&lt;/code&gt;, &lt;code&gt;$_POST&lt;/code&gt;, &lt;code&gt;$_REQUEST&lt;/code&gt; i &lt;code&gt;$_COOKIE&lt;/code&gt;&lt;/dd&gt;
&lt;/dl&gt;

&lt;h4&gt;Biblioteki&lt;/h4&gt;

&lt;dl&gt;
&lt;dt&gt;&lt;a href=&quot;http://pear.php.net/&quot;&gt;&lt;abbr title=&quot;PHP Extension and Application Repository&quot;&gt;PEAR&lt;/abbr&gt;&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;niewątpliwie, najobszerniejsza biblioteka rozszerzeń językowych dla &lt;abbr&gt;PHP&lt;/abbr&gt;, paczki &lt;a href=&quot;http://pear.php.net/package/Mail&quot;&gt;Mail&lt;/a&gt; i &lt;a href=&quot;http://pear.php.net/package/Mail_Mime&quot;&gt;Mail_Mime&lt;/a&gt; stanowią podstawową część większości z naszych aplikacji&lt;/dd&gt;

&lt;dt&gt;&lt;a href=&quot;http://cakephp.org/&quot;&gt;CakePHP&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;szkielet do szybkiego prototypowania i wdrażania aplikacji o średnim i małym poziomie skomplikowania — pozwala minimalnym nakładem kodu uzyskać maksimum funkcjonalności, a przy tym posiada wygodne narzędzia do testowania aplikacji&lt;/dd&gt;

&lt;dt&gt;&lt;a href=&quot;http://smarty.php.net/&quot;&gt;Smarty&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;jeden z najwygodniejszych i najłatwiej rozszerzalnych silników szablonowych dla &lt;abbr&gt;PHP&lt;/abbr&gt;, zbudowany na bazie wtyczek i pozwalający na wykonywanie praktycznie dowolnych operacji na przekazanych przez silnik danych — jednocześnie chroni wnętrze aplikacji przed złośliwymi zmianami w szablonach i optymalizuje czas wykonania kodu przez utrzymywanie cache szablonów w postaci skompilowanej do kodu &lt;abbr&gt;PHP&lt;/abbr&gt;&lt;/dd&gt;

&lt;dt&gt;&lt;a href=&quot;http://cjphp.netflint.net/&quot;&gt;class.jabber.php&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;od dłuższego czasu nierozwijany, ale wciąż jeden z najbardziej wszechstronnych interfejs do sieci Jabber, używany przeze mnie do wysyłania automatycznych powiadomień z poziomu serwisów&lt;/dd&gt;

&lt;dt&gt;&lt;a href=&quot;http://magpierss.sourceforge.net/&quot;&gt;Magpie &lt;abbr title=&quot;Really Simple Syndication&quot;&gt;RSS&lt;/abbr&gt;&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;bardzo wygodna klasa do parsowania wszelakiej maści kanałów informacyjnych, wbrew nazwie, świetnie sobie radzi z dokumentami Atom&lt;/dd&gt;
&lt;/dl&gt;

&lt;h4&gt;Bezpieczeństwo kodu&lt;/h4&gt;

&lt;dl&gt;
&lt;dt&gt;&lt;a href=&quot;http://www.ioncube.com/&quot;&gt;ionCube &lt;abbr&gt;PHP&lt;/abbr&gt; Encoder
&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;jeden z wiodących na rynku pakietów do nieodwracalnego szyfrowania kodu, tańszy od konkurencyjnego rozwiązania &lt;a href=&quot;http://www.zend.com/products/zend_guard&quot;&gt;Zend Guard&lt;/a&gt; i oferujący praktycznie identyczną funkcjonalność, a przy tym powszechnie dostępny na polskich serwerach&lt;/dd&gt;

&lt;dt&gt;&lt;a href=&quot;http://eaccelerator.net/&quot;&gt;eAccelerator&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;darmowy, ale znacznie uboższy w funkcje kuzyn komercyjnych narzędzi do zabezpieczania kodu, wywodzący się z bazy kodowej popularnego przodka — Turck mmCache, jedyne dostępne narzędzie w przypadku serwerów home.pl&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;A czego wy używacie w codziennej pracy? O edytorach postaram się podyskutować następnym razem, więc póki co, zostańmy przy języku.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/php&quot; rel=&quot;tag&quot;&gt;php&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/encoder&quot; rel=&quot;tag&quot;&gt;encoder&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/accelerator&quot; rel=&quot;tag&quot;&gt;accelerator&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/template&quot; rel=&quot;tag&quot;&gt;template&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/smarty&quot; rel=&quot;tag&quot;&gt;smarty&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/jabber&quot; rel=&quot;tag&quot;&gt;jabber&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/pear&quot; rel=&quot;tag&quot;&gt;pear&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/cakephp&quot; rel=&quot;tag&quot;&gt;cakephp&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/rss&quot; rel=&quot;tag&quot;&gt;rss&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/tools&quot; rel=&quot;tag&quot;&gt;tools&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Jak się dostać?</title>
   <link href="http://room-303.com/blog/2006/05/19/jak-sie-dostac/"/>
   <updated>2006-05-19T13:31:39+00:00</updated>
   <id>http://room-303.com/blog/2006/05/19/jak-sie-dostac</id>
   <content type="html">&lt;p&gt;Jeśli kiedykolwiek się zastanawialiście, jak najlepiej odbyć podróż zagraniczną, to bardzo pomocny może okazać się nowy serwis. Właśnie dziś ruszyła aplikacja &lt;a href=&quot;http://howtogetto.com/&quot;&gt;HowToGetTo.com&lt;/a&gt; — pomocnik planowania podróży.&lt;/p&gt;

&lt;p&gt;Aplikacja pozwala wybrać dwa miasta — początek i cel swojej podróży — i sugeruje różne metody przebycia trasy. Przy każdym połączeniu podany jest koszt (jeśli jest znany), czas podróży, częstotliwość kursowania transportu i przewoźnik. Ten ostatni jest zarazem odnośnikiem do strony, która pozwoli uzyskać szczegółowe dane lub zarezerwować bilet. Ciekawostką jest sprzęgnięcie listy lotnisk z bazą wyszukiwarki Google, dzięki czemu po kliknięciu w nazwę lotniska, możemy zobaczyć jego dokładne położenie na mapie.&lt;/p&gt;

&lt;p&gt;Całość wykonana jest w języku angielskim i — co ciekawe — serwis pozbawiony jest reklam. Zapraszam do testów. Jak zastrzega sobie Tomasz Bartosiewicz, autor serwisu, strona jest jeszcze w fazie testów i dopracowywania, a baza informacji o połączeniach nie jest pełna.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/trip&quot; rel=&quot;tag&quot;&gt;trip&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/planning&quot; rel=&quot;tag&quot;&gt;planning&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/web&quot; rel=&quot;tag&quot;&gt;web&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #026: Gdzie w Gadu-Gadu jeszcze nie ma reklam?</title>
   <link href="http://room-303.com/blog/2006/05/18/strip-026-gdzie-w-gadu-gadu-jeszcze-nie-ma-reklam/"/>
   <updated>2006-05-18T18:50:44+00:00</updated>
   <id>http://room-303.com/blog/2006/05/18/strip-026-gdzie-w-gadu-gadu-jeszcze-nie-ma-reklam</id>
   <content type="html">&lt;p&gt;Wszyscy mówią tylko o regulaminach, a ja się zastanawiam, jak jeszcze na tym można zarobić?&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/026-gg8.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #025: All resistance is futile...</title>
   <link href="http://room-303.com/blog/2006/05/18/strip-025-all-resistance-is-futile/"/>
   <updated>2006-05-18T17:35:17+00:00</updated>
   <id>http://room-303.com/blog/2006/05/18/strip-025-all-resistance-is-futile</id>
   <content type="html">&lt;p&gt;Skoro i tak piszą o mnie w ostatniej Polityce, to przy okazji polansuję się może aktualnymi tematami.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/025-pope-sith.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Warsztat: przeglądarka</title>
   <link href="http://room-303.com/blog/2006/05/16/warsztat-przegladarka/"/>
   <updated>2006-05-16T22:08:08+00:00</updated>
   <id>http://room-303.com/blog/2006/05/16/warsztat-przegladarka</id>
   <content type="html">&lt;p&gt;Kiedyś każdy szanujący się webdeveloper używał do budowania serwisów Firefoksa, bo… nie miał specjalnego wyboru. Czasy się zmieniają i inne przeglądarki oferują coraz więcej udogodnień pod tym kątem. Dlatego chciałem sprowokować was do odpowiedzi na proste pytanie: czego używacie do pracy na co dzień?&lt;/p&gt;

&lt;h4&gt;Mozilla Firefox&lt;/h4&gt;

&lt;p&gt;Moją podstawową przeglądarką od lat jest Firefox. Dawniej znany jako Phoenix, później Firebird, jednak w środku wciąż ten sam. O gustach się nie dyskutuje, więc do interfejsu przekonywać nie zamierzam. Chciałem jednak wspomnieć o kilku funkcjach, z których regularnie korzystam.&lt;/p&gt;

&lt;dl&gt;
&lt;dt&gt;podgląd fragmentu drzewa &lt;abbr title=&quot;Document Object Model&quot;&gt;DOM&lt;/abbr&gt;&lt;/dt&gt;
&lt;dd&gt;Wystarczy zaznaczyć interesujący nas fragment dokumentu, niezależnie od tego, czy był częścią oryginalnej strony, został pobrany Ajaksem, czy wygenerowany przez skrypt po stronie użytkownika. Klikamy prawym przyciskiem i wybieramy &lt;q&gt;Pokaż źródło zaznaczenia.&lt;/q&gt;&lt;/dd&gt;

&lt;dt&gt;wybiórcze zaznaczanie tabel&lt;/dt&gt;
&lt;dd&gt;Przytrzymując klawisz &lt;kbd&gt;Ctrl&lt;/kbd&gt; i klikając na krawędzi tabeli bądź wewnątrz jednej z komórek, możemy zaznaczyć sobie dowolny zestaw danych. Gotowy do skopiowania i wklejenia w inne miejsce.&lt;/dd&gt;

&lt;dt&gt;wbudowana konsola błędów&lt;/dt&gt;
&lt;dd&gt;Niegdyś niesamowicie pomocna, obecnie znacznie mniej przydatna funkcja. Pokazuje w locie wszystkie błędy wykryte w dokumencie. Niestety, bez podziału na zakładki, z których pochodzą komunikaty. Od wersji 1.5, z nieznanych mi przyczyn, konsola JavaScript pokazuje również błędy &lt;abbr title=&quot;Cascading Style Sheets&quot;&gt;CSS&lt;/abbr&gt;, które kwalifikowane są jako krytyczne, co przy wspomnianym braku ograniczenia do danego dokumentu czyni konsolę ledwo używalną.&lt;/dd&gt;

&lt;dt&gt;odświeżanie źródła&lt;/dt&gt;
&lt;dd&gt;Wbudowany podgląd źródła dokumentu bez problemu reaguje na kombinację klawiszy &lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;R&lt;/kbd&gt; i grzecznie odświeża podglądane źródła bez potrzeby przeładowywania strony w przeglądarce.&lt;/dd&gt;

&lt;dt&gt;inspektor &lt;abbr&gt;DOM&lt;/abbr&gt;&lt;/dt&gt;
&lt;dd&gt;Przychodząca z programem przeglądarka drzewa dokumentu pozwala wygodnie ustalić, jak wygląda zagnieżdżenie elementów i odczytać ich podstawowe atrybuty.&lt;/dd&gt;

&lt;dt&gt;rozbudowane informacje o stronie&lt;/dt&gt;
&lt;dd&gt;Dostępna pod prawym przyciskiem opcja &lt;q&gt;Informacje o stronie&lt;/q&gt; pozwala nie tylko poznać rozmiar bieżącego dokumentu, ale w wygodny sposób listuje wszystkie odnośniki i elementy graficzne, w przypadku tych ostatnich podając także alternatywne wersje tekstowe, jakie zostały im przypisane.&lt;/dd&gt;
&lt;/dl&gt;

&lt;h4&gt;Wtyczki&lt;/h4&gt;

&lt;p&gt;Sama przeglądarka to jednak niewiele i choć można się obejść bez dodatków, dopiero wtyczki dają prawdziwy komfort budowania serwisów.&lt;/p&gt;

&lt;dl&gt;
&lt;dt&gt;&lt;a href=&quot;http://chrispederick.com/work/webdeveloper/&quot;&gt;Web Developer&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;Dodaje wygodne menu kontekstowe i pasek narzędzi skierowane specjalnie dla autorów stron. Mamy tu pełne spektrum wyłączania, włączania i edycji w locie dla arkuszy stylów, formularzy, grafiki i podstawowych elementów drzewa dokumentu. Wszystko można zmierzyć, obrysować, a na końcu przepuścić przez walidator.&lt;/dd&gt;

&lt;dt&gt;&lt;a href=&quot;http://www.joehewitt.com/software/firebug/&quot;&gt;FireBug&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;Prawdziwy kombajn do śledzenia kodu JavaScript. Podaje liczbę błędów dla bieżącej zakładki przeglądarki, kliknięcie tej informacji rozwija panel z przyborami na każdą okazję. Jeśli uważasz, że konsola wbudowana w Firefoksa jest przeładowana zbędnymi komunikatami, jeśli potrzebujesz debugować zapytania &lt;abbr title=&quot;Asynchronous JavaScript And XML&quot;&gt;AJAX&lt;/abbr&gt; w locie, jeśli chciałbyś inspektora &lt;abbr&gt;DOM&lt;/abbr&gt; który zwyczajnie pozwoli ci kliknąć na elemencie, to rozszerzenie jest dla ciebie.&lt;/dd&gt;

&lt;dt&gt;&lt;a href=&quot;http://www.iosart.com/firefox/colorzilla/&quot;&gt;ColorZilla&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;Marzenie każdego grafika — pipeta wbudowana w przeglądarkę. Widzisz ciekawy motyw kolorystyczny na stronie? Zastanawiasz się, czy to obrazek, czy kolor tła? To bez znaczenia, bo wystarczy uaktywnić ColorZillę i kliknąć dowolny punkt w ramach okna przeglądarki. Od tej chwili kolor jest dostępny do skopiowania w dowolnej postaci. Trudno trafić? Dostępna jest opcja powiększenia strony, podobna do tej zawartej we wspomniamym wcześniej rozszerzeniu Web Developer.&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;A jakich wy używacie zestawów? Zaznaczam, że chodzi mi tylko o rozszerzenia przydatne do budowy stron, inne, jak choćby Tabbrowser Preferences, mnie w tym miejscu nie interesują.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/web&quot; rel=&quot;tag&quot;&gt;web&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/webdeveloper&quot; rel=&quot;tag&quot;&gt;webdeveloper&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/webdesign&quot; rel=&quot;tag&quot;&gt;webdesign&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/firefox&quot; rel=&quot;tag&quot;&gt;firefox&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/browser&quot; rel=&quot;tag&quot;&gt;browser&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/tools&quot; rel=&quot;tag&quot;&gt;tools&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/extension&quot; rel=&quot;tag&quot;&gt;extension&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Wizerunek a duma</title>
   <link href="http://room-303.com/blog/2006/05/15/wizerunek-a-duma/"/>
   <updated>2006-05-15T18:50:18+00:00</updated>
   <id>http://room-303.com/blog/2006/05/15/wizerunek-a-duma</id>
   <content type="html">&lt;p&gt;Ilekroć czytam &lt;a href=&quot;http://37signals.com/svn/&quot;&gt;Signal vs. Noise&lt;/a&gt; i informacje od &lt;a href=&quot;http://dreamhost.com/&quot;&gt;DreamHost.com&lt;/a&gt;, nie mogę się nadziwić, że są w stanie otwarcie powiedzieć, że coś nie działa. W Polsce nie udało mi się jeszcze tego doświadczyć. Mówię oczywiście o relacji odbiorca &amp;mdash; dostawca usług.&lt;/p&gt;

&lt;p&gt;Duma polskich firm, związanych z branżą internetową, wydaje się być na tyle duża, że nie pozwala choćby pomyśleć o tym, że coś poszło nie tak, jak było planowane. Mam kontakt z masą firm świadczących choćby usługi hostingowe. Ilekroć pytałem o to, dlaczego nie poinformować klientów o ewentualnych trudnościach, tyle razy spotykałem się z odpowiedziami z rodzaju &lt;q&gt;może nie zauważą,&lt;/q&gt; niektórzy zaś otwarcie mówili, że to byłoby jawne przyznanie się do porażki. Czy to źle?&lt;/p&gt;

&lt;p&gt;Z punktu widzenia klienta, cieszę się, kiedy wszystko działa. Kiedy jednak przestaje działać, to chciałbym wiedzieć czemu. Jasne, że czasem tego nie zauważę, pewnie nikt nie ogląda własnej strony co 10 minut, nikt też nie czyta poczty przez całą dobę. Jeśli jednak widzę, że coś się sypie, to dlaczego wszyscy udają, że wszystko jest w najlepszym porządku? Nie dam sobie wmówić, że problem jest po mojej stronie, bo to w miarę łatwo zdiagnozować -- skoro inne serwisy działają, a moja ciocia, poproszona o sprawdzenie, potwierdza awarię serwisu.&lt;/p&gt;

&lt;p&gt;Wspomniany we wstępie DreamHost, którego &lt;a href=&quot;http://www.room-303.com/blog/2006/01/05/dreamhost-oszalal/&quot;&gt;usługi już raz polecałem&lt;/a&gt; i z którego jestem bardzo zadowolony, jawnie publikuje takie informacje. Założyli w tym celu osobną stronę, która dodatkowo utrzymywana jest poza ich siecią &amp;mdash; dzięki temu dostępna jest nawet, kiedy na siedzibę firmy spadnie akurat bomba atomowa. Ostatnio przenieśli tam całość publikowanych informacji dla klientów i &lt;a href=&quot;http://dreamhoststatus.com/&quot;&gt;zbudowali z tego bloga&lt;/a&gt;. Kiedy pojawią się trudności, mogę zawsze wejść i zobaczyć, że 10 minut temu miała miejsce awaria rutera trasowego i właśnie ktoś nad tym pracuje. Za kilka minut wszystko wróci do normy.&lt;/p&gt;

&lt;p&gt;Wbrew pozorom, jest to informacja, która poprawia moje zaufanie do usługodawcy. Wiem, że traktuje mnie poważnie i że ktoś czuwa nad proponowanymi usługami. Nie muszę się zastanawiać, czy ktoś już zgłosił usterkę i co się tak właściwie stało. Co więcej, swoim klientom mogę powiedzieć, że pojawiły się takie a takie trudności i wygląda to dużo poważniej niż &lt;q&gt;przed chwilą jeszcze działało.&lt;/q&gt; Najważniejsze jest jednak to, że &lt;em&gt;taka forma komunikacji oszczędza kłopotu obu stronom&lt;/em&gt;. Ja nie muszę dzwonić do providera i dopytywać się o szczegóły, provider nie musi zatrudniać sztabu ludzi do odbierania telefonów od rozwrzeszczanych klientów, a zaoszczędzone pieniądze może zainwestować w jeszcze wyższy poziom usług.&lt;/p&gt;

&lt;p&gt;To świetna metoda na redukcję kosztów i nerwów. Zwłaszcza w Polsce, gdzie firmy hostingowe rzadko dysponują liczną kadrą telefonistek na każde zawołanie. Dlaczego więc nie przyjąć takiego samego modelu u nas? Nie wiem, na ile popularny jest on na zachodzie, jestem jednak pewny, że to działa. Pracuję w sieci od lat i nie widziałem jeszcze firmy, która nie miałaby absolutnie żadnych problemów. Wpadki zdarzają się najlepszym i myślę, że każdy jest w stanie to zrozumieć, brak informacji jest jednak bardzo irytujący i o ile może poprawiać dobre samopoczucie dostawców usług, to przez klientów może być postrzegany jako &lt;q&gt;nie uznaliśmy was za dość ważnych, by powiadomić o problemach.&lt;/q&gt; A ignorancja nie jest najlepszą metodą na budowanie wizerunku.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/pr&quot; rel=&quot;tag&quot;&gt;pr&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/downtime&quot; rel=&quot;tag&quot;&gt;downtime&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/blog&quot; rel=&quot;tag&quot;&gt;blog&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/hosting&quot; rel=&quot;tag&quot;&gt;hosting&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/problems&quot; rel=&quot;tag&quot;&gt;problems&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Google jest trendy</title>
   <link href="http://room-303.com/blog/2006/05/11/google-jest-trendy/"/>
   <updated>2006-05-11T08:49:34+00:00</updated>
   <id>http://room-303.com/blog/2006/05/11/google-jest-trendy</id>
   <content type="html">&lt;p&gt;Jak poinformował mnie dziś Łukasz Olejnik z ekipy sieciowej &lt;a href=&quot;http://www.dhlogcabins.co.uk/uk/index&quot;&gt;Dunster House Log Cabins&lt;/a&gt;, Google uruchomił kolejną usługę skierowaną do opiekujących się serwisami internetowymi.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.google.com/trends&quot;&gt;Google Trends&lt;/a&gt;, bo o nim mowa, pozwala zobaczyć rozkład popularności dowolnych słów kluczowych w zapytaniach internautów na przestrzeni ostatnich dwóch lat. Z pewnością będzie to nieoceniona pomoc dla działów marketingu, zwłaszcza dla wybierających hasła do programu AdSense. Z drugiej strony jest to kolejny element układanki dla wyznawców teorii spiskowej, którzy twierdzą, że Google planuje opanować całość Sieci.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/google&quot; rel=&quot;tag&quot;&gt;google&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/trends&quot; rel=&quot;tag&quot;&gt;trends&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/search&quot; rel=&quot;tag&quot;&gt;search&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/popularity&quot; rel=&quot;tag&quot;&gt;popularity&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/keyword&quot; rel=&quot;tag&quot;&gt;keyword&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>A jak AJAX, sieciowa telenowela</title>
   <link href="http://room-303.com/blog/2006/05/08/a-jak-ajax-sieciowa-telenowela/"/>
   <updated>2006-05-08T19:28:06+00:00</updated>
   <id>http://room-303.com/blog/2006/05/08/a-jak-ajax-sieciowa-telenowela</id>
   <content type="html">&lt;p&gt;&lt;abbr&gt;AJAX&lt;/abbr&gt; — Asynchronous JavaScript And &lt;abbr&gt;XML&lt;/abbr&gt;. Przez niektórych uważany za część Web2.0 (co nie jest prawdą, bo Web2.0 to nie zbiór narzędzi, a &lt;em&gt;podejście&lt;/em&gt; do użytkownika czy klienta), przez innych traktowany jak zło wcielone.&lt;/p&gt;

&lt;p&gt;Po prostu &lt;abbr&gt;AJAX&lt;/abbr&gt;. Który — jak każda technologia — ma swoje wady i zalety, ale żeby o nich rozmawiać, trzeba najpierw wiedzieć, o czym się mówi.&lt;/p&gt;

&lt;p&gt;Sam skrót powstał z potrzeby nazwania grupy technologii, które w połączeniu pozwalają na budowanie interfejsów użytkownika o &lt;q&gt;niespotykanym wcześniej poziomie interakcji.&lt;/q&gt; Tyle marketingu. Skrót przypisuje się &lt;a href=&quot;http://adaptivepath.com/team/jjg.php&quot;&gt;Jesse Jamesowi Garrettowi&lt;/a&gt; i oznacza on, ni mniej ni więcej, pobieranie dodatkowych danych przez już załadowany dokument.&lt;/p&gt;

&lt;h4&gt;Jak działa &lt;abbr&gt;AJAX&lt;/abbr&gt;?&lt;/h4&gt;

&lt;p&gt;Idea jest prosta. Odpowiednio przygotowany skrypt &lt;abbr title=&quot;JavaScript&quot;&gt;JS&lt;/abbr&gt; odwołuje się do innego skryptu po stronie serwera i poprzez wywołanie POST pobiera fragment danych. To wszystko dzieje się asynchronicznie (równolegle, interakcja ze stroną nie jest blokowana na czas pobierania informacji), a same dane są dostępne bez przeładowania strony w przeglądarce. Pozwala to na manipulację nawet dużymi fragmentami interfejsu i daje możliwość budowania zabawek takich jak &lt;a href=&quot;http://gmail.com/&quot;&gt;GMail&lt;/a&gt; czy &lt;a href=&quot;http://www.roundcube.net/&quot;&gt;RoundCube&lt;/a&gt;. Ale na tym &lt;abbr&gt;AJAX&lt;/abbr&gt; się nie kończy.&lt;/p&gt;

&lt;p&gt;To także masa drobnych udogodnień na zwykłych serwisach, które typowymi aplikacjami nie są. Logowanie, które nie wymaga przeładowania strony, sprawdzanie dostępności loginów przy rejestracji, czy na bieżąco uaktualniane w tle statystyki. Właśnie ten wysyp gadżetów sprawił, że wszystko co się rusza, zaczęto nazywać &lt;q&gt;ajaksem.&lt;/q&gt;&lt;/p&gt;

&lt;h4&gt;Nie wszystko złoto…&lt;/h4&gt;

&lt;p&gt;Po boomie na asynchroniczność, pojawił się prawdziwy wysyp bibliotek, które w bardziej lub mniej przystępny sposób udostępniają podobne możliwości zwykłym śmiertelnikom. W tym najpopularniejsza na rynku, stanowiąca trzon oskryptowania &lt;a href=&quot;http://rubyonrails.com/&quot;&gt;Ruby on Rails&lt;/a&gt;, biblioteka &lt;a href=&quot;http://prototype.conio.net/&quot;&gt;Prototype&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Jest ona podstawą kilku większych projektów, w tym &lt;a href=&quot;http://script.aculo.us/&quot;&gt;script.aculo.us&lt;/a&gt; i &lt;a href=&quot;http://openrico.org/&quot;&gt;Rico&lt;/a&gt;, a te z kolei jednoznacznie kojarzą się z pływającymi boksami, animacjami i ogólnie pojętymi fajerwerkami. Z tym, że &lt;em&gt;żadne z tych efektów nie mają z Ajaksem nic wspólnego&lt;/em&gt;. Kropka. To, że coś się wysuwa, jeździ, mruga, czy śpiewa, ma się nijak do asynchronicznych wywołań, równoległych połączeń do serwera i wymiany danych.&lt;/p&gt;

&lt;p&gt;Nie róbmy z Ajaksu drugiego Web2.0, które z pierwotnym znaczeniem (do którego nawiązałem we wstępie) nie ma już nic wspólnego i kojarzy się tylko i wyłącznie z okrągłymi rogami, tłem w skośne paski i pastelowymi kolorami.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/ajax&quot; rel=&quot;tag&quot;&gt;ajax&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/javascript&quot; rel=&quot;tag&quot;&gt;javascript&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #024: Jestem oazą spokoju</title>
   <link href="http://room-303.com/blog/2006/05/01/strip-024-jestem-oaza-spokoju/"/>
   <updated>2006-05-01T13:38:18+00:00</updated>
   <id>http://room-303.com/blog/2006/05/01/strip-024-jestem-oaza-spokoju</id>
   <content type="html">&lt;p&gt;Luźna koncepcja na kontynuację serii gimpowych bazgrołów.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/024-how-u-feelin.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>For I am an expert</title>
   <link href="http://room-303.com/blog/2006/04/28/for-i-am-an-expert/"/>
   <updated>2006-04-28T20:29:07+00:00</updated>
   <id>http://room-303.com/blog/2006/04/28/for-i-am-an-expert</id>
   <content type="html">&lt;p&gt;Na wstępie przepraszam za brak regularnych aktualizacji, ale życie zawodowe absorbuje mnie ostatnio znacznie, a i do nadchodzącego wydania &lt;a href=&quot;http://art.webesteem.org/&quot;&gt;webesteem art &amp;amp; design&lt;/a&gt; wypadało oddać teksty w rozsądnym terminie. Wobec tego, na twórczość blogową czasu pozostało niewiele.&lt;/p&gt;

&lt;p&gt;Z ogłoszeń duszpasterskich, wypada dodać, że &lt;a href=&quot;http://10przykazan.com/&quot;&gt;10przykazan&lt;/a&gt; dorobiło się kilku poprawek. Przede wszystkim treści notek są czyszczone z kodu &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt; i przycinane do rozsądnej długości skrótów, poprawiłem też nieprawidłowo wyświetlane stany subskrypcji na poszczególnych podstronach. Ale nie o tym chciałem pisać.&lt;/p&gt;

&lt;p&gt;Nasz rodzimy guru do spraw designu, Riddle, popełnił wczoraj obszerną notkę na temat redesignu jednego z popularnych serwisów. Wybór nie był przypadkowy, padł bowiem na… serwis komiksowy &lt;a href=&quot;http://www.chomiks.com/&quot;&gt;Chomiks.com&lt;/a&gt; — witrynę niezwykłej wagi i szczególnie cenną dla rozwoju polskiej części Sieci. Błahy temat nie powstrzymał jednak komentującego od pastwienia się nad strony owej aspektami wszelakimi.&lt;/p&gt;

&lt;p&gt;Klimat artykułu godny jest filmu Hitchcocka. Już na wstępnie atakuje nas wytłuszczony &lt;q&gt;failed redesign,&lt;/q&gt; a potem napięcie tylko rośnie. Sypią się zarzuty, częściowo utrzymane w konwencji &lt;q&gt;bo ja nie lubię zielonego, niebieskiego i fiołkowego&lt;/q&gt; — te kolory są takie nie-web2.0. I rogi nie wszystkie zaokrąglone. Katastrofa.&lt;/p&gt;

&lt;p&gt;Ale, ale… Nasz wywiad donosi, że blog Riddla nie lepszy jest w pewnych względach, przeto, niczym Max Kolonko, postaram się prosto z frontu rozwiać wszelkie wątpliwości. Zaczynajmy więc, bowiem:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Design mojego bloga swego czasu został przyjęty bardzo gorąco (google -&amp;gt; site:riddle.jogger.pl R5), do tego nikt się mi nie skarżył, że coś niedomaga.&lt;/p&gt;

&lt;p&gt;[…] a bloga tego czytają i komentują także designerzy […]&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;q&gt;No to jazda,&lt;/q&gt; jak zwykli mawiać nasi odporni na cywilizację przyjaciele z Ekwadoru.&lt;/p&gt;

&lt;h4&gt;Nieprofesjonalny design Riddle'a&lt;/h4&gt;

&lt;p&gt;Kiedyś lubiłem czytać tego bloga. Czasem traktował o Sieci, czasem był zabawny, czasem zwyczajnie miło się przedzierało przez skrzętnie poskładane w zdania wyrazy. Od czasu redesignu, autor popadł w samozachwyt i postanowił wykreować się na autorytet. Mogło być nieźle — niestety — wszystko sprowadza się do jednego skrótu: &lt;strong&gt;&lt;abbr title=&quot;What The Fuck?&quot;&gt;WTF?&lt;/abbr&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Poziom treści systematycznie spadał, do tego stopnia, że w czytaniu generowanej przez młodocianego czarodzieja blogosfery treści zaczął przeszkadzać layout. Prosiłem wielokrotnie i tłumaczyłem — bezskutecznie. Autorytet reprezentuje bowiem stanowisko niezachwiane, obiektywne i jedynie słuszne: &lt;q&gt;mnie się podoba&lt;/q&gt; vel &lt;q&gt;inni jakoś się nie skarżą.&lt;/q&gt;&lt;/p&gt;

&lt;h4&gt;Robię, bo się da&lt;/h4&gt;

&lt;p&gt;Design dla Sieci jest dziedziną sztuki użytkowej. Nie jest sztuką dla sztuki i podlega pewnym ograniczeniom, przynajmniej w teorii. Powinien podlegać, bo jak uczy codzienność, często projektanci zapominają o tym, że przejawy ich geniuszu służyć mają treści, która stanowi trzon i cel zarazem istnienia sieci &lt;abbr title=&quot;World Wide Web&quot;&gt;WWW&lt;/abbr&gt;. Często dają się złapać na tym, że &lt;q&gt;jeden gradiencik nie zaszkodzi,&lt;/q&gt; a kolejny &lt;q&gt;fajny bajer&lt;/q&gt; może tylko podnieść atrakcyjność produktu. &lt;strong&gt;Bullshit.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Świetny przykład stanowią tu stałe elementy ekspozycji u Riddle'a. Nagłówek, który jak mniemam, w domyśle przywodzi pozytywne skojarzenia z wakacjami nad morzem, wygląda atrakcyjnie niczym zamarznięta płyta nagrobna z nałożoną teksturą zardzewiałego metalu. Wartości artystycznej oddać nie sposób, podobnie jak trudno doczytać się tam tytułu. Na szczęście, nie jest to specjalnie dokuczliwe…&lt;/p&gt;

&lt;h4&gt;Sponsorem sidebara jest mleko &lt;q&gt;Białe&lt;/q&gt;&lt;/h4&gt;

&lt;p&gt;…w porównianiu z prawą kolumną. Ilekroć na nią spojrzę, mam wrażenie, że bezproduktywnie marnuje się trzecia część okna mojej przeglądarki. Zastosowanie niezwykle użytecznych zakładek (&lt;q&gt;bo się dało&lt;/q&gt;) budzi pewne wątpliwości. Dla przykładu, żadnym sposobem nie można się dowiedzieć, która jest aktywna. Nie do końca jasne jest też wytłuszczenie z pozoru losowych literek w ich etykietach (oczywiście do momentu, kiedy jeden z drugim weteran sieci sprawdzą w kodzie, że chodzi o &lt;code&gt;accesskey&lt;/code&gt;, który w każdym znanym mi systemie przyjęło się oznaczać podkreśleniem).&lt;/p&gt;

&lt;p&gt;Prawa kolumna z pewnością nie jest przeznaczona do czytania. Najlepiej świadczy o tym dobór koloru i rozmiaru czcionki. Najbardziej widoczny element wystawy to nie do końca uzasadnione pomarańczowe gradienty na strzałkach (czyżby kierunek zwiedzania? Wszak serwis z pewnością odwiedzany jest przez ludzi różnych kultur, a w niektórych krajach przyjęło się przeglądać strony z dołu do góry) i zdjęcie autora. Dalej jest niewyraźna szara plama, poprzetykana nieśmiało nićmi morskich odnośników, nonszalancko powplatanych w treść &lt;q&gt;minibloga&lt;/q&gt; (utrzymanego w klimacie serwisu newsowego).&lt;/p&gt;

&lt;h4&gt;The show must go on&lt;/h4&gt;

&lt;p&gt;Właściwą część witryny stanowią jednak notki. Udekorowane niczym choinka. Jeśli znajdziesz akapit, w którym żaden element nie reaguje na najmniejszy chociaż ruch myszy bądź przewinięcie strony, to daj nam znać, rodzina zaginionego będzie wdzięczna za każdą wskazówkę. Autor wyznaje bowiem filozofię, że do czytania tekstu używa się myszy, przesuwając kursor za punktem zogniskowania oczu.&lt;/p&gt;

&lt;p&gt;Dlatego też przed lekturą ważne jest skoordynowanie ruchu prawej ręki ze skurczami mięśni gałek ocznych. W wypadku pozostawienia wrednego gryzonia samopas, najmniejsze przewinięcie strony wybucha feerią barw w przeciwległym rogu ekranu. Oto bowiem kursor myszy, niedbale porzucony w kącie biurka, natrafił właśnie na nową zabawkę. Czy będzie to paragraf z odnośnikiem, fragment kodu, czy lista wypunktowana? Los nie szczędzi niespodzianek.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Uwaga:&lt;/strong&gt; producent bloga ostrzega, że długotrwała lektura bez nadzoru rodziców grozi atakiem epilepsji. W wypadku wystąpienia bólu głowy, przemyj usta wodą z mydłem.&lt;/p&gt;

&lt;h4&gt;Przyznaj Nobla!&lt;/h4&gt;

&lt;p&gt;Koniec notki wieńczą komentarze. Nie tak od razu. Wcześniej, w celu ułatwienia życia czytelników (którzy niewątpliwie dopatrzyli się w samej treści prawd objawionych), tuż pod każdym tekstem znajdują się odnośniki do dalszej promocji autora. Aż dziw, że żadna współczesna praca naukowa nie kończy się odnośnikami &lt;q&gt;przyznaj Nobla,&lt;/q&gt; a sam raportów swych nie kończę słowami &lt;q&gt;co uprawnia mnie do awansu i podwyżki.&lt;/q&gt;&lt;/p&gt;

&lt;h4&gt;Podsumowując&lt;/h4&gt;

&lt;p&gt;Pisać teksty w stylu &lt;a href=&quot;http://molly.com/&quot;&gt;Molly&lt;/a&gt; może każdy. Wady można wytykać, można sugerować poprawki, można wreszcie napisać &lt;q&gt;paskudne kolory i basta.&lt;/q&gt; Żeby jednak robić to z takim przekonaniem i z pozycji autorytetu, nie wystarczy zrobić trumienkowatego designu dla serwisu blogowego, czy przygotować sobie kolorowego szablonu. Do tego trzeba cieszyć się nie lada respektem w środowisku, a tym pochwalić się — niestety — Riddle nie może. I nic dziwnego, bo potrzeba znacznie więcej niż dwa lata dostępu do Internetu, żeby w Sieci zacząć coś znaczyć.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/blog&quot; rel=&quot;tag&quot;&gt;blog&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/usability&quot; rel=&quot;tag&quot;&gt;usability&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Dywersyfikacja treści</title>
   <link href="http://room-303.com/blog/2006/04/16/dywersyfikacja-tresci/"/>
   <updated>2006-04-16T12:59:39+00:00</updated>
   <id>http://room-303.com/blog/2006/04/16/dywersyfikacja-tresci</id>
   <content type="html">&lt;p&gt;Mamy swoją inicjatywę &amp;mdash; &lt;a href=&quot;http://generatedcontent.com/&quot;&gt;GeneratedContent&lt;/a&gt;, nawet mój pokój ma &lt;a href=&quot;http://room-303.com/&quot;&gt;swoją stronę internetową&lt;/a&gt;. Brakowało tylko strony mieszkania, &lt;a href=&quot;http://16kasprzakastreet.com/&quot;&gt;oto i jest&lt;/a&gt; ;).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Przyprawy, czyli jak pieprzyć usability serwisu</title>
   <link href="http://room-303.com/blog/2006/04/13/przyprawy-czyli-jak-pieprzyc-usability-serwisu/"/>
   <updated>2006-04-13T19:02:04+00:00</updated>
   <id>http://room-303.com/blog/2006/04/13/przyprawy-czyli-jak-pieprzyc-usability-serwisu</id>
   <content type="html">&lt;p&gt;W dzisiejszym odcinku &lt;q&gt;Surfuj z Patrysem&lt;/q&gt; przygotujemy specjalny posiłek, potrawę rzadko spotykaną, choć tradycja przyrządzania jej nie umarła przez lata i kultywowana jest do dzisiaj.&lt;/p&gt;

&lt;p&gt;Niezbędne składniki to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 grafik,&lt;/li&gt;
&lt;li&gt;1 koder,&lt;/li&gt;
&lt;li&gt;1 opiekun projektu,&lt;/li&gt;
&lt;li&gt;1 klient,&lt;/li&gt;
&lt;li&gt;1 zlecenie&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pierwszą czynnością jest zlecenie przez opiekuna grafikowi wykonanie projektu graficznego. Marka grafika nie gra roli, z braku wirtuoza pędzla na miarę Kossaka, można użyć powszechnie dostępnego studenta. Grafika należy dusić powoli przez dwa tygodnie, aż projekt nabierze pożadanej miękkości i klient zgodzi się go zaakceptować.&lt;/p&gt;

&lt;p&gt;Po akceptacji projektu, opiekun przekazuje efekt pracy grafika koderowi z nakazem wiernego odwzorowania szablonu w języku &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt;. Silny nacisk musi tutaj zostać położony na wierność, prace powinny skoncentrować się na tym, żeby zrzut ekranu wykonany w dowolnej przeglądarce co do piksela pasował do projektu, który klient zaakceptował. Kodera, który to usłyszy, opiekamy, aż zacznie skwierczeć i w końcu wydusi z siebie szablony gotowe do podłączenia pod &lt;abbr title=&quot;Content Management System&quot;&gt;CMS&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;Następnie pozwalamy opiekunowi projektu dokładnie zweryfikować zgodność realizacji z plikami Photoshopa, dostarczonymi przez grafika. Poprawiamy miejsca, w których poszczególne boksy są wyższe o piksel i czekamy na moment, kiedy opiekun odkryje, że kliknięcie na dowolny odnośnik bądź przycisk powoduje pojawienie się bliżej niezidentyfikowanej ramki (dla uproszczenia będziemy ją dalej nazywać &lt;q&gt;focus ring&lt;/q&gt;, choć jej geneza jest nieznana i wskazuje na wewnętrzny błąd w każdej z przeglądarek).&lt;/p&gt;

&lt;p&gt;Po krótkim okresie paniki, która następnie przeradza się w ślepą furię, odczekujemy, aż potrawa nieco ostygnie i pozwalamy opiekunowi projektu zlecenie pilnego skorygowania tak poważnej usterki. Podpowiadamy mu także, że szybkie przejrzenie Google zwróciło idealne rozwiązanie — do każdego elementu na stronie wystarczy dokleić &lt;code&gt;onfocus=&quot;blur();&quot;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Do smaku można koderowi przysolić, bądź zagrozić wypieprzeniem. Po wdrożeniu, podawać na ciepło, nie odgrzewać.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/focus&quot; rel=&quot;tag&quot;&gt;focus&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/usability&quot; rel=&quot;tag&quot;&gt;usability&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/web&quot; rel=&quot;tag&quot;&gt;web&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/gui&quot; rel=&quot;tag&quot;&gt;gui&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/design&quot; rel=&quot;tag&quot;&gt;design&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The Daily WTF, part 4</title>
   <link href="http://room-303.com/blog/2006/04/10/the-daily-wtf-part-4/"/>
   <updated>2006-04-10T13:01:49+00:00</updated>
   <id>http://room-303.com/blog/2006/04/10/the-daily-wtf-part-4</id>
   <content type="html">&lt;p&gt;Dzisiejszą nagrodę zdobywają autorzy &lt;a href=&quot;http://www.vhcs.net/&quot;&gt;najgorzej napisanego systemu hostingowego&lt;/a&gt;. Tylko prawdziwy geniusz mógł coś takiego wymyślić. Każda strona &lt;abbr&gt;VHCS&lt;/abbr&gt; jest &lt;q&gt;zabezpieczona&lt;/q&gt; wywołaniem specjalnej funkcji. Kod poniżej:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;function check_login () {
	if (isset($_SESSION['user_logged'])) {
		if (!check_user_login($_SESSION['user_logged'],
			$_SESSION['user_type'],
			$_SESSION['user_id'])) {
			header(&quot;Location: ../index.php&quot;);
		}
	} else {
		header(&quot;Location: ../index.php&quot;);
	}
}&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Oto, moi drodzy, nowy sposób zabezpieczania systemów. Jeśli użytkownik nie jest zalogowany, to wysyłamy mu nagłówek przekierowania do strony logowania, po czym… Po czym nie przerywamy wykonania skryptu przez &lt;code&gt;die();&lt;/code&gt; albo &lt;code&gt;exit();&lt;/code&gt;, tylko pozwalamy mu się normalnie wykonać.&lt;/p&gt;

&lt;p&gt;Tym panom już podziękujemy, serwisy przywrócone z backupów, z &lt;abbr&gt;VHCS&lt;/abbr&gt; się chyba pożegnamy — bezpieczeństwo mają wyraźnie w dużym poważaniu i nie czują się zobowiązani do publikowania informacji o krytycznych błędach (a kolejne poprawki udostępniają przez nadpisanie pliku z poprzednim patchem, bez informacji o zmianach).&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/vhcs&quot; rel=&quot;tag&quot;&gt;vhcs&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/security&quot; rel=&quot;tag&quot;&gt;security&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/hosting&quot; rel=&quot;tag&quot;&gt;hosting&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/wtf&quot; rel=&quot;tag&quot;&gt;wtf&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/code&quot; rel=&quot;tag&quot;&gt;code&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/software&quot; rel=&quot;tag&quot;&gt;software&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Xgl + compiz dla PLD</title>
   <link href="http://room-303.com/blog/2006/03/30/xgl-compiz-dla-pld/"/>
   <updated>2006-03-30T21:11:41+00:00</updated>
   <id>http://room-303.com/blog/2006/03/30/xgl-compiz-dla-pld</id>
   <content type="html">&lt;p&gt;Zbierałem się od dłuższego czasu, to może w końcu napiszę, jak to uruchomić bez psucia systemu. Poniższy opis jest przeznaczony dla użytkowników GNOME. Z KDE nie korzystam, więc nie pomogę.&lt;/p&gt;

&lt;h4&gt;Wymagania&lt;/h4&gt;

&lt;p&gt;Na początek warto przejść na &lt;abbr title=&quot;PLD Linux Distribution&quot;&gt;PLD&lt;/abbr&gt; Th (3.0). Nie jest to konieczne, ale i tak trzeba skorzystać z tamtejszych źródeł pakietów. W tym celu podłączamy je do poldka w &lt;code&gt;/etc/poldek/pld-source.conf&lt;/code&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;[source]
type  = pndir
name  = th
path  = ftp://ftp.th.pld-linux.org/dists/th/PLD/%{_pld_arch}/RPMS/
noauto  = yes&lt;/pre&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;pre&gt;[source]
type  = pndir
name  = th-test
path  = ftp://ftp.th.pld-linux.org/dists/th/test/%{_pld_arch}/RPMS/
noauto  = yes&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Następnie uruchamiamy poldka z nowymi źródłami (&lt;code&gt;poldek -n th -n th-test&lt;/code&gt;) i instalujemy paczki (dla chcących pozostać przy PLD Ac, polecam przełącznik &lt;code&gt;-I&lt;/code&gt;, który zapobiegnie upgrade'owi):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;xorg-xserver-xgl&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;xorg-xserver-xgl-libGL&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;compiz&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;compiz-gnome-settings&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;compiz-gnome-decorator&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do pełnej konfiguracji będzie jeszcze potrzebny &lt;code&gt;gconf-editor&lt;/code&gt;, ale ten można zainstalować z dowolnego źródła.&lt;/p&gt;

&lt;h4&gt;Konfiguracja&lt;/h4&gt;

&lt;p&gt;Zanim przejdziesz dalej, upewnij się, że korzystasz z binarnych sterowników ATI lub nVidii i że Iksy poprawnie obsługują akcelerację (&lt;q&gt;Direct rendering: yes&lt;/q&gt; w &lt;code&gt;glxinfo&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Przystępujemy do edycji pliku &lt;code&gt;/usr/share/gdm/defaults.conf&lt;/code&gt; z pakietu &lt;code&gt;gdm&lt;/code&gt;. W okolicach linii 517. powinien znajdować się wpis:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;[servers]
0=Standard&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Zmieniamy go na następujący:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;[servers]
1=Standard&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Następnie przechodzimy do majstrowania we wnętrznościach &lt;code&gt;/etc/gdm/custom.conf&lt;/code&gt;. Sekcję &lt;code&gt;[servers]&lt;/code&gt; uzupełniamy o poniższy wpis:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;[servers]
1=Xgl&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Na końcu pliku dodajemy jeszcze jedną sekcję:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;[server-Xgl]
name=Xgl server
command=/usr/bin/Xgl :1 -ac -accel xv:pbuffer -accel glx:pbuffer -fullscreen
flexible=true&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Uwaga:&lt;/strong&gt; powyższa linijka &lt;q&gt;command&lt;/q&gt; stosuje się &lt;em&gt;tylko do kart ATI&lt;/em&gt;, użytkownicy nVidii powinni zamiast niej użyć:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;[server-Xgl] 
name=Xgl server 
command=/usr/bin/Xgl :1 -ac -accel xv:fbo -accel glx:pbuffer -fullscreen
flexible=true&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Następnie tworzymy nowy plik, &lt;code&gt;/usr/bin/compiz-start&lt;/code&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;#!/bin/bash
DISPLAY=:1 LD_PRELOAD=/usr/lib/xgl/libGL.so.1.2 compiz --replace gconf &amp;amp;
DISPLAY=:1 gnome-window-decorator &amp;amp;
DISPLAY=:1 setxkbmap -model pc105 -layout pl&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;I nadajemy mu prawo wykonania:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;# chmod a+x /usr/bin/compiz-start&lt;/pre&gt;&lt;/blockquote&gt;

&lt;h4&gt;Uruchomienie&lt;/h4&gt;

&lt;p&gt;Na początek restartujemy daemona GDM. Jeśli wszystko pójdzie dobrze, to Iksy powinny uruchomić się normalnie. Logujemy się na swojego użytkownika i wybieramy &lt;em&gt;Środowisko / Preferencje / Sesje&lt;/em&gt;. Na zakładce &lt;q&gt;Programy startowe&lt;/q&gt; klikamy &lt;q&gt;Dodaj&lt;/q&gt; i wpisujemy jako polecenie &lt;code&gt;compiz-start&lt;/code&gt;. Od tego momentu, compiz będzie startował automatycznie z każdym logowaniem.&lt;/p&gt;

&lt;p&gt;Uruchamiamy ręcznie compiz — wciskamy &lt;kbd&gt;Alt&lt;/kbd&gt; + &lt;kbd&gt;F2&lt;/kbd&gt; i wpisujemy &lt;code&gt;compiz-start&lt;/code&gt;. Nie przejmujemy się faktem, że pulpit wygląda nieco dziwnie i uruchamiamy z menu &lt;em&gt;Aplikacje / Narzędzia systemowe / Edytor konfiguracji&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Po uruchomieniu &lt;code&gt;gconf-editor&lt;/code&gt;, przechodzimy do gałęzi &lt;code&gt;/apps/compiz/general/allscreens/options&lt;/code&gt; i edytujemy wartość &lt;code&gt;active_plugins&lt;/code&gt;. Jest to lista i powinna zawierać następujące elementy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gconf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;decoration&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wobbly&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fade&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;minimize&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cube&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;place&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resize&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;move&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rotate&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;zoom&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scale&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;switcher&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Uwaga:&lt;/strong&gt; wszystkie powyższe wartości trzeba dodać za jednym razem (bez zamykania okna edycji listy), bo compiz przeładowuje wtyczki w locie i zwyczajnie usunie z listy te, dla których nie zostały spełnione zależności (niektóre wtyczki wymagają innych).&lt;/p&gt;

&lt;h4&gt;Tuning&lt;/h4&gt;

&lt;p&gt;Po zapisaniu zmian, wtyczki powinny załadować się automatycznie i compiz powinien uzyskać pełną sprawność bojową. Powyższych czynności nie trzeba powtarzać w przyszłości (chyba, że nowe wersje compiz dostarczą nowych wtyczek).&lt;/p&gt;

&lt;p&gt;Ciekawscy mogą jeszcze pogrzebać w trzewiach klucza &lt;code&gt;/apps/compiz/plugins&lt;/code&gt; — każdy z jego elementów odpowiada za konfigurację jednej wtyczki i można tam zmienić całkiem sporo rzeczy.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/linux&quot; rel=&quot;tag&quot;&gt;linux&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/pld&quot; rel=&quot;tag&quot;&gt;pld&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/compiz&quot; rel=&quot;tag&quot;&gt;compiz&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/xgl&quot; rel=&quot;tag&quot;&gt;xgl&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/gnome&quot; rel=&quot;tag&quot;&gt;gnome&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Mielonka z mielonką, czyli o spamie</title>
   <link href="http://room-303.com/blog/2006/03/30/mielonka-z-mielonka-czyli-o-spamie/"/>
   <updated>2006-03-30T13:47:00+00:00</updated>
   <id>http://room-303.com/blog/2006/03/30/mielonka-z-mielonka-czyli-o-spamie</id>
   <content type="html">&lt;p&gt;Poniższy tekst oryginalnie był moim komentarzem do &lt;a href=&quot;http://spam.jogger.pl/2006/03/27/mujica-mdash-monopol-na-reputacje-nadawcy/&quot;&gt;postu na temat systemu antyspamowego Mujica&lt;/a&gt;, ale uznałem, że pomysł może nie jest taki zły i warto go sobie zostawić pod ręką.&lt;/p&gt;

&lt;p&gt;Byłoby o niebo wygodniej, gdyby serwer wysyłający pocztę podpisywał nagłówki swoim kluczem &lt;abbr title=&quot;Pretty Good Privacy&quot;&gt;PGP&lt;/abbr&gt; i udostępniał w strefie &lt;abbr title=&quot;Domain Name Server&quot;&gt;DNS&lt;/abbr&gt; klucz publiczny (jako pole &lt;code&gt;TXT&lt;/code&gt;), umożliwiający sprawdzenie, czy podpis jest prawidłowy.&lt;/p&gt;

&lt;p&gt;Teraz mamy trzy możliwe sytuacje odbierania poczty:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;list pochodzi od nadawcy, którego MX nie posiada publicznego klucza - list zostaje sprawdzony normalnie, za pomocą spamassassina i trafia do kolejki&lt;/li&gt;

&lt;li&gt;list pochodzi od nadawcy, którego MX posiada publiczny klucz, a list jest prawidłowo podpisany przez serwer - list trafia do kolejki bez sprawdzania&lt;/li&gt;

&lt;li&gt;list pochodzi od nadawcy, którego MX posiada publiczny klucz, ale list nie jest podpisany prawidłowo lub nie jest podpisany wcale - list zostaje odrzucony przed przyjęciem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Łatwe w konfiguracji (wystarczy skopiować klucz publiczny na wszystkie maszyny służące za MX w danej sieci) i łatwo zapobiegnie wysyłaniu spamu z fikcyjnych kont typu &lt;code&gt;user@hotmail.com&lt;/code&gt; (zakładając, że taki Hotmail by to zainstalował). Przy okazji skuteczniejsze od &lt;abbr title=&quot;Sender Policy Framework&quot;&gt;SPF&lt;/abbr&gt;, gdzie spora część adminów dla wygody wpisała sobie &lt;q&gt;all.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/spam&quot; rel=&quot;tag&quot;&gt;spam&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/pgp&quot; rel=&quot;tag&quot;&gt;pgp&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/mail&quot; rel=&quot;tag&quot;&gt;mail&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>GStreamer 0.10 i obsługa WMV w PLD</title>
   <link href="http://room-303.com/blog/2006/03/30/gstreamer-010-i-obsluga-wmv-w-pld/"/>
   <updated>2006-03-30T11:53:56+00:00</updated>
   <id>http://room-303.com/blog/2006/03/30/gstreamer-010-i-obsluga-wmv-w-pld</id>
   <content type="html">&lt;p&gt;Jeśli kogoś to interesuje, to właśnie zmusiłem GStreamer do obsługi formatów zamkniętych. Skutkiem tego jest natualnie ich obsługa przez Totem, najwygodniejszy z odtwarzaczy.&lt;/p&gt;

&lt;p&gt;Do działania potrzebne są:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gstreamer-0.10&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gstreamer-pitfdll&lt;/code&gt; zbudowany z HEAD w &lt;abbr title=&quot;Concurrent Versioning System&quot;&gt;CVS&lt;/abbr&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;w32codec&lt;/code&gt; przebudowany z akceptacją licencji&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Po instalacji powyższych, Totem bez słowa zająknięcia odtworzy nawet pliki &lt;abbr title=&quot;Windows Media Video 9&quot;&gt;WMV9&lt;/abbr&gt;. Tym samym, jestem już całkowicie niezależny od Xine.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/totem&quot; rel=&quot;tag&quot;&gt;totem&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/gstreamer&quot; rel=&quot;tag&quot;&gt;gstreamer&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/wmv&quot; rel=&quot;tag&quot;&gt;wmv&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/pitfdll&quot; rel=&quot;tag&quot;&gt;pitfdll&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/pld&quot; rel=&quot;tag&quot;&gt;pld&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/linux&quot; rel=&quot;tag&quot;&gt;linux&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>GeneratedContent update</title>
   <link href="http://room-303.com/blog/2006/03/28/generatedcontent-update/"/>
   <updated>2006-03-28T20:59:52+00:00</updated>
   <id>http://room-303.com/blog/2006/03/28/generatedcontent-update</id>
   <content type="html">&lt;p&gt;Nie umarliśmy i mamy się całkiem dobrze. Chwilowy brak aktywności zrzucić można na barki kilku zmian, jakie zaszły w ciągu tego miesiąca.&lt;/p&gt;

&lt;p&gt;Przede wszystkim, od dwóch tygodni jestem szczęśliwym posiadaczem GNOME 2.14.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/patrys/119491057/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/55/119491057_a317e57c1c.jpg&quot; alt=&quot;Gnome 2.14 powered by Xgl&quot; height=&quot;375&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nie o tym miałem pisać. Kilka osób już wie, że jedna z &lt;q&gt;osobistości&lt;/q&gt; polskiej geekowej blogosfery, &lt;a href=&quot;http://enbewu.net/blog/&quot;&gt;nbw&lt;/a&gt;, został przeze mnie ściągnięty z Warszawy do Wrocławia i obecnie pracuje jako manager projektów klienckich dla &lt;a href=&quot;http://prodesign.pl/&quot;&gt;Internet Center Polska&lt;/a&gt;, mojego pracodawcy. W związku z przeprowadzką, o której &lt;a href=&quot;http://enbewu.net/blog/2006/03/19/w-stanie-zawieszenia-wpis-informacyjny/&quot;&gt;nbw już pisał&lt;/a&gt;, wynajęliśmy wspólnie mieszkanie.&lt;/p&gt;

&lt;p&gt;Chwilowo przypada nam po około 36 metrów kwadratowych na głowę, co prezentuje się całkiem nieźle, jednak do pełnej przeprowadzki potrzebuję jeszcze kilku mebli. Zdjęcia pojawią się niedługo, wszystkie znaki na niebie i ziemi zdają się wskazywać, że najbliższy weekend upłynie nam pod znakiem &lt;q&gt;parapetówy.&lt;/q&gt; Liczymy tylko na to, że uda się do tego czasu podłączyć sieć.&lt;/p&gt;

&lt;p&gt;Ja w międzyczasie zostałem managerem projektu autorskiego systemu &lt;abbr title=&quot;Content Management System&quot;&gt;CMS&lt;/abbr&gt;, który całkiem niedługo ma szansę pokazać się szerokiej publiczności. Z tej okazji na pokładzie powitaliśmy też &lt;a href=&quot;http://sitnick.blogspot.com/&quot;&gt;sit0&lt;/a&gt;, szalonego programistę, który to hostował imprezę w ostatni weekend.&lt;/p&gt;

&lt;p&gt;Zasilony świeżą siłą zespół raźnie brnie przez pełne problemów pola oprogramowania i z niebywałym dotąd impetem usuwa z listy &lt;q&gt;TODO&lt;/q&gt; kolejne zadania na &lt;a href=&quot;http://basecamphq.com/&quot;&gt;Basecampie&lt;/a&gt;. Wydatnie pomaga nam w tym &lt;a href=&quot;http://www.elsindel.wroc.pl/blog/&quot;&gt;Elsindel&lt;/a&gt; z załogi &lt;a href=&quot;http://www.janmedia.pl/&quot;&gt;Janmedia Interactive&lt;/a&gt;, który jako specjalista od użyteczności opracowuje dla nas szczegółowe listy poprawek.&lt;/p&gt;

&lt;p&gt;I tym optymistycznym akcentem kończę. Z placu boju mówił dla Państwa Patryk Zawadzki, korespondent &lt;a href=&quot;http://generatedcontent.com/&quot;&gt;GeneratedContent.com&lt;/a&gt;. Czytał Jacek Szydłowski.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/gnome&quot; rel=&quot;tag&quot;&gt;gnome&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/generatedcontent&quot; rel=&quot;tag&quot;&gt;generatedcontent&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/cms&quot; rel=&quot;tag&quot;&gt;cms&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/work&quot; rel=&quot;tag&quot;&gt;work&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Nie jestem geekiem!</title>
   <link href="http://room-303.com/blog/2006/03/05/nie-jestem-geekiem/"/>
   <updated>2006-03-05T19:28:21+00:00</updated>
   <id>http://room-303.com/blog/2006/03/05/nie-jestem-geekiem</id>
   <content type="html">&lt;p&gt;Jeszcze do niedawna żyłem w zakłamaniu, tłumacząc wszystkie swoje porażki życiowe (zła cera, problemy w komunikacji z nietechnicznymi, sny o komputerach) faktem bycia geekiem. Z błędu wyprowadził mnie &lt;a href=&quot;http://riddle.jogger.pl/2006/03/05/jak-to-jest-byc-geekiem/&quot;&gt;dzisiejszy wpis Riddle'a&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Okazuje się bowiem, że geek jest przeciwieństwem hakera — ba, jest jego naturalnym wrogiem. Geek-komputerowiec to tak rzadko spotykane zjawisko, jak gwałty na prostytutkach (wygląda na to, że jestem tu odpowiednikiem Samoobrony). Jak streścił to &lt;a href=&quot;http://mmazur.jogger.pl/&quot;&gt;mmazur&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Geek jest towarzyski, optymistyczny, imprezowy, dobry prowiec/marketingowiec i gada w sposób zrozumiały dla zwykłych ludzi.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Marketing to jego drugie ja, pierwsze to nieustająca misja ratowania świata. W obawie przed posądzeniem go o bycie maniakiem, kolega Riddle rekompensuje sobie brak tablicy korkowej urzekającym uśmiechem, a'la Harry Potter #3. Nawet turyści z zachodu, widząc szeroko uśmiechniętego, polskiego geeka w autobusie, mają w zwyczaju mówić &lt;q&gt;oh, he's such a social person&lt;/q&gt; — wszak napędza niejedną społeczność, tak w Internecie, jak i &lt;q&gt;na żywo,&lt;/q&gt; bo zamiłowania do spotkań odmówić mu nie można.&lt;/p&gt;

&lt;p&gt;Dalej dowiadujemy się, że bycie geekiem, to bycie innym. Dobrze, że nie czytali tego miłosiernie nam panujący sklonowani, bo gotowi leczyć i zabronić parad. Geek szuka akceptacji w społeczeństwie i uwielbia tańczyć i śpiewać na ulicach miasta z sobie podobnymi, a następnie pieczołowicie usuwa błoto spod paznokci, bo dłubać to on kocha.&lt;/p&gt;

&lt;p&gt;W pełni zgadzam się z tym, że żaden geek nigdy nie będzie zaniedbywał swojej drugiej połówki. Już w połowie pierwszej połówki z optymizmem spoglądam w kierunku zamrażarki. Wszak trzeba się odstresować po wymarzonej dla geeka pracy helpdeskowca. A kto wie, co czeka go następnego dnia? Na problem niskiego ciśnienia nie pomoże mu kawa, której nie cierpi, ale pełne przygód życie to rekompensuje w pełni — dziś lotnia, jutro skoki na bungee.&lt;/p&gt;

&lt;p&gt;Ja — biedny pozer — niejednokrotnie łkam po nocach, gdy czuję się ignorowany przez ubranych w seledynowe kamizelki fluorescencyjne popleczników naszego redaktora, bombardowanego bezustannie nieuzasadnioną krytyką odnośnie poziomu merytorycznego kolejnych artykułów. Na szczęście w takich momentach ubiera się w modne ciuszki i wraca do pracy u podstaw, nie przejmując się wykształconymi technicznie pozerami z elity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; Autor powyższego wpisu nie zachęca do zażywania żadnych środków wspomagających. &lt;q&gt;LSD,&lt;/q&gt; &lt;q&gt;Marijuana,&lt;/q&gt; oraz hasło &lt;q&gt;Gettin' Riddle Wit' It&lt;/q&gt; są zarejestrowanymi znakami swoich właścicieli i użyte zostały wyłącznie w celach identyfikacyjnych.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Chcę!</title>
   <link href="http://room-303.com/blog/2006/02/19/chce/"/>
   <updated>2006-02-19T23:48:27+00:00</updated>
   <id>http://room-303.com/blog/2006/02/19/chce</id>
   <content type="html">&lt;p&gt;Czy mam wygodne biurko? Biurko jak to biurko, cztery deski na krzyż. Do tego rozklekotany fotel na kółkach &amp;mdash; syn doktora Frankensteina, bo zmontowany z resztek trzech martwych poprzedników. Kto mi ufunduje &lt;a href=&quot;http://www.poetictech.com/&quot;&gt;nowe miejsce do pracy&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/desk&quot; rel=&quot;tag&quot;&gt;desk&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/technology&quot; rel=&quot;tag&quot;&gt;technology&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/gadget&quot; rel=&quot;tag&quot;&gt;gadget&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/workspace&quot; rel=&quot;tag&quot;&gt;workspace&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Śledzenie ko.mentarzy</title>
   <link href="http://room-303.com/blog/2006/02/19/sledzenie-komentarzy/"/>
   <updated>2006-02-19T22:04:36+00:00</updated>
   <id>http://room-303.com/blog/2006/02/19/sledzenie-komentarzy</id>
   <content type="html">&lt;p&gt;Od tygodnia testuję nową zabawkę - &lt;a href=&quot;http://co.mments.com/&quot;&gt;co.mments&lt;/a&gt;. Jak łatwo domyślić się po nazwie, aplikacja powstała, by umożliwić wygodną syndykację komentarzy na blogach. Całość jest prosta do bólu, tak w konstrukcji, jak w działaniu.&lt;/p&gt;

&lt;p&gt;System składa się z dwóch części - skryptozakładki, która dodaje bieżącą stronę do śledzonych i agregatora komentarzy, który pozwala zmiany od ostatniej wizyty obejrzeć w postaci strony &lt;abbr title=&quot;World Wide Web&quot;&gt;WWW&lt;/abbr&gt; lub zasubskrybować jako kanał &lt;abbr title=&quot;Really Simple Syndication&quot;&gt;RSS&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;Polecam.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/webapp&quot; rel=&quot;tag&quot;&gt;webapp&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/comments&quot; rel=&quot;tag&quot;&gt;comments&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/blog&quot; rel=&quot;tag&quot;&gt;blog&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/subscription&quot; rel=&quot;tag&quot;&gt;subscription&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/tracking&quot; rel=&quot;tag&quot;&gt;tracking&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Zanim napiszesz kolejną linijkę JavaScript</title>
   <link href="http://room-303.com/blog/2006/02/18/zanim-napiszesz-kolejna-linijke-javascript/"/>
   <updated>2006-02-18T16:19:52+00:00</updated>
   <id>http://room-303.com/blog/2006/02/18/zanim-napiszesz-kolejna-linijke-javascript</id>
   <content type="html">&lt;p&gt;Nie próbuj nawet wykrywać przeglądarek. Zamiast tego wykrywaj obecność konkretnych funkcji. Dlaczego? Pełna lista przeglądarek byłaby kilkanaście razy dłuższa niż cały twój skrypt i przestanie być aktualna w przeciągu kilku dni. Jeśli obetniesz ją do kilku najpopularniejszych, to odcinasz się od tych, które działałyby poprawnie, ale nigdy o nich nie słyszałeś. Sieć polega na zgodności.&lt;/p&gt;

&lt;p&gt;Poznaj drzewo &lt;abbr title=&quot;Document Object Model&quot;&gt;DOM&lt;/abbr&gt; i naucz się z niego korzystać. &lt;code&gt;document.write()&lt;/code&gt; porównać można do malowania kodu farbą z liści. Na ścianach jaskiń.&lt;/p&gt;

&lt;p&gt;Zanim skopiujesz i wkleisz jakiś kawałek kodu w drugie miejsce w skrypcie, zastanów się dobrze, co robisz. Skoro wystarczy skopiowanie i wklejenie, to prawdopodobnie łamiesz właśnie zasadę wydzielania redundantnego kodu do osobnych funkcji. Tyczy się to każdego języka programowania.&lt;/p&gt;

&lt;p&gt;Zanim napiszesz 20 linii kodu, które podłączą obsługę &lt;code&gt;onclick&lt;/code&gt; do jednego jedynego elementu na stronie, zastanów się, czy nie uprawiasz właśnie sztuki dla sztuki. Pisząc proste &lt;code&gt;onclick=&quot;return foo();&quot;&lt;/code&gt; oszczędzisz sobie kłopotu z propagacją zdarzeń, a mi oszczędzisz kilobajta kodu do pobrania. Jeśli chcesz to zrobić dobrze, użyj biblioteki takiej jak &lt;a href=&quot;http://bennolan.com/behaviour/&quot;&gt;Behaviour&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Upraszczaj kod — oszczędzisz sobie pracy i zwiększysz jego czytelność. Polecam biblioteki wrapujące istniejące funkcje i zapewniające komfort pracy w każdej przeglądarce. Sprawdź &lt;a href=&quot;http://prototype.conio.net/&quot;&gt;Prototype&lt;/a&gt; - jego używanie jest &lt;a href=&quot;http://www.sergiopereira.com/articles/prototype.js.html&quot;&gt;naprawdę proste&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Wyłączaj wspólny i często używany kod do zewnętrznych plików. Nie każ wszystkim pobierać go za każdym razem.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/javascript&quot; rel=&quot;tag&quot;&gt;javascript&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/dom&quot; rel=&quot;tag&quot;&gt;dom&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/prototype&quot; rel=&quot;tag&quot;&gt;prototype&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/behaviour&quot; rel=&quot;tag&quot;&gt;behaviour&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/code&quot; rel=&quot;tag&quot;&gt;code&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Dawid z Goliatem?</title>
   <link href="http://room-303.com/blog/2006/02/16/dawid-z-goliatem/"/>
   <updated>2006-02-16T20:40:13+00:00</updated>
   <id>http://room-303.com/blog/2006/02/16/dawid-z-goliatem</id>
   <content type="html">&lt;p&gt;Zastanawiam się właśnie, czy jest realna współpraca pomiędzy dużymi i małymi? Żeby być precyzyjnym, chodzi mi dokładnie o agencje interaktywne.&lt;/p&gt;

&lt;p&gt;Kilkuosobowe, małe firmy stanowią większość rynku (tak zwany &lt;q&gt;długi ogon&lt;/q&gt;). Najczęściej zatrudniają zaledwie kilka osób i skupiają się na oferowaniu swoich usług klientom niewiele większym od siebie. Ich moc przerobowa i ryzyko zachwiania płynności finansowej nie pozwalają na zaangażowanie się w większe, kilku- czy kilkunastomiesięczne projekty dla dużych zleceniodawców. Z drugiej strony, w tak małym zespole każde stanowisko obsadzane jest ze szczególną ostrożnością &amp;mdash; każdy pracownik musi idealnie pasować do mechanizmu i musi się doskonale orientować w co najmniej kilku dziedzinach. Pomijam firmy-krzaki, które utrzymują się z klepania &lt;q&gt;stronek&lt;/q&gt; pod FrontPage.&lt;/p&gt;

&lt;p&gt;Średnie i duże firmy z kolei dysponują dużymi zespołami. Są w stanie podjąć się bardziej ambitnych i lepiej płatnych zadań. Większe zasoby ludzkie nie gwarantują tak uniwersalnych predyspozycji poszczególnych pracowników, ale z drugiej strony pozwalają na większą dywersyfikację i inwestycje w kierunkach, na które nie stać mniejszych kolegów. Choćby badania użyteczności, czy analiza dostępności serwisów.&lt;/p&gt;

&lt;p&gt;Mali nie są w stanie podjąć się wielkich zleceń, często też nie są w stanie dotrzeć do wszystkich klientów. Dużym nie opłaca się przyjmowanie mniejszych zleceń, bo większy zespół musi na siebie zarobić. Mają jednak większe możliwości, których brakuje mniejszym.&lt;/p&gt;

&lt;p&gt;Czy jest zatem możliwa współpraca pomiędzy dużymi i małymi? Outsourcing pracowników (tak brakujących zasobów dla mniejszej firmy, jak i wszechstronnego &lt;q&gt;MacGyvera&lt;/q&gt; do zadań specjalnych w drugą stronę), wymiana narzędzi (obie firmy muszą siłą rzeczy pracować nad produktami, które często zastosowanie znalazłyby również po drugiej stronie barykady), przekierowywanie klientów, którzy nie mieszczą się w targecie? Zastanawialiście się nad tym?&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/outsourcing&quot; rel=&quot;tag&quot;&gt;outsourcing&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/webdesign&quot; rel=&quot;tag&quot;&gt;webdesign&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/cooperation&quot; rel=&quot;tag&quot;&gt;cooperation&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/company&quot; rel=&quot;tag&quot;&gt;company&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Google Chat</title>
   <link href="http://room-303.com/blog/2006/02/14/google-chat/"/>
   <updated>2006-02-14T20:55:12+00:00</updated>
   <id>http://room-303.com/blog/2006/02/14/google-chat</id>
   <content type="html">&lt;p&gt;Jeśli ktoś jeszcze nie zauważył, &lt;a href=&quot;http://gmail.com/&quot;&gt;Google Mail&lt;/a&gt; został zintegrowany z Google Chat. Ten ostatni to nic innego, niż interfejs pomiędzy przeglądarką a serwerem &lt;a href=&quot;http://talk.google.com/&quot;&gt;Google Talk&lt;/a&gt;. Tak, można rozmawiać pomiędzy dwoma przeglądarkami (również zza firewalla) i pomiędzy przeglądarką a normalnym klientem Jabbera.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/google&quot; rel=&quot;tag&quot;&gt;google&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/chat&quot; rel=&quot;tag&quot;&gt;chat&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/jabber&quot; rel=&quot;tag&quot;&gt;jabber&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/gmail&quot; rel=&quot;tag&quot;&gt;gmail&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Community 2.0</title>
   <link href="http://room-303.com/blog/2006/02/12/community-20/"/>
   <updated>2006-02-12T23:02:37+00:00</updated>
   <id>http://room-303.com/blog/2006/02/12/community-20</id>
   <content type="html">&lt;p&gt;Ja się już przyzwyczaiłem do trolli w komentarzach, którzy w argumentacji stosują prawidła logiki dla informatyków:&lt;/p&gt;

&lt;dl&gt;
&lt;dt&gt;argument przez wątpliwość&lt;/dt&gt;
&lt;dd&gt;&lt;q&gt;Chyba cię pojebało!&lt;/q&gt;&lt;/dd&gt;

&lt;dt&gt;dowód przez indukcję autorytetu&lt;/dt&gt;
&lt;dd&gt;&lt;q&gt;To nieprawda, mój wujek napisał o tym książkę.&lt;/q&gt;&lt;/dd&gt;

&lt;dt&gt;dowód akustyczny&lt;/dt&gt;
&lt;dd&gt;&lt;q&gt;Słyszałem, że mówisz bzdury.&lt;/q&gt;&lt;/dd&gt;

&lt;dt&gt;argument multimedialny&lt;/dt&gt;
&lt;dd&gt;&lt;q&gt;Gdzieś czytałem coś zupełnie innego. Albo ktoś mi mówił.&lt;/q&gt;&lt;/dd&gt;

&lt;dt&gt;dowód wprost&lt;/dt&gt;
&lt;dd&gt;&lt;q&gt;Bzdura.&lt;/q&gt;&lt;/dd&gt;

&lt;dt&gt;dowód przez psychoanalizę&lt;/dt&gt;
&lt;dd&gt;&lt;q&gt;Wynika to z faktu, że nie znasz się na niczym innym.&lt;/q&gt;&lt;/dd&gt;

&lt;dt&gt;dowód przez fallus micrus&lt;/dt&gt;
&lt;dd&gt;&lt;q&gt;Zajmuję się tym rok dłużej, mam fajniejszą furę i większego. Mylisz się.&lt;/q&gt;&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;Dyskusje takie zawsze wnoszą wiele ciekawych informacji do rozmowy i ogólnie są bardzo potrzebne, choćby dla odreagowania stresu na cudzym blogu. To co zobaczyłem dzisiaj mnie przeraziło: &lt;a href=&quot;http://riddle.jogger.pl/comment.php?eid=189441&quot;&gt;Riddle opisuje&lt;/a&gt; spór pomiędzy nim a Wassago.&lt;/p&gt;

&lt;p&gt;Nie byłoby w tym nic komicznego, gdyby nie pewien drobny fakt. Spór toczy się o to, kto &lt;em&gt;zupełnie nieodpłatnie&lt;/em&gt; wykona projekt graficzny dla &lt;em&gt;darmowego serwisu&lt;/em&gt;. Jeśli dodać do tego argumentację przez patos (&lt;q&gt;Panie Kowalski, Pan raczysz nie dostrzegać intratnego piękna, zawoalowanego krzykliwą powierzchownością materii&lt;/q&gt;), to zaczyna to przypominać spór dwóch cór Koryntu o to, która obsłuży klienta za darmo.&lt;/p&gt;

&lt;p&gt;No proszę ja was, czy możliwość umieszczenia w &lt;abbr title=&quot;Curriculum Vitae&quot;&gt;CV&lt;/abbr&gt; zapisu &lt;q&gt;wykonałem projekt serwisu społecznego, o którym nikt z was nie słyszał&lt;/q&gt; jest warta łapania się za mordy? Ja bym się na ich miejscu zastanowił dwa razy, a potem umówił na wspólne piwo. Współpraca jest lepsza niż walka, zwłaszcza, kiedy walczyć nie ma o co.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/community&quot; rel=&quot;tag&quot;&gt;community&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/blog&quot; rel=&quot;tag&quot;&gt;blog&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/design&quot; rel=&quot;tag&quot;&gt;design&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/layout&quot; rel=&quot;tag&quot;&gt;layout&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Zatrudnimy programistę</title>
   <link href="http://room-303.com/blog/2006/02/10/zatrudnimy-programiste/"/>
   <updated>2006-02-10T10:08:50+00:00</updated>
   <id>http://room-303.com/blog/2006/02/10/zatrudnimy-programiste</id>
   <content type="html">&lt;p&gt;Nasza agencja interaktywna, &lt;a href=&quot;http://prodesign.pl/&quot;&gt;ICENTER&lt;/a&gt;, z siedzibą we Wrocławiu, poszukuje kandydatów do pracy na stanowisku &lt;strong&gt;programista &lt;abbr title=&quot;PHP Hypertext Preprocessor&quot;&gt;PHP&lt;/abbr&gt;, MySQL&lt;/strong&gt;. Interesują nas kandydaci specjalizujący się w tworzeniu aplikacji internetowych.&lt;/p&gt;

&lt;p&gt;Na wstępie zaznaczam, że &lt;em&gt;zdalna praca jest wykluczona&lt;/em&gt;, wchodzące w grę formy zatrudnienia to umowa o pracę lub umowa o dzieło.&lt;/p&gt;

&lt;h4&gt;Wymagania&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;swobodne posługiwanie się &lt;abbr&gt;PHP&lt;/abbr&gt; (programowanie obiektowe);&lt;/li&gt;
&lt;li&gt;doskonała znajomość MySQL;&lt;/li&gt;
&lt;li&gt;sprawne posługiwanie się &lt;abbr title=&quot;Extensible HyperText Markup Language&quot;&gt;XHTML&lt;/abbr&gt;, &lt;abbr title=&quot;Cascading Style Sheets&quot;&gt;CSS&lt;/abbr&gt;, mile widziana znajomość silnika szablonów &lt;a href=&quot;http://smarty.php.net/&quot;&gt;Smarty&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;własna inwencja przy realizowaniu zadań, terminowość&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Co w zamian?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;realizacja projektów dla znanych polskich i zagranicznych marek;&lt;/li&gt;
&lt;li&gt;możliwość wdrażania własnych pomysłów;&lt;/li&gt;
&lt;li&gt;praca w młodym, dynamicznym zespole, w przyjaznej atmosferze;&lt;/li&gt;
&lt;li&gt;stałe, atrakcyjne wynagrodzenie,a dodatkowo udział w wypracowanym zysku&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;Kontakt&lt;/h4&gt;
&lt;p&gt;W przypadku spełnienia wszystkich wymagań, proszę skierować list motywacyjny i &lt;abbr title=&quot;Curriculum Vitae&quot;&gt;CV&lt;/abbr&gt;, zawierający:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dokładny przebieg dotychczasowej pracy zawodowej,&lt;/li&gt;
&lt;li&gt;odnośniki do wykonanych aplikacji,&lt;/li&gt;
&lt;li&gt;krótki opis funkcjonalny tych aplikacji,&lt;/li&gt;
&lt;li&gt;dostęp do części administracyjnej (w miarę możliwości),&lt;/li&gt;
&lt;li&gt;dostęp do źródła (w miarę możliwości),&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;na adres &amp;lt;praca at icenter pl&amp;gt;, podając &lt;q&gt;PROGRAMISTA&lt;/q&gt; w tytule listu.&lt;/p&gt;

&lt;p&gt;Rekrutacja trwa do końca &lt;em&gt;lutego 2006&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;W przypadku dużej ilości zgłoszeń możemy zostać zmuszeni do odpowiadania tylko na wybrane.&lt;/p&gt;

&lt;h4&gt;Dane kontaktowe&lt;/h4&gt;
&lt;p&gt;Internet Center Polska, ul. Piotra Skargi 7/4, 50-082 WROCŁAW&lt;/p&gt;

&lt;p&gt;Telefon: (071) 344-82-52; 341-75-81 (czynny od poniedziałku do piątku w godzinach 9:00 - 16:00)&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/job&quot; rel=&quot;tag&quot;&gt;job&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/webdesign&quot; rel=&quot;tag&quot;&gt;webdesign&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/programming&quot; rel=&quot;tag&quot;&gt;programming&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/code&quot; rel=&quot;tag&quot;&gt;code&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/offer&quot; rel=&quot;tag&quot;&gt;offer&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Dlaczego PHP jest do niczego?</title>
   <link href="http://room-303.com/blog/2006/02/05/dlaczego-php-jest-do-niczego/"/>
   <updated>2006-02-05T21:46:37+00:00</updated>
   <id>http://room-303.com/blog/2006/02/05/dlaczego-php-jest-do-niczego</id>
   <content type="html">&lt;p&gt;Nie jest. Tytuł powinien brzmieć raczej:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dlaczego, kiedy mówię, że programuję w C/C++, ludzie czują respekt?&lt;/li&gt;
&lt;li&gt;Dlaczego, kiedy mówię, że programuję w Pythonie, podają mi rękę?&lt;/li&gt;
&lt;li&gt;Dlaczego, kiedy mówię, że programuję w &lt;abbr title=&quot;PHP Hypertext Preprocessor&quot;&gt;PHP&lt;/abbr&gt;, ludzie śmieją się do rozpuku?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To trochę jak z Polakami za granicą. Ludność autochtoniczna ocenia ich nie po tym, kim naprawdę są, ale po tych jednostkach, które widać najbardziej. Po kiepsko ubranych, niedomytych pijusach spod marketów. Podobnie jest z programistami &lt;abbr&gt;PHP&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;Język zaczął jako mało popularny silnik do osadzania prostych, krótkich skryptów wewnątrz kodu &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt;. Nie oferował wiele -- programowanie proceduralne, zmienne bez reguł typowania, wektory zwykłe i tablice mieszające. Z czasem nabrał popularności i zrobiło się o nim w sieci głośno. Pojawiały się kolejne tutoriale, pisane tak przez doświadczonych ludzi, jak przez laików. Język był tak prosty, że nawet dziecko było w stanie wykonać w nim proste operacje i podzielić się swoją pracą z innymi.&lt;/p&gt;

&lt;p&gt;Z czasem platforma ewoluowała i zyskiwała na funkcjonalności. Zyskała sobie poklask wśród firm hostingowych ze względu na łatwość utrzymania -- wystarczyło dodać jeden moduł do serwera &lt;abbr title=&quot;World Wide Web&quot;&gt;WWW&lt;/abbr&gt; i wszystko zaczynało &lt;q&gt;magicznie&lt;/q&gt; działać. Lawina nabrała masy i zaczęła napędzać się sama. Już kilka lat temu można było bez trudu znaleźć strony jedenasto-/dwunastolatków zafascynowanych &lt;abbr&gt;PHP&lt;/abbr&gt;. Kolejne wydawnictwa prześcigały się w publikacji tomów opiewających wspaniałość języka. Pozycje książkowe były lepsze lub gorsze, z przewagą tych pierwszych. Powtórzyła się sytuacja z językiem &lt;abbr&gt;HTML&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;Od kiedy &lt;abbr&gt;PHP&lt;/abbr&gt; uzyskało etykietkę &lt;q&gt;języka dla wszystkich,&lt;/q&gt; język zaczął gwałtownie tracić w oczach środowiska profesjonalistów. Zaczął być kojarzony ze wspomnianymi dziećmi i niedzielnymi &lt;q&gt;hakerami,&lt;/q&gt; którzy wdrożenie aplikacji rozpoczynali od lektury dwóch, wątpliwej jakości, tutoriali w sieci, a następnie tytułowali się ekspertami w dziedzinie webaplikacji. Tak jest do dziś -- &lt;abbr&gt;PHP&lt;/abbr&gt; kojarzone jest z proceduralnym kodem, brakiem separacji warstw logiki i prezentacji, brakiem dokumentacji projektowej, konstrukcjami składniowymi na miarę niesławnego Visual Basica i aplikacjami, które raz napisane, nie nadają się ani do powtórnego użycia ani późniejszej modyfikacji.&lt;/p&gt;

&lt;p&gt;Co z językiem jest nie tak? Jest bardzo elastyczny, momentami za bardzo. Język C, jako język kompilowany do postaci binarnej, posiada bardzo rygorystyczną kontrolę zgodności typów. Ostrzega nawet przed konwersją typów, które są właściwie identyczne w reprezentacji binarnej, ale posiadają różne nazwy, stąd nawet rzutowanie wskaźników wymaga jawnej konwersji w kodzie. Python posiada bardzo rygorystyczną składnię -- wymusza poprawne (i czytelne) formatowanie kodu źródłowego, bo jego wygląd decyduje o przepływie sterowania. Co ma &lt;abbr&gt;PHP&lt;/abbr&gt;? Burdel na kółkach.&lt;/p&gt;

&lt;p&gt;Najbardziej boli w codziennej pracy jedno z jego początkowych założeń -- brak typowania zmiennych. Uniemożliwia to kontrolę poprawności kodu jeszcze przed jego uruchomieniem i skutkuje godzinami ślęczenia nad kilkunastoma tysiącami linii w celu wyłapania literówki lub tak zwanego &lt;q&gt;efektu kofeinowego deficytu.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Boli też domyślna konfiguracja serwerów deweloperskich, gdzie poziom raportowania błędów jest dostosowany do maszyny produkcyjnej i spory procent &lt;q&gt;programistów&lt;/q&gt; nie ma nawet pojęcia, że język oprócz błędów krytycznych potrafi też raportować ostrzeżenia i powiadomienia (a od wersji piątej także błędy naruszenia rygoru składni).&lt;/p&gt;

&lt;p&gt;Jeszcze bardziej boli domyślne aktywowanie na serwerach opcji &lt;code&gt;register_globals&lt;/code&gt; i &lt;code&gt;magic_quotes_gpc&lt;/code&gt;. Pozwala pisać niechlujny kod, a dodatkowo uniemożliwia jego uruchomienie na poprawnie skonfigurowanych maszynach.&lt;/p&gt;

&lt;p&gt;Boli brak narzędzi interaktywnych i wbudowanej obsługi testów jednostkowych, co pozwoliłoby błyskawicznie wyłapywać regresje w kodzie bez potrzeby pisania specjalnych interfejsów do uruchamiania poszczególnych elementów silnika.&lt;/p&gt;

&lt;p&gt;Boli brak zunifikowanej struktury dostępu do systemów bazodanowych. Brakuje też podobnej struktury dostępu do danych pochodzących ze źródeł zewnętrznych.&lt;/p&gt;

&lt;p&gt;Na szczęście, przynajmniej część z tych problemów zostanie lub została już zniwelowana. Od &lt;abbr&gt;PHP 5.1&lt;/abbr&gt; dostępny jest szkielet dostępu do danych potencjalnie niebezpiecznych -- &lt;code&gt;input_filter&lt;/code&gt;. Pojawił się też uniwersalny silnik dostępu do baz danych - &lt;abbr title=&quot;PHP Data Objects&quot;&gt;PDO&lt;/abbr&gt;. W wersji szóstej całkowicie usunięte zostanie wsparcie dla &lt;code&gt;magic_quotes&lt;/code&gt; i &lt;code&gt;register_globals&lt;/code&gt;. Nic jednak nie naprawi ludzi, którzy budują to, jak język jest postrzegany. Jeśli ktoś nie chce się uczyć, to najlepsze zmiany nic nie dadzą. Tak jak nic nie dadzą narzędzia, z których nie chce korzystać.&lt;/p&gt;

&lt;p&gt;Zanim zacznie się flejm -- jestem programistą i utrzymuję się głównie z tworzenia aplikacji we wspomnianym wyżej języku. Znam jego mocne i słabe strony. Tekst wyraża moje i tylko moje zdanie na ten temat.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/php&quot; rel=&quot;tag&quot;&gt;php&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/code&quot; rel=&quot;tag&quot;&gt;code&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>RAD: CRUD</title>
   <link href="http://room-303.com/blog/2006/02/05/rad-crud/"/>
   <updated>2006-02-05T13:39:40+00:00</updated>
   <id>http://room-303.com/blog/2006/02/05/rad-crud</id>
   <content type="html">&lt;p&gt;Kiedy starałem się o pracę w &lt;a href=&quot;http://prodesign.pl/&quot;&gt;Internet Center Polska&lt;/a&gt; półtora roku temu, w ramach kwalifikacji zostałem posadzony przed komputerem i dostałem za zadanie napisanie w &lt;abbr title=&quot;PHP Hypertext Preprocessor&quot;&gt;PHP&lt;/abbr&gt; panelu do zarządzania prostą, jednotabelową bazą danych. Dziś byłbym w stanie to zrobić w ciągu kilkunastu minut i całość zawrzeć w pięciu liniach kodu.&lt;/p&gt;

&lt;p&gt;Od roku coraz większą popularnością cieszą się frameworki implementujące &lt;abbr title=&quot;Create, Read, Update, Delete&quot;&gt;CRUD&lt;/abbr&gt; jako przezroczystą automatykę, rewolucję zaczął znany dziś wszystkim silnik &lt;a href=&quot;http://rubyonrails.pl/&quot;&gt;Ruby on Rails&lt;/a&gt;. Cała idea polega na odseparowaniu właściwego kodu aplikacji (model, kontroler) od warstwy najniższego rzędu, odpowiadającej za przechowywanie danych (storage). Ta ostatnia jest obsługiwana automatycznie przez silnik, wystarczy zatem stworzyć odpowiednie tabele w bazie danych i zadeklarować wzajemnie relacje pomiędzy obiektami &amp;mdash; sprowadza się to do dopisania właściwych słów kluczowych do klasy modelu.&lt;/p&gt;

&lt;p&gt;Po krótkim prototypowaniu połączeń, silnik staje się zupełnie przezroczysty. Można wykonywać dowolne operacje na instancjach poszczególnych klas, a każda zmiana zostanie natychmiast odzwierciedlona w zawartości bazy danych. Odpada konieczność pisania zawiłych zapytań &lt;abbr title=&quot;Structured Query Language&quot;&gt;SQL&lt;/abbr&gt;, wzrasta też elastyczność kodu (staje się niezależny od struktury poszczególnych tabel &amp;mdash; po dodaniu nowego pola, nie ma potrzeby modyfikacji kodu odpowiedzialnego za obsługę tabeli).&lt;/p&gt;

&lt;p&gt;Oczywiście, Rails nie jest jedynym frameworkiem tego typu. W jego ślady poszli deweloperzy korzystający z innych języków programowania. Dziś szkielety podobnych lub identycznych rozwiązań dostępne są dla większości z popularnych języków. Najczęściej stosowany w aplikacjach małego i średniego kalibru, &lt;abbr&gt;PHP&lt;/abbr&gt;, ma ich nawet kilka. Szczególnie interesujący jest jednak jeden z pierwszych, dostępny od zeszłego roku &lt;a href=&quot;http://cakephp.org/&quot;&gt;CakePHP&lt;/a&gt; &amp;mdash; tutaj nawet słowa kluczowe (w &lt;abbr&gt;PHP&lt;/abbr&gt; reprezentowane przez zmienne) są żywcem zaczerpnięte z pierwowzoru.&lt;/p&gt;

&lt;p&gt;Kiedy warto stosować &lt;abbr&gt;CRUD&lt;/abbr&gt;? Odpowiedź jest prosta &amp;mdash; kiedy tylko się da. Oczywiście, nikt nie zbuduje w ten sposób wydajnego systemu bankowego, ale większość tworzonych aplikacji to rozwiązania z niższej półki &amp;mdash; aplikacje ekstra-/intranetowe, systemy &lt;abbr title=&quot;Content Management System&quot;&gt;CMS&lt;/abbr&gt; i dynamiczne witryny internetowe. Biorąc pod uwagę, że proces tworzenia oprogramowania ulega kilkunastokrotnemu skróceniu i staje się bardziej odporny na błędy, korzyści są nie do odrzucenia.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/webapp&quot; rel=&quot;tag&quot;&gt;webapp&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/code&quot; rel=&quot;tag&quot;&gt;code&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/crud&quot; rel=&quot;tag&quot;&gt;crud&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/ruby&quot; rel=&quot;tag&quot;&gt;ruby&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/rails&quot; rel=&quot;tag&quot;&gt;rails&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/php&quot; rel=&quot;tag&quot;&gt;php&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/framework&quot; rel=&quot;tag&quot;&gt;framework&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Hemingway Blue</title>
   <link href="http://room-303.com/blog/2006/02/04/hemingway-blue/"/>
   <updated>2006-02-04T19:55:30+00:00</updated>
   <id>http://room-303.com/blog/2006/02/04/hemingway-blue</id>
   <content type="html">&lt;p&gt;Patrząc na &lt;a href=&quot;http://www.golf-olszewka.pl/blog/&quot;&gt;blog da.killi&lt;/a&gt; i czytając &lt;a href=&quot;http://www.andyrutledge.com/google-redux.php&quot;&gt;notkę o alternatywnym intefejsie dla Google&lt;/a&gt;, wpadłem na pomysł przygotowania własnej wersji &lt;a href=&quot;http://warpspire.com/hemingway/hemingway-for-wordpress&quot;&gt;Hemingwaya&lt;/a&gt;. Tak powstał Hemingway Blue, oparty częściowo na wspomnianym projekcie Andiego Rutledge'a:&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/90175672@N00/95431893/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/38/95431893_fa17196fb5.jpg&quot; alt=&quot;Hemingway Blue&quot; height=&quot;375&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hemingway Blue alpha: &lt;a href=&quot;http://wirusy.room-303.com/WordPress/Hemingway%20Blue/&quot;&gt;download&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/wordpress&quot; rel=&quot;tag&quot;&gt;wordpress&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/theme&quot; rel=&quot;tag&quot;&gt;theme&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/hemingway&quot; rel=&quot;tag&quot;&gt;hemingway&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>GNOME Launch Box</title>
   <link href="http://room-303.com/blog/2006/02/03/gnome-launch-box/"/>
   <updated>2006-02-03T20:29:41+00:00</updated>
   <id>http://room-303.com/blog/2006/02/03/gnome-launch-box</id>
   <content type="html">&lt;p&gt;Rasheed dzisiaj &lt;a href=&quot;http://mklimek.org/2006/02/03/katapult&quot;&gt;pisał o Katapult&lt;/a&gt; - klonie macowego Quicksilvera pod KDE. Użytkownicy GNOME nie są w gorszej sytuacji - dla nich rozwijany jest projekt &lt;a href=&quot;http://developer.imendio.com/wiki/GNOME_Launch_Box&quot;&gt;GNOME Launch Box&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/90175672@N00/95039078/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/36/95039078_4d497ff985.jpg&quot; width=&quot;500&quot; height=&quot;375&quot; alt=&quot;GNOME Launch Box&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Idea programu jest prosta - zamiast korzystać z menu, przyciskasz zdefiniowaną wcześniej kombinację klawiszy i zaczynasz pisać. Program w locie dopasowuje dostępne w menu programy, pliki wykonywalne ze ścieżki systemowej, kontakty z klienta poczty i pliki z pulpitu i listy ostatnio używanych. Wybranie któregoś za pomocą strzałek i zatwierdzenie klawiszem &lt;kbd&gt;ENTER&lt;/kbd&gt; powoduje wywołanie domyślnej akcji (podana w okienku po prawej).&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/gnome&quot; rel=&quot;tag&quot;&gt;gnome&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/productivity&quot; rel=&quot;tag&quot;&gt;productivity&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/tools&quot; rel=&quot;tag&quot;&gt;tools&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/quicksilver&quot; rel=&quot;tag&quot;&gt;quicksilver&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Jesteśmy w telewizji</title>
   <link href="http://room-303.com/blog/2006/02/02/jestesmy-w-telewizji/"/>
   <updated>2006-02-02T01:43:01+00:00</updated>
   <id>http://room-303.com/blog/2006/02/02/jestesmy-w-telewizji</id>
   <content type="html">&lt;p&gt;No, prawie. Zapraszam do obejrzenia &lt;a href=&quot;http://www.olo.pl/blog/2006/02/01/videopost-nr-1/&quot;&gt;pierwszego videopostu&lt;/a&gt; opublikowanego przez zespół &lt;a href=&quot;http://www.olo.pl/blog/&quot;&gt;OLO&lt;/a&gt; z Łodzi. W środku &amp;mdash; między innymi &amp;mdash; o &lt;a href=&quot;http://idziemy.net/&quot;&gt;Idziemy.net&lt;/a&gt; i o &lt;a href=&quot;http://10przykazan.com/&quot;&gt;10przykazan.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/web&quot; rel=&quot;tag&quot;&gt;web&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/web2.0&quot; rel=&quot;tag&quot;&gt;web2.0&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/video&quot; rel=&quot;tag&quot;&gt;video&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Microsoft mnie okradł ;)</title>
   <link href="http://room-303.com/blog/2006/02/02/microsoft-mnie-okradl/"/>
   <updated>2006-02-02T01:13:00+00:00</updated>
   <id>http://room-303.com/blog/2006/02/02/microsoft-mnie-okradl</id>
   <content type="html">&lt;p&gt;Premiera nowej wersji Internet Explorera przyniosła niespodziankę. Okazało się bowiem, że pewna firma z Redmond doceniła kunszt mojej favikony i postanowiła użyć jej do oznaczania ulubionych:&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://get.generatedcontent.com/stuff/fun/patrysIE.jpg&quot; alt=&quot;Internet Explorer 7&quot; /&gt;
Coś wam to przypomina? ;)&lt;/p&gt;

&lt;p&gt;Dla ciekawskich, favikonka to część logo MSR crew (dawniej MACROSoft RUSSiA), grupy komputerowej, która powstała w 1996 roku. Do 2001 logo grupy wyglądało tak:&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://patrys.room-303.com/images/icons/msrlogo.gif&quot; alt=&quot;MACROSoft RUSSiA&quot; /&gt;&lt;/p&gt;

&lt;p&gt;W 2001 roku zostało zmienione na bardziej &lt;q&gt;nowoczesne&lt;/q&gt;:&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://patrys.room-303.com/images/icons/msrcrew.png&quot; alt=&quot;MSR crew&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Notka z podziękowaniami dla &lt;a href=&quot;http://nbw.jogger.pl/comment.php?eid=186036&quot;&gt;nbw&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/microsoft&quot; rel=&quot;tag&quot;&gt;microsoft&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/ie7&quot; rel=&quot;tag&quot;&gt;ie7&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/icon&quot; rel=&quot;tag&quot;&gt;icon&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/favourites&quot; rel=&quot;tag&quot;&gt;favourites&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Web2.0, part 3</title>
   <link href="http://room-303.com/blog/2006/01/29/web20-part-3/"/>
   <updated>2006-01-29T17:03:20+00:00</updated>
   <id>http://room-303.com/blog/2006/01/29/web20-part-3</id>
   <content type="html">&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/90175672@N00/92626279/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/39/92626279_714a16ba1b.jpg&quot; width=&quot;500&quot; height=&quot;375&quot; alt=&quot;Web 2.0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/web2.0&quot; rel=&quot;tag&quot;&gt;web2.0&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/standards&quot; rel=&quot;tag&quot;&gt;standards&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/html&quot; rel=&quot;tag&quot;&gt;html&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/xhtml&quot; rel=&quot;tag&quot;&gt;xhtml&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/code&quot; rel=&quot;tag&quot;&gt;code&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/beta&quot; rel=&quot;tag&quot;&gt;beta&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Web2.0, part 2</title>
   <link href="http://room-303.com/blog/2006/01/28/web20-part-2/"/>
   <updated>2006-01-28T16:36:04+00:00</updated>
   <id>http://room-303.com/blog/2006/01/28/web20-part-2</id>
   <content type="html">&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/90175672@N00/92177298/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/25/92177298_39accd3839.jpg&quot; width=&quot;500&quot; height=&quot;375&quot; alt=&quot;Web 2.0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/web2.0&quot; rel=&quot;tag&quot;&gt;web2.0&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/joke&quot; rel=&quot;tag&quot;&gt;joke&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/tag&quot; rel=&quot;tag&quot;&gt;tag&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/tagset&quot; rel=&quot;tag&quot;&gt;tagset&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/tagcloud&quot; rel=&quot;tag&quot;&gt;tagcloud&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Web2.0</title>
   <link href="http://room-303.com/blog/2006/01/28/web20/"/>
   <updated>2006-01-28T11:34:06+00:00</updated>
   <id>http://room-303.com/blog/2006/01/28/web20</id>
   <content type="html">&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/90175672@N00/92101447/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/37/92101447_7e351d2165.jpg&quot; width=&quot;500&quot; height=&quot;375&quot; alt=&quot;Web2.0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/web2.0&quot; rel=&quot;tag&quot;&gt;web2.0&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/joke&quot; rel=&quot;tag&quot;&gt;joke&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/ajax&quot; rel=&quot;tag&quot;&gt;ajax&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>webesteem art &amp; design #15</title>
   <link href="http://room-303.com/blog/2006/01/25/webesteem-art-design-15/"/>
   <updated>2006-01-25T19:49:41+00:00</updated>
   <id>http://room-303.com/blog/2006/01/25/webesteem-art-design-15</id>
   <content type="html">&lt;p&gt;Jeśli ktoś jeszcze nie doczytał &lt;a href=&quot;http://nbw.jogger.pl/comment.php?eid=184086&quot;&gt;u nbw&lt;/a&gt;, to dziś wyszedł nowy, &lt;a href=&quot;http://art.webesteem.pl/15/&quot;&gt;piętnasty numer webesteem art &amp;amp; design magazine&lt;/a&gt;. W środku, jako kontynuacja serii rozpoczętej w numerze czternastym, dział o standardach sieciowych. Można tam przeczytać, między innymi, mój tekst o walidacji kodu. Miłej lektury, czekam też na uwagi.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/web&quot; rel=&quot;tag&quot;&gt;web&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/standards&quot; rel=&quot;tag&quot;&gt;standards&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/design&quot; rel=&quot;tag&quot;&gt;design&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Drżyj, TextMate</title>
   <link href="http://room-303.com/blog/2006/01/25/drzyj-textmate/"/>
   <updated>2006-01-25T19:29:50+00:00</updated>
   <id>http://room-303.com/blog/2006/01/25/drzyj-textmate</id>
   <content type="html">&lt;p&gt;Wtyczka do obsługi rozwijanych makr dla &lt;a href=&quot;http://www.gnome.org/projects/gedit/&quot;&gt;gedita&lt;/a&gt;, o której pisałem niedawno, stała się poważną konkurencją dla &lt;a href=&quot;http://macromates.com/&quot;&gt;TextMate&lt;/a&gt;, potężnego edytora dla platformy OS X. Paolo Maggi przekonwertował większość makr dostępnych w TextMate na format &lt;q&gt;snippetów&lt;/q&gt; gedita. Od teraz można korzystać z gotowej, dość obszernej biblioteki bloków kodu. Do pobrania &lt;a href=&quot;http://live.gnome.org/Gedit_2fSnippetPlugin&quot;&gt;ze strony wtyczki Snippets&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Plik &lt;code&gt;gedit-snippets.xml&lt;/code&gt; należy umieścić w katalogu &lt;code&gt;~/.gnome2/gedit/&lt;/code&gt;. Oczywiście, do pracy wymagana jest rozwojowa wersja 2.13 gedita, która oferuje wsparcie dla wtyczek pisanych w Pythonie.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/gedit&quot; rel=&quot;tag&quot;&gt;gedit&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/plugin&quot; rel=&quot;tag&quot;&gt;plugin&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/textmate&quot; rel=&quot;tag&quot;&gt;textmate&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/productivity&quot; rel=&quot;tag&quot;&gt;productivity&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/macro&quot; rel=&quot;tag&quot;&gt;macro&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Nie buduj oprogramowania od końca</title>
   <link href="http://room-303.com/blog/2006/01/25/nie-buduj-oprogramowania-od-konca/"/>
   <updated>2006-01-25T18:43:04+00:00</updated>
   <id>http://room-303.com/blog/2006/01/25/nie-buduj-oprogramowania-od-konca</id>
   <content type="html">&lt;p&gt;Programiści są leniwi, klienci też — nie chce im się skarżyć na interfejs. Zaczynaj budowanie aplikacji od interfejsu, a nie od warstwy funkcjonalnej. I rób to z głową.&lt;/p&gt;

&lt;p&gt;Przykładem jest system płatności online &lt;a href=&quot;http://www.protx.com/&quot;&gt;Protx&lt;/a&gt;, który podłączamy właśnie do serwisu jednego z klientów. Po przejściu do formularza dokonywania płatności, naszym oczom ukazuje się okienko z napisem &lt;q&gt;credit card number, enter without the spaces.&lt;/q&gt; Jeśli projektant tego systemu wiedział doskonale, że wszystkie numery kart kredytowych posiadają separatory w postaci spacji lub myślników, to czemu kazać je usuwać użytkownikowi, zamiast wyczyścić je po stronie serwisu?&lt;/p&gt;

&lt;p&gt;To wzorcowy przypadek zwalania pracy na użytkownika w sytuacji, w której komputer poradziłby sobie znacznie lepiej. Wpisywanie numeru karty bez separatorów powoduje też, że łatwiej o błąd — cyfry nie są pogrupowane i łatwo przeoczyć pomyłkę.&lt;/p&gt;

&lt;p&gt;Jeśli masz zamiar oczekiwać od użytkownika wprowadzenia jakichś danych, to zrób co w twojej mocy, żeby przyjąć możliwie dużo popularnych formatów. Powyższy przykład jest o tyle idiotyczny, że na samej karcie numer zawiera spacje, a system wymaga wpisania go w zupełnie nietypowym formacie.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/application&quot; rel=&quot;tag&quot;&gt;application&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/interface&quot; rel=&quot;tag&quot;&gt;interface&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/design&quot; rel=&quot;tag&quot;&gt;design&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/input&quot; rel=&quot;tag&quot;&gt;input&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/validation&quot; rel=&quot;tag&quot;&gt;validation&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/usability&quot; rel=&quot;tag&quot;&gt;usability&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>10przykazan.com v2</title>
   <link href="http://room-303.com/blog/2006/01/22/10przykazancom-v2/"/>
   <updated>2006-01-22T23:13:32+00:00</updated>
   <id>http://room-303.com/blog/2006/01/22/10przykazancom-v2</id>
   <content type="html">&lt;p&gt;Z prawdziwą przyjemnością informujemy, że serwis &lt;a href=&quot;http://10przykazan.com/&quot;&gt;10przykazan.com&lt;/a&gt; doczekał się drugiej odsłony.&lt;/p&gt;

&lt;p&gt;Zgodnie z obietnicami, danymi przy opublikowaniu pierwszej wersji, wprowadziliśmy całą masę poprawek i uzupełnień. Trudno właściwie o jakąś listę, gdyż przebudowany został cały system, niemal od podstaw. Dzięki technologii AJAX i tagowaniu, zbliżyliśmy się do modnego hasła &lt;q&gt;Web 2.0&lt;/q&gt;. Niestety, wygląd nie poszedł w kierunku zaokrąglonych rogów i pastelowych kolorów, choć uległ całkowitej modyfikacji.&lt;/p&gt;

&lt;p&gt;Od tego momentu można właściwie zacząć liczyć prawdziwą historię serwisu.&lt;/p&gt;

&lt;p&gt;Lecz poprawiony wygląd, rozbudowany system tagowania i syndykowania wpisów, czy nowododanych blogów to nie koniec niespodzianek. Gdy tylko dobiegnie końca świętowanie, zabieramy się za dalszy rozwój systemu i wprowadzenie usług, które wypchną serwis poza ramy początkowo nakreślone przez &lt;a href=&quot;http://9rules.com/&quot;&gt;9rules&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Nie przedłużając - drodzy blogowicze i blogowiczki, droga blogosfero. Oto &lt;a href=&quot;http://10przykazan.com/&quot;&gt;10przykazan.com, wersja druga&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/10przykazan&quot; rel=&quot;tag&quot;&gt;10przykazan&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/web&quot; rel=&quot;tag&quot;&gt;web&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/blog&quot; rel=&quot;tag&quot;&gt;blog&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/community&quot; rel=&quot;tag&quot;&gt;community&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Poczytaj mi mamo - RSS</title>
   <link href="http://room-303.com/blog/2006/01/22/poczytaj-mi-mamo-rss/"/>
   <updated>2006-01-22T17:17:02+00:00</updated>
   <id>http://room-303.com/blog/2006/01/22/poczytaj-mi-mamo-rss</id>
   <content type="html">&lt;p&gt;Jako programista, stoczyłem ponad miesiąc na polu walki pomiędzy standardami, a wdrożeniami. Chodzi mi oczywiście o technologiczne podłoże &lt;a href=&quot;http://10przykazan.com/&quot;&gt;10przykazan&lt;/a&gt;. Z przykrością stwierdzam, że &lt;em&gt;żaden&lt;/em&gt; z agregowanych przez nas serwisów blogowych nie generuje poprawnego kanału &lt;abbr title=&quot;Really Simple Syndication&quot;&gt;RSS&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;Piszę to w nawiązaniu do analizy polskiej blogosfery, &lt;a href=&quot;http://riddle.jogger.pl/comment.php?eid=183217&quot;&gt;napisanej przez Riddle'a&lt;/a&gt;, a do której &lt;a href=&quot;http://lebkowski.info/arch/2006/01/dokad_idziemy_blogu_moj&quot;&gt;nawiązał też Maciej Łebkowski&lt;/a&gt;. Poziom techniczny naszego kawałka Internetu przypomina bardziej chałupy zbudowane z powiązanych drutem łodyg bambusa, niż domy. Niby wszystko działa, niby wszystko mamy to samo, ale wystarczy zajrzeć pod śliczny papierek z kokardką, żeby okazało się, że pod spodem mamy pęk drutów posklejanych taśmą klejącą.&lt;/p&gt;

&lt;p&gt;Drodzy panowie administratorzy serwisów — kanał &lt;abbr&gt;RSS&lt;/abbr&gt; jest aplikacją &lt;abbr title=&quot;Extensible Markup Language&quot;&gt;XML&lt;/abbr&gt; i wymaga kodowania encji w standardzie &lt;abbr&gt;XML&lt;/abbr&gt;. Tak, oznacza to dokładnie tyle, że ampersand i znak mniejszości powinny być zamienione na ich odpowiedniki (w praktyce, dla czytelności, zamienia się też znaki większości). Nie, kanał &lt;abbr&gt;RSS&lt;/abbr&gt; nie jest dokumentem &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt; i stosowanie w nim encji &lt;abbr&gt;HTML&lt;/abbr&gt; to raczej głupi pomysł — dokument przestaje być poprawny.&lt;/p&gt;

&lt;p&gt;RSS przewiduje dwa formaty podawania dat. Wersja 1.0 i wcześniejsze stosowały kosmiczne kodowanie &lt;abbr title=&quot;World Wide Web Consortium&quot;&gt;W3C&lt;/abbr&gt;, wersja 2.0 podaje czas w standardzie &lt;abbr title=&quot;Request For Comments&quot;&gt;RFC&lt;/abbr&gt; 822. Używanie pierwszego wariantu w &lt;abbr&gt;RSS&lt;/abbr&gt; 2.0 jest błędem.&lt;/p&gt;

&lt;p&gt;Gdyby 10przykazan miało przetwarzać tylko poprawne dokumenty, to musiałbym usunąć z serwisu wszystkie blogi, które nie są oparte o &lt;a href=&quot;http://wordpress.org/&quot;&gt;WordPressa&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/wordpress&quot; rel=&quot;tag&quot;&gt;wordpress&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/rss&quot; rel=&quot;tag&quot;&gt;rss&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/blog&quot; rel=&quot;tag&quot;&gt;blog&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/xml&quot; rel=&quot;tag&quot;&gt;xml&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Pisząc treść dla Sieci</title>
   <link href="http://room-303.com/blog/2006/01/17/piszac-tresc-dla-sieci/"/>
   <updated>2006-01-17T23:04:03+00:00</updated>
   <id>http://room-303.com/blog/2006/01/17/piszac-tresc-dla-sieci</id>
   <content type="html">&lt;p&gt;Czasy nam nastały piękne, stronę internetową ma prawie każdy, niektórzy po kilka nawet. Nierzadko zdarza się, że własne strony mają też komputery, czy zwierzęta. Domena kosztuje tyle, co nic, a chęć zaistnienia w sieci kusi prostotą publikacji. Większość stron nie nadaje się do oglądania, bynajmniej nie ze względu na wygląd.&lt;/p&gt;

&lt;p&gt;Problem dotyczy tak samo blogów, stron domowych, jak i komercyjnych serwisów, nastawionych na zarabianie pieniędzy. Właściciele stron zwracają uwagę głównie na ich wygląd — w przeciwieństwie do odwiedzających, którzy szukają głównie informacji — treści. Rzadko kiedy zdarza się, żeby ktoś trafił na stronę z nudów i pragnął poświęcić cały wieczór na zapoznanie się z jej pełną zawartością.&lt;/p&gt;

&lt;p&gt;Najczęściej internauci trafiają do nas za pomocą wyszukiwarek bądź odnośników z innych serwisów. Szukają konkretnych danych — kliknęli odnośnik, który wydawał im się najodpowiedniejszy i który obiecywał treść najbliższą poszukiwanej. Pomińmy kwestię nawigacji, choć gra ona tutaj jedną z najbardziej kluczowych ról, skupmy się na zawartości strony.&lt;/p&gt;

&lt;h4&gt;Sieć to nie tylko design&lt;/h4&gt;

&lt;p&gt;W latach dziewięćdziesiątych możliwości prezentacyjne sieci &lt;abbr title=&quot;World Wide Web&quot;&gt;WWW&lt;/abbr&gt; były na tyle małe, że to hipertekst był podstawą funkcjonowania Internetu. Później rozwinęła się strona medialna i dominować zaczęły strony o przeroście warstwy prezentacyjnej. Obecnie pojawiła się moda na serwisy &lt;q&gt;semantyczne&lt;/q&gt; i związane z tym nierozłącznie żółte guziczki, dumnie zapraszające do skorzystania z walidatora. Jakkolwiek głupio by nie wyglądały na stronie producenta ogórków konserwowych, to one otrzymują najwięcej miłości i stały się oczkiem w głowie prowadzących serwisy.&lt;/p&gt;

&lt;p&gt;Treść jest systematycznie spychana z piedestału i prowadzi do stopniowej degradacji sieci jako źródła informacji na każdy temat. Przekłada się to też na coraz mniejszą skuteczność marketingu — duże, graficzne bannery krzyczą &lt;q&gt;wejdź, rozwiążemy Twoje problemy,&lt;/q&gt; jednak po ich kliknięciu ukazuje nam się kilka nieskładnych zdań, niezdarnie zlepionych z marketingowej papki. Często łatwo dowiedzieć się, że produkt jest &lt;q&gt;pionierskim rozwiązaniem,&lt;/q&gt; że &lt;q&gt;wiedzie prym na rynku,&lt;/q&gt; nie wiadomo tylko do końca, do czego służy.&lt;/p&gt;

&lt;p&gt;&lt;q&gt;Content,&lt;/q&gt; czy &lt;q&gt;copy,&lt;/q&gt; jak z angielska przyjęło się nazywać teksty składające się na serwis, to główna, a często jedyna część serwisu, która interesuje odwiedzającego. Jeśli nie będzie w stanie jej zrozumieć, albo zaśnie z nudów już przy drugim akapicie, nie kupi produktu, nie doda strony do ulubionych, nie zarobisz. Właśnie straciłeś kolejnego klienta bądź czytelnika, odniosłeś marketingową porażkę, jakkolwiek rewelacyjnie hasła reklamowe nie wyglądały na papierze.&lt;/p&gt;

&lt;h4&gt;Jak pisać?&lt;/h4&gt;

&lt;p&gt;Badania prowadzone przez &lt;a href=&quot;http://www.nngroup.com/&quot;&gt;Grupę Nielsena-Normana&lt;/a&gt; pokazują, że poszukujący treści internauta spędza na stronie przeciętnie od kilku do kilkunastu sekund. Jeśli treść wyda mu się nieprzystępna, jeśli nie zainteresuje go zaledwie parę pierwszych zdań, kliknie &lt;q&gt;wstecz&lt;/q&gt; i poszuka sobie ciekawszej lektury.&lt;/p&gt;

&lt;p&gt;Najlepiej w przypadku publikacji elektronicznych sprawdza się zasada odwróconej piramidy. Zacznij od najważniejszego. Tak, jak &lt;a href=&quot;http://mmazur.jogger.pl/comment.php?eid=176650&quot;&gt;pisał mmazur&lt;/a&gt;, najłatwiej przykuć uwagę czytelnika, podając mu najciekawsze rzeczy na początku. Później możesz wdać się w szczegóły, dowodzić słuszności, czy dodać, że to unikalne na rynku rozwiązanie. Jeśli czytam oświadczenie prywatności serwisu, to interesuje mnie głównie, czy mój adres email na drugi dzień obiegnie pół świata, daruj sobie zaczynanie słowami, że &lt;q&gt;ludzkość już od wieków boryka się z problemem.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Dużo łatwiej od zbitych bloków tekstu czyta się też tekst logicznie sformatowany w krótkie akapity. W przypadku długich tekstów dobrze też co kilka akapitów wstawić tytuł sekcji, sugerujący jakiej treści można się spodziewać poniżej. Niewiele osób czyta teksty na komercyjnych stronach od deski do deski, najczęściej interesują ich konkretne informacje.&lt;/p&gt;

&lt;h4&gt;Diabeł tkwi w szczegółach&lt;/h4&gt;

&lt;p&gt;Często chodzi o szczegóły, pozwalające porównać produkt z ofertą konkurencji. Jeśli nie dostarczysz niezbędnych danych, może się okazać, że odpadniesz w przedbiegach. Dlatego dobrze jest przeprowadzić wywiad, jakiego typu informacje o produktach oferują sieciowi &lt;q&gt;sąsiedzi.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Równie ważny jest dobór słownictwa — dostosowany do oczekiwanej grupy odbiorców. Niemożliwość zrozumienia treści prowadzi do szybkiej frustracji, a ta w konsekwencji zbliża niebezpiecznie kursor myszy do wspomnianego przycisku przeglądarki. Marketing jest ważny, ale jego nadmiar grozi rozmyciem przekazu i utrudnia odbiór treści. Co gorsza, ludzie coraz częściej są przeczuleni na punkcie reklamy podawanej wprost. Traktują ją jak coś niepożądanego i unikają, nauczeni doświadczeniem, że nie niesie ona żadnej wartościowej treści.&lt;/p&gt;

&lt;h4&gt;Wojna i pokój&lt;/h4&gt;

&lt;p&gt;Odstraszająco może działać też objętość serwowanego tekstu. Tekst zbyt lakoniczny jest tak samo zły jak naukowe opracowanie w miejscu, gdzie spodziewaliśmy się kilku zaledwie zdań. Pisząc rozwlekłe &lt;q&gt;polityki&lt;/q&gt; i &lt;q&gt;oświadczenia,&lt;/q&gt; szanuj czas czytelnika. Treść serwisu komercyjnego nie jest sztuką samą w sobie, powinna pełnić rolę czysto użytkową i powinna służyć przede wszystkim czytającemu. Dużo przyjemniej jest wejść na serwis, który w kilku zaledwie punktach streszcza zasady ochrony prywatności swoich klientów, podając co najwyżej odnośnik do dodatkowych informacji o podstawach prawnych. Mnie paragrafy nie interesują, liczą się intencje prowadzącego serwis.&lt;/p&gt;

&lt;h4&gt;Na mocy paragafu czwartego, ustęp piąty...&lt;/h4&gt;

&lt;p&gt;Tutaj warto przypomnieć, że internauci są ludźmi. Takimi samymi, jak klienci pobliskiego warzywniaka. Tych ostatnich nie obsługuje bezduszna maszyna, więc i Ty powinieneś zadbać o to, żeby klienci nie czuli się jak na rozprawie rozwodowej. Spraw, by treść sprawiała wrażenie napisanej przez człowieka, a nie prawnika (bez urazy dla prawników, a zwłaszcza prawniczek). Traktuj ludzi jak &lt;q&gt;ja, wasz sprzedawca,&lt;/q&gt; a nie &lt;q&gt;my, Borg, zostaniesz zasymilowany.&lt;/q&gt;&lt;/p&gt;

&lt;h4&gt;Podsumowując&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Nie lekceważ treści, to najsilniejszy punkt twojego serwisu&lt;/li&gt;
&lt;li&gt;Staraj się podać najbardziej interesujące informacje na początku&lt;/li&gt;
&lt;li&gt;Pamiętaj o informacjach, które pomogą porównać oferowane towary i usługi&lt;/li&gt;
&lt;li&gt;Staraj się pisać zwięźle i w przystępny sposób&lt;/li&gt;
&lt;li&gt;Pamiętaj o tym, aby oferowane informacje były zawsze aktualne&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Czemu o tym wszystkim piszę? Zbudowałem w życiu ponad setkę serwisów internetowych, głównie komercyjnych, i do dziś zdarza mi się wprowadzać poprawki u dawnych klientów, gdzie na powitanie straszy mnie wprowadzone rok wcześniej, dla testów, &lt;q&gt;Lorem ipsum.&lt;/q&gt; Ludzie nie dbają o treść, często zapytani tłumaczą się, że nie potrafią pisać. Może już czas zastanowić się nad zleceniem pracy jakiemuś copywriterowi? Na zachodzie sporo firm posiada taki etat w ramach działu marketingu lub &lt;abbr title=&quot;Public Relations&quot;&gt;PR&lt;/abbr&gt;, czemu my zostajemy w tyle? Jeśli wydałeś kilka tysięcy złotych na serwis, to nie marnuj tej inwestycji.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/web&quot; rel=&quot;tag&quot;&gt;web&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/copy&quot; rel=&quot;tag&quot;&gt;copy&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/content&quot; rel=&quot;tag&quot;&gt;content&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Śliniąc się do ekranu</title>
   <link href="http://room-303.com/blog/2006/01/15/sliniac-sie-do-ekranu/"/>
   <updated>2006-01-15T21:11:18+00:00</updated>
   <id>http://room-303.com/blog/2006/01/15/sliniac-sie-do-ekranu</id>
   <content type="html">&lt;p&gt;Jestem wielkim fanem Mac OS X i produktów &lt;a href=&quot;http://www.apple.com/&quot;&gt;Apple&lt;/a&gt;. Kiedy tylko pojawiła się informacja o &lt;a href=&quot;http://www.apple.com/macbookpro/&quot;&gt;MacBooku Pro&lt;/a&gt;, kolejny raz obejrzałem z żalem w oczach stan swojego konta. Dziś przypadkiem trafiłem na &lt;a href=&quot;http://theory.isthereason.com/?p=650&quot;&gt;ten film z prezentacji&lt;/a&gt; i zaczynam się zastanawiać, kiedy w końcu uda mi się uzbierać pieniądze na takie cudo.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/apple&quot; rel=&quot;tag&quot;&gt;apple&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/macbook&quot; rel=&quot;tag&quot;&gt;macbook&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Accesskey to nie dostępność</title>
   <link href="http://room-303.com/blog/2006/01/14/accesskey-to-nie-dostepnosc/"/>
   <updated>2006-01-14T15:23:26+00:00</updated>
   <id>http://room-303.com/blog/2006/01/14/accesskey-to-nie-dostepnosc</id>
   <content type="html">&lt;p&gt;Początkowo był to komentarz do &lt;a href=&quot;http://riddle.jogger.pl/comment.php?eid=181188&quot;&gt;postu Riddle'a&lt;/a&gt;, który z kolei był odpowiedzią na słuszne &lt;a href=&quot;http://www.elsindel.wroc.pl/blog/2006/01/irytujca-dostpno&quot;&gt;spostrzeżenia Elsindela&lt;/a&gt;. Sprawa dotyczy atrybutu &lt;code&gt;accesskey&lt;/code&gt; i problemów z jego stosowaniem. Więcej można na ten temat przeczytać w &lt;a href=&quot;http://wats.ca/articles/accesskeyconflicts/37&quot;&gt;artykule Dereka Featherstone 'a&lt;/a&gt;, przejdę jednak do samego komentarza, który został przez cenzurę usunięty.&lt;/p&gt;

&lt;p&gt;Czy jest jedna osoba, która pokaże mi przykład &amp;mdash; z życia wzięty &amp;mdash; gdzie na witrynie (&lt;em&gt;nie&lt;/em&gt; aplikacji) internetowej przydają się klawisze dostępu? Niedowidzący i niewidomi raczej z nich nie korzystają. Ba, nawet rzadko posługują się klawiaturą na tyle biegle, żeby to faktycznie coś przyspieszyło (większość operuje podstawowymi klawiszami typu &lt;q&gt;następny link,&lt;/q&gt; &lt;q&gt;następny nagłówek,&lt;/q&gt; &lt;q&gt;przejdź&lt;/q&gt; i nie ma wyrobionych odruchów wciskania X + Y + Z w celu przejścia do innej strony).&lt;/p&gt;

&lt;p&gt;Pomijam fakt, że przytoczone przez Riddle'a przykładowe skróty &lt;q&gt;cyferkowe&lt;/q&gt; są zupełnie bzdurne &amp;mdash; otóż wchodzę sobie pooglądać jakiś sklep internetowy &amp;mdash; na jaką cholerę mi błyskawiczny dostęp do kontaktu, czy oświadczenia o dostępności?&lt;/p&gt;

&lt;p&gt;Pomijam fakt, że accesskey z dostępnością nie ma nic wspólnego - to raczej ułatwienie dla zdrowych i używających pecetów (mój przykład z Elsinterakcji - jak wcisnąć &lt;kbd&gt;Alt&lt;/kbd&gt;+&lt;kbd&gt;B&lt;/kbd&gt; na moim telefonie komórkowym?) w trybie graficznym (w trybie tekstowym tym bardziej nie powinieneś zabierać mi moich klawiszy i skrótów - tam są potrzebne najbardziej).&lt;/p&gt;

&lt;p&gt;Co do Linuksa i skrótów - a odczep się Pan, Panie Riddle, od moich skrótów. Gdybym chciał, to mógłbym sobie nawet pod &lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;V&lt;/kbd&gt; podpiąć skaczącą różową żabkę, a pod &lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;C&lt;/kbd&gt; piosenkę Mandaryny. To mój komputer, a ty mi go celowo psujesz. To ma być usability? &lt;em&gt;Ty&lt;/em&gt; wiesz lepiej, czego &lt;em&gt;ja&lt;/em&gt; potrzebuję?&lt;/p&gt;

&lt;p&gt;Co zaś się tyczy dostępności samej - Riddle myli semantyczną składnię (jak podwójny nagłówek) z gadżetami (jak accesskey). Co gorsza, W3C promuje teraz równie poroniony standard - ROLE + ACCESS. Dalej uparcie twierdzę, że to przeglądarka powinna określać, do jakiego klawisza przyporządkować jaki adres, a ja powinienem mieć możliwośc ich wyłączenia lub redefinicji. Do takich zabaw jest atrybut relacji i element odnośnika umieszczany w nagłówku strony.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Źle Idziemy, nie tędy droga</title>
   <link href="http://room-303.com/blog/2006/01/13/zle-idziemy-nie-tedy-droga/"/>
   <updated>2006-01-13T20:28:40+00:00</updated>
   <id>http://room-303.com/blog/2006/01/13/zle-idziemy-nie-tedy-droga</id>
   <content type="html">&lt;p&gt;Istnieje masa sposobów, na jakie można wypromować swój serwis internetowy. W przypadku serwisów &lt;q&gt;społecznych,&lt;/q&gt; najprostsza metoda to marketing wirusowy. Nowy startup, &lt;a href=&quot;http://idziemy.net/&quot; rel=&quot;nofollow&quot;&gt;idziemy.net&lt;/a&gt; wybrał spam.&lt;/p&gt;

&lt;p&gt;Dziś &amp;mdash; nad ranem &amp;mdash; kilka tysięcy osób otrzymało email taki, jak przedstawiony poniżej:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;From: &quot;Idziemy.net&quot; &amp;lt;kontakt@idziemy.net&amp;gt;
To: &amp;lt;patrys@pld-linux.org&amp;gt;
Date: Fri, 13 Jan 06 03:30:38 +0100&lt;/pre&gt;

&lt;p&gt;Heja,&lt;/p&gt;

&lt;p&gt;Nowy serwis Idziemy.net sluzy do umawiania sie przez internet. Kazdy moze dodac ogloszenie, jezeli ma fajny pomysl na spedzenie czasu i odwage poznac nowych ludzi... Koniec siedzenia w domu! :)&lt;/p&gt;

&lt;p&gt;Zapraszamy: http://www.idziemy.net/&lt;/p&gt;

&lt;pre&gt;-- 
Pozdrawiamy,
Zespol Idziemy.net
mailto:kontakt@idziemy.net&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Odpisałem, w swoim zwykłym stylu, wspominając o karalności rozsyłania masowej niezamówionej korespondencji. Załoga serwisu odpowiedziała, podobno na kilka tysięcy wysłanych maili (dokładnej liczby nie podano), tylko ja jeden &lt;q&gt;planuję wsadzić ich do więzienia.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Smutne to, bo serwis nie zajmuje się sprzedażą encyklopedii ani nie reklamuje rewelacyjnych pastylek, po których nawet zegarek staje. Całość wygląda całkiem sensownie i ma przed sobą przyszłość. Cieżko mi jednak zaufać komuś, kto do informowania o swoim wspaniałym przedsięwzięciu wykorzystuje niezgodne z prawem środki (a takim jest choćby mail harvesting, do którego przyznał się prowadzący serwis w mailu zwrotnym do mnie).&lt;/p&gt;

&lt;p&gt;Cóż, może taki los polskich serwisów w domenie &lt;q&gt;net,&lt;/q&gt; że musi być coś z nimi nie tak (tak, to subtelna aluzja do Grona). A może to taka metoda zachęcająca ceniących sobie prywatność? &lt;q&gt;Załóż konto, twój email i tak już mamy.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/spam&quot; rel=&quot;tag&quot;&gt;spam&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/web&quot; rel=&quot;tag&quot;&gt;web&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/startup&quot; rel=&quot;tag&quot;&gt;startup&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/promotion&quot; rel=&quot;tag&quot;&gt;promotion&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/marketing&quot; rel=&quot;tag&quot;&gt;marketing&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>            WordPress Tiger</title>
   <link href="http://room-303.com/blog/2006/01/10/wordpress-tiger/"/>
   <updated>2006-01-10T12:06:29+00:00</updated>
   <id>http://room-303.com/blog/2006/01/10/wordpress-tiger</id>
   <content type="html">&lt;p&gt;Dla tych, których (podobnie jak mnie) przed przesiadką na &lt;a href=&quot;http://wordpress.org/&quot;&gt;WordPress 2.0&lt;/a&gt; powstrzymywał brak wsparcia dla wtyczki WP Tiger Administration mam dobrą wiadomość. Od ponad tygodnia dostępna jest &lt;a href=&quot;http://orderedlist.com/wordpress-plugins/wp-tiger-administration/&quot;&gt;wersja &lt;del&gt;1.3&lt;/del&gt; &lt;ins&gt;2.0&lt;/ins&gt; Tigera&lt;/a&gt;, która współpracuje z nowym wcieleniem WordPressa.&lt;/p&gt;

&lt;p&gt;Przesiadka w planach na najbliższe dni, jak tylko znajdę dość czasu, żeby wprowadzić wszystkie planowane zmiany w serwisie &lt;a href=&quot;http://10przykazan.com/&quot;&gt;10przykazan&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a rel=&quot;tag&quot; href=&quot;http://technorati.com/tag/wordpress&quot;&gt;wordpress&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>DreamHost oszalał!</title>
   <link href="http://room-303.com/blog/2006/01/05/dreamhost-oszalal/"/>
   <updated>2006-01-05T19:50:10+00:00</updated>
   <id>http://room-303.com/blog/2006/01/05/dreamhost-oszalal</id>
   <content type="html">&lt;p&gt;Dziś w nocy został rozesłany do klientów kolejny newsletter &lt;a href=&quot;http://www.dreamhost.com/&quot;&gt;DreamHosta&lt;/a&gt;. W trosce o swoich klientów, kolejny raz sprawili nam niespodziankę. Miejsce dyskowe zwiększono czterokrotnie, a limity transferu aż ośmiokrotnie!&lt;/p&gt;

&lt;p&gt;Co więcej, do odwołania, nowy plan obowiązuje też nowych klientów. Jeśli więc szukasz świetnego hosta, to właśnie znalazłeś idealnego. Nie czekaj, najtańszy plan daje już 20 &lt;abbr&gt;GB&lt;/abbr&gt; miejsca dyskowego i 1 &lt;abbr&gt;TB&lt;/abbr&gt; miesięcznego transferu. Limity te rosną co tydzień odpowiednio o 160 &lt;abbr&gt;MB&lt;/abbr&gt; i 8 &lt;abbr&gt;GB&lt;/abbr&gt;. Dodatkowo, otrzymujesz do dyspozycji dowolnie dużo baz MySQL, nieograniczoną liczbę domen i subdomen, a także możliwość swobodnego zarządzania rekordami &lt;abbr&gt;DNS&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;A teraz zapraszam do &lt;a href=&quot;http://www.dreamhost.com/r.cgi?126653&quot;&gt;rejestracji&lt;/a&gt; (jeśli użyjesz tego odnośnika, albo wpiszesz &lt;em&gt;patrys@pld-linux.org&lt;/em&gt; w pole &lt;q&gt;referrer,&lt;/q&gt; wesprzesz hosting projektu &lt;a href=&quot;http://generatedcontent.com/&quot;&gt;GeneratedContent&lt;/a&gt; i prowadzone przez nas serwisy).&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/hosting&quot; rel=&quot;tag&quot;&gt;hosting&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/web&quot; rel=&quot;tag&quot;&gt;web&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/dreamhost&quot; rel=&quot;tag&quot;&gt;dreamhost&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>
            10przykazan poprawione</title>
   <link href="http://room-303.com/blog/2006/01/05/10przykazan-poprawione/"/>
   <updated>2006-01-05T19:17:49+00:00</updated>
   <id>http://room-303.com/blog/2006/01/05/10przykazan-poprawione</id>
   <content type="html">&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;        &amp;lt;p&amp;gt;Od tej chwili nie będą pojawiać się powiadomienia o notkach w przypadku ich edycji. Przepraszamy wszystkich za kłopot w imieniu ekipy i dziękujemy za cierpliwość i wyrozumiałość. Wiem, że dużo osób na to czekało.&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/10przykazan&quot; rel=&quot;tag&quot;&gt;10przykazan&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/blog&quot; rel=&quot;tag&quot;&gt;blog&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/web&quot; rel=&quot;tag&quot;&gt;web&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Gedit + Nautilus</title>
   <link href="http://room-303.com/blog/2006/01/05/gedit-nautilus/"/>
   <updated>2006-01-05T17:20:50+00:00</updated>
   <id>http://room-303.com/blog/2006/01/05/gedit-nautilus</id>
   <content type="html">&lt;p&gt;Poprzednio pisałem, jak &lt;a href=&quot;http://www.room-303.com/blog/2006/01/04/gedit-snippets/&quot;&gt;dodać do gedita funkcjonalność &lt;q&gt;snippetów&lt;/q&gt;&lt;/a&gt; i rozbudować jego działanie o znane z TextMate makra. Dziś dodałem do niego panel do wygodnego otwierania plików.&lt;/p&gt;

&lt;p&gt;Jako wielki fan &lt;a href=&quot;http://quanta.kdewebdev.org/&quot;&gt;Quanty+&lt;/a&gt;, marzyłem od dawna o wygodnym panelu, umożliwiającym w gedicie pracę z całymi projektami, a nie z pojedynczymi plikami. gedit jest idealnym edytorem do języków skryptowych i ma wygodne podświetlanie składni. Kod &lt;abbr&gt;HTML&lt;/abbr&gt; piszę z palca, więc na nic nie przydają mi się całe paski narzędziowe, oferowane przez &lt;a href=&quot;http://screem.org/&quot;&gt;Screema&lt;/a&gt;, &lt;a href=&quot;http://bluefish.openoffice.nl/&quot;&gt;Bluefisha&lt;/a&gt; i Quantę. Lekkośc gedita jest jego zaletą. Jedynej niezbędnej funkcji — widoku struktury projektu — w samym gedicie nie ma. Dlaczego jej zatem nie zasymulować?&lt;/p&gt;

&lt;p&gt;Instrukcja obsługi jest dość prosta:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;otwieramy okno gedita&lt;/li&gt;
&lt;li&gt;otwieramy okno Nautilusa&lt;/li&gt;
&lt;li&gt;przechodzimy w Nautilusie do katalogu z projektem&lt;/li&gt;
&lt;li&gt;przełączamy widok Nautilusa na listę (&lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;2&lt;/kbd&gt;)&lt;/li&gt;
&lt;li&gt;zmniejszamy okno Nautilusa i umieszczamy obok gedita&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Efekt końcowy wygląda tak:&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/90175672@N00/82570335/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/38/82570335_fe9f781906.jpg&quot; alt=&quot;Making gedit work like TextMate&quot; height=&quot;375&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pliki można w wygodny sposób otwierać przez przeciągnięcie z widoku drzewka do okna edytora. Po zakończeniu pracy z plikiem, wystarczy wcisnąć &lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;W&lt;/kbd&gt;, aby zamknąć zakładkę i kontynuować pracę. Działa także ze zdalnymi plikami, jedyny problem dotyczy &lt;abbr&gt;FTP&lt;/abbr&gt; — stosowny &lt;a href=&quot;http://bugzilla.gnome.org/show_bug.cgi?id=110191&quot;&gt;bug czeka na rozwiązanie&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Miłej pracy.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/linux&quot; rel=&quot;tag&quot;&gt;linux&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/gedit&quot; rel=&quot;tag&quot;&gt;gedit&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/nautilus&quot; rel=&quot;tag&quot;&gt;nautilus&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/textmate&quot; rel=&quot;tag&quot;&gt;textmate&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/productivity&quot; rel=&quot;tag&quot;&gt;productivity&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/gnome&quot; rel=&quot;tag&quot;&gt;gnome&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Gedit + Snippets</title>
   <link href="http://room-303.com/blog/2006/01/04/gedit-snippets/"/>
   <updated>2006-01-04T22:16:17+00:00</updated>
   <id>http://room-303.com/blog/2006/01/04/gedit-snippets</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://live.gnome.org/Gedit&quot;&gt;gedit&lt;/a&gt; to podstawowy edytor tekstowy środowiska &lt;a href=&quot;http://gnome.org/&quot;&gt;Gnome&lt;/a&gt;. W swojej nowej (2.13, rozwojowej) odsłonie nauczył się paru sztuczek, między innymi wspiera wtyczki napisane w Pythonie.&lt;/p&gt;

&lt;p&gt;Zainteresowała mnie szczególnie jedna z dostępnych dla niego wtyczek — &lt;a href=&quot;http://live.gnome.org/Gedit_2fSnippetPlugin&quot;&gt;Snippets&lt;/a&gt;. Co w niej takiego szczególnego? Ano to, że realizuje jedną z funkcji, którą zachwycają się użytkownicy &lt;a href=&quot;http://macromates.com/&quot;&gt;TextMate&lt;/a&gt; — pozwala na zdefiniowanie dowolnych szablonów kodu, które rozwijają się automatycznie po wpisaniu słowa kluczowego i wciśnięciu tabulatora. Mało tego, szablony mają zdefiniowane miejsca do uzupełnienia i kolejne przyciśnięcia tego klawisza przeskakują grzecznie do wszystkich miejsc wartych naszej uwagi.&lt;/p&gt;

&lt;p&gt;W praktyce wygląda to tak (animowany &lt;abbr&gt;GIF&lt;/abbr&gt;):&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://static.flickr.com/38/82213522_579a587fef_o.gif&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/38/82213522_579a587fef_m.jpg&quot; alt=&quot;Gedit Snippet Plugin&quot; height=&quot;192&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/linux&quot; rel=&quot;tag&quot;&gt;linux&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/gnome&quot; rel=&quot;tag&quot;&gt;gnome&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/gedit&quot; rel=&quot;tag&quot;&gt;gedit&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/textmate&quot; rel=&quot;tag&quot;&gt;textmate&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Web 5.0</title>
   <link href="http://room-303.com/blog/2005/12/29/web-50/"/>
   <updated>2005-12-29T20:07:22+00:00</updated>
   <id>http://room-303.com/blog/2005/12/29/web-50</id>
   <content type="html">&lt;p&gt;Gdzie się nie spojrzy, straszy marketingowa paplanina. W sieci również, ostatnio straszy nawet bardziej, odkąd pojawił się absolutny hit: &lt;q&gt;Web 2.0&lt;/q&gt;. Nikt nie ma pojęcia, co to takiego jest, ale pojawiają się na ten temat setki głosów. Czym jest &lt;q&gt;Web 2.0&lt;/q&gt;?&lt;/p&gt;

&lt;p&gt;Nazwa sugerowałaby, że to druga generacja sieci &lt;abbr title=&quot;World Wide Web&quot;&gt;WWW&lt;/abbr&gt;. Błąd, sieć z całą pewnością jest już znacznie dalej. Jeśli przyjąć, że pierwszą generacją były pierwsze klienty hipertekstu, tekstowe i obsługiwane z poziomu terminala, drugą generacją będzie era Mosaic, pierwszej szeroko stosowanej graficznej przeglądarki. Trzecia era przypada więc na okreś świetności Netscape, za czwartą wypada przyjąć zatem czas niepodzielnej dominacji Internet Explorera. Wobec tego czas obecny jest piątym etapem w życiu sieci — czasem dywersyfikacji rynku i szerokiej standaryzacji. Czasem lepszej sieci, ale nie ma to nic wspólnego z wyznawcami &lt;q&gt;Web 2.0.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Można przyjąć, że to druga generacja sieciowego marketingu, ale i to nie ma wiele wspólnego z prawdą — druga generacja przypada z całą pewnością na dotcomowy boom z drugiej połowy lat dziewięćdziesiątych, kiedy to rozwój technologiczny połączony z masowym marketingiem przynosił przez krótki czas niewyobrażalne niemal fortuny. Wiemy wszyscy, jak skończyły dotcomy, więc dziś z pewnością nie znajdujemy się na tym etapie.&lt;/p&gt;

&lt;p&gt;&lt;q&gt;Web 2.0&lt;/q&gt; to nieudolna próba nazwania bardzo subtelnych zmian w spodobie budowania sieci. Nie da się ich wymienić i nie da się sprawdzić, czy &lt;q&gt;coś jest 2.0,&lt;/q&gt; dlatego cały ruch nie ma dla mnie większego sensu. Nie znaczy to, że jestem przeciwny jego idei — wręcz przeciwnie, jak najbardziej popieram nastawienie serwisów na użytkownika (a nie na &lt;em&gt;klienta&lt;/em&gt;), prospołeczne modelowanie aplikacji (choćby zastąpienie sztywnych kategorii przez swobodnie nadawane tagi), tworzenie małych narzędzi, które dobrze robią jedną rzecz (jak &lt;a href=&quot;http://google.com/&quot;&gt;Google&lt;/a&gt;) i dużą otwartość w kontaktach ze społecznością sieci (jak choćby blogi firmowe z możliwością swobodnego komentowania). Cieszy również rozwój aplikacji typowo społecznych — serwisów opartych na idei &lt;q&gt;six degrees,&lt;/q&gt; jak choćby &lt;a href=&quot;http://linkedin.com/&quot;&gt;LinkedIn&lt;/a&gt;, czy nasz rodzimy &lt;a href=&quot;http://spinacz.pl/&quot;&gt;Spinacz&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Problem polega na tym, że &lt;q&gt;Web 2.0&lt;/q&gt; stworzyło hype, a ten rządzi się swoimi prawami. Informacje przekazywane na zasadzie głuchego telefonu szybko ulegają zniekształceniu, a nie ma gdzie zasięgnąć konkretnych informacji. Dlatego — w powszechnym mniemaniu — &lt;q&gt;Web 2.0&lt;/q&gt; to okrągłe rogi, pastelowe kolory i duże fonty na tle w skośne paski. Ludzie, zamiast filozofię działania, zapamiętali wygląd serwisów, które zapoczątkowały te zmiany. Tak właśnie umarła okazja na pozytywne zmiany, dziś to tylko powód do śmiechu.&lt;/p&gt;

&lt;p&gt;Z ciekawostek — hype można śledzić teraz także po polsku za sprawą prowadzonego przez wrocławską agencję interaktywną &lt;a href=&quot;http://www.janmedia.pl/&quot;&gt;Janmedia&lt;/a&gt; blogu &lt;a href=&quot;http://web20.pl/&quot;&gt;Web 2.0&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tag/web&quot; rel=&quot;tag&quot;&gt;web&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/tag/web2.0&quot; rel=&quot;tag&quot;&gt;web2.0&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Gnickr!</title>
   <link href="http://room-303.com/blog/2005/12/27/gnickr/"/>
   <updated>2005-12-27T23:56:42+00:00</updated>
   <id>http://room-303.com/blog/2005/12/27/gnickr</id>
   <content type="html">&lt;p&gt;Od dłuższego czasu szukałem wygodnego narzędzia pod Gnome do zarządzania obrazkami na &lt;a href=&quot;http://www.flickr.com/&quot;&gt;Flickr!&lt;/a&gt;. Zupełnie nieoczekiwanie, &lt;a href=&quot;http://golf-olszewka.pl/blog/&quot;&gt;da.killa&lt;/a&gt; podrzucił mi wczoraj link do &lt;a href=&quot;http://gnickr.sourceforge.net/&quot;&gt;Gnickr!&lt;/a&gt; - klienta, który zamiast własnego interfejsu oferuje integrację z systemem plików Gnome.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/90175672@N00/77822285/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://static.flickr.com/38/77822285_194fc6edd8.jpg&quot; alt=&quot;gnickr!&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Program jest dość świeży i doczekał się dopiero wersji 0.0.2, ale już oferuje sporo możliwości - wyświetla zestawy zdjęć jako katalogi, pokazuje miniaturki obrazków i pozwala zarządzać nimi tak, jak zwykłymi plikami - możemy je więc wycinać, kopiować i przeciągać na serwer i z powrotem.&lt;/p&gt;

&lt;p&gt;Użytkowników &lt;abbr title=&quot;PLD Linux Distribution&quot;&gt;PLD&lt;/abbr&gt; ucieszy zapewne fakt, że &lt;a href=&quot;http://cvs.pld-linux.org/cgi-bin/cvsweb/SPECS/gnickr.spec&quot;&gt;stosowny plik &lt;code&gt;spec&lt;/code&gt;&lt;/a&gt; jest już gotowy w repozytorium &lt;abbr title=&quot;Concurrent Versioning System&quot;&gt;CVS&lt;/abbr&gt; i można go sobie zbudować (uwaga - wymaga &lt;code&gt;python-gnome&lt;/code&gt; w wersji 2.12.3 lub nowszej).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>del.icio.us</title>
   <link href="http://room-303.com/blog/2005/12/26/delicious/"/>
   <updated>2005-12-26T16:28:44+00:00</updated>
   <id>http://room-303.com/blog/2005/12/26/delicious</id>
   <content type="html">&lt;script type=&quot;text/javascript&quot; src=&quot;http://del.icio.us/feeds/js/tags/patrys?size=12-35;color=87ceeb-0000ff&quot;&gt;&lt;/script&gt;

</content>
 </entry>
 
 <entry>
   <title>Uważaj na XHTML</title>
   <link href="http://room-303.com/blog/2005/12/15/uwazaj-na-xhtml/"/>
   <updated>2005-12-15T20:04:44+00:00</updated>
   <id>http://room-303.com/blog/2005/12/15/uwazaj-na-xhtml</id>
   <content type="html">&lt;p&gt;Pisałem o tym już niezliczoną liczbę razy, także na tym blogu, ale widać, że niektórzy zakochali się w &lt;abbr title=&quot;Extensible HyperText Markup Language&quot;&gt;XHTML&lt;/abbr&gt; do tego stopnia, że są głusi na jakiekolwiek uwagi. Jak z każdą miłością, problem z zealotami &lt;abbr&gt;XHTML&lt;/abbr&gt; polega na całkowitym zaślepieniu uczuciem i miłowaniu nie faktycznego standardu, a swojego o nim pojęcia.&lt;/p&gt;

&lt;p&gt;Nie krytykuję &lt;abbr&gt;XHTML&lt;/abbr&gt;, to bardzo dobry standard, który porządkuje zupę tagów, jaką pozostawił po sobie &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt; - który też jest bardzo dobrym formatem, tylko pozwala na zbyt dużą dowolność. Co więcej, jest tak dobry, że każdą działającą dziś stronę, zbudowaną w &lt;abbr&gt;XHTML&lt;/abbr&gt;, można bez większych przeszkód przerobić na &lt;abbr&gt;HTML&lt;/abbr&gt;. Oczywiście, &lt;abbr&gt;XHTML&lt;/abbr&gt; jest standardem przyszłości i oferuje wiele rozszerzeń, którymi od lat szczycą się inne aplikacje &lt;abbr title=&quot;Extensible Markup Lalguage&quot;&gt;XML&lt;/abbr&gt; (a &lt;abbr&gt;XHTML&lt;/abbr&gt; to rodzina takich właśnie aplikacji).&lt;/p&gt;

&lt;p&gt;Problem polega na tym, że żadna z nowych funkcji nie jest wspierana przez większość rynku. Jeśli uważasz, że dopisując do elementów swojego dokumentu atrybut &lt;code&gt;xml:lang=&quot;pl&quot;&lt;/code&gt;, zwiększysz dostępność serwisu, to jesteś w błędzie. Przestrzenie nazw to specyfika aplikacji &lt;abbr&gt;XML&lt;/abbr&gt; i przeglądarki traktujące dokument jak &lt;code&gt;text/html&lt;/code&gt; niewiele sobie z nich robią.&lt;/p&gt;

&lt;p&gt;Oczywiście, takich problemów jest więcej, ale największy z nich dotyczy tego, co jest jednocześnie największą zaletą &lt;abbr&gt;XHTML&lt;/abbr&gt; - ścisłe sprawdzanie poprawności dokumentu. Pozwala na napisanie parsera dla dokumentów dziesiątki razy prostszego i mniej skomplikowanego niż dla dokumentów tworzonych w &lt;abbr&gt;HTML&lt;/abbr&gt;, pozwala też na edycję dokumentu za pomocą dowolnego właściwie narzędzia, jeśli to radzi sobie z dokumentami &lt;abbr&gt;XML&lt;/abbr&gt;. Dwie wielkie zalety, ale zalety dla ciebie i autorów przeglądarek. Klient i internauta nie mają z tego absolutnie nic. Zastanów się, &lt;em&gt;jakie korzyści&lt;/em&gt; przyniesie stosowanie &lt;abbr&gt;XHTML&lt;/abbr&gt; w &lt;em&gt;danym, konkretnym przypadku&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Dlaczego? Ano dlatego, że dla klienta ważniejsze są pieniądze i zadowolenie internautów (ze wskazaniem na ich pieniądze). Jeśli nagle okaże się, że musisz wspierać użytkowników starych wersji Safari, to staniesz przed problemem - walidacja albo obsługa (albo brzydkie hacki z użyciem JavaScript do osadzania mediów z użyciem dynamicznie generowanego obiektu &lt;code&gt;&amp;lt;embed/&amp;gt;&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Dlatego, że klient może kiedyś zechcieć zmodyfikować swój serwis. Ile z polskich serwisów oferujących choćby statystyki jest w stanie wygenerować kod zgodny z &lt;abbr&gt;XHTML&lt;/abbr&gt;? Jeśli użyłeś &lt;abbr&gt;XHTML&lt;/abbr&gt; w wersji 1.1, to właśnie zrobiłeś klientowi niedźwiedzią przysługę - patrząc na wyniki podłączenia licznika jest od dziesięciu minut przekonany, że &lt;q&gt;standardy sieciowe&lt;/q&gt; działają tylko w &lt;abbr title=&quot;Internet Explorer&quot;&gt;IE&lt;/abbr&gt;, bo wszystkie inne przeglądarki kończą żywot na tajemniczym żółtym ekranie z komunikatem o błędzie. Kiedy czytasz to zdanie, on pewnie właśnie kalkuluje straty, jakie przyniosło to jego działalności.&lt;/p&gt;

&lt;p&gt;Nie zrozum mnie źle, &lt;abbr&gt;XHTML&lt;/abbr&gt; nie należy unikać, ale pozostawienie klienta z takim kodem i bez wsparcia wyrządza sieci większe straty niż korzyści. Jeśli chcesz stosować nowoczesne technologie, to upewnij się, że wiesz o nich wszystko i zapewnij wsparcie swojej wiedzy klientowi. Gdyby była to broń, to chyba nie dałbyś jej dziecku z nadzieją, że wciśnie właściwy guzik?&lt;/p&gt;

&lt;p&gt;Na koniec powiem tylko, że z coraz większym zainteresowaniem przyglądam się pracom, toczącym się przy nieoficjalnym projekcie &lt;abbr&gt;HTML&lt;/abbr&gt; 5, nastawionym nie tylko na czytelną składnię, ale na zapewnienie - autorom opartych o sieć aplikacji - niezbędnych obiektów do wygodnego budowania dynamicznych serwisów. Specyfikacja (niekoniecznie w oryginalnej formie) ma być jeszcze w tym roku dyskutowana na forum &lt;abbr title=&quot;World Wide Web Consortium&quot;&gt;W3C&lt;/abbr&gt;, w ramach projektu aplikacji webowych.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>10przykazan - changelog</title>
   <link href="http://room-303.com/blog/2005/12/12/10przykazan-changelog/"/>
   <updated>2005-12-12T21:54:05+00:00</updated>
   <id>http://room-303.com/blog/2005/12/12/10przykazan-changelog</id>
   <content type="html">&lt;p&gt;Postęp prac nad serwisem 10przykazan można teraz śledzić na &lt;a href=&quot;http://10przykazan-dev.jogger.pl/&quot;&gt;changelogu&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Syndykacja RSS</title>
   <link href="http://room-303.com/blog/2005/12/12/syndykacja-rss/"/>
   <updated>2005-12-12T01:06:57+00:00</updated>
   <id>http://room-303.com/blog/2005/12/12/syndykacja-rss</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://10przykazan.com/&quot;&gt;10przykazan&lt;/a&gt; właśnie dorobiło się pobierania &lt;abbr title=&quot;Really Simple Syndication&quot;&gt;RSS&lt;/abbr&gt;. W związku z tym, w powiadomieniu o zmianie na blogu jest automatycznie wysyłany link do najnowszej notki.&lt;/p&gt;

&lt;p&gt;W najbliższym czasie planujemy też dodać śledzenie zmian (wysyłane będzie tylko powiadomienie o nowych notkach, z pominięciem edycji) i spersonalizowane feedy &lt;abbr&gt;RSS&lt;/abbr&gt; - wspólny kanał ze wszystkimi śledzonymi blogami dla zarejestrowanych.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>10przykazan.com - system dla polskiej blogosfery</title>
   <link href="http://room-303.com/blog/2005/12/10/10przykazancom-system-dla-polskiej-blogosfery/"/>
   <updated>2005-12-10T23:54:51+00:00</updated>
   <id>http://room-303.com/blog/2005/12/10/10przykazancom-system-dla-polskiej-blogosfery</id>
   <content type="html">&lt;p&gt;Kiedy jakiś czas temu, z &lt;a href=&quot;http://nbw.jogger.pl&quot;&gt;Tomkiem&lt;/a&gt;, zrealizowaliśmy żartobliwą promocję standardów sieciowych (o których więcej - wkrótce), wspomnieliśmy o tym, że wzięliśmy na poważnie głosy, które sugerowały, że powinniśmy zacząć robić coś wspólnie, na poważnie.&lt;/p&gt;

&lt;p&gt;Trudno tamten projekt nazwać poważnym, dlatego tym razem, przyszedł czas na coś innego. Czy znacie 10 przykazań?&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://10przykazan.com&quot;&gt;10przykazan.com&lt;/a&gt; to idea. Idea stworzenia systemu społecznego, zrzeszającego najciekawsze, najlepsze i najbardziej poczytne blogi i strony domowe w polskim internecie. Treść to podstawa, a dobry wygląd pomaga w promocji. Do systemu dostają się tylko te strony, które przejdą naszą rygorystyczną moderację (a koperty przekażą po cichu, pod stołem).&lt;/p&gt;

&lt;p&gt;Zwykli ludzie, na hasło &lt;q&gt;blog&lt;/q&gt;, natychmiast wysyłają zapytania do Google (czy innej, ulubionej, wyszukiwarki) by znaleźć blogi, o interesującej ich tematyce. Tu rodzi się problem &amp;mdash; odnalezienie interesujących blogów w zalewie śmiecia takiego jak onetowe blogi &lt;q&gt;piętnastolatkuff&lt;/q&gt; zniechęca. Rodzi także błędne przekonanie, że w blogach nie ma nic interesującego, a ludzie, którzy je prowadzą, to nieokrzesane fajtłapy, będące na bakier z ortografią i uprawiające ekshibicjonizm emocjonalny.&lt;/p&gt;

&lt;p&gt;Nasz cel, to stworzenie sieci zrzeszającej najlepszych autorów, piszących na tematy, interesujące dla szerokiego grona zainteresowanych odbiorców. To doskonała okazja zwiększenia swojej poczytności. Być może także okazja do wypromowania swojej osoby czy projektu nad jakim pracujesz.&lt;/p&gt;

&lt;p&gt;Prowadzisz dziennik, bloga, wiki a może stronę domową? Przyłącz się do nas.&lt;/p&gt;

&lt;p&gt;W najbliższym czasie wyślemy odpowiedni kod do &lt;a href=&quot;http://sparrow.jogger.pl&quot;&gt;Sparrowa&lt;/a&gt;, by &lt;a href=&quot;http://jogger.pl&quot;&gt;jogger.pl&lt;/a&gt; wzbogacił się o funkcję pingback, tym samym, by ciekawe joggi mogły znaleźć się w naszym systemie.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Transfer zakończony</title>
   <link href="http://room-303.com/blog/2005/12/09/transfer-zakonczony/"/>
   <updated>2005-12-09T12:23:08+00:00</updated>
   <id>http://room-303.com/blog/2005/12/09/transfer-zakonczony</id>
   <content type="html">&lt;p&gt;Przeniosłem cały swój dobytek z &lt;a href=&quot;http://patrys.jogger.pl/&quot; rel=&quot;me&quot;&gt;Joggera&lt;/a&gt;. Pozostało jeszcze doprowadzić szablon do użytku i poprawić cudzysłowy we wpisach (w kodzie się rozpadły).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Grafik: poszukiwany</title>
   <link href="http://room-303.com/blog/2005/12/06/d1bf156240da3566785b72882f355bd7/"/>
   <updated>2005-12-06T19:42:34+00:00</updated>
   <id>http://room-303.com/blog/2005/12/06/d1bf156240da3566785b72882f355bd7</id>
   <content type="html">&lt;p&gt;Jako, że &lt;a href=&quot;http://monochrome.pl/&quot;&gt;Jarvis&lt;/a&gt; od nas odchodzi, &lt;a href=&quot;http://prodesign.pl/&quot;&gt;Internet Center&lt;/a&gt; szuka pracowników na stanowisko &lt;strong&gt;grafika &lt;abbr title=&quot;World Wide Web&quot;&gt;WWW&lt;/abbr&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;W grę wchodzi praca na pełny etat, na miejscu - w siedzibie firmy, we Wrocławiu. Biurko w biurko ze mną. &lt;em&gt;Niezbędne&lt;/em&gt; wymagania:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;udokumentowane pracami, co najmniej dwuletnie, doświadczenie przy
projektowaniu serwisów internetowych;&lt;/li&gt;
&lt;li&gt;biegła znajomość Adobe Photoshop, Macromedia Flash;&lt;/li&gt;
&lt;li&gt;umiejętność przynajmniej podstawowego programowania ActionScript;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;W przypadku spełnienia wszystkich wymagań, po szczegóły proszę się zgłaszać do Piotra Jelonka &amp;lt;jelonek at icenter pl&amp;gt;, w załączniku przesyłając swoje &lt;abbr title=&quot;Curriculum Vitae&quot;&gt;CV&lt;/abbr&gt; i odnośniki do prac.&lt;/p&gt;

&lt;p&gt;Aha, panie &lt;em&gt;bardzo&lt;/em&gt; mile widziane ;).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Drag to scroll</title>
   <link href="http://room-303.com/blog/2005/12/02/b459f20fd4ce10763645d02dd7374a2c/"/>
   <updated>2005-12-02T00:22:36+00:00</updated>
   <id>http://room-303.com/blog/2005/12/02/b459f20fd4ce10763645d02dd7374a2c</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.adobe.com/products/acrobat/readermain.html&quot;&gt;Adobe Reader&lt;/a&gt; ma bardzo wygodną i intuicyjną funkcję przewijania tekstu za pomocą myszy. Wystarczy &lt;q&gt;złapać&lt;/q&gt; kartkę i przesunąć ją ruchem myszy. Jako, że nie sypiam, wymyśliłem sobie zadanie - zaimplementować to samo w &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;Efekt kilkunastominutowego starcia z &lt;abbr title=&quot;JavaScript&quot;&gt;JS&lt;/abbr&gt; można zobaczyć na &lt;a href=&quot;http://patrys.icenter.pl/test/2005-12-01-drag-to-scroll/&quot;&gt;stronie testowej&lt;/a&gt;. Jedyny problem jest taki, że musiałem wyłączyć zaznaczanie tekstu - działało niespecjalnie intuicyjnie, bo tekst przewijał się razem z kursorem. Nie powinno to przeszkadzać tam, gdzie przewijanie takie może się w ogóle przydać (na przykład w prezentacjach).&lt;/p&gt;

&lt;p&gt;Rozwiązanie, póki co, jest zrobione na szybko i daleko mu do wzorcowej implementacji. Poprawię przy najbliższej okazji, jeśli będą zainteresowani.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Będziesz miłował kod swój</title>
   <link href="http://room-303.com/blog/2005/11/29/d411b25af6f520efed24bb292d49c39c/"/>
   <updated>2005-11-29T22:10:09+00:00</updated>
   <id>http://room-303.com/blog/2005/11/29/d411b25af6f520efed24bb292d49c39c</id>
   <content type="html">&lt;p&gt;Przynoszę wam tedy jedno i najważniejsze przykazanie:&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://patrys.room-303.com/images/photos/photo-moses.jpg&quot; alt=&quot;Patrys jako Mroczny Mojżesz&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Dbaj o kod, nigdy nie wiesz, kiedy będziesz musiał do niego wrócić. Praca programisty polega na rozwijaniu oprogramowania, a nie na jego ciągłym przepisywaniu od zera.&lt;/p&gt;

&lt;p&gt;Pisząc program, stosuję ścisłe zasady jego tworzenia. Są miejsca, gdzie czytelniej wyglądają instrukcje warunkowe, są miejsca, gdzie czytelniejsze są przełączniki wyboru. Niektóre zasady są niezmienne. Nie uznaję więcej niż jednego pustego wiersza z rzędu. Nie uznaję operatorów, które nie są poprzedzone spacją i po których spacja nie występuje. Po przecinku wymagam spacji. Klamra otwierająca blok zawsze jest wyrównana do lewej względem wyrażenia warunkowego, do którego jest przypisana. Klamra zamykająca znajduje się na tym samym poziomie wcięcia. Ściśle formatuję nawet zapytania &lt;abbr title=&quot;Structured Query Language&quot;&gt;SQL&lt;/abbr&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;$query =
&quot;
	SELECT foo.a, foo.b, baz.c
	FROM foobar AS foo
	INNER JOIN bazorg AS baz
	USING (d)
	WHERE foo.a &amp;gt; 3
	AND baz.c = 'a'
&quot;;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Nie twierdzę, że moje zasady są jedynie słuszne. Są spójne i gwarantują mi, że kod jest czytelny do tego stopnia, że mogę szukać interesujących mnie miejsc, przelatując wzrokiem po kodzie podczas ciągłego przewijania. Ma to kolosalne znaczenie przy systemie &lt;abbr title=&quot;Content Management System&quot;&gt;CMS&lt;/abbr&gt;, gdzie poszczególne moduły liczy się w tysiącach linii.&lt;/p&gt;

&lt;p&gt;Niestety, mojego kolegi żadną siłą nie daje się zmusić do dbania o kod. Nie mówię o ścisłym przestrzeganiu &lt;em&gt;moich&lt;/em&gt; reguł. Chodzi o utrzymanie &lt;em&gt;jakiegokolwiek&lt;/em&gt; standardu. Nic nie szkodzi - jako, że regularnie robię przegląd kodu, każdą okazję wykorzystuję do jego czyszczenia. Łamię długie linie, dodaję spacje po przecinkach i dookoła operatorów, zamieniam indentację ze spacji na tabulatory i usuwam białe znaki z końców wierszy.&lt;/p&gt;

&lt;p&gt;Przyświeca mi zasada wyznawana też przez jednostki &lt;abbr title=&quot;Special Weapons And Tactics&quot;&gt;S.W.A.T.&lt;/abbr&gt; - &lt;q&gt;clean as you go.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Usuwam też brzydkie hacki, które dobrze działają. Wolę przepisać je w poprawny sposób i móc szybko dojść, co dany kawałek kodu robi. Próba zrozumienia czegoś, co przypomina relikty obcej cywilizacji - zwłaszcza, kiedy klient wisi na telefonie i dopytuje o termin zamknięcia poprawek - z pewnością nie należy do przyjemnych.&lt;/p&gt;

&lt;p&gt;Ktoś pewnie nazwie to stratą czasu, ale dla mnie to jedyna metoda wspólnej pracy nad większą bazą kodu. Jeśli programista sam nie szanuje swojego kodu, to znaczy, że lekceważąco traktuje swoją pracę. Jeśli ktoś nie lubi swojej pracy, to po co ją wykonywać? Oczywiście, są projekty, które się dziedziczy po script kiddies i tam często zdarza się pisać kod wiele pozostawiający do życzenia, byle wpasował się w otoczenie i nie sugerował, że nad projektem pracował ktoś rozsądny, ale to historia na inną okazję.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Being geeky</title>
   <link href="http://room-303.com/blog/2005/11/29/cf4796d81fbf4cb436c7a7a519ddc834/"/>
   <updated>2005-11-29T20:13:51+00:00</updated>
   <id>http://room-303.com/blog/2005/11/29/cf4796d81fbf4cb436c7a7a519ddc834</id>
   <content type="html">&lt;p&gt;W piątek świętowaliśmy przenosiny firmy do nowej lokacji. Kilka piw i drinków w &lt;a href=&quot;http://www.liverpool.wroclaw.pl/&quot;&gt;Liverpoolu&lt;/a&gt;. W drodze powrotnej do domu skradziono mi portfel. O 6 nad ranem zablokowałem karty bankowe i zacząłem szacować straty. Pieniędzmi się nie przejąłem, gorzej z dokumentami. Załatwienie wszystkiego i wyrobienie nowych dokumentów wymaga czasu i ponad 200 złotych nakładów finansowych. Na szczęście, portfel odnalazł się w niedzielę. Przypadkowy przechodzień znalazł go przy śmietniku na tyłach kina &lt;a href=&quot;http://www.heliosnet.pl/&quot;&gt;Helios&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Szczęściu nie było końca. Ucieszyłem się z zaoszczędzenia czasu i kłopotów, pozostało wyrobić nowe karty w banku. Z koniecznością wydania pieniędzy już się pogodziłem, dlatego z łatwością przyszło mi podjęcie innej decyzji. Dziś zamówiłem sobie nową klawiaturę - &lt;a href=&quot;http://www.speedlink.de/&quot;&gt;SpeedLink&lt;/a&gt; SL-6466:&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://www.speedlink.de/prod.php?lang=en&amp;amp;sys_id=1&amp;amp;pb_id=5&amp;amp;prod_num=SL-6466&quot;&gt;&lt;img src=&quot;http://www.gc-plus.de/img/medium/sl-6466_1.jpg&quot; alt=&quot;SL-6466&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Powinna przyjechać do poniedziałku. Już nie mogę się doczekać.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Praca oferowana</title>
   <link href="http://room-303.com/blog/2005/11/26/39a57f77bf50876a94624f7105e1c3b6/"/>
   <updated>2005-11-26T17:30:51+00:00</updated>
   <id>http://room-303.com/blog/2005/11/26/39a57f77bf50876a94624f7105e1c3b6</id>
   <content type="html">&lt;p&gt;Tym wpisem mam nadzieję rozpocząć większy cykl notek - związanych z zatrudnieniem.&lt;/p&gt;

&lt;p&gt;Sławomir Jasiński z zaprzyjaźnionej firmy &lt;a href=&quot;http://www.gexit.pl/&quot;&gt;GEX IT&lt;/a&gt; poszukuje pracowników:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Aktualnie poszukujemy osoby na stanowisko &lt;em&gt;programista PHP&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Wymagania:&lt;/p&gt;
&lt;ul&gt;
        &lt;li&gt;znajomość programowania obiektowego w PHP4, PHP5;&lt;/li&gt;
        &lt;li&gt;umiejętność tworzenia zapytań SQL;&lt;/li&gt;
        &lt;li&gt;umiejętność pracy w grupie;&lt;/li&gt;
        &lt;li&gt;chęć do pracy i punktualność;&lt;/li&gt;
        &lt;li&gt;mile widziana znajomość Smarty i ADOdb;&lt;/li&gt;
        &lt;li&gt;wiek i wykształcenie nie są istotne&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Oferujemy:&lt;/p&gt;
&lt;ul&gt;
        &lt;li&gt;zdobycie doświadczenia;&lt;/li&gt;
        &lt;li&gt;liczne ciekawe projekty;&lt;/li&gt;
        &lt;li&gt;miłą atmosferę pracy;&lt;/li&gt;
        &lt;li&gt;praca na pół / cały etat&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;

&lt;p&gt;Kontakt: przez email na adres &amp;lt;info at gexit pl&amp;gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Oszukać pomocnika</title>
   <link href="http://room-303.com/blog/2005/11/23/01a15137947afb59407c533ec3e02476/"/>
   <updated>2005-11-23T01:04:16+00:00</updated>
   <id>http://room-303.com/blog/2005/11/23/01a15137947afb59407c533ec3e02476</id>
   <content type="html">&lt;p&gt;Do tematu jakiś czas temu &lt;a href=&quot;http://riddle.jogger.pl/comment.php?eid=164597&quot;&gt;nawiązał już Riddle&lt;/a&gt;. Nowomodni webmasterzy dostrzegli w logo &lt;q&gt;Valid &lt;abbr title=&quot;Extensible HyperText Markup Language&quot;&gt;XHTML&lt;/abbr&gt;&lt;/q&gt; wartość samą w sobie. Coś, jak odznaka sprawności harcerskiej, kolejna pozbawiona sensu plakietka do zapchania stopki na stronie. Nikt nie rozumie, czym jest &lt;abbr&gt;XHTML&lt;/abbr&gt; i czym różni się od swojego starszego kuzyna.&lt;/p&gt;

&lt;p&gt;Najważniesze, żeby &lt;q&gt;strona się walidowała,&lt;/q&gt; mniejsza o to, czy walidacja dla samej walidacji ma jakąkolwiek wartość. Niewygodną treść wystarczy zepchnąć do zewnętrznych plików, a te nie podlegają już władzy wszechmocnego narzędzia &lt;a href=&quot;http://w3.org&quot;&gt;&lt;abbr title=&quot;World Wide Web Consortium&quot;&gt;W3C&lt;/abbr&gt;&lt;/a&gt;. Można spać spokojnie.&lt;/p&gt;

&lt;p&gt;Dziś, za pośrednictwem &lt;a href=&quot;http://web-graphics.com/mtarchive/001678.php&quot;&gt;pytania Andreasa z Web Graphics&lt;/a&gt;, trafiłem na inny wynalazek - &lt;a href=&quot;http://blog.deconcept.com/flashobject/&quot;&gt;FlashObject&lt;/a&gt;. Jak łatwo się domyślić, jest to kolejna &lt;q&gt;uświęcona&lt;/q&gt; metoda zagnieżdżania niepoprawnego kodu w &lt;q&gt;poprawnym&lt;/q&gt; dokumencie. Jak czytamy na stronie projektu, ma on na celu umożliwienie zagnieżdżenia obiektów Flash widocznych w starych i zepsutych wersjach Safari i Internet Explorera dla MacOS.&lt;/p&gt;

&lt;p&gt;Główny problem polega na tym, że przeglądarki te wymagają niepoprawnego kodu, więc całość została zamknięta w niewielki skrypt &lt;abbr title=&quot;JavaScript&quot;&gt;JS&lt;/abbr&gt; i efektywnie ukryta przed walidatorem. Zgodzę się, że często wsparcie dla takich przeglądarek jest wskazane, ba, czasem wręcz nieodzowne. Jednak mówimy o starych przeglądarkach, które nie potrafią wykorzystać najmniejszego nawet kawałka nowych technologii. Nie wspierają też &lt;abbr&gt;XHTML&lt;/abbr&gt; serwowanego jako &lt;code&gt;application/xhtml+xml&lt;/code&gt;, jaki jest więc sens upierania się przy stosowaniu &lt;abbr&gt;XHTML&lt;/abbr&gt;? Dużo prościej byłoby użyć typu dokumentu, który jest zaprojektowany dla wsparcia przestarzałych elementów i atrybutów. Używanie &lt;abbr&gt;XHTML&lt;/abbr&gt; 1.0 Strict nie niesie ze sobą żadnych korzyści poza wymuszaniem stosowania brzydkich hacków, które mają naprawiać to, co zepsute jest gdzie indziej - w przeglądarce.&lt;/p&gt;

&lt;p&gt;Na koniec podkreślę jeszcze raz, że walidator jest narzędziem dla osoby budującej witrynę, a nie dla odwiedzających. Oszukiwanie go to jak okłamywanie własnego doradcy i pomocnika, a wklejenie żółtego guziczka za wszelką cenę nie ma najmniejszego sensu, ale o tym szerzej w następnym numerze &lt;a href=&quot;http://art.webesteem.pl/&quot;&gt;webesteem art &amp;amp; design magazine&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #023: Alkohol szkodzi zdrowiu na terenie sklepu</title>
   <link href="http://room-303.com/blog/2005/11/20/8dc884add9e616864ef3480391781518/"/>
   <updated>2005-11-20T18:44:18+00:00</updated>
   <id>http://room-303.com/blog/2005/11/20/8dc884add9e616864ef3480391781518</id>
   <content type="html">&lt;p&gt;Zainspirowany wczorajszą wizytą u kolegi, Shoo.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/023-megahertz.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Opera i popularność</title>
   <link href="http://room-303.com/blog/2005/11/19/8fbd569b2a7ed71031ae3bd5d83627b9/"/>
   <updated>2005-11-19T13:24:12+00:00</updated>
   <id>http://room-303.com/blog/2005/11/19/8fbd569b2a7ed71031ae3bd5d83627b9</id>
   <content type="html">&lt;p&gt;Idąc śladem Riddle'a, który słusznie &lt;a href=&quot;http://riddle.jogger.pl/comment.php?eid=165901&quot;&gt;zauważył, że Operze daleko do popularności Firefoksa&lt;/a&gt;, postanowiłem na przekór wszystkim (jestem wszak użytkownikiem Firefoksa) popromować &lt;a href=&quot;http://www.opera.com/&quot;&gt;Operę&lt;/a&gt;. Dlaczego by nie? Wszak przeglądarka jest solidnie zbudowana i rozwija się bardzo dynamicznie. Jest tylko jeden problem, przystosowanie użytkowników do jej używania.&lt;/p&gt;

&lt;p&gt;Opera jest jak limuzyna, oprócz siedzenia i pasów ma też barek, elektryczne szyby i odtwarzacz ze zmieniaczem na 60 kompaktów. Podobnie jak, zmarły już, Mozilla Suite, brakuje jej jedynie zlewu kuchennego (choć Mozilla się takowego dorobiła dwa lata temu). Nie jestem fanem kombajnów do wszystkiego, ale jeśli zignorować nieużywane komponenty, to pozostaje nadal lekką przeglądarką.&lt;/p&gt;

&lt;p&gt;Główny problem z nią polega na tym, że domyślnie, zaraz po instalacji, jest paskudna. Od razu rzucają się w oczy wzięte żywcem z Windows XP niebieskie nagłówki zakładek. Dodatkowo, po kliknięciu w pasek adresu wyskakuje bez uprzedzenia dodatkowy zasobnik z narzędziami. Dziwi również kolejność pasków i umieszczenie zakładek pod samym paskiem menu. Jest to oczywiście poprawne z logicznego punktu widzenia, bo wszystkie przyciski poniżej odnoszą się do aktualnej zakładki, ale zupełnie sprzeczne z przyjętymi w programach komputerowych konwencjami.&lt;/p&gt;

&lt;p&gt;Dlatego też uważam, że jedyne, co trzeba zrobić do szerszego rozpromowania Opery, to przejście z:&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://img149.imageshack.us/my.php?image=zrzutekranugetstartedusingoper.png&quot;&gt;&lt;img src=&quot;http://img149.imageshack.us/img149/359/zrzutekranugetstartedusingoper.th.png&quot; border=&quot;0&quot; alt=&quot;Free Image Hosting at www.ImageShack.us&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na układ nieco bardziej przyjazny dla użytkowników:&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;a href=&quot;http://img293.imageshack.us/my.php?image=zrzutekranugetstartedusingoper.png&quot;&gt;&lt;img src=&quot;http://img293.imageshack.us/img293/359/zrzutekranugetstartedusingoper.th.png&quot; border=&quot;0&quot; alt=&quot;Free Image Hosting at www.ImageShack.us&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #022: Standardy i outsourcing</title>
   <link href="http://room-303.com/blog/2005/11/18/a9763e08472b2c02d72d09395264cf0d/"/>
   <updated>2005-11-18T21:49:45+00:00</updated>
   <id>http://room-303.com/blog/2005/11/18/a9763e08472b2c02d72d09395264cf0d</id>
   <content type="html">&lt;p&gt;Strip kolejny, tym razem hostowany u pracodawcy, reszta powróci razem z domeną, o której pisałem przed chwilą.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/022-standards.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Historia pewnego pokoju</title>
   <link href="http://room-303.com/blog/2005/11/18/911c9c683b0695b945badde6c49d1f80/"/>
   <updated>2005-11-18T19:17:50+00:00</updated>
   <id>http://room-303.com/blog/2005/11/18/911c9c683b0695b945badde6c49d1f80</id>
   <content type="html">&lt;p&gt;Jak zapewne większość z was zauważyła, domena &lt;code&gt;room-303.com&lt;/code&gt; nie działa od ponad tygodnia. Zaczęło się niewinnie, chciałem przenieść dane na komercyjnego hosta, opłaconego w &lt;a href=&quot;http://dreamhost.com/&quot;&gt;DreamHost&lt;/a&gt; (jeśli zamierzasz tam coś kupić, to wspomóż kolegów i podaj &lt;em&gt;patrys&lt;/em&gt; jako WebID referującego). Problem w tym, że domena została zarejestrowana we wrocławskim &lt;a rel=&quot;nofollow&quot; href=&quot;http://online.pl/&quot;&gt;Alfanecie&lt;/a&gt;. W czwartek zaczęły się problemy ze strefami &lt;abbr title=&quot;Domain Name Server&quot;&gt;DNS&lt;/abbr&gt;, tego samego dnia wysłałem zlecenie zmiany serwerów nazw na oferowane przez DreamHost.&lt;/p&gt;

&lt;p&gt;Na odpowiedź czekałem i czekałem, w końcu we wtorek wysłałem ponaglenie z delikatną sugestią, że chyba już czas zmienić registrara na takiego, który pozwala mi zmieniać rekord mojej własnej domeny. Odpowiedź pojawiła się błyskawicznie, bo następnego dnia o czwartej nad ranem. &lt;q&gt;Wszelkie modyfikacje zostały wprowadzone,&lt;/q&gt; mogłem przeczytać w otrzymanym od pracownika Alfanetu mailu. Po ośmiu godzinach jedyną widoczną zmianą była zmiana mojego adresu email w danych kontaktowych domeny na adres służbowy, o co wcale nie prosiłem.&lt;/p&gt;

&lt;p&gt;Wczoraj zadzwoniłem z pytaniem o powód takiego stanu rzeczy. Dowiedziałem się, że &lt;q&gt;Pan, który realizował zlecenie nie jest obecny i odezwie się do mnie, jak tylko pojawi się w biurze.&lt;/q&gt; Rozmówca zasugerował mi też, żebym się nie denerwował, bo zmiany w rekordach domen &lt;q&gt;zabierają chwilę żeby się odświeżyć.&lt;/q&gt; Kiedy powiedziałem, że pracuję w tej samej branży, co oni i że nigdy nie czekałem na zmiany ponad dwie doby, Pan z drugiej strony słuchawki niemal krzyknął mi do ucha: &lt;q&gt;dlaczego Pan chce na mnie wymusić przyznanie się do winy?!&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Nie mam już siły, firma nie dość, że nie jest w stanie powiedzieć mi, co dzieje się z moją domeną (&lt;q&gt;powinno działać&lt;/q&gt;), to nie odpisuje na maile i nie jest w stanie udzielić wyjaśnień przez telefon (&lt;q&gt;ja widzę w systemie Pana ponaglenie, ale oryginalne zgłoszenie gdzieś się zapodziało&lt;/q&gt;). Serdecznie odradzam.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Frankenstein polskiego Internetu</title>
   <link href="http://room-303.com/blog/2005/11/15/46e289cb047a9e19d59225e064c8a208/"/>
   <updated>2005-11-15T19:33:18+00:00</updated>
   <id>http://room-303.com/blog/2005/11/15/46e289cb047a9e19d59225e064c8a208</id>
   <content type="html">&lt;p&gt;Znany wszem i wobec, jedyny w swoim rodzaju serwis typu &lt;q&gt;six degrees&lt;/q&gt; doczekał się kolejnych rewolucyjnych zmian.&lt;/p&gt;

&lt;p&gt;O &lt;a href=&quot;http://grono.net/&quot;&gt;Grono.net&lt;/a&gt;, bo o nim mowa, krążą już dowcipy, że jest jedynym miejscem, gdzie trzeba się zalogować, żeby obejrzeć stronę z wewnętrznym błędem serwera. Dziś, przy kolejnej próbie logowania (serwis z nieznanych mi przyczyn nie umie wysłać treści otrzymanej wiadomości i podrzuca tylko link do skrzynki odbiorczej, co jest ogólnie świetnym pomysłem, kiedy sama strona działa lub nie - w zależności od okresu pylenia motyli w Australii) doznałem szoku.&lt;/p&gt;

&lt;p&gt;Co prawda, właściciel Grona (&lt;del&gt;jedno&lt;/del&gt;&lt;ins&gt;dwu&lt;/ins&gt;osobowa firma &lt;a href=&quot;http://brandlay.com/&quot;&gt;Brandlay&lt;/a&gt;, która przypadkiem mieści się w tym samym mieszkaniu, co inny znamienity koncern mediów elektronicznych - &lt;a href=&quot;http://nemo.pl/&quot;&gt;NEMO Labs&lt;/a&gt;) już dawno szukał pracowników do przygotowania redesignu (i negocjował nawet ze mną, z &lt;a href=&quot;http://nbw.jogger.pl/&quot;&gt;nbw&lt;/a&gt; i z &lt;a href=&quot;http://riddle.jogger.pl&quot;&gt;Riddlem&lt;/a&gt; - co ciekawe, negocjował jednocześnie i za pomocą komunikatora, nie wpadł na to, że się znamy), jednak to, co zobaczyłem przeszło moje najśmnielsze oczekiwania. Komercjalizacja osiągnęła punkt kulminacyjny.&lt;/p&gt;

&lt;p&gt;Skoro serwer i tak nie działa, a Grono służy mi głównie do otrzymywania powiadomień o urodzinach, to może wprowadzą jeszcze opłaty za oglądanie reklam? Wszystkie inne usługi można już tam znaleźć.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Siedemnastka!</title>
   <link href="http://room-303.com/blog/2005/11/13/e985991748deca93c92023ec7d1d03fc/"/>
   <updated>2005-11-13T22:59:40+00:00</updated>
   <id>http://room-303.com/blog/2005/11/13/e985991748deca93c92023ec7d1d03fc</id>
   <content type="html">&lt;p&gt;Dziś od północy świętowaliśmy z ekipą moje urodziny. Jako, że zostało ich tylko kilka zaledwie minut, wypada się pochwalić, że właśnie stuknęło mi 17 lat. Z tej okazji zebrałem masę życzeń i upodliliśmy się z kolegami też nieco. Cóż, pozostaje liczyć, że piwo nadal będzie smakowało tak samo dobrze, rak płuc pozostanie w zdrowiu, a i niewiasty nie będą mniej skore do zabawy. Za rok huczna zabawa - wszak skończę 18 lat i okazja do imprezy zacna. Teraz trzeba jeszcze kupić jakąś flaszkę i pepsi na jutro do pracy, bo i kolegom z biura nie można pozostać dłużnym - swoich okazji pilnują dzielnie, a wino leje się niemal litrami.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; z okazji urodzin, żeby cofnąć nieco czas, dostało się mojej koziej brodzie, która zredukowała się niemal do zera. Trzeba sobie jakoś radzić z latami na karku. ;)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Jedna miłość</title>
   <link href="http://room-303.com/blog/2005/11/12/322cdf03a0e5277741e6a05fed6b6077/"/>
   <updated>2005-11-12T17:16:37+00:00</updated>
   <id>http://room-303.com/blog/2005/11/12/322cdf03a0e5277741e6a05fed6b6077</id>
   <content type="html">&lt;p&gt;Jeszcze dziś nad ranem miałem okazję uczestniczyć w największym festiwalu muzyki reggae i pochodnych - &lt;a href=&quot;http://www.onelove.pl/&quot;&gt;One Love Sound Fest&lt;/a&gt;. Wrażenia bardzo mieszane.&lt;/p&gt;

&lt;p&gt;Część artystyczna bez zarzutów (wręcz genialnie!). Stage of Unity, jako gospodarze, porządnie rozruszali widownię, tym samym otwierając muzyczną część One Love. Z niecierpliwością czekałem na wejście swojego faworyta - Irie Mafia. Panowie z Węgier bez trudu sprawili, że ludzie zaczęli skakać - zdecydowanie polecam. Potem wystąpiła jedyna tego wieczoru kapela dubowa - Wszystkie Wschody Słońca. Muzyka nieco monotonna, ale pełna energii. Oczywiście, z Irie Mafią nie mieli się co mierzyć ;). Zaraz po nich scenę przejęli trzej rasta z Natural Dread Killaz - zespołu bardzo młodego nawet jak na polskie realia, ale bez problemu rozpoznawanego także poza granicami Wrocławia. Zaserwowali nam potężną dawkę pozytywnych emocji, bujali tłumem, a jako zespół o korzeniach hiphopowych, nie mogli obyć się bez ponarzekania na policję ;). Koncert Indios Bravos odpuściłem sobie planowo i z wolałem czas ten spędzić na świeżym powietrzu - nie mam nic do zarzucenia Gutkowi i jego kolegom, ale z powodu swojej popularności zwyczajnie spowszednieli. Po zakończeniu ich występu, nie trzeba było nam dwa razy powtarzać, żeby wracać pod scenę - oto na scenę weszła gwiazda wieczoru - Abassi All Stars. Wystarczyło pierwszych kilka taktów muzyki, żeby pierwsze rzędy ludzi zamieniły się w młyn znany z najmroczniejszych koncertów bogów metalu. Zdecydowanie warto było czekać do wczesnych godzin rannych, by zobaczyć choćby tylko ten występ. Ból w nogach i brak tlenu nie były żadnym usprawiedliwieniem - bawili się wszyscy. Zmęczenie dało się za to zauważyć po zakończeniu występu - sala szybko opustoszała i na ostatni koncert - czeskiego Hypnotix - czekały już tylko nieliczne grupki niedobitków. Ze względu na problemy transportowe, sami opuściliśmy budynek i udaliśmy się w poszukiwaniu środków komunikacji miejskiej.&lt;/p&gt;

&lt;p&gt;Od strony organizacyjnej było tragicznie. Toalety umieszczono przy samych szatniach, na końcu korytarza o szerokości dwóch metrów. Proponuję wyobrazić sobie dwa tysiące osób, tłoczące się w kilkudziesięciometrowym korytarzu. Wycieczka do toalety zabierała jakieś 40 minut. Do szatni dłużej, gdyż trzeba było dopchać się najpierw do toalet na końcu korytarza, a następnie tam zawrócić i ustawić się w powrotnej kolejce do szatni - zawrócić w tłumie nie było szans.&lt;/p&gt;

&lt;p&gt;Mimo wszystko, kto nie był, niech żałuje.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Frappr!</title>
   <link href="http://room-303.com/blog/2005/11/11/ab4f591b83d0afe97642737e0ca61333/"/>
   <updated>2005-11-11T01:16:02+00:00</updated>
   <id>http://room-303.com/blog/2005/11/11/ab4f591b83d0afe97642737e0ca61333</id>
   <content type="html">&lt;p&gt;Jako, że Frappr! robi się coraz bardziej popularny, dzisiaj zbudowałem w wolnej chwili &lt;a href=&quot;http://www.frappr.com/pld&quot;&gt;mapę osób związanych z &lt;abbr&gt;PLD&lt;/abbr&gt;&lt;/a&gt;. Wszystkich chętnych zapraszam do rejestracji.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #021: O jabłuszkach</title>
   <link href="http://room-303.com/blog/2005/11/09/4f8eebd7fb8f528821ade1cbe7e1d310/"/>
   <updated>2005-11-09T01:30:02+00:00</updated>
   <id>http://room-303.com/blog/2005/11/09/4f8eebd7fb8f528821ade1cbe7e1d310</id>
   <content type="html">&lt;p&gt;Tym razem na zamówienie &lt;a href=&quot;http://majqa.jogger.pl/&quot;&gt;Majqi&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/021-apples.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #020: Prawdziwy cyber seks</title>
   <link href="http://room-303.com/blog/2005/11/09/a26bb1aefda1be395c6d6ed97675f347/"/>
   <updated>2005-11-09T00:31:01+00:00</updated>
   <id>http://room-303.com/blog/2005/11/09/a26bb1aefda1be395c6d6ed97675f347</id>
   <content type="html">&lt;p&gt;Dzisiejszy komiks jest sponsorowany przez wpół do drugiej w nocy i brak kawy.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/020-cyber-sex.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Planet PLD i FTP Traffic</title>
   <link href="http://room-303.com/blog/2005/11/08/87b9aba25eff5ddae134c197cd6bb5c8/"/>
   <updated>2005-11-08T18:44:22+00:00</updated>
   <id>http://room-303.com/blog/2005/11/08/87b9aba25eff5ddae134c197cd6bb5c8</id>
   <content type="html">&lt;p&gt;Wszystkich czytelników &lt;a href=&quot;http://planet.pld-linux.org/&quot;&gt;Planety &lt;abbr title=&quot;PLD Linux Distribution&quot;&gt;PLD&lt;/abbr&gt;&lt;/a&gt; przepraszam za chwilowy burdel, jaki powstał dziś na planecie - poprawiłem wszystkie błędy w składni generowanego &lt;abbr title=&quot;Really Simple Syndication&quot;&gt;RSS&lt;/abbr&gt; i Planeta wciągnęła wpisy jako zmienione (zmieniły się &lt;abbr title=&quot;Globally Unique Identifier&quot;&gt;GUID&lt;/abbr&gt;). Nie powinno się powtórzyć w przyszłości.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #019: Życie informatyka jest smutne</title>
   <link href="http://room-303.com/blog/2005/11/06/747ad8dc9bdd5d2225d4df67faeaa3b7/"/>
   <updated>2005-11-06T20:50:45+00:00</updated>
   <id>http://room-303.com/blog/2005/11/06/747ad8dc9bdd5d2225d4df67faeaa3b7</id>
   <content type="html">&lt;p&gt;Z góry przepraszam wszystkich, którzy nie zrozumnieją dzisiejszego odcinka, ale jest chyba najbardziej hermetycznym ze wszystkich dotychczasowych. Co smutniejsze, poniższa rozmowa miała miejsce w rzeczywistości.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/019-latex.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Nie każcie mi czytać bzdur</title>
   <link href="http://room-303.com/blog/2005/11/05/6aa2c770ab15fa5af0d6a5a3e289027d/"/>
   <updated>2005-11-05T18:40:36+00:00</updated>
   <id>http://room-303.com/blog/2005/11/05/6aa2c770ab15fa5af0d6a5a3e289027d</id>
   <content type="html">&lt;p&gt;Różne programy mają masę problemów z interfejsem, ale te bolesne i podstawowe powtarzają się nader często. To samo tyczy się też po części serwisów &lt;abbr title=&quot;World Wide Web&quot;&gt;WWW&lt;/abbr&gt; i aplikacji internetowych.&lt;/p&gt;

&lt;p&gt;Przede wszystkim, nikt nie chce być informowany o wszystkim. Jasne, nie mam nic przeciwko komunikatom lecącym na konsolę - są bardzo pomocne, kiedy coś przestaje działać, ale - do jasnej cholery - nie chcę widzieć okna dialogowego z informacją, że program chce pisać pod adresem &lt;code&gt;0xDEADBEEF&lt;/code&gt; i przyciskiem &lt;q&gt;Ok, mam to gdzieś&lt;/q&gt;. Jest tylko jedna rzecz, która mogłaby mi bardziej zepsuć przyjemność z używania aplikacji - pytanie mnie o zgodę przy każdej takiej czynności. Jeśli programu mają używać ludzie, to niech autor przyjmie sensowne wartości domyślne. Zwykłego użytkownika nie obchodzi, jak program działa i do czego próbuje uzyskać dostęp, nie bawi go zabawa z certyfikatami &lt;abbr title=&quot;Secure Socket Layer&quot;&gt;SSL&lt;/abbr&gt; i ma generalnie w dużym poważaniu wszystko, co nie jest &lt;em&gt;oczekiwanym&lt;/em&gt; efektem końcowym.&lt;/p&gt;

&lt;p&gt;Jeśli nagrywam płytę, to nie chcę wiedzieć, że jakiś bufor się napełnił. Jeśli słucham muzyki, to nie interesuje mnie pomyślne odnalezienie tagów z danymi autora i tytułem piosenki. Podobnie, jak jadąc samochodem nie chcę być informowany o pomyślnej zmianie biegów. Jasne, powiadom mnie o czymś, co trwa niesamowicie długo (dla typowego użytkownika &lt;q&gt;niesamowicie&lt;/q&gt; oznacza wszystko powyżej kilku sekund), ale zrób to w tym samym oknie, które pokazuje pasek postępu operacji (albo throbber, ale o tym napiszę kiedy indziej).&lt;/p&gt;

&lt;p&gt;Jeżeli masz jednak bardzo dobry powód, by pokazać mi wyskakujące okienko, to - u licha - nie czyń go modalnym. Wyobraź sobie, że jedziesz sobie właśnie rowerem, kiedy to na środku ulicy wyskakuje ci okienko z informacją o tym, że przejechany dystans sugeruje wizytę w przeglądzie. Zasłania kierownicę i blokuje hamulce. Nadjeżdżająca z naprzeciwka ciężarówka z pewnością mobilizuje cię do dokładnego zapoznania się z komunikatem przed jego zamknięciem.&lt;/p&gt;

&lt;p&gt;Tu pojawia się inna kwestia - skoro pokazujesz mi tyle wyskakujących komunikatów, że na ich zamykaniu spędzam niemal tyle czasu, co na właściwej pracy, to jak u licha wyłowię spośród nich te ważne? Czytanie wszystkich nie wchodzi w grę, a autorzy uwielbiają wręcz nadawać przyciskom wiele mówiące etykiety: &lt;q&gt;OK&lt;/q&gt; i &lt;q&gt;Anuluj&lt;/q&gt;. Widać umieszczenie tam napisów &lt;q&gt;Zapisz&lt;/q&gt; i &lt;q&gt;Porzuć zmiany&lt;/q&gt; wymaga nieprzebranych lat studiów w dziedzinie &lt;abbr title=&quot;Human-Computer Interaction&quot;&gt;HCI&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; zapomniałbym o moim ulubieńcu. Pochodzenia już sobie nie przypomnę, ale któryś program obdarzył mnie takim oto komunikatem: &lt;q&gt;Czy jesteś pewien, że nie chcesz zapisać zmian? Ok; Anuluj.&lt;/q&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Trzy kroki do szybszego bootowania PLD</title>
   <link href="http://room-303.com/blog/2005/11/04/d4aa8a9b9b1e5da3c68f73083cfecf12/"/>
   <updated>2005-11-04T19:29:42+00:00</updated>
   <id>http://room-303.com/blog/2005/11/04/d4aa8a9b9b1e5da3c68f73083cfecf12</id>
   <content type="html">&lt;p&gt;Przyglądałem się ostatnio projektom implementującym alternatywy dla naszych &lt;code&gt;rc-scripts&lt;/code&gt; i nasunęło mi się kilka pomysłów, które można ułożyć w logiczne etapy. Szczegóły poniżej.&lt;/p&gt;

&lt;h3&gt;Równoległe uruchamianie procesów&lt;/h3&gt;

&lt;p&gt;Pierwszym krokiem powinno być nauczenie naszych skryptów startowych bootowania równocześnie wszystkich procesów o równym priorytecie. Przez priorytet rozumiem kolejność bootowania, którą obsługuje &lt;code&gt;chkconfig&lt;/code&gt; (na tej podstawie nazywa symlinki w odpowiednich poziomach &lt;code&gt;init&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Najprościej rzecz ujmując, powinien uruchomić dla każdego z nich proces w tle i przed przejściem do procesów z wyższymi priorytetami poczekać, aż każdy z procesów potomnych się zakończy.&lt;/p&gt;

&lt;p&gt;Do wyświetlania efektów działania procesów potomnych potrzebny byłby jakiś wrapper, który buforowałby wyjście z procesu tak długo, aż ten się zakończy bądź sforkuje w tło, a następnie wyświetlał całość (w przeciwnym wypadku wyniki działania poszczególnych initskryptów mieszałyby się między sobą).&lt;/p&gt;

&lt;h3&gt;Oznaczenie zależności pomiędzy procesami&lt;/h3&gt;

&lt;p&gt;Następnie konieczne byłoby wprowadzenie wzajemnych zależności pomiędzy initskryptami. Wystarczyłoby wprowadzić dwa dodatkowe słowa kluczowe do komentarzy w nagłówku plików: &lt;code&gt;before:&lt;/code&gt; i &lt;code&gt;after:&lt;/code&gt;, które oznaczałyby, że dany skrypt powinien zostać wykonany odpowiednio przed lub po innym skrypcie. W ten sposób na przykład dostarczany przez pakiet &lt;code&gt;apache&lt;/code&gt; skrypt &lt;code&gt;httpd&lt;/code&gt; mógłby otrzymać:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;# after: mysql network pgsql&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Oznaczałoby to, że powinien zostać wykonany dopiero po każdym z wymienionych tam skryptów (jeśli dany skrypt w ogóle istnieje i jest przypisany do aktualnego poziomu &lt;code&gt;init&lt;/code&gt; - w przeciwnym wypadku powinien zostać zignorowany).&lt;/p&gt;

&lt;h3&gt;Nowy &lt;code&gt;chkconfig&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Ostatnim etapem byłoby napisanie nowego programu &lt;code&gt;chkconfig&lt;/code&gt;, który zamiast wpisanych na sztywno w skrypty priorytetów, uwzględniałby wprowadzone w poprzednim kroku zależności. Na tej podstawie procesy byłyby sortowane i przyznawane byłyby im priorytety i stosowne linki dla poziomów uruchomienia.&lt;/p&gt;

&lt;p&gt;Opcjonalnie, można napisać zupełnie niezależny od &lt;code&gt;chkconfig&lt;/code&gt; program, który będzie tylko aktualizował priorytety w nagłówkach plików startowych usług. Efekt końcowy będzie ten sam (choć kontrowersyjna może być modyfikacja samych skryptów - &lt;code&gt;rpm&lt;/code&gt; będzie je traktował tak, jakby zostały zmienione przez użytkownika).&lt;/p&gt;

&lt;p&gt;Procesy wzajemnie niezależne otrzymywałyby ten sam priorytet, przez co uruchamiane byłyby jednocześnie. Zniknęłyby sytuacje, gdzie jeden skrypt czeka na zakończenie innego, zupełnie z nim nie powiązanego. Powinno to zaowocować sporym przyspieszeniem całości procesu podnoszenia systemu.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Think future, think AJAX</title>
   <link href="http://room-303.com/blog/2005/11/04/c11145e270e89aceb6cf7008da5b2d96/"/>
   <updated>2005-11-04T08:39:46+00:00</updated>
   <id>http://room-303.com/blog/2005/11/04/c11145e270e89aceb6cf7008da5b2d96</id>
   <content type="html">&lt;p&gt;Masa ludzi odkrywa ostatnimi czasy &lt;q&gt;nowe&lt;/q&gt; możliwości współczesnych przeglądarek, największą popularnością wśród technologii opartych o JavaScript cieszy się zaś &lt;abbr title=&quot;Asynchronous JavaScript And XML&quot;&gt;AJAX&lt;/abbr&gt;. Wynalazek potężny, a im potężniejszy, tym bardziej podatny na nadużycia. O ile pierwsze masowo wykorzystujące &lt;abbr&gt;AJAX&lt;/abbr&gt; serwisy robiły to z całkiem uzasadnionych powodów (&lt;a href=&quot;http://maps.google.com/&quot;&gt;Google Maps&lt;/a&gt; i &lt;a href=&quot;http://gmail.google.com/&quot;&gt;GMail&lt;/a&gt; są wszak aplikacjami, a nie serwisami informacyjnymi), o tyle coraz częściej widzę strony, gdzie &lt;abbr&gt;AJAX&lt;/abbr&gt; został użyty, bo to &lt;abbr&gt;AJAX&lt;/abbr&gt;. Jest fajny, jest modny, wszędzie da się wcisnąć. Żeby pokazać, jak absurdalne są niektóre pomysły, przygotowałem własne, &lt;a href=&quot;http://patrys.icenter.pl/test/2005-10-27-ultimate-ajax-misuse/&quot;&gt;najgłupsze na świecie zastosowanie technologii &lt;abbr&gt;AJAX&lt;/abbr&gt;&lt;/a&gt;. Na szczęście na taki pomysł nikt jeszcze nie wpadł (a przynajmniej nic mi o tym nie wiadomo).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>PLD FTP Traffic</title>
   <link href="http://room-303.com/blog/2005/11/03/4e51c3c57609b6a6557dd9e79e782031/"/>
   <updated>2005-11-03T00:48:53+00:00</updated>
   <id>http://room-303.com/blog/2005/11/03/4e51c3c57609b6a6557dd9e79e782031</id>
   <content type="html">&lt;p&gt;Dzięki uprzejmej zgodzie &lt;a href=&quot;http://princefool.blogspot.com/&quot;&gt;Łukasza Jernasia&lt;/a&gt;, do którego należy maszyna zasilająca &lt;a href=&quot;http://planet.pld-linux.org/index_pl.html&quot;&gt;Planetę &lt;abbr&gt;PLD&lt;/abbr&gt;&lt;/a&gt;, od dzisiaj dostępna jest nowa usługa - &lt;a href=&quot;http://planet.pld-linux.org/poldek/poldek.rss&quot;&gt;kanał &lt;abbr title=&quot;Really Simple Syndication&quot;&gt;RSS&lt;/abbr&gt; dla ruchu &lt;abbr&gt;FTP&lt;/abbr&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Feed jest uaktualniany dwa razy dziennie i podłączyłem go na dobry początek do Planety. Skrypt obsługujący generowanie feedu napisałem przez 10 minut w bashu, więc zobaczymy, jak dobrze będzie się spisywał. Czekam na uwagi i zapraszam do subskrypcji. Przypominam, że kanał jest aktualizowany co 12 godzin, więc odświeżanie go co 2 minuty mija się z celem - szanujcie łącze Łukasza.&lt;/p&gt;

&lt;p&gt;Przy okazji Planety - jeśli ktoś z deweloperów &lt;abbr&gt;PLD&lt;/abbr&gt; prowadzi bloga, a nie jest tam syndykowany, to proszę się zgłaszać do mnie. Jestem opiekunem serwisu i chętnie podłączę.&lt;/p&gt;

&lt;p&gt;Jeden z nas jest teraz w wyjątkowo trudnej sytuacji życiowej, &lt;a href=&quot;http://mmazur.jogger.pl/&quot;&gt;Mariusz&lt;/a&gt;, jesteśmy z tobą.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #018: Sekrety alkowy Stallmana</title>
   <link href="http://room-303.com/blog/2005/11/01/a43b88315139a2fa076912c71a9962d9/"/>
   <updated>2005-11-01T23:09:32+00:00</updated>
   <id>http://room-303.com/blog/2005/11/01/a43b88315139a2fa076912c71a9962d9</id>
   <content type="html">&lt;p&gt;Notka na zamówienie &lt;a href=&quot;http://mrman.jogger.pl/&quot;&gt;mrmana&lt;/a&gt;, który ciągle narzeka.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/018-free-sex.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>SynPrezesa&trade; kontratakuje</title>
   <link href="http://room-303.com/blog/2005/11/01/8c484997f28e1c05468aaf36bda03bb4/"/>
   <updated>2005-11-01T11:07:31+00:00</updated>
   <id>http://room-303.com/blog/2005/11/01/8c484997f28e1c05468aaf36bda03bb4</id>
   <content type="html">&lt;p&gt;Jako, że od ponad roku nie mam przyjemności współpracować z SynemPrezesa&amp;trade; (a to za sprawą zakończenia współpracy z SamymPrezesem&amp;trade; z końcem wakacji ubiegłego roku), nowe notki pojawiają się raczej sporadycznie. Nie lękajcie się jednak, albowiem nie dość, że z bohaterem wszech czasów znajdujemy się na jednej uczelni, to jest także starostą mojej grupy (zwanym popularnie &lt;q&gt;sołtysem&lt;/q&gt;).&lt;/p&gt;

&lt;p&gt;Kiedy myśleliśmy już, że frekwencja na poziomie 40% jest dostatecznym osiągnięciem dla człowieka, który wszak jest SynemPrezesa&amp;trade;, z początkiem tego semestru udało mu się zadziwić nas ponownie.&lt;/p&gt;

&lt;p&gt;Podczas, gdy gro studentów zwykło w dziekanacie składać wszelakie prośby i wnioski niemalże błagalne, nasz nieustraszony Tytan nauki posłużył się elementem zaskoczenia. Złożył tedy - miast prośby - oświadczenie. Oświadczenie w charakterze zawiadomienia, że w związku z poszerzeniem swej rodziny (a chodzi mi o przyjęcie ślubu, a nie wchłonięcie wiadra pączków), zmienił on wiarę. Zdaje się, że na Adwentystów nawet. Wyznanie nie jest tu rzeczą najważniejszą, grunt, że odnalazł kruczek jakiś, który ma stanowić o niemożności nauki w soboty z przyczyn religijnych. Oświadczenie jego tymi właśnie słowy się kończyło.&lt;/p&gt;

&lt;p&gt;I nie byłoby w tym nic dziwnego i sprawa nadzwyczajną by się nie wydała, gdyby tylko zapomnieć, że obaj jesteśmy na studiach zaocznych.&lt;/p&gt;

&lt;p&gt;Morał: I powiedział Patrys - &lt;q&gt;a szkołę sobie na weekend znajdziecie. I będziecie dumni z uczelni, jako że w perspektywie dyplom inżyniera ona wam po siedmiu semestrach oferuje. A po siedmiu dobrych tygodniach nastąpi siedem tygodni zwiątpienia i odnajdziecie tedy metody, by na zajęcia nie uczęszczać. A najgorliwsi pośród was będą zaciekli w sposobów owych odnajdywaniu i będzie wśród nich jeden przodownik, a sołtysem obrany zostanie, co to nigdy na zajęciach się nie pojawi. I zapłacze on po latach, gdy okaże się, że za cenę siedmiu semestrów bez nauki, mógł on dyplom w tydzień jeden kupić. A zapłaczą również i imigranci zza wschodniej granicy, jako że czternaście tysięcy przejdzie im koło nosa.&lt;/q&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Update</title>
   <link href="http://room-303.com/blog/2005/10/31/06933067aafd48425d67bcb01bba5cb6/"/>
   <updated>2005-10-31T18:08:30+00:00</updated>
   <id>http://room-303.com/blog/2005/10/31/06933067aafd48425d67bcb01bba5cb6</id>
   <content type="html">&lt;p&gt;Korzystając z chwilowego (żart) powrotu Joggera, chciałem wyjaśnić ostatnie przepychanki w związku z tymże. Dużo osób (i to bardzo dla mnie wartościowych) wynosi się na swoje - to fakt. Ja się wynosić nie zamierzam, przynajmniej chwilowo. Napisałem, że pauzuję nie dlatego, że chcę uciekać, najzwyczajniej mam na głowie kilka innych projektów mniej lub bardziej komercyjnych. W tym kilka zupełnie nowych serwisów, których uruchomienie koordynuję bądź wspomagam. Wszystkim, którzy mnie &lt;q&gt;rzegnali&lt;/q&gt; (pisownia oryginalna), pragnę przekazać, że życzenia przedwczesne.&lt;/p&gt;

&lt;p&gt;Z projektów niezależnych pojawiło się też pisanie, bo &lt;a href=&quot;http://nbw.jogger.pl/&quot;&gt;nbw&lt;/a&gt; namówił mnie na pisanie na łamach &lt;a href=&quot;http://art.webesteem.pl&quot;&gt;Webesteem Art&amp;amp;Design Magazine&lt;/a&gt;. Można więc liczyć na to, że w jednym najbliższych numerów pojawi się coś mojego. Miłośnicy tekstów dotyczących tworzenia dla sieci powinni się ucieszyć.&lt;/p&gt;

&lt;p&gt;Przy okazji chciałem pozdrowić &lt;a href=&quot;http://koci-cien.blog.pl&quot; title=&quot;Kociee&quot;&gt;pewną przemiłą młodą damę&lt;/a&gt;, która była na tyle miła, by towarzyszyć mi przez ten weekend. Z planów wypicia piwa nic nie wyszło - ze względu na chwilowy, nagły zanik wszelkich sklepów monopolowych w sobotę, a także na płynne przejście pomiędzy zakupami i przystankiem &lt;abbr&gt;PKS&lt;/abbr&gt; (nazwijcie to czasoprzestrzenią) dziś rano. Co się tyczy tego drugiego - chyba żadna kobieta nie rozbierała się jeszcze przy mnie tyle razy jednego dnia ;). Więcej nie będę czynił aluzji, bo i tak już dostałem dziś raz torebką.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Flock - a social browser</title>
   <link href="http://room-303.com/blog/2005/10/21/2b6f3b7d3c806312dabaa28ff539d787/"/>
   <updated>2005-10-21T17:38:49+00:00</updated>
   <id>http://room-303.com/blog/2005/10/21/2b6f3b7d3c806312dabaa28ff539d787</id>
   <content type="html">&lt;p&gt;Żeby nie głodzić zainteresowanych, podczas chwilowego braku notek można poczytać o moich wrażeniach związanych z nową przeglądarką, o której ostatnio tak głośno. Moje starcia z &lt;a href=&quot;http://www.flock.com/&quot;&gt;Flockiem&lt;/a&gt; dostępne są &lt;a href=&quot;http://patrys.wordpress.com/&quot;&gt;na WordPress.com&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Pauza</title>
   <link href="http://room-303.com/blog/2005/10/17/7aa7725731234254407ba30ab0a3f6f2/"/>
   <updated>2005-10-17T19:04:25+00:00</updated>
   <id>http://room-303.com/blog/2005/10/17/7aa7725731234254407ba30ab0a3f6f2</id>
   <content type="html">&lt;p&gt;W związku ze stagnacją związaną z rozwojem obecnego silnika Joggera i ostatnią reakcją na &lt;a href=&quot;http://riddle.jogger.pl/comment.php?eid=156967&quot;&gt;naszą petycję&lt;/a&gt; (której nota bene byłem inicjatorem, bo Riddle już się boi, że ma nowych wrogów), postanowiłem zrobić sobie przerwę. Masa osób pytała mnie, czemu piszę i ja zawsze odpowiadałem, zgodnie z prawdą, że to lubię. Pisanie jest odskocznią od codziennych problemów, bo pozwala skupić się na jednym zagadnieniu i przez jakiś czas nie myśleć o reszcie świata. Pisanie pozwala zachować przynajmniej minimalne pojęcie o polskiej gramatyce, słownictwie i ortografii, o co trudno w świecie zdominowanym przez Gadu-Gadu i rozmowy z rodzaju &lt;q&gt;elo, co tam?&lt;/q&gt; Pisanie daje wreszcie możliwość uzyskania odzewu, który często jest źródłem bezcennej wiedzy, a niejednokrotnie pozwala spojrzeć na sprawę z zupełnie innej perspektywy. Pisanie daje niesamowitą satysfakcję, jednak przychodzi moment, kiedy okazuje się, że reszta świata ma do dyspozycji maszyny i elektryczność, a my nadal ślęczymy przy świecach z gęsim piórem w dłoni. Jogger jest świetny do pisania o tym, co zjadło się na śniadanie, ale mi już nie wystarcza.&lt;/p&gt;

&lt;p&gt;Nie kasuję bloga ani swojego konta i nadal mam zamiar śledzić i komentować cudze wpisy. Może nawet zdarzy mi się coś napisać, ale to już nie ta sama radość, co kiedyś. Poczekam do grudnia i mam nadzieję zobaczyć wtedy długo wyczekiwane drugie wcielenie silnika.&lt;/p&gt;

&lt;p&gt;Dla ciekawych - statystyki.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Przeciętnie przez dobę odwiedza mnie 180 osób (unikalnych komputerów, śledzenie za pomocą adresów &lt;abbr title=&quot;Internet Protocol&quot;&gt;IP&lt;/abbr&gt; i ciastek).&lt;/li&gt;
&lt;li&gt;We wrześniu przewinęło się tu was 3129, co przełożyło się na 11887 odsłon.&lt;/li&gt;
&lt;li&gt;Rekord pod tym względem padł w lipcu, kiedy to liczba klikniętych stron wyniosła 14248.&lt;/li&gt;
&lt;li&gt;20% z moich gości ma problemy z cerą, zaś pozostałych 80% korzysta z produktów Microsoft.&lt;/li&gt;
&lt;li&gt;46% z odwiedzających korzysta z Firefoksa, 33% z Internet Explorera 6.0, zaś 10% z Opery.&lt;/li&gt;
&lt;li&gt;70% korzysta z rozdzielczości 1024x768, co ciekawe, aż 10% używa wciąż 800x600.&lt;/li&gt;
&lt;li&gt;Obok &lt;q&gt;patrys&lt;/q&gt;, &lt;q&gt;pld&lt;/q&gt; i &lt;q&gt;smarty&lt;/q&gt;, najpopularniejszymi hasłami z wyszukiwarek są &lt;q&gt;kurt i albin&lt;/q&gt;, &lt;q&gt;nieśmiertelniki&lt;/q&gt; i &lt;q&gt;zakład pogrzebowy&lt;/q&gt;.&lt;/li&gt;
&lt;li&gt;119 osób dowiedziało się o tej notce za pomocą Jabbera.&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Jogger</title>
   <link href="http://room-303.com/blog/2005/10/15/a691a6ee86b26c9753f02ca3943cd48d/"/>
   <updated>2005-10-15T16:32:24+00:00</updated>
   <id>http://room-303.com/blog/2005/10/15/a691a6ee86b26c9753f02ca3943cd48d</id>
   <content type="html">&lt;p&gt;Ostatnio straciłem całą ochotę na pisanie. Jogger przez większość czasu nurza się w odmętach dysfunkcji, serwer-widmo powraca z impetem, by po chwili rozpłynąć się równie łatwo i bezszelestnie, co poranna mgła po chłodnej i wilgotnej nocy. Budzi się nagłymi zrywami, by jak dziecko, bez poczucia winy i odpowiedzialności, radośnie i beztrosko oznajmić mi, że ktoś dodał nową notkę lub że pojawił się nowy komentarz w jednym ze śledzonych przeze mnie wątków. Kiedy jednak zbiorę się w sobie i spróbuję przelać myśli na w miarę składny potok słów upstrzonych znacznikami &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt;, pierwsze kliknięcie na przycisk &lt;q&gt;podgląd&lt;/q&gt; rozwiewa wszelkie wątpliwości - &lt;q&gt;nie można odnaleźć strony&lt;/q&gt;.&lt;/p&gt;

&lt;p&gt;Dodatkowo, coraz bardziej doskwiera niedoskonałość technologiczna narzędzi. Z chęcią zobaczyłbym możliwość automatycznego pingowania centrów syndykacyjnych (takich jak Technorati) po dodaniu nowej notki. Równie miłym dodatkiem byłoby oznaczanie notek za pomocą słów kluczowych i możliwość filtrowania wyświetlanej treści za pomocą tychże. Niestety, Sparrow do dziś nie zgodził się na uwolnienie kodu źródłowego systemu leżącego u podstaw całego zamieszania. Może czas zacząć zbierać podpisy?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; akcja ruszyła i można ją wesprzeć &lt;a href=&quot;http://riddle.jogger.pl/comment.php?eid=156967&quot;&gt;na blogu Riddle'a&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>K2</title>
   <link href="http://room-303.com/blog/2005/10/12/ecebd75fc367b9aa41be06278689dc63/"/>
   <updated>2005-10-12T23:20:28+00:00</updated>
   <id>http://room-303.com/blog/2005/10/12/ecebd75fc367b9aa41be06278689dc63</id>
   <content type="html">&lt;p&gt;Kolejny szablon WordPressa padł moją ofiarą. Przedstawiam zatem K2 autorstwa &lt;a href=&quot;http://binarybonsai.com/&quot;&gt;Michaela Heilemanna&lt;/a&gt; i &lt;a href=&quot;http://www.chrisjdavis.org/&quot;&gt;Chrisa J. Davisa&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Wersja pobieralna znajduje się &lt;a href=&quot;http://wirusy.room-303.com/Jogger/K2/&quot;&gt;na moim serwerze&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Do tego obowiązkowy &lt;a href=&quot;http://wirusy.room-303.com/Jogger/K2/k2.png&quot;&gt;zrzut ekranu&lt;/a&gt;, choć poklikać można też na żywo &lt;a href=&quot;http://patrys-dev.jogger.pl/&quot;&gt;w mojej piaskownicy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Jak zwykle, szablon jest objęty GPL.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Spacja spacja spacja spacja tytuł</title>
   <link href="http://room-303.com/blog/2005/10/11/aedabda142c60b8f3e85284e83e40c42/"/>
   <updated>2005-10-11T20:49:26+00:00</updated>
   <id>http://room-303.com/blog/2005/10/11/aedabda142c60b8f3e85284e83e40c42</id>
   <content type="html">&lt;p&gt;Specyfikacja &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt; zawiera obiekt encji reprezentującej niełamliwy znak pusty. Zna ją każdy, to &lt;code&gt;&amp;amp;nbsp;&lt;/code&gt;. Znak ten od wielu, wielu lat jest horrorem internetu, a to za sprawą tego, że zna go bardzo dużo osób, znacznie więcej niż tych, którzy znają jego semantykę.&lt;/p&gt;

&lt;p&gt;Niełamliwa spacja &lt;em&gt;nie służy&lt;/em&gt; do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;wcinania akapitów tekstu&lt;/li&gt;
&lt;li&gt;środkowania tytułów&lt;/li&gt;
&lt;li&gt;odsuwania od siebie słów czy elementów&lt;/li&gt;
&lt;li&gt;rozciągania komórek tabel&lt;/li&gt;
&lt;li&gt;tworzenia sztucznych marginesów&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Niełamliwa spacja jest dokładnie tym, co sugeruje jej nazwa - spacją, która nie powinna zostać wykorzystana jako miejsce zawijania tekstu. Jej poprawne użycie to rozdzielenie dwóch słów, na przykład członów nazwy firmy bądź adresu, które powinny występować obok siebie w jednej linii. Jeśli chcesz jej użyć do formatowania długich ciągów słów (jak kod programu), to wiedz, że właśnie używasz młotka do wkręcania śrubek, do tego służy &lt;abbr title=&quot;Cascading Style Sheets&quot;&gt;CSS&lt;/abbr&gt; i &lt;code&gt;white-space: nowrap&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Największym błędem definicji niełamliwej encji było przyjęcie, że spacje te nie powinny podlegać regule zwijania nadmiarowego odstępu.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Standards: the final frontier</title>
   <link href="http://room-303.com/blog/2005/10/11/284646b152d24e50977d484b968b300b/"/>
   <updated>2005-10-11T18:58:58+00:00</updated>
   <id>http://room-303.com/blog/2005/10/11/284646b152d24e50977d484b968b300b</id>
   <content type="html">&lt;p&gt;W codziennej pracy niejednokrotnie doskwiera nam brak właściwych materiałów referencyjnych, dotyczących realnych korzyści płynących z rozwiązań opartych na standardach. Utrudnia to przekonywanie tak klientów, jak i własnych pracodawców do wykonania kroku we właściwą stronę. Samo &lt;a href=&quot;http://w3.org/&quot;&gt;&lt;abbr title=&quot;World Wide Web Consortium&quot;&gt;W3C&lt;/abbr&gt;&lt;/a&gt; celuje bardziej w inżynierów implementujących protokoły i formaty, niż w ludzi wykorzystujących je w swoich rozwiązaniach, stąd surowy i nieprzystępny charakter publikowanych przez nich informacji nie powinien dziwić. Z drugiej strony, coraz częściej docierają do nas głosy, że skoro na Joggerze publikujemy artykuły o podobnej tematyce, powinniśmy zrobić coś razem. Postanowiliśmy więc zawiązać akcję, mającą na celu informowanie o konkretnych plusach rozwiązań nowoczesnych, a jednocześnie ustandaryzowanych, które z pozoru mogą się wydawać cięższe do wdrożenia niż przestarzałe dziś metody, wykorzystujące prezentacyjny charakter dokumentu.&lt;/p&gt;

&lt;p&gt;Patrys i &lt;a href=&quot;http://nbw.jogger.pl/&quot;&gt;nbw&lt;/a&gt; prezentują zatem: &lt;a href=&quot;http://gallery.room-303.com/Varia/WebStandards/standardysieciowe2.jpg?orig=1&quot;&gt;standardy sieciowe&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Dostępna jest też &lt;a href=&quot;http://gallery.room-303.com/Varia/WebStandards/&quot;&gt;oficjalna strona akcji&lt;/a&gt;. Za efekty nie ręczymy. &lt;abbr title=&quot;Not Suitable For Work&quot;&gt;NSFW&lt;/abbr&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Wyższa Szkoła Informatyki i Zarządzania - Copernicus</title>
   <link href="http://room-303.com/blog/2005/09/30/822b6a92454b8f378fb9e39eb33ec1e0/"/>
   <updated>2005-09-30T20:52:48+00:00</updated>
   <id>http://room-303.com/blog/2005/09/30/822b6a92454b8f378fb9e39eb33ec1e0</id>
   <content type="html">&lt;p&gt;Model biznesowy mojej nieszczęsnej szkoły (a traktuję ją bardziej jak miejsce ucieczki przed armią naszą niepokonaną, niż jako źródło jakiejkolwiek wiedzy) z całą pewnością jeszcze niejednokrotnie mnie w życiu zaskoczy, choć przyznać muszę, że ich ostatni wybryk powalił mnie na kolana.&lt;/p&gt;

&lt;p&gt;Jako całkiem niezły (uchwalono decyzją jednoosobowej komisji ze mną w składzie) informatyk w ogólnym tego słowa znaczeniu, z przedmiotami kierunkowymi daję sobie radę całkiem nieźle. Pozostałe, jak mikroekonomia, makroekonomia, podstawy prawa Unii Europejskiej, czy marketing, zaliczam w okolicach oceny dostatecznej. Niestety, ostatnio noga powinęła mi się na egzaminie z podstaw i metod zarządzania. Cóż - zdarza się - pomyślałem i zacząłem przygotowania do egzaminu poprawkowego. Główna bolączka tej sytuacji to utrata uprawnień do pobierania stypendium, ale nie przejąłem się tym specjalnie po informacji, że stypendium za lipiec otrzymam najwcześniej w listopadzie. Niechybnie pieniądze za kolejny semestr wpłynęłyby już na konto moich wnuków (a nadmienić należy, że póki co nic nie wiadomo mi o ich istnieniu).&lt;/p&gt;

&lt;p&gt;Na egzamin poprawkowy wyruszyłem pewny siebie i całkowicie odstresowany - nie ma co się bać na zapas, a - w razie czego - został mi jeszcze jeden termin. Zapłaciłem też z dwudniowym wyprzedzeniem 50 &lt;abbr&gt;PLN&lt;/abbr&gt; za możliwość przystąpienia do wyżej wspomnianego. Jak każdy cywilizowany informatyk, pieniądze puściłem eliksirem przez internet. Jakież było moje zdziwienie, gdy okazało się, że szalenie miła (czytaj: arogancka) pani w dziekanacie stanowczo odmówiła mi wydania potwierdzenia dokonania opłaty (a biurokracja w owej placówce oświaty stanowi, że bez owego świstka nie powinienem nawet pokazywać się na oczy egzaminatorowi). Otóż pani skarbnik niefartownie udała się na zaplanowany urlop wypoczynkowy, toteż na uczelni zapanował nieopisany wprost chaos, a najtęższe nawet umysły bez jej pomocy nie były w stanie określić, czy faktycznie zapłaciłem. &lt;q&gt;Trzeba było iść zapłacić na poczcie&lt;/q&gt; - usłyszałem na pociechę. &lt;q&gt;Do egzaminu nie może pan przystąpić, ale za to nie potrącimy panu opłaty za drugi termin, bo do pierwszego pan nie przystępuje.&lt;/q&gt; Cóż, dobre i to.&lt;/p&gt;

&lt;p&gt;Drugi termin egzaminu wypadł w sobotę, 24. września. Z głową pełną wiedzy na temat strategii, taktyki i planowania, a także więcej niż świadom zagadnień związanych z różnymi stylami zarządzania, wyruszyłem dziarsko w kierunku uczelni. Prewencyjnie przyjechałem z lekkim wyprzedzeniem, by odebrać zaległą karteczkę - swoją przepustkę do krainy szczęścia. Niczym klapa od sedesu w podmiejskim szalecie, szczęka moja opadła w pobliże obuwia, kiedy to ta sama pani przekazała mi kolejny radosny komunikat. &lt;q&gt;Nie może pan przystąpić do egzaminu, przecież zapłacił pan tylko za pierwszy termin. Drugi ma pan nieopłacony.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;To niesamowite, jak ludzkie poglądy potrafią się zreformować na przestrzeni zaledwie dwóch miesięcy. Przypomniałem jej tedy zeznania, jakie złożyła w mojej obecności, a o których mowa w poprzednim akapicie. &lt;q&gt;To z pewnością nie byłam ja, to pewnie moja koleżanka się nie zna i tak panu powiedziała.&lt;/q&gt; Powstrzymałem się z trudem, aby nie dodać &lt;q&gt;tak, pewnie dzwoniła do mnie z urlopu.&lt;/q&gt; Pani posunęła się w swych żartach dalej i zasugerowała mi, że mogę jeszcze zapłacić w kwesturze, a w ogóle to &lt;q&gt;trzeba było w pierwszym terminie iść zapłacić na poczcie.&lt;/q&gt; W związku z tym, że pod koniec miesiąca rzadko miewam nadmiarowe fundusze, gotówki do szkoły nie noszę, kwestura kart nie akceptuje, a &lt;em&gt;ja już zapłaciłem za ten egzamin&lt;/em&gt;, podziękowałem i za tę opcję.&lt;/p&gt;

&lt;p&gt;Dowiedziałem się, że moja niesubordynacja spowoduje konieczność powtarzania przedmiotu w kolejnym semestrze, co wiąże się z koniecznością zapłacenia dodatkowo 200 &lt;abbr&gt;PLN&lt;/abbr&gt;. Niestety, do dziś nie wiem, za co zapłaciłem poprzednich 50, bo jeśli traktować układ pomiędzy mną a szkołą jak tradycyjną relację klient-dostawca usług, to żadnej usługi w zamian nie uświadczyłem, nie licząc oczywiście humorów pracownicy dziekanatu. Uśmiechnąłem się wtedy tak sztucznie, jak tylko byłem w stanie się uśmiechnąć i udałem się w kierunku drzwi. Pani zawołała za mną jeszcze: &lt;q&gt;i co, zamierza pan iść na egzamin bez zezwolenia?&lt;/q&gt; Bez wahania odpowiedziałem zatem: &lt;q&gt;nie, zamierzam napisać na panią skargę.&lt;/q&gt; Na jej pełne zdziwienia &lt;q&gt;słucham?&lt;/q&gt; wyrwało mi się (przy rektorze) już tylko głośne &lt;q&gt;p!3#dol się.&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Gdybym ja w ten sposób traktował swoich klientów, to dziś jedyne płyty, jakich bym słuchał, byłyby jednocześnie elementami nośnymi któregoś z wrocławskich mostów. Nie mówię już o tym, że żywiłbym się wyłącznie produktami w stu procentach naturalnymi, jak gąsienice, gołębie i niedopałki. Niestety, zasada płacisz-wymagasz nie obowiązuje w szkolnictwie.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Krótko o zbyt nowoczesnych technologiach</title>
   <link href="http://room-303.com/blog/2005/09/27/0c662a457a95dce9aa9fb54e0934add6/"/>
   <updated>2005-09-27T18:07:08+00:00</updated>
   <id>http://room-303.com/blog/2005/09/27/0c662a457a95dce9aa9fb54e0934add6</id>
   <content type="html">&lt;p&gt;Jeśli decydujesz się na używanie &lt;abbr title=&quot;Extensible HyperText Markup Language&quot;&gt;XHTML&lt;/abbr&gt;, to wybierz wersję 1.0. Wszystko jedno, czy zdecydujesz się na wersję przejściową (transitional) czy ścisłą (strict), będzie to lepszy wybór niż wersja 1.1. Przeżyłem dziś starcie z jednym z naszych kontraktowych współpracowników (pisałem już, że ostatnio większość szablonów trafia do pocięcia na outsourcing) i chciałbym swoje argumenty przytoczyć również poniżej.&lt;/p&gt;

&lt;p&gt;Powodów preferowania wersji 1.0 może być kilka, przede wszystkim &lt;abbr&gt;XHTML&lt;/abbr&gt; 1.1 wymaga serwowania jako typ &lt;abbr title=&quot;Multipurpose Internet Mail Extensions&quot;&gt;MIME&lt;/abbr&gt; &lt;code&gt;application/xhtml+xml&lt;/code&gt;. Typ ten nie jest obsługiwany przez przeglądarkę Internet Explorer i powoduje w niej wyświetlenie kodu źródłowego dokumentu.&lt;/p&gt;

&lt;p&gt;Po drugie, &lt;abbr&gt;XHTML&lt;/abbr&gt; 1.1 wymaga ścisłej kontroli składni &lt;abbr title=&quot;Extensible Markup Language&quot;&gt;XML&lt;/abbr&gt; i jakikolwiek błąd zatrzymuje caly proces przetwarzania strony. O ile z naszego punktu widzenia (jako programistów), poprawna składnia języka jest jak najbardziej pożądana, o tyle różne systemy publikacji treści pozwalają końcowemu użytkownikowi na zepsucie kodu w większym lub mniejszym stopniu. Z punktu marketingowego nie wygląda to najlepiej - klient wkleja tekst z Worda i strona umiera, a u konkurencji wszystko działa. Szczerze mówiąc, boję się, że to właśnie będzie największy problem przy szerszej popularyzacji formatów opartych na &lt;abbr&gt;XML&lt;/abbr&gt; - nie potrafią wybaczać błędów (świat byłby dziś rajem, gdyby było to regułą już przy pierwszych wersjach &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt;).&lt;/p&gt;

&lt;p&gt;Poza tym, jedyna przewaga wersji 1.1 nad poprzedniczką jest możliwość łatwego rozszerzania języka, co przy braku wsparcia ze strony powszechnie używanych agentów nie jest żadnym argumentem.&lt;/p&gt;

&lt;p&gt;Mówiąc krócej - nie zawsze warto żyć na krawędzi i chwytać się wszystkich nowości, warto poczekać, aż dostęp do nich uzyska przynajmniej zadowalająca część z naszych potencjalnych odbiorców.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Nie mów nie Explorerowi</title>
   <link href="http://room-303.com/blog/2005/09/26/6aee93f60097e74a48c2ac81815e0cf0/"/>
   <updated>2005-09-26T20:05:01+00:00</updated>
   <id>http://room-303.com/blog/2005/09/26/6aee93f60097e74a48c2ac81815e0cf0</id>
   <content type="html">&lt;p&gt;Nie popierałem i nie popieram akcji takich jak &lt;a href=&quot;http://pl.designhappy.org/&quot;&gt;DesignHappy&lt;/a&gt;. Dlaczego? Dają leniwym i niedouczonym &lt;q&gt;webmasterom&lt;/q&gt; pretekst do kiepskiego budowania serwisów. Spora grupa ludzi zupełnie nie pojmuje założeń tego typu akcji i buduje strony, które rozjeżdżają się zupełnie w przeglądarkach innych niż Firefox i Opera.&lt;/p&gt;

&lt;p&gt;Jednym z głównych argumentów kampanii promującej tandem &lt;abbr title=&quot;Extensible HyperText Markup Language&quot;&gt;XHTML&lt;/abbr&gt; + &lt;abbr title=&quot;Cascading Style Sheets&quot;&gt;CSS&lt;/abbr&gt; jest zwiększone wsparcie dla przeglądarek tak przyszłych, jak i obecnych. Cóż to za wsparcie, jeśli dla 90% użytkowników sieci serwis wygląda jak efekt zabawy trzylatka z nożyczkami. To dostarcza tylko kolejnych głosów przeciwko standardom - &lt;q&gt;obiecywali lepsze serwisy, a najprostszego układu się nie da zrobić.&lt;/q&gt; Sam coraz częściej słyszę: &lt;q&gt;Wy poważnie używanie czystego &lt;abbr&gt;CSS&lt;/abbr&gt;? &lt;em&gt;Przecież tam nic nie działa!&lt;/em&gt;&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Sam chętnie przerwałbym wsparcie dla &lt;abbr title=&quot;Internet Explorera&quot;&gt;IE&lt;/abbr&gt; (a wspieramy go wstecz do wersji 5.5), jednak z pewnością nie do momentu, kiedy przestaną go używać odwiedzający serwisy użytkownicy. Standardy to między innymi większa dostępność, a lenistwo nie jest usprawiedliwieniem dla serwowania większości użytkowników sieczki.&lt;/p&gt;

&lt;p&gt;Co się zaś tyczy stron prywatnych, to świadomi standardów sami zdecydują, jak zakodować swoje strony domowe. Wątpię też, żeby czyjakolwiek strona zachęciła większą grupę ludzi do przesiadki na nowoczesną przeglądarkę. W dużo przyjaźniejszym tonie jest zakodować stronę tak, by działała wszędzie i umieścić na niej napis: &lt;q&gt;jeżeli używasz przeglądarki Internet Explorer w wersji 6 lub starszej, to wiedz, że ze względu na jej przestarzałość, włożyłem dodatkową pracę, by witryna ta wyświetlała się prawidłowo. Zrób nam obu przysługę i przesiądź się na jedną z &lt;a href=&quot;http://browsehappy.pl/&quot; title=&quot;BrowseHappy&quot;&gt;nowocześniejszych alternatyw&lt;/a&gt;. Będziesz zadowolony, słowo, a dzięki tobie sieć stanie się lepszym miejscem.&lt;/q&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strony wielojęzyczne</title>
   <link href="http://room-303.com/blog/2005/09/22/4972414550562303836b9532bebe0e52/"/>
   <updated>2005-09-22T18:32:01+00:00</updated>
   <id>http://room-303.com/blog/2005/09/22/4972414550562303836b9532bebe0e52</id>
   <content type="html">&lt;p&gt;Jako, że przyjęliśmy Europę w poczet krajów słowiańskich, coraz większą popularnością cieszą się witryny wielojęzyczne. Wiąże się z tym kilka problemów, które dobrze jest rozwiązać już na etapie planowania i projektowania, gdyż późniejsze radzenie sobie z nimi rodzi coraz więcej kłopotów.&lt;/p&gt;

&lt;p&gt;Pierwsza sprawa to domyślna wersja językowa - wielu ludzi zastanawia się, czy stronę domyślnie wyświetlać po polsku, gdyż większość odbiorców operuje tym właśnie językiem, czy może po angielsku, by obcokrajowcy nie uciekli na widok krzaczków i szlaczków. Odpowiedź jest prosta - należy skorzystać z mechanizmów negocjacji zawartości dostarczanych przez sam protokół &lt;abbr title=&quot;HyperText Transport Protocol&quot;&gt;HTTP&lt;/abbr&gt;. Przeglądarka wraz z żądaniem wysłania dokumentu podaje również listę języków i stopień ich preferowania (parametr &lt;q&gt;q&lt;/q&gt;, podawany w skali od 0 do 1). Różne przeglądarki zachowują się różnie - niektóre nie podają listy preferencji wcale, inne nie definiują stopnia preferowania danego języka lub jego odmiany (bo &lt;code&gt;en&lt;/code&gt; jest czym innym niż &lt;code&gt;en-US&lt;/code&gt;, o czym za chwilę). Standard mówi, że jeśli nie jest używana skala preferencji, to obowiązująca jest kolejność, w jakiej języki zostały podane - od najważniejszego, do najmniej ważnego. Podobnie jest, jeśli kilka języków posiada taki sam współczynnik &lt;q&gt;q&lt;/q&gt;.&lt;/p&gt;

&lt;p&gt;Przed wybraniem wersji językowej należy więc przesortować języki według ich zadeklarowanego stopnia preferowania (nie jest określona kolejność, w jakiej przeglądarki wysyłają listę języków, więc te o najniższym współczynniku preferencji mogą pojawić się równie dobrze na początku, w środku, jak i na końcu listy). Następnie iterując po elementach listy należy sprawdzić, czy nasz serwis oferuje daną wersję i - jeśli tak, wysłać ją do przeglądarki i przerwać dalsze testy. Specjalna uwaga dotyczy języków o &lt;q&gt;q&lt;/q&gt; równym 0 - &lt;em&gt;zerowy współczynnik &lt;q&gt;q&lt;/q&gt; oznacza, że internauta pod żadnym pozorem nie życzy sobie oglądać stron w danym języku&lt;/em&gt;. Druga uwaga jest na temat odmian języka - jeśli agent wysłał sam identyfikator języka, bez podtypu, to jako pasującą uznaje się każdą odmianę danego języka (na przykład &lt;code&gt;en&lt;/code&gt; pasuje tak do &lt;code&gt;en-us&lt;/code&gt;, jak do &lt;code&gt;en-gb&lt;/code&gt;, jeśli akurat te dwie odmiany oferujemy) - zasada ta nie ma zastosowania w drugą stronę, jeśli internauta domaga się konkretnej odmiany języka, to jako pasującą uznaje się tylko tę jedną konkretną.&lt;/p&gt;

&lt;p&gt;Co jeśli żadna z oferowanych przez nas wersji nie pasuje do listy wysłanej w nagłówkach przez agenta? Powinniśmy wybrać ten język, którego będzie używać największa grupa naszych odwiedzających. Oczywiście, dla niektórych (na przykład tych z nieprawidłowo skonfigurowanymi przeglądarkami) będzie to błędny wybór, jednak tutaj znajduje zastosowanie inny mechanizm - przełączanie języków w locie.&lt;/p&gt;

&lt;p&gt;Z przełączaniem w locie (za pomocą linków na stronie) wiąże się najwięcej problemów. Oczywiście metoda ta musi mieć pierwszeństwo przed negocjacją języka (wyobraźmy sobie Polaka, który ogląda nasz serwis za pośrednictwem komputera w niemieckiej kafejce i jego frustrację, kiedy okazuje się, że sklep, który ma pod domem, uparcie uszczęśliwia go stroną w języku obcym). Najpopularniejszą metodą jest zastosowanie ciasteczek i zapisywanie w nich tłumaczenia, jak jednak zmienić wersję językową? Część rynku zaskarbiły sobie szkaradne ikonki z flagami państw, choć same tworzą więcej problemów niż rozwiązują.&lt;/p&gt;

&lt;p&gt;Ikona flagi z definicji przywiązana jest do konkretnego kraju (lub regionu, jak nadużywana powszechnie ikona Zjednoczonego Królestwa, mylnie nazywana flagą Anglii). Problem polega na tym, że języki do krajów przywiązane nie są, stąd frustracja sporej części mieszkańców Kanady, którzy nawykli już do klikania ikonki symbolizującej małe państwo żabojadów, o którym słyszeli kiedyś, że leży na drugim końcu świata. Nie wszystkie kraje darzą się sympatią, a konieczność klikania flagi &lt;q&gt;sąsiada&lt;/q&gt; kłóci się u niektórych z odczuciami patriotycznymi. Dlatego właśnie najlepszym rozwiązaniem jest użycie linków tekstowych. Co na nich napisać? Nazwę danego języka &lt;em&gt;w danym języku&lt;/em&gt; (chyba, że cieszy cię wizja odwiedzenia strony międzynarodowej korporacji z siedzibą w &lt;abbr title=&quot;Republice Południowej Afryki&quot;&gt;RPA&lt;/abbr&gt; i poszukiwanie angielskiej wersji pośród dwudziestu linków na oko wyglądających jak jedno z afrykańskich narzeczy. Jedno jest pewne, każdy zna nazwę własnego języka, choć nie każdy musi znać jej wszystkie tłumaczenia.&lt;/p&gt;

&lt;p&gt;Kolejna rzecz to sam mechanizm przełączania wersji - popularna metoda polega na zapisaniu ciasteczka i przerzuceniu agenta na tę samą stronę, która w zależności od zawartości ciasteczka wyświetli się w jednym bądź drugim języku. O ile metoda ta działa dla żywych odwiedzających, o tyle nie sprawdza się w przypadku robotów i wyszukiwarek. Nieraz już zdarzało nam się poprawiać serwisy, których klienci skarżyli się, że Google zaindeksował trzy czwarte podstron &lt;q&gt;po arabsku&lt;/q&gt;. Najlepiej, gdyby każdy dokument posiadał unikalny &lt;abbr title=&quot;Uniform Resource Indicator&quot;&gt;URI&lt;/abbr&gt; - to zapewni pełne indeksowanie zawartości dla każdego z języków i zaowocuje znacznie lepszą pozycją w wynikach wyszukiwania.&lt;/p&gt;

&lt;p&gt;Oprócz problemów czysto technicznych, istnieje jeszcze cała masa problemów logicznych. Są to między innymi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;format wyświetlania dat (zależy to od kraju i niezależnie od wybranego formatu, część ludzi będzie się zastanawiać, czy chodzi o pierwszego lutego, czy drugiego stycznia)&lt;/li&gt;
&lt;li&gt;sposób podawania godzin (konieczne jest wybranie i podanie strefy czasowej)&lt;/li&gt;
&lt;li&gt;dostosowanie formularzy (na zachodzie modne jest pytanie o tytuł, z jakim należy się do klienta zwracać - niestety, tytuły takie nie funkcjonują we wszystkich kręgach kultorowych, a tam gdzie działają, ich liczba jest różna; amerykanie często popełniają błąd prosząc o &lt;q&gt;zipcode&lt;/q&gt; w angielskiej wersji serwisów, podczas gdy reszta świata używa kodów pocztowych)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Problemy te jednak znacznie odbiegają od głównej treści notki, więc jeśli będę o nich pisał szerzej, to zdecydowanie przy innej okazji.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Rant</title>
   <link href="http://room-303.com/blog/2005/09/19/ac4d9098db8818447756b754614624fc/"/>
   <updated>2005-09-19T17:36:22+00:00</updated>
   <id>http://room-303.com/blog/2005/09/19/ac4d9098db8818447756b754614624fc</id>
   <content type="html">&lt;p&gt;Nic mnie tak nie denerwuje, jak przeczesywanie statystyk w poszukiwaniu komentarzy do swoich notek. Po to istnieje możliwość komentowania ich na miejscu, żeby zostawianie swoich opinii nie wymagało zewnętrznych serwisów. Rozumiem, że niektórych irytuje brak obsługi &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt;, że pole jest małe. Oczywiście, można napisać odpowiedź w formie notki na własnym blogu, ale przy braku wsparcia dla łączy typu trackback i pingback, etykieta każe &lt;em&gt;zostawić &lt;abbr title=&quot;Uniform Resource Identifier&quot;&gt;URI&lt;/abbr&gt; odpowiedzi w komentarzach na stronie z oryginalnym tekstem&lt;/em&gt;. W ten sposób śledzenie dyskusji nie wymaga talentów telepatycznych. Jest to tym bardziej trudne, że denne statystyki &lt;a href=&quot;http://stat.pl/&quot; rel=&quot;nofollow&quot;&gt;stat.pl&lt;/a&gt; z nieznanych mi przyczyn nie logują query string, więc w przypadku większości for internetowych mogę tylko pomarzyć o zlokalizowaniu wątku.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Standardy i standardy w sieci</title>
   <link href="http://room-303.com/blog/2005/09/17/217a57846a3ec9f6f19ae520af01ba81/"/>
   <updated>2005-09-17T19:13:12+00:00</updated>
   <id>http://room-303.com/blog/2005/09/17/217a57846a3ec9f6f19ae520af01ba81</id>
   <content type="html">&lt;p&gt;O ile robię wszystko, co w mojej mocy, żeby popularyzować wsparcie dla standardów i poprawianie usability w sieci, nie każdy przypadek jest taki sam i nie zawsze można ślepo stosować te same reguły.&lt;/p&gt;

&lt;p&gt;W większości przypadków faktycznie, powinno się ograniczyć technologie wspierające (czyli tak naprawdę wszystko poza &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt;) do minimum, zapewniając tym samym jak najlepszą dostępność do informacji dla osób korzystających z różnych urządzeń i oprogramowania. Nie chcemy przecież któregoś dnia zalogować się do swojego systemu bankowego tylko po to, żeby dowiedzieć się, że brakuje nam 16 wtyczek, z czego 8 nie jest dostępnych dla naszej platformy (co jest coraz powszechniejszym problemem, nie dotyczy już tylko urządzeń przenośnych, ale także komputerów pracujących na procesorach rodzin &lt;abbr title=&quot;Advanced Microchip Devices&quot;&gt;AMD&lt;/abbr&gt;64 i &lt;abbr title=&quot;PowerPC&quot;&gt;PPC&lt;/abbr&gt;). Wszystko jest jednak warunkowane przez target, dla którego przeznaczony jest nasz produkt.&lt;/p&gt;

&lt;p&gt;Głupotą byłoby zrezygnowanie z technologii takich jak Flash, czy zagnieżdżone wideo na stronach reklamujących najnowszą grę komputerową - serwis tego typu jest przeznaczony dla wąskiej grupy odbiorców, raczej nie grozi nam nawał użytkowników uzbrojonych w telefony komórkowe, &lt;abbr title=&quot;Personal Digital Assistant&quot;&gt;PDA&lt;/abbr&gt; czy konsolowe przeglądarki pracujące pod kontrolą systemów uniksowych. Zwłaszcza, jeśli gra przeznaczona jest dla jednej konkretnej platformy. Jej podstawową funkcją jest pokazanie odwiedzającym namiastki tego, co znajdą w reklamowanym produkcie, stąd zastosowanie znajdą tam najnowsze technologie multimedialne.&lt;/p&gt;

&lt;p&gt;Podobna sytuacja ma miejsce w przypadku aplikacji webowych. Zamknięte systemy, wymagające logowania, takie jak intranety, ekstranety czy panele kontrolne &lt;abbr title=&quot;Content Management System&quot;&gt;CMS&lt;/abbr&gt; służą jedynie swoim użytkownikom. Nie musimy martwić się tym, że zostaną nieprawidłowo zaindeksowane przez wyszukiwarki, a układ hierarchiczny z definicji nie przypomina typowej strony internetowej. Wszechobecne formularze i układ aplikacyjny z definicji dyktują strukturę dokumentów, która często nie może być tak czysta, jak w przypadku zwykłych serwisów - musi sprostać projektowi graficznemu, który niejednokrotnie bardziej przypomina aplikację rodem z pakietu &lt;abbr title=&quot;Microsoft&quot;&gt;MS&lt;/abbr&gt; Office niż dokument stworzony w &lt;abbr&gt;HTML&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;Tutaj znajdują zastosowanie gorące nowinki ze świata, z modnym ostatnio hasłem &lt;abbr title=&quot;Asynchronous Javascript And XML&quot;&gt;AJAX&lt;/abbr&gt; na czele. Jeśli aplikacja ma wyglądać jak zwykły program, to funkcjonalność typu drag-n-drop z zapisywaniem danych w locie (bez przeładowania) jest dla użytkownika czymś naturalnym. W przeciwieństwie do usability typowych stron, w kwestii aplikacji standardy wyznacza &lt;a href=&quot;http://www.rubyonrails.org/&quot;&gt;Ruby on Rails&lt;/a&gt; i świetny framework &lt;a href=&quot;http://script.aculo.us/&quot;&gt;script.aculo.us&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Kwestia wsparcia dla przeglądarek z wyłączonym &lt;abbr title=&quot;JavaScript&quot;&gt;JS&lt;/abbr&gt; nie jest problemem, sprzedajemy program i ma on swoje wymagania. Nikt nie oczekuje, że Windows XP zacznie działać na 286, nikt też nie narzeka, że najnowsze mordobicie na konsolę nie nadaje się do użytku po wyłączeniu telewizora.&lt;/p&gt;

&lt;p&gt;Inaczej wygląda sprawa ze specyficznymi klientami - w pewnych warunkach nie jest możliwe zastosowanie czystego układu (strukturalny dokument + &lt;abbr title=&quot;Cascading Style Sheets&quot;&gt;CSS&lt;/abbr&gt;). Nie jest to jednak powód do tego, żeby całkowicie zarzucić wsparcie dla styli - zbudowanie układu hybrydowego (tabela do pocięcia układu + &lt;abbr&gt;CSS&lt;/abbr&gt; do zgrania całości) daje dużo więcej korzyści niż sama satysfakcja. Strona jest przede wszystkim dużo lżejsza, a przez to ładuje się szybciej (choć układy tabelaryczne nie pozwalają na renderowanie progresywne w takim zakresie, jak oparte na czystej strukturze) i jest znacznie łatwiejsza w edycji (a wprowadzając zmiany w arkuszu styli możemy w prosty sposób zmienić wygląd setek podstron). Zapewniamy sobie też identyczny wygląd we wszystkich przeglądarkach, także w tych przyszłych (wyobraź sobie, jak wyglądałoby teraz 95% internetu, gdyby przeglądarki nagle porzuciły wsparcie dla przestarzałych elementów, jak &lt;code&gt;&amp;lt;font/&amp;gt;&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Z drugiej strony są też ekstremiści, którzy nawet dane typowo tabelaryczne (jak zestawienia statystyczne, czy cenniki) zamieniają na groteskowe konstrukcje, które według nich są bardziej semantyczne. To jednak - na szczęście - kwalifikuje się w większości przypadków jako nieszkodliwe geekostwo i zajęcia typu proof of concept. Użycie takiego wynalazku w realnym projekcie komercyjnym może tylko wystawić autora na publiczne pośmiewisko - jest dowodem zupełnego braku zrozumienia semantyki języka.&lt;/p&gt;

&lt;p&gt;Podsumowując - twarde zapieranie się rękoma i nogami przed zastosowaniem bogatych multimediów czy oparciem funkcjonalności na językach skryptowych po stronie agenta przy argumentacji, że to dla dobra usability, nie zawsze jest właściwe. W niektórych, specyficznych przypadkach, odwiedzający oczekuje takiej właśnie funkcjonalności i wzbranianie się przed nią jest działaniem na szkodę użytkownika.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Nasz klient na szpan</title>
   <link href="http://room-303.com/blog/2005/09/12/eecac57360b3e244c34146f43dd09443/"/>
   <updated>2005-09-12T19:35:51+00:00</updated>
   <id>http://room-303.com/blog/2005/09/12/eecac57360b3e244c34146f43dd09443</id>
   <content type="html">&lt;p&gt;Pozwolę sobie publicznie polemizować z &lt;a href=&quot;http://grabun.com/blog/2005/09/klient-nasz-pan/&quot;&gt;komentarzem kolegi Grabunia&lt;/a&gt; odnośnie &lt;a href=&quot;http://patrys.jogger.pl/comment.php?eid=145849&quot;&gt;innej mojej notki&lt;/a&gt;. Łukasz zdaje się nie przejawiać poczucia humoru albo też nie pracuje z klientami tego typu.&lt;/p&gt;

&lt;p&gt;Nazwy typu &lt;em&gt;masta-hacka&lt;/em&gt; pominę, jako że śmiać się umiem, nie zgodzę się jednak z głównym przesłaniem notki - klientowi wszystko wolno. Oczywiście, że klient płaci i klient może wymagać, ale z całą pewnością nie ma prawa wymagać formy implementacji.&lt;/p&gt;

&lt;p&gt;Kiedy zamawiam do domu kafelkarza (A czemu zamawiam? Bo sam nie potrafię), daję mu kafelki i oczekuję, że je położy. Nie stoję nad nim i nie mówię mu, że dystansowniki są krzywo, że klej nie taki, a fuga za grubo położona i pewnie nie zejdzie po zaschnięciu. Ufam temu, że on - będąc kafelkarzem od X lat - wie, co ma zrobić i jak. Wierzę, że efekt będzie taki, jaki zamówiłem.&lt;/p&gt;

&lt;p&gt;Porównywanie systemów &lt;abbr title=&quot;Content Management System&quot;&gt;CMS&lt;/abbr&gt; do systemów czasu rzeczywistego to raczej chybiony dowcip, bo to jak powiedzenie, że wspomniany kafelkarz powinien zamknąć dziób i słuchać klienta - wszak nie stawia on elektrowni atomowych. Co zaś się tyczy teorii, że powinniśmy się cieszyć z faktu, że klient do nas trafił - bzdura, często zdarza nam się odrzucać zlecenia, a głodem jakoś nie przymieramy. Nie prowadzimy agencji towarzyskiej i nie każdy musi zostać obsłużony, zapychanie swojego portfolio serwisami za 100 złotych nie poprawia niczyjego wizerunku.&lt;/p&gt;

&lt;p&gt;Ustalenia z klientami i customer-driven-development - jak najbardziej, pod warunkiem, że obie strony nie ingerują wzajemnie w swoje strefy kompetencji. Klient bardzo często zapraszany jest do testów na wielu etapach realizacji i zawsze ma możliwość zgłoszenia swoich uwag, jednak my dbamy o znalezienie złotego środka pomiędzy jego wizją, a tym, czego oczekują internauci i co mieści się w normach web usability.&lt;/p&gt;

&lt;p&gt;Co tyczy się standardów - ostatnio jest o tym dość głośno i fakt, że realizujemy systemy zgodne z nowoczesnymi przeglądarkami i przy zachowaniu standardów, jest naszym atutem przy negocjacjach. Ta część nie podlega nawet negocjacjom.&lt;/p&gt;

&lt;p&gt;To tyle, jeśli chodzi o komentarz, zgodzę się z tym, że do projektowania serwisów bardziej przydają się zdolności graficzne niż programistyczne, ale do budowania prawdziwych serwisów &lt;abbr title=&quot;World Wide Web&quot;&gt;WWW&lt;/abbr&gt; potrzeba dużo więcej niż ładny projekt - technologie server-side, projektowanie systemów bazodanowych, semantyczna składnia (nie tylko jako sztuka dla sztuki, ale dająca wymierne korzyści w wyszukiwarkach i w łatwości zarządzania serwisem), czy technologie wspierające (JavaScript, &lt;abbr title=&quot;Simple Object Access Protocol&quot;&gt;SOAP&lt;/abbr&gt;, &lt;abbr title=&quot;Asynchronous JavaScript And XML&quot;&gt;AJAX&lt;/abbr&gt;). Jeśli czyjeś umiejętności webdeweloperskie kończą się na ładnym splashu i kilku linijkach &lt;abbr title=&quot;PHP Hypertext Preprocessor&quot;&gt;PHP&lt;/abbr&gt; z kodem &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt; generowanym inline, to z niego jest za przeproszeniem dupa, nie webdeveloper.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Trup</title>
   <link href="http://room-303.com/blog/2005/09/10/78f1dd10b98438e0912e0f07141f3fd8/"/>
   <updated>2005-09-10T17:13:05+00:00</updated>
   <id>http://room-303.com/blog/2005/09/10/78f1dd10b98438e0912e0f07141f3fd8</id>
   <content type="html">&lt;p&gt;Lepiej być nie może. W &lt;a href=&quot;http://www.prodesign.pl/&quot;&gt;ICenter&lt;/a&gt; pracuję właśnie nad nowym modułem do swojego &lt;abbr title=&quot;Content Management System&quot;&gt;CMS&lt;/abbr&gt;, z &lt;a href=&quot;http://www.activnet.pl/&quot;&gt;Activnetem&lt;/a&gt; buduję system webowy do zarządzania produkcją w jednej z włoskich fabryk, &lt;a href=&quot;http://www.techland.pl/&quot;&gt;Techland&lt;/a&gt; zamówił u mnie strony dla dwóch nowych gier. Wszystko pięknie.&lt;/p&gt;

&lt;p&gt;We wtorek komputer spowolnił do żółwiego tempa. Mysz poruszała się w trybie skokowym, wskaźniki obciążenia twierdziły, że przeciętnie wynosi 15%, &lt;code&gt;dmesg&lt;/code&gt; milczał niczym grób (nie mylić z Grubem). Odpaliłem &lt;code&gt;top&lt;/code&gt; i ustawiłem opóźnienie odświeżania na 0,1 sekundy. Winnym okazał się &lt;code&gt;hald&lt;/code&gt;, który generował szpilki po 100%. Ki czort? Ustaliłem, że proces zaczyna się od apletu monitorującego stan akumulatora - każde pytanie o stan powodowało zatkanie się systemu, co więcej, to samo powodowała próba czytania z &lt;code&gt;/proc/acpi&lt;/code&gt;, więc problem nie leżał po stronie demona &lt;abbr title=&quot;Hardware Abstraction Layer&quot;&gt;HAL&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;Wyjąłem przeto akumulator, a problem mój jako objawił się był błyskawicznie, tako też zniknął. Ponowne podłączenie winnego pozwoliło odczytać producenta i typ, jednak napięcie znamionowe, poziom naładowania i pozostałe wskaźniki pozostawały dla systemu zagadką. Powróciła czkawka systemu. Sprzęt na gwarancji, więc kiedyś się odda, póki co - komputer potrzebny mi jest bez przerwy.&lt;/p&gt;

&lt;p&gt;Dziś spotkała mnie niespodzianka dalece bardziej niemiła. Próba włączenia laptopa zakończyła się na komunikacie układu &lt;abbr title=&quot;Self-Monitoring Analysis and Reporting Technology&quot;&gt;SMART&lt;/abbr&gt;, który w wypowiedzi tyle lakonicznej co smutnej, poinformował mnie, że dysk mogę sobie przerobić na przycisk do papieru. 40 gigabajtów pracy i zabawy przesunęło się w odmęty niebytu.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Praca z klientami</title>
   <link href="http://room-303.com/blog/2005/09/04/a6aafb1e9558960e5859348143462b71/"/>
   <updated>2005-09-04T11:07:06+00:00</updated>
   <id>http://room-303.com/blog/2005/09/04/a6aafb1e9558960e5859348143462b71</id>
   <content type="html">&lt;p&gt;Wczoraj przypadkiem trafiłem na tekst, który kiedyś rozbawił mnie do łez. Co by było, gdyby architekci pracowali tak jak firmy webdesignerskie? Poniżej luźne tłumaczenie na polski:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Drogi Panie Architekcie,&lt;/p&gt;

&lt;p&gt;Proszę zaprojektować i zbudować dla mnie dom. Nie jestem jeszcze zupełnie pewien, czego dokładnie potrzebuję, więc proszę oprzeć się na swoim doświadczeniu. Mój dom powinien mieć gdzieś pomiędzy dwoma a czterdziestoma pięcioma sypialniami. Planując, proszę upewnić się, że sypialnie mogą być w łatwy sposób dodawane i usuwane. Kiedy przyniesie Pan gotowe plany, podejmę ostateczną decyzję. Proszę też o dokładny kosztorys każdej konfiguracji, żebym mógł wybrać właściwie.&lt;/p&gt;

&lt;p&gt;Proszę pamiętać, że dom, na który się zdecyduję, musi kosztować mniej niż ten, w którym obecnie mieszkam. Proszę również mieć na uwadze, że chciałbym pozbyć się wszelkich wad, jakimi obarczony jest mój obecny dom.&lt;/p&gt;

&lt;p&gt;W czasie planowania powinien Pan mieć na względzie fakt, że chciałbym zachować roczne koszty utrzymania tak nisko, jak to tylko możliwe. Powinno to oznaczać zastosowanie droższych technologii, jak aluminium czy winyl. Jeśli nie zdecyduje się Pan na zastosowanie aluminium, proszę przygotować się na to, że będę oczekiwał wyczerpujących wyjaśnień dotyczących podłoża tej decyzji.&lt;/p&gt;

&lt;p&gt;Proszę upewnić się, że najnowsze trendy i najnowocześniejsze materiały zostaną użyte przy konstrukcji, jako że chcę aby mój dom stał się synonimem nowoczesności i bycia na czasie. Powinien wiedzieć Pan jednak, że kuchnia musi pasować do wielu z moich mebli, w tym do lodówki Gibsona z 1952. roku.&lt;/p&gt;

&lt;p&gt;Aby upewnić się, że buduje Pan najlepszy dom dla całej naszej rodziny, musi Pan z pewnością skontaktować się z każdym z naszych dzieci i z naszymi teściami. Moja teściowa będzie z pewnością miała własne wyobrażenie o tym, jak dom powinien wyglądać, gdyż odwiedza nas przynajmniej raz do roku. Powinien Pan upewnić się, że przy podejmowaniu decyzji weźmie pod uwagę wszystkie te opinie. Zastrzegam sobie jednak prawo do zmiany każdej podjętej przez Pana decyzji.&lt;/p&gt;

&lt;p&gt;Niech Pan nie zawraca mi głowy detalami na tym etapie projektowania. Pańska praca polega na wykonaniu ogólnych planów domu. Jest jeszcze za wcześnie na podejmowanie decyzji np. odnośnie koloru dywanu. Proszę jednak mieć na uwadze, że moja żona lubi niebieskie.&lt;/p&gt;

&lt;p&gt;Proszę również nie przejmować się organizacją materiałów, maszyn i siły roboczej. Głównym priorytetem jest w tej chwili wykonanie szczegółowych planów i specyfikacji. Kiedy jednak zaakceptuję plany, oczekuję, że nie będzie stanowić problemu zakończenie budowy w ciągu następnych 48 godzin.&lt;/p&gt;

&lt;p&gt;Kiedy projektuje Pan ten dom dla mnie, proszę pamiętać, że prędzej czy później, będę zmuszony sprzedać go komuś innemu. Musi on więc być atrakcyjny dla każdego potencjalnego nabywcy. Przed zamknięciem planów, powinien się Pan zatem upewnić, że dom podoba się bezwzględnej większości mieszkańców mojej okolicy. Zachęcam również do obejrzenia domu zbudowanego w zeszłym roku przez mojego sąsiada. Bardzo nam się podoba i posiada wiele dodatków, które z radością powitamy w naszym nowym domu, zwłaszcza basen długości 75 stóp. Posługując się inżynierią z wprawą i delikatnością, wierzę, że uda się Panu wpleść go do projektu bez wpływu na koszt całości.&lt;/p&gt;

&lt;p&gt;Proszę przygotować komplet planów architektonicznych. W tym momencie szczegółowe plany wnętrza nie są konieczne, gdyż plany posłużą tylko do wyceny kosztów konstrukcji. Niech będzie Pan jednak świadom, że pokryje Pan wszelkie dodatkowe koszty konstrukcji wymuszone przez ewentualne zmiany projektu wnętrza.&lt;/p&gt;

&lt;p&gt;Z pewnością jest Pan podekscytowany, mogąc pracować przy tak interesującym projekcie! Ma Pan teraz możliwość skorzystania z najnowszych rozwiązań i materiałów, a jednocześnie zachowuje Pan tak ogromną swobodę działania, co nie jest zbyt częste. Proszę skontaktować się ze mną tak szybko, jak tylko będzie Pan gotów przedstawić komplet swoich planów i pomysłów.&lt;/p&gt;

&lt;p&gt;PS: Moja żona właśnie powiedziała mi, że zupełnie nie zgadza się z dużą częścią powyższych instrukcji i wymagań. Jako że jest Pan architektem, do Pana obowiązków będzie należało rozstrzygnięcie tej różnicy zdań. Sam wielokrotnie próbowałem w przeszłości, jednak nigdy mi się nie udało. Jeśli nie potrafi Pan podjąć się tego, poszukam innego architekta.&lt;/p&gt;

&lt;p&gt;PPS: Właściwie, może ja wcale nie potrzebuję domu, tylko chodzi mi o przyczepę kempingową? Jeśli tak, to proszę mnie o tym powiadomić tak szybko, jak to możliwe.&lt;/p&gt;&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>Krótko o dobrym wychowaniu</title>
   <link href="http://room-303.com/blog/2005/09/03/4bcb6a1f98a92f5b92c83e53ed744c84/"/>
   <updated>2005-09-03T18:10:11+00:00</updated>
   <id>http://room-303.com/blog/2005/09/03/4bcb6a1f98a92f5b92c83e53ed744c84</id>
   <content type="html">&lt;p&gt;Jeśli zapisujesz się na listy dyskusyjne, to pamiętaj o tym. Jest to miejsce, gdzie wymaga się od ciebie przestrzegania pewnych zasad (ogólnie pojętej netykiety i kilku specyficznych reguł grupowych). Zwłaszcza, jeśli zapisujesz się na listę, którą regularnie czyta kilkaset osób, powinieneś mieć na uwadze jej istnienie, kiedy wyjeżdżasz i postanawiasz zastosować coś tak genialnego jak autoresponder. Większość deweloperów PLD jest od circa 2 miesięcy częstowana poniższą informacją:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;From: Kxxxxxxx, Mxxxxx &amp;lt;Mxxxxx.Kxxxxxxx@yyy.pl&amp;gt;
To: Patrys :: Patryk Zawadzki &amp;lt;patrys@pld-linux.org&amp;gt;
Subject: Out of Office AutoReply: dbus 0.2x, cairo 1.0, gtk+ 2.8

Nie ma mnie w pracy. 

Zastepuje mnie: mailto:Bxxxxxxxx.Wxxxx@yyy.pl.

Problemy prosze zglaszac na:
mailto:xxx@yyy.pl 
lub telefonicznie,Tel.: +48 xx xxxx xxx&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Bezsilni wobec braku winnego, irytowaliśmy się coraz bardziej. W końcu wysłałem maila na adres podany jako zastępca. Bez skutku:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;Your message

  To:      postmaster@yyy.pl; Bxxxxxxxx.Wxxxx@yyy.pl
  Subject: [Fwd: Out of Office AutoReply: dbus 0.2x, cairo 1.0, gtk+ 2.8]
  Sent:    Mon, 29 Aug 2005 22:56:59 +0200

did not reach the following recipient(s):

BXXXXXXXX.WXXXX@YYY.PL on Mon, 29 Aug 2005 23:12:53 +0200
    The recipient name is not recognized&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Podany adres jest nieprawidłowy. Przyjrzałem mu się bliżej, dostrzegłem literówkę, wysłałem list. Brak odpowiedzi.&lt;/p&gt;

&lt;p&gt;Tydzień później, po otrzymaniu kolejnego respondera, zaatakowałem adres &lt;code&gt;postmaster@yyy.pl&lt;/code&gt;. Niestety, poczty postmastera najwidoczniej nikt nie czyta, bo i po co.&lt;/p&gt;

&lt;p&gt;Dziś nie wytrzymałem i po kolejnej informacji o niedostępności człowieka, którego nie znam i fakt którego wczasów zupełnie mnie ineresuje, wysłałem ponownie maila do zastępcy. Po chwili przeżyłem szok - przyszła odpowiedź:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;From: Wxxxx, Bxxxxxxxxx &amp;lt;Bxxxxxxxxx.Wxxxx@yyy.pl&amp;gt;
To: Patrys :: Patryk Zawadzki &amp;lt;patrys@pld-linux.org&amp;gt;
Subject: Out of Office AutoReply...

Nie ma mnie w pracy. 
Zastepuje mnie Mxxxxx Kxxxxxxx. Tel. xxx xxxx, xxx xxxx.&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Odpłynąłem. Ciekawa propozycja padła w związku z tym na listach:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;From: Enleth &amp;lt;enleth@enleth.com&amp;gt;
To: PLD: Developers list (Polish) &amp;lt;pld-devel-pl@lists.pld-linux.org&amp;gt;
Subject: Re: Fw: Out of Office AutoReply: SPECS: esmtp.spec - missing br's

Proponuję na Mxxxxx.Kxxxxxxx@yyy.pl wysłać maila z From i Reply-To 
ustawionym na Bxxxxxxxx.Wxxxx@yyy.pl...&lt;/pre&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;pre&gt;From: Zbyniu Krzystolik &amp;lt;zbyniu@geocarbon.pl&amp;gt;
To: PLD: Developers list (Polish) &amp;lt;pld-devel-pl@lists.pld-linux.org&amp;gt;
Subject: Re: Fw: Out of Office AutoReply: SPECS: esmtp.spec - missing br's

nieee, po prostu trzeba ręcznie zapisać na listy
Bxxxxxxxx.Wxxxx@yyy.pl oraz
xxx@yyy.pl

W końcu jak zastępuje, to zastępuje. No i problemy też z tym mamy, zatem
i na ten drugi adres niech idzie. Na tej liście pojawiają się różne 
problemy, może akurat ten hotline potrafi pomóc. 8-&amp;gt;

Zbyniu&lt;/pre&gt;&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>Przezorni złodzieje</title>
   <link href="http://room-303.com/blog/2005/08/27/8a4b778c65d0e73ccec3bdc722fcf0ff/"/>
   <updated>2005-08-27T13:54:19+00:00</updated>
   <id>http://room-303.com/blog/2005/08/27/8a4b778c65d0e73ccec3bdc722fcf0ff</id>
   <content type="html">&lt;p&gt;Wczoraj miałem zaszczyt przebywać na przyjęciu towarzyskim (łac. &lt;em&gt;bibos&lt;/em&gt;) w charakterze alterimprezowicza, jako że w tym samym czasie w tym samym miejscu odbywało się inne party (mechanika kwantowa się kłania). Gości z tej drugiej imprezy nie znałem, a byli nieco młodsi - mediana wynosiła 17 lat. Zachowywali się dość chaotycznie i przejawiali wszelkie cechy dobrze wytrenowanego kamikaze.&lt;/p&gt;

&lt;p&gt;Zdenerwowałem się nieco, kiedy odkryłem, że ktoś majstrował przy moim plecaku. Szybka procedura sprawdzania spójności środowiska - portfel jest, zawartość się zgadza; notebook jest; segregator z płytami nie zginął; telefon mam zawsze przy pasku. Po co więc dłubać w cudzym plecaku? Okazało się, że ktoś zabrał kilka tabletek Ibupromu (ślad - brakująca wata w słoiczku). Drugie znalezisko rozbawiło mnie jednak dalece mocniej.&lt;/p&gt;

&lt;p&gt;Zginęła &lt;em&gt;jedna&lt;/em&gt; prezerwatywa. :D&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Przedwczesna optymalizacja</title>
   <link href="http://room-303.com/blog/2005/08/25/9160ffd1e8175a74d11ccf75e5edf956/"/>
   <updated>2005-08-25T20:44:00+00:00</updated>
   <id>http://room-303.com/blog/2005/08/25/9160ffd1e8175a74d11ccf75e5edf956</id>
   <content type="html">&lt;p&gt;Patrzę dziś z łezką w oku na kod, który napisałem w Pascalu na początku 1998. roku (czyli gdzieś w pierwszej klasie ogólniaka):&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;procedure putpixel(x,y:word;color:word); assembler;
asm
  mov cx,640*2
  mov bx,x
  cmp bx,639
  ja @noput
  mov ax,y
  cmp ax,479
  ja @noput
  add ax,topscreeny
  mul cx
  shl bx,1
  add ax,bx
  adc dx,0
  mov si,ax
  cmp dl,curbank
  je @bankok
  call dword ptr bankswitch
  mov curbank,dl
@bankok:
  push $a000
  pop es
  mov ax,color
  mov es:[si],ax
@noput:
end;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;I śmiać mi się chce, kiedy w oknie obok widzę kod, który dziś mam po kimś poprawiać:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;for ($i = 0, $j = 0; ; )
{
	$tab[$i++] = $title[$j];
	$tab[$i++] = $content[$j++];
	if ($j &amp;gt;= $limit)
		break;
}&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Nie wiedziałem, że czas procesora jest aż tak cenny w zagnieżdżanych językach skryptowych. Pół biedy z tym, ale widziałem już takie krzaki na ekranie, że sam autor by mi dziś nie powiedział, co kod robi bez pomocy debugowania.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The Daily WTF, part 3</title>
   <link href="http://room-303.com/blog/2005/08/25/e354d7e13bc4fff05fddb688bd203498/"/>
   <updated>2005-08-25T00:30:26+00:00</updated>
   <id>http://room-303.com/blog/2005/08/25/e354d7e13bc4fff05fddb688bd203498</id>
   <content type="html">&lt;p&gt;No nie mogę. Ex aequo dzisiejszą nagrodę otrzymuje również zespół &lt;a href=&quot;http://dinfo.pl/&quot; rel=&quot;nofollow&quot;&gt;dinfo.pl&lt;/a&gt;. Jako ich partner, jesteśmy zmuszeni do korzystania z ich &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; do wykonywania wszelkich operacji na domenach. Właśnie wpisałem o-umlaut do formularza wyszukiwania domen i system zmarł z komunikatem &lt;q&gt;zły assert&lt;/q&gt;. Szukałem błędu po swojej stronie, ale ich serwis okazywał się reagować tak samo. Zajrzałem przeto w otchłań bezdenną i wydobyłem z jej czeluści kod ichniej implementacji &lt;em&gt;punycode&lt;/em&gt;, czyli systemu tłumaczenia nazw domen na obowiązujący standard &lt;abbr title=&quot;International Domain Names&quot;&gt;IDN&lt;/abbr&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;function punycode($tryb,$tekst)
{ //tryby: &amp;quot;Encode&amp;quot;/&amp;quot;Decode&amp;quot;
	$iso = array(177,230,234,179,241,243,182,188,191,
	161,198,202,163,209,211,166,172,175);

	$uni = array(261,263,281,322,324,243,347,378,380,260,
	262,280,321,323,211,346,377,379);

	$tekst = iconv('utf-8', 'iso-8859-2', $tekst);

	$print_ascii =&amp;quot;\n\n\n\n\n\n\n\n\n\n\n\n\n\n&amp;quot;.
	&amp;quot;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n !\&amp;quot;&amp;quot;.
	&amp;quot;#$%&amp;amp;'()*+,-./0123456789:;&amp;lt;=&amp;gt;?@ABCDEFGHIJK&amp;quot;.
	&amp;quot;LMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrs&amp;quot;
	&amp;quot;tuvwxyz{|}~\n&amp;quot;;

	$domenatab=explode(&amp;quot;.&amp;quot;,$tekst);
	//podzial domeny na tablice(rozdzial z kropek)

	if ($tryb==&amp;quot;Encode&amp;quot;) {
		$output=&amp;quot;&amp;quot;;
		for ($l=0;$l&amp;lt;count($domenatab);$l++){
		//licznik slow miedzy kropkami
			$tekstuni=array();
			$tekst=$domenatab[$l];
			$polskieznaczki=false;
			for ($i=0;$i&amp;lt;strlen($tekst);$i++) {
				$znaleziony=0;
				for ($j=0;$j&amp;lt;count($iso);$j++) {
					if (ord($tekst[$i])==$iso[$j])  {
						$tekstuni[$i]=$uni[$j];
						$znaleziony=1;
						$polskieznaczki=true;
						break;
					}
				}
				if ($znaleziony==0) {
					$tekstuni[$i]=ord($tekst[$i]);
				}
			}

			// Encode: //
			if ($polskieznaczki==true) {
				$output .= &amp;quot;xn--&amp;quot;.
				$this-&amp;gt;punycode_encode(count($tekstuni), $tekstuni);
			} else {
				$output.=$domenatab[$l];
			}
			if ($l!=count($domenatab)-1) {
				$output.=&amp;quot;.&amp;quot;;
			}
		} //for l=0....
		$output_length=strlen($output);

		// Convert to native charset and output: //
		for ($j = 0;  $j &amp;lt; $output_length;  ++$j) {
			$c = ord($output[$j]);
			if ($c &amp;gt;= 0 &amp;amp;&amp;amp; $c &amp;lt;= 127 &amp;amp;&amp;amp; isset($c)) {
				if (ord($print_ascii[$c]) == 0) {
					echo &amp;quot;invalid_input&amp;quot;;
				}
				$output[$j] = $print_ascii[$c];
			} else {
				echo &amp;quot;zly assert (246)&amp;quot;;
				exit;
			}
		}
		return str_replace(&amp;quot;\r&amp;quot;,&amp;quot;&amp;quot;,$output);
	}
	// [..]
}&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Przejrzyściej napisanego kodu nie napisałem, mimo wszystko udało mi się dostrzec, że:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;system potrafi obsługiwać tylko domeny podane w Latin2&lt;/li&gt;
&lt;li&gt;ma na sztywno wpisanych kilka polskich znaków (pierwsze dwie tablice), a inne skrupulatnie olewa&lt;/li&gt;
&lt;li&gt;nie ma nic wspólnego z oryginalnym algorytmem punycode (tej części nie wklejałem), którego implementację w &lt;abbr title=&quot;PHP Hypertext Preprocessor&quot;&gt;PHP&lt;/abbr&gt; na licencji &lt;abbr title=&quot;GNU General Public License&quot;&gt;GPL&lt;/abbr&gt; można wygooglać w 10 sekund&lt;/li&gt;
&lt;li&gt;prześlicznie obsługuje błędy, nie ma to jak zabić skrypt w przypadku wprowadzenia nieobsługiwanych znaków do formularza&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>The Daily WTF, part 2</title>
   <link href="http://room-303.com/blog/2005/08/24/84526407259e6214e1c62d217110f37d/"/>
   <updated>2005-08-24T23:43:46+00:00</updated>
   <id>http://room-303.com/blog/2005/08/24/84526407259e6214e1c62d217110f37d</id>
   <content type="html">&lt;p&gt;Jako, że data już technicznie rzecz biorąc inna, mogę zamieścić kolejny &lt;abbr title=&quot;What The Fuck&quot;&gt;WTF&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;Pamiętajcie, środków ostrożności nigdy dość, dlatego ważną rolę pełni &lt;em&gt;security by obscurity&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&amp;lt;?
if ($_COOKIE[&amp;quot;login&amp;quot;] != &amp;quot;admin&amp;quot;)
	print '&amp;lt;div id=&amp;quot;admin&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;';
else
	print '&amp;lt;div id=&amp;quot;admin&amp;quot;&amp;gt;';
?&amp;gt;
	&amp;lt;!-- tutaj linki do usuwania użytkowników --&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>The Daily WTF</title>
   <link href="http://room-303.com/blog/2005/08/24/456b002c6644214e00ed43b0f0271136/"/>
   <updated>2005-08-24T17:13:45+00:00</updated>
   <id>http://room-303.com/blog/2005/08/24/456b002c6644214e00ed43b0f0271136</id>
   <content type="html">&lt;p&gt;Dzisiejszą nagrodę otrzymuje ode mnie autor poniższego kodu:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;if (sizeof($tab) &amp;gt; 0 ? true : false)
{
	// [...] - tutaj kod
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Autora i źródła nie podam z podziwu dla tak zaawansowanych konstrukcji.&lt;/p&gt;

&lt;p&gt;PS: Podobno dzisiaj Windows 95 (Windows Chicago) obchodzi swoje 10. urodziny.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Inżynieria nieprogramowania</title>
   <link href="http://room-303.com/blog/2005/08/22/5ca647c65f3ff083551ebacbdf06a7fb/"/>
   <updated>2005-08-22T16:50:20+00:00</updated>
   <id>http://room-303.com/blog/2005/08/22/5ca647c65f3ff083551ebacbdf06a7fb</id>
   <content type="html">&lt;p&gt;Studenci i hobbyści lubią pisać kod dla samej zabawy pisania kodu. Stąd różnorodność rozwiązań w każdej niemal kategorii oprogramowania. Dzięki temu klony Uniksa są dziś najbardziej elastycznymi systemami. Sytuacja wygląda jednak nieco inaczej w przypadku oprogramowania komercyjnego.&lt;/p&gt;

&lt;p&gt;Każdy chce się pochwalić swoimi umiejętnościami i chętnie napisałby wszystko od zera, ale w odróżnieniu od oprogramowania OpenSource, w komercyjnych rozwiązaniach obowiązują terminy, a głównym czynnikiem napędzającym całą zabawę są pieniądze. Ważne nie jest popisanie się, ale efektywne zgospodarowanie czasu, stąd pisanie własnych rzeczy często jest niepożądane.&lt;/p&gt;

&lt;p&gt;Zanim zabierzesz się za pisanie własnego modułu, silnika czy jakiegokolwiek elementu oprogramowania, rozejrzyj się po rynku. Sprawdź czy istnieją gotowe rozwiązania, z których mógłbyś skorzystać i zaoszczędzić czas. Jeśli nie uda ci się znaleźć nic, co pasowałoby do twojego projektu, zainteresuj się tymi, które nie pasują. Sprawdź, jaką mają bazę użytkowników, czy znane są jakieś błędy, z jakimi problemami borykają się ci, którzy im zaufali i czy nie żałują swojej decyzji. Zobacz, czy nie da się ich zaadaptować za pomocą minimalnych zmian.&lt;/p&gt;

&lt;p&gt;Pisanie własnego systemu powinno być ostatnim podejmowanym krokiem. Jeśli nie znajdziesz nic, co mogłoby ci zaoszczędzić czasu, to zaoszczędź go sobie sam - przeznacz czas na zaplanowanie swoich działań zanim napiszesz choćby linijkę. Zastanów się nad architekturą, porównaj ją z istniejącymi i skorzystaj z poznanej wcześniej listy problemów. Pisanie oprogramowania, które nie będzie się nadawało do wdrożenia mija się z celem, tak samo jak napisanie od zera kolejnego pakietu o identycznej funkcjonalności.&lt;/p&gt;

&lt;p&gt;Pamiętaj, że prawdopodobnie nie będziesz jedyną osobą dbającą o ów kod - zaplanuj go rozwojowo i tak, żeby wprowadzanie zmian nie wymagało przepisywania dużych fragmentów kodu. Przygotuj choćby krótką dokumentację - twoi współpracownicy nie będą mieli czasu na czytanie całości kodu za każdym razem, kiedy potrzebują z niego skorzystać. To jest właśnie największa zaleta korzystania z szeroko stosowanych rozwiązań - problemy za ciebie rozwiązują inni. Ty możesz skupić się kodzie funkcjonalnym, a nie na poprawianiu używanych narzędzi i bibliotek.&lt;/p&gt;

&lt;p&gt;Reasumując: w pracy codziennej pisze się masę nowego kodu, ale staramy się ograniczać do tego, którego napisanie jest nieodwołalne. Cała reszta to koszty, które dla pracodawcy nie przynoszą żadnego zysku (poza kodem, o który trzeba dbać, co pochłania dalsze ilości czasu, a w efekcie przekłada się znów na pieniądze).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Offtopic: Relokacja dyfuzyjna</title>
   <link href="http://room-303.com/blog/2005/08/21/288b54d9bbbc43f9f3cb81637d078c93/"/>
   <updated>2005-08-21T19:06:33+00:00</updated>
   <id>http://room-303.com/blog/2005/08/21/288b54d9bbbc43f9f3cb81637d078c93</id>
   <content type="html">&lt;p&gt;Dzisiaj (zmotywowany przebudzeniem o 17:00 po wczorajszej imprezie) sformułowałem w końcu swoją teorię z dziedziny modelowania zjawisk fizyki cząsteczkowej.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Relokacja Dyfuzyjna (&lt;abbr&gt;RD&lt;/abbr&gt;)&lt;/em&gt; to zjawisko powszechne w przyrodzie. Jego zaistnienie jest nieprzewidywalne, jednak pewne czynniki mogą wpłynąć dodatnio na szansę jego wystąpienia. Kluczową rolę pełni tutaj dostarczenie odpowiedniego kwantu energii w postaci alkoholu etylowego i produktów z grupy wyrobów tytoniowych. Zaistnienie &lt;abbr&gt;RD&lt;/abbr&gt; możemy stwierdzić dopiero po fakcie, poprzez analizę symptomów. Proces &lt;abbr&gt;RD&lt;/abbr&gt; charakteryzuje się tym, że ciało ulega rozszczepieniu na pojedyncze cząsteczki. Każda z nich porusza się do celu innym torem, ciężko określić wzór pozwalający dokładnie wyznaczyć trasę poruszania się poszczególnych cząsteczek, wiemy natomiast że ich tory podobne są do tych pokonywanych przez ładunki elektryczne podczas wyładowań atmosferycznych bądź do torów kreślonych przez węże na piasku. Niektóre cząsteczki zdają się wykazywać własności magnetyczne względem krawężnika. Proces ponownej asemblacji materii jest dość długotrwały, co widać szczególnie dobrze na krótkich odcinkach. Te, których pokonanie pieszo zajmuje 20 minut, mogą zająć &lt;abbr&gt;RD&lt;/abbr&gt; ponad godzinę. Co ciekawe, można w ten sposób pokonać odcinki teoretycznie nie do przejścia na nogach.
Zaliczamy do nich: jeziora, rzeki, tereny bagienne, wysoko porośnięte łąki, a także płoty i mury. Druga charakterystyczna, poza nadmiarowym upływem czasu, cecha to wielodrożność poruszających się paralelistycznie cząstek. Stąd często, gdy pytamy kilku osób o trasę, którą wracaliśmy do domu, otrzymujemy kilkanaście sprzecznych wersji. Nazywamy to &lt;em&gt;częściową, nabytą zdolnością bilokacji&lt;/em&gt;. Jest ona tylko tymczasowym efektem ubocznym &lt;abbr&gt;RD&lt;/abbr&gt; i organizm traci tę właściwość po znalezieniu się w łóżku, bądź innym dogodnym do spania miejscu (w tym ławki, trawniki).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>DistroDev.org</title>
   <link href="http://room-303.com/blog/2005/08/21/7f437c50a5c2550033de9bf290e8f108/"/>
   <updated>2005-08-21T17:26:47+00:00</updated>
   <id>http://room-303.com/blog/2005/08/21/7f437c50a5c2550033de9bf290e8f108</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://nbtsc.org/~aredridel/&quot;&gt;Aredridel&lt;/a&gt; (PLD Linux) i &lt;a href=&quot;http://xentac.net/~jchu/blog&quot;&gt;xentac&lt;/a&gt; (Arch Linux) ogłosili niedawno otwarcie dość niecodziennego portalu. &lt;a href=&quot;http://distrodev.org/&quot;&gt;Distro Development Talk&lt;/a&gt; ma na celu skupienie społeczności związanej z rozwojem różnych dystrybucji. Ta różność jest tu kluczowa, bo serwis nie ma służyć za helpdesk (nie, to nie jest miejsce, gdzie użytkownicy mogą zadawać pytania), ma być platformą do swobodnego mind stormingu. Dzieląc się swoimi opiniami mamy okazję poznać sprawę z punktu widzenia innych dystrybucji, możemy również rozszerzyć swoją wiedzę, czytając o pomysłach i problemach innych. Póki co, serwis jest w powijakach i dopiero zbiera grono uczestników, stąd niska aktywność, dlatego zachęcam do rejestracji. Podkreślam jeszcze raz, że jest to usługa dla deweloperów i zadawanie tam pytań &lt;q&gt;jak zrobić&lt;/q&gt; jest kiepskim pomysłem.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Smarty</title>
   <link href="http://room-303.com/blog/2005/08/19/f8d698aea36fcbead2b9d5359ffca76f/"/>
   <updated>2005-08-19T12:53:32+00:00</updated>
   <id>http://room-303.com/blog/2005/08/19/f8d698aea36fcbead2b9d5359ffca76f</id>
   <content type="html">&lt;p&gt;Coraz częściej spotykam się z kodem pisanym &lt;q&gt;na szybko&lt;/q&gt; przez ludzi mających nikłe pojęcie o swoim podstawowym narzędziu pracy - języku &lt;abbr title=&quot;PHP Hypertext Preprocessor&quot;&gt;PHP&lt;/abbr&gt;. Kawałki kodu wyglądają tak:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;while($row = mysql_fetch_array($result))
{
	print &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot; . $row['imie'] .
	&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot; . $row['nazwisko'] .
	&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot; . date(&amp;quot;d.m.Y&amp;quot;, $row['data_urodzenia']) .
	&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;\n&amp;quot;;
}&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Kod paskudny i na ogół wyświetlanie wyników zajmuje przynajmniej 3/4 pliku, który odpowiada za ich pobieranie z bazy. Znacznie wygodniej byłoby oddzielić widok od kontrolera i pozwolić temu pierwszemu troszczyć się o formatowanie danych (&lt;code&gt;date(...);&lt;/code&gt;), a temu drugiemu zająć się tylko wydobywaniem niezbędnych danych.&lt;/p&gt;

&lt;p&gt;Tutaj pojawiają się szablony. Równie kiepskim pomysłem, jak wypluwanie kodu &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt; bezpośrednio przez kontroler, jest pisanie własnego silnika szablonowego. Znacznie lepiej stosować powszechnie uznane narzędzia, jak &lt;a href=&quot;http://smarty.php.net/&quot;&gt;Smarty&lt;/a&gt; - system inteligentnych szablonów.&lt;/p&gt;

&lt;p&gt;Powyższy przykład przepisany za pomocą Smarty składałby się z dwóch plików. Pierwszy plik, z kontrolerem wyglądałby tak:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;$smarty = &amp;amp; new Smarty();
$dataset = array();

while($row = mysql_fetch_assoc($result))
{
	array_push($dataset, $row);
}

$smarty-&amp;gt;assign('dataset', $dataset);
$smarty-&amp;gt;display('data-template.html');&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Drugi zaś, zawierający sam szablon:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&amp;lt;table&amp;gt;
{section name=&amp;quot;row&amp;quot; loop=$dataset}
	&amp;lt;tr&amp;gt;
		&amp;lt;td&amp;gt;{$dataset[row].imie}&amp;lt;/td&amp;gt;
		&amp;lt;td&amp;gt;{$dataset[row].nazwisko}&amp;lt;/td&amp;gt;
		&amp;lt;td&amp;gt;{$dataset[row].data_urodzenia|
		date_format:&amp;quot;%d.%m.%Y&amp;quot;}&amp;lt;/td&amp;gt;
	&amp;lt;/tr&amp;gt;
{/section}
&amp;lt;/table&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Największa zaleta tego podejścia - czytelność i uniezależnienie silnika strony od jej wyglądu.&lt;/p&gt;

&lt;p&gt;Druga zaleta - reużywalność raz wykonanych szablonów, załóżmy bowiem, że strona zawiera formularz, który należy wypełnić i który jest następnie walidowany po stronie serwera pod kątem poprawności pól. Co jeśli pola nie są wypełnione poprawnie? Niektóre serwisy wyświetlają błąd i przycisk &lt;q&gt;wstecz&lt;/q&gt; - niezbyt elegancka metoda, biorąc pod uwagę, że &lt;abbr title=&quot;Internet Explorer&quot;&gt;IE&lt;/abbr&gt; skrupulatnie czyści pola formularza przy wracaniu do strony z historii. Można jednak przygotować jeden formularz:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&amp;lt;form action=&amp;quot;/&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;
	&amp;lt;fieldset&amp;gt;
		&amp;lt;legend&amp;gt;Dane osobowe&amp;lt;/legend&amp;gt;
		&amp;lt;p&amp;gt;Imię:
		&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;imie&amp;quot;
		value=&amp;quot;{$smarty.post.imie}&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;
		&amp;lt;p&amp;gt;Nazwisko:
		&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;nazwisko&amp;quot;
		value=&amp;quot;{$smarty.post.nazwisko}&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;
		&amp;lt;p&amp;gt;Email:
		&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;email&amp;quot;
		value=&amp;quot;{$smarty.post.email}&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;
	&amp;lt;/fieldset&amp;gt;
&amp;lt;/form&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Następnie wywołać go dwukrotnie - raz przy konieczności jego wypełnienia, drugi raz w funkcji sprawdzającej jego poprawność, jeśli zaistnieje taka potrzeba. Pola pozostaną wypełnione, a użytkownik ograniczy się do poprawienia tylko tych danych, które wprowadzone zostały błędnie.&lt;/p&gt;

&lt;p&gt;Trzecia zaleta - system taki pozwala na jednoczesną pracę programistów i webmasterów, szablony można rozwijać równolegle z kodem, co znacznie przyspiesza rozwój serwisu, a czas realizacji jest często kluczowym kryterium przy negocjacjach z klientami.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #017: Dni wolne są najgorsze</title>
   <link href="http://room-303.com/blog/2005/08/18/8b3a7ff3797803a7f2de315a72138552/"/>
   <updated>2005-08-18T15:51:42+00:00</updated>
   <id>http://room-303.com/blog/2005/08/18/8b3a7ff3797803a7f2de315a72138552</id>
   <content type="html">&lt;p&gt;Urlop to taki okres, kiedy możemy w końcu robić to, na co mamy ochotę.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/017-free-time.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Niektórym ciężko pojąć</title>
   <link href="http://room-303.com/blog/2005/08/16/23f5bc1e194b2a2e6b7d388b4680a268/"/>
   <updated>2005-08-16T19:53:17+00:00</updated>
   <id>http://room-303.com/blog/2005/08/16/23f5bc1e194b2a2e6b7d388b4680a268</id>
   <content type="html">&lt;p&gt;Bez jakichkolwiek negatywnych emocji i czysto informacyjnie. Skrót &lt;abbr&gt;PLD&lt;/abbr&gt; rozwija się jako &lt;q&gt;PLD Linux Distribution&lt;/q&gt; i jest to akronim rekursywny, podobnie jak &lt;abbr title=&quot;RPM Package Manager&quot;&gt;RPM&lt;/abbr&gt; czy &lt;abbr title=&quot;WINE Is Not Emulating&quot;&gt;WINE&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;Nie, nie ma tam słowa &lt;q&gt;Polish&lt;/q&gt;, choć niektórzy z całą pewnością chcieliby je tam widzieć. PLD Linux wywodzi się faktycznie z &lt;q&gt;Polish(ed) Linux Distribution&lt;/q&gt;, które zmarło tragicznie z braku deweloperów w 2002. roku. Resztki projektu można znaleźć jeszcze na stronie &lt;a href=&quot;http://pld.org.pl/&quot;&gt;pld.org.pl&lt;/a&gt;, gdzie do dziś swoje repozytorium i stronę domową ma nasz system zarządzania pakietami, &lt;a href=&quot;http://poldek.pld.org.pl/&quot;&gt;poldek&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;PLD Linux Distribution całą swoją działalność (strona domowa, repozytoria kodu, serwery &lt;abbr&gt;FTP&lt;/abbr&gt;, Jabber, listy dyskusyjne, itp.) prowadzi w domenie &lt;a href=&quot;http://pld-linux.org/&quot;&gt;pld-linux.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Notka sponsorowana przez złośliwość pana &lt;a href=&quot;http://pawel-ciupak.jogger.pl/&quot;&gt;Ciupaka&lt;/a&gt;. Pozdrawiam serdecznie. Bez urazy.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Obawa przed adopcją</title>
   <link href="http://room-303.com/blog/2005/08/16/75413b972682026f3d06df17f41aef06/"/>
   <updated>2005-08-16T17:51:37+00:00</updated>
   <id>http://room-303.com/blog/2005/08/16/75413b972682026f3d06df17f41aef06</id>
   <content type="html">&lt;p&gt;Ostatnio miałem okazję pobawić się nową zabawką Microsoftu, a zbiegło się to w czasie z opublikowanym dwa dni temu przez &lt;a href=&quot;http://www.456bereastreet.com/archive/200508/the_danger_of_a_better_internet_explorer/&quot;&gt;Rogera Johanssona artykułem&lt;/a&gt;, więc postanowiłem skorzystać z okazji i napisać coś na ten temat.&lt;/p&gt;

&lt;p&gt;Nowy &lt;abbr title=&quot;Internet Explorer&quot;&gt;IE&lt;/abbr&gt; nie powala. Z widocznych nowości dodane zostały oczywiście (Microsoft twierdzi, że wynalezione przez nich) panele (które ostatnio zostały przemianowane na karty). Paskudne, jak nigdy dotąd, przy włączonym silniku Luna (domyślny temat Windows XP) są zupełnie nie do oglądania, rozsądnie zaczynają wyglądać dopiero w widoku klasycznym. Dodatkowo, ich przełączanie powoduje widoczne odrysowanie strony, co sprawia, że poruszanie się pomiędzy otwartymi panelami trwa dłużej niż pomiędzy osobnymi oknami przeglądarki. Drugą funkcją jest obsługa &lt;abbr title=&quot;Really Simple Syndication&quot;&gt;RSS&lt;/abbr&gt;, która działa podobnie jak znane z Firefoksa &lt;q&gt;Live Bookmarks&lt;/q&gt; połączone z dodanym w Deer Parku czytnikiem subskrypcji.&lt;/p&gt;

&lt;p&gt;Zmiany w samym silniku renderującym albo nie występują, albo są bardzo dobrze ukryte. Z punktu widzenia obsługi standardów jest to stary, &lt;q&gt;dobry&lt;/q&gt; &lt;abbr&gt;IE&lt;/abbr&gt; 6.0. Należy jednak pamiętać, że jest to dopiero pierwsza publiczna wersja i na &lt;a href=&quot;http://blogs.msdn.com/ie/&quot; title=&quot;IEBlog&quot;&gt;oficjalnym blogu&lt;/a&gt; (tak przy okazji, czy ktoś już zauważył, jak dziwnie brzmi próba przeczytania tytułu tej strony przez Polaka?) przeglądarki pojawiły się już &lt;a href=&quot;http://blogs.msdn.com/ie/archive/2005/07/29/445242.aspx&quot; title=&quot;Standards and CSS in IE&quot;&gt;informacje na temat lepszego wsparcia dla standardów&lt;/a&gt;. Stąd też niepokój Rogera, czy szeroka adaptacja nie przyniesie sieci szkody.&lt;/p&gt;

&lt;p&gt;Zaznaczam, że nie mówimy tu o okresie kilku dni czy tygodni od premiery. Jak pokazuje w swoich książkach &lt;a href=&quot;http://useit.com/&quot;&gt;Jakob Nielsen&lt;/a&gt;, czas adaptacji nowych technologii wynosi około roku - po tym czasie możemy przyjąć, że do technologii ma dostęp większość internautów. W przypadku tej przeglądarki okres ten zostanie znacznie wydłużony - dostęp do nowej wersji mają tylko użytkownicy dwóch najnowszych systemów z Redmond - Windows XP i Vista, co na wstępie już utrudnia upgrade ludziom, którzy z różnych przyczyn do dziś korzystają ze starszych systemów. Nie zawsze jest to kwestia ingorancji, czasem jest to uwarunkowane polityką firmy bądź samymi kosztami.&lt;/p&gt;

&lt;p&gt;Co więc może przynieść nowa wersja? Cieszymy się (jako webdeveloperzy) na lepsze wsparcie dla standardów. Co jednak z dotychczas stosowanymi obejściami i sztuczkami, mającymi na celu wymuszenie prawidłowego wyświetlania serwisów w starszych braciach &lt;q&gt;siódemki&lt;/q&gt;? Wystarczy, że choćby jeden ze stosowanych dotąd hacków będzie nadal działał, a setki czy tysiące stron zaczną cierpieć na nagłą dysfunkcję. Z drugiej strony, poleganie na hackach to branie na siebie odpowiedzialności za ich działanie - nieudokumentowane funkcje mają tendencję do znikania.&lt;/p&gt;

&lt;p&gt;Lepsze bezpieczeństwo (przeglądarka po starcie pozbywa się systemowych przywilejów i działa w ograniczonym środowisku użytkownika na kształt znanego z Uniksów &lt;q&gt;chroota&lt;/q&gt;) to najgłośniejsze z haseł promowanych przez Gatesa i Ballmera, ale czym jest zabezpieczanie przeglądarki, kiedy ostatnimi czasy głównym źródłem wirusów jest poczta elektroniczna, a &lt;abbr title=&quot;Microsoft&quot;&gt;MS&lt;/abbr&gt; dawno temu już zarzucił rozwój swojego domowego klienta poczty - Outlook Express, który nadal jest w naszym kraju najpopularniejszym programem tego typu (mimo jego setki błędów i braków).&lt;/p&gt;

&lt;p&gt;Najgorsze, czego możemy się spodziewać, to powtórzenie sytuacji z aktualną wersją szóstą przeglądarki, która od pięciu lat jest tylko zapobiegawczo łatana. Szum generowany wokół najnowszej wersji i sam fakt wypuszczenia jej także dla Windows XP, choć początkowo miała być dostępna tylko dla Visty mogą wskazywać na to, że marketingowcy ze stajni &lt;abbr&gt;MS&lt;/abbr&gt; liczą na jednorazowe uderzenie i odbicie straconego rynku konkurencji, czyli przeglądarce Mozilli.&lt;/p&gt;

&lt;p&gt;Jeśli ich działania spełzną na niczym (a tak się zapewne stanie, w końcu nowa przeglądarka pod żadnym względem nie przewyższa Firefoksa), rozwój &lt;abbr&gt;IE&lt;/abbr&gt; może ponownie zostać zawieszony bądź też zupełnie przerwany, jak miało to miejsce w przypadku Internet Explorera dla komputerów Apple. Grozi nam wtedy kolejny zastój technologiczny, jednak czy nie jest on lepszy od stanu obecnego?&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Pimp my design!</title>
   <link href="http://room-303.com/blog/2005/08/10/4bad829ebb8f1f4a46d1772db09b96a0/"/>
   <updated>2005-08-10T20:35:46+00:00</updated>
   <id>http://room-303.com/blog/2005/08/10/4bad829ebb8f1f4a46d1772db09b96a0</id>
   <content type="html">&lt;p&gt;Dziś, drodzy zgromadzeni, profesor Pimpin pokaże wam, jak ważne jest rozdzielenie wyglądu i treści.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://patrys.room-303.com/images/photos/photo-pimp.jpg&quot; alt=&quot;Profesor Pimpin&quot; title=&quot;Art courtesy of monochrome.pl&quot; /&gt;&lt;br /&gt;
Profesor Pimpin przy pracy.&lt;/p&gt;

&lt;p&gt;Jako, że od pewnego czasu mój pracodawca zleca cięcie części projektów webmasterom zewnętrznym (outsourcing jest jazzy), oszczędza nam to dużo czasu, który możemy poświęcić na programowanie silników &lt;abbr title=&quot;PHP Hypertext Preprocessor&quot;&gt;PHP&lt;/abbr&gt;... albo na ponowne cięcie wyżej wspomnianych projektów.&lt;/p&gt;

&lt;p&gt;Problem z outsourcingiem polega na tym, że wszyscy zarzekają się, że są istnymi geniuszami, a ich praca warta jest każdych pieniędzy. Dziesiątki, ba - nawet setki, lat w braży, tysiące projektów na karku, pełen profesjonalizm. Rzeczywiście, ostatnio dostałem do ręki projekt wykonany z pozoru bez zarzutu. Szybki rzut okiem do kodu źródłowego ujawnił tylko kilka usterek, ale szablony zostały przygotowane zgodnie z &lt;abbr title=&quot;Extensible HyperText Markup Language&quot;&gt;XHTML&lt;/abbr&gt; 1.1 i bez użycia tabel.&lt;/p&gt;

&lt;p&gt;Później jednak zainteresował mnie jeden z formularzy, gdzie przycisk wysyłający dane niebezpiecznie nachodził na dolną krawędź fieldsetu. Nic to, pomyślałem, i zająłem się swoją pracą, czyli powoływaniem owego cuda do życia. Mniej-więcej w połowie podłączania szablonów do swojego systemu &lt;abbr title=&quot;Content Management System&quot;&gt;CMS&lt;/abbr&gt; zapragnąłem zmodyfikować podpis wspomnianego formularza, gdyż do granic eksploatowane przez nas &lt;em&gt;lorem ipsum&lt;/em&gt; zdawało się niewiele mówić przeciętnemu odwiedzającemu serwis. Podmieniłem przeto tekst na nieco inny i w tym miejscu szczęki moje rozwarły się by tak pozostać na czas dłuższy. Tekst, owszem, wydłużył się, jednak ostatnie pola formularza znalazły się już daleko za nim, nie wspominając o przycisku, który już wcześniej leżał na dolnej krawędzi. Obecnie przebywał prawdopodobnie około 200 pikseli niżej, niestety nie mogłem tego zweryfikować, gdyż wylewająca się treść formularza była skrupulatnie przykrywana przez inny boks na stronie.&lt;/p&gt;

&lt;p&gt;Webmaster tnąc szablony sugerował się projektem i konkretnymi tekstami zastępczymi, jakie zostały tam umieszczone. Cały boks formularza był tak naprawdę namalowany na jego tle, więc wydłużenie jego zawartości spowodowało wylanie się treści poza widoczne pod spodem ramki. Myślenie o designie w kontekście konkretnej treści jest jednym z największych błędów popełnianych przez niespecjalnie doświadczonych webmasterów. Robienie stron na własne potrzeby nie wymaga specjalnej elastyczności - gorzej, kiedy klient postanowi zastąpić proponowane treści własnymi. W końcu to jego serwis i po to właśnie kupił od nas system zarządzania treścią.&lt;/p&gt;

&lt;p&gt;Drugi problem dotyczący wspomnianego serwisu to skrypty &lt;abbr title=&quot;JavaScript&quot;&gt;JS&lt;/abbr&gt; i ich przywiązanie do szablonu. Odpowiedzialne są one za podświetlanie przycisków i podpowiedzi w formularzach. Wszystko działało bez zarzutu do czasu, kiedy zostaliśmy zmuszeni dodać na jednej z podstron kolejny formularz i kiedy to okazało się, że jest to dość trudne. Skrypty, co prawda, znajdowały się w zewnętrzym pliku, ale uparcie wyszukiwały w nim konkretne przyciski i konkretne pola formularzy. Wymusiłoby to na nas dopisywanie obsługi każdego formularza, każdego jego pola i wszystkich nowych przycisków do pliku ze skryptami. W końcu zdecydowałem się zrezygnować z zaproponowanego przez autora rozwiązania (co było samo w sobie dość problematyczne ze względu na bliskie powiązanie ich z funkcjonalnością serwisu) i skorzystać ze sprawdzonych wielokrotnie skryptów własnego autorstwa, o których &lt;a href=&quot;http://patrys.jogger.pl/comment.php?eid=132407&quot;&gt;pisałem w lipcu&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Podsumowując - czas oszczędzony na traktowaniu layoutu dosłownie (z dokładnością do piksela) to czas, który trzeba - prędzej czy później - z nawiązką włożyć w ponowne przeprojektowanie szablonu, kiedy treść przestanie spełniać jego oczekiwania (choć powinno być odwrotnie, to szablon powinien być dla treści, a nie treść dla szablonu).&lt;/p&gt;

&lt;p&gt;Na koniec drobna dygresja - bardzo kiepskim pomysłem jest tworzenie graficznych przycisków formularzy poprzez wymuszenie pustego napisu na przycisku i zastąpienie jego tła obrazkiem. Kiedy - podczas testów wspomnianych szablonów - na próbę zablokowałem arkusze &lt;abbr title=&quot;Cascading Style Sheets&quot;&gt;CSS&lt;/abbr&gt;, moim oczom ukazały się niewiele mówiące szare kwadraciki. Nie muszę chyba pisać, że nie budziły skojarzeń ze słowami typu &lt;q&gt;przelicz&lt;/q&gt; czy &lt;q&gt;wyślij&lt;/q&gt;. Czasem pomysłowość w stosowaniu &lt;abbr&gt;CSS&lt;/abbr&gt; mnie przeraża, zwłaszcza że istnieje &lt;code&gt;&amp;lt;input type=&quot;image&quot; /&amp;gt;&lt;/code&gt;...&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Historia pewnego systemu</title>
   <link href="http://room-303.com/blog/2005/08/04/97ce3b8672070b85b0d1e62234d5f9a1/"/>
   <updated>2005-08-04T22:30:02+00:00</updated>
   <id>http://room-303.com/blog/2005/08/04/97ce3b8672070b85b0d1e62234d5f9a1</id>
   <content type="html">&lt;p&gt;Jako, że z pracodawcą rozliczamy się na podstawie przepracowanych godzin, potrzebny jest nam niezawodny system śledzenia czasu pracy. Kiedy zatrudniłem się tam pierwszego września ubiegłego roku, w użyciu był prosty system webowy, napisany kiedyś na potrzeby firmy przez programistę, Roya. Świetnie spełniał swoje zadanie, a przynajmniej tak nam się wydawało.&lt;/p&gt;

&lt;p&gt;Funkcjonalność systemu sprowadzała się do trzech zadań - zbierał informację o godzinie przyjścia i wyjścia pracownika, o jego przerwach (np. bezpłatnych wyjściach na papierosa czy do sklepu), a na koniec dnia zapisywał podane przez pracownika krótkie podsumowanie dnia i plany na dzień kolejny. Całość sprzężona została oczywiście z kalendarzami pracowników, stąd system potrafił odróżnić dni pracujące od wolnych, śledził wykorzystanie urlopu i dawał nieograniczony dostęp do czytania własnej historii.&lt;/p&gt;

&lt;p&gt;Przyszedł czas zmian...&lt;/p&gt;

&lt;p&gt;Z nieznanych nam przyczyn odcięto nam dostęp do naszej historii, stąd niemożliwe stało się ustalenie, co robiliśmy tydzień temu, kiedy dokładnie pracowaliśmy nad danym projektem, ile dni urlopu wykorzystaliśmy, ani - co najzabawniejsze - jakie są nasze plany na dzisiaj. Zamiast tego zaproponowano nam dostęp do zbiorczych danych dla 3 ostatnich miesięcy (łączna liczba przepracowanych godzin w miesiącu bieżącym i dwóch poprzednich). Z mieszanymi uczuciami, przyzwyczailiśmy się jednak do nowych &lt;q&gt;features&lt;/q&gt;.&lt;/p&gt;

&lt;p&gt;Przyszedł czas zmian...&lt;/p&gt;

&lt;p&gt;Do systemu dodano możliwość podglądania własnych planów na dziś (czyli tego, co wczoraj wpisaliśmy na koniec dnia). Dla dalszego ułatwienia pracy, raporty dzienne przekształciły się w raporty zadaniowe. Zamiast jednego raportu na koniec dnia, od tego momentu byliśmy zmuszeni pisać raport po każdym zamkniętym zadaniu. Uciążliwość była o tyle do przebolenia, że wydawała się niczym w porównaniu z dodatkowym pomysłem - do projektów wprowadzono papierowe karty, gdzie każdy zmuszony był do wypisania wszystkich plików, nad którymi pracował oraz podpisania się pod odpowiedzialnością za ich działanie we wszystkich możliwych przeglądarkach, rozdzielczościach i walidatorach.&lt;/p&gt;

&lt;p&gt;Wypełnianie takiego arkusza na bieżąco nie miało sensu, bo mając otwartych 20 plików na raz ciężko stwierdzić, kiedy się skończyło pracę nad jednym z nich - jeśli jego funkcja zazębiała się z którymkolwiek z pozostałych plików, istniały duże szanse jego dalszego przerabiania później. &lt;q&gt;Matriksy&lt;/q&gt;, jak młodzieżowo nazwaliśmy nowe obiegówki, zmuszały człowieka do zapisania kartki formatu A4 drobnym maczkiem, a ich wypełnienie wywoływało trwały ból nadgarstka, który towarzyszył nam aż do wieczora. Czysta biurokracja, ale można się było do tego przyzwyczaić.&lt;/p&gt;

&lt;p&gt;Na tym etapie też do &lt;abbr title=&quot;System Ewidencji Pracy&quot;&gt;SĘP&lt;/abbr&gt;a dodano nowość, niespotykaną dotąd nawet we wdrożeniach enterprise'owych. System stał się niczym Chronos, władca czasu - punktualnie o 17:45 zamraża czas. Nigdy więcej spóźnień na randki czy do kina, niezależnie jak długo pracujesz po godzinach, zawsze wyjdziesz o 17:45! Usługa ta, jak mniemam, powstała celem redukcji moich zarobków, gdyż z biura zwykłem wychodzić po osiemnastej. Cóż, czego nie zarobi się w firmie, dorobić trzeba prywatnie, więc możnaby się przyzwyczaić, gdyby nie jedno wydarzenie.&lt;/p&gt;

&lt;p&gt;Przyszedł czas zmian...&lt;/p&gt;

&lt;p&gt;Papier popadł w niełaskę, być może modna zrobiła się ekologia, a może nikt nie umiał przeczytać milimetrowych hieroglifów - koniec końców, zaoszczędzimy na długopisach. Zamiast tego w systemie raportów cząstkowych pojawiła się lista rozwijalna z opcjami odpowiadającymi aktywnym projektom i ich podzadaniom. Spore ułatwienie dla załogi, choć i tak nic w porównianiu z rajem stanu początkowego. Na przywrócenie &lt;em&gt;status quo&lt;/em&gt; szans nie było, więc...&lt;/p&gt;

&lt;p&gt;Przyszedł czas zmian...&lt;/p&gt;

&lt;p&gt;Raporty po zakończeniu poszczególnych zadań zostały ostatnio zastąpione raportami poprzedzającymi te zadania. Najbardziej wygodę tego rozwiązania docenił &lt;a href=&quot;http://monochrome.pl/&quot;&gt;Jarv&lt;/a&gt;, nasz grafik - jego raporty wymagają bowiem załączania plików z wynikami pracy, co jest nieco uciążliwe przy pisaniu raportu przed wykonaniem faktycznej pracy. Od teraz zamiast jednego kroku, zupełnie za darmo, zyskał dostęp do dwóch. Jestem pewien, że nie może pozbierać się ze szczęścia. Tymczasem słychać już o planach dodania usługi &lt;q&gt;planowany czas wykonywania zadania&lt;/q&gt;, co z pewnością wydatnie zwiększy naszą wydajność.&lt;/p&gt;

&lt;p&gt;Po co przytaczam tę historię, można spytać? Po to, aby pokazać, jak przekombinowanie przy zarządzaniu projektem może przynieść skutki zupełnie odwrotne do zamierzonych. Ostatnia zmiana w systemie pojawiła się już po odejściu naszego poprzedniego project managera, Lukiego, który obecnie przebywa na emigracji w Anglii, gdzie za ciężko wypracowaną dziesięciokrotność naszych rocznych pensji stara się związać koniec z końcem ;). Widać wyraźnie, że szefowie próbują stworzyć system, który potrafiłby zastąpić zarządcę projektów, gdyby jednak było to możliwe, PM-i nie byliby jednymi z najlepiej opłacanych członków grup programistycznych. Praca bez osoby odpowiedzialnej za organizację jest utrudniona przez specyfikę naszej pracy, gdzie dwóch szefów ma rozbieżne oczekiwania odnośnie zagospodarowania czasu pracy, a zjawiska typu &lt;abbr title=&quot;Pilne Zlecenie Przerywające&quot;&gt;PZP&lt;/abbr&gt;, &lt;abbr title=&quot;Pilne Zlecenie Przerywające Inne Zlecenia Przerywające&quot;&gt;PZPIZP&lt;/abbr&gt;, czy nawet &lt;abbr title=&quot;Pilne Zlecenie Przerywające Inne Pilne Zlecenia Przerywające Zlecenia Przerywające&quot;&gt;PZPIPZPZP&lt;/abbr&gt; są codziennością.&lt;/p&gt;

&lt;p&gt;Wnioski są proste - próba poprawiania wydajności na siłę generuje zbędną biurokrację, co z kolei niejako wymusza niezamierzony strajk włoski. Pracę w takich warunkach można porównać do wydajności programu działającego pod kontrolą profilera, czy programu śledzącego - człowiek stale rozliczający się z każdej niemal minuty dnia nie jest w stanie zrobić nic w rozsądnym czasie, zwłaszcza kiedy przydział czasu na zadania nie jest ciągły, a rozdzielany pomiędzy kilka(naście) naprzemiennie kontynuowanych zadań.&lt;/p&gt;

&lt;p&gt;Co do pisania samych raportów i planowania czasu - to właśnie jest praca dla managera i żaden program go nie zastąpi, nawet przy dużym wkładzie dobrej woli ze strony zespołu. Pomyślcie o tym, jeśli znajdziecie się w podobnej sytuacji.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #016: Ekspertem być</title>
   <link href="http://room-303.com/blog/2005/07/26/d64ee19d27b7e9247059cbec74b5c201/"/>
   <updated>2005-07-26T11:04:43+00:00</updated>
   <id>http://room-303.com/blog/2005/07/26/d64ee19d27b7e9247059cbec74b5c201</id>
   <content type="html">&lt;p&gt;Są takie dni, kiedy człowiekowi szkodzi nadmiar słońca.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/016-gyno-expert.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>MTV, pimp my site!</title>
   <link href="http://room-303.com/blog/2005/07/25/a34a8899888349297d22632fad396686/"/>
   <updated>2005-07-25T19:31:12+00:00</updated>
   <id>http://room-303.com/blog/2005/07/25/a34a8899888349297d22632fad396686</id>
   <content type="html">&lt;p&gt;Jak najłatwiej poznać stronę, która była robiona dla właściciela a nie dla jego klientów? Przypomina kompostowisko. Znajdziesz tam wszystko, jest kolorowo, migocząco, tylko nikt nie chce tam chodzić. Całe szczęście, że internet jeszcze nie potrafi transportować zapachów. Przeprojektowane i przeładowane serwisy przytłaczają już po kilku sekundach od wejścia. Ich główny problem polega na tym, że jest tam tak dużo obiektów przyciągających oko, że w efekcie nie widzimy nic.&lt;/p&gt;

&lt;p&gt;Jak dobrze zaprojektować serwis? Najlepiej zacząć od projektu w programie obsługującym warstwy. Wśród zawodowych designerów dominują produkty Adobe i Macromedii (choć w tej chwili to już jedna firma). Wykonaj pełny projekt z rozwarstwieniem elementów graficznych (i tak jest to potrzebne do późniejszego pokrojenia projektu do &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt;), a następnie popatrz na efekt swojej pracy. Zapisz wynik i wykonaj jego kopię. Teraz w kopii po kolei wyłączaj wszystkie elementy dekoracyjne, jak gradienty czy obrazy tła. Najlepiej na tym etapie zaprosić do pomocy kogoś, kto nie ma zielonego pojęcia, że twój layout jest wspaniały. Porównując oryginał i kopię, ustalcie, które elementy są zbędne.&lt;/p&gt;

&lt;p&gt;Po kilku/kilkunastu takich podejściach nauczysz się myśleć w kategoriach użyteczności wizualnej, a nie samej estetyki. Popatrz, które elementy przyciągają wzrok i zastanów się, czy to właśnie one powinny skupiać na sobie uwagę odwiedzającego. Zastanów się, jakich informacji będzie szukał, bo zapewniam, że 99% gości nie wpadnie podziwiać designu. Pracuj nad jednolitą symboliką i kolorystyką. Fakt, że masz akurat pomysł na 25 świetnych bulletów nie oznacza, że każdy bullet na stronie powinien wyglądać inaczej. Unikaj zbędnych animacji, są jak płyta CD na przednim lusterku malucha - były modne w 1996, ale dziś tylko irytują.&lt;/p&gt;

&lt;p&gt;Pracuj nad układem informacji. Elementy zmieniające się najczęściej (jak aktualności na stronie głównej) powinny być łatwo zauważalne, a przede wszystkim powinny zaczynać się na pierwszym ekranie bez potrzeby przewijania. Jeśli strona na pierwszy rzut oka wygląda identycznie, odwiedzający założy, że nic się tam nie zmieniło.&lt;/p&gt;

&lt;p&gt;Stosuj spójną nawigację. Najlepiej, jeśli oddaje ona strukturę serwisu. Nie ma powodu, dla którego każda strona serwisu miałaby linkować do wszystkich pozostałych. Najważniejsze jednak, aby odwiedzający w każdym momencie wiedział, w jakim miejscu się znajduje.&lt;/p&gt;

&lt;p&gt;Myśl w kategoriach stron wejściowych. Goście będą odwiedzać twój serwis za pośrednictwem linków z wyszukiwarek, trafić mogą w dowolne miejsce i rzadko będzie to strona główna. Czy będą wiedzieć, gdzie się znajdują i gdzie szukać powiązanych informacji? Czy żadna ze stron nie jest ślepym zaułkiem?&lt;/p&gt;

&lt;p&gt;Jeśli dany dokument jest dostępny w kilku językach, to poinformuj o tym, nikomu nie będzie chciało się przejść na stronę główną w poszukiwaniu przełącznika wersji językowych, a przede wszystkim upewnij się, że przełączanie wersji językowych pozostawia użytkownika na tej samej stronie. Bardzo denerwują serwisy, gdzie klikamy link do polskiej wersji strony tylko po to, żeby znaleźć się nagle na stronie głównej serwisu, nie mając pojęcia o tym, jak dotrzeć do interesującego nas dokumentu.&lt;/p&gt;

&lt;p&gt;Podsumowując - postaw się na miejscu użytkownika odwiedzającego serwis, grafika pełni tu rolę drugoplanową i jej głównym zadaniem powinno być wyróżnienie poszczególnych elementów strony i kierowanie uwagą czytającego. Często sprawdza się w tej dziedzinie zupełny minimalizm, dowodem może być jeden z najczytelniejszych moim zdaniem serwisów - &lt;a href=&quot;http://auroraproject.sourceforge.net/&quot;&gt;Aurora Desktop&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>BugTracking</title>
   <link href="http://room-303.com/blog/2005/07/23/6216c34d00d21f39254854b0d01daba6/"/>
   <updated>2005-07-23T12:59:50+00:00</updated>
   <id>http://room-303.com/blog/2005/07/23/6216c34d00d21f39254854b0d01daba6</id>
   <content type="html">&lt;p&gt;Przy okazji jednego z dzisiejszych postów na &lt;a href=&quot;http://lists.pld-linux.org/mailman/listinfo&quot;&gt;pld-devel-pl&lt;/a&gt;, przypomniał mi się bardzo fajny tekst tyczący się zgłaszania problemów. Większość ludzi jest albo na tyle leniwa, żeby wcale nic nie zgłosić (i szkodzą sami sobie, bo deweloperzy nie mają szklanych kul i nie czytają w myślach), albo jest odrobinę mniej leniwa i zgłaszają problem w postaci zupełnie bezużytecznej (coś jak telefon do warsztatu samochodowego: &lt;q&gt;zepsuł się samochód, objaw jest taki, że nie działa&lt;/q&gt;).&lt;/p&gt;

&lt;p&gt;Biorąc pod uwagę, że nie jesteś autorem produktu, z którym masz problem, musisz dostarczyć odpowiednim ludziom odpowiednie informacje. Dlatego zanim zaczniesz na coś narzekać, przeczytaj najpierw biblię zgłaszających problemy: &lt;a href=&quot;http://www.catb.org/~esr/faqs/smart-questions.html&quot;&gt;How to ask questions the smart way&lt;/a&gt; Erica S. Raymonda.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Miłośnicy Uniksów</title>
   <link href="http://room-303.com/blog/2005/07/19/065d3b32d22b5565b7df481c084bd582/"/>
   <updated>2005-07-19T17:59:53+00:00</updated>
   <id>http://room-303.com/blog/2005/07/19/065d3b32d22b5565b7df481c084bd582</id>
   <content type="html">&lt;p&gt;Dokonywałem właśnie przed chwilą rutynowego przeglądu swojego MLDonkeya (pomińmy tu względy moralne tej wypowiedzi), upewniając się, że wśród połączonych serwerów znajduje się Razorback. Uwagę mą przykuł jednak jeden z pozostałych serwerów, o bardzo wdzięcznej nazwie domeny.&lt;/p&gt;

&lt;p&gt;Wszystkich równie ciekawych od razu uprzedzam, że wbrew swojej nazwie, serwis &lt;a rel=&quot;nofollow&quot; href=&quot;http://www.unixlovers.net/&quot;&gt;www.unixlovers.net&lt;/a&gt; zawiera... francuskie materiały o charakterze wysoce erotycznym (żeby nie powiedzieć, że zwykłe porno).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Rzecz o drukowaniu stron</title>
   <link href="http://room-303.com/blog/2005/07/18/d534af003533fdc153ee9c6ec7412012/"/>
   <updated>2005-07-18T18:18:26+00:00</updated>
   <id>http://room-303.com/blog/2005/07/18/d534af003533fdc153ee9c6ec7412012</id>
   <content type="html">&lt;p&gt;Serwisy typowo informacyjne, jak internetowe magazyny, duże portale czy sieciowe instrukcje obsługi są najczęściej drukowanymi stronami. Powinny oferować możliwość wydruku w wygodnej dla użytkownika formie, co oznacza, że powinny mieścić się w szerokości kartki i powiny marnować kartek jak najmniej. Stąd wszechobecne linki &lt;q&gt;wersja do wydruku&lt;/q&gt; na wspomnianych sajtach.&lt;/p&gt;

&lt;p&gt;Z drugiej strony, nie ma nic bardziej irytującego niż trafienie z Googli na taką właśnie &lt;q&gt;stronę do wydruku&lt;/q&gt;, pozbawioną jakiejkolwiek nawigacji czy chociażby odnośnika do oryginału. Kontynuacja lektury czy poszukiwanie dalszych informacji stają się niemożliwe.&lt;/p&gt;

&lt;p&gt;Również samo poszukiwanie przycisku odpowiadającego za wersję do wydruku jest często niewygodne, zwłaszcza, że webdesignerzy nagminnie wykazują się niezwykłą intuicją jeśli chodzi o dostępność i umieszczenie tej opcji.&lt;/p&gt;

&lt;p&gt;Co by było, gdyby zupełnie z niej zrezygnować? Niewiele osób zdaje sobie z tego sprawę, ale jest to całkiem realne i niezwykle proste do realizacji. Wystarczy przygotować dodatkowy arkusz &lt;abbr title=&quot;Cascading Style Sheets&quot;&gt;CSS&lt;/abbr&gt; i nadać mu odpowiedni atrybut &lt;code&gt;media&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Można zrobić to na dwa sposoby. Pierwszy polega na podaniu atrybutu w elemencie &lt;code&gt;&amp;lt;link/&amp;gt;&lt;/code&gt; już na etapie importu arkusza &lt;abbr&gt;CSS&lt;/abbr&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot;
	href=&quot;print.css&quot; media=&quot;print&quot; /&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Metoda ta ma tę zaletę, że wyraźnie rozdziela style przeznaczone do wydruku od tych przeznaczonych dla innych &lt;a href=&quot;http://www.w3.org/TR/REC-CSS2/media.html#media-types&quot;&gt;typów mediów&lt;/a&gt;. Druga metoda polega na zamknięciu reguł arkusza &lt;abbr&gt;CSS&lt;/abbr&gt; przeznaczonych dla danego typu mediów w opisany blok:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;@media print
{
	/* tutaj reguly CSS */
}&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Regułki specyficzne dla medium wydruku powinny ukryć zbędne elementy nawigacyjne i nieistotne dekoracje graficzne, jak bannery czy grafiki tła. Tutaj potęgę swą pokazują layouty zbudowane w oparciu o czysty &lt;abbr title=&quot;(Extensible) HyperText Markup Language&quot;&gt;(X)HTML&lt;/abbr&gt;, gdzie sterowanie układem strony jest znacznie wygodniejsze niż w przypadku układów tabelkowych.&lt;/p&gt;

&lt;p&gt;Jeśli boisz się, że użytkownicy nadal będą szukać wersji &lt;q&gt;drukowalnej&lt;/q&gt;, to zawsze możesz umieścić w serwisie dodatkowy (niezależny od arkusza dla wydruku) link wywołujący tę samą stronę ze zmienionym arkuszem ekranowym (media &lt;em&gt;screen&lt;/em&gt;) &lt;abbr&gt;CSS&lt;/abbr&gt;, a ponad to podłączyć odpowiednią akcję &lt;abbr title=&quot;JavaScript&quot;&gt;JS&lt;/abbr&gt;, co pozwoli na przełączanie arkuszy w locie (i tym samym zaoszczędzi użytkownikom pobierania plików). Jakąkolwiek wersję wybierzesz, zaoszczędzi to masę kodu po stronie serwera i zwiększy użyteczność strony.&lt;/p&gt;

&lt;p&gt;Przykład tak skonstruowanego serwisu można oglądać na &lt;a href=&quot;http://pld-linux.org/&quot;&gt;oficjalnej stronie PLD&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Prywatnie: Operacja Twoja Stara</title>
   <link href="http://room-303.com/blog/2005/07/17/c73df7cada219f2735455bed046366a4/"/>
   <updated>2005-07-17T19:53:03+00:00</updated>
   <id>http://room-303.com/blog/2005/07/17/c73df7cada219f2735455bed046366a4</id>
   <content type="html">&lt;p&gt;Piątek, 2030 Żulu Time.&lt;/p&gt;

&lt;p&gt;Telefon od Sh69fara. Jest misja do wykonania. Szybki prysznic. Laptop zapakowany do plecaka, portfel w stanie gotowości bojowej, strój maskujący (2x chusta + gogle). Wymarsz.&lt;/p&gt;

&lt;p&gt;Piątek, 2120 Żulu Time&lt;/p&gt;

&lt;p&gt;Punkt zborny, oddział Alpha już czyta swój briefing (&lt;q&gt;Three... Two... One... Go! Go! Go!&lt;/q&gt;) oddział Bravo przygotowuje się do misji (&lt;q&gt;Kochanie, a jak ustawić, żeby myszka chodziła szybciej?&lt;/q&gt;). Załatwiłem z kwatermistrzem fakt swojego przybycia i otrzymałem polecenie wyładowania sprzętu ciężkiego. Rozłożyłem się w kantynie, przy jednym ze stolików, gdzie zasiadali oficerowie.&lt;/p&gt;

&lt;p&gt;Dokonując gwałtu analnego na własnej osobie, zmusiłem się do rozdziewiczenia swojego notebooka. Asus pierwszy raz za swojej egzystencji zobaczył był Windows. Instalacja tymczasowa, tak zwana &lt;q&gt;dwudniówka&lt;/q&gt; na specjalnie wygospodarowanej partycji. &lt;q&gt;Zapoznaj się z Windows!&lt;/q&gt; &lt;q&gt;To nowe przeżycie!&lt;/q&gt; Przy okazji okazało się, że Windows nie potrafi założyć sobie partycji bez pomocy Linuksa. Na dysku mój standardowy desktopowy podział, czyli mały &lt;code&gt;/boot&lt;/code&gt; z ext2, nastepnie partycja wymiany na 512 MB, a cała reszta to &lt;code&gt;/&lt;/code&gt; z xfs. Dodatkowo 5 GB wolnej przestrzeni na końcu. Windows uparcie twierdził, że wyczerpałem limit partycji podstawowych i dalsza instalacja wymaga przeformatowania układu dysku (czyżby wykrył Linuksa?). Po krótkim epizodzie erotycznym z użyciem płyty PLD Live i &lt;code&gt;cfdisk&lt;/code&gt; (czytaj: wyruchałem Windowsa i sam założyłem partycję z FAT32), dalsza instalacja przeszła bez problemów.&lt;/p&gt;

&lt;p&gt;Po tej operacji przyszło mi wyruszyć na zwiad w kierunku okolicznych terenów o podwyższonej wartości strategicznej - na stacji benzynowej przyległej do nieczynnego już od godziny &lt;a href=&quot;http://tgg.wroc.pl/&quot;&gt;TGG&lt;/a&gt; zakupiłem plecak pełen napojów energetycznych Lech i Carlsberg, następnie uzupełniłem braki prowiantu w tamtejszym McDonaldzie.&lt;/p&gt;

&lt;p&gt;Ciepło przywitany w bazie (zapewne z powodu niesionej paczki z cheeseburgerami), ochoczo rozpocząłem mozolny proces instalacji (posiłkując się - dosłownie - przyniesionymi dobrami - wszak był to mój pierwszy piątkowy posiłek). Już po chwili byłem gotowy do walki - &lt;em&gt;Operacja Flashpoint: Resistance&lt;/em&gt; powitała mnie proroczym napisem: &lt;q&gt;Genius at play&lt;/q&gt;.&lt;/p&gt;

&lt;p&gt;Walki trwały niemalże bez przerwy przez kolejne 24 godziny. Niemalże, bo niezbędne były chwile odpoczynku na zrobienie kawy, otwarcie świeżego piwa, czy wymianę załogi (jako jedyny nie położyłem się spać). Kilka razy robiliśmy też przerywniki w Quake 1 (gdzie zamiatałem wszystkich nawet pod koniec imprezy) i Unreal Tournament (gdzie zamiatano mną).&lt;/p&gt;

&lt;p&gt;Było bardzo przyjemnie, ale przy okazji wyszło na to, że się starzejemy. Wypiliśmy mniej alkoholu, paru osób brakowało, a w sobotę wieczorem prawie nikt już nie miał siły grać (początkowo zakładaliśmy, że skończymy w niedzielę około południa). Inna sprawa, że kiedyś komputery wrzucało się luzem (czasem dosłownie, jeden ze stałych imprezowych komputerów - z braku obudowy - był zawsze montowany na gazetach na miejscu) do jakiegoś malucha i wiozło na miejsce, a dziś sprowadzane z zachodu oryginalne obudowy trzeba owijać styropianem i folią, a potem transportować w kartonie, odpowiednio unieruchomine. Nie wspomnę o szklanej podkładce do myszy Sh69fara. :)&lt;/p&gt;

&lt;p&gt;Imprezę uważam za udaną, choć prawdopodobnie była ostatnim flashpointowym LAN party. Powstaje tylko pytanie:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;- Co na to twoja stara?&lt;/p&gt;

&lt;p&gt;- Chyba twoja!&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; żeby nie było, że nic nie piliśmy, napisałem &lt;q&gt;mniej niż zwykle&lt;/q&gt; mając na myśli 5x Lech 0,66 l + 5x Carlsberg 0,5 l + 1,5x Carlsberg 0,5l od HoBBita + 0,5x Carsberg 0,5 l od YamroZa. Dowody do obejrzenia w &lt;a href=&quot;http://gallery.room-303.com/Imprezy/2005.07.15%20-%20Operacja%20Twoja%20Stara/&quot;&gt;galerii&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Użyteczne formularze</title>
   <link href="http://room-303.com/blog/2005/07/13/f6f450bea37e19459ad2d5f070793180/"/>
   <updated>2005-07-13T20:30:57+00:00</updated>
   <id>http://room-303.com/blog/2005/07/13/f6f450bea37e19459ad2d5f070793180</id>
   <content type="html">&lt;p&gt;Aplikacje sieciowe rządzą się swoimi prawami, jednym z nich jest niemożliwość uniknięcia formularzy. Te ostatnie można zaprojektować lepiej lub gorzej, zastanówmy się więc, co zrobić, aby były chociaż ciut wygodniejsze w użyciu.&lt;/p&gt;

&lt;p&gt;Przede wszystkim należy się wystrzegać układu wielokolumnowego. Schemat najwygodniejszy dla oka to dwie kolumny, gdzie jedna zawiera opisy pól, zaś druga to kontrolki niezbędne do wprowadzania danych. Kolumnę z nagłówkami można wyrównać - wedle uznania - do lewej lub prawej, jednak jej centrowanie jest raczej kiepskim pomysłem - zabija to ideę układu dwukolumnowego, gdzie wszystkie dane wyrównane są do jednej (w przypadku wyrównania nagłówków do prawej) lub dwóch (w przypadku wyrównania do lewej) osi. Może się wydawać, że zysk na czytelności jest niewielki, jednak badania prowadzone z udziałem ludzi po czterdziestym roku życia pokazują, że dla nich różnica jest znaczna.&lt;/p&gt;

&lt;p&gt;Należy grupować logicznie powiązane ze sobą dane w nazwane zestawy pól. Służy do tego element &lt;code&gt;&amp;lt;fieldset/&amp;gt;&lt;/code&gt; w połączeniu z obowiązkowym elementem &lt;code&gt;&amp;lt;legend/&amp;gt;&lt;/code&gt;. Zwiększa to czytelność formularza, usuwa wrażenie bezładu i uzasadnia taką a nie inną kolejność pól.&lt;/p&gt;

&lt;p&gt;Powinno się unikać nadmiarowych pól. Jeśli aplikacja nie wymaga poszczególnych składowych adresu (jak np. numer domu), to znacznie ułatwimy życie swoim gościom, jeśli skleimy pola typu &lt;em&gt;ulica&lt;/em&gt;, &lt;em&gt;nr domu&lt;/em&gt;, &lt;em&gt;nr lokalu&lt;/em&gt;, &lt;em&gt;kod pocztowy&lt;/em&gt; i &lt;em&gt;miasto&lt;/em&gt; w jedno większe pole zatytułowane &lt;em&gt;adres&lt;/em&gt;, podając pod spodem oczekiwany format adresu. Powód jest prosty - większość użytkowników do przełączania się pomiędzy polami formularza używa myszy, więc konieczność wypełnienia kilku pól więcej jest bardzo uciążliwa.&lt;/p&gt;

&lt;p&gt;Staraj się, aby wszystkie pola były podobnej długości, nie wprowadzaj więcej niż dwie - trzy różne długości pól, w ten sposób łatwiej podążać wzrokiem za nagłówkami, nie skupiając się na samych polach.&lt;/p&gt;

&lt;p&gt;Do reprezentacji alternatywy wybieraj odpowiednie kontrolki. Jeśli opcje są dwie, to odpowiedni będzie checkbox (dla odpowiedzi tak/nie) lub 2 radiobuttony (w pozostałych przypadkach), niedopuszczalne jest np. użycie checkboksa do wyboru pomiędzy dwoma kolorami (&lt;q&gt;zaznacz, jeśli produkt ma być czerwony, w przeciwnym wypadku będzie żółty&lt;/q&gt;). Radiobuttony są najlepszym wyjściem, kiedy opcji jest więcej niż dwie - zapewniają największą czytelność, bo wszystkie opcje widoczne są jednocześnie. Mają jednak jedną wadę - zajmują dużo miejsca, co bardzo przeszkadza, kiedy opcji jest więcej. Wtedy lepiej użyć rozwijalnej listy, jednak powinna to być ostateczność, bo jej użycie wymaga dodatkowego kliknięcia, zanim pojawią się dostępne opcje. Wystrzegać za to należy się listy (selectbox z liczbą wierszy większą niż jeden) - internauci nie są przyzwyczajeni do tej kontrolki i często nie wiedzą, jak z niej korzystać.&lt;/p&gt;

&lt;p&gt;Do wyboru kilku spośród równorzędnych opcji zawsze najlepsza jest seria checkboksów. Niech nikomu nawet przez myśl nie przejdzie implementacja takiego wyboru za pomocą listy z włączoną opcją kilku wyborów. Lista jest przede wszystkim niewygodna - wymaga przewijania w celu dostania się do potrzebnych nam opcji. Jest też nieintuicyjna - wybranie kilku opcji wymaga przytrzymania klawisza Control (lub innego w przypadku architektur różnych od PC), z czego niewiele osób zdaje sobie sprawę. Ewentualne zaoszczędzone względem checkboksów miejsce trzebaby poświęcić na instrukcję obsługi korzystania z kontrolki listy.&lt;/p&gt;

&lt;p&gt;Nie ma nic bardziej denerwującego niż klikanie na wielki napis &lt;q&gt;tak, zgadzam się&lt;/q&gt; tylko po to, żeby dowiedzieć się, że nie jest on klikalny i musimy celować w niewielkich rozmiarów biały kwadracik checkboksa znajdującego się obok. &lt;strong&gt;Należy korzystać z elementu &lt;code&gt;&amp;lt;label/&amp;gt;&lt;/code&gt;&lt;/strong&gt;, pozwala on na uzyskanie fokusa przez kontrolkę po kliknięciu na jej opis i jest szalenie wygodne w przypadku każdego typu pól. Wystarczy atrybut &lt;code&gt;for&lt;/code&gt; elementu &lt;code&gt;&amp;lt;label/&amp;gt;&lt;/code&gt; ustawić na taką samą wartość, jak atrybutowi &lt;code&gt;id&lt;/code&gt; odpowiedniej kontrolki.&lt;/p&gt;

&lt;p&gt;Osoby starsze bardzo pozytywnie reagują na mały zabieg, polegający na wyróżnieniu aktywnego pola za pomocą niewielkiej zmiany kolorów. Można to uzyskać przez odpowiednie reguły &lt;abbr title=&quot;Cascading Style Sheets&quot;&gt;CSS&lt;/abbr&gt;, jednak efekt ten nie zadziała w &lt;abbr title=&quot;Internet Explorer&quot;&gt;IE&lt;/abbr&gt;. Niestety, ta przeglądarka wymaga dodatkowych skryptów &lt;abbr title=&quot;JavaScript&quot;&gt;JS&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;Na koniec najprostszy zabieg - zatrudnienie do pracy JavaScriptu. Pozwala to na przetworzenie i zweryfikowanie formularza jeszcze przed wysłaniem go na serwer. Jak często zdarzyło się wam klikać &lt;q&gt;wyślij&lt;/q&gt; dziesiąty raz z rzędu, aby po minucie ładowania otrzymać kolejny komunikat o niewypełnionym polu? Jeśli przeglądarka wspiera &lt;abbr&gt;JS&lt;/abbr&gt;, to można przygotować nieinwazyjny skrypt, który sam po cichu podłączy się do formularzy na stronie i przed ich wysłaniem upewni się, że wszystko wpisaliśmy zgodnie z intencjami autora serwisu. Tutaj uwaga - wyświetlenie komunikatu &lt;q&gt;nie wypełniłeś wymaganych pól&lt;/q&gt; nie mówi użytkownikowi wiele. Należy przy okazji wskazać mu pola, o których zapomniał.&lt;/p&gt;

&lt;p&gt;Przykład zastosowania JavaScriptu do wstępnej walidacji formularza można znaleźć na &lt;a href=&quot;http://patrys.icenter.pl/test/2005-07-13-form-enhancements/&quot;&gt;mojej stronie demonstracyjnej&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Można tam też zobaczyć niewielki gadżet - pasek &lt;q&gt;postępu&lt;/q&gt; wysyłania formularza, który daje użytkownikowi poczucie, że coś się dzieje, co jest szczególnie ważne w przypadku uploadu dużych plików za pomocą formularza na stronie.&lt;/p&gt;

&lt;p&gt;Na &lt;a href=&quot;http://patrys.icenter.pl/test/2005-02-10-form-tips/&quot;&gt;drugiej stronie demonstracyjnej&lt;/a&gt; można zobaczyć przykład innego skryptu - wyświetlania podpowiedzi wewnątrz pól edycyjnych, co przydaje się szczególnie, jeśli na stronie nie ma miejsca na opis dla danego pola (np. mini-wyszukiwarki umieszczane w nagłówkach stron).&lt;/p&gt;

&lt;p&gt;Oczywiście, nie wyczerpałem tutaj tematu i nawet nie miałem takiego zamiaru - jest to tylko garść (mam nadzieję, że przydatnych) porad.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #015: Love broadcast</title>
   <link href="http://room-303.com/blog/2005/07/11/3c678df13e0dc478572585fe4da75115/"/>
   <updated>2005-07-11T19:49:06+00:00</updated>
   <id>http://room-303.com/blog/2005/07/11/3c678df13e0dc478572585fe4da75115</id>
   <content type="html">&lt;p&gt;This public announcement is brought to you by America Online, the home of the l33t.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/015-aol.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>HOWTO: Szukanie pracy w IT</title>
   <link href="http://room-303.com/blog/2005/07/10/ddd63ff9918f02c85dd101903d5a7f69/"/>
   <updated>2005-07-10T10:51:20+00:00</updated>
   <id>http://room-303.com/blog/2005/07/10/ddd63ff9918f02c85dd101903d5a7f69</id>
   <content type="html">&lt;p&gt;Wszyscy trąbią, że ciężko o pracę, że nie ma, że bieda w kraju. O ile górnicy faktycznie mają na co narzekać, o tyle umęczeni informatycy (w szerokim tego słowa znaczeniu) plotą bzdury. Miejsc pracy jest więcej niż fachowców, bo rynek ten w Polsce dopiero się rozwija, a w ofertach można wręcz przebierać.&lt;/p&gt;

&lt;h3&gt;Przygotowania wstępne&lt;/h3&gt;

&lt;p&gt;Mówienie o informatyce jak o konkretnym zawodzie, to jak powiedzenie, że konkretną pracą jest robotnik. Są tu setki specjalności, od statystyki po programowanie, a każda ma inne wymagania i specyfikę pracy. Łączy je tylko jedno - do pracy niezbędny jest komputer. Jako programista, skupię się bardziej na rdzeniu tego rynku, czyli na specjalizacjach technicznych - programowaniu, administracji, aplikacjach sieciowych.&lt;/p&gt;

&lt;p&gt;Pierwszą ważną rzeczą jest wybranie w miarę wąskiej specjalizacji. Nikt nie zabrania ci posiadać wielu hobby i interesować się wszystkim po trochu, jednak twój pracodawca będzie zainteresowany współpracą z tobą w zakresie konkretnych obowiązków. Stąd powinieneś przede wszystkim inwestować swój czas w rozwój w wybranym kierunku. Jeśli chcesz być programistą, wybierz grupę docelową. Mogą to być aplikacje desktopowe, software na komórki, gry komputerowe, oprogramowanie serwerowe, aplikacje internetowe, zagnieżdżone systemy czasu rzeczywistego czy skrypty Flash. Jako administrator możesz specjalizować się w zarządzaniu farmami produkcyjnymi, rozległymi sieciami, czy tuningu konkretnych usług serwerowych. Wszystko jedno, co wybierzesz, niech stanie się to twoją mocną stroną. Przeciętny student informatyki ma przynajmniej minimalne pojęcie o każdym z wybranych kierunków, ty nie możesz być przeciętny, musisz przekonać pracodawcę, że to właśnie ty najlepiej pasujesz do danego stanowiska.&lt;/p&gt;

&lt;p&gt;Śledź rynek. Skończyły się czasy, kiedy wystarczyło trochę poklikać w jakimś programie, żeby uważać się za guru i wyrocznię. Chcesz pracować jako webdeveloper i znasz &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt;? Świetnie, ale czy potrafisz swobodnie poruszać się w technologiach takich jak &lt;abbr title=&quot;Cascading Style Sheets&quot;&gt;CSS&lt;/abbr&gt;, &lt;abbr title=&quot;simple Inman Flash Replacement&quot;&gt;sIFR&lt;/abbr&gt;, &lt;abbr title=&quot;Asynchronous JavaScript And XML&quot;&gt;AJAX&lt;/abbr&gt;? Cytujesz obiekty drzewa &lt;abbr title=&quot;Document Object Model&quot;&gt;DOM&lt;/abbr&gt; z pamięci? Mamy rok 2005 i technika nie stoi w miejscu, klienci (a przez to i pracodawcy) oczekują nowinek, a ty będziesz musiał temu podołać.&lt;/p&gt;

&lt;p&gt;Upewnij się, że używasz najoptymalniejszych narzędzi i naucz się je efektywnie wykorzystywać. Oczywiście, kod można pisać w notatniku, ale z całą pewnością dużo wygodniej robi się to w zintegrowanych środowiskach, oferujących zwijanie sekcji i kolorowanie składni. Dowiedz się, z czego korzystają autorytety w danej branży, nie zatrzymuj się na pierwszym programie, który działa. Sumiennie porównaj dostępne na rynku aplikacje i zorganizuj sobie listę wad i zalet. Pamiętaj, że być może w przyszłości będziesz zmuszony korzystać z odgórnie narzuconego oprogramowania - najprawdopodobniej będzie to właśnie jeden z uznanych w branży liderów.&lt;/p&gt;

&lt;p&gt;Śledź ludzi. Mamy XXI wiek, czas blogów. Blogi prowadzą uczniowie podstawówek, gimnazjów, licealiści i studenci. Być może cię to zdziwi, ale prowadzą je także biznesmeni, managerowie i programiści. Popytaj bardziej doświadczonych, niech polecą ci kilka linków, stamtąd - po siatce odnośników - trafisz na szersze wody. Zanim zachwycisz się ślepo każdym, kto pisze posty dłuższe niż dwa zdania o myciu zębów, rozejrzyj się po wzajemnych relacjach, polemice i krytyce na innych blogach - będzie ci łatwiej zorientować się, kto powinien być dla ciebie autorytetem.&lt;/p&gt;

&lt;p&gt;Naucz się biegle czytać angielskie teksty, 90% interesujących cię informacji znajdziesz w sieci właśnie w tym języku. Nieodzowne będzie także zaznajomienie się ze słownictwem specyficznym dla danej branży - dotyczy to tak języka polskiego jak i angielskiego. Nie zdziw się, kiedy ktoś zapyta cię, czy wiesz co to &lt;em&gt;floatus divitis&lt;/em&gt; czy &lt;em&gt;segvowanie&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Naucz się organizować swój czas. Sprawdź, ile czasu zajmuje ci wykonanie każdego projektu. Oblicz, ile procent z tego czasu poświęcasz na poszczególne etapy realizacji. Zastanów się, czy gdyby więcej czasu poświęcić na wcześniejsze planowanie, to faza budowania i wdrażania nie uległaby skróceniu. Naucz się myśleć przyszłościowo, realizując fragment pracy, pomyśl, jakie mogą być potencjalne przyczyny jego późniejszej modyfikacji i czy nie można temu zapobiec już w danym momencie.&lt;/p&gt;

&lt;p&gt;Szukaj znajomości, znajomości zawsze się przydają. Czy to w poszukiwaniu pracy, czy w późniejszym rozwiązywaniu napotkanych problemów. Często będziesz w stanie zaoszczędzić mnóstwo czasu, zwracając się do osoby, która dany problem już rozwiązała.&lt;/p&gt;

&lt;h3&gt;Poszukiwanie pracy&lt;/h3&gt;

&lt;p&gt;Z najlepszym nawet przygotowaniem, nie oczekuj, że praca sama cię znajdzie. Oczywiście, z czasem i takie przypadki zdarzają się coraz częściej - wystarczy wyrobić sobie choćby minimalną renomę. Póki co jednak, trzeba szczęściu dopomóc.&lt;/p&gt;

&lt;p&gt;Zanim zaczniesz szukać pracy i porównywać ogłoszenia, dowiedz się jak najwięcej o strukturze płac w wybranym sektorze rynku. To, co dla świeżo upieczonego studenta może wyglądać na lukratywną ofertę, może w rzeczywistości leżeć grubo pod kreską przeciętnych zarobków. Musisz oczywiście wziąć pod uwagę swój staż i umiejętności.&lt;/p&gt;

&lt;p&gt;Największym źródłem ofert pracy są grupy dyskusyjne (pl.praca.oferowana), często jest to też miejsce, gdzie dane ogłoszenie pojawia się po raz pierwszy. Warto regularnie przeglądać podsyłane tam oferty. Niestety, większość pracodawców ogłaszających się za pośrednictwem Usenetu to ludzie poszukujący zdespoerowanych studentów, stąd oferowane zarobki są niewspółmiernie niskie w porównaniu do nakładanych na pracownika obowiązków. Ignoruj takie ogłoszenia, bardziej opłaca się poszukać dłużej niż potem żałować podjętej współpracy.&lt;/p&gt;

&lt;p&gt;Drugim źródłem informacji o ofertach jest prasa papierowa. Są to zarówno dzienniki o charakterze ogólnoinformacyjnym, jak i specjalizowane magazyny branżowe. Pierwsze mają ogromną zaletę - publikują tylko ogłoszenia z okolic twojego miejsca zamieszkania. Drugie z kolei ograniczają się do potencjalnych miejsc, w których chciałbyś pracować. Firmy publikujące się w magazynach branżowych mają też z reguły większy budżet, a co za tym idzie, więcej pieniędzy do wydania na ciebie.&lt;/p&gt;

&lt;p&gt;Trzecim źródłem ofert są dedykowane serwisy internetowe - od bardzo ogólnych, jak &lt;a href=&quot;http://praca.pl/&quot;&gt;praca.pl&lt;/a&gt;, przez dedykowane dla konkretnych grup, jak &lt;a href=&quot;http://www.careers.uni.wroc.pl/&quot;&gt;wrocławskie Biuro Karier dla studentów&lt;/a&gt;, aż do specjalizujących się w konkretnej branży, jak &lt;a href=&quot;http://itkontrakt.pl/&quot;&gt;IT Kontrakt&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Nie bój się zgłaszać do rekrutacji. Jeśli to możliwe, swoje &lt;abbr title=&quot;Curriculum Vitae&quot;&gt;CV&lt;/abbr&gt; i list motywacyjny wysyłaj pocztą elektroniczną - przerzucasz w ten sposób całość kosztów rekrutacji na potencjalnego pracodawcę, co pozwala startować jednocześnie w konkursach do kilku-kilkunastu ofert. Zgłaszaj swoją kandydaturę nawet kiedy nie jesteś pewien w 100% swojego zainteresowania. W przypadku rezygnacji, grzecznie poinformuj o tym firmę, nie musisz podawać powodu zmiany zdania.&lt;/p&gt;

&lt;p&gt;Zanim zdecydujesz się walczyć o konkretne stanowisko, rozpoznaj rynek. Dowiedz się, jak duża jest firma, jaką cieszy się renomą i ile osób zatrudnia. Będzie ci łatwiej ocenić możliwości rozwoju zawodowego, podwyżki czy awansu. Małe, kilku(nasto)osobowe firmy charakteryzują się lepszą atmosferą pracy, ale z reguły płacą mniej. Duże firmy mniej liczą się z kosztami, ale obowiązuje tam większa dyscyplina pracy.&lt;/p&gt;

&lt;p&gt;Nie ograniczaj się do rynku ściśle związanego z &lt;abbr&gt;IT&lt;/abbr&gt;. Często lepiej płatną pracę można znaleźć w firmie zajmującej się innego typu działalnością, a tylko poszukującej specjalisty na dane stanowisko.&lt;/p&gt;

&lt;p&gt;Nie popędzaj pracodawcy. Zasypywanie firmy telefonami i emailami nie przyspieszy procesu rekrutacji. Warto za to przypominać się co jakiś czas (np. raz na kwartał), jeśli upragnionego stanowiska nie dostaniesz. Dajesz w ten sposób pracodawcy znać, że twoja kanydatura nadal jest aktualna. Dobrze przy okazji podesłaś uaktualnione &lt;abbr&gt;CV&lt;/abbr&gt; i pochwalić się postępami.&lt;/p&gt;

&lt;h3&gt;Rozmowa kwalifikacyjna&lt;/h3&gt;

&lt;p&gt;Jeśli twoje resume zrobi odpowiednio dobre wrażenie, zostaniesz zaproszony do kolejnego etapu rekrutacji, którym jest spotkanie osobiste. Dobrym pomysłem jest przygotowanie się do tego wizualnie, to jest wbicie się w najlepszy garnitur ze ślubu szwagra i wypolerowanie butów. Są od tego pewne wyjątki (np. ja na ostatniej rozmowie byłem w szerokich spodniach i bluzie z kapturem oraz z nieśmiertelnikami na szyi), ale jeśli pracodawca nie zaznaczy wyraźnie, że możesz przyjść ubrany luźno, to znaczy że nie możesz. Nie należy przesadzać również w drugą stronę, jeśli twój rozmówca podejmie cię w sportowej marynarce, a ty wyglądać będziesz jak prezes banku, to może to wywołać negatywne skojarzenia związane z twoją osobą.&lt;/p&gt;

&lt;p&gt;Nie ćwicz przed lustrem uśmiechu i nie pisz mowy otwierającej. Bądź naturalny, podchodź do sprawy profesjonalnie, ale nie sztywno. Lepsze wrażenie zrobisz dowcipną odpowiedzią niż wydukanym cytatem z podręcznika.&lt;/p&gt;

&lt;p&gt;Nie spóźnij się, komisja rekrutacyjna ma prawo trzymać cię na korytarzu dowolnie długo, ale tobie nie wolno pozwolić im czekać - to oznacza brak szacunku.&lt;/p&gt;

&lt;p&gt;Nie chwal się na zapas, nie opowiadaj o rzeczach, które nie miały miejsca. Łatwo twoje umiejętności sprawdzić w praktyce, a najmniejsze nawet wykryte kłamstwo spowoduje przesunięcie twojej kandydatury w bardzo bliskie okolice kosza.&lt;/p&gt;

&lt;p&gt;Nie bądź skromny, ale unikaj dumy. Pokaż wszystkie swoje zalety, ale tylko te związane ze stanowiskiem, o które się starasz. Zanudzanie szefa osiągnięciami w konkursach recytatorskich z pierwszych lat szkoły podstawowej nie uczyni cię w jego oczach bardziej inteligentnym.&lt;/p&gt;

&lt;p&gt;Odpowiadaj całymi zdaniami. Staraj się odpowiadać jak najlepiej potrafisz, ale nie lej wody. Jeśli nie masz pojęcia na dany temat, to zaznacz to wyraźnie, przy okazji dodając, że szybko się uczysz, a następnie skieruj rozmowę ponownie na listę swoich zalet.&lt;/p&gt;

&lt;p&gt;Unikaj rozmowy na temat poprzednich miejsc pracy, im mniej mówisz o wadach poprzednich firm, tym większą odznaczasz się lojalnością i dyskrecją. Są to cechy jak najbardziej pożądane w każdym miejscu pracy.&lt;/p&gt;

&lt;h3&gt;Test praktyczny&lt;/h3&gt;

&lt;p&gt;Przygotuj się na to, że coraz więcej firm chce sprawdzić kandydata jeszcze zanim zacznie pracę. Może się zdarzyć tak, że w kilka dni po rozmowie kwalifikacyjnej zostaniesz zaproszony na poligon, gdzie w ciągu paru godzin pracy przy komputerze sprawdzone zostaną twoje deklaracje umiejętności. Szybko zobaczysz, dlaczego nie warto było kłamać w czasie rozmowy kwalifikacyjnej.&lt;/p&gt;

&lt;p&gt;Zanim przystąpisz do testu, dowiedz się, co będzie oceniane, czy komisja zwracać będzie uwagę na metodę rozwiązania, czy na efekt. Pamiętaj o tym podczas rozwiązywania postawionego ci problemu.&lt;/p&gt;

&lt;p&gt;Powodzenia.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Okiem ekstremisty</title>
   <link href="http://room-303.com/blog/2005/07/09/b4e60768e4491b4e92a3d229fe5eb465/"/>
   <updated>2005-07-09T17:10:05+00:00</updated>
   <id>http://room-303.com/blog/2005/07/09/b4e60768e4491b4e92a3d229fe5eb465</id>
   <content type="html">&lt;p&gt;Dziś dostałem od znajomego link do artykułu znajdującego się w &lt;a href=&quot;http://okiem.boo.pl/&quot;&gt;&lt;abbr title=&quot;Otwarcie Katolicka Internetowa Encyklopedia Mundi&quot;&gt;OKIEM&lt;/abbr&gt;&lt;/a&gt;. Niestety, miast artykułu zobaczyłem tylko paskudną &lt;a href=&quot;http://okiem.boo.pl/okiem/index_br.htm&quot;&gt;stronę zastępczą&lt;/a&gt;, z której wynikało, że moja uboga przeglądarka (&lt;a href=&quot;http://www.mozilla-europe.org/pl/&quot;&gt;Firefox&lt;/a&gt; 1.0.4) nie potrafi poradzić sobie z zaawansowanymi skryptami, niezbędnymi do nawigacji pośród stron serwisu.&lt;/p&gt;

&lt;p&gt;O ile sam artkuł przestał mnie ciekawić, o tyle zainteresowałem się żywo kwestiami brakującej funkcjonalności mojego pupila. Napisałem przeto list do autora strony:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;From: Patryk Zawadzki
To: Marcin Niewalda&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Witam,&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Jako zawodowy webdeveloper nie mogę się z Panem zgodzić odnośnie
możliwości przeglądarek opartych na silniku Gecko (czy jak Pan zdaje się
ja nazywać - Netscape, choć dotyczy to przeglądarek Mozilla Suite i
Mozilla Firefox).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Przeglądarki te posiadają możliwości dalece większe od przestarzałego i
niezgodnego ze standardami Internet Explorera. Po więcej szczegółów
zapraszam do serwisu http://browsehappy.pl/&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Odnośnie Pańskich problemów z wyglądem strony w innych przeglądarkach -
świadczą one tylko o Pana nieznajomości standardów obowiązujących w
sieci. Jeśli chodzi o marginesy, to właśnie Internet Explorer
nieprawidłowo je interpretuje, po szczegóły zapraszam do swoich
artykułów na ten temat:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;http://patrys.jogger.pl/comment.php?eid=121784
http://patrys.jogger.pl/comment.php?eid=121980
http://patrys.jogger.pl/comment.php?eid=124346
http://patrys.jogger.pl/comment.php?eid=126533&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Jako użytkownik systemu z rodziny Linux, nie jestem w stanie używać
przeglądarek monopolisty z Redmond. Dodatkowo przeglądarka Mozilla
Firefox zdobywa na świecie coraz większą popularność, także w Polsce.
Nieładnie jest więc wypinać się na użytkowników przesiadających się na
programy zgodne ze standardami.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Pozdrawiam i liczę na zainteresowanie tematem i dostosowanie strony do
współczesnych przeglądarek.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Szczerze liczyłem na reakcję ze strony autora i zainteresowanie tematem, jednak odpowiedź przeszła moje najśmielsze oczekiwania:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;From: Marcin Niewalda
To: Patryk Zawadzki&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Marginesy to  pikuś. Skoro jest Pan takim zawodowcem to proszę powiedzieć
jak przerobić pod Natscape skrypt nawigacyjny tak aby ktoś wpisując adres
domena/strona5.htm był przekierowywany na domena/index.htm a do ramki była
ładowana strona5.htm, albo chociaż jak zrobić kolorowy pasek przesuwu.&amp;lt;/p&amp;gt;
Marcin&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Widząc, że faktycznie, moja przeglądarka jest niezwykle uboga w niezbędną funkcjonalność, niezwłocznie pokajałem się w liście zwrotnym:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;From: Patryk Zawadzki
To: Marcin Niewalda&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;blockquote&gt;
    &lt;p&gt;Marginesy to pikuś. Skoro jest Pan takim zawodowcem&lt;/p&gt;
  &lt;/blockquote&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Ah, ta zjadliwość.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;blockquote&gt;
    &lt;p&gt;to proszę powiedzieć jak przerobić pod Natscape&lt;/p&gt;
  &lt;/blockquote&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Kolejny raz myli pan Netscape i Mozillę/Gecko.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;http://www.mozilla-europe.org/pl/&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;blockquote&gt;
    &lt;p&gt;skrypt nawigacyjny tak aby ktoś wpisując adres
domena/strona5.htm był przekierowywany na domena/index.htm a do ramki była
ładowana strona5.htm,&lt;/p&gt;
  &lt;/blockquote&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Najprościej nie używać ramek, które niszczą użyteczność strony. Nie da
się dodać ich do ulubionych ani wydrukować.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Jeśli uparł się pan tego używać, to przekierowanie wykonuje się
identycznie:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;window.location.href = “index.html”;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;blockquote&gt;
    &lt;p&gt;albo chociaż jak zrobić kolorowy pasek przesuwu.&lt;/p&gt;
  &lt;/blockquote&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Proszę mnie nie rozbawiać. Był to element dodany przez programistów Microsoft wbrew obowiązującym standardom CSS. Dla referencji, proszę znaleźć mi w standardzie chociaż jedno słowo o kolorowaniu pasków przewijania:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;http://www.w3.org/TR/CSS1&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Pozdrawiam mimo pańskiej złośliwości. Gratuluję też poczucia humoru,
jeśli celowo opiera Pan stronę na ramkach (co dyskwalifikuje ją wobec
osób niedowidzących i korzystających z czytników ekranowych), a
następnie blokuje dostęp do niej użytkownikom poprawnie działających
przeglądarek, twierdząc, że to dla ich dobra. Nie chcę Pana martwić, ale
to nie przeglądarki są złe, tylko Pana kod JavaScript jest do niczego, a
użytkownicy Mozilli nigdy nie przesiądą się na Internet Explorera, bo
właśnie od niego uciekali wybierając nowoczesną przeglądarkę typu
Firefox. Użytkowników IE ubywa z dnia na dzień, natomiast liczba
szczęśliwych posiadaczy Firefoksa nieustannie rośnie, więc kopie Pan
dołek sam pod sobą.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Autor nie pozostał mi dłużny i szybko wyklarował swoje stanowisko:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;From: Marcin Niewalda
To: Patryk Zawadzki&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;To Pan mnie rozbawia. Obcinanie standardów tylko dlatego że nie umie się
umieścić koloru na pasku przesuwu jest badziewiem. Ramki można dodawać do
ulubionych i drukować całkiem dobrze, wystarczy odpowiedni skrypt. Ramki
przeszkadzają tylko tym którzy nie potrafią zrobić żeby wejście na nie
otwierało strone wewnątrz ramki. (nie, proszą sobie wyobrazić, że nie chodzi
mi o link otwierania strony w ramce). Ja zrobiłem taki kod, ale niestety da
się to tylko pod IE. I chociaż nie znosze Billa Gatesa będą używać tego bo
jego standart jest po prostu bardziej elastyczny co niestety świadczy o
większym profesjonaliźmie. Przez 4 lata chyba z 40 programistów pisało do
mnie. Tak samo mądrych jak i Pan i każdy po kilku próbach przerobienia kodu
się poddawał i jakoś dziwnie milkł. Myślę że i z Panem było by tak samo.&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;ps. na marginesie Pański program mailowy nie potrafi porpawnie wysłać
wiadomości w której tekst przychodzi jako załącznik&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Okazało się więc, że i mój program pocztowy (&lt;a href=&quot;http://www.gnome.org/projects/evolution/&quot;&gt;Evolution&lt;/a&gt; 2.2.3) jest upośledzony. W tym momencie zrezygnowałem z nawracania ekstremisty i odpisałem zrezygnowany:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;From: Patryk Zawadzki
To: Marcin Niewalda&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;To nie jest standard. Przykro mi, ale robi Pan stronę nieumiejętnie i
dla ginącej przeglądarki. Nie każę Panu uczyć się poprawnego
programowania JavaScript. Pana strona - Pana sprawa. Proszę tylko zrobić
przysługę reszcie internautów i nie zabierać się prowadzenie innych
stron. Bez obaw, nie jest Pan sam:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;http://osiolki.net/&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Zastanawiam się nad zgłoszeniem Pana serwisu, jeśli jeszcze nie figuruje
w bazie.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;blockquote&gt;
    &lt;p&gt;ps. na marginesie Pański program mailowy nie potrafi porpawnie wysłać
wiadomości w której tekst przychodzi jako załącznik&lt;/p&gt;
  &lt;/blockquote&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Nie, to Pana program (Outlook Express 6.0) jest uszkodzony i nie potrafi
obsługiwać poprawnie podpisanych cyfrowo (kluczem PGP) wiadomości. To,
jak mniemam, kolejny standard Billa Gatesa, którego będzie Pan ślepo
bronił. W internecie obowiązują normy i akurat mój program pocztowy je
spełnia.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Cóż, wygląda na to, że z naprawiania strony nic nie będzie. Szkoda zachodzu dla ludzi, którzy i tak będą mieli problemy z nawigacją z powodu braku kolorowania pasków przewijania.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; pan był łaskaw odpowiedzieć:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;From: Marcin Niewalda
To: Patryk Zawadzki&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Powtarzam że jest Pan nudny  - tłumacze że było już wielu mądrych. Osiołki
na samym początku swojej działalności umieściły stronę encyklopedii u siebie
potetm w przeciągu tygodnia ją usunęła ? - dlaczego ? - dlatego że uznali że
standard W3C jest niedoskonały i niepzwala osiągaś wyników nieodzownych do
działania strony Encyklopedi. Proszę przestać walczyć z normalnymi ludźmi i
zająć się czymś pożytecznym - albo jeśli ma Pan dużo czasu proszę mi pomóc
przenieść serwis na PHP. Od trzech lat prowadzę encyklopedię kosztem  życia
rodzinnego, czasu wolnego, pracy. Pracą woją wykonuje charytatywnie i wiem
że jest pomocna wielu ludziom którzy mi za to dziękują. Oglądalność sięga
10.000 wejść na stronę i regularnie przkracza transfery dopuszczalne - a ja
nie mam z czego opłacać kolejnych pakietów.  Jak mało ludzi potrafi pomóc -
wypluć kilka ironii natomiast potrafi każdy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;ps. proszę sobie sprawiź inny program pocztowy bo ten w dalszym ciągu wysyła
tekst jako zalącznik - wiele osób może mieć trudności z odczytaniem - a na
pewno nie jest to standrd wysyłania maili na świecie.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #014: Król parkietu</title>
   <link href="http://room-303.com/blog/2005/07/09/e59864ab29d1ebf8be44476515ead0db/"/>
   <updated>2005-07-09T09:55:13+00:00</updated>
   <id>http://room-303.com/blog/2005/07/09/e59864ab29d1ebf8be44476515ead0db</id>
   <content type="html">&lt;p&gt;Oto najpilniej strzeżony sekret na świecie, a zarazem wyjaśnienie, dlaczego na parkiecie można mnie zobaczyć dopiero z odpowiednim stężeniem alkoholu we krwi. :)&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/014-dancer.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Czarny humor sponsorowany przez Wyższą Szkołę Informatyki i Zarządzania &lt;q&gt;Copernicus&lt;/q&gt; we Wrocławiu, która to nie pozwoliła mi przystąpić do egzaminu poprawkowego z powodu urlopu pani księgowej.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Rekurencja w SQL jest zła</title>
   <link href="http://room-303.com/blog/2005/07/07/86fee49a399bb25604cfb8987dce1c9c/"/>
   <updated>2005-07-07T18:05:25+00:00</updated>
   <id>http://room-303.com/blog/2005/07/07/86fee49a399bb25604cfb8987dce1c9c</id>
   <content type="html">&lt;p&gt;Prawdopodobnie nieraz zdarzyło się wam budować drzewiaste struktury danych w bazach danych. Typowa tabela do tego celu wygląda mniej więcej tak:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;id | parent_id | name
---+-----------+-------------
 1 |         0 | Lorem
 2 |         0 | Ipsum
 3 |         1 | Dolor
 4 |         1 | Sit
 5 |         2 | Consectetuer
 6 |         4 | Adipiscing
 7 |         4 | Elit&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Pozwala na dowolnie głębokie zagnieżdżanie danych, zaś obiekty o &lt;code&gt;parent_id&lt;/code&gt; równym 0 są elementami najwyższego poziomu hierarchii.&lt;/p&gt;

&lt;p&gt;Problem pojawia się, kiedy dane te trzeba zwizualizować w postaci drzewa. Początkujący programiści często używają do tego celu rekursji (właściwie, to używają jej do wszystkiego), jednak ma ona podstawową wadę. O ile w przypadku powyższej tabeli nie ma zasadniczo różnicy, czy dane będą pobierane rekurencyjnie czy liniowo, o tyle przy tysiącu kategorii, gdzie w najwyższym poziomie znajduje się ich kilkaset, liczba zapytań wywoływanych przez skrypt sięga setek na każde wyświetlenie strony.&lt;/p&gt;

&lt;p&gt;Jest to problemem zwłaszcza, kiedy serwer &lt;abbr title=&quot;Structured Query Language&quot;&gt;SQL&lt;/abbr&gt; znajduje się na innej maszynie i każde zapytanie wymaga przesyłania danych w obie strony połączenia. Wprowadza to dodatkowe opóźnienia, a z czasem staje się nader widoczne.&lt;/p&gt;

&lt;p&gt;Rozwiązaniem jest jednorazowe pociągniecie wszystkich potrzebnych danych za pomocą jednego zapytania, a następnie przebudowanie w strukturę drzewiastą po stronie serwera docelowego.&lt;/p&gt;

&lt;p&gt;Jako przykład takiego działania posłużyć może poniższy skrypt &lt;abbr title=&quot;PHP Hypertext Preprocessor&quot;&gt;PHP&lt;/abbr&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;require_once('arraySort.class.php');

/**
 * Create a tree structure from an SQL query
 */

class sqlTree
{
	var $conn;

	function sqlTree(&amp;amp;$conn)
	{
		$this-&amp;gt;conn = &amp;amp; $conn;
	}

	/**
	 * Sort an array
	 * @access private
	 */
	function _multiSort(&amp;amp;$array, $key, $asc = true)
	{
		$sorter = &amp;amp; new arraySort($array, $key, $asc);
		return $sorter-&amp;gt;sortit();
	}

	/**
	 * Sort a tree
	 * @access private
	 */
	function _treeSort(&amp;amp;$item)
	{
		reset($item);
		foreach($item as $key =&amp;gt; $val)
		{
			if (isset($val['tree']))
				$this-&amp;gt;_treeSort($item[$key]['tree']);
		}
		$item = $this-&amp;gt;_multiSort($item, 'sort', true);
	}

	/**
	 * Build the tree, elements with no known parent are ignored
	 * @param string SQL query, has to contain fields 'id' and 'parent_id'
	 * @param int parent_id to be considered root level
	 * @return array the tree structure
	 */
	function build($query, $root = 0)
	{
		$result = mysql_query($query, $this-&amp;gt;conn);

		$queue = array();
		while($item = mysql_fetch_assoc($result))
		{
			array_push($queue, $item);
		}

		$queue = $this-&amp;gt;_multiSort($queue, 'id', false);
		$effect = array();

		while($queue)
		{
			$found = false;
			reset($queue);
			$nextIter = $queue;
			foreach($queue as $key =&amp;gt; $item)
			{
				if ($item['parent_id'] != $root)
				{
					reset($nextIter);
					foreach($nextIter as $keyTarg =&amp;gt; $target)
					if ($target['id'] == $item['parent_id'])
					{
						if (!isset($nextIter[$keyTarg]['tree']))
							$nextIter[$keyTarg]['tree'] = array();

						array_push($nextIter[$keyTarg]['tree'], $item);
						unset($nextIter[$key]);
						$found = true;
						break;
					}

					if ($found)
						break;

					// not found
					unset($nextIter[$key]);
				}
				else
				{
					array_push($effect, $item);
					unset($nextIter[$key]);
					break;
				}
			}
			$queue = $nextIter;
		}
		$this-&amp;gt;_treeSort($effect);
		return $effect;
	}
}&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Jest to klasa, która jako parametr konstruktora pobiera identyfikator połączenia do bazy danych MySQL i udostępnia funkcję &lt;code&gt;build()&lt;/code&gt;, która jako pierwszy parametr przyjmuje zapytanie wybierające dane, zaś jako drugi opcjonalny identyfikator korzenia drzewa.&lt;/p&gt;

&lt;p&gt;Wymagania odnośnie zapytania są następujące: musi ono zawierać w wynikach kolumny o nazwach &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;parent_id&lt;/code&gt; i &lt;code&gt;sort&lt;/code&gt;, przy czym ten ostatni decyduje o kolejności pozycji drzewa. Dodatkowym ograniczeniem (powyższej implementacji) jest założenie, że dla każdego elementu zachodzi &lt;code&gt;parent_id&lt;/code&gt; &amp;lt; &lt;code&gt;id&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Przykładowe użycie:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;$st = &amp;amp; new sqlTree($connection);
$tree = $st-&amp;gt;build(
'
	SELECT id, parent_id, name AS sort
	FROM przykladowa_tabela
');

print_r($tree);&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Do działania wymagany jest jeszcze plik &lt;code&gt;arraySort.class.php&lt;/code&gt;, czyli skrypt sortowania wielowymiarowych tablic autorstwa Oliwiera Ptaka:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;/**
 * Handles multidimentional array sorting by a key (not recursive)
 *
 * @author Oliwier Ptak &amp;lt;aleczapka at gmx dot net&amp;gt;
 */

class arraySort
{
	var $skey = false;
	var $sarray = false;
	var $sasc = true;

	/**
	 * Constructor
	 *
	 * @access public
	 * @param mixed $array array to sort
	 * @param string $key array key to sort by
	 * @param boolean $asc sort order (ascending or descending)
	 */
	function arraySort(&amp;amp;$array, $key, $asc = true)
	{
		$this-&amp;gt;sarray = $array;
		$this-&amp;gt;skey = $key;
		$this-&amp;gt;sasc = $asc;
	}

	/**
	 * Sort method
	 *
	 * @access public
	 * @param boolean $remap if true reindex the array to rewrite indexes
	 */
	function sortit($remap = true)
	{
		$array = &amp;amp;$this-&amp;gt;sarray;
		uksort($array, array(&amp;amp;$this, &amp;quot;_as_cmp&amp;quot;));
		if ($remap)
		{
			$tmp = array();
			while (list($id, $data) = each($array))
				array_push($tmp, $data);
			return $tmp;
		}
		return $array;
	}

	/**
	 * Custom sort function
	 *
	 * @access private
	 * @param mixed $a an array entry
	 * @param mixed $b an array entry
	 */
	function _as_cmp($a, $b)
	{
		//since uksort will pass here only indexes get real values from our array
		if (!is_array($a) &amp;amp;&amp;amp; !is_array($b))
		{
			$a = $this-&amp;gt;sarray[$a][$this-&amp;gt;skey];
			$b = $this-&amp;gt;sarray[$b][$this-&amp;gt;skey];
		}

		//if string - use string comparision
		if (!is_numeric($a) &amp;amp;&amp;amp; !is_numeric($b))
		{
			if ($this-&amp;gt;sasc)
				return strcasecmp($a, $b);
			else
				return strcasecmp($b, $a);
		}
		else
		{
			if (intval($a) == intval($b))
				return 0;

			if ($this-&amp;gt;sasc)
				return (intval($a) &amp;gt; intval($b)) ? 1 : -1;
			else
				return (intval($a) &amp;gt; intval($b)) ? -1 : 1;
		}
	}
}&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Zapraszam do analizy kodu. Zaproponowana implementacja nie jest oczywiście najdoskonalsza, ale służyć ma jedynie za przykład, że zadanie jest do rozwiązania bez stosowania rekursji w zapytaniach do bazy danych, co jest operacją bardzo kosztowną czasowo.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>May I inquire about your spoons?</title>
   <link href="http://room-303.com/blog/2005/07/06/1f0e688b483203fe52ed9a696343b1aa/"/>
   <updated>2005-07-06T20:18:53+00:00</updated>
   <id>http://room-303.com/blog/2005/07/06/1f0e688b483203fe52ed9a696343b1aa</id>
   <content type="html">&lt;p&gt;Przeglądałem dziś niemal z łezką w oku stare, najdoskonalsze wytwory fantazji &lt;a href=&quot;http://www.fat-pie.com/&quot;&gt;Davida Firtha&lt;/a&gt;. To już ponad rok od czasu, kiedy widziałem je pierwszy raz i nadal zachwycają. Psychodeliczny świat, niewiarygodna muzyka i niesamowity klimat stworzony przez osobiście nagrywane przez autora dźwięki i dialogi. &lt;a href=&quot;http://www.fat-pie.com/flash.htm&quot;&gt;Salad Fingers&lt;/a&gt; musi zobaczyć każdy.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #013: Lato, czas miłości</title>
   <link href="http://room-303.com/blog/2005/07/05/74d96c13dd7e717ce06c7ce3067abbe4/"/>
   <updated>2005-07-05T21:03:34+00:00</updated>
   <id>http://room-303.com/blog/2005/07/05/74d96c13dd7e717ce06c7ce3067abbe4</id>
   <content type="html">&lt;p&gt;Wiosna, lato, gorąco, duszno, podniesiona temperatura sprzyja buzowaniu hormonów. Rodzą się... wyższe uczucia... czy jakoś tak.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/013-summer.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Green Marinée</title>
   <link href="http://room-303.com/blog/2005/07/02/a453770800465ab1f83020d6e73b171f/"/>
   <updated>2005-07-02T19:58:21+00:00</updated>
   <id>http://room-303.com/blog/2005/07/02/a453770800465ab1f83020d6e73b171f</id>
   <content type="html">&lt;p&gt;Mania konwertowania szablonów WordPress na Joggera nie ustała. Dziś moją ofiarą padł kolejny, tym razem jest to Green Marinée autorstwa &lt;a href=&quot;http://e-lusion.com/&quot;&gt;Iana Maina&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Wersja pobieralna znajduje się &lt;a href=&quot;http://wirusy.room-303.com/Jogger/GreenMarinee/&quot;&gt;na moim serwerze&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Do tego obowiązkowy &lt;a href=&quot;http://wirusy.room-303.com/Jogger/GreenMarinee/GreenMarinee.png&quot;&gt;zrzut ekranu&lt;/a&gt;, choć poklikać można też na żywo &lt;a href=&quot;http://patrys-dev.jogger.pl/&quot;&gt;w mojej piaskownicy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Jak zwykle, szablon jest objęty GPL.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>All your page are belong to us</title>
   <link href="http://room-303.com/blog/2005/07/02/6cee43045a0f87f9ff0fab0564c5a3d2/"/>
   <updated>2005-07-02T14:52:43+00:00</updated>
   <id>http://room-303.com/blog/2005/07/02/6cee43045a0f87f9ff0fab0564c5a3d2</id>
   <content type="html">&lt;p&gt;Niewielka sztuczka, którą od zeszłego roku stosuję w &lt;abbr title=&quot;PHP Hypertext Preprocessor&quot;&gt;PHP&lt;/abbr&gt;, pozwala na łatwe budowanie czytelnych linków. Dzięki temu twój odnośnik zamiast &lt;code&gt;http://example.com/index.php?cat=shop&amp;amp;id=25&lt;/code&gt;, może wygląć tak: &lt;code&gt;http://example.com/shop/25&lt;/code&gt;, albo nawet tak: &lt;code&gt;http://example.com/shop/25/swieze_jaja_wiejskie&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Oczywiście, to samo można zrobić za pomocą &lt;code&gt;mod_rewrite&lt;/code&gt;, ale wada rozwiązania jest taka, że dodanie nowej sekcji do serwisu wymaga ingerencji w pliki serwera &lt;abbr title=&quot;World Wide Web&quot;&gt;WWW&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;Mój niewielki hack polega na dodaniu do konfiguracji Apache'a jednej jedynej linijki (dla ułatwienia umieszczamy ją w pliku &lt;code&gt;.htaccess&lt;/code&gt;):&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;ErrorDocument	404	/index.php&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Jak można się domyślić, plik &lt;code&gt;index.php&lt;/code&gt; jest jedynym plikiem w całym drzewie dokumentów danej domeny i od tego momentu odpowiada on na wszelkie zapytania o nieistniejące dokumenty.&lt;/p&gt;

&lt;p&gt;Pozostało jeszcze zatroszczyć się o obsługę tego po stronie kodu:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;// sprawdzamy, o jaki dokument jest zapytanie
$request = $_SERVER['REDIRECT_URL'];

// sprawdzamy, czy zapytanie dotyczy nieistniejacego pliku
if (($request) &amp;amp;&amp;amp; ($request != '/'))
{
	$request = explode('/', $request);
	$section = $request[1];
	$request = array_splice($request, 2);
	$subsection = implode('/', $request);
}
else // jesli nie, to przekierowujemy na index
{
	header('Location: /index');
	die();
}

// obslugujemy zadanie
switch($section)
{
case 'index':
	// [...]
	break;
case 'shop':
	// [...]
	break;
default:
	// [...] wyswietl blad 404
	break;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Zalety - rozwiązanie jest nieinwazyjne względem serwera i pozwala strukturę dokumentów kontrolować na poziomie kodu. Dzięki temu łatwo utrzymywać strukturę, którą ciężko byłoby zarządzać na poziomie &lt;code&gt;mod_rewrite&lt;/code&gt; (np. tłumaczone nazwy kategorii).&lt;/p&gt;

&lt;p&gt;Wady - nieistniejące strony nie mogą otrzymywać danych przez zlecenia &lt;code&gt;GET&lt;/code&gt; i &lt;code&gt;POST&lt;/code&gt;, więc wszystkie parametry muszą być częścią &lt;abbr title=&quot;Uniform Resource Identifier&quot;&gt;URI&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;Najciekawsze efekty uzyskuje się przez połączenie tak serwowanych dokumentów ze strukturą statyczną (istniejące pliki nie są przekierowywane). Można zachować wtedy elastyczność rozwiązania z możliwością przekazywania danych z przeglądarki. Dzięki temu możliwa jest obsługa formularzy na stronach.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Keep it dynamic fool!</title>
   <link href="http://room-303.com/blog/2005/07/01/4661780cb81f3416e41a7ce259936b72/"/>
   <updated>2005-07-01T01:02:23+00:00</updated>
   <id>http://room-303.com/blog/2005/07/01/4661780cb81f3416e41a7ce259936b72</id>
   <content type="html">&lt;p&gt;Coraz częściej mówi się o &lt;abbr title=&quot;JavaScript&quot;&gt;JS&lt;/abbr&gt; w kontekście zwiększenia użyteczności serwisu, powstają coraz zmyślniejsze metody podłączania naszego kodu do elementów w dokumencie. W idealnej sytuacji plik z kodem &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt; nie zawiera ani linijki skryptów, a wszystko odbywa się za pomocą nieinwazyjnego (czyli pozwalającego na pracę ludziom z wyłączonymi skryptami) skryptu zewnętrznego.&lt;/p&gt;

&lt;p&gt;Dla lepszego zrozumienia proponuję przeanalizować metodę działania prostego &lt;a href=&quot;http://patrys.icenter.pl/test/2005-02-19-automatic-rollover/&quot;&gt;skryptu do podświetlania obrazków&lt;/a&gt;. Ma on nad czystym &lt;abbr title=&quot;Cascading Style Sheets&quot;&gt;CSS&lt;/abbr&gt; taką przewagę, że pozwala również na podświetlanie dynamicznie wstawianych obrazków.&lt;/p&gt;

&lt;p&gt;Szczytem techniki jest jednak według mnie &lt;a href=&quot;http://www.ripcord.co.nz/behaviour/&quot;&gt;Behaviour&lt;/a&gt; - skrypt łączący strukturę &lt;abbr&gt;CSS&lt;/abbr&gt; z mocą &lt;abbr&gt;JS&lt;/abbr&gt;. Z jego pomocą możemy z łatwością utworzyć arkusz skryptów w zapisie bardzo podobnym do arkusza styli i podłączyć go automatycznie do swojej witryny.&lt;/p&gt;

&lt;p&gt;Największą popularnością cieszą się z kolei ostatnio stosunkowo nowe skrypty spod znaku &lt;a href=&quot;http://script.aculo.us/&quot;&gt;script.aculo.us&lt;/a&gt;. I nic dziwnego, skoro pozwalają one na bajecznie łatwą implementację dowolnie rozbudowanych efektów, a dodatkowo umożliwiają bardzo łatwe dodanie do serwisu funkcjonalności &lt;em&gt;drag'n'drop&lt;/em&gt;. Pięć minut pracy i przykład można zobaczyć &lt;a href=&quot;http://patrys.icenter.pl/test/2005-07-01-script.aculo.us/&quot;&gt;w moim laboratorium&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Powstaje tylko pytanie - czy jeśli &lt;em&gt;da się&lt;/em&gt; coś zrobić łatwo oznacza, że &lt;em&gt;powinniśmy&lt;/em&gt; tego używać? Oczywiście, że nie. Takie rozwiązania mają bardzo wąskie pole zastosowania, niewiele jest bowiem stron, które nie tylko coś zyskają, ale dodatkowo nie ucierpią od takich atrakcji. Pamiętajmy, że zawsze najważniejszy jest fallback do wersji czysto statycznej.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Planet PLD</title>
   <link href="http://room-303.com/blog/2005/06/30/8521697217ce568ced9fbdff08f49c53/"/>
   <updated>2005-06-30T20:02:10+00:00</updated>
   <id>http://room-303.com/blog/2005/06/30/8521697217ce568ced9fbdff08f49c53</id>
   <content type="html">&lt;p&gt;Właśnie skończyłem wstępną zmianę layoutu &lt;a href=&quot;http://planet.pld-linux.org/&quot;&gt;Planet PLD&lt;/a&gt; - agregatora informacji publikowanych przez deweloperów wyżej wspomnianej dystrybucji.&lt;/p&gt;

&lt;p&gt;Póki co, design strony opiera się na zmodyfikowanym mocno Kubricku. Może nie jest to specjalnie oryginalne, ale z pewnością nowy układ jest bardziej czytelny od poprzedniego.&lt;/p&gt;

&lt;p&gt;Mam nadzieję, że przy okazji niczego nie zepsułem na serwerze DeeJay1, jeśli coś nie zachowuje się tak, jak powinno, to proszę o pilną informację.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PS:&lt;/strong&gt; najlepszy &lt;a href=&quot;http://jajcus.jogger.pl/comment.php?eid=128835&quot;&gt;dowcip o blondynce&lt;/a&gt;, jaki kiedykolwiek czytałem.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Lekka nuta dekadencji, czyli Oldschool Kubrick theme dla Joggera</title>
   <link href="http://room-303.com/blog/2005/06/29/750ed524801ca433ffc69654edb7692a/"/>
   <updated>2005-06-29T18:59:29+00:00</updated>
   <id>http://room-303.com/blog/2005/06/29/750ed524801ca433ffc69654edb7692a</id>
   <content type="html">&lt;p&gt;Kolejny szablon, tym razem starsza wersja Kubricka, wykonana bez użycia grafik. Testować na żywo można na &lt;a href=&quot;http://patrys-dev.jogger.pl/&quot;&gt;blogu tymczasowym&lt;/a&gt; (a uprzedzałem, że często się zmienia).&lt;/p&gt;

&lt;p&gt;Do pobrania &lt;a href=&quot;http://wirusy.room-303.com/Jogger/OldschoolKubrick/&quot;&gt;z mojego serwera&lt;/a&gt;, tam też znajduje się &lt;a href=&quot;http://wirusy.room-303.com/Jogger/OldschoolKubrick/OldschoolKubrick.png&quot;&gt;zrzut ekranu&lt;/a&gt; prezentujący szablon w działaniu.&lt;/p&gt;

&lt;p&gt;Przy okazji dodałem brakujące zrzuty ekranów do &lt;a href=&quot;http://patrys.jogger.pl/comment.php?eid=128262&quot;&gt;pozostałych szablonów&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Human Condition - kolejny wolnodostępny szablon dla Joggera</title>
   <link href="http://room-303.com/blog/2005/06/28/99a5d7f81437b6e17b977bcbbd896aa2/"/>
   <updated>2005-06-28T20:27:56+00:00</updated>
   <id>http://room-303.com/blog/2005/06/28/99a5d7f81437b6e17b977bcbbd896aa2</id>
   <content type="html">&lt;p&gt;Właśnie skończyłem konwersję kolejnego z bardzo ładnych moim zdaniem szablonów WordPress. Tym razem jest to Human Condition, do zobaczenia - oczywiście na żywo - &lt;a href=&quot;http://patrys-dev.jogger.pl/&quot;&gt;na moim blogu eksperymentalnym&lt;/a&gt; (przynajmniej do czasu, kiedy skonwertuję kolejny szablon).&lt;/p&gt;

&lt;p&gt;Do pobrania &lt;a href=&quot;http://wirusy.room-303.com/Jogger/HumanCondition/&quot;&gt;z mojego serwera&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Poprzednio skonwertowany Kubrick (używam go tutaj) nadal jest &lt;a href=&quot;http://wirusy.room-303.com/Jogger/Kubrick/&quot;&gt;dostępny do pobrania&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>BrowseHappy na trzecim miejscu w Google</title>
   <link href="http://room-303.com/blog/2005/06/28/b21e5761fc75494628c1f6dbb5138a07/"/>
   <updated>2005-06-28T17:54:21+00:00</updated>
   <id>http://room-303.com/blog/2005/06/28/b21e5761fc75494628c1f6dbb5138a07</id>
   <content type="html">&lt;p&gt;Już po 24 godzinach od &lt;a href=&quot;http://patrys.jogger.pl/comment.php?eid=127618&amp;amp;startid=200506&quot;&gt;rozpoczęcia akcji&lt;/a&gt;, strona promująca alternatywne przeglądarki pojawiła się na trzecim miejscu w najpopularniejszej wyszukiwarce - Google. Kilka osób zadało mi pytanie, jak to możliwe, skoro sama strona nie zawiera w żadnym miejscu frazy konkursowej - &lt;q&gt;MsnBetter ThanGoogle&lt;/q&gt;.&lt;/p&gt;

&lt;p&gt;Jako, że wiele osób zarzuca mi niekompetencję, czy też skrajną głupotę, zaznaczam z góry, że przytoczone poniżej informacje mogą być dawno nieaktualne bądź nieprawdziwe - w takim przypadku proszę o poprawienie mnie, jako że nie śledzę forów tematycznych, zajmujących się pozycjonowaniem.&lt;/p&gt;

&lt;h3&gt;Wyniki wyszukiwania&lt;/h3&gt;

&lt;p&gt;Google przy wyszukiwaniu stron bierze pod uwagę kilka czynników:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;abbr title=&quot;Uniform Resource Identifier&quot;&gt;URI&lt;/abbr&gt; strony (obecność słów kluczowych z wyszukiwanej frazy)&lt;/li&gt;
&lt;li&gt;Tytuł dokumentu&lt;/li&gt;
&lt;li&gt;Zawartość dokumentu (obecność słów, ich wzajemny układ, odległość, gęstość występowania i stosunek ich ilości do objętości samego tekstu)&lt;/li&gt;
&lt;li&gt;Odnośniki do dokumentu (obecność słów kluczowych)&lt;/li&gt;
&lt;li&gt;Współczynnik PageRank strony&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nie są brane pod uwagę elementy &lt;code&gt;&amp;lt;meta/&amp;gt;&lt;/code&gt; nagłówka dokumentu ani komentarze oraz elementy o zawartości typu &lt;code&gt;CDATA&lt;/code&gt; (kod JavaScript, Visual Basic, arkusze stylów).&lt;/p&gt;

&lt;p&gt;O ile BrowseHappy nie zawiera poszukiwanej frazy w żadnym z trzech pierwszych elementów listy, o tyle ma bardzo wysoki PageRank, o którym niżej. Dzięki temu jest w stanie przeskoczyć wyniki o dużym nasyceniu treści poszukiwaną frazą. Podobnie wypozycjonowane zostały strony Microsoft Polska i sama wyszukiwarka Google.&lt;/p&gt;

&lt;h3&gt;PageRank&lt;/h3&gt;

&lt;p&gt;PageRank jest iteracyjnym algorytmem obliczania ważności dokumentu. Nazwa pochodzi od nazwiska jednego z założycieli Google, który jest posiadaczem patentu na sam algorytm.&lt;/p&gt;

&lt;p&gt;Jego idea polega na śledzeniu działań typowego użytkownika - budowany jest skierowany graf połączeń i wybierany jest jeden nieterminalny węzeł (taki, który posiada ścieżkę wyjściową). Wszystkim węzłom nadawane są równe wartości PageRank, obierany jest też współczynnik &lt;q&gt;znudzenia&lt;/q&gt; internauty (liczba rzeczywista z zakresu 0-1, nie jest mi znana dokładna wartość tego parametru, z tego co pamiętam, oscylowała ona w przedziale 0,6-0,9).&lt;/p&gt;

&lt;p&gt;Następnie robot wyruszając z danego wierzchołka przechodzi do każdego z jego sąsiadów, zwiększając ich współczynnik PageRank o PageRank bieżącego węzła podzielony przez całkowitą liczbę linków wychodzących z danego węzła i pomnożony przez współczynnik znudzenia (istnieje prawdopodobieństwo, że internauta nie będzie dość cieprpliwy, aby dalej podążać za kolejnymi odnośnikami). Innymi słowy, bieżący węzeł rozdaje po równo swój PageRank pomiędzy dokumenty, do których się odnosi, propagując tym samym własną popularność.&lt;/p&gt;

&lt;p&gt;Czynność ta jest powtarzana rekurencyjnie dla wszystkich zlinkowanych sąsiadów, aż wyczerpane zostaną wszystkie połączenia w grafie.&lt;/p&gt;

&lt;p&gt;Po przejściu przez cały graf, wartości PageRank wszystkich wierzchołków mnożone są przez (1 - współczynnik znudzenia).&lt;/p&gt;

&lt;p&gt;Całość nie jest liczona od razu, używane są przybliżenia iteracyjne, gdzie wartości modyfikowane są stopniowo za pomocą algorytmów przybliżeniowych - liczba stron w internecie nie pozwoliłaby na zbudowanie rzeczywistego grafu wszystkich połączeń. Dane analizowane są więc w postaci przybliżonej i po ich uszczegółowieniu przeprowadzany jest kolejny krok iteracji.&lt;/p&gt;

&lt;p&gt;Po przeprowadzieniu około stu kroków iteracyjnych, generowany jest nowy indeks popularności serwisów i rozpoczyna się faza jego wdrażania. Tutaj pojawiają się problemy z różnymi wynikami Google zwracanymi dla różnych użytkowników.&lt;/p&gt;

&lt;h3&gt;Tańczący z Google'ami&lt;/h3&gt;

&lt;p&gt;Kiedyś nazywało się to &lt;q&gt;Google dance&lt;/q&gt; i było zjawiskiem regularnie obserwowanym raz w miesiącu, kiedy to indeksy były rozsyłane do kolejnych serwerów obsługujących wyszukiwanie (Google jest obsługiwane przez kilka-kilkanaście klastrów serwerowych i w zależności od szczęścia, dostawcy internetu i pogody w Zairze, możemy trafić na dowolny z nich).&lt;/p&gt;

&lt;p&gt;Od kilku lat Google uaktualnia indeksy nieregularnie, od kilku do kilkunastu razy w miesiącu, co powoduje, że ciężko wykryć moment podmiany. Aby ułatwić to webmasterom, wprowadzone zostały dwa dodatkowe adresy - www2.google.com oraz www3.google.com, które zawsze wykorzystują najnowsze zestawienia. Jest to jedyne autorytatywne źródło aktualnych wyników podczas operacji podmiany.&lt;/p&gt;

&lt;p&gt;Dlatego właśnie wczoraj użytkownicy magistrali innych niż &lt;abbr title=&quot;Telekompromitacja Polska&quot;&gt;TP&lt;/abbr&gt; otrzymywali inne wyniki niż klienci monopolisty, którego serwery &lt;abbr title=&quot;Domain Name Server&quot;&gt;DNS&lt;/abbr&gt; w cache miały akurat adres IP świeżo zaktualizowanego serwera.&lt;/p&gt;

&lt;h3&gt;Na zakończenie&lt;/h3&gt;

&lt;p&gt;Pozycjonowaniem nie miałem czasu zajmować się już dłuższy czas, stąd powyższe informacje mogą zawierać zupełnie nieaktualne dane, możliwe też, że źle pamiętam sam mechanizm punktowania serwisów.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; przepraszam za bałagan, ale przy formatowaniu tekstu zginął mi jeden akapit tekstu, już poprawione.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>O co dokładnie chodzi z BrowseHappy i MsnBetter ThanGoogle?</title>
   <link href="http://room-303.com/blog/2005/06/26/3e45f6d2d5c3b2f843219c608b368940/"/>
   <updated>2005-06-26T20:20:40+00:00</updated>
   <id>http://room-303.com/blog/2005/06/26/3e45f6d2d5c3b2f843219c608b368940</id>
   <content type="html">&lt;p&gt;Przy okazji opisu &lt;a href=&quot;http://patrys.jogger.pl/comment.php?eid=126542&quot;&gt;konkursu SEO&lt;/a&gt; narodził się pomysł wypromowania dla żartu strony &lt;a href=&quot;http://browsehappy.pl/&quot;&gt;BrowseHappy&lt;/a&gt;. Akcja ruszyła, co można zaobserwować na &lt;a href=&quot;http://jogger.pl/&quot;&gt;stronie głównej Joggera&lt;/a&gt;. Szukamy chętnych do pomocy.&lt;/p&gt;

&lt;p&gt;Jak się przyłączyć? To proste, wystarczy, że na stronie (np. w notce na swoim blogu) umieścisz poniższy kod &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&amp;lt;a href=&quot;http://browsehappy.pl/&quot;&amp;gt;MsnBetter ThanGoogle&amp;lt;/a&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Akcja ma charakter czysto ideologiczny i formę raczej żartobliwą, BrowseHappy nie zostało zgłoszone jako uczestnik konkursu i nie czerpie żadnych finansowych korzyści z pozycji w wyszukiwarce.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Dlaczego hidentity.org jest złe</title>
   <link href="http://room-303.com/blog/2005/06/26/9dfd27d1b6de179fe6ec179c1baf6d3d/"/>
   <updated>2005-06-26T18:35:46+00:00</updated>
   <id>http://room-303.com/blog/2005/06/26/9dfd27d1b6de179fe6ec179c1baf6d3d</id>
   <content type="html">&lt;p&gt;Internet ewoluował znacznie od stanu, kiedy FrontPage firmy z Redmond był topowym edytorem &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt;. Coraz większy nacisk kładzie się obecnie nie tylko na wygląd, ale na samą strukturę dokumentu. Powracają stare, dobre czasy, kiedy to naturalną rzeczą było dzielenie pliku na sekcję (choćby dosowy edytor Tag tego wymagał) - w HTML służą do tego różnego poziomu nagłówki, coraz mniej pojawia się grafik czysto dekoracyjnych (takich, które nie niosą ze sobą informacji, np. bullety przy wypunktowaniu) - tutaj pomaga &lt;abbr title=&quot;Cascading Style Sheets&quot;&gt;CSS&lt;/abbr&gt;. Grafiki informacyjne, jak nagłówki czy zdjęcia coraz częściej posiadają poprawnie wypełniony atrybut &lt;code&gt;alt&lt;/code&gt;, a nierzadko i tytuł w atrybucie &lt;code&gt;title&lt;/code&gt;. Powoli, małymi krokami znikają też serwisy wymagające przepisywania dziwnych kodów z obrazków o pstrokatym tle - zabezpieczenie to można w prosty sposób zastąpić odpowiednim skryptem po stronie serwera. Zwiększa się użyteczność serwisów, także względem użytkowników o specyficznych potrzebach, jak korzystający z przeglądarek tekstowych czy z lektorów w &lt;q&gt;aural browsers&lt;/q&gt;. Sieć coraz bardziej skupia się na informacji, popularną formą czytania o nowościach jest subskrypcja blogów i ich strumieni &lt;abbr title=&quot;Really Simple Syndication&quot;&gt;RSS&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;Z drugiej strony coraz bardziej uciążliwym problemem jest spam i niektórzy cierpią wręcz na paranoiczny &lt;em&gt;zespół ochrony prywatności&lt;/em&gt;. Adresy email na stronach wstawiane są na przeróżne dziwne sposoby, począwszy od najprostszych i najbardziej eleganckich - usunięcie kropek i zastąpienie małpy napisem &lt;q&gt;AT&lt;/q&gt;, przez stosowanie dziwnych zabiegów w CSS, JavaScript, a kończąc na zastępowaniu części lub całości grafiką. Pierwsza z metod ma tę przewagę, że jest skuteczna, prosta i jedyne, czego wymaga to przepisanie kilku znaków, działa też w każdej przeglądarce na każdym systemie operacyjnym, jaki sobie wymyślimy - od telefonu komórkowego do mikrofalówki. Pozostałe obarczone są mniejszym lub większym uszczerbkiem na użyteczności - CSS zależy mocno od możliwości przeglądarki, a na tym polu dominujący nam &lt;abbr title=&quot;Internet Explorer&quot;&gt;IE&lt;/abbr&gt; nie jest mocny, JavaScript może zostać wyłączony lub w ogóle może nie być zaimplementowany (choćby w urządzeniach przenośnych). Grafika generuje problemów najwięcej - przede wszystkim nie daje się zaznaczyć i skopiować, poza tym jej semantyczne umieszczenie na stronie wymagałoby wpisania w zawartość atrybutu &lt;code&gt;alt&lt;/code&gt; adresu email, co stoi w konflikcie z naszymi intencjami.&lt;/p&gt;

&lt;p&gt;W niektórych przypadkach &lt;em&gt;zespół ochrony prywatności&lt;/em&gt; posuwa się jeszcze dalej - powstają serwisy typu &lt;a href=&quot;http://hidentity.org/&quot;&gt;&lt;abbr title=&quot;Hide Identity&quot;&gt;Hidentity&lt;/abbr&gt;&lt;/a&gt;, gdzie zupełnie bezpłatnie można obfuskować za pomocą grafiki nie tylko swój adres poczty elektronicznej, ale tak poufne informacje jak numer &lt;abbr title=&quot;Gadu-Gadu&quot;&gt;GG&lt;/abbr&gt; czy login Skype. Oczywiście, żaden bot spamowy nie jest w stanie odróżnić ich na stronie (dla GG to zwykła liczba, dla Skype dowolny ciąg znaków), ale skoro da się je ukryć w obrazku, to czemu by nie. Wkrótce pojawią się zapewne serwisy informacyjne, publikujące całe artykuły w formacie wielowarstwowego pliku Adobe Photoshopa. Autorzy Hidentity poszli nawet o krok dalej - w celu zaoszczędzenia miejsca na stronie, dane prezentowane są w postaci animowanego pliku GIF z cykliczną rotacją. Nie przeszkadza im zapewne fakt, że próbując przepisać czyjś adres bądź numerek trzeba uciekać się do intuicyjnych rozwiązań z gatunku &lt;q&gt;zrób screenshot, wklej do Painta&lt;/q&gt;. Na koniec wiele do życzenia pozostawia też sama graficzna forma tak przygotowanej informacji - wygląda jak typowy button reklamowy, co powoduje odruchowe pomijanie takich grafik - w identyczny sposób oko automatycznie pomija bannery reklamowe. Dla ciekawskich proponuję pochodzić po dużym portalu i po przejściu na kolejną stronę spróbować przypomnieć sobie, co reklamował banner na poprzedniej.&lt;/p&gt;

&lt;p&gt;Ja ze swojej strony do walki ze spamem polecam automatykę. Spam Assassin i filtry Bayesa sprawują się bardzo sprawnie. Otrzymuję dziennie około 600 wiadomości pocztowych, z których około 100 to spam, do dziś tylko jedna wiadomość prześliznęła się przez regułki. Inną alternatywą jest konto na &lt;a href=&quot;http://gmail.com/&quot;&gt;GMail&lt;/a&gt;, gdzie filtry spamowe działają niemal całkowicie bezbłędnie.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Trac, czyli system wspomagania projektu</title>
   <link href="http://room-303.com/blog/2005/06/25/83a8da1fa766ae4fb2a0953ece5cdf51/"/>
   <updated>2005-06-25T19:01:05+00:00</updated>
   <id>http://room-303.com/blog/2005/06/25/83a8da1fa766ae4fb2a0953ece5cdf51</id>
   <content type="html">&lt;p&gt;Praktycznie każdy większy projekt trafia na taki moment, gdzie do wymiany zadań i zgłaszania problemów przestaje wystarczać email. Pojawiają się problemy: coraz częściej kilka osób zgłasza tę samą usterkę, zaczynają ginąć informacje (czy to przez chaos czy przez zwykłe zapomnienie o wiadomości). Ma to miejsce tak samo w projektach wewnątrzfirmowych, gdzie osób zgłaszających i obsługujących jest relatywnie mało, i w przedsięwzięciach OpenSource, gdzie liczba zgłaszających sięga czasem setek. Tutaj przychodzi czas na wdrożenie narzędzia, które pozwoli ogarnąć i poukładać przychodzące i wychodzące informacje. Najzwyklejszy bugtracker, bądź system ticketowania, używając bardziej ogólnej nazwy.&lt;/p&gt;

&lt;p&gt;Pojęcie ticketu pasuje tu bardziej. Ticketem nazywamy zlecenie. Nie musi to być bug, może to być prośba o sprawdzenie czegoś, pytanie o implementację dodatkowej funkcjonalności czy notatka do samego siebie, pozostawiona na później przez zapominalskich (jak ja). Ticket od zwykłego maila różni się tym, że ma nadany unikalny numer, przypisanego autora (czyli zgłaszającego), a nawet własną stronę WWW. Strona ta pozwala śledzić zmiany zachodzące w zgłoszeniu, sprawdzić postęp prac czy pozostawić swój komentarz. Na tym praca systemu ticketowego się nie kończy. Możliwości jest wiele.&lt;/p&gt;

&lt;p&gt;Najpopularniejsze wśród programistów są naturalnie wszelkie &lt;abbr title=&quot;Bug-Tracking System&quot;&gt;BTS&lt;/abbr&gt;. Na tym polu króluje niepodzielnie &lt;a href=&quot;http://www.bugzilla.org/&quot;&gt;Bugzilla&lt;/a&gt; - system zbudowany z myślą o bardzo dużych projektach programistycznych, jego oryginalnym przeznaczeniem były projekty prowadzone przez Mozilla Organization.&lt;/p&gt;

&lt;p&gt;Bugzilla jest świetnym systemem, jeśli chodzi o raportowanie i statystyki, marzenie dla osoby bezpośrednio zaangażowanej w życie projektu. Każdy problem jest dokładnie zaszeregowany, określony jest ściśle komponent, w którym błąd występuje, znany jest niemal numer linii, którą należy poprawić. Głównym problemem Bugzilli jest właśnie ta szczegółowość. Trudno bowiem oczekiwać od zwykłego użytkownika, by przed opisaniem okoliczności usterki musiał zapoznać się z kodem źródłowym swojej przeglądarki, a co najmniej z wewnętrzną strukturą projektu.&lt;/p&gt;

&lt;p&gt;Istnieje jednak alternatywa. Jest wiele innych aplikacji o podobnym przeznaczeniu, choćby &lt;a href=&quot;http://www.mantisbt.org/&quot;&gt;Mantis&lt;/a&gt; czy używany przez PLD &lt;a href=&quot;http://flyspray.rocks.cc/&quot;&gt;Flyspray&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Jest też &lt;a href=&quot;http://projects.edgewall.com/trac/&quot;&gt;Trac&lt;/a&gt; - mój ulubieniec, którego używamy w firmie. Jest niezwykle lekki, jednym z podstawowych założeń projektu jest niewpływanie na wypracowane przez zespół metody prowadzenia projektu. Przez to Trac jest bardzo elastyczny i łatwo dostosować go do własnych potrzeb (choćby przez definicję własnych pól). Jego interfejs jest dziecinnie prosty w użyciu, nie znajdziemy tu kilkudziesięciowierszowych formularzy czy zawiłej wyszukiwarki, całość wyglądem przypomina bardziej &lt;a href=&quot;http://www.basecamphq.com/&quot;&gt;Basecamp&lt;/a&gt; niż Bugzillę. Co ważne dla końcowych użytkowników, wysyłanie ticketów nie wymaga rejestracji w systemie. Jako zawartość pola &lt;q&gt;autor&lt;/q&gt; wpisujemy swój adres email i system będzie automatycznie informował nas o każdej zmianie w zgłoszeniu.&lt;/p&gt;

&lt;p&gt;Nie do pominięcia jest też integracja z lokalnym repozytorium Subversion. Trac w czytelny sposób wyświetla nam &lt;q&gt;Timeline&lt;/q&gt;, czyli chronologiczny zapis zmian w projekcie, gdzie obsługa ticketów miesza się z commitami do repozytorium, a przy każdym elemencie wyświetlona jest krótka informacja podsumowująca jego zawartość. Oczywiście, widok ten (podobnie jak każdy inny) możemy zasubskrybować w swoim ulubionym czytniku &lt;abbr title=&quot;Really Simple Sindication&quot;&gt;RSS&lt;/abbr&gt;. Dodatkowo listę kamieni milowych możemy połączyć ze swoim ulubionym kalendarzem, np. z iCal, Outlookiem czy Evolution.&lt;/p&gt;

&lt;p&gt;Na deser otrzymujemy jeszcze narzędzie do zarządzania projektami z poziomu wiersza poleceń. Można z jego pomocą wykonywać większośc pracy administracyjnej, jak dodawanie użytkownikom uprawnień czy zarządzanie komponentami projektu. Otrzymujemy też masę przykładowych skryptów do wykorzystania i integracji z Tracem, np. skrypt automatycznie zamykający zlecenia na podstawie commitlogów z repozytorium.&lt;/p&gt;

&lt;p&gt;Jedyną wadą Traca jest brak graficznego systemu administracyjnego i konieczność używania poleceń konsoli, co dla mnie jest bardzo wygodne, ale często może być niepożądane bądź niemożliwe do zrealizowania. Na szczęście kolejny kamień milowy ma już w planach klikalna wersję i tego narzędzia.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Pong!</title>
   <link href="http://room-303.com/blog/2005/06/23/b0a2426c2735bf6e1079f54d48eb9d07/"/>
   <updated>2005-06-23T21:49:41+00:00</updated>
   <id>http://room-303.com/blog/2005/06/23/b0a2426c2735bf6e1079f54d48eb9d07</id>
   <content type="html">&lt;p&gt;Co można zrobić w trzy godziny po pracy? Można pójść na piwo, można obejrzeć ciekawy film (byle długi), poczytać książkę, pooglądać telewizję (jeśli jest się głuchym, ślepym i odpornym na głupotę, albo wyjątkowo ceni się reklamy). Można też pójść do &lt;a href=&quot;http://monochrome.pl/&quot;&gt;grafika&lt;/a&gt; do domu i pobawić się flashem.&lt;/p&gt;

&lt;p&gt;Artystycznie zdolności posiadam absolutnie zerowe, nie znam się specjalnie na Macromedia Flashu MX, znam się za to na programowaniu i sprawia mi to niesamowitą frajdę, a tak się akurat złożyło, że jeden z klientów zamówił od nas... Ponga! Takiego ze starusieńkich automatów Atari, z wbudowanym telewizorem (kiedy o płaskich ekranach nikt jeszcze nie słyszał) i z pokrętłem zamiast joysticka.&lt;/p&gt;

&lt;p&gt;Efektem trzygodzinnego dopieszczania i testowania jest &lt;a href=&quot;http://patrys.icenter.pl/test/2005-06-23-pong/&quot;&gt;najnudniejsza gra na świecie&lt;/a&gt;. W wersji pełnej można, naturalnie, pograć myszką i zapisać swój wynik online.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Coś tu śmierdzi...</title>
   <link href="http://room-303.com/blog/2005/06/22/90c3eb16a1f8e3c7b94aad2befee4720/"/>
   <updated>2005-06-22T19:26:47+00:00</updated>
   <id>http://room-303.com/blog/2005/06/22/90c3eb16a1f8e3c7b94aad2befee4720</id>
   <content type="html">&lt;p&gt;&lt;abbr title=&quot;Search Engine Optimization&quot;&gt;SEO&lt;/abbr&gt; PL szukają sobie darmowej reklamy najwyraźniej. Postanowili zorganizować najgłupszy konkurs w historii internetu, pozycjonowanie własnej strony na hasło &lt;em&gt;msnbetter thangoogle&lt;/em&gt;. Przemilczę tutaj swoją opinię o wyszukiwarce &lt;abbr title=&quot;Microsoft Szuka Naiwnych&quot;&gt;MSN&lt;/abbr&gt; jak i o całości usług przez MSN oferowanych. Ważne jest to, że akcja ma, oprócz sprawdzenia czyichś umiejętności (jakich umiejętności, pozycjonowania się wśród 20 wyników?), zachęcić zespół &lt;a href=&quot;http://google.pl/&quot;&gt;Google&lt;/a&gt; do &lt;q&gt;przemyślenia swoich postępków&lt;/q&gt; odnośnie pozycjonowania. Jak długo żyję, nie słyszałem żeby ktoś narzekał na to, że ma zbyt prostą robotę. Skoro pozycjonowanie w Google jest tak bajecznie proste ich zdaniem, to czemu chcą jego zmiany? Może konkurencja radzi sobie lepiej? Doprawdy, ciężko pojąć, że z taką łatwością gotowi są oddać te nieprzebrane oceany gotówki. Google może i łatwo oszukać. No cóż, zwykłym ludziom pozostaje smutne wpisywanie zapytań dłuższych niż jedno słowo :&amp;gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; all your base are belong to us - &lt;a href=&quot;http://browsehappy.pl/#msnbetter/thangoogle&quot;&gt;MsnBetter ThanGoogle&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Standards versus reality, part 4</title>
   <link href="http://room-303.com/blog/2005/06/22/ccc55a74e01ee6d0265239b6f48f97e9/"/>
   <updated>2005-06-22T18:32:47+00:00</updated>
   <id>http://room-303.com/blog/2005/06/22/ccc55a74e01ee6d0265239b6f48f97e9</id>
   <content type="html">&lt;p&gt;Dziś krótko o stylach.&lt;/p&gt;

&lt;p&gt;&lt;abbr title=&quot;Cascading Style Sheets&quot;&gt;CSS&lt;/abbr&gt; ma taką przemiłą cechę, że pozwala przypisać dowolnemu elementowi nieograniczoną liczbę klas. Definiuje się to rozdzielając nazwy klas za pomocą spacji:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&amp;lt;p class=&quot;pierwsza druga&quot;&amp;gt;Lorem ipsum, baby!&amp;lt;/p&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;O dziwo, działa to nawet w &lt;abbr title=&quot;Internet Explorer&quot;&gt;IE&lt;/abbr&gt;. Przynajmniej częściowo. Pewien nieznośny bug sprawia, że w przypadku wystąpienia kilku klas, IE zaczyna przypisywać je dość rozrzutnie, aplikuje mianowicie wszystkie klasy, których nazwa zaczyna się (a może zawiera) dowolną z wymienionych. Stąd jeśli do powyższego przykładu przypisze się poniższy arkusz, efekt może być dość nieoczekiwany:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;.pierwsza
{
	color: #000;
}
.druga
{
	border: 1px solid #000;
}
.pierwszaNotka
{
	background: #000;
}&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;IE z ogromną radością zaaplikuje nam wszystkie trzy klasy, a efektem będzie czarny pasek. Czyż to nie przepysznie? Dlatego też należy unikać jak ognia sytuacji, kiedy nazwa jednej klasy jest jednocześnie prefiksem nazwy innej. Można też unikać aplikowania kilku klas do pojedynczego elementu.&lt;/p&gt;

&lt;p&gt;Drugi problem dotyczy wielkości liter, standard definiuje nazwy klas i identyfikatorów jako rozróżniające duże i małe litery. IE z kretesem ignoruje te informacje. Są dwa przypadki, kiedy może nas to zaboleć. Pierwszy to arkusz styli zbudowany z myślą o IE (o ile można w ogóle budować arkusze styli z myślą o konkretnej przeglądarce). Jeśli bowiem nasz dokument jest serwowany jako &lt;abbr title=&quot;Extensible HyperText Markup Language&quot;&gt;XHTML&lt;/abbr&gt;, przeglądarka ma obowiązek ściśle przestrzegać tagów elementów pisanych małymi literami. Stąd poza IE poniższy styl nie ma żadnego zastosowania, jako że nie istnieje element &lt;code&gt;&amp;lt;STRONG/&amp;gt;&lt;/code&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;STRONG
{
	color: #f00;
}&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Druga sytuacja to nazwy klas pisane jako &lt;code&gt;pojedynczeSłowo&lt;/code&gt; (preferuję ten styl ze względu na czytelność arkusza):&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&amp;lt;p class=&quot;loremIpsum&quot;&amp;gt;Lorem ipsum dolor sit amet&amp;lt;/p&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;pre&gt;.loremIpsum
{
	color: #f00;
}
.lOrEmIpSuM
{
	color: #00f;
}&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Kto zgadnie, jakiego koloru będzie powyższy paragraf? Tutaj sprawa jest prosta, nazwy trzeba definiować z rozmysłem i konsekwentnie, wtedy taka sytuacja raczej nie będzie mieć miejsca. Stosuje się tu też powyższa uwaga - do testowania CSS (jako podstawowej przeglądarki) należy używać czegoś, co działa. Dopiero potem dostosowywać kod do IE.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Ciężki żywot programisty, part 2</title>
   <link href="http://room-303.com/blog/2005/06/21/cb0725d59d475655e97f656bdfd76a62/"/>
   <updated>2005-06-21T16:52:26+00:00</updated>
   <id>http://room-303.com/blog/2005/06/21/cb0725d59d475655e97f656bdfd76a62</id>
   <content type="html">&lt;p&gt;Ciąg dalszy biurowej głupawki, dzisiaj postanowiliśmy polecieć po pracy na piwo. Zrobiliśmy to w starym stylu: &lt;a href=&quot;http://gallery.room-303.com/W%20pracy/ICenter/&quot;&gt;Odcinek pilotowy&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pomysł serii: Yezooz&lt;/li&gt;
&lt;li&gt;Scenariusz i zdjęcia: &lt;a href=&quot;http://monochrome.pl/&quot;&gt;Jarv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;W rolach głównych: Patrys&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jak poprzednio, odtwarzanie sponsoruje QuickTime, RealPlayer bądź Totem + w32codec.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #012: Marzenie informatyka</title>
   <link href="http://room-303.com/blog/2005/06/18/7718c5a5c62e84c461153cab5f959e80/"/>
   <updated>2005-06-18T19:25:12+00:00</updated>
   <id>http://room-303.com/blog/2005/06/18/7718c5a5c62e84c461153cab5f959e80</id>
   <content type="html">&lt;p&gt;Z góry przepraszam wszystkich urażonych, ale tak mi się jakoś skojarzyło było ;)&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/012-it-dream.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Notka na zamówienie Niny</title>
   <link href="http://room-303.com/blog/2005/06/18/9e2a7bfc270ae0a1805bffe003a7c7a0/"/>
   <updated>2005-06-18T17:28:37+00:00</updated>
   <id>http://room-303.com/blog/2005/06/18/9e2a7bfc270ae0a1805bffe003a7c7a0</id>
   <content type="html">&lt;p&gt;Siedząc przed komputerem, człowiek niejednokrotnie boryka się z tym samym i wciąż powtarzającym się problemem. Nie jest to jeden z tych znanych z &lt;abbr title=&quot;Bug Tracking System&quot;&gt;BTS&lt;/abbr&gt;ów &lt;q&gt;showstopperów&lt;/q&gt;, ale nie umniejsza to jego wagi ani o gram. Sprawa jest o tyle mniej przyjemna, że nie tyczy się cyberprzestrzeni, w której nurzamy się zawodowo czy prywatnie, a życia jak najbardziej realnego. W dobie komputerów, gdzie najwartościowszym towarem jest sygnał i ciągi jego bitów, jest to doznanie wręcz niecodzienne. Przyzwyczajeni myśleć o sobie jak o wszechpotężnych jednostkach, które &lt;q&gt;na wyciągnięcie klawisza&lt;/q&gt; czy może &lt;q&gt;w zasięgu myszki&lt;/q&gt; mają nieograniczoną wręcz siłę stwórczą, współcześni hakerzy przegrywają z kretesem w starciach z własną fizycznością. Niemożliwość prześledzenia zachodzących tam procesów, rozbioru na wątki, czy podejrzenia kodu czyni zmagania ze światem rzeczywistym czymś koszmarnym i odrażającym, czymś czego chcieliby unikać za wszelką cenę. Nic więc dziwnego, że tak zwana &lt;q&gt;młodzież z badblockami na twarzy&lt;/q&gt; nierzadko pozbawiona jest jakiegokolwiek życia socjalnego. Są to wyalienowane jednostki, które na kanałach &lt;abbr title=&quot;Internet Relay Chat&quot;&gt;IRC&lt;/abbr&gt; kreują się na guru, jednocześnie mając problemy z załatwieniem najprostszej choćby sprawy, kiedy wymagany jest bezpośredni kontakt z ludźmi. Reasumując, chciałem napisać, że nie wiem, czemu swędzi mnie kolano.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>emerge windows</title>
   <link href="http://room-303.com/blog/2005/06/14/4d716de66336d3e8957de34831442291/"/>
   <updated>2005-06-14T17:54:43+00:00</updated>
   <id>http://room-303.com/blog/2005/06/14/4d716de66336d3e8957de34831442291</id>
   <content type="html">&lt;p&gt;Jeden z założycieli &lt;a href=&quot;http://www.gentoo.org/&quot;&gt;projektu Gentoo&lt;/a&gt;, Daniel Robbins, od 3 tygodni grzeje swoim siedzeniem nowe, mało miękkie, krzesło. &lt;a href=&quot;http://www.gentoo.org/news/20050613-drobbins.xml&quot;&gt;Przyjął posadę&lt;/a&gt; w Redmond.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://pld-linux.org/&quot;&gt;PLD Linux&lt;/a&gt; nie ma więc już żadnych poważnych wrogów i możemy przejąć władzę nad światem, kiedy tylko wyjdzie wersja 2.0 Ac (a stanie się to z pewnością w ciągu najbliższych dwudziestu lat). :&amp;gt;&lt;/p&gt;

&lt;p&gt;Poważnie rzecz biorąc, to nie mam mu tego za złe (nie tyle osobiście, co jako aktywnemu członkowi ruchu &lt;abbr title=&quot;OpenSource&quot;&gt;OS&lt;/abbr&gt;). Jeśli uważa, że bardziej spełni się edukując redmoncianych &lt;abbr title=&quot;Chief Executive Officer&quot;&gt;CEO&lt;/abbr&gt;s w dziedzinie OS, to tylko lepiej dla niego, bo żadna praca nie hańbi, a płacą pewnie całkiem nieźle (ciężko najeść się kodem, nawet jeśli jest darmowy).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Standards versus reality, part 3</title>
   <link href="http://room-303.com/blog/2005/06/13/1086d2a6ea5001409c28b3f8a7b50164/"/>
   <updated>2005-06-13T22:18:36+00:00</updated>
   <id>http://room-303.com/blog/2005/06/13/1086d2a6ea5001409c28b3f8a7b50164</id>
   <content type="html">&lt;p&gt;List ciąg dalszy.&lt;/p&gt;

&lt;p&gt;Niesortowana lista jest najlogiczniejszą metodą na strukturalne przedstawienie menu serwisu, stąd często do kontrukcji nawigacji używa się właśnie odpowiednio ostylowanych &lt;code&gt;&amp;lt;ul/&amp;gt;&lt;/code&gt;. Na przykład:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&amp;lt;ul&amp;gt;
	&amp;lt;li&amp;gt;&amp;lt;a href=&quot;lorem&quot;&amp;gt;Lorem&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;&amp;lt;a href=&quot;ipsum&quot;&amp;gt;Ipsum&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;&amp;lt;a href=&quot;dolor&quot;&amp;gt;Dolor&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;&amp;lt;a href=&quot;sit/amet&quot;&amp;gt;Sit amet&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;pre&gt;ul
{
	list-style-type: none;
	margin: 0;
	padding: 0;
}
ul li
{
	display: block
	margin: 0;
	padding: 0;
}
ul li a
{
	background: #eee;
	color: #000;
	display: block;
	padding: 3px;
}
ul li a:hover
{
	background: #fff;
}&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Tu pojawia się problem. Firefox (oraz inne pochodne silnika Gecko), Konqueror (i oparte na &lt;code&gt;KHTML&lt;/code&gt;) i Opera wyświetlają wszystko prawidłowo. W &lt;abbr title=&quot;Internet Explorer&quot;&gt;IE&lt;/abbr&gt; za to każda pozycja menu ma dodatkowy zapas przestrzeni na dole. Wygląda to tak, jakby na końcu każdego odnośnika wymusić złamanie wiersza. Problem leży w tym, że IE nieprawidłowo interpretuje białe znaki pomiędzy elementami listy. Problem znika (choć kod staje się nieczytelny) po całkowitym usunięciu odstępów pomiędzy elementami &lt;code&gt;&amp;lt;li/&amp;gt;&lt;/code&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&amp;lt;li&amp;gt;...&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;...&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;...&amp;lt;/li&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Inne zastosowanie niesortowanych list to tak zwane &lt;q&gt;okruszki&lt;/q&gt; (ang. breadcrumbs), czyli element nawigacji pokazujący bieżącą pozycję w serwisie (choć oryginalnie okruszki służyły pokazaniu historii oglądanych stron serwisu):&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&amp;lt;p&amp;gt;Jesteś tutaj:&amp;lt;/p&amp;gt;

&amp;lt;ul&amp;gt;
	&amp;lt;li&amp;gt;&amp;lt;a href=&quot;/&quot;&amp;gt;Lorem&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;&amp;lt;a href=&quot;/oferta/&quot;&amp;gt;Oferta&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;&amp;lt;a href=&quot;/oferta/czapki/&quot;&amp;gt;Czapki&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;Kapelusz słomiany ZX64&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;pre&gt;ul
{
	list-style-type: none;
	margin: 0;
	padding: 0;
}
ul li
{
	display: inline;
	padding: 0 15px 0 0;
}
ul li a
{
	background: url('bullet.png') no-repeat 100% 50%;
}&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Tutaj objawia się problem IE w wersji 5.0 (poprawiono go w wersji 5.5, ale spora część użytkowników Windows 98 do dziś posiada wersję 5.0) - przeglądarka nie radzi sobie z paddingiem dla elementów wyświetlanych &lt;code&gt;inline&lt;/code&gt;. Nie ma na to specjalnie rady, na szczęście przeglądarki te są na tyle marginalne, że na ogół można je pominąć. Jednym z działających obejść tego problemu jest nadanie elementom listy wyświetlania &lt;code&gt;block&lt;/code&gt;, a następnie floatowanie ich do lewej strony, posiłkując się marginesami dla uzyskania odstępu.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Dla leniwych kinomanów</title>
   <link href="http://room-303.com/blog/2005/06/12/d9c8cdfbf22fa64469eca292fc07b6c0/"/>
   <updated>2005-06-12T16:30:06+00:00</updated>
   <id>http://room-303.com/blog/2005/06/12/d9c8cdfbf22fa64469eca292fc07b6c0</id>
   <content type="html">&lt;p&gt;Bilety są drogie? Kino daleko? Nie ma z kim iść? Aaa, twojego ulubionego filmu już nie grają. No cóż, można dorwać go na wideo, DVD albo w DivX. Że niby czasu nie ma?&lt;/p&gt;

&lt;p&gt;Teraz twoje ulubione filmy trwają tylko 30 sekund. Zapraszam na stronę &lt;a href=&quot;http://www.angryalien.com/&quot;&gt;Angry Alien Productions&lt;/a&gt;. :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Critical update</title>
   <link href="http://room-303.com/blog/2005/06/09/27ae12d1031fbba2cd5b04aef3a388dc/"/>
   <updated>2005-06-09T23:21:41+00:00</updated>
   <id>http://room-303.com/blog/2005/06/09/27ae12d1031fbba2cd5b04aef3a388dc</id>
   <content type="html">&lt;p&gt;&lt;em&gt;Nie pytaj, co SynPrezesa&amp;trade; może zrobić dla ciebie, spytaj raczej, co ty możesz zrobić dla SynaPrezesa&amp;trade;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A lista życzeń długa nie jest, spieszcie się drodzy państwo, bo nie starczy dla wszystkich chętnych. Rezerwacje przyjmowane są przez internet, bilety drożeją w dniu koncertu... znaczy się źle powiedziałem, cholerne przyzwyczajenia. Do zobaczenia na &lt;a href=&quot;http://selox.org/index.php?module=listaprezentow&quot;&gt;oficjalnej stronie&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Dating a developer</title>
   <link href="http://room-303.com/blog/2005/06/09/f6fdd63b6f1b33185fd1617aa3e12c73/"/>
   <updated>2005-06-09T17:09:28+00:00</updated>
   <id>http://room-303.com/blog/2005/06/09/f6fdd63b6f1b33185fd1617aa3e12c73</id>
   <content type="html">&lt;p&gt;Niewątpliwie jeden z najlepszych artykułów blogowych, jakie przeczytałem w ciągu ostatniego miesiąca, jednocześnie jeden z najprawdziwszych. Dodatkowo wszystko podane w przystępnej postaci i okraszone humorem. Nie będę was dłużej trzymał w niepewności, zapraszam do czytania &lt;q&gt;&lt;a href=&quot;http://www.emilyhambidge.com/blog/emily/66/&quot;&gt;Dating an Apple Developer&lt;/a&gt;&lt;/q&gt;.&lt;/p&gt;

&lt;p&gt;Link sponsorowany przez &lt;a href=&quot;http://monochrome.pl/&quot;&gt;Jarvisa&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Back to reality</title>
   <link href="http://room-303.com/blog/2005/06/08/fa964039db6cc1feaa5f186b227f44d2/"/>
   <updated>2005-06-08T17:57:53+00:00</updated>
   <id>http://room-303.com/blog/2005/06/08/fa964039db6cc1feaa5f186b227f44d2</id>
   <content type="html">&lt;p&gt;Mimo trudności i perypetii, w końcu się udało oddać notebooka do naprawy, a dziś &lt;a href=&quot;http://www.productreview.com.au/showitem.php?item_id=2750&quot;&gt;mój dzielny Asus&lt;/a&gt; powrócił w ręce swego właściciela.&lt;/p&gt;

&lt;p&gt;Okazało się, że sprzęt jest cały i zdrowy, awarii uległ tylko &lt;abbr title=&quot;Basic Input/Output System&quot;&gt;BIOS&lt;/abbr&gt; i to on był przyczyną braku klawiatury. Muszę bardzo pochwalić &lt;a href=&quot;http://notebooki.wroc.pl/&quot;&gt;Spring Notebook&lt;/a&gt; za czas reakcji, maszyna pojechała do serwisu kurierem jeszcze tego samego dnia, kiedy została oddana, a wróciła po dwóch dniach, choć gwarancja daje im zapas czternastu. Pan tylko zdziwił się mocno w momencie przyjmowania komputera, kiedy to dla próby go zabootował, a tu &lt;em&gt;uncompressing kernel image&lt;/em&gt; i jakieś matriksy na ekranie ;).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Ciężki żywot programisty</title>
   <link href="http://room-303.com/blog/2005/06/06/978e56d48bae87946e4e446bfd5d83bc/"/>
   <updated>2005-06-06T21:08:40+00:00</updated>
   <id>http://room-303.com/blog/2005/06/06/978e56d48bae87946e4e446bfd5d83bc</id>
   <content type="html">&lt;p&gt;Praca w biurze jest ciężka i może prowadzić do poważnych dewiacji i zaburzeń rzeczywistości postrzeganej. I nas nie ominęły ciężkie choroby, w związku z tym zapraszam do oglądania &lt;a href=&quot;http://gallery.room-303.com/W%20pracy/ICenter/&quot;&gt;Doom: Office Edition&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pomysł serii: Yezooz&lt;/li&gt;
&lt;li&gt;Scenariusz, muzyka i zdjęcia: &lt;a href=&quot;http://monochrome.pl/&quot;&gt;Jarv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;W rolach głównych: Patrys&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PS: wymaga RealPlayera.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Standards versus reality, part 2</title>
   <link href="http://room-303.com/blog/2005/06/05/912f0f2a86d0240a2be646f945ba1cad/"/>
   <updated>2005-06-05T18:09:08+00:00</updated>
   <id>http://room-303.com/blog/2005/06/05/912f0f2a86d0240a2be646f945ba1cad</id>
   <content type="html">&lt;p&gt;Dziś o listach. Listy niesortowane (&lt;code&gt;&amp;lt;ul/&amp;gt;&lt;/code&gt;) są najczęściej wykorzystywanym typem wyliczeń w sieci, jeśli nie liczyć bulletów wstawianych jako &lt;code&gt;&amp;lt;img/&amp;gt;&lt;/code&gt; na początku każdego akapitu (co jest naturalnie bez sensu).&lt;/p&gt;

&lt;p&gt;Pierwszy kłopot z listami polega na tym, że każda przeglądarka w inny sposób implementuje wcięcia. Jedne robią to za pomocą atrybutu &lt;code&gt;padding&lt;/code&gt;, inne za pomocą &lt;code&gt;margin&lt;/code&gt;. Jedyna uniwersalna metoda, to wyzerować jeden, a określić drugi parametr:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;ul.naszaLista li
{
	margin: 0;
	padding: 2px 2px 2px 20px;
}&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Druga sprawa to odległość pomiędzy bulletem, a tekstem. Teoretycznie istnieje w &lt;abbr title=&quot;cascading Style Sheets&quot;&gt;CSS&lt;/abbr&gt; atrybut &lt;code&gt;marker-offset&lt;/code&gt;, ale w praktyce nie istnieje dla niego wsparcie. W związku z tym, najlepszym wyjściem jest stworzyć własny obrazek dla bulleta i zadeklarować go jako &lt;code&gt;background&lt;/code&gt; dla elementu listy:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;ul.naszaLista li
{
	background: url('img/bullet.png') no-repeat 0% 50%;
	margin: 0;
	padding: 2px 2px 2px 20px;
}&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;W tym wypadku lewy padding (kolejność podawania parametrów jest zdefiniowana według kierunku ruchu wskazówek zegarka - góra, prawo, dół, lewo) ustawiamy w tym przypadku na szerokość obrazka + wymaganą odległość pomiędzy obrazkiem a tekstem.&lt;/p&gt;

&lt;p&gt;Na koniec wspomnę jeszcze, że &lt;abbr title=&quot;Internet Explorer&quot;&gt;IE&lt;/abbr&gt; ma problem z połączeniem &lt;code&gt;letter-spacing&lt;/code&gt; i &lt;code&gt;line-height&lt;/code&gt;. W przypadku, kiedy zostaną zadeklarowane oba, IE przestanie pokazywać co drugi znak łamania wiersza (&lt;code&gt;&amp;lt;br/&amp;gt;&lt;/code&gt;). &lt;a href=&quot;http://patrys.jogger.pl/comment.php?eid=97921&amp;amp;startid=200502&quot;&gt;Wspominałem o tym w lutym&lt;/a&gt;, kiedy błąd został przypadkowo odkryty przez naszego klienta, który nadużywał znaczników &lt;code&gt;&amp;lt;br/&amp;gt;&lt;/code&gt; do formatowania tekstu na stronie. Do dziś nie znaleźliśmy obejścia tego problemu, na szczęście &lt;code&gt;letter-spacing&lt;/code&gt; jest relatywnie rzadko używany.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Standards versus reality</title>
   <link href="http://room-303.com/blog/2005/06/04/805436bafd24cb51750ef4dd5ab4b5f4/"/>
   <updated>2005-06-04T21:11:35+00:00</updated>
   <id>http://room-303.com/blog/2005/06/04/805436bafd24cb51750ef4dd5ab4b5f4</id>
   <content type="html">&lt;p&gt;Przy obecnej popularności webdesignu (a raczej bycia trendy i walidacji, o czym &lt;a href=&quot;http://patrys.jogger.pl/comment.php?eid=119454&amp;amp;startid=200505&quot;&gt;pisałem w zeszłym miesiącu&lt;/a&gt;), co drugi użytkownik sieci cytuje z pamięci regułki &lt;abbr title=&quot;Cascading Style Sheets&quot;&gt;CSS&lt;/abbr&gt;, sypie kodem &lt;abbr title=&quot;(Extensible) HyperText Markup Language&quot;&gt;(X)HTML&lt;/abbr&gt;, chwali się beztabelkowymi osiągnięciami. Często te &lt;q&gt;beztabelkowce&lt;/q&gt; zajmują pięć razy więcej miejsca (ale przecież &lt;q&gt;bandwidth is cheap&lt;/q&gt;) i w środku korzystają z &lt;code&gt;display: table;&lt;/code&gt;, ale nie o tym chciałem pisać. Zajmijmy się problemami, w rozwiązaniu których standardy niewiele pomagają.&lt;/p&gt;

&lt;p&gt;Jedną z rzeczy, którą można bardzo łatwo zaimplementować za pomocą semantycznego HTML + CSS jest układ kolumnowy. Używa się do tego dwóch elementów &lt;code&gt;&amp;lt;div/&amp;gt;&lt;/code&gt;, z czego jeden jest floatowany do krawędzi.&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&amp;lt;div id=&quot;navbar&quot;&amp;gt;
	&amp;lt;p&amp;gt;To jest menu&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div id=&quot;content&quot;&amp;gt;
	&amp;lt;p&amp;gt;To jest treść strony&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;pre&gt;#navbar
{ 
	margin: 0 10px;
	background-color: #69f;
	float: left;
	width: 180px;
	height: 400px;
	border: 1px solid #ccc;
}
#content 
{ 
	width: 475px;
	border: 1px solid #ccc;
	background-color: #fff;
}&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Problemy zaczynają się pod &lt;abbr title=&quot;Internet Explorer&quot;&gt;IE&lt;/abbr&gt;, który raz, że nie radzi sobie z precyzyjnym pozycjonowaniem floatów (jeśli floatowany element jest dokładnie szerokości dostępnego miejsca, to następuje złamanie wiersza, wymagany jest dwupikselowy zapas), a dwa, z nieznanych nikomu przyczyn magicznie podwaja marginesy wszystkich pływających elementów, jeśli tylko są typu &lt;code&gt;block&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O ile jedynym rozwiązaniem na precyzyjne umiejscowienie dwóch kolumn jest zastąpienie obu bloków dwukolumnową tabelką, o tyle drugi problem rozwiązuje się trywialnie. Tyle, że nikt przy zdrowych zmysłach by na takie rozwiązanie nie wpadł. Należy mianowicie wymusić na przeglądarce traktowanie elementów floatowanych jako elementy typu &lt;code&gt;inline&lt;/code&gt;. Wyjście takie wydaje się mocno abstrakcyjne i pozbawione sensu, ale działa, wobec tego ograniczymy jego skutki do jedynej słusznej przeglądarki, która obejść takich wymaga.&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;#navbar
{ 
	margin: 0 10px 0 0;
	background-color: #69f;
	float: left;
	width: 180px;
	height: 400px;
	border: 1px solid #ccc;
}
* html #navbar
{
	display: inline;
}&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Trik polega na tym, że w IE nie działa właściwie nic, a przede wszystkim nie działają tam selektory CSS, z selektorem gwiazdki na czele. Powyższa konstrukcja mówi tyle, że &lt;code&gt;display: inline;&lt;/code&gt; powinno odnosić się do wszystkich elementów o &lt;code&gt;id&lt;/code&gt; równym &lt;q&gt;navbar&lt;/q&gt;, zawierających się w elemencie &lt;code&gt;&amp;lt;html/&amp;gt;&lt;/code&gt;, który ma dowolnego rodzica. Standard HTML wyraźnie precyzuje, że element główny, &lt;code&gt;&amp;lt;html/&amp;gt;&lt;/code&gt; nie może mieć żadnego rodzica w ramach jednego dokumentu (nie dotyczy to drzewa &lt;abbr title=&quot;Document Object Model&quot;&gt;DOM&lt;/abbr&gt; stron opartych na ramkach, ale tam CSS przypisywany jest do każdego węzła głównego i nie jest dziedziczony przez subdokumenty). IE uważa, że jest inaczej, co pozwala (przynajmniej do wersji 6.0) łatwo ukrywać workaroundy przed innymi przeglądarkami.&lt;/p&gt;

&lt;p&gt;Oczywiście, bardziej eleganckim rozwiązaniem byłoby dodanie marginesu (równego szerokości lewej kolumny + pożądanemu odstępowi) do prawej kolumny:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;#navbar
{ 
	background-color: #69f;
	float: left;
	width: 180px;
	height: 400px;
	border: 1px solid #ccc;
}
#content 
{ 
	margin: 0 0 0 190px;
	width: 475px;
	border: 1px solid #ccc;
	background-color: #fff;
}&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Nie rozwiązuje to jednak problemu układów bardziej skomplikowanych (gdzie stosujemy więcej niż dwie kolumny z floatem).&lt;/p&gt;

&lt;p&gt;Drugi z częstych problemów, to zmuszenie elementów pływających do rozciągania rodzica. Weźmy pod uwagę prosty układ:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&amp;lt;div id=&quot;parent&quot;&amp;gt;
	&amp;lt;div id=&quot;child&quot;&amp;gt;
		&amp;lt;p&amp;gt;Lorem ipsum dolor sit amet
		consectetuer adipiscing elit.&amp;lt;/p&amp;gt;
	&amp;lt;/div&amp;gt;
	&amp;lt;p&amp;gt;Lorem ipsum, baby!&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;pre&gt;#parent
{
	background: #fff;
	border: 1px solid #ccc;
	color: #000;
	padding: 5px;
}
#child
{
	background: #eee;
	border: 1px solid #ccc;
	color: #000;
	float: right;
	width: 100px;
}&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Ze względu na stosunkowo długi tekst w pływającym boksie (w porównaniu do krótkiego tekstu głównego), istnieje ryzyko, że boks dziecka będzie dłuższy od boksa rodzica, co (zgodnie ze standardem) spowoduje jego wystawanie poza obiekt rodzica (nie zostanie od przedłużony). Nie jest to na ogół działanie, jakiego oczekujemy, pojawiło się więc kilka rozwiązań tej niedogodności.&lt;/p&gt;

&lt;p&gt;Najpopularniejsze polega na wstawieniu, tuż przed tagiem zamykającym rodzica, następującego zapisu:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&amp;lt;br style=&quot;clear: both;&quot;&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Metoda ta ma jednak dwie wady: niepotrzebnie zaśmieca kod strony (co jest dla wielu do pominięcia) i powoduje pojawienie się zbędnego znaku złamania wiersza (co w zależności od pogody i populacji muflona, jest przez IE ignorowanie bądź nie).&lt;/p&gt;

&lt;p&gt;Najczystsza metoda nie wymaga ingerencji w kod HTML i sprowadza się do dodania w arkuszu CSS (dla elementu rodzica) jednej linijki:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;overflow: auto;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Przeglądarka od tego momentu zaczyna się interesować wystającymi elementami i elegancko przedłuży nam obiekt rodzica do wymaganego rozmiaru. Należy jednak uważać, bo gdy rodzic ma zadeklarowaną stałą wysokość, to w jego boksie pojawią się paski przewijania (uzyskamy efekt taki, jak przy elemencie &lt;code&gt;&amp;lt;iframe/&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Kolejny problem to wymuszenie minimalnej wysokości elementu. Najprościej byłoby napisać:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;#element
{
	min-height: 300px;
}&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Jest jednak przeglądarka, która w dziedzinie wspierania standardów nigdy nas nie zawiedzie. IE skrupulatnie ignoruje wszelkie zapisy tego typu. Co więcej, nieprawidłowo implementuje też atrybut &lt;code&gt;height&lt;/code&gt;, który w IE zachowuje się właśnie jak &lt;code&gt;min-height&lt;/code&gt;. Z pomocą przychodzi nam wspomniany wcześniej hack:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;#element
{
	min-height: 300px;
}
* html #element
{
	height: 300px;
}&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;I kolejny problem: model boksa w IE prawidłowo został zaimplementowany dopiero w IE 6.0 i to tylko w trybie &lt;em&gt;strict&lt;/em&gt; (w przeciwieństwie do domyślnego &lt;em&gt;quirks mode&lt;/em&gt;). Powoduje to, że w przeglądarkach z Redmont padding nie wpływa na finalny rozmiar boksa. Innymi słowy, jeśli nasz obiekt ma szerokość zadeklarowaną na 100px i 20px paddingu z obu stron, to w IE zajmie dokładnie 100px, a na treść pozostanie 60px (po odjęciu 2x 20px), podczas gdy we wszystkich pozostałych przeglądarkach element zajmie 140px, rezerwując na treść całe (zadeklarowane w CSS) 100px.&lt;/p&gt;

&lt;p&gt;Jeśli nie jest wymagana zgodność ze starszymi przeglądarkami (np. IE 5.5), to problem dla ciebie nie istnieje. Wystarczy zadeklarować prawidłowy &lt;code&gt;DOCTYPE&lt;/code&gt; i wymusić przejście przeglądarki w &lt;em&gt;strict mode&lt;/em&gt;. W biznesie webdesignowym rzadko można sobie pozwolić na tego typu uproszczenia, bo ważny jest każdy klient serwisu, niezależnie od tego, jak starej przeglądarki używa. Jedynym sensownym rozwiązaniem pozostaje symulowanie paddingu za pomocą zagnieżdżonych elementów i marginesów.&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&amp;lt;div id=&quot;outer&quot;&amp;gt;
	&amp;lt;div id=&quot;inner&quot;&amp;gt;
		&amp;lt;p&amp;gt;Treść.&amp;lt;/p&amp;gt;
	&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;pre&gt;#outer
{
	/* padding: 5px */
}
#inner
{
	height: 100%;
	margin: 5px;
}&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;W zależności od popularności tego tekstu, postaram się opisać więcej błędów i problemów, póki co - czekam na komentarze.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Znikam z sieci...</title>
   <link href="http://room-303.com/blog/2005/06/03/a6edf3006c12018f8931f51b946c7940/"/>
   <updated>2005-06-03T07:49:41+00:00</updated>
   <id>http://room-303.com/blog/2005/06/03/a6edf3006c12018f8931f51b946c7940</id>
   <content type="html">&lt;p&gt;...przynajmniej tymczasowo. Robiłem akurat upgrade kernela wczoraj i, przy okazji, zmieniłem w końcu &lt;a href=&quot;http://freshmeat.net/projects/lilo/&quot;&gt;Lilo&lt;/a&gt; na &lt;a href=&quot;http://www.gnu.org/software/grub/&quot;&gt;Gruba&lt;/a&gt;. Po restarcie maszyny przypomniałem sobie, że Grub pozostał nieskonfigurowany, ale to nie powinien być problem, bo Grub jest interaktywny. Dziarsko zabrałem się za edycję menu, boot dla testu, nie działa, powrót do menu, zapomniałem dopisać &lt;code&gt;initrd&lt;/code&gt;, reboot i... i nic. Nie mogę wejść nawet w interaktywny tryb Gruba. Ba, nie mogę wejść do &lt;code&gt;setup&lt;/code&gt;u &lt;abbr title=&quot;Basic Input/Output System&quot;&gt;BIOS&lt;/abbr&gt;u. W moim pięknym Asusie padła klawiatura, w związku z czym straciłem stanowisko pracy.&lt;/p&gt;

&lt;p&gt;Straciłem również dostęp do kilku projektów, w tym paru BardzoWażnychRzeczy&amp;trade;, od których zależą moje zaliczenia na studiach. Mam nadzieję, że serwis nie przetrzyma mi go 2 tygodnie, bo wtedy będzie już po najważniejszej części sesji. Póki co, nie mam maszyny, więc i na sieci mnie nie będzie, w pracy polityka firewalla odcina mi dostęp do wszystkiego, co nie chodzi przez &lt;abbr title=&quot;HyperText Transfer Protocol&quot;&gt;HTTP&lt;/abbr&gt;, a i tak serwer Joggera jest na czarnej liście.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Miasto pełne awarii</title>
   <link href="http://room-303.com/blog/2005/06/02/7a075e5a4012f765cac8a8b81ff812b2/"/>
   <updated>2005-06-02T18:38:58+00:00</updated>
   <id>http://room-303.com/blog/2005/06/02/7a075e5a4012f765cac8a8b81ff812b2</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://prodesign.pl/&quot;&gt;Nasza firma&lt;/a&gt; ma chyba pecha do awarii. Nie mamy problemu ze sprzętem, oprogramowanie działa bez zarzutu, załoga jest kompetentna i swoje prace wykonujemy sumiennie. Inni się chyba na nas uwzięli.&lt;/p&gt;

&lt;p&gt;Firma mieści się w centrum miasta, tuż obok kina &lt;a href=&quot;http://www.heliosnet.pl/&quot;&gt;Helios&lt;/a&gt;, stare budownictwo, za sąsiadów mamy między innymi &lt;a href=&quot;http://techland.pl/&quot;&gt;Techland&lt;/a&gt;. Obsługuje nas chyba najgorsza podstacja elektryczna w całym Wrocławiu. Regularnie, raz w miesiącu, bez ostrzeżenia pada zasilanie. Pada i leży tak przez dobre 30-40 minut.&lt;/p&gt;

&lt;p&gt;Ludzie pracujący przy designie rwą sobie włosy z głowy na myśl o uszkodzonych plikach na dysku, serwerownia ciągnie ostatkiem sił, bo bateria &lt;abbr title=&quot;Uninterruptible Power Supply&quot;&gt;UPS&lt;/abbr&gt;ów wytrzymuje obciążenie przez około 15 minut. Rozdzwaniają się telefony (&lt;q&gt;tak, wiemy, że poczta nie działa, to nie nasza wina&lt;/q&gt;). Czasem serwery nie mają kontaktu ze światem, bo z braku prądu łącze zerwie się gdzieś po drodze, szlag nas trafia. Każda taka awaria jest dla energetyki miejskiej ogromnym zaskoczeniem (a dziwnym trafem zdarzają się zawsze po 16:00), a dla nas oznacza siedzenie po godzinach w pracy i podnoszenie biednych maszynek do stanu używalności.&lt;/p&gt;

&lt;p&gt;Tak było też i dzisiaj, biuro z &lt;a href=&quot;http://qwiat.icenter.pl/&quot;&gt;Qwiatem&lt;/a&gt; opuściliśmy punkt 19:30. Byłoby wcześniej, gdyby wystarczyło podnieść maszyny. Problem w tym, że szef chce mieć minimalny downtime (co wychodzi zupełnie odwrotnie) i wyraźnie nakazuje ciągnąć wszystko aż do ostatecznego padu UPSów.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Magiczny klawisz SysRq</title>
   <link href="http://room-303.com/blog/2005/06/01/141168de67f4a863323786a81aa9c5c0/"/>
   <updated>2005-06-01T18:52:41+00:00</updated>
   <id>http://room-303.com/blog/2005/06/01/141168de67f4a863323786a81aa9c5c0</id>
   <content type="html">&lt;p&gt;Z premedytacją robię repost, bo nie ma co się silić na oryginalność w temacie obsługi systemu, a dużo ludzi nadal nie wie, do czego służy &lt;q&gt;ten zabawny klawisz&lt;/q&gt; na ich klawiaturach.&lt;/p&gt;

&lt;p&gt;Całkiem spora grupa osób wykorzystuje Linuksa jako podstawowe środowisko pracy, dziwi więc fakt, że większość z nich nie zdaje sobie sprawy z istnienia tak przydatnego klawisza, jak &lt;kbd&gt;SysRq&lt;/kbd&gt;. Oczywiście, jego przydatność do pracy z codziennymi aplikacjami jest raczej znikoma, jednak okazuje się on nieoceniony, kiedy aplikacje te zawiodą.&lt;/p&gt;

&lt;p&gt;Jak często zdarza ci się sięgać do przycisku &quot;reset&quot;, kiedy jakiś pamięciożerny program zajmie cały bufor iksów i komputer przestanie reagować na jakiekolwiek klawisze? Nawet, jeśli zdarzyło ci się to tylko raz w życiu, czy nie wolałbyś uniknąć wtedy konieczności rebootowania?&lt;/p&gt;

&lt;p&gt;Z pomocą przychodzi nam debugger jądra. Jest on uruchamiany poprzez przekazanie wartości &lt;q&gt;1&lt;/q&gt; do węzła &lt;code&gt;/proc/sys/kernel/sysrq&lt;/code&gt; i jest domyślną wartością dla większości systemów. Jeśli chcesz to zrobić ręcznie, wystarczy:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;echo 1 &amp;gt; /proc/sys/kernel/sysrq&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;W &lt;a href=&quot;http://pld-linux.org&quot;&gt;PLD&lt;/a&gt; działanie tego klawisza można kontrolować za pomocą pliku &lt;code&gt;/etc/sysctl.conf&lt;/code&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;# Enable the magic-sysrq key
kernel.sysrq = 1&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;&lt;kbd&gt;SysRq&lt;/kbd&gt; to klawisz, którego obsługi w systemie linuksowym nie może przejąć żaden proces. Każde jego przyciśnięcie (a jest wywoływany przez jednoczesne przytrzymanie &lt;kbd&gt;Alt&lt;/kbd&gt; i &lt;kbd&gt;PrtScr&lt;/kbd&gt;) jest przetwarzane na poziomie kernela. O ile sam &lt;kbd&gt;SysRq&lt;/kbd&gt; nie daje nam nic, o tyle jego przytrzymanie i przyciśnięcie jegnego z pozostałych klawiszy może przynieść o wiele ciekawsze rezultaty. Pełna lista poniżej:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;kbd&gt;Alt+SysRq+H&lt;/kbd&gt; wyświetla pomoc. Jest to lista możliwych funkcji z wyróżnionymi literami. Każda wyróżniona litera to skrót klawiszowy, który daną funkcję wyzwala. Jest to jedyna kombinacja, którą można bezpiecznie wypróbować na sprawnym systemie.&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;Alt+SysRq+B&lt;/kbd&gt; powoduje natychmiastowy reboot systemu, bez odmontowania dysków i zapisania ich buforów. Użycie w większości przypadków zaowocuje uszkodzonym systemem plików.&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;Alt+SysRq+E&lt;/kbd&gt; wysyła sygnał &lt;code&gt;TERM&lt;/code&gt; do wszystkich procesów z wyjątkiem procesu init, prosząc o samounicestwienie wyżej wymienionych.&lt;/li&gt;

&lt;li&gt;&lt;kbd&gt;Alt+SysRq+I&lt;/kbd&gt; wysyła sygnał &lt;code&gt;KILL&lt;/code&gt; do wszystkich procesów z wyjątkiem procesu init, wymuszając zabicie wszystkich procesów.&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;Alt+SysRq+K&lt;/kbd&gt; wysyła sekwencję &lt;abbr title=&quot;Secure Access Key&quot;&gt;SAK&lt;/abbr&gt;. Powoduje uśmiercenie wszystkich procesów związanych z bieżącym terminalem (bądź konsolą wirtualną). Przydatne, kiedy iksy odmówią współpracy.&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;Alt+SysRq+L&lt;/kbd&gt; wysyła sygnał &lt;code&gt;KILL&lt;/code&gt; do wszystkich procesów, z procesem init włącznie. Zabicie procesu init powoduje unieruchomienie całego systemu.&lt;/li&gt;

&lt;li&gt;&lt;kbd&gt;Alt+SysRq+M&lt;/kbd&gt; wypisuje informacje o pamięci. Przydatne tylko do debugowania.&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;Alt+SysRq+O&lt;/kbd&gt; wyłącza system, jeśli funkcja taka jest dostępna.&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;Alt+SysRq+P&lt;/kbd&gt; wypisuje na bieżącą konsolę zawartość rejestrów i flag procesora. Przydatne tylko przy debugowaniu jądra.&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;Alt+SysRq+R&lt;/kbd&gt; przełącza tryb raw klawiatury. Pozwala na wysłanie &lt;kbd&gt;Ctrl+Alt+Del&lt;/kbd&gt; nawet jeśli zawiesi się obsługująca aktualnie klawiaturę sesja X.&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;Alt+SysRq+S&lt;/kbd&gt; wymusza synchronizację buforów dyskowych dla wszystkich zamontowanych systemów plików. Przydatne jeśli musisz wymusić reboot, a nie chcesz ryzykować niespójności danych.&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;Alt+SysRq+T&lt;/kbd&gt; powoduje wypisanie listy wszystkich zadań.&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;Alt+SysRq+U&lt;/kbd&gt; próbuje przemontować wszystkie systemy plików w trybie tylko do odczytu. Powoduje synchronizację buforów dyskowych i pomaga uniknąć sprawdzania spójności dysków przy ponownym starcie.&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;Alt+SysRq+cyfry&lt;/kbd&gt; zmienia poziom debugowania (gadatliwość kernela) w zakresie od 0 (tylko Panic i Oops) do 9.&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Gadżety</title>
   <link href="http://room-303.com/blog/2005/05/29/705d2a916030df1710938ff5e56ad8c9/"/>
   <updated>2005-05-29T16:10:45+00:00</updated>
   <id>http://room-303.com/blog/2005/05/29/705d2a916030df1710938ff5e56ad8c9</id>
   <content type="html">&lt;p&gt;Geek to człowiek, który żyje swoim hobby. Jedną z cech geeków jest kolekcjonowanie dziwnych (przynajmniej z pozoru) rzeczy. Niektórzy kolekcjonują znaczki, inni karty sieciowe na chipsecie &lt;code&gt;RTL8139&lt;/code&gt;, a jeszcze inni kobiety.&lt;/p&gt;

&lt;p&gt;Ja kolekcjonuję dziwne części codziennej garderoby. Do niedawna można było mnie poznać po chuście zawiązanej na głowie, smyczy &lt;em&gt;PLD Linux Distribution&lt;/em&gt; i nieśmiertelnikach:&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://patrys.room-303.com/images/photos/photo-dogtag.jpg&quot; alt=&quot;Nieśmiertelniki&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Dla ciekawych, napis głosi, co następuje:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;PATRYS

OJCIEC DYREKTOR

MSR CREW&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Od niedawna, bo od soboty, do kompletu dołączyły stylowe okulary, używane niegdyś przez szwajcarskie wojska śnieżne:&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://patrys.room-303.com/images/photos/gogle.jpg&quot; alt=&quot;Gogle&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Wyglądam teraz jeszcze bardziej dziwnie, a staruszki z litością ustępują mi miejsca w środkach miejskiej komunikacji zbiorowej. Mimo wszystko, nie lubię wyglądać jak &lt;q&gt;typowy geek&lt;/q&gt;, mój obecny image odpowiada mi znacznie bardziej, a i płeć przeciwna lgnie chętniej niż do przepoconego komputerowca. Efekt końcowy na załączonym obrazku:&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://patrys.room-303.com/images/photos/photo-gogle.jpg&quot; alt=&quot;Patrys w komplecie&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>O dobrych intencjach i kiepskim designie</title>
   <link href="http://room-303.com/blog/2005/05/25/87e5ce58a75ff0b28d05ef29c0f9887a/"/>
   <updated>2005-05-25T21:34:23+00:00</updated>
   <id>http://room-303.com/blog/2005/05/25/87e5ce58a75ff0b28d05ef29c0f9887a</id>
   <content type="html">&lt;p&gt;Wielu ludziom wydaje się, że jeśli potrafią narysować &lt;q&gt;fajny&lt;/q&gt; splash albo zbudować dynamiczne menu w &lt;abbr title=&quot;JavaScript&quot;&gt;JS&lt;/abbr&gt;, to są guru webdesignu. Błąd. Design to także projektowanie struktury dokumentu, semantyczne opisywanie danych, bo to właśnie dane stanowią podstawową część serwisu, a nie grafika i layout, przynajmniej w teorii.&lt;/p&gt;

&lt;p&gt;&lt;abbr title=&quot;Extensible HyperText Markup Language&quot;&gt;XHTML&lt;/abbr&gt; rozpoczął wielką rewolucję w dziedzinie aplikacji i serwisów webowych. Z jednej strony wniósł wiele dobrego, bo ludzie zaczęli interesować się składnią, a nie tylko wyglądem stron. Z drugiej zaś strony zmienił stare złe nawyki w jeszcze gorsze nowe. Dla sporej liczby osób &lt;q&gt;poprawna&lt;/q&gt; konstrukcja serwisu to ikonka &lt;a href=&quot;http://validator.w3.org/&quot;&gt;walidatora&lt;/a&gt; u dołu strony. Jest to wierutną bzdurą, bo walidacja z założenia jest narzędziem, a nie celem samym w sobie. Ma pomóc w odnajdywaniu błędów składniowych w serwisie, a nie definiować składnię jako taką. Jeśli zamianę tabeli na setkę absolutnie pozycjonowanych bądź precyzyjnie floatowanych &lt;code&gt;div&lt;/code&gt;ów można nazwać celem samym w sobie, to dla mnie to jest sport, a nie webdevelopment. &lt;code&gt;div&lt;/code&gt;, podobnie jak &lt;code&gt;span&lt;/code&gt; jest elementem przezroczystym z punktu widzenia semantycznego. Syntaktycznie jest jak najbardziej poprawny i walidator nie powie o nim złego słowa, ale z punktu widzenia struktury dokumentu nie niesie ze sobą absolutnie żadnego znaczenia.&lt;/p&gt;

&lt;p&gt;&lt;q&gt;I co z tego?&lt;/q&gt; - ktoś zapyta. Choćby to, że strona nadaje się do oglądania tylko tak długo, jak długo skojarzony jest z nią arkusz &lt;abbr title=&quot;Cascading Style Sheet&quot;&gt;CSS&lt;/abbr&gt;. Proponuję obejrzeć wynik swojej pracy w przeglądarce tekstowej. &lt;q&gt;Nikt nie używa przeglądarek tekstowych!&lt;/q&gt; Używa. Najlepszym przykładem jest wyszukiwarka &lt;a href=&quot;http://google.pl/&quot;&gt;Google&lt;/a&gt;. Roboty sieciowe i ich automatyka nie mają oczu, nie docenią wspaniale rozplanowanych boksów, idealnie wykadrowanego zdjęcia w tle, nie zwrócą uwagi na wyróżnienie tytułów za pomocą zgrabnych ikonek. Zobaczą długi listing tekstu, który po obraniu z wszelakiej maści &lt;code&gt;div&lt;/code&gt;ów posiada tyle informacji o strukturze, co dokument z notatnika.&lt;/p&gt;

&lt;p&gt;Skutki? Niska pozycja w wyszukiwarkach, a na tym chyba wszystkim zależy najbardziej. Żyjemy w czasach, kiedy komputer stał się dla wielu ludzi podstawowym narzędziem pracy. Potrafią efektywnie wyszukiwać interesujące ich informacje w sieci. Pod jednym warunkiem, że informacje te chcą dać się znaleźć. Nie oszukujmy się, możesz wydrukować setki ulotek, rozesłać ogłoszenia, wywiesić plakaty. Większość odwiedzających trafi na twoje strony za pośrednictwem wyszukiwarek i odnośników z innych serwisów. Stąd potrzeba semantycznego opisu dokumentu, stosowania różnych poziomów nagłówków, opisywania paragrafów tekstu, walidacji kodu.&lt;/p&gt;

&lt;p&gt;Druga po &lt;em&gt;divitis&lt;/em&gt; ciężka choroba współczesnego internetu to &lt;em&gt;classitis&lt;/em&gt;, jak żartobliwie określa się prewencyjne &lt;q&gt;uklasowienie&lt;/q&gt; każdego możliwego elementu na stronie. Klasy z definicji są kaskadowe, co oznacza dziedziczenie i propagację. Trzeba o tym pamiętać, żeby więcej nie tworzyć kwiatków w stylu:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&amp;lt;img class=&quot;img_no_frame&quot; src=&quot;...&quot; alt=&quot;&quot; /&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;A zapewniam, że jest to przykład z życia wzięty. Jeśli większość elementów danego typu ma na stronie te same cechy, to należy je zdefiniować jako podstawowe cechy danego elementu, a klasami opisywać jedynie wyjątki:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;img
{
	border: 0;
}
.miniaturka
{
	border: 1px solid #f00;
}&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Klasy posiadają też selektory, które służą do kontekstowego wybierania elementów, do których odnoszą się reguły CSS. Stąd zamiast pisać:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&amp;lt;div id=&quot;menu&quot;&amp;gt;
	&amp;lt;a class=&quot;menu_link&quot; href=&quot;...&quot;&amp;gt;strona 1&amp;lt;/a&amp;gt; |
	&amp;lt;a class=&quot;menu_link&quot; href=&quot;...&quot;&amp;gt;strona 2&amp;lt;/a&amp;gt; |
	&amp;lt;a class=&quot;menu_link&quot; href=&quot;...&quot;&amp;gt;strona 3&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;pre&gt;#menu
{
	...
}
.menu_link
{
	color: #00f;
}&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Lepiej napisać:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&amp;lt;div id=&quot;menu&quot;&amp;gt;
	&amp;lt;a href=&quot;...&quot;&amp;gt;strona 1&amp;lt;/a&amp;gt; |
	&amp;lt;a href=&quot;...&quot;&amp;gt;strona 2&amp;lt;/a&amp;gt; |
	&amp;lt;a href=&quot;...&quot;&amp;gt;strona 3&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;pre&gt;#menu
{
	...
}
#menu a
{
	color: #00f;
}&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Od razu robi się prościej i przejrzyściej. Należy tylko pamiętać o tym, że w kodzie jednego dokumentu nie mają prawa znaleźć się dwa elementy o takiej samej wartości atrybutu &lt;code&gt;id&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Kolejna sprawa odnosi się do nazewnictwa klas. Grzechem powszednim jest nazywanie klas &lt;q&gt;white_11&lt;/q&gt;, &lt;q&gt;td_top_red&lt;/q&gt;, czy &lt;q&gt;red_underline&lt;/q&gt;. Wiąże się to z podejściem do kodu z perspektywy programów &lt;abbr title=&quot;What You See Is What You Get&quot;&gt;WYSIWYG&lt;/abbr&gt;, gdzie część prezentacyjna (wygląd) wymusza część strukturalną (kod). Powinno być dokładnie na odwrót, wygląd powinien być tylko dodatkiem do struktury, a klasy styli powinny mieć nazwy funkcjonalne. Jeśli postanowisz zmienić layout strony, klasa &lt;q&gt;godzina_wyslania_posta&lt;/q&gt; pozostanie godziną wysłania posta, natomiast &lt;q&gt;white_11&lt;/q&gt; może wyglądać nieco głupio, kiedy w rzeczywistości napisy będą miały czcionkę rozmiaru 25px i staną się czerwone.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>HTML i tag <code>&lt;fixme&gt;</code></title>
   <link href="http://room-303.com/blog/2005/05/25/c3c357fa1da4abea882bc33c90e82286/"/>
   <updated>2005-05-25T17:53:01+00:00</updated>
   <id>http://room-303.com/blog/2005/05/25/c3c357fa1da4abea882bc33c90e82286</id>
   <content type="html">&lt;p&gt;Jeśli pracujesz w większym zespole i jesteś programistą albo nad szablonami &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt; pracuje więcej niż jedna osoba, prawdopodobnie często stajesz przed problemem zasygnalizowania, że trzeba zmienić coś, co nie leży w twoich kompetencjach albo najzwyczajniej w świecie nie masz na to czasu.&lt;/p&gt;

&lt;p&gt;Popularnym rozwiązaniem jest zwykły komentarz w stylu C/C++, który ma przypominać o konieczności naniesienia poprawek przed oddaniem serwisu klientowi. Czy poniższy kod wygląda znajomo?&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&amp;lt;!-- #FIXME: IE needs special treating here,
	padding is wrong --&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Zaletą jest możliwość łatwego wychwycenia wszystkich pozostałych problemów za pomocą zwykłego wywołania polecenia &lt;code&gt;grep&lt;/code&gt; na katalogu z szablonami. Problem pojawia się w sytuacji, kiedy o kometarzach zapomnisz i, spiesząc się z oddaniem serwisu, pozostawisz je bez zmian. Pomijając fakt kompromitacji przed ludźmi oglądającymi twój kod (z premedytacją nie usunąłeś usterki, o której musiałeś przecież wiedzieć), istnieje ryzyko, że część użytkowników będzie miała problemy z poruszaniem się po witrynie (w końcu coś nie zostało poprawione).&lt;/p&gt;

&lt;p&gt;Rozwiązanie? Semantycznie opisać takie miejsca za pomocą tagów &lt;code&gt;&amp;lt;fixme&amp;gt;&lt;/code&gt;. Przykład?&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;&amp;lt;p&amp;gt;Lorem ipsum baby &amp;lt;fixme&amp;gt;wymusić
	na kliencie podesłanie tekstu
	powitalnego&amp;lt;/fixme&amp;gt;.&amp;lt;/p&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Dobrze byłoby też, żeby rzeczy do zrobienia wyróżniały się jakoś w tekście, w tym celu deklarujemy dwie dodatkowe regułki w &lt;abbr title=&quot;Cascading Style Sheets&quot;&gt;CSS&lt;/abbr&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;fixme
{
	font-weight: normal;
}
fixme:before
{
	content: &quot;#FIXME: &quot;;
	font-weight: bold;
}&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Efekt wygląda tak:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Lorem ipsum baby &lt;strong&gt;#FIXME:&lt;/strong&gt; wymusić na kliencie podesłanie tekstu powitalnego.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Pewnie zastanawiasz się teraz, co na to powie &lt;a href=&quot;http://validator.w3.org/&quot;&gt;validator&lt;/a&gt;? Oczywiście zaprotestuje, że nic nie wie o istnieniu elementu &lt;code&gt;fixme&lt;/code&gt;. Nic dziwnego, bo wymyśliłem go dziś rano. W protestach validatora leży cały urok naszego nowego elementu - praktycznie każdy serwis zanim trafi do klienta, poddawany jest testom walidacyjnym. Już nigdy nie złapiesz się za głowę oglądając własny kod źródłowy i znajdując tam tuzin porzuconych i zapomnianych komentarzy.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Zemsta Lucasa</title>
   <link href="http://room-303.com/blog/2005/05/22/d26bcd0972aba12e5451c2d2929b8d24/"/>
   <updated>2005-05-22T20:26:38+00:00</updated>
   <id>http://room-303.com/blog/2005/05/22/d26bcd0972aba12e5451c2d2929b8d24</id>
   <content type="html">&lt;p&gt;Nie dało się tego uniknąć. Świadom porażki &lt;em&gt;Epizodu Pierwszego&lt;/em&gt; i &lt;em&gt;Ataku Klonów&lt;/em&gt;, mimo wszystko, wybrałem się do kina z &lt;a href=&quot;http://monochrome.pl/&quot;&gt;Jarvisem&lt;/a&gt; na &lt;em&gt;Zemstę Sithów&lt;/em&gt;. Teraz już wiem, czemu niektórzy w mowie potocznej odnoszą się do tego filmu per &lt;q&gt;zemsta shitów&lt;/q&gt;. Pan Lucas nie zawiódł swoich nowych, nastoletnich fanów sagi i zgotował im kolejny odcinek teleranka.&lt;/p&gt;

&lt;p&gt;Recenzja będzie odrobinę chaotyczna, film jest tak wielopłaszczyznowy, że trudno analizować go chronologicznie, zacznę może od metafory. Na statku Hrabiego Dooku Anakin (a może Ani? &lt;q&gt;Ale czy Ani jest cały?&lt;/q&gt;) musiał wycinać dziurę w suficie windy, bo nie było klapy. W kinie klapa była, film jest tragiczny.&lt;/p&gt;

&lt;p&gt;Stary George nie oszczędzał na efektach specjalnych. Od pierwszej minuty filmu do samych napisów końcowych towarzyszy nam w 90% grafika komputerowa. Pozostałe 10% to coś pomiędzy &lt;em&gt;Tajemnicami piasków&lt;/em&gt; a &lt;em&gt;Niewolnicą Izaurą&lt;/em&gt; - kino familijne o nieprzeciętnej mimice i ogólnie grze aktorskiej. Na pochwałę zasługują przede wszystkim bardzo sugestywne monologi, pełne bólu i cierpnienia (ze strony widzów głównie) - np. Obi-Wan Cannot-Be, który ogląda hologram Anakina mordującego dzieci w Świątyni Jedi. Minę ma niczym typowy polski widz, doświadczający właśnie reklam na Polsacie, toteż po chwili (około 3 sekundy później) uznaje &lt;q&gt;nie mogę już na to patrzeć&lt;/q&gt; i sprzęt wyłącza. Sam przyszły Vader scenę tę przeżył znacznie bardziej dramatycznie, pojechał zobaczyć się z żoną i już samo spojrzenie w jego oczy powiedziało jej wszystko o tej straszliwej zbrodni: (cytując kumpla Jarvisa) &lt;q&gt;kochanie, wybiłem do nogi lokalne przedszkole, będziemy musieli zapisać dzieciaka do jakiegoś innego&lt;/q&gt;.&lt;/p&gt;

&lt;p&gt;Temat masowych mordów nie jest w Polsce zbyt lekkim do dyskusji, toteż zajmijmy się czymś przyjemnym, np. &lt;q&gt;droidami bzykaczami&lt;/q&gt;, czyż sama nazwa nie jest wspaniała? Takie zwykłe kosmiczne kleszcze, a jak wiadomo na kleszcze najskuteczniejszą bronią jest R2. Nasz śmietnikopodobny kolega zyskał kilka nowych umiejętności, niestety zatracił je już w 19 lat później, kiedy to toczy się akcja &lt;em&gt;Gwiezdnych Wojen&lt;/em&gt;. Jakież to zdolności? Przede wszystkim uniezależnił się od dźwigów dokowych. Bez problemu sam wskakuje i wyskakuje ze swojego slotu w myśliwcach. Dorósł też płciowo, o czym upewnił nas pokazując dwóm strażnikom siusiaka i oblewając ich olejem. Po co zapytacie? Otóż planował właśnie podpalic ich za pomocą swoich silników odrzutowych. Taka mała konserwa, a funkcji ma jak szwajcarski scyzoryk, pomyśleć, że inne astrodroidy większość swego &lt;q&gt;życia&lt;/q&gt; przegniły w statkach kosmicznych.&lt;/p&gt;

&lt;p&gt;Również nasz stary znajomy, Yoda, nie próżnował od czasu &lt;em&gt;Ataku&lt;/em&gt;. Po powrocie z sanatorium w Ciechocinku, był nie do poznania. Mało kto wie, że w uzdrowisku dochrapał się pozycji rozgrywającego w lokalnej drużynie koszykarskiej. Upust swym talentom dał w scenie rodem z polskich stadionów, kiedy to w sali obrad Senatu Republiki zły Pan Sith wyrywał ławeczki z trybun i ciskał nimi w tego biednego, zgrzybiałego, poruszającego się o lasce, trzymetrowymi susami, staruszka.&lt;/p&gt;

&lt;p&gt;W tym samym czasie, nasz dzielny druh, Ani z Zielonego Wzgórza, toczył bój na śmierć i życie ze swym uprzednim mentorem, Kenobim. Było gorąco! Niemal żałowałem, że na seans nie przybyłem w okularach przeciwsłonecznych. Lawa tu, lawa tam, płomienie na pierwszym planie. Wszystko się wali, syczy i pali. Pan zła i ciemności, zaślepiony gniewem, nie zauważył nawet iż stracił rękę i dwie nogi. Nie robiło to wielkiej różnicy, jako że pozostała ręka była metalową pamiątką po spotkaniu z Dooku. Nie robiło różnicy też o tyle, że chwilę później spłonął żywcem (jako, że Tyskie do Lucasa na czas nie dojechało).&lt;/p&gt;

&lt;p&gt;Czemu był zły, zapytacie? Podobno przeżywał wewnętrzną walkę uczuć, ponoć targały nim sprzeczne wartości, że to niby wybierał między życiem żony a drogą światłości? Bzdura, biedny Ani nie był kochany w domu i, jak każdy nastolatek, postanowił się zbuntować. &lt;q&gt;Mamo, a oni mi nie dali tytułu mistrza!&lt;/q&gt; - &lt;q&gt;Przyłącz się do Ciemnej Strony!&lt;/q&gt; - &lt;q&gt;Nie!&lt;/q&gt; - &lt;q&gt;No przyłącz się, będziesz miał dłuższego.&lt;/q&gt; - &lt;q&gt;Nie!&lt;/q&gt; - &lt;q&gt;No chodź...&lt;/q&gt; - &lt;q&gt;No dobra.&lt;/q&gt;. Ostateczną decyzję podjął jednak podczas pełnej grozy i napięcia sceny &lt;q&gt;To on jest zdrajcą!&lt;/q&gt; - &lt;q&gt;Nie, to on!&lt;/q&gt; - &lt;q&gt;Nie to on.&lt;/q&gt; - &lt;q&gt;On.&lt;/q&gt; - &lt;q&gt;To on, na syfa dziesięć.&lt;/q&gt; - &lt;q&gt;Pobite gary... aaaaaaa!&lt;/q&gt; (i tu defenestrował). Wróćmy jednak do naszego konającego, przypalonego, beznogiego i bezrękiego kolegi.&lt;/p&gt;

&lt;p&gt;Typowy Kowalski miałby trudności z odnalezieniem się w podobnej sytuacji. Nie co dzień bowiem człowiek budzi się z takim kacem, a tu ni ręki ni nogi, a na dodatek jeziora lawy ogniste. Dzielny, świeżo upieczony (dosłownie) Sith, nie poddał się jednak i walczył do końca, jedyną pozostałą mu kończyną jął czołgać się w stronę wyjścia, niczym czołga się do wyjścia widz pod koniec drugiej godziny tego filmu. Na szczęście Imperator wpadł w porę i zabrał go do siebie na kurację. A był to zabieg długi i niezwykle skomplikowany. W ciągu przeszło pięciu minut, cztery automaty - specjalnie wypożyczone przez Sithów z zakładów montażowych Forda - przykręciły Vaderowi nowe nóżki, które to przypadkiem właśnie w jego rozmiarze ostały się na magazynie. Do tego nowa rączka i wdzianko od Versace. Ach, jeszcze kask na magnesiki i voila. &lt;em&gt;Moon power make-up&lt;/em&gt;, chciałoby się rzec. Jeszcze tylko ryk rannego bawołu, postrzelonego z procy wykałaczką, na wieść o śmierci połowicy i można opanować galaktykę.&lt;/p&gt;

&lt;p&gt;Ciekawa bardzo jest również scena na Kashyyyk. Nikt właściwie nie wie, po co ona jest, ale to właśnie nastrój tajemniczości przesądził o sukcesie oryginalnej trylogii. Ah, zapomniałbym że tak się miło złożyło, że spośród milionów Wookiee, akurat Chewbacca mieszkał przy samym lotnisku, cóż za zbieg okoliczności.&lt;/p&gt;

&lt;p&gt;Żeby do końca nie narzekać, wspomnę jeszcze o przepięknych scenach walki, których nagrania dłużyły się do tego stopnia, że kamerzysta przez większość czasu starał się zobaczyć, która jest godzina, przybliżając obraz nadgarstka raz jednego, raz drugiego z bohaterów starcia.&lt;/p&gt;

&lt;p&gt;Jeśli jeszcze ktoś nie zauważył, to film mi się nie podobał. Szkoda wydawać 15 PLN na bilet do kina. Chyba, że ktoś jest fanem serii i, jak ja, musi się o tym przekonać na własnej skórze. Nie polecam, chyba że TVP1 puści go kiedyś za darmo w ramach &lt;q&gt;kina familijnego&lt;/q&gt; po &lt;em&gt;Teleranku&lt;/em&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>O autorze</title>
   <link href="http://room-303.com/blog/2005/05/17/f2d683ba32f4aa49de77b441918bb1c3/"/>
   <updated>2005-05-17T23:09:31+00:00</updated>
   <id>http://room-303.com/blog/2005/05/17/f2d683ba32f4aa49de77b441918bb1c3</id>
   <content type="html">&lt;p&gt;Może to późno, żeby się przedstawiać, bo tego jogga prowadzę już ponad rok. Nie wiem, czy kogokolwiek to interesuje, ale sam lubię czytać takie notki. Jeśli się kogoś śledzi (online, naturalnie) przez dłuższy czas, to czasem miło zdać sobie sprawę, że za kodem &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt; stoi też człowiek.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://patrys.room-303.com/images/photos/photo-sepia.jpg&quot; alt=&quot;Zdjęcie Patrysa.&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Oto więc i podstawowy zestaw danych:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;oficjalnie: Patryk Zawadzki&lt;/li&gt;
&lt;li&gt;nieoficjalnie: Patrys&lt;/li&gt;
&lt;li&gt;urodzony 13. listopada 1982&lt;/li&gt;
&lt;li&gt;wzrost: 183 cm&lt;/li&gt;
&lt;li&gt;waga: niewiele ponad 70 kg&lt;/li&gt;
&lt;li&gt;aktualnie pracuję jako webdeveloper dla &lt;a href=&quot;http://icenter.pl/&quot;&gt;Internet Center Polska&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;od wojska ratuje mnie &lt;a href=&quot;http://www.wsiz.wroc.pl/&quot;&gt;WSIZ &lt;q&gt;Copernicus&lt;/q&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;z zamiłowania &lt;a href=&quot;http://ofz.prv.pl/&quot;&gt;alkoholik&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;stanu wolnego&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Czemu nie ukrywam nazwiska? Cóż to za ukrywanie, kiedy &lt;a href=&quot;http://cvs.pld-linux.org/cgi-bin/cvsweb/CVSROOT/users&quot;&gt;sprawdzić może mnie każdy&lt;/a&gt;. Nieformalnie nikt nie mówi do mnie ani po imieniu, ani po nazwisku. Patrys (bez kreseczki nad &lt;q&gt;s&lt;/q&gt;). Tak nazywają mnie znajomi, współpracownicy i rodzina, tak się też przedstawiam.&lt;/p&gt;

&lt;p&gt;Komputerami zajmuję się od dziecka. Pierwsze próby programowania swojego Atari przeprowadzałem jeszcze przed ukończeniem nauczania początkowego. Poważniej programowaniem zająłem się już na Amidze 500. Ponad dziesięć lat temu okiełznałem także PC.&lt;/p&gt;

&lt;p&gt;Jestem geekiem. Uwielbiam komputery, potrafię z nimi rozmawiać i zmusić je do wykonywania różnych sztuczek. Stąd też moje zainteresowanie programowaniem i Linuksem.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://patrys.room-303.com/images/photos/pld-developer.jpg&quot; alt=&quot;Jestem deweloperem PLD Linux Distribution.&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Jestem &lt;a href=&quot;http://cia.navi.cx/stats/author/patrys&quot;&gt;deweloperem&lt;/a&gt; na rzecz &lt;a href=&quot;http://pld-linux.org/&quot; title=&quot;PLD Linux Distribution&quot;&gt;PLD&lt;/a&gt;. Zaczęło się w styczniu 2004. Chętnie odpowiem na pytania dotyczące tej dystrybucji. Wcześniej używałem Slackware i Debiana, jednak ten pierwszy jest nierealny w utrzymaniu na serwerze, a ten drugi przegrywa z kretesem w starciu z &lt;a href=&quot;http://poldek.pld.org.pl/&quot;&gt;poldkiem&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Używam &lt;a href=&quot;http://gnomedesktop.org/&quot;&gt;Gnome&lt;/a&gt;. Do przeglądania &lt;abbr title=&quot;World Wide Web&quot;&gt;WWW&lt;/abbr&gt; wykorzystuję &lt;a href=&quot;http://firefox.pl/&quot;&gt;Firefoksa&lt;/a&gt;. Pocztę czytam w &lt;a href=&quot;http://www.gnome.org/projects/evolution/&quot;&gt;Evolution&lt;/a&gt; i tam też zarządzam swoim kalendarzem. Książką adresową nie muszę zarządzać, bo kontaktów nie ma w niej zbyt wiele.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://patrys.room-303.com/images/photos/photo-beer.jpg&quot; alt=&quot;Uwielbiam piwo.&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Prywatnie jestem aspołeczny. Nie lubię ludzi. Najlepiej czuję się w nocy, wtedy wylegamy na ulicę, raczyć się piwem na ławce. Nie boję się innych, jestem antisocial. Mimo to, mam na swoim rosterze (w &lt;del&gt;&lt;a href=&quot;http://psi.affinix.com/&quot;&gt;Psi&lt;/a&gt;&lt;/del&gt; &lt;ins&gt;&lt;a href=&quot;http://gajim.org/&quot;&gt;Gajimie&lt;/a&gt;&lt;/ins&gt;) kilkaset kontaktów. Drugim wyjątkiem są koncerty i imprezy (w &lt;a href=&quot;http://www.liverpool.wroclaw.pl/&quot;&gt;Liverpoolu&lt;/a&gt;), ale o tym później.&lt;/p&gt;

&lt;p&gt;W związkach jestem tragiczny. Nie kupuję kwiatów, nie prawię komplementów. Jestem nudny, jak flaki z olejem. W końcu jestem geekiem.&lt;/p&gt;

&lt;p&gt;Nie umiem tańczyć. Moje ruchy lepsze są tylko nieco od mężczyzny rażonego paralizatorem. Nie lubię tańczyć. Mimo to, są osoby z którymi przetańczyć mogę całą noc, z ogromną radością. Zwłaszcza w okolicznościach oferowanych przez wspomniany Liverpool.&lt;/p&gt;

&lt;p&gt;Jestem chaotyczny i bardzo sobie chaos cenię. Nie planuję rzeczy z dużym wyprzedzeniem, większość czasu zagospodarowuję spontanicznie. Na piwo umawiam się na ogół pięć minut przed wyjściem z domu. Zapytany, co będę robił jutro, często nie potrafię odpowiedzieć. Czasem tak skonstruowane zarządzanie czasem jest przyczyną spóźnienia.&lt;/p&gt;

&lt;p&gt;Na dokładkę palę, piję, a czasem nawet przeklinam. Tak właściwie, to czasem tego nie robię. Więcej grzechów nie pamiętam...&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Usability w PLD</title>
   <link href="http://room-303.com/blog/2005/05/13/32ae71a263ad134b962dd19f1be40d1e/"/>
   <updated>2005-05-13T12:13:41+00:00</updated>
   <id>http://room-303.com/blog/2005/05/13/32ae71a263ad134b962dd19f1be40d1e</id>
   <content type="html">&lt;p&gt;Ponieważ używam i instaluję PLD na desktopach, zależy mi na jego używalności dla zwykłego użytkownika. Niestety, w PLD domyślnie dołączane są pliki &lt;code&gt;.desktop&lt;/code&gt; dla aplikacji przeznaczonych stricte dla konsoli. Dlatego w menu pojawiają się śmieci typu bc, dc, elinks, ftp, lftp, links, lynx, mc, czy ncftp. Dla mnie (i dla wielu użytkowników/deweloperów) nie mają żadnego zastosowania. Kiedy chcę z nich skorzystać, włączam sobie terminal.&lt;/p&gt;

&lt;p&gt;Radą na to jest opcja ukrywania ich w menu. Dlatego z pakietu &lt;code&gt;gnome-menus&lt;/code&gt; wydzieliłem podpakiet &lt;code&gt;gnome-menus-filter-default&lt;/code&gt;, zachowujący dotychczasowy układ menu i utworzyłem alternatywny, &lt;code&gt;gnome-menus-filter-noconsole&lt;/code&gt;. Ten ostatni usuwa z menu wszystkie programy oznaczone jako &lt;code&gt;ConsoleOnly&lt;/code&gt;. Tu pojawia się kolejny problem, większość wcale nie jest w ten sposób opisana. Do poprawki pójdzie kilka albo kilkanaście speców.&lt;/p&gt;

&lt;p&gt;Następna sprawa to domyślny styl Gnome w PLD, który przypomina bardziej czasy 1.4 niż obecnego 2.10. Jest paskudny i nie nadaje się specjalnie do używania. Jeśli znajdę chwilę, to będę chciał zmienić go na jakiś inny. W rozmowie z &lt;a href=&quot;http://aredridel.livejournal.com/&quot;&gt;Aredridel&lt;/a&gt; ustaliliśmy, że warto byłoby zainteresować się nowym ClearLooks albo Milk 2.0.&lt;/p&gt;

&lt;p&gt;Na koniec został problem metapakietów. PLD powinno mieć własne, osobne repozytorium metapakietów. Co prawda istnieje spec dla &lt;code&gt;metapackage-gnome&lt;/code&gt; ale raz, że jest nieaktualny, a dwa - zawiera programy spoza zestawu Gnome, co nie powinno mieć miejsca. Jeśli nie uda się przeforsować tego do samej dystrybucji, to być może razem z Aredridel poprowadzimy własne repozytorium takich plików. Miejsca nie potrzeba dużo, a życie ułatwia znacznie, zwłaszcza w przypadku Gnome, KDE czy teTeXa.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Kubrick dla Joggera</title>
   <link href="http://room-303.com/blog/2005/05/12/cb28e79a808d26b3f3291b723b89b0a7/"/>
   <updated>2005-05-12T00:14:40+00:00</updated>
   <id>http://room-303.com/blog/2005/05/12/cb28e79a808d26b3f3291b723b89b0a7</id>
   <content type="html">&lt;p&gt;Dziś, w zasadzie z nudów (człowiek nie ma co robić o wpół do drugiej w nocy), podjąłem trud przeportowania oryginalnego &lt;a href=&quot;http://binarybonsai.com/kubrick/&quot;&gt;Kubricka&lt;/a&gt; (którego własnej wersji używam na tym blogu) na silnik &lt;a href=&quot;http://jogger.pl&quot;&gt;Joggera&lt;/a&gt;. Przyczyną było uznanie przeze mnie, że potrzebny jest nowy styl domyślny, atrakcyjniejszy dla oka. Póki co, do pobrania dostępny jest z &lt;a href=&quot;http://wirusy.room-303.com/Jogger/Kubrick/&quot;&gt;z mojej strony&lt;/a&gt;, a w działaniu zobaczyć można go na &lt;a href=&quot;http://patrys-dev.jogger.pl/&quot;&gt;tymczasowym blogu&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Jeśli komuś się spodoba, to jest (zgodnie z licencją Kubricka) wolnodostępny. Możecie też namówić &lt;a href=&quot;http://sparrow.jogger.pl&quot;&gt;Sparrowa&lt;/a&gt;, żeby włączył go jako część Joggera. Czekam na komentarze i mam nadzieję, że moja praca na coś się przyda.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Propozycja nie do odrzucenia</title>
   <link href="http://room-303.com/blog/2005/05/10/0c6ebc071ad9a1b6a6f4c6b0d49a9de4/"/>
   <updated>2005-05-10T22:41:50+00:00</updated>
   <id>http://room-303.com/blog/2005/05/10/0c6ebc071ad9a1b6a6f4c6b0d49a9de4</id>
   <content type="html">&lt;p&gt;Ostatnio zostałem poproszony przez Bad Kitty (a.k.a. Puma) o reinstalację jej Windowsa. Zwykły, prosty Windows 98 SE. Komputer to Celeron 1.2 z 256 MB RAM, więc więcej nie uciągnie (sprawdzone empirycznie). W sobotę zabrałem się więc do roboty i Windows stanął. Niestety, nie miałem ze sobą płyt z Office'em.&lt;/p&gt;

&lt;p&gt;Office dowiozłem w niedzielę i, jako lokalny geek numer jeden, zostałem nominowany do jego instalacji. MS Biurowiec już przy starcie poinformował mnie, że musi zaktualizować biblioteki systemu, zanim będzie można skorzystać z dobrodziejstw Pana Spinacza, toteż pozwoliłem mu na upgrade, który to zakończył się (jak wszystko w produktach Redmont z tamtych czasów) prośbą o restart komputera.&lt;/p&gt;

&lt;p&gt;Po restarcie dowiedziałem się, że &lt;q&gt;&lt;code&gt;explorer.exe wykonał nieprawidłową operację i zostanie zakończony&lt;/code&gt;&lt;/q&gt;. To tyle z cyklu &lt;q&gt;i żyli długo i szczęśliwie&lt;/q&gt;. Kolejny restart, włożenie płytki z Office, kolejna prośba o aktualizację. &lt;q&gt;Błąd aktualizacji, wybierz opcję &lt;em&gt;napraw produkt&lt;/em&gt;&lt;/q&gt;. &lt;em&gt;Napraw produkt&lt;/em&gt;, błąd instalacji, &lt;cite&gt;system Windows musi zostać uruchomiony ponownie&lt;/cite&gt;. I tak w kółko, z tym, że Explorer wspaniałomyślnie przestał zdychać.&lt;/p&gt;

&lt;p&gt;Pojawiła sie koncepcja ponownej instalacji Windows od zera. Tutaj padła propozycja nie do odrzucenia: &lt;q&gt;&lt;cite&gt;zainstaluj mi Linuksa&lt;/cite&gt;&lt;/q&gt;. Od niedzieli stoi tam &lt;a href=&quot;http://pld-linux.org&quot;&gt;PLD&lt;/a&gt; Ac (2.0). Gnome 2.10, Metacity, Nautilus, Firefox, Totem, Beep Media Player, GnuGadu. Dodatkowo serwer SSH i VNC, dla mnie. Szybsze od Windowsa, wygląda podobnie, nie ma wirusów. Nie ma strachu, że siostra coś ściągnie, uruchomi i wszystko padnie. Co ciekawe, pod Linuksem ten sam monitor pracuje bez problemu w wyższej rozdzielczości niż potrafił dać mu Windows (tak, umiem skonfigurować monitor pod Windowsem).&lt;/p&gt;

&lt;p&gt;Za system odpowiadam ja. Dziś okazało się, że w niedzielę zapomniałem dokonfigurować polską klawiaturę w Iksach. Z domu wykonałem szybkie logowanie na SSH, zmieniłem jedną linijkę w konfiguracji, poprosiłem o wylogowanie i zdalnie zrestartowałem GDM. Cud, miód i orzeszki, a do tego nie szczypie w oczy.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Bankowanie na wesoło</title>
   <link href="http://room-303.com/blog/2005/05/10/657561be258833072b485aa0e3df0c73/"/>
   <updated>2005-05-10T21:03:20+00:00</updated>
   <id>http://room-303.com/blog/2005/05/10/657561be258833072b485aa0e3df0c73</id>
   <content type="html">&lt;p&gt;Dni temu kilkanaście założyłem nowe konto &lt;abbr title=&quot;Rachunek Oszczędnościowo-Rozliczeniowy&quot;&gt;ROR&lt;/abbr&gt; w &lt;a href=&quot;http://www.bzwbk.pl/&quot;&gt;Banku Zachodnim WBK&lt;/a&gt;. Z poprzedniego, w &lt;a href=&quot;http://www.mbank.com.pl/&quot;&gt;mBanku&lt;/a&gt;, z różnych przyczyn musiałem zrezygnować.&lt;/p&gt;

&lt;p&gt;Jak to z bankami bywa, na kartę płatniczą przyszło mi trochę poczekać, ale już w tydzień po podpisaniu umowy przyszła do mnie pocztą koperta z kartą, a za nią koperta z PINem do tejże. Pochwyciłem ów kolejny kawałek plastiku w swój portfel i udałem się, zgodnie z zaleceniami, do najbliższego bankomatu, celem aktywowania karty i zmiany swojego kodu. Problemów nie stwierdzono, wobec czego karta została podpisana i trafiła do kieszeni, czekając na swój moment.&lt;/p&gt;

&lt;p&gt;Minęło dni kilka, kiedy to wyczerpałem swoje doczesne fundusze gotówkowe i życie (a raczej &lt;abbr title=&quot;Zarząd Dróg i Komunikacji&quot;&gt;ZDiK&lt;/abbr&gt;) zmusiło mnie do porozmawiania ze ścianą. Szybka kontrola w domu pokazała czterocyfrowy jeszcze stan konta, pewnym krokiem ruszyłem więc po to, co moje. Tutaj muszę pochwalić bankomaty WBK, mają najwygodniejsze menu ze wszystkich obecnych w Polsce sieci bankomatowych. Szybko wybrałem więc &lt;em&gt;Wypłata&lt;/em&gt; &amp;raquo; &lt;em&gt;100 PLN&lt;/em&gt; &amp;raquo; &lt;em&gt;Bez wydruku&lt;/em&gt;. Jeszcze tylko &lt;q&gt;&lt;em&gt;proszę czekać ...&lt;/em&gt;&lt;/q&gt; i... nic.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Nie można zakończyć operacji: brak autoryzacji.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;- zawyrokowała ponuro, acz na ładnym tle, maszyna. Drugi bankomat, to samo. Trzeci - nic. Zadzwoniłem więc do banku na infolinię, gdzie przemiła pani wypytała mnie o szczegóły zajścia, a następnie sprawdziła moją historię. Wydało jej się to dziwne, wobec czego poprosiła mnie o cierpliwość i zadzwoniła do informatyka. Ten zdaje się pomógł niewiele, bo tylko rozłożył bezradnie ręcę i zażądał więcej czasu. Polecono mi zaczekać do dnia kolejnego, kiedy to o godzinie 12:00 ktoś się ze mną skontaktuje.&lt;/p&gt;

&lt;p&gt;Tak też się stało, dziś w samo południe ta sama pani zadzwoniła do mnie. Sądząc po jej głosie, to jej zdziwienie nie ustępowało mojemu, kiedy to powiedziała mi, że zaszła jakaś pomyłka i wydana mi karta... jest przypisana do cudzego rachunku, na którym akurat saldo jest zerowe, wobec czego nie mogę nic wypłacić.&lt;/p&gt;

&lt;p&gt;Kartę pewnie jutro mi wymienią (ewentualnie wyślą mi nową), pieniądze w środku nocy pożyczył mi ojciec, rodzi się tylko jedno pytanie. Skąd mój pech? Czemu musiałem trafić akurat na puste konto? ;)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Oddam projekt w dobre ręce</title>
   <link href="http://room-303.com/blog/2005/05/07/1075e5a2411a92b6d86fcac14f8fe7e7/"/>
   <updated>2005-05-07T12:06:23+00:00</updated>
   <id>http://room-303.com/blog/2005/05/07/1075e5a2411a92b6d86fcac14f8fe7e7</id>
   <content type="html">&lt;p&gt;Niegdyś bardzo blisko związany z &lt;a href=&quot;http://liero.org.pl&quot;&gt;Ligą Liero&lt;/a&gt;, popełniłem klona tej przewspaniałej gry, który zwał się &lt;a href=&quot;http://d11clan.net/viewdownloads.php?Type=13&quot;&gt;Wurmz!&lt;/a&gt;. Gra cieszyła się sporą popularnością, niestety jej kod nie nadawał się do niczego z paru względów - w połowie napisany był w C, w połowie w C++ (gra w międzyczasie przeszła na C++, ale nie miałem czasu przepisać całości kodu), projekt prowadziłem w strzępach wolnego czasu, więc każda funkcja była zbiorem brzydkich hacków (z braku wolnego liczył się czas realizacji, a nie sposób). Projekt został w końcu zastąpiony przez &lt;a href=&quot;http://gusanos.sourceforge.net/&quot;&gt;Gusanos&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Równolegle prowadziłem projekt innego klona Liero, gry opartej na wektorach, z realistyczną fizyką i ładniejszą grafiką. To właśnie tego projektu, &lt;a href=&quot;http://lierosp.sourceforge.net/&quot;&gt;Liero Sequel Project&lt;/a&gt;, dotyczy ta notka.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://wirusy.room-303.com/lierosp/2005-05-07-lierosp.png&quot; alt=&quot;Screenshot z gry&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Projekt utknął (z braku mojego czasu) na etapie implementacji silnika. Napisałem kompletny system obsługi kolizji (realistyczna fizyka). Wygląda (moim skromnym zdaniem) &lt;a href=&quot;http://wirusy.room-303.com/lierosp/2005-05-07-lierosp-big.png&quot;&gt;całkiem nieźle&lt;/a&gt;, działa pod Windows i pod Linuksem. Współpracujący ze mną grafik (Dzięcioł / Woodpecker Studios) obiecał zaspokoić każdą zachciankę graficzną. Potrzeba jeszcze przepisać engine odpowiedzialny za particle (gracze, bronie) i napisać engine wykrywania kolizji obiekt/obiekt (obiekty mają okrągłe bounding-boksy, więc nie powinno być to trudne).&lt;/p&gt;

&lt;p&gt;Pytanie brzmi: czy są jacyś chętni?&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>mmCache na Home.pl</title>
   <link href="http://room-303.com/blog/2005/05/07/4127358c7e8807f2b52aa6db9b936553/"/>
   <updated>2005-05-07T09:13:34+00:00</updated>
   <id>http://room-303.com/blog/2005/05/07/4127358c7e8807f2b52aa6db9b936553</id>
   <content type="html">&lt;p&gt;Jeśli ktokolwiek zastanawia się nad używaniem &lt;a href=&quot;http://turck-mmcache.sourceforge.net/&quot;&gt;Turck mmCache&lt;/a&gt;, a przynajmniej jego wersji proponowanej przez &lt;a href=&quot;http://home.pl&quot;&gt;Home.pl&lt;/a&gt;, to niech lepiej zastanowi się jeszcze kilka razy.&lt;/p&gt;

&lt;p&gt;Problemy pierwszy raz pojawiły się jakieś pół roku temu, kiedy to przenosiłem serwis &lt;a href=&quot;http://teatr-capitol.pl/&quot;&gt;Teatru Muzycznego Capitol&lt;/a&gt; (ja odpowiadam tam tylko za system ekstranetowy, więc proszę mnie nie posądzać o autorstwo kodu HTML strony) na serwery Home.pl. Zwykle kod PHP szyfrujemy za pomocą &lt;a href=&quot;http://www.ioncube.com/&quot;&gt;ionCube&lt;/a&gt;, Home.pl nie udostępnia ichniego loadera, więc zmuszony byłem użyć wspieranego przez Home, darmowego mmCache.&lt;/p&gt;

&lt;p&gt;Z początku wszystko wydawało się działać, problem pojawił się dopiero drugiego dnia, kiedy to ktoś z pracowników Teatru postanowił wygenerować sobie plik PDF z planem zajęć. Skrypt zadyszał ciężko, parsknął błędem i legł w konwulsjach cyfrowego bólu w ostatnich stadiach komputerowej agonii. Innymi słowy, nie działało. Winna okazała się &lt;a href=&quot;http://www.ros.co.nz/pdf/&quot;&gt;biblioteka obsługi PDF&lt;/a&gt;, która działa doskonale, lecz tylko do momentu jej zakodowania przez mmCache.&lt;/p&gt;

&lt;p&gt;Skończyło się więc na rozkodowaniu biblioteki, która i tak jest darmowa. Nic wielkiego. Problem powrócił jednak w lutym, kiedy to pisałem kolejne moduły dla Teatru i okazało się, że jakimś cudem encoder mmCache psuje obsługę tablic. Dynamicznie generowana tablica stringów przed zakodowaniem wyglądała tak:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;array
(
	0 =&amp;gt; &quot;lorem&quot;,
	1 =&amp;gt; &quot;ipsum&quot;,
	2 =&amp;gt; &quot;dolor&quot;,
	3 =&amp;gt; &quot;sit&quot;,
	4 =&amp;gt; &quot;amet&quot;
)&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Po zakodowaniu zaś:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;array
(
	0 =&amp;gt; array
	(
		1 =&amp;gt; &quot;lorem&quot;
	),
	1 =&amp;gt; array
	(
		1 =&amp;gt; &quot;ipsum&quot;
	),
	2 =&amp;gt; array
	(
		1 =&amp;gt; &quot;dolor&quot;
	),
	3 =&amp;gt; array
	(
		1 =&amp;gt; &quot;sit&quot;
	),
	4 =&amp;gt; array
	(
		1 =&amp;gt; &quot;amet&quot;
	)
)&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Nie wiem, z czego to wynika, czy błąd leży po stronie mmCache, czy jego konkretnej konfiguracji na serwerach Home.pl. Skończyło się na przepisywaniu części kodu do postaci przewidywalnej w działaniu po potraktowaniu encoderem. Zastanówcie się więc przed używaniem tego wynalazku, tylko pamiętajcie, że ostrzegałem.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Python-DBUS do niczego</title>
   <link href="http://room-303.com/blog/2005/05/05/57e8d73b8e56102aa58fe5ac03480c5d/"/>
   <updated>2005-05-05T22:25:35+00:00</updated>
   <id>http://room-303.com/blog/2005/05/05/57e8d73b8e56102aa58fe5ac03480c5d</id>
   <content type="html">&lt;p&gt;Zachciało mi się dzisiaj wygodnego powiadamiania o poczcie. &lt;a href=&quot;http://gnome.org/projects/evolution/&quot;&gt;Evolution&lt;/a&gt; udostępnia od jakiegoś czasu powiadomienia za pomocą interfejsu &lt;a href=&quot;http://www.freedesktop.org/Software/dbus&quot;&gt;D-BUS&lt;/a&gt;, Python ma binding dla D-BUSa, czemu więc nie napisać appletu, który by słuchał tych powiadomień?&lt;/p&gt;

&lt;p&gt;Szybko przekonałem się, że łatwo nie będzie, bo Evolution nie posiada dla interfejsu powiadomień nazwy kanonicznej. Znaczy to mniej-więcej tyle, że D-BUS przydziela mu przy każdym włączeniu programu losową nazwę postaci &lt;q&gt;&lt;code&gt;:X.Y&lt;/code&gt;&lt;/q&gt; (podobnie, jak X11 numeruje swoje sesje i ekrany). Nazwa oczywiście zmienia się z każdym restartem &lt;abbr title=&quot;Evolution&quot;&gt;Evo&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;I tu pojawia się problem: binding Pythona pozwala bardzo wygodnie obsługiwać typowe przypadki użycia D-BUSa. Innymi słowy, wszystko byłoby pięknie, gdyby dało się zrobić tak:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;#!/usr/bin/python
import gtk
import dbus
import gnomeapplet
import sys

class evoNotify:
	def handleNewMail(self, int, sig, srv, pth, msg):
		self.label.set_label('new mail')
		print('test')

	def handleReadingMail(self, int, sig, srv, pth, msg):
		self.label.set_label('read mail')
		print('test')

	def __init__(self, applet):
		label = gtk.Label('test')
		self.label = label
		bus = dbus.SessionBus()
		evolution = bus.get_service(':1.0')
		ifc = evolution.get_object('/org/gnome/evolution/mail/newmail',
				'org.gnome.evolution.mail.dbus.Signal')

		applet.iface = ifc

		applet.iface.connect_to_signal('MessageReading',
				self.handleReadingMail)
		
		applet.iface.connect_to_signal('NewMail',
				self.handleNewMail)
	
		applet.add(self.label)

		applet.show_all()

def appletFactory(applet, iid):
	evoNotify(applet)
	return gtk.TRUE

gnomeapplet.bonobo_factory('OAFIID:GNOME_evoMailApplet_Factory',
		gnomeapplet.Applet.__gtype__,
		'evoMailApplet', '0.1', appletFactory)

gtk.main()&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Ale nie można, bo niby skąd znać wcześniej unikalny numerek serwisu przyznany przez demona? W C można to prosto obejść, tam można posłużyć się &lt;code&gt;add_match&lt;/code&gt; i wyłapywać wiadomości po filtrach, niezależnie od nadawców (mam wszelkie powody, żeby założyć, że właśnie tak działa dbus-monitor, ale nie chce mi się teraz sprawdzać), w Pythonie nie można, bo nie jest eksportowana taka metoda.&lt;/p&gt;

&lt;p&gt;Póki co, oznacza to śmierć projektu. Przynajmniej do czasu, kiedy naprawione zostaną pythonowe wrappery, bo w C pisać tego nie zamierzam.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Anaconda update</title>
   <link href="http://room-303.com/blog/2005/04/28/8fda90030c89791e27fdaab70d28e6ce/"/>
   <updated>2005-04-28T22:10:27+00:00</updated>
   <id>http://room-303.com/blog/2005/04/28/8fda90030c89791e27fdaab70d28e6ce</id>
   <content type="html">&lt;p&gt;Minęło trochę czasu, od kiedy pierwszy raz siadłem nad &lt;a href=&quot;http://fedora.redhat.com/projects/anaconda-installer/&quot;&gt;Anacondą&lt;/a&gt;. Przedstawiam zatem postęp w pracach - wiele się nie zmieniło, ale parę rzeczy pozmieniałem.&lt;/p&gt;

&lt;p&gt;Wstępne uwagi - Anaconda do zbudowania wymaga kilkunastu przeniesionych z RedHata lub podbitych przeze mnie pakietów. W tym &lt;code&gt;kudzu&lt;/code&gt;, które kategorycznie odmawia zbudowania się za pomocą &lt;code&gt;gcc4&lt;/code&gt;. Póki co, pozostaje praca na &lt;code&gt;gcc&lt;/code&gt; w wersji 3.x.&lt;/p&gt;

&lt;p&gt;Największym bólem jest konieczność każdorazowego przebudowania pakietów Anacondy, przy choćby najdrobniejszej modyfikacji skryptów basha czy Perla wchodzących w jej skład. Z drugiej strony jest to jedną z większych zalet Anacondy na tle innych instalatorów - do zbudowania instalatora używa pakietów RPM, a nie bieżącej zawartości systemu. Między innymi używa własnych pakietów RPM, więc te przebudowuję średnio kilkanaście razy na godzinę - na szczęście prace idą do przodu.&lt;/p&gt;

&lt;p&gt;Dużo problemów przysparza mi obecnie kernel. Poprawiłem Anacondę, żeby wypakowywała dodatkowe paczki (pcmcia), bo użycie &lt;code&gt;kernel24-BOOT&lt;/code&gt; w grę nie wchodzi - choćby podsystemy SerialATA zmieniły zasadniczo swoje działanie od czasów 2.4 i instalacja ze starego jądra spowoduje zgon systemu przy bootowaniu nowego (to co kiedyś było &lt;code&gt;/dev/hdX&lt;/code&gt;, teraz nazywa się &lt;code&gt;/dev/sdX&lt;/code&gt;). Martwi mnie spory rozmiar &lt;code&gt;initrd&lt;/code&gt; budowanego przez Anacondę z naszego 2.6.11 - ma około 8 MB, czyli sporo więcej niż pozwala bez problemu załadować kernel.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://wirusy.room-303.com/PLD/2005-04-28-anaconda-booting.png&quot; alt=&quot;screenshot&quot; /&gt;&lt;br /&gt;
Anaconda radzi sobie z wygenerowaniem obrazu isolinuksa&lt;/p&gt;

&lt;p&gt;Po zbootowaniu obrazu wygenerowanego przez Anacondę, pojawia się bootsplash isolinuksa. Proszę o wybaczenie, ale nie miałem czasu malować logo PLD, więc jest taki - nazwijmy to - &lt;q&gt;placeholder&lt;/q&gt;.&lt;/p&gt;

&lt;p&gt;Na tym etapie do zbootowania niezbędne jest dopisanie do kernela parametru &lt;code&gt;ramdisk_size&lt;/code&gt; (ze względu na wspomniane kolosalne &lt;code&gt;initrd&lt;/code&gt;):&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;boot: linux ramdisk_size=10000&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Po tym zaczyna się zwykła procedure bootowania dystrybucyjnego jądra, umiera ona jednak przy próbie podmontowania roota:&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://wirusy.room-303.com/PLD/2005-04-28-anaconda-kernel-panic.png&quot; alt=&quot;screenshot&quot; /&gt;&lt;br /&gt;
&lt;code&gt;Kernel panic&lt;/code&gt; przy próbie montowania roota&lt;/p&gt;

&lt;p&gt;Niestety, nie mam czasu teraz debugować tego dalej. Do głowy przychodzą mi dwie opcje: albo nasz kernel nie ma wkompilowanej obsługi cramfs (a za ładowanie modułów odpowiedzialny jest &lt;code&gt;initrd&lt;/code&gt;, co jest nieco kłopotliwe w sytuacji, gdy on sam spakowany jest cramfs) albo ja coś skopałem na etapie generowania &lt;code&gt;vmlinuz&lt;/code&gt;/&lt;code&gt;initrd&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Jeśli to możliwe, to prosiłbym o kontakt kogoś lepiej zaprzyjaźnionego z naszym jądrem, najlepiej kogoś, kto używał już dystrybucyjnych kerneli do generowania bootowalnych płyt. Wolałbym uniknąć sytuacji, kiedy do zbudowania instalatora PLD będzie potrzebne jądro Fedory, a na moim notebooku kompilacja kernela trwa około dwóch godzin, więc nie chcę robić tego na oślep.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; wrzuciłem aktualny screen, kernel wykłada się teraz na montowaniu roota.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>PLD Workstation</title>
   <link href="http://room-303.com/blog/2005/04/24/0cb2a28a02ba3f8161cca2a864e02cef/"/>
   <updated>2005-04-24T00:02:22+00:00</updated>
   <id>http://room-303.com/blog/2005/04/24/0cb2a28a02ba3f8161cca2a864e02cef</id>
   <content type="html">&lt;p&gt;Pewnie kilka osób zauważyło podejrzany ruch, generowany przeze mnie w module SPECS naszego CVS. Spieszę z wyjaśnieniami.&lt;/p&gt;

&lt;p&gt;Od kilku dni noszę się z zamiarem przygotowania nowej płytki instalacyjnej dla PLD. Mamy wersję pełną, wersję MiniISO, nasze &lt;a href=&quot;http://livecd.pl/&quot;&gt;LiveCD&lt;/a&gt;, &lt;a href=&quot;http://rescuecd.pld-linux.org/&quot;&gt;płytkę ratunkową x86&lt;/a&gt; oraz &lt;a href=&quot;http://ppcrcd.pld-linux.org/&quot;&gt;płytkę ratunkową PPC&lt;/a&gt;, czemu więc nie mieć wersji dedykowanej na desktopy?&lt;/p&gt;

&lt;p&gt;Idea więc jest taka: wziąć &lt;a href=&quot;http://fedora.redhat.com/projects/anaconda-installer/&quot;&gt;Anacondę&lt;/a&gt; i zbudować jednolite, spójne środowisko oparte na &lt;a href=&quot;http://www.gnomedesktop.org/&quot;&gt;Gnome 2.10&lt;/a&gt;, będące jednocześnie zwykłą instalacją PLD (nie, nie chcę używać &lt;a href=&quot;http://fedora.redhat.com/&quot;&gt;Fedory&lt;/a&gt;). Kilka osób zacznie mnie pewnie zaraz wyzywać, że sobie zachciałem klikalnego Linuksa zrobić i że lame, a prawdziwy admin to tylko konsola. Pamiętajmy jednak o zwykłych ludziach. Nie, PLD nie jest dla typowego użytkownika, ale są też krewni i znajomi deweloperów, którzy choćby z wygody (jest kogo zapytać o radę) wolą używać PLD. Zresztą, czemu deweloperzy nie mogą mieć wygodnego instalatora? Jeśli zaś chcesz skrytykować Gnome i poradzić mi inne środowisko, nie masz po co pisać. Po pierwsze - po zakończeniu prac udostępnię całość i będziesz mógł sobie zbudować wersję z dowolnym zestawem pakietów. Po drugie - używam Gnome'a i nie będę zgadywał, co jest potrzebne, żeby KDE zadziałało.&lt;/p&gt;

&lt;p&gt;Póki co, udało mi się przenieść do PLD większość pakietów wymaganych do kompilacji anacondy. Resztę braków (na potrzeby kompilacji) biorę tymczasowo z Fedory, choć jutro nie powinno to już być potrzebne. Innymi słowy, jutro anaconda będzie się natywnie budowała w czystym PLD.&lt;/p&gt;

&lt;p&gt;Kolejnym etapem jest przygotowanie struktury katalogów i niezbędnych plików dla anacondy, coby była w stanie wygenerować obraz płyty. Znalazłem pod tym kątem bardzo dużo miłych HOWTO. Problem jest tylko jeden - wszystkie zaczynają się słowami &quot;weź li dwie szczypty Fedory, a najlepiej przegraj na dysk zawartość wszystkich jej płyt&quot;. Chcę zacząć zupełnie od zera i może to być dość bolesne zadanie.&lt;/p&gt;

&lt;p&gt;Dalsza robota to głównie tuning listy pakietów, dodawanie skryptów prekonfigurujących, testowanie na &lt;a href=&quot;http://www.vmware.com/&quot;&gt;VMware&lt;/a&gt; i, koniec końców, artwork.&lt;/p&gt;

&lt;p&gt;Życzcie mi powodzenia, a ja wracam do dłubania w CVS.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #011: Untitled Comics part 2</title>
   <link href="http://room-303.com/blog/2005/04/18/5566cec676439f7bfcdcde5e8c13d793/"/>
   <updated>2005-04-18T19:48:03+00:00</updated>
   <id>http://room-303.com/blog/2005/04/18/5566cec676439f7bfcdcde5e8c13d793</id>
   <content type="html">&lt;p&gt;Jako, że pracuję właśnie nad mega wielkim i poważnym CMS-em dla klienta w PHP, mój mózg krąży po wszystkich możliwych pomysłach poza tymi przydatnymi w programowaniu. Przy okazji zaplątał się też ponownie w okolice UC.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/011-untitled-2.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #010: Untitled Comics</title>
   <link href="http://room-303.com/blog/2005/04/17/58dddc2baa9214a33c552d8c4a077776/"/>
   <updated>2005-04-17T20:13:42+00:00</updated>
   <id>http://room-303.com/blog/2005/04/17/58dddc2baa9214a33c552d8c4a077776</id>
   <content type="html">&lt;p&gt;Przeglądałem dzisiaj &lt;a href=&quot;http://www.sip-bp.pl/untitled-comics/index.php&quot;&gt;Untitled Comics&lt;/a&gt; i nie mogłem się powstrzymać ;).&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/010-untitled.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #009: Technologia idzie naprzód</title>
   <link href="http://room-303.com/blog/2005/04/17/98abd801f67a0b21a74683884f013d15/"/>
   <updated>2005-04-17T16:05:59+00:00</updated>
   <id>http://room-303.com/blog/2005/04/17/98abd801f67a0b21a74683884f013d15</id>
   <content type="html">&lt;p&gt;Zainspirowany niewielką burzą mózgów, która rozgorzała w firmie ostatnio, postanowiłem pójść o krok dalej.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://comic.room-303.com/strips/009-bluetooth.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #008: Dziś o 13:37...</title>
   <link href="http://room-303.com/blog/2005/04/09/2c2e7a1106b550c04063b0a654fd23f0/"/>
   <updated>2005-04-09T14:35:10+00:00</updated>
   <id>http://room-303.com/blog/2005/04/09/2c2e7a1106b550c04063b0a654fd23f0</id>
   <content type="html">&lt;p&gt;Pomysłowość bezmyślnych ludzi mnie przeraża. Ciekawe, co by się stało, gdyby łańcuszek papieżowych trendów głosił &lt;q&gt;&lt;cite&gt;dziś o 21:37 wystawiamy na 2 godziny telewizory plazmowe przed budynek&lt;/cite&gt;&lt;/q&gt;. Podejrzewam, że byłbym bogatszy o kilka telewizorów.&lt;/p&gt;

&lt;p&gt;Łańcuszkom mówimy nie i w zamian propagujemy własny - dziś o 13:37 gasimy światła i gramy w Ponga!&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://patrys.icenter.pl/comic/008-pong.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Fakty i mity</title>
   <link href="http://room-303.com/blog/2005/04/08/cd3dd4a0225b21816087a5f19cd54e29/"/>
   <updated>2005-04-08T00:38:26+00:00</updated>
   <id>http://room-303.com/blog/2005/04/08/cd3dd4a0225b21816087a5f19cd54e29</id>
   <content type="html">&lt;p&gt;Jeśli jesteś jedną z osób, które zwykły mówić &lt;q&gt;&lt;cite&gt;ja nigdy nie zostanę deweloperem, bo się do tego nie nadaję&lt;/cite&gt;&lt;/q&gt;, to właśnie za chwilę stracisz część swoich argumentów. Ale może od początku.&lt;/p&gt;

&lt;p&gt;Jeśli usłyszałeś od kogoś, że &lt;q&gt;&lt;cite&gt;w PLD są tylko spece&lt;/cite&gt;&lt;/q&gt;, to twój rozmówca miał rację, tylko źle go zrozumiałeś. W PLD spece są, ale w repozytorium.&lt;/p&gt;

&lt;p&gt;Oczywiście, to tylko jeden z moich kiepskich żartów, ale jego celem jest podkreślenie, że nie wszyscy pracujący przy dystrybucji muszą być (i nie są) bogami Linuksa. Jeśli wydaje ci się, że przy tak dużym tworze pracuje dwieście klonów Kevina Mitnicka, to właśnie padłeś ofiarą mitu. PLD swoją wielkość (a jesteśmy bodaj największą dystrybucją na świecie, jeśli chodzi o ilość dostępnych i możliwych do zbudowania pakietów) zawdzięcza właśnie rozdrobnieniu pomiędzy sporą liczbę osób o bardzo różnych zainteresowaniach i potrzebach. Panuje tu jedna zasada - rób to, na czym się znasz i czego sam używasz. Dzięki temu mamy ogromny przekrój pakietów, od tych stricte desktopowych do tych o bardzo specyficznych zastosowaniach serwerowych. A kto nad tym panuje? Teoretycznie nikt, w praktyce całością kieruje Release Manager, czyli opiekun danej linii dystrybucji. Jego praca nie polega oczywiście na staniu i poganianiu innych za pomocą bicza. Praca jest całkowicie dobrowolna i wykonywana w wolnym czasie (za wyjątkiem jednego człowieka, którego wszyscy chyba znają, ale jest on w rzeczywistości klastrem ludzi zamieszkujących na stałe w czeluściach naszego CVS). Nad jakością, niejako przy okazji, czuwa ogół deweloperów. Za zepsucie czegokolwiek czeka cię lincz publiczny i siedem lat ciężkich robót w pobliskiej restauracji szybkiej obsługi na literę &lt;q&gt;M&lt;/q&gt;. W praktyce skończy się najwyżej na krótkim flame'ie, ciężko bowiem kogoś zwolnić z wolontariatu. Nie zdarzyło się chyba jeszcze, żeby ktoś wskutek pomyłki utracił prawo dokonywania zmian w dystrybucji. Jak więć można pomóc?&lt;/p&gt;

&lt;p&gt;Pomóc może prawie każdy. Tutaj pewnie odezwą się głosy mówiące &lt;q&gt;&lt;cite&gt;ja nie umiem programować&lt;/cite&gt;&lt;/q&gt;, ale smutna prawda jest taka, że nie jest to umiejętność niezbędna ani nawet wymagana, a w codziennej pracy często nieprzydatna. Wymagane jest za to pewne doświadczenie w pracy z systemami linuksowymi. Pozostałe umiejętności zależeć będą od kierunku, w jakim zechcesz się udać. Oczywiście, mamy programistów i własne projekty OpenSource, ale na tym dystrybucja się nie kończy. Gro pracujących nad nią ludzi stanowią opiekunowie bazy pakietów i to o nich w mowie potocznej mówi się &lt;q&gt;deweloperzy&lt;/q&gt;.&lt;/p&gt;

&lt;p&gt;Podstawowym zadaniem takiego dewelopera jest dbanie o to, by dystrybucja (przynajmniej w ramach danej linii) była spójna, ale jednocześnie dostarczała niezbędnej funkcjonalności każdemu użytkownikowi, nie stając się jednocześnie dinozaurem ze względu na przestarzałe oprogramowanie. Codzienna (termin zwyczajowy, nie oznacza konieczności pracy od poniedziałku do niedzieli) praca polega na edycji plików &lt;code&gt;spec&lt;/code&gt; - instrukcji dla farmy maszyn budujących pakiety. Jeśli pakiet jest potrawą, a komputer budujący kucharzem, to plik &lt;code&gt;spec&lt;/code&gt; jest przepisem na przyrządzenie tej potrawy. Wygląda trochę jak strona z książki kucharskiej dla opornych, &lt;q&gt;potrzebujesz następujących składników, następnie weź takie naczynie i wsyp do niego to i tamto, mieszając powoli aż do uzyskania jednolitej konsystencji&lt;/q&gt;. Brzmi groźnie, ale składnia recepty jest dość prosta i opanowanie jej nie zajmuje więcej niż dwa dni. Zwłaszcza, że krótki opis, przykładowy plik i linki do szczegółowej dokumentacji znajdują się w naszym poradniku dewelopera.&lt;/p&gt;

&lt;p&gt;A jak zostać deweloperem? To proste - trzeba chcieć. Na początek dobrze zapisać się na &lt;a href=&quot;http://lists.pld-linux.org/&quot;&gt;listy dyskusyjne&lt;/a&gt; do tego celu przeznaczone. Rozsądnie jest też znaleźć sobie opiekuna na start - osobę, która wyjaśni wątpliwości, pomoże, doradzi i, co najważniejsze, będzie miała uprawnienia wprowadzić nasze zmiany do dystrybucji. A należy tu zaznaczyć, że całość utrzymywana jest w repozytorium CVS, do którego prawo zapisu mają tylko deweloperzy. Stąd początkowe ulepszenia musimy komuś podsyłać, jeśli nie mamy opiekuna, to możemy wysłać je na listę pld-devel-pl. Tutaj kilka uwag pro-forma - opiekuna nie szukamy na siłę, jeśli nikogo nie znamy, to nie wysyłamy do wszystkich maila z pytaniem, kto się podejmie; poprawki przysyłamy w postaci czystego tekstu, nie pakujemy plików &lt;code&gt;spec&lt;/code&gt; zipem, tarem ani rarem; poprawki do istniejących plików wysyłamy w postaci zunifikowanej łatki (wypluwa ją z siebie &lt;code&gt;diff -u&lt;/code&gt;); nie zniechęcamy się, jeśli nikt nam nie podziękuje i nie padnie do stóp, a bardziej prawdopodobne jest, że ktoś zwróci nam uwagę na kilka błędów w naszych pierwszych &lt;q&gt;dziełach&lt;/q&gt;.&lt;/p&gt;

&lt;p&gt;Pliki &lt;code&gt;spec&lt;/code&gt; brzmią strasznie? Mamy też &lt;a href=&quot;http://pl.docs.pld-linux.org/&quot;&gt;dział dokumentacji&lt;/a&gt;, a ta przy dynamicznie rozwijającym się oprogramowaniu szybko się dezaktualizuje. Panowie zajmujący się tą działką z chęcią przywitają skorych do pomocy. Potrzebujemy także zainteresowanych prowadzeniem tłumaczeń dokumentacji na inne języki. Wymagana jest przede wszystkim znajomość opisywanego tematu, podstawowa chociażby wiedza z dziedzin gramatyki i ortografii oraz umiejętność pisania w sposób zrozumiały. Jeśli uważasz, że dokumentacja to dla ciebie zbyt wiele, pozwól, że zaproszę cię do rozwoju &lt;a href=&quot;http://pld-linux.org/&quot;&gt;naszej oficjalnej strony&lt;/a&gt;. Ta ostatnia oparta jest o publicznie dostępne Wiki i nie wymaga żadnych specjalnych uprawnień do wprowadzania na niej zmian. Zanim jednak ruszysz sprawdzić, czy da się za jej pomocą pozdrowić ciocię, uprzedzę że zmiany w każdym aspekcie dystrybucji są natychmiast widoczne dla wszystkich zapisanych na stosowne listy monitorujące, więc swym przebojowym &lt;q&gt;włamaniem&lt;/q&gt; możesz co najwyżej zyskać paru wrogów i etykietkę niespecjalnie rozwiniętego intelektualnie.&lt;/p&gt;

&lt;p&gt;Jeśli i to nie spełnia twoich oczekiwań, możesz zawsze uwolnić swoją duszę artysty. Z otwartymi ramionami przyjmiemy wszystko, co nadaje się do publikacji - tapety, wygaszacze, style, skórki do programów, zestawy dźwiękowe czy własne kursory. Jedynym warunkiem jest licencja pozwalająca na swobodną dystrybucję danego elementu i odpowiednio wysoki poziom wykonania (choć o gustach się nie dyskutuje, przypominam o istnieniu pojęcia smaku).&lt;/p&gt;

&lt;p&gt;Co zaś mitów się tyczy, jeśli planujesz zasilić nasze szeregi dla sławy czy poklasku, to trafiłeś kiepsko. Nikt jeszcze na tym nie zarobił, a i płeć przeciwna nie darzy większą sympatią ludzi związanych z Linuksem. Pracujemy dla siebie samych i dla własnych korzyści, czy to z powodu dostępu do szerokiego oprogramowania, czy możliwości lepszego poznania używanej przez siebie platformy.&lt;/p&gt;

&lt;p&gt;Pozdrawiam i żegnam się powoli, jako że godzina już niemłoda. Mam nadzieję, że kogokolwiek zainteresowałem.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Skinowanie bloga</title>
   <link href="http://room-303.com/blog/2005/04/05/74aa4390ba62246c2663f74e52f9cb54/"/>
   <updated>2005-04-05T21:56:37+00:00</updated>
   <id>http://room-303.com/blog/2005/04/05/74aa4390ba62246c2663f74e52f9cb54</id>
   <content type="html">&lt;p&gt;Jako, że znalazłem chwilę czasu na kreatywną zabawę z kodem, pozwoliłem sobie dorobić kilka theme'sów dla tego bloga. Ku uciesze molestujących mnie ludzi, powrócił, znany dobrze tym z was, którzy czytają mnie dłużej, zestaw &lt;q&gt;evil&lt;/q&gt;. Dla używających przeglądarek napędzanych mozillowym silnikiem Gecko gratka - theme &lt;q&gt;mozilla&lt;/q&gt;, czyli zestaw pełen okrągłości i nawiązań kolorystycznych do &lt;a href=&quot;http://mozilla.org/&quot; title=&quot;The Mozilla Organization&quot;&gt;stron Organizacji&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Stosowna funkcjonalność dostępna jest na głównej stronie, w prawym panelu. Mam nadzieję, że się spodoba.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Polska prasa tematyczna</title>
   <link href="http://room-303.com/blog/2005/04/03/0303094ceccc0a7dee5414b51d92b48c/"/>
   <updated>2005-04-03T21:39:30+00:00</updated>
   <id>http://room-303.com/blog/2005/04/03/0303094ceccc0a7dee5414b51d92b48c</id>
   <content type="html">&lt;p&gt;Poniższe zdarzenia miejsce miały w ostatni piątek, pierwszego kwietnia. Dzień piękny i ciepły, godziny popołudniowe, ja po pracy zbierałem się właśnie do wycieczki na dworzec celem wyjazdu do Poznania. Świadom konieczności spędzenia przynajmniej dwóch godzin w pociągu, postanowiłem urozmaicić sobie jakoś podróż. W tym celu udałem się do pobliskiego kiosku z zamiarem kupienia jakiegoś czasopisma na drogę.&lt;/p&gt;

&lt;p&gt;- Dzień dobry, czy dostanę &lt;q&gt;Linux+&lt;/q&gt;? - zagadnąłem pogodnie kioskarkę&lt;br /&gt;
- Nie, nie ma&lt;br /&gt;
- A może dostanę &lt;q&gt;Linux Magazine&lt;/q&gt;?&lt;br /&gt;
- Nie, też nie ma&lt;br /&gt;
- A może &lt;q&gt;Chip Special&lt;/q&gt;?&lt;br /&gt;
- Nie, ale mam &lt;q&gt;Polskie Amatorki&lt;/q&gt;&lt;br /&gt;
- Wie pani, to są magazyny komputerowe...&lt;br /&gt;
- A, to nie, mam &lt;q&gt;Click&lt;/q&gt; i &lt;q&gt;Komputer Świat&lt;/q&gt;&lt;/p&gt;

&lt;p&gt;Stanąłem tam jako głaz, wryty i zmieszany. Nie wyglądało to na dowcip prima-aprilisowy, a zakupu &lt;q&gt;Linux+&lt;/q&gt; dokonywałem tam już wielokrotnie. Całe zajście, dość zabawne, przywróciło moją wiarę w fantazję i kreatywność polskich pracowników. :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Sprawny host w pigułce</title>
   <link href="http://room-303.com/blog/2005/03/30/b718c13443a7743a4c8e6c2c9f591dda/"/>
   <updated>2005-03-30T21:40:43+00:00</updated>
   <id>http://room-303.com/blog/2005/03/30/b718c13443a7743a4c8e6c2c9f591dda</id>
   <content type="html">&lt;p&gt;Wielu początkujących administratorów przeczesuje zasoby sieci w poszukiwaniu stron z opisami poprawnej konfiguracji serwerów usług bądź w poszukiwaniu znajomych taką wiedzę posiadających. Nauczony doświadczeniami płynącymi ze współpracy z jednym panem, postanowiłem opisać dokładnie proces konfiguracji idealnego środowiska produkcyjnego.&lt;/p&gt;

&lt;p&gt;Na początek, jako że pierwszy odcinek kursu, nie bądźmy zbyt ambitni i zacznijmy od zwykłego serwera proxy.&lt;/p&gt;

&lt;p&gt;Potrzebny będzie nam nosiciel (host) i dystrybucja linuksa. Linux jest najlepszym wyborem, bo jest bardzo modny i fajnie zasłynąć w światku znajomych swoimi pierwszymi doświadczeniami w tym kierunku. Oczywiście w domu lepiej mieć Windowsa, więc serwer produkcyjny nadaje się na poligon idealnie. Do naszych testów wybrałem skwapliwie najstabilniejsze środowisko produkcyjne. Musicie więc znaleźć gdzieś płytki zawierające Debian Unstable/Testing z archiwum pakietów z okolic sylwestra 2002. A może to był styczeń? Tuż po nowym roku wszystko się człowiekowi miesza.&lt;/p&gt;

&lt;p&gt;Uzbrojeni w aparaturę i software przystępujemy do instalacji. Niektórzy znani mistrzowie techniki zen doradzają w tym momencie, aby na czuja zainstalować wszystko. Od przybytku głowa nie boli. Ja pozwolę sobie ograniczyć się do pakietów squida, mini-httpd i iptables. Reszta pociągnie się po zależnościach. Byle nie za dużo, bo nasza precyzyjnie spartycjonowana maszyna ma na rootsystem przewidziane całe 10 giga przestrzeni (jako że posiadałem kiedyś Amigę 500, zapewniam że 10 giga to niewyobrażalnie dużo). Nie dzielimy dysku na partycje, bo właściwie to nie jest już trendy. I tak nikt nie będzie nam umiał wytłumaczyć jak przełączyć się na inny dysk pod midnightem (Alt + F1 nie działa). Nie zapominajmy też o pakiecie lm_sensors. Jako, że sensory są bardzo czułe, pakiet ten ma kluczową wartość na naszym serwerze proxy.&lt;/p&gt;

&lt;p&gt;Gdy wszystko stoi, przystępujemy do konfiguracji squida. Zależy nam na przepustowości sieci, więc dla pewności cache'ujemy wszystko. Tak, koniecznie zaznaczamy flagę &quot;ignoruj nagłówek &lt;code&gt;Expires&lt;/code&gt;&quot;, w praktyce nikt przecież go nie czyta. Katalog ze stronami tymczasowymi ustawiamy w katalogu &lt;code&gt;/var/spool/squid&lt;/code&gt; na głównej partycji (mi też &lt;code&gt;\var\spool\squid&lt;/code&gt; nie chciało działać). 10 giga to zapas na lata, przecież nikt nie widział takiej dużej strony. Proxy jest już gotowe, ale ale, zanim je włączymy, ustawiamy nasze błyszczące i nowe mini-httpd na wyświetlanie generowanych przez squida statystyk. W końcu nie poto trzymamy je w nieskończoność, żeby leżały odłogiem na dysku.&lt;/p&gt;

&lt;p&gt;Po konfiguracji tej części przyjdzie nam najtrudniejsze, zabezpieczanie serwera. Jak mówi stare japońskie przysłowie, dobry serwer jest jak dobry ninja. Można go zabić jednym ciosem, ale pozostaje niewykrywalny. Kierując się tą maksymą ustawiamy domyślną politykę wszystkich potoków ruchu na &lt;q&gt;accept&lt;/q&gt;, ale już w pierwszej regule odrzucamy prośby o ping kierowane na adres rozgłoszeniowy naszej podsieci (broadcast). Haha! To dopiero przebiegłość, nikt go nie znajdzie! Do tego dopisujemy kilka dodatkowych reguł z polityką &lt;q&gt;accept&lt;/q&gt; dla podstawowych protokołów (czyli dla zwykłego pinga i traceroute - tego fajnego narzędzia do śledzenia kumpli z gadu-gadu). Dla zwiększonego bezpieczeństwa resztę pakietów przekierowujemy żywcel do sysloga z poziomem raportowania 4. Teraz nic nam nie umknie, żadna próba włamania nie pozostanie niezauważona. Tym bardziej, że w syslogu usuwamy wpis przesyłający logi iptables do pliku, przez co są bardziej widoczne niż kiedykolwiek, na żadnej konsoli się przed nimi nie ukryjesz! Toż ci dopiero majstersztyk!&lt;/p&gt;

&lt;p&gt;Krokiem drugim powinno być zwiększenie niezawodności naszej sieci przez instalację bardzo popularnego narzędzia, jakim jest Nagios. Nie wiemy do końca, co on robi, ale fajnie wygląda na screenach i ma tam dużo ładnych ikon. Dziwne, bo po instalacji nie widać ikon, tylko jakieś śmieci na konsoli, że coś nieustawione niby. Bzdura. Aha, jednak. Zmieniamy adresy z przykładowej konfiguracji na dane osobe sąsiada, który parkuje nam pod domem (używa mało na topie Outlook Expressa, to niech się męczy ze spamem). Działa. Dalej nic nie rysuje na ekranie, ale screeny pewnie podrobione w Photoshopie, mniejsza o to. Podobno trzeba mieć jakiś serwer poczty tam do tego Nagiosa, więc instalujemy szybko NullMailer. Do tego jakiś szybki soft do rozsyłkim np. exim3 w trybie bezdemonowym (bo nie chcemy duchów na serwerze było nie było publicznym, mogą wystraszyć potencjalnych użytkowników). Demona nie ma, więc i konfigurować pewnie nie trzeba. Odpalamy i zapominamy.&lt;/p&gt;

&lt;p&gt;Powiadomienia nie przychodzą, więc wszystko jest w porządku. Spokojnie pracujemy dalej. Zależy nam na niezawodności systemu, więc co kilka tygodni uruchamiamy &lt;code&gt;apt-get upgrade&lt;/code&gt; w poszukiwaniu krytycznych poprawek. Zależy nam również na przepustowości łącza, więc unikamy stosowania &lt;code&gt;apt-get update&lt;/code&gt;, które generuje tylko zbędny ruch, a przecież wszystko mamy na płytkach. Ignorujemy też maile od klientów, ze względów bezpieczeństwa. W końcu pod wiadomością podpisać może się każdy, nie możemy ufać każdemu. Kontakt z klientami nawiązujemy dopiero w momencie, kiedy szef danej firmy zadzwoni do nas osobiście, to pozwala dokładnie potwierdzić tożsamość rozmówcy i jego dobre intencje.&lt;/p&gt;

&lt;p&gt;Gdy po kilku miesiącach pracy klienci zaczynają spamować naszą prywatną skrzynkę do tego stopnia, że spamassassin pochłania sporą część czasu procesora, bierzemy ich metodą &lt;q&gt;na przetrzymanie&lt;/q&gt;. Na dwa dni znikamy bez słowa, śmiejąc się w duchu z ich dziecięcej bezradności.&lt;/p&gt;

&lt;p&gt;Po powrocie do pracy ze zdumieniem dostrzegamy, że szef w międzyczasie zatrudnił nowego administratora, który wraz z programistą próbuje dojść, jakim cudem statystyki dysków na systemie squidowym pokazują 100% wykorzystania miejsca. Wkrótce dochodzą do tego, że Nagios nie miał prawa wykonywania binarki &lt;code&gt;/bin/ping&lt;/code&gt;, wskutek czego wygenerował słuszną liczbę 110 tysięcy powiadomień o martwych hostach. Niestety, z powodu błędnej konfiguracji exima, połowa z tych maili nie dotarła do jednego z adresatów (powiadomienia dostawał szef firmy, ale nie administrator). Może to i dobrze, bo każdy wysłany pomyślnie mail generował kilkadziesiąt stron zrzutu stosu TCP/IP w logu podstawowym, który wkrótce (mimo codziennej rotacji) przepełnił 10-gigowy dysk (&lt;q&gt;nie do zapełnienia&lt;/q&gt;). Nie wspomnę, jaki jest komfort pracy na konsoli, przez którą przewija się bez przerwy ramka za ramką cały ruch TCP i UDP wychodzący z maszyny.&lt;/p&gt;

&lt;p&gt;Na dziś to tyle, do zobaczenia w kolejnym odcinku, gdzie nauczymy się równie pożytecznych i przydatnych umiejętności.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Kulinaria</title>
   <link href="http://room-303.com/blog/2005/03/29/77efd250c2f54ee6746c0441a6876452/"/>
   <updated>2005-03-29T19:38:55+00:00</updated>
   <id>http://room-303.com/blog/2005/03/29/77efd250c2f54ee6746c0441a6876452</id>
   <content type="html">&lt;p&gt;Jako, że dziś od powrotu do domu robię za helpdesk do spraw Visual C++ (brr) i &lt;abbr title=&quot;Microsoft Foundation Classes&quot;&gt;MFC&lt;/abbr&gt; (brrr), miałem okazję przemyśleć to i owo i zweryfikować swój pogląd na kolejne generacje języków programowania. Wiem już, czemu C/C++ pozostają moimi ulubionymi językami, mimo istnienia takich cudów techniki, jak Java. A oto i prawda objawiona:&lt;/p&gt;

&lt;p&gt;Można pójść do wspaniałej restauracji, takiej ze wspaniałą obsługą, rewelacyjną kuchnią, idealnie skomponowanym menu i najeść się do syta. Ale o ile przyjemniej samemu ugotować coś zjadliwego? Wiedzieć, co jest w środku, czerpać przyjemność z samego procesu twórczego, nawet jeśli efekt końcowy nie wygląda jak na zdjęciach z McDonalda. C/C++ to rodzina języków, które cieszą samym faktem, że program w ogóle działa (a przynajmniej się kompiluje). :&amp;gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #007: Wielkanoc</title>
   <link href="http://room-303.com/blog/2005/03/26/5a273590843989a85bc44208bc9cf5fc/"/>
   <updated>2005-03-26T13:48:11+00:00</updated>
   <id>http://room-303.com/blog/2005/03/26/5a273590843989a85bc44208bc9cf5fc</id>
   <content type="html">&lt;p&gt;Święta są do niczego. Przygotowania do świąt to tylko pretekst do zmuszania biednych informatyków do sprzątania czegoś, co jest zdecydowanie uporządkowane i takim powinno pozostać.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://patrys.icenter.pl/comic/007-easter.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>e-siedemnastka</title>
   <link href="http://room-303.com/blog/2005/03/25/895e2a09f9f5010a4d8b69c4550cf74f/"/>
   <updated>2005-03-25T21:57:55+00:00</updated>
   <id>http://room-303.com/blog/2005/03/25/895e2a09f9f5010a4d8b69c4550cf74f</id>
   <content type="html">&lt;p&gt;Pisząc o Luminocity przypomniałem sobie o nie tak dawnych eksperymentach z innym oprogramowaniem dla dotkniętych problemem młodzieńczego trądziku. Chodzi mi o &lt;a href=&quot;http://www.enlightenment.org/&quot;&gt;Enlightenment&lt;/a&gt; w swojej siedemnastej odsłonie.&lt;/p&gt;

&lt;p&gt;&lt;q&gt;Siedemnastka&lt;/q&gt; zawiera przepisany od zera manager okien, nowy zestaw widgetów (lub kontrolek, jak kto woli), własny moduł logowania i to, co fani Enlightenment zawsze sobie chwalili - maksymalnie zoptymalizowany kod. Środowisko nie ma jeszcze pełnej funkcjonalności (choć przyznaję, że do testów używałem snapshotu sprzed miesiąca), za to powala setką małych, cieszących oko detali. Wszystko jest animowane, błyszczy, świeci, tylko śpiewu brak (ale od czego jest ikona XMMS w domyślnym ustawieniu docka).&lt;/p&gt;

&lt;p&gt;O ile większość z efektów można z punktu widzenia używalności pominąć, kilka rzeczy cieszy więcej niż oko. Przede wszystkim dostarczone przez autorów testy z setką latających po ekranie widgetów pokazały u mnie trochę ponad 160 klatek na sekundę. Wynik tyle oszałamiający co niemożliwy do uzyskania w żadnym z konkurencyjnych środowisk desktopowych (zaznaczam, że obiekty to między innymi antyaliasowane teksty, gradientowane boksy - w tym do przezroczystości, obrazki z kanałem alfa).&lt;/p&gt;

&lt;p&gt;Drugi ciekawy pomysł, to rozwiązanie trybu edytora pulpitu jako przełącznika w menu kontekstowym. Po jego aktywacji możemy dowolnie skalować i przemieszczać składające się na nasz pulpit aplety (zegarki, wskaźniki, paski menu). Po dezaktywacji trybu edycyjnego, pulpit zostaje na powrót zamrożony i nie grozi nam przypadkowe uszkodzenie tak pieczołowicie przygotowanej kompozycji.&lt;/p&gt;

&lt;p&gt;Ja pozostanę przy Gnome, bo cenię sobie zintegrowane środowisko pracy, ale część z użytkowników &lt;q&gt;lekkich&lt;/q&gt; pulpitów w rodzaju Xfce4 czy FWM może już dziś zacząć zastanawiać się nad przyszłą przesiadką ;).&lt;/p&gt;

&lt;p&gt;Na koniec jeszcze obowiązkowy &lt;a href=&quot;http://www.lo3.wroc.pl/~pdebski/patrys/index.php&quot;&gt;zestaw screenów pokazujących e17 w działaniu&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Luminocity</title>
   <link href="http://room-303.com/blog/2005/03/25/b7e22b32fe5e86389021971dfa136b55/"/>
   <updated>2005-03-25T20:03:25+00:00</updated>
   <id>http://room-303.com/blog/2005/03/25/b7e22b32fe5e86389021971dfa136b55</id>
   <content type="html">&lt;p&gt;Przeglądając wczoraj (dziś w nocy) stronę &lt;a href=&quot;http://gnome.org/~seth/&quot;&gt;Design Fu&lt;/a&gt; Setha, który jest pierwszym źródłem informacji o wszystkich zmianach w UI Gnome, szukałem nowych informacji na temat projektu &lt;a href=&quot;http://www.gnome.org/projects/sabayon/&quot;&gt;Sabayon&lt;/a&gt;. Zamiast tego znalazłem coś, co wbiło mnie w ziemię.&lt;/p&gt;

&lt;p&gt;Projekt &lt;a href=&quot;http://www.gnome.org/~seth/blog/xshots&quot;&gt;Luminocity&lt;/a&gt;, bo o nim mowa, to tymczasowy projekt przejściowy, utworzony na potrzeby testowania kodu przed merge'owaniem do bazy Metacity. Na udostępnionych przez Setha filmach widać wyraźnie dwie rzeczy: po pierwsze, programistom Gnome się nudzi (a efekty ich nudy powalają na kolana); po drugie, Metacity będzie mieć oficjalnego managera kompozycji (wsparcie dla kompozycji już znajduje się częściowo w kodzie Metacity, ale jest domyślnie zablokowane).&lt;/p&gt;

&lt;p&gt;Czego by nie powiedzieć, widać wyraźnie, że Gnome, choć małymi kroczkami, zdecydowanie idzie w kierunku zwykłego użytkownika. Za jakiś czas skończy się era kojarzenia systemów uniksowych z pryszczatymi, zakompleksionymi nastolatkami.&lt;/p&gt;

&lt;p&gt;Efekt gumowych okien jest zaiste przepiękny. Jak pisze Seth, prace nad kodem stanęły w miejscu i wszyscy bawią się nowym efektem. Podobne rozwiązania od dłuższego czasu znają szczęśliwi posiadacze Mac OS X (towarzyszą chociażby minimalizacji okien czy przełączaniu pulpitów).&lt;/p&gt;

&lt;p&gt;Ważniejszy jednak jest zintegrowany pełny manager kompozycji. Po co? Nie tylko żeby dorównać Makowcom pod względem eyecandy. Przede wszystkim dla zwiększenia szybkości przełączania się pomiędzy aplikacjami. W tej chwili wszystko oparte jest o system dirty rectangles, przy przełączaniu okien odrysowane musi zostać wszystko, co było dotąd zasłonięte przez inne okno bądź znajdowało się poza bieżącym pulpitem. W przypadku używania managera kompozycji zintegrowanego z managerem okien, okna rysowane są tylko w przypadku zmiany ich zawartości. Przełączanie ich kolejności i widoczności nie wymaga odrysowania ich zawartości, bo stosowna bitmapa znajduje się już w banku rozszerzenia &lt;code&gt;composite&lt;/code&gt; i jest gotowa do wyrzucenia bezpośrednio na ekran.&lt;/p&gt;

&lt;p&gt;Problemem, jak zawsze, pozostaje wsparcie tej technologii przez producentów kart graficznych. O ile nVidia radzi sobie z tym bardzo sprawnie, to sterowniki firegl Ati pozostawiają wiele do życzenia. Jeśli tylko wykryją załadowane rozszerzenie &lt;code&gt;composite&lt;/code&gt;, natychmiast wyłączają obsługę akceleracji. Alternatywą jest tu zestaw opensource'owych sterowników X11, z tym, że nie wspierają one akceleracji w chipach nowszych generacji. W tym, w Radeonach 9600 Pro/Mobility, a taki właśnie znajduje się w moim notebooku.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Coś dla fanów Firefoksa</title>
   <link href="http://room-303.com/blog/2005/03/24/1c478451c25a3bd84f63e23b0e5f0f80/"/>
   <updated>2005-03-24T22:19:22+00:00</updated>
   <id>http://room-303.com/blog/2005/03/24/1c478451c25a3bd84f63e23b0e5f0f80</id>
   <content type="html">&lt;p&gt;Pewnie spora część z was używa &lt;a href=&quot;http://sage.mozdev.org/&quot;&gt;Sage&lt;/a&gt; jako czytnika &lt;abbr title=&quot;Really Simple Syndication&quot;&gt;RSS&lt;/abbr&gt;. Dziś zmusiłem się do chwili wysiłku intelektualnego i przygotowałem &lt;a href=&quot;http://wirusy.room-303.com/Sage/&quot;&gt;własny stylesheet, zgodny z designem strony Mozilli&lt;/a&gt; do tegoż programu. Będąc nieskromnym, wygląda wspaniale i czyta mi się to dużo wygodniej niż domyślne Sage'owe niebieskości. Proszę tylko o linkowanie do tej notki, a nie bezpośrednio do pliku/serwera, bo umiejscowienie pliku może się w najbliższej przyszłości zmienić.&lt;/p&gt;

&lt;p&gt;Obowiązkowy &lt;a href=&quot;http://wirusy.room-303.com/Sage/screenshot.png&quot;&gt;screenshot Mozilla theme w użyciu&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Instrukcja instalacji: rozpakować gdzieś na dysk (do jednego katalogu), w opcjach Sage zaznaczyć &lt;q&gt;use custom stylesheet&lt;/q&gt; i wybrać plik &lt;code&gt;mozilla.css&lt;/code&gt; dostarczony w tarballu.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Administrator kontra konserwator</title>
   <link href="http://room-303.com/blog/2005/03/18/f08a299518a0c1dbfec99902596c6379/"/>
   <updated>2005-03-18T22:13:58+00:00</updated>
   <id>http://room-303.com/blog/2005/03/18/f08a299518a0c1dbfec99902596c6379</id>
   <content type="html">&lt;p&gt;Każda duża firma, posiadająca jakikolwiek serwer lub większą liczbę komputerów, zatrudnia człowieka na stanowisku administratora. Kim właściwie jest taki administrator? W firmach używających oprogramowania Microsoft, jest to na ogół konserwator, odpowiednik szkolnego dozorcy, który wymienia przepalone żarówki i bezpieczniki. Tak samo firmowy konserwator, zjawia się zawsze kiedy padnie Windows i konieczna jest jego reanimacja lub - jeszcze lepiej - reinstalacja. Nikt nie wyobraża sobie pracy bez niego, bo przecież nie można przeszkolić całego personelu choćby z podstaw informatyki. Pani Jadzia zainstaluje trojana i roboty jest na dwa dni, a administrator sieci biega w pocie czoła od stanowiska do stanowiska. Nikt nie kwestionuje jego kompetencji ani niezbędności jego pracy.&lt;/p&gt;

&lt;p&gt;Co jednak w przypadku firm hostujących serwery oparte na *niksach? Jak &lt;a href=&quot;http://hedera.linuxnews.pl/_news/2001/07/28/_lite/574.html&quot;&gt;pisał kiedyś Krzak&lt;/a&gt;, praca administratora farmy linuksowej to na ogół kilka nieprzespanych nocy z rzędu, a potem kilka miesięcy spokoju i działań zachowawczych. Po rozpracowaniu podstaw systemu (konfiguracja niezbędnych usług, czytanie dokumentacji, rekonfiguracja, przeglądanie przykładów, rekonfiguracja - w tej kolejności), system jest właściwie bezobsługowy. Dopóki nie padnie któraś z macierzy dyskowych, nie włamie się ktoś na konto FTP pracownika, czy nie spłonie któryś z procesorów w skutek niedostatecznego chodzenia, nie dzieje się nic. Nie widać biegających ludzi, nie czuć potu, nikt nie chwali i nie wyraża uznania. Typowy pracownik o konfiguracji serwera ma takie pojęcię, że czynność ta wymaga kliknięcia kilku ikon w &lt;q&gt;menu Start&lt;/q&gt; w odpowiedniej kolejności. Administratora właściwie nie widać, bo pracuje na ogół poza godzinami pracy reszty ekipy (ciężko wprowadzać jakiekolwiek zmiany w systemie, z którego aktualnie ktoś korzysta). Ludzie nie rozumieją, że jeśli administrator nie ma nic do roboty, to znaczy, że jest dobrym administratorem.&lt;/p&gt;

&lt;p&gt;Tu pojawia się problem, pracodawca zaczyna się zastanawiać, po co mu człowiek na takim stanowisku, jeśli właściwie nic nie robi (nie widać, żeby robił)? Coraz więcej firm rezygnuje z usług najlepiej wyszkolonego fachowca na rzecz taniego outsourcingu (bo ileż może zarobić szesnastolatek nie wychodząc z domu) bądź całkowicie likwiduje rzeczone stanowisko. Smutne, ale prawdziwe. Sam padłem ofiarą takich zmian, kiedy mój poprzedni pracodawca postanowił przekwalifikować administratora sieci na programistę i maszynistkę w jednym. Administrator serwera jest również coraz częściej postrzegany jak wspomniany dozorca. Z drugiej jednak strony, czasem trudno się temu dziwić, w tej chwili żeby zostać administratorem sieci nie trzeba przedstawiać właściwie żadnych predyspozycji. Polska jest na takim etapie edukacji informatycznej, że wystarczy koszulka z napisem &lt;q&gt;I luv l33nex&lt;/q&gt; żeby wzbudzić respekt i szacunek potencjalnego pracodawcy. Umiejętność wymienienia choćby dwóch &lt;q&gt;offowych&lt;/q&gt; dystrybucji (poza Debianem, SuSe i Mandrake) tworzy z nas lokalnego guru.&lt;/p&gt;

&lt;p&gt;Szukając pracy jako programista musiałem niejednokrotnie udowodnić swoje umiejętności. Każda rozmowa kwalifikacyjna (oczywiście po jej przejściu) była jedynie wstępem do kilugodzinnego egzaminu praktycznego. Administratora nikt nie sprawdza. Dlaczego? Raz, że pracodawca patrzy na każdego kandydata jak na dar z nieba i boi się, że nikt inny nie przyjdzie starać się o to stanowisko (a to za sprawą polskich stawek za pracę informatyków). Dwa, że nikt nie potrafi sprawdzić jego kompetencji. Jest bardzo niewiele firm specjalizujących się w pośrednictwie zatrudnienia na takie stanowiska a i korzystanie z ich usług jest w Polsce rzadkością.&lt;/p&gt;

&lt;p&gt;Ja ze swojej strony przyzwyczaiłem się już do sytuacji, że mamy administratora sieci, który pracuje dorywczo na outsourcingu. Dorabia, bo w tych samych godzinach siedzi przy swoim biurku w innej firmie. Czasu ma proporcjonalnie do ilości miejsc pracy, czyli wszystko robi z łaski. Firmowy system śledzenia ticketów lubi wskazywać informacje typu &lt;q&gt;zlecenie oczekuje 2 dni 7 godzin 12 minut&lt;/q&gt;, a na bieżąco realizowane są właściwie tylko pierdoły typu zmiana hasła czy blokada konta. Zlecenie jakiejkolwiek większej zmiany jest do tego stopnia bezcelowe, że mam nieoficjalne przyzwolenie na wstęp do serwerowni i dostęp do maszyn z poziomu konsoli. W efekcie o infrastrukturze informatycznej firmy wiem więcej od osoby za nią odpowiedzialnej. Nie mogę się naszemu adminowi dziwić, bo pewnie pracy ma sporo. Tłumaczy się brakiem dokumentacji.&lt;/p&gt;

&lt;p&gt;Tylko że dokumentacja nie istnieje i nie zanosi się na jej powstanie. Chyba, że ja ją napiszę, bo radzę sobie bez niej jakoś. Admin, gdyby chciał to też by sobie poradził... chyba. Chyba, bo ciężko mi czasami wytłumaczyć fakt, że na prośbę o odpalenie któregoś chroota odpisuje mi pytaniem, na której partycji leżał ten chroot, jaki ma punkt montowania, czego wymaga i jak to włączyć. Ja mam w umowie napisane &lt;q&gt;programista&lt;/q&gt;... i chyba będę trzymał się tej specjalności, bo słowo &lt;q&gt;administrator&lt;/q&gt; zaczyna ostatnio nabierać silnie pejoratywnego nacechowania.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #006: Papież to, papież tamto</title>
   <link href="http://room-303.com/blog/2005/03/17/2f307ab2e50581858ab3d60b4f5317b4/"/>
   <updated>2005-03-17T20:42:57+00:00</updated>
   <id>http://room-303.com/blog/2005/03/17/2f307ab2e50581858ab3d60b4f5317b4</id>
   <content type="html">&lt;p&gt;Coś dla wszystkich, którzy mają choć trochę poczucia humoru i choć odrobinę dość czytania o tym, że Karol Wojtyła zjadł ogórka na śniadanie. Przepraszam, za marną jakość grafiki, ale jestem programistą, a nie grafikiem.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://patrys.icenter.pl/comic/006-pope.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #005: Dlaczego informatycy chodzą niewyspani</title>
   <link href="http://room-303.com/blog/2005/03/17/cbb718f936d6e9ab7dbde97baa718fb9/"/>
   <updated>2005-03-17T20:33:32+00:00</updated>
   <id>http://room-303.com/blog/2005/03/17/cbb718f936d6e9ab7dbde97baa718fb9</id>
   <content type="html">&lt;p&gt;Gdyby ktoś się zastanawiał, czemu chodzę z podkrążonymi oczami zamiast spać 8 godzin, jak człowiek...&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://patrys.icenter.pl/comic/005-sleep.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Dlaczego terminy są złe</title>
   <link href="http://room-303.com/blog/2005/03/04/55a3a29e07cf5fd7a42c8f4d673a004e/"/>
   <updated>2005-03-04T22:57:00+00:00</updated>
   <id>http://room-303.com/blog/2005/03/04/55a3a29e07cf5fd7a42c8f4d673a004e</id>
   <content type="html">&lt;p&gt;Niniejszy wpis jest owocem prac nad draftem specyfikacjy dla naszego systemu koordynacji projektu. Celowo nie mówię o &lt;q&gt;zarządzaniu projektem&lt;/q&gt;, bo projekt nie powinien być zarządzany, tylko skutecznie realizowany. W skutecznym realizowaniu przeszkadzają między innymi właśnie narzucane z góry terminy wykonania, choć często sam nakład prac nie może być z góry znany. Stąd mój postulat:&lt;/p&gt;

&lt;p&gt;Zadania dla zespołu nie powinny mieć przypisanych sztywnych terminów godzinowych na realizację. Dlaczego? Odpowiedź jest prosta – programiści, graficy, cały zespół odpowiedzialny za fizyczne wykonanie zadania nie lubi rozliczania godzinowego. System taki jest nieelastyczny i obniża morale ekipy zaangażowanej w realizację projektu. Prowadzi też często do frustracji z powodu braku możliwości wykonania pracy w założonym terminie (np. przez nawał innych, pilniejszych zleceń, niezwiązanych bezpośrednio z projektem, przez co nieuwzględnionych w grafiku projektu). Pracownik nie powinien się czuć winien z powodu niezależnych od niego opóźnień. Dostateczną motywacją do pracy powinien być deadline dla całego etapu, ustalony przez zbliżający się milestone.&lt;/p&gt;

&lt;p&gt;Milestone (&lt;q&gt;kamień milowy&lt;/q&gt;) to nazwa używana w odniesieniu do punktu zakończenia ważnego etapu w życiu projektu. Punktem takim może być moment wstępnej prezentacji draftów u klienta, moment zamknięcia specyfikacji technicznej (którego przekroczenie uniemożliwia wprowadzanie dalszych poprawek do założeń projektu), moment rozpoczęcia prac nad kodem, czy też finalny okres prób i końcowe wdrożenie projektu. W okresie pomiędzy kolejnymi kamieniami milowymi kolejność realizacji zadań jest właściwie obojętna. Najważniejsze jest bowiem zamknięcie wymaganej funkcjonalności na czas, klienta nie interesuje, czy prace nad jednym komponentem były zrealizowane przed pracami nad innym. Dlatego też uważam, że projekt nie powinien prowadzić sztywnego kalendarza prac (jak robi to phpCollab, gdzie każdemu zadaniu przypisujemy czas rozpoczęcia, szacowany nakład pracy i termin zakończenia). Zamiast tego powinien umożliwić stworzenie kilku kamieni milowych, a następnie pozwolić na wygodne przydzielenie zadań do milestone'ów. Niezrealizowane zadanie powinno mieć stan zadania blokującego, nie powinno dać się zamknąć etapu bez zamknięcia wszystkich zleceń przypisanych do danego okresu, bądź bez przesunięcia ich na jeden z dalszych &lt;q&gt;kamieni&lt;/q&gt;. Taki system prac pozwala bardziej elastycznie zarządzać własnym czasem poszczególnym członkom zespołu, ewentualne zależności pomiędzy zadaniami przypisanymi do różnych osób powinny być rozwiązane na poziomie priorytetyzacji listy i podziału na niezależne etapy (np. w przypadku realizacji systemu CMS nie powinno się przystępować do programowania systemu przed zamknięciem prac nad grafiką i interfejsem użytkownika).&lt;/p&gt;

&lt;p&gt;Z tych samych przyczyn jestem za całkowitą likwidacją procentowych pasków postępu prac nad zadaniem. Obecność takich wskaźników wywiera presję na pracowników. Członkowie zespołu myślą (często słusznie), że zbyt rzadkie uaktualnianie takich informacji będzie postrzegane jak nicnieróbstwo. Z kolei konieczność ciągłego wprowadzania danych o postępie zbędnie wydłuża czas potrzebny na realizację zlecenia. Zgrany zespół nie potrzebuje nadzorcy - galernika, który z batem w ręku wybija rytm pracy. Zespół powinien być rozliczany z zamkniętych etapów, a nie z godzin pracy spędzonych na poszczególnych elementach całości.&lt;/p&gt;

&lt;p&gt;Co zatem, jeśli któreś zadanie okaże się trudne w realizacji (czasochłonne bądź niewykonalne)? System powinien umożliwić pozostawienie takiej informacji w postaci komentarza do zadania bądź jako notki widocznej dla całego zespołu na stronie podsumowującej. Mamy tu do czynienia z analogią do bloga, systemem opierającym wymianę informacji na notatkach i komentarzach. Dlaczego? Blogi są wygodne, intuicyjne, bajecznie proste w obsłudze i mają miliony użytkowników, czego nie można powiedzieć o wielkobiznesowych kombajnach do ucisku wykonawców projektu. Co więcej, udostępnienie tych samych notek (wybiórczo) klientowi nie będzie wymagało dalszej obróbki - dostanie do dyspozycji informacje tekstowe, łatwe do czytania, dające mu ogólne pojęcie o postępie, ale nie przytłaczające go rzędami cyfr i wykresów. Klient ma na ogół wiele ciekawszych spraw na głowie niż porównywanie zestawień pomiędzy wizytami na stronie projektu, nie do pominięcia jest też fakt, że informacja &lt;q&gt;procedura zakupu domeny się przedłuża&lt;/q&gt; jest dalece więcej mówiąca niż fakt, że od dwóch tygodni proces realizacji utknął na poziomie 73%. Więcej grzechów nie pamiętam.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Szukam pomysłów</title>
   <link href="http://room-303.com/blog/2005/03/03/ee76c9ee651435bd1250319fabc19c28/"/>
   <updated>2005-03-03T19:37:33+00:00</updated>
   <id>http://room-303.com/blog/2005/03/03/ee76c9ee651435bd1250319fabc19c28</id>
   <content type="html">&lt;p&gt;Od kilku lat szukam dobrego narzędzia do organizacji pracy grupowej. Jest sobie &lt;a href=&quot;http://www.php-collab.org/&quot;&gt;phpCollab&lt;/a&gt; - od początku mój faworyt i ulubione narzędzie pracy, są i inne systemy. Wszystkie robią praktycznie to samo - umożliwiają zarządzanie projektem. Problem w tym, że żaden nie pozwala robić tego efektywnie. Reklamują się różnymi ficzerami, mają piękne zestawienia, wykresy, tabelki, fukcje liczące efektywność zespołu i poszczególnych członków, integrację z bugtrackerami, przypominacze, kalendarze osobiste, książki adresowe, rozliczenia z klientami itp. Wszystko byłoby dobrze, gdyby ktoś tego potrzebował. W każdej firmie szef jest jeden, pracowników wielu. W grupach zrzeszających freelancerów szefa nie ma wcale. Dlaczego więc nie istnieje żaden system, który przede wszystkim jest wygodny, a dopiero później przynosi szefowi gazetę w zębach? Ano istnieje, płatny. Nazywa się &lt;a href=&quot;http://basecamphq.com/&quot;&gt;Basecamp&lt;/a&gt; i nim też interesuję się od dłuższego czasu. Wczoraj, po kolejnym przejrzeniu wszystkich screenów i listy zalet, a także lekturze kilku poważnych artykułów na temat jego użyteczności, postanowiłem zbudować taki system na własne potrzeby.&lt;/p&gt;

&lt;p&gt;Idea jest prosta: zbudować system, który pomoże w wygodnym zarządzaniu projektem w webdevelopingu. Czysty, przejrzysty, wygodny. Bez zbędnych tabelek i wykresów generowanych przez paskudne skrypty GD na potrzeby High Council w megakorporacjach. Potrzebne jest narzędzie, którego używanie będzie tak proste jak prowadzenie bloga. Oparte na liście zadań przypisanych do pracownika i projektu, z systemem weblogowej wymiany informacji tekstowych (notek) i weblogowymi komentarzami. Do tego możliwość załączania plików do notek, podpinania linków do tasklisty, kalendarz (który służy tylko i wyłącznie do wyświetlania zaległych i przyszłych terminów) i prosty podział na fazy projektu (zwykłe kategorie  postów, ewentualnie możliwość ustawienia któregoś z tasków jako milestone, a innym nadania statusu blokującego dany milestone).&lt;/p&gt;

&lt;p&gt;Dla projektów zewnętrznych powinna być możliwość przypisania klienta, a jego pracownikom umożliwienie śledzenia postępu nad pracami za pomocą jakiegoś prostego interfejsu (z możliwością dodawania notek).&lt;/p&gt;

&lt;p&gt;Z dodatkowych umilaczy: obowiązkowa obsługa RSS (jeśli się da, to wszystkiego - projektów, notek, komentarzy, todo), miło byłoby też wspierać iCal/vCal (do podpięcia tasklisty pod Evolution lub Sunbirda chociażby). Zastanawiam się też nad integracją z botem powiadamiającym na jabbera, bo to często szybsze i wygodniejsze niż poczta.&lt;/p&gt;

&lt;p&gt;Interfejsem zajmę się z Jarvisem, który przygotuje niedługo projekt graficzny (tutaj chciałbym iść w kierunku Basecamp). Problem zaś tyczy się funkcjonalności, bo zanim zaczniemy wdrażanie pomysłu, dobrze mieć zamkniętą listę oczekiwań. Może ktoś z was ma jeszcze jakiś pomysł? Coś, co widzieliście w jednym systemie, ale brakuje tego w drugim? Coś ułatwiającego pracę? Całość ma być nastawiona przede wszystkim na zespół. Nie chcę kolejnego napakowanego statystykami systemu, który dla zwykłych pracowników wygląda jak plik Worda po imporcie do notatnika lub jak widok źródła strony wykonanej we FrontPage'u.&lt;/p&gt;

&lt;p&gt;Miło byłoby, gdybym mógł efekt udostępnić za darmo (przynajmniej do użytku prywatnego), ale obiecać nic nie mogę. Może się nagle okazać, że firma będzie zainteresowana przejęciem projektu (co byłoby mi na rękę finansowo i ze względu na czas, jaki będę mógł poświęcić na rozwijanie pomysłu).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Proza życia codziennego</title>
   <link href="http://room-303.com/blog/2005/03/02/b00d7f5dc9f4b5378155f87aa29c7308/"/>
   <updated>2005-03-02T18:45:09+00:00</updated>
   <id>http://room-303.com/blog/2005/03/02/b00d7f5dc9f4b5378155f87aa29c7308</id>
   <content type="html">&lt;p&gt;W pewnej firmie źle się stało,&lt;br /&gt;
coś działało i przestało.&lt;br /&gt;
Nie można podnieść apacza,&lt;br /&gt;
nie startuje, się wykrzacza.&lt;br /&gt;
Brak HTTP obsługi -&lt;br /&gt;
zapowiada się dzień długi.&lt;br /&gt;
Czyja mogła to być wina?&lt;br /&gt;
Mamy nowego admina,&lt;br /&gt;
ma on zalet co niemiara,&lt;br /&gt;
lecz największa z nich to wiara,&lt;br /&gt;
że nic złego się nie stanie,&lt;br /&gt;
że usługa prędko wstanie,&lt;br /&gt;
nie zepsuje się, nie padnie,&lt;br /&gt;
będzie nadal działać ładnie.&lt;br /&gt;
Lecz zawiodła medytacja,&lt;br /&gt;
apacza konfiguracja&lt;br /&gt;
okazała się wadliwa,&lt;br /&gt;
a sam apacz tylko zbywa,&lt;br /&gt;
twierdząc, że się uruchamia.&lt;br /&gt;
Admin grzechem zaniedbania,&lt;br /&gt;
wierząc w duchu w świat Utopii,&lt;br /&gt;
nie wykonał wcześniej kopii.&lt;br /&gt;
Przez szefa przekazał grupie:&lt;br /&gt;
&quot;panowie, jesteśmy w dupie&quot;.&lt;br /&gt;
A nadzieja, oczywiście,&lt;br /&gt;
cała w biednym programiście,&lt;br /&gt;
co, z powodu swej choroby,&lt;br /&gt;
miał plan - przespać resztę doby.&lt;br /&gt;
Siadłem przeto do konsoli,&lt;br /&gt;
sprawdzam w logach, co go boli,&lt;br /&gt;
lecz, niestety, nie ma śladów,&lt;br /&gt;
brak objawów jakichś padów.&lt;br /&gt;
Szeroko pojęta bida,&lt;br /&gt;
proces znika, brak też PIDa,&lt;br /&gt;
jednak zamiast panikować,&lt;br /&gt;
zapragnąłem go strace'ować.&lt;br /&gt;
Dziwnych rzeczy kilkanaście,&lt;br /&gt;
w końcu sygnał jedenaście.&lt;br /&gt;
Poprosiłem więc admina,&lt;br /&gt;
by moduły powycinał.&lt;br /&gt;
Jeden na raz komentował&lt;br /&gt;
i w ten sposób zdiagnozował.&lt;br /&gt;
Koniec końców się udało,&lt;br /&gt;
wyciął IMAP - zadziałało.&lt;br /&gt;
Tu przyczynę miała klapa -&lt;br /&gt;
głupi moduł do PeHaPa.&lt;br /&gt;
Zwykły restart, sprawa mała,&lt;br /&gt;
dwie godziny prawie trwała.&lt;br /&gt;
Jak więc uczy statystka -&lt;br /&gt;
bez backupu, nie dotykaj.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #004: O wsparciu w PLD</title>
   <link href="http://room-303.com/blog/2005/02/28/7b188e22862956275a7993dc0f4f1c02/"/>
   <updated>2005-02-28T20:52:01+00:00</updated>
   <id>http://room-303.com/blog/2005/02/28/7b188e22862956275a7993dc0f4f1c02</id>
   <content type="html">&lt;p&gt;Adam Słodowy przedstawia: pierwsza zasada w PLD - zrób to sam ;]. Oczywiście, przesadzam.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://patrys.icenter.pl/comic/004-user-support.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Wersja przetłumaczona:&lt;/p&gt;

&lt;p&gt;- Przepraszam, ale w PLD nie da się skonfigurować XYZ.&lt;br /&gt;
- &lt;abbr title=&quot;Standardowa Odpowiedź Administratora&quot;&gt;SOA&lt;/abbr&gt;#1: u mnie działa&lt;br /&gt;
- Ale przecież nie ma w PLD takiego pakietu.&lt;br /&gt;
- &lt;abbr title=&quot;Standardowa Odpowiedź Dewelopera&quot;&gt;SOD&lt;/abbr&gt;#1: przykro nam, zrób sobie sam&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Rzecz o obsłudze w pionie na poziomie</title>
   <link href="http://room-303.com/blog/2005/02/28/d6a5a8d068343a00222f1f300fc9ff91/"/>
   <updated>2005-02-28T19:42:32+00:00</updated>
   <id>http://room-303.com/blog/2005/02/28/d6a5a8d068343a00222f1f300fc9ff91</id>
   <content type="html">&lt;p&gt;Budowanie systemów &lt;abbr title=&quot;Content Management System&quot;&gt;CMS&lt;/abbr&gt; wiąże się z potrzebą ich późniejszej sprzedaży klientom. W końcu jakaż byłaby korzyść z posiadania nieprzebranej ilości takich narzędzi na własny użytek. Klienci są niestety świadomi faktu nieprzydatności nieużywanych systemów, toteż starają się ze wszystkich swoich sił spożytkować swój nowy nabytek. Oczywiście, &lt;q&gt;wszystkie swoje siły&lt;/q&gt; nie są zbyt duże w przypadku ludzi niespecjalnie &lt;q&gt;ukomputeryzowanych&lt;/q&gt;, zwłaszcza tych uważających sieć za jeden duży dokument Worda. W końcu przychodzi dzień objawienia i radość używania kodu &lt;abbr title=&quot;HyperText Markup Language&quot;&gt;HTML&lt;/abbr&gt; (na poziomie wersji 3.0) do formatowania tekstu. Wszystko zaczyna migać, świecic, kończy się era spójności graficznej serwisu. Niestety, większość przenosi swoje złe nawyki z programów typowo biurowych (a są złe o tyle, że do definiowania warstwy prezentacyjnej powinno się używać atrybutów akapitu, a nie spacji i linebreaków). Klient wie jednak lepiej, a nasza rola sprowadza się do zapewnienia, że w całym serwisie precyzyjnie &lt;q&gt;wyspacjowane&lt;/q&gt; teksty będą wyglądać identycznie i żaden nie śmie nawet pomyśleć o zawinięciu się do drugiej linii. To samo odnosi się do odstępów wygenerowanych w pocie czoła przez nadużycie wymuszonych breaków.&lt;/p&gt;

&lt;p&gt;Wiadomość od klienta początkowo wydała nam się wyjątkowo kiepskim żartem. Moje wstępne przekonanie zostało potwierdzone przez rzucenie okiem na okno przeglądarki. Nie, to nie mogła być prawda, brzmiało wyjątkowo niedorzecznie. Wszystko było w najlepszym porządku. To przecież bzdura, żeby komuś znikały breaki. Klient twierdził, że w kodzie strony są, a w przeglądarce ich nie ma. Tak bezsensowne zachowanie przeglądarki nie może mieć miejsca... chyba, że jest się użytkownikiem Internet Explorera.&lt;/p&gt;

&lt;p&gt;Początkowe efekty obejrzenia strony w IE to napady szaleńczego śmiechu. Co drugi break egzystował na swoim miejscu, reszta - jako jeden mąż - odeszła samoczynnie w niebyt. W kodzie pojawiają się bez problemu, Explorer ich nie wyświetla. Cóż - zjawisko to widzę pierwszy raz w życiu. Sprawdziłem wszystko walidatorem. Zero śladów, brak punktu zaczepienia. Odpowiedź leżała jednak w &lt;abbr title=&quot;Cascading Style Sheets&quot;&gt;CSS&lt;/abbr&gt;. Potężna salwa chichotu wstrząsnęła budynkiem w posadach, problematyczną regułą okazało się bowiem:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;code&gt;letter-spacing: 0.01em;&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Jak widać, w pewnej firmie z siedzibą w Redmont wszystko jest możliwe. Póki co, klientowi przedstawiliśmy sugestię korzystania z dobrodziejstwa paragrafów. Jeśli się nie zgodzi, to mamy poważny problem - tekst bez rozsuwania znaków nie nadaje się do czytania, tekst z rozsuwaniem skleja się w jeden klocek. Z punktu widzenia klienta sprawa zawsze jest trywialna, &lt;q&gt;naprawcie&lt;/q&gt;...&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #003: Upiór w operze</title>
   <link href="http://room-303.com/blog/2005/02/22/93ac7000e303c28fedf0e93a9b874a06/"/>
   <updated>2005-02-22T23:19:42+00:00</updated>
   <id>http://room-303.com/blog/2005/02/22/93ac7000e303c28fedf0e93a9b874a06</id>
   <content type="html">&lt;p&gt;Po pierwszym stripie wywiązała się &lt;a href=&quot;http://cachotterie.jogger.pl/comment.php?eid=96239&quot; title=&quot;jogger Cachotterie&quot;&gt;mała dyskusja o przeglądarkach&lt;/a&gt; ;]. W związku z tym publikuję kolejny odcinek z dedykacją dla &lt;a href=&quot;http://czajna-seczen.jogger.pl/&quot; title=&quot;Czajna&quot;&gt;Czajny&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://patrys.icenter.pl/comic/003-browsers.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #002: Usability nie zawsze pomaga w życiu</title>
   <link href="http://room-303.com/blog/2005/02/20/ef67c898b2ce980887a5aa000464e3d4/"/>
   <updated>2005-02-20T23:39:38+00:00</updated>
   <id>http://room-303.com/blog/2005/02/20/ef67c898b2ce980887a5aa000464e3d4</id>
   <content type="html">&lt;p&gt;Cóż, starcia z &lt;a href=&quot;http://cachotterie.jogger.pl/&quot; title=&quot;Cachotterie&quot;&gt;Elfką&lt;/a&gt; nie wytrzymałby nawet &lt;a href=&quot;http://useit.com&quot;&gt;Jakob Nielsen&lt;/a&gt;. ;)&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://patrys.icenter.pl/comic/002-hig.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Strip #001: Nie drażnij lwa</title>
   <link href="http://room-303.com/blog/2005/02/20/bbbb8ec8e3126563142a996329a3dd8b/"/>
   <updated>2005-02-20T21:09:56+00:00</updated>
   <id>http://room-303.com/blog/2005/02/20/bbbb8ec8e3126563142a996329a3dd8b</id>
   <content type="html">&lt;p&gt;Ktoś jeszcze ma w związku takie problemy, jak wybór przeglądarki? ;)&lt;/p&gt;

&lt;p class=&quot;strip&quot;&gt;&lt;img src=&quot;http://patrys.icenter.pl/comic/001-opyra.png&quot; alt=&quot;Tutaj w graficznych przeglądarkach wyświetla się komiks&quot; /&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Marketing po bożemu</title>
   <link href="http://room-303.com/blog/2005/02/20/553c47dc03c8914176d3c5904a806202/"/>
   <updated>2005-02-20T12:22:31+00:00</updated>
   <id>http://room-303.com/blog/2005/02/20/553c47dc03c8914176d3c5904a806202</id>
   <content type="html">&lt;p&gt;Nie od dziś wiadomo, że przeciętnemu użytkownikowi absolutnie nie zależy na jakichkolwiek standardach. Nie interesują go rewolucyjne technologie siedzące pod maską czegoś tak podstawowego, jak przeglądarka internetowa. Podstawowe wymaganie jest jedno, przeglądarka ma działać i mają się w niej prawidłowo wyświetlać strony internetowe.&lt;/p&gt;

&lt;p&gt;&quot;Prawidłowo&quot; nie oznacza, niestety, interpretacji zdefiniowanej przez &lt;abbr title=&quot;World Wide Web Consortium&quot;&gt;W3C&lt;/abbr&gt; - użytkownik oczekuje, że strony będą wyświetlać się tak, jak w &lt;abbr title=&quot;Internet Explorer&quot;&gt;IEvil&lt;/abbr&gt;. Mniej lub bardziej oznacza to zgodność z tag soup i quirks mode, a na to użytkownicy współczesnych przeglądarek (tych ustandaryzowanych) liczyć nie mogą.&lt;/p&gt;

&lt;p&gt;Jak więc ich przekonać, że standardy są dobre, że strony nie działają przez to, że autor użył narzędzi tak wyrafinowanych jak &lt;abbr title=&quot;MicroSoft&quot;&gt;MS&lt;/abbr&gt; FrontPage? A może nie warto, może lepiej odwołać się do wewnętrznych instynktów i pokazać użytkownikom &lt;a href=&quot;http://www.deviantart.com/view/10809287/&quot;&gt;słodką wersję Firefoksa&lt;/a&gt;? ;)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Teoria względności upływu czasu</title>
   <link href="http://room-303.com/blog/2005/02/19/380f4c3f89fedeb9fd704b01c0b82770/"/>
   <updated>2005-02-19T00:34:03+00:00</updated>
   <id>http://room-303.com/blog/2005/02/19/380f4c3f89fedeb9fd704b01c0b82770</id>
   <content type="html">&lt;p&gt;Jak to się dzieje, że czas, choć teoretycznie liniowy, zawsze płynie w złym tempie. Co gorsza, tempo zdaje się zawsze zmieniać przeciw proporcjonalnie do naszych oczekiwań, posiada w tym kierunku przerażające zdolności adaptacyjne. Im bardziej staramy się go zabić - tym bardziej się wlecze, im bardziej zależy nam na nim - tym szybciej ucieka. Oczywiście, ktoś może powiedzieć, że to wrażenie jest wywoływane nadmiernym skupianiem się nad upływem czasu (przez co tracimy cenny czas na myślenie o tym, że go tracimy lub też wyłączamy swoje podczaszkowe uzwojenie w oczekiwaniu na przeskok wskazówki sekundnika). Ostatnio jednak trafił mi się lepszy test-case w real-life niż ktokolwiek mógłby sobie wymyślić w warunkach laboratoryjnych.&lt;/p&gt;

&lt;p&gt;Przyszło mi bowiem odwiedzić pewną &lt;a href=&quot;http://cachotterie.jogger.pl/&quot; title=&quot;Cachotterie&quot;&gt;przemiłą młodą damę&lt;/a&gt;. Odwiedzanie się jest rzeczą naturalną, trochę tylko mniej naturalną, kiedy od celu dzieli cię lekko 165 kilometrów drogi, a nie dysponujesz żadnym pojazdem na własność (tudzież uprawnieniami do prowadzenia takiego pojazdu, nawet gdyby był). Z obserwacji moich wynika przeto niezbicie, że czas w sytuacjach wyjątkowo wyczekiwanych ma przebieg funkcji logarytmicznej. Mężczyzna jest jednak jednostką silną i odporną na ból (choć część kobiet twierdzi, że jest inaczej ze względu na poród - kochane, wasz poród jest niczym w porównaniu z tym, co prawdziwy mężczyzna przeżywa rano w toalecie po dobrze przepitej nocy), toteż doczekać udało się bez większych strat w pogłowiu jednoosobowego stada ze mną w składzie.&lt;/p&gt;

&lt;p&gt;Po przyjeździe czas postanowił nadrobić, tak jak nadrabiają kierowcy autobusów - nie bacząc na staruszki na pasach i wdzięczące się na chodnikach panie, prują na złamanie szyi przez środek wszystkich wypatrzonych kałuży (istnieje nawet teoria, która mówi, że woda wypełnia mikroszczeliny na poziomie atomowym pomiędzy oponą autobusu a ulicą, co poprawia jego warunki przyczepności - nie mogę tego zweryfikować do końca, choć polskie drogi faktycznie obfitują w szczeliny, a i przyczepności nie można odmówić substancji, którą zostajemy ochlapani przez mijający nas autobus). Z piątkowego wieczoru w okamngnieniu zrobiło się niedzielne popołudnie. Mimo szczerych deklaracji providerów hostingu, warunki zawodowe nie pozwoliły mi zapuścić w Poznaniu korzeni, zmuszon więc zostałem coby w drogę powrotną ruszyć. A i sam nei byłem, jako że towarzyszyć miała mi niejako w odwecie (za spustoszenie lodówki oraz próby instalacji Firefoksa pod Windows spowodowane padem tamtejszego dysku z PLD) sama &lt;a href=&quot;http://cachotterie.jogger.pl/&quot; title=&quot;Cachotterie&quot;&gt;Lila Javovich&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Warto nadmienić przy okazji, że na samym poznańskim dworcu zaskarbiłem sobie znajomość z szefem lokalnej przestępczości zorganizowanej. Już po ustawieniu się w kolejce do kasy, podszedł do nas strojny w antyczne przebrania gitowców pan i, patrząc w przestrzeń, konspiracyjnym tonem wyszeptał hasło:&lt;/p&gt;

&lt;p&gt;- Do Wrocławia?&lt;br /&gt;
- Tia.&lt;br /&gt;
- Mam bilet.&lt;/p&gt;

&lt;p&gt;Sam fakt posiadania biletu był godzien podziwu, zwłaszcza w tak osobliwym miejscu, jak dworzec kolejowy. Nie odrzekłem więc nic na to, a on nie dał mi długo zastanawiać się nad celem tej - jakże ożywionej - dyskusji:&lt;/p&gt;

&lt;p&gt;- Do sprzedania! Studencki!&lt;/p&gt;

&lt;p&gt;Tu zrobiło mi się ciepło na sercu. Miło patrzeć, kiedy ludność nawet w takiej sytuacji dba o swoje wykształcenie i uzupełnia luki edukacyjne. Może ja nie wyglądam na typowego studenta (a już z pewnością nie na typowego studenta informatyki), ale mój rozmówca musiał robić wyjątkową furorę samym swoim pojawieniem się na wykładzie. Głównie ze względów aromatycznych.&lt;/p&gt;

&lt;p&gt;- Dziękuję, kupię sobie w kasie.&lt;br /&gt;
- Ale ja mam!&lt;br /&gt;
- Ale ja wolę nie ryzykować.&lt;br /&gt;
- Ale jakie ryzyko, ja zaraz potwierdzę w kasie, że ważny.&lt;/p&gt;

&lt;p&gt;I nieproszony poleciał potwierdzać. A niechby ten bilet i miał rezerwację na prywatny przedział z łazienką i kuchnią. Pozostałem nieugięty:&lt;/p&gt;

&lt;p&gt;- Dziękuję panu.&lt;/p&gt;

&lt;p&gt;Znieważony jegomość nie mógł przełknąć takiej hańby. Nie uniósł się ambicją i nie rozszarpał mnie na miejscu, miast tego pochylił się spokojnie i głosem Bogusława Lindy dokonującego kolejną egzekucję na ekranie, wycedził przez zęby:&lt;/p&gt;

&lt;p&gt;- Stary... jeszcze dziś wieczorem zginiesz.&lt;/p&gt;

&lt;p&gt;Po rytualnej wymianie uprzejmości pan raczył oddalić się w kierunku innych potencjalnych kontrahentów, my zaś z radością kupiliśmy bilety i zajęliśmy miejsca w pociągu.&lt;/p&gt;

&lt;p&gt;Plan wstępny: mamy caaaałe dwa dni, masa czasu, potem moja piękniejsza połowa wraca do swojego miasta. Plan tyle optymistyczny, co naiwny. Owe &quot;całe&quot; dwa dni minęły jak z bicza strzelił (pomijając czas, kiedy byłem w pracy), zmuszeni zostaliśmy wobec tego do podjęcia drastycznych środków - przedłużenia pobytu do środy. Środa była terminem ostatecznym, nic nie mogło już pokrzyżować naszych planów. Ustaliliśmy godzinę odjazdu z Wrocławia, umówiliśmy się u mnie w pracy, plan &quot;B&quot; był dopracowany do ostatniego szczegółu - nauczeni porażką planu &quot;A&quot; wzięliśmy pod rozwagę nieliniowy przebieg funkcji czasu i uwzględniliśmy wszelkie możliwe przeciwności losu, mogące powstrzymać nas przed realizacją. Plan był tak doskonały, że oczywiście poległ sromotnie w starciu z rzeczywistością. Nie będę tutaj zagłębiał się w zbytnie szczegóły, postaram się za to wypunktować kilka ważnych rzeczy, o których należy pamiętać:&lt;/p&gt;

&lt;p&gt;Po pierwsze - godzina czasu powinna na dotarcie do dworca wystarczyć każdemu (tak jak każdemu wystarcza 640 kB RAM), zwłaszcza, jeśli droga w normalnych warunkach zajmuje 20 minut;&lt;/p&gt;

&lt;p&gt;Po drugie, kiedy nie chce się czekać na autobus, zawsze należy skracać sobie oczekiwanie przez podróż pieszo na następny przystanek - można iść bez obawy, środki komunikacji miejskiej znane są z tego, że zawsze czekają na spóźnionych pasażerów nawet w połowie trasy;&lt;/p&gt;

&lt;p&gt;Po trzecie - w połowie pieszej wycieczki dobrze jest zażartować w tonie &quot;wolałabym tak sobie z tobą spacerować i nigdy nie dojść na ten dworzec&quot;. A teraz wersja dla tych, którzy muszą mieć wesoły wątek na końcu każdego posta:&lt;/p&gt;

&lt;p&gt;Jak długo mieszkam we Wrocławiu (a jeszcze w tym roku stukną 23 lata), w życiu nie zdarzyło mi się jeszcze zgubić w tym mieście. Gdziekolwiek. Nigdy nie znalazłem się w sytuacji typu &quot;jak ja się tu znalazłem&quot;. Do czasu. Gdy tak sobie spacerowaliśmy na ten dworzec, rozmawialiśmy sobie spokojnie, wymienialiśmy poglądy, mówiliśmy, słuchaliśmy. Było przepięknie, przynajmniej do czasu. Do czasu, kiedy podniosłem wzrok do góry i spytałem głośno &quot;gdzie my jesteśmy?&quot;. Krótkie spojrzenie na zegarek ujawniło, że siedmiominutową trasę pokonujemy już prawie minut dwadzieścia, a dworca nie widać na horyzoncie, choć na początku trasy było go wyraźnie widać. Tak. Zgubiłem się, przez całą drogę ani razu nie zwróciłem uwagi na to, czy dorbze skręcamy i czy chociaż kierunek się zgadza. Oczywiście na pociąg nie było szans dotrzeć o czasie i moja elfia czarodziejka spędziła kolejną noc u mnie w domu (ku mojej uciesze wielkiej).&lt;/p&gt;

&lt;p&gt;I niech mi teraz ktoś powie, że faceci nie słuchają kobiet w czasie rozmowy. ;)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Antychryst we własnej osobie</title>
   <link href="http://room-303.com/blog/2005/02/01/1175e1ceccdbb4d562eece5fea7cb6c4/"/>
   <updated>2005-02-01T19:32:02+00:00</updated>
   <id>http://room-303.com/blog/2005/02/01/1175e1ceccdbb4d562eece5fea7cb6c4</id>
   <content type="html">&lt;p&gt;Poniżej przedstawiam, jak dalece lotny artykuł popełnił &lt;a href=&quot;http://bluszcz.jogger.pl/&quot;&gt;bluszcz&lt;/a&gt;, jeden z redaktorów &lt;a href=&quot;http://7thguard.net&quot;&gt;7thGuarda&lt;/a&gt;. Dodać należy, że artykuł umieszczony został na głównej stronie serwisu. Ubawiło mnie to setnie, nawet SuperExpress nie skleciłby lepszego tekstu. Nikt też nie umiałby lepiej wyciąć z kontekstu moich wypowiedzi. Poniżej moja odpowiedź z powyższego serwisu, gdyby ktoś jeszcze chciał mnie nazwać antychrystem. Zapytuję jednak, po jakie media Pan bluszcz raczy sięgnąć przy kolejnym moim wpisie? Mogę liczyć na własny odcinek &quot;Pod napięciem&quot;? Już to widzę - &quot;młody programista z Wrocławia, mimo wielokrotnych wezwań sądu, nie chce poklikać - co na to nasi eksperci?&quot;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Wroga trzeba umieć sobie znaleźć - tak brzmi stare powiedzenie. Polscy jabberowcy (łącznie z autorem niniejszej notki) zwykli zdobywać fortece konkurencyjnych komunikatorów - Gadu Gadu i Tlen.pl. Co ambitniejsi podłożyli ogień pod polskiego blog-monopolistę udostępniając uwielbiany przez wielu serwis JoggerPL. To właśnie na tym serwisie jeden wyjątkowo zaangażowany jabberowiec zauważył nowego demona zła.&lt;/p&gt;

&lt;p&gt;Poniższa historia uświadomiła mi, że nie jestem na bieżąco z obowiązującą polityką jabberową w naszym kraju - kiedyś walczyliśmy o otwarcie serwerów Tlen.pl na polską sieć, cieszyliśmy się z posunięć Wirtualnej Polski, a teraz?&lt;/p&gt;

&lt;p&gt;Nowym zagrożeniem okazało się Hapi.pl, bazujący na protokole XMPP komunikator biorący za grupę docelową nietechnicznych nastolatków. Jego autorzy (być może po prześledzeniu doświadczonego WP i Tlen.pl) zdecydowali się od razu otworzyć komunikację między serwerową. Niestety, nie przewidzieli, że trendy się pozmieniały...&lt;/p&gt;

&lt;p&gt;Czymże zasłużyliśmy? - głos przepełniony cierpieniem, żalem i goryczą roznosi się po pustkowiach, a także na blogu (przepraszam, jogu!) obrońcy elitarnych wartości. Aby wojownik miał pewność, że zostanie usłyszany, zostawił także odpowiednią notkę na forum użytkowników Hapi.pl.&lt;/p&gt;

&lt;p&gt;O, przepraszam - w dalszym ciągu nie napisałem, jakie zagrożenie stanowi Hapi.pl - już wyjaśniam. Użytkownicy Hapi.pl to horda matołów - a przecież Jabber jest wolny od &quot;koFFanyH pAniEnEk&quot;, &quot;1337 haxx0rów&quot; i tłumów zbyt skąpo obdarownaych przez życie intelektem dzieci.. Nasz wyzwoliciel nie boi się okazać swojej trwogi, i pyta: Dlaczegóż chcecie więc nam, bogu ducha winnym użytkownikom, zgotować los tak marny? Dręczony cierpieniem sugeruje autorom dodać system automatycznego rozsyłania/forwardowania łańcuszków. Finalnie autor ukazuje swoją bezradność: Być może nie rozumiem waszej motywacji, może są w tym jakieś cele wyższe, wtóruje mu jedna z jabberowych niewiast: Nawet jak bronić sie nie będzie :( (oczami wyobraźni widzę w tym momencie palone setkami wioski podczas sesji RPG).&lt;/p&gt;

&lt;p&gt;Osoby pragnące poznać szerzej temat mogą poczytać komentarze różnych osób na wyżej wymienionych stronach, niemniej nasuwa się pytanie - jaki jest sens życia w getcie (tak, pojawiają się propozycje filtrowania). Osobiście cieszę się, z takich inicjatyw jak Hapi.pl. Cieszę się, że mogę w końcu nietechnicznym znajomym polecić prosty komunikator, być może docenią go też rodzice nie chcący katować swoich pociech skomplikowanymi wynalazkami (tak tak, Psi jest skomplikowane dla ZU). A co sądzą o tym czytelnicy serwisu?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bawi mnie wolność wypowiedzi w naszym kraju. Nagłówek mojego posta zaczynał się słowami, że piszę tylko i wyłącznie w swoim imieniu. Niejaki bluszcz zrobił z tego protest na skalę światową. Czekam na fotomontaże, jak z transparentem biegam pod oknami autorów hapiego (i pandiona generalnie). Na drugim transparencie mam napisane &quot;windowsa używają tylko idioci&quot;, a na zapasowym, który strategicznie wisi na moich plecach, widnieje hasło &quot;31337&quot;.&lt;/p&gt;

&lt;p&gt;Cieszy mnie też, że poziom edukacji narodu stoi tak wysoko, że prawie nikt nie zrozumiał, o co mi chodzi. Jabber po prostu nie jest gotowy na popularyzację, a w 100% nie jest na to gotowa Polska. Ludzie na świecie nie będą nas oceniać po poziomie średnim, tylko właśnie po tych kilkudziesięciu &quot;koFFanyH&quot; jellonkach.&lt;/p&gt;

&lt;p&gt;Do Hapi nie miałem zupełnie nic. Do czasu. Do czasu, kiedy to w ciągu dwóch tygodni odebrałem kilkanaście wiadomości typu:&lt;/p&gt;

&lt;p&gt;- HEJ!!! jak zmienić emotki!!&lt;br /&gt;
- jakie emotki znowu&lt;br /&gt;
- No W HAPI!!!&lt;/p&gt;

&lt;p&gt;Tudzież:&lt;/p&gt;

&lt;p&gt;- CZESC GDZIE MGOE ZMIENC TEN OBRAZEK ?&lt;/p&gt;

&lt;p&gt;Czy też:&lt;/p&gt;

&lt;p&gt;- Ej Tez jestem Z Wroclawia dodoam cie Do listy pozdro!&lt;/p&gt;

&lt;p&gt;Nie będę wklejał reszty cytatów, poziom identyczny. Nie, nie jest wyjściem usunięcie się z katalogu. Nie, nie jest wyjściem blokowanie ludzi spoza listy. Nie po to powstał pieprzony katalog i nie po to jest możliwość odezwania się do kogoś bez potrzeby dodawania go do rostera, żebym teraz musiał zacząć autoryzować kontakty przez telefon komórkowy.&lt;/p&gt;

&lt;p&gt;Ja nie protestuję przed otwieraniem jabbera, jabber zawsze był otwarty. Nie lubcie tylko wody z mózgu ludziom, których część ma już tam dość sporo owego płynu. Dlaczego WP mogło napisać na stronie, że to nie jest GG, że to JABBER? A dlaczego Hapi jest tak biedne, że najpierw wydaje komunikator i &quot;ludzie, ściągajcie, a słowo wstępne, regulamin i instrukcję obsługi kiedyś się dopisze&quot;? Pewnie, prościej puścić ludzi na sieć, o resztę mogą spytać zwykłych userów (czy też &quot;elitę&quot; - jak bluszcz nazywa ludzi ceniących sobie prywatność).&lt;/p&gt;

&lt;p&gt;Być może jestem polskim Adolfem Hitlerem, może wierzę w ubermensch, może jestem nazustą, faszystą i rasistą. A może niektórzy są tak ograniczeni, że krytykę komunikatora traktują jak zamach na całą ideę OpenSource. Przykro mi was czytać, w OS mam własny wkład, od lat promuję otwarte standardy, ale w życiu mi nie przyszło do głowy dać komuś pistolet (ba - OtwartyPistolet!) i powiedzieć &quot;baw się dobrze, jak kogoś zastrzelisz to nie nasza brocha - instrukcji nam się pisać nie chce&quot;. Przykro mi też, że 7thGuard, którego czytam od dawna, opublikował artykuł o poziomie brukowca. Tylko czekać, aż zaczną się pojawiać artykuły w stylu &quot;12-letnia Zuzia, głos pokolania, na swoim blogu śmie twierdzić, że Pepsi jest lepsza od Coca-Coli&quot;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Czymże zasłużyliśmy?</title>
   <link href="http://room-303.com/blog/2005/01/29/7e0b1892dc0b372a8a6a3a19af3034fa/"/>
   <updated>2005-01-29T22:06:29+00:00</updated>
   <id>http://room-303.com/blog/2005/01/29/7e0b1892dc0b372a8a6a3a19af3034fa</id>
   <content type="html">&lt;p&gt;Od jakiegoś czasu napadają mnie pierwsze Jellonki na jabberze. Nie wytrzymałem. &lt;a href=&quot;http://www.hapi.pl/&quot;&gt;Hapi&lt;/a&gt; nie ma racji bytu.&lt;/p&gt;

&lt;p&gt;Na ichnim forum zostawiłem im &lt;a href=&quot;http://www.hapi.pl/forum/viewtopic.php?t=45&quot;&gt;wiadomość&lt;/a&gt; o poniższej treści:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Witam,&lt;br /&gt;
&lt;br /&gt;
Piszę jako członek polskiej społeczności jabberowej, lecz nie piszę w jej imieniu. Zawarta poniżej treść jest prywatną opinią jej autora i nie może być odbierana w jakikolwiek inny sposób.&lt;br /&gt;
&lt;br /&gt;
Od dawna jestem szczęśliwym użytkownikiem jabbera (jak większość geeków, programistów linuksowych, sysadminów i innych pochodnych antysocjalnych społeczności komputerowych). Szczęśliwym o tyle, że jabber od zawsze wolny był od przeróżnych &quot;koFFanyH pAniEnEk&quot;, &quot;1337 haxx0rów&quot; i tłumów zbyt skąpo obdarownaych przez życie intelektem dzieci. Wielokrotnie już zastanawiałem się nad całkowitym odłączeniem transportu GG, a to za sprawą tyle napastliwych co napalonych &quot;trzynastek&quot;, a to za sprawą ludzi, którzy są tak ubodzy w zainteresowania, że nie widzą lepszej metody zagospodarowania czasu, niźli tylko zaczepianie losowych osób &quot;szczęśliwie&quot; wybranych z czeluści katalogu użytkowników. Od zawsze na transport GG patrzyłem jak na opcjonalne połączenie świata ludzi kompetentnych ze światem chaosu (procentowo, naturalnie - są wyjątki po stronie jabbera, są i niedoinformowane jednostki wartościowe po stronie GG). Dlaczegóż chcecie więc nam, bogu ducha winnym użytkownikom, zgotować los tak marny? Przepuścić hordy matołów dla własnej satysfakcji? Czy warto zrobić to tylko po to, by za parę lat wszyscy informatycy na świecie (a jabber polski nie jest - ciekawe, czy Niemcy, Amerykanie, Japończycy i Francuzi ucieszą się na widok dobrze znanego już nam &quot;cze poklikash?!!?!!11!!&quot; lub &quot;z kont jestes&quot;) będą wspominać was jako tych, którzy pokonali sieć. Jako następną funkcję proponuję więc dodać system automatycznego rozsyłania/forwardowania łańcuszków, być może nawet z funkcją generatora, a następnie wprowadzić katalog WWW userów (nie ograniczający się do domeny hapi.pl - w końcu każdy człowiek potrzebuje trochę spamu - zwłaszcza ci, których JID jest identyczny z mailem).&lt;br /&gt;
&lt;br /&gt;
Być może nie rozumiem waszej motywacji, może są w tym jakieś cele wyższe. Przykro mi jednak, bo jeśli dalej tak pójdzie, za parę lat, dziś korzystający z jabbera, Polacy będą musieli się wstydzić. Nie za siebie, za grupy niewychowanych nastolatków i nastolatek, których wtajemniczyliście w techniki &quot;komunikacji&quot; międzyserwerowej.&lt;br /&gt;
&lt;br /&gt;
Gdy tak o tym myślę, cieszę się, że Tlen.pl pozostaje do dziś serwerem zamkniętym.&lt;br /&gt;
&lt;br /&gt;
Z poważaniem,&lt;br /&gt;
Patryk Zawadzki &amp;lt;patrys AT pld-linux DOT org&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>A Aleja się nie boi włamywaczy!</title>
   <link href="http://room-303.com/blog/2005/01/10/be7fcc95cb3b4adc528b5f023db34127/"/>
   <updated>2005-01-10T22:16:53+00:00</updated>
   <id>http://room-303.com/blog/2005/01/10/be7fcc95cb3b4adc528b5f023db34127</id>
   <content type="html">&lt;p&gt;Świąteczny czas to okres szczególny i radosny, toteż i rozrywki okołowigilijne odbiegają nieco od zajęć przyjętych za standardowe. W poprzednim roku (choć było to zaledwie paręnaście dni temu) zebrało mi się na napisanie artykułu na temat poziomu zabezpieczeń w polskim internecie. Artykuł oczywiście do dziś nie powstał, początkowo głównie z braku dostatecznej ilości materiałów. Z pomocą nieoczekiwanie i trochę niechcący przyszedł mi Roy, kiedy na stronie jednego z wrocławskich sklepów wysyłkowych objawił mu się duży i paskudny błąd MySQL zaraz po tym, jak przerobił trochę URL strony z listą produktów.&lt;/p&gt;

&lt;p&gt;Kiedy była już motywacja i był już obiekt, wystarczyło przeprowadzić proof of concept, czyli modelowy atak SQL injection. Nie było to specjalnie wymagającym zaangażowania intelektualnego zajęciem, jako że serwer produkcyjny okazał się tak miły i wyświetlił mi całe zapytanie. Wiadomo więc, w jakim kontekście wstawiane są zmienne, wiadomo też, że brakuje jakiegokolwiek sprawdzania, czy zmienne są liczbami. Hulaj dusza, piekła nie ma. Najdłuższą, bo dziesięciominutową chwilę poświęcić trzeba było jeszcze na odgadnięcie nazwy tabeli z listą klientów i już proof of concept był gotowy.&lt;/p&gt;

&lt;p&gt;Miast towarów, katalog sklepowy uraczył mnie listą loginów i haseł swoich podopiecznych, nie omieszkał podać też ich adresów email, na wypadek gdybym zapragnął oddać się uciechom korespondencji. Jednak nie zajmuję się zawodowo wysyłaniem niezamówionej poczty o charakterze komercyjnym, toteż pierwszy mój mail trafił był do nikogo innego, jak do samego biura mojej ofiary. Poruszenia wielkiego nie wywołałem, bo odpowiedzi nawet śladu na horyzoncie nie było znać. Odczekałem swoje, moje poirytowanie typowo polskim &quot;olewactwem&quot; sięgnęło zenitu i wykonałem strategiczny w założeniach telefon z zamiarem namierzenia OsobyKompetentnej&amp;trade;. Mój zapał ostudził szybko jeden z wzorcowo wręcz wyszkolonych telemarketerów:&lt;/p&gt;

&lt;p&gt;- Dzień dobry, dzwonię w sprawie bezpieczeństwa Państwa danych, czy mój email dotarł?&lt;br /&gt;
- Dzień dobry, dzisiaj akurat nie ma tego pana, który czyta pocztę, proszę spróbować jutro.&lt;/p&gt;

&lt;p&gt;Po tych słowy, moje bezgraniczne już zaufanie do rzeczonej firmy urosło jeszcze bardziej. Mógł chociaż zaimprowizować, że im serwer nie działa (co byłoby bliższe prawdy niż mógłby przypuszczać). Doceniłem jednak jego szczerość i odczekałem 24 godziny kwarantanny. Z błogiego stanu oczekiwania niespodziewanie wyrwało mnie... nic. Zadzwoniłem drugi raz. Spłoszona pani telefonistka na dźwięk złowieszczego słowa &quot;serwer&quot; natychmiast zaoferowała przełączenie do szefa. Nie odmówiłem, bo nie miałem okazji, ust nie zdążyłem otworzyć zanim w słuchawce zabrzmiała tandetna melodyjka, ulubione narzędzie tortur w rękach wszelakich posiadaczy infolinii, w tym moich i moich współpracowników. Marsz ów żałobny zakończył się nadspodziewanie szybko, a i głos rozmówcy świadczył, że całkowicie bez odzewu mój email nie przeszedł. Konwersacja specjalnie długo nie trwała, jednak zdołałem się dowiedzieć, że oni dowiedzieć się nie zdołali. Nadal nie wiedzą, co to za błąd.&lt;/p&gt;

&lt;p&gt;Kolejny dzień zastał mnie nieco zaskoczonego, bo oto przedmiot moich badań nie działa. Niebiosa runęły, świat legł w gruzach, wyłączyli sklep. Informator pod telefonem udziela jedynie enigmatycznych informacji o tym, że &quot;prace trwają&quot;. Na email otrzymałem odpowiedź, która niemal pozbawiła mnie żuchwy. Jak się okazało, brygada informatyków z zapałem instalowała w tym czasie wszelakie technologie kryptograficzne dostępne na rynku, serwer zyskał wsparcie SSL, a ja mogłem czuć się spokojniej... oglądając te same dane klientów, tym razem po szyfrowanym łączu. Najtrafniej skomentował to Roy, powiedział tylko &quot;nie ma to jak wstawianie dodatkowych zamków do drzwi, kiedy mieszkasz na parterze i masz wybite okno do salonu&quot;. Serwer powrócił po kilkunastu minutach od mojego telefonu, w całej krasie prezentując... kod źródłowy plików PHP. Widocznie poczuli się tak bezpiecznie z nowymi zabawkami, że nie uznali za konieczne parsowania skryptów. Byłem więc chyba jedynym klientem w historii informatyki, który patrząc na wyczyny dziarskiej grupy do spraw zabezpieczeń, wysłał kolejny email do firmy, tym razem dołączając... poprawiony kod źródłowy ich sklepu. Tego się nie spodziewali, ten fakt nimi wstrząsnął, to wbiło ich w ziemię, to sprawiło, że... postanowili znaleźć swoje rozwiązanie. Znaleźli więc miejsce, które poprawiłem, usunęli dodane przeze mnie apostrofy dookoła wstawianych z kodu zmiennych i napisali sobie funkcję, która wyszukuje kawałki kodu SQL. Gorzej, że nie te, co trzeba. Kolejny mail, w końcu użyli mojego kodu, albo sami zrobili coś identycznego. Spokój. Oczywiście kontakt się urwał.&lt;/p&gt;

&lt;p&gt;W międzyczasie przetestowałem pod tym samym kątem około trzydziestu innych serwisów internetowych. Kryterium podstawowe: polski serwis, musi zawierać jakąś bazę klientów. Około jednej trzeciej z nich, bo dokładnie dziesięć serwisów zawierało dziury pozwalające obejrzeć sobie dokładnie listę klientów. Oczywiście ilość przechowywanych danych była różna, część posiadała tylko login i hasło, część adres email, niektóre pełny adres domowy razem z telefonem. Był tylko jeden serwis, strona poświęcona mechanice samochodowej, której nie udało mi się zmusić do wyświetlenia listy, za to bez problemu można było zalogować się na każdego z klientów nie znająć jego hasła. To wszystko na wyciągnięcie ręki, wystarczyło zmienić adres URL w oknie przeglądarki. Zdążyłem już nawet przygotować standardowy mail do administratora, grzecznie informujący o usterce i podający sposób załatania, a jednocześnie zdecydowanie sugerujący, że w razie niezałatania zastrzegam sobie prawo do powiadomienia klientów. Możecie wierzyć lub nie, ale większość z usterek została załatana w ciągu 24 godzin. Jest tylko jeden serwis, który do dziś jest dziurawy jak sito i którego administracja nie była łaskawa do teraz odpowiedzieć na moje emaile. Przykre jest to o tyle, że jego klienci stanowili jedną z najliczniejszych grup pośród moich ofiar. A stroną tą jest &lt;a href=&quot;http://alejahandlowa.pl/indexm.php?kup_id=2221569&amp;amp;kid=11500%20or%20--&amp;amp;kd=7B5E8983F7EDED6FD910CDCD89DB499C&quot;&gt;Aleja handlowa&lt;/a&gt;, site który nie był w stanie zdobyć się na coś tak idiotycznego jak korespondencja ze mną (w końcu jak ufać komuś, kto nie chce w zamian pieniędzy?), przez co do dziś udostępniają dane tych, którzy im zaufali, trzeba tylko wiedzieć, jak o nie spytać...&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Pan detektyw</title>
   <link href="http://room-303.com/blog/2004/12/13/aa6d643c1a63fc516a59156f7d866cc5/"/>
   <updated>2004-12-13T20:08:28+00:00</updated>
   <id>http://room-303.com/blog/2004/12/13/aa6d643c1a63fc516a59156f7d866cc5</id>
   <content type="html">&lt;p&gt;Leżeli razem, z wzrokiem wbitym w przestrzeń. Bezgranicznie szczęśliwi, co chwila spoglądali tylko na siebie nawzejem, by upewnić się że to nie sen. Nie mówili nic, nie musieli. On przesunął powoli palcami po jej policzku, Ona odpowiedziała mu ciepłym uśmiechem i delikatnie pokręciła głową, jakby z niedowierzaniem. Po chwili znów zamarli w błogim bezruchu, ostrożnie kosztując każdej przemijającej chwili, Jakby każda z nich miała być ich ostatnią. Był mroźny poranek, słońce zdążyło podnieść się już na tyle wysoko, by mieniącymi się smugami oplatać ściany pokoju, jednak jego promienie nie niosły ze sobą jeszcze ciepła. Nie czuli chłodu, mieli siebie, ich ciała nie zdążyły jeszcze ochłonąć.&lt;/p&gt;

&lt;p&gt;Wtedy ciszę przerwał cichutki szum. On znał ten odgłos, ze spokojem zaczął rozglądać się po pokoju. To alarm wibracyjny wyciszonego telefonu komórkowego. Telefon leżał na drewnianej szafce nocnej u wezgłowia łóżka. Musiał go tam zostawić minionego wieczora, przeleżał tam w bezruchu kilkanaście godzin, jednak teraz lekko podrygiwał z charakterystycznym odgłosem wibracji. Kto mógł dzwonić o tak wczesnej porze? Sięgnął ręką po telefon i uniósł go do twarzy, chcąc upewnić się w swoich podejrzeniach. Ona uśmiechnęła się tylko lekko i wzięła aparat z jego ręki. Podniosła go do ucha i przekornie rzekła:&lt;/p&gt;

&lt;p&gt;- Halo? Przeszkadzasz nam.&lt;br /&gt;
- E, dlaczego?&lt;br /&gt;
- Bo mamy lepsze rzeczy do roboty.&lt;br /&gt;
- A dasz mi Patryka?&lt;br /&gt;
- Przykro mi, ale wygląda na to, że Patryk nie będzie dzisiaj na angielskim.&lt;br /&gt;
- A dlaczego?&lt;br /&gt;
- Bo ma ciekawsze zajęcia.&lt;br /&gt;
- Jakie?&lt;br /&gt;
- Zastanów się, co kobieta i facet mogą robić o tej porze w łóżku?&lt;br /&gt;
- Eee... spać?! - odparł SynPrezesa&amp;trade; z radością dziecka, które w końcu rozwiązało zagadkę.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Bo Pan używa Windowsa</title>
   <link href="http://room-303.com/blog/2004/11/24/5809cfe8794f0dd070e7265e29ab5aee/"/>
   <updated>2004-11-24T11:42:00+00:00</updated>
   <id>http://room-303.com/blog/2004/11/24/5809cfe8794f0dd070e7265e29ab5aee</id>
   <content type="html">&lt;p&gt;Nie tak znów dawno temu, jeden z naszych klientów, osobistość prawie tak barwna, jak jego strona internetowa, zażyczył sobie dodania nowej funkcjonalności. Dotychczasowy sklep internetowy owego dżentelmena działał w oparciu o dwie bazy danych. Baza MySQL odpowiadała za obsługę strony WWW, wraz z jej realizującymi proces sprzedaży skryptami PHP. Towary zaś same znajdowały się w bazie MS SQL, działającej żwawo, niczym wszystkie produkty powszechnie lubianego potentata z Redmont, pod kuratelą programu magazynowego firmy Wapro. Wszytko działało niemalże rewelacyjnie, jednak problemem było wprowadzanie zamówień do programu WF-MAG. Osoba za to odpowiedzialna zmuszona była wykonywać syzyfowe wszakże prace przepisywania listy produktów z jednego okienka do drugiego. W związku z powyższym, klient - wspaniałomyślnie nie zapominając o głodujących informatykach w Polsce - postanowił dać nam zarobić. Zadanie - napisać system eksportu danych ze strony sklepu do “formatu XML importowalnego przez program magazynowy”. Rozpoczął się więc proces rozpoznawania pola bitwy.&lt;br /&gt;
&lt;br /&gt;
Już na wstępie okazało się, że to, co firma Wapro raczyła nazwać “plikiem XML”, w żaden sposób nigdy nim nie zostanie. Cóż to bowiem za format, w którym wszystkie znaczniki są dwuliterowe, pisane dużymi literami, a ponadto znacznik rekordu otwieramy przez &lt;code&gt;&amp;lt;SL&amp;gt;&lt;/code&gt;, a zamykamy przez… &lt;code&gt;&amp;lt;/EL&amp;gt;&lt;/code&gt;. Nie wspomnę już, że jest osobny znacznik, który mówi, ile rekordów znajduje się poniżej. Ich liczenie w locie byłoby oczywistą głupotą, w końcu nie tak łatwo sprawdzić, czy zostały jakieś do czytania. Nie zrażając się idiotycznym sposobem reprezentacji tagów, brnąłem dalej przez specyfikację techniczną formatu. Umarłem, kiedy okazało się, że puste tagi &lt;code&gt;&amp;lt;DT&amp;gt;&lt;/code&gt; (mniejsza o ich zastosowanie), oznaczamy nie przez &lt;code&gt;&amp;lt;DT&amp;gt;&amp;lt;/DT&amp;gt;&lt;/code&gt;, a przez &lt;code&gt;&amp;lt;DT&amp;gt;brak&amp;lt;/DT&amp;gt;&lt;/code&gt;. Nie pytajcie mnie, co się stanie, gdy użytkownik spróbuje wpisać słowo “brak” jako np. nazwę towaru. Nie poddałem się jednak, choć mieszane uczucia targały moją duszą.&lt;br /&gt;
&lt;br /&gt;
Następnym krokiem był dostęp do bazy danych MS SQL. Problem polegał na tym, że baza klienta znajduje się w jego sieci wewnętrzej i nie posiada publicznego adresu IP. Oczywiście, da się testować skrypty bezpośrednio na serwerze klienta. Możnaby się nawet pokusić o takie rozwiązanie, gdyby nie to, że dysponują oni oszałamiającym łączem SDI, które uniemożliwia skuteczną komunikację na jakimkolwiek akceptowalnym poziomie. Zaczęliśmy się więc dowiadywać o możliwość prztunelowania portu na poziomie ich zapory ogniowej, zwłaszcza, że w przeszłości już to robili. Nieodzowną okazała się być osobista wizyta w siedzibie zainteresowanych. Wyruszyłem przeto w dwuosobową eskapadę na miejsce, osłaniając przez całą drogę tyły swojego szefa i zabezpieczając nam bezpieczną drogę odwrotu, na wypadek potrzeby nagłej ewakuacji. Okazało się jednak, że na miejscu przywitała nas głucha pustka. Ni widu ni słychu pana administratora. Zająłem więc pozycję pod drzwiami, a mój przełożony udał się na negocjacje w bliżej niezdefiniowane miejsce parę pięter niżej. Po chwili przyszedł w towarzystwie osoby będącej celem naszej podróży.&lt;br /&gt;
&lt;br /&gt;
Uraczywszy się zajęciem zaproponowanych nam krzeseł, postanowiliśmy przejść do rzeczy. Zapytany o możliwość forwardowania portów administrator już na wstępie kategorycznie odmówił. Stwierdził bowiem, że danie nam dostępu do bazy danych firmy, wystawi dane ich klientów na widok naszych niepowołanych gałek ocznych. Była to teoria tyle słuszna, co abstrakcyjna, w końcu mieliśmy dostęp do ich serwera ftp i równie dobrze z tej pozycji moglibyśmy wykonać pełny zrzut bazy danych. Pociągnięty za język administrator w końcu nie wytrzymał i w akcie ostatecznej rozpaczy rzucił w moim kierunku “a pan by to umiał zrobić?!”. Spytany o dystrybucję i soft, na którym ogniomurek stoi, był w stanie udzielić mi tak szczegółowych informacji, jak “jakiś Debian”. Ponownie zapytany, czy używają czystych iptables, czy może jakiegoś oprogramowania wyższej warstwy, odpowiedział, że nazwa iptables nawet mu się z czymś kojarzy. Przejąłem więc klawiaturę i pokazałem mu, jak iptables działa i na czym polega idea forwardowania portów. Po chwili kazał mi wszystko przywrócić do stanu oryginalnego i zaproponował, że może jednak wolałbym pracować na miejscu, u nich w firmie. Wtedy miałbym lokalny dostęp do serwera, musiałbym tylko jakiegoś notebooka sobie przynieść i pożegnać się z firmą macierzystą na dwa lub trzy dni. W tym momencie szef mój spojrzał na mnie i stwierdził “no tak, ale to są trzy dni, a poza tym pan używa tylko linuksa”. Na te słowy nasz gospodarz zerwał się na równe nogi, niczym oskarżony w sądzie w czasie rozprawy o bestialski gwałt na kurczakach sąsiada. Krzyknął tedy “wcale nie, mam też Windowsa!”, po czym przełączył monitor na drugi komputer, a oczom naszym ukazał się tak wielce pożądany pulpit Windows 2000. Oczywiście, zdanie o używaniu linuksa skierowane było nie tyle do niego, co do mnie, więc poczuł się tak dotkliwie dotknięty zupełnie bez powodu. Ja za to mało z krzesła ze śmiechu nie spadłem. Po opuszczeniu siedziby wirtuoza klikania, postanowiliśmy, że współpraca z klientem w kwestii bazy danych jest dalece bezcelowa i uruchomimy u siebie niezależną kopię MS SQL.&lt;br /&gt;
&lt;br /&gt;
Ochoczo zabrałem się do typowo programistycznej pracy, czyli napisałem sobie system niezbędnych zapytań do bazy MS SQL oraz klasę realizującą zamianę efektu owych zapytań w bloki wspomnianego pseudo-XMLa. Test polegał na zbudowaniu testowej tabelki zamówienia. Wykesportowałem więc listę towarów, dane kontrahenta i szczegóły realizacji zamówienia. Próba importu zakończyła się sukcesem porównywalnym z pierwszymi próbami wysłania Rosjan w kosmos. Rakieta spłonęła jeszcze na lotnisku. Kilkadziesiąt minut ręcznego przeglądania eksportu i próba odnalezienia tam błędów leksykalnych, wszystko na nic. Dalsze badania doprowadziły mnie niemal do zawału. Okazało się, że system importu wymaga zupełnego podzbioru bazy danych, co oznacza ni mniej ni więcej tyle, że jeśli eksportuję towar “łyżeczka”, to muszę wyeksportować również dla danej łyżeczki tabelę jednostek miar, waluty, cenniki, promocje, dane kontrahenta, jego pracowników, listę telefonów, faksy, banki i konta bankowe. Nie zmienia faktu, że wszystkie te dane są już w programie. Autorzy zasłaniają się tym, że dzięki temu można zaimportować takie dane do zupełnie czystej bazy danych. Moja odpowiedź na taki argument brzmi: więc import powinien zawieść, jeśli w bazie brakuje którychkolwiek z wymaganych do odtworzenia zamówienia danych. Jeśli pozostałę dane już tam są, nie widzę sensu ich każdorazowego nadpisywania.&lt;br /&gt;
&lt;br /&gt;
Morał: jest taka stara zasada merketingowa: najlepszy klient to taki, któremu się wydaje, ze jest dla ciebie najważniejszy. Najgorszy klient to ten, który jest tego pewien. Nigdy więc nie licz na to, że klient będzie zainteresowany jakąkolwiek współpracą przy realizacji zleconego ci zadania. W końcu nie leży to w jego interesie. Zaoszczędzony czas będzie mógł poświęcić na podniesienie możliwości swojej załogi, np. kupi administratorowi większą myszkę.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Potrzebny tuning, ale interfejsu</title>
   <link href="http://room-303.com/blog/2004/11/17/e8cde711f02d1a2740eec17e0fb1fef1/"/>
   <updated>2004-11-17T09:10:24+00:00</updated>
   <id>http://room-303.com/blog/2004/11/17/e8cde711f02d1a2740eec17e0fb1fef1</id>
   <content type="html">&lt;p&gt;Pozwolę sobie pójść śladami mojego ostatniego wpisu z jednego z moich pozostałych blogów. Chodzi mianowicie o jednego z naszych klientów, a ściślej o jego serwis internetowy.&lt;br /&gt;
&lt;br /&gt;
Kiedy przyszło mi wprowadzać tam pierwsze poprawki, urzekła mnie swoboda, z jaką w kodzie html zostały porozrzucane różne, bardziej lub mniej poprawne, tagi. Swoista lekkość kodowania może jeszcze znaleźć uzasadnienie w niedoświadczeniu zespołu, który serwis ów budował x lat temu, nic natomiast nie przychodzi mi na myśl, kiedy szukam jakiejś wiarygodnej wymówki odnośnie interfejsu.&lt;br /&gt;
&lt;br /&gt;
Pal licho stronę główną, na której nic nie ma poza stertą animacji we flashu. Pal licho strony z informacjami, które działąją tylko pod JedynąSłuszną™ przeglądarką. Pal licho niespójność graficzną kolejnych podstron i intro flashowe, które działa tylko sporadycznie. To jest nic, prawdziwa radość przepełnia człowieka w momencie, kiedy zorientuje się, że strona ta zawiera sklepik internetowy.&lt;br /&gt;
&lt;br /&gt;
A sklep jest nie lada wynalazkiem. Na wstępie powiem, że zajmuje się sprzedażą tylko i wyłącznie części i akcesoriów tuningowych do wszystkich możliwych samochodów. Właśnie te “wszystkie samochody” są największym problemem. Proszę sobie bowiem wyobrazić, że oferta do niedawna przekraczała grubo dwadzieścia siedem tysięcy produktów. Do niedawna, bo trochę się tutaj zmieniło, ale o tym za chwilę. Teraz jednak proponuję, aby każdy zastanowił się, czy przez całe życie widział dwadzieścia siedem tysięcy różnych przedmiotów? Cały trik polega na tym, że większość części jest dostępna w wersjach dla różnych marek i modeli pojazdów. Jedynym sposobem na prezentację tego, jaki przychodzi mi do głowy, byłaby lista rozwijalna w szczegółach każdego produktu, umożliwiająca przy zamawianiu zaznaczenie, do czegóż dany artykuł mamy zamiar wykorzystać. Klient w swym geniuszu poszedł jednak dalej, postanowił bowiem za jednym zamachem obniżyć koszty wykonania serwisu, jednocześnie upraszczając interfejs. Może wielu z was domyśla się już, jakiż to przesprytny zabieg został zastosowany? Mimo wszystko powiem to, tak, każdy produkt jest dodany do bazy sto kilkanaście razy, za każdym razem do jego nazwy zostały doklejone marka i model pojazdu docelowego. Czyż to nie przewspaniała idea? Pozazdrościć pomysłowości, przecież jak dotąd żaden klient sklepu nie skarży się, że po wybraniu konkretnej części, jego samochód jest gdzieś w okolicach czternastej strony. Kupił volvo, miał świadomość, że wcześniej alfabetycznie jest po 10 modeli alfa romeo, audi, bmw, citroena, mini-coopera, … czy też w końcu toyoty. Tak oto powstał najbardziej przejrzysty sklep internetowy, jaki kiedykolwiek matka magistrala nosiła.&lt;br /&gt;
&lt;br /&gt;
Napisałem wcześniej, że dwadzieścia siedem tysięcy produktów było do niedawna. To prawda, przez ostatnich kilka dni roboczych moim głównym zadaniem było zaimportowanie do wspomnianego sklepu kolejnych czterech tysięcy artykułów. Zaimportowanie to takie proste słowo, przy okazji pozwolę sobie zatem powiedzieć, że właściciel zleca nam aktualizację sklepu, przesyłając w załączniku… arkusz excela wyeksportowany do formatu CSV. Teraz grzecznie podnieście szczęki i kontynuujemy o wspomnianym imporcie. Tym razem okazało się, że import mamy wykonać z… konkurencyjnego sklepu. “Oczywiście, wszystko zostało załatwione i otrzymamy wszystkie dane i zrzuty z bazy”. Oczywiście.&lt;br /&gt;
&lt;br /&gt;
Faktycznie, otrzymaliśmy kilka plików w formacie SQL, zawierających dziwaczne struktury, jakiegokolwiek opisu brak. W końcu pola typu “prod”, “mode”, “mode2” i kilkanaście innych są całkowicie intuicyjne. Po kilku godzinach mieliśmy już o strukturze wyeksportowanej tabeli pojęcie rodem z kraju kwitnącej wiśni, czyli jako-takie. Zaintrygowała mnie tylko jedna rzecz… Gdzie się podział eksport tabeli z drzewem kategorii? Przecież nie wrzucę czterech tysięcy produktów do jednej. Gdybym wiedział, co mnie czeka, bez chwili zastanowienia umieściłbym nowoprzyjęte towary jeden pod drugim.&lt;br /&gt;
&lt;br /&gt;
Sześć godzin później miałem już przepisane wszystkie 554 kategorie ze strony klienta, który to proces został przeprowadzony przy wdrożeniu najnowszych dostępnych na rynku technologii automatyzacji - a dokładniej przy użyciu jednego okna przeglądarki z dwoma zakładkami, w jednej otwarty sklep klienta, w drugiej konkurencja. Jestem rewelacyjną maszynistką. Oprócz tego w ciągu wspomnianych 6 godzin udało mi się rozgryźć, jakich kosmicznych metod konkurencja używa do przypisania produktu do kategorii (do dyspozycji miałem adresy url ze strony i eksport z bazy, który nie zawierał słowa na temat kategorii), przypisałem zatemstosowne identyfikatory i zabrałem się za pisanie skryptu importującego zrzut do odpowiedniego formatu bazy (“odpowiedni” nie jest tu najlepszym słowem, chodzi mi o format stosowany w sklepie klienta, bo z odpowiednim ów ma niewiele wspólnego).&lt;br /&gt;
&lt;br /&gt;
Wszystko szło pięknie i dane zostały zaimportowane. Dzień później okazało się, że import musi obejmować również zdjęcia towarów. Tylko skąd wziąć zdjęcia? Okazało się to prostsze niż przypuszczaliśmy, przynajmniej w teorii. Jeden z plików sql dostarczonych nam przez klienta okazał się posiadać adresy url do zdjęć… na serwerze jeszcze innego sklepu! Kolejna chwila potrzebna była już tylko na napisanie funkcji zapisującej zdjęcie z podanego urla do postaci dużej i miniaturki, a potem nie pozostało już nic innego, jak przystąpić do ponownego importu. Teoretycznie. W praktyce okazało się, że trzeba jakoś te 554 kategorie wyczyścić. Kolejny skrypt do napisania. Czyszczenie wszystkiego zajęło jakieś 5 minut. Zaczynamy więc import od zera. Idzie dobrze, idzie dobrze, niespodzianka. Przy tysiąc pięćsetnym którymś zdjęciu, czyli po jakiejś godzinie importu wystąpił błąd przy odpytywaniu DNS i wszystko szlag trafił. Wznowić od tego momentu nie da rady, kolejne czyszczenie, ale ale. Tym razem trzeba jeszcze wyczyścić tabelę ze zdjęciami produktów i katalog z powyższymi. Z tym, że nie wszystko, bo nie można uszkodzić wcześniejszych dwudziestu siedmiu tysięcy. Kolejne przeróbki w skrypcie czyszczącym i pół godziny jego działania. Przed kolejnym importem podjąłem kroki prewencyjne, zbudowałem system pagowania importu w paczki po 100 elementów i system cofający ostatnią paczkę w przypadku, gdyby wystąpił błąd. Godzina testowania i debugowania, i oto chwila tryumfu, bestia padła dnia trzeciego, po kolejnym pięciogodzinnym imporcie, tym razem w krokach po 100. Zastanawialiśmy się tylko, kiedy administracja serwera utrzymującego zdjęcia produktów zauważy, że w ciągu trzech dni wygenerowaliśmy im kilkaset megabajtów ruchu?&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Tajna korporacja</title>
   <link href="http://room-303.com/blog/2004/10/19/dba1ad3f7e01d6b77aa758862dddf041/"/>
   <updated>2004-10-19T18:51:16+00:00</updated>
   <id>http://room-303.com/blog/2004/10/19/dba1ad3f7e01d6b77aa758862dddf041</id>
   <content type="html">&lt;p&gt;Negocjacje w sprawie wykonania projektu serwisu korporacyjnego. Przybywa mroczna wysłanniczka z krainy cienia. Przedstawicielka klienta konwersuje z grafikiem:&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Ja tutaj przygotowałam projekt graficzny i chciałabym, żebyście się na tym wzorowali. Macie zachować układ, tylko wprowadzić drobne poprawki, strona już jest zaakceptowana.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Uhm… ech… tak, zajmiemy się tym.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;I pamiętajcie, konkurencja nie śpi, więc chcemy mieć ten taki jakby portal korporacyjny, ale nie chcemy się ujawniać.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Słucham?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Nie chcemy się ujawniać!&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Hmm… rozumiem… dobrze… (?)&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Dziękuję, do widzenia.&lt;br /&gt;
&lt;br /&gt;
Po chwili kłopotliwej ciszy, grafik zdaje się powracać do życia, rzecze przeto w te słowy do project managera:&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Łukasz, ja mam za dobre serce, ty jej powiedz.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A co?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Chodź, zobaczysz.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;…&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;…&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Ratunku! To ja takie strony we FrontPage robiłem 6 lat temu, tylko kolory miały lepsze.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Daj spokój, poza tym nie można nic większego przerabiać, to co my mamy im zrobić? Dali ponoć zaakceptowaną stronę.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Czekaj zadzwonię do nich.&lt;br /&gt;
&lt;br /&gt;
Tak oto, nasz dzielny PM dodzwonił był się do siedziby najwyższych władnych podejmowania decyzji w siedzibie klienta.&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Nic nie rozumiem, przecież przedstawiliśmy Państwu projekt strony, a Państwo nam z czymś takim wyjeżdżacie?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No a co jest nie tak?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Delikatnie mówiąc, to ja takie strony robiłem sześć lat temu proszę Pani. Ta strona jest lekko nie na czasie, no i kuleje mocno kolorystyka.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Ale ta Pani jest artystką!&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Ja rozumiem, ale ludzie na ogół specjalizują się w konkretnej dziedzinie, np. malarz obrazów nie pomaluje pokoju… tak samo malarz pokojowy nie umie malować obrazów.&lt;br /&gt;
&lt;br /&gt;
(głos z głębi naszej sali: - No tu mamy do czynienia z tym drugim przypadkiem!)&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Ale jej projekt jest taki jakiś ładniejszy i czytelniejszy.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;To ja się może odezwę później…&lt;br /&gt; 
&lt;br /&gt;
Koniec końców, odpukać, przeszedł projekt Jarvisa. Okazało się, że jedno z zastrzeżeń dotyczyło napisów na stronie: “Lorem ipsum dolor sit amet…”.&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Nie ma mocnych</title>
   <link href="http://room-303.com/blog/2004/10/19/34cfd7c1dc2d1592ec17b5579cc45de7/"/>
   <updated>2004-10-19T18:28:40+00:00</updated>
   <id>http://room-303.com/blog/2004/10/19/34cfd7c1dc2d1592ec17b5579cc45de7</id>
   <content type="html">&lt;p&gt;Dziś dzwoni do nas telefon, wczeny poranek, niepełny skład w biurze. Agnieszka ostrożnie podnosi słuchawkę.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Słucham?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Coś wam nie działa tam.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Ehm… słucham?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No coś wam nie chodzi, strona wam nie chodzi.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Jaka strona?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No wasza przecież. I email mi nie chodzi. A ja go muszę sprawdzić.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Dobrze, zapiszę, jaki jest adres?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Jaki adres?!&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No ten email, który Panu nie działa…&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Żaden mi nie działa!&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;…&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;(piiii piiii piiii piiii piiii piiii)&lt;br /&gt;
&lt;br /&gt;
Parę dni wcześniej Łukasz odkrył tajemnicę niebezpiecznego emaila:&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Mój podpis pod emailem jest potencjalnie niebezpieczny!&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;E, czemu?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Bo wystarczy, że będę pisał do jakiejś dziewczyny i przez pomyłkę zamiast “u” wcisnę “y”, a zamiast kropki dam znak zapytania.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A jak się podpisujesz?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;“Łukasz.”&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Kernel panic</title>
   <link href="http://room-303.com/blog/2004/09/26/c8ece7c3e3d104b9f6183d1e1fcf715c/"/>
   <updated>2004-09-26T16:07:19+00:00</updated>
   <id>http://room-303.com/blog/2004/09/26/c8ece7c3e3d104b9f6183d1e1fcf715c</id>
   <content type="html">&lt;p&gt;Witam w kolejnej porcji codziennych smaczków życia biurowego. Tym razem najwięcej radości miał nasz administrator sieci, Px2:&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Halo, słucham, w czym mogę pomóc?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Bo mi nie działa strona.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;To znaczy?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No nie wyświetla się. I poczta też.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A jaka to domena?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;To znaczy?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Adres?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;JakaśDomena™.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Już sprawdzam… sekundę… przepraszam, ale u nas nie ma takiej strony. Jest Pan na pewno naszym klientem?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Nie.&lt;br /&gt;
&lt;br /&gt;
Następnie odwiedziły nas dwie panie. Słowo “internet” w nazwie firmy zobowiązuje:&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Dzień dobry.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Dzień dobry, w czym możemy pomóć? - odezwało się chórem pięć męskich głosów.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Bo ja bym chciała internet podłączyć - odrzekła z rozbrajającą szczerością jedna z Pań.&lt;br /&gt;
&lt;br /&gt;
Zawiedzione Panie opuściły biuro. Nastąpiła chwila ciszy, którą przerwało nagłe:&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;W sumie, to ja bym mógł je testowo przyłączyć do mojej prywatnej magistrali…&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;…&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Buahahaha…&lt;br /&gt;
&lt;br /&gt;
Typowo geekowskie były za to urodziny Jarvisa. Jako dobrze wychowany człowiek, przytransportował ze sobą do pracy przekąski, wino i ciastka, celem uraczenia swoich ulubionych współpracowników, czyli jedynych jakich ma, z nami w roli głównej. W czasie biesiady przyszło mi opuścić nasze, zwykle zaciszne, biuro, które przeistoczyło było się w świątynię rozpusty. Po przymusowej wizycie w szkole powróciłem do naszego legowiska, by z przerażeniem w oczach i bólem na twarzy dostrzec wyraźny brak korzystnie oprocentowanych trunków.&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Nie ma już wina, ale czemu nie bierzesz ciasteczek?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Polityka bezpieczeństwa odrzuca dla tej domeny.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;LOL!&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Nowa praca</title>
   <link href="http://room-303.com/blog/2004/09/15/07252883854e23d50842e607e3eab23b/"/>
   <updated>2004-09-15T20:46:33+00:00</updated>
   <id>http://room-303.com/blog/2004/09/15/07252883854e23d50842e607e3eab23b</id>
   <content type="html">&lt;p&gt;Jako, że od początku miesiąca pracuję już dla innej firmy, trochę humoru biurowo-geekowego na dobry początek. Właściwie, to moje wpisy ograniczą się teraz wyłącznie do humoru biurowego. Przynajmniej do czasu, aż ktoś z zarządu nowej firmy postanowi spłodzić i wychować latorośl, zwaną dalej synem. W każdym bądź razie, nowa ekipa jest bardzo sympatyczna.&lt;br /&gt;
&lt;br /&gt;
Po godzinach siedzimy w biurze, luźna dyskusja na temat linuksa:&lt;br /&gt;
&lt;br /&gt;
Px2: - Ja lubię używać Mutta i Pico.&lt;br /&gt;
Patrys: - Ja używam Evolution, Mutta się nie da obsługiwać, on ma obłożenie klawiatury jak symulatory lotu za czasów swojej świetności.&lt;br /&gt;
Jarv: - Ale to są proste skróty.&lt;br /&gt;
Patrys: - Prosta to jest obsługa vima.&lt;br /&gt;
Jarv: - Wiesz, jak dla mnie, vim ma obłożenie klawiatury jak symulatory lotu za czasów swojej świetności. :D&lt;br /&gt;
&lt;br /&gt;
Dzwoni klient, pyta o blokowanie spamu:&lt;br /&gt;
&lt;br /&gt;
Klient: - Mieliście podobno blokować spam, a mnie tu zasypują!&lt;br /&gt;
Px2: - Nasz serwer tylko oznacza spam, to pan decyduje, co z nim zrobić.&lt;br /&gt;
Klient: - A jak to zrobić?&lt;br /&gt;
Px2: - A jakiego klienta poczty pan używa?&lt;br /&gt;
Klient: - Outlook Express…&lt;br /&gt;
Px2: - To musi Pan znaleźć sobie filtry i tam dodać automatyczne usuwanie wiadomości z flagą “X-Spam: yes”.&lt;br /&gt;
Klient: - Aha, dziękuję, do widzenia.&lt;br /&gt;
Roy: - Wiesz, w Outlook Express nie da się filtrować po nagłówkach, ale nie chciałem ci przerywać. :D&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Nalepsze zawsze zostaje na koniec</title>
   <link href="http://room-303.com/blog/2004/08/31/4f594e62b514f04061c64226e0f5fc15/"/>
   <updated>2004-08-31T12:37:09+00:00</updated>
   <id>http://room-303.com/blog/2004/08/31/4f594e62b514f04061c64226e0f5fc15</id>
   <content type="html">&lt;p&gt;Męczyłem się już czas jakiś, zmuszony do pracy na “demonie szybkości”, jak ochrzczony został przeze mnie mój dotychczasowy współpracownik, Pentium 350, 128 MB RAM, kiedy to dowiedziałem się, że nie mam już prawa modyfikować kodu stron na serwerze WWW. Straciłem tam konto. Otrzymałem przeto kopię kodu źródłowego stron i stosowne zrzuty z bazy danych. Na moje pytanie, co też mam z nową zdobyczą uczynić, odpowiedź otrzymałem taką: “uruchom u siebie kopię i tam pracuj”. Biorąc pod uwagę, że mój dzielny rumak ledwo dźwigał jadącego na nim okrakiem Gnoma, podwożenie dodatkowo pewnego Apacza było grubo ponad jego siły. Kolejne dwa dni minęły produktywnie jak nigdy dotąd.&lt;br /&gt;
&lt;br /&gt;
Zaskoczył mnie za to powrót z dwudniowego wyjazdu od Warszawy. Po powrocie znalazłem przy swoim biurku nowiutki komputer (nowy w sensie jego egzystencji w naszym biurze, nie biorę pod uwagę daty produkcji). Szybkie przełożenie dysku, reboot, konfiguracja iksów (mam nVidię zamiast tamtego S3!), maszynka stoi, śpiewa, tańczy, usuwa ciążę i buty wiąże. Tylko co mi po poprawkach na stronie w wersji offline, kiedy dalej nie mam prawa nałożyć ich na wersję online…&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Porządki</title>
   <link href="http://room-303.com/blog/2004/08/23/5a1da15e91f60bab1e3c0678bb6d75df/"/>
   <updated>2004-08-23T13:05:13+00:00</updated>
   <id>http://room-303.com/blog/2004/08/23/5a1da15e91f60bab1e3c0678bb6d75df</id>
   <content type="html">&lt;p&gt;Niestety, wygląda na to, że do niektórych ludzi nie dotarło, że strona ma charakter czysto rozrywkowy, a przedstawione na niej wydarzenia i postacie celowo nie odnoszą się do żadnych nazwisk ani pseudonimów. W związku z tym cała ostatnia notka została przeniesiona przeze mnie do krainy wiecznych łowów. Nie budowałem miejsca do prowadzenia wojen i przykro mi, że w ciągu ostatnich dwóch dni w takie się zamieniło.&lt;br /&gt;
&lt;br /&gt;
Poczucie humoru to jedno, ale agresja to drugie. Przemyślcie to przed wysłaniem kolejnego komentarza.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Lojalność nie popłaca</title>
   <link href="http://room-303.com/blog/2004/08/19/b27096508323ae11e2b217948cd50981/"/>
   <updated>2004-08-19T10:31:57+00:00</updated>
   <id>http://room-303.com/blog/2004/08/19/b27096508323ae11e2b217948cd50981</id>
   <content type="html">&lt;p&gt;Początek czerwca, jedno z centrów handlowych zgłosiło się do mnie z pytaniem, czy jestem w stanie przygotować dla nich profesjonalny serwis internetowy. Prywatnie. Odpowiedziałem, że bardzo chętnie, niestety praca pochłania zbyt wiele z mojego, i tak mocno ograniczonego, czasu. Dlatego zaproponowałem klientowi podpisanie umowy z moim pracodawcą, wtedy będę w stanie zbudować wspomnianą stronę w ramach moich obowiązków i w godzinach pracy. Błąd.&lt;br /&gt;
&lt;br /&gt;
Doszło do kilku spotkań, m.in. z wynajętym przez klienta architektem z biura projektowego, który odpowiadał za spójność designu z oprawą graficzną budynku i firmową kolorystyką. Uzgodniliśmy, że muszę wykonać około 12 zdjęć w konkretnych ujęciach, przygotować logo, oprawę graficzną strony, a następnie połączyć wszystko w całość i udekorować dostarczonymi tekstami. Około tygodnia pracy. Niestety, SamPrezes™ postanowił nie przeznaczać dodatkowego czasu na obsługę nowego klienta. Termin oddania projektu się zbiżał, a ja nie miałem na jego wykonanie nawet godziny czasu. Jako, że osobiście uzgadniałem wszystkie szczegóły i nie chciałem zniszczyć wizerunku PewnejFirmy™, systematycznie pracowałem po godzinach, wracając do domu w okolicach północy. W końcu klient jest ważny i musi być zadowolony.&lt;br /&gt;
&lt;br /&gt;
Projekt został przeze mnie dostarczony na czas, klient zgłosił listę poprawek, które zostały naniesione tak szybko, jak było to możliwe. Oczywiście poza godzinami pracy, które nie przewidują wykonywania dochodowych dla firmy działań. Wszystko zostało dogadane do końca, strona uzyskała akceptację, a ja przygotowałem kosztorys. Ten ostatni wraz z niezbędną dokumentacją dostarczyłem zarządowi PewnejFirmy™. Wydawałoby się, że wszystko zostało zapięte na ostatni guzik. Wystarczyło już tylko umówić spotkanie zarządów obu firm i podpisać umowę na wykonanie strony i umowę hostingową. Wystarczyło.&lt;br /&gt;
&lt;br /&gt;
Minęły ponad dwa miesiące, wczoraj prezes owego centrum handlowego zadzwonił do mnie i poprosił o spotkanie. Zadziwił ich profesjonalizm w podejściu do klienta ze strony naszej firmy. Strona jest gotowa, hosting jest utrzymywany i w dodatku nic nie trzeba płacić. Do dziś nikt nie podpisał z nimi umowy. O umowie przypominałem w tygodniowych odstępach czasu, niestety, najwyraźniej nikt nie był zainteresowany jej podpisaniem, w związku z czym właśnie dziś straciliśmy klienta. Grzecznie poproszono nas o wystawienie faktury za wykonanie strony, udostępnienie kodu źródłowego i, tym samym, zakończenie tej jakże owocnej współpracy.&lt;br /&gt;
&lt;br /&gt;
Morał: mądry Polak po szkodzie. Miałem możliwość zarobić około 700 złotych. W końcu i tak pracowałem poza godzinami pracy. Koniec końców klienta nie ma, a ja nie dostanę ani złotówki prowizji z tytułu jego znalezienia. Następnym razem stronę wykonam prywatnie, a jako firmę hostingową polecę kogoś z konkurencji. Może wynegocjuję chociaż parę procent prowizji z tego tytułu. Lojalność wobec firmy nie popłaca.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Przypowieść o motywacji</title>
   <link href="http://room-303.com/blog/2004/08/18/2c3262e78baaa493f0a20bc5aa0aed6a/"/>
   <updated>2004-08-18T10:33:13+00:00</updated>
   <id>http://room-303.com/blog/2004/08/18/2c3262e78baaa493f0a20bc5aa0aed6a</id>
   <content type="html">&lt;p&gt;Przełom lipca i sierpnia. Jak zwykle, siedzimy z MoimWspółpracownikiem™ w naszym biurze. Po pamiętnej rozmowie o złym wpływie na mnie, MójWspółpracownik™, programista, dostał nagle niespodziewane polecenie od SamegoPrezesa™.&lt;br /&gt;
&lt;br /&gt;
Primary objective: obrobić zdjęcia towarów do sklepu internetowego.&lt;br /&gt;
Secondary objective: składać co godzinę szczegółowy raport z postepu prac.&lt;br /&gt;
Additional conditions: zadanie jest na czas i ma na celu sprawdzenie wydajności pracy.&lt;br /&gt;
&lt;br /&gt;
Być może niektórzy z was gotowi pomyśleć, że firma ewidentnie stara się znaleźć powód do zwolnienia niewygodnego człowieka. Nic bardziej błędnego, przecież to tylko forma zmotywowania pracowników do pracy. Praca na czas niesie ze sobą element współzawodnictwa z samym sobą, cóż bowiem sprawia pracownikowi więcej radości niż pokonanie swojego własnego rekordu? SamPrezes™, niczym troskliwy trener, siedział w swoim gabinecie ze stoperem w ręce i myślał, jak lepiej dostosować warunki pracy MojegoWspółpracownika™ do jego potencjalnych możliwości. I oto po dwóch dniach upokarzającej harówki pojawiła się nowa misja:&lt;br /&gt;
&lt;br /&gt;
Cel misji: przenieść się z komputerem piętro wyżej, do innego biura. Nadmienię tutaj, iż nowe biuro było znacznie mniejsze od poprzedniego, a ponadto pracowały tam już dwie osoby. MójWspółpracownik™ nie był w stanie wyobrazić sobie pracy programisty w pokoju handlowców, gdzie telefon dzwoni z częstotliwością porównywalną do częstotliwości powtarzania Rambo 3 na Polsacie. Naturalną reakcją było więc:&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Mam to w dupie. Nigdzie nie idę.&lt;br /&gt;
&lt;br /&gt;
I nastał błogi spokój. W końcu jednak odwiedził nas BezpośredniPrzełożony™ i postawił sprawę w ten sposób:&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Jak się nie przeniesiesz, to SamPrezes™ się wkurzy i nie da mi urlopu w poniedziałek. Proszę, przenieś się, to ponoć na góra dwa dni.&lt;br /&gt;
&lt;br /&gt;
I MójWspółpracownik™ posłuchał. Przeniósł się piętro wyżej, gdzie SamPrezes™ nareszcie mógł go mieć na oku. Permanentna inwigilacja. Biedak, dalej jednak nie wiedział, jak programista może się skupić w pokoju, gdzie telefon dzwoni nawet w święta?&lt;br /&gt;
&lt;br /&gt;
Wybawienie przyszło z góry. Nie jest już programistą. Umowa umową, a potrzeba matką wynalazku. Dwudniowe przenosiny trwają do dziś, a jeszcze niedawny programista pracuje teraz na stanowisku etatowego fotografa piłek, rękawic i gwizdków. Pasjonująca robota, niewątpliwie. Jeśli jest się informatykiem, warto mieć dobre referencje w tej dziedzinie. Nie każdy potrafi wykonać dobre zdjęcie starszym od siebie aparatem marki Olympus, wyposażonym w niebotyczne rozmiary pamięci, bo aż 4 megabajty.&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Outsourcing to takie modne słowo</title>
   <link href="http://room-303.com/blog/2004/08/18/f0088e175ad7fcf3becf0825a80f9111/"/>
   <updated>2004-08-18T08:08:17+00:00</updated>
   <id>http://room-303.com/blog/2004/08/18/f0088e175ad7fcf3becf0825a80f9111</id>
   <content type="html">&lt;p&gt;Pierwsza sobota sierpnia, próba zdalnego logowania na maszynę. Brak odpowiedzi ze strony serwera. Ponawiam próbę po kilku minutach. Jestem w środku, reattach do screena. Brak oczekujących na podłączenie sesji. Uptime. Komputer działa od siedmiu minut. Who. Zastanawiające, zalogowany jest PewienAdministrator™ z Warszawy. Co dziwne, zalogowany jest na roota i to z lokalnej konsoli. Krótki rekonesans wykonany za pomocą rozmowy przez wall ujawnił, że PewienAdministrator™, mój kolega, został bez uprzedzenia ściągnięty przez PewnąFirmę™ celem wykonania audytu bezpieczeństwa. Innymi słowy, firma szuka na mnie haka. Zastanawiające tylko, że wybrali do tego celu osobę, z którą utrzymuję stały kontakt. Właściwie, to ten fakt cieszy mnie niezmiernie, w innym przypadku wszystko zostałoby, zapewne, zatuszowane. PewnaFirma™ ma zwyczaj budowania więzi z pracownikami poprzez dyskretnie przeprowadzane za ich plecami kontrole, które i tak kończą jako tajemnica poliszynela. Nie przejąłem się tym specjalnie, postanowiłem za to oddać komplet dokumentów jednemu z naszych klientów, co niewątpliwie wymagało wizyty w biurze.&lt;br /&gt;
&lt;br /&gt;
Biuro odwiedziłem w okolicach godziny piętnastej. Niestety, wszystko, czego udało mi się dokonać, sprowadzało się do pocałowania klamki. Drzwi zostały zamknięte na górny zamek, do którego klucz posiada jedynie nie pracujący u nas już od jakiegoś czasu SynPrezesa™. Portier powiadomił mnie z uśmiechem, że wszyscy opuścili budynek i nikt nie postanowił zostawić klucza. Lekko wstrząśnięty ale nie zmieszany, udałem się w podróż powrotną do domu. Coś było nie tak.&lt;br /&gt;
&lt;br /&gt;
Poniedziałek, kolejna próba wejścia do biura spełzła na niczym. Udałem się przeto do SamegoPrezesa™, celem wyjaśnienia pewnych rzeczy. Niedzielne próby zdalnego dostępu do maszyn wywołały niejednokrotnie uśmiech na mojej twarzy, kiedy to okazywało się, że na kolejnych maszynach bądź nie mam ze swojego konta dostępu do roota, bądź to nie posiadam tam konta wcale. Z niczego nie zdradzającą miną i udając lekkie zdziwienie, wszedłem do gabinetu SamegoPrezesa™.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Czy mógłbym się dowiedzieć, co się dzieje?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Przyjechał PewienAdministrator™ i łataliśmy dziury w programach.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A mogę jakoś dostać się do biura?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Zostałeś przeniesiony, teraz serwerownia jest zamknięta na stałe, nikt tam nie ma wstępu.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Rozumiem, że administracją również zajmuje się ktoś inny?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Tak, za dużo czasu pochłaniało ci czytanie poczty z list pld-devel, postanowiliśmy cię odciążyć.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Mhm…&lt;br /&gt;
&lt;br /&gt;
Przygotowany na wszystko udałem się do mojego nowego miejsca pracy. Już po kilku minutach okazało się, że nie byłem jednak przygotowany na jedno. Moje stanowisko pracy to już nie dual Pentium 600 z 512 MB RAM. W zamian otrzymałem ten jakże przewspaniały komputer, Pentium 350 i na deser 128 pamięci. Dotąd jego jedyną rolą było zbieranie logów z innych maszyn. Już wkrótce miałem się jednak przekonać, że - według SamegoPrezesa™ - wspaniale nadaje się on do pracy w środowisku Gnome. A może mylę się i moim zadaniem jest budowa stron w środowisku tekstowym i przygotowywanie ich designu specjalnie z myślą o lynksie?&lt;br /&gt;
&lt;br /&gt;
Od tego czasu większość czasu spędzam sprawdzając, w jakiej pozycji najwygodniej ułożyć nogi na stole. Z radością pełniłbym swoje dotychczasowe obowiązki, niestety PewnaFirma™ uznała, że najlepszy administrator to taki, którego od serwerowni dzieli jedynie siedem godzin jazdy pociągiem. Siedzę więc i poświęcam połowę swojego czasu na cierpliwe upraszanie się o niezbędne uprawnienia do modyfikacji plików, które polecił mi edytować SamPrezes™. Odkąd zostałem “odciążony”, praca zajmująca mi dotąd cztery godziny, teraz zajmuje mi godzin osiem. Nakłada się na to oczywiście również rewelacyjne stanowisko do pracy, na którym dokument OOo otwiera się dokładnie sześć minut, a przełączanie pomiędzy oknem przeglądarki i procesorem tekstu daje dość czasu, aby wpaść w alkoholizm.&lt;br /&gt;
&lt;br /&gt;
Morał: umowa przy zatrudnieniu to kwestia, jak sama nazwa mówi, umowna. To, że mam tam napisane “administrator sieci”, do niczego nie zobowiązuje. Mogę równie dobrze zajmować się wstawianiem dokumentów Worda na strony klientów. Jakież to jednak nieszczęście, że umowa moja wygasa z ostatnim dniem tego miesiąca? Przy obecnym stanie rzeczy, z pewnością zdecyduję się na jej przedłużenie. Może od razu poproszę o dożywocie, podobno za dobre sprawowanie można skrócić wyrok nawet do połowy :).&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Potrzebna pilna hospitalizacja</title>
   <link href="http://room-303.com/blog/2004/08/06/6cc2450caa1ee878a5c430dc069e29ed/"/>
   <updated>2004-08-06T10:01:04+00:00</updated>
   <id>http://room-303.com/blog/2004/08/06/6cc2450caa1ee878a5c430dc069e29ed</id>
   <content type="html">&lt;p&gt;Dzwoni telefon. Z właściwą sobie gibkością chwyciłem słuchawkę i podniosłem ją do ucha.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Patrys, PewnaFirma™. Słucham?&lt;br /&gt;
&lt;br /&gt;
(cisza)&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Słucham?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Dzień dobry, ja chciałam z Panem Marcinem.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Przykro mi, nie ma tu nikogo takiego.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No proszę mnie przełączyć do pokoju 61.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Przykro mi, nie ma takiego pokoju.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Ja do męża dzwonię.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Wydaje mi się, że to pomyłka.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A to nie jest Szpital Kolejowy?&lt;br /&gt;
&lt;br /&gt;
Jak widać upartego klienta nic nie zniechęca. Nawet podanie nazwy firmy przy odbieraniu telefonu. Sprytna pani podejrzewała, że szpital ma już dość jej ciągłych telefonów i dla niepoznaki maskujemy się podając się za pralnię, fryzjera, czy też może firmę hostingową. Teraz z pewnością nerwowo trzyma trzęsący się palec na guziku “Redial”, kalkulując po cichu, jaką łapówkę mi zaproponować w zamian za możliwość komunikacji z mężem…&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Nowość! Firmowe koszulki!</title>
   <link href="http://room-303.com/blog/2004/08/02/b061486ae53b14f6dff45fc272fa4a83/"/>
   <updated>2004-08-02T15:27:54+00:00</updated>
   <id>http://room-303.com/blog/2004/08/02/b061486ae53b14f6dff45fc272fa4a83</id>
   <content type="html">&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;					&amp;lt;/p&amp;gt;
					&amp;lt;p align=&quot;center&quot;&amp;gt;
						&amp;lt;img src=&quot;custom/patrys/files/koszulka.png&quot; alt=&quot;Koszulka&quot; /&amp;gt; &amp;lt;img src=&quot;custom/patrys/files/koszulka2.png&quot; alt=&quot;Koszulka&quot; /&amp;gt;
					&amp;lt;/p&amp;gt;
					&amp;lt;p&amp;gt;
						W związku z dużą popularnością strony przygotowaliśmy niespodziankę. Liga Liero zgodziła się przygotować
						specjalne koszulki z najbardziej kultową postacią w historii informatyki. Nadruki są wykonane na bardzo
						dobrych jakościowo koszulkach firmy PromoStar. Na koszulkach nie zarabiamy, nie jest to też sprzedaż towaru.
						Aby otrzymać koszulke wystarczy zasponsorować Ligę Liero.
					&amp;lt;/p&amp;gt;
					&amp;lt;p&amp;gt;
						Aby otrzymać koszulkę męską białą, należy wpłacić przynajmniej 35 PLN, Wpłacając przynajmniej 45 PLN, otrzymasz
						koszulkę w wybranym przez ciebie kolorze.
					&amp;lt;/p&amp;gt;
					&amp;lt;p&amp;gt;
						Aby otrzymać koszulkę damską białą, należy wpłacić przynajmniej 40 PLN, Wpłacając przynajmniej 45 PLN, otrzymasz
						koszulkę w wybranym przez ciebie kolorze.
					&amp;lt;/p&amp;gt;
					&amp;lt;p&amp;gt;
						Liga pokrywa koszty wysyłki. Zamówienia na więcej sztuk są, oczywiście, tańsze.
					&amp;lt;/p&amp;gt;
					&amp;lt;p&amp;gt;
						Pamiętajcie, że nie robimy tego dla zysku, pomaga nam to utrzymać serwer. Koszulka to forma podziękowania.
					&amp;lt;/p&amp;gt;
					&amp;lt;p&amp;gt;
						Kontakt i zamawianie koszulek za pośrednictwem e-maila: &amp;lt;a href=&quot;http://www.liero.org.pl/email.php?em=greybrow&quot;&amp;gt;Greybrow&amp;lt;/a&amp;gt;.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Zgubiony poemat Dr. Seuss'a</title>
   <link href="http://room-303.com/blog/2004/07/30/9bdbb3133349b65e061009eb47daf971/"/>
   <updated>2004-07-30T09:55:45+00:00</updated>
   <id>http://room-303.com/blog/2004/07/30/9bdbb3133349b65e061009eb47daf971</id>
   <content type="html">&lt;p&gt;Postanowiłem zamieścić tekst podesłany mi przez Havnera. Myślę, że świetnie pasuje do klimatu strony. Wielkie dzięki, Havner. Zapraszam do lektury. Poza tym w ofercie pojawiły się &lt;del&gt;kultowe koszulki&lt;/del&gt;! :)&lt;br /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Ja Kocham Swoją Pracę!&lt;/p&gt;

  &lt;p&gt;Ja kocham swoją robotę, zarobek kocham też!&lt;br /&gt;
Ja kocham je coraz mocniej, czy słońce jest, czy deszcz.&lt;br /&gt;
Ja kocham mego szefa, on przecież jest wspaniały.&lt;br /&gt;
Kocham też jego szefów - i wszystkich pozostałych.&lt;/p&gt;

  &lt;p&gt;Ja kocham swoje biuro i jego pochodzenie,&lt;br /&gt;
Na urlopowy wyjazd go nigdy nie zamienię.&lt;br /&gt;
Kocham biurowych mebli ponury szary kolor&lt;br /&gt;
I sterty dokumentów rosnące wciąż na nowo.&lt;/p&gt;

  &lt;p&gt;Wydajność mojej pracy wzrasta wręcz nadzwyczajnie&lt;br /&gt;
I nie znam innych przyczyn by było mi tak fajnie.&lt;br /&gt;
Ja kocham też obecność moich współpracowników,&lt;br /&gt;
Pełną złośliwych uwag, uśmiechów, wykrzykników.&lt;/p&gt;

  &lt;p&gt;Ja kocham mój komputer, kocham jego programy.&lt;br /&gt;
Przytulam je do siebie, chociaż nie bez obawy.&lt;br /&gt;
Ja kocham każdy program i wszystkie jego pliki&lt;br /&gt;
Zwłaszcza jeśli ich praca przynosi mi wyniki.&lt;/p&gt;

  &lt;p&gt;Szczęśliwy jestem tutaj! Tu źródło mej radości,&lt;br /&gt;
Niewolnik swojej Firmy - to pełnia szczęśliwości!&lt;br /&gt;
Ja kocham tę robotę. Ja kocham swe zadania.&lt;br /&gt;
I kocham tych nudziarzy co ględzą na zebraniach.&lt;/p&gt;

  &lt;p&gt;Ja kocham swoją pracę, być może was to nudzi.&lt;br /&gt;
I również bardzo kocham przybyłych właśnie ludzi.&lt;br /&gt;
Tych dwu przyjaznych ludzi, wcale nie żadnych głupków.&lt;br /&gt;
Co w śnieżnobiałym kitlu wywiozą mnie do “czubków”.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Wolny przekład z angielskiego: Andrzej S.&lt;/p&gt;

&lt;p&gt;Niestety, źródło i dokładny autor nie są nam znane.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Lekcja statystyki</title>
   <link href="http://room-303.com/blog/2004/07/23/73fc7d935ae9943a08e5da5d8e278d9d/"/>
   <updated>2004-07-23T16:31:26+00:00</updated>
   <id>http://room-303.com/blog/2004/07/23/73fc7d935ae9943a08e5da5d8e278d9d</id>
   <content type="html">&lt;p&gt;Dziś rano, zgodnie z poleceniem SamegoPrezesa™ wysłaliśmy plan na dziś i do końca lipca. Odpowiedź na mój plan:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Proszę przesładnie dokładnej listy zadań własnych do wykonania w lipcu 2004.&lt;/p&gt;

  &lt;p&gt;Do listy proszę dołączyć plan realizacyjny tych zadań (w ujęciu szczegółowym).&lt;/p&gt;

  &lt;p&gt;Proszę przewidzieć rezerwę czasową na różne zadania zlecanie na bieżąco (operacyjne).&lt;/p&gt;

  &lt;p&gt;[…]&lt;/p&gt;

  &lt;p&gt;Inne:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;proszę od dzisiaj o raporty po każdym dniu ze szczegółową listą (z czasem wykonania) czynności.&lt;/li&gt;
    &lt;li&gt;proszę rejestrować i informować mnie o wszystkich ew. telefonach dotyczących twoich ew. interwencji informatycznych.&lt;/li&gt;
    &lt;li&gt;przypominam o zadaniu stworzenia nowego narzędzia dla naszego klienta (na jakim etapie jest to zadanie?)&lt;/li&gt;
    &lt;li&gt;przypominam o zadaniu - terminarz grupowy/sieciowy&lt;/li&gt;
    &lt;li&gt;przypominam o zadaniu - struktura organizacyjna firmy (szablon)&lt;/li&gt;
    &lt;li&gt;prosze o informacje szczegółową dot. powstającego systemu - proszę o propozycję metody wdrażania.&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Odpowiedź na plan MojegoWspółpracownika™:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Te punkty to lista zadań (i to ogólna!), a nie plan. Plan musi zawierać szczegółowe operacje, z których składa się dane zadanie z rozpisaniem szczegółowego terminu (od … do) i godzin wykonania.&lt;/p&gt;

  &lt;p&gt;Poza tym z listy wynika, że przez tydzień nie będziesz miał co obić, bo te zadania to może na jeden dzień - to za co mamy Ci zapłacić?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Odnośnie tego ostatniego, owe “ogólnikowe zadania, które nie są planem” mają  w sumie około 40 godzin roboczych, tak długiej doby jeszcze nigdy nie widziałem. Doszliśmy więc do wniosku, że żyjemy w kraju o polarnych dniach i tropikalnych nocach, te pierwsze trwają bowiem tyle, ile to konieczne, a te drugie tyle, żeby nie spóźnić się rano do biura.&lt;/p&gt;

&lt;p&gt;Co zaś tyczy się szczegółowych danych powstającego systemu? Proszę bardzo:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;60 tabel w bazie danych&lt;/li&gt;
  &lt;li&gt;25000 linii kodu&lt;/li&gt;
  &lt;li&gt;80 plików&lt;/li&gt;
  &lt;li&gt;800 kb miejsca&lt;/li&gt;
  &lt;li&gt;2800 commitów w logu subversion od 10. maja&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Z innych danych statystycznych: od ostatniej dłuższej wizyty SynaPrezesa™ doświadczamy braku jednej myszki bezprzewodowej i jednej klawiatury bezprzewodowej. Jak mówił, “pożyczył je do środy”. Zapomniał podać datę chociażby z przybliżeniem do roku.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Każde dziecko chce być w reprezentacji</title>
   <link href="http://room-303.com/blog/2004/07/22/2f8a7ab374cd73f37ff45731048abf14/"/>
   <updated>2004-07-22T18:27:38+00:00</updated>
   <id>http://room-303.com/blog/2004/07/22/2f8a7ab374cd73f37ff45731048abf14</id>
   <content type="html">&lt;p&gt;Dzień zaczął się dosyć skromnie, tylko SamPrezes™ wpadł na chwilę, wydając z siebie przeraźliwy ryk i krzycząc, że tak dalej być nie może. Prawdziwego pracownika działu IT takie rzeczy nie przerażają, toteż z MoimWspółpracownikiem™ pomyśleliśmy, że znów coś nie działa i nikt nas nie raczył powiadomić. To był jednak błąd, o czym miałem się szybko przekonać. Nie wiedziałem jednak, że za chwilę popełnię błąd jeszcze większy, a karalny śmiercią nawet. Otóż w napadzie nagłej radości po przekomicznej scenie szturmu na nasze biuro, pozwoliłem sobie ustawić taki oto status na komunikatorze:&lt;/p&gt;

&lt;blockquote&gt;Plan na dziś:&lt;br /&gt;
&lt;br /&gt;
[ ] wypłata&lt;br /&gt;
[ ] zwolnić się&lt;/blockquote&gt;

&lt;p&gt;A nadmienić tu należy, że atak SamegoPrezesa™ skierowany był właśnie w system wymiany planów pracy pomiędzy działem IT a zarządem. Grunt, że ustawiając status nie byłem świadom mojej niebotycznej roli w domenie Public Relations na linii firma - reszta świata. SamPrezes™, który akurat był korzystał z domowego komputera, niemal przypłacił mój wybryk życiem. Serce stanęło mu w piersi, a cała krew wbrew prawom powszechnego ciążenia znalazła się naraz w głowie. Firma jest jak rodzina. A krzywd wyrządzonych rodzinie się nie wybacza.&lt;br /&gt;
&lt;br /&gt;
Nie zdziwiło mnie przeto nagłe telefoniczne wezwanie na dywanik. Dziarskim krokiem ruszyłem na spotkanie z nieznanym, nawet po części nie przeczuwająć czającego się na mnie niebezpieczeństwa. Wszedłem oto do przenajświętszego pokoju w firmie, od drzwi już widząc, że coś jest nie tak. Jak bowiem często w jednym pokoju znajdują się trzy najważniejsze dla mojej zawodowej przyszłości osoby, na co dzień pracujące w różnych gabinetach? Przewodniczący komisji lustracyjnej zdecydowanym gestem wskazał mi najtwardsze krzesło w promieniu 3 kilometrów i miłym, aczkolwiek stanowczym głosem szepnął:&lt;/p&gt;

&lt;blockquote&gt;- SIADAJ!&lt;br /&gt;
- Słucham.&lt;br /&gt;
- Przyszedłeś na sąd.&lt;/blockquote&gt;

&lt;p&gt;Specjalnie religijną osobą nie jestem, wiem jednak, czym takie rzeczy pachną. Na szczęście rodzina wie, gdzie wyszedłem z domu i upomną się o zwłoki.&lt;/p&gt;

&lt;blockquote&gt;- A moge wiedzieć, co zrobiłem?&lt;br /&gt;
- Chodzi o całokształt!&lt;br /&gt;
- Jesteście, a właściwie jesteś, bezczelny i arogancki w swoim zachowaniu.&lt;br /&gt;
- Co takiego zrobiłem tak właściwie?&lt;br /&gt;
- Chodzi o to, jak wyrażasz swój stosunek do pracy.&lt;br /&gt;
- A jak wyrażam?&lt;br /&gt;
- Z naszej strony to wygląda tak, że nic wam się nie podoba. Wszystko negujecie, nie chcecie przyjmować nowych zadań.&lt;br /&gt;
- Bo każde nowe zadanie to kolejne godziny po 22:00?&lt;br /&gt;
- To nie może tak być! Z naszej strony to wygląda inaczej, nie, to jest inaczej!&lt;br /&gt;
- To znaczy jak?&lt;br /&gt;
- Masz jakiś problem z tą pracą? Z zarobkami?&lt;br /&gt;
- O tym już rozmawialiśmy, dlatego tylko na dwa miesiące umowę podpisałem.&lt;br /&gt;
- Tak dalej być nie może. Bo ty nie chcesz wykonywać takich zadań ogólnie informatycznych.&lt;/blockquote&gt;

&lt;p&gt;W tym momencie przypomniał mi się poprzedni telefon od SamegoPrezesa™: “który z was mi naprawi satelitę?” oraz lukratywna propozycja fotografowania piłek.&lt;/p&gt;

&lt;blockquote&gt;- Jakich zadań?&lt;br /&gt;
- Ja wiem, że to wszystko ma dwie strony, z jednej jesteś programistą, a z drugiej informatykiem i to się musi pogodzić jakoś. Płacimy ci za to, żeby sieć firmowa działała, ale to nie zarabia na siebie, dlatego musisz też pracować dla naszych klientów. Musisz mieć na to czas.&lt;br /&gt;
- Właściwie ostatnio tylko na to mam czas.&lt;br /&gt;
- Nie możesz zaniedbywać programowania, to za wolno idzie, ja bym chciał, żeby szło tak z osiem razy szybciej.&lt;br /&gt;
- Ale nas jest tylko dwóch...&lt;br /&gt;
- No właśnie, my nie wiemy, co wy robicie! Ja nie wiem, za co ci płacę!&lt;/blockquote&gt;

&lt;p&gt;Tu nie wytrzymałem i pomimo swojej trudnej sytuacji, wybuchnąłem śmiechem. Aż chciało się dodać “jak nie wiecie, za co płacicie, to przeczytajcie umowę - tam jest napisane, że płacicie za administrację siecią, nie ma ani słowa o tworzeniu i uaktualnianiu stron o krzywych kręgosłupach i obciążeniu biednych dzieci z Koziej Wólki tornistrami i plecakami w latach 1027-1999”. Zresztą, nie byłem świadom swego dualizmu korpuskularno-falowego, odwiecznego rozłamu na część informatyczną i programistyczną, przy czym podział jest na pół i obie połowy są za małe - jako że i programowanie, i aktualizacja stron są osiem razy zbyt wolne. Teoretycznie mógłbym przyspieszyć to dwukrotnie rezygnując z pewnych używek (sen, jedzenie, rodzina), jednak doba z pewnością do 96 godzin nie urośnie, by sprostać wymaganiom samej góry. Filozofię musiałem jednak odłożyć na bok:&lt;/p&gt;

&lt;blockquote&gt;- I udzielamy ci oficjalnej nagany!&lt;br /&gt;
- A za co tym razem?&lt;br /&gt;
- Za twój szczeniacki wybryk na gadu!&lt;br /&gt;
- A co takiego zrobiłem?&lt;br /&gt;
- Twój status! To jest nie do przyjęcia, żeby taki wizerunek firmy kreować na zewnątrz!&lt;br /&gt;
- A jaki to ma związek z firmą?&lt;br /&gt;
- Dla mnie, jak widzę ciebie i w opisie słowo &quot;firma&quot;, to jednoznacznie wiem o co chodzi!&lt;br /&gt;
- Ale tam nie było nawet słowa &quot;firma&quot;. Poza tym status jest dla grupy znajomych a nie dla połowy świata.&lt;br /&gt;
- Nie może tak być! To niedopuszczalne!&lt;br /&gt;
- A gdybym ustawił status &quot;zaraz się zastrzelę&quot;, to też by było niepoprawne politycznie?&lt;br /&gt;
- TAK!.. Albo może nie... No &quot;zaraz się zastrzelę&quot; to chyba nie, ale zależy w jakich godzinach...&lt;br /&gt;
- ...&lt;br /&gt;
- A teraz najważniejsza kwestia, musicie mieć system planowania i informowania mnie o postępach prac. Ja muszę wszystko wiedzieć. I nie mówię tu o programistycznych szczegółach, chodzi mi o ogólne rzeczy i terminy zamknięcia.&lt;br /&gt;
- Był wcześniej system, gdzie rozpisywaliśmy terminy i zadania, ale został odrzucony przez zarząd...&lt;br /&gt;
- Bo jak piszesz &quot;modyfikacja modułu zamówień&quot;, to mi to nic nie mówi!&lt;/blockquote&gt;

&lt;p&gt;Tak oto dowiedziałem się, że nawet zastrzelić się mogę tylko po godzinach, a kiedy przychodzi do programowania, SamPrezes™ chciałby jednocześnie nie wnikać w szczegóły i je znać.&lt;br /&gt;
&lt;br /&gt;
Nieomal zapomniałbym dodać, że to MójWspółpracownik™ ma na mnie taki zły wpływ. To wszystko ta bestyja, ten potwór szkaradny, ta wredna zaraza. Pewnie właśnie przez niego mam coraz więcej pracy, a odkąd zaczął pracować nad systemem sprzedaży, prace spowolniły, a nawet praktycznie stanęły w miejscu! Wiedziałem, że nie mogę ci ufać, tuś mi bratku! Gdyby tylko SamPrezes™ wiedział, że znamy się sporo dłużej niż ja pracuję w tej firmie, a na pewno wieki dłużej zanim z nim firma podjęła współpracę… Aż tyle czasu zwlekał, zanim krew mą psuć zaczął.&lt;br /&gt;
&lt;br /&gt;
Podsumowując: Starożytni się nie mylili, człowiek ma jednak naturę dwoistą. Jest za a nawet przeciw. Systemy planowania są najlepsze gdy, nie zawierają informacji o wykonaniu danego zadania. Poprzedni system miał kratkę przy każdej pozycji, w której stawialiśmy krzyżyk po zamknięciu zadania w terminie, niestety SamPrezes™ poinformował nas, że “te krzyżyki to sobie możemy na grobach postawić”. A motto na dziś? “Ja się zaraz zastrzelę, ale tylko w godzinach 18:00-09:30”.&lt;br /&gt;
&lt;br /&gt;
Ostatnia zaś wypowiedź, która padła pod moim adresem, to “wy sobie stworzyliście firmę w firmie!”. Jakby się nad tym dłużej zastanowić, jest to święta prawda. Wszystko musimy robić sami, załatwiać sami, planować sami. Sami też musimy zarobić na swoją pensję, stanowimy właściwie we dwóch w pełni wartościową firmę. Jedna tylko myśl kołacze mi się po głowie. W takim razie… po co nam prezes?&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Krótka lekcja architektury wnętrz</title>
   <link href="http://room-303.com/blog/2004/07/19/fb27ab3510508fe8b93c8cdc11567569/"/>
   <updated>2004-07-19T18:48:39+00:00</updated>
   <id>http://room-303.com/blog/2004/07/19/fb27ab3510508fe8b93c8cdc11567569</id>
   <content type="html">&lt;p&gt;Dziś rano pierwszy raz od trzech dni zobaczyliśmy z MoimWspółpracownikiem™ swoje biuro. Pewnie wielu z was wydawać by się mogło, że biura pozostawione zamknięte na trzy doby po ponownym otwarciu choć po części przypominają stan, w jakim zostały odizolowane od reszty świata? Człowiek uczy sie na błędach. Zaraz po otwarciu drzwi dobiegł mych uszu niepokojący chrzęst sobiegający spod moich stóp. Krótkie spojrzenie w dół upewniło mnie w przekonaniu, że coś jest nie tak. Szuflada z narzędziami/śrubkami/kołkami/kablami/częściami komputerowymi uległa rozprzestrzenieniu na znaczną część podłogi. Możnaby nawet powiedzieć, że zasymulowała raytracing i śledząc, gdzie śrubki dotarły, a gdzie nie, możnaby dość precyzyjnie wyznaczyć punkt impaktu. Nie miałem jednak szansy nacieszyć się nowoodkrytym znaleziskiem, bo zadzwonił klient z pytaniem, kiedy uaktualnimy jego stronę, umieszczając na niej przekazany nam do zeskanowania plan zagospodarowania budynku. Byłbym mu rychło odpowiedział, gdyby nie fakt, że plan pozostawiony przeze mnie w czwartek na szczycie monitora najwyraźniej samoczynnie opuścił miejsce swego stałego zameldowania. Spośród kół ratunkowych wybrałem telefon do przyjaciela.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Tiiiit… tiiiit… tiiiit… … tit tit tit tit&lt;br /&gt;
&lt;br /&gt;
SynPrezesa™ nie odpowiada. Nie wiem w ogóle, skąd na myśl mogło mi przyjść, że to on odpowiada za zastany krajobraz biura. Być może to lokalna flora w postaci występujących na frontowej ścianie winorośli przedarła się do wnętrza budynku i tak złośliwie wszystko porozrzucała? Stojąc przed tym oto dysonansem poznawczym, przez niektórych nazywanym rozterkami bądź problemem wyboru, zostałem natychmiast postawiony w stan gotowości przez SamegoPrezesa™, który postanowił do mnie zadzwonić.&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Dzień dobry.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Dzień dobry.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Jak tam w Warszawie?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A dziękuję, obyło się bez specjalnych ekscesów.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A w biurze?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;W tej sprawie gorzej, nie mogę dodzwonić się do SynaPrezesa™, a mam niejasne przeczucie, że to on porozrzucał całą zawartość szuflady po podłodze naszego biura.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Aha, dzwoń na numer domowy, komórki może nie odbierać, bo pewnie śpi.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Nie będę już mówił, że zginęła mi dokumentacja pozostawiona przez klienta, a dzisiaj jeszcze muszę ją umieścić na stronie internetowej i zwrócić.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Wiesz co, posprzątajcie tam. Tak będzie najlepiej. Bo na niego to nie ma co liczyć. O, wiem. Zmienimy zamki.&lt;br /&gt;
&lt;br /&gt;
Tak oto dowiedziałem się, że jedyna metoda na powstrzymanie kogoś, kto nie pracuje w danej firmie przed wejściem na jej teren to wymiana zamków do biura. Coś w tym jest, bo SynPrezesa™ już wielokrotnie odmawiał zdania swojego kompletu kluczy do serwerowni. Jeśli zamknąć dziecku piaskownicę, to skąd będzie wynosić cudze zabawki? O ile sprzątnięcie zawartości dość sporej szuflady o wymiarach 100x50 cm z podłogi biura jest jeszczew rzeczą wykonalną, to zupełnie nie mam pomysłu, co zrobić z kolekcją rusztowań, rurek, kartonów i reflektorów, które od środy zajmują większą część powierzchni biura mojego BezpośredniegoPrzełożonego™. Do nich to również SynPrezesa™ zdaje się nie przyznawać.&lt;br /&gt;
&lt;br /&gt;
Parę godzin później nasz firmowy pupil postanowił nawiedzić nasze biuro. Wtoczył się do pokoju, niczym doświadczony fakir zręcznie i lekko stąpając po leżących na ziemi śrubkach i rzucił niedbale swoje stałe “czeeeeeeść” wypowiadane z werwą i entuzjazmem godnymi kulawego ślimaka po nalewce wchodzącego po pionowej ścianie. Bystrym wzrokiem szybko zauważyl, że nie jesteśmy zbyt szczęśliwi z faktu, że rebootował router zamiast sprawdzić, czemu sieć nie działa podczas małej awarii pod naszą nieobecność. Szybko dopadła go też niepokojąca myśl, że nie podoba nam się również nowa koncepcja wystroju wnętrz, a właściwie podłóg. Pomyślał pewnie: “jasny gwint, moje wyśrubowane gusta nie trafiają w ich oczekiwania, trzeba się z tego jakoś wykręcić”. Powiedział więc:&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No bo tego, router się zawiesił i przyszedłem go rebootować.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A czemu dokumenty mojego klienta z mojego biurka nagle znalazły się w szufladce na biurku u kogoś zupełnie innego i w innym pokoju?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No bo ciągle spadały z tego monitora.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Jak to spadały? Same?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No bo przecież był przeciąg.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;W zamkniętym biurze przeciąg?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No bo router się zawiesił i musiałem tu wejść.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;I otwierać wszystko na oścież żeby wcisnąć power na obudowie?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No bo brałem te narzędzia no i ten router…&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A szuflada też się pewnie zawiesiła, co?!&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;To ja muszę iść, czeeeeśc.&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Etatami sypiąc z rękawa</title>
   <link href="http://room-303.com/blog/2004/07/19/3825c2c7c88f47df4b520f85f8654b51/"/>
   <updated>2004-07-19T10:42:05+00:00</updated>
   <id>http://room-303.com/blog/2004/07/19/3825c2c7c88f47df4b520f85f8654b51</id>
   <content type="html">&lt;p&gt;Środa, ja i MójWspółpracownik™ idziemy poprosić SamegoPrezesa™ o zwolnienie z pracy w piątek. Cel: wyjazd do Warszawy na zlot PLD.&lt;br /&gt;
&lt;br /&gt;
(puk, puk)&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Można?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Tak, oczywiście.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Chcieliśmy prosić o wolny piątek.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A co się stało?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Chcemy jechać na zlot PLD do Warszawy.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A o której jedziecie?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Myślę, że z samego rana.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Uuuu, szkoda… bo mamy w piątek inwentaryzację magazynu i miałem dla was zajęcie przy inwentaryzacji na piątek i sobotę.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Uhm.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No ale jedźcie, uczcie się tego linuksa. Mam też dla was dobrą wiadomość.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Oj…&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Będziecie mogli odpocząć od tego ślęczenia przy komputerze całymi dniami.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;…&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Wyznaczymy wam terminy i będziecie pomagać BezpośredniemuPrzełożonemu™ wydawać klientom towar w magazynie.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Ja muszę obejrzeć swoją umowę.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Czemu?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Bo tam chyba jest napisane “administrator sieci”.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No tak.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No to trzeba będzie dopisać “magazynier”.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No możemy dopisać.&lt;br /&gt;
&lt;br /&gt;
Tak oto SamPrezes™ uraczył nas chwilą odpoczynku od trudów codziennej pracy. I to wszystko za darmo, nic nie trzeba dopłacać. Drugi szczęścia próbował MójWspółpracownik™:&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Jak tam postępy nad StarSystemem?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A jak tam postępy nad moją umową?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No przecież masz umowę.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Jakoś jej nie widzę…&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Wy młodzi to tacy jesteście przywiązani do tych papierków. Papier mogę podrzeć i powiedzieć, że nie było żadnej umowy, a jak dam słowo to masz jak w banku. Skoro powiedziałem, że jest umowa, to jest.&lt;br /&gt;
&lt;br /&gt;
Na to wszystko odezwała była się PaniPrezesowa™:&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Ja nie rozumiem, jak to jest, że siedzi dwóch informatyków, a mój mąż musiał cały weekend siedzieć w domu i poprawiać produkty w sklepie internetowym?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Bo nas jest tylko dwóch?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Bo my się nie zajmujemy produktami w sklepie internetowym?&lt;br /&gt;
&lt;br /&gt;
Podbudowani całą sytuacją udaliśmy się na słuszny spoczynek w blasku ekranów przy naszych biurkach. Niestety, organizm ludzki - rzecz słaba, więc w połowie drogi padliśmy obaj na kolana zanosząc się salwami śmiechu. A to wszystko oczywiście za sprawą niebywałego optymizmu, jakim przepełniła nas perspektywa pracy w magazynie.&lt;br /&gt;
&lt;br /&gt;
Dzień nie byłby jednak do końca stracony, gdyby nie odwiedził nas SynPrezesa™ w towarzystwie UtalentowanegoKolegi™. Ten ostatni jest już światowej sławy specjalistą w każdej materii, głównie za sprawą swych błyskotliwych opinii w stylu “teraz jest bluetooth i nie trzeba już mieć CD-ROMu”. Dwóch rzeczonych panów otrzymało od SamegoPrezesa™ trudną misję na terenach wroga: sfotografować piłki, których nawet mnie nie udało się uwiecznić na zdjęciach (wspominałem o tym parę wpisów wcześniej). W tym celu przynieśli 8 reflektorów halogenowych, metalowe szyny, szklanki i kartony. Już po 4 godzinach udało im się zbudować zupełnie zbędne rusztowanie, wyciąć otwór w kartonie po monitorze, wyścielić go dokładnie białymi kartkami, zapchać reflektorami, wstawić tam szklankę i umieścić na niej piłkę do koszykówki. Już po kolejnej godzinie wykonali pierwsze zdjęcia. Były wprost idealne… do Strefy 11. Czarna piłka z jasnymi krawędziami na świetliście białym tle. Efekt przypominał to, co można zauważyć w momentach restrospekcji w tak popularnych serialach produkcji brazylijskiej. Więcej grzechów nie pamiętam…&lt;br /&gt;
&lt;br /&gt;
Post scriptum: agencja Reuters donosi, że dwaj porwani przez Irakijczyków Amerykanie są poddawani torturom i zmuszani do ciężkiej pracy po 12 godzin w nieludzkich warunkach w jednej z wrocławskich firm. Sprawą zainteresowało się ONZ i wysłało tam swoich inspektorów. Próba przeprowadzenia badań krwi wypadła negatywnie, znaleziono tylko ciemnobrunatny płyn o wysokiej zawartości kofeiny. Obaj osobnicy mamrotali coś bełkotliwie pod nosem. Brzmiało to jak “NEI MAM PACHA”.&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Niedoszły artysta</title>
   <link href="http://room-303.com/blog/2004/06/30/a2725556e96f107a586d9dd051687246/"/>
   <updated>2004-06-30T16:52:51+00:00</updated>
   <id>http://room-303.com/blog/2004/06/30/a2725556e96f107a586d9dd051687246</id>
   <content type="html">&lt;p&gt;Nie tak znowu dawno temu, za siedmioma terminalami, za siedmioma ruterami, siedziałem sobie w biurze, jak zwykle nudząc się strasznie, jak to nudzić się mieli w zwyczaju ludzie od dawien dawna pracujący za trzech. Sielankę mą przerwał był niestety BezpośredniPrzełożony™, który przyszedł do nas i rzecze:&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Patrys, trzeba coś pilnie zrobić!&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A co trzeba tak pilnie zrobić, że aż muszę przerwać wpisywanie artykułów na stronę klienta, co jest piorytetem i zajmie mi co najmniej tydzień, po czym planowałem innemu klientowi stronę internetową skończyć?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Ale to jest pilne i musisz przerwać. I to teraz, bo na popołudnie musi być gotowe.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A o co chodzi?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Trzeba zrobić zdjęcia tych oto piłek do sklepu internetowego.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;To ja poproszę o to polecenie na piśmie.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Patrys, nie rób sobie jaj.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Proszę o polecenie na piśmie.&lt;br /&gt;
&lt;br /&gt;
A treść owego polecenia brzmiała mniej-wiecej tak:&lt;br /&gt;
&lt;br /&gt;
“Patrys!&lt;br /&gt;
&lt;br /&gt;
Masz zrobić pilnie zdjęcia piłek do sklepu.&lt;br /&gt;
&lt;br /&gt;
Koszykówka: 100x100px&lt;br /&gt;
Piłka nożna: 100x100px&lt;br /&gt;
Siatkówka: 90x90px&lt;br /&gt;
&lt;br /&gt;
– BezpośredniPrzełożony™“&lt;br /&gt;
&lt;br /&gt;
Pod spodem umieściłem stosowne:&lt;br /&gt;
&lt;br /&gt;
“Jestem administratorem sieci, programistą i webdesignerem.&lt;br /&gt;
Nie jestem fotografem.&lt;br /&gt;
Mam już trzy etaty, dziękuję za czwarty.&lt;br /&gt;
Jak rozumiem moja pensja teraz właśnie wzrasta?”&lt;br /&gt;
&lt;br /&gt;
A dodać trzeba, że pracuję za trzy osoby, ale pieniądze dostaję tylko za niecałą jedna od czasu, kiedy to zarząd obniżył wszystkim pensje o 1/3. Grunt, że o fotografowaniu mogłem przez chwilę zapomnieć. Radość jako jedno z ulotnych uczuć jest dość krótkotrwała, więc po chwili przyszedł ponownie BezpośredniPrzełożony™:&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Ej, czemu nie chcesz porobić zdjęć piłek.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Bo to nie moja działka, mam pilniejsze rzeczy na głowie.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A co ci za różnica, przecież firma płaci ci za czas, to możesz robić wszystko.&lt;br /&gt;
&lt;br /&gt;
Argument ten był mnie powalił. Że też nie wpadłem na to wcześniej. Ludzie idą studiować informatykę, pracują w zawodzie, robią sobie hobby z komputerów właśnie ze względu na tę zawodową swobodę gwarantowaną przez stanowisko informatyka. Bo przecież firma płaci za czas, a nie za wiedzę. Można sobie zdjęcia porobić, dywany wyprać, piec kaflowy zbudować, fantazja zalezy tylko od zarządu. Czyż zna ktoś bardziej urozmaiconą i nieprzewidywalną pracę? Czysta radość.&lt;br /&gt;
&lt;br /&gt;
A żeby nie było tak przytłaczająco: dziś od rana wprowadzam dalej artykuły na stronę jednego z klientów. Mam już dosyć otwierania dokumentów Worda w OpenOffice po to, by przepisać je ręcznie do HTML. Na wymioty mi się zbiera, jak sobie pomyślę, że roboty mam jeszcze luźno do piątku. Głowa mnie boli. Dzwoni telefon, ludzie z biur na wyższym piętrze proszą, żebym naprawił nasz firmowy faks. Z radością oderwałem się więc od mojej arcyciekawej pracy z myślą, że choć przez chwilę porobię coś odpowiadającego moim kompetencjom i nie będę robił za maszynistkę. Udałem się więc na górę, naprawiłem faks. Pocierając bolące oczy i ledwo powłócząc nogami udałem się w kierunku drzwi z nadzieją, że wrócę na dół i uda mi się wyjść chociaż o jakiejś sensownej porze. Chodzi oczywiście o zminimalizowanie nadgodzin, a nie o wyjście przed czasem. Głowy już prawie nie czuję, żołądek niebezpiecznie straszy cofnięciem ostatnich commitów, już-już miałem złapać za klamke kiedy zza pleców dobiegł mnie głos SamegoPrezesa™. Popatrzyłem na niego jak przez mgłę, a uszu moich dobiegły te słowy:&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Co ty tak marnie wyglądasz, chory jesteś?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Nie… głowa mnie strasznie boli…&lt;br /&gt;
&lt;br /&gt;
Tutaj chciałem dodać, że 20 bezpłatnych nadgodzin tygodniowo to dla mnie za dużo, ale SamPrezes™ mnie ubiegł.&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Znów za dużo piwa wypiłeś.&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Zakład pogrzebowy "Radość Życia"</title>
   <link href="http://room-303.com/blog/2004/06/25/6a0f8108f1cda4d85156145d2ba9508b/"/>
   <updated>2004-06-25T17:23:00+00:00</updated>
   <id>http://room-303.com/blog/2004/06/25/6a0f8108f1cda4d85156145d2ba9508b</id>
   <content type="html">&lt;p&gt;SamPrezes™ wzywa. Początki wdrożenia systemu sprzedaży. System o funkcjonalności Subiekta czy Symfonii. Powstaje z długimi przerwami mniej-więcej od początku roku.&lt;br /&gt;
&lt;br /&gt;
Okazało się, że oprócz listy rutynowych poprawek SamPrezes™ postanowił przekazać nam rewelacyjne wiadomości. Otóż pracujemy zbyt wolno, niestety. Co prawda mamy też tysiące innych czasochłonnych obowiązków, jednakże w końcu jest nas dwóch (ja i MójWspółpracownik™). Co prawda spędzamy w biurze czas od 9:30 do 23:00, ale przecież doba ma 24 godziny. Co prawda nikt nam nie płaci za nadgodziny, z drugiej jednak strony najlepszą motywacją dla szanującego się programisty powinien być już sam fakt obcowania z komputerem. Co prawda wypijamy po 4 kawy dziennie i wracamy z bólem głowy do domu, ledwo widząc na oczy, ale przecież cieszy nas fakt, że nasze dziecko działa. Nasze narzekania są więc bezpodstawne. Nie potrafimy sobie zorganizować czasu, skoro cudów dokonujemy w pięć dni a nie w trzy, a rzeczy niemożliwych w dobę miast dwóch godzin. I nie gra tu żadnej roli fakt, że jest godzina 19:10, a ja jeszcze nie miałem czasu zjeść śniadania.&lt;br /&gt;
&lt;br /&gt;
Rozmowa z SamymPrezesem™:&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Czemu to tak długo trwa?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Siedzimy w biurze do 22:00 - 23:00&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No wiem&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;W poniedziałek klient odbiera ode mnie stronę internetową i załatwiam umowę hostingową&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No wiem&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;MójWspółpracownik™ robi stronę jednej z linii sprzedawanych przez nas produktów&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No wiem&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A później robi stronę fabryki na odbywające się za kilka dni targi&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No wiem. Ale to za wolno idzie. Ja bym za te pieniądze, co wam płacę kupił gotowy system. Zaraz się okaże, że mi się nie opłaca tego rozwijać, za wolno to idzie.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;To jest PROGRAM, sam się nie zrobi&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Trzeba jakoś lepiej ten czas podzielić&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Mieliśmy to robić w trzy osoby, z SynemPrezesa™&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No wiem&lt;br /&gt;
&lt;br /&gt;
Oczywiście stronę dla klienta trzeba skończyć przez weekend. Na wpół hobbystycznie, po części charytatywnie.&lt;br /&gt;
&lt;br /&gt;
Rozmowa z MoimWspółpracownikiem™ na papierosie:&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No zajebiście, zbyt wolno dokonujemy cudów&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A ja dalej nie mam umowy żadnej z firmą&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;To powiedz że chcesz&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No właśnie myślę, że to jest idealny moment&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No bo jest&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;To co, idziemy zaraz do domu&lt;br /&gt;
&lt;br /&gt;
…&lt;br /&gt;
&lt;br /&gt;
(chórem) PFFFBUAAAAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHA&lt;br /&gt;
&lt;br /&gt;
Nigdy już nie pozwolę sobie stracić całego tygodnia na negocjację umowy z kimś tak bezużytecznym jak klient na usługi hostingowe. Po co mam komuś robić strony internetowe, skoro to przecież tylko pieniądze. Zajmuje mi to tylko niepotrzebnie czas. I jeszcze dzwonić, umawiać się, negocjować warunki jak najlepsze dla firmy. I pewnie jeszcze ktoś z czytających łudzi się, że za znalezienie klienta dostaję chociaż złotówkę prowizji? BUAHAHAHAHAHAHAHA&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Kolejny awans</title>
   <link href="http://room-303.com/blog/2004/06/14/0cc7336679583c758d2f174e5a4ae7b2/"/>
   <updated>2004-06-14T08:25:18+00:00</updated>
   <id>http://room-303.com/blog/2004/06/14/0cc7336679583c758d2f174e5a4ae7b2</id>
   <content type="html">&lt;p&gt;Cóż, zaczynałem pracę w firmie jako programista. Moje obowiązki były wyraźnie rozpisane, rozliczano mnie z terminów, wszystko było ok. Później firma zaproponowała mi pracę na jakże zaszczytnym stanowisku administratora. “Prawa ręka Boga” - pomyślałem, jako fan dość popularnej w internecie serii BOFH. Zgodziłem się, od tego czasu mam napisane w umowie “administrator/programista”. Jak widać, celem ułatwienia mi asymilacji w nowym środowisku i wśród nowych obowiązków, firma wykazała się gestem i chojnie obsypała mnie nowymi obowiązkami, nie usuwając starych, z którymi zdążyłem się już tak dalece zaprzyjaźnić. Od tego pamiętnego dnia miast ciągnąć jeden wózek, pcham dwa. Terminy realizacji atomowych zadań nie uległy wydłużeniu, nadgodzin jak nie było, tak nie ma (przynajmniej w mniemaniu firmy, bo wychodzenie z pracy po 23 nie należy do rzadkości, w przeciwieństwie do wychodzenia przed 22). Podwójne życie, niczym superbohaterowie komiksowych serii z lat dzieciństwa. Za dnia programista, nocami administrator. Dr. Jackyl &amp;amp; Mr. Hyde.&lt;br /&gt;
&lt;br /&gt;
Dziś wspaniałomyślność firmy kolejna raz była rozwarła przede mną swe wrota. Kopnął mnie kolejny zaszczyt, niczym ochotnicza służba wojskowa uznanego światowej sławy stratega, generała Koniecznego. W jednym z naszych sklepów internetowych mianowano mnie webadminem. Order gdzieś zaginął, dyplomik pewnie przyjdzie pocztą. Do moich nowych obowiązków należy między innymi “obróbka zdjęć produktów, wygląd korespondencji”. “Toż to nudne” - mógłby ktoś rzec. Uprzedzając jednak zbędną retorykę, zarząd postanowił urozmaicić mi pracę. W natłoku wolnego czasu aż trudno się zrelaksować. Od teraz bowiem odpowiadam też za wprowadzanie zawartości plików .doc na stronę jednego z naszych klientów, magazynu sportowego. A strona ta mroczna oparta jest na wiedzy tajemnej i mistycznym PHP-Nuke, postrachu wszelakiej maści dwu- i czterokopytnych, którzy mają jakiekolwiek pojęcie o HTML.&lt;br /&gt;
&lt;br /&gt;
Amen.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Krótko o prehistorii</title>
   <link href="http://room-303.com/blog/2004/06/06/c31faae7853c5a77ed9a5337ad97bdd0/"/>
   <updated>2004-06-06T19:49:58+00:00</updated>
   <id>http://room-303.com/blog/2004/06/06/c31faae7853c5a77ed9a5337ad97bdd0</id>
   <content type="html">&lt;p&gt;Jako student zaoczny większość weekendów spędzam w szkole. Tego malowniczego dnia również nawiedziłem swoją mekkę poznania. Pierwszy raz przypadły nam zajęcia w pracowni trzysystemowej, więc pomyślałem sobie “rewelacja, ciekawe jakie są te dwa systemy poza Windowsem?”. Już po kilku minutach zrozumiałem błąd zawarty w tak postawionym pytaniu, jako że powinno ono brzmieć “jakie są te dwa Windowsy poza linuksem”.&lt;br /&gt;
&lt;br /&gt;
Gdy tylko oczy me ujrzały menu bootowania, zadałem sobie jedno z wielu trudnych pytań, jakie filozofowie zadawali od wieków, tym samym napędzając ciężką maszynę ewolucji: “Po jaką cholerę instalować na jednej maszynie Windows XP i Windows 2003 Server?”. Mój mózg był w stanie pojąć, że w pracowni odbywają się ćwiczenia z administracji systemem, ale nie wyobrażam sobie zastosowania dla dwóch, tak podobnych przecież, systemów? Być może uczniowie ustanawiali Windows 2003 kontrolerem domeny, a następnie uruchamiali ponownie komputer w Windows XP, próbując zalogować się do stworzonej właśnie domeny? A może poznawali niuanse pomiędzy błędami w RPC obu tych wersji? Wracając jednak do tematu, postanowiłem bliżej zaprzyjaźnić się z tym trzecim systemem.&lt;br /&gt;
&lt;br /&gt;
Kolejne filozoficzne pytanie na mej drodze ku światłości stanęło mi przed oczami. Dlaczego akurat Aurox 9.1? Ze wszystkich systemów świata, w których jest czym zarządzać (w systemach typu Mandrake można sobie pozarządzać zawartością pulpitu), administrator wybrał ten, który jest jednym wielkim kreatorem. “Przecież to nikogo nic nie nauczy?” - pomyślałem, jednak już wkrótce sytuacja miała stać się bardziej klarowna. Nie wyprzedzajmy jednak faktów.&lt;br /&gt;
&lt;br /&gt;
Na dobry początek dobrze byłoby się zalogować. Pięć sekund stukania w klawiaturę nauczyło mnie, że domena NIS działa wszędzie, tylko nie w Auroksie. Oczywiście, konta nie ma. A, tu zaznaczyć trzeba, wcześniej miałem okazję doznać zaszczytu wysłuchania prelekcji na temat bezpieczeństwa szkolnych komputerów. Oczywiście całość miała charakter nieoficjalny, bo odbyła się w trakcie przerwy między lekcjami w miejscu o najlepszej akustyce, czyli przed szkołą, tuż obok popielniczki. Jako że bezpośrednio nie uczestniczyłem w rozmowie, a tylko przysłuchiwałem się jej z boku, nie byłem w stanie dowiedzieć się żadnych szczegółów. Dość powiedzieć, że rozmowa była głównie na temat “jak najlepiej dodać prawa do audytu bezpieczeństwa sieci w Windows”. Tak jest, nie “jak najlepiej przeprowadzić audyt”, tylko “jak najlepiej dać komuś prawa do audytu”. Z bardziej interesujących rzeczy na temat linuksa usłyszałem, że “nasz system jest zabezpieczony, graficzny boot chroni przed zmianą parametrów jądra”. Aż chciałoby się rzec, “urzekła mnie twoja historia”.&lt;br /&gt;
&lt;br /&gt;
Spowrotem w pracowni, bootmenu, Aurox 9.1. Nadmienię przy okazji, że pierwszy raz spotkałem się z bootmenu NT, które po wybraniu opcji uruchomienia linuksa, niezwłocznie włączyło mi LILO… gdzie opcja domyślna to start Windowsa. Brawo za koncept i innowacyjne podejście do tematu. W każdym razie administrator się nie mylił. Głównym zabezpieczeniem linuksa w szkole było graficzne LILO. Ctrl+X.&lt;br /&gt;
&lt;br /&gt;
boot&amp;gt; linux init=/bin/bash&lt;br /&gt;
&lt;br /&gt;
Jak już mówiłem, głównym i jedynym zabezpieczeniem linuksa było graficzne LILO. Poszedłem do administratora. Więcej się do niego nie odezwę. Oświecił mnie był bowiem w pewnych kwestiach organizacyjnych. Otóż jestem złym hakerem i ja to bym tylko psuł wszystko. To chyba dlatego, że to zgłosiłem. Był wkurzony, pomyślicie? Nie, wkurzony był dopiero jak go zapytałem, czemu przy wybieraniu pakietów do instalacji wybrał “zainstaluj wszystkie dostępne pakiety”. Zachowując pozory zimnej krwi i tak zwaną “galarecianą powagę”, niemal zakrzyknął do mnie w te słowy: “Mnie linux nie interesuje, ja mam sieć na Windowsach. A jak zepsujesz, to i tak nic. Włącze Norton Ghosta, dwa razy kliknę i system stoi.” I przetłumacz takiemu, że lepiej system zabezpieczać niż doskonalić metody jego reinstalacji…&lt;br /&gt;
&lt;br /&gt;
Morał: podejrzane wydało mi się zwłaszcza słowo “klikać”, które dość często przewijało się w wypowiedziach rzeczonego pana. Okazuje się, że współczesna psychologia określa takich ludzi jako “jednorękich”. Jako, że mysz można obsługiwać tylko jedną ręką, druga ręka z braku aktywności z czasem zanika i ulega przykurczeniu. W końcu w NajlepszychSystemach™ wszystko można zrobić myszką. Literatura piękna od powyższego określenia woli termin “dinozaury XXI wieku”, który związek ma nie tyle z niebywałym stażem obserwowanych, co z kształtem nieużywanej kończyny, która dość wiernie przypomina kończyny przednie tyronozaura królewskiego.&lt;br /&gt;
&lt;br /&gt;
Jak poznać administratora sieci szkolnej na ulicy? Często widuje się dwóch administratorów, jak na powitanie podają sobie rękę i po zwyczajowym uścisku dłoni wymieniają tylko krótkie “allright”, co jest swego rodzaju procesem negocjacji połączenia i daje pewność, że u obu panów właśnie prawa część ciała przejęła wszystkie funkcje życiowe. Niestety, rynek administracji siecią jest obecnie wysoce przesycony, o czym świadczyć mogą licznie pojawiające się na stronach napisy “all rights reserved” (z angielskiego: “wszystkie posady dla praworęcznych zajęte”). :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Wiem, o co pytam</title>
   <link href="http://room-303.com/blog/2004/06/04/b1d778633a086c5c8f984ed92e724d73/"/>
   <updated>2004-06-04T15:31:22+00:00</updated>
   <id>http://room-303.com/blog/2004/06/04/b1d778633a086c5c8f984ed92e724d73</id>
   <content type="html">&lt;p&gt;Dzwoni telefon. SynPrezesa™, bo któżby inny znał mój telefon na biurko.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Ej, cześć.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Słucham.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Ej, ty zrobiłeś mojemu ojcu aliasa czy jak?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;O czym ty do mnie mówisz?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A nie, już wiem, o co mi chodzi.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Ale ja nie wiem o co chodzi, o co ci chodzi?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;To spoko, cześć.&lt;br /&gt;
&lt;br /&gt;
Morał: już od lat obserwujemy w kulturze biurowej narastający trend tak zwanego dzwonienia w żadnej sprawie. Jak dowodzą najnowsze badania, człowiek jest z natury jednostką romantyczną i potrzebującą ciepła i bliskości drugiej osoby. Niestety, codzienne życie uczy pośpiechu i nie pozostawia wiele czasu na sprawy duchowe.&lt;br /&gt;
&lt;br /&gt;
Dlatego, coraz częściej, najbardziej zabiegane (mimo swej słusznej budowy ciała) osoby w biurze (a niewątpliwie SynPrezesa™ się do nich zalicza) podnoszą telefon i wykręcają numer losowego pracownika. Czyż tak trudno zrozumieć, że wszystko, czego łakną, to usłyszeć ciepłe “słucham?” w słuchawce? :)&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Krótka rozprawka o paluszku i główce</title>
   <link href="http://room-303.com/blog/2004/06/04/98fb4e4c39dcb0147a1edbcf77f1a6e9/"/>
   <updated>2004-06-04T09:00:51+00:00</updated>
   <id>http://room-303.com/blog/2004/06/04/98fb4e4c39dcb0147a1edbcf77f1a6e9</id>
   <content type="html">&lt;p&gt;Tytułem wprowadzenia napomknę, że (jak zapewne wiecie) pracujemy nad systemem obsługi sprzedaży dla naszej firmy. Ekipa składa się z trzech osób, a potężny skład jej zasilam ja, MójWspółpracownik™ oraz nikt inny, jak sam SynPrezesa™. Prace toczą się równolegle na całej linii, a całość jest nadzorowana przez system kontroli wersji (subversion). System ten poza rozlicznymi zaletami pozwala także przeglądać listę ostatnich zmian, a (co za tym idzie) także sprawdzić, z jaką częstotliwością konkretny pracownik się obija.&lt;br /&gt;
&lt;br /&gt;
Jako, że syn najwyższego zapewnia nas regularnie o swoim zaangażowaniu w projekt, postanowiłem poszperać w statystykach serwera kontroli wersji. Szczegółów oszczędzę, dośc powiedzieć, że zaryłem byłem paszczęką w naszą polską glebe, kiedy okazało się, że system w krótkim czasie doczekał się wersji tysiąc pięćsetnej. Zgodnie z regułą przyświecającą znamienitemu reżyserowi zwanemu wszem i wobec jako Hitchcock, zaczęło się od trzęsienia ziemi (widocznie moja żuchwa uderzyła była zbyt mocno), a potem napięcie rosło. Okazało się, że SynPrezesa™ dynamicznie rozwija system, niestety nie jest to system sprzedaży, a system kompleksowego wypoczynku na kanapie. Ostatnia wersja, w której coś zmienił miała numer poniżej 600. To w oczywisty sposób wskazuje na błąd automatyki, przecież nikt nawet nieśmiałby podejrzewać SynaPrezesa™ o, za przeproszeniem, bezczynność w tak długim okresie czasu. Postanowiłem przywrócić więc dobre imię mojego idola i w te pędy udałem się na rozmowę:&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Hmm, wydaje mi się, że od dość dawna nasz system nie wykrył z twojej strony żadnej aktywności.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Noooo.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A jakiż jest tego powód?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Nie mam jak pracować. Nie mam komputera.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;W biurze jest pełno terminali, wolna stacja robocza plus twój własny sparc, co to trzyma 128 adresów.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Ale ja nie umiem pracować w biurze. Muszę w domu. Nie mam komputera.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Jak nie masz. miałeś dwa?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No ale oba stoją w biurze i czekają aż BezpośredniPrzełożony™ łaskawie ruszy dupę i mi je do domu zawiezie.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A termin zamknięcia tego etapu systemu dawno minął.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A ja jadę do domu coś zjeść.&lt;br /&gt;
&lt;br /&gt;
Morał: żyjemy w dobie, gdzie krucho o posadę. Firmy zatrudniają pracowników na zlecenie i zwalniają zaraz po wykonaniu pracy. Rynek pracy działa na zasadzie “Murzyn zrobił swoje, Murzyn może odejść”. Tylko specjalnie wypracowana strategia pozwala przetrwać w tak trudnych warunkach rodem z dżungli. U podstaw strategii tej leżą rozbudowane Public Relations i znajomości, a najchętniej konotacje rodzinne. Poza tym hołduje ona powiedzeniu rodem z czasów socjalistycznych: “nie można niczego robić w pośpiechu, pracę trzeba szanować, wtedy wystarczy na dłużej”. :)&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Mamo, goni mnie potwór zwany lagiem</title>
   <link href="http://room-303.com/blog/2004/06/02/847a637601a71e35f1901c1f918f6ad9/"/>
   <updated>2004-06-02T17:15:54+00:00</updated>
   <id>http://room-303.com/blog/2004/06/02/847a637601a71e35f1901c1f918f6ad9</id>
   <content type="html">&lt;p&gt;Godzina 18:00. Przychodzi SynPrezesa™ i mówi, że coś z siecią jest nie tak i trzeba sprawdzić. Pytam więc, jak zwykle uprzejmie, jaka jest natura problemu.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Mam straszne lagi do rutera. Ponad sekundę, jak coś ściągam.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No to nie ściągaj.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A w ogóle wczoraj jak ściągałem plik to miałem transfer 3,3 kilobajta na sekundę.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;To dobrze.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Jak dobrze, przecież wcześniej było 200 kilo?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Ale jak podniosłeś sto dwadzieścia osiem firmowych adresów IP na swoim komputerze, to ci obciąłem transfer do 32 kilobitów.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No nie rób jaj! Daj mi minimum na 128.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Przynieś mi polecenie od prezesa, to ci dam nawet całe dwa mega.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No bez przesady, to jak na to ludzie będą się logować na shelle?&lt;br /&gt;
&lt;br /&gt;
Nie będą? Morał: dziś dowiedzieliśmy się, że jako jedna z pierwszych firm we Wrocławiu wprowadziliśmy darmowe konta shellowe bez limitu sesji i łącza. Wystarczy poprosić SynaPrezesa™ i nawet Staś Kowalski może mieć konto na firmowym serwerze. I to z własnym vhostem, w końcu po coś te 128 adresów IP. A mi się kiedyś wydawało, że jeden publiczny adres IP na maszynę, która nie ma nawet serwera www, to już sporo…&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Problem z dostępem do sieci</title>
   <link href="http://room-303.com/blog/2004/06/01/3bc05e80044f13c2f4bcccba7039ff4d/"/>
   <updated>2004-06-01T13:34:16+00:00</updated>
   <id>http://room-303.com/blog/2004/06/01/3bc05e80044f13c2f4bcccba7039ff4d</id>
   <content type="html">&lt;p&gt;Przed chwilą zostałem wezwany do naszego klienta. Powód był prosty, my im dostarczamy łącze sieciowe, a oni mają problem z dostępem do sieci. W ramach wcześniejszego przygotowania sprawdziłem, czy komputery klienta są podłączone do sieci. Okazało się nawet, że odpowiadają wdzięcznie na pingi. Różne rzeczy się dzieją, a klientom się nie odmawia, więc posłusznie zebrałem się, zabrałem coś do pisania (jako że ci państwo lubią bez uprzedzenia zmieniać adresy MAC kart sieciowych, później dziwiąc się, że DHCP nie działa) i ruszyłem w drogę. Dotarłem dzielnie do sekretariatu, gdzie miłe panie poprosiły mnie o zaczekanie na PanaDyrektora™. Otóż jego gabinet, podobnie jak inne miejsca święte, wolno zwiedzać jedynie w towarzystwie wyszkolonego przewodnika. Niestety, stosowne kompetencje posiada jedynie sam PanDyrektor™, skądinąd znany ze swych półgodzinnych sesji obiadowych, między którymi następuje dziesięciominutowa przerwa na pracę. Doczekawszy się w końcu upgranionej persony, zapragnąłem poznać cel mojej wizyty i przyczynę awarii.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Wie pan, bo jak odbieram pocztę, to jest wszystko w porządku, ale jak włączam przeglądarkę, to mi się momentalnie komputer wiesza…&lt;br /&gt;
&lt;br /&gt;
Bogatszy o nowe doświadczenia życiowe i z bagażem nabytych mądrości opuściłem jego gabinet, by na tle zachodzącego słońca udać się ku nowej, być może równie fascynującej, przygodzie.&lt;br /&gt;
&lt;br /&gt;
A na koniec, drogie dzieci,&lt;br /&gt;
morał bajki tej jest taki:&lt;br /&gt;
nie ściągajcie filmów z kazyy,&lt;br /&gt;
bo będziecie mieć robaki.&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>O dobrych i złych kolegach</title>
   <link href="http://room-303.com/blog/2004/06/01/409063f89cc1d54e2d0eea83fa733d26/"/>
   <updated>2004-06-01T12:52:46+00:00</updated>
   <id>http://room-303.com/blog/2004/06/01/409063f89cc1d54e2d0eea83fa733d26</id>
   <content type="html">&lt;p&gt;Dzwoni komórka. Oczywiście SynPrezesa™:&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Słucham?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Czeeeeść…&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No, co jest?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Słuchaj potrzebuje żebyś coś zrobił.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No, słucham.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Ściągnij mi z sieci pirata nowego nero, pirata […] i pirata […] i […] i…&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;To jest firma, nie ściągam piratów.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No, weź, nie bądź taki.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Nawet gdybym bardzo chciał, to i tak nie mam Kazaa, to jest linuks.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;E tam, ja ściągałem przez www.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;To sobie ściągnij.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Ale ja mam neostradę…&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A ja mam pracę. Nie nudzę się w biurze.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Ale z ciebie kolega! Dobra! Cześć!&lt;br /&gt;
&lt;br /&gt;
I przeulubiony rozmówca mój był się rozłączył.&lt;br /&gt;
&lt;br /&gt;
Morał: w erze trudnej konkurencji rynkowej każda firma musi dbać o swój wizerunek i nie może bez powodu odwracać się od klienta wykręcając się starym jak świat chwytem na brak czasu. Trzeba liczyć się z rosnącymi oczekiwaniami rynku, a na dynamicznie rosnący popyt odpowiadać agresywną podażą. Nie wiem tylko, czy SamPrezes™ przychyli się do mojego pomysłu wydzielenia z pionu informatycznego specjalnego stanowiska dla Dyrektora do spraw Technologii Peer-to-Peer. :)&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Wdrożenie i ofiary</title>
   <link href="http://room-303.com/blog/2004/05/31/6732d19ba9088cbde4e345421e1dc19a/"/>
   <updated>2004-05-31T18:40:29+00:00</updated>
   <id>http://room-303.com/blog/2004/05/31/6732d19ba9088cbde4e345421e1dc19a</id>
   <content type="html">&lt;p&gt;Dziś przyszedł do nas mój BezpośredniPrzełożony™ w sprawie kontroli przebiegu prac nad systemem sprzedaży. Pierwszy etap miał się zakończyć w tym tygodniu, dlatego przyszedł rozliczyć nas z terminów. Zbiegło się to akurat z doroczną wizytą SynaPrezesa™ w naszych coraz skromniejszych progach, jako że sprzętu nam jakoś z czasem ubywa. Okazało się też, że przechwałki dotyczące wcześniejszego ukończenia prac przez sami wiecie kogo były równie przedwczesne.&lt;br /&gt;
&lt;br /&gt;
BezpośredniPrzełożony™ zapoznawszy się ze stanem faktycznym, rzekł do nas w te słowy:&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;No dobra chłopaki, to określcie mi jakiś konkretny termin.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Hmm, to będzie c i ę ż k o określić…&lt;br /&gt;
&lt;br /&gt;
Po tych słowy wskazałem byłem nieśmiało palcem w kierunku SynaPrezesa™.&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Tak, zdaję sobie sprawę z tego, że ta zakała tu siedzi. Ale musicie mi dać jakiś termin, bo coś muszę SamemuPrezesowi™ powiedzieć.&lt;br /&gt;
&lt;br /&gt;
Na to SynPrezesa™ z entuzjazmem rzecze:&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Ja mogę się od poniedziałku zająć wdrożeniem.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Ale chyba trzeba mieć najpierw co wdrażać…&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Eee… yyy… no tak. Marudzisz.&lt;br /&gt;
&lt;br /&gt;
Czas jakiś później przyszedł, obejrzał półkę ze sprzętem, wziął jakąś płytę z Pentium 2 pod pachę i zaczął chodzić po biurze.&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Co ty robisz?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No mówiłem ci, że stawiam ruter z firewallem w piwnicy.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No i?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No i będę potrzebował jakiś komputer do tego chyba, nie?&lt;br /&gt;
&lt;br /&gt;
Na szczęście nie zabrał nam zasilacza, pamięci i obudowy. Pomyślicie, że to z dobroci serca i ulitowania nad firmą? Otóż on ich po prostu nie znalazł.&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Gry pod linuksem</title>
   <link href="http://room-303.com/blog/2004/05/31/924a6570bc51184034d779cedf2a408f/"/>
   <updated>2004-05-31T18:08:13+00:00</updated>
   <id>http://room-303.com/blog/2004/05/31/924a6570bc51184034d779cedf2a408f</id>
   <content type="html">&lt;p&gt;Rozmowa moja z SynemPrezesa™:&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;A czemu chcesz się pozbyć rutera DSL-owego?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Zamieniam go na zwykły modem na USB i stawiam firewalla na linuksie w piwnicy. Tylko części mi potrzeba do komputera.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Przecież masz 2 kompy w domu.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No ale ten będzie stał w piwnicy a kompy w domu normalnie, na Windowsie, nie?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A na cholerę ci ten Windows?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Bo jest wygodniejszy i pod linuksem żadne gry nie chodzą.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Mi jakoś chodzą.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Które? Bo mi jakoś nie. Pokupowałem sobie gry i nie mam jak grać.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Mi jakoś wszystkie nowe chodzą. W tym większość ma nawet swoje binarki pod linuksa.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A widzisz, a mi najlepsza gra nie chce chodzić!&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Jaka?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Microsoft Flight Simulator.&lt;br /&gt;
&lt;br /&gt;
W tym momencie byłem się zapadłem w krzesło i argumenty mi się urwały. Kolejna sromotna porażka. :)&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Stolica, ziemia obiecana</title>
   <link href="http://room-303.com/blog/2004/05/27/bca57ad532cee2d67fc79700b6035382/"/>
   <updated>2004-05-27T17:06:44+00:00</updated>
   <id>http://room-303.com/blog/2004/05/27/bca57ad532cee2d67fc79700b6035382</id>
   <content type="html">&lt;p&gt;Nie tak znowu dawno temu wróciłem z delegacji do Warszawy. Towarzyszyłem oczywiście nikomu innemu jak samemu SynowiPrezesa™. On zaś pojechał do stolicy w celu znalezienia sobie pracy. Składał więc CV do wszystkich większych firm zajmujących się hostingiem i usługami sieciowymi. Jakież było jego zdziwienie, kiedy to jedna z firm zaprosiła go jeszcze tego samego dnia na rozmowę kwalifikacyjną połączoną z egzaminem wstepnym. Do egzaminu pozostały 3 godziny, więc SynPrezesa™ z właściwą sobie beztroską podszedł do mnie i przemówił w te słowy: “Ej, muszę umieć iptables, nauczysz mnie”.&lt;br /&gt;
&lt;br /&gt;
Dwie godziny później, mądrzejszy o podstawową wiedzę na temat przekierowywania portów, filtrowania połączeń, stawiania NATu i maskarady, zaczął się zbierać na egzamin, w czym mu, niestety, towarzyszyć nie mogłem.&lt;br /&gt;
&lt;br /&gt;
Godzina 19:00, ponownie spotykam SynaPrezesa™.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;I jak egzamin?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Śmieszny był. Pisaliśmy na kartkach bez komputerów.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A jakie pytania?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No, na przykład “co robi taka regułka iptables” i tam jakieś bzdury…&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;I co napisałeś?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;“man iptables”&lt;br /&gt;
&lt;br /&gt;
[…]&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A w ogóle to jak ty chcesz pracować w Warszawie?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Noo, dostanę jakieś 2000 na rękę na start i się jakoś utrzymam…&lt;br /&gt;
&lt;br /&gt;
Morał: na naukę nigdy nie jest zbyt późno. Zawsze jest czas żeby się czegoś nauczyć. Poza tym często ucząc się jednej rzeczy można przy okazji nauczyć się też innej. Np. mana. Oczywiście każdy wie też, że w stolicy jest tak dużo wolnych etatów, że przyjmuje się ludzi bez doświadczenia, bez umiejętności i daje im 2000 PLN na start. Z dobroci serca, naturalnie, żeby im się było łatwiej zaaklimatyzować w nowym mieście.&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Praca nad systemem sprzedaży</title>
   <link href="http://room-303.com/blog/2004/05/27/3339fd9c957af3a094a36aac8c50dbb4/"/>
   <updated>2004-05-27T15:09:32+00:00</updated>
   <id>http://room-303.com/blog/2004/05/27/3339fd9c957af3a094a36aac8c50dbb4</id>
   <content type="html">&lt;p&gt;W firmie pracujemy nad opartym na PHP systemie sprzedaży. Dokładniej pracują 3 osoby: ja, MójWspółpracownik™ i SynPrezesa™. SamPrezes™ wyznaczył nam pewien deadline i zakres funkcjonalności, który musi zostać do tego terminu zaimplementowany. SynPrezesa™ podzielił zadania i prace się rozpoczęły. Było to jeszcze przed aferą terminalową.&lt;br /&gt;
&lt;br /&gt;
Pierwszy skończył SynPrezesa™. Z ciekawości z MoimWspółpracownikiem™ postanowiliśmy sprawdzić, jak to możliwe, bo wyprzedził nas całkiem sporo (nawet biorąc pod uwagę, że dużo czasu poświęciłem na sprawę z terminalami). Czytamy więc nasze plany, jako że były w miarę podobne:&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;dzień 1: moduł 1&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;dzień 3: moduł 2&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;dzień 5: moduł 3&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;dzień 7: moduł 4&lt;br /&gt;
[…]&lt;br /&gt;
&lt;br /&gt;
Czytamy zatem plan SynaPrezesa™:&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;dzień 1: część 1 modułu 1&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;dzień 3: część 2 modułu 1&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;dzień 5: część 3 modułu 1&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;dzień 7: część 1 modułu 2&lt;br /&gt;
[…]&lt;br /&gt;
&lt;br /&gt;
Morał: nie wiem, może “lepiej być SynemPrezesa™ niż programistą”?&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Domeny</title>
   <link href="http://room-303.com/blog/2004/05/27/4da53285247b2e73c594e5637d84ff2c/"/>
   <updated>2004-05-27T14:57:05+00:00</updated>
   <id>http://room-303.com/blog/2004/05/27/4da53285247b2e73c594e5637d84ff2c</id>
   <content type="html">&lt;p&gt;Dzisiaj rano okazało się, że do firmy nie dochodzą maile na adresy z jednej z naszych domen. Sprawdziłem w RIPE i niespodzianka, domena wskazuje na stary adres serwera DNS, którego już dawno nie ma. To samo tyczy się secondary. Przy okazji dodam, że firma ma tylko około 11 zarejestrowanych domen.&lt;br /&gt;
&lt;br /&gt;
Puściłem więc zlecenie do naszego pośrednika, u którego domena została wykupiona. W odpowiedzi dowiedziałem się, że ktoś inny składa sprzeczne dyspozycje. Oczywiście, SynPrezesa™. Razem z BezpośrednimPrzełożonym™ wysłaliśmy prośbę o listę aktywnych domen, za które płacimy. Miało być 11, okazało się, że jest około 30. SynPrezesa™ umiejętnie poupychał je na fakturze do różnych pozycji, tym samym ukrywając je przed czujnym okiem zarządu.&lt;br /&gt;
&lt;br /&gt;
Po chwili jednak odezwał się do mnie znajomy z informacją, że moja domena nie działa. Okazało się, że SynPrezesa™ z zawiści za pokrzyżowanie mu planów skasował moją prywatną domenę, której dyspozytorem była również firma. Obecnie toczę walkę o jej ponowne uruchomienie i wpisanie mnie jako jedynego dyspozytora.&lt;br /&gt;
&lt;br /&gt;
Morał: morał jest bardzo prosty, nawet jeśli coś nie działa, to nie dotykaj, bo interes firmy nigdy nie idzie w parze z twoim prywatnym. Ja naprawiając domenę firmową straciłem swoją prywatną. Opłaconą do grudnia.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>To potrwa tylko godzinkę</title>
   <link href="http://room-303.com/blog/2004/05/14/fd1322ad71afae07b7a71c79fcfd31f1/"/>
   <updated>2004-05-14T14:03:49+00:00</updated>
   <id>http://room-303.com/blog/2004/05/14/fd1322ad71afae07b7a71c79fcfd31f1</id>
   <content type="html">&lt;p&gt;Środa, godzina 15:15.&lt;br /&gt;
&lt;br /&gt;
SynPrezesa™ przychodzi do biura i oznajmia, że mamy się zwijać z robotą, bo punkt 16:00 wszystkie terminale jadą do sklepu i zostaną wymienione na nowsze. Może i trochę na ostatnią chwilę i nagle, może nikt nie wiedział o co chodzi, może SynPrezesa™ nie pracuje w naszej firmie, ale nikt do gadania nic nie miał. Po chwili okazało się, że deadline uległ skróceniu do 15:30. Wszystko jak leci trafiło do busa i pojechało do sklepu. Koło 18:00 nowe komputery zawitały w nasze skromne progi.&lt;br /&gt;
&lt;br /&gt;
Od razu musieliśmy zająć się ich konfiguracją. Dodam, że według umowy pracuję do 18:00. Oczywiście na wstępie okazało się, że jeden z “nowiutkich” Pentium II 266 jest padnięty i czeka go droga powrotna. To jeszcze nic. Oczywiście komputer, na którym stał Windows i WinFax wyjechał na złom, a nowy przyjechał z czystym dyskiem. Cały czwartek poszedł na jego konfiurację i zmuszenie do obsługi drukarki i skanera na USB. Zdziwiony SamPrezes™ rzekł tedy: “a mi syn mówił, że to tylko podmiana komputerów, godzinka i gotowe”. I w ten oto sposób SynPrezesa™ wyniesion został do rangi specjalisty od wszystkiego, a ja, biedny administrator pozostałem tym, co wszystko psuje i nie umie w godzinę uruchomić dwunastu nowych komputerów. Na szczęście w czwartek z pomocą przyszedł mi mój BezpośredniPrzełożony™, bo SynPrezesa™ nie był łaskaw zaszczycić nas swoją “specjalistyczną” obecnością. Komputery było komu wymieniać, jednak kiedy przyszło je skonfigurować, nagle przypomniał sobie, że on przecież u nas nie pracuje.&lt;br /&gt;
&lt;br /&gt;
Koniec końców sytuacja wróciła do normy dzisiaj około 14:00, kiedy od zra skonfigurowany został ostatni z komputerów, służący za workstację gnome/xfce i loghost dla reszty maszyn. A ja dalej jestem głupi i nie umiem zainstalować wszystkiego w godzinkę :).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>NASK</title>
   <link href="http://room-303.com/blog/2004/05/09/b72238df9394d04602a5e430a8b544b8/"/>
   <updated>2004-05-09T16:06:23+00:00</updated>
   <id>http://room-303.com/blog/2004/05/09/b72238df9394d04602a5e430a8b544b8</id>
   <content type="html">&lt;p&gt;Czas temu jakiś jeden z naszych Klientów zmienił nas na jakąś inną firmę hostingową, co już opisałem wcześniej. W czwartek jednak wynikła z tego bardzo wesoła sytuacja. Otóż okazało się, że po naszej zmianie ISP nasz klient wysłał do NASKu dwa zgłoszenia. Jedno podpisane przez właściciela firmy, które zlecało delegowanie domeny na nasz nowy adres serwera DNS, drugie, zdwudniowym opóźnieniem, podpisane przez głównego księgowego, przenoszące domenę na serwer DNS ich nowego opiekuna. Niestety, panowie w NASK po kilku dniach uznali, że pomimo kolejności numerowania zleceń i kolejności wpływania wniosków (które otrzymują faksem, więc natychmiast), ważniejsze jest zlecenie podpisane przez właściciela (w końcu on wie lepiej od jakiegoś tam księgowego). Efekt? Łatwo się domyśleć. Nasz serwer DNS nie trzymał już tej domeny i w efekcie przestała kompletnie działać. Odebraliśmy kilka telefonów z pogróżkami od byłego klienta (że celowo przejęliśmy tą domenę jakimś podstępem) i dobrowolnie zgodziliśmy się podnieść domenę ponownie i na czas naprawienia bałaganu w NASK przekierować ją na aktualny adres.&lt;br /&gt;
&lt;br /&gt;
Wniosek: panowie w NASK robią co im się podoba, ponadto dowolna osoba może od tak sobie relegować domenę jakiejś firmy na własne serwery.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Ten się śmieje, ...</title>
   <link href="http://room-303.com/blog/2004/05/07/a51f7921a230ab6e02c67cf4c88b909e/"/>
   <updated>2004-05-07T18:16:02+00:00</updated>
   <id>http://room-303.com/blog/2004/05/07/a51f7921a230ab6e02c67cf4c88b909e</id>
   <content type="html">&lt;p&gt;Wszyscy w firmie odetchnęli z ulgą po tym, jak SynPrezesa™ poinformował nas o swoich odejściu. Jednakże radość ta okazała się przedwczesna, jako że 7. maja roku pańskiego 2004 o godzinie 19:45 zagrzmiał złowieszczy ton dzwonka mojego telefonu komórkowego. To dzwonił mój BezpośredniPrzełożony™, aby z wyrazami bólu i niekrytych kondolencji przekazać mi wiedzę tajemną. Otóż SamPrezes™ podjął był nową decyzję. Oddelegował mnie wraz z SynemPrezesa™ na dwa tygodnie do pracy nad dużym projektem systemu sprzedaży i obsługi firmy opartego na PHP/MySQL. I runęły niebiosa na moje spracowane skronie, i objawiła mi się wizja niewyspania. A deadline projektu owego był ni dłuższy ni krótszy niż dni czternaście.&lt;br /&gt;
&lt;br /&gt;
BezpośredniPrzełożony™ powiedział mi nadto, że oddelegowano mnie zamiast MojegoWspółpracownika™, bo SynPrezesa™ zaprotestował i powiedział, że z nim nie układa mu się współpraca. Wydaje mi się, że kolega za bardzo mu przeszkadzał swoimi pytaniami o szczegóły, podczas gdy SynPrezesa™ dbał o Public Relations naszej firmy na jednym z wielu kanałów IRC. Po chwili zadzwonił też rzeczony SynPrezesa™, jednak w jego wersji, to SamPrezes™ zadecydował o takim, a nie innym przydziale obowiązków.&lt;br /&gt;
&lt;br /&gt;
Najbardziej rozbawiła mnie jednak sprawa, w jakiej do mnie zadzwonił:&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;To ja sobie wezmę sudo na serwerze www, dobra?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A po co ci sudo?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No, żebym mógł czytać pliki ze skryptami…&lt;br /&gt;
&lt;br /&gt;
Morał: jak wiadomo, skrypty PHP da się pisać tylko z konta roota. Ciekawe tylko, po co ja ten plan zadań z godzinową dokładnością pisałem? :)&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>CV</title>
   <link href="http://room-303.com/blog/2004/05/06/a5c8c3544bc49ebacde4ffe04bf34de0/"/>
   <updated>2004-05-06T12:51:56+00:00</updated>
   <id>http://room-303.com/blog/2004/05/06/a5c8c3544bc49ebacde4ffe04bf34de0</id>
   <content type="html">&lt;p&gt;Jakieś dwa tygodnie temu SynPrezesa™ postanowił zatrudnić się w konkurencyjnej firmie. W tym celu został zmuszony do popełnienia CV i listu motywacyjnego. Czynił to pierwszy raz w życiu, więc poprosił nas o pomoc:&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Tak może być? “Piszę do Was w sprawie oferty pracy.”&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A może na początku jakieś “Szanowni Państwo”?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A tak trzeba? Nigdy tak nie pisałem.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No… wypada.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No dobra, “Szanowni Państwo, piszę do Państwa w sprawie oferty pracy.”&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Ale w sprawie jakiej oferty? Powołaj się na jakieś ogłoszenie w gazecie albo na liście dyskusyjnej.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Nie no, to przez telefon.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;To napisz, że piszesz w sprawie oferty, którą złożono ci telefonicznie.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Ale to nie od nich, tylko gadałem ze znajomym, który tam zna jakiegoś dyrektora i powiedział, żebym napisał do nich.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;To w sprawie jakiej oferty ty piszesz?!&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Hmm… “Szanowni Państwo, jestem studentem aktywnie poszukująm pracy”?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;No już lepiej.&lt;br /&gt;
&lt;br /&gt;
[…]&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;“Pracowałen wcześniej na stanowiskach takich jak [tu lista dyrektorów, specjalistów, itp.], gdzie do moich obowiązków należało między innymi…”. Co należało do moich obowiązków?&lt;br /&gt;
&lt;br /&gt;
Biedny człowiek, przez 4 lata nie wiedział, co robi. I jak tu teraz napisać ładne CV? ;)&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Klient płaci, klient wymaga...</title>
   <link href="http://room-303.com/blog/2004/05/06/27c36cd3c6c343638fb4a12e6771356b/"/>
   <updated>2004-05-06T11:30:59+00:00</updated>
   <id>http://room-303.com/blog/2004/05/06/27c36cd3c6c343638fb4a12e6771356b</id>
   <content type="html">&lt;p&gt;Całkiem niedawno jeden z naszych klientów (hosting www, emaile, obsługa techniczna) zadzwonił do mnie z informacją, że od rana nie dociera do nich poczta elektroniczna. Klient duży, więc priorytetowo zająłem się przeszukiwaniem logów na serwerze. Sytuacja nie była dziwna, bo wszystko zbiegło się w czasie ze zmianą naszego ISP. Nowa pula adresowa, relegacja domen, maile mają prawo nie dojść przez jakiś czas, pewnie na DNS części sieci wiszą jeszcze stare IPki. Ale klient nas ciśnie, że to ważna korespondencja, że to nie może czekać. Prezes chciał już nawet, żebym założył im tymczasową skrzynkę w którejś z naszych domen, ale w ostatniej chwili coś mnie tknęło…&lt;br /&gt;
&lt;br /&gt;
Wszedłem na stronę NASKu i sprawdziłem, czy domena została już przedelegowana na nasze nowe adresy DNS, a tu niespodzianka. Ostatnia modyfikacja domeny: tegoż właśnie dnia. Wszystkie pozostałe miały datę 3 dni wstecz. Sprawdzam więc gdzie ta delegacja prowadzi… jakaś firma z Poznania, pierwsze o niej słyszę. Ani trochę nie przypomina naszych serwerów DNS. Dzwonimy więc do klienta.&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Czy wiecie już, czemu nie dochodzi poczta?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Bo Państwo oddaliście swoją domenę jakiejś innej firmie.&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Jak to? To niemożliwe!&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A mówi coś panu nazwa [tutaj nazwa firmy]&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;… [nagła cisza w słuchawce]&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Halo?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;Eee… Ale czemu poczta nie dochodzi?&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;To my czekamy na wypowiedzenie umowy hostingowej, do widzenia.&lt;br /&gt;
&lt;br /&gt;
Mądry klient po szkodzie, szkoda że wcześniej nie wiedzieli, co robią. ;)&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Backup bywa niebezpieczny</title>
   <link href="http://room-303.com/blog/2004/05/05/03992959e55e0e80bf03c3885866a8ab/"/>
   <updated>2004-05-05T19:31:18+00:00</updated>
   <id>http://room-303.com/blog/2004/05/05/03992959e55e0e80bf03c3885866a8ab</id>
   <content type="html">&lt;p&gt;Swego czasu pisaliśmy w robocie taki skrypt do automatycznego backupu danych. Ot wywołanie partimage w trybie wsadowym, żeby się połączył z serwerem i zrzucił obraz partycji. Żadna filozofia. Skrypt dodatkowo zakładał w / symlink o nazwie backup, coby nikomu nie przyszło do głowy w tym czasie mieszać w poldku czy rpm-ie. Wszystko działało cacy, skrypt był wołany z crontaba, zakładał swój symlink, czekał 10 czy 15 minut i zaczynał backup. Wszystko było na dobrej drodze do sukcesu, ale…&lt;/p&gt;

&lt;p&gt;Ale katastrofa zaczęła się właśnie od tego kilkunastominutowego oczekiwania. SynPrezesa™ nie mógł przeczekać tych paru minut, więc zabił skrypt z palca. Oczywiście pozostał prowadzący do nikąd symlink w głównym katalogu. Co więc zrobił? Włączył midnighta, przeszedł na koniec listy plików i katalogów w /, gdzie znajdował się nasz nieszczęsny link, coś tam powciskał i już po chwili nie było… &lt;code&gt;/bin&lt;/code&gt; (!). Jak wiadomo, klawisze Home i F8 są tak blisko siebie, że czasem człowiek się pomyli i wciśnie dwa na raz ;D.&lt;/p&gt;

&lt;p&gt;Morał: &lt;code&gt;rm -f /backup&lt;/code&gt; nigdy cię nie zawiedzie, nie ufaj mc i synom wysoko postawionych osób :).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Potyczek biurowych ciąg dalszy</title>
   <link href="http://room-303.com/blog/2004/05/05/ab5aa6d7c55858104b17b4e996382ecd/"/>
   <updated>2004-05-05T16:13:55+00:00</updated>
   <id>http://room-303.com/blog/2004/05/05/ab5aa6d7c55858104b17b4e996382ecd</id>
   <content type="html">&lt;p&gt;Rano przychodzimy do biura, okazuje się, że komputer, na którym pracował syn prezesa, jest w całkowitej rozsypce. Brakuje zasilacza, połowy pamięci, karta graficzna leży w środku luzem. Spalił się w domu komputer i trzeba było podmienić. Ale brakuje też dysku z innego serwera, który podłączony był tam tylko tymczasowo.&lt;br /&gt;
&lt;br /&gt;
Przychodzi syn prezesa. Kulturalnie zadałem pytanie o brakujący dysk. W odpowiedzi usłyszałem “a, zapomniałem go wyciągnąć”. Po chwili syn prezesa dodał “a w ogóle to potrzebny wam ten dysk, bo ja bym go sobie wziął do domu”. A ja, naiwny, myślałem, że komuna umarła.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Jesień Linuksowa</title>
   <link href="http://room-303.com/blog/2004/05/04/42a85493e33d0c2c4b73ed543c3c32c6/"/>
   <updated>2004-05-04T17:13:58+00:00</updated>
   <id>http://room-303.com/blog/2004/05/04/42a85493e33d0c2c4b73ed543c3c32c6</id>
   <content type="html">&lt;p&gt;Ustroń, 8, 9, 10 października 2004&lt;br /&gt;
&lt;br /&gt;
Koszt ~ 120 PLN&lt;br /&gt;
&lt;br /&gt;
Oficjalna strona: &lt;a href=&quot;http://jesien.linux.org.pl/&quot;&gt;tutaj&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Bezczelność nie zna granic</title>
   <link href="http://room-303.com/blog/2004/05/04/8e5e64bbde2a738ccd3e52bbfdc5ae3e/"/>
   <updated>2004-05-04T16:12:34+00:00</updated>
   <id>http://room-303.com/blog/2004/05/04/8e5e64bbde2a738ccd3e52bbfdc5ae3e</id>
   <content type="html">&lt;p&gt;W okolicach lutego w firmie spalił się serwer. Poszła płyta główna. Komputer miał iść do naprawy, miał się tym zająć syn prezesa. Zabrał serwer do serwisu, po czym zadzwonił do firmy z informacją, że nowe części będą kosztować ponad półtora tysiąca. Wierutna bzdura, bo wszystko na gwarancji i nie miało nawet pół roku. Prezes się na taki wydatek nie zgodził, a serwer zniknął z firmy całkiem (!). Dzisiaj pojawia się syn prezesa i mówi, żebym mu przydzielił IPka z wyjściem na świad na DHCP. Chciałem zobaczyć, co to za nowy wynalazek przytaszczył do firmy, a tu niespodzianka… mój serwerek, z tym, że teraz nazywa się już komputerem sąsiada-syna-prezesa. Ktoś pracuje w gorszych warunkach?&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Telefon do biura</title>
   <link href="http://room-303.com/blog/2004/05/04/1c78f13fe189e841f5d1eb37a2f7a252/"/>
   <updated>2004-05-04T15:40:43+00:00</updated>
   <id>http://room-303.com/blog/2004/05/04/1c78f13fe189e841f5d1eb37a2f7a252</id>
   <content type="html">&lt;p&gt;Dzwoni telefon. Odbieram, dzwoni były pracownik biura. “Nie masz może przypadkiem przy sobie pirackiego Windowsa XP?”. Jak wiadomo, każdy człowiek nosi przy sobie pirackiego Windowsa, w każdej dostępnej na rynku wersji. Zwłaszcza do firmy, gdzie wszystko działa na Linuksie. :D&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Cycu, mam plana...</title>
   <link href="http://room-303.com/blog/2004/05/04/61fe956419298943edf051f30abef18e/"/>
   <updated>2004-05-04T13:05:57+00:00</updated>
   <id>http://room-303.com/blog/2004/05/04/61fe956419298943edf051f30abef18e</id>
   <content type="html">&lt;p&gt;Jeśli ktoś zna jakieś mądrze brzmiące i nic nieznaczące sformułowania z dziedziny informatyki, to zapraszam do współpracy. Szef zażyczył sobie plan moich zadań na tydzień na przód. Oczywiście stanowisko takie, że nie mam pojęcia, co będę robił jutro, ale coś napisać trzeba. Co ciekawe, muszę też napisać, w jakich godzinach poszczególne zadania bedą się zawierać. Jakieś sugestie? Może “przygotowanie systemu automatycznej kontroli asercji na poziomie submodułów ładowalnych pośrednio w jądrach rodziny 2.6.x”? Fajnie się nazywa? A ile to godzin może zająć? Pięć? Dobrze, piszemy osiem. ;)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Ambitna praca administratra sieci</title>
   <link href="http://room-303.com/blog/2004/05/04/3542e983f12eef86cf4591211069fb4e/"/>
   <updated>2004-05-04T12:55:49+00:00</updated>
   <id>http://room-303.com/blog/2004/05/04/3542e983f12eef86cf4591211069fb4e</id>
   <content type="html">&lt;p&gt;Praca na stanowisku administratora sieci linuksowej to nie żadna bułka z masłem. Na człowieka spada potężny ciężar odpowiedzialności. Na ten przykład właśnie skończyłem pisać moduł do osCommerce pokazujący (sic!) status ludzi na GG. Nie pytajcie, jak to się ma do administracji siecią, ale takie czasy, że człowiek nie wybrzydza. Jak się postawi w prywatnej firmie szefowi i powie, że to nie jego działka, to może sobie powolutku nowej posady szukać. Poza tym, jakoś leci.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Koniec "długiego" weekendu</title>
   <link href="http://room-303.com/blog/2004/05/04/e1917a1522bfe464e3b4f55cb97a155f/"/>
   <updated>2004-05-04T10:03:36+00:00</updated>
   <id>http://room-303.com/blog/2004/05/04/e1917a1522bfe464e3b4f55cb97a155f</id>
   <content type="html">&lt;p&gt;Weekend był cholernie długi. Całe 3 dni. Ale w końcu nie mam na co narzekać. To mój pierwszy wolny weekend od miesiąca.&lt;/p&gt;

&lt;p&gt;Dziś znów w pracy, na dobry początek telefon na przebudzenie i “możesz przyjechać wcześniej, serwer poczty nie działa?”. Rewelacja.&lt;/p&gt;

&lt;p&gt;Do tego jest gorąco, duszno, a sytuację ratuje tylko ustawiony na mnie wielki wiatrak Airmate. Brakuje klimatyzacji do kompletu. Zastanawiam się, kiedy serwery zaczną się gotować, bo nie wolno nam zostawiać otwartych okien na czas zamknięcia biura.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Weszliśmy do Unii</title>
   <link href="http://room-303.com/blog/2004/05/01/7b2b612ccc4afffebff67b864f81e802/"/>
   <updated>2004-05-01T10:07:26+00:00</updated>
   <id>http://room-303.com/blog/2004/05/01/7b2b612ccc4afffebff67b864f81e802</id>
   <content type="html">&lt;p&gt;Z tej okazji mogłem sobie pospać do 12, ledwo żyję i nic mi się nie chce. Ale za to mogę z kuchni do pokoju chodzić bez paszportu. Antyglobalistów pewnie szlag trafia ;).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Wpis testowy</title>
   <link href="http://room-303.com/blog/2004/04/30/e7b8b1bd34b488e0428688bed532d288/"/>
   <updated>2004-04-30T16:23:50+00:00</updated>
   <id>http://room-303.com/blog/2004/04/30/e7b8b1bd34b488e0428688bed532d288</id>
   <content type="html">&lt;p&gt;Zobaczmy, jak to działa…&lt;/p&gt;
</content>
 </entry>
 
 
</feed>