lunes, 17 de diciembre de 2007

Problemas con Subversion en Eclipse (Subclipse)

1. Cambio de usuario:

Cuando utilizo Subclipse para sincronizar los ficheros de un proyecto, suelo utilizar siempre el mismo usuario, así que la primera vez que me solicita el usuario, lo introduzco y lo guardo para que no me lo vuelva a pedir.

Pero suele pasar que por alguna razón necesito sincronizar con otro usuario diferente desde Eclipse, y ahí vienen los problemas: el plugin Subclipse no tiene ninguna opción desde la que hacer este cambio. Así que me lo apunto:

Solución:

Si estoy en Windows XP, con Eclipse cerrado (por si las moscas), elimino la carpeta
C:\Documents and Settings\[usuario]\Datos de programa\Subversion, y al volver a intentar sincronizar volverá a aparecerme la ventana que me pide mi nombre de usuario y contraseña ;)
En Windows Vista el proceso es el mismo, pero con la carpeta C:\Users\[usuario]\AppData\Roaming\Subversion

Un truco interesante es guardar las carpetas de cada usuario, renombrando la carpeta Subclipse en lugar de eliminándola.

2. Fichero bloqueado:

Ante mensajes como este:


(...)
Attempted to lock an already-locked dir svn: Working copy 'C:\java\projects\prueba' locked
(...)


que no nos dejan sincronizar, la solución es tan fácil como lanzar desde Eclipse una limpieza del repositorio, haciendo clic derecho en el proyecto -> Team -> Clean

martes, 11 de diciembre de 2007

Accesibilidad en la web: Textos alternativos en imágenes

Toda web accesible debe proporcionar para cada elemento no textual una alternativa en texto. Para hacer esto utilizamos las propiedades alt, longdesc o el propio contenido de la etiqueta.

Esta regla responde a Prioridad 1 de la WAI.

Los elementos para los que tenemos que tener esta regla en cuenta son:

  • Imágenes (incluidas las utilizadas para listados, como spacers y botones)

  • Representaciones gráficas de texto (se incluyen los símbolos)

  • Regiones de imágenes que utilizan map

  • Animaciones (por ejemplo con imágenes GIF)

  • Applets y objetos de programación como scripts

  • Frames

  • Sonidos (reproducidos con o sin interacción por parte del usuario)


Hasta aquí la norma, incluir textos alternativos, pero es deber del desarrollador proporcionar textos útiles y apropiados a cada situación.

En esta ocasión me centraré en las imágenes, explicando los casos con los que nos podemos encontrar, y cómo resolverlos.

Se pueden clasificar las imágenes utilizadas en la web, a grandes rasgos en:

  1. Decorativas
    Si no aportan nada en absoluto al contenido de la web utilizaremos alt=""
    Si contienen un texto pondremos el texto de la imagen (Ej.: <img src="ministerioCultura.gif" alt="Ministerio de Cultura">)
    Si representan un logotipo (alt="Google logo")
    Cuando la ilistración está explicada en el texto (alt="")
    Si está dentro de un enlace <a href=...>...</a> y es lo único que aparece; no poner alt="Enlace a..., alt="Ir a..., los navegadores deberían representar los enlaces como tales.

  2. Formato
    Para dar espacios adicionales (alt=" ")
    Para simular listas (alt="*")
    Para simular líneas de separación (alt="")

  3. Apoyo al texto
    El atributo alt depende de la información que aporte la imagen.
    Ejemplo 1: <img src="alerta.gif" alt="Atención:"> Lea atentamente las instrucciones.
    Ejemplo 2: <img src="congreso.jpg" alt="Imagen con la fachada del Congreso"> Hoy se celebra un pleno extraordinario que determinará si en nuestro ...

  4. Sustitución de texto
    Cuando la imagen representa una letra o símbolo (src="beta.gif" alt="Beta")
    Cuando la imagen representa por si misma la información, es necesario aportar una descripción más detallada, por ejemplo en mapas, gráficos, etc. Para estos casos se utiliza longdesc. Como es un atributo que no está completamente soportado por los navegadores, se utiliza lo que se conoce como d-link, que no es otra cosa que proporcionar un enlace a la descripción textual de la imagen. Puede hacerse de dos modos:
    Ejemplo 1:

    <a href="prediccion.txt"
    title="Seleccione para una descripción en texto">
    <img src="imagenes/prediccion.jpg"
    alt="Predicción del tiempo (España 31/marzo/2005),
    seleccione para una descripción en texto"/>
    </a>

    Ejemplo 2:

    <img src="imagenes/prediccion.jpg"
    alt="Predicción del tiempo (España 31/marzo/2005)"/>
    <a href="prediccion.txt"
    title="Predicción del tiempo (España 31/marzo/2005)">
    D
    </a>


  5. Mapa
    Si la imagen se utiliza como mapa (etiqueta map), poner el objetivo global en alt.
    Si el mapa es un un client-side map, poner a cada región un título descriptivo mediante el atributo title

