• Category Archives Programari
  • Instal·lació de xdebug per PHP i Apache2 a Ubuntu

    Un dels principals defectes de la majoria de programadors de PHP és oblidar-se de les eines de depuració (debugger). Tots hem estat en feines on no disposaven d’aquestes eines a la nostra màquina, o no permetien la seva instal·lació, o senzillament no hem pensat en posar-les.

    Jo vaig començar el meu primer contacte amb la programació amb el llenguatge c. Llavors a la universitat ens feien usar el programa Microsoft Visual Studio, amb el qual podíem compilar i depurar (debug). La depuració ens permetia seguir el programa pas a pas i saber el valor de cada variable en cada moment, i corregir així errors existents que s’escapaven a simple vista i que no eren de sintaxi.

    En passar a PHP, penso que és més difícil entendre com funciona la depuració, pel fet de tenir el navegador per un costat i l’entorn integrat de desenvolupament (o IDE de l’acrònim en anglès) per un altre. Tanmateix, cal instal·lar prèviament alguna cosa al servidor per poder-li indicar des del nostre IDE l’ordre d’aturar-se a la línia de codi que nosaltres vulguem. Per aquest conjunt de factors la majoria de programadors prescindeixen del depurador com a tal i utilitzen el mètode de prova i error, i miren el valor de les variables enviant el seu valor directament al navegador. Les tres funcions de PHP més utilitzades per fer això són: echo, print_r i var_dump.

    Jo he passat força temps utilitzant-les també, però quan tornes a la depuració t’adones que abans estaves perdent el temps. Amb aquest rudimentari mètode, si no coneixes molt bé el codi, primer has de trobar el punt on està la variable que vols observar, teclejar el codi que mostri el seu valor i executar la consulta de la pàgina des del navegador. Molt bé, ja has vist el seu contingut, però com ha estat calculat? Com s’ha arribat fins aquí, a través de quins fitxers, mètodes o funcions? La majoria de vegades has de tornar a escriure més codi per mostrar altres variables, perquè l’anterior no t’ha servit de massa, i tornar a actualitzar el navegador. A més a més, després cal eliminar tot aquest codi extra que has creat només per mirar el valor d’algunes de les variables. I quantes vegades passa -a mi també- que acaba pujant a producció codi amb aquestes sentències de “depuració”?

    Per evitar tot això, el millor és usar un depurador de veritat. Encara que al principi perdem una mica de temps per configurar-lo i aprendre com funciona, després ens estalviarà molt temps i mal de caps. Jo per desenvolupar en PHP i MySQL utilitzo el servidor web Apache2 sobre Ubuntu; una solució LAMP vaja. I com a IDE l’Eclipse amb el PDT (PHP Development Tools) i alguns altres plugins.

    Amb els següents passos podreu instal·lar xdebug amb l’Apache2 i PHP:

    sudo apt-get install php5-xdebug

    Això ha instal·lat el paquet corresponent i ha creat el fitxer /etc/php5/conf.d/xdebug.ini amb aquest contingut:

    zend_extension=/usr/lib/php5/20090626+lfs/xdebug.so

    Si ara comprovem el resultat de cridar a phpinfo(), veurem:

    This program makes use of the Zend Scripting Language Engine:
    Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
        with Xdebug v2.0.5, Copyright (c) 2002-2008, by Derick Rethans

    Al mateix fitxer xdebug.ini hem d’afegir aquestes línies:

    xdebug.remote_enable=on
    xdebug.remote_handler=dbgp
    xdebug.remote_mode=req
    xdebug.remote_host=localhost
    xdebug.remote_port=9000
    

    I ja per acabar, carreguem els canvis de configuració a l’Apache:

    sudo /etc/init.d/apache2 reload

    En un altre capítol escriuré com configurar l’Eclipse per depurar des d’allà.

    Gràcies Derick pel fantàstic xdebug!

    GD Star Rating
    loading...

  • Instal·lació de Kubuntu 9.04 i actualització a Kubuntu 10.04 LTS

    El sistema operatiu que he estat utilitzant des que va sortir a l’octubre del 2009 és el Kubuntu 9.10 (Karmic Koala) i volia actualitzar a la versió 10.04 LTS (Lucid Lynx) de finals d’abril d’enguany. Aquesta nova versió té la característica de ser LTS (Long Term Suport), la qual cosa vol dir que ens asseguren suport oficial i actualitzacions pel nostre sistema durant 3 anys en l’entorn d’escriptori i 5 en el de servidors.

    He de dir que la versió que estava usant tampoc era una instal·lació neta o des de zero, sinó una altra actualització de la versió anterior, la qual alhora era una altra de més anterior encara, la Kubuntu 8.10 (Intrepid Ibex) que vaig instal·lar el 30 d’octubre del 2008.

    Aquesta vegada però, l’actualització va fallar. S’havien actualitzat només alguns (molt pocs) paquets, però al fitxer /etc/issue ja indicava que tenia la versió nova Ubuntu 10.04. Podia reiniciar l’ordinador i funcionava com abans, però en fer l’actualització del gruix de paquets es va produir l’error:

    E: Internal Error, Could not perform immediate configuration on ‘util-linux’. Please see man 5 apt.conf.

    El problema és que l’Apt vol instal·lar el paquet util-linux, el qual forma part del paquet upstart-job, però sembla que l’apt no ho sap. Després d’intentar vàries vegades el apt-get upgrade i el dpkg-reconfigure -a, continuava tenint el sistema de paquets trencat. Com s’havia tocat el paquet del grub2 i el MBR del disc dur, en reiniciar ja no va tornar a funcionar.

    Així doncs, vaig agafar el CD de la versió més recent de Kubuntu que tinc (la 9.04), disposat a fer una instal·lació neta. Per tant primer havia d’instal·lar-la, després passar a la 9.10 i finalment a la 10.04. Aquí teniu els passos seguits:

    sudo apt-get update
    sudo apt-get upgrade

    225 actualitzats, 0 nous a instal·lar, 0 a suprimir i 12 no actualitzats.
    Es necessita obtenir 244MB d’arxius.
    Després d’aquesta operació s’empraran 1765kB d’espai en disc addicional.

    sudo apt-get dist-upgrade

    12 actualitzats, 5 nous a instal·lar, 0 a suprimir i 0 no actualitzats.
    Es necessita obtenir 35,9MB d’arxius.
    Després d’aquesta operació s’empraran 173MB d’espai en disc addicional.

    update-notifier-kde -u

    Se suprimiran 15 paquets. S’instal·laran 209 paquets nou. S’actualitzaran 757 paquets. Heu de baixar un total de 727 MB. La baixada trigarà aproximadament 30 minuts amb la vostra conexió. La baixada i l’actualització poden durar algunes hores, i no podreu cancel·lar aquesta última un cop hagi començat.

    sudo apt-get update
    sudo apt-get upgrade

    0 actualitzats, 0 nous a instal·lar, 0 a suprimir i 0 no actualitzats.

    sudo apt-get dist-upgrade

    0 actualitzats, 0 nous a instal·lar, 0 a suprimir i 0 no actualitzats.

    update-notifier-kde -u

    Se suprimiran 21 paquets. S’instal·laran 141 paquets nou. S’actualitzaran 996 paquets. Heu de baixar un total de 798 MB. La baixada trigarà aproximadament 34 minuts amb la vostra conexió. La baixada i l’actualització poden durar algunes hores, i no podreu cancel·lar aquesta última un cop hagi començat.

    I ja està, ara sí que disposo de la darrera versió de Kubuntu, la 10.04.

    “Només” he hagut de descarregar un total de 1805 MB  en paquets. 🙂

    GD Star Rating
    loading...

  • Com usar paquets d’una versió anterior d’Ubuntu

    En actualitzar (ahir) a Ubuntu 10.04 LTS Lucid Lynx, he passat de la versió de PHP 5.2.10.dfsg.1-2ubuntu6 a la 5.3.2-1ubuntu4. Si volem tornar a tenir la versió 5.2, hem de configurar l’APT per tal que usi aquells paquets que vulguem de les fonts de Karmic Koala. Així:

    Primer llistarem els paquets de php que tenim instal·lats:

    dpkg -l | egrep php

    En el meu cas són:

    • php5-common
    • libapache2-mod-php5
    • php-pear
    • php5-cli
    • php5-curl
    • php5-dev
    • php5-mysql
    • php5-memcache
    • php5-suhosin

    Dupliquem el fitxer amb les fonts de programari canviant la paraula lucid per karmic:

    sed s/lucid/karmic/g /etc/apt/sources.list | sudo tee /etc/apt/sources.list.d/karmic.list

    Creem un nou fitxer de preferències que anomenem per exemple “php”:

    sudo nano /etc/apt/preferences.d/php

    I copiem aquestes tres línies per cada paquet dels llistats anteriorment, tot canviant el nom del paquet:

    Package: php5-common
    Pin: release a=karmic
    Pin-Priority: 991
    ...
    

    Un cop ho hem configurat tot, actualitzem els paquets:

    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get dist-upgrade
    

    No ens oblidem de reiniciar el servidor web; per l’Apache:

    sudo apache2ctl restart
    GD Star Rating
    loading...

  • Com trobar els UUIDs de les particions a Ubuntu

    El UUID, o Universally Unique Identifier en anglès, és un identificador estàndard usat en la construcció de programari, estandaritzat per la Open Software Foundation (OSF), amb l’objectiu de permetre que sistemes distrubuïts identifiquin informació de forma única sense dependre de coordinació central.

    A Ubuntu i a d’altres distribucions de GNU/Linux basades en Debian, es poden obtenir aquests identificadors per a cadascuna de les nostres particions amb una comanda ben simple:

    blkid

    Que haurem d’executar com a superusuari (root) o amb sudo al davant. La sortida d’aquesta serà semblant a:

    /dev/sda1: UUID="8a866472-a077-4da9-9663-cd5a2774f801" TYPE="reiserfs"
    /dev/sdb1: UUID="af8e31aa-9bb3-4c5e-b13a-433b06bb2231" TYPE="reiserfs"
    /dev/sdc1: UUID="c027fa2e-ad9d-4324-bdad-941a5c43d2b3" TYPE="reiserfs"
    /dev/sdc2: UUID="a9dbb0c9-3c60-4083-8f4c-de7e69d0ffda" TYPE="swap"
    /dev/sdc5: UUID="8be8352b-e28e-44ee-a2e2-9abfa1eb43eb" TYPE="reiserfs"
    

    Informació que ens pot resultar útil per configurar el fitxer /etc/fstab, amb les regles i opcions per muntar les diferents particions que tinguem.

    GD Star Rating
    loading...

  • Mini benchmark de reiserfs

    Després d’haver recuperat totes les dades dels dos discos durs, i d’haver comprovat que el disc important no té errors de maquinari, l’he formatat. He creat el sistema de fitxers reiserfs amb:

    cfdisk /dev/sda1 #crear la partició de forma interactiva
    mkreiserfs /dev/sda1 #formatejar amb reiserfs

    He passat totes les dades d’un disc dur (de la marca Seagate) a un altre (Western Digital), tots dos SATA i de 500 GB. Primer he mirat la quantitat de dades que havia de passar, en kibibytes (KiB) i en gibibytes (GiB):

    minterior@jau:/media/recuperat$ du -sc
    309201518       .
    309201518       total
    minterior@jau:/media/recuperat$ du -sch
    295G    .
    295G    total

    Podem comprovar l’equivalència: 309201518 KiB / 1024 / 1024 = 294,877546 GiB ≈ 295 GiB

    La còpia l’he feta des del terminal, anteposant la comanda time a la comanda cp -rp per obtenir el temps de duració de la còpia, que ha estat:

    15.63user 2163.99system 1:54:07elapsed 31%CPU (0avgtext+0avgdata 0maxresident)k
    618162424inputs+617982328outputs (1major+347minor)pagefaults 0swaps

    Quasi dues hores. Per tant ha estat 6847 segons (1*3600 + 54*60 + 7) per escriure 316.622.354.432 bytes (309201518 * 1024), el que és una velocitat de:

    46242493.71 bytes/s ≈ 46,2425 MB/s = 44,1003 MiB/s

    GD Star Rating
    loading...

  • Comprovar sectors danyats d’un disc dur amb badblocks

    Un cop recuperades les dades dels discs durs que tenien problemes, volia comprovar si aquests tenien sectors danyats. Ho he fet amb l’eina de Linux badblocks. Es pot executar de forma destructiva o no-destructiva, i jo he triat la primera perquè no tenia dades al disc que hagués de conservar. Per tant he executat:

    badblocks -wvs -o badblocks-sda.log /dev/sda

    Les opcions triades volen dir:

    -w    test de lectura i escriptura DESTRUCTIU.
    -v    mostra més informació
    -s    mostra el progrés
    -o    fitxer on escriure la llista de blocs defectuosos
    

    Si observeu la comanda, no he indicat cap partició sinó tot el disc sencer (/dev/sda), la qual cosa combinada amb l’opció -w implica que el MBR, particions existents i dades, seran destruïts.

    Si no voleu perdre cap dada del disc i fer també el test de lectura i escriptura canvieu l’opció -w per -n. Si no en poseu cap de les dues el test serà de només lectura. Per a més informació i opcions recordeu mirar el manual escrivint al terminal:

    man badblocks

    En el meu cas, després d’esperar unes quantes hores, vaig tenir sort i cap sector del disc dur estava danyat. 🙂

    Sort! 😉

    GD Star Rating
    loading...

  • GNU ddrescue per recuperar dades de discs durs

    L’altre dia (uf, ja fa un mes d’això!) vaig explicar la mala sort que vaig tenir quan dos discs durs tenien errors dels tres que tinc al meu ordinador. Abans d’ahir vaig començar les tasques de recuperació de dades, amb el programa GNU ddrescue. Al mateix manual en línia de ddrescue hi ha exemples molt útils, el primer dels quals és el que necessito jo. Anem per feina.

    Recordo que l’objectiu és recuperar les dades de dos discos idèntics de 500 GB a un tercer disc auxiliar de la mateixa capacitat, que em va deixar un bon amic meu. És obvi que l’auxiliar ha de ser de la mateixa capacitat o major que el disc que volem recuperar. Primer ho intentaré amb un disc i després amb l’altre. El paràmetre de ddrescue -n o –no-split no intenta dividir o reintentar blocs fallits, i això faig a la primera passada:

    root@jau:~# ddrescue -n /dev/sda /dev/sdb ddrescue-sda-a-sdb.log
    
    Press Ctrl-C to interrupt
    Initial status (read from logfile)
    rescued:         0 B,  errsize:       0 B,  errors:       0
    Current status
    rescued:   500107 MB,  errsize:    143 kB,  current rate:    10265 B/s
    ipos:       29744 kB,   errors:      36,    average rate:   14150 kB/s
    opos:       29744 kB,     time from last successful read:       0 s
    Finished

    El procés ha trigat unes 10 hores. Cosa que podem comprovar a partir de les dades informatives anteriors:
    500107 MB / 14,150 MB/s / 3600 s/h ≈ 9,8 hores.

    Tot seguit executo ddrescue amb les opcions -d–direct , que usa accés directe al disc d’entrada, i -r o –max-retries=<n>, que surt després de n intents. Li passo el mateix nom de fitxer de log que a la comanda anterior i així ddrescue sap que només ha de buscar els sectors on ha tingut problemes durant la primera lectura:
    Continue reading  Post ID 343

    GD Star Rating
    loading...

  • Afegir una nova adreça d’email al parell de claus GPG

    Segons llegeixo al manual oficial de GNU Privacy Guard: http://www.gnupg.org/gph/en/manual.html#AEN282, primer entrem a l’editor de claus amb la comanda gpg –edit-key i tot seguit teclegem adduid. Responem a les preguntes pel nou identificador, introduïm la contrasenya per la nostra clau privada i llest.

    gpg --edit-key minterior@gmail.com
    Ordre>adduid
    Nom i cognoms: Jaume Casado Ruiz
    Adreça electrònica: jcasado@unaplauso.com
    Comentari: unAplauso.com
    Heu triat l'identificador d'usuari:
        "Jaume Casado Ruiz (unAplauso.com) <jcasado@unaplauso.com>"
    
    Canvia (N)om, (C)omentari, (E)mail o (O) d'acord / (X) ix O
    
    You need a passphrase to unlock the secret key for
    user: "Jaume Casado Ruiz (minterior) <minterior@gmail.com>"
    1024-bit DSA key, ID F71B3570, created 2009-07-28
    
    pub  1024D/F71B3570  created: 2009-07-28  expires: mai       usage: SCA
                         trust: desconeguda   validity: desconeguda
    sub  2048g/68D20780  created: 2009-07-28  expires: mai       usage: E
    [ unknown] (1)  Jaume Casado Ruiz (minterior) <minterior@gmail.com>
    [ unknown] (2). Jaume Casado Ruiz (unAplauso.com) <jcasado@unaplauso.com>
    
    Ordre>quit
    Save changes? (y/N) y
    

    Si després volem enviar la nova informació a un servidor de claus, per exemple a pgp.mit.edu:

    gpg --keyserver 'pgp.mit.edu' --send-keys 0x5600e9c7f71b3570
    

    La clau la podem expressar amb el seu finger print, com he fet jo, o amb el seu ID. Per obtenir el finger print:

    gpg --fingerprint
    
    GD Star Rating
    loading...

  • 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...