abr.
27
2012
0

Com baixar-se un vídeo de TV3 a la carta

Això que us explicaré ara només es de forma demostrativa, recordeu que heu de respectar sempre els drets d’autor i les condicions que imposi TV3 amb els seus vídeos.

I ara, anem al gra.

Pas 1 – Aconseguir l’identificador del vídeo

Primer de tot heu d’arribar a la URL individual del vídeo en qüestió, aquesta ha de tenir una forma tipus:

http://www.tv3.cat/3alacarta/#/videos/1234567890
o
http://www.tv3.cat/videos/1234567890/alguna-cosa-bla-bla-bla

L’únic que realment us importa es el ID del vídeo, en aquest cas seria: 1234567890

Pas 2 – Aconseguir ruta de streaming del vídeo

Un cop tinguem el ID del vídeo escriurem en el navegador la següent ruta:

http://www.tv3.cat/su/tvc/tvcConditionalAccess.jsp?ID=1234567890&QUALITY=H&FORMAT=MP4

Remplaçant on diu ID=******* pel nostre número que hem aconsegui en el pas 1.

En aquesta ruta us sortirà per pantalla tot tipus d’informació en un format que es diu XML.

El que us interessa és una cosa com això:

rtmp://mp4-500-str.tv3.cat/ondemand/mp4:g/tvcatalunya/4/6/1234567890.mp4

busqueu-ho, no costa gens perquè és la ruta d’on fer streaming amb aquest vídeo en qüestió.

Pas 3 – Descarregar el fitxer via streaming

Aquest tercer pas es el més complicat i cal l’ajuda d’un programa extern. Si treballeu amb Windows podeu utilitzar el rtmpdump

A. Podeu descarregar el ZIP del rtmpdump d’aquesta página: http://rtmpdump.mplayerhq.hu/download/rtmpdump-2.1d-windows.zip
B. Descomprimiu aquest ZIP en un directorio, per exemple c:/rtmpdump
C. Obriu una finestra de línea de comandes: Inici / Executar i escriviu “cmd” + Intro.
D. Aneu al directori on heu descomprimit rtmpdump: “cd x:/rtmpdump”
E. Un cop al directori teclegeu la següent comanda:

rtmpdump -r “rtmp://mp4-500-str.tv3.cat/ondemand/mp4:g/tvcatalunya/4/6/1234567890.mp4” -o video-tv3.mp4

On posareu la ruta que heu obtingut abans i el fitxer on voleu desar el vídeo.

I ja està! Només cal esperar…

Written by in: General |
des.
02
2010
0

Manifest per una Xarxa Neutral

Com molts d’altres he decidit adherir-me al Manifest sobre la neutralitat de la xarxa.

Els ciutadans i les empreses usuàries d’Internet adherides a aquest text manifestem:

  1. Que Internet és una Xarxa Neutral per disseny, des de la seva creació fins a la seva actual implementació, en la qual la informació flueix de manera lliure, sense discriminació alguna en funció d’origen, destinació, protocol o contingut.
  2. Que tots els usuaris, emprenedors i empreses d’Internet han pogut definir i oferir els seus serveis en condicions d’igualtat portant el concepte de la lliure competència fins a extrems mai abans coneguts.
  3. Que Internet és el vehicle de lliure expressió, lliure informació i desenvolupament social més important que tenen ciutadans i empreses. La seva naturalesa no ha de ser posada en risc en cap concepte.
  4. Que per possibilitar aquesta Xarxa Neutral les operadores han de transportar paquets de dades de manera neutral sense erigir-se en “duaners” del tràfic i sense afavorir o perjudicar a uns continguts per sobre d’uns altres.
  5. Que la gestió del tràfic en situacions puntuals i excepcionals de saturació de les xarxes ha d’escometre’s de forma transparent, d’acord a criteris homogenis d’interès públic i no discriminatoris ni comercials.
  6. Que aquesta restricció excepcional del tràfic per part de les operadores no pot convertir-se en una alternativa sostinguda a la inversió en xarxes.
  7. Que aquesta Xarxa Neutral es veu amenaçada per operadores interessades a arribar a acords comercials pels quals es privilegiï o degradi el contingut segons la seva relació comercial amb l’operadora.
  8. Que alguns operadors del mercat volen “redefinir” la Xarxa Neutral per manejar-la d’acord amb els seus interessos, i aquesta pretensió ha de ser evitada; la definició de les regles fonamentals del funcionament d’Internet ha de basar-se en l’interès d’els qui la usen, no d’els qui la proveeixen.
  9. Que la resposta davant aquesta amenaça per a la xarxa no pot ser la inacció: no fer gens equival a permetre que interessos privats puguin de facto dur a terme pràctiques que afecten a les llibertats fonamentals dels ciutadans i la capacitat de les empreses per competir en igualtat de condicions.
  10. Que cal instar al Govern a protegir de manera clara i inequívoca la Xarxa Neutral, amb la finalitat de protegir el valor d’Internet de cara al desenvolupament d’una economia més productiva, moderna, eficient i lliure d’ingerències i intromissions indegudes. Per a això cal que qualsevol moció que s’aprovi vinculi de manera indissoluble la definició de Xarxa Neutral en el contingut de la futura llei que es promou, i no condicioni la seva aplicació a qüestions que poc tenen a veure amb aquesta.