sábado, 20 de octubre de 2007

Recoger el valor de un campo "disabled"

¿Cómo puedo obtener el valor de un campo de formulario que está deshabilitado para el usuario mediante el atributo disabled?

Cuando mostramos un formulario al usuario, algunos de los campos no nos interesa que los pueda modificar y los deshabilitamos, es el caso de valores por defecto en función de los permisos que tenga el usuario o cualquier otra restricción.

Un ejemplo de uso podría ser el siguiente:
Formulario con un campo deshabilitado

Donde el campo "grupo" podría ser:
(...)<select name="grupo_foros" id="grupo_foros" disabled="disabled">    <option value="121">entretenimiento</option></select>(...)

Estos campos deshabilitados no se enviarán cuando el usuario completa el formulario.
Sin embargo puede interesarnos recoger el valor del campo dehabilitado en la página o servlet que manipulará la información introducida en el formulario.

Utilizando una JSP o servlet, intentaríamos recogerlo con:
String grupo = request.getParameter("grupo_foros");

Pero esto no funcionará, retornando siempre null.

La solución
1. Al generar la página del formulario, igual que somos capaces de decidir si el campo deberá o no aparecer deshabilitado, podremos añadir un campo oculto (hidden) extra en caso de estar deshabilitado.
2. Quizá la mejor opción: Solemos tener una función javascript que valida los valores del formulario, así que podemos utilizarlo para habilitar todos los campos deshabilitados en el momento en que sepamos que todo está correcto:

function correcto(){
//(...)
var grupo_foros = getElementById("grupo_foros");

//(... comprobaciones de formatos y relaciones ...)
if (no_hay_fallos){
grupo_foros.disabled=false;
return true;
}else{
alert("Compruebe los campos...");
return false;
}
}

Sombra sencilla en un elemento DIV

La sombra está de moda, las hay muy sofisticadas utilizando imágenes que hay que ajustar y medir...

Podemos utilizar también sombras sencillas que no son tan resultonas, pero le dan una gracia a las capas:
Código CSS

.seccion {
margin:-3px 2px 2px -3px;
padding-left:1em;
padding-right:1em;
background:#FBFBFF none repeat scroll 0%;
border:1px solid #999999;
}

.back{
background: black none repeat scroll 0%;
margin:3% 2% 2% 3em;
padding:0.1%;

}

Código HTML

<div class="back">
<div class="seccion">
Lorem ipsum dolor sit amet, consectetuer adipiscing
elit. Duis tellus. Quisque lectus sapien, vulputate
ut, posuere in, molestie id, risus. Duis dolor.
Suspendisse consectetuer felis at sapien volutpat
commodo. Pellentesque metus. Vestibulum pretium,
nulla nec rutrum porta, erat augue bibendum erat,
eu ...
</div>
</div>

Y así se ve:

sábado, 6 de octubre de 2007

Almacenes de herramientas para web (AJAX, CSS, Javascript)

En el diseño e implementación de webs muchas tareas son repetitivas: hacer un menú, establecer aspectos básicos en la hoja de estilos, mostrar datos en tablas con paginación, calendarios, etc.

No somos los únicos, otros ya lo han hecho, y algunos lo han hecho tan bien que podemos reutilizar el código que han dejado a disposición de todos en Intenet, ya probado, bien escrito y en muchas ocasiones con un estilo muy cuidado.


