Nuestro nivel… técnico?

Agosto 7, 2008

Aúnque este tipo de información no esta muy fácil de encontrar, el nivel técnico oficial de Dokeos Latinoamérica es bien alto. Sobre 4 empleados, 2 son Ingenieros PHP certificados por Zend, la unica empresa que hace una certificación PHP reconocida mundialmente, y de nivel tan alto que es difícil de lograr la certificación, siendo un desarrollador PHP con unos años de experiencia.

Daniel es el segundo ingeniero certificado de Perú (solo hay 2) y yo… pues soy un externo a Perú (me encuentran en la página de Inglaterra). Aqui se ve para Perú.

Julio no la tiene pero si tiene el nivel para tenerla!


Inspeccionar funciones en PHPEclipse

Agosto 5, 2008

Luego de descargar un proyecto PHP desde un repositorio SVN en Eclipse. (Aqui un Howto para descargar Dokeos desde su servidor SVN). Sucede el clásico error de querer inspeccionar includes, funciones, clases en PHP sin éxito. El motivo es que el archivo .project de nuestro proyecto no está asociado con un proyecto PHP según Eclipse.

En otras palabras, se debe modificar el archivo .project agregando el siguiente código:

<buildSpec>
<buildCommand>
<name>net.sourceforge.phpeclipse.parserbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>net.sourceforge.phpeclipse.phpnature</nature>
</natures>

Esto indica a Eclipse que nuestro proyecto es un PHP Project. Voila!

Visto aquí


Akelos : Time Zones

Agosto 1, 2008

Primero tenemos que tener en cuenta que debemos activar “getters” and “setters”, que son metodos con los cuales podemos procesar los atributos de un objeto, antes de grabarlos o llamarlos. Para activar getters and setters debe escribir la siguiente linea en config.php:

define(’AK_ACTIVE_RECORD_ENABLE_AUTOMATIC_SETTERS_AND_GETTERS’, true);

Para manejar TimeZones, debemos tener un punto de referencia absoluto, por eso vamos a guardar todas las fechas en GMT y formato datetime (SQL), lo guardamos en formato datetime y no timestamp para aprovechar las funciones SQL (tipo DateAdd o Datediff dependiendo de la plataforma)  y para mayor entendimiento en caso de una revision visual de la base de datos.

Hay que tener en cuenta que la conversion de fechas solo lo haremos desde el servidor, osea no vamos a cambiar nada en la base de datos, solo definir campos datetimes.

Para convertir una fecha a GMT necesitamos 2 variables, la FECHA y el TIMEZONE del usuario y lo mismo si queremos convertir la fecha GMT (sacada de la base de datos) al Timezone del usuario. Akelos viene integrado con una clase muy util llamada AKTimeZone, esta clase nos ayudara a facilitar el proceso.

Entonces lo primero que tenemos que hacer es llamar a la clase AKTimeZone e inicializar un objeto AKTimezone que nos ayudara a hacer las conversiones.

Vamos al archivo shared_model.php y incluiremos la clase AKTimezone y para inicializar el objeto lo haremos dentro del metodo init(). Hay que tener en cuenta que cuando incluimos la clase AKTimezone automaticamente cambia el timezone del sistema a GMT.

require_once(AK_LIB_DIR.DS.’AkLocalize’.DS.’AkTimeZone.php’);
require_once(AK_LIB_DIR.DS.’AkActiveRecord.php’);

