miércoles, 2 de abril de 2008

Edicion 11 esta listo Full Circle

Una de las revistas interesantes que teratan temas sobre desarrollo, miscelanias, etc en Ubuntu.

Este mes:

  • Linux Mint versus Ubuntu.
  • How-To: TrueCrypt en Ubuntu, iPod Classic & Amarok, Introduccion a LaTeX y mas!
  • Revision de Lenovo 3000 C200 laptop ejecutando Ubuntu.
  • Cartas, Preguntas y respuestas, Mi Escritorio, Top 5 y mas!


Descargar versiones anteriores

lunes, 31 de marzo de 2008

Visita a la Sede de Google

Navegando por internet encontre este interesante informe de un canal argentino donde se muestra como es que viven la gente de google.

Primer informe:

domingo, 30 de marzo de 2008

Insertar un objeto java.sql.Date en SQL Server 2000

En ocasiones queremos saber como insertar un tipo de dato Date del paquete java.sql, normalmente para hacerlo realizamos una conversión CASTING en la sentencia SQL que se le manda a la base de datos, p.e

INSERT INTO ... VALUES(..., convert(varchar,DateColumn,103)...)

En el caso de que no deseamos realizar esa conversion, tenemos el siguiente código:

USE pubs
GO
CREATE TABLE test(test_varchar VARCHAR(255), test_date DATETIME)
GO


/*
* Main.java
*/

package testinsertdate;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
/**
*
* @author hugo
*/
public class Main {

/** Creates a new instance of Main */
public Main() {
}

/**
* @param args the command line arguments
*/
public static void main(String[] args) throws ParseException {
int result = 0;
Connection con = null;
PreparedStatement ps = null;

SimpleDateFormat fecha = new SimpleDateFormat( "dd/MM/yyyy" );

try{
ConnectionFactory cf = new ConnectionFactory( ConnectionFactory.TYPE_MSSQL,
"localhost", "pubs" );
con = cf.getConnection( "sa", "sa" );
ps = con.prepareStatement( "INSERT INTO test VALUES( ?, ? )" );
ps.setString( 1, "test2" );
ps.setDate( 2, new Date( fecha.parse( "15/02/1982" ).getTime() ) );

ps.executeUpdate();
System.out.println( "Conversion sin excepcion!" );
}catch( SQLException sqle ){
sqle.printStackTrace();
}catch( ParseException pe){
pe.printStackTrace();
}finally{
if( ps != null ) ConnectionFactory.close(ps);
if( con != null ) ConnectionFactory.close(con);
}
}
}
Enlaces de interes:
La clase ConnectionFactory ya lo vimos en el el Post de Conexión con SQL Server 2005
Saludos a todos ;)

VT de PHP y MySQL

Esta es una de las primeros videos tutoriales que iré introduciendo en este blog sobre php y otras tecnologías :)

FileUpload Subida de ficheros al servidor

Descargar ficheros es sumamente sencillo desde el servidor, el problema surge cuando queremos subirlos, los JSP y Servlets de Java no tienen mecanismos para poder manejar la subida de ficheros desde formularios, siendo un problema tratar de extraer el contenido desde HTTP request. Una mejor opcion que nos puede ayudar es utilizar librerias de terceros.

Existe una robusta libreria open-source diseñada para este propósito del paquete
Apache Jakarta Commons FileUpload.

Requerimientos

  • Descargar la libreria Jakarta Commons FileUpload 1.2.1: commons-fileupload-1.2.1.jar
  • Ademas de esta libreria necesitaremos otra de complemento interno de Commons FileUpload llamada Jakarta Commons IO librarie: commons-io-1.4.jar. En este articulo se asume que usted esta utilizando estas librerias.
Software de prueba

El código ha sido probado en un entorno de Java EE5 con Tomcat 5.5.17.

Instalando Apache Jakarta Commons FileUpload y IO en el contenedor como Tomcat

El proximo paso es copiar los archivos jar en el directorio $CATALINA_HOME/webapps/NameProyect/WEB-INF/lib de su aplicación.


Diseñar el formulario


