Divulgacion de informacion: Esta en todos lados
Talvez hallas visto alguna calcomania como esta en la parte trasera de algun auto, y talvez te parecio ingeniosa/divertida/tonta, pero has pensado que es una forma de divulgacion de informacion? La pregunta muy probablemente cambie tu perspectiva sobre esta inocente calcomania en caso de que no lo vieras asi antes. Tristemente en paises de Mexico a sudamerica cada vez es mas comun la extorsion usando secuestros virtuales, que es cuando te llaman por telefono y te dicen que tienen secuestrado a tu hijo (los nombres estan en la calcomania, recuerdas?) y te piden que pagues inmediatamente el rescate, en los casos de secuestro virtual es mentira que tengan a la persona secuestrada, pero utilizan muchas artimañas para hacerte creer que asi es y utilizan el impacto y momento psicologico para aprovecharse de las personas. Este es solo un ejemplo de la manera en que estas personas conducen estas actividades y mi interes no es hablar de eso, sino hacer incapie sobre la divulgacion de informacion y de que esta puede estar en los lugares mas inocentes, si crees que eso no te puede pasar a ti, lamento decirte que eso te hace mas vulnerable.


Que tal esto, has visto algo asi?:


La cantidad de blogs que han sido hackeados por este detallito es demasiado grande, WordPress hace estos sitios demasiado facil de encontrar y es cuestion de usar una de tantas vulnerabilidades que aparecen para este sistema y lograr hacer algun daño

Tambien he visto sistemas en los que usan el numero de empleado para hacer login en las computadoras, el # de empleado es visible cuando la computadora esta bloqueada, y resulta que puedes llamar al help desk de la compañia, dar ese numero con el nombre de la persona y ellos resetean la contraseña y te la dan ahi mismo.

Desafortunadamente no hay reglas establecidas para prevenir el problema de la divulgacion de informacion, mi intencion es simplemente crear mas conciencia sobre el gran problema que esto puede llegar a representar en el desarrollo de software o incluso en tu vida personal. Lo unico que te digo es que este problema esta en todos lados, en tus comentarios, archivos de configuracion, en mostrar al usuario la version de tal o cual componente que uses en tu aplicacion, la misma version de tu app, el # de empleado, etc. aun en esa inocente calcomania.

La seguridad se atravieza en el camino de la usabilidad, y la usabilidad en el camino de la seguridad, es cuestion de analizar un poquito mas lo que exponemos en nuestras aplicaciones y tener cuidado.

No existe un sistema seguro, lo unico que podemos hacer es poner la barra mas alta y aunque no nos guste, la seguridad por obscuridad puede ser nuestro unico amigo algunas veces.
Duct tape programming: El codigo elegante no paga tu sueldo

Finalmente me di el tiempo de terminar este articulo sobre la conversacion de the Duct Tape programmer; antes de continuar con el articulo dedicare el resto de este parrafo para tratar de explicar el termino. La traduccion literal es programador de cinta gris; se usa esta expresion porque la cinta gris es un material muy resistente para uso multiple que se invento durante la segunda guerra mundial, donde se utilizo para reparar equipo militar rapidamente, cualquier cosa desde armas de fuego hasta aviones; hoy en dia se utiliza para reparar muchas cosas.

Este articulo ha provocado mucha polemica en las ultimas semanas en los medios sociales; gran parte de la comunidad bloguera y twittera tomo este articulo de Joel como un ataque a TDD, practicas agiles de desarrollo y desarrollo de software de calidad en general, algo que encaja perfectamente si lo analizas un poquito, estas personas viven de eso, es lo que venden, bloguean y twittean sobre esto todo el tiempo, asi que el post les toco unas fibras sensibles. Estos fanaticos de patrones y practicas han lanzado una campaña agresiva para convencer al mundo que a los programadores de cinta gris no les importa la calidad del software, que su codigo es inmantenible, que carece de todos esos atributos que esperamos del buen software. Estas personas son las mismas que minimizan el "contenido meramente tecnico", se les ve hablar y hablar (o escribir) sobre buenas practicas de desarrollo y quejarse de como todo el mundo siempre lo hace mal, pero nunca o raramente los ves hablar sobre implementaciones de algo remotamente relacionado con codigo, yo opino que la teoria esta bien, pero sin la practica no sirve de nada. Como siempre lo digo, el problema en todo caso, son los extremos.

