Archivos Mensuales: abril 2008

Declarado el futuro de PHP4

Para los que pensaban que Zend se iba a echar para atrás; pues no; no solamente fue removido el soporte para PHP4 desde el 1 de enero de este año; Zend ha declarado el “end of life” (Fin de vida) de PHP4 e indica que PHP 4.4.8 (el actual release) será el último a ser lanzado por Zend de esta versión de PHP.

Adicionalmente ha declarado que antes del 8 de agosto del presente año (8/8/2008) será removido complemente los fuentes de PHP 4 del servidor de php.net y sus respectivos mirrors.

Así que señores, a migrar sus aplicaciones! …

Viva Go PHP5!

Go PHP5!

Un ppp/options y un peers para Movilnet

Tuve que reinstalar mi equipo (tenia mucho tiempo sin hacerlo, ya era hora) y olvidé respaldar el archivo ppp/options; necesario para configurar las conexiones PPP a través de la red EvDO de Movilnet (me imagino que debe funcionar para Movistar/Digitel).

Inicialmente estaba recibiendo muchos errores del tipo:

PAP Authentication Failed

Si embargo, no era problema del login y password; sino de la forma como se gestionaba la conexión (LCP) y la autenticación PAP; como evidentemente pasé (otra vez) varios días probando opciones hasta que por fín logré una configuración que conecta a la primera (a lo sumo, segundo intento); entonces decidí hacer un artículo posteando ambos archivos para quien tenga problemas para conectarse a la red EvDO de movilnet via linux.

El archivo options

el archivo options va en /etc/ppp/options y es este.

Una de las cosas que caracteriza al archivo options es evitar usar CHAP como medio de autenticación:

-chap

Y forzar siempre PAP

+pap

Además de activar el control por hardware:

crtscts

Y evitar que la conexión se caiga y mantener un enlace persistente:

persist

Hay otras opciones adicionales agregadas; espero que les sean útiles.

El archivo peers

Luego que usas pppconfig para crear una conexión; esta agrega un archivo en /etc/ppp/peers/movilnet

Voy a explicar alguna de las opciones más importantes del archivo.

hide-password
noauth

#Opción donde se guarda los parámetros de conexión del modem EvDO:
connect “/usr/sbin/chat -v -f /etc/chatscripts/movilnet”

debug

#El modem EvDO PCMCIA de Movilnet es una tarjeta EvDO módulo airprime y se monta como este dispositivo:
/dev/ttyUSB0

#Baudrate de la conexión:
115200

#Convertir a esta conexión como la ruta por defecto (ejecuta un route add default gw al gateway de movilnet):
defaultroute

#El IP lo obtengo de la red de movilnet/cantv:
noipdefault

#El username de la conexión:
user “TU TELEFONO@cantv.net”

#Importante: persist mantiene y re-intenta la conexión si no cae la llamada, en vez de salirse:
persist
usepeerdns

#Movilnet no usa compresión de la conexión; por ende, para evitar fallos, agregar esto:
nodeflate

remotename movilnet

Con estas opciones; solo basta ejecutar:

pon movilnet

Y nos conectaremos a la red movilnet, usando el password asignado y como username, nuestro número telefónico (sin el 0416) seguido del dominio (@cantv.net).

Evaluando el proceso de conexión:

Apr 28 14:09:46 lexotanil pppd[4386]: rcvd [IPCP ConfNak id=0x1 <addr 10.17.202.19> <ms-dns1 200.44.32.12> <ms-dns3 192.168.11.35>]
Apr 28 14:09:46 lexotanil pppd[4386]: sent [IPCP ConfReq id=0x2 <compress VJ 0f 01> <addr 10.17.202.19> <ms-dns1 200.44.32.12> <ms-dns3 192.168.11.35>]
Apr 28 14:09:46 lexotanil pppd[4386]: rcvd [CCP ConfReq id=0x2]
Apr 28 14:09:46 lexotanil pppd[4386]: sent [CCP ConfAck id=0x2]
Apr 28 14:09:46 lexotanil pppd[4386]: rcvd [CCP ConfAck id=0x2]
Apr 28 14:09:46 lexotanil pppd[4386]: rcvd [IPCP ConfAck id=0x2 <compress VJ 0f 01> <addr 10.17.202.19> <ms-dns1 200.44.32.12> <ms-dns3 192.168.11.35>]
Apr 28 14:09:46 lexotanil pppd[4386]: local  IP address 10.17.202.19
Apr 28 14:09:46 lexotanil pppd[4386]: remote IP address 192.168.74.97
Apr 28 14:09:46 lexotanil pppd[4386]: primary   DNS address 200.44.32.12
Apr 28 14:09:46 lexotanil pppd[4386]: secondary DNS address 192.168.11.35
Apr 28 14:09:46 lexotanil pppd[4386]: Script /etc/ppp/ip-up started (pid 4405)
Apr 28 14:09:46 lexotanil pppd[4386]: rcvd [CCP TermReq id=0x3]
Apr 28 14:09:46 lexotanil pppd[4386]: CCP terminated by peer
Apr 28 14:09:46 lexotanil pppd[4386]: sent [CCP TermAck id=0x3]
Apr 28 14:09:46 lexotanil pppd[4386]: Compression disabled by peer.