AJAXrain.com
Multitud de utilidades. Hay de todo tipo: pestañanas, tablas, grids, árboles.
Muchas de ellas utilizan librerías tan conocidas como Highlight o jQuery, y las tenemos dirigidas a PHP, .NET y Java.


Dynamic Drive
En la portada nos informa: calendarios, fechas y tiempo, efectos en documentos, contenido dinámico con iframes y AJAX, efectos para formularios, juegos, efectos con imágenes (galerías presentaciones, eventos de ratón), globos de información, menús y navegación, srollers, XML and RSS, etc.

Generador de Favicon

Si necesitas crear un icono para una web, partiendo de una imagen, puedes utilizar esta utilidad gratuita online: Favicon Generator.

Admite imágenes en formato GIF, JPG, PNG y BMP, y las transforma fielmente en un fichero .ico que ya puedes utilizar para asociarlo a una web.
Incluso permite transparencias cuando se utilizan como fuente ficheros GIF o PNG.

Más info:
Dynamic Drive: Favicon Generator

sábado, 29 de septiembre de 2007

Acceso a particiones Ext2/Ext3 desde Windows

Stephan Schreiber nos presenta su driver "Ext2 Installable File System" (Ext2 IFS) en la versión 1.10c. Permite acceder a las particiones de Linux desde Windows. Lo mejor de todo es que lo hace de modo tranparente, simplemete tendremos en la ventana Mi PC tantos discos duros nuevos como particiones de Linux queramos añadir.

Todos aquellos que tenemos un Windows conviviendo con Linux en un mismo equipo encontraremos este driver como indispensable desde el primer momento.

Existen otras utilidades que permiten el acceso a las particiones Linux, pero son mucho más complicadas que esta porque se utilizan desde la línea de comandos, sólo permiten la lectura, no funcionan del todo bien, son de pago...



Las características principales de este driver son:
  • Instalación sencilla (con instalador)
  • Creación de nuevas unidades de almacenamiento en Mi PC
  • Se trabaja con ellas como lo haríamos con una partición de Windows
  • Se permite lectura y escritura
  • Es freeware


También hay cosas que no hace el driver:
  • Hacer ocultos los ficheros que empiezan por punto "."
  • Mantenimiento de derechos de los ficheros y directorios
  • Acceso a ficheros especiales como tuberías

¿Qué te paree si visitas su web y te lo instalas ya mismo?

Web de la herramienta: Ext2 IFS Driver

miércoles, 26 de septiembre de 2007

Crear dinámicamente con Javascript select con optgroup

Supongamos que tenemos un array de objetos javascript. Cada objeto tiene tres propiedades: cod, tex, grupo.
Estos objetos son los elementos que queremos representar en un SELECT, y agrupados en OPTGROUPS.

Código:

var grupo_anterior="";
var grupo;
var opcion;

for (var i in array_options){
if(grupo_anterior!=array_options[i].grupo){
//reconocido nuevo grupo grupo = document.createElement('OPTGROUP');
grupo.label = array_options[i].grupo;
grupo_anterior = array_options[i].grupo;
select.appendChild(grupo);
}
opcion = document.createElement("OPTION");
opcion.setAttribute("value",array_options[i].cod);
//se le pone el texto visible opcion.innerHTML = array_options[i].tex;
//se incluye en el grupo select.appendChild(opcion);
}



Este código sería lo fundamental para entender cómo funciona. Ha quedado pendiente la variable select, que representa el objeto select en el que inclñuiremos las opciones. Éste es necesario tomarlo, por ejemplo a partir del id con getElementById, o bien pasándolo como parámetro a la función en la que incluyamos este código.
Aquí un ejemplo completo que funciona y se puede probar copiandolo en una página html:


<script>


function Objeto(cod,tex,grupo){
this.cod=cod;
this.tex=tex;
this.grupo=grupo;
}