Desafortunadamente para ellos el primer ejemplo de programacion con cinta gris que salta a la vista es StackOverflow, un sitio que ha sido desarrollado por programadores que abiertamente han aceptado sin problema alguno que usan tecnicas que no son precisamente agiles o dentro de los mas estrictos patrones de desarrollo, al mismo tiempo este sitio se ha mantenido funcionando al 100% y han agregado un sinnumero de caracteristicas desde su inicio hasta la fecha, lo cual me dice que tienen un codigo con cualidades que hace que esto sea posible; estoy seguro que el codigo no es algo que el programador promedio podria entender y seguramente los puristas encontrarian muchas cosas que les resultarian muy desagradables por aqui y por alla, pero es codigo que cumple su funcion, y lo hace excelentemente bien.


Cuando dije esto sobre SO en twitter, algunos no lo creyeron (mostrando incredulidad de que algo tan bueno pudiera estar hecho con cinta gris, pero hay podcasts donde hablan abiertamente sobre como conducen el desarrollo del sitio), alguien por ahi me respondio muy enojado tratando de minimizarlo alegando que era el unico ejemplo real de programacion exitosa usando cinta gris, desafortunadamente para ellos (una vez mas) si vemos el tremendo exito en los productos de Apple ultimamente, vemos programacion con cinta gris por todos lados, Apple es la Reina (o Rey?) de la programacion con cinta gris, especialmente el ecosistema de desarrollo para iPhone, los que han trabajado con el saben de sus grandes limitaciones y obstaculos que hay que sortear para escribir aplicaciones, pero al final, la gente esta feliz con el producto, y eso es lo realmente importante, a la gente no le importa si la arquitectura es una porqueria o si el codigo es horrible; lo dire una vez mas: no importa.

El problema mas grande de los puristas es que cuando te concentras solamente en hacer que cada linea de codigo este dentro de un patron de diseño, es muy facil cruzar las lineas de abuso de ingenieria y olvidarse de lo mas basico, que es el cumplir con tus clientes y terminar tus proyectos, si no lo terminas, no importa que tan bueno sea el codigo, desafortunadamente el codigo elegante no paga tu sueldo, terminar tus proyectos si lo hace.

Creo que el patron de desarrollo que uso mas frecuentemente es "lo que funcione mejor", no tengo miedo de usar programacion procedural, funcional, POO, dinamica, stored procedures o lo que se requiera, lo que me permita sacar adelante mi trabajo (bueno, a excepcion de XML, odio XML) de una forma que me permita siempre extender y/o modificar mis sistemas facilmente en un futuro, pero lo mas importante de todo es que estoy acostumbrado a entregar buenos resultados, siempre, sin excusas, con frecuencia predico una de mis frases favoritas: no es opcional, tiene que funcionar. Quiero aclarar un punto muy importante, soy muy estricto a la hora de escribir codigo, me gusta el codigo elegante, sigo principios SOLID, escribo pruebas unitarias cuando un codigo lo requiere, es solo que no me gusta forzar todo dentro de un patron, y no siempre escribo mis pruebas religiosamente antes que el codigo (ok, de hecho, nunca escribo las pruebas primero). Eso para mi, es el programador de cinta gris, el que sabe cuando abstenerse de la mera aplicacion de patrones y tiene siempre presente la mas importante caracteristica de tu software; el software que cumple y se entrega a tiempo es esa caracteristica, sin esta, no importa lo que hagas, aun si es una obra de arte, no vale un centavo.

Por otro lado, creo que si hay areas donde se puede ser purista y aplicar todos tus (des?)conocimientos, creo los que proyectos de codigo abierto o proyectos personales son ejemplos perfectos para aplicar todo esto, no hay fechas de entrega, no hay compromiso, no hay riesgos, estara listo cuando estara listo.

