Personalizar El Error 404 En WordPress

Como ya lo había mencionado en alguna ocasión este blog esta en continuo desarrollo, la mayor parte del mismo consiste en modificaciones menores basadas en pruebas de diversos plugins disponibles pero el día de hoy quiero compartir con ustedes una modificación “manual” que hice.

Verán alguna vez vi que un sitio (ahora no recuerdo cual) mostraba enlaces “relacionados” cuando alguien intentaba entrar en una pagina que no existía (en la famosa pagina del error 404), así que decidí hacer algo similar.

Al principio intente hacer uso de algún plugin (a estas alturas ya deben saber que soy muy perezoso y si se puede me ahorro trabajo) pero al no encontrar uno que funcionara como yo quería (tampoco es que buscara mucho en realidad) decidí modificar la pagina del error 404 yo mismo para que mostrara lo que yo quería.

Bueno pues, dejemos el choro a parte y comencemos con lo bueno.

Lo primero que debemos hacer es localizar nuestra pagina de error 404, esta la hallaremos en la carpeta wp-content/themes/nombreDelTema/ y obviamente se trata de la pagina 404.php

Ahora bien antes de empezar a moverle hagan un respaldo que no me hago responsable si la cagan si algo deja de funcionar 😛

Ya que tengamos nuestro respaldo pasaremos a modificarla dejándola con algo similar al siguiente código…

<h2>Ups!</h2>
   <p>Los siento pero lo que buscas no se encuentra aquí U_U, aunque tal vez te interese alguno de los siguientes post...</p>
   <ul>
      <?php
         global $post; // variable para cargar cada uno de los post
         $myposts = get_posts('numberposts=10&orderby=rand'); // get_posts devuelve un "arreglo" de posts, en este caso 10 posts de forma aleatoria
         foreach($myposts as $post) : // recorremos el arreglo de posts y en cada linea ponemos el link y el titulo...
      ?>
         <!-- Link (the_permalink) y titulo (the_title) -->
         <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
      <?  endforeach;?>
   </ul>
   <p>O si lo prefieres busca algo diferente a continuación <img src='http://www.pinguinoerrante.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ...</p>
   <!-- Adicionalmente ponemos el cuadro de búsqueda -->
   <input type="text"  onfocus="doClear(this)" value="<?php _e('Palabra(s) a buscar...'); ?>" name="s" id="s" size="25" /> <input type="submit" name="submit"  value="<?php _e('Buscar'); ?>" />p

Como pueden ver la modificación es bastante sencilla y deja un buen resultado, pueden ver como queda aquí o bien tipeando cualquier articulo inexistente dentro del blog :p

Para mas información sobre get_posts pueden consultar el Codex de WordPress

Un FTP En Python

Hace algún tiempo procrastinaba leyendo sobre python y me encontré con la sorpresa de que poseía una librería para FTP así que decidí probar, el código resultante fue asombrosamente pequeño por lo que el día de hoy decido compartirlo con ustedes

#!/usr/bin/python
import sys
import os.path
import re
from ftplib import FTP

if(len(sys.argv) > 1):
   host="dominio"
   user="usuario"
   password="password"
   ftp = FTP(host,user,password)
   print ftp.getwelcome()
   print "\nLos siguientes Archivos se encuentran en el servidor...\n"
   ftp.cwd("files")
   ftp.retrlines('LIST')
   argumento=0
   print "Subiendo Archivos...\n"
   for un_archivo in sys.argv:
      if (argumento>0):
         name=os.path.basename(un_archivo)
         archivo=open(un_archivo,"rb")
         print " > Subiendo "+un_archivo
         ftp.storbinary('STOR '+name,archivo)
         print " * Archivo "+un_archivo+" subido correctamente"
      argumento=argumento+1
   print "\n"
   print "Envio exitoso\nLos siguientes archivos se encuentran ahora disponibles...\n"
   ftp.retrlines('LIST')
   ftp.quit()
else:
   print "falta especificar un archivo"

Obviamente este programa solo funciona para subir archivos (tal como esta escrito arriba) pero con un poco de ingenio puede sernos de mucha utilidad para por ejemplo subir múltiples archivos con solo arrastrar y soltar sobre un lanzador (eso en el caso de gnome, si estamos en windows ponemos usar un archivo .bat)

Espero les sea de utilidad.

PD.- Antes de que los puristas me agredan con comentarios como “pero donde esta la seguridad al dejar el usuario y contraseña al descubierto” les recuerdo que lo programe en un rato de ocio, el que tenga el tiempo y las ganas de encriptar los datos que lo haga 😛

Como funciona un antivirus

Me encontraba leyendo mis miles de feeds cuando me encontré con una nota publicada por Hispasec sobre el tema de los antivirus.

Se trata de una analogía sobre el como funcionan los antivirus, es muy fácil de comprender y creo que a muchos les podría servir para compartirlos con sus lusers conocidos que ignoran por que es importante y/o como funciona un antivirus.

A continuación un fragmento:

Si nuestro ordenador fuera una discoteca el antivirus sería el portero, el encargado de decidir quién puede pasar y quién no a divertirse en nuestro local. Dependiendo de lo exclusiva que sea nuestra discoteca, la dirección podría haber ordenado al portero que siguiera una de las siguientes estrategias…

Puedes leer la nota completa en Hispasec.

Visto en Un Mundo Binario

Una macro para hipervinculos

Siempre he creído que una de las características natas de mi persona por la cual siempre termino aprendiendo habilidades inusuales es mi pereza, la falta de ganas de hacer una tarea repetitiva una y otra vez y es que por que hacer una tarea miles de veces si puedes hacer una actividad UNA solo vez y ya (aunque sea más difícil). Esto ha provocado que constantemente busque como realizar diferentes tareas de la manera más simple posible y al mismo tiempo (después de verme) muchos de mis amigos me consulten sobre como realizar diferentes tareas (algunas que la verdad jamas hubiera imaginado siquiera).

Justo hace unos días uno de mis amigos me pidió ayuda para obtener las direcciones de correo de una tabla de excel, no es que sea tonto ni nada similar, sino que los correos electrónicos venían en celdas con hipervinculos, es decir la celda traía un hipervinculo de correo electrónico pero no la dirección, se podría cambiar “fácilmente” dando clic derecho sobre la celda y después modificar hipervinculo sin embargo el numero de registros era enorme y seria muuuy tardado, por lo cual se me ocurrió realizar una pequeña macro que nos ahorrara mucha chamba (insisto, soy huevon).

Nunca antes me había visto en la necesidad de crear una macro pero ya que a fin de cuentas están basada en visual basic no pensé que fuera tan difícil y la verdad no lo fue, de hecho lo único tardado fue encontrar los métodos adecuados para realizar esta tarea (que esperaban es la primera vez que hago una).

La macro resultante es la siguiente:

Sub Macro()
Dim celda As String
Dim link As String
Dim n As Integer
For n = 1 To 1168' bucle que hara lo mismo desde la celda E1 hasta la celda E1168
    celda = "E" & n
    Range(celda).Select
    If ActiveCell.Hyperlinks.Count > 0 Then' nos aseguramos de que tenga hipervinculo
       Selection.Hyperlinks(1).TextToDisplay = Selection.Hyperlinks(1).Address' si tiene hipervinculo lo mostramos
    End If
Next
End Sub

No tengo idea de si esta macro puede servirle a alguien pero de cualquier manera quería compartirla, seguramente habrá una manera más fácil de hacerlo pero insisto es mi primera vez, así que no sean muy rudos 😛

Actualización 16-01-2009: Carla preguntaba como hacer un indice para las hojas de excel, pues bien, después de buscar un poco me encontré con la solución, básicamente es necesario crear un nuevo modulo en el libro de excel y escribir:

Sub Links_hojas()
   Dim wrbLibro As Workbook
   Dim wrsHojaActiva As Worksheet, wsHoja As Worksheet
   Dim intFila, intColumna As Integer
   Set wrbLibro = ActiveWorkbook
   Set wrsHojaActiva = ActiveSheet
   'en que fila/columna empezar la lista
   intFila = 4
   intColumna = 1
   'el bucle repasa todas las hojas
   For Each wsHoja In wrbLibro.Worksheets
      'para excluir hoja de los links
      If wsHoja.Name = "Hoja4" Then GoTo ProxHoja
      'crear links
      If wsHoja.Name <> wrsHojaActiva.Name Then
         'Nota: las siguientes 3 lineas escribanlas en una
         wrsHojaActiva.HyperLinks.Add wrsHojaActiva.Cells(intFila, intColumna),
         "", SubAddress:="'" & wsHoja.Name & "'!A1",
         TextToDisplay:=wsHoja.Name
         intFila = intFila + 1
      End If
      ProxHoja:
   Next wsHoja
End Sub

El articulo original esta disponible en xltoday.net lugar en el cual encontraran muchos otros ejemplos de macros 😉

Expresiones regulares

Hace algunos días me vi en la necesidad de aprender a usar expresiones regulares en python, justo en esos días me encontré con un comic con el que me sentí identificado…

Y es que a quien no le ha pasado que después de aprender alguna nueva habilidad, técnica, etc, no busca la manera de usarla tanto como sea posible.

Bueno en caso de que hallan entrado aquí para aprender a usar las expresiones regulares no se preocupen no pondré solo el comic sino que compartiré el programa que escribí, pero primero la explicación de lo que hace aunque no profundizare en el por que lo hice…

Primeramente para quien no conoce que es una expresión regular (tal vez entraron a este blog de forma accidental), les dejo la definición de la wikipedia:

Una expresión regular, a menudo llamada también patrón, es una expresión que describe un conjunto de cadenas sin enumerar sus elementos. Por ejemplo, el grupo formado por las cadenas Handel, Händel y Haendel se describe mediante el patrón “H(a|ä|ae)ndel”. La mayoría de las formalizaciones proporcionan los siguientes constructores: una expresión regular es una forma de representar a los lenguajes regulares (finitos o infinitos) y se construye utilizando caracteres del alfabeto sobre el cual se define el lenguaje. Específicamente, las expresiones regulares se construyen utilizando los operadores unión concatenación y clausura de Kleene.

El programa lee un archivo de texto (por ejemplo un txt aunque originalmente lo pensé para un html) buscando todas las ocurrencias de una letra mayúscula seguida por un numero (X1, G6, Y77, R55, etc.) y lo le agrega “+ al inicio y +” al final ( X1 pasa a ser +X1+” ), solo buscara las letras mayúsculas de manera que cualquier ocurrencia en letras minúsculas no sea cambiada (h1, h4, t1, etc. quedan igual).

Adicionalmente agrega V1=” al inicio de cada linea y “: ASCII(5,V,1,2) al final ademas de un salto de linea (\n) por ejemplo:

Linea original: Si el valor de X1 es igual a H777 entonces…

Linea generada: V1=”Si el valor de “+X1+” es igual a “+H777+” entonces…\n“: ASCII(5,V,1,2)

Todo lo anterior lo almacena en un nuevo archivo con el mismo nombre pero extensión .kplr (miArchivo.txt se guarda como miArchivo.txt.kplr)

Bueno sin mas les dejo el código del programa

import sys          # sys (para el paso de argumentos),
import os.path    # os.path (para comprobar la validez del archivo)
import re          # y re (para las expresiones regulares)

if(len(sys.argv) > 1):   # comprobamos que exista un parámetro
    archivo=sys.argv[1]   # lo asignamos a la variable archivo
    existeF = os.path.exists(archivo)  #comprobamos que exista el archivo
    if existeF: # si existe el archivo...
        lee = open(archivo,"r")  # lo abrimos como solo lectura
        escribe = open(archivo+".kplr","w")  # creamos el archivo con extensión .kplr
        while True: # bucle para leer todas las lineas
            linea = lee.readline() # leemos una linea
            if not linea: # nos aseguramos que sea una linea
                break # de lo contrario terminamos el bucle
            lineaNueva=linea.rstrip() # quitamos a la linea los caracteres que no queremos (el salto de linea)
            lineaNueva=re.sub(r'([A-UW-Z]\d+)',r'"+\1+"',lineaNueva) # sustituimos las ocurrencias de nuestra expresion
            lineaEscribe='V1="'+lineaNueva+'": ASCII(5,V,1,2) \n' # añadimos lo que queremos al inicio y final de la cadena
            escribe.write(lineaEscribe) # guardamos la linea en nuestro archivo .kplr
        print "Codigo kplr creado correctamente" # al terminar mostramos el mensaje de todo correcto
    else: # si no existe el archivo
        print "El archivo no existe, debes indicar un nombre de archivo valido" # mostramos mensaje de error
else: # si no se paso un parámetro
    print "Debes indicar el nombre del archivo" # mostramos mensaje de error

En fin, espero que este preograma les sirva, aunque sea para darse una idea de como usar las expresiones regulares.

Links…

Comic xkcd

Expresiones regulares en la wikipedia.