Written by in: General |
gen.
13
2010
0

Portades de llibres

Actualment estic treballant per la Xarxa de Biblioteques Públiques de la província de Barcelona. Una de les coses divertides que he fet és muntar una aplicació que busca les portades dels llibres en el nostre repositoris de portades i després en altres repositoris externs gratuïts.

L’aplicació te una ordre de prioritats i va saltant de repositori en repositori fins que troba la portada del llibre.

A més te un sistema de cache que guarda les portades durant un cert temps i s’estalvia de fer tota la cerca per tota la xarxa cada cop que algú demana una portada.

Per si algú li és útil a continuació explicaré com trobar les portades de llibres en diferents mides a partir del ISBN (codi del llibre) amb PHP en els següents repositoris externs gratuïts.

1. Amazon
2. Library Thing
3. Open Library
4. Google Books

Nota: Tots els scripts que escric són versions simplificades i tenen un propòsit instructiu. No em faig responsable de la seva utilització en un lloc real tot i que, en teoria, haurien de funcionar correctament xD

Amazon

El repositori de Amazon és el millor i força senzill. Per aconseguir la portada d’un llibre simplement has de construir una URL de la següent forma.


//ISBN exemple
$isbn=’1555705189’;

//Imatge petita, uns 50 x 75px
$url["petita"]='http://images.amazon.com/images/P/'.$isbn.'01.THUMBZZZ';
//Imatge mitjana, uns 110 x 160px
$url["mitjana"]='http://images.amazon.com/images/P/'.$isbn.'01.MZZZZZZ';
//Imatge gran, uns 320 x 500 px
$url["gran"]='http://images.amazon.com/images/P/'.$isbn.'.01.LZZZZZZ';

El que nosaltres fem, com que tenim el sistema de cache, es agafar la imatge més gran el primer cop, utilitzant la llibreria GD2 per generar les imatges derivades en les mides que necessitem, guardar-les en el nostre servidor i després anar servint les derivades de la cache del servidor en la mida adequada.

Per als repositoris extern tenim configurada la cache amb una vida de una setmana, així que si Amazon canvia una portada triguem una setmana en enterar-nos però podem servir imatges molt ràpidament perquè no hem d’esperar a que Amazon ens torni la portada cada cop que algú la vol veure.

Què passa si Amazon no te la portada del llibre que els demanem?

Doncs Amazon ens retorna un gif transparent 1×1 píxel com a portada.

Evidentment el que volem es detectar-ho, descartar la imatge i saltar al següent repositori per seguir buscant la portada en altres llocs.

Hi ha moltes maneres de fer això però una de les mes ràpides es connectar-nos utilitzant Curl i llegir la capçalera de la petició HTTP sense ni tan sols baixar-nos la imatge.

Podríem fer la petició HTTP, rebre la resposta i mirar la mida de la imatge però seria una mica mes lent.

La gestió de peticions HTTP la tenim plenament desenvolupada en cUrl així que podem treure partit d’aquesta llibreria per fer això i per altres altres coses com: com simular la connexió des d’un navegador per evitar que el repositori extern ens bloquegi o controlar millor el timeout i evitar que una caiguda dels servidors de Amazon o certs problemes en la xarxa provoquin lentituds en la nostre aplicació de portades.

La nostre solució per assegurar un servei relativament ràpid i constant es descartar totes les imatges mes petites de 1000 bytes (per eliminar els gifs 1×1 transparents d’imatge no trobada y les imatges utra-petites en mala qualitat) i descartar també les peticions HTTP que porten més d’un segon i encara no s’han resolt per impedir que problemes de lentitud en repositoris externs ens afectin a nosaltres excessivament… i tota aquesta validació la fem sense baixar-nos realment la imatge, només demanant la capçalera de la petició HTTP a l’Apache.

