funambol, php és mysql egyben

október 27, 2009

Mint mindenkinek, akinek van mobiltelefonja és saját adatbázisban tárolt címjegyzéke, naptár adatbázisa, elgondolkodott már azon, hogyan tudná ezeket az adatait legalább egy kicsit is szinkronban tartani. A weben léteznek mobil szinkronra szakosodott oldalak, de azok csak nehézségek árán adnak lehetőséget erre. Ha van saját szerverünk, akkor a funambol kínál egy lehetőséget a syncml szabvánnyal, hogy java alapon létesítsünk magunknak egy szinkron szervert, amivel többek között a contact és calendar bejegyzéseinket egy kézben tarthatjuk.

Ezzel csak egy probléma van, a telepített szerverünknek valahogyan kommunikálnia kellene saját adatbázisunkkal. A funambol hypersonic adatbáziskezelőt használ, ami persze nem elérhető php-vel.  Szerencsére, lehet a funambol szervert mysql-lel is telepíteni. Ezután már csak össze kell kapcsolnunk a saját adatbázisunk a funambol adatbázisával.

És itt jön pár buktató.

A jelszó. A funambol beléptetéshez nem egy egyszerű md5-öt használ, hanem saját kulccsal operál. Itt a php forráskód:

function funambol_encrypt($cleartext)
{
    $key = "Omnia Gallia in tres partes divida est";
    $key = substr($key, 0, 24);
    $cleartext = trim($cleartext);
    $comp = ceil(strlen($cleartext) / 8) * 8;
    $car = $comp - strlen($cleartext);
    $cltxt = str_pad($cleartext, $comp, chr($car));
    $cleartext = $cltxt;
    $iv = "01234567";
    $td = mcrypt_module_open(MCRYPT_3DES, "", MCRYPT_MODE_ECB, "");
    $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    @mcrypt_generic_init($td, $key, $iv);
    $encrypteddata = mcrypt_generic($td, $cleartext);
    mcrypt_generic_end($td);
    return base64_encode($encrypteddata);
}

De ez még nem elég. Van még egy dolog, amit figyelembe kell venni. A timestamp. A funambolos timestamp nem ugyanaz, mint a mysql-es timestamp. A legegyszerűbb módja, ha mysql-ben, az update utasításban szorzunk 1000-el:

last_update = unix_timestamp()*1000

Ezek után még meg kell küzdenünk azzal a problémával, hogy az fnbl_pim_ kezdetű táblákra közösen vonatkozik az egyedi id, így amikor beszúrunk ezekbe a táblákba egy rekordot (pl.: kontakt, naptár) az id meghatározásához ezen táblák id-jeit közösen kell figyelembe venni.

És végül van még egy dolog, ami lehet, hogy az én hibám, de nem találtam rá jó megoldást: a funambol szerver, a mysql, a linux mind ugyanabba az időzónába van telepítve, mégis a nyári időszámítás alatt le kell vonni a naptár bejegyzések időpontjaiból egy órát. Ha erre tud valaki jó megoldást (vagy mit kellene másképp csinálni), kommentelje be, ha megkérhetném…

Összefoglaltam az összes trükköt, aminek a megoldása nem volt triviális.

Sok sikert a szinkronizáláshoz!

php framework választás

augusztus 30, 2009

Új projektet indítunk. Ilyenkor az ember megpróbálja kitalálni, hogy mely technikák fognak fejlődni, melyik létező php keretrendszerbe érdemes beletanulni. Sorakoznak a kérdések a fejlesztő fejében, olvas, tesztel, próbál jó döntést hozni.

Most én is túlestem egy olvas-tesztel fázison.

Az ott kezdődött, hogy pénteken becsipogtak a weblaboron egy egy évvel ezelőtti cikket: Rasmus Lerdorf: PHP Frameworks? Think Again. Ez a cikk kicsit megindította a fantáziám. Vajon tényleg jó-e minden framework? Érdemes-e környezettudatosnak lenni, vagy inkább duplázzunk hardver-t, ne foglalkozzunk alapvetően a sebességgel? Mi alapján döntsek framework ügyben? Rasmus Lerdorf a php alapítója, és jelenleg is fejlesztője. Beleolvastam a cikkjeibe, a The no-framework PHP MVC framework erős indulatokat váltott ki anno, én is megosztott lettem. Hozzájött még ez és ez és ez.

