Implementace entit v PHP

Malé zamyšlení (anketa) týkající se nejlepší implementace entit v PHP.

Entita je stručně řečeno kontejner na data (více třeba u PHP Gurua). Typická třída entity obsahuje spoustu atributů a settery/gettery pro práci s nimi.

Entitu můžeme implementovat třemi základními způsoby (třeba přijdete na další), ale ani jedna z nich mi nepřijde úplně vyhovující:

  1. Všechny atributy uděláme private a pro každý z nich napíšeme ručně getter a setter.

    class Product {
    
        private $name;
    
        public function getName() {
            return $this->name;
        }
    
        public function setName($name) {
            // kontrola typu
            $this->name = $name;
        }
    }
    Toto řešení je sice čisté, ale velmi pracné.
  2. Společný předek s magickou __call metodou a protected atributy v entitách.

    abstract class Entity {
    
        public function __call($methodName, $params) {
            $action = substr($methodName, 0, 3);
            switch($action) {
                case 'get':
                    // vrácení hodnoty atributu
                case 'set':
                    // kontrola typu podle anotace atributu, uložení hodnoty
            }
        }
    
    }
    
    class Product extends Entity {
    
        /** @var string */
        protected $name;
    
    }
    Toto řešení je méně pracné, ale používáme protected atributy, což není příliš doporučované. Kdokoliv si totiž pak může naši entitu podědit a hrabat se v atributech přímo, bez volání setterů. Tuto nepříjemnost sice můžeme zakázat deklarováním třídy jako final, ale omezujeme tím použitelnost třídy.

  3. Private atributy v entitách a jejich zviditelnění ve společném předkovi pomocí reflexe.

    abstract class Entiry {
    
        public function __call($method, $args) {
            $action = substr($methodName, 0, 3);
            // vytvoření instance ReflectionProperty pro daný atribut
            $property->setAccessible(TRUE); // změna viditelnosti atributu
            switch($action) {
                case 'get':
                    return $property->getValue($this);
                case 'set':
                    // kontrola typu podle anotace atributu
                    $property->setValue($this, $value);
            }    
        }
    }
    
    class Product extends Entity {
    
        private $name;
    
    }
    Toto řešení je stejně pracné jako to předchozí a navíc nemá neduh v podobě protected atributů. Moc se mi ale nelíbí, že entitu znásilňujeme pomocí reflexe, abychom mohli číst a zapisovat do private atributů.

Pokud vás napadá lepší řešení, podělte se v komentářích.

evaluation


comments

2012-01-01 19:59:33

Používám první variantu, ale nepovažuji ji za úplně šťastnout.

Podle mě tohle hodně závisí na tom, jakou architekturu bude mít aplikace. Když se budeš snažit přiblížit tomuhle

http://www.augi.cz/programovani/architektura-skalovatelnych-aplikaci/

tak ti nebude vznikat Anémický model, jak ho popisuje Fowler

http://martinfowler.com/bliki/AnemicDomainModel.html

protože ty gettery a settery nebudeš potřebovat.

Až přijdu na to, jak to zadrátovat do Nette a Doctrine tak dám vědět. A doufám v to samé od ostatních :)

[2] Tharos
2012-01-01 21:23:09

V aktuálním projektu používám shodou náhod poslední variantu, a to právě kvůli Tebou popsaným výhodám. Není to ukecané, je to robustní a ve spojení s anotacemi to i leccos svede. Zneužívání reflexe mi ani tak moc nevadí, ale co mi vadí je plýtvání pamětí, ke kterému nejjednodušší implementace této myšlenky vede. Ono totiž když pak pracuješ s 20ti entitami a u každé potřebuješ nastavit například jednu položku, vznikne ti v paměti 20 instancí stejné property reflexe...

Tohle mi vadilo, a tak jsem to vyřešil takovou nadstavbou, která tyto property reflexe umí sdílet napříč instancemi stejných tříd. Bohužel je kód, který to řeší, kvůli absenci late static bindingu pro proměnné (http://blogs.neoseeker.com/tekmosis/5576-late-static-binding-of-variables-constants-in-php-5-3/) možná trochu haluz, ale na druhou stranu svůj účel plní dobře.

Mně osobně nenapadlo v PHP nic lepšího. Má kritéria jsou stručnost, robustnost, paměťová efektivnost a také aby to umožňovalo něco složitějšího... Budu nadšen, pokud sem někdo dorazí z nějakou lepší implementací. :) Takže v každém případě díky za článek!

Kdyby Tě zajímala má implementace, přístup k tomu mému zmíněnému aktuálnímu projektu máš. :)

replied by [4] Dundee
[3] Tharos
2012-01-01 21:26:53

"...když pak pracuješ s 20ti entitami a u každé..."

Tady básníkovi vypadla dvě slova, opravuji na:

"...když pak pracuješ s 20ti entitami shodného typu a u každé..."

[4] Dundee
2012-01-01 21:37:58

#2 Tharos: Díky. My na aktuálním projektu také používáme poslední možnost a zatím myslím k plné spokojenosti. Nelíbí se mi to spíš jen z "filozofického" hlediska :) tak mě napadlo tohle sepsat, jestli někdo nepřijde s lepším řešením.

2012-01-01 23:30:45

Jak u variant 2 a 3 potom ale řešíte napovídání metod v IDE? Pomocí anotací '@method'?

replied by [6] Dundee
[6] Dundee
2012-01-02 01:04:34

#5 Jakub Onderka: Přesně tak. Bohužel ale ne všechny IDE to podporují.

2012-01-02 19:02:44

A není nejjednodušší spojit výhody?

Pročpak si nenecháte Vámi zvolený oblíbený model vygenerovat svým IDE nástrojem nebo jiným?

