Posts encontrados en Tips

feb 08 29

Cómo usar tags en expresiones regulares

Tiempo estimado de lectura: 1,47 minutos

Ya hemos hablado acerca del poder de las expresiones regulares en la programación. Sin embargo, extraer información de una cadena con expresiones regulares puede ser un tanto complicado a la hora de navegar por los índices del array generado.

Para solucionar este problema, varios lenguajes implementaron los tags en las expresiones regulares. Estos tags permiten al desarrollador organizar el array de salida en una cadena de coincidencias.

Para ejemplificar este mini tutorial, utilizaré la función preg_match_all() de php, ya que es la que mayormente uso en este tipo de casos. Los que usan python por ejemplo, podrán usar la misma expresión en la función re.findall().

Manos a la obra

Imaginemos por un momento que queremos obtener diferente información de una url y queremos extraer por un lado el protocolo, por otro lado ver si tiene las www, por otro el dominio propiamente dicho y por el otro lado el request.

Si usáramos una expresión regular común, con preg_match_all() que busca todas las coincidencias posibles y las guarda en un array indexado, se nos haría difícil calcular antes de ver el array en que posición está la información que necesitamos.

Por ejemplo:

preg_match_all ('/(.+://)(www.)?([^/]+)(.*)/', 'http://www.google.com.ar/search?q=elezeta', $array);

Nos dará como resultado un engorroso $array que estará compuesto por varios índices en donde cada uno de esos índices son las coincidencias que la función detectó y para utilizar esta información, tenemos primero que ver como es el array y después llamar al índice que nos interesa.

En cambio, usando los tags, podemos decirle que además de crear el array indexado, nos agregue índices asociativos con los tags de nuestra información.

El mismo ejemplo con tags:

preg_match_all ('/(?P<protocolo>.+://)(?P<w>www.)?(?P<dominio>[^/]+)(?P<query>.*)/', 'http://www.google.com.ar/search?q=elezeta', $array);

De esta forma sabemos que:

$array['protocolo']: va a tener el protocolo "http://".
$array['w']: va a tener si usa www "www", si no usa, va a ser nulo.
$array['dominio']: va a tener el dominio: "google.com.ar".
$array['query']: va a tener todo el resto.

Como verán es muy simple el uso de tags en las expresiones regulares en lenguajes que lo soportan. Tan sólo agreguen ?P<tagname> delante del grupo de coinsidencia y la función se encargará del resto.

Esto surge de una charla que tuvimos con Matías acerca de las virtudes de las expresiones regulares en PHP y en Python.

feb 08 23

Hacer que Twitter Tools envíe post a Twimbler

Tiempo estimado de lectura: 0,29 minutos

Luego de leer la entrada de Twimbler en unblogged, lo primero que hice fue modificar el plug-in de wordpress Twitter Tools para que mande el post con el string #log: a Twitter para que aparezca en Twimbler. Resultó perfectamente.

Cómo modificar el plug-in Twitter-Tools:

En la línea 75 de la versión 1.1b1 del plug-in, setear la variable tweet_prefix cambiando el texto anterior:

$this->tweet_prefix = '#log:';

En la línea 196 cambiar la url de posición para que quede primero:

$tweet->tw_text = sprintf(__($this->tweet_format, 'twitter-tools'), get_permalink($post_id) ,$post->post_title);

Listo, twitteamos y Twimblereamos de una sola vez. :D

UPDATE: Versión modificada: Twitter Tools plus Twimbler (reemplazá los archivos del plug-in)

feb 08 21

Expresiones regulares en MySql

Tiempo estimado de lectura: 1,02 minutos

Pocas cosas son tan universalmente útiles como las expresiones regulares en la programación o en la edición de texto. Podemos definir cualquier patrón escrito con estas perlas de códigos ilegibles y aun así pocos programadores las usan e incluso muchos hasta las desconocen.

Esta maravillosa herramienta funciona para casi cualquier lenguaje y MySql no se queda afuera ya que la incorpora a partir de su versión 4 5.

Situación:

Tenemos una tabla de miles registros con diferentes comentarios, cientos de ellos son spam y camuflaron su nombre al mejor estilo Ph3nt3rmine. Pero detectamos un patrón, cambian sólo la i y las e por 1 y 3 pero pueden usar mayúsculas y minúsculas (Ph3nt3rminE, PhentErm1n3, PhEntermIn3…).

