Monday, December 3, 2007

Como funciona HTTP como Separador de Mensajes TCP

Tal como ya había comentado en un post anterior, TCP es un Protocolo de Control de Flujo de Datos, no de Mensaje de Datos por lo que es necesario implementar un separador de Mensajes sobre TCP. ¿Qué exactamente Hace un Separador de Mensajes? Un separador de Mensajes es un conjunto de reglas que se aplican sobre la transmisión de datos para saber de que parte de que flujos comienzan o finalizan los mensajes, casi siempre el Separador de Mensajes se implementa con un Encabezado y un Contenido donde una de las múltiples funciones del encabezado es el de informar del tamaño total del cuerpo del mensaje en caso de que exista. Protocolos como HTTP implementan su propio separador de Mensajes. Ejemplo:

HTTP/1.1 POST /

Content-Length:16

txtNombre=Johan

El ejemplo anterior es un mensaje HTTP, se compone de un encabezado y un cuerpo. El encabezado se compone de un conjunto de Líneas separadas por un tabulado LFCR?? Que se separa del cuerpo del mensaje por una línea en blanco. Si el encabezado contiene una línea Content-Length entonces después de la línea en blanco se recibirá como cuerpo del mensaje el número total de bytes que se especifico en la línea Content-Length, si no se especifica Content-Length, entonces el mensaje se compone solo del encabezado y los siguientes bytes recibidos después de la línea en blanco son tomados como el Encabezado de otro Mensaje.

Para el ejemplo del Mensaje HTTP que se mostro anteriormente corresponde a el siguiente conjunto de bytes:

72, 84, 84, 80, 47, 49, 46, 49, 32, 80, 79, 83, 84, 32, 47, 10,13,67, 111, 110, 116, 101, 110, 116, 45, 76, 101, 110, 103, 116, 104, 58, 49, 54,10,13,10,13,116, 120, 116, 78, 111, 109, 98, 114, 101, 61, 74, 111, 104, 97, 110

Debido a que el encabezado del Mensaje HTTP es siempre ASCII cada byte del encabezado corresponde a un carácter ASCII, la combinación de byte 10(LF, Representado en Espace Unicode de C# como ‘\n’) y 13(CR, Representado en Escape Unicode de C# como ‘\r’) indican que finaliza una Linea del Encabezado HTTP. El dato binario anterior compone un mensaje HTTP completo pero ese dato binario puede recibirse en multiples flujos de datos TCP de cualquier tamaño, Es decir, que podríamos recibir:

  1. 72, 84, 84, 80, 47, 49, 46, 49, 32, 80, 79, 83, 84, 32, 47, 10

  2. 13,67, 111, 110, 116, 101, 110, 116, 45, 76

  3. 101, 110, 103, 116, 104, 58, 49, 54,10,13,10,13,116, 120, 116

  4. 78, 111, 109, 98, 114, 101

  5. 61, 74, 111, 104, 97, 110

Cuando se está percibiendo datos TCP y haciendo un parsing para Formatear Mensajes, se tiene que saber que bytes corresponden a el encabezado del mensaje actual, el contenido del mensaje actual o el encabezado de los siguientes mensajes que se recibirán. Las operaciones a realizar son las siguientes:

  1. Leer todas las líneas del encabezado hasta encontrar una línea en blanco, que equivale a encontrar la secuencia de bytes 10,13,10,13.

  2. Si el encabezado contiene una sentencia Content-Length y su valor es mayor a 0, entonces después del encabezado se tomaran cuantos bytes se reciban como contenido del Mensaje hasta agotar la cantidad especificada. Ejemplo: Si se recibe en el encabezado la línea ‘Content-Length:3563’, entonces se tomaran los 3563 bytes que se reciban en uno o más flujos de datos después de encontrar la secuencia 10,13,10,13.

Ejemplo:

Ultima Línea del Encabezado

Fin de Línea en Blanco

56

34

673

10

13

10

13

43

48

34

Final de Encabezado HTTP

Contenido

En una proxima entrega explicare como se ha implementado este Procolo en C#.

Siguiendo Tutorial de PHP Symfony en Ubuntu

Desde hoy me han encargado de un proyecto en PHP, especificamente con PHP Symfony(un framework MVC) asi que me he descargado el Symfony Sandbox y configurado en mi Apache2 pero he encontrado algunas dificultades con los comandos de symfony al ejecutar el Tutorial y por eso escribi este post para guiarles acerca de los paquetes necesarios para seguir correctamente el Tutorial. Los paquetes con los siguientes: php5-xsl php5-sqlite Debido a que el tutorial trabaja con SQLLite para almacenar los datos, se debe reiniciar apache2 para que el php de apache cargue los modulos recientemente instalados: $apache2ctl restart o $/etc/init.d/apache1 restart El libro se pude descargar por eMule o en la pagina oficial de Symfony. Suerte con PHP Symfony.

Wednesday, November 28, 2007

Seminario: "Capacidades de Ubuntu Linux 7.10 Gutsy Gibbon" en Kapacita

Hoy 28 de Noviembre estare dictando un seminario de Ubuntu Linux en Kapacita, un instituto de Tecnologia aqui en la ciudad de Caracas que esta introduciendo excelentes Cursos para Certificacion en Linux y Ubuntu. Pronto estaremos impartiendo otro seminario que puede ser de tu interes, escribeme un comentario o enviame un correo a johan@ubuntu.org.ve o a thepumpkin1979@gmail.com. El 8 de Diciembre tambien estare en la ciudad de Maracaibo para un evento de Ubuntu, pronto les dare mas detalles. Si eres de Maracaibo tambien podras asistir. Saludos.

Sunday, November 18, 2007

Separador de Mensajes TCP

Hace tiempo que no escribo y es que he estado trabajando en Demasiadas, Demasiadas cosas interesantes, una de ellas es la reconstruccion de mi Servidor HTTP. La otra tarea no tan trivial es un Protocolo de Mensajeria Interna en LAN y con routing a varios servidores. En fin, el punto es que Ambos requieren que sobre TCP se transmitan diferentes tipos de mensajes. Porque no usar .NET Remoting? Muy pesado para tantas conexiones y necesito hacer clientes en diferentes plataformas basados en un sola definicion de protocolo y no tengo tanta experiencia haciendo SinkProviders de Remoting asi que he decidido hacer un separador de Mensajes TCP. Porque TCP necesita un separador de mensajes? TCP(combinado con IP) es un protocolo de transmision de flujos de datos, no de mensajes. Cual es la diferencia? En un protocolo de Flujo de Datos(Data Stream) se envian los datos en el mismo orden pero no se tiene seguridad de que lleguen de la misma forma y lo voy a explicar asi. Un punto de Red llamado A envia datos a un punto de red llamado B: Punto de Red 'A' Envia los siguientes flujos(cada linea representa un flujo de datos):
  1. 23,34,11,73
  2. 34,67,83,96
El punto de Red 'B'(quien recibe los mensajes) podria recibir los mismos datos en la misma o diferente cantidad de flujos:
  1. 23
  2. 34,11
  3. 73,34,67
  4. 83,96
Como veran los datos llegan en el mismo orden pero no de la misma forma debido a que TCP garantiza que el flujo llegue al destino en el orden original pero no de la misma forma y esto se puede observar en el ejemplo donde 'A' envia 2 flujos pero 'B' recibe 4, sin embargo los bytes llegan de la misma forma. Tambien se puede demostrar esto asi: 'A' envia los siguientes textos representados en flujos(cada linea representa un flujo):
  1. Este es el contenido de el Archivo 1
  2. pero el Archivo 1 tambien tiene otra linea que es esta.
  3. (B, Aqui comienza el Archivo2)
  4. Esta es la linea del Archivo 2
'B' recibe:
  1. Este es el contenido de el
  2. Archivo 1pero el Archivo 1
  3. tambien tiene otra linea que
  4. esta
  5. (B
  6. , Aqui comienza el Archivo2)
  7. Esta es la linea
  8. del Archivo 2
Como podran observar no es posible contar con TCP para manejar conceptos de 'formas de datos', solo podemos contar con TCP para conceptos de 'transmision de datos'. En un protocolo de Red basado en mensajes se Garantiza que los Datos lleguen en el mismo Orden en la Forma original(esto se conoce como 'Mensaje'): Ejemplo: El Punto de Red 'A' envia 2 mensajes:
  1. {23,34,11,73}
  2. {34,67,83,96}
El punto de Red 'B' recibe 2 mensajes:
  1. {23,34,11,73}
  2. {34,67,83,96}
Nota: las llaves indican agrupacion de bytes, es decir, un mensaje completo. Con un protocolo basado en Mensajes se puede tener la seguridad de que los mensajes enviados llegaran de la misma forma con la que fueron enviados. Hay una implementacion de Ordenamiento y Forma de Mensajes de Red llamado SCTP pero es implementado por el Sistema Operativo, no por la aplicacion. Porque no usar SCTP? SCTP es soportado en pocas plataforma(Windows no es una de ellas) sobre IPv6 y mi Protocolo de Mensajeria LAN tiene que funcionar en IPv4 sobre Linux y Windows, ademas debo reutilizarlo para HTTP el cual trabaja sobre IPv4 y IPv6. No tengo mas opciones que desarrollar uno, publicare el codigo fuente pronto en Google Code. En una nueva entrega explicare como funciona HTTP y como estoy desarrollando el separador de mensajes en C# y Mono. Saludos.

Wednesday, November 7, 2007

Resultado de Encuenta: ¿Que OS Consideras Ideal para Servidores de Alta Disponibilidad?

El ganador fue Debian Linux, seguido de su hijo Ubuntu y ('el dios de los RPM') RedHat Linux en tercer lugar. Asi quedo el resultado: 1. Debian Linux - 50 (37%) 2. Ubuntu Linux - 39 (28%) 3. Redhat Enterprise Linux - 29 (21%) 4. Sun Solaris - 26 (19%) 5. Novell SUSE Linux Enterprise - 17 (12%) 6. BSD - 12 (8%) 7. Microsoft Windows Server 2003 - 11 (8%) 8. Fedora Linux - 7 (5%) 9. Apple OS-X Server - 4 (2%) 10. HP-UX - 4 (2%) Gracias a los que participaron en la encuesta.

Thursday, October 18, 2007

PHP ERROR: Call to undefined function pg_connect()

Cuando este error sucede quiere decir que no tienes instalado la extension de PostgreSQL-PHP que permite hacer consultas a bases de datos PostgreSQL desde PHP. Para resolverlo en Ubuntu se debe instalar el paquete "php5-pgsql". En linea de comandos es asi: $sudo aptitude install php5-pgsql Despues procedemos a reinicar el servidor apache de la siguiente forma: $sudo aptitude /etc/init.d/apache2 restart Listo, ahora reintenta otra vez usar la aplicacion PHP que te arrojo la falla.

Wednesday, October 17, 2007

monodis: Desensamblar aplicacion o libreria de Mono

Entre las herramientas de Mono podemos encontrar la utilidad "monodis"(analoga a la herramienta de Microsoft .NET Framework 'ildasm') que nos funcionara para desensamblar el codigo IL compilado en un ensamblado, ya sea .dll o .exe. ¿Que finalidad tiene ver el codigo IL generado por el compilador? Pues es vital para los desarrolladores de compiladores, util para robar codigo:O o interesante para los curiosos;) Vamos a probarlo! ¿Que vamos a hacer? Crear un archivo de codigo fuente sencillo(main.cs), compilarlo con el compilador de mono 1.1(mcs) y finalmente desensamblarlo con la utilidad monodis. Abrimos una Terminal de Linux o una Consola y ejecutemos los siguientes pasos: Creamos archivo de ejemplo: echo "using System; class MainC{ static void Main(){ Console.WriteLine(\"Saludos\"); } }" > main.cs Compilamos: mcs -out:main.exe main.cs Ejecutamos para probar el compilado: mono main.exe Desensamblamos: monodis --output=main.exe.il main.exe Eso nos ha generado nuestro archivo de codigo fuente IL y ahora vamos a imprimirlo completo en la consola: cat main.exe.il Estos pasos permiten guardar el codigo IL en un archivo pero no es necesario guardar el codigo en un archivo para inspeccionar el desensamblado, con simplemente ejecutar "$monodis nombre-enamblado" ya nos imprimira el codigo IL. Ejemplo: monodis main.exe El resultado tanto del comando anterior como del archivo main.exe.il deberia ser algo parecido al siguiente archivo descargable: main.exe.il Listo! Estoy preparando una manual practico para entender IL, en los proximos dias lo estare publicando. Saludos!

