Posts Tagged ‘PHP’

sshfs muntar una carpeta a través de ssh

divendres, febrer 3rd, 2012

En Linux muntar una carpeta de servidor per Samba i treballar-hi amb projectes de PHP, suposa alguns problemes.

En primer lloc és molt lent i nombrosos programes perden molta estona, minuts, en recuperar els arxius d’un directori.

Després no està gens recomanat per a Subversion.

A part hi ha problemes de permisos entre usuaris de Linux, i sovint problemes amb la data i hora dels arxius al repositori Samba.

I suposa greus problemes si unim Samba + SVN + PhpStorm.

Aquests problemes desapareixen si enlloc de Samba utilitzem sshfs, que és una utilitat que ens permet muntar carpetes al nostre sistema d’arxius, tenint simplement un usuari ssh.

Jo tinc m’he fet un petit script o guió, que em munta una carpeta cada cop que el crido:

#!/bin/sh
usuari_devel=carles
sshfs $usuari_devel@devel.servidor.codic.cat:/home/OFICINES/$usuari_devel /home/$usuari_devel/devel

Per a instal·lar-lo:

sudo apt-get install sshfs

Gràcies Xavier Vidal.

Li vaig trobar un problema, que és quan poses l’ordinador en modus de suspensió (sleep/suspend), ja que després no pots accedir a la carpeta, ni desmuntar, ni tornar a muntar-la amb sshfs.

L’he pogut solucionar fent:

fusermount -u $mountpoint_devel

tot just abans de suspendre l’ordinador.
En tornar-lo a iniciar després, caldrà obrir una connexió ssh cap al servidor manualment (ssh elmeuservidor), i després podem tornar a llençar sshfs per a muntar la carpeta.

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

PHP: Afegir arrays

dijous, gener 19th, 2012

Suposem que tenim un array amb codis postals.

Pe:

$st_codis_postals = array('08021' => 'Barcelona',

25520 => 'El Point de Suert (Lleida)',

17452 => 'Massanes (Girona)',

// I així successivament

);

Llavors volem afegir una entrada en la primera posició, ja que una plantilla d’Smarty utilitzarà l’array per a mostrar un combo.

Si afegim la clau 0, el que tindríem és:

‘08021’ => ‘Barcelona’,

25520 => ‘El Pont de Suert (Lleida)’,

17452 => ‘Massanes (Girona)’,

0 => ‘Triï la població’

Però les funcions que podem utilitzar per a fer un merge entre arrays o fer a afegir a la primera posició provoquen una reordenació de les claus numèriques.

Per tant no les podem fer servir, i fer servir un bucle per a això és exagerat i ineficient.

La solució, bastant simple, és fer:

$st_array_definitiva = array(0 => ‘Triï la població’) + $st_codis_postals;

Això farà la feina.

Només heu de vigilar de no tenir claus repetides ja que + afegeix les claus que no estan repetides.

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

Debuguejar codi PHP de servidor

dijous, desembre 29th, 2011

A partir de PHP 5.3 tenim una funció molt pràctica que ens permet debuguejar, especialment al costat servidor.

Es tracta de register_tick_function.

Aquesta funcionalitat ens permetrà fer una crida a tick_handler, cada interval especificat per el número de ticks, i d’aquesta manera podrem tracejar en quin moment peten els programes més difícils de debuguejar o que casquen perquè falla nginx, un altre component o llibreria o perquè s’omple la memòria.

declare(ticks=1);

// Una funció que es crida a cada esdeveniment tick
function tick_handler()
{
    $st_traces_de_debug = debug_backtrace();

    // FileUtils és una classe meva per a treballar en arxius
    // En aquest cas enregistrarem l'arxiu i el número de línia que s'ha executat correctament
    FileUtils::setMessageLog($st_traces_de_debug[1]['file'] . ' ' .$st_traces_de_debug[1]['line']);
}

register_tick_function('tick_handler');

Si us va millor enlloc d’usar un mètode com al meu exemple_ setMessageLog de la classe FileUtils, podeu fer servir una funció disponible al mateix codi com en aquest exemple:

function escriu_a_arxiu_log($s_cadena = '/* res a escriure */', $s_file = '/tmp/carles-debug.log')
{
    $s_datahora = date("Y-m-d h:i:s");

    $o_fh = fopen($s_file, 'a') or die("no puc obrir l'arxiu");
    fwrite($o_fh, $s_datahora.' '.$s_cadena."\n");
    fclose($o_fh);
}

// Per a invocar la funció
escriu_a_arxiu_log('Test');

D’aquesta manera anem enregistrant totes les comandes que s’executen correctament.

Agraïments: Edu.

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

Facebook allibera Hip Hop PHP Virtual Machine per a duplicar el rendiment de PHP

dimecres, desembre 14th, 2011

Facebook ha desenvolupat un producte anomenat Hip Hop PHP Virtual Machine, que permet duplicar el rendiment del seu codi PHP.

D’aquesta manera els mateixos servidors han pogut doblar en rendiment dels servidors.

Si tens milers de servidors, això comporta un estalvi milionari en servidors i electricitat.

