Archive

Archive for the ‘documentación’ Category

Guía de puntos críticos al actualizar PHP

October 18, 2014 Leave a comment

Si, como nosotros en BeezNest, con Chamilo, tiene que tomar a cargo el mantenimiento de una aplicación PHP masiva (varios cientos de miles de líneas) en el tiempo, esta guía le será útil.

En muchas oportunidades, tendrá que asegurar que su sistema soporte actualizaciones de PHP, y también que soporte varias versiones al mismo tiempo, según los casos presentados por sus clientes.

Habiendo desarrollado una aplicación años atrás, con las tecnologías del momento, tendrá que modificar el código para asegurar el soporte de cada nueva versión de PHP. En esto no solo tendrá que actualizar el código que usa cosas abandonadas (deprecated) en la siguiente versión de PHP, sino también tendrá, si desea asegurar el soporte de versiones anteriores, que asegurar que su sistema funcione con la menor versión posible de PHP.

Ante todo, es importante ubicar los cambios notables entre versiones de PHP. Para ello, puede consultar la página de Changelog de PHP 5 si desea todos los detalles, o la página de apéndice con los procedimientos de actualización de una versión a otra de PHP si prefiere una versión más explicada.

Si bien es cierto no todas las versiones de PHP fueron de la 5, es importante entender que hoy en día la versión 4 de PHP es muy insuficiente para hacer cualquier aplicación compleja, y probablemente no esté soportada por la mayoría de servidores existentes, pero también podemos estar relativamente tranquilos mirando hacia el futuro: si bien existieron grandes planes para PHP 6 (con un gran enfoque en la internacionalización) hacen unos años, estos planes se quedaron dormidos por ahora y la comunidad de desarrolladores de PHP se está principalmente enfocando en nuevas versiones de PHP 5.*.

La lista que les entrego aquí es una lista *resumida* proviniente de los procedimientos de actualización en la página indicada arriba, y que considero una lista suficiente para el 90% de las aplicaciones.

De PHP 5.2 a 5.3

  • Aparición de los namespaces
  • Aparición de los closures (funciones sin nombre)
  • Aparición del operador ternario ( COND ? A : B; )
  • Aparición del acceso dinámico a clases estáticas tipo $clase::$prop
  • Aparición de excepciones anidadas
  • Garbage colector cíclico (no implica ningún cambio pero reduce las fugas de memoria con objetos que contienen objetos)

De PHP 5.3 a 5.4

  • Aparición de traits
  • Habilitación de $this en los closures
  • Aparición de forma corta de definición de arrays tipo $a = [1, 2, 3];
  • Aparición de la dereferencia de arrays, tipo foo()[0]
  • Habilitación automática de la posibilidad de usar la forma corta de tag PHP “<?=”
  • Habilitación de la posibilidad de usar la forma corta (new Foo)->bar()
  • Mejora (o sea… cambio) en los mensajes de errores (ayudando al debug de aplicaciones PHP)
  • Habilitación general de la funcionalidad de progreso de subida (upload progress) que anteriormente requería un módulo de PEAR. Esto es lo que permite mostrar, en una página en PHP con JS, una barra de progreso mientras el archivo está siendo subido.

De PHP 5.4 a 5.5

  • Aparición de los generators
  • Habilitación de la forma: foreach ($array as list($ a, $b))
  • Habilitación de la dereferenciación para strings y arrays: echo [1, 2, 3][0]; / echo ‘PHP'[0];
  • Inclusión fácil de Zend OPCache (Zend Optimizer Plus), permitiendo un remplazo de APC, que definitivamente generaba un montón de inconsistencias con sistemas complejos como Drupal y WordPress, entre otros, con más estabilidad y un poco más de eficiencia (ver el Benchmark de Zend OPCode)
  • Inclusión del formato WebP (la versión imágenes del codec WebM de Google) en GD