Al recibir “Compression Disabled by peer” y obtenido IP y DNS; la conexión está lista; veremos:

>route -n

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.74.97   0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
0.0.0.0         0.0.0.0         0.0.0.0         U     0      0        0 ppp0

Que tenemos a ppp0 como routa por defecto a Internet.

Notas adicionales

Tomen en cuenta que el hardware (su modem evdo) NO se autentica; por ende, cualquier tarjeta EvDO sirve para conectar con cualquier equipo; así no sea el número de teléfono asociado a ella.

Nota adicional: Traten en lo posible de si usan PPP como gestor de conexión; de desactivar network-manager; este “tumbará” su puerta de enlace por defecto (la de la conexión EvDO) para colocar la puerta de enlace de la red wifi que detecte; además, network-manager cada 10 minutos (al menos he visto ese comportamiento en Debian, Ubuntu y Fedora) intentará ejecutar un dhclient (obtener una IP de un servidor DHCP) para obtener una IP para las interfaces monitorizadas.

[Ponencia] Linux Tweak & Tunning

Durante el CNSL en la ciudad de Valencia realicé una ponencia (lástima que mi querida Daniela Matos “Poguis” no me acompañó a dictar dicha charla!).

Realmente no es una charla, es un taller donde se le va diciendo a la gente que debe hacer en su máquina (compila esto, agrega aquello, instala lo otro); para mejorar el rendimiento de su máquina.

Faltan algunas cosas importantes, otras sobran, iré mejorando el material con el tiempo (y la participación de las personas); pero seguiré agregando contenido útil para que las personas aprendan (y yo también) a mejorar el rendimiento de Linux tanto en desktops como en portátiles.

El enlace para descargar la presentación aquí: tweak & tunning linux.pdf 

Espero comentarios y sugerencias!

¿Podemos tener PHP5 corriendo en un apache2 worker?

La respuesta básica a esta pregunta es sí; la razón de por qué no es tan simple, pero trataré de explicarlo en el siguiente artículo.

Apache 2 con mod_php puede ser ejecutado en dos modos; mpm_prefork y mpm_worker; mpm_prefork es una especie de compatibilidad con apache 1.x y es bueno para aplicaciones que poseen módulos que no son thread-safe; mpm_worker es un sistema multi-proceso multi-threaded (multi-hilado) y requiere que las aplicaciones en él ejecutadas posean hilos seguros de ejecución (thread-safe); mpm_worker es muchisimo más estable y puede ofrecer más conexiones con menos consumo de recursos; además de ser el ideal para equipos multi-core o multi-procesador.

mpm_worker tiene un rendimiento notablemente superior a mpm_prefork en la gran mayoría de las condiciones generales de un servidor web: ver aquí.

Entonces; ¿Por qué se usa mpm_prefork para PHP5? …

Muchas extensiones php5 (y php4) no son thread-safe; esto hace que php5 sea imposible de usar en modo mpm_worker sin “castrarlo” retirando aquellas extensiones que no lo son; sin embargo, esto no es problema alguno, puesto que la gran mayoría de las extensiones no “thread-safe” son básicamente no usadas por la mayoría; un ejemplo es la extensión mm; que permite crear una caché compartida para gestionar las sesiones (y que puede seguramente ser reemplazada por memcached) casi nunca es usada; gd versión 1 debe ser evitada y usar gd2.

Otro mito extendido por esto es que php5 no puede ser ejecutado en modo worker; esto es porque en Debian solo están los binarios compilados en modo prefork y de hecho, instalar php5 desinstala apache2 mpm_worker e instala mpm_prefork; por lo que he decidido compilar mi propio php5 para Debian Lenny (apache 2.2.4 y php 5.2.5) con soporte mpm_worker.

Compilando php5