A més a més han alliberat el seu producte com a Programari Lliure (Open Source)

Nota de Facebook.

Vist a Ars Technica.

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

Una curiositat de PHP floatval

diumenge, agost 7th, 2011

De vegades PHP té comportaments d’allò més emprenyadors, per no dir erronis.

Avui podeu provar aquest codi que retorna un resultat que em sembla molt divertit.

<?php
/*
* @author Carles
* @website http://codic.cat
* */

$s_valor_comu='10.10 raons';
$s_valor_divertit='-';

$i_valor_comu=floatval($s_valor_comu); 
$i_valor_divertit=floatval($s_valor_divertit); 

echo "Partint de $s_valor_comu el valor que us espereu és $i_valor_comu\n"; 
echo "Partint de $s_valor_divertit el valor que no us espereu és $i_valor_divertit\n"; 

Quan executeu el codi veureu que us retorna -0.

-0 pot semblar un valor no gaire perillós però pot fer que falli el vostre codi en diversos punts.

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

Folles matemàtiques

dilluns, maig 16th, 2011

Ara fa uns dies em va venir un dubte al cap.

Havia de calcular la intersecció d’uns rectangles, que podien superposar-se o no, i podien trobar-se a qualsevol punt de les coordinades x y z.

Vaig començar a preparar els algoritmes i els càlculs matemàtics i de seguida em vaig adonar que podia tenir coordinades als valors negatius.

I un dubte em va assaltar.

Suposant que el rectangle 1 és parcialment dins del rectangle 2, si calculava el fragment del vòrtex x en comú fent:

$i_espai_comu_eix_x = $i_rectangle1_x_fi - $i_rectangle2_x_inici;

En aquest cas el rectangle 1 és el negre i el rectangle 2 el vermell.

Em vaig adonar que el final de l’eix x del polígon 1 podia acabar a la posició -2 per exemple, i el principi de l’eix x del polígon 2 podia començar a la posició -4, així que em trobaria amb que l’espai comú seria el resultat de fer:

-2 – (-4)

I això em va fer ballar el cap.

Si a tres pomes li en restes una te’n queden dues.

Però com li restes, li sostraus, -4 a -2.

En aquells moments estava una mica espès. Havia treballat moltes hores i dormit poc.

Vaig comentar-li a un amic, i tampoc sabia com enfocar-ho.

Així que us plantejo aquest divertiment matemàtic.

Hi podeu pensar una mica i a continuació us n’explico la solució.

Davant el dubte un ordinador ens dóna el resultat:

<?php
    $i_valor=-2;
    $i_valor2=-4;

    $i_resultat=$i_valor-$i_valor2;$i_resultat2=$i_valor+$i_valor2;

    echo "El resultat del misteri $i_valor - $i_valor2 és: $i_resultat\n";
    echo "El resultat sumant $i_valor + $i_valor2 és: $i_resultat2\n";

Jo he anomenat aquest arxiu follesmatematiques.php així que el podeu executar amb:

php -f follesmatematiques.php

El resultat que us donarà és que -2 – (-4) = 2 o si feu -4 -(-2) = -2

I ara us explico diferents possibilitats per a comprendre la solució.

Si tenim -4 vol dir que tenim 4 vegades el valor -1, així que si li restem -2, és a dir 2 vegades -1, només ens queden 2 -1, o sigui -2.

Una altra possibilitat és descompondre-ho matemàticament:

-4 – (-2) = (-1*4) – (-1*2) = -1 * (4-2) = -2

Una altra possibilitat és pensar en el compte bancari: Si a un compte corrent li han aplicat un càrrec de -2 euros, i el banc l’anul·la per que ha estat un error, és a dir resta o sostreu els -2 euros, vol dir que els hi sumarà. O sigui que si tenim – (-2) és com si tinguéssim +2.

Un divertiment per a qui us agradi fer ballar el cap amb problemes i preguntar-vos sobre l’origen (que no el “PORQUÉ”) de les coses.

Adreça curta Twitter: http://wp.me/pzeab-1Pw

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

Alliberat Zend Framework 1.11.6 i 1.10.9

dissabte, maig 7th, 2011

Noves versions del Framework Zend foren alliberades el proppassat 5 de Maig.

Aquestes versions inclouen la solució de 60 errors.

Zend Framework és el Framework PHP dels creadors de PHP, i és molt emprat a Internet.

Entre molts productes, el programari de comerç electrònic Magento, es basa en Zend Framework.

Veure anunci oficial.

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

Alliberat PHP 5.3.6

Dimarts, març 22nd, 2011

El proppassat dia 17 s’alliberà PHP 5.3.6, que soluciona més de 70 errors (bugs).

Podeu veure l’anunci oficial a:

http://www.php.net/index.php#id2011-03-17-1

Adreça curta Twitter: http://wp.me/pzeab-1NO

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

Curs de programació en PHP – segona part

dissabte, febrer 19th, 2011

La primera part de l’article és aquí.

