Javascript: Devolver 0 cuando parseInt() o parseFloat() reciban una cadena vacía

Tip rápido sobre Javascript: Imaginad que recogemos los datos de un formulario para que calcule en pantalla un sumatorio conforme el usuario los va introduciendo. Ahora imaginad que el usuario se deja un campo vacío. Cuando la función javascript se encuentre una cadena vacía, e intente convertirla a un número (con parseInt() o parseFloat() según lo que necesitemos) el resultado de la suma será NaN. ¿Cómo lo evitamos? Pues con un OR.

Si utilizamos el operador || seguido de un cero, tal como está en el ejemplo que verás a continuación, este evaluará de forma lógica la expresión, y en caso de que el primer término evaluado sea falso devolverá el segundo, un cero (el resultado NaN que devolverá la función que parse a número será evaluado como falso):

var s = '';
var total = 1;

//Si hago esto, el resultado es NaN
total = total + parseInt(s);

//Si hago esto, el resultado es 1
total = total + (parseInt(s) || 0;);

//con parseFloat funciona igual

Otra opción, utilizar el operador ternario ?:, como pusimos en otro ejemplo pasado.

El operador ternario ?: en Java

Seguramente hayas visto en algún ejemplo de código usar el símbolo de interrogación como un operador. Y te preguntarás ¿esto cómo va?. La idea es que más o menos funciona como un condicional if/else devolviendo un valor según una condición se cumpla o no. La sintaxis sería expresiónAEvaluar?valorADevolverSiCierto:valorADevolverSiFalso;

Y como ejemplo práctico, el siguiente código:

/*
Comprobamos si x es mayor que y. 
En caso afirmativo nuestra variable vale x,
y en caso negativo y.
*/
variable=(x>y)?x:y;
/*la alternativa al operador ternario, usando if/else sería*/
if(x>y){
  variable = x;
}else{
  variable = y;
}

Dicho operador existe, con algunas variantes en su sintaxis, también en PHP, C, C++, Python, Perl y aunque en VB.NET no existe sí disponéis de la función IIF cuyo funcionamiento es similar. Como puedes ver te permitirá ahorrar líneas de código y tener un código más elegante.

Java/JSP: al enviar formulario por método POST los caracteres UTF-8 no aparecen bien representados

Me encontraba esta mañana trabajando sobre un proyecto desarrollado en Java haciendo uso de páginas JSP para las vistas, y me encontré con que al enviar un formulario no se insertaban bien en la base de datos los caracteres acentuados y las ñ, apareciendo otros extraños en su lugar. No era la primera vez que veía esto, era evidente que había un problema de codificación.

Lo primero fue comprobar que todas las páginas tuvieran definida en su cabecera la codificación adecuada:

<%@page contentType="text/html" pageEncoding="UTF-8"%>

Tras ver que eso estaba correctísimo, se me ocurre aplicar al principio del código, antes de recoger los resultados, la siguiente función:

request.setCharacterEncoding("UTF-8");

Y parecía que funcionaba, pero no. En principio en la mayoría de los casos eso soluciona el problema, pero a veces el Tomcat es puñetero (en mi caso estaba usando este servidor) y en algunas casuísticas decide que sigue cascando. Así que seguí buceando, y me encontré con que el problema está en que por defecto Tomcat interpreta los datos recibidos por POST como ISO-8859-1. Y había por medio un servlet funcionando como filtro que me escarallaba todo haciendo inútil el consejo anterior. Total, que fui a estudiarme la configuración del Tomcat, a ver si lo arreglaba definitivamente. Y así fue.

Lo primero es ir a la configuración de Tomcat y editar el archivo Server.xml, buscas allí el elemento Connector y en el valor de URIEncoding pones «UTF-8». Tras esto te vas a la carpeta WEB-INF de tu aplicación y allí editas web.xml, pegando este filtro antes que ningún otro:

  <filter>
    <filter-name>Character Encoding Filter</filter-name>
    <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>Character Encoding Filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

