Planet PLD

30 czerwca 2005, 22:02:10

Właśnie skończyłem wstępną zmianę layoutu Planet PLD - agregatora informacji publikowanych przez deweloperów wyżej wspomnianej dystrybucji.

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.

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

PS: najlepszy dowcip o blondynce, jaki kiedykolwiek czytałem.

Lekka nuta dekadencji, czyli Oldschool Kubrick theme dla Joggera

29 czerwca 2005, 20:59:29

Kolejny szablon, tym razem starsza wersja Kubricka, wykonana bez użycia grafik. Testować na żywo można na blogu tymczasowym (a uprzedzałem, że często się zmienia).

Do pobrania z mojego serwera, tam też znajduje się zrzut ekranu prezentujący szablon w działaniu.

Przy okazji dodałem brakujące zrzuty ekranów do pozostałych szablonów.

Human Condition - kolejny wolnodostępny szablon dla Joggera

28 czerwca 2005, 22:27:56

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 - na moim blogu eksperymentalnym (przynajmniej do czasu, kiedy skonwertuję kolejny szablon).

Do pobrania z mojego serwera.

Poprzednio skonwertowany Kubrick (używam go tutaj) nadal jest dostępny do pobrania.

BrowseHappy na trzecim miejscu w Google

28 czerwca 2005, 19:54:21

Już po 24 godzinach od rozpoczęcia akcji, 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 - MsnBetter ThanGoogle.

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.

Wyniki wyszukiwania

Google przy wyszukiwaniu stron bierze pod uwagę kilka czynników:

  1. URI strony (obecność słów kluczowych z wyszukiwanej frazy)
  2. Tytuł dokumentu
  3. 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)
  4. Odnośniki do dokumentu (obecność słów kluczowych)
  5. Współczynnik PageRank strony

Nie są brane pod uwagę elementy <meta/> nagłówka dokumentu ani komentarze oraz elementy o zawartości typu CDATA (kod JavaScript, Visual Basic, arkusze stylów).

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.

PageRank

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.

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 znudzenia 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).

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ść.

Czynność ta jest powtarzana rekurencyjnie dla wszystkich zlinkowanych sąsiadów, aż wyczerpane zostaną wszystkie połączenia w grafie.

Po przejściu przez cały graf, wartości PageRank wszystkich wierzchołków mnożone są przez (1 - współczynnik znudzenia).

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.

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.

Tańczący z Google'ami

Kiedyś nazywało się to Google dance 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).

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.

Dlatego właśnie wczoraj użytkownicy magistrali innych niż TP otrzymywali inne wyniki niż klienci monopolisty, którego serwery DNS w cache miały akurat adres IP świeżo zaktualizowanego serwera.

Na zakończenie

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.

Update: przepraszam za bałagan, ale przy formatowaniu tekstu zginął mi jeden akapit tekstu, już poprawione.

O co dokładnie chodzi z BrowseHappy i MsnBetter ThanGoogle?

26 czerwca 2005, 22:20:40

Przy okazji opisu konkursu SEO narodził się pomysł wypromowania dla żartu strony BrowseHappy. Akcja ruszyła, co można zaobserwować na stronie głównej Joggera. Szukamy chętnych do pomocy.

Jak się przyłączyć? To proste, wystarczy, że na stronie (np. w notce na swoim blogu) umieścisz poniższy kod HTML:

<a href="http://browsehappy.pl/">MsnBetter ThanGoogle</a>

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.

Dlaczego hidentity.org jest złe

26 czerwca 2005, 20:35:46

Internet ewoluował znacznie od stanu, kiedy FrontPage firmy z Redmond był topowym edytorem HTML. 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 CSS. Grafiki informacyjne, jak nagłówki czy zdjęcia coraz częściej posiadają poprawnie wypełniony atrybut alt, a nierzadko i tytuł w atrybucie title. 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 aural browsers. Sieć coraz bardziej skupia się na informacji, popularną formą czytania o nowościach jest subskrypcja blogów i ich strumieni RSS.

Z drugiej strony coraz bardziej uciążliwym problemem jest spam i niektórzy cierpią wręcz na paranoiczny zespół ochrony prywatności. 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 AT, 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 IE 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 alt adresu email, co stoi w konflikcie z naszymi intencjami.

