ThickBox: Ventanas flotantes

3 de Julio de 2009

ThickBox es una librería javascript que permite abrir ventanas flotantes sobre páginas HTML. Esto nos permitirá mostrar imágenes o paginas sobre una ventana emergente y sin necesidad de abrir una ventana nueva, evitando de esa forma también el Bloqueador de popup de nuestro navegador.

thickbox.gif

ThickBox, creado por Cody Lindley y que acaba de llegar a la versión 2.0 es sencilla de utilizar. Primero debes descargar los archivos necesarios para su funcionamiento:

  • jquery.js: Librería necesaria para el funcionamiento e thickbox.
  • thickbox.js: Funciones thickbox para abrir las ventanas.
  • thickbox.css: Hoja de estilos para la ventana emergente.
  • loader.gif: imagen que se mostrará mientras se carga el contenido de la ventana emergente

Entonces una vez que se tienen todos los archivos, lo siguiente es incluir las librerías, la hoja de estilos en nuestro HTML, esto se incluye antes de cerrar el tag HEAD.

  1. <script type="text/javascript" src="jquery.js"></script>
  2. <script type="text/javascript" src="thickbox.js"></script>
  3. <link rel="stylesheet" href="thickbox.css" type="text/css" />

Luego cuando se quiere insertar una pantalla flotante con una imagen, esto se hace sobre un enlace, por ejemplo si deseamos incluir un enlace para abrir una imagen:

  1. <a href=“flash9.gif” class=“thickbox” title=“Ejemplo ThickBox”>

Donde se tiene que class=”thickbox” es el que indica a las librerías thickbox que se abrirá una ventana emergente, el otro dato importante es que lo que se asigne a la propiedad title se mostrará como titulo de la ventana emergente. Resumiendo podemos decir que a cualquier enlace que tengamos en nuestra página solo es necesario aplicarlo el estilo thickbox.

Esto es para el caso de las imágenes, pero si deseamos incluir una página externa, el código cambio poco, donde tenemos que incluir el ancho y el alto de la ventana emergente en la url que se le pasará a la propiedad href, veamos el siguiente ejemplo donde abrimos la página de Google.

  1. <a
    
  2. href="http://www.google.com?TB_iframe=true&height=420&width=600"
  3. title="Google"
  4. class="thickbox">Google</a>

Se observa que el código adicional es ?TB_iframe=true&height=420&width=600, es obvio donde se pone el ancho y alto de la ventana.

Java con MySql

3 de Julio de 2009

Buenas, para continuar la saga de clases que se conectan a MySql, hoy toca la versión para Java.

Preparativos

Para que funcione hay que bajarse el JDBC Driver for MySQL (Connector/J) desde la página web de MySql: http://www.mysql.com/products/connector/

Para el desarrollo yo utilizo NetBeans 6, no se si hay diferencia con otras herramientas pero por si acaso: http://www.google.es/url?q=http://www.netbeans.org/downloads/&ei=nUhOSpmCNNKNjAfU_JCrBQ&sa=X&oi=smap&resnum=1&ct=result&cd=1&usg=AFQjCNFc4ieVaELXOjfcaDa-Evb8sT2lZw

Incluir JAR

Del conector descargado desde MySql solo nos interesa el archivo Jar, que tiene una estructura de nombre parecida a esta: ‘mysql-connector-java-5.1.7-bin.jar’. Lo extraemos del empaquetado descargado y lo colocamos en la carpeta de nuestro proyecto en Java.
Luego, con el NetBeans y el proyecto abierto allí, damos click derecho sobre la carpeta ‘Biblioteca’ de nuestro proyecto y hacemos click en ‘Agregar JAR/Carpeta…’, allí seleccionamos el archivo JAR extraído y le indicamos a NetBeans que utilice rutas relativas (por eso he comentado de pegarla en la carpeta de proyecto).

Classe conexión Java con MySql

