dominik bułaj

php developer & web designer

Coraz wiÄ™cej firm rezygnuje z technologii Adobe Flash na swoich witrynach. JednÄ… z nich jest Virgin America – firma lotnicza, która zrezygnowaÅ‚a z flasha by przyciÄ…gnąć wiÄ™cej klientów korzystajÄ…cych z Flash. O caÅ‚ej sprawie informuje gazeta.pl/technologie.

Powiem szczerze, nigdy nie byÅ‚em zwolennikiem flasha i cieszy mnie, że jego dominacja może trochÄ™ zmaleć. Mam tylko nadziejÄ™, że nie kosztem Silverlighta…
Uważam, że do wiÄ™kszoÅ›ci zastosowaÅ„ wystarczy wykorzystać “moc” jakÄ… oferujÄ… dzisiejsze frameworki JavaScript + CSS.

Jak informuje Gazeta.pl, Google kupiło kolejną w ostatnim czasie firmę oferującą usługi online. Chodzi o firmę DocVerse umożliwiającą obróbkę dokumentów Microsoft Office przez Internet.

Jest to kolejna, po zakupie Picnika, transakcja giganta z Mountain View.

Teraz pozostaje poczekać kilka miesiÄ™cy i zobaczy wykorzystanie “nowych (nabytych) technologii” w Google ;)

Jak wspomniałem w poprzednim wpisie o Google Chrome i Zend_Date, polskojęzyczna wersja przeglądarki Google identyfikuje się jako angielskojęzyczna. Okazuje się jednak, że można to dość prosto zmienić, chociaż samo rozwiązanie to tzw. proteza (ale o tym nieco dalej).

Zmiana nagłówka jest możliwa po przez dodanie parametru uruchamiającego chrome.exe (w Windows).

I tak do:
[ścieżka do katalogu Chrome]\chrome.exe

dodajemy:
[ścieżka do katalogu Chrome]\chrome.exe --user-agent="[tu nasz wpis]"

WÅ‚aÅ›nie w tym momencie powstaje pewien problem. Musimy poznać oryginalnÄ… wartość User Agent, co jest proste. Wystarczy w polu adres wpisać “about:” i otworzyć ten pseudo-adres.
Możemy teraz skopiować zawartość User Agent, zmieniając wartość:
Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.2 Safari/533.2

na:
Mozilla/5.0 (Windows; U; Windows NT 6.0; pl) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.2 Safari/533.2

Ów problem to numer wersji Chrome, Safari i Webkita. Po aktualizacji przeglÄ…darki dane te musielibyÅ›my rÄ™cznie zmienić, aby poprawnie identyfikować wersjÄ™ programu (no chyba, że na tym nam nie zależy)…

Używam przeglÄ…darki Google Chrome głównie do przeglÄ…dania sieci – bo jest szybka. Bardzo szybka.
W procesie tworzenia witryn (caÅ‚a otoczka zwana developerkÄ…) używam nadal Firefoxa, gdyż ma co najmniej dwa niezastÄ…pione rozszerzenia – Firebug i Web developer.
Mając do dyspozycji te dwie przeglądarki, jestem w stanie zalogować się do tworzonej aplikacji na dwa różne konta (bo jak wiemy każda przeglądarka to osobna sesja).

W aplikacji do porównania dat używam Zend_Date(). Kod wygląda mniej więcej tak (chodzi o sprawdzenie czy data zdarzenia jest starsza niż 7 dni):

$d1 = new Zend_Date($this->transactionData->datetimeAccepted);
$d2 = new Zend_Date(); // zwraca aktualnÄ… datÄ™ i czas
$d2->addDay(-7); // przesuwam znacznik czasu o 7 dni wstecz

if ($d1->compare($d2) === -1) { // porównuje czy data z bazy ($d1) jest wieksza od ($d2)
// ... dalszy kod
}

W Firefox pieknie działało (Zend_Date::compare() zwracał -1, co oznacza że data $d1 jest starsza od $d2). Odpaliłem widok w Chrome i jakież było moje zdziwienie, gdy wynik testu Zend_Date::compare() wynosił 1 (data $d1 jest młodsza niż $d2).

Po szybkim zbadaniu kodu okazaÅ‚o siÄ™, że w Chrome $d2 ma postać “amerykaÅ„skÄ…”. SprawdziÅ‚em w Zend_Locale() i okazÅ‚o siÄ™, że polskojÄ™zyczna wersja Chrome (v. 5.0.342.1) identyfikuje siÄ™ nagłówkiem:

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.1 Safari/533.2

