Lemming² : La luz al final del tunel…

lemmings.jpgHace unos meses se nos ocurrió la pregunta: ¿Porque tenemos cuatro gestores de contenido programados, y diferentes entre ellos?La respuesta fue clara, cada 6 meses se había hecho uno, usando diferentes formas de programación y dejando en el camino opciones útiles o soluciones a problemas antiguos. Como todos sabemos, este mundo de la web avanza cada día, podríamos decir que cada hora, así que íbamos intentando estar siempre por delante, pero lo que lográbamos era ir para atrás, como los cangrejos.Pero llegó el día en el que decidimos pararnos a reflexionar si lo que hacíamos estaba bien, y claro, la verdad es que no tenia lógica, así que juntamos en nuestros monitores todos los CMS que habíamos realizado, más alguno de prestado que nos gustaba, tipo drupal, y analizamos todas las características que creíamos que debía tener nuestro nuevo CMS. Ni cortos ni perezosos nos pusimos a programar y diseñar. El proyecto duró algunos meses, más de lo que nos pensábamos, y la verdad es que Quadrícula lo ha notado, o trabajas para ti o para tus clientes, pero sinceramente creo que ha valido la pena.Es un gozo ver con que rapidez generamos webs dinámicas con gestor de contenidos. Ver como los clientes nos felicitan por la sencillez de uso, y que se programan mejoras que enriquecen al conjunto de clientes, ya que al ser modular todas se pueden añadir a los otros CMS generados.El proyecto se llamó Lemmings 2, de ahí que en el qblog los homenageemos, son nuestros ídolos y pronto subiremos una demo para que podáis usarlo y toquetearlo y como no, criticarlo. Todas vuestras sugerencias serán bienvenidas.Conclusión, la luz al final del túnel no a sido la muerte, sino la salida… jejeje

Funciones útiles/curiosas de PHP

Funciones de cadenasmd5 ( string cadena [, bool modo_binario] ) — Calcula el hash md5 de una cadena.metaphone ( string cadena [, int phones] ) — Calcula la clave “metáfona” de una cadena.ord ( string cadena ) — Devuelve el valor ASCII de un carácter.similar_text ( string primera, string segunda [, float &porcentaje] ) — Calcula la similitud entre dos cadenas.soundex ( string cadena ) — Calcula la clave soundex de una cadena.strip_tags ( string cadena [, string etiquetas_permitidas] ) — Elimina etiquetas HTML y PHP de una cadena.levenshtein ( string cadena1, string cadena2 [, int cost_ins [, int cost_rep, int cost_del]] ) — Calcula la distancia Levenshtein entre dos cadenas.nl2br ( string cadena ) — Inserta saltos de línea de HTML antes de cada salto de línea de la cadena.Funciones de matrices array_keys ( array entrada [, mixed val_a_buscar [, bool strict]] ) — Devuelve todas las claves de una matriz.array_rand ( array entrada [, int num_req] ) — Selecciona una o más entradas aleatorias de una matriz.shuffle ( array &matriz ) — Mezcla una matriz.range ( mixed bajo, mixed alto [, number paso] ) — Crea una matriz que contiene un rango de elementos.array_search ( mixed aguja, array pajar [, bool estricto] ) — Busca un valor determinado en una matriz y devuelve la clave correspondiente en caso de éxito.array_walk ( array &matriz, string func [, mixed datosvarios] ) — Aplica una función del usuario a cada elemento de una matriz.Funciones de URLget_meta_tags ( string nombre_archivo [, bool usar_ruta_inclusion] ) — Extrae todo el contenido de atributos de etiquetas meta de un archivo y devuelve una matriz.get_headers ( string url [, int formato] ) — Recupera todas las cabeceras enviadas por el servidor en respuesta a una petición HTTP.http_build_query ( array datos_formulario [, string prefijo_numerico] ) — Generar una cadena de consulta codificada estilo URL.parse_url ( string url ) — Procesar una URL y devolver sus componentes.Funciones matemáticasrad2deg ( float numero ) — Convierte el número en radianes a su equivalente en grados.is_infinite ( float val ) — Encuentra si un valor es infinito.hypot ( float x, float y ) — Calcula la longitud de la hipotenusa de un triángulo de ángulo-recto.getrandmax ( void ) — Mostrar el mayor valor aleatorio posible.Funciones de fecha y hora strtotime ( string hora [, int ahora] ) — Procesar cualquier descripción textual de fecha/hora en Inglés convirtiéndola en una timestamp de UNIX.mktime ( [int hora [, int minuto [, int segundo [, int mes [, int dia [, int anyo [, int es_dst]]]]]]] ) — Obtener la marca de tiempo Unix de una fecha.date_sunset ( int marca_de_tiempo [, int formato [, float latitud [, float longitud [, float cenit [, float diferencia_gmt]]]]] ) — Obtiene la hora del atardecer de un día y lugar concretos.date_sunrise ( int marca_de_tiempo [, int formato [, float latitud [, float longitud [, float cenit [, float diferencia_gmt]]]]] ) — Obtiene la hora del amanecer de un día y lugar concretos.

Ayuda con un web spider

Estoy desarrollando un web spider en PHP. De momento he conseguido que el “bicho” vaya saltando de web en web consiguiendo sus enlaces.

Resulta bastante divertido ver como se mueve por diferentes webs que están enlazadas entre sí, pero ahora quiero que laika (así es como lo he llamado) tenga alguna utilidad.

Entre las aplicaciones que se me han ocurrido destacan:

  • Buscador de favicons
  • Supernube de tags
  • Buscador de acrónimos a partir de las etiquetas <ACRONYM>.

Qué se os ocurre a vosotros?

PHP: Ternarios

El operador ternario nos permite compactar estructuras condicionales simples. Qué quiere decir esto? Pues que esta estructura:

if ($condicion == 1){$variable = 'ok';}else{$variable = 'OhNO!';}

Queda reducida a esta otra:

$variable = ($condicion == 1) ? 'ok' : 'OhNO!';

Simplificando, de esta manera, nuestro código.

Drupal 4.7 y FeedBurner

En mis webs personales siempre uso drupal, tanto la versión 4.7 como 5.1 (ahora toca actualizar a 5.2).Ayer me puse a cambiar todos los feeds, para que redireccionaran automáticamente a Feedburner, pudiendo así controlar la gente que tengo suscrita vía RSS. En la versión 5.1 fué todo tan sencillo como bajar un módulo y activarlo, pero oh! sorpresa!, no encontré ningún módulo que hiciera lo mismo para la versión 4.7.No habia más remedio que atacar directamente al código. Después de un buen rato buscando entre los ficheros encontré la solución, en la línea 2004 del archivo node.module, en la carpeta modules.La solución es tan fácil como coger esta función:

drupal_add_link(array('rel' => 'alternate','type' => 'application/rss+xml','title' => t('RSS'),'href' => url('rss.xml', NULL, NULL, TRUE)));

Y substituirla por:

drupal_add_link(array('rel' => 'alternate','type' => 'application/rss+xml','title' => t('RSS'),'href' => 'http://feeds.feedburner.com/nombre_de_tu_feed'));

Con este pequeño cambio el feed principal queda redireccionado a Feedburner. Los feeds de las categorías NO se redireccionan, quedan tal y como estaban.

PHP: Convertir fecha a formato largo

Esta pequeña función sirve para convertir una fecha (tanto en formato dd/mm/aaaa como en timestamp) a formato largo:Código:

// Parámetros: string $data:  Fecha en formato dd/mm/aaaa o timestamp//             int    $tipus: Tipo de fecha (0-timestamp, 1-dd/mm/aaaa)//// Retorna:    string  Fecha en formato largo (x, dd mm de yyyy)function data_text($data, $tipus=1){if ($data != '' && $tipus == 0 || $tipus == 1){$setmana = array('Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado');$mes = array('Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre');if ($tipus == 1){ereg('([0-9]{1,2})/([0-9]{1,2})/([0-9]{2,4})', $data, $data);$data = mktime(0,0,0,$data[2],$data[1],$data[3]);}return $setmana[date('w', $data)].', '.date('d', $data).' '.$mes[date('m',$data)-1].' de '.date('Y', $data);}else{return 0;}}

Ejemplo:echo data_text(’20/08/2007′);Salida:Lunes, 20 Agosto de 2007