Mono Hispano

Uncategorized — Tags: , — @ 18:01

Desde hace una meses para acá el servidor web original previo: monohispano.es había tenido algún tipo de error que ocasionaba que simplemente la página no se mostrara, un error de PHP para ser exactos, después de este fallo que llevaba algunos meses sin poderse solucionar la lista de correos comenzó a fallar (llevaba creo 4 días fuera), parece porque el dominio expiró, como sea la gente de HispaLinux amablemente han logrado realizar el cambio el nuevo dominio, así que ahora ya esta de nuevo arriba.

Es claro que el problema del servidor web sigue sin resolver pero estamos trabajando en ello.

Aclaro que al día de hoy no es posible suscribirse/desuscribirse a la lista de correos, por errores de los enlaces, pero se esta trabajando en ello, pero los envíos a la lista de correos sirven sin problema alguno.

Ubuntu México

Uncategorized — Tags: , — @ 21:58

El LoCo de Ubuntu ya esta en México, y vamos por buen camino.

Proyecto

Uncategorized — Tags: , — @ 21:59

A pesar de que de alguna forma ya desde mis días en la universidad “estoy acostumbrado” a tener días (o mejor dicho, noches) difíciles, ahora me siento más confiado. En el trabajo estamos comenzando a integrar todo nuestro esfuerzo, desde aquella migración de QNX6 a Linux hasta a las aplicaciones .NET, para unir todo el software y es agradable mirar que todo va funcionando muy bien. Es un poco molesto llegar tarde a casa con únicamente ganas de dormir y no poder dedicar algo de tiempo a mis proyectos personales, pero seguro cuando termine esto me pondré al corriente.

Esta semana viene dura, pero bueno, así es esto.

Reactivando Mono Hispano

Uncategorized — Tags: , — @ 23:49

Recientemente estoy buscando reactivar la comunidad hispana del proyecto Mono, hay temporadas que las contribuciones aumentan y otras que no, lo sé, escribir documentación es una tarea pesada, pero realmente necesaria, documentar es primordial, aunque tengas la mejor aplicación o API, con el mejor rendimiento, el mejor diseño y este escrita limpiamente, si esta no está documentada, básicamente no sirve.

Hay cosas por hacer, por mientras he abierto en Forge Novell un proyecto relacionado a esto, claro del mismo nombre, monohispano, no se que ocurre en Hispalinux, pero los servidores CVS estan muriendo poco a poco, el de LuCAS lleva ya así desde algunos años, el wiki va de la misma forma y parece que ya no quedan administradores con los cuales poder hablar. No se cual sea el futuro, igual y me equivoco, pero mientras planeo que se utilice el SVN del proyecto además del Bugzilla.

Siento que lo más interesante de esto es la propuesta de crear una aplicación que permite transformar de formato MediaWiki a Docbook, y luego de ese a formato MonoDoc, eso, sin duda sería fantástico, los tutoriales actualmente escritos podrían ser agregados al Monodoc y todo estaría integrado de una forma fantástica. Sin duda le daré una hojeada a eso, he encontrado algunas aplicaciones que parecen realizar eso, html2wiki y html2wikipedia, parece que la ultima podría servir de base para poder lograrlo, hay que tomarse un tiempo porque a futuro esto sería de total utilidad.

FSL2006, Dia 0

Uncategorized — Tags: , — @ 10:43

Seguimos en tránsito, Jorge Mauricio y yo, esperando el vuelo que saldrá, si todo va bien, a las 15:30hrs, para llegar por alla aproximadamente como las 16:30 (o algo asi), y ya mañana iniciar con las actividades.

Por mi parte ando refinando los detalles relacionados al tutorial de mañana, maquillaje y nada más.

CICOL 2006

Uncategorized — Tags: , — @ 19:10

Este fin de mes me voy al CICOL, me toca el viernes 30, estaré en un taller de Desarrollo en Gtk# y una platica del proyecto Mono Hispano, por ahí andará Gunnar y el buen Sandino.

A pesar de que aún no pido permiso en el trabajo, no creo que haya problema alguno, así que nos vemos por alla en unos días.

Notas de desempeño, 2

Uncategorized — Tags: , — @ 22:52

Después de haber hecho lo antes comentado y cambiar las clases por estructuras he notado que (sin la menor duda) se acelara el desempeño, he bajado la respuesta de 6~8 segundos a menos de un segundo, lo cual es algo grandioso, procesar más de 21000 estructuras de aproxidamente 1500 bytes cada una es fantástico, el consumo de CPU es de 1%-3% (hablando de un P4 2.4Ghz), claro que este caso de prueba es “el peor de los casos” y también, aún, hay detalles que podrían ser mejorados, los resultados son excelentes. Durante la recepción utilizo la solución del marshalling+cast, de modo que se hace un cast explícito al tipo de estructura, por ejemplo, suponiendo que tenemos una estructura definida como:

[StructLayout (LayoutKind.Explicit)]
public struct MyStruct
{
[FieldOffset (0)]
public int Integer;

[FieldOffset (4)]
public short Short;
}

