Prskavčí blog

Jen další blog o všem možné, teď od Prskavců.

phpfog - cloudové řešení pro PHP?

Pokud se zajímáte o cloudové technologie, tak možná znáte Heroku. Heroku je pěkné řešení pro Ruby, které vám umožní vytvářet aplikace v Sinatře nebo v Rails a deployment provádět pomocí Gitu. Pro PHP mi něco takového dlouho chybělo, ale začíná se částečně situace vylepšovat, protože je na světe PHP Fog.

Co vám přinese PHP Fog

Mě se na cloudovém řešení libí, že je to pro vývojáře jednoduché a praktické. Nemusím řešit server, jeho provoz. Jen si nastavím konfiguraci apache, php.ini a vytvořenou aplikaci si přes git push pošlu na server k deploymentu a za pár okamžiků to běží.

Podobně to lehce vyřeším i na svém serveru pomocí SSH a Capistrano, ale stejně se musím starat o instalaci VPS. Jednodušší varianta je jen hosting s SSH přístupem například co mám na Hostmonster. Tam je problém, ale se škálováním pokud by se stal projekt úspěšný.

Ukážu jak jsem během 5min rozběhl Zend Framework projekt s CouchDb hostovanou na couchone hostingu. Můžete použít MySQL, další db přímo hosting nepodporuje. Doufám, že to časem rozšíří hlavně o podporu PostgreSQL a některé NoSQL (CouchDb, MongoDb).

  • PHP Version 5.3.2
  • Apache Version 2.2.14
  • MySQL Version 5.1.41

Vytvoření nové aplikace

Po přihlášení, zatím přístup je omezen, registrace přes nějaké Sign Up kódy, dostupný link najdete na homepage PHP Fog. Pokud chci vytvořit novou aplikaci, musím si vybrat profil, kde jsou setupy pro známé frameworky nebo přímo aplikace.

Já jsem zvolil zend framework a pokračoval k dalšímu kroku, kde si vybere formu hostingu. Na prvních 6 měsíců můžete zvolit variantu zdarma. V dokumentaci se píše, že bude po těch 6 měsících nějak zpoplatněna. To si myslím, že není moc dobrý tah a autoři doufám od toho upustí.

Po zvolení tarifu tak se dostanete do nastavení kde je potřeba poladit pár věcí a udělat si checkout Git repository pro váš projekt. Najde si v nastavení také nastavení Vhostu apache a php.ini.

Hlavní nastavení je nahrání SSH public key pro přístup ke Gitu, podobně jako na Githubu. Škoda, že se nedá přímo integrovat například pomocí nastavení remote větve na Github server. SSH a FTP přístup není k dispozici.

Potom jsem udělal git checkout, nahrál do repository kód a pomocí git push spustil aplikaci, která běží na doméně podle jména které zadáte při vytváření aplikace. Provoz aplikace částečně můžete kontrolovat pomocí nahlížení do logů apache přes webové rozhraní.

Závěr

Projekt je na začátku a doufám, že bude mít štěstí a že se mu brzo objeví i další konkurenti, protože do Heroku to má daleko, ale jdou dobrou cestou. Trochu mi přijde cenová politika trochu dražší než bežná jiná řešení, ale asi to bude daň za provoz na Amazon cloudu (MySQL).

Pokud jste to někdo další vyzkoušeli nebojte se o to s námi podělit, případně nevíte někdo o dalších alternativách pro PHP?

 

 

Podpora profilování cachegrind/KCachegrind v Xdebugu