function pintaOptions(){

var select = document.getElementById('prueba');

var array_options = new Array();
array_options['a'] = new Objeto('1','elemento 1','grupo1');
array_options['b'] = new Objeto('2','elemento 2','grupo1');
array_options['c'] = new Objeto('3','elemento 3','grupo2');
array_options['d'] = new Objeto('4','elemento 4','grupo2');

var grupo_anterior="";
var grupo;
var opcion;

for (var i in array_options){
if(grupo_anterior!=array_options[i].grupo){
grupo = document.createElement('OPTGROUP');
grupo.label = array_options[i].grupo;
grupo_anterior = array_options[i].grupo;
select.appendChild(grupo);
}
opcion = document.createElement("OPTION");
opcion.setAttribute("value",array_options[i].cod);
opcion.innerHTML = array_options[i].tex;
select.appendChild(opcion);
}
}


</script>

<select id="prueba">
<script>pintaOptions();</script>
</select>


El resultado es:

lunes, 10 de septiembre de 2007

Códigos HTML de colores seguros

Cuando diseñamos sin colores exactos de referencia, y queremos ir dando colores a una página web y sus elementos, podemos utilizar una simple tabla que utiliza únicamente los códigos básicos y seguros siguientes:

RGB0051102153204255
Hex00336699CCFF

La tabla en cuestión es la siguiente:

FFF
 FFF
CCC
 CCC
999
 999
666
 666
333
 333
000
 000
FFC
 C00
FF9
 900
FF6
 600
FF3
 300
99C
 C00
CC9
 900
FFC
 C33
FFC
 C66
FF9
 966
FF6
 633
CC3
 300
CC0
 033
CCF
 F00
CCF
 F33
333
 300
666
 600
999
 900
CCC
 C00
FFF
 F00
CC9
 933
CC6
 633
330
 000
660
 000
990
 000
CC0
 000
FF0
 000
FF3
 366
FF0
 033
99F
 F00
CCF
 F66
99C
 C33
666
 633
999
 933
CCC
 C33
FFF
 F33
996
 600
993
 300
663
 333
993
 333
CC3
 333
FF3
 333
CC3
 366
FF6
 699
FF0
 066
66F
 F00
99F
 F66
66C
 C33
669
 900
999
 966
CCC
 C66
FFF
 F66
996
 633
663
 300
996
 666
CC6
 666
FF6
 666
990
 033
CC3
 399
FF6
 6CC
FF0
 099
33F
 F00
66F
 F33
339
 900
66C
 C00
99F
 F33
CCC
 C99
FFF
 F99
CC9
 966
CC6
 600
CC9
 999
FF9
 999
FF3
 399
CC0
 066
990
 066
FF3
 3CC
FF0
 0CC
00C
 C00
33C
 C00
336
 600
669
 933
99C
 C66
CCF
 F99
FFF
 FCC
FFC
 C99
FF9
 933
FFC
 CCC
FF9
 9CC
CC6
 699
993
 366
660
 033
CC0
 099
330
 033
33C
 C33
66C
 C66
00F
 F00
33F
 F33
66F
 F66
99F
 F99
CCF
 FCC
CC9
 9CC
996
 699
993
 399
990
 099
663
 366
660
 066
006
 600
336
 633
009
 900
339
 933
669
 966
99C
 C99
FFC
 CFF
FF9
 9FF
FF6
 6FF
FF3
 3FF
FF0
 0FF
CC6
 6CC
CC3
 3CC
003
 300
00C
 C33
006
 633
339
 966
66C
 C99
99F
 FCC
CCF
 FFF
339
 9FF
99C
 CFF
CCC
 CFF
CC9
 9FF
996
 6CC
663
 399
330
 066
990
 0CC
CC0
 0CC
00F
 F33
33F
 F66
009
 933
00C
 C66
33F
 F99
99F
 FFF
99C
 CCC
006
 6CC
669
 9CC
999
 9FF
999
 9CC
993
 3FF
660
 0CC
660
 099
CC3
 3FF
CC0
 0FF
00F
 F66
66F
 F99
33C
 C66
009
 966
66F
 FFF
66C
 CCC
669
 999
003
 366
336
 699
666
 6FF
666
 6CC
666
 699
330
 099
993
 3CC
CC6
 6FF
990
 0FF
00F
 F99
66F
 FCC
33C
 C99
33F
 FFF
33C
 CCC
339
 999
336
 666
006
 699
003
 399
333
 3FF
333
 3CC
333
 399
333
 366
663
 3CC
996
 6FF
