sábado, enero 04, 2014

Instalación de HHVM, hhvm-fastcgi, nginx y apache en Ubuntu 13.10

A continuación describo los procedimientos para instalar hhvm y hhvm-fastcgi en Ubuntu 13.10 por código fuente, ya que los paquetes deb adolecen de las ultimas modificaciones en las extensiones de hhvm.
Adicionalmente configuraremos apache y nginx con la extensión hhvm-fastcgi

Actualización de Ubuntu 13.10
Siempre que instalamos paquetes de desarrollo no está demás hacer un update de todos los paquetes

$> sudo su -
$> apt-get -y update
$> apt-get -y dist-upgrade

Si se actualizó  el kernel, no olviden hacer un reboot

Instalación de Prerrequisitos
$> sudo su -
$> apt-get install autoconf automake binutils-dev build-essential cmake g++ git \
  libboost-dev libboost-filesystem-dev libboost-program-options-dev libboost-regex-dev \
  libboost-system-dev libboost-thread-dev libbz2-dev libc-client-dev \
  libc-client2007e-dev libcap-dev libcurl4-openssl-dev libdwarf-dev libelf-dev \
  libexpat-dev libgd2-xpm-dev libgoogle-glog-dev libgoogle-perftools-dev libicu-dev \
  libjemalloc-dev libmcrypt-dev libmemcached-dev libmysqlclient-dev libncurses-dev \
  libonig-dev libpcre3-dev libreadline-dev libtbb-dev libtool libxml2-dev zlib1g-dev

Descargar el código fuente de hhvm, lo instalaremos en /opt
$> cd /opt
$> mkdir dev
$> cd dev
$> export CMAKE_PREFIX_PATH=`pwd`
$> git clone git://github.com/facebook/hhvm.git
$> cd hhvm
$> git submodule init
$> cd ../

Instalar librerías dependientes
libevent
$> git clone git://github.com/libevent/libevent.git
$> cd libevent
$> git checkout release-1.4.14b-stable
$> cat ../hhvm/hphp/third_party/libevent-1.4.14.fb-changes.diff | patch -p1
$> ./autogen.sh
$> ./configure --prefix=$CMAKE_PREFIX_PATH
$> make
$> make install
$> cd ..

Compilar hhvm
$> cd hhvm
$> git submodule update
$> export HPHP_HOME=`pwd`
$> cmake .
$> make

El binario hhvm se instalará en /opt/dev/hhvm/hphp/hhvm/hhvm

Instalación de nginx, mysql, apache y php (para probar los benchmark)
$> apt-get install nginx mysql-server apache2 \
apache2-data apache2-bin apache2-doc php5


HHVM Fastcgi, instalamos los precompilados para Ubuntu 13.10
$> echo deb http://dl.hhvm.com/ubuntu saucy main | tee /etc/apt/sources.list.d/hhvm.list
$> apt-get update
$> apt-get install hhvm-fastcgi

Enlazar el binario hhvm compilado a una ruta del path (reemplazar al hhvm del .deb)
$> mv /usr/bin/hhvm /usr/bin/hhvm-old
$> ln -s /opt/dev/hhvm/hphp/hhvm/hhvm /usr/bin/hhvm

Reiniciar los servicios
$> /etc/init.d/hhvm-fastcgi restart
$> /etc/init.d/apache2 restart
$> /etc/init.d/nginx restart

Editamos el index.php y lo visualizamos en el Navegador
$> vim /var/www/index.php
<?php

echo "Running on HHVM version ".HHVM_VERSION."\n";
phpinfo();
Visualizamos en Apache desde el navegador
http://localhost

Visualizamos en nginx desde el navegador
http://localhost:8090

Debemos visualizar un mensaje similar a
Running on HHVM version 2.4.0-dev HipHop 

Ejecución por consola
$> hhvm /var/www/index.php

HHVM: Hip Hop Virtual Machine for PHP, el futuro de PHP

HHVM (Hip Hop Virtual Machine for PHP) es una nueva máquina virtual para la ejecución Just In Time (JIT) de código PHP, cuya performance respecto al intérprete de PHP  ha demostrado ser hasta hasta 6 veces más rápido [1]

