2008-01-18

Problema con parametros de tipo string de longitud 0 en Oracle usando System.Data.OracleClient

Haciendo unas pruebas para una migración a Enterprise Library, nos encontramos con un problema (no se si intencional o no) utilizando las clases de acceso a datos contra Oracle que trae .NET Framework 1.1.

Supongamos que uno quiere hacer la siguiente consulta:

SELECT * FROM Countries WHERE Country_id = :c_id



Si usamos el siguiente código, la aplicacion generará una excepcion por tener un parametro de tipo string con longitud 0:
using (IDbConnection conn = new OracleConnection("Password=hr;Persist Security Info=True;User ID=hr;Data Source=localhost"))
{
    conn.Open();
    using (IDbCommand command = conn.CreateCommand())
    {
        command.CommandType = CommandType.Text;
        command.CommandText = "SELECT * FROM Countries WHERE Country_id = :c_id";
 
        IDbDataParameter param = command.CreateParameter();
        param.ParameterName = "c_id";
        param.DbType = DbType.AnsiStringFixedLength;
        param.Value = String.Empty;
        command.Parameters.Add(param);
        using (IDataReader reader = command.ExecuteReader())
        {
            DumpReader(reader);
        }
    }
    conn.Close();
}


El error es: Parameter 'c_id': No size set for variable length data type: String.

Para solucionar esto tenemos dos opciones:

1. Usar la librería provista por Oracle para .NET para acceder a los datos. Esta librería maneja de forma correcta los Strings vacios. (al menos es asi usando la última version de la librería. Me falta confirmar que con versiones anteriores tambien funcione)

2. Enviar DbNull.Value como valor del parametro, en vez de String.Empty. En otro blog leí que Oracle maneja de la misma manera tanto a los strings vacíos como a los NULL. Sin embargo yo no estoy 100% seguro de que esto sea asi, asi que de tener confirmación o refutación de esto, por favor haganmelo saber! De todas maneras, mi recomendación es usar ODP.Net

Hasta la próxima!

Z

2008-01-11

Como reconocer a un buen programador?

Dejo aca el link a un post que apareció en Slashdot sobre como reconocer a un buen programador. Muy interesante...

http://www.inter-sections.net/2007/11/13/how-to-recognise-a-good-programmer/

Si el sitio no responde intentenlo mas tarde, ya que fue recientemente slashdotted (sitio caido debido a haber aparecido en slashdot)

Z

2008-01-05

Conversor de Cbr a Cbz

Hace unos dias me baje unos comics de X-Men y la mayoría estaban con formato Cbr (formato para comics, comprimido con rar). El problema es que el programa que uso en OS X para abrir comics suele tener problemas con algunos archivos comprimidos con rar. Sin embargo, esto no sucede con su contraparte en formato zip (archivos Cbz). Por lo tanto, hice un pequeño programa en C# que agarra todos los archivos CBR en un directorio y los recomprime usando ZIP, creando asi la version CBZ de los mismos. Les dejo aca el programa y el fuente por si a alguien le es útil o le interesa.

Z

2007-12-28

Nombres de versiones

Éste es un mal que afecta a, por lo menos, el 97% de los desarrolladores: siempre que pensamos que una versión "supuestamente" cerrada es la final, aparece una nueva corrección que contradice la suposición anterior. De esto se desprende la siguiente nomenclatura para los entregables:

Producto_1.0.zip
Producto_1.0.Final.zip
Producto_1.0.FinalArreglado.zip
Producto_1.0.FinalFinal.zip
Producto_1.0.FinalUsarEste.zip
Producto_1.0.LOS.ANTERIORES.NO.SIRVEN.zip
Producto_1.0.LOS.ANTERIORES.NO.SIRVEN.FIXED.zip

Y la lista continua...

2007-12-21

jPod: Toxic Meetings

Cita extraida del libro jPod, de Douglas Coupland:

Here’s my theory about meetings and life; the three things you can’t fake are erections, competence and creativity. That's why meetings become toxic. They put uncreative people in a situation in which they have to be something they can never be. And the more effort they put into concealing their inabilities, the more toxic the meeting becomes. One of the most common creativity-faking tactics is when someone puts their hands in prayer position and conceals their mouth while they nod at you and say, "Mmmmmm. Interesting." If pressed, they’ll add, "I’ll have to get back to you on that." Then they don’t say anything else.


La proxima vez que le mandes una invitación a una reunion a alguien... pensalo dos veces. Puede ser que por ésto, ese alguien muera un poquito por dentro :)

2007-12-18

Heladera último modelo: Instalando Leopard en la Laptop

Después de unas semanas usando Mac OS X 10.4.10 (Tiger) decidí que era hora de ir un paso mas allá e instalar Leopard (10.5).

Haciendola corta, les comento lo que hice:

1. Instalar Tiger.

2. Una vez que esta instalado, upgradearlo a Leopard (obviamente, no formatear en el proceso). Yo usé el DVD de ToH RC2 que esta dando vueltas por la red.

3. Una vez que esta todo andando, instalar el PC EFI, que nos permitirá instalar las actualizaciones de OS X sin usar un kernel patcheado, sino que el original de Apple (vanilla). Pueden ver como hacerlo aca. (usar la ultima version. Yo use la 8.0)

4. Usar el system update y actualizar todo (ahora si, sin miedo gracias al PC EFI)

5. Para los drivers de video, usar estos archivos.

6. Para usar teclado en español, usar este layout.

7. El resto, veanlo del post anterior.

Un saludo!

Z

PD: Hoy salió un DVD llamado IATKOS que, al parecer es una recopilacion mas bonita para instalar Leopard desde 0, con PC EFI y toda la bola. Si alguien la prueba, comenteme que onda.

2007-12-06

Abajo las PCs, arriba las heladeras: Usando Mac OS X en una Hackintosh

Por algun motivo, el cual nunca sabré, me volvió a picar el bichito de curiosidad sobre instalar una versión hackeada de OS X en mi ThinkPad T60p para ver que era eso que siempre asocié mas a un electrodoméstico que a una computadora, y aún asi tanta gente me recomendaba.

Esta vez, baje una versión un poco mas actualizada del sistema: Mac OS X Tiger 10.4.10 (la última vez habia bajado la 10.4.8).

A diferencia de lo que se puede leer en posts anteriores, una vez instalado el sistema operativo (siempre hablando de mi disco externo) no fue necesario entrar en modo consola y borrar extenciones o cosas similares: todo anduvo relativamente bien. Recalco el relativamente ya que el sistema recien instalado se parecía mas a un XP recien instalado que a la felicidad computacional la cual me habían comentado: la resolución era de 1024x768, no habian drivers de video, sonido o wireless. Aunque sea, OS X reconoció las particiones NTFS donde tengo Windows XP instalado y las montó (como solo-lectura). Lo que no tuve problemas para usar out-of-the-box fue la placa de red, a la cual le conecté el cable e instantaneamente recibí IP.

Bueno, manos a la obra. Para poder usar esto necesitaría, como minimo, poder escuchar música, tener red sin depender de un cable, escribir en mis particiones NTFS (donde tengo todo lo que uso diariamente) y por último, pero no menos por eso, tener una resolución decente con aceleración de video por hardware.

1. El sonido: esto fue bastante fácil, ya que la primera busqueda que hice en InsanelyMac (sitio indispensable para cualquiera que desee tener su Hackintosh. www.insanelymac.com) pude encontrar el driver. Pueden bajarlo desde aca.

2. Red inalámbrica: las cosas empezaban a ponerse feas en este punto. Por lo que estuve leyendo en los foros, no existen drivers para la placa de red inalámbrica que traen las Thinkpad T60p y similares. Hay gente desarrollandolos, pero el proceso es lento y parece que todavía falta bastante hasta que podamos hacer uso de el. Por suerte para mi, hace un tiempo me compré un MSI USB Wireless Stick. En la página de MSI no dicen nada de un driver para OS X. Sin embargo, buscando por internet me enteré de que el stick es practicamente igual a otro Ralink o algo asi... La cosa es que ese si tiene driver y funciona a la perfección!. Dejo aca el driver para bajarlo.