660
 0FF
00F
 FCC
33F
 FCC
00F
 FFF
00C
 CCC
009
 999
006
 666
003
 333
339
 9CC
336
 6CC
000
 0FF
000
 0CC
000
 099
000
 066
000
 033
663
 3FF
330
 0FF
00C
 C99
009
 9CC
33C
 CFF
66C
 CFF
669
 9FF
336
 6FF
003
 3CC
330
 0CC
00C
 CFF
009
 9FF
006
 6FF
003
 3FF


Enlaces a otras tablas útiles en Intenet:
Sion.com - Pauluk : Colores HTML
CuervoBlanco : Tabla de colores hexadecimales

Referencia
Visibone.com

sábado, 18 de agosto de 2007

Objetos en Javascript 2/2

(Anterior: Objetos Javascript 1/2: crear objetos))

Si necesitamos que un objeto Javascript definido por nosotros mismos tenga métodos, tenemos varias opciones:

A. Podemos definir una función independiente que utilizaremos como método de nuestro objeto:

function datosUsuario(){
return this.login + ' ' + this.fecha_registro;
}

1. Caso de objeto literal:

var usu = {
login: "jcc",
fecha_registro: "20070818",
datosUsuario: datosUsuario
}

2. Caso de objeto definido con plantilla:

function Usuario(login, fecha_registro) {
this.login= login;
this.fecha_registro = fecha_registro;
this.datosUsuario = datosUsuario;
}

B. Podemos definir una función propia que utilizaremos como método de nuestro objeto:
1. Caso de objeto literal:

var usu = {
login: "jcc",
fecha_registro : "20070818",
datosUsuario : function(){
return this.login + ' '+ this.fecha_registro;
}
}

2. Caso de objeto definido con plantilla:

function Usuario(login, fecha_registro) {
this.login = login;
this.fecha_registro = fecha_registro;
this.datosUsuario = function(){
return this.login + ' ' + this.fecha_registro;
}
}

La principal diferencia entre los métodos A y B es que el B implementa de alguna manera lo que conocemos en programación orientada a objetos como encapsulación. Sólo un objeto del tipo que define el método puede utilizar la función datosUsuario().

obtener el resultado del metodo

//objeto.metodo()
var datos_de_usuario = usu0.datosUsuario();

NOTA: Hay un tercer caso:
C. Cuando tenemos un objeto ya definido, y por alguna razón necesitamos añadirle un nuevo método. Utilizamos la palabra reservada prototype igual que hacíamos para añadirle propiedades:

//Si el método se define a parte
Usuario.prototype.datosUsuario = datosUsuario;
//Si el método de define sólo par el objeto
Usuario.prototype.datosUsuario = function(){
return this.login + ' ' + this.fecha_registro;
}

Recorrer un objeto Javascript

Cuando tenemos un objeto podemos recorrer sus propiedades utilizando un bucle con in:

for (var campo in usu0 ){
//campo va tomando los nombres de las propiedades
document.write( usu0[campo] + '\t');
}

miércoles, 15 de agosto de 2007

Objetos en Javascript 1/2

En Javascript, además de utilizar cadenas, enteros, arrays, etc. podemos trabajar con objetos/estructuras definidos por nosotros mismos.
Para tener una instancia de un objeto tenemos dos opciones:
Modo literal (JSON)
A la variable se le asigna la definición del objeto. Este tipo de objeto será único, ya que ha sido declarado expresamente para una variable.

var usu = {
login : "jcc",
fecha_registro : "20070818"
}

Modo plantilla
Definimos una estructura. Utilizamos la estructura definida para crear cuantas instancias del mismo tipo de objetos queramos.

//Definición objeto Usuario
function Usuario(login, fecha_registro) {
this.login = login;
this.fecha_registro = fecha_registro;
}
//Instanciar varios objetos Usuario con "new"
var usu0 = new Usuario("jcc","20070818");
var usu1 = new Usuario("tcn","20070818");

Añadir más propiedades
A un objeto se le pueden seguir añadiendo propiedades tras ser definido, aunque es una práctica que no se aconseja, pues todos los objetos del mismo tipo ya creados hasta entonces añaden también esa propiedad con valor nulo. Para ello se utiliza la palabra prototype:

Usuario.prototype.email=null;//afectará a todas las instancias
usu0.email="usu0@dominio.es"

Incluso a una instancia concreta se le pueden añadir propiedades directamente así:

//sólo afectará a esta instancia
usu0.aficiones="Mis hobbies son...";//o bien
usu0['aficiones']="Mis hobbies son..."

Acceso a las propiedades
Por último, la forma de acceder a una propiedad de un objeto es la siguiente:

//objeto.propiedad
var login_usu = usu0.login//o bien objeto[propiedad]
var login_usu = usu0['login']

OJO: En el modo de acceso con corchetes ([,]) , la propiedad es un literal cadena. Esto nos permite recorrer las propiedades de un objeto haciendo uso de una variable (ejemplo).

(continúa con Objetos Javascript 2/2: los métodos)

Herencia en Javascript

La herencia en Javascript podemos emularla de esta manera:

Primer método: (Object masquerading)

function ClaseA(nombre){
this.nombre=nombre;
this.identificarse=function(){
alert(this.nombre);
}
}

function ClaseB(nombre){
this.superClase=ClaseA;
this.superClase(nombre);
delete this.superClase;
}

El constructor ‘ClaseA’, es llamado como método del nuevo objeto que se esta creando en ‘ClaseB’, por lo tanto, todas las propiedades y métodos que se crean en ClaseA se van a agregar al nuevo objeto de ClaseB.

frente a otros métodos éste permite herencia múltiple, es decir, un objeto puede heredar de mas de una clase al mismo tiempo sólo con llamar a cuantos constructores sean necesarios dentro del constructor de la clase hija.

Segundo método: (Prototype chaining)

El ejemplo anterior utilizando prototype chaining quedaría de la siguiente manera:

function ClassA(){}

ClassA.prototype.nombre = “”;
ClassA.prototype.identificarse = function(){
alert(this.nombre);
}

function ClassB(){}

ClassB.prototype = new ClassA();

De ahora en adelante, todos los objetos creados con ‘ClassB’ van a tener, también, los mismos métodos y propiedades de la instancia de ‘ClassA’. Y si queremos agregar más métodos y propiedades, lo único que tenemos que hacer es agregárselos al prototype de ‘ClassB’.

Lo malo de este método para emular herencia, es que no se puede pasar parámetros a la clase base, como hicimos en el ejemplo de Object masquerading.

Lo bueno, es que el operador instanceof funciona de una manera única: por cada instancia de ClaseB, instanceof nos retorna true tanto con ‘ClaseA’ como con ‘ClaseB’:
var miobjeto = new ClassB();  alert(miobjeto instanceof ClassB); // true
alert(miobjeto instanceof ClassA); // true

Referencias
Blog de Notas: Herencia en Javascript

jueves, 9 de agosto de 2007

Imágenes gif para indicar "cargando", "en proceso", "loading"

Para páginas web que realicen tareas que no son inmediatas podemos utilizar imágenes animadas y con buen diseño que indiquen al usuario que algo está ocurriendo y debe esperar.
Desde que las tecnologías AJAX entraron con fuerza, este tipo de imágenes son un recurso fundamental.





En la web Ajaxload.info puedes elegir el modelo de imagen que te interesa, los colores de fondo y de la propia imagen y listo. Las querrás todas ;)

domingo, 5 de agosto de 2007

Iconos de propósito general para web en formato PNG

Muchas veces buscamos el icono perfecto. Utilizamos Google, damos mil vueltas y al final: "mejor me lo hago yo".

Por suerte un día dí con la web que evitaría estas vueltas por la red en busca de iconos de todo tipo, bien diseñados y sobre todo bonitos: FamFamFam.com.

Datos:
  • Los iconos están en formato PNG, y tienen un tamaño de 16x16 píxeles (unos 1.000 iconos).
  • Existe además una selección de iconos de banderas
  • Puedes utilizar también una mini-colección de iconos GIF que hay en la web

Se puede acceder a una vista previa o bien descargarlos desde la web.

Tienen licencia Creative Commons 2.1, así que puedes utilizarlos en tus desarrollos de modo gratuito y modificarlos a tu gusto. El autor comenta que si los utilizas en una web, sería muy amable por tu parte que incluyeras un enlace a FamFamFam en los créditos de tu web.