Hhvm fue creado por Facebook en el 2008 como HPHP (Hip Hop for PHP), un compilador escrito en C++, el cual convierte el código php en C++ y lo compila, obteniendo una performance superior al intérprete. El objetivo de Facebook con hphp. fue el de acelerar la ejecución de su plataforma web, ya que el intérprete ofrecía serios problemas de performance ante la masiva concurrencia de usuarios.

El compilador hphp evolucionó en el 2011 hasta convertirse en una máquina virtual JIT y de ahí nace hhvm. Hhvm ejecuta el código php convirtiéndolo primero a bytecode (Hip Hop Byte Code: HHBC) y almacenando este bytecote en una base de datos sqlite; la primera ejecución suele ser más lenta que las siguientes; por el proceso de conversión, pero aún así es más rápido que el intérprete estándar de php O_O.
Uno de los objetivos fundamentales de hhvm es ser 100% compatible con php 5.4/5.5 y dar soporte a las funciones eval() y create_function(), que no eran soportados por el anterior compilador.

La importancia de hhvm es que se avizora como el futuro de PHP, lo que vendría a ser un PHP6 pues el intérprete Zend no ha evolucionado como debería, presenta aún la deficiencia de rendimiento de los lenguaje interpretados y por sobre todo es difícil crear nuevas extensiones, ya que estas se tienen que escribir con lenguaje C.

Con hhvm, PHP se acerca al modelo de la JVM, ejecución JIT, soporte multithread, bytecode y lo más importante la posibilidad de crear extensiones con buena performance en el lenguaje PHP, sin necesidad de recurrir al lenguaje C.

Actualmente hhvm se desarrolla a un ritmo vertiginoso, siendo sus objetivos primordiales mejorar aún más la performance de la Virtual Machine, añadir más extensiones de Zend y ser compatible al 100% con las frameworks de PHP más populares como Symfony, drupal, doctrine2, Zend Framework2, codeigniter, slim, etc.

Adicional a esto Facebook ha publicado la extensión hhvm fastcgi para la ejecución de código PHP con los principales servidores web: Apache y nginx como un módulo fastcgi.
Con la extensión fastcgi se puede ejecutar muchas aplicaciones web desarrolladas en PHP, siendo aún los principales problemas la falta de extensiones como mysqli, gd, intl(implementado parcialmente), etc.

Recursos de hhvm
Sitio Web: http://www.hhvm.com/blog/
Github:      https://github.com/facebook/hhvm
Wiki:          https://github.com/facebook/hhvm/wiki

viernes, diciembre 20, 2013

Mapa del Software Libre y Open Source (FLOSS)

Publico a continuación una diapositiva en Impress en la cual resumo en líneas generales los programas que existen en Software Libre y Open source (FLOSS) orientados a diferentes usuarios: Usuario de escritorio, empresas, programadores y sector educación

jueves, diciembre 19, 2013

Curso de Zimbra - Capítulo IV (Comandos en consola en Zimbra)

1.- Comandos de servicio
##########################################################################

$> su - zimbra

verificar el estado de todos los  servicios en zimbra
$> zmcontrol status 

detener todos los servicios
$> zmcontrol stop

iniciar todos los servicios
$> zmcontrol start

reiniciar todos los servicios
$> zmcontrol restart

ver la versión de zimbra
$> zmcontrol -v


2.- Comandos individuales de servicio (start, stop, restart, status)
##########################################################################
Ej: detenemos todos los servicios e iniciaremos uno a uno

$> zmcontrol stop

$> zmcontrol status

Iniciar LDAP server
$> ldap start

$> zmcontrol status

Iniciar MySQL Server
$> mysql.server start

Iniciar zmconfigd
$> zmconfigdctl start

Iniciar MTA (postfix, saslauthd)
$> zmmtactl start

Iniciar Amavis, Antivirus y AntiSpam (amavis, spamassassin, clamav)
$> zmamavisdctl start

$> zmcontrol status