Sunday, October 14, 2007

Comprobaciòn MD5 de un archivo en Linux

Para obtener el codigo MD5 de un archivo en Linux se usa el comando md5sum, use la siguiente sentencia: md5sum nombreArchivo Es importante tener guardado por otro medio el codigo MD5 Original del archivo para compararlo, si es md5 arrojado por la utilidad md5sum es diferente al original que se le proporciono por otro medio entonces el archivo no se transmitio correctamente o fue violentado.

Friday, October 5, 2007

En Busqueda de Hosting

Saludos lectores. Hoy en dia casi cualquier persona hace hosting web y ya he caido dos veces en pésimos servicios de hosting(sobre todo resellers), por favor si tienen experiencia con algun Web Hosting que me puedan recomendar por favor dejen un comentario, se los agradecere enormemente. Estoy buscando lo siguiente
  • Control de MIMES
  • Almacenamiento en disco > 50GB
  • Trasnferencia > 4GB/Mes
  • Al menos 3 bases de datos PostgreSQL
  • PHP 5.x
  • Alias para extensiones PHP
  • Subdominios Ilimitados
  • POP3,SMTP,IMAP
  • Cuentas de Correo Ilimitadas
  • Spam protection
  • Backups automatico de PHPScripts y PostgreSQL
Saludos.

Monday, September 24, 2007

Instalando Gnome Vala en Ubuntu

La gente de Gnome ha inciado un proyecto interesante llamado Vala en su intento de Agilizar la Velocidad de Desarrollo para las librerias GNOME sin sacrificar Memoria RAM(cosa que critican directamente de Mono y Java). "Vala" hace parsing de una sintaxis muy pero muy similar a C# pero en vez de compilar a Nativo o a IL, compila a language C(.h y .c) "Compiler for the GObject type system" y por supuesto no necesita runtime. En fin, si quieren probarlo ustedes mismos aqui estan los pasos para instalarlo en Ubuntu: 1. Descargar los fuentes de Vala: wget http://download.gnome.org/sources/vala/0.1/vala-0.1.3.tar.bz2 2. Descomprimir: tar -xvf vala-0.1.3.tar.bz2 La descompresion ha creado el directorio vala-0.1.3 cd vala-0.1.3 3. Preparamos la compilacion ./configure 4. Compilamos. make 5. Instalamos. sudo make install Listo. Ahora solo nos queda probar el compilador(valac) y para esto creamos un archivo llamado "main.valac" y colocamos el siguiente contenido: using GLib; public class Sample : Object { public Sample () { } public void run () { stdout.printf ("Hello World from http://johansoft.blogspot.com\n"); } static int main (string[] args) { var sample = new Sample (); sample.run (); return 0; } } Compilamos: valac -o main main.vala Ejecutamos: ./main Listo:) El resultado deberia ser el siguiente: Hello World from http://johansoft.blogspot.com

Friday, September 21, 2007

Solucion: ERROR: language "plpgsql" does not exist

PostgreSQL puede ser programado con muchos lenguages y el mas usado es PL/pgSQL pero no siempre se instala por defecto. Para corregir este problema en Ubuntu Linux se realizan los siguientes pasos: 1. Localizar el archivo plpgsql.so Este archivo es una libreria de funciones que ejecuta el codigo PL/pgSQL, para localizarlo hacemos lo siguiente: $sudo updatedb $locate plpgsql.so Con estas instrucciones Linux localizara el archivo y nos dara la ruta de la libreria, en mi caso para Ubuntu 7.04 y PostgreSQL 8.2 la ruta seria la siguiente: /usr/lib/postgresql/8.2/lib/plpgsql.so 2. Instalar el handler y lenguage. Una vez localizada la ruta de la libreria handler del lenguage(ver paso 1) se procede a crear el handler en PostgreSQL, para esto se necesita una conexion a PosgreSQL que puede hacerse con pgadmin3 o la utilidad de linea de comandos psql. Envie a PostgreSQL los siguientes comandos: CREATE FUNCTION plpgsql_call_handler () RETURNS OPAQUE AS '/usr/lib/postgresql/8.2/lib/plpgsql.so' LANGUAGE 'C'; CREATE LANGUAGE 'plpgsql' HANDLER plpgsql_call_handler LANCOMPILER 'PL/pgSQL'; Listo, con esto ya creo el lenguage PL/pgSQL correctamente. Intente ejecutar nuevamente el script que genero el error original. Nota: la creacion o configuracion de cada lenguage de PostgreSQL se hace por base de datos, no en el servidor o en todas las bases de datos al mismo tiempo. Si necesita crear el leguage en varias bases de datos debe ejecutar el Paso 2 en cada base de datos o ejecutar el Paso 2 en alguna de las plantillas(template0,template1,etc) y despues crear las otras bases de datos futuras basadas en esta plantilla. Consulte tambien Acerca de PL/pgSQL [Actualizacion-28/09/2007] El error tambien puede ocurrir en Windows con el instalador por defecto de PostgreSQL, el handler puede que este creado pero no el lenguage. Para solucionarlo ingrese con el usuario POSTGRES en la base de datos donde necesita el lenguage y ejecute el siguiente script: CREATE TRUSTED PROCEDURAL LANGUAGE 'plpgsql' HANDLER plpgsql_call_handler VALIDATOR plpgsql_validator; Si el handler no existe se debe crear usando el procedimiento mencionado mas arriba para Linux pero aputando al archivo plpgsql.dll(que normalmente se encuentra en "C:\Archivos de programa\PostgreSQL\8.2\lib" si no se cambio la ruta de instalacion por defecto).