Szybka zdecydowaÅ‚em siÄ™ na “narzucenie” aplikacji odpowiednich ustawieÅ„ lokalnych.

W Bootstrapie dodałem kod:

protected function _initLocale()
{
    $locale = new Zend_Locale('pl');
    Zend_Registry::set('Zend_Locale', $locale);
}

Oczywiście to w wielkim uproszczeniu, bo aplikacją którą tworzę będzie wielojęzykowa więc i ustawienia lokalizacji będą się dynamicznie zmieniać ;)

Google kupiło Picnik

Dwa lata temu pisałem o bardzo fajnym edytorze grafiki on-line. Picnik bo tak się nazywa owa aplikacja był dużo szybszy niż np. Photoshop Express.

Dziś dowiedziałem się, że wczoraj (1. marca 2010) Google przejęło Picnika.
Ciekawe jaki będzie kolejny krok giganta z Mountain View. Czyżby szykowali kolejny składowy element do usługi Google Docs? A może to tylko dodatek do Picasa?

DziÅ› na devblogi.pl ukazaÅ‚ siÄ™ bardzo ciekawy, żeby nie powiedzieć “arcy”, tekst na temat normalizacji baz danych.

Uczeni byliśmy, że zawsze należy doprowadzać bazę do 3PN. Tymczasem autorzy wpisu piszą:

Mimo wielu dowodów, że normalizacja rzadko daje się skalować, odkrywam, iż wielu programistów będzie zażarcie jej broniło, dla samej tylko zasady. Długo po tym, kiedy przestało mieć to sens.

Temat dla mnie na czasie, bo właśnie teraz w korpo mamy na tapecie aplikację, której baza jest dość zawiła (różnego rodzaju transakcje) i część chyba będzie musiała zostać denormalizowana.

W każdym razie – polecam tekst A może normalizowanie nie jest normalne?

PoczÄ…tkowo dowiedziawszy siÄ™, iż do kolejnej wersji Zend Framework (mowa o 1.10.0), bÄ™dzie dodany komponent Zend_Serializer, pomyÅ›laÅ‚em “hej, czy to nie przesada opakowywać w klasÄ™ gotowe narzÄ™dzie dostÄ™pne w PHP”.
Chodzi mi głównie o standardowÄ… i JSONowÄ… serializacjÄ™ i deserializacjÄ™…

Dziś przeglądając dokładniej dokumentację sprawdziłem co tam jeszcze ciekawego wepchano. Okazało się, że komponent jest dość bardzo zaawansowanym narzędziem. Oferuje:

  • standardowÄ… serializacjÄ™ php
  • reprezentowanie danych w postaci WDDX
  • zapisanie obiektu, zmiennych w postaci JSON (korzysta z Zend_Json)
  • serializacjÄ™ do Amf (wykorzystuje Zend_Amf)
  • reprezentacjÄ™ danych z użyciem var_export(), a odtwarzanie wykorzystujÄ…c eval() — co wg mnie jest jakimÅ› żartem (przecież eval() to czyste zÅ‚o i potencjalna dziura w aplikacji!)
  • serializacjÄ™ z użyciem opensource Igbinary (binarna repezentacja danych)
  • i na koniec, chyba najwiÄ™ksze (pozytywne) zaskoczenie dla mnie – zpisywanie i odczytywanie danych w formacie Python Pickle

Połączenie PHP< ->Python do wymiany danych to coś dobrego. W końcu będzie możliwość wymiany danych bez potrzeby pisania osobnego (lub wykorzystywania gotowego) interfejsu.

Ostatnio, z różnych powodów, maÅ‚o byÅ‚em aktywny na sieci… mam nadzieje ze to siÄ™ zmieni. A zacznÄ™ od nadrobienia pewnych zalegÅ‚oÅ›ci.

Jak zapewne odnotowaliście, wydano już pełną wersję Zend Framework 1.10.0, a także dwie kolejne wersje pełne poprawek (tzw. minor releases). O wszystkim informował na bieżąco Mateusz Kamiński na swoim blogu.

Ja dodam tylko najświeższy news. Zaczęły się prace nad Zend Framework 2.0!
PoinformowaÅ‚ o tym głównodowodzÄ…cy projektem – Matthew Weier O?Phinney. Pierwsze rezultaty prac oczekiwane sÄ… już za kilka(naÅ›cie?) tygodni.