Iniciar Mailbox (webmail, panel de administracion, servidores imap y pop3, servidores de filtros)
$> zmmailboxdctl start

Iniciar spell (servidor de ortografía)
$> zmapachectl start

Iniciar monitoreo
$> zmswatchctl start

Iniciar estadísticas
$> zmstatctl start

Iniciar Logger (logs del sistema)
$> zmlogswatchctl start

Reiniciar solo el antivirus
$> zmantivirusctl restart

Reiniciar solo el antispam
$> zmantispamctl restart


3.- zmprov: comando de administración de zimbra
############################################################################

Loguearse primero como usuario zimbra

$> su - zimbra

Lista la ayuda general de zmprov
$> zmprov help

Listar la ayuda para gestionar las cuentas
$> zmprov help acount

Consola Interactiva
$> zmprov
prov> 

Ver ayuda de cuentas
prov> help account

Salir de la consola interactiva
prov> quit

4.- Cuentas
############################################

Obtener listado de todas las cuentas del servidor (todos los dominios)
$> zmprov -l gaa

Obtener todas las cuentas de administración
$> zmprov -l gaaa

Obtener información de una sola cuenta
$> zmprov -l ga tuxito@dominio.com 

Cuentas de un dominio específico
$> zmprov -l gaa dominio.com

Detalle de cuentas de un dominio especifico
$> zmprov -l gaa -v dominio.com

Detalle de cuentas de un dominio especifico con Cuenta, Nombre y Quota
$> zmprov -l gaa -v dominio0.com | grep -e zimbraMailDeliveryAddress -e displayName -e zimbraMailQuota |sed -e "s/zimbraMailDeliveryAddress/Cuenta/" -e "s/displayName/Nombre/" -e "s/zimbraMailQuota/Quota/"   

Crear una cuenta, con cos default
$> zmprov ca pepito@dominio.com pepitopass displayName "Pepito Pérez"

Crear un usuario con un cos específico ej: gerente
$> cos=`zmprov gc gerente | grep zimbraId:|cut -d ' ' -f2`
$> zmprov ca juanito@dominio.com juanitopass displayName "Juanito Martinez" zimbraCOSId $cos 

Crear una cuenta con detalle
$> zmprov ca windozero@dominio.com passwinbugs cn 'Nombre(s) ApMaterno ApPaterno' displayName 'Nombre(s) ApMaterno ApPaterno' givenName 'Nombre(s)' zimbraCOSId $cos

5.- Modificar opciones de una cuenta
#########################################################

Cambiar de password de una cuenta
$> zmprov sp usuario1@dominio.com passnuevo

Modificar un atributo de una cuenta
$> zmprov ma usuario1@dominio.com displayName "Luser Noob 1"

Nota: se puede modificar cualquier atributo del usuario
para la lista de atributos ejecutar
$> zmprov -l ga usuario1@dominio.com


6.- Busqueda de cuentas 
##########################################################

* Búsqueda por atributos
Se puede buscar las cuentas por un atributo en común
$> zmprov sa parametro=cadena

Buscar todas las cuentas activas
$> zmprov sa zimbraAccountStatus=active

Buscar todas las cuentas bloqueadas
$> zmprov sa zimbraAccountStatus=locked

Buscar en cuales listas se encuentra una cuenta
$> zmprov gam cuenta@dominio.com


7.- Borrar una cuenta
##########################################################
$> zmprov da usuario3@dominio.com

8.- Creación de Cuentas en forma masiva
######################################################################################################
Nos logueamos como root
$> su -

Creamos nuestro directorio de scrips
$> mkdir /opt/zimbra/scripts

Entramos al directorio
$> cd /opt/zimbra/scripts

Primero creamos un archivo con la lista de cuentas y sus respectivos cos
$> vim usuarios.txt
--------------------------------------------
usuario1@dominio.com,userpass1,Usuario Prueba 1,default
usuario2@dominio.com,userpass2,Usuario Prueba 2,default
usuario3@dominio.com,userpass3,Usuario Prueba 3,gerente
--------------------------------------------