Tuesday, September 18, 2007

Resultados de encuesta: "Que lenguages de programacion empleas mas?"

Desde agosto coloque una encuesta en mi blog bajo el titulo "Que lenguage de programacion empleas mas?" y los resultados finales fueron los siguientes: Los ganadores: 1. PHP 2. SQL 3. Java A continuacion el Total de Votos:
SQL
155 (38%)
C#
107 (26%)
Java
149 (37%)
XML
53 (13%)
Phyton
53 (13%)
PHP
174 (43%)
Ruby on Rails
30 (7%)
Saludos y Gracias a todos los que participaron en la encuesta.

Como Obtener Informacion del CPU en Windows con .NET/C#

En Windows es bastante sencillo. ProcessorInfo[] procesadores = ProcessorInfo.GetList(); foreach(ProcessorInfo cpu in procesadores) { Console.WriteLine("CPU ID={0},DeviceId={1},Name={2},Machine={3}",cpu.Id,cpu.DeviceId,cpu.Name,cpu.SystemName); } El ejemplo anterior escribe lo siguiente en la consola: CPU ID=BFEBFBFF00000F41,DeviceId=CPU0,Name=Intel(R) Pentium(R) 4 CPU 2.66GHz,Mac hine=ACSA08 Donde ProcessorInfo es una clase que puedes descargar en la siguiente direccion: Descargar ProcessorInfo.cs

Feliz Cumpleaños Linux!

Saludos a todos los colaboradores y empresas que apoyan a Linux y el Software Libre. Feliz Cumpleaños Tux!

Monday, September 17, 2007

Configurar Conexion Remota de Usuarios en MySQL5 en Ubuntu/Debian

MySQL 5 al igual que muchas otras bases de datos no permite conexiones remotas en su instalacion por defecto y hay que realizar ciertos pasos para configurarlo: 1. Editar el archivo /etc/mysql/my.cnf: Reemplazar esto: bind-address = 127.0.0.1 Por lo siguiente: bind-address = 0.0.0.0 Luego de guardar el archivo se procede a reiniciar el servidor de bases de datos MySQL, se puede hacer con el siguiente comando: /etc/init.d/mysql-server restart Aunque con estos paso ya hemos configurado a MySQL Server para permita conexion remota los usuarios no necesariamente puedan conectarse. 2. Permitimos al usuario conexion remota: Iniciamos la utilidad "mysql" en un Terminal del servidor donde esta instalado mysql server con el siguiente comando: mysql -u root -p Colocamos nuestra contraseña de root para mysql y procedemos a configurar a los usuarios para acceso remoto: GRANT ALL PRIVILEGES ON *.* TO root@'%'; FLUSH PRIVILEGES; Con la instruccion anterior se permite al usuario "root" conexion remota desde cualquier PC y aunque esta es la solucion mas sencilla no es la mas segura. Se debe asignar conexion remota por IP o Nombre de dominio. Ejemplo, con la siguiente instruccion se le permite conexion remota al usuario root desde la PC con la direccion IP 192.168.0.5: GRANT ALL PRIVILEGES ON *.* TO root@192.168.0.5 FLUSH PRIVILEGES; Nunca olvide hacer FLUSH PRIVILEGES para que los cambios en el sistema authenticacion y autorizacion de MySQL se hagan efectivos al momento. En los ejemplos anteriores se usa *.* para indicar que el usuario tiene acceso a todas las bases de datos con todos sus objetos(tablas, vistas, funciones) pero es buena practica tambien solo dar acceso a las bases de datos especificas. Ejemplo, con la siguiente instruccion vamos a asignar acceso remoto desde la direccion IP 192.168.0.5 al usuario "root" para la base de datos "administracion" GRANT ALL PRIVILEGES ON administracion.* TO root@192.168.0.5 FLUSH PRIVILEGES; Para mas informacion consulte los siguientes temas:

Wednesday, September 12, 2007

Medir Periodos de Tiempos en C#

En .NET 2.0 y disponible tambien en Mono tenemos la clase System.Diagnostics.Stopwatch que nos permite medir con milisegundos el tiempo transcurrido en un periodo. Ejemplo: System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch(); watch.Start(); System.Threading.Thread.Sleep(100); watch.Stop(); System.Console.WriteLine("Transcurrido: {0}", watch.ElapsedMilliseconds); Realmente util no? Hace tiempo habia implementado uno para medir los tiempos de ejecucion pero este esta sencillo y practico.

Tuesday, September 11, 2007

Cambiar Contraseña de Usuario 'postgres' en Ubuntu

En un post anterior ya he comentado que el instalador de PostgreSQL para Ubuntu asigna una contraseña aleatoria al usuario 'postgres' y que esta debe ser cambiada manualmente post-instalación. Esto no es un error en el instalador, es una comportamiento de seguridad por defecto del instalador. Cambiano la contraseña Para cambiar la contraseña en una instalación por defecto o porque simplemente se olvido la contraseña y no existen mas usuarios se hace lo siguiente en una terminal: 1) Impersonar al usuario 'postgres'. $sudo su postgres 2) Ejecutar la utilidad psql $psql En este momento se esta conectando a la base de datos usando el usuario 'postgres', con este usuario puede cambiar contraseñas de muchos usuarios incluso del mismo 'postgres'. Ahora vamos a cambiar la contraseña, ejecute sobre la linea de comandos actual la siguiente secuencia donde 'passwd' es la contraseña nueva(debe utilizarse comillas simples): alter user postgres with password 'passwd'; Si el programa response con el mensaje 'ALTER ROLE' la contraseña se ha cambiado correctamente. Para salir se la utilidad escriba: \q para salir del usuario 'postgres' escriba lo siguiente: exit Listo. La contraseña se ha cambiado correctamente. Probando la conexion Para probar la conexion se puede utilizar la misma utilidad 'psql' de la siguiente forma: psql -U postgres -W Presione ENTER e introduzca la nueva contraseña(usted debio haberla cambiado en el ejemplo anterior, si no lo hizo la contraseña es 'passwd').

Instalar PostgreSQL en Ubuntu Linux

Instalacion Instalar Postgresql en Ubuntu es bastante sencillo, yo uso Ubuntu 7.04 e instalo postgresql desde los repositorios oficiales que tienen PostgreSQL 8.2. Para instalar se puede utilizar synaptic e instalando el paquete llamado 'postgresql-8.2' o usando aptitude en una terminal. Para instalar abra un terminal y ejecute el siguiente comando: $sudo aptitude install postgresql-8.2 Escriba 'Y'(si) para descargar e instalar automaticamente y cuando finalice el proceso postgresql estara correctamente instalado pero no se inicia automaticamente, debe iniciarse el servicio manualmente. Iniciando el Servicio PostgreSQL Manualmente Esta tarea puede realizarse usando la interfaz grafica o con una terminal: Iniciar usando Servicios de Ubuntu: Hacer click en el menu System->Administration->Services y marcar el servicio Database Server(postgresql-8.2) como se muestra a continuación: Con esta acción se iniciara la base de datos. Iniciar usando usando Terminal: Abra una terminal y ejecute el siguiente comando: $sudo /etc/init.d/postgresql-8.2 start Listo, ya se ha instalado e iniciadio la Base de Datos. Existe un Pequeño problema que realmente no es un problema, es una caracteristica de Seguridad del Paquete de Instalacion de Ubuntu que no revela cual es la contraseña que se le asigno al usuario 'postgres', sin embargo, he creado la siguiente guia para ayudar a solventarlo: Cambiar la contraseña del usuario 'postgres'

Tuesday, September 4, 2007

Abrir o Extraer Archivos con extension 7z

Hoy en dia hay un sin numero de formatos de compresion de archivos desconocidos para mi y uno de esos es .7z. Por defecto el descompresor para este tipo de archivos no viene instalado en Ubuntu 7.04 asi que si alguna ves intentas descomprimir o extraer un archivo con extension 7z y te aparece alguna vez te aparece la pantalla que puedes ver a su izquierda solo tienes que instalar el paquete llamado "p7zip-full" usando Synaptic o por terminal usando el siguiente comando: $sudo aptitude install p7zip-full Eso es todo, intenta nuevamente descomprimir el archivo y todo funcionara correctamente.

Tuesday, August 28, 2007

Compactar base de datos PostgreSQL

