cikkek

Athlon64+ összes cikke...

személyes bejegyzések

listázás
találatok >>

személyes bejegyzések

Amikor valami működik

Szerző: Athlon64+ | Dátum: 2012-05-05 16:15 | Hozzászólások (3)

Elkezdtem normálisan használni a PHP MVC + ORM keretemet, nagyon klassz. :D

Példának egy controller-em ennyi:

BrandController

Szerintem könnyen átlátható bárki számára, plusz vannak még mögötte bőven lehetőségek. ;)

Javascript és CSS állományok kiszolgálása okosan

Szerző: Athlon64+ | Dátum: 2012-04-15 15:46 | Hozzászólások (1)

Készítettem egy olyan mutatványt, amivel az alábbiakat tudom elérni Javascript és CSS állományok esetén:

- verziózás: style.css --> style_16546546.css, amennyiben módosítom: style_878645654.css Teljesen automata, cache megoldva.
- bundling: ha egy mappában van mondjuk 10 külön js/css fájl, akkor azokat le tudom küldeni egyben verziózva a kliensnek, cache itt is megoldva. Ha megváltozik az egyik fájl, akkor a bundling maga, tehát nem fog beragadni semmi sem.

Programkódban:
<link rel="stylesheet" href="<?php $this->Css("css/style.css"); ?>">
Kliensen:
<link rel="stylesheet" href="WebResource/Css/css/style_1334495916.css">

A bundling még nincs szépítve:
<script defer src="<?php System\Web\Resources\Optimizer::JsBund("js/test"); ?>"></script>
Kliensen:
<script defer src="WebResource/JsBund/-1282421670/js/test"></script>

Amennyiben a bundled állományok egymásra épülnek, az könnyen kezelhető, ha az adott fájl tartalmazza a függőségeinek a nevét (ui.jquery.js jelleggel).

PHP operátorkiegészítések

Szerző: Athlon64+ | Dátum: 2012-04-12 20:25 | Hozzászólások (1)

Hogy mire lesznek jók, majd elválik!

typeof

function typeof($variable) {
return \System\Type::Of($variable);
}

Ezzel semmi mást nem érek el, csak kicsit olvashatóbbá tehetem a kódomat, globális függvényeket egyébként nem szabad használni semmire sem szerintem, de ez jól jön.

// tudom, hogy nem kellene a teljes névtér
$this->_binders->Get(\System\Type::Of($cl->name))->BindModel($controller);

helyett

$this->_binders->Get(typeof($cl->name))->BindModel($controller);

using

function using(\System\IDisposable $source, $func) {
if (!is_callable($func)) {
throw new \BadFunctionCallException();
}

try {
$ret = $func($source);

$source->Dispose();

return $ret;
} catch (\Exception $exc) {
$source->Dispose();
throw $exc;
}
}

Semmi mást nem tudok vele kezdeni, mint használni egy erőforrást anélkül, hogy külön rá kellene néznem arra, hogy elengedi-e. Az adott erőforrásnak implementálnia kell az IDisposable interface-t, és már használható is:

Model binding

Szerző: Athlon64+ | Dátum: 2012-04-02 21:52 | Hozzászólások (4)

Az egyik legkirályabb dolog! :DD

public function CreateAction() {
//ez még kicsit sántít, de majd szebb lesz ez is :D
return $this->View('create', new ACGroup);
}

public function CreatePostAction($p1, ACGroup $group) {
//akármi
//return $this->View('create', $group);
}

A lényeg a második metódusban van: paraméterként már eleve egy objektummal dolgozhatok, csak azt kell megoldanom pl. edit esetén, hogy rendesen frissüljön az entitás az adatbázisban. :)

A rendszerem még kezdetleges, de pl. a típusos paraméter állhat akárhanyadik helyen, minden GET paramétert rendesen kezelek mellette, és a default binder mellett megadhatok mindenféle típusra külön bindert (pl. /*...*/ ACGroupBinder /*...*/ implements IModelBinder /*...*/).

"hogyan validáljunk és dolgozzunk fel egy formot szerveroldalon PHP-val"

Szerző: Athlon64+ | Dátum: 2012-03-27 21:47 | Hozzászólások (1)

Sk8erPeter-nek :D

$test = "qwertzuiopőúsdjhcsdlfjksdfsdf0";

