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

carlosrovira.com

Expocomic

Noviembre 30th, 2008 - [Enlace local]

Este sábado estuvimos dándonos un garbeo por Expocómic. Debo decir que siempre he sido un gran lector de cómics de toda la vida, aunque los últimos años tengo algo abandonada esta afición. Lo pasamos realmente bien investigando por toda una exposición abarrotada de entusiastas.

A lo largo de la mañana, aprovechamos para hacernos algunas fotos con personajes del mundillo :)

Expocomic con Rorschach
En esta, Mario y un servidor posamos con Rorschach, uno de los personajes de Watchmen, la mítica novela gráfica de Alan Moore y Dave Gibbons, cuya versión cinematografica esperamos con ansia en 2009.
Expocomic Encar y Mario detenidos por las Fuerzas Imperiales
Encar y Mario detenidos por las Fuerzas Imperiales ;P
Expocomic Mario's Wrestling
Las primeras experiencias de Mario con la lucha libre, parece que lo pasa bien :)

Una grata mañana de Sábado, llena de reencuentros con personajes, autores y títulos con los que he disfrutado a lo largo de los años. ¡Qué recuerdos! :)

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

Variable not found

Enviar mensajes con imágenes incrustadas desde .NET

Noviembre 30th, 2008 - [Enlace local]

Es habitual que las aplicaciones que desarrollamos necesiten enviar emails: alertas, notificaciones automáticas, formularios de contacto, o envíos masivos de información, entre otros, son ejemplos de utilización muy habituales.

Y en estos casos la inclusión de imágenes incrustadas suele ser un requisito fundamental cuando se trata de enviar contenidos con formato HTML, de forma que, aunque normalmente se incrementa de forma notable el tamaño del paquete a enviar, se evita que los clientes tengan que descargar estos recursos adicionales desde sus equipos, cosa que además suele estar bloqueada por defecto.

.NET framework nos ofrece varias vías para hacerlo usando las clases provistas en System.Net.Mail, pero vamos a utilizar una que nos ofrece dos ventajas importantes. La primera es que las imágenes enviadas no se muestran como adjuntos (evitando, por ejemplo, el curioso efecto presente en Outlook Express, que repite las imágenes a continuación del texto del mensaje) y la segunda es que permite especificar distintas vistas dentro desde el mismo mensaje, para que el cliente de correo utilice la que sea más apropiada.

El siguiente código muestra una forma de montar un mensaje con dos vistas: la primera será utilizada por aquellos agentes de usuario (clientes de correo) que únicamente pueden mostrar texto plano, mientras que en la segunda utilizará HTML para maquetar el contenido, incluyendo una imagen que aparecerá totalmente integrada en el cuerpo del mensaje, sin mostrarse como elemento adjunto del mismo.

Podréis observar que aunque en el ejemplo muestro un código muy rígido, es fácilmente generalizable para poder utilizarlo en cualquier escenario. Como en otras ocasiones, está en C#, mi lenguaje favorito, pero sería fácilmente portable a VB.NET, por ejemplo.


// Necesitaremos estos namespaces...
using System.Net.Mail;
using System.Net.Mime;
...

// Montamos la estructura básica del mensaje...
MailMessage mail = new MailMessage();
mail.From = new MailAddress("origen@miservidor.com");
mail.To.Add("destinatario@miservidor.com");
mail.Subject = "Mensaje con imagen";

// Creamos la vista para clientes que
// sólo pueden acceder a texto plano...


string text = "Hola, ayer estuve disfrutando de "+
"un paisaje estupendo.";

AlternateView plainView =
AlternateView.CreateAlternateViewFromString(text,
Encoding.UTF8,
MediaTypeNames.Text.Plain);


// Ahora creamos la vista para clientes que
// pueden mostrar contenido HTML...


string html = "<h2>Hola, mira dónde estuve ayer:</h2>" +
"<img src='cid:imagen' />";

AlternateView htmlView =
AlternateView.CreateAlternateViewFromString(html,
Encoding.UTF8,
MediaTypeNames.Text.Html);

// Creamos el recurso a incrustar. Observad
// que el ID que le asignamos (arbitrario) está
// referenciado desde el código HTML como origen
// de la imagen (resaltado en amarillo)...


LinkedResource img =
new LinkedResource(@"C:\paisaje.jpg",
MediaTypeNames.Image.Jpeg);
img.ContentId = "imagen";

// Lo incrustamos en la vista HTML...

htmlView.LinkedResources.Add(img);

// Por último, vinculamos ambas vistas al mensaje...

mail.AlternateViews.Add(plainView);
mail.AlternateViews.Add(htmlView);

// Y lo enviamos a través del servidor SMTP...

SmtpClient smtp = new SmtpClient("smtp.miservidor.com");
smtp.Send(mail);
 

La siguiente imagen muestra una captura de pantalla del mismo mensaje leído desde un cliente con capacidad HTML como Outlook Express y uno que no la tiene, en este caso basado en web:

El mismo mensaje visto desde dos agentes de usuario distintos. Pulsa para ampliar.


Publicado en: www.variablenotfound.com.

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

Najaraba.com: Software libre, negocios y más.

Libros de desarrollo de software

Noviembre 30th, 2008 - [Enlace local]