Cuando los puristas se encuentran acorralados ante las muestras de buenos resultados de la programacion con cinta gris, la salida facil -esto me recuerda como los mismos Agilistas dicen que cuando un proyecto Agil falla es porque no se aplico correctamente- es decir que se requiere gente muy talentosa para sacar adelante algo asi, y claro, nadie dijo que fuera facil, se requiere talento, se requiere leer y entender esos blogs de contenido meramente tecnico, experimentar, jugar, hackear; al final, el desarrollo de software es un problema humano. Yo creo que las metodologias son para compensar la falta de talento, pero ese es tema para otro post.

No hay reglas fijas y estrictas en el desarrollo de software, si fuera asi, este seria demasiado facil.
si no les gusta el termino "programador de cinta gris" pueden pasar a reclamarle a Mario Cornejo :)
La intuitividad de la Mac: Sincronizando el iPhone
He tenido este problema desde que compre mi iPhone, cada que lo sincronizo despues de haber agregado o modificado alguna nota, iTunes me da este mensajito


Normalmente mantengo unas 10 notas en mi iPhone, asi que siempre va a ser mas del maldito 5 por ciento, nunca he entendido porque se les ocurrio este limite, yo deberia poder cambiar todas mis notas si quisiera sin tener que ser molestado, si la cuestion es poder recuperar notas en caso de algun accidente, podrian mantener la historia de estas, las notas las escribe uno en el mismo iPhone, que tan grandes pueden ser?; otro problema que se genera con esto es que si conectas tu iPhone para sincronizarlo y lo dejas ahi para regresar mas tarde por el, resulta que regresas y la sincronizacion esta atorada en este estupido dialogo. Me parece muy mala usabilidad en este caso, y las cosas no han cambiado aun con el sinnumero de actualizaciones que ha sufrido iTunes.

Recuerden el Principio de menos sorpresa.
La intuitividad de Apple: El boton OK perdido
Cada que conectas un iPhone/iPod a una Mac, iTunes hace sus cosas, toma muchisimo tiempo para sincronizar y sabra Dios que mas (una de esas cosas es que se roba el foco de la aplicacion en la que estas); cuando finalmente termina, nos presenta este pequeño mensajito:


Talvez solo me ha pasado a mi, pero me tomo mucho tiempo (y me refiero a meses) para darme cuenta que no se referia a un boton "OK", sino que simplemente ya se podia desconectar el aparato; supongo que sera muy intuitivo.

Aunque, no soy el unico que piensa que iTunes es pesimo
Ping no debe ser usado para probar si hay conexion
Si un "ping" falla, lo unico que quiere decir es que fallo el ping, no te dice nada sobre si hay o no conectividad/visibilidad entre dos puntos.

Durante una platica hoy en Twitter, me hicieron recordar la frecuencia con la que muchas personas usan ping para probar conectividad/visibilidad entre dos computadoras, lo que muchos no saben es que ping es simplemente un servicio mas y puede ser deshabilitado o bloqueado - algo cada vez mas frecuente en estos dias -, lo cual hace que este metodo de usar ping sea inservible, otro detalle es que cuando quieres probar visibilidad/conectividad, generalmente lo que quieres es usar un servicio especifico, como conexion a DB, web, etc; por lo tanto una opcion que es muchisimo mejor, es usar el comando telnet, al usar telnet no solo probaras conectividad, sino que sabras especificamente si puedes accesar el servicio que requieres.

Algunos de los puertos mas frecuentes:

20, 21 Standard FTP
23 Telnet default
25 SMTP
80 Standard web
115 SFTP
443 Standard secure web
139 NETBIOS (file and printer sharing in Windows)
143 IMAP
445 SMB (para conectarse a Windows desde otros SOs)
1433 SQL


Por ejemplo si quisieramos probar si se puede acceder a una base de datos SQL:
telnet 192.168.1.2 1433

Cuando se logra una conexion exitosamente, normalmente se ve una pantalla negra, si la conexion falla, telnet te dara un mensaje de error