sábado, 4 de agosto de 2007

Herramientas de acceso a bases de datos

Cuando desarrollamos software que interactúa con alguna/s base/s de datos, necesitamos acceder a estas de forma cómoda, rápida y lo más sencillamente posible. No es viable estar haciendo cada consulta desde interfaz de línea de comandos (por ejemplo SQL*PLUS de Oracle).

En algún momento he necesitado encontrar el programa que me diera estas posibilidades, y en ocasiones me ha costado mucho encontrar el que me pareciera más cómodo, por eso anoto aquí aquellos que finalmente me han parecido buenos:

Acceso a MySQL:

  • PHPMyAdmin: interfaz de acceso vía web. Es estupendo y gratuito.

  • SQLyog: interfaz de acceso de escritorio. Muy bueno y gratuito (previo registro)

  • Navicat: interfaz de acceso de escritorio. El mejor pero de pago... (permite incluso crear conexiones vía túnel ssh)


Acceso a Oracle:

  • TOra: interfaz de acceso de escritorio. Bueno y gratuito

  • Oracle SQL Developer: interfaz de acceso de escritorio. Muy bueno y gratuito (acceso también a otras bases de datos: mysql, sqlserver y access)

  • TOAD: interfaz de acceso de escritorio. El mejor pero de pago.


Todas estas herramientas permiten administrar una base de datos, crear triggers, escribir procedimientos, gnerar vistas, ver las consultas coloreadas, crear copias de seguridad, etc.

viernes, 3 de agosto de 2007

Centrar con CSS una web : en general cualquier elemento de bloque

Para centrar las páginas de nuestra web, podemos hacerlo así de sencillo utilizando DIV y dándole estilo con CSS:

body { text-align:center; }
#principal{ width:70%; margin:0 auto; text-align:left;}

Y el código HTML:

<body>
<div id="principal">
Todo lo que metas aquí queda centrado
</div>
</body>

NOTA: La parte de CSS que afecta al BODY, y la propiedad text-align:left paraa el DIV, sólo son necesarias para que funcione en IE con versión inferior a la 6.

Referencia
Juque : Centrando Elementos de Bloque

Elementos de bloque y elementos de línea en HTML

HTML clasifica a todos los elementos en dos grandes grupos: elementos en línea (inline elements en inglés) y elementos de bloque (block elements en inglés).

Las diferencias:

BLOQUE: Los elementos de bloque siempre empiezan en una nueva línea y ocupan todo el espacio disponible hasta el final de la línea, aunque sus contenidos no lleguen hasta el final de la línea. Esta nueva línea contiene un espacio superior y otro inferior.

LÍNEA: Los elementos en línea sin embargo no empiezan en nueva línea y solo ocupan el espacio necesario para mostrar sus contenidos

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

BLOQUE: La mayoría de elementos de bloque pueden contener elementos en línea y otros elementos de bloque.

LÍNEA: Los elementos en línea solo pueden contener texto u otros elementos en línea


==> En otras palabras, un elemento de bloque no puede aparecer dentro de un elemento en línea. En cambio, un elemento en línea puede aparecer dentro de un elemento de bloque y dentro de otro elemento en línea.


Lista de elementos de bloque y de línea definidos por HTML:
Los elementos de bloque definidos por HTML son:
  • address
  • blockquote
  • center
  • dir
  • div
  • dl
  • fieldset
  • form
  • h1
  • h2
  • h3
  • h4
  • h5
  • h6
  • hr
  • isindex
  • menu
  • noframes
  • nos-cript
  • ol
  • p
  • pre
  • table
  • ul

Los elementos en línea definidos por HTML son:
  • a
  • abbr
  • acronym
  • b
  • basefont
  • bdo
  • big
  • br
  • cite
  • code
  • dfn
  • em
  • font
  • i
  • img
  • input
  • kbd
  • label
  • q
  • s
  • samp
  • select
  • small
  • span
  • strike
  • strong
  • sub
  • sup
  • textarea
  • tt
  • u
  • var.

