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.
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.
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.
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?
) Acepto recomendaciones.
» 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.
-
-
$wsdl="miclase.wsdl";
-
$soap = new SoapServer($wsdl);
-
$soap->setClass(‘MiClase’);
-
$soap->handle();
-
-
//clase que gestiona el ws
-
class MiClase {
-
public function MiClase(){
-
//tu código
-
}
-
-
/**
-
*
-
* @param string $email
-
* @return string
-
*/
-
public function is_email_available($email){
-
//tu codigo…
-
return "OK";
-
}
-
/**
-
*
-
* @param string $phone
-
* @param string $email
-
* @return string
-
*/
-
public function register_user($phone, $email){
-
//tu codigo…
-
return "OK";
-
}
-
/**
-
*
-
* @param string $phone
-
* @return string
-
*/
-
public function downgrade_user($phone){
-
//tu codigo…
-
return "OK";
-
}
-
}
-
?>
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
. 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:
-
-
require_once("wsdl2php/WSDLCreator.php");
-
$test = new WSDLCreator("miclase", "http://ws.tudominio.com/wsdl");
-
$test->addFile("miclase.php");
-
$test->setClassesGeneralURL("http://tudominio.com");
-
$test->addURLToClass("MiClase", "http://ws.tudominio.com/miclase.php");
-
$test->createWSDL();
-
?>
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:
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
.
» 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…
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.
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.
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.
Automá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
. 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
.
» 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
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á
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).
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!
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.
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:
» 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
, 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“:
Y este es el resultado:
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]
Como 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:
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. 
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:
Ante este error, tenemos varias fórmulas para conseguir acceso a los recursos localizados: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'.
- la primera de ellos a lo bestia, accediendo a la clase generada desde el archivo de recursos (por ejemplo
Textos.Designer.cs) y cambiando los modificadores de la clase y sus miembros de “internal” a “public”. Obviamente, este cambio sólo nos vale hasta que se vuelva a generar el código , cosa que ocurrirá al modificar o añadir nuevas cadenas de texto, por lo que no es nada recomendable. - otra, sacar los recursos de la carpeta App_GlobalResources y moverlos a cualquier otra carpeta del proyecto (por ejemplo, /Recursos). Tras ello, en las propiedades del archivo .resx podemos modificar la “Herramienta personalizada” y establecerla a “PublicResXFileCodeGenerator” para asegurar su acceso público.
- una última sería crear ensamblados satélite, lo cual requiere la añadir un nuevo proyecto de biblioteca de clases en la solución, en el que introduciremos exclusivamente los archivos de recursos localizados.
[LocalizedDisplayNameAtribute]
Es realmente sencillo implementar un atributo que nos permita conseguir algo parecido a lo descrito anteriormente. Simplemente heredando deDisplayNameAttribute 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); }
}
}
Observad 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.

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:

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:

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:

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:
» 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:
- Aceleración hardware sobre video en el formato H.264 para Android 3.0.1+
- El pipeline de rendering Stage Video para tablets con Android 3.0. Los usuarios experimentarán una reducción del consumo de CPU y un mayor frame rate en contenido de video.
- Una mayor integración con el Android browser rendering engine (Android 3.0.1+)
- Mejora en el scrolling de webs
- Mejora del rendimiento en smartphones y tablets
- Mejora de la experiencia en dispositivos multi-core, procesadores que sacan provecho de la GPU para la reproducción de Flash, juegos y otros contenidos interactivos.
- Soporte automático para los soft keyboards
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:
- Por un lado la nuevo rumbo empresarial que coge Codeoscopic. Convirtiendose en una empresa de “producto” real, frente a los “servicios” y además, y gracias al profundo conocimiento interno del mundo de los seguros, verticalizando en este sector con dichos productos. Esto no quiere decir que dejemos otros servicios y otros sectores, pero sí que el peso estratégico de este sector dentro de la empresa será importante…
- Por esta razón tenemos nueva Web en Codeoscopic. Con los primeros contenidos, en los próximos días y semanas iremos publicando muchas más cosas para completarla.
- Además sacamos el primer producto de seguros llamado Direct Writer. Una plataforma completa para la gestión de entidades aseguradoras y agencias de suscripción. Un producto en el que hemos estado trabajando los últimos 2 años.

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. :-)
- Kristof Claes: Registering a namespace for all Razor views
Fecha: 10/03/2011 - Lanzado Google Chrome 10.
Fecha: 10/03/2011 - Creating PDF Documents with ASP.NET and iTextSharp.
Fecha: 10/03/2011 - José Manuel Alarcón: "Internet Information Server (IIS) Express y Visual Studio 2010 SP1"
Fecha: 10/03/2011 - MSDN Online: Visual Studio 2010 SP1 is now available for MSDN Subscribers.
Fecha: 09/03/2011 - John Katsiotis: Just blogged and uploaded a nuget package - Linked-In OAuth Library
Fecha: 09/03/2011 - Elijah Manor: "ASP.NET Sprites with MVC & Razor Helpers!"
Fecha: 09/03/2011 - Introducing Data Annotations Extensions.
Fecha: 09/03/2011 - Generating EF Code First model classes from an existing database. Via Scott Guthrie
Fecha: 09/03/2011 - DotNetCurry: "Output Caching Actions Gotcha in ASP.NET MVC 3"
Fecha: 09/03/2011 - David Ebbo: Using a custom build of MVC 3 ASP.NET MVC
Fecha: 09/03/2011 - campusMVP: ¡¡Acabamos de superar las 100.000 lecturas de nuestros artículos y libros en Scribd!! :-))
Fecha: 09/03/2011 - Interesante: Nuget package explorer.
Fecha: 09/03/2011
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:
- Más programadores: teóricamente, aumentando el gasto en recursos (programadores), aumentará la velocidad.
- Más tiempo: si le dedico más horas al día, haré más.
- Menos calidad: si me lo curro menos, tardaré menos.
Pero pasa que:
- a día de hoy no hay pasta para meter a más gente en el proyecto (ni contratar en nómina un compi de curro, ni meter más proveedores de los que ya tengo).
- ya le vamos a dedicar todo el tiempo disponible.
- intuitivamente, bajar la calidad implicará currar más en mantenimiento, no menos.
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:
- Los requisitos abstractos del cliente se trocean en user stories.
- Las user stories se agrupan en iteraciones.
- Las user stories de la iteración se especifican con test de aceptación.
- Los test de aceptación se implementan mediante TDD (y nada te molesta mientras ejecutas pomodoros de 25 mins).
- Refactor del código y todo sigue funcionando.
- Publicación de la user story en demo, mediante proceso totalmente automatizado (con un solo comando pones una nueva versión del código, la base de datos, y todos los servicios implicados ).
- Feedback del cliente y codificación del mismo.
- Publicación en producción automatizada.
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:
- Frameworks: ¿frameworks si o frameworks no? Pues frameworks si, pero sin hacer el tontolico. En mi caso Zend Framework, si no lo utilizo de la manera más acoplada, me ayudará con el MVC, autenticación y autorización, logueo, etc. Mi gran incorporación es Doctrine 2, un Data Mapper que espero que me ayude con todo el plumbing de la base de datos.
- Versioneo de la base de datos: ese dragón. A ver si con DbDeploy o las Doctrine Migrations por fin consigo hacer algo en este sentido. y automatizar esa parte de las puestas en producción.
- En el último proyecto que estoy terminando, reviso el código y sigo sin explicarme cómo todos los controllers (¡todos!) tienen las tres primeras lineas casi iguales. ¿Cómo puede ser que tras copiar y pegar N mil veces las mismas lineas, no me haya parado a pensar que tiene que existir alguna solución (probablemente algún patrón de diseño, de los más sencillicos) que me evite hacerlo? Los controllers son clases. Las clases deben tener una única responsabilidad, etc, etc.
- Que nada me impida hacer unit testing. En el último proyecto, tengo una buena cantidad de lógica de negocio mezclada con sql´s. Never more. Si algo te impide hacer unit testing, ahí tienes el mayor smell de tu código.
Pero no todo es el proceso. También están las personas y las herramientas:
- proveedores/colaboradores: es increíble hasta qué punto afecta a un proyecto tener buenos o malos proveedores. Conseguir buenos proveedores estará más o menos a tu alcance… pero repetir con los malos no es una opción.
- clientes: ay, que difícil es decirle a un cliente que no vas a trabajar con él porque no va a ser un buen cliente. Yo todavía no lo he hecho, la verdad. Y es un craso error. Porque todavía tengo por ahí un proyecto por el que no vamos a ver un duro en el que sigo perdiendo horas que podría dedicar a cosas más productivas. Y todo ha sido porque el cliente no ha sido capaz de sacar su producto al mercado. Nunca debería haber trabajado con él.
- herramientas: en su justa medida: ni convertirlas en lo más importante, ni tampoco menospreciarlas. Dices la palabra “herramienta” y alguien dice: ” las personas y sus interacciones sobre los procesos y las herramientas”. Correcto, pero usa para controlar tus incidencias Jira o Mantis… a ver si notas la diferencia…
En la gestión de proyectos 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]
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
-
CLASS TForm1 FROM TForm
-
-
COMPONENT oArrayBrowse1
-
COMPONENT oArrayBrowse2
-
COMPONENT oArrayBrowse1Column5
-
COMPONENT oLabel1
-
COMPONENT oLabel2
-
-
METHOD CreateForm()
-
METHOD FormShow( oSender )
-
METHOD ArrayBrowse1onsize( oSender )
-
METHOD ArrayBrowse1Create( oSender )
-
METHOD Cargadatos()
-
-
ENDCLASS
En el evento OnCreate del ArrayBrowse indicaremos lo siguiente
-
oSender:aCols[2]:nPorcien := 25
-
oSender:aCols[3]:nPorcien := 50
-
oSender:aCols[4]:nPorcien := 25
-
// ——-
-
// 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.
-
oSender:aCols[2]:nMinlen := 200
Por último, alimentamos el valor del evento OnSize del browse para que se ejecute en método ArrayBrowse1onsize
-
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
-
METHOD ArrayBrowse1onsize( oSender ) CLASS TForm1
-
oSender:Pintar( oSender )
-
retu nil
Por último, en el evento FormShow del formulario llamamos a CargaDatos(), para que rellene los valores del ArrayBrowse al mostrar el formulario
-
METHOD FormShow( oSender ) CLASS TForm1
-
::CargaDatos()
-
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
-
CLASS TBrwColumn FROM XBrwColumn
-
PUBLISHED:
-
PROPERTY nPorcien INIT 0
-
PROPERTY nMinLen INIT 0
-
PROTECTED:
-
DATA nInitWidth
-
PUBLIC:
-
METHOD Create( oParent ) CONSTRUCTOR
-
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
-
METHOD Create( oParent ) CLASS TBrwColumn
-
super:Create( oParent )
-
::nInitWidth := ::nWidth
-
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.
-
CLASS TArrayBrowse FROM XArrayBrowse
-
PROTECTED:
-
DATA ninitwidth
-
PUBLIC:
-
METHOD Create( oParent ) CONSTRUCTOR
-
METHOD WMSize( nWParam, nLParam )
-
METHOD Pintar( oSender )
-
METHOD Porcion( nPixels, nPorcien )
-
EVENT OnSize( oSender, nSizeType, nClientWidth, nClientHeight )
-
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:
-
METHOD WMSize( nWParam, nLParam ) CLASS TArrayBrowse
-
::OnSize( nWParam, LoWord( nLParam ), HiWord( nLParam ) )
-
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.
-
METHOD Create( oParent ) CLASS TArrayBrowse
-
super:Create( oParent )
-
::nInitWidth := ::nWidth
-
::Pintar( Self )
-
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
-
METHOD Porcion( nPixels, nPorcien ) class TArrayBrowse
-
RETURN nPixels * ( nPorcien / 100 )
Pintar() contine el corazon de la modificacion.
-
METHOD Pintar( osender ) CLASS TArrayBrowse
-
Local nColumnas := Len( oSender:aCols )
-
Local nResto := oSender:nWidth – oSender:nInitWidth
-
Local nPorcienOcultas := nAnchoOcultas := nColVisibles := 0
-
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
-
FOR n := 1 TO nColumnas
-
IF oSender:aCols[n]:nPorcien > 0
-
a := oSender:aCols[n]:nInitWidth + ;
-
oSender:Porcion( nResto, oSender:aCols[n]:nPorcien )
-
IF !oSender:aCols[n]:lVisible := a > oSender:aCols[n]:nMinLen
-
nAnchoOcultas += oSender:aCols[n]:nInitWidth
-
nPorcienOcultas += oSender:aCols[n]:nPorcien
-
ELSE
-
nColVisibles ++
-
ENDIF
-
ENDIF
-
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
-
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
-
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)
-
FOR n:= 1 TO nColumnas
-
IF oSender:aCols[n]:nPorcien > 0
-
oSender:aCols[n]:nWidth := oSender:aCols[n]:nInitWidth + ;
-
oSender:Porcion( nResto, oSender:aCols[n]:nPorcien + nPorcienOcultas )
-
ENDIF
-
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.

En el siguiente vídeo puede verse cómo se va resaltando el parámetro mientras estamos escribiendo los argumentos de la función.
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.
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 detallada

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”.
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.

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:
-
@font-face {
-
src: url("Helvetica.dfont");
-
fontFamily: "Helvetica Regular";
-
fontStyle: normal;
-
fontWeight: normal;
-
embed-as-cff: true;
-
}
-
@font-face {
-
src: url("Helvetica.dfont");
-
fontFamily: "Helvetica Bold";
-
fontStyle: normal;
-
fontWeight: bold;
-
embed-as-cff: true;
-
}
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:
-
@font-face {
-
src: url("Helvetica.dfont");
-
fontFamily: "Helvetica Bold";
-
fontStyle: normal;
-
fontWeight: bold;
-
embed-as-cff: true;
-
}
-
s|Button{
-
font-family: "Helvetica Bold";
-
}
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.
» 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]
Yoy 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.
Solució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:

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:
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:
- Medición de Media — La medición de video hecha fácil. Ahora con esta característica los desarrolladores podremos implementar métricas de video con un par de líneas de código. Soluciones tipo Analytics podrán aprovechar las nuevas APIs abiertas para implementar fácilmente métricas de video sin importar el protocolo que se este utilizando.
- Cancelación Acústica — Flash Player 10.3 permite a los desarrolladores crear experiencias colaborativas en tiempo real con gran calidad de audio como telefonía, chats integrados con voz y aplicaciones para conferencias grupales. Ahora los desarrolladores tendremos acceso a cancelación acústica, supresión de ruidos, detección de actividad de la voz y compensación para diferentes niveles de entrada del micrófono. Seguramente a más de uno se le ocurrirá algo interesante con esta característica.
- Integración con los controles de privacidad del navegador para el manejo de almacenamiento local — Flash Player 10.3 se integra controles para el manejo del almacenamiento local dentro de las opciones de privacidad de los navegadores dentro de Mozilla Firefox 4, Microsoft Internet Explorer 8 y superiores, y en futuras versiones para Safari y Chrome.
- Panel de Control Nativo — Flash Player 10.3 integra un panel de control nativo para las opciones de privacidad, seguridad y almacenamiento local. Ahora los usuarios de Windows, Mac, y Linux podremos acceder a las opciones de Flash Player directamente desde el panel de control o preferencias del sistema de las computadoras.
- Notificaciones de auto-actualización para Mac OS — Flash Player 10.3 incluye soporte automático para las actualizaciones de software en Mac OS, facilitando las actualizaciones a los usuarios de esta plataforma.
Recomendamos entrar a Adobe Labs para descargar esta versión y empezar a probar las opciones incluídas.