De PHP 5.5 a 5.6

  • Aparición de Variadic, un mecanismo para declarar una función con una cantidad de parámetros variable
  • Escaladores de constantes, tipo TWO = ONE*2
  • Aparición del operador de exponente (antes “pow()”) como “a**b” (2**3 = 8)
  • Aparición del stream php://input
  • Habilitación del soporte de archivos de tamaño superior a 2GB (large files uploads)
  • Mejoras importantes de seguridad dentro de la librería mcrypt.

Es importante entender que, si bien todas estas mejoras son buenas para PHP y sus aplicaciones, solo podrá usarlas si “abandona” el soporte para una versión anterior de PHP.

Por ejemplo, si quiere usar Zend OPCache dentro de su aplicación como elemento obligatorio, su aplicación deberá indicar muy claramente que funciona con versiones de PHP “a partir de PHP 5.5”.

Existen mecanismos alternativos, a veces, que permiten ofrecer un soporte de versiones anteriores y, si alguna funcionalidad más eficiente está presente, usarla, pero en la práctica muchas no lo permiten. Por lo tanto, ofrecer el soporte para versiones anteriores de PHP también implica menor eficiencia para aplicaciones grandes en ambientes muy exigentes.

Chamilo

Chamilo LMS es un sistema de e-learning de software libre, que tiene como objetivo ofrecer herramientas potentes para la mejora de la educación y de la disponibilidad de esta para toda la humanidad. Sus características principales son: extrema usabilidad y poco uso de recursos. Puede descargar Chamilo desde su sitio web: http://www.chamilo.org o probarlo gratuitamente en https://campus.chamilo.org.

BeezNest

BeezNest es una organización internacional (be, es, fr, de, uk, pe, mx) creada en el 2002, que desarrolla el software Chamilo LMS y se especializa en ofrecer toda la gama de servicios especializados (consultoría, implementación, instalación, modificación, capacitación, alojamiento, etc) sobre este software, y optimización de servidores web que permiten alcanzar mayor productividad con sus aplicaciones web en PHP.

Consideraciones antes de usar certificados SSL en SHA-256

Nota: A partir del mes de noviembre del 2014 y la publicación de Chrome 39, este navegador generará una página de error al momento de tratar con un certificado SSL en SHA-1, eliminando rápidamente la posibilidad de usar de manera seria un certificado que sea inferior a SHA-256. Por lo tanto, el artículo siguiente, redactado hacen unos meses, quedaría bastante inútil.

Aunque muchas autoridades de certificación anunciaron que dentro de los próximos meses (algunos al inicio del 2015, otros al inicio del 2016) iban a rechazar los certificados en SHA-1, es importante tomar conciencia que no todo está listo para ofrecer un sitio web HTTPS con certificado SSL en SHA-1, y es que Windows XP (el cual fue abandonado por su creadora Microsoft, el 8 de Abril del 2014) no soporta SHA-2 (esto incluye a SHA-256), a menos que esté actualizado con el Service Pack 3.

Y esto, en América Latina (y probablemente en otras partes del mundo) sigue siendo un problema importante, dado que el uso de Windows XP, en Abril 2014, sigue siendo del 17% de todos los sistemas operativos con un navegador de escritorio. De estos, es difícil decir quienes no actualizaron al Service Pack 3, pero conociendo la conectividad a internet promedia, sería curioso que supere los 50%.

StatCounter-os-sa-monthly-201401-201404

Probablemente, entonces, tengamos todavía algo de 8.5% de usuarios con un sistema operativo (independiente del navegador) que no soporte SHA-2.

Por ello, cuidado al momento de generar un nuevo certificado SSL. Piensen a hacer el balance correcto entre seguridad e inclusión.

Cuidado también al momento de revisar una computadora Windows XP con un problema de acceso a un sitio con SHA-2: no necesariamente sea el mismo problema. Puede que tenga el SP3, y entonces? Pues entonces es muy probable que el problema esté en el Firewall. En particular, últimamente observamos que una opción que tenía un título del tipo “Activar la verificación sistemática de certificados SSL”. Al desactivar esta opción, volvió a funcionar.

1 laptop + 2 lcd = 3 pantallas para un solo escritorio, bajo Linux