Un último punto: ojito a servlets que puedan funcionar como filtros intermedios antes de llegar a vuestra página jsp, a librerías de generación de contenidos o a frameworks varios, que igual tenéis que configurarlos también (cada proyecto es un mundo, pero por ejemplo con Velocity o Freemarker tendríais que configurarlos para UTF-8).

jqPlot: mostrar la leyenda en varias columnas

El otro día trabajaba con la librería jqPlot, una librería para crear gráficas por medio de javascript y jQuery, y me encontraba con que la leyenda de un gráfico de tarta que estaba haciendo se salía de su elemento contenedor, dado que tenía muchas líneas (en concreto, 58). Me pregunté ¿Cómo hago para que se muestre en dos columnas?. Pensé que era obvio que a alguien le habría pasado ants y encontré la solución en stack-overflow:

//La localización no es importante, sólo el 
//rendererOptions
legend: { 
  show: true, 
  location: 'ne',
  rendererOptions: {numberColumns: 2}
}

Luego decidí bucear un poco más en la documentación y me encontré con un plugin que nos dará mayor versatilidad para trabajar con la leyenda: jqplot.enhancedLegendRenderer.js

La cuestión es invocarlo dentro de la configuración de la leyenda y, además de permitirnos definir el número de filas y columnas (cosa que ya podemos hacer con el renderer normal, pero en este han pulido algunos bugs) también nos permite ocultar/mostrar una serie al pinchar en la leyenda. Se me ocurrió usarlo para mostrar los resultados debajo de la gráfica, en 6 columnas de 10 filas, para que quedara más bonito. Total, que la cosa fue así:

//La localización no es importante, sólo el 
//rendererOptions
legend: {
  renderer: $.jqplot.EnhancedLegendRenderer, 
  show: true, 
  location: 's',
  rendererOptions: {numberColumns: 10, numberRows: 6}
}

Creando un bot que hace FAV automáticamente en Twitter con un script de Python

Ayer aproveché el festivo para repasar un poco de scripting de Python (vicios que tiene uno), y me encontré este tutorial para crear un bot de Twitter, que he supuesto que podría interesarle a alguno de mis lectores por lo que vamos con una traducción no literal del mismo (como otras veces os cuento lo que pone pero no traduzco línea por línea).

El funcionamiento del bot/script es el siguiente: le das al bot una palabra clave, este la busca por Twitter y reparte FAV a diestro y siniestro.

El primer paso es descargar el módulo de herramientas de Twitter para Python (en el artículo original os dirige a la versión 1.10, pero es una entrada de 2013, ya van por la 1.17, yo os dejo apuntando al general para que seleccionéis la versión que os convenga). Luego tendréis que dar de alta el app en Twitter también. Al registrar el app Twitter os dará unas claves de autentificación, que se usarán para realizar la conexión tal que así:

from twitter import Twitter, OAuth, TwitterHTTPError

OAUTH_TOKEN = 'tu oauth token'
OAUTH_SECRET = 'tu oauth secret'
CONSUMER_KEY = 'tu consumer key'
CONSUMER_SECRET = 'tu consumer secret'

t = Twitter(auth=OAuth(OAUTH_TOKEN, OAUTH_SECRET,
            CONSUMER_KEY, CONSUMER_SECRET))

Lo siguiente es definir un método de búsqueda, que recoja los tweets:

def search_tweets(q, count=100):
    return t.search.tweets(q=q, result_type='recent', count=count)

Y definir el método que hará FAV al tweet:

def fav_tweet(tweet):
    try:
        result = t.favorites.create(_id=tweet['id'])
        print "Favorited: %s" % (result['text'])
        return result    
    # En caso de que ya esté marcado con FAV
    # devolverá un error.
    except TwitterHTTPError as e:
        print "Error: ", e
        return None

Y ahora ¿qué nos queda? Pues el código principal del script:

def auto_fav(q, count=100):
    result = search_tweets(q, count)
    a = result['statuses'][0]['user']['screen_name']
    print a
    success = 0
    for tweet in result['statuses']:
        if fav_tweet(tweet) is not None:
            success += 1
    print "Marcamos  %i tweets como favoritos de un total de %i tweets" % (success,
          len(result['statuses']))

Y listo, nuestro bot está preparado. Queda guardarlo en un archivo .py, como por ejemplo twitter_bot.py (respetamos el nombre del artículo original) y ya podemos ejecutarlo desde el terminal tal que así:

$ python

>>> import twitter_bot
>>> twitter_bot.auto_fav('#python','50')

El ejemplo buscará en los 50 últimos tweets el hashtag #python y marcará como favoritos los tweets que lo lleven. Ojo, porque abusar de este script podría llevar a que Twitter te aplique un baneo con todas las de la ley.

En fin, resumiendo aquí os dejo el script del artículo original (con los comentarios y el texto de salida en inglés) completo, por si queréis probar:

from twitter import Twitter, OAuth, TwitterHTTPError

OAUTH_TOKEN = 'your oauth token'
OAUTH_SECRET = 'your oauth secret'
CONSUMER_KEY = 'your consumer key'
CONSUMER_SECRET = 'your consumer secret'

t = Twitter(auth=OAuth(OAUTH_TOKEN, OAUTH_SECRET,
            CONSUMER_KEY, CONSUMER_SECRET))

def search_tweets(q, count=100):
    return t.search.tweets(q=q, result_type='recent', count=count)

def fav_tweet(tweet):
    try:
        result = t.favorites.create(_id=tweet['id'])
        print "Favorited: %s" % (result['text'])
        return result
    # when you have already favourited a tweet
    # this error is thrown
    except TwitterHTTPError as e:
        print "Error: ", e
        return None

def auto_fav(q, count=100):
    result = search_tweets(q, count)
    a = result['statuses'][0]['user']['screen_name']
    print a
    success = 0
    for tweet in result['statuses']:
        if fav_tweet(tweet) is not None:
            success += 1
    print "We Favorited a total of %i out of %i tweets" % (success,
          len(result['statuses']))

Calculando la distancia entre dos coordenadas en Java

Si no hace mucho os comenté por aquí cómo calcular la distancia entre dos puntos dadas sus coordenadas en MySQL (en ese artículo tenéis todo el tema del algoritmo para el cálculo más desarrollado, aquí vamos al grano), hoy vamos a ver cómo hacer una función que nos haga esta operación con Java.

La función recibe cuatro parámetros: las latitudes y longitudes de ambos puntos. Y devuelve un double con la distancia como resultado

public static double distanciaCoord(double lat1, double lng1, double lat2, double lng2) {  
        //double radioTierra = 3958.75;//en millas  
        double radioTierra = 6371;//en kilómetros  
        double dLat = Math.toRadians(lat2 - lat1);  
        double dLng = Math.toRadians(lng2 - lng1);  
        double sindLat = Math.sin(dLat / 2);  
        double sindLng = Math.sin(dLng / 2);  
        double va1 = Math.pow(sindLat, 2) + Math.pow(sindLng, 2)  
                * Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2));  
        double va2 = 2 * Math.atan2(Math.sqrt(va1), Math.sqrt(1 - va1));  
        double distancia = radioTierra * va2;  
  
        return distancia;  
    }  

Conversión de boolean a int en Java

Entradita rápida y simple. ¿Tienes una variable con un booleano y necesitas convertirla en un entero? No es habitual, pero por ejemplo hoy me veía en esa tesitura con una vista en JSP. ¿Cual es la mejor forma en Java, la más eficiente y corta, de convertir un boolean en un entero? Pues la siguiente:

/*Supongamos una variable boolean llamada
miBooleano*/

int miEntero = miBooleano ? 1 : 0;

/*devuelve 1 si es true y 0 si es false*/

