Noticias Weblogs Foros Wiki Código

Meta-Info

¿Que es?

Planeta Código es un agregador de weblogs sobre programación y desarrollo en castellano. Si eres lector te permite seguirlos de modo cómodo en esta misma página o mediante el fichero de subscripción.

rss subscripción

Sponsors

Puedes utilizar las siguientes imagenes para enlazar PlanetaCodigo:
planetacodigo

planetacodigo

Si tienes un weblog de programación y quieres ser añadido aquí, envíame un email solicitándolo.

Idea: Juanjo Navarro

Diseño: Albin

Picando Código

Mi primer consola Sega: Sega Genesis

Marzo 18th, 2011 - [Enlace local]

Mi “familia de consolas”, consta de consolas exclusivamente Nintendo. Recordarán en los años 90, la intensa guerra de las consolas, donde Nintendo y Sega, Mario y Sonic, eran enemigos acérrimos. Era una época más sencilla, donde 16 bits eran suficientes, y no necesitábamos polígonos o tercera dimensión para disfrutar de nuestros videojuegos.

El fanboyismo que al que algunos aluden en mí hacia el software libre y GNU/Linux, era en su momento hacia la familia de videojuegos y consolas Nintendo. Era de los que discutía porqué Nintendo era mejor, el NES contra el Master System, y ya la violencia del Sega Mega Drive/Genesis contra el Super Nintendo. Siempre comparando títulos, y en su momento conociendo las tecnologías y accesorios de cada consola.

Nintendo vs. Sega

Nintendo vs. Sega

Uno se vuelve viejo y estas cosas van olvidándose. Incluso vimos en el Wii juegos con Mario y Sonic juntos, cosa que en esos años hubiera sido inpensable. Pero Sega decidió que no podía vencer a Nintendo, así que decidió hacerse a un lado del mercado de fabricación de Hardware, y hoy día crean juegos para las demás plataformas.

Toda esta leve introducción viene a que acabo de comprar mi primer consola Sega. Se trata de un Sega Mega Drive o Genesis. Creo que ya he comentado que uno de mis pasatiempos es lurkear sitios de subastas en busca de oportunidades en videojuegos y otros artículos de colección. Recientemente me encontré (quién sabe cómo, nunca entro a las secciones de Sega) con un Genesis a buen precio.

Lo primero que hice fue averiguar la diferencia entre Genesis y Mega Drive. Tras un poco de investigación (pasando por Gaming StackExchange) esto es lo que encontré:

Encontré un gran recurso en Sega Genesis / Mega Drive 101: A begginners guide de racketboy.com. El nombre es un tema de marca, la consola es Megadrive, pero se llamó Genesis en América del Norte ya que el nombre ya había sido registrado.

Hay 3 variaciones de la Megadrive, ambas compatibles en cuanto a los cartuchos (según la región, como pasaba con todos). Sin embargo, el modelo 2 (el que compré) es el mas fácil de modificar en caso de querer “destrabarlo”. Supuestamente esta consola cuenta con la mayor cantidad de variaciones licenciadas, pueden ver un artículo entero al respecto en Wikipedia: Variations of the Sega Mega Drive.

Sega Genesis

Sega Genesis

El último artículo de colección que compré fue mi Atari 65 XE, y particularmente en las consolas, esta es la “nueva” desde el Nintendo DS.

Mega Turrican

Mega Turrican

El Sega Genesis venía con Fifa International Soccer de regalo, y compré además Ghosts N’ Goblins y Mega Turrican. Ya me colgué a jugar Mega Turrican. Lo interesante de este juego es que tengo también Super Turrican (la versión de Super Nintendo) y es un juegazo. Comprobé que técnicamente, que haya notado hasta el momento, el Genesis tiene las mismas capacidades que el SNES.

Ambos (Mega y Super) Turrican son excelentes juegos de acción. Están basados en un viejo Turrican de Commodore 64. Tiene algunos elementos al estilo Metroid, pero combina elementos de shooter y plataforma. Su banda sonora es impresionante, y está compuesta por Chris Hülsbeck. En su época jugué mucho al Super Turrican hasta darlo vuelta más de una vez. Es bastante entretenido, y hay varios secretos por descubrir en cada nivel. Probablemente pase por lo mismo con esta “nueva” instancia.

Desde los 90′s, no han habido más juegos de Turrican, aunque quedaron cancelados por el camino varios proyectos (incluyendo una versión 3D). Veremos si más adelante se concreta algo con esta saga, además del juego indie para Windous: Hurrican.

¡Lo que me queda ahora es conseguir los juegos de Sonic! También Comix Zone, y más exclusivos de Sega que nunca jugué con mis Nintendos… (¿Mortal Kombat 1 con sangre? :P ) Acepto recomendaciones.

Comparte: Twitter Identi.ca del.icio.us Google Bookmarks BarraPunto Bitacoras.com Tumblr Print Facebook

» Leer más, comentarios, etc...

Cerebro en la Sombra » Técnico

Mi primer webservice en PHP (chispas)

Marzo 17th, 2011 - [Enlace local]

Tras mucho tiempo consumiendo webservices de otros me ha tocado crear mi primer servidor SOAP en PHP y, la verdad, me ha parecido realmente sencillo e intuitivo. Creas una clase con los métodos que vas a exponer en el ws y se crea automáticamente el servicio sobre ellos, tan sencillo como eso.

  1. $wsdl="miclase.wsdl";
  2. $soap = new SoapServer($wsdl);
  3. $soap->setClass(‘MiClase’);
  4. $soap->handle();
  5.  
  6. //clase que gestiona el ws
  7. class MiClase {
  8.     public function MiClase(){
  9.       //tu código
  10.     }
  11.  
  12.     /**
  13.      *
  14.      * @param string $email
  15.      * @return string
  16.      */
  17.     public function is_email_available($email){
  18.         //tu codigo…
  19.         return "OK";
  20.     }
  21.     /**
  22.     *
  23.     * @param string $phone
  24.     * @param string $email
  25.     * @return string
  26.     */
  27.     public function register_user($phone, $email){
  28.        //tu codigo…
  29.        return "OK";
  30.     }
  31.     /**
  32.     *
  33.     * @param string $phone
  34.     * @return string
  35.     */
  36.     public function downgrade_user($phone){
  37.        //tu codigo…
  38.        return "OK";
  39.     }
  40. }
  41. ?>

Con esto se crea automáticamente nuestro webservice con los tres métodos públicos. Pero espera, falta algo, arriba de todo defines un “miclase.wsdl“. ¿Qué es eso? ¿De dónde sale?

En efecto, ese es el principal problema al crear un webservice SOAP con PHP, no se genera el WSDL automáticamente sino que hay que escribirlo ¡a mano!. Para solucionarlo tenemos la librería PHP WSDL Generator a la que únicamente debemos pasarle la clase de la que queremos extraer el WSDL y lo hace por nosotros icon smile Mi primer webservice en PHP (chispas) . Para que todo funciona bien es necesario que los métodos de nuestra clase estén bien documentados tal y como aparecen en el ejemplo anterior, de esta manera WSDL Generator sabrá configurar los tipos de datos de los parámetros de entrada y salida de los métodos.

