ismerkedés a symfony2-vel (2.)

Tehát azt ígértem, hogy a project lezárása után elkezdjük az ismerkedést az symfonyval. Az első kérdés a letöltés után, hogy ok, mit hol találok?

Az app könyvtárban találhatóak a beállítófájlok, cache és a kernel. A kernel az mvc szemléletben felépített modulok (bundle-ök) betöltéséért, futtatásáért felel.

A bin könyvtárban lévő vendors fájl, a gyökérben lévő deps és deps.lock fájlok felelősek a symfony frissítéséért git tárolókból. A vendors a futtatható parancsfájl, a deps meg tárolja a függőségeket. Ide kell felvenni a szükséges paramétereket akkor, ha új 3rd party eszközre lenne szükségünk. Későbbiekben a symfonyban egy új csomagkezelést fognak bevezetni, ami nagyjából hasonlít a linuxokban megismert csomagkezelésre. Függőségeket lehet vele definiálni és a saját kódjainkat csomagokba szervezni. További infó az composerről.

Az src könyvtárban lesznek a kódjaink. A bundle egy komponens a symfonyban, amit mi írtunk. src/cégnév/projectnév/bundleneveBundle a bundle elérési útvonala. Ezzel az útvonallal (ami egyben namespace is) később, bizonyos alap összetevők kiszervezhetőek a vendors mappába is. A bundle Controller mappája tartalmazza a kontrollereket. A controller fájl és osztály suffixe minden esetben Controller. A bundle php fájl ami még szükséges, a többi mappának nem kötelező léteznie.

Vendor mappába frissülnek le a fentebb emlegetett komponensek. Symfony és 3rd party kiterjesztések. Itt is megfigyelhető egyébként a bundle szerű felépítés, a Symfony is egy bundle.

Web DocRoot. De ez lehet akármi.

OK! Most már megtalálom nagyjából a dolgokat a fájlrendszerben, hogyan kezdjek neki?

Symfony environment-ek

A environment-ek különböztetik meg a különféle futásokat. Így tudunk csinálni egy rendszerre dev, test, prod(uction) environmenteket. De akár egy symfony kódbázisra ráépíthetünk különféle projecteket, létrehozva ezzel projectneve1_dev, projectneve1_prod, projectneve2_dev … elnevezésű environmenteket. Az environmentek nevét a belépő fájl, az alap telepítéseben a web mappa docroot app.php és app_dev.php fájlja tartalmazza. Azt is itt írjuk le, hogy az adott environment debug módban fut-e (lásd kernel.debug paraméter később), vagy sem.

app.php 9. sor

$kernel = new AppKernel(‘prod’, false);

app_dev.php 15. sor

$kernel = new AppKernel(‘dev’, true);

A web mappát lemásolva és ezeket a paramétereket átírva új environmentet hozhatunk létre. Mondjuk egy új weboldalt.

A konzolos parancsok esetében (app/console a belépési pont) az –env kapcsolóban mi kézzel adjuk meg, hogy milyen environmentet akarunk futtatni. Ha lényeges akkor a további kapcsolókban a debug módot is megadhatjuk (cache újraépítésénél lényeges pl).

Environmentenként betöltődő bundle-ök.

Következő lépésként még azt is szeretnénk megadni, hogy mely bundle-ök töltődjenek be az egyes futások alkalmával. Ezt beállítani az app/AppKernel.php fájlban van lehetőségünk.


app/AppKernel.php 22. sor

