Tuesday, August 31, 2010

Massa literal

A un hotel d'El Perelló, Tarragona, de presència massiva de l'idioma francès, a moltes portes podies trobar un cartell amb el text en anglès "prohibited the step".
From lost to the river.
Prohibited the step

Friday, August 27, 2010

Oracle UTL_HTTP i ACL a la 11g

Tenia un bug molt xungo a l'Oracle en el que obtenia el següent missatge d'error:

ORA-24247: network access denied by access control list (ACL)


Després d'investigar una miqueta veia que es produïa en obrir una connexió HTTP fent servir el package UTL_HTTP. I això funcionava perfectament a la 10g. El més fort és que fent servir un procediment anònim funcionava i amb un procedure no.

Això funciona:
declare
l_http_req utl_http.req;
begin
l_http_req := utl_http.begin_request ('http://alapamui.blogspot.com/', 'POST');
utl_http.end_request(l_http_req);
end;
/

Això no funciona:
create or replace procedure test_http is
l_http_req utl_http.req;
begin
l_http_req := utl_http.begin_request ('http://alapamui.blogspot.com/', 'POST');
utl_http.end_request(l_http_req);
end;
/

begin
test_http;
end;
/

Investigant una miqueta més, resulta que a la 10g un usuari amb permisos per executar UTL_HTTP podia accedir a qualsevol URL, però a la 11g han incorporat un mecanisme més fi basat en ACL (Access Control Lists).

A la web de ORACLE-BASE hi ha una explicació de com funcionen els accessos a xarxa a la 11g. En el meu cas he tingut prou amb el següent:

BEGIN
DBMS_NETWORK_ACL_ADMIN.create_acl (
acl => 'alapamui.xml',
description => 'Alapamui ACL',
principal => 'ALAPAMUI',
is_grant => TRUE,
privilege => 'connect',
start_date => SYSTIMESTAMP,
end_date => NULL);

COMMIT;
END;
/

BEGIN
DBMS_NETWORK_ACL_ADMIN.assign_acl (
acl => 'alapamui.xml',
host => 'alapamui.blogspot.com',
lower_port => NULL,
upper_port => NULL);

COMMIT;
END;
/
Si el que cal és accedir a una pàgina per HTTPS, cal configurar també els certificats a l'Oracle o obtindreu un error com el següent:

ORA-29024: Certificate validation failure


Els certificats a l'Oracle s'enregistren en una cosa que li diuen Wallet. Si no disposeu de l'Oracle Wallet Manager podeu enregistrar els certificats fent servir la comanda orapki.

Tuesday, August 24, 2010

Estic llegint: Anatema

Anatema
De Neal Stephenson. 2009. Publicat per Ediciones B. 720 pàgines.

Es tracta d'una novel·la de ciència ficció, pel mateix autor de Snow Crash i de Criptonomicón. Ambientada en un altre planeta, Arbre, on després de milers anys d'història la societat està dividida entre uns monjos que viuen tancats en els seus concentos (com monestirs) i els que viuen extramurs. Aquests monjos, que els hi diuen avotos, no tenen res a veure amb la religió i el seu accés a la tecnologia és molt limitat. Mentrestant, fora, tenen els seus cismex, transbors i fins i tot, el Retículum.

Neal Stephenson planteja tot un món nou, molt semblant a la Terra, i en aquest escenari planteja l'aparició d'una nau espacial alienígena.

Pel camí fa un grapat de reflexions sobre filosofia, religió, matemàtiques, tecnologia, botànica, química, música i, fins i tot, enologia (de vins).

M'ha encantat el concepte dels loritas, els seguidors de Sante Loras. Consideren que a partir de determinada data ja s'han formulat tots els teoremes i que cada cosa nova que apareix ja l'havia dit algú altre abans. Acumulen tot el coneixement i cada vegada que surt una nova idea s'encarreguen d'identificar quin antic pensador ja havia formulat el mateix. Molt bo.

Amb tanta terminologia inventada i tant de joc amb el grec i el llatí, segur que la traducció no ha estat gens fàcil. I s'ha de dir que el resultat és excepcional, a càrrec de Pedro Jorge Romero (que té el seu blog).

