Wprowadzanie zmian w wyglądzie blogów jest rzeczą trudną - zwłaszcza, jeśli zmiany mają połączenie z istniejącymi notkami.

Często ciężko jest ustalić, czy efekt dla przykładowych danych będzie taki sam po umieszczeniu na serwerze.

Jest jednak pewien sprytny sposób, by wprowadzać zmiany na żywo, lecz bez wglądu czytelników.

→ Czytaj dalej... (9 komentarzy)

Dwa razy rozmowa kwalifikacyjna w Google wymykała się z moich rąk.

W końcu, z początkiem nowego roku odbyłem pierwszą rozmowę. W dwa dni później skontaktowano się ze mną w sprawie drugiej. Bilans został więc wyrównany.

Jak się okazało, więcej rozmów nie było potrzebnych.

Przed dalszą lekturą polecam przeczytanie poprzednich części: pierwszej, drugiej oraz trzeciej.

Logo Google

→ Czytaj dalej... (45 komentarzy)

W 2007 roku dwa razy otarłem się o rozmowę kwalifikacyjną z Google. Przed dalszą lekturą polecam zapoznanie się z pierwszą i drugą historią.

Rok kończyłem zawiedziony. Nie udało się, a było tak blisko. Miałem jednak silne postanowienie próbowania w kolejnym.

Próbować nie musiałem.

3 stycznia w mojej skrzynce czekał list zatytułowany "Hello from Google".

Logo Google

→ Czytaj dalej... (57 komentarzy)

Po otrzymaniu odpowiedzi odmownej odnośnie rekrutacji do Google (przeczytaj najpierw), sprawa ucichła - niemal o niej zapomniałem.

Jedno tylko czasem mi przychodziło do głowy: niedorzeczna świadomość, że wysłałem dwie aplikacje - o staż i o pracę, a odpowiedź otrzymałem jedną.

Po dwóch miesiącach w końcu przyszła odpowiedź na drugi mail.

Moja aplikacja została wzięta pod uwagę przy tworzeniu krakowskiego oddziału Google.

Google logo

→ Czytaj dalej... (15 komentarzy)

W dwa miesiące przed rozmową kwalifikacyjną w IBM przechodziłem ulicą Krupniczą w Krakowie i zauważyłem w bramie znajome pastelowe kolorki... Moim oczom ukazała się siedziba Google!

To, co działo się później, wydawało się być snem informatyka...

Logo Google

→ Czytaj dalej... (9 komentarzy)

Rzecz działa się w lipcu zeszłego roku. Na moim wydziale (Fizyki, Astronomii i Informatyki Stosowanej UJ) pojawiły się plakaty z krzykliwymi hasłami typu "czy lubisz publicystykę?" lub "studiujesz filologię lub informatykę?". Jeśli odpowiedź na te pytania brzmiała "tak", czytelnik miał się stawić na spotkanie z ekipą IBM Polska na stanowisko Technical Writer w Krakowie. Co też zrobiłem.

→ Czytaj dalej... (20 komentarzy)

Każdy informatyk po porannej (czyt. 11:00) pobudce najpierw otwiera pocztę (czyt. Gmaila). Tak też ja zrobiłem dzisiaj. Wpisuję hasło... Okazuje się złe! Kilka prób... Wciąż nic. Mimo, że hasło niedawno zmieniałem, byłem go pewien - na pocztę loguję się kilkanaście razy dziennie.

Błędne hasło!

→ Czytaj dalej... (13 komentarzy)

W ostatnich dniach zmodernizowałem swojego bloga, dodając funkcjonalności i ułatwiając nawigację oraz administrację. Wnet zauważyłem, że tych rzeczy brakuje na innych blogach. Nie przedłużając, pragnę więc przedstawić kilka praktycznych wskazówek i udoskonaleń dla właścicieli blogów, które powinny także podnieść PageRank wpisów.

→ Czytaj dalej... (15 komentarzy)

Pisząc kod do kolejnej notki natknąłem się na pewien problem. Mianowicie:

<a href="http://www.wykop.pl/dodaj?url=http://eldoras.com&title=test" alt="Dodaj do Wykop.pl">

Po kliknięciu takiego linka... No właśnie. Czy do zmiennej url zostanie przekazane: http://eldoras.com&title=test