IMHO první model je nejčistší, druhý a třetí je jen kouzlení jak se co nejméně upsat. Proč si tedy nenecháte první model a nenecháte tvorbu getterů a setterů na IDE nástroji?

Máte všechna plus. Upíšete se dokonce mnohem méně, je to čisté. Kód běží dokonce rychleji a úsporněji, protože vyhodnocování obecné funkce __call, případně __property stojí čas, peníze a paměť. A ještě dražší je samozřejmě reflexe, i když ta v dynamických jazycích není tak drahá.

Je vysloveně nutné, abyste každý znak ve zdrojáku museli napsat svou rukou? Už od dob kdy jsem před léry zkusil vim jsem napsal tak 20 % znaků ve zdrojáku, zbytek jsem mu jen naznačoval a on doplňoval.

Neřku-li dnes, kdy jsou v dispozici daleko luxusnější prostředí.

---

Kromě toho, jen do počtu existují další možnosti. Například nechat vygenerovat třídy ze šablon – nikde není psáno, že zdrojový kód nemůže být produktem nějakého generátoru.

---

Další možnost je doplnit gettery a settery přímo v PHP pomocí eval.

---

Také je možné seznam property předat jako pole s referencemi na skutečné proměnné do univerzální třídy, která vytvoří přístupové metody.

---

Možností je mnoho. A myslím, že v poslední verzi PHP se ještě další objevily.

Miloslav Ponkrác

[8] koubel
2012-01-02 20:10:03

Tady souhlasím s p. Ponkrácem, 1.) a generovat kód klidně z nějakých šablon, prototypů, konfigurace atd.

[9] Tharos
2012-01-02 23:09:06

No, já s argumentací p. Ponkráce z větší části souhlasit nemohu...

1) „Upíšete se dokonce mnohem méně, je to čisté.“

Když založím generování na nějakých šablonách, prototypech či kdo ví jakých ještě definicích, vždy musím napsat minimálně ty definice. Ty už z principu nelze více zkrátit, obsahují prostě jenom jméno položky, datový typ, zda může být null, množinu platných hodnot, business logiku… Přičemž ve 2. a 3. přístupu se toto úplně běžně řeší pomocí jednoduchých anotací. Musím tedy napsat XY znaků kódu a o vše kolem se už postará dynamické PHP. U generátoru musím napsat úplně stejný počet XY znaků (v podstatě to samé napíšu do nějaké šablony) a pak navíc ještě spustit generátor. Rozhodně tedy neplatí, že „upíšete se dokonce mnohem méně“.

2) Chtělo by zde nějak dospecifikovat, jak zde hodnotíme, co je „čisté“ :). Pro mě osobně je čistý kód robustní, dobře testovatelný, dobře čitelný a stručný (tj. jde přímo k věci). Tomu vyhovuje 2. a 3. varianta velmi dobře, používáme-li dynamický jazyk typu PHP. Máte-li jinou definici přívlastku „čistý“, samozřejmě pak z Vašeho úhlu pohledu můžete mít pravdu.

3) Já osobně nebazíruji na tom, abych každý znak ve zdrojáku psal svou rukou, ale nedokážu si představit situaci, kdy bych psal pouze 20 % kódu… Přišla by mi otrava mít všechny hlavní myšlenky a logiku aplikace ve 20 % kódu a pak pořád dokola muset generovat nějakých 80 % „balastu“ kolem. Tohle ale bude možná zásadní rozdíl mezi námi dvěma.

4) Ono to generování z IDE není tak slavné, jak se možná na první pohled zná. Neznám všechna dostupná IDE, ale minimálně NetBeans, PhpStorm a PhpED nevyhoví, pokud chceme automaticky k setterům generovat i typová omezení či automatické konverze, množinu platných hodnot… zkrátka o to, o čem jsem již psal.

5) „Také je možné seznam property předat jako pole s referencemi na skutečné proměnné do univerzální třídy, která vytvoří přístupové metody.“

Tahle implementace by mě tedy vážně zajímala… Nevedla by náhodou k tomu, že by se ve výsledku všude používala jedna univerzální třída „Entity“? To pak ale trochu popírá smysl toho všeho, nemyslíte? Pak se z toho stane obyčejná univerzální přepravka, kterých už po světě chodí mnoho (NotORM_Row, DibiRow…), jen třeba s nějakou validací.

replied by [10] koubel
2012-01-02 23:41:31

#9 Tharos: - Používat reflexy v business objektech mě nepřijde jako správné, reflexe je podle mě určena na věci jako analyzátory a manipulátory s kódem, generátory, DSL atd. Ale do business logiky kvůli ušetření zápisu - jiný význam nemá - nepatří a setAccesible už vůbec ne. S výkonem to bude také dost hrůza, takovéhle __call navíc s reflexion bude oproti getteru několikrát pomalejší. Ostatně výsledky ankety také něco naznačují.

replied by [11] Tharos
[11] Tharos
2012-01-03 00:07:11

#10 koubel: To je právě věc názoru... Ale naštěstí vlastně vůbec nevadí, že se neshodneme. ;)

Vezmi si ale třeba takovou Doctrine 2, což je knihovna, která je z velké části určena pro implementaci doménového modelu. Je zhusta založená na reflexích (přestože umožňuje i alternativní přístupy).

Rozveď prosím, proč Ti použití reflexe v business objektech nepřijde správné. Mně osobně reflexe přijde jako zajímavý nástroj, který má prostě své výhody a nevýhody a nevidím důvod jej někde z principu nepoužívat. Jaký účel má podle Tebe taková metoda setAccesible? Jak bys ji použil v analyzátoru či manipulátoru s kódem?

2012-01-03 01:17:25

