• Com copiar un enllaç simbòlic a GNU/Linux

    Estava cercant com copiar un enllaç simbòlic des de la lína de comandes. Pensava que amb l’ordre cp i algun paràmetre de l’estil –link (o -l) es podria fer. Amb “cp -l” aconseguim enllaçar els fitxers en lloc de copiar-los, però no és el que vull ara. He trobat com fer-ho, és així:

    cd directori
    find nom_del_link_a_copiar | cpio -pmadv directori_destí

    Si el directori de destí no existeix es crearà. Es copiarà l’enllaç simbòlic amb el mateix nom dins el directori de destí.

    Si volem copiar l’enllaç simbòlic al mateix directori però amb un altre nom, sempre podem crear-lo en un lloc temporal i després moure’l:

    cd directori
    find nom_del_link_a_copiar | cpio -pmadv /tmp
    mv /tmp/nom_del_link_a_copiar ./nou_nom

    Cal tenir en compte que els enllaços simbòlics relatius poden trencar-se. Això vol dir que si no es troben en directoris del mateix nivell, el nou enllaç no apuntarà correctament al seu destí.

    GD Star Rating
    loading...

  • Substituir text en múltiples fitxers amb sed

    Si volem substituir una cadena de caràcters per una altra en un fitxer o en múltiples fitxers simultàniament i de forma recursiva1 ho podem fer amb aquesta comanda:

    find -type f -exec sed -i 's/CADENA A SUBSTITUIR/CADENA NOVA/g' {} \;

    On CADENA A SUBSTITUIR és una expressió regular. Això vol dir que hem d’escapar els caràcters amb connotacions especials amb una barra invertida \, com . + * [ ] etcètera.

    També cal tenir en compte que això substituirà totes les aparicions de la cadena a substituir que es trobin per tots els fitxers. Si volem que només s’apliqui a certs fitxers, podem utilitzar el paràmetre -name de la comanda find.

    Si combinem el que he dit als dos paràgrafs anteriors, per exemple la comanda:

    find -type f -name aliments* -exec sed -i 's/pebrot (vermell)/maduixa vermella/g' {} \;

    cercarà només en fitxers els noms dels quals comencin per aliments,  i substituirà pebrot (vermell) per maduixa vermella.

    Ho podem complicar més, i aprofitar la paraula vermell de la cadena inicial i afegir-li la lletra a per fer-la femenina: vermella, tot amb expressions regulars:

    find -type f -name aliments* -exec sed -i 's/\(pebrot (\)\(vermell\))/maduixa \2a/g' {} \;

    Aquesta expressió crea dos grups: el primer conté “pebrot (” i el segon “vermell” (el darrer parèntesi queda fora de cap grup). Així podem usar la seqüència \2 per referir-nos al contingut del segon grup, al qual li afegim la lletra a per transformar-lo en “vermella”.

    1 Si volem fer-ho en un sol fitxer o en varis sense necessitar la recursivitat no cal usar find, podem usar sed directament:

    sed -i 's/CADENA A SUBSTITUIR/CADENA NOVA/g' fitxer1 *.txt
    GD Star Rating
    loading...

  • Actualitzar automàticament la revisió/data/autor en fer commit a subversion

    Si recentment escrivia l’entrada sobre la comanda find amb la possibilitat de fer diferents cerques simultànies, avui explico un cas on ho he usat.

    Alguna vegada haureu vist en fitxers amb codi font (siguin del llenguatge de programació que siguin), que a la part superior apareix informació sobre què conté el fitxer, la seva llicència, o l’autor, la data i el número de revisió dels darrers canvis que ha patit el fitxer en qüestió. En referència a aquestes tres darreres em refereixo a una línia d’aquest estil:

    $Id: codi.php 148 2006-07-28 21:30:43Z jaume $

    Evidentment aquestes dades no són escrites a mà per l’autor cada vegada que fa un canvi al fitxer (una nova revisió), sinó que es realitza automàticament; i concretament aquest és el format que utilitza subversion per la variable Id. En realitat jo havia escrit $Id$ allà on he volgut del fitxer anomenat codi.php, i en fer el commit al dipòsit el sistema ho ha substituït per la línia completa que veieu a dalt. Id és una combinació reduïda de les paraules clau $Author$, $Revision$ i $Date$, que també podeu utilitzar de forma independent. Al manual de subversion (en anglès) podeu llegir més al respecte. Si volem que tots els fitxers del nostre projecte que tinguem al sistema de control de versions subversion incorporin aquesta funcionalitat, hem de configurar el servidor de certa manera. Editem el fitxer /etc/subversion/config (aquest és el camí a Ubuntu, però serà similar a altres distribucions). Per defecte enable-auto-props està comentat, ho deixem així:

    ### Set enable-auto-props to 'yes' to enable automatic properties
    ### for 'svn add' and 'svn import', it defaults to 'no'.
    ### Automatic properties are defined in the section 'auto-props'.
    enable-auto-props = yes
    

    I una mica més avall editem les propietats automàtiques:

    ### Section for configuring automatic properties.
    [auto-props]
    ### The format of the entries is:
    ###   file-name-pattern = propname[=value][;propname[=value]...]
    ### The file-name-pattern can contain wildcards (such as '*' and
    ### '?').  All entries which match (case-insensitively) will be
    ### applied to the file.  Note that auto-props functionality
    ### must be enabled, which is typically done by setting the
    ### 'enable-auto-props' option.
    *.php = svn:eol-style=native;svn:keywords=Author Date Id Revision
    *.txt = svn:eol-style=native;svn:keywords=Author Date Id Revision
    *.sh  = svn:eol-style=native;svn:keywords=Author Date Id Revision;svn:executable
    *.tpl = svn:eol-style=native
    *.css = svn:eol-style=native
    *.js  = svn:eol-style=native
    *.htm = svn:eol-style=native
    *.html = svn:eol-style=native
    *.htaccess = svn:eol-style=native
    *.png = svn:mime-type=image/png
    *.jpg = svn:mime-type=image/jpeg
    *.gif = svn:mime-type=image/gif
    

    Jo he definit que només els fitxers amb l’extensió php, txt i sh tinguin la capacitat de substitució de paraules clau. A més a més els .sh vull que siguin executables (de manera que si algú fa un check out el propi subversion s’encarregui de marcar el bit d’execució per nosaltres). I si us hi fixeu, la resta de fitxers de text tenen una altra propietat: svn:eol-style=native. Això fa referència al final de línia (en anglès, eol = end of line), i serveix per què vàries persones treballin sobre els mateixos fitxers en sistemes operatius diferents (els quals usen diferents caràcters per indicar el final de línia). Les tres darreres línies són pels fitxers d’imatge, cadascun amb el seu tipus mime corresponent.

    Un cop fet això, ens assegurem que els fitxers nous que agreguem al dipòsit tindran aquestes propietats, però què passa amb els fitxers existents? Cal que els donem les propietats nosaltres manualment, i aquí entra la potència de la comanda find. I si ho podem fer tot d’una sola passada millor 🙂 Ens situem al directori arrel del nostre projecte i executem:

    find . \
    \( -name '*.php' -exec svn propset svn:eol-style native {} \; -exec svn propset svn:keywords 'Author Date Id Revision' {} \; \) , \
    \( -name '*.txt' -exec svn propset svn:eol-style native {} \; -exec svn propset svn:keywords 'Author Date Id Revision' {} \; \) , \
    \( -name '*.sh'  -exec svn propset svn:eol-style native {} \; -exec svn propset svn:keywords 'Author Date Id Revision' {} \; -exec svn propset svn:executable {} \; \) , \
    \( -name '*.tpl' -exec svn propset svn:eol-style native {} \; \) , \
    \( -name '*.css' -exec svn propset svn:eol-style native {} \; \) , \
    \( -name '*.js' -exec svn propset svn:eol-style native {} \; \) , \
    \( -name '*.htm' -exec svn propset svn:eol-style native {} \; \) , \
    \( -name '*.html' -exec svn propset svn:eol-style native {} \; \) , \
    \( -name '.htaccess' -exec svn propset svn:eol-style native {} \; \) , \
    \( -name '*.png' -exec svn propset svn:mime-type 'image/png' {} \; \) , \
    \( -name '*.jpg' -exec svn propset svn:mime-type 'image/jpeg' {} \; \) , \
    \( -name '*.gif' -exec svn propset svn:mime-type 'image/gif' {} \; \) > /dev/null
    

    I això és tot, a programar de gust! 😉

    GD Star Rating
    loading...

  • Cerca amb la comanda find de GNU/Linux

    Fins ara, sempre que havia de cercar diferents tipus de fitxers i/o directoris amb la comanda find, executava una comanda de forma independent per a cada cosa. Però això no és gens òptim, perquè cerquem una i altra vegada per tots els fitxers desitjats. Fa uns dies vaig aprendre com cercar vàries coses alhora, en una sola cerca, de manera que se li puguin indicar a find diferents patrons. Aquí mostro l’exemple que apareix al manual (que es pot accedir amb la comanda: man find), escrit en multilínia per fer-lo més entenidor (recordo també que per canviar de línia a la shell abans de pitjar la tecla retorn o enter cal acabar la línia amb un espai i una barra invertida \):

    find / \
    \( -perm -4000 -fprintf /root/suid.txt %#m %u %p\n \) , \
    \( -size +100M -fprintf /root/big.txt %-10s %p\n \)
    

    Recorre el sistema una única vegada, llistant fitxers i directoris amb setuid al fitxer /root/suid.txt i fitxers grans (majors de 100 MB) al fitxer /root/big.txt.

    Un exemple més fàcil d’entendre:

    find . \
    \( -name '*.php' -exec echo "Trobat fitxer PHP:" {} \; \) , \
    \( -name '*.exe' -exec rm -f {} \; -exec echo "Eliminat fitxer .exe:" {} \; \) , \
    \( -name '*.txt' -exec ls -l {} \; \)
    

    Al primer patró busquem els fitxers el nom dels quals acabi amb ‘.php’ i mostrem una frase per la sortida estàndard, al segon eliminem fitxers ‘.exe’ i informem de l’acció, i al tercer llistem informació de fitxers ‘.txt’ en un format llarg.

    Podeu veure que a més a més es poden executar vàries comandes per cada patró de cerca. En el segon patró, executem dues comandes amb l’opció -exec: la primera per eliminar els fitxers trobats i la segona per informar què hem fet.

    Bon profit.

    GD Star Rating
    loading...

  • Error javascript provocat pel plugin Ozh’ Admin Drop Down Menu de WordPress

    No sé si hi ha alguna incompatibilitat entre els plugins RB Internal Linker i Ozh’ Admin Drop Down Menu de WordPress, però ahir vaig actualitzar el primer a la versió 2.0.11 i ara està fallant. El problema l’he detectat amb Firebug (quina eina més meravellosa!), que mostrava el següent error de javascript:

    syntax error
    var oam_toomanypluygins = ;\n

    He cercat directament al directori de plugins quin fitxer contenia aquest nom de variable, des d’una connexió ssh al servidor, així:

    egrep -r oam_toomanypluygins *

    Han sortit tres resultats. El problema es troba al fitxer ozh-admin-drop-down-menu/inc/core.php, a la funció en llenguatge PHP wp_ozh_adminmenu_js().
    A la línia:

    $toomanyplugins = $wp_ozh_adminmenu['too_many_plugins'];

    veiem que la variable PHP $toomanyplugins és assignada i més endavant inserida directament entre codi javascript. Ràpidament ens podem adonar que si la variable és buida s’introduïrà un error al codi javascript perquè faltarà algun valor entre els caràcters = i ;

    var oam_toomanypluygins = ;

    Per resoldre-ho, després de la línia PHP anteriorment esmentada he afegit:

    if (empty($toomanyplugins)) {
        $defaults = wp_ozh_adminmenu_defaults();
        $toomanyplugins = $defaults['too_many_plugins'];
    }
    

    D’aquesta manera comprovem si la variable és buida i li donem el valor per defecte abans d’inserir-la entre codi javascript.

    Resolt! 🙂

    Actualització (01-03-2010): a vegades les coses serveixen per més persones, per això és bo compartir. El desenvolupador del plugin m’ha contestat:

    Hello Jaume
    Nice catch, thanks for this! I’ve updated the plugin to deal with this case
    Cheers,
    Ozh

    GD Star Rating
    loading...

  • Fi de la Drupal Camp Barcelona 2010

    logo drupal camp spain barcelona 2010

    Aquest migdia ha acabat la Drupal Camp Barcelona 2010. Després de les sis ponències que vaig escoltar ahir, avui he decidit assistir a les següents:

    La que més m’ha agradat avui ha estat la primera, d’en Daniel Primo Gorgoso.

    GD Star Rating
    loading...

  • Drupal Camp Barcelona 2010

    Ahir va començar la Drupal Camp Barcelona 2010, el major esdeveniment anual organitzat per i pels amants de Drupal a Espanya. Jo vaig ser dels tres primers en inscriure’m-hi i ahir ja em vaig perdre el primer dia per culpa de passar hores al metge. Però avui, malgrat anar enguixat i amb crosses, sí que assistiré a totes les ponències que pugui. Som-hi!!

    Actualitzo (27-02-2010): finalment he assistit a totes les ponències de la sala auditori, la gran. Han estat:

    La tercera és la que més m’ha agradat, realitzada per César Martin, sobretot pel seu dinamisme i la quantitat d’exemples que ha comentat.

    GD Star Rating
    loading...

  • Lesionat del turmell dret. Una setmana després

    Avui fa una setmana que vaig anar al metge per la lesió del turmell dret que vaig patir mentre jugava a futbol amb l’equip de la nova feina a l’empresa Grupo Intercom. Per aquells que no ho sapigueu, el dia 1 de febrer vaig entrar a treballar amb ells com a responsable tècnic del projecte unAplauso.com, un classificat d’artistes.

    Altra vegada he estat hores i hores esperant. Primer he anat al meu CAP on m’han tret l’embenatge compressiu i tots hem vist que el peu semblava una botifarra; la inflamació no ha disminuït, sinó que s’ha mogut del turmell cap al peu, el qual està molt més inflamat que abans. Per tant m’han enviat al carrer València com l’altre dia i allà m’han fet una nova radiografia. L’han comparada amb l’anterior i ho han confirmat: hi ha trencament 🙁

    L’informe del passat dia 19 de febrer deia:

    Procés actual
    En la noche de ayer presentó entorsis de tobillo derecho mientras jugaba al futbol. Posteriormente dolor, edema e impotencia funcional de IED.

    Exploració clínica
    Importante edema a nivel de tobillo derecho con hematoma a nivel submaleolar externo. Dolor a la palpación de ligamento anterior, y maléolo externo. Limitación dolorosa de los movimientos. No inestabilidad de la articulación. Fuerza y sensibilidad conservadas. Pulsos distales presentes.

    Exploracions complementàries
    Rx (radiografia) tobillo: pequeña imagen que podría corresponder a mínimo arrancamiento a nivel de maléolo tibial. Importante edema circundante. No fracturas.

    I el d’avui conclou:

    Procés actual
    Paciente con una entorsis del tobillo derecho hace una semana con una imagen compatible con arrancamiento en el maléolo tibial tratado con un vendaje compresivo.

    Exploració clínica
    Paciente con tobillo muy tumefacto y pie también con equimosis en el pie en los dedos y por debajo del maléolo tibial, no dolor en el pie, dolor en el tobillo tanto en el maléolo peroneal como tibial.

    Exploracions complementàries
    Rx: imagen de arrancamiento en el maléolo tibial y en el astrágalo.

    Conclusions
    od arrancamiento de maléolo tibial y en el astrágalo izquierdo.

    Vaja, que estic fotut. Estaré enguixat durant 5 setmanes 🙁

    GD Star Rating
    loading...

  • Dos discs durs comprats alhora amb errors

    Quan semblava que la setmana havia anat malament i havia acabat el divendres amb un atropellament i embenat del turmell de la cama dreta, encara podia anar pitjor. Ja ho diu l’amic l’enemic Murphy: “Si alguna cosa pot sortir malament, sortirà malament”. I com vaig llegir al llibre de les lleis de Murphy: “si alguna cosa va malament, anirà pitjor”.

    El cas és que el dissabte, em disposava a fer feina a l’ordinador de casa, quan de sobte vaig començar a notar problemes d’accés a disc, i un sorollet sospitós. Després de comprovar que no podia escriure a la partició de dades, vaig reiniciar la màquina i van aparèixer els errors al syslog…


  • Lesionat del turmell dret

    Aquesta setmana sembla que m’hauria d’haver quedat a casa. A l’endemà de l’atropellament que vaig patir mentre anava en bicicleta a jugar un partit amistós de futbol sala, tenia un altre partit de futbol, però de futbol 7 i amb l’equip de la feina Grupo Intercom. Anàvem guanyant 1-3  però ens van remuntar i es van posar per davant per la mínima. Al darrer minut del partit, en una ocasió manifesta de gol, vaig xutar amb la cama esquerra al mateix moment que algú de l’altre equip en un intent desesperat d’evitar el gol em va fer una dura entrada al turmell dret, sobre el qual jo recolzava tot el pes del cos. Me’l va tòrcer completament i vaig quedar a terra regirant-me de dolor. Entre dos em van carregar fins a la banda, i l’àrbitre va fer continuar el partit, sense xiular falta!!! Al·lucinant! Mentre intentava descordar-me la bota es va acabar el partit; derrota per 3-4 i lesionat 🙁

    Lesió al turmell 2010
    Lesió al turmell dret, febrer 2010

    En treure’m la bota i la mitja, es va veure el meu turmell ja ben inflat. Em van portar a coll i be fins al vestidor perquè no podia tocar amb el peu a terra. Afortunadament em van portar fins a casa i abans de tractar-me vaig fer unes fotos (que podeu veure fent clic sobre la imatge). Em vaig posar gel durant una hora ben bona i pomada; es van fer més de la una de la nit. En llevar-me al matí següent havia baixat un xic la inflamació, però seguia amb el turmell gros. Per tant vaig anar al metge, i aquí va començar l’odissea!! Sobre les 10 vaig sortir de casa, caminant lentíssim, coixejant per evitant recolzar el peu dret. Vaig pujar al bus i fins al CAP. Allà em va mirar una infermera, que em va derivar a la cua pel metge d’urgències. Hi havia gent queixant-se que portava més de dues hores esperant 😕 Finalment em va tocar a mi, ja a la una, i després d’examinar-me em va dir que anés a fer-me unes “plaques” (radiografies). Resulta que no tenen aparells per fer-ho allà i vaig haver d’anar (coixejant) fins a l’hospital de Maternitat que hi ha al darrere, a uns 400 metres. Van trigar a fer-me-les i en tornar a la doctora del CAP amb les radiografies aquesta ja no hi era, quan m’havia dit que “aniria mirant si em veia, que no calia que fes cua de nou”. Eren més de les dues i no hi havia ningú per allà, ni metges. Vaig preguntar i em van dir que esperés fins les 15h! Genial, i sense dinar, amb allò super inflat i a esperar… A les 15:02 em visita un metge i em diu que el lligament ha estirat del peroné i ha arrencat un trosset d’aquest os. Ell creu que m’haurien d’enguixar i com que allà tampoc ho fan m’envia al carrer València. Perfecte, 4 hores després, sense dinar i sense que m’hagin fet res (a part de radiografies i la seva avaluació) ara he d’anar a un altre lloc… Sort que ja havia trucat al meu pare perquè em vingués a buscar amb un entrepà.

    Arribem allà, ens fan esperar més estona encara i per fi em criden. Una doctora que semblava novella em fa una avaluació (la quarta del dia) i ja es nota que dubta. Marxa a mirar les radiografies i torna amb una altra doctora, aquesta molt professional. M’explica que el lligament ha estirat de l’os, com si treus un tac d’una paret i salta la pintura o un tros de paret més gros. Decideix que amb aquesta inflamació millor em faran un embenat compressiu i en una setmana ja es veurà si cal enguixar o no. Em punxen a la panxa per fer la sang més líquida i evitar coagualacions, em recepten aquest medicament i dos més i ja podem marxar. Ja són les sis de la tarda!!!

    Quina odissea de dia, mare meva!! He faltat a la feina per fer la jornada laboral als centres mèdics… que divertit. Sort que he tingut el cub de Rubik amb mi i m’he distret bastant 😛

    GD Star Rating
    loading...