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]