Primero, debemos instalar algunas librerías que son requeridas (devel) para compilar php5:

>aptitude install libmhash-dev libmhash2 libtidy-dev libgd2-xpm-dev libgd2-xpm libmcrypt-dev libmcrypt4 mcrypt t1lib-bin libt1-dev libxml2-dev libcurl3-dev libaspell-dev libpspell-dev libxslt-dev libbz2-dev libsqlite-dev libdb4.4 db4.4-util libdb4.4++-dev libsqlite3-dev libsnmp-dev

Y luego de descomprimir php-5.2.5.tar.bz2 (descargado de la página de php.net) ejecutamos el siguiente ./configure en la raíz del código fuente:

CFLAGS=”-O3″ CXXFLAGS=”-O3 -fPIC -mtune=nocona -march=nocona \
-fPIC -pipe -fomit-frame-pointer -msse -fexceptions -ffast-math -mfpmath=sse,387″ \
./configure \
–prefix=/usr/php –sysconfdir=/etc/php5/apache2 –mandir=/usr/share/man \
–with-apxs2=/usr/sbin/apxs –libexecdir=/usr/lib/php5 –bindir=/usr/bin –libdir=/usr/lib/php5 \
–with-config-file-path=/etc/php5 –with-config-file-scan-dir=/etc/php5/conf.d \
–with-exec-dir=/usr/lib/php5/libexec –enable-inline-optimization \
–disable-debug –with-curl –with-curlwrappers –with-db4 \
–with-zlib=/usr –enable-bcmath –enable-calendar –enable-mbstring –enable-dba \
–with-libxml-dir=/usr –with-xmlrpc=shared –with-pear=/usr/share/php –with-regex \
–with-pcre-regex=/usr –enable-exif –with-t1lib –with-xsl \
–with-mhash –with-mcrypt –enable-zend-multibyte –with-pspell –enable-zip –enable-bcmath \
–with-jpeg-dir=/usr –enable-soap –enable-sockets –with-xpm-dir=/usr –with-freetype-dir=/usr/lib \
–enable-ftp –with-gd –with-png-dir=/usr –with-ttf \
–enable-json –with-mime-magic –with-tidy=/usr –with-ldap –with-xmlrpc \
–enable-gd-native-ttf –enable-gd-jis-conv –with-gettext –with-xmlrpc –with-xsl \
–with-mysql –with-mysqli \
–enable-sysvmsg –enable-sysvsem –enable-sysvshm –enable-sigchild \
–with-ldap –enable-mbstring –with-bz2 –with-iconv –with-gettext –enable-shmop \
–enable-sockets –enable-wddx –with-zlib \
–with-kerberos=/usr –with-openssl=/usr –enable-soap –with-snmp=/usr \
–with-pgsql –with-sqlite=/usr \
–enable-pdo –without-pdo-dblib –with-pdo-mysql \
–with-pdo-pgsql –with-pdo-sqlite=/usr

ejecutar:

make all

y luego:

make test

permitirá compilar y luego probar nuestro php5 en modo mpm_worker; al final un:

make install

permitirá instalar php5.2.5

Explicando brevemente las sentencias de pre-procesador:

Como verán, antes del .configure hemos ejecutado unas sentencias que mejoran el rendimiento del ejecutable php; entre ellas compilarla para el procesador que actualmente tenemos; en mi caso -mtune=nocona -march=nocona; nocona indica un procesador de doble nucleo (Core2-Duo), existen distintos modos dependiendo del ejecutable; pentium4, pentium-m, athlon-xp, prescott; siempre es bueno leer sobre -mtune y -march en el wiki de gentoo y en la guía de Compilación optimizada de Gentoo.

Apache Benchmark en un php5 con mpm_worker:

Para la ejecución de una aplicación PHP ab reporta:

ab -c 500 -n 500 http://localhost/tomates/