Třetí řešení mi přijde absurdní. My sice nejprve stanovíme viditelnost na private, ale pak to sami vědomě porušíme. Můžeme někomu dalšímu zakázat udělat přesně totéž? Ne. Jaký je tedy smysl hrát si na nějakou viditelnost a neudělat všechno public?

replied by [14] Tharos
replied by [15] Tharos
2012-01-03 01:18:50

Ad Tharos:

Já bych předeslal, že tyhle přístupy se vymstí v okamžiku, jakmile začne PHP být trochu zatěžováno, nebo na stroji s mnoha weby.

Reflexe je drahá – ze všech hledisek. A v principu reflexe není nic jiného, než takové „pologenerování“ kódu, tedy zasahování do kódu nikoli tak jak je, ale už na „metaúrovni“, tedy napůl cesty ohledně generování.

Reflexe je drahá z hlediska prostředků – paměti, rychlosti.

Stejně tak jakákoli sofistikovanější dynamika je drahá, ale pořád podstatně levnější.

Jsem ze staré školy a kdysi se programátoři na kód nedívali pouze z hlediska ideologie, protože každé řešení má své pro a proti. To, že tady něco řešíme akademicky a virtuálně bez návaznosti na jakoukoli konkrétní situaci – tím si hrajeme na politiku, ideologie, komunismus, kapitalismus, prostě na nějaký ismus. Povídáme si tu co se komu POLITICKY líbí. Nic jiného.

Které řešení je dobré se zjistí až v rámci KONKRÉTNÍHO nasazení, tehdy to přestane být ideologie, tehdy přestaneme diskutovat jako v politbyru, tehdy přestane být debata subjektivní podle „někdo rád holky a někdo zase vdolky“ a tehdy teprve začne být, přesněji může být debata objektivní.

Kdybych dostal cizí kód, který bych měl opravovat, byl by nejšťastnější za první variantu.

Varianty typu reflexe, kde se zpřístupňují property, které teoreticky nemají být přístupné podle práv – to je o nabití si úst.

Celé sw inženýrství, celá analýza je jen o jednom: Člověk je prostě omezený tvor, který nedokáže udržet v mozku všechny detaily a tak se mu musí jednoduchost snížit. Proto se části celků zapouzdřují do modulů, objektů, logických celků a různých krabiček s API a interfacy – jen pro nedokonalost člověka, který to jinak nezvládne udržovat a administrovat. Jiný důvod v tom není. Pro neschopnost člověka udržet naráz v mozku příliš mnoho vazeb se dělají zapouzdřené celky, které mají minimum vazeb s okolím.

Jakmile do toho začnete vkládat černou magii typu další nenápadné a nečekané vazby, které logicky běžně programátor neočekává. Jakože si zpřístupníte private členy někam, kde nemají být vůbec přístupné, ale reflexí znásilníte leccos, apod. je to ekvivalentní vytváření dalších vazeb a závisslostí. Lžete sami sobě a maskujete interface třídy jak americká CIA. Třída jinému programátorovi lže o své struktuře a právech a o SVÝCH VAZBÁCH NA OKOLÍ. Lže mu, že nějaké property je private a tedy logicky programátor předpokládá, že mimo třídu a metody třídy do ní nikdo nepoloze.

To co dělá reflexe v tomto případě je něco co se nazývá POLITICKÁ KOREKTNOST. Tedy zastírání pravého významu.

Natahejte si podobné černé magie do projektu řekněme o 10 miliónu řádkách zdorjového kódu na každém rohu tucet a dojdete k tomu, že to zahodíte jako celek, protože to bude taková prasečina, že to nikdo nebude moct udržovat.

Lžete si v rozhraních tříd – a časem si z toho hodíte provaz.

Samozřejmě v jednoduchoučkém případě to vypadá pěkně – jako ochcávka i neškodně. Ale problém bude až takhle budete mít na malém projektu třeba několik set podobných ochcávek. Pak vedlejší efekty těchto ochcávek vám přerostou přes hlavu. Protože zase – mozek má omezenou kapacitu na počet vazeb. Jednu ochcávku nečistého použití reflexe zvládne. Ale ne třeba padesát. A pokud se naučíte tento styl, tak velmi brzo nezůstane u jedné ochcávky ála reflexe ale bude to váš styl.

A pak přijde poučení a nabití si úst. Případně měsíce až roky pekla udržování kódu vycpaného ochcávkami kdy si dokonale vyjasníte, že pokud se vám podaří tohodle projektu zbavit, že už to nikdy neuděláte.

replied by [14] Tharos
[14] Tharos
2012-01-03 02:02:06

#12 Jakub Vrána: Smysl neudělat všechno public je (pochopitelně) v tom, že u všech zde zmíněných přístupů lze nějakým způsobem validovat či sanitizovat vkládanou hodnotu (typovost, nullable, množina přípustných hodnot…).

Skrze reflexi lze nastavit private proměnnou na libovolnou hodnotu v PHP úplně všude. Z této perspektivy lze význam private úplně zpochybnit... Nikde v PHP se nemohu spolehnout na to, že někde budu mít nějakou určitou hodnotu...

Výhodu tohoto přístupu vidím prostě v tom, že přináší určité pohodlí, kdy si například další zapojení vývojáři nemusí při psaní entit umlátit prsty o klávesnici, nemusí si ani stahovat nějaké konkrétní IDE, které by umělo vygenerovat to, co potřebují, a nemusí si ani stahovat žádné jiné generátory. Prostě jenom nadefinují položky, pár jednoduchých anotací a mohou si být jisti, že při standardním používání té entity (tj. v souladu s nějakou dokumentací) budou mít všude validní data a i uložené typově správně.

#13 Miloslav Ponkrác: S tím souhlasím, je jasné, že bez konkrétního zadání se zde shody nedojdeme. Já jsem ale tak obšírněji reagoval právě proto, protože mi přišlo, že jste ve svém prvním příspěvku prezentoval pár myšlenek skoro jako hotová fakta, ale ono to tak mnohdy vůbec být nemusí (třeba to, že to vede k mnohem méně kódu). Jinak tu máte všichni pravdu, že reflexe jsou suverénně nejpomalejším řešením. Pak už jde jen o konkrétní aplikaci, totiž jak to vadí či nevadí…

Na rovinu ale říkám, že nemám nejmenší zkušenosti s projektem o rozsahu 10.000.000 řádků a chci se z vlastní vůle soustředit na projekty úplně jiného rozsahu.

[15] Tharos
2012-01-03 02:37:09

#12 Jakub Vrána: Jakube, ještě bych dodal dva odstavce, abychom se skutečně vzájemně pochopili.

Já osobně vůbec netvrdím, že private v kombinaci s přístupovými metody má nějaký neprůstřelný ochranný význam (viz reflexe). Já v tom vidím spíše praktický význam, kdy při použití přístupové metody se mi nepodaří omylem vložit nějakou nevalidní hodnotu, a v neposlední řadě v tom vidím i nástroj k zapouzdření, který bude fungovat tehdy, když bude programátor chtít (a nebude věci obcházet). Také se mi líbí možnost automatické typové sanitizace (pokud vložíme řetězec do položky, která má obsahovat celé číslo, a ten řetězec lze jako celé číslo interpretovat, převede se). To je ohromně praktické (pak lze skoro všude používat ===), protože masivní používání operátoru == vede pochopitelně k nemalému množství těžko odhalitelných chyb…

Kdybych ve svých kódech převedl všechny entity na přepravky s public proměnnými, musel bych zároveň buďto přepsat úplnou plejádu výskytu operátorů === na == (což bych vážně nerad), anebo dopsat konverze a různé kontroly na neúměrně velké množství míst (a v podstatě na nesprávná „místa“)… A to by nebyla zdaleka jediná komplikace. Tolik k významu private a přístupových metod za mě.

Vážně by mě zajímala Tvá oponentura, pokud bys měl prostor. Stojím o ni. :)

2012-01-04 05:05:07

Používám variantu 1. i když mě taky nepřipadá zcela ideální. Ale pořád se mě jeví lépe než ostatní navrhované.

Co se týče spousty psaní tak nadefinuju atributy a nechám si pomocí IDE dogenerovat settery/gettery (pořád to negeneruje takový kód abych na něj nemusel šahat - není nic jednoduššího než o to požádat :-) ). Pak upravím co potřebuju.

Co se týče validace a sanitizace tak v samotných entitách sanitizuji pouze empty string na NULL. O validaci se mě stará až event (listener), který se spustí před pokusem o uložení (jeden čas jsem to měl taky přímo v entitách). Pořád se tak nějak nemůžu rozhodnout jesli je to dobře nebo ne. Metainformace o validačních pravidlech validátor získá z anotací.

Jeden z důvodů proč používám variantu 1. jsou "read-only" property (jsem línej kvůli tomu dělat další anotaci).

Co se varianty 2. a 3. týká jsou lidé, kteří nadávají na vlastnost NetteObject $foo->getBar() == $foo->bar. Že to je fuj, špatné, náchylné k chybám etc. Pro ně musí být představa něčeho takového hotové peklo! :-)

2012-01-08 23:54:37

ad 1: nejpřímočařejší, nejčistší a nejukecanější způsob. Strojově generovatelný. Mám za to, že jakmile lze něco strojově generovat, tak to poukazuje na nedostatek (třeba jazyka) a snázeji to povede k chybám při budoucích úpravách. Když už používáme dynamický jazyk, netřeba se za to stydět a klidně bych __call využil ;)

ad 2: argument proti protected, že "kdokoliv si totiž pak může naši entitu podědit a hrabat se v atributech přímo" krásně zabíjíš příkladem č. 3, kde se hrabeš v cizích atributech i bez podědění. A dodatek "…navíc nemá neduh v podobě protected atributů." je pak argumentační smyčka.

Tady je třeba odlišit mezi "zabezpečením" a "viditelností". OOP není bezpečnostní firewall a programátor není cracker, který se snaží narušit aplikaci. Proto spousta pravidel je zapsaných jen neformálně, jako kontrakty. Například typ návratové hodnoty metody nelze nařídit, ale předpokládá se, že ho potomek u přepsané metody dodrží. Totéž pak platí pro protected atributy.

ad 3: u příkladu s private property chybí ten nejdůležitější řádek (vytvoření instance ReflectionProperty). Reflexi totiž nelze vytvořit. Nevíš, v jaké třídě ta property existuje. Ona může klidně existovat v každé úrovni hierarchie (tj. stejný název, ale úplně jiná proměnná). Řešení by bylo jednoznačné pouze v případě, že by entita byla final. Pokud ovšem bude entita final, je čistější řešení č. 2.

2012-06-14 14:52:25

Docela čistý způsob mi přijde 2 upravený aby používal traits. Zápis bude kratší, vlastnosti mohou být private a třída nebude mít typ Entity.

trait Entity {

	public function __call($methodName, $params) {
		$action = substr($methodName, 0, 3);
		$name = strtolower(substr($methodName, 3, -1));
		switch($action) {
			case 'get':
				return $this->$name;
				break;
			case 'set':
				// kontrola typu přes anotaci
				$this->$name = $params#0#;
		}
	}
}
class Product {

	use Entity;
	/** @var string */
	private $user;

}
Pokud bychom se chtěli vyhnout reflexi úplně, mohli bychom typ proměnné uložit jako řetězec a v konstruktoru udělat analýzu, uložit do interní tabulky a nastavit výchozí hodnoty. To už je ale, uznávám, trochu nestandardní.
trait Entity {

	private $_ = [];

	public function __call($methodName, $params) {
		$action = substr($methodName, 0, 3);
		$name = strtolower(substr($methodName, 3));
		switch($action) {
			case 'get':
				return $this->$name;
				break;
			case 'set':
				if (gettype($params#0#) === $this->_[$name]) {
					$this->$name = $params#0#;
				} else {
					throw new Exception('Invalid type.');
				}
		}
	}
	public function __construct()
	{
		$this->_ = get_object_vars($this);
		unset($this->_["_"]);
		// mozna kontrola, zda typy existuji
		foreach ($this->_ as $name => $value) {
			$this->$name = NULL; // nebo vychozi hodnota
		}
	}
}
class Product {

	use Entity;
	/** @var string */
	private $user = 'string';

}

2012-06-14 15:02:28

Oprava prvního bloku kódu na řádku 5:
$name = strtolower(substr($methodName, 3));

2012-10-29 08:09:31

Moderate, all-natural hair-styles perform the best

2012-11-14 08:46:06

ugg boots uk

2012-12-05 03:19:29

I am very happy to look your article.

2012-12-18 08:12:11

louis vuitton outlet

2012-12-18 08:13:16

louis vuitton borse

2013-01-04 08:45:03

Louis Vuitton is perfect.

2013-01-15 09:15:55

Brother's friend asked the brothers: all of a sudden want to buy the block lightwave table play, but hovering between Seiko and Citizen, I answer: On Cheap Ugg Boots the good-looking, I like Seiko ~ ~ On the classic

2013-01-25 09:33:46

hen you decide that it is time to shop online, you want to make some strides to see if you can find all the things you need easily.

2013-01-30 14:13:24

Essay Writer has experts and specialists on its writing team – graduates of some of the top universities in the UK, most of whom are Architecture Studies degree holders. Our writers specialise in several Architecture-related fields including design and aesthetic theory.

2013-01-31 11:55:56

Essay Writer has a comprehensive essay writing service menu that provides custom education essays, made specifically to meet the client’s requirements.

2013-02-14 10:08:48

Essay Writer provides UK students a custom essay writing service for management essays and other management-related subjects or topics.

2013-02-28 08:24:55

Thus, honesty is very important in essay writing business.

2013-03-03 11:47:57

Good writers accomplish these tasks by immediately establishing each paragraph’s topic and maintaining paragraph unity, by using oncrete, ersonal examples to demonstrate their points, and by not prolonging the ending of the essay needlessly.

2013-03-04 06:18:14

Private atributy v entitách a jejich zviditelnění ve společném předkovi pomocí reflexe.

2013-03-15 03:57:14

On Wednesday night, Pope Francis endeared himself to the crowds in St Peter's Square - and underlined his reputation for humility - when he asked them to bless him before blessing them in return from the balcony of the basilica.

2013-03-25 14:17:13

cheap oakley sunglasses are for people who often take part in outdoor oakley sunglasses cheap recreation and adventure, really worth buying,cheap oakleys careful study and analysis of the discount oakley sunglasses head structure of Oakley company every detail, has introduced a variety of perfect fashion oakley sunglasses sale to consumers.

2013-03-31 18:20:23

Im content, I must say. Rarely does a person find blog site that is definitely together informative and dazzling, and also without a doubt, you've smacked often the claw in the face.

2013-04-13 20:18:39

Very useful info. Hope to see more posts soon!

2013-04-22 07:29:12

Good post. I learn something totally new and challenging on websites I stumbleupon everyday. It will always be useful to read through articles from other writers and practice a little something from other sites.

2013-04-22 08:26:39

I really like and appreciate your blog.Much thanks again. Will read on…

2013-04-23 11:08:59

Good writers accomplish these tasks by immediately establishing each paragraph’s topic and maintaining paragraph unity, by using oncrete

2013-05-07 12:20:00

устройство для прыжков, представляющее собой плетёную сетку из прочной тесьмы.

2013-05-07 12:21:28

Činka je sportovní nářadí sestávající z tyče, která má na každém konci připevněné závaží tvaru koule nebo kotouče. Závaží bývají často snímatelná a tak lze podle potřeby měnit hmotnost činky.

2013-05-07 17:11:27

I got this web site from my buddy who told me regarding this site and now this time I am browsing this web page and reading very informative articles at this time.

2013-05-13 04:22:01

Inside its fashionable exterior, this hobo bag is also a practical choice and a wonderful way to keep all your daily necessities organized and close at hand. Just unzip this double handle bag's top closure and look inside to find a spacious interior with lots of storage options, including 2 zippered pouches and 1 open pocket.

2013-05-14 12:47:32

This is a great blog,I like this post it is very good and informative. I am sure that this post will be very much helpful for people.

http://www.cheapessaywriting.net

2013-05-15 16:42:02

Nice information, many thanks to the author. It is incomprehensible to me now, but in general, the usefulness and significance is overwhelming. Thanks again and good luck!

2013-05-16 16:09:59

This was a great and interesting article to read. I have really enjoyed all of this very cool and fun information. Thanks

2013-05-17 17:33:01

Such a blaster information shared. Looks to me a great feature to make your website great to visit. Thanks

2013-05-24 06:36:07

Nice php script, Do you have any php script for social network?

2013-05-25 15:39:15

Určitě nějaké příjemné a názory. Váš blog nabízí nový pohled na toto téma.

2013-05-29 13:24:51

Saffron (Crocus sativus L.) is a natural substance long used in cooking and in some systems of traditional medicine. Typically consumed as a spice, saffron is also sold in dietary supplement form. Proponents claim that supplements containing saffron extract can help promote weight loss and aid in the treatment of a number of health conditions.

2013-05-29 13:25:26

The Nikon COOLPIX S6300 has a powerful 10x optical zoom-NIKKOR glass lens and a high-resolution 16.0-megapixel CMOS sensor. Additionally, it records full HD 1080p movies with stereo sound and includes features like Easy Panorama Mode, 3D Photos, HDMI output, 2.7-inch LCD, and more.

2013-05-29 13:25:54

Great info. I love all the posts, I really enjoyed, I would like more information about this, because it is very nice., Thanks for sharing.

2013-05-29 13:26:16

The Kindle Paperwhite boasts the best screen we've seen to date on an e-ink e-reader. The built-in light is great for nighttime reading, and the touch screen is a notch above the competition. Amazon's e-book selection remains best in class. Battery life is excellent so long as you turn Wi-Fi off.

2013-05-29 13:26:36

Kindle Fire HD 7 has most advanced as 1280x800 HD display with polarizing filter and anti-glare technology, Over 23 million movies, TV shows, songs, magazines, books, audiobooks, Integrated support for Facebook, Twitter, Gmail, Hotmail, Yahoo.
We can make video calls using Skype, Facebook with Front-facing HD camera. It has 1.2 Ghz dual-core processor with Imagination PowerVR 3D graphics core and more ... I think, Kindle Fire HD 7 will satisfy your passion

2013-05-29 13:27:04

The samsung galaxy S4 is a Smartphone which was manufactured by Samsung Electronics. It was first announced in the New York city and this phone is a descendant to the Samsung galaxy III. Galaxy S4 is designed with various new features such as smart stay, smart scroll, smart alerts, 13 megapixel camera and 1080p display. It uses Google’s Android mobile operating system. The Samsung software applications are usually named with the letter ‘S’ followed by the function, for example the fitness related application is called as S Health and the voice assistant is called S voice. The Samsung Galaxy S4 supports high efficiency video coding. The camera software of galaxy S4 is designed with excellent features such as drama shot, sports Modes, beauty face, 360 photos, sound and shot, cinema photo, night, Eraser, best face, dual shot, best photo, dual recording, high dynamic range, dual video call, etc.

2013-05-29 13:27:35

Sony NEX-3N for APS-C sensor 16.1 MP CMOS sensor and BIONZ image frame Full line of Sony Alpha 99. In particular, BIONZ chip with anti-interference ability and make good light in low light conditions which are highly appreciated. This configuration also helps the NEX series won many photography awards. Other notable strengths is the ability to autofocus quickly and accurately in a variety of circumstances.

2013-06-03 14:04:59

mr president i just want you too know that this nigeria my country is not for wan person do good sothat when live thy will talk your matter for good but if you dis too do bad no problem i no you will live wan day another person will enter nigeria is not for wan traip just no that bye.

2013-06-17 11:53:38

Currently, Tesla has achieved victory in New York, after several rounds in Texas after the hearing has not been a winner.Musca said: "If the franchisees really [url=http://www.nikeblazerforsale.co.uk/]nike blazer[/url] believe they are saying that they are the best selling cars channels, then they can do better, do not be afraid of competition."
Musca In early April the new finance lease plan reflects the company's success unshakable conviction: three years after the Model S owners can park your car at not less than the value of Mercedes-Benz S-Class discount percentage (usually 45%) sold back to Tesla, Musca to all personal net worth of unlimited liability for buyback guarantee to do (in the latest Forbes Rich List Musca net worth of $ 2.8 billion on). (Fully [url=http://www.airmaxnike90.de/]nike air max[/url] embodies the spirit of idealism Musk, in fact, if someday tesla missed appointments, then, Musk probably have to find the money to pay the rent)
In addition, Tesla also provided to Daimler Series A, B Series and Smart electric vehicle powertrain, Toyota RAV4 EV powertrain will give Tesla Model S in this part of the amount of revenue accounted for prenatal Tesla half of revenue.

2013-06-24 11:57:57

Great post! Keep it up the good work and also keep posting.

http://www.ebmltd.co.uk/products/printer-repair-and-servicing

2013-06-25 19:09:24

Very informative and helpful. I was searching for this information but there are very limited resources. Thank you for providing this information.

2013-07-08 05:23:04

llion d’époux » grand concours de réseau, et s’est achevée avec succès en Mars de cette année, a remporté le premier prix du marié sortir Double Costa Crociere superbe lune de miel de luxe avec les prix du cinéma. Comme les activités sont parties à la louange, le http://www.repliquemontresuisse.com/
[url=http://www.repliquemontresuisse.com/]replique montre[/url]

2013-07-13 11:00:18

llion d’époux » grand concours de réseau, et s’est achevée avec succès en Mars de cette année, a remporté le premier prix du marié sortir Double Costa Crociere superbe lune de miel de luxe avec les prix du cinéma. Comme les activités sont parties à la louange,

2013-07-25 13:53:24

Thanks so much for sharing this awesome info! I am looking forward to see more posts by you

2013-07-26 07:28:34

Keep it up the good work and also keep posting. I really enjoyed, I would like more information about this

2013-07-29 10:21:26

Thanks for sharing such a wonderful and interesting opinion.

2013-07-29 17:15:37

I really like and appreciate your article post.Really looking forward to read more. Really Cool.

2013-08-04 07:50:29

For me, not what sexy than to see a man walking in the campus around the messenger bag hanging on his body (heat, chiseled). I very much like to see a guy in a dress shirt (color), jacket, a pair of jeans, a pair of beautiful shoes (best match his belt), as well as a messenger bag.To complete the appearance, wearing the top and a regular browsing jeans. In order to a Bohemian look, it has a long dress matching color similar scarf.

2013-08-13 08:55:58

I saw some interesting style above and for sure I will follow your tips!

2013-08-13 09:21:14

This was a great and fun article for me to read. I have really enjoyed all of this very cool and fun information. This was really very interesting.

2013-08-14 11:52:28

This is my first time i visit here. I found so many interesting stuff in your blog, especially its discussion. From the tons of comments on your articles, I guess I am not the only one having all the enjoyment here! Keep up the excellent work.

2013-08-15 12:32:35

Very nice thanks for providing good information.

2013-08-20 10:28:05

Kaufen Sie hier günstig hüllen http://www.hullensamsung.com/s3/s4,galaxy s3 hülle,s3 schutzhülle,hülle für samsung,cover samsung galaxy.

2013-08-21 09:00:50

Nice Information dude thanks for sharing this valuable info i was searching it for long time.

2013-08-24 13:30:23

There is a miracle fruit that has many properties to help you lose weight fast. Garcinia Cambogia is a little fruit from Asia and India that will help you to lose fat and take inches off of your stomach, butt and thighs. This fruit has the power to work against fat while increasing your mood. Garcinia Cambogia extract is 100% natural extract that is safe and has no negative side effects.

2013-08-24 13:34:35

Raspberry Ketones Max contains the “Ketone enzyme,” which gets rid of fat fast. It’s from raspberry extract made into a supplement. Doctors recommend the use of herbal supplements like Raspberry Ketones Max to lose weight because it’s safe for use without side effects. It doesn’t harm the body at all. Ketones burn fat because they help increase fat oxidation and metabolism. These two processes are made simpler and faster by Ketones, so fat can easily be eliminated from the body.

2013-08-24 13:36:10

Many people crave photo-ready skin, especially in this modern age of reality television when a camera can materialize out of nowhere at any time. Revitol Pore Minimizer is a beauty product that aims to reduce the size and appearance of pores, decrease breakouts, and make skin glow. Does this product live up to its claims? Let’s find out.

2013-08-24 13:37:42

One weight loss dietary supplement that’s creating waves today is green coffee bean extract take. Coffee is just one of the biggest assets of anti-oxidants that are essential for helping your physique remove the accumulation of free radicals that are liable of the lengthy list of sicknesses, as all of us comprehend. Whenever coffee espresso beans are roasting nevertheless, a critical this essential component is destroyed consequently reducing the great consequences of coffee.

2013-08-24 13:38:23

The Kindle Paperwhite boasts the best screen we've seen to date on an e-ink e-reader. The built-in light is great for nighttime reading, and the touch screen is a notch above the competition. Amazon's e-book selection remains best in class. Battery life is excellent so long as you turn Wi-Fi off.

2013-08-24 13:59:19

The Nexus 7 put out by Google is becoming widely popular not just because of its compact and easy to carry design but also because the screen resolution and gaming experience is vastly more desirable than most tablets out on the market today.

2013-09-02 20:22:20

Excellent and helpful post… i am so glad to left comment on this. This has been a so interesting read, would love to read more here

2013-09-05 13:50:15

Many fat loss programs are packed with outrageous claims for instance "rub this kind of gel on your own stomach and watch the excess fat melt away". Nonetheless, can you truly trust an idea which tends to make such unlikely claims?

2013-09-05 13:51:19

For many, adhering to be able to any diet program can be quite a real energy that will take confidence and also commitment along with resolution to find out through for the end.

2013-09-05 13:51:39

Despite the fact that Australia is a considerable ways away and can be quite a bit pricey to have there, this is a very child-friendly spot with a lot of cost saving adventures to be enjoyed for the youngsters. Australian away from peak differs from the others from United states so carry out some study.

2013-09-05 13:51:57

Work seeker that is looking being thorough will search regarding jobs on the web, but may also integrate periodicals and newspapers within their campaign.

2013-09-05 13:52:14

A seasoned web articles writer should be able to use the appropriate keywords allow the article to acquire a good ranking online.

2013-09-13 10:42:58

It's in reality a great and useful piece of information. I am satisfied that you just shared this helpful info with us. Please stay us up to date like this. Thank you for sharin

2013-09-13 11:05:16

Many thanks for this have been searching everywhere for it.

2013-09-13 11:44:24

Keep up your work I want to thank you for this informative read I really appreciate sharing this great post. Keep up your work.

2013-09-13 11:57:06

Pretty cool post. It’s really very nice and useful post.Thanks for sharing this with us!it’s my first visit.

2013-09-13 12:30:52

hanks for very interesting post. I have a high regard for the valuable information you offer in your articles. I really believe you will do much better in the future.

2013-09-26 11:09:10

http://www.gateway3ds.co/link-gateway-3ds.htmlpour Nintendo 3DS en france Gateway 3DS http://www.gateway3ds.co/link-gateway-3ds.html
Gateway 3DS en france,le premier Linker permettant le lancement des Jeux 3DS,Linker Gateway 3DS pour Nintendo 3DS.

2013-09-26 11:12:46

r4 kaart kopen,r4i gold,r4i sdhc,http://www.r4-kaart-kopen.nl/r4 sdhc,r4i gold 3ds,m3i zero,acekard 2i.Gratis verzending voor alle http://www.r4-kaart-kopen.nl/categories/r4-Kaarten-voor-3DS/R4i--Sdhc-3DS-Kaart-/bestellingen.r4 kaart kopen Betaling werkt heel eenvoudig via iDeal.http://www.r4-kaart-kopen.nl/categories/r4-Kaarten-voor-DSi%7B47%7DDSi-XL/Acekard-2i-kaart/

2013-09-26 11:15:33

Italia it.r4-3ds-r4i.net offre una gamma enormehttp://www.r4-3ds-r4i.net/Scheda-R4i-SDHC.html di schede r4 ds, Troverai tutte le informazioni di cui hai bisogno per scegliere la scheda R4 giusta per te, R4 3DS,R4i 3ds,r4i gold,r4 revolution, r4 nintendo ds,http://www.r4-3ds-r4i.net/Scheda-R4i-Gold-3DS.htmlr4 revolution for ds,r4 per dsi,scheda r4,r4 per dsi xl,r4i gold revolution,r4i xl e schede R4i Gold. oltre agli ultimi download R4

2013-09-26 14:50:04

I suggest this site to my friends so it could be useful & informative for them also Great effort.

2013-10-04 13:32:09

This is good article, very informative and on the spot. I'm happy I stopped by and I'm very fond of the fact that I have learned something today. Keep up the good work.

2013-10-11 09:24:40

Moncler is famous for its serious attitude and careful way of selecting materials, Moncler sandals are no exception.

2013-10-23 10:23:53

Hey. spectacular position. I did not foresee this. It is a fantastic story. Thanks!

2013-10-23 10:24:59

Perfectly I sincerely preferred reading through it. This put up offered by you could be very effective for proper preparing.

2013-11-11 04:43:05

当店最大級シャネルコピー,シャネル財布,シャネルバッグ,シャネル時計,シャネル靴専売店!
シャネルコピー
弊社は「信用第一」をモットーにお客様にご満足頂けるよう
最大級激安シャネル市場-中日貿易シャネルブランド商品の取引商とメーカー商。
新作バッグ送料は無料です(日本全国)! ご注文を期待しています!
激安シャネルコピー店長:川野

2013-11-11 18:26:06

This is the topic which we actually needs to be understood. These are the most highly programs that we must follow.

2013-12-04 03:25:48

hahaha.. im no understand about this coding.. but nice info

2013-12-07 22:25:39
2013-12-07 22:26:11
2013-12-07 22:26:21
2013-12-07 22:26:31
2013-12-07 22:26:41
2013-12-07 22:26:50
2013-12-07 22:26:59
2013-12-07 22:27:07
2013-12-07 22:27:16
2013-12-07 22:27:26
2013-12-07 22:27:34
2013-12-07 22:27:41
2013-12-07 22:27:49
2013-12-07 22:27:50
2013-12-07 22:27:57
2013-12-07 22:28:07
2013-12-20 14:26:22

Thanks
http://alrazaak.com/threads/425-House-of-Quran-Quran-Recitation-word-by-Word-Memorization-tool-for-beginners-kids

2014-01-08 05:58:29

Nice share guys

2014-02-08 16:35:31

Nice article, thanks for the information. It's very complete information. I will bookmark for next reference.

2014-02-11 06:09:19

Any guide's job isn't really to necessarily store from having mistakes, establishing trouble or possibly ever needing any very difficult or dangerous and also disappointing endures. All of this is actually very fiber which up all the fabric of all time.

2014-02-11 06:09:36

Movies instruction is any driving session involving movies and instruments in making music. It is typically part from the school's program or in the form of special quality for students in which are musically inclined bench press. Examples feature music workout on thoughts, piano, nylon string guitar, drums, and additionally flute, among numerous others.

2014-02-11 06:09:58

Honeymoon is the most cherished and looked forward to moments of a person's life. Honeymoon enables the freshly wedded couple to come close to one another and spend some cozy moments in each other bands arm and see lover in their new relationship.

2014-02-11 06:10:13

If you own a business that uses vehicles in the course of providing goods and services to your customers, you need commercial car insurance. For example, daycare centers often transport children to and from school, as well as on field trips.

2014-02-11 06:12:30

Have you been looking to take your business to another location step? Then you should think about attending a social media marketing and training seminar. Today if your business isn't using social media and online marketing to reach prospective clients, or customers, you are increasingly being left behind.

2014-02-22 04:03:33

this has been a very interesting post. i enjoyed it a lot. looking forward to more of your posts.

2014-02-26 17:16:26

Hello. And Bye.
http://somepaydaylounz.com - mr fitz

2014-03-05 12:59:43

i love your blog. I hope to see more posts from you! Please keep them coming

2014-03-11 03:56:17

very useful for me. thanks for sharing

2014-03-24 09:54:58

I like your website. Thank you for great information. I will come back to your website again.

2014-04-03 15:39:15

Hello, i think you'a have a great knowlage

2014-04-09 08:37:06

what a post really nice thanks for the share.

2014-04-09 08:52:05

really good and informative thanks for the grat posthttp://www.geoessay.com/essay-writing.html

[136] news
2014-04-10 06:18:18

Thanks for making such a cool post which is really very well written.will be referring a lot of friends about this.Keep blogging.

2014-04-11 15:44:20

thanks a lot:)

2014-04-15 15:24:51

Wybór najlepszej firmy obsługującej nieruchomości niekoniecznie jest prostą sprawą. Fachowcy posiadający w ofercie kompleksowe usługi administrowania nieruchomościami troszczą się o to, by nieruchomość pozostawała w doskonałym stanie, ale też by właściciel spełniał wszelkie formalne wymogi. Zajmują się aktualizacją listy lokali, prowadzą dokumentację techniczną czy reagują w przypadku ewentualnych awarii. Zarządca nieruchomości kontaktuje się również z ludźmi poszukującymi lokum, oferując różnorodne mieszkania do wynajęcia w Poznaniu. http://www.admico.pl/

2014-04-17 22:12:41

Actually I am not habituate to reply a comment on blogs but this blog caught my attention and I am compelled to write a comment here to express my gratitude to you. I would like to appreciate for this awesome work.

add comment