yashke.com

Archiwum: July, 2006

Dodaj do ulubionych

Friday, July 21st, 2006

Robota wre, jesteśmy w trakcie opracowywania podstawowych funkcjonalności serwisu oraz kodowania tychże. Jednym z ficzerów jest dodawanie do ulubionych z jednoczesnym tagowaniem. Zasadniczo rozwiązanie składa się z linku “dodaj do ulubionych”, który kliknięty rozwija formularz, do którego można wpisać jakieś tagi - w tym wybrać tagi proponowane przez stronę. Po kliknięciu na przycisk (submit) “dodaj” formularz bez przeładowania przesyła tagi do odpowiedniego kontrolera i zmienia link na “usuń z ulubionych”. Oczywiście usunięcie z ulubionych również odbywa się przy użyciu AJAXa, więc można sobie na zmianę dodawać i usuwać z ulubionych.
Dodaj do ulubionych
Rozwiązanie tego problemu w Railsach jest dosyć proste. Tworzymy odpowiednie akcje w jakimś kontrolerze, które odpowiedzialne będą za dodawanie i usuwanie z ulubionych, wyświetlają OK (w przypadku przesyłania AJAXem) albo przekierowują na poprzednią stronę (gdy przesyłamy z przeładowaniem przeglądarki) - RoR ma przy tym przyjemne rozwiązanie w postaci funkcji redirect_to, której wystarczy zaaplikować symbol :back - warto przy tym pamiętać, że framework czerpie informację o ostatniej stronie nie z sesji (co byłoby rozwiązaniem najbardziej funkcjonalnym), a z nagłówka Referer (przynajmniej wywnioskowałem z jednego komunikatu o błędzie, który raz mi się przypadkowo pojawił).

W sekcji View odpowiedniej akcji powinniśmy utworzyć odpowiednie linki do poszczególnych zadań - wiadomym przy tym jest, że “dodaj do ulubionych” i “usuń z ulubionych” pojawiają się naprzemiennie. Linkowi “dodaj do ulubionych” przypisujemy efekt script.aculo.us o nazwie blind, rozwijający ukryty formularz (w przypadku wyłączonego JS formularz byłby po prostu widoczny, a link “dodaj…” nic by nie robił). Można przy tym skorzystać z helpera: link_to_function, ja jednak uznałem za wpisanie linku z poziomu HTML’a. W przypadku usuwania z ulubionych link należy wykierować zarówno w funkcję, jak i do odpowiedniej akcji kontrolera, inaczej rozwiązanie padnie na przeglądarkach bez JS.

Sam formularz z tagami również wysyłamy przy pomocy AJAXa, można przy tym skorzystać z gotowca form_remote_tag, którego oczywiście nie stosuję, bo nie potrafię w nim przypisać odpowiedniego URLa do Ajax.Request. Warto przy tym wspomnieć o bajerkach Prototype’owych, które właściwie odwalają za nas większość roboty - Form.serialize “ładuje” wszystkie dane z formularza do ciągu kodowanego tak jak adresy URL, przez co możemy z łatwością przesyłać dane metodą POST; onSuccess, onFailure umożliwiają przypisanie odpowiednich funkcji w razie powodzenia czy niepowodzenia. W razie powodzenia przy wysyłaniu formularza zwijamy tenże i zmieniamy link na usuń z ulubionych. Natomiast gdy akcja się nie powiedzie to wysyłany jest alert, że coś nie gra. Gdy usuwamy z ulubionych to po prostu zmienia się link, bo formularz do tagowania cały czas jest w odpowiednim miejscu, tylko ukryty.

Ostatnim zadaniem, które jeszcze czeka na realizację jest zgadywanie co użytkownik chce w formularzu wpisać (autocomplete, prawdopodobnie rozwiązanie ułatwi script.aculo.us) oraz dodawanie tagów z listy proponowanych. Lista proponowanych tagów jest tworzona na podstawie tagów, które już zostały już przypisane do tekstu i tagów, które użytkownik dodał do innych tekstów.

37signals czyli linki na dziś

Friday, July 21st, 2006

CSS Browser Selector - w środę Ryan z 37signals pisał, że fajnie by było mieć możliwość bezpośredniego odwoływania się do poszczególnych przeglądarek z poziomu CSSa. Dzisiaj jest już skrypt JS który to załatwia.

