Mostrando entradas con la etiqueta PHP. Mostrar todas las entradas
Mostrando entradas con la etiqueta PHP. Mostrar todas las entradas

viernes, 23 de noviembre de 2012

Como crear y usar sprites en páginas HTML


HTML 5
CSS 3
Reducir el tiempo de carga de una página web es importante ya que un tiempo excesivo puede hacer que parte de los usuarios se vayan antes de que cargue la página completa. Para reducir el tiempo de carga de una página web se pueden hacer varias cosas, entre ellas:
  • Reducir el peso de la página, por ejemplo, reduciendo el tamaño de las imágenes o haciendo el código html más simple.
  • Utilizar versiones minimizadas de frameworks javascript y css.
  • Combinar archivos de javascript y css. Para hacer menos peticiones.
  • Usar CDNs que sirvan los javascript de tal modo que el usuario no tenga que descargarlos si ya los tiene cacheados de otras peticiones o accesos a otras páginas.
  • Y la que es de interés en esta entrada, reducir número de peticiones también en los iconos usados en la página usando la técnica de crear sprites.
Los iconos suelen tener la característica de que suelen ser pequeños (de uno o 2 KiB) de forma que el mayor tiempo empleado para descargarlos no es la transferencia sino el tiempo empleado para realizar la petición y la latencia de la red. Es mejor combinar todos los iconos en una imagen grande y hacer una sola petición (aunque algunos no se usen) que hacer tantas peticiones como iconos diferentes tengamos. Es lo mismo aplicado cuando se combinan varios archivos javascript y css en uno solo para hacer menos peticiones al servidor pero aplicado a las imágenes.

Para hacer la combinación de las imágenes hay herramientas en internet que nos permiten realizalo de forma sencilla y rápida, como este Generador de Sprite CSS. El resultado que obtendremos de esta herramienta será una salida de CSS y una imagen con la combinación de todas las que queremos.

Una biblioteca de iconos muy usados son los iconos silk de la página fam fam fam pero estos iconos vienen separados cada uno en su propio archivo y la mayoría tiene un tamaño de medio KiB asi que usando un sprite podemos beneficiarnos de la ventajas usando esta técnica. Lo primero que haremos es obtener y poner en una carpeta los iconos que queramos tener en un sprite, posteriormente crearemos un archivo zip, luego usaremos la herramienta de sprites que queramos.

Parte del CSS que obtenemos es:

Y un trozo de la imagen del sprite es:
Posteriormente para usar el sprite el html de nuestra página sería, incluyendo el CSS que hemos obtenido y aplicando los estilos a una imagen que en el src tiene una imagen con un pixel transparente:

Si te ha resultado interesante esta entrada quizá te interese también como hacer hojas de estilo css pero con el lenguaje de less, mucho más legible y mantenible que con css directamente.

Referencia:
http://es.spritegen.website-performance.org/
http://www.famfamfam.com/

viernes, 22 de junio de 2012

Guía instalación Raspberry Pi con Arch Linux ARM (Parte II, programas)

Raspberry Pi
Nota: la última actualización de esta guía fue el 19-01-2013. Al ser Arch Linux una distribución rolling release puede que cuando la leas algunas cosas hayan cambiado aunque la mayoría seguirán siendo como esta escrito a continuación.

Después de la instalación base de Arch Linux ARM para la Raspberry Pi a partir de la Guía instalación Raspberry Pi con Arch Linux ARM (Parte I, instalación base) toca añadirle los programas que nos proporcionarán la funcionalidad que queramos. Desde luego la capacidad de la Raspberry es limitada y no podremos instalarle todo lo que deseemos, principalmente por la cantidad de memoria que tiene (256 MiB), por la velocidad de lectura desde la tarjeta SDHC que en determinados momentos es el mayor limitante notándose que se ahoga y porque el procesador no tiene la capacidad ni se puede comparar con un Intel o AMD de los que podemos encontrar estos días. Por ello, la Raspberry no será un sustituto de nuestro ordenador de escritorio o portátil aunque dicho esto hay ciertas tareas que puede cumplir a la perfección con capacidad más que suficiente.
Arch Linux ARM

Si necesitamos algo más potente podemos optar por una CuBox o una Pandaboard ES que ambas tienen 1 GiB de memoria y un procesador dual core algo más potente que el de la Raspberry, desde luego ambas funcionarán bastante mejor al ejecutar un entorno gráfico aunque probablemente tampoco sean sustitutos para reemplazar nuestro ordenador de escritorio. El punto fuerte de la Raspberry comparadas con la CuBox o la Pandaboard es su precio, de unos 45€ con gastos de envío a España, contra 99€ y 182$ sin gastos de envío respectivamente.

Volviendo a la guía, seguidamente explicaré algunas de las tareas para las que sí podemos usar la Raspberry.

Programas y servicios

Las siguientes aplicaciones de muestra son solo una idea de lo que podemos instalar. Además de las anteriores o mencionando algunas de ellas una lista no exhaustiva podría ser la siguiente:
  • Asignar dirección IP fija
  • P2P torrent (transmision-cli)
  • ftp (vsftp)
  • Servidor web (lighttpd)
  • firewall (ufw)
  • PHP
  • Git
  • Sistemas de archivos NTFS, FAT
  • Sonido (cmus)
  • SSH (certificados)
  • SSH y screen
Otras:
  • email (mutt)
  • música (cmus)
Veremos algunas de estas a continuación y la configuración del router que tendremos que hacer. Si quieres instalar todo lo que se comenta en esta quía puedes hacerlo con:


Asignar dirección IP fija