$s = microtime(1);
for ($j = 0; $j < 1000000; ++$j) {
//mb_strlen($test) < 10;
//strlen($test) < 10;
!isset($test[10]);
}
die(microtime(1) - $s);

A cél az, hogy a szöveg hossza nem érheti el a 10 karaktert.
Tudom, mit jelent az mb_.

PHP iteráció

Szerző: Athlon64+ | Dátum: 2012-03-27 20:51 | Hozzászólások (38)

PHP-val képesek vagyunk megoldani azt, hogy egy-egy objektumunk iterálható legyen foreach-csel, avagy kompletten tömbként működjön. Most vegyük az egyszerűbbet, és nézzük meg, hogyan kell iterálható osztályt írnunk:

http://php.net/manual/en/class.iterator.php

Készen is vagyunk, örülünk.

De.

A PHP SPL könyvtárában akad egy olyan varázslat, amit IteratorAggregate-nek hívunk. Ez szintén segít megoldani a problémánkat, csak sokkal egyszerűbben. Itt csak egy metódust kell implementálnunk, ami visszaad egy ArrayIterator-t. Ugye, hogy sokkal szebb?!

De.

Van egy másik hatalmas előnye a második verziónak: gyorsabb.
Készítettem egy házitesztet, aminek az eredménye ez lett:
IteratorAggregate: 12,5+ másodperc
Iterator: Fatal error: Maximum execution time of 200 seconds exceeded in D:\xampp\htdocs\ref\index.php on line 26

Nem tudom, hogy vagytok vele, de én frissítem a kódjaimat.

Global state

Szerző: Athlon64+ | Dátum: 2012-03-16 15:18 | Hozzászólások (1)

public function __construct() {
$this->HttpContext = System\Web\HttpContext::Instance();
$this->FormState = System\Web\Mvc\FormState::Instance();
}

A Singleton (és bármi hozzá hasonló) nagyon szép meg jó, néha tényleg hasznos, de a fenti példa rossz, egy gyökér volt, aki csinálta (én). Mi ezzel a gond? Bármilyen globális állapot használata magában hordozza azt, hogy valami egyszer működik, egyszer nem, mert nem látunk a rendszer mélyébe, ahol a fekete mágia történik. Ha kapunk egy kódhalmazt, ami pl. használni vagy tesztelni kellene, és tele van ilyen globális megoldásokkal, akkor azon fogjuk kapni magunkat:

- fogalmunk sincs, hogyan kell használni
- nem tudunk rá tesztet írni az első pont miatt, vagy azért, mert egyszerűen nem tudunk teszteseteket beletolni a rendszerbe

Érdemes elgondolkodni azon is, ha pl. egy C# kódban valaki DateTime.Now-ot használ, az vajon globális állapotnak minősül-e, avagy sem? (Szerintem mindenképp annak.)

Singleton és más sötét erők használata helyett igyekezzen mindenki elmélyedni az igazi OO szépségeiben, próbálja meg felépíteni az alkalmazása objektumfáját úgy, hogy egyértelmű legyen, mi mitől és hogyan függ, melyik elemnek mire van szüksége (dependency injection).

PHP 5.4 Session-kezelés

Szerző: Athlon64+ | Dátum: 2012-03-04 11:35 | Hozzászólások (1)

SessionHandlerInterface :Y

class SessionHandler implements SessionHandlerInterface {

public int close ( void ) {}
public int destroy ( string $sessionid ) {}
public int gc ( int $maxlifetime ) {}
public int open ( string $save_path , string $sessionid ) {}
public string read ( string $sessionid ) {}
public int write ( string $sessionid , string $sessiondata ) {}

}

Regisztrációja:

session_set_save_handler(new SessionHandler);

Ilyen helyett:

session_set_save_handler(
array($obj, "open"),
array($obj, "close"),
array($obj, "read"),
array($obj, "write"),
array($obj, "destroy"),
array($obj, "gc")
);

Cool.

PHP 5.4 - trait

Szerző: Athlon64+ | Dátum: 2012-01-07 14:17 | Hozzászólások (4)

A PHP 5.4-es verziója még nincs készen, de már most érdeme foglalkozni az újításokkal, hiszen a szokásos hibajavítások, teljesítményfokozások mellett nyelvi újdonságokat is fog hozni magával.