if (in_array($this->getEnvironment(), array('dev', 'test'))) {

illetve


app/AppKernel.php 32-35. sor

public function registerContainerConfiguration(LoaderInterface $loader)
{
$loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
}

Az első kódban mutatott ponton ágaz(hat)nak el a különféle environmentek. Itt egy egyszerű switch szerkezettel el tudjuk különíteni a különféle environmenteket. A második kód mutatja, hogy az environment nevétől függően, hol keresi a belépő beállító fájlt az app config mappában.

Korábban az app és web mappábat úgy ahogy van másoltam, és úgy hoztam létre új elágazást. De szervesen összetartozó, ugyanakkor mégis külön részegységet alkotó environmentek esetén ez egy kicsit szorosabb integrációt tud eredményezni és karbantartani is egyszerűbb.

Legközelebb nekilátunk egy minta project és néhány tucat bundle létrehozásának.

Olvasnivaló:
How to Master and Create new Environments

symfony in progress

Az első után kicsit elmaradt a symfony2-ről a folytatás. A helyzet az, hogy a napokban fejezek be egy nagyobb lélegzetvételű projectet symfony2 alapokon. Ha azt lezárom, mindenképpen megosztom a tapasztalatokat! A honi hobbi project után azért sok megoldás született!

A mai agymenésem twitteren a következő témák körül forogtak:
– yaf nagyon jól néz ki (pecl-ben megírt MVC keretrendszer)! teljesítmény tesztek twitterpajtitól remélem érkezni fognak
– miért nem írnak több modult zend enginge-ben (c-ben) gyorsítva ezáltal a kódokat? minden adott! még akár 1 az 1ben átültethető lehetne a php kód, interface zend enginge alá.
– innentől gurult el a gyógyszer, egy mobilfejlesztő cégben ahol iphone kódokat túrunk, miért ne lehetne objective c-ben megírni a weboldalt?
– a múltkori crossplatform objective c kód után teljesen felvillanyozott az elgondolás, hogy objective c-ben írjak meg weboldalakat. Egyedül talán a doctrine-t kéne portolni objective c alá. iOS alatt a Core Data nagyjából teljesen megoldja az ORM kérdést. ezt kéne átültetni ebbe a környezetbe cserélhető DB backenddel (mysql, pgsql, oracle, sqlite stb). MVC elv nem tétel, más meg minden létezik lib szinten. max egy objc binding kell hozzá.
– későbbi megvizslatásra eltesszük a cappuccino-t és a frothkit-et. előbbi objective-j és kliens oldali kódot, javascriptet generál egy objective-cre hajazó kódhalmazból, utóbbi objective c és szigorúan szerver oldali. alaposabb ismerkedés és remélhetőleg egy éles project preview-ja közeljövőben érkezik!

telefon mint hangkártya

A régi laptopomat használom újra. Azon viszont rossz a hangkártya. Mivel elég muzikális egyén vagyok, az egy hét csönd itthon kissé sok. Így adva volt a feladat, csináljunk az androidból hangkártyát. Ehhez csak a rygel és a rygel-properties programokat kellett feltenni, illetve a telefonra a UPnPlay programot. Így a számítógépen lévő zenéket out-of-the-box tudom hallgatni. Az még nem egészen megy, hogy a PulseAudio stream-et is továbbítsa. Bár létezik modul és a pavucontrol-ban meg lehet adni, hogy mint kimenet jelenjen meg a lehetőségek között, hang mégsem jön ki a torkán. Ugyan így a banshee-t is látja a telefonos app, hang viszont nem jön. Gyanítom ha felerőszakolnám rá a legújabb rygel-t (0.12-nél járnak, 11.10-ben viszont még csak 0.10 van), akkor működne.

M.j.: 11.10 előtti verzióval nem sikerült, hibaüzenetet dobott a rygel.
M.j.2: annyira megtetszett a dolog, hogy hirtelen egy HTPC-t vizionáltam aminek egy android tablet a “kijelzője”. Elgurult a gyógyszer…

objc ubuntun

Az ember fia mivel múlassa szabad esti idejét mint olyan valami vad perverzióval, hogy objective c-ben ír ubuntu-n egy kis projectet? 🙂
Nosza nézzük mi kell hozzá!

Egyszerűség kedvéért most gcc-t fogunk használni llvm helyett. Mer’ az mindig kéznél van. 🙂

apt-get install libgnustep-base-dev

Csak ezt az egy csomagot kellett feltenni, egy könyvtárban létrehozni a main.m fájt és egy makefile-t.

main.m
#include
#include

@interface Hello
+ (const char *) Word;
@end

@implementation Hello
+ (const char *) Word;
{
return "Hello Word!";
}
@end

int main (void)
{
printf("%s\n", [Hello Word]);
return(0);
}

GNUmakefile
include $(GNUSTEP_MAKEFILES)/common.make

TOOL_NAME = hello
hello_OBJC_FILES = main.m

include $(GNUSTEP_MAKEFILES)/tool.make

Két parancs futtatása szükséges:

. /usr/share/GNUstep/Makefiles/GNUstep.sh
make

Ezek után ha mindent jól csináltunk akkor az obj/hello kiírja a stringet. 🙂

GNUStep doksi.

Hello Symfony2!

Még tavasszal kezdtem el foglalkozni a symfonyval. Mivel már akkor béta állapotban volt a kettes verzió, ezért leginkább azt fedeztem fel. Aztán annyira megtetszett, hogy a folkrádió újraírásánál is erre alapoztam.
Egy többrészes életszerű példán keresztül szeretném bemutatni, hogy mit tud és mit hol lehet benne megtalálni.

Telepítés

A symfony.com-ról kell letölteni a megfelelő fájlt. Abban az esetbe ha van telepítve GIT érdemes a without vendors verziót. Ez annyiban különbözik a másiktól, hogy a vendors könyvtárat, amiben az egész symfony lelke van, a netről szedi le és frissíti. Ez a parancs telepíti a vendorst:

bin/vendors install

A frissítés értelem szerűen update paraméterrel történik. Ha új verzió jön ki, elég ezt lefuttatni és a cache-t kiüríteni.

app/console cache:clear –env=dev

Az alkalmazás index a web mappa app.php vagy app_dev.php. Szabadon fel lehet venni új environmentet is és azt használni. A különféle környezetekhez lehet egyedi beállítást fűzni. Én például arra használom, hogy a migrációkor az adatbázis műveleteket ne naplózza. Ha ezt nem tenném meg, előbb utóbb bármekkora memória elfogyna, hiszen hatalmas adatbázist kell migrálni. Kezdetnek viszont teljesen elég a dev és a prod env.

na még egyszer

Egy éve helyreállítottam a blogot, aztán jött egy félresikerült upgrade majd elszállt megint. Most egy hozzászólás kapcsán vettem észre, hogy a maintenance lejött a blogról és használható. Így nekifutunk még egyszer a blognak. Utóbbi egy évem iOS fejlesztéssel és symfony2 ismerkedéssel telt, így ezeket a témákat szeretném kicsit megkörnyékezni.

Blogra fel!

eladó

Eladó egy LC-Power EH-35BSII típusú külső merevlemez-keret. Jellemzők: SATAII, usb2, esata.
Megkímélt állapotban, fél éves sincs talán.
Boltban újonnan 5500 Ft-ért láttam. 2500 Ft-ért odaadom.
Linux-szal out-of-the-box működik probléma nélkül.

things a dropboxban

Mivel a Things valami egészen elvetemült helyre teszi az adatbázis fájlját így kis trükközés kell, hogy a dropboxba szinkronizálható legyen. Az ehhez szükséges lépések:

1. Kapcsoljuk ki az esetleg futó Things-t.
2. Finderben keressük meg a ~/Library/Application Support/Cultured Code/ mappát és a Things mappát helyezzük át a dropboxba.
3. Indítsunk egy terminált és a következő sorokat gépeljük be:
ln -s “/Users/connor/Dropbox/Things” “/Users/connor/Library/Application Support/Cultured Code/Things”
Értelem szerűen a connor-t cseréljük le a saját home nevünkre.
4. Kiléphetünk.

Ha mindent jól csináltunk akkor a megfelelő symlink létrejött és az a megfelelő mappára mutat.

szégyen

http://picasaweb.google.hu/funtineli/AmikorAHargitaiRendszamuAutoKobanyanParkolAkkorAKedvesEsJoindulatuPolgarokIgy#

Szégyen és gyalázat bazdmeg! A nagy magyarkodó barma arra nem veszi a fáradtságot, hogy mielőtt kinyilvánítja hazaszeretetét a román rendszámú autót látva, megnézze, hogy melyik megyéből jött a kocsi. Történetesen az autó egy budapesti leányt szállított aki csángóföldön tanít magyart a csángók gyerekeknek. 3 hónap alatt többet tett a leány azokért mint ez a barom egész életében fog… Szégyen… Ez az orális hazaszeretet!

ccert based auth és az apache_getenv()

Phpból elméletileg client cert alapú azonosítás esetén lekérdezhető lenne az apache_getenv()-el az, hogy a kliens cert tárgy része milyen adatokat tartalmaz. Szintén elméletileg a környezeti változóként is regisztrálnia kéne a mod_ssl-nek az adatokat. Mindezt valami miatt nem csinálja, így kerülő megoldást kell alkalmazni:

apache configba:
SSLOptions +ExportCertData

Ezáltal a következő kód segítségével hozzáférhetővé válnak a kliens cert tárgyadatok:
[snippet=25115]

usability és a bejelentkezés

Barátilag támogatom a Cultura Nostra versenyt, aminek az első fordulója ma zajlott. Ahogy az ismert Mátyás mesében is van sikeres is volt meg nem is. Tapasztalatom mindenesetre lett sok. De kezdjük az elején!

A jelentkezés folyamata úgy nézett ki, hogy egy két lépcsős regisztrációs folyamatban az iskola regisztrálja a saját adatait az első lépésben. A második lépésben a csapatot lehet felvinni, majd vagy új csapatot visz fel vagy befejezi a regisztrációt. Ez a folyamat két gomb egyszerű feliratán bukott el:

gombok

Első gomb egy üres csapatregisztrációs formot adott vissza a másik egy üzenetet, hogy sikeres volt a regisztráció. Eredmény? Sok iskola kétszer vitte be a csapattagokat. Két hiba van a gombokkal:

1, Egymás alatt vannak.

2, Ha nem olvasta el figyelmesen, vagy elsőre nem tudta értelmezni a szöveget megfelelően, akkor megijed az üres formtól amit az első gombra kattintva kap vissza és újra felviszi.

Helyes(ebb) megoldás? Jövőre egy gomb lesz és egy üzenet: “Szeretne-e még egy csapatot regisztrálni?” Igen/Nem. Meglátjuk mi lesz az eredmény!

A következő problémás pont a bejelentkezés volt. Regisztráció után 10 karakter hosszú jelszót kapott a felhasználó A-Za-z0-9 minta szerint. Naplóztam a hibás bejelentkezéseket és abból a következő tapasztalatot szűrtem le:

1, A biztonsági kockázat ellenére néha igen is jó ha meg tudja nézni mit írt be! Volt, hogy egész sorokat másoltak be és volt, hogy csak 9 karaktert gépeltek be a 10 helyett.

2, A véletlenszerű jelszót igenis el lehet téveszteni ha valaki nem másolja (egyik legnagyobb tévesztés a 0 helyett P). Ezzel nem hiszem, hogy lehetne mit kezdeni. Pláne a verseny előtti stresszes helyzetben.

3, A citromailes felhasználók mindegyike kivétel nélkül úgy akart bejelentkezni, hogy a @citromail.hu -t lehagyta. Erre nyilván elég lenne egy “valós cím-e?” email validáció is, de azért elgondolkodtató, hogy sokan ha ilyen mezőt látnak és a webmailes felületen nem kell a domaint mögéírni akkor itt is téveszteni fognak (megszokás). Érthető a webmail fejlesztőinek, hogy szeretnék megspórolni azt, hogy a felhasználók végiggépeljék a teljes címet, de ezzel többet ártanak mint amennyit használnak… Ha már szabad álmodozni, akkor jó lenne ha openid provider lenne a citromail és a freemail is. 🙂

Ez ugyan nem usability, viszont szintúgy tapasztalat: van olyan böngésző ami excel fájlok feltöltésekor application/octet-stream mime-ot küld. Tehát a szerver oldali mime vizsgálatra minden esetben szükség van! pl ezzel: http://www.php.net/manual/en/ref.fileinfo.php

Ezt találtam fejlesztés közben: http://code.google.com/p/php-spreadsheetreader/ Könnyen kezelhető táblázat parser (xls, ods, csv, xml stb). Ennek kapcsán belenéztem az ods szerkezetébe. Egész szimpatikus cucc (zippelt xml-ek halmaza).

opensearch és javascript

Kisvirág csiripelte, hogy Johu designja megújult (nem igazán használom, nem tudom mi változott :)). Az oldalt megnézve feltűnt, hogy JSből hozzá tudják adni az opensearch keresést Firefox böngészőkhöz. A kód mivel csak Firefoxot támogat kicsit kibővítettem. Ilyen lett:

[snippet=24145]

Így már IE-t is támogat (7.0+). Van még opensearch képes böngésző?

mobil vízió

Valamikor a nem túl távoli jövőben: Fut a dietetikus program a mobilon. Étteremben fizetek, a program megkérdi hogy eltárolja-e azt hogy mit ettem? Eltárolom. Majd átküldöm a dietetikusnak az aktuális étrendem. Aztán már csak konzultálni megyek hozzá az új étrendemről.
Ha nem étteremben eszem, akkor egy két gombnyomásra felvihetem, hogy éppen most mit ettem. (finom kolbászos kenyeret :))

(elég inspirálóak Doransky mobilos feed-megosztásai)