Programar és donar les instruccions a l’ordinador sobre què ha de fer i com s’ha de comportar.
Ha de tenir en compte tots els possibles escenaris i totes les possibilitat: controlar les accions de l’usuari com si prem una tecla, com coses que passen al sistema, com ara que no s’hagi acabat l’espai en disc abans d’escriure-hi un arxiu.
Això vol dir que el programador o la programadora haurà d’estar en tot i haurà de pensar en totes les possibilitats. Altrament en algun moment alguna cosa fallarà.
Els ordinadors no saben respondre a coses per a les que no els hem preparat, només per al que prèviament hem programat.

Com és un programa?

Un programa clàssic és un seguit d’instruccions seqüencials, és a dir seguides, com en un llibre, amb iteracions o bucles (per exemple quan el Bart Simpson escriu a la pissarra 100 vegades: no hackejaré la web de l’escola, un programa el que faria és: repeteix 100 vegades: escriu “no hackejaré la web de l’escola”) i condicionals (si passa això fes allò, si no fes això altre).

Un programa és molt similar a un llibre només que a aquells llibres que es van posar de moda quan jo era un bailet que es deien escull la teva pròpia aventura i en que tu podies triar: si esculls enfrontar-te als lladres i salvar a la noia passa a la plana 100, si escull avisar la policia a la 127).

La nostra feina és redactar el llibre (el programa) per a que després el lector (l’usuari) experimenti l’aventura (el programa).

Ara ja t’has instal·lat el WAMP o per separat el servidor web Apache, el PHP i el MySQL, la qüestió és que tens el servidor Web llest per a executar programes PHP.

Si no heu indicat a WAMP que s’iniciï quan arrenqui windows, llavors l’haureu d’executar manualment des del menú de programes.

Llavors us apareixerà una icona a la barra lateral dreta de windows (tray bar), al costat de l’hora. Des d’allí podreu parar, o reiniciar alguns serveis.

Reiniciar el servidor web Apache serà necessari quan canviem un paràmetre de configuració per a que Apache carregui la nova configuració i s’adoni dels canvis.

WAMP 2.1 incorpora el següent programari:

– Apache 2.2.17
– Php 5.3.3
– Mysql 5.1.53 (la versió de 64 bits)
– Mysql 5.5.8 (la versió de 32 bits)
– PhpMyadmin 3.2.0.1
– SQLBuddy 1.3.2

Ara és un bon moment per a explicar com funciona el procés de demanar una plana web a un servidor web.

Les planes web que visitem diàriament, són allotjades en servidors.

Quan nosaltres escrivim al nostre navegador una url, per exemple: http://www.php.net el navegador primer ha de descobrir quina és l’adreça ip d’aquesta plana, és a dir, saber quin servidor li entregarà aquesta plana.

Podem saber quina adreça ip hi ha darrera de www.php.net obrint una finestra ms-dos (a windows) o una finestra de terminal (a Linux i Mac Os X) i teclejant:

ping www.php.net

El número 69.147.83.197 és l’adreça ip.

L’adreça ip és un número únic, i quan un ordinador es vol comunicar amb una adreça ip, tot d’aparells (enrutadors o routers en anglès) des del router ADSL que tenim a casa, fins al que tenen al lloc on és el servidor, saben com fer arribar la informació al servidor, i de tornada cap al nostre ordinador.

Un cop el navegador sap que l’adreça de php.net és 69.147.83.197, llavors s’hi connecta, i demana la plana web que volem.

Hi ha uns servidors que fan la traducció (resolució) del nom www.php.net a adreça ip. Aquests servidors es diuen servidors DNS.

Però una cosa important que us vull comentar és que abans de fer la consulta als servidors DNS l’ordinador mira a un fitxer especial, per si de cas nosaltres volem especificar manualment que un nom d’adreça es resolgui amb una adreça ip concreta.

Això ens serà molt útil més endavant quan programem.

Aquest arxiu es diu hosts. I es troba a les següents rutes:

En el cas de Linux i unix POSIX:

/etc/hosts

En el cas de Mac Os X (10.2 i superiors):

/private/etc/hosts

En el cas de windows l’arxiu es diu:

C:\Windows\system32\drivers\etc\hosts

És important saber que hi ha un nom especial que es diu localhost.

L’adreça localhost es resol com Ip 127.0.0.1

És molt important saber que 127.0.0.1 és una adreça ip especial, que sempre apunta al nostre propi ordinador.

Així si ens connectem des del navegador a http://localhost o http://127.0.0.1 ambdues accions el que faran és demanar una plana al servidor web Apache que tenim instal·lat al nostre ordinador.

En el cas del meu arxiu /etc/hosts tinc definit localhost com 127.0.0.1 i una entrada addicional que es diu dev.codic.cat també a la 127.0.0.1. D'aquesta manera desenvolupo sobre el bloc en local i jo accedeixo amb el navegador posant dev.codic.cat que seguint el que diu l'arxiu hosts resol 127.0.0.1 i per tant va al meu ordinador.

Escriure http://localhost i http://localhost/ té el mateix resultat ja que si no diem res, la plana per defecte que es demana és /

Normalment si es demana la plana / el servidor web envia l’arxiu index.html o index.htm o index.php o default.asp en el cas de servidor IIS de microsoft.

En tot cas això es pot canviar als arxius de configuració d’Apache o IIS (servidor web de microsoft).

 