De la lista anterior de aplicaciones algunas de ellas son programas que actuan de servidor. Dado que para conectarnos a un servidor necesitamos conocer la dirección IP en la que se encuentra deberemos asignar a la Raspberry una dirección IP fija en vez de dejar al DHCP del router que le asigne una y que pueda cambiar entre diferentes sesiones, reinicios o al cabo de un tiempo. Para tener una dirección IP fija deberemos crear un servicio de systemd que al iniciarse el sistema se le asigne la que deseamos. Para asignar la dirección IP estática debemos crear el archivo /etc/conf.d/network de configuración donde indicaremos varias propiedades de la red entre ellas la dirección IP:

Y el archivo del servicio de systemd /etc/systemd/system/network.service que se ejecutará cuando se inicie el sistema y realizará las operaciones necesarias para configurar la red:

En address pondremos la dirección IP que queramos dentro de nuestra red y fuera del rango de direcciones IP que asigna el router. Finalmente debemos habilitar e iniciar el servicio network que acabamos de crear.


También deberemos modificar los archivos /etc/dhcpcd.conf y /etc/resolv.conf para que los nombres de los dominios se resuelvan a sus direcciones IP, si al hacer «ping www.google.es» obtenemos un mensaje como «ping: unknown host www.google.es» es que nos falta modificar alguno de estos archivos, poniendo la dirección IP de nuestro router probablemente nos sea suficiente sino podemos usar un servidor de nombre en internet como los que ofrece google:



P2P torrent

tranmision es uno de los programas más populares para realizar descargas P2P mediante torrent. Aparte de a través de la interfaz gráfica puede ser usado desde la linea de comandos y como esto nos es necesario para la Raspberry será el que veremos a continuación. Empezaremos instalando su paquete transmission-cli.

Para poder ejecutarlo como demonio y con un usuario específico debemos seguir los pasos indicados en la wiki de arch linux sobre transmission para el caso de usar systemd.

Siguiendo los pasos de la wiki deberemos hacer las siguientes cosas:
  • Modificar los archivos /usr/lib/systemd/system/transmission.service y /usr/lib/tmpfiles.d/transmission.conf con el usuario con el que queramos que se ejecute transmission.
  • Copiarlos en cada caso a un subdirectorio de /etc.
  • Modificar el propietario y grupo del directorio /run/transmission según el usuario que vaya a iniciar el servicio configurado en transmission.service y transmission.conf.
  • Iniciar el servicio con transmission-daemon y pararlo para que se cree el archivo de configuración.
  • Editarlo para activar la interfaz rpc y el directorio de descargas.
  • Iniciar el servicio con tranmission a través de systemd.
El directorio de descargas incompletas (incomplete-dir), el usuario (rpc-username) y password (rpc-password) para la interfaz remota web (la password la indicaremos en texto plano una vez iniciemos transmision él detectará que está en texto plano y creará un hash de ella para mayor seguridad), si deseamos autenticación en la interfaz remota (rpc-authentication-required) y si queremos un directorio donde transmission buscará archivos torrents para iniciar descargas de forma automática cuando encuentre uno (watch-dir, watch-dir-enabled). En rpc-whitelist deberemos indicar la red local a la que estamos conectados, por ejemplo, 192.168.2.*.


Una vez realizados estos pasos podemos iniciar el demonio de transmission y acceder a su interfaz web con el navegador de nuestro ordenador de escritorio o portatil en la dirección http://[ip-raspberrypi]:9091.

Mediante esta interfaz web podremos modificar algunas propiedades adicionales como los limites de velocidad tanto de bajada como de subida incluso en un horario determinado. Finalmente, mediante esta interfaz web nos aseguraremos en la pestaña Preferences > Network de que tenemos el puerto usado por transmission en estado abierto y accesible desde internet, esto nos será necesario para descargar al máximo de velocidad que dispongamos. Si no lo tenemos tendremos que modificar la configuración del router (lo veremos más adelante en la configuración del router).


FTP

FTP (File Transfer Protocol) es un protocolo para la trasnferencia de archivos entre dos máquinas y puede que nos sea de utilidad para mover archivos entre el sistema que usemos y la raspberry. Por ejemplo, si queremos copiar los archivos descargados por transmission a nuestra máquina podemos extraer la tarjeta de memoria de la raspberry insertarla en nuestro equipo y copiar los archivos, otra forma es instalar un servidor ftp en la raspberry y realizar el copiado mediante el protocolo FTP. La primera opción es más rápida (a 10 MiB/s) pero la segunda es más cómoda (a 2 MiB/s con una tarjeta clase 10) ya que no tendremos que apagar la raspberry y mover la tarjeta SD de un sistema a otro. También nos puede ser útil si queremos dejar en la Raspberry un archivo php.

Si optamos por la segunda opción podemos utilizar Very Secure FTP que ocupa muy poco y no tiene ninguna dependencia, su paquete es vsftd:

Una vez instalado debemos habilitar el servicio e iniciarlo:


Editamos también el archivo de configuración /etc/vsftpd.conf, hay un montón de propiedades pero las básicas que nos interesará modificar son anonymous_enable para permitir o no autenticación anónima, local_enable para permitir iniciar sesión con los usuarios de la raspberry y write_enable para permitir realizar operaciones de escritura como subir o eliminar archivos.

Ya en el ordenador con el que trabajemos deberemos instalar un cliente FTP para realizar las transferencias desde y a la raspberry, podemos utilizar uno de los más conocidos, filezilla.

Para conectarnos en el sitio indicaremos como protocolo SFTP, modo de acceso normal y el nombre de usuario y password de un usuario de la raspberry.

