martes, 31 de julio de 2007

API Java para ordenar una List

Utilizando la clase Collections del API de Java podemos ordenar fácilmente objetos de lista List. También se puede utilizar con cualquier clase que implemente Collection (Vector, Map, etc).

// Crear una lista
List lista = Arrays.asList(new String[] {"z", "a", "C"});

// Ordenamos la lista
Collections.sort(lista);// Resulta: C, a, z

// Ordenamos sin importar las mayúsculas
Collections.sort(lista, String.CASE_INSENSITIVE_ORDER);// Resulta: a, C, z

// Ordenamos a la inversa
Collections.sort(lista, Collections.reverseOrder());// Resulta: z, a, C

// Ordenamos sin importar las mayúsculas y a la inversa
Collections.sort(lista, String.CASE_INSENSITIVE_ORDER);
Collections.reverse(lista);// Resulta: z, C, a

Referencias
Exampledepot
Java Collections Framework

viernes, 13 de julio de 2007

Consultas SQL típicas con diferentes bases de datos

Este post es un esbozo


Como hacer las mismas cosas con consultas específicas en función de los diferentes gestores de bases de datos. Todo esto lo encontré en esta página http://troels.arvin.dk/db/rdbms/todavía no terminada, como ellos dicen.

Algunas de las cosas más interesantes me las apunto aquí, porque como las demás cosas, es algo que en algún momento utilizaré, como hoy, que lo he encontrado:

Limit con offset (intervalo de resultados para paginación)

MYSQL

SELECT columnsFROM tablenameORDER BY key ASCLIMIT n OFFSET skip

ORACLE

SELECT * FROM (
SELECT ROW_NUMBER()
OVER (ORDER BY UPPER(_key_) ASC) AS rn,
_tabla_.* FROM _tabla_
)
WHERE RN BETWEEN _ini_ AND _fin_

jueves, 12 de julio de 2007

Referencias mil

Listado de referencias de lenguajes. Son referencias de estas que tienen todos los elementos (constantes, funciones, etc) que no tenemos por qué saber de memoria, pero sí saber que existen y utilizarlos en algún momento.

Javascript:

En W3Schools encontramos todas estas referencias:
En Opera tenemos unos índices de referencia magníficos:
En ABCdatos
  • ASCII (0-128 en decimal y hexadecimmal)
Más

Linux

miércoles, 11 de julio de 2007

Plugins para exploradores fundamentales para desarrollo web

Cuando desarrollamos aplicaciones web, y más en concreto los aspectos gráficos, es muy útil disponer de algo más que nuestro editor de código, html, css, etc. Necesitamos ver cómo queda, porque por muy bien que queramos hacerlo siempre se nos escapa algún detalle.

Cuando esto ocurre tenemos abierto el editor, posiblemente uno wyswyg, Intenet Explorer, Firefox, etc. Y tenemos que andar cambiando entre ventanas para cada pequeño cambio que hacemos en el código hasta que quede perfecto en los exploradores. Un lío.

Por suerte existen herramientas que facilitan esta tarea, son los plugins para desarrollo web, que nos permiten incluso editar en caliente, es decir, mientras lo vemos en el explorador podemos realizar cambios que afectan al instante.

Mozilla Firefox




CSSViewer
Firebug
Web Developer Toolbar

Microsoft Internet Explorer

El patrón Bean

Este post es un esbozo

Este patrón se aplica a una clase. Generalmente un bean es una clase que representa una entidad, y se particulariza porque:
  1. cuenta con métodos getters y setters para sus atributos
  2. sus atributos siguen nomenclatura típica JAVA (empiezan en minúscula y si se componen de más de una palabra, la segunda y sucesivas empiezan en mayúscula)
  3. los métodos get/set se nombran como las variables anteponiendo get/set y con la primera letra de la variable en mayúscula
  4. implementa la interfaz Serializable o
Hasta aquí estamos hablando de un bean con propiedades simples.

Sin embargo un bean (JavaBeans™) permite cuatro tipos de propiedades. La especificación define estos tipos de propiedades:
  • Simple – A bean property with a single value whose changes are independent of changes in any other property.
  • Indexed – A bean property that supports a range of values instead of a single value.
  • Bound – A bean property for which a change to the property results in a notification being sent to some other bean.
  • Constrained – A bean property for which a change to the property results in validation by another bean. The other bean may reject the change if it is not appropriate.

Colorear código fuente para mostrar en web

Primera opción

Si necesitas colorear código fuente para colocar en web, puede interesarte alguna de las siguientes opciones:

una web, donde se ofrece una herramienta gratuita que te da la solución. La herramienta se llama GeSHi Script, y la web es http://www.scourdesign.com/articulos/tutoriales/colorear/index.php