Creo que este es el primer post que recupero "bajo demanda". Me acabo de fijar que tenía empezado uno con el mismo título desde mayo... ¡del año pasado!. En fin, que ya me he decidido a haceros un listado con algunos de los últimos títulos que tengo en mi biblioteca relacionados con el desarrollo/gestión de software. He seleccionado algunos y los he ordenado más o menos por lo que me han

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

Jorge Dieguez Blog

[SharePoint] Controlar la Navegación

Noviembre 30th, 2008 - [Enlace local]

SharePoint es un producto muy fácil de usar:-). El mapa de navegación se va creando de forma automática según el usuario con permisos para ello va añadiendo nuevos subisteis y contenidos. Además desde el la página de "Accione de Sitio" es fácil configurar la navegación, añadiendo o modificando enlaces.
image

El menú de navegación(superior y lateral), el control de la miga de pan se "conectan" con el mapa de navegación para reflejar los items que lo componen.
image

El mapa de navegación se puede manipular de forma programática: recuperar, añadir, modificar o quitar entradas.
Todo esto se hace por medio de la clase SPNavigation.
En este enlace podemos muchos ejemplo de como modificar programáticamente la navegación:
HOW TO: Programmatically customize site navigation in WSS 3.0 and MOSS 2007.
Es muy habitual que las aplicaciones que construyamos sobre SharePoint, añadan nuevas entradas en el mapa del sitio. Esto se puede hacer por medio de las características(features) y con la ayuda de los eventos de activación/desactivación.

Otra interesante característica de SharePoint(en realidad de ASP.NET) es la posibilidad de cambiar el proveedor del mapa de sitio(SiteMapProvider).
Un proveedor de mapa de sitio es una clase que extiende la clase SPSiteMapProvider/PortalSiteMapProvider(el último para MOSS), en el método GetChildNodes se construye la colección de nodos que componen el mapa de navegación.
En el fichero web.config de la aplicación web SharePoint podemos "enganchar" nuestros proveedores de mapa de sitio y de esta forma personalizar el origen donde se almacenan los nodos.
Un ejemplo de uso de esta característica es almacenar la navegación en una lista de SharePoint, o incluso generar el mapa de navegación con los títulos en el idioma correspondiente al  "idioma actual"(para un sitio multi-idioma).
En el siguiente enlace podemos ver un ejemplo interesante:
Writing a Custom Navigation Provider for MOSS.

En el caso de personalizar el proveedor de mapa de sitio no os olvidéis de optimizar el rendimiento usando técnicas de caché(el proveedor de MOSS ya esta optimizado en este sentido).

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

Jorge Dieguez Blog

[SharePoint] Controlar la Navegación

Noviembre 30th, 2008 - [Enlace local]

pstrongSharePoint es un producto muy fácil de usar/strong:-). El mapa de navegación se va creando de forma automática según el usuario con permisos para ello va añadiendo nuevos subisteis y contenidos. Además desde el la página de quot;Accione de Sitioquot; es fácil configurar la navegación, añadiendo o modificando enlaces.br /a href="http://geeks.ms/blogs/jdieguez/WindowsLiveWriter/SharePointControlarlaNavegacin_11724/image_2.png"img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="339" alt="image" src="http://geeks.ms/blogs/jdieguez/WindowsLiveWriter/SharePointControlarlaNavegacin_11724/image_thumb.png" width="526" border="0" //a /p pEl strongmenú de navegación/strong(superior y lateral), elstrong control de la miga de pan/strong se quot;conectanquot; con el mapa de navegación para reflejar los items que lo componen.br /a href="http://geeks.ms/blogs/jdieguez/WindowsLiveWriter/SharePointControlarlaNavegacin_11724/image_4.png"img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="322" alt="image" src="http://geeks.ms/blogs/jdieguez/WindowsLiveWriter/SharePointControlarlaNavegacin_11724/image_thumb_1.png" width="518" border="0" //a /p pEl mapa de navegación se puede manipular de forma programática: recuperar, añadir, modificar o quitar entradas. br /Todo esto se hace por medio de la clase a href="http://msdn.microsoft.com/es-es/library/microsoft.sharepoint.navigation.spnavigation.aspx"strongSPNavigation/strong/a.br /En este enlace podemos muchos ejemplo de como modificar programáticamente la navegación:br /a href="http://www.sharepointblogs.com/tbaginski/archive/2007/12/26/how-to-programmatically-customize-site-navigation-in-wss-3-0-and-moss-2007.aspx"strongHOW TO: Programmatically customize site navigation in WSS 3.0 and MOSS 2007/strong/a.br /Es muy habitual que las aplicaciones que construyamos sobre SharePoint, añadan nuevas entradas en el mapa del sitio. Esto se puede hacer por medio de las a href="http://jdieguez.wordpress.com/2008/11/02/sharepoint-bsico-una-caractersticafeature/"strongcaracterísticas(features)/strong/a y con la ayuda de los eventos de a href="http://msdn.microsoft.com/en-us/library/ms469501.aspx"strongactivación/desactivación/strong/a./p pOtra interesante característica de SharePoint(en realidad de ASP.NET) es la posibilidad de cambiar el proveedor del mapa de sitio(a href="http://msdn.microsoft.com/en-us/library/aa479033.aspx"strongSiteMapProvider/strong/a). br /Un proveedor de mapa de sitio es una clase que extiende la clase a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.navigation.spsitemapprovider.aspx"strongSPSiteMapProvider/strong/a/a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.publishing.navigation.portalsitemapprovider.aspx"strongPortalSiteMapProvider/strong/a(el último para MOSS), en el método stronga href="http://msdn.microsoft.com/es-es/library/system.web.sitemapprovider.getchildnodes.aspx"GetChildNodes/a /strongse construye la colección de nodos que componen el mapa de navegación. br /En el ficherostrong web.config/strong de la aplicación web SharePoint podemos quot;engancharquot; nuestros proveedores de mapa de sitio y de esta forma personalizar el origen donde se almacenan los nodos.br /Un ejemplo de uso de esta característica es almacenar la navegación en una lista de SharePoint, o incluso generar el mapa de navegación con los títulos en el idioma correspondiente alnbsp; quot;idioma actualquot;(para un sitio multi-idioma).br /En el siguiente enlace podemos ver un ejemplo interesante:br /a href="http://faraz-khan.blogspot.com/2008/11/writing-custom-navigation-provider-for.html"strongWriting a Custom Navigation Provider for MOSS/strong/a./p pstrongEn el caso de personalizar el proveedor de mapa de sitio no os olvidéis de optimizar el rendimiento usando técnicas de caché(el proveedor de MOSS ya esta optimizado en este sentido)./strong/pdiv style="clear:both;"/divimg src="http://geeks.ms/aggbug.aspx?PostID=122687" width="1" height="1"

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