Finalmente, como nota adicional, en caso de que la conexion falle, podrias usar tracert -d [direccion ip] para obtener mas detalles de donde es que falla la conexion
Traduccion de +14,000 terminos tecnicos

Hoy salio en twitter el tema de la traduccion de terminos tecnicos, de hecho hasta decidimos crear una pagina con terminos tecnicos comunes, la cual pueden encontrar aca: Traduccion de terminos

Despues recorde que por algun lado habia yo visto un archivo excel publicado por Microsoft que contenia traducciones de muchos terminos en ingles, la traduccion no solo es al Español, sino a unos 45 idiomas

bastante util el archivito, lo pueden encontrar aqui: Microsoft Terminology

Este post es traido a ustedes por: Un-post-mas-para-servir-de-futuro-recordatorio
Como guardar archivos .GIF desde MS Outlook

Por alguna razon MS Outlook no tiene una opcion forma facil para guardar archibos GIF directamente desde un mensaje; la unica opcion es que te permite guardarlos como BMP, pero eso haria que perdieras la animacion en si, de hecho tampoco te deja guardar archivos .JPG, .PNG etc, el unico formato que te da como opcion es BMP, pero hay muchas ocasiones en las que queremos guardar el archivo original, de vez en cuando yo mismo necesito esto y se me olvida como es que lo he hecho antes, asi que decidi utilizar mi blog una vez mas para poder recurrir a el en un futuro que lo necesite de nuevo, esto de escribir algo en tu blog para recordarlo luego funciona muy bien, se los recomiendo. Pues bien, aqui esta la solucion.

Les menti en el titulo, si hay forma de guardar archivos .GIF desde MS Outlook, pero por los pasos requeridos mejor no me meto ahi, pero les dire que hay una forma mucho mas facil de hacerlo, solo tienes que enviarte el mensaje a una cuenta de web email, como GMail, Yahoo o Hotmail (que conste que no he probado en Yahoo ni Hotmail, pero creo que funciona ahi tambien)

Una vez que lo abras en tu correo web lo podras guardar normalmente como uno esperaria que se puede hacer, dando click derecho en la imagen, guardar como... y ya esta
Estas cansado de XML? yo tambien. proyecto JINI.
Nunca me ha gustado XML, lo he odiado desde "el primer dia", pienso que el formato es demasiado ineficiente, demasiado inflado; He tenido algunas ideas sobre que se puede hacer para reducir el tamaño de archivos xml, tal como tener una cabecera con la definicion de la estructura y otras dias, pero el punto de este post no es hablar sobre esas ideas, sino de mi propuesta para comenzar a dejar de usar XML.

Un area en que XML me parece particularmente molesto es en los archivos de configuracion, y mi propuesta para atacar este problema consiste en formalizar un nuevo formato que por ahora llamo JINI. JINI es un subconjunto de JSON similar a los viejos archivos .ini en simplicidad y es usado especificamente para configuracion para reemplazar todos esos archivos app.config

Beneficios
- Simple
- No mas <>
- Simple
- mas corto
- mas facil de leer
- Mas Simple
- Todo lo que se puede expresar en XML, se puede expresar en JINI, pero es mas simple

Lo malo es que "jini" ya esta tomado (segun los 2 millones de resultados en Google y 714K Bing)

Pense que la idea ya se le habia ocurrido a alguien pero una busqueda rapida me dio cero resultados, asi que pense que seria bueno sacar la idea y ver que opinan al respecto

nota: me comentaron sobre YAML, pero no me convence mucho

que piensan de la idea? son felices con XML?
La programacion es como un juego de ajedrez
Por mucho tiempo he pensado que el desarrollo de software es como un juego de ajedrez, pero aparentemente nadie ha hecho esta analogia antes, solo basta *bingearlo* para ver que hay exactamente (al tiempo de escribir este post) cero resultados (los mismos resultados en Google), afortunadamente esta situacion esta a punto de revertirse al tiempo que escribo este post y todo mundo vee la luz... o talvez no


Y bien, permitanme explicarles un poco sobre mi analogia

