01 diciembre, 2013

Nice config for Git - Configuración práctica para Git

En mi experiencia intermedia en Git me he dado cuenta que vale la pena entender realmente su funcionamiento via consola de comandos. Es algo extraño (y que personalmente aun me cuesta entender), ya que las aplicaciones tienden normalmente a tener interfaces de usuario con metáforas desarrolladas para que el usuario tenga una interacción transparente con el programa.

Es cierto que los sitios que administran repositorios Git (tipo Github o BitBucket) ofrecen muchas herramientas gráficas que permiten entender e incluso realizar tareas de merging, clone, fork, rebasing, entre otras, via Web. Además existen los clientes gráficos (GITK, TortoiseGit) que suelen estar muy cargados de elementos y a veces son incomprensibles, con mil opciones y cajas de chequeo que no se sabe que acción [destructiva] pueda realizar sobre el repositorio. Aun así, estas herramientas no siempre son suficiente y en algunos casos el no entender claramente los principios de Git nos puede llevar a cometer errores (experiencia personal y dedicatoria a mi buen amigo Luis :P) por estos medios.

De todas formas, como Git sigue siendo lo que es, guardando su gran potencial, vale la pena saber cómo trabajar en consola PERO acomodando su entorno de trabajo de la mejor manera para que sea productivo, fácil y eficiente. Aquí van unos datos que me parecen muy útiles para la configuración del entorno Git para trabajo por consola:

Activar colores

Tan simple como ejecutar el comando:

git config —global color.ui true

Añadir un log más limpio

Siguiendo algo que encontré hace unos días enhttps://coderwall.com/p/euwpig, estoy usando un maravilloso log mucho más resumido y claro que el clasico log de git. Para instalarlo:

git config —global alias.lg “log —color —graph —pretty=format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset’ —abbrev-commit —”

y para ejecutarlo:

git lg
git lg -p


Es solo de probar y se entiende la diferencia.

Herramienta externa para merge

No olvidar instalar una herramienta externa para hacer merge. Mis ejemplos clásicos son: WinMerge para Windows y Meld para Linux (seguro que los que Vim dirán que todo se puede en consola …. pero toma su tiempo acostumbrarse). Luego no olvidar asignar ese programa en la configuración de git:

git config —global merge.tool meld

Para seguir trabajando comodamente recomiendo ir de todas formas de la mano de las interfaces gráficas que mencioné previamente. De esta forma se entiende qué hace cada botón y quizas en algunos casos permita ganar tiempo.

28 noviembre, 2013

Noticia otoñal incompleta

Atención! En un 28 de Noviembre como estos en los que se anuncia la pronta llegada de la nieve, la raclette, los regalos, las velitas y la navidad, sucumben ante los rayos del sol la naturaleza terrenal y sus más grandes y altos exponentes. Los bulevares que hace unos meses estaban saturados de árboles frondosos y verdes en estos momentos dejan deslizar sus lágrimas amarillas en el viento de forma continua y acelerada. Dejan a su paso un tapiz ocre sobre el asfalto gris-gélido, permitiendo recordar en un lapso muy breve pero suficiente las postales y fotos de otoño (y de antaño) que parecían tan distantes y tan poco ciertas con la realidad local y tropical de la niñez. No obstante, los más bajitos y gordos (los árboles!) han decidido cambiar de atuendos y conservar la moda chic de la temporada tomando esos colores tostados: un púrpura ceniza, un café, un verde muy oscuro. Mientras tanto, la hierba pequeña, muerta de frio debe resignarse a tomar algunos trazos blancos helados y congelados.

A lo lejos las humaredas de agua sobre los techos de las casas anuncian que algunos seres superdesarrollados necesitan sin embargo seguir con vida, creando unas nubes sin forma clara y bastante lejos de ese cielo azul que parece estar a una distancia incomprensible que quizás Monet y solo algunos otros han logrado entender.

En otras noticias, los pájaros buscan su refugio y su comida en cada pequeño espacio...

02 octubre, 2013

Cuando todo y nada cambia

Ante la sorpresa de ver que no tan solo 'solías escribir', sino que las palabras cargadas de rojo saltan aún en estas notas, encuentro con algo de orgullo y emotividad muy personal los pequeños cambios que han quedado en ese pequeño inconsciente inquieto y vivo. Todo y nada cambia. El tiempo ha dejado atrás un invierno, una primavera, un verano. Las hojas nuevamente se caen y los árboles retoman su sonido ronco cuando el viento fuerte los sacude. Es estremecedor, simulan los fortissimo que solo el mar sabe interpretar, dejan la vida y la historia en cada hoja amarilla o rojiza que cae desde lo más alto. Nuevamente llega el otoño. Todo y nada cambia.

Mis manos están cargadas de recuerdos -qué recuerdos!- que me transportan a cualquier situación marcada con fuego vivo. Las cicatrices permanecen, algunas son de amor, algunas de guerra, algunas de soledad, algunas de ... , algunas de tristeza, algunas de gozo y alegría. Algunas son espinas. Algunas son pétalos. Cuando mi mente las dibuja en mis manos regresa no solo un hecho en sí mismo. Se forma un contexto, una escena, un marco, casi que se siente el óleo y la trementina. Todo toma forma nuevamente y queda una obra con una causa y un efecto. Pero la causa y sobre todo el efecto son los principales motivadores para que esta obra quede en la galería sin saber si algún día valga la pena seguir lanzando brochazos de colores, quizás ocultando la causa ... y haciendo aun más oscuro el efecto. Todo y nada cambia.

Estoy en un viaje que aun no termina. Una fuerza que me impulsa a mantenerme erguido y a continuar caminando hacia un futuro quizás prospero (quizás no), pero que está cargado de energía, esfuerzo, angustia y mil sacrificios. Vale la pena? No lo se. Cuánto he ganado? Mucho. Cuánto he perdido? No lo quiero saber. Es por esto que la conclusión es otra. No estoy solo en mi viaje. Al parecer llevo a cuestas en esta aventura otras personas, otros sentimientos, otros sacrificios. Van conmigo sin estarlo. Y en el camino aparecen nuevas personas, nuevos sentimientos y nuevos sacrificios grabados en mis manos. Ya hace un año ... ya hace dos años ... ya hace tres .. el 14 de Octubre, ya hace siete. Cuánto ha cambiado todo!!! pero, ... todo sigue igual. Todo y nada cambia.

RaC

01 octubre, 2013

Upgrading a VM Fedora 17 to Fedora18 on VirtualBox

Not that easy, but fully happy after doing it!

After doing some Google search and after following the steps written by some people, my walkthrough to achieve this task is as follows:


Happiness when I obtained the Login panel again after all the process

1- In the Virtual Machine, as root user :

yum update
yum clean all
reboot

yum install fedup
fedup-cli —network 18 —debuglog feduplog.log


In the guide said that it was better to put a permissive mode in SELinux but I don’t know if it is necessary. To do this:

setenforce 0
getenforce


2- After the reboot, select the System Update in the Grub menu.

3- A new reboot happened and in my case I obtained only a panel with the Fedora logo and the login panel didn’t appear at once. :( There is a solution !! :)

Reboot again the VM. In the new Fedora 18 entry on Grub click e to edit the boot options. Add the number 3 al the end of the linux line.F10 to continue. If everything goes well, you would login as root. Try lo launch X11 with startx command. Maybe you will obtain the following error at the end:

Failed to load module vboxvideo

To solve this problem, run this command:

/etc/init.d/vboxadd-x11 setup

Et Voilà!!!

After reboot, the login panel should appear again.

Hope this work for you.

RaC

Cómo revisar versiones de paquetes en los releases de Fedora?

Un importante dato de un sabio en Linux. Para verificar las versiones de cualquier paquete que se installa via YUM en Fedora, es recomendadísimo ver la página http://koji.fedoraproject.org/koji/packages. Aquí se puede validar si el paquete fue compilado para una distribución o un release específico de Fedora. Por ejemplo si django 1.5 existe en Fedora 18 (NO EXISTE :( ) Estos datos son importantes para desplegar/instalar aplicaciones en otras máquinas. A tener en cuenta!

13 septiembre, 2013

Extender favoritos de Fedora > 17 / GNOME 3

Para agregar una aplicación cualquiera (que no haga parte de las de base de Fedora) en la lista de aplicaciones, especialmente en la de favoritos.

Instalar alacarte

$ yum install alacarte

Buscar aplicación Main Menu y luego crear un nuevo item con el ejecutable de la aplicación. Finalmente, dar click derecho sobre la aplicación en la lista de programas disponibles y Agregar como favorito :)

12 septiembre, 2013

Deploying Django 1.5.3 application in Apache via mod_wsgi, on a Fedora 18 and using virtualenv and DB MySQL

This post is in English (finally!) and I would like to describe all what I have suffered configuring everything since ZERO. The only thing installed on my machine was the Fedora 18 with the graphical environment (GNOME). I hope I won’t loose any detail in order to be the most reproducible as possible. Let’s go to the configuration stuff !!

1- Install and configure ‘Web Server’ and MySQL Database


Using yum I installed the following packages:

$ sudo yum groupinstall “Web Server”
$ sudo yum install make automake gcc gcc-c++ kernel-devel
$ sudo yum install mysql-server mysql-devel


Enable services to be launched at system start-up and run them

$ sudo chkconfig httpd on
$ sudo chkconfig mysqld on
$ sudo service httpd start
$ sudo service mysqld start


Verify that everything is working

$ sudo service httpd status
$ sudo service mysqld status
$ mysql —user root —execute “select version()”


Configure database root password and basic stuff. Leave the test database in order to make tests with django.

$ sudo mysql_secure_installation

I wanted to put my applications in the $HOME/public_html of an user so I changed the config of the server to use the web user directories. For that:

$ getsebool -a | grep httpd
$ sudo setsebool -P httpd_enable_homedirs on
# Read and make the modifications in the file/etc/httpd/conf.d/userdir.conf and restart the web server
$ sudo service httpd restart


Create public_html folder and assign permissions

$ mkdir ~/public_html
$ chmod 711 ~username
$ chmod 755 ~/public_html


2- Install and configure Python, virtualenv, and Django


Normally, global things with yum and easy_install and local ones with pip

$ sudo yum install python
$ sudo yum install python-setuptools python-devel
$ sudo easy_install pip
$ sudo pip install virtualenv


Defining a virtualenv

$ mkdir ~/public_html/testAppDjango
$ cd ~/public_html/testAppDjango
$ virtualenv env —no-site-packages
$ source env/bin/activate
$ pip install django -U
$ django-admin.py startproject testproject
$ cd testproject
$ python manage.py runserver 8000


By now it should run. Stop the server and continue

3- Configuring connection to MySQL and the mod_wsgi

$ pip install MySQL-python
$ sudo yum install mod_wsgi
$ python manage.py startapp testapp


# Modify the settings.py as follows:

- In DATABASES > ‘ENGINE’ : ‘django.db.backends.mysql’, ‘NAME’ : ‘test’, ‘USER’ : ‘root’, ‘PASSWORD’ : ‘password’, ‘HOST’ ; ‘localhost’, ‘PORT’ : ”

- Activate admin in installed_apps (make the same change in the urls.py file).

The ones who knows a little bit of Django, knows what I’m talking about. Now, use your editor to create the following file. The most important one.

$ gedit /etc/httd/conf.d/testApp.conf

Insert the following text:

WSGIPythonPath /home/username/public_html/testAppDjango/testproject:/home/username/public_html/testAppDjango/env/lib/python2.7/site-packages

<VirtualHost *:80>

WSGIScriptAlias / /home/username/public_html/testAppDjango/testproject/testproject/wsgi.py
Alias /static/ /home/username/public_html/testAppDjango/testproject/testproject/static/
Alias /media/ /home/username/public_html/testAppDjango/testproject/testproject/media/

<Directory /home/username/public_html/testAppDjango/testproject>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>

<Directory /home/username/public_html/testAppDjango/testproject/testproject/static/>
Order deny,allow
Allow from all
</Directory>

<Directory /home/username/public_html/testAppDjango/testproject/testproject/media/>
Order deny,allow
Allow from all
</Directory>
</VirtualHost>

Synchronize the database and see what happens in the browser http://localhost

$ python manage.py syncdb

NOW IT SHOULD WORK BUT …. A 500 HTTP ERROR APPEARED IN THE BROWSER :(. Look in the Apache error log:

$ sudo less /etc/httpd/logs/error_log

In my server logs appeared the following #$f..ck@ error:

Error Loading MySQLdb module: /home/username/public_html/testAppDjango/env/lib/python2.7/site-packages/_mysql.so: failed to map segment from shared object: Permission denied

After a deep search on Google and some hopeless guides that told difficult things to recompile libraries and all that stuff I found that this problem is related to a security system included in Fedora the SELinux. Some people have deactivated it and their apps work, but my production server can’t be modified in that way so other guy's guide and a little troubleshot in a website gave me some useful commands:

$ cd /home/username/public_html/testAppDjango/env/lib/python2.7/site-packages/
$ ll -Z
# The _mysql.so file shoud appear as a lib_t not a httpd_user_content.
# With the following it tells that is a shared lib:
$ chcon -t shlib_t *.so


NOW FOR ME IT WORKED!!

Next, do some important things to display the website correctly and to maintain it:

$ cd ~/public_html/testAppDjango/
$ pip freeze > requirements.txt
$ cd testproject/testproject
$ mkdir static
$ mkdir media
$ cp ../../env/lib/python2.7/site-packages/django/contrib/admin/static/admin/* .


Just if you want to verify, my only dependencies in requirements file are:
Django==1.5.3
MySQL-python==1.2.4
wsgiref==0.1.2

Hope this will be useful. RaC!

06 septiembre, 2013

Acceder desde otro PC en la misma red local al Django dev server, instalado en una VM Fedora 18

Esto lo realicé luego de tener el siguiente problema:

- Tenía mi ambiente de desarrollo para mi sitio en Django en una máquina virtual Fedora 18. Además, estoy empezando a utilizar la librería XTK que es una extensión de WebGL para hacer más sencillas los renderizados 3D en Web. Sin embargo, ni en Google ni en Firefox en la VM me funcionó WebGL, incluso si decía que OpenGL estaba soportado. Intenté todo lo que decían los foros y no funcionó. Por esta razón, quería poner el servidor de desarrollo accesible desde mi máquina real y con eso hacer la prueba con los navegadores instalados en mi máquina real, y FUNCIONÓ :D.


Aquí la guía de pasos a seguir:

1- Cambiar a modo de adaptador en la configuración de red de la máquina virtual. Asignar como modo Bridge (Puente) y seleccionar como Name (Nombre) el que corresponda al dispositivo de conexión inalámbrico o conexión por cable (yo intenté con los dos porque no sabía exactamente cual era el adecuado).

2- En la máquina virtual, dejar lo más pública posible la máquina. Verificar Firewall especialmente.

3- Preguntar la ip por ifconfig o ir a la página http://whatsmyip.net/.

4- Si se tiene otro servidor web ejecutándose (como Apache) en la máquina virtual, detenerlo. Esto se puede verificar y realizar con los siguientes comandos como superusuario:

sudo service httpd status
sudo service httpd stop


5- Ejecutar el servidor de desarrollo de django como de costumbre, pero asignar como ip 0.0.0.0 y puerto 80, es decir:

python manage.py runserver 0.0.0.0:80

6- Volver a la máquina real y acceder desde el browser al servidor utilizando la ip identificada en la máquina virtual.

Y todos contentos !! :) es posible hacer pruebas rápidas en una máquina virtual, pero validar el funcionamiento en una máquina real.

29 agosto, 2013

Agregando/Embed un PDF en Dropbox a un sitio de Google Sites

Esta es una guía rápida para embeber (embed) un PDF en un sitio de Google Sites luego de sufrir tratando de utilizar los medios de Google Docs y que generan un Viewer útil pero muy denso.


Primero voy a recomendar el siguiente vínculo como una base para quien lo quiera intentar: http://sitesguide.pjrprojects.co.uk/google-sites/how-tos/link-and-embed-pdf-files. Yo tuve problemas, no me funcionó como yo quería y es por esto que recomiendo los siguientes pasos utilizando como espacio de almacenamiento gratuito, Dropbox.

1- Agregar el PDF a Dropbox, preferiblemente en una carpeta dedicada que tenga los documentos públicos.

2- Entrar al sito web de Dropbox para obtener el link al documento agregado. Para esto se debe ir a la carpeta dedicada, ubicar el archivo y dar click sobre el boton de Compartir. Esto abrira una ventana que permite (en la parte superior) descargar el PDF. Dar click derecho sobre este botón y copiar el link de descarga.

3- Luego vamos a Google Sites a embeber el PDF. Desde el espacio de edición de una página en Google Sites, agregar un iframe. Este se puede encontrar en Insert > More gadgets > Include gadget (iframe). Esto permitirá asignar una URL (URL to content) en la que se va a copiar lo siguiente:

http://docs.google.com/gview?url=<URL_copiada_desde_Dropbox>?token_hash=AAEhf9JkB4-FJ4vnibtoKLqmKu1BdpbySJ_Iv7v8Gk0ACw&dl=1&embedded=true

NO hay que poner los símbolos de mayor que, menor que. Solo la URL.

4- Asignar un tamaño y configurar las propiedades y listo !!

5- Para mostrar un ejemplo, ir a mi página en la sección de Proyectos. Ahí los PDF’s están desplegados usando esta opción. El rendering al inicio es lento pero luego se ve muy bien.

See You

22 julio, 2013

Asignar/mapear valores provenientes de una imagen 3D sobre una iso-surface con ParaView

Existen diversas técnicas para visualizar el contenido de una imagen 3D (el volumen conformado luego de la compilación de imágenes 2D e.g. imágenes diagnósticas médicas de tomografía o resonancia magnética). Generalmente se utilizan técnicas de renderizado volumétrico que permiten ver el interior de la estructura con alguna tabla de colores o con algunos métodos alternativos de umbralización; ejemplos de estos dos Volume Rendering (VR) y Maximum Intesity Projections (MIP). Sin embargo, algunos análisis requieren una visualización clara de los valores obtenidos a lo largo de una superficie definida o extraída previamente. La situación siguiente describe una necesidad recurrente que es la razón principal de este post:

- Se tiene una imagen 3D donde el valor de cada voxel entra en un rango que puede ser representado por una escala de grises (normalmente una imagen de tomografía, resonancia, ultrasonido, etc.). También se tiene una máscara de segmentación (imagen binaria que asigna un valor diferente de cero a una región de la imagen que se quiere estudiar; cero al resto de la imagen) del mismo tamaño de la imagen original. Para el análisis de la zona definida por la máscara de segmentación se quieren visualizar los valores en la imagen original sobre la superficie de la segmentación. En otras palabras, “mapear” los valores originales en la superficie segmentada.

Como ya está mencionado en el título, Paraview me sorprende una vez más permitiendo hacer todo esto de una manera muy sencilla y rápida. De aquí en adelante mi guía para resolver este problema utilizando Paraview:

Datos de entrada:
Imagen original en formato MHD/MetaImage (en mi caso el tipo de dato es unsigned short, pero puede ser cualquiera) . 
Imagen binaria de la segmentación en formato MHD.

19 julio, 2013

Paso a paso: desde malla STL hasta sólido IGS/IGES usando herramientas libres u open-source

Todo un misterio, muchas pruebas y un enorme trabajo para lograr el resultado final. Primero voy a resumir las aplicaciones y lenguajes libres que utilizo, luego describiré mi problema y finalmente hablaré de mi solución.

Aplicaciones:


- ParaView: herramienta para visualización en 3D. Util para cortar mallas (y ver su interior), para conversión de datos entre VTK-STL-PLY, práctico para obtener rápidamente la iso-surface de una imagen binaria, sencillo al momento de medir distancias o poner nuevos puntos.

- MeshLab: herramienta para el tratamiento de mallas. Util para la conversión de datos PLY-STL, práctico para lanzar algoritmos sobre mallas e.g. smooth, decimation, invertir normales, etc. Tiene una interfaz simple para identificar y llenar huecos en las mallas. Puede utilizarse para el análisis de las propiedades de las mallas : self-intersect faces, manifold edges, duplicated vertices, etc.

- MeVisLab: herramienta de prototipado rápido para visualización y tratamiento de imágenes, especialmente enfocado en imágenes médicas. Util para toda prueba rápida de algoritmos de procesamiento de imágenes. Arquitectura orientada a eventos con respuesta inmediata ante los cambios en los parámetros de los filtros.

- FreeCAD: herramienta CAD open-source para el modelado en 3D. No tengo mucha experiencia en su utilización, pero en este proyecto es muy práctico para la conversión de una malla de triángulos a un formato de solidos (IGS/IGES). También tiene una interfaz de análisis de las propiedades de las mallas que permite modificar y reparar problemas en el mallado.

- Blender: herramienta para el modelado libre de objetos en 3D. Util para pasar filtros sobre las mallas, e.g. decimation, smooth, binary operations, entre otros. Util para la edición por puntos, aristas o caras de una superficie. Se puede utilizar para leer y convertir archivos STL y PLY.

- VTK: lenguaje open-source para visualización de datos. En este caso utilizo el código comentado previamente en este blog para la rasterización de una malla en una imagen binaria. El código lo ejecuto en Linux con la versión de VTK 5.6

- vtkSurface-DiscreteRemeshing: código bajo licencia CeCILL B desarrollado en el laboratorio CREATIS por Sebastien Valette. Permite una regeneración correcta de una superficie con una cantidad definida de elementos. Conserva la topología de la malla con las mejores propiedades de la misma. Para más información ver el artículo:
" Approximated Centroidal Voronoi Diagrams for Uniform Polygonal Mesh Coarsening", Valette & Chassery, Eurographics 2004

03 julio, 2013

Utilizar imágenes MHD/RAW en Matlab

Retomando algo que había escrito previamente, dejo un par de líneas que ayudan en la lectura y escritura de imágenes MetaImage en Matlab:

NOTA: Solo muestro cómo leer, pero es equivalente para escribir la imagen.

Cargar imagen MHD en Matlab

fid = fopen(‘NOMBRE_ARCHIVO.raw’);
A = fread(fid,dimx * dimy * dimz, ‘uint16’); %aplica este formato para unsigned short
img = reshape(A,dimx,dimy,dimz); %aqui se convierte en matriz pues cuando lee, lo que guarda en A es un vector.

En Imagenes MHD…

case ‘MET_UCHAR’
    type = ‘uint8’;
case ‘MET_CHAR’
    type = ‘int8’;
case ‘MET_USHORT’
    type = ‘uint16’;
case ‘MET_SHORT’
    type = ‘int16’;
case ‘MET_UINT’
    type = ‘uint32’;
case ‘MET_INT’
    type = ‘int32’;
case ‘MET_FLOAT’
    type = ‘single’;
case ‘MET_DOUBLE’
    type = ‘double’;

22 mayo, 2013

Utilizando Git, TortoiseGit y llave SSH en Windows

Luego de unas pruebas que en el inicio parecían sencillas para lograr acceder a un repositorio Git instalado remotamente al cual tengo acceso por medio de claves SSH, llegué a un resultado satisfactorio que -lo admito con algo de alegría- cada vez se parece más al manejo en Linux. Pero bueno, prefiero por explicar un poco comentando primero mi problema. La situación era la siguiente:

Tenía ya instalado TortoiseGit-1.8.3.0 64 bits, Git-1.8.1.2 (al cual le había asignado como cliente SSH a Tortoise) y Putty-0.62 en mi PC, Windows 7. Normalmente el acceso al servidor remoto CVS tan solo necesitaba la instalación de TortoiseCVS y el mismo podía reconocer la versión instalada de Putty para conectarse por SSH al servidor (habiendo cargado previamente la llave con extensión .ppk que se genera con la llave pública y privada) y realizar la identificación del usuario. Todo era de cierta forma transparente. Sin embargo, con TortoiseGit, un cliente adicional de Putty aparece en el juego y además hay un supuesto TortoiseGitPlink que da ciertos problemas como el que me sucedía a mi. Al momento de hacer un git push o un git clone o cualquier cosa que involucrara el servidor aparecía el problema siguiente:

TortoiseGitPLink Fatal Error
Disconnected: No supported authentication methods available (server sent: publickey, gssapi-keyex, gssapi-with-mic)


Solución: Luego de una serie de desinstalaciones e instalaciones seguidas, encontré la instalación que no tiene problemas para obtener un buen espacio de trabajo para Git en Windows usando dichas claves SSH. Voici les étapes! Basado en: http://boredwookie.net/index.php/blog/git-part-2-get-tortoisegit-working-on-windows/

1- Descargar TortoiseGit-1.8.3.0-64bit.msi y Git-1.8.1.2-preview20130201.exe
2- Instalar TortoiseGit normalmente.
3- Ejecutar el instalador de Git. Seleccionar las opciones de ‘Use Git Bash Only’ y de ‘Use OpenSSH’. La segunda viene siendo bien importante.
4- Colocar la llave SSH (id_rsa) en la carpeta .ssh que debería estar localizada en el directorio del usuario, e.g. C:\Users\myUser.ssh\id_rsa (la carpeta .ssh puede ser facilmente creada por línea de comandos lanzando un mkdir .ssh)
5- En la configuración de TortoiseGit, ir a Network, y asignar como ‘SSH Client’: C:\Program Files (x86)\Git\bin\ssh.exe
6- Intenta un clone o un push o cualquier cosa que tenga acceso al servidor. Va a preguntarte tu contraseña de la llave SSH y … now it works!

Nota: Otras posibilidades para acceder a Git son:
- La consola de comandos ‘Git bash’ instalada con Git
- Con Eclipse (personalmente me gusta esta): Import, ’Projects from Git’, URI. Es importante confirmar en Window -> Preferences -> General -> Network Connections -> SSH2 que el cliente SSH está accediendo sin problema a las llaves disponibles en el sistema.

Enjoy it !!

RaC

22 abril, 2013

Linux - Recuperar USB utilizada como disco de arranque

Como de costumbre, todas las complejas cuestiones técnicas tienen una solución relativamente directa en Linux. El problema es saber todos los trucos y encontrarlos rápidamente para poder sacarles provecho. Un ejemplo de esta situación es poder recuperar una USB que había sido utilizada como boot drive para hacer una instalación alguna distribución de Linux. Pensando que ya no tenía caso y que iba a ser complicado encontrar la solución para volver a utilizar toda la memoria del disco, encontré la página con las respuestas que solamente alguien muy técnico (geek guys :D) puede encontrar tan solo con la ayuda de los comandos (verhttp://www.pendrivelinux.com/restoring-your-usb-key-partition). A continuación reescribo los mismos pasos que acabo de probar y que me dieron un resultado positivo:

A. Primero se deben borrar las particiones que quedan en la USB

1. Abrir terminal y entrar como superusuario (escribir su)
2. Revisar los nombres de los discos y sus particiones: fdisk -l
3. Entrar a la revisión del disco: fdisk /dev/sdX (reemplazando X por el nombre del disco. en caso USB, normalmente sdb)
4- Escribir d y proceder a borrar las particiones (en mi caso habían 3: sdb1, sdb2, sdb3)
5- Escribir 1 para borrar la primera partición. Borrar las otras dos.

B. Crear nueva partición

1- Escribir n para crear la partición
2- Escribir p para hacer una partición primaria
3- Escribir 1 para indicar que es la primera partición y aceptar el tamaño por default.
4- Luego pregunta el espacio de la segunda partición, asignarlo por default (el resto de espacio del disco)
5- Escribir w para escribir la info de la nueva partición a la USB
6- Desmontar el disco con: umount /dev/sdX1 (reemplazando X por el nombre del disco. en caso USB, normalmente sdb)

C. Asignar la partición a formato FAT

1- Escribir mkfs.vfat -F32 /dev/sdX1 (reemplazando X por el nombre del disco. en caso USB, normalmente sdb)

Al extraer la memoria y volverla a utilizar en el sistema, todo la memoria (aparentemente) estará disponible. Memoria recuperada !

12 abril, 2013

Construir un string cross-platform C++

Buscando la forma genérica para concatenar adecuadamente números en un string o cadenas de strings entre si, recordé el uso de stringstream para no olvidarlo. Anoto que usé primero std::to_string pero luego noté que en Linux pone problemas de compilación. Voici l’exemple:

std::stringstream ss; 
ss<<"Ou yeah! "<< 3 ; 
std::string s = ss.str();
std::cout << s << '\n';

28 marzo, 2013

Una vieja conexión BBTK - ITK ...

Luego de sufrir un día en un problema mínimo, la solución se encuentra en los recuerdos y algunos amigos/colegas/asesores que tienen más memoria.

Lo importante a tener en cuenta esta vez es que si se crea una caja BBTK que haga algo con filtros de ITK, hay que agregar un atributo de estilo itk::DataObject::Pointer _att a la clase, y asignarle el output luego de hacerle SetOutput a la caja. De esta forma, se retransmite el objeto hacia las otras clases y el recolector de basura no se ve tentado a eliminar el SmartPointer dando la impresión que el código funciona y son los maravillosos pipelines que no quieren pasar los datos de caja en caja!

Importante dato a tener en cuenta.

27 marzo, 2013

Mallas a Imágenes + Operaciones lógicas

Como luego no me voy a acordar de la secuencia de pasos que acabo de hacer, prefiero escribirlo para próximas oportunidades.

Problema:

- Recibo dos mallas en formato STL: la superficie de una esfera que se superpone con otra. Se quiere generar la diferencia entre la más grande respecto a la más pequeña.

Solución:

- Rasterizar las superficies. Utilizo VTK, vtkPolyDataToImageStencil (ver código de ejemplo). Defino el spacing de la imagen resultante. El tamaño es definido automaticamente por los bounds del polydata. Se generan dos imágenes MHD de suficiente resolución para generar nuevamente las mallas.

- Aplicar aritmética binaria entre las dos imágenes para generar la diferencia. Para esto uso MeVisLab. Tan solo con el filtro MergeRegions, opción AbsoluteDifference, obtengo el resultado. En Use Region: Union of all regions. El resultado genera unos bordes indeseables, por lo que se aplica un Opening de kernel 2x2x2. Guardo las nuevas imágenes.

- Generar malla de la diferencia. Abriendo la malla en ParaView, genero la superficie (MarchingCubes) y la guardo como archivo PLY. Esta malla es escalonada (por el MarchingCubes) y puede tener huecos. Abro el archivo en MeshLab y aplico una operación de llenado de huecos. Guardo nuevamente en PLY, abro este resultado en ParaView y guardo esa superficie completa como polydata en formato VTK.

- Reducir el tamaño de la malla/mejorar la distibución de triángulos y suavizar. Utilizo desde un pipeline en bbtk (CreaTools) el algoritmo de S.Valette; en paticular la caja MeshCleaning. Esta caja genera un Polydata que puede ser guardado en formato VTK o STL. (ParaView también funciona para hacer conversiones a STL)

Et voilà mon petit tout sur les différents outils de traitement d’images et des maillages !!! El resultado es más bien interesante y cool! Indeed, no son propiamente esferas ;-)


En azul la parte que quería guardar en un STL independiente. La roja era una de las mallas de entrada y la suma de los dos era la otra.

14 marzo, 2013

Java + VTK - 1er Test

Primera prueba de Java + VTK!

Seguí en detalle la guía disponible en este sitio Web: http://www.particleincell.com/2011/vtk-java-visualization/ . A pesar que todo funcionó prefiero hacer anotaciones aun más precisas de mi prueba para que pueda reproducirse sin problema:

1- Descargué el VTK 5.10.1 . Generé el proyecto con CMake 2.8.9 y el CMakeCache.txt está disponible en los archivos adjuntos. Aquí se puede ver que forcé la dependencia a una de las versiones instaladas en mi máquina, específicamente la de Java 7 32bits. (C:/Program Files (x86)/Java/jdk1.7.0_15)

2- La compilación la realicé con VC++ Express 2008. No hubo problemas de compilación y luego de instalar se agregaron las rutas indicadas al PATH: C:\Program Files (x86)\VTK\bin;C:\Program Files (x86)\Java\jdk1.7.0_15\lib; C:\Program Files (x86)\Java\jre7\bin; C:\Program Files (x86)\Java\jre7\bin\client; C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT;

3- Al crear el proyecto Eclipse asigné el mismo JDK como JVM que utiliza el proyecto. Añadí también el vtk.jar. Aparecieron los problemas de “vtkCommonJava not loaded”, pero se resolvieron finalmente añadiendo como Native Libraries de vtk.jar la ruta: C:\Program Files (x86)\VTK\bin donde están todos los DLL’s.

4- El ejemplo de los IsoSurfaces y los planos funciona :D. Haré una prueba con imágenes para ver cómo se comporta en dichos casos Java con VTK.


Voila mi primer Test!


RaC

27 febrero, 2013

Motor de Rendering - VTK

Tomado del webinar de Kitware de VTK, agrego la siguiente imagen que me parece vital para entender la conexión entre los objetos que hacen parte de las escenas VTK:


Tomado de http://www.vtk.org/VTK/resources/webinars.html


Esta es la mejor manera de explicar y entender las conexiones necesarias en VTK !! (este mismo diagrama lo hice en repetidas ocasiones hace unos años)

21 febrero, 2013

Patrones de diseño - Composite

Siguiendo la explicación de Wikipedia, es la composición de objetos simples para formar un objeto complejo. Se puede representar fácilmente en forma de arbol y un ejemplo claro es la creación de GUI donde se crea un Frame a partir de Paneles que tienen a su vez Widgets, que generalmente son compuestos por elementos aun más atómicos como botones, cajas de texto, etiquetas, …

Ahora bien, como ejemplo claro y muy personal, bbEditor está en su base construido de esta manera (para el manejo de Cajas que tienen a su vez objetos como Inputs y Outputs, más la construcción de las cajas complejas) !! :O Composite + MVC + Observer/Observable + Singleton … No está tan mal diseñado finalmente, pero aun hay problemas de Asignación de responsabilidades y unas clases llenas de código hasta lo más mínimo…. Cómo se hubiera podido desacoplar esto??

20 febrero, 2013

CreaTools - Complex Boxes

Something very important to remember when using complex boxes in CreaTools / Algo muy importante para recordar cuando se usan cajas complejas en CreaTools:

Une entrée de la boîte complexe qui est utilisée à l’intérieur par des autres boîtes. Voici un exemple,

image

Si on utilise cette boîte dans un autre diagramme, la valeur de l’entrée n’est pas transmit à la boîte complexe. Pour ce cas spécifique avec des chaines de caractères, j’ai fait le changement suivant et l’application marche:

image

Par contre, une solution plus générique pour un objet quelconque c’est d’utiliser une boîte MagicBox au lieu du ConcatStrings. Comme ca , il fait une copie directe de l’entrée a toutes les sorties.