Pwned's blog - Desarrollo de Tecnologia

Craig Mundie en México

Noviembre 30th, 2008 - [Enlace local]


Para los que no se han enterado o les llego tarde la noticia el pasado 24 de Noviembre, el señor Craig Mundie estubo en México dando unas conferencias acerca de las nuevas propuestas de Microsoft para el futuro. Craig Mundie es la persona que quedo a cargo durante el retiro de Bill Gates, asi que como que digamos casi casi es el jefe.

Yo por mi parte no pude ir, aunque recibi la invitacion lo aclaro, pero por motivos superiores a mis intenciones no pude asistir.

Pero ya se ha comentado bastante en otros blogs acerca de la visita de este señor, asi como la gran experiencia de haber convivido con él.


Pwned's Blog

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

Navegapolis

Los gestores de proyectos ágiles no existen

Noviembre 30th, 2008 - [Enlace local]

SirenaUn gestor de proyectos, gestiona proyectos: mide el trabajo, lo descompone, asigna y planifica tareas, sigue la ejecución...

Un equipo ágil se auto-gestiona: mide el trabajo, lo descompone, se asigna las tareas, monitoriza el avance... Y como una cosa no puede ser ella misma y su contraria, no es posible gestionar el proyecto de un equipo auto-gestionado.

En este caso lo que corresponde es gestionar el sistema (eco-sistema) que hace posible la agilidad: un entorno capaz de obtener el valor del talento, más que el trabajo de los recursos; porque con el software se puede trabajar de forma mecánica o creativa; que el soft es sólo la materia prima: "las palabras", y con ellas lo mismo construye el mecanógrafo, que crea el novelista o el poeta.

 

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

carlosrovira.com

Entrevista en CICE

Noviembre 30th, 2008 - [Enlace local]

CICE ha publicado, en su newsletter de Noviembre, una entrevista donde tuve la oportunidad de responder a diversas preguntas sobre la actualidad informática que vivimos. Gracias especiales a CICE por contar conmigo en esta ocasión :) .

Entrevista CICE

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

SobreRaíles

Filtros y silenciadores en los logs de Rails

Noviembre 29th, 2008 - [Enlace local]

Una de las novedades de Rails edge es la inclusión de filtros y silenciadores en las trazas de nuestra aplicación. Los filtros permiten cambiar al vuelo contenidos de las líneas de traza en base a expresiones regulares y los silenciadores, más radicales, se limitan a tragarse las líneas de log que lo activen.

En Rails < = 2.2, si hacemos lo siguiente

   $ rails test-exception
   $ cd test-exception
   $ script/generate scaffold blog
   $ script/server

Y lanzamos un navegador hacia http://localhost:3000/blogs obtendremos una bonita traza de error como esta.

Sin embargo, en las versiones posteriores a Rails 2.2 la traza de error es mucho más escueta y por tanto más fácil de leer porque omite información que por lo general es poco necesaria. He aquí la nueva traza.

Como era de imaginar la cosa no acaba aquí sino que podremos configurar los filtros y silenciadores a nuestro gusto si editamos el fichero config/initializers/backtrace_silencers. Por ejemplo, con el siguiente cambio y con nuestra configuración de Rails

Rails.backtrace_cleaner.add_filter {|line|
    line.sub(/(\/opt\/local\/lib\/ruby\/gems\/1.8\/gems\/)([a-z]+)-([0-9.]+)\/(.*)/) {|match| " #{$2} (#{$3}) :#{$4}"}
}

conseguiremos que las trazas generadas por el código de las gemas aparezca mostrando el nombre de la gema y su versión. Puede verse aquí la traza que se generaría.

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

SobreRaíles

Novedades en Edge Rails #4

Noviembre 29th, 2008 - [Enlace local]