El programador mediocre
Uno podria argumentar que este es el programador promedio, pero eso es otra historia, este hace un movimiento sin pensar en los efectos secundarios, su capacidad de analisis es muy poca, hay tantos efectos secundarios (introducir nuevos bugs, seguridad, etc) pero este jugador ni siquiera esta enterado de ello, basicamente se basa en el debugueador y si corre en su maquina entonces esta listo; cuando las cosas inevitablemente no funcionan en produccion el simplemente hace otro movimiento que parece corregir el problema, este ciclo es frecuentemente repetido, si le das un proyecto grande a este tipo muy seguramente hara un movimiento estupido que resultara en Jaque Mate en el proyecto

El buen programador
Este analiza diferentes rutas y escoge la que cree adecuada, este jugador puede hacer un buen juego, de vez en cuando su analisis falla y comete algunos errores, pero el puede aprender de estos, este tipo normalmente entrega buen software con pocos errores que puede corregir rapidamente sin muchos problemas

El mejor
Genio, Guru o como quieras llamarle, este tipo puede hacer una gran cantidad de movimientos rapidamente, y todo en su cabeza, esta informado siempre de las mas recientes tecnicas para vencer a su oponente, pero no cae en el error de simplemente usarlas en su juego, sino que las prueba primero en sus proyectos privados y una vez que el mismo comprobo que son utiles entonces las usa en proyectos reales, conoce las tecnicas mas rapidas, cortas y que le dan el mayor beneficio, sabe las tecnicas para usar en los proyectos pequeños y las que debe usar en proyectos grandes, y sabe tambien que son muy diferentes, este jugador sabe lo que el oponente esta pensando, sabe como respondera el oponente a cada uno de sus movimientos asi que escoge cuidadosamente el mejor movimiento, este jugador conoce los efectos secundarios; las palabras "funciona en mi maquina" no estan dentro de su vocabulario.

Como podran ver las diferencias principales en mi analogia son la capacidad de analisis (seleccionar el movimiento) y los efectos secundarios (que pasa despues de hacer el movimiento). El oponente es tu proyecto de software, el movimiento es escribir el codigo, los efectos secundarios son todo lo demas que es afectado por este.

Cuando fue la ultima vez que creaste un nuevo bug cuando arreglabas aquel otro o agregabas funcionalidad a tu applicacion? o cuando *ellos* encontraron errores en la aplicacion justo despues de lanzarla a produccion? o cuando funciono en tu maquina pero no en el servidor?

Cada vez que vas a hacer un movimiento, detente un momento y piensa en los efectos secundarios, siempre hay efectos secundarios, si no puedes identificarlos, hay herramientas que te pueden ayudar a pensar, como las pruebas unitarias, y entre mas lo practiques, mejor jugador seras, y eso es una promesa
Firefox tarda mucho para correr despues de actualizar a 3.5
Firefox 3.5 (nombre clave Shirekoto) esta listo, todos a bajarlo!

Despues de actualizar y correrlo la primera vez, me salio esta pequeña ventana

Me tomo un rato para darme cuenta que esta ventanita estaba siquiera en mi pantalla, pense que simplemente estaba tardando mucho para correr la primera vez, pero luego ya me parecio demasiado tiempo, entonces di click en la barra de tareas, en el icono de firefox y fue cuando vi la ventanita esta, trate de redimensionarla para ver los contenidos, pero no me dejo, lo unico que pude hacer fue cerrarla y ya Firefox corrio normal

Asi que solo lo agregue aqui por si a alguien le pasa lo mismo, espero que sea de ayuda

sintomas: Firefox tarda mucho en correr la primera vez despues de actualizar a 3.5
solucion: click en la barra de tareas, en el icono de firefox y encuentra la ventanita esta, cierrala y Firefox correra normal
Como convertir DIB a Bitmap

El fin de semana pasado un amigo me pidio ayuda con un codigo para convertir DIB a Bitmap en .NET, habia encontrado un codigo que casi hacia todo lo que necesitaba, pero la imagen se cortaba en los lados, supusimos que el problema era con el codigo que obtenia un puntero al bitmap, asi que investigamos mas y encontramos un codigo que supuestamente arreglaba ese problema, solo tuvimos que hacer unos cambios y un par de arreglos para que funcionara correctamente. Como no encontramos una solucion completa por ningun lado decidi escribir este post ya que vi muchisima gente con este problema preguntando en muchos foros en Internet, asi que espero que pueda ser util, sin mas, aqui va la solucion:

Primero tienes que agregar una referencia a System.Drawing.dll en tu proyecto, luego agrega esto al uses

//Name spaces needed
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
El siguiente paso es declarar la estructura BITMAPINFOHEADER, esta puede estar declarada fuera de tu clase:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct BITMAPINFOHEADER
{
public uint biSize;
public int biWidth;
public int biHeight;
public ushort biPlanes;
public ushort biBitCount;
public uint biCompression;
public uint biSizeImage;
public int biXPelsPerMeter;
public int biYPelsPerMeter;
public uint biClrUsed;
public uint biClrImportant;

public void Init()
{
biSize = (uint)Marshal.SizeOf(this);
}
}

Luego necesitas agregar esto para importar una funcion de GdiPlus.dll
//GDI External method needed Place it within your class
[DllImport("GdiPlus.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
private static extern int GdipCreateBitmapFromGdiDib(IntPtr pBIH,
IntPtr pPix, out IntPtr pBitmap);
Y bien, ahora podemos irnos al codigo en si que nos servira para convertir el DIB a Bitmap, notese el uso de la funcion GetPixelInfo, aqui precisamente estaba la raiz de nuestros problemas; la funcion BitmapFromDIB que encuentras por todo internet no tiene este codigo asi que eso hace que no funcione en muchos casos. De hecho la funcion esta que anda rondando por internet, toma un parametro pPix pero nunca menciona como obtener este valor. Este codigo necesita estar declarado dentro de tu clase

//THIS METHOD SAVES THE CONTENTS OF THE DIB POINTER INTO A BITMAP OBJECT
private static Bitmap BitmapFromDIB(IntPtr pDIB)
{
//get pointer to bitmap header info
IntPtr pPix = GetPixelInfo(pDIB);

//Call external GDI method
MethodInfo mi = typeof(Bitmap).GetMethod("FromGDIplus", BindingFlags.Static | BindingFlags.NonPublic);
if (mi == null)
return null;

// Initialize memory pointer where Bitmap will be saved
IntPtr pBmp = IntPtr.Zero;

//Call external methosd that saves bitmap into pointer
int status = GdipCreateBitmapFromGdiDib(pDIB, pPix, out pBmp);

//If success return bitmap, if failed return null
if ((status == 0) && (pBmp != IntPtr.Zero))
return (Bitmap)mi.Invoke(null, new object[] { pBmp });
else
return null
;
}

//THIS METHOD GETS THE POINTER TO THE BITMAP HEADER INFO
private static IntPtr GetPixelInfo(IntPtr bmpPtr)
{
BITMAPINFOHEADER bmi = (BITMAPINFOHEADER)Marshal.PtrToStructure(bmpPtr, typeof(BITMAPINFOHEADER));

if (bmi.biSizeImage == 0)
bmi.biSizeImage = (uint)(((((bmi.biWidth * bmi.biBitCount) + 31) & ~31) >> 3) * bmi.biHeight);

int p = (int)bmi.biClrUsed;
if ((p == 0) && (bmi.biBitCount <= 8))
p = 1 << bmi.biBitCount;
p = (p * 4) + (int)bmi.biSize + (int)bmpPtr;
return (IntPtr)p;
}
Finalmente, como algo agregado, lo que mi amigo realmente necesitaba era convertir de DIB a TIFF (grupo 4), asi que escribio una funcion mas que usa la funcion previa de BitmapFromDIB function and allows you to set the image resolution

private void SavehDibToTiff(int hDIB, string fileName, int xRes, int yRes)
{
//Identify the memory pointer to the DIB Handler (hDIB)
IntPtr dibPtr = new IntPtr(hDIB);

//Save the contents of DIB pointer into bitmap object
Bitmap myBitmap = BitmapFromDIB(dibPtr);

//Set resolution if needed
if (xRes >0 && yRes>0)
myBitmap.SetResolution(xRes, yRes);

//Create an instance of the windows TIFF encoder
ImageCodecInfo ici = GetEncoderInfo("image/tiff");

//Define encoder parameters
EncoderParameters eps = new EncoderParameters(1); // only one parameter in this case (compression)

//Create an Encoder Value for TIFF compression Group 4
long ev = (long)EncoderValue.CompressionCCITT4;
eps.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, ev);

//Save file
myBitmap.Save(fileName, ici, eps);
}
//Helper to get Encoder from Windows for file type.
private static ImageCodecInfo GetEncoderInfo(String mimeType)
{
ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();
for (int j = 0; j < encoders.Length; ++j)
{
if (encoders[j].MimeType == mimeType)
return encoders[j];
}
return null;
}

Y eso es todo, espero les sea de utilidad, gracias a Danny por darme el codigo final y agregarle comentarios
Porque las pestañas de IE tienen colores?

colored tabs

Esto es algo de lo que me gusto mucho en Internet Explorer 8, pero no todo mundo capta inmediatamente el significado de los colores. Los colores son para agrupar pestañas relacionadas entre si, osea que si tu sigues un link de una pagina y IE abre una pestaña, asignara el mismo color que la pestaña previa de donde se abrio esta nueva y de esta manera podras ver facilmente que una fue derivada de la otra, esto es muy util en estos dias que uno normalmente mantiene muchisimas pestañas abiertas al mismo tiempo, unas para cuestiones personales, otras para trabajo, busquedas, etc, el tenerlas agrupadas por colores nos permite ver cuales estan relacionadas entre si.

La motivacion a escribir este post fue precisamente porque alguien me pregunto que significaban los colores, asi que pense que seguramente habria mas gente que tendria la misma pregunta.

Twitter para desarrolladores
Durante el #followfriday de hoy en Twitter se me ocurrio crear una lista de los desarrolladores de habla hispana que regularmente escriban cosas relacionadas con el desarrollo de software.

Es practicamente imposible (y creo que seria un desperdicio total) que alguien escriba 100% cosas relacionadas al desarrollo en twitter, pero esta gente son los que yo he notado que son mas regulares en mantenerse apegados al tema.

Espero sea de utilidad para los programadores que quieran entrar en contacto con otros programadores en Twitter, aun para los que no han entrado a twitter y les interese poder dialogar con gente de su mismo medio, este seria un buen medio para hacerlo.

Sin mas, aqui esta la lista, la cual estare actualizando constantemente:
@ajlopez
@gabo
@fabianober
@fcastellanos
@ferglo
@jorgegamba
@HardBit
@mario_chavez
@mariohcornejo
@mmonterroca
@scasware
@SrBichi

Y por supuesto @ebersys
Unir cadenas con comas
Hace unos dias Eric publico un problema, al principio me dio flojera responderlo, pero al ver el numero de respuestas decidi hacerlo agregando el reto personal de ser la respuesta mas corta (con mi equipo anterior competiamos en ver quien podia refactorizar mas), asi que aqui esta:
El problema:
Escribir una funcion que tome un IEnumerable no nulo y regrese una cadena con las siguentes caracteristicas:

(1) Si la secuencia esta vacia, regresar "{}".
(2) Si la secuencia contiene un solo elemento "ABC" el resultado sera "{ABC}".
(3) Si la secuencia contiene 2 elementos "ABC", "DEF" El resultado sera "{ABC and DEF}".
(4) Si la secuencia contiene mas de 2 elementos "ABC", "DEF", "G", "H" el resultado sera "{ABC, DEF, G and H}". (Noten que los ultimos 2 elementos no estan unidos por coma)

Mi solucion:

static string JoinStrings(IEnumerable<string> strings) {

    int len = strings.Count();

    return len == 0 ? "{}"

        : len == 1 ? "{"+strings.First()+"}"

        : "{"+strings.Take(len - 1).Aggregate((string head, string tail) => head+", "+tail)+" and " +strings.Last()+"}";

}


Por cierto, si solo quisieramos unir las cadenas con comas (y regresar una cadena vacia cuando no hay elementos), pudieramos utilizar esto:

static string JoinStrings2(IEnumerable<string> strings) {

    return strings.Count() > 0 ?

        strings.Aggregate((string h, string t) => h+", "+t)

        :

        "";

}

El reto de crear un StackOverflow hispano
Ayer el dia de antier salio a la platica en twitter el tema de crear un sitio como StackOverflow para la comunidad hispana, Fabian inicio el tema y dio el seguimiento propio en su blog, Mario dio su punto de vista en su blog tambien.

Para los que no hallan escuchado de StackOverflow, la descripcion rapida que dan los mismos autores del sitio es "es como experts-exchange, pero sin la basura" (is like experts-exchange, but without the evil), el caso es que StackOverflow se ha convertido rapidamente en un referencial muy importante para encontrar soluciones rapidas a problemas de programacion, practicamente en cualquier lenguaje.

Pues bien, esta idea de crear un clon de este sitio en español ya me habia rondado por la cabeza pero tenia (tengo) muchas dudas sobre si podria llegar a funcionar, me encantaria poder hacer funcionar algo asi, este blog en particular es un intento por llevar recursos tecnicos al publico de habla hispana, pero desafortunadamente al mismo tiempo es muy facil ver la falta de interes en estos temas. A mi parecer hay algunas cuestiones que deberiamos responder para ver la viabilidad del proyecto. (si no quieres leer todos los puntos, saltate al #7)

  1. Identificar si el proyecto es realmente una nececidad, habria que averiguar el interes de la comunidad en este proyecto y los sitios de este tipo en la actualidad (talvez ya hay algo asi pero necesita apoyo?).
  2. Muchos de los desarrolladores hispanos con buen nivel participan en comunidades en ingles unicamente (sera que tambien nos ayudarian?).
  3. La mayoria (creo) de los desarrolladores recurren a sitios en ingles para encontrar soluciones a sus problemas (se debe esto a la falta de recursos en español? usarian recursos en español si existieran?).
  4. Que cantidad de desarrolladores no saben suficiente ingles de tal manera que su unica opcion es buscar contenido en español.
  5. Los problemas que encontramos y los terminos tecnicos generalmente estan expresados en ingles (errores del compilador, frameworks
  6. El #5 me lleva a otro punto importante, al hacer la descripcion/solucion de un problema deberiamos hacerlo en ingles y español? dado que si hacemos la descripcion en español, no servira para muchos que buscan los terminos en ingles (y que se beneficiarian de encontrar una respuesta en español) y si solo la hacemos en ingles... pues entonces ya no es version en español, este punto en particular creo que es un problema complicado.
  7. La idea por supuesto ya se le ha ocurrido a muchos otros antes, y hay quienes han pedido incorporar el idioma español al sitio de alguna manera, la respuesta de los autores es positiva, aunque no a corto plazo (tambien en el podcast lo han mencionado), pero esa podria ser otra opcion, hay varias formas para lograrla, siendo la mas simple de ellas el traducir los articulos, la implementacion no debe ser muy dificil, podria haber una opcion para pedir traduccion (para dar prioridad a la traduccion), y si juntaramos suficiente gente podria ser mas factible que algo asi avanzara mas rapido. Cabe destacar que esta opcion no tendria el problema del punto #6 y de hecho yo me inclino por esta opcion y si lo que realmente importa es contar con esta herramienta, creo que es la primera opcion que deberiamos perseguir una vez que podamos manifestar suficiente interes por parte de la comunidad (se me ocurre que podria ser una entrada (pregunta) en stackoverflow y las respuestas serian el apoyo).
Creo que esos son los puntos mas importantes que habria que contemplar para poder hacer algo, este ejercicio me ha servido a mi para identificar lo que yo considero la mejor opcion, hasta ganas me dan de borrar los otros puntos, pero pase mucho tiempo escribiendolos, asi que los dejo.

Que piensan?
More Posts Next page »