Pioneras de la programación

«Deberíamos pensar en internet como una escuela a la que muchas chicas como nosotras nunca tuvieron la ocasión de asistir, utilizándola precisamente para superar el miedo de no ser lo bastante guapas, lo bastante cultas, lo bastante fuertes, lo bastantes bellas, lo bastante despiertas o lo que sea. puede que las mujeres no sean tan buenas en la batalla física, pero de lo que estoy segura es que son buenísimas tecleando como una ráfaga de metralleta.»

Esta frase es de Jude Milhon, autora fundamental en la cultura hacker y una de las madres del término y género cyberpunk.

En su día, con motivo de la muerte del genial Dennis Ritchie, incidía en que en la mitología creada alrededor de la informática el sistema prefiere resaltar a los empresarios por encima de a los perfiles más técnicos, a pesar de que estos últimos sean los verdaderos artífices de la innovación y la genialidad. Pero el capitalismo necesita mitos para sostenerse, y los millones de Gates, Jobs y Zuckerberg son más vendibles que las aportaciones técnicas de Torvals, Berners-Lee y Ritchie o que las de todas estas señoras de las que hablaremos a continuación. La verdad es que entre los billonarios tecnológicos no hay mucha presencia femenina, como si la hay entre las grandes mentes de este campo.

Ya en el siglo XIX, la matemática Augusta Ada Byron (hija de Lord Byron, poeta esencial en el romanticismo británico), condesa de Lovelace, nos avanzó múltiples conceptos de la computación y la informática en su trabajo sobre la máquina analítica de Charles Babbage. Originalmente se consideró qúe Ada sólo fue la traductora del trabajo del ingeniero italiano Luigi Menabrea, pero posteriormente se comprobó que la matemática inglesa había añadido las notas fundamentales a este trabajo para darle consistencia, definiendo conceptos como subrutina o análisis antes incluso de la existencia del ordenador y del concepto «software».

La contribución de Ada Lovelace puede parece muy «primitiva» por haberse dado en una etapa que podríamos describir como «prehistoria de la informática» , pero inspiraría años después a otra mujer fundamental en la historia de la informática, la estadounidense Grace Hopper. Durante la II Guerra Mundial ingresó en el ejército estadounidense, tras haberse doctorado en matemáticas en Yale. La marina la destinó a Harvard para que trabajase en el Mark I de IBM, y allí desarrolló FLOW-MATIC, el primer lenguaje de programación de alto nivel, creando posteriormente A-0 y B-0, los primeros compiladores. Fuera de su trabajo en el ejército (se mantuvo años en la reserva naval, volviendo puntualmente para trabajos con el ejército hasta su jubilación en 1986, con el rango de contraalmirante y siendo en ese momento la oficial de más edad de las fuerzas armadas estadounidenses) llevó los conceptos de FLOW-MATIC, un lenguaje de programación que utiliza palabras clave en inglés para facilitar su comprensión, a un lenguaje de uso empresarial: el popular COBOL. Posteriormente también fue parte del comité de estandarización del lenguage Fortran. Como curiosidad, bastante paradójica, ganó el premio a Hombre del Año en Ciencias de la Computación de la AITP.

Grace Hopper en 1952

Casi contemporáneamente a Hopper, en el desarrollo de ENIAC, el primer superordenador de propósito general, trabajaron como programadoras un grupo de mujeres, las cuales contaban con la dificultad de tener que trabajar sin manuales ni referencias, teniendo que desarrollar su propio método para programar. Para la historia siempre quedaron los nombres de John Mauchly y John Eckert, los ingenieros desarrolladores del hardware, mientras que Betty Snyder Holberton, Jean Jennings Bartik, Kathleen McNulty Mauchly Antonelli, Marlyn Wescoff Meltzer, Ruth Lichterman Teitelbaum y Frances Bilas Spence permanecieron en el anonimato, e incluso durante años hubo quien afirmó que se trataba de modelos que sólo posaban para la foto, despreciando su papel fundamental para el funcionamiento de la máquina.

