dominik bułaj

php developer & web designer

Archiwum kategorii ‘Web’ Category

Psi 0.14-rc2 już dostępne

Szybki news będący rozszerzeniem poprzedniego.

DostÄ™pna jest druga wersja kandydujÄ…ca Psi 0.14. Można jÄ… pobrać i testować ze strony Sourceforge. Zmian niewiele – poprawiono błędy zgÅ‚oszone po wydaniu wersji RC1.

Nastąpiła także planowana data oficjalnej (pełnej) wersji 0.14. Zamiast 22. listopada, najnowsze Psi ma ujrzeć światło dzienne 25. listopada.

Nowy projekt (a wÅ‚aÅ›ciwie dwa) majÄ… zostać oparte o Zend Framework. Niby wszystko piÄ™knie – no bo mamy “zajefajny” framework, który zrobi niemal wszystko (brakuje tylko faktu, że kawy nie parzy ;) ).

Chcąc mieć projekty pięknie od początku wykonane z użyciem Zend_Tool i Zend_Application generuje strukturę dokumentu. Przy czym, w ZF 1.8 zaleca się trzymanie wszystkich ustawień w konfiguracyjnym pliku INI (w celu odchudzenia klasy Boostrap).
WracajÄ…c do projektu – od razu zakÅ‚adam panel administracyjny – tworzÄ™ osobny moduÅ‚.
Moduł ten będzie obsługiwał kontrolę dostępu i autentyfikację opartą o bazę danych. Żeby nie powielać kodu dziesiątki razy chcę stworzyć plugin kontrolera, który sprawdzi czy a. user jest zalogowany; b. ma dostęp do zasobu. I tu zonk.

W dokumentacji jest napisane, że w pliku INI można podać listę pluginów:

plugins: array of front controller plugin class names. The resource will instantiate each class (with no constructor arguments) and then register the instance with the front controller.

W przykładzie wygląda to tak:

resources.frontController.plugins.foo = "My_Plugin_Foo"
resources.frontController.plugins.bar = "My_Plugin_Bar"

Niby wszystko jasne, tworzÄ™ dwie klasy dziedziczÄ…ce po Zend_Controller_Plugin_Abstract… Teoretycznie powinienem mieć możliwość wywoÅ‚ania metody preDispatch(), która może sprawdzić czy użytkownik jest zalogowany i czy ma prawa do zasobu. JeÅ›li nie to, w zależnoÅ›ci od sprawdzenia, albo przekierować go na formularz logowania, albo wyÅ›wietlić stronÄ™ z informacjÄ… o braku dostÄ™pu.
Teoretycznie – bo ten kod nie dziaÅ‚a (błąd Å‚adowania klasy, mimo że jest ona w include_path)!
Co wiÄ™cej straciÅ‚em dziÅ› 2 godziny na znalezienie “obejÅ›cia”. ObejÅ›cie to nic innego jak stworzenie metody _initPlugins() w Bootstrap i po staremu dodanie pluginów do front kontrolera:

protected function _initPlugins()
{
    $front = $this->bootstrap('frontController');
    $front->registerPlugin(new My_Plugin_Foo());
}

Przy okazji przejrzałem dokładniej dokumentację ZF i takie oto wnioski przyszły mi do głowy:

  • ZF to straszna kobyÅ‚a, która sama w sobie nie trzyma standardów – można to samo wykonać na 3 różne sposoby (framework chyba powinien narzucać jeden standard!?)
  • oficjalna dokumentacja jest nieaktualna
  • API tez nieaktualne (Zend_Version) pokazuje numer 1.9.3
  • jedynÄ… pomocÄ… sÄ… fora i bugtracker ZF

Do kolejnego razu! (oby można byÅ‚o powiedzieć coÅ› in-plus…)