Para subir los ficheros al servidor debemos de crear un formulario un poco especial de tipo POST y MultiPart y que la peticion la dirija a un Servlet: subir.jsp
<form method="POST" enctype="multipart/form-data"
action="<%= request.getContextPath()%>/UploadFile">
Por favor, seleccione el trayecto del fichero a cargar
<br><input type="file" name="fichero">
<input type="submit">
</form>


getContextPatch() obtiene la ruta de su aplicación es este caso "/NameProyect"
Figura 1: formulario JSP para subir un archivo al servidor

Creando nuestro Servlet
Ahora hay que crear el Servlet bajo el nombre de UploadFile.java donde se mostará la forma básica de subir ficheros y como configurar algunos aspectos de la subida para un mejor control, como p.e el limitar el tamaño del fichero:
package servlets;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.File;

import java.util.List;
import java.util.Iterator;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;


/**
*
* @author hugo
* @version
*/
public class UploadFile extends HttpServlet {

private String dirUploadFiles; //directorio donde se guardara los archivos


protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();

// 1. obtengo el directorio donde guardare los archivos, desde un parametro de
// contexto en el archivo web.xml
dirUploadFiles = getServletContext().getRealPath( getServletContext().getInitParameter( "dirUploadFiles" ) );

// 2. Si la peticion es de tipo multi-part,
// static boolean isMultipartContent() devuelve true/false
if( ServletFileUpload.isMultipartContent( request ) ){

// 3. crear el arhivo factory
// DiskFileItemfactory es una implementacion de FileItemfactory
// esta implementacion crea una instacia de FileItem que guarda su
// contenido ya sea en la memoria, para elementos pequeños,
// o en un archivo temporal en el disco, para los
// elementos de mayor tamaño
FileItemFactory factory = new DiskFileItemFactory();


// 4. crear el servlet upload
// es un API de alto nivel para procesar subida de archivos
// Por defecto la instancia de ServletFileUpload tiene los siguientes valores:
// * Size threshold = 10,240 bytes. Si el tamaño del archivo está por debajo del umbral,
// se almacenará en memoria. En otro caso se almacenara en un archivo temporal en disco.
// * Tamaño Maximo del cuerpo de la request HTTP = -1.
// El servidor aceptará cuerpos de request de cualquier tamaño.
// * Repository = Directorio que el sistema usa para archivos temporales.
// Se puede recuperar llamando a System.getProperty("java.io.tmpdir").
ServletFileUpload upload = new ServletFileUpload( factory );
/* 5. declaro listUploadFiles
* Contendrá una lista de items de archivo que son instancias de FileItem
* Un item de archivo puede contener un archivo para upload o un
* campo del formulario con la estructura simple nombre-valor
* (ejemplo: <input name="text_field" type="text" />)
*
* Podemos cambiar las opciones mediante setSizeThreshold() y setRespository()
de la clase DiskFileItemFactory y el
método setSizeMax() de la clase ServletFileUpload, por ejemplo:

DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
diskFileItemFactory.setSizeThreshold(40960); // bytes

File repositoryPath = new File("/temp");
diskFileItemFactory.setRepository(repositoryPath);

ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
servletFileUpload.setSizeMax(81920); // bytes

*
*/
// limito a 300 Kb el humbral del tamaño del archivo a subir
// Long.parseLong( getServletContext().getInitParameter( "maxFileSize" ) )
upload.setSizeMax( new Long( getServletContext().getInitParameter( "maxFileSize" ) ).longValue() ); // 1024 x 300 = 307200 bytes = 300 Kb

List listUploadFiles = null;
FileItem item = null;

try{
// 6. adquiere la lista de FileItem asociados a la peticion
listUploadFiles = upload.parseRequest( request );

/* 7. Iterar para obtener todos los FileItem
* vamos a trabajar con generalidad
* programaremos como si quisieramos leer todos los
* campos sean 'simples' o 'file'. Por ello iteramos
* sobre todos los FileItem que recibimos:
* Los parámetros simples los diferenciaremos de los parámetros 'file'
* por medio del método isFormField()
*/
Iterator it = listUploadFiles.iterator();
while( it.hasNext() ){
item = ( FileItem ) it.next();
// 8. evaluamos si el campo es de tipo file, para subir al servidor
if( !item.isFormField() ){
//9. verificamos si el archivo es > 0
if( item.getSize() > 0 ){
// 10. obtener el nombre del archivo
String nombre = item.getName();
// 11. obtener el tipo de archivo
// e. .jpg = "image/jpeg", .txt = "text/plain"
String tipo = item.getContentType();
// 12. obtener el tamaño del archivo
long tamanio = item.getSize();
// 13. obtener la extension
String extension = nombre.substring( nombre.lastIndexOf( "." ) );

out.println( "Nombre: " + nombre + "<br>");
out.println( "Tipo: " + tipo + "<br>");
out.println( "Extension: " + extension + "<br>");
// 14. determinar si el caracter slash es de linux, o windows
//String slashType = ( nombre.lastIndexOf( "\\" ) > 0 ) ? "\\" : "/"; // Windows o Linux
// 15. obtener la ultima posicion del slash en el nombre del archivo
//int startIndex = nombre.lastIndexOf( slashType );
// 16. obtener el nombre del archivo ignorando la ruta completa
//String myArchivo = nombre.substring( startIndex + 1, nombre.length() );
// 17. Guardo archivo del cliente en servidor, con un nombre 'fijo' y la
// extensión que me manda el cliente,
// Create new File object
File archivo = new File( dirUploadFiles, nombre );

// 18. Write the uploaded file to the system
item.write( archivo );
if ( archivo.exists() ){
out.println( "GUARDADO " + archivo.getAbsolutePath() + "</p>");
}else{
// nunca se llega a ejecutar
out.println( "FALLO AL GUARDAR. NO EXISTE " + archivo.getAbsolutePath() + "</p>");
}

}
}
}

}catch( FileUploadException e ){
e.printStackTrace();
}catch (Exception e){
// poner respuesta = false; si existe alguna problema
e.printStackTrace();
}
}
out.println( "Fin de la operacion! ;)");
out.close();
}

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

}