Los siguientes elementos también se considera que son de bloque:
  • dd
  • dt
  • frame-set
  • li
  • tbody
  • td
  • tfoot
  • th
  • thead
  • tr


Los siguientes elementos pueden ser en línea y de bloque según las circunstancias:
  • button
  • del
  • iframe
  • ins
  • map
  • object
  • script




Referencias
Librosweb.es : Elementos en línea y elementos de bloque
Juque
Mozilla Developer Center: HTML:Elemento:Tipos de elementos

jueves, 2 de agosto de 2007

Código html de símbolos útiles










símbolocódigo
»&raquo;
®&reg;
á&aacute;
é&eacute;
......
Á&Aacute;
É&Eacute;
......

Referencias
ConClase.net

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

sábado, 23 de junio de 2007

Introducción a SparQL

¿Qué es?

SPARQL (Simple Protocol and RDF Query Language) es un lenguaje de recuperación basado en RDF. Se trata de una recomendación para crear un lenguaje de consulta dentro de la Web semántica que está ya implementada en muchos lenguajes y bases de datos. Desde 2005 está en proceso de estandarización por el W3C.

Con SPARQL los desarrolladores y usuarios finales pueden representar y utilizar los resultados obtenidos en las búsquedas a través de una gran variedad de información como son datos personales, redes sociales y metadatos sobre recursos digitales como música e imágenes. Es de utilidad para la recuperación y organización de información.

SPARQL consiste en tres especificaciones complementarias, que contienen diferentes partes de su funcionalidad. SPARQL lo forman un lenguaje de consultas, un formato para las respuestas, y un medio para el transporte de consultas y respuestas:
  • SPARQL Query Language: Núcleo de SPARQL. Explica la sintaxis para la composición de sentencias y su concordancia. (Espec.: http://www.w3.org/TR/rdf-sparql-query/)
  • SPARQL Protocol: Formato utilizado para la devolución de los resultados de las búsquedas (queries SELECT o ASK), a partir de un esquema de XML. (Espec.: http://www.w3.org/TR/rdf-sparql-protocol/)
  • SPARQL Query XML Results Format: Describe el acceso remoto de datos y la transmisión de consultas de los clientes a los procesadores. Utiliza WSDL para definir protocolos remotos para la consulta de bases de datos basadas en RDF. (Espec: http://www.w3.org/TR/rdf-sparql-XMLres/)
Las consultas SPARQL cubren tres objetivos:
  • Extraer información en forma de URIs y literales.
  • Extraer sub-estructuras RDF.
  • Construir nuevas estructuras RDF partiendo de resultados de consultas.
Una limitación de la actual especificación es que únicamente se permiten consultas de lectura. Así pues sólo se pueden leer informaciones y comparar datos. En resumen SPARQL es una vía rápida para localizar información específica. Por último apuntar que existen varias implementaciones (Python, PHP, Java), pero destaca Jena Semantic Web Toolkit para plataforma Java sobre las demás.

¿Cómo funciona? : Anatomía de una consulta sencilla SPARQL

Como ejemplo podemos tomar el modelo de bloggers.rdf de PlanetRDF. Es bastante directo, con los vocabularios de FOAF y de Dublin Core para proporcionar un nombre, un título del blog con URL, y un canal RSS con los últimos posts de cada blogger. El siguiente gráfico muestra la estructura gráfo básica para un solo contribuidor. El modelo completo repite simplemente esta estructura para cada blog que agreguemos.


Ahora una consulta muy simple de SPARQL sobre el modelo de bloggers. La pregunta, en inglés, dice “encontrar el URL del blog de la persona nombrada Jon Foobar”:

PREFIX foaf:
SELECT ?url
FROM
WHERE {
?contributor foaf:name "Jon Foobar" .
?contributor foaf:weblog ?url .
}

Existen numerosas herramientas online de uso SparQL, como son validadores, formularios de consulta, etc. Algunas páginas interesantes son http://sparql.org/ y http://dannyayers.com/code/sparql-editor.
Una aplicación con GUI que utiliza Jena es Twinkle, que facilita enormemente la utilización de SPARQL. Además es gratuita y de libre distribución.
(http://www.ldodds.com/projects/twinkle/)

Vista de Twinkle