W niektórych przypadkach zespół ochrony prywatności posuwa się jeszcze dalej - powstają serwisy typu Hidentity, gdzie zupełnie bezpłatnie można obfuskować za pomocą grafiki nie tylko swój adres poczty elektronicznej, ale tak poufne informacje jak numer GG 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 zrób screenshot, wklej do Painta. 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.

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 GMail, gdzie filtry spamowe działają niemal całkowicie bezbłędnie.

Trac, czyli system wspomagania projektu

25 czerwca 2005, 21:01:05

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.

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.

Najpopularniejsze wśród programistów są naturalnie wszelkie BTS. Na tym polu króluje niepodzielnie Bugzilla - system zbudowany z myślą o bardzo dużych projektach programistycznych, jego oryginalnym przeznaczeniem były projekty prowadzone przez Mozilla Organization.

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.

Istnieje jednak alternatywa. Jest wiele innych aplikacji o podobnym przeznaczeniu, choćby Mantis czy używany przez PLD Flyspray.

Jest też Trac - 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 Basecamp niż Bugzillę. Co ważne dla końcowych użytkowników, wysyłanie ticketów nie wymaga rejestracji w systemie. Jako zawartość pola autor wpisujemy swój adres email i system będzie automatycznie informował nas o każdej zmianie w zgłoszeniu.

Nie do pominięcia jest też integracja z lokalnym repozytorium Subversion. Trac w czytelny sposób wyświetla nam Timeline, 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 RSS. Dodatkowo listę kamieni milowych możemy połączyć ze swoim ulubionym kalendarzem, np. z iCal, Outlookiem czy Evolution.

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.

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.

Pong!

23 czerwca 2005, 23:49:41

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 grafika do domu i pobawić się flashem.

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.

Efektem trzygodzinnego dopieszczania i testowania jest najnudniejsza gra na świecie. W wersji pełnej można, naturalnie, pograć myszką i zapisać swój wynik online.

Coś tu śmierdzi...

22 czerwca 2005, 21:26:47

SEO PL szukają sobie darmowej reklamy najwyraźniej. Postanowili zorganizować najgłupszy konkurs w historii internetu, pozycjonowanie własnej strony na hasło msnbetter thangoogle. Przemilczę tutaj swoją opinię o wyszukiwarce MSN 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ół Google do przemyślenia swoich postępków 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 :>

Update: all your base are belong to us - MsnBetter ThanGoogle.

Standards versus reality, part 4

22 czerwca 2005, 20:32:47

Dziś krótko o stylach.

CSS ma taką przemiłą cechę, że pozwala przypisać dowolnemu elementowi nieograniczoną liczbę klas. Definiuje się to rozdzielając nazwy klas za pomocą spacji:

<p class="pierwsza druga">Lorem ipsum, baby!</p>

O dziwo, działa to nawet w IE. 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:

.pierwsza
{
	color: #000;
}
.druga
{
	border: 1px solid #000;
}
.pierwszaNotka
{
	background: #000;
}

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.

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 XHTML, 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 <STRONG/>:

STRONG
{
	color: #f00;
}

Druga sytuacja to nazwy klas pisane jako pojedynczeSłowo (preferuję ten styl ze względu na czytelność arkusza):

<p class="loremIpsum">Lorem ipsum dolor sit amet</p>
.loremIpsum
{
	color: #f00;
}
.lOrEmIpSuM
{
	color: #00f;
}

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.

Ciężki żywot programisty, part 2

21 czerwca 2005, 18:52:26

Ciąg dalszy biurowej głupawki, dzisiaj postanowiliśmy polecieć po pracy na piwo. Zrobiliśmy to w starym stylu: Odcinek pilotowy.

  • Pomysł serii: Yezooz
  • Scenariusz i zdjęcia: Jarv
  • W rolach głównych: Patrys

Jak poprzednio, odtwarzanie sponsoruje QuickTime, RealPlayer bądź Totem + w32codec.

Strip #012: Marzenie informatyka

18 czerwca 2005, 21:25:12

Z góry przepraszam wszystkich urażonych, ale tak mi się jakoś skojarzyło było ;)

