Configurar adaptador inalámbrico de red USB con ndiswrapper

— [ edit | raw ] migrated from node/850
Esta receta lo que pretende es mostrar cómo se puede configurar un adaptador inalámbrico de red USB mediante el programa ndiswrapper. Dicho programa se debe utilizar cuando el adaptador de red USB carece de drivers para GNU/Linux. En concreto lo he probado para Molinux, que a su vez se basa en Ubuntu, que a su vez se basa en Debian, que a su vez se basa en Dios.Por lo tanto creo que para esas cuatro distribuciones debería valer.

Asegurate de que el dispositivo no tiene drivers para GNU/Linux

Para saber si tu dispositivo tiene drivers para GNU/Linux deberás conocer su chipset. Una vez conocido el chipset comprueba si posee driver para GNU/Linux.

Si no posee drivers para GNU/Linux deberás utilizar ndiswrapper

Ndiswrapper es un sistema que nos va a permitir usar los drivers para windows “envolviendolos” para que puedan funcionar en un kernel linux.

¿Cómo se instala ndiswrapper?

teclea:
$  sudo apt-get install ndiswrapper-common
O si lo prefieres te puedes descargar el tar.gz desde su página web

Después decomprimes y haces un

$  make install

Descargar drivers de Windows

Deberás descargar los drivers que hay disponibles para windows. Normalmente deberán estar en la página web del fabricante.

Instalar drivers

Vete al directorio donde se encuentren los archivos con los drivers de windows y haz como root.
$  ndiswrapper -i nombre_del_driver.inf
La -i es de install. Lo que hará ndiswrapper es copiar el archivo .sys y crear una configuración para él. Lo podemos encontrar en /etc/ndiswrapper.

¿Cómo comprobar si el driver se ha instalado correctamente?

Teclea
$  ndiswrapper -l

Esto nos lista los drivers que tenemos instalados con ndiswrapper y si su hardware está presente o no.

Cargar el módulo de ndiswrapper

El siguiente paso es cargar el modulo de ndiswrapper de la siguiente manera:
$ modprobe ndiswrapper

Ultimo paso, creando el alias

Si todo ha funcionado bien, sólo nos resta hacer un
$ ndiswrapper -m

para crear el alias wlan0 ndiswrapper en /etc/modprobe.d/ndiswrapper. Esto hará que cada vez que usemos la interfaz wlan0, se cargue el módulo ndiswrapper. La interfaz se puede levantar normalmente con ifconfig wlan0 up.

¿Con qué programas puedo observar a qué redes me puedo conectar?

Bien, yo al menos conozco dos:

Network-Manager. Molinux lo traía instalado por defecto.
y otro es Wifi-Radar, para instalarlo:

$ sudo apt-get install wifi-radar

Esto ya es a gusto de consumidores libres.

Bibliografía

Receta principal en la que yo me base
Pagina de ndiswrapper
El chipset de mi adaptador

Agradecimientos

1) Gracias a mi hermano que me ayudó en su día a comprar este hoy ya “viejuno” y trasteado portátil el cual carece de Wifi.

2)Gracias al amigo que me regaló este adaptador USB inalámbrico sin driver para GNU/Linux.

3)Gracias a Crysol que me de la oportunidad de compartir conocimiento.

Desarrollo de aplicaciones para PSP-Slim y PSP-Fat con FW actuales

— [ edit | raw ] migrated from node/848
Dado que la PSP evoluciona, lo hace también la scene (normalmente más rápido :P), lo que provoca cambios en el pspsdk que debemos adoptar lo antes posible para no quedarnos obsoletos. En este caso vamos a hacer compatibles nuestros programas al modelo slim de PSP y a las PSP clásicas con firmwares actuales (versiones 3.XX y posteriores). Es indispensable leer y entender la receta “Aplicaciones portables entre PSP y GNU/Linux con SDL.

Introducción

Hasta ahora, cuando desarrollábamos software para nuestras portátiles, no teníamos ningún tipo de limitación: toda la máquina era para nosotros. Esto era debido a que las aplicaciones se podían ejecutar como kernel thread, es decir: con todos los privilegios. A partir del firmware 2.71 esto no es posible, y si nuestros ejecutables se configuran como kernel thread, obtendremos un bonito “No se pudo iniciar el juego” cuando intentemos ejecutarlo. Igualmente obtendremos un error si, aún siendo user thread, hacemos llamadas a objetos del espacio del kernel.

Configurar el programa como user thread

Como ya explicamos en anteriores recetas, el modo del hilo viene configurado por:

PSP_MODULE_INFO(“module_name”, 0, 1, 1);

Aquí viene el primer cambio, a partir de ahora lo configuraremos como:

PSP_MODULE_INFO(“module_name”, 0, 1, 0);

Ahora tenemos el siguiente problema: en este modo de ejecución, se asignan 64Kb de memoria para el heap de nuestras aplicaciones, por tanto se recomienda allocatar una buena cantidad de memoria al principio del programa, esto se consigue con:

PSP_HEAP_SIZE_KB(20480);

Con esto ya tenemos el código listo, ahora a compilar… ;)

Cambios en el Makefile

Afortunadamente no hay mucho que cambiar, sólo que no podemos genera un archivo elf sino que ahora hemos de crear un prx, además también hay que indicar que queremos crear un archivo para firmware 3.71 o superior, todo se consigue símplemente con:

BUILD_PRX = 1
PSP_FW_VERSION = 371
EXTRA_TARGETS = EBOOT.PBP
include $(PSPSDK)/lib/build.mak

En realidad basta con añadir las dos primeras lineas a nuestros makefiles… ;)

Apéndice A: adaptando aplicaciones con SDL

Ya hablamos en recetas anteriores sobre SDL, ahora vamos a hablar un poco de sus “tripas”. SDL tiene un componente llamado SDLmain que se incluye automáticamente en los programas que usan esta librería. Ese componente permite abstraer algunos detalles de las arquitecturas, por ejemplo, en las aplicaciones para PSP nos ahorra tener que definir nuestro PSP_MODULE_INFO porque SDLmain tiene su propia definición. Al igual que instala sus propios manejadores para el callback de terminación. Esto antes nos suponía una comodidad y una ventaja, sin embargo ahora, nos viene un poco mal debido a que SDLmain asume que nuestro programa se va a ejecutar como kernel thread y no es cierto.

Afortunadamente no hay que tocar mucho código, excepto incluír todo aquello que SDLmain hacía automáticamente:

  • PSP_MODULE_INFO

  • ExitThread y ExitCallback

Ahora debemos modificar los makefiles, dado que los CFLAGS y los LIBS (parámetros al linkador) los establecemos haciendo uso de sdl-config que tenemos en nuestro pspsdk, es decir:
PSPBIN = $(shell psp-config —psp-prefix)/bin
SDL_CONFIG = $PSPBIN/sdl-config

CFLAGS = $(shell $SDL_CONFIG) —cflags
LIBS = $(shell $SDL_CONFIG) —libs

Lo que hace que nuestras variables tomen estos valores:

CFLAGS = -I/usr/local/pspdev//psp/include/SDL -Dmain=SDL_main
LIBS = -L/usr/local/pspdev//psp/lib -lSDLmain -lSDL -lm -lGL -lpspvfpu -L/usr/local/pspdev//psp/sdk/lib -lpspdebug -lpspgu -lpspctrl -lpspge -lpspdisplay -lpsphprm -lpspsdk -lpsprtc -lpspaudio -lc -lpspuser -lpsputility -lpspkernel -lpspnet_inet

¿Estáis viendo el SDLmain? pues eso hay que quitarlo ;)
Quitaremos la invocación a sdl-config y estableceremos
dichas variables directamente:

CFLAGS = -I/usr/local/pspdev//psp/include/SDL
LIBS = -L/usr/local/pspdev//psp/lib -lSDL -lm -lGL -lpspvfpu -L/usr/local/pspdev//psp/sdk/lib -lpspdebug -lpspgu -lpspctrl -lpspge -lpspdisplay -lpsphprm -lpspsdk -lpsprtc -lpspaudio -lc -lpspuser -lpsputility -lpspkernel -lpspnet_inet

Y con eso y un bizcocho… está listo ;)

El efecto 2038...

— [ edit | raw ] migrated from node/846

Dell vende portátiles con Ubuntu Linux de serie... pero...

— [ edit | raw ] migrated from node/845

…más caros que si traen Windows? ¿por qué?

Mirad, el mismo modelo de portátil, con las mismas características… pero uno con hasefroch y el otro con Ubuntu Linux.

Ebay y el software libre...

— [ edit | raw ] migrated from node/844

Buscando unas cosillas me he tropezado con lo siguiente:
http://barrapunto.com/article.pl?sid=08/01/24/0949207&from=rss

Comparto la opinión del autor de la noticia. Se están perdiendo un gran número de cosas interesantes. Una pena que aún haya quien defienda lo indefendible….