3. NTFS: Esto fue probablemente lo mas facil de todo. Dado que abajo del OS X hay un BSD, parece que resulta bastante facil portar muchas aplicaciones hechas para Linux hacia el sistema operativo de Mac y una de ellas es FUSE, herramienta que permite cargar drivers para filesystems (como el de NTFS) en espacio de usuario. Teniendo Mac-FUSE y el driver NTFS-3G para Mac, ya estaba solucionado el asunto de las particiones.

4. El video: La correcta configuración de la placa de video fue, por mucho, lo mas complicado que tuve que hacer para tener funcionando el sistema operativo. El gran problema gran es que la T60p trae una ATI FireGL V5250 como placa de video, la cual no posee drivers para Mac. La única esperanza era encontrar drivers para la x1700 que, basicamente es la misma placa, pero con otro ID. Tampoco hay drivers. Después de mucho tiempo, mucha investigación y edicion de archivejos en hexa, pude armar el driver que necesitaba, modificando unos drivers hechos para la X1600 (creo) que aparecieron en InsanelyMac. Para los que lo necesiten, dejo aca para bajar las extensiones que hay que agregar/sobreescribir, para que puedan tener la placa de video funcionando con aceleración por hardware y 1680x1050 de resolución. Una vez reemplazadas, hay que ir a la consola y modificar los permisos y ownership de estos archivos (que tienen que estar en /System/Library/Extensions).
Para modificar los permisos hacemos: chmod -R 755 ExtensionAModificar
Para modificar el ownership hacemos: chown -R 0:0 ExtensionAModificar
Finalmente, hacemos: touch /System/Library/Extensions para avisar que cambio el directorio y listo! Tenemos el video andando.

Si haciendo algo con drivers o similar llevan a la maquina a un estado que no pueda terminar de arrancar, presionen F8 al arranque y cuando le pide las opciones para booteo pongan: -v -s -f y los va a llevar al modo consola, donde pueden volver todo al estado anterior.

Con esto finalice la instalación de drivers. Lo que quedaba por hacer era empezar a instalar soft y a ver que se podía hacer. En este momento ya van 3 días desde que lo instalé y, la verdad, no dan ganas de volver!!!

Software que les recomiendo:
- Vmware Fusion: versión de Vmware para OS X, con el feature Unity, el cual permite "sacar" ventanas de la maquina virtual y usarlas como si fuesen una ventana mas de OS X. Muy groso!
- Adium: cliente multiprotocolo de IM. Esta muy bueno, pero todavía estoy decidiendome si uso solo ese, o el Messenger para Mac (que es medio feucho) y el iChat para GTalk.
- VLC: excelente reproductor multimedia. Dale una feta de jamon y te la saca como audio y video. Se banca cualquier cosa.
- Firefox: en general, uso Safari como browser, pero alguno sitios como Blogger o GMail o Managerzone no andan del todo bien o con todos sus features ahi, asi que el viejo y querido lobo de fuego viene al rescate.

Software que NO les recomiendo, pero que es necesario:
- Microsoft Office 2004: anda lento, mal y es horrible. Sin embargo, necesito el Word para editar varios documentos en el laburo y la integración que tiene Entourage (version Mac del Outlook) con Exchange es un poco mejor que la de las herramientas que trae OS X (tal vez no el mail, pero el address book no lo pude hacer sincronizar con exchange sin Entourage). Otro gran problema es que no hay Universal Binaries de Office 2004, por lo que es bastante mas lento que el resto de las aplicaciones. Por suerte, dentro de un mes ya sale Office 2008. Esperemos que sea bastante mejor que éste.

Bueno, con esto cierro el post (que, de hecho, fue escrito desde OS X, usando internet inalámbrica, mientras escucho musica en el iTunes :D). Cualquier duda consultenme y voy a hacer lo posible en darles una mano.

Z en la heladera, digo, OS X :D

2007-11-21

Windows Vista me destruyó la PC 2 veces en menos de 2 días y otra vez… vuelvo a XP

El domingo, luego de instalar una actualización que se bajó de Windows Update, mi PC dejó de funcionar. Restauré una imagen de Ghost que tenía creada, pero se ve que algo malo tenía, porque no andaba Windows Update y tiraba algunos errores, por lo que decidí reinstalar. El lunes estuve todo el dia instalando Windows Vista y bajando drivers. Una vez que estuvo todo andando, abrí los updates y bajé todo lo que había para actualizar y… reinicie. Esa fue la última vez que Windows Vista pudo arrancar.

Teniendo mas ira que un ejercito de vikingos en puerta de vírgenes, decidí contar hasta 10, pensar en la tumba de quien no terminó de probar los updates y agarrar la imagen de Windows XP.

Otra vez en el viejo y querido OS lanzado en 2001 por Microsoft, espero terminar mis idas y venidas por Vista y XP, al menos hasta que salga el SP2 de Vista.

PD: Encontré para usar con XP un programa que simula (y muy bien) el Exposé (o como se escriba) de OS X. Lo pueden conseguir en http://www.reflexvision.net/

Z

2007-11-08

Post descolgado: Para los fanas de DragonBall y nostálgicos del Lemmings… LBZ3D!

Gente, les dejo aca un excelente jueguito de pelea en 3D basado en los personajes de DragonBall Z… hechos lemmings!

Es medio exigente con la placa de video, pero el juego esta muy bueno: HomePage

Z

2007-11-05

Copy as HTML en Visual Studio

Para toda la gente que tenga un blog o similar y tenga que pegar código, le recomiendo que use el CopySourceAsHtml y a olvidarse de los problemas de Blogger, Word 2007 o Live Writer cuando pegás un pedazo de código!. (Gracias Mariano!)

Lo pueden bajar de aca.

Z

Accediendo dinamicamente a WebServices

Hoy estábamos viendo con uno de los chicos del laburo que necesitaba poder acceder a distintos WebServices (desconocidos para el en tiempo de compilación) y queríamos encontrar una forma cómoda de hacerlo.

Después de buscar un poco, encontramos una solución que pareció bastante piola: usando el WSDL del WebService, generar la clase proxy en runtime y usar los WebMethods por Reflection. Está claro que no es la solución óptima en términos de velocidad, pero con unas clases helper que hice, resulta muy cómodo para usar.

El siguiente código lee el WSDL y genera la nueva clase en runtime:




try

{

    //Get the web service description

    Uri uri = new Uri(wsdlUrl);

 

    WebRequest webRequest = WebRequest.Create(uri);

    System.IO.Stream requestStream = webRequest.GetResponse().GetResponseStream();

    ServiceDescription sd = ServiceDescription.Read(requestStream);

    string sdName = sd.Services[0].Name;

 

    //Create the ServiceDescriptionImporter

    ServiceDescriptionImporter sdImporter = new ServiceDescriptionImporter();

    sdImporter.AddServiceDescription(sd, String.Empty, String.Empty);

    sdImporter.ProtocolName = "Soap";

    sdImporter.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties;

 

    CodeNamespace codeNamespace = new CodeNamespace(DefaultNamespace);

    CodeCompileUnit compileUnit = new CodeCompileUnit();

    compileUnit.Namespaces.Add(codeNamespace);

 

    //Import the ServiceDescription

    ServiceDescriptionImportWarnings warnings = sdImporter.Import(codeNamespace, compileUnit);

 

    if (warnings == 0) //No warnings

    {

        CSharpCodeProvider codeProvider = new CSharpCodeProvider();

        codeProvider.GenerateCodeFromNamespace(codeNamespace, new StringWriter(), new CodeGeneratorOptions());

 

        //Compile the assembly

        string[] assemblyReferences = new string[2] { "System.Web.Services.dll", "System.Xml.dll" };

        CompilerParameters param = new CompilerParameters(assemblyReferences);

        param.GenerateExecutable = false;

        param.GenerateInMemory = true;

        param.TreatWarningsAsErrors = false;

        param.WarningLevel = 4;

 

        CompilerResults results = codeProvider.CompileAssemblyFromDom(param, compileUnit);

        Assembly assembly = results.CompiledAssembly;

 

        Type[] types = assembly.GetExportedTypes();

        //Get the generated Type

        return new DynamicProxyClass(types[0], GetMethodNames(sd.PortTypes[0].Operations));

    }

    else

    {

        throw new Exception(String.Format("Importing has warnings: {0}", warnings.ToString()));

    }

}

catch (Exception ex)

{

    throw new Exception("Couldn't generate proxy class (see inner exception)", ex);

}



Acá se puede ver que lo que devuelvo es una DynamicProxyClass. Esta clase lo que hace es wrappear la clase generada y exponer solo los métodos del WebService, sus tipos de retorno y sus parámetros.

Si les interesa jugar con esto, dejo para bajar el código completo de la solución.


Z

2007-10-08

C# 3 y Linq – Parte 2

Les dejo la segunda parte del artículo, donde se ven más ejemplos y una implementación de Linq hecha sobre una clase propia.

Lo pueden bajar de acá.

¡Hasta la próxima!

Z

C# 3 y Linq – Parte 1

Hace unos meses, con Ariel Neisen y Javier Argüello hicimos un artículo explicando los nuevos features incluidos en C# 3 y Linq para publicar en la revista .Code. El artículo ya había sido enviado, sin embargo hace unos días nos enteramos de que la publicación de la revista fue suspendida (aparentemente for good). Como el artículo ya estaba hecho, decidí publicarlo en el blog.

La primera parte hace una introducción a las nuevas herramientas del lenguaje y a Linq. La pueden bajar de acá.

En un rato estaré publicando la segunda parte.

¡Hasta la próxima!

Z

2007-09-03

SvnBridge: TFS a través de un cliente de SubVersion

Gente, para quienes tengan que usar TFS en sus proyectos, pero estén acostumbrados a herramientas para control de versión menos invasivas como el SVN o CVS, les recomiendo el SvnBridge: un programita que pone un mini-server de SVN en la maquina local, que lo único que hace es wrappear los comandos de SVN a otro server de TFS. Yo lo estoy usando para subir las cosas a Codeplex. Parece funcionar un poco lento, aunque no se si es por el server de TFS o este programa. Muy bueno

Pueden obtener el código fuente desde acá: http://www.codeplex.com/SvnBridge

Saludos!

Z

2007-09-02

Key Simulator – Voice Commander

Gente, para quienes quieran tener la última versión del Voice Commander que estoy haciendo, pueden bajárselo de http://www.codeplex.com/KeySimVoiceCommander

Saludos!

Z

2007-08-31

Feedback sobre los posts anteriores

Al parecer, lo que mostre en el post anterior funciona "como viene" nada mas con Windows Vista. Tendría que sentarme a ver bien que pasa sobre XP.


Saludos!

Z

2007-08-29

Cool & Useless: Creando nuestra propia aplicación para manejar la PC por medio de la voz, (casi) todo desde código manejado (Parte 2)

En el post anterior vimos hace para usar el motor de reconocimiento de voz usando el .Net Framework 3.0 para reconocer las frases que nosotros queremos. Sin embargo, para hacer esto estábamos usando el motor de reconocimiento predeterminado del sistema. Haciendo un pequeño retoque, veremos que es posible usar el motor en cualquier otro idioma.

El primer requerimiento será bajar el MUI Pack del idioma que queremos usar. El Windows Vista Ultimate que yo tengo instalado trae ya instalado el motor para inglés americano y británico. Desde Windows Update, baje el MUI Pack de español y con esto, se instaló el motor de reconocimiento en español.

Como comenté en el post anterior, Windows no permite el uso del reconocimiento de voz en un idioma distinto al que se está usando en el sistema. Sin embargo, con las siguientes líneas de código es posible inicializar la clase SpeechRecognitionEngine con cualquier otro motor instalado.

Este ejemplo busca algún motor que esté en español y empieza a reconocer voz con el idioma elegido:



static void Main(string[] args)
{
SpeechRecognitionEngine sre = null;
foreach (RecognizerInfo config in SpeechRecognitionEngine.InstalledRecognizers())
{
if (config.Culture.TwoLetterISOLanguageName == "es")
{
sre = new SpeechRecognitionEngine(config);
}
}

Choices choises = new System.Speech.Recognition.Choices(
new string[] { "hola", "como", "estas", "mi nombre es Pablo" });

GrammarBuilder gb = choises.ToGrammarBuilder();
gb.Culture = sre.RecognizerInfo.Culture;
Grammar grammar = new Grammar(gb);


sre.LoadGrammar(grammar);
sre.SpeechRecognized += new EventHandler(sre_SpeechRecognized);
sre.SetInputToDefaultAudioDevice();
sre.RecognizeAsync(RecognizeMode.Multiple);
}

Debemos recordar que al inicializar el SpeechRecognitionEngine con un idioma distinto al predeterminado, también debemos cambiar la cultura del GrammarBuilder usado para generar la gramática a cargar. El resto del ejemplo es igual a lo ya visto.

Volviendo a nuestro objetivo de manejar cualquier cosa con la voz, lo que necesitamos hacer ahora es poder simular el uso de teclado.

Si bien el .Net Framework trae la clase System.Windows.Forms.SendKeys con el método Send, el cual recibe un String y simula presionar esas teclas, veremos que esto no nos va a servir para simular es uso del teclado en juegos que usen DirectX.

Para poder hacer esto, usé la función SendInput() desde C++ la cual está disponible al incluir el header windows.h . Esta función sirve para simular desde un nivel mas bajo el input desde teclado, mouse o algún otro dispositivo de hardware (más información en http://msdn2.microsoft.com/en-us/library/ms646310.aspx).

A continuación un pequeño ejemplo de cómo usarlo para simular la letra 'A'



void SimulateKeyboard()
{
KEYBDINPUT kb={0};
INPUT Input={0};

kb.wVk = 'A';
Input.type = INPUT_KEYBOARD;
Input.ki = kb;
::SendInput(1,&Input,sizeof(Input));
}


Teniendo esto, creé un nuevo proyecto de DLL en C++ para poder exportarla y usarla desde código manejado.

Una vez obtenida la DLL que exporta el método creé un proyecto de DLL en C# para poder wrappear esta función y usarla cómodamente desde código manejado.

Con esto ya terminé de armar todas las herramientas necesarias para mi aplicación. Solo restó armar una aplicación que levante una configuración desde un archivo XML con las frases que quería decir, asociadas a las combinaciones de teclas a simular y listo! Ya tenía armado mi simulador de teclado manejado por voz.

Acá les dejo un link al código del proyecto entero para que lo bajen. Tengan en cuenta que esto lo hice medio a los apurones así que puede estar bastante buggeado, pero, como diría el Bambino Veira, La Base Está J


Saludos!


Z

2007-08-28

Cool & Useless: Creando nuestra propia aplicación para manejar la PC por medio de la voz, (casi) todo desde código manejado (Parte 1)

Después de gastar horas y horas jugando al Star Trek: Bridge Commander, empecé a pensar que al juego le faltaba algo. En un perfecto simulador de una nave de Star Trek el capitán debería estar hablando con la tripulación de puente, y no picándole la cabeza (traducción al mundo real de hacer click al mirar hacia un tripulante) para que hagan lo que dice, por lo que me propuse lo siguiente: Hacer íntegramente en .Net una aplicación en la cual pueda reconocer comandos de voz, los mapee a hotkeys del juego y simule su uso, para que entonces yo pueda gritar: Red alert! Shields up! Y mi primer oficial levante los escudos y las armas, sin tener que memorizarme los 381273981 hotkeys que trae el juego.

Para lograr mi objetivo, empecé por donde suponía que iba a tener mayores dolores de cabeza: el Reconocimiento de Voz.

Desde hace unos días ya había estado entrenando al motor de reconocimiento de voz en ingles que trae Windows Vista, usando el (pésimo) micrófono incorporado a la laptop. A pesar de todo, el resultado había sido bastante satisfactorio, pudiendo usar con relativa comodidad la maquina mediante órdenes de voz, siempre y cuando este en un ambiente silencioso. La primera vez que instalé Windows Vista había bajado el MUI Pack en español, para poder tener reconocimiento de voz en ese idioma. El problema era que para poder usarlo desde Windows tenía que cambiar el idioma de toda la interfaz de usuario, cosa que prefería evitar, por lo que decidí no bajarlo esta vez.

Investigando en MSDN, encontré que con el Framework 3.0 viene un assembly llamado System.Speech, el cual tiene clases que sirven tanto para el reconocimiento como la síntesis de voz.

Si quieren usar este assembly en un proyecto de Visual Studio 2005 y no aparece en el listado de referencias para agregar, vayan a C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\ (o el equivalente en su máquina) y lo van a encontrar.

Dentro del namespace System.Speech.Recognition encontré las clases SpeechRecognitionEngine y SpeechRecognition, las cuales use para poder empezar a "escuchar" lo que estaba diciendo, dentro del programa (más información en http://msdn2.microsoft.com/en-us/library/system.speech.recognition.aspx).

A grandes rasgos, noté como diferencia de SpeechRecognition y SpeechRecognitionEngine que el primero levanta la aplicación que Windows Vista usa para reconocimiento de voz, por lo que todo lo que yo diga iba a ser "escuchado" por esta aplicación también; entonces si yo decía entre otras cosas "Open Internet Explorer" Windows iba a abrir el Internet Explorer, mientras que usando la clase SpeechRecognitionEngine, solo el motor de reconocimiento es activado, pero todo el control queda a manos del desarrollador.

A continuación, un pequeño ejemplo de cómo usé esta clase:



using System;
using System.Collections.Generic;
using System.Text;
using System.Speech.Recognition;
using System.Threading;

namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
SpeechRecognitionEngine sre = new SpeechRecognitionEngine();
Choices choises = new Choices(new string[] { "Hello", "Good bye" });

GrammarBuilder grammarBuilder = choises.ToGrammarBuilder();

sre.LoadGrammar(new Grammar(grammarBuilder));

sre.SpeechRecognized += new EventHandler(sre_SpeechRecognized);
sre.SetInputToDefaultAudioDevice();
sre.RecognizeAsync(RecognizeMode.Multiple);

Console.ReadKey();
}

static void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
if (e.Result.Confidence > 0.9)
{
Console.WriteLine("Escuché '{0}' con una certeza del {1}%",
e.Result.Text,
e.Result.Confidence * 100);
}
}
}
}

En el ejemplo se ve como creamos una nueva instancia de la clase Grammar, mediante el uso de la clase Choises, con la cual indicamos que es lo que vamos a querer escuchar desde el programa. Una vez creada la nueva gramática se la podemos agregar a la instancia del SpeechRecognitionEngine. A continuación suscribimos un método nuestro al evento SpeechRecognized para poder hacer algo cuando el SRE reconozca algo. Como el SRE puede escuchar no solamente de un micrófono, sino que también de un archivo de sonido, llamamos al método SetInputToDefaultAudioDevice() para que sepa de donde tiene que escuchar.

Para terminar, llamamos al método RecognizeAsync para poder empezar a reconocer voz de forma asincrónica.

El método sre_SpeechRecognized se fija que el reconocimiento tenga una certeza de más del 90% y en ese caso, escribe lo que reconoció en pantalla.

Con esto, ya tenemos la forma de reconocer los comandos de voz que le vamos a querer mandar a las otras aplicaciones. La próxima les voy a mostrar como poder elegir entre varios idiomas para usar en el reconocimiento de texto y como poder simular el uso de teclado en cualquier aplicación, incluso juegos que usan DirectX!


 

Saludos!

Z

2007-08-11

Windows Vista – Round 2

Después de haberle agregado 1GB más de RAM a la Thinkpad T60p, volví a instalarle Windows Vista (y usarlo sin swap). Por ahora, la maquina está teniendo un excelente tiempo de respuesta y un uso de memoria del 40 a 50 porciento en idle (total: 2GB).

Veremos en estas semanas como se sigue comportando, ahora que mucho mas software es compatible con el nuevo sistema operativo de MS.

Saludos!

Z

2007-07-31

La instalación de Windows Vista no se lleva del todo bien con Linux

Paso a comentarles un problema que tuve y como lo solucioné, al intentar instalar Windows Vista en mi máquina de escritorio.

La historia es asi: la PC donde se iba a instalar Vista es un AMD Sempron 2400+ con 640MB de RAM con una placa de video ATI Radeon 9600XT con 128MB de memoria. Si bien no está arriba de todo con los requerimientos de hard de Vista, se suponía que tenia que andar bien para lo que la iba a usar (Downloader y Central Multimedia). Esa PC tenía instalado un Ubuntu Linux 7.04 y tenía el disco de 120GB particionado en 2: 90GB en NTFS para datos, 29GB en EXT3 para sistema y 1GB para swap.

Luego de quemar el DVD de Windows Vista me dispongo a instalarlo en la PC. Pongo el DVD, reinicio la máquina. Empieza a bootear desde el DVD, aparece el cartel de Windows Vista y la barrita moviéndose al cargar y… puf! Pantalla en negro. Uno, dos… cinco… diez… treinta minutos sin hacer nada. Reinicio. Vuelvo a intentar. Lo mismo. Empezamos mal.

Como primer problema, sospeché que podía haber algún problema con el DVD, entonces agarre la notebook e intenté instalar Vista en una VM. Instaló sin problemas y en tiempo record. Después, se me ocurrió que podía llegar a ser problemas del monitor LCD (nuevo) que tenía. Algun problema de resoluciones, tasa de refresco o algo asi. Probé con el CRT y tampoco: sin respuesta.

Mi próximo target fue la placa de video. Busque mucho en internet y no parecía haber nada reportado sobre incompatibilidades de mi Motherboard - Placa de Video - Procesador con Windows Vista. Hasta que finalmente se me ocurrió: ¿Será algún problema con la partición EXT3 que tengo? ¿O con la partición NTFS en la cual Linux estuvo trabajando todo este tiempo?

Ahí probé correr el GPartEd (Gnome Partition Editor), borrar las particiones Linux y dejar la NTFS solamente. Volví a correr la instalación de Vista y, pese a no poder instalar, la cosa había mejorado un poco: la instalación mostraba una pantalla mas (la que se ve el fondo azul) y me mostraba el puntero del mouse, pero nada mas (y tardaba mucho en poder hacer esto). Lo bueno es que sabia por donde venia el problema: resultaba que una vez (usando Linux) se cortó la luz en mi casa y la partición NTFS quedó marcada como que tenia que ser escaneada por errores (sin embargo, siempre anduvo bien). Esto todavía no se puede hacer desde Linux, asi que nunca lo hice. La forma de solucionarlo fue correr la instalación de Windows XP (que anduvo sin problemas), crear una partición NTFS en el espacio que había quedado al borrar la partición EXT3, correr el verificador de unidades y recién ahí, volver a instalar Vista, esta vez sin problemas.

Asi que si a alguien le pasa que la instalación se le queda en una pantalla negra, o en la pantalla con fondo azul, puntero del mouse y nada mas, vea si no hay algún problema con las particiones.


 

Un saludo!

Z