Podríamos dentro de alguna parte de nuestra lógica de procesamiento del flujo binario, hacer el cast:

fixed (byte *data = reader.ReadBytes (sizeof (MyStruct))) {
header = *(MyStruct *) data;
}

Donde el flujo lo leemos a través de la variable reader (BinaryReader). Lo más probable es que este proceso se encuentre dentro de un ciclo infinito que se encuentra recibiendo la información del flujo de red. Después de unas pruebas, que hice por simple curiosidad, note algo muy interesante de las formas de obtener el tamaño de una definición de estructura y clase, lo más sorprendente fue que el método propuesto por “Marshal.SizeOf (typeof (MyStruct))“, es más lento, y sin duda es cierto, pues cada ocasión que es llamado se realiza un asignación por la CLR para calcular su tamaño.

repetitions: 1000
iterations: 1.000000e+006

TestSizeOfStatic :      7.773 seconds
TestSizeOf:     2.781 seconds
TestSizeOfMarshal :     50.093 seconds

Debido a que sizeof únicamente sirve para tipos por valor, no es posible aplicar este método a una clase y tendríamos que utilizar Marshal.SizeOf para obtener este tamaño, una solución para no afectar el desempeño y no utilizar siempre la opción no recomendada es agregando una propiedad estática a nuestra clase además de una variable privada estática que mantenga este tamaño, algo como:

[StructLayout (LayoutKind.Sequential)]
public class MyClass
{
public int Integer;
public short Short;

static unsafe MyClass ()
{
_size = Marshal.SizeOf (typeof (MyClass));
}

public static int Size
{
get { return _size; }
}

private static int _size;
}

Además hay que recordar que el overhead de utilizar una clase en comparación a una estructura es mayor. Hay detalles en las clases, al igual que en las estructuras, que deben ser consideradas, el sitio de mono tiene algunos buenos consejos para esto.

Notas de desempeño

english — Tags: , — @ 22:30

A pesar de todos los comentarios puristas, usualmente absurdos y sin fundamentos, referentes a la plataforma Mono (y MS .NET), escribir código en esa plataforma realmente agiliza el desarrollo, en .NET no todo es “arrastrar y soltar”, ni llenar las “formas” y cambiarles los colores arbitrariamente, ni hacer supuesta orientación a objetos copiando trozos de código (estáticos por cierto) a diferentes métodos. Escribir código en .NET cualquiera lo puede hacer, pero el hacerlo bien requiere habilidades y experiencia en otros lenguajes.

Podríamos pensar para escribir una aplicación de tiempo real debemos seleccionar un lenguaje que pueda al final general un binario dependiente de plataforma y arquitectura, de esta forma se podrán explotar, entre otras cosas, las capacidades de CPU y un manejo adecuado de memoria y administración de esta, ¿Qué es lo malo?, hay que saber como hacerlo y aprender lleva tiempo y tiempo es dinero, más tiempo significa más inversión y eso es algo de lo que usualmente no disponemos, además la plataforma que se ofrece a través de la conjunción del CLR y el CIL hacen que podamos tener lo mejor de los dos mundos, hacer que el tiempo de desarrollo se reduzca y el desempeño sea al menos semejante a una aplicación de arquitectura y plataforma dependiente, es obvio que un desempeño excelente en comparación a un compilado-dependiente no se podrá obtener, pero sin embargo siempre se busca el mejor.

Mi proyecto actual del trabajo es el claro ejemplo del extremo, donde se debe escribir una aplicación en .NET con un desempeño excelente, el retardo máximo de actualización es de 3 segundos, actualmente lo he bajado de 6-8 a 3-1 segundos, cosa que me agrada, pero seguro se puede mejorar más, algunas cosas que me ayudaron a mejorar el desempeño fue:

  1. Parar el uso de Enumeradores, reemplazalos con punteros, con código no administrado.
  2. No usar indexadores para acceder a arreglos cambiando el código a un uso de aritmética de punteros, con código no administrado.
  3. Concatenaciones a travéz de System.Text.StringBuilder, en vez de utilizar el clásico “cadena + cadena“.
  4. Débido a que recibo información binaria de estructuras escritas en C mediante un broadcast, es necesario generar las versiones C# correspondientes a aquellas struct en C con un Marshalling de modo que se pueda hacer un casting de tipo *(Estructura *) ptr.

Existe un artículo que muestra un buen caso de ejemplo indicando desempeño al momento de hacer ciclos a arreglos, dentro se utiliza un ejemplo de punteros escritos en C++ administrado, la versión de C# sería algo así:

using System;

namespace Iterations
{
public class Pointer
{
public unsafe static void iterate (Data data)
{
double d;
fixed (double *ptr = &data.Array [0]) {
int l = data.Array.Length;
for (int i = 0; i < l; i++)
d = *(ptr +i);
}
}
}
}

Los resultados son contundentes:

repetitions: 1000
iterations: 1.000000e+006