A címből villámgyorsan kiderül, mivel is szeretnék most foglalkozni: trait. PHP-ban ez egy új kód-újrahasználati lehetőséget biztosít számunkra, osztályainkat tudjuk bővíteni trait-ek használatával, de nem olyan módon, ahogyan azt öröklésnél megszokhattuk. Ha egy új osztályt származtatunk egy meglévőből, akkor tulajdonképpen a szülőt vertikálisan bővítjük, ezzel szemben a trait-ek ezt horizontálisan tudják megtenni.

Miért is jó ez nekünk? Szerintem mindenkivel előfordult már, hogy 2 osztályban hasonló dolgot szeretett volna megvalósítani, de örökléssel nem igazán azt érte volna el, amit szeretne, mert a két osztálynak egyébként semmi köze egymáshoz. Kézenfekvő példa a Singleton minta. Ezt magam is sokszor eljátszottam, eljátszom, hogy az osztályaim megírását azzal kezdem, hogy belezongorázom mindbe a Singleton-hoz szükséges elemeket, amelyek gyakorlatilag minden egyes osztálynál megegyeznek, ami hatalmas pazarlást jelenthet.

Dohányzás

Szerző: Athlon64+ | Dátum: 2012-01-04 16:34 | Hozzászólások (59)

Manapság tilos a dohányzás gyakorlatilag mindenhol, ami nekem nem is gáz, mert nem élek vele, de...
Most senki sem tud kijelölt dohányzóhelyen tolni a cuccot, ezért a marha kimegy az utcára, ahol sikeresen a hozzám hasonlók pofájába tolja a füstöt. Nagyszerű, innentől gyakorlatilag élek vele.

És még egy kis suttyó is a buszmegállóban szívta.

IEnumerable<T> és a return null

Szerző: Athlon64+ | Dátum: 2011-12-06 21:55 | Hozzászólások (1)

Ez az, amit sose csinálj. Semmilyen nyelven. Semmilyen hasonló szituációban (nem IEnumerable és/vagy nem null).
Ha ilyet művelsz, akkor megtöröd a kód logikáját hiszen, ha valamitől azt várjuk, hogy egy bejárható típust ad vissza, erre kap egy null referenciát azért, mert nincs visszaadható elemet tartalmazó szekvencia, akkor felkészítés hiányában azonnal elszáll az alkalmazás. Nem olyan régen kellett "megoldanom ezt a problémát" C#-ban, íme pár lehetőség:

A faék
public IEnumerable<int> GetIntegers()
{
return new int[0];
}

Az elegáns
public IEnumerable<int> GetIntegers()
{
return Enumerable.Empty<int>();
}

Smart
public IEnumerable<int> GetIntegers()
{
yield break;
}

DateTimeHelper

Szerző: Athlon64+ | Dátum: 2011-12-04 17:27 | Hozzászólások (1)

Hegesztettem egy "wrappert" a PHP DateTime osztályához. Annyi a lényege, hogy segítene használni, mert a beépített annyira nem egyszerű történet, én körülményesnek tartom, illetve a működése sem az igazi számomra. Ha valaki kipróbálja, az vegye észre, hogy nem a DateTime-tól van származtatva!
Nem teszteltem le mindenét.

DateTimeHelper

DayOfWeek

DateTimeParseException

TimeZones

Social codingra fel!

mysqli használata

Szerző: Athlon64+ | Dátum: 2011-11-28 19:43 | Hozzászólások (1)

Napokban volt téma a PHP topikban a mysqli objektumorientált használatáról. Adnék egy kis vázat azoknak, akik még most ismerkednek a témával, és egy kis segítségre szorulnak.

[ DataContext osztály ]

[ Kicsi-gagyi teszt ]

Ha van még kérdés, nem kell habozni. Szerintem nem vészes a történet. Látszik, hogy a DataContext csak egy wrapper class a mysqli köré, hogy kicsit szebben és kényelmesebben lehessen használni.

Ha valaki kipróbálja, és valahol elhasal, szóljon, mert ez csak a sajátom (ORM modellemből van) kibelezett változata.

Amikor nem elég az array

Szerző: Athlon64+ | Dátum: 2011-11-26 09:33 | Hozzászólások (1)

Ez történik, ha a PHP-t kényelmesen szeretnéd használni:

Nem minden sima tároló cucc, a TableEntity az ORM modellem része, de ez is szolgál tárolóként. Az egyes osztályokban csak az érdekesebb dolgokat emeltem ki, a többi vagy öröklött vagy unalmas(abb).

