Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM

Autor wpisu: batman, dodany: 16.10.2010 12:57, tagi: jquery, javascript

Nie tak dawno, bo zaledwie dwa miesiące temu, ekipa odpowiedzialna za jQuery ogłosiła rozpoczęcie prac nad mobilną wersją biblioteki. Dzisiaj programiści otrzymali w swoje ręce pierwszą wersję alfa jQuery Mobile.

W wydanej właśnie wersji mamy do dyspozycji takie komponenty jak:

  • zarządzanie wyglądem (Theming)
  • kontrolki formularza
  • okna dialogowe
  • widoki list
  • zdarzenia
  • efekty przejścia

Biblioteka jQuery Mobile została napisana w taki sposób, aby była jak najbardziej przyjazna dla użytkownika. Udało się to uzyskać poprzez zastosowanie szeregu dobrych praktyk. Są to między innymi:

  • Progressive Enhancement – progresywne rozszerzanie funkcjonalności. Nowa biblioteka skupia się na dodawaniu funkcjonalności do już istniejącej treści. Dzięki takiemu podejściu, przeglądarki nieobsługujące Javascript będą w stanie poprawnie wyświetlić stronę.
  • Graceful Degradation – stopniowe zmniejszanie jakości prezentowanych treści w zależności od funkcjonalności obsługiwanych przez przeglądarkę. Dzięki temu eliminuje się zero jedynkowe podejście do problemu, czyli działa – nie działa. Oznacza to tyle, że w przypadku braku obsługi jakichś właściwości CSS, przeglądarka wyświetli standardowy element, np. przycisk pozbawiony gradientów, cienia, itp.
  • konfiguracja oparta o język znaczników – jQuery Mobile nie wymaga do konfiguracji ani jednego wiersza Javascript. Wszystko odbywa się w kodzie HTML poprzez odpowiednie atrybuty.
  • niewielki rozmiar – w przypadku urządzeń mobilnych, rozmiar ma znaczenie. Cały kod Javascript “waży” zaledwie 12KB, a CSS 6KB.

Skąd pobrać?

Niestety w chwili powstawania tego wpisu, wszystkie linki prowadzące do dokumentacji oraz do plików źródłowych były niepoprawne. Dlatego też odsyłam was na oficjalną stronę projektu, gdzie w niedługim czasie powinny się pojawić poprawione linki.

Autor wpisu: matipl, dodany: 15.10.2010 12:13, tagi: php

Zend FrameworkKto by przypuszczał, że Zend Framework 1.11 wniesie tyle świeżości.

Wczoraj została udostępniona jako wersja BETA1 i robi spore wrażenie.

Wsparcie dla wersji mobilnych (Mobile Support)

Prawdziwa rewolucja. Zend Framework 1.11 posiada wsparcie dla urządzeń mobilnych. Wszystko za sprawą Raphael Carles (CTO Interakting), który napisał Zend_Http_UserAgent. Nowy komponent ma za zadanie wykryć User-Agent’a oraz na tej podstawie sprawdzić możliwości urządzenia mobilnego. W łatwy sposób można dopisać backendy dla kolejnych urządzeń.

Dzięki wtyczce dla Zend_Application oraz Zend_View_Helper_UserAgent w łatwy sposób możemy dostosować generowane dane wyjściowe z uwzględnieniem urządzenia, dla którego serwujemy tą treść (różne layouty, obrazki itp.).

Zend_Cloud: SimpleCloud API

Podczas ZendCon 2009 ogłoszono prototyp SimpleCloud API. W tej wersji mamy pierwsze oficjalne wsparcie od strony Zend Frameworka zawarte w Zend_Cloud. Dzięki temu możemy w chmurze korzystać z:

  • Document Services (Amazon SimpleDB i Windows Azure’s Table Storage)
  • Queue Services (Amazon Simple Queue Service, Windows Azure’s Queue Service, Zend_Queue)
  • Storage Services (S3, Windows Azure’s Blog Storage, Nirvanix, lokalny system plików).