¿Porque necesito compactar una base de datos PostgreSQL?
PostgreSQL como la mayoria de los servidores de bases de datos no elimina los registros fisicamente de las tablas sino que los marca para ser eliminado posteriormente por razones de rendimiento del comando DELETE.
¿Que consecuencias tiene no compactar la base de datos?
Probablemente hayas llegado a este blog buscando la razon por la que la base de datos tiene un tamaño muy exagerado comparado con la cantidad de registros que tienes y el rendimiento de la base de datos en las instrucciones UPDATE, SELECT e INSERT se estan tardando demasiado en ejecutarse.
¿Cuales son y porque existen diferentes tipos de compactacion en PostgreSQL?
La compactacion en PostgreSQL se lleva a cabo usando el comando SQL VACUUM, sin embargo, este tiene varios modificadores o argumentos dependiendo de la necesidad o la ocasion, estas son las mas importantes:
VACUUM ANALIZE : Actualiza las estadisticas de almacenamiento de las tablas que son usadas por el motor de bases de datos para determinar la forma mas veloz de ejecutar una Consulta, sin embargo, este no bloquea la tabla de forma exclusiva y solo necesita un Cursor de Solo-Lectura, es decir, solo actualiza las estadisticas para mejorar los queries.
VACUUM FULL : Realiza una coleccion de registros eliminados completa reclamando espacio en la base de datos ocupado por registros marcados para ser eliminados. Este comando bloquea las tabla e impide que otras conexiones realicen operaciones sobre la tabla o las tablas afectadas.
Nota: para ambos comandos, el nombre de la tabla es opcional. Si no es especifica el nombre de la tabla, la operacion se realiza sobre la base de datos en la que la conexion donde se ejecuta el comando esta trabajando.
¿Cuando ejecutar cada tipo VACUUM?
Es recomendable realizar VACUUM ANALYZE despues de una considerable cantidad de modificaciones sobre una tabla y realizar VACUUM FULL cuando no exista utilizacion sobre la base de datos, por ejemplo en horas nocturnas fuera del horario de trabajo. pgAgent es un excelente ayudante para este tipo de trabajos programados.
¿Como ejecutar VACUUM en linea de comandos en el servidor?
Usando psql
Para esta tarea podemos usar la utilidad de terminal psql usando el usuario postgres, en ubuntu o debian podemos hacer esto usando los siguientes comandos:
$sudo su postgres
$psql
$VACUUM ;
NOTA: Para ver el progreso del comando puede utilizar el modificador VERBOSE
Para salir de la utilidad psql utilice \q
Usando pgAdminIII
Abre la conexion con el servidor de bases de datos usando pgAdminIII y selecciona en el arbol izquierdo el nombre de la base de datos que se compactara: Click Derecho y Seleccione "Mantenimiento" el cual le mostrara una ventana como la siguiente:

Monday, August 27, 2007

Porque migrar y programar en Linux?: Perspectiva de un Desarrollador

Soy usuario de Windows desde los 9 años, desarrollo aplicaciones para Windows desde los 17 años: ¿Porque usar y programar en Linux? Existen cientos de razones que la comunidad de Linux pero para mi la mas importante es la seguridad: Seguridad La seguridad de Windows es un tema muy extenso, pero puedo resumir el problema en dos factores: Windows esta basado(toma comportamiento) en MS-DOS, un sistema de 1 Usuario y Tarea concurrente que luego fue transformado de version en version en lo que hoy se conoce como Windows. Debido a que Microsoft mantiene todo el Legacy posible con sus versiones anteriores orientadas al usuario final, la seguridad en ambientes Multi-usuario no es prioridad de programacion o configuracion del Sistema Operativo Windows dejando su punto mas debil en su FileSystem(Fat, Fat32 o NTFS) hasta el punto que Windows no se puede operara conectado a internet sin un Antivirus Preinstalado, asi mismo los desarrolladores de sus aplicaciones como Internet Explorer, Outlook, Live Messenger tienen muy baja seguridad. Eso tiene muchas formas de verse: estrategia comercial, despreocupacion por la seguridad o la razon mas aceptada entre desarrolladores de linux: facilidad de uso al usuario final. Economia Microsoft utiliza un modelo de Licenciamiento y Ventas de Servicio de sus productos que le ha dado su exito economico y dado a su facilidad de uso es la primera opcion para grandes empresas con gran poder adquisitivo ya que existen muchos mas desarrolladores que realicen tareas comunes como aplicaciones de mandejo de datos cediendo conocimientos solidos en seguridad de sistemas. Sin embargo para mi ya no es una opcion vivir pagando mas de 3000 $ USD para poder "mantener" estacion de trabajo con la ultima version de Windows, Office, Visual Studio, SQL Server y Antivirus porque en Linux eso me cuesta 0$ con software libre. ¿Como como puedo yo realizar las mismas tareas cotidiandas de Oficina y Programacion de Windows en Linux? La facilidad es relativa y es un completo mito para los programadores de Windows que escuchan hablar de desarrollos en Linux y todo se debe a su desconocimiento, a continuacion presento una tabla comparativa entre los productos de desarrollo que actualmente ofrece Microsoft por unos miles de dolares y que estan disponibles en Linux completamente gratis. Del lado izquierdo presento el producto de Microsoft o alguna empresa que vende software propietario y del lado derecho el software libre: Microsoft Office 2003 -> OpenOffice 2 o Gnome Office Microsoft Visual Studio 2005 y .NET -> MonoDevelop y Mono Microsoft SQL Server 2005 -> PostgreSQL Server 8 Antivirus -> No es necesario. VMWare Workstation -> VirtualBox Nota: Aunque MySQL es la opcion mas famosa de bases de datos, no es tan estable en almacenamiento como PostgreSQL. Si eres como yo, programador en Tecnologia .NET, el proyecto Mono es tu mejor eleccion para implantar aplicaciones en Linux. Apoyado por el IDE MonoDevelop, Mono Framework posee las siguientes tecnologias: XSP: Permite crear y ejecutar aplicaciones ASP.NET 2.0 creadas con o sin Visual Studio sobre Apache Web Server. ADO.NET: Mono tiene una implementacion completa del namespace System.Data permitiendo conectarse con diferences conectores como el de PostgreSQL, MySQL, Microsoft SQL Server, SqlLite y Oracle todos ellos incluidos en los paquetes de instalacion de Mono. GTK#: Permite crear interfaces graficas que se ajustan al aspecto visual del sistema operativo basadas en las librerias multiplataforma GTK, ideal para aplicaciones de Escritorio en entorno Gnome. WindowsForms: Permite ejecutar aplicaciones creadas en las librerias WinForms para Windows sobre Linux. Recuerda que en las listas de correo de MonoHispano y su canal de chat IRC #mono-hispano en el servidor irc.gimp.org estamos muchos usuarios de habla hispana dispuesto a ayudarte y orientarte en la plataforma Mono.

Tuesday, August 21, 2007

Conexion remota PostgreSQL y Firewall iptables

En estos dias tenia un problema con postresql 8.1, no me podia conectar remoto fuera de la red local y la solucion es modificar el postgresql y agregar unas reglas al iptables. Esto fue lo que hice para permitir la conexion remota: Nota: todos las rutas a los archivos de configuracion excepto el comando para modificar las reglas del iptables estan adaptadas a Debian/Ubuntu. 1. Archivo /etc/postgresql/8.1/main/postgresql.conf: La propiedad listen_addresses y port deben estar de la siguiente forma: listen_addresses = '*' port = 5432 2. En el archivo /etc/postgresql/8.1/main/pg_hba.conf quite el comentario(#) a la siguiente linea en la seccion IPv4: host all all 0.0.0.0/0 md5 3. Ejecute los siguientes comandos en la terminal sudo iptables -t filter -A OUTPUT -p tcp --sport 5432 -j ACCEPT sudo iptables -t filter -A INPUT -p tcp --sport 5432 -j ACCEPT 4. Reiniciar el postgresql sudo /etc/init.d/postgresql-8.1 restart Si no existe un DROP en el iptables que contrareste el efecto de la nueva regla aplicada, ya deberias poder conectarte de forma remota.

Saturday, August 18, 2007

The ALTER TABLE statement conflicted with the FOREIGN KEY constraint. WTF?

Estoy desarrollando mi Sitio Web Personal(unleash-dev) en ASp.NET 2.0 y MS SQL 2005 pero sinceramente he empezado a extrañar mucho PostgreSQL. ¿Porque? Analicemos el siguiente error: "The ALTER TABLE statement conflicted with the FOREIGN KEY constraint " WTF?. ¿Como he logrado que me de este error tan abstracto y indepurable? Ja!. He creado una tabla con una columna NOT NULL y DEFAULT VALUE, cuando intente crear un foreign key desde esta columna local a una tabla remota(donde se supone que deberia estar creado el valor por defecto) ocurre el error. Ahora: ¿Porque Microsoft SQL Server Team, con tantas demoras entre versiones, no puedes colocar un mensaje mas explicativo? Shit! Mi ingles no es bueno, pero les dare unas recomendaciones: A) "The ALTER TABLE statement conflicted with the FOREIGN KEY constraint because column DEFAULT VALUE violates referential integrity" B) "local column DEFAULT VALUE conflicted ALTER TABLE ADD CONSTRAINT Statement" C) "Your fucking local column Default value is freaking out the referencing table in you ADD CONSTRAINT Statement" Pick one Microsoft, Just pick one! :@ Aprovecho para mencionar que la paginacion de SQL Server 2005 Apesta! y ni hablar de la de SQL 2000. Necesito mi LIMIT y OFFSET.

Interactive Linux Kernel Map

Asombroso mapa del Kernel de Linux, no dejen de consultarlo. Estoy seguro que Windows no tiene uno ya que Windows no es OpenSource -:) http://www.linuxdriver.co.il/kernel_map