ZeroC Ice: Persistencia de sirvientes con Freeze Evictor

— [ edit | raw ] migrated from node/842

Cómo integrar Freeze en aplicaciones existentes para obtener persistencia en los sirvientes.

Java como primer lenguaje: mala idea

— [ edit | raw ] migrated from node/843

Un par de lecturas muy interesantes (tanto para alumnos como para profesores) sobre los estudios en Computer Science. Es la opinión contrastada de dos profesores de la Universidad de Nueva York acerca del gran daño que hacen los nuevos planes de estudios a los titulados de hoy en día. Quizá lo más chocante (aunque no para todos) de sus conclusiones es el daño que, según ellos, causa Java como lenguaje para enseñar programación.

Incluye frases tan demoledoras como:

In short, today’s Java library cobbler is tomorrow’s pizza delivery man.

Configuración del chipset Intel 82801H con ALSA

— [ edit | raw ] migrated from node/841

Los nuevos portátiles ahtec vienen con tarjetas de sonido Intel con chipset Realtek, el problema es que aunque no te encuentras con ningún problema en la configuración de ALSA a la hora de la verdad no se reproduce ningún sonido.

(Py)GTK Tips 'n Tricks

— [ edit | raw ] migrated from node/839
Esta receta pretende recoger una colección sobre pequeños ‘trucos’ de GTK que siempre viene bien tener a mano.

GtkkTreeview

  • Desactivar los elementos seleccionados: parece intuitivo, pero la primera vez que lo buscas, te vuelves loco. Se debe hacer con un objeto GtkTreeSelection, usando el método unselect_all().
  • Ejemplo


    selection = view.get_selection()
    selection.unselect_all()

GtkIconView

  • Iconos de stock en IconView: resulta que el IconView es un widget un tanto especial, hasta la fecha. Es muy restrictivo en cuando al modelo que le puedes especificar y no permite usar cell_func para renderizar nuestros datos. Además, los iconos deben ser obligatoriamente pixbuf. Por tanto, si lo que tenemos es los nombres de stock de los iconos, debemos convertirlos a pixbuf antes de meterlos en el store del iconview. Para eso, podemos usar el método render_icon de gtk.Widget. Necesita como mínimo dos parámetros, el stock y el tamaño, y retorna un pixbuf listo para meter en el modelo.
  • Ejemplo


    iv = gtk.IconView()
    st = gtk.ListStore(str, gtk.gdk.Pixbuf)
    icon = iv.render_icon(“gtk-file”, gtk.ICON_SIZE_BUTTON)
    st.append([“un fichero”, icon])

GtkTreeStore, GtkListStore

  • Crear el modelo con tuplas o listas: quizá en este caso, lo obvio sería utilizar el tipo tuple o list, pero si lo haces, Gtk te responde con un bonito:

  • TypeError: could not get typecode from object
    

    Así, lo más sencillo es utilizar object de Python, que se acoge a lo que le des :-).

    Ejemplo


    t = gtk.ListStore(str, object)
    t.append([“nums”, (1,2,3,4,5,6,7,8,9,0)])

Nuevos widgets

  • PyGtk: Generalmente, hacer un nuevo widget en PyGtk es muy sencillo. Basta con crear una nueva clase que herede de otro widget y llamar al ‘inicializador’ adecuado, es decir, en nuestro init llamamos a Gtk.WidgetDelQueHeredamos.init(self) y listo.
  • Ejemplo


    class MyTreeStore(gtk.TreeStore):
    def init(self):
    gtk.TreeStore.init(self)

Tamaño de un widget

  • Obtener el tamaño de un widget y su posición: para conseguir esto, el widget ha de estar realized, es decir, ha de haberse llamado a las primitivas para construirlo antes de pintarlo. Si el widget es visible, esto ya ha ocurrido. Si no, es posible utilizar el método realize() para forzarlo. Una vez hecho esto, el objeto tiene su tamaño y sus coordenadas en el atributo allocation, que es un gdk.Rectangle.
  • Ejemplo

    # Tomado de http://faq.pygtk.org/index.py?req=show&file=faq05.009.htp
    win = gtk.Window()
    win.realize() # o win.show()
    rect = win.allocation

Gtk.Events

  • Mejorar el rendimiento: supongamos que tenemos un callback conectado al evento “motion_notify_event”, y que en ese callback dibujamos algo (por ejemplo, usando Cairo). Si el método tarda en dibujar, se encolarán un montón de eventos sin procesar, que se despacharán después de que el usuario haya empezado la sucesión de eventos. Esto provoca, por ejemplo, que al desplazar un elemento, este se mueva siempre por detrás de donde está el ratón, dando una desagradable sensación. Para evitar eso, podemos bloquear la emisión del evento, hasta que se pueda procesar.
  • Ejemplo

    # Callback del evento 'motion_notify_event'
    def on_motion_notify_event(self, widget, event):
        widget.handler_block_by_func(self.on_motion_notify_event)
    
        # Your code goes here
    
        def _unblock():
            widget.handler_unblock_by_func(self.on_motion_notify_event)
        gobject.idle_add(_unblock)
    
        return True

Cairo

  • Redibujar sólo lo necesario: puesto que el evento expose se produce muchas veces, es interesante poder repintar sólo las zonas necesarias. Para ello, usamos clip(), que crea una zona de dibujo, enmascarando los cambios producidos fuera de esta zona.
  • Ejemplo

    1. ctx es el contexto de dibujo de Cairo
      ctx.rectangle(event.area.x, event.area.y, event.area.width, event.area.height)
      ctx.clip()
  • Crear una ventana transparente: para poder probar esto, es necesario tener habilitado el compositing en el gestor de ventanas. El truco básicamente consiste en crear una ventana sin decoraciones, y con el colormap adecuado (uno que soporte canales alpha), y pintar sobre ella con cairo.
  • Ejemplo

    #!/usr/bin/env python
    # -*- mode: python; coding: utf-8 -*-
    
    import sys
    import gtk
    import cairo
    
    
    def expose_event(widget, event):
        cr = widget.window.cairo_create()
        size = widget.get_size()
    
        cr.set_operator(cairo.OPERATOR_SOURCE)
        cr.rectangle(1, 1, size[0]-2, size[1]-2)
    
        cr.set_source_rgba(1, 1, 1, .8)
        cr.stroke_preserve()
    
        cr.set_source_rgba(1, 1, 1, .2)
        cr.fill()
    
    
    def main():
    
        win = gtk.Window()
        win.set_decorated(False)
        win.set_app_paintable(True)
    
        win.connect('delete-event', gtk.main_quit)
        win.connect('expose-event', expose_event)
    
        screen = win.get_screen()
        colormap = screen.get_rgba_colormap()
        win.set_colormap(colormap)
    
        # avoid flick
        win.realize()
        win.window.set_back_pixmap(None, False)
    
        win.show_all()
        gtk.main()
    
    
    if __name__ == '__main__':
        try:
            main()
        except KeyboardInterrupt:
            pass

    Resultado

GtkPixbuf

  • Cargar gdk.Pixbuf desde un buffer: a veces es útil poder renderizar un pixbuf desde datos de un streaming, o desde un socket, en lugar de usar las fuentes comunes de imágenes de gtk (ficheros, stock, etc.). Para ello, es posible usar gdk.PixbufLoader, que nos permite escribir los datos poco a poco, y cuando están todos disponibles, obtener el Pixbuf.
  • Ejemplo


    pbl = gtk.gdk.PixbufLoader()
    pbl.write(data)
    pbl.close()
    pixbuf = pbl.get_pixbuf()

  • Cargar un gdk.Pixbuf desde stock: aunque esto ya lo hemos visto más arriba, formaba parte de otro ejemplo. Aquí lo vemos más claro. Tenemos un Stock ID, y queremos cargar un gdk.Pixbuf a partir de él. Es fácil si usamos gtk.Widget.render_icon(). Te retorna el Pixbuf directamente.
  • Ejemplo

    pixbuf = gtk.Invisible().render_icon(gtk.STOCK_ZOOM_100, gtk.ICON_SIZE_BUTTON)

PD: Se admiten nuevos Tips ’n Tricks :-D

Referencias

Sesión Técnica "Sun OpenSource Technologies" en la ESI

— [ edit | raw ] migrated from node/837
jornada Sun

En nombre de la Escuela Superior de Informática y de Sun Microsystems Ibérica, tengo el gusto de invitar a todos los incondicionales de CRySoL a una jornada técnica sobre sus tecnologías OpenSource (Software Libre para nosotros)

  • Lugar: Sala Polivalente (planta baja) de la Escuela Superior de Informática
  • Fecha: 23 de Enero de 2008
  • Programa:
    • (12:00-12:50) OpenSolaris
    • (12:50-13:50) OpenSPARC
    • (13:50-14:00) Presentación de los Programas formativos gratuitos de Sun