Creamos ahora un script que genere un archivo para la creación de usuario
$> vim crea_usuarios.php
#!/usr/bin/php

<?php 

// Obteniendo los COS del sistema y sus Ids 

exec("/opt/zimbra/bin/zmprov gac",$arrcos); 

$cos = array(); 

foreach($arrcos as $cos_name){ 

        $cos_name  = chop ($cos_name); 

        $cosid=`/opt/zimbra/bin/zmprov gc $cos_name | grep ^zimbraId:`; 

        $cosid = trim(str_replace("zimbraId: ","",$cosid)); 

        $cos[$cos_name]=$cosid; 

} 

//print_r($cos); 

// Leyendo los archivos de Usuarios 

$userfile=file("usuarios.txt"); 

// Recorriendo array de usuarios y creando las cuentas 

foreach($userfile as $userline){ 

    $userline=trim(chop($userline)); 

    if(!empty($userline)){

        $user = explode(",",$userline);
    echo("ca $user[0] $user[1] displayName '$user[2]' zimbraCOSId ".$cos[$user[3]]."\n"); 
    } 
} 
?>
Ejecutamos el script, para eso necesitamos php
$> yum -y install php php-cli
$> chmod 755 crea_usuarios.php
$> ./crea_usuarios.php> cuentas.zm


Creamos los usuarios con zmprov
$> /opt/zimbra/bin/zmprov < cuentas.zm


9.- Listas de correo
###############################################################
Buscar todas las listas, y por dominio

$> zmprov gadl

$> zmprov gadl dominio.com

Crear una lista
$> zmprov cdl lista@dominio.com

Ver una lista específica
$> zmprov gdl lista@dominio.com

Encontrar todas las listas de un dominio y sus miembros
$> for i in $( zmprov gadl dominio.com | grep -v abuse | grep -v postmaster | sort ) ; do echo
 `zmprov gdl $i | grep -e 'mail: ' -e 'zimbraMailForwardingAddress: ' | sed 's/mail/Lista/' | sed

's/zimbraMailForwardingAddress: //'` ; done ;


agregar un miembro a la lista
$> zmprov adlm lista@dominio.com cuenta@dominio.com

Remover un miembro de la lista
$> zmprov rdlm lista@dominio.com cuenta@dominio.com

Borrar una lista
$ zmprov ddl lista@dominio.com


10.- Buzones (zmmailbox)
##################################################################

Entrar a la consola interactiva
$> zmmailbox
mbox> 

Ver ayuda general del comando
$> zmmailbox help

Ver ayuda de las cuentas 
$> zmmailbox help account

Ver ayuda de los mensajes
$> zmmailbox help message


* Tamaño de un buzón
Ver tamaño ocupado del buzón
$> zmmailbox -z -m cuenta@dominio.com gms

Ver el tamaño de las quotas asignadas y ocupadas de todos los buzones
$> zmprov gqu `zmhostname`|awk {'print " "$3" "$2" "$1'}

Revisar mensajes por carpetas en el buzón
$> zmmailbox -z -m cuenta@dominio.com gaf

Borrar una carpeta completa de un buzón
$> zmmailbox -z -m cuenta@dominio.com emptyFolder Junk

Importar mensajes de una carpeta Maildir existente en el INBOX 
$> echo addMessage /INBOX /path/to/Maildir/cur | /opt/zimbra/bin/zmmailbox -z -m cuenta@dominio.com

Buscar un mensaje
$> zmmailbox -z -m cuenta@dominio.com search -t message "prueba"

Buscar un mensaje en todas las cuentas
$> zmprov -l gaa |awk '{print "zmmailbox -z -m "$1" search \"linux\" "}' |sh -v
linux es la palabra de búsqueda

Buscar correos anteriores a una fecha: (formato mes/dia/año)
$> zmmailbox -z -m cuenta@dominio.com search -t message "in:INBOX (before: 12/19/13)"

Obtener contenido de un correo
$> zmmailbox -z -m cuenta@dominio.com  gm  21940
21940 es el ID del mensaje

Ver contactos:
$> zmmailbox -z -m cuenta@dominio.com gact | less