http://welcome.filezilla-project.org/welcome?type=client&category=documentation_basic&version=3.5.3
http://welcome.filezilla-project.org/welcome?type=client&category=documentation_network&version=3.5.3
http://wiki.filezilla-project.org/Documentation

Servidor web

Aunque la raspberry sea pequeña y no parezca muy indicada para actuar como servidor tiene algún punto que la hace especialmente adecuado para ello como es que tiene un consumo muy bajo, ridículo (3 watios) para un servidor mucho más potente (200 watios o más), ocupa también un espacio ridículo en comparación con un servidor más potente, tampoco necesita una refrigeración especial. Al menos para un uso personal o un entorno para un equipo de desarrollo puede ser más que suficiente.

Una muy buena opción es lighttpd, es un servidor de nueva generación de los llamados ligeros que le están ganando terreno a apache, con trasnferencias asíncronas, que ocupa apenas 1 MiB, con muy pocas dependencias. Su paquete es lighttpd. El document root por defecto está en /srv/http donde han de estar alojados los archivos que va a servir.

Me gusta más cherokee, no porque sea mejor ni peor sino porque es un proyecto liderado por un español, Álvaro López Ortega, cosa rara por estos sitios, sin embargo, en la raspberry su consola de administración tiene un funcionamiento pobre llegando a no ser usable, esto unido a que sus archivos de configuración son bastante crípticos para editarlos con un editor de texto la opción que recomiendo es lighttpd. Otra opción sería nginx.

Al igual que con vsftpd debemos habilitar el servicio e iniciarlo.



Acceso desde internet con FreeDNS

Llegados a este punto podemos disponer de un servidor web sin embargo para que sea accesible desde internet necesitamos aún un pieza fundamental en el funcionamiento de la web, un nombre de dominio nos proporcionará un identificador para nuestro servidor que no cambiará con el tiempo aunque la IP pública de nuestro router que nuestro proveedor de servicios de internet (ISP) nos asigna lo haga.

Un opción gratuita es utilizar FeeDSN que nos permitirá obtener un subdominio de ciertos dominios públicos como mooo.com. Necesitaremos crearnos una cuenta en FreeDNS y crear un subdominio. Una vez lo tengamos se nos presenta el problema de como actualizar en FreeDNS nuestra IP pública cada vez que nuestro ISP nos de una distinta. Para ello una opción sencilla es crearnos un script que con cron se ejecute cada cierto tiempo.


Primeramente necesitaremos una serie de utilidades que están contenidas en el paquete dnsutils.

Luego el script con un contenido similar al siguiente cambiando el API_KEY que nos asigne FreeDNS para el dominio:



Le cambiamos de permisos al archivo y añadimos la expresión cron con crontab:

Añadiendo el siguiente contenido para ejecutar el script cada 5 minutos:


En el archivo /var/log/crond.log podemos ver las ejecuciones y resultados del script.

http://freedns.afraid.org/dynamic/index.php
https://wiki.archlinux.org/index.php/Cron

Configuración router

Para hacer que nuestra RPi sea accesible desde internet tendremos que modificar alguna configuración del router como abrir puertos para que el router redirija el tráfico que le llega a un puerto a una determinada direccion IP y puerto de nuestra red. Esto nos será útil principalmente para el caso del servidor web (puerto 80), de transmission (puerto 51413) u otro servidor que queramos que sea accessible desde internet.

Como comentaba en la asignación de IP estática primero comprobaremos el rango de direcciones IP que asigna el servidor DHCP del router y que la dirección IP estática que hemos asignado a la RPi está fuera de ese rango.

Posteriormente abrimos los puertos, las opciones serán diferentes para cada modelo de router pero similares.

Firewall

A pesar de que el router ya hará de firewall podemos utilizar ufw en la propia RPi.



Sistemas de archivos NTFS, FAT

Puede que necesitemos instalar el soporte para acceder a sistemas de archivos con formato NTFS (que es el utilizado por windows) o FAT. Tan solo necesitaremos instalar los siguientes paquetes ntfs-3g, ntfsprogs y dosfstools.

Para realizar el montaje manualmente ejecutaremos el siguiente comando, donde /mnt es la carpeta donde queremos montar el sistema de archivos de la partición de un disco o memoria USB externos:

Si queremos que este montaje se realice de forma automática nada más conectar el cable USB a la RPi instalaremos el paquete udev-automount, que realizará el montaje en la carpeta /media.

PHP

Para instalar PHP basta con instalar los paquetes php php-cgi. Para comprobar que se han instalado correctamente podemos ejecutar:

Ahora nos quedaría integrar el soporte en el servidor web para que sea capaz de procesar los archivos php. La configuración varía en cada servidor web. Aquí explicare como configurarlo con ligthttpd. Para ello deberemos editar el archivo /etc/lighttpd/lighttpd.conf e incluir al final las siguientes lineas:

Ahora deberemos crear el archivo /etc/lighttpd/fastcgi.conf (y el directorio donde está) e incluir en él el siguiente contenido:


Sonido

Primero añadimos nuestro usuario al grupo de audio para reproducir sonidos, cargamos el módulo del sonido y reproducimos un sonido de prueba:

Si no queremos cargar el módulo manualmente cada vez que queramos reproducir sonido se puede cargar el módulo automáticamente cuando se inicie la Raspberry Pi con:

Y añadiendo a ese archivo el módulo que queremos cargar (snd-bcm2835).