Veamos un ejemplo:

  1. require_once("wsdl2php/WSDLCreator.php");
  2. $test = new WSDLCreator("miclase", "http://ws.tudominio.com/wsdl");
  3. $test->addFile("miclase.php");
  4. $test->setClassesGeneralURL("http://tudominio.com");
  5. $test->addURLToClass("MiClase", "http://ws.tudominio.com/miclase.php");
  6. $test->ignoreMethod(array("MiClase"=>"MiClase"));
  7. $test->createWSDL();
  8. $test->saveWSDL(dirname(__FILE__)."/miclase.wsdl", false);
  9. ?>

Este pequeño código nos generará el archivo WSDL de nuestro webservice. Como veis simplemente le indicamos el archivo con nuestra clase (el que escribimos anteriormente), la clase que queremos mapear con la URL del webservice (el endpoint) y, además, le indicamos que ignore el constructor de la clase ya que no será un método de nuestro webservice. Eso es todo.

Si ahora probamos el servicio web, por ejemplo desde el Web Service Explorer de Eclipse:

wseclipse Mi primer webservice en PHP (chispas)Tras darle la ruta del wsdl, http://ws.tudominio.com/miclase.php?wsdl, veremos los tres métodos que hemos expuesto y podremos probarlos y utilizarlos.

Nunca había tenido la necesidad de crear un servidor SOAP pero ha sido realmente sencillo. Ahora estoy buscando la manera de devolver tipos de datos complejos, pero eso será en el próximo capítulo icon razz Mi primer webservice en PHP (chispas) .

» Leer más, comentarios, etc...

xailer.info (esp)

Actualización de Xatris

Marzo 17th, 2011 - [Enlace local]

Desde la publicación de los componentes TRoundButton (actualizado aquí) y TFormShape tenía ganas de hacerle un lavado de cara al viejo Xatris y, de paso, incluir algunas mejoras como la selección del nivel de dificultad, soporte de multiidioma mejorado, skins, música machacona mientras se juega, etc.

El caso es que tenía que haber publicado esta actualización hace mucho pero entre la falta de tiempo unas veces y la falta de ganas otras…

xatris2.PNG

Traducciones
La mayoría de las traducciones ya estaban hechas para la primera versión y algunas de las nuevas (italiano, portugués, etc.) las he hecho tirando del servicio de traducción de Google por lo que seguramente habrá alguna que necesite correcciones. (Agradezco los comentarios para indicar errores de traducción y si incluyen la corrección, mucho mejor).

Si alguien quiere tener una versión en un idioma que no esté soportado, puede traducir el archivo Strings.es o Strings.en y ponerlo aquí o en nuestro foro y enseguida publicaré una versión actualizada.

Créditos
Muchas gracias a Fernando Leal por su ayuda con los skins.

Descargar Xatris2.zip

» Leer más, comentarios, etc...

Cerebro en la Sombra » Técnico

Migrando de Symbian a Android manteniendo guía, agenda y mensajes

Marzo 16th, 2011 - [Enlace local]

Finalmente llegó el momento. Tras casi diez años de teléfonos Nokia casi ininterrumpidamente (salvo por un Siemens y un SonyEricsson), los últimos seis con terminales Symbian s60, ha llegado el momento de cambiar y, como no podía ser de otro modo, el destino es un flamante Android, el Google Nexus S fabricado por Samsung y con Android 2.3.

nexus Migrando de Symbian a Android manteniendo guía, agenda y mensajes

La transición no ha sido complicada, pero pasar todos los datos de tu teléfono anterior al nuevo tiene su miga si no quieres perder nada. Aquí os explico como conseguí tener mi nuevo Nexus al día en un par de horas.

Guía de contactos

Los contactos de un teléfono Android se sincronizan con los de la cuenta de Google asociada al teléfono, los que tengas en tu cuenta de Gmail, así que así es como pasaremos nuestra agenda, copiándola a Gmail.

Desde la guía seleccionamos Opciones->Marcar->Marcar todos y después Opciones->Backup->A la tarjeta de memoria.

nokia0 225x300 Migrando de Symbian a Android manteniendo guía, agenda y mensajes nokia1 225x300 Migrando de Symbian a Android manteniendo guía, agenda y mensajes

Esto nos creará en la tarjeta de memoria la ruta Others/Contacts con los .vcf de todos nuestros contactos. Conectamos ahora el teléfono por usb al ordenador y copiamos esta carpeta en, por ejemplo, c:\. Desde la línea de comandos vamos a c:\Contacts y ejecutamos:

cd c:\contacts
copy /B *.vcf contactos.vcf

Con esto tendremos todos los contactos en un solo archivo y podremos importarlos directamente en Gmail desde Contactos->Más acciones->Importar. Escogemos este archivo “contactos.vcf” y nuestros contactos se añadirán a nuestra cuenta de Gmail y se sincronizarán automáticamente con nuestro teléfono.

Citas y eventos

Para las citas y eventos del calendario, debemos sincronizarlos con Google Calendar. Para ello primero, desde Ovi Suite sincronizamos la agenda con nuestro Outlook y posteriormente nos descargamos Google Calendar Syn que nos permitirá sincronizar nuestro calendario de Google con el de Outlook. Tendremos que introducir nuestra cuenta de Google y el sentido de sincronización que más os convenga.

calendarsync 281x300 Migrando de Symbian a Android manteniendo guía, agenda y mensajesAutomáticamente aparecerá la lista de tareas y eventos en vuestro teléfono. Puedes dejar el programa de sincronización corriendo en tu ordenador y tendrás siempre sincronizados los calendarios de tu teléfono y de Outlook.

Mensajes

Esta parte es un poco más complicada. Yo seguí este procedimiento y me funcionó todo correctamente, en unos minutos tenía mis 800 mensajes en el teléfono nuevo.

Archivos de fotos y vídeos

Esta es la parte más fácil, las fotos, vídeos, música, etc. que tenías en tu teléfono Symbian los copias por USB del viejo al nuevo, no hay más truco.

Tono de llamada

Soy un poco tiquismiquis y llevo en el móvil el mismo tono de llamada desde hace muchos años, Narcotic de Liquido, me gusta porque empieza suave y a los 25 segundos mete caña icon razz Migrando de Symbian a Android manteniendo guía, agenda y mensajes . Tras copiar el mp3 al nuevo teléfono me di cuenta de que no hay una opción para configurar el tono en las opciones del teléfono, lo que hay que hacer es reproducir el mp3 desde el reproductor de música y en ese momento dar al botón de opciones y escoger Utilizar como tono.

Tono de alarma

Los tonos de alarma se configuran para cada alarma que creemos, no es genérico. El problema está en que por defecto no nos deja escoger más que entre los tonos de alarma que trae predefinidos y aquellos que hemos seleccionado previamente como tono de llamada, así que, la forma más rápida de poner el tono de alarma que queremos es ponerlo primero como tono de llamada desde el reproductor de música tal y como veíamos en el paso anterior, de este modo ya podremos seleccionarlo como tono de alarma.

Tras un par de horas mi nuevo teléfono estaba preparado para utilizar sin echar de menos nada de lo que tenía en el viejo. Eso sí, ahora vienen horas y horas de perder el tiempo toqueteando y jugueteando icon razz Migrando de Symbian a Android manteniendo guía, agenda y mensajes .

