Archive for the 'Programación' Category

Lighttpd + php5 + MySQL en Ubuntu Jaunty

Me dispongo a abordar un par de proyectos la mar de jugosos en mi nuevo y flamante Ubuntu. En uno de ellos es probable que pueda conseguir algún dinerete extra; el otro es a título personal, puramente por satisfacer mi ego personal y mantener vivo mi entusiasmo. Así que con toda la motivación y fuerza que tal situación suele imbuir en un programador, por muy malo que sea (y yo no soy de los peores), me dispongo a preparar el requerido servidor.

Para el caso he elegido tirar de Lighttpd como servidor web y MySQL como gestor de bases de datos. Motivos: Lighttpd es mucho más ligero y rápido que otros servidores más conocidos, como Apache, consumiendo menos recursos en el proceso. Así que, sin desmerecer en absoluto la potencia de éste último, me ha hecho tilín y he decidido probarlo. Sé que hay otras alternativas igual o más ligeras, como es el caso de Cherokee, proyectado por un español, que además dispone de su propio panel de configuración web. Pero, y puesto que soy un tipo algo puñetero con según qué cosas, no me convence que Álvaro López, su autor, un tipo que está sentando referente a nivel internacional y que, no me cabe duda, es un tío estupendo y la leche de profesional, no se digne a reservar un espacio a la lengua de Cervantes ni en la web oficial del proyecto ni en su blog personal. Conste que Cherokee me parece estupendo y he tenido oportunidad de usarlo y disfrutar de sus bondades (que no son pocas), pero prefiero quedarme en Lighttpd por ahora.

Y el motivo por el que escojo MySQL, aun habiendo sido adquirido últimamente por Sun, que a su vez fue comprada por Oracle, principal competidor de éste gestor, es porque es el sistema que siempre he usado y no me ha dado demasiados problemas. Además no es tan pesado como PostgreSQL y estoy bastante acostumbrado a trabajar con él.

Bueno, al tajo que se nos va el hilo. Antes de empezar aclarar que todo lo que haremos será en modo comando, desde consola, ayudándonos de aptitude y tecleando cada cosa en su momento. Pero los noveles no os preocupéis que es muy sencillo y hay que tocar lo justo.

A continuación los pasos a dar para instalar y configurar ambos servidores con soporte para php5:

1) Instalar los servidores (web y bases de datos) junto con el intérprete cgi para php5 y el módulo de soporte para MySQL.

$ sudo aptitude install lighttpd php5-cgi mysql-server php5-mysql

A lo largo del proceso el programa de instalación de MySQL os pedirá que defináis la contraseña para el administrador del gestor de bases de datos. Ojo que también se define como “root”, el superusuario de Linux, pero es diferente.

2) Incluir la carga del módulo para FastCGI de PHP dentro de Lighttpd.

$ sudo gedit /etc/lighttpd/lighttpd.conf

y agregar tras el último módulo activado una línea que diga “mod_fastcgi”, de manera que quede algo así:

server.modules = (
     "mod_access",
     "mod_alias",
     "mod_accesslog",
     "mod_compress",
     "mod_fastcgi",
     # "mod_rewrite",
     # "mod_redirect",
     # "mod_evhost",
     # "mod_usertrack",
     # "mod_rrdtool",
     # "mod_webdav",
     # "mod_expire",
     # "mod_flv_streaming",
     # "mod_evasive"
)

3) Activar el módulo para FastCGI.

$ sudo ln -s /etc/lighttpd/conf-available/10-fastcgi.conf /etc/lighttpd/conf-enabled/

4) Iniciar/Reiniciar el servidor.

$ sudo /etc/init.d/lighttpd restart

Y ya está listo vuestro servidor web Lighttpd con soporte para PHP5 y MySQL.

Sólo un apunte más: las páginas se sirven por defecto desde /var/www, que es propiedad del superusuario del sistema, o sea, root. Así que tendremos problemas de permisos si pretendemos trabajar en modo usuario accediendo a dicho directorio. Para evitar esto, y facilitarnos la vida un poco, podemos crearnos una carpeta personal en nuestro home y configurar el servidor para que sirva desde ahí.

En mi caso me he creado una carpeta en mi home llamada www ($ mkdir www). Para configurarla en el servidor:

$ sudo gedit /etc/lighttpd/lighttpd.conf

y en la directiva server.document-root establecemos la ruta hacia dicha carpeta, de manera que quede tal que así:

server.document-root = "/home/USUARIO/www/"

Ejemplo: si el usuario es Epicentro :D

server.document-root = "/home/epicentro/www/"

¿Cómo colocar mi feed en wordpress.com?

Ese es el problema que he conseguido resolver tras hacer algunas pruebas infructuosas con los enlaces. El problema en sí no era mostrar el vínculo de alimentación RSS, que ya lo había colocado entre los enlaces, si no el hacerlo con la imagen característica de sindicación que se puede ver en cualquier blog junto al vínculo.

Lo que voy a explicar podéis encontrarlo rápidamente en las FAQ de wordpress.com y no tiene mucho misterio, pero a mí me gusta toquetear antes por mi cuenta por si aprendo algo:

1.- Dirigíos al panel de Widgets que tenéis en el apartado de Presentación dentro de vuestro Dashboard y agregad un bloque de Texto haciendo drag-and-drop (arrastrar y soltar).

2.- Pulsad una vez en el recuadro de configuración (las líneas azules) del bloque de texto que acabáis de insertar. Se abrirá una nueva ventana.

3.- En la nueva ventana que se acaba de abrir tenéis que indicar los siguientes datos:

Primer bloque: Un texto descriptivo para la cabecera. En mi caso tengo esto:

Sindicación RSS

Segundo bloque: Código (X)HTML para construir vuestro feed. Podéis indicar varios si los separáis con un retorno de carro <br />. Si os habéis fijado yo tengo dos: uno para el feed principal y otro para el de los comentarios.

<a href="https://theseismo.wordpress.com/feed"><img src="http://faq.files.wordpress.com/2006/11/e14.png" /> Suscríbete a mi feed</a>
<br />
<a href="https://theseismo.wordpress.com/comments/feed"><img src="http://faq.files.wordpress.com/2006/11/e14.png" /> Suscríbete a mis comentarios</a>

Las imágenes características de las que hablo podéis sacarlas del FAQ. Veréis que las hay en multitud de colores, no sólo en el omnipresente naranja.

Libros sobre programación y diseño

Suelo comprar pocos libros relacionados con la informática. Sí, ya sé, muy mal, pero lo cierto es que siempre que he tenido alguna duda programando o la necesidad de aprender algo interesante he encontrado una rápida solución en la Red. Sencillamente está todo, no siempre bien presentado ni explicado pero hay información importante y suficiente para salir del paso sin invertir mucho tiempo y dinero.

Pero tengo la sensación, y supongo que otros tantos que seguís este esquema de aprendizaje coincidiréis, de que soy un cutre y no trabajo de una forma profesional o mínimamente parecida a como lo hace un programador experto, a pesar de que los resultados son muy satisfactorios. Quien me conoce bien sabe que soy un tipo bastante quisquilloso con los detalles, un perfeccionista, y como tal el hecho de hacer algo que podría no ser válido me pone de los nervios. Así que últimamente me estoy interesando en algunos libros que quizá me permitan normalizar la tarea y sentirme mejor trabajando o incluso ahorrar algo de tiempo. Partiendo de mi nivel en PHP y CSS que sería medio-alto (un 4 en una escala de 1 a 5) consideraría útiles los siguientes libros:

Guía práctica de diseño digital, editorial Parramón (256 páginas) => 30,40 €
Fundamentos del diseño creativo, editorial Parramón (176 páginas) => 25,65 €
CSS: the definitive guide 3rd edition, editorial O’Reilly (536 páginas) => 29,66 €
Professional web 2.0 programming, editorial Wrox Press (522 páginas) => 26,37 €
Programming PHP 2nd edition, editorial O’Reilly (540 páginas) => 26,37 €
Ajax: the definitive guide, editorial O’Reilly (656 páginas) => 38,78 €

Y en la recámara me guardo otros tres de O’Reilly que no sé si necesito pero que quizá termine comprando:

Learning PHP 5, editorial O’Reilly (368 páginas) => 15,69 €
PHP cookbook, editorial O’Reilly (810 páginas) => 29,66 €
Javascript: the definitive guide 5th edition, editorial O’Reilly (1018 páginas) => 32,96 €