Na pierwszy rzut idÄ…:

  • usuniÄ™cie wywoÅ‚aÅ„ require_once()
  • aktualizacja testów
  • wykorzystanie namespace’ów dostÄ™pnych od PHP 5.3
  • testowanie alternatywnych systemów pluginów (docelowo majÄ… być bardziej wydajne i zrozumiaÅ‚e)

Dziś w nocy ukazała się pierwsza wersja kandydująca Zend Framework 1.10rc1. Można ją pobrać z oficjalnej strony aplikacji.
O nowych ficzerach przeczytacie na devzone.zend.com.

Przy okazji dziś uaktualniona została dokumentacja frameworka. Można teraz wybrać wersję na jakiej pracujemy, aby dostać dokumentację relatywną do możliwości naszej wersji ZF. Nową dokumentację znajdziecie pod starym adresem: http://framework.zend.com/manual/en/.

PS dostÄ™pna jest dokumentacja do kolejnej wersji – 1.10.

Dziś nad ranem czasu polskiego, ukazała się kolejna wersja Zend Framework. Jest to wydanie oznaczone jako 1.10.0 ALPHA, przeznaczone do testowania nowych funkcjonalności, a jest czego testować ;)

Nowe komponenty w Zend Framework 1.10

  • Zend_Barcode
  • Zend_Cache_Backend_Static
  • Zend_Cache_Manager
  • Zend_Exception (wsparcie dla poprzedzajÄ…cych wyjÄ…tków; markuje rozwiÄ…zanie dostÄ™pne od PHP 5.3.0)
  • Zend_Feed_Pubsubhubbub
  • Zend_Feed_Writer
  • Zend_Filter_Compress/Decompress
  • Zend_Filter_Null
  • Zend_Log::factory()
  • Zend_Log_Writer_ZendMonitor
  • Zend_Markup
  • Zend_Service_LiveDocx
  • Zend_Service_WindowsAzure
  • Zend_Validate_Barcode
  • Zend_Validate_Callback
  • Zend_Validate_CreditCard
  • Zend_Validate_PostCode

Dodatkowo jak informuje, opiekujÄ…cy siÄ™ frameworkiem, Matthew Weier O’Phinney – dużej refaktoryzacji poddano Zend_Tool. Wyeliminowano masÄ™ błędów i niedociÄ…gnięć (wÄ…skie gardÅ‚a) oraz dodano nowe fukcjonalnoÅ›ci:

  • skrypt CLI z wsparciem dla katalogu domowego i możliwoÅ›ciÄ… konfiguracji
  • możliwość generowania modeli, konfiguracja adaptera bazodanowego, layoutów i formularzy
  • domyÅ›lnie generowany projekt bÄ™dzie wspieraÅ‚ logowanie błędów z ErrorControllera

Framework można pobrać, jak zawsze, z oficjalnej strony (pełny changelog na stronie pobierania po rozwinięciu panelu README).

Na koniec harmonogram na najbliższy miesiąc:

  • 1.10.0alpha1 – 21 grudnia 2009 (dziÅ›)
  • 1.9.7 – 5 stycznia 2010 (wtorek)
  • 1.10.0beta1 – 7 stycznia 2010 (czwartek) lub 8 stycznia (piÄ…tek)
  • 1.10.0rc1 – 14 stycznia (czwartek)
  • 1.10.0 – 21 stycznia (czwartek)

Jak niektórym zapewne wiadomo, Czytnik Google nie wspiera obsługi prywatnych feedów.
Czym sÄ… owe prywatne feedy? SÄ… to np. feedy z Gmail, Twittera (timeline) – sÅ‚owem wszÄ™dzie tam, gdzie wymagane jest zalogowanie na wÅ‚asne konto.

NapisaÅ‚em prosty skrypt PHP, dziÄ™ki któremu mam swego rodzaju proxy do Twittera (timeline – czyli to co widzÄ™ po zalogowaniu – statusy osób które obserwujÄ™).

Źródło (poniżej instrukcja użycia)

< ?php
// konfiguracja
define('USER', ''); // twoja nazwa użytkownika
define('PASS', ''); // twoje hasło
define('GOOGLE_READER_ONLY', true); // strona dostępna tylko dla bota Google Reader