Habiendo cargado el módulo snd_bcm2835 con cmus podemos reproducir mp3, ogg entre otros formatos instalando varios paquetes que son: alsa-firmware alsa-lib alsa-plugins alsa-utils cmus pulseaudio libmad libvorbis.

Una cosa que tenemos que tener en cuenta es la salida por la que se emitirá el sonido, por la salida HDMI o por el jack 3.5mm, si no oímos ningún sonido puede que necesitemos cambiar la salida a la que estemos utilizando: Podemos hacerlo con:

Después de instalar los paquetes anteriores puede que necesitemos reiniciar. Podemos probar el sonido con aplay.

Y después cmus:

Si estás interesado en escuchar música con la Raspberry puedes consultar la entrada 4 formas de escuchar música a través de internet en la que se indican varias maneras de hacerlo.

SSH con certificados

El usar SSH puede resultar incómodo ya que hay que estar constantemente introduciendo la clave, para evitarlo en otra entrada explicaré como usar SSH con una clave pública y privada para realizar la autenticación ya que es algo que seguramente sea igual para la RPi o para cualquier otro sistema.

La Raspberry con llos siguientes programas nos puede ofrecer muchas funcionalidades pero tampoco hay que esperar una capacidad igual al de un ordenador de escritorio. En las pruebas que he realizado la velocidad de transferencia que he conseguido desde la tarjeta SD y desde un disco duro externo conectado por USB a la RPi ha sido de tan solo ¡2 MiB/s!.

Utilidad de screen

Si la conexión ssh se cierra todos los programas que se iniciaron en ella se terminan con lo que si estabamos reproduciendo múscica con cmus, cmus se terminará y dejaremos de escuchar música. Para evitarlo podemos usar screen.

Los elementos básicos para usar este miniordenador son la placa de la Raspberry Pi, una cargador de 3A junto con una tarjeta SD.

Referencia:
Raspberry Pi, desempaquetado («unboxing»)
Raspberry Pi, Guía instalación (Parte I) Instalación base
Dejar procesos vivos de conexión SSH con screen

viernes, 1 de junio de 2012

Hojas de estilo CSS con less

less
Hay herrmientas que surgen con el paso del tiempo y uno se pregunta como podría haber vivido antes sin ella o como no ha existido desde un principio. Una de ellas podría ser perfectamente less. Esta herramienta permite generar archivos css utilizando una notación más legible,  mantenible y compacta que se agradece cuando estamos desarrollando un proyecto con gran cantidad de trabajo de diseño además de poder usar variables y operaciones que la propia notación de las hojas de estilo css no soportan. En la propia página de less puede verse como es el lenguaje, no es muy complicado y en unas pocas horas ya estamos capacitados para utilizarlo de forma básica.

Los archivos less se compilan con nodejs generando archivos css tradicionales. Esta compilación no hace falta que la hagamos nosotros a través de nodejs ya que se puede delegar en el navegador del usuario si no nos importa cargar un archivo js más en nuestra página y vemos que la carga no se ralentiza en demasía. En la propia página de inicio de less está perfectamente explicado con un ejemplo de dos líneas.

Si optamos por compilar archivos less primeramente deberemos instalar el paquete nodejs que para Windows hay un binario y para otros sistemas quizá haya que compilarlo desde el código fuente. En Arch Linux, como siempre, es tan fácil instalarlo como ejecutar un comando y tendremos su la última versión cada vez que hagamos una actualización del sistema:

$ yaourt -S nodejs

Una vez que tenemos nodejs descargaremos la propia librería less y con el siguiente comando podremos compilar un archivo less:

$ lessc ejemplo.less > ejemplo.css
$ lessc -x ejemplo.less > ejemplo.css

Con la opción «-x» generamos un archivo eliminando los espacios innecesarios lo que hará que el archivo sea más pequeño. Si en vez de ejecutarlo desde la línea de comandos queremos incluir la compilación dentro de la herramienta de construcción que utilicemos podemos hacerlo con lo siguiente en caso de utilizar Gradle:

task less << {
 ant.exec(executable: "${LIB_HOME}/less.js-1.0/bin/lessc", output: 'src/main/webapp/css/ejemplo.css') {
  arg(line: 'src/main/webapp/css/less/ejemplo.less')
 }
}

Y con Ant sería similar:

<target name="less">
    <exec executable="${LIB_HOME}/less.js-1.0/bin/lessc" output="src/main/webapp/css/ejemplo.css">
     <arg line="src/main/webapp/less/ejemplo.less"/>
    </exec>
</target>

Referencia:
http://lesscss.org/
http://twitter.github.com/bootstrap/
http://www.archlinux.org/packages/community/x86_64/nodejs/
Como crear y usar sprites en páginas HTML

viernes, 24 de junio de 2011

Hola mundo con Symfony 2 y Cherokee

Symfony
Cherokee
Después de las entradas de Servidor web ligero Cherokee, instalación e integración con PHP en Arch Linux y de como Instalar Symfony y Cherokee en Arch Linux iba a ponerme a escribir una entrada con un Hola mundo para Symfony pero la verdad es que no creo que merezca la pena ya que la documentación de Symfony me parece tan buena que prácticamente sería repetir lo que pone en ella. Me limitaré a explicar como configurar las reglas de Cherokee para que las rutas de la apliación de Symfony sean más amigables de SEO, esto es, sin que incluyan la ruta al controlador frontal (/app_dev.php). Aunque esto también está explicado para Symfony 1 en un Cookbook de Cherokee.

Teniendo instalado el soporte para PHP y Symfony en Cherokee de las dos entradas anteriores empezaremos modificando en la pestaña «Básica» la propiedad Raiz de documentos de «/var/www» a «/var/www/Symfony/web» del servidor virtual.

