Skin for Launchy

| 0 comentarios

Vaya!!, no he llevado un curso oficial de diseño gráfico(Si me preguntan la teoría del color, no sabría que contestar) pero pss.... hay me defiendo con el photoshop puesto que a veces necesito plasmar esa ideas o curiosidades visuales que quiero.

Por está razón cuando revisé la estructura de los skin que trae por default Launchy no me costo crear una nueva versión, pues solo se necesita crear las imagenes y modificar el archivo 'style.qss' el cual esta basado en CSS y 'misc.txt'. Para finalmente colocarlo dentro de una carpeta bajo el directorio 'skin' del directorio de instalación de Launchy.

Este es el archivo 'style.qss' que uso


#launchy {
}

#opsButton {
border: none;
background: url(opsButton.png);
qproperty-geometry: rect(265 15 14 15);
}

#workingAnimation {
qproperty-geometry: rect(249 15 16 16);
}

#opsButton:pressed {
border: none;
background-image: url(opsButtonPressed.png);
}

#input {
font: 16px Verdana, Arial;
border-width: 0px;
background-color: rgba(0,244,120,0%);
border-style: solid;
color: #666666;
qproperty-alignment: AlignLeft;
qproperty-geometry: rect(77 40 205 18);
}

#output {
font: 10px Verdana, Arial;
border-width: 0px;
background-color: rgba(0,244,120,0%);
border-style: solid;
color: white;
qproperty-alignment: AlignCenter;
qproperty-geometry: rect(25 70 255 18);
}

#outputIcon {
qproperty-geometry: rect(26 33 32 32);
}

#alternatives {
color:#3c3c3c;
font: 11px Verdana, Arial;
alternate-background-color: rgb(242,242,242);
background: white;
selection-background-color: rgb(0,160,227);
selection-color: white;
border: none;
qproperty-geometry: rect(75 92 205 20);
}

QScrollBar#altScroll:vertical {
image: url(scrollBack.png);
width: 16px;
margin: 16px 0px 16px 0px;
}

QScrollBar#altScroll::handle:vertical {
background: qlineargradient(x1:0, y1:0.5, x2:1, y2:0.5, stop:0 white, stop:0.1 rgb(85,85,85), stop:0.7 rgb(40,40,40), stop:0.9 rgb(60,60,60), stop:1 white);
}

QScrollBar#altScroll::sub-line:vertical {
width: 16px;
height: 16px;
subcontrol-position: top;
subcontrol-origin: margin;
image: url(scrollUp.png);
}

QScrollBar#altScroll::add-page:vertical {
background: url(scrollBack.png);
}

QScrollBar#altScroll::sub-page:vertical {
background: url(scrollBack.png);
}

QScrollBar#altScroll::add-line:vertical {
width: 16px;
height: 16px;
subcontrol-position: bottom;
subcontrol-origin: margin;
image: url(scrollDown.png);
}






Descargar Skin

Link de descarga, descomprime la carpeta y colócala bajo el directorio skin de Launchy.

Crear webs para iPhone,iPad y iPod

| 0 comentarios

iPhone

Al día de hoy los geeks aprecian los gadgets de la empresa Apple al grado que son los productos más pedidos en internet. Es por esta razón que estos aparatos están onmipresentes en las visitas de diversos sitios web, que para disgusto de muchos de los visitantes son web's poco amigables y en algunos casos incompatibles a la hora de mostrar el contenido (Caso de Web's puras en Flash entre otros casos)

Por esta razón si en las estadísticas de tu sitio web observas que son varios los visitantes con estos dispositivos, pues no desaproveches esa oportunidad para que tu web incursione en este nicho de dispositivos; aunque hay que aclarar que un buen numero de usuarios son muy exigentes, para ello tu sitio web no solo debe de ser compatible sino además debe de ser amigable y optimizado.

Para ello hay que leer las cabeceras HTTP en cada petición del usuario y enviar un CSS diferente o incluso una pagina diferente para sacar provecho a las dimensiones fisicas que se disponen en estos dispositivos.

El contenido del user-Agent pudiera ser (Con alguna variación en la versión):
iPhone


Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3

iPod

Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3A101a Safari/419.3

iPad

Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) version/4.0.4 Mobile/7B367 Safari/531.21.10


Es mejor tener un sitio web que se visualice en diversos dispositivos y navegadores, ahora; para asertar al tipo de dispositivo del Apple puedes usar los siguientes Scripts:

PHP

// Apple detection array
$Apple = array();
$Apple['UA'] = $_SERVER['HTTP_USER_AGENT'];
$Apple['Device'] = false;
$Apple['Types'] = array('iPhone', 'iPod', 'iPad');
foreach ($Apple['Types'] as $d => $t) {
$Apple[$t] = (strpos($Apple['UA'], $t) !== false);
$Apple['Device'] |= $Apple[$t];
}
// is this an Apple device?
echo
"

Apple device? ", ($Apple['Device'] ? 'true' : 'false'),
"

\n

iPhone? ", ($Apple['iPhone'] ? 'true' : 'false'),
"

\n

iPod? ", ($Apple['iPod'] ? 'true' : 'false'),
"

\n

iPad? ", ($Apple['iPad'] ? 'true' : 'false'),
'

';

Javascript

// Apple detection object
var Apple = {};
Apple.UA = navigator.userAgent;
Apple.Device = false;
Apple.Types = ["iPhone", "iPod", "iPad"];
for (var d = 0; d < Apple.Types.length; d++) {
var t = Apple.Types[d];
Apple[t] = !!Apple.UA.match(new RegExp(t, "i"));
Apple.Device = Apple.Device || Apple[t];
}
// is this an Apple device?
alert(
"Apple device? " + Apple.Device +
"\niPhone? " + Apple.iPhone +
"\niPod? " + Apple.iPod +
"\niPad? " + Apple.iPad
);


Así para redireccionar podrías hacer un
if (Apple.iPhone) window.location.href="http://iphone.mysite.com/";

Algunos sitios web para el ocio

Revisando el mail, me encontre con una lista de sitios web que alguna vez estuvieron dentro del top de los 300 sitios más visitados aquí en México. Es curioso ver la tematica de cada uno.

  • STARTVG.COM>
  • OYUNLAR1.COM
  • TELCEL.COM
  • MEGAUPLOAD.COM
  • COMPUTRABAJO.COM.MX
  • ELNORTE.COM
  • NEOPETS.COM
  • MUNDONICK.COM
  • HABBO.ES
  • WORDPRESS.COM
  • TAGGED.COM
  • DISNEYLATINO.COM
  • SOFTONIC.COM
  • AVISOSDEOCASION.COM
  • UNIVISION.COM
  • WAMBA.COM
  • UNAM.MX
  • PHOTOBUCKET.COM
  • CINEPOLIS.COM.MX
  • JUEGOSDIARIOS.COM


Saludos.

Ebook 'Windows 7: Tips and Tricks'

| 0 comentarios

EbookCortesía del MVP vasu jain el cual consiste en una compilación de 50 tips y sugerencias muy buenas sobre el uso de Windows 7.

Link de descarga: Windows 7 : Tips& Tricks PDF Tamaño : 5.8 MB

Disponible en formato XPS. Windows 7 : Tips& Tricks XPS Tamaño : 6.44 MB

JChat 0.6beta

| 1 comentarios

Bueno desde hace días me baje el proyecto JChat 0.5b de sourceForge.Net, este consiste en una aplicación desarrollada en J2SE, en el cual se implementa un cliente y un servidor para el envío de mensajes en una LAN usando sockets con la API del JDK 1.3.

El proyecto esta sencillo, y bastante olvidado (Su ultima actualización fue en 2001). Entonces mi intervención fue para realizar las mejoras a mi alcance en tiempo y capacidades, abra quien diga que es mejor crear una aplicación desde cero, puesto que el código se encuentra muy ofuscado y contiene partes tenebrosas de código mal implementado, pero bueno; en corto había que aplicar arqueología del software (Resulta arduo entender lo que alguien más hizo sin una buena documentación).