Programadoras del ENIAC

La primera mujer en recibir un doctorado en Ciencias de la Computación, y realmente una de las primeras dos personas en recibirlo pues lo consiguieron a la vez, fue la hermana Mary Kenneth Keller. Sí, hermana en el sentido religioso, la Dra. Keller había tomado los votos con 19 años uniéndose a las Hermanas de la Caridad de la Beata Virgen María, dedicando posteriormente su vida a la ciencia y la ingeniería, licenciándose en matemáticas en 1943, obteniendo el master en matemáticas y física en 1953 y finalmente siendo nombrada doctora en Ciencias de la Computación en 1965. Antes de ese logro académico formó parte del grupo de investigación de la Universida de Dartmouth que trabajaría en el desarrolo del lenguaje BASIC, una de las familias de lenguajes de programación más extendidas e importantes.

Mary-Kenneth-Keller-780x583

Tampoco sería justo olvidar a Margaret Hamilton, que fue la creadora del término Ingeniería del Software cuando trabajaba en la NASA nada menos que en el proyecto del Apollo XI, así que si has visto el meme de cómo una nave con el hardware de una lavadora llegó a la luna fue esta señora quien dirigió la creación del software que ejecutaba. Aunque su aportación al proyecto Apollo sea lo más llamativo y famoso seguramente en el día a día su importancia sea mayor por sus aportaciones en los inicios de la programación asíncrona, el procesamiento multi-hilo o la técnica de control de fallos conocida como End-To-End Testing.

800px-Margaret_Hamilton_-_restoration

Como decía al principio, en la historia de la informática, en los últimos años, se ha resaltado más el papel de aquellos que triunfaron en el campo económico y se ha relegado al ostracismo a los perfiles más técnicos, dejando en muchos casos a estas pioneras olvidadas de forma intencional. ¿Puede ser esto la causa de que a día de hoy haya más hombres interesados en la programación que mujeres? Tal vez sea más necesario que nunca reivindicar a estas pioneras, en lugar de a hipsters que se hicieron millonarios a base de vender teléfonos fabricados por obreros explotados en Asia.

Seguridad en WordPress ¿cómo cambiar el prefijo de la base de datos?

Si alguna vez has hecho una instalación de WordPress verás que te solicita, para crear el sitio, el nombre de una base de datos, el usuario con el que se conectará a ella, la contraseña de ese usuario y un prefijo. ¿Por qué un prefijo? Simplemente porque así puedes tener varias instalaciones de WordPress (o de otros CMS que usen nombres de tabla muy genéricos tipo «users», «posts», etc.) en una misma base de datos.

Si no cambiamos esta configuración por defecto el sistema pondrá el prefijo «wp_» a las tablas. El no poner un prefijo personalizado, en si, constituye un error. Porque dejando el prefijo por defecto estás provocando: a)Que si un atacante logra ver el nombre de una tabla descubra que el CMS que estás utilizando es WordPress y b) Que dicho atacante, entonces, pueda conocer los nombres de las tablas de tu base de datos. La solución es simple, durante la instalación define un prefijo personalizado.

¿Ya lo tienes instalado? Don’t worry, be nécora. No está todo perdido, tienes todavía varias opciones. La más rápida y simple, instalas este plugin que te permitará cambiarla cómodamente desde la interfaz gráfica. ¿La versión más larga y compleja y élite? Pues los siguientes pasos te lo explican:

Bueno, como paso previo, o paso 0 del proceso HAZ UN BACKUP DE TU BASE DE DATOS POR SI ALGO FALLA Y TIENES QUE RECUPERARLA. Consejo que debes tener siempre en mente cuando te pongas a tocar tablas de una instalación de cualquier cosa.

El primer paso: ir a wp-config.php y cambiar ahí el prefijo (en nuestro caso pondremos como prefijo personalizado my_b457Bch33s_ ).