// umożliwiamy dostęp tylko Google Reader
if (GOOGLE_READER_ONLY && !preg_match('/Feedfetcher-Google/', $_SERVER['HTTP_USER_AGENT'])) {
    die('401 Unauthorized');
}
// wysyłamy poprawny nagłówek
header('Content-Type: application/rss+xml; charset=utf-8');

// pobieramy i wyświetlamy feed z twitter.com
$curl = curl_init('http://twitter.com/statuses/friends_timeline.rss');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_UNRESTRICTED_AUTH, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
curl_setopt($curl, CURLOPT_USERPWD, USER . ':' . PASS);
echo curl_exec($curl);
curl_close($curl);

Jak używać?
Pobierz plik (zip, tgz), wrzucić na swój serwer (podaj w konfiguracji nazwę użytkownika i hasło).
Na koniec w Czytniku Google dodaj nowÄ… subskrypcjÄ™ podajÄ…c adres URL do pliku na serwerze.

Pomoc
Masz pytania, potrzebujesz pomocy? Skontaktuj się ze mną, a postaram się pomóc :-)

TytuÅ‚ może na pierwszy rzut oka być nieco mylÄ…cy. Nie chodzi o jakÄ…Å› lukÄ™ bezpieczeÅ„stwa. Po prostu możemy zainstalować Pythona we wÅ‚asnym katalogu domowym – na przykÅ‚ad wtedy, gdy na serwerze oferowana jest starsza wersja a admini nie sÄ… skorzy do upgrade ;)
WÅ‚aÅ›nie zaczÄ…Å‚em zagłębiać siÄ™ w ten jÄ™zyk programowania, napisaÅ‚em pierwszÄ… aplikacjÄ™ którÄ… chciaÅ‚em odpalić na serwerze, ale tam byÅ‚ Python 2.5 (a potrzebowaÅ‚em 2.6). Admini stwierdzili, że w używanej dystrybucji Debiana jako najnowsza jest 2.5 i nie zrobiÄ… upgrade (swojÄ… drogÄ…, chyba stary nieco ten Debian)… Tyle tytuÅ‚em wstÄ™pu.

Z pomocą przyszedł kolega Zbiju, który podpowiedział że da się zainstalować Pythona na serwerze nie mając praw superużytkownika (bez użycia sudo). Podesłał też link do opisu takiej instalacji. Autorem opisu jest niejaki bobince.

Utwórzmy katalog (np. .local) w domowym (u mnie: /home/webit/.local/), a następnie przejdźmy do niego (cd .local/).
Pobierzmy Pythona i wypakujmy z archiwum tarball (.tgz) źródła:

wget http://python.org/ftp/python/2.6.4/Python-2.6.4.tgz; tar -xf Python-2.6.4.tgz

Przejdźmy do katalogu ze źródłami:

cd Python-2.6.4/

Teraz pozostaje nam kompilacja ze źródeÅ‚ – wykonujemy w tym celu po kolei:

./configure --prefix=/home/webit/.local
make
make install

Gotowe!.
Aby skorzystać z właśnie zainstalowanego Pythona należy wykonać polecenie:

/home/webit/.local/bin/python

gdyż właśnie w tym miejscu znajduje się binarka.

Warto zapamiętać, że skrypt wykonywalny w powłoce także powinien używać tej ścieżki. System musi wiedzieć, że ma skorzystać z naszego interpretera, a nie domyślnie dostępnego w systemie. W tym celu w pierwszej linii skryptu wpiszemy:

#!/home/webit/.local/bin/python

Pozostaje życzyć miłego kodowania ;)

Wprowadzenie
W firmie, do projektu w którym biorę udział, przygotowaliśmy większą paczkę zmian. Powiedzmy, że wersja produkcyjna bazuje na rewizji sprzed miesiąca (korzystamy z SVN; przy każdym commit podajemy ID i url do ticketa).
W miÄ™dzyczasie rozwiÄ…zaliÅ›my w teamie okoÅ‚o 15 ticketów i nasz project manager potrzebowaÅ‚ ich listÄ™, aby przekazać klientowi do ostatecznego sprawdzenia na stagingu. Jako że jestem najbardziej doÅ›wiadczonÄ… osobÄ… w projekcie – padÅ‚o na mnie ;)

Sposób pierwszy (oldschool)
Niby prosta czynność, bo przecież możemy otworzyć system ticketów, wyszukać wszystkie rozwiÄ…zane w ciÄ…gu miesiÄ…ca, a nastÄ™pnie spisać ID i url każdego ticketa. TrochÄ™ czasu by to zajęło…