Les 300 primeres pàgines m'han semblat absolutament genials. És on presenta tot el món i els personatges. D'entrada costa una miqueta entrar, però et vas acostumant als termes i ja resulta fàcil desxifrar les frases. Anar descobrint els noms que li han anat donant a Arbre a coses com el teorema de Pitàgores, el món de les idees de Plató o la Navalla d'Occam, resulta també força estimulant.

Després d'aquestes 300 pàgines es va transformant en space opera i té alguns moment que es fa pesat (ja li passa al Neal Stephenson).

Per cert, em va fer gràcia trobar-me un pròleg del Miquel Barceló (un antic profe meu), ja que és el responsable d'aquesta col·lecció. (He trobat una antiga entrevista al Miquel que val la pena mirar).

Aquest llibre té una pàgina web amb continguts molt interessants:
  • Podeu llegir en anglès algunes pàgines del llibre
  • Hi ha vídeos amb entrevistes a l'autor
  • Hi ha un trailer del llibre (no havia vist mai res semblant). Per cert, no recomano veure el trailer abans de llegir la novel·la, per què li posaràs cares als personatges i crec que és més divertit deixar jugar la teva imaginació.
  • Hi ha una secció de música espectacular. A la novel·la es parla que es poden fer demostracions matemàtiques amb música, jugant amb els harmònics. Doncs a la web del llibre podeu trobar experiments musicals (cantats) on justament fan això. Impressionant.

En castellà podeu trobar una altra ressenya d'Anatema amb la que coincideixo totalment.

No és una lectura fàcil, però sí que és molt recomanable. Conec moltes persones que han hagut de deixar a mitges Criptonomicón (més de les que em pensava). La meva experiència és que la lectura de Neal Stephenson de vegades cansa, però la recompensa final paga la pena.

Per cert. A la majoria de les ressenyes descriuen la Anatema com "una novel·la de ciència ficció especulativa". Jo no havia sentit aquest terme abans. De fet, la primera vegada que l'he sentit ha estat dins del llibre, quan els protagonistes comentes les pel·licules (que li diuen motus) que veuen extramurs. Cada dia s'aprenen coses noves.

Tuesday, August 17, 2010

Manning i Lucene

Al meu primer projecte informàtic vaig fer servir un motor de recerca textual i des d'aleshores és un tema que m'ha atret molt. Fa més de quatre anys vaig descobrir una llibreria Java de codi obert per fer cerques sobre documents, Lucene, i em va fascinar. Fins i tot vaig implementar en Java un petit cercador/indexador sobre els meus documents, que fins i tot extreia les descripcions de les imatges, les etiquetes dels mp3 i el text dels pdf.

Vaig llegir-me un llibre, Lucene in Action, de l'editorial Manning i em va ajudar molt. L'any passat vaig veure que els mateixos autors anaven a treure la segona edició, i confiava poder fer servir Lucene de forma professional, així que vaig decidir comprar-lo. Però encara no l'havien escrit!

Els de Manning tenen un programa molt interessant anomenat MEAP (Manning Early Adopter Program). Pots comprar llibres a un preu molt més reduït, amb la possibilitat de comprar-los en format paper o electrònic, i vas rebent les diferents edicions prèvies que fan els autors. També tens uns fòrums on pots opinar i conversar directament amb els autors mentre encara estan fent l'obra.

Ja sabem que, al sector de la informàtica, el llibres tècnics són obsolets quan arriben als prestatges de les llibreries. Disposar d'aquesta agilitat m'ha semblat una idea estupenda (que segur que la tenen moltes altres editorials, però que jo no coneixia).

Quan em vaig subscriure al programa per Lucene in Action el març de 2009 vaig rebre un esborrany d'alguns capítols en format PDF. Vaig rebre altres actualitzacions i ha estat una llàstima no poder-me ficar més a fons al fòrum.

Ahir vaig rebre la meva còpia en paper i no sabeu la il·lusió que m'ha fet.

Friday, August 13, 2010