Saturday, July 21, 2007

Solved! "exePath must be specified when not running inside a stand alone exe" Embedding Mono

Currently i'm Embedding Mono in XChat, but it was giving me errors trying to get values from Configuration File System.ArgumentException: exePath must be specified when not running inside a stand alone exe. at System.Configuration.ConfigurationManager.OpenExeConfigurationInternal (ConfigurationUserLevel userLevel, System.Reflection.Assembly calling_assembly, System.String exePath) [0x00000] at System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection (System.String configKey) [0x00000] at System.Configuration.ConfigurationManager.GetSection (System.String sectionName) [0x00000] The Solution is simple: pass the assembly path to mono exec in the first argument for the function mono_jit_exec. char * boot_assembly = "myAssembly.exe" ... MonoDomain * dom = mono_jit_init(boot_assembly); MonoAssembly * masm = mono_domain_assembly_open(dom,boot_assembly); char *argv [1]; [0] = boot_assembly; [1] = NULL; mono_jit_exec (dom, masm, 1,argv);

How to MD5 in .NET & Mono

Simple code: using System.Security.Cryptography; //... private readonly static MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); public static string CreatePasswordMD5(string password) { MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); byte[] bs = System.Text.Encoding.UTF8.GetBytes(password); bs = md5.ComputeHash(bs); System.Text.StringBuilder s = new System.Text.StringBuilder(); foreach (byte b in bs) { s.Append(b.ToString("x2").ToLower()); } return s.ToString(); } // Usage: Console.WriteLine(CreatePasswordMD5("p@ssw0rk!"));

Tuesday, July 10, 2007

X-Chat Mono

I have published x-chat-mono OpenSource API, with this API you can build Managed Plugins compiled with Mono. Featuring:
  • Register and Receive plugin commands
  • Send IRC Commands
  • Send Prin
See the project page for more information: http://code.google.com/p/xchat-mono/ Enjoy!

Wednesday, July 4, 2007

How to Install Moonlight & Desklets Step by Step UPDATED

(Last Update: Agost 2, 2007; moon SVN revision: 83286) This guide describes the common installation process for Moonlight, you can get the original one here. Requirements:
  • Mono 1.2.4
  • ffmpeg Sources
  • Moonlight Sources
  • Olive
  • Mono Libraries
  • Mozilla Development Libraries
  • Beryl or Compiz
Process: 1. Installing Mono 1.2.4: You will need download and Install Mono 1.2.4(Ubuntu 7.04 Users can use Viraptor Packages) Refresh and Install the Updates for the New Mono Packages. 2. Download and Configure ffmpeg from SVN: $svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg $cd ffmpeg $./configure --prefix=/usr/local $sudo make install 4. Install additional packages +and dependencies:
  • libnspr-dev
  • libnss-dev
  • firefox-dev
  • libmono-system-messaging2.0-cil
  • libcairo2-dev
  • libgtk2.0-dev
  • libasound2-dev
  • mono-devel
  • libmono-cairo2.0-cil
Note: Packages names are references to Ubuntu or Debian packages I recommend use aptitude or synaptic 5. Download and Configure Libraries Olive: $svn co svn://anonsvn.mono-project.com/source/trunk/olive olive $cd olive $./configure --prefix=/usr $make $sudo make install If you want to check your Olive configuration you can check this using Mono gacutil tool: $gacutil -l agclr The output should be: The following assemblies are installed into the GAC: agclr, Version=0.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 Number of items = 1 6. Download and Configure Moonlight: $svn co svn://anonsvn.mono-project.com/source/trunk/moon moon $cd moon $./autogen.sh --prefix=/usr $sudo make install 7. Enable Desktop Effects: Go to System->Preferences->Desktop Effects and enable it, beryl or compiz should work too. Now you can test the Moonlight Installation running the following command in a terminal: $mopen Moolight Launcher should run and show the following information: Usage is: mopen [args] [file.xaml|dirname] Arguments are: --fixed Disable window resizing --geometry WxH Overrides the geometry to be W x H pixels --host NAME Specifies that this file should be loaded in host NAME --transparent Transparent toplevel --desklet Remove window decoration for desklets use Even when you can read the message, you need to run a Moonlight Enabled Application to ensure the installation process was successful: Example: runing glassyclock desklet: $cd desklet $make $cd glassyclock $make $mopen --desklet default.xaml If you can see the beautiful clock, Congratulations!, if you see a black an ugly clock then you have no Desktop Effects/Beryl/Compiz Enabled.

Monday, July 2, 2007

MonoDevelop 0.14 Short Demo

He comenzado a crear unos videos demos de MonoDevelop 0.14 y este es el primero. Aun estoy investigando como agregarle mas resolucion a los videos se ven bastante borrosos.

Ejemplo de Evolution#

Para quien necesite agregar un contacto a Evolution con Evolution#, el codigo es el siguiente. using System; using Evolution; namespace myEvolutionAutomation { class MainClass { public static void Main(string[] args) { Evolution.Book b = new Book(); Contact contact = new Contact(); contact.BlogUrl = "http://johansoft.blogspot.com"; contact.FullName = "ThePumpkin"; contact.Title = "Mr"; Console.WriteLine("Can Open Book?= {0}",b.Open(true)); Console.WriteLine("Can Add contact ={0}",b.AddContact(contact)); b.CommitContact(contact); } } }

Sunday, July 1, 2007

WSDL 2.0

Ha nacido el WSDL 2.0. Ya hacian falta las interfaces en los Web Services:)

Saturday, June 30, 2007

Monodevelop Class Pad Improvements

He aqui algunos improvements que he enviado a Monodevelop.
  • Generics
  • Metodos con parametros
  • Indexers

Moonlight y Desklets en Ubuntu

(an english version available) Es impresionante lo rapido que va el equipo de Mono con el Proyecto Moonlight, ya lo he instalado y ejecutado los Desklets que es un proyecto inciado por Everaldo Canuto, aqui les dejo un video de mi escritorio. Esta es la guia oficial para instalar Moonlight, sin embargo yo he recopilado unos pequeños pasos claves para instalar en Ubuntu. Recuerdo a los lectores que no me me hago responsable por los daños que les pueda causar estas instrucciones: Comenzemos: Necesitamos Mono 1.2.4 y los fuentes de ffmepg,Moonlight y Olive. 1. Mono 1.2.4: Debido a que yo uso Ubuntu Feisty y no hay paquetes oficiales de Mono 1.2.4, estoy usando bajo mi responsabilidad y concentimiento los paquetes de Viraptor. 2. Descargar el ffmpeg desde SVN: $svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg 3. Compilar ffmpeg: $cd ffmpeg && ./configure --prefix=/usr/local && make && sudo make install 4. Instalar XPCOM de Mozilla: Usando aptitude o synaptic, instale los siguientes paquetes con sus dependencias:
  • libnspr-dev
  • libnss-dev
  • firefox-dev
5. Descargar Olive: $svn co svn://anonsvn.mono-project.com/source/trunk/olive olive $cd olive && ./configure --prefix=/usr && make && sudo make install 6. Descargar Moonlight: $svn co svn://anonsvn.mono-project.com/source/trunk/moon moon $cd moon && ./configure --prefix=/usr && make && sudo make install Para probar la instalacion, abra una terminal y ejecute: $mopen Deberia ejecutarse Moonligh dando la siguiente informacion: Usage is: mopen [args] [file.xaml|dirname] Arguments are: --fixed Disable window resizing --geometry WxH Overrides the geometry to be W x H pixels --host NAME Specifies that this file should be loaded in host NAME --transparent Transparent toplevel --desklet Remove window decoration for desklets use Aunque esta salida es correcta, aun no se puede saber si esta instalado correctamente el Moonlight hasta que no se ejecute un desklet. Ejemplo: $cd desklet/glassyclock && mopen --desklet default.xaml Si puedes ver el reloj, te felicito, has instalado correctamente Moonlight! Si tienes algun problema escribeme tu comentario o unete a los siguientes canales IRC: #desklets(en ingles), #mono(en ingles), #monodev(en ingles) #mono-hispano( en español y aqui es donde siempre estoy yo) en el servidor irc.gimp.org. En #mono-hispano siempre estamos atentos a nuevos participantes y bienvenida siempre son sus consultas acerca del Proyecto Mono.

Friday, June 29, 2007

Acropolis CTP1

Excelente proyecto de Microsoft, ya se me hacia mucho trabajo usar su System.AddIn o reflextion para cargar los Parts y crear interfaces aunque con los Elements de XAML es un placer, Acropolis automatiza todo ese proceso en un solo Framework y con el diseñador integrado mas todavia. Lo que desconozco aun es si va a venir con VS 2008 ya que le vienen quitando cosas al "Orcas" al igual que al vista(Entity Framework por ejemplo) para traerlo con SQL Server 2008. Bueno, hay cosas que desaparecen de los proyectos y no vuelven.. como el ObjectSpaces o el WINFS que por cierto ZFS de Sun ha logrado lo que ellos querian jejeje.

Exposing a Workflow as a WCF Service in Visual Studio 2008 beta 1 (Step by step)