/*
* conexion.java
* Maneja la conexión con mysql y todas sus operaciones (select, insert,update y
* delete).
*
* Necesita el conector J.
* Bajar el conector J de mysql.
* NetBeans: boton derecho sobre Biblioteca->Agregar JAR
*/

package mysql;

import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class conexion {

private Connection conn;
private Statement stmt;

/*
* Constructor
* Necesita como parametros los datos de conexión a Base de Datos.
* El método constructor inicializa las dos variables de clase, conexion y
* statement.
*/
public conexion(String server, String user, String pass, String db){
//Ruta de conexion. Conecta al server especificado y la Base de datos
String url = “jdbc:mysql://”+server+”/”+db;
try{
//Instanciación del conextor jdbc
Class.forName(”com.mysql.jdbc.Driver”).newInstance();
//Realiza la conexión con la base de datos, es variable de clase privada.
conn = DriverManager.getConnection(url, user, pass);
//Crea un ejecutador de sentencia, es variable de clase privada.
stmt = conn.createStatement();
}catch(Exception e){
//Error generico.
e.printStackTrace();
}
}

/*
* getConexion()
* Devuelve la variable privada del tipo Connection.
*/
private Connection getConexion(){
return this.conn;
}

/*
* getStatement()
* Devuelve la variable privada del tipo Statement.
*/
private Statement getStatement(){
return this.stmt;
}

/*
* select(String sentencia)
* Dada una sentencia SQL del tipo select, devuelve un ResulSet con los
* resultados de la consulta.
*/
public ResultSet select(String sentencia){
ResultSet rs = null;
try {
rs = this.getStatement().executeQuery(sentencia);
} catch (SQLException ex) {
Logger.getLogger(conexion.class.getName()).log(Level.SEVERE, null, ex);
}
return rs;
}

/*
* manipuladorDatos(String sentencia)
* Soporta sentencias del tipo insert, update y delete.
* Dada la sentencia, la ejecuta.
* Devuelve false si no ha funcionado, true si todo ha ido correcto.
*/
public boolean manipuladorDatos(String sentencia){
boolean rs = false;
try {
rs = this.getStatement().execute(sentencia);
} catch (SQLException ex) {
Logger.getLogger(conexion.class.getName()).log(Level.SEVERE, null, ex);
}
return rs;
}

/*
* numeroFilas(String sentencia)
* Devuelve el numero de filas devueltas por una sentencia sql.
*/
public int numeroFilas(String sentencia){
ResultSet rs = null;
int numero = 0;
try {
rs = this.getStatement().executeQuery(sentencia);
while(rs.next()){
numero++;
}
rs.close();
} catch (SQLException ex) {
Logger.getLogger(conexion.class.getName()).log(Level.SEVERE, null, ex);
}
return numero;
}

/*
* cerrarConexion()
* Termina la conexión establecida en la instanciación de la clase.
*/
public void cerrarConexion(){
try{
this.getStatement().close();
this.getConexion().close();
}catch(Exception e){
e.printStackTrace();
}
}
}

¿Como usarla?

Voy a poner unos ejemplos de utilización desde un proyecto en el que usé el entorno visual swing como aplicación Java.

Aunque el NetBeans os avisará, necesitareis algunos de estos imports en el proyecto

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

¿Cómo hacer una sentencia SELECT?

/*
* Lineas para cargar la información del usuario de BBDD en las cajas
* de edición de usuario
*/
conexion cnx = new conexion(”localhost”,”root”,”",”java”);
ResultSet rs = cnx.select(”select * from usuarios where idUsuario=”+idUsuario);
try {
while (rs.next()) {
jTextField1.setText(rs.getString(”user”));
jPasswordField1.setText(rs.getString(”pass”));
break;
}
} catch (SQLException ex) {
Logger.getLogger(Interior.class.getName()).log(Level.SEVERE, null, ex);
}
cnx.cerrarConexion();

¿Cómo hacer una sentencia UPDATE, INSERT o DELETE?

conexion cnx = new conexion(”localhost”,”root”,”",”java”);
boolean rs = cnx.manipuladorDatos(”UPDATE usuarios SET user=’”+usuario+”‘,pass=’”+passwd+”‘ where idUsuario=”+this.idUsuario);
cnx.cerrarConexion();

——

conexion cnx = new conexion(”localhost”,”root”,”",”java”);
cnx.manipuladorDatos(”Delete from gestion where idUsuario=”+this.idUsuario+” and idEntrada=”+id);
cnx.cerrarConexion();

——

conexion cnx = new conexion(”localhost”,”root”,”",”java”);
cnx.manipuladorDatos(”Insert into gestion values(’0′,’”+this.idUsuario+”‘,’”+web+”‘,’”+user+”‘,’”+pass+”‘)”);
cnx.cerrarConexion();

Explicación

Como veis, hay dos métodos principales de interacción con el sistema gestor mysql, uno es el consultar(sql) y otro el manipuladorDatos(sql).

Mientras el consultar devuelve un ResultSet, con los datos obtenidos por una SELECT, para ser recorrido de la forma que interese, el manipuladorDatos(sql) devuelve un boolean indicando si ha ido o no ha ido bien la sentencia lanzada.

Por lo tanto, las selects se tratan con el método consultar(), y las sentencias update, delete y insert con el manipuladorDatos().

Además incluyo un método para consultar el número de filas que devuelve una sentencia SQL, en la que solo tienes que pasar una sentencia del tipo select, y devuelve un integer con el resultado.

Espero que os sea útil y si teneis dudas… no dudéis y comentar ;)

Visual Basic .NET con MySql

3 de Julio de 2009

Clase conexión MySql

Hace un tiempo hice una nueva clase para conectar con mysql, realizar select, delete, update… en fin, todo lo que se puede necesitar para conectar un programa VB.NET con Mysql.

Imports MySql.Data.MySqlClient ‘llamo a la referencia agregada en (Proyecto->Agregar referencia->Examinar->MySql.Data.dll)

”’ <summary>
”’ Establece una conexión con un servidor del tipo MySql
”’ </summary>
”’ <remarks></remarks>
Public Class ConexionMySql
Private conexion As MySqlConnection ‘gestiona la conexion a la Base de Datos

Private db As String ‘guardaremos el nombre de la BBDD que servira para el método ultimo_id

”’ <summary>
”’ Parámetros de inicialización
”’ </summary>
”’ <param name=”server”>Dirección del servidor(pj. “localhost”)</param>
”’ <param name=”user”>Usuario (pj. “mi_usuario”)</param>
”’ <param name=”pass”>Contraseña (pj. “mi_contraseña”)</param>
”’ <param name=”db”>Base de datos (pj. “mi_base_datos”)</param>
”’ <remarks></remarks>
Public Sub New(ByVal server As String, ByVal user As String, ByVal pass As String, ByVal db As String)
Me.conexion = New MySqlConnection()
conexion.ConnectionString = “server=” & server & “;” & “user id=” & user & “;” & “password=” & pass & “;” & “database=” & db
Try
conexion.Open()
‘MessageBox.Show(”Conexión Abierta Con Éxito”)
Catch mierror As MySqlException
MessageBox.Show(”Error de Conexión a la Base de Datos: ” & mierror.Message)
Finally
‘conexion.Dispose()
End Try
Me.db = db
End Sub

”’ <summary>
”’ Realiza una consulta a la base de datos y devuelve un DataReader
”’ </summary>
”’ <param name=”sentenciaSql”>Sentencia SELECT a realizar</param>
”’ <returns>MySqlDataReader</returns>
”’ <remarks></remarks>
Public Function consulta(ByVal sentenciaSql As String) As MySqlDataReader
Dim lectura As MySqlDataReader
lectura = montadorSentencia(sentenciaSql).ExecuteReader() ‘ le digo a la variable lectora que lo que tiene que recojer es la ejecucion de la variable comandos
Return lectura ‘retorno una variable del tipo MysqlDataReader
End Function

”’ <summary>
”’ Realiza sentencias del tipo UPDATE o DELETE
”’ </summary>
”’ <param name=”sentenciaSql”>Sentencia INSERT, UPDATE o DELETE a realizar</param>
”’ <returns>Integer</returns>
”’ <remarks></remarks>
Public Function manipuladorDatos(ByVal sentenciaSql As String) As Integer
Dim a As Integer = montadorSentencia(sentenciaSql).ExecuteNonQuery() ‘ le digo a la variable lectora que lo que tiene que recojer es la ejecucion de la variable comandos
Return a
End Function

‘Método privado que monta la sentencia en la variable del tipo Command
Private Function montadorSentencia(ByVal sentenciaSql As String) As MySqlCommand
Dim comandos As New MySqlCommand()
comandos.CommandText = sentenciaSql
comandos.CommandType = CommandType.Text
comandos.Connection = conexion

Return comandos
End Function

”’ <summary>
”’ Para poder saber el ultimo ID auto incremental insertado en una tabla
”’ </summary>
”’ <param name=”tabla”>Tabla a saber el ultimo ID</param>
”’ <returns>Integer con el ID</returns>
”’ <remarks></remarks>
Public Function ultimo_id(ByVal tabla As String) As Integer
Dim ultimoId As Integer
Dim lectura As MySqlDataReader

lectura = Me.consulta(”select auto_increment from information_schema.tables where TABLE_SCHEMA=’” & Me.db & “‘ and TABLE_NAME=’” & tabla & “‘”)

While lectura.Read()
ultimoId = lectura.GetString(”auto_increment”) - 1
Exit While
End While

lectura = Nothing

Return ultimoId
End Function

”’ <summary>
”’ Cierra la conexión con la base de datos
”’ </summary>
”’ <remarks></remarks>
Public Sub cerrarConexion()
Me.conexion.Close()
End Sub

End Class

¿Como utilizar la clase?

Aquí unos ejemplillos:

INSERT, UPDATE y DELETE: el método manipularDatos unicamente lanza una consulta contra la base de datos, sin esperar recibir datos de filas como devolveria una select.

Dim cnx As ConexionMySql ‘variable conexion
cnx = New ConexionMySql(server, user, pass, bbdd)

cnx.manipuladorDatos(”INSERT INTO partida(nombre,jugadorBlanco,jugadorNegro,fecha) VALUES(’” & txtNombre.Text & _
“‘,’” & txtJugadorBlanco.Text & “‘,’” & txtJugadorNegro.Text & “‘,’” & txtFecha.Text & “‘)”)

Dim idPartida As Integer = cnx.ultimo_id(”partida”) ‘recupero el id de partida recien insertado

‘cerrar conexion con mysql
cnx.cerrarConexion()

——-

cnx = New ConexionMySql(server, user, pass, bbdd)
cnx.manipuladorDatos(”delete from partida where idPartida=” & arrayCadena(0))
cnx.cerrarConexion()

SELECT

Dim cnx As ConexionMySql ‘objeto

cnx = New ConexionMySql(server, user, pass, bbdd)
Dim lect As MySqlDataReader ‘variable lectora
lect = cnx.consulta(”select * from partida where 1″)
While lect.Read <> False
ListBox1.Items.Add(lect.GetString(”idPartida”) & “_” & lect.GetString(”nombre”) & “_” & lect.GetString(”jugadorBlanco”) _
& “_” & lect.GetString(”jugadorNegro”) & “_” & lect.GetString(”fecha”))
End While
cnx.cerrarConexion()

Sólo hay un apunte a resaltar en la utilización del método manipularDatos(). Y es que si vas a lanzar mas de una operacion de manipularDatos seguida, siempre hay que cerrar la conexión con cnx.cerrarConexion() y volver a instanciar el objeto para poder volver a llamar al manipularDatos(), si no el conector de mysql se vuelve loco y lanza una excepción extraña. Si sabeis la solucion para que sin cerrar se puedan lanzar dos manipularDatos() seguidos avisad!

Ésta nueva clase permite hacer todas las sentencias, la única cosa a tener en cuenta es que las selects van por el método consulta, y todo lo demás que no retorna mas que si ha ido bien o mal, van por el método manipuladorDatos.

Incluye un método que te retorna el ultimo id asignado a una tabla.

Si no se quisiera poder conectar con multiples usuarios en cada instanciación, solo habria que quitar los parametros del constructor, y establecerlos a mano en la sentencia de conexión.

La he dejado bastante abierta a cambios, espero que os sirva de ayuda!

Os dejo aquí la descarga de la DLL: http://www.megaupload.com/?d=50P5FXVZ

Cualquier cosa comentar!

Teclado numérico en Ubuntu

22 de Junio de 2009

Esto se ha comentado muchas veces y en muchos sitios, pero no está de mas…

Si no funciona el teclado numérico en Ubuntu ir a:

Sistema/Preferencias/Teclado/

En la pestaña “Teclas del ratón” desactivar “Permitir controlar el puntero usando el teclado numérico”

De nada, ;)

Abrir multibox automaticamente al cargar pagina

25 de Mayo de 2009

Puede ser un caso poco común, pero hoy necesitabamos que MultiBox se lanzara automaticamente al hacer la carga de la página. Después de intentar simular un click sin éxito para este caso, la solución que he encontrado es más fácil de lo esperado.

PhatFusion ya había pensado en nosotros, y a la hora de inicializar el multibox en la página hay que agregar una nueva linea que tenga el evento open:

var box = {};
window.addEvent(’domready’, function(){
box = new MultiBox(’mb’, {descClassName: ‘multiBoxDesc’});
box.open($(’mb1′));
});

funcion javascript para Simular un click

25 de Mayo de 2009
JAVASCRIPT:
  1. /* ***********************************************************************************
  2. * SimularClick: Simular un click en un objeto.
  3. *   idObjecte : objecte sobre el cual se aplica el evento click
  4. * ***********************************************************************************/
  5.  
  6. function SimularClick(idObjete){
  7.  
  8. var nouEvent = document.createEvent("MouseEvents");
  9. nouEvent.initMouseEvent("click", true, true, window,0, 0, 0, 0, 0, false, false, false, false, 0, null);
  10.  
  11. var objecte = document.getElementById(idObjete);
  12. var canceled = !objecte.dispatchEvent(nouEvent);
  13. }

Dar permisos de administrador en phpbb 3

11 de Mayo de 2009

La "nueva" versión del popular foro trae una revisión profunda del panel de aministración. Me he encontrado con una instalación sin permisos por defecto. Aquí un recordatorio para poder acceder a foros y administrarlos:

  • Después de crear un nuevo foro, se deben asignar permisos: ACP/Foros/Permisos de foros. En esta pantalla, lo más cómodo es añadir permisos de grupos
  • Dar permisos de moderador a un usuario: ACP/Usuarios y grupos/Administrar grupos. Clicar sobre "usuarios" en el grupo de Moderadores globales y añadir usuarios.

Usado en amicsdelsclassics.com.

Red ethernet Marvel Yukon 88E8036 en Leopard

27 de Abril de 2009

En anteriores instalaciones hice algunas modificaciones en Kext que acabaron funcionando, pero no se del todo bien como. Mucho mejor bajarse e instalar el kext de esta página

Transferir archivo de mas de 4 GB con filezillaServer a Windows Home

20 de Abril de 2009

Hoy quería transferir un archivo de 10GB a mi ordenador por red desde un ubuntu. Y bueno copiandolo por red normal tardaba bastante y se me quedaba siempre tirado a la mitad ne 4GB... Así que pensando que era culpa de la red o el samba.

Instalo un servidor de FTP. Filizilla Server.  Pero el problema seguia persistiendo. El archivo se subia bien hasta los 4GB para ser mas exactos hasta los: 4.194.301 KB

tamaño en disco: 4GB  (4.294.967.296 bytes)

tamaño: 3,99GB (4.294.964.052 bytes)

Para intentar transferirlo decido partir desde linux el fichero mediante el comando split:

split -b3000m miarchivo.iso  miarchivo.@

Esta lina divide un fichero en trozos de 3000mb, osea 3GB. Y le añade la extensiones:

miarchivo.aa, miarchivo.ab,miarchivo.ac , miarchivo.ad , ...

Asi consecutivamente con todos los trozos que necesite partirlo. Una vez echo esto los puedo transfererir a mi ordenador. Para juntarlos en windows archivos trozeados con el comando split de linux, es muy facil, tan solo debemos usar e comando:

copy miarchivo.aa+miarchivo.ab+miarchivo.bb+miarchivo.ac c:\miarchivoEnteroDeNuevo.iso

Hay que tener encuenta que no se pueden dejar espacios detras de los nombres de las partes y que el '+' debe ir todo junto. Se debe de escrubir el nombre de todas las partes, yo no he encontrado como hacer de forma automatica. Menos mal que he trozeado en 3 partes. En mi caso volvio a fallar, debido a que el archivo volvia a superar lso 4 megabtes de limite del sistema de archivos FAT 32

Al hacer esto que funciona correctamente, suponiendo que estas son todas las partes del archivo.

Pensé que sería un restricción del servidor. Pero investigando un poco mas descubro que es problema del sistema de ficheros usado. En mi portatil windows de toda la vida, venia con las particiones formateadas en FAT 32. Así que el problema de que no pueda transferir un archivo mayor de 4GB, no es ni de ubuntu, ni del filezilla, ni de la red con el samba, ERA POR QUE LAS PARTICIONES FAT32 TIENEN COMO MÁXIMO TAMAÑO DE UN FICHERO 4GB.

Así la única forma ha sido convirtiendo la particion FAT32 a NTFS. Este cambio se puede hacer en windows sin alterar los datos y sin instalar ningun programa adicional. tan solo con el comando:

convert NombreUnidadAConvertir: /FS:NTFS

Este cambio no altera los datos, no se pirde nada. Te pregunta el nombre de la partición que lo podemos mirar en mi pc. y nada mas. Ojo, este cambio no es reversible así que solo hacerlo si no necesitais FAT32 para nada en especial.

ver imagen:

Problema resuleto, solucionarlo convertiendo la particion a NTFS. Despues de esto ya podia transferir mi imagen de linux a windows.  Por todas las maneras explicadas anterior mente.

Poner licencia gratuita al antivirus Avast Home (Nos ha caducado?)

18 de Abril de 2009

Vamos a explicar que hacer cuando avast antivirus caduca y queremos ponerle una licencia nueva.

Primero debemos de tener instalado el antivirus. Sinó lo tenemos instalado podéis descargarlo desde:

Descargar Avast Antivirus

Lo siguiente es obtener el código de licencia, para ello solo deberéis registrarse en avast.com, para que ellos te envíen a tu correo la clave del antivirus.

Puedes registrarte en:

Registro Avast Antivirus, para obtener tu licéncia por un año de forma gratuita

Para los siguientes años, tan solo debes volver a solicitar otra licencia. Ten en cuenta que para que te envíen el correo con la licencia, ha que poner el código anti-robots que ves en pantalla. Si lo pones mal el email no llegará de todos modos la página de avast te muestra el error.

Añadiendo nuestra licencia a AVAST ANTIVIRUS:

Primero hay que apretar el botón derecho sobre el icono azul de la “a” que aparece en la parte inferior derecha de la pantalla del escritorio, Te aparecerá un menú flotante que se ve en la imagen.

Boton derecho sobre avast

Boton derecho sobre avast

Aparecerá el menú que sale en ela foto abajo. Dale dentro de este menú sobre: “acerca avast”

Ahora te aparece este cuadrito donde podremos añadir el código de licencia para avast antivirus:

Aprieta sobre código de licencia, apercerá este otro diálogo donde deberás pegar el código que te llega en el email de registro de avast. Solo se debe de encluir los numeros y letras y no el texto de " ---CUT HERE----"