Előkaptam hát pár frameworköt (mert a no-framework framework ellenére is szimpatikus frameworkben dolgozni):

Zend Framework. Az utóbbi idők legnagyobb csalódása számomra. Tulajdonképpen az egész egy függvénykönyvtár OOP köntösben (kövezzetek meg, de így gondolom), “csináld úgy, ahogy jónak látod” hozzáállással. Na én nem ezt vártam tőle. Én azt várom, hogy egy Zend Framework leírja hivatalosan (hiszen itt is php alapítók vannak a háttérben, rendes vizsgarendszerrel), hogy melyek a legjobb módszerek ma. Ehelyett van egy guestbook alkalmazás, egy szem táblából pumpál ki adatokat. Ha utánaolvasol, az MVC-ből a modelre egész sokféle megoldást lehet találni. Nincs mérvadó. Nincsenek statisztikák. Most a data mapper pattern a menő, de egy múlt decemberben kiadott ZF könyv még nem ezt favorizálja (sőt, talán nem is ír róla). Októberben újabb könyv jelenik majd meg (még csak előrendelni lehet), abban mi lesz majd? Valami új? Szóval csalódás.

Kohana. Már nézegetem egy ideje, a múlt év egyik üdvöskéje, sajnos a dokumentáció tavalyi is maradt. Amúgy tetszik, egyszerű, mint egy ék. Sokat vártam tőle, de mint majd kiderül…

Symfony. Mintha csak konfigokat kellene átírni, szinte a projekt előre van telepítve.

Yii. Ahogyan olvasgattam a témában a cikkeket, több helyen is szerepelt, mint új php framework, ami a sebességet helyezi előtérbe. Most hallottam róla először, gondoltam kipróbálom.

Itt van ez a négy php keretrendszer. A Zend Frameworkre áldoztam az utóbbi időben nagyon sokat, így arról van egy nem túl pozitív véleményem, de gondoltam összevetem más keretekkel, hátha sikerül meggyőznöm magam (vagy mellette, vagy ellene). Mivel a ZF guestbook alkalmazása csak egy táblát hoz példának, ezért úgy gondoltam, egy egyszerű feladat elé állítom a frameworköket: 100 elemből álló táblát kell kiíratniuk egy oldalon, én meg az apache ab parancsával ezt a  százszor kérem le, ez lesz az összevetési alap. Minden framework mysql adatbázison keresztül kapcsolódott, ugyanaz a száz sor került bele a táblába. Csak megjegyzem, minden framework tutorialja blog volt, ahol relációban (mint cikkek és hozzászólások) mutatták be az adathozzáférést, kivéve a ZF, ami csak egy nyamvadt egy táblás guestbook-ot tudott produkálni. Szerverkörnyezet Zend Server CE default telepítés Windows XP-n.

Itt vannak az eredmények:

YII
*********
Requests per second:    31.68 [#/sec] (mean)
ZEND
*********
Requests per second:    21.19 [#/sec] (mean)
KOHANA
*********
Requests per second:    19.63 [#/sec] (mean)
SYMFONY
*********
Requests per second:    15.65 [#/sec] (mean)

A tesztből látszik, hogy a Yii vezet magasan gyorsaság tekintetében, majd másfélszer gyorsabb mint a második helyezett ZF. Ez meglepő lett, még nem tudom, mit kezdek ezzel az eredménnyel. Sok dolog formálódik bennem. Amiért én keretrendszert választok (és nem magam írok), mert megbízom az opensource fejlesztésben (márminthogy kiveti magából a hülyeséget), az összegzett tapasztalat jobb szoftvert produkál.  Fontos az átláthatóság (akkor jön ez leginkább elő, ha új embert kell a projektbe bevonni), a sebesség, a dokumentáció (tutorialok, működő tesztek).

Egy biztos, ezen szempontok szerint ítélkezve a Yii jobb kindulópontnak tűnik a Zend Frameworknél.