W ten prosty sposób możemy przenośić swoje dane pomiedzy różnymi adapterami. W ciągu kilku miesięcy powinny pojawić się kolejne adaptery.

Podziękowania dla: Wil Sinclair and Stas Malyshev, którzy zainicjowali Zend_Cloud

SimpleDB Support

Od teraz ZF ma wsparcie dla Simple Storage Service (S3), Simple Queue Service (SQS), oraz Elastic Cloud Compute (EC2). Jest wprowadzona obsługa wszystkich operacji na SimpleDB poprzez Zend_Service_Amazon_SimpleDb.

Podziękowania dla: Wil Sinclair

eBay Findings API Support

eBay od dawna posiada rozbudowane REST API pozwalające programistom tworzenie interakcyjnych aplikacji z dużą ilością danych. Nowy Zend Framework (1.11) zawiera Zend_Service_Ebay_Findings, które w pełni obsługuje eBay Findings API. Pozwala to na tworzenie zapytań przez programistów dot. szczegółów aukcji eBay z uwzględnieniem kategorii i słów kluczowych.

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

Autor wpisu: batman, dodany: 15.10.2010 08:10, tagi: zend_framework

Wydawać by się mogło, iż ekipa odpowiedzialna za Zend Framework skupi się na drugiej wersji tego frameworka, a do wersji pierwszej będzie wydawać jedynie poprawki. Nic bardziej mylnego. Dziś ukazała się wersja beta frameworka oznaczona numerem 1.11. Wydanie to oferuje szereg nowych funkcjonalności, między innymi:

  • Zend_Http_UserAgent – wykrywanie urządzeń mobilnych. Od tego wydania znacznie prościej będzie tworzyć aplikacje oparte o Zend Framework na urządzenia mobilne
  • Zend_Cloud – implementacja SimpleCloud API.
  • obsługa SimpleDB, nierelacyjnej bazy danych dostarczanej przez firmę Amazon.
  • Zend_Service_Ebay – dzięki tym klasom programiści zyskają możliwość pobierania informacji na temat aukcji, kategorii oraz wyszukiwać po słowach kluczowych
  • nowe formaty konfiguracji frameworka – od wersji 1.11 będzie można korzystać z plików konfiguracyjnych w formacie JSON oraz YAML.
  • Zend_Service_ShortUrl – dzięki tej funkcjonalności będzie można korzystać z popularnych “skracaczy” linków
  • nowe helpery widoku:
    • Zend_View_Helper_UserAgent – wykorzystujący Zend_Http_UserAgent
    • Zend_View_Helper_TinySrc – helper pozwalający w zależności od urządzenia, na którym wyświetlana jest strona, na podmianę grafik
    • Zend_View_Helper_Gravatar – implementacja Gravatar API, pozwalająca na korzystanie z usługi Gravarat
  • poprawa bezpieczeństwa

Najnowszą wersję frameworka znajdziecie pod adresem: framework.zend.com/download/latest

Autor wpisu: batman, dodany: 14.10.2010 08:00, tagi: jquery, javascript

Na początku miesiąca napisałem recenzję książki jQuery. Poradnik programisty. Od tego czasu przeczytałem ją jeszcze raz i z czystym sumieniem oddam ją komuś, kto jako pierwszy odpowie na następujące pytanie.

Co to za miejsce i gdzie się ono znajduje?

DSC09105

Jakiś czas temu pisałem o tym miejscu, więc wystarczy poszukać w archiwum. Odpowiedzieć można w komentarzu pod postem lub wysyłając wiadomość przy pomocy formularza kontaktowego. Powodzenia!

Autor wpisu: batman, dodany: 12.10.2010 08:00, tagi: php, symfony

