Cum am facut aia cu trackback-urile
Mai multa lume m-o intrebat apropo de articolul intitulat idiosincratic "Microbiologie Ilustrata" da' asa cu fereala, ca si cum ar fi ceva adinci secrete si arcane ermetice. Nu-s dom'le, nici un fel de mare chestie, n-am zis nici o vorba pentru ca mi s-o parut banalitati si n-am realizat ca exista interes, nu pentru ca proprietate intelectuala pule-maturi.
Deci, hai sa vedem cum am face sa facem asa ceva pe blogul nostru hostat pe-un shared server oarecare (cu acces la cpanel si cu imagemagick instalat) :
I. Pregatiri. Datorita modului particular in care Wordpress aloca indici articolelor publicate tre' intii sa ne pregatim o lista cu articolele respective. Deci mergem frumos in phpmyadmin, selectam tabela wp_posts si apoi click unde scrie SQL si scriem la cutiuta :
SELECT ID FROM wp_posts where post_status="publish" LIMIT 0, 100000
Chestia asta ne va da afara o lista de indici ai articolelor publicate (deci exclude revizii, atasamente si ce alte porcarii mai salveaza el pe-acolo). Notati undeva numarul de rezultate ca ne va face trebuinta (zice acolo "Showing rows 0 - x ( x total)") si click jos pe pagina unde zice Print View, apoi selectati lista, duceti-o cu copy-paste in gedit sau ce editor de text folositi si dati un replace \n -> , (deci linia noua sa se transforme in virgula spatiu), dupa care ID , in \n (deci ID spatiu virgula sa se transforme-n linie noua). Chestia asfel rezultata o luati frumos cu copy/paste si-o duceti in cod unde va indic eu dinjos.
II. Codul. Sa vedem bucatica cu bucatica ce avem de facut :
$articles_id = array ( {{Aici dati paste la lista obtinuta dinsus}} );
Chestia asta ne va servi mai tirziu cind va trebui sa numaram articolele. Nu-i cea mai eleganta solutie da' are avantajul notabil ca va obliga sa va bagati miinile pina la cot in mataraia masinariei, invatind astfel chestii, care-i si scopul nostru aici la Trilenciclopedia. Mai departe,
$db_name = '';
$db_user = '';
$db_pass = '';
$table_prefix = '';$nconnection = mysql_connect("localhost:3306", $db_user, $db_pass );
mysql_select_db($db_name, $nconnection);
Asa cum probabil intuiti aici ne logam in MySql. Daca nu stiti parola si userul se gasesc in wp_config.php ca si wordpress tot alea le foloseste.
$query = 'SELECT comment_post_ID, comment_author_url FROM tril_comments WHERE comment_author_url LIKE "http://trilema.com/%"';
$record=mysql_query($query);
Sa ni se deie ID-urile corespunzatoare articolelor intre ale caror comentarii se gasesc chestii care incep cu adresa mea de http alaturi de url-urile respectivelor. Cum voi nu sunteti eu probabil ca veti inlocui pe-acolo polimedia cu ce-i cazul sa fie.
while ( $row = mysql_fetch_array($record, MYSQL_NUM)) {
$titlu = substr($row[1], 33, @strpos($row[1],"/",33)-33);
if ($titlu > "") {$query1 = 'SELECT ID FROM tril_posts WHERE post_name = "'.$titlu.'"';
$record1=mysql_query($query1);
$row1 = mysql_fetch_array($record1, MYSQL_NUM);if ($row[0]*$row1[0] > 0) {
$graf[$row[0]].=$row1[0].", ";
$grafcnt[$row[0]]++;
}
}
}
Chestia asta face precum urmeaza : itereaza prin toate rezultatele obtinute la cererea precedenta, ia url-urile si le taie ca sa ramina doar titlul. Cum "http://trilema.com/yyyy" vine 33 de caractere inseamna ca taiem din rezultat, incepind de la pozitia 33 atitea caractere cit este pozitia primului / care nu se regaseste in primele 33 de caractere minus 33.
Suna complicat da' e destul de simplu, hai sa vedem cu un exemplu :
http://trilema.com/2012/delicioasa-aventura-a-lui-robert-viii/
http://trilema.com/2012/delicioasa-aventura-a-lui-robert-viii/
Deci, se taie incepind de la caracterul 33 o lungime egala cu pozitia primului slash care nu-i in primele 33 de caractere (deci 71) minus 33. Deci, 38 de caractere incepind cu al 34-lea :
delicioasa-aventura-a-lui-robert-viii
Asta se intimpla ca-i fix titlul pe care Wordpress il stocheaza in tabela titlurilor, ceea ce ne va fi de folos mintenas. Daca am ramas cu ceva dupa toate taieturile cerem din nou catre MySql sa ni se deie ID-ul articolului care are un titlu care seamana pina la identitate cu taietura noastra.
Mai departe, daca produsul celor doua ID-uri e mai mare decit zero (deci daca niciunul din ele nu e zero) construim o tabela in memorie numita graf in care aliniem dupa cheia primului ID toate ID-urile care trimit spre el despartite prin spatiu virgula, si o alta tabela tot in memorie numita grafcnt in care pur si simplu numaram cite anume sunt de-astea la fiecare (pentru curiozitatea noastra bolnava).
/*
arsort($grafcnt);foreach ($grafcnt as $cnt) {
$x[$cnt]++;
}foreach ($x as $k=>$y) echo $k, " => ", $y,"
";
*/
Aici avem o bucatica pusa in paranteze (perechea /* */ spune interpretorului sa ignore tot ce-i continut) pentru ca urmeaza sa desenam si daca desenam tre' sa trimitem headere de desen si deci nu putem trimite headere de scris. Da' inainte de-a desena ne putem uita de-o curiozitate sa vedem cite articole avem per numar de trackback-uri. Eu de exemplu am 975 cu 1, 200 cu 3 si asa mai departe.
header ('Content-Type: image/png');
Chestia asta trimite catre browser anuntul ca urmeaza sa primeasca o imagine de tipul png, pentru ca browserul nu stie ce va primi de la un url pina cind nu-i spune serveru' ce urmeaza, asta-i sensul headerelor daca ati mai auzit termenul pina acum. De exemplu redirect aia 301 e un header de fapt.
$im = @imagecreatetruecolor(2400, 3000)
or die('Cannot Initialize new GD image stream');
$color = imagecolorallocate ($im , 255,255,255);
Declaram o imagine de tipul True Color si dimensiunile 2400 latime 3000 lungime (care-s cam maximum ce se poate comfortabil aloca pe un server sa zicem mediu) si construim culoarea alba pentru ea.
$yoffset = 0 * 3000;
for ($i=1; $i < 5125; $i++) imageellipse ($im, 24 , 24 + $i*4 - $yoffset, 3,3, $color );
Sensul lui $yoffset ala e asa : daca avem mai mult de vreo 700 de articole in lista imaginea totala va fi mai mare de 3`000 de pixeli (a mea de exemplu are 20`600). Chestia nu ne deranjeaza cu nimic ca putem s-o taiem in bucati, daca in loc de 0 scriem 1 vom vedea pixelii de la 3`000 la 6`000 pe verticala, daca scriem 5 vom vedea de la 15`000 la 18`000. Bucatile astea pe urma le salvam si le lipim la loc intr-un program de editare (ca de exemplu Gimp, care-i mai bun ca Photoshop vreau sa subliniez).
Pentru fiecare articol de la 1 la cite sunt (in cazul meu 5'125) sa se deseneze o elipsa in imaginea noastra, 24 de pixeli la dreapta si 24 + cite am facut pina acuma inmultit cu 4 si minus yoffset ala in jos, de latime 3, de lungime 3 (ca-s elipse, v-ati prins, pot fi ovale) si culoarea de-am declarat-o anterior.
$articles = array_flip ($articles_id);
In felul asta avem o lista in cheia ID-urilor din wordpress si cu valori indicii reali ai articolelor. Asta ne permite sa raspundem la intrebari de tipul "al citelea articol publicat e articolul caruia Wordpres ii zice #353 ?".
foreach ($graf as $k => $v) {
$sources = explode (", ", $v);
foreach ($sources as $s) if (is_numeric ($s)) {
$start = $articles[$s]*4 + 24;
$end = $articles[$k]*4 + 24;if ($start*$end > 0) imageellipse ($im, 24 , floor (($start + $end)/2) - $yoffset, 4700, abs($start - $end), $color );
}
}
Asta-i inima intregii chestii. Deci, pentru fiecare element din tabela graf se ia cheia si valoarea, se explodeaza aceasta valoare intr-o noua tabela dupa despartitorul virgula spatiu, si pentru fiecare pereche de element initial cu element din aceasta noua tabela se defineste un inceput si-un sfirsit egal cu pozitia reala a articolelor respective.
Dupa care daca niciuna dintre pozitii nu-s nule se deseneaza o elipsa tot in imaginea noastra, si anume 24 de pixeli la dreapta, suma inceputului si sfirsitului impartita la doi si rotunjita in jos pixeli in jos (minus yoffset bineinteles), 4700 de pixeli de lata (ca atita ne permite latimea de 2400 pe care-am declarat-o noi) si modulo diferenta inceputului si sfirsitului de lunga, in culoarea de-am stabilit-o.
Si cu asta gata, practic, mai avem de livrat imaginea :
imagepng($im);
imagedestroy($im);
Precum vedeti nu-i mare chestie. Intrebari ?
Thursday, 23 February 2012
Știu că o să zici că-s hater pe uneltele folosite mai sus, că-s suficient de bune etc., dar mă gândesc că poate citește cineva articolul și găsește utilă și alternativa pe numele ei graphviz, care împreună cu limbajul dot fac o treabă bună la capitolul generării de grafuri. Specificația dot-ului e și destul de simplă, deci se pot genera relativ ușor grafuri programatic cu ajutorul lui în orice limbaj.
Cred totuși că există și binding-uri pentru PHP care să scoată imagini cu graphviz, avantajul fiind că ai datele raw și tot ce rămâne e să configurezi tipul grafului și diverși parametri, astfel că poți să privești datele din mai multe perspective și să o alegi pe a mai interesantă. Dezavantajul e evident că mai instalezi un program în plus, dar na.
Thursday, 23 February 2012
Si daca am plesk?
Thursday, 23 February 2012
@spyked Da' di ce sa fii hater ? Multiculturalism, frate, merge pe bloguri.
Pe de cealalta parte, asa cum poate ca-ti dai seama, ideea era mai mult de-a invata blogarul mediu/computeristul incepator (cele doua fiind cam egale) cu ideea generala ca orice se poate cu orice, ca de-aia-s calculatoarele calculatoare si chiar daca-i zice hypertext preprocessor, ii imperativ si vechi de douazeci de ani nu inseamna ca nu poti face ce desene vrei cu el (niste observatii de altfel importante), si in plus pe linga aia generala cu citeva metode practice. Altfel clar ca nu-s cele mai "bune", da' cum bine stii in disciplina asta a programarii practice conteaza in primul rind sa faci si de-abia pe urma, un loc doi la mare distanta sa faci nustiucum anume, realitatea nefiind scoala.
Pina la urma mie mi-a luat mai mult sa scriu "documentatia" decit codul, si articolu' cu totul lui a fost fo' 25 de minute, garantat nu invata blogaru' mediu dot in juma' de ora, indiferent cine-i explica.
@A T Daca ai plesk esti un criptocomunist de-ala.
Thursday, 23 February 2012
Nu-i nimic pentru hipsteri există Instaviz: Instaviz is Diagram Sketching for your iPhone, iPad or iPod Touch.
Thursday, 23 February 2012
Eu nu poci sa nu observ o diferenta fundamentala intre instaviz, graphviz si pehaspe : ultimul are un exemplu clar, ca i-am facut eu. Primele n-au decit niste nume in discutia asta. Ce nu va apucati voi frumos sa scrieti cite-un articol pe blogu' propriu ? Ca asa creste blogosfera, s-ajunga cindva sa aiba valoare, ca sa aiba macar sens efortul impostorilor de-a incerca sa vinda si ei ceva cu care n-au treaba ?
Thursday, 23 February 2012
Pentru că eu nu-s hipster posesor de produse Apple și nici n-am karmă suficientă ca să-mi iau :-)
Thursday, 23 February 2012
Da' atunci de unde stii tu ca aia chestie macar functioneaza ?
Thursday, 23 February 2012
Garanție, garanție, ce garanție? [...] aici mergem pe încredere.
Thursday, 23 February 2012
Lmao
Friday, 24 February 2012
Eu unul sunt de acord cu Popescul și cum ajung la un număr ceva mai mare de articole repet faza și eventual adaug și statistici legate de etichete, cuvinte și alte asemenea. Da' e clar că o să fac niște grafuri de o să-mi moară dujmanii de invidie.
Friday, 24 February 2012
Noa, dujmanii asteapta cu sufletu' la gura :D
Friday, 24 February 2012
Auzi, da' taguri code nu mai aveau la magazin?
Friday, 24 February 2012
Tagurile code sunt prea scurte pentru cineva atit de priceput ca mine.
Tuesday, 28 February 2012
domle da cu botoane nare?
Tuesday, 28 February 2012
Are pe tite.
Friday, 2 March 2012
Apropo de plesk.
Friday, 2 March 2012
@Mircea Popescu Vezi ca zicea unu acolo ca n-a fost de la plesk, ci de la softul de management de vps probabil scris inhouse, care nici nu poti sa-l dezactivezi si iti cam trebuie ca sa operezi serverul. I-a rebootat masinile si a pornit in single user sa-i schimbe parola de root :)
Nu ca plesk, cpanel si astea n-ar fi praf, dar ca idee.
Asta-mi aminteste de ceva soft opensource de management de VPS care a fost spart cu un sql injection. Il foloseau niste firme de hosting maricele, si dupa ce au fost sparte si au fost sterse zeci de mii de site-uri, l-au dat pe gigelu care l-a facut in judecata si ala s-a sinucis :) Dar nah, avea si alte probleme saracu.
Friday, 2 March 2012
Mie nu mi se pare ca-i foarte probabil sa se descopere simultan un 0day in plesk fix in ziua in care cineva o supt-o cu un 0day in softu' de admin. Da' ma rog.