Agreue la siguiente configuración al archivo web.xml:

<servlet>
<servlet-name>UploadFile</servlet-name>
<servlet-class>servlets.UploadFile</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadFile</servlet-name>
<url-pattern>/UploadFile</url-pattern>
</servlet-mapping>
<context-param>
<param-name>dirUploadFiles</param-name>
<param-value>/public/images/avatar</param-value>
</context-param>
<context-param>
<param-name>maxFileSize</param-name>
<param-value>307200</param-value>
</context-param>


Testeando:

Figura 2: Procesamiento de la subida de un fichero al servidor

Notas finales:

  1. Si el tamaño del fichero subido excede los 300 Kb, parametro que hemos configurado dentro de web.xml con el nombre de maxFileSize, no se mostrará ningun mensaje en pantalla luego de que el Servlet proceso la petición de subir el fichero, esto es debido a que detro del bloque try/catch del Servlet UploadFile.java se lanza una excepción del tipo FileUploadBase.FileSizeLimitExceededException por el método parseRequest(), para poder mejorar este comportamiento deberiamos crear un método por ejemplo processFormFiled() que procese la subida de un fichero desde un formulario y que devuelva true/flase como respuesta.
  2. Se puede mejorar la presentación del procesamiento de la subida del fichero mediante un progress bar utilizando Ajax.
Download source code


jueves, 28 de febrero de 2008

Accediendo a SQLServer2005 Express con JDBC - Parte 2 Configuraciones en Netbeans y creación de una clase ConnectionFactory para acceso a base de dato

En esta segunda entrega veremos en primer lugar la implementación de una clase que nos permitirá manejar las operaciones de conexiíon con SQL Server 2005 ( y con otras más):

package sqlserver2005;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


