Showing posts with label MONO. Show all posts
Showing posts with label MONO. Show all posts

Monday, May 24, 2010

Installing Mono 2.6 (or the latests version) on Ubuntu 10.4(or the latest version)

This is a quick guide to install the latest mono runtime in your existing Ubuntu:
First of all:
  • I'm not an expert installing Mono from Sources, so this is all at your own risk.
  • Don't remove your existing Mono Runtine, you still need it.
  • I recommend you to keep your existing Mono Runtime(the one you installed via APT) side by side with the version that you are going to configure.
Here we go:
1.a using synaptic or aptitude, install the following packages:
  • autotools-dev
  • autoconf
  • libtool
  • bison
  • gettext
2. Download the Stable version right here:
http://ftp.novell.com/pub/mono/sources-stable/ (is the first one from the first group, currently the name is mono-2.6.4.tar.bz2)
3. Read the instructions right from the Mono wiki(but don't execute them yet):
Note: You may want to install into a different location and not '/usr/local' in order to avoid conflict with your existing Ubuntu Mono installation, so I would recommend you to use '$HOME/mono/local' or something, just like this:
./configure --prefix=$HOME/mono/local;
4. Now you can follow the instructions.
Feel free leave a comment if you find any errors.

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#.

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, 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!

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.

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, 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); } } }

Saturday, June 30, 2007

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.

Sunday, June 17, 2007

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]

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.

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]

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)

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.

Saturday, April 21, 2007

Mono 1.2.4 coming soon!

Mono 1.2.4 esta en camino y ya se peude ver que viene para este release. Para mi esto es lo mas importantes:
  • Una nueva clase llamada System.DataConvert
  • Soporte parcial de C# 3.0 Lambda Expressions, Many updates to the System.Linq, System.Linq.Expressions.
  • Windows Forms 2.0:

    2.0 support: ToolStrip overflow, merging, shortcut keys, tooltips, new layouts.

    2.0 support: Hundreds of new 2.0 methods implemented in various controls.

  • Many of the new 2.0 socket
Mono 1.2.4 Release Notes

Tuesday, April 10, 2007

Mono y SharpDevelop en Windows.

Para desarrollar aplicaciones con Mono en Windows utiliza SharpDevelop y Mono, aqui explicare como hacerlo y que problemas resultan asi como tambien la solucion. Instalacion 1) Instalar el Mono y SharpDevelop: Instalar .NET Framework 2.0, 22.4 MB: SharpDevelop 2 utiliza .NET 2.0. Instalar SharpDevelop 2, 8.63 MB: Al instalar SharpDevelop no se instala automaticamente Mono, la instalacion de Mono sigue siendo obligatoria. Instalar Mono, 48.9 MB: El link lleva a la pagina de todas las descargas de mono, deben elejir en la seccion "Windows Installer Windows 2000 and above" y el instalador para la version Stable, para el momento que se escribio este blog era la version Mono 1.2.3.1_0 Setup (Stable). El instalador de mono les preguntara el puerto donde se instalar XSP, el hecho de que tenga un puerto predeterminado no quiere decir que se iniciara automaticamente, el uso de XSP en Windows es Manual. Problemas Al crear un proyecto de GTK# o libreria mono se encontraran con un problema, el error es el siguiente de acuerdo al tipo de proyecto que crearon: Proyectos en Mono 1.1: "Mcs.exe" exited with code -1. Proyectos en Mono 1.2: "Gmcs.exe" exited with code -1. La solucion es agregar una variable de entorno a Windows llamada "MONO_EXTERNAL_ENCODINGS" y con el valor "default_locale" (sin comillas). Para establecer la variable de entorno no utilice el comando SET, en vez de eso, realice la operacion usando la interfaz grafica haciendo click derecho en el icono de Mi PC->Propiedades. Nota: Las variables establecidas con SET por linea de comando no se establecen de forma global para Windows, si necesita hacerlo global y no quiere utilizar la interfaz grafica entonces debe agregar las instrucciones SET en el archivo Autoexec.bat y reiniciar Windows. Ejemplo: Lo siguiente es anexar a la variable PATH la ruta de instalacion de los binarios de Mono Runtime. Recuerden colocarle un punto-y-coma(;) al final del valor actual de la variable si antes no lo tenia y anexen la ruta a la carpeta "bin" de la instalacion de mono, para mi caso es "C:\Archivos de programa\Mono-1.2.3.1\bin". Ejemplo: Le damos click al boton Aceptar para establecer los nuevos valores. Reinicien SharpDevelop e intenten compilar el proyecto y veran como todo funciona:)