Sposób drugi (nu skool)
PomyÅ›laÅ‚em, “hej, musi być inna droga”.
Pomocny, po raz kolejny, okazaÅ‚ siÄ™ Eclipse. Aby usprawnić caÅ‚y proces (który zajmie nam ok 30-60 sekund) musimy przejść na perspektywÄ™ “SVN Repository Exploring”. NastÄ™pnie wybieramy w panelu “SVN Repositories” repozytorium i włączamy podglÄ…d historii (“Show history”).

W panelu “History” zaznaczamy interesujÄ…ce nas rewizje i z menu kontekstowego wybieramy “Generate ChangeLog”:
eclipse_svn_changelog_1

W okienku, które się otworzy, mamy wybór jaki format ma mieć nasz changelog oraz gdzie ma być zapisany (w schowku czy na dysku):
eclipse_svn_changelog_2

Wybrałem domyślne ustawienie (svn log + schowek). Wkleiłem do edytora zawartość schowka i oto co otrzymałem:
eclipse_svn_changelog_3

Podsumowanie
Jak widać cała operacja jest bardzo prosta i w pełni zautomatyzowana. Co więcej, jest bardzo pomocna :)

Powoli nadchodzi Zend Framework w wersji 2.0. Wcześniej zobaczymy Zend Framework 1.10, która prawdopodobnie będzie ostatnią wersją z obecnej gałęzi.
W wersji 2.0 szykuje siÄ™ wiele znaczÄ…cych zmian. Zacznijmy od tego, że framework bÄ™dzie przepisany. BÄ™dzie wykorzystywaÅ‚ namespace‘y, a wiÄ™c minimalne wymagania do uruchomienia to PHP 5.3.

Największy nacisk położony będzie na MVC. W mapie drogowej, umieszczonej niedawno na wiki, wypunktowano pakiety, które zostaną poddane refactoringowi. Są to:

  • Zend_Controller 2.0
  • Zend_Controller_Router 2.0
  • Zend_View 2.0
  • Zend_Session 2.0
  • Zend_Form 2.0

    Pozostałe komponenty, które zostaną przepisane:

  • Zend_Soap 2.0
  • Zend_Mail 2.0

Zmianie ulegnie także architektura pluginów, gdzie zostaną zastosowane nowe wzorce projektowe. A część kodu frameworka, która używa Singletona zostanie przepisana, gdyż w pewnych sytuacjach (głównie testowanie) sprawia problemy.
Więcej informacji na wiki.

Jak na razie nie wiadomo nic na temat planowanych terminów wydań 1.10 i 2.0.

Stało się dziś w korpo tak, że od rana nie było sieci na głównym łączu. Backupowe działało, ale serwery (dostępne w sieci lokalnej) nie były skonfigurowane do korzystania drugiej bramy. Nie wnikam.
W każdym razie, admin zaproponował mi dopisanie domeny do pliku hosts, dzięki czemu cały ruch odbył by się w obrębie sieci lokalnej.

ZnajÄ…c sprawÄ™ sprzed lat, kiedy jeszcze używaÅ‚em Windowsa (a tak konfigurowaÅ‚em sobie domeny, aby móc korzystać z lokalnej instancji Apache‘a), zaczÄ…Å‚em od wyszukania pliku. Zazwyczaj znajduje siÄ™ on w katalogu drivers dostÄ™pnym w folderze zawierajÄ…cym system (np: C:\Windows\System32\drivers\etc\hosts). Co ciekawe w XP x64 nie widać zawartoÅ›ci katalogu drivers!
Poguglowałem i znalazłem opis sytuacji na na stronach Microsoft.

W międzyczasie w linii komend udało mi się wejść do katalogu etc (mimo, że dir nie wskazywał, iż takowy w ogóle istnieje!). Co ciekawe widząc, że plik istnieje (po zmianie folderu na etc mogłem wylistować jego zawartość) mogłem bez problemu edytować go w edytorze Notepad++.

Na całą operację straciłem ok 15 min. Pod linuxem (Debian/Ubuntu) zajęłaby mi max dwie minuty. Tam wystarczy wyedytować /etc/hosts i zrestartować połączenie.

Wniosek
MS Windows (zwłaszcza XP x64, który IMO jest mega porażką) wcale nie jest przyjaźniejsze od Linuxa ;)

Archiwa