Niemal rok temu pisaÅ‚em jak zainstalować system Trac w Ubuntu. Niedawno jednak przeinstalowaÅ‚em Ubuntu “od zera” (majÄ…c oczywiÅ›cie kopie wczeÅ›niejszej wersji systemu).

Przy okazji odbudowy systemu postanowiłem przenieść repozytoria svn z /var/lib/svn (jak podałem w zeszłorocznym wpisie) na /home/subversion.
Zmiana podyktowana jest wygodÄ… i wiÄ™kszym bezpieczeÅ„stwem – po prostu /home mam na osobnej partycji, dlatego nie tracÄ™ danych przy ewentualnym padzie systemu i koniecznoÅ›ci reinstalacji.

Jak zatem “przestawić” Trac’a, aby używaÅ‚ nowej lokalizacji repozytorium svn?

Po pierwsze edytujemy konfiguracje każdego z projektów trac (/var/lib/trac/[NAZWA PROJEKTU]/conf/trac.ini).

Odszukujemy liniÄ™:

repository_dir = /var/lib/svn/[NAZWA PROJEKTU]

i zamieniamy jÄ… na:

repository_dir = /home/subversion/[NAZWA PROJEKTU]

Otwierając stronę projektu w przeglądarce (http://127.0.0.1/projects/[NAZWA PROJEKTU]) zobaczymy ostrzeżenie o treści:
Warning: Can’t synchronize with the repository (The ‘repository_dir’ has changed, a ‘trac-admin resync’ operation is needed.). Look in the Trac log for more information.

Wszystko powinno być jasne. Przechodzimy do konsoli i wykonujemy następujące polecenie (będąc w /var/lib/trac):

trac-admin [NAZWA PROJEKTU] resync

Gotowe!

Rozumiem, że rozwój najpopularniejszego frameworka dla php, wymusza aktualizacje co jakiś czas. Nie rozumiem jednak dlaczego one są robione tak często! Czy nie można core framworka udostępnić oddzielnie a całą resztę (mało ważne moduły) wydawać jako dodatek. W ten sposób dodanie nowych dwóch Zend_Services_XXX nie powodowałoby konieczności zmiany numeracji całego frameworka?

Inna sprawa, że wiecznie poprawiane są błędy z poprzednich wydań. Czy nie można wydać czegoś dobrze sprawdzonego? Byłoby mniej kłopotów, a tak co miesiąc trzeba aktualizować framework (i nanosić poprawki w kodzie aplikacji, jeśli zmiany nie są kompatybilne wstecznie). CakePHP jest dostępny na dzień dzisiejszy w wersji 1.2.5, Symphony (do wyboru branche) 1.0 i 1.2.

A Zend Framework?
Wydana wczoraj wersji 1.9.3 po kilkudziesięciu minutach była już przeszłością. Szybko udostępniono 1.9.3PL1.

Rozumiem, że znaleziono błąd krytyczny, ale gdzie byli beta-testerzy?!

Wszystko to powoduje, że coraz bardziej jestem rozczarowany produktem firmowanym jako “w peÅ‚ni przetestowany” (Fully Tested – Extend Safely and Easily).

DziÅ› Google postanowiÅ‚o jeszcze bardziej urozmaicić interface swojego “programu” pocztowego – Gmail. Dodano cztery nowe motywy.

W zasadzie to nowe sÄ… trzy motywy. Czwarty to losowy – wybierany w momencie logowania do konta.

preview1

preview2

preview2

preview2

Motywy można zmienić (lub przeglądać) w ustawieniach Gmaila. Więcej informacji w pomocy Gmaila.

PS Zmiany wprowadzono także w Google Apps.

Psi 0.13 wydane

Psi logo Dziś wydano oficjalną wersję komunikatora Psi. Psi jest darmowym klientem Jabbera dostępnym na platformy: Windows, Linux, Mac OS, FreeBSD, OpenBSD oraz Sun Solaris.

Nowości w wersji 0.13:
- rozmowy głosowe (Jingle RTP)
- podstawowy handler XMPP URI
- możliwość permanentnego uznania certyfikatu za zaufany w momencie nawiązania połączenia
- system komend (Ctrl+7 w oknie rozmowy otworzy liniÄ™ komend)
- ogólne poprawki.

Psi można pobrać z oficjalnej strony oraz ze strony sourceforge.

Więcej o Psi możesz przeczytać na wikipedii (PL).

KolejnÄ… porcjÄ™ nowoÅ›ci zaserwowaÅ‚ nam Google. Po pierwsze, usÅ‚uga “Lista zadaÅ„” (Tasks) w Gmailu zostaÅ‚a udostÄ™pniona jako peÅ‚noprawny feature serwisu pocztowego. Teraz każdy może skorzystać z listy zadaÅ„ do zrobienia. Lista otwierana jest w dodatkowym panelu, który aktywujemy w lewym menu:
Taski
Taski udostępniono także z poziomu kalendarza.

Ale uwaga, jest znany błąd w tej usÅ‚udze. JeÅ›li używamy Google Apps i nie zostaÅ‚a aktywowana usÅ‚uga Czatu – taski nie zadziaÅ‚ajÄ…. Ponoć programiÅ›ci z Mountain View już pracujÄ… nad poprawkÄ….

Kolejną nowością jest otwarcie laboratorium w kalendarzu. Calendar Labs dostępne niestety jest na razie tylko w wersji angielskojęzycznej.
calendar labs
Aktualnie oferowane jest 6 różnych dodatków, m.in. zmiana tła kalendarza (wybieramy obrazek), dołączanie załączników z Google Docs czy World Clock.

A tak wyglÄ…dajÄ… taski w kalendarzu: calendar tasks apps

Google przypomni hasło SMSem

Google poinformowało o wprowadzeniu nowej opcji przypomnienia zapomnianego hasła do konta.

Od dziś można dostać tymczasowy kod do zresetowania (i ustawienia nowego hasła) poprzez SMS. Usługa działa także dla polskich numerów telefonów.

Przypomnienie hasla Google via SMS

Przyznam, że to całkiem dobry pomysł dla osób które na przykład mają tylko jedno konto e-mail (w usłudze Gmail) i dotychczas nie mieli możliwości odnowienia hasła bez konieczności założenia kolejnego konta.

Ustawienia przypomnień można dokonać na stronie Google Accounts.

Zasadniczo, aby otrzymać kopię projektu gotową do użycia poza repozytorium możemy skorzystać z komendy:

svn export

W ten sposób wyeksportujemy sobie projekt do jakiegoÅ› katalogu, który nie bÄ™dzie zawieraÅ‚ podkatalogów .svn (meta informacje Subversion). Niestety ma to też wady, zasoby z wÅ‚aÅ›ciwoÅ›ciami svn:ignore zostanÄ… pominiÄ™te… ale nie o tym mowa ;)