public class ConnectionFactory {
public final static int TYPE_MSSQL = 10;
public final static int TYPE_MYSQL = 20;
public final static int TYPE_ORACLE_10G_EX = 30;
public final static int TYPE_MSSQL2005 = 40;
private String driver;
private String url;

/**
* Constructor que carga el driver jdbc para poder trabajar con la base de datos
*
* @param typeDBMS tipo de base de datos a utilizar
* @param hostName IP o nombre del servidor de base de datos
* @param databaseName nombre de la base de datos con la que deseamos trabajar
*/
public ConnectionFactory( int typeDBMS, String hostName, String databaseName ) {
switch( typeDBMS ){
case 10:{ // Para SQL Server 2000
driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
url = "jdbc:microsoft:sqlserver://" + hostName + ":1433;DatabaseName=" +
databaseName;
break;
}
case 20:{ // Para MySQL 5.0
driver = "com.mysql.jdbc.Driver";
url = "jdbc:mysql://" + hostName + ":3306/" +
databaseName;
break;
}
case 30:{ // Para en Oracle 10g Express Edition
if( databaseName.equals( "" ) )
databaseName = "XE";
else
databaseName = "XE";
driver = "oracle.jdbc.driver.OracleDriver";
url = "jdbc:oracle:thin:@//" + hostName + ":1521/" + databaseName;
break;
}
case 40:{ // Para SQL Server 2005 Express Edition
driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
url = "jdbc:sqlserver://" + hostName + ":1433;DatabaseName=" +
databaseName;
break;
}
}
try{
// cargar la clase Driver
Class.forName( driver );
}catch( ClassNotFoundException cnfe ){
System.out.println( "Error: exception loading driver class" );
}
}

/**
* Devuelve un objeto de tipo Connection válido
*
* @param user usuario de la base de datos
* @param password clave del usuario de la base de datos
* @return Connection
*/
public Connection getConnection( String user, String password ) throws SQLException
{
return DriverManager.getConnection( url, user, password );
}// fin del metodo getConnection

/**
* Metodo para liberar recursos de memoria, cerrando la conextion con la base
* de datos
*
* @param con parametro de tipo Connection
*/
public static void close( Connection con ){
try{
con.close();
}catch( SQLException sqle ){
showMessageError( sqle );
}
}// fin del método closeConnection

/**
* Cierra un objeto ResultSet (Registros)
* @param con parametro de tipo ResultSet
*/
public static void close( ResultSet rs ){
try{
rs.close();
}catch( SQLException sqle ){
showMessageError( sqle );
}
}// fin del método closeConnection


/**
* Cierra un objeto Statement (Consulta)
* @param con parametro de tipo Statement
*/
public static void close( Statement stmt ){
try{
stmt.close();
}catch( SQLException sqle ){
showMessageError( sqle );
}
}// fin del método close

/**
* Cierra un objeto Statement (Consulta)
* @param con parametro de tipo Statement
*/
public static void close( PreparedStatement ps ){
try{
ps.close();
}catch( SQLException sqle ){
showMessageError( sqle );
}
}// fin del método close

/**
* Cierra un objeto Statement (Consulta)
* @param con parametro de tipo Statement
*/
public static void close( CallableStatement cs ){
try{
cs.close();
}catch( SQLException sqle ){
showMessageError( sqle );
}
}// fin del método close

/** muestra un mensaje de error en consolo, según sea el caso */
private static void showMessageError( SQLException sqle ){
System.out.println( "Error:" +
"\nmensaje: " + sqle.getMessage() +
"\nSQLState: " + sqle.getSQLState() +
"\nVencorCode: " + sqle.getErrorCode() + "\n" );
}// fin del método showMessageError
}


martes, 26 de febrero de 2008

Accediendo a SQLServer2005 Express con JDBC - Parte 1 Configuracion de SQL Server 2005 Express

Introduccion
En este tutorial veremos como conectarnos y mostrar datos de SQL Server 2005 Express con JDBC.

Todo esta dividido en 4 partes:

  1. Configuracion de SQL Server 2005 Express
  2. Configuraciones en Netbeans y creación de una clase ConnectionFactory para acceso a base de datos.
  3. Operaciones SQL
  4. Posibles problemas
Requerimientos:
  1. Microsoft SQL Server JDBC Driver
    La última version, visite Microsoft SQL Server 2005 JDBC Driver.
  2. NetBeans con JRE (Java Runtime Environment) version 1.5 o superior
    Puede encontrar en NetBeans.org.
Configuración paso a paso:
  • SQL Server 2005 Express
Por defecto SQL Server 2005 no permite conexiones remotas y esta deshabilitado ls cuenta sa, asi que nosotros tenemos que hacer los cambios respectivos de forma manual, si usted trata de conectarse se le mostrará un mensaje de error por ejemplo sea cual sea el nombre de su servidor:







Otro problema por defecto que puede surgir cuando queremos conectarnos es que las conexiones TCP/IP están deshabilidatas en SQL Server 2005 Express. Asi que JDBC no se puede conectar y usted puede recibir la siguiente exception …
     Network error IOException: Connection refused: connec

Ahora vamos a configurar estas dos opciones:

1. Habilitar TCP/IP
  1. Click Inicio > Todos los programas > Microsoft SQL Server 2005 > Herramientas de configuracion > SQL Server Configuration Manager.
  2. En el panel izquierdo de la ventana d e SQL Server Configuration Manager, expandir Configuracion de red de SQL Server 2005 y click en Protocolos de SQLEXPRESS.
  3. En el panel derecho de la ventana de SQL Server Configuration Manager,Click derecho en TCP/IP y click para habilit ar.
  4. O través click derecho en TCP/IP y c lick en propiedades.
  5. En la ventana de propiedades deTCP/IP, click en el panel direcciones ip, y expanda IPALL.
  6. Debajo de IPALL, borrar el campo de TCP Dynamic Ports y entonces ingrese un numero de puerto en el campo TCP Port. Usualmente, tiene el valor por defecto de 1433.
  7. En la ventana de propiedades TCP/IP, click OK.
  8. En el panel izquierdo de la ventana SQL Server Configuration Manager, click en Servicios de SQL Server 2005.
  9. En el panel derecho de la ventana de SQL Server Co nfiguration Manager,click derecho en SQL Server (SQLEXPRESS) y click en reinicar.

2. Habilitar la autenticación por conexión remota

Para resolver este problema. Uno es habilitar el modo de autenticación ambos SQL Server y Windows en el servidor y la otra es habilitar la conexión remota en el nave gador de SQL Server.
      • Chekear que usted tenga permitido el modo bo th SQL Server and Windows Authentication mode (Si usted no usa el modo Windows Authentication). Para la instancia del usuario ‘sa’.
1. Iniciar sesion usando SQL Server Management Studio Express al Servidor SQL y en modo Windows Authentication. Esto podría usar su cuenta de Windows para autenticarse con SQL Server.
2. En el objeto Explorador, click derecho en el nombre de instancia y seleccionar propiedades.


3. Seleccionar la página Security y cambiar la autenticación del servidor al modo SQL Server and Windows Authentication mode y presionar el boton Ok.
4. Click derecho otravés en el nombre de la instancia, seleccionar Restart para reiniciar el Servicio de SQL Server.

5. Esto es todo. Tienes habilitado el modoSQL Server and Windows authenticat ion, ahora usted puede iniciar sesion en SQL Server con su cuenta de Windows o su cuenta creada.

      • Chekear que usted tenga habilitado la conexión remota en Configuración de superficie de SQL Server
1. Abrir Configuración de superficie de SQL Server.


2. Seleccioar Configuracion de superficie para Servicios y Conexiones.


3. En el lado izquierdo, expandir su instancia de SQL Server -> Motor de base de datos -> Conexiones Remotas. En el lado derecho, seleccionar Conexiones locales y remotas -> Usar TCP/IP y canalizaciones con nombre.

4. En el lado izquierdo, seleccionar Explorador de SQL Server -> Servicio.
En el lado derecho, si el tipo de inicio esta Deshabilitado, usted necesita cambiarlo a Automatico. Clik en Aceptar.

5. Iniciar sesion usando SQL Server Management Studio Express al Servidor SQL y en modo Windows Authentication.

6. En el panel Object Explorer , expandir Security / nodo Logins.

7. Seleccionar el usuario "sa".

8. Click derecho en el usuario "sa"->propiedades e ingresar password para este usuario.


9. Luego seleccione la página Status y dele Click en la opcion enable de Login, Click en Ok

10. Click derecho otravés en el nombre de la instancia, seleccionar Restart para reiniciar el Servicio de SQL Server.

Probando lo hecho:

Usted ha finalizado la configuracion. Ahora intente iniciar sesion en su Servidor SQL de forma remota o en su computadora usando el modo SQL Server authentication.


Inicio de sesion a SQL Server con éxito.