Us ensenyo a programar en Web perquè la majoria de vegades que programem en PHP ho farem per a Web, i actualment quasi totes les feines són per a Web.

Les planes web no deixen de ser arxius, com llibres, i els navegadors web les interpreten i pinten les coses que li diem que pintin.

Per exemple obriu l’editor de textes, l’eclipse, o qualsevol programa amb el que volgueu programar i copieu aquest codi:

<html>
<head>
<title>La nostra primera plana Web</title>
</head>
<body>
Hola, aquesta és la primera plana web!.<br />
Això és <b>negreta</b>.<br />
Això és <font color="#ff2222">vermell</font>.<br />
Això és un <a href="http://www.codic.cat">hipervincle a Codi Ç</a>.
</body>
</html>

Com podeu observar si executeu plana.html és a dir, si feu funcionar aquest arxiu (això es fa fent doble clic sobre l’arxiu o dient-li al navegador que obri l’arxiu)

veureu que tenim una plana web amb el títol: La nostra primera plana web i on apareix el text que hi ha dins de <body>…</body>, que després de <br /> es genera un salt a la linia següent, que el que hi ha dins de <b>…</b> surt en negreta, i que el que hi ha entre <a href=”http://www.codic.cat”>….</a> és un enllaç cap a http://www.codic.cat
<font color=”#ff2222″>…</font> el que fa és que el text que hi ha entre <font…> i </font> estigui en el color ff2222 que vol dir: intensitat de vermell FF, intensitat de verd 22 i intensitat de blau 22. Aquests són valors exadecimals, bàsicament vol dir que hi haurà a tope de vermell, i una miqueta verd i una miqueta de blau.

Els espais que hi ha que fan que les comandes comencin més cap a la dreta són per a facilitar la lectura del codi, i el fet de programar amb aquests espais es diu indentar.
Quan obrim un bloc, el codi que va dins del bloc l’indentem i així es veu de manera molt clara què forma part del bloc.
La feina d’aprendre HTML l’haureu de fer vosaltres, però és quelcom molt més fàcil que aprendre a programar en PHP.

De tota manera aquí hi ha uns quants exemples amb els que aprendreu HTML a tota velocitat.

Ara anem introduir PHP dins la plana web que hem generat.
Editem l’arxiu plana.html i el deixem així:

<html>
    <head>
        <title>La nostra segona plana Web</title>
    </head>
<body>
        Hola, aquesta és la primera plana web!.
<?php

/* Definim els colors */

$st_conjunt_de_colors = array("vermell"--> "#ff2222",
                              "blau" => "#2222ff",
                              "verd" => "#22ff22",
                              "negre" => "#000000",
                              "gris" => "#777777");

?>
        Això és <strong>negreta</strong>.<br />
<?php
/* Comença el bucle */
foreach($st_conjunt_de_colors as $s_clau-->$s_valor_del_color){
    echo "Això és <span style=\"color: #00de00;\">$s_clau</span>.<br />";
}
?>
Això és un hipervincle a Codi Ç.
</html>
</body>
</html>

Quantes coses noves en unes poques línies!!.
El que hi ha entre /* i */ és un comentari de PHP (remark en anglès).
Serveix per a fer anotacions nostres i PHP ho ignora.

La linia que comença per $st_conjunt_de_colors = array és el que anomenem un array o una matriu.
Un array és una llista que té una correspondència de clau i de valor associat a la clau.
El valor d’una clau pot ser un altre array.

Una de les grans potències que té PHP és la gran quantitat de funcions d’arrais que porta de sèrie.

El que estem definint són claus amb el nom dels colors, i els associem el valor el seu color, i després fem un bucle que recorre l’array i imprimim en format html la clau com a text visible i el valor associat com a color dins del tag d’html font.

La gràcia del PHP és que es pot barrejar amb el codi html i pot generar codi html, i així és capaç de retornar planes dinàmiques. El resultat final és el que s’envia al navegador que veuen les persones que naveguen per la nostra web.

Bé, tornant al nostre exemple, no funcionarà. No funcionarà perquè cal que anomenem l’extensió de .html a .php i que la executi el servidor web.

Això s’aconsegueix posant l’arxiu a la carpeta del nostre servidor web apache.

Si empres WAMP per a windows la ruta per defecte és C:\wamp\bin\http i per a Linux la ruta per defecta (documentRoot) per als arxius que serveix apache és: /var/www

Per a instal·lar apache en Linux feu:

sudo apt-get install apache2

Adreça curta Twitter: http://wp.me/pzeab-1Lp

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

PHP: smarty : solució html_select_date encoding utf-8

divendres, gener 28th, 2011

El sistema de plantilles (templates) smarty ofereix la possibilitat de generar automàticament uns controls combo box per a seleccionar dates (dia, mes, anys).

Els mesos són mostrats en funció de la configuració d’idioma indicada al servidor.

Gener, Febrer, Març, Abril, Maig, Juny, Juliol, Agost, Setembre, Octubre, Novembre, Desembre

Com podem comprovar Març conté un caràcter ce trencada ç.

