Goldenblog twitter verseny – devel view
Must read: Using the Twitter API with PHP and PEAR.
Idén először rendezték meg a Goldenblog twitter versenyt ehhez készült a netninja.hu -n egy miniapp a twitter apira építve, ami a szavazatokat számolta. Egy kicsit magamnak egy kicsit azoknak akik twitter apira akarnak épiteni, összeszedtem a sarok pontokat, felmerült problémákat.
Desc: alkalmazás, ami leszedi a #gbtv taggel ellátott tweeteket, kiszűrni a szavazatokat @goldenblog Közönségszavazás #gbtv @elsonev @masodiknev @harmadiknev, kiértékelni a szavazatot, első helyre irt nick 3 pont, második helyre irt nick 2 pont, harmadik helyre irt nick 1 pont. Feltétel volt még, hogy csak az első szavazat számít, a szavazó első tweetjének dátuma július elseje előtti legyen.
Cél: lehetőseget biztosítani arra, hogy versenyzők egyenlő feltételek mellett tudjanak mozgosítani a szavazat állásának ismeretében.
Környezet: php, postgres, twitter api, wordpress (csak megjelenítés).
A Project: A nagybetűs project három modulból állt,
- twitter api műveletek,
- szavazat érvényesítés és számolás,
- megjelenítés
Twitter api modul: Két dologra kellett használnom a twitter apit:
- search (#gbtv),
- user adatok lekérése
Szerencsére a twitter api egyszerű mint egy bot, csak arra kell figyelni, hogy az api rate limiteket betartsuk.
twitter api search: Nagyon fontos észben tartani, hogy a twitter search pár napra visszamenőleg keres. Ha ennél nagyobb időintervallumot akarsz használni mentened kell a találati listát. Szintén fontos, hogy a userek törölhetik a tweetjeiket (status update), nagyon könnyen előfordulhat, hogy hip-hop, eltűnik egy tweet. Kihívás lehet még, hogy a search oldalakra bontja a találati listát és egy találati oldalra maximum 100 találatot rak ki. A találati lista lapozható a page paraméterrel. Első adat építésnél érdemes végiglapozni a találati listát, hogy ne hagyjunk le egyetlen fontos tweetet se (api rate limit!). Az induló adatbázis után már használd since_id: paramétert. Ebből következik, hogy a keresést mindig egy sql queryvel kezdtem, ami megmondta, mi az utolsó lementett tweet id.
twitter api user: Nem egy rakétatudomány, de fontos észben tartani, hogy twitter alapvetően a screen namere épit sok mindent, de ezt a user megváltoztathatja, tárold a user ID-it is minden esetben és lehetőség szerint ehhez az adathoz köss minden egyéb adatot, funkciót.
És persze a user törölheti is magát, ami okozhat pár kellemes percet, ha épp "hétfőd" van.
A név változtatás elméletileg csalásra is adhat lehetőséget, de nem találkoztam ilyennel vagy nem bukott le az illető.
(Ha most arra gondolsz, hogy minden twitter api művelet eredményét tárold le lokálisan, akkor ugyanarra gondolsz, amire én jutottam a project alatt. Egy baromi nagy adatbázis, ami limitált ideig létezik. Akár fejlesztői rémálomnak is beillene, ha nem tudnánk azt, hogy figyelni kell az adatok elvesztésére.)
A twitter api 150 user adat lekérést engedélyez egy óra alatt, ezért különösen fontos, hogy ne hibázd el a lekéréseket, különben várhatod a következő óra fordulót (én úgy vettem észre, hogy ez az óraforduló xx:04 perc körül van). Az első tweet dátumának lekérésre nagyon költség igényes, legalábbis nem találtam egyszerűbb modszert, mint a user updatejeinek végiglapozását és az utolsó tweet kikeresése. Figyelembe véve, hogy pl. @hh is szavazni fog (10k+ update), itt is megmaradt a kézi vizsgálat, annyival megkönnyítve a dolgot, hogy a user regisztráció idejét figyeltem, és ha július 1 előtti volt, akkor automatikusan érvénytelenként tároltam le a szavazatot. Szintén segítségképpen megjelenítésre került az updatek száma, illetve az egy updatetel rendelkező userek szavazatai is érvénytelenek lettek automatice.
A project legnagyobb kihívása a userek által termelt typok, jófejségekből beírt adatrongálások kivédése volt. Ezekre feleslegesnek tartottam bármilyen ellenőrzést is írni, egyszeűbb volt átnézni a bejövő adatokat és kézzel korrigálni.
A szavazat számolás egy egyszerű string->array formázást követő pozíció keresés volt. Az alkalmazott adatbázis struktúrára még nem táláltak ki megfelelő jelzőt, gyors volt, de nem a legszebb, maradjunk ennyiben.
A megjelenítésnél fontos volt, hogy WordPressben szeretném megjeleniteni az adatokat. A wordpressbe integrálni meglepően könnyű volt, ezért probléma mentes volt.
Röviden tömören twitter api rocks.
XHProf: Facebook's PHP profiler – ERROR: 'phpize' failed
pecl install xhprof
downloading xhprof-0.9.2.tgz ...
Starting to download xhprof-0.9.2.tgz (931,660 bytes)
......................................done: 931,660 bytes
11 source files, building
running: phpize
Cannot find config.m4.
Make sure that you run '/usr/local/bin/phpize' in the top level source directory of the module
ERROR: `phpize' failed
Solution: use tarball source install -> http://pecl.php.net/package/xhprof
/tmp/pecl/xhprof-0.9.2/extension/#
phpize
./configure --with-php-config=./configure --with-php-config=/usr/local/bin/php-config
make
make install
Fatal error: Call to undefined function preg_match() in /usr/local/share/pear/PEAR/Frontend/CLI.php on line 57
/usr/local/bin/pecl remove the '-n'
exec $PHP -C -n -q $INCARG -> exec $PHP -C -q $INCARG
Tíz technológia amit mindenképp ismerned kell
1, OOP PHP
2, FreeBSD
3, SQL (MySQL, Postgresql)
4, Memcached
5, ZFS
6, HTTP (apache, lightthpd)
7, Smarty
9, PEAR
10, SVN, (git, cvs)
pear HTML_TagCloud error sorting tags wrong order
error: pear HTML_TagCloud error sorting tags wrong order
solution: set your locale before use html_tagcloud like
setlocale(LC_ALL, 'en_US.UTF-8');
remember, set back locale to right value, after use html_tagcloud if is necessary
how to logging google search keywords
$thereferer = strtolower($_SERVER['HTTP_REFERER']);
$a = substr($thereferer, strpos($thereferer, "q="));
$a = substr($a, 2);
if (strpos($a, "&")) {
$a = substr($a, 0, strpos($a, "&"));
}
$googlekeywords = urldecode($a);
return $googlekeywords;how to logging file php
$messagetolog = 'string to message';
$timeStamp = date("M d H:i:s", time());
$systemLogFile = "/path/to/system_log";
$fileOpen = fopen($systemLogFile, 'a');
$stringData = $timeStamp." ".$messagetolog;
fwrite($fileOpen, $stringData);
fclose($fileOpen);
php profiler xdebug, wincachegrind, webgrind
/usr/ports/devel/php-xdebug
php.ini (or xdebug.ini)
[xdebug]
zend_extension="/usr/local/lib/php/20060613/xdebug.so"