» Leer más, comentarios, etc...

Arragonán

No todos los programadores son iguales

Marzo 15th, 2011 - [Enlace local]

Leía anoche el post de mi amigo (y gran profesional :) ) Carlos Ble, ¿Todavía crees en los mitos?. La verdad que mientras lo leía me encontraba con sentimientos encontrados, en cierto modo entiendo por donde van los tiros respecto al exceso de expectativas que a veces generan las celebrities del software (entiéndase por desarrolladores, que por alguna razón, son conocidos en algunos círculos) a su alrededor de forma voluntaria o involuntaria.

Me viene a la mente una conversación que tuve hace 2 o 3 años con Alberto Molpeceres, que se hizo muy conocido por ser fundador de javaHispano. De algo parecido a lo que comenta Carlos en su post, que por la visibilidad que había conseguido por ser el fundador de esa gran comunidad de desarrolladores, se había encontrado por parte de algunos programadores un trato de algo parecido a un gurú/celebrity, cosa con la que él tampoco se sentía nada identificado.

Sé que conversaciones de este tipo las he tenido con más gente además de con Carlos y Alberto, pero disculpad que ahora mismo no recuerde nombres concretos :P

Está claro que por el hecho de alguien sea conocido, no quiere decir que sea un guía espiritual que va a resolver todos tus problemas como por arte de magia, igual que tampoco tiene que ser necesariamente mejor que otro que no sea conocido (sí, como en cualquier otra profesión). Aunque hay que tener en cuenta que si alguien se expone ante gente de su gremio, a las críticas o alagos que puede suponer eso, seguramente un paquete tampoco será :D

Pero hay una cosa que se desprende del post de Carlos, hablando de que todos somos iguales, cosa con la que no podría estar nunca de acuerdo. Se suele decir que 1 buen programador es unas 10 veces más productivo que uno mediocre(no recuerdo quién es el autor de esta afirmación), y si el programador bueno resulta ser un fuera de serie la diferencia puede ser aún más exagerada! Mi humilde experiencia también me dice que los proyectos salen mejor de pequeños equipos con gente buena y motivada(o no-desmotivada).

Code Ninja

Como podéis ver, también creo que entre buenos programadores hay algunos que están por encima de otros. Aunque no me sienta capaz de ponerme a hacer rankings ni nada por el estilo, sí que hay gente con la que he trabajado que tengo la sensación de que están por encima de otros, que son auténticos cracks(algunos los llamarían ninjas).

Eso sí, todos los buenos programadores que conozco a los que admiro y tomo de algún modo como referencias, lo son porque además de atesorar mucho talento, se han ido preocupando de mejorar sus conocimientos y habilidades con el tiempo… y eso que casi todos son conscientes de que son buenos! :D

En fin, que ni por ser una celebrity vas a saber de todo y solucionarás los problemas mágicamente; ni todo el mundo tiene el mismo talento, capacidad de trabajo y de cintura para ser mejores programadores (cámbiese programadores por cualquier otro oficio).

» Leer más, comentarios, etc...

Picando Código

Semana del conocimiento del cerebro 2011

Marzo 15th, 2011 - [Enlace local]

Leí sobre esta iniciativa en el diario, y me pareció bastante interesante. Se trata de una semana dedicada al conocimiento de nuestro procesador central, ese que tantos misterios oculta por el momento, y denominamos “cerebro”.

Comparto con ustedes la iniciativa de la Sociedad de Neurociencia del Uruguay:

La semana del conocimiento del cerebro es una campaña global que promueve la divulgación sobre el progreso y los beneficios de la investigación del cerebro. Cada año en el mes de marzo, se unen esfuerzos mundiales de hospitales, universidades, agencias gubernamentales y otras organizaciones para desarrollar actividades de difusión durante una semana. Fundada y coordinada por la Dana Alliance for Brain Initiatives and European Dana Alliance for the Brain, se celebrará su décimosexta semana en el corriente año entre el 14 y el 18 de Marzo.

La Sociedad de Neurociencia de Uruguay, propone un conjunto de actividades para la Semana del Conocimiento del Cerebro que incluye un ciclo de conferencias dictadas por miembros de la comunidad Neurocientifica nacional e internacional, stands con juegos interactivos, una exposición fotografica sobre el trabajo en investigación de Neurociencia y la entrega de material gratuito a los concurrentes. Estas actividades se están planificando de manera descentralizada, en las Facultades de Ciencias y Medicina y los Institutos Clemente Estable y Pasteur. La propuesta de la SNU ha sido aceptada por la Dana Foundation y publicada en su calendario internacional.

Semana del conocimiento del cerebro 2011

Semana del conocimiento del cerebro 2011

Para quienes conozcan el programa de televisión Proyecto G, emitido en Televisión Nacional, el Miércoles hay una charla del Dr. Diego Golombek, conductor del programa. Uno de los presentadores “conocidos” para el público general. Además habrán científicos importantes nacionales e internacionales, doctores de la Facultad de Ciencias y Medicina de la UDELAR, la Universidad Autónoma de Madrid y el Department of Neuroscience, Albert Einstein College of Medicine de Nueva York.

Una iniciativa muy interesante para conocer un poco más sobre nuestros cerebros y la pasión que nos lleva a estudiarlo.

Por más información sobre las actividades, pueden entrar al sitio de la SNU, y la página con la agenda completa.

Comparte: Twitter Identi.ca del.icio.us Google Bookmarks BarraPunto Bitacoras.com Tumblr Print Facebook

» Leer más, comentarios, etc...

Cerebro en la Sombra » Técnico

Valenbisi para Blackberry ya en la App World

Marzo 15th, 2011 - [Enlace local]

Finalmente ya está disponible la aplicación para Blackberry de mi proyecto Valenbisi para móviles en la tienda oficial, la Blackberry App World. Lo último que os había comentado es que no iba a ser posible ya que RIM exigía un documento firmado ante notario dando fé de que tú, el futuro vendedor, eras quien decías ser y, como os imaginareis, no estaba yo dispuesto a ese gasto icon razz Valenbisi para Blackberry ya en la App World , así que la estaba distribuyendo yo mismo directamente a aquellos que entraban desde el navegador de su dispositivo. Se han hecho cerca de cien instalaciones de la aplicación de esta manera lo que me parece que no está nada mal teniendo en cuenta que es el usuario el que te encuentra a tí.

Ahora, sin embargo, todo ha cambiado. RIM ha rectificado su política de autenticidad notarial, me imagino que muchas solicitudes se habrán quedado a mitad de camino sin completar el último paso. El viernes pasado recibí un email donde me indicaban que tenía pendiente completar el último paso pero que ahora ya no era necesario un documento notarial sino que con una copia de un documento oficial, por ejemplo el DNI, sería suficiente. Dicho y hecho, 4 días es lo que costó finalizar el proceso: subir la aplicación, pasar los controles de calidad y que la publiquen. Desde hoy mismo está online. Podéis verla aquí.

Desde una BlackBerry podéis acceder desde el icono de la App World buscando “valenbisi“:

bb appworld 225x300 Valenbisi para Blackberry ya en la App World

Y este es el resultado:

bb appworld1 225x300 Valenbisi para Blackberry ya en la App World