Para colorear un código verás un espacio donde pegarlo, después seleccionar el lenguaje utilizado y listo.

La herramienta te devuelve tres cosas:
  • tu código coloreado perfectamente tal y como se verá en web
  • el código fuente html que pinta tu nuevo código coloreado
  • las reglas de estilos CSS utilizadazas y necesarias para que funcione
La primera vez que colorees código en un lenguaje necesitarás las 2 últimas cosas, y de ahí en adelante, si has añadido las reglas CSS a tu hoja de estilos, ya simplemente necesitarás el código fuente generado.

Segunda opción

La segunda opción para colorear código es CodeHighlighter y está disponible en DanWebb.net. Con esta opción se colorea automáticamente tu código. Con esto quiero decir que el paso, de la primera opción, de coger tu código fuente y generar para ese código concreto el html que lo genera coloreado nos lo saltamos.

CodeHighLighter consiste en unos ficheros JavaScript que colorean el código al cargarse la página.

Para utilizar esta herramienta tendrás que:

  • referenciar los ficheros .js que colorean el código

    <script type="text/javascript"
    src="code_highlighter.js">
    </script>
    <script type="text/javascript"
    src="javascript.js">
    </script>
    <script type="text/javascript"
    src="css.js">
    </script>
    <script type="text/javascript"
    src="html.js">
    </script>
    <script type="text/javascript"
    src="ruby.js">
    </script>

  • Definir en tu hoja de estilos nuevas clases para dar color, que utilizan los .js

    pre {
    border: 1px solid black;
    border-color: #BBB #DDD #DDD #BBB;
    padding: 0.2em 1em;
    line-height: 1.2;
    background: white;
    }
    code {
    font-size: 1.2em;
    }
    .javascript .comment, .ruby .comment {
    color : green;
    font-weight: bold;
    }
    .javascript .string, .ruby .string {
    color : teal;
    }
    .javascript .keywords, .ruby .keywords {
    color : navy;
    }
    .javascript .global {
    color : blue;
    }
    .javascript .brackets, .ruby .brackets {
    color : navy;
    }

  • cuando quieras colorear un código tendrá que ponerlo sencillamente de este modo:

    <pre><code class="ruby"> def foo
    puts "bar"
    end
    </code></pre>

    Se puede ver, se dice el lenguaje utilizado con el atributo class.
La pega que tiene este sistema es que podrás descargar sólo funciones para colorear html, javascript, ruby y css. Pero no te preocupes, porque ampliarlo es muy fácil y podrás hacerlo para el lenguaje que quieras definiendo palabras reservadas, separadores y demás en unas pocas líneas.

martes, 10 de julio de 2007

XML y el objeto DOM de Java

Este post es un esbozo



Supongamos que el archivo "foo.xml" es el siguiente:


<tienda nombre="tienda para geeks" ubicacion="Tokio, Japon">
<computadora nombre="iBook" precio="$1200" />
<historieta nombre="Dragon Ball Volumen 1" precio="$9" />
<nivel_geek_de_la_tienda precio="sin precio" />
</tienda>



Es posible parsear el documento XML en un árbol de objetos Javas con JDom:



SAXBuilder builder = new SAXBuilder ();
Document doc = builder.build (new FileInputStream ("foo.xml"));
Element root = doc.getRootElement ();
// devuelve "tienda" root.getName ();
// devuelve "tienda para geeks" root.getAttributeValue ("nombre");
// devuelve "Tokio, Japon" root.getAttributeValue ("ubicacion");
// devuelve una List de objetos
// que tiene tres Element root.getChildren ();


También es posible realizar el proceso inverso, es decir construir un árbol de elementos y luego crear un archivo XML:


Element root = new Element ("tienda");
root.setAttribute ("nombre", "tienda para geeks");
root.setAttribute ("ubicación", "Tokio, Japon");
Element item1 = new Element ("computadora");
item1.setAttribute ("nombre", "iBook");
item1.setAttribute ("precio", "$1200");
root.addContent (item1);
/* Realizamos lo mismo con los elementos restantes */
XMLOutputter outputter = new XMLOutputter ("",true);
try{
outputter.output (new Document(root),
new FileOutputStream ("foo2.xml"));
}catch (Exception e){
e.getMessage();
}



Referencias

Sun: Manipulating Contents with DOM

W3C DOM

Wikipedia: JDOM

Redirección con Javascript

Para redireccionar con javascript podemos cambiar directamente la url del navegador utilizando para ello la propiedad document.location.href.

Por ejemplo utilizando un evento de clic, podemos redireccionar cambiando la ruta actual por la que queramos.

... onClick="javascript:document.location.href= ..."


