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

Opera mini 5 beta – wrażenie.

Niby moja Nokia 3110c nie obsługuje (tak twierdzi przy próbie instalacji), ale install anyway i po chwili było to „cudo” na moim telefonie. Już na wstępie widać, że faktycznie projektowane jest toto na większe wyświetlacze – przedstawiło się mniej więcej pera min, bo zabrakło miejsca na ekranie.

Opcji w porównaniu z wersją 4 bardzo mało, ale niby jest wszystko. Podejście do działania inne – wersja 5 pokazuje całą stronę i pozwala powiększyć (zoom) wybrany obszar. Dzięki temu niby jest bardziej naturalnie (czyli jak na dużym ekranie), ale mi się bardziej podobało podejście z wersji 4, czyli dostosowanie do komórki (zoom zawsze mnie drażnił). Nie ma (nie znalazłem) mojego ukochanego przewijania blokowego – jest tylko ta śmieszna strzałeczka i po linii trzeba – niewygodne.

Wersja 5 ma trochę nowych ficzerów. Szybki ich przegląd: miniaturki na małym ekranie to IMHO pic na wodę, fotomontaż – zero użyteczności. Speeddial z wersji 4 (gwiazdka, cyfra) był IMO wystarczający. Manager haseł – nie zamierzam korzystać. Przeglądanie w zakładkach – no to może ma sens, tylko niestety u mnie przy próbie otworzenia drugiej zakładki przeglądarka się wysypała (ale to beta i niesupportowany sprzęt, więc się nie gniewam). Drugi raz nie próbowałem.

Działa szybko (na oko szybciej niż 4), ale zajmuje 350 kB miejsca w pamięci flash telefonu (poprzednia wersja ok. 160 kB). Podsumowując – zobaczę wersję stabilną i mam nadzieję, że dostosują ją do 3110c, ale w tej chwili bardziej podoba mi się czwórka. Na tę chwilę pora odzyskać utracone 350 kB.

Iceweasel 3.5 w Lenny (failed).

W związku z tym, że Mozilla zaleca przejście na wersję 3.5 Firefoksa, postanowiłem sprawdzić, na ile skomplikowana będzie instalacja tej wersji w Lennym. Dla niecierpliwych od razu informacja – nie udało się, a opis całości – poniżej.

Ku mojemu zdumieniu Iceweasel zarówno w testing, jak i sid jest w wersji 3.0.x, a wersja 3.5 dostępna jest dopiero w experimental. Na blogu developera w komentarzach są doniesienia, że udało się na Lennym i działa OK, więc – czemu nie?

Stwierdziłem, będę się trzymał wersji z oficjalnych repozytoriów, czyli pobiorę źródła iceweasel i xulrunner-1.9.1.1 z experimental i zrobię backport (czyli tradycyjnie). Przy okazji drobne posiłkowanie się pakietami z testing/sid, głównie do spełnienia zależności do budowy (na pewno libnspr4-0d, libnspr4-dev, libsqlite3-dev, libsqlite3-0). Źródła xulrunner-1.9.1.1 plus zależności do ich budowy to ponad 100 MB, ale mamy miejsce, mamy czas… Niestety, pod koniec kilkudziesięciominutowej kompilacji w którymś z plików cpp pojawiły się błędy i xulrunner-1.9.1.1 się nie zbudował.

Prawie dałem za wygraną, gdy dostałem wiadomość, że wystarczy apt-get -t experimental iceweasel. No niezupełnie, gdyż iceweasel: Wymaga: xulrunner-1.9.1 ale nie zostanie zainstalowany. Jednak zachęciło mnie to do dalszego działania – skoro dobrzy ludzie twierdzą, że się da, to pewnie się da. 😉

Po bliższym przyjrzeniu okazało się, że wystarczy doinstalować libasound2 libhunspell-1.2-0 libnss3-1d oraz libstartup-notification0 w wersji z testing. Pierwsze trzy poszły gładko. Zadziwiająco gładko. Za to ostatni zażyczył sobie także libxcb-aux0, libxcb1 w wersji z testing.

Na próbę ich (właściwie libxcb1) instalacji system zareagował dość żywiołowo, bo Po tej operacji zostanie zwolnione 1534MB miejsca na dysku, przy czym w grę wchodziło praktycznie całe xorg, openoffice, icedove, iceweasel

Stwierdziłem, że nie ma sensu tak sobie rozgrzebywać systemu na noc, lepiej obejrzeć film… Chyba jednak stable średnio się nadaje na tego laptopa, jeśli chce się korzystać tylko z wolnego softu i na dodatek z nowych. Z fglrx jakoś miałem stable (plus trochę backportów własnej produkcji) przez ostatnie dwa lata, ale teraz po prostu zrobię w chwili wolnej upgrade do testing/sid. Będzie nowy xorg, działające 3D, łatwiejsze dodawanie nowych wersji, KDE 4.3… Z drugiej strony stable po prostu działa, a iceweasel chociaż 3.0.x, to połatany (ciekawe jak długo…).

P.S. Tak, wiem, mogę doinstalować wersję Firefoksa bezpośrednio od Mozilli. Nie wykluczam, że tak zrobię.