A ver si tiene un éxito parecido al de la versión Android que lleva ya ¡más de mil descargas!.

» Leer más, comentarios, etc...

Variable not found

LabelFor() localizado en ASP.NET MVC 3

Marzo 15th, 2011 - [Enlace local]

ASP.NET MVCComo sabemos, en MVC 2 y MVC 3 el atributo [DisplayName] nos permite especificar en cada propiedad de las entidades del Modelo un nombre descriptivo que, entre otras cosas, es utilizado como etiqueta en formularios si empleamos el helper Html.LabelFor().



Así, dada una clase del Modelo como la siguiente:

public class Persona
{
    [DisplayName("Nombre completo")]
    public string Name { get; set; }
 
    [DisplayName("Edad actual")]
    public int Age { get; set; }
}
si implementamos una vista de edición sobre ella similar a la mostrada a continuación, vemos el resultado que obtendríamos en tiempo de ejecución:



Vista de edición y resultado en tiempo de ejecución

Este mecanismo resulta muy cómodo y útil la mayoría de las veces, sin embargo, cuando estamos desarrollando sitios multiidioma, rápidamente vamos a encontrarnos con que este enfoque no es suficiente, puesto que asocia una única descripción textual a la propiedad independientemente de la cultura activa.



A diferencia de otros atributos como las anotaciones de validación, DisplayName no incorpora ninguna forma para indicar una referencia hacia el recurso localizado, es decir, identificar el tipo (la clase) que representa al archivo de recursos (.resx) donde se encuentra la traducción del término, así como la propiedad o clave en la que lo encontraremos. Por ejemplo, el data annotation [Required] permite hacerlo de la siguiente forma:

[Required(
    ErrorMessageResourceName="NombreObligatorio", 
    ErrorMessageResourceType=typeof(Resources.Textos)
)]
public string Name { get; set; }
Ahora bastaría con crear la carpeta App_GlobalResources un archivo de recursos llamado “Textos.resx” (obviamente el nombre puede ser cualquiera, siempre que coincida con el referenciado en el parámetro ErrorMessageResourceType anterior), e introducir en él la clave “NombreObligatorio” con su correspondiente valor. Para añadir la traducción al inglés, bastaría con hacer lo mismo sobre el archivo Textos.en.resx, y así sucesivamente.



Archivos de recursos



Afortunadamente, a partir de ASP.NET MVC 3 podemos utilizar la anotación Display, disponible en System.ComponentModel.DataAnnotations a partir de la versión 4 del framework, de la siguiente forma:

[Display(Name="Nombre", ResourceType=typeof(Resources.Textos))]
public string Name { get; set; }
Como podréis intuir, el parámetro Name indica la clave del recurso incluido en la clase especificada en ResourceType.



Sin embargo, el uso de este atributo requiere que los elementos del archivo de recursos sean de acceso público, y no interno, como son por defecto cuando creamos los .resx en App_GlobalResources. Si no tenemos en cuenta este aspecto, podemos encontrarnos con un error como el siguiente:

Cannot retrieve property 'Name' because localization failed.  Type 'Resources.Textos' is not public or does not contain a public static string property with the name 'Nombre'.

Ante este error, tenemos varias fórmulas para conseguir acceso a los recursos localizados:

Pero si ninguna de ellas nos convence, o bien estamos todavía trabajando con MVC 2 y .NET 3.5SP1, todavía tenemos otra posibilidad:

[LocalizedDisplayNameAtribute]

Es realmente sencillo implementar un atributo que nos permita conseguir algo parecido a lo descrito anteriormente. Simplemente heredando de DisplayNameAttribute y sobrescribiendo su propiedad DisplayName podemos hacer que su valor sea tomado desde los recursos de la aplicación:

public class LocalizedDisplayNameAttribute : DisplayNameAttribute
{
    private readonly string _resourceName;
    public LocalizedDisplayNameAttribute(string resourceName)
    {
        _resourceName = resourceName;
    }
 
    public override string DisplayName
    {
        get { return Resources.Textos.ResourceManager.GetString(_resourceName); }
    }
}
Archivos de recursosObservad que para simplificar la sintaxis de uso y su implementación, estamos asumiendo que los recursos se encuentran en Resources.Textos, la clase generada automáticamente a partir del archivo Textos.resx.



De esta forma, ahora decoraremos las propiedades del modelo no con el texto que queremos que aparezca en pantalla, sino con la clave del recurso, y dado que la clase de recursos está definida en el atributo, no será necesario indicarla:

public class Persona
{
    [LocalizedDisplayName("Nombre")]
    public string Name { get; set; }
 
    [LocalizedDisplayName("Edad")]
    public int Age { get; set; }
}
Y por si os resulta de interés, he dejado un proyecto de demostración de este atributo en Skydrive.



Publicado en: Variable not found.



» Leer más, comentarios, etc...

MadeInFlex

Clear Toolkit ahora con soporte para Spring

Marzo 15th, 2011 - [Enlace local]

Tal como habiamos anunciado Farata Systems ha liberado una nueva versión de su herramienta Clear Toolkit, esta vez con soporte para Spring.

Durante la creación del proyecto se puede elegir si se incluye soporte para Spring o no, y en tal caso todas las clases generadas se cargan como beans gestionados por el contenedor y se hacen disponibles a la aplicaciopn flex a traves del paquete de integración de Spring con BlazeDS.

El proyecto sigue hospedado en sourceforge, pero ahora estrena un nuevo sitio con toda la documentación necesaria para comenzar a usar esta herramienta.

» Leer más, comentarios, etc...

xailer.info (esp)

Componente TGroupLine

Marzo 14th, 2011 - [Enlace local]

A veces es necesario separar visualmente los controles en un formulario y aunque el control TGroupBox es una solución, no es el más adecuado si sólo se necesita definir la separación entre grupos de controles.

Para conseguir este efecto se podría utilizar un TBevel o un TLabel personalizado pero lo mejor es diseñar un control que pueda ser reusado de forma sencilla en cualquier aplicación.

groupline.png

Este nuevo control es idéntico en funcionalidad a TGroupBox, pero puede utilizarse de dos maneras diferentes: como un simple separador o como un separador contenedor de controles.

En esta imagen, el control se muestra con su altura por defecto y puede apreciarse que sirve como separador de grupos de controles:

groupline1.png

Mientras que en esta otra, tras haber alterado su altura, se han añadido los controles Label y Edit que ahora están dentro del área del control:

groupline2.png

Este modo de uso del separador es más flexible puesto que permite cambiar su posición en el formulario y la de todos los controles hijos.

En ejecución, la apariencia será la misma:

groupline3.png

En el ZIP se encuentra la librería y la DLL para Xailer 2.

» Leer más, comentarios, etc...

Picando Código

¡Feliz día de Pi y cumpleaños de Einstein!

Marzo 14th, 2011 - [Enlace local]

¡Feliz día de Pi!

Hoy 14 de marzo (3/14 en los calendarios americanos) es el día de Pi, así como el día del cumpleaños de Albert Einstein.

Para “celebrar” el número Pi, les dejo este video llamado “What Pi Sounds Like”. Es una interpretación musical del número Pi hasta 31 decimales, logrando un resultado más que interesante:

Comparte: Twitter Identi.ca del.icio.us Google Bookmarks BarraPunto Bitacoras.com Tumblr Print Facebook

» Leer más, comentarios, etc...

MadeInFlex

Actualización 10.2 del Flash Player para dispositivos mobile

Marzo 14th, 2011 - [Enlace local]

Anunciamos que a partir del 18 de marzo estará disponible en Android Market la actualización del Flash Player a la versión 10.2. Esta versión está pensada para Android 2.2 (Froyo) y 2.3 (Gingerbread). Hay una versión beta para Android 3.0 (Honeycomb), que requiere la actualización 3.0.1 del sistema operativo de las tablets.

Que apreciaremos en nuestros dispositivos Android con Flash Player 10.2:

Para ver los dispositivos que pueden usar 10.2 está este link.

» Leer más, comentarios, etc...

carlosrovira.com

Nueva Web en Codeoscopic!

Marzo 14th, 2011 - [Enlace local]

Como se nota que en Codeoscopic hemos estado inmersos en un año de mucho trabajo, retos y fuertes apuestas empresariales. Tengo este blog muy abandonado, así como otros medios, pero hay épocas en las que hace falta pararse, pensar en el futuro y trabajar por esos nuevos retos que nos planteamos.

Ahora es momento de empezar a sacar a la luz muchos temas:

Nueva Web de Codeoscopic

Evidentemente una entrada de blog no da para mucho más y tampoco conviene , después de un periodo largo de inactividad, provocar un empacho de noticias, pero si que es cierto, que es una nueva etapa llena de proyectos, retos e ilusión y esperamos que sea tan apasionante como las anteriores.

Seguimos conversando en los próximos días! :)

» Leer más, comentarios, etc...

Variable not found

Enlaces interesantes 34

Marzo 13th, 2011 - [Enlace local]

Estos son los enlaces publicados en Variable not found en Facebook y Twitter desde el lunes, 07 de marzo de 2011 hasta el domingo, 13 de marzo de 2011.



Espero que te resulten interesantes. :-)

Y no olvides que puedes seguir esta información en vivo y en directo desde Variable not found en Facebook, o a través de Twitter.



Publicado en: Variable not found



» Leer más, comentarios, etc...

Bitácora de Javier Gutiérrez Chamorro (Guti)

AOMEI Partition Assistant

Marzo 12th, 2011 - [Enlace local]

Desde los tiempos de Partition Magic, que dejó de ser mantenido hace 7 años, y era incompatible con las últimas versiones de NTFS, que no me topaba con una herramienta de gestor de particiones que llamara mi atención.Sin embargo, el desconocido Partition Assistant de AOMEI Technology, ha sido el reemplazo natural.De igual modo que que versiones recientes de Windows, permiten reducir y extender particiones de discos, tanto FAT32 como NTFS. Sin embargo, Partition Assistant, va más allá permitiendo moverlas, unirlas y partirlas, sin pérdida de datos.El interfaz Windows es sencillo de utilizar, y nos permite fácilmente realizar la o las tareas que necesitemos, que acaban siendo ejecutadas durante el siguiente arranque. Dichas operaciones, se hacen a una velocidad razonable (ni rápidas, ni lentas), y con una interfaz de usuario simple, pero suficiente.Se ofrece en diferentes ediciones, la Home que es gratuita, la Professional que sale por 29$ y añade compatibilidad con sistemas operativos x64, la Server que vale 99$, y añade compatibilidad con Windows Server, y luego la Unlimited por 269 $ y la Technician por 469 $.No está traducido al castellano, pero es la herramienta de gestión de particiones, probablemente más compacta que puedas encontrar, con un paquete instalador [...]

» Leer más, comentarios, etc...

Cuaderno de software

Cómo mejorar la velocidad del siguiente proyecto

Marzo 12th, 2011 - [Enlace local]

Disclaimer: este post es simplemente una serie de apuntes que hago en mi cuaderno como desarrollador. Me reservo mi derecho a editarlo y mejorarlo con el feedback que reciba y según vaya aprendiendo más. Por supuesto, siempre informando de ello y sin hacer trampas ;-)

Una vez establecido un proceso que permite medir la velocidad por iteración, uno se pregunta qué puede hacer para mejorarla iteración a iteración. Listar los impediments e ir eliminándolos, etc. Sin embargo, me gustaría reflexionar un poco en qué hacer para mejorar la velocidad del siguiente proyecto ( más concretamente uno que me toca empezar en nada).

Lo básico: el triángulo coste – tiempo – calidad:

Pero pasa que:

Ideaca: todo lo que no sea el proceso perfecto, es deuda técnica y hay que tratar de eliminarla.

¿Cuál sería el proceso perfecto? Esquemáticamente, sería algo como:

En definitiva, acercarse al mundo de la piruleta todo lo posible reduciría el tiempo que dedico a resolver incidencias y el que dedico a tareas repetitivas y eso mejoraría mi velocidad. Respecto a estas últimas puedo mejorar con:

Pero no todo es el proceso. También están las personas y las herramientas:

En la tradicional se hace toda una gestión de proveedores, etc. Yo he hecho algo muy sencillo: una lista con mis clientes, mis proveedores y mis herramientas. Es increíble porque a la primera no sacas todos (ni todos tus proveedores, ni todos tus clientes, ni todas tus herramientas). Una vez hecha, he tachado mi peor proveedor, mi peor cliente y mi peor herramienta.

Todo feedback será bienvenido… :-)


» Leer más, comentarios, etc...

xailer.info (esp)

Browses elásticos

Marzo 10th, 2011 - [Enlace local]

En Xailer, cuando usamos la propiedad nAlign o nAnchors a un browse, éste se ajusta dinámicamente a las dimensiones del formulario, pero no pasa lo mismo con su contenido, las columnas del browse.

Nunca me ha gustado mucho este comportamiento, así que tenía dos opciones: o quejarme amargamente porque no funcionaba como yo quería, o remangarme y cambiar su funcionamiento.

Y.. bueno… digamos que me quejo poco.

Este artículo está dividido en dos partes.

La primera está destinada para los que yo llamo pintores: aquellos que buscan nuevas mejoras para aplicar a sus programas y quieren aprender a utilizarlas, pero les dá igual cómo funcionan por dentro.

La segunda parte está destinada a los fabricantes de pinceles, que son los que están más interesados en cómo se construye la herramienta que en su uso definitivo.

Funcionamiento de los browses elásticos.

Lo primero será añadir un ArrayBrowse a nuestro formulario y cambiar la propiedad nAnchors a akTOPLEFTRIGHT.

Luego, completaremos es ArrayBrowse añadiendo las columnas necesarias.

Ya sólo nos queda añadir un puñado de líneas al dentro del programa

Nos creamos dos nuevos métodos Cargadatos() y ArrayBrowse1onsize() dentro de la definición de la clase

  1. CLASS TForm1 FROM TForm
  2.  
  3.    COMPONENT oArrayBrowse1
  4.    COMPONENT oArrayBrowse2
  5.    COMPONENT oArrayBrowse1Column5
  6.    COMPONENT oLabel1
  7.    COMPONENT oLabel2
  8.  
  9.    METHOD CreateForm()
  10.    METHOD FormShow( oSender )
  11.    METHOD ArrayBrowse1onsize( oSender )
  12.    METHOD ArrayBrowse1Create( oSender )
  13.    METHOD Cargadatos()
  14.  
  15. ENDCLASS