December 18, 2013 Leave a comment

Por los que están interesados en aumentar su capacidad de visualización de aplicaciones en su lugar de trabajo, los costos empiezan a ponerse democráticos (pantalla 19″ alrededor de $100, adaptadores también) para extender su laptop no con una pantalla más, sino con 2.

El tema es que las cosas todavía no son “tan” sencillas (pero deberían serlo dentro de muy poco) para usuarios de Linux, porque el kernel 3.11 (el estable usado en Ubuntu 13.10) no tiene un muy buen soporte para el tipo de extensión necesario.

No os preocupeis demasiado, que el kernel 3.12 en realidad es muy sencillo instalar, gracias a nuestros amigos de Ubuntu Handbook, quienes nos dan una lista de 4 comandos que entrar en una terminal para actualizar Ubuntu 13.10 al kernel deseao. Bueno, ojo que conlleva unos riesgos, ya que podría no funcionar bien su Ubuntu con este kernel (depende mucho del hardware que uno tenga, y de los drivers que fueron instalados en este), pero de generar problemas, basta con ir a ver las opciones avanzadas de arranque de Ubuntu, seleccionar el kernel anterior (3.11) en modo normal, para volver al modo anterior y desinstalar el kernel no funcional.

En mi caso particular, como lo iba a explicar, funcionó todo bien. Seguí las instrucciones del blog de Ubuntu Handbook y reinicié mi máquina, y ya funcionó la tercera pantalla. Demostración? Aquí va…Image

(la captura está en francés, pero ya os dais una idea de lo que representa)

Entonces, cual es lo que teneis que hacer ahí? Pues es bastante simple…

Primero, hay que tener una computadora (cualquiera) con Ubuntu instalada (Debian va también), una pantalla adicional (no es necesario tener 2, pero si solo teneis una, no importa mucho fregarse todo este procedimiento) y, muy importante, un adaptador USB a VGA (o DVI).

Por ejemplo, yo me compré un Trendnet TU2-DVIV por alrededor de 50€ en una tienda cercana y me funciona bien.

Una vez todo este material listo, quizás querais probar sin actualizar el kernel. Con suerte, funciona: solo hay que prender la pantalla, conectar el cable VGA al adaptador y enchufar el otro lado del adaptador en el puerto USB de la compu. De ahí es probable que haya que ir a Configuración -> Monitores para dar clic en “Detectar pantallas”, y luego (clic en la tercera pantalla detectada) activar esta nueva pantalla (no se porque, en mi caso no se había activado sola).

Si no se detecta ninguna nueva pantalla, hay que actualizar el kernel al 3.12. Para esto, seguir el procedimiento del Ubuntu Handbook descrito arriba, reiniciar e ir a la sección Configuración -> Monitores y (me repito) activar esta tercera pantalla. Quizás reposicionarlas un poco, y listo!

Espero haya sido útil para los que no tienen idea de como hacerlo (como yo hace una semana). Ojo que se puede poner más de una pantalla via USB, dependiendo de la cantidad de puertos libres que tiene.

Montar partición sobre un archivo

October 7, 2013 Leave a comment

Si necesitas una partición adicional en un servidor en la nube ó necesitas particionar en caliente (mientras tu pc ó servidor está corriendo) entonces te será muy útil lo siguiente.

En Linux es posible usar un loop device como una partición virtual, para ello se apoya en el módulo loop dentro del kernel, el cual está disponible dentro de la mayoría de  distribuciones. De esta manera tenemos almacenado dentro de un solo archivo todo el contenido que un disco o partición de disco podría almacenar.

En nuestro caso fue aplicado dentro de Ubuntu y Debian aunque no debería haber ningún problema si es otra distribución. Empecemos.

Lo primero que haremos es habilitar el módulo

modprobe loop

verificamos que esté habilitado

lsmod | grep loop

Si en caso no se encuentra o tampoco aparece en /dev/loop*, agregar en el archivo /etc/modules

loop
lp

Y reiniciamos el SO