Jeff Bezos inwestuje w 37signals - Jeff to facet od Amazonu. To z całą pewnością niezły deal dla obu stron

Search 2.0 vs Traditional Search - przegląd wyszukiwarek opartych o siłę społeczności

Załączamy kopertę - więc odpowiedz

i na koniec strip Daily od Jacka Karaszewskiego - jak zawsze fonomenalny

Kilka porannych linków

Thursday, July 20th, 2006

Validator po polsku - Puck przetłumaczył validator W3C. Tego linka postanowiłem wykopać.

Kółko i krzyżyk w HTMLu - da się :) tam nie ma śladu JavaScripta. Autorem (z nadmiarem wolnego czasu) jest Grzegorz Borowiak.

Ning - generator serwisów Web2.0 (sic!)

imagination cubed - pracujesz zdalnie i chcesz coś komuś szybko naszkicować? Rysunek często zastępuje 200 słów. Imagination Cubed to wirtualna biała tablica.

Popularność nowej fali serwisów społecznościowych w Polsce

Wednesday, July 19th, 2006

Mamy polskie Web 2.0 – powstała nowa fala polskich serwisów bazujących na sile społeczności. Sprawdźmy więc jak ta nowa fala jest odbierana przez masy. Popularność badam przy użyciu rankingów Alexy. Większość serwisów wpisuje „z głowy”, podpierałem się też listą opublikowaną na antyweb.pl.

Digg’o podobne
Wykop.pl Gwar.pl Altf4.pl

Jak widać Wykop zdecydowanie wygrywa w swojej kategorii. Wygrywa bo był pierwszy, bo szybko „polubił się” z lokalną blogosferą i – przede wszystkim - dlatego, że wykorzystuje dobry pomysł twórców Digga w sposób – powiedzmy – najbardziej zbliżony do oryginału.

Społeczności
Grono.net Spinacz.pl Epuls.pl Biznes.net Goldenline.pl
Wrzuciłem do jednego worka tzw. społeczności rozrywkowe (to określenie wydaje mi się lepsze niż „społeczności dla małoletnich”) i społeczności profesjonalne. Może to budzić sprzeciw bo w końcu po to buduję się społeczność profesjonalistów, żeby „odseparować pokemony” – czyt. „pozbyć się użytkownika masowego”. Wyjaśniam moje postępowanie: wszystkie te serwisy oferują podobne funkcjonalności – pozwalają tworzyć sieci znajomości, wizualizują relacje oraz wymieniać opinie i wiedzę na forach tematycznych.

Zwycięstwo grona całkowicie nie dziwi – znowu zadziałało prawo pierwszego, do tego dochodzi nietypowa promocja (ta cała pseudoelitarność). Epuls to centrum masowej, internetowej rozrywki, nie zagłębiałem się w funkcjonalności tego systemu, ale z moje „rzutu okiem” wynika, że jest tam wszystko co potrzebne by budować społeczność plus mechanizmy wspierające zawieranie znajomości (podgląd co kto robi w serwisie, kto się ostatnio zalogował) plus cukierkowa, pixelowa grafika i to wszystko zapewnia poparcie mas.

Dziennikarstwo
Ithink.pl wiadomosci24.pl reporterzy.pl eioba.pl
Serwisy nowe stąd popularność niewielka, kształtująca się nam niej więcej tym samym poziomie. Jestem pewny dalszych skoków popularności przynajmniej dwóch z nich – wiadomości24 i ithink – oba wypracowały lub wypracowują spójną formułę prezentacji wygenerowanego przez użytkowników contentu, do tego promują użytkowników i są w miarę przejrzyste.

Film, zdjęcia, dźwięki
filmy.monigo.com patrz.pl video.i123.pl videosift.pl fotosik.pl
Serwisy podzieliłbym na dwie podkategorie – te które hostują wgrywane pliki i te które działają jako swojego rodzaju filtry w oparciu o inne serwisy. Z wykresu wyraźnie widać, że konkurs na popularność wygrywa kategoria pierwsza – serwisy fotosik.pl i patrz.pl.

Indeksy blogów
10przykazan.com blogfrog.pl
Tylko dwa i niestety oba ciągle mało popularne. Widocznie szeroka publiczność nie dostrzegła mocy drzemiącej w rozproszonej społeczności bloggerów. Takie filtry jak blogfrog i 10przykazan coraz lepiej radzą sobie z „wyławianiem” wartych uwagi treści z chaotycznej blogosfery.