Powiedzmy, że mamy projekt współdzielony w jakimś repozytorium. Powiedzmy, że serwer repozytorium padł (i nie ma backupu) lub został wyłączony, czy w końcu całkowicie chcemy zrezygnować z pracy z SVN. Co zrobić w takim przypadku?
Okazuje się, że klient svn nie umożliwia odpięcia, tudzież wypięcia, projektu z repozytorium. W takim przypadku pomocna przydaje się znajomość powłoki. Wykonujemy, będąc w katalogu projektu, następującą komendę:

$ rm -rf `find . -type d -name .svn`

OczywiÅ›cie można to sobie uproÅ›cić. UżywajÄ…c Subclipse – plugina do Eclipse – wystarczy wybrać z menu kontekstowego projektu: Team > Disconnect.

Właśnie ukazał się Zend Framework w wersji 1.8 Beta 1. jest to kolejna wersja testowa przed finalną zapowiedzianą na koniec miesiąca.

Z głownych nowości:

  • Zend_Application (wsparcie dla bootstrapu)
  • Zend_Tool (generowanie projektów i komponentów)
  • Zend_CodeGenerator (IMHO narzÄ™dzie nieprzydatne)
  • Zend_Navigation (generowanie sitemap’ów i drzew linków)
  • Zend_Reflection (rozszerzenie możliwoÅ›ci php’owego reflection)
  • Zend_Tag (praca z tagami (etykietami))
  • dodatki i usprawnienia w Zend_Validate i Zend_Filter
  • usprawnienia w Zend_Search_Lucene i Zend_Pdf
  • nowa obsÅ‚uga uploadowanych plików w Zend_Form_Element_File