class ActiveRecord extends AkActiveRecord
{
var $my_timezone;

function init($attributes)
{

if(@empty($_SESSION['timezone']['name'])) $_SESSION['timezone']['name'] = ‘UTC’;
$_AkCurrentZone = new AkTimeZone();
$this->my_timezone =& $_AkCurrentZone->create(
$_SESSION['timezone']['name']);

return parent::init($attributes);

}

Ten en cuenta que debes tener a la mano el Timezone del usuario en este caso yo lo tengo en la variable $_SESSION['timezone']['name'], con esto ya puedes crear el objeto que nos ayudara para las conversiones.

Dado que AKTimezone configura el sistema en GMT, no es necesario crear ningun metodo para guardar en GMT las fechas generadas por created_at o updated_at.

Lo que si tenemos que hacer es crear un Getter para cada fecha GMT que queremos mostrar con el Timezone del usuario actual. Aqui un ejemplo de mostrar created_at en el Timezone actual del usuario, fijate que el getter debe ser escrito de manera CamelCase.

function getCreatedAt(){
$var = $this->created_at;
$converted = gmmktime(substr($var,11,2),substr($var,14,2),substr($var,17,2),substr($var,5,2),substr($var,8,2),substr($var,0,4));
return gmdate(”Y-m-d H:i:s”,$this->my_timezone->adjust($converted));//my time
}

Para llamar un getter en el View hay 2 formas, presta atención que los getters and setters solo son ejecutados con este tipo de llamadas:

$sale->get(’created_at’)
{sale.created_at?}

Este tipo de llamada NO activaran los getters and setters:

$sale->created_at

En el caso que tengamos un campo en un formulario, donde el usuario ingresa una fecha, tenemos que convertir la fecha ingresada a GMT y despues ajustarla usando el Timezone del usuario, pero esto lo haremos solo cuando vaya a ser grabado en la base de datos. Aqui un ejemplo suponiendo que el campo se llame “user_input_date” :

function beforeSave(){
$var = $this->user_input_date;
$converted = gmmktime(substr($var,11,2),substr($var,14,2),substr($var,17,2),substr($var,5,2),substr($var,8,2),substr($var,0,4));
$this->user_input_date = gmdate(”M d Y H:i:s”,$this->my_timezone->unadjust($converted));
return true;
}

Y con esto cubrimos el manejo de zonas horarias (Time Zones) en akelos.

Extendido

1. Si estas preocupado por TimeZones con DST, no debes tener preocupaciones, la clase AKTimeZone deja que el sistema operativo se encargue de dar el “offset” correcto para el timezone usado, osea tu única preocupación es que el sistema operativo del servidor tenga sus librerias de zonas horarias actualizadas.

2. $_SESSION['timezone']['name'] contiene el nombre del timezone (ejm: America/Chicago, America/Costa Rica), eso significa que cada usuario debe tener un campo en la base de datos con su respectivo nombre de Timezone. Si  tienes un sistema de usuarios y solo tienes guardado el offset de cada usuario (ejm: -09:00,+05:00), esta información no es suficiente en el mundo real, ya que cada pais y region tiene sus propias reglas horarias y reglas DST, por lo cual es obsoleto guardar solo el offset, la manera correcta es guardar la zona horaria.

3. AKTimeZone viene con algunos metodos bastante utiles. por ejemplo toString() el cual imprimira : “(GMT+01:10) TimezoneActual”, si quieres usarlo con los ejemplos previos, puedes usarlo asi:

<div align=”right”>_{Current Time Zone} : <?php echo $my_timezone->toString() ?></div>

En caso quieras generar una lista “select” de TimeZones puedes usar el metodo getTimezones() que devolvera un array de los timezones. para generar el codigo akelos completo puedes hacerlo asi:
<? echo $form_options_helper->select(’user’, ‘timezone’, array_keys($my_timezone->getTimezones())); ?>

4. Debes saber que la clase AKTimeZone ya viene con timezones definidos lo cual seria un problema si mas adelante aparece un timezone nuevo, por lo cual debes tomar las medidas necesarias para enfrentar estas situaciones como por ejemplo teniendo una tabla de timezones en la base de datos.


Instalar Eclipse Ganymede + PHPEclipse + Subclipse + Dokeos dev-1.86 en Ubuntu 8.04

Julio 24, 2008

Luego de tener problemas con la Eclipse 3.2 y de intentar dejar PHPEclipse por Zend Studio, tenía tantas ganas de que PHPEclipse vuelva a funcionar como aquel verano del 2008 donde todo simplemente funcionaba bien. Ahora, con la última versión de Eclipse 3.4 Ganymede hice el proceso de instalación que verán en las siguientes lineas y todo funcionó.

Antes que nada se debe de desinstalar algún rastro es decir del Eclipse 3.2, para ello pueden visitar este post.
Ahora comenzamos con:

1. Instalar Eclipse 3.4 Ganymede
http://download.eclipse.org/eclipse/downloads/

Descargué la siguiente versión: Linux (x86/GTK 2) y lo descargué desde el servidor Columbia muy rápido aqui en Perú. Descomprimir el archivo tar y ejecutar el archivo ./eclipse

Esto instalará el Eclipse para un usuario solo (instalarlo para todos los usuarios de esta máquina necesita más trabajo y grabar los archivos dentro de un directorio compartido). Un buen lugar para instalarlo para un usuario único es dentro de /home/usuario/src por ejemplo, si es que tienen un directorio para fuentes de programas.

Seleccionar el workspace: por default seleccionar la dirección pública del servidor Apache, en mi caso: /var/www/

2. Instalar el Plugin - SubEclipse

Seguir los detallados pasos aqui: http://subclipse.tigris.org/install.html
Para esta instalación seleccioné http://subclipse.tigris.org/update_1.4.x

3. Instalar PHPEclipse
El proceso es similar al Plugin SVN pero se debe de agregar el sitio http://update.phpeclipse.net/update/nightly

4. Crear un nuevo proyecto en Eclipse

a. File->New -> Other -> SVN -> Projects from SVN
b. Agregar la dirección de SVN de Dokeos: https://dokeos.svn.sourceforge.net/svnroot/dokeos/trunk
De la lista seleccionar “Dokeos”.
c. Seleccionar “Checkout as a project in the workspace”. y colocar un nombre por ejemplo “dokeossvn”
d. Done!

Comenzará la descarga de Dokeos desde el repositorio SVN.

Es necesario realizar este pequeño truco para cambiar el proyecto de SVN a PHP y poder hacer inspecciones dentro de funciones, includes, etc. No olviden cambiar la perspectiva a PHP, por default es JAVA.

5. Ver resultados

Luego acceder a localhost/dokeossvn suponiendo que tienen esta dir /var/www/dokeossvn et voila!

Para más información sobre Dokeos y su repositorio SVN : http://www.dokeos.com/wiki/index.php/SVN


30 días con Zend Studio

Julio 23, 2008

Cansado de tener problemas con la combinación de Eclipse v3.2, PHPEclipse y Subclipse v1.1
decidí probar la versión de prueba de 30 días del Zend Studio for Eclipse.

Los problemas básicamente de Eclipse 3.2 eran un conflicto entre el PHPEclipse y el Subclipse.
Para solucionar de una manera poco elegante pero práctica y rápida desintalé el Subeclipse y comencé a mandar los commits de Dokeos por consola (trabajo sobre una Ubuntu 8.04)

Pero los problemas no iba a parar, al crear un nuevo proyecto en Eclipse, apareció un error inexplicable y nunca más cargo. Es por eso que opté por probar el Zend Studio.

Aqui mis comentarios:

Lo malo