Inicialmente en la pestaña «Comportamiento», donde veremos las acciones que realizará Cherokee según la URL recibida, tendremos dos reglas «Extensions PHP» y «Por defecto», la primera se encargará de capturar las URL que deban ser tratadas por el preprocesador de PHP y la segunda de devolver un listado en caso de que se pida un directorio o de devolver un archivo, por ejemplo una imagen o una hoja de estilo. Ahora en la pestaña «Comportamiento», añadiremos una regla «Existe fichero» seleccionando en el asistente la opción «Coincide cualquier fichero». Con esta regla se devolverá el contenido estático de nuestra aplicación.

Si queremos que en los listados de directorios aparezcan bien los estilos e imágenes tendremos que copiar las reglas «/cherokee_themes» y «/icons» del sevidor virtual default con el mismo contenido en las pestañas «Regla» y «Gestor».

Finalmente modificamos la regla «Por defecto» que será la que redirija las peticiones al controlador frontal para ello modificamos la regla en la pestaña «Gestor» indicando que ahora será de tipo «Redirección», en la lista de reglas añadiremos dos reglas de tipo Interna con el mismo contenido que se ve en la imagen (^(.*)$ -> /app_dev.php, ^/$ -> /app_dev.php).

Las reglas tienen que estar en un orden concreto, ya que son procesadas por Cherokee en ese orden, para cambiarlo se puede utilizar arrastrar y soltar. El orden final sería Extensions php, Existe fichero, Directorio /cherokee_themes, /icons y Redirección.


A veces la aplicación de administración de Cherokee no hace correctamente los cambios en el archivo de configuración /etc/cherokee/cherokee.conf y tal vez nos toque editarlo directamente en el archivo.

Referencia:
http://symfony.com/
http://symfony.com/doc/current/book/page_creation.html#application-configuration
http://www.cherokee-project.com/doc/cookbook_symfony.html

Servidor web ligero Cherokee, instalación e integración con PHP en Arch Linux
Instalar Symfony y Cherokee en Arch Linux

viernes, 17 de junio de 2011

Instalar Symfony y Cherokee en Arch Linux

Symfony
Cherokee
El lenguaje de programación PHP es uno de los más usados para desarrollar sitios web de internet. Su popularidad se debe a su sencillez y su clara orientación al mundo de las páginas web. Es un lenguaje de scripting que ha incoporado y mejorado el soporte para la orientación a objetos en las últimas versiones, yendo de esta forma hacia la dirección que en estos tiempos han seguido la mayoría de lenguajes. Para proyectos pequeños y sencillos usar únicamente scripts de PHP puede ser suficiente pero en cuanto la complejidad y tamaño del proyecto aumenta es necesario buscar soluciones para que el desarrollo y mantenimiento posterior no se convierta en un infierno, en la web de Symfony tienen un excelente artículo de por que son necesarios y con estos motivos surgen los frameworks. En PHP en concreto hay varios disponibles, quiza los más conocidos sean: Zend, Prado, Yii y Symfony aunque hay otros.

En esta entrada vamos a ver como instalar y configurar uno de ellos, Symfony 2 que sigue el tradicional modelo MVC y que nos va a proporcionar las facilidades necesarias para los tipos de proyectos más habituales. Antes de poder utilizarlo necesitaremos un servidor web con soporte para interpretar PHP. En esta otra entrada puedes ver como instalar un servidor web Cherokee con PHP en Arch Linux.

Lo primero que necesitaremos será descargar el paquete del framework Symfony para ello nos dirigimos a la página de descarga del proyecto y elegimos descargar la versión que incluye los «vendors». Una vez descargado crearemos un servidor virtual para la aplicación, para ello arrancamos el servidor de administración de cherokee con el siguiente comando e introducimos http://localhost:9090 en nuestro navegador favorito:

$ sudo cherokee-admin -b -u

Crearemos un servidor con soporte para PHP desde el apartado vServers. Una vez hayamos introducido los datos básicos que nos pide el asistente crearemos dos reglas para servir el contenido estático necesario para mostrar los estilos e imagenes corretamente cuando cherokee muestra un listado de archivos. Para ello vamos a la pestaña Comportamiento del servidor virtual y creamos las reglas para /cherokee_themes y /icons, para crearlas nos podemos fijar en como están en servidor virtual por defecto y las copiaremos con el mismo contenido.



Ahora descomprimiremos el paquete de Symfony y copiamos la carpeta raiz Symfony a /var/www/ para que el servidor web pueda ejecutar la aplicación. Una vez lo hayamos hecho accederemos a http://localhost/Symfony/app/config.php con el navegador en la que Symfony comprobará el estado de la instalación mostrándonos los errores y las recomendaciones que nos hace. Para solventarlos todos deberemos instalar los siguientes paquetes:

$ yaourt -S php-gd php-apc php-intl php-sqlite

Además deberemos cambiar los permisos a carpetas para Symfony pueda trabajar:

$ sudo chmod 775 -R /var/www/Symfony/app/cache/
$ sudo chmod 775 -R /var/www/Symfony/app/logs/

A continuación deberemos modificar el archivo de configuración de php (/etc/php/php.ini) añadiendo a la variable open_basedir lo siguiente:

open_basedir = /srv/http/:/home/:/tmp/:/usr/share/pear/:/var/www/:/usr/:/bin/:/sbin/

También modificaremos la variable date.timezone a la correspondiente a nuestra zona horaria:

date.timezone = Europe/Madrid