Enumeration: 32.87 seconds
Indexing: 11.246 seconds
Indirect Arrays: 10.172 seconds
Direct Arrays: 5.44 seconds
Pointer Math: 4.828 seconds

El retardo principal se debe a los objetos generados durante la enumeración, foreach no es la elección en aplicaciones de alto desempeño, sin duda es sencillo de implementar pero es lento al ejecutar, la solución más rápida a travéz de punteros se debe a que validaciones como el índice del arreglo no es considerado, dejando todo la lógica de validación al programador.

Hay cosas que me faltan de eliminar como ese abuso exagerado de boxing/unboxing al momento de tener mi colección de estructuras recibidas por el broadcast, además de la creación innecesario de tipos por valor, reemplazando con una lista enlazada en código no administrado y pasos por referencia respectivamente. Un ejemplo de esto sería:

using System;

namespace Research
{
unsafe public struct MyStruct
{
public MyStruct (int integer)
{
Integer = integer;
Next = null;
}

public int Integer;
public MyStruct *Next;

public override string ToString ()
{
return "Integer: "+Integer+" at "+
"Ptr "+((int)&(*Next));
}
}

//Quick sample, don't bother me ;-)
public class Sample
{
unsafe public static void Main (string []args)
{
MyStruct obj1 = new MyStruct ();
MyStruct obj2 = new MyStruct ();
obj1.Next = null;
obj2.Next = &obj1;
obj1.Integer = 1;
obj2.Integer = 2;
ChangeByPointer (&obj1.Integer);
ChangeByReference (ref obj2.Integer);
Console.WriteLine (obj1 +" * "+ obj2);
}

unsafe public static void ChangeByPointer (int *reference)
{
*(reference) += 5;
}

unsafe public static void ChangeByReference (ref int reference)
{
reference += 5;
}
}
}

Algo interesante es el hecho de que ambos métodos generan la misma secuencia de instrucciones CIL, lo cual obviamente indica que son iguales, por tal razón cualquier elección es buena:

//... more before

// method line 5
.method public static hidebysig
default void ChangeByPointer (int32* reference) cil managed
{
// Method begins at RVA 0x21c4
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: dup
IL_0002: ldind.i4
IL_0003: ldc.i4.5
IL_0004: add
IL_0005: stind.i4
IL_0006: ret
} // end of method Sample::default void ChangeByPointer (int32* reference)

// method line 6
.method public static hidebysig
default void ChangeByReference (int32& reference) cil managed
{
// Method begins at RVA 0x21cc
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: dup
IL_0002: ldind.i4
IL_0003: ldc.i4.5
IL_0004: add
IL_0005: stind.i4
IL_0006: ret
} // end of method Sample::default void ChangeByReference (int32& reference)
//more later...

Faltan detalles por mejorar, pero sin duda “jugar” con punteros siempre será lo mejor.

Días libres

Uncategorized — Tags: , — @ 23:25

Ahora, desde el lunes, estoy en otra área de la planta y a pesar del cambio de clima que siento durante y después de llegar al departamento donde estoy, me gusta, hago cosas que disfruto y el lugar esta aislado, usualmente estamos en silencio y es posible trabajar y lo mejor, el día se me va como el agua, además tengo algunos planes para poder ser más útil :-) , solo espero que se tome una decisión de OS y todo será felicidad.

Como extraño mis días de vacaciones, pero bueno 3 días son buenos.

Por cierto, que el Ezine de Mono Hispano ya tiene 3 articulos listos y yo tengo tantas ideas para otros más.

NUML

Uncategorized — Tags: , — @ 18:06

Rodolfo ha decidido separar ExpertCoder, en dos partes, la parte ExpertCoder para la generación de código y la parte exclusiva UML que incorpora la implementación UML 2.0, XMI 2.1, además de la serialización y deserialización, entre otras cosas. La decisión me parece una buena idea, de igual forma hemos decidido remover, al menos por ahora, la parte visual de MonoUML referente a la diagramación la principal razón de esto es que la versión actual tiene varios errores y la versión que se estará escribiendo en base a MonoCanvas aún no ve la luz, con esto liberaremos más seguido MonoUML, hasta que llegue un momento en el que tenga de nuevo diagramación.

Debido a la creación de NUML, se necesitan más manos, para empaquetar, diseñar un buen sitio (¿basado en MediaWiki?) además de otras cosas que vayan saliendo, sería genial crear también test unitarios para NUML y para ExpertCoder, para evitar regresiones en el futuro. Toda la ayuda es bien recibida.

Next Page »
  •  
    July 2010
    S M T W T F S
    « Jun    
     123
    45678910
    11121314151617
    18192021222324
    25262728293031
  • Pages
  • Archives
  • Tag cloud
    2010 a11y accessibility books c# debian development english español february gnome hackweek january java june makeup march mono monohispano monohotdraw monouml nokia770 opensolaris opensuse personal pulque resolutions ruby ruby&c# tasque ubuntu uia uml vala yastroid
  • This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.
    (c) 2004-2010 Mario Carrion | powered by WordPress with Barecity