Drag and Drop en Firefox de archivos (especialmente gmail :) )

Encontré algo genial que quiero compartirlo con todo el mundo... así es... algo que creo, podría cambiar la vida de aquellos que leen este blog. Es bastante habitual tener la necesidad de subir un archivo a un sitio web. También es bastante habitual estar frustrado a la hora de tener que buscar ese archivo en el disco, a veces puede hasta tomar mucho tiempo encontrarlo o ni siquiera sabemos dónde lo habíamos dejado (uno tiene que terminar usando técnicas de copy and paste... ya no más. Un plugin, llamado dragdropupload de firefox nos simplifica eso permitiéndonos arrastrar archivos directamente dentro de los botones browse (o upload) del firefox. ¡Genial! Aun mejor, cuando necesitamos hacerlo para gmail, nos permite arrastrar varios archivos. ¿El sueño del pibe, o no?

[Read more →]

Redirigir un puerto en Debian Etch usando iptables

No soy ningún experto en iptables, honestamente no se aún como funcionan, pero necesitaba redireccionar un puerto (el 80 que es el servidor web) de una pc que estaba conectada directamente a internet a una pc interna de la red sin conexión a la red así que aprendí lo mínimo e imprescindible para llegar al siguiente comando que hizo la magia que necesitaba.

# iptables -t nat -A PREROUTING -p tcp -d <public-ip> --dport 80 -j DNAT --to-destination <private-ip>:80

Reemplazando, donde dice public-ip por la ip fija que tiene el servidor en internet,y en private ip, la dirección IP interna de la pc a la que quería redirigir el puerto 80

En lugar de -d <public-ip> puedo usar -i eth0 sin embargo si debo redirigir una interfaz virtual (esas que son por ejemplo eth0:1) parece que no funciona correctamente (tira un warning). Lamentablemente justo ese era mi caso, asi que debi usar la ip.

Luego, era hora de probarlo, y como era de esperar. ¡No andaba!

Me faltaba habilitar en el kernel el forwarding de paquetes.

Para saber si el packet forwarding está activado se utiliza el siguiente comando:
# sysctl net.ipv4.ip_forward

Si este comando retorna 0, significa que no esta activado, por lo que para activarlo procedemos a ejecutar el siguiente comando:

# sysctl -w net.ipv4.ip_forward=1

Luego de haber hecho esto funcionó de mil maravillas.

Obviamente cuando reinicie la computadora perderé esta configuraciones, por lo que sería buena idea hacer estos cambios permanentes, pero eso es historia de otro post.

Nuevo formato estándar OOXML

Por un tiempo abandoné un tema realmente importante y hoy, que lo retomo para ver que había sucedido, me entero del fatídico resultado.

Aparentemente la ISO (Industrial International Standard Organization) aprobó el estándar DIS 29500, más conocido como OOXML (Office Open XML) (ya con el nombre uno se imagina la empresa detrás de esto verdad?)

[Read more →]

Membership Provider y Application Name

Algo muy Microsoft nos ha pasado hoy: al hacer un deploy de una aplicación en un entorno de test (montado en un IIS) dejaron de funcionar los usuarios. Era necesario hacer que los usuarios se mantuvieran tal cual estaban en el entorno de desarrollo, entonces esta contingencia nos ocasionó un problema.

Es muy importante la confiabilidad de los datos en la base de datos. Recordemos que el Membership Provider de .NET usa unas tablas en el servidor específicamente para su propio funcionamiento.

Lo que pasó fue que el Membership Provider se asocia con un Application Name, y este nombre, si no se especifica, se calcula. Y la forma de calcularlo del IIS es diferente a la del ASP.NET Development Server.

Por tal motivo, es siempre bueno recordar que hay que especificar puntualmente cual es el nombre de la aplicación, para que despues, un movimiento de servidor u otro cambio no afecte en nada al sistema.

Esto lo aprendí de ScottGu's Blog en donde también explica como se especifica este nombre muy facilmente.

En resumen, el Membership provider debe quedar de la siguiente manera.

 
<membership>
<providers>
        <add .... applicationName = "/" />
    </providers>
</membership>

Algo similar se debe hacer con el Role Provider si es que se emplea uno.

Yo usé como nombre "/" porque ese es el nombre de applicacion que ya tenía anteriormente, pero en forma implícita. Sería recomendable usar algún otro nombre, para de esa manera poder tener tal vez varias aplicaciones corriendo sobre la misma base de datos, y con permisos diferentes.

Reglas de ¿Bill Gates?

Me ha llegado un mail, con una de esas terribles cadenas que, generalmente, no dicen nada útil. Aunque esta, parece interesante. Pareciera que en algún momento Bill Gates (el antiguo CEO de Microsoft) tuvo una charla en la Universidad de Yale (EEUU) y dió algunas reglas aplicables a todos los estudiantes de la universidad. Son una serie de objetivos, o premisas que uno debería tener presente antes de darse por vencido, o al comienzo de tomar un emprendimiento.

Me asusta mucho este tipo de cadenas que llevan el nombre de personajes famosos de la actualidad que no hacen citas a fechas exactas, no dicen quienes fueron sus traductores, ni siquiera hablan acerca de cómo fue recibido por los oyentes. Me gustaría pensar que es inexperiencia de la gente que reenvia las cadenas y no que se está perdiendo la autoría de los escritos. Recordemos que esto podría ser de Bill Gates en Yale, así como de Juan Perez en la Universidad de la Antartida (si es que realmente existe) y como no sabemos quién es la fuente, no podemos asegurar su procedencia (ni, por supuesto) preguntar un poco más al respecto.

Aquí va:

[Read more →]

CompositeControl contenido en un tag Div en lugar de Span

Si uno observa mi post anterior, podrá apreciar que le paso al constructor de WebControl un parámetro HtmlTextWriterTag que le indica al control, que tag debe emplear a circunscribir todos los demás controles.

Sin embargo, si heredo de CompositeControl, no tengo esa opción de pasarle al constructor un parámetro, y por default simpre usará un Span.

Si yo quiero que mi clase heredada de CustomControl tenga un tag diferente al div, deberé sobrecargar la propiedad TagKey, como hago en este ejemplo para que mis controles estén contenidos en un tag Div.

public class FiltersControl : CompositeControl
{
    /// <summary>
    /// Envolvemos el control en un tag Div
    /// </summary>
    protected override HtmlTextWriterTag TagKey
    {
        get
        {
            return HtmlTextWriterTag.Div;
        }
    }
}

.Net, Dynamic Controls, WebControls y ViewState

Para un proyecto necesito hacer un "Custom Control" (tambien llamados a veces Server Controls o WebControls) que sea una composición de controles generados dinamicamente porque no puedo saber a priori ni la cantidad ni el tipo de controles que necesitaré. Además necesitaba que mantuvieran, estos controles dinámicos, el viewstate.

Me tropecé con un montón de trabas, así que en lugar de intentar mi problema original, comencé con casos muchos mas simples para intentar apuntar a cada problema que tenía específico. El más molesto de todos ellos era que el ViewState se perdía en cada postback.

Originalmente mi clase de prueba, que agregaba dos textbox y un botón para testear el postback era así:

 
public class FiltersControl : WebControl
{
    public FiltersControl() : base(HtmlTextWriterTag.Div) { }
 
    protected override void CreateChildControls()
    {
        TextBox text1 = new TextBox();
        TextBox text2 = new TextBox();
 
        Button button = new Button();
        button.Text = "Postback!";
 
        Controls.Add(text1);
        Controls.Add(text2);
        Controls.Add(button);
    }
}

Pero fallaba inmediatamente, sin embargo si lo heredaba de CompositeControl funcionaba perfectamente. Gracias a Lutz Roeder's Reflector e investigando como funcionaba CompositeControl llegué a la conclusión que agregando únicamente la interfaz marcador INamingContainer se solucionaban todos los problemas, al menos en ese código tan simple.

Así que el siguiente código funciona como uno esperaría, y se puede apreciar que es idéntico al anterior, pero esta vez la clase tiene una interfaz.

 
public class FiltersControl : WebControl, INamingContainer
{
    public FiltersControl() : base(HtmlTextWriterTag.Div) { }
 
    protected override void CreateChildControls()
    {
        TextBox text1 = new TextBox();
        TextBox text2 = new TextBox();
 
        Button button = new Button();
        button.Text = "Postback!";
 
        Controls.Add(text1);
        Controls.Add(text2);
        Controls.Add(button);
    }
}

Moraleja, si implementan un control, que contiene otros controles, aún cuando saben que no habrá conflictos de nombres, o heredan de CompositeControl o lo hacen de Control (o alguna clase que herede) y marcan la clase con la interfaz INamingConteiner para no tener problemas con el ViewState

Casos de estudio, primeros pasos

Hemos comenzando a reconstruir nuestras páginas web, eso quiere decir que queremos ponerles contenidos útiles, que nos ayuden a llegar a nuestros clientes. Así como también atraer nuevos.

Nuestro proyecto como empresa es claro, queremos que nuestros clientes crezcan. Sabemos que si queremos crecer esta es la única forma de lograrlo.  Solo hay que tener un compromiso mutuo. :) Y esto, no es solo una ilusión o una idea es, en parte, nuestras propias experiencias pasadas. Por eso, después de algunas recomendaciones (en particular las recomendaciones de Diego Naya, que es un amigo de la casa), estamos construyendo nuestros casos de estudio. Aquellos clientes (tanto grandes empresas como pequeños emprendimientos) que obtuvieron en 3f algo que no cualquiera pudo darles: confianza, seguridad, buenos precios y eficiencia.