Además en el apartado de extensiones del archivo php.ini descomentaremos las siguientes:

extension=apc.so
extension=iconv.so
extension=intl.so
extension=json.so
extension=mysqli.so
extension=pdo_sqlite.so
extension=posix.so
extension=sqlite3.so

Tras estas modificaciones la página http://localhost/Symfony/app/config.php nos indicará que nos nos queda nada pendiente por hacer y podremos pulsar en el enlace «Configure your Symfony Application online» que nos permitirá configurar la base de datos que utilizaremos entre otras cosas básicas. Ya estamos listos para ir a la página de inicio que tenemos por el momento en la aplicación http://localhost/Symfony/web/app_dev.php/.


Ya solo nos queda empezar a desarrollar algo, pero eso quizá sea tema para otra entrada.

Referencia:
http://symfony.com/
http://symfony.com/doc/current/
http://elblogdepicodev.blogspot.com/2011/05/servidor-web-ligero-cherokee.html

jueves, 9 de junio de 2011

Elegir herramientas para un proyecto Java

Java
Cuando empezamos un nuevo proyecto siempre tenemos que tomar decisiones en el aspecto técnico eligiendo las herramientas que vamos a usar para desarrollar el proyecto. La selección adecuada de estas herramientas puede determinar en gran medida lo fácil que pueda resultar el mantenimiento del mismo que en muchos proyectos es la parte a la que más tiempo se le suele dedicar. El elegir la herramienta adecuada no es una decisión fácil ya que hay muchos lenguajes que podríamos utilizar, para cada lenguaje numerosos frameworks y para algunas tareas específicas como acceso a base de datos o generación de informes varias librerias. La decisión de cual elegir es un poco subjetiva según las preferencias de cada uno pero hay varios factores que pude ayudarnos como los conocimientos que tenga el equipo que lo va a desarrollar o las limitaciones impuestas por el mismo proyecto o cliente. Pero si tuviesemos una carta blanca y pudiesemos elegir libremente ¿cuales son las herramientas que utilizaríamos?

Independientemente del tipo del proyecto hay ciertas categorías de herramientas comunes a todos los proyectos para cada una de las cuales deberíamos elegir una. Estas serían:

Herramienta control de versiones: Esta es una herramienta imprescindible si son varias las personas que participan en el proyecto ya que permite compartir a todos los integrantes del mismo el código fuente de una forma rápida y cómoda. Y aún trabajando solo en el proyecto una herramienta de este tipo nos permite almacenar un historial de todos los cambios que hemos ido realizando al código fuente por si necesitamos recuperar alguna parte en algún momento además de etiquetar ciertas versiones para igualmente poder recuperarlas si es necesario. En estos momentos Subversion y Git son dos de las herramientas más conocidas y utilizadas. La principal diferencia entre ellas es que Subversion utiliza un modelo cliente/servidor y Git utiliza un modelo distribuido. Git sería la opción que elegiría por ser la evolución que están tomando estas herramientas y por tener algunas ventajas sobre Subversion como la mayor facilidad para crear branches.

Herramienta gestión de peticiones: Habiendo trabajado con un herramienta de este tipo uno piensa como era posible trabajar sin una y es que permite conocer a todos los miembros de equipo las tareas que están pendientes de realizar, que está haciendo cada uno y cual es el progreso de las mismas y su estado evitando que se «pierdan». Además pueden integrase con el sistema de control de versiones permitiendo anotar en los tickets referencias a una revisión del código fuente y ver que cambios tiene cada petición cosa que puede implicar varios commits en la herramienta de control de versiones. Tenemos a disposición varias herramientas (bugzilla, Mantis, ...) pero de las que he visto Trac y Redmine (por tener ambas una wiki que permite anotar documentación) son las que más me han gustado.

Herramienta de construcción del proyecto: Si queremos trabajar de forma cómoda y no perder el tiempo realizando tareas repetitivas necesitamos una herramienta que nos automatice la tarea de compilar el proyecto y desplegarlo en el servidor asi como de ejecutar las pruebas unitarias. Herramientas específicas para este propósito son Ant, Maven y por la que yo optaría si pudiese elegir sería Gradle.

Herramienta de pruebas unitarias: Si queremos asegurarnos de que las cosas hacen lo que tienen que hacer deberíamos desarrollar junto con nuestro código fuente sus pruebas unitarias. Además estas mismas pruebas nos servirán para comprobar si las cosas siguen funcionando después de un determinado cambio. Herramientas de pruebas hay muchas pero varias de ellas son JUnit, Mockito, PMD, Checkstyle y Selenium.

Herramienta de integración continua: Las herramientas de integración continua permite realizar ciertas tareas cada cierto tiempo de forma automática y se suelen utilizar para comprobar que el proyecto sigue compilando correctamente con los cambios que se van haciendo en la herramienta de control de versiones, para comprobar que siguen pasando las pruebas unitarias y para construir una versión a ser desplegada en los servidores. Quizá la más conocida y utilizada en estos momentos es Jenkins. Uno de sus puntos fuertes es su extensibilidad a través de plugins.

Después de estas herramientas comunes a todos los proyectos deberemos elegir algunas específicas para el proyecto que tengamos por delante:

Lenguaje de programación: Esta será una elección que condicionará algunas de las herramientas que utilizaremos y el hecho de optar por un determinado lenguaje nos obligará a buscar y a encontrar librerías en ese lenguaje para resover las tareas del proyecto si no queremos reinventar la rueda.