En el evento OnCreate del ArrayBrowse indicaremos lo siguiente

  1. oSender:aCols[2]:nPorcien := 25
  2. oSender:aCols[3]:nPorcien := 50
  3. oSender:aCols[4]:nPorcien := 25
  4. //                          ——-
  5. //                          100%

Donde le estamos diciendo al browse el % de la anchura de cada colunma elástica.

Las columnas 1 y 5, son de anchura fija, por lo cual no hace falta modificar la propiedad nPorcien

Ahora le definimos a la columna 2 una anchura mínima de 200 pixel. Si al cambiar de tamaño el browse, la columna 2 tiene una anchura menor de 200, la ocultará automáticamente.

  1. oSender:aCols[2]:nMinlen := 200

Por último, alimentamos el valor del evento OnSize del browse para que se ejecute en método ArrayBrowse1onsize

  1. oSender:OnSize := "ArrayBrowse1onsize"

En ArrayBrowse1onsize nos limitamos a llamar al método Pintar() del ArrayBrowse, que es el encargado de recalcular el tamaño de las columnas y mostrarlas dentro del browse

  1. METHOD ArrayBrowse1onsize( oSender ) CLASS TForm1
  2.    oSender:Pintar( oSender )
  3. retu nil

Por último, en el evento FormShow del formulario llamamos a CargaDatos(), para que rellene los valores del ArrayBrowse al mostrar el formulario

  1. METHOD FormShow( oSender ) CLASS TForm1
  2.    ::CargaDatos()
  3. RETURN Nil

Listo!, dale al play y a funcionar.

Si eres del tipo de los pintores, esto es todo amigo, ya hemos terminado.

Si eres de los fabricantes de pinceles, continúa leyendo, que te interesa lo que viene.

Para lograr nuestro efecto “elástico” en el ArrayBrowse, no he hecho otra cosa que jugar con dos de las clases de Xailer: TBrwColumn y TArrayBrowse.

Modificaciones a TBrwColumn

  1. CLASS TBrwColumn FROM XBrwColumn
  2. PUBLISHED:
  3.    PROPERTY nPorcien     INIT 0
  4.    PROPERTY nMinLen      INIT 0
  5. PROTECTED:
  6.    DATA nInitWidth
  7. PUBLIC:
  8.    METHOD Create( oParent ) CONSTRUCTOR
  9. ENDCLASS

Le he añadido 3 propiedades nuevas

nPorcien: % que tiene que ocupar cada una de las columnas elásticas dentro del browse. Las columnas con nPorcien=0 se comportan como las columnas de toda la vida

nMinLen: Tamaño mínimo de la columna a partir del cual la ocultaremos.

nInitWidth: Tamaño inicial de la columna

La propiedad nInitWidth la usa internamente el programa y guarda el tamaño inicial de cada columna. Es muy importante para el correcto funcionamiento de la clase que este dato no se pueda modificar desde fuera de la definición de la clase, por eso la hemos declarado como DATA Y PROTECTED.

Así, si intentamos hacer ::oArraybrowse1:aCols[4]:ninitWidth := 25 desde nuestros programas, Xailer nos dará un error.

Para poder guardar el valor de nInitWidth tenemos que sobrecargar el evento OnCreate de la clase, para ello, nos creamos nuestro propio método Create modificado

  1. METHOD Create( oParent ) CLASS TBrwColumn
  2.    super:Create( oParent )
  3.    ::nInitWidth := ::nWidth
  4. RETURN Self

Lo primero que hacemos es super:Create( oParent ), o sea, ejecutar el create de la clase original (XBrwColumn) para que genere el objeto correspondiente a cada columna.

Una vez creada la columna, guardamos el valor que tiene nWidth en ese momento, cuando aún no hemos empezado a jugar con la anchura de la columna

La segunda clase que he modificado es TArrayBrowse

Al igual que a TBrwColumn, le he añadido la propiedad  nInitWidth, que guardará el tamaño original del browse.

  1. CLASS TArrayBrowse FROM XArrayBrowse
  2. PROTECTED:
  3.    DATA ninitwidth
  4. PUBLIC:
  5.    METHOD Create( oParent ) CONSTRUCTOR
  6.    METHOD WMSize( nWParam, nLParam )
  7.    METHOD Pintar( oSender )
  8.    METHOD Porcion( nPixels, nPorcien )
  9.    EVENT OnSize( oSender, nSizeType, nClientWidth, nClientHeight )
  10. ENDCLASS

Además, he sobrecargado el método Create, he añadido dos métodos nuevos (pintar y porción) y he creado el evento OnSize, que inicialmente no existe en la clase TArrayBrowse.

Vamos a empezar por esto último, que personalmente es lo que más me ha llamado la atención.

Como ya hemos visto, en la definición de la clase preparamos el método WMSize y el evento OnSize

Luego, en el desarrollo de la clase en sí, basta con poner:

  1. METHOD WMSize( nWParam, nLParam ) CLASS TArrayBrowse
  2.    ::OnSize( nWParam, LoWord( nLParam ), HiWord( nLParam )  )
  3. RETURN Super:WMSize( nWParam, nLParam ) )

Y listo. No explico más de este método porque tamposo sé mucho más, ha sido Ignacio el que me ha dicho cómo hacerlo. Yo me he limitado a copiar y pegar.

El segundo paso es sobrecargar el método create.

  1. METHOD Create( oParent ) CLASS TArrayBrowse
  2.    super:Create( oParent )
  3.    ::nInitWidth := ::nWidth
  4.    ::Pintar( Self )
  5. RETURN Self

Al igual que hemos hecho antes en TBrwColumn, llamamos al create original, cargamos nInitWidth y, en este caso, llamamos al método pintar() para que nos dibuje por primera el browse elástico.

De los dos métodos que nos quedan, porcion() se encarga de calcular y traducir el ancho de la columna de porcentaje a pixels

  1. METHOD Porcion( nPixels, nPorcien ) class TArrayBrowse
  2.    RETURN nPixels * ( nPorcien / 100 )

Pintar() contine el corazon de la modificacion.

  1. METHOD Pintar( osender ) CLASS TArrayBrowse
  2. Local nColumnas := Len( oSender:aCols )
  3. Local nResto := oSender:nWidth – oSender:nInitWidth
  4. Local nPorcienOcultas := nAnchoOcultas := nColVisibles := 0
  5. Local n,a

nColumnas: cuántas columnas tiene el browse
nResto: El tamaño actura del browse menos el tamaño inicial, esto es, los pixels que nos sobran del browse y que hay que rellenar.
nPorcienOcultas: En caso de que una columna esté oculta, el % de la anchura de la misma, que luego tendremos que repartir entre las columnas visibles.
nAnchoOcultas: suma de la anchura inicial de las columnas ocultas.
nColVisibles : Número de columnas elásticas dentro del browse

Lo primero es saber cuántas columnas tenemos que mostrar y de qué anchura.