Impresionante demostracion.

Sunday, June 17, 2007

Windows Genuine en Ubuntu

Windows Genuine Validation funciona a la perfeccion en Linux. Me pregunto si la gente de Wine lo hace a proposito... hasta el momento es la cosa mas insolita de Microsoft que he visto despues Ballmer decir grocerias a Google y Microsoft amenazar a usuarios de Linux .

Temple of the Sun Contest Final

No hay porque juzgar al pequeño Johan Verdad? No, no tengo idea de que resultado da la compilacion porque no teng o Sun One Studio 11. Aun lo estoy bajando, pero lo averiguare.

Cambiar nombre proceso Mono en Linux

Me parece bastante desagradable que cualquier aplicacion mono tenga siempre el mismo nombre y solo lo puedas diferenciar por cuanta memoria consume(xD), encontre en el codigo fuente de banshee algo que resuelve el problema. El codigo fue originalmente creado por Aron Backover solo que yo lo modifique y lo coloque en una clase sencilla. Ejemplo: ProcessNaming.SetProcessName("MyApp"); [ProcessNaming.cs]

Thursday, June 7, 2007

Microsoft vs MVP

Que divertido articulo: Abogados de Microsoft Dicen: "Hmmm... This software would look good as a module in our app, but we can't use it without paying this guy for the rights. Lets intimidate him into giving it up, but not until we make him feel special first..." Microsoft son of a bitch!

Manejo de API's Obsoletas para .NET Framework 2.0

Aqui se encuentra un resumen de las API's obsoletas para .NET Framework 2.0, aunque el compilador te arroja los Warning al momento de compilacion es bueno explorar el indice completo para conocer un poco mas acerca de otros namespaces. En el caso de que se haya expuesto una de estos miembros o clases en nuestro codigo tal vez necesitemos desactivar la adevertencia del compilador para resolverlo mas tarde. Esto se hace usando la directiva #pragma warning. Por ejemplo,System.Configuration.ConfigurationSettings.GetConfig esta en C# 2.0 Obsoleto, si lo utilizamos en nuestro codigo nos arrojara el siguiente error: 'System.Configuration.ConfigurationSettings.GetConfig(string)' is obsolete: 'This method is obsolete, it has been replaced by System.Configuration!System.Configuration.ConfigurationManager.GetSection' Para solucionarlo colocamos el siguiente codigo: #pragma warning disable 0618 System.Configuration.ConfigurationSettings.GetConfig("myConfig"); #pragma warning restore 0618 Nota: Es importante usar #pragma warning restore al finalizar del bloque de codigo en el que necesitamos que se ignore la advertencia para poder observar otroas secciones de codigo en el mismo archivo donde se presenta la advertencia.

Wednesday, June 6, 2007

Record Visitas de mi Blog

Este blog tiene un nuevo record, 1144 Visitas en 1 mes. Aqui tengo la prueba de que la gente lee pistoladas:).

Empresas Software Propietario y Software Libre.

Estuve varios dias ocupado con algunos prototipos de proyectos y pensando en la licencia que utilizare para esos proyectos finales y este es un resumen de mi analisis personal. Se daran cuenta en mis conclusiones que soy una persona capitalista y NO Socialista. Que es una Empresa? "Una empresa es el ejercicio profesional de una actividad económica planificada, con la finalidad o el objetivo de intermediar en el mercado de bienes o servicios, y con una unidad económica organizada en la cual ejerce su actividad profesional el empresario por sí mismo o por medio de sus representantes." Empresas basadas en Software Propietario: Vender todo lo que generalmente es el producto, el soporte y entrenamiento.
  • Microsoft: Ofrecer el software mas facil de usar(no necesariamente mas seguro) sin dependencia de hardware.
  • Apple: Ofrecer Tecnologia con altisima calidad y muy segura incluyendo Software y Hardware.
Empresas Relacionadas al OpenSource: Vender Soporte y Modificaciones para usos especificos y entrenamiento. Al contrario del Software Propietario no pueden vender el software porque esta basado en las constribuciones de toda "la comunidad"(incluyendo otras empresas) y por lo tanto empresas usando esta forma de trabajo tendran que realizar movimientos rapidos para conseguir mas y mas clientes a los cuales dar soporte mientras compiten al mismo tiempo con otras empresas que practicamente hacen lo mismo. Variaciones:
  • Redhat: Por un tiempo uso Software Libre+Codigo Abierto usando la estrategia inicial pero despues se dio cuenta que la Venta le seria mas rentable. Recientemente Compro JBoss para competir con los Servidores J2EE de IBM y Sun.
  • Novell: Despues de unos malos movimientos, hace lo mismo que Redhat. Recientemente esta aprovechando los clientes de Microsoft que quieren entrar al campo otras plataformas No-Windows con el Projecto Mono, a largo plazo al parecer dara resultado si antes Microsoft no Expande su software a Linux lo cual es bastante dificil.
  • MySQL: Empresa que vende un producto con el Mismo Nombre que cada vez mas tiene penetracion en el mercado de las bases de datos. Su software es OpenSource y mayormente su ganancia viene del Soporte y Entrenamiento. Venden algunas erramientas de integracion con su producto.
  • Canonical: El Linux de Moda, Ubuntu causa furor. Sin embargo los 10 Millones que costo lanzar el proyecto hace 3 años y la inversion en años siguientes tengo entendido por alguien cercano al proyecto que aun no recuperan la inversion, sin embargo la estrategia es esperar unos años mas que solo queden dos sistemas operativos: Windows y Ubuntu. Asi ellos daran el mayor Soporte a Ubuntu.
  • IBM: El gran señor de los sistemas, Manufactura de Hardware para Servidores(los famosos Blade), Servidores J2EE y Bases de Datos.
  • Sun Microsystems: Creador de JE22, Java, Solaris(el OS de Servidor mas Avanzado del Planeta) y Manufactura de Hardware. Recientemente ha hecho Java y Solaris OpenSource en busca de aceptacion por parte de la comunidad OpenSource y ganar mas clientes.
Estas empresas aportan a la comunidad OpenSource mayormente de Linux para sacar provecho del mismo. Ganar dinero es bueno, pero "ser de los buenos de la pelicula" tambien es importante. Aun no tengo conclusion de que hare esto es basicamente lo que he pensado.

Wednesday, May 30, 2007

Microsoft Surface

Microsoft Surface me parece la cosa mas inutil del mundo y vere que tan util es cuando lo tenga en mis manos.

Wednesday, May 23, 2007

Silverlight 1.1 + All

Put it all together!

Silverlight vs Flash

Interesante post de Jesse Ezell acerca donde describe tecnicamente travesia intentando generar peliculas SWF y estoy totalmente de acuerdo, generar peliculas SWF es una pesadilla. Cuando yo intente hacerlo por la referencia a SWF oficial de Macromedia solo puder lograr en C# generar el encabezado del archivo(binario), no pude progresar mas porque sinceramente su documentacion acerca del formato es bastante mesquina, es como si no quisieran que nadie generar peliculas flash pero quieren darse a conocer como un formato abiero, fuck that, envidio a openLaszlo, tal vez algun dia me baje el codigo y vea como lo hacen. En fin aqui esta el resumen de Jesse.

WindowsClient.net

Ya se ha lanzado http://windowsclient.net, sitio web que facilita muchos recursos para el desarrollo de aplicaciones WindowsForms and WindowsPresentationFoundation, lo menciono porque ya Mono 1.2.4 soporta la mayoria de los nuevos controles de WindowsForms2.0, de hecho, aunque yo no lo he probado, en el blog de miguel de icaza se puede ver como Paint.NET 3 corre sobre Mono 1.2.4. En resumen, en el site encontraran muchos controles. Lo bueno es que estan categorizados los de WindowsForms y los de WPF asi que no hay porque confundirse, esperemos por Mono Olive y su WPF en 2 o 3 años mas.

Tuesday, May 22, 2007

Microsoft .NET Entity Framework

Microsoft introducira pronto un lenguage de Consulta sobre LINQ llamado por el momento eSQL(Entity Structured Query Language) y me parece excelente, era lo que hacia falta para combinar los tipos anonimos de C# 3.5 con acceso a datos. Puedes hacer algo como esto: SELECT p.ProductName, p.UnitPrice FROM NorthwindContainer.Products as p ORDER BY p.ProductName Desc Segun el ejemplo me estoy ahorrando un INNER JOIN y solo estoy tratando entidades de datos. Muy bueno, solo espero que normalize los resultados y traduzca el eSQL a todo tipo de bases de datos. No mas GetString(int ordinal) aunque con lambda expressions era mas facil(("AccountName")=>reader.Read)). El articulo TSS.NET explica todo con detalle y se los dejo a la mano. De todas formas no se emocionen porque saldra despues de orcas, a mediados 2008 o 2009 con el tipico SP de Visual Studio que sale en el primer año jejejeje. Ahora, muchas facilidades para consulta de datos directos verdad? que paso con aquello de crear todo en procedimientos almacenados? No, no hay SQL Injection posible en LINQ, pero estaria optimizado? No.. o sera que el proveedor lee mi codigo IL para precompilar SQL? No lo creo.

