Tragiczny kod widgetu AdTaily.

Kiedyś, gdy AdTaily startowało (zamknięta beta), a ja miałem piękny i validujący się się XHTML 1.0 Strict na blogu, pierwszą rzeczą, na którą zwróciłem uwagę po zainstalowaniu widgetu, była była niezgodność z XHTML. Małe, a drażni, więc zgłosiłem błąd. Samemu nie udało mi się poprawić – primo, bardzo słabo znam JS, secundo, ok. 20 kB to jednak sporo do przeglądania.

O całej sprawie zapomniałem, aż do wczoraj, gdy niezależnie dwóm osobom (KosciaK i Tomasz Fiedoruk), o których wiedziałem, że powinny mieć umieszczony widget, napisałem, że wszystko fajnie, ale widgetu nie widzę. Winnym okazało się AdTaily, a raczej tragiczny kod ichniego widgetu, ale po kolei…

Pierwszy był KosciaK, u którego zwróciłem na fakt braku widgetu przy okazji wpisu o – ładnym skądinąd – nowym szablonie na blox. Ponieważ u mnie i na kilku innych blogach (bloxowych i nie), na tej samej przeglądarce, widget jest widoczny, myślałem, że chodzi o szablon właśnie, tym bardziej, że jakieś magie z jquery się tam dzieją.

Jakoś po stwierdzeniu, że na Operze widzę, na debianowej wersji Firefoksa, czyli Iceweasel w wersji 3.0.6 nie widzę, na Icecat (czyli w pełni wolnej wersji Firefoksa) 3.5.3 też nie widzę, a z kolei on u siebie widzi, po pobieżnym przyjrzeniu się problemowi, z braku czasu i pomysłów przeszliśmy nad tym do porządku.

Niewiele później zaczęło się na blipie narzekanie na sytuację z reklamami, co skłoniło mnie do stwierdzenia, że ciężko mieć reklamy, jak się nie ma widgetu. Tym razem chodziło o dwie strony, jedną bez fajerwerków w kodzie – jak twierdził autor – oraz, drugą, w której od biedy można by czegoś po stronie kodu szukać. Po stronie kodu strony niczego nie udało się znaleźć, więc podejrzenie padło na system operacyjny, jako jedyną część wspólną.

Po chwili do niedziałających przeglądarek dołączył Konqueror na moim systemie, oraz Iceweasel na systemie kumpla. Z kolei oficjalne buildy Mozilli wyświetlały wszystko jak należy. Także u mnie. Sytuacja bardzo ciekawa, więc postanowiłem zagadkę rozwiązać, tym bardziej, że to może jakiś błąd w Debianie (któraś z bibliotek czy coś takiego).

Po chwili zabawy z diffowaniem plików i kopiowaniem po kawałku oficjalnego builda do katalogu z Icecat okazało się, że „winnym” jest extra user agent. Cudzysłów jak najbardziej uzasadniony, bo tak naprawdę winny jest widget AdTaily. Fragment kodu:

parseFloat(b.substring(a+this.versionSearchString.length+1))},dataBrowser:
[{string:navigator.userAgent,subString:"Chrome",identity:"Chrome"},
{string:navigator.userAgent,subString:"OmniWeb",versionSearch:"OmniWeb/",identity:"OmniWeb"},
{string:navigator.vendor,subString:"Apple",identity:"Safari",versionSearch:"Version"},
{prop:window.opera,identity:"Opera"},
{string:navigator.vendor,subString:"iCab",identity:"iCab"},
{string:navigator.vendor,subString:"KDE",identity:"Konqueror"},
{string:navigator.userAgent,subString:"Firefox",identity:"Firefox"},
{string:navigator.vendor,subString:"Camino",identity:"Camino"},
{string:navigator.userAgent,subString:"Netscape",identity:"Netscape"},
{string:navigator.userAgent,subString:"MSIE",identity:"Explorer",versionSearch:"MSIE"},
{string:navigator.userAgent,subString:"Gecko",identity:"Mozilla",versionSearch:"rv"},
{string:navigator.userAgent,subString:"Mozilla",identity:"Netscape",versionSearch:"Mozilla"}],
dataOS:[{string:navigator.platform,subString:"Win",identity:"Windows"},
{string:navigator.platform,subString:"Mac",identity:"Mac"},
{string:navigator.platform,subString:"Linux",identity:"Linux"}]};