Programistę aplikacji internetowych, którzy nie korzysta z żadnego frameworka, można porównać do stolarza, który produkuje meble przy pomocy młotka i gwoździ. Niby się da, ale efekt końcowy jest zawsze taki sam – opłakany. Taka właśnie myśl przyświecała mi podczas poznawania frameworków PHP. Ostatecznie mój wybór padł na Zend Frameworka i nie żałuję tej decyzji. Jakiś czas temu przeczytałem wpis Zyxa na temat EventDispatchera, który można zleźć w Symfony 2 i postanowiłem sprawdzić o co tyle szumu. Od razu zaznaczę, iż wszystkie moje wnioski dotyczą nieukończonej jeszcze wersji 2 (celowo nie zaglądałem do aktualnej wersji – 1.4), a co za tym idzie coś, co teraz nie działa, może być naprawione w stabilnej wersji. Co więcej, moje podejście do frameworków PHP jest nieco wypaczone ze względu na ZF, więc zanim zaczniecie po mnie jeździć jak po łysej kobyle, weźcie to pod uwagę.

Instalacja

Na ten temat zbyt dużo nie da się napisać. Ściągamy gotowy sandbox, rozpakowujemy na serwerze i uruchamiany testową stronę. Proste jak konstrukcja cepa.

Pierwsze kroki

Jak to zwykle bywa w przypadku nauki czegoś nowego, staramy się oprzeć na zdobytych wcześniej doświadczeniach. Nie inaczej było tym razem. Dzięki temu, że dobrze znam ZF oraz mam jakieś pojęcie o ASP.NET MVC, stosunkowo łatwo było mi się odnaleźć w strukturze projektu i aplikacji. Wprawdzie po przeczytaniu The Big Picture pojawiło się więcej pytań niż odpowiedzi, byłem jednak pozytywnie zaskoczony prostotą, jaką oferuje Symfony 2. Jedyne co mi się nie podobało to fakt, iż osoby nie mające pojęcia o frameworkach, rozbiją się o ścianę swojej niewiedzy, co może skutecznie ich zniechęcić do dalszej nauki.

Widoki

Na samym początku opisu natknąłem się na informację o szablonach Twig. Nie należę do zwolenników szablonów w PHP, więc nieco mnie zmartwiło, że framework ma takie coś wbudowane. Na szczęście można korzystać z czystego PHP.

Po tym niewielkim zgrzycie, zagłębiłem się w lekturę dalszej części przewodnika, w której opisane zostały szablony (Templates) oraz sloty (Slots). Generalnie, założenia nie odbiegają znacząco od tego, co poznałem w ZF. Zend_Layout, Zend_View oraz helpery widoku dobrze mnie przygotowały do tego, co zobaczyłem w Symfony 2.

Kontroler

Ta część była nieco enigmatyczna. Bez żadnego łagodnego wprowadzenia, od razy skok na głęboką wodę. Kolejny raz doświadczenie zdobyte podczas pracy z ZF zaowocowało. Opisane w tej części przewodnika formaty są niczym innym jak kontekstami znanymi z Zend Frameworka. Nieco inaczej się je definiuje, ale zasada działania jest identyczna.

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

Autor wpisu: Śpiechu, dodany: 10.10.2010 13:52, tagi: php

Czytając mądrą książkę dotyczącą optymalizacji witryn internetowych natrafiłem na narzędzie jpegtran, które wykona dla nas kawał dobrej roboty bezstratnie zmniejszając wielkość plików jpg.1 Dodatkowo przy okazji możemy wyrzucić część lub całość metadanych z pliku.

Użytkownicy czasem sami sobie robią krzywdę wrzucając zdjęcia do internetu robione komórkami z GPSem. Raz, że komórki podają swój model i inne parametry (np. przysłony), a dwa, że zapisują w metadanych dokładną lokalizację wykonanego zdjęcia (a tym samym np. czyjegoś domu).

Zmniejszenie wielkości pliku za pomocą jpegtran polega na optymalizacji tablic Hauffmana i ewentualnie dodanie trybu progresywnego (w miarę ładowania się zdjęcia polepsza się jego jakość na stronie WWW). Co ciekawe, dodanie progresywności również zaoszczędza kilka KB w zdjęciu.