Aquest caràcter, que també apareix en portuguès,  es mostrarà com un caràcter estrany en el combo de selecció.

Passarà el mateix amb qualsevol idioma que contingui algun caràcter no estàndard en el nom del mes.

Per a solucionar-ho forçarem el tipus de codificació (encoding) com a UTF-8.

Això ho farem dient:

{html_select_date|utf_8_encoding

display_days=false

display_years=false

...

}

Enlloc del simple

{html_select_date
Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

Programari alliberat

divendres, gener 14th, 2011

Ahir va ser alliberat MyDebugger versió 1.2.1.1583. Aquest genial debugger per a MySql, incorpora novetats com preparar l’entorn per a la stored procedure o funció que volem testejar.

Descarregar-lo de: www.mydebugger.com

El proppassat 6 de Gener d’enguany foren alliberades les versions de PHP 5.3.5 i la 5.2.17. Amdues solucionen diversos errors, un d’ells molt greu que afecta als processos PHP de 32 bits.

Aquest codi d’exemple, fa que peti.

Veure notes de la versió: http://www.php.net/index.php#id2011-01-06-1

A principis de gener també fou alliberada la versió 4.7.5 de midnight commander, que és una utilitat per a Linux clon de les norton utilities per a  msdos però amb molres més millores.

Aquesta darrera versió incorpora moltes novetats, a més de solucionar uns quants bugs.

Per a instal·lar-lo, si no el tenim ja, hem de fer:

sudo add-apt-repository ppa:nilarimogard/webupd8
sudo apt-get update
sudo apt-get install mc

Via: WebUpd8

La versió de Linux 2.6.37 fou alliberada la primera setmana de gener i presenta moltes millores:
– millora de rendiment per a múltiples processadors (SMP)
– més controladors de programari
– gestió millorada de la memòria
– més velocitat en les operacions d’entrada i sortida (Input/Output)

Via: Desktop Linux

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

Curs de programació en PHP

diumenge, gener 2nd, 2011

Aquest és un petit curs per a aprendre a programar des de 0.

No tothom és capaç d’estructurar la ment i les idees i ser capaç de crear programes, però amb aquest petit curs podràs descobrir si t’agrada i n’ets capaç.

Dedico aquest curs a la Eli i a la Yazmina, dues persones amb moltes ganes d’aprendre i voluntat i capaces.

Introducció: Posant nom a les coses

Què vol dir programar?. De seguida hi arribarem, però primer hem de comprendre coses com què són els ordinadors.

Molt simplificat els ordinadors són uns ginys, que mitjançant uns valors d’entrada, proporcionen uns resultat. Per exemple, enviant-los 1+1 proporcionen un resultat de 2.

Els ordinadors realment funcionen amb impulsos elèctrics, que es transformen en uns i zeros. Si els voltatges són positius representen un 1, en cas contrari un 0.

Imaginem-nos un gran magatzem.

Hi ha una sèrie d’entrades de càrrega i descàrrega que poden ser portes d’entrada (càrrega), de sortida (descàrrega) o d’entrada i sortida (input/output dirien en anglès).

Dins d’aquest gran magatzem hi ha un operari, que seguint instruccions d’un paper, agafa els paquets que li donen per les portes d’entrada, els manipula i els desa als prestatges del magatzem o bé els retorna per una porta de sortida.

Aquest operari és el cervell de l’ordinador o CPU (Central Processing Unit). Les prestatgeries equivaldrien a la memòria. I les portes d’entrada/sortida del magatzem a les portes d’entrada/sortida de l’ordinador (els ports USB són ports d’entrada sortida, el port VGA on connectem el monitor és un port de sortida, etc…)

Com més ràpid és el processador, més feina pot fer per segon. La velocitat dels ordinadors la mesurem en Megahertzos o avui en dia en Gigahertzos.

Les instruccions s’executen als ordinadors marcades per un tic de rellotge de quartz, que són molt i molt precisos, una mica s’executen seguint el ritme dels tambors de les galeres, cada cop de tambor (clic de rellotge), una instrucció.

El prefix Mega vol dir 1.000 i Giga 1.000.000, i un hertz és una oscil·lació o tick del rellotge per segon, per tant un Gigahertz són un milió d’operacions per segon.

Un ordinador a 2 Ghz hauria de ser més ràpid que un a 1 Ghz. Però no sempre és així. Els nous models fan les operacions cada cop més ràpid, i una ordre que pot tarda 5 clics de rellotge en un ordinador més antic, pot trigar un sol clic de rellotge en un ordinador modern. Per tant ens podem trobar que un ordinador modern a 1 Ghz sigui més ràpid que un ordinador més antic a 2 Ghz.

Per últim, un ordinador amb dual core, seria com dir que al magatzem hi treballen dos operaris independents, per tant, un sol paquet el recullen, el processen i l’entreguen a la mateixa velocitat, però si hi ha més d’un paquet, els dos operaris despatxen dos paquets en el mateix temps que un ordinador amb un sol nucli o core en processen un.

Els ordinadors només fan el que prèviament els hem dit. Els operaris segueixen les instruccions per a manegar els paquets amb una llista d’ordres, i aquesta llista d’ordres és el que anomenem un programa.

Programar és dir-li a l’ordinador què ha de fer mitjançant un llistat d’instruccions que anomenem programes.

Nivells en programació

Les instruccions que segueix l’operari de la fàbrica (el processador) no són com les nostres.

L’operari no entén “recull la caixa i deixa-la a la taula”. L’operari de l’exemple entén instruccions més senzilles com ara:

– Dóna una passa endavant

– Fira 90 graus a la dreta

– Hi ha algun objecte davant?

I encadenades com:

1. Dóna una passa endavant

2. Hi ha algun objecte davant?

3. Si hi ha un objecte recull l’bjecte

4. Si no hi ha un objecte torna al pas 1

En això consisteix la feina del programador. En crear programes, o sia llista d’ordres, per a que l’ordinador (l’operari) faci el que volem.

Per això els programadors han de tenir en compte tots els possibles problemes.

Per a programar utilitzem llenguatges de programació.

Els llenguatges de programació són similars als llenguatges que parlem els humans en diferents països: n’hi ha de diferents amb diferents estructures gramaticals.

Depenent de si el llenguatge que emprem és més similar al que entén l’ordinador (passa, passa, hi ha alguna cosa?, passa, agafa, gira 180 graus, passa, passa, hi ha la taula? desa a la taula…) o més similar al que entenem els humans (porta la caixa a la taula) parlem de llenguatges de baix nivell, nivell mig o alt nivell.

Els llenguatges de baix nivell són els que se semblen molt al que entén la màquina.

Els d’alt nivell són els que se semblen molt al que parlem els humans.

En principi en un llenguatge d’alt nivell no sabem ben bé què fa la màquina per sota, mentre que en un llenguatge de baix nivell controlem tots el que fan els seus components.

Un exemples més real de programació en codi màquina, que és el de més baix nivell seria:

ETIQUETA_INICI:
	push	ax
	push	bx
	push	dx
	xor	ax,ax
	mov	dx,TIMER1_CNT
	in	al,dx
	or	al,al
	jnz	ETIQUETA_ES0
	xor	ax,ax
	out	dx,ax
	mov	dx,TIMER0_CNT
ETIQUETA_ES0:
	mov	bx,ax
	mov	ax,_dt_ymppr
	sub	ax,bx

L’objectiu d’aquest codi és veure que no enteneu res.

Si enteneu aquest codi deixeu de llegir que vindré jo a que em doneu classes si és que la Nasa no us contracta i us deixa una estoneta lliure.

El més interessant és la línia que diu jnz ETIQUETA_ES0. jnz és una de les instruccions bàsiques que mira si la última operació matemàtica ha retornat 0, (jnz significa jump if not 0, és a dir, salta a la etiqueta si no és 0).

Respireu, sé que és complicat. L’objectiu no és comprendre aquest codi si no veure la diferència entre baix nivell i alt nivell.

En un llenguatge de baix nivell tenim cura i treballem amb totes les peces internes de l’ordinador.

Per exemple, unes petites memòries (ax, dx, cx, ex) que serveixen per a fer les operacions bàsiques com mov ax, dx que vol diu mou el valor que hi ha a la memòria dx a la memòria ax.

Com aquestes memòries tenen molt poca capacitat, 8 bytes en el cas de ax, cx, el que fa que només puguem tenir valors entre 0 i 255, hem de vigilar quan fem sumes, que no ens passem per tal no obtenir resultat erronis.

Programar en ensamblador o en altres llenguatges de baix nivell és complicat, és molt difícil controlar un error, i un programa per a un tipus d’ordinador no servirà per a un altre ordinador o un mòbil.

Per això avui en dia molt pocs programen en baix nivell, i queda reservat per a alguns enginyers que fan controladors (drivers) on la velocitat és crucial o bé no hi ha una altra manera de fer-ho que emprar certs components de la màquina.

La majoria de gent avui en dia programa en llenguatges d’alt nivell, on no t’has de preocupar de quines peces hi ha per sota.

Exemple de llenguatges d’alt nivell són: PHP, Java, microsoft .NET.

Un llenguatge de mig nivell (entre la màquina i els humans) és el C.

El llenguatge de baix nivell és l’ensamblador (el de mov ax, dx) que és el mes semblant al que parla la màquina (0 i 1 en realitat).

Compilar o interpretar

Precisament, perquè l’ordinador només entén 0 i 1, necessitem algun programa que transformi els nostres programes en que es poden llegir i entendre al llenguatge que entén la màquina, que s’anomena codi màquina o codi binari.

L’ordinador només entén uns – voltatge positiu o zeros.

Al principi els programadors programaven amb uns i zeros, però era òbviament molt difícil de mantenir programes d’aquesta manera.

Trobar errors i fer modificacions era una feina realment complicada.

Per això es van crear els compiladors.

Els compiladors agafen un programa fet en un llenguatge d’alt nivell, mig o baix, i el transformen en codi màquina, que és l’únic que l’ordinador finalment entén.

Però no tots els programes es compilen.

Hi ha uns llenguatges que es diuen interpretats. Això vol dir, que enlloc de compilador, hi ha un intèrpret que en temps real tradueix el llenguatge de programació a codi màquina.

Els llenguatges interpretats mai són tan ràpids com els que es compilen per aquest motiu, perquè l’intèrpret els tradueix sobre la marxa i ha de fer les traduccions del llenguatge a codi màquina.

Diem que interpreta el codi en temps real o on-the-fly (al vol).

PHP és un llenguatge interpretat. Això fa que certament no sigui tan ràpid com el codi en C compilat, però el fet de ser interpretat ofereix alguns avantatges com el fet que un codi en PHP funciona en un Linux, en un Windows, en un Mac, en un Solaris… simplement és qüestió de crear intèrprets per als ordinadors (o mòbils) que sigui i tots els programes escrits en PHP ja funcionaran.

Per exemple, parem atenció a aquest codi en PHP:

<?php
 echo 'Hola Catalunya!\n';
?>

Aquest codi imprimirà per pantalla el missatge Hola Catalunya en qualsevol ordinador amb PHP instal·lat en que l’executem.

No és genial?. :-)

