Hi, this is your host Michał Rudnicki short "stronger", and Ye are visiting my jagged border of life and work. Have a nice read, and please feel free to drop me a line or twelve.
Since this is a tri-lingual blog you may find it useful to filter it out by:
english |
polish |
php-ish
Landscape od Canonical
18 Aug 2009
Ten wpis NIE JEST o platformie Launchpad. Landscape != Launchpad.
Ponad rok temu pojawiło się ogłoszenie, że Canonical ma zamiar stworzyć oprogramowanie do grupowego zarządzania systemami. Sprawa przeszła jednak poniżej radarów prasy branżowej i blagsfery. Ponieważ ostatnio pojedynkowałem się bezcelowo na argumenty ze zwolennikiem Windows, przypomniałem sobie o Landscape. Rzeczony windziarz zarzucał, że w Linuksach brakuje odpowiednika windowsowej konsoli administracyjnej (MMC) do zarządzania większą liczbą maszyn. Moja odpowiedź poszła w trzech kierunkach:
- MMC służy tylko rozwiązywamiu problemów stworzonych przez same Windowsy
- odpowiednikiem MMC w Linuksach jest konsola tekstowa
- jest Landscape
W tym ostatnim przypadku strzelałem w ciemno, bo o Landscape dawno nikt nie napisał. Po chwili, namysłu... krótkiej chwili, by nie angażować się zbytnio w ten proces, zapisałem się na jazdę próbną z tym narzędziem. I w zasadzie o całej sprawie zapomniałem na dwa tygodnie. Zaproszenie przyszło wczoraj, i ponieważ tak się akurat składa, że mam jeden hostowany RPS działający pod Ubuntu to z łatwością skonfigurowałem go do pracy z Landscape. Sprowadziło się to do zainstalowania jednego pakietu i tony zależności z bieżącego repo i odpowiedzi na kilka banalnych pytań.
I.
System składa się z dwóch części. Pierwsza to demon instalowany na własnej maszynie. Druga to webowy frontend dostępny pod landscape.canonical.com. Po kilku prostych i dobrze opisanych czynnościach konfiguracyjnych otrzymujemy dostęp do pełnej konsoli administracyjnej. Wygląda ona tak:
Zachęcony przejrzystym interfejsem postanowiłem zdziałać coś, co miałoby pozory rzeczywistej pracy. Postanowiłem więc udać się tam, gdzie wysyła mnie lista alertów, czyli do aktualizacji pakietów.
Instalacja jest banalna i sprowadza się do kliknięcia pakietów z listy i zatwierdzeniu zadania. Przypomina to nieco starego dobrego, najpierw kochanego, potem znienawidzonego dselecta.
Na screenshocie widać pasek postępu, ale nie jest on jednak ajaksowym gadżetem, który przyrasta w miarę postępu prac. Po odświeżeniu strony jego wartość podniosła się do 33%, co oznaczało, że paczki zostały pobrane i zaczyna się właściwa instalacja. Po niedługim czasie mogłem już oglądać raport poinstalacyjny.
II.
Pierwsze wrażenie z Landscape jest znakomite. Potrafię sobie wyobrazić, że w przypadku większej ilości serwerów potrafi ono ułatwić uzyskanie lepszego obrazu całościowego infrastruktury. Ponadto ciekawe jest odejście od klasycznej roli root-a jako administratora systemu. W Landscape można dodawać wielu administratorów bez konieczności dopisywania ich do sudoers. Ponadto, administratorzy mogą subskrybować powiadomienia e-mailem o konretnych zdarzeniach.
Przysłowiową wisienką na tak zwanym torcie (© Szyman) jest możliwość prezentacji wykorzystania zasobów systemu w postaci wykresów. Oprócz zajętości pamięci operacyjnej i masowych czy temperatury można dostarczyć własnych źródeł danych, które wygenerują wykres dowolnej funkcji, jaką tylko uda się nam wytrzasnąć. Źródła danych - to brzmi dumnie. W rzeczywistości są to zwykłe skrypty z podanym she-bangiem, czyli dowolnym interpreterem, który tylko jest dostępny na maszynie, więc jeśli tylko mamy ochotę na odrobinę dziwacznej perwersji możemy podać np. #!/usr/bin/php.
I c4n haz one?
Na lot testowy z Landscape można zapisać się na stronie produktu. Aplikacja jest prostsza niż niejeden panel systemów hostingowych i być może celuje nawet w ten sam segment rynku - kto wie? W końcu po co komu cPanel czy Plesk (jeden gorszy od drugiego) kiedy ma do dyspozycji tak przyjemną w użyciu konsolę webową.
Landscape z początku był aplikacją hostowaną u Canonical (model Application Service Provider), jednak producent ogłosił niedawno jej dostępność w instalacji on-site. Roczna licencja wyniesie $150.
Moar on Landscape blog
6 comments | permalink | trackback | rss
Tak zdechł XHTML i chuj mu na grób
03 Jul 2009
(ten grób pochodzi z piosenki Arkadiusz by Homo Twist)
I badzo dobrze, bo miejsce pięknych standardów jest w muzeach utrzymywanych z pieniędzy podatników zarabiających dzięki standardom, które wprawdzie piękne nie są, ale są za to (by sparafrazować profesora Bartoszewskiego) sympatyczne.
Gęba pełna frazesów
Kiedy byłem pięknym młodzieńcem zwykłem głosić z przekonaniem, że każdy problem da się rozwiązać w standardowy sposób. Jeśli rozwiązanie nie posiada szablonu rozwiązania to należy go stworzyć i ustandaryzować, bo przecież na wszystko da się znaleźć wystarczająco obszerny algorytm czy format. Ponadto dobre rozwiązanie powinno cechować się uniwersalnością, zatem wszystkie pośledniejsze rozwiązania powinny zostać uogólnione za pomocą dodatkowej warstwy abstrakcji. I te pe, i te de, kosmiczna harmonia i zen.
Szybki reality check
Teraz pobawimy się w grę fabularną i ja będę twoim mistrzem gry. Możesz sobie stworzyć avatara, ale nie musisz, bo wynik rozgrywki mogę ci zdradzić już teraz – będąc wielbicielem XHTMLa wielkiego sukcesu nie odniesiesz. I nie myśl, że poniższa gra nie ma wiele wspólnego z developersko-biznesową rzeczywistością. Ma całkiem sporo – straciłem już dawno nadzieję, że życie zacznie mnie nagle rozpieszczać bardziej sensownymi wyborami.
Dołączasz do zespołu tworzącego aplikację WWW. Jest już napisane trochę kodu, który raczej słabo się waliduje. Poziom wiedzy pozostałych członków zespołu jest zróżnicowany: kilku gości świeżo po studiach, jeden nadęty mastahaka, dwójka całkiem sensownych develi. Co robisz?
Zaczynasz tworzyć brakującą funkcjonalność pozostawiając kod niezgodnym z żadnych ze standardów byle tylko działał w FF i IE
Przepisujesz aplikacją na zgodną z XHTML
42
Odpowiedzią na większość problemów, z którymi miałem szansę się zmierzyć była dziwna mieszanka solidnej inżynierii, doświadczenia, dystansu do technologii, szczęścia, paniki, braku czasu oraz jasna konieczność indywidualnego podejścia do zagadnienia. Wszelkie automaty, uniwersalne formaty i metasilniki okazywały się niewłaściwe, w najgorszym przypadku uniemożliwiały wykonanie zadania. Architektoniczni astronauci budują piękne cacka, których nikt nie potrafi poprawnie używać. Dokładnie takie samo zdanie mam o XHTMLu. Jest to przeteoretyzowany gniot, produkt myśli obsesyjnego purysty, który w zamierzeniu ma łączyć cechy XMLa i HTMLa. Byłoby fantastycznie gdyby łączył ich zalety, ale niestety łączy również ich wady. I jest to bardzo zła wiadomość, bo o ile zalety obu formatów czasami bywają przydatne, to ich połączone wady zawsze stanowią przeszkodę. Gdyby było inaczej to wszyscy z uśmiechem na twarzy używalibyśmy takich pereł architektury jak XHTML, SOAP czy CORBA, tym czasem wszystkie wymienione chętnie widziałbym w tym samym miejscu, w którym obecnie znajduje się Betamax.
31 comments | permalink | trackback | rss
video/theora - bo mamy XXI wiek
18 Jun 2009
W ostatnich dniach przewaliła się przez Internety wiadomość sprzedana ustami Chrisa DiBony, jakoby format Theora był dla Google niewystarczający technologicznie, w związku z czym YouTube - owszem - rozważa użycie nowego tagu video z proponowanego standardu HTML 5, ale do serwowania plików w formacie H.264. Powodem takiego postawienia sprawy mabyć rzekoma dbałość o pasmo. Chris ostrożnie zasugerował, że pliki zakodowane Theorą i Vorbisem mają być większe przy zachowaniu tej samej jakości co H.264 i MP3/AAC. Na reakcję świadomej technologicznie części społeczności nie trzeba było długo czekać. Greg Maxwell i Maik Merten przedstawili nienaukowe, ale w miarę obiektywne porównania obu par formatów.
Dość przemiału newsowo-blogowego. Teraz ja się zapytuję: kto za to zapłaci gdy wejdzie w życie plan pobierania opłat licencyjnych za kodowanie i/lub dekodowanie H.264? Opcji jest kilka. Dostawca treści - co wydaje się być mało prawdopodobne, z uwagi na sporą siłę jaką dysponują więksi providerzy, czy raczej końcowy odbiorca, któremu kodeki zostaną dostarczone w cenie systemu operacyjnego lub sprzętu? A może pojawi się nowy model licencjonowania technologii i strony zaczną pobierać opłaty za każdorazowe odtworzenie multimediów? "Twój kredyt odtworzeń został wyczerpany - aby obejrzeć to video doładuj swoje konto YouTube." - jak ci się podoba?
Zwolennicy ponoszenia przez użytkownika opłat za korzystanie z technologii lubią odpowiadać pytaniem: kto zapłaci za jej rozwój? Ja na to zadaję kolejne: kto płaci za rozwój istniejących bezpłatnych technologii? Z całą pewnością Dirac, Theora, Vorbis, Speex i inne nie powstały z powietrza. Mniejsza już o jakiś tam kodek, weźmy grubszą sprawę: kto zapłacił za technologię znaną pod nazwą TCP/IP?
Pozostaje jeszcze argument technologiczny - dlaczego używać słabszego formatu, skoro istnieją lepsze? Otóż te lepsze wymagają całkiem sporej mocy obliczeniowej, co nie jest bez znaczenia w przypadku urządzeń przenośnych (arytmetyka zmiennoprzecinkowa!). Z pewnością lubisz mieć trochę prądu w swojej komórce i jeśli jesteś posiadaczem Nokii 3600 przeklinasz konieczność ładowania co drugi dzień. Dlaczego zatem nie pozostawić specyfikacji formatu video bez definicji, by umożliwić odtwarzanie intensywnych obliczeniowo multimediów tym, którzy mogą? Melduję posłusznie obywatelu kapralu, że udzielam odpowiedzi: z tego samego powodu, dla którego znacznik img ma ściśle sprecyzowaną listę formatów koniec odpowiedzi obywatelu kapralu.
Tak się akurat szczęśliwie składa, że Google oczekuje sugestii na temat rozwoju serwisu YouTube. Pomóżmy im zatem podjąć właściwą decyzję za pośrednictwem tej oto strony. Krótki formularz zawiera pole odpowiedzi otwartej po zaznaczeniu ostatniego checkboksa. Oto moja:
5 comments | permalink | trackback | rss
Mała rzecz a cieszy
14 Jun 2009
Kolejny dodatek do Folksr-a to filtr tagów. Działa ograniczająco (spójnik AND) – im więcej tagów zaznaczysz tym krótszą listę otrzymasz. Tak jak w Google.
Przy okazji zmiany przerobiłem również sposób sortowania. Teraz działa bez przeładowania strony, wykorzystując Ajax. Na marginesie, czy wspominałem już, że JavaScript to genialny język? ;-)
16 comments | permalink | trackback | rss
Folksr - pierwsze dwa tygodnie
06 Jun 2009
Upływa właśnie drugi tydzień prywatnej bety Folksr-a. Pora na krótkie podsumowanie okresu najgwałtowniejszego (jak na razie) rozwoju.
Wasze propozycje, które ziściły się
- Nowy tryb pracy widgetu: Ja, znajomi i wszyscy, którzy mają mnie w swoich znajomych. To ustawienie powoduje, że prezentujesz w widgecie również tych, którzy lubią twój blog i mają go w swojej liście znajomych, pomimo, że nie są na twojej liście.
- Upload własnego avatara. Poprzednio Folksr pobierał mordkę użytkownika z serwisu Gravatar. Teraz możesz załadować własną grafikę.
- Kto ma mnie w znajomych. Na stronie znajomych została dodana lista użytkowników i ich blogów, którzy linkują do ciebie. Dodatkowo, w liście twoich znajomych pojawia się informacja gdy twój znajomy również ma cię na swojej liście.
- Powiadomienia pocztą o dodaniu do znajomych. Gdy ktoś doda twojego bloga do listy znajomych zostaniesz o tym fakcie powinformowany emailem.
- XML-owa sitemapa. Dzięki niej Google i inni będą mogli skuteczniej dotrzeć do profili użytkowników i ich blogów. Trochę darmowego page ranku nie zaszkodzi ;-)
- Statystyki wejść i wyjść na stronie wpisów. Bardzo często zgłaszana funkcja, która wyświetla liczbę przybyć i wybyć z/na inne blogi. Poniżej liczby odsłon pojawiają się mniejszym pismem dwie dodatkowe wartości: wyjścia→wejścia.
- Sortowanie listy wpisów wg różnych kryteriów. Logiczną konsekwencją poprzedniej funkcji wydaje się być szeregowanie stron w oparciu o kolejność zaindeksowania, tytuł (alfabetycznie), ilość wyświetlen oraz wejść i wyjść z/na inne blogi.
To wszystko dzięki waszym zgłoszeniom.
Plany na nieodległą przyszłość
Przepisany ekran edytora skórki. Edytor skinu działa poprawnie, ale nie jest szczególnie piękny. Plan obejmuje przeorganizowanie podstrony oraz dodanie biblioteki przykładowych skórek. Podgląd aktualnie tworzonego widgetu będzie dodany w dalszej kolejności. Została zaproponowana nazwa "szablon" w miejsce słowa "skórka".
Wsparcie dla blogów na Blogspocie. Mam nadzieję, że wkrótce zmagania z denną dokumentacją od Google zaowocują pojawieniem się pluginu i detektora blogów opartych na silniku Blogger/Blogspot.
Migracja do innej domeny. Trochę wysiłku musi zostać włożone by przeindeksowanie wpisów pod inną domenę było możliwe.
Filtrowanie powtórzeń i przeładowań w logach. Obecnie każde kliknięcie jest odnotowane, choć nie zawsze powinno. W szczególności przeładowania strony nie powinny liczyć się podwójnie.
Garść liczb
Od początku prywatnej bety ilość wyświetleń widgetu wzrosła dwukrotnie, do poziomu ok. 2800 odsłon. W sumie tyle razy wasze blogi były oglądane. Dzienna wartość szczytowa to 3813 odsłon. Podobny wzrost dotyczy liczby kliknięć w widget (clickthrough). Obecnie jest ona na poziomie ok. 70 dziennie, co stanowi 2,5% wyświetleń - to lepiej niż w przypadku reklam Google!
Folksr indeksuje 1731 wpisów z 21 blogów (płodni jesteście!). Liczba zaindeksowanych tagów wynosi 8781, z czego 4004 jest unikalnych. Średnia ilość tagów na post to 5,09 (czyli moje wcześniejsze analizy były trafne).
Serwer Folksr-a działa pod Ubuntu 8.10 z Apache, PHP i bazą PostgreSQL. Najbardziej skomplikowane złożenie SQL obejmuje 5 tabel + 2 podzapytania z grupowaniem. Obciążenie maszyny oscyluje w granicach 0,15-0,25. Oznacza to, że mamy olbrzymi zapas mocy, którego nie zawahamy się użyć ;-)
Beta 2
Nadchodzące dni będą dla Folksr-a dalszym ciągiem prywatnej bety. Nadal znajdują się drobnostki, które wymagają naprawy – lepiej gdy zdarzają się kilku osobom niż miałyby dotyczyć setek użytkowników. Z pewnością gdzieś czai się także kilka nieprzetłumaczonych komunikatów (czego zwalczaniem zajmuje się breffa, kudosy i creditsy). Ponadto chciałbym pozyskać więcej testerów na platformach WordPress i Blogspot. Po zakończeniu prywatnych testów Folksr będzie miał już wystarczającą ilość zaindeksowanych wpisów, że podpowiedzi widgetu staną się dużo bardziej trafne.
Dzięki wszystkim dotychczasowym betatesterom, w szczególności tym raportującym błędy i dającym link do Folksr-a na swoich blogach. Możecie podsyłać propozycje ulepszeń, pamiętajcie tylko: Folksr powinien pozostać prosty w obsłudze (w następnych wpisach wyjaśnię dlaczego).
5 comments | permalink | trackback | rss
Folksr: algorytm szukania podobnych wpisów
29 May 2009
Program prywatnej bety Folksr-a postępuje znakomicie i odzew społeczności jest ogromnie nagradzający. Szczególne podziękowania należą się roziemu i breffie (czy to się odmienia?) za cenne uwagi i raporty. Myślę, że będę Was musiał jakoś wynagrodzić, chłopaki ;-) Ale do rzeczy; oto algorytm używany przez Folksr-a do wyszukiwania podobnych wpisów.
Co się stanie jak dodam 1000 tagów?
No właśnie. Obliczanie podobieństwa wpisów na podstawie tylko i wyłącznie liczby tagów nie jest lepszym pomysłem. Technologia WWW już to przerabiała w postaci nagłówków meta z atrybutem keywords. Pole to szybko stało się na tyle bezużyteczne, że obecnie żadna wyszukiwarka nie bierze go pod uwagę. Folksr ogranicza liczbę indeksowanych tagów do dziesięciu. Jest to przyzwoita liczba, którą można wyrazić esencję treści i zachęca do rzetelnego tagowania swoich wpisów. Jest poza tym zgodna z ogólnymi wzorcami interfejsów użytkownika, gdzie 3-7 to zakres optymalny (jak myślicie, skąd 37signals wzięło swoją nazwę?).
Punkty za ilość
Każdy zbieżny tag jest punktowany i stanowi równą część wyniku. Załóżmy więc, że popełniłem wpis otagowany jako ubuntu 9.04 jaunty launch party dublin. Przyjmijmy też, że dwie inne osoby postanowiły podzielić się z blogsferą podobnymi wpisami. Pierwszy z nich zawiera tagi ubuntu 9.04 release party katowice, drugi jest oznaczony ubuntu 9.04 jaunty jackalope linux unix gnome recenzja. W obu przypadkach znalezione blogi mają po trzy tagi wspólne z wpisem na blogu gospodarza, ale ten drugi jest dużo szerszy. Jak ocenić który z nich jest trafniejszy?
Punkty za jakość
Do głosu dochodzi zatem zasada, że nie liczy się ilość lecz jakość. Ponieważ szerzej otagowane wpisy mogą być mniej trafne Folksr pomniejsza wagę wpisów o dużej liczbie tagów. Zapobiec ma to dodawaniu etykiet, które są słabo bądź wcale nie powiązane z tagami na blogu gospodarza. W drugim przypadku przytoczonym powyżej można się zgodzić, że tagi linux unix gnome są nieco nadmiarowe, a nawet błędne (unix???)
Jakość × ilość
Folksr bierze pod uwagę zarówno jakość jak i ilość. Każdy tag ma przyznaną pewną liczbę punktów, ale im więcej tagów tym punktów mniej. Ponieważ liczba tagów ograniczona jest do 10, to dwie skrajne możliwości są następujące:
- 1 tag za 10 punktów
- 10 tagów po jeden punkt każdy
Wielkości pośrednie łatwo sobie wyobrazić: 2 tagi po 9 punktów każdy, 3 tagi po 8 punktów każdy, itd. Gdy wartość pojedyńczego tagu jest wyznaczona Folksr przystępuje do zliczania pasujących tagów. Wartość każdej etykiety zostanie pomnożona przez liczbę tagów zgodnych z tagami na blogu gospodarza, wg wzoru:
wynik = (11 - liczba tagów) × liczba podobnych tagów
Wracając do wcześniejszych przykładów, wyliczmy punktację dla każdego z nich:
-
ubuntu 9.04 release party katowice
(11 - 5) × 3 = 18 -
ubuntu 9.04 jaunty jackalope linux unix gnome recenzja
(11 - 8) × 3 = 9
Zgodnie z przeczuciem, wpis nr 2 został oceniony niżej, natomiast nagrodzona została celność tagów we wpisie nr 1.
Punktacja na max
Skoro wiemy już, że Folksr nagradza za ilość przekładającą się na jakość, to ile punktów można osiągnąć maksymalnie? Szybki rachunek w arkuszu kalkulacyjnym pokazuje, że najwyższa liczba punktów możliwych do osiągnięcia to 30:
| Liczba trafień | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| Wartość taga | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
| Wynik | 10 | 18 | 24 | 28 | 30 | 30 | 28 | 24 | 18 | 10 |
Wartość 30-tu punktów można osiągnąć publikując 5 lub 6 tagów pod warunkiem, że wszystkie z nich są zbieżne z tagami na blogu gospodarza. Całkiem przyzwoite wyniki uzyskuje się również dla 4 lub 7-miu tagów, co może być dość dobrą strategią biorąc pod uwagę trudność utrafienia wszystkich pięciu lub sześciu tagów (twórcy totolotka też potrafią liczyć ;-)
Kalkulator punktacji
Poniżej zamieszczam szybki kalkulator punktacji napisany w JavaScripcie. Oczywiście nie ma sensu brać go na poważnie – w końcu nie o to chodzi w blogowaniu; niech posłuży tylko jako ilustracja zastosowanego w Folkserze algorytmu i miernik jego jakości.
Liczba tagów: × Liczba trafionych: = 21
5 comments | permalink | trackback | rss
Folksr: empowered by OSNews.pl
26 May 2009
Dzięki uprzejmości Borysa z OSNews.pl Folksr zaczął indeksować treść tego serwisu (Creative Commons Attribution 2.5pl).
Zasoby te z każdym dniem będą rosły, a ponieważ artykuły na OSNews są znakomicie otagowane ich trafność w podpowiedziach będzie wysoka. Oczywiście jeśli nie chcesz newsów z serwisu w swoim widgecie, po prostu nie dodawaj go do znajomych!
add coment | permalink | trackback | rss
Folksr - już wkrótce
13 May 2009
Folksr nadchodzi, jest tuż za rogiem. Spodziewaj się zaproszenia – tak tak, Ty!
12 comments | permalink | trackback | rss
GOTO żyje i ma się świetnie
06 May 2009
Niekiedy zdarza się, że chodzi mi w głowie, w tle jakiś proces myślowy. Niekiedy pozostaje w utajnieniu przez dłuższy czas, bywa też, że rozpoczyna się całkowicie podświadomie i objawia się dopiero później głośnym *KLIK*. Jest to zazwyczaj chwila oświecenia i fantastyczne uczucie - coś jak osiągnięcie wyższego Experience Level w Falloucie (tym pierwszym, nie grywam w sequele).
Ostatni duży klik dotyczył sposobu realizacji punktów powrotu w aplikacjach WWW. Każda bardziej skomplikowana webplikacja ma mocno nieliniowy przebieg nawigacji. Dla przykładu sklep internetowy może pozwalać na zmianę danych adresowych klienta z poziomu strony głównej, strony produktu, strony koszyka, strony potwierdzenia zamówienia i pewnie jeszcze wielu innych. Po wprowadzeniu zmian klient spodziewa się być przeniesiony na stronę, z której wszedł do ustawień adresu. Aplikacja WWW musi oczywiście zapamiętać punkt wejścia. W tym celu najczęściej stosuje się jedno z dwóch rozwiązań.
-
Dane sesyjne lub ciastko.
Adres powrotu lub informacją pozwalającą na wygenerowanie takiego adresu można składować w sesji użytkownika. Gdy użytkownik osiągnie punkt końcowy wysyłasz redirect do tego, co zapamiętane w sesji. Są jednak poważne problemy związane z tym sposobem. Pierwszy to taki, że dane sesyjne zapisuje serwer (można w JavaScripcie, ale nie ma sensu) i kłopot polega na tym, że do sesji musi trafić informacja o gdzie użytkownik był przed chwilą (np. na stronie produktu), a nie gdzie jest teraz (na stronie formularza adresu). Można to osiągnąć czytając nagłówek HTTP Referer… o ile taki istnieje. Niestety serwery Proxy i firmowe firewalle robią czasami z tym nagłówkiem dziwne rzeczy - niby rzadko, ale jednak zbyt często aby na nim polegać. -
Parametr GET lub ukryte pole POST.
Dużo bardziej wiarygodnym jest oparcie się o dodatkowy parametr, który jest generowany dla konkretnego linku. Sprowadza się to do prostego dodaniareturn=....do adresu docelowego (np. strony danych adresowych nabywcy). W ten sposób, gdy użytkownik podąży za linkiem serwer na pewno otrzyma ten parametr i żaden Proxy nie ma prawa go zmienić. Główna niedogodność polega jednak na tym, że taki parametr trzeba przekazywać dalej, aż do momentu powrotu.
Sposób pierwszy jest bardzo elegancki i prosty. Przypomina odkładanie adresu powrotu na stosie przed wykonaniem skoku do podprocedury. Problem jednak w tym, że w środowisku webowym taki odkładanie na stosie nie działa zbyt dobrze. Jak wyjaśniłem powyżej adres powrotu nie jest niestety odkładany przed skokiem a po (czytając pole Referer). Jeśli trzymać się dalej analogii assemblerowej to przypominać to może hakowanie procesora w celu uzyskania adresu źródła skoku - wystarczy trochę technicznej intuicji by wiedzieć, że to nie może się powieść. Do takich rzeczy używa się obsługiwanego automatycznie stosu, HTTP takiego stosu nie oferuje. Ba, samo HTTP nie jest nawet protokołem sesyjnym!
Sposób numer dwa wygląda na dość uciążliwy. Jakieś dziwactwa w URL-u czy tajemnicze pola formularza? Toż to wywlekanie bebechów aplikacji na widok publiczny! W dodatku nikt nigdy w historii informatyki nie wpadłby na tak głupi sposób przekazywania adresu powrotu z podprocedury! *KLIK*.
Kontynuacje
Kontynuacje to zdumiewający koncept. Pochodzą z tych samych odległych dziejów co Algol. Kontynuacja to "pozostała część kodu do wykonania", najczęście reprezentowana przez obowiązkowy parametr (niekoniecznie jawny) przekazywany do podprocedury i zawierający adres powrotu. Jest to konwencja wykonywania skoków alternatywa do tej z użyciem stosu. Ponieważ mnie samemu zrozumienie kontynuacji oraz call/cc zajęło trochę czasu, przedstawiam tu realizację tej konwencji w BASIC-u. A nie jest to zwykły badziewny BASIC - jest to najchujowszy z chujowych BASIC-ów, Atari BASIC.
10 A=6: B=8: H=10
20 RET=30: GOTO 100
30 PRINT "Objetosc ostroslupa o podstawie " ; A ; " na " ; B
40 PRINT "i wysokosci " ; H ; " wynosi " ; V
50 END
100 REM Procedura obliczajaca objetosc ostroslupa
101 REM Parametry: A, B, H
102 REM Zrwaca: V
110 V=A*B*H/3
120 GOTO RET
Wytłuszczenie wskazuje punkt wejścia do procedury i powrotu do kontynuacji.
Przyznasz, że wygląda dziwacznie nawet jak na BASIC. W rzeczywistości wykorzystanie konwencji stosu byłoby bardziej naturalne. Wówczas linie 20 i 120 wyglądałyby następująco:
20 GOSUB 100 120 RETURN
To, co widać w linii 20 w pierwszym przykładzie to przekazanie adresu kontynuacji do zmiennej RET i wykonanie skoku do podprocedury. W podprocedurze w linii 120 następuje kolejny skok, tym razem do uprzednio przygotowanej zmiennej. Nie został użyty stos. Po wyższy przykład ilustruje coś, co w Scheme nazywane jest call-with-current-continuation, w skrócie call/cc. Bieżąca kontynuacja to taka, która rozpoczyna się od bezpośrednio następnego adresu, tu od linii 30.
A tak robimy to w XXI wieku
http://ostroslup.com/podstrona1.html
<form action="objetosc.php?ret=podstrona1.html" method="get">
<input type="text" name="a">
<input type="text" name="b">
<input type="text" name="h">
<input type="submit">
</form>
Atrybut action zawiera adres "podprocedury" praz z przekazaną kontynuacją
http://ostroslup.com/objetosc.php
<?php $a=$_POST['a']; $b=$_POST['b']; $h=$_POST['h']; $v=$a*$b*$h/3; ?>
Objetosc ostroslupa o podstawie <?= $a ?> na <?= $b ?>
i wysokosci <?= $h ?> wynosi <?= $v ?>
<a href="<?= $_GET['ret'] ?>">Kliknij tutaj aby powrócić</a>
Odnośnik umożliwia skok do przekazanej uprzednio kontynuacji
W przypadku webu kontynuacje o wiele bardziej pasują do technologii niż stos. Mają też nad nim szereg przewag.
-
Działają poprawnie gdy użytkownik zboczy z zakładanej ścieżki nawigacji.
Gdy klient podczas wypełniania formularza adresowego zmieni zdanie i wynawiguje w przysłowiową cholerę skuszony na przykład bannerem promocyjnym do superproduktu X. Co więcej istniejącą kontynuację można przekazać dalej jako kolejną kontynuację. Dzieje się tak dlatego, że parametr powrotu w przekazany w adresie po zakodowaniu do postaci RFC1738 (rawurlencode) nie koliduje z nową kontynuacją przekazaną pod tą samą nazwą parametru, np.promocja.php?id_promocji=666&powrot=koszyk.php%3Fpowrot%3Dprodukt.php%3Fid_produktu%3D555 -
Kontynuacja wcale nie musi być bieżąca.
Załóżmy, że mamy w naszym sklepie dwa rodzaje userów: zwykły user i jeleń premium. Na stronie produktu oferujemy oba linki niezalogowanemu klientowi, ale tylko pierwszy zawiera bieżącą kontynuację. Ten drugi ma kontynuację przenoszącą na specjalnie przefiltrowaną stronę produktów, która pozwoli mu zrobić lepszy użytek ze swojej platynowej karty kredytowej. W przypadku stosu takie rozdzielenie okazuje się nieporównywalnie trudniejsze i wymaga dodatkowej logiki po stronie serwera. -
Kontynuacje nie idą w maliny.
Nauczony bolesnym doświadczeniem staram się utrzymywać swoje aplikacje możliwie jak najbardziej wolne od danych sesyjnych. Zapamiętywanie adresów powrotów w sesji (na stosie) może prowadzić do dziwacznych redirectów gdy użytkownik zapętli się w nawigacji. W świecie webowym nie masz przydatnej instrukcjipopdo zdjęcia ze stosu nieważnego adresu powrotu. W rzeczywistości użytkownik może namotać dużo bardziej, a podążanie za nim i czyszczenie stosu ręcznie to zadanie niewykonalne - prędzej czy później zostanie ku swojemu zdziwieniu przeniesiony w miejsce kompletnie niespodziewane.
Na koniec jeszcze absolutna perełka: Continuation-Passing Style and why JavaScript developers might be interested in it. Ciężki materiał, ale i świetna gimnastyka dla umysłu.
11 comments | permalink | trackback | rss
Outlook fail
30 Apr 2009
Bo zawsze warto zacząć dzień od zdrowej porcji dobrego humoru!
3 comments | permalink | trackback | rss
Stan Linuksa na Q1 2009
26 Apr 2009
Ubuntu 9.04 - pierwsza w moim życiu dystrybucja Linuksa, która zadawala mnie dokładnie w stu procentach. Właśnie tak; nie mam żadnych uwag. Dokładnie 10 lat po moim pierwszym kontakcie z Linuksem. Społeczność Ubuntu oraz Canonical odwalili kawał znakomitej roboty w czymś, co interesuje mnie przenajbardziej na świecie – uprzyjemnianiu mi życia. Należą im się za to pokłony i uściski.
Boot
W dziesiątej edycji Ubuntu bootowanie systemu jest błyskawiczne. Ekran startowy pojawia się już po ok. 24 sekundach, biurko nadaje się do pracy po kolejnych 15-tu z użyciem autologinu. W przeciwieństwie do niektórych popularnych systemów pulpit jest używalny od razu, bez czekania na załadowanie antywirusa, firewalla, antyspyware, zamontowania zasobów sieciowych i innych systemowych bzdur, na których nie masz ochoty się znać.
Multimedia
Multimedia działają. Rhythmbox gra moje ogi, empetrójki, a nawet jotpedwójki, zgrywa podkasty i pobiera słowa piosenek. VLC otwiera każdą płytę jaką go szykanuję. Nawet mój ulubiony chłopiec do bicia, Totem, odtworzył wszystkie pliki, którymi próbowałem go nakarmić.
Sieć
To jest bodaj najmocniejszy punkt programu. Linux jest w pełni internetowym OS-em. Firefox 3 jest przyzwoitą przeglądarką. Flash działa. Pidgin wyśmienicie zapewnia mi łączność z XMPP i MSN. Evolution jest absolutnie genialny - kalendarze, listy zadań i przesyłanie zdarzeń oraz nowa wtyczka do integracji z Exchange działają perfekcyjnie. Łączność głosową zapewnia mi Skype, który w porównaniu ze swoją wersją windowsową nie jest onieśmielająco skomplikowany. Dostęp do RSS-ów i Twittera zapewnia Gwibber, który jest jednym z najsłodszych programów jakie widziałem.
Produktiviti
Również na tym polu nie mam Linuksowi nic do zarzucenia. Czyta doc, xls, ppt i ich OOXML-owe odpowiedniki, Evince bezbłędnie otwiera PDF-y. Edycję tekstów uprawiam w Gedicie, mcedicie lub Emacsie, diagramy rysuję w Umbrello. Gimp jest rewelacyjny do obróbki grafiki i robi wszystko, czego zapragnę. Gnome-terminal jest szybki i wygodny, a konsolowy klient Subversion nie ma sobie równych. Java i dotnet? Proszę uprzejmie, oba w pakietach dostępnych na wyciągnięcie ręki.
Urządzenia
Radio, grafika, uśpienie i hibernacja - wszystko działa należycie. Miernik baterii pokazuje właściwy poziom naładowania. Urządznia bluetooth i pamięci masowe USB otwierają się bez najmniejszego oporu, a pobieranie fotek z aparatu to igraszka. Nawet klawisze głośności i kontroli sieci bezprzewodowej działają. Uważam, że jest to absolutnie genialne i godne najwyższej pochwały zważywszy fakt, że nie musiałem instalować ani jednego sterownika. Sieciowe drukarki w pracy skonfigurowały się niemal automatycznie. Czegóż chcieć więcej?
A co na to konkurencja?
Obejrzywszy Ubuntu 9.04 pracownicy Microsoftu powinni popełnić rytualne samobójstwo, czyniąc tym samym świat miejscem znacznie przyjemniejszym. Windows nie ma nic, czym mógłby konkurować z Linuksem w segmencie enduserskiego biurka (a w szczególności w podsegmencie mojego enduserskiego biurka ;-). By użyć mało smacznego porównania - jest jak zwycięzca olimpiady specjalnej: może i najwyżej na podium, ale w dalszym ciągu retard.
Próbowałem również żyć z Mac OS X, ale się nie dało. Niemożność skonfigurowania środowiska tak jak lubię (włączenia fokusu podążającego za myszą i automatycznej aktywacji okien gdy wskaźnik znajduje się nad nimi dokładnie 0,6 sekundy) zniechęciła mnie do dalszej eksploracji tego systemu. W dodatku sprzęt Apple wyróżnia się wyjątkowo odpustową estetyką i dość irracjonalną jak na zwykłego klona x86 ceną. A poza tym, dlaczego Delete działa jak Backspace, a prawdziwego Delete brak?
Ubuntu Linux to najłatwiejszy system jaki znam. Wszystko działa i zachowuje się przewidywalnie. Manager oprogramowania jest genialnym rozwiązaniem - wierz lub nie, przestałem korzystać z konsolowego apt-a. Choć jest to wyjątkowo subiektywna ocena, to zdaje się, że znajdujemy się w punkcie, w którym społeczność open source i free software może dostarczyć kompletne oprogramowanie lepiej, łatwiej, taniej i znacznie szybciej niż podmioty komercyjne.
12 comments | permalink | trackback | rss
Paddy's Day
22 Mar 2009
Tegoroczną paradę z okazji dnia św. Patryka miałem szansę obejrzeć w całości. Bardzo radosne i mocno surrealistyczne wydarzenie, zobacz sam/a klik klik. W dodatku od 17 marca mamy tu świetną pogodę (czyt. nie pada) i wszysko wydaje się weselsze.
Udało mi się nawet nieco popstrykać. Z tej okazji zapoznałem się z Google Picasa for Linux i wiem już jakim niewyobrażalnym gównem jest ten program. Znającym się na rzeczy wystarczy jedno słowo - wine.
gee, one comment! | permalink | trackback | rss
Oh by the way
06 Feb 2009
Po perturbacjach związanych ze standardem usług Poczty Polskiej dotarł w moje ręce zamówiony przez ukochaną p. prezent urodzinowy. Prezent jest ge-nial-ny, dokładnie taki, jaki powinien być: o dużej wartości osobistej, bardzo sentymentalny, niezwykle praktyczny, i w dobrym guście. Bull's eye – zgrzewka albumów Pink Floyd.
Oh by the way to kolekcjonerska reedycja studyjnych płyt zespołu z zachowaniem smaczków, które towarzyszyły każdemu z nich. I tak na przykład płyta Wish you were here jest opakowana w czarny worek, a we wkładce znajduje się miniaturowa pocztówka. Album z pryzmatem zawiera dwa plakaty, a Obscured by clouds jest wydane w miękkiej oprawie. Wszystkie kompakty mają nadruk identyczny z zastosowanym na oryginalnych winylach, a każda płyta ma dodatkowo miękką kopertę oraz folię ochronną znaną użytkownikom czarnych płyt. Do pudełka dołączony jest jeszcze duży plakat luzem oraz dwie okładki typu przerośnięta podstawka pod piwo. Całość zamknięta w solidnym, trzyczęściowym pudełku. Brzmi jak przed laty i zapewnia głęboki relaks. Relaks wygląda tak:
Lubię poświęcać czas słuchaniu dobrej muzyki. Nie robić nic oprócz słuchania. Pink Floyd to z całą pewnością dobra muzyka i nie da się jej pochłaniać "wmiędzyczasie". Nareszcie mogę docenić płyty, których nie znałem zbyt dobrze – More, Obscured by clouds i Saucerful of secrets. Odpowiedź na pytanie o ulubionego artystę nadal pozostaje bez zmian. Dzięki p!
Oh by the way, which one is Pink?
2 comments | permalink | trackback | rss
Biurowy zabójca produktywności
16 Jan 2009
Wczoraj przed końcem dnia graficzka radośnie wykonała svn up z pominięciem maszynki testowej. Dziś dostałem setkę maili z Exception thrown w tytule. Wobec powyższego na brak zajęć nie narzekam, wręcz przeciwnie – chętnie się podzielę.
Ale ale. Jakieś priorytety i świętości trzeba w życiu mieć. A ponieważ jest piątek, środek dnia, świeci słońce, ciepło – 8°C to ścigam się z resztą biura w Typeracerze.
Totalny productivity killer – zostałeś ostrzeżony.
9 comments | permalink | trackback | rss
Planet X, Gattringer, Dylan
11 Jan 2009
Po ostatnim poście jakoś mi się tak żółcią zaczęło odbijać, więc postanowiłem przegryźć czymś smaczniejszym. W końcu nie musimy lubieć czytać, że kogoś gniecie w boku, a horyzonty muzyczne zawsze można/warto/należy sobie poszerzać. Od razu uprzedzam, że będzie ciężkie granie, więc delikatniejsze organizmy zapraszam na koniec notki, gdzie znajduje się pieśń masowego rażenia.
Zdarza się, że gdy siądę przy Everything2 albo do Wikipedii to nie mogę oderwać się od klikania po odnośnikach. Czasami dochodzi do zapętleń, więc wybieram wariant "a co się stanie jeśli podążę za tym linkiem". Cały proces wygląda trochę jak z pierwszego odcinka XKCD.
Progressive metal
W ten sposób dotarłem do informacji o zespole Planet X. Pretensjonalna nazwa podpowiadała mi, że może to być straszna cienizna. Ściągnąłem ich płytę Quantum i... W zasadzie nadal nie wiem czy jest genialna czy słaba. Z całą pewnością jest bardzo irytująca, pełna niespokoju oraz wybijających z transu zmian metrum i tempa. Partia gitarowa sygnowana jest charakterystycznymi riffami moich bogów gitary legato, Brettem Garsedem i Allanem Holdsworthem. Na bębnach Virgil Donati. Oceńcie sami - ja się nie znam.
Planet X - Quantum - 1. Alien Hip Hop
Planet X - Quantum - 3. Matrix Gate
Jazz fusion
W podobny sposób jak do Planet X dotarłem do video nagranego przez młodego austriackiego bębniarza, Simona Gattringera. Klikałem po linkach w Google Video wyszedłszy od wspomnianego Holdswortha. Kawałek nosi tytuł Protocosmos i był coverowany przez chyba każdego fussionowca o odchyle jazzowym. Utwór nagrany jest z precyzją właściwą kręgom kulturowym muzyka ;-). Zrobił on na mnie spore wrażenie łatwością, z jaką ogrywa cały bogaty zestaw perkusyjny. Może nie zwracam zbyt wielkiej uwagi na drummerów, ale w życiu widziałem tylko raz podobną lekkość gry i podobny wodospad dźwięków – jakieś 13 lat temu na Jazz Juniors w Krakowie.
Hej Simon, seksowne ciżmy ;-)
Ever green
Koncert dla uczczenia XXX-letniej działalności artystycznej Boba Dylana. Jedna z tych pieśni, która porywa publikę i powoduje erupcję dobrych emocji. Utwór jest na prawdę zaraźliwy, w dodatku ma niebanalny tekst. Wyśmienita obsada artystów towarzyszących nie dała na szczęście Robertowi pośpiewać da dużo ;-) Utwór to oczywiście My Back Pages – sing along.
Szkoda, że takich już nie robią.
gee, one comment! | permalink | trackback | rss
W kraju nad Wisłą znowu przejebane
08 Jan 2009
Dell podjął decyzję o przeniesieniu swoich zakładów z Limerick (aka Stab City) do Łodzi. Patrząc z perspektywy polskiej jest to doskonała wiadomość zwłaszcza w dobie prawdziwego czy też urojonego, ale jednakowo niebezpiecznego kryzysu gospodarczego. Gie Wu podało – pomyślałem, że zajrzę do komentarzy.
A tam jak zwykle piekło. Reakcje czytelników przebiły po wielokroć to, czego się spodziewałem. Marudzenie, narzekanie, czarnowidztwo, groźby, rzucanie błotem, oraz świerzb, biegunka i torsje. Repertuar jęków autentycznie mnie zaskoczył. Brnąc się przez katastroficzne wizje kolejnych dyskutantów uderzyło mnie jak wiele powodów do narzekań można znaleźć w jednej informacji prasowej. W dodatku całkiem optymistycznej. W pewnym momencie zacząłem zliczać powody dla których powinienem się zabić. Oto niektóre:
Po co zatrudniać Polaków za 2000euro...
...skoro można za 2000zł. znajomy_jennifer_lopez
Ile trzeba dopłacić?
No i wyszarpać bonusy podatkowe od samorządów. Tym razem polskich. maruda.r
A za 10 lat, po koncu ulg, zamknac fabryke w Polsce i wyniesc wszystko do Serbii/Ukrainy/Rumunii... Misiek
Nie wiem z czego sie tu cieszyc. Przeciez tu chodzi wylacznie o wyzysk i ulgi podatkowe. wrd6611
A za dwa lata [...] przeczytamy Dell zamyka w Łodzi , przenosi się do Baku zimny forumowicz
albo i pod Ułan Bator! I dopiero będzie larum! Ludzie stracą miejsca pracy, nikt nie zwróci za infrastukturę, za ulgi podatkowe [...] oraz za zasiłki dla nowych bezrobotnych! tbarabasz
A dla kogo te 1500 miejsc pracy? Dla podających płytki do robotów po 3 dniowym przyuczeniu. Bo przecież nie dla inżynierów! Ludzie są potrzebni Dellowi jako bezmyślna siła robocza [...]. Wiedzę zostawi u siebie - nie będzie się przecież wiązał z jakąś tam Polską tbarabasz
Obilo mi sie o uszy, ze placa tak slabo, ze ludzie, ktorzy tak tlumnie walili na poczatku, olali ich.... Marcino
Do Irlandii wyjechali przeważnie gołodupcy
Absolwent prawa czy innej socjologii stoi przy maszynie i składa komputery. MaT jeszcze więcej badziewia z Łodzi na rynku...:( doni
lodz zawsze pacholkiem warszawy
w warszawie fabryk sie nie buduje:) ss
W normalnym kraju oplaca sie doplacic, aby powstaly miejsca pracy w sektorze wysokich technologii [...]. Natomiast mamy w Polsce takie podejscie, ze szczytem marzen jest robota, ktora byle Chinczyk morze zrobic, no i takie zarobki sie ma. 0.tech
ja bym tych kapitalistow na latarniach wieszal:)
[...] glupi polak polak za pare lat dostanie kuku jak przeniosa swoj wyzysk w inne miejsce na swiecie bjk
Wystarczy.
Ja rozumiem, że na tego typu forach siedzą głównie gówniarze i trolle, ale *takiego* stężenia pesymizmu dawno nie widziałem. Nawet na stronach słynnego polskiego think-tanku Onet.pl. Przygnębiające jest, że ludzie, którzy mają lub w nieodległej przyszłości będą mieli czynne prawa wyborcze wystawiają sobie tak złą cenzurkę. W tych wypowiedziach mógłby przejrzeć się jak w lustrze niejeden Polak – wszystkie narodowe kompleksy wypływają na wierzch szamba. Insynuacje, że Dell odbiera im chleb od ust, przekonanie o byciu stokroć lepszym niż byle Chińczyk, ta pogarda pod adresem emigrantów ("zmywaków") oraz zawistne złożyczenie każdemu, komu może się powieść. Wszystko to symptomatyczne dla mieszkańców Republic of Boland.
Niestety i na szczęście zarazem wiele miernot nie dowie się nigdy jak to jest żyć z uśmiechem na ustach, cieszyć się wspólnym, a nawet cudzym sukcesem, szanować pracę innych oraz oczekiwać godnego, ba uprzejmego! traktowania już od pierwszego kontaktu, w skepie, w urzędzie, w autobusie. Niestety dlatego, że nie wróży to najlepiej Polsce. Naszczęście, bo osobiście wolę gdy gniją na swoim podwórku.
Update 1231682185. Czy uważam, że Dell za kilka lub kilkanaście lat powtórzy swój manewr i przeniesie swoje manufaktury dalej na wschód? Bez wątpienia. Zrobi to w takim samym stylu jak teraz, tj. będzie okłamywał pracowników, że to nie przenosiny a jedynie otwarcie nowej fabryki i czekał na pretekst (np. kryzys) aby zamknąć fabrykę w Łodzi. Czy uważam, że mimo to jest to korzystna dla Polski sytuacja? Tak, a lepszej nie będzie.
gee, one comment! | permalink | trackback | rss
Radosny jest grajdół konsultantów i profesjonalistów
28 Nov 2008
Po wczorajszym IPUG, na którym przyklejono mi etykietę hardkorowego pehapowca (nie powiem, wcale mnie to cieszy) dostałem niespodzianie zaproszenie na spotkanie "Profesjonalnych Bloggerów i Konsultantów SEO". Prawdopodobnie powinienem przepisać ten tytuł SAMYMI KAPITALIKAMI, ale jakoś tak dziwnie żołądek doprasza się uwolnienia barwnego ptaka.
Dawno temu podjąłem decyzję, że nie będę na jogu budował sobie netłorku znajomych i dzisiaj się w tym postanowieniu utwierdziłem. Spotkanie z grubsza można sprowadzić do tasowania wizytówek, żarciu frytek z octem, zapijaniu piwem i licytowaniu się na trzyliterowe skróty. Nie mam oczywiście nic przeciwko owym skrótom, o ile kryje się za nimi i zdaniami je zawierającymi jakakolwiek istotna treść. I tu definicja "istotnej treści" przez przykład negatywny: nie chodzi o entuzjastyczne ćwierkanie "jaki to ja jestem zajebisty i w ogóle profesjonalny". A tak niestety było. Grupa klonów uformowała się dość szybko i zaczęła chóralną afirmację. Potrafisz sobie chyba wyobrazić jak bardzo żenujące jest gdy rzutki chłopak na oko lat 25 recytuje z pamięci SLA providerów i procentowe wagi poszczególnych trików SEO, a gdy przychodzi do konkretów to rzuca niby to pierwszym z brzegu adresem do strony muzeum w Galway, która (po szybkim sprawdzeniu w Operze Mini) od sieci z epoki HTML-a 3.2 różni się głównie webdwazerowym nagłówkiem i brakiem animowanych gifów "under construction". A łańcuszek głów wzajemnie potakuje ze zrozumieniem i uznaniem dla biznesowego doświadczenia delikwenta. Na koniec jeszcze pada jakaś kwota, która mówiąc między nami przeliczona na stawkę godzinową czy miesięczną nie powala i pałeczkę przejmuje następny onanista (och, jakie obrazowe porównanie mi wyszło).
W końcu po trzecim kuflu przychodzi pora na bardziej ogólne rozważania. Buzzwordy typu cost-per-click czy affiliate content nie schodzą z afisza. Adding value, performance improvement i w ogóle kej-pi-aj na tysiąc jeden sposobów i długie, zimowe wieczory. Najzabawniejsze jest chyba zaklinanie rzeczywistości, że to prawdziwe pieniądze wydawane na prawdziwych klientów poprzez generowanie prawdzego ruchu. Na uwagę, że to tylko obietnica pieniędzy za obietnicę treści i ruchu, obie iluzoryczne, lemingi zareagowały jednakowo żywiołowo :-D
Fun!
Nie znalazłem (stety, stety) szacunku dla towarzystwa Profesjonalnych Blogerów i Konsultantów SEO. Wydają mi się takimi samymi marketingowymi błaznami jak mój były dyrektor (ostrze korpo-gilotyny działa bezlitośnie zgodnie z prawem powszechnego ciążenia). Słysząc niekiedy opowiadania p. o biciu piany przez środowiska akademickie mam dokładnie taką samą opinie o uspołecznionych freelancerach. Zastanawia mnie tylko jedno: jeśli ja miałbym dla dobrego samopoczucia nadmuchiwać sobie z takim wysiłkiem swoje ego to z całą pewnością uważałbym to bezwzględnie za koszt uzyskania przychodu, w dodatku całkiem spory. W efekcie uznałbym to po prostu za nieopłacalne i rozważałbym przebranżowienie na np. ogrodnictwo albo zielarstwo. Przyjemne to i nagradzające, na kej-pi-aj znać się nie trzeba a ryzyko wyoutsourcowania do Indii prawie zerowe.
Nie był to jednak wieczór kompletnie stracony - wszak jako patologiczny optymista nie jestem w stanie niedostrzec jasnej strony! Koledzy z profesjonalnego grajdoła mają znakomite wizytówki i w tym względzie jest do czego równać. Ponadto garstka web developerów pozwoliła mi na przywrócenie zdrowego balansu między szpanem a szykiem.
No cóż, każdemu jego porno, nie trzeba być interdyscyplinarnym ;-)
PS. Marcowy Barcamp zapowiada się wyjątkowo nudno, za to nadchodzący koncert Róisín Murphy - wręcz przeciwnie. Hej przygodo.
5 comments | permalink | trackback | rss
10 Nov 2008
Niedzielne zakupy. Prawdziwa pełnia życia dla mas. Niedziela - najważniejszy dzień tygodnia, z powodu zakupów oczywiście. Tysiące szczęśliwych konsumentów ciągną w weekend do Blanchardstown co czyni drogę krajową nr 3 największym darmowym parkingiem w całym Leinsterze. Setki rozmaitych świątyń wita pielgrzymów obwieszczając radosną nowinę "Christmas sale now on!", setki uczynnych prawcowników z uśmiechem nr 10 recytują nieśmierteną frazę "How may I hełp you?", setki stoliczków w Makdonaldach i Burgerkingach czekają by godnie podjąć szanownych gości podczas ich sobotnio-niedzielnej duchowej strawy.
O tym, że nadchodzą święta zapomnieć nie sposób. Trzydziestosekundowe dżingle z głośników przypominają konsumentom (pleno titulo taka ich mać), że mają do wypełnienia misję niesienia szczęśliwości bliźnim poprzez bezrefleksyjne wypstrykiwanie się z kasy. Pamiętam coprawda, że zawsze w okresie przedświątecznym lecą te same piosenki, ale robienie z tego trzydziestosekundowych ścinków to nowość. Wszystkie są tak zajebiście jednostajne - dzink dzink dzink dzink, jadą renifery, bim bam bem bom bim bam bem bom odgrywają od końca gamę durową dzwony, "iiiits christmas tiiiiime" spełnia się wokalnie i konsumencko jakaś niewiasta. W kojącą moc tych piosenek trudno mi uwierzyć widząc bydło przy półkach sklepowych i wieszakach, mi zaś osobiście wzrasta ciśnienie do tego stopnia, że mam trudności z niesieniem przesłania radosnej i pokojowej konsumpcji, erm, znaczy się narodzin Chrystusa 2k lat temu z kawałkiem.
Szczególnie urocze są ozdoby, którymi przyodziane są z okazji zwiększonych obrotów centra handlowe. Drzewa iglaste, dmuchane lalki w kształcie pociesznego staruszka w czerwonym kubraczku, kulki śniegu wykonane z polichlorku winylu oraz wszechobecne, migoczące oświetlenie realizują pierwszą część zasady wzajemności - przygotowaliśmy Ci ładnie sklep to teraz zostaw u nas trochę siana. It's for children for fucks sake! Szczególnie ujęło mnie ustrojenie działu dla dziewczynek w jednej z dużych sieci z & w nazwie. Cały dział na różowo. Różowe ciuszki, buciki, ozdoby, kosmetyki, a także przybory kosmetyczne: zwierciadełko w różowej oprawce, różowy grzebyczek, różowa kokardka i spinka. Nie-różowe - wypad. Wszystko to, aby nasze dzieci były jeszcze bardziej zjebane i dało im się w przyszłości wcisnąć jeszcze więcej świątecznej radości. Think about children!
Po powrocie z szopingu czułem się niczym pewna królewna z recytacji Olbrychskiego: nieszczególnie wypoczęty. Z powodów powyższych, nie planuję pojawiania się w sklepach innych niż paśnik i wodopój aż do daty świąt właściwych, kiedy to globalny pierdolec ustąpi i pojawią się głosy jak to zajebiście udało nam się powstrzymać recesję. Wiwat!
add coment | permalink | trackback | rss
Ubuntu 8.10 Launch Party Dublin
31 Oct 2008
Kozica wylądowała, korki wystrzeliły. Właściwie to nie stało się nic wielkiego, bo zmiany nie niosą ze sobą rewolucji. Jedyne z czego mogę być zadowolony to wsparcie dla nieszczęścia zwanego modemem 3G w nowym Network Managerze, oraz CouchDB w repo. O ile modemy 3G dawało się w 8.04 obsłużyć przez pppd, to kompilacja Coucha dawała ostro popalić, w efekcie dopiero od kilku dni próbuję tej niezwykłej bazy danych.
Przyjęcie urodzinowe odbyło się jak zwykle w Longstone Pubie, gdzie ściągnęła większa część ILUG, Irish Ubuntu Users Group oraz Irish PHP Users Group, a także przypadkowa menelia ;-) Więc pogadaliśmy nieco o Ubuntu, pracy w małych firmach, dużych firmach, przeklinaniu w pracy, oraz zrobiliśmy rundę po odwiecznych świętych wojnach - Vi kontra Emacs, MySQL kontra Postgres, PHP kontra Ruby oraz lager kontra stout, przy czym w ostatnim przypadku wybitnie irytowała nas obecność miłośnika czerwonego wina ;-).
Na koniec imprezy czekając w kolejce do pomacania Open Moko przysłuchiwałem się rozmowie o Haskellu. Była ona na tyle interesująca, że szybko porzuciłem gadżetowe porno by przyłączyć się do rozmowy. Gość, który z niemałym zapałem opowiadał o programowaniu funkcjonalnym i silnej kontroli typów okazał się być wykładowcą z Trinity College. Ponadto zdradził się z szeroką znajomością języków programowania, co rusz popełniając dygresje w kierunku Prologa, Lispa, Scheme, Javascriptu, ML-a, Erlanga, Rubyego oraz wieszając psy na Javie i C#. Glenn Strong (zszedłem gdy usłyszałem nazwisko) ustawicznie podpuszczany przeze mnie i dwie inne osoby dał darmowy wykład z teroii języków i skonfrontował swojego ulubionego Haskella z praktycznie każdym aspektem programowania, począwszy od złożoności obliczeniowej, przez kontrolę typów, symulację TDD w compile-time, kontrakty, programowanie równoległe, domknięcia, na obiektowości, dziedziczeniu, polimorfiźmie i wzorcach projektowych kończąc. Był to fascynujący prawie-monolog, w którym udało mu się przedstawić języki funkcjonalne jako szalenie atrakcyjne. Znasz ten typ nawiedzonego Railsowca, który próbuje wyciągnąć Cię siłą z okowów ciemności do cudownego świata Rubyego, gdzie wszystko jest tak fajnie umowne? - Glenn to zupełnie inna bajka. Koncentracja treści była niekiedy gęsta jak smoła, ale zawsze na przejrzystej podbudowie teoretycznej, ze zdrowym dystansem i w kontekście wymagań systemu. Słowem, świetny nauczyciel i profesjonalista, nie jakieś tam dżejzes foken krojst bla bla muppet show Yeggy'ego. Szczególnie ujmujące jest to, że języki funkcjonalne odpuszczają programiście konieczność brnięcia przez imperatywny znój - tak przynajmniej udało mi się zrozumieć, a mówił bardzo wyraźnie, zwłaszcza jak na Irlandczyka, w szczególności po trzydziestym piątym browarze.
Pora chyba powrócić do przerwanej lekcji Erlanga, albo Haskella - wszystko jedno, póki zauroczenie trwa. ;-)
add coment | permalink | trackback | rss
Najpiękniejszy kawałek kodu jaki widziałem
13 Oct 2008
Może wydać się to śmieszne, że ludzie potrafią doświadczać zjawiska piękna w tak rutynowej czynności jaką jest programowanie. Ale robią to. Kiedyś, jeszcze na studiach, wielki szacunek wzbudził u mnie znajomy, który z ogromną pasją opowiadał o algebrze (pierścienie, ciała, alefy, przekształcenia izomorficzne) i podkreślał jej wewnętrzną harmonię, spójność, siłę oraz eww.. piękno. Dzisiaj poczułem się dokładnie w ten sam sposób oglądając przykład z mojej dziedziny.
Oto on (Javascript):
function main(links) {
for (var i=0; i<links.length; i++) {
links[i].onclick = (function(j) {
return function() {
alert(j+1);
}
})(i);
}
};
main(document.getElementsByTagName("a"));
Na pierwszy rzut oka jest on mało czytelny - ilość nawiasów właściwa dla programów napisanych w Lispie, więcej niż 4 wcięcia (argument K&R w przypadku języka C: jeśli potrzebujesz więcej niż 4 wcięć to znaczy, że z twoim programem jest coś nie tego), w dodatku w liniach 3 do 7 dzieje się coś magicznego. I to właśnie ta magia, gdy zrozumiana, jest esencją piękna.
Nie będę trwonił słów próbując ze słabym najpewniej skutkiem wyjaśnić co tak naprawdę wydarza się w tym zagnieżdżeniu. Dużo lepiej zrobił to Stuart Langridge w swoim wystąpieniu (w dodatku gość ma zabójczy akcent!). Gorąco polecam materiał video - to prawdziwy eye-opener, który pozwala dostrzec potęgę Javascriptu w ogólności, a Javascriptowych domknięć (closures) w szczególności. W dodatku przybliża on ideę programowania obiektowego opartego o prototypy (nie o klasy) oraz składowe prywatne i zaprzyjaźnione w obiektach Javascriptowych. Znający Pythona być może będą się ze mnie śmiać gdy wyznam, że nie potrafiłem sobie wyobrazić traktowania funkcji jako obiektu, a dokładniej konstruktora tego obiektu (niech żyje this!). Jakość nagrania nie zawsze pozwala czytać z obrazu rzutnika, więc warto podeprzeć się prezentacją w OpenDocument.
Pomimo, że przykład powyżej to jedynie marna funkcja (na codzień gardzę funkcjami nienależącymi do klas) z trywialną iteracją (na codzień gardzę programowaniem imperatywnym), to jednak anonimowe domknięcie wykonywane natychmiast i zwracające kolejne domknięcie jako delegata zniewala (mnie osobiście) swoją elegancją i siłą.
32 comments | permalink | trackback | rss
04 Sep 2008
Prawda, że mało śmieszne? Na regiszcze jest jeszcze mniej zabawnie ;-)
add coment | permalink | trackback | rss
GNOME na Qt? Po trupie mym.
15 Jul 2008
A 16 ton dynda na haku...*)
Spokojnie (slashdotted). Mark coś palnął, bo jest człowiekiem otwartym, pragmatykiem zorientowanym na wykonanie zadania. To, że fantazjuje na temat Qt jako zamiennika GTK+ wcale nie znaczy, że taka zmiana będzie miała miejsce. Mark myśli jak rasowy manager - jaki jest koszt rozwoju platformy, jaki byłby przyrost wydajności w przypadku użycia innego toolkitu, oraz jakie jest ryzyko utraty części developerów i koszt nabycia biegłości w Qt przez pozostałych, w końcu ile wyniósłby ROI tego całego zamieszania i czy w efekcie taka zmiana ma rację bytu - swoje zdolności strategiczne udowadniał nie raz. I chwała mu proszę szanownego towarzystwa za to. Niechaj tak sobie kombinuje. Nawet jeśli z tych kombinacji niewiele wynika to podnosi ciśnienie devom od GTK+ (Imendio, chapeau bas, oj tak; atsd świetna strona Immendian) - oddech konkurencji na plecach i pozytywna motywacja potrafią zdziałać cuda. A Qt w GNOME? Spokojnie - nic takiego się nie stanie, tutaj uprawia się jedynie politykę - dobrze jest zamieszać w garze raz na czas. Smacznego wszystkim życzę!
*) 16 ton - najmniej (czy aby?) spodziewana opcja w skeczach Monty Pythona.
PS. Właśnie zauważyłem, że komentarz #1 na /. czyni mój wpis nadmiarowym. W całości ;-)
7 comments | permalink | trackback | rss
04 Jul 2008
Dżizes kura, a ja się zastanawiam dlaczego się tak podle czuję. Normalnie skopałbym w mordę biednego, bezbronnego złoczyńcę.
Update 1215622418: Dziś wcale nie jest lepiej...
add coment | permalink | trackback | rss
Uniwersalne wyszukiwanie - PHP
10 Jun 2008
Przykład wyszukiwarki wałkowałem już kiedyś na tym blogu przy okazji rantu o Traitsach w PHP. Nie był on jednak rozpracowany zbyt dokładnie, w końcu służył tylko zilustrowaniu pewnego problemu.
Wyszukiwanie danych rozumiane jako dziura na tekst i przycisk "Znajdź" wydaje się być zagadnieniem dość prostym dopóki wiemy wśród czego szukamy (np. poprzez proste SELECT * FROM cars WHERE make LIKE ...). Szukanie bez określonego kontekstu w sposób jak powyżej wydaje się być jest zadaniem beznadziejnym...
W poszukiwaniu prostego i skutecznego indeksowania w aplikacji PHP doszedłem ostatnio do zadawalającego rozwiązania. A ponieważ uwielbiam podniecać się technikami obiektowymi - rozwiązanie to ląduje na jogu. Posługuję się w nim techniką Dependency Injection do indeksowania treści w locie przy operacji zapisu przez DAO. Obowiązkowo występować w nim musi implementacja wyszukiwarki (najprostsza możliwa, wykorzystująca PDO):
CREATE TABLE search (
class TEXT NOT NULL,
key INT NOT NULL,
content TEXT
);
CREATE INDEX search_content_idx ON search (content);
Schemat tabeli przechowującej poindeksowaną treść.
class SearchEngine {
private $pdo;
public function __construct(PDO $pdo) {
$this->pdo = $pdo;
}
public function update($class, $id, $text) {
$this->pdo->exec("DELETE FROM search WHERE class = '$class' AND key = '$id'");
$content = $this->pdo->quote($content);
$this->pdo->exec("INSERT INTO search (class, key, content) VALUES ('$class', '$id', '$content')");
}
public function find($text) {
$condition = array('TRUE');
foreach (explode(' ', $text) as $t) {
$t = $this->pdo->quote($t);
$condition[] = "content LIKE '%t%';
}
$condition = implode(' AND ', $condition);
$sql = "
SELECT class, key FROM search
WHERE $condition;
";
$stmt = $pdo->query($sql);
return $stmt;
}
}
Przykład implementacji wyszukiwarki. Algorytm szeregowania znalezionych obiektów realizujemy w klauzyli ORDER BY (pominięta dla czytelności).
oraz interfejs ISearchable:
interface ISearchable {
public function updateSearchEngine(SearchEngine $se);
}
Metoda update przyjmuje nazwę klasy, unikalny identyfikator obiektu (najczęściej klucz główny) oraz treść do zaindeksowania. Metoda find zwraca pary (nazwa_klasy, klucz_główny), w których szukana fraza została odnaleziona.
Załóżmy, że naszym przykładowym obiektem dziedziny modelu jest wpis na blogu reprezentowany przez klasę BlogPost. Obiekty tej klasy potrafią uaktualnić informację o sobie w wyszukiwarce dzięki implementacji interfejsu ISearchable, konkretnie indeksowaniu podlega tytuł, treść oraz tagi dotyczące wpisu.
class BlogPost implements ISearchable {
public $id, $title, $body, $tags;
// reszta implementacji klasy
public function updateSearchEngine(SearchEngine $se) {
$se->update(get_class($this), $this->id,
$this->title . ' ' . $this->body . ' ' . $this->tags);
}
}
Ponieważ wywoływanie metody updateSearchEngine za każdym razem, gdy zawartość obiektu się zmienia byłoby niepraktyczne, można zadanie powierzyć obiektowi DAO, który rozpozna instancję ISearchable i wykona na niej tą metodę. Do tego potrzebna jest drobna modyfikacja klasy DAO (zakładam, że jakąś już masz):
class DAO {
private $searchEngine;
public function save($o) {
... // stuff DAO normally does
if ($o instanceof ISearchable) {
$o->update($this->searchEngine);
}
}
}
Od teraz, za każdym razem, gdy będziesz utrwalać obiekt za pomocą DAO, będzie on aktualizował wyszukiwarkę informacjami dostarczonymi przez obiekt dziedziny.
Gdy już wszystko działa jak należy, możemy przystąpić do zrozumienia tej kooperacji :-)
Po pierwsze, tworzony jest centralny rejestr poindeksowanej treści. Po drugie, to obiekt dziedziny wie jaką treść (tj. które pola) powinien zaindeksować. Po trzecie, indeksowaniem i aktualizacją zajmuje się ten, kto ma władzę nad trwałością, czyli DAO.
Dążąc do uniwersalności tego rozwiązania, co obiecałem w tytule, wprowadźmy kolejną klasę, której obiekty będą indeksowane. W przypadku bloga dość naturalnie nasuwa się na myśl BlogPostComment.
class BlogPostComment implements ISearchable {
public $id, $blogPostId, $body, $author;
public function updateSearchEngine(SearchEngine $se) {
$se->update(get_class($this), $this->id, $this->body . ' ' . $this->author);
}
}
Nie zmieniając nic w implementacji wyszukiwarki możemy w ten sposób dodawać funkcjonalność wyszukiwania do dowolnego obiektu dziedziny zagadnienia.
Final remarks.
- Implementacja wspiera jedynie indeksowanie treści oraz wyszukiwanie obiektów zawierających ją. Nie wspiera natomiast prezentowania tej treści. Będziesz do tego potrzebował jakiegoś mechanizmu, który na podstawie zwróconej pary (nazwa_klasy, klucz_główny) powoła obiekt (lub wydobędzie treść bezpośrednio z bazy) i wyświetli odpowiednie pola w pożądanym formacie.
-
Implementacja w oparciu o formalny interfejs nie jest wcale obowiązkowa. Można to zrobić w szpanerskim stylu używając adnotacji - przykład używania AOP opisywałem przy okazji wywodu nad prawami dostępu. Adnotacja
@Searchablebędzie wyglądać niezwykle szykownie przed definicją klasy obiektu dziedziny :-) - Opisana implementacja samej wyszukiwarki nie jest w żaden sposób kompletna, czy optymalna. Jest ona uproszczona do granic możliwości, by przykład nadawał się do analizy. Algorytm szeregowania treści należy umieścić w klauzuli ORDER BY. Warto również zwrócić uwagę na redundancję powstającą w wyniku indeksowania treści. Nie jest ona niczym niewłaściwym dopóki nie modyfikujemy tabel obiektów dziedziny ręcznie, lub w jakikolwiek inny sposób z pominięciem DAO.
Miłej zabawy!
3 comments | permalink | trackback | rss
Zjeby z polskiej gleby
09 Jun 2008
Może i "normalne" wydaje się niektórym, że jak zostawisz samochód z uchyloną szybą to ci zwiną radio, a jak nie przypniesz rowera za ramę to zostanie ci tylko przednie koło. Ale nie mi. Bo ja proszę szanownego towarzystwa mieć z tym gównem nic wspólnego nie chcę. I całkiem skutecznie mi się to na baraniej wyspie udawało. Irlandczycy są przesympatyczni, uczynni, powiedziałbym wręcz poczciwi. Przejawów wandalizmu nie ma zbyt wielu, chyba, że mówimy o ziomalach z buraklandu. Na ulicach ludzie uśmiechają się do siebie, czasem nawet niezobowiązująco zagadują. Za wyjątkiem oczywiście chodnika przed Zagłoba Pub przy wschodniej części Parnell St. Tam, znajome mordy ogolonych na łyso troglodytów pytają spojrzeniem przechodniów czy nie chcieliby może zostać pobici. Nie, nie za zasługi - z przydziału raczej. Polskie wieśniactwo ma to do siebie, że przy byle okazji do ogólnonarodowego zjednoczenia pod biało-czerwonym sztandarem, odstawia menelskie biesiady. Często są to biesiady mobilne typu "flaszka w dłoń i prujemy mordy na całe gardło maszerując środkiem ulicy". W ten sposób polaczki pokazują ofcojepcom kto tu rzondzi. Nierzadko dodają sobie animuszu rozwalając śmietnik, który miał nieszczęście stanąć na ich drodze. Nie inaczej było po wczorajszym meczu. Żałość.
Dziś rano, zauważyłem, że jakiś głęboko zaangażowany patriota krzyczący poprzedniego wieczora "po-ska gola, po-ska gola" uprzyjemniał sobie dodatkowo czas szlachtowaniem scyzorykiem siodełka od mojego roweru. Ciekawa jest ta korelacja manifestowanej tożsamości narodowej z brakiem poszanowania własności. Kto wie, może gdybym sobie na tym siodełku nakleił banner "Jan Paweł II" to by ocalało... Swoją drogą, byłoby to dobre zobrazowanie tego, gdzie przeciętny Polak ma nauki dżej-pi-tu.
Jest mi autentycznie wstyd, gdy ktoś mnie pyta skąd jestem. Czuję się, jakbym naklejał sobie na czoło napis "burak". Oczywiście jest to odczucie zupełnie nieuzasadnione, ale niestety ludzie dla wygody lub z lenistwa posługują się stereotypami czy tego chcemy czy nie. Wprawdzie głupota nie ma narodowości, ale jakimś cudem tandem głupota+szkodnictwo jest symptomatyczny dla współplemieńców...
Żeby nie było tak cierpko - zabawna sytuacja z biura przy okazji rozmowy o językach:
PS. Tak, doskonale wiem o tym, że uogólnienia bywają równie krzywdzące co stereotypy, ale przynajmniej wiesz już jak się czuję.
gee, one comment! | permalink | trackback | rss
Napierdalaj dziecko z miłością
03 Jun 2008
Kochanowski! Do nogi! Będę cię napierdalał z miłością. Trzeba cię wychować gówniarzu, boś szkodnik i urwipołeć. Trochę dyscypliny ci się przyda, zasrańcu. Od razu ci się kręgosłup moralny wyprostuje jak trochę ciężkiej miłości zaznasz na dupsku!
Że też takich debili ziemia nosi...
A powiedz mi, Kochanowski, jak napierdalałeś swoje dzieci? Używałeś pasa czy ręki? A może sznura od żelazka? Bo moja ciotka lała swoje dziecko właśnie kablem od żelazka. Na dobrego człowieka wyrósł pewnie dlatego. A po czterech literach nakurwiałeś czy po nerkach też ci się zdarzyło? A otwartą dłonią w twarz za pyskowanie nigdy dzieciaka nie chlasnąłeś? Tak wychowawczo, raz tylko żeby się zamknął, dla jego własnego dobra. A co powiedz jak ojciec zleje smarka, który się w nowym dresiku na niedzielnym spacerku w drodze z kościółka na chodniku wyjebie? Może tak trzeba właśnie, to się łajza stąpać porządnie nauczy! A jak nie chce usnąć albo co gorsza buczy? Wknucić żeby spał jak normalni ludzie czy nie wknucić? Kochanowski, kundlu, powiedz mi jak należy bić z miłością niemowlaka? Pasem to chyba trudno, może zatem jakiś poradnik bicia dla młodych rodziców - Wytyczne dotyczące wychowawczego bicia niemowląt - brzmi nieźle!
Powiedz mi na koniec, ośle skończony, jak wielką miłość będę musiał ci okazać, abyś zmienił swoje postępowanie i wyrósł na porządnego człowieka?
Update 1212514307: Dzięki za ciekawą dyskusję w komentarzach. Już ich wystarczy, więc zwijam kramik. Jeszcze tylko cytat z przedmiotowego buraka, bo GW zamyka archiwa:
Rodzice muszą wychowywać i w ramach wychowania mogą karcić, także w formie klapsów. Ważne, by robić to z miłością i troską. Janusz Kochanowski, Rzecznik Praw Obywatelskich
PS. Nie, nie mam dzieci.
comments disabled | permalink | trackback | rss
Faszyści optymalizacji
02 Jun 2008
Większość kodu, który w życiu wytworzyłem wylądowała w koszu. Z różnych powodów. Najczęściej były to tylko prototypy, rzeczy pisane dla sprawdzenia "czy tak się da", kunsztowne acz kompletnie niepraktyczne bibeloty tworzone dla przyjemności, w końcu kod pisany dla samej nauki kodowania. Wszystkie powyższe mają jedną cechę wspólną - były z przeznaczenia tymczasowe. Jest jednak jeszcze jedna kategoria oprogramowania kompostowego - programy i biblioteki zbytnio zoptymalizowane pod kątem wydajności. Nie były one bynajmniej pisane jako tymczasowe rozwiązania, wręcz przeciwnie - miały przetrwać po wsze czasy (czyli do najbliższej zimy atomowej) jako wzór solidnej roboty inżynieryjnej. Niemniej, skończyły w koszu. Wszystkie, co do jednego. Nie ostało się żadne rozwiązanie optymalizacyjne.
Bo optymalizowały nie to, co trzeba. Stara zasada mówi, że optymalizować należy w pierwszej kolejności to, co optymalizować się opłaci najbardziej. A najbardziej czasochłonne nie jest odpytywanie baz danych czy web serwisów. Najbardziej czasochłonne jest samo tworzenie oprogramowania. Jeśli jakaś warstwa cache wprowadza dodatkowe utrudnienia w pisaniu programu (odpytywanie o czystość, sprawdzanie timeoutów, synchronizacja blokad) to optymalizacja ma zysk ujemny. Można się nie zgadzać twierdząc, że program pisze się raz, a będzie wykonywany z limesem w nieskończoności. Można, tylko że to nie prawda. Programu zazwyczaj nie pisze się raz. Program poprawia się latami. Program dostosowuje się do zmian i nowych wymagań. Developerzy przychodzą i odchodzą, a program nadal się zmienia. Niedowiarków niech przekona argument arytmetyczny. Hosting przyzwoitego serwera to koszt $300 miesięcznie, co daje ok. 0,012 centa za sekundę. Jeśli zamierzamy dzięki optymalizacji zaoszczędzić każdorazowo 500ms i algorytm zostanie użyty 1000 razy przez 1000 różnych klientów to właśnie oszczędziliśmy oszałamiającą kwotę $6. Przy czym oszczędność jest i tak pozorna, bo i tak nikt nam tych $6 nie zwróci.
Bo nikt nie potrafił ich poprawić. Każdy dodatkowy element programu to kolejna rzecz, o której musisz pamiętać podczas jego tworzenia. Ponadto, Twój kawałek kodu będzie najprawdopodobniej poprawiany później przez inną osobę. Biorąc pod uwagę, że oprogramowanie ze swej natury jest skomplikowane, a przeciętny człowiek może jednocześnie śledzić maksymalnie od 5 do 7 wątków, dodatkowe mechanizmy optymalizacyjne podnoszą prawdopodobieństwo pomyłki i zwiększają koszta naprawy błędów. Poza tym, kod optymalizujący jest najczęściej trudny, a...
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. Brian W. Kernighan
Bo nie nadążały za zmianami. Zmiany nadejdą - to jedyna pewna rzecz w inżynierii oprogramowania. Nigdy nie ma na nic czasu - to inny pewnik. Gdy już nadejdą, będziesz zwijał się jak w ukropie by dostosować swoją logikę biznesową do nowych wymagań. Jeśli pokusiłeś się o warstwę optymalizacji to będziesz musiał poprawić również i ją. W efekcie w moim kodzie przybywało swego czasu znaków //, gdzie "tymczasowo" wyłączałem obsługę jakiegoś bufora. Tylko nie oszukujmy się - nie jest to już optymalizacja a raczej obfuskatyzacja ;-)
Bo kosztowały za dużo. Dobrzy programiści to tacy, którzy swoje zadania kończą (i robią to w nie najgorszym stylu). Napisanie dobrej warstwy optymalizacyjnej jest możliwe, acz szalenie kosztowne. Trzeba przewidzieć możliwe kierunki zmian, uodpornić kod na zmianę liczności relacji, zadbać o problem aktualności cache, zapewnić synchronizację dostępu i ew. blokowanie, obsłużyć ekspirowanie zarówno bufora jak i blokad. To wszystko są wielkie tematy, na które współczesna informatyka nie daje jednoznacznych odpowiedzi. Nawet jeśli jesteś übermastahaka, który rozwala takie drobnostki w parę godzin, to nadal jest to parę godzin, które poświęciłeś na realizację nieistniejącej potrzeby zamiast na przybliżaniu się do kliknięcia checkboksa na swojej liście To do. A zaznaczone checkboksy to absolutnie jedyna rzecz, jaką management chce uzyskać od zespołu programistycznego. Za przewóz pszczół luzem nikt nie płaci, podobnie za puste checkboksy.
Bo zdrowy rozsądek to jeszcze nie optymalizacja. Czy napisanie algorytmu populującego strukturę drzewiastą tak, by nie wykonywać tylu zapytań do bazy, ile w drzewie węzłów można nazwać optymalizacją? Czy prywatny cache dla wyniku procedury składowanej lub web serwisu, czyszczony przy każdym requeście http jest mechanizmem optymalizacyjnym? Czy wielokolumnowy indeks albo ograniczenie ON DELETE CASCADE to optymalizacja? Nie. To najzwyklejszy zdrowy rozsądek, podobnie jak w przypadku tak oczywistym jak INT dla klucza surogatowego. I jasne jest (o ile ktoś nie spał na wykładach), że tak powinno być zrobione od początku.
Faszystów optymalizacji można spotkać na każdym kroku. Dość przejrzeć kilka portali tematycznych w dowolnym znanym języku - im rozleglejszy temat tym więcej ekspertów, którzy chętnie zalecą "usprawnienia". Szczególnie wdzięcznym przykładem jest rzekoma przewaga MySQL-a nad Postgresem. Faszyści optymalizacji nie rozumieją najczęściej takich pojęć jak transakcja czy MVCC, stąd s/n bliski zeru. Kolejny konik faszystów to łańcuchy tekstowe ujęte w apostrofy versus ujęte w cudzysłowy. Tu zysk optymalizacji obliczony w sposób jak powyżej jest jeszcze zabawniejszy. Następny dyżurny temat "specjalistów" to narzut wprowadzany przez programowanie obiektowe. Przykłady można mnożyć.
Faszyści optymalizacji zazwyczaj jeszcze nie pracują lub pracują na szeregowych stanowiskach, często wyróżniają się wiekiem. Nie to, żebym czuł z ich strony jakieś zagrożenie, ale hałas i hype, który tworzą wokół optymalizacji może się niektórym wydawać czymś istotnym. Pamiętam swoje gigantyczne zaskoczenie i niedowierzanie, gdy usunięto moje procedury buforujące. Wtedy, rozumując szybciej == lepiej miałem kierownika projektu za osobę niespełna rozumu, a wręcz szkodnika. Teraz jest to dla mnie jasne: optymalizujesz? - zajmij się lepiej robotą.
PS. A poza tym uważam, że Kartaginę należy spalić ;-)
3 comments | permalink | trackback | rss
Wiele słów, zero treści
01 Jun 2008
underflow n. – A condition that can occur when the result of a floating-point operation would be smaller in magnitude (closer to zero, either positive or negative) than the smallest quantity representable.
add coment | permalink | trackback | rss
Bluetooth spamtool
30 May 2008
Właśnie miałem skasować bo już mi to nie potrzebne, ale pomyślałem, że blog to taka wygodna forma backupu ;-) Narzędzie do "prowadzenia akcji promocyjno-informacyjnych" za pomocą Bluetooth. Odpuszczając sobie eufemizmy, jest to zwykła spamownica wysyłająca losowy plik ze wskazanego katalogu do każdego nieboraka znajdującego się w pobliżu. Dodatkowo prowadzi ewidencję obdarowanych odbiorców by nie wysyłać więcej niż jednego pliku do tego samego urządzenia.
Z całą pewnością nie jest to bashopisarstwo najwyższych (ani też tych nieco niższych) lotów. Do pracy wymaga uprawnień do zapisu w /dev/rfcomm1, co zostało tu zaprotezowane poprzez użycie gksu. Można nadsyłać poprawki - niech się ostaną w komentarzach na cudzy użytek.
#!/bin/bash
db=spamtool.sqlite
dir=$1
[ "$dir" == "" ] && dir=`zenity --file-selection --directory`
yes | zenity --progress --pulsate --text="Looking for Bluetooth devices in range" --title="Scanning" --auto-close &
btdevs=`hcitool scan | grep -v Scanning | awk '{print $1}'`
killall yes
total=0
steps=`echo -e "$btdevs" | wc -l`
step=$(( 100 / ( $steps + 1) ))
exec 3> >(zenity --progress --title="Sending files" --auto-close)
for btdev in $btdevs
do
total=$(( $total + $step ))
echo $total >&3
sent=`sqlite3 $db "SELECT count(*) FROM sent WHERE client = '$btdev'"`
if [ "$sent" != "0" ]
then
echo "Skipping client $btdev"
else
set -- $dir/*
length=$#
random_num=$(( $RANDOM % ($length + 1) ))
file=${!random_num}
dev="/dev/rfcomm1"
ch=`sdptool browse $btdev | grep -A 4 'OBEX Object Push' | grep Channel | head -n 1 | awk '{print $2}'`
if [ "$ch" != "" ]
then
gksu "rfcomm bind $dev $btdev $ch"
echo "Sending $file to $btdev on channel $ch via $dev"
remote_file=`basename "$file"`
ussp-push $dev "$file" "$remote_file"
if [ "$?" == "0" ]
then
sqlite3 $db "INSERT INTO sent (client, file) VALUES ('$btdev', '$file')"
total=$(( $total + 1))
fi
gksu "rfcomm release $dev"
fi
fi
done
sleep 1
echo 100 >&3
exec 3>&-
zenity --info --text="Sent $total files to Bluetooth clients" --title="Sending results" --timeout 5
A jefcze jedno, by zaoszczędzić trudu. Próbowałem bez większych sukcesów paralelizować (prawda że piękne słowo?) algorytm poprzez wykonanie w tle wnętrzności pętli z użyciem wiele urządzeń /dev/rfcommX jednocześnie. Nie znam przyczyn niepowodzenia - może fizyczne urządzenie Bluetooth może być przypisane tylko do jednego urządzenia logicznego...
add coment | permalink | trackback | rss
Gdzie jest apostrof na klawiaturze telefonu?
28 May 2008
add coment | permalink | trackback | rss