Tutaj w graficznych przeglądarkach wyświetla się komiks

« poprzedni strip | następny strip »

Notka na zamówienie Niny

18 czerwca 2005, 19:28:37

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 BTSów showstopperów, 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 na wyciągnięcie klawisza czy może w zasięgu myszki 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 młodzież z badblockami na twarzy nierzadko pozbawiona jest jakiegokolwiek życia socjalnego. Są to wyalienowane jednostki, które na kanałach IRC 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.

emerge windows

14 czerwca 2005, 19:54:43

Jeden z założycieli projektu Gentoo, Daniel Robbins, od 3 tygodni grzeje swoim siedzeniem nowe, mało miękkie, krzesło. Przyjął posadę w Redmond.

PLD Linux 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). :>

Poważnie rzecz biorąc, to nie mam mu tego za złe (nie tyle osobiście, co jako aktywnemu członkowi ruchu OS). Jeśli uważa, że bardziej spełni się edukując redmoncianych CEOs 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).

Standards versus reality, part 3

14 czerwca 2005, 00:18:36

List ciąg dalszy.

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 <ul/>. Na przykład:

<ul>
	<li><a href="lorem">Lorem</a></li>
	<li><a href="ipsum">Ipsum</a></li>
	<li><a href="dolor">Dolor</a></li>
	<li><a href="sit/amet">Sit amet</a></li>
</ul>
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;
}

Tu pojawia się problem. Firefox (oraz inne pochodne silnika Gecko), Konqueror (i oparte na KHTML) i Opera wyświetlają wszystko prawidłowo. W IE 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 <li/>:

<li>...</li><li>...</li><li>...</li>

Inne zastosowanie niesortowanych list to tak zwane okruszki (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):

<p>Jesteś tutaj:</p>

<ul>
	<li><a href="/">Lorem</a></li>
	<li><a href="/oferta/">Oferta</a></li>
	<li><a href="/oferta/czapki/">Czapki</a></li>
	<li>Kapelusz słomiany ZX64</li>
</ul>
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%;
}

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 inline. 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 block, a następnie floatowanie ich do lewej strony, posiłkując się marginesami dla uzyskania odstępu.

Dla leniwych kinomanów

12 czerwca 2005, 18:30:06

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?

Teraz twoje ulubione filmy trwają tylko 30 sekund. Zapraszam na stronę Angry Alien Productions. :)

Critical update

10 czerwca 2005, 01:21:41

Nie pytaj, co SynPrezesa™ może zrobić dla ciebie, spytaj raczej, co ty możesz zrobić dla SynaPrezesa™.

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 oficjalnej stronie.

Dating a developer

09 czerwca 2005, 19:09:28

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 Dating an Apple Developer.

Link sponsorowany przez Jarvisa.

Back to reality

08 czerwca 2005, 19:57:53

Mimo trudności i perypetii, w końcu się udało oddać notebooka do naprawy, a dziś mój dzielny Asus powrócił w ręce swego właściciela.

Okazało się, że sprzęt jest cały i zdrowy, awarii uległ tylko BIOS i to on był przyczyną braku klawiatury. Muszę bardzo pochwalić Spring Notebook 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 uncompressing kernel image i jakieś matriksy na ekranie ;).

Ciężki żywot programisty

06 czerwca 2005, 23:08:40

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 Doom: Office Edition.

  • Pomysł serii: Yezooz
  • Scenariusz, muzyka i zdjęcia: Jarv
  • W rolach głównych: Patrys

PS: wymaga RealPlayera.

Standards versus reality, part 2

05 czerwca 2005, 20:09:08

Dziś o listach. Listy niesortowane (<ul/>) są najczęściej wykorzystywanym typem wyliczeń w sieci, jeśli nie liczyć bulletów wstawianych jako <img/> na początku każdego akapitu (co jest naturalnie bez sensu).

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 padding, inne za pomocą margin. Jedyna uniwersalna metoda, to wyzerować jeden, a określić drugi parametr:

ul.naszaLista li
{
	margin: 0;
	padding: 2px 2px 2px 20px;
}

Druga sprawa to odległość pomiędzy bulletem, a tekstem. Teoretycznie istnieje w CSS atrybut marker-offset, 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 background dla elementu listy:

ul.naszaLista li
{
	background: url('img/bullet.png') no-repeat 0% 50%;
	margin: 0;
	padding: 2px 2px 2px 20px;
}

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.

Na koniec wspomnę jeszcze, że IE ma problem z połączeniem letter-spacing i line-height. W przypadku, kiedy zostaną zadeklarowane oba, IE przestanie pokazywać co drugi znak łamania wiersza (<br/>). Wspominałem o tym w lutym, kiedy błąd został przypadkowo odkryty przez naszego klienta, który nadużywał znaczników <br/> do formatowania tekstu na stronie. Do dziś nie znaleźliśmy obejścia tego problemu, na szczęście letter-spacing jest relatywnie rzadko używany.

Standards versus reality

04 czerwca 2005, 23:11:35

Przy obecnej popularności webdesignu (a raczej bycia trendy i walidacji, o czym pisałem w zeszłym miesiącu), co drugi użytkownik sieci cytuje z pamięci regułki CSS, sypie kodem (X)HTML, chwali się beztabelkowymi osiągnięciami. Często te beztabelkowce zajmują pięć razy więcej miejsca (ale przecież bandwidth is cheap) i w środku korzystają z display: table;, ale nie o tym chciałem pisać. Zajmijmy się problemami, w rozwiązaniu których standardy niewiele pomagają.

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 <div/>, z czego jeden jest floatowany do krawędzi.

<div id="navbar">
	<p>To jest menu</p>
</div>
<div id="content">
	<p>To jest treść strony</p>
</div>
#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;
}

Problemy zaczynają się pod IE, 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 block.

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

#navbar
{ 
	margin: 0 10px 0 0;
	background-color: #69f;
	float: left;
	width: 180px;
	height: 400px;
	border: 1px solid #ccc;
}
* html #navbar
{
	display: inline;
}

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 display: inline; powinno odnosić się do wszystkich elementów o id równym navbar, zawierających się w elemencie <html/>, który ma dowolnego rodzica. Standard HTML wyraźnie precyzuje, że element główny, <html/> nie może mieć żadnego rodzica w ramach jednego dokumentu (nie dotyczy to drzewa DOM 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.

Oczywiście, bardziej eleganckim rozwiązaniem byłoby dodanie marginesu (równego szerokości lewej kolumny + pożądanemu odstępowi) do prawej kolumny:

#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;
}

Nie rozwiązuje to jednak problemu układów bardziej skomplikowanych (gdzie stosujemy więcej niż dwie kolumny z floatem).

Drugi z częstych problemów, to zmuszenie elementów pływających do rozciągania rodzica. Weźmy pod uwagę prosty układ:

<div id="parent">
	<div id="child">
		<p>Lorem ipsum dolor sit amet
		consectetuer adipiscing elit.</p>
	</div>
	<p>Lorem ipsum, baby!</p>
</div>
#parent
{
	background: #fff;
	border: 1px solid #ccc;
	color: #000;
	padding: 5px;
}
#child
{
	background: #eee;
	border: 1px solid #ccc;
	color: #000;
	float: right;
	width: 100px;
}

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.

Najpopularniejsze polega na wstawieniu, tuż przed tagiem zamykającym rodzica, następującego zapisu:

<br style="clear: both;">

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

Najczystsza metoda nie wymaga ingerencji w kod HTML i sprowadza się do dodania w arkuszu CSS (dla elementu rodzica) jednej linijki:

overflow: auto;

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 <iframe/>.

Kolejny problem to wymuszenie minimalnej wysokości elementu. Najprościej byłoby napisać:

#element
{
	min-height: 300px;
}

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 height, który w IE zachowuje się właśnie jak min-height. Z pomocą przychodzi nam wspomniany wcześniej hack:

#element
{
	min-height: 300px;
}
* html #element
{
	height: 300px;
}

I kolejny problem: model boksa w IE prawidłowo został zaimplementowany dopiero w IE 6.0 i to tylko w trybie strict (w przeciwieństwie do domyślnego quirks mode). 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.

Jeśli nie jest wymagana zgodność ze starszymi przeglądarkami (np. IE 5.5), to problem dla ciebie nie istnieje. Wystarczy zadeklarować prawidłowy DOCTYPE i wymusić przejście przeglądarki w strict mode. 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.