Walka toczy się o ok. 20% wielkości pliku, czyli dosyć sporo. Jpegtran można sobie w Ubuntu znaleźć w Synapticu w ramach pakietu libjpeg-progs. Co do Windowsa radźcie sobie sami ;-)

Na koniec przedstawię owoc mojej godzinnej pracy: klasę, za pomocą której w php możemy sterować poczynaniami jpegtran. Jak zwykle po angielsku, ale za to komentarze i errory po polsku żeby nie było że jakiś stronniczy jestem. Jak to cudo działa? Na etapie tworzenia obiektu przyjmuje 2 parametry:

  1. Co zrobić z metadanymi pliku
    • none — wyrzucić wszystkie metadane
    • comments — zostawić tylko komentarze (mogą zawierać dane na temat licencji i/lub właściciela)
    • all — zostawić metadane tak jak są
  2. Jakie wykonać operacje na pliku
    • optimise — przeprowadza optymalizację tablic Hauffmana
    • progressive — dodaje tryb progresywny

Wystarczy sobie utworzyć obiekt JpegOptimiser i można za pomocą metody processImage przetwarzać obrazki, np. tak:

$jpg = new JpgOptimiser('none', array('optimise','progressive'));
$jpg->processImage('test.jpg', 'test_wyjsciowy.jpg');

Poniżej kod klasy:

<?php
class JpgOptimiser {
 
    /**
     * @var array tablica dopuszczalnych parametrow operacji graficznych
     */
    protected static $VALID_PROCS = array('optimise', 'progressive');
 
    /**
     * @var array tablica dopuszczalnych parametrow operacji na metadanych
     */
    protected static $VALID_META = array('none','all','comments');
 
    /**
     * @var array tablica najczestszych bledow z wyjscia i komunikat bledu
     */
    protected static $REGEX_OUTPUT_ERRORS = array(
            array('/jpegtran: not found/', 'nie wykryto jpegtran'),
            array('/can\'t open/', 'nie mozna otworzyc pliku'),
            array('/not a jpeg/i', 'to nie jest plik jpg')
    );
 
    /**
     * @var string przygotowana lista argumentow do uruchomienia w konsoli
     */
    protected $argsChain;
 
    /**
     * Wybor listy operacji do wykonania.
     * @param string $meta operacje wykonywane na metadanych; dopuszczalne: none, comments, all
     * @param array $procs operacje graficzne; dopuszczalne: optimise, progressive
     */
    public function __construct($meta = 'none', array $procs = array('optimise', 'progressive')) {
        $this->argsChain  = $this->parseArgs($procs, self::$VALID_PROCS, ' -');
        $this->argsChain .= $this->parseArgs(array($meta), self::$VALID_META, ' -copy ');
    }
 
    /**
     * @param array $args tablica parametrow wejsciowych
     * @param array $valid tablica parametrow dopuszczalnych
     * @param string $prefix znak poprzedzajacy argument
     * @return string przetworzony ciag argumentow
     */
    private function parseArgs(array $args, array $valid, $prefix) {
        $output = '';
        foreach ($args as $arg) {
            if (in_array($arg, $valid)) {
                // dorzucam myslnik przed parametrem i spacje na koncu
                $output .= $prefix . $arg . ' ';
            }
        }
        return $output;
    }
 
    /**
     * Przetwarzanie pliku.
     * Docelowo lepszym rozwiazaniem bedzie uzywanie SPLFileInfo.
     * @param string $srcFile nazwa pliku wejscowego
     * @param string $dstFile nazwa pliku wyjscowego (moze byc taka sama jak wejscowy)
     * @return bool
     */
    public function processImage($srcFile, $dstFile) {
        $output = shell_exec('jpegtran' . $this->argsChain . '-outfile ' . escapeshellarg($dstFile) . ' ' . escapeshellarg($srcFile) . ' 2>&1');
        try {
            return $this->isProcessingOK($output);
        }
        catch(Exception $e) {
            echo $e->getMessage();
            return false;
        }
    }
 
