23 de diciembre de 2011

Imagenes de mi segundo post en JavaHispano

Ando desarrollando el tema de Genericos y Colecciones para el examen de certificacion. Aunque no esta en mis planes (inmediatos) acreditar el examen. Subire un par de imagenes que ocupe para el post, ya que mi usuario no tiene permisos para subir archivos al servidor. Pensé mandarle un mail a Abraham Otero para que mueva sus influencias y le den permisos a mi usuario, pero nos separa el oceano atlantico y (mas o menos) 7 horas. Asi que no esperare, subire mis imagenes aqui y tomare la url.



esta no la acupo, pero es como me vere en un par de decadas, jejeje

17 de septiembre de 2011

Genericos y Colecciones Parte 1. Sobreescribiendo equals y hashCode

Genéricos y colecciones

Los genéricos fueron una de las características principales en el lanzamiento de Java 5. Con la salida de los genéricos cambio la forma en como podemos manejar colecciones en Java. Una de las características que tienen las colecciones es el poder ordenar y buscar entre los elementos que forman parte del contenido. Podemos establecer el criterio de búsqueda u ordenamiento para nuestras colecciones, pero para esto debemos sobrescribir los métodos equals y hashCode. En esta primera publicación tocaré el tema de sobrescribir los métodos equals y hashCode, las características de cada uno de estos métodos y algunos ejemplos.

Puntos a tocar en esta publicación:

  • Sobrescribiendo el método equals
  • Reglas que sigue el método equals
  • Ojo, mucho ojo.
  • Sobrescribiendo el método hashCode
  • ¿Que implica el hashcode?
  • Reglas que sigue el método hashCode
  • Ojo, mucho ojo.


Sobrescribiendo el método equals

Indagando en la javadoc acerca del método equals(Object o), podemos encontrar lo siguiente:

Método: equals(Object o)
Valor de retorno : boolean
Descripción: Indica si un objeto es igual a este.

Este método lo utilizamos para saber si un objeto es igual que otro. Este método utiliza el operador == para comparar a dos objetos y decidir si son iguales, por ejemplo podemos tener la siguiente clase:


public class Demo {

private int boleta;

public Demo(int boleta){
this.boleta = boleta;
}

public int getBoleta(){
return this.boleta;
}

public static void main(String[] args) {
Demo demoA = new Demo(20);
Demo demoB = new Demo(20);

System.out.println(demoA.equals(demoB));
}
}

La ejecución del anterior método main da como resultado en consola false. Esto es porque el método equals sin sobrescribir ocupa el operador == para comparar a dos objetos. Pero supongamos que queremos diferenciar a los objetos mediante su atributo boleta, ya que es el identificador de un Alumno para una aplicación escolar. Para esto debemos sobrescribir el método equals, diciéndole qué propiedad del objeto debe ser comparada para determinar si un objeto es igual a otro. El método sobrescrito se vería de esta forma:

@Override
public boolean equals(Object o){
if(( o instanceof Demo) && (((Demo)o).getBoleta() == this.boleta))
{
return true;
}else{
return false;
}
}

la tercera linea es la que tienen la magia. En ella hacemos un par de validaciones, la primera tiene que ver con estar seguros de que el objeto o es una instancia de la clase Demo, y la segunda es verificar si la propiedad boleta de el objeto o es igual a la propiedad boleta del objeto que invoco el método equals. Si los valores de boleta son los mismos, el método equals que sobrescribimos regresara true. Con esto nosotros tomamos la decisión sobre que criterio se debe tomar para comparar a nuestros objetos.

public static void main(String[] args) {
Demo demoA = new Demo(20);
Demo demoB = new Demo(20);

System.out.println(demoA.equals(demoB));
}

Por lo anterior, esta ejecución del método main, nos dará como resultado un true en la salida por consola.

Hay tipos de colecciones como los Sets que no nos permiten agregar objetos duplicados a la colección. La forma en como los Sets van a decidir si un objeto esta duplicado o no, la especificamos nosotros cuando sobrescribimos el método equals. Lo mismo cuando en una colección de tipo Hash* queremos buscar un elemento en especifico, la colección sabe que objeto regresar, dado el criterio que nosotros definimos al sobrescribir el método equals y hashCode. En esto radica la importancia de sobrescribir estos métodos, siempre y cuando este dentro de nuestras intenciones contar con este tipo de prestaciones.

Reglas que sigue el método equals

  • Reflexivo: Para cualquier referencia al valor x, x.equals(x) debe regresar true.
  • Simetrico: Para cualquier referencia a los valores x y z, x.equals(z) debe regresar true si y solo si z.equals(x) es true.
  • Transitivo. Para cualquier referencia a los valores w, x y z, si w.equals(x) regresa true y x.equals(z) regresa true, entonces w.equals(z) debe regresar true.
  • Consistente: Para cualquier referencia a los valores x y z, múltiples invocaciones a x.equals(z) consistentemente regresaran true o false, si es que los valores utilizados para la comparación de los objetos no ha sido modificada.
  • Para cualquier referencia no nula al valor x, x.equals(null), debe regresar false.

Ojo, mucho ojo

  • Asegúrate de sobrescribir el método equals. Las siguientes son implementaciones del método equals que son validas para el compilador, pero no validas para sobrescribir el método:
    • boolean equals(Objeto o). Esta implementación no sobreescribe el método equals de la clase Object, ya que el método debe ser declarado como public.
    • public boolean equals(Demo o). Esta implementación no sobreescribe el método equals de la clase Object, ya que el parámetro que necesita el método equals debe ser explícitamente un objeto de la clase Object, y no uno que extienda de éste. Esta implementación, al igual que la anterior es una sobrecarga del método equals, mas no sobreescribe este método.

La descripción correcta del método equals, es decir, la forma en como debe sobrescribirse es la siguiente:

public boolean equals(Objeto o);



Sobrescribiendo el método hashCode

¿Qué implica el hashcode?

Algunas colecciones usan el valor hashcode para ordenar y localizar a los objetos que están contenidos dentro de ellas. El hashcode es un numero entero, sin signo, que sirve en colecciones de tipo Hash* para un mejor funcionamiento en cuanto a performance. Este método debe ser sobrescrito en todas las clases que sobrescriban el método equals, si no se quiere tener un comportamiento extraño al utilizar las colecciones de tipo Hash* y otras clases. Si dos objetos son iguales según el método equals sobrescrito, estos deberian regresar el mismo hashcode. Véase el siguiente ejemplo:


public class Demo {

private int boleta;

public Demo(int boleta){
this.boleta = boleta;
}

public int getBoleta(){
return this.boleta;
}

@Override
public boolean equals(Object o){
if((o instanceof Demo) && (((Demo)o).getBoleta()== this.boleta))
{
return true;
}else{
return false;
}
}

public static void main(String[] args) {
Demo demoA = new Demo(20);
Demo demoB = new Demo(20);

System.out.println(demoA.equals(demoB));
System.out.println(demoA.hashCode());
System.out.println(demoB.hashCode());
}
}

Esto nos da como resultado:

true
1414159026
1569228633

regresa true porque estos objetos son iguales, debido a que se sobrescribió el método equals. Si son considerados iguales por equals, esto se reflejará al utilizarse en las colecciones de tipo Hash*. Lo que podemos ver en la salida de este código es que a pesar de que ambos objetos son iguales, el hashcode no es igual. Esto es porque no hemos sobrescrito el método hashCode.

El uso principal del hashcode, es como lo mencionamos arriba, cuando se manejan colecciones de tipo Hash*. La forma en como operan las colecciones de este tipo es a grandes rasgos la siguiente: Las colecciones de tipo Hash* almacenan los objetos en lugares llamados baldes, de acuerdo al numero obtenido por el método hashCode. Si el método hashCode regresa un 150, el objeto será guardado en el balde numero 150. Puede llegar a pasar que haya mas de un objeto de diferente tipo en el mismo balde. Esto no ocasiona ningún problema al momento de recuperar el objeto del balde, ya que al buscarlo este tipo de colecciones necesita como parámetro un objeto con el mismo valor hashcode, el cual utilizara para buscar el numero de balde que contiene a el objeto en cuestión. Si hay mas de un objeto, el siguiente criterio para determinar cual es el objeto buscado, es la utilización del método equals. Así es como este tipo de colecciones para buscar un objeto, ya sea para regresarlo y para ordenarlo. Lo cual falla si no sobrescribimos el método hashCode.

Sobrescribiendo el método hashCode

A continuación veremos como podremos sobrescribirlo:


@Override
public int hashCode() {
int hash = 7;
hash = 97 * hash + this.boleta;
return hash;
}

La salida que obtenemos una vez que se rescribe este método en el ejemplo de arriba es :

true
699
699

lo que nos dice que estos métodos son iguales según equals, y que además tienen el mismo numero hashcode.

Este método hashCode regresara consistentemente el mismo valor, siempre y cuando el campo boleta no cambie. Cada desarrollador puede implementar de diferente manera igualmente validas, correctas y eficientes este método. Lo que debemos de tener en mente al sobrescribir este método es que si para sobrescribir el método utilizamos variables de instancia (en nuestro ejemplo boleta), también debemos utilizar variables de instancia para generar un hashcode correcto. En el caso de las constantes que se utilizan en el ejemplo de arriba, se recomienda utilizar números primos, para una mejor distribución del hashcode generado.


Reglas que sigue el método hashCode

  • Si el método hashCode es invocado en múltiples ocasiones durante la ejecución de una aplicación, debe regresar consistentemente el mismo valor entero, esto si la información utilizada para calcular el hashcode no ha cambiado entre invocación e invocación del método hashCode.
  • Si dos objetos son iguales según el método equals, entonces la llamada al método hashCode debe regresar el mismo hashcode.
  • No es requerido que si dos métodos no son iguales según el método equals, tengan diferentes valores hashcode.

Ojo, mucho ojo

  • Si dos métodos son iguales según el método equals, el método hashCode debe regresar el mismo entero para ambos métodos. Sin embargo, si el métodos equals dice que dos métodos no son iguales, el método hashCode puede o no regresar el mismo entero.
  • Retornar un valor fijo en un método hashCode es una mala idea, ya que tendremos múltiples objetos con el mismo valor hashcode, lo cual no ayuda en nada a la hora de trabajar con colecciones de tipo Hash*.
  • Si utilizamos variables de clase de tipo transient para generar un hashcode, serializamos el objeto en cuestión y queremos recuperar el hashcode de ese método, nos encontraremos con que el hashcode será diferente al hashcode con que se serializó el objeto. Ya que este tipo de variables no se serializa. Por eso es una mala idea utilizar variables transient para generar el hashcode.

23 de abril de 2011

Ver mas alla

Las personas estudio o profesión aleja de la lectura de libros, periódicos y en general literatura de izquierda (y en general de cualquier lectura), estamos siendo tristemente burlados por un sistema al que no le interesa que nuestro segmento (y en general todos) se preocupe por la realidad del mundo. 

Los que estudiamos y/o laboramos cuestiones relacionadas con TI, somos unas de las victimas mas vulnerables, a pesar de haber tenido una educación a nivel superior. Nuestra ocupación es tan apasionante y absorbente que no nos preocupamos ni siquiera de estar informados de los temas que tienen un impacto palpable e incluso grave, en la vida de la sociedad en la que nos desenvolvemos. Ademas de que nuestra actividad encaja perfecto con el modelo neo-liberal, y que en este modelo no se nos trata tan mal.

Yo no quiero ser un zombie mas. Uno al que la televisión, el cine, la radio e incluso el Internet, le dicta qué hacer, como vestir, qué comer, etc. El grueso de la sociedad así es. Incluso, como ya mencione arriba, quienes se supone que tienen un criterio mas amplio, una visión menos angosta, por haber tenido la oportunidad de acceder a la educación superior, son a veces los que mas enrolados están en su papel de títere. 

Lo que nos salvara de esto y nos abrirá los ojos para cambiar la realidad por una en la que la gran mayoría de la población sea beneficiada, es la lectura, el dialogo, la movilización ciudadana, el no creer todo lo que leemos, vemos o escuchamos. El no confiarle nuestros oídos y ojos a cualquiera. Ser más personas y menos borregos.

3 de abril de 2011

Crear una libreria para una aplicacion Java ME

En mi ignorancia en aplicaciones mobiles ( y en java ), pensaba que el procedimiento para crear y agregar una libreria propia a un proyecto nuevo, era el mismo para la version de Java SE y ME. Pero estaba equivocado. 

Generalmente, cuando se quiere crear una libreria, solo se toma un proyecto, se construye (build), esto nos genera un archivo con extension ".jar" que es el que contiene las clases listas para ser agregardas a otro proyecto a manera de libreria. Entonces lo que hariamos en nuestro proyecto de Java SE seria agregar la libreria. Si estamos en Netbeans, bastaria con dar clic derecho en la carpeta de librerias de nuestro proyecto y seleccionar "add library". Y con esto podriamos hacer uso de nuestra libreria. 

Quise hacer este procedimiento para una aplicacion mobile que actualmente desarrollo (PipaApp). El compilador me decia que todo estaba correcto,  pero al momento de correr la aplicacion en el emulador obtenia este error:


java.lang.NoClassDefFoundError: com/blogspot/pplouis/saludo/Saludo
        at hello.PipaApp.getFormPrincipal(+2)
        at hello.PipaApp.startMIDlet(PipaApp.java:50)
        at hello.PipaApp.startApp(PipaApp.java:183)
        at javax.microedition.midlet.MIDletProxy.startApp(MIDletProxy.java:43)
        at com.sun.midp.midlet.Scheduler.schedule(Scheduler.java:374)
        at com.sun.midp.main.Main.runLocalClass(Main.java:466)
        at com.sun.midp.main.Main.main(Main.java:120)



Y es que no se puede agregar un archivo .jar creado con Java SE a un proyecto Java ME ( sin antes hacer unos cambios en un archivo de configuracion ), aunque se trate de solo una clase, que no haga ningun import y que solo imprima un hola mundo.  Un archivo .jar asi deberia de funcionar en ambar versiones de Java, pero no lo hace porque en el archivo META-INF, que se encuentra dentro del .jar, dice lo siguente:


Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.1
Created-By: 1.6.0_14-b08 (Sun Microsystems Inc.)
X-COMMENT: Main-Class will be added automatically by build


mientras que un archivo .jar creado para una app mobile de Java Me, tiene lo siguiente:


Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.1
Created-By: 1.6.0_14-b08 (Sun Microsystems Inc.)
MIDlet-Vendor: Vendor
MIDlet-Name: SaludoLibreriaMobile
MIDlet-Version: 1.0
MicroEdition-Configuration: CLDC-1.1
MicroEdition-Profile: MIDP-2.1


y se observa que hay especificaciones acerca de la configuracion y el perfil de la libreria.

 Para crear una libreria para Java Me es necesario que sea especificamente para un proyecto Java Me. Para esto haremos lo siguiente:

Primero creamos nuevo proyecto de tipo Java Me, dentro de las categorias que nos muestra ponemos que sea un "Mobile Class Library"


Despues se escoje la configuracion que y perfil que le queremos dar a nuestra libreria. Esto es importante, ya que esta libreria tendra mejor compatibilidad con las aplicaciones que tengan la misma configuración.


Ya creado el proyecto, solo necesitamos escribir nuestro codigo:




darle en netbeans "clean" o "clean and build".




 Esto nos genera el archivo distribuible, que para este caso sera un .jar, el cual es nuestra libreria, y que se encuentra en la carpeta dist de nuestro proyecto. 


La carpeta lib viene vacia, y el archivo Demos.jad, es basicamente un archivo de informacion, que generalmente se ocupa cuando se va a descar la aplicaciocion de algun sitio y sirve para dar informacion acerca de la version, tamaño del archivo, configuracion , etc.

Y ya por ultimo solo basta agregarla a nuestro proyecto Java Me. Para eso damos clic derecho en la carpeta de "Resources", despues en "add jar/zip" y agregarmos el archivo .jar generado previamente.  


24 de marzo de 2011

error: The virtual machine does not support this operation: schema change not implemented

Los errores de Netbeans. cuando estas en modo debugger para una app: puedes hacer cambios en el codigo y verlos reflejados en la aplicacion sin que tengas de desplegarla otra vez. Esto agiliza el proceso de debuggear.

Hay ciertos cambios que no los puede actualizar, como por ejemplo el añadir o elminar un field o variable de clase, cuyo error cuando queramos "Apply Code Changes" es:

The virtual machine does not support this operation: schema change not implemented
D:\SACMx\SACMx6.0.0\nbproject\build-impl.xml:914: The following error occurred while executing this line:
D:\SACMx\SACMx6.0.0\nbproject\build-impl.xml:401: The virtual machine does not support this operation: schema change not implemented
BUILD FAILED (total time: 0 seconds)

Esto es porque la implementacion de la maquina virtual no lo permite. Si navegamos hasta build-impl.xml en la linea 914 y build-impl.xml en la linea 401, nos daremos cuenta de que es un error al querer recargar una clase

Ademas de esta condicion no se podra "Apply Code Changes" cuando el codigo tenga errores de compilacion (obviamente).

22 de marzo de 2011

Si fuera ingeniero...

Wow, esto lo tenia en los borradores como 2 años, se traspapelo y hasta ahora me vengo a dar cuenta. Dude si dale click en "Publicar Entrada", pero pues al final lo hice.


Si fuera ingeniero o alguien mas tecnico, te hablaria de los errores tecnicos de Guindous Vista, como que se desintala a la primera provocacion el archivo rundll32.exe, que se devora la memoria RAM, una serie de errores indocumentados por Guindous, a nivel de controladores siempre nos quedo mal Vista, etc, etc etc... pero para el caso no soy tecnico, mas bien rudo (los rudos los rudos los rudos!!), asi es que esta es la lectura que le doy al Vista gate:

La onda es q Microsoft aplico lo q hace Apple, de venderte todo por partes, pero en su version mala onda, me explico :

A la salida de Guindous Vista, Microsoft se dio cuenta de que a nivel empresarial no era viable cambiar de sistema operativo, ya que XP ya se habia convertido en un sistema maduro y muy funcional. A nivel usuario cacero, tampoco creaba muchas espectativas la salida de un sistema operativo (mucha gente ni entereda de que salia un nuevo S.O.). A nivel personas relacionadas con las tecnologias de informacion realmente creo espectativas, pero este no es un mercado muy grande. Los tentaculos de Microsoft estan en las empresas. Asi que lo q hizo fue dejar de darle soporte y descontinuar a XP. Con lo cual forzo el cambion de SO, pero no solo de eso, sino que ademas forzo en la mayoria de los casos un cambio de hardware, ya que Vista es tan diva como para pedir 3 GHz de procesador, 2GB RAM, 256MB video (las especificaciones marcan otros requerimientos como minimos, pero con eso Vista se arrastra todavia mas). Ademas de que las nuevas computadoras ya te vendian la licencia de Vista, y dejaron de vender XP
Asi que hubo un traslado masivo a Guindous Vista.

Hasta este momento Microsoft ya se embolso una buena lana por todo lo generado por Vista. Pero aqui viene lo critico. Siendo Vista un S.O. planeado para que no funcionara correctamente (con esto digo que es malo a proposito), Microsoft te dice: "ahh, no te jala Vista, ah pues mira en unos mese saco Guindous 7, cambiate a Guindous 7". Ahi fue cuando todo tuvo sentido. Primero te obligan a comprar un mal SO, para luego orillarte a comprarles un Guindous 7 que no es otra cosa q Vista sin errores (al menos evidentes). Doble ingreso para Microsoft!

En estos momentos los Linux-boys y los Mac-boys estaran mentando madres y su odio hacia Microsoft tuvo un +1000. Pero no hagamos bilis...



Are You Ok - Alfa

Una aplicacion que hice con mucho cariño para Pipa Romero. Hace un par de preguntas, y deacuerdo a la combinacion de respuestas, muestra una frase o un chiste. Esta en version alfa, ya que se pretente mejorar la parte de la deduccion del estado de animo, con test psicologicos. Esta hecha en Java ME con CLDC 1.1 y MIDP-2.1. Solo copiar el jar al telefono y ejecutarlo. Se abrira el asistente de instalacion del telefono.

15 de marzo de 2011

Error: "home/manie/netbeans-6.5/mobility8/WTK2.5.2/bin/emulator: 26: java: not found"

Ahora que junto a mis buenos amigos Benja, Shaike y Monroy, estoy levantando aplicaciones mobiles en java, para despues hacer lo necesario (que talves sea solo recompilar) para ejecutarlas en terminales con androy, me vino a salir un erro al momento de querer probar mi aplicacion con el emulador de netbeans. La parte interesante del strack trace que obtuve en la exception arrojada es la siguiente:

/home/louis/netbeans-6.5/mobility8/WTK2.5.2/bin/emulator: 26: java: not found


y es que pasan 2 cosas, o que en la ruta especificada no este el ejecutable "emulator", y en este caso habra que descargarselo, o bien por separado, o descargar de nuevo el sdk de la micro edition de java.  Y la segunda es que si se encuentre el emulador pero no tiene configurada la variable "javapathtowtk". En este ultimo caso, lo que se tiene que hacer es abrir el archivo "emulator", y modificar el script configurando javapathtowtk asi:

javapathtowtk="/usr/java/jdk1.6.0_13/bin/" 

no esta por demas decir que hay que cambiar la ruta por la que corresponda a tu carpeta de instalacion del jdk. Con esto el problema queda solucionado.

Como se puede ver a simple vista, esta correccion solo aplica para sistemas operativos linux, ya que es posible editar el script de el archivo "emulator". En Guindous no he tenido este problema con el emulador, pero creo que aplicaria otra solucion, ya que no se puede modificar el archivo "emulator" ya que nos aparece en forma binaria. Ahi la solucion que podria aplicar es la de ejecutar desde consola el emulador pasandole como parametro la ruta del jdk. Esa seria mi solucion, espero algun dia poder comprobarla ( no mejor que todo funcione bien ). 



10 de marzo de 2011

ACTA

En cuanto al ACTA, se tiene que hacer lo que sea necesario, repito, lo que sea necesario, para impedir que esta iniciativa no salga adelante. La red es uno de los pocos lugares en el mundo donde se tiene un alto porcentaje de libertad y un bajo porcentaje de censura. No se pueden apoderar de la red los grupos en el poder en el mundo, cuyas garras no parecen tener una tamaño definido ni estático, sino mas bien cambiante y extensivo.

Tal vez uno de los pecados que estamos cometiendo es de centralizarnos en un servicio particular. Llamese google, facebook, hotmail, paypal, siento que no estamos creando y usando soluciones alternativas a las conocidas. ¿Que pasaria si el dia de mañana nos cierran paypal, o nuestra cuenta de twitter? Si centralizamos la red nos hacemos mas bulnerables a poder ser censurados, a que nuestra información o servicios ya no estén disponibles de un día para otro, por particulares de una minoria muy pequeña, cuyos intereses difieren enormemente de los de la sociedad en general, de practicamente TODOS. Dejo un video explicativo acerca del ACTA, es muy ilustrativo y lo deja muy claro de lo que se trata. Aun asi hay que informarse para estar permeados del tema. 8^)


8 de marzo de 2011

El unico que sabe

Sentiame estresado por 23423454645^34 cosas: que no me quedan los reportes con iReport, que estoy llegando al trabajo a las 10 am, que hay que leer para la clase de la rata asquerosa, que ya viene el viernes de clase sexosa con el profe de planecion, etc. Y con sueño, con mas sueño que antes. Me mantuve despierto 5 estaciones, pero al llegar a la 6ta me quede dormidisimo. Fueron 3 minutos de un sueño espiritual muy profundo. Desperte en otra persona. Ahora mismo no tengo bien el orden en que las ideas me vinieron a mi mente en ese momento, pero pense en que a mis 21 años no deberia tomarme la vida tan en serio. Ni a los 22, ni nunca. La vida es para ser feliz, y no deberia hacer cosas que pusieran en riesgo mi paz y felicidad.

Es un misterio el como trabaja la mente humana, talvez en esos 3 minutos de sueño, se llevaron a cabo en mi cuerpo reacciones quimicas que me hicieron despertar con tal claridad de mente. O talvez eran pensamientos que siempre he traido conmigo, y que habian estado oprimidos por las cataratas mentales que solemos tener todos en algun momento de la vida. El caso es que me alegro de no haber tenido suficiente autocontrol para evitar ese momento de sueño que no queria. A vivir en paz!


2 de marzo de 2011

Hiperbolico

Asi como hay calzado para todo tipo de ocaciones, tambien hay editores de texto para cada momento de la vida. Cuando escribo codigo de programacion, mi preferido es Notepad++. Cuando es un documento escolar o del trabajo, uso sin siquiera dudarlo openOffice. Para el blog, el de rigor es TextRoom. Las ventajas de cada uno de estos editores las comente en un post pasado. ¿Y si en la vida fuera igual? ¿Que para cada persona pudieras mostrar o usar la parte de ti que sea mas conveniente?


Estos dias me he sentido con una energia grandiosa, desde el primer momento del dia. Para mi las mañanas son inspiradoras, me llenan de emocion. Aspiro lo mas que puedo el aire matutino, hasta que hago conciencia de que todo lo que respiro va a la sangre, y me detengo. No siempre se respira el aire mas puro. Hoy en el trabajo la luz de la mañana a todo lo que da. Me gusta ver tanta luz. La vida se ve en alta definicion. Hoy fue un buen dia de trabajo. Muy productivo y de mucho aprendizaje. Hasta ese momento, como si hubiera consumido psicotropicos de los que se recetaba ( o receta ) mi buen amigo el greñas. En la tarde la escuela. No me considero una persona antisocial, pero tampoco todo lo contrario. Sin embargo, a veces me sorprendo cuando caigo en cuenta de la cantidad de personas que saludo, de la entrada de la escuela hasta el salon de clases. Es genial. Despues de eso una interesante clase de Sociedad y Etica. Ahh, ese Positivismo. Te enamora con solo mencionar que la religion tenia su lugar en otra epoca, dentro de la historia del intelecto humano.



En la noche, una llamada a Banana. No ha hecho acto de presencia en 2 dias. Preguntan por ella. La energia y alegria que tenia en el momento de decir "¡que pasooooo banana!" le irrumpieron los oidos. Estaba mal. Habia estado durante todo el dia en una sintonia de alegria, felicidad, gusto, incluso euforia, que no supe como dar un switch de estado de animo. Me senti frio. Torpe. Me limite a balbucear torpes palabras, ni siquiera de animo, sino de llamada de rutina. Me hubiera gustado hacer un cambio a "modo hombro" en ese momento. Pero no importa tanto, Banana sabe que la acompaño en su peda, perdon, pena. ¿Y si en la vida escogieramos en todo momento el "modo" adecuado? Hariamos mas feliz a mucha gente. Nos hariamos mas felices a nosotros mismos. Pero asi es la vida. Nadie nos prometio un jardin de rosas.

1 de marzo de 2011

Crear un branch en Subversion

En este post pondré los pasos a seguir para hacer un branch con Subversión. Para poner en contexto Subversion es un sistema de control de versiones. Un sistema  de control de versiones nos ayuda mucho en el desarrollo de software, ya que podemos trabajar a  través del tiempo sobre un archivo (.java, .php,  .cpp, etc), y al ir guardando nuestros cambios, estos se guardan bajo un id de cambio, llamado revisión. Con esto podemos regresar a un punto específico de nuestro archivo,  en caso de que hayamos hecho cambios al código que no funcionaron. Es muy útil cuando se trabaja en equipo, ya que se pueden mezclar los cambios hechos por varias personas al mismo tiempo  en un mismo documento.  

Pero si les interesa este post, es porque ya saben que es Subversion y para que sirve. Entonces vamos al grano. 

Pero este post trata de cómo hacer un brach. Pero,  que es un branch. Basicamente es una copia de tu archivo, carpeta o proyecto actual, el cual llevara un camino de edición diferente, es decir, que se parte de un archivo original, se hace una copia (una “copia ligera” en el caso de subversion) y se trabaja de manera independiente sobre esas dos vertientes de archivos y/o. Por ejemplo, supongamos que  tenemos un proyecto web sin ningún framework implementado y bajo un control de versiones, el cual queremos implementar con Struts. Este proyecto web ya es estable, pero se le sigue dando mantenimiento sobre detalles que van saliendo con el tiempo y uso de los usuarios.  Por lo cual no se puede detener el desarrollo de ese proyecto para implementar Struts. Entonces aquí entran los branch, para hacer una copia del proyecto original, y que ambas copias del proyecto sigan un rumbo diferente. Despues de tener implementado Struts en el branch, hay que mezclar los proyectos, ya que en el original (trunk) ya se han corregido algunos bugs, y aquí en tra el “merge”, que se encarga de mezclar las diferentes ramas de un proyecto. Entonces empecemos:

En un inicio, para subir un proyecto a un repositorio, Subversion nos recomienda que se haga con la siguente estructura de directorios:

 
Donde “calc” es el nombre de nuestro proyecto, “trunk” es donde ira la rama principal de nuestro proyecto, y branches, donde guardaremos una o varias “copias” de la rama principal del proyecto.

Hacer  un branch del proyecto
Yo ya tengo un proyecto en Subversion que va en la revisión 24. Si tenemos configurado el Subversion para que funcione con Apache, podremos ver nuestros proyectos versionados desde el navegador, poniendo en la barra de direcciones http://localhost/repos/, donde “repos” es el nombre que le dimos a nuestro repositorio en el archivo “conf” de Apache, vemos lo siguiente:  

 
Se muestran mis 2 proyectos en mi repositorio. El proyecto para este tutorial es “MetodosNumericos”.  Y dentro de “MetodosNumericos” tengo la estructura de directorios que se recomienda:
 
En la carpeta trunk es donde tengo alojado la mi proyecto. En esta carpeta se coloca por convención el tronco del proyecto, del cual derivara una rama o branch. Mi proyecto de Netbeans se llama “Metodos Numericos”, el cual es una aplicación de escritorio.

Aquí se ve el contenido de mi proyecto.

Para hacer una copia de este proyecto y ponerlo en el branch, vamos a la consola  y ponemos lo siguiente:



Todo en una línea.
Dónde:
-          svn copy es el comando para hacer un brach, que al final de cuentas es una copia.
-          http://localhost/repos/MetodosNumericos/trunk/ es el directorio de nuestro repositorio del cual queremos hacer un branch.
-          http://localhost/repos/MetodosNumericos/branches/MetodosNumericos-branch es el directorio del repositorio donde queremos colocar nuestro branch
-          -m es un parámetro para indicar un comentario descriptivo de la acción que se realiza,  que es obligatorio cada que se hace algo en Subversion. En este caso “nuevo branch con Subversion”.

Si los parámetros son correctos, veremos el siguiente mensaje:





Ya que para mí repositorio este es mi commit número 25.
Y si navegamos a http://localhost/repos/MetodosNumericos/branches/ confirmaremos que si se creó correctamente nuestro branch.







Despues para empezar a trabajar con ese brach solo hara falta ubicarnos en el directorio donde queremos alojar nuestro proyecto y dar “checkout” con la siguiente sentencia:








Y se descargara el proyecto del control de versiones:
Y al usar el comando dir, nos damos cuenta de que ya hay una carpeta “MetodosNumericos-branch”, con la cual podemos empezar a trabajar, y posteriormente dar commit.


Hay que recordar que al dar commint  de un branch dado, los cambios van a dar a el 
directorio de nuestro repositorio donde tenemos el branch. No a el trunk del proyecto. FIN




19 de enero de 2011

Volver a Compartir

Llevo varias semanas con la idea en mente de volver a escribir de manera mas recurrente. Habia dejado de escribir aqui, ya que sentia que no tenia material digno de estar en este blogspot. Soy de la idea ( tal ves erronea ) de que para escribir primero hay que leer. Y en este tiempo me he dedicado a eso mismo. A leer tanto literatura de la que es alimento para el alma ( cuentos, novelas, poesia, etc. ), como literatura tecnica y que me apasiona.

Vienen meses que demandan mucho de mi en todos los aspectos: tiempo, amor, esfuerzo, dedicacion, disciplina, dinero. Tengo muchos proyectos en mente para este primer semestre de año. Algunos laborales, otros academicos y tambien personales. Con lo cual me tendre que hacer un maestro en la administracion de mi tiempo y demas recursos. Si hay mas de 1 entrada a la semana de este blog, será signo de mi exito al maximizar mi tiempo.

Para ya no hacer esta entrada mas larga, solo queda por decir que es un placer volver a poner contenido en este blogspot.

Por cierto este post lo estoy redactando desde "Nano", un editor de texto ligero, que segun el manual, emula la funcionalidad de un editor de texto
llamado "Pico".