<div id="outer">
	<div id="inner">
		<p>Treść.</p>
	</div>
</div>
#outer
{
	/* padding: 5px */
}
#inner
{
	height: 100%;
	margin: 5px;
}

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.

Znikam z sieci...

03 czerwca 2005, 09:49:41

...przynajmniej tymczasowo. Robiłem akurat upgrade kernela wczoraj i, przy okazji, zmieniłem w końcu Lilo na Gruba. 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ć initrd, reboot i... i nic. Nie mogę wejść nawet w interaktywny tryb Gruba. Ba, nie mogę wejść do setupu BIOSu. W moim pięknym Asusie padła klawiatura, w związku z czym straciłem stanowisko pracy.

Straciłem również dostęp do kilku projektów, w tym paru BardzoWażnychRzeczy™, 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 HTTP, a i tak serwer Joggera jest na czarnej liście.

Miasto pełne awarii

02 czerwca 2005, 20:38:58

Nasza firma 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.

Firma mieści się w centrum miasta, tuż obok kina Helios, stare budownictwo, za sąsiadów mamy między innymi Techland. 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.

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 UPSów wytrzymuje obciążenie przez około 15 minut. Rozdzwaniają się telefony (tak, wiemy, że poczta nie działa, to nie nasza wina). 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.

Tak było też i dzisiaj, biuro z Qwiatem 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.

Magiczny klawisz SysRq

01 czerwca 2005, 20:52:41

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 ten zabawny klawisz na ich klawiaturach.

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 SysRq. Oczywiście, jego przydatność do pracy z codziennymi aplikacjami jest raczej znikoma, jednak okazuje się on nieoceniony, kiedy aplikacje te zawiodą.

Jak często zdarza ci się sięgać do przycisku "reset", 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?

Z pomocą przychodzi nam debugger jądra. Jest on uruchamiany poprzez przekazanie wartości 1 do węzła /proc/sys/kernel/sysrq i jest domyślną wartością dla większości systemów. Jeśli chcesz to zrobić ręcznie, wystarczy:

echo 1 > /proc/sys/kernel/sysrq

W PLD działanie tego klawisza można kontrolować za pomocą pliku /etc/sysctl.conf:

# Enable the magic-sysrq key
kernel.sysrq = 1

SysRq 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 Alt i PrtScr) jest przetwarzane na poziomie kernela. O ile sam SysRq 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:

  • Alt+SysRq+H 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.
  • Alt+SysRq+B 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.
  • Alt+SysRq+E wysyła sygnał TERM do wszystkich procesów z wyjątkiem procesu init, prosząc o samounicestwienie wyżej wymienionych.
  • Alt+SysRq+I wysyła sygnał KILL do wszystkich procesów z wyjątkiem procesu init, wymuszając zabicie wszystkich procesów.
  • Alt+SysRq+K wysyła sekwencję SAK. Powoduje uśmiercenie wszystkich procesów związanych z bieżącym terminalem (bądź konsolą wirtualną). Przydatne, kiedy iksy odmówią współpracy.
  • Alt+SysRq+L wysyła sygnał KILL do wszystkich procesów, z procesem init włącznie. Zabicie procesu init powoduje unieruchomienie całego systemu.
  • Alt+SysRq+M wypisuje informacje o pamięci. Przydatne tylko do debugowania.
  • Alt+SysRq+O wyłącza system, jeśli funkcja taka jest dostępna.
  • Alt+SysRq+P wypisuje na bieżącą konsolę zawartość rejestrów i flag procesora. Przydatne tylko przy debugowaniu jądra.
  • Alt+SysRq+R przełącza tryb raw klawiatury. Pozwala na wysłanie Ctrl+Alt+Del nawet jeśli zawiesi się obsługująca aktualnie klawiaturę sesja X.
  • Alt+SysRq+S 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.
  • Alt+SysRq+T powoduje wypisanie listy wszystkich zadań.
  • Alt+SysRq+U 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.
  • Alt+SysRq+cyfry zmienia poziom debugowania (gadatliwość kernela) w zakresie od 0 (tylko Panic i Oops) do 9.