Jak widać, ktoś w AdTaily postanowił wymyślić koło od nowa i napisał własne rozpoznawanie przeglądarki i systemu operacyjnego. Na dodatek niezupełnie działające, bo nie obsługuje – z szybko przychodzących mi do głowy – Iceweasel i Icecat, zapewne także Swiftfox, Arora (nie wiem, jak się przedstawiają). W statystykach pewnie wychodzi, że nikt Konquerora nie używa, bo jeszcze nie widziałem by Konqueror się „KDE” przedstawiał (a z racji tematyki mam trochę wejść od użytkowników Konquerora). Po zmianie ciągu Icecat na Firefox we wspomnianym user agent extra version oczywiście widget wyświetla się tam, gdzie wcześniej się nie wyświetlał.

Zagadką dla mnie pozostanie, czemu pisana jest własna obsługa rozpoznawania przeglądarki (widget o 1kB większy, a i tak nie rozpoznaje wielu przeglądarek), czemu dzieje się to po stronie widgetu (a nie wysyłany jest cały user agent na serwer, jeśli to do celów statystycznych, a nie wyświetlania). O paru skrótach typu „Apple = Safari” nie wypowiadam się, bo zwyczajnie nie znam.

Ewidentnym błędem – jeśli chodzi o wyświetlanie – jest brak fallbacku do jakiegoś sensownego defaultu w przypadku nierozpoznania (a przecież engine przedstawiał się normalnie), nie tylko jest to sprzeczne z działaniem w każdej przeglądarce szerzej o kampanii Anybrowser, ale przekłada się na brak widzialności widgetu na niektórych stronach (ale nie zawsze! u mnie na blogu był widoczny bez problemu) u wszystkich użytkowników Debiana, korzystających z dostępnych domyślnie w dystrybucji przeglądarek. Oraz u wszystkich korzystających z podrasowanych/nietypowych przeglądarek.

Czemu tak było? Czy były inne skutki braku rozpoznania (np. nie zliczanie kliknięć w statystykach kampanii od nie rozpoznanych przeglądarek, gdy widget był widoczny)? Nie mam pojęcia, nie znam na tyle JS, by to wyjaśnić. To JS, więc kod jest dostępny, znających się zachęcam do obejrzenia.

Jakie jest rozwiązanie? Szybkie i brzydkie – dodanie brakujących przeglądarek w widgecie (znowu spuchnie, nadal nie wszystko będzie obsługiwane). Ładne – przepisanie widgetu, który nie tylko ma ww. problem, ale także nie jest widoczny z sieci Orange (mało ludzi zgłaszało to jako bug, więc nie spodziewałbym się w najbliższym czasie poprawienia tego), jest napisany w taki sposób, że jego wywołanie rozwala XHTML 1.0 Strict. Oczywiście rozwiązanie ładne będzie wymagało nakładów finansowych, ale biorąc pod uwagę, że nie jest to pierwsza około JSowa wpadka w ostatnim czasie, może warto nawiązać współpracę z kimś, kto takie rzeczy umie? Przeprojektowanie serwisu teraz będzie łatwiejsze niż później, podobnie zmiany w kodzie widgetu…

Temat (braku) bonusów za wynagrodzenia już poruszyłem na flakerze. Trochę inna tematyka, ale polecam lekturę wpisu No more free bugs. Z mojej strony to ostatni zgłoszony (za free) błąd. Co prawda dla mnie to (i szukanie błędów, co robić pewnie będę nadal, i ogólnie reklamy) zabawa, ale czemu mam odbierać chleb zawodowcom (przynajmniej tym od błędów i kodowania; reklamodawcy niech nie liczą na względy)?

Własna paczka z Javą w Debianie.

Kosciak coś narzekał na aktualizacje Javy w Ubuntu, więc dla tych, którzy mają podobny problem, a chcą nową Javę, szybki przewodnik po tworzeniu własnej paczki z Javą (JRE) dla Debiana (powinno działać dla Ubuntu, ale nie testowałem).

Co jest potrzebne? Dostęp do internetu, przeglądarka, zainstalowany pakiet java-package.

Wchodzimy na stronę Suna z pobieraniem Javy SE. Wybieramy pobieranie najnowszej wersji Java SE Runtime Environment (JRE). Klikamy Download.

Wybieramy wersję dla naszej platformy (jak Linux 32 bit, to po prostu Linux), akceptujemy licencję. Następnie pobieramy plik z rozszerzeniem .bin i zapisujemy go na dysku.

Gdy skończy się pobierać, wchodzimy do katalogu, w którym go zapisaliśmy i wydajemy polecenie:

make-jpkg pobrany_plik

Odpowiadamy na pytania o wersję i akceptujemy licencję. Po chwili (i paru komunikatach) powinniśmy otrzymać gotowy plik .deb z najnowszą Javą, gotowy do eleganckiej instalacji (jak każdy inny pakiet .deb).

Jeśli ktoś zamierza korzystać do zastosowań związanych z kryptografią, to warto przeczytać opis, jak zrobić nielimitowaną siłę szyfrowania w Javie.