Bookmarklet traductor es-en

Me encuentro vía Icebeat con un útil bookmarklet para traducir texto español-inglés inglés-español de forma rápida. Es un sencillo javascript que hay que incrustar en nuestros favoritos para poder utilizarlo.

El contenido del vínculo que debéis crear en vuestros favoritos debe ser el siguiente:

javascript:if(window.getSelection()==%22%22){t=prompt('Traducir:','');}else{t=window.getSelection();}if(t!=null&&t!=%22%22){f=document.createElement('form');f.action="http://translate.google.com/translate_t";f.method="post";f.target="_blank";q=document.createElement('input');q.name="text";q.type="hidden";l=document.createElement('input');l.name="langpair";l.type="hidden";q.value=t;l.value=(window.getSelection()==%22%22)?"es|en":"en|es";f.appendChild(q);f.appendChild(l);document.getElementsByTagName("body")[0].appendChild(f);f.submit();}else{exit();}

Para que el bokmarklet funcione correctamente debéis pegar el código de manera que quede todo en una sola línea, eliminando los espacios y los saltos de línea. Siento no poder ofrecerlo tal y como debería quedaros porque el diseño actual del blog no me lo permite, pero no es complicado depurarlo. Y para ello podéis echar mano de herramientas de compresión.

Como podéis ver utiliza el motor de Google, aunque ahorra el tiempo que perdemos en ir hasta el traductor desde su web. Para traducir un texto al inglés hay que abrir la ventana que se despliega al pinchar sobre el vínculo, escribir el texto y pulsar “Aceptar”, y a la inversa, para traducir algo del inglés al español hay que marcar con el cursor el texto a traducir en la página que nos encontremos y pulsar sobre el bookmarklet.

Fuente: http://icebeat.bitacoras.com/post/247/bookmarklet-traductor

Trabajando con sockets en php

La mayoría de las veces picaremos código en php para acceder a una base de datos, hacer una consulta y construir una salida html. Esto es lo fundamental que todo programador php debería saber. Pero por otro lado también hay que conocer cómo trabaja php con los sockets, y digo esto porque me lo han preguntado hoy en una breve tanda de preguntas para un puesto en una empresa de mi ciudad y no he dado la talla. Desde luego sabía lo que era un socket y para qué se usan, la teoría básica, pero nunca había practicado con ellos bajo php. Así que si alguna vez os hacen esta pregunta agradeceréis haber perdido dos minutos en leer este articulillo ;)

Antes de nada, ¿qué es un socket?. Bueno, el término de socket se engloba en el ámbito de las redes de comunicación y se podría definir como una librería TCP/IP cuya función es controlar el tráfico de paquetes entre dos nodos interconectados. A groso modo se puede interpretar como un canal a través del cual se comunican dos computadoras. Cada vez que nos conectamos a nuestro servidor de correo, chateamos con nuestra novia o navegamos por la web nuestro ordenador abre uno o más sockets a través de los cuales envía y recibe información.

Sockets hay de varios tipos (de flujo, de datagrama, puros…) aunque no voy a profundizar en esto ahora porque me eternizaría. Para más información podéis ver la Guía Beej de Programación en Redes.

Y ¿puede php trabajar con sockets?. Pues sí, a tamaños altares llega su magnificencia ^_^ Quien haya trabajado alguna vez con php o alguno de sus frameworks de desarrollo habrá comprobado que php permite hacer cosas realmente potentes, entre ellas conectarse a un servidor de correo y comunicarse con él.

Vale vale, ¿y cómo abro una conexión desde php para leer mi correo?. Evidentemente con un par de funciones la mar de sencillas: fsockopen(), fclose(), fgets() y fputs(). Sabiendo un poco de inglés se puede intuír qué hace cada una de ellas: fsockopen abre el socket y fclose lo cierra mientras que con fgets y fputs podemos sacar o pasar datos respectivamente. Para abrir el socket necesitaremos una ip o un nombre (si disponemos de servicio DNS) así como un puerto de conexión que dependerá del protocolo con el que queramos trabajar: 80 para HTTP, 25 para SMTP…

En la práctica, para comunicarnos con nuestro servidor de correo (target.com), sería algo tal que así:

1.- ABRIMOS EL SOCKET CON EL SERVIDOR/MÁQUINA REMOTA:

$objetivo = "target.com";
$puerto = "25";
$conexion = fsockopen($objetivo,$puerto);
if (!$conexion) {
     echo "Connection failed!. Cannot open socket.\\n";
     exit();
} else {
     echo "Connection accepted!. Socket opened successfully.\\n";
     $str_data = fgets($conexion,1024);
     print_r($str_data); //Mostramos la salida del servidor
}

2.- ENVIAMOS EL SALUDO EHLO AL SERVER:

$str_saludo = "EHLO target.com\\r\\n";
if(!fputs($conexion,$str_saludo)) {
     echo "EHLO refused by server.\\n";
     exit();
} else { //Si lo acepta podemos continuar trabajando por aquí
     echo "EHLO accepted by server.\\n";
     $str_data = fgets($conexion,1024);
     print_r($str_data); //Mostramos la salida del servidor
}

3.- UNA VEZ HAYAMOS OPERADO CON EL SERVIDOR CERRAMOS LA CONEXIÓN:

if(!fputs($conexion,"QUIT\\r\\n")) {
     echo "Disconnection failed!. Cannot say QUIT to server.\\n";
     exit();
} else {
     fclose($conexion);
     echo "End of connection to server.\\n";
     exit();
}

Como véis no hay que hacer gran cosa. Es bastante sencillo abrir, comunicar y cerrar un socket. La mayor complicación reside en saber cómo se comunica un determinado protocolo, qué comandos acepta y qué estructura debemos seguir a la hora de manipularlo.

En el ejemplo, justo después de enviar el saludo, podríamos haber usado cualquier comando SMTP para por ejemplo enviar un correo a una cuenta a través del servidor target.com, a saber:

MAIL FROM: correo@dominio //Para especificar el correo de origen
RCPT TO: correo@dominio //Para especificar el correo de destino
DATA\r\n Mensaje \r\n.\r\n //Para el cuerpo del mensaje

CocoaMySQL SÍ es compatible con MAMP

Y digo esto porque la tendencia es a pensar que la versión del servidor MySQL que incorpora MAMP (v1.5b1) es tan actual que no está soportada por CocoaMySQL (v0.5) cuando lo cierto es que es MAMP quien no reconoce la inserción de old-passwords necesaria por CocoaMySQL para trabajar. ¿El resultado? pues que la única forma de comunicarnos con MySQL es a través del engorroso panel de phpMyAdmin que incorpora la interfaz de administración de MAMP, y que al intentar enchufarle CocoaMySQL nos devuelva un error de que ha sido imposible conectar con el servidor con la cuenta indicada.

Pero tranquilos porque se le puede indicar que sí lo haga modificando un poquito el script de inicio de MySQL. Para ello:

1.- Abrir el archivo Applications/MAMP/bin/startMysql.sh con un editor de textos.

2.- Insertar –old-passwords detrás de la definición del socket de forma que quede tal que así:

# /bin/sh/Applications/MAMP/Library/bin/mysqld_safe --port=3306
--socket=/Applications/MAMP/tmp/mysql/mysql.sock --old-passwords
--lower_case_table_names=0
--pid-file=/Applications/MAMP/tmp/mysql/mysql.pid
--log-error=/Applications/MAMP/logs/mysql_error_log &

3.- Reiniciar los servidores desde el panel de MAMP.

4.- Ejecutar la siguiente query SQL en la ventana de consultas de phpMyAdmin para restablecer la contraseña de root de forma que sea compatible con old-passwords:

SET PASSWORD FOR 'root'@'localhost' = OLD_PASSWORD('root');

Y listo, ya podemos conectarnos a nuestro servidor mySQL MAMP desde CocoaMySQL indicando los parámetros:

Host: localhost
Socket: /Applications/MAMP/tmp/mysql/mysql.sock
User: root
Password: root

Otros aspectos de conexión pueden consultarse en el panel de administración de MAMP.

Fuente: http://forum.mamp.info/viewtopic.php?p=517#517


Mi del.icio.us

agosto 2017
L M X J V S D
« May    
 123456
78910111213
14151617181920
21222324252627
28293031  

Archivador