A mode d’exemple, podríem construint una funció de validació de la imatge via cUrl i retorna true o false segons si troba la imatge, aquesta es adequada i el servidor extern respon en un temps acceptable (menys d’un segon).


function validaImatge($url)
{
$check=false;
$ch = curl_init($url);
//per rendiment no necessitem descarregar el cos
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//Volem que ens torni la capçalera
curl_setopt($ch, CURLOPT_HEADER, 1);
//Volem que salti si hi ha redireccions
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
//Timeout de 1 segon
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
//Simulem una connexió des d’una navegador per evitar bloquejos
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.4");
$data = curl_exec($ch);

if ($data !== false) {
$info = curl_getinfo($ch);
if ($info[http_code]==200 && $info[download_content_length]>1000)
{
$check=true;
}
}
curl_close($ch);
return $check;
}

Problemes d’Amazon, els ISBNs?

Amazon te alguns problemes coneguts amb la cerca per ISBN.

Per exemple, els llibres tenen dos sistemes de codis, l’antic el ISBN de 10 dígits i el nou, el ISBN de 13 dígits.

En teoria tot ISBN de 10 dígits te el seu equivalent de 13 dígits (al revés no), pel que qualsevol repositori hauria de ser capaç de trobar la portada d’un llibre tant si li poses el ISBN 10 dígits com el 13 dígits, però mentre que amb alguns repositoris com el Google Books sí que funciona així amb Amazon no.

Quan cerques la portada d’un llibre amb el ISBN de 13 dígits molts cops no troba la portada, i en canvi si proves el seu ISBN equivalent de 10 dígits si que et torna una portada.

Així que… com solucionem aquesta limitació d’Amazon? Doncs no ens queda més remei que cercar la portada del llibre amb el ISBN que tinguem i si aquest és el de 13 dígits i no ha trobat la portada calcular el seu ISBN equivalent de 10 dígits i buscar-la a mirar si amb aquest tenim sort.

Calcular el ISBN de 10 dígits a partir del de 13 dígits podem fer servir quelcom tan senzill com això:


//ISBN exemple 13 dígits
$isbn='9780739360385';
echo "ISBN: $isbn ";

//Amazon, no troba ISBN10 i ISBN13 indistintament i cal cercar portades
//Si es un ISBN-13 amb equivalent a ISBN-10 el calculem
if (strlen($isbn)==13 && substr($isbn,0,3)=='978' && is_numeric(substr($isbn,3,9)))
{
$isbn10=substr($isbn,3,9);
for ($i = 0; $i < 9; $i++) { $sum=$sum+substr($isbn10,$i,1)*$i;
}
$numcontrol=$sum % 10;
if ($numcontrol==10){$numcontrol='x';}
$isbn10=$isbn10.$numcontrol;
echo " ISBN-10 $isbn10";
}

Així podem afegir en les rutines de la nostre aplicació que quan es tracti d’Amazon quan busqui amb el ISBN13 sinó troba la portada del llibre busqui també amb el ISBN10 a veure si tenim sort.

Library Thing