  1. La función Ctrl-Click para inspeccionar funciones, constantes, includes, etc no funciona.
  2. No existe una lista de las funciones declaradas en un archivo PHP. Hablo sobre la vista “Outline”.
  3. Al igual que en PHPEclipse no existe la selección vertical. Algo MUY importante que se debería incluir en este tipo de IDEs. Por ejemplo, las versiones de Delphi y de Notepad++ lo tienen.
  4. En la vista “PHPExplorer” (donde se muestra la lista de archivos) se observa el número de Commit pero no la fecha ni el usuario que hizo el commit.
  5. 304 Mb la descarga!
  6. ¿Olvide decir que cuesta $399 dólares?
    Según el sitio web: $399 for 1 year subscription to support / $717 for 3 years subscription to support

Lo bueno

  1. PHP Functions: Biblioteca de funciones de PHP, ahorra tiempo en lugar de visitar www.php.net
  2. El SVN SI funciona.
  3. Ningun crash hasta el momento.
  4. Fácil de instalar unos “10 clicks”. No hubo necesidad de instalar otros plugins.
  5. Lee muy bien los .js. En PHPEclipse es necesario instalar otro plugin.
  6. Incluye la funcionalidad “Create NEW SQL connection” un wizard para crear cadenas de conexión, aunque no lo utilicé porque en Dokeos ya existe una clase “Database”.
  7. Y muchos pequeñas cosas que podrían facilitar el desarrollo desde cero (from scratch) aunque en mi caso no fueron usadas debido a que Dokeos ya tiene incluidas clases para manejar la BD, la Seguridad, las Sessiones, etc, etc.

La versión utilizada fue:
Zend Studio for Eclipse Professional Edition Build ID: 20080601

Conclusiones

El Zend Studio es un buen producto, tiene algunas funcionalidades que harán más rápido el proceso de desarrollo, sin embargo, por $399 uno espero algo mucho mejor. Si tan solo el PHPEclipse. Pronto una reseña de Eclipse Ganymede la última versión de Eclipse.

Actualización: Pueden ver este post para poder instalar Eclipse 3.4 Ganymede + PHPEclipse + Subeclipse


No se deje bloquear por problemas de memoria

Julio 21, 2008

Hay unos problemas con PHP5, pero no tantos. Uno de ellos es que los límites de memoria son dificiles de manejar. En Dokeos no las manejamos muy bien tampoco, así que el resultado si tiene problemas de limite de memoria en Dokeos podría parecer tal como lo siguiente:

Exactamente… nada. Generalmente es lo que aparece (aunque los logs del servidor web tienen más información, no siempre es tán fácil de acceder a estos). Entonces si quieren evitarlos y asegurarse que Dokeos maneja bien todas las táreas que desean que haga, sería sencillo de poner un limite de memoria de al mínimo 8MB dentro de su fichero php.ini. Si, 8MB es un monton, y trabajaremos sobre este tema en el futuro, pero al mismo tiempo los servidores recientes pueden permitirselo, hasta con configuraciones muy amplias (solo es un *limite*, no quiere decir que cada usuario web va a usar 8MB).

Si van a usar paquetes SCORM y copias de cursos, asegurense que el limite esta mucho más alta. He visto paquetes SCORM muy largos usar hasta 60MB de memoria (creo que esta debido a nuestro uso de PCLZip, pero no he tenido tiempo para investigar hasta ahora).

Limites de memoria pueden ser configuradas dentro de su fichero php.ini (busca “memory_limit”) o desde la definición de su VirtualHost de Apache, usando una línea como:

php_admin_value memory_limit 64M

Otros parametros que quiza quereran cambiar:

  • post_max_size
  • upload_max_filesize
  • max_execution_time
  • max_input_time

De estos parametros, todos afectan los mandos de ficheros grandes hacia el servidor así que los escripts que se ejecutan mucho tiempo (como operaciones de importes/exportes largos).


Agregado página Dokeos 1.8.6

Julio 17, 2008

Acabo de agregar una página sobre Dokeos 1.8.6 y los planes de desarrollo para esta proxima versión.


Agregar una plantilla de documentos en Dokeos 1.8.5

Julio 9, 2008

Es muy sencillo para el quien sabe un poco de programación… El fichero a cambiar es main/inc/lib/fckeditor/fcktemplates.xml.php.

Cada template esté presentado como un elemento XML <Template> a dentro del cual se encuentra un documento HTML (una plantilla). Por ejemplo, el último se presenta así:

<Template title=”<?php echo s(’TemplateTitleFlash’); ?>”>
<Description><?php echo s(’TemplateTitleFlashDescription’); ?></Description>
<Html>
<![CDATA[
<head>
<?php echo $css ?>
</head>
<body>
<center>
<table style="background: transparent url(<?php echo $img_dir.'faded_blue_horizontal.png'; ?>) repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; text-align: left; width: 100%; height: 400px;" border="0" cellpadding="15" cellspacing="6">
<tbody>
<tr>
<td align="center">
<embed width="700" height="300" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" src="<?php echo $default_course_dir;?>flash/SpinEchoSequence.swf" play="true" loop="true" menu="true"></embed></span><br />
</td>
</tr>
</tbody>
</table>
<p><br />
<br />
</p>
</center>
</body>

]]>
</Html>
</Template>

Las partes en PHP para título y descripción se pueden remplazar, para portales en un solo idioma, por un nombre en duro.

Por ejemplo, si quiero agregar una plantilla con más líneas en la tabla, es suficiente de copiar esta parte, pegarla al fín del fichero (justo antes del tag </Templates>), agregar una líneas <tr> y ya tenemos una nueva plantilla en Dokeos.

Cuidado que este fichero sera sobreescribido por la próxima versión de Dokeos, así que mejor guardar una copia con nombre diferente!


Como hacer “flotear” el footer de Dokeos

Julio 7, 2008

No se para ustedes, pero no me gusta que el footer de Dokeos sea siempre moviendo con la pantalla cuando no hay bastante contenido a dentro de la pagina.

Pero tengo suerte que CSS sea tan bien hecho. Si quiero modificar algun estilo de Dokeos, el primer paso es de hacer una copia del directorio del estilo que más me gusta en los estilos por defecto de Dokeos. Digamos que quiero re-usar dokeos_classic, pues hago una copia de main/css/dokeos_classic/ dentro de main/css/dokeos_classic_floating_footer/

Para el ejemplo siguente, voy a estar usando a VIM, un editor en línea de comando, pero igual los estilos se pueden editar con cualquier editor de texto. VIM me permite un acceso directo al servidor, y por eso no necesito que “mandar” el fichero al servidor despues, pero la idea es que solo es un editor de texto.

~$ cd dokeos/main/css/

~$ cp -r dokeos_classic dokeos_classic_floating_footer

~$ cd dokeos_classic_floating_footer/

~$ vim default.css

Ahora estoy dentro de default.css, y voy buscando al elemento “footer” (cerca líneas 360 en Dokeos 1.8.5).

Quiero cambiarlo como sigue (lo más importante acá es el position: fixed; )

#footer {
height: 1.5em;
padding-top: 0.2em;
border-top: 1px solid #4171B5;
background-color: #E5EDF9;
font-size: 12px;
bottom:0pt;
overflow:hidden;
position:fixed;
vertical-align:top;
width:98%;
z-index:9999;
padding-left: 1em;
padding-right: 1em;
}