Az IEnumerable-től származó Select-et kellene még felturbózni azzal, hogy anonymous objecteket lehessen vele ügyesen gyártani, illetve egy Union kellene (TableEntity-be is feltétlenül, hiszen SQL-ben is van UNION).

Így már egészen jól lehet dolgozni. :))

NetBeans, Xdebug, Chrome és a fejlesztő

Szerző: Athlon64+ | Dátum: 2011-11-19 10:26 | Hozzászólások (3)

A három testőr és D'Artagnan a web világában

Sokan fejlesztenek PHP alapú dolgokat, kicsivel kevesebben tolják igazán a szekeret és használnak IDE-t hozzá, és ebből a kicsi halmazból is csak kevesen tudják, hogy lehet a PHP-t normálisan is debuggolni. Magam sem használtam eddig semmilyen különleges debug megoldást, de most már eljutottam odaig, hogy a szakdolgozatomat úgysem tudom időre leadni, így adtam magamnak lehetőséget beizzítani az Xdebug-ot.
Ahhoz, hogy használni tudjuk mindenképpen szükség van a három testőrre vagy valamelyik hasonmásukra.

Elsőnek az Xdebug-ot kell beépítenünk a PHP-ba. Legegyszerűbb ide kattintani, és megadni a phpinfo() kimenetünket, ami alapján segítséget kaphatunk abban, hogy melyik binary kell nekünk, és hová, hogyan kell pakolnunk. Nagyon fontos, hogy nem a HTML forrását, hanem szimplán a generált lap szövegét kell kimásolnunk a textarea-ba.

Nálam ezt dobta:

Download php_xdebug-2.1.2-5.3-vc6.dll
Move the downloaded file to \xampp\php\ext
Update D:\xampp\php\php.ini and change the line
zend_extension = \xampp\php\ext\php_xdebug-2.1.2-5.3-vc6.dll
Restart the webserver

Ez helyes is, csak a php.ini-ben mást is be kellene lőni az XDebug szekcióban:

Singleton tervezési minta .NET-ben (C#)

Szerző: Athlon64+ | Dátum: 2011-11-12 08:21 | Hozzászólások (1)

A Singleton (magyarul Singleton) tervezési minta lényege az, hogy az egész rendszerben pontosan egy darabra korlátozzuk az adott elemből létrehozható objektumok darabszámát. .NET-ben nincsenek globális változók, amelyekkel a fenti problémát meg lehetne oldani, hiszen tisztán objektum orientált környezettel van dolgunk. A globális változókkal egyébként is lenne még egy probléma: a tényleges felhasználásuk előtt is igényelnek erőforrást. Ha az alkalmazásunk képes több szálon dolgozni, és egyszerre több szál is használhatja a singleton objektumunkat, akkor adódhatnak gondjaink, ha nem szálbiztosra tervezzük meg az osztályunkat, szerencsére erre több megoldás is létezik, meg fogjuk nézni ezeket. Singleton-t használhatnak komplexebb tervezési minták is, például a Factory, amivel lehetőségünk van arra, hogy megoldjuk a Singleton paraméterproblémáját (ha a singletonunk képes lenne paramétereket fogadni, akkor abból gondunk adódna).

Mi is szükséges a Singleton minta implementálásához:

Anonymous függvények #2

Szerző: Athlon64+ | Dátum: 2011-11-09 23:01 | Hozzászólások (8)

$c = $this->_acdc->acgroups()->AsEnumerable();

foreach ($c->GroupBy(function ($e) {
return $e->ParentID();
}) as $value) {
/* @var $value ObjectGroup */
echo "#" . $value->Key() . "#\n";
foreach ($value->Items() as $g) {
echo "----" . $g->Name() . "\n";
}
}

$c->GroupBy(function ($e) {
return $e->ParentID();
}

KIMENET:

##
----Administrators
----nullable
----reftest
----tttt
----gregrgre
#1#
----hdhd
#10#
----index
----recgroup
#5#
----parent

Hasonlóan van Where, OrderBy, de akad Max-Min-Average-Count is First-Last +OrDefault mellett.

Rekurzív anonymous függvény PHP-val

Szerző: Athlon64+ | Dátum: 2011-11-06 18:01 | Hozzászólások (17)

$f = function ($data = 1) use (&$f) {
echo $data;
if ($data < 10) {
$f($data + 1);
}
};

$f();

személyes bejegyzések

listázás
találatok >>