En mi caso opto por Java por ser un lenguaje orientado a objetos, fuertemente tipado (esto tiene la ventaja de que el compilador nos ayuda a encontrar errores rápidamente en tiempo de compilación) y con un montón de librerías con licencia de código abierto o de software libre que podemos usar. En estos momentos Java tiene algunas carencias como el no disponer de closures (aunque muy posiblemente se añadan en la versión 8) pero para alguna tarea específica podemos utilizar Groovy (que es un lenguage de programación que puede ejecutarse sobre la JVM y si dispone de ellas).

Plataforma de desarrollo: Siendo este un blog con una temática entorno a software libre y Linux no podría elegir otra que no fuera el sistema del pingüino. Pero también hay motivos importantes por lo que lo recomendaría como tener a tu disposición un montón de software libre a un comando o unos cuantos clics de ratón para instalar y tenerlo actualizado. En windows pasado un tiempo se hace pesado y es una pérdida de tiempo el desinstalar el programa, buscar el instalador para la nueva versión y volverlo a instalar. Lo ideal sería que el proyecto pudiese ser desarrollado en cualquier plataforma y que cada persona eligiese con la que más cómodo se encontrase. Uno de los contras que tengo sensación es que al usar Arch Linux por una actualización en algún momento algo se «rompa» y me deje el sistema inutilizado.

IDE de desarrollo: Siendo Java el lenguaje de desarrollo por el que he optado como IDE optaría por eclipse. Aunque si necesitamos algo más liviano podríamos optar por Gedit directamente, emacs o vim. Una de las cosas importantes sería utilizar una que nos resalte la sintaxis de nuestro código fuente, soporte para hacer refactor o asistente de código.

Base de datos: En muchos proyectos necesitaremos persistir información y consultarla. Para resolver este asunto están las bases de datos, lo más probable sea que necesitemos una relacional y para ello tenemos MySql o PostgreSQL aunque en estos momentos las bases de datos orientadas a documentos están siendo muy nombradas como MongoDB, CrouchDB o Redis.

Herramienta de persistencia en base de datos: Entre los lenguajes de programación orientados a objetos y las bases de datos relacionales hay una discordancia en la forma de representar los datos. Para tratar de abstraernos del Sql que utilizan las bases de datos relacionales podemos utilizar un ORM que nos permitirá trabajar de una forma orientada a objetos además de abstraernos de la base de datos en concreto que utilizamos ya que aunque cada una implementa una especificación común de Sql hay ciertas diferencias entre ellas que deberemos tener en cuenta si no utilizamos un ORM. Uno de ellos es hibernate.

Framework de desarrollo web: Framework de desarrollo en Java hay para aburrir. De entre los que he usado en proyectos reales JSP, Struts, JSF, Grails y Tapestry me quedo con este último principalmente por poder desarrollar componentes y librerías de componentes que incluyen toda la funcionaliadad necesaria para que funcionen, que pueden ser reutilizados entre diferentes proyectos, que simplifica enormemente el desarrollo y es altamente extensible y adaptable a las necesidades que podamos tener en el proyecto.

Tomcat: es un contenedor de servlets y jsp «secillo» sobre el que desplegar nuestras aplicaciones web Java.

Framework Javascript: trabajar con javascript puede ser arduo más teniendo en cuenta que cada navegador tiene su propias peculiaridades por ello se hace casi imprescindible que en un proyecto web elegir un framework javascript que nos permita abstraernos de estas peculiaridades y nos simplifique el trabajo. Quizá uno de los más conocidos y utilizados sea jQuery aunque disponemos de otros como Prototype, Mootools aunque quizá menos usados y con menos plugins disponibles.

Otra serie de herramientas que quizá tengamos que tener en cuenta son:
JasperReports/iReport: generación de informes en varios formatos.
Lucene: indexación de datos.
JBoss: si necesitamos algo más completo que Tomcat prodíamos optar por servidor de aplicaciones como este.
Cherokee, Lighttpd, nginx: servidor web ligero y rápido.
jBPM: permite modelar flujos de trabajo de negocio.
Freemarker: herramienta para genergar archivos de texto basandose en plantillas.
Quartz: planificador de trabajos.
SLF4J y Logback: trazas de log.
Less: lenguaje para CSS.

Estas son las herramientas que seguramente elegiría para un proyecto web desarrollandolo con Java y que serán suficientes para la mayoría de proyectos web, si tuviese que elegir otra plataforma probablemente optaría por PHP y Symfony si el proyecto no es excesivamente complejo. Pero como digo hay muchas opciones y uno puede elegir la que más cómodo se encuentre desarrollando o considere más adecuada.

¿Alguna herramienta distinta de estas que tú consideres imprescincible o te haya gustado trabajar con ella?

viernes, 27 de mayo de 2011

Servidor web ligero Cherokee, instalación e integración con PHP en Arch Linux

Cherokee web server
El servidor web Cherokee es uno de los servidores de nueva generación llamados ligeros que mejora notablemente el rendimiento ofrecido por el más usado Apache HTTPD soportando más usuarios concurrentes, aceptando más peticiones por segundo y consumiendo menos memoria. Quizá no tenga toda la versatilidad de un servidor Apache HTTPD pero para la mayoría de los escenarios es más que suficiente. En el siguiente artículo vamos a ver cuales son sus principales características y como instalarlo junto con PHP en la distribución Arch Linux. Otros servidores similares a Cherokee son nginx y lighttpd que quizá te interese también echarles un vistazo. Por supuesto cherokee es un servidor con licencia GNU GPL v2 y por tanto es software libre.