El primer material relevante que encontré fue el incluido aquí. En adelante irán viendo cuál es nuestro progreso en la creación de estos análisis. Tenemos información para componerlos, solo estamos viendo cuál es la mejor forma de presentarla.

Conmemorando gmail… El mail, según Google.

En algún sitio por ahí leí algo que me llamó sumamente la atención. Recordemos que esta gente tiene una fasinación con hacer bromas, les encanta cambiar la forma en que funciona el sitio, las cosas que hace, cómo las hace... y transmiten esa idea de "somos unos pícaros y nos gusta". A mi me gusta la actitud que tienen. Saben que gmail, el pasado primero de abril, ¿cumplió 4 años?

Logo gmail, gentileza de popgadget.net

Efectivamente... hace 4 años ya, Google dijo que iba a lanzar un nuevo servicio de mail, que tendría 1Gb. Lo cual asombró a todo el mundo y se creyó que era una nueva broma de google por el día de los inocentes. Quién iba a creer que google iba a tener 1Gb para todos sus usuarios del cliente de mail. Cuando muchos estaban ofreciendo 2mb y una extensión con cargo hasta los 100mb (caso hotmail) Google dijo... bueno, gente, basta. Yo doy 1Gb, y desde ahí vamos. Algunos tuvimos que esperar hasta darnos cuenta que gmail existía, hasta darnos cuenta que era para algunos pocos porque solo podías acceder si alguien te invitaba. Mi invitación la recibí de un viejo amigo Inglés del IRC. Un tipo macanudo... me cambió la vida.

En mi experiencia personal, gmail fue empezando a convertirse en algo importantísimo para mi. Con el tiempo me fui acostumbrando a tener más espacio, más velocidad, más simplicidad, mejores búsquedas. Efectivamente, sentí que google me había convertido... pero, ¿saben qué? No me arrepiento. Gmail se merece mis flores. Es excelente.

Escritorios y Nuevas PCs

No tiene mucho que ver con el resto de los post publicados en este blog, especialmente con los mios, pero como atañe a 3f, supongo que es un buen lugar para escribirlo.

Como bien dice el título, compramos nuevas pcs, y nuevos escritorios para tener donde colocarlas. Lo más característico de las pcs son los monitores grandes, el resto del harware, si bien de calidad, no es nada sorprendente en relación a otras computadoras de oficina.

Espero les gusten :)