Autor wpisu: sokzzuka, dodany: 12.05.2011 15:41, tagi: php
Od czasu rozpoczęcia się wątku o PHP 5.4 na liście php.internals, jak bumerang powrócił temat adnotacji. Nasi drodzy deweloperzy doszli do nowego konsensusu (poprzedni odrzucał adnotację) i stwierdzili, że może nie są jednak one takie złe. W efekcie tego powstała nowa propozycja RFC, główne zmiany jakie w niej widzę, to zmiany składniowe (o które były największe bitwy ostatnim razem). W nowej propozycji adnotacje mają postać miksu phpDoc i formatu JSON. Nowa składnia behold:
/** * Foo class. * * @Entity {repositoryClass: "FooRepository"} * @Table {name: "foos"} * * @author "Guilherme Blanco" */ class Foo { // ... }
Na pierwszy rzut oka zdaję się być kompatybilna z istniejącym rozwiązaniem (phpDoc). Jednak wszystko zależy od konkretnej implementacji parsera. Wykorzystanie:
$reflClass = new \ReflectionClass('Foo'); var_dump($reflClass->getAnnotations()); /* array(3) { ["Entity"]=> object(ReflectionAnnotation)#1 (1) { ["value"]=> object(stdClass)#1 (1) { ["repositoryClass"]=> string(13) "FooRepository" } } ["Table"]=> object(ReflectionAnnotation)#2 (1) { ["value"]=> object(stdClass)#1 (1) { ["name"]=> string(4) "foos" } } ["author"]=> object(ReflectionAnnotation)#3 (1) { ["value"]=> string(16) "Guilherme Blanco" } } */
Propozycja będzie jeszcze pewnie wiele razy dyskutowana, oczekujcie więc więcej informacji z tego pola bitwy
Autor wpisu: sokzzuka, dodany: 11.05.2011 11:00, tagi: php
Ostatnio w pracy zajmuję się ciekawym projektem, przy okazji którego, będziemy zbierać pewne dane statystyczne. Danych tych będzie z pewnością bardzo dużo. Wobec tego bazując na swoich poprzednich doświadczeniach, zdecydowaliśmy, że najlepiej będzie przenieść nasze statystyki w chmury. Wybór padł na bardzo popularną i znaną usługę Amazona, a konkretnie – SimpleDb. Jest to nierelacyjny magazyn danych, idealnie nadający się do naszych zastosowań – nieograniczona pojemność i duża szybkość. Jego zaletą również jest to, że w każdym miesiącu dostajemy 25 maszyno-godzin i 1Gb storage’u za free. Można więc go testować w zasadzie za darmo bez ograniczeń. Ile to jest maszyno-godzina mnie nie pytajcie, ale sądzę, że do testów tak czy inaczej wystarczy . By używać usługi SimpleDb, najłatwiej zaopatrzyć się w jakiś napisany w PHP adapter, ponieważ „czysta” komunikacja z jej API odbywa się za pomocą REST lub SOAP-a, co może być trochę uciążliwe. Mój wybór padł na komponent w ramach Zend Framework – Zend_Service_Amazon_SimpleDb. Niestety nie ma do niego żadnej oficjalnej dokumentacji. Pomyślałem więc, że to dobry temat na wpis.
By zacząć zabawę z SimpleDb, należy przede wszystkim utworzyć sobie konto, przy okazji czego zostanie nam wygenerowana para kluczy – accessKey i secretKey, które potem posłużą do autoryzacji przy łączeniu się z dowolnymi usługami Amazona. Muszę jeszcze nadmienić, że do korzystania z tej chmury potrzebujemy karty kredytowej i bez podania jej numeru nie uda nam się z niej skorzystać. Z innych kwestii bilingowo-finansowych warto jeszcze zwrócić uwagę na pewien szczegół – każdy xml (przynajmniej dla SimpleDb) zawiera pole „box usage”, w którym zwraca nam czas jaki zajęło chmurze wykonanie zapytania. Dzięki temu możemy odliczać sobie ile jeszcze z darmowych 25 maszyno-godzin nam zostało do zabawy .
Czas przejść do najbardziej interesującej nas części – kodu. Zanim pokaże jak używać Zend_Service_Amazon_SimpleDb, pragnąłbym ostrzec Was przed jedną rzeczą, mianowicie, z tego jak korzystałem z tej klasy mam wrażenie, że jest ona jeszcze w fazie beta i jest tam sporo błędów implementacyjnych (nie mówiąc już o mało intuicyjnym API).
By skorzystać z klasy Zend_Service_Amazon_SimpleDb należy najpierw utworzyć jej instancję w następujący sposób:
$accessKey = 'SampleAccessKey'; $secretKey = 'SampleSecretKey'; $service = new Zend_Service_Amazon_SimpleDb($accessKey, $secretKey);
Gdzie secretKey i accessKey są odpowiednio kluczami, które dostaliśmy przy zakładaniu konta.
Nim wprowadzimy jakieś dane do naszej bazy należy utworzyć tzw. domenę. Czym jest owa domena ? Domena jest tak-jakby odpowiednikiem tabeli w klasycznej bazie danych, z tą różnicą, że nie ma żadnego schematu, tj. dane które w niej przechowujemy nie muszą (ale powinny) być w jakikolwiek sposób podobne. By pobrać listę domen należy wykonać następujący kod:
$page = $service->listDomains(); $domains = $page->getData(); var_dump($domains); //array(0 => 'domena1', 1=> 'domena2');
Oczywiście rozpoczynając naszą zabawę z SimpleDb nie mamy jeszcze żadnych domen utworzonych dla naszej instancji bazy. By je utworzyć należy wykonać:
$result = $service->createDomain('test'); var_dump($result); //boolean true
Gdy mamy już utworzoną domenę, możemy zapisywać dane w naszej bazie. By coś zapisać, najpierw należałoby się zapoznać ze strukturą danych jakie przyjmuje SimpleDb. Każdy „wiersz” w tej bazie składa się z identyfikatora (nazwy) oraz atrybutów. Pojedynczy atrybut dla wiersza, może mieć wiele wartości (być tablicą). Nazwę / identyfikator niestety (a może i stety) musimy wygenerować sobie sami. Osobiście moja strategia generacji ID polega na hashowaniu aktualnego czasu z mikrosekundami (microtime(true)). Skoro już wiemy jak wygląda struktura naszych danych, czas by coś wpisać.
$itemName = sha1(microtime(true)); $data = array( 'foo' => 'bar', 'baz' => 'boo', 'gaz' => array(1,2,3,4,5) ); $attributes = array(); foreach($data as $name => $values){ $attributes [] = new Zend_Service_Amazon_SimpleDb_Attribute($itemName, $name, $values); } $service->putAttributes('test', $itemName, $attributes);
Jedna mała uwaga co do zapisywania pól, które mają więcej niż jedną wartość – jeżeli będzie to tablica asocjacyjna to klucze zostaną utracone. W takim przypadku najlepiej po prostu serializować takie pole (o ile nie będziemy po nim wyszukiwać).
Zapisane dane można wydobywać z bazy na dwa sposoby. Pierwszy:
Autor wpisu: Tomasz Kowalczyk, dodany: 10.05.2011 21:28, tagi: internet
Autor wpisu: singles, dodany: 10.05.2011 19:45, tagi: mysql
MySQL i porównywanie ciagów z zachowaniem wielkości znaków
Zdarza się, że podczas programowania aplikacji internetowej opartej na MySQL potrzebujemy porównania z zachowaniem wielkości znaków, gdyż domyślnie porównanie wykonane jest bez zwracania uwagi an wielkość liter. Wpis ten przybliży metody, w jaki sposób można tą funkcjonalność osiągnąć.
Wprowadzenie
Zachowanie takie wynika z tego, że ogromna większość tworzonych tabel posiada ustawiony tryb porównania z końcówką ci
– co znaczy nie mniej nie więcej case insensitive. Kiedy wylistujemy dostępne typy porównań za pomocą polecenia SHOW COLLATION;
, otrzymamy listę bez przyrostków cs
, czyli case sensitive. MySQL udostępnia kilka porównań tego typu. Wpisanie polecenia:
SHOW COLLATION LIKE '%_cs';
zwróci następujące rekordy:
+--------------------+---------+----+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +--------------------+---------+----+---------+----------+---------+ | latin1_general_cs | latin1 | 49 | | Yes | 1 | | latin2_czech_cs | latin2 | 2 | | Yes | 4 | | cp1250_czech_cs | cp1250 | 34 | | Yes | 2 | | latin7_estonian_cs | latin7 | 20 | | Yes | 1 | | latin7_general_cs | latin7 | 42 | | Yes | 1 | | cp1251_general_cs | cp1251 | 52 | | Yes | 1 | +--------------------+---------+----+---------+----------+---------+ 6 rows in set (0,00 sec)
Jak widać, nie ma tutaj żadnego typu, którego moglibyśmy użyć w polskojęzycznych aplikacjach. Dlatego musimy sobie poradzić inaczej – poniżej przedstawiam kilka sposobów.
Użyjemy prostej tabeli:
CREATE TABLEdemo
(id
int(11) NOT NULL AUTO_INCREMENT,name
varchar(100) DEFAULT NULL, PRIMARY KEY (id
) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Do tabeli dodane zostały dwa rekordy:
mysql> select * from demo; +----+------+ | id | name | +----+------+ | 1 | Foo | | 2 | FOO | | 3 | Bar | +----+------+ 3 rows in set (0,00 sec)
Autor wpisu: batman, dodany: 10.05.2011 08:00, tagi: php
Nie tak dawno temu pisałem na gorąco o PHP Fog, a już są pojawiły się pierwsze interesujące tematy z tym projektem związane. Dzisiaj na Twitterze PHP Fog zadał pytanie o nieznanym mi frameworku PHP o nazwie Agile Toolkit. Poświęciłem kilka minut na przejrzenie przykładów oraz zerknąłem do licencji. Okazało się, iż twórcy frameworka wymyślili sobie, że będą pobierać za niego opłatę (i to nie małą). Odłóżcie pochodnie, albowiem dostępna jest również wersja darmowa, która różni się tym, iż nie posiada wsparcia technicznego. Niemniej żądanie sporej gotówki za framework PHP spowodowało, że krew się we mnie zagotowała i odćwierkałem, dosyć niegrzecznie, co myślę o takiej licencji. Dosyć szybko moje ćwierknięcie zostało zauważone przez osoby związane z Agile Toolkit i wywiązała się krótka dyskusja na temat frameworka. Koniec końców, ściągnąłem ATK (skrót od Agile Toolkit) i zacząłem w nim dłubać.
Po godzinie zabawy z ATK okazało się, że jest to bardzo interesująca pozycja dla osób tworzących małe stronki. Agile w nazwie frameworka jest tutaj jak najbardziej na miejscu. Byłem w stanie bez większego problemu stworzyć prostą stronę z kilkoma podstronami.
Ciekawie prezentuje się funkcjonalność polegająca na dodawaniu nowych elementów do aplikacji. ATK rozwiązał to przy pomocy metody add, która jest w stanie dodać wszystko do wszystkiego. Możemy stworzyć stronę (klasę dziedziczącą po Page) i osadzić ją jako fragment większej całości w innej stronie. Do strony możemy dodać (również przy pomocy tej samej metody add) formularz, kod HTML, model, itd.
Skoro przy modelach już jesteśmy, nie można nie wspomnieć możliwości powiązania widoku z modelem. W najprostszej postaci wygląda to następująco.
$f=$p->add('MVCForm'); $f->setModel('Employee',array('name','salary')); if($f->isSubmitted()){ $f->update(); $f->js()->univ() ->successMessage('Employee added') ->execute(); }
Prawda, że proste?
Kolejnym interesującym elementem frameworka jest możliwość tworzenia skryptów JavaScript z poziomu PHP. Co więcej, mamy do dyspozycji bibliotekę jQuery, która również została opakowana w PHP.
Godzina to za mało aby poznać framework. Po tak krótkim czasie jedyne co mogę stwierdzić, to to, że nie była to stracona godzina. ATK sprawia wrażenie dobrze przemyślanego. Spróbuję stworzyć w nim coś większego i bardziej wymagającego. Jeśli ATK się sprawdzi, to w końcu będę miał coś małego, do błyskawicznego tworzenia niewielkich projektów.
Autor wpisu: sokzzuka, dodany: 09.05.2011 09:53, tagi: php
Wczoraj Stas Malyshev ponownie podniósł kwestię rozwoju PHP 5.4. Zaproponował następujący plan:
- od obecnej chwili do 18 maja mają być zgłaszane propozycje cech, które są pożądane w tej wersji
- 18 maja – początek dyskusji i głosowania nad cechami, które się znajdą w wersji finalnej
- 15 czerwiec – wersja alfa, wydzielenie brancha 5.4 z trunka, koniec z dodawaniem nowych ficzerów, tylko poprawki błędów i rozwój zaakceptowanych cech
- 20 lipiec – beta tylko poprawki błędów
- 24 sierpień – Release Candidate 1 i kolejne RC co 2 tygodnie
- Październik / Listopad – wersja finalna
Plan jaki zaproponował Stas wydaje się dość realistyczny i zyskał już poparcie Rasmusa Lerdorfa (BDFL PHP). Wszystkich ciekawych, co znajdzie się w PHP 5.4 zachęcam do czytania dokumentu „TODO„.