Codeigniter - Framework PHP

8 de August de 2007, a las 2:18  

PHP, Programación 1 comentario »

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

23 de July de 2007, a las 21:29  

Programación, Python No hay comentarios »

Estoy de vuelta con python, que desde antes de examenes 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()
 

Argument parsing with OptionParser

5 de March de 2007, a las 0:31  es

Programación, Python No hay comentarios »

From Python 2.3 we've the module optparse on standard library, which serve us for parse options and arguments passed to our programs, doing it easy and handy.

Here's an example:

 
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
 

Let's see some results depending on arguments passed:

$ 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

Notice it knows options from arguments, as you can see in the last example.

HTML parsing with BeautifulSoup

28 de February de 2007, a las 19:54  es

Programación, Python No hay comentarios »

I'm gonna put an example using BeautifulSoup, a Python module which we can parse HTML.

First we've to download the library from here. Once installed, let's see the simple example:

 
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
 

Instead of a string with html code we can read from an URL on this way:

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

It's a very simple sample, for details read the BeautifulSoup documentation.

Operador const de C++ (Resumen)

27 de January de 2007, a las 12:06  

C++, Programación No hay comentarios »

Variables constantes

  • const int entero;
    Entero constante, una vez inicializada la variable entero no podrá ser cambiado su valor.
  • const int * pentero; ó int const * pentero;
    Puntero a entero constante, el contenido del puntero pentero no se podrá cambiar.
  • int * const pentero;
    Puntero constante a entero, no se podrá cambiar el puntero.

Como regla general const afecta al elemento que está inmediatamente a su izquierda, si no hay nada al que está inmediatamente a su derecha.

Valores constantes de retorno de función

const char * Funcion()
{ return "Un texto";}
 
Funcion()[1] = 'a'; // Erro

La variable devuelta no se puede modificar pues es constante.

Parámetros constantes

void mostrarPila(const Pila &p);

Como mostrarPila no debe modificar la pila pasamos el objeto pila a mostrar por referencia y constante. De esta manera no podremos modificar el objeto p, ni acceder a métodos de este que no se hayan declarado como const.

Métodos constantes

class Tipo {
...
	void imprime() const;
...
}

Evita que el método imprime pueda modificar los miembros del objeto.

Twitter Updater

20 de January de 2007, a las 13:37  es

Programación, Python, Utiles 1 comentario »

After I saw the script made by felipe, for twitting basecamp TODOs, I made another one (more simpler) in Python, it's just for twitt from console. So, for instance, I just can do Alt+F2 in KDE (or directly in a console) and write twupdater "Exams are out!".

Not an existential thing, but it has give me some phreak time. And while I had the chance to trying http in python.

Here is:

twupdater_v02.tar.gz

Update: Now the script ask user and pass if them is not configured.
Last update: Furthermore, now checks user and pass before send status.

New book received

3 de January de 2007, a las 21:49  es

Libros, Personal, Python 2 comentarios »

I was sleeping this morning when a ring has waked up me. It's made me quite angry, but all turned different when I've opened the door, "Hi I've a book for you" WOW. The Programming Python 3rd Edition book that I ordered on 13th december has arrived to me. I got really surprised.

The book is on quite good state, only two small scratches. It's big, almost double size of Programming Perl. At all it has brigthen up me today.

Mi primer programa

9 de December de 2006, a las 21:38  

C++, Programación, Qt No hay comentarios »

En septiembre comencé a desarrollar una sencilla aplicación de gestión de almacén para el gabinete de estética de mi prima. En un principio pensé en hacerlo en Java, pues era el lenguaje que estudié el año pasado. Pero el desarrollo de interfaces gráficas para este lenguaje no me resultaba demasiado cómodo. Así que decidí hacerlo con C++ utilizando Qt, retomando así un lenguaje y una librería que se me habían quedado un poco pendientes.

El programa en sí es bastante sencillo (de momento), estará lleno de bugs, mal diseñado... también hay que tener en cuenta que es lo primero más o menos serio que hago en el campo de la programación.

Como ya he dicho utilizo Qt (4.2) no solo para las interfaces sino en general. Utilizo las estructuras de datos que vienen con la librería, las clases de acceso a bases de datos... SQLite fue mi elección ya que como no va a ser una base de datos de tamaño excesivo pensé que estaría bien, además para las copias de seguridad basta con copiar el fichero de la base de datos a un lugar seguro.

En fin, que ya tengo digamos una primera versión utilizable del programa, aunque no funciona como me gustaría si que por lo menos "funciona". La gestión de productos es un poco tediosa y tal. Pero bueno para empezar ya se puede manejar toda la información que creemos que es necesaria.

El código del programa se puede obtener mediante subversion:

Para la versión en desarrollo:

svn co http://svn.inbatu.com/almacen/trunk almacen

Para la primera versión que he considerado "estable" (más bien funcional):

svn co http://svn.inbatu.com/almacen/branches/almacen-0.5

Bueno y unas capturas de pantalla (un poco feas):

vprincipal Almacen 0.5 - Ventana entrada de producto Almacen 0.5 - Ventana nuevo producto

Ejem, quizá falte maquear un poco más las cosas. El pedazo de hueco blanco de la ventana principal es un textarea que puse para rellenar, más adelante quiero poner una lista de albaranes en su lugar.

Haciendo amigos en C++

3 de November de 2006, a las 15:25  

C++, Programación 1 comentario »

Mediante el uso de la palabra clave friend podemos permitir el acceso a miembros privados o protegidos de una clase a funciones que no pertenecen a esa clase o a permitir el acceso a otras clases. Veremos dos casos ejemplo, declarando una función como friend dentro de la interfaz pública de una clase y declarando una clase como amiga.

Funciones friend

Cuando declaramos una función como friend en una clase estamos indicando que esa función tendrá acceso a los miembros privados de la clase, pero la función en cuestión no forma parte del ámbito de la clase. Veamos un ejemplo:

Supongamos que tenemos una clase que representa un número racional como un par de números enteros. Queremos que este tipo nuevo se pueda usar de igual forma que int, double,... así:

 
Racional r(2,3);
cout &lt;&lt; r &lt;&lt; endl;
 

Para poder hacer esto necesitamos sobrecargar el operador de inserción binario operator<<:

 
class Racional
{
     friend ostream &amp;operator&lt;&lt;(ostream &amp;out, const Racional &amp;r);
     public:
 
     Racional(int numerador, int denominador);
     ~Racional();
     // ...
};
 

De esta manera la función friend obtiene acceso completo a los miembros de Racional. La implementación de esta función se haría, fijándonos en que no pertenece al ámbito de la clase:

 
ostream &amp;operator&lt;&lt;(ostream &amp;out, const Racional &amp;r)
{
     // Acceso a los miembros privados de Racional para mostrar r.
     // ...
 
     return out;
}
 

Podríamos haber declarado la función como no friend, entonces tendríamos que usar métodos públicos get(), set() para obtener los valores, usando friend podemos acceder directamente a los miembros, y además la función forma parte de la interfaz pública de la clase Racional.

Clases friend

Además de declarar una función no miembro como friend, podemos declarar funciones miembro de otras clases como friend, así como otras clases como clases amigas.

Las clases amigas se usan en casos donde una clase está íntimamente ligada a otra. Por ejemplo supongamos que tenemos una clase Punto que representa una coordenada, y una clase ColeccionPunto que guarda una lista de puntos. Como la colección quizá necesite manipular objetos Punto, podemos declarar ColeccionPunto como amiga de la clase Punto:

 
// Clase Punto
class Punto
{
     friend ColeccionPunto;
 
     public:
     Punto(double x, double y) :
     m_x(x),
     m_y(y)
     {
     }
 
     ~Punto();
     // ...
 
     private:
     double m_x;
     double m_y;
};
 

Como la clase ColeccionPunto esta declarada como friend, puede acceder a los datos internos de cualquier objeto Punto. Una cosa importante es que esta amistad no es mútua, aunque ColeccionPunto puede acceder a Punto no se da el caso inverso. Además la amistad no es heredable, las clases que deriven de ColeccionPunto no podrán acceder a Punto. El principio detrás de esto es que la amistad no se concede de forma implícita sino que cada clase debe especificar de forma explícita sus amigos.

Probando con Swing

24 de April de 2006, a las 16:05  

Java, Programación No hay comentarios »

Pues ya que lo estoy dando en clase, me ha dado por probar un poco con swing. El resultado es un pequeño, sencillo y poco usable programa que me he hecho para gestionar libros, mediante una base de datos mysql.

En concreto usando JDBC con el driver de mysql. Tiene muchos fallos y no funciona demasiado bien, pero ahi esta.

Código fuente

RSS entradas RSS Comentarios Log in