Para ello:

     Nos metemos en un bucle por cada una de las columnas
         Si es una columna elástica (nPorcien > 0)
            A la anchura inicial de la columna le sumamos los pixels
            correspondientes al % que ocupa la columna de la parte
            que nos sobra del browse (nResto)
           Si el resultado es menor que el nMinLen de la columna,
           la ocultamos.
                   Acumulamos la anchura y el porcentaje de la columna
                   oculta.como no se muestra,luego tendremos que
                   repartir estos valores entre las columnas visibles
            Si la columna es visible
                   Incrementamos el contador de columnas visibles
  1. FOR n := 1 TO nColumnas
  2.       IF oSender:aCols[n]:nPorcien > 0
  3.          a := oSender:aCols[n]:nInitWidth + ;
  4.                oSender:Porcion( nResto, oSender:aCols[n]:nPorcien )
  5.          IF !oSender:aCols[n]:lVisible := a > oSender:aCols[n]:nMinLen
  6.             nAnchoOcultas += oSender:aCols[n]:nInitWidth
  7.             nPorcienOcultas += oSender:aCols[n]:nPorcien
  8.          ELSE
  9.             nColVisibles ++
  10.          ENDIF
  11.       ENDIF
  12.    NEXT

Ahora ya sabemos:

-Cuántas columnas hay visibles ( nColVisibles)
-La suma del tamaño en pixels y el porcentaje que ocupan las columnas ocultas (nAnchoOcultas y nPorcienOcultas)

Nuestro siguiente paso será repartir el % que ocupan las columnas ocultas entre las columnas que son visibles, para que las columnas visibles ocupen el 100% del browse

  1. nPorcienOcultas := nPorcienOcultas / Max( nColVisibles , 1 )  // % a añadir a cada columna visible

También tenemos que sumar al espacio libre del browse el tamaño de las columnas que no se van a mostrar

  1. nResto := nResto + nAnchoOcultas

Ahora que ya sabemos las columnas que se van a mostrar y el espacio que nos queda libre, tan solo tenemos que ajustar cada columna a su tamaño.

      Por cada columna
              Si es elástica
                  anchura := su anchura original
                        + los pixel que corresponden a su porcentaje
                        + el porcentaje extra de las columnas ocultas (nPorcienOcultas)
  1. FOR n:= 1 TO  nColumnas
  2.       IF oSender:aCols[n]:nPorcien > 0
  3.          oSender:aCols[n]:nWidth := oSender:aCols[n]:nInitWidth + ;
  4.                 oSender:Porcion( nResto, oSender:aCols[n]:nPorcien + nPorcienOcultas )
  5.       ENDIF
  6.    NEXT

Y eso es todo, ni más ni menos.

Lo mismo que he hecho para el TArrayBrowse se puede hacer con el resto de browse.

Por último he de confesar que me considero pintor antes que fabricante de pinceles, así que, tiro la piedra y escondo la mano.

A ver si algún maestro de Xailer se anima y crea una colección de  controles “ElasticBrowse”

El código fuente lo tenéis en la sección de descargas

» Leer más, comentarios, etc...

xailer.info (esp)

Calltips

Marzo 10th, 2011 - [Enlace local]

En las últimas versiones de Xailer se han venido haciendo cambios internos en el IDE para adecuarlo a las mejoras que estamos desarrollando. Una de ellas es el soporte de calltips en el editor de código.

Las calltips son pequeñas ventanas que muestran los parámetros que recibe una función o procedimiento y sirven como guía de ayuda para introducir correctamente los argumentos al escribir código.

Para la nueva revisión de Xailer se ha reescrito totalmente el soporte de calltips para permitir calltips anidadas, resalte de parámetros y su personalización.

calltiphlt

En el siguiente vídeo puede verse cómo se va resaltando el parámetro mientras estamos escribiendo los argumentos de la función.

Calltip

Y en este otro, puede verse cómo se van mostrando las calltips de manera anidada cuando usamos una llamada a función como argumento de otra función.

Calltip 2

En el menú Opciones->Editor de código->Calltips es posible configurar todos los aspectos relacionados con el uso de las calltips:

La opción “Mostrar documentación de funciones” permite mostrar una calltip poniendo el puntero del ratón encima de una función y, al mismo tiempo, establecer el retardo en segundos para la aparición de la calltip.

La opción “Información detallada”, establece qué tipo de calltip se va a mostrar al poner el puntero del ratón sobre la función:

Calltip simple
calltip

Calltip detallada
calltipex

La aparición de las calltips, también puede forzarse poniendo el cursor de escritura en el nombre de una función o mientras se escribe el nombre de la función, usando el atajo de teclado Ctrl+Shift+Space.

También se pueden personalizar los colores de texto y fondo de las calltips y el color con el que se resaltan los argumentos de la función.

De momento, sólo están disponibles las funciones y procedimientos estándar de Clipper y las que incluye el propio Xailer aunque en próximas versiones se tendrá la posibilidad de añadir las funciones de nuestros propios proyectos o de librerías externas. De esta manera se evitarán múltiples visitas a los manuales y/o fuentes cuando tenemos dudas con la cantidad y tipos de parámetros que recibe una función.

» Leer más, comentarios, etc...

Fetishcode

Instalacion de JDeveloper 11.1.1.4 en Ubuntu 10.10 64 bits.

Marzo 9th, 2011 - [Enlace local]

A

» Leer más, comentarios, etc...

Arragonán

Taller de Grails en Madrid On Rails

Marzo 9th, 2011 - [Enlace local]

Supongo que algunos ya lo sabréis, este Viernes 11 de marzo a partir de las 16:00 voy a impartir un taller de Grails que ha organizado primerViernes.

El taller durará 4 horas, tiene un coste de 100€ y lo llevaremos a cabo en las instalaciones de Madrid On Rails.

El taller está enfocado a gente que ya conoce el framework y quiere acelerar su aprendizaje. En el taller veremos ejemplos en código y trabajaremos sobre distintos tipos de caché, plugins propios y de terceros, sistemas de colas… vamos, que NO va a ser introductorio.

¿Que aún no conoces primerViernes?

primerViernes es un grupo organizado para el lanzamiento de proyectos en Internet que se basa en la idea de “más hacer y menos hablar”.

Logo de Primer Viernes

Con esa declaración de intenciones, ya supondréis que soy simpatizante de este grupo que se concentra en Madrid, y con el que vemos un espíritu muy similar al que nos ha empujado a mover la iniciativa CachiruloValley en Aragón.

Además, habiendo estado en uno de los primerViernes, tengo la sensación que del grupo saldrán algunas empresas interneteras que van a dar guerra :)

» Leer más, comentarios, etc...

Variable not found

Lo que ocurre cuando desarrolladores diseñan interfaces de usuario (II)

Marzo 9th, 2011 - [Enlace local]

Hace muchos, pero muchos, años ya comenté por aquí un buen ejemplo de lo que ocurre cuando un desarrollador diseña el interfaz de usuario de una aplicación. También, ya más recientemente, profundizaba en este curioso tema en el post titulado Indicios de que tu interfaz de usuario fue creado por un programador.



Esta semana he vuelto a encontrar un ejemplo, creo que bastante ilustrativo, del fenómeno. La captura de pantalla pertenece a la herramienta gratuita Bulk Rename Utility, una utilidad imprescindible cuando necesitamos renombrar de forma masiva archivos en un directorio.