Usamos dd para crear un archivo de 1GB, en este archivo será donde irá toda nuestra partición

dd if=/dev/zero of=/opt/vdisk count=2048000

Lo atamos a cualquier loop device

losetup /dev/loop0 /opt/vdisk

Verificamos que esté correctamente atado

losetup -a
/dev/loop0: [fe00]:786448 (/opt/vdisk)

Y ya tenemos nuestra partición, luego procedemos a formatearla para poder “montarla” como una unidad cualquiera y poder usarlo.

mkfs.ext4 /dev/loop0

Creamos el directorio donde montaremos la partición.

mkdir /mnt/virtual

Montamos el loop device, recordar usar el mismo loop que uso líneas arriba.

mount /dev/loop0 /mnt/virtual

Si quisieramos desligar el loop device del archivo

umount /mnt/virtual
losetup -d /dev/loop0

Probablemente de usarlo frecuentemente sea necesario que se monte automaticamente tras cada inicio del SO, esto es posible añadiendo al archivo /etc/fstab

/opt/vdisk      /mnt/virtual       ext4   loop=/dev/loop0,user,auto,noatime       0 0

Y listo! Ya tenemos nuestra partición “virtual”.

Hacer cropping de vídeos con mencoder

Si alguna vez tuvo que recortar un vídeo (para quitar una barra de dirección en un screencast, por ejemplo), sabe que puede ser tedioso.

Si no lo hizo, esperamos este tutorial le sea de gran ayuda, pero tendrá que querer hacerlo en Linux con la pareja mplayer/mencoder y no temer la línea de comando.

Una primera fuente que reusaré ámpliamente es este sitio en Francés:

https://sites.google.com/site/mylinuxpassion/astuces/video/cropping-facile

El autor explica que se puede primero detectar los bordes negros de un vídeo usando cropdetect:

mplayer mivideo.avi -vf cropdetect

Esto nos dará una idea del formato a usar luego: debería encontrar algo así en la salida del script en el terminal:

crop=950:510:5:5

Este valor se expresa así:

crop=w:h:x:y

Donde:

w = el ancho total del vídeo después del corte

h = el alto total del vídeo después del corte

x = el punto horizontal a partir del cual medimos el ancho total (de donde partimos)

y = el punto vertical (a partir de arriba) a partir del cual medimos el alto total (de donde partimos)

Entonces, un crop=950:510:5:5 dice que, de un vídeo más grande que 955×515, partimos del punto 5x,5y (a 5 pixeles del punto de la extrema izquierda arriba) y cortamos solo un cuadrado de 950×510 píxeles a partir de este punto.

El comando para aplicar este corte sería:

mencoder instructivo.mp4 -vf crop=950:510:5:5 -ovc xvid \
  -xvidencopts bitrate=1500 -oac mp3lame \
  -lameopts cbr:br=128 -o resultado.avi

Debería generar el vídeo esperado, recortado justo donde debe ser.

Scale

Lamentablemente, alguna vez puede que le ocurra algo así:

Movie-Aspect is 1.78:1 - prescaling to correct movie aspect.
[CROP] Bad position/width/height - cropped area outside of the original!
FATAL: Cannot initialize video driver.

Esto, como indicado en el mensaje en Inglés, significa que, por alguna razón, el sistema considera que la zona de corte dibuja un rectángulo que sale fuera del tamaño real del vídeo.

Ha podido ser inducido en el error por el crop indicado por mplayer, porque este (al parecer) puede contabilizar las medidas de una manera distinta de la de mencoder.

Por ello, puede cambiar primero el tamaño del vídeo, de tal manera que la medida del crop esté mejor controlada.

En este caso, deberá introducir un comando “scale” dentro del comando de mencoder.

Un asunto que no queda claro, es que si pone el “scale” después del “crop”, este también se *ejecutará* después del crop, lo que lleva al mismo error de tamaño de crop que sale de la zona.

Por ello, es importante usar scale *antes* de crop, así:

mencoder instructivo.mp4 -vf scale=960:540,crop=950:510:5:5 \
  -ovc xvid -xvidencopts bitrate=1500 -oac mp3lame \
  -lameopts cbr:br=128 -o resultado.avi

No explicaré las demás opciones aquí. En línea de comando, puede usar “man mencoder” para saber más sobre estas.

Esperamos les haya ayudado algo…

Funcionamiento de sesiones en Chamilo LMS 1.10

December 17, 2012 Leave a comment

“Sesiones” es un término ambiguo, el problema siendo encontrarles un nombre adecuado para todos los usos. Algunos otros nombres son:

  • Programas
  • Programas académicos
  • Periodos (aunque esta denominación es algo equivocada – existe otra noción que conviene más, que es la categoría de sesiones)
  • Ciclo (de aprendizaje)
  • Sección

En realidad, las sesiones representan un periodo (generalmente limitado) de tiempo durante el cual un grupo de alumnos sigue uno o más cursos con el acompañamiento de un profesor designado para este curso durante este periodo. Por ello, en muchas ocasiones usamos en el pasado la representación siguiente

Sesiones

Sesiones

A la izquierda del diagrama, reconocemos el tríangulo clásico Profesor – Curso – Alumnos, y al centro del diágrama vemos que el mismo curso se encuentra con otro curso al mismo nivel, y con un responsable distinto del profesor quien elaboró el curso inicialmente.

En las versiones de Chamilo anteriores a la 1.10, disponíamos de 4 fechas para cada sesión:

  • Inicio de acceso para los docentes
  • Inicio de acceso para los alumnos
  • Fin de acceso para los alumnos
  • Fin de acceso para los docentes

La lógica de la diferencia de fin de acceso entre docentes y alumnos, es que el docente pueda preparar su curso (previamente a la apertura a los alumnos) y recuperar datos importantes (después delcierre para los alumnos), y que la sesión pueda “vencerse” y disaparecer del listado del docente, para que este pueda concentrarse sobre las sesiones más recientes.

En Chamilo LMS 1.10, agregamos dos fechas más, que son únicamente informativas. Así, tenemos las 6 fechas siguientes:

Fechas de sesiones

Fechas de sesiones

  • Inicio de acceso para los docentes
  • Inicio de acceso para los alumnos
  • Inicio oficial del ciclo/programa/sesión
  • Fin oficial del ciclo/programa/sesión
  • Fin de acceso para los alumnos
  • Fin de acceso para los docentes

En la imagen lateral, podemos ver, por ejemplo, la selección de las fechas siguientes:

  • Inicio de acceso para los docentes: 2012-11-01 (un mes antes)
  • Inicio de acceso para los alumnos: 2012-11-26 (unos días antes)
  • Inicio oficial del ciclo/programa/sesión: 2012-12-01 (el día de lanzamiento, como visto en la lista de cursos)
  • Fin oficial del ciclo/programa/sesión: 2012-12-31 (el día de cierre, como visto en la lista de cursos)
  • Fin de acceso para los alumnos: 2013-01-04 (unos días después)
  • Fin de acceso para los docentes: 2013-01-31 (un mes después)

Como si esto no fuera suficiente a nivel de flexibilidad, también es posible cambiar el comportamiento de las sesiones cuando pasó la fecha de cierre (para alumnos o para docentes).

Los tipos de acceso son:

  • Acceso completo
  • Acceso en lectura sola
  • Sin acceso

El caso “Acceso completo” sirve para *ignorar* las fechas definidas. Por ejemplo, por un tiempo limitado, se reabre la sesión para el acceso de todos.

El caso “Acceso en lectura sola” permite acceder pasada la fecha de cierre. En este caso, la sesión aparece en la página “historial de cursos” y el acceso para consultas es posible pero no se puede participar más en ninguna herramienta de participación (foro, ejercicios, wiki, etc).

El caso “Sin acceso” cierra por completo el acceso a la sesión a partir de la fecha de cierre para el rol correspondiente. Por ejemplo, si soy alumno y estoy inscrito en la sesión que tiene como fecha de fin de acceso para alumnos el 04/01/2013, al pasar al 05/01/2013, disaparece esta sesión de mi lista. Tampoco se puede ver en mi historial de curso. El docente, no obstante, seguirá viéndola en su lista de cursos hasta el 31/01/2013.

