erwinried
erwinried
La bitácora de Erwin Ried
58 posts
Repositorio de los artículos originales en español
Don't wanna be here? Send us removal request.
erwinried · 7 years ago
Text
La problemática primera capa al imprimir en 3d
Antes de migrar a Tumblr, el problema de adherencia por deformaciones en la superficie de impresión en las impresoras 3d fue uno de los últimos artículos que comencé a escribir, pero nunca terminé, pues pensé que era un problema sin solución elegante (aplicar pegamento, laca, un brim no son soluciones elegantes).
Problema
En el mundo real, ninguna superficie es completamente plana. Aquí cae mi primer error en el pasado, intentar arreglar eso.
Tumblr media
Decidido a “aplanar” mi hot bed, compré varias, elegí la menos deformada e intenté rebajar el aluminio con un dremel la estación de pedestal... con las tolerancias de las partes plásticas del sistema me fue imposible:
Tumblr media
Finalmente decidí comprar un CNC X-Carve para el propósito y terminé haciendo regalos de navidad con él: https://www.youtube.com/watch?v=87HM_snbRBc
Solución
UBL (Unified Bed Leveling) es una funcionalidad en las versiones más nuevas del firmware para impresoras Marlin que pretende mejorar todos los problemas con la deformación de la superficie de impresión, deformación que es el problema principal con la adherencia.
Básicamente UBL crea una matriz de deformación y hace que la primera capa siga esta forma. Gradualmente va aplanando la impresión con la altura. 
Escribí un tutorial paso a paso de como aplicar esta solución en tu impresora, sólo necesitas actualizar Marlin y tener un sensor en el eje Z: https://github.com/eried/Research/tree/master/RepRap/_UBL
Tumblr media
Ahora, la primera capa es casi perfecta y puedo imprimir objetos de casi 21.5 por 26.5 cm de base.
0 notes
erwinried · 7 years ago
Text
Migrando a Tumblr
Ahora escribiré cosas por acá. 
El antiguo blog WordPress ya se sentía muy anticuado. 
Aún me faltan varias cosas por migrar, en particular hacer una página de redirección en www.ried.cl, pero en las plataformas modernas todo es mucho menos embrolloso por lo que imagino que será más rápido (el blog anterior ya tenía años sin ninguna actualización).
Blog en inglés: erwin.ried.cl 
2 notes · View notes
erwinried · 12 years ago
Text
Franqueando los secretos del hardware mediante ingeniería inversa
Cada vez más fabricantes usan (y abusan) de las flexibles especificaciones de los dispositivos de interfaz humana (USB-HID), y esto es en particular útil cuando tenemos situaciones en que el software proporcionado por el manufacturador carece de funciones, tiene algunas que no nos agradan o simplemente no entrega soporte. Veamos cómo identificar y extraer estructuras, protocolos y desarrollar nuestro propio software, usando la nueva calculadora HP Prime como objetivo, la cual como la mayoría de aparatos modernos hace uso de esta especificación Actualmente la única forma de enviar y recibir archivos desde la nueva calculadora HP Prime es mediante el HP Connectivity Kit. Aunque esta aplicación funciona bastante bien, no tiene ninguna forma de realizar operaciones sobre “archivos” puesto que la calculadora misma no tiene ese concepto. Entonces para usar un programa descargado de internet, bajamos un archivo de texto plano y creamos un nuevo programa en el kit de conectividad: Realmente esa forma es una solución bastante primitiva, y podemos solucionarlo.
Introducción a la HP Prime
Quiero comentar brevemente sobre la calculadora pues, aunque este documento no es dirigido directamente al aparato, es conveniente conocer algo más de la misma. Hace muchos años que HP no anunciaba ninguna calculadora gráfica y ya estabamos bastante acostumbrados a ver a la competencia, Casio y TI en particular, sacar modelos modernos. Inclusive, cuando pensé en escribir una comparación entre las últimas nuevas calculadoras (considerando la HP50g como la "nueva" de HP pues no había otra) aún no había noticias de la nueva HP Prime. Sin embargo, antes de terminar de escribir esa comparación, salió y luego de preordenarla como cualquier fanático de las calculadoras, la añadí al documento.
Software
En cuanto al software, en este instante hay que reconocer que deja bastante que desear. El firmware y la contraparte del software para el PC de escritorio son bastante precarios. Las cosas han mejorado levemente, pero hay bastantes cuelgues y bugs. El motor matemático es poderoso, sin embargo detalles gráficos, parpadeos y otros hacen que la experiencia no sea muy agradable. El concepto usado en esta calculadora es muy particular. Todo es una aplicación. Podemos crear una nueva aplicación heredando una de las actuales y reemplazar rutinas de inicialización y variables para obtener otra aplicación. Cada aplicación tiene tres vistas, una simbólica, una gráfica y otra numérica. Por ejemplo la planilla de cálculos tiene sólo la vista numérica. Así, usando un set predeterminado de variables iniciales, tres vistas y otras extensiones más simples (un botón para cambiar "vistas" y otro para mostrar un menú) se consiguen aplicaciones autocontenidas que podemos clonar para hacer las nuestras. Este concepto es un derivado de la  HP39gII. En cuanto a desarrollo, no existe nada de bajo nivel y el único lenguaje  que tenemos por ahora es el HPPPL. Este lenguaje está influenciado en Pascal y no tiene ninguna cercanía con UserRPL, SystemRPL ni la sintaxis RPN (aunque la calculadora soporta RPN como entrada, pero a un nivel muy básico). [code]EXPORT programa(argumentos) BEGIN //comentarios en este formato líneas terminadas en punto y coma; END;[/code] Si estás leyendo este artículo porque estás experimentando problemas con tu calculadora, a la fecha lo único que se puede hacer es reinicializarla con métodos no publicados oficialmente que han sido encontrados: https://www.youtube.com/watch?v=B-pY9zpPmkY
Hardware
En término físicos, esta calculadora está influenciada directamente con las tabletas y teléfonos modernos. Pantalla táctil capacitiva, batería de celular, pantalla en colores retroiluminada, incluyendo bastante memoria RAM y espacio de flash para olvidar un poco las restricciones de desarrollar elegantemente. El único punto destacable negativamente es probablemente la cubierta plástica y el color naranjo elegido para el teclado, pero en general es un producto sólido y que refleja experiencia en el diseño. Como ya vimos en el punto anterior, como el software es bastante primitivo por el momento no tenemos opciones avanzadas (quizás es una buena decisión) y por ejemplo no podemos configurar un "flag" de que el aparato se apague o no con inactividad. Dentro de esto, quería averiguar cuánto realmente duraba la batería por lo que la única forma de mantenerla encendida era presionando una tecla frecuentemente: https://www.youtube.com/watch?v=sGvbxDgt_Yc Como consejo derivado de esas pruebas entonces, si tienes un examen y aún no te aparece la advertencia de que queda poca energía, tienes más de dos horas y media para usar la calculadora (considerando de que la batería esté en buen estado).
Identificando el detalles del hardware
Como siempre, lo primero es buscar ciertas pistas de cómo iniciar el trabajo. En este caso podemos usar USB Tree View para obtener una vista lo más detallada posible de  los dispositivos USB. En realidad podríamos hacerlo sin ninguna aplicación, pero con esta pequeña utilidad se obtiene mucho más: Ya podemos confirmar que tratamos con un dispositivo USB-HID e incluso tenemos su idVendor e idProduct necesarios para nuestro programa: [tp no_translate="y"] [code]------------------ Device Descriptor ------------------ bLength : 0x12 (18 bytes) bDescriptorType : 0x01 (Device Descriptor) bcdUSB : 0x200 (USB Version 2.00) bDeviceClass : 0x00 (defined by the interface descriptors) bDeviceSubClass : 0x00 bDeviceProtocol : 0x00 bMaxPacketSize0 : 0x40 (64 bytes) idVendor : 0x03F0 (Hewlett Packard) idProduct : 0x0441 bcdDevice : 0x100 iManufacturer : 0x01 Language 0x0409 : "Hewlett-Packard" iProduct : 0x02 Language 0x0409 : "HP Prime Calculator" iSerialNumber : 0x00 bNumConfigurations : 0x01 [/code] [/tp]
Espiando las comunicaciones
Utilizando algún sniffer de USB debemos comenzar a analizar los patrones de cada mensaje. Para simplificar la tarea, clasificaremos mentalmente los datos capturados en tres categorías:
Inicialización y finalización: Todos los mensaje por defecto para comenzar, definiciones de tamaño del chunk, descriptores, etc. (Será manejado automáticamente por lo que podemos ignorarlos)
Directos: Los que podamos identificar como generados por nosotros (tendrán que ser analizados sí o sí)
Indirectos: Los que sean respuestas o cosas generadas automáticamente (tendremos que analizar cada caso, por si necesitamos recrearlos)
Opciones de aplicaciones que permitan escuchar el USB tenemos varias. Entre las más populares:
Wireshark: Sin costo, de código abierto y excelente para cualquier trabajo (incluyendo redes, su propósito original)
USBlyzer: Bastante cara, pero la interfaz puede hacer que lo valga para trabajos diarios
USBTrace: Levemente más económica pero no necesita ninguna instalación especial para funcionar (de controladores ni servicios), ideal para cosas esporádicas
UsbSnoop: Sin costo, no la comprobé pero era uno de los primeros resultados al buscar
Obtención de datos generales
Luego de grabar un par de capturas y podemos identificar a grandes rasgos en qué categoría caen secciones de datos. Idealmente podemos usar algún sistema de marcado como por comentarios o marca páginas mientras realizamos las capturas. Por ejemplo, desde que conectamos el dispositivo, cuando lo apagamos, cuando lo dejamos un tiempo sin actividad, entre otros. Es simple identificar la primera clase de mensaje, inicialización y finalización, hay mensajes específicos y datos no identificables: Ahora tenemos segmentos con datos que reconocemos, cosas que nosotros hemos enviado, modificado o alterado. Claramente podemos identificar y asociar esos datos a una acción, ejemplo al duplicar una aplicación podemos ver datos que contienen trozos del nombre: Finalmente, los indirectos. Yo nunca envié configuraciones, pero de vez en cuando veo mensajes así. ¿Serán para sincronizar la hora?, ¿Mantener la calculadora encendida?:
Identificando estructuras
Luego de tener la categoría de mensajes directos etiquetados, podemos comenzar a buscar coincidencias y secciones relacionables en los paquetes de datos. Por ejemplo, podemos mandar reiterados programas desde el kit de conectividad de la calculadora con pequeños cambios. Hay ciertos detalles adicionales a considerar, uno de ellos es que el USB describirá ciertas cosas que afectan a los paquetes de datos, como el largo máximo por ejemplo. Secuencialmente, el proceso funciona así (entre cada punto guardamos el set de capturas del puerto):
Crear un programa/script lo más pequeño posible y ver si podemos identificar parte de su código en los datos al sniffear el USB
Alterar ese programa manteniendo el largo para encontrar la forma de codificación de los mensajes y los posibles checksum
Alterar ese programa cambiando el largo, así detectamos el campo de largo si es que hubiera
Alterar ese programa cambiando metadatos, por ejemplo el nombre del script, para identificar esas secciones
Alterar el programa cambiando el largo de tal forma de encontrar la técnica que usan para repartir datos que no caben en un "chunk" de datos, determinado por el largo máximo de los paquetes que previamente dijo el descriptor USB que soportaba.
Luego de todas esas capturas podemos comenzar a trabajar. En este instante es una decisión de cada persona como enfrentar el problema de "ingenio". A mí personalmente me gusta copiar los datos a Excel e ir probando cosas. En breve puedo colocar reglas que asumiré como válidas hasta que no encuentre un caso contrario:
Los datos van siempre en UTF16 (en el llamado little endian byte order), incluyendo el nombre del archivo y cuerpo.
Los  archivos que consideraré son los con extensión .hpprgm, los cuales son los que se reflejan directamente en la vista de Programas de la calculadora (aunque hay otros interesantes como los que replican una aplicación .hpapp y las notas de texto plano .hpappnote, sin embargo para la presente investigación no serán considerados)
En los archivos .hpprgm tenemos básicamente dos tipos diferentes, unos sin un nombre interno, que se componen de un encabezado y datos. El segundo tipo tiene un encabezado, nombre y datos.
La forma en que se guardan los datos en el disco tiene pequeñas diferencias con la forma en que se envían por el USB, por lo que habrá que considerar esto a futuro.
Estructura USB
Luego de un par de horas, lo que puedo identificar como estructura válida es la siguiente: [tp no_translate="y"]
Byte 0 1 2 3 4 5 6 7 8 9 10 11 Example 00 00 F7 01 00 00 00 B8 06 1C 94 DD Description Start Start Type Items Size Name length CRC Additional Count from last Size byte (7) until end Byte length
[/tp] Sin embargo, luego me di cuenta de que cuando los datos no cabían en un "chunk", el número del siguiente envío tenía el siguiente aspecto: [tp no_translate="y"]
Byte 0 1 2 3 Example 00 01 00 00 Description Start Chunk Data from here, up to the chunk end Additional Goes back to 0x00 after 0xFF
[/tp] En realidad entonces lo que tenemos al final es que luego de añadir el encabezado a nuestros datos, los chunks contienen 2 bytes menos del tamaño del chunk, lo que queda en código como: [code language="csharp"]var fullData = new List(_header); // Name var nameBytes = Encoding.Unicode.GetBytes(name); // Size var size = BitConverter.GetBytes(data.Length + nameBytes.Length +5); // Combining all fields fullData.AddRange(size.Reverse()); fullData.Add(0x06); fullData.Add((byte) nameBytes.Length); fullData.AddRange(new byte[] {0x94, 0xdd}); // CRC fullData.AddRange(nameBytes); fullData.AddRange(data); var allBytes = fullData.ToArray(); int position = 0, chunk = 0; if(chunkSize>0) do { IEnumerable tmp = new[] { (byte)0x00, (byte)(chunk++ % byte.MaxValue) }; Chunks.Add(tmp.Concat(allBytes.SubArray(position==0?2:position, Math.Min(chunkSize-2, allBytes.Length - position))).ToArray()); position += chunkSize-(position==0?0:2); } while (position < allBytes.Length);[/code]
Estructura de los archivos .hpprgm
Luego de recibir los datos, el programa crea archivos con extensión .hpprgm para respaldar los datos. Como dije anteriormente, tenemos dos tipos de estas estructuras. Una no tiene el nombre del script por dentro y en mi opinión es la más simple: [tp no_translate="y"]
Byte 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Example 0C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 … Description Type Name flag Size Data Additional Unnamed 64K current fw limit
[/tp] Actualmente, el firmware actual puede recibir y manejar archivos mayores a 64K pero sólo "internamente" pues hay detalles que fallan, por ejemplo el tamaño del archivo es truncado en la calculadora y el kit de conectividad alega de que el archivo es muy grande. Ahora pasemos a la otra estructura, la cual es levemente más compleja. Acá se añade el nombre sin descriptores de su tamaño (el nombre termina con dos bytes con valor cero seguidos y ahí ya comienzan los datos). [tp no_translate="y"]
Byte 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 … ... … Example 0C 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 31 … 00 00 … Description Type Name flag Name start Name Name end Data Additional Named Name end with 0x00, 0x00
[/tp] Ambas se pueden leer de la siguiente forma, simplemente utilizando el byte en la posición 8 para discernir de que tipo es el archivo que deseamos leer: [code language="csharp"]if (b.Length >= 19) { for (var i = 1; i <= 7; i++) if (b[i] != 0x00) goto case null; switch (b[8]) { case 0x00: var size = b[16] + b[17]*0xff + b[18]*0xff*0xff; Data = new byte[size]; const int offset = 20; for (int i = offset; i < offset + size && i < b.Length; i++) Data[i - offset] = b[i]; break; case 0x01: if (b[16] == 0x31) { for(var i=18;i<b.Length;i++) if (b[i - 1] == b[i] && b[i] == 0x00) { if (!ignoreInternal) Name = Encoding.Unicode.GetString(b.SubArray(18, i-18)); i += 8; Data = b.SubArray(i, b.Length - i); break; } } break; } }[/code]
Un momento... ¡y el CRC!
En la primera estructura había un espacio para dos bytes de un CRC, para descubrirlo primero asumí de que habían utilizado algún algoritmo conocido, así es que intenté primero probar los más simples que incluía el editor hexadecimal que utilizaba: Sin embargo ninguno coincidía, incluso cambiando el inicio y final en reiteradas ocasiones. Posteriormente intenté usar http://reveng.sourceforge.net el cual luego de varios minutos tampoco tuvo éxito. Luego de esto, me di cuenta que quizás era un error considerarlo un CRC tradicional, pues cualquier valor era recibido por la HP, es decir no tiene importancia por este momento buscar como es generado para el propósito de enviar y recibir archivos. Hay que dejar claro que aunque este valor de CRC sin embargo es consistente (a los mismos datos devuelve el mismo valor), no es necesario develar su secreto pues los archivos igual se reciben. Al final fue [tp no_translate="y"]Tim Wessman[/tp] (una persona que trabaja en la división de calculadoras de HP) el que dió algunas pistas en un foro y un proyecto mucho más completo que mi presente programa implementó su solución exacta.
Desarrollo de la aplicación
Ahora con todos estos datos podemos empezar a combinarlos. El punto clave es cómo interactuar con el USB. Para los pasos iniciales podemos aprovecharnos de que todas las ventanas de Windows reciben mensajes sobre algunos eventos de hardware, en particular de dispositivos HID, entonces: [code language="csharp"]private void FormMain_Load(object sender, EventArgs e) { hidDevice.RegisterHandle(Handle); UpdateGui(); } protected override void WndProc(ref Message m) { hidDevice.ParseMessages(ref m); base.WndProc(ref m); // Pass message on to base form }[/code] Así ya recibimos los eventos de conexión y desconexión. Ahora, necesitamos enviar y recibir información. Esto sucede como si estuviéramos escribiendo y leyendo desde un archivo, por medio de un FileStream, sin embargo es posible ya utilizar una librería que implementa todas estas funciones básicas. Hay pequeños cambios que la librería necesita, pero son menores. Adicionalmente la aplicación soportará archivos de texto plano (con una simple conversión interna) y también la recepción del código directamente del portapapeles (usando la misma conversión).
Descarga y código fuente
La aplicación que finalmente obtenemos es totalmente funcional y puede ser descargada acá. El código fuente está disponible en GitHub. Acá hay un pequeño demo de su funcionamiento: https://www.youtube.com/watch?v=FxG-R0QZ-qI
Conclusiones
Este artículo demuestra cómo podemos tomar el control de nuestros dispositivos incluso sin tener ningún tipo de soporte del fabricante. Hay muchas situaciones en donde esto es útil, podemos automatizar acciones que son imposibles con el software actual, migrar el software a otra plataforma no soportada  o realmente lo que se nos ocurra manteniendo la tarea simple, pero también entretenidamente desafiante.
0 notes
erwinried · 12 years ago
Text
La nueva calculadora de Texas Instruments versus la nueva calculadora de HP
Independiente del color que le pongan, HP aún sigue vendiéndonos la misma calculadora desde hace muchos años. Considerando que la 50g es básicamente una pequeña actualización de la 49g+ son aún más años que considerar. ¿Cómo luce la HP-50g frente a la TI-Nspire CX CAS?
Introducción
Aparentemente, Texas Instruments (e incluso Casio Electronics) van años luz delante de HP en cuanto a avances en estos dispositivos. La TI Nspire CX es un dispositivo moderno. Le han permeado todos los avances de los aparatos portables con los que lidiamos a diario como una batería de litio, pantalla a color retro iluminada y superficies táctiles capacitivas. Es cierto HP está mucho más preocupado de sus otras áreas comerciales, sin embargo la idea de este documento es intentar comparar las capacidades de estos dos aparatos para un futuro posible comprador de estos equipos con las opciones disponibles en este instante (independiente de si hay algún nuevo modelo anunciado o no).
Hardware
Cuando recién apareció la 49g+, las especificaciones eran muy superiores a productos similares durante esos años. Actualmente TI lleva la delantera con facilidad: [quote style="boxed"]Especificaciones generales Pantalla: TI Nspire CX CAS: 320x240 píxeles (color, retro-iluminada) HP 50g: 131x80 píxeles (escala de grises) Almacenamiento: TI Nspire CX CAS: 100 MB internos HP 50g: 2 MB internos, 1024 MB o más (Tarjeta SD) Procesador: TI Nspire CX CAS: ARM9 90 Mhz (ARM926EJ-S) HP 50g: ARM9 75 Mhz (Elevable a 200 Mhz máximo, 120 Mhz estable) Memoria RAM: TI Nspire CX CAS: 64 MB HP 50g: 0.5 MB Teclado/Entradas: TI Nspire CX CAS: Teclado, pequeño pad táctil HP 50g: Teclado Batería: TI Nspire CX CAS: Interna de ion de litio (en espera duran un par de semanas, en uso menos de una semana) HP 50g: 4 AAA (en espera duran más de 6 meses, en uso constante alrededor de un mes)[/quote] Aunque dentro del campo de las calculadoras, las mismas no son un dispositivo que requiera muchas actualizaciones (para mí es más como un osciloscopio que una PC en cuanto a requisitos de actualización) claramente los años han pasado la cuenta y HP luce ya bastante desactualizada.
Software
Hace años que los usuarios de la 50g no recibimos ninguna actualización de ROM ni de nada. Se puede pensar que un producto alcance la perfección y no necesite ser nunca más actualizado. El punto es, ¿qué sucede si el ambiente en donde ese producto es utilizado avanza diariamente? y... ¿realmente avanza?
Usabilidad general
El concepto de uso de ambos aparatos es similar, pero su implementación es distinta. La HP usa un directorio como base (directorio de trabajo) en donde las aplicaciones y funciones escriben datos y listas. Desde la vista de FILES podemos cambiar a otro directorio (o desde comandos): Los gráficos y listas son manejados como funciones base. Por ejemplo al abrir la vista de gráficos y añadir una ecuación la HP crea un programa en UserRPL en el directorio de trabajo. Así mismo pasa con muchas otras funciones. Hay otras aplicaciones que directamente interactúan con la pila, que es el concentrador principal de datos. [quote style="boxed"]Gráficos en la HP Que la HP-50g genere una "macro", da muchas más libertades de las que se pueden pensar. Por ejemplo, al graficar X^2, la HP genera un archivo 'y1' que contiene: Esto asigna X y luego evalúa el objeto algebraico entre comillas simples. Ahora bien, gracias a esto es posible reemplazar la entrada por: Y así podríamos colocar 5 como límite superior del eje X. En realidad la versatilidad de esto es infinita, pero este es sólo un simple ejemplo.[/quote] En la TI, el esquema usa el mismo concepto pero acá es más explícito. Se abre un “Scratchpad” al que se le añaden documentos. Los documentos en este caso hacen referencia a la aplicación que los edita y los datos. Por ejemplo creamos uno nuevo: Añadimos uno de calculadora (lo que es similar al de la pila de la HP, sin ser un concentrador global, siendo solo un intérprete sencillo): Y lo mismo pasa con las gráficas: Esto, aunque es mucho más rígido, aumenta la conveniencia. Todo se concentra en un mismo lugar, datos y “aplicaciones”, pero perdemos cierta flexibilidad, como de compartir objetos directamente entre las aplicaciones y necesitamos usar otras vías como copiar y pegar en ciertos momentos. Como no tenemos la pila para trabajar, es complicado por ejemplo reprocesar un arreglo rápidamente y hacer algo con él fuera de lo que ofrece el editor de listas. Esto claramente no es trascendente para el usuario normal, sin embargo la carencia de esta excesiva flexibilidad también evita tener la curva de aprendizaje que pide la HP. Adicionalmente, el inicio de la calculadora es amistoso y proporciona otras formas de comenzar a trabajar (cuando no tenemos ningún Scratchpad abierto como hace unos segundos):
Documentos en la calculadora
Uno de los artículos más vistos en mi sitio es el de cómo colocar documentos en la HP. Una asignatura que no es dictada correctamente, y tiene exámenes mal diseñados permite que una persona tenga ventajas al poder tener “ayuda-memorias” en su calculadora. Personalmente preferiría que esto no suceda pero en el marco actual es algo importante al momento de adquirir una calculadora. Como vimos en el documento titulado Escribiendo documentos en tu calculadora HP si bien tenemos opciones en la HP, lo que ofrece TI supera por mucho cualquier cosa que HP nos haya podido ofrecer en el pasado (y que de hecho fue solamente el horrible Conn4x): En la aplicación instalable en el PC de TI tenemos un completo editor de problemas, en donde podemos crear cualquier tipo de documento, ordenarlo por problemas e importar datos. No hay forma oficial de importar otros tipos de archivos como Word o PDF pero no dudaría que el potencial de la calculadora permitiera que alguna aplicación de terceros lo hiciera.
CAS, Comandos, Referencia y otros aspectos
Durante mis estudios, el vínculo con mi HP estuvo siempre presente. Personalmente siempre pensé que ingeniería era una de las pocas carreras en que no debería importar lo bien que memorices algo al momento del examen y era normal que permitieran calculadoras en las pruebas. Como ya mencioné, la calculadora debería ser mucho más que un portador de documentos (torpedos), debería proveer lo necesario para precisar no necesitar libros de referencia al momento de enfrentar desafíos. Veamos cómo nuestros dos contendores se comportan:
CAS y el Catálogo de comandos
En cálculo, algebra y otros cursos, lo usual esperable parte por las funciones del CAS, búsqueda de incógnitas y despejes simples. Esto luego se complica con límites, derivadas e integradas. Matrices, listas. Eventualmente llega a ecuaciones diferenciales, Fourier, Lagrange, Taylor, Probabilidades, Estimaciones de economía y otros métodos. Ambas calculadoras claramente tienen las bases para enfrentar cualquiera de esos problemas. Revisando ambos manuales avanzados de las calculadoras, puedo notar que en la Texas, a pesar de tener un manual mucho más didáctico, faltan varios comandos (no todos son necesarios pues la TI CAS CX tiene otras formas de manipular la información, sin embargo hay métodos que simplemente no existen). La lista completa está a continuación (770 versus 372): Lista de comandos HP-50g vs TI NSpire CAS CX (75 KB) La documentación en el dispositivo mismo es bastante precaria en la HP, existen aplicaciones que expanden el catálogo, pero de forma original se tiene una breve referencia por comando: En Texas no hay nada equivalente, pero existe un catálogo que muestra referencias a los parámetros de cada función (lo que puede ayudar a predecir lo que hace): Adicionalmente hay ciertas funciones que incluyen asistentes que obligan la entrada de parámetros por medio de un diálogo:
Trabajar en varios problemas al mismo tiempo
Para resolver varios problemas a la vez, en la TI podemos dividir la pantalla fácilmente: También es posible usar las pestañas superiores para intercambiar entre secciones del problema actual, o el menú principal para cambiar totalmente de Scratchbook como se pudo apreciar hace algunos párrafos. En la HP no hay nada tan elegante. Podemos usar HALT y CONT para suspender y continuar editando una pila de comandos o cambiar se directorio principal con VAR/HOME y CHDIR pero no hay nada que aísle perfectamente el trabajo en varias cosas al mismo tiempo.
Geometría
La TI incluye un increíble editor de geometría que gracias a la pequeña superficie táctil que posee es algo impensable en la HP actual. Este editor permite trabajar con medidas exactas y formas de forma similar a una aplicación CAD sencilla, resolviendo gráficamente problemas que de otra forma sería muy difícil de siquiera imaginar.
Conclusiones
La actual HP se mantiene más que nada por la nostalgia de sus usuarios pues HP realmente no ha hecho nada en años para mejorar la experiencia. A pesar de esto, los años de desarrollo que tiene la HP la mantienen como un producto sólido para enfrentar problemas de ingeniería y tal como lo sentí con la TI89 Titanium en la revisión de algunos años titulada HP49g+ versus TI-89 Titanium aún siento que el producto de TI es mucho más orientado a la educación y a personas que realmente quieren una calculadora como herramienta temporal, más que una ayuda permanente. Dicho esto, el producto de hardware que entrega TI no tiene precedentes y es algo muy ad-hoc con los tiempos actuales. Cabe destacar la baja calidad y resistencia que han mostrado los últimos modelos de HP, personalmente no tengo información sobre TI, pero en mi sitio de forma casi diaria recibo un comentario o un correo electrónico de alguna persona que por lo que relata necesitará otra calculadora, pues su HP ha dejado de funcionar irreparablemente por problemas en la pantalla o baterías. Como cierre de esta conclusión, siempre es al final una decisión de cada usuario, pero en este momento, yo recomendaría el producto de TI a cualquier estudiante o profesional simplemente porque siendo un producto moderno es mucho más versátil, fácil de comenzar a usar y controlar completamente. Inclusive, imagino que casi es posible emular una HP50g dentro de la nueva TI. Ahora sólo nos queda esperar quizás cuando tiempo el movimiento de HP en el mundillo de calculadoras gráficas...
El futuro de las calculadoras gráficas programables de HP, la nueva HP Prime
Durante el 2013 HP anunció que tenían una nueva calculadora que estaría disponible durante el mismo año (los meses finales del 2013). Esta nueva calculadora desecha toda la base de la seria HP48 y presenta una solución muy similar a lo que TI ofrece. En efecto ya no existe RPN (existe el método de entrada, pero ya no es un stack global; lo que tiene sentido de todas formas). Naturalmente es necesario tenerla en las manos como para opinar, pero al menos ya hay una luz a la distancia para los usuarios de HP... pero esto ya es otra historia. Hay disponible un emulador preliminar que permite probarla sin compromisos:
1 note · View note
erwinried · 12 years ago
Text
Raspberry Pi+Mono: proyectos poderosos y económicos
Veamos cómo mover un pequeño proyecto desarrollado como aplicación de consola en VS 2012 .NET 4 en muy poco tiempo desde Windows a una placa de bajo coste como la súper popular Raspberry Pi. Revisaré también su rendimiento, consumo, detalles y temperaturas de la misma
Introducción
Una persona necesitaba instalar en muchos vehículos de carga un aparato que tuviera un GPS, cámaras, sensores y un set de reglas con las cuales capturar una imagen y enviar correos por medio de 3g. En la actualidad, hacer proyectos así es fácil y entretenido tomando en cuenta que los componentes de hardware son cada vez más inteligentes y económicos. Mi idea original para el prototipo claramente es una pequeña máquina con Windows. Compré por menos de 200 dólares una eBox, la cual se puede apreciar en el siguiente video: http://www.youtube.com/watch?v=ArJws5HFZLs La eBox 3350mx consume muy poco y corre Windows XP con facilidad. Gracias al filtro EWF del disco duro (se usa la SD en solo lectura, los cambios van a RAM y podemos capturar un estado en cualquier momento por si queremos guardar cosas más permanentemente) este dispositivo es sorprendentemente veloz. El cliente sin embargo decidió comprar una opción más poderosa a un distribuidor chino, uno de los llamados "CARPUTER" o PC para vehículos. En este PC, la placa de control ATX contacto del vehículo gobierna el estado del pc, lo apaga o enciende en demanda. Pero esta máquina con 32 GB SSD, 2 GB de RAM y un Atom doble núcleo es un cañón gigante para matar moscas.  
Raspberry Pi
Una oferta de RS Chile y Fayerwayer me hizo ordenar una Raspberry. La oferta no era mucho más económica que lo normal pero menos de 40 dólares en pesos chilenos con envío incluido incluso derrotaban a eBay en precio, lo cual explota el instinto consumista humano. La placa en sí está genial, en unos segundos tienes Raspbian corriendo en tu LCD, puedes correr Quake 3 o usarlo de reproductor multimedia (para otras cosas, como navegar es bastante lenta). Consume poco, no tiene partes móviles y no genera mucho calor, ideal para usar en cualquier cosa.
Hardware de la Pi
La placa en sí está muy bien diseñada para mantener el precio bajo. No tener un reloj de tiempo real ni salida VGA no genera muchos problemas, e incluso yo personalmente quitaría la salida de audio análoga y el conector de video compuesto. El único punto negro en el hardware de la Raspberry Pi no es la placa en sí, sino la cantidad de accesorios con sobreprecio que se ofrecen para ella. En particular, no entiendo por qué RS envía el aparato en una caja plástica que sólo es útil para su transporte. Hubiera preferido que la caja original tuviera algún diseño astuto extra que la hiciera útil. De todas formas siempre se puede imprimir una solución: http://www.youtube.com/watch?v=NHk01UJryIY
Consumo, overclock y temperatura
Originalmente, el procesador de la placa está configurado a 700 Mhz. Podemos alterar esto en un rango desde los mismos 700 Mhz hasta 1 Ghz. Dada la opción, estuve revisando el consumo de la placa y su temperatura en tres rangos de overclock, tomando en cuenta un estado de relajo (cpu en 0%) y stress (cpu en 100%). Los datos son los siguientes: Puede haber pérdidas producto del adaptador USB que utilicé (la medición no fue entre la placa y el puerto USB, sino que fue el consumo real del adaptador de 220V a 5V). La temperatura es reportada por el sensor interno del procesador. Nota 1: El teclado y mouse utilizan aproximadamente 0.2 Watts extra en conjunto. Al conectar el cable de red se añade 0.3 Watts más. Todas las pruebas son con teclado, mouse y red conectadas. Nota 2: La temperatura ambiente de la prueba era 19ºC, 37% de humedad ambiental.
Mono, Soft-float y Hard-float
La última versión de Raspbian, el sistema operativo de la Raspberry PI no funciona correctamente con mono. En realidad hay otras aplicaciones que tampoco funcionan bien por la implementación del manejo de los números con coma flotante. ¿En qué afecta esto? A primera vista pareciera que todo funciona correctamente, sin embargo las fechas en particular manejadas por el objeto DateTime tienen raros valores: En la imagen, los nombres de archivo supuestamente deberían tener el formato de AAAAMMDD-hhmmss_nombre.extensión y 0001 es claramente un año inválido, al igual que el resto de los valores. Pero como el problema es de tan bajo nivel, hay una serie de consecuencias que hacen inviable el uso de Mono en este estado. Hay una versión que maneja los números con coma flotante por medio de software, lo que es mucho más lento pero evita problemas. Lamentablemente y como informan en http://www.raspberrypi.org/archives/3534 hay algunas nuevas placas que en vez de tener RAM Samsung tienen un chip Hynix el cual es incompatible con la versión vieja de Raspbian que permitía utilizar mono de forma normal. Felizmente el usuario OtherCrashOverride compiló la versión 2.11.4 de Mono para funcionar en la última versión de Raspbian y aunque es experimental funciona perfectamente:
Algunos cambios necesarios en la aplicación
La aplicación lee sensores por medio de un Arduino y decodifica posición y velocidad de un GPS. Ambas acciones usan el puerto serie de una forma muy sencilla: [code language="csharp"]sensors = new SerialPort(settings.IniReadValue("sensors", "comport"), int.Parse(settings.IniReadValue("sensors", "bauds"))); sensors.DataReceived += sensors_DataReceived;[/code] Ahora bien, los settings utilizan dos funciones de Kernel32, las cuales claramente no están presentes en Mono: [code language="csharp"][DllImport("kernel32")] private static extern long WritePrivateProfileString(string section,string key,string val,string filePath); [DllImport("kernel32")] private static extern int GetPrivateProfileString(string section,string key,string def,StringBuilder retVal,int size,string filePath);[/code] Sin embargo, esto tiene una solución sencilla, escribir la lectura (incluso de forma primitiva, pues es realizada sólo una vez). Los archivos ini tienen la siguiente estructura/sintaxis clásica: [code][sección] Nombre=valor ;comentario[/code] La forma implementación genérica más simple entonces convierte nuestra función: [code language="csharp"]public string IniReadValue(string Section,string Key) { var temp = new StringBuilder(255); GetPrivateProfileString(Section,Key,String.Empty,temp,255,this.path); return temp.ToString(); }[/code] en la siguiente: [code language="csharp"]public string IniReadValue(string Section,string Key) { #if __MonoCS__ var d = false; foreach (var l in File.ReadAllLines(path)) { if (d) { if (l.StartsWith(Key)) return l.Substring(Key.Length + 1); } else { if (l == "[" + Section + "]") d = true; } } return ""; #else var temp = new StringBuilder(255); GetPrivateProfileString(Section,Key,String.Empty,temp,255,this.path); return temp.ToString(); #endif }[/code] Ahora, según la documentación de Mono los puertos tienen ciertas limitaciones. En particular, es importante considerar que no hay eventos para recepción de datos. Entonces, para recibir los datos, usamos un Timer: [code language="csharp"]#if __MonoCS__ receiveSerialData = new Timer(manualReceiveSerialData, null, 1000, 100); #endif[/code] Es menos elegante, pero no hay otra opción dadas las limitantes del SerialPort. La función manualReceiveSerialData es una llamada a las dos funciones que antes eran llamadas por los eventos del puerto: [code language="csharp"]private static void manualReceiveSerialData (object state) { sensors_DataReceived(sensors, null); gps_DataReceived(gps, null); }[/code] Con estas modificaciones, los sensores, el GPS y la descarga de imágenes desde las cámaras funcionan totalmente sin inconvenientes: Al final un último pequeño cambio, en Visual Studio es usual utilizar: [code language="csharp"]Application.Run();[/code] Para mantener activa la aplicación en espera por eventos, evitando el uso de Application simplemente usamos: [code language="csharp"]do {} while (true);[/code]
Conclusiones
De forma muy sencilla logramos probar cómodamente probar la aplicación en Visual Studio y luego pasarla a una placa de extremo bajo costo manteniendo la funcionalidad casi completa requiriendo solo pequeños cambios. En conclusión, la experiencia con este juguete es bastante agradable, el único factor ácido del asunto es que la gran demanda de la placa hace irreal el precio de la misma, precio que la hizo famosa inicialmente. Por cierto, personalmente no puedo alegar en este asunto pues la conseguí con envío incluido al equivalente de 43 dólares americanos gracias al cupón de FayerWayer lo que hace cualquier crítica inválida para la utilidad que entrega este aparato.
1 note · View note
erwinried · 13 years ago
Text
Una mirada diatriba al nuevo Windows 8
¿Ya estás pensado instalar (o quizás desinstalar) el nuevo Windows 8? No puedo negar que el cambio es grande. Mi sistema operativo favorito se siente distinto, es rápido y confuso, elegante pero simplista. Descubramos si 7 se convierte en el XP de los tiempos modernos Por cierto, lo de XP no se aplica directamente a mis convicciones personales. Instalé y me agradó Vista en su tiempo. Instalé y me encantó 7 posteriormente. La referencia de XP es más que nada un cliché. Partamos con el comienzo. Probé Windows 8 en su versión de vista previa hace unos meses, y a decir verdad no le tomé el peso del cambio que venía. Para mí fue como probar Mac OSX o alguna distribución Linux para tantear como iban, jugar y desecharlas. Es que ya estaba cómodo con Windows 7, era agraciado y útil. Olvidé ya mis constantes críticas, pues cada vez me costaba más encontrarlas. Ahora ya va casi dos semanas en la que mis dos equipos principales tienen Windows 8 Pro instalado; respaldé ambos discos por si me arrepentía, y ya he borrado el respaldo.
Introducción
Esto sonará como un diario de vida, pero extraño el menú inicio. Lo sobre utilizaba constantemente, la combinación con el buscador te permitía hacer todo, ya no era un lanzador de aplicaciones; era un pequeño explorador de cosas. Ahora tenemos un Windows Phone gigante desde el primer momento en que iniciamos el equipo. Y no es que me desagrade mi teléfono, pero ¡por el monstruo de espagueti!, esta máquina no la llevo una o dos veces al día por diez minutos al evacuar para jugar algo ligero, es la máquina que uso todo el día. No obstante, Microsoft no es un infante malcriado, no nos impondría cosas sin haberlas probado millones de veces en simios entrenados, logrando algo que a la mayoría de sujetos le agradará y los hiciera más productivos finalmente. Hay una constante crítica sobre “cómo apagar Windows 8” o lo oculto que está esta opción. Realmente no entiendo el motivo. El botón físico de apagado del equipo hiberna o suspende la máquina (recordemos que ya no estamos sobre Windows 98 y podemos confiar en que nuestra máquina funcionará perfectamente semanas sin reiniciadas diarias).
Impresiones iniciales
Como dije anteriormente, se extraña el menú inicio... por algunos minutos. Aparte de reemplazar sus funciones, la pantalla de inicio añade funciones como buscar en aplicaciones (imagina lo que buscas es un mapa, canción o video) que exponen estas funciones. Hay ciertas formas de uso que deben alterarse, ya el concepto inicio es más que nada (o realmente vuelve a ser) un lanzador de aplicaciones.
Aplicaciones modernas
He escuchado gente que siente inútiles todos estos cambios, instala algún lanzador de aplicaciones similar al antiguo Inicio y complementos que deshabilitan la pantalla de inicio. En ese caso estoy seguro que no tiene sentido cambiarse a Windows 8. Las aplicaciones modernas son el futuro del ocio e informática liviana para Microsoft. He escuchado críticas y ‘futurologistas’ que señalan que el escritorio tradicional desaparecerá eventualmente. A mi parecer es imposible mover todas las aplicaciones a esta modalidad, quizás son mis conceptos primitivos, pero no puedo conceptualizar un entorno de desarrollo como Visual Studio en esa modalidad. Para los juegos y aplicaciones de ocio es realmente el paraíso. Para el desarrollador y para el usuario. Las librerías de programación simplifican demasiado todas las cosas (no hay casi ninguna interacción con cosas realmente de hardware de la máquina), provee mecanismos limpios y unificado para vender, recibir comentarios y actualizar tu aplicación. Para el usuario, no hay registro, problemas con DLLs, archivos temporales (el almacenamiento es aislado) ni peligros directos (a menos que la plataforma misma tenga problemas de seguridad).
Conclusiones
Windows es ya un producto maduro al extremo. La instalación toma un par de minutos y (al menos en mis experiencias) no solicita ningún controlador (de hecho instala controladores ya actualizados para video por ejemplo, o los controladores de tarjetas inalámbricas). Los tiempos de inicio/apagado son ínfimos (gracias a que partes del sistema son selectivamente hibernadas incluso en el apagado tradicional) y con respecto a Windows Vista o 7 se siente muy ligero. Personalmente para un PC de escritorio no creo que Windows 8 sea gran diferencia con respecto a 7, en donde más siento su presencia es en un ultrabook que utilizo, y además en alguna Tablet que deseo adquirir (probablemente la Surface Pro) en el futuro, en donde Android e iPad no eran soluciones realmente para mí.
Bonus track: Errores y detalles en Windows 8
No podía faltar esta sección. No sería mi artículo sin presentar esos pequeños detalles que han pasado al localizar Windows, herencias milenarias, inconsistencias en el nuevo sistema operativo:
Elementos en orden alfabético... en inglés
¡El orden de los elementos en algunos menús no tiene sentido!, si traduces los elementos te darás cuenta que tienen las posiciones originales que tienen en la versión en inglés.
Celebremos las ya casi 2 décadas de estos Tooltips
Esos tooltips amarillos ya ni siquiera existen en las aplicaciones y siguen apareciendo. Cuando envié este error para el beta de Windows 7 me dijeron que era "by design" ...lo más probable es que Bill Gates estableció alguna ley cuando fundó la compañía con respecto a esas reliquias. Por cierto, se pueden quitar por medio del registro.
¿Cómo estás? Aceptar
Lamentablemente en muchas cosas dependemos de los traductores. El sistema puede ser perfecto, pero estos detalles degradan la experiencia por completo.
Me tarzán, tú ventanas
¿Qué primate traduce las nuevas opciones? aparte de confundir, ¡suenan mal! "Casillas de elemento" (porqué no aprovechan de usar términos amistosos como "Usar casillas para seleccionar"), "Vista de resumen", "Información de PC", "Fácil acceso", suenan mal y son traducciones demasiado literales.
Traducción a ciegas
Es importante revisar los elementos traducidos en cualquier aplicación. En este caso no es que el texto sea incorrecto, pero su longitud era excesiva. Por cierto, a veces es muy difícil ajustar textos desde el inglés por lo que estos problemas son más aceptables.
Comentarios sobre usabilidad
En la primera imagen, al seleccionar elementos que no tienen "Propiedades" en ciertas ocasiones la combinación con otros activa el botón Propiedades (pero no hace nada). En la segunda está el nuevo panel de detalles, esto es algo ya de opinión, pero me parece que cuando era horizontal era mucho más útil. Ahora no hay ni barra de estado para ver cuantos hemos seleccionado y es una molestia tener ese panel de detalles activo. Y finalmente no entiendo porqué ese checkbox al final simplemente no desaparece cuando no se puede usar.
Un pequeño detalle gráfico
Este es un detalle pequeño en el navegador de Windows. El botón atrás se corta levemente en la parte superior cuando hay páginas que están produciendo algún problema (imagino que les faltó refrescar ese gráfico en algunos redibujados).
Bonus track 2: Errores y detalles en Office 2013
De la mano con el nuevo Windows, tenemos nuevo Office y desgraciadamente más detalles (esto no es una revisión muy profunda):
Más recursos milenarios
Hay recursos tan vetustos que realmente destacan. Incluso ya teniendo recursos modernos para reemplazarlos.
Otro problema viejo: Bloq Mayús
Uno de ellos es Bloq Despl, el que curiosamente es útil en Excel, lo que hace más notorio el problema.
Office no se salva de la mala localización
El primero es un error desde hace años, "Convertir texto a" (convertir a texto). El segundo es uno nuevo, "El texto contiene" (contiene texto).
Pequeños detalles extras
Office establece mayúsculas para los elementos del menú de sus aplicaciones, sin embargo parecen haber olvidado algunos elementos.
1 note · View note
erwinried · 14 years ago
Text
Salvándote de tu teléfono: Windows Phone 7
Cuando ya supuestamente falta menos de un mes para que Windows Phone llegue a Chile, no está de más compartir mis meses utilizando este nuevo sistema operativo móvil que supuestamente llegó para salvarnos de nuestros teléfonos. Un poco de programación, un poco de 'hacking' y un poco de información. Al menos a mí me salvó de Windows Mobile 6.5 Tiene momentum. El numeral 7 le da cierto misticismo últimamente a los productos de Microsoft. Windows 7 es una delicia y ciertamente cuando casi para navidad recibí mi Samsung Focus con Windows Phone 7, volví a tener esa sensación, ese ¡Wow!. El sistema es fantástico. Por un momento pensé hacer una comparativa con mi anterior teléfono con Windows Mobile 6.5 (el HTC Rhodium Tilt 2, o Touch Pro 2) sin embargo como no podía encontrar nada bueno en la versión 6.5 que no disfrutara más en WP7 determiné por enfocarme sólo a Windows Phone.  
El hardware
En diciembre del año pasado, luego de mucho pensarlo, decidí pedir el modelo de la serie de Windows Phone que sacaba mejores calificaciones en términos generales. Es decir, el Samsung Focus. Digo mucho pensarlo porque tenía en la mente que la ausencia de un teclado físico le quitaba utilidad al aparato. Pero el modelo de LG, HTC y Dell sacrificaban mucho estilo por el teclado físico y dado de que el sistema operativo nuevo de Microsoft tiene una orientación completa a consumidores y no a negocios como Windows Mobile (un ejemplo de esto es la no existencia de soporte de motores de base de datos portables), terminé eligiendo el modelo anteriormente comentado. He recibido alegatos de que mis artículos suelen ser muy extensos para leer, por lo que sintetizaré mi experiencia en videos. Primero con el hardware. http://www.youtube.com/watch?v=12icc5IIrIE A diferencia de Android y Windows Mobile, todos los teléfonos con Windows Phone tendrán un hardware similar. La existencia de mejores cámaras, teclado físico y formas del conector para recargar el teléfono es casi lo único que pueden usar los fabricantes para diferenciarse, pues Microsoft impuso severas reglas para esta primera generación. Dentro de cosas negativas, puedo señalar que la tapa del micro USB parece innecesaria y débil, preferiría que los 3 botones en la zona inferior de la pantalla fueran botones propiamente tal en vez de zonas táctiles capacitivas y que el botón de apagado y la sensación de debilidad que te transmite que la tapa posterior de las baterías sea montada sólo a presión.  
El software
La experiencia con WP es bastante diferente en general. No se aprecia claramente el concepto de aplicación dentro de los hubs separados por contexto y contenido. http://www.youtube.com/watch?v=sR8eZCm_heA En la versión actual, el rendimiento es bastante bueno en todas las zonas del teléfono. Incluso al salir rápidamente de juegos o videos el sistema parece manejar bien cargas. Un único punto negro en cuanto a rendimiento, es sobre el Marketplace y la instalación de aplicaciones. De todas las funciones que trae el teléfono actual, la más problemática es el rendimiento del Marketplace. La lista de aplicaciones no se desplaza de forma natural, las descargas tienden a fallar si suspendes el equipo y en algunas ocasiones debes reiniciar el teléfono porque el programa del Marketplace quedó aproblemado realizando instalaciones y descargas por lo que no vuelve a abrirse normalmente. Cuando estás instalando programas se nota una ralentización general del teléfono y los íconos se actualizan erráticamente por unos segundos. Otras aplicaciones (de terceros) interesantes que encontré durante estos meses de uso en el siguiente video: http://www.youtube.com/watch?v=IuEgeKtCAuE  
Juegos y entretención
El factor videojuegos es tan importante en estos dispositivos que uno de los pilares publicitarios del teléfono es su incorporación en servicios de Xbox Live. Aunque los juegos en el teléfono suelen aburrirme rápidamente, puedo mostrarles rápidamente juegos que en el transcurso de estos meses encontré muy interesantes: http://www.youtube.com/watch?v=DimuKIM-BGM El potencial que ofrece XNA como plataforma de desarrollo es un punto crucial para que las primeras generaciones de videojuegos que vemos actualmente en la plataforma funciones tan bien.  
Jugando con el Marketplace
En países en donde no exista la tienda de forma oficial, nos será imposible ingresar a la misma para instalar cosas. Personificando a un cliente cualquiera es posible descubrir las cadenas de consulta del Marketplace sobre la red, así mismo podemos acceder a las aplicaciones sin tener un cliente registrado. Las cadenas que usaba mi teléfono son las siguientes: La primera y más importante es la forma de búsqueda. Entre corchetes deben añadirse datos como por ejemplo {0} es la cadena de búsqueda (la palabra o frase a buscar), {1} es el código de locación (es-CL para Chile, en-US para EEUU y así) y finalmente {2} es el código de la tienda (hay tiendas personalizadas para los fabricantes). Respecto al código de la tienda, aunque mi teléfono es Samsung esta consulta se realiza de forma genérica en la llamada Zune Store representada por "zest" en ese código {2}. La de Samsung se llama Samsung Zone y es sólo usada cuando se accede a un menú especial en donde hay un par de aplicaciones exclusivas para los teléfonos de una marca determinada. Finalmente, el orden de los resultados es determinado por {3}. Por defecto se utiliza "downloadRank" que es la popularidad de descargas. En la lista de resultados que nos entrega la consulta anterior, tenemos elementos que describen cada resultado de forma detallada, en cuanto a precio, ranking y categorías. Para averiguar más detalles sobre cada aplicación debemos usar la segunda consulta expuesta. El reemplazo {0} en este cado es el Application ID que nos entrega el catálogo en los resultados de la búsqueda. Ahora ya podemos tener la ruta al paquete de archivos y otras cosas interesantes como las capturas de pantalla, las cuales pueden ser obtenidas como archivos de imagen con la siguiente cadena: En esta última cadena, de forma similar a la de los detalles de la aplicación, {0} representa el Image ID que nos dio el catálogo en los detalles de la aplicación. Basado en estos descubrimientos creé una aplicación para acceder al Marketplace desde el PC, descargar aplicaciones de forma local e instalarlas en el dispositivo: Diseñe el programa pensando en la simplicidad y luego de varias revisiones puedo asegurar de que está en un punto extremadamente estable. Su instalación y uso es sencillo como se aprecia a continuación: Como se aprecia en el video, también añadí un pequeño motor de descargas, el cual le evita a la aplicación principal encargarse de esta tarea y también un programa que instala las aplicaciones en el emulador o el dispositivo basado inicialmente en el trabajo de Justin Angel, publicado en su web: http://justinangel.net/WindowsPhone7EmulatorAutomation. Descargar directamente el instalador: http://ried.cl/mobile/files/wp7desktopmarketplace-last/setup.exe Más información: http://ried.cl/mobile/wp7desktopmarketplace.html Foro para problemas y sugerencias (en inglés): http://forum.xda-developers.com/showthread.php?t=908293  
Conclusiones
Como nuevo inicio, la apuesta es perfecta. Aunque faltan muchas funciones, casi la totalidad de las actuales funcionan impecablemente. El modelo de restricciones a los fabricantes, el entorno de desarrollo y el pronóstico de actualizaciones del dispositivo auguran un buen desempeño general de la plataforma y aunque la primera actualización de "enero" haya sido postergada para marzo del 2011, aún no se pierde esa sensación de que están trabajando bien. De forma personal, el Samsung Focus en particular es excelente y aunque no tengo claro si llegará a Chile en una primera instancia es más que una opción recomendable. Lamentablemente estamos en el 2011 y la propuesta de MS llega bastante tarde... aunque Microsoft tiene historia de ser el último en llegar al juego y salir primero, es algo que el tiempo debe decidir, otra vez más.
0 notes
erwinried · 15 years ago
Text
Servicios, servicios y más servicios
Hay ciertas compañías que nunca se cansan con sus prácticas primitivas: pedir reiniciar el equipo, alterar la configuración del usuario y por sobre todo llenar tu equipo de inútiles servicios en segundo plano, sí, es una indirecta para ti, VMWare. En este artículo veremos como subsanar un poco el desperdicio de recursos que producen servicios de aplicaciones como VMWare Workstation o Player, aunque es aplicable en cualquier otra Hace mucho tiempo, solucioné otro problema que también se originó con los chicos de VMWare. El problema anterior era sobre la incansable consulta de registros (problema que claramente siguen dejando activo en sus nuevos productos). Muchos productores de software se han dado cuenta de la importancia de alivianar sus soluciones. Inclusive Microsoft muestra esta tendencia con Windows 7, haciendo cosas tan simples como por ejemplo si no tenemos bluetooth, el servicio relacionado simplemente no es cargado, si no conectamos un teléfono Windows Phone nunca aparece precargado el centro de sincronización para dispositivos móviles, entre otras.
El problema
"Ufff, Windows, cada día más lento. ¿Por qué no pueden hacer algo que funcione bien como <xyz>?" La pregunta de arriba suele derivar en un posible formateo del sistema completo, algo que por experiencia personal es totalmente innecesario y una pérdida de tiempo. Usar la cabeza, un poco de intuición e investigar es lo único que necesitan. Colocamos y removemos tantas aplicaciones que perderíamos fácilmente la cuenta, agravando el problema con el actual modelo de instalaciones de Windows, el cual es demasiado permisivo. Por ahora, en el presente artículo quiero enfocarme solamente en el problema con ciertos programas que se toman la libertad de instalar servicios para su beneficio, los cuales atentan contra nuestros recursos libres, tiempos de inicio de la máquina y estabilidad general. Es cosa de ejecutar "services.msc" (o Administrar equipo / Servicios) para encontrar una lista de servicios de terceros, que están siendo automáticamente puestos en marcha por el sistema operativo. Aunque hay muchas empresas que publican productos que dejan servicios "inútiles", para mí la más emblemática es VMWare, los cuales parecen ser extremadamente testarudos a recibir opiniones y hacer mejoras.
Una sencilla solución
Cuando busqué por posibles soluciones, encontré una muy simple pero efectiva llamada VMware Launcher. Se trata de un código en VBS que lanza los servicios en demanda y también los finaliza. Esta solución tiene algunas falencias. La más importante, la única que me hizo buscar otra solución, es que necesita que alteremos los permisos de los servicios para poder lanzarlos. Aparte de ser un problema ante cada actualización de VMWare, se pierde funcionalidad, por ejemplo con dispositivos USB, pues los servicios hacen operaciones que requieren privilegios de administrador.
Una mejor solución, mucho más general
Entonces, que pasaría si tenemos una nueva solución, configurable, que permita seleccionar lo que queremos hacer con cada servicio de forma rápida y además que no nos solicite alterar cosas. Pasaría que tendríamos una mejor solución, probablemente la mejor posible dado el escenario provisto por ciertos fabricantes. Además al ser más general, no sólo podría aplicarse a productos de VMWare, sino a cualquier producto que se nos ocurra.
Desarrollo
Para el desarrollo de la solución se usará Visual Studio Express C# 2010. Es importante tener conceptos previos sobre uso de las "Settings" en C# pues el panel de opciones trabajará exclusivamente con esta característica. El objeto principal utilizado será uno denominado RelatedService. Este objeto será la representación de un servicio real del equipo, el cual tiene sólo una particularidad, un modo de inicio personalizado adicional al del equipo: Existen tres modos personalizados, StartStop (inicia y finaliza en demanda el servicio), StartOnly (sólo lo inicia y lo deja activo), Unknown (existe un error en el servicio y no se puede determinar el modo). Los inicios denominados con el prefijo System (como SystemAutomatic) representan un modo de inicio de sistema. Uno de los que puede ser configurado en las opciones del sistema operativo. El flujo principal de la solución una vez configurada es el siguiente: Los pasos del flujo son detallados a continuación:
Búsqueda inicial de servicios (BackgrounderWorker)
Inicio de la aplicación
Vea el siguiente punto de este artículo.
Esperar final de la aplicación (Sistema operativo)
Como aparece en el punto 5 de este artículo, sea cual sea la forma en que se lance la aplicación, se utiliza WaitForExit para esperar su finalización. A diferencia de otros métodos, WaitForExit le pide al sistema operativo que le avise cuando un proceso sea finalizado, consumiendo absolutamente cero tiempo de CPU mientras espera.
Búsqueda final de servicios (BackgrounderWorker)
La herencia entre proceso padre e hijo, los privilegios
Como necesitamos privilegios elevados para iniciar servicios (aunque los servicios usen otra cuenta de usuario) es natural que imaginemos que la aplicación que lanzaremos luego de iniciar sus servicios tendrá los mismos privilegios elevados. Como a mí no me gusta ni me parece correcto ejecutar aplicaciones con mayores privilegios de los que necesita, había que buscar una solución para "bajar" los privilegios. [quote style="boxed"]A considerar Cuando ejecutamos cualquier instalador en Windows Vista o superior, exceptuando los basados en MSI Installer los cuales solicitan elevación de requisitos en cierto instante del proceso, el sistema operativo nos muestra una ventana de UAC al abrir el instalador. Esto es una necesidad evidente, pero es importante considerar que luego de instalar el programa algunos instaladores ofrecen ejecutar inmediatamente el programa recién instalado. Ahora, la primera ejecución de ese programa se haría heredando los privilegios elevados con que cuenta el instalador algo poco considerado, pero bastante peligroso.[/quote] La solución ya había sido abordada en el siguiente sitio: http://odetocode.com/Blogs/scott/archive/2004/10/28/602.aspx Para integrarla, simplemente se realiza una bifurcación dependiendo si el usuario desea o no "bajar" los privilegios del proceso hijo el cual será lanzado:
Altamente personalizable
Un usuario final, sin modificar el código de fuente puede personalizar de gran forma esta solución. Las principales modificaciones son accesibles desde el ícono del programa mientras está en ejecución: Para lograrlo, se debe abrir el archivo de configuraciones adjunto en un editor de textos. Algunas de las configuraciones posibles se muestran y detallan a continuación: Todas las configuraciones de arriba, permiten estéticamente cambiar los textos de las etiquetas del programa. La palabra clave configurada por launcher_related_keyword permite realizar una búsqueda automática de servicios relacionados. Por ejemplo si colocamos "vmware" se listarán todos los servicios que tengan nombre para mostrar o interno coincidente con esos caracteres. Si esta configuración se deja en blanco, no aparece la opción para buscar servicios relacionados nuevamente. Las dos configuraciones de arriba permiten personalizar el archivo de la aplicación que debe ser seleccionado por el usuario, el que lanzará el programa. La configuración application_path_filename permite establecer un nombre predeterminado de ejecutable, por ejemplo "vmware.exe" (escrito en la caja de texto de "Abrir archivo"). La otra configuración establece el filtro. La nomenclatura es la típica para Windows. Por ejemplo, para obligar al usuario a elegir "vmware.exe" o "vmplayer.exe" se usaría: Las siguientes configuraciones personalizan aún más la parte gráfica de la interfaz de opciones y el icono al lado del reloj:
Pensado para agradar al usuario
ServiceLauncher, la solución propuesta por este artículo, está diseñado para el usuario. La interfaz tiene características sutiles como la existencia del cuadro de selección de "modo de arranque del servicio" de sistema siempre habilitado para permitir una personalización rápida. Además, la barra de progreso de inicio y finalización de servicios aparece suavemente (cuando Aero está activado) y sólo cuando el proceso tarde más de lo esperado, por ejemplo si los servicios necesitan menos de un segundo para iniciar, el usuario no visualizará una barra de progreso. Hay otras sutilezas, la existencia de un modo "asistido" de configuración, en donde sólo se pregunta por el ejecutable relacionado o la posibilidad, como se vió en el punto anterior, de bloquear funcionalidades. También realiza un traspaso de los argumentos recibidos (siendo completamente transparente).
Descarga y código fuente
El código fuente y ejecutable de la aplicación (revisar la descripción) se encuentran en el siguiente repositorio: https://github.com/eried/ServiceLauncher El ejecutable sin personalización puede ser alterado como se explica en el siguiente punto del artículo. De esta forma podemos tener una solución única para cada problema con servicios inescrupulosos. Para instalar, por ejemplo la versión personalizada para VMWare Workstation (cualquier versión), sólo copiamos el ejecutable y el archivo adjunto en el paquete a cualquier parte (de preferencia en el directorio de Workstation) y creamos un acceso directo al mismo (idealmente reemplazando el original de VMWare Workstation en el menú inicio). Lo ejecutamos con doble clic y en la primera ejecución pedirá que le digamos donde está el producto de VMWare que deseamos usar. El código fuente es para Visual Studio C# Express 2010.
Conclusiones
La solución encontrada, elimina la existencia de consumo de recursos y tiempo de arranque, es personalizable y aplicable en un alto rango de problemas. En el caso de que la aplicación (digamos VMPlayer) sea utilizada constantemente por el usuario, no tiene sentido utilizar la solución provista por este artículo. El tiempo perdido (overhead) en inicializar y finalizar los servicios podría presentar inconvenientes mayores que tenerlos constantemente cargados, usando memoria y tiempo de CPU. Así, no sería recomendable usar esta solución sobre software que sea iniciado y finalizado con el equipo (como por ejemplo IIS, SQL Server, Apache).
0 notes
erwinried · 16 years ago
Text
El problema de la lentitud en la presencia de Bluetooth
Existe una librería utilizada por muchos proyectos llamada RXTX JAVA Communication API, la cual es una alternativa al vetusto Javacomm. Utilizando uno de esos proyectos noté que muchas operaciones se ralentizaban cuando tenía conectado mi adaptador Bluetooth o tenía activo el integrado del equipo. ¿cuál será el misterio? A veces, cuando se presenta un problema, la solución parte por descubrir las condiciones que gatillan el mismo. Muchas veces debemos conformarnos en convivir con estas pequeñas molestias sólo por el hecho de no poder describir cuándo y por qué pasan. [quote style="boxed"]Nota El programa en el que basaré este documento es el editor de lenguaje wiring para las placas programables arduino. El mismo está disponible, su código fuente y binarios para Mac, Windows y Linux en http://www.arduino.cc. [/quote]  
Introducción
La identificación del problema se basó en dos condiciones base, replicables del problema. Misteriosamente había ocasiones en que el entorno de desarrollo afectado se demoraba más de diez segundos en aparecer, algo inusual incluso considerando que se trata de una aplicación desarrollada en Java. Como suelo programar en sólo una placa de desarrollo a la vez (desde ahora Arduino), mientras se realizan cambios y "uploads" de código al Arduino mismo aparentemente todo funciona bien. Sin embargo una de las condiciones cuando se cambia a otro Arduino es modificar el puerto de conexión el cual está en la opción "Tools" del entorno mismo: Esta operación era lentísima, casi al nivel de iniciar el entorno nuevamente. El problema era en sí gatillado por el acceso al menú y no la selección del puerto por lo que rápidamente asocié el problema al código de despliegue de ese menú.  
Inspección
Ya con suficientes pistas para investigar, primero indagué dentro del código del entorno. Generalmente prefiero revisar los archivos binarios que presentan el problema, aunque no sea la forma más directa. Partimos entonces inspeccionando el programa de Arduino, aunque ya sabemos que está escrito en Java para en cierta parte permitir un funcionamiento en múltiples plataformas, no hay nada malo en comprobarlo rápidamente con el Administrador de tareas:  
Disección de los archivos JAR
Como ya identificamos la relación del entorno arduino con java, naturalmente debemos encontrar el archivo JAR que contenga la posible falla. Buscando en las relaciones directo desde Process Monitor tenemos: Ahora con DJ Java Decompiler buscamos el archivo principal del IDE, y aunque no lo crean se me ocurre acertadamente que es uno de los que pese más dentro de los usados por la aplicación: Descompilamos y buscamos la sección referente al menú que se paraliza. En efecto les daré una versión resumida del cuento, primero el inicio del menú "Tools": [quote style="boxed"]Atención La sintaxis entregada por el descompilador puede ser extraña, incorrecta e ilegible. Generalmente es útil sólo para procesos de investigación o por ejemplo para tener un mejor referente cuando la edición debe ser realizada directamente sobre el bytecode.[/quote] Más abajo siguen muchas otras opciones del menú, ninguna de ellas representa riesgo como para paralizar el programa. Sin embargo en la lista de puertos "com" hay algo sospechoso: Y más abajo, el único procedimiento sospechoso:  
El origen del problema
La primera duda aparece ahora sobre el código Java. En una instancia anterior me encontré con que un error del entorno (en particular al hacer uso de la opción "Copy to forum") era un simple error de una comprobación: En donde se puede ver que la asignación debe hacerse luego de la comprobación para no producir los clásicos errores del tipo ArrayIndexOutOfBoundsException: (Más información sobre este bug ya corregido en el foro de la comunidad Arduino) Esta duda me hace revisar detenidamente el código del procedimiento que obtiene la lista de puertos "com" disponibles.  
El primer intento de solución
Como en la obtención de puertos yace el problema de lentitud, y sin siquiera tener ninguna placa arduino conectada al equipo, los únicos posibles culpables son los puertos virtuales añadidos por mi adaptador bluetooth y los físicos del equipo. Se pueden imaginar qué pasaría si deshabilito el adaptador bluetooth gracias al siguiente video: Bien, ya tenemos un primer workaround. Es rústico, pero deshabilitar programáticamente el adaptador bluetooth nos permitiría tener un entorno ágil. En el video utilizo devcon, pero en un principio se conseguiría el mismo efecto si utilizáramos el administrador de dispositivos del sistema (devmgmt.msc). [quote style="boxed"]Acerca de devcon Esta utilidad permite administrar remota y localmente los dispositivos de hardware de un equipo. Es de Microsoft y está disponible como complemento aquí.[/quote] Todo esto del primer intento de solución nos lleva a revisar nuevamente el código Java... ¿De dónde viene CommPortIdentifier? ¿Cómo obtiene esos identificadores? ¿Por qué el sencillo hecho de obtener el nombre de los puertos virtuales del bluetooth demora tanto tiempo?  
La verdadera solución
CommPortIdentifier viene directo desde el comienzo del archivo fuente del editor: ¿Y de donde viene el espacio de nombres "gnu"?, pues claro, de una librería. ¿Apostarían cual? Ahora, adivinan, seguimos escarbando. No entiendo el porqué, pero siempre me da un gusto particular investigar estas aplicaciones por vías alternativas. Lo curioso es que en este caso tenemos todo el código fuente disponible, pero montar el escenario de desarrollo para depurar ese código es sin duda mucho más esfuerzo que indagar rápidamente gracias a estas hermosas herramientas que siempre están en mi "maletín" de soluciones. Dentro de CommPortIdentifier.class finalmente empezamos a llegar a una vía de escape de Java. La misma comienza precisamente aquí: RXTXCommDriver inicia nuestra nueva aventura. Una aventura llena de nuevos misterios, alejados de la protectora máquina virtual de Java, libres, llenos de posibilidades de generar excepciones no manejadas, bienvenidos al universo de C. La librería que comienza su nombre por RXTX implementa una interfaz común de comunicación por puerto serie para diversas plataformas, Linux, Windows, Mac e incluso algunas más minoritarias como FreeBSD. Cada implementación de las funciones tiene su código para cada plataforma y esto hace ver la necesidad de romper la universalidad de un código intermedio, en cuanto nos vamos acercando al mundo físico. Anteriormente rechacé la existencia del código de fuente del programa en Java. En este caso, los fuentes de C de la librería (http://users.frii.com/jarvi/rxtx/) de comunicación serial valen oro. El problema ahora sigue en el archivo SerialImp.c: En el fragmento de código dedicado a la plataforma Windows podemos apreciar que cíclicamente llamamos a "ret = serial_test((char *) full_windows_name );" y "ret = serial_test((char *) name );" con el fin de comprobar si cada puerto puede ser abierto. En Windows, aunque no lo parezca, cada puerto y dispositivo es también un archivo, y aunque la interfaz de usuario lo mantiene como un completo secreto aplicando capas sobre esta abstracción, generalmente a bajo nivel seguimos utilizando los recursos como ficheros sin el alcance de "dispositivo de una clase en particular" del que estamos acostumbrados. Esto significa que dentro de la ruta //./ estamos haciendo referencia al ordenador local, sobre un recurso en particular (todo esto relacionado a UNC, Universal Name Convention, utilizado como notación de rutas en Windows). Así //./COM5 será, dentro de nuestro equipo, el archivo COM5, es decir la representación del puerto de comunicaciones cinco. Toda esta breve reseña era para explicarles un poco los detalles de la lógica del funcionamiento de "serial_test": ¿Sencilla o no?, si logro abrir filename, entonces devuelvo un uno, si tengo un error devuelvo un cero. Ahora... ¿Cuál es el problema en esta lógica?, aparentemente no existe problema pues si un puerto es un archivo, si logro abrirlo entonces ese puerto existe y como desconozco que puertos existen debo recorrerlos encuestando puerto por puerto. El problema primero radica en términos de comportamientos sincrónicos y asincrónicos (http://msdn.microsoft.com/en-us/library/aa365683(VS.85).aspx), necesito lograr que abrir el puerto no bloqueé las siguientes operaciones. Sin embargo esto no es tan sencillo, el sólo hecho de manejar esas respuestas (por ejemplo los errores) asincrónicamente cambia nuestro esquema. ¿Qué pasa entonces con los puertos virtuales? Windows intenta abrirlos y como son puertos virtuales, entonces el controlador del adaptador bluetooth intenta comunicarse con el dispositivo físico al que se asignó el puerto, por ejemplo un teléfono celular. Como demoran un tiempo en responder, y si demoran mucho se considera que no responden, el sólo efecto de abrir estos puertos virtuales supone una demora.  
La solución real está casi materializada
Mi primera prueba entonces es comentar la línea de lectura en "serial_test". El resultado es que fácilmente puedo lograr que todos los puertos posibles e incluso los inexistentes aparezcan o simplemente que ninguno aparezca como parte de las opciones en el entorno de Arduino. Esto ya es un buen comienzo. Gracias a un código de ejemplo (http://www.codeproject.com/KB/system/enumports.aspx) descubrí que existía otra forma de comprobar los puertos. Esto ya es una mejor continuación. Windows NT permitía ya desde tiempos memorables obtener todos los puertos disponibles sin tener que intentar abrir ninguno en particular. El truco está en la utilización de la función QueryDosDevice. Así nuestra remozada función queda: Es curioso que aunque esta solución funciona a la perfección, por motivos de compatibilidad ve disminuída su posible velocidad máxima. Esto es, si dan un vistazo al código anterior, apreciable con claridad en la sentencia en donde se utiliza [i]QueryDosDevice. La función serial_test pregunta una vez para cada puerto, sin embargo QueryDosDevice tiene la lista de todos los puertos disponibles al instante, sin la necesidad de recorrer puerto por puerto. Aunque por el momento dejo abierto el desafío para algún ávido lector, pues para mí, pasar de unos notorios treinta segundos de espera por operación a unos inmensurables microsegundos ya es suficiente.  
Descarga
La librería resultante sirve para solucionar este problema en cualquier aplicación que use de RXTX. En nuestro caso actual, solo basta con reemplazar el archivo rxtxserial.dll del directorio de Arduino para obtener la mejora: files/articles/arduino_bluetooth_001/rxtxSerial-2.2_fixed_2009-08-04.rar  
Conclusiones
A veces, la equivalencia entre poder modificar y reparar algo versus la existencia de código fuente del mismo no es tan crucial como pueda imaginarse. La astucia y lógica son grandes armas que nos permiten superar muchas barreras. En el caso del documento actual, me sentí abrumado por instantes al intentar entender el trabajo ajeno, muchos estilos diferentes de programación ponen sabor adicional al trabajo de intentar reparar detalles tan ínfimos como el actual.
0 notes
erwinried · 16 years ago
Text
La experiencia de un escritorio a todos lados con el HDX18
Probablemente nunca haya usado un portátil tan poderoso. Si lo que buscas es un poderío desmedido sin estar atado a un escritorio, necesitas comprar este aparato. En este documento revisaré todos sus detalles, en particular enfocándome en la experiencia de un usuario avanzado sobre este aparato [quote style="boxed"]Contenidos 1. Desempaque, especificaciones y accesorios 2. Primera impresión 3. Detalles del hardware 4. Rendimiento 5. Revisión en video 6. Conclusiones[/quote]
Desempaque, especificaciones y accesorios
(Arriba) Primero que todo debo reconocerme sorprendido por este "portátil". Partiendo por una "Bienvenida" el comienzo de la experiencia es bastante bueno. Todo muy ordenado y empacado cuidadosamente, sin exagerar en los tamaños ni protecciones. Aunque el aire del empaque no es ciertamente como en un producto de Apple, es bastante cercano. El aparato que tengo en mis manos tiene las siguientes características: [quote style="boxed"]HDX18 x18-1099ux Intel Core 2 Duo 2.26 GHz Pantalla de 18.4" (1080p) Dos discos duros de 250GB 4GB RAM Blu-ray ROM con grabador SuperMulti DVD doble capa Windows Vista Ultimate (64-bits)[/quote]
Primera impresión
(Arriba)
Parte física
El aparato es grotesco. Es bastante pesado y poco transportable. En principio es la experiencia de un escritorio que se puede transportar, no algo portátil. Incluso para encontrar una maleta tendrás problemas.
Software
En esta sección no tengo mucho que decir aparte de lo que probablemente conozcas. Los portátiles vienen llenos de aplicaciones y muchas de ellas inútiles, tradicionalmente prefiero formatear mis equipos por lo que detallar el software es algo intrascendente. Aparte de eso, viene con Windows Vista Ultimate versión de 64 bits y algunos programas entretenidos para la webcam y otros.
Detalles del hardware
(Arriba) No hay mucho que decir sobre el hardware. Este equipo es de los mejores de la línea de HP y es de esperable un equipamiento de primera clase.
Generalidades
Algo que me sorprendió es la existencia de un subwoofer en la parte inferior del laptop. Otra cosa interesante es su conector para una antena de televisión (con adaptadores incluidos): Entre otros aspectos, tenemos un aspecto menos importante para el usuario final tradicional, pero bastante destacable para los usuarios avanzados que es el acceso a todas las partes reemplazables desde la parte posterior: Los módulos de memoria ram, tarjeta wireless/bluetooth, ambos discos duros, tarjeta de televisión e incluso la batería de respaldo de configuración del CMOS/BIOS no están a mayor distancia que uno o dos tornillos de ser reemplazados. Esto es muy importante, en particular para mi experiencia personal intentando ampliar la memoria de mi netbook Acer Aspire One (que como podrán ver en el video que grabé, es innecesariamente complejo): http://www.youtube.com/watch?v=Z1MBuizr_s4
Terminaciones
Hay algunos pequeños detalles en la producción opacan las perfectas características, el más claro fue la unión metálica de los costados:
Rendimiento
(Arriba)
Windows Vista
Realmente asombroso. El primer computador portátil que veo que obtiene una calificación más de cinco en la evaluación del índice de experiencia de Windows, casi parece que hubiéramos utilizado mi aplicación del artículo para modificar este valor:
Encendido y apagado
Los tiempos de encendido y apagado del equipo con su configuración original pueden ser apreciados con detención y de forma exacta en el video sobre la revisión del equipo disponible más abajo.
Hibernación y suspensión
Al igual que los tiempos de encendido y apagado del equipo, el proceso de hibernado y suspensión con su configuración original pueden ser apreciados con detención y de forma exacta en el video sobre la revisión del equipo disponible más abajo. La hibernación y la suspensión son procesos extremadamente importantes hoy en día para un equipo portátil. Yo por años con mi antiguo equipo Compaq disfruté de la hibernación en XP, con 1 GB de ram este proceso es bastante veloz, sin embargo con el pasar del tiempo con computadores con más memoria, mi costumbre tradicional empieza a sufrir. [quote style="boxed"]Importante La hibernación necesariamente deberá copiar toda la memoria ram al archivo hiberfil.sys del disco principal. Seleccionar los bloques de memoria utilizados efectivamente probablemente añadiría demoras adicionales al proceso o incluso aplicar compresiones al mismo. Es por eso que en un equipo con bastante memoria RAM, digamos 4 GB, estamos hablando de varios minutos de un proceso de apagado al hibernar y de 4 GB menos de disco constante.[/quote] En este caso se hace más evidente la necesidad del tipo de suspensión híbrida o algun mecanismo de hibernación a memoria flash. Sin tener posibilidades de esto, una regla recomendable sería suspender el equipo bajo situaciones normales e hibernarlo en caso de algún evento mayor.
Batería
A pesar de que la batería incluida en el paquete era de 8 celdas de alta capacidad, el portable no llega a durar dos horas y media. En realidad su tiempo oscila entre las dos horas y dos horas quince minutos en mis pruebas con un uso normal (sin utilizar las opciones de ahorro de energía de Windows). Es extraño que una batería así llegue a consumirse tan rápido, pero la verdad es que al ver el adaptador de poder del aparato es fácil augurar la razón: Es tremendo. Casi podríamos usarlo como utilería para una nueva película de los cazafantasmas, atrapando a los espectros con él. No es deliberadamente gigante, sino que con un consumo de 120W, la necesidad de disipar el calor es un factor de peso.
Revisión en video
(Arriba) La revisión en video no estará disponible hasta un futuro próximo. (Intento preparar todas las revisiones de los productos en conjunto para hacerlas más "estándar") ¿Diseñador? ¿Compositor? Busco ayuda :-)
Conclusiones
(Arriba) En general, me agradan los productos de HP, sin embargo este en particular más que agradarme, me ha impresionado. Si en un futuro necesito tener una estación de trabajo portable creo que sin duda esta es la mejor elección, naturalmente como un portátil de uso diario puede ser algo agotador, su tamaño y su peso sólo lo hacen transportable pero no realmente "portátil".
0 notes
erwinried · 16 years ago
Text
Implementando el control de cuentas de usuario de Vista
Muchas personas odian el control de cuentas de usuario, ¿porqué mi computador debe preguntarme si estoy seguro?. Windows debe paulatinamente implementar la diferenciación del usuario normal sobre el usuario administrador y si deseas aprender una forma fácil de Vista[i]lizar[/i] tus aplicaciones, te invito a leer este documento y comenzar a ser parte de la solución y no del problema [quote style="boxed"]Importante El código de este artículo es C#. El entorno original utilizado para su desarrollo es la versión Express de C# 2008, disponible gratuitamente para su descarga en la página de Microsoft.[/quote] Todos tenemos claro que Windows arrastra años de malas prácticas, en efecto la crítica más conocida por los usuarios más avanzados es que no existe una diferenciación entre los usuarios y los administradores. Esta situación permite que cualquier usuario con poca experiencia o sólo por un pequeño descuido termine instalando algún tipo de malware, spyware o una de esas tonteras. Para un usuario de Unix y en consecuencia de Mac y Linux, sería una gran irresponsabilidad trabajar utilizando la cuenta de "root", sin embargo para la mayoría de usuarios de Windows esto es una práctica diaria. Si consideramos que incluso los antiguos entornos de desarrollo de aplicaciones para Windows, incluyendo los productos de Microsoft necesitaban funcionar con privilegios del grupo administrador, entonces podemos comenzar a presagiar el origen de todo el problema. [quote style="boxed"]Pero la verdad es que no vengo a hablar del problema, ni de lo equivocado que estábamos. Con dificultad y rechazo Vista ha intentado imponer un nuevo esquema de seguridad, limpio, y nuestra tarea es (cuando lo necesitemos) otorgar la mejor experiencia de usuario siempre, desde el punto de vista de desarrolladores de aplicaciones. Así mi idea es demostrar de una forma sencilla y que no supone un gran esfuerzo, como integrar nuestras aplicaciones al mundo de Windows Vista de una forma transparente.[/quote]  
¿Cómo trabaja el control de cuentas de usuario, o UAC?
En su forma más sencilla, el control de cuentas de usuario tiene un flujo que va desde un usuario con permisos limitados, en donde el usuario especial SYSTEM muestra una alerta "protegida" en otro escritorio. Cuando la alerta es satisfactoria, se acciona la tarea "administrativa" en la que ahora el propietario es el usuario con privilegios de administrador. De manera predeterminada, el mismo escritorio que mostré en el documento sobre El problema del compositor y el escritorio seguro es utilizado como transición "segura" pues ninguna otra aplicación puede interactuar directamente con aquel escritorio (a menos de pertenecer a SYSTEM), se captura la pantalla actual y se oscurece para usarla de fondo de las advertencias de UAC, así la transición es menos perceptible. Nuestra tarea es tan simple como crear esa transición entre la aplicación sin privilegios y las “acciones” administrativas. La forma más sucia de lograr esto, sin realmente hacer nada, es requerir privilegios administrativos siempre, tal como lo hacen algunas aplicaciones (la última que recuerdo es Corel VideoStudio X2, la actualización de Ulead VideoStudio 11, que curiosamente no requería estos privilegios). Para conseguir esta "solución" sucia, podemos adjuntar un manifiesto (un manifiesto es un documento XML adjunto e incrustado a un archivo ejecutable que puede definir ciertas características del mismo) que defina este requisito a la aplicación, de la siguiente forma: De parte del usuario, es posible definir este requisito como parte de propiedades de compatibilidad de la aplicación, para lograr el mismo efecto: Nuestro objetivo será generar una solución mejor que esta.  
El paciente
Si no consideraste la presencia del control de cuentas de usuario, o incluso la ausencia de los permisos de administrador (como en una cuenta limitada en Windows XP) puede ser que adaptar tu aplicación cueste un poco de trabajo. Prácticas sucias como escribir archivos temporales a la raíz del disco, al registro y a otras secciones pueden dificultar aún más la tarea. Para comenzar a trabajar, la aplicación que será mi paciente para el proceso de adaptación será una aplicación personal que desarrolle hace un tiempo, aplicación que fue publicada en el artículo sobre los errores y curiosidades de Windows Vista. Esta aplicación permite cambiar la evaluación del rendimiento que realiza Windows Vista a tu equipo, casi a modo de burla de la misma evaluación. La versión preliminar de esta aplicación luce de la siguiente manera: Naturalmente, en mis comienzos con Windows Vista quite el control de cuentas de usuario, pertinaz por mis remembranzas de la filosofía existente en Windows XP, en donde como simples mortales somos constantemente dioses para el sistema. Dioses que, insólitamente, pueden cometer torpes errores. Así la aplicación para modificar la evaluación del rendimiento, necesitaba iniciarse con privilegios de administrador para funcionar correctamente, aún cuando sólo necesitaba estos privilegios al momento de guardar la evaluación.  
Leyendo la evaluación del rendimiento de Windows Vista
Los registros de rendimiento son almacenados en el directorio "\Windows\Performance\WinSAT\DataStore", del disco duro que contiene la instalación del sistema operativo. Los nombres de estos archivos tienen la particularidad de contener "Assessment" y "WinSAT.xml" pero internamente pueden contener la fecha y hora de la captura de los datos. Esta variabilidad del nombre nos lleva a crear un código que busque dinámicamente el último de estos archivos en ese directorio de sistema: Si el usuario nunca ha realizado una evaluación del rendimiento (aunque es prácticamente imposible dado que Windows realiza una como parte de la configuración inicial), o sucede cualquier otro problema, se devuelve una cadena vacía. Como el archivo es un elegante XML, basta con recorrer el árbol en búsqueda de los datos que buscamos: De esta forma ya hemos obtenido todos los índices actuales del rendimiento.  
Escribiendo la evaluación modificada del rendimiento
Escribir los nuevos valores al XML es un proceso similar al de la lectura. En efecto es casi el mismo código. La única diferencia en que en este caso "lastWinSatFile" es el último archivo recuperado por "FindLastWinSat": Y eso es todo. El desarrollo del programa llegaría hasta aquí si asumimos en que siempre será ejecutado con privilegios de administración, pero esta vez, no es la idea.  
Elevando nuestras acciones
Para elevar la acción de guardar usaré una pequeña triquiñuela. Primero intentaré guardar normalmente los datos en el XML, tal como expliqué en el punto anterior: Entonces, si logramos guardar la configuración, todo sigue naturalmente. Si no logramos nuestro objetivo, llamaremos a "RestartElevated". Esa función no es más que: Aún no llegamos al punto crucial, por el momento lo único que hemos generado es una cadena de argumentos, cadena que usaremos para llamar al nuevo proceso (el elevado). Ahora veamos como lanzamos aquel nuevo proceso: Ahora finalmente hemos creado un proceso "p", el que retiene nuestra ejecución hasta que finaliza o según demore un tiempo considerable, definido en la configuración de la aplicación. Este proceso obtiene su información de inicio desde la siguiente función (que finalmente nos revelará el secreto de la "misteriosa" elevación de privilegios): No les mentiré, aunque parezca muy sencillo... ¡lo es!, lo único que hice es colocar "runas" y establecer UseShellExecute. Veamos un poco los detalles de código. Primero, "verb". En mi documento sobre "El control total sobre el menú contextual" enseño los misterios sobre los comandos y opciones del menú contextual de Windows, cada comando para Windows es un "verb". Por ejemplo, un documento Word tiene acciones como "Nuevo", "Abrir", "Imprimir" cuando hacemos clic secundario. Estas acciones internamente son los "verbs" existentes bajo la rama "HKCR\.doc\shell", nombrados como "New", "Open", "Print" (en realidad, los comandos se encuentran bajo la rama relacionada con la extensión, sobre el tipo maestro, es decir "HKCR\Word.Document.V\shell", en donde V es la versión del tipo de archivo). Entonces, lo que establecemos como "runas" del archivo ejecutable, es que use el comando de ejecutar como administrador que los archivos ejecutables tienen predeterminado, en el menú contextual de Windows. Posteriormente tenemos UseShellExecute. Esto viene a ser un requisito de "herencia" del proceso. Al ser un proceso sin privilegios administrativos, no es correcto ni posible lanzar un nuevo proceso que tenga privilegios de administrador directamente. Así, le pedimos a Windows que sea él, el que administre la creación del nuevo proceso. Recapitulemos toda la situación: [quote style="boxed"]Si no logro guardar los datos, me llamo a mi mismo con unos argumentos que me indiquen lo que debo hacer cuando tenga el poder, para que así no olvide mis deberes e inicie normalmente.[/quote] Hay un detalle adicional. En esta ocasión, no necesito mostrar un diálogo ni un mensaje elevado, así no me importa realmente como están interactuando mis dos aplicaciones, la que realiza las acciones con privilegios de administrador y la que la llama, con privilegios limitados. ¿Qué pasaría si lo que deseamos es realmente llamar a una nueva ventana elevada?, más ejemplificado: En la imagen, para cambiar la hora se llama a un diálogo elevado. Este nuevo diálogo tiene permisos administrativos pero funciona como un formulario modal para el primero. Esto se puede lograr fácilmente añadiendo lo siguiente a la información de inicio del proceso:  
Tengo el poder, pero recibo instrucciones precisas
Lo del título, es lo que el proceso debe hacer ahora. Recibir las instrucciones de la línea de argumentos no es más que procesar rápidamente los mismos: [quote style="boxed"]Nota Los siguientes sucesos ocurren en el "Main" de la aplicación. En efecto: El constructor del formulario principal procesará las instrucciones contenidas en los argumentos. De esta forma el proceso será totalmente silencioso cuando sólo haya sido llamado con instrucciones explícitas.[/quote] Y así, el constructor del formulario principal lo único que hace es recibir los argumentos como si fueran los valores de las barras de los puntajes y los aplica.  
Finalizando con un retoque estético
Como el botón para guardar los cambios es el único que requiere elevación de privilegios, entonces debe ser destacado. El estándar propuesto por Microsoft es constantemente utilizado en su última versión de Windows:  
¿Dónde está ese escudo?
Una forma sucia de añadir el distintivo del escudo sería creando un ícono y adjuntándolo al botón. Sin embargo, prácticas así hacen un desarrollo poco mantenible y dependiente (por ejemplo si en Windows 7 llega a alterarse el escudo, si la aplicación se ejecuta en una versión antigua de Windows, entre otros). Ahora, ¿Dónde estará ese escudo? No hay muchas posibilidades. Ya conociendo el sistema es fácil predecir que al ser parte de la interfaz de usuario lo más probable es que se encuentre en alguna de las librerías de System32, como por ejemplo Shell32.dll, User32.dll, Comctl32.dll, entre otras de las que todos debemos conocer. Indagando por unos minutos con un editor de recursos, descubro que es User32.dll, en esta ocasión, quien tiene nuestro tesoro: Así, la librería User32.dll es la que nos proporciona la capacidad de poder desplegar un escudo en un componente de botón de la interfaz de la aplicación. Más aún, esta hipótesis es fielmente avalada por la base de conocimientos de Microsoft. A continuación, debemos declarar la librería y su punto de entrada en nuestro código C# (de una forma muy similar a la que lo haríamos en VB): La llamada, entonces, queda de la siguiente forma, siendo "buttonSave" el botón denominado para realizar las acciones con privilegios elevados: ¿Porqué de ese código? La primera sección, sobre "FlatStyle" es imperativa. Al establecerlo a "System" le pasamos el trabajo de dibujar el control directamente al sistema operativo. De esta forma, la alineación del texto y la imagen del control pueden ser establecidos por el sistema operativo. Luego está la llamada a la librería User32. Tal como especifica la documentación de MSDN, la llamada debe tener la siguiente forma: Con estos datos, la definición es sencilla. Se envía un mensaje al botón con su identificador "handle", el mensaje dice BCM_SETSHIELD (160C en hexadecimal). Los parámetros siguientes son fijos, el primero (wParam) siempre es cero y el segundo (lParam) es verdadero (el valor máximo FFFFFFFF, en hexadecimal) para cuando queremos establecer el escudo en el control al que hacemos referencia.  
Descarga y código fuente
La nueva versión, aparte de las nuevas características, está localizada al inglés. Esta localización significa que tal como enseñé en el siguiente artículo, la aplicación lucirá completamente traducida al inglés cuando sea necesario. De manera predeterminada se mostrará la interfaz en idioma español. El código fuente está escrito en C#, la solución está en formato para la versión Express 2008 de Visual Studio C#. Modificador de la evaluación de la experiencia v1.0.0.4 (código fuente) No se requiere instalación, simplemente baje los binarios ejecutables y haga doble clic en el ejecutable principal: Modificador de la evaluación de la experiencia v1.0.0.4 (ejecutables)  
Conclusiones
Aunque el proceso de adaptación de las aplicaciones para UAC de Vista, y seguramente para el futuro Windows, implica un trabajo adicional, los resultados son notables. La limpieza de las aplicaciones mezclandose naturalmente en su entorno es más que una simple mejora. Aplicaciones integradas a este nivel producen una mejor experiencia de usuario y mayor sensación de seguridad, las acciones administrativas deben ser elevadas y no la aplicación en general. De igual forma, las aplicaciones siguen funcionando perfectamente en ambientes en que se cuente con todos los derechos de administración (por ejemplo con el control de cuentas de usuario desactivado). Sin embargo, esta solución puede llegar a ser tediosa si los requisitos son diferentes, por ejemplo un panel de configuración con muchas opciones, en donde debería adaptarse la aplicación para abordar el problema de otra forma.
0 notes
erwinried · 17 years ago
Text
Feliz navidad y próspero 2009
En este artículo recopilo los ganadores de mi concurso, para que vean sus videos y todo el resumen de resultados, las novedades que se nos vienen a partir de enero 2009, artículos propios y únicos como la comparativa de netbooks, Aspire One vs. EEE PC vs. Mini 1000, probando el fantástico HDX18, el DV4 edición dorada, el maravilloso Touchsmart IQ816, entre muchas otras sorpresas Novedades Todo parte con mi nueva cámara, una delgadita y sexy L100 de Samsung. Es que es necesario, los nuevos documentos necesitan de mejor calidad, y eso representa el comienzo de todo lo que estoy preparando. Aunque parece que me estoy separando de mi rumbo de documentos originales no es así y por unos meses me dedicaré a probar exaustivamente el hardware grandioso que me ha enviado HP. [quote style="boxed"]A modo de "roadmap" les cuento un poco lo que tengo en mente antes de volver a mis documentos habituales, abierto a sugerencias: - Comparativa de Netbooks (una de verdad, con mis manos, sin estadísticas del fabricante, patrocinadores ni nada): HP Mini 1000 vs. Acer Aspire A150 vs. Asus EEE PC 701. - Revisión de 2 maquinas increíbles, primero el gigante: HDX18 HP PC, luego el HP DV4-1145go edición dorada. - Seguimos luego con el Touchsmart IQ816, ¿ganas de tocarlo?. - Luego mi idea es hacer un compilatorio de la multifuncional Wireless HP C6380, MediaSmart Connect, la mítica calculadora HP-41 e incluso más documentos sobre programación y desarrollo de pequeños dispositivos de hardware con mi nuevo Arduino Duemilanove que me acaba de llegar con otros regalitos directo desde Honk Kong, de Seeedstudio Depot. - ¿Alguna sugerencia?[/quote]  
El sorteo
http://www.youtube.com/watch?v=ObcJkdjdics http://www.youtube.com/watch?v=HKfJv9FKWOw http://www.youtube.com/watch?v=4-jMAkMdwgM  
Respuestas correctas
Partamos con algo simple, ¿Cuánto es log(10)+1?: [quote style="boxed"]2[/quote] ¿A que frecuencia viene configurado de fábrica el procesador de la calculadora HP50g?, escribe el valor hexadecimal de la frecuencia: [quote style="boxed"]4B[/quote] 686F6C612C206C6120726573707565737461206573204D47495641574159: 59586431045778: [quote style="boxed"]MGIVAWAY[/quote] Hay un artículo en donde doy un consejo de como quitar el vínculo a la inútil barra de "discusión" del explorador de Windows. ¿Cuál es el código que debes buscar en el registro? (Usa el formato {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}): [quote style="boxed"]{BDEADE7F-C265-11D0-BCED-00A0C90AB50F}[/quote]  
Participantes con las respuestas correctas
1. Matías Julián Pecchia (AR, 2008-12-03 02:52:28): HP recommends Microsoft Windows Vista(R), Erwin Ried recommends HP, Erwin doesn't need to be recommended ;-) 2. Andrew Curtin (US, 2008-12-03 09:22:39): le estamos muy agradecidos a HP y Microsoft 3. Jorge Andres Castro (CL, 2008-12-03 12:01:35): La potencia y elegancia de HP y Microsoft plasmada en la Web por ried.cl 4. Marcelo Lynch (AR, 2008-12-03 13:02:44): Microsoft es mas Software, HP es mas Hardware... Erwin seria la combinacion. Que mas se puede pedir? 5. Aliep Alvarez (US, 2008-12-03 16:07:51): Gracias a tu página (erwin.ried.cl), HP y Microsoft este va a ser el mejor fin de año para alguna afortunada familia. Gracias Aliep Alvarez 6. Enrico Lamperti (AR, 2008-12-03 18:25:35): Con más pasión que las ardillas que quieren dominar el mundo, HP, Microsoft y Erwin Ried hacen magia esta navidad. 7. Francisco E. Abad Luque (SP, 2008-12-03 19:30:10): HP y Microsoft nos enseñan que la perfección es dificil de encontrar, y erwin.ried.cl que nunca hay que dejar de buscarla, gracias! 8. Sonnino Roberto (BR, 2008-12-03 20:16:31): HP + Microsoft = Magic Giveaway HP + Microsoft + Erwin.Ried.cl = la verdadera Magia! 9. Felipe Astroza (CL, 2008-12-03 20:29:37): Si sobre calculadoras HP saber quieres, sumergete en erwin.ried.cl y Si los últimos productos y errores de microsoft conocer quieres, no lo olvides, visitarla debes. 10. Arif Lukito (AS, 2008-12-04 00:11:12): HP + Microsoft + erwin.ried.cl = magic 11. Roberto Salas (CL, 2008-12-04 01:37:42): Oh mi Dios! Erwin Reid y Microsoft lo lograron! La computadora HP aun mas personal! 12. Cristian Lizana (CL, 2008-12-04 02:38:51): "Él nos muestra los productos hp a fondo, expone las fallas de microsoft y sus curiosidades pero por sobre todas las cosas nos da un poco de conocimiento digital, GRATIS." 13. David Castillo (CL, 2008-12-04 10:12:03): Erwin el blog computacional basado y escrito en Microsoft Windows en una super calcuradora HP, o era Tv. 14. Pablo Díaz Valencia (CO, 2008-12-04 11:20:23): Para trucos de HP y Microsoft, el blog de Erwin Ried es el mejor 15. Mauricio Andrés Rivera López (CO, 2008-12-04 11:21:15): Erwin, HP y Microsoft, la combinación perfecta !!! 16. Pablo Poo (CL, 2008-12-04 17:15:54): Gracias a HP y Microsoft descubrí el blog de Erwin. Erwin, en qué lío te has metido! (y no le entregues mis datos a HP ni Microsoft) 17. MARCOS VENEGAS (CL, 2008-12-05 01:45:09): DESDE EL ULTIMO LUGAR DEL MUNDO LAS ULTIMAS TECNOLOGIAS HP APLICADAS POR RIED 18. Courtenay Gregory (US, 2008-12-05 15:32:19): In a world where technology giants Microsoft and HP run wild across the landscape, only one man has the knowledge and power to bring their magic to the people. That man, that hero, is Erwin Ried. ErwinRied.cl - Now playing at computers everywhere. 19. Antonio Ortega Perez (SP, 2008-12-06 23:30:15): Exprime al máximo y disfruta las tecnologías de HP y Microsoft con la bitácora de Erwin.Ried.cl ;) ¡Feliz Navidad! 20. Manuel Alejandro Navarro Salgado (CL, 2008-12-07 21:28:06): http://erwin.ried.cl un sitio indispensable si necesitas optimizar o aprender más sobre los gigantes HP y Microsoft. SLOGAN: HP y Microsoft, contraten a Erwin Ried para un futuro mejor... 21. Amanda García (AR, 2008-12-09 00:27:41): Cuando quieras información de calidad en castellano de los adelantos de HP y Microsoft debes saber que el lugar es www.erwin.ried.cl 22. Mario Pecchia (AR, 2008-12-09 00:55:58): hp: el lápiz microsoft: la tinta. www.erwin.ried.cl: la bitácora 23. Juan Cortés (CL, 2008-12-09 19:53:59): Descubre en La bitácora de Erwin Ried los trucos para reparar Windows, Office y mucho más bajo la guía de un experto... además todo lo que necesitas saber de la magia de los productos HP.  
Participantes con las frases chistosas o ingeniosas
24. Matías Julián Pecchia (AR, 2008-12-03 02:52:28): HP recommends Microsoft Windows Vista(R), Erwin Ried recommends HP, Erwin doesn't need to be recommended ;-) 25. Jorge Andres Castro (CL, 2008-12-03 12:01:35): La potencia y elegancia de HP y Microsoft plasmada en la Web por ried.cl 26. José Miguel Lueiza (CL, 2008-12-03 13:24:53): HP y Microsoft: ¡¡¡¡ PAGUENLE A ERWIIIIN !!! 27. Mario Alberto Salazar Fimbres (MX, 2008-12-03 14:41:00): HP ES EL CUERPO ELEGANTE Y ESTETICO, MICROSOFT LE DA EL ALMA, VIDA Y LA CAPACIDAD DE SER INTELIGENTE Y ERWIN ES EL MAESTRO QUE LO EDUCA PARA UN MEJOR FUNCIONAMIENTO. 28. Francisco Viancos (CL, 2008-12-03 16:07:43): Ayudemos a Erwin a pagar la cuenta de Internet , Compra productos tanto HP como Microsoft y comentalos en erwin.ried.cl Si existe está en erwin.ried.cl 29. Felipe Astroza (CL, 2008-12-03 20:29:37): Si sobre calculadoras HP saber quieres, sumergete en erwin.ried.cl y Si los últimos productos y errores de microsoft conocer quieres, no lo olvides, visitarla debes. 30. Sebastiaan Bakker (NL, 2008-12-04 11:05:16): I have no idea what the above item was meant to be. This should probably have been in portuguese but I apologise. Though I am happy that I managed this much without knowing a single word of Portugese. Congratulations and thank you and HP! 31. Pablo Poo (CL, 2008-12-04 17:15:54): Gracias a HP y Microsoft descubrí el blog de Erwin. Erwin, en qué lío te has metido! (y no le entregues mis datos a HP ni Microsoft) 32. Sergio Lorca Figueroa (CL, 2008-12-09 16:43:24): HP y Microsoft son marcas re-registradas por Erwin.  
Todas las otras frases y participantes
http://servicios.ried.cl/magicgiveaway/participantes.php  
Más sitios donde participar
Gotta Be Mobile Barb's Connected World Geek.com Gear Live Neowin Small Biz Vista JK On the Run BostonPocketPC Notebooks.com Geekzone I Started Something Bleeping Computer The Gadgeteer Planet x64 Digital Home Thoughts Digital Inspiration Geeks! MediaBlab Geek News Central The Digital Lifestyle GearDiary Last 100 Geeks To Go! Liliputing OSNN Slashdot Review SlashGear Gadgetell Windows Connected Techie Diva One Day, One Job Student Bloggers Study Hacks - Demystifying College Success HackCollege Noticias Tech Eliax La Bitácora de Erwin Ried Carlos Alberto InfoWester GeeksRoom CíberPrensa Unión de Bloggers Hispanos Living - In Theory Moosh in Indy Morningside Mom Thoughts on poetics & tech Techmamas Stop, Drop & Blog Down-to-Earth Mama merlot mom  
Más información
http://www.hp.com/go/winhpmagic2  
Conclusiones
Espero que este año haya sido un gran año para tí también, y te mando mis mejores deseos para el 2009.
#HP
0 notes
erwinried · 17 years ago
Text
Capturando temperaturas con Arduino
Veamos paso a paso como capturar valores de un sensor de temperatura en una aplicación de Visual Studio, graficándolas elegantemente escribiendo un sencillo firmware para el Microprocesador AVR Atmega168, utilizado por Arduino
Materiales
Un arduino decimilla. Es una plataforma de desarrollo bastante económica y sencilla de utilizar que te permitirá crear hardware de una forma muy rápida. Adicionalmente yo compré un Sparkfun Protoshield y un mini protoboard para trabajar más cómodamente pero alternativamente se podría utilizar una led con una resistencia apropiada (http://led.linear1.org/1led.wiz) y un pushbutton en una protoboard tradicional. Finalmente necesitamos el sensor de temperatura, en este caso es un ZX-TEMP: Para los lectores de Chile, todas estas piezas se encuentran en Olimex.
Armando el circuito
El circuito de nuestro sistema de sensor es bastante sencillo. Los estados se informarán primitivamente por medio de un led y un pushbutton permitirá interactuar con pequeñas funcionalidades que añadiré. Así tenemos un circuito similar al de la siguiente figura (ya nombré las entradas y salidas digitales en función de la disposición de componentes de la ProtoShield): Naturalmente el circuito no estaría completo si nos falta el sensor de temperaturas, pero el circuito superior es suficiente si compras el sensor de temperaturas que nombré anteriormente en vez de sólo el termistor (en este caso un TTC 103): Utilizaremos finalmente una entrada digital, una análoga y una salida digital. Una sección interesante fue armar la Sparkfun Protoshield. No tiene mucha dificultad, pero me recordó tiempos en que jugaba con mis Tente. Aunque no viene con instrucciones, la siguiente página es de extremada ayuda. Las terminaciones no fueron de extremada pulcritud, pero la placa funciona excelente, en perfecta armonía integrada con Arduino. Una recomendación es conseguir un cautín económico, de baja potencia y de punta fina.
Escribiendo el firmware
El lenguaje (Wiring) utilizado por Arduino es idéntico al tradicional C, C++ pero con ciertas palabras claves para funciones propias de arduino. [quote style="boxed"]Entorno de programación Para escribir y compilar el código de arduino es recomendable utilizar el IDE de Arduino. Lamentablemente, hasta la versión 0012 del mismo no se incluye un instalador ni soporte para Aero Glass, en Windows Vista. La solución fue hacer un sencillo paquete auto-instalable que funciona perfectamente en Windows Vista, creando adicionalmente un acceso directo tal como cualquier aplicación: http://servicios.ried.cl/arduino-live_setup.exe (reemplazado por: http://arduino.cc/forum/index.php/topic,118440.0.html) Bajas la aplicación y presionas el botón para iniciar el proceso. Al cabo de unos minutos se te solicitará una ruta de instalación.[/quote] Debemos considerar que técnicamente tendremos sólo un hilo de ejecución por lo que si nos detenemos mientras mantenemos encendida un LED estamos imposibilitando la detección de otros eventos como pasaría al trabajar en C#, con eventos e hilos de ejecución "simultáneos". Así debemos pensar bien en los estados de nuestro programa. Para esto, nada mejor que un clásico diagrama de estados: Primero implementaré las funciones básicas, en particular una de salida visual que utilizaré. Primero partamos con la función de parpadeo (el cual será bloqueante): Aprovechando el soporte de funciones polimórficas, la misma función soportando múltiples repeticiones: Para la conversión del entero proporcionado por el sensor a un valor de temperatura, tomaré este valor y lo ajustaré a nuevos márgenes (utilizando la macro "map"). El único detalle de esta función es que para soportar decimales multiplico, trabajo y divido el valor inicial: Los valores son experimentales y si pueden notarlo los calcule usando la temperatura ambiente (26 grados, en donde el valor entregado por el sensor era 438) y una referencia (temperatura corporal). Para enviar la temperatura al equipo usaremos un formato en particular, especificado en el primer comentario de la función: Con estas funciones, enviar una temperatura es tan sencillo como: Posteriormente debemos trabajar en la interacción del usuario con el botón, tal como define el diagrama superior. Para verificar si el usuario mantuvo presionado efectivamente el botón por los dos segundos requeridos, iteraré con pequeñas pausas revisando el estado del botón: Así luego de que sabemos que mantuvo el botón efectivamente presionado, pasamos al modo de captura continua, en donde cada dos segundos (siempre y cuando no vuelva a presionarse el botón) enviaremos los datos del sensor: Nótese que aquí aparece un problema potencial. La función de tiempo transcurrido (millis) tiene un límite dado por su tipo de variable. Así cuando el valor puede ser como máximo de 32 bits, tenemos que 4294967296 será el máximo de milisegundos a medir, es decir cerca de 49,72 días. Ese límite puede parecer bastante para un proyecto pequeño, pero para una estación de trabajo continuo (aunque Arduino no está pensado para este propósito)
Escribiendo la aplicación del escritorio
Para los gráficos utilicé ZedGraph. Esta componente permite disponer de un cuadro de gráficos totalmente personalizable: Como nos conectamos por un puerto serie provisto por el chip FTDI de arduino, entonces lo más sencillo es hacer un menú de conexión: La finalidad es lograr un resultado similar al siguiente: Con el control del puerto serie proporcionado por Visual Studio es bastante natural recibir los datos sobre la temperatura: Nada muy complejo, menos la función que procesa la información recibida: El único detalle del código anterior, es la incorporación de una condición para el soporte de múltiples hilos. Las nuevas versiones de Visual Studio nos advierten sobre esto cuando relacionamos cosas que involucran hilos. Así debemos usar InvokeRequired en conjunto con la función delegate de más arriba. Esto es más que nada porque al utilizar algo de la interfaz (como lo es el control zedGraph de gráficos), podemos tener un instante de tiempo en que dos secuencias recibidas alcanzan a ser procesadas tan rápidamente (gatilladas asincrónicamente) que pueden provocar un bloqueo actualizando (enviando mensajes) al componente visual. Todo el otro código del programa se explica por si solo, incluyendo las rutinas de conexión, redibujado y otras. Algo rápido que se me ocurrió para poder darle versatilidad al programa fue añadir un filtro por medio de expresiones regulares para los puertos disponibles en el equipo. Claramente hubiera sido más limpio buscar al "Arduino" leyendo los descriptores de hardware pero hubiera tomado más tiempo y en la práctica no hubiese sido necesario: Como se puede ver en el código, cada puerto se compara con una expresión regular. Así podríamos correr esta aplicación en Unix utilizando Mono ajustando nuestro filtro de nombre de puertos correspondientemente. Por defecto el filtro es para los puertos COM de Windows: [quote style="boxed"]\ACOM\d{1,3}\Z[/quote]
Pruebas
Un ejemplo de uso del sensor puede verse en el siguiente video:
Como se puede apreciar es bastante sencillo iniciar una captura de temperaturas.
Descarga
El código de la aplicación C# está disponible en el SVN de Google Code. También subí el código fuente del proyecto completo: TemperatureLogger v0.1 (Código fuente) El ejecutable de la aplicación: TemperatureLogger v0.1 Adicionalmente los fuentes para el código de Arduino: TemperatureLogger v0.1 (Archivo fuente para el IDE de Arduino)
Conclusiones
Como futuro ingeniero en computación, siempre me interesó extender mis habilidades en términos de hardware, automatización y arquitectura de computadoras, ideales que la placa Arduino sustentó perfectamente. Luego de malas e incomodas experiencias en otras placas (en particular una basada en PIC) puedo afirmar con certeza que Arduino es deliciosamente ideal para aquellas personas con pequeños proyectos que no quieren involucrarse en demasía ni perder mucho tiempo en cosas triviales y básicas del desarrollo en hardware. El único gran contratiempo que puedo destacar en arduino es su implementación estricta, casi arbitraria de la función de conteo, "millis", como se vio con más detalles en el cuerpo del artículo. Así, extiendo la invitación para todos los interesados en crear sus pequeños proyectos de manera extremadamente sencilla.
0 notes
erwinried · 17 years ago
Text
El problema del compositor y el escritorio seguro
En Windows Vista, especialmente con Aero Glass, tenemos un compositor de ventanas ([url=http://en.wikipedia.org/wiki/Desktop_Window_Manager]Desktop Window Manager[/url]). Como este compositor corre en espacio de usuario, entonces cualquier aplicación podría afectarlo sin pedir elevación de privilegios. ¿Qué hacer frente a una suspensión del administrador de ventanas en donde Vista queda completamente inutilizable?
¿Porqué un compositor de ventanas?
Sea Quartz, Xcmpmgr, Compiz, Beryl o DWM, en los tiempos modernos los sistemas operativos están optando por incorporar un compositor en vez de sólo un Windows Manager. ¿El motivo? Un compositor permite obtener efectos en dos o tres dimensiones, gráficos limpios, sombras y un par de características (como poder mostrar la ventana en otro equipo de forma remota) que serían impensables de otra forma. Claro que tanta maravilla tiene un costo. Lo bueno es que generalmente las actuales tarjetas gráficas hacen todo el trabajo.  
¿Que pasa entonces con el compositor de Vista?
El compositor de ventanas (llamado Administrador de ventanas del escritorio) de Windows Vista es administrado a través del servicio UxSms, que lo vigila constantemente para volver a ejecutarlo en caso de problemas y otras funciones. Así, este compositor corre sin privilegios de administrador, recibiendo mensajes de diversos componentes del sistema y generando la salida gráfica. Si no corre con privilegios elevados entonces podemos aplicar ciertas funciones administrativas sobre él, como por ejemplo suspenderlo con "Process Explorer":  
Sin compositor no somos nada... o casi nada
Incluso en las versiones sin los efectos gráficos de Vista, el compositor es vital. Aunque no componga lo que vemos, las aplicaciones, incluyendo "explorer.exe" le mandan mensajes y esperan por su respuesta (cosa necesaria para otras funciones como el escritorio remoto). Entonces al suspenderlo nuestro sistema siempre queda totalmente inutilizable (aunque en menor forma con la interfaz clásica o la llamada Aero Basic).  
El escritorio seguro
Probablemente notes lo molesto que es que en cada pregunta del control de cuentas de usuario de Vista, toda la pantalla se oscurezca y aparezca el diálogo sin el estilo de Aero Glass. Esto tiene un motivo, Windows saca una foto de tu escritorio y pasa a un escritorio de la cuenta de sistema. Este escritorio nunca puede ser alterado por otras aplicaciones ajenas (controlando tu ratón, teclado o viendo tu pantalla).  
Adiós accesibilidad
En la pantalla de opciones de seguridad (la misma utilizada para iniciar sesión en el equipo) hay un ícono que sirve para mostrar las opciones de accesibilidad: Luego de un par de retoques, ya podemos imaginar las funciones de análisis con la metáfora del siguiente botón: Lo único que debemos hacer así es reemplazar la utilidad original que ejecuta ese botón (Utilman.exe) por el Administrador de tareas. En efecto, funciona perfectamente:  
Windows totalmente vulnerado
No todo este poder es bueno. Ejecutar el Administrador de tareas en el escritorio seguro con la cuenta SYSTEM de Windows es una tarea sumamente peligrosa. La cuenta SYSTEM tiene todos los privilegios imaginados. Tal poder incluso nos permitiría finalizar el proceso mismo que maneja el inicio de sesión (LogonUI.exe) y otros vitales. Adicionalmente, como SYSTEM no es realmente una cuenta diseñada para ser interactiva es indeseable hacer cosas que requieran un explorador de archivos, como “explorer.exe” por ejemplo, pues tendrán que prepararse para su primera ejecución. Así, con este poder, es necesario proteger nuestro equipo. Un usuario cualquiera podría tomar el control de nuestro equipo sin siquiera tener una cuenta con privilegios de administración ni nada, sólo abriendo el administrador de tareas desde la pantalla de inicio de sesión, sin nunca iniciar una.  
Con un gran poder viene una gran responsabilidad
Es necesario hacer una especie de bypass, con una protección por contraseña. Preliminarmente tenemos algo así: La aplicación que reemplazamos (Utilman.exe) es la que se encarga de manejar todas las aplicaciones de accesibilidad. Importante sería no perder esta capacidad, así podemos detectar cuando nuestra aplicación sea ejecutada desde la cuenta de SYSTEM: Y simplemente redirigir sus parámetros al administrador de aplicaciones de accesibilidad como era en un comienzo: Esto genera una capa invisible, todo sigue funcionando como siempre y adicionalmente tenemos acceso a nuestro Administrador de tareas en la pantalla de opciones de seguridad. Cabe destacar de que como detalle, la contraseña está codificada en el archivo de configuraciones XML de la aplicación, usando la clase de criptografía provista por la CLR: Adicionalmente es posible configurar nuestra pequeña aplicación con el archivo de configuración provisto. Así podríamos cambiar las aplicaciones que son ejecutadas o la clave por defecto. Naturalmente se debe incluir un mecanismo para cambiar la clave fácilmente sin estar modificando el archivo de configuración (en donde está codificada):  
Sólo una instancia
Una característica deseable es que no existan múltiples instancias de esta aplicación. Hay muchas formas para lograr esto, pero recapitulando un poco de mis ramos de sistemas operativos se me ocurrió utilizar un Mutex admnistrado por el sistema operativo: ¿Qué pasa si el sistema operativo no puede crear un Mutex con ese nombre?, la variable instancia seguirá falsa, así: Así matamos todos los procesos (aunque no pueda suceder) y le damos el foco al primer proceso que vemos que sea idéntico a nosotros.  
Resumen para replicar la experiencia
1. Cambiar el propietario y otorgarse privilegios sobre los archivos "utilman.exe" y "es-ES/utilman.exe.mui" que están en el directorio de sistema. 2. Renombrar aquellos archivos (por defecto usaré en el archivo de configuración "_utilman.exe" como los archivos originales) y colocar nuestro "bypass" en ese directorio de sistema. 3. Modificar el mapa de bits del botón (recurso 11118) con un editor de recursos en "authui.dll". 4. También modificar la cadena de "Accesibilidad" en "es-ES/authui.dll.mui" con un editor de recursos.  
Código, imágenes y ejecutables
Ejecutables y archivo de configuración del "bypass" (9 kb) Código fuente para Visual Studio 2005 en C# (56 kb) Mapa de bits del nuevo botón para reemplazar (11 kb)
0 notes
erwinried · 17 years ago
Text
Batallando contra las fuerzas del "polling"
Incansablemente, el malvado "polling" existe con casi cualquier servicio residente de tu equipo, consumiendo y ralentizando cada pequeña operación. Hasta el momento tu única solución era esperar versión tras versión que la empresa desarrolladora corrija su ineficiente código. Mete mano y como nunca antes, dobla el brazo de ese ineficaz código El concepto de "polling" hace referencia a la incesante actividad que algunas aplicaciones mantienen mientras se encuentran residentes. En sistemas operativos antiguos, anteriores a Windows 2000 muchas veces era necesario, el desarrollador contaba con muy pocas herramientas para monitorear actividad del sistema y por ejemplo saber cuándo se actualizaba un archivo, un registro u otro recurso, sólo era posible haciendo una constante consulta del mismo. En la actualidad, es posible, incluso de manera muy sencilla, añadir "ganchos" que nos informarán sobre cambios en los recursos sin necesidad de crear ese improductivo "monitoreo". Un ejemplo de esto es el componente FileSystemWatcher de Visual Studio el cual nos permite añadir un gancho (hook) al sistema de ficheros NTFS el cual gatillará en un evento según los archivos o directorios que estemos monitoreando sin crear ningún evento adicional de comprobaciones constantes. Mi idea en este artículo es mostrar cómo, usando técnicas ya conocidas en documentos anteriores, "limpiar" nuestro sistema e incluso crear un verdadero estado de reposo de Windows. [quote style="boxed"]Importante Windows Vista tiene la particularidad de tener una infinidad de servicios constantemente corriendo y en este caso podría ser algo más complicado detectar cuáles son realmente eventos descartables y cuáles no, lo que dificultaría un poco la tarea. Todo el transcurso del documento ocurrirá en una máquina con Windows XP, aunque la solución es válida también para Vista, con pequeñas excepciones.[/quote]  
Un vistazo previo al sistema
El polling está presente en miles de programas y servicios, de disco, registro y red por lo que sería sencillamente imposible poder dar una solución universal. Así este documento sólo se centrará en quitar el polling del registro de mi equipo portátil, corriendo sobre Windows XP Home y con varios años de aplicaciones pero en general bastante limpio. Primero necesitamos el infaltable Regmon o en su defecto el hermano mayor Process Monitor (aunque sinceramente el primero es suficiente para este artículo). Veamos que consultas se hacen al registro en mi equipo en reposo: Cada aproximadamente un segundo se hace una seguidilla de consultas al registro, originadas por dos aplicaciones. Nuestro objetivo entonces será lograr el "reposo casi absoluto" del sistema eliminando esas consultas.  
Primer enemigo, "winlogon.exe"
¿Por qué "winlogon.exe" está consultando un registro llamado "KaspeskyLab" constantemente como vimos anteriormente? Raro. Les revelaré la verdad, KasperskyLab es una llave de registro del antivirus que tengo instalado KAV, y el porqué winlogon está consultando esa llave es por algo llamado "Winlogon Notification" que les permite a los desarrolladores colgar una librería DLL al proceso que controla funciones como la protección del inicio por medio de CTRL+ALT+SUPR, el bloqueo de la sesión en el protector de pantalla y otras funciones base del equipo. [quote style="boxed"]Importante La versión de KAV utilizada aquí es la 6, Kaspersky Antivirus 6.0. La versión de prueba disponible en el sitio. Sin embargo luego de probar la versión 7 del mismo producto, descubrí que aunque no produce este problema, genera (al parecer no al momento de la instalación) otro problema de Polling, en este caso de disco: Si lo notan bien, está consultando constantemente un archivo o directorio no existente. En este caso muchas veces más por segundo que en el problema con Winlogon, generando la clásica actividad de disco "fantasma" que suele molestar bastante. Informé hace una semana de este problema a la empresa desarrolladora (claramente sin ninguna respuesta hasta el momento de la publicación de este documento).[/quote] De esta forma, winlogon nos ofrece un par de eventos que se gatillarán en ciertas acciones, así podemos buscar la entrada del antivirus, la que cuelga la librería que produce este polling de registro: Como se aprecia en la imagen, en este caso la librería es klogon.dll y si se dan cuenta, por ejemplo cuando winlogon dice "¡hey!, ¡klogon!, voy a iniciar sesión" (Logon), klogon ejecutará "WLEventStop". De la misma forma, cuando winlogon le dice "¡psst!, ¡klogon!, ahora voy a cerrar sesión" (Logoff), klogon ejecutará "WLEventStart" (función que klogon tiene en su código al igual que la de detención). Pero que cosa más extraña dirás tú, ¿Por qué al iniciar sesión (cargar el entorno de usuario) se está "deteniendo" algo y al cerrar sesión se está iniciando algo? ¡Pues porque deseamos trabajar fuera de la sesión!, en efecto, el antivirus Kaspersky tiene una opción para mostrar un "logo" en la pantalla de inicio de sesión: Recapitulemos: es decir que klogon, colgado de winlogon está todo el santo día revisando una clave de registro, la que define si en la ventana de inicio de sesión mostrará o no un logotipo del antivirus en una esquina. ¡Todo el día, a cada segundo, consultando seis veces ese mismo registro para una función estética!, ¿no es creíble tanta incompetencia cierto?, pero es así, los desarrolladores de uno de los mejores antivirus con una solución de esta calaña, lamentable. [quote style="boxed"]Ok, ok, todo bien, los desarrolladores de KAV son torpes Sr. Einstein. ¿Cómo se podría haber solucionado según UD? No es lo que quería decir, sólo era para destacar la incompetencia que hay en pequeños pero importantes detalles, más aun cuando no vemos lo que hay "under the hood" y lo que es visible nos demuestra ese exceso de desperdicio de recursos nos lleva a cuestionarnos la situación. La solución limpia hubiera sido que el mismo klogon hubiera preguntado sólo cuando era necesario cargar ese logotipo y no constantemente, es decir luego de que winlogon notificase del cierre de sesión, se consulte el registro, una vez.[/quote] ¿Cómo solucionamos este problema en el equipo?, simple, removiendo la notificación de winlogon. Aquí puedes elegir entre mostrar el logotipo de KAV en la pantalla de inicio de sesión o desperdiciar 518400 consultas al registro por día, en claro desmedro del tiempo de respuesta de tu equipo. Autoruns nos simplifica la tarea, aunque también pudo haber sido ejecutada de forma manual, eliminando la clave de "klogon" en el registro (incluso desde la clave que nos señala Autoruns): En este momento, reiniciamos y observamos los cambios en nuestro equipo en "reposo":  
Enemigo final, "vmware-authd.exe"
Como vimos anteriormente, este proceso continuamente está consultando una clave llamada "Disable performance counters". Pero, ¿por qué hace esto? El archivo en cuestión es un servicio de licencias para VMWare Workstation, un conocido programa de virtualización (máquinas virtuales). El sistema operativo Windows lleva un registro de contadores de eventos que ocurran y en general, esta es una información bastante valiosa para administradores de sistema. De hecho, Windows Vista analiza la información de estos contadores y nos ayuda a diagnosticar problemas del sistema sin conocer mucho el trasfondo de los mismos: El detalle de todo esto es que la duda aún se mantiene, ¿por qué este servicio está consultando constantemente un registro del que podría simplemente colgar un evento y ahorrarnos millares de accesos al registro? Hay varias soluciones a este "problema", la primera es simplemente finalizar el proceso (aunque claramente, volverá al reiniciar el equipo). La segunda será establecer el inicio del servicio en "demanda", es decir en modo manual: El problema de la segunda solución es que algunas veces las aplicaciones esperan que un servicio que instalaron anteriormente esté siempre respondiendo y en vez de iniciarlo generan un error, produciendo molestias al usuario. También, aunque el servicio sea iniciado en demanda, el problema de las consultas innecesarias se mantendría hasta un apagado del equipo. En este caso, esas soluciones no son un reto, sin embargo editar el ejecutable del servicio para corregir y eliminar esas consultas de raíz, sí que lo es.  
Un retoque bajo el capó del servicio
[quote style="boxed"]Nota Las correcciones de los problemas que se enumeran a continuación no pueden ser publicadas en forma de un archivo modificado o instalador, pues así se violaría el acuerdo de licencia de los posibles productos afectados por los cambios. Sin embargo, mi idea es mostrar las formas en que podrían ser reparadas, en forma de conocimiento computacional general.[/quote] Abrimos el Ollydbg y lo adjuntamos al proceso del servicio en cuestión: Buscamos la referencia de sus constantes consultas al registro, simplemente usamos el buscador de referencias a cadenas de texto: Un detalle interesante es que la respuesta del sistema es que no se encontró el registro consultado: Por experimentar, podríamos crear una clave: Sólo para darnos cuenta que sin importar lo que exista, este servicio nunca cesará sus inútiles consultas:  
...Ahora no está, ¡ahora sí está!
Como en un rato jugando con Ollydbg no pude encontrar una solución sencilla, comencé a depurar el proceso con el debugger de Visual Studio, que precisamente funcionó mucho mejor para esta tarea. Ahora fue fácil encontrar rápidamente la llamada que gatillaba todas las consultas al registro, la cual afortunadamente tenía un salto condicional sobre ella: Con lo poco que trasciende el valor del registro (como lo comprobamos anteriormente) lo más trivial fue cambiar ese salto condicional por uno incondicional: Detenemos el servicio, guardamos la pequeña modificación y volvemos a iniciarlo sólo para comprobar con satisfacción que ahora el equipo ahora está en un reposo absoluto y en consiguiente, el polling ha sido derrotado exitosamente. Lamentablemente, el villano escapa, débil, pero aún con vida, para volver fortalecido con cada siguiente versión de cualquier aplicación pobremente programada, a ralentizar nuestro equipo. Resumiendo, la segunda parte de la solución se trata de modificar un byte del ejecutable como se muestra a continuación:  
Conclusiones
Un poco de la lógica de siempre y los pequeños problemas fueron corregidos satisfactoriamente. La invitación queda abierta para que revises tu equipo, busques estos forados por donde se cuela tu performance y los elimines. [quote style="boxed"]Nota mental No usar KAV como antivirus, o por lo menos esperar a que la empresa haga un producto completamente depurado. Hasta el momento estoy probando Bitdefender 2008 y puedo comprobar lo poco optimizado que estaba el producto de Kaspersky. (Incluso cuando yo tiendo a desactivar todas las funciones extras molestas y opciones contextuales, para dejar sólo el monitor de archivos en tiempo real)[/quote] Como anécdota positiva queda el pequeño artículo en Wikipedia que escribí en conjunto con el presente documento pues no existía en nuestra lengua.
0 notes
erwinried · 17 years ago
Text
Apología a las amadas y odiadas librerías DLL
Todo [i]computín[/i] tendrá alguna vez un encuentro con estas nebulosas librerías, probablemente llegues a odiarlas pero lo cierto es que con Visual Studio es una experiencia increíble trabajar con ellas. Veamos paso a paso como erigir una librería que de paso nos servirá para gestionar otro de los espantajos conflictivos de Windows, como son los instaladores Tal como en los tiempos del antiguo, sucio y adorable (¡snif!) Visual Basic (no del maquillado y elegante C# al que llaman Visual Basic .NET ahora) crear librerías con Visual Studio (en particular con la versión 2005 o superior) es realmente sencillo y útil. Una librería encapsula una serie de elementos que podrán ser consumidos desde casi cualquier fuente, así podrías hacerte de una serie de librerías que usarás desde diferentes aplicaciones y podrías reutilizar código incluso más fácil, versátil y pulcramente que copiándolo y pegándolo directamente. En resumen, una librería será un espacio de nombres, tal como el espacio que encapsula todos los elementos de nuestra aplicación principal, la librería contendrá sus propios elementos, clases, estructuras, enumeraciones y más.
El pretexto
El artículo actual tiene como fin mostrar la base de la creación y utilización de librerías DLL (bibliotecas de clases) sin embargo el pretexto de este tutorial será crear una aplicación que nos permita administrar nuestras aplicaciones instaladas (especialmente la lista de agregar o quitar programas). La idea es crear un programa moderno que nos permita "quitar" elementos instalados con la seguridad de poder restaurarlos posteriormente. La aplicación simplemente ocultaría los registros que hacen referencia a las instalaciones a voluntad del usuario. La librería administrará todas las acciones con el registro, proporcionando las listas de instaladores y las rutinas necesarias para ocultarlos y restaurarlos. De esta forma nuestra aplicación será solo una interfaz de la misma, para comprobarlo también implementaré una ejecutable de línea de comandos que hará uso de la misma librería.
Primeros pasos con la librería
Para comenzar con nuestra librería lo único que debemos hacer es seleccionar "biblioteca de clases" como nuevo proyecto. En este instante crearemos una estructura que representará un instalador y una lista que serán las opciones de filtrado de los mismos. Para utilizar posteriormente la librería en otro proyecto, simplemente debemos añadirla como "Referencia" a nuestro nuevo proyecto: Así la utilizaríamos como si fuera una clase, llamándola primero por su nombre, es decir: [quote style="boxed"]Nota El código mostrado en el artículo está escrito de forma simplificada.[/quote] Entonces nuestra estructura es similar a: Las opciones de filtrado tienen una particularidad: [quote style="boxed"]El secreto tras las potencias de dos En la enumeración anterior, arriba de la declaración de la misma está el atributo [Flags] el cual guarda una estrecha relación con las potencias de dos. Esta relación se usa frecuentemente en todas las librerías del sistema y aunque en este caso en particular no tiene una trascendencia mayor, es importante explicar su función. Imaginemos las propiedades de un texto: Adicionalmente podríamos combinar sus propiedades: Entonces ¿cómo podríamos ahora llamar a una función que aplique formato del texto? Pero, ¿y si quisiéramos sólo utilizar una variable?: Lo normal sería hacer una tabla por cada una de las combinaciones, asociándolas a un número, en efecto obtendríamos algo así: Ahora, volviendo a la primera propuesta, ¿qué tienen que ver las potencias de dos acá?: ¿Se nota?, los valores que son potencias de dos son características únicas que definen sólo un bit, en cambio las características compuestas son la suma de las características única. Así cuando especifico [Flags] en la enumeración le estoy indicando al compilador que trate de esta forma los elementos de la enumeración misma, así con OR podremos generar configuraciones compuestas, evidentemente: Astuto ¿cierto?[/quote] Entonces tenemos ya las definiciones principales, ahora quedaría el cuerpo del código. Como demostración sólo mostraré uno de los constructores más relevantes: También, secretamente, quería mostrarles también cómo pueden invocar a otros constructores para no tener que repetir varias veces las mismas asignaciones clásicas de los constructores, de hecho, al igual que en otros lenguajes, si el contructor está vacío se podría omitir y la clase compilaría de todas formas.
La información sobre las instalaciones
Para acceder a la información sobre los desinstaladores que aparecen en la lista de agregar o quitar programas me basaré en las siguientes claves del registro: De esta forma, lo único que haré será recorrer las subclaves en busca de todas las que contengan un registro específico, denominado "DisplayName", generalmente, aunque es personalizable. Así el código es bastante explícito:
Ocultando las instalaciones ¿cierto?
Una parte importante del proceso será ocultar las instalaciones (en efecto, es el propósito principal del programa). Esta tarea tiene un secreto, Visual Studio no proporciona directamente funciones para copiar ni mover ramas completas de registro entonces tendremos que trabajar primero en implementar esta funcionalidad y luego podremos ocultar las instalaciones. [quote style="boxed"]¿Por qué necesitamos mover o copiar una rama completa de registro para ocultar una instalación? Pues porque es la forma más sencilla de hacerlo, la otra posibilidad es remover los privilegios de lectura de la clave, sin embargo esto podría traer graves consecuencias posteriores. Así lo que haré simplemente será crear una clave hermana a la contenedora de la clave que queremos "ocultar" y moveré la rama completa hacia la "hermana", así también podré restaurar fácilmente los instaladores ocultos repitiendo el proceso a la inversa.[/quote]
Copiando y moviendo ramas completa del registro
La tarea de copiar y mover son muy similares, de hecho son lo mismo, el único detalles es que al mover, copiamos y borramos el contenido copiado. Esta similitud está muy presente en los usuarios de Linux, especialmente aquellos habituados a utilizar la terminal del sistema. De esta forma podríamos abarcar muy suciamente este procedimiento, con ayuda del comando "reg", exportar, modificar y reimportar el registro para copiarlo. Estas soluciones son buenas para alcanzar un objetivo, pero nuestra aplicación será una obra, aprenderemos y por consiguiente aquí está la siguiente pincelada en nuestro lienzo etéreo: ¿Se entiende?, primero abro las llaves de origen y destino, luego copio todas las llaves de registro de la ruta actual. Para las subclaves vuelvo a llamar a la misma función de copia con los parámetros de la subclave misma, repitiendo el proceso, recursivamente. Ahora, para mover una clave es lo mismo pero eliminando la clave de origen (más pistas de su implementación dentro del código).
Ocultando las instalaciones
Después del pequeño break educativo, ahora podemos entrar de lleno a ocultar las aplicaciones instaladas en las llaves comentadas anteriormente. Primero, cuando el usuario "desmarque" un instalador, llamaremos a nuestra librería que usara una función extremadamente sencilla: Y ahora viene la parte difícil... ¡mentí!, no hay parte difícil, sólo un poco de lógica y como siempre un resultado satisfactorio.
Bueno y... ¿la librería?
Claro, claro, hicimos una librería que por el momento está cumpliendo la misma función que si hubiera sido una clase dentro del programa original... entonces, ¿cuál es la gracia? Veamos, creamos otro proyecto en la solución de Visual Studio, ahora una aplicación de consola: De igual forma hacemos referencia a nuestra librería (si no la librería no fuera de la misma solución tendríamos que hacer referencia al archivo DLL). ¡Ahora usamos la librería desde nuestra aplicación de consola!, ¿qué más elegante?: Agotador, ¿no es así?
Código y ejecutables
La vista previa para los indecisos: Código fuente para Visual Studio 2005 (C#) Aplicación para Windows (Uninstall Hidder) Aplicación para consola (Uninstall Hidder) Sólo la librería compilada (DLL) Por cierto, anteriormente no les comenté sobre la posibilidad de personalizar este pequeño programita por medio del archivo de configuración que incluye, en efecto no es tan interesante al verlo en el diseñador de Visual Studio: De hecho podríamos conseguir ocultar casi cualquier llave del registro. A mi parecer lo ideal sería trabajar un poco más en el mismo y lograr una aplicación "universal", pero claro, no será para este episodio.
Conclusiones
Otro ejemplo más de lo entretenido y productivo de la programación en este entorno, especialmente por lo curioso que pueden llegar a ser para alguien relacionado con computación todo este mundo de las librerías que Windows nos introduce, particularmente con menos fuerza que antes con el famoso infierno de las DLLs. Claramente nuestra librería dista mucho de ser un producto profesional y óptimo, incluso alejándose del bajo nivel que presentan librerías del sistema, sin embargo, no quita la utilidad de las mismas.
0 notes
erwinried · 18 years ago
Text
El nuevo código completo del sitio
Nuevamente publico el código completo del sitio. Modifícalo, analízalo y úsalo como desees, al no estar basado en ninguna plantilla es muy fácil comprender su funcionamiento, ahora con un rendimiento increíble, privilegios por grupos, administrador de usuarios, administrador de encuestas y muchas mejoras más Hace muchos meses publiqué el código del sitio, ahora y por cuarta vez haré lo mismo. Esta vez es diferente pues ya el sitio lleva muchos meses de trabajo y ya no es un pequeño código con mínimas funcionalidades. Claramente aún falta mucho trabajo como para afirmar que se alcanzó un punto cúlmine de su desarrollo.
Preliminares
[quote style="boxed"]¿Qué incluye? · Código PHP/HTML completo. (sitio principal, buscador de documentos, panel de administración, editor bbcode en el panel de administración, código Javascript (js) completo, sección para dispositivos móviles, generación de RSS) · Archivos fuente de CorelDraw 12 y Photoshop CS de todas las imágenes y gráficos. · Código SQL para configurar la base de datos instantáneamente. [/quote] [quote style="boxed"]¿Qué no incluye? · Actualizaciones · Hosting u otro servicio similar.[/quote] [quote style="boxed"]¿Qué pido a cambio? En realidad nada, pero si encuentras un error o algún detalle me encantaría escucharlo[/quote]
Puesta en marcha
Con la última versión del sitio, el procedimiento de puesta en marcha tiene un asistente. Esto significa que el proceso es tan simple como: A) Primero se copian los archivos del sitio al directorio correspondiente (Vista previa) B) Luego se abre el directorio predeterminado del servidor (Vista previa) C) El asistente ahora preguntará un par de datos, si utiliza EasyPHP, puede presionar "Siguiente" sin escribir nada para establecer la configuración predeterminada (Vista previa) D) Listo, en menos de un minuto el sitio está funcionando (Vista previa) Para más información, lea el archivo de instrucciones incluído en el paquete descargable del código del sitio.
Manejo de funciones básicas y avanzadas
En la última versión disponible (v1.5) se incluyen diversas mejoras y novedades: * Desde el asistente de configuración puede seleccionarse un modo de "plantillas" que ayudan a la personalización del sitio * El visor de eventos ahora puede crear un mapa básico de equipos que se conectaron al sitio (se mejorará en versiones posteriores): * El visor de eventos ahora puede realizar filtros por direcciones de usuario (IP): * Mejoras en el modo de vista simple de los documentos * Nuevos parámetros para la etiqueta IMG, para añadir imágenes a los documentos:
Mejoras en la administración de réplicas de comentarios nuevos filtros:
* Otras novedades varias: el asistente ahora detecta advertencias en el proceso, el código del sitio tiene licencia GPL ahora, se puede reactivar un sitio en mantención por medio de servicios (ver más abajo), hay secciones como el "acerca de" totalmente configurables por parámetros de comportamientos (desde la sesión de administración), entre otros. Estas propiedades se añaden a las ya tradicionales del sitio: * Formato de edición basado en código similar al de foros y otros portales para añadir compatibilidad: * Categorías y organización de artículos automática: * Explorador de archivos: * Asistente de mantenimiento: * Comportamiento del sitio basado en variables: * Administrador de comentarios y réplicas: * Asistentes para subir contenidos: * Administrador de enlaces y noticias: * Capacidades básicas de estadística: * Soporte para usuarios, grupos y privilegios: [quote style="boxed"]Esta función fue mejorada en la versión actual del código[/quote] * Administrador de encuestas y visor de resultados: [quote style="boxed"]Esta función es nueva en esta versión del código[/quote] * Caché de imágenes y documentos: [quote style="boxed"]Esta función es nueva en esta versión del código[/quote] * Historial de eventos por usuario: * Directorio, buscador, sindicación RSS, acceso WAP, historial de cambios de versión, usuarios en línea, entre otros
Advertencias, recomendaciones y detalles
-Para administrar el sitio se recomienda utilizar Internet Explorer debido a ciertas incompatibilidades con otros navegadores de los editores internos (por ejemplo el editor de documentos) -Antes de publicar un sitio basado en partes o modificaciones de este código verifique los siguientes elementos: Otro punto importante es la configuración de los mensajes de aviso. El servidor debe tener configurado correctamente el envío de correo electrónico y se deben configurar (por defecto viene en su forma más simple posible) los siguientes comportamientos desde la sesión de administración: El formato de correo HTML básico debe utilizar la siguiente estructura: El mensaje dentro de la etiqueta "BODY" puede estar conformado por variables que son automáticamente administradas por el sitio: Por ejemplo en el cuerpo del mensaje se podría utilizar:
Expandir el funcionamiento del sitio
¿Cómo utilizar los usuarios del sitio en otros servicios? Esto es relativamente simple, desde el servicio adicional debemos realizar una llamada a: Por ejemplo, para comprobar al usuario "erwin" con contraseña "1234" desde una aplicación de Visual Studio, hacemos una llamada y leemos los datos del siguiente URL: En el caso de tener instalado el sitio localmente con EasyPHP la llamada sería así: Hay que tener en cuenta que los datos no viajan encriptados, por lo que si se utilizará con propósitos serios debería recibir modificaciones para añadir seguridad. En próximas versiones se añadirá seguridad adicional y nuevas funciones a estos procedimientos. Adicionalmente hay otras funcionalidades disponibles por defecto utilizando este mismo mecanismo: En donde el modo puede ser "activar" o "desactivar", realiza esas operaciones en el sitio. Es útil para hacer mantención general del sitio o de su base de datos, aunque el sitio puede desactivarse desde la sesión (con el registro: "website.status"), la activación debe ser por medio de este método (no se puede accesader a la sesión de un sitio desactivado)
Cosas que aún faltan
-Mejorar el primitivo buscador y los resultados que proporciona -Mejorar las consultas a la base de dato -Permitir a los usuarios adicionales administrar los comentarios escritos en sus documentos personales -Añadir configuraciones adicionales para elementos que aún deben ser modificados desde archivos, como los especificados en el punto tres de este documento (con las últimas versiones este trabajo es mucho menor, pues el asistente ajusta la mayoría de los requerimientos) -Implementar soporte para páginas en varias secciones como comentarios, noticias, documentos
Descarga
[quote style="boxed"]Actualizado el 2/12/2007 (Versión 1.6.11) Código fuente: ried_public_code-2007-12-02.zip Dentro del sitio se pueden ver los cambios por versión accediendo por medio de ?modo=cambios, por ejemplo http://127.0.0.1/?modo=cambios[/quote] Archivos fuentes de los gráficos (opcional): ried_public_sources_2006-11-27.zip
0 notes