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
El blog amigo del Nerd moderno
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
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
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
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
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
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
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
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
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
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
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
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
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
Después de varios intentos de instalar OS X sobre la T60p y 2 DVDs de Mac OS X bajados, pude instalar el flamante sistema operativo de Mac en la notebook.
Por si alguien está teniendo los mismos problemas, les cuento los detalles de esta máquina, como hice para instalarlo y que quedo andando y que no.
Detalles de la máquina, Lenovo Thinkpad T60p
Instalación:
El DVD que me bajé es el de Mac OS X JaS 10.4.8. La instalación es bastante fácil de seguir. Tiene una utilidad para particionar discos que no trae grandes complicaciones (yo lo instalé en un disco externo conectado por USB y anduvo de 10). En el momento de elegir que paquetes instalar, hay que marcar el de Intel SSE3, y los que tengan que ver con el hardware de la maquina (creo que ninguno mas para mi caso).
Una vez terminada la instalación, no hay que sacar el DVD de la lectora y volver a arrancar la instalación. Cuando ya cargó de nuevo, abrir una consola (creo que está en el menú de utilidades), ir al directorio: /Volumes/NombreDelDiscoDondeInstalaronMacOsX/System/Libraries/Extensions/
Estando ahí, borrar (o mover a algún otro lugar):
Una vez hecho esto, salir del programa de instalación, sacar el DVD y bootear felizmente Mac OS X (si no borramos esto, tira un Kernel Panic, indicando que hay que reiniciar la máquina).
Al iniciar Mac OS X, vamos a tener la PC con la red Ethernet funcionando, pero con una resolución de 1024x768 y sin sonido.
Para conseguir tener sonido busquen el siguiente driver en la página http://forum.insanelymac.com/ : Conexant_HD_Audio.pkg.zip
Aparentemente, todavía no hay drivers para la placa de video, FireGL v5250 (mismo chip que la X1700) asi que lo mejor que pude conseguir fue subir la resolución a 1400x1050, y no 1680x1050, como debería ser. Tampoco pude activar los efectos 3D por el mismo motivo.
Sobre la placa de red wireless el asunto es similar: recién hace poco empezaron a desarrollar un driver que funcione con la placa que trae esta máquina, asi que habrá que esperar unos meses hasta tenerlo andando.
Para más información busquen en el foro de InsanelyMac que hay mucha gente que pasó por lo mismo.
Ah, si alguien consigue drivers, o como hacer andar bien la placa de video, por favor avíseme!!!
Saludos,
Z
PD: Si lo instalan, con el Beta de VMWare Fusion pueden correr su instalación de Windows alojada en otra partición como si fuese una máquina virtual y con el nuevo feature Unity pueden tener las ventanas de Windows directamente en el escritorio de Mac! (pretty cool, ha!)
Estuve todo el sabado a la tarde tratando de hacer andar Mac OS X en mi Thinkpad T60p, pero finalmente tuve que resignarme: no hubo forma de hacerlo andar. Siempre que terminaba de instalar, reiniciaba la PC y todo terminaba con un kernel Panic. Ahora me estoy bajando una versión mas nueva, a ver si con ese puedo instalarlo bien (ahora voy a tratar de hacerlo sobre el disco externo, para no tener que volver a destruir mi partición de XP…). Todo sea por poder usar el VMWare Fusion :D
Z
Hace unas semanas bajé el Beta 1 de Visual Studio Code Name Orcas, el cual trae soporte para el .NET Framework 3.5 y las herramientas de lenguaje para C# 3.0
Jugando un poco, primero con LINQ y después con los nuevos chiches de los tipos anónimos me encontré con el siguiente problema: pese a que haciendo queries de LINQ los valores de retorno podían venir como un tipo anónimo, yo no podía hacer lo mismo para mis clases.
Básicamente mi motivación era no tener que crear una clase para, por ejemplo, tener una colección de tuplas <Int, String> para poder hacer algo como esto:
(este código no compila. La notacion List<{Int, String}> es product de mi imaginación :D)
List<{Int, String}> miLista = new List<{Int, String}>(); |
Le comenté esta duda a Diego Gonzalez y después de unos días me averiguó la forma de poder hacer esto y por que no funcionaba mi idea original. Me dijo que el problema es que los tipos genéricos no pueden ser inferidos en el constructor y es por eso que no se pueden crear las List<T> de esta forma.
Para poder crearlas hubo que hacer una clase auxiliar que infiere los tipos desde métodos estáticos y crea las instancias de las clases genéricas con los tipos ya inferidos (por si no se entendió, aca va un ejemplo):
(este código SI compila!)
using System; |
Básicamente, lo que hace el método NewList de la clase CollectionGenerator es inferir el tipo de un testigo de una clase genérica y construir una lista del tipo inferido. Una vez hecho esto, ya podemos usar nuestra lista de objetos de un tipo anónimo!
Espero que les sea útil.
Un saludo!
Z
Hace poco me bajé el Beta 1 de Visual Studio Orcas y prefería no destruir mi PC en el intento de probarlo me incliné por la opción de la virtualización.
Como cada vez que hago esto desde Windows, llegué a la dicotomía de si debía usar VMWare (el cual siempre supo dar buenos resultados en el pasado), o el nuevo Virtual PC 2007, del cual me habían hablado muy bien.
Para empezar, me bajé (de forma gratuita) el Virtual PC 2007 y creé una nueva máquina virtual con Windows XP SP2, todas las actualizaciones y Visual Studio Orcas. Para mi sorpresa (y en comparación con las versiones anteriores de Virtual PC) teniendo una VPC con sólo 256MB de RAM, se podía trabajar con total fluidez y soltura, sin frenadas ni grandes tiempos de carga (y decir eso sobre Visual Studio no es poca cosa). Lo único que podía notar a veces es que la máquina host se notaba un poco lenta.
Para mi suerte, después de 2 días (y por pura casualidad) salió la nueva versión de VMWare. Como andaba con un poco de tiempo, decidí probar cual era el mejor de los dos para lo que quería hacer (de por sí, el VMWare arrancaba con la ventaja de que corre Linux sin problemas, cosa que necesito a veces para la facultad). Bajé el VMWare Player 2.0 para Windows y el trial de VMWare Workstation para Linux (después verán para que). El único asunto es que el VMWare Player no tiene ninguna tool para crear nuevas máquinas virtuales. Aquí es donde www.easyvmx.com entra en juego: una página donde uno puede configurar una maquina virtual como quiere, y la genera! Con esto, ya podemos tener una maquina virtual similar a la creada para VPC. Una vez bajada la VM, procedí a instalar Windows XP.
Una vez ya instalado el sistema operativo salta a la luz otra diferencia del VMWare Player con la versión Workstation o Server: la falta de las VMWare Tools, instalables en la máquina Guest. Igualmente, esto tiene una muy simple solución: vamos al archivo .tgz que bajamos de la versión trial para Linux de VMWare Workstation y si buscamos un poco vamos a encontrar un archivo llamado Windows.iso o Linux.iso, los cuales son las imágenes de CD de las VMWare tools para Windows y Linux respectivamente. Montamos la imagen en la VM e instalamos las tools.
Ahora si, ya estamos en igualdad de condiciones para comparar los dos productos. Para ver que me convenía más, decidí correr unos benchmarks. Pese a que estuvieron bastante más parejos que los benchmarks anteriores, VMWare sigue superando a Virtual PC en performance.
Una cosa loca que me paso con los benchmarks es que al hacer un benchmark de disco, VPC sacó incluso más puntaje que la maquina nativa, por lo que pienso que debe estar haciendo alguna trampa en esa categoría…
Como todavía no quería cerrar el veredicto, me puse a usar la VM para ver como era el tiempo de respuesta y usabilidad. En una palabra, excelente. Como dato extra, la maquina host queda bastante más viva al correr la VM que con VPC.
Por lo tanto el veredicto final es: VMWare sigue ofreciendo superior performance, pero ahora es seguido bastante más de cerca por Virtual PC.
¡Hasta la próxima!
Z
Hace una banda que no escribo nada!!
Ya que es un blog bastante nerd, solo voy a poner las cosas nerd-reelevantes:
Otro tema: para quienes tengan problemas para ver DVDs en la notebook porque se les escucha muy bajito (en WMP), les paso 2 tips:
Un saludo!!
Z
Desde el día de hoy soy un feliz poseedor de una PSP (también conocida como Gameboy con Esteroides).
Este minibichito tiene de 3 a 8 horas de autonomía (dependiendo del volumen, brillo y cosas extras como el WiFi) y capacidad de proceso similar (si no, superior) a la de una PSOne.
Lo mejor de todo es que como vino con un Firmware menor al 2.81 (2.60) pude actualizarlo perfectamente para que use un firmware custom, que permite correr libremente juegos backupeados, para decirlo de alguna forma y… todos mis juegos de PSOne con una imagen de CD desde un MemoryStick Pro Duo! (si… me compré uno de esos), aparte de emuladores y un montón de cosas mas.
Bueno, para quienes la tengan y quieran saber como actualizar su firmware o cosas similares, les dejo unas páginas que me fueron muy útiles:
http://homepage.eircom.net/~pspcalo/index.html - Todo sobre como actualizar a cada firmware, con guías paso a paso. Muy útil.
http://foro.tales-tra.com/viewtopic.php?t=109 – Popstation. Programa para pasar las imágenes de CD de PSOne al format de la PSP. Must Have.
Hasta la próxima!
Z
Dando vueltas por la red encontré unas páginas muy piolas: http://www.thesuperheroquiz.com/villain/ y http://www.thesuperheroquiz.com/
Con unas cuantas preguntas, te dicen que superheroe o supervillano serías. ¡A mi me salió Superman (y Spider-Man en segunda instancia) - ahora entiendo por que esos dos son mis superheroes favoritos :D - y como supervillano Dr. Doom!
You are Superman
You are mild-mannered, good,
strong and you love to help others.
Superman 80%
Spider-Man 70%
Green Lantern 70%
Robin 62%
Supergirl 50%
The Flash 50%
Batman 45%
Hulk 40%
Iron Man 35%
Wonder Woman 30%
Catwoman 25%
You are Dr. Doom
Blessed with smarts and power but burdened by vanity.
Dr. Doom 61%
Riddler 60%
Juggernaut 53%
Apocalypse 52%
Dark Phoenix 52%
The Joker 47%
Lex Luthor 43%
Magneto 42%
Mystique 37%
Green Goblin 33%
Two-Face 33%
Catwoman 29%
Kingpin 28%
Mr. Freeze 26%
Poison Ivy 23%
Venom 19%
Zaiden
Ayer se me dio por ponerme a ordenar los DVDs de casa.
Mala idea.
No me había dado cuenta que llegué a tener tantos DVDs. Decidí que la mejor forma de organizarlos es poniéndolos en carpetas en vez de cajas. Lo que pasa ahora es que no se que voy a hacer con las cajas (si a alguien le interesa comprar unas 200 – 300 cajas de DVD, avíseme J).
Zaiden
Gente, si alguien tiene una Thinkpad con todo el soft de Lenovo instalado y está teniendo problemas con el IE7 (los tabs tardan muchísimo en abrirse), pruebe desinstalar el ThinkVantage Client Security Solution for Vista. Eso lo arregla.
Zaiden
En este post voy a explicar cómo instalar Ubuntu Linux 6.10 (y probablemente cualquier versión posterior) en un disco externo USB o Pendrive (siempre y cuando tenga suficiente capacidad).
Primero que todo, configuramos en el BIOS que el orden de booteo tenga antes que el disco interno, el CD/DVD y el booteo por USB. Arrancamos la máquina con el CD de Ubuntu colocado e iniciamos el LiveCD. Antes de iniciar la instalación, conectamos el Disco o Pendrive a la computadora (nota al margen: en mi caso, tengo un disco de notebook conectado por un cable IDE-To-USB. Para que este funcione tuve que jumpearlo para que sea Master ya que con Cable Select no lo detectaba). Iniciamos la instalación y cuando nos pregunta en que disco instalar, elegimos el disco externo (en mi caso, /dev/sdb2). Cuando pregunta donde instalar GRUB, cambiamos (hd0) por el dispositivo en el que instalamos Ubuntu (en mi caso, sería /dev/sdb, sin los paréntesis y sin ningún número). Cuando termina la instalación, reiniciamos la maquina recordando sacar el CD de instalación antes de que vuelva a bootear.
Al volver a iniciar la computadora, el disco externo ya debe encontrarse conectado y si todo salió como esperábamos aparecerá el menú de GRUB para iniciar el Linux.
En mi caso, me paso que al seleccionar cualquier opción de Ubuntu en GURB me decía "Error 17". Esto ocurre porque al bootear desde el disco externo, el disco pasa a ser la primera unidad, entonces su denominación cambia por /dev/sdb1. Para solucionar esto presionen "E" sobre la opción que quieren usar y nuevamente E sobre la línea que dice: "root (hd1,1)" (o similar) y cambien el primer 1 por un 0. Les debería quedar así: "root (hd0,1)".
Una vez editado, toquen B para arrancar (creo que es B) y... tadaaaa! Ubuntu debería estar arrancando.
Para no tener que tocar el menú de arranque cada vez que inicia la máquina, desde su Ubuntu editen en archivo /boot/grub/menu.lst y cambien lo mismo que cambiaron recién en el menú de GRUB, pero en este archivo.
Cualquier duda, comenten acá. No me manden mails así otras personas también se benefician con su pregunta.
Un saludo!!
Zaiden
Desde que Jony me dijo que las ThinkPad nuevas traen un sensor para poder medir la inclinación de la notebook, estoy con ganas de hacer alguna aplicación tonta que lo use.
Resulta que ya hubo gente a la que se le ocurrió, y si buscan en YouTube van a encontrar videos de gente manejando el TuxRace (famoso juego de carrera de pingüino en 3D de Linux) con el movimiento de la ThinkPad.
Habiendo visto esto, me emocioné bastante ya que confirmaba que lo que yo quería se podía hacer perfectamente.
Buscando por internet encontré la pagina de un flaco que hizo un programita de ejemplo en Python que usa el driver de este acelerómetro y obtiene los valores. Buscando un poco mas también pude encontrar casi el mismo ejemplo en C++ y C# (voy a dejar el ejemplo en C++)
El único problema, fue que al ejecutar el DeviceIoControl me tira un error y no puedo leer los valores. Si alguien llega a tener una idea de que puede ser lo que pasa, por favor digame. Igualmente ya le pregunté al flaco que lo hizo en Python, a ver si me puede dar una mano.
El ejemplo en C++ (compilado en VC++ 2005):
#include
"stdafx.h"
#include
<iostream>
using
namespace std;
//.........jun hirabayashi............................
// this C++ class was ported and modified from C# class
// http://www.ussg.iu.edu/hypermail/linux/kernel/0412.1/0974.html
#include
"windows.h"
#include
<iostream>
struct ShockData
{
int status;
short
int x0;
short
int y0;
short
int x1;
short
int y1;
short
int x2;
short
int y2;
short
int x3;
short
int y3;
short
int x4;
short
int y4;
short
int x5;
short
int y5;
short
int x6;
short
int y6;
short
int x7;
short
int y7;
short
int x8;
short
int y8;
short
int x9;
short
int y9;
short
int x10;
short
int y10;
short
int x11;
short
int y11;
short
int x12;
short
int y12;
short
int x13;
short
int y13;
short
int unknown0;
short
int unknown1;
};
class Accelerometer{
private:
HANDLE hFile;
ShockData AccelerometerData;
int OffsetX;
int OffsetY;
protected:
public:
Accelerometer();
~Accelerometer();
bool GetAccelerometerData(void);
int Status(void);
int X;
int Y;
};
Accelerometer::Accelerometer()
{
try
{
hFile = CreateFile(L"\\\\.\\ShockMgr", GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);
if(hFile == INVALID_HANDLE_VALUE)
throw
"Failed to open ShockMgr.";
}
catch(...){}
OffsetX = 0;
OffsetY = 0;
if ( GetAccelerometerData() )
{
OffsetX = -X;
OffsetY = -Y;
GetAccelerometerData();
}
}
Accelerometer::~Accelerometer()
{
CloseHandle(hFile);
}
bool Accelerometer::GetAccelerometerData(void)
{
unsigned
long ulRead = 0;
try
{
if( !DeviceIoControl( hFile, 0x733fc, NULL, 0, // via IOCTL(0x733fc)
(void *)&AccelerometerData, 0x24, &ulRead, NULL))
throw
"Failed to DeviceIoControl";
X = AccelerometerData.x0 + OffsetX;
Y = AccelerometerData.y0 + OffsetY;
return
true;
}
catch(...)
{
return
false;
}
return
false;
}
int Accelerometer::Status(void)
{
return AccelerometerData.status;
}
int _tmain(int argc, _TCHAR* argv[])
{
Accelerometer *pAccel = new Accelerometer();
pAccel->GetAccelerometerData();
cout << "X: " << pAccel->X << " Y: " << pAccel->Y << endl;
system("pause");
}
Si llego a saber cómo solucionarlo, prometo postearlo.
Zaiden
Pese a los reiterados intentos de desactivar el Firewall que Windows Vista instala de forma predeterminada, el mismo vuelve a activarse de forma sospechosamente aleatoria luego de un tiempo.
Si realmente no quieren usar el Firewall de Windows Vista, primero que todo, desactívenlo de la forma tradicional y luego de hacer esto hagan click derecho sobre Computer => Manage, van a la parte de servicios, doble click en Windows Firewall y cambien el tipo de inicio a Disabled.
Sé que es algo bastante tonto, pero ya vi mucha gente a la que se le reactiva solo el Firewall y ni siquiera se da cuenta.
¡Hasta la próxima!
Zaiden
Desde hacer un tiempo que el posteo desde Word 2007 había dejado de andar para Blogger, pero por suerte ya está operativo nuevamente :D
No sé si habrá sido una actualización de Office, o de Blogger ¡Pero la cosa es que anda!
Zaiden
Como sabrán por mi último post, la querida notebook HP COMPAQ V2069 cumplió su ciclo el día que decidió inmolarse cerca de mi persona.
Estuve cerca de un mes sin laptop, lo que me llevó a volver a usar la desktop para algo más que rockola o MuleComputer. En esa máquina tengo instalado un Ubuntu Linux 6.10 y aprovechando que tengo instalada una veterana pero todavía potente placa 3D (una ATI Radeon 9600XT) aproveché para ver a la nueva niña bonita del mundo Linux: Beryl, XGL y demás yerbas.
¡Simplemente agregué los repositorios de Beryl, 2 clicks en el Synaptic y listo! Me tomé mí tiempo y terminé dejando al Ubuntu como un bello Mac OSX lleno de efectos 3D, jeje :D.
Varias semanas pasaron, hasta que finalmente el chiche nuevo llego: Una Lenovo ThinkPad T60p con las siguientes specs:
Apenas llego, hice los DVDs de recovery (por cualquier cosa) y… ¡Zas! Instalé Windows Vista. Debo admitir que fui un poco miedoso y me mantuve en la versión para x86 (32 bits). Sin embargo, RodoF fue más valiente y se mando directamente a la versión x86-64, ya que este procesador implementa la arquitectura desarrollada originalmente por AMD, pero que Intel llama Intel64 (en contraparte de AMD64).
Al principio pensé que teniendo 1GB de RAM iba a notar demasiado acceso al disco por swapping, pero para mi sorpresa la máquina anda con mucha soltura, incluso usando muchas aplicaciones a la vez (el único problema que noté hasta ahora es que tarda bastante en prender y en apagar, pero estoy sospechando que el culpable de eso es alguno de los programas de ThinkPad. Tendré que investigar al respecto).
Bueno, esto es todo por ahora. Hasta el próximo post!
Zaiden
PD1: En 2 semanas quemé una notebook, una desktop, un disco e hice que otro tirara errores de S.M.A.R.T. ¡Juro que fue sin querer!
PD2: Le voy a decir a Jony que se postee algo, porque hace mucho que no escribe nada.
Dato Loco: El cerebro no procesa negativos. Ej.: NO pienses en un elefante rosa… ¡Viste!
Hace unos días volví de mis vacaciones por europa. Me fui dos semanas para pasear por Inglaterra y Holanda.
Los primeros 10 días (incluido Año Nuevo) los pasé en Inglaterra. 3 días cerca de Norwich y una semanita en London.
London es, sencillamente, espectacular: la vista, las cosas, los lugares, la gente... todo! El único problema que tenía era la guita. Considerando que el cambio esta 6 a 1 con los Pounds y el Peso argentino, estaba un poco limitado en el factor shopping. El tema es que ahi se encuentran todo tipo de cosas que nunca van a llegar para aca (como ediciones de coleccion de DVD de Star Trek, modelos para armar, y mil cosas mas). Lo que noté es que, pese a lo que yo pensaba, no estamos tan atrasados aca en materia de celulares. Allá la mayoria de la gente usa las mismas porquerías que usamos aca (por ejemplo, mi celular - que tiene mas de 2 años - con Windows Mobile 2003 es muchisimo mejor que el 95 % de los celulares que venden ahi).
Después de London me fui para Amsterdam por 3 días, donde me encontré con mi amigo Chavito. También... espectacular! Muy muy lindo, aunque el clima nos arruinó un poco la vista los primeros dos dias.
Bueno, eso es todo. Quería escribir algo porque si no, el blog queda medio muerto. Cuando vea algo copado, lo posteo.
Zaiden