Modificaciones realizadas

  • Refactorización de código, para poder integrar los respectivos frontales Cliente/Servidor
  • Control de algunas excepciones en los Thread de servidor
  • Corrección de warnings según especificación Java 6
  • Reducción de acoplamiento entre clases


Modificaciones que se podrían realizar
  • Aplicar algún patrón de diseño, pues no hay en sí una arquitectura definida
  • Usar non-blocking sockets,para permitir que el proceso de comunicación entre el cliente y el servidor no sean bloqueantes (Java.nio)
  • Uso de Log4j para guardar el log del servidor
  • Cifrado en los datos que se envían por la red


DescargaJchat

Descarga la Versión 0.6beta, recomiendo utilizarla con fines didácticos puesto que aún es versión beta y muy seguro se quede así por largo rato.

Programación de agentes con Robocode API

| 0 comentarios

Introducción
Con el lema "Buir the best - destroy the rest" fue desarrollado el juego Open Source llamado Robocode; iniciado por Mathew Nelson y que hasta la fecha se mantiene vigente debido a las contribuciones de la comunidad y el auspicio de SourceForge. Este juego fue diseñado para ayudar a las personas a programar en el lenguaje Java y de paso divertirse con esta experiencia.

Básicamente consiste en escribir código Java en base a la API proporcionada de tal grado que mejor se defienda y sobreviva un tanque robot 'agente inteligente' del resto, obviando que las batallas se puedan dar en equipos, uno contra uno, o todos contra todos.

Entorno e instalación
Como requisitos:

  • Tener instalado al menos la versión 5 de java que incluya JRE Y JDK; preferentemente el de SUN
  • Tener correctamente configurada la variable del sistema JAVA_HOME

Resulta sencillo ir al sitio oficial del proyecto, descargarse el JAR de la ultima versión y ejecutarlo desde la línea de comandos con:

java -jar robocode-setup-x.y.z.jar



Anatomía del Robocode

imagenConsta de tres partes:
  • Cuerpo - Lleva el arma con el radar en la parte superior. El cuerpo es utilizado para mover el robot hacia adelante y hacia atrás, así como girar a la izquierda oa la derecha.
  • Arma - Utilizado para disparar balas de energía. El cañón puede girar a la izquierda o a la derecha.
  • Radar - Se utiliza para buscar otros robots cuando se mueven. El radar puede girar a la izquierda oa la derecha. El radar genera eventos onScannedRobot cuando se detectan los robots.

Otras de sus características:
  • Tiene ciertas reglas físicas, como movimiento, apuntar, velocidad, que debes tomar en cuenta a la hora de atacar y defenderte
  • Tiene sensores que debes programar para ver a tus objetivos
  • Hay obstáculos contra los que tu tanque puede chocar.
En sí su comportamiento es igual al de un agente inteligente, puesto que cumple con la siguiente definición propuesta por Hayes-Roth:
Los agentes inteligentes continuamente ejecutan tres funciones: perciben las condiciones dinámicas del entorno, actúan para afectar condiciones en el entorno, y razonan para interpretar percepciones, resolver problemas, trazar inferencias, y determinar acciones
por sí esto fuera poco la programación en estos puede ser genética.

Arquitectura del engine de simulación del Robocode



Técnicas, tips y trucos
Resumo algunas técnicas utiliazadas por los maestros del robocode:

  • Evitar la pared factor - Utilizado para evitar que el bot quede atrapado entre las paredes o se desvíe mucho de una dirección
  • Movimiento antigravedad - Consiste en algoritmos para definir algunos puntos en el mapa para así poder evitarlos y crear patrones de movimientos.
  • Objetivos predictivos - Algoritmo que es utilizado para determinar las posiciones del enemigo con mayor precisión y poder realizar disparos más eficaces.

Creación del robot

Para programar un robot acceder al menú Robot>Editor> posteriormente en el editor de robot File>New>Robot. Especificar el nombre del robot (Clase java) y el paquete al que pertenece. Prácticamente hay que extender de una clase llamada Robot (No es más que un hilo) y generar aquellas porciones de código en base a las técnicas, habilidades y trucos existentes, más detalles en la API. Posteriormente guardar y compilar la clase desde Compiler>compile


package robot1;
import robocode.*;
//import java.awt.Color;

/**
* Exterminador - a robot by (Gabriel Mtz.)
*/
public class Exterminador extends Robot
{
/**
* run: Exterminador's default behavior
*/
public void run() {
// After trying out your robot, try uncommenting the import at the top,
// and the next line:
//setColors(Color.red,Color.blue,Color.green);
while(true) {
// Replace the next 4 lines with any behavior you would like
ahead(100);
turnGunRight(360);
back(100);
turnGunRight(360);
}
}

/**
* onScannedRobot: What to do when you see another robot
*/
public void onScannedRobot(ScannedRobotEvent e) {
fire(1);
}

/**
* onHitByBullet: What to do when you're hit by a bullet
*/
public void onHitByBullet(HitByBulletEvent e) {
turnLeft(90 - e.getBearing());
}

}



Test

Determinar si un año es bisiesto

| 0 comentarios

Hace ya un rato, alguien me pidio ayuda con la logica de un programa para calcular si el entero pasado como parametro en un metodo es un año bisiesto. Si por allí alguien tiene la misma duda chequen el siguiente ejemplo realizado con el lenguaje JAVA, el cual puede ser ampliamente adaptado a cualquier otro lenguaje; para fines meramente didacticos:


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
* Haz un programa que pida un año por pantalla y diga si es bisiesto.
* Un año es bisiesto bajo las Siguientes condiciones:
* - Un año divisible por 4 es bisiesto.
* - Un año divisible por 100 no es bisiesto.
* - Un año divisible por 400 es bisiesto
*
*/
public class Bisiesto {
InputStreamReader input = new InputStreamReader(System.in);
BufferedReader buffer = new BufferedReader(input);
int tmp=0;
int num[] = new int[4];

public static void main(String args[]){
Bisiesto ej = new Bisiesto();
ej.ingreso();
}

private void ingreso() {
System.out.print("Ingrese un año: ");
tmp = leerEntero();
if( (tmp%400==0) && !(tmp%100==0) || (tmp%4==0 ) )
System.out.print("El año es bisiesto");
else
System.out.print("El año no es bisiesto.");
}

private int leerEntero() {
try {
tmp = Integer.parseInt( buffer.readLine() );
} catch (NumberFormatException e) {
System.out.print("Solo números, vuelva a ingresar el valor:");
leerEntero();
} catch (IOException e) {
System.out.println("Se ha producido un error");
return 0;
}
return tmp;
}
}

Ahora bien, con fines productivos se puede usar la subclase de java.util.Calendar llamada java.util.GregorianCalendar el cual posee un metodo llamado isLeapYear el cual retorna un booleano indicando si el entero pasado como parametro es bisiesto o no.

public boolean isLeapYear(int year)

La ventaja de usar la API java.util.GregorianCalendar es que podemos revisar un año antes de cristo (En ingles B.C.)

Widget on SWT

| 0 comentarios

Acá en el mundo Java; Swing y SWT veces se consideran como tecnologías de estricta competencia. Ejemplos claros se encuentran en la web, donde abundan opiniones muy validas de cuando usar una u otra para la construcción de aplicaciones cliente (RCP). Sin embargo, en el mundo real, se requiere que ambas tecnologías convivan en una sola aplicación. Este mix resultante entre los dos conjuntos de herramientas no es una tarea sencilla. Por supuesto que se puede hacer, y se puede hacer de tal manera que los dos conjuntos de herramientas se integren sin problemas.

Como no había hablado de SWT en este blog, empezare haciendo una aplicación sencilla que muestre de manera rápida como se programan algunos controles y eventos en SWT. Dejando pendiente para otro post la integración de SWT/JFace con Swing + un control Flamingo etc., lo cual requiere de conocimientos más avanzados, aunque si ya has programado en SWing no deberías tener dificultades para aprender SWT, el debate de cuando usar cada uno lo puedes checar en [1].

Se me ha ocurrido empezar crear un widget para testear la conexion con algún DBMS

Config1


package vista;

//import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;


public class FormConnection{

//Variables
private Display display;
private Shell shell;
private Label lblInst;
//private Label lblSep;
private Label lblServer;
private Label lblBD;
private Label lblPort;
private Label lblUser;
private Label lblPass;
private Button btnAceptar;
private Text txtServer;
private Text txtBD;
private Text txtPort;
private Text txtUser;
private Text txtPass;
private Group grp;
private GridData gridDataH;
private GridData gridDataHVTop;
private GridData gridDataHV;
private Combo cmb;

public void initComponents(){

display = new Display();

GridLayout gly = new GridLayout();
gly.numColumns = 2;

shell = new Shell(display,SWT.MIN | SWT.CLOSE);
shell.setText("Configuración");
shell.addShellListener(new ShellAdapter(){
public void shellClosed(ShellEvent event){
int i = Mensajes.showMessageBoxYN(shell, "¿Desea salir de la aplicación?");
if(i == SWT.YES){
event.doit = true;
} else {
event.doit = false;
}
}
});
//x,y,width,height
shell.setBounds(300, 300, 290, 270);

shell.setLayout(gly);

gridDataHVTop = new GridData();
gridDataHVTop.horizontalSpan = 2;
gridDataHVTop.horizontalAlignment = GridData.FILL;
gridDataHVTop.grabExcessHorizontalSpace = true;

lblInst = new Label(shell, SWT.WRAP);
lblInst.setText("Especifique en cada uno de los campos, los parametros "+
"necesarios para establecer la conexión con el DBMS de su preferencia.");
lblInst.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
lblInst.setLayoutData(gridDataHVTop);

//lblSep = new Label(shell, SWT.SEPARATOR | SWT.HORIZONTAL);

gridDataHV = new GridData();
gridDataHV.horizontalSpan = 2;
gridDataHV.horizontalAlignment = GridData.FILL;
gridDataHV.grabExcessHorizontalSpace = true;

grp = new Group(shell, SWT.SHADOW_IN);
grp.setLayoutData(gridDataHV);
grp.setText("Datos de la conexión");
grp.setLayout(gly);
grp.setSize(200, 200);

lblServer = new Label(grp, SWT.LEFT);
lblServer.setText("Nombre del servidor:");

gridDataHV = new GridData();
gridDataHV.horizontalSpan = 1;
gridDataHV.horizontalAlignment = GridData.FILL;
gridDataHV.grabExcessHorizontalSpace = true;

txtServer = new Text(grp, SWT.BORDER | SWT.SINGLE);
txtServer.setLayoutData(gridDataHV);

lblBD = new Label(grp, SWT.LEFT);
lblBD.setText("Nombre de la BD:");

txtBD = new Text(grp, SWT.BORDER | SWT.SINGLE);
txtBD.setLayoutData(gridDataHV);

lblPort = new Label(grp, SWT.LEFT);
lblPort.setText("Numero de puerto:");

txtPort = new Text(grp, SWT.BORDER | SWT.SINGLE);
txtPort.setText("1521");
txtPort.addVerifyListener(new VerifyListener() {
public void verifyText(VerifyEvent event) {
event.doit = event.text.length() == 0
|| Character.isDigit(event.text.charAt(0));
}
});
txtPort.setToolTipText("Solo numeros en este campo");
txtPort.setLayoutData(gridDataHV);

lblUser = new Label(grp, SWT.LEFT);
lblUser.setText("Nombre de usuario:");

txtUser = new Text(grp, SWT.BORDER | SWT.SINGLE);
txtUser.setLayoutData(gridDataHV);

lblPass = new Label(grp, SWT.LEFT);
lblPass.setText("Password:");

txtPass = new Text(grp, SWT.BORDER | SWT.PASSWORD);
txtPass.setLayoutData(gridDataHV);

cmb = new Combo(shell,SWT.READ_ONLY);
cmb.setItems(new String[]{ "Oracle 10G Express", "MS SQL Server 05/08"});
cmb.select(0);
cmb.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent event) {
Mensajes.showMessageBoxOK(shell, "Se ha establecido la conexión con: "+
cmb.getText() );
}
});

gridDataH = new GridData();
gridDataH.horizontalSpan = 1;
gridDataH.horizontalAlignment = GridData.FILL;
gridDataH.grabExcessHorizontalSpace = true;

cmb.setLayoutData(gridDataH);

btnAceptar = new Button(shell, SWT.PUSH);
btnAceptar.setText(" Aceptar ");
btnAceptar.setToolTipText("Acepta los cambios realizados");
btnAceptar.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
Mensajes.showMessageBoxOK(shell, "Se presiono el " +
event.getSource().toString());
}
});

gridDataH = new GridData();
gridDataH.horizontalSpan = 1;
gridDataH.horizontalAlignment = GridData.FILL;
gridDataH.grabExcessHorizontalSpace = false;

btnAceptar.setLayoutData(gridDataH);
shell.setDefaultButton(btnAceptar);

//shell.pack(); //Ajusta todos los controles
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()){
display.sleep();
}
}
display.dispose();
}

public static void main(String[] args) {
new FormConnection().initComponents();
}
}



Recomiendo lean la API org.eclipse.swt en la página de Eclipse para mas detalles. Por cierto no olviden agregar la biblioteca org.eclipse.swt.win32.win32.x86_3.n.n.vnnnn.jar (o su correspondiente en GNU/Linux u OSX)

Descargas
  • Descargar este demo y ejecutar el archivo JAR



Referencias

http://www.ibm.com/developerworks/opensource/library/os-swingswt/

Saludos y hasta la próxima.

El impacto economico de Microsoft Windows 7

| 0 comentarios

Windows 7 estará disponible a partir de Octubre de 2009, lo cual en un rato más sera una nota vieja, bien lo interesante es el estudio reciente de la empresa IDC, el cual calcula que se venderan 177 millones de licencias de este SO para el año 2010.


Para Microsoft, el lanzamiento de Windows 7 sugiere un fuerte crecimiento de los clientes del sistema operativo. Puesto que el impacto de Windows 7 llegará mucho más allá de Microsoft, dando crecimiento a muchas de las empresas de TI en todo el mundo desde la que vende hardware, desarrolla software, proporcionan servicios de TI, o sirven como canales de distribución de TI. Este crecimiento hará poco para ayudar a las economías de todo el mundo a salir de la crisis económica actual.


Para finales del 2010, mas de 7 millones de personas en el mundo de la industria de TI estaran trabajando con Windows 7 o el 19% de la fuerza laboral de TI

Estas y otras revelaciones se presenta en el estudio realizado, con todo esto la pregunta que me hago es: ¿Se renovara el ecosistema de TI con windows 7?.



ver PDF (190KB.)

Componentes Ribbon en Java

| 4 comentarios

Platicando hace algunos días con algunos ingenieros sobre las causas que obligaron al team de Microsoft Office a rediseñar por completo su interfaz gráfica (Chequen las ponencias del MIX08), coincidiendo todos en que efectivamente fue muy buena y fundamentada solución crear componentes Ribbon para mejorar la experiencia de los usuarios (Pensando en un proceso de: búsqueda, diseño, prototipado y evaluación).

Fundamentado en estas mismas razones se ha desarrollado el proyecto Flamingo el cual fue presentado en el JavaOne de este año con bombo y platillo; puesto que se encuentra mas estable que nunca.

flamingo




Este proyecto tiene soporte para la mayoría de los contenedores, botones de comandos, tooltips etc. que de igual forma existen en Ribbon.


Siendo cortos realice algunos demos, uno de los que me llamo la atención fue la barra para buscar archivos del sistema BreadcrumbFileSelector


import java.awt.BorderLayout;
import java.io.File;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import org.jvnet.flamingo.bcb.core.BreadcrumbFileSelector;
/**
*
* @author Gabriel Mtz. Nájera
*/

public class FileTreePanel extends JPanel {

private BreadcrumbFileSelector bar;

public FileTreePanel() {
this.bar = new BreadcrumbFileSelector();
JPanel navigation = new JPanel(new BorderLayout());

navigation.add(bar, BorderLayout.CENTER);
this.setLayout(new BorderLayout());
this.add(navigation);
this.bar.setPath(new File(System.getProperty("user.home")));
}

public static void main(String[] args){

SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame("árbol de archivos");
frame.setSize(800, 80);
frame.setLocationRelativeTo(null);
frame.add(new FileTreePanel());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}


Recomiendo lean la API org.jvnet.flamingo para mas detalles, si bien el proyecto ya tiene su rato, siento que a partir de su presentación en el JavaOne 2009 despegará con mayor fuerza.

Descargas
  • Descargar este demo y ejecutar el archivo JAR
  • Descargar diapositivas del JavaOne



Saludos.

Java + SQL Server 2005/2008

Dirijido a las personas que me habian preguntado como realizar la conexión entre una aplicación java y SQL Server usando el JDBC.

Los parametros y detalles de la conexion la encuenran en el sitio de microsoft aquí

Entonces el formato general de la URL de conexión es:


jdbc:sqlserver://[serverName[\instanceName][:portNumber]][;property=value[;property=value]]


donde:

jdbc:sqlserver:// (obligatorio) es el subprotocolo y es constante.

serverName (opcional) es la dirección del servidor con el que se establece la conexión. Puede ser un DNS o una dirección IP o bien un host local o 127.0.0.1 para el equipo local. Si no se especifica en la URL de conexión, es necesario especificar el nombre del servidor en la colección de propiedades.

instanceName (opcional) es la instancia para establecer la conexión con serverName. Si no se especifica, se establece una conexión con la instancia predeterminada.

portNumber (opcional) es el puerto para establecer la conexión con serverName. El valor predeterminado es 1433. Si usa el valor predeterminado, no es necesario especificar el puerto ni el signo ":" precedente en la dirección URL.

Una vez que tengan definida su cadena de conexión, se puede crear la conexión a la BD, en mi caso me descargue el Microsoft SQL Server JDBC Driver 2.0 liberado en marzo de este año, pero bueno un ejemplo:


//carga del Driver
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//Se establece la conexion con el servidor de BD
dbConnection = DriverManager.getConnection("jdbc:sqlserver://192.168.0.123:1433;databaseName=BD_Check;",
"User1", "12345");
//Se crea el objeto statement
Statement stm = dbConnection.createStatement();
private PreparedStatement enrollStmt;
enrollStmt = dbConnection.prepareStatement("SELECT * FROM enroll");
enrollStmt.executeQuery()
//Posteriormente se cierra la conexión
if(!enrollStmt.isClosed())
enrollStmt.close();
if(!dbConnection.isClosed())
dbConnection.close();


Recomiendo lean la API java.sql para mas detalles.

NOTA:Los chicos de microsoft constantemente mueven las paginas del servidor, por lo que en algún momento el link podría estar roto.

Mega menús desplegables (How To)

| 0 comentarios

Diseñar para la web, requiere de un poco de inspiración, por eso no es raro que constantemente me sorprenda con sitios verdaderamente creativos y originales (Saludos yatta).

Soluciones para esas ideas creativas hay muchas, para este post supondremos que deseamos realizar un panel de navegación horizontal para nuestro sitio solo que para hacerlo más interesante; este desplegara un panel con un grupo de opciones en cuanto se posicione el puntero del mouse sobre una opción del menú; con esto se pretende mejorar la navegación del sitio y por supuesto que la usabilidad del mismo. Véase el siguiente ejemplo:

BigMenu

Nuestro ejemplo sera simple y con un solo grupo de opciones que estará coherentemente agrupada, aunque bien pudiera hacerse con CSS, habría que explorar las incompatibilidades que se puedan generar entre los navegadores Web, por esta razón el problema será resuelto usando JQuery y un Plugin de este llamado hoverIntent

Diseño


Supondremos que el sitio web, es de una ferretería, por lo que incluiremos una opción en el menú que diga promociones, el cual desplegará las promociones de forma clasificada

Markup


Se hace un menú sencillo de forma horizontal:

Code1

Después se añade un div al enlace que contendrá el grupo de opciones que en este caso es para "Promociones", obsérvese la clase megamenu que se ha agregado que nos permite indicar el Mega menú.

code2


Estilo



Es momento de darle estilo y sentido a lo que se ha echo, se muestra una parte del archivo CSS en el cual se da formato a los tipos de letra, elementos div etc.:


body {
font-family: "Lucida Grande", "Lucida Sans Unicode", "Verdana", sans-serif;
font-size: 11px;
background: #fff;
color: #333;
}

h1, h2, h3, h4, h5, h6, p, ul, li {
font-size: 1em;
margin: 0;
padding: 0;
}


div#banner {
background: transparent url(logo.gif) top left no-repeat;
padding-top: 12px;
padding-bottom: 36px;
}

div#banner h1, div#navegacion h2 {
margin: 0;
padding: 0;
}

div#banner h1 a {
display: block;
width: 270px;
height: 120px;
}
div#banner h1 a span, div#banner .skip {
position: absolute;
top: -10000px;
left: -10000px;
}

ul#navegacion {
background: #940;
color: #fff;
margin: 0;
padding: 0.3em 0em;
}


ul#navegacion li {
display: inline;
margin: 0.1em 1em;
position: relative;
}

ul#navegacion h2, ul#navegacion h3 {
font-size: 100%;
font-weight: normal;
display: inline;
}


ul#navegacion li a {
color: #fff;
text-decoration: none;
padding: 0 0.4em;
}

ul#navegacion li a:hover {
text-decoration:blink;
}

ul#navegacion li.megamenu a {
background: transparent url(arrow.gif) center right no-repeat;
padding: 0 1.2em;
}

ul#navegacion li.megamenu a:hover {
text-decoration: underline;
}

ul#navegacion div {
display: none;
}

ul#navegacion li.megamenu div {
border: 1px solid #dda;
width: 18em;
position: absolute;
top: 1.6em;
left: 0em;
padding: 1.3em;
background: #ffc;
color: #930;
}

ul#navegacion li.hovering div {
display: block;
}

ul#navegacion li.megamenu div a {
color: #300;
padding: 0;
background-image: none;
text-decoration: underline;
}

ul#navegacion div h3 {
color: #f70;
font-weight: bold;
font-size: 1.1em;
}
ul#navegacion div p {
margin: 0 0 0.8em 0;
padding: 0;
}



Lo interesante: Script


Para realizar este ejemplo existen script's en la web que son bienvenidos también, aunque como ya se ha dicho para este ejemplo se usa JQuery que bueno semejante monstruo tiene muchas más aplicaciones que esta que le estamos dando.

Entonces se agrega una referencia desde nuestro HTML al JQuery y otra más al Plugin hoverIntent:



.
.
script src="completed_files/jquery-1.3.2.min.js" type="text/javascript" charset="utf-8">
.
.
.
script src="completed_files/jquery.hoverIntent.minified.js" type="text/javascript" charset="utf-8">
.
.


Despues hay que escribir un par de funciones que agrega y otra remueve la clase hovering y se especifican los parámetros que indican la reacción ante el puntero del mouse.



$(document).ready(function() {

function addMega(){
$(this).addClass("hovering");
}

function removeMega(){
$(this).removeClass("hovering");
}

var megaConfig = {
interval: 300,
sensitivity: 3,
over: addMega,
timeout: 500,
out: removeMega
};

$("li.mega").hoverIntent(megaConfig)


Codigo fuente


Ejemplo del HTML aquí mostrado
Ejemplo del CSS aquí mostrado

Enlaces


[http://cherne.net/brian/resources/jquery.hoverIntent.html ]

Me gustaría hablar en otros post sobre JQuery, aunque apenas estoy aprendiendo de sus bondades si me gustaria sacarle más provecho a su funcionalidad, pero bueno espero haberlos dejado picado con la información, me gustaría que hablaran sobre algunas desventajas que por cierto es un tema del que tal vez hable después.

JEdit - Guia de inicio

| 0 comentarios

Objetivo


Destacar las características de JEdit de manera suficiente, de tal forma que pueda ser considerado como una antesala para la utilización de IDE's a futuro.

Introducción


JEdit destaca de otros editores de código java (Tambien XML, Phyton,Scheme,ActionScript,PL-SQL,C++,C#,CSS,PHP,Ruby,Haskell,Lisp,Fortran etc.) por ser extensible y altamente configurable, es un proyecto GPL, por ende se puede revisar el código de este con fines autodidactas y ¿por que no?, reutilizar algunos de sus componentes en algún proyecto escolar.

Características de JEdit


  • Home del proyecto: http://www.jedit.org/
  • Escrito en Java
  • Se ejecuta sobre Mac OS X, OS/2, Unix, VMS y Windows
  • Arquitectura extensible mediante plugins
  • Soporta la sintaxis de mas de 130 lenguajes de programación
  • Encoding UTF-8 y Unicode
  • Administrador de plugins


Administrar algunos de los plugins


Para ejemplos prácticos, empezaremos por descargarnos el JCompiler, para ello hay que hacer uso del Plugin Manager, al seleccionar un plugin automáticamente se marcan las dependencias que puedan existir para el plugin, después de haber seleccionado el plugin presionar el botón descargar (También se pueden configurar los mirrors de descarga =) ).

Reutilizar algunos de los componentes de este editor


Asi es, una vez accediendo al source del proyecto, se puede reutilizar algunos de los componentes del editor, se me ocurre el frontal para la búsqueda de texto, aunque esto lo dejaremos para otro post.

Configurar JEdit


La Configuración de este editor esta accesible desde el menú utilities > global Options, este frontal es intuitivo y facil de configurar. Por ejemplo se pueden cambiar los iconos de la barra de herramientas del editor. En este caso he optado por los iconos de famfam y por algunos otros, en fin puede hacer un mix si así lo desea.



Editar y compilar archivos java


Una vez descargado el JCompiler y todas sus dependencias como console, ErrorList, JavaCore y obviando que están correctamente configuradas las variables del sistema como: JAVA_HOME,JRE_HOME,CLASSPATH,PATH; se procede a la compilación de archivos java, plugins > console > javac.

Obviamente se puede configurar los parámetros pasados al compilador java.



Conclusión


Aunque el proyecto esta un poco flojo (No abandonado) al momento de redactar este post, bien vale la pena echarle una vistazo. Hay que aclarar que JEdit no tiene toda esa gran cantidad de funcionalidades que posee un Entorno de Desarrollo Integrado, pues su objetivo es ser sencillo, para el desarrollo de proyectos pequeño - mediano y altamente configurable, lo cual hace bien. Espero haber cumplido con el objetivo.

CommunityOne 18/marZo/2009

| 0 comentarios

CommunityOneCOMMUNITYONE EAST
March 18, 2009 | sun.com/communityone
Live Webcast and Live Chat

 

 

Hay que aceptarlo, la economía es mala, pero tus opciones para el desarrollo no deben de serlo. Si tu estas enfocado a la creación de aplicaciones Web robustas, o la construcción de una infraestructura escalable, o pensando en la computo en la nube, entonces esto te interesa, si deseas recibir todo un día de educación, innovación y cambios la cita es el 18 de marzo.

 

Agenda

------------------------------------------------------------------------

CommunityOne East Web Event Agenda — (all times are EDT)
March 18, 2009
9:00 a.m.General Session featuring Dave Douglas and Lew Tucker, Sun Microsystems.

10:10 a.m.MySQL and PHP — State of the Union
Hans Zaunere, New York PHP, LLC

11:10 a.m.Open Storage with OpenSolaris
Peter Buckingham, Sun Microsystems, Inc.

12:40 p.m.NetBeans 6.5 and Glassfish v3 — The Synergy for Pragmatic Java EE 6 Development
Adam Bien, Consultant

1:40 p.m.Analyzing PHP Web Applications with DTrace
David Soria Parra, Sun Microsystems, Inc.

3:00 p.m.The Third Wave of Open: Open Source and Business Models
Simon Phipps, Sun Microsystems, Inc.

4:00 p.m.Persistent Clouds: New Models for Data Storage
Geir Magnusson Jr., 10gen

5:00 p.m.Cloud Panel discussion, moderated by David Berlind

------------------------------------------------------------------------

Algoritmo para aplicar Base64

Si hay algo que aveces se requiere realizar es codificar un archivo binario a texto ASCII y viceversa, si este es tu caso puedes utilizar Base64, el cual es muy sencillo y rápido de implementar aunque no es del todo seguro.

Los usuarios de PHP pueden hacer uso de las funciones nativas base64_encode y base64_decode,los de Python pueden importar el paquete base64 para servirse de este, de todas formas puedes usar la siguiente herramienta en linea llamada Binary File to Base64 Encoder / Translator, ver referencia [1].

Ahora que si deseas realizar algún tipo de encriptado para tu proyecto con un mínimo de esfuerzo, puedes optar por la biblioteca jasypt, ver referencia [4].


Introduccion

¿Que es BASE64 y donde se utiliza?

El Base64 Content-Transfer-Encoding está diseñado para representar secuencias arbitrarias de octetos en una forma que no necesita ser humanamente legible. Los algoritmos de codificación y decodificación son simples, pero los datos codificados son sistemáticamente sólo alrededor del 33% más grande que los datos sin codificar.

Esta compuesta por un subconjunto 65 de caracteres US-ASCII, permitiendo 6 bits para ser representados por caracteres imprimibles. (El 65° carácter adicional, "=", se utiliza para significar una función específica para la transformación.)

Aquí 3 Bytes se representan con una cadena de texto de 4 caracteres,en total estos 24 bits se subdividen en agrupaciones de 6 bits, cada uno de los cuales se traduce en un solo dígito en el alfabeto base64. En otras palabras estos 6 bits se usan como índice en una matriz de 64 caracteres imprimibles.


Esquema de codificación de bytes del algoritmo Base64

+-primer octeto--+-segundo octeto--+--tercer octeto--+
|0 1 1 1 0 1 1 0 | 0 1 0 1 0 1 1 1 | 0 0 0 0 0 1 1 0 |
+-----------+----+-------+---------+----+------------+
|5 4 3 2 1 0|5 4 3 2 1 0|5 4 3 2 1 0|5 4 3 2 1 0 |
+ carácter 4+ carácter 3 + carácter 2 + carácter 1 +


Tabla 1: El alfabeto Base64

Value Encoding Value Encoding Value Encoding Value Encoding
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w (pad) =
15 P 32 g 49 x
16 Q 33 h 50 y


Todos los saltos de línea, espacios en blanco u otros caracteres que no se encuentra en la Tabla 1 deben de ser ignorado por el software de decodificación.

Esta codificación es prácticamente idéntica a la utilizada en la privacidad de Correo Mayor (PEM), también en la URL's de algunos sitios, PGP, Thunderbird y Evolution lo ocupan para el cifrado de contraseñas en los correos entre otros. Ver referencia [2].

Codificación Base64 en las URL's

Esta codificación puede ser nombrada como "base64url" y no debe considerarse igual que "base64". Esta es técnicamente idéntica a la anterior, a excepción de del carácter 62 y 63 del alfabeto, una alternativa al alfabeto sugerido es utilizar "~" como carácter en la posición 63. Debido a que el carácter "~" tiene un significado especial en algunos entornos de sistema de archivos, aunque no se recomienda.

Se ocupa para apuntar a algún nombre de archivo o dirección de manera segura en la web, es por ello que hay URL's que son lo suficientemente cortas como para cortar y pegar.Por eso la codificación de seis bits por carácter (base 64) que es mucho mejor que la codificación de cinco bits por carácter (base 32).

Por ejemplo:

http://localhost:4004/id/1b17864eeb6c68294c9b2db0324a2b773401f0da0537d82626c24a7850e15ef2d6c4265dcd5e85f1

La misma URL en base64:

http://localhost:4004/id/GxeGTutsaClMmy2wMkordzQB8NoFN9gmJsJKeFDhXvLWxCZdzV6F8Q

Se puede deducir entonces que Base64 es 17% mas compacto que Base32

Desarrollo

He implementado una clase para realizar el codificado, la cual se llama Base64Encoder.java la cual esta disponible desde este enlace [3]. En cuanto tenga listo el decodificador lo publicare aquí.

Enlaces

[1]http://www.greywyvern.com/code/php/binary2base64
[2]http://www.ietf.org/rfc.html (The Internet Engineering Task Force)

- REQUEST FOR COMMENTS -

2045 Multipurpose Internet Mail Extensions (MIME) Part One: Format of
Internet Message Bodies. N. Freed, N. Borenstein. November 1996.
(Format: TXT=72932 bytes) (Obsoletes RFC1521, RFC1522, RFC1590)
(Updated by RFC2184, RFC2231, RFC5335) (Status: DRAFT STANDARD)

2046 Multipurpose Internet Mail Extensions (MIME) Part Two: Media
Types. N. Freed, N. Borenstein. November 1996. (Format: TXT=105854
bytes) (Obsoletes RFC1521, RFC1522, RFC1590) (Updated by RFC2646,
RFC3798, RFC5147) (Status: DRAFT STANDARD)

3548 The Base16, Base32, and Base64 Data Encodings. S. Josefsson, Ed..
July 2003. (Format: TXT=26363 bytes) (Obsoleted by RFC4648) (Status:
INFORMATIONAL)

4648 The Base16, Base32, and Base64 Data Encodings. S. Josefsson.
October 2006. (Format: TXT=35491 bytes) (Obsoletes RFC3548) (Status:
PROPOSED STANDARD)

5335 Internationalized Email Headers. Y. Abel, Ed.. September 2008.
(Format: TXT=27945 bytes) (Updates RFC2045, RFC2822) (Status:
EXPERIMENTAL)

[3] http://explotandocodigo.100webspace.net/Public/encode/Base64Encoder.html
[4] http://www.jasypt.org/

Guia de inicio para Ireport

| 0 comentarios

Como ya lo había prometido, a continuación un post sobre el diseñador Ireport para JasperReports. Trataré de describir la funcionalidad de este sin que este se vea comprometido con un solo sistema operativo.

OBJETIVO:

  • Conocer la utilidad de esta
  • Tener una perspectiva de manera rápida aunque no definitiva de las cosas que se pueden hacer con Ireport
  • Tener una solución bajo la manga
  • Que esta guía sea una referencia para alguien en este Cyberespacio

INTRODUCCION

¿Qué es Ireport?

  • Diseñador de reportes gráficos muy complejos si así lo requerimos para JasperReports
  • Un programa OpenSource (GPL)
  • Esta escrito al 100% en Java
  • La versión comercial de esta y la que se recomienda para la producción se llama JasperStudio la cual es mantenida por la empresa JasperSoft Corporation
  • Esta integrada en la Jasper Bussines Intelligence Suite
  • Sitio WEB

Algunas Características

  • Categoría: Bussines Intelligence
  • Soporte para TrueType
  • Manejo de múltiples fuentes de datos como: todas las bases de datos soportadas por JDBC, archivos XML, CSV, Hibernate entre otros…
  • Soporta SQL, HQL, EJBQL, MDX y Xpath
  • Wizard para la creación de reportes y sub-reportes
  • Más de 30 elementos para formatear el reporte (lineas, elipses, TextFields, charts,código de barras, etc.)
  • El núcleo de este es una biblioteca llamada JasperReports, la cual fue desarrollada por Teodor Danclu de JasperSoft Corporation
  • Los reportes generados se puede pre visualizar y/o exportar en PDF, HTML, RTF, XLS, CSV, TXT y más...

Example2

Desarrollo

Para poder ejecutar el Ireport se necesita el SDK 1.5.0 o superior, 256MB de RAM y al menos 20 megas de espacio en disco.

Estructura de los reportes

La estructura de los reportes se encuentra dividida por secciones horizontales llamadas "Bandas", las cuales son rellenadas con los datos que requerimos en una posición especifica, es aquí donde se definen las reglas del reporte

Esta divida en 9 bandas, en las cuales se pueden removidas o agregadas en el reporte, por default se muestran:

  • Titulo
  • Header de pagina
  • Header de columnas
  • Detalle
  • Pie de columna
  • Pie de pagina
  • Ultimo pie de pagina
  • Sumario




JRXML y archivos jasper

Un reporte es guardado en un archivo tipo XML el cual cada una de sus secciones se encuentra definido por jasperreport.dtd, es por eso que el archivo fuente tiene la extensión "*.JRXML" el cual contiene la configuración del reporte físicamente, las dimensiones de la pagina entre otras.

Si la compilación de este archivo se realiza de manera correcta genera entre otros un archivo con extensión "Jasper" el cual puede ser interpretado por la JVM.

Elementos y letras

Los elementos contenidos en un reporte pueden ser:

  • Lineas
  • Elipses
  • Texto estático
  • Texto Dinámico
  • Imagenes
  • Rectangulos con/sin relleno
  • Sub-reportes
  • Codigo de Barras
  • Graficas
  • HyperLink
  • etc.

Esta se encuentra en la barra de herramientas

BarraIreport

Expresiones dentro del reporte

Las expresiones que se pueden manejar dentro de un reporte son instrucciones en lenguaje Java siempre y cuando el resultado sea un objeto (Que extienda de Object pues).

Entonces desde una expresión se puede referir a parámetros, variables fields y lo que se encuentre definido dentro del reporte, aquí algunas sintaxis:



$F{field} Especifica el nombre de un Field
$V{variable} Especifica el nombre de una Variable
$P{parametro} Especifica el nombre de un Parametro
$P!{parametro} Una sintaxis especial usada en una consulta SQL, indica que
el parametro no debe de ser tratado como un valor por ejemplo:

SELECT * FROM empleado $P!(ID)}
Que equivale a decir dado que ID=5
SELECT *FROM empleado WHERE ID = 5


Además se puede usar Groovy como lenguaje dentro de las expresiones

Creación de una conexión con JDBC (Datasources)

Ireport tiene la capacidad de soportar lenguajes de consulta como: SQL, HQL, EJBL, MDX y XPath. Ahora que si no se va a utilizar una consulta a la Base de Datos, no necesitas una consulta dentro del reporte; sino un DATASOURCE

Un datasource es un objeto que itera sobre un record parecido a una tabla. JasperReport provee algunas implementaciones de DataSources que pueden ser envueltas en estructuras de datos genericas como: Arrays o Colecciones de javaBeans, result sets, table models, CSV y archivos XML.

Aquí una lista de datasource y conexiones provistas por Ireport



Plugin para NetBeans

Aqui un tutorial para poder agregar y configurar el plugin necesario para poder trabajar con Ireport desde Netbeans, el ejemplo esta basado en la distro GNU/Linux Ubuntu [2] y aqui otro hecho desde MAC [3].

CONCLUSIÓN

Espero haber logrado los objetivos planeados.

REFERENCIAS

[1] http://jasperforge.org/plugins/project/project_home.php?group_id=83
[2] http://wiki.netbeans.org/Avbravotutorialbasiconetbeansreports
[3] http://wiki.netbeans.org/NBDemoIReport

Convertir un numero a su descripcion en letras (JAVA)

| 11 comentarios

Recientemente tuve la necesidad de realizar la conversión de un numero en su descripción en letras o mejor dicho en pesos mexicanos. Creo que el algoritmo se llama "Conversión del importe" o "Función del importe en letras" y la web habla tendido y largo de esto.

* Para los que programan en Visual Basic(Pronto me incluiré en esta lista), en la web hay una buena cantidad de ejemplos (GUILLE)

Me llamo la atención este código hecho en Visual Basic, el cual adapte a Java


Public Function Num2Text(ByVal value As Double) As String
Select Case value
Case 0 : Num2Text = "CERO"
Case 1 : Num2Text = "UN"
Case 2 : Num2Text = "DOS"
Case 3 : Num2Text = "TRES"
Case 4 : Num2Text = "CUATRO"
Case 5 : Num2Text = "CINCO"
Case 6 : Num2Text = "SEIS"
Case 7 : Num2Text = "SIETE"
Case 8 : Num2Text = "OCHO"
Case 9 : Num2Text = "NUEVE"
Case 10 : Num2Text = "DIEZ"
Case 11 : Num2Text = "ONCE"
Case 12 : Num2Text = "DOCE"
Case 13 : Num2Text = "TRECE"
Case 14 : Num2Text = "CATORCE"
Case 15 : Num2Text = "QUINCE"
Case Is < 20 : Num2Text = "DIECI" & Num2Text(value - 10)
Case 20 : Num2Text = "VEINTE"
Case Is < 30 : Num2Text = "VEINTI" & Num2Text(value - 20)
Case 30 : Num2Text = "TREINTA"
Case 40 : Num2Text = "CUARENTA"
Case 50 : Num2Text = "CINCUENTA"
Case 60 : Num2Text = "SESENTA"
Case 70 : Num2Text = "SETENTA"
Case 80 : Num2Text = "OCHENTA"
Case 90 : Num2Text = "NOVENTA"
Case Is < 100 : Num2Text = Num2Text(Int(value \ 10) * 10) & " Y " & Num2Text(value Mod 10)
Case 100 : Num2Text = "CIEN"
Case Is < 200 : Num2Text = "CIENTO " & Num2Text(value - 100)
Case 200, 300, 400, 600, 800 : Num2Text = Num2Text(Int(value \ 100)) & "CIENTOS"
Case 500 : Num2Text = "QUINIENTOS"
Case 700 : Num2Text = "SETECIENTOS"
Case 900 : Num2Text = "NOVECIENTOS"
Case Is < 1000 : Num2Text = Num2Text(Int(value \ 100) * 100) & " " & Num2Text(value Mod 100)
Case 1000 : Num2Text = "MIL"
Case Is < 2000 : Num2Text = "MIL " & Num2Text(value Mod 1000)
Case Is < 1000000 : Num2Text = Num2Text(Int(value \ 1000)) & " MIL"
If value Mod 1000 Then Num2Text = Num2Text & " " & Num2Text(value Mod 1000)
Case 1000000 : Num2Text = "UN MILLON"
Case Is < 2000000 : Num2Text = "UN MILLON " & Num2Text(value Mod 1000000)
Case Is < 1000000000000.0# : Num2Text = Num2Text(Int(value / 1000000)) & " MILLONES "
If (value - Int(value / 1000000) * 1000000) Then Num2Text = Num2Text & " " & Num2Text(value - Int(value / 1000000) * 1000000)
Case 1000000000000.0# : Num2Text = "UN BILLON"
Case Is < 2000000000000.0# : Num2Text = "UN BILLON " & Num2Text(value - Int(value / 1000000000000.0#) * 1000000000000.0#)
Case Else : Num2Text = Num2Text(Int(value / 1000000000000.0#)) & " BILLONES"
If (value - Int(value / 1000000000000.0#) * 1000000000000.0#) Then Num2Text = Num2Text & " " & Num2Text(value - Int(value / 1000000000000.0#) * 1000000000000.0#)
End Select
End Function



* Para lo que usen Crystal report, ya tienen la solución en la mesa
* Hay algoritmos que sobrepasan el numero 999 999 999
* Esta fue mi propuesta por supuesto que no es una solución definitiva (Considerando que los números que usaré no son muy grandes)


/**
* @author Gabriel Mtz.
*/
public class Converter {
Integer counter=0;
String value="";

public String getStringOfNumber(Integer $num){
this.counter = $num;
return doThings($num);
}

private String doThings(Integer _counter){
//Limite
if(_counter >2000000)
return "DOS MILLONES";

switch(_counter){
case 0: return "CERO";
case 1: return "UN"; //UNO
case 2: return "DOS";
case 3: return "TRES";
case 4: return "CUATRO";
case 5: return "CINCO";
case 6: return "SEIS";
case 7: return "SIETE";
case 8: return "OCHO";
case 9: return "NUEVE";
case 10: return "DIEZ";
case 11: return "ONCE";
case 12: return "DOCE";
case 13: return "TRECE";
case 14: return "CATORCE";
case 15: return "QUINCE";
case 20: return "VEINTE";
case 30: return "TREINTA";
case 40: return "CUARENTA";
case 50: return "CINCUENTA";
case 60: return "SESENTA";
case 70: return "SETENTA";
case 80: return "OCHENTA";
case 90: return "NOVENTA";
case 100: return "CIEN";

case 200: return "DOSCIENTOS";
case 300: return "TRESCIENTOS";
case 400: return "CUATROCIENTOS";
case 500: return "QUINIENTOS";
case 600: return "SEISCIENTOS";
case 700: return "SETECIENTOS";
case 800: return "OCHOCIENTOS";
case 900: return "NOVECIENTOS";

case 1000: return "MIL";

case 1000000: return "UN MILLON";
case 2000000: return "DOS MILLONES";
}
if(_counter<20){
//System.out.println(">15");
return "DIECI"+ doThings(_counter-10);
}
if(_counter<30){
//System.out.println(">20");
return "VEINTI" + doThings(_counter-20);
}
if(_counter<100){
//System.out.println("<100");
return doThings( (int)(_counter/10)*10 ) + " Y " + doThings(_counter%10);
}
if(_counter<200){
//System.out.println("<200");
return "CIENTO " + doThings( _counter - 100 );
}
if(_counter<1000){
//System.out.println("<1000");
return doThings( (int)(_counter/100)*100 ) + " " + doThings(_counter%100);
}
if(_counter<2000){
//System.out.println("<2000");
return "MIL " + doThings( _counter % 1000 );
}
if(_counter<1000000){
String var="";
//System.out.println("<1000000");
var = doThings((int)(_counter/1000)) + " MIL" ;
if(_counter % 1000!=0){
//System.out.println(var);
var += " " + doThings(_counter % 1000);
}
return var;
}
if(_counter<2000000){
return "UN MILLON " + doThings( _counter % 1000000 );
}
return "";
}
}



El resto depende de lo que quieran lograr con este algoritmo. Podrían adaptarlo para que sea especifico a un Locale, Moneda o tal vez para cierto idioma =)

Aún Sigo vigente

| 1 comentarios

Tenia bastante rato de no postear nada, vaya he estado ocupado ultimamente.

En el próximo post realizaré un tutorial sobre el Ireport para JasperReport, abordando temas como:

  • Origen y tendencias del producto
  • Licencias
  • Estructura de un reporte
  • Elementos que contiene un reporte para esta herramienta
  • JRDataSource
  • DataSource y QueryExecuters
  • Scriptlets
  • SubReports
  • Plug-ins para NetBeans
  • Y otras...

Solo esperen a que termine una aplicación que he empezado, de está solo mostrare una imagen.



Login

Conexion a BD en Access desde Java

| 2 comentarios

Desde hace días traía en la mente una vaga curiosidad que no es nada nueva para muchos pero sí para el autor de este blog, nada mas que acceder a datos dentro de una base de datos en Microsoft Access desde un entorno Java, pues siempre hay necesidad de hacer que los datos sean persistentes y que mejor si están dentro de una BD relacional, que para fines didácticos sería bueno empezar con unas cuantas tablas y pensando que no habra un ambiente transaccional muy concurrente y que la base de datos está centralizada.(Si ya sé que tu usas algún potente DBMS).

Lo cual resulto muy fácil pues en java para comunicarnos con la Base de datos haremos uso de la API JDBC™. El cual es un driver muy especifico para cada DBMS que se desea manipular, por ende el catalogo de driver es muy amplio.[1]

Para el ejemplo que hice eche mano del puente JDBC-to-ODBC el cual me permite conectar a Microsoft ODBC (Open Database Connectivity) en java lo encontramos como (sun.jdbc.odbc.JdbcOdbcDriver), extra a esto el controlador ODBC debe existir en el equipo cliente (En el inicuo mundo Windows XP se accede a través de la opción de herramientas administrativas) y normalmente requiere la configuración de la fuente de datos ODBC puesto que la mayoría de los sistemas de gestión de bases de datos requieren que el usuario inicie sesión antes de acceder a la misma. Es por esta razón que el metodo getConnection() de la claseDriveManager está sobrecargado para soportar las diferentes métodos de acceso.

Aquí un formulario realizado

Formulario para alta y bajas

Para el ejemplo utilice una clase la cual se puede ver aquí [2]

Formas de desarrollar una aplicación en C#

| 2 comentarios

Tenia tiempo que no posteba un tema de tipo técnico y cuando tenia el tiempo no sabía que postear, es por esa razón que se me ocurre explorar otras plataformas de desarrollo, como .NET y por supuesto usando el caballito de batalla de C#, las razones por la que he decidido explorar esta plataforma me las reservo, así que para fines educativos en este blog me limitare a hablar de las diversas formas en las que se pueden crear aplicaciones en C#, obviamente la mejor herramienta a utilizar dependerá del contexto del problema (No querrás hacer una clase muy pequeñita en un Visual studio 2008, cuando lo puedes hacer en un editor de texto sencillo).

Objetivos

  • Eliminar la falsa creencia que tienen algunos que para desarrollar sus aplicaciones sobre .NET deben comprar una licencia de Visual Studio.
  • Mostrar algunas herramientas para desarrollar en .NET usando programas libres u OpenSource descargables.
  • Ampliar el panorama para poder desarrollar aplicaciones en C#

Introducción

El kit de desarrollo para NET Framework 3.5 (SDK) proporciona numerosos compiladores, utilidades de línea de comandos, white papers, ejemplos de código, bibliotecas de clases, y una completa documentación del sistema. Este puede ser descargado de [1]. NOTA:Si optas por instalar alguna versión del Visual Studio evitaras instalar el SDK de forma manual.

Desarrollo

Desarrollando la aplicación haciendo uso del CSC (Desde ambiente Win)

Como se habrán dado cuenta, si tiene un IDE no es necesario andar ejecutando código desde la linea de comandos de windows, pero piense las razones por las que ha compilado un .java desde esa misma consola, entonces ¿Hay razón de usarlo con un .cs? ¿Si o no?.

Si ha decido hacerlo de esta manera, no hay que olvidar que el compilador puede recibir parámetros además del nombre de la clase, como por ejemplo:


/out Esta opción es usada para especificar el nombre del assembly a crear. Aunque por default el nombre es el mismo que el archivo .cs
/target:exe Puede omitirse pues esta por default.
/target:library Crea un archivo DLL(Biblioteca de enlaces dinámicos).
/target:module Crea un Modulo.
/target:winexe Para aplicaciones basadas en interfaz de usuario, impide que se muestre una consola durante la ejecución
/r:namespace1 Sustituir namespace1 por el/los namespace que se desea referenciar

Por ejemplo C:\>csc /target:exe fuente.cs
C:\>csc /r:System.Windows.Forms.dll *.cs


Desarrollando la aplicación con el TextPad

Obviamente no solo se puede utilizar para C#, pero bueno se puede descargar desde [2]. Para poder sentirse realmente cómodo con este programa hay que configurar la impresión estética para el lenguaje a utilizar y para eso hay que indicarle que escoja csharp.syn(Si se desea trabajar con C#) de la lista que tiene, luego hay que especificar de acuerdo a nuestras necesidades que parámetros queremos que le pase al compilador cada vez que compilemos el código e indicarle la ruta para llegar al compilador. Si con esto aún no esta conforme diríjase a [3] para bajar algún plug-ins que mejor le acomode (Wow, no sabia que tenia un autocompletador de código para Java!!).

Desarrollando la aplicación con SharpDevelop

Descargable desde [5], el cual es un IDE OpenSource para los lenguajes como C#, VB y Boo (Microsoft y Mono).

  • Compatible con .Net framework SDK 3.5
  • Diseño muy parecido a los IDE's Microsoft
  • Completamente integrable con NUnit y NAnt (herramientas para el testeo de software)
  • Utilidades para diseñar la BD
  • Diseñador Visual de formularios
  • Utilidades para convertir código de C# a VB
  • Útil para plataformas cruzadas


Notepad++_screen

Desarrollando la aplicación usando MonoDevelop

Se ha echo un fork para SharpDevelop llamado MonoDevelop el cual es un entorno de desarrollo integrado libre y gratuito, diseñado primordialmente para C# y otros lenguajes .NET como Nemerle, Boo, y Java (via IKVM.NET), basicamente es mas enfocado para el desarrollador en Mono, el cual es descargable desde [7].

MonoDev

Desarrollando la aplicación con el Notepad++

Para descargarlo checa este link [4], al parecer no hay mucho que decir de este, todo esta en la página web y se define como: "un editor gratuito de código fuente, que soporta varios lenguajes de programación y se ejecuta en MS Windows... basado en el componente de edición Scintilla, escrito en C++ utilizando directamente la API de win32 y STL... se distribuye bajo los términos de GPL de GNU."

Notepad++_screen

Desarrollando la aplicación con C# 2005/2008 Express edition

Desde el verano de 2004, Microsoft introdujo una nueva línea de IDE's "Express", los cuales están descargables desde aquí[6]. Estos son completamente gratis debido a que es apoyado y mantenido por Microsof (¿Alguna vez dije que los estudiantes no tenemos dinero?)

Características destacadas:

  • Soporte para Windows Presentation Foundation (WPF) y XAML
  • IntelliSense
  • Capacidad para programar Xbox 360 y juegos de PC, utilizando Microsoft XNA Game Studio

Desarrollando la aplicación con Visual Studio 2005/2008

La razón por la cual deje esta opción a lo ultimo es muy clara, pues es el IDE que tiene un costo (Un buen costo diría yo) y al cual varios aspiran a usar. Si el lector ha llegado hasta esta parte sabrá entonces cuando sacar la artillería pesada para realizar ese ambicioso proyecto de SW posiblemente a nivel empresarial.

Conclusión
Espero haber cumplido los objetivos que me plantee al principio.

Bibliografía

[1] http://msdn.microsoft.com/es-es/netframework/default.aspx
[2] http://www.textpad.com
[3] http://www.textpad.com/add-ons/
[4] http://notepad-plus.sourceforge.net/es/site.htm
[5] http://www.icsharpcode.net/OpenSource/SD/
[6] http://www.microsoft.com/express/
[7] http://www.monodevelop.com/Main_Page