domingo, 25 de noviembre de 2018

LIBROS PARA DESCARGAR

Esta es una lista de links de libros  muy buenos que he encontrado en internet.

HTML & CSS design and build websites.pdf
Build your own web site the right way: HTML & CSS.pdf
CSS Animations and Transitions for modern web.pdf
PRO CSS3 Animation.pdf
OpenCV Computer Vision with Python.pdf
Mastering OpenCV with Practical Computer Vision Projects.pdf
OpenCV 3 computer vision application cookbook Robert Laganiere.pdf
Begining Arduino Michael McRoberts.pdf
Learning MySQL and Mariadb.pdf
Raspberry pi Beginners Guide.pdf 
Learning Raspberry Pi.pdf 
Raspberry Pi Cookbook 
Database Systems Fundamentals.pdf


Unos libros excelentes, recomendables para todo mundo:
Usted puede sanar su vida - Louise L. Hay
Adios ansiedad. David D. Burns
El lider que no tenía cargo - Robin Sharma
Biblia Reina Valera de 1960
Las emociones y los problemas de digestión.pdf
Guia para el cuidado de la espalda.pdf

Página para descargar más libros Gratis
https://www.pdfdrive.com/


LOS LIBROS SON LOS MEJORES MAESTROS QUE UNO PUEDA TENER.

Y SI SON IMPRESOS, MUCHO MEJOR (NO TE CANSAS LA VISTA) 😉

CONCURRENCIA, PARALELISMO, MULTI-PROCESO O MULTI-HILO


¿CUÁL ES LA DIFERENCIA? , ¿CUANDO USARLOS ?



Existe cierta confusión acerca de lo que es concurrencia y paralelismo. La confusión se acentúa cuando se empieza a hablar de multi-procesos y multi-hilos  y como estos interactúan con el o los  procesadores de una computadora. Para clarificar estos conceptos, a continuación se van a definir algunos:

Paralelismo se refiere a la facultad de una computadora multi-procesador para realizar varios procesos en forma simultánea. Por otro lado, la concurrencia se refiere a la facultad de una computadora con uno a más procesadores para realizar varias tareas en el mismo intervalo de tiempo ya sea de forma simultánea o aparentando paralelismo. 

Supongamos que tenemos una computadora con un solo procesador y queremos correr 2 procesos al mismo tiempo. Debido a que solo es un procesador, no le es posible correr 2 procesos en forma simultánea, pero aparenta hacerlo porque dedica tiempo a un proceso a uno y después pasa a dedicarle tiempo al otro proceso, esto lo hace tan rápido que para el usuario, los 2 procesos están corriendo al mismo tiempo, aunque no sea así (secuencial). Ahora, si tenemos una computadora con 2 procesadores y queremos correr 2 procesos de forma simultánea, esto es posible si se asigna un procesador a cada proceso, resultando en paralelismo verdadero. Ambas computadoras son multi-proceso porque corren los procesos en forma concurrente.

Por otro lado, un proceso se puede dividir en sub-procesos más pequeños llamados hilos o threads. Cada proceso consiste de al menos un hilo (llamémosle el hilo principal). Cuando un proceso es capaz de correr más de un hilo se dice que es multi-hilo o multi-thread. Esto podría ser un poco confuso porque a un proceso se le puede llamar también un hilo cuando tiene solo uno.

Retomando el ejemplo de las 2 computadoras, supongamos que se desarrolló una aplicación multi-hilo
(2 procesos con 2 ilos cada uno). La computadora con un solo procesador dedicaría tiempo para los 4 hilos, alternando recursos para cada uno, dando así la impresión de que se están corriendo en paralelo aunque no sea así. La computadora con 2 procesadores podría correr un proceso por procesador y cada procesador podría correr 2 hilos alternando tiempo para cada uno. Ambas computadoras son concurrentes, ambas son multi-hilo y multi proceso, pero solo la última corre 2 procesos en paralelo.

La principal razón para paralelizar un programa es para reducir su tiempo de ejecución. Hipotéticamente digamos que tenemos un programa secuencial, el cual queremos que corra más rápido sin modificar su código fuente. Para esto, se necesitaría aumentar la frecuencia del reloj del procesador y suministrar más energía, En la práctica esto no es viable, debido a que, al incrementar la energía de forma indefinida, también aumenta el calor producido en el circuito, pudiendo provocar un sobrecalentamiento que dañaría el procesador.

En la actualidad los fabricantes optan por incluir más procesadores en lugar de incrementar la velocidad de uno solo. Esto lleva a la necesidad de dividir en partes el programa, aunque en la gran mayoría, existen partes del programa que deben correr en serie forzosamente. Eugenie Amdhal postuló en 1960 la ley que lleva su nombre, donde indica que el total de ganancia de rendimiento de un programa, se limita por la porción del programa que puede ser paralelizada. De esto podemos deducir que, el hecho de contar con varios procesadores no significa necesariamente que un programa pueda correr más rápido.

Existen otros aspectos a considerar a la hora de paralelizar un programa. Los procesos tienen su sector de memoria asignada para cada uno, por lo que la comunicación ente procesos conlleva a un movimiento considerable de datos que podría reducir la velocidad de ejecución ganada. Los sub-procesos comparten el mismo sector en memoria, por lo que se deben sincronizar para acceder a los datos en memoria de forma intercalada en modo lectura o escritura para evitar la corrupción de datos (véase Mutex y semaforos).

Se aconseja usar paralelismo solo cuando se deben procesar grandes cantidades de datos, y se disponga de varios procesadores. Por su parte, se aconseja usar usar multi-hilo en un proceso donde los sub-procesos no traten con grandes cantidades de datos (procesos pequeños).Una aplicación de proceso multi-hilo podría ser: correr un sub-proceso tardado, mientras otro hilo se encarga de mantener la interfase gráfica respondiendo a la interacción de usuario sin bloquearse o congelarse.

Aun con esto, se debe cuantizar la ganancia o pérdida de velocidad, haciendo varias implementaciones del mismo programa y valorar si es viable paralelizar o hacer multi-hilo nuestra aplicación.

PYTHON VS C++





Hace unos años, cuando estudiaba en la carrera de mecatrónica en la universidad, tuve una clase que se llamó "Desarrollo de Interfaces de hombre-máquina", donde programé usando python 2.7. En esta clase usamos Tkinter, el toolkit para desarrollo de interfaces gráficas que viene por defecto.

Anteriormente había programado en C++ usando Qt 4, por lo que Tkinter me pareció de principio un tanto rudimentario. Aunque se pude construir interfaces útiles y hasta cierto punto, agradables a la vista  valiendome de varios trucos, era un lio usar "pack" y "grid" en combinación, algunas veces obtenía resultados inesperados en forma de "glitches" o una distribución erronea. Conforme iba necesitando desarrollar proyectos más complejos, me di cuenta de que  tkinter no cubría mis necesidades en cuanto a interfaces gráficas se refiere. Entonces continué usando Qt 4 y me olvidé de python.

Recientemente en mi trabajo, necesitaba desarrollar algunas aplicaciones para facilitarme ciertas tareas como: buscar un número de parte en varios archivos de texto, o buscar entre algunos cientos de archivos de Excel, todos los que tuvieran una hoja de calculo con un nombre especifico. No quería complicarme la vida con C++ o entrar en un conflicto legal debido a las nuevas condiciones de las licencias de Qt 5, entonces pensé que python podría ser una opción viable, debido a que su licencia es una combinación de BSD y GPL mucho más permisiva, incluso para propósitos comerciales.

Al principio, no me sentí tan cómodo por la experiencia mala que tuve con Tkinter, pero al final descubrí que existen otras alternativas para el desarrollo de interfaces gráficas. Una alternativa excelente para el desarrollo de interfaces gráficas es el toolkit llamado wxpython, el cual es un "wrapper" para poder usar los wxwidgets (C++) en python. Este toolkit me sorprendió, porque visualmente es muy parecido a Qt. Después de hacer algunos "pininos", vi que wxpython es bastante sencillo de usar. 

Posteriormente, comencé a buscar algunas librerías para desarrollar algunos programas que tenía en mente, y pensé - "chance y existe alguna librería en python que me pueda ser útil"-. No tuve que buscar mucho para encontrar lo que necesitaba. Descubrí que existen librerías para casi todo lo que se me pueda ocurrir: procesamiento de texto, creación y lectura de archivos de Excel o Libre Office, enviar correos electrónicos, crear PDFs, encriptado de archivos, procesamiento de imágenes, lectura y escritura a travéz de puertos USB y puertos seriales, manejo de bases de datos de Mysql o MariaDB, creación de gráficas matemáticas o estadísticas, cálculos con matrices similar a Matlab, procesos multi-ilo y multi-proceso, desarrollo de juegos, etc, etc.

Para hacer más corta la historia, pude desarrollar mis aplicaciones en tiempo record y convertir mis programas en archivos ejecutables con pyinstaller,  para que mis colegas puedan correrlos en otras máquinas sin tener que instalar python. De pronto se abrio un nuevo panorama, estaba emocionado por todo lo que podia hacer en python y no lo sabía. En C++ ubiese tardado una eternidad, debido a que tendría que crear la mayoría de las veces  las librerías que necesito, probarlas y debugearlas, o comprarlas. Ademas de que tendría que compilar mis programas cada vez que quisiera correrlos, lo cual ralentizaría el proceso de desarrollo. Con python los programas pueden correr sin necesidad de compilarlos.

En conclusión, creo que python es una herramienta de desarrollo bastante interesante, versátil y potente, que me ha ayudado para obtener resultados en mi trabajo de forma rápida  y  sin complicarme mucho. Por esto, en este momento python es mi lenguaje de programación preferido.
.



INTERFASE GRAFICA PARA PYINSTALLER

¿Qué es pyinstaller?


Pyinstaller es una librería y una herramienta de linea de comandos para convertir programas escritos en python a archivos ejecutables.

¿Por que nesecita una interface grafica?


Aunque la terminal o linea de comandos no me asusta para nada, es muy tedioso tener que teclear o navegar entre los directorios con la linea de comandos, ademas, si te equivocas en algun caracter debes revisar todo el chorro de nuevo (y vaya que si se genera un churro muy largo con esta cosa).

Este programa funciona en Windows y en Linux. Para correrlo nesecita las siguientes dependencias: pyinstaller y  wxpython.

 Este programa fué probado en Python 3.7 con wxpython phoenix.
Debido a que el programa es un tanto extenso, decidí pner el link de descarga al codigo fuente.




Para crear un executable a partir de un codigo escrito en python se hace lo siguiente:
  1. Click en el boton "Programa" para elegir el script.
  2. Opcional, elegir un icono (archivo .ico en windows): marcar la casilla "icono" y click en el boton de enseguida "elegir".
  3. Elegir la direccion donde se va a generar el ejecutable: click en la casilla "Fichero del ejecutable" y click en el boton de enseguida "elegir".
  4. Elegir "Un solo archivo", para generar un unico archivo ejecutable que contenga todo lo nesesario para correr (imagenes, videos, audios, iconos, etc). "Un solo directorio" es para generar un ejecutable dentro de un folder, donde deben estar todos los archivos nesesarios para correr el programa generado (imagenes, videos, audios, iconos, etc).
  5. Si tu script tiene interface grafica, dejatr marcado "GUI sin terminal" para que no muestre la terminal (CMD o linea de comandos en windows) cuando se ejecute. "GUI con terminal" para mostrar la linea de comandos al ejecutarse. "Aplicacion de terminal" es una aplicacion de linea de comandos.
  6. En la parte de abajo del programa dar click en "agregar" para incluir todos los archivos que quieres que formen parte de la aplicacion (Suponiendo que la opcion  "Un solo archivo" esté marcada ). Estos archivos deben ser llamados en el programa de la forma que se indica abajo en el codigo de ejemplo. Esto debido a que, el ejecutable generado descomprime todos los archivos agregados (imagenes, videos, audios, iconos, etc) en un folder temporal. (NOTA: el nombre del folder temporal generado inicia con "_MEI", por si quieres comprobar que si se generó)
En el ejemplo de aqui, se carga una imagen llamada "appicon.png".  Se usa "try" y except para poder debugear al momento de crear el script, pero en realidad para generar el ejecutable solo se nesecita la direccion del folder temporal.

import wx
import sys

try:
    bundle_dir = sys._MEIPASS + "\\" #<----  Averiguar nombre del folder temporal
except:
    bundle_dir = ''
    
class MyFrame(wx.Frame):
    def __init__(self, parent, title = ""):
        super(MyFrame, self).__init__(parent, title = title)
        self.panel = wx.Panel(self)
        #----------------------------------------------------
        #                   generar imagen
        #----------------------------------------------------
        theBitmap = wx.Bitmap(bundle_dir + "appicon.png")
        #---------------------------------------------------
        self.bitmap = wx.StaticBitmap(self, bitmap=theBitmap) #<----  Usar el bitmap

if __name__ == "__main__":
    app = wx.App(False)
    frame = MyFrame(None, "Main Frame")
    frame.Show()
    app.MainLoop()

EL resaltado de la sintaxis de python, se hiso usando pygments (usando python XD) para generar el codigo HTML.