Vaciar casilla usuario:  
$> zmmailbox -z -m accoun@domain.com ef "/Inbox"

Ver correos de una carpeta
$> zmmailbox -z -m cuenta@dominio.com search -l 100 "in:Inbox"

Ver metadata de un correo:
$> zmmetadump -m cuenta@dominio.com -i 26747

Borrar un mensaje
$> zmmailbox -z -m cuenta@dominio.com dm 4543
4543 es el id del mensaje

lunes, diciembre 16, 2013

Curso de Phalcon PHP - Capítulo I: (Primeros Pasos ¿Qué es Phalcon?)

Phalcon PHP es un framework de alto rendimiento desarrollado como un módulo nativo de C para el núcleo de PHP, convirtiéndolo en el framework más rápido de todos, siendo hasta 10 veces más rápido que symfony 2 y zend framework 2.
Phalcon es un framework full stack para el desarrollo de aplicaciones complejas.

Cuenta con los siguientes módulos y funcionalidades:
- Desarrollo con uso de PHP 5.3 y namespaces
- Patrón de arquitectura MVC para el desarrollo de aplicaciones (Módulo Simple, Multi Módulos y Micro Aplicaciones)
- Motor de ORM (Transacciones, Comportamientos, Relaciones, PHQL, Eventos, Validaciones, Hydration, Logging, Profiling, Sharding)
- Motor de ODM ( Mongo DB)
- Encriptación
- HTTP Request/Response/Cookies
- ODM para la base de datos documental Mongo DB
- Motor de Templates (Volt)
- Inyección de Dependencias DI/IOC
- Gestión de Eventos
- Cifrado
- Filtrado y Saneamiento
- Constructor de Formularios y Validación
- Mensajes Instantáneos
- Cache
- Paginación
- Anotaciones
- Seguridad
- Traducción
- Gestión de Assets (despliegue de archivos públicos: js,css)
- Auto-Loader Universal
- Logging
- Interfaz de comandos CLI

Instalación de Phalcon 
Usaremos Ubuntu como distribución base de preferencia una versión LTS 12.04 o release superior
Logueandose como root
$> sudo su -

Actualizando la lista de paquetes
$> apt-get -y update

Instalamos vim para como editor de texto
$> apt-get -y install vim

Instalando los paquetes de desarrollo de php y el compilador de c
$> apt-get -y install php5-dev php5-mysql gcc

Instalando el sistema de control de versiones git
$> apt-get -y install git

Haciendo un checkout del proyecto; desde github
$> git clone git://github.com/phalcon/cphalcon.git

Compilando el framework
$> cd cphalcon/build

Ubuntu de 32 bits
$> ./install 32bits

Ubuntu de 64 bits
$> ./install 64bits

Habilitando la extensión phalcon en la configuración de php
$> vim /etc/php5/conf.d/20-phalcon.ini
extension=phalcon.so

Verificando la carga de la exensión phalcon
$> php -r "print_r(get_loaded_extensions());"  | grep phalcon

Plataforma de despliegue (LAMP o LEMP) 
* Instalación de Apache, extensiones de PHP y MySQL (LAMP) 
Apache es el servidor web más popular en la internet y su combinación con Linux, PHP y MySQL lo convierten en la plataforma más importante en el despliegue de aplicaciones web. Instalación de apache, php, librería gráfica (gd), depurador (xdbug), interfaz de comandos (cli), ldap, cifrado (mcrypt), download manager (curl)

$> apt-get install apache2 php5 mysql-server php5-mysql \
php5-gd php5-xdebug php5-cli php5-ldap php5-mcrypt php5-curl

* Instalación de Ngnix, PHP y MySQL (Linux EngineX: LEMP) 
Ngix es un servidor web muy ligero, de gran performance y cada vez gana más aceptación; su uso con PHP, PHP-FPM y MySQL lo convierten en una interesante alternativa a Apache Instalación de apache, php, librería gráfica (gd), depurador (xdbug), interfaz de comandos (cli), ldap, cifrado (mcrypt), download manager (curl) y php-fpm (fast cgi)