A la imatge el fitxer hola.php executat en el meu Linux. En un ordinador amb windows produeix la mateixa resposta.

Els llenguatges interpretats també s’anomenen de vegades llenguatges de script (script és un guió en anglès).

Perquè PHP?

Per diversos motius.

PHP és un programari lliure, això vol dir que el podem utilitzar sense pagar res, és molt potent, ve preparat amb moltes llibreries per a fer moltes coses com connectar-se a bases de dades, comprimir en format zip, etc… i està orientat a treballar en web.

Facebook per posar un exemple, utilitza PHP, així com la majoria d’empreses líders d’Internet.

Segons la Wikipedia el 75% dels servidors Web d’Internet utilitzen PHP com a llenguatge de programació.

PHP s’integra amb els principals servidors web.

Per tant, per aprendre a programar en PHP necessitarem instal·lar en el nostre ordinador un servidor web, per exemple Apache, també i PHP.

Podem instal·lar un programa com ara Wamp, que inclou en un Apache, MySql, i PHP.

Per programar ens podem instal·lar un programa com Notepad++ que és gratuït i posa colors a les instruccions PHP. Hi ha altres IDE (entorns de desenvolupament) més potents, però ja ho anirem veient. Poc a poc.

De moment instal·lem Wamp i Notepad++.

