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

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