Bulk rename utility

Funcionalmente, ninguna pega, más bien todo lo contrario: es potentísima, e incluso una vez la has utilizado un poco resulta hasta fácil de manejar.



Ahora bien, a nivel de interfaz la primera impresión es una auténtica agresión al usuario. De hecho, hasta los propios autores se lo toman con filosofía, como podemos leer en el primer párrafo del tutorial de su web:

“You've installed the software, you've launched it, and you now see a million and one controls and boxes on the screen. The first thing to do is DO NOT PANIC!”
Pero vaya, como ya decía años atrás, el que esté libre de pecado que tire la primera piedra ;-)



Publicado en: Variable not found.



» Leer más, comentarios, etc...

Bitácora de Javier Gutiérrez Chamorro (Guti)

Natalie Portman

Marzo 9th, 2011 - [Enlace local]

Me dicen que Natalie Portman está de moda, no lo se, pero lo que si se, es que está guapísima, y sólo por eso merece la pena aparecer aquí. Nacida como Natalie Hershlag, y contando solamente 29 años, podemos considerarla ya una actriz madura. Probablemente si menciono a León el profesional, os venga a la [...]

» Leer más, comentarios, etc...

Joan Llenas at garnet.io :: Thoughts on software development

Embed de fuentes *.dfont y *.ttc con Flex4

Marzo 8th, 2011 - [Enlace local]

Normalmente incrustamos fuentes en formato independiente *.ttf y *.otf pero si se da la necesidad también podemos incrustar fuentes en formato contenedor *.dfont o *.ttc.
Mediante CSS es posible hacerlo de la siguiente forma:

PLAIN TEXT
CSS:
  1. @font-face {
  2.     src: url("Helvetica.dfont");
  3.     fontFamily: "Helvetica Regular";
  4.     fontStyle: normal;
  5.     fontWeight: normal;
  6.     embed-as-cff: true;
  7. }
  8. @font-face {
  9.     src: url("Helvetica.dfont");
  10.     fontFamily: "Helvetica Bold";
  11.     fontStyle: normal;
  12.     fontWeight: bold;
  13.     embed-as-cff: true;
  14. }

El procedimiento es el mismo que cuando embebemos una fuente *.ttf pero hay una punto a tener en cuenta, el atributo fontFamily debe ser exactamente el mismo que el nombre de la fuente incluyendo el estilo al que pertenece, es decir Bold, Oblique, Light, Regular, etc...

En el visor de fuentes de sistema se puede obtener esa información, por ejemplo en OSX se ve como en la imagen de la izquierda.
Por supuesto cualquier otro atributo que utilizado con fuentes individuales se puede utilizar para fuentes en formato contenedor, al fin y al cabo el compilador de Flex lo único que hace es extraer del contenedor las fuentes individuales que se utilizan y las incrusta en el bytecode del archivo swf.
Para utilizar la tipografía en otras declaraciones CSS se opera como con cualquier otra fuente individual:

PLAIN TEXT
CSS:
  1. @font-face {
  2.     src: url("Helvetica.dfont");
  3.     fontFamily: "Helvetica Bold";
  4.     fontStyle: normal;
  5.     fontWeight: bold;
  6.     embed-as-cff: true;
  7. }
  8. s|Button{
  9.     font-family: "Helvetica Bold";
  10. }

Dejo un ejemplo de uso para la fuente Helvetica completa empaquetada como *.dfont:

Descarga ejemplo

En el zip hay un proyecto Flex4 para Flash Builder.

Embed de fuentes formato *.dfont (5) - 774.32 kB
zip

» Leer más, comentarios, etc...

Variable not found

¿Firefox y Chrome van muy lentos usando el servidor web integrado en Visual Studio?

Marzo 8th, 2011 - [Enlace local]

Explorer-Firefox-ChromeYoy a comentar un problema que llevaba arrastrando meses, y que es realmente sencillo de solucionar. En este caso, se trata de un inconveniente muy molesto que encontramos cuando estamos depurando sitios web desde Visual Studio utilizando el servidor integrado (Cassini), en Windows 7.



Resulta que si utilizamos Internet Explorer en cualquiera de sus versiones todo funciona correctamente y a toda velocidad, pero la carga de páginas, imágenes y scripts en local se eterniza si estamos utilizando Firefox o Google Chrome.



Al parecer, en ambos casos se trata de un problema con la resolución de nombres del equipo en IPv6, que no es capaz de traducir de forma eficiente el nombre localhost. En Firefox se puede arreglar a nivel de aplicación, pero si queremos que todo vaya bien en Chrome habrá que modificar la configuración global del equipo.

about:configSolución en Firefox

Si sólo queremos corregir este problema en Firefox, debemos abrir la aplicación y teclear en su barra de direcciones “about:config”. Tras ello, lo primero será confirmar nuestra decisión de acceder a la configuración de la aplicación en la pantalla donde se nos informa de los mil y un peligros a los que nos exponemos al hacerlo.



A continuación en el filtro teclead “ipv6”, lo que provocará que en la lista de parámetros del sistema se quede únicamente el que nos permitirá desactivar la resolución de nombres, llamado network.dns.disableIPv6. Pues bien, en ese punto, simplemente hay que modificar su valor a true, haciendo doble clic sobre la fila:



Deshabilitando la resolución de nombres para IPv6



A partir de ese momento, y una vez reiniciada la aplicación, ya podremos acceder con Firefox a nuestras aplicaciones en local a toda velocidad.

Solución en Chrome y Firefox

El truco anterior no funcionará con Chrome, donde no he visto cómo desactivar la resolución de nombres en IPv6. Sin embargo, se puede corregir el problema editando editando el archivo hosts, disponible en la carpeta \Windows\System32\drivers\etc, que debe quedar como el siguiente:



Archivo hosts



Es decir, dejamos comentada con la almohadilla (#) la línea que resuelve localhost como “::1” (IPv6) y descomentamos la que lo resuelve como 127.0.0.1 (IPv4). Eso sí, ojo que poder salvar este archivo modificado debéis abrirlo con el bloc de notas o similar como administrador del sistema, en caso contrario no tendréis permisos de escritura. Una vez salvado el archivo, el problema habrá desaparecido.



Además, en este caso, dado que el cambio sobre el archivo hosts afecta a toda la máquina, también Firefox volverá a la normalidad, matando dos pájaros de un tiro, y haciendo innecesaria la utilización del primer método descrito :-)



Fuente:

Publicado en: Variable not found.



» Leer más, comentarios, etc...

MadeInFlex

Flash Player 10.3 Beta

Marzo 8th, 2011 - [Enlace local]

Fue hace relativamente poco que les habíamos contado de la disponibilidad de Flash Player 10.2 cuando el día de hoy se ha publica en labs una beta de Flash Player 10.3 con interesantes características enfocadas al desarrollo de aplicaciones y la protección de datos.

Dentro de dichas características se encuentran: Medición de Media, Cancelación Acústica, Integración con el control de privacidad del navegador, panel de control nativo, notificaciones de auto-actualización para Mac OS.

A continuación una breve descripción de dichas características:

Recomendamos entrar a Adobe Labs para descargar esta versión y empezar a probar las opciones incluídas.

» Leer más, comentarios, etc...

Información legal y técnica