Ho normal és que necessiteu la versió de 32 bits: http://www.wampserver.com/en/dl32.php

Adreça curta Twitter d’aquest article: http://wp.me/pzeab-1It

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

PHP: Conèixer les constants definides per l’usuari

dijous, novembre 25th, 2010

Si tenim un programa gran, on es defineixen moltes constants, ens pot interessar saber quines són.

Per a això executarem aquest codi:

$const = get_defined_constants(true);
print_r($const['user']);

Amb això aconseguirem totes les constants que han estat definides pel nostre programa, i no es mostraran les que incorpora PHP.

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

Localitzar errors a les Exception de PHP

dilluns, novembre 15th, 2010

Podeu debuguejar els errors dins del catch de les Exception:

throw new Exception("Exception a l'arxiu ".__FILE__.' línia '.__LINE__.', class '.__CLASS__.' funció '.__FUNCTION__.': '.$e->getMessage());

Si no programeu amb classes treieu la part de __CLASS__.

Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy

Truc: Actualitzar els collations de totes les taules d’una base de dades MySql

dissabte, maig 29th, 2010

Un dia em vaig trobar amb una base de dades MySql que tenia mal fixats els collations (transformacions per a tipus de caracters).

Canviar-ho camp per camp, taula per taula, representava una feina molt feixuga.

Vaig trobar aquesta eina gratuita, en PHP, pensada per a fer-la anar des del nostra servidor web que fa el fet:

phoca-changing-collation-tool

Des d’allí hi podeu descarregar un arxiu zip que conté el codi PHP pensat per a executar-lo des d’un servidor web.

Tot i això res no impediria pas de fer servir el mateix programa des de línia de comandes amb l’ intèrpret PHP amb unes petitones modificacions.

Assumint el seu ús mitjançant un servidor web, si teniu moltes taules haureu de canviar el màxim temps d’execució de PHP puix que la operació durà temps.

Un avantatge del codi obert és que pots saber exactament què fa i evitar sorpreses desagradables.

Us adjunto el codi php de la eina per si mai deixés d’estar disponible:

<?PHP
/*
* @tool	Phoca Changing Collation
* @Changing collation of database, tables and columns
* @Run this script only at your own risk. If you have a big database
* @you need to change the script execution time in your php
* @copyright (C) Jan Pavelka www.phoca.cz (http://www.phoca.cz)
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL
* @based on script from http://php.vrana.cz/ - Author - Jakub Vrana
* @license http://creativecommons.org/licenses/by/2.5/
* @Creative Commons Attribution 2.5 Generic
*/
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-gb" lang="en-gb">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="robots" content="index, follow" />
<meta name="keywords" content="phoca, server unzip" />
<meta name="description" content="Phoca Server Unzip tool" />
<meta name="generator" content="www.phoca.cz" />
<title>Phoca Server Unzip tool</title>
<style type="text/css">
    body {font-family: Arial, sans-serif; font-size: 10px; color: #000000 ;}
    h1 a {color:#006699;text-decoration:none;}
    #info {position: relative;float:right; top:10px; right:10px; text-align:right;margin-bottom:10px;}
    .error {font-weight:bold;color:#c10000}
    .warning {font-weight:bold;color:#ff8102}
    .success {font-weight:bold;color:#008040}
    .window {position:relative;top:10px;left:10px;width:95%;padding:5px;height:300px; overflow:auto;border:1px solid #000;background:#fbfbfb;clear:both;}
</style>
</head>
<body>
<div id="info">
    <img src="assets/phoca-logo.png" alt="Phoca" /><br />
    <a href="http://www.phoca.cz/">www.phoca.cz</a><br />
    <a href="http://www.phoca.cz/forum">www.phoca.cz/forum</a>
</div>
<h1><a href="index.php">Phoca Changing Collation tool</a></h1>
<?php
    function start_db($mysqlhost,$mysqldatabase, $mysqluser, $mysqlpass)
    {
        global $conn;
        $conn = mysql_connect($mysqlhost, $mysqluser, $mysqlpass);
        if (!$conn)
        {
           echo '<a href="index.php">Back to the main site</a><br />';
           die('Database error.');
        }
        $select = mysql_select_db($mysqldatabase, $conn);
        if (!$select)
        {
           echo '<a href="index.php" >Back to the main site</a><br />';
           die('Database error.');
        }
    }
    function end_db ($conn)
    {
        mysql_close($conn);
    }
if (   isset($_POST['host'])
    && isset($_POST['user'])
    && isset($_POST['pass'])
    && isset($_POST['name'])
    && isset($_POST['col']))
{
    $mysqlhost 		= $_POST['host'];
    $mysqluser 		= $_POST['user'];
    $mysqlpass 		= $_POST['pass'];
    $mysqldatabase 	= $_POST['name'];
    $collation 		= $_POST['col'];
    // Change the time -------------------------------------
    $changedMaxExecTime		= 0;
    $standardMaxExecTime 	= ini_get('max_execution_time');
    if ($standardMaxExecTime != 0  && $standardMaxExecTime < 120) {
        set_time_limit(120);
        $changedMaxExecTime	= 1;
    }
    // -----------------------------------------------------
    start_db($mysqlhost,$mysqldatabase, $mysqluser, $mysqlpass);
    //Start code from http://php.vrana.cz/ - Author - Jakub Vrana
    function mysql_convert($query) {
        echo '<div>' . $query . ' ... <span style="color:#26d92b;">OK</span></div>';
    return mysql_query($query);
    }
    echo '<div></div>';
    echo '<div>';
    mysql_convert("ALTER DATABASE $mysqldatabase COLLATE $collation");
    $result = mysql_query("SHOW TABLES");
    while ($row = mysql_fetch_row($result)) {
        mysql_convert("ALTER TABLE $row[0] COLLATE $collation");
        $result1 = mysql_query("SHOW COLUMNS FROM $row[0]");
        while ($row1 = mysql_fetch_assoc($result1)) {
            if (preg_match('~char|text|enum|set~', $row1["Type"])) {
                mysql_convert("ALTER TABLE $row[0] MODIFY $row1[Field] $row1[Type] CHARACTER SET binary");
                mysql_convert("ALTER TABLE $row[0] MODIFY $row1[Field] $row1[Type] COLLATE $collation" . ($row1["Null"] ? "" : " NOT NULL") . ($row1["Default"] && $row1["Default"] != "NULL" ? " DEFAULT '$row1[Default]'" : ""));
            }
        }
    }
    echo '</div>';
    mysql_free_result($result);
    //End code from http://php.vrana.cz/ - Author - Jakub Vrana
    end_db($conn);
    echo '<p>&nbsp;</p><a href="index.php">Back to the main page</a>';
    // Set back the time --------------------
    if ($changedMaxExecTime == 1) {
        set_time_limit($standardMaxExecTime);
    }
    // --------------------------------------
}
else
{
    ?>
    <h2>Change database collation (DATABASE, TABLES, COLUMNS)</h2>
    <form action="index.php" method="post">
    <table>
    <tr><td>Database Host</td><td><input type="text" name="host" value="localhost" /></td></tr>
    <tr><td>Database User</td><td><input type="text" name="user" value="username" /></td></tr>
    <tr><td>Database Password</td><td><input type="password" name="pass" value="password" /></td></tr>
    <tr><td>Database Name</td><td><input type="text" name="name" value="database name" /></td></tr>
    <tr><td>Database Collation</td><td><input type="text" name="col" value="utf8_general_ci" /></td></tr>
    <tr><td></td><td><input type="submit" value="Submit" /></td></tr>
    </table>
    </form>
    <?php
}
?>
</body>
</html>
Català-Catalunya English-USA Traduir a l'Anglès. Translate to English Compartir: La TafaneraIndependènciaCatosfera|FacebookTwitterFriend Feed|googleDeliciousDiggTechnoratiredditmixxyahoolivestumbleuponsimpy