czy może stworzona zostanie (pożądana) zmienna "title" o wartości "test"?

Ja obstawiam, że to drugie - zakładam, że algorytm czytający GET jest mało tolerancyjny i analizuje każde & jako oddzielenie jego własnych zmiennych. Jak jednak przekazać przy pomocy GET url, który posiada jakieś zmienne przekazywane również metodą GET?

Musimy zakodować zawartość zmiennej url, zamieniając znaki "&" (ampersand) na "%26".

Tak więc kod:

<a href="http://www.wykop.pl/dodaj?url=http://eldoras.com%26title=test" alt="Dodaj do Wykop.pl">

powinien przypisać zmiennej url wartość wraz z wkodowaną zmienną title. Dla mnie jest to nowość, bowiem dotychczas sądziłem, że takie tricki jak &amp; zamiast & w adresie url są zalecane tylko w celach walidacyjnych (pisząc to, musiałem w kodzie xHTML napisać &amp;amp;). Jak widać, zagadnienie jest poważniejsze.

Od 2 lutego, zgodnie z oficjalnym komunikatem, Netscape Navigator nie będzie już nawet uaktualniany. Oto krótka lekcja historii, będąca hołdem dla protoplasty Firefoxa.

Logo Netscape

Netscape Navigator powstał w 1994 roku, będąc następcą pierwszej przeglądarki graficznej - Mosaic (screenshot). Jako pierwsza przeglądarka, obsługiwała Jave, JavaScript i ramki. Jak informuje Wikipedia, swego czasu posiadała ok. 90% rynku przeglądarek.

Co zawdzięczamy firmie Netscape?

  • Stworzenie języka JavaScript
  • Stworzenie protokołu SSL
  • Stworzenie standardu RSS
  • Powstanie Mozilla Foundation i stworzenie Firefoxa na bazie Netscape Navigatora

Jakkolwiek w 2003 roku ogłoszono już koniec prac nad przeglądarką i skutkiem protestów użytkowników zostały one wznowione, tak nie ma podstaw by sądzić, iż tak się stanie i tym razem.

Na odchodnym, Netscape poleca swoim użytkownikom Firefoxa. Dla mających większy sentyment pozostaje także inny projekt, który ma swoje korzenie w Netscape: SeaMonkey.

Wypada powiedzieć: dziękujemy.

Jak tylko wyczytałem informację o znalezieniu błędu na home.pl, do głowy przyszło mi słowo: szantaż. Z radością więc dzisiaj przeczytałem, że home.pl nie dało za wygraną, wykryło lukę i pozwało serwis hack.pl. Może warto wspomnieć, kto jeszcze kilka tygodni temu padł ofiarą akcji antygorianowej? Ano właśnie... "profesjonaliści" z wyżej wymienionej redakcji.

Pierwsza rzecz, która mnie zbulwersowała, to sposób przedstawienia problemu przez hack.pl.

Wstępnie myśleliśmy tylko o napisaniu o błędzie na łamach HACK.pl, a także o udostępnieniu zacieniowanych dowodów, które jednak nie pozwoliłyby na wykorzystanie błędu.

Chcemy postąpić maksymalnie przyjaźnie wobec home.pl, z naszego punktu widzenia, dobrze byłoby gdyby na łamach HACK.pl pojawił się news dotyczący luki w home.pl, ale też rozumiemy Państwa sytuację.

Koszt informacji szacujemy wstępnie na 200,000 złotych, cena - oczywiście - podlega negocjacji. Być może bylibyśmy zainteresowani współpracą z Wami na zasadach partnerskich, czy też reklamą w home.pl.

To nie brzmi jak kulturalne zwrócenie uwagi na błąd. Brzmi jak marnie zatuszowane wyłudzenie. Przynajmniej dla mnie.

Zobaczmy, co faktycznie osiągnęli redaktorzy z hack.pl. W oświadczeniu zdecydowali się podać szczegóły luki (skoro pieniążki przepadły, przynajmniej popularność będzie). Dostali się oni do logów. Jako przykład podają:

XXXX.neoplus.adsl.tpnet.pl - - [02/Apr/2007:16:38:20 +0200]