Solución:

  1. Generamos una expresión regular que coincida con el nombre malicioso del spammer: Ph(3|e|E){1}nt(3|e){1}rm(1|i|I){1}n(3|e|E){1} o Ph[3eE]nt[3eE]rm[i1I]n[3eE]
  2. si la simplificamos

  3. Generamos la consulta que borre todos las coincidencias:
    DELETE FROM comments WHERE name REGEXP "Ph[3eE]nt[3eE]rm[i1I]n[3eE]"
  4. Ejecutamos la consulta.

Eso es todo, borramos todo el spam indeseado con todas sus combinaciones posibles en una sola consulta. Imaginense todo el tiempo que perderíamos tratando de cubrir todas las combinaciones posibles sin estos preciosos patrones.

Desafortunadamente este comando no puede ser usado en la funcion REPLACE de MySql ya que sólo devuelve true or false, supongo no tardarán mucho en incorporarla al mejor estilo preg_replace de php.

feb 08 18

BOM en UTF-8 o Caracteres raros en archivos de texto

Tiempo estimado de lectura: 0,57 minutos

Puede que alguna vez hayan visto ciertos caracteres raros al principio de archivos de texto cuando los abrieron con algún editor que no suelen usar como puede ser el VI (vim) o el nano en linux o simplemente algún otro software en Windows (sólo lo corroboré con el MySQL Yog). Incluso ciertos scripts pueden dar error cuando el compilador los detecta.

Si tu archivo de texto tiene en el comienzo alguna de estas cadenas: “EF BB BF“, “FF FE“, “FF FE 00 00” o simplemente algo como “.” no te asustes, podes borrarlas sin problemas. Se trata del BOM (Bit Order Mask), algo así como una cabecera del encoding UTF-8/16/32.

La mayoría de los editores de código permiten guardar los formatos UTF sin el BOM. Sin embargo muchas veces lo tiene configurado por defecto y lo guardan junto con el texto. Siempre se sugiere que se guarde sin el BOM para evitar problemas de incompatibilidad con otros editores o compiladores.

Manejo del BOM en editores conocidos:

  • Notepad++ Lo trae desactivado por defecto y no permite activarlo cuando se utiliza UTF
  • Dreamweaver Lo trae desactivado por defecto y permite activarlo cuando se utiliza el “Save As” o “Guardar Como”
  • Zend Studio Algunas versiones lo traen por defecto activado y se requiere entrar a los settings para desactivarla

Tu editor ¿Guarda el BOM? Si, es así, cuidado.

Más información en: http://unicode.org/faq/utf_bom.html

jul 06 06

Saltos de página con CSS, una propiedad poco popular.

Tiempo estimado de lectura: 0,46 minutos

Muchos se habrán encontrado con la necesidad de hacer páginas usables para ser impresas (printer friendly), esto no es nuevo y ya hay artículos más que interesantes para mostrar páginas con el objetivo de ser impresas. Pero muchas veces cuando vemos una página y la mandamos a imprimir nos encontramos con que no siempre la impresora y el sistema setean los saltos de página de manera regular y tenemos problemas con que se cortan imágenes, recuadros, líneas entre otras cosas.

Solucionar esto, es muy sencillo pero no tan popular. Usando CSS se pueden definir saltos de página en distintas posiciones de nuestra página. Esta solución hace que las páginas sean considerablemente más printer-friendly.

Vean este ejemplo (prueben imprimirlo a un archivo para ver la diferencia.)

En el ejemplo, cada página se muestra recuadrada cuando se muestra por pantalla. Ahora, en el caso que queramos que la impresora respete las página de la misma forma, podremos simplemente usar, en el grupo de propiedades de impresión (media=”print”), la propiedad:

page-break-after:always;

Simple pero muy efectivo como podrán ver.

may 05 26

Tip para el manejo de rangos de fechas DATETIME

Tiempo estimado de lectura: 0,54 minutos

Los que trabajamos en PHP conocemos que es algo engorroso trabajar con fechas sino es con alguna clase hecha que se encargue de todo. Pero aveces no encontramos la que necesitamos.

El formato timestamp de unix es sencillo de usar pero limitado en el rango que abarca, este va desde 1970 hasta el 2038 en Windows y va desde 1901 hasta 2038 en Unix. Por lo que trabajar con fechas anteriores o posteriores da errores.

Para esto, hay varias soluciones que van desde librerías con timestamps más amplios hasta trabajar con otro formato como por ejemplo el DATETIME de MySQL.

