lunes, 28 de diciembre de 2009

La próxima versión del iPhone funcionará con Windows Mobile

Así es, de acuerdo a lo informado por Apple las futuras versiones del iPhone funcionarán con Windows Mobile porque "es más estable y hay mayor disponibilidad de software de terceros en el mercado".
Esto es una buena noticia para Microsoft ya que permitiría aumentar su participación en el competitivo mercado de aparatos móviles.

Veamos en que terminará esto :).

Fuente de la noticia.

Actualización: Esto era un simple broma por el día de los inocentes :).

jueves, 24 de diciembre de 2009

Lo leído durante el 2009

Se acaba el año y llegan los resumenes. Ya hice un resumen de lo más escuchado durante este año, ahora es turno de lo leído.

Acostumbraba a escribir un post por cada libro, en donde explicaba a grandes rasgos su temática y el nivel de agrado que me producía la lectura, pero el ritmo de lectura versus el de escribir reseñas terminó siendo inversamente proporcional con saldo positivo para el primero, por lo que opté finalmente por dedicarme a leer solamente.

Me encanta leer, no puedo dejar de hacerlo :).

Mi humilde biblioteca está compuesta mayormente por estudios historiográficos, mitológicos, filosofía, filología, antropología, entre otras ciencias sociales, humanidades y autores clásicos. Novelas contemporáneas creo que las puedo contar con una mano. Best-sellers brillan por su ausencia.

La última reseña que hice fue de la maratónica lectura de la historia universal de Carl Grimberg, muy entretenida por cierto, y que me dejó el bichito de leer autores antiguos y del medioevo, con alguno que otro estudio relacionado.

Sólo listaré lo leído dejando, si es que existe, algún link a Wikipedia o al Proyecto Gutemberg o a lo que primero encuentre :). No haré el resumen porque me tomaría muuuucho tiempo hacerlo.