"GET /sql/sql.php?db=*nazwa_konta*2&table=*nazwa_tabeli*&token=f330213d49aabe[...]&sql_query=SELECT+%2AFROM+%60*nazwa_tabeli*%60++ORDER+BY+%60*pole_w_tabeli*%60+ASC&zero_rows=Rekord+zosta%B3+skasowany&goto=tbl_properties_structure.php&message=Skasowane+rekordy%3A%26nbsp%3B1+%28Wykonanie+zapytania+trwa%B3o+0.0003+sekund%28y%29%29

HTTP/1.1" 200 7111 "[...]" "Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3"

Okay. Możemy z tego faktycznie wyczytać nazwy tabel i bazy danych. Ciekawe jednak, na co się one mogą przydać? Ano na to, że jak już sobie wyczarujemy dostęp do bazy danych, to nie musimy robić np. "SHOW TABLES", tylko możemy je sobie wyciągnąc z query-stringów, żeby dalej psuć serwis. Łebskie. Oczywiście, nikt przy zdrowych zmysłach nie przesyła loginu i hasła GETem, więc taki zarzut (rozważnie lub zapominalsko nie podany) odpada. Z takiego logu faktycznie możemy też odczytać nazwy plików i katalogów. Tyle, że jakieś 90% skryptów ma powszechnie znane adresy do panelów administracyjnych ("/admin" ?). Bo nie wierzę, że nazwa katalogu to jedyne zabezpieczenie jakiegokolwiek panelu sterowania w PHP. A jednak, z pomocą przychodzi strona MENu:

Dalej wyszukałem wszelkie wywołania plików w tym katalogu, i doszedłem do strony w której użytkownik dostawał potwierdzenie o poprawnym zalogowaniu. Po otworzeniu tej strony okazało się, że mam pełen dostęp do panelu administracyjnego.

Wow, udało wam się wejść do niezabezpieczonego panelu?! No shit!! Haxorz. Okay, ale jak w ogole doszło do tego wielkiego włamania?

Aby poznać trzy losowe cyfry wystarczyło napisać skrypt sprawdzający czy istnieje katalog od nazwa_uzytkownika.home.pl/stats100 aż do nazwa_uzytkownika.home.pl/stats999 na danym koncie. Skrypt taki wykonuje się 2 sekundy!

Whoa. To się nazywa znalezienie luki! Ja bym tak nie umiał. I jeszcze wykonanie 500 zapytań HTTP i uzyskanie wszystkich odpowiedzi w ciągu sekundy... cuda, no ale co to dla hackerów. Respekt.

W czasie pisania tego wpisu natknąłem się na podobną opinię na też niezbyt przeze mnie lubianym ihack.pl (witamy w gronie razem z hacking.pl).... Home.pl też do najwyższej półki hosting providerów nie należy, więc mi się to widzi jako kolejna mini wojna :) Do poczytania w święta w sam raz.

P.S. Panowie z hack.pl zapomnięli wspomnieć o pieniążkach w swoim oświadczeniu :(

Zdecydowałem (jest nikła szansa, że zmienię decyzję), że po ponad dwóch latach działalności, kończę współpracę z PHP Solutions, a nawet całym wydawnictwem Software.

Z tej okazji, mogę polecić kogoś na moje miejsce. Zajmowałem się pisaniem aktualności do PHP Solutions, korektami, tłumaczeniami i pisaniem artykułów. Do wzięcia będzie więc przynajmniej pierwsza pozycja - newsmena.

Kasa jest niewielka (100zł/strona), po ok. trzech miesiącach - chodzi głównie o publikację w prasie. Najbliższe newsy trzeba oddać za około miesiąc. Chętni na stanowisko proszeni są o wysłanie kilku słów o sobie, swojej wiedzy, wieku wraz z ew. linkami do projektów na mail calusy+phps@@eldoras.com - jak widać, należy usunąć nadmiarową małpkę. Do tego należy dodać jeden przykładowy newsik - kilka (4, max. 5) zdań na temat czegoś związanego z PHP (opis ciekawego projektu, nowej wersji itp.). Rozeznam się i kogoś prawdopodobnie polecę. Wszystkim odpiszę. Na maile czekam niezbyt długo, bo prawdopodobnie do godziny 17 w poniedziałek.

Od siebie powiem, że robota jest bardzo przyjemna i można się dowiedzieć o ciekawych rzeczach tworząc newsy. Ja odpuszczam pracę z kilku powodów: oczy wysiadają, za niska płaca, a przede wszystkim - przestało to być takie ciekawe, gdy wszystkie teksty w piśmie i tak już widziałem wcześniej. Stąd prosta droga do Warszawy, co mi już proponowano kilkukrotnie, ale nie to chcę w życiu robić :)