Este tip apunta obtener los registros cuyo campo “campoFecha” en formato DATETIME, está entre un rango de años determinado.

Para sacar registros cuyo campo ‘campoFecha’ está dentro de un rango que va desde el 1789 hasta el 2000 podríamos hacerlo simplemente de este modo:

SELECT * FROM tuTabla WHERE DATEDIFF('1789',campoFecha) < 0 AND DATEDIFF('2000',casmpoFecha) > 0

DATEDIFF('fecha1','fecha2') saca la diferencia de la primer fecha respecto a la segunda. Por lo que si la fecha1 es mayor a la fecha2 el número da positivo y, por el contrario, si fecha1 es menor a fecha2 el número resultante da negativo.

Entonces, si tenemos que el registro tiene una fecha mayor a 1978 y esa fecha es menor a 2000, lo selecciona. Se pueden usar también >= o <= para incluir la fecha límite.

Lamentablemente, la función DATEDIFF funciona a partir de la versión MySQL 4.1.1. y muchos de los servicios de hosting actuales disponen de versiones anteriores de este motor de base de datos.

Entonces una de las alternativas para versiones de MySQL inferiores podría ser la siguiente:

SELECT * FROM tuTabla WHERE TO_DAYS(’1978′) – TO_DAYS(‘campoFecha’) < 0 AND TO_DAYS('2000') - TO_DAYS(campoFecha) <= 0

TO_DAYS('año') devuelve la cantidad de días desde el año 0 hasta ese mismo año. Por lo que la diferencia daría positivo o negativo según los valores restados.

abr 05 06

window.opener – JavaScript para Mozilla

Tiempo estimado de lectura: 1,04 minutos

Es probable que si programás sitios webs, hayas visto la necesidad de programar una ventana pop up que interactúe con la ventana padre.

Para lograr esto en IE no es nada de otro mundo, ya que el ámbito de los objetos puede ser salteado. Pero para hacer lo mismo en Mozilla u Opera, esto tiene que ser algo mucho más preciso

Ejemplo:

Tenemos una ventana padre con un formulario con nombre "formulario"; dentro un campo de texto con nombre "resultado". y un link que abre una ventana pop up.

Y en el pop up: Un formulario llamado "formu", un campo de texto llamado "datos" y un link que pasa los datos del pop up a la ventana padre.

comunicacion entre ventanasEntonces, para hacer referencia al valor de “resultado” desde la ventana hija tenemos 4 instancias: window.opener (ventana padre), .document (documento html), .formulario (form), .resultado (input text) las cuales hay que respetar a rajatabla para que funcione en otro navegador que no sea IE.

Quedaría asi:
window.opener.document.formulario.resultado.value

Lo que faltaría ahora asignarle el valor del texto “dato” desde la ventana hija asi:
window.opener.document.formulario.resultado.value = window.document.formu.datos.value;

Ver el ejemplo funcionando (habiliten popups en sus navegadores para este ejemplo)

Acá les dejo el código, Vale aclarar que los campos de texto son sólo para el ejemplo, esto puede hacerse con cualquier objeto.

Ventana padre:

Ventana popup:

Si querés agregar algo te será agradecido, si querés más información acerca de como funciona Mozilla con JS esta página te puede servir.

ene 05 26

¿WordPress te mandó la contraseña encriptada al email?

Tiempo estimado de lectura: 0,57 minutos

Quizá a alguno de ustedes le pasó algo así como olvidarse la contraseña para entrar al administrador de WordPress y se la tubieron que enviar al email sin buenos resultados, porque lo que WP habia mandado eran códigos ilegibles.

Bien, esos códigos fueron codificados con un algoritmo llamado BASE64, un popular sistema de codificación.

Una solución práctica se logra con este codificador/decodificador online, tan sólo deben meter el código encriptado y tildar la opcion que esta abajo de desencriptar. Como por arte de magia aparece el mensaje en el formato que ustedes quieran.

Me sorprendió lo completo que está esta herramienta online, ya que permite codificar/decoficar archivos de hasta casi 10 MB. Además de obtener el resultado en varios formatos de encoding.

Además tiene links muy útiles con scripts hechos en diversos lenguajes de programación lo que lo hace muy versátil.

Ahora ya saben, cuando reciban códigos de un WP que les envió la nueva contraseña, copien y péguenlo en esta herramienta y tendrán su clave en “criollo” se podría decir.

Ejemplo:

U2kgZXN0YXMgbGV5ZW5kbyBlc3RvOg0KDQox
IFBvcnF1ZSBzb3MgY3VyaW9zby9hDQoyIFNvcyBt
4XMgZ2VlayBkZSBsbyBxdWUgcGVuc2FiYXMN
CjMgVGUgb2x2aWRhc3RlIGxhIGNvbnRyYXNl8WEg
eSBlc3ThcyBwcm9iYW5kbyA6KQ==

1) Copien,
2) Peguen en el area de texto de la herramienta online,
3) Seleecionen: “decode the data from a Base64 string…”
4) Inicien la decoficación :)

sep 04 27

Un estándar para banear a bots

Tiempo estimado de lectura: 1,32 minutos

Me llamo la atención, mirando el error-log de mi Server, que se repetía varias veces el error de archivo no encontrado (un tal robot.txt). Lo primero que hice fue mandarme al google enseguida. Ahí di con la clave.

Aparentemente existe una forma estándar de evitar que los robots consulte alguna sección específica del sitio, ya sea un directorio, una página o un archivo. Es bastante sencillo, se especifica en ese archivo de texto robot.txt que robot queres que no entre, o que robot queres que no entre y adonde.

A continuación explico más o menos como hacerlo. No se si exista la explicación en castellano; la que encontré yo, fue en inglés. Igual puede serlesútil.

Este archivo debe llamarse robots.txt y encontrarse en la carpeta raíz de nuestro sitio. (/robots.txt)

El archivo esta dividido en bloques, donde en cada bloque se especifican los detalles de exclusión de cada agente robot; a su vez se puede especificar un bloque igual para dos o mas robots sin tener que repetirlo.

En la primera línea del bloque se especifica el robot (user-agent), se pueden usar * para determinar un universo. Por ejemplo:

User-agent: *
User-agent: Gulliver/1.3

(encontre una completa lista de bots user-agent aca: http://support.free-conversant.com/2701)

Dentro del bloque, Disallow especifica con la ruta a la que no queremos darle acceso al robot, por ejemplo:

Disallow: /tmp/
Disallow: /foo.html

Cada línea debe estar después de un salto de línea. También se permiten comentarios anteponiendo el #

Ahora veamos un par de ejemplos completos:

En este ejemplo le denegamos el acceso a todos los robots, menos a Guliver/1.3, a /paginas-personales/ a /tmp/ y a /foo.html

# robots.txt para http://www.elezeta.net

User-agent: * # este bloque va para todos los bots.
Disallow: /paginas-personales/ # Toda la carpeta y sus directorios
Disallow: /tmp/ # toda la carpeta temporal
Disallow: /foo.html # tan solo el archivo foo.html

# en este nuevo bloque le permitimos a Gulliver recorrer todo nuestro sitio

User-agent: Gulliver/1.3
Disallow:

Las cosas que se aprende cuando uno se sienta un ratito a leer “cosas” de Internet. Y no sólo que se queda leyendo mas de un ratito, sino que se pone a postear lo que aprendió… Ja!

Saludos.

ago 04 10

TIPS WINDOWS – Cambiar el serial

Tiempo estimado de lectura: 0,48 minutos

El otro día un amigo me pregunto porque no podía realizar el update de su windows XP, ya que le tiraba un error de “legitimidad” de su distribución. Eso sucede porque el serial que se utilizó para la instalación fue dado de baja por la gente de Microsoft.

Ahora explicare los pasos para cambiar de serial por uno valido y asi poder realizar los updates de windows update

Primero hay que eliminar el s/n viejo. de esta forma:

1) Ejecutar el regedit (inicio->ejecutar->”regedit”),

2) Luego realiar el siguiente camino dentro del regedit: HKey_Local_Machine/Software/Microsoft/Windows/NTCurrent VersionWPAEvents

3) En el panel izquierdo del regedit, eliminar el contenido de oobetimer (con el click derecho).

2do Asignarle nuevo Nro de S/N asi:

1) Anda denuevo a ejecutar y escribi este comando:
%systemroot%/system32/oobe/msoobe.exe /a

2) En la pantalla que te aparecera elegi activacion por telefono

3) En esa otra pantalla elegi la que dice cambiar la clave del producto y escribi la nueva clave que tengas.

Eso seria todo amigos… Tengan en cuenta que las claves que comienzan con FCK Estan desactivadas

Saludos :)

El amigo Asterion tiene razon, usen este tip con responsabilidad :P