Espacio de tecnologia, software libre y sus derivados. Una horda de monos entrenados escriben de vez en cuando por aqui algunas noticias, opiniones e incluso alguna que otra cosa fuera del tema. Maqueros, favor de abstenerse que no somos lo suficientemente guapos.

Piano daemon

Formas mas usuales de encriptacion sobre sistemas GNU/linux

Aqui les hablare de las 3 mas comunes formas de encriptacion de datos, que actualmente conosco.

  •    Funciones Hash
  •    Cifradores simetricos
  •    Cifradores asimetricos

Funciones Hash
Las funciones hash son faciles de computar pero dificil de aplicarles ingenieria en reversa.
Aque me refiero con esto?, lo explicare con un ejemplo sencillito sobre sistemas linux:

$ echo "Esto se encriptara mediante una funcion hash" | md5sum
f538fb4f2360fcbb3af0f31cdd479829
$ echo "Esto se encripta mediante una funcion hash" | md5sum
fa5f1a88d876d3974a501b3a9c140e2a

Observemos que la cadena introducida via pipe a el comando md5sum nos ha generado un valor hexadecimal, este valor dificilmente podria llegar a ser igual a otro, que quiero decir con esto? Que no hay dos cadenas que computen el mismo valor. Matematicamente podrias llegar a la siguiente deduccion:

f(x) = valor_resultante_para_x_unico

o bien

md5sum("cadena_a_encriptar") = valor_resultante_para_cadena_a_encriptar_unico

hash_funccion

Uso comun
Un uso muy comun de esto, lo puedes ver cuando te has bajado una distribucion linux. En los servidores ftp donde se pone a disposicion la descarga de las imagenes de los DVDs que componen a una distribucion linux, tambien se te ofrecen los valores hash md5 que corresponden a cada imagen, una vez que has descargado una de las imagenes… Habras de comparar que estas imagenes te den el valor md5 indicado por los fabricantes de dicha distribucion linux.

$ md5sum redhat5.1.iso
fa5f1a88d876d3974a501b3a9c140a2d

Si el valor fa5f1a88d876d3974a501b3a9c140a2d es el que indica el fabricante de la distribucion linux, entonces la imagen que hemos de quemar en un dvd virguen, es la correcta… pero si el valor no es el indicado por el fabricante… lo mas probable sera, que te estes bajando un fichero imagen corrupto, o en el peor de los casos… una copia alterada por alguien que ha vulnerado el servidor ftp.. y te ha colocado un backdoor sobre la distribucion que aun no te has instalado.

Cifrados Simetricos

Un Cifrado Simetrico es una transformacion, que fue llevada a cabo por un llave secreta, Esta llave traduce su entrada conocida como texto plano, a un salida conocida como texto cifrado, de esta manera excluimos el criptoanalisis(accion contraria a la criptografia..) , solo aquella entidades que posean la llave secreta podran recobrar el texto plano que esta oculto sobre el texto cifrado.

Cifrado Simetrico

Los Cifrados Simetricos tienen una larga historia, y han mutado en variantes de los mismos bastante interesantes.. una de estas variantes es el triple-DES… muy usado por routers de prestigio hoy en dia.

Cifradores Asimetricos

Un cifrador asimetrico es semejante a un cifrador simetrico, pero el asimetrico ejerce su poder en el uso de un par de llaves.. y no solo una llave como lo hace el simetrico.

El par de llaves a las cuales hago referencia son las siguientes:

  •    Llaves Publicas -- Usadas para encriptar el texto plano
  •    Llaves Privadas -- Usadas para desencriptar el texto cifrado

Las llaves son generadas de una manera sencilla, lo cual permite deducir cual es la llave privada y cual es la publica. Aplicarle ingenieria en reversa a estas llaves, es algo sumamente dificil.
Esta fabulosa propiedad permite a la gente el intercambiar sus llaves publicas sobre canales o comunidades y mantener conductos de comunicacion completamente privados.

Los mas notables sistemas de cifrado asimetrico inclullen funciones Diffie-Hellman y RSA (como openssl). Los sistemas de encriptacion asimetrica son usados comunmente para intercambiar llaves de sistemas simetricos.

En mi Experiencia con Ruby on rails

Mucha gente se centra en procesos de ingeniería de requerimientos para conseguir mejores requerimientos con la esperanza de que esto prevenga la necesidad de cambiar el diseño más tarde. Pero incluso esta dirección no lleva a ninguna cura. Muchos cambios de requerimientos imprevistos ocurren debido a cambios del negocio. Aquellos no pueden ser prevenidos, incluso con un cuidadoso proceso de ingeniería de requerimientos.

Entonces todo esto hace que el diseño planificado parezca imposible. Seguramente estos son desafíos grandes. Pero no me inclino a decir que el diseño planificado es peor que el diseño evolutivo comúnmente practicado de la forma “codificar y arreglar “. De verdad prefiero el diseño planificado al ” codificar y arreglar “. Sin embargo soy consciente de los problemas del diseño planificado y busco una nueva dirección.

A razon de esto la propuesta de Rails me parece algo muy cercano a la utopica idea de un diseño que permita prevenir cualquier cambio en el futuro de un App web. Hago incapie en la palabra aplicacion web.En ningun momento lo recomiendo como una solucion general a toda la solucion tecnologica que se proponga a grandes necesidades.

Rails me parece perfecto. Para ser el participante ideal… en todas aquellas aplicaciones que deberian fungir como mecanismo de captura de los datos del dia a dia de los negocios que asi lo requieren…

Las aplicaciones en Java tienen la capacidad de formar parte de una solucion y a su vez ser todas partes de la misma.

Aunque rails nos permite crear aplicaciones web de una manera muy rapida este no cubrira todos las posibles encomiendas de una solucion.

Como usar RMI en java (llamada a procesos remotos)

Esta fue una pequeña guia que surguio en base a que un amigo me pregunto que ondas con RMI de java…. Esta guia la realice con java 1.4.X

No cambia mucho en versiones posteriores.

Generando los codigos necesarios para la Parte Servidor
En la parte servidor generaremos tres ficheros java…..

Fichero 1 — CalculadoraRMI.java
Lo primero sera generar una interface que Herede todos los metodos publicos de java.rmi.Remote

import java.rmi.*;

public interface CalculadoraRMI extends Remote{

    //Método encargado de sumar...
    public int Suma(int x, int y) throws RemoteException;

    //Método encargado de restar...
    public int Resta(int x, int y) throws RemoteException;
}

Fichero 2 — ImplementacionCalculadoraRMI.java
Lo segundo sera generar una clase que implemente la interface RMI (en nuestro caso Calculadora RMI)
Esta clase tambien debera heredar de UnicastRemoteObject

import java.rmi.server.*;
import java.rmi.*;

public class ImplementacionCalculadoraRMI extends UnicastRemoteObject implements CalculadoraRMI{

    /** Creates a new instance of ImplementacionCalculadoraRMI */
    /** Notece que el constructor tambien tomara la
        la excepcion remota si es que algo fallace
        en la construccion de una instancia de esta clase */
    public ImplementacionCalculadoraRMI() throws RemoteException {
        // Ejecutamos el Construcctor de la clase padre
        super();
    }

    //Método encargado de sumar...
    public int Suma(int x, int y) throws RemoteException{
        return (x + y);
    }

    //Método encargado de restar...
    public int Resta(int x, int y) throws RemoteException{
        return (x - y);
    }
}

Fichero 3 — ServidorCalculadoraRMI.java
Aqui implementaremos el programa que fungira como Servidor
de los metodos remotos que ofrece nuestra calculadora

import java.rmi.Naming;

public class ServidorCalculadoraRMI {

    /** Creates a new instance of ServidorCalculadoraRMI */
    public ServidorCalculadoraRMI() {
        try {
            //Creamos la instancia de ImplementacionCalculadoraRMI...
            ImplementacionCalculadoraRMI imp_remote_calc = new ImplementacionCalculadoraRMI();

            //Le asignamos un nombre a la instancia para su uso remoto...
            Naming.rebind("rmi://localhost:1099/CalculadoraRMI",imp_remote_calc );
            }
            catch (Exception e) { System.out.println("Problema: " + e); }
    }

    public static void main(String args[]) {
        new ServidorCalculadoraRMI();
    }
}

Generando los codigos necesarios para la parte Cliente de RMI

Fichero 4 — ClienteCalculadoraRMI.java

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;

public class ClienteCalculadoraRMI {

    /** Creates a new instance of ClienteCalculadoraRMI */
    public ClienteCalculadoraRMI() {
    }

    public static void main(String[] args) {
        try{
            //Obtener la instancia del servidor...
            CalculadoraRMI calculadora = (CalculadoraRMI)Naming.lookup("rmi://localhost:1099/CalculadoraRMI");

            //Llamamos entonces a los metodos de nuestra instancia
            // obtenida via RMI
            System.out.println("Imprimiendo resultado de Resta:" + calculadora.Resta(3,1));
            System.out.println("Imprimiendo resultado de Suma:" + calculadora.Suma(3,1));

            // Aqui cachamos las posibles Excepciones que se pudieran dar..
        }
        catch(RemoteException re) {
            System.out.println("RemoteException: " + re);
        }
        catch (MalformedURLException murle) {
            System.out.println("MalformedURLException: " + murle);
        }
        catch (NotBoundException nbe) {
            System.out.println("NotBoundException: " + nbe);
        }
        catch (java.lang.ArithmeticException ae) {
            System.out.println("java.lang.ArithmeticException: " + ae);
        }
    }

La ventaja de RMI.. es que al ser el cliente java y el servidor
java… se puede transmitir entre ellos tipos de datos complejos
Ya que si usasemos webservices … solo podriamos transmitir entre
cliente y servidor los tipos de datos especificados en la especificacion
SOAP.

:)

Elabore esta guia rapida sobre RMI… para analizar los alcances del mismo
y la camparacion que hacen a veces de ellos con los webservices.

Convertir un String a un tipo Document (xml data type) en java java dooooo

Anexo el siguiente codigo… que no es la gran cosa… pero estoy seguro que algun amigo sobre la red… dara tarde o temprano con esto… y lo mas seguro es que le sea de utilidad…

public Document Convert2Xml(String xml){
	Document document = null;

        try {
             DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
             DocumentBuilder builder = factory.newDocumentBuilder();
             document = builder.parse(new InputSource(new StringReader(xml)));
        }
        catch (Exception e) { Logger.log(Logger.DEBUG,"Imposible convertir cadena a tipo de dato XML: " + e.getMessage()); }
            return document;
        }

Los imports utilizados fueron los siguientes:

import tid.sms.util.Logger;
import tid.sms.bd.*;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.*;
import org.xml.sax.InputSource;
import java.util.regex.*;
import java.util.Hashtable;
import java.util.ArrayList;
import java.net.*;
import java.io.IOException;

Recibiendo XML mediante un Metodo POST

En algunas App sobre servidores de aplicacion suele existir la necesidad de una API XML, es decir una Interfaz XML que reciba y realice las acciones necesarias en la App que corre sobre el servidor. Esta API debera ser capaz de recibir peticiones XML por protocolo http en algún puerto, las peticiones seran por método POST. El servidor deberá realizar todas las acciones pertinentes y responder de forma SINCRONICA a la petición.

He implementado una interface asi mediante el siguiente jsp:

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@page import="java.io.*"%>
<%@page import="java.util.*"%>
<%@page import="java.net.*"%>
<%@page import="tid.sme.scl.SCL"%>
<%@page import="tid.sms.util.Logger"%>

<%
    // Aqui se lee el flujo de datos recibidos en el POST request
    BufferedReader in = request.getReader();
    String requestLine = in.readLine();

    if (requestLine == null) {
        out.println("No se ha ingresado una Peticion XML");
        Logger.log(Logger.ERROR, "No se ha ingresado una Peticion XML");

    } else {
       // Codigo que hara... algo con el flujo XML recibido
        String cadena_solicitud =  requestLine;

        SCL soul = new SCL();

        soul.AnalizeXmlFromServlet( soul.Convert2Xml(cadena_solicitud) );

        String cadena_retorno = soul.Response2Petit();

        // Lo que nos respondera nuestro servidor en base
        // al XML que le hemos mandado
        out.println( cadena_retorno );

    }
%>

Asi le he mandado el flujo XML de peticion a mi jsp ( tambien esto podria hacerce en un servlet.. )

curl -d @/home/envio/xmlprueba.xml http://rome/envioSMS/scl.jsp

Curl es algo asi como un navegador en linea de comandos… pero sin ser un navegador :p

Escribir un Java Servlet… de la manera mas elemental

Para escribir un java servlet no requieres herramientas como netbeans o eclipse… aunque debemos de aceptar que estan ayudan bastante…..

Aqui el codigo de un java Servlet explicado por partes:

import java.io.*;
import java.util.*;

// Paquetes javax requeridos
import javax.servlet.*;
import javax.servlet.http.*;

// Para implementar un servlet es requerido
// el hacer una clase que
// herede sus metodos de la clase HttpServlet,
// si queremos que nuestro
// Servlet tenga algun comportamiento caprichoso..
// entonces bastara con
// sobreescribir metodos de la clase heredada.

public class TestingServlet extends HttpServlet {
  public void doGet(HttpServletRequest request,
    HttpServletResponse response)
    throws ServletException, IOException {

// Las instancias de  PrintWriter nos ofrecen
// metodos para mandar flujos de texto a
// Clientes HTTP
    PrintWriter out = response.getWriter();

// Esto se imprimira en el navegador que consulte
// al servlet... este funcionara como STDOUT ahora!
    out.println("HTML tag");
    out.println("HTML tag");
    out.println("HTML tag");
    out.println("Welcome to the Servlet Testing Center");
    out.println("HTML tag");
// Aqui finaliza las lineas que se escriben
// sobre la navegador cliente

  }
}

Compilando el Servlet
Para esto solo bastara indicarle al compilador de java, la ruta en que se encuentran las clases requeridas para implementar un servlet

/usr/jvm/j2sdk1.4/bin/javac -classpath /opt/tomcat/common/lib/servlet.jar TestingServlet.java

Ahora el producto de esto es un servlet que podras deployar(este verbo no existe… son pendejadas mias), esta compilacion te ha generado un fichero TestingServlet.class que has de meter sobre el directorio de clases de una app web declarada en tu servidor Tomcat.

Nota adicional: Si deseas ahorrarte el parametro classpath a la hora de la compilacion… puedes optar por agregar tu directorio de librerias de tomcat al classpath como lo dicen aqui en Sonido libre

Que son las HTTP Requests y HTTP Responses?

Me he visto en la necesidad de meterme mas a java java do con Tomcat y JBOSS… por lo que empezare a documentar todas mis allasgos. Algunos de ustedes ya usan java… pero muchos de ustedes no la han usado para el desarrollo web. Empezaremos entonces por lo mas elemental…

Que son las HTTP Requests ?

Una transaccion inicia con una solicitud realizada por el cliente http (internet explorer, mozilla o curl) y finaliza con l respuesta del servidor HTTP. Una solicitud HTTP consiste de 3 componentes:

     •   Metodo——URI—Protocol/Version
     •   Encabezados de Solicitud (Request headers)
     •   El cuerpo del documento html (Entity body)

Un ejemplo de solicitud HTTP es la siguiente:

GET /servlet/default.jsp HTTP/1.1
Accept: text/plain; text/html
Accept-Language: en-gb
Connection: Keep-Alive
Host: localhost
Referer: http://localhost/ch8/SendDetails.htm
User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)
Content-Length: 33
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
LastName=Franks&FirstName=Michael

El metodo —URI—version de protocolo aparece sobre la primera linea de la solicitud.

GET /servlet/default.jsp HTTP/1.1

Donde GET es el metodo de solicitud, /servlet/default.jsp representa la URI y la version de protocolo es HTTP/1.1

La URI especificara un recurso de Internet. Una URI es usualmente interpretedo en base al root relativo del directorio del sevirdor.

Y los encabezados de solicitud serian lo siguiente:

Accept: text/plain; text/html
Accept-Language: en-gb
Connection: Keep-Alive
Host: localhost
Referer: http://localhost/ch8/SendDetails.htm
User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)
Content-Length: 33
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate

Y finalmente… la entidad cuerpo de nuestra solicitud HTTP:

LastName=Franks&FirstName=Michael

Existen mas metodos para request HTTP… cada uno con un peculiar proposito… puedes ver mas info de ellos en esta liga –> http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

En un munto utopico toda solicitud tiene una Response — HTTP Responses
Similar a la solicitud HTTP, una respuesta HTTP consite de tres partes:

    •    Protocolo—Codigo de Estado——Descripcion
    •    Encabezados de respues (Response headers)
    •    Un Cuerpo (Entity body)

El siguiente es un ejemplo de respuesta HTTP:

HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Mon, 3 Jan 1998 13:13:33 GMT
Content-Type: text/html
Last-Modified: Mon, 11 Jan 1998 13:23:42 GMT
Content-Length: 112

Welcome to Brainy Software y aqui algo de html tags si lo deseas...

La primera linea del encabezado de respuesta es similar al encabezado de solicitud. Y los encabezados de respuesta contiene similar a los encabezados de solicitud.

La entidad Cuerpo sera el texto o la respueta HTML que se da en base a la solicitud. Los encabezados y el cuerpo son separados por una secuenia de CRLFs.

Maximo numero de fibonacci de 20 digitos

JAJAJA la pregunta de los 64,000

Resolve correctamente este problema y tendrás la oportunidad de formar parte de nuestros proyectos on site para las compañías de las mejores ligas. “Sea X el máximo número de Fibonacci con exactamente 20 dígitos” Envíanos tu CV a mexico@globant.com; cuéntanos como encontraste X.

pianodaemon@mayte:~$ python fib.py
83621143489848422977

Aqui el programita en python que hace la maravilla (de 5 a 10 minutos tomo hacerlo… mientras mi esposa preparaba el desayuno..).

#!/usr/bin/python
def fib(n):    # write Fibonacci series up to n
	"""Print a Fibonacci series up to n."""
	lista_resultados=[]
	a, b = 0, 1
	while b < n:
		lista_resultados.append(b)
		a, b = b, a+b
	return lista_resultados

lista_numero_veinte_digitos = [ ]
for numero in fib(999999999999999999999999999999999):
	numero_cadena = str(numero)
	if len(numero_cadena) == 20:
		lista_numero_veinte_digitos.append(numero_cadena)
print lista_numero_veinte_digitos[-1]

Otros super Track de Psy

http://youtube.com/watch?v=9xxENiPxxWo&feature=related

Esto es para que se despierten……….

CMMI v1.2 — Metas de Negocio y Objetivos

La mayoria de las organizaciones solo inician procesos, pero no tienen muy en claro los objetivos definidos del negocio. En consecuencia, a menudo escucharemos a ejecutivos, que la manera de mejorar un proceso es el recorte de personal, entonces la gente que sobrevive a este corte de personal debera de ser mucho mas productiva ( esto quiere decir… hacer mucho mas trabajo en menos tiempo). Y por supuesto,,,, esto de hacer mas trabajo en manos tiempo no inclulle al ejecutivo que se le ocurrio la maravillosa idea de recortar personal.

OJO y nota importante: En la mejora de un proceso no se permite la reduccion de fuerza laboral de una manera significatiba. Ya que al tener una organizacion mas gente (..si pensamos que este recorte de personal jamas sucedio…) esta podra estructurar mucho mejor la mejora de sus procesos y funcionar adecuadamente, Entonces podriamos decir que la Meta de Negocio de reducir personal es altamente erronea ya que nos aleja mas del objetivo de mejorar significativamente los procesos.

Entonces como definir las Metas de Negocio?
Existe una tecnica…. asi es… ya no te preocupes existe una.. :p….. su nombre es “Preguntas Metricas de Meta”. En esta tecnica durante una reunion de trabajo los mas comunes problemas de trabajo encontrados en una organiacion son expuestos, y se realizaran preguntas en base a cada uno de estos problemas, entonces es aqui donde entra el CMMI para la mejora de los procesos en dichas areas que adolecen de los problemas mencionados en la junta de trabajo.

Aqui un ejemplo muy basico:

Problema: No podemos mantenernos operativos con el numero de requerimientos de cambios.
Objetivo: Mejorar nuestros proceso de requerimientos de cambios.
Question: Se puede mejorar nuestro proceso de requerimiento de cambios?
Metrica: Number of requirements changes submitted, approved, implemented,
or canceled versus the number of original requirements documented. Time it
takes to implement a change in requirements.
Areas de proceso asociadas: Requirements Management (Level 2), Project Plan-
ning (Level 2), Product and Process Quality Assurance (Level 2), Require-
ments Development (Level 3).

:)

Espero que todo lo anterior les quedace claro ya. Hasta luego

« Entradas anteriores · Entradas mas recientes »