Archivo

Archive for 27 noviembre 2007

Hp LaserJet 1018 en Debian Etch

noviembre 27, 2007 Deja un comentario

Luego de una dura batalla, sali triunfante y pude configurar de manera correcta mi nueva impresora.

Esta impresora es soportada en linux ver aquí, imprime en una gran calidad, pero para que lleguemos a eso hay que hacer unos pasos…

Primero instalamos los siguientes paquetes:

debian:~# make install install-hotplug cups cupsys hplip

Luego desde nuestro navegador preferido vamos a:

http://localhost:631
Administracion -> Add Printer
deberia detectarla automáticamente y le damos OK

Hasta acá tenemos configurada la impresora de forma correcta, pero si solo hacemos esto lo que yo conseguia era que mis trabajos (páginas de prueba) se encolaban y allí morian sin salir de manera impresa. Pero siguiendo con mi investigación encontré que esta como algunas otras impresoras nececesitan un firmware para funcionar, sigamos con el proceso de instalacion.

Lo que tenemos que hacer es bajar el driver foo2zjs

debian:~# wget foo2zjs http://foo2zjs.rkkda.com/foo2zjs.tar.gz
debian:~# tar zxf foo2zjs.tar.gz
debian:~# cd foo2zjs

Ahora compilamos el driver y obtenemos el frimware

debian:/foo2zjs# make
debian:/foo2zjs# ./getweb 1018
sihp1018.img

(c) Copyright Hewlett-Packard 2005

Solo nos queda cargar el frimware, aca esta el codigo tambien:

debian:/foo2zjs# arm2hpdl sihp1018.img >
           /usr/share/foo2zjs/firmware/sihp1018.dl
debian:/foo2zjs# cat /usr/share/foo2zjs/firmware/sihp1018.dl >
          /dev/usb/lp0

Listo! ya deberiamos tener que poder imprimir.
Por si no se puede deberian reiniciar el servicio del cups de la siguiente manera:

debian:/foo2zjs# /etc/init.d/cupsys restart

Una aclaracion el frimware lo tenemos que cargar cada vez que iniciemos el sistema, de no hacerlo asi podriamos hacer un script para que se haga automaticamente, no creen?, yo hice algo así:

frimware.sh
#!/bin/bash
cat /usr/share/foo2zjs/firmware/sihp1018.dl > /dev/usb/lp0
echo "Firmware cargado"

Luego algo como esto bastaría:

debian:/foo2zjs# ln -s /root/firmware.sh /etc/rc2.d/S99firmware

Proceso terminado, impriman tranquilos.

Categorías:debian, General, linux

Exepciones en IPython

noviembre 24, 2007 Deja un comentario

Free Image Hosting at www.ImageShack.us ¿Que es ipython? Ipython es un interprete interactivo para python, que ofrece muchas mejoras al lado del interprete interactivo de python -ojo!, no digo que sea mejor, o peor, yo no lo uso mucho 🙂 -, pero es bueno conocer las distintas posibilidades que tenemos, ¿no?. Siguiendo con ipython, es un proyecto de Software Libre con licencia BSD, es multiplataforma, tiene autocompletado con la tecla <tab> y muchas funcionalidades más. Como dijo Humitos: “Tenes una consola dentro del interprete de python”.
Si porque eso no lo mencione, pero podemos navegar por el arbol de directorios como si estuvieramos en el shell.
Instalacion en Debian y sus derivados:

debian:/home/nercof# apt-get install ipython

Manos a la obra: primero explico uno comandos basicos y útiles para mi, y despues lo de Exepciones.
Declaremos algunas variables primero.

In [1]: var = 1

In [2]: enum = 2

In [3]: cadena = 'hola'

In [4]: cadenita = 'txt'

El autocompletado con tab, mustra las coincidencias

In [5]: ca

cadena    cadenita  callable  cat

Podemos listar las variables que tenemos activas en la pila de memoria con el comando “whos”, que no solo las lista sino nos menciona el tipo de dato y el valor que tienen:

In [5]: whos

Variable   Type    Data/Info

----------------------------

cadena     str     hola

cadenita   str     txt

enum       int     2

var        int     1

El anterior es un comando propio de ipython, pertenece a las llamadas funciones “magicas” :p, para poder ver todas, solo hagamos:

In [6]: %lsmagic

Available magic functions:

%Exit  %Pprint  %Quit  %alias  %autocall  %autoindent

%automagic  %bg  %bookmark  %cd  %clear  %color_info

%colors %config  %cpaste  %dhist  %dirs  %ed  %edit

[...]

