Archivo de la categoría: Programación

Sección dedicada a la programación y diseño web

«SCRAM-SHA-1» authentication mechanism requires libmongoc built with –enable-ssl

Vamos a ponernos en antecedentes, estaba con una contenedor de Docker, para ser mas claros el de WordPress, en el cual quería habilitar unos módulos de PHP que necesitaba, uno de ellos el de mongodb. La instalación de la extensión de MongoDB para PHP se realiza, como la mayoría de los modulos con pecl. El modulo que estoy instalando es la versión 1.4.1.

# pecl install mongodb

Bien una vez realizado esto, el código que tenia ejecutándose en esta maquina me ha devuelto este bonito error, buscando documentación he encontrado que el motivo de este error es que para usar el mecanismo de autentificación SCARM-SHA-1 debe estar habilitado en el modulo de php de mongodb el libmongoc SSL, el cual no se habilita cuando se instala el modulo. Solución,  pues lo mas fácil es:

      1. Desinstalamos el modulo si lo tenemos
        # pecl uninstall mongodb
      2. Debemos comprobar si tenemos instalado el libssl-dev, y si no instalarlo, por ejemplo en sistemas Debian (Ubuntu, Mint)
        # sudo apt-get install libssl-dev
      3. Una vez instalado, podemos o bien descargar el mongodb-1.4.1 u otra versión desde la web de pecl o bien utilizar el que hemos descargado anteriormente que seguramente esta en los temporales. Pecl MongoDB
      4. Ahora viene la parte mas «complicada», descomprimimos el fichero, y nos ubicamos dentro de la carpeta que se ha generado por medio del terminal:
        # descomprimidos el fichero descargado
        $ tar -xvf mongodb-1.4.1.tgz
        # Accedemos a la carpeta
        $ cd mongodb-1.4.1
        # Ejecutamos dentro de la carpeta el phpize
        $ phpize
        # Una vez ejecutado configuramos la extensión asi - Comprobar la salida de la
        # instalación con pecl para ver donde esta la ruta de --with-php-config
        $ ./configure --with-php-config=/usr/local/bin/php-config --with-mongodb-ssl=openssl
        # Finalizada la configuración correctamente generamos la extensión
        $ make
        # Ahora copiamos las extension generada al directorio donde estan nuestras
        # extensiones. Se puede comprobar con el phpinfo() o con php -i en linea
        $ cp modules/mongodb.so /directorio/php/modules/
        
      5. Ya solo queda cargar la extensión, si no lo habíamos hecho antes agregando la linea «extension=mongodb.so» a nuestro php.ini o creando el fichero en el directorio de carga de extensiones de PHP.

     

Como aumentar y reducir las fechas con PHP

DateTime es una clase la cual nos ayuda a manejar las fechas y las horas con PHP desde la versión 5.2.0, aunque yo me he encontrado problemas con algún metodo con esta versión. No es una operación muy habitual pero es posible que alguna vez nos veamos en la necesidad de aumentar o reducir una fecha. La manera general es usando el DateInterval, pero la nomenclatura de este puede ser un tanto liosa, ya que por ejemplo para representar un dia tienes que pasa P1D como parametro y cosas asi. Una manera mas sencilla es utilizando el metodo modify.

// Creamos el objeto fecha con el dia actual
$fecha = new DateTime();
// Agregamos 1 dia a la fecha
$fecha->modify('+1 day');
// Quitamos 1 dia a la fecha
$fecha->modify('-1 day');

Aparte de day para dia podemos usar week, month, year para fechas.

Mas información DateTime modify en PHP

 

Detección de Genero con Gender API o Genderize.io

A la hora de detectar el genero de una persona en base al nombre, nos podemos ayudar de dos servicios web, gender API y Genderize.io. Los dos funcionan estupendamente, y los dos tienen un limite de peticiones, y funcionan los dos muy rápidos, y tienen los  dos un funcionamiento prácticamente igual. He creado un gist que usa los dos servicios, por defecto usa Gender API, y que esta configurado para España, aunque se puede cambiar para cualquier país cambiando el código de país.


