ContraAtaque. El fútbol como hilo conductor

contraataqueDespués de un año y medio dándome vuelta la idea en la cabeza, con muchos amagues de arrancar para frenar casi inmediatamente, abrí un nuevo proyecto.

ContraAtaque, es el nombre de una ¿publicación? (ya no sé qué terminos son los correctos de usar), la cual tiene como eje principal el fútbol, desde la mirada que alguien como vos y yo puede dar. La intención no es escribir sobre el fútbol profesional de cada día (que en todo caso puede llegar a ser un disparador), sino de contar historias reales o ficticias.

En principio seré el único «redactor», con todo lo que eso significa. No sólo por el hecho de eleborar el contenido original, elegir los temas, redactarlos, editarlos, etc., sino porque ¡no soy redactor! Pero entiendo que hay que animarse, y hoy en día tenemos los «no profesionales» muchas herramientas a mano como para practicar durante toda nuestra vida, logrando un producto (a mi entender) al menos correcto.

En la página oficial contraataque.nicolasflores.com.ar voy a ir poniendo ideas o avances sobre el proyecto, las publicaciones las pueden seguir a través de la cuenta de twitter @contraAtaquetw, o directamente en Medium, que es la plataforma en donde se publicarán, en @contraAtaque.

Quisiera poder entregar nuevas historias en forma mensual. La rutina de la escritura será una gimnasia nueva para mí, por lo que espero sepan comprender si alguna vez me atraso.

Cualquier sugerencia, por favor escríbanme al email, o por twitter, ya sea por cuestiones de redacción, o temas sobre los qué escribir.

El primero de estos escritos es «Un tipo del Carajo». Cuenta la historia de mi vínculo con Roberto Atencio, a quien conocí en un partido de fútbol en una quinta, siendo yo un pibe.

Forzar download de archivos con .htaccess

Desde hace un tiempo que los browsers son más que sólo browsers. De hecho, Google desarrolla Chrome para que se convierta en el único software instalado en tu máquina. Más allá de eso, todos los browsers hoy en día ejecutan casi todo tipo de archivo (plugins mediante).

Un típico caso es el de un archivo .pdf, donde generalmente se ejecuta en una pestaña el visualizador. Pero a veces uno tiene la necesidad de querer obligar al usuario (o facilitarle) la descarga del archivo, para que disponga como más le guste luego.

Para eso, lo que hay que hacer es un archivo .htaccess en el directorio donde se aloje el archivo a descargar, con el siguiente contenido:


AddType application/octet-stream .pdf

De donde se puede cambiar el pdf por cualquier tipo de extensión.

Sí, así de simple.

Filezilla quita los saltos de línea

No estoy seguro si me había sucedido antes. Hoy ocurrió, y ya no olvidaré la solución.

Filezilla tiene distintos modos de transferencia de archivos: automático (viene elegido por defecto), ASCII y Binario. La teoría dice que si el archivo es de texto, el tipo de trasferencia adecuado es ASCII, y si es imagen, zip, etc, Binario.

FIlezilla (y asumo que otros softwares también), por algún motivo que también desconozco, en una transferencia ASCII hace de las suyas, asumo que para optimizar la transferencia, o algo similar. Lo cierto es que a mí me quitó los saltos de línea, y en un archivo .php eso se traduce en errores de programación.

¿Solución? menú Transferencia / Tipo de transferencia / Binario. Eso sube tu archivo tal cual como lo tengas en tu compu al servidor.

Fork me

En un ya antiguo post, expliqué una modificación hecha a un plugin de jQuery muy usado y genial, el jQuery.Validation. Hace poco recordé aquella modificación,  y se me ocurrió revisar si con los sucesivos updates del plugin habian incluído esa funcionalidad.

Tuvo varios, muy buenos por cierto, pero ninguno añadiendo mi funcionalidad. Entonces hice lo que todo programador debe hacer al menos una vez en su vida: fork, clone local, push, pull request.

Para los que recién empiezan en el mundo de la programación, trataré de resumir los conceptos.

GitHub es un sitio que pone a nuestra disposición distintos proyectos de la comunidad de programadores. No sólo están para descargar, sino para que todos mejoremos los productos, detectando errores y dando las posibles soluciones. Todo esto es posible gracias a GIT como sistema control de versión.  La curva de aprendizaje de GIT es mayor en comparación a SVN, pero es notablemente superior.