.

NajnowszÄ… wersjÄ™ można pobrać z oficjalnej strony framework‘a.

Dziś także ukazuje się nowa wersja Ubuntu. Ubuntu 9.04 nazwane Jaunty Jackalope.

Moje boje z kluczami obcymi w MySQL

Foreign Keys (klucze obce) to bardzo przydatna funkcjonalność w MySQL (silnik InnoDB). Umożliwiają zachowanie integralności danych i porządku w bazie (dzięki zdarzeniom ON DELETE i ON UPDATE).

Ostatnio straciÅ‚em prawie godzinÄ™ – lub nawet nieco ponad – gdyż za nic w Å›wiecie nie chciaÅ‚ mi siÄ™ zaÅ‚ożyć klucz obcy. Co ciekawe tabela byÅ‚a tabelÄ… łączÄ…cÄ… dwie inne (relacja 1:n – jeden news : kilka tagów), bÄ™dÄ…ca kopiÄ… innej – z subtelnÄ… zmianÄ… (inna nazwa jednego pola).

Okazało się, że nazwy kluczy obcych muszą być unikalne w skali całej bazy danych, o czym niestety nie wiedziałem:

If the CONSTRAINT symbol clause is given, the symbol value must be unique in the database. If the clause is not given, InnoDB creates the name automatically.

Cóż – niewiedza kosztuje, a czas to pieniÄ…dz. Mam nadziejÄ™, że wpis komuÅ› siÄ™ przysÅ‚uży ;)

REST to usÅ‚uga sieciowa używana do dystrybuowania treÅ›ci – głównie – pomiÄ™dzy aplikacjami internetowymi (tzw. web service). REST nie jest jedynym dostÄ™pnym web service; innymi popularnymi usÅ‚ugami sÄ… m.in. XML-RPC oraz SOAP.

Jako że REST jest prostym i lekkim protokoÅ‚em, jest on – obok XML-RPC – najczęściej wykorzystywany we wszelkiego rodzaju API (Application Programming Interface).
Jest lekki, bo wszelkie requesty są standardowymi żądaniami HTTP (wykorzystywane są przy tym metody GET, POST, PUT oraz DELETE). Odpowiedzi są standardowymi odpowiedziami serwera (nagłówki + treść), przy czym status odpowiedzi informuje o błędzie (np. 404 Not Found dla nieznanej metody, 401 Unauthorized w przypadku braku lub błędnej autoryzacji, 200 OK informujący o powodzeniu operacji).

W Zend Framework mamy gotowy komponent do obsługi REST, dzięki niemu możemy łatwo stworzyć zarówno klienta (Zend_Rest_Client), jaki i serwer (Zend_Rest_Server).

Serwer REST zbudowany z wykorzystaniem Zend_Rest_Server:

$rest = new Zend_Rest_Server();
$rest->setClass('MyClass');
$rest->handle();

Komunikujemy się z serwerem REST używając Zend_Rest_Client:

$restClient = new Zend_Rest_Client('http://example.com/api/rest');
$restClientResponse = $restClient->getDate()->get();

if ($restClientResponse->isSuccess()) {
    echo $restClientResponse;
}