function generoPersona($nombre, $provider = 'genderAPI')
{
$providers = array(
'genderAPI' => array(
'url' => 'https://gender-api.com/get?name=',
'pais' => '&country=ES'
),
'genderize' => array(
'url' => 'https://api.genderize.io/?name=',
'pais' => '&country_id=es'
)
);
if (array_key_exists($provider, $providers)) {
$dataProvider = $providers[$provider];
}
$generoPersona = 'Hombre';
$curl = curl_init($dataProvider['url'].$nombre.$dataProvider['pais']);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$result = json_decode(curl_exec($curl));
if (is_a($result, 'stdClass') && property_exists($result, 'gender')) {
$generoPersona = ($result->gender == 'female')? 'Mujer' : 'Hombre';
}
return $generoPersona;
}

Mas info: https://gender-api.com y https://genderize.io

Uso de array_map para codificar los valores de un Array

En alguna situación nos podemos encontrar con la necesidad de tener que codificar todos los valores de un array. Un método largo seria por medio de un foreach o el for, o podemos usar array_map para aplicar una función a todos lo valores contenidos en el array.

 

$encodedArray = array_map("utf8_encode", $decodedArray);

Mas Info: http://php.net/manual/es/function.array-map.php

Comprobar si existe un elemento en un Array con jQuery

Si queremos comprobar si existe un elemento en un array de Javascript podemos usar el método .inArray() de jQuery. Este método es muy parecido a la función indexOf().

Este metodo devuelve -1 cuando no encuentra el elemento y el numero de indice si lo encuentra. Hay que tener en cuenta que este método devuelve 0 si detecta el primer elemento del array, por eso a la hora de realizar la función es conveniente no hacer la comparación con verdadero o falso, y hay que hacerla con -1. Podemos usar un ultimo parámetro si queremos comprobar la existencia de ese valor en ese indice, si existe devuelve 1, si no existe devuelve 0.

Uso: $.inArray(valor, array [,indice])

var colores = ['Azul', 'Rojo', 'Verde', 'Amarillo'];
$.inArray('Verde', colores); //devuelve 2
$.inArray('Azul', colores); // devuelve 0
$.inArray('Rojo', colores, 1); // devuelve 1
$.inArray('Rojo', colores, 2); // devuelve -1
$.inArray('Morado', colores);// devuleve -1

Mas Info: https://api.jquery.com/jQuery.inArray/

Aplicar estilo a multiples elementos excepto unos

La semana pasada en Selección múltiple con patrones en CSS explicaba como aplicar estilos a multiples elementos por medio de patrones. Pero ¿que sucede si dentro de ese grupo de elementos hay algunos a los cuales no queremos que se aplique ese estilo? Voy a poner un ejemplo donde nos podemos encontrar con esa situación, supongamos que estamos utilizando bootstrap 3 en nuestra web, y tenemos un formulario en el cual queremos poner un asterisco rojo delante de todos los elementos obligatorios, una manera sencilla y rápida para hacerlo es con CSS, aplicando un simple estilo

label.required:before   {
    content: "*";
    color: red;
}

Con esta regla lo que hacemos es antes de cada label(con el pseudo selector before, si quisiéramos que fuera después lo sustituiríamos por :after) que sea de la clase required le agregamos un * de color rojo. Según como tengamos diseñado el formulario, y si estamos usando elementos radio, nos podemos encontrar que delante de cada etiqueta de radio nos ha puesto el asterisco, para solucionar esto podemos usar el pseudo selector :not de la siguiente manera:

label:not(.radio).required:before   {
    content: "*";
    color: #ff3b30;
}

Espero que os sea de utilidad.

Animaciones de Hide y Show con jQuery

Uno de los efectos a la hora de distribuir el contenido dentro de una pagina web es el de ocultar y mostrar, el .show() y el .hide() de jQuery. Este efecto, a mi modo de entender, queda mas visual si le aplicamos un efecto con jQuery UI. Una manera simple de aplicar estos métodos con efecto es el uso de .slideUp() y .fadeOut() para ocultar y .slideDown() y .fadeIn() para mostrar.