Sherlock Holmes, la pelicula. Pffff

Vam veure la pelicula Sherlock Holmes protagonitzada per Robert Downey Jr. i Jude Law i la sensació es estranya.

Per una banda és una pel·lícula força entretinguda, amb ritme i plena d'acció. Molt ben feta.

Per altra banda no te res a veure amb el personatge que va crear Arthur Conan Doyle i te força incongruències.

No és que jo sigui molt fan del personatge de Sherlock Holmes, però sí que m'ha interessat el personatge. De fet, les meves pel·lícules preferides de Holmes no són les més ortodoxes (El jove Sherlock Holmes i La vida privada de Sherlock Holmes, del genial Billy Wilder).

Actualment la millor recreació que trobo és la de la sèrie House. Un metge hàbil en la seva feina, però un misantrop, jonki, misogin, que viu al 221B i que té un amic al que no respecta que es diu W...ilson. Fins i tot la productora va fitxar pel personatge a un actor britànic, en Hugh Laurie, que dóna pel físic del detectiu victorià. I només s'inspiren en el personatge...

A la pel·licula ni s'han aproximat. La productora (o qui hagi estat) ha volgut "americanitzar-ho" tot al màxim, com es va fer en el seu dia amb La lliga dels homes extraordinaris (que pintava Tom Sawyer?). Fins i tot a la trama de Sherlock Holmes surt un ambaixador nordamericà i parlen de dominar els Estats Units, "que havien estat una colònia britànica".

Trobem un Sherlock atleta, expressiu, atret per una dona, sense cap referència a cap addicció, i ens presenten un argument purament d'acció, mes propi del 007 que d'una altra cosa.

Em vaig sentir com quan un amic trekkie em comentava la darrera pel·licula de Star Trek. Tot i que els guionistes han tractat, deliberadament, de trencar completament amb la trama original, n'hi ha coses que als trekkies els fa mal: els salts a velocitat warp o la relació sentimental de Sr. Spock.

Jo també vaig sentir traït el personatge de Sherlock Holmes, per molt que la pel·licula fos entretinguda. Altres patinades al guió com les referències a explosius activats per ones de ràdio em van ajudar fer-me una opinió: la pel·licula de Sherlock Holmes et pot agradar... si no et fa mal.

Ara veig que hi ha una nova sèrie de televisió que es diu Sherlock. Com que és de la BBC crec que tindrem més sort. Ja veurem.

Monday, August 9, 2010

Eines: Spotify

SpotifySpotify és un programa per escoltar música en streaming (no cal que tinguis descarregat res), i és legal!. Hi ha una modalitat de pagament i una altra d'ús gratuït, i em sembla que ara també hi ha una modalitat que et deixa escoltar músic un número determinat d'hores al dia.

La modalitat gratuïta funciona com la ràdio: de tant en tant et van ficant publicitat. És com si estiguessis escoltant música del teu MP3, triant el que tu vulguis, i de tant en tant et surt un anunci. Si et molesten els anuncis, sempre pots accedir a la modalitat de pagament.

Fins fa poc, per poder-ho fer servir havies de tenir una invitació d'algú que ja fos usuari, però crec que ara ja no cal.

És ideal per compartir música amb els companys, o per crear llistes de cançons entre els amics, i compartir-les. També resulta molt fàcil posar un enllaç a alguna cançó sense haver d'enviar res (ni haver de buscar el vídeo de YouTube corresponent).

Hi ha moltíssima música, des de Xesco Boix fins a Radiohead, tot i que no és tot. Dels coneguts, per exemple, no he trobat The Beatles ni Garth Brooks.

És interessant la modalitat Ràdio, que tries estils de música i èpoques i et va posant música.

Funciona amb Linux perfectament, tot i que s'ha d'instal·lar amb Wine. Vaig tenir un petit problema amb els links des de Firefox, però el vaig resoldre molt ràpid.

Per a mi ara és una eina de treball imprescindible.

Wednesday, August 4, 2010

Seqüències d'Oracle (2 de 2)

