Tuesday, January 20, 2015

Tutorial para aplicaciones ASP.NET MVC 4

Buscando un buen tutorial para desarrollar aplicaciones ASP.NET MVC 4, terminé encontrando el siguiente: http://www.pluralsight.com/courses/mvc4-building
Es muy interesante la introducción "para dummies" que realiza, desde como instalar el ambiente Visual Studio hasta desarrollar por completo una primera aplicación MVC. Totalmente recomendado.

Sunday, June 15, 2014

Problema con delay en Arduino Nano

Trabajando últimamente con Arduino Nano y queriendo de alguna forma "explotar" a fondo sus características, me crucé un problema particular. Mi objetivo era hacer andar un display lcd de 16x2 junto con 5 sensores DHT11. El problema más clásico que sufrí fue que la aplicación se quedaba en cierto punto y no avanzaba. Haciendo diversas pruebas, llegué a que el problema se encontraba en la clásica función de Arduino delay. Esta función se encarga de pausar el controlador por X milisegundos y se suele utilizar imperativamente en ocasiones como la lectura de sensores, para que no se realicen lecturas continuamente ya que puede llegar a leerse información basura. Investigando un poco, encontré que esta función no es muy recomendable utilizar en este tipo de micro-controladores.

Era necesario encontrar una forma alternativa de "esperar" o detener el micro-procesador unos cuantos milisegundos en distintos puntos del programa. Esta es la solución para aquellos que se encuentren con este tipo de problemas:
Supongamos que estabamos utilzando delay(1000), es decir, espera de 1 segundo. Esto puede ser reemplazado por lo siguiente:

unsigned long Timer=millis();

while (!(millis()-Timer>=1000UL)){
}

La variable Timer toma los milisegundos actuales del programa. Luego se realizará la comparación de dicho valor con los milisegundos futuros y no se avanzará en la ejecución del programa hasta que haya una diferencia de 1000 entre ambos valores. UL indica que la variable es unsigned long, para tener compatibilidad de tipos.

Saludos y nos vemos pronto.


Monday, April 7, 2014

Configurar Etherner Shield ENC28J60 con Arduino MEGA 2560



Después de tanto buscar en inet como lograr hacer funcionar mi Ethernet Shield ENC28J60, logré encontrar la solución y la posteo acá porque sé que a alguien le servirá en algún futuro cercano. Para los que tengan dudas si su Shield es el adecuado, trabajé con el HanRun HR911105A 09/48, pero seguramente sirva para otros modelos. Acá una foto para más claridad:
Las conexiones con Arduino Mega 2560 son las siguientes:
GND -> GND
3.3 -> Vcc
SO -> Pin 50
SI -> Pin 51
SCK -> Pin 52
CS -> Pin 53
Los otros cuatro pines (INT, RESET, WOL, CLKOUT) quedan sin conectar.

La librería que se usará es la EtherCard, que la pueden bajar aquí: https://github.com/jcw/ethercard
Esta librería funciona sin problemas para placas Arduino UNO y quizás para algunas más, pero existe un pequeño inconveniente con las placas MEGA. En las placas Arduino MEGA, está mal configurado el pin CS, lo que genera que si se utiliza la librería con los ejemplos que trae, no vaya a funcionar jamás. Para arreglar dicho inconveniente, el método ether.begin que inicializa al Shield debe recibir un parámetro extra indicando la modificación del pin CS. Los encabezados deberían quedar de la siguiente forma:

...
  if (ether.begin(sizeof Ethernet::buffer, mymac, 53) == 0)
    Serial.println( "Failed to access Ethernet controller");
...

Normalmente, dicho seteo suele estar en la función setup del Arduino. Lo que se hizo fue agregar un parámetro más al final del llamado a la función begin, que indica a que pin debe conectarse CS.

Finalmente, para verificar que el Arduino trabaja correctamente, pueden cargar el siguiente código:

#include <EtherCard.h>

// ethernet interface mac address, must be unique on the LAN
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31  };
static byte myip[] = { 192,168,2,188 };

byte Ethernet::buffer[500]; 
BufferFiller bfill;                   

void setup () {
  if (ether.begin(sizeof Ethernet::buffer, mymac, 53) == 0)
    Serial.println( "Failed to access Ethernet controller");
  ether.staticSetup(myip);
}

static word homePage() {
  bfill = ether.tcpOffset();        
  bfill.emit_p(PSTR(                  
"<!DOCTYPE html>"
"<html>"
    "<head>"
    "<style>"
    "body {"
    "font-size:100%;"
    "font-family:arial;"
    "}"
    "</style>"
    "</head>"
    "<body>"
        "<div >Hello World!</div>"
    "</body>"
"</html>"
    ));
  return bfill.position();
}

void loop () {
  word len = ether.packetReceive();
  word pos = ether.packetLoop(len);
  
  if (pos)  // check if valid tcp data is received
    ether.httpServerReply(homePage()); // send web page data
}

En mi caso, conecté la salida del Ethernet Shield a mi router y desde mi computadora, ingresando la IP indicada en el código, correspondiente al Arduino, logré entrar y ver la respuesta HTML. Es posible incluso pasar parámetros a la función emit_p y referenciarlos desde el HTML de la siguiente forma:

  bfill.emit_p(PSTR( 
"<!DOCTYPE html>"
"<html>"
    "<head>"
    "<style>"
    "body {"
    "font-size:100%;"
    "font-family:arial;"
    "}"
    "</style>"
    "</head>"
    "<body>"
        "<div >$D $D</div>"
    "</body>"
"</html>"
    ), "Hello ", "World!");  

Al final de la función se puede pasar una lista (no importa la cantidad) de elementos. En el HTML, mediante $D se tomará al elemento correspondiente al número de aparición de $D. En este caso, el primer $D toma el valor "Hello " y el segundo el valor "World!".

Dejo la fuente que me permitió llegar a solucionar este problema, que es básicamente todo lo que dejé aquí: http://en.code-bude.net/2013/06/22/how-to-use-enc28j60-ethernet-shield-with-arduino-mega-2560/
Saludos!

Tuesday, October 2, 2012

Crear servicio con Tomcat + Axis2 + Testing con soapUI

A continuación explico como implementar un Hello World utilizando las herramientas Tomcat (para volcar servlets), Axis2 (encargada del soporte para creación de los servicios web) y soapUI (para el testeo del servicio). Previamente claro, se necesita haber tenido el JDK de Java.
Probado en Win Xp y 7.

Instalación y configuración:

  • Instalar Apache Tomcat. En este caso usé la última versión hasta el momento, es decir, la 7.
  • Descargar Axis2 tanto la Binary distribution como la War distribution. La primera contendrá una carpeta y la otra un archivo .war que necesitaremos para el binding con el Tomcat.
  • Descomprimir la Binary distribution de Axis2 en algún lado, lo mismo para el JDK que tuvo que haber sido instalado.
  • Setear las variables de entorno JAVA_HOME y AXIS2_HOME a los correspondientes directorios (JAVA_HOME con valor del directorio del JDK). 
  • Copiar el archivo 'axis2.war' a la carpeta webapps que se encuentra en el directorio donde fue instalado el Tomcat. Si el Tomcat está corriendo, entonces luego de haber pegado el archivo debería aparecer una carpeta con el nombre 'axis2'.
  • Ejecutar 'directorio_axis2\bin\axis2server.bat' que dará inicio al Axis2 (teniendo ya el Tomcat corriendo).
  • Para chequear que esta funcionando todo, desde el browser ir a 'localhost:8080/axis2' donde podremos ver el servicio Version corriendo. Dandole click al título del servicio accedemos al WSDL.
  • Instalar soapUI.

Hello World:

Tiramos una clase java tradicional HelloWorld.java:
public class HelloWorld{
               public String getData(){
               return "Hello World";
}
}

Compilamos con javac desde la consola (javac HelloWorld.java) y obtenemos nuestro HelloWorld.class precompilado.
Ahora necesitamos crear una carpeta en el mismo directorio que nuestro .class llamada 'META-INF' y dentro de la misma crear un 'service.xml' con la siguiente data:


<service name="Axis 2 HW">
<Description>
Axis2 hello world
</Description>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</messageReceivers>
<parameter name="ServiceClass" locked="false">HelloWorld</parameter>
</service>


Debemos comprimir en formato zip tanto la carpeta META-INF (con el xml dentro) y el HelloWorld.class. Luego renombramos el archivo a .aar. Tenemos el servicio creado.
Pegamos el servicio en directorio_Tomcat\webapps\axis2\WEB-INF\services , ya tenemos nuestro servicio activado.

Testing:
 Como ya dije, si entramos a localhost:8080/axis2 podremos tener acceso a la lista de servicios activos y si damos click en el título, tenemos acceso al wsdl del mismo.
Abrimos soapUI y creamos un nuevo proyecto pegando la dirección de nuestro wsdl.
Aparecerá la única operación de nuestro servicio: 'operate'. Si le damos doble click, podremos testearla dando click al botón verde.

Si hubieramos hecho algo con pasaje de parametros, al momento de testear aparecerán símbolos de pregunta o algún valor por default con el cual podremos cambiarlo y testear el servicio web.

Eclipse EE + Tomcat + Axis2:
Dejo una guía muy buena para trabajar con el WTP de Eclipse, Axis2 y Tomcat.
http://www.softwareagility.gr/index.php?q=node/21

Saludos.

Tuesday, August 14, 2012

Gridgain 4.2.1 + Netbeans 7.2 en Ubuntu 11.04

Hola, estreno este blog como un lugar donde tirar cosas que voy haciendo para que me sirva no solo a mi por si en algún momento necesito esta información sino también para aquel que sin querer y buscando información terminó accidentalmente aquí.

Entonces, paso a explicar paso a paso como setear la herramienta para map reduce Gridgain 4.2.1 usando el IDE Netbeans 7.2 en Ubuntu.

Una vez obtenido y descomprimido Gridgain (www.gridgain.com) lo primero va a ser setear las siguientes variables desde la consola:

export JAVA_HOME=/usr/lib/jvm/java-6-sun/
export GRIDGAIN_HOME=/home/okcerk/Escritorio/gridgain

*Nota: para no tener que hacer eso siempre, conviene editar el archivo /.bashrc y agregarle dichas lineas al final del mismo.

Asi luego solo nos hará falta ejecutar uno o tantos nodos como quisieramos (uno por terminal) simplemente ejecutando: bash GRIDGAIN_DIRECTORY/bin/ggstart.sh


Ahora simplemente trabajaremos con un ejemplo de los que trae el paquete de GG (un Hello World or whatever). Importamos las librerías necesarias: Add JAR/Folder y agregamos:
GRIDGAIN_DIRECTORY/gridgain-4.2.1e.jar
GRIDGAIN_DIRECTORY/libs/ (toda la carpeta)

Solo nos falta setear la variable GRIDGAIN_HOME en Netbeans. Vamos a las propiedades del proyecto y en la pestaña Run vamos a VM options - Customize: Agregamos la variable GRIDGAIN_HOME y en valor el directorio de la carpeta Gridgain.

Se compila y se corre. La ejecución en NB corre como un nodo más.