$table_prefix  = 'my_b457Bch33s_';

El siguiente paso es renombrar todas las tablas de tu instalación de wordpress:

/*Básicamente vas haciendo esto con todas las tablas*/
RENAME table `wp_comments` TO `my_b457Bch33s_comments`;

Tras renombrar las tablas haces un update sobre la tabla options buscando todas las líneas que hagan referencia a tablas con el prefijo viejo para actualizarlas:

UPDATE `my_b457Bch33s_options` SET `option_name`=REPLACE(`option_name`,'wp_','my_b457Bch33s_') WHERE `option_name` LIKE '%wp_%';

Y con la tabla usermeta tres cuartos de lo mismo, update que te crió.

UPDATE `my_b457Bch33s_usermeta` SET `meta_key`=REPLACE(`meta_key`,'wp_','my_b457Bch33s_') WHERE `meta_key` LIKE '%wp_%';

Y tras esto deberías tener todo funcionando de nuevo, pero con el nuevo prefijo, más seguro contra potenciales atacantes.

El patrón Observer y su implementación en PHP

Volvemos con el tema de los patrones de diseño y PHP, que estaba abandonado (y ahora tengo más tiempo para escribir con el parón temporal del podcast). Esta tarde vamos a hablar del patrón Observer, que en castellano es conocido como el patrón publicación-inscripción.

La idea de este patrón es que nos permita definir una dependencia uno-a-muchos entre varios objetos, provocando que cuando uno cambie de estado se lo notifique a sus objetos dependientes. El objetivo de este patrón es reducir el acoplamiento entre clases que requieren mantener una gran consistencia en sus relaciones, siendo clave para la implementación del patrón MVC. Dentro de esta relación denominamos Sujeto al objeto que emite la información sobre el cambio de estado, y Observador al que la recibe para realizar la acción que sea necesaria.

Os dejo esta imagen con un diagrama cargado desde la Wikipedia para ilustrar su funcionamiento:

Diagrama Estructura Patrón Observer
Un diagrama de estructura del patrón Observer (publicación-inscripción).

En PHP 5, a partir de la revisión 5.1 contamos con las interfaces SplSubject y SplObserver para implementar respectivamente el sujeto y el observador.

Vamos con un ejemplo clásico: una tienda on-line que notifica la compra y la venta de un artículo.

<?php
class Articulo implements \SplSubject /*Empezamos importando la interfaz del sujeto*/
{
    protected $storage;

    public function __construct(\SplObjectStorage $storage)
    {
        $this->storage = $storage;
    }

    public function compra()
    {
        // compra
        $this->notify('comprado');
    }

    public function vende()
    {
        // vende
        $this->notify('vendido');
    }

    public function attach(\SplObserver $observer)
    {
        $this->storage->attach($observer);
    }

    public function detach(\SplObserver $observer)
    {
        $this->storage->detach($observer);
    }

    public function notify($event = '')
    {
        foreach ($this->storage as $observer)
            $observer->update($this, $event);
    }
}

class Notify implements \SplObserver /*seguimos con lai implementacion del observer*/
{
    public function update(\SplSubject $subject, $event = '')
    {
        if ($event == 'comprado')
            echo 'El artículo se ha comprado' . PHP_EOL;
        else if ($event == 'vendido')
            echo 'El artículo se ha vendido' . PHP_EOL;
    }
}

/*¿Cómo luciría llevado a la práctica?*/

/*Creamos el objeto*/
$articulo = new Articulo(new \SplObjectStorage());
/*vinculamos el artículo al observer*/
$articulo->attach(new Notify()); 
/*imprimiría en pantalla que se ha comprado*/
$articulo->compra();
/*imprimiría que se ha vendido*/ 
$articulo->vende(); 
?>

Es una idea básica donde simplemente se imprime en pantalla el resultado de una acción, pero ya os hacéis una idea de las posibilidades de este patrón.