Partamos:

    martes, 15 de diciembre de 2009

    Microsoft China copia descaradamente a Plurk

    De acuerdo a lo informado por el blog de Plurk, Microsoft China "se tomó la molestia" de copiar el sitio de microblogging Plurk. En las capturas de pantalla mostradas en el blog, se puede apreciar que la copia es tan descarada que usan el mismo concepto de Plurk e incluso hasta el mismo código.



    Siempre se ha dicho que todo plagio es una forma de halago pero esto es sencillamente descarado. Al parecer Microsoft se está quedando sin ideas. Sin ir más lejos, Bing en su interfaz de usuario, es una copia calcada de Google.

    Via Plurk Labs.

    lunes, 14 de diciembre de 2009

    Resultados de Encuesta Presidencial 2009 (Primera Vuelta)

    Ayer se llevaron a cabo las elecciones presidenciales y parlamentarias. En las primeras no hubo mayoría absoluta por lo que pasaron a segunda vuelta Sebastián Piñera y Eduardo Frei.

    Hace un tiempo publiqué una encuesta Lenara que incluía a los 4 candidatos, ahora es tiempo de publicar los resultados comparándolos con los oficiales.



    Se puede apreciar claramente que mi encuesta no anduvo ni cerca de los resultados oficiales :D. Para seguir con este juego, acabo de publicar una nueva encuesta considerando a los 2 candidatos agregando las opciones de voto nulo y blanco:


    Veamos si ahora esta encuesta se acerca más a la realidad.

    jueves, 10 de diciembre de 2009

    Lo más escuchado durante el año 2009

    Al igual que el año pasado, presento un resumen de lo que más escuché este año basándome en el registro de mi perfil en Last.fm. Escucho mucha música y el universo se carga brutalmente hacia el rock, dejando espacio de vez en cuando para nuevos sonidos.



    Esta vez sólo mencionaré a los 10 primeros.

    Partamos:
    • Dream Theater: Este año coparon mi agenda musical, se ganaron espacio en el PC de la oficina, mi laptop y mi celular. Sencillamente (un adjetivo no muy apropiado para su complejidad musical) son buenísimos, buena ejecución instrumental y vocal, buenas letras(aunque algunas no tengan pies ni cabeza). Este año lanzaron el disco Black Clouds & Silver Linings, que la verdad me dejó con gusto a poco, una de las pocas cosas buenas de este disco es el cover de Iron Maiden To tame a land. De esta banda 4 discos me son indispensables: A change of seasons, Six degrees of inner turbulence, Octavarium y Systematic Chaos.
    • Iron Maiden: A estos dinosaurios me es imposible dejarlos de escuchar. Al igual que el año pasado, nuevamente me perdí el concierto que dieron en marzo de este año :(. Espero ir cuando vuelvan por estas tierras. Respecto del año anterior subió 3 puestos.
    • Slayer: El año pasado no marcaron presencia dentro de la lista, pero este año se han ganado el tercer lugar. Es considerada una de las bandas más pesadas de la historia del metal y hay razones bastantes claras para que lo sean. Me gusta escucharlos cuando requiero "una sacudida" al cerebro :D. Reign in Blood es uno de los discos que más me gustan sin dejar de lado todos los demas. Este año lanzaron World Painted Blood el cual aún no escucho pero ganas no me faltan.
    • Nirvana: Otro infaltable en la lista, bajó un puesto respecto del año pasado.
    • Porcupine Tree: Por Dream Theater vine a caer donde estos tipos, o mejor dicho, "este tipo" ya que es el proyecto de un inquieto pero genial músico llamado Steve Wilson. Su música es una cornucopia de sonidos pero que tienen como base un rock cargado a la onda progresiva. Tiene muy buenos discos, dentro los cuales destaco Deadwing y Fear of a Blank Planet. Este año lanzaron The Incident pero al igual que con Slayer no he tenido la oportunidad de escuchar.
    • Pearl Jam: El año pasado se llevaron el primer lugar pero este año bajaron al séptimo lugar. También tuvieron nuevo disco este año, Backspacer, pero la verdad es que me decepcionó. El disco homónimo dejó la vara muy alta y esperaba algo más potente, algo que me golpeara en la cara. Le faltó un no-sé-qué que hizo sentirme insatisfecho. Lamentable.
    • Metallica: Bajaron del cuarto al octavo. Para el 2010 se espera concierto en Chile pero ya descarté de plano ir por el excesivo, abusivo y desmesurado valor de la entrada. El show no dá para pagar más de $30.000. Eso es para fanáticos descerebrados, no para gente normal.
    • Incubus: Del sexto bajaron al décimo lugar. ¿Desaparecerán del listado como lo hicieron de la escena musical?

    jueves, 3 de diciembre de 2009

    Google ahora ofrece servicios DNS

    Google en su imparable expansión está ofreciendo servicios de resolución de DNS, que en palabras sencillas, es el servicio que permite traducir direcciones de internet (www.algo.cl) a direcciones IP (1.2.3.4) haciendo la navegación por la red un poco más humana.

    Las ventajas que ofrece Google con esto es que gracias a su enorme infraestructura de red, permitirá resolver rápidamente las direcciones internet solicitadas. Esto es la parte linda del asunto y que llevará a millones a modificar sus configuraciones de red, pero tras ello se puede intuir que en el largo o corto plazo Google ofrecerá servicios de administración de zonas de dominio , probablemente con Google Apps (gratuita para la versión básica), lo que será un duro golpe para las empresas de servicios de hosting que incluyen dentro de su paquete de servicios la administración de zonas DNS.

    Las instrucciones de como usar este servicio aquí

    miércoles, 25 de noviembre de 2009

    Resultados de Encuesta Presidencial 2009

    A 18 días de la próxima elección de presidente en Chile, los resultados de mi humilde encuesta son:
    1. Sebastián Piñera: 39%
    2. Marco Enríquez-Ominami: 37%
    3. Jorge Arrate: 14%
    4. Eduardo Frei: 10%

    Los resultados difieren con los publicados por Lenara pero es simplemente por la forma en que reduje decimales:


    Pueden seguir votando :).

    jueves, 22 de octubre de 2009

    Adobe Influxis Latin Flash Tour 2009


    MMUG Chile acaba de anunciar la llegada del Adobe Influxis Latin Flash Tour 2009 a realizarse el 07 de noviembre en el Centro El Ágora. Este evento será dictado por el evangelista de Adobe Lee Brimelow quien nos contará todo lo nuevo sobre las tecnologías Flex, Flash, ActionScript y AIR.

    Tengo buenas referencias técnicas de esta persona, ya que lo sigo hace ya bastante tiempo a través del sitio excelente sitio de tutoriales gotoAndLearn.

    El tipo es bueno en lo suyo, hay 200 cupos y la entrada no está cara ($2.500 en forma anticipada), por lo que se convierte en una buena oportunidad de participar en un evento tecnológico y enterarnos de las novedades que se vienen en el mundo Flash.

    MMUG Chile está a cargo de la gestión de este evento, las inscripciones las pueden realizar acá.

    martes, 20 de octubre de 2009

    Encuesta para elecciones presidenciales 2009

    Ya que andan tan de moda las encuestas para las elecciones de diciembre de 2009 me aproveché de Lenara :).

    Anquilosados

    Así están, como reza el título, los miembros de la concertación. Como que el cuentito ese del desgaste después de 20 años no sólo sale de la boca de Sebastián Piñera, sino que es gritado fuertemente desde la propia concertación.

    Una seguidilla de errores, partiendo por la estúpida no consideración de Enríquez-Ominami y por la, aún más estúpida, forma de como se gestaron las primarias, está llevando a que Frei sea, lejos, el mejor jefe de campaña que Piñera que ha tenido.

    "Esta campaña será el puente para las nuevas generaciones" se repite hasta al cansancio, pero a la luz de los hechos, puedo decir que esta campaña es la confirmación de las viejas (y constantes) degeneraciones.

    jueves, 24 de septiembre de 2009

    PHP, tercer lugar en lenguajes de programación.

    TIOBE publicó su ranking de popularidad de lenguajes de programación en donde PHP aumenta cada vez más su popularidad, quedando en tercer lugar sólo después de Java (primer lugar) y C (segundo lugar). Este año avanzó dos posiciones respecto del año anterior. La gran sorpresa es que sobrepasó a C++, uno de los lenguajes más populares y de más uso en el mundo

    La forma de establecer este ranking es considerando la cantidad de programadores disponibles en el mundo que manejen los respectivos lenguajes, cursos de capacitación y resultados de búsqueda en los principales motores.

    Parte de este crecimiento es también gracias a al enorme uso de CMS como WordPress o Joomla. También es atribuible al uso masivo de entornos LAMP (Linux, Apache, MySQL y PHP).

    Los resultados del ranking.

    miércoles, 23 de septiembre de 2009

    Disappear

    Uno de los discos que más me gusta de Dream Theater es Six Degrees Of Inner Turbulence, de este una de las canciones que me encanta es Disappear:


    Why, tell me the reasons why
    Try, still I don't understand
    Will I ever feel this again
    Blue sky, I'll meet you in the end
    Free them, free the memories of you
    Free me, and rest 'til I'm with you


    A day like today
    My whole world has been changed
    Nothing you say
    Will help ease my pain


    Turn, I'll turn this slowly round
    Burn, burn to feel alive again
    She, she'd want me to move on
    See me, this place I still belong
    Give chase, to find more than I have found
    And face, this time now on my own


    Days disappear
    And my world keeps changing
    I feel you here
    And it keeps me sane


    So I'm moving on
    I'll never forget
    As you lay there and watched me
    Accepting the end
    I knew you were scared
    You were strong, I was trying
    I gave you my hand
    I said it's okay letting go time to leave here
    And I'll carry on
    The best that I can without you here beside me
    Let him come take you home

    lunes, 21 de septiembre de 2009

    Clase para subir archivos (PHP)

    En nuestros desarrollos para la web no sólo debemos ingresar datos a través de campos de textos sino que además, debemos subir archivos ya sea de imagen, texto, etc. Hace tiempo atrás me salió un proyectito en que esto era una constante por lo que opté por escribir una clase.

    Advertencia antes de usar: Escribo partiendo de la base que conocen la variable global $_FILES.

    Esta clase tiene los siguientes atributos:

    • archivo : El archivo en sí mismo. Este atributo corresponde a la variable $_FILES['archivo']['name'].
    • directorio: Cadena que contiene la ruta al directorio de destino.
    • tipoArchivo: Nos indica a que tipo de archivo corresponde. Esto se obtiene a través del método $this->getTipoArchivo() aplicado al atributo archivo.
    • tipoPermitido: Array con las extensiones de los tipos de archivos permitidos.
    • tamanoArchivo: Tamaño del archivo a subir, se obtiene desde la variable $_FILES['archivo']['size']
    • tmp: Directorio temporal en donde está cargado el archivo en espera a su manipulación. Se obtiene desde la variable $_FILES['archivo']['tmp_name'].
    • nombre: Junto con tipoArchivo forma el nombre que tendrá finalmente el archivo en el directorio de destino. 
    • tamanoMaximo: Entero que indica el tamaño máximo que tendrá el archivo. Esto se anota en Megas.
    Sus métodos son:

    • __construct: Constructor de la clase. Los parámetros que recibe son:
      • archivo: Corresponde a la variable $_FILES['archivo']['name'].
      • dir: Cadena con la ruta al directorio de destino. Ej "var/www/sitio/".
      • extPermitida: Array con los tipos de archivos permitidos. Ej. array("doc","xls").
      • tamano: Corresponde a la variable $_FILES['archivo']['size'].
      • tmp: Corresponde a la variable $_FILES['archivo']['tmp_name'].
      • nombre: Cadena con el nombre que tendrá finalmente el archivo. Sino se indica toma lo indicado en la variable archivo.
      • tamPermitido: Entero que indica el tamaño máximo del archivo a subir, sino se indica entonces considera lo indicado en la variable de entorno upload_max_filesize.
    • getTipoArchivo: Obtiene la extensión que permite identificar el tipo de archivo que estamos manipulando. Tiene como parámetro de entrada el nombre del archivo (está basado en algo que publiqué hace un tiempo) Se usa en el constructor.
    • checkType: Revisa que el archivo a subir corresponda con los tipos permitidos.
    • checkSize: revisa que el archivo a subir tenga un tamaño MENOR al máximo permitido.
    • upLoadFile: Llama a los 2 métodos anteriores, más una comprobación de duplicación de archivos. Si cumple entonces sube el archivo por medio de la función nativa de PHP move_uploaded_file().
    • delFile: Borra el útlimo archivo subido.
    Por último cuando trabajen con carga de archivos deben SIEMPRE considerar lo siguiente:
    • Cuidado con el tipo de archivos permitidos en la carga, podemos dejar abierta la puerta para que ingresen archivos maliciosos ocasionando más de un dolor de cabeza a uds. o a quienes tengan acceso.
    • La carpeta de destino debe tener permisos de escritura pero no de ejecución.
    • El tamaño máximo debe mantener el equilibrio entre las necesidades del desarrollo, lo permitidos por las directivas de PHP y el ancho de banda del cliente que sube un archivo.
    Accesos:

    sábado, 12 de septiembre de 2009

    Facebook Lite, volviendo al principio.

    Facebook lanzó una versión liviana para aquellos usuarios que sólo desean comunicarse con amigos y familia. Es una vuelta a los inicios del popular red social.

    Hace ya casi un año cerré la cuenta debido al bombardeo de publicidad, aplicaciones, encuestas y cadenas odiosas. Todo eso hacía, en mi opinión, bastante desagradable su uso.

    Veamos cuánto duro con esta versión.

    Dr. House, promo de la 6ta. temporada

    He aquí un video promocional de la 6ta. temporada que se estrenará el próximo 21 de septiembre:

    viernes, 28 de agosto de 2009

    Dropbox, almacenamiento de información online/offline


    Hoy en plurk Lester mencionó que abrió cuenta en Dropbox y que se puede aumentar a 3Gb si invitas a más personas a usar este excelente servicio. Tengo una cuenta hace harto tiempo, pero no conocía dicha promoción así es que me puse a revisar y lo encontré.

    Dropbox es un servicio de almacenamiento de datos accesible desde internet pero con la ventaja de dejar una copia en uno o más computadores, es compatible con Windows, OS X y Linux. La desventaja es que depende del ancho de banda para tener un funcionamiento decente y amigo de nuestra paciencia. Los planes disponibles son de 2 GB libre de pago y sobre eso (de 50 y 100 GB) debes contratar un plan.

    Si les interesa pueden obtener el instalador y una cuenta liberada en este enlace, así me ayudaran a aumentar mi capacidad :).

    Aquí pueden ver un screencast de demostración de Dropbox.

    Obtener Dropbox.

    viernes, 21 de agosto de 2009

    Agustín

    El 13 de agosto, al medio día, justo al cañonazo de las 12 nació mi segundo hijo, su nombre es Agustín.

    Todo salió perfecto. Liz nuevamente se lució en la sala de parto con su enorme fortaleza. Obviamente, al igual que con el nacimiento de Diego -mi primer hijo- me sentí el ser más inútil de la tierra. Puede sonar machista -me da lo mismo como lo tomen- pero la naturaleza dispuso que los partos son pega de mujeres y lo único que le queda a uno como hombre es dar ánimo.

    Ya tenemos una semana con Agustín en casa y todo anda super bien. Diego de a poco va asimilando su nueva realidad: aprender a compartir el cariño que recibía hasta hace poco de forma exclusiva.

    Hace 4 años también me manifesté por el nacimiento de Diego a través de este medio.

    jueves, 30 de julio de 2009

    PHP 5.3, ¿Qué hay de nuevo viejo?


    Hace unos días instalé la útlima versión de PHP lanzada el 30 de junio de 2009. Hay muchos cambios, elementos nuevos y obsoletos, varios de ellos esperados para la versión 6.0 pero que, desconozco la razón, los adelantaron.

    No hablaré de todos los cambios, obsolencias y nuevas funcionalidades, sino que relataré cuales fueron los cambios que exigieron de mi atención al momento de la instalación. Si quieren más detalles pueden revisar la serie de artículos en IBM developerWorks respecto de PHP 5.3.

    Lo primero con lo que me encontré fue con nuevos niveles de error. A los ya existentes se suman E_DEPRECATED y E_USER_DEPRECATED los cuales nos advierten sobre funciones o sintaxis obsoleta. Actualmente trabajo con un framework que yo mismo desarrollé y con CakePHP. Con el primero no tuve problemas respecto a obsolencias pero con el segundo si los tuve ya que en diversas partes asigna por refencia instancias de clases (ver función new). La forma de "resolverlo" (esto hasta que la gente de CakePHP libere una actualización) es realizar un pequeño cambio en la función write, de la clase configure.php ubicada en cake/libs/. Basta con cambiar la línea en donde aparece "error_reporting(E_ALL)" por "error_reporting(E_ALL & ~E_DEPRECATED)". La función debería quedar así:

    function write($config, $value = null) {
    $_this =& Configure::getInstance();
    if (!is_array($config)) {
    $config = array($config => $value);
    }
    foreach ($config as $names => $value) {
    $name = $_this->__configVarNames($names);
    switch (count($name)) {
    case 3:
    $_this->{$name[0]}[$name[1]][$name[2]] = $value;
    break;
    case 2:
    $_this->{$name[0]}[$name[1]] = $value;
    break;
    case 1:
    $_this->{$name[0]} = $value;
    break;
    }
    }
    if (isset($config['debug'])) {
    if ($_this->debug) {
    error_reporting(E_ALL & ~E_DEPRECATED);

    if (function_exists('ini_set')) {
    ini_set('display_errors', 1);
    }

    if (!class_exists('Debugger')) {
    require LIBS . 'debugger.php';
    }
    if (!class_exists('CakeLog')) {
    require LIBS . 'cake_log.php';
    }
    Configure::write('log', LOG_NOTICE);
    } else {
    error_reporting(0);
    Configure::write('log', LOG_NOTICE);
    }
    }
    }
    CakePHP trae un manejador de niveles de error propio, por lo tanto, aunque indiquemos en php.ini el nuevo nivel de error, CakePHP seguirá indicando el mensaje de codigo "Deprecated". Si no trabajan con CakePHP y quieren manejar esto para todas sus aplicaciones y sitios ,el cambio que deben aplicar en el archivo php.ini es agregar & ~E_DEPRECATED a la directiva error_reporting.

    Otra novedad es el cambio de la librería de comunicación con MySQL. Hasta la versión 5.2.9 se utilizaba únicamente la librería libmysql la cual estaba desarrollada para C y C++. Ahora se utiliza mysqlnd la cual está desarrollada específicamente para PHP la cual, según dicen y que no he probado empíricamente, mejora el rendimiento en diversos aspectos.

    Con libmysql la configuración de instalación PHP típica (hablo de unix/linux) era:

    ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql

    Pero ahora cambia por:

    ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql=mysqlnd --with-mysql-sock=/var/run/mysqld/mysqld.sock


    Por último, PHP 5.3 ya no utiliza la función ereg() para trabajar con expresiones regulares, ahora debemos utilizar preg_match() la cual no varía drásticamente en los parámetros de ingreso, permitiendo su reemplazo, en algunos casos, con un rápido buscar/reemplazar.

    Este último cambio afecta a la libería para web services NuSoap la cual, lamentablemente, aún no tiene actualización para aumentar la compatibilidad pero si hay un foro abierto al respecto.

    En la medida que aparezcan más cosas las iré comentando. Pueden consultar las siguientes fuentes con más información al respecto:

    viernes, 24 de julio de 2009

    Validador de Rut en Spry (corregido)


    En un post anterior publiqué un validador de Rut para el framework javascript Spry. Dicho validador tenía un problema con Internet Explorer 7 (no me pregunten por IE6 porque no me interesa desarrollar para esa versión), el cual fue descubierto por Lester. El problema estaba en que IE no permite manipular strings de la misma forma como lo hace Gecko. En el código publicado, tenía un ciclo de esta forma:
    for(i=(elRut.length-1); i>=0; i--){
    factor = factor > 7 ? 2 : factor;
    suma += parseInt(elRut.[i])*parseInt(factor++);
    }

    La forma de acceder a cada elemento del primer string del rut era por medio de string[i] pero a IE no le gusta eso, así es que lo cambié por la función charAt() que permite acceder a X parte de un string indicado por la posición del caracter.

    El ciclo quedó así:
    for(i=(elRut.length-1); i>=0; i--){
    factor = factor > 7 ? 2 : factor;
    suma += parseInt(elRut.charAt(i))*parseInt(factor++);
    }

    Adicionalmente cambié el manejo de expresiones regulares al canón de Spry. En resumen el validador quedó así:

    'rut':{
     regExpFilter: /^([0-9])+\-([kK0-9])+$/,
     validation: function(value){
     if(value == ''){
      return false;
     }
     var regExp = /^([0-9])+\-([kK0-9])+$/;
     if (!regExp.test(value)) {
      return false;
     }
     var RUT  = value.split("-");
     var elRut = RUT[0]
     var factor = 2;
     var suma = 0;
     var dv;
     for(i=(elRut.length-1); i>=0; i--){
      factor = factor > 7 ? 2 : factor;
      suma += parseInt(elRut.charAt(i))*parseInt(factor++);
     }
     var ret = value.toString();
     dv = 11 -(suma % 11);         
     if(dv == 11){
      dv = 0;
     }else if (dv == 10){
      dv = "k";
     }
     if(dv != RUT[1].toLowerCase()){
      ret= false;
     }
     return ret;
     }
     }

    Pueden descargar la versión corregida acá. También está corregida la demo.

    ¡Gracias Lester por el aviso!

    martes, 30 de junio de 2009

    No quiero arreglar tu computador.

    Siempre he querido tener esta polera, más que por monería nerd, es por necesidad.


    El domigo recién pasado fuí a buscar a mi mujer y mi hijo a una fiesta de cumpleaños de un amiguitó de este último. Los padres amablemente me invitaron a quedarme un momento a tomar algo, me sirvieron ron-cola y conversamos un buen rato, había otra pareja amiga de los anfitriones. Todo iba bastante bien hasta que salió la pregunta de rigor: ¿En qué trabajas?.

    El diálogo fue más o menos así:
    -Fulana: ¿en qué trabajas?
    -Yo: soy desarrollador de software
    -Fulana: ahh, entonces tienes que ser seco con los computadores

    -Yo: (silencio)

    -Fulana: es que hace unos días mi computador está con problemas. ¿tú sabes por qué (...)?
    -Yo: (más silencio)
    Necesito la polera urgentemente (y en español para que quede absolutamente claro).

    La imagen es de la genial tienda ThinkGeek.

    sábado, 27 de junio de 2009

    Validador de Rut en Spry

    A propósito de una consulta en el mmug, recordé que tenía en el tintero una "extensión" del validador para campos de textos de Spry. Dicha extensión agrega un nuevo validador a los ya existentes.

    La modificación la deben aplicar en el objeto, del archivo SpryValidationTextField.js,
    Spry.Widget.ValidationTextField.ValidationDescriptors.

    El código agregado es:
        'rut':{
       //expresión regular que valida el formato
       regExpFilter: /^([0-9])+\-([kK0-9])+$/,
       validation: function(value){
           if(value == ''){
               return false;
           }
           var rexp = new RegExp(/^([0-9])+\-([kK0-9])+$/);
           if(!value.match(rexp)){
               return false;
           }
           var RUT  = value.split("-");
           var elRut = RUT[0];
           var factor = 2;
           var suma = 0;
           var dv;
           for(i=(elRut.length-1); i>=0; i--){
               factor = factor > 7 ? 2 : factor;
               suma += parseInt(elRut[i])*parseInt(factor++);
           }
           var ret = value;
           dv = 11 -(suma % 11);
           if(dv == 11){
               dv = 0;
           }else if (dv == 10){
               dv = "k";
           }
           if(dv != RUT[1].toLowerCase()){
               ret= false;
           }
           return ret
       }
    }
    Lo que hice fue reutilizar la función javascript para validar rut que publiqué hace unos días. Para utlizarla basta con instanciar todos los elementos propios de los objetos de validación Spry, pero en el tipo de validación indicar el tipo "rut":
    var rut = new Spry.Widget.ValidationTextField("idDelContenedor","rut",{validateOn:["blur","change"]});
    

    Por supuesto, pueden probarlo acá y descargar el archivo SpryValidationTextField.js modificado acá.

    Actualización: Lester me indicó que no funcionaba en Internet Explorer, aquí está la versión corregida.

    viernes, 19 de junio de 2009

    Validador de Rut (Javascript)

    En un post anterior publiqué un validador de RUT hecho con PHP y ahora es el turno de Javascript.

    Es similar al anterior con PHP:
    function validaRut(rut){
     var rexp = new RegExp(/^([0-9])+\-([kK0-9])+$/);
     if(rut.match(rexp)){
         var RUT = rut.split("-");
         var elRut = RUT[0].toArray();
         var factor = 2;
         var suma = 0;
         var dv;
         for(i=(elRut.length-1); i>=0; i--){
             factor = factor > 7 ? 2 : factor;
             suma += parseInt(elRut[i])*parseInt(factor++);
         }
         dv = 11 -(suma % 11);
         if(dv == 11){
             dv = 0;
         }else if (dv == 10){
             dv = "k";
         }
    
         if(dv == RUT[1].toLowerCase()){
             alert("El rut es válido!!");
             return true;
         }else{         
             alert("El rut es incorrecto");
             return false;
         }
     }else{     
         alert("Formato incorrecto");
         return false;
     }
    }

    Pueden ver un demo aquí

    Para más información sobre el RUT y el algoritmo de creación y validación pueden consultar la wikipedia: http://es.wikipedia.org/wiki/RUT.

    lunes, 8 de junio de 2009

    Erotomanía

    Este año le he dado duro a Dream Theather, es buena música para trabajar :).

    Uno de los buenos discos es Awake del cual rescato "Erotomania". La erotomanía es la ilusión que tiene una persona de que alguien "mejor" que ella está enamorado de si. Es, según mi opinión, una fantasía erótica más que recurrente.

    Dream Theather lo define de una mejor forma con música :D.

    viernes, 29 de mayo de 2009

    Validador de Rut (PHP)

    Llevo harto tiempo en esto del desarrollo de software, he hecho cosas bastantes simpáticas y complejas pero nunca necesité un validador de RUT.

    Me puse manos a la obra y la musa dictó:

    = 0; $i--):
    $factor = $factor > 7 ? 2 : $factor;
    $suma += $elRut{$i}*$factor++;
    endfor;
    $resto = $suma % 11;
    $dv = 11 - $resto;
    if($dv == 11){
    $dv=0;
    }else if($dv == 10){
    $dv="k";
    }else{
    $dv=$dv;
    }
    if($dv == trim(strtolower($RUT[1]))){
    return true;
    }else{
    return false;
    }
    }
    ?>
    


    Lo pueden probar acá

    domingo, 12 de abril de 2009

    Iron Maiden en Chile 2

    Nuevamente diversas circunstancias no permitieron que asistiera al show que Iron Maiden presentó en Chile este 22 de marzo.

    Buscando información al respecto me encontré con este video en youtube:




    Cómo ha cambiado Chile

    miércoles, 18 de marzo de 2009

    Extensiones para Firefox: mis indispensables 2da Parte

    Siguiendo con la saga de Mis extensiones para Firefox, en el capítulo de hoy veremos a otro grupo muy útil para el desarrollo de sitios y aplicaciones web.

    • HTML Validator: Esta extensión nos permite detectar errores en nuestro código HTML. Indica el error, donde ocurre y cómo debería escribirse correctamente. Es muy útil para quienes les interesa escribir HTML según estándares. Tiene 3 formas de procesar una página: HTML Tidy, especial para HTML; SGML Parser para XHTML y Serial que evalua en función de la DTD de la página cual aplicar. Adicionalmente podemos pedir que revise el nivel de accesibilidad de la página de acuerdo a los niveles WAI.
    • Screengrab: Con esta extensión podemos capturar una página o parte de esta y copiarla al portapapeles para pegarla en algún editor de imágenes o guardarla como PNG o JPG para un uso posterior. Esto nos permite de una manera fácil enviar avances de los proyectos que desarrollemos cuando no disponemos de un servidor con acceso público.
    • Dummy Lipsum: Cuando desarrollamos a veces el cliente no nos manda los textos definitivos o estamos recien en etapa de propuesta y necesitamos rellenar con texto de prueba. En estos casos Dummy Lipsum nos provee de texto de relleno ya sea párrafos, líneas, X cantidad de letras, con tags html, etc.

    Aún quedan extensiones, pero será nuevamente hasta la próxima.

    Ver: Extensiones para Firefox: mis indispensables 1ra. Parte.

    miércoles, 11 de marzo de 2009

    Error en PHP

    Hace unos días actualicé PHP en mi laptop, para ello actualicé Appserv. El problema está en que cada vez que reiniciaba Apache o accedía a PHP a desde la línea de comandos me salía el mensaje:
    Error al iniciar la aplicación porque no se encontró php_mbstring.dll. La reinstalación de la aplicación puede solucionar el problema.
    mientras que en el log de Apache aparecía:
    PHP Warning: PHP Startup: Unable to load dynamic library 'C:/AppServ\\php5\\ext\\php_exif.dll' - No se puede encontrar el m\xf3dulo especificado.\r\n in Unknown on line 0 (sic)
    No seguí la instrucción de reinstalar ya que no me generaba mayor problema más allá del molesto mensaje. Investigando encontré este foro en el cual daba diversas soluciones, entre ellas la de cambiar el orden en el llamado de las extensiones php_exif.dll y php_mbstring.dll en el archivo php.ini. En mi caso primero llamaba a php_exif.dll y luego a php_mbstring.cl, cambié el orden, reinicié apache y ¡eureka! se fue el odioso mensaje.

    Antes

    Después

    martes, 10 de marzo de 2009

    Extensiones para Firefox: mis indispensables.

    Una de las cosas que gusta de Firefox es que se puede ampliar su funcionalidad con add-ons, micro aplicaciones que se incorporan al core de Firefox.

    Hay para todos los gustos y necesidades, desde diccionarios y correctores ortográficos pasando por lectores RSS, reproductores de música, juegos y herramientas para el trabajo de desarrollo de aplicaciones y sitios web. No pretendo descubrir la rueda con este post, sino que más bien compartir cuales uso y como me han ayudado.
    • Firebug: junto con mi editor de código (actualmente NetBeans para proyectos grandes y Notepad2 para los pequeños) son las herramientas indispensables para mi trabajo. Con Firebug tengo un debugger para javascript, un editor "en caliente" de CSS y HTML y navegador de DOM. Pero más allá de estas funciones, la que más uso es la consola de peticiones HTTP, especial para desarrollos con Ajax. Con ella puedo ver los parámetros que envío y las respuestas esperadas o los errores en caso de falla.

    • Web Developer: Otra extensión muy útil para el desarrollo de sitios y aplicaciones web. Contiene diversas herramientas para CSS, Javascript, HTML. Con Web Developer podemos visualizar código, desactivar CSS, Javacript, cookies e imágenes; obtener información sobre la estructura HTML de un sitio, sobre los formularios, cambiar el tamaño de una ventana, acceder a una regla para medir secciones de una ventana, entre otras. También incluye acceso a diversos validadores para CSS, HTML, etc.

    • ColorZilla: Esta me permite generar paletas de colores, obteniéndolos de directamente de sitios web que visito. Basta con hacer clic en el cuentagotas que aparece en la esquina inferior izquierda y se activará un cursor que al posicionarse sobre un elemento, ya sea texto, un div con fondo o una imagen y obtendrá el valor rgb y hexadecimal del color. Otra funcionalidad de gran utilidad es un analizador de color, el cual entrega un informe con los colores utilizados en el sitio.

    Quedan más extensiones para mostrar pero eso es para otro post :).

    jueves, 5 de marzo de 2009

    Rescue me - The Gathering

    Si hay una banda que me gusta es The Gathering.

    Los escucho hace por lo menos 10 años y uno de los discos que más me gusta es How to measure a planet?.

    Esta canción me fascina enormemente:




    Rescue Me

    All I want
    is to be where you are
    wisdom
    will nurse you

    Pass your sense
    on to me
    weigh my hands
    and help me

    I gasp
    for air
    what is the wear
    that shows on my face

    Pass your sense
    on to me
    weigh my hands
    rescue me

    I rinse my face
    in water
    my breath runs out
    in the waves

    Lástima que Anneke ya no está en la banda :( aunque ya hay anuncios de nuevo disco para abril próximo y con nueva vocalista.

    martes, 3 de marzo de 2009

    Libros: Historia Universal de Carl Grimberg.

    Clío (Wikipedia)

    Hace unas 2 semanas terminé de leer el último tomo de la colección de Historia Universal del sueco Carl Grimberg, que editorial Ercilla publicó a mediados de los 80 (la edición original de Daimon es de 1967).

    Fue un viaje alucinante, que durante 31 volúmenes me tuvo absorto, con una única pausa para leer Usabilidad, diseño de sitios web de Jakob Nielsen.

    Todo parte desde el -posible- origen de la vida, esto es alrededor de 3.000.000 A.C. y termina con una reseña de la Guerra Fría. La colección completa está compuesta de los siguientes títulos:
    1. El Alba de la Civilización.
    2. De Babilonia a Persia.
    3. Emerge Grecia.
    4. Grecia Inmortal.
    5. Roma, Poderosa y Legendaria.
    6. Roma Imperial.
    7. De la India a los Germanos (Capítulos "El imperio Sasánida" y "La India Antigua" por Sergio Carrasco Álvarez).
    8. Entre Árabes y Escandinavos (Capítulos "Mahoma y El Islam" y "La Expulsión de los Árabes" por Eugenio Chauán Chauán).
    9. Augel del Islam y Las Cruzadas (Capítulos "El Califato Abasí" y "La Cultura Árabe" por Eugenio Chauán Chauán).
    10. La Época Ojival.
    11. El Renacimiento.
    12. La Guerra de los 100 años.
    13. La Conquista de América (Capítulo "Prehistoria de Amperica" por Mario Orellana Rodríguez).
    14. Los Primeros Protestantes.
    15. Oriente hasta el siglos XV (Capítulos "El Budismo" por Raúl Ariztía Benzanilla; "India" por Sergio Carrasco Álvarez; "De los Mongoles a los Otomanos", "Las Instituciones Otomanas", "Civilización Otomana" y "El Islam en India e Indonesia" por Eugenio Chauán Chauán; "El Tibet Antiguo" por Jan Kñakal Cisar y Carlos Paganini Fossa).
    16. Hegemonía Española (Capítulo "Organización de las Indias Occidentales" por Guillermo Bravo Acevedo).
    17. Las Guerras Religiosas
    18. Bajo el Signo de Richelieu.
    19. Luis XIV.
    20. España en Disputa.
    21. El Siglo de las Luces.
    22. Despotismo Ilustrado (Capítulos "La India de los Emperadores Mongoles" por Sergio Carrasco Álvarez; "En la América Española" y "En la América Portuguesa" por Guillermo Bravo Acevedo).
    23. Revolución Francesa.
    24. Napoleón I.
    25. El Romanticismo.
    26. La Época Victoriana.
    27. Imperios Coloniales.
    28. Primera Guerra Mundial.
    29. Crisis entre Guerras.
    30. Segunda Guerra Mundial.
    31. La Guerra Fría.
    Si bien es cierto los títulos apuntan a determinados hechos o períodos, dentro de ellos abarcan mucho más.

    Fue una lectura intensa que desarrollé durante aproximadamente 6 meses (leía en el tiempo que me tomaba trasladarme ida y vuelta al trabajo) y que me llevo a generar 2 listas: la primera con palabras que me llevaron, ya sea por desconocimiento o por simple curiosidad, al diccionario y que publico periódicamente acá. La segunda lista corresponde a libros que se me tornaron apetitosos durante la lectura, uno de ellos es Historias de Tácito y que afortunadamente estaba en la biblioteca de la casa :).

    El único "gran" problema fue la traducción ya que en varios capítulos noté parráfos forzados o que no se daba claramente la idea central o una odiosa traducción de nombres, ¡los nombres propios no se traducen!. Todo los demás estuvo excelente.

    En definitiva fue muy entretenido.

    PD: Con esto doy cumplido mi aporte a la campaña impulsada por Rodrigo llamada "20 Libros".

    miércoles, 25 de febrero de 2009

    Problemas con Google Reader

    Hace 3 días que no podía acceder a leer mis feeds en Google Reader. Cargaba sólo el menú superior y el mensaje "loading..." y en la barra de estado indicaba "Terminado". Probé con Internet Explorer y me indico un error de Javascript que Firebug no detectó pero si Webdeveloper. Lo primero que culpé fue alguna restricción en la red del lugar donde trabajo, pero al intentarlo desde mi casa, ocurría lo mismo.



    Probé con lo usual: limpiar caché , bla bla bla y nada.

    Descubrí que una javascript recibía como parámetro el idioma, así es que lo cambié a español y voila! ahí funcionó.

    Ahora tengo +1000 feeds sin leer :D.

    sábado, 21 de febrero de 2009

    Múltiples perfiles en Firefox

    Un navegador que me gusta mucho es Firefox, lamentablemente el pobre no se destaca precisamente por su velocidad.

    Hace unos días, medio apestado por el problemita de la lentitud con la que responde, deshabilité todas las extensiones que uso y ¡eureka! todo se tornó más liviano, agradable, como que el zorro recuperó la agilidad perdida. El problema es que me quedé sin extensiones para trabajar, en ese momento es que sentí la falta de un switch y recordé algo que me comentó Luisfel para un software que desarrolló: Firefox cuenta con perfiles de usuario así que con eso en cuenta investigué al respecto.

    Firefox usa los perfiles siempre sin que nos demos cuenta de eso. Por cada cuenta de usuario que se genera en nuestro sistema operativo, ya sea Windows, Linux u OS X, Firefox genera un perfil. Lo bueno es que estos perfiles se pueden crear directamente por el usuario con una herramienta llamada creativamente Profile Manager.

    En el sitio de soporte de Mozilla encontré este artículo en donde claramente explican como crear perfiles. Entonces siguiendo las instrucciones es que generé dos perfiles, uno para desarrollo llamado "Desarrollo" y otro liviano para sólo navegar llamado "Navegación" (absténganse los comentarios por mi gran creatividad).

    El pero es que si dejamos habilitada la opción de consultar qué perfil usar, saldrá este mensaje cada vez que abramos Firefox lo que, dependiendo del grado de paciencia, se puede tornar molesto, así seguí investigando más sobre el asunto y ¡nuevamente eureka! aquí encontre información sobre una forma de indicar por medio de parámetros que Firefox cargue automáticamente determinado perfil.

    Ahora la cosa es más agradable, cuando sólo quiero navegar ocupo un perfil liviano, sin extensiones (a lo más la de Delicious) pero cuando ya es para trabajo ocupo el perfil con las extensiones necesarias para es proceso.

    lunes, 12 de enero de 2009

    2009: un año de cambios

    Hace un buen tiempo que no escribo, puede resultar de relleno este post pero la verdad es que es necesaria una confidencia al vacío, el contar un secreto a la multitud para desahogarme.

    Primero que nada y que me tiene con una sonrisa de oreja a oreja es que la familia se agranda :D . Si todo resulta bien entre julio y agosto con Liz tendremos en nuestros brazos a nuestr@ segund@ hij@. La fecha es muy cercana a la que nació Diego, nuestro primer hijo, hace ya más de 3 años.

    Lo otro es que me cambié de trabajo. Después de un año de trabajar con la gente de Tardis, surgió una innesperada oferta de trabajo y que, dada ciertas circunstancias, me era imposible de rechazar. Fue una partidad muy emotiva, trabajar en Tardis fue una experiencia sumamente positiva, muy enriquecedora y que me ayudó no sólo en mi desarrollo profesional sino que también en el plano personal. Gracias a Luisfel y a Pili por su apoyo.

    Así es que este año se viene con desafíos nuevos, tanto en lo personal como en lo laboral. Veamos como resulta.