Recent Updates RSS Toggle Comment Threads | Billentyűparancs

  • Sulik Szabolcs 22:31 on 2010. 01. 29. Permalink | Válasz
    Tags: , migráció,   

    Doctrine migráció, lehet egyszerűbben? 

    Már nem először volt egy “kevés” szívás a Doctrine migrációkkal. Ma éppen az jött elő, hogy PostgreSQL tábla alatt kellett volna primary key-t cserélni. Ennek véghezvitelében “rengeteget” segített a Doctrine semmitmondó dokumentációja. A probléma lényege, hogy egy migráció kell a korábbi primary key eldobásához, egy pedig az új felvételéhez. Kész elmebaj.

    Mielőtt végképp frusztrálni kezdett volna a dolog fogtam a db connection-t és nyers sql parancsokkal elintéztem a dolgot. Megvolt 5 perc alatt, azt csinálta, amit én szeretnék, ráadásul még ismerem is.

    Ezzel párhuzamosan elgondolkoztam, hogy mi is egy migrációt kezelő alrendszer lényege (és miért ilyen bonyolult a Doctrine). Alapvetően két osztálytípusra van szükség:

    1. egy menedzser osztályra, amely vezérli a migrációt egyik lépésről egy másikra
    2. egy (jobban mondva több) osztály, amely(ek) az egyes migrációs lépéseket reprezentálják

    Nézzük a másodikat, az ugyanis az egyszerűbb. Itt egy interface-t kell definiálnunk, amit bármilyen osztály megvalósíthat:

    interface MigrationStep
    {
      public function up(PDO $con);
    
      public function down(PDO $con);
    }
    

    A menedzser osztály kicsit bővebb :)

    class MigrationManager
    {
      private $_pdo;
    
      public function __construct(PDO $pdo)
      {
        $this->_pdo = $pdo;
      }
    
      public function migrateTo($step = null)
      {
        // migrál a megadott lépésig, null esetén a legfrissebb állapotig
        // végigmegy a lépéseken az aktuális állapottól (->getVersion()) a $step-ig
        // közben betölti a lépést, példányoítja, futtatja, minden lépés végén menti a verziót
      }
    
      public function getMigrations()
      {
        // visszaadja a migrációs lépéseket tartalmazó file tömbjét
        // migrációs lépés száma => file elérési útja párként
      }
    
      public function getVersion()
      {
        // visszaadja az aktuális verziót
      }
    
      public function setVersion()
      {
        // beállítja a migrált verziót
      }
    }
    

    Ehhez kell néhány megállapodást tenni:

    1. a migrációs lépések egy könyvtárban vannak
    2. a migrációs lépés file-ok formátuma LÉPÉS_OSZTÁLYNÉV
      pl. 12_ArticlePrimarykeyUpdate.php

    Úgy gondolom ennyi a migráció és nem több. Ennyire van szükség. A Doctrine által bevezetett plusz API csak kavarás, felesleges tanulnivaló (lenne, ha érdekelne).

     
  • Sulik Szabolcs 11:23 on 2010. 01. 20. Permalink | Válasz
    Tags: zene   

    Egy kis éji zene nappali munkához :)

    A srác többi mixét is érdemes megnézni.

     
  • Sulik Szabolcs 18:42 on 2010. 01. 13. Permalink | Válasz
    Tags: escapelés, , , template   

    Template-ben automatikus escape-elés 

    Mostanában azzal ütöm el az időmet, hogy egy “framework esszenciát” fejlesztek :) . Nem azért, mert nem jók a meglévő megoldások, pusztán azt szerettem volna látni, mennyi az a minimális feature set, amellyel már épkézláb dolgokat lehet csinálni. De erről majd később.

    A leginkább érdekes rész, meglepetésemre, a templatek frappáns kezelése bizonyult (oly annyira, hogy még most sem oldottam meg rendesen ;) ). Nem biztosít, és nem is fog biztosítani, automatikus escapelést. Elgondolkozva ezen a fícsörön (mármint az automatikus escapelésen) eszembe ötlött egy elég ellentmondásos dolog. Nevezetesen egy asszociatív tömb kulcsát kell-e escapelni, vagy nem?

    Mert ha csak “valamilyen” azonosítókat tárolok benne, amit teszemazt máshol is használok azonosításra, akkor egyértelmüen nem szabad, tehát a jó megoldás, hogy nincs escapelés.
    Ellenben ha mondjuk felhasználónév, email párokat tárolok (ahol mindkét adat user inputból jött), akkor bizony escapelni kell, és hiba ha elmarad.

     
    • Hodicska Gergely 23:37 on 2010. 01. 13. Permalink

      Az én megközelítésem a következő volt:
      - Az esetek túlnyomó többségében a template-nek átadott paramétereket escape-elni kell. (Az, hogy ez épp tömb kulcs vagy nem, az lényegtelen, ami bele teszünk egy HTML oldalba, arra kell a htmlspecialchars, nem építünk arra, hogy X mezőben csak szám lehet stb., mindig escape-elünk.)
      - Ha valamiért mégsem escapelve van szükség az adatra, akkor az legyen elérhető az eredeti formában is.

      E kettő nyomán: alap esetben a template változók már automatikusan escape-elve is vannak (az hogy ez hogyan történik, azt a válasz formátuma határozza meg), így ha épp valaki siet, akkor sem fordulhat elő, hogy elfelejti (és ott van kapásból a biztosnági rés), és ha neked nem az escape-elt változat kell, akkor ott már egy tudatos fejlesztői döntés miatt fogod az eredetit használni.

    • Szabolcs Sulik 08:53 on 2010. 01. 14. Permalink

      Igen, a symfony-ban is így van, output escaper példányokba csomagolja a változókat. Ezzel csak annyi a problémám (nem is annyira probléma, inkább furcsa), hogy szeretek/szeretnék helperekben, metódusokban type hinteket használni, és kicsit érdekesen mutat az echo show_me_the_user($user->getRawValue()) hívás a sablonban. Emellett a ZF 2.0-ben is bevezetnek majd hasonló eljárást. Azt is olvastam, hogy a symfony-s coredev-ek szerint pont ez a feature a leginkább performance killer.

      Mind mindenhol, itt is lehet érvelni mellette és ellene is. A greebo-ban elsősorban a minimalizmus a célom, nem feltétlenül az, hogy bolondbiztos megoldást adjak a problémákra :) . Az cél kettős: 1. minimális API bevezetése (amit a PHP tud azt használom, és sok mindent tud :o ), 2. a lehető legegyszerűbb, legkevesebb osztállyal megoldható felépítés (6 osztály az essence és 6 osztály a conveniences “csomagban”). Majd írok egy hosszabb bejegyzés a témában részletesen kifejtve a gondolataim.
      Emellett majd ki fogom próbálni, hogy milyen válaszidőt produkál a rendszer, ha van benne valamilyen automatikus escapelés.

      A templatezéssel a küzdelmem inkább arról szól, hogy egy osztállyal és dekorációval szeretném (és fogom is, már megvan a felépítés) megoldani (értsd template inheritance). Emellett a symfony component mintájára kap majd egy plusz metódust, ahol a templatehez esetlegesen tartozó logika foglal helyet.

    • Szabolcs Sulik 16:18 on 2010. 01. 14. Permalink

      Na megnéztem, a symfony a tömb kulcsait nem escapeli.

  • Sulik Szabolcs 14:33 on 2009. 12. 28. Permalink | Válasz
    Tags:   

    a fejlesztői és a szülői lét párhuzama 

    A karácsony az egyik kedvenc időszakom. Már kifele megyünk az évből, szabadságról, pihenésről, a családról szól. Ebbe az időszakba tartozik az advent is. Szerencsére az utóbbi években a php közösség is készített saját adventi naptárat. Szeretem ezeket az írásokat, van bennük báj, humor (időnként még szakmai dolgok is :) ).

    Az egyik személyes kedvencem idén Laura Thomson írása volt. Abban a szerencsében van részem, hogy egy 11 hónapos srác apukája lehetek. Ha nem vagy szülő elárulom, a cikk minden szava igaz ;) . Idén megjött az első Jézuska és sok más ajándék mellett hozott egy “formapárosító” játékot is. Néztem a kisfiam, ahogy megpróbál játszani vele, és elgondolkoztam, hogy felnőtt fejjel elsőre mennyire egyszerű játékról van szó. Hiszen pusztán a megfelelő formákat kell megkeresni és a helyükre tenni, amelyek ráadásul elég különbözőek. Viszont ha jobban belegondolsz nem más ez, mint az életkornak megfelelő intellektuális kihívás. Számunkra ez természetesen nem kihívás, de nem is az életkornak megfelelő. Elgondolkoztál már azon, hogy mennyiben sikerül neked felismerni és helyére tenni a környezetedben található “formákat”? Ha csak szakmai síkon gondolkozom és

    • fejlesztő vagy: mennyire ismered a nyelveket, eszközöket, … bármit, amit munkád során használsz
    • projektvezető / cégvezető vagy: mennyire ismered a partnereket, azok igényeit, az embereid képességeit, …

    Azt hiszem, ha ezeket a dolgokat végiggondolod, pontosan tudni fogod, hogy merre kell továbbmenned a jövőben. Ez jó kezdés lehet egy új évhez, egy új évtizedhez.

    Kívánok kellemes ünnepeket és boldog új évet.

     
  • Sulik Szabolcs 23:39 on 2009. 11. 16. Permalink | Válasz
    Tags: , , null object,   

    a Null object minta használata Doctrine-nal 

    A null object mintáról sok helyen lehet olvasni. Alapvetően arról van szó, hogy abban az esetben, amikor egy objektum példányt kellene kapnod (mondjuk egy factory-tól), de az a feltételeknek megfelelő objektumot nem tud biztosítani, akkor nem null-t ad vissza, hanem egy úgynevezett null objektumot, amely típusában, viselkedésében megfelel egy “rendes” objektumnak.

    A minta előnye, hogy nem kell folyamatosan vizsgálnunk a kapott értéket (null-e vagy objektum példány), egyszerűen csak használjuk. Hogy mire is jó, arra lássunk egy példát.

    (More …)

     
  • Sulik Szabolcs 16:58 on 2009. 10. 25. Permalink | Válasz
    Tags: , sfEvent, sfEventDispatcher, , , symfony 1.3   

    néhány kevéssé dokumentált symfony esemény 

    Korábban gondolkoztam rajta, hogy készítek egy írást a symfony eseménykezeléséről, összefoglalva, hogy melyik eseményt ki váltja mi és milyen listenerek vannak alapból. Aztán, ahogy telt az idő nem írtam semmit, illetve kijött a reference book, amelyben külön fejezetet szenteltek az események összefoglalásának.

    Van néhány esemény, aminek nem szentelnek túl nagy figyelmet, pedig roppant hasznosak tudnak lenni. Ezek az admin genertároban találhatók:

    • admin.pre_execute: minden admin action preExecute() metódusának végén értesít ki. Speciel ennek még nem láttam hasznát.
    • admin.save_object: minden (admin generátor oldalon végzett) objektum mentés után értesíŧ ki. Nagyon hasznos minden olyan tevékenység elvégzésére, amely nem kötődik szorosan a modell osztályhoz, de meg kell történnie mentéskor (pl. cache ürítés, lucene index frissítés, …).
    • admin.delete_object: minden (admin generátor oldalon végzett) objektum törlés előtt értesít ki. Hasonló előnyökkel kecsegtet, mint a mentésnél láttuk.
     
  • Sulik Szabolcs 16:50 on 2009. 10. 23. Permalink | Válasz
    Tags: pear,   

    ubuntu 9.10 PEAR para 

    Az új ubuntuban problémáid adódhatnak, ha a PEAR-ben csomagot akarsz telepíteni vagy frissíteni (pl symfony-t :) ).

    Ennek megoldásáról volt szó nemrég a magyar symfony google csoportban. Halászvári Gábor bug-reportja pedig itt.

     
  • Sulik Szabolcs 15:32 on 2009. 10. 17. Permalink | Válasz
    Tags: pecl,   

    PEAR channel probléma php 5.2.9 felett 

    Szerettem volna feltelepíteni néhány pecl csomagot, de folyamatosan a következő hibaüzenetet kaptam:

    pecl.php.net is using a unsupported protocal – This should never happen.
    install failed

    Egy gyors keresés után meg is találtam a megoldást.

    A megoldás röviden: törölni kell a meglévő csatornákat és frissíteni egyet.

    cd `pear config-get php_dir`
    mv .channels .channels-broken
    pear update-channels

    Konfiguráció: ubuntu 9.04, zend server ce, php 5.2.10

     
  • Sulik Szabolcs 10:37 on 2009. 08. 23. Permalink | Válasz
    Tags: , , ,   

    symfony textarea widget érdekesség 

    Érdemes erre a widgetre odafigyelni, különben nem várt meglepetésben lesz részed. A textareaban megjelenő szöveget illik escapelni, erre tökéletes is lenne a htmlspecialchars függvény. Csakhogy a symfony nem pontosan ezt csinálja. Az sfWidgetFormTextarea::render() kicsit megpróbál tovább menni. A form framework jó pár widgetben használja az sfWidget::escapeOnce() metódust, itt azonban ez igen veszélyes.

    A kedves olvasóra bízom, hogy mi lesz az alábbi szöveggel, miután kétszer egymás után postolja az egy formon.

    <p>ez itt egy bekezdes</p> &lt;script&gt;alert(&quot;aaa&quot;);&lt;/script&gt;
     
  • Sulik Szabolcs 08:01 on 2009. 07. 10. Permalink | Válasz
    Tags: ,   

    SwiftMailer 4 teljesítmény problémák 

    Miután sikeresen átálltunk 4-es swiftre komoly teljesítmény problémát vettünk észre. Nevezetesen: a swift 3 quoted-printable encodinggal időnként bugzott, ezt a 4-esben javitották, viszont az kódolást végző io stream teljesitménye elég siralmasra sikerült: kb 4x lassabb, mint swift 3 esetén.

    A probléma ismert a fejlesztők előtt is, a 4.1.0-ben ezt az alrendszert teljesen újraírják. További hasznos olvasmány lehet a témában a problémára vonatkozó ticket.

    Jelenleg még senkinek sem javaslom az átállást, aki nagyobb mennyiségű levélküldésre szeretné használni.

     
c
compose new post
j
next post/next comment
k
previous post/previous comment
r
reply
e
edit
o
Megjegyzések elrejtése/mutatása
t
go to top
l
go to login
h
show/hide help
esc
mégse