Monday, May 21, 2007

C# Mono HTTP Server

Hace tiempo habia creado un servidor Http en C# y Mono siguiendo la arquitectura de Isolated Applications de Asp.net, lo he desempolvado para poder utilizarlo en para lo que finalmente lo habia necesitado, mi framework de aplicaciones. Lo hice hace como 1 año atras: Soporta:
  • Application Tree
  • Isolated Applications Activation
  • Application State(Offiline,Online)
  • Cookies
  • MimeTypes
  • KeepAlive
  • Buffering
  • Encodings
  • Http Redirection
  • Http Resources Tree
  • Http Resources Activation
  • Exception Handling(Local,Remote information)
  • Port Publication.
  • SSL(con algunos bugs fantasmas)
En perfomance esta bastante aceptable, realice unas pruebas de carga con Firefox y unos script con autorefresh y pude calcular calcule 20 clientes(20 pestañas de firefox) respondiendo a 150ms cada solicitud de 672 KB fijos, 34MB de memoria de consumo de proceso de servidor y 73%(compartido con firefox) de mi procesador Pentium4 2.8Ghz. Puede que no sea el benchmark mas perfecto pero algo es algo, despues de darme cuenta de que podia hacer mi framework incluyendo sus 5 servidores completamente en C# desisti y ataque otro problema para el momento. Ahora es tiempo de reescribirlo para implementar todo esto:
  • SessionState
  • ApplicationState
  • Resources Pooling
  • Authorization
  • Authentication
  • Server/Client Buffering
  • Mutexes
  • Caching
  • Configuration File Directory Dependendy(Depende de AppDomain.SetConfigurationBytes que aun no esta implementado en Mono)
  • Virtual Relative/Absolute Paths checking.
Tambien hay que rediseñar todo esto:
  • Server/Application Buffering: Eliminar el hashtable de solicitudes y utilizar Pipelined Streams(un 10% de adicional de perfomance)
  • Reemplazar el parsing del HTTP Header un Regex.(un 2% adicional de perfomance)
  • Process Isolation and Application Pooling
  • Statistics
  • Host Naming
  • SSL: Implementar PKI.
En fin es un arduo trabajo, hasta el momento la api esta sencilla: BinDeal.Foundation.Net.Http.Server.HttpServer server = new BinDeal.Foundation.Net.Http.Server.HttpServer("BinDeal-WebServer"); server.Publications.Register( new HttpServerPublication( new HttpStandardEndPoint(8089), null, true, System.Net.IPAddress.Any, int.MaxValue)); HttpApplicationSetup setup = new HttpApplicationSetup(); setup.ApplicationName = "DefaultApp"; ApplicationDebugParams prms = new ApplicationDebugParams(); prms.Enabled = true; setup.Debug =prms; setup.EntryPointTypeName = typeof(FileBrowserAppEntry).AssemblyQualifiedName; HttpWebApplication webApp = new HttpWebApplication(setup); server.Applications.SetRoot(webApp.IdResource); webApp.TakeOnline(); server.Start(); Aqui les coloco algunos screenshots de una pequeña aplicacion web para explorar mis archivos de la PC.

DataConnection.php (PHP ADO.NET)

Estoy trabajando actualmente en un proyecto en PHP5/PostgreSQL8 y la verdad que odio la programacion funcional asi que en lo posible he encapsulado el acceso a datos a la base de datos usando las siguientes funciones pg_connect, pg_exec, pg_cmdtuples, pg_close, pg_numrows y pg_fetch_row en las siguientes clases:
  • DataCommand
    • Open: void
    • ExecuteNonQuery : int
    • ExecuteReader : DataReader
    • Close
  • DataReader
    • Read
    • GetField
Lo hice lo mas parecido a ADO.NET porque es el model de acceso a datos de costumbre para mi. La hice en 30 Minutos y probablemente despues deba refinarla, por ejemplo cambiar el metodo Open de void a bool o causar una exception en el caso de conexion fallida pero aun estoy buscando como hacer un buen registro de errores. Asi es como lo estoy usando: ExecuteNonQuery("INSERT INTO tabla1(id,name) values(nextval('tabla1_seq'),'Valor')") . " Insertados "; $cmd = NULL; $cmd = ConnectData(); $reader = $cmd->ExecuteReader("Select Id from tabla1"); while($reader->Read()) { echo $reader->GetField(0) . " "; } $reader = NULL; $cmd = NULL; echo "HELLO PHP"; ?> Ambas clases tienes destructores para eliminar los datos no utilizados lo mas rapido posible. En fin es solo un ejercicio que despues pienso utilizar produccion y encuentro la sintaxis del lenguage y su perfomance bastante aceptables. Lo cierto es que estamos usando PHP despues de darnos un gran golpe usando Mono/XSP 1.2.3 [Descargar DataConnection.php]

Saturday, May 19, 2007

Proyecto Personal(Update)

Ya estoy en la ultima semana del primer milestone del proyecto de seguridad de mi Framework de aplicaciones, cabe destacar que estoy solo de nuevo en el proyecto pero esta vez ya he empezado con buen pie y asi pienso terminar, solo hehe. Por el momento no tengo pensado la licencia que utilizare pero dudo mucho que lo haga opensource si antes de terminarlo no consigo apoyo, pero dejare aqui algo de codigo confuso para llamar la atencion :) SecurityApplication app = new POSApplication("POS1"); SecurityManager manager = new SecurityManager(new MemoryStorageManager()); manager.AddExtension(typeof(UpdateProductPermission),typeof(UpdateProductCurrencyPermissionExtension)); manager.AddApplication(app); Este codigo crea una instancia de un administrador de seguridad al cual le registro una aplicacion configurada y sus extensiones de permisos. La activacion de los permisos en instancias y sus extensiones es automatica. Ahora mismo me encuentro en el proceso de crear las pruebas unitarias para los storageManager's y los paths, creo que la emocion de ver el diseño de 6 meses en mi cabeza funcionar me llevo a escribir esta entrada en mi blog :)

Tuesday, May 15, 2007

Steve Ballmer es una Mierda

"Fucking Eric Schmidt is a fucking pussy" No tengo mas que decir, leanlo ustedes mismos. Es una verguenza esto.

Sunday, May 6, 2007

Instalar MonoDebugger(mdb) en Ubuntu 7.07

MonoDebugger es una herramienta de linea de comandos que esta haciendo el equipo de Mono y aunque no es del todo poderosa, funciona. Intentando instalarla en mi Ubuntu 7.07 tuve problemas pero aqui esta como instalarlo correctamente. Necesitaras tener instalado con sus dependencias: mono, subversion, autotools 1.9 o superior y nunit. 1) Descargar el source desde el svn de mono:
svn co svn://anonsvn.mono-project.com/source/trunk/debugger monodebugger
El comando descargara los fuentes del mdb y creara un directorio "monodebugger" en la carpeta actual. 2) Compilarlo: Entramos en la carpeta "monodebugger": cd monodebugger Generamos los configuradores de la instalacion: ./autogen.sh --prefix=/usr/local Compilamos: make Nota: Al momento en que se genero este post, existe un problema en el configurador del compilar el proyecto MonoDebugger.Test.dll el cual depende de nunit y da el siguiente error: error CS0006: cannot find metadata file `nunit.framework' Compilation failed: 1 error(s), 0 warnings make[2]: *** [Mono.Debugger.Test.dll] Error 1 make[2]: Leaving directory `/home/jhernandez/monodebugger/build' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/home/jhernandez/monodebugger' make: *** [all] Error 2 La solucion es editar el archivo build/Makefile.in y reemplazar la linea "-r:nunit.framework" por "-pkg:nunit" para que el compilador busque usando la utilidad pkg-config en vez de buscar nunit.framework.dll en los directorios por defecto. Luego intenta compilarlo nuevamente. 3) Instalar librerias en el GAC: gacutil -i build/Mono.Debugger.Backend.dll gacutil -i build/Mono.Debugger.Cecil.dll gacutil -i build/Mono.Debugger.dll gacutil -i build/Mono.Debugger.Frontend.dll gacutil -i build/Mono.Debugger.Test.dll 4) Instalar mdb. sudo make install 5) Ejecutar: $mdb Nota: Existe otro problema ubicando las librerias compartidas y te dara el siguiente error: Unhandled Exception: System.TypeInitializationException: An exception was thrown by the type initializer for Mono.Debugger.Frontend.CommandLineInterpreter ---> System.DllNotFoundException: monodebuggerserver at (wrapper managed-to-native) Mono.Debugger.Frontend.CommandLineInterpreter:mono_debugger_server_static_init () at Mono.Debugger.Frontend.CommandLineInterpreter..cctor () [0x00000] --- End of inner exception stack trace --- Para solucionarlo edita tu archivo $HOME/.bashrc con tu editor favorito y has lo siguiente de acuerdo a tu situacion: export LD_LIBRARY_PATH='/usr/local/lib:'$LD_LIBRARY_PATH Si instalaste Mono usando el Instalador Universal para linux, probablmente tengas el mono instalado en /opt/mono1.2.3.2 y en vez de usar "/usr/local/lib", debes usar "/opt/mono1.2.3.2/lib" donde 1.2.3.2 es la version de mono que instalaste. No olvides cerrar y abrir la consola nuevamente despues de editar el archivo. 5) Usar Mdb Despues de arreglar los inconvenientes anteriores podras usar mdb de la siguiente forma: $mdb helloworld.exe Mono Debugger (mdb) Teclea "run" y se ejecutara la aplicacion. se detendra en las primeras lineas de ejecucion del metodo main, asi que para ir paso a paso en la ejecucion, teclea "n"(enter) o "s"(enter). Aqui hay una guia completa de como utilizar el debugger.