Jeśli w Ubuntu wyglądało by to inaczej, to proszę o informacje/poprawki.

Cenzura w sieci.

Niedawno z niepokojem przeczytałem artykuł o „filtorwaniu i blokowaniu” polskiego internetu. Pomysł blokowania nie jest nowy – chodzi o zablokowanie części ruchu, co w ten czy inny sposób jest robione od dawna – jednak tym razem nie chodzi o aspekty techniczne (jak np. blokada ruchu charakterystycznego dla wirusów i trojanów czy spamu), tylko o blokadę po treści.

Zawsze, gdy widzę konieczność nadzoru z zewnątrz, zamiast odpowiedzialności osoby publikującej treści (i skutecznego jej ścigania), odnoszę wrażnie, że chodzi o wielką ściemę. Taka kontrola po pierwsze niesie ze sobą duże ryzyko nadużyć i korupcji (a jeśli chodzi o neutralność nie ufam żadnej, ani polskiej, ani nawet unijnej instytucji, nie mówiąc o różnych firmach czy ich związkach). Powodów nie trzeba daleko szukać – choćby delikatna manipulacja przez zamieszczenie tłumaczenia, które tłumaczeniem nie było może dawać obraz podejścia instytucji.

Dodatkowo, trzeba zwrócić uwagę na sprytne argumenty przy ograniczaniu wolności i zastraszaniu zwykłych ludzi. W przypadku wszechobecnych kamer itp. rolę tę pełnią terroryści (IMO terrorysta zagraża bardziej politykom, niż szaremu obywatelowi, no i jakże jest medialny). Trudno zastraszyć obywatela terrorystą w sieci, więc sięgnięto po co? Oczywiście po dzieci i pedofilię. Problem, który moim zdaniem spokojnie można by skutecznie ścigać bez cenzury, ale czy tak naprawdę instytucjom państwowym zależy na czymś innym niż tylko na zdobyciu społecznego przyzwolenia na cenzurę, za którym pójdą uregulowania prawne (i technologiczne) pozwalające na cenzurowanie czegokolwiek? Wątpię. Rząd boi się ludzi i informacji, których nie kontroluje, a opór przeciw ograniczeniu wolności łatwo będzie negować zarzucając wspieranie pedofilii każdemu, kto się na cenzurę nie zgodzi (argument emocjonalny, z którym trudno polemizować). Albo się mu prewencyjnie zrobi kontrolę (przecież na pewno ma treści, bo ich broni!) i zabierze na rok czy dwa sprzęt komputerowy. W państwie prawa takie rzeczy się zdarzają, przykład niżej.

Drugim krokiem, po wydzieleniu różnych rodzajów treści i wprowadzeniu możliwości ich filtrowania, jest oczywiście wprowadzenie opłat za dostępy do określonych treści czy usług. Mając tak piękne narzędzie lobby producentów rozrywki na pewno będzie dążyło do wymuszenia na państwie „ochrony” swoich interesów, a Internet, z wolnego medium dołączy do mediów kontrolowanych przez państwo. Nierealne? Biorąc pod uwagę ostatnie działania w sprawie odsiebie.com (dead link, domena przejęta), nie mam takiego wrażenia. Państwo używa siły (w stosunku do człowieka, z którym jak najbardziej możliwy był dialog, z tego co czytałem), nadużywa władzy i to tylko w sprawie tej jednej firmy – firm hostingowych jest wiele, o podobnym charakterze – przynajmniej kilka. Tylko pewnie inne nie próbują nawet współpracować w zakresie ochrony praw autorskich i pobierają opłaty…

Oczywiście natura nie znosi próżni, więc im silniejsze działania w stronę cenzurowania, tym silniejsze sięganie po różnego rodzaju narzędzia omijające cenzurę. Nie ma się co oszukiwać, przestępcy będą z nich korzystali jako pierwsi (zarówno z nakładek na istniejący Internet, jak i z różnych projektów tworzących w różny sposób zdecentralizowane sieci). Niestety, zwykły człowiek chcący walczyć aktywnie z cenzurą w sieci, musi mieć świadomość tego, że nie tylko do zacnych celów jego działalność będzie wykorzystywana (tak jest, jeśli ktoś uruchomi węzeł tora, to nie tylko do omijania chińskiej cenzury będzie on wykorzystywany). Ale IMO za wolność warto zapłacić nawet tę cenę, jaką jest ułatwienie działań przestępcom.

A wszystko dlatego, że rządy boją się własnych obywateli i aktywnie (oraz całkiem niepotrzebnie) ingerują w rynek… Nie wiem czemu, ale kłóci mi się to z wizją demokracji.