Porque cobramos por media hora?

December 11, 2012 2 comments

Para las empresas que recién se lanzan en temas de sopoprte en el mundo del software, y para nuestros clientes que quizás se preguntan porqué cobramos un mínimo de media hora por intervención, me gustaría explicar un poco mejor lo que hacemos.

Nuestro negocio, básicamente, es desarrollar sistemas de información (en particular Chamilo, Drupal y Dolibarr) y dar soporte sobre ellos (esto incluye también cuidar los servidores que los alojan). Toda esta actividad radica en los servicios “humanos” de personas altamente calificadas para brindar estos servicios a quien los necesiten.

Para definirlo de forma simplística, alquilamos actividad cerebral, es decir que damos acceso a nuestros clientes a mentes brillantes para que resuelvan problemas para ellos, y les permitimos alquilar estas mentes brillantes solo cuando las necesiten.

Por lo tanto, también estamos tomando una gran cantidad de riesgo al poner estas mentes brillantes a su disposición (si nadie las quiere por un tiempo, tenemos que seguir asgurando sus ingresos).

También pueden haber cantidades de discusiones sobre la manera en la cual un cierto problema es considerado resuelto o no, pues los problemas de software muchas veces se indican de forma interpretada, dando las impresiones personales de cada uno porque cada uno tiene circonstancias particulares y vive sus problemas de maneras distintas. Mucho de este trabajo no puede ser contabilizado sin generar frustraciones. Por lo tanto, el trabajo de nuestros responsables de soporte, responsables del diálogo con los clientes y de ser más explícitos para facilitar este diálogo, está contabilizado como parte del tiempo de resolución del problema.

Analizando el tiempo necesario para un ingeniero para resolver un problema, aparecen de forma más clara las razones por las cuales se considera un tiempo mínimo de atención. Estos son tiempos mínimos aproximados basados en la realidad de la mayoría de los casos que atendemos. Se considera (en este caso) que la ficha del cliente, indicando los accesos comunes al sistema del cliente ya fueron registrados:

  • 60s: Lectura del correo/mensaje del cliente
  • 240s: Registro de la incidencia (incluye: clasificación, designación de título claro que permitirá luego apoyarse en esta incidencia para cortar el tiempo de tratamiento de otras, indicación copiado-pegado del detalle del reporte por el cliente, asignación de las personas que deben estar al tanto de esta incidencia, asignación de un tiempo aproximado de resolución, asignación de un momento aproximado de entrega, definición de dependencias con otras incidencias, etc)
  • 60s: Conexión al sistema del cliente (o a una copia local) y reproducción del problema
  • 60s: Creación de nuevo contexto de prueba que permita reproducir la incidencia en un sistema que no afecte al cliente (para el tiempo de trabajo en este)
  • 300s: Investigación y, quizás, resolución del problema (se trata de un tiempo mínimo, en caso de poder aprovechar a su máximo la experiencia de nuestros ingenieros, pero no son raros los casos en los cuales esta resolución pueda tomar más de 2h)
  • 120s: Verificar, una última vez, que la corrección resolvió el problema
  • 60s: Registrar el cambio en nuestros repositorios de historial para cada cliente – esto implica también vincularlo con el código de la incidencia y darle un comentario adecuado
  • 180s: Reportar al cliente (y en la incidencia) sobre la resolución (o no) de la incidencia
  • 120s: Terminar, reportar su tiempo consumido, tomar 1 minuto de relajación para pasar a otra tarea

En total, el tratamiento de una sola incidencia representa un trabajo mínimo de 20 minutos, y en promedio (con la resolución de temas más complejos) más de media hora.

Por esta razón, nos es imposible asegurar, en buenas condiciones de seriedad y concentración, asegurar un tiempo de intervención menor a 20 minutos.

%d bloggers like this: