phpFashion

Export z Facebooku do Google Calendar

Jak vyexportovat události z Facebooku do Google Calendar, aby vše fungovalo dobře?

Otevřete si Facebook a klikněte na „Události“. Adresa s exportem událostí ve formátu iCalendar je trošku nečekaně ukrytá pod ikonkou lupy:

Adresu si zkopírujte do schránky:

Odkaz bychom mohli hned dát to Google kalendáře, ale narazili bychom na několik nedostatků. Google nedokáže korektně zobrazit neveřejnou událost, místo ní uvidíte pouze nicneříkající slovo „nedostupný“:

Google nedokáže ani filtrovat události podle toho, zda jsme potvrdili účast. Takže kalendář se nám plní nejen událostmi, na které jsme účast potvrdili, ale i těmi, na které nás někdo zatím jen pozval. Navíc u událostí v letním čase uvádí o hodinu více.

Vše lze vyřešit jednoduchým filtrem facebookfilter.php, který si umístěte na server:

// load events from Facebook
$s = file_get_contents("http://www.facebook.com/ical/u.php?$_SERVER[QUERY_STRING]");

// PREG requires \n line breaks
$s = str_replace("\r\n", "\n", $s);


// fix private events bug in Google Calendar
$s = str_replace('CLASS:PRIVATE', 'CLASS:PUBLIC', $s);


// remove unconfirmed events
function filterEvents($m) {
	return strpos($m[0], 'PARTSTAT:NEEDS-ACTION') ? '' : $m[0];
}
$s = preg_replace_callback('#^BEGIN:VEVENT\n(.*?)^END:VEVENT\n#sm', 'filterEvents', $s);


// fix daylight savings bug in Google Calendar
function fixTime($m) {
	$zone = new DateTimeZone('Europe/Prague');
	$time = new DateTime($m[2], new DateTimeZone('UTC'));
	$fix = $zone->getOffset($time) - $zone->getOffset(new DateTime('20000101', $zone));
	$time->modify("-$fix seconds");
	return $m[1] . $time->format('Ymd\THis\Z');
}
$s = preg_replace_callback('#^(DTSTART:|DTEND:)(.+)#m', 'fixTime', $s);


// revert line breaks back
$s = str_replace("\n", "\r\n", $s);

header('Content-Type: text/calendar; charset=utf-8');
echo $s;

Do Google kalendáře přidáme adresu našeho filtru se stejnými parametry v URL, jako měl původní skript od Facebooku:

A je to!


Jak vypsat funkci, argumenty, proměnné?

Ladíte v prohlížeči PHP aplikaci a potřebujete ji v jednom místě snadno zastavit a přehledně zobrazit všechny důležité informace jako:

  • právě volanou funkci
  • argumenty, které ji byly předané
  • lokální proměnné
  • call stack

A občas by se hodily i globální proměnné $_SERVER, $_COOKIES, HTTP hlavičky, apod.

Jak na to?

Tohle umí Laděnka neboli Tracy, dříve Nette\Diagnostics\Debugger. Pokud používáte Nette Framework, Laděnku už máte, protože je jeho nedílnou součástí.

Laděnku nejprve aktivujeme. Pro uživatele samostatné verze stačí zavolat:

ndebug();

(Uživatelé Nette Framework, aktivujte Debugger::$strictMode = true; a zavolejte Debugger::enable().)

Nyní v místě, kde chceme program přerušit a zobrazit všechny požadované informace, stačí napsat $stop():

	public function authenticate(array $credentials)
	{
		list($username, $password) = $credentials;
		$row = $this->users->where('username', $username)->fetch();
		$stop(); // tady se program přeruší

		...

Debugger vám přehledně ukáže místo, kde k přerušení došlo:

Všimněte si, že hodnotu lokální proměnné lze zobrazit tím, že na ni najedete myší. Cool!

Můžete si nastavit systém tak, aby při kliknutí na jméno souboru jej otevřel ve vašem oblíbeném editoru:

K dispozici je přehled všech proměnných, které byly funkci předány (pod záložkou Callstack):

A přehledně vypsané všechny lokální proměnné, složitější struktury můžete kliknutím rozbalit:

Samozřejmostí je celý call stack, opět s rozklikávacím pohledem do zdrojového kódu nebo předávaných proměnných. A také lze klikem na jméno souboru jej otevřít v editoru:

Níže najdete všechny informace o HTTP požadavku, počínaje hlavičkami přes cookies k GET/POST proměnným:

A nechybí ani pole $_SERVER, konfigurační direktivy, konstanty atd:

Dokáže tohle váš framework? 😉 Pokud ne, seznamte ho s Laděnkou.


První jiná Poslední sobota

Poslední sobota je každoměsíční setkání všech fanoušků programování webových aplikací, ať už to jsou odborníci nebo amatéři. Znalost Nette Frameworku je výhodou a vstup je zdarma. Tahle Sobota ale byla jiná než předchozí.

Trocha nostalgie: První Poslední sobota proběhla předposlední červencový pátek roku 2008 v Brně. V komorním prostředí se setkal zakladatel budoucího WebExpa, kluk s fobií z počítačů (ale léčil se), jiný kluk, co ještě neslyšel slovo framework, a podobně. Byla to skvělá akce, ze které existuje zvukový záznam, který mám strach si pustit. Očekávám něco na styl Boženky.

Vůbec by mě tehdy nenapadlo, že se z Poslední soboty stane událost s tak dlouhou tradicí.

Od února 2009 se totiž koná Poslední sobota pravidelně každou poslední sobotu v měsíci, střídavě v Praze a Brně. Nebo jinde. Musím zmínit nesmírně vydařenou PS v Bratislavě na lodi s indickou restaurací nebo v Ostravě přímo na ulici Stodolní v baru jménem Ruby ležícím kousek od kolejí.

One more thing: Jakub Vrána na Poslední sobotě. Na rozdíl od Billa se setkal s vřelým přijetím 🙂 Photoshopped by @SlavaCz.

Poslední sobota vždycky balancovala mezi hospodskou slezinou a workshopem s programem přednášek. Balanc ne vždy vyšel, často kvůli prostorům, což vedlo k rozčarování. Chtěl jsem proto PS posunout na novou úroveň (nebo jít od toho pryč). V říjnu jsem se potkal s Janou z pražského Hubu a Markem, který tam pořádá setkání Drupalistů, pokecali jsme, slovo dalo slovo a zarezervoval jsem prostor v Hubu pro novou Poslední sobotu. Na leden, při příležitosti vydání Nette Framework 2.

Nová Sobota

Jak to probíhalo se můžete podívat na fotografiích od Fandy Šidáka. Nebál bych se to nazvat malou konferencí: dorazilo cca 140 lidí, čekala je šňůra přednášek završená openspace diskusními bloky. Slidy najdete přímo na webu posobota.cz, brzy se objeví i videozáznamy. Ke konci už jsme byli hladoví jak psi (příště to chce catering) a vyrazili na večeři do steak house.

I v těžké konkurenci všech ACTA a SOPA se nám podařilo s #posobota dostat mezi top hashtagy na klaboseni.cz. A prakticky všechny reakce byly pozitivní, což znamená, že nový formát Poslední soboty měl úspěch.

Budeme v tom pokračovat!

Musím poděkovat Vítkovi za zásadní pomoc s organizací, sponzorovi Klikpojisteni.cz, že do toho velmi odvážně šel, klukům za jejich prezentace, fotografie a videozáznamy. A pochopitelně všem návštěvníkům, kteří dorazili mnohdy z daleka, a dali akci smysl.

Sponzoring

Věčně slýchám, jak firmy těžko shánějí dobré programátory, jací diletanti jim chodí na pohovory, a ptají se mě, jestli bych jim mohl někoho doporučit. Odpovídám: přijďte na Poslední sobotu! Tam je máte všechny pohromadě, stačí je jen oslovit. Znám pár úspěšných firem, které jsou takřka komplet sestaveny z osobností Posledních sobot.

V roce 2010 se stala společnost Skype prvním sponzorem Poslední soboty, pojala to excelentně a udělala si výborné jméno v komunitě PHP programátorů. Pokud chcete oslovit perspektivní lidi, pojďte ji v tom následovat. Stačí mi napsat na email.


TOHLE. KURVA. ANI. OMYLEM.

Ne každému a ne na všechno se vždy a univerzálně hodí velké frameworky!

Nadpis jsem si vypůjčil z článku Manifest miniaturního PHP, pod nějž bych se klidně elektronicky podepsal, mít elektronický podpis. Sice argument s počítáním řádků je nefér a diskutabilní, ale rozumím, co se autor snažil říct. Na Zdrojáku jsem pod něj napsal komentář, který jsem se nakonec rozhodl zvěčnit i tu na blogu:

Docela často dělám jednoduché weby, které celé napíšu v „notepadu“, a chci, aby kód neměl víc řádků, než je naprosto nezbytně nutné a nahrávat kvůli 20kB webu i se styly na hosting hafo-megabajtový framework nepřichází v úvahu už vůbec.

Ale přitom i v těch jednoduchých webech chci použít věci, co jsou vyřešené v Nette, a nechci se vzdát navyklého pohodlí. Jsem líný programátor. Z toho důvodu se dá Nette Framework používat jako micro framework.

Chtělo by to příklad. Zrovna včera jsem si redesignoval https://davidgrudl.com a dal k dispozici zdrojové kódy (odkryjte rožek vlevo nahoře), čistě pro inspiraci ostatním, jak takový microsite řeším. Celý PHP kód webu je tvořen jedním souborem index.php, který je, věřím, srozumitelný, byť pro neznalého asi méně. Zbytek jsou šablony. A framework nahraný v minifikované podobě jediného souboru, což, společně s faktem, že má cca dvojnásobnou velikost než jQuery, řeší psychologický blok „nechci nahrávat celej framework“.

Nebo příklad blogu, který najdete přímo v distribuci. Jeho zdroják tvoří taktéž pouze index.php, a to ještě s méně řádky, než v předchozím případě. Vše ostatní jsou šablony, viz https://github.com/…ta/templates.

Asi bych měl napsat, proč vlastně na pidiwebech framework používám. Tak především si dnes neumím představit, že bych něco programoval bez Laděnky, ta mi pak na ostrém serveru bude logovat chyby (ačkoliv u statického webu asi nebudou). Především ale využiju šablonovací systém Latte, protože už od 2 stránek chci mít oddělený layout a obsah, vyhovuje mi stručná syntaxe Latte a spoléhám na automatické escapování. Využiji i routování, protože prostý požadavek mít URL adresy bez koncovek .php dokáže v mod_rewrite nastavit (správně!) jen bůh.

V prvním zmíněném webu se ještě používá kešování pro twitter feedy, na blogu je zase využit databázový layer. A taky SEO vychytávka Nette, která automaticky předchází známé chybě, kdy se při stránkování pohybem vpřed a vzad dostaneme na tutéž stránku, jen jí v URL bude navíc strašit page=1.

A taky mi Nette zajistí, že se při chybě nikdy neobrazí programátorské chybové hlášky PHP, ale uživateli srozumitelná stránka. A ještě autoloading – už jej vnímám jako takovou samozřejmost, že bych na něj úplně zapomněl.

Samozřejmě někdy ještě přidám kontaktní formulář a nechám ho odesílat emailem. Teď si teprve uvědomuji, že vlastně využívám 90 % frameworku.

Takhle tvořím quick'n'dirty weby a takhle mě to baví 😉

Viz také: Jak psát mikro-weby


Nejkratší parse error v PHP

Jaký je nejkratší kód v PHP, který způsobí parse error? Má právě 5 znaků a vyžaduje povolené short_open_tag:

<?php

Po spuštění vyhodí:

Parse error: syntax error, unexpected $end of file in test.php on line 1

Syntaktickou chybu lze opravit přidáním mezery nebo odřádkování 🙂


Špeky a párky v nahrazování řetězců

Jak se nenechat vypéct při nahrazování výskytů jednoho řetězce jiným. Search & Replace tricks.

Základní funkcí pro nahrazování řetězců v PHP je str_replace:

$s = "Lorem ipsum";
echo str_replace('ore', 'ide', $s); // vrací "Lidem ipsum"

Díky chytře vymyšlenému kódování UTF-8 ji lze spolehlivě používat i pro takto kódované řetězce. Navíc jako první dva argumenty lze uvést pole a funkce potom provede vícenásobné nahrazení. A tady narážíme na první špíček, který je třeba mít na zřeteli. Každé nahrazení prochází řetězec znovu, pokud bychom tedy chtěli ve větě pánské dárky prohodit <⇒ a získat tak dánské párky (švédská delikatesa!), žádné pořadí argumentů k cíli nepovede:

// vrací "dánské dárky"
echo str_replace(array('dá', 'pá'), array('pá', 'dá'), "pánské dárky");

// vrací "pánské párky"
echo str_replace(array('pá', 'dá'), array('dá', 'pá'), "pánské dárky");

Hledanou funkcí, která řetězec projde jen jednou a zamezí vzniku kolizí, je strtr:

// vrací "dánské párky", hurá
echo strtr("pánské dárky", array('pá' => 'dá', 'dá' => 'pá'));

Pokud bychom hledali výskyty podle složitějších pravidel, využijeme regulární výrazy a funkci preg_replace. Ta také umožňuje vícenásobné nahrazování a chová se stejně jako str_replace. Teď však mířím jinam. Potřebuji v řetězci nahradit všechny čísla slovem hafo, což je snadné:

$s = "Radek tvrdí, že má IQ 151. Pěkný sběratelský kousek!";
echo preg_replace('#\d+#', 'hafo', $s);

Zobecněme kód, nechť umí čísla nahradit čímkoliv, co mu předáme v proměnné $replacement. Řada programátorů použije:

return preg_replace('#\d+#', $replacement, $s); // spatne!

Což bohužel není dobře. Je třeba si uvědomit, že i v nahrazovaném řetězci mají určité znaky speciální význam (konkrétně lomítko a dolar), proto ho musíme escapovat. Správné obecné řešení je:

return preg_replace('#\d+#', addcslashes($replacement, '$\\'), $s); // ok

Napadají vás ještě nějaké nahrazovací špeky?


Git: snadný cherry-pick z GitHubu

Pokud vám někdo na GitHubu pošle commit, je vhodné ho před začleněním do hlavní větve ověřit nebo třeba upravit. Jak si snadno commit z GitHubu vyzobnout do svého repozitáře? Používám k tomu skript remotepick.php, který spustím v repozitáři a jako parametr uvedu URL commitu. Což je adresa, na kterou vede například odkaz 363413a na této stránce. Takže spustím:

remotepick.php https://github.com/hrach/nette/commit/363413a042adff…

A skript vypadá takto:

<?php
$url = @$_SERVER['argv'][1];

if (!preg_match('#github.com/<a href="#fn" class="footnote">[/]</a>+/<a href="#fn" class="footnote">[/]</a>+/commit/\w+#', $url)) {
	exit("Invalid URL");
}

$tmp = sys_get_temp_dir() . '/tmp.patch';
copy("$url.patch", $tmp);
passthru('git am ' . escapeshellarg($tmp));
unlink($tmp);

Poté se commit objeví v aktuální větvi .


Git: jak na hromadný rebase

Pokud máte v Git repozitáři víc vývojových větví, je rozhodně dobré je průběžně aktualizovat oproti masteru. V řeči Gitu jde o rebase. Aktualizované větve se pak mnohem snáze aplikují (merge) do hlavní vývojové větve. A pokud máte větví opravdu hodně, aktualizovat každou zvlášť je zdlouhavé. Pomoci může skript rebaseall.php, který stačí zavolat někde uvnitř repozitáře:

<?php

// zjisti seznam větví
exec('git branch', $branches);

// postupně každou rybejzuj proti masteru
foreach ($branches as $branch) {
	$branch = trim($branch, "* \r\n");
	passthru("git rebase master $branch", $errorCode);
	if ($errorCode) {
		exit;
	}
}

// a nakonec se vrať na master
passthru('git checkout master');

Je možné, že se to dá zapsat i jedním příkazem z bashe, ale já rád skriptuju v PHP a bash nemám.


Zen Dependency Injection

Dependency Injection je technika, která řeší určité problémy, ale zároveň přináší těžkosti nové. Ty se pak snaží eliminovat DI kontejner, který od vás vyžaduje změnit pohled na objektový návrh.

Pokud vás netrápí problémy, které DI řeší, tak jeho nasazení budete vnímat jen jako zbytečnou obtíž. Třeba právě v nutnosti osvojení nového pohledu na objektový návrh.

Nicméně zdá se, že pokud vás netrápí problémy, které DI řeší, máte vážný problém. Což zjistíte, až to zjistíte.


„Mám nejhoršího klienta, stále mění zadání“

Znáte ty nářky vývojářů, že jejich klient nemá jasnou představu a neustále mění zadání zakázky? To pláčou nad vlastní neschopností. Když je slyším, nejraději bych popřál nebohému klientovi lepšího dodavatele.

Klient nemá jasné zadání, protože není odborník na webdesign. Zajímalo by mě, kolik webdesignérů se vyzná v podnikání svého klienta tak dobře, že by dokázalo vytvořit precizní zadání, kdyby se karty obrátily.

Pokud klient zadání průběžně mění, znamená to, že ho projekt zajímá a baví, že nad ním neustále přemýšlí. Je pak větší pravděpodobnost, že vznikne něco skutečně užitečného. A především: bude poptávat další a další práci.

Pokud si vývojář tyto věci uvědomí, pak pochopí, že je to právě on, kdo musí přizpůsobit svůj styl práce. Třeba zjednodušit přidání kolonky PSČ na web, ač to v původním zadání nebylo.

před 14 lety v rubrice Random


phpFashion © 2004, 2025 David Grudl | o blogu

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.