Friday, May 4, 2007

Mono Development Venezuela(#monodev-ve)

En la red oficial de mono(irc.gimp.org) existe #mono-hispano, un canal para desarrolladores mono de habla hispana pero ademas de eso(como si no fueran pocos los integrantes de mono-hispano ya), he creado una sala llamada #monodev-ve para desarrolladores mono de venezuela y aunque hasta el momento soy el unico espero pronto conseguir algunos buddies. Abrir la sala es solo el comienzo de una iniciativa que incluye una pagina web el mismo nombre con el mismo proposito pero que mas adelante junio o julio mas o menos estare publicando. Estan invitados tanto a la iniciativa como a los canales para consultar informacion acerca de la tecnologia, solicitar apoyo en algun desarrollo OpenSource, implementaciones y soluciones basadas en mono. Tanto en #mono-hispano como en #monodev-ve estamos a la orden.

Tuesday, May 1, 2007

Mono Embedding Parte II(External Call)

Anteriormente habia creado un embedding para ejecutar un ensamblado Mono desde C y les comente que necesitaba crear una instancia de una clase dentro del universo del Mono y ahora he hecho algo parecido, una llamada externa desde el CLR que se implementa en C. Esta tecnica difiere de el interop usando DllImport el cual consiste en crear el simbolo en C# y vincularlo a una libreria externa sin necesidad de un Host del MonoRuntime, en el caso de las external call el simbolo igualmente se declara en el ensamblado pero el simbolo apunta a la funcion que el Host del MonoRuntime registre. Por ejemplo: public class myMonoClass { [MethodImplAttribute(MethodImplOptions.InternalCall)] public extern static void sayHello(); } En nuestro Host del MonoRuntime creamos la funcion en C que se ejecutara cuando se invoke al metodo expuesto con el atributo MethodImpl como se muestra a continuacion: static void sayHello_myCLR () { printf("Saying hello from C using a CLI Internal Call\n"); } Y por ultimo registramos la llamada externa del CLR con la funcion en C. mono_add_internal_call("myMonoClass::sayHello",sayHello_myCLR); Nota: mono_add_internal_call debe ser invocado SOLO despues de cargar el ensamblado que tiene el methodo externo. Pero aunque esto es muy cool, esto no soluciona mi problema, y aun sigo necesitando crear una instancia de una clase en un ensamblado desde C. [Descargar mono_embedding_ext_call.tar.gz]

Monday, April 30, 2007

DATEADD en PostgreSQL 8

Actualmente me ecuentro migrando un portal de MS SQL Server a Postgress. Me encontre con un tema que me demostro una vez mas el poder de PostgreSQL sobre Microsoft SQL Server 2000/2005. En Microsoft SQL Server existe la funcion DATEADD , que permite agregar partes de datetime( dias,meses,años,minutos,segundos) una fecha existente, por ejemplo: Esta function en SQL Server: select getdate() as FechaActual, dateadd(day,2,getdate()) as DiasDespues Da como resultado: FechaActual DiasDespues ------------------------------------------------------ ------------------------------------------------------ 2007-05-01 08:19:22.693 2007-05-03 08:19:22.693 (1 filas afectadas) En PostgreSQL no existe el DATEADD, existe el operador de suma el cual actua entre operandos de tipo timestamp e interval. select now() as FechaActual, now() + cast('2 day' as interval) as DiasDespues Una vez mas me asombra el poder de PostgreSQL como base de datos orientado a objetos sobre T-SQL que es un lenguage estructurado... bueno, SQL es Structured Query Language jejeje.

Sunday, April 29, 2007

Embedding Mono

Embedding mono es el proceso en el cual se incrusta el Mono Runtime en otro proceso generalmente creado en C o C++. Siguiendo los pasos de la guia oficial de mono he creado este pequeño ejemplo para hacer ejecutar una aplicacion Ejecutable de Mono desde una aplicacion hecha en C. El demo incluye:
  • main.c : Archivo con el embedding para el Runtime de Mono
  • main.cs : Archivo de C# para generar ejecutable.
  • Makefile : Archivo para compilar y ejecutar todo.
[Descargar mono_embedding_exe.tar.gz] Basicamente los pasos son los siguientes:
  1. mono_jit_init y recibir un puntero al dominio de aplicacion.
  2. mono_domain_assembly_open y recibir un puntero al ensamblado.
  3. mono_jit_exec y pasarle el ensamblado y el dominio
  4. mono_jit_cleanup para limpiar la instancia de CLR.
Es todo. Me he tomado el trabajo porque actualmente en mi poco tiempo libre estoy intentando hacer wrappers del x-chat. La verdad lo que necesito es ejecutar una clase en una libreria y aun no lo consigo:P (Continua)

Friday, April 27, 2007

10 Contraseñas mas usadas de Internet

Definitivamente esta lista da pena, es la lista de las 10 contraseñas mas usadas en internet y figuran: 1. password 2. 123456 3. qwerty 4. abc123 5. letmein 6. monkey 7. myspace1 8. password1 9. blink182 10. (your first name) Me parece cool, yo usare "monkey".

Tuesday, April 24, 2007

Gmail en Evolution

Desde hoy comienzo a desarrollar el proyecto personal y como va en serio la cosa, he decidido buscar algunas herramientas para facilitarme el asunto. Lo primero es el gmail, de verdad me fastidia ir a la pagina a ver los correos asi que decidi empezar a utilizar Evolution que estaba a tan solo 2 clicks. Para configurarlo simplemente segui estos pasos ahora mi evolution recibe y envia para mi gmail. Yo no siquiera usaba Outlook excepto para la oficina pero buenas noticias para mi que voy a desintalar el Windows XPCochinada de la maquina del trabajo para instalar Ubuntu Feisty Fawn. Jamas en mi vida pense que diria esto: "Me siento mas comodo trabajando en linux que en Windows"

Sunday, April 22, 2007

Proyecto Personal Enabled!

Sorprendentemente alguien me ha comprado mi idea (por asi decirlo) y ya hemos empezado a desarrollarla. Es un framework para desarrollo de aplicaciones distribuidas para linux construido 100% en C#/Mono incluyendo un servidor de datos, un servidor de procesos de negocios y un servidor de presentacion que no es ASP.NET. El tiempo de desarrollo aproximado esta entre 5 a 7 meses a partir del miercoles 23 de Abril y despues de ese periodo desconocemos como realizaremos una estrategia comercial aunque se proponen distribucion propietaria de muy bajo costo(diagmos unos 100$), Freeware o hasta LGPL. Soportara inicialmente Linux+Postgres y de acuerdo a la demanada se soportaran otros sistemas operativos y bases de datos. Debido a que aun no hemos comprado el dominio en internet no puedo dar el nombre oficial pero esta relacionado a un elemento de la tabla periodica(eso creo...). Probablemente mi blog sea la fuente principal de noticias del asunto hasta que todo salga a la luz publica con un fin comercial.

Servidor IRC

Recientemente he creado mi propio servidor IRC, se encuentra en johansoft-linux.no-ip.org. Las salas estan libres. Si estas en windows pudes descargarte este cliente: X-Chat for Windows Si estas en ubuntu o debian en una terminal puedes instalarlo asi: sudo aptitude install x-chat O usando Synaptic. Recuerda colocar en las redes johansoft-linux.no-ip.org, la primera sala es #idiotas. Richard y yo estamos esperando mas gente.

Saturday, April 21, 2007

Gnome Art Manager

Para consolidar mi salida completa de Microsoft y entrar en Ubuntu, he querido darle a mi escritorio un nuevo look y decidi buscar algunos wallpapers y descubri Gnome Art Manager, que es una aplicacion que descarga automaticamente los wallpapers y temas visuales de la pagina de gnome art. El nombre del paquete es gnome-art. Si no lo saben instalar, tienen dos formas: 1) Desde el Menu "Aplicaciones->Agregar/Remover". 2) Usando Synaptic 3) Usando una terminal: sudo aptitude install gnome-art. Despues de la instalacion podran arrancarlo usando el menu "Sistema->Preferencias->Art Manager"(intente traducirlo, tengo ubuntu en ingles:P) Despues solo active los efectos 3d de Beryl usando el menu "Sistema->Preferencias->Desktop Effects" y listo. Ja! No todo es programar, tambien hay que sentirse bien! Larga vida a Ubuntu Linux!