La semana pasada los desarrolladores norteamericanos celebraron el Día de Acción de Gracias, pero esto no se ha notado en el desarrollo de Rails. Las cosas se encaminan hacia la versión 2.3 de Rails.

Integración con Rack

La base de script/server se ha reescrito y simplificado. Por ejemplo, la lista explícita de servidores soportados ha desaparecido y en su lugar Rails ahora depende de la instalación de Rack, y script/server hace esto – lo que quiere decir que ahora Rails soportará cualquier servidor siempre que Rack lo haga también.

Rutas más eficientes

Las rutas han visto un par de cambios importantes esta semana. Los helpers de rutas que empiezan por formatted_ han desaparecido, y en su lugar ahora hay que pasar la opción :format al helper normal. De esta maanera se ahorra hasta el 50% de las rutas generadas para un recurso y esto puede ahorar una cantidad sustancial de memoria (hasta el 100MB en aplicaciones grandes según este ticket en Lighthouse) Si tu código utiliza los helpers formatted_ por el momento seguirá funcionando, pero debes tener en cuenta que estos helpers son «a extinguir» y que tu aplicación será más eficiente si adaptas tu código para usar el nuevo estándar. Otro cambio importante es que Rails ahora soporte múltiples archivos de rutas, en lugar de usar únicamente routes.rb Se puede usar RouteSet#add_configuration_file para incorporar más rutas en cualquier momentot – y sin borrar las rutas ya cargadas. commit commit

Mejor soporte de plugins de Engines

El segundo cambio en las rutas permite soportar mejor los Engines: ahora se cargan y recargan automáticamente los archivos de rutas de los Engines (como en el resto de plugins) Pero los Engines están recibiendo más atención, además del enrutado: si tu plugin tiene un directorio app, entonces los directorios app/[models|controllers|helpers] se añadirán automáticamente al load path de Rails. Hay una discusión en curso acerca de cómo debería funcionar este mecanismo y cuánto reutilizar del plugin de Engines actual así que es posible que aún no hayamos visto los últimos commits en este aspecto. Los Engines ahora soportan la adición de paths para las vistas.commit commit commit commit

Volcados de los tests más sensatos

Si usamos el plugin Quiet Backtrace de Thoughtbot, que nos permite eliminar selectivamente las líneas de los volcados generados por Test::Unit, nos agradará saber que han aparecido ActiveSupport::BacktraceCleaner y Rails::BacktraceCleaner en el core de Rails. Se soportan tanto filtros (para hacer sustituciones en las líneas de volcado usando expresiones regulares) como silenciadores (para eliminar líneas enteras). En las aplicaciones nuevas Rails añadirá automáticamente silenciadores para eliminar la mayor parte del ruido en los volcados de tests y construirá un archivo config/backtrace_silencers.rb donde poder configurar los nuestros. commit

Integración con Ruby 1.9

Varios commits continúan avanzando en la compatibilidad con Ruby 1.9 y minitest para asegurar que Rails 2.3 está listo para funcionar con las nuevas mejoras en Ruby cuando sean lanzadas. Los que sigan el edge, sin embargo, deben tener en cuenta que uno de los últimos cambios en edge Rails depende de un parche al core de Ruby que aún no ha sido aplicado. También será necesario aplicar (temporalmente) el fork de Mocha de Jeremy Kemper para ser compatibles con MiniTest tal y como requiere este parche .

Tiempo de arranque más rápido en desarrollo

Jeremy Kemper y Josh Peek han estado trabajando para garantizar que haya partes de Rails y sus dependencias se carguen en memoria sólo cuando sea realmente necesario. Comprobad los commits del 23 de Noviembre para ver muchos cambios relacionados con esta recarga perezosa. Los frameworks Active Support, Active Record, Action Controller, Action Mailer y Action View ahora utilizan autoload para cargar sus clases individuales, y así mantener la carga de memoria lo más baja posible mejorando el rendimiento de Rails. commit commit commit commit commit

Otros

Con la nueva opción preload_frameworks se puede especificar si queremos que las librerías del core se autocarguen en el arranque. Por defecto es false de forma que Rails se autocarga pieza por pieza, pero en algunas circunstancias podríamos querer traerlo todo a la vez – por ejemplo Passenger y JRuby necesitan que Rails se cargue en su totalidad. commit

Los asset hosts son más flexibles, con las poisiblidad de declarar un host como un objeto específico que responde a cierta llamada. DHH ha proporcionado un proyecto de ejemplo, asset-hosting-with-minimum-ssl, que demuestra un buen uso de esta funcionalidad. commit

La ubicación de la carpeta de helpers es ahora configurable en una aplicación Rails ajustando ActionController::Base.helpers_dir, lo cual será una bendición para algunas circunstancias poco habituales – el caso de uso original es la construcción de una aplicación Rails que facilita la extensión mediante plugins en lugar de mediante la alteración de la propia aplicación. commit

La generación de tokens de protección contra CSRF se ha simplificado, y ahora Rails utiliza una cadena aleatoria generada por ActiveSupport::SecureRandom en lugar de trastear con los IDs de sesión. Como resultado de esto las opciones :digest y :secret de protect_from_forgery están obsoletas y no surtirán ningún efecto a partir de ahora. commit