Puede ser útil para incluir parámetros en la misma ruta en la que estamos, por ejemplo sacados de un formulario para actualizar otros campos.

<form><input type="text" name="otro" id="otro"/></form>
<a href="#" onClick="javascript:document.location.href=document.location.href + '?otro=' + document.getElementById('otro').value;"> es de otro</a>

Ojo que esto puede hacer que vengan muchas veces los mismos parámetros con valores diferentes si se da muchas veces, y van ordenados en tiempo, el primero es el más viejo...
página.jsp?otro=5667&otro=uyyiu&otro=tttt

Directivas JSP

Este post es un esbozo

Importar clases y/o paquetes
<%@page import="java.sql.*, mipaquete.MiClase"%>

Redirección

Sin parámetros
<jsp:forward page="InformeExcel.jsp"/>

Con parámetros

<jsp:forward page="error.jsp">
<jsp:param name="mensaje" value="Ha ocurrido un error."/>
</jsp:forward>

(Estos parámetros se recogen con request.getParameter("mensaje"))

Inclusión de una página en otra:
<%@include file='cabecera.jsp'>
en este caso, primero se incluye el contenido del fichero y luego se interpreta. import es una directiva de tiempo de compilación, mientras que jsp:include actúa en tiempo de ejecución:

<jsp:include page='cabecera.jsp' flush="[true|false]">

Uso de bean

<jsp:useBean id="estePartido" class="quiniela.Partido"/>


<jsp:setProperty name="estePartido" property="*"/>

<jsp:getProperty name="estePartido" property="formatted" />

Varias juntas:
<%@ page language='java'
contentType="text/html"
info='Mi primera página en JSP"
import='java.util.*'
errorPage='errorQueTeCagas.jsp' %>

Más Info
Wikipedia: Java Server Pages

lunes, 9 de julio de 2007

XML

Este post es un esbozo


XML, sigla en inglés de eXtensible Markup Language («lenguaje de marcas extensible»), es un metalenguaje extensible de etiquetas desarrollado por el World Wide Web Consortium (W3C).

Estructura/sintaxis

Hay dos tipos de elementos: los vacíos y los no vacíos. Hay varias consideraciones importantes a tener en cuenta al respecto:

  • Toda etiqueta no vacía debe tener una etiqueta de cerrado. Así debe estar seguida de . Esto se hace para evitar posibles errores de interpretación.
  • Todos los elementos deben estar perfectamente anidados.
    No es válido poner:

    <ficha><nombre>Angel</ficha></nombre>

    , y sí lo es sin embargo:

    <ficha>
    <nombre>Angel</nombre>
    </ficha>


  • Los elementos vacíos son aquellos que no tienen contenido dentro del documento. Un ejemplo en HTML son las imágenes. La sintaxis correcta para estos elementos implica que la etiqueta tenga siempre esta forma: .


Ejemplo de fichero XML

<?xml version="1.0" encoding="ISO-8859-1"?>
<libro>
<titulo></titulo>
<capitulo>
<titulo></titulo>
<seccion>
<titulo></titulo>
</seccion>
</capitulo>
</libro>

Las etiquetas en detalle

Sobre el nombre de las etiquetas:
  • deben comenzar con letra, subrayado o dos puntos
  • le pueden seguir letras, números, dos puntos, guiones, subrayados, puntos.
  • los nombres XML y sus variaciones están reservados

Pueden tener atributos (adjetivos) o no. Los atributos siempre van en la etiqueta de apertura. Pueden tomar valor o no, si lo toman éste va siempre entre comillas (simples o dobles).

<etiquetaA atributo1="valor1" atributo2="valor2">contenido</etiquetaA>
<etiquetaB atributo/>

La cabecera del documento

<?xml
version="1.0"
encoding="ISO-8859-1" (obligatorio sólo si no es UTF-8 o UTF-16)
standalone="" (doc. independiente yes/no)
?>

Consideraciones

Se distingue entre mayúsculas y minúsculas

Un documento XML está bien formado si guarda las reglas estructurales.

Un documento XML es válido si es válido y se adhiere a una estructura dictada por un esquema (DTD, XSD, DCD, SOX, etc.) [Hablaremos de los esquemas en otro post]

Herramientas para manipulación de XML

Edición:
XRay, Microsoft XML Editor, editores de programación (EditPlus, UltraEdit, vim, emacs, etc)
Programación Java:
DOM
Validación:


Referencias

Referencia Wikipedia
Tutorial básico de XML

domingo, 8 de julio de 2007

Servicios Windows de servidores

Es fecuente que al instalar algunas aplicaciones para desarrollar se nos instalen servicios. Estos servicios, cuando no tenemos que utilizarlos, nos roban una cantidad nada despreciable de RAM que nos deja el equipo en muchos casos con una lentitud desesperante.