Aquesta gent tenen una API que funciona igual que el servei de Amazon però t’has de registrar (http://www.librarything.es/) i posar el teu codi d’usuari en la URL.

A més tenen una limitació en el nombre d’imatges que et serveixen per usuari (100 imatges per dia), en aquest moment la cache resultarà molt útil! Millor poder agafar 1000 imatges diferents cada dia que no gastar la teva quota servint 1000 vegades la mateixa imatge!


//ISBN exemple
$isbn=’1555705189’;
//La teva clau d’usuari de la Library thing
$key=’************************’;

//Imatge petita
$url["petita"]= 'http://covers.librarything.com/devkey/'.$key.'/small/isbn/'.$idisbn;
//Imatge mitjana
$url["mitjana"]='http://covers.librarything.com/devkey/'.$key.'/medium/isbn/'.$idisbn;
//Imatge gran
$url["gran"]='http://covers.librarything.com/devkey/'.$key.'/large/isbn/'.$idisbn;

Evidentment, si volguéssim la mateixa funció d’abans de validaImatge() també funcionaria en aquest cas.

En cas de no trobar una portada fan el mateix que Amazon, tornar-te un gif transparent de 1×1 píxel.

Problemes de la Library Thing, errors d’idioma?

Aquest repositori de portades esta construït pels usuaris així que podem patir alguns errors d’usuaris que pugen portades equivocades, etc… al tractar-se d’una comunitat nosaltres mateixos podem contribuir-hi i intentar esmenar els errors/problemes.

A nosaltres el problema que mes ens ha afectat són les portades d’edicions equivocades. Es força comú que busquis la portada d’un llibre de l’edició en català o castellà i et retorni la portada de l’edició anglesa i com que tenim bibliotecaris molt exigents aquest tipus de problemes han provocat que al final desactivéssim aquest repositori, una llàstima perquè realment tenen moltes portades.

Open Library

La Open Library es un altre projecte obert de comunitat d’usuaris molt semblant al de la Library Thing.

La seva API funciona de forma molt semblant i quan no troba una portada, enlloc de retornar-te un píxel transparent simplement no et retorna res.


//ISBN exemple
$isbn='1555705189';

$url["petita"]='http://covers.openlibrary.org/b/isbn/'.$isbn.'-S.jpg';
$url["mitjana"]='http://covers.openlibrary.org/b/isbn/'.$isbn.'-M.jpg';
$url["gran"]='http://covers.openlibrary.org/b/isbn/'.$isbn.'-L.jpg';

Problemes de la Open Library, la petició http?

A més, aquest repositori te una altre diferència amb la resta. No sé si te a veure amb el fet que utilitza Lighthttpd enlloc d’Apache però resulta que no retorna la mida del fitxer en la capçalera de la petició HTTP.

Això pot ser que no t’afecti en res segons la teva implementació o pot ser un problema si vols utilitzar una funció exactament com la funció de validaImatge() que he posat anteriorment perquè en aquest cas sí que necessites descarregar el cos de la petició HTTP per saber si el que t’està tornant te les característiques que t’interesen o no.

En aquest cas hauríem d’eliminar el paràmetres de la connexió d’abans:

curl_setopt($ch, CURLOPT_NOBODY, 1);

Per especificar-li que sí que volem el cos de la petició http, i després, si volem midar la miad, enlloc de comprovar el tamany del fitxer que ens anuncien en la capçalera $info[download_content_length] hauríem de mirar la mida del cos de la petició http descarregada $info[size_download].

Per exemple, podríem arreglar la nostre funció anterior de validació de la imatge perquè funciones sempre descarregant tot el body i anés correctament amb qualsevol d’aquests tres repositoris (renunciant a una certa millora del rendiment en el cas de Amazon i Library Thing):


function validaImatge($url)
{
$check=false;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.4");
$data = curl_exec($ch);

if ($data !== false) {
$info = curl_getinfo($ch);
if ($info[http_code]==200 && $info[size_download]>1000)
{
$check=true;
}
}
curl_close($ch);
return $check;
}

o enlloc de passar-li només la URL li podem donar informació a la nostre funció sobre el repositori i obtenir el millor dels dos mons. Fer la comprovació ràpida de la capçalera per Amazon y la Library Thing i la comprovació un pel mes lenta del cos de la petició per la Open Library:


//Valida que es recupera una imatge correcta en aquella URL
function validaDades($url,$repo) {
$check=false;
$ch = curl_init($url);
//Tots els repositoris menys la open library tornen el tamany del fitxer en el header
//per rendiment no necessitem descarregar el cos en alguns casos
if ($repo!='olib'){
curl_setopt($ch, CURLOPT_NOBODY, 1);
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.4");
$data = curl_exec($ch);

if ($data !== false) {
$info = curl_getinfo($ch);
if ($info[http_code]==200 && ($info[download_content_length]>1000 || $info[size_download]>1000)) {
$check=true;
}
}
curl_close($ch);
return $check;
}

Problemes de la Open Library, imatges indegudes?

Un altre problema greu de la Open Library es el mal us que en fan alguns usuaris. Sembla que hi ha alguns usuaris malintencionats que es dediquen a penjar imatges inadequades amb insults, xenòfoges, etc. Suposo que per fer alguna gracieta.

A diferència de la Library Thing o d’altres comunitats virtuals aquí ni tan sols necessites estar registrat per contribuir amb una nova portada.

El resultat final és que els vàndals ho tenen molt fàcil per fer les seves gracietes. En el moment en que es detecta una imatge indeguda es esborrada amb una certa celeritat però sempre corres un cert risc que un usuari busqui un llibre i aparegui alguna imatge indeguda.

Google Books

Aquest potser es el repositori mes complicat d’implementar amb PHP. Tenen una API senzilla pensada per funcionar amb Javascript així que si vols treballar amb PHP has de fer certs malabarismes.

La seva alternativa es una llibreria per PHP per accedir a la seva informació carregant una classe en PHP anomenada Zend_Gdata_Books (http://code.google.com/intl/es-ES/apis/books/docs/gdata/developers_guide_php.html)

Jo us explicaré com aconseguir la portada del llibre de Googl Books a través del seu WebService de RSS.

No és la forma recomanada ni suportada per Google però pot ser una alternativa si no et vols instal·lar totes les seves llibreries i el seu framework.

La idea consisteix en buscar el llibre a través dels seus webservices i després mirar quina URL te la portada, i treballar una mica aquesta URL per obtenir les diferents mides de la portada.

La URL en qüestió on hi ha la informació del llibre en XML és:


//ISBN exemple
$isbn='9780739360385';

$url1='http://books.google.com/books/feeds/volumes?q=isbn:'.$isbn;

Aquí podem parcejar el XML per transformar-ho en un array o en un objecte o podem anar a saco i utilitzar expressions regulars per trobar la URL de la imatge de la portada del llibre si aquesta existeix (que es el que faré aquí sota).

No es un script elegant però hauria de funcionar:


//ISBN exemple
$isbn='9780739360385';

//Url del feed de Google
$data='http://books.google.com/books/feeds/volumes?q=isbn:'.$isbn;

//Recuperem el XML
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $data);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.4");
$data = curl_exec($ch);
curl_close($ch);

if ($data !== false) {
//Busquem la imatge derivada
preg_match("/
]*thumbnail[^>]*>/",$data,$match1);
preg_match("/href='[^']*'/",$match1[0],$match2);
$origen=array('href=','\'','&');
$desti=array('','','&');
$data = str_replace($origen,$desti,$match2[0]);
if (strlen(trim($data))>0){
echo "Portada petita: <img src="'$data'" alt="" />";
$data = str_replace('zoom=5','zoom=1',$data);
echo "Portada mitjana: <img src="'$data'" alt="" />";
$data] = str_replace('zoom=5','',$data);
echo "Portada gran: <img src="'$data'" alt="" />";
} else {
echo "Error: No te imatge de portada";
}
} else {
echo "Error: URL incorrecte o llibre no trobat";
}

A partir d’aquí podem fer moltíssimes coses, per exemple, un cercador de portades de llibre a partir del ISBN seria tan senzill com, per exemple, fer:


//ISBN
$isbn='1555705189';
//Clau d’usuari de la Library Thing
$key='***********';

//Amazon
$repo[0][0]='Amazon';
$repo[0][1]='http://images.amazon.com/images/P/'.$isbn.'.01.THUMBZZZ';
$repo[0][2]='http://images.amazon.com/images/P/'.$isbn.'.01.MZZZZZZ';
$repo[0][3]='http://images.amazon.com/images/P/'.$isbn.'.01.LZZZZZZ';

//Open Library
$repo[1][0]='Open Library';
$repo[1][1]='http://covers.openlibrary.org/b/isbn/'.$isbn.'-S.jpg';
$repo[1][2]='http://covers.openlibrary.org/b/isbn/'.$isbn.'-M.jpg';
$repo[1][3]='http://covers.openlibrary.org/b/isbn/'.$isbn.'-L.jpg';

//Library Thing
$repo[2][0]='Library Thing';
$repo[2][1]='http://covers.librarything.com/devkey/'.$key.'/small/isbn/'.$isbn;
$repo[2][2]='http://covers.librarything.com/devkey/'.$key.'/medium/isbn/'.$isbn;
$repo[2][3]='http://covers.librarything.com/devkey/'.$key.'/large/isbn/'.$isbn;

//Google Books
$repo[3][0]='Google Books';
$data='http://books.google.com/books/feeds/volumes?q=isbn:'.$isbn;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $data);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.4");
$data = curl_exec($ch);
curl_close($ch);