%lsmagic  %macro  %magic  %p  %page  %pdb

[...]

%who  %who_ls  %whos  %xmodeAutomagic is ON, % prefix NOT needed for magic functions.

Y todos los comandos de consola, por dar un ejemplo:

In [9]: pwd

Out[9]: '/home/nercof'

Ahora a las expciones:

Para trabajar con las expciones hice un pequeño ejemplo, solo cree una lista e imprimo el valor de la misma que se encuentra en el índice que me pasan por parámetro y lo guarde en el archivo ejemplo.py:

class Ejemplo:

    def __init__(self, i):

        self.a = [1,2,3,4]

        print self.a[i]

Ahora desde ipython cargamos ese ejemplo y empesamos a jugar con las exepciones:

In [11]: from ejemplo import Ejemplo

In [12]: Ejemplo(2)

Out[13]:3

Ipython contiene tres formas de distintas de reportar una exepcion, una de ellas es la que el interprete interactivo de python usa.
Modo Context: es la que se muestra por defecto, este modo imprime 5 líneas del contexto del código fuente donde sucedio la exepcion, indicando la linea de código que presenta el conflicto
Con nuestro ejemplo veriamos algo asi:

In [12]: Ejemplo(4)

---------------------------------------------------------

exceptions.IndexError  Traceback (most recent call last)
/home/nercof/Proyectos/blog/
/home/nercof/Proyectos/blog/ejemplo.py in __init__(self, i)

      3

      4 class Ejemplo:

      5     def __init__(self, i):

      6         self.a = [1,2,3,4]

----> 7         print self.a[i]

IndexError: list index out of range

Modo Plain: es similar al reporte del traceback del interprete de python. Para seleccionar este modo recurrimos a una de las funciones mágicas “xmode” y hacemos lo siguiente:

In [14]: xmode Plain

Exception reporting mode: Plain

In [15]: Ejemplo(4)

------------------------------------------------------------

Traceback (most recent call last):

  File "", line 1, in ?

  File "ejemplo.py", line 7, in __init__

    print self.a[i]

IndexError: list index out of range

Modo Verbose: similar al modo “Context” pero adicionando la impresion de las variables actuales visibles con sus respectivos valores al momento de ocurrir la exepcion. Es muy útil, porque podemos ver realmente que tienen cuando “explota” nuestro código, pero es potencialmente lento, si nuestra estructura de datos es muy compleja de computar. Para nuestro ejemple puede andar :), miremos que pasa:

In [17]: Ejemplo(4)

-----------------------------------------------------------

exceptions.IndexError   Traceback (most recent call last)
/home/nercof/Proyectos/blog/
/home/nercof/Proyectos/blog/ejemplo.py in

     __init__(self=<ejemplo.Ejemplo instance>, i=4)

      3

      4 class Ejemplo:

      5     def __init__(self, i):

      6         self.a = [1,2,3,4]

----> 7         print self.a[i]

        self.a = [1, 2, 3, 4]

        i = 4

IndexError: list index out of range

In [18]:

Y con eso concluye la forma en que se muestran, ó reportan las exepciones, esta en cada uno elegir la que mas le guste, como ya lo dije Ipython trae una por defecto, pero si a nosotros nos gusta mas otra, no duden en configurarlo, y es muy simple, solo vallan a la carpeta donde se instalo el programa, usualmente en el home de tu usuario -ojo que esta oculta- y acceden a ella para buscar y editar el archico “ipythonrc”, buscando las siguientes lineas:

[...]
#xmode Plain
xmode Context
#xmode Verbose
[...]

Y descomentan la que mas les guste y comentan “Context” y listo!.

Otra forma que tenemos es interactuar directamente con el debugger de python “pdb”, haciendo lo siguiente:

In [18]: pdb
Automatic pdb calling has been turned ON

In [19]: Ejemplo(4)
---------------------------------------------------------------------------
exceptions.IndexError   Traceback (most recent call last)

/home/nercof/Proyectos/blog/
/home/nercof/Proyectos/blog/ejemplo.py in
        __init__(self=<ejemplo.Ejemplo instance>, i=4)
      3
      4 class Ejemplo:
      5     def __init__(self, i):
      6         self.a = [1,2,3,4]
----> 7         print self.a[i]
        self.a = [1, 2, 3, 4]
        i = 4

IndexError: list index out of range
> /home/nercof/Proyectos/blog/ejemplo.py(7)__init__()
      5     def __init__(self, i):
      6         self.a = [1,2,3,4]
----> 7         print self.a[i]