To nie całe polskie web2.0, fala nabiera rozpędu i co chwila rodzą się nowe projekty. To pobieżne porównanie popularności serwisów web2.0 wskazuje kilka znamiennych czynników wpływających na popularność. Czynnikiem kluczowym jest prawo pierwszego, potem pomysł (najlepiej jak najbardziej masowy) i integracja - umiejętność wtopienia nowego serwisu w istniejącą sieć webowych aplikacji i hiperłączy. Pytanie tylko co jest ważniejsze – ilość czy jakość – ile osób mnie czyta czy kto mnie czyta…

Programując off-line

Tuesday, July 18th, 2006

Wakacje mają to do siebie, że w czasie ich trwania często się gdzieś wyjeżdża. Ja w planie wyjazdów miałem i mam kilka, do całości doszedł jeden, którego nie przewidziałem - na Kaszuby. W tym czasie miałem zapieprzać u brata, tworząc serwis, o którym stale piszemy. Oczywiście, by czasu nadto nie marnować wziąłem ze sobą laptopa, z nadzieją, że gdzieś w pobliskiej wiosce (bo w chwili gdy to piszę mieszkam na totalnym zadupiu, które nawet wioską nie jest) znajdzie się dostęp do Internetu. Oczywiście pisząc “wiosce” mam na myśli małe miasteczko turystyczne zwane Kartuzami (każdemu polecam odwiedzenie ww.), zatem spodziewać by się można w nim jakiejś kafejki internetowej, czegokolwiek. Oj, naiwniaku!

To znaczy - owszem, internet był, jednak w totalnie niedostępnej formie - w czytelni jakiejś gminnej biblioteki, na dodatek tylko jedno stanowisko komputerowe. Zdziwienia nie było, gdy się okazało, że jest zarezerwowane do końca dnia. Podjąłem zatem prostą decyzję - spróbuję przez WAPa. Poszedłem do Orange zorientować się, co muszę zrobić, żeby się “zaWAPać”. Instalacja miała być debilnie prosta, potrzebny był tylko port IrDA. Szybko udałem się do najbliższego komputerowego, zakupiłem potrzebny adapter pod USB i już przeżywałem radość, że nie będę się musiał uzależniać od innych ludzi. Wróciłem do miejsca tymczasowego pobytu, rozpakowałem co trzeba, powkładałem gdzie trzeba, komórkę połączyłem w prosty sposób z komputerem. I zaczęło się piekło. Nie będę tutaj przytaczać wszystkich szczegółów, bo notka nie miała być o tym, jednak gdy wreszcie udało mi się podłączyć do sieci (po rozmowach z BOK, ściągnięciu w salonie Orange odpowiednich sterowników itp.), okazało się, że przepustowość nie wystarcza. Policzywszy w głowie wyszło mi, że miałem przepustowość około 16 kbps. Nawet mejle się nie chciały ściągać…

Co to jednak ma do programowania? W mądrości swej skończonej ściągnąłem sobie zawczasu API do Ruby on Rails, dzięki czemu mogłem spokojnie programować nasz projekt, oczywiście wszystkie dotąd wymyślone ficzery. Była to jednak tylko jedynka naszego serwisu, więc do roboty nie było jakoś dużo. Przyzwyczajony jestem przy tym (może to złe przyzwyczajenie?), że gdy mam zaprogramować jakąś stronę, to najpierw muszę znać jej layout, dzięki temu znam podstawowe funkcjonalności i mogę spokojnie wszystko oprogramować. Pomysł był taki, że będę co 1-2 dni ściągał odpowiednie layouty i robił co trzeba, jednak jak można wywnioskować, z powodu braku internetu spalił on na panewce.