Dnes je část profilování v Xdebugu (http://xdebug.org) ukládána do souborů v KCacheGrind formátu. Tato funkce byla přidána do Xdebugu, ale není dle specifikace formátu. Byla vytvořena revezním inženýrstvým a tato stávající implementace obsahuje chyby a nepřesnosti.

Od verze 0.6 je KCacheGrind více striktní ohledně interpretace formátu a to způsobuje chyby při jeho používání s výstupy Xdebugu https://bugs.kde.org/show_bug.cgi?id=256425.

Vybraná částka bude použita, aby Derick Rethans mohl správně vyřešit problém s integrací Xdebugu/KCacheGrindu. Správně vyřešit znamená, že předělá celou část zapisu profilovacích souborů. Rozhodně se tedy nejedná jen o jednoduchou opravu chyby jako je přidání jednoho řádku.

Dnes 2.3.2011 byla částka úspěšně vybrána, všem co přispěli na dobrou věc děkuji.

PHPStorm 2.0 - nová verze multiplatformního vývojového prostředí

Dnes 14.2.2011 vyšela nová verze IDE pro PHP od JetBrains PHPStorm 2.0.

Hlavní výhody tohoto IDE

  • základní vlastnosti IDE
    • jednoduchá instalace
    • rychlý start
    • funguje na Windows, Linux a Mac OS X
    • jednoduchá konfigurace projektů, můžete začít kde chcete
  • inteligentní php editor
    • doplňování kódu
    • refaktoring
    • podpora pro Smarty a PhpDoc
    • rychlá navigace (fuzzy search)
    • editor pro mixování jazyků (html, js, xml, xsl)
    • vlastní různé konfigurace vzhledů IDE kompatibilní s IDEA platform (IDEA, Rubymine)
  • pokročilý javascriptový editor
    • procházení DOMu
    • javascriptový debugger
    • javascriptový refaktoring
    • jako u php je navigace v kódu a vyhledávání užití
  • html a css editor
    • podpora HTML5
    • Zen coding
    • validace a rychlé opravy
    • ukázky aplikovaných stylů
  • chytré prostředí
    • podpora pro phpunit
    • podpora verzovacích systémů (SVN, CVS, Git, Mercurial a další)
    • FTP a synchronizace vzdálených souborů
    • Lokální historie souborů
  • visuální debugger

Minulý rok jsem psal o verzi 1.0, od té doby prostředí bylo velmi vylepšeno a stále se pracuje na vylepšení. Jetbrains chtějí konkurovat Zend Studiu a to není lehký soupeř.

Osobně mě nejvíce vyhovuje fuzzy vyhledávání v souborech, kde lehce najdu při práci se Zend Frameworkem příslušnou šablonu ke controlleru a velmi slušně funguje i potřebné vyhledání užití nebo nápověda.

V práci používám Zend Studio. Doma jsem dříve pracoval v Netbeans. Minulý rok jsem si při přechodu Mac OS X si koupil licenci PHPStorm 1.0, která obsahuje i 1 rok podpory včetně všech upgradů (tedy i verze 2.0) na které pracuji doteď. Zadal jsme několik chyb a podnětů a všemi se vývojáři zabývali a nějak je řešili.

Závěrem chci říct, že IDE je potřeba vyzkoušet a uvidíte jak jak vám sedne. Trial verze je zdarma k vyzkoušení a pokud znáte platformu IDEA tak využijete i spoustu pluginů, které jsou pro IntelliJ IDEA a Rubymine.

Vytváření vývojového Virtuálního prostředí pomocí VirtualBoxu a Vagrantu

Oracle VirtualBox je známé virtualizační prostředí pro platformy linux, mac a windows. Já VirtualBox používám na linux, mám na něm Ubuntu, které používám na školení Subversion nebo na vývoj webových aplikací jako server. Do nedávna jsem to používal na Macu nebo Linux pro běh Windows apod. O tomto používání nechci dnes mluvit.

Vagrant je nástroj napsaný v Ruby, který nám umožňuje modifikovat virtualní stroj podle našich představ pomocí nějakého předpisu, který nám udělá co chceme. Ukážeme si to na příkladu, že připravím linuxový server pro webový vývoj s Apache, PHP5, MySQL, CouchDB.

Začneme instalací Vagrantu

sudo gem install vagrant
vagrant box add base http://files.vagrantup.com/lucid32.box

Vytvoříme si ukázkový projekt.

mkdir vagrant-lamp
cd vagrant-lamp
vagrant init

Musíme upravit Vagrantfile podle následujícího předpisu (pro Vagrant 0.7).

Vagrant::Config.run do |config|
  # All Vagrant configuration is done here. For a detailed explanation
  # and listing of configuration options, please view the documentation
  # online.

  # Every Vagrant virtual environment requires a box to build off of.
  config.vm.box = "base"

  config.vm.forward_port("http", 80, 8080)
  config.vm.forward_port("mysql", 3306, 3306)
  config.vm.forward_port("couchdb", 5984, 5984)

  config.vm.provision :chef_solo do |chef|
     chef.cookbooks_path = "cookbooks"
     chef.json.merge!({
        :mysql => {
            :server_root_password => "root"
        }
     })
     chef.add_recipe("vagrant_main")
  end

end

Vytvoříme si adresáře pro recepty a pro web.

mkdir cookbooks
mkdir public

Do cookbooks je potřeba nakopírovat recepty pro Chef. Doporučuji si vzít z Githubu celou cookbooks repository. git clone https://github.com/opscode/cookbooks.git

protože receptů je hodně, doporučuji si to dám někam mimo a nakopírovat jen potřebné recepty. Pro nás jsou to ty, které jsou v úvodu default.rb a některé navíc jako je třeba erlang pro couchdb.

do adresáře cookbooks jsem si nakopíroval tyto recepty z cookbooks repository.

apache2
apt
couchdb
erlang
git
mysql
openssl
php

Potom si vytvoříme vlastní recept, který celou akci Chefa v Vagrantu bude řídit.

mkdir -p cookbooks/vagrant_main/recipes
vim default.rb

Přidáme potřebné recepty

require_recipe "apt"
require_recipe "apache2"
require_recipe "mysql::server"
require_recipe "php::php5"
require_recipe "git"
require_recipe "couchdb"

Kromě instalace z receptů provede instalaci některý dalších balíčků v Ubuntu

# Some neat package (subversion is needed for "subversion" chef ressource)
%w{ debconf php5-xdebug subversion mc htop curl }.each do |a_package|
  package a_package
end

Vytvoříme si testovací vývojový web.

s = "dev-site"
site = {
  :name => s,
  :host => "www.#{s}.com",
  :aliases => ["#{s}.com", "dev.#{s}-static.com"]
}

použije se template uložena v vagrant_main/templates/default/sites.conf.erb a příslušné proměnné

# Configure the development site
web_app site[:name] do
  template "sites.conf.erb"
  server_name site[:host]
  server_aliases site[:aliases]
  docroot "/vagrant/public/"
end

modifikujeme si hosty

# Add site info in /etc/hosts
bash "info_in_etc_hosts" do
  code "echo 127.0.0.1 #{site[:host]} #{site[:aliases]} >> /etc/hosts"
end

přidáme některé knihovny přímo z repository Subversion

# Retrieve webgrind for xdebug trace analysis
subversion "Webgrind" do
  repository "http://webgrind.googlecode.com/svn/trunk/"
  revision "HEAD"
  destination "/var/www/webgrind"
  action :sync
end

nebo Git

# Retrieve adminer
git "Adminer" do
  repository "https://github.com/vrana/adminer.git"
  revision "HEAD"
  destination "/var/www/adminer/"
  action :sync
end

a další

# Latest Zend Framework version
subversion "Zend" do
  # repository "http://framework.zend.com/svn/framework/standard/trunk/library/"
  repository "http://framework.zend.com/svn/framework/standard/tags/release-1.11.3/library/"
  revision "HEAD"
  destination "/srv/lib/php/"
  action :sync
end

Potom je tu script, kterým se dá modifikovat práva pro MySQL, není problém si podobně udělat jakékoliv úpravy.

# Add an admin user to mysql
execute "add-admin-user" do
  command "/usr/bin/mysql -u root -p#{node[:mysql][:server_root_password]} -e \"" +
      "CREATE USER 'myadmin'@'localhost' IDENTIFIED BY 'myadmin';" +
      "GRANT ALL PRIVILEGES ON *.* TO 'myadmin'@'localhost' WITH GRANT OPTION;" +
      "CREATE USER 'myadmin'@'%' IDENTIFIED BY 'myadmin';" +
      "GRANT ALL PRIVILEGES ON *.* TO 'myadmin'@'%' WITH GRANT OPTION;\" " +
      "mysql"
  action :run
  ignore_failure true
end

pro funkční port forwarding u CouchDb modifikovat konfiguraci a potřeba dát po prvním spuštění dát vargant reload aby se tato poslední změna promítla do nastavení virtuálu.

# Replace 127.0.0.1 bind port with 0.0.0.0 is necessary for port forwarding
execute "port-forward-couchdb" do
  command "sudo sed -i 's/127.0.0.1/0.0.0.0/g' /etc/couchdb/default.ini"
  action :run
end

První spuštění pomocí

vagrant up

potom je potřeba pro CouchDb

vagrant reload

Kompletní repositář s tímto ukázkovým prostředím jsou dostupné na Githubu.

Pokud si rozbijete virtuál tak není problém začít znovu. Dáte vagrant destroy a potom znovu pustíte celý proces pomocí vagrant up.

Pokud se chcete přihlásit na virtuál použijte vagrant ssh.

Zend Framework a NoSQL pro ukládání logů ve webových aplikací, díl druhý o MongoDb

Jak už jsem psal v minulém díle o CouchDb není žádný problém v použití dokumentových databází na logy. Výhodou je že se nemusíte starat o schema, což se u aplikace tohoto druhu opravdu hodí.

Pro napojení Zend Frameworku na logování do MongoDb musíte mít nainstalovanou MongoDb extenzi do PHP. Bez ní se bohužel neobejdete. Log writer si vytvoříte snadno pomocí extenze Zend_Log_Writer_Abstract a provedete drobné úpravy pro práci s MongoDb jak obsahuje ukázka.

/** Zend_Log_Writer_Abstract */
require_once 'Zend/Log/Writer/Abstract.php'; 
/**
 * ZendLogWriterCouchDb
 * @throws Zend_Log_Exception
 */
class App_Log_Writer_MongoDb extends Zend_Log_Writer_Abstract
{
    /**
     * Db
     * @var Mongo
     */
    private $_db;
    /**
     * Db name
     * @var string
     */
    private $_dbname;
    /**
     * Collection
     * @var string
     */
    private $_collection;
    /**
     *
     * @param array $params
     * @return void
     */
    public function __construct($options)
    {
        if (!extension_loaded('mongo')) {
            throw new Exception('The MongoDB extension must be loaded for using this logger !');
        }

        $options = $options->toArray();
        if (is_null($options)) {
            $options['host'] = "localhost";
            $options['port'] = "27017";
            $options['db'] = $dbname;
        }
        if (isset($options['user']) && isset($options['pass'])) {
            $conn = "{$options['user']}:{$options['pass']}@";
        } else {
            $conn = "";
        }
        $this->_db = new Mongo("mongodb://$conn{$options['host']}:{$options['port']}/{$options['db']}");
        $this->_dbname = $options['db'];
        $this->_collection = $options['collection'];
    }
    /**
     * @static
     * @param  $config
     * @return
     */
    static public function factory($config)                                                                                                                 
    {
        $config = self::_parseConfig($config);
        return $config;
    }
    /**
     * @param array $event
     * @return void
     */
    protected function _write($event)
    {
        $m = $this->_db;
        $m->connect();
        $c = $m->selectCollection($this->_dbname, $this->_collection);
        $c->insert($event);
    }

    
}

a tímto jste vlastně hotovy. Celý kód najdete na githubu. V ukázce je ještě samozřejmě upravený controller pro zobrazování a obsahuje možnost vytvářet testovací data.

MongoDb můžete nainstalovat lokálně nebo použít hosting mongohq.com, kde základní databáze, která k testování stačí je zdarma. Potom se mi docela hodila utilita na Macu Mongohub, která poskytuje trochu konfortnější konzoli než webová konzole obsahující lokální instalaci. Na hostingu MongoHQ mají pěknou webovou administrační konzoli.

V PHP se kromě vlastní extenze dá ještě dobře použít pro Zend Framework knihovna Shanty Mongo, která zjednodušuje práci s Mongo Db na maximum.

Pokud budete chtít dělat složitější dotazy do MongoDb hodí se SQL to Mongo Mapping Chart.

Případné další tipy se nebojte napsat do komentářů.

Křest knihy 1001 tipů a triků pro PHP

Včera se konal křest knihy 1001 tipů a triků pro PHP Jakuba Vrány, prostředí Lokády v Praze Holešovicích bylo pekně vybráno. Jako ostatní jsem přišel podpořit Jakuba a koupit si jeho knihu s podpisem. Jirka Kosek se ujal role patrona knihy a pokřtil ji šampaňským jak se patří.

Zlatým hřebem večera byla dražba 1 výtisku knihy, který Jakub vlastnoručně vytiskl a měl první návrh obálky a autorovy poznámku. Tento výtisk vydražili po dramatickém boji zástupci skype.


@spazef0rze Tak jsme společně s @lukashudecek vydražili první výtisk knihy od @jakubvrana #php1001 za 6100 pro Paraple. K vidění bude ve Skype office.


Druhý výtisk byla verze s komentáři Davida Grudla a jeho korekturami. Tento výtisk byl opatřen polibky hlavních aktérů jak můžete vidět na videu Martina Hassmana.

Celková cena se vyšplhala na 10010 Kč. Celkový průběh dramatické držby jsem se snažil twittrovat, ale nebylo sto zachytit všechny příhozy.

Celkový výtěžek dražby Jakub věnuje kontu Paraple, taktéž část z nákupu knih při autogramiádě (3 Kč z každého prodaného výtisku).

Knihu jsem zběžně prohlédl a vidím v ní velký potenciál. Kniha je vhodná pro všechny PHP programátory, od začínajících, kterým může složit jako dobrý návod na to co zrovna řeší. Jednotlivé tipy jsou stručné, výstižné a jdou přímo k věci. Zkušenější programátoři asi nenajdou nic objevného, ale pár tipů vás jistě jako mne zaujme také.

Webexpo 2010 - Na co půjdu na konferenci

Webexpo 2010 je před námi a já se s vámi podělím na které přednášky chci jít.

Čtvrtek 23.9. Workshopy

Program je velmi nabitý a jasno je jen na workshopy, tam jsem si zamluvil hned dva.

Těším se na Symfony2 s kterým si celkem hraju, ale chci se naučit něco více a od koho lépe než hlavního vývojáře Symfony. Doctrine používám již nějaký rok v předchozí verzi 1.2 a sleduji Honzův seriál o Doctrine2 na zdrojáku.

Moc se těším na warp-up v Comu, to je moje oblíbená restaurace.

23.9. workshopy
09:30-13:30 Symfony2 - Fabien Potencier [ CEO, Sensio ]
14:00-17:00 Doctrine2 - Jan Tichý [ Medio Interactive ]
18:00 Warm-up party v Como

Pátek 24.9.

V pátek je to hned složitější jak si na začátek vybrat. V bloku od 10 do 11:30 je mnoho kvalitních přednášek.

Na Karla Minaříka bych rád šel, jeho přednášky jsou vždy super a zábavné. Ale CouchDb jsem prozkoumal a vyzkoušel v pár drobných aplikací, případně se podiskutuji s Karlem osobně. Po přečtení knihy “Back to Napkin” mě zajímá přednáška Visual Note Taking / Sketchnotes. Potom je tu PHP Room, kde mě zajímá hlavně přednáška Roberta Lemke.

V dalším bloku budu pokračovat v Agile room, kde chci vidět jak se na vývojový proces koukají jiný, to je věc, kterou řeším v práci každý den. Rozhodně bych si chtěl promluvit s Petrem Ferschmann o Flexibee, které také sám používám. Jak znám Martina Hujera, bude zajímavá i jeho přednáška o Windows Azure.

V dalším bloku ještě zůstanu v agilní sekci na přednášku Soft Skill Essentials for Software Craftsmen. Jak vývojář PHP bych určitě šel na přednášky vývojářů z firmy Skype. Už jsem je viděl na Poslední sobotě a Openmeetingu tak můžu doporučit.

Další blok absolvuji v PHP Room, Dericka znám z jiných konferencí a doufám, že ukáže něco víc než dneska umím s Xdebugem nějaké skryté know-how a nazorů na TDD není nikdy moc, uvidíme s čím se předvede Filip Šubr.

Nakonec půjdu do Development Hall, kde David předvede novinky v Nette Framework 1.0 a potom následuje Digit s Petrem Márou a Honzou Březinou, hostem bude konečně i David Grudl.

24.9.
10:00-11:30 Visual Note Taking / Sketchnotes - Eva-Lotta Lamm
Creating Clean Code with Aspect-Oriented Programming - Robert Lemke
11:45-13:00 Software Development = Learning - Maria Diaconu, Alex Bolboaca
14:30-16:00 Soft Skill Essentials for Software Craftsmen - Pierluigi Pugliese
16:15-17:30 Debugging with Xdebug - Derick Rethans
Vývoj v PHP řízený testy - Filip Šubr
17:45-19:00 Nette 1.0
Digit s Davidem Grudlem

Sobota 25.9.

Sobota na Webexpu je velmi plná, v prvním bloku se přesunu do Agile Room, kde jsem zvědavý na Scrum ve Seznamu a o tom jak prosadit ve firmě. U nás ve firmě Scrum ukončil před 2 lety a to jsem tam ještě nebyl. Zajímavé přednášky jsou Development Hall, přednáška Aleše Roubíčka bude jistě zajímavá a další přednáška o node.js a uplatnění Javascriptu na serveru jistě také zaujme.

Od 11:45 určitě zajdu na přednášku Vaška Vančury, protože jeho přístup ke flashi se mi velmi líbí a byl bych rád, kdyby se to více rozšířilo a nepáchali všechno v Adobe Flash Builderu.

Nejsem si jistý, zda nevynechám Symfony2 po tom co absolvuji workshop ve čtvrtek, ale uvidím. Potom se půjdu podívat na přednášku jak prodat agilní vývoj to se může hodit.

Nakonec Ryan Singer a jeho přednáška Designing from start to finish bude skvělé zakončení konference.

25.9.
10:00-11:30 A Year with Scrum in Seznam.cz - Tomáš Pergler
Scrum for Executives - Six Secrets for Success with Scrum - Boris Gloger
11:45-13:00 Příprava dat pro rychlé a malé aplikace ve Flashi - Vašek Vančura
14:30-16:00 Symfony2 - Fabien Potencier
16:15-17:30 Selling Agile - Paul Klipp
17:45-19:00 Designing from start to finish - Ryan Singer

Závěr

Myslím, že Vašek Stoupa se svým týmem udělal obrovský kus práce a doufám, že budu moci psát stejně pozitivní zážitky i po konferenci jako mám dojem před konferencí.

Upgrade Androidu na T-mobile G1 z 1.6 na 2.2 (aktualizováno 22.3.2011)

Mám G1 koupenou u T-mobille. Mám ji sotva rok a ve světě Androidu je celkem už skoro nepoužitelný telefon. Nikdy jsem nepřišel na chuť nahrávat si tam nové romky apod. Ale když vydal Google nový Android 2.2 Froyo s JIT tak jsem si říkal, že tohle přesně G1 potřebuje. Bohužel T-mobile i HTC se vykašlali na uživatele a jediné co chtějí aby jste si koupili nový telefon. Protože svoji G1 mám celkem rád a nechtěl jsem ji poslat do věčných lovišť tak jsem přistoupil na upgrade CyanogenMod 6.

Nečekejte nějaký úplný návod, rady apod. Pokud se chcete ptát využijte Android forum. Já jsem ale použil postup, který je ve wiki.

Postupoval jsem asi takto:

  1. Získal jsem root pomocí universal root
  2. Z marketu jsem nainstaloval ROM Manager
  3. Pomocí něj jsem nainstalo recovery rom RA 1.7
  4. Přes recovery jsem nainstaloval poslední radio, restartoval a ověřil ještě jednou, že je tam opravdu ta poslední verze, pokud to neuděláte a nainstalujete Danger SPL riskujete brick
  5. Potom pomocí recovery rozdělil SD kartu (nevím zda bylo nutné, měl jsem 2GB)
  6. Na SD kartu jsem uložil Rom a Google Apps Mini (full neobsahovala market)
  7. Na SD kartu jsem nahrál Danger SPL a nainstaloval a restartoval, potom jsem pomocí (Camera + tl. Vypnutí tel. najel do režimu, kde jsou vidět tančící androidi místo pruhů  a ověřil, že je vše ok, vypnete pomocí Přijmutí hovoru + Menu + Vypnutí tel.)
  8. Nastartoval jsem do Recovery (při bootu držet Home nebo z aplikace ROM manager) a dal jsem wipe a CyanogenMod 6 rom
  9. Stejným postupem jsem (bez wipe) jsem aplikoval Google Apps mini a provedl konečný restart
  10. První nabíhání trvalo trochu déle a jinak to jede ok.

Každopádně všem, kteří to chtějí se svojí G1 zkusit přeji štěstí a ať se jim zdaří upgrade jako mě a netrvá jim to tak dlouho. Já jsem se zasekl hlavně na tom, že jsem stáhl poškozený zip romky a než jsem na to přišel tak to chvíli trvalo a už jsem se bál, že mám z toho brick, ale recovery mě zachránila. Kontrolujte MD5 všech stažených souborů!

Nakonec pár obrázků z mojí webové kamery:

 

Aktualizace 22.3.2011

  • Aktualizace radia a kernelu, přidá vám 14MB RAM a umožňuje lepší chod nových ROMS 2.2.X
  • Poslední romku, kterou zkouším je Official AOSP 2.2 OTA, který nemá podporu češtiny, ale zatím mi to přijde jako nejlepší 2.2 romka, kterou jsem měl. Ještě případně poreferuji, zatím to vypadá dobře, předchozí pokusy mě přivedli až k tomu, že telefon byl tak pomalý až nepoužitelný po cca měsíci používaní. Obzvláště poslední CM pro G1.

Zend Framework a NoSQL pro ukládání logů ve webových aplikací, díl prvnío CouchDb

Použití databáze pro ukládání logů se používá často pro analýzu logů. Technicky napojit databázi RBMS (MySQL) pomocí Zend_Log_Writer_Db není žádný problém. Ale vidím tu nevýhodu v tom, že musíte mít schema podle toho co ukládáte za logy. Pokud se rozhodnete použít NOSQL databázi (CouchDb, MongoDb) nemusíte se o schema starat.

V tomto článku si napsat vlastní Zend_Log_Writer pro CouchDb a jak si potom lehce zobrazíme příslušné logy. Napíšeme si také jednoduchou map funkci pro view v CouchDb, kterou v aplikaci použijeme.

Nejprve si projedeme jak se používá Zend_Log_Writer_Db, syntaxi najdete v manuálu. Tabulka v db musí mít pevně dané schéma, která namapujete v konfiguraci writeru.

Implementaci vlastního App_Log_Writer_CouchDb provedeme třeba takto:

class App_Log_Writer_CouchDb extends Zend_Log_Writer_Abstract
{
    /**
     * Db
     * @var Phly_Couch
     */
    private $_db;
    /**
     * CouchDb host localhost default
     * @var string
     */
    private $_host;
    /**
     * Couchdb port 3184 default
     * @var int
     */
    private $_port;
    /**
     *
     * @param array $params
     * @return void
     */
    public function __construct($dbname, $options = null)
    {
        if (is_null($options)) {
            $options['host'] = "localhost";
            $options['port'] = "5984";
            $options['db'] = $dbname;
        }
        $this->_db = new Phly_Couch($options);
    }

    static public function factory($config)
    {
        $config = self::_parseConfig($config);
        return $config;
    }
    /**
     * @param array $event
     * @return void
     */
    protected function _write($event)
    {
        // action body
        $doc = new Phly_Couch_Document($event);
        $result = $this->_db->docSave($doc);
        // return array ok, id, rev
        $info = $result->getInfo();
        if (!$info['ok']) {
            throw new Zend_Log_Exception("Error in save to CouchDb");
        }
    }

}

Není na tom jak vidíte nic složitého, implementuje funkce _constructor, factory a write funkci a je to.

Samozřejmě je to kus Zend Frameworku, který potrebuje konfiguraci.

autoloaderNamespaces.phly = "Phly_"
autoloaderNamespaces.app = "App_"
; Options for CouchDb
couchdb.host = prskavec.couchone.com
couchdb.port = 80
couchdb.db = "test-log"

Pro správu CouchDb jsem použil vestavěný Futon.

Vytvořil jsem testovací db “test-log” a v ní pohled, který v kódu potom používám. Vytvoříte temporary_view, které potom při ukládání ložíte do příslušného designu a view. U mě to bylo použité logger/log_by_prior.

  function(doc) {
    if (doc.priority) {
       emit(doc.priority, [doc.priorityName, doc.timestamp, doc.message, doc.module, doc.controller]);
    }
  }

Toto view potom volá controller, který načítá data pro zobrazení dat z databáze.

class IndexController extends Zend_Controller_Action
{
    protected $_config;

    public function preDispatch()
    {
            $this->_config = new Zend_Config_Ini('../application/configs/'.
                    'application.ini', APPLICATION_ENV);
    }

    public function indexAction()
    {
         $db = new Phly_Couch($this->_config->couchdb);

         $this->view->form = $form = new App_Form_Filter();
         if ($this->getRequest()->isPost()) {
             $formData = $this->getRequest()->getPost();
             if ($form->isValid($formData)) {
                 $filterValue = $form->getValue('filter');
                 Zend_Debug::dump($filterValue);
                 if (empty($filterValue) && $filterValue===0) $filterValue = null;
                 $result = $db->view('logger','log_by_prior', $filterValue, array("db"=>$this->_config->couchdb->db));
             } else {
             $form->populate($formData);
             }
         } else {
            $result = $db->view('logger','log_by_prior', null, array("db"=>$this->_config->couchdb->db));
         }
         $this->view->docs = $result->toArray();
         $this->view->messages = $this->_helper->flashMessenger->getMessages();

         $logger = new Zend_Log();
         $r = new ReflectionClass($logger);
         $this->view->priorities = array_flip($r->getConstants());

    }

    public function logAction()
    {
          $id = $this->_request->getParam('id', 0);  

          $logger = new Zend_Log();
          $format = '%timestamp% %priorityName% (%priority%): '.
            '[%module%] [%controller%] %message%';
          $formatter = new Zend_Log_Formatter_Simple($format);

          $writer = new App_Log_Writer_CouchDb($this->_config->couchdb->db, $this->_config->couchdb);
          $writer->setFormatter($formatter);

          $logger->addWriter($writer);
          $logger->setEventItem('module', $this->getRequest()->getModuleName());
          $logger->setEventItem('controller', $this->getRequest()->getControllerName());
          $logger->log("Testovani chyba", $id);
          $this->_helper->flashMessenger->addMessage('Log item saved');
          $this->_helper->redirector('index');
    }

}

Controller obsahuje dvě akce a to vlastní zobrazení v indexAction a metodu, která záznamy vytváří logAction. V logAction je vidět výhoda neexistence schématu, protože jsem si přidal další informace bez potřeby měnit schéma databáze.

PHP a CouchDb

Použil jsem knihovnu Phly_Couch pro práci s CouchDb, jen jsem musel funkci lehce aktualizovat pro současnou verzi CouchDb 1.0.1, kterou jsem použil.

Aktualizovanou verzi Phly_CouchDb najdete v mém forku na githubu, celou ukázkovou aplikaci php_couchdb_logger také.

Pro přístup ke CouchDb můžete použít i jiné knihovny, například PHPillow, která vypadá celkem aktualizovaně. Já jsem použil knihovnu, kterou napsal Matthew Weier O’Phinney hlavně proto, že je psaná přímo pro Zend Framework. Má přehledný a dobře napsaný kód, kde jsem si upravil jen to co jsem se potřeboval.

CouchDb

Na Mac OS X si můžete nainstalovat CouchDb jako na linuxu ze zdrojáků nebo použít balík, který mi přijde ideální. Podrobné informace o instalaci jsou ve wiki, případně se podívejte tam.

Závěr

Myslím, že to je jednoduchý příklad jak například použít CouchDb, který se pro začátek práce s CouchDb může hodit. Pokud chcete dělat náročnějši vyhledavání na logy, je potřeba použit CouchDb Lucene. Pokud se chcete dozvědět více o CouchDb tak doporučuji jít na přednášku Karla Minaříka na letošním Webexpu.

V dalším pokračování si ukážeme jak by se to dělalo v MongoDb.

Jak jsem si koupil Amazon Kindle

Čtečka knih Amazon kindle byla nedávno s nástupem iPadu zlevněna tak jsem se rozhodl zakoupit ji pro své používání, protože již touto dobu používám kindle v telefonu s Androidem a na počítači.

Objednal jsem 8.7.2010 a doporučeno bylo 13.7.2010 pomocí UPS. Cena $187 (s pouzdrem a zálohou na clo $287) - cca 6000 Kč.

Kindle byl aktivovaný na můj účet na Amazonu. Firmware 2.3, provedl jsem upgrade na poslední verzi 2.5.2, která přidá možnost zaheslování, zoom v PDF, podporu facebook, twitter a další.

Dostat do Kindlu obsah není žádný problém, stačí ho připojit přes USB (microusb) a přenést přes mass storage. Pokud je PDF, Mobi čtečka se si s tím bezproblémů poradí. Pokud máte ePub, html je potřeba to převést. Můžete použít službu Amazonu, která vám za malý poplatek převede a pošle dokument. Toto řešení jsem nevyzkoušel, protože se mi nechtělo za to platit. Stáhnul jsem si kindlegen, pomocí kterého si to můžete převést sami. Převedl jsem HTML manuál PHP (40MB) do formátu mobi (16MB). Převod trval 1h, ale úspěšně se to provedl. V Kindlu pokud chcete vyhledávat chvíli trvá než si ho zaindexuje.

Pokud chcete nějaké české tituly tak kromě PDF (napr. knihy.nic.cz) dopočuji i palmknihy.cz, kde sice Kindle není přímo zmíněn, ale formát Mobi Unicode funguje bez problémů. Jako další dobrý zdroj se dá použít Elektronická knihovna Root.cz, kde se najdou volné tituly ke stažení anglicky i česky.

Samozřejmě máte v angličtině k dispozici 620 000 titulů přímo na Amazonu. Nejsou to jen knihy, ale i časopisy a noviny. Z čech tam najdete jenom Prague Post . Kdybu měli Mladou frontu, tak si ji hned předplatím.

Pokud máte zajímavé typy pro Kindle tak se námi podělte v komentářích, pokud nic o elektronických čtečkách nevíte doporučuji článek Martina Hassmana a postřehy Marka Prokopa.