Configure Juniper VPN Web Client Ubuntu 14.04 64 bits

So i am doing a project with Mercado Libre and they use Juniper VPN.

I love to code using Linux, it has a lot of advantages. At this moment I am using Ubuntu 14.04 64 bits.

Mercado Libre sent me the instructions on how to connect with my login/password. So I followed them, but thanks to the awesome people of Juniper, they does not have support for Linux 64 bits. At least they have this guide.

That guide did not work for me. I had to struggle and read a lot over the internet, view system logs, etc. After one day I was able to connect, so this are the instructions i followed:

  1. sudo dpkg –add-architecture i386
  2. sudo aptitude purge firefox
  3. sudo aptitude install firefox:i386 icedtea-7-plugin:i386 openjdk-7-jdk:i386
  4. Open Firefox, enter the login/password/token, then it will load the plugin and ask to allow and accept a lot of things, click all yes and that is it. You need to make sure Firefox have all the permissions to run the java applet.

That guide works if you are running the client directly from the computer, not from the browser. We just need to be sure that Firefox will load the Juniper VPN applet running on a 32 bits JVM.

Advertisements

Setting up Tomcat 7 with IntelliJ IDEA

I have been doing a java project with IntelliJ IDEA. It is a quite normal IDE, with some supposed advantages over Eclipse. I got used to it in two weeks. 

So i’ll to explain how to run a project with Tomcat 7.

  1. Download the core version of Tomcat 7 here. DO NOT INSTALL IT WITH APT-GET OR ANY PACKAGE MANAGER
  2. Uncompress the folder anywhere you want
  3. Click on Run -> Edit Configurations…
    Search on the left for Tomcat Server and select Local

  4. Click Configure

  5. In the name put Tomcat 7
    Tomcat Home and Tomcat base directory are the folder you created in step 2

  6. Click Ok
    Set Startup page: http://localhost:8081/, HTTP port: 8081
    You can change this values to any you want

  7. Click on Run -> Edit Configurations…
    Click on the + sign 

  8. Select Tomcat Server Local
    Go to Deployment tab

  9. Click on the + sign, select artifact you want to add to the server (in the picture i added one called dsp-api.war)
    Click Ok

  10. That’s all run and test your application 🙂

Big Data, mi opinión y varias cosas cool en Python

Big Data

Ayer revisando mi twitter, me encuentro con lo siguiente:

http://techcrunch.com/2012/10/27/big-data-right-now-five-trendy-open-source-technologies/

Varias de esas tecnología las he escuchado y usado: he usado un poco hadoop mediante pig y otros en el trabajo usan Kafka. Es increíble hacia donde esta yendo el mundo de la computación e información. Ciertamente las metaheurísticas que vi y use para hacer data clustering en mi tesis están en el rumbo correcto. Ya la programación normal no se de abasto. Pensar en paralelización y formas para manejar cantidades gigantes de datos es el futuro. Es la era de la información y hay que saber como explotar y sacar todo lo posible de los datos. Ya veremos como siguen las cosas, mientras a conocer un poco de estas cosas.

Python

En lo que estaba haciendo me vi en la necesidad de hacer request a MySQL, a páginas web, mandar correos, hacer gráficas, entre otras cosas. Todo lo hice mediante Python y ciertos bash para ayudarme.

Request a páginas web

Use lo siguiente: http://docs.python-requests.org/en/latest/. La libreria urllib2 es muy buena y es posible que no halla tenido que usar esta, pero en verdad fue lo que me salió más rápido y conseguí de primero.

Hacer una petición POST es así de tonto:

import requests
    result = request.post(url, params = parametros[, cookies = ....])

Si queremos que sea una petición GET, siemplemente se cambie la palabra. Por ejemplo si queremos atentificarnos en una página y luego sacar información el script sería algo así:

import request

auth_cookies = None
def login():
    request_result = requests.post(url, params = {'username' : usuario, 'password' : clave})
    request_result.raise_for_status()
    global auth_cookies
    auth_cookies = request_result.cookies

def get_information():
    request_result = requests.get(url', params = ..., cookies = auth_cookies)
    request_result.raise_for_status()
    #En request.text esta el resultado, lo parseamos o buscamos lo que necesitamos de acá

if __name__ == "__main__":
    login()
    get_info()
    ....

Así de fácil.

Mandar email

Lo saque de internet y le comenté ciertas cosas que no me agarranon bien:

import os
import smtplib
import mimetypes
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.MIMEAudio import MIMEAudio
from email.MIMEImage import MIMEImage
from email.Encoders import encode_base64
from sys import argv

def sendMail(subject, text, *attachmentFilePaths):
    gmailUser = ''
    gmailPassword = ''
    recipient = ''
    msg = MIMEMultipart()
    msg['From'] = gmailUser
    msg['To'] = recipient
    msg['Subject'] = subject
    msg.attach(MIMEText(text))
    for attachmentFilePath in attachmentFilePaths:
        msg.attach(getAttachment(attachmentFilePath))
        mailServer = smtplib.SMTP('smtp.gmail.com', 587)
        mailServer.ehlo()
        mailServer.starttls()
        mailServer.ehlo()
        mailServer.login(gmailUser, gmailPassword)
        mailServer.sendmail(gmailUser, recipient, msg.as_string())
        mailServer.close()
       print('Email enviado a %s' % recipient)

def getAttachment(attachmentFilePath):
    contentType, encoding = mimetypes.guess_type(attachmentFilePath)
    if contentType is None or encoding is not None:
    contentType = 'application/octet-stream'
    mainType, subType = contentType.split('/', 1)
    file = open(attachmentFilePath, 'rb')
    '''
    if mainType == 'text':
        attachment = MIMEText(file.read())
    elif mainType == 'message':
        attachment = email.message_from_file(file)
    elif mainType == 'image':
        attachment = MIMEImage(file.read(),_subType=subType)
    elif mainType == 'audio':
        attachment = MIMEAudio(file.read(),_subType=subType)
    else:
    '''
    attachment = MIMEBase(mainType, subType)
    attachment.set_payload(file.read())
    encode_base64(attachment)
    file.close()
    attachment.add_header('Content-Disposition', 'attachment', filename=os.path.basename(attachmentFilePath))
    return attachment
 

Mandarlo es simplemente completar las variables y usar las funciones como uno desee.

System call hooking

El otro día, me encuentro que hay un rootkit creado para pasar gran parte de los kernel de MAC, haciendo uso de system call hooking. Encontré este artículo bastante interesante que explica por cimienta el tema. Muchas cosas me llamaron la atención, veré si leo más del tema. Tampoco esta demás aprender un poco del funcionamiento del kernel de linux y sus módulos.

Como vamos

Primero comentare del pasado domingo brevemente:

No hubo fraude, simplemente tenemos una mayoría en el país que fue exluida por 40 años y ahora que le dan migajas de esperanzas, dan su voto por la mediocridad. Un cambio es necesario y es hora de una política seria.

Desde hace que no posteo nada, he estado ajustado de tiempo. Las cosas que han pasado:

  • Ya no ando programando en asp.NET (use MVC 3.0 con VB y 2.0 con C#)
  • Lo del artículo va en camino de tortuga.
  • Ahora ando en un proyecto de investigación, donde he tenido que usar Java, Python, bash y SQL.
  • Me compre un Nexus 7 y unos audífonos. Excelente hasta ahora, 100% recomendables.
  • asp.net MVC >= 3.0 no tiene nada que envidiarle a otro frameworks. Es facil de usar y de programar. En mi caso use el EntityFramework para manejar la parte del modelo. Es bastante configurable y permite usar stored procedures. Ésto último es muy buena práctica. IIS lo poco que tuve que tocar, me pareció bueno. Mis quejas serían tener que pagar por algo que se puede tener gratis igual o mejor (RoR, Django) y la documentación no es tan buena en comparación con las cosas que son open source.
  • Team Fundation y svn, son un asco al lado de git. Gracias Linus Trovalds.
  • Como escribí antes me encanta Python, lástima que lo conocí y aprendí tarde. Es bastante legible y poderoso. Ando seguro que Perl es muy usado y posiblemente más poderoso, pero odio los $ (si odio php).
  • Es increíble la cantidad de herramientas que existen hoy en día. Ejempo son hadoop, pig, oozie, que otros en el trabajo andan usando.
  • Con respecto al anime, me leí gran parte de las novelas de Sword Art Online. Muy buenas. Salió una ova de Code Gueass.
  • Me puse a ver Breaking Bad. Voy terminando la 3era temporada. Que serie tan buena. Tiene unas partes que te mantienen pegado, pero debo decir que a veces se pone algo calmada y lenta. Ya veremos como sigue.

A ver si tengo cosas más interesantes que colocar, ya veremos.

Tratando de optimizar el código

Ya casi no tengo mucho tiempo para escribir cosas interesantes :S!

En los siguientes post me gustaria hablar de javascript y Google Maps.

Mi tesis(https://github.com/fedep3/Metaheuriscticas-Data-Clustering) está hecha en C++ y es sobre data clustering  de datos numéricos usando metaheurísticas. Esta enfocada en las imagenes principalmente (las imágenes no son mas que conjuntos de vectores de uno o mas colores).

Actualmente ando investigando y mejorando el código para hacer una poblicacion sobre el algoritmo genético que cree yo con mi companero.

En el código he hecho dos cambios:

  1. Cambiar el generador de numeros aleatorios.
  2. Intentar optimizar la función de la distancia euclideana.

El motivo de l primer cambio era que el generador de numeros aleatorios de C++, es un http://en.wikipedia.org/wiki/Linear_congruential_generator , los cuales son muy eficiente, pero no son tan buenos. Habiendo usado python y ya de hace un tiempo que habia leído del tema decidí colocar el http://en.wikipedia.org/wiki/Mersenne_twister que es de los mejores, por no decir el mejor actualmente. Ahora el reto era buscar que implementecion usar o si hacerla uno mismo. Buscando y probando consegui uno creado por un invetigador de Pixar que hace uso de las instrucciones SSE2 y que es increiblemente eficiente(http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/VERSIONS/C-LANG/cpp_sse2.zip).

Al principio no me compilo asi que busqué lo que estaba pasando. Después de como 1 hora de leer y probar di con la solucion. El código hace uso de unos defines o funciones que por lo visto no estan incluidos en el emmintrin.h. Basto con cambiar el código y listo compilo.  Lo arregle para usarlo y la diferencia de tiempo/resultados con lo que tenia antes ni se notaba.

Averiguando todo este, me surgió un interés por esas instrucciones SSE2. Quería ver si podía programar en ellas la distancia euclideana. Encontre una especia de API de ellas (http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011/compiler_c/index.htm#intref_cls/common/intref_sse2_int_load.htm) y leyendo otras cosas(http://fastcpp.blogspot.comhttps://developer.apple.com/hardwaredrivers/ve/sse.html) entendí su funcionamiento. Las intrucciones son capaces(segun leí y entendí) de procesar 4 flotantes a la vez o 2 doubles.

Mi tesis usa floats, asi que programé lo siguiente:

float Metaheuristic::euclideanDistance(float* v1, float* v2)
{
    __m128 sum = _mm_setzero_ps(), square;
    for(register int k = 0; k < M; k+=4){
        square = _mm_sub_ps( _mm_load_ps(v1 + k), _mm_load_ps(v2 +k));
        sum = _mm_add_ps(_mm_mul_ps(square,square), sum);
    }
    sum = _mm_sqrt_ps(sum);
    _mm_store_ps(eDistance, sum);
    return eDistance[0];
}

Surgieron un montón de problemas para lograr que éesto funcionara. El principal fue que los arreglos que usan estas instrucciones deben tener tamaño divisible entre 4, ya que se cargan los 4 flotantes a los registros. Cambie gran parte del codigo para que a la hora de crear los objetos se cumpliera esta condición y probé de no tener leaks o errors en la memoria usando valgrind. Cuando ya no tuve problemas y los resultados de las corridas tenían coherencia, observé los tiempo. Una imagen que me corria antes en 1 – 2 segundos pasó a 10 segundos !

Mi intento por optimizar el codigo fue fallido, pero aprendi algo. Para mi la razón de que no funcionara muy bien es que los arreglo en realidad eran arreglos de tamano 1 o 3 transformados a 4. Más tiempo se perdía en la carga y cálculo que el que ganaba de tener la capacidad de procesar 4 cosas a la vez. Eso que hasta intente tener las cosas aleanadas a 16 bytes y nada ! Por supuesto que es posible que halla hecho algo mal, pero ahora no tengo mucho tiempo para seguir jugando con el código, ando full de otras cosas.

Espero que ésto sea de ayuda

Cómo echar código

Un buen rato sin escribir, estar jugando LoL y otras mil cosas no me da mucho tiempo que digamos.

Ando leyendo un libro llamado Clean Code: A Handbook of Agile Software Craftsmanship, el cual se lo recomiendo a toda persona que programe.

En la universidad a uno solo le dicen haz tal cosa y uno mediante google y los conocimientos que se tienen lo hace como puede. Principalmente casi siempre se empieza el código desde cero y donde yo estudie casi siempre es en parejas.

En la vida real las cosas no son así o por lo menos las situaciones que he vivido me han demostrado eso. Usualmente uno va a trabajar con código ajeno que en su vida ha visto. Y acá creo que surge un problema muy común: entender el código ajeno y dar a entender el de uno.

En mi opinión es MUY importante. Siempre se quiere que el trabajo sea de la forma más rápida posible, con la mayor calidad y que sea de forma confortable. Eso depende de entender cosas que tienen puesta los demás y que uno escriba de forma que los otros también les quede claro. Este libre que comente al principio da una serie de tips muy buenos de como hacer esa tarea. Da una serie de ejemplos de código malo y con una serie de cambios logra que sea mucho más fácil de entender. Como todo uno toma lo que desea y lo aprende, es muy posible que algunos tips a uno no le gusten y otros sí. Por donde voy en verdad creo que muchas cosas que habla son en realidad excelente recomendaciones. En muchos casos se sacrifica eficiencia por legibilidad, lo cual en mi opinión siempre depende de lo que uno haga, pero en muchos casos es algo necesario.

Echarle un ojo nunca está demás y creo que en las universidades debería tocarse muchas cosas de esto, en vez de escribir comentarios que siempre se escriben para salirse del paso de ese requerimiento y en muchos casos no quedan claro las cosas.

Cosas interesantes que he aprendido

Éstos últimos días en el trabajo como tal no he averiguado muchas cosas nuevas, pero quisiera mencionar algunas cosas interesantes:

  • Leí como funcionaba el protocolo OAUTH, el cual es usado por Facebook, Twitter, Google, etc. que consiste en la autentifícación de usuario fuera del proveedor de un servicio web para un tercero(consumidor). El ejemplo más común es el poder autentificarte/registarte en alguna página mediante tu cuenta de FB. Super interesante lo que leí y conocer en cierto modo su funcionamiento general ya que la forma en que es aplicado varía de cierta forma entre quienes lo ofrecen. Facebook da un uso bastante sencillo.
  • Éste mismo día mi jefe encontró un artículo sumamente interesante de como hacer consultas eficientes cuando se necesita tomar elementos de una tabla de forma aleatoria. El link es el siguiente: http://blog.rhodiumtoad.org.uk/2009/03/08/selecting-random-rows-from-a-table/
  • Hace un rato que conseguí este excelente artículo: http://blog.zx2c4.com/749. De verdad que impresionante lo que el conocimiento y curiosidad pueden lograr.
  • Tuve una gran noticia: es mu factible que haga un publicación de ciertas cosas hechas en mi tesis. Hare un artículo con mi compañero de tesis y tutora usando el algoritmo genético y abaje para Data Clustering de datos numéricos. Veamos que tal sale eso 🙂
  • Y bueno siguiendo a las personas de Anonymous por twitter he visto como tumban páginas web usando XSRF y SQL Injections. Eso me acordó del siguiente artículo que hace un rato conseguí: http://google-gruyere.appspot.com/
  • Me sucribí al curso de seguridad y machine learning que ofrecerá Standord

Configurando diversas máquinas virtuales y vigilarlas con puppet

Este sera mi primer post,

Les explico en el trabajo, producción consta de diversas máquinas (usan ubuntu), en las cuales corren diversas cosas:

nginx

haproxy

uwsgi

python

Usualmente ocurren problemas que hacen que se caiga todo y eso causa mucha molestia, ya que la mayoría de las cosas para levantarlas de vuelta, es necesario hacerlo mano.

Por ello se decidió usar alguna herramienta de administración automática, pero primero se tenía que montar el ambiente de pruebas. Se uso VirtualBox.

Se hizó lo siguiente:

  1. Se creó una imagen base
  2. La máquina donde se colocan las máquinas virtuales no tiene X, por lo que todo se hizo por cónsola, cosa que era necesaria ya que la idea es hacer un shell script que teniendo la imagen base cree el resto de las cosas. En las máquinas creadas se agregó la clave pública, que es la misma en todas las máquinas creadas, en .ssh/authorized_keys de forma que no preguntara el password a la hora de usar ssh y además se quitó la necesidad de tener que colocar clave para hacer sudo. Tardó un buen rato ver la manera más eficaz y sencilla de crear las cosas mediante VirtualBox (se copia el disco duro, el archivo .vdi),  además lograr darle las capacidad de que tomen ip propia de la red usando la configuración bridged . El problema es que hay que eliminar un archivo en /etc/udev/rules.d/70-net… (no me acuerdo bien), de forma que tomaran una macadress única y el servidor dhcp diera ip distintas. Luego cada una se le agregan los hosts a /etc/hosts para que cada una se comunicara con las otra sin la necesidad de colocar alguna ip.
  3. A cada máquina se le creo un script que la configurar con las consas necesarias. También se tuvo que crear 3 servicios, que reiniciaran diversas cosas que no corren como demonios, eso también robó un buen rato, la mejor forma de correr programas como demonios es start-stop-daemon, permite darle toda la configuración necesaria.
  4. Ya con las máquinas corriendo las cosas, la tarea era ver que herramienta usar para la administración automática usar. Existen varias. Se empezó a leer de CFEngine, la cual es conocida y es muy capaz. Estuve un buen rato leyendo su documentación y todo el mundo la pintaba como una maravilla, cosa que no dudo. Pero debo decir que la documentación es muy básica y mala, no me agradó en nada. El lenguaje de programación que usa, está basado en la teoría de promesas. Éste es no intuitivo y complicado en su forma de uso. Tiene cosas muy complejas que se pueden hacer con el. Pero lo que menos me gustó, fue que todos los ejemplos que conseguí eran para probar y no lo que buscaba:  algo que estuviera cada cierto tiempo vigilando el sistema y lo recuperará, avisando de todas formas que paso algo.  Leí y si tiene la capacidad, pero no conseguí un ejemplo práctico.
  5. Al ver no lograr nada, decidí tomar otro camino usando otra herramienta. Me tope con otras dos muy usadas: chef y puppet. Ambas están escritas en ruby. Busque full información de ambas. Unos amaban chef y otro puppet. A la final tome la decisión de usar puppet por diversas razones: el lenguaje es MUY fácil, es MUY usado y esta apoyado por google y otras compañías. Chef recién salió, y fue creado por una persona que estuvo involucrado con puppet, pero sentía que le faltaba.  Me parece algo complejo también además, y por no se muy viejo, podía tener falta de documentación.

Configurando puppet

Puppet es super fácil de configurar. Su arquitectura consta de dos componentes:

  • Servidor(es) maestro(s)
  • Cliente(s)

Lo primero es instalar las cosas en cada máquina.

Configurando el servidor maestro

Instala lo siguiente:

aptiude install puppetmaster

Luego edita el archivo /etc/puppet/fileserver.conf agregando que direcciones de ips quieres permitir.

Een mi caso: allow 192.168.24.0/24. (ejecuté el comando sed -i ’12s/#  allow 192.168.0.0\/24/allow 192.168.24.0\/24/’  /etc/puppet/fileserver.conf)

Finalmente a edita /etc/puppet/puppet.conf y agrega al final las siguientes líneas:

certname=servidormaestro

autosign=false

Ésta última anda por default, pero para estar seguro. Eso es para que se tenga que certificar a los nodos.

Configurando los clientes

Instala lo siguiente:

sudo apitude install puppet

Luego edita el /etc/puppet/puppet.conf

En la sección [main] agrega

server=servidormaestro

runinterval=segundos

Se puede ejecutar:

sudo sed -i '/\[main\]/a\server=servidormaestro' /etc/puppet/puppet.conf
sudo sed -i '/server=servidormaestroa\runinterval=60' /etc/puppet/puppet.con

Y agrega la siguiente sección:

[agent]

certaname=nombre del cliente

Puedes ejecutar:

sudo sh -c "echo \"[agent]\ncertname=${NAME}\" >> /etc/puppet/puppet.conf"

Ésta última para indicar cada cuantos segundos uno quiere que puppet se ejecute.

Recuerda ejecutar lo siguiente:

sudo sed -i 's/START=no/START=yes/g' /etc/default/puppet

Agregando los certificados

Luego de un rato los clientes hacen una petición al sevidor y se va a emitir un falló. Éste sucede porque puppet usa certificados y el servidor debe agregar a los clientes. Para ello primero en los clientes ejecuta:

sudo service puppet stop
sudo puppetd --waitforcert 30 -v
sudo service puppet start

Después en el servidor

for mc in `sudo puppetca --list | sed 's/([A-Z0-9:]*)//g'`
do
 sudo puppetca --sign ${mc}
do

Probando

En el servidor crea las carpetas /etc/puppet/modules/nginx/manifests (sudo mkdir -p /etc/puppet/modules/nginx/manifests) . Ahí crea el archivo init.pp (si tiene que ser este nombre sino no lo importa). Si quieres colocarle el nombre que desee debes importarlo así include ngnix::nombre y tener el archivo dentro de /etc/puppet/modules/nginx/manifests

Ahí coloca lo siguiente:

class nginx
{
 package
 {
    "nginx":
     ensure => installed
 }
 service
 {
     "nginx":
     ensure => running,
     hasrestart => "true",
     enable => "true",
 }
}

Luego en /etc/puppet/manifests crea dos archivos nodes.pp y site.pp (ambos son convención de puppet)

En nodes colocas como el va a mapear los nodos que se conoecten. Supongamos que la máquina que queremos que reinicie el nginx si se cae se llama, clienteweb. Para ello se coloca lo siguiente en el archivo:

node /^clienteweb/
{
 include nginx
}

Algo muy bueno es que se pueden colocar expresiones regulares, lo que facilita muchísimo.

Finalmente en site.pp colóca lo siguiente:

import "nodes.pp"

Ahora procede a probar que las cosas anden bien, para ellos puede tumbar el servicio puppet y correr puppetd -t, que es para hacer pruebas. Algo muy bueno ademas es que puppet tiene opción de debugeo (-debug), cosa fenomenal.

En teoría si configuraste todo como debías si tumbas los sevicios en clienteweb, despues del tiempo que colocaste, este debe reiniciarse.

Espero que esto sea de ayuda,  hasta luego