Ipoteză: vrei să asculți/vezi un podcast, și dășteptul de autor nu a pus pe nicăieri link către RSS, doar către itunes shit; după ceva săpături, am ajuns să scriu următorul bookmarklet (sursa mai jos, wordpress e idiot și îmi strică link-urile care conțin “javascript:”); îmi merge în firefox 3 și opera 9.5, n-o să meargă în internet exploder, nu pricep de ce nu merge în seamonkey.

Instrucțiuni în engleză să pricepe și mintea la alții:

Usage: click on the itms podcast link, get the “you don’t have itunes” page, click the bookmarklet; it will attempt to find the feed URL and load it instead of the current page, for your subscribing pleasure.

bookmarklet source: (very long line, make sure you selected it all)

javascript:(function(){var xhr=new XMLHttpRequest();xhr.onreadystatechange=function(){if(this.readyState==4){window.location=this.responseText.split('\n').filter(function(x){return x.indexOf('feedURL')>=0;})[0].replace(/.*<string>([^<]+)<.*/,'$1');}};xhr.open('GET',document.body.getAttribute('onload').replace(/.*itms:\/\/([^']+).*/,'http://$1'));xhr.send(null);})()

eeend!

Nu prea am timp de citit, da m-am gândit că nu strică să fac provizii pentru eventualitatea în care ziua devine brusc de 48 de ore, aşa că am dat o fugă pe la Bookfest în ultima zi, ultima oră. Primul stop: standul Tritonic, unde speram să dau de Zully (care cică ar fi fost pe acolo azi) - e cu totul altă senzaţie când ştii cum arată oamenii în carne şi oase, n-a fost să fie… plecat de acolo cu seria Amber a lui Zelazny şi încă vreo 2 cărţi, plimbat încă vreo oră, timp în care am umplut rucsacul cu cărţi şi am cheltuit cam cât cheltuieşte un student pe mâncare în 2 luni. Din cauză de bani epuizaţi într-un final am ajuns să am de ales între Dostoievski şi Salman Rushdie (ales pe ultimul pentru eventualitatea în care se gândesc ale noastre autorităţi să-l interzică).

M-am plimbat cam peste tot, mi-au atras atenţia: Tritonic (multe cărţi, aspect de bibliotecă, oameni de treabă), Nemira (plăcut oferta, mai slabă ca la Tritonic dar ok, displăcut aspectul de supermarket), Humanitas (multe cărţi faine, relativ scumpe, impresie de tarabă de pe stradă), Polirom (multe cărţi faine, aspect de librărie, way overpriced). Marea dezamăgire a fost Teora, ştiam că au o colecţie SF bunicică şi speram să dau de ceva Asimov şi Arthur C Clarke, ţeapă, aveau doar cărţi pentru copii şi clasicele publicaţii super-scumpe pentru retarzii care cred că poţi învăţa un limbaj de programare sau un soft dintr-o carte. Câteva poze pe Flickr.

Într-un final am ajuns în pavilionul 13, unde lumea aştepta concertul Travka. Care concert a fost cel mai aproape ce ideea mea despre cum ar trebui să fie un eveniment de genul ăsta: sunet cristal, lumină bună, zero garduri între public şi formaţie, zero gorilieni, zero restricţii la făcut poze. Şi, gratis pe deasupra, ca să fie exact inversul concertului tipic din rromânia. Evident, am făcut poze.

De ceva timp mi-am pus mod_security la site, am instalat consola de la ei (cam nasoală - scrisă în Java, yuck!, da n-am timp acu să îmi fac io una pe gustul meu), and it gives me pretty pictures:

graph

după cum se vede, ieri pe la ora 17 a fost un spike de vreo 200 de … evenimente, să zicem. Care evenimente, după niţel căutat în access_log, arătau cam aşa:

89.41.7.80 - - [04/May/2008:16:49:47 +0300] “GET /work/wordpress-plugins/inline-gallery/inline-gallery-demo/2/ HTTP/1.1″ 403 524 “http://www.TheBlog.ro” “Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14″
89.41.7.80 - - [04/May/2008:16:49:49 +0300] “GET /work/wordpress-plugins/inline-gallery/inline-gallery-demo/2/ HTTP/1.1″ 403 524 “http://www.TheBlog.ro” “Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14″
89.41.7.80 - - [04/May/2008:16:49:49 +0300] “GET /work/wordpress-plugins/inline-gallery/inline-gallery-demo/2/ HTTP/1.1″ 403 524 “http://www.TheBlog.ro” “Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14″
89.41.7.80 - - [04/May/2008:16:49:51 +0300] “GET /work/wordpress-plugins/inline-gallery/inline-gallery-demo/2/ HTTP/1.1″ 403 524 “http://www.TheBlog.ro” “Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14″
[...]

yay, referrer spam! made in .ro! de la o adresă care se cheamă 89-41-7-80.citynet.botosani.ro; sau cam ce face moldoveanu când dă de internet…

După cum se vede, referrer karma şi-a făcut treaba (toate au primit 403) :D

later update: uitându-mă în statisticile de aci văz că au spămuit si wordpress.com, care n-are referrer karma (multe accese, referrer forjat, interval mic de timp, dacă ar exista vreun redirect loop s-ar întâmpla mai des chestia asta).

Fusei la Wurbe 8. Băui 4 beri. Mâncai pizza. Aflai că pe Tim nu l-a interogat SRI-ul pt un anunţ de-acum celebru. Vorbii niţel cu una din Cristinele de la Metropotam. Mă certai prieteneşte cu un copchil cu nume de personaj de desene animate (Andrei Gheorghe?) despre php & javascript & python & GWT (rămas fiecare la părerea de dinainte, ofc.). Jucai (luai bătaie la) fussball (fie conving managementu să cumpere aşa ceva, fie plec la Adobe :D). Şi, fiindcă cineva a râs de flash diffuser-ul meu:

Flash Diffuser. Eat this, Fong!

pun şi 3 poze (atâtea am făcut, în rest am fost ocupat cu bere, fussball, discuţii tehnice, făcut mişto de inşii cu mac, admirat programatoare simpatică, ocupată AFAICT, şi pt care sunt oricum prea aspie ca să aibă rost să mă stresez):

(da, am cam ars macu… it’s crap anyway :P; da, paharul de plastic (sau blitzu de la S9600, după câteva mii de poze, sau utilizatorul cu prea multă bere la bord) dă cam mult albastru (singura poză la care am umblat la curves e ultima); oh, well… până nu-l stric complet nu cumpăr altceva :D (ce de paranteze, zici că PS-ul ăsta e scris în Lisp)).

via B-list:


iacobs@moria ~ $ history|awk '{a[$2]++} END{for(i in a){printf "%5d\t%s\n",a[i],i}}'|sort -rn|head
  238   bzr
   82   cd
   40   ls
   26   ./manage.py
   20   rm
   10   vim
   10   less
   10   firefox
    8   mv
    7   mkdir

just about right :D

De multă vreme mă ţin să-mi iau bilet la Judas Priest; cum locul de unde mi-am cumpărat majoritarea biletelor din ultima vreme (Diverta Unirea) era oarecum închis şi n-aveam timp să mai trec încă o dată pe acolo, m-am orientat către online. Buuun, utfg://bilete+judas+priest, click pe primul rezultat, myticket.ro; toate bune şi frumoase, link pe front page, cumpără, accept, accept, fă-ţi cont. Fac cont, pun adresa de la servici, mă întorc la comandă şi zice că trebuie adresa de pe card la facturare, nu-i problemă, schimbăm adresa din Cucureşti cu aia din Drăgăşani, submit, surpriză că nu se schimbă; încerc de câteva ori, închid Firefox 3 şi încerc cu Opera, Seamonkey, Internet Exploder 6 în Wine (yuck!), doar-doar… nimic. Nu-i bai, încercăm aşa: completez tot ce are steluţă, dau submit, cică să completez toate câmpurile obligatorii; mă mai uit o dată, toate îs completate, ce a rămas gol e fără steluţă, adecă sexul, vârsta (ce vă trebuie?), nr şi seria de la buletin (wtf? îmi aminteşte de retarzii de la altex, digit’all şi depozitul de calculatoare care mi-au notat datele din buletin pentru că am plătit cu cardul, dar ăsta e alt rant cu aromă de OPC). Repet povestea în restul browserelor, nimic.

Până la urmă am cumpărat tot de la Diverta, am găsit alt magazin aproape de servici. Nu mă mai întorc pe myticket.ro, ceea ce vă sfătuiesc şi pe boieri dumneavoastră.

EOR

dacă atunci când eşti beat nu e bine să ai aparat foto la tine, atunci când eşti treaz se pare că e bine să-l ai, just in case; nu de alta, dar se pare că ocaziile cele mai faine apar atunci când nu ai aşa ceva la tine:

  • ieri (cred) am fost la PR Tea la Cărtureşti, eveniment organizat binişor, şi interesant în ansamblu (pentru cine nu a fost şi nu vrea să RTFA, s-a vorbit despre PR şi propagandă în politică, invitaţi fiind Adriana Săftoiu şi Felix Tătaru); ar fi fost o ocazie faină să-mi exersez abilităţile de pozar la evenimente, n-am avut camera la mine
  • azi, când mă întorceam de la servici, am dat de un concert Zdob şi Zdub în Piaţa Universităţii; fără înghesuială, o groază de oameni ţopăind (inclusiv o tanti în vârstă, de meserie boschetăreasă), lumina bună; subsemnatul, evident, fără cameră

carevasăzică, note to self: don’t leave home without the camera. ever.

Se pare că nişte băieţi nu foarte deştepţi au dat de un comic strip de calitate, s-au gândit că nu e cunoscut la noi, şi s-au pus pe furat.

… 19 ianuarie, Bucureşti, Romexpo. Am fost. Poze în partea aialaltă şi pe flickr (aceleaşi, şi licenţiate tot cu by-nc-sa).

Nuş cum am ajuns să dau de o implementare a algoritmului de verificare a CNP-urilor postată de cineva pe softpedia (ocazie cu care am descoperit că nu mai recunosc o sursă de foxpro - eh, amintiri din tinereţe), şi am muncit 10 minute să fac o implementare în javascript; ete-o:

function map(fn, arr){
	var ret = [];
	for(var x = 0; x < arr.length; x++)
		ret.push(fn(arr[x]));
	return ret;
}

function reduce(fn, arr, initial){
	function iter(idx, ret){
		if(idx >= arr.length)
			return ret;
		else
			return iter(idx+1, fn(arr[idx], ret));
 	}
	return iter(initial ? 0 : 1, initial || arr[0]);
}

function sum(arr) { return reduce(function(x, y){ return x + y;}, arr, 0); }

function ccnp(cnp){
	if(cnp.length != 13)
		return false;

	cnp = map(parseInt, cnp.split(''));

	var coefs = [2, 7, 9, 1, 4, 6, 3, 5, 8, 2, 7, 9];
	var idx = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];

	var s = map(function(x){return coefs[x] * cnp[x];}, idx);
	s = sum(s) % 11;

	return (s < 10 && s == cnp[12]) || (s == 10 && cnp[12] == 1);
}

Scris în javascript 1.7 (suportat de Firefox), map era mult mai simplu de scris ca [fn(arr[x]) for(x in arr)], dar să păstrăm lucrurile portabile…

pentru cine se întreabă:
map aplică o funcţie elementelor unui array şi returnează un array cu rezultatele
reduce combină elementele unui array cu o funcţie dată şi returnează o valoare; după ce am scris-o the functional way mi-am amintit că există for, deci se putea scrie şi aşa:

function reduce(fn, arr, initial) {
	ret = initial;
	for(var i = 0; i < arr.length; i++) { ret = fn(arr[i], ret); }
	return ret;
}

(varianta cu for şi side-effects e probabil mai rapidă, but nowhere as fun :D).

On an unrelated note: extrem de enervant editorul de la wordpress, când ai de pus snippet-uri de cod; evident, cine l-a scris a considerat că scriptul lui ştie html mai bine ca mine, prin urmare modifică şi când scriu raw HTML :(.