    /**
     * @param mixed $output
     * @return bool
     * @throws Exception
     */
    private function isProcessingOK($output) {
        if ($output === null) {
            return true;
        }
        else {
            // szukam znanych komunikatow bledow
            foreach (self::$REGEX_OUTPUT_ERRORS as $error) {
                if (preg_match($error[0], $output) != 0) {
                    throw new Exception($error[1]);
                }
            }
            // nie znaleziono znanych, rzucam cala tresc wyjscia
            throw new Exception($output);
        }
    }
}
  1. S. Souders : Jeszcze wydajniejsze witryny internetowe. Przyspieszanie działania serwisów WWW. Gliwice : Helion, 2010, s. 156–157.

Autor wpisu: batman, dodany: 10.10.2010 08:00, tagi: jquery, zend_framework

Jeśli mielibyście wskazać najpopularniejszą funkcjonalność wyszukiwarki (poza samym wyszukiwaniem), byłoby to najprawdopodobniej podpowiadanie wpisywanych słów. Autocomplete, bo o nim mowa, jest dostępny w Zend Frameworku w ramach biblioteki ZendX_JQuery. Jego zastosowanie jest wyjątkowo proste i sprowadza się do dodania do formularza jednego pola.

Polem tym jest ZendX_JQuery_Form_Element_Autocomplete. Wystarczy, że wskażemy adres, z którego będą wczytywane i mamy gotowy do użycia komponent.

Przykładowy formularz wygląda następująco

class Application_Form_Autocomplete extends Batman_Form
{
    protected function _renderForm()
    {
        $ac = new ZendX_JQuery_Form_Element_AutoComplete('ac');
        $ac->setJQueryParam('source', '/jquery/autocompletedata')
           ->setJQueryParam('minLength', 3)
           ->setJQueryParam('select', new Zend_Json_Expr('acSelected'))
           ->setLabel('Wpisz coś:');

        $this->addElement($ac);
    }
}

Jeśli chcemy, aby autocomplete działał, musimy ustawić przynajmniej jedną opcję – source. Bez tej opcji wyrzucony zostanie wyjątek informujący o braku źródła danych. Jako źródło podany został adres, z którego będą zwracane dane w postaci JSON. Pozostałe parametry są opcjonalne, a ich listę znajdziecie w dokumentacji jQuery. Jeżeli chcieli byście skorzystać z funkcji zwrotnych (w powyższym przykładzie jest to funkcja acSelected), musicie pamiętać o stworzeniu obiektu Zend_Json_Expr. Dzięki temu ciąg przekazany jako parametr nie zostanie zamieniony na zwykły string.

Akcja kontrolera odpowiedzialna za zwrócenie danych nie różni się niczym od pozostałych akcji, za wyjątkiem wywołania helpera json.

public function autocompletedataAction()
{
    // Wpisana przez użytkownika fraza
    $term = $this->_getParam('term');

    // Dane zwrócone do użytkownika. Mogą pochodzić z bazy danych, plików, itp
    $data = array(
        array(
    		'id' => 1,
    		'label' => 'pierwsza pozycja'
	    ),
        array(
    		'id' => 2,
    		'label' => 'druga pozycja'
	    )
    );

    $this->_helper->json($data);
}

Dane wpisywane w polu autocomplete przekazywane są w zmiennej term. Na jej podstawie można wyszukać odpowiednie informacje w bazie, pliku lub dowolnym innym źródle danych. Ważne, aby zapisać te dane w postaci tablicy. Jeśli zależy wam na dodatkowych danych, możecie stworzyć w tablicy kolejne klucze i wypełnić je odpowiednimi danymi. Dane te będą dostępne z poziomu Javascript po odebraniu odpowiedzi ze skryptu. Na samym końcu akcji wykorzystany został helper json, który jest odpowiedzialny za ustawienie odpowiedniego typu odpowiedzi oraz za wyłączenie layoutu.

I to wszystko. Jeden prosty formularz oraz jedna akcja i mamy zaimplementowaną funkcjonalność autocomplete.

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