Posts Tagged ‘class’

Java: Calcular hash

Como ya nos instruyó Josep Rivas en un post anterior Generación de Hashes en Objective-C, el concepto de Hash debe de usarse para comprobaciones y no para almacenar datos por los motivos que ya se mencionaron.

Tanto como si queremos usar un hash para comprobar como para almacenar datos, en Java lo podemos hacer utilizando lo que se conoce como Clases Motor, como por ejemplo la clase MessageDigest. Las clases motor en criptografía Java se deben al concepto de Independencia y extensibilidad de los algoritmos (uno de los 2 conceptos básicos en que se basa la Arquitectura Criptográfica de Java (JCA), más información aquí). Esto significa que JCA nos ofrece unas clases que proporcionan la funcionalidad de servicios criptográficos.

En resumen, Java no proporciona las funciones MD5 o SHA-256 de forma directa (como lo hace php por ejemplo), sino que hay que tomar una clase que ofrece servicios e implementar las funciones o métodos usando los servicios de encriptación que nos ofrece esa clase.

Vemos un ejemplo para aclarar estos conceptos. Tomaremos como clase motor la clase MessageDigest. Crearemos una clase “encrypt” en la que implementaremos nuestros métodos de hash. Luego esta clase la podremos usar en nuestros proyectos Java, Android, etc. Para empezar crearemos un método para calcular el Hash de una cadena en MD5.

/** Import MessageDigest Motor Class **/
import java.security.MessageDigest;
public class encrypt {
/**
 * Public Method md5Str
 * ARG: String
 * RETURN: Hash of String
 */
      public static String md5Str(String str) throws Exception
      {
            // Create a MessageDigest with MD5 criptographic services
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            // Load values to MessageDigest
            md5.update(str.getBytes());           
            // Get Encrypted value and show it in hexadecimal
            StringBuilder sb = new StringBuilder();
            for (byte b : md5.digest())
                  sb.append(Integer.toHexString(0x100 + (b & 0xff)).substring(1));
            return sb.toString();       
      }
 }

Obtenemos de la cadena “Hello World” el siguiente hash MD5: b10a8db164e0754105b7a99be72e3fe5

La JCA permite los siguientes algoritmos en sus clases motor

  • MD2
  • MD5
  • SHA-1
  • SHA-256
  • SHA-384
  • SHA-512

Por lo tanto, rápidamente pasando un parámetro más a nuestra método, podemos obtener un método que nos muestre el hash de una cadena en función del algoritmo deseado:

      public static String hashStr(String str, String type) throws Exception
      {
            MessageDigest md= MessageDigest.getInstance(type);
            md.update(str.getBytes());
            StringBuilder sb = new StringBuilder();
            for (byte b : md.digest())
                  sb.append(Integer.toHexString(0x100 + (b & 0xff)).substring(1));
            return sb.toString();       
      }

IMPORTANTE: Hay que afinar el método para verificar que los valores de type son los esperados y no generemos errores o excepciones inesperadas.

Estos son los HASH generados con este último método para la cadena “Hello World”

  • encrypt.hashStr(“Hello World”, “MD2″));

MD2: 27454d000b8f9aaa97da6de8b394d986

  • encrypt.hashStr(“Hello World”, “MD5″));

MD5: b10a8db164e0754105b7a99be72e3fe5

  • encrypt.hashStr(“Hello World”, “SHA-1″));

SHA-1: 0a4d55a8d778e5022fab701977c5d840bbc486d0

  • encrypt.hashStr(“Hello World”, “SHA-256″));

SHA-256: a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e

  • encrypt.hashStr(“Hello World”, “SHA-384″));

SHA-384: 99514329186b2f6ae4a1329e7ee6c610a729636335174ac6b740f9028396fcc803d0e93863a7c3d90f86beee782f4f3f

  • encrypt.hashStr(“Hello World”, “SHA-512″));

SHA-512: 2c74fd17edafd80e8447b0d46741ee243b7eb74dd2149a0ab1b9246fb30382f27e853d8585719e0e67cbda0daa8f51671064615d645ae27acb15bfb1447f459b

Podeis comprobar los valores aquí.

Espero que esto nos ayude un poco más en el mundo de la encriptación.

Share

Android: Class Activity

Después de hablar con unos colegas de varios temas e intentar explicar como funcionan las aplicaciones se me ocurrió dedicarle un tiempo a reordenar todos esos conceptos que uno va adquiriendo. De la misma forma que en el trabajo documentamos todo aquello que hacemos, también lo deberiamos de hacer cuando son cosas para uno mismo. Siempre puedes necesitarlo o como mínimo compartirlo. Para empezar por el principio trataré de resumir la clase Activity.

Class Activity

Una Activity es un componente de aplicación que ofrece una pantalla con la que los usuarios pueden interactuar con el fin de hacer algo. A cada actividad se le da una ventana en la que se puede dibujar una interfaz de usuario. Por lo general la Activity llena la pantalla, pero puede ser menor que la pantalla y quedar flotando por encima de otras ventanas o aplicaciones.

Una aplicación generalmente se compone de varias actividades que están enlazadas entre sí. Siempre hay que definir una Activity como la principal y a partir de aquí crear las actividades necesarias para la navegación por la aplicación.

La navegación se realiza utilizando un sistema de “Pila” llamado Back Stack (Pila de Retorno). La primera Activity de la Pila es la que se define como la principal. Al pasar a una nueva Activity, la anterior pasa a un estado de suspensión y se coloca la nueva en la Pila. La pila funciona con la modalidad LIFO (Last In First Out). Al presionar el botón Atrás, la Activity actual se destruye y se reactiva la Activity que está encima de la pila.

Existen diferentes sub clases de Activities:

-       AccountAuthenticatorActivity: Clase base para la implementación de una actividad que se utiliza para ayudar a implementar un AbstractAccountAuthenticator.

-       ActivityGroup: Clase que crea una Activity que contiene y ejecuta múltiples actividades integradas.

-       AliasActivity: Clase que crea una Activity que permite lanzar otra actividad y luego se destruye en lugar de quedarse en la Pila. Es una manera senzilla de implementar un mecanismo de alias.

-       BasicDream: Clase que se utiliza para implementar Dreams

-       ExpandableListActivity: Clase que crea una Activity que permite mostrar una lista extensible (ExpandableListView).

-       FragmentActivity: Clase de Activity para utilizar con las APIs Fragment y Loader.

-       ListActivity: Clase que crea una Activity para mostrar una lista de elementos des de un origen de datos (ListView, etc).

-       NativeActivity: Este tipo de Activity se utiliza para utilizar exclusivamente código nativo. Por ejemplo para crear juegos y cosas similares.

Estas otras sub clases indirectas:

-       LauncherActivity (Sub clase de ListActivity): Muestra una lista de todas las actividades que se pueden realizar para un propósito determinado.

-       PreferenceActivity (Sub clase de ListActivity): Esta clase se usa para mostrar un Activity con la jerarquía de preferencias del usuario.

-       TabActivity (Sub clase de ActivityGroup): Esta clase está obsoleta.

 

Share

Javascript : Función getElementsByClass

Cuando quieres interaccionar con el DOM Javascript ofrece posibilidades como “getElementById” o “getElementsByTagName“, pero si lo que necesitamos es trabajar con una lista de elementos cuyo único punto de conexión es la clase CSS, pues nos toca trastear a mano para conseguir acceder a ellos…

Buscando por Internet he dado con una función que nos facilitara la tarea.

Se trata de una función preparada de antemano para retornar exactamente lo que necesitamos.

function getElementsByClass( searchClass, domNode, tagName) {
	if (domNode == null) domNode = document;
	if (tagName == null) tagName = '*';
	var el = new Array();
	var tags = domNode.getElementsByTagName(tagName);
	var tcl = " "+searchClass+" ";
	for(i=0,j=0; i<tags.length; i++) {
		var test = " " + tags[i].className + " ";
		if (test.indexOf(tcl) != -1)
			el[j++] = tags[i];
	}
	return el;
}

Y aqui dejo un trozo de código HTML usando ficha función para que entendáis mejor el ejemplo :

 <html><head><title>getElementsByClass test page</title>

<script type="text/javascript">

// paste getElementsByClass function (see above) here 

function showtab(tabname)
{
	// hide every element with class 'tab'
	var tabs = getElementsByClass('tab');
	for(i=0; i<tabs.length; i++)
		tabs[i].style.display = 'none';
	// hide every element with class 'tab'		 

	document.getElementById(tabname).style.display='block';
	// show element with given tabname
}
</script>

<style type="text/css">
/* We use several classes here to test getElementsByClass */
div.tab {  width: 100px; height: 100px; border: 1px solid black; }
div.bgray { background-color: gray;}
</style>

</head>
<body>

<a href="#" onclick="showtab('tab1');">tab1</a>,
<a href="#" onclick="showtab('tab2');">tab2</a>,
<a href="#" onclick="showtab('tab3');">tab3</a>,
<a href="#" onclick="showtab('tab4');">tab4</a>,
<a href="#" onclick="showtab('tab5');">tab5</a>

<div class="tab bgray" id="tab1">
Tab1
</div>

<div class="tab bgray" id="tab2" style="display: none;">
Tab2
</div>

<div class="tab bgray" id="tab3" style="display: none;">
Tab3
</div>

<div class="tab bgray" id="tab4" style="display: none;">
Tab4
</div>

<div class="tab bgray" id="tab5" style="display: none;">
Tab5
</div>

</body></html>

Recordar que se trata de una función, no de un método de Clase, así que la utilización correcta seria esta :

getElementsByClass('algo')

y no esta :

document.getElementsByClass('algo')

Os dejo un link de la pagina donde encontré este código que puede sernos bastante útil en bastantes ocasiones.

Por cierto según explican en la propia pagina la función funciona (nunca mejor dicho) en :

  • Internet Explorer 6.x, 7.x
  • Opera 8.x, 9.x
  • Mozilla Firefox
  • Apple Safari
  • y otros navegadores “modernos” (esta info tan precisa nunca inspira mucha confianza) ;)
Share

Javascript : Orientado a objetos

A pesar de lo que podamos pensar por el nombre, poco se parece Javascript y Java en lo que a POO se refiere…

Intentare dejar por aquí unos Snippets que puedan ser útiles para iniciarse en OOP con Javascript.

Crear un objeto :

miobjeto = new Object();

o

miobjeto = {};

Declarar un array :

miarray = new Array();

o

miarray = [];

Agregar miembros al objeto creado anteriormente :

miobjeto.variable = “hola”;

miobjeto.metodo = new Function();

En JavaScript no es posible declarar Clases, pero si es posible instanciar objetos a partir de un constructor.

Usaremos el  objeto Function  como objeto instanciable en JavaScript, y el cuerpo de la función sera el constructor del objeto. Podremos llamar al constructor con el operador new.

Ejemplo :

/*clase de ejemplo*/

miClase = new Function();

nuevoObjeto = new miClase(); // instanciamos ‘miClase’

Para emular las clases en JavaScript usaremos la palabra clave this dentro de los constructores.

/*clase de ejemplo*/

miClase = function(){

/*

agregamos miembros dinamicamente

al objeto que será retornado

*/

this.propiedad = “hola!”;

this.metodo = function(){

/* aqui ‘this’ hace referencia al objeto al que pertenece el metodo */

alert(this.propiedad);

}

}

nuevoObjeto = new miClase(); // instanciamos ‘miClase’

Este link del cual me he inspirado toca en mas profundidad el tema, y puede seros de gran ayuda. Dejaremos para otro post la propiedad prototype

Share

Javascript : Class.js Script para facilitar el uso de Clases en javascript

Si vienes de otros lenguajes mas estándar en el uso de la POO, Javascript puede parecerte un tanto tosco en su manera de interpretarla.

Hemos encontrado un script que pesa menos de un kilobyte (se trata de Class.js) y que te facilitara la vida.

Así quedaría crearíamos una clase con Javascript :

One = {
	
	message:'',
	
	set:function(val){
	
		this.message = val;
	
	},
	
	get:function(){
	
		alert(this.message);
	
	}

};

Así la usaríamos :

var e = new Class(One);
e.set('Hello, World!');
e.get();

Para el tema constructores, si los necesitamos los definiremos como “construct()“, y serán llamados al instanciar la clase. Ese constructor podrá tener argumentos

One = {
	
	message:'',
	
	construct:function(val){
	
		this.set(val);
	
	},
	
	set:function(val){
	
		this.message = val;
	
	},
	
	get:function(){
	
		alert(this.message);
	
	}

};

Y lo usaríamos así :

var e = new Class(One,['Awesome!']);
e.get();

El script nos otorga también la posibilidad de “extender” clases, y lo definiríamos de esta manera :

One = {

	message:'',
	
	set:function(val){
	
		this.message = val;
	
	},
	
	get:function(){
	
		alert(this.message);
	
	}

};

Two = Extend(One,{

	construct:function(val){
	
		this.set(val);
	
	}

});

Y lo utilizaremos así :

var e = new Class(Two,['Quixotic!']);
e.get();

Aunque se nos notifica que no podemos sobrecargar métodos en las clases extendidas.

El script también permite extender instancias de clases, y el uso de plugins…pero para eso ya os dejo investigar un poco.

Os dejo de nuevo la URL que a bote pronto me parece muy interesante : URL Class.js

Share