Cómo se administran los servicios

Para arrancar, parar o definir el tipo de inicio de un servicio, tenemos que utilizar la Consola de Administración de Servicios de Windows, a la que podemos acceder:

  • mediante Inicio -> Todos los programas -> Herramientas administrativas -> Servicios

  • o bien Inicio -> Ejecutar ( o Win+R) -> y escribiendo services.msc


Los servicios pueden estar iniciados o parados (aunque también se pueden pausar). Cuando aparecen iniciados están en funcionamiento y por tanto disponibles para su uso (y consumiendo memoria).

Para cambiar el estado de un servicio, desde la Consola de Administración de Servicios, buscamos el servicio, hacemos clic derecho y elegimos Iniciar/Detener según lo que queramos.



Por otro lado está el tipo de inicio del servicio. Puede ser automático o manual (y también podría estar deshabilitado). Cuando un servicio tiene el tipo de inicio automático, se iniciará sin nuestro control, cuando sea necesario, probablemente al arrancar tu máquina. Por el contrario, cuando el tipo de inicio es manual, éste servicio sólo se iniciará si lo hacemos nosotros mismos bien desde la consola o bien lanzando algún ejecutable batch. Para todos estos servicios que no utilizamos siempre, conviene por tanto tener establecido el tipo de inicio en manual.

Para cambiar el tipo de inicio de un servicio debes hacer clic derecho soble el servicio deseado y seleccionar Propiedades. Verás que aparece una ventana donde puedes variar el tipo de inicio del servicio.

Listado de servicios típicos cuando desarrollamos

Es un listado que muestra los servicios necesarios para utilizar las funcionalidades básicas de estas aplicaciones. Si se quieren utilizar deben estar iniciados, y si se necesita la memoria que consumen y no se van a utilizar, mejor tenerlos parados.

IIS (Interner Information Service)

  • Administración de ISS

  • Publicación en Worl Wide Web

  • Protocolo Simple de Transferencia de Correo (SMTP) (opcional)

  • Publicación en FTP (opcional)


Oracle XE:

  • OracleServiceXE

  • OracleXETNSListener


VMware:

  • VMware Authorization Service

  • VMware DHCP Service

  • VMware NAT Service

  • VMware Registration Service

  • VMware Virtual Mount Manager Extended

martes, 3 de julio de 2007

Trazas en Java utilizando "Log For Java" (log4j)

Este post es un esbozo


La librería Log4j nos permite crear fácilmente trazas en nuestro código. Simplifica el proceso al límite, únicamente utilizaremos una clase, y será la librería la que se ocupe de trazar en consola o fichero.Las carácterísticas principales son:

  • Trazas en consola y/o fichero

  • Diferentes niveles de trazas (ERROR, DEBUG, INFO, WARN...)

  • Mensajes con información de contexto: clase que produce la traza, hora, etc.

  • Fichero de configuración sencillo donde se especifica la salida de la traza, mensajes, etc.


Ejemplo para trazar el comportamiento de una clase:

public class MiClase1{
static Logger trazas = Logger.getLogger(MiClase.class);
void miFuncion(){
try{
/* ... */
//genera una traza de debugtrazas.debug("Acabo de pasar un bucle");
/* ... */
//genera una traza de informacióntrazas.debug("Inserción correcta en base de datos");
/* ... */
}catch(Exception e){
//genera una traza de errortrazas.error("Ha habido un problema al hacer...",e);
}
}
}

Para especificar la salida de las trazas se utiliza el fichero log4j.properties.Ejemplo del fichero de configuración:

## Establecemos por defecto el nivel de log en 'warning'##
log4j.rootLogger=WARN
## Definición de los appenders ### >> a consola
log4j.appender.consola=org.apache.log4j.ConsoleAppender
log4j.appender.consola.layout=org.apache.log4j.PatternLayout
log4j.appender.consola.layout.ConversionPattern= [%t] %d %-5p %c - %m%n
# >> a fichero
log4j.appender.fichero=org.apache.log4j.FileAppender
log4j.appender.fichero.file=c:\trazas.loglog4j.appender.fichero.append=true
log4j.appender.fichero.layout=org.apache.log4j.PatternLayout
log4j.appender.fichero.layout.ConversionPattern= [%t] %d %-5p %c - %m%n
## Decimos donde queremos que vaya el log de cada clase y su nivel ##
log4j.logger.mipaquete.MiClase1=DEBUG,consola
log4j.logger.mipaquete.MiClase2=DEBUG,fichero

Más Info
Chuidiang.com : Separar el log en varios ficheros
Manual de Log4J por Mauricio SantaCruz