$> apt-get install nginx php5 mysql-server php5-mysql \
php5-gd php5-xdebug php5-cli php5-ldap php5-mcrypt php5-curl php5-fpm

Primera Aplicación: holamundo

Estructura base de directorios
tutorial/
 app/
   controllers/
   models/
   views/
 public/
   css/
   img/
   js/

Creación de la estructura base de directorios
$> cd /var/www
$> mkdir holamundo
$> mkdir holamundo/app
$> mkdir holamundo/app/controllers
$> mkdir holamundo/app/models
$> mkdir holamundo/app/views
$> mkdir holamundo/public
$> mkdir holamundo/public/css
$> mkdir holamundo/public/img
$> mkdir holamundo/public/js
Creación del archivo .htaccess del directorio public para habilitar el uso de URLs Limpias
$> vim holamundo/public/.htaccess
AddDefaultCharset UTF-8
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]
</IfModule>
Definiendo el BootStrap principal (Front Controller)
$> vim holamundo/public/index.php
<?php
try{
    //Register an autoloader
    $loader = new \Phalcon\Loader();
    $loader->registerDirs(array(
        '../app/controllers/',
        '../app/models/'
    ))->register();


    //Creando una instancia de Inyección de Dependencias
    $di = new Phalcon\DI\FactoryDefault();

    //Definiendo el directorio de vistas de la aplicacion, con el uso de una función lamba (función anónima)
    $di->set('view', function(){
        $view = new \Phalcon\Mvc\View();
        $view->setViewsDir('../app/views/');
        return $view;
    });

    //Gestionando la petición y desplegando la aplicación
    $application = new \Phalcon\Mvc\Application();
    $application->setDI($di);
    echo $application->handle()->getContent();

} catch(\Phalcon\Exception $e) {
    echo "PhalconException: ", $e->getMessage();
}

Creando el controlador IndexController
$> vim holamundo/app/controllers/IndexController.php
<?php
class IndexController extends \Phalcon\Mvc\Controller
{

    // método para la acción index
    public function indexAction()
    {

    }

}
Creando el directorio la vista para el controlador index
$> mkdir holamundo/app/views/index
Creando el archivo de vista para la acción index
$> vim holamundo/app/views/index/index.phtml

Hola Mundo desde Phalcon :)

Despliegue y prueba de la Aplicación Crearemos un dominio ficticio en el /etc/hosts Agregar en la última línea
$> vim /etc/hosts
127.0.1.1  www.holamundo.com

Despliegue en Apache 
Creamos el virtualhost para la resolución de www.holamundo.com tomando como directorio raíz /var/www/holamundo/public

Reemplazar el contenido
$> vim /etc/apache2/sites-enabled/000-default
<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/holamundo/public
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/holamundo/public>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>
        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>
        ErrorLog ${APACHE_LOG_DIR}/error.log
        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Reiniciamos Apache
$> /etc/init.d/apache2 restart

Comprobamos nuestro hola mundo con el navegador http://www.holamundo.com

Despliegue en Nginx 
Creamos el virtualhost para la resolución de www.holamundo.com tomando como directorio raíz /var/www/holamundo/public
Reemplazar el contenido
$> vim /etc/nginx/sites-enabled/default
server {
    listen   80;
    server_name www.holamundo.com;
    index index.php index.html index.htm;
    set $root_path '/var/www/holamundo/public';
    root $root_path;
    try_files $uri $uri/ @rewrite;
    location @rewrite {
        rewrite ^/(.*)$ /index.php?_url=/$1;
    }
    location ~ \.php {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index /index.php;
        include /etc/nginx/fastcgi_params;
        fastcgi_split_path_info       ^(.+\.php)(/.+)$;
        fastcgi_param PATH_INFO       $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
    location ~* ^/(css|img|js|flv|swf|download)/(.+)$ {
        root $root_path;
    }
    location ~ /\.ht {
        deny all;
    }
}
Reiniciamos Nginx
$> /etc/init.d/nginx restart

Comprobamos nuestro hola mundo con el navegador http://www.holamundo.com