3 de marzo de 2019

GIMP: Trabajando con Python en GIMP

Vamos a trabajar con python desde gimp, para esto vamos a abrir algun archivo XCF con imagenes. Luego abrir la consola en el menu Filtros --> Python Fu, como se ve a continuación:

Obtener la lista de Archivos Abiertos en GIMP:

  • Esta comando entrega una lista con todos los archivos (que se muestran en pestañas) abiertos en la pantalla de GIMP. El primer archivo en la lista corresponde al ultimo archivo abierto.
>>> gimp.image_list()
[<gimp.Image 'Los Grandes Rios.xcf'>, <gimp.Image 'Epoca Clasica.xcf'>, <gimp.Image 'Caratula.xcf'>, <gimp.Image 'Dibujo Para Editar.xcf'>]
>>> gimp.image_list()[0]
<gimp.Image 'Los Grandes Rios.xcf'>

Y podemos guardarlo en una variable:
>>> ListaDeArchivosAbiertos = gimp.image_list()
>>> PrimerArchivo = ListaDeArchivosAbiertos[0]

Obtener la lista de Capas de un archivo XCF de GIMP: 

>>> PrimerArchivo = gimp.image_list()[0]
>>> PrimerArchivo.layers
[<gimp.Layer 'Capa pegada'>, <gimp.Layer 'imagen01'>, <gimp.Layer 'fondo blanco'>]

Modificar una Capa (Layer): 

Vamos a trabajar con 'image01', entonces hacemos:
>>> layer1 = PrimerArchivo.layers[1]
Con dir() podemos ver todos los métodos y propiedades que tiene layers
>>> dir(layer1)
['ID', '__class__', '__cmp__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'add_alpha', 'add_mask', 'apply_mask', 'attach_new_parasite', 'bpp', 'children', 'copy', 'create_mask', 'edit_mask', 'fill', 'flush', 'free_shadow', 'from_id', 'get_pixel', 'get_pixel_rgn', 'get_tile', 'get_tile2', 'has_alpha', 'height', 'image', 'is_floating_sel', 'is_gray', 'is_grey', 'is_indexed', 'is_layer_mask', 'is_rgb', 'linked', 'lock_alpha', 'mask', 'mask_bounds', 'mask_intersect', 'merge_shadow', 'mode', 'name', 'offset', 'offsets', 'opacity', 'parasite_attach', 'parasite_detach', 'parasite_find', 'parasite_list', 'parent', 'preserve_trans', 'remove_mask', 'resize', 'resize_to_image_size', 'scale', 'set_offsets', 'set_pixel', 'show_mask', 'tattoo', 'transform_2d', 'transform_2d_default', 'transform_flip', 'transform_flip_default', 'transform_flip_simple', 'transform_matrix', 'transform_matrix_default', 'transform_perspective', 'transform_perspective_default', 'transform_rotate', 'transform_rotate_default', 'transform_rotate_simple', 'transform_scale', 'transform_scale_default', 'transform_shear', 'transform_shear_default', 'translate', 'type', 'type_with_alpha', 'update', 'visible', 'width']
>>> layer1.width
1111
Para modificar el ancho y alto de la capa y colocarlo a la misma que la imagen:
>>> layer1.resize_to_image_size()
y para todas las capas seria:
>>> for n in range(len(PrimerArchivo.layers)):
...     PrimerArchivo.layers[n].resize_to_image_size()

Canal Alpha o Canal de Transparencia: 

Vamos a trabajar con el canal alpha de una Capa (Layer), de tal forma que dejamos intactos las otras capas:
Verificar si la Capa ya tiene un canal Alpha:
  • >>> layer1.has_alpha
  • False
Como no tiene un canal Alpha. Vamos a agregarle un canal Alpha:
  • >>> layer1.add_alpha()
ya esta agregado el canal de transparencia, si recortas una porción de la imagen, vas ha ver la transparencia que queda.
Vamos a borrar el canal Alpha y veamos que sucede:
  • >>> pdb.gimp_layer_flatten(layer1)
El canal Alpha o de Transparencia se ha eliminado, solo de la capa l1 y las zonas transparentes se han coloreado de blanco, del color de fondo (background). Si cambias el color de fondo y eliminas la capa de transparencia, las zonas transparentes se colorearan de este nuevo color. Y para eliminar o borrar el canal Alpha de todas las capas y para que la imagen final de la capa sea del mismo tamaño del lienzo principal, seria:
>>> for n in range(len(PrimerArchivo.layers)):
...     PrimerArchivo.layers[n].resize_to_image_size()
...     pdb.gimp_layer_flatten(PrimerArchivo.layers[n])

Aplanar toda la Imagen: 

Todas las capas visibles son combinadas en una sola, todas las demás capas se borran, también se borra el canal alfa (canal de transparencia), al final solo queda la capa combinada.
>>> pdb.gimp_image_flatten(PrimerArchivo)
<gimp.Layer '3'>
También se puede utilizar:
>>> PrimerArchivo.flatten()
<gimp.Layer '3'>

Crear una Selección Poligonal en la Imagen:

Para crear una selección en la imagen con forma de polígono se usa:

  • pdb.gimp_image_select_polygon (ImagenOperación, CantidadPuntos, ListaPuntos)

Donde:
Imagen: Es el ID de la Imagen. En nuestro ejemplo PrimerArchivo
Operación: El contenido de la región poligonal se puede agregar, sustraer o reemplazar a la máscara de la selección anterior. Las operaciones son:
         GIMP_CHANNEL_OP_ADD, Añadir a la selección actual.
         GIMP_CHANNEL_OP_SUBTRACT, Restar de la selección actual
         GIMP_CHANNEL_OP_REPLACE, Reemplazar la selección actual
         GIMP_CHANNEL_OP_INTERSECT, Intersección con la selección actual.


CantidadPuntos: Es un numero que indica cuantos puntos van ha formar el polígono, no son pares ordenados, son puntos individuales.
ListaPuntos: Es la lista de puntos [x1, y1, x2, y2, ... xn, yn], que indica las coordenadas que forman el polígono.
>>> ListaPuntos = [200, 300, 260, 250, 320, 300, 280, 350, 240, 350]
>>> pdb.gimp_image_select_polygon(PrimerArchivo, CHANNEL_OP_REPLACE, len(ListaPuntos), ListaPuntos)


1 de marzo de 2019

PYTHON: Funciones Útiles de Python


Leer el Código Numérico Completo de cualquier Tecla

Para leer una tecla presionada de forma inmediata, hay que hacer un muestreo en bucle abierto, permanente y activamente sobre el estado del dispositivo de entrada stdin (select, timeout=0). Tan pronto como se detecte que hay un carácter en stdin (select ⇄ rlist ⇄ stdin) hay que leerlos (os.read ← sys.stdin.fileno) todos (while → if → select), hasta detectar que no hay ninguno (elif → break). Hay que anotar que este código solo funciona en Linux.
  • El método fileno() devuelve el descriptor de un archivo (un numero entero), en este caso el descriptor de stdin, para solicitar operaciones de E/S del sistema operativo. En cualquier otro caso generará un error.
  • select.select( rlist , wlist , xlist [ , timeout ] ) 
  • select se utiliza para hacer una llamada múltiple de E/S, Con esta llamada podemos saber si un dispositivo E/S esta listo para una lectura o escritura. Aquí hay que diferenciar dos situaciones de este proceso, (1) El Estado Actual de los dispositivos E/S y (2) Estar listos para una lectura o escritura del dispositivo E/S. Sus parámetros son:
    • rlist es la lista de dispositivos a los cuales se hace un llamada de entrada. Con esta llamada podemos saber si el dispositivo esta listo para leer lo que contiene su buffer. Si el dispositivo es stdin, indica que hay un carácter en el buffer esperando su lectura.
    • wlist es la lista de dispositivos a los cuales se hace un llamada de salida. Con esta llamada podemos saber si el dispositivo esta lista para poder rescribir en ella.
    • xlist es la lista de dispositivos que esperan una "condición excepcional"
    • timeout es el tiempo de espera. Si timeout > 0.0, esperar timeout hasta obtener el resultado de la llamada, este resultado debe ser (2): ' Estar listos para una lectura o escritura'. Si timeout expira, salir inmediatamente y solo devuelve (1): 'El estado actual'.
    • Si timeout = 0.0, salir inmediatamente sin esperar que el resultado de la llamada sea (2), es decir que devuelva inmediatamente lo que encuentre, aquí (1) y (2) son lo mismo.
  • keycode almacena el numero de la tecla como '05A42634'h, si la tecla tiene mas de un número, será: keycode = N3 * 2¹⁶ + N2 * 2⁸ + N1.
def GetKeyBoard(): keycode = 0 DefaultConfig = termios.tcgetattr(sys.stdin) try: tty.setcbreak(sys.stdin.fileno()) while True: if select.select([sys.stdin, ], [], [], 0.0)[0]: #keycode <<= 8 #keycode |= ord(os.read(sys.stdin.fileno(), 1)) keycode = (keycode << 8) | ord(os.read(sys.stdin.fileno(), 1)) elif keycode != 0: break finally: termios.tcsetattr(sys.stdin, termios.TCSADRAIN, DefaultConfig) return(keycode)



Sumar un Numero Entero de Meses a una Fecha Especifica

          Estaba buscando una función que sume una cantidad 'n' de meses a una fecha. Como no quería reinventar la pólvora me puse a buscar un buen código de python por Internet, ¡busqué!... y ¡busqué! pero no lo encontré, o al menos un código que satisfaga mis expectativas: sencillez y rapidez. Bueno tampoco hice una búsqueda muy exhaustiva, seguro que hay buen código desarrollado por ahí, pero ya no quise buscar mas, así que hice mi propia función. Abrí una pagina de Libreoffice Calc y escribí todas las combinaciones resultantes de sumar 'Meses' a una fecha y fui encontrando las ecuaciones para generar estos resultados, una vez que verifique que funcionaban para todos los casos, lo simplifiqué y lo reescribí en código python y bueno aquí esta. Por cualquier caso, todos estos código están con licencia GPL V3.0.  (https://www.gnu.org/licenses/gpl-3.0.en.html)

def AgregarMes(FechaIni, Meses): NuevoYear = FechaIni.year + int((FechaIni.month + Meses - 1)/12) NuevoMes = (FechaIni.month + Meses) % 12 return(datetime.date(NuevoYear, NuevoMes if NuevoMes != 0 else 12, FechaIni.day))

2 de junio de 2017

Crear Puerto Serial Virtual entre Ubuntu y VirtualBox (con WindowsXP)

Necesitaba realizar ingeniería inversa a un programa de un fabricante de Maquinaria Pesada (Heavy Machine), que como la mayoría de programas industriales, solo funcionaba en Windows, ademas solo se comunicaba por puerto serial, si no detectaba la Maquina no se ejecutaba y salia.

Como en ninguna de mis computadoras tengo Windows, solo uso GNU/Linux, decidí crear una maquina virtual con VirtualBox e instalar Windows XP, me venia bien, porque funciona rápido y es donde mejor funcionan el programa a ingeversar.

Bien aquí tengo la maquina virtual con Windows XP corriendo en Ubuntu, con sus respectivos menus desplegados:
Con la maquina virtual Windows XP apagada, debemos de configurar en la Opción "Puerto Serie" lo siguiente:
Entonces al ejecutar la Maquina Virtual, se creara una tubería en '/tmp/ttyXPM01', si listamos esta tubería se vera así:
Para convertir la tuberia '/tmp/ttyXPM01', en un puerto serial debemos de usar SOCAT, es un paquete que viene predeterminado en ubuntu.
Debemos utilizar el siguiente comando:
usuario@laboratorio:~$ sudo socat -d -d -d -v -x UNIX-CONNECT:/tmp/ttyXPM01 PTY, link=/dev/ttyVSP1, mode=777, unlink-close, raw, echo=0
De tal forma que, si listamos los dispositivos tty veremos que se ha creado el puerto serial '/dev/ttyVSP1', mientras SOCAT se mantenga funcionando existirá este puerto, y si sales de SOCAT desaparecerá:
Ahora ya tenemos creado un puerto serial 'COM1' en Windows XP que se conecta a otro puerto serial '/dev/ttyVSP1' en GNU\Linux.
Esto quiere decir que cualquier programa en Windows que se conecte al COM1, podrá comunicarse con cualquier programa en Linux, que este conectado a '/dev/ttyVSP1'.
Ahora desde GNU/Linux, podemos abrir un programa terminal para puerto serial, como el minicom o el cutecom y conectarnos la puerto '/dev/ttyVSP1' :
Ahora si podemos conversar con el programa en Windows e implementar un programa que le simule estar conectado a la Maquina.
Podemos ver las Tramas que envía a través del puerto serial y mediante un programa, por ejemplo en python interpretar los datos.

Instalando los Drivers de Impresora Multifuncional EPSON L355

Vamos a instalar una impresora multifuncional (Imprime, copia y scanea) wifi EPSON L355. Cuando instalaba hace meses atrás había otra forma de instalación, con otro tipo de archivos ahora veo, entrando a la página página web de EPSON que ha cambiado un poco.


  1. Primero vamos a descargar los controladores desde la misma página de Epson:
Escribimos en “nombre del producto”: L355, y escogemos como “Sistema Operativo”: Linux, presionamos buscar:


01 Buscar Driver.jpg


Y nos mostrará la siguiente lista:
02 Lista de Resultados.jpg


El Primer Botón de Descarga lleva al controlador de la impresora L355, el Segundo Botón de Descarga lleva a un instalador de programas utilitarios para la impresora y el Tercer Botón de Descarga, lleva al controlador completo del escáner, con su manual PDF de instalación en ingles.


Descargar el Controlador de la Impresora EPSON L355

Escogiendo el Primer Botón de Descarga, nos lleva al siguiente menú:


04 Descagar Driver Impresora L355.jpg

Si tienes una computadora de 32 bits debes escoger:
epson-inkjet-printer-201207w_1.0.0-1lsb3.2_i386.deb

Si tienes una computadora de 64 bits debes escoger:
epson-inkjet-printer-201207w_1.0.0-1lsb3.2_amd64.deb


Descargando programa utilitario para la impresora

Escogiendo el Segundo Botón de Descarga, nos lleva al siguiente menú:

04 Descagar Driver Impresora L355 01.jpg

Si tienes una computadora de 32 bits debes escoger:
epson-printer-utility_1.0.0-1lsb3.2_i386.deb

Si tienes una computadora de 64 bits debes escoger:
epson-printer-utility_1.0.0-1lsb3.2_amd64.de


Descargar el controlador del escáner Epson L355

Escogiendo el Tercer Botón de Descarga nos lleva al siguiente menú:

03 Descagar Driver Scan 03.jpg


Ingresar a “Package Download Page” para descargar el controlador del escáner.


Aparecerá el siguiente menú:


03 Descagar Driver Scan 01.jpg

Escoger en [deb] el controlador (para Ubuntu) según si tenemos una PC de 32bits o de 64bits.
Luego descargar el manual pdf de instalación, para alguna referencia adicional.

Al final debes de tener descargado los siguientes archivos, como mi computadora es de 64bits los archivos serán:

Lista de Archivos Descargados.jpg


Primero vamos a instalar los archivos del SCANER, debemos descomprimir el archivo iscan-bundle-1.0.0.x64.deb.tar.gz, como muestra la imagen siguiente:



observamos que aparecen tres archivos .deb:



Ahora instalaremos todos los archivos del SCANER, por consola puedes utilizar "
./install.sh" o directamente haciendo click en los archivos .deb en el siguiente orden:

  iscan-data_1.36.0-1_all.deb
  iscan_2.30.1-1~usb0.1.ltdl7_amd64.deb
  iscan-network-nt_1.1.1-1_amd64.deb


o por consola utilizando "./install.sh" :


Al final solo nos queda instalar los archivos .deb de la impresora en cualquier orden:

epson-inkjet-printer-201207w_1.0.0-1lsb3.2_amd64.deb
epson-printer-utility_1.0.0-1lsb3.2_amd64.deb

Si nos pide instalar paquetes adicionales, hay que aceptar y continuar



Ahora tendremos instalado nuestra impresora Epson L355, si configuramos nuestra impresora para que se conecta al Wi-Fi de nuestro router podremos utilizarla en forma remota e imprimir o scanear desde cualquier lugar.

Para escanear les recomiendo el XSane.

4 de enero de 2016

Tarjeta Wi-Fi Qualcomm Atheros. Descargando Controlador, Firmware y demás

Para instalar la Tarjeta Wi-Fi:
Qualcomm Atheros Device [168c:0041] (rev 20) - Subsystem: Lenovo Device [17aa:3545]
Necesitamos descargar el Controlador y el Firmware desde dos sitios que son de confianza:

Para descargar el Controlador, (el backport) usaremos:

The Linux Kernel Archives, un sitio de la “Linux Kernel Organization, Inc”, que tiene el apoyo de patrocinadores como Google, RedHat, LinuxFoundation, etc. Aquí encuentras todas las versiones de backport para esta tarjeta, organizadas por fecha de lanzamiento.

Para descargar el Firmware:

GitHub, una plataforma para desarrollo colaborativo de proyectos de software, utilizando el sistema de control de versiones Git. Aquí encontraremos dos firmware para nuestra tarjeta Atheros; el de Kvalos y el de Atondwal.

Aqui la Guia para Descargar el Controlador, Firmware y programas que faltan:

EL CONTROLADOR O BACKPORT: Yo probé con varios backports; de setiembre (backports-20150903.tar.gz), noviembre (backports-20151120.tar.gz), diciembre (backports-20151203.tar.gz) y otro, todos funcionaron, excepto el de diciembre.
DescargandoBackport 20151120.jpg









Por eso regresé al backport de noviembre (backports-20151120.tar.gz). Para descargar el backport de noviembre hacer click con el boton derecho del mouse y escoger "Guardar enlace como". Si deseas usar la consola usar el siguiente comando:
wget https://www.kernel.org/pub/linux/kernel/projects/backports/2015/11/20/backports-20151120.tar.gz
EL FIRMWARE: Como expliqué, en GitHub existen 2 firmware:
kvalo ath10k firmware.jpg
y, como se ve en la imagen anterior, tenemos dos formas de descargar el firmware; Clonar con git, y descargar el archivo zip:

Si quieren descargar el firmware clonandolo con git, usar el siguiente comando:
git clone https://github.com/kvalo/ath10k-firmware.git
y se creará una copia igual en el directorio en el que ejecutamos el comando.
kvalo git clone ath10k-firmware.jpg
Si desean descargar el firmware en formato zip para después descomprimirlo, hacer click en el botón “Download Zip” y listo, pero si le gusta la consola, pueden utilizar el siguiente comando:
wget https://github.com/kvalo/ath10k-firmware/archive/master.zip
atondwal ath10k-firmware.jpg
Si quieren descargar el firmware clonandolo con git, usar el siguiente comando:
git clone https://github.com/atondwal/ath10k-firmware.git
y se creará una copia igual en el directorio en el que ejecutamos el comando.
atondwal ath10k-firmware git clone.jpg
Si desean descargar el firmware en formato zip para después descomprimirlo, hacer click en el botón “Download Zip” y por consola, utilizar el siguiente comando:
wget https://github.com/atondwal/ath10k-firmware/archive/master.zip
Con todos estos archivos se puede iniciar la instalación del controlador.

17 de diciembre de 2015

Un Detalle Importante Cuando se Instalan Cosas

Por fin encontré la solución para mi tarjeta Qualcomm Atheros,  pero antes hablaré de un detalle importante, cuando instale el driver desde mi carpeta HOME, todo funcionó bien tanto en ubuntu como en kubuntu, sin embargo cuando reinstale todo mi sistema (ubuntu otra vez y kubuntu luego) había movido la carpeta del controlador a otra partición, y cuando volví a instalar el controlador desde esta partición diferente a HOME, apareció un error, al principio no entendía porque era el error, pensaba que había algún problema en el SO, o faltaba instalar algo, algún otro programa quizás, pero después me di cuenta que, el problema aparecía porque lo estaba ejecutando desde una partición diferente y eso me hizo recordar problemas similares en el pasado.

El error que aparecía es el siguiente:

user@server:/media/ALMACEN/QualcommAtheros/backports-20150903$
makemake[5]: 'conf' is up to date.
boolean symbol HWMON tested for 'm'? test forced to 'n'
boolean symbol HWMON tested for 'm'? test forced to 'n'
#
# configuration written to .config
#
Building backport-include/backport/autoconf.h ... done.
arch/x86/Makefile:138: CONFIG_X86_X32 enabled but no binutils support
Makefile:669: Cannot use CONFIG_CC_STACKPROTECTOR_STRONG: -fstack-protector-strong not supported by compiler
make[4]: *** No rule to make target 'de'.  Alto.
Makefile.build:6: recipe for target 'modules' failed
make[3]: *** [modules] Error 2
Makefile.real:88: recipe for target 'modules' failed
make[2]: *** [modules] Error 2
Makefile:40: recipe for target 'modules' failed
make[1]: *** [modules] Error 2
Makefile:30: recipe for target 'default' failed
make: *** [default] Error 2

ESTE ERROR SE PRESENTA POR QUE EJECUTAMOS LA INSTALACION DESDE UNA PARTICION DIFERENTE AL DE HOME/USUARIO.
SI EJECUTAMOS MAKE DESDE HOME/USUARIO NO SE PRESENTA ESTE ERROR.

Cuando copie toda la carpeta del controlador "/backports-20150903" a mi carpeta home e instale desde ahí, todo funcionó perfectamente. Apuntó esto porque es muy importante, muchas veces aparecen problemas qué en realidad no son problemas.




13 de diciembre de 2015

Datos de mi Tarjeta Wi-Fi Qualcomm Atheros

Para poder ver los datos de mi tarjeta Wi-Fi utilizo el siguiente comando:
sudo lshw
 obteniendo los siguientes datos:

        *-pci:3
             descripción: PCI bridge
             producto: Wildcat Point - LP PCI Express Root Port #4
             fabricante: Intel Corporation
             id físico: 1c.3
             información del bus: pci@0000:00:1c.3
             versión: e3
             anchura: 32 bits
             reloj: 33MHz
             capacidades: pci pciexpress msi pm normal_decode bus_master cap_list
             configuración: driver=pcieport
             recursos: irq:45 memoria:c3000000-c31fffff
         .......
           *-network NO RECLAMADO (Wi-Fi)
                descripción: Network controller
                producto: Qualcomm Atheros
                fabricante: Qualcomm Atheros
                id físico: 0
                información del bus: pci@0000:09:00.0
                versión: 20
                anchura: 64 bits
                reloj: 33MHz
                capacidades: pm msi pciexpress bus_master cap_list
                configuración: latency=0
                recursos: memoria:c3000000-c31fffff

Se puede ver que en: "configuración: latency=0" no figura el "driver=Nombre"
como no tiene instalado el driver, la tarjeta wifi no existe para ubuntu.

Con el comando:

lspci -vvnn

se muestra lo siguiente:

09:00.0 Network controller [0280]: Qualcomm Atheros Device [168c:0041] (rev 20)
Subsystem: Lenovo Device [17aa:3545]
Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop-
        ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort-
        <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0, Cache Line Size: 64 bytes
Interrupt: pin A routed to IRQ 10
Region 0: Memory at c3000000 (64-bit, non-prefetchable) [size=2M]
        Capabilities: <access denied>

"Wildcat Point" es el nombre de los nuevos chipset Intel Serie 9, que soporta microprocesadores de 4ta y 5ta generacion.




GIMP: Trabajando con Python en GIMP

Vamos a trabajar con python desde gimp, para esto vamos a abrir algun archivo XCF con imagenes. Luego abrir la consola en el menu Filtros -...