if ($data !== false) {
preg_match("/
]*thumbnail[^>]*>/",$data,$match1);
preg_match("/href='[^']*'/",$match1[0],$match2);
$origen=array('href=','\'','&');
$desti=array('','','&');
$data = str_replace($origen,$desti,$match2[0]);

if (strlen(trim($data))>0) {
$repo[3][1] = $data;
$repo[3][2] = str_replace('zoom=5','zoom=1',$data);
$repo[3][3] = str_replace('zoom=5','',$data);
}
}

//Genera el HTML amb totes les imatges
//Bucle per cada repositori
if (isset($repo)){
foreach ($repo as $control) {
//Bucle per cada element del repositori
$titol=true;
foreach ($control as $item) {
if ($titol) {
$contingut .='<h2>'.$item.'</h2>';
$titol=false;
} else {
$contingut .= '<img src="'.$item.'" alt="" /> ';
}
}
$contingut .= '<br>';
}
}

echo '<html><body>'.$contingut.'</body></html>';

I avui ja n’hi ha prou de parlar del món dels repositoris gratuïts de portades de llibres 😀

Written by in: General |
des.
07
2009
0

Maleïda a amb accent obert!!!

Porto tot el matí barallant-me amb una tonteria de programa que s’envia dades entre dos servidors.