Requests per second: 32.66 [#/sec] (mean)

Conclusiones:

Espero que la utilización correcta de las extensiones de php; la utilización de un php thread-safe en un apache2 mpm_worker permitan a los desarrolladores crear aplicaciones más óptimas y a los servidores proveer una versión más rápida de php5 ejecutado sobre apache.

Notas finales:

La sentencia de compilación está configurada para el enviroment de debian o fedora (/etc/php5 como ruta del archivo php.ini); recuerden revisar bien el –prefix, –libdir, –bindir y otras rutas dependiendo de la distro donde deseen compilar el php5 en modo worker.

Servicio público

Hay dos cosas que siempre me caen mal y nunca entenderé de las gentes estresadas y sin sentido real de la vida de las ciudades; el no detenerse a contemplar las cosas hermosas de la vida (tomarse un café, admirar una mujer hermosa, disfrutar de un atardecer) y el perder toda fuerza de hacer ciudadanía y ayudar al prójimo sin esperar alguna “recompensa” a cambio; este factor hace que la gente viva eternamente estresada; desorientada y en enemistad con el resto de los habitantes de la ciudad; ver como una ciudad se convierte en una metropoli de almas de piedra es horrible, frio y terriblemente patético.

Me encontraba en San Cristóbal y en una transitada vía que va hacia Pueblo Nuevo, nos encontramos una gran cola de vehículos, dicha cola era en hora pico, de tal manera que era insoportable; cuando llegamos al final de la cola nos encontramos con una gran rama de arbol obstruyendo 2 canales (el de servicio y el del medio) y por ende, la gente pasaba despacio por un lado; le exclamé a Walter ¡Dios, que falta de conciencia ciudadana!; ¿Acaso nadie se puede bajar a ayudar a mover esa rama que les está afectando el tránsito y los está haciendo llegar tarde al almuerzo?; por lo visto no, habian pasado varias horas y la gente solo esperaba a algún operativo del gobierno para que se llevara la rama.

Nunca me ha gustado ser un inútil dependiente del gobierno y mucho menos, ser un “habitante” en vez de un “ciudadano” de donde me encuentre;  y le dije a Walter que orillaramos el vehículo y nos dedicaramos a mover esa gran rama para al menos, liberar un canal de tráfico y que hubiera más paso para todos (dije, “tal vez nuestra acción estimula a alguien y nos ayuda”); durante el proceso de liberar el canal de la rama que obstruía el paso cruzaron:
Un autobús de la UNET lleno de estudiantes
Una camioneta llena de chamos que decian “recien graduados de Ing. Industrial”
Un tipo que nos insultó por estar atravesados (como si fueramos culpables de tumbar el árbol) y nos lanzó su camioneta encima
Miles de carros más que miraban “consternados” como alguien puede ensuciarse las manos para mover un arbol sin que le estén pagando …

dsc00499.jpg
Primera foto; estamos viendo como mover la rama

dsc00498.jpg
Procediendo a mover el árbol

He de comentar que por accidente me corté la mano y empecé a sangrar, pero eso no evitó que removieramos la rama y lograramos destrancar el tráfico; aunque ni un “gracias” o “hurra” se escuchó de los vehículos (incluso uno pasó arrecho como a 90km/h como a 5 centímetros de walter, que si no se quita del canal recien destrancado, lo atropellan).

¿Qué le pasa a la gente que ya ni en las cosas que les afectan ayuda a los demás, o incluso a sí mismo?; ¿Cuanta desidia más se acumulará dentro de la población?… ¿Y así esperan que un país surja adelante? …

Por cosas como esta es que el venezolano vota por fórmulas mesiánicas; ya que le da pereza construir el país que desea con sus propias manos y espera a que los demás resuelvan los problemas …

[Ponencia] Bases de datos en Software Libre

El día 10 de abril (como en otros eventos de Emprendedores de Software Libre auspiciados por CNTI) me tocó realizar el cierre del evento en el estado Táchira con una ponencia que he dado en llamar “Base de datos en Software Libre”; en ella enfoco y desmiento la gran mayoría de mitos existentes en el software libre alrededor de los manejadores de bases de datos y expongo las bases de datos libres y de código abierto más comunes actualmente, algunos “benchmarks oficiales” y una que otra idea interesante.

La versión en PDF de la ponencia está aqui: PDF base de datos libres

Esta presentación corresponde a la teoría del Taller “Migración de bases de datos en SL” que realizaré en algunas sedes (como Maracaibo) del Congreso Nacional de Software Libre (CNSL) a partir del 18 de Abril.

Actualización: por migración de blog, el PDF de la ponencia pueden encontrarlo acá: PDF base de datos libres

xdebug y PHP5 – Haciendo profiling de aplicaciones

Hacer profiling de aplicaciones consiste en hacer un mapa (trace) de todas las ejecuciones realizadas por nuestra aplicación con el respectivo tiempo (de CPU, en milisegundos, consumo de RAM, etc) consumido para determinar posibles mejoras en el código, cuellos de botella (bottlenecks) etc.

Quien pensaba que esto era solo una característica de lenguajes como C (que tienen a Valgrind) entonces conozcan la característica de Profiling de Xdebug.

Para instalar Xdebug existen numerosas guías y artículos, me centraré en la posibilidad de realizar el profile de una aplicación como tal.

Configurando xdebug

Para la activación de xdebug he creado un archivo (dentro del directorio conf.d de php5) llamado xdebug.ini que contendrá las instrucciones para activar la extensión y activar de una vez el profiling.

como root:

>touch /etc/php5/conf.d/xdebug.ini

luego, agregamos:

>vim /etc/php5/conf.d/xdebug.ini

zend_extension_ts=”/usr/lib/php5/extensions/no-debug-zts-20060613/xdebug.so”
[xdebug]
xdebug.profiler_enable=1
xdebug.profiler_output_dir=/tmp/php5/profiler

donde fijense que la ruta es donde phpize envía mis extensiones (en este caso, xdebug.so)

Agrego adicionalmente una sección xdebug (se agradece mantener ordenado los archivos ini) y activar “profiler_enable” (1 lo activa, 0 lo desactiva) e indicar la ruta (especificada por profiler_output_dir) donde se ha de crear el archivo de profiling.

guardamos:

:wq!

y reiniciamos nuestro apache:

>/etc/init.d/apache2 restart

En este momento, todas las aplicaciones que ejecutemos de php en nuestro servidor local, generarán un perfil de ejecución en la ruta indicada en profiler.output_dir

Ejecutando la aplicación

Ejecutar la aplicación es simplemente … … “ejecutar la aplicación!” … ya está, sin magia ni trucos …

dentro del directorio indicado se han creado unos archivos, cada uno con un timestamp de ejecución:

cachegrind.out.4286  cachegrind.out.4287  cachegrind.out.4288

Cada archivo es un archivo de texto, conteniendo el perfil de ejecución de la aplicación; ahora bien, ¿con qué lo vemos de una manera más “entendible”? …

Instalando y ejecutando Kcachegrind 

Bueno, el archivo es compatible con los archivos generados por valgrind; así que instalaremos una aplicación para KDE llamada Kcachegrind; simplemente:

>aptitude install kcachegrind

y  luego ejecuten la aplicación (kcachegrind)

Estudiando el perfil

kcachegrind consta de una ventana de 3 paneles:

pantallazo.png

El panel de la izquierda muestra las distintas funciones ejecutadas, desde el comienzo hasta el final, indicando en qué archivo se encontraban, cuando del porcentaje total de ejecución se han consumido y cuanto tiempo en milisegundos les ha tomado en ejecutarse; el panel superior derecho muestra las líneas de código que representa la función seleccionada en el panel derecho y la parte inferior derecha muestra un mapa como este:

profiler.png

Que representa todo el camino (ciclo) de ejecución del código desde donde estamos hasta el final de la ejecución de la clase (objeto), función o archivo seleccionado.

Detectando bottlenecks (cuellos de botella)

Detectar cuellos de botella es fácil de esta manera, simplemente buscamos los mayores tiempos de ejecución y revisamos bloque a bloque hasta encontrar la línea (o líneas) de código que representan la mayor cantidad de tiempo consumido.

bloque.png

De la siguiente ventana de bloque de código deducimos que splib_tomates::init (una función estática de la clase splib_tomates) tiene una duración de 41.10 ms en la línea 57 (call to splib_config::init en el archivo splib_config.php); para no tener que buscar ese archivo en la lista de profiler; simplemente con hacer doble click sobre la linea seleccionada se abrirá el bloque de código (función, archivo) que representa ese bloque de código.

En revisión posterior; determiné que el exceso de tiempo ocurría porque estaba llamando a una librería de caché (de terceros) que estaba ejecutando varios NOTICE y WARNING (aunque Tomates removía los errores); al retirar la librería, se pudo reducir ese tiempo a 26ms.

Conclusiones

No en el 10, el 20 o el 50; casi en el 100% de las aplicaciones web en PHP; los errores y lentitud de ejecución son fáciles de determinar y corregir si todos los desarrolladores antes de liberar una aplicación, ejecutaran debugging y profiling de su código más frecuentemente, realizaran y liberaran pruebas y mantuvieran a raya los “bottlenecks”; pero ya sabemos que eso no ocurre muy a menudo así que queda de parte de los nuevos desarrolladores aprender este tipo de técnicas para mejorar en el desarrollo de sus aplicaciones.

Fallos y cuelgues en Eclipse PDT (standalone edition) en Debian

Hace algún tiempo escribí los miles de fallos, cuelgues raros y errores que generaba la versión standalone de Eclipse PDT en Debian (y la versión plugin era horrorosamente lenta!); la razón es que la mitad de Java 1.6 en Debian está corrupto o causa errores extraños (ya me ha pasado con otras aplicaciones Java como Druid o Power Architect).

La forma medio extraña y jocosa de resolver la situación es seguir la siguiente receta:

  • Descargarse el último Java 1.6 de la página de Sun (la versión tar.gz descomprimible, el rpm no sirve en Debian si usas alien).
  • Descomprimir en una carpeta x (yo lo puse en /home/jesuslara/jre1.6.0_05/)
  • Crear un enlace simbólico (si, verdad que es raro?) con el nombre jre de la carpeta anterior dentro de la carpeta principal de Eclipse

En mi caso, he descomprimido el PDT en /home/jesuslara/eclipse por lo que he ejecutado en consola:

cd eclipse

ln -s  /home/jesuslara/jre1.6.0_05/ jre

Pueden ver que se ha creado en:

ls -l

lrwxrwxrwx  1 root      root          28 mar 24 03:05 jre -> /home/jesuslara/jre1.6.0_05/
y ejecuten Eclipse, verán que entre las variables de entorno (Help > About … > Configuration Details …)  verán los siguientes interesantes cambios:

java.class.version=50.0
java.home=/home/jesuslara/jre1.6.0_05
java.runtime.version=1.6.0_05-b12
java.specification.name=Java Platform API Specification
java.specification.vendor=Sun Microsystems Inc.
java.specification.version=1.6
java.version=1.6.0_05

Lo que nunca podremos resolver es que sea 150x veces más pesado que Komodo IDE; al menos es de agradecer que sea licencia Apache.

Aunque con estos cambios, ¡les aseguro! que les agradará el cambio no solo en el performance sino la eliminación de todos (bueno, casi todos :p) los fallos y cuelgues del Eclipse PDT corriendo en Debian.

PHP5 / Eclipse PDT y Subversion

Una de las interesantes características por las cuales he usado Eclipse PDT en estos días es por su capacidad de conectarse a un recurso SVN para de manera automática gestionar todo el proceso de desarrollo conectado a un sistema de versiones como Subversion.

En el caso de PHP5, Eclipse PDT puede usar (al igual que cualquier suite basada en eclipse) subclipse; subclipse es un plugin para Eclipse que permite gestionar todo el proceso básico de trabajo con un sistema de versiones (add, update, commit, diff, merge son realizados casi sin ningún problema).

Como instalarlo

Para instalarlo tenemos que ir al menú Help -> Software Updates -> Find and Install …

En la ventana que aparece debemos indicar que vamos a instalar nuevas características (“Search for new features to install” y Next >)

En la ventana de componentes, indicamos que deseamos agregar un nuevo remote site …

El Plugin que vamos a agregar es el siguiente:

Name: Subclipse 1.2.x (Eclipse 3.2+)
URL: http://subclipse.tigris.org/update_1.2.x

Siguiendo los pasos de “next, next, next, finish” (:D ¡Que dificil es Linux!) tendremos nuestro plugin funcionando correctamente.

Nuestros primeros “pinitos” con Subclipse

Aun cuando subclipe tiene la posibilidad de hacer Checkout y agregarlo como un proyecto nuevo en nuestro arbol de proyectos; realmente preferí hacerlo de la manera tradicional; en mi caso:

Una consola:

>svn co http://svn.covetel.com.ve/tomates/trunk/ tomates/

*he descargado de mi sitio web una copia del fuente de Tomates Framework.

Me ha creado una carpeta donde yo me encontraba (en este caso, /var/www/tomates/) y puedo usar ahora esa carpeta como proyecto de Eclipse.

Creando un proyecto de Eclipse PDT

En la perspectiva PHP (menú Window -> Open Perspective -> PHP) indicar File -> new -> PHP Project

Llenar la ventana siguiente con los datos del proyecto (ruta, nombre, si es PHP5 especificamente, etc)

pantallazo-php-project.png

Luego de llenados los datos, presionen Finish y se creará un árbol de proyecto como el siguiente:

php-project.png

Ahora solamente basta con sincronizar dicho proyecto con un repositorio existente:

En la perspectiva SVN Repository ejecutamos botón derecho > New  >  Repository Location … En la ventana (para qué screenshot?, si tiene un único cuadro de texto!) agregamos el URL del repositorio SVN, Finish! y este es cargado como un repositorio de trabajo.

La otra forma consiste en Botón derecho sobre el proyecto > Team > Share Project e indicar “New repository” en la opción de “cual repositorio se usará” para el proyecto actual.

El Menú Team

El menú Team se actualiza una vez que nuestro proyecto está asociado a un repositorio SVN; este muestra las distintas tareas que se pueden realizar con nuestro proyecto y su sincronización con el repositorio:

menu-team.png

La primera opción nos permite sincronizarnos con el repositorio para comenzar a trabajar (esta opción llena la perspectiva “Team Synchronizing Perspective” y es una perspectiva que me permite gestionar el estado de mi repositorio (mensajes de error, SVN annotates, estado de los conflictos de código, anteriormente tareas bastante engorrosas de hacer por consola y hacerlas con rapidSVN era como estar desligado del proceso mismo de desarrollo).

Comandos SVN: Su equivalencia con el Menú Team

svn update -> Update:  permite mantenernos actualizados con el código que terceros de nuestro proyecto han realizado.

svn commit -> Commit … permite agregar nuestros cambios al repositorio ; de manera interesante, Commit … gestiona automáticamente todo archivo nuevo que agreguemos y todo archivo que borremos, de manera que Commit … es una fusión de los comandos svn add y svn delete.

svn merge -> Merge … muchas veces tenemos código escrito por distintos programadores en distintas partes de un mismo archivo, svn merge permite fusionar el código de sectores diferentes

svn diff -> create patch … Si un archivo contiene diferencias a la versión que se encuentra en el repositorio y deseamos crear un patch (archivo de cambios), hacemos click sobre el archivo en conflicto y ejecutamos Team -> create patch …

Enviando nuestros cambios al servidor

Si somos muy activos escribiendo código entonces commit … es una de las ventanas que más usaremos; commit puede actuar sobre el proyecto entero (haciendo click sobre el proyecto, botón derecho > Team > commit …) con lo cual se agregarán todos los cambios globales realizados, o a nivel de un archivo único o carpeta (haciendo click en el archivo o carpeta específicos, puedo realizar botón derecho > Team > Commit … y solo se enviarán los cambios en dicho archivo).

commit.png

Fijense en la ventana anterior; además de la posibilidad de un comentario (svn commit -m ‘comentario’ como se hace en consola), fijense que commit … ha detectado que he borrado un archivo y he agregado una carpeta (aparecen como deleted y unversioned) además de el archivo modificado (que aparece marcado como modified); las carpetas .settings y .project son del Eclipse así que eso no lo envio al repositorio (aunque debería ocultarlo o algo así).

Pero me equivoqué!

Revertir cambios no deseados para no contaminar el repositorio es tan sencillo como detenerse en el archivo (o carpeta, en caso de ser muchos) y ejecutar Team > revert y los cambios serán regresados a la última revisión del repositorio sin causar conflicto entre archivo local y remoto.

Resolviendo diferencias

Otra de las cosas interesantes de Subclipse es la posibilidad de revisar en “Team Synchronizing Perspective” la posibilidad de que existan archivos con diferencias entre la versión local y la versión en el repositorio; para esto:

conflict.png

Al abrir un archivo en la perspectiva “Team Synchronization” veremos nuestro archivo local a la izquiera y el remoto a la derecha; las diferencias vendrán marcadas por una linea negra rodeando el sector de código diferente y un cuadro negro por cada diferencia en la scrollbar; con los botones de arriba podemos copiar el código de un lado a otro del archivo o resolver las diferencias no-conflictivas (para las conflictivas tendremos que editar nuestro código :p).

Para cuando hemos terminado de resolver los conflictos, podemos ejecutar botón derecho sobre el archivo “Mark as Resolved” o en caso de haber realizado un Merge de código “Mark as Merged” y posteriormente Commit … para así guardar los cambios en nuestro repositorio.

La estabilidad, creando branches

Si el proyecto es muy activo (o está en fases iniciales) y llegamos a un punto donde declaramos una cierta “estabilidad” al código, pero queremos seguir agregando cambios (sin afectar que los usuarios finales puedan descargar el código para su uso o prueba) decretamos la creación de una branch (rama) que no es más que la declaración de un release de nuestro código en el repositorio; es tan facil como hacer click en nuestro proyecto y ejecutar botón derecho > Team > Branches/Tags y definir hacia donde va el código de la nueva rama (en el caso de tomates, http://svn.covetel.com.ve/tomates/branches/).

Ver lo que los demás han hecho y comentado

Por lo general los comentarios de cada revisión y las anotaciones en la rama SVN ayudan de mucho a saber que están haciendo los programadores y a continuar el trabajo sin pasar media hora dando vueltas a ver que cosas nuevas agregaron; Team > view comments y Team > View History me permite ver las anotaciones y la historia de las revisiones del repositorio actual.

Conclusiones

Para un usuario de GUI e IDE’s esto es una caraterística más que nos mantiene acostumbrados al uso de herramientas de desarrollo fáciles y rápidas, es de agradecer las capacidades de mantener a mi equipo de desarrollo sincronizados con los cambios sin tener que estar ejecutando comandos por consola o preocupandose por algo más que contribuir con código al proyecto; también es de hacer notar que si un abyecto y abnegado usuario de vim (muy potente editor por cierto) como walter (alias elsanto) ha dejado de usar vim para programar para unirse a los usuarios de Eclipse (en su caso como le gusta javascript/jquery usa aptana IDE) y de verdad comenzar a trabajar de manera colaborativa y sin estar ejecutando comandos raros en la consola.

Ser uno mismo …

Del anterior post se derivará una serie de textos; cosas que he escrito en los últimos 10 a 15 años y que he estado recuperando; de un documento (parte de mi diario) bastante largo se deriva este párrafo que he dado en llamar “ser uno mismo … ” (de esas retóricas con el psiquiatra de por qué la gente es así y el bendito consejo de que debe ser uno mismo …).

Lunes 29 de Julio 1998

¿Ser yo mismo?… tan falso es eso; allá afuera la gente ni siquiera sabe quien es; no se reconocerían en su propia mente aun cuando tuvieran el mismo nombre y solo le cambiaras el cuerpo, son solo máscaras de lujo paseándose por clubes caros, por discos de moda y por eventos de fama, o se encuentran solo actuando en sus casas; pero ninguno sabe qué son y donde están parados, para qué sirven, donde les queda el piso, donde les queda el mundo, como se llega a él, como establecen los limites de la delgada línea entre nuestra conciencia y la ajena, como empezamos a impregnar almas y conciencias ajenas y dejamos de ser algodones para las demás…

Como logramos esa independencia y esa separación del mundo?… allá afuera las gentes solo esperan que la forma como llevan su vida sea la correcta; esperan ser aceptados como nuevo producto de mercado, yo por lo menos no sé quien soy en la razón y en la personalidad; pero ahí voy, mejorando cada día…
Espero que nadie se enoje conmigo…
La gente espera que su vida sea igual que su católica muerte, todos van allá con la incertidumbre si lo hicieron bien en esta vida, si en verdad Dios existe, y si existe, le rezaron al verdadero y único;  lo peor es que olvidan la esencia del ser y vivir sin estar atados a esas incógnitas de cómo será el juicio de nuestra vida, en verdad no sé si Anubis pesará mi corazón en su balanza o re-encarnaré en un Canguro Wallaby, prefiero ser juzgado correctamente aquí por mis congéneres seres humanos y no preocuparme porque alguna divinidad extraña me quiera o no; con tal, si en ningún momento se ha manifestado hacia este lado, como puedo saber que quiere?.-…

Si; como un producto, la gente espera en esta sociedad ser vista como un producto, como aquél juguete que compraste en tu infancia que querías mucho pero en verdad era una inutilidad que no tenia ni pies ni cabeza, como esos nuevos juegos de Mattel, algo muy lindo sin utilidad propia; pero, si esa fachada linda es aceptada… todos te querrán y verás como tu mundo empieza a girar en torno a ellos…

lo triste del caso es que nunca nadie girará alrededor de tu ser, porque serás como los académicos de la edad media, que creían que los astros giraban a su alrededor pues así lo veían ellos, y ellos mismos estaban tan equivocados…

Gracias a Dios soy un destornillador, muy flaco y sin forma aparente… feo… insignificante… pero sé mi utilidad y sé como ser aceptado, como el mejor de los utilitarios; en contra de ser aceptado como la mejor de las fachadas; eso sí, nunca estaré en las alcobas o en los baños, en los recibos o las salas de estar y reposo de las conciencias de las personas; no apareceré decorando estantes o grandes muebles de salón, pero por lo menos sabré en que punto de su casa estoy, y estoy más que seguro que durante una mudanza… no seré arrojado a la basura por inutilidad…
Creo por ello que cada día salen productos y adornos nuevos y por 200 años el destornillador ha seguido igual (incluso le ponen motor!)…

¿Deseas ser una decoración o un artefacto utilitario? … de tu respuesta girará tu vida …

y en gran parte, es lo que significa “ser uno mismo” …

A %d blogueros les gusta esto: