jueves, 31 de diciembre de 2009

UI Binding Con GWT 2.0

Una de las características nuevas de GWT es la posibilidad de crear interfaces de usuario definidas en un archivo XML, y luego vincular dicha definición con una clase, la cual incluirá el comportamiento de dicha interfaz, todo esto se realiza gracias al nuevo UiBinder.
En el siguiente ejemplo muestro como hacer una simple calculadora de enteros, definiendo la interfaz de usuario en un archivo xml y el comportamiento en una clase. Luego de todo eso podremos utilizar nuestra pantalla como si fuera un simple Widget de GWT.

El ejemplo funcionando se encuentra disponible bajo el enlace "Calculadora" del appspot de este blog.

Para empezar mostraré la pantalla definida en el xml. El archivo es "WebCalc.ui.xml"

<?xml version="1.0" encoding="UTF-8"?>
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' xmlns:g='urn:import:com.google.gwt.user.client.ui'>
<g:DockPanel>
<g:Dock direction="SOUTH">
<g:HorizontalPanel>
<g:Button text="Suma" ui:field="botonSumar" />
<g:Button text="Resta" ui:field="botonRestar" />
<g:Button text="Multuplicación" ui:field="botonMultiplicar" />
<g:Button text="División" ui:field="botonDividir" />
</g:HorizontalPanel>
</g:Dock>
<g:Dock direction="CENTER">
<g:HTMLPanel>
<p>Operador 1: <input type="text" ui:field="operador1" /></p>
<p>Operador 2: <input type="text" ui:field="operador2" /></p>
<p>Resultado: <span ui:field="resultado"/></p>
</g:HTMLPanel>
</g:Dock>
</g:DockPanel>
</ui:UiBinder>

Podemos ver que es bastante sencillo, primero definimos declarativamente un DockPanel, para la botonoera utilizamos un HorizontalPanel, el cual contiene 4 botones, vinculados por el atributo "ui:field" con ciertos métodos de la clase controladora que veremos más adelante.
Para la entrada, y en el centro del dock panel, utilizamos un panel html con tags html estándar (lo cual resalta el poder del UiBinder). Dandole el formato que a nosotros nos plazca y aún así pudiendo vincular elementos en la clase, de la misma forma que lo hicimos con los botones.

En este ejemplo no se muestra pero es posible también incluir estilos personalizados que se aplican sólo para el xml que estamos definiendo; otra muestra del gran poder de esta herramienta.

A continuación mostramos la clase que define el comportamiento de nuestra calculadora, el archivo "WebCalc.java".

public class WebCalc extends Composite {

interface Pantalla extends UiBinder<Widget, WebCalc> { }
private static Pantalla pantalla = GWT.create(Pantalla.class);

@UiField
InputElement operador1;
@UiField
InputElement operador2;
@UiField
SpanElement resultado;

public WebCalc() {
initWidget(pantalla.createAndBindUi(this));
}

@UiHandler("botonSumar")
public void sumar(ClickEvent evt) {
int op1 = leerOperador(operador1);
int op2 = leerOperador(operador2);
resultado.setInnerText("" + (op1 + op2));
}

@UiHandler("botonRestar")
public void restar(ClickEvent evt) {
int op1 = leerOperador(operador1);
int op2 = leerOperador(operador2);
resultado.setInnerText("" + (op1 - op2));
}

@UiHandler("botonMultiplicar")
public void multiplicar(ClickEvent evt) {
int op1 = leerOperador(operador1);
int op2 = leerOperador(operador2);
resultado.setInnerText("" + (op1 * op2));
}

@UiHandler("botonDividir")
public void dividir(ClickEvent evt) {
int op1 = leerOperador(operador1);
int op2 = leerOperador(operador2);
resultado.setInnerText("" + (op1 / op2));
}

private int leerOperador(InputElement tb) {

if (tb == null) {
Window.alert("No es posible leer un valor");
return 0;
}
try {
return Integer.parseInt(tb.getValue());

} catch (NumberFormatException ex) {
Window.alert("No es posible convertir a entero: " + tb.getValue());
}
return 0;
}
}

Como podemos ver es bastante simple:
Para realizar el vínculo con el archivo declaramos la interfaz interna, a la cual podemos ponerle el nombre que mas nos convenga, utilizando como sus parámetros de generics el tipo de componente resultante que deseamos y el tipo de componente que tiene el "dueño" de la interfaz generada.
Posteriormente creamos el componente utilizando el mecanismo de "Deferred Binding" que nos provee GWT.

En el constructor de nuestro manejador le indicamos a nuestro componente recien creado que se vincule con la instancia actual de la clase mediante el llamado al método "createAndBindUi".

Finalmente utilizamos los annotations @UiField y @UiHandler para vincular componentes y las acciones de los botones.
Los botones pueden vincularse con cualquier método que devuelva void, y reciba un ClickEvent.

Bueno, espero haber podido ilustrar un poco el uso de esta gran herramienta que nos provee GWT. Si se desea ampliar la lectura, recomiendo leer el siguiente tutorial.

Saludos!

Debugeando Proyectos con GWT 2 y EJB 3

Algo lindo de la forma nueva de debugear proyectos con gwt 2 es que ya no nos encontramos atados de pies y manos cuando queremos desarrollar con glassfish y ejbs. Una prueba de esto es el siguiente video.



Espero que lo disfruten.
Saludos!

lunes, 28 de diciembre de 2009

PowerThirst Sparta!

Prueben la nueva bebida energética ahora para los espartanos!



Saludos!

Google Web Toolkit 2.0

Acá les dejo un video que explica brevemente las características nuevas de GWT 2.0



Saludos!

Google App Engine

Recientemente me han activado mi cuenta de Google App Engine para complementar un poco con ejemplos en funcionamiento las cosas que voy publicando acá en este blog.

Para quienes no sepan lo que es, trataré de definirlo de la siguiente forma: Es un servicio de google, gratuito al principio (podemos pagar si necesitamos subir las prestaciones) donde podemos hostear nuestras aplicaciones web, sin publicidades, y con prestaciones como utilización de mails y bases de datos (entre muchas otras).

App engine permite cargar aplicaciones web hechas en python y en java. Es realmente simple de habilitar, necesitamos una cuenta de google (como todos los servicios de google) y un celular, ya que habilitamos el servicio a través de sms. En mi caso, mi proveedor de servicio no estaba soportado por google app engine, sin embargo llené un formulario y 1 semana después me lo habilitaron.

Para desarrollar en Netbeans con app engine, necesitamos instalar el plugin mediante esta guia, y además descargar el SDK para java de google app engine.



Con el plugin para netbeans podemos probar las aplicaciones, debugearlas, cargarlas dentro de google y además manejo gráfico de todas las configuraciones para app engine.

La dirección de app engine para este blog es http://juancavallotti.appspot.com e iré incluyendo ejemplos de cosas que desarrolle para este blog.

Espero que les sea de utilidad.

Saludos!

miércoles, 16 de diciembre de 2009

Videos KDE 4.4

Dejo acá unos videos que demuestran algunas de las características nuevas de Kde 4.4, realmente va a estar muuuuuy bueno.

Saludos!

jueves, 10 de diciembre de 2009

Piratería: Una forma de destrucción.

Hoy voy a hablar de un tema que me preocupa pero lamentablemente es un mal que no desaparecerá: La piratería.

Ésta es la era digital, todo lo que estimula nuestras mentes se encuentra ya en formato digital: Los libros, la música, las películas, etc.

En décadas anteriores a los 90, una persona tenía generalmente 2 alternativas a la hora de escuchar música: O bien compraba el disco que quería escuchar luego de un proceso de selección, o bien grababa en cassettes discos que poseían sus amigos. La diferencia de calidad era sumamente notoria, lo mismo podía apreciarse con los libros fotocopiados y en menor forma con las películas en video-cassette, en todos los casos había un factor importante que potenciaba o bien la compra o bien copia de contenidos: la calidad.

Con el advenimiento de la era digital y las comunicaciones no sólo la calidad de las copias aumentó significativamente sino que también nuestra capacidad de compartir contenidos.

Ahora bien, lo que en un principio era una pérdida de utilidades extra para escritores, músicos, etc, con la evolución esa pérdida de utilidades se convierte día a día en una forma de destrucción y, si esto sigue así, en un futuro a los escritores de libros de todo tipo no les será rentable convertir en masivo el conocimiento, a los músicos no les será rentable producir música nueva y así, algunas áreas más golpeadas que otras se irá frenando cada vez más la producción de todo tipo de contenidos.

Las personas que hoy crecen y estimulan su intelecto descargando de la red los contenidos pirateados serán mañana afectados por la no-producción de los mismos.

En pocas palabras pirateando hoy, estamos destruyendo aquello que nos estimula y no progresará mañana. Terminaremos todos escuchando música vieja, leyendo libros con conocimientos anticuados, utilizando software de baja calidad y que por ser pirateado no se puede actualizar, etc.

Una frase que uno debe tener en cuenta a la hora de piratear contenidos es la siguiente: LA PIRATERÍA ES UN ROBO. ¿A quien estamos robando? A todas las personas involucradas en el proceso de elaboración de los contenidos.

¿Que se puede hacer?
Bajo el paradigma original la forma de soportar la creación de contenidos era comprar dichos contenidos en el soporte. Hoy en día dichos soportes resultan, en algunos casos, menos que convenientes, en pocas palabras, para muchos casos, la digitalización es necesaria, pero las personas se rehusan a comprar contenidos digitales que resultan "intangibles" y ni siquiera produce cargo de conciencia el hecho de piratearlos.
Es evidente que para la producción de contenidos, debe haber dinero involucrado pues quien produce contenidos también es una persona y necesita un sustento para su vida, sin contar que dicha producción es su trabajo.

Posiblemente una solución que deje contentas a muchas personas podría ser la puesta a disposición para descarga libre de contenidos y un sistema de donaciones mediante el cual, la gente que pueda hacerlo, le de soporte al proceso y el arte no muera.

Dicho esto, me despido del post y espero opiniones para el asunto.
Saludos y por favor, no pirateen en la medida de lo posible! no maten aquello que disfrutan!

sábado, 5 de diciembre de 2009

Pruebas de Unidad: JUnit 4 y Netbeans IDE

Muchas veces en la incansable labor de desarrollo de software, nos vemos en la necesidad de probar lo que hemos hecho. La forma que primero se nos viene a la cabeza es correr la aplicación, cargar los datos, y ver que todo ande bien.
Eventualmente no tendremos la posibilidad de ejecutar la aplicación completa, o la ejecución de ésta es algo que consume mucho tiempo y es muy laborioso, sin contar que a veces dependemos de necesitar listo el trabajo de otras personas para probar nuestro código. Ahí es donde cobra sentido la automatización de las pruebas de unidad.

La herramienta propuesta por Netbeans IDE y que ciertamente es la más utilizada en el ambiente es jUnit. En este post presentaré las nociones básicas de uso de la versión 4 de jUnit, basado en Annotations.

Utilizar esta herramienta es realmente sencillo, utilizaré la siguiente clase (realmente trivial) como sujeto de pruebas:

public class Matematica {
public int dividir(int a, int b) {
return a / b;
}
}

Para comenzar, creo dentro de mi proyecto de netbeans, en test packages, mi clase que será la Suite de pruebas (o conjunto de pruebas seleccionadas). Cada prueba se realiza dentro de un método y este deberá estar anotado con @Test.

Nuestra primera clase de prueba es esta:

import org.junit.Test;
import org.junit.Assert;

public class PruebaMate {

@Test
public void pruebaCero() {
int valor = new Matematica().dividir(4, 2);
Assert.assertEquals(2, valor);
}

}

A esta clase le iremos agregando cosas a medida que vayamos avanzando.
Para comenzar la prueba en netbeans, click derecho a la clase de prueba dentro del explorador de proyectos y le damos la opción "Run".

Presentando la siguiente salida:

Testsuite: PruebaMate
Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0,089 sec

test:
BUILD SUCCESSFUL (total time: 1 second)

Esto nos dice que la prueba se ejecutó, y no sólo eso sino que se realizó correctamente y el tiempo que tardó.

Ahora agregaremos el siguiente método para probar como se comporta con la división por 0:

@Test
public void pruebaUno() {
new Matematica().dividir(4, 0);
}

Y al correrlo obtenemos la siguiente salida:

Testsuite: PruebaMate
Tests run: 2, Failures: 0, Errors: 1, Time elapsed: 0,061 sec

Testcase: pruebaUno(PruebaMate): Caused an ERROR
/ by zero
java.lang.ArithmeticException: / by zero
at Matematica.dividir(Matematica.java:3)
at PruebaMate.pruebaUno(PruebaMate.java:14)


Test PruebaMate FAILED
test:
BUILD SUCCESSFUL (total time: 0 seconds)

Ahora vemos que en realidad la segunda prueba no debió haber fallado ya que en java la división por cero causa esa ArithmeticException. Para decirle a jUnit que realmente esa excepción no es mala sino que debería considerarse como resultado exitoso de la prueba, lo hacemos a través de el annotation @Test, el método quedará de la siguiente forma:

@Test(expected=ArithmeticException.class)
public void pruebaUno() {
new Matematica().dividir(4, 0);
}

Y al ejecutar la prueba vemos lo siguiente:

Testsuite: PruebaMate
Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 0,049 sec

test:
BUILD SUCCESSFUL (total time: 0 seconds)

Nota: En caso que nuestra excepción necesitara ser declarada, agregamos la cláusula throws a nuestro método de prueba.

Ahora posiblemente antes de cada prueba necesitemos realizar un setup del entorno para que se adapte al entorno de producción, esto lo realizaremos con métodos anotados con @After y @Before, por ejemplo realizaremos la instanciación de la clase matemática antes de cada prueba y sugeriremos la recolección de basura después. La clase de pruebas modificada se ve de la siguiente forma:

import org.junit.After;
import org.junit.Test;
import org.junit.Assert;
import org.junit.Before;

public class PruebaMate {

@Test
public void pruebaCero() {
int valor = m.dividir(4, 2);
Assert.assertEquals(2, valor);
}

@Test(expected=ArithmeticException.class)
public void pruebaUno() {
m.dividir(4, 0);
}

private Matematica m;

@Before
public void iniciar() {
System.out.println("Inicio la prueba");
m = new Matematica();
}

@After
public void terminar() {
System.out.println("Termino la prueba");
m = null;
System.gc();
}
}


Y al ejecutar la prueba vemos el resultado:


Testsuite: PruebaMate
Inicio la prueba
Termino la prueba
Inicio la prueba
Termino la prueba
Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 0,1 sec

------------- Standard Output ---------------
Inicio la prueba
Termino la prueba
Inicio la prueba
Termino la prueba
------------- ---------------- ---------------
test:
BUILD SUCCESSFUL (total time: 0 seconds)


Ahora, instanciar la misma clase una y otra vez por cada prueba no es barato, como se puede observar en los tiempos de ejecución. Si queremos realizar algo antes de todo y luego algo después de todo utilizamos los annotations @AfterClass y @BeforeClass, modificamos la clase de pruebas de la siguiente forma:

private static Matematica m;

@BeforeClass
public static void iniciar() {
System.out.println("Inicio la prueba");
m = new Matematica();
}

@AfterClass
public static void terminar() {
System.out.println("Termino la prueba");
m = null;
System.gc();
}

Cambiando a static ya que las anotaciones requieren que los métodos sean static. Y los resultados de la ejecución son los siguientes:

Testsuite: PruebaMate
Inicio la prueba
Termino la prueba
Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 0,073 sec

------------- Standard Output ---------------
Inicio la prueba
Termino la prueba
------------- ---------------- ---------------
test:
BUILD SUCCESSFUL (total time: 0 seconds)


Con lo que terminamos este tutorial introductorio para realizar pruebas de unidad, las cuales nos ahorran mucho tiempo de introducción de datos y a medida que pasa el tiempo y las pruebas se acumulan nos sirven para verificar que los cambios introducidos en el mantenimiento de las aplicaciones, no tengan efectos adversos sobre la funcionalidad existente.

Espero que les sirva. Saludos!

viernes, 13 de noviembre de 2009

Modem 3g Claro en Linux

Hace un tiempo experimenté con sorpresa que al enchufar el modem claro 3g huawei en mi notebook con ArchLinux, networkmanager me lo reconoció sin problemas.
Al tratar de conectarme me solicitó los siguientes datos:
  • Nro de teléfono: *99#
  • usuario: ctigprs
  • clave: ctigprs
  • APN: internet.ctimovil.com.ar
Bien, con esto logré conectarme pero internet no andaba ni para atrás ni para adelante.

Al mirar mi archivo /etc/resolv.conf vi lo siguiente:

nameserver 4.3.2.1
nameserver 4.3.2.1

#(también podría haber sido 1.2.3.4, no lo recuerdo.)

Esto evidentemente está mal por lo cual luego de un poco de investigación descubrí que los dns eran los siguientes:

#/etc/resolv.conf

nameserver 170.51.255.100
nameserver 170.51.255.167

Bien, en un principio pensé que eso resolvería mi problema de conexión pero no. Al escribir el comando 'route' noté que el dhcp tampoco me entregó bien la puerta de enlace. Inspeccionando un poco vi también que si bien tenía una dirección ip (proporcionada por la negociación ppp), la máscara de red era 255.255.255.255. Teniendo esa máscara resulta obvio que no podría conectarme a ninguna pc en esa red que no sea la mía. Inspeccionando la configuración que entregaba el mismo módem en windows vi que la puerta de enlace en efecto era la misma ip que nos entregó la necociación ppp.

Por lo cual, con el comando route, y suponiendo que mi ip es: 186.122.192.127


# route add default gw 186.122.192.127

Una vez corregido esto, pude navegar perfectamente con el modemcito.

Les dejo acá un snapshot de como se vería la configuración parael modem en knetworkmanager.



Saludos!

domingo, 1 de noviembre de 2009

Yo tocando.

Hoy se me dio por filmarme, aunque la camara me pone muy nervioso. Jaja.



Espero críticas y comentarios.
Saludos!

miércoles, 28 de octubre de 2009

Licuando un Iphone

Que poderosa es esta licuadora!! Y que pena me da!
No apto para cardíacos.



Saludos!

Procesamiento de Texto Eficiente

Muchas personas cuando realizan procesamiento de textos tienden a dar formato a medida que van escribiendo, terminan la idea, establecen fuentes, tamaños y colores a los elementos del documento. Ésta idea si bien es intuitiva, genera luego muchas "desprolijidades" en el documento, algunas perceptibles y otras no, ésto trae otras consecuencias como por ejemplo las siguientes:

  • Se vuelve muy difícil la actualización eficiente y veloz del formato del documento.
  • Cambiar partes del texto a menudo requiere lidiar con las "mañas" del formato.
  • Resulta complejo utilizar herramientas útiles como la generación automática de índices.
¿Cuál podría ser la solución a este problema?

La solución propuesta por la mayoría de los procesadores de texto es simple: Separar el formato de la estructura del documento.

La idea principal es volver a la primaria e identificar los elementos característicos de un texto tales como:
  • Títulos en diferentes niveles.
  • Párrafos.
  • Epígrafes
  • Citas
  • Notas al Pie
  • Etc
Incluso se podría ser mas granular como por ejemplo oraciones o partes remarcadas de una oración.

Ahora bien, este enfoque permite que muchas personas editen partes de un documento sin tener que preocuparse por el formato, cosa que en general cuando se trata de la edición de grandes documentos sucede muy a menudo. La técnica es simple. se define un estándar estructural, el cual es más facil de definir y aplicar que la común definición de un fromato estándar y al finalizar el documento se aplica el formato editando los estilos.

A continuación muestro cómo se realiza esto dentro de OpenOffice:


Dejo remarcado en la imágen el combo con el que podemos indicarle al procesador de texto que tipo de elemento tenemos seleccionado.
Generalmente éstos elementos ya traen un formato predeterminado aunque a mi parecer es bien feo.

Una vez que decidimos comenzar con el formateo de nuestro documento desplegamos el diálogo que también se puede ver en la imágen y con click derecho podremos acceder a las propiedades de su formato.

Principios similares se aplican en sitios web con las hojas de estilo en cascada (CSS) aunque estas últimas son mucho mas extensas en cuestión de definición de formato.

Espero que les sirva para sacar documentos mas prolijos y utilizando siempre formatos abiertos.

Saludos!

domingo, 25 de octubre de 2009

1000 Monos con 1000 Máquinas de Escribir

El siguiente video me hace imaginar un poco como debe ser un equipo de desarrollo en microsoft.




Tomarlo con humor.
Saludos!

jueves, 22 de octubre de 2009

Musica para pasar el Rato

Como andan querido amigo, querida amiga. En vista que esto no se esta moviendo mucho significa que paso 90 % de mi tiempo despierto metido en temas de la universidad, asíque voy dejando algunas canciones que no tienen nada que ver entre si.

Las canciones que voy a poner son de la época de los 70 en diferentes estilos. Posiblemente alguna sea de finales de los 60 y otras de principio de los 80. Pero en promedio no pifio si digo que son de los 70 :P.

La primera es "Frankenstein" de Edgar Winter Group, instrumental, muy buena.



Luego vamos a poner un poco de musica disco ideal para desestresarse, "September" de Earth, Wind and Fire.



Después pinta la onda hippie de los 70 Argentina con "Mañanas Campestres" de Arco Iris.



Finalmente "Fortunate Son" de los Barbudos "Creedence Clearwater"


Bonus Track: "The Great Gig In The Sky", no hace falta decir ni de quien es.


Espero que lo disfruten y pronto volveré con la usual temática ñoña.

Saludos!

martes, 13 de octubre de 2009

Patentes de Software: Razones para odiarlas.

Hoy hablaré de las patentes de software. Las patentes de software, para los mortales, son una forma de "adquirir" la propiedad intelectual de cierto comportamiento que tiene un progrma escrito por ese aguien.

Por empezar, este tema tiene muchos matices de gris, ya que esto puede tener muchos enfoques, por un lado si pensamos en el software en sí, no es mas que un importante conjunto de llamadas a instrucciones de un procesador, las cuales fueron puestas ahí por el fabricante de dicho procesador para que el usuario las use, si lo vemos como si fuera un auto, las instrucciones podrían ser el acelerador, freno, embrague, palanca de cambios, radio, etc; los cuales fueron puestos allí para ser usados. La misma perspectiva podemos tener si subimos varios niveles en la cadena evolutiva con las apis del sistema operativo, o mas arriba, las instrucciones de las máquinas virtuales. Está claro que desde este punto de vista resulta tán ridícula la idea de patentar software como la de patentar una determinada forma de manejar un auto.

Viendolo desde un enfoque completamente distinto uno puede llegar a pensar que su algoritmo resuelve un problema determinado de una forma super elegante y planea comercializarlo, ahora bien desde este punto de vista resulta natural querer patentarlo ya que es una creación y las creaciones se patentan de forma que el creador pueda tener exclusividad sobre los beneficios de las mismas.

El asunto de todo esto es ¿Que debemos considerar creación y qué no? Ahí es donde se encuentran los matices de la cuestión. Si por ejemplo uno mira la patente de "ribbon" de microsoft, posiblemente diga algo como "Botones de interfaz de usuario insertados dentro de pestañas de interfaz de usuario". Increible no? Tanto los botones de interfaz de usuario como las pestañas de interfaz de usuario existen desde hace años, ambos personalizables, dicha combinación se ha utilizado multitud de veces por distintos fabricantes de software y la idea en sí incluso es bastante obvia. ¿Es eso una creacion?.

Por otro lado existe una empresa, ahora no recuerdo cual, quien patentó AJAX, (si, eso que se encuentra en casi todos los sitios web modernos). AJAX no tiene nada en especial, simplemente carga partes de páginas web "por detrás" sin que el usuario lo note, para esto simplemente usa un objeto provisto por el navegador para tal fin. Otra vez a mí no me parece una creación en absoluto, mas bien utilizar herramientas que fueron pensadas para tal fin.

Ejemplos de cosas patentadas ridículamente tengo como para escribir varios post, pero la idea no es aburrir, la siguiente gran pregunta es:

¿Que es entonces una creacion?

Una creación en software es mucho mas profundo que lo que se ha venido discutiendo, y en efecto no es el software en sí la creación, sino el concepto. Por ejemplo yo podría patentar un algoritmo computacional que reconoce caracteres de imágenes el cual es el resultado de una extensa investigación, o una estructura de datos diseñada para utilizarse en discos duros la cual es ultra eficiente. Si lo miro mas de cerca realmente no estoy patentando software, lo que realmente estoy patentando es un descubrimiento.

Y aún así, existen descubrimientos que son tan amplios que resulta ridículo patentarlos, por decir algo el árbol B, o los algoritmos de redes neuronales, o los archivos XML.

Por lo expuesto creo que resulta bastante obvio que patentar software por sí mismo sería tan ridículo como patentar el pedaleo de una bicicleta.

En fin, esa es mi humilde opinión, Saludos!

viernes, 9 de octubre de 2009

Beavis - Cornholio

Conozcan a el gran cornholio!!
Este video es de la serie beavis and butthead. Es increible como pasa el tiempo y la vida es una sola. Este es otro de los dibujos que yo veía cuando era pequeño.




Saludos!!

jueves, 8 de octubre de 2009

Ren y Stimpy

Estos dibujos animados marcan un antes y un después en el humor bizarro, como olvidar al famoso olorin!




y acá tienen un capítulo que pude encontrar en español.



La parte 2 del video solo se puede ver en youtube!
http://www.youtube.com/watch?v=IqkgX5XgeZA&NR=1

Espero que los disfruten.

Saludos!

Bob Esponja

Este es el tema de salida de bob esponja, lo que pueden hacer 2 guitarras!! 1 con slide y la otra no. Pero son solo 2 guitarras, nada más.



Saludos!

Lanzadera Lancelot

Una de las cosas lindas que tiene KDE4 es que todo son componentes "enchufables" al escritorio, por lo cual podemos cambiar todo por componentes que se ajusten mejor a nuestras necesidades digamos, todo lo que está en los paneles y en los tableros plasma.

Hoy le tocó el turno al menú K, una buena alternativa con sabor a plasmoid es la que en castellano se llama "Lanzadera Lancelot" Esto es un reemplazo muy bueno para nuestro menú, nos muestra distintos apectos importantes sobre nuestro sistema como lo son las aplicaciones, nuestros dispositivos de almacenamiento, opciones para edición de documentos y hasta incluso nuestra gestión de información personal.

Como se puede ver, uno de los atractivos visuales de la lanzadera es que, a diferencia del menú K, el cual no es transparente por default (y si se puede poner transparente yo personalmente no sé como) , la lanzadera utiliza las transparencias.
Tiene además una interfaz que deslizando el cursor hacia ciertos lugares nos ahorra hacer click en el item.

Como podemos ver nos permite acceder fácilmente a lugres de acceso frecuente. Otra de las características de la lanzadera es que es muy configurable.

En fin, esa es mi breve reseña de esta utilidad de kde.

Saludos!

miércoles, 7 de octubre de 2009

KDE 4.3.2

Hoy se ha anunciado la salida de KDE 4.3.2 la cual aparentemente incluye muchos bugfixes. Esta versión ya es la segunda versión de mantenimiento de KDE 4.3 en su ciclo de vida mensual. Para los que no hayan usado KDE, recomiendo este escritorio que cada día nos da más satisfacciones.


Link a la noticia: http://www.kde.org/announcements/announce-4.3.2.php

Saludos!

miércoles, 30 de septiembre de 2009

Conozcan a Micky Vainilla!

Que grande capuzzotto! Es humor racista pero hay que tomarlo con humor. Aclaro: NO SOY RACISTA

Saludos!

Hibernate Annotations - Guia Rápida

En este post planeo explicar un poco sobre cómo utilizar hibernate annotations para proyectos Java SE. Antes que nada aclaro que se puede usar hibernate a través de la jpa, pero personalmente tengo razones para pensar que la JPA está todavía un poco chica como para Hibernate.

Para una guia de mapeo les recomiendo bajar la documentación de Hibernate-Annotations

Para los que no sepan de que estoy hablando lo pongo con palabras simples, hibernate es una librería que se encarga de "conectar" el mundo de la programación orientada a objetos con el mundo de las bases de datos relacionales. Algunos conocen esto como ORM o para los mortales, mapeo objeto-relacional.

No voy a dar mucha introducción al tema, debido a que puede ser un poco largo y espero que quien me esté leyendo lo haga porque comprende el tema y quiera ir directo al grano.

Para empezar hibernate utiliza un archivo xml de configuración

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/prueba</property>
<property name="hibernate.connection.username">prueba</property>
<property name="hibernate.connection.password">prueba</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.show_sql">true</property>
<mapping package="pruebahibernate.entidades"/>
</session-factory>
</hibernate-configuration>


Este archivo debe llamarse hibernate.cfg.xml y va ubicado en la raíz de nuestra estructura de paquetes.

Como nota recordar poner el driver jdbc de nuestra base de datos relacional entre las librerías (así como las de hibernate annotations, y core). En mi caso utilizo PostgreSQL con una base de datos "prueba" con usuario y clave también prueba.

Todas mis clases de entidad se encuentran en el paquete pruebahibernate.entidades y además de eso tengo habilitada la actualización automática y generación de las tablas en la base de datos.

¿Como se usa?

Necesitamos un objeto Session Factory, esto es lo principal para generar Sesiones de hibernate y con ellas hacer cosas locas con nuestra base de datos. La siguiente línea levanta las configuraciones de nuestro xml, las aplica y crea un session factory con ellas. (Las podemos toquetear por código antes de crear el session factory.
Notar que la diferencia con hibernate standard es que se usa el objeto AnnotationConfiguration en vez del Configuration.


SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();

...
Session sesion = sessionFactory.openSession();
Transaction t = sesion.beginTransaction();
....
List l = sesion.createQuery("FROM Persona").list(); //Generar un listado de personas por ejemplo.
....
t.commit();
....

Y eso es todo, con muy pocas líneas y un par de annotations, tenemos un sistema robusto y transaccional para trabajar con bases de datos.

Ahora muestro como está mapeada mi entidad persona:

@Entity
public class Persona implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator="system-uuid")
    @GenericGenerator(name="system-uuid", strategy="uuid")
    @Column(length=36)
    private String id;

    private String nombre;
    private String apellido;
    private int dni;
    private int edad;

    ....... // aca van los getters y setters
}



Como se verá el mapeo por annotations es mucho mas simple y compacto que con xml.Por ahí pueden parecer muchas annotations para un solo id pero es simplemente para especificarle que me genere automáticamente los UUID, es una maña mia nomas el único annotation requerido es el @Id

Espero que les haya servido, cualquier cosa postear preguntas.

Saludos!

martes, 29 de septiembre de 2009

Poster del Proyecto Final

Para los que querían ver de que se trataba mi proyecto final (y de mis compañeros de grupo) de la facultad. Acá les dejo el poster. Es software libre y todo.
Para quien quiera ver la exposición es en la UTN, FRM el día martes 10/11/2009, hora todavía sin confirmar.


Saludos!

lunes, 28 de septiembre de 2009

Con Paciencia y Con Saliva

Para todos los que no creían en el dicho, con paciencia y con saliva, pues acá tienen una prueba digna de ver, es una publicidad que yo ví cuando era muy chico y recién ahora la vengo a entender.



Saludos!

Jessica Cirio te enseña a ponerlo con la boca!!

Los frutos de nuestro pais!!



Saludos!

Windows XP en HP 530

Bueno, ahora les voy a comentar mi experiencia ultra triste de instalar Windows XP en mi notebook HP 530.

Aunque muchos no lo crean, instalar Windows XP a veces es problemático, y yo lamentablemente lo tengo que hacer porque a veces desarrollo aplicaciones para clientes que quieren que corran bien bajo Windows y no me gusta entregarles productos sin probar en el entorno de produccion.

En fin, los materiales:
  • Un cd de Windows XP.
  • Una Notebook HP 530.
  • Los drivers descargados desde el sitio de hp.
  • Y ultimo pero lo más importante, una bolsa de hielo, o 2 comprimidos de "Gel Pack" (si, los que usan los deportistas).

Como muchos saben Windows Xp necesita una disketera para instalar sobre un disco sata (re nuevo), entonces a falta de disketera le desactivé el sata nativo desde el bios de la notebook.

Muchos me preguntaran, ¿Por que el gel pack? Es simple, el Windows Xp es tan genial que no tiene administración de energía en su instalador, entonces, sube un poco la temperatura de la notebook mientras se está instalando y la bios decide que es mejor apagarla para que no se rompa, entonces, bueno, a ponerle hielo abajo!


Bueno, he ahí la solución del problema de que la notebook se apague sola al instalar Windows Xp, yo lo tomo como un signo de rebeldía, pero simplemente es que tiene que descansar en hielo.

Yo estuve googleando mucho tiempo hasta que me di cuenta de esto, asíque lo dejo plasmado acá por si alguien tiene el mismo problema que yo.

Saludos!

Instalando Glassfish en Archlinux

Hace relativamente poco he empezado mi vida como desarrollador JavaEE, como servidor de desarrollo utilizo GlassFish simplemente porque es de sun y es el que viene con Netbeans, el cual también utilizo.
En mi pc habitual de desarrollo de JavaEE me he encontrado que correr el IDE y el servidor en el mismo lugar es contraproducente para la velocidad de desarrollo, digamos, todo se tarda muchísimo, por lo cual he instalado Glassfish en una pc aparte y acá comento mi experiencia.

Primero que nada, quiero decir que glassfish no viene en los repos asíque hay que instalarlo usando yaourt.
#yaourt -S glassfish
Hay que correrlo como root porque sino el script de instalación falla y nos quedamos con el servidor a medias.

Luego de instalarlo se puede arrancar. Los dominios de glassfish se colocan en el directorio domains de la instalación (yaourt lo pone en /opt/glassfish), estoy usando el dominio por defecto ya que trae todos los servicios en los puertos estándar asíque prácticamente sale corriendo "out of the box".
Algo que extrañé es un script en /etc/rc.d para controlarlo, igual nada me impide hacerlo y lo hice.

Glassfish tiene un workaround para que funcionen las conexiones al servicio jndi y es que el nombre de host debe resolver a la ip externa de la pc, por lo cual hay que manipular el archivo /etc/hosts para que quede similar a esto:
127.0.0.1 localhost.localdomain localhost
192.168.1.8 juan-desktop
Para Controlarlo se utiliza el binario asadmin que se encuentra en el directorio bin, entonces por ejemplo mi dominio se llama domain1 (el que viene por defecto, y estas son las opciones para controlarlo):

asadmin start-domain domain1 # Arrancar el domain1 y si dado el caso, servidor también
asadmin stop-domain domain1 # Parar el dominio1 en el servidor y dado el caso, el servidor tb.

Si le añandimos la opción --debug, podemos arrancar el servidor en modo debug (lo cual sirve para los ides, entoces acá les presento mi script de shell para controlar a glassfish.

#!/bin/bash


case "$1" in

start)
/opt/glassfish/bin/asadmin start-domain domain1
;;
stop)
/opt/glassfish/bin/asadmin stop-domain domain1
;;
debug)
/opt/glassfish/bin/asadmin start-domain --debug domain1
;;

debug-restart)
$0 stop
sleep 5
$0 debug
;;
restart)
$0 stop
sleep 5
$0 start
;;
*)
echo "usage $0 {start, stop, debug, restart, debug-restart}"
;;
esac


Los sleep se los pongo simplemente para darle un descanso a la pc entre parada y arrancada.

Conexión con Netbeans

La conexión con netbeans es ultra facil, uno se dirige a la pestaña de servicios, en el item de servidores, le da click derecho y le pone agregar nuevo servidor, aparecerá un asistente y hay que colocar los siguientes datos, aclarando que 4848 es el puerto de adminsitración por http de mi glassfish standalone.




Espero que les sirva, saludos!

lunes, 14 de septiembre de 2009

Java versus C#, ¿por qué aprender y cual?

El objetivo de este post es explicar un poco mi discutible visión sobre estos lenguajes de bytecodes de propósito general, anticipando que soy una persona partidaria de java y argumentando un poco por qué elijo Java.

En primera instancia voy a explicar por qué comparo java con c# y no con otros lenguajes de bytecodes como Ruby o Python.

Nota para el que está leyendo: Lo que sigue hasta el próximo título importante no hace al agrumento del tema asíque se puede saltear sin perderse nada.

Principalmente Ruby y Python quedan fuera de alcance son de tipos dinámicos; (y tirando un pequeño agite) personalmente elijo Python simplemente porque ya el nombre Ruby me suena a marica, y por lo poco que he visto de como se escribe, lo veo muy poco masculino a mi gusto.

Antes de seguir con Java y C# voy a explicar a qué me refiero por código masculino. No es una comparación sexista sino que si colocaramos una escala graduada con masculino de un extremo y femenino en el otro extremo y aclarando que mientras más uno se tiene que ensuciar las manos más se acerca uno al lado "masculino" o sea a nivel MACHO se encuentra el assembler un poquito mas abajo C, java se encuentra en la mitad y Ruby se encuentra del lado femenino.

Máquina Virtual

Java tiene una máquina virtual que corre en muchas plataformas y sistemas operativos, inclusive la mayoría de los teléfonos celulares y microcontroladores. En cambio la plataforma .net sólo corre bajo Windows, ocasionalmente corre en "Mono" (implementación libre y para linux de .net) pero ésta depende de la volundad de que Microsoft quiera exigir aplicar las leyes de patentes de soft o no. Otro tema es que me he topado con casos en que las máquinas virtuales más nuevas de .net no corren aplicaciones anteriores al ser actualizadas.

Estructura de las Bibliotecas.

Las bibliotecas de Java y la arquitectura sugerida para las aplicaciones se encuentran Diseñadas siguiendo los patrones de diseño para soft orientado a objetos y las mejores prácticas de diseño que pueden aprenderse de los libros y la experiencia, de esta forma un programador formado correctamente no tiene que introducir cochinadas en su soft para lidiar con las fallas de diseño de la plataforma.

En contraste la biblioteca de la plataforma .NET se encuentra pensada para ser intuitiva sólo para alguien que no tiene la mas mínima idea de programación, lo cual le genera dependencia hacia la plataforma, imposibilita el entendimiento de lo que se está haciendo y quien comienza con ésto sólo puede trabajar en la programación utilizando esta plataforma porque posiblemente no entienda otras. Evidentemente esta forma de hacer las cosas no sólo es cochina sino que posee un alto acoplamiento, baja cohesión, y posiblemente haya que tapar demasiadas cochinadas para dejar una aplicación bien diseñada.

Bibliotecas externas disponibles

Java posee una gran comunidad por lo que podemos encontrarnos con bibliotecas que aceleran nuestro trabajo en todas las formas, colores y sabores. En contraste la comunidad de C# no es tan amplia por lo tanto no existen tantas herramientas.

Entornos de Desarrollo

Al ser Java un lenguaje libre y abierto, podemos encontrarnos con IDEs multi plataforma y de gran utilidad como Netbeans o Eclipse, (y muchos muchos otros) de gran poder y sin costo de compra de licencias. Gracias a mono, C# ha ganado lugar en linux con IDEs como MonoDevelop, pero principalmente quien desarrolle en Windows tendrá su copia pirateada de Visual Studio (el cual cuesta sus buenos dólares de licencia para el que piense uaslo en serio), o la versión poco poderosa y gratuita.

Legibilidad del Código
Para quien se encuentre acostumbrado a programar en C++, seguro que encontrará mas legible a C#, pero, C++ es en sí MUY poco legible para quien no lo conoce, por lo cual desde mi punto de vista, ésto no es más que un defecto. Para quien se encuentre acostumbrado a leer código c, Java será muy fácil de comprender. Igualmente éste punto es medio subjetivo, pero pienso que convenciones como iniciar nombres de atributo con un guion bajo (no obligatorio, pero buena práctica en C#) o denotar la herencia con ':' por decir algo, solo "ennegrece" el código.

Interfaces de Usuario

El tema de la "belleza" de las interfaces de usuario es el punto fuerte de C#, en efecto dicho lenguaje trae todo tipo de herramientas para hacer pantallas bien agradables, Java tiene nativamente a Swing (y al viejo y peludo AWT) pero Swing no satisface 100% las necesidades de una apariencia "nativa" y un Look and Feel uniforme que es lo que principalmente atrae al usuario final, sin embargo vienen frameworks externos para solucionar estos problemas.

Conclusiones
C# puede parecer para la persona poco experimentada como la opción "mas fácil" de aprender pero no acompaña a los programadores en su aprendizaje y eventualmente los guía hacia el "estanque" donde están metidos todos los programadores que se la jugaron por Microsoft y que todavía creen que a la computadora la mueve un duende mágico. Java provee flexibilidad y alta portabilidad y se adapta a una GRAN variedad de situaciones, sin contar que es un lenguaje libre.

Para el lector: si leyó hasta acá, espero haberlo convencido.

Saludos!

Albert King

Albert King fue un gran bluesero inspiración de figuras como Jimmy Hendrix o también Stevie Ray Vaughan; y uno de los 3 Reyes (Kings) del blues (Albert King, B.B. King y Freddie King). En particular con este video se puede apreciar la FUERTE influencia que tuvo este guitarrista en SRV. Se lo puede ver con su Gibson Flying V. Espero que lo disfruten tanto como yo, Saludos!

Un Increible editor de texto: VIM

VIM Es un editor de archivos de texto de consola basado en VI. Es increiblemente poderoso aunque puede parecer un poco tosco al principio y poco amigable.

Entre las características que mas me han impresionado se encuentra lo siguiente:

  1. Edición de multiples archivos en pestañas.
  2. Sintaxis resaltada para muchos tipos de archivos de configuración.
  3. Soporte de muchos plugins.
  4. Autocompletado de código.
  5. Code-Fold esto es, esconder código dentro de bloques de programación.
  6. Backup y recuperación de archivos que se están editando.
  7. Comodidad de realizar todo sin levantar las manos del teclado.
Realmente tiene muchas cosas, aún así tiene la ventaja/desventaja según como se lo vea que no se explicita mucho sobre cómo hacer cosas entonces el usuario nuevo realmente no puede entenderlo ni "sacarlo" intuitivamente. Es por eso que he preparado algunos tips para los que quieran aprender a usarlo.

Antes que nada, quisiera comentar que VIM viene ya para muchas plataformas, en las que se incluyen windows, linux y mac os.

Enlaces:
Página de descarga de Vim
VIM en Wikipedia
VI en wikipedia

Existe para los que lo tienen instalado un tutorial que dura 30 minutos que lo pueden hacer y con eso conocer todo lo necesario sobre el vim, para acceder al tutorial escribir el siguiente comando:
$vimtutor
Espero que les resulte de utilidad. Saludos!

lunes, 7 de septiembre de 2009

Conocer tu hardware en Linux.

Muchas veces nos encontramos ante la necesidad de conocer características de nuestro hardware. Existen distintas alternativas, por ejemplo el comando:
cat /proc/cpuinfo
Nos da informacíon sobre el microprocesador que estamos usando.
cat /proc/meminfo
Nos da información sobre el uso de la memoria.
lspci
Nos da información sobre los dispositivos conectados al bus PCI de nuestra placa madre.
lsusb
Nos da información sobre los dispositivos USB conectados.

Hoy sin embargo me he encontrado con un comando que me ha resultado de suma utilidad que es dmidecode.

De por si dmidecode sin parámetros tira información completa sobre todo lo que tenemos en la pc, pero puede filtrarse con por tipos de dispositivo. La sintaxis para usar el comando es la siguiente:
dmidecode --type [nro de tipo]
Acá dejo una tabla de los distintos tipos extraida de las propias manpages de dmidecode.

Type Information
────────────────────────────────────────
0 BIOS
1 System
2 Base Board
3 Chassis
4 Processor
5 Memory Controller
6 Memory Module
7 Cache
8 Port Connector
9 System Slots
10 On Board Devices
11 OEM Strings
12 System Configuration Options
13 BIOS Language
14 Group Associations
15 System Event Log
16 Physical Memory Array
17 Memory Device
18 32-bit Memory Error
19 Memory Array Mapped Address
20 Memory Device Mapped Address
21 Built-in Pointing Device
22 Portable Battery
23 System Reset
24 Hardware Security
25 System Power Controls
26 Voltage Probe
27 Cooling Device
28 Temperature Probe
29 Electrical Current Probe
30 Out-of-band Remote Access
31 Boot Integrity Services
32 System Boot
33 64-bit Memory Error
34 Management Device
35 Management Device Component
36 Management Device Threshold Data
37 Memory Channel
38 IPMI Device
39 Power Supply
40 Additional Information
41 Onboard Device

Espero que les sea de tanta utilidad como a mi.

Saludos!

domingo, 30 de agosto de 2009

All Along the Watchtower

Canción muy buena de Jimi Hendrix. Espero que les guste.

Saludos!

Lista de Programas Open Source

Les dejo acá un link que encontré de wikipedia con una lista resumida de paquetes open source, para aquellos curiosos que anden buscando algo en particular.

Lista de Programas Open Source

Saludos!

jueves, 27 de agosto de 2009

JDK 7

Muy interesante video sobre la próxima versión de java con las cosas nuevas que va a tener.


Saludos!

Celebrity DeathMatch.

Celebrity deathmatch!! Yo veia eso cuando era chico!!



Pelea de Stallone Versus Schwartzeneeger

Saludos!

Usos Creativos de la planilla de cálculos.

Yo en mi vida de IT (si, como it crowd) he visto muchas cosas, pero cada vez me sorporende más la creatividad que tienen los usuarios de las planillas de cálculo (AKA, Excel).
Es cierto que para muchos, las planillas de cálculo son herramientas importantes, pero tanto que para algunas personas han llegado a reemplazar herramientas robustas y hechas explícitamente para ese fin, les dejo acá una lista de las que me acuerdo.

Antes que nada aclaro que se dice el pecado pero no el pecador, y que, por más gracia que nos puede causar a los allegados a las computadoras, lo que voy a exponer no es invento y ha sucedido y sucede en la realidad:

  1. Planilla de cálculo para dibujar un plano en planta de una industria.
  2. Planilla de cálculos para hacer diagramas UML (si, un pecado por propios informáticos).
  3. Planilla de cálculo como una robusta herramienta para hacer organigramas.
  4. Planilla de cálculo como diagrama GANTT.
  5. Planilla de cálculo como procesador de textos (y si, también te corrige la ortografía).
  6. Planilla de cálculo como base de datos de más de 65000 filas (yo creia que para eso existían los DBMS).
  7. Planilla de cálculos como simulador de vuelos (un pequeño huevo de pascuas que traía microsoft excel).
Si me llego a acordar de más completaré un poco mas el post.

Pongan sus experiencias en los comentarios!

Saludos!

domingo, 23 de agosto de 2009

Emesene 1.5

Hoy Me estoy enterando que ha salido una nueva versión de emesene.
Este cliente para Windows live Messenger tiene importantes novedades. Actualmente lo estoy teniendo en proceso de prueba.
La noticia en sí me parece importante ya que este proyecto no ha tenido movimientos desde hace mas de 1 año. Al parecer se está trabajando en una versión 2.

De momento he notado que en esta versión se han solucionado los problemas de "cuelgue" de la gui cuando uno intenta hacer cosas que requieren la red y ésta no responde en el tiempo adecuado.

El plugin de "ahora estoy escuchando" ha incorporado a amarok2 como reproductor, aunque hay que seguirle diciendo de qué reproductor leer. (Kmess detecta esto automáticamente). Pero tiene una característica muy simpática que te pone como avatar la tapa del disco de la canción que uno se encuentra escuchando.

He visto varios plugins nuevos.

Las transferecnias contra un cliente WLM inician (cosa que en otros clientes lamentablemente fallaba).

Iré actualizando el post a medida que vea cosas interesantes.

Saludos!

jueves, 20 de agosto de 2009

XBOX 360

Increible que esta consola sea de Microsoft!


Saludos!

Video: Archlinux + KdeMod 4.2

Acá les dejo un videito de como se hubiera visto su escritorio en archlinux con kdemod hace un tiempo (ahora se usa kde 4.3).

Saludos!

De Ubuntu a ArchLinux Sin dolor Parte 3

Para ver el desarrollo previo ver:
Parte 1
Parte 2

Ahora llega el momento de hacer la instalación definitiva, la cual se resume en 3 pasos:
  1. Copiar todos los archivos que venimos instalando a una partición nueva.
  2. Configurar Grub
  3. Reiniciar en nuestro nuevo sistema.
NOTA: Para quien quiera pisar su ubuntu, recomiendo realizar este paso desde un live cd, borrar el ubutnu que tenía y copiar todos los archivos de arch en la partición donde tenía su root.

Para el primer paso utilicé la herramienta de edición de particiones gparted, e hice espacio suficiente para un sistema base ya que el sistema desde el cual instalé es mi entorno de producción habitual y por un tiempo posiblemente lo necesitaré para responder a urgencias hasta que quede el sistema arch bien configurado.

Una vez creada una partición con espacio suficiente la formateamos en ext4

#mkfs.ext4 /dev/sda2 (en mi caso)

Y una vez formateada, la montamos, por ejemplo yo la monté en /mnt/arch.

Ahora toca el turno de copiar todos los archivos, para ello podemos usar el comando rapido:

cp -r /home/juan/archroot/* /mnt/arch

O utilizar algún gestor de archivos, yo personalmente copié todo utilizando el programa Midnight Commander (mc).

En estos momentos estamos a pocos momentos de finalizar:
Vamos a pasar a modo chroot pero esta vez montando los directorios dev, proc y sys.

mount -o bind /dev /mnt/arch/dev
mount -t proc none /mnt/arch/proc
mount -o bind /sys /mnt/arch/sys

y entramos a modo chroot:
chroot /mnt/arch
Ahora es un buen momento para establecer la clave de root:
passwd clave de root nueva
Configuramos grub a gusto, para quien no sepa como hacerlo les dejo una guia de la arch wiki.
Y eso es todo. Al reiniciar tendremos nuestro menu de grub esperandonos con Archlinux.

Espero que les haya sido de utilidad, cualquier duda posteen en comentarios.

Saludos!

miércoles, 19 de agosto de 2009

De Ubuntu a ArchLinux Sin dolor Parte 2

En un post anterior describí el proceso de instalación de Archlinux en un chroot en particular en ubuntu.
También se encuentra disponible la parte 3 de este proceso.
Ahora le toca el turno a la configuración necesaria para que el sistema pueda arrancar.

Antes que nada, toda la configuración la realicé dentro del chrroot, entonces antes de empezar hay que correr el siguiente comando:
chroot /home/juan/archroot
Cambiando por el directorio donde estén instalando arch.

/etc/rc.conf

El archivo rc.conf se nos instala junto con el paquete initscripts. En archlinux básicamente nos permite configurar el sistema completo en un solo lugar, por ahora será poco lo que toquemos, yo en particular toqué las siguientes líneas:
LOCALE="es_AR.utf8"
TIMEZONE="America/Argentina/Mendoza"
KEYMAP="es"
HOSTNAME="juan-work"
Y luego agregué hal a daemons
DAEMONS=(syslog-ng network netfs crond hal)
Si nos tenemos la suficiente fe de que todo funcione a la primera, podemos agregar gdm (o kdm) a los daemons también.

/etc/locale.gen

Descomenté la siguiente línea y las demás las dejé comentadas:
es_AR.UTF-8 UTF-8
Luego de eso corrí:
locale-gen
Para generar las locales y así tener el sistema en castellano.

xorg.conf

Por defecto arch no tiene xorg.conf pero eso no es un problema en absoluto, en efecto si tenemos hal corriendo no es necesario siquiera tenerlo, pero aprovechando que estamos en un linux funcionando, nos podemos permitir copiar el xorg.conf. Para ello nos salimos del chroot:
exit
cp /etc/X11/xorg.conf /home/juan/archroot/etc/X11
udev

Necesitamos ajustar los permisos de ciertos dispositivos especiales de forma que nos de lo siguiente:

ls -alF /dev/
...
crw------- 1 root root 5, 1 ago 18 15:52 console
crw-rw-rw- 1 root root 1, 3 ago 18 15:52 null
crw-rw-rw- 1 root root 1, 5 ago 18 15:52 zero

Para ello, yo en particular realicé:
chmod a+w /dev/null
chmod a+w /dev/zero
mtab y fstab

mtab lo copiaremos en la etapa de instalación definitiva.

Finalmente podemos configurar /etc/fstab a nuestro gusto y necesidad.

martes, 18 de agosto de 2009

Moby Dick

Moby Dick Por Led Zeppelin, con un increible y ultra largo solo de Batería.

Saludos!

De Ubuntu a ArchLinux Sin dolor Parte 1

En esta serie de entradas voy a ir comentando como va mi migración de un desktop en producción (en mi trabajo) de Xubuntu 9.04 a ArchLinux.

Se encuentra disponible la continuación de este proceso:

Para empezar comento que me baso en esta guía que encontré en la wiki de arch. Pero que detallaré el proceso y lo modificaré según mi experiencia, manos a la obra!

Primero que nada definimos un lugar donde instalaremos el sistema, yo decidí ponerlo en mi home, porque tengo espacio.

$cd --
$mkdir archroot
$cd archroot


Luego de eso, bajar y descomprimir pacman en nuestro directorio.


$wget ftp://ftp.archlinux.org/core/os/i686/pacman-3.3.0-3-i686.pkg.tar.gz
$wget ftp://ftp.archlinux.org/core/os/i686/pacman-mirrorlist-20090616-1-i686.pkg.tar.gz
$tar xzvf pacman-3.3.0-3-i686.pkg.tar.gz
$tar xzvf pacman-mirrorlist-20090616-1-i686.pkg.tar.gz


Pueden bajar la versión mas actualizada de pacman si quieren, pero no es tan necesario.

Ahora con esto pasamos a modo root, y necesitamos copiar la configuración de pacman para usarla en nuestro sistema ubuntu.

$sudo cp etc/pacman.conf /etc/
$sudo cp -r etc/pacman.d /etc/


Ahora editamos el archivo /etc/pacman.d/mirrorlist y le descomentamos algunos mirrors.

Ahora vamos a instalar en nuestro sistema ubuntu una version compilada estáticamente de pacman de forma que podamos usarlo sin problemas, todo esto lo hacemos como root.

#sudo su
#cd /root/
#wget http://repo.archlinux.fr/i686/pacman-static-3.2.2-1.pkg.tar.gz
#cd /
#tar zxvf /root/pacman-static-3.2.2-1.pkg.tar.gz
#mv /usr/bin/pacman.static /usr/bin/pacman


Finalmente para comodidad editamos el .bashrc del root con la siguiente línea:

alias pacman='pacman -r /home/juan/archroot'
Nota: cambiar la ruta /home/juan/archroot por la ruta donde vayan a instalar arch.
Para que tome los cambios
#bash

Ahora podemos manejarnos comodos con pacman.

#pacman -Suy

Para actualizar el pacman que habiamos instalado.

Ahora instalaremos lo necesario para que el sistema corra

El kernel de linux, utilidades de red, y otras cosas.

#pacman -Sf base kernel26 inetutils filesystem grub vim nano pacman

El conjunto base tiene el sistema base.

La razón por la que instalo pacman de nuevo es para satisfacer sus dependencias. También instalo vim y nano personalmente porque yo uso los 2 editores indistintamente. Uso la opción f de pacman para que me sobreescriba archivos que pueden ya existir en mi chroot.

Luego instalar xorg y el entorno de escritorio, yo particularmente instalaré xfce, pero cada uno deberá instalar el entorno que mejor le vaya.

#pacman -S xorg gdm xfce4

Eso es todo por ahora, iré completando el post a medida que voy avanzando.

Saludos!

domingo, 16 de agosto de 2009

Yngwie Malmsteen

Acá les dejo otro video de un super animalito de la guitarra, Yingwie Malmsteen.




Saludos!

jueves, 13 de agosto de 2009

Andy Mckee Drifting

No dejen de perderse a este animalito de la guitarra!!.



Saludos!

Comandos Basicos para Pacman

Hoy, como usuario de archlinux les comentaré algunos comandos que son muy utiles a la hora de usar pacman, el gestor de paquetes de archlinux.

Para una referencia completa les dejo la página de pacman en la wiki de arch.

Actualizar el las listas de repositorios:


#pacman -Sy

A esto le podemos agregar actualización completa del sistema, si le sacamos la 'y' no baja de los repositorios las listas:

#pacman -Suy

Si queremos buscar un paquete en particular:

#pacman -Ss <nombre del paquete>

Si queremos hacer una búsqueda un poco mas abierta podemos hacer:

#pacman -Ss | grep <palabra clave>

Aunque esta forma no siempre nos dará el nombre del paquete a instalar ya que puede que nos de parte de la descripción, pero lo pongo porque a veces sirve.

Para instalar un paquete:

#pacman -S <nombre del paquete>


Para borrar un paquete haciendo cascada a sus dependencias:

#pacman -Rc <nombre del paquete>

Para borrar un paquete borando solo las dependencia huerfanas:

#pacman -Rs <nombre del paquete>

Para verificar si tenemos un paquete instalado:

#pacman -Qs <nombre del paquete>

Para conocer que paquete nos trajo determinado archivo:

#pacman -Ql | grep <archivo>

Esos son mas o menos todos los usos que le doy yo, quien tenga mas es bienvenido a postearlos.

Saludos!

martes, 11 de agosto de 2009

Texas Flood

Hoy un gran Bluesero, Stevie Ray Vaughan.


Espero que lo disfruten, saludos!

TuxGuitar

Para todos aquellos a quienes les gusta tocar guitarra (como a mi) les presento este simpático programa escrito en java por un autor Argentino, TuxGuitar, pueden acceder a la página desde este link.

Mediante este soft tenemos varias formas de editar nuestras canciones, como por ejemplo en pentagrama, tablatura o ambos, también nos ofrece una opción de reproducir lo que escribimos usando el midi de la computadora.



Algunas características:
  • Muchos acordes pre programados, listos para añadir a la tablatura / partitura.
  • Podemos ver equivalencia entre el mastil de la guitarra y las notas.
  • Aspecto gráfico muy agradable.
  • Posee un afinador (no toma sonidos sino que nos da ejemplos de los sonidos de cada cuerda).
  • Exportación a varios formatos.
  • Importación de varios formatos, incluyendo midi.
En mi opinión es un muy buen software que nos ayudará a escribir las canciones a medida que las vamos sacando y por qué no, componiendo.

Espero que les sea de utilidad. Saludos!

viernes, 7 de agosto de 2009

Alicia en el País de las Maravillas

Para el 2010 va a salir un remake de una gran película, y me gustaría compartir el trailer con uds. Tengo grandes espectativas para esta peli además que será de Tim Burton y actuará Johnny Depp.

jueves, 6 de agosto de 2009

KDE 4.3

Acá les dejo un video que muesta las principales características de KDE 4.3.



Saludos!

Distribuir Particiones en Linux

Hoy comentaré algunos lineamientos a tener en cuenta a la hora de definir particiones cuando estamos instalando un sistema Linux.

El Sistema de Archivos.

Lo primero a tener en cuenta son los sistemas de archivos a utilizar. Es común tener un windows por ahi metido para juegos, o porque simplemente aún no nos animamos a hacer el cambiaso, o en mi caso, desarrollo aplicaciones de escritorio y necesito tener algún lugar donde probar parecido a un entorno en producción (y jugar tambien!). Si este es nuestro caso pues entonces recomiendo utilizar nuestra partición de datos en NTFS (tristemente).

Fuera de eso, para linux, por su estabilidad yo recomiendo Reiserfs o Ext4, con ext 4 tenemos posibilidades de recuperar archivos eliminados sin consecuencias catastróficas, y reiser se comporta realmente muy bien.

Distribución de Particiones.

Normalmente vamos a necesitar varias particiones con distintos objetivos.

  1. Una partición para la raíz (/).
  2. Una partición para el home (/home): la ventaja de utilizar esto es que todas nuestras configuraciones sobreviven a las formateadas.
  3. Una partición para los programas de usuarios (/usr): yo personalmente no lo uso, pero no es mala idea si somos de esas personas a las cuales les gusta tener todo el repositorio instalado :P.
  4. Una partición para el kernel (/boot): El objetivo de tener esto es mas bien para la gente fan de compilar su propio kernel, pueden prescindir de usar un initrd y compilar dentro del kernel sólo el sistema de archivos del tipo que sea boot y los demás sistemas de archivos compilarlos como módulos.
  5. Una partición para datos masivos o para compartir con otros sistemas tipo windows.
  6. Una partición para swap; esta, como todas menos la raíz, son opcionales. Especialmente a la swap la podemos tener como archivo y moverla o agrandarla según nos sea conveniente. La ventaja de tenerla como partición la veremos más adelante.


Tamaños de Particiones

Sobre los tamaños de las particiones se puede discrepar un poco, pero en líneas generales sería lo siguiente:

La raíz, lo suficientemente grande como para contener el sistema y sus programas, si usamos una partición de usr entonces puede ser mas bien chica incluso menos de 2 gigas, sino unos 15 o 20 gigas deberían bastar.

Si usamos partición de boot, con unos 100 megas será suficiente, sólo necesita poder contener 1 o 2 kernels.

La partición de home, tan grande como necesitemos para contener nuestros documentos de uso frecuente y esas cosas, si vamos a usar partición de datos, pues no necesitamos que sea tan grande.

La swap por lo general debería ser del doble de la memoria ram, claro está que si tenemos 4 gigas de ram no vamos a gastarnos 8 de disco solo para algo que rara vez se va a usar, como máximo yo diría 2Gigas, una cosa a tener en cuenta es que mientras menos ram real tengamos más necesaria va a ser la swap.

Ubicación para mejorar la performance

Las particiones de menos acceso deberían encontrarse en los extremos del disco (al principio o al final) y las de acceso mas frecuente deberían encontrarse en la mitad del disco, esto es porque el disco pierde muchísimo tiempo moviendo la cabeza lectora a lo ancho del disco por lo tanto si nuestros datos están en el medio nos aseguraríamos que el peor caso sea desplazarse hasta la mitad del ancho del disco, (lo cual es el caso promedio para un acceso cualquiera).

Si tenemos un segundo disco, sería conveniente que la swap se encontrara en éste, de forma que pueda cargar aplicaciones a memoria y paginar al mismo tiempo sin tener que pagar los costos de mover la cabeza lectora.

Si tenemos poca ram nos conviene utilizar partición de swap en la mitad del disco. Si tenemos mucha con un archivo de swap nos bastará.

Bueno, este es el final, cualquier duda no duden en postearla.

Saludos!

miércoles, 5 de agosto de 2009

Aeroplane

Aeroplane de los red hot chili peppers, QUE BAJISTA POR DIOS!.



Saludos!

Archlinux: de KdeMod 4.2 a Kde 4.3

Bueno, escribo este post para orientar un poco con lo que parecen ser grandes noticias. Por empezar arch finalmente ha abandonado la filosofía de empaquetado original de KDE con lo cual ahora podremos instalar o desinstalar aplicaciones individuales sin necesidades de repositorios externos como lo son kdemod.

Para información mas completa sobre este tema ver este link



De KdeMod a KDE

Como alguna vez hice en sentido opuesto toca darle la despedida kdemod, quienes aparentemente ya no tienen razón de existir como repositorio de paquetes kde y espero que se dediquen al gran live cd Chakra Project.

La forma mas fácil de sacar kdemod de nuestras vidas es arrancarlo de un golpe seco.

#pacman -Rc kdemod

Eso eliminaría todo lo que tenga que ver con kdemod de nuestro sistema. Hay que notar que con esto no sólo se elimina kdemod, sino que tabmién se borran muchas aplicaciones KDE como lo son Kmess y Amarok, hay que tener especial cuidado en este punto. Yo personalmente tuve un problemita con el sonido que me volvió loco que mas tarde comentaré. Ahora instalamos lo que queremos.

Yo personalmente instale kdebase, kdeutils, kdeartwork, kdemultmedia, kdegraphics, kdeplasma-addons y algunos paquetes de kdesdk (como kate por ejemplo) y también algunos paquetes de kdeutils como ark, okteta (no uso todas las apps de kde aunque no parezca :P).

Problemas Post-Instalación.

Personalmente no tuve problemas post instalación con el propio kde, a simple vista está bien estable. Tuve que reinstalar apps que no son propias del empaquetado kde como comenté mas arriba (amarok, kmess, etc).

Como parte de la desinstalación de kdemod desinstalé el motor xine para phonon sin darme cuenta con lo cual tuve problemas para hacer andar el sonido. Pero se resuelve instalando phonon-xine

#pacman -S phonon-xine

También hay que recordar reisntalar nuestro gtk-qt-engine si es que tenemos la desgracia de que alguno de nuestros programas preferidos se encuentra escrito en gtk (en mi caso firefox).

Comentarios sobre KDE 4.3

Para finalizar comento que kde 4.3 de momento se encuentra bien estable, he intentado provocar alguno de los bugs conocidos (como achicar los paneles mas de lo permitido) y por ahora lo que he probado está corregido. Finalmente digo que el tema nuevo AIR no resultó ser lo que esperaba, si bien lo continuaré probando me costó mucho elegir un fondo de pantalla con el que se viera bien.

Saludos!