El problemà està en la codificació del joc de caràcters, no s’entenen entre ells i no hi ha manera de fer una conversió més o menys automàtica.

Un servidor Sun Solaris envia les dades en utf-8 cap a un Red Hat però aquest es pensa que estan en ascii perquè “misteriosament” li arriven les dades en utf-8 però no en multibyte sinó en unibyte.  O sigui, que tinc un utf-8 però convertit a ASCII byte a byte ignorant que el utf-8 es multibyte i un caracter pot tenir de 1 a 4 bytes.

Total, que al final m’he tingut que fer la meva pròpia funció de conversió de caràcters en php ignorant totes les funcions que ja estàn pensades per fer aquestes coses rollo mb_detect_encoding(), iconv(), utf8_encode(), utf8_decode, etc…

La cosa estava tan xupada com imprimir per pantalla tots els caràcters especials i anar-los convertint un per un al que tocava. En 5 minuts tenia muntada la funció però funcionava??? Doncs no!!! Convertia correctament tots els caràcters excepte la à amb accent obert!!!

Com??? Per què??? Després de barrallar-me amb la maleïda “à” una bona estona he fet un descobriment que m’ha donat la solució, el codi ascii segons la extensió que facis servir tens un o més caràcters per definir l’espai en blanc. En el meu cas el 32 i el 160!!!

En el meu programa jo li deïa que la “Ã ” en realitat era la “à” i no funcionava perquè agafava el 32 com a codi per l’espai en blanc, enlloc del 160 que m’interessava en aquest cas. Total, que al final he pogut solucionar especificant quin dels dos possibles caràcters d’espai en blanc era l’adïent al convertir.

“Ô.chr(160)

Quedant la cosa de la següent manera:

$origen=array(‘Ã’.chr(160), “á”, “ä”, “è”, “é”,”ë”, “ì”, “í”, “ï”, “ò”, “ó”, “ö”, “ù”, “ú”, “ü”, “ç”, “ñ”, “À”, “Á”, “Ä”, “È”, “É”, “Ë”, “ÃŒ”, “Í”, “Ï”, “Ã’”, “Ó”, “Ö”, “Ù”, “Ú”, “Ãœ”, “Ç”, “Ñ”);

$desti=array(“à”, “á”, “ä”, “è”, “é”, “ë”, “ì”, “í”, “ï”, “ò”, “ó”, “ö”, “ù”, “ú”, “ü”, “ç”, “ñ”, “À”, “Á”, “Ä”, “È”, “É”, “Ë”, “Ì”, “Í”, “Ï”, “Ò”, “Ó”, “Ö”, “Ù”, “Ú”, “Ü”, “Ç”, “Ñ”);

$var = str_replace($origen, $desti, $var);

Written by in: General |
des.
24
2008
1
des.
07
2008
2

La invassió dels catalans

Fa temps que els catalans som gent hiper-activa en el món del software lliure, tenim una obsessió: Traduir, traduir i traduir. Coneixem la feblesa de la nostre llengua en aquest món tan globalitzat i invaït per la llengua anglesa, però, alhora coneixem les possibilitats que ens ofereix el software lliure que no respon a interessos comercials ni pactes ocults.

Vols que el teu software preferit tingui una versió catalana? Doncs fes-ho tu mateix, crear una traducció i envia-ho a la comunitat!

Gràcies a aquesta llibertat estem en una posició envejable, perquè en el fons som gent treballadora i compromesa, i actualment és molt més senzill trobar software lliure en català que amb altres llengües amb un nombre similar de parlants, de fet, en molts casos tenim millors traduccions i més completes que les comunitats hispanes, que tenen molts més milions de parlants, i per tant, molts més milions de possibles col·laboradors per una hipotètica traducció.

Avui tinc l'honor de presentar les meves dues últimes incorporacions.

Primer la traducció catalana del tema d'administració RootCandy per Drupal 6. Vaig enviar la traducció el 27 d'Octubre de 2008 i va ser incorporada a la branca oficial del tema el 2 de Desembre.

Segon la traducció catalana d'un dels plugins més utilitzat del gestor de blocs Lifetype, estic parlant del Template Editor. En aquest cas vaig enviar la traducció catalana definitiva el 21 d'Octubre de 2008 i va ser incorporada a la branca oficial el 4 de Desembre de 2008.

Col·laboreu patriotes!

Written by in: Frikades |
oct.
24
2008
0

Ubuntu countdown

Ubuntu 8.10 Comming Son – 6 dies!

Written by in: Frikades |
set.
23
2008
4

Drupal 7

Com molts sabreu Drupal és un dels gestors de continguts més coneguts, jo estava força content amb les possibilitats de Drupal però mai havia sentit una expectació tan gran com la que hi ha amb la versió 7 de Drupal.

Actualment es troba en una fase super-activa de desenvolupament i les millores que va incorporant són esperançadores, una darrera l'altre, moltes de les crítiques i punts febles estan caïent.

Últimament m'he enganxat a seguir el desenvolupament del Drupal 7, mai havia mirat tant de codi tant a fons!

M'agradaria comentar quatre de les coses que més estan centrant l'atenció i que estan generat grans dossis d'emocions, exitació i espectació.

Database Layer: The Next Generation

El primer és la nova capa per fer consultes a la Base de dades, com que Drupal abandona PHP4 pot utilitzar funcionalitats natives de PHP5 com és el que s'anomena PDO. Quin és el gol d'aquesta nova forma d'accedir a la base de dades? Doncs que ara serà molt fàcil i de forma nativa en PHP utilitzar molts tipus diferents de Bases de Dades per fer funcionar el teu Drupal: MySQL, PostgreSQL, ORACLE, SQL Lite… etc. Aquesta millora ha generat varis fils però el més important va ser aquest, sobretot per l'esperat "commit" del comentari 331: http://drupal.org/node/225450

Simpletest

Una altre incorporació al nucli de Drupal i que està enamorant a tots els desenvolupadors és el SimpleTest. A un programador el que menys li agrada fer es provar, i cada cop que programa algun mòdul o fa quelcom amb el codi de Drupal és un rotllo provar una i una altre vegada que tot funciona… amb simpletest t'ho estalvies. S'han programat ja centenars i centenars de funcionalitats i tasques de Drupal. Tu l'únic que has de fer és llençar tots els test i ell solet de comprova les funcionalitats de Drupal (pot publicar notícies?, pot registrar usuaris?, el captcha dels comentaris va bé?… etc.). Ell sol prova totes aquelles coses que se suposa que fa el gestor de continguts i si has trencat alguna cosa t'avisa. Podeu seguir una mica el tema al seu grup: http://groups.drupal.org/node/10099

WYSIWYG

Fins ara Drupal era dels pocs getsors de continguts que es resistia a incorporar un editor WYSIWYG al nucli. Ho havia deixat tot a la banda dels móduls i les contribucions de la comunitat… els mòduls més famosos eren el del TyniMCE i el del FCKEditor, per fi sembla que finalment en tindrà un al nucli i aquest fil va en aquest sentit, en oferir, per fi, una forma fàcil i senzilla perquè les àrees de text pugin incoporar l'editor que faci falta, quan faci falta i facilment!!! M'encata la sol·lució adoptada! Això no incorpora cap editor encara però possa les bases perquè la cosa comenci a funcionar bé! http://drupal.org/node/125315

hook_file

Molta gent sempre ha pensat que Drupal no manejava prou bé els fitxers, que tot plegat era massa complicat i que la seva API tenia un buit en aquest sentit. Aquesta és la gran esperança en aquest aspecte, un nou hook per manegar els fitxers!: http://drupal.org/node/142995

Written by in: Frikades |
set.
19
2008
1

El Chrome comença a funcionar

Després de la decepcionant primera experiència amb el Google Chrome les actualitzacions del navegador no paren.

De moment encara no acaba d'interpretar bé moltes pàgines però almenys es van veïen canvis substancials. Mireu el salt de versions que acaba de fer el meu Chrome 😀

No pretenc encetar un debat sobre si s'han equivocat triant WebKit enlloc de Gecko, o sobre la privacitat de les dades dels hàbits de navegació de l'usuari. Tot i així és un dels temes on feïa temps que no veïa tanta gent opinant sense tenir-ne ni idea.

Quants dels que estan opinant ara no havien sentit mai abans la paraula "WebKit" o "Gecko"? gairebé tots! 😀 És increïble la feina del que en comunicació audiovisual se'n diu "líders d'opinió", un opina, la resta el llegeixen i immediatament es possen a defensar el que ha dit com si sapiguessin del que parlen, és increïble 😀

Written by in: Frikades |
set.
16
2008
6

Chain Reaction (Reacció en Cadena)

L'altre dia vaig patir en una web una reacció en cadena espctacular, una petita actualització que va desencadenar tota una sèrie d'errors i problemes en cadena que m'han obligat a modificar gairebé tot el software i a passar-ho tot de les versions estables a les de desenvolupament. Va ser gairebé espectacular.

Tot va començar amb una actualització, en teoria, molt petita. El sistema de notificacions automàtiques em va informar que el mòdul CCK de la web tenia disponible la versió Release Candidate 7, i jo tenia instal·lada la RC 6. En principi era una actualització poc important perquè les Release Candidates són les versions prèvies a una versió defnitiva i normalment se'n necesiten poques per fer el llançament definitiu. No estem parlant de cap al alfa ni cap beta!!!

>Acció! Som'm-hi, actualitzem!

Ok, faig l'actualització, 2 minuts de feina i aquí comencen els problemes!

> Reacció 1! El mòdul Views no és compatible amb aquesta nova versió!!! Argh!

Ok. Vaig a mirar el mòdul Views i aquests han realitzat un canvi en la API. Osti!!! Però si estan en la versió RC1 en llançament, en teoria, ja no hi han canvis a la API!

Ok. Cap problema, actualitzarem també el Views…

Però quina és la meva sorpresa? Doncs que encara no han tret la versió RC2 amb el canvi a la API, i el mòdul CCK han llançat la seva versió només compatibla amb Views RC2, abans que aquests llancin el Views RC2!!! espectacular! última versió del CCK només compatible amb una versió del Views que encara no existeix!

Cap problema! Actualitzo Views a la versió de desenvolupament!

Faig el canvi a Views-dev i tatxan! Funcionen junts Views i CCK! Molt bé!

> Reacció 2! Ha desaparegut el calendari d'actes!!!! Argh!!!

Nova investigació i resulta que degut al canvi de la API del VIews cal una actualització de tots els mòduls que el facin servir i el mòdul Calendar és un d'ells! Cap problema! Existeix una solu·lució en al versió de desenvolupament de calendar així que actualitzaré el Calendar a la versió de desenvolupament…

> Reacció 3! El mòdul calendar te una dependència amb el mòdul Date API i la versio de desenvolupament necessita ser actualitzat també amb la versió de desenvolupament del Data API!!! Osti…

Ok. Actualitzem també a la última versió en desenvolupament del Data API…

Actualitzo els dos mòduls Date API i Calendar a les versions de desenvolupament i durant el procés d'actualutzació… bang!!!

> Reacció 4! Error PHP!!! Falla el tema, l'aspecte de la web, per un problema amb els noms de les funcions!!! Osti de nou!!! Ara no funciona res!!!!

Nova investigació i resulta que és un problema amb la versió estable de Drupal 6.4!!!! Sembla que les noves versions tenen problemes amb els noms de les funcions quan aquests interactuen amb altres mòduls. Osti!!!! Sol·lucionat en la versió de desenvolupament de Drupal!!! A la espera que surti la 6.5 que encara no existeix!

Doncs so'm-hi. Actualitzem tot el Drupal a la última versió en desenvolupament! Drupal 6.x-dev! Ja no em queda pràcticament res en versió "estable".

>Reacció 5! PHP Noticies!!! Ostres!!! Ara funciona sense errors però apareixen tota una sèrie d'advertències i notificacions del PHP sobre el mòdul node_images!!!

Quin és el problema aquest cop?

Doncs resulta que les versions estables de Drupal tenen el PHP Notices desactivat, que són els anomenats warnings o advertències i que no són necessàriament errors. Però per ajudar als desenvolupadors, les versions de desenvolupament tenen el PHP Noticies activat!! I això ha fet aparèixer problemes que fins ara no es veïen del mòdul node_images.

En aquests cas he mirat el problema i no existia sol·lució encara, així que tenia dues opions, o que desactivar el PHP Notices i amagar els problemes o reportar-ho i mirar de sol·lucionar-ho. La meva reacció ha estat la segona, he reportat l'error i m'he possat a mirar quin era el problema.

> Reacció 6! pocs minuts després el stefano73, el programador del node_images, em contesta que ha trobat el probelma que provocava les advertències del node_images i que l'ha arreglat! Aquest noi és molt ràpid! 😀

Ok!! aplico la correcció del sotware a ma perquè la versió amb la correcció del node_images no sortirà fins al dia següent, torno a mirar la web i, per fi, sembla que tot torna a funcionar correctament…

bufff… la reacció en cadena s'ha aturat.

Written by in: Frikades |

Powered by WordPress | Theme: Aeros 2.0 by TheBuckmaker.com

Aneu a la barra d'eines