Publicado el Jan 6, 2012

¿Qué archivos agregar al SVN, de un proyecto C# / ASP.NET?

Esta es una pregunta que muchos nos planteamos cuando un equipo está trabajando simultáneamente con un mismo proyecto compartido con SubVersion (SVN) o cualquier otro sistema de versionamiento. En los peores de los casos, esta pregunta nos llega como imprevisto cuando nos damos que cada vez que hacemos update lloramos. Por lo tanto, ya sea que te haya sucedido o no, a continuación te muestro la lista que utilizo para ignorar aquellos archivos que -a mi juicio- no deberían de ser incluído en un sistema de versionamiento.

Esta es mi lista de archivos a ignorar (en el formato que acepta SVN) también conocido como ignorelist (svn:ignore):

*.pdb
*.exe
*.dll
debug/*
release/*
*.user
*.suo
obj/*
bin/*
obj
bin
VSMacros80

Espero que esto te sea de utilidad.

Publicado el Jun 14, 2011

Cambiando el Time Zone de Oracle Data Modeler

Si igual que a mi necesitas cambiar el time zone de tu copia de Oracle Data Modeler (versión 2 o 3) entonces te mostraré cómo hacerlo.

  1. Ubica el folder de instalación de Oracle Data Modeler.
  2. Edita el archivo datamodeler/bin/datamodeler.conf.
  3. Agrega al final la siguiente línea AddVMOption -Duser.timezone=GMT-4.

Listo! Reiniciando Oracle Data Modeler hará que este detecte los cambios. Cabe destacara que al utilizar la función AddVMOption puedes agregar cualquier variable de entorno Java, que en este caso, afectará a Oracle Data Modeler.

Publicado el May 3, 2011

Cambiando el Time Zone de Oracle SQL Developer

Si igual que a mi necesitas cambiar el time zone de tu copia de Oracle SQL Developer (versión 2 o 3) entonces te mostraré cómo hacerlo.

  1. Ubica el folder de instalación de Oracle SQL Developer.
  2. Edita el archivo sqldeveloper/bin/sqldeveloper.conf.
  3. Agrega al final la siguiente línea AddVMOption -Duser.timezone=GMT-4.

Listo! Reiniciando Oracle SQL Developer hará que este detecte los cambios. Cabe destacara que al utilizar la función AddVMOption puedes agregar cualquier variable de entorno Java, que en este caso, afectará a Oracle SQL Developer.

Publicado el Apr 4, 2011

¿Cómo cambiar el “user agent” a Firefox 4, 5, 6, 7?

Acabando de instalar Firefox 7 me vi en la necesidad de cambiar el user agent (agente de usuario) para poder darle la vuelta al proxy de mi lugar de trabajo y poder trabajar más rápido. Si quieres saber cómo cambiar el susodicho user agent pues deberá de hacer lo siguiente:

  1. Estando en Firefox 7 escribes “about:config” y presionas “enter”.
  2. Haz click en el único botón que aparece junto a un mensaje de alerta.
  3. Sobre la tabla que te aparecerá haz click derecho dale a “new” y “String” (o “nuevo” y “cadena de caracteres”)
  4. Te saldrá un popup para introducir un nombre y ahí pondrás el siguiente: “general.useragent.override” (sin las doble comillas)
  5. Luego, en otro popup, vas a poner el “user agent” que desees.

Listo! Ahí tienes tu Firefox 7 con el “user agent” que siempre soñaste!

Publicado el Dec 8, 2010

Cómo interceptar las llamadas AJAX de jQuery y simular la latencia

Desarrollando una demo de una aplicación web, me vi en la necesidad de interceptar las llamadas AJAX para poder simular la latencia, es decir, un tiempo en retardo que toman un conjunto de datos en viajar de un punto a otro.

Como estaba utilizando jQuery, me puse a investigar en la documentación para determinar si existe algún punto en común que preceda a todas las llamadas asincrónicas realizadas a través de $.ajax. Mi idea era realizar algo del siguiente modo.

Mi idea…

$.preAjax(function(argumentos) {

  // Intercepto todas las llamadas AJAX
  // y las ejecuto en un tiempo más tarde.

  setTimeout(function() {
    $.ajax.apply(this, argumentos);
  }, Math.random() * 1000);

});

Como dije previamente, dicha función no existe. Entonces procedí a crear un código que me permita realizar lo anterior. ¿El resultado? A continuación.

El código


// Este objeto guardará los argumentos
// y las referencia a this.

var testAjax = {
  args : {}, // argumentos
  thiz : {}, // referencias a this
  fn : {},   // donde se guardará la función original de $.ajax
  // Interceptor de las llamadas AJAX.
  ajax : function(uuid) {
    var args = this.args[uuid], thiz = this.thiz[uuid];
    delete this.args[uuid];
    delete this.thiz[uuid];
    this.fn.ajax.apply(thiz, args);
  }
};

jQuery(document).ready(function($) {

  // Guardo la función original de AJAX.

  testAjax.fn.ajax = $.ajax;

  // Sobrescribo la función original de AJAX.

  $.ajax = function() {

    // Generar único id.
    var uuid = (new Date()).getTime();

    // Guardar todos los argumentos originales.
    testAjax.args[uuid] = arguments;
    // Guardar la referencia original a this.
    testAjax.thiz[uuid] = this;

    // Generar delay variado de hasta 1000ms.
    var delay = Math.random() * 1000;

    // Ejecutar la función AJAX después del delay
    setTimeout('testAjax.ajax(' + uuid + ')', delay);
  };

});

El código anterior permite que todas las llamadas AJAX utilizando jQuery sean retardadas aleatoriamente. Esto es sumamente útil a la hora de desarrollar una aplicación web donde no tenemos ninguna implementación server side y deseamos simular el comportamiento de la aplicación cuando se ejecute una llamada asincrónica.

En el futuro no muy lejano

  • Agregar documentación
  • Implementar plugin de jQuery

Publicado el Nov 26, 2009

Zen Coding para escribir HTML/CSS a la velocidad de la luz

html-light-speed

Zen Coding es un conjunto de plugins para programar en HTML o CSS a la velocidad de la luz (casi literalmente). Estas magníficas herramientas te permiten escribir un selector de CSS y expandirlo en su representación del DOM y mucho más.

Un ejemplo básico

Si queremos crear la estructura más básica de un documento XHTML transicional. Solo tenemos que poner lo siguiente.

html:xt

Y al presionar un shortcut o un click tendremos esto:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
</head>
<body>

</body>
</html>

Y eso es solo el comienzo de la magia de Zen Coding.

Un segundo ejemplo

Si queremos crear un elemento cualquiera, digamos un DIV con un ID header, entonces escribimos lo que sería un selector CSS:

div#header

Y esto se convertiría en:

<div id="header"></div>

Sencillo y útil ¿verdad?

Un ejemplo complejo

Supongamos que queremos crear un documento HTML con varios DIVs, un menu de UL con varios LI con IDs diferente. Esto también podemos hacerlos en una sola línea:

html:xt>div#header+div#content>ul#menu>li.opcion-$*10

Esto sería igual a:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
  <head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
  </head>
  <body>
    <div id="header"></div>
    <div id="content">
      <ul id="menu">
        <li id="item-1"></li>
        <li id="item-2"></li>
        <li id="item-3"></li>
        <li id="item-4"></li>
        <li id="item-5"></li>
        <li id="item-6"></li>
        <li id="item-7"></li>
        <li id="item-8"></li>
        <li id="item-9"></li>
        <li id="item-10"></li>
      </ul>
    </div>
  </body>
</html>

De seguro esto nos ahorrará bastante la creación de documentos HTML, les dejo el enlace para que puedan descargarlo y prueben las demás extensiones fabulosas.

Nota, esta extensión está disponible para Aptana, TextMate, NetBeans entre otros IDEs. Espero que lo disfruten y me den su opinión.

Publicado el Nov 22, 2009

Instalando CakePHP

Instalando CakePHP

Este artículo es para quien por una razón u otra no ha podido instalar CakePHP o para recomendar a otras personas que necesitan una guía para iniciarse en esta excelente plataforma de desarrollo. Cabe destacar que los pasos descritos son aplicables para usuario de Linux (en mi caso Ubuntu).

Prerequisitos

Asegúrate que tengas…

  • … una conexión a Internet (para descargar CakePHP).
  • … y una instalación fresca de XAMPP (LAMPP).

Seguir Leyendo

Publicado el Oct 1, 2009

Preguntas frecuentes sobre jQuery y los INPUTs

jQuery y los INPUTs

Me encontré con varias preguntas concernientes a jQuery y los elementos INPUTs. Entonces decidí escribir este artículo para aquellos que les sirva el zapato.

¿Cómo seleccionar elementos INPUTs por tipo?

La primera frase de la pregunta nos dice la mitad de como deberíamos de escribir el selector. Primero, sabemos que nuestra elementos a seleccionar son INPUTs, por lo cual deberíamos de comenzar a escribir algo así:

var elementos = $('input');

Sin embargo, si queremos filtrar nuestros INPUTs por algún tipo tan solo debemos de agregar el siguiente filtro y ¡listo!

var submits = $('input[type="submit"]');
var checkboxes = $('input[type="checkbox"]');
var texts = $('input[type="text"]'); 

Y así sucesivamente para cada tipo, solo necesitas cambiar el valor de type para cada selector.

¿Cómo saber el tipo de un elemento INPUT?

La respuesta a esta pregunta es muy sencilla por lo cual no se necesita dar muchas explicaciones. Como el tipo de un elemento INPUT se almacena en el atributo TYPE tan solo necesitamos escribir los siguiente:

var tipo = $('#elemento14').attr('type');

Este código seleccionará el elemento con ID elemento14 y devolverá su tipo.

¿Cómo obtengo el valor de un elemento INPUT?

Esta pregunta suele surgir cuando uno aprende a sacar el texto de un elemento con .text() o el html con .html(). Sin embargo, para los INPUTs es diferente, debemos de utilizar el método .val(). Por ejemplo, si queremos sacar el username puesto en un INPUT text podemos hacerlo así:

var username = $('#username').val();

Este código seleccionará el elemento con ID ‘username’ y devolver su valor.

¿Cómo seleccionar ‘todos’ los INPUTs, incluido los SELECTs, BUTTONs, TEXTAREAs…?

Esto es bien sencillo, tan solo necesitas utilizar un filtro  prediseñado para esto.

var username = $(':input');

Al ejecutar este selector obtendrás todo los tipos de INPUTs diferentes, y todos los SELECTs, BUTTONs y TEXTAREAs.

¿Has tenido otras dudas o preguntas sobre INPUTs y formularios? ¡Utiliza los comentarios para expresarte!

Publicado el Sep 23, 2009

Sigue el Phishing con nuestros Bancos

Phishing al Banco Popular Dominicano

Ya hace tres meses que publiqué un artículo que detallaba un ataque de phishing utilizando como anzuelo al Banco Popular Dominicano. Aunque éste no fue el primer de los ataques, el BPD tomó serias medidas de seguridad implementado el uso de una tarjeta de códigos para cada uno de sus clientes, de esta manera aumentarían significativamente la seguridad y la confianza en su empresa.

Pues esta mañana recibí un nuevo correo phishing animándome a “sincronizar mi tarjeta de claves digitales”. Por supuesto, el correo parece sin lugar a dudas del BPD, pero al mirar detenidamenete nos damos cuentas que no proviene de dicho banco, sino, de un mal intencionado y aprovechado de la tecnología para cometer un crimen cibernético.

Puedes ver la imagen del correo electrónico que supuestamente recibí del BPD. Note que al ver los detalles del encabezado del correo se nos aclara diciendo que viene desde HI5, obviamente, quien quieres robar nuestros credenciales, nuestras tarjetas de códigos y por consiguiente nuestro dinero no es HI5, ya que esto es una técnica común y muy fácil de hacerse pasar por otra persona o dirección electrónica.

    Publicado el Sep 20, 2009

    Leyendo XML desde CakePHP

    Si te ves en la necesidad de leer un archivo XML desde CakePHP lo puedes lograr fácilmente a través de una clase provista. Si estás desde un Controlador o Helper puedes utilizar el siguiente código para leer un archivo XML.

    <?php
    class SampleHelper extends AppHelper {
      function readXML() {
        // Cargamos la clase XML de CakePHP.
        App::import('Xml');
        // Leemos nuestro archivo XML.
        $xml_content =& new XML('sample.xml');
        // Para facilidad de uso convertimos nuestro archivo XML en un
        // arreglo legible.
        $xml_array = $xml_content->toArray(false);
      }
    }
    ?>

    Listo, en la variable $xml_content tendrás la representación pura de un archivo XML y en la variable $xml_array tendrás un arreglo legible de tu archivo XML.

    Si estuviéramos utilizando el siguiente archivo XML:

    <?xml version="1.1" encoding="UTF-8" ?>
    <menu>
      <item name="Home" url="pages/home" />
      <item name="Courses" url="pages/courses" />
      <item name="Portfolio" url="pages/portfolio" />
      <item name="Contact" url="pages/contact" />
    </menu> 

    Obtendríamos el siguiente contenido para la variable $xml_array:

    Array
    (
      [menu] => Array
        (
          [item] => Array
            (
              [0] => Array
                (
                  [name] => Home
                  [url] => pages/home
                )
              [1] => Array
                (
                  [name] => Courses
                  [url] => pages/courses
                )
              [2] => Array
                (
                  [name] => Portfolio
                  [url] => pages/portfolio
                )
              [3] => Array
                (
                  [name] => Contact
                  [url] => pages/contact
                )
             )
          )
    )

    La representación pura del XML no se la mostraré porque es muy verbosa.

    ¿Cómo localizar tus archivos XML?

    Esa fue mi primera pregunta cuando seguí el ejemplo de la documentación oficial de CakePHP. Los archivos XML se leen a partir del directorio /cake/libs/ esto significa que se debe subir dos niveles de manera relativa para hacer referencias a nuestros archivos. Les presento unos ejemplos.

    Ubicación de tu archivo:Ruta a utilizar:
    /app/views/helpers/menu.xml../../app/views/helpers/menu.xml
    /app/models/datasources/db.xml../../app/models/datasources/db.xml

    Esto se debe porque la clase XML de CakePHP está localizada en /cake/libs/ entonces, esta buscará relativamente cualquier archivo.

    ¿Preguntas? Dejalas en los comentarios.

    Latest Tweets