Si acabo aqui, y lo pruebo en mi navegador (por una página larga), puedo ver que ya funciona, pero que una parte de la página se esconde bajo el footer.

Esto es porque el elemento outer-frame en lo cual el footer esta incluído tendría que definir una propriedad margin del tamaño del footer. Eso se puede hacer con la propriedad margin-bottom: 1.5em; como se ve en lo sigente:

#outerframe {
position: relative; /* do not remove, fixes a bug in IE */
border: 1px solid #fff;
background-color: #fff;
margin-bottom: 1.5em;
}

Ya esta. Solo ha sido probado con Firefox 2 hasta ahora, entonces asegurase que sea probado con otros navegadores antes de usarlo por sus servidores de producción.

Me gustaría encontrar una manera de dejar el footer a bajo de la página, pero sin que sea flotante… solo dejar lo estaticamente a bajo, pero que también se quede cuando solo hay media-pantalla de contenido. Hasta ahora no encontré.


Dokeos sorprende en comparación con Moodle y ILIAS

Julio 5, 2008

Estaba analisando la herramienta de medidas de código en el sitio web Ohloh y, aunque estoy seguro que hay una forma de denegar los resultados por razones de que algunas bibliotecas de funciones agregan “ruido” a las contribuciones de código, me quede sorprendido de ver que Dokeos no esta poniendose mal y incluído esta volviendo cerca atrás de Moodle en temas de código, contribudores y actividad global. Les dejo analisar estos resultados por su mismos (siguiendo el enlace arriba o mirando a las capturas de pantallas abajo).

Antes de que empesan a pensar que esta comparación esta desviada por ser hecha por un desarrollador de Dokeos, quiziera mencionar que Ohloh.net es totalmente independiente en este caso, y que solo usé las herramientas disponibles y los datos disponibles para comparar automaticamente los 3 proyectos, pense que los resultados fueron interesantes y al ventaje de Dokeos y por eso podrían ser publicados en este blog. Estoy muy conciente de que no se pueden tomar conclusiones usando solo estos datos.

En las capturas que siguen, Dokeos esta marcado en rojo, Moodle en verde y ILIAS en azúl. Claroline y Ganesha, que he dejado fuera de esta comparación porque solo se pueden comparar tres a la vez, estan a un nivel bajo ILIAS (en azúl).

El primer gráfico enseńa el código (numero de líneas de código). El segundo es sobre la actividad del proyecto en terminos de cambios de código. El tercero es sobre los contribudores al código. Como veras, cuando Dokeos no esta arriba, esta en camino para llegar ahí, tranquilamente. Las líneas de código de los tres proyectos incrementan más o menos a la misma celeridad.

Dokeos-Moodle-ILIAS comparación de código

Dokeos-Moodle-ILIAS comparación de código

Dokeos-Moodle-ILIAS comparación de actividad

Dokeos-Moodle-ILIAS comparación de actividad

Dokeos-Moodle-ILIAS comparación de contribuciones

Dokeos-Moodle-ILIAS comparación de contribuciones

La posición de Dokeos no me sorprende tanto porque me parece que nuestro proyecto esta malo, sino que en general escuchamos mucho más de Moodle como proyecto de e-learning open-source activo que de Dokeos, y por eso, en teoría, debería ser encima de los otros para los tres gráficos…

Parece que Moodle ha sido muy activo en 2006, y despues bajo la actividad poco a poco. De lo que escuche de ILIAS (aunque no se mucho directamente), en una comparación el año pasado entre Dokeos y ILIAS, Dokeos ganaba sin problemas…

Aparte de todo eso, la historia de Dokeos todavía tiene una nuevas páginas llenas de sorpresas que escribir. Espero que se puede decir lo mismo para nuestra competición.

Solo para divertise, si quieren comparar Dokeos, Claroline y Ganesha, sigua usted este enlace.