Ja vam comentar què eren les seqüències d'Oracle i els problemes que podien donar, així que avui mirarem de veure què podem fer per sobreviure-hi.

Els principals problemes de les SEQUENCES són que no estan directament associades a una taula i que pot ser que generin números que ja existeixen i donaran errors de clau duplicada.

Com a tot, el millor és adquirir bones costums, que això evita molts mal de caps.

El millor, en la meva opinió, és tenir una seqüència diferent per cada taula que necessiti, i que siguin fàcilment identificables. A mi em resulta molt útil associar a cada taula un nom curt entre 2 i 4 lletres, i anotar aquestes associacions a alguna banda. Després els índexs, les restriccions, les claus i tot el que tingui a veure amb la taula, tindrà aquest nom curt com a part del nom. Així tot és fàcilment identificable.

Per exemple, si tenim les taules EMPLEATS i DEPARTAMENTS, els hi donarem els noms curts EMP i DEP, i les seves seqüències associades seran SEQ_EMP i SEQ_DEP.

Aquesta associació la podem mantenir a una taula de metadades MET_TABLES(table_name, short_name), per exemple. Així fem nosaltres la feina que no ens fa l'Oracle automàticament.

A una anterior empresa vaig muntar un script (despendoleitor.sql, li dèiem) que omplia aquesta taula de metadades amb dos columnes més: max_value i current_seq. La primera columna l'omplia amb el SELECT MAX(*) per cada taula i la segona amb el valor que retornaria un NEXTVAL de la seqüència associada (obtingut directament des de USER_SEQUENCES).

Amb aquestes dades farcides el que fèiem era detectar si havia seqüències amb valors per sota del màxim i, en aquests casos, fèiem un DROP i un CREATE de la SEQUENCE amb un valor per sobre del màxim.

Tot això està molt bé però esborrar i recrear les seqüències fa que quedin invàlids tots els PL/SQL que les fan servir, i recompilar-los pot suposar una estoneta.

La manera d'evitar-ho consisteix en fer un ALTER de la seqüència per modificar l'INCREMENT BY, fer-li un NEXTVAL, i restaurar-li l'INCREMENT BY que tenia. També desactivem el CACHE abans de fer el NEXTVAL i desprès el restaurem, però això no seria tan important.

Per tal d'aconseguir-ho hem fet un petit procediment PL/SQL i aquí el teniu:
CREATE OR REPLACE PROCEDURE sequence_updater(
p_owner IN VARCHAR2
,p_sequence_name IN VARCHAR2
,p_last_number IN NUMBER
)
IS
v_last_number NUMBER;
v_increment_by NUMBER;
v_cache_size NUMBER;
v_new_increment NUMBER;
v_last_value NUMBER;
v_aux NUMBER;
BEGIN
SELECT last_number, increment_by, cache_size
INTO v_last_number, v_increment_by, v_cache_size
FROM all_sequences
WHERE sequence_owner = p_owner
AND sequence_name = p_sequence_name;

v_new_increment := p_last_number - v_last_number;

IF v_new_increment != 0 THEN
EXECUTE IMMEDIATE 'ALTER SEQUENCE '|| p_owner ||'.'||p_sequence_name
|| ' INCREMENT BY '|| v_new_increment ||' NOCACHE';
EXECUTE IMMEDIATE 'SELECT '|| p_owner ||'.'
|| p_sequence_name ||'.nextval FROM DUAL' INTO v_aux;
EXECUTE IMMEDIATE 'ALTER SEQUENCE '|| p_owner ||'.'||p_sequence_name
|| ' INCREMENT BY '||v_increment_by ||' NOCACHE';

LOOP
EXECUTE IMMEDIATE 'SELECT '|| p_owner ||'.'
|| p_sequence_name ||'.currval FROM DUAL' INTO v_last_value;
EXIT WHEN v_last_value >= (p_last_number - 1);
EXECUTE IMMEDIATE 'SELECT '|| p_owner ||'.'
|| p_sequence_name ||'.nextval FROM DUAL' INTO v_last_value;
END LOOP;

