Codeigniter - Framework PHP 2007-08-08

He estado probando estos días el framework PHP (a la rails) CodeIgniter. De momento la impresión es buena. En mi línea, pongo un ejemplo.

Modificando un par de ficheros de configuración o tres (un par de líneas en cada uno) y creando los siguientes dos ficheros he obtenido una sencilla aplicación que muestra las entradas de mi blog de wordpress.

El fichero del controlador (controllers/blog.php):


class Blog extends Controller {
  function Blog() {
    parent::Controller();

    $this->load->scaffolding('bb_posts');
  }

  function index() {
    $data['title'] = "BatU's Stack";
    $data['heading'] = "piling up experiences...";
    $this->db->orderby("post_date", "desc");
    $data['query'] = $this->db->get('bb_posts');

    $this->load->view('blog_view', $data);
  }
}

El fichero de la vista correspondiente (views/blog_view.php):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
  <meta http-equiv="Content-type" content="text/html;
    charset=utf-8">
  <title>Blog</title>

  <link rel="stylesheet" href="/bblog/css/style.css" 
    type="text/css" media="screen"
    title="no title" charset="utf-8">
</head>
<body>
  <div id="box">
    <div id="header">
      <h1><?=$title?></h1>
      <h2><?=$heading?></h2>
    </div>
    <div id="posts">
      <?php foreach($query->result() as $post): ?>
        <div class="post">
          <h3><?=$post->post_title?></h3>

          <div class="post_content">
            <?=$post->post_content?>
          </div>
        </div>
      <?php endforeach; ?>
    </div>
  </div>
</body>
</html>

Dejo aquí la URL del ejemplo: http://testing.inbatu.com/bblog/index.php/blog

imaplib - Ejemplo muy básico 2007-07-23

Estoy de vuelta con python, que desde antes de exámenes no había tocado nada. Y como estoy llegando al final del Learning Python, donde he visto que existe la librería poplib, me ha dado por probar imaplib.

Dejo aquí un sencillo ejemplo que muestra todos los mensajes de un buzón IMAP.

#!/usr/bin/python

import imaplib, getpass

if __name__ == '__main__':
    
    host = raw_input('Host: ')
    user = raw_input('User: ')
    passw = getpass.getpass('Password: ')
        
    mail = imaplib.IMAP4(host)
    mail.login(user,passw)
    mail.select()
    
    typ, data = mail.search(None, 'ALL')
    for num in data[0].split():
        typ, data = mail.fetch(num, '(RFC822)')
        print '\\n----------------------------------\\n',
        print 'Message %s' % num,
        print '\\n----------------------------------\\n',
        print '\\n%s\\n' % data[0][1]
        raw_input('Next message...')
        
    mail.close()
    mail.logout()

Mordiendo la manzana 2007-06-23

Después de unos meses sin escribir nada, señal de que tengo poco que contar y que he estado bastante liado este último cuatrimestre, comunico que hace unos días (4) he adquirido un MacBook 13,3 (2.16GHz).

La experiencia está siendo grata. Quizás demasiado pues de momento estoy tirando con MacOSX (ya me he flagelado por ello :P) que estoy de exámenes y no es plan de ponerme a trastear para meterle una Ubuntu.

Sobre MacOSX, la verdad la impresión es bastante buena y lo sería aún más si no fuera por el "insignificante detalle" de que su escritorio es software propietario.

Y poco más puedo decir que la mayoría de gente que pueda estar leyendo esto (osea nadie) no sepa sobre estos portátiles. Espero que este nuevo miembro de la familia se porte bien durante su estancia en Irlanda y que haga su papel en mi experiencia erasmus.

Argumentos con OptionParser 2007-03-05

En la versión 2.3 de Python se añadió el módulo optparse a la librería estándar, el cual nos sirve para parsear las opciones y argumentos que se pasan a nuestros programas, haciendo fácil y cómodo el lidiar con ellos.

Pondré un ejemplo:

from optparse import OptionParser

if __name__ == '__main__':
    usage = "%prog [options] arg1 arg2"

    parser = OptionParser(usage=usage, version="%prog 1.0")
    parser.add_option('-v','--verbose', action='store_true',
                      dest='verbose', help='shows detailed information')
    parser.add_option('-q','--quiet', action='store_false',
                      dest='verbose', help='hides detailed information')
    parser.add_option('-f','--filename', action='store',
                      dest='filename', help='name of the file to load')


    (options, args) = parser.parse_args()

    if options.verbose:
        print "Extra info enabled"
    else:
        print "Extra info disabled"
    if options.filename:
        print "I'll open", options.filename, "file."
    if args > 0:
        print "\nArguments:"
        for x in args:
            print "  ",x

Ahora veamos algunos resultados según los argumentos que pasemos (en negrita el comando ejecutado):

$ python option.py

Extra info disabled
$ python option.py -v

Extra info enabled
$ python option.py -h

usage: option.py [options] arg1 arg2

options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -v, --verbose         shows detailed information
  -q, --quiet           hides detailed information
  -f FILENAME, --filename=FILENAME
                        name of the file to load
$ python option.py -f fichero.txt "First" "Second" "Last argument"

Extra info disabled
I'll open fichero.txt file.

Arguments:
   First
   Second
   Last argument

Fijaos que distingue las opciones de los argumentos, como se puede ver en el último ejemplo.

Nota: He escrito los ejemplos en inglés para no desencajar, porque las cadenas que imprime el módulo están en inglés, aunque estaría bien que pudiera hacerlo en otros idiomas.

Parsear HTML con BeautifulSoup 2007-02-28

Voy a poner un ejemplo de uso de BeautifulSoup, un módulo para Python con el que podemos parsear HTML.

Lo primero que tenemos que hacer es descargar la librería desde aquí. Una vez instalado vamos a ver un sencillo ejemplo:

from BeautifulSoup import BeautifulSoup

html = '''<html>
  <head><title>Titulo de la pagina</title></head>
  <body>
  <div id="cabecera"><h1>Cabecera</h1></div>
  <div id="contenido">
    Vamos a poner una lista.

    Lista:
    <ul id="lista1">
      <li>Elemento 1</li>
      <li>Elemento 2</li>
      <li>Elemento 3</li>
      <li>Elemento 4</li>
    </ul>
    
  </div>
  </body>
  </html>'''

soup = BeautifulSoup(html)

# Mostramos el titulo de la pagina
print soup.head.title.string

# Mostramos la cabecera
print soup.find("div",{"id":"cabecera"}).contents

# Mostramos el contenido
contenido = soup.find("div",{"id":"contenido"})
print contenido.contents

# Ahora mostramos todos los elementos de lista1
lista = contenido.find("ul",{"id":"lista1"})
for x in lista:
    print x.string
</pre>

Si en lugar de pasar una cadena con el código html quisieramos leer de una url lo podríamos hacer así:

<pre name="code" class="python">
...
import urllib2

sock = urllib2.urlopen("http://servidor/documento.html")
soup = BeautifulSoup(sock.read())
...

Esto es un ejemplo muy sencillo de lo que se puede hacer, para más detalles leer la documentación.