Y ya que hablamos de secretos, seguro que algunos encontrarán algún uso original y útil de ActiveSupport::MessageEncryptor, que proporciona una forma sencillo de cifrar información para su almacenamiento en lugares no seguros (como las cookies). commit

La función de Active Support from_xml ya no depende de XmlSimple. En su lugar, Rails ahora incluye un su propia implementación de XmlMini con sólo la funcionalidad necesaria, de forma que Rails puede dejar de incluir la copia de XmlSimple que venía arrastrando. commit commit

Como se recordará, las mejoras de la semana pasada incluyeron el cambio de nombre de application.rb a application_controller.rb. Esta semana hay una nueva tarea de Rake, rake rails:update:application_controller que hace esto automáticamente y que forma parte de la tarea rake rails:update. commit

Hay buenas noticias si usamos ActiveSupport::OrderedHash: por fin implementa each_key y each_value. commit

Se ha internacionalidado un poquito más del core de Rails: las unidades usadas por number_to_human_size. Si mantienes un archivo de traducciones, ahora tienes que añadir las traducciones de las unidades de almacenamiento: bytes, KB, MB, GB, TB. commit

Por fin ha desaparecido el soporte de los componentes en Rails, que fueron en su momento según «Agile Web Development wih Rails» un brillante ejemplo de lo que ocurre cuando la ambición se impone a la prudencia. Por si un par de años de advertencia sobre lo que iba a ocurrir no fue suficiente, ahora es el momento de encontrar una solución alternativa. commit

Han dejado de generarse por defecto un par de archivos en /public que tenían que ver con los dispatchers de CGI y FCGI. De todas formas, si te hace falta, puedes obtenerlos añadiendo la opción --with-dispatches al ejecutar el comando rails, o bien generarlos después usando rake rails:generate_dispatchers). commit commit

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

4 bits blog

Punteros

Noviembre 29th, 2008 - [Enlace local]

En programación, un puntero es aquella variable cuyo contenido es la dirección de memoria donde realmente está la información. Son útiles para diferenciar entre manejar las variables por referencia o por valor, pero también es uno de los conceptos que más les cuesta comprender a los que se acercan a la programación. De ahí que Java, que no permite utilizar los punteros directamente, sea considerado un mal lenguaje para aprender a programar: Porque te pierdes conceptos básicos.

El otro día, no sé muy bien a cuento de qué, se me ocurrió la siguiente comparativa:

Imaginad que a correos llega un sobre. El contenido de la variable sería la carta. El puntero a esa variable sería el destinatario, mientras que el puntero del puntero vendría a ser el remitente.

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

programania

Comunidad (de desarrolladores) distribuida

Noviembre 28th, 2008 - [Enlace local]

Acabo de hacer unas reformas en programania y en su comunidad distribuida sobre el zend framework y tenía ganas de escribir un poco sobre ello.

Creo que cada vez tiene menos sentido crear una comunidad tradicional sobre una tecnología concreta (como, por ejemplo, el zend framework). Y es que la mayoría de gente que siente la necesidad de escribir sobre lo que programa tiene un blog. Escribir requiere cierto esfuerzo. Y si alguien hace el esfuerzo ya de escribir en su blog, es difícil que lo haga también en escribir en X comunidades. Por eso me parece que el camino es crear comunidades distribuidas donde el contenido lo genera cada uno en su blog, y éste se sindica en la comunidad pertinente. Es lo que al menos he intentado hacer con zendframework.programania.net.  Todavía quedan problemas como crear un foro distribuido. Menos mal que tenemos un excelente foro en castellano.

Aprovecho la ocasión para hacerme eco de una comunidad que se está esforzando por traducir la documentación sobre el zend framework al castellano. Y aprovecho también para recordaros que si hay algún blog hablando sobre el ZF que no esté sindicado en la comunidad, escriba un comentario en éste post y lo sindicaré.

Un saludo!

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

Nuevos Programadores

Nueva sección en Nuevos Programadores: Herramientas

Noviembre 27th, 2008 - [Enlace local]

En este sencillo pero emotivo acto, doy por inaugurada la sección Herramientas en NuevosProgramadores.com, una página en la que voy a ir listando herramientas que son muy útiles a la hora de programar y que muchas veces cuando conocí alguna de ellas pensé: Si hubiese conocido esto antes!

Si alguien conoce alguna herramienta que encaje en esta lista, que me lo haga saber así puedo agregarla inmediatamente.

Posts aleatorios

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

carlosrovira.com

Adobe y el cuidado del detalle

Noviembre 27th, 2008 - [Enlace local]

Es remarcable el mimo y el cuidado extremo del que hace gala Adobe en todo lo que hace. Para muestra un botón.

Hace unos pocos días recibí un paquete con una camiseta. La camiseta es un detalle a todos aquellos que estamos poniendo nuestro granito de arena ayudando en la mejora de Flex en todo el mundo. Como se puede ver en las fotos, los chicos de Adobe se han molestado en personlizar el Fx del logo de Flex con los nombres de todos los implicados. Con detalles como este (y otros muchos) no es de extrañar que Adobe goze de tan buena prensa en el mundo. Gracias Adobe!

Making Flex Better 1
Making Flex Better 2

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

Yet Another Programming Weblog

Memoria transaccional ¿Sólo un juguete para investigadores?

Noviembre 27th, 2008 - [Enlace local]