WydawaÅ‚oby siÄ™, że to kompletne rozwiÄ…zanie – możemy zarówno coÅ› udostÄ™pnić, jak również odpytać. Niestety tak nie jest!
ZF umożliwia obsługę REST tylko z wykorzystaniem formatu XML. Co zatem mamy zrobić jeśli chcemy wykorzystać REST API obsługujące tylko format JSON (obok XML najczęściej stosowany format REST)?

RozwiÄ…zanie jest proste – do odpytania REST API w formacie JSON wykorzystamy Zend_Http_Client, a wynik dekodujemy korzystajÄ…c z Zend_Json.

Przykład odpytania REST API obsługującego format JSON:

$httpClient = new Zend_Http_Client('http://example.com/api/json');
$httpClient->setHeaders('Accept: application/json');
$httpClientResponse = $httpClient->request('get')->getBody();

OK, wiemy już zatem jak odpytać API obsługujące format JSON, wiemy też jak wykorzystać Zend_Rest do budowy/odpytania API wykorzystującego XML.
Co jeśli chcemy utworzyć serwer REST oferujący dane w formacie JSON (oraz XML)?

Musimy wykonać sprawdzenie – nagłówka Accept – i w zależnoÅ›ci, czy znajdzie siÄ™ tam application/json, czy nie, odpowiedzieć w odpowiednim formacie (domyÅ›lnie XML).

$rest = new Zend_Rest_Server();

$rest->setClass('MyClass');

$rest->returnResponse(true);
 // informujemy moduł, że chcemy przechwycić dpowiedź Zend_Rest_Server do zmiennej...
$response = $rest->handle();
 // ...i to też robimy, wywołują metodę handle()

// domyślny typ danych (xml)
$contentType = 'text/xml';

// sprawdzamy czy zadano danych JSON
if (preg_match('/(application\/json)/', $this->getRequest()->getServer('HTTP_ACCEPT'))) {

    // konwertujemy dane XML => JSON
    $response    = Zend_Json::fromXml($response, true);

    // nagłówek dla danych JSON
    $contentType= 'application/json';
}

// zwracamy dane ($response) z odpowiednim nagłówkiem Content-type
$responseObject = $this->getResponse()->setBody($response)->setHeader('Content-type', $contentType, true);

// pozostaje jeszcze wysłanie odpowiedniego statusu, zgodnie ze specyfikacją REST
$restHeaders = $rest->getHeaders();

// pobieramy nagłówki (drugi element tablicy - jeśli wystąpił błąd - zawiera status błędu)
if (isset($restHeaders[1])) {
    $responseObject->setRawHeader($restHeaders[1]);
}

Gotowe! Teraz możesz udostępnić własne API lub wykorzystać jedno z dostępnych :)

Zmiana adresu kanału RSS

Feedburner, kupiony kilka lat temu przez Google, jest właśnie integrowany w strukturę Google.
Stąd mała zmiana w adresie kanału RSS mojego bloga. Oczywiście Google obsługuje przekierowanie ze starego adresu na nowy, ale zawsze lepiej nie korzystać z pośredników ;)

Nowy adres kanału: http://feeds2.feedburner.com/DominikBulajBlog

jQuery 1.3.2 wydane

Wydano jQuery w wersji 1.3.2. Poprawiono w sumie 38 błędów, głównie związanych z obsługą selektorów oraz samym jądrem biblioteki.

Więcej o zmianach znajdziecie na oficjalnej stronie.

Nowe buildy PDT

Dostępne są nowe buildy (wersje przeglądowe) PDT (IDE do programowania w PHP bazujące na platformie Eclipse).

Mamy do wyboru aktualizację PDT 2.0.1 oraz najnowszą wersję, właśnie przygotowywanego, PDT 2.1.0. Aktualizacja 2.0.1 pochodzi z 5. lutego, natomiast uaktualnienie 2.1.0 wydano 12. lutego.

Miłego użytkowania ;)

Archiwa