Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM

Autor wpisu: Tomasz Kowalczyk, dodany: 13.05.2011 23:17, tagi: framework, php

Kiedy programuję aplikacje z wykorzystaniem różnego rodzaju frameworków, zawsze zastanawiam się, jak to jest, że ich twórcy potrafią wymyślić rozwiązania, dzięki którym codziennie oszczędzamy cenny czas. Na pewno jest to doświadczenie, na pewno swój wkład ma także talent danego programisty, ale istotną częścią jest także dogłębna znajomość języka programowania, w którym rzeczony framework jest tworzony. [...]

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:

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: Tomasz Kowalczyk, dodany: 10.05.2011 21:28, tagi: internet

Cygwin to bardzo przydatne narzędzie każdego użytkownika Windowsa, który chce poczuć "zew Linuksa" na swojej maszynie bez instalacji tego systemu. Jest jednak mały haczyk - nie wszystkie programy są dostępne jako wersje dla Cygwina, a te, które są, bardzo często są poukrywane w różnych dziwnych miejscach, przez co ich instalacja sprawia sporo problemów. Cygwin: Jak [...]

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 TABLE demo (
  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)

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

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„.

Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.