ipdb> list
      2 # -*- coding: utf-8 -*-
      3
      4 class Ejemplo:
      5     def __init__(self, i):
      6         self.a = [1,2,3,4]
----> 7         print self.a[i]

ipdb>exit

Esto nos deja la accion de interactuar con el debugger directamente. Para ver mas sobre esta herramienta pueden ver aquí, o sino vean este artículo escrito por Humitos Python Debugger

Categorías:linux, Programacion, python

SQLObject: Relaciones one-to-one y one-to-many

noviembre 20, 2007 3 comentarios

Quiero contarles mas o menos de que se trata este tema, hoy estuve es estudiando el Modelo de Entidad Relacion de Ghhp, aplicacion que estamos desarrollando con unos amigos y note que había algunas cosas que no me quedaban del todo claro, es decir, de cómo iba a implementar eso en SQLObject, que es el ORM(Object Relational Manager)que optamos usar.
En particular qué hacer con los atributos de las relaciones y cómo afrontar las relaciones binarias con multiplicidad 1..n y las relaciones trinarias.

Soluciones (ó intento de…) a los cuestionamientos anteriores:

Atributos de las relaciones:
Free Image Hosting at www.ImageShack.us
En el Modelo Relacional, las relaciones al igual que las entidades, pueden poseer atributos. Por ejemplo: para registrar el numero de horas por semana que un empleado trabaja en un proyecto, podemos incluir un atributo hora a la relacion TRABAJA_EN. Hasta ahora todo bien, pero cuando queremos crear las clases para contener esas entidades y la relación, ¿a dónde va a para ese atributo?. Eso depende de la multiplicidad de la relacion con las entidades, si tenemos 1:1 ó 1:n, lo podremos trasladar a uno de los tipos de entidad participante.

  1. 1:1 Lo podemos trasladar a cuelquier entidad a la hora de crear las clases sqlobject
  2. 1:n Solo lo podremos trasladar al tipo de entidad que esta del lado n de la relacón.

Relaciones binarias con multiplicidad 1..n (one-to-many)
Para esto lo que nos provee SQLObject es MultipleJoin. ¿Qué es esto?, simplemente significa que un objeto de la clase del tipo A esta contenido por multiples objetos del tipo B. Por ejemplo:un módulo de python contiene múltiples funciones, pero las funciones solo pertenecen a un solo módulo.
Representemos este concepto en SQLObjet:

>>> class PythonFunction(SQLObject):

...     name = StringCol()

...     modulo_id = ForeignKey('PythonModule')

...

>>> class PythonModule(SQLObject):

...     name = StringCol()

...     functions = MultipleJoin('PythonFunction',

                          joinColumn='module_id')

...

>>> PythonFunction.createTable()

>>> PythonModule.createTable()

>>>

Agregemos objetos

>>> modulo = PythonModule(name='mi_modulo')
>>> funcion_uno = PythonFunction(name='f1()',
                   module_id=modulo.id)
>>> funcion_dos = PythonFunction(name='f2()',
                   module_id=modulo.id)

En los ejemplos anteriores a medida que ibamos creando objetos de la clase “PythonFunction”, le ibamos asignando el id del objeto modulo, para crear el correcto mapeo de la relacion que queremos realizar, y hacemos esto porque la claves foraneas en las bases de datos son establecidas con el id, pero como estamos utilizando SQLObject, podemos pasarle la referencia del objeto mismo,
ya que éste provee un mecanismo que desecha todo lo que no le interesa y toma lo que si.
Muestro con un ejemplo.

>>> funcion_tres = PythonFunction(name='f3()',
                    module_id=modulo)

Relaciones binarias con multiplicidad 1..1 (one-to-one)
En SQLObject para establer este mapeo es muy similar al caso anterior, solo que no llevaría el MultipleJoin
Si fuera el caso que una funcion de python tuviera solo un metodo, lo que tendriamos es algo como:

>>> class PythonFunction(SQLObject):
...    name = StringCol()
...    modulo_id = ForeignKey('PythonModule')
>>> class PythonModule(SQLObject):
...    name = StringCol()
...    function = ForeignKey('PythonFunction')
>>>

Relaciones binarias con multiplicidad m..n (many-to-many)
Esta explicacion se las debo 😛 ya que no lo utilizé todavia. Solo se que el proceso es muy similar a lo que les conte antes, solo que tenemos que usar RelatedJoin

Relaciones trinarias
Estas relaciones al momento de crear las clases para la base de datos se convierte inexorablemente en una clase más, la cual contendrá como atributos las claves foráneas de las entidades que la componen.