Como a mí se me ocurrió una nueva funcionalidad, puedo proponerla. El modo correcto es ir al proyecto en cuestión, clickear en Fork para crear una copia del mismo, pero en nuestro perfil, clonarlo en forma local, hacer los cambios y subirlos, y finalmente, avisarle al creador del original que uno tiene una propuesta nueva. Si le parece correcto, la modificación pasará a formar parte del proyecto original.

Hace un par de días realicé el pull request para mi versión del jQuery.Validation, pueden chequearlo desde acá.

UPDATE: mi aporte ya forma parte del plugin oficial 🙂

Seteo de FB.Canvas.setAutoGrow

Al desarrollar apps de Facebook, es de esperar que las distintas páginas que la componen tengan diferentes altos, como sucede con cualquier sitio web.

Como las apps se cargan dentro de un iframe (el cual siempre tiene un alto), necesitamos hacerle saber a Facebook que a medida que navegamos entre pantallas, debe actualizar el alto del iframe.

Es así como Facebook nos da el maravilloso FB.Canvas.setAutoGrow,  que promete ser la solución a las molestas barras de scroll vertical del iframe.

Pero no lograrán deshacerse de ellas al menos que pongan estas líneas de CSS:


html, body{
    overflow:hidden;
}

No estaría mal que incluyan este código en el developers.facebook.

Ajuste para jQuery.validationEngine

Uno de mis plugins favoritos de jQuery, es el jQuery.validationEngine. Un muy completo plugin para validación de formularios, muy customizable, desde el tipo de validación, hasta dónde debe aparecer el warning de error.

Pero hoy me pidieron algo que si lo trae por defecto, no lo encontré. El plugin ejecuta la validación de cada campo no sólo cuando el usuario hace el submit del formulario, también lo hace cuando el usuario termina de completar un campo y pasa al siguiente. De esta manera, permite corregir  lo erróneo en el momento.

Si se desea evitar esa validación al pasar de un campo al otro y dejarla activa sólo al hacer submit, uno debe hacer lo siguiente:


$(".registerform").validationEngine({
   bind: false
});

Hoy me pidieron que la validación al pasar de un campo a otro se haga sólo si el usuario empezó a escribir algo en el campo. Por defecto, si un campo es requerido, el usuario hace foco, no lo completa, pasa al siguiente, y se le muestra un error, ya que el campo es obligatorio y lo dejó sin completar.

Pero el pedido tiene sentido. No hace falta ejecutar esa validación del campo antes de siquiera empezar a completarlo. Y además, no debo perder la validación de campo requerido al hacer submit.

La mejor manera que encontré de hacer esta excepción fue editar jquery.validationEngine.js. Viendo el código, llegué a donde necesitaba editar:

_onFieldEvent: function(event) {
   var field = $(this);
   var form = field.closest('form');
   var options = form.data('jqv');
   options.eventTrigger = "field";
   // validate the current field

   window.setTimeout(function() {
      methods._validateField(field, options);
      if (options.InvalidFields.length == 0 && options.onSuccess) {
         options.onSuccess();
      } else if (options.InvalidFields.length > 0 && options.onFailure) {
         options.onFailure();
      }
   }, (event.data) ? event.data.delay : 0);
},

Aquí veo que se ejecuta la validación ante un evento del input (el cual se puede configurar mediante las opciones del plugin). Entonces, sólo debo ejecutar una verificación antes de validar:

_onFieldEvent: function(event) {
   var field = $(this);
   var form = field.closest('form');
   var options = form.data('jqv');
   options.eventTrigger = "field";
   // validate the current field

   if(field.val().length > 0){

      window.setTimeout(function() {
      methods._validateField(field, options);
      if (options.InvalidFields.length == 0 && options.onSuccess) {
         options.onSuccess();
      } else if (options.InvalidFields.length > 0 && options.onFailure) {
         options.onFailure();
      }
      }, (event.data) ? event.data.delay : 0);

   }
},

Y listo. De esta manera, primero chequeo que haya en verdad algo que verificar antes de entrar al proceso de validación. Y como esto está atado sólo a eventos del input, al hacer submit del formulario se ejecutan siempre las reglas de validación.

UPDATE: subí estos cambios a GitHub, más detalles acá.