Po ok. tygodniu pisania i testowania kodu, mogę wreszcie udostępnić wersję 0.9 aplikacji będącej chatem AJAXowym.

AJAX Chat w akcji

Features, czyli co mną kierowało:

  • Internauta może za pomocą kliknięcia rozwinąć lub schować chat - nie przeszkadza mu w przeglądaniu witryny, będąc domyślnie schowanym.
  • Internatura może sprawnie poruszać się po witrynie mając rozwinięty chat: nie jest to pop-up, lecz stanowi integralną część strony, będąc wraz z nią przesuwalnym suwakami. Sprawne poruszanie oznacza także, że przy przejściu do innej podstrony, chat zostanie automatycznie otwarty.
  • Chat jest estetyczny: nie zawiera żadnych grafik, jednak świetnie komponuje się z witrynami społecznościowymi - głównie forami, czy stronami hobbystycznymi. Adresy są automatycznie zamieniane na odnośniki. Przewijanie okna jest podobne do znanego z Gmaila: chat sprawdza, czy użytkownik nie czyta wcześniejszych wiadomości, zanim przesunie się, pokazując nową treść. Dodatkowo dodany jest przyjemny dla oka efekt znikania i pojawiania się chata.
  • Z punktu widzenia developera, stanowi w miarę kompaktowy skrypt: całość zajmuje 31KB (po usunięciu niektórych zbędnych części pakietu Script.Aculo.Us). Oparty jest na Prototype i MySQL, a kod jest na tyle przejrzysty, że zbędne są komentarze. Naturalnie, jest odporny na XSS i tego typu atrakcje.
  • Skrypt nie generuje dużego obciążenia: aktualizuje treść jedynie przy rozwiniętym oknie, z czasem ustawionym domyślnie na 2 sekundy. Pobiera generowany przy wysyłaniu wiadomości plik stały z odpowiednimi nagłówkami, które gwarantują korzystanie z cache przeglądarki w przypadku braku zmiany treści.
  • Działa bez zarzutu pod przeglądarkami: Firefox 1.5.0.4, IE 6.0, Opera 8.52. Pod innymi nie sprawdzałem, jednak powinien chodzić pod wszystkim, co jest obsługiwane przez script.aculo.us i prototype. Oczywiście trzeba być przygotowanym na błędną interpretację CSS - nie przykładałem do tego wielkiej wagi, ponieważ większość osób i tak stworzy własny szablon

Wszystko spakowałem haxorskim winrarem. Do pobrania: wersja 0.9. Licencja... naturalnie darmowa do zastosowań niekomercyjnych. W przypadku komercyjnych - jakaś symboliczna opłata ;) Wymagam jedynie, by zostawić w okienku chata odnośnik do http://ajax.eldoras.com. Demo działającego skryptu można obejrzeć na garfiku.

Instalacja:

  • Rozpakowujemy archiwum, modyfikujemy w pliku newmsg.php dane do połączenia z bazą danych (login, hasło, nazwa bazy). Całość wgrywamy na serwer.
  • Używamy db.sql do stworzenia tabel w bazie danych MySQL.
  • Do każdej strony, na której chcemy mieć chat, dołączamy w nagłówku 5 plików, jak widać w pliku sample_index.php (1 CSS i 4 skrypty, przy czym fixed.js to hack dla IE umożliwiający uzyskanie pozycji typu fixed). W treści strony (może być zaraz po znaczniku body) dodajemy diva "openchat" oraz includujemy chat.php (przykład w sample_index.php).
  • Opcjonalnie możemy zmodyfikować arkusz styli chat.css do naszych potrzeb. Nie zalecam zmiany identyfikatorów CSS - są do nich przypisane funkcje w JavaScript.

Wszelkie uwagi mile widziane, zmiany można nadsyłać na e-mail. Ufam, że będzie to coś, co rozejdzie się po necie i zostanie udoskonalone - mój wkład w open source community :)