En Software Transactional Memory: why is it only a research toy? de Calin Cascaval et al. se repasan algunas de las razones por las que, tras unos años de investigación, la memoria transaccional no ha dado el salto para ser usada en otros entornos. Se nombran sobre todo razones de rendimiento, de usabilidad (semántica confusa) y de interacción con sistemas que no la usan. No obstante no todo el mundo se da por vencido y por ejemplo Larry O'Brien escribe en Cascaval et al.'s skepticism on transaction memory una visión un poco más optimista indicando que aún queda espacio para la investigación y la optimización. ¿Acabaremos usando STM o morirá antes de nacer?

La misma entrada y más comentarios en Memoria transaccional ¿Sólo un juguete para investigadores? en barrapunto

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

Programación, Literatura y otras artes menores » Programación

Nostalgias

Noviembre 27th, 2008 - [Enlace local]

Hace un rato me estaba acordando de mi primer intento por contribuir al desarrollo de la informática en Cuba. Que recuerdo más hermoso, usando indebidamente los servidores de Antillana de Acero, cuando yo era Administrador de la Red, cree la lista de correos JavaCuba, que para mi orgullo albergó a unos cuantos usuarios y por momentos fue bastante activa, sobre todo cuando un grupo de soñadores planeábamos la creación de una revista sobre el Software Libre Empresarial.

Todo quedó en el intento, y ni siquiera la caché de google tiene recuerdos de la pagina de la lista, el único rastro que queda es este, a ver si algún día podemos retomar la idea, la de la lista o la de la revista, o ambas ;-)

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

Javier Pérez :: Blog

Adios Mobuzz, hola Poorbuzz

Noviembre 26th, 2008 - [Enlace local]

Mobuzz cierra, después de una larga y patética agonía. Podría haber muerto con dignidad, pero prefirió irse pidiendo... Nos deja algunos gratos recuerdos, y un grandioso espacio para nuevos proyectos que lo sustituyan.

Es otra web 2.0 que echa el cierre, una de esas web 2.0 tipo chiringuito 2.0, es decir, unos tíos con dinero se juntan, ponen dinero encima de la mesa, engañan a cuatro becarios para que trabajen por cuatro duros y por unas acciones (las famosas stock options) que no valen nada, y a montar un chiringuito 2.0 para hacerse ricos (los tíos con dinero, no los becarios, obviamente).

Y es que montar un Mobuzz (de ahora en adelante Poorbuzz) no cuesta mucho, tan sólo que unos amigos se junten y graben un video divertido colgándolo de YouTube o Vimeo. Y si valen y gustan ya grabarán en un estudio profesional y demás exquisiteces, y entonces vendrán los empresarios a gestionar la empresa, pero no antes. Incluso se rumorea en la blogosfera de la muerte que ya hay una candidatura encima de la mesa...

¿Te atreves a montar tu Poorbuzz?

Mobuzz cierra y aparece Poorbuzz

RIP Mobuzz

 

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

Navegapolis

Tipos de programadores

Noviembre 26th, 2008 - [Enlace local]

comicVi@ Pilar Ponce, una viñeta de la tira "Tipos de programadores " de Sinergia sin control con 15 topicos: los rápidos, los muy rápidos, los lentos, los puntillosos, los nerviosos, los cantantes, los experimentados, los novatos...

 

experimentados

 

 

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

jenaiz.com - RubyOnRails

Instanciar clase desde String en Ruby

Noviembre 26th, 2008 - [Enlace local]

Investigando un poco el comportamiento de acts_as_scribe, me surgió la necesidad de instanciar un clase conociendo el nombre de la misma. Algo que en java conocía como se realizaba:

Object o = Class.forName("className").newInstance()

lo curioso es que vi que no necesitaba esta solución, que mi problema era otro :), sin embargo la curiosidad pudo más que la necesidad.

Esperaba utilizar para ello la misma clase: Class, sin embargo descubrí que no podía hacerlo así. En Ruby el camino es distinto. Un post en stackoverflow me llevó a encontrar una solución múltiple, aquí las distintas posibilidades:

Object::const_get('String').new()

class_name = 'String'
eval(class_name).new

Module.const_get('Array').new

Y un helper:

"String".constantize.new

Module.const_get no funciona con clases anidadas en módulos, digamos que no admite la sintaxis Admin::Folder, debido a que sólo reconoce sintaxis válidas para dar nombre a una constante.

eval, por el contrario sí permite nombres de clases con namespaces, aunque sufrimos un decrimento en el rendimiento.

Podríamos comprobar el rendimiento de todas ellas con un simple script:

#class_instanciation.rb
#!/usr/bin/env ruby
#
#  Created by  on 2008-11-24.

require 'benchmark'
require 'qualified_const_get'

n = 1000000

Benchmark.bmbm(10) do |rpt|
  rpt.report("simple") do
    n.times {Array.new}
  end

  rpt.report("Object::const_get") do
    n.times {Object::const_get('Array').new()}
  end
 
  rpt.report("Kernel.const_get") do
    n.times {Kernel.const_get('Array').new}
  end
     
  rpt.report("Kernel.qualified_const_get") do
    n.times {Kernel.qualified_const_get('Array').new}
  end
 
  rpt.report("eval") do
    n.times {eval('Array').new}
  end
 
  # no funciona!!
  #rpt.report("eval") do
  #  n.times {"String".constantize.new}
  #end 