Comencemos poniendo algunas de las características que soporta: FastCGI, SCGI, PHP, CGI, SSI, TLS y conexiones cifradas SSL, host virtuales, autenticación, codificación al vuelo, balanceo de carga, archivos de log compatibles con apache, balanceador de base de datos, actualizaciones sin parada del servicio, proxy HTTP inverso y mucho más.

De todas las características que posee Cherokee destacaría las siguientes:

- Actualizaciones sin parada del servicio que puede ser muy importante para algunos servicios que no pueden permitirse dejar de dar servicio ningún segundo.
- Configuración a través de una consola de administración accesible con el navegador esto no se si es una ventaja o desventaja ya que no sigue la filosofía de los sistemas Unix de realizar la configuración mediante un archivo de texto para hacer una restauración de la configuración en caso de que la perdamos pero sin duda hace que la configuración se realice más comodamente y es algo que no tienen otros servidores por lo que he considerado importante destacarlo. También podemos editarlo directamente aunque realmente no estaremos interesados en ello a menos que seamos un usuario avanzado.
- Cherokee Market con el que podremos instalar ciertos servicios de forma muy cómoda y con poca configuración, como por ejemplo, instalar un servicio de Drupal, Wordpress, phpBB, phpMyAdmin, nuxeo, Liferay y algunos otros.
- Host virtuales SSL con esta característica podemos usar SSL en host virtuales ya que cherokee hace uso del método Server Name Indication (SNI) por el que en la negociación de la sesión TLS se envía el nombre del host que se quiere acceder. Esta era una imitación importante al usar SSL en servidores virtuales basados en nombres.

Si esta características no te parecen importantes quizá la del rendimiento por si sola te parezca suficiente para empezar a utilizar cherokee, consulta las pruebas de rendimiento (en el apartado referencia) para ver en que medida mejora Cherokee el rendimiento respesto a otros servidores. Pero sin duda lo mejor sería que lo comprobases por ti mismo. Una nueva caracteristica añadida recientemente y que afecta al rendimiento es la llamada Font-Line cache. Los desarrolladores de cherokee se han dado cuenta que es muy habitual utilizar junto al servidor web otro servidor dedicado a cachear ciertos resultados, como Squid, sin tener que generar de nuevo el mismo contenido para cada petición, esto por si solo aumenta el rendimiento notablemente y reduce la carga del sistema pero aún asi hay cierta latencia y comunicación entre el servidor web y el servidor de cache que podría ser evitada como ha demostrado cherokee. Para reducir esta latencia cherokee incorpora en si mismo un servidor de cache que puede reducir esta latencia hasta en un 80%.

En Arch Linux la instalación de Cherokee es muy sencilla basta con:

# pacman -S cherokee

y se nos instalará la última versión disponible. Para arrancarlo y pararlo deberemos hacer:

# /etc/rc.d/cherokee start
# /etc/rc.d/cherokee stop

Si queremos que se inicie al arrancar el sistema deberemos añadirlo al apartado DAEMONS del archivo /etc/rc.conf (Consulta la wiki de Arch Linux para más detalles sobre como administrar los servicios):

# nano /etc/rc.conf

DAEMONS=(syslog-ng network netfs crond cherokee)

Para arrancar la consola de administración deberemos ejecutar:

# cherokee-admin -b -u


El parmámetro -b hará que cherokee escuche en cualquier dirección IP y no solo en 127.0.0.1. Y el parámetro -u hará que no se solicite contraseña al acceder a la consola de administración por lo que es recomendable no usarlo en un sistema de producción. En la pantalla de inicio de la consola de administración podemos ver información básica de la carga del servidor en cuanto a procesador y memoria y veremos si tenemos instalada la última versión de cherokee.

La consola de administración está dividida en varios apartados: Inicio, Mercado, Estado, General, vServers, Orígenes y Avanzado. En el apartado Market podremos instalar los servicios disponibles pero para ello previamente deberemos tener una cuenta de cherokee market. En el apatado General podemos modificar algunas característica generales del servidor. En el apartado vServers podemos administrar los servidores virtuales e instalar nuevos servidores virtuales, con el botón + podremos añadir fácilmente el soporte para PHP. En Avanzado podemos modificar algunos datos importantes sobre el funcionamiento del servidor.








Veamos ahora a ver como instalar PHP en cherokee. Primeramente instalaremos PHP con:

# pacman -S php php-cgi


Si todo ha ido correctamte podremos ejecutar:

$ php -v
$ php-cgi -v

Ahora procederemos crear un servidor virtual con soporte para PHP, vamos al apartado vServer y pulsamos sobre el botón +, seleccionamos Lenguages y PHP. Tal vez necesitemos crear un directorio con mkdir /var/www. Continuamos con el asistente y finalmente nos aparece en la lista de servidores el que acabamos de crear.



Ya nos queda poco!... solo nos queda crear un archivo php de ejemplo que lo crearemos con nuestro editor favorito en el directorio /var/www si hemos indicado este directorio en el asistente.


Espero que a alguien le entren ganas de usar este servidor web, si es así estaré encantado de escuchar sus comentarios.

Referencia:
http://www.cherokee-project.com/doc/basics_why_cherokee.html
http://www.cherokee-project.com/benchmarks.html
http://www.cherokee-project.com/doc/other_goodies.html
http://www.cherokee-project.com/doc/other_graphs.html
http://www.cherokee-project.com/doc/cookbook_php.html

http://www.redes-linux.com/manuales/Servidor_web/ponencia_cherokee.pdf
http://en.wikipedia.org/wiki/Cherokee_(webserver)
http://www.youtube.com/watch?v=bIxFzOv3U1A

https://wiki.archlinux.org/index.php/Daemon