IF v_cache_size != 0 THEN
EXECUTE IMMEDIATE 'ALTER SEQUENCE '|| p_owner ||'.'
||p_sequence_name || ' CACHE '|| v_cache_size;
ELSE
EXECUTE IMMEDIATE 'ALTER SEQUENCE '|| p_owner ||'.'
||p_sequence_name || ' NOCACHE';
END IF;
END IF;

END sequence_updater;
/

Vam intentar posar aquest codi en un esquema que fos DBA i actualitzar totes les seqüències de tots els esquemes, però no ens funcionava i no sabem per què. Només ens ha funcionat si cada esquema té el procediment. Crec recordar que al PL/SQL existeix la manera de crear procediments que s'executin amb els drets del propietari o amb els drets del que l'executa. Potser podríem investigar per aquí. De moment sí que funciona si el crida el propietari.

La crida és una cosa tan senzilla com:
EXEC SEQUENCE_UPDATER('NOM_DE_TAULA', 'TAB_SEQ', 3824);

Després d'una exportació d'una base de dades en execució es pot obtenir el valor de totes les seqüències i preparar un script que cridi al SEQUENCE_UPDATER. Imagino que amb el data pump també es pot fer una exportació de només les seqüències, però crec que serà més ràpid l'execució del script.

Després de muntar el nostre script vam trobar un altre script que feia el mateix a la web de PSOUG. En aquest cas li diuen reset_sequence (està cap al final de la pàgina).

Amb aquest nou procediment i aquestes bones pràctiques s'hauran acabat molts mal de caps amb les seqüències de l'Oracle.

Primera part: Seqüències d'Oracle (1 de 2)

Sunday, August 1, 2010

Seqüències d'Oracle (1 de 2)

Al mon de les bases de dades és habitual necessitar la generació automàtica claus: algun mecanisme que generi números diferents per identificar cada registre. Els coneixedors d'Access poden associar aquest concepte amb els autonumèrics. (què faig jo parlant d'Access i bases de dades en un mateix paràgraf?).

Al mon de la teoria de Base de Dades a aquestes claus no semàntiques es coneixen com a surrogate keys i, tot i que tenen detractors, es fan servir a tot arreu.

Cada fabricant de base de dades ha implementat aquesta funcionalitat de forma diferent. Informix té els SERIAL, Microsoft SQL Server els IDENTITY i MySQL té l'atribut AUTO_INCREMENT. Hi ha una comparació de mecanismes de generació de claus força interessant, que també explica cóm proposa l'estàndard que s'hauria d'implementar (que les anomena IDENTITY).

El que més s'allunya de l'estàndard és Oracle. Té un element extern a la taula que genera els números, la SEQUENCE, que s'ha de fer servir per obtenir els valors abans de fer un INSERT amb l'operador NEXTVAL.

Res obliga a fer servir una SEQUENCE determinada amb una taula, o no fer servir cap. Per aquesta raó és fàcil que es donin casos anòmals. Pot succeir que la taula T(id, camp) contingui registres amb els valors per id 1, 12, 23 i 53, i que la seqüència que s'acostuma a fer servir per les seves insercions tingui el valor 24 per què, per exemple, algú ha inserit el valor 53 sense fer servir la seqüència. Podrem fer insercions fent servir la seqüència fins que s'arribi al valor 53, que ens donarà un error al trobar un valor duplicat.

Aquesta descorrelació entre SEQUENCES i valors a les taules és més freqüent del que sembla, i no té una solució general. De fet, aquest problema es pot produir si has fet una exportació d'una base de dades mentre estava en activitat, ja que primer exporta les metadades (i les seqüències ho són) i després les dades i fa les dues operacions amb bloquejos diferents.

A més a més Oracle no permet fer un modificació directa del valor que vols que retorni la seqüència, la qual cosa ho complica tot encara més, ja que hauràs d'esborrar la seqüència i tornar-la a crear i pot ser que descompilis procediments, paquets i disparadors.

A la segona part veurem tècniques per sobreviure a aquests problemes amb les SEQUENCES.

Segona part: Seqüències d'Oracle (2 de 2)