Community jednak także mi trochę pomogło. Główne podziękowania należą się Patrysowi za cenne uwagi i praktyczną pomoc oraz Riddle'owi za uświadomienie mnie odnośnie zagadnień XHT cross-subdomain :)

Jak wiemy, Jogger nie pozwala na wgrywanie swoich plików *.php, co jest w pełni zrozumiałe. Ciężko również oczekiwać, by admin robił wyjątki, choć większość ma swoje marzenia co do udoskonalenia jogga. Ja na ten problem trafiłem, próbując uruchomić chat AJAXowy - nie szło, bowiem (dzięki w kierunku Riddle'a) XmlHttpRequest nie pozwala na robienie zapytań nie tyle cross-domain, co nawet cross-subdomain.

Myślałem więc, jak problem obejść. Jogga mam podpiętego pod własną subdomenę - jak widać. Nie ma więc siły, bym jakoś zamieścił pod adresem blog.eldoras.com/whatever swój plik *.php mając subdomenę skierowaną na IP Joggera.

Widzę dwie możliwości, które by raczej nie zagroziły samemu Joggerowi:

1. Stworzenie skryptu generującego przekierowania do określonych stron przy pomocy header("Location: http://anything.eldoras.com");

2. Stworzenie skryptu generującego przekierowanie przy użyciu silnika Apache'a (nie wiem jak to zrobić, ale mniemam, że deczko trudniej).

Napisałem w tej sprawie maila do Sparrowa, jednak bez odpowiedzi. Do Joggerowców zwracam się z pytaniem: czy jest problem, którego nie dostrzegam w tym rozwiązaniu?

EDIT: Na privie wyszło, że chyba nie wyraziłem się do końca jasno. Joggerowcy mieliby możliwość modyfikowania jedynie URLa na który ma zostać przeprowadzone przekierowanie. Tym sposobem, XHT by przeprowadzał zapytania do tej samej subdomeny, chociaż sam kod PHP byłby już parsowany przez inną subdomenę, poza Joggerem.

Pora już wczesna... więc przejdę od razu do rzeczy.

Doszedłem do wniosku, że shoutboxy to dziadostwo - używają iframe, rzadko się same odświeżają. Do tego mają podobną wadę jak chaty na www - jesteśmy zmuszeni cały czas mieć otwartą tą samą stronę. Chwila myślenia, 4 dni kodowania i oto jest: AJAXowy chat, który szybciutko można dołączyć na dowolną stronę serwisu, pozbawiony powyższych wad.

EDIT: Projekt można pobrać z http://ajax.eldoras.com.

Projekt ma w zamierzeniu być open-source, jednak dopiero, gdy przejdzie pierwsze testy. Narazie wersję roboczą można zobaczyć na garfiku. Wygląda jak wygląda - nie miałem już dziś siły bawić się w layout pod różne przeglądarki. Skrypt idealnie pasował do tego bloga, ale dzięki temu, że jogger nie ma możliwości uploadu *.php, zaś XHR blokuje cross-subdomain queries, to pies pogrzebany. Przyznam, że przydałoby się jakieś lepsze środowisko testowe. Marzy mi się forum - jeśli ktoś chce zaryzykować, proszę o kontakt na JID zar@uaznia.net.

Sam projekt obsługuje (a przynajmniej powinien) cacheowanie, nie pobiera treści, gdy chat jest schowany, transformuje http na linki, chyba nie jest podatny na XSS i w sumie tyle :)

Mile widziane próby znalezienia słabych stron, pomysły itp... jak widać, stadium można określić jako wczesną alfę ;) Z rzeczy, które mi teraz przychodzą do głowy... podrasować działanie paska przewijania, poprawić widok w różnych browserach, pamiętanie nicka i coś tam jeszcze...

Nareszcie! Tego mi w gmailu bardzo brakowało... nie wszędzie bowiem (Interia...) można ustawić forwarding. Na dniach Gmail uruchomił pobieranie poczty z kont POP3 (max. 5). Narazie funkcjonalność jest dostępna dla limitowanej ilości użytkowników (jestem tym szczęśliwcem), ale pracują nad poszerzeniem kręgu odbiorców :) Read more...

Now, Gmail is complete... :)