W akcie desperacji stwierdziłem, iż nie będę się aż tak strasznie opieprzał i chociaż opracuję odpowiednie zachowania aplikacji, które wiem, jak mają działać. Jedno, o którym konkretniej nie napiszę, bo będzie to pewne novum w polskiej sieci, nie zostało jeszcze do końca opracowane, bo zawiera wiele niuansów, które trzeba odpowiednio zaprogramować. Drugi ficzer to Pingback, który ma być dostępny do każdego tekstu. Przeczytałem zatem specyfikację tej technologii, wydała mi się całkiem prosta, jeszcze prostsza, gdy doczytałem w API, że Railsy udostępniają wiele przydatnych narzędzi do stworzenia WebServices. Pragnę przy tym zaznaczyć, iż jestem święcie przekonany, że Pingback do takowych należy, więc jeśli jest inaczej to proszę o życzliwe uświadomienie mnie o prawdzie. Zaczęła się kolejna droga przez mękę. Na początek wziąłem się za dość dogłębną lekturę API i wszelkich README z gemów actionwebservice. Programowałem przy tym po omacku jakieś serwisy, walcząc z maszyną, gdzie tylko się da. Początkowo myślałem, że uruchamiając ruby script/generate web_service skrypt wygeneruje mi jakieś API (choć przypuszczałem, że może to być równie dobrze jakiś model danych), oprócz tego klasę dziedziczącą po ActionWebService::Base. No i się pomyliłem. Skrypt owszem, wygenerował API, ale oprócz niego stworzył kontroler do obsług WS. Tego się nie spodziewałem. Stwierdziłem, że skoro tak jest, to widocznie ten kontroler jest również tym WS. Napisałem proste API dla metody ping, przy czym niepotrzebnie stworzyłem strukturę zawierającą parametry wywołania. Utworzyłem do tego scaffold do wywoływania procedur. Po tych wszystkich operacjach coś się wywołało, jednak z tego co kojarzę nie zdefiniowałem samej metody ping. Nie przeszkadzało to aplikacji, uruchomiła się, chyba nic nie zwróciła (nie pamiętam już niestety, tak mnie szlag trafiał). Potem dopisałem w kontrolerze odpowiednią metodę i już się wyświetlało w wynikach, to co miało (oczywiście mówię tylko o testach). Nie wiedziałem jednak, na jakiej zasadzie działają te WS, gdzie mogę uzyskać dostęp do odpowiedniego skryptu interpretującego moje polecenia w XML-RPC. Po długich poszukiwaniach odnalazłem, że jest to akcja api mojego kontrolera. Wchodząc na nią przy pomocy przeglądarki zobaczyć można informację o błędzie - wiadomo, wszakże wejścia na nią powinny być POSTami z zawartością w formie XML-RPC. W międzyczasie zdążyłem sobie wszystko zepsuć, nie wiedzieć co się dzieje, doprowadzić do ustawienia Pingbacku jako metody pingback.ping z dwoma parametrami: sourceURI i targetURI. Przy wysyłaniu danych przez scaffolda generuje się kod XML-RPC bez nazw parametrów i nie wiem, czy jest to zgodne ze specyfikacją. W każdym razie moja metoda na to wywołanie reaguje poprawnie i zwraca co ma. No ok, ale trzeba by się nauczyć łączenia z Pingbackiem bez użycia scaffold, a przy użyciu np. ActionWebService::Client::XmlRpc. Niby do używania bardzo prosta klasa, wystarczy zainicjować obiekt, nadać odpowiednie parametry, takie jak API, którego WS używa i adres skryptu odpowiedzialnego za komunikację. Nadałem odpowiednie wartości tym parametrom (m. in. prawidłowy adres do skryptu wywołującego odpowiednią procedurę) i… dupa! Skrypt przy poprawnym wywołaniu zawiesza się, zgłaszając potem jakieś niezrozumiałe błędy. By się upewnić, że scaffold mnie nie oszukuje, że WS naprawdę działa i istnieje napisałem krótki programik w Javie, który miał wysyłać odpowiednie nagłówki i wartości przez HTTP i wyrzucać na sterr zwrócone wartości. Pierwsze wywołanie, bez XML-RPC zwrociło mi błędy, które można normalnie przeczytać wywołując w przeglądarce akcję api. Gdy wysłałem dane XML-RPC akcja zwróciła mi… to co powinna! Hura, znaczy się, że WS działa. Ale czemu, do jasnej cholery, klient XML-RPC nie działa - tego nie wiem.

Jeszcze 10 minut temu się zastanawiałem, dlaczego autorzy ActionWebService nie stworzyli specjalnego komunikatu dla api, gdy próbujemy się do niego dostać w sposób nieodpowiedni. Dopiero teraz domyśliłem się, że mogę to zrobić ja, używając before_filter. I tak powoli uczę się stylu myślenia zgodnego z Ruby on Rails. Co jest w sumie dla mnie najbardziej ciekawe to to, jak szybko potrafię przechodzić ze stanu nienawiści destrukcyjnej do gloryfikacji Railsów. Nauka jednak boli.