inmensia |
Chrome
Juan Mellado, 25 Febrero, 2012 - 11:13
Algunos apuntes sueltos sobre Dart, el lenguaje de programación para la web que está desarrollando Google. Programación estructurada #library("test");
#import("test.dart");
Constructores con nombre class Test {Privacidad class Test {Inicialización de variables de instancia class Test {Notación abreviada class Calculator {Parámetros opcionales class Test {final Test test = new Test();Interpolación de String final String hello = "Hello";Operador parte entera de la división value ~/= 17;Enteros de tamaño arbitrario Relación con JavaScript Dart trata de resolver los problemas que plantea JavaScript, como el uso de this por ejemplo. Y además de lo que es el lenguaje de programación en si mismo, también proporciona una serie de librerías completas, como hizo Java en su tiempo. Desde colecciones como arrays, listas, mapas y conjuntos, hasta soporte para realizar operaciones de entrada/salida con ficheros, uso de sockets, etc... Ejecución Errores El entorno de desarrollo es prácticamente un editor, basado en Eclipse, que apenas permite realizar las operaciones más básicas con los proyectos. Un ejemplo de esto es que ni siquiera se le puede cambiar el nombre a un fichero, ni borrarlo para crear uno nuevo con el nombre corregido. Pero lo peor sin duda es que aún no se puede depurar. Lógicamente están trabajando para añadir todas estas características. Durante mis pruebas he encontrado varios errores. He abierto las incidencias correspondientes en dartbug.com y todas las han aceptado como errores, e incluso alguno ya está corregido en el último build nocturno. Aunque creo que hay alguno que les va a llevar un poco más tiempo. He encontrado un error que hace el código se comporte de forma distinta en función de como se escriba. ¡Me ha traído literalmente de cabeza!. Al final he decidido no continuar la migración que estaba haciendo a Dart de LZMA. El algoritmo que está implementado funciona bien cuando se genera código en JavaScript, pero nunca va a poder funcionar bien en Dart con la especificación actual del lenguaje. El motivo es que LZMA basa su funcionamiento en operaciones a nivel de bit con una aritmética de tamaño entero (32 ó 64 bits) y precisamente en Dart los enteros no tienen tamaño predefinido. Estoy por borrar el proyecto.
Juan Mellado, 22 Febrero, 2012 - 18:47
El uso de la librería es muy sencillo, basta con importarla y llamar a la función de descompresión: #import("lzma.dart", prefix: "LZMA");
Aunque Dart viene con librerías que incluyen varios tipos de streams, he decidido aislar un poco mi librería de los posibles cambios en la implementación y definir dos interfaces propias muy sencillas: interface InStream {Llama la atención que en una interface haya definido un método He puesto un ejemplo completo en la página del proyecto, pero al final todo se reduce a instanciar dos objetos y llamar a una función: final InStream inStream = new InStream(data);La función de compresión está en desarrollo. He retrasado su desarrollo porque me ha desanimado bastante que el programa no funcione con la máquina virtual de Dart utilizando la línea de comandos. Eleva una excepción El entorno y el lenguaje tienen cosas curiosas, a ver si me animo a escribir un post con las cuatro cosas que he ido viendo.
Juan Mellado, 14 Febrero, 2012 - 13:32
Un vídeo de Hangar en acción. Demo online:
Juan Mellado, 13 Febrero, 2012 - 18:05
Hoy he liberado los fuentes del último proyecto en JavaScript en el que he estado trabajando. Es un visor de modelos 3D almacenados en formato AC3D (.ac) que utiliza WebGL para renderizar. He estado utilizando modelos de aviones de FlightGear para probarlo, así que he decidido llamarlo Hangar. He creado una pequeña página web con cuatro modelos escogidos de prueba. Tiene implementado un controlador a modo de trackball que permite rotar y ampliar los modelos utilizando el botón izquierda y la rueda del ratón. Necesita un navegador moderno como las últimas versiones de Chrome o Firefox para funcionar (Y no, IE 9 no es un navegador moderno) ![]() El formato AC3D lo utilizan algunos programas como FlightGear, un simulador aéreo de código abierto, o Torcs, un simulador de conducción deportiva también de código abierto. Es un formato de texto plano que originalmente creó un programa de modelado 3D llamado, lógicamente, AC3D. Mi idea era hacer algo sencillo, pero al final he acabado incorporando un montón de esas pequeñas características que pasan desapercibidas cuando funcionan bien. AC3D Los objetos están definidos de una manera jerárquica, de forma que un objeto puede tener hijos. Además, cada objeto tiene una matriz de rotación y un vector de rotación que aplica a sí mismo y a todos su hijos, por lo que hay que ir calculando la transformación resultante a medida que se baja por el árbol de descendencias. Teselación Me he encontrado con modelos de todo tipo y definidos de casi cualquier forma. Al final he decidido ignorar los polígonos degenerados. Es decir, polígonos con menos de tres vértices, polígonos con coordenadas colineales, polígonos con vértices no contenidos dentro de un único plano, polígonos con aristas que se cruzan, ... Normales La normal a un vértice concreto se calcula como la suma de todas las normales de todas las caras que comparten dicho vértice. Aunque a este respecto el fichero incorpora un parámetro por objeto llamado "crease". Este parámetro es un ángulo, y sirve para generar lo que habitualmente se conocen como bordes duros (hard edges). Si el ángulo que forman la normal de una cara y su vecina supera dicho parámetro entonces esa normal vecina no se tiene en cuenta para calcular la normal en el vértice compartido. SGI Mi implementación soporta .sgi, .rgba, .rgb, .ra y .bw. Es decir, todas las combinaciones posibles, aunque he ignorado deliberadamente algunas características de la especificación, como la posibilidad de usar paletas de colores o escoger entre 8 ó 16 bits por canal. En la práctica todas las imágenes acaban siendo de cuatro canales y con 8 bits por canal en el clásico formato RGBA. Loader Muy útil. Renderer El formato AC3D permite incluir luces en los modelos, pero las he ignorado a la hora de renderizar, utilizando en cambio una luz fija estática direccional sin factores de atenuación. Mi idea era representar modelos de objetos independientes, no escenas completas, por lo que no he encontrado sentido en incluirlas. Aparte de que acabado no fiándome de los modelos, con materiales un tanto extraños a mi parecer. Para minimizar los cambios de estado de la tarjeta gráfica he agrupado todos los polígonos por programa, material, tipo, y todo lo que se me ha ocurrido. Por ello, a diferencia de otros proyectos anteriores, he decidido utilizar Transparencias Lo que me duele es que se supone, repito "se supone", que los materiales incluyen un atributo para indicar si tienen algún tipo de transparencia. Desgraciadamente esto no ocurre así en la práctica. Al final cuando algún modelo no se visualizaba correctamente, abría el fichero, localizaba el material y lo cambiaba a mano. Esto es algo que en general creo que tendría que revisar con el objetivo de entender la manera en que interpretan los materiales programas como FligthGear o Torcs aprovechándome del hecho de que son de código abierto. Autofit De esto también me gustaría escribir un post individual en el futuro, ya que he encontrado distintas soluciones en Internet y no me he quedado del todo satisfecho con la que yo mismo he implementado. TrackBall Resumiendo Una aproximación más práctica al problema hubiera sido utilizar un motor 3D ya existente, como el popular Three.js, y limitarme a hacer un conversor del formato .ac a algún formato que acepte el motor. Pero claro, ¡me hubiera perdido la parte más divertida!
Juan Mellado, 13 Enero, 2012 - 14:58
Hará cosa de un año que me bajé los fuentes de Chrome y los estuve compilando. Muchas novedades ha habido en el navegador desde entonces, así que me he decidido a bajarme los fuentes actualizados y volver a compilarlos. Y si bien la primera vez utilice la versión 2008 Express de Microsoft Visual C++, esta vez he optado por utilizar la 2010 Express. ![]() Esta es la secuencia de pasos que he seguido utilizando Windows 7 Ultimate 64 bits: Instalación 1) Instalar Microsoft Visual C++ 2010 Express 2) Instalar Microsoft Windows SDK for Windows 7 and Framework .NET 4 3) Instalar Microsoft Visual Studio 2010 Service Pack 1 4) Instalar Microsoft Visual C++ 2010 SP1 Compiler Update for the Windows SDK 7.1 5) Instalar Microsoft Windows Driver Kit Version 7.1.0 en un directorio <DDK> 6) Instalar Microsoft DirectX SDK en un directorio <SDX> 7) Dar permiso de modificación y sustituir "v7.0A" por "v7.1" en los ficheros: C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Platforms\Win32\PlatformToolsets\v100\ C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Platforms\x64\PlatformToolsets\v100\ Configuración 8) Descargar depot_tools y descomprimir el .zip en un directorio <depot_tools> 9) Descargar chromium_tarball y descomprimir el .tar en un directorio <sources> 10) Añadir el directorio <depot_tools> al PATH del sistema 11) Ejecutar por primera vez las depot tools para actualizarlas: 12) Editar el fichero <sources>\.glclient y añadir la url de una rama probada de los fuentes: 13) Actualizar los fuentes: 14) Crear la solución y los proyectos para Visual Studio 2010 Express: Compilación 15) Abrir solución de Visual Studio (ignorar mensaje de advertencia sobre properties): 16) Configurar el proyecto "chrome" como inicial 17) Añadir las siguientes rutas al principio de la lista de directorios de includes (Win32 y x64): 18) Añadir las siguientes rutas al final de la lista de directorios de includes (Win32 y x64): 19) Añadir las siguientes rutas al principio de la lista de directorios de libs: 20) Añadir las siguientes rutas al final de la lista de directorios de libs: 21) Lanzar el build sobre el proyecto "chrome" El tiempo total en mi máquina para una compilación sólo del navegador Chrome para Win32 Debug sin los tests es de unos 40 minutos, lo que está bastante bien teniendo en cuenta la cantidad de proyectos y dependencias. El orden de instalación que he puesto difiere un tanto de las instrucciones oficiales, pero es la mejor forma que he encontrado para evitar los errores con los que me he ido topando al instalar los distintos productos de Microsoft que necesitaba. La lista de pasos ahora la tengo clara, pero como de costumbre ha sido todo un proceso de prueba y error. Al final opté por bajarme las .ISO de cada instalación en vez de utilizar los instaladores webs, porque esperar por cada descarga cada vez era muy tedioso. Con respecto a la instalación en particular del compilador, comentar que finalmente tuve que instalar primero el Visual C++, luego el SDK de Windows, luego el Service Pack 1 del Visual C++ y por último un parche para arreglarlo todo, aunque aún así es necesario modificar dos ficheros de manera manual, ya que se empeña en tomar la versión 7.0A del SDK de Windows en vez la más actualizada 7.1. Finalmente, puede que sorprenda que haya tenido que instalar el SDK de DirectX, ya que este último pasó a formar parte del SDK de Windows hace tiempo, pero es necesario porque los fuentes de Chrome utilizan D3DX, que sólo está incluida en el SDK de DirectX. De igual forma, es necesario instalar el DDK porque la versión Express de Visual C++ no trae los includes y librería de ATL. ¡Feliz compilación a todos! |