end


#qualified_const_get.rb
module Kernel
  def qualified_const_get(str)
    path = str.to_s.split('::')
    from_root = path[0].empty?
    if from_root
      from_root = []
      path = path[1..-1]
    else
      start_ns = ((Class === self)||(Module === self)) ? self : self.class
      from_root = start_ns.to_s.split('::')
    end
    until from_root.empty?
      begin
        return (from_root+path).inject(Object) { |ns,name| ns.const_get(name) }
      rescue NameError
        from_root.delete_at(-1)
      end
    end
    path.inject(Object) { |ns,name| ns.const_get(name) }
  end
end

Los resultados obtenidos los podéis ver en la siguiente gráfica:



en ella podemos apreciar que si utilizamos const_get se tarda aproximadamente 2 veces más que con la creación normal; que el uso de eval nos hace emplear 5 veces más tiempo y que sin duda la implementación de qualified_const_get no es nada buena, dado que nos hace emplear unos 10sg! osea unas 15 veces más.

La recomendación sería utilizar const_get siempre que se pueda, es decir mientras nuestra clase no tenga namespaces y eval cuando no quede más remedio. El caso de qualified_const_get, me parece poco apropiado para cualquier caso.

Por otro lado, el caso de constantize, no terminó de funcionar, por lo que es imposible compararlo.

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

Picando Código

Mapeado de teclado Emacs en Eclipse

Noviembre 26th, 2008 - [Enlace local]

EmacsA medida que me acostumbré a GNU Emacs y su particular mapeado de teclado, quiero usarlo en todas las herramientas de uso diario. Al acostumbrarse a este mapeo, uno se vuelve bastante rápido, y es un poco entorpecedor volver al “viejo método”.

Esta tarde tenía que escribir unos archivos XML en el trabajo. Miré por arriba unas extensiones para trabajar con XML en Emacs, y encontré varias. Pero para no ponerme a experimentar con eso en el trabajo, volví al IDE predilecto: Eclipse. (Ya volveré a investigar…)

Ya en Eclipse, supuse que habría una forma de mapear el teclado a la forma Emacs. O por lo menos descargar el archivo de mapeo de algún otro usuario de Emacs. Obviamente no era el primer programador en el mundo en querer hacer esto. Pero buscando un poco, encontré que Eclipse, por defecto, ya incluye el mapeado Emacs.

Vamos a Window > Preferences > General > Keys

Eclipse - mapeo Emacs

Eclipse - mapeo Emacs

En Schema, elegimos “Emacs”. ¡Y listo! Parece que la comunidad de Eclipse se inclina más por el editor de San IGNUcius, que el editor de la bestia… (¡¡Vi Vi Vi!!)

Por cierto, el amigo Trinux también está aprendiendo Emacs. Pueden leer su entrada sobre ERC (el cliente IRC que vengo usando) entre otras que seguramente vendrán.

Es un editor tan extensible, que hay mucho todavía por agregarle. Las iré probando con el tiempo.


Ctrl X Ctrl C

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

Pensamientos ágiles

La build y la botella

Noviembre 25th, 2008 - [Enlace local]



En nuestro trabajo tenemos una botella como la de la foto. Bueno, en realidad es muuuuucho más grande. De un metro más o menos. Es de publicidad de Heineken, de esas de plástico. Tenemos implantado un Cruise Control bastante básico, pero que cumple su cometido. Cuando alguien rompe la build porque ha hecho commits de funcionalidad inacabada, o funcionalidad que rompe los tests existentes, o se ha olvidado de configurar dependencias, pues tiene que poner un euro en la botella.

La verdad es que esta medida tan simple tiene unos efectos muy curiosos. El más obvio y evidente es que nadie quiere romper la build, ya que aunque sólo sea un euro, nadie quiere regalarlo. Así que los desarrolladores somos mucho más cuidadosos con lo que subimos y con no romper nada de lo que hay ya hecho.

Otro efecto muy beneficioso es la cura de modestia. A nadie le gusta ser el que rompe la build. Hoy, un chico nuevo ha roto la build por primera vez, y le tocó poner el euro correspondiente. El hombre fue cabizbajo a depositar el euro ante la guasa general que se suele montar. No es que este hombre sea inmodesto, ni mucho menos, pero es que la sensación que tuve yo la primera vez que rompí esta build es de cura de modestia. Los desarrolladores tendemos a que se nos suba el ego muy rápidamente. Y siempre viene bien que alguien nos baje los humos, aunque sea el Cruise Control, y que tengamos que darnos un paseito ante la guasa general del resto del equipo mofándose (amistosamente) de que te toca apoquinar.

Además la gente es muy legal y hoy otro chico dejaba un euro por la build que había roto ayer. Y es que a uno tampoco le gusta quedar debiendo nada, aunque sea a la botella.

La verdad es que para la cantidad de gente que estamos trabajando en el equipo, y siendo diferentes equipos trabajando en diferentes componentes interconectados, yo personalmente tengo clarísimo que la salud de la build se debe en gran medida a los efectos de esa botella.

¿Estáis usando integración continua en vuestro equipo? Mi consejo, usar una botella. Hará de la build algo más estable y además añade un toque de diversión al día a día. Ah, y a final de año, pues siempre se puede hacer una cena con el dinero de la botella. ¡Faltaría más!

