lunes, 19 de junio de 2017

Migrando a Wordpress

Hola! Estoy migrando las cosillas que tengo por ahí dispersas a un servidor de DigitalOcean, el blog lo seguiré allí tambien en wordpress:

Link al espacion nuevo: uborzz.es

martes, 16 de mayo de 2017

Bot de Telegram!

Empecé a crear un bot de telegram más bien por curiosidad ya que su utilidad no creo que le valga a mucha gente XD. En esta entrada anoto algunas pautas y links para la creación de bots usando python.



El bot en principio permite utilizar los comandos /cs y /hots para enviar un mensaje con mentions (x.ej: @pepito) al grupo en que se encuentra. La finalidad es que los usuarios mencionados reciban una notificación aunque tengan el grupo silenciado. En mi grupo de colegas se suelen hacer estas menciones para convocar partida a algún juego, de ahí que se hayan implementado estas llamadas directamente con mensaje para 2 videojuegos diferentes.

El bot permite a los usuarios unirse o salirse de las menciones usando, por ejemplo: /joincs y /leavecs. Funciona incluso con usuarios que NO tienen activo un @alias para las menciones.

Se utiliza Mongo para guardar los grupos de usuarios que quieren ser mencionados. Las colecciones creadas en la base de datos van referidas al grupo de telegram en el que reside el bot, y su creación es automática cuando se une algún usuario.

Me gustaría implementar la creación de calls con /nombre personalizado por parte de los usuarios de cada grupo de telegram, así como temporizar las mentions, elegir los mensajes y más cositas. Pero esto será dentro de unas semanas.

Por el momento, anoto algunas pautas para la creación de bots:

Creación

Conviene empezar por crear un nuevo bot en telegram:
https://core.telegram.org/bots#botfather

La forma de interactuar con telegram será a través de api y, en la creación del bot en este paso, habremos recibido un token que tendremos que usar en nuestras peticiones.

Extra (apis)

Para saber los métodos implementados y sus parámetros, tendremos que consultar la documentación de la api oficial de bots de telegram (enlace al final del párrafo). Esto nos sirve para saber cómo hay que preguntarle las cosas a la api. Hay buenos ejemplos de cantidad de llamadas:
https://core.telegram.org/bots/api

Una forma rápida de probar estas llamadas es utilizar directamente el navegador, o una aplicación como Postman, que facilita mucho la construcción de llamadas "a mano" al desglosar los parámetros, vemos un ejemplo en Postman de llamada a la api de steam, donde arriba tenemos la URL, seguida por los parámetros que la forman, claramente separados uno a uno por clave y valor, y abajo el resultado devuelto en formato Json.



Python, libs y apis

Para nuestra aplicación he utilizado 2 apis diferentes.

La api oficial la utilizamos a través de esta librería de python (python-telegram-bot), esta librería tiene algunas funciones que nos facilitarán interactuar con la api y gracias a ella será sencillo implementar nuestro programa, interesa ver los ejemplos del enlace:
https://github.com/python-telegram-bot/python-telegram-bot

Podemos hacer gran catidad de cosas con ésta librería que utiliza por defecto la api oficial y seguramente resulta suficiente para muchas aplicaciones.

Sin embargo, la api oficial tiene ciertas limitaciones y estas son cubiertas por otra api no-oficial, que puede hacer prácticamente todo lo que puede hacer un usuario real que interactúa directamente con el chat. En nuestro caso, lo que NO puede hacer la api oficial es referenciar un nombre/texto a un determinado usuario, crear un link. Es posible llamar a usuarios que tienen un username escribiendo simplemente @alias, pero cuando éstos no tienen un alias elegido, no podemos mencionarlos mediante la api oficial, mientras que utilizando telegram como usuarios, sabemos que sí podemos mencionarlos ya que se genera un enlace al usuario al escribir su nombre o el nombre con el que tenemos guardado el contacto. La API de pwrtelegram permite hacer esto y mucho más.

La api NO-oficial:
https://pwrtelegram.xyz

Por no rehacer, he mantenido llamadas a ambas, de hecho, a la API no-oficial solamente la llamamos para enviar mensajes que contengan "mentions" a usuarios, y se está usando totalmente a pelo, es decir, se construye la url concatenando strings y se hace get usando la librería requests.

Ejemplo

(habrá que introducir el token nuestro que nos hayan dado al crear el bot!)
Ejemplo para el siguiente método que escribe el mensaje 'HEY YOU' con link al usuario con ID 101374607 en el chat con ID 98123871 (estos datos de IDs se deben haber obtenido previamente, si has echado un ojo a los ejemplos de la librería python-telegram-bit, seguro que sabes como obtener estos datos!) :


Url construida del ejemplo (método sendmessage cuyos parámetros son: char_id, text, parse_mode y mtproto):
https://api.pwrtelegram.xyz/bot39518XXXX:xxxxXXxAQUITUTOKENXxxxXxXxxxxXxxxxx/sendmessage?chat_id=98123871&text=<a href="mention:101374607">HEY YOU</a>&parse_mode=HTML&mtproto=true

Tras ejecutarse el bot mandará el mensaje al chat, el mensaje (HEY YOU) se podrá clickar y accederíamos al perfil del usuario con el ID de la mention (recibiría notificación con éste mensaje).



Recursos

La documentación de la api oficial resulta algo liosa, y he encontrado mucho más útil los consejos y publicaciones del canal de telegram de pwrtelegram directamente. Buscad el canal en telegram como @pwrtelegram y, por otro lado, un canal para uso de los bots de telegram con python:
https://t.me/pythontelegrambotgroup

Estos 2 canales, junto con la información de la librería python-telegram-bot, han resultado serme de mucha utilidad.


Mi bot

Para acabar...
En telegram se puede encontrar mi bot buscando @uborzbot
Dejo link al código: Link a git!

jueves, 11 de mayo de 2017

Imprimiendo objetos de videojuegos

 

Intro

 

Vamos a tratar de extraer modelos de items o personajes de videojuegos, convertirlos a un formato de objeto imprimible y crearlos en la realidad.


Antes de usar el blog como cajón sin fondo, solía hacer documentos de texto con anotaciones sobre las cosas, lo que pasa que siempre se acaban perdiendo :(. Copypasteo y completo las notas sobre los pasos a seguir y los enlaces. Tengo que decir que ando desconectado de éste mundillo de hace un buen puñado de meses y seguro que ahora mismo tendremos herramientas mejores a las mencionadas. En cualquier caso, lo guardo por si pudiese resultar de interés.

 El proceso se puede separar en 2 partes.
  • Extracción del fichero del videojuego: Puede ser necesario extraer y decompilar contenido del videojuego.
  • Conversión del archivo a cuerpo sólido. 
Nota: En mi caso, he creado una máscara de un personaje de Dota 2. Hay que tener en cuenta que la extracción/decompilación es un proceso para un determinado juego o motor concreto. Aunque recojo los pasos seguidos para extraer y decompilar, ésto valdría solamente para juegos de source y seguramente no funcione para Dota tras las actualizaciones al motor gráfico.

 

Extracción (Específica para juego/motor)

 

Ésta puede ser la parte más compleja, porque las herramientas a utilizar dependerán del juego, afortunadamente hay tutoriales para importar modelos de muchísimos juegos. Mis pruebas las he realizado con Dota 2, para ello he seguido la primera parte de ésta guía, no es necesario seguirla entera porque está obsoleta, para el caso de Dota 2 los formatos de los ficheros han cambiado el último año por causa de la actualización del motor gráfico.

Vamos a extraer en primer lugar los archivos .vpk (Valve PAK) para ello se utiliza GFCScape. Tras bajarlo e instalarlo, lo abrimos y a través de File -> Open, buscamos en "nuestra instalación de Steam\steamapps\common\dota 2 beta\game\dota" el fichero “pak01_dir.vpk” y lo abrimos, tras ello, aparecerá un árbol en el menú de la izquierda, click derecho en "root" y pulsamos Extract, elegimos un directorio y comenzamos, llevará unos minutos.


Descompilación (Específica)

 

Con el paso anterior obtendríamos archivos de 3 tipos diferentes en la carpeta de "models", los que nos interesan a nosotros son los .MDL, que tedremos que descompilarlos a un formato que nuestros software de diseño pueda interpretar. Para ello utilizaremos StudioCompiler, que necesita de un SDK para obtener los ficheros SMD, usaremos el de Alien Swarm, en Steam, Library -> Tools, podemos encontrarlo.



* En la página de Cannonfodder podemos encontrar otros compiladores para juegos de Valve.

Tras lanzar StudioCompiler, vamos a la pestaña Model Decompile, y definimos el directorio del SDK en el botón de Configure. Tras eso, simplemente rellenar los campos del fichero model y del directorio de output.






Se generará un fichero SMD.

Creación del fichero STL

 

3DSMax

Buscamos conseguir un precioso fichero STL para poder laminarlo e imprimirlo. En este caso tenemos de partida un SMD de valve, se usa 3DS Max para importarlo y poder generar (exportar) un STL. 3DSMax tiene plugins para importar casi cualquier cosa que le eches...

Una característica de los objetos creados para videojuegos es que no tienen "cuerpo", son solamente superficies y no suelen conformar un "objeto" cerrado, es como el envoltorio de un caramelo, una lámina sin grosor ninguno. 3DSMax nos permite coger esta lámina y "extruirla", darle cuerpo, para ello nos resulta muy útil la función "Shell", que "tira" de cada cara de la figura en una dirección perpendicular a ella. Link!


Podría ser que nuestra figura quede con pequeños extraños en las intersecciones de las nuevas caras resultado del Shell. Haciendo que haya "agujeros" entre caras que hacen que la pieza no quede completamente cerrada como una figura con cuerpo, por lo que estaríamos en una situación parecida a la anterior.

 

Modelrepair

Una herramienta que puede resultar útil para corregir ésto es:
https://modelrepair.azurewebsites.net/


Netfabb

Ésta es la herramienta que siempre he utilizado para "partir" modelos de piezas grandes en piezas más pequeñas.

Otra cosa que ofrece Netfabb es que también puede fixear los agujeros de la figura. Sería con las funciones Extras -> Repair. Hace más de un año que no lo utilizo y estoy viendo que ahora es parte de autodesk, seguramente será capaz de muchas más cosas.


Resultado

 

Tras imprimir todas las piezas en PLA, se ensamblaron con termofusible, poniendo algunos refuerzos de piezas desechadas o material de soporte por dentro en las uniones. Los agujeros de los ojos se hicieron a mano utilizando una Versatip de Dremel, como cortar mantequilla, por cierto... Las uniones de las piezas en la cara exterior se rellena con masilla/plaste. Un par de manos de lija + pintura y lista. A esta máscara le metí una tira de leds con una arduino que los hace ir cambiando lentamente entre colores que me molan, pero eso quizás para otra entrada, que esto tiene que acabar en algún momento.

Dejo enlace a la máscara en Thingiverse por si alguien la quiere imprimir: Link! 

El resultado se puede ver en la primera foto! Y aquí va una de su conversión en lamparita:



Links a cholón

 

https://www.autodesk.com/education/free-software/3ds-max
https://www.autodesk.com/education/free-software/netfabb
https://web.archive.org/web/20130630101519/http://wyksblog.com/getting-started-dota-2-cosmetics
https://modelrepair.azurewebsites.net/
https://developer.valvesoftware.com/wiki/3DS_Max
http://www.chaosincarnate.net/cannonfodder/cftools.php 
http://www.thingiverse.com/thing:952560

 

 

 

domingo, 9 de abril de 2017

Notas Anaconda

Notas rápidas para instalar Anaconda en windows, resuelve dabuti toda la instalación/dependencias de los paquetes pandas, numpy, scipy, scikit-learn.. y más herramientas para machine learning y big data. Va todo como un tiro. Le he metido el navigator para tener el entorno visual. Tambien te instala Jupyter para poder utilizar iPython con markdown.





links download Anaconda:
https://www.continuum.io/downloads

Para ayuda, la documentación, o simplemente en línea de comando:
> conda -h
https://docs.continuum.io/anaconda/
* Nota: la cheat sheet de la página está un poco obsoleta, mirar mejor el "30-minute conda test drive".

Instalación, lanzar navigator:
> conda install anaconda-navigator
> anaconda-navigator
* Creará acceso director tambien.

Para lanzar jupyter y poder usar ipython:
Desde el mismo navigator:



Jupyter:




Extra: Creando entorno mediante conda para big data:
> conda create -n bigdata numpy scipy matplotlib pandas scikit-learn statsmodels seaborn bokeh blaze scrapy sympy requests

* Desc. paquetes + inicio en analisis datos: start in data science 

Conda resuelve las dependencias de los paquetes seleccionados y el entorno creado puede ser utilizado seleccionando ese intérprete en Pycharm sin problemas, mientras que en el intento de instalación usando pip o desde Pycharm directamente se presentan algunos errores al instalar los módulos.

Máquina virtual con Debian

Recojo memoria/resumen de los pasos seguidos para virtualizar un debian y montarle un entorno con python, a pelo.

Se toca:
  • Descarga - instalación VMWare
  • Descarga - instalación en máquina virtual de Debian
  • Instalación de las VMTools
  • Instalación de pycharm
  • Notas instalación virtual env y libs de python a mano con pip 
  • Resumen tools python para data science

Descarga Debian

https://www.debian.org/CD/http-ftp/#stable

Descargar versión standar, sin parafernalias, la netinst.



VMware

Usamos Workstation 12 Player. Es gratuito.

Creamos máquina a partir de la imagen de Debian descargada.
Player > File > New Virtual Machine...



Le añadimos más ram: pulsar Customize Hardware...


Instalación debian

Instalación de debian en nuestra máquina virtual local.

Se elige lugar (útil para elegir la hora pasos después), después se elige idioma del sistema y del teclado. *Inglés y teclado en español en este caso.
Sin password de root
User:password que utilizaremos como queramos.
Time zone
Opciones de partición por defecto.



Continuar con todo lo siguiente tras la pequeña instalación elegir el mirror del package manager, por defecto te dará uno cercano si se configuró correctamente el país. No proxy.

Al elegir el software (seleccionar con barra espaciadora, instalar todo lo seleccionado con enter):



Comenzará la instalación gorda.
Cuando nos pregunte por la instalación del grub, elegir el directorio por defecto.



Todo finaliza y el SO inicia.

Instalar las VMware Tools


Permiten arrastrar ficheros dentro/fuera de la vista en el vmplayer, usar ctrl+c y ctrl+v entre nuestro sistema y el sistema de la máquina virtual, autoajuste del tamaño del pantalla al maximizar/minimizar...

El link no corresponde con la versión, pero las instrucciones están más o menos igual:
http://www.debianadmin.com/install-vmware-tools-on-debian-wheezy.html


Al clickar se carga la imagen de las vmware tools en el lector virtual de la máquina.

En caso que no nos aparezca, simplemente ir (en el VMware Workstation) a Player > Manage > Install VMware tools... Esto montará el disco con las tools.

Abrimos un terminal y escribimos:
$ mount



en este caso haremos:
$ sudo mount dev/sr0 /mnt
$ tar -C /tmp -zxvf /mnt/VMwareTools-10.1.5-5055693.tar.gz (versión del momento).
$ cd /tmp/vmware-tools-distrib
$ sudo ./vmware-install.pl

Dar Yes/OK o dejar por defecto todas las preguntas. Tras reiniciar la máquina virtual estarán instaladas y funcionando las tools.


Instalar pycharm

Descargar Pycharm Community :
https://www.jetbrains.com/pycharm/download/#section=linux

Abrir terminal en carpeta de la descarga y seguir la guía de instalación:
https://confluence.jetbrains.com/display/PYH/Installing+PyCharm+on+Linux+according+to+FHS

En resumen:
$ sudo mv pycharm-professional-4.0.1.tar.gz /opt/
$ cd /opt/
$ sudo tar -xzvf /opt/pycharm-community-2017.1.tar.gz 
$ sudo rm pycharm-community-2017.1.tar.gz

Creamos un link para poder ejecutarlo con el comando pycharm:
$ sudo ln -s /opt/pycharm-community-2017.1/bin/pycharm.sh /usr/bin/pycharm

Para entornos virtuales lo suyo sería usar Anaconda y tener bien organizados los entornos el mismo path, además que resuelve genial el instalar los paquetes con sus dependencias. En cualquier caso, aquí se hizo a pelo. Ver link para notas de instalación de anaconda!

Desde pycharm podemos crear el entorno virtual, o directamente por línea de comandos ($ virtualenv Nombre), *Esto gracias a que la instalación de pycharm ya nos ha instalado el gestor de paquetes -pip- y de entornos -virtualenv-.
En nuestro caso lo hacemos directamente desde el pycharm como se ve en la imágen siguiente. Cogemos la versión 3.4.2 que es la última del repo de debian y la tenemos ya instalada.


Resumen uso virtualenvs

Activar:
$ source /home/marcial/bigdata/venv/bin/activate
* En windows simplemente: > D:VenvDirectory\Scripts\activate

Desactivar:
$ deactivate

Una vez activo un virtualenv, con pip podremos instalar paquetes para dicho entorno. Desde las mismas settings en pycharm tambien se pueden instalar paquetes y librerías, pero no funciona tan bien.

Entorno para bigdata

https://www.analyticsvidhya.com/blog/2016/01/complete-tutorial-learn-data-science-python-scratch-2/

De lo dicho en los tutos del enlace anterior, resumen de los paquetes que podrán ser necesarios (Copypaste):
  • NumPy stands for Numerical Python. The most powerful feature of NumPy is n-dimensional array. This library also contains basic linear algebra functions, Fourier transforms,  advanced random number capabilities and tools for integration with other low level languages like Fortran, C and C++
  • SciPy stands for Scientific Python. SciPy is built on NumPy. It is one of the most useful library for variety of high level science and engineering modules like discrete Fourier transform, Linear Algebra, Optimization and Sparse matrices.
  • Matplotlib for plotting vast variety of graphs, starting from histograms to line plots to heat plots.. You can use Pylab feature in ipython notebook (ipython notebook –pylab = inline) to use these plotting features inline. If you ignore the inline option, then pylab converts ipython environment to an environment, very similar to Matlab. You can also use Latex commands to add math to your plot.
  • Pandas for structured data operations and manipulations. It is extensively used for data munging and preparation. Pandas were added relatively recently to Python and have been instrumental in boosting Python’s usage in data scientist community.
  • Scikit Learn for machine learning. Built on NumPy, SciPy and matplotlib, this library contains a lot of effiecient tools for machine learning and statistical modeling including classification, regression, clustering and dimensionality reduction.
  • Statsmodels for statistical modeling. Statsmodels is a Python module that allows users to explore data, estimate statistical models, and perform statistical tests. An extensive list of descriptive statistics, statistical tests, plotting functions, and result statistics are available for different types of data and each estimator.
  • Seaborn for statistical data visualization. Seaborn is a library for making attractive and informative statistical graphics in Python. It is based on matplotlib. Seaborn aims to make visualization a central part of exploring and understanding data.
  • Bokeh for creating interactive plots, dashboards and data applications on modern web-browsers. It empowers the user to generate elegant and concise graphics in the style of D3.js. Moreover, it has the capability of high-performance interactivity over very large or streaming datasets.
  • Blaze for extending the capability of Numpy and Pandas to distributed and streaming datasets. It can be used to access data from a multitude of sources including Bcolz, MongoDB, SQLAlchemy, Apache Spark, PyTables, etc. Together with Bokeh, Blaze can act as a very powerful tool for creating effective visualizations and dashboards on huge chunks of data.
  • Scrapy for web crawling. It is a very useful framework for getting specific patterns of data. It has the capability to start at a website home url and then dig through web-pages within the website to gather information.
  • SymPy for symbolic computation. It has wide-ranging capabilities from basic symbolic arithmetic to calculus, algebra, discrete mathematics and quantum physics. Another useful feature is the capability of formatting the result of the computations as LaTeX code.
  • Requests for accessing the web. It works similar to the the standard python library urllib2 but is much easier to code. You will find subtle differences with urllib2 but for beginners, Requests might be more convenient.
  • os for Operating system and file operations
  • networkx and igraph for graph based data manipulations
  • regular expressions for finding patterns in text data
  • BeautifulSoup for scrapping web. It is inferior to Scrapy as it will extract information from just a single webpage in a run.
Los instalamos todos en el entorno (despues de seleccionar el virtualenv):

$ source /home/marcial/bigdata/venv/bin/activate
$ pip install numpy
$ pip install scipy
$ pip install scikit-learn
$ pip install beautifulsoup4

*Nota: re y os deberíamos tenerlos por defecto.
...


NOTA!! Aunque esto va bien, todo se instala OK utilizando Anaconda tanto en linux como en windows, si no hay motivos para no hacerlo, mejor tirar por ese camino! Hago resumen del entorno en windows: ver Link.






sábado, 17 de septiembre de 2016

Jugando con mi Server: 1

Instrucciones para poner a funcionar una base de datos NoSQL que utilizarán nuestras aplicaciones web, usamos MongoDB.


 Install & Run 


 Instalación del paquete mongodb:
$ sudo apt-get install mongodb-org
Creamos carpeta donde alojaremos nuestra base de datos con
$ mkdir
IMPORTANTE: Necesario dar permisos; p.e. Para base de datos en /home/ubuntu/db
$ sudo chown -R 'youruserid' /home/ubuntu/db
Correr mongod con el fichero de config (fichero por defecto lo podemos encontrar en /etc/mongod.conf):
$ mongod --f /etc/mongod.conf
Correr mongod apuntando directamente a un directorio (donde tenemos la base de datos), en localhost:27017, que es la config por defecto.
$ mongod --dbpath /home/ubuntu/midb/

Acceso por shell


En otra terminal/screen podemos acceder a la shell de mongodb para hacer consultas:
$ mongo

Paquetes python 


La siguiente sirve para instalar pymongo, que nos permite hacer llamadas NoSQL a nuestra base de datos desde python.

Para utilizar la base de datos en python podemos instalar pymongo, sería conveniente crear un entorno virtual para comenzar a instalar los paquetes de python con pip, si no tenemos los paquetes:
$ sudo apt-get install virtualenv pip
Recordamos como activar virtualenv...
$ cd /home/MiUser $ virtualenv MiWebAPP $ source MiWebAPP/bin/activate
* Para desactivarlo
$ deactivate
Una vez activo el virtualenv:
$ sudo pip install pymongo

Enlaces de interés

jueves, 8 de septiembre de 2016

Lanzando un demonio

Pasos para lanzar una script de bash en ubuntu que nos ejecutará automáticamente una script de python en caso que ésta deje de correr.

Para nuestro caso, será necesario crear el .sh y hacerlo ejecutable:

editamos/creamos con nano: sudo nano -c /directorio/running.sh
hacemos ejecutable: sudo chmod +x /directorio/running.sh

Utilizaremos la script dentro de la carpeta /demon/ en nuestro directorio, y en ella misma, tendremos la carpeta tmp donde utilizaremos un fichero vacío .lock como variable.

La script en cuestión, desarrollada hace algunos meses con un compañero para una aplicación de la raspi (Gracias Darkomen!):
lockfile=/home/ubuntu/...../demon/tmp/void.lock

rm -rf /home/ubuntu/...../demon/tmp/

mkdir /home/ubuntu/....../demon/tmp/

while true
do
    litems=`ls /home/ubuntu/......./demon/tmp/ | wc -l`
    echo "$litems"
    if [[ "$litems" == "0" ]]
    then
        if (set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null;
        then
            trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT
            echo "Launching..."
                python /home/ubuntu/......../server.py

        rm -f "$lockfile"
        trap - INT TERM EXIT

        else
            echo "Running..."

        fi
    fi
    sleep 10
done
Importante no dejar espacio entre el signo igual y la comilla en la asignación a la variable litems del output del comando ls.

En este caso quiero dejar corriendo en el servidor la script de bash a mano, por lo que utilizaré screen, ya que accedo al servidor por ssh mediante putty y se cerrarían los procesos al cerrar la sesión. La script en bash hará que la script de python sea lanzada automáticamente cuando ésta pete.


Será necesario hacer: 
screen

* Podemos dar un nombre a la sesión de screen:  screen -S Misesion

y estando en el directorio del fichero:
./running.sh

Ya podemos hacer deatach de la sesión de screen (ctrl-a + ctrl-d) y cerrar la conexión con putty. Todo debería ir fino.


Comandos de utilidad: 
para ver procesos python, por ejemplo: ps -e | grep python
lo mismo para screen: ps -e | grep screen 
Del comando anterior nos interesa el PID si queremos matar el proceso.

ver sesiones de screen: screen -ls
Enlazarse a una de ellas que ya esté corriendo: screen -r PID.NOMBRE

tambien puede ser útil para ver qué nos consume recursos: top

para matar un proceso: sudo kill -9 PID
PID será el número del PID del proceso.