A medida que valla avanzando mas, si modiico algo ó simplemente aprendo algunas cosillas mas les cuento.

Categorías:Programacion, python, sqlobject

Bajar una página web completa con wget ó httrack

noviembre 14, 2007 6 comentarios


Hace tiempo que estoy haciendo ésto, no solo porque por ahí me quedo sin internet justo en el momento que realmente necesita de ese tutorial que tanto me sirve, sino tambien para bajar libros que están en formato .html, como por ejemplo los Libros de Debian.
En fin, hay dos formas de realizar esta operación, o mejor dicho, yo voy a explicar solo dos formas de realizarlo, una es la que utilizo con frecuencia, pero la otra, que acabo de conocer pinta mejor.

Para ambos casos es recomendable crear la carpeta que va a contener los archivos que estamos descargando y luego ir a esta carpeta recién creada para empesar a realizar nuestra actividad. Lo hacemos desde nuestro gestor de archivos preferido ó como yo desde la consola:


debian:/home/nercof# mkdir nombre_carpeta
debian:/home/nercof# cd nercof@debian:~$ cd nombre_carpeta/

Ahora tenemos todo listo, manos a la obra.

  1. Con httrack

    debian:/home/nercof#apt-get install httrack
    debian:/home/nercof#httrack http://www.pagina_a_bajar
  2. Con wget
    Si no queremos instalar el programa anterior, podemos realizar la misma operación éste comando que ya nos brinda GNU/Linux.

    debian:/home/nercof# wget -rkc http://www.pagina_a_bajar

    -r: recorre recursivamente la página obteniendo toda la información.
    -k: después que termina la descarga, convierte los links del documento a rutas relativas para poder navegar con normalidad.
    -c: continua desde el punto en que quedo la descarga.

Cuando termine la operacion solo abrimos el index en nuestro navegador preferido y listo!.
Ahora no tenemos excusa de que si nos quedamos sin internet no tenemos la forma de seguir estudiando.

Para mas información sobre wget vean el man pages

Categorías:debian, libros, linux

Powerpoint hace mal…

noviembre 13, 2007 2 comentarios

Hace un tiempo que no asisto a una clase que estoy cursando porque el medio que utiliza la cátedra es presentar diapositivas en Powerpoint durante “casi” 4 horas y eso me terminaba cansando, no solo porque la calidad del material que se exponía era, a mi parecer, no del todo buena, sino también porque era agobiante estar en ese lugar donde los docentes lo único que hacian es pasar una a una las transparencias, y decir lo mismo que allí estaba escrito. ¿Tiene sentido eso?.

Navegando hace un rato caí con una artículo muy bonito del diario DiarioTi que presenta la información de un estudio que realizaron especialistas australianos y que por medio de éste fundamentan que Powerpoint a veces complica el cerebro 😀 Ahora le presento un poco del artículo:

Investigadores australianos han encontrado la causa de que algunas presentaciones en Powerpoint puedan resultar “agobiantes y lejanas”. “El uso de Powerpoint ha sido una catástrofe, y debería ser suprimido”, concluye el catedrático John Sweller. “No es igualmente eficaz sustentar con audio las palabras escritas, ya que el cerebro se sobrecarga y reduce su capacidad de entender lo que está siendo presentado”.

¿Qué opinan?.
Historia completa: DiarioTi

Categorías:General

Man Pages desde el browser

noviembre 12, 2007 2 comentarios

Hace un tiempo atrás, estando en lo de Manuel, me mostró una utilidad muy piola, él ejecutando desde la barra de direcciones del Konqueror man:#comando# podía ver la página del manual, en formato html, bueno no?. Todos los usuarios de KDE ya lo tienen incorporado automáticamente, pero la mala noticia que para los usuarios de Gnome como yo solo no, pero no desespereis, con unos pasos extras podremos acceder a esa funcionabilidad 😀

Necesitaremos un servidor web y una aplicación llamada man2html, para llevar a cabo nuestro objetivo de tener las páginas del man en nuestro browser preferido. Yo en particular como servidor web optaré por Apache.

Desde una consola hacemos lo siguiente:

debian:/home/nercof# apt-get install apache2 man2html

Cuando termina de instalar nos fijamos la direccion en la cual podemos consultar el man pages desde el browser, algo así:

Tune your web browser to http://localhost/cgi-bin/man/man2html to view your installed manpages.

Espero que sirva, y no pierdan la paciencia como el “tipito de la imagen”, cuando no sepan hacer algo.
Solo consulten la documentación!.

Si todo sale bien, veremos algo como esto:
Free Image Hosting at www.ImageShack.us

Categorías:linux