Foto by ^Vanessa^@Flickr

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

Blog de Julio César Pérez Arques

Búsqueda incremental en Eclipse

Noviembre 25th, 2008 - [Enlace local]

Ultimamente me ha dado por redescubrir Eclipse. Que si plugins, atajos, templates,... es soprendente lo fácil que es descubrir una nueva o simplemente desconocida funcionalidad.



Lo último ha sido la búsqueda incremental, en inglés Incremental Find. Una funcionalidad más que recomendable para aquellos que encontréis mejorable el clásico diálogo de búsqueda del editor (Ctrl+F), sobretodo después de usar todos los dias el buscar de Firefox.



Para usar la búsqueda incremental sobre un fichero basta con abrirlo en el editor y pulsar Ctrl+J. Ojo porque no aparecerá ningún diálogo ni nada visual salvo la frase Incremental Find en la barra de estado. En ese momento tecleamos la palabra a buscar y Eclipse irá buscando según tecleamos. Para moverte entre las distintas ocurrencias puedes usar las fechas arriba y abajo.

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

Programación, Literatura y otras artes menores » Programación

Necesidades del Software Libre en Cuba

Noviembre 25th, 2008 - [Enlace local]

La UCI es la Universidad de Ciencias Informáticas, fue creada como parte de un plan de “informatizar” a la sociedad cubana y convertir a la isla en una “potencia” informática, ignorando que durante todos estos años en que la informática en el mundo se ha desarrollado debido a la iniciativa privada o simplemente a la iniciativa personal, como es el caso del Software Libre(SL).

Ahora bien, la facultad 10 de la UCI ha sido dedicada al desarrollo del SL, y entre otras cosas al desarrollo de NOVA, una distribución basada en Gentoo, la cual ha sido vista por unos pocos y cuyo código fuente no ha visto nadie(o casi nadie) fuera de la UCI, y los que lo han visto no pueden divulgarlo debido al “Código de Ética” de dicha universidad. Las pruebas de todo lo anterior están en los archivos de linux-l, donde algunos miembros nos han explicado estos problemas. Estoy conciente de que no es decición de los desarrolladores el que exista esta situación con la UCI, que es desición de jefes que no saben mucho de SL ni de informática en general, pero eso no hace que la UCI haga un trabajo menos incorrecto desde el punto de vista comunitario, así que por todo lo anterior, las críticas a la UCI han sido bien feroces en la lista, hasta el punto que nos han tildado de anti-UCI.

En definitiva no sé porqué tanto lío con la UCI, que hagan lo que entiendan, si les sale un SL derecho comunitario(que lo dudo) que bueno, pero mientras los obliguen a mantenerse encerrados en sus muros(o cercas, no se que hay en la UCI) no son parte de la comunidad y ya. Evidentemente quienes trabajan allí, individualmente sí pueden ser, y de hecho son, parte de la comunidad, pero el trabajo que se hace en la UCI no tiene nada que ver con nosotros, que les vaya bien, y que nos avisen cuando tengan algo.

En realidad lo que más le duele a los informáticos de la isla es el hecho de que por fin se destinen recursos para el SL, pero que se deje de lado a muchos que han trabajado y aun trabajan por el SL, solo porque no son plantilla de la UCI.

Quizás lo más beneficioso para el SL en cuba y para cuba en general sería buscar la manera de potenciar la red nacional, pues ya sabemos que el acceso a servidores allende los mares es lento y caro a causa de la conexión satelital que permite el bloqueo*; pero no hay razones para que la red nacional sea tan mezquina**, bueno quizás si haya una razón: ETECSA no tiene los recursos.

Ya se que tanto mis preguntas, como mis respuestas, como mis esperanzas, están totalmente desconectadas de la realidad jurídica y económica de cuba, solo digo que nos complicamos demasiado, como informáticos y como país, y que evidentemente si queremos tener independencia tecnológica tenemos que desarrollar la tecnología, lo cual ahora no lo podemos hacer, por tanto lo primero que debemos hacer es investigar que detiene el desarrollo, pero investigar de verdad, con datos de verdad, no con cosas que “todo el mundo sabe”.

* Hay una historia por ahí de que Clinton le propuso al gobierno cubano unirse a la fibra óptica que pasa por el oriente de la isla y esa propuesta fue rechazada; pero como no hay datos, no digo nada.

**A lo largo de la isla hay una fibra óptica, que debería ayudar a agilizar la conectividad nacional, estos son sus datos, los tomé de este correo.

>> Su ancho de banda es muy grande (teóricamente de hasta 1 THz), mediante
>> técnicas de multiplexación por división de frecuencias (WDM/DWDM), que
>> permiten enviar hasta 100 haces de luz (cada uno con una longitud de onda
>> diferente) a una velocidad de 10 Gb/s cada uno por una misma fibra, se
>> llegan a obtener velocidades de transmisión totales de 10 Tb/s.
>>

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

niko's mini factory

Links for 2008-11-24 [del.icio.us]

Noviembre 25th, 2008 - [Enlace local]

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

Fetishcode...Thinking in objects

Eliminar todos las filas de un ViewObject

Noviembre 25th, 2008 - [Enlace local]

A

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

Información legal y técnica