El slideUp() lo que hace es ocultar el contenido con un efecto que hace subir el texto hacia el párrafo superior ocultándose, y slideDown() hace aparecer el texto por debajo del párrafo superior.

El .fadeIn() lo que hace es desvanecer el contenido y el fadeOut() lo contrario.

A estos 4 métodos le podemos pasar como parámetro el tiempo en milisegundos que queremos que dure este, o bien slow, normal, fast, o no pasarle ningún parámetro para que lo haga a velocidad normal. Os dejo un ejemplo con estos 4 efectos

https://jsfiddle.net/rubenlacasa/fw5x54qo/

Mas Info: http://api.jquery.com/category/effects/

Creative Tim – Dale un look profesional a tu web

Buscando inspiración y recursos para el desarrollo de nuevos proyectos di con la web de Creative Tim y sus diseños y plantillas para web son muy buenos. Dentro de los temas que nos ofrecen destacaria el Paper Kit, Get Shit Done Kit y Awesome Landing Page.
Estos Kits son gratuitos para uso personal, y en el caso que seas desarrollador tiene un coste de 19€ cada uno.
Yo os recomendaria descargar las versiones gratuitas primero y enredar con ellas. Tengo que decir que la documentación y los ejemplos que hay en las descargas dan mucha ayuda a la hora de realizar tus desarrollos. Decir que todos los temas estan basados en Bootstrap 3, y si tienes un poco de experiencia con el, no vas a tener problemas a la hora de integrarlos.

Para poder descargarlos hay que registrarse en la web, y uno de los primeros correos que te envian, por lo menos en mi caso, es un codigo de descuento para comprar uno de sus temas.

Los números de 2015

Los duendes de las estadísticas de WordPress.com prepararon un informe sobre el año 2015 de este blog.

Aquí hay un extracto:

El Museo del Louvre tiene 8.5 millones de visitantes por año. Este blog fue visto cerca de 110.000 veces en 2015. Si fuese una exposición en el Museo del Louvre, se precisarían alrededor de 5 días para que toda esa gente la visitase.

Haz click para ver el reporte completo.

Reordenando nombres y eliminado comas con LibreOffice usando funciones concatenadas – SPREADSHEETS TIPS

SpreadsheetEl otro dia me encontré con un caso, que seguramente muchos os habéis encontrado alguna vez. Tenia dos hojas de calculo (por no decir excel) que en uno tenia los dos apellidos y el nombre (por lo menos estaban separados por una coma) y en el otro el nombre estaba en el orden de nombre y dos apellidos. Me gusta muy poco, por no decir nada, que me pongan el nombre y los apellidos en el mismo campo, pero que le vamos ha hacer, me vino así. Total que estos listados estaban destinados para crear un email personalizado, y la verdad, queda muy mal mandar el email con «Estimado Fernandez Martinez, Francisco».  Ante tal escenario, solo hay 3 opciones, la primera que es pedir que la persona que te lo ha mandado te lo ponga bien, algo que todos sabemos no va a ser, o hacerlo uno mismo, algo que sabemos va a ser lo que va a suceder.

En mi terminal de trabajo uso Linux, mas concretamente Linux Mint, y a la hora de abrir hojas de calculo uso Libre Office Calc, pero uno a la hora de trabajar con funciones de hojas de calculo esta acostumbrado a Excel, tengo que decir que la diferencia es minima, y si uno conoce las funciones que tiene que usar, da igual usar uno u otro programa.

Para realizar esta tarea use las funciones CONCATENAR, DERECHA, IZQUIERDA, LARGO , ENCONTRAR y REDUCIR

Vamos a ver un poco por encima estas funciones a ver que hacen.

La función CONCATENAR(texto;texto1;texto2;…): Esta función sirve, como su propio nombre indica, para concatenar cadenas de texto.

La función DERECHA(texto;número): Devuelve el ultimo carácter o los últimos caracteres de un texto.

La función IZQUIERDA(texto;número): Devuelve el primer carácter o los primeros caracteres de un texto.

La función LARGO(texto): Devuelve la longitud de una cadena de texto.

La función ENCONTRAR(texto_buscado;texto;num_inicial): Busca un valor de texto dentro de otro tomando en cuenta las mayusculas y minúsculas.

La función REDUCIR(texto): Elimina los espacios del texto, excepto el espacio normal que se deja entre palabras.

Bien con estas funciones vamos a encontrar la solución a nuestro problema. Supongamos los siguientes datos de ejemplo en nuestra hoja de calculo

Tabla de datos origen
Tabla de datos origen

Primero vamos a buscar la posición de la , y esto lo haremos con la función ENCONTRAR.

Nos situamos en la celda B1 y escribimos en la linea de funciones:

=ENCONTRAR(«,»;A1)

Esta función nos devolvera 19, que es la posición que ocupa la , en el texto de la celda A1

Función encontrar

Una vez encontrada la posición, vamos a extraer los apellidos, para eso usaremos la función IZQUIERDA la cual la usaremos concatenada con la función ENCONTRAR.

=IZQUIERDA(A1;ENCONTRAR(«,»;A1)-1)

Esta función nos devolvera FERNANDEZ MARTINEZ. El -1 del final es por que si le pasamos directamente el encontrar nos incluye la , y eso no nos interesa, nos interesa solo los apellidos.

Ahora vamos a extraer el nombre, y para hacer eso usaremos la función DERECHA, la función LARGO, y otra vez la función encontrar.

Empezaremos usando la función LARGO la cual nos devuelve el total de numero de caracteres que tiene la cadena de texto.

=LARGO(A1)

Esta función nos devuelve 29, ahora vamos a usar de nuevo la función ENCONTRAR(«,»;A1)

=LARGO(A1)-ENCONTRAR(«,»;A1)

Esto nos devolvera 10, que es el numero de caracteres que hay desde la , hasta el final de la cadena. Hay que tener en cuenta que según tengamos escrita la cadena puede haber un espacio en blanco o no incluido en ese numero, eso es algo que solucionaremos mas tarde con otra función.

Ahora que sabemos cuantos caracteres tiene el nombre, podemos extraerlo con la función DERECHA.

=DERECHA(A1;LARGO(A1) – ENCONTRAR(«,»;A1))

Esto nos devolvera FRANCISCO. Ahora fijaros si el texto resultante tiene un espacio en blanco delante o no, esto dependerá de como lo han escrito en origen, para eliminar los espacios que puede haber al principio o al final usaremos la función REDUCIR.

=REDUCIR(DERECHA(A1;LARGO(A1) – ENCONTRAR(«,»;A1)))

Esta función nos devolvera FRANCISCO sin espacios delante.

Ahora nos queda CONCATENAR las partes que tenemos, y esto nos deja la siguiente función. En esta función final uso la función REDUCIR para que envuelva a toda la cadena y elimine los posibles espacios en blanco no deseados.

=REDUCIR(CONCATENAR(DERECHA(A1;LARGO(A1) – ENCONTRAR(«,»;A1));» «;IZQUIERDA(A1;ENCONTRAR(«,»;A1) -1)))

Función finalResultado final

Una vez aplicada la función, en la celda B2 nos aparece FRANCISCO FERNANDEZ MARTINEZ, es decir ordenado, sin comas y sin espacios extra.

Ahora solo nos quedaria aplicar la formula en toda la columna (doble clic en el punto negro de la esquina inferior derecha) teniendo la celda B1 seleccionada.

Aplicando la formula

Finalmente, si queremos eliminar los datos originales y quedarnos solo con los nuevos datos, ya ordenados, seleccionaremos la columna B, la copiaremos, y haremos un pegado especial de solo texto encima de la columna A, aceptaremos la advertencia que nos da, y eliminaremos la columna B, y con esto ya tenemos todos nuestros datos en el formato deseado.

Pegado especial Resultado final

Espero que os sirva.