martes, 6 de abril de 2010

Cambio de casa

Este blog ya no está activo, se fue a
http://gishak.wordpress.com/

lunes, 1 de marzo de 2010

Notificar o no?... Un click menos del usuario!

En todo mantenimiento ya sea una aplicación Windows o Web al momento de realizar una acción de guardar los cambios nosotros los involucrados en el aspecto tecnológico preferimos no dar ninguna notificación y nos regocijamos haciendo el típico clear de los controles y dejándolos como si nada pasó, ya que asumimos que si no sale nada es xq todo está Ok, pero nunca falta el usuario acostumbrado a que le avisen hasta el cambio de hora, y al mismo tiempo otro usuario de la misma aplicación el cual cree que le entorpecemos su trabajo xq tiene que dar un click mas luego de haber guardado los cambios ¬_¬
La solución???? Notificaciones no intrusivas :P Las cuales las vemos en aplicaciones que utilizamos a diario: En las notificaciones del outlook/thunderbird, cuando alguien comenta un post en el facebook... etc etc y si no las ves... es xq son no intrusivas xD pero cumplen su labor de informar de alguna acción o evento ocurrido dentro del sistema con el que estamos interactuando.
En las aplicaciones web 1.0 la manera usual de notificar al usuario era con el tipico alert("Cambios realizados con exito"); del querido amigo Javascript; despues con tantos frameworks se comenzaron a mejorar los alertbox:


Pero aunque ahora se ven mucho mejor no eliminan la tarea de dar otro click... en ese momento entra en juego jGrowl un excelente añadido de jQuery, el cual con una sola línea nos permite mostrar mensajes de manera simple y con muy buen estilo!
Descargamos el .js con sus dependencias lo agregamos a nuestra página web y lo único que tenemos que hacer para mostrar la notificacion es llamar la siguiente función js:

$.jGrowl("Se guardaron correctamente los cambios.", { header: 'Notificación' });

Y listo, la notificación se mostrará y se ira desvaneciendo poco a poco sin obligar al usuario a tener que realizar un paso adicional luego de realizar su tarea.

En la siguiente imagen se observa como al guardar los cambios se muestra un mensaje informativo no instrusivo



No sólo exite jGrowl para estas tareas, tambien está el MooTools Window Growl, en fin... en gustos y sabores nada está dicho así que tu eliges :D

Salu2

gish@c






sábado, 20 de febrero de 2010

Hágalo usted mismo!!!

El pan de cada día en el mundo del desarrollo de aplicaciones es encontrarnos con un problema que alguien ya solucionó... El día de hoy he sumado un punto más a la estadística ya que necesitaba generar un organigrama dinámicamente... Haciendo una búsqueda rápida en google encontre un excelente artículo en CodeProject http://www.codeproject.com/KB/cs/TreeGenerator.aspx.
Pero, como buenos consumidores siempre encontramos algo para estar inconformes, y por eso el origen de esta entrada en el blog; ya que al hechar un vistazo al artículo de cp lo primero que noté fue que a pesar de parecer muy funcional no estaba muy bonito gráficamente hablando... Y si está el código disponible... xq no añadirle un pequeño fix para que se vea como yo quiero? Muchas veces somos del grupo miro, utilizo y no toco... Como parte de la gran comunidad del "alguien ya lo hizo" no esta mal de vez en cuando ser ese que tuvo que hacerlo y lo publicó para el uso de los demás, lamentablemente algo no muy profesado en EC...
Yendo al grano, bastó remembrar mis andanzas por el mundo del GDI+ y darle un pequeño smooth a los cuadros del organigrama con unas cuantas líneas:

gr.CompositingQuality = CompositingQuality.HighQuality;
gr.SmoothingMode = SmoothingMode.AntiAlias
;


//Comentando lo hecho x el autor original
//gr.DrawRectangle(boxPen, currentRectangle);

//gr.FillRectangle(new SolidBrush(_BoxFillColor), currentRectangle);

GraphicsPath path = CornerRendererHelper.RoundRectangle(currentRectangle, 20);
gr.FillPath(new LinearGradientBrush(currentRectangle,_BoxFillColor, _BoxFillColor2, LinearGradientMode.BackwardDiagonal), path);


Aquí con la brocha gradient el organigrama se dibuja mucho mejor, y utilizando una utilería hecha por mi buen amigo John (seguramente ni se acuerda que hizo esa clase) el rectangulo se redondea...

He aquí las diferencias:

Code Project:



Luego de las mejoras



Go ahead! Hágalo usted mismo.

Los fuentes modificados de la librería se pueden encontrar aqui

Salu2
gish@c





lunes, 25 de enero de 2010

Cuanto sabe Google de ti?

Alguna vez te has preguntado que hace google con todas las cosas que buscas???... si nadie se va a enterar que buscaste fotos de Megan Fox y le diste click a ese link vago xD ... Pues la verdad es que Google retiene muchisima información de que es lo que haces en la web (resultados de busquedas, direcciones en mapas, sitios visitados, etc etc), ya sea que tengas o no una cuenta google... Pero si tienes una cuenta google y mientras ingenuamente revisas tu gmail, se te ocurre realizar una busqueda y mas aún si estas en tu pc donde siempres estas logoneado con el tipico check de "Remember me" puedes notar que al hacer la tipica busqueda en Google... estas "logoneado"




Y así el monstruo de los servicios en línea tiene todo tu historial de actividades... y si aún no lo crees pues ellos mismos te ofrecen una herramienta para ver tu historial web...
http://www.google.com/history/?hl=en




Y aqui el historial de cosas que he buscado entre ayer y hoy... como se puede ver al lado izquierdo están desde la búsqueda de imagenes, blogs, las noticias (que si leo en google news), en fin... todo el track de mi vida online... Preocupado x tu privacidad??? xD les dejo un excelente add-on para el firefox (GoogleSharing) que no le permite a google hacernos track ya que nos hace de proxy y nos genera una identidad anónima mientras navegamos con el firefox!!! Si algún PRO se le puede encontrar al asunto es el típico: "Alguna vez encontré en google pero no recuerdo el link..." lo cual en lo personal me ha sucedido muchísimas veces y lo he encontrado en mi historial web de búsquedas xD

Así que tú decides en si compartes o no tus preferencias en la web.





Saludos,
gish@c

sábado, 16 de enero de 2010

Edición en JTable con Db4o

Una de las ventajas de una base de datos orientada a objetos como Db4o, es la simplicidad al momento de trabajar con modelos de objetos un poco mas complejos. Este post es para mostrar como usando la flexibilidad de Java junto con Db4o (v7.4) se puede hacer un mantenimiento en un grid, al final el resultado se verá más o menos asi:



Como base tome las clases Car y Pilot que vienen en el tutorial de Db4o, y como se puede ver tiene un combo de seleccion de pilotos ya que es lo minimo que se requiere cuando se tiene un modelo de objetos así.
Lo importante aqui es sacarle el provecho al sistema de referencias de la base de datos, ya que al estar editando los objetos en el grid solo basta con hacer un update a la referencia que es esta editando para que se guarden los cambios, Las clases del proyecto se pueden ver en el gráfico a la izquierda.

El proyecto está con Netbeans 6.5, y en el pkg com.sample.objects estan los objetos mas importantes, los del pkg com.sample son los que agrega por default el nb para proyectos java desktop.
Las clases DBManager, CarDB, y PilotDB son las que se encargan de las consultas y actualizaciones a la base de datos; las clases importantes en las que entraremos en mas detalle son las Model ya que son las clases que se encargan de todo detras del JTable y es donde pondremos lo necesario para persistir cualquier modificación que hagamos directo en la tabla.
Lo principal es comenzar con el modelo que vamos a proveer al JTable para que sepa con lo que está lidiando, asi que extendemos de AbstractTableModel, y se sobrecargan los métodos requeridos, la sobrecarga clave para el ejemplo es del método setValueAt ya que para éste caso luego de establecer el valor a la propiedad actualizamos el objeto que fue editado:



public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
super.setValueAt(aValue, rowIndex, columnIndex);
Car car = getDatasource().get(rowIndex); //Aqui obtenemos la instancia del objeto que está siendo editado
switch (columnIndex) {
case 0:
car.setModel(aValue.toString());
break;
case 1:
car.setColor(aValue.toString());
break;
case 2:
car.setPilot((Pilot) aValue);
break;
DBManager.getInstance().getCarDB().storeCar(car);
}


Básicamente, fuera del código en Java para hacer edición en grid es el único llamado a realizar para persistir las modificaciones. Para que esto sea posible las clases model tienen una lista que utlizan como datasource

public class CarTableModel extends AbstractTableModel {
private List datasource;
.
.


public class PilotComboBoxModel extends AbstractListModel implements ComboBoxModel {
private Pilot current;
private List datasource;
.
.
.


En la clase EditPane se encuentra
la carga de las listas con lo que se obtiene de la base, los objetos se mantienen en el sistema de referencias de Db4o:

//Se carga la lista de pilotos en el combo para el grid
PilotComboBoxModel cmbModel = new PilotComboBoxModel(DBManager.getInstance().getPilotDB().getPilots());
cmbPilots = new JComboBox(cmbModel);
SetTableModel(cmbPilots);

private void SetTableModel(JComboBox cmbPilots) {
//Se carga la lista de carros a mostrar en la tabla
carTableModel = new CarTableModel(DBManager.getInstance().getCarDB().getCars());
//Al jtable carTable le seteamos el model y el editor para la columna de pilotos
carTable.setModel(carTableModel);
carTable.getColumnModel().getColumn(2).setCellEditor(new DefaultCellEditor(cmbPilots));
}


El código del ejemplo se lo pueden descargar aquí y Db4o por aca.

Para usar el ejemplo luego de ejecutar por primera vez el proyecto hay que comentar el llamado a la linea que llena la base de datos en la clase EditInTableDb4oApp.

public static void main(String[] args) {

DBManager.PopulateDatabase();// Comentar despues de primera ejecucion
launch(EditInTableDb4oApp.class, args);
}


En un siguiente post le agrego un par de cosas al ejemplo para cumplir con el CRUD, bueno... el Read es una busqueda que no es para el ejemplo asi que en realidad sera un CUD :P

Saludos,
gish@c