sábado, 20 de diciembre de 2008

Referencias de APIs todo en uno

Acabo de encontrar una página que seguramente me resulte de lo más útil, y siendo así, me la apunto:

www.gotapi.com

En esta página podemos encontrar APIs de los lenguajes, frameworks y entornos más utilizados (html, css, java, javascript, mysql, hibernate, ant, etc) y otros que no tanto (openGL, Python ...).

Además toma la información de fuera, por tanto está asegurada la validez de lo que podemos encontrar.

Es muy fácil de utilizar, y para los que nos dedicamos al desarrollo web es perfecta por la cantidad de tecnologías que reúne.

domingo, 17 de agosto de 2008

Eliminar posiciones de arrays en PHP

Para eliminar un elemento de un array hay que tener en cuenta que es diferente según el tipo de array, y según queramos eliminar un elemento por su clave o por su valor.

Eliminar por clave en array NO asociativo

$miArrayNoAsociativo[0]="A";
$miArrayNoAsociativo[1]="B";
$miArrayNoAsociativo[2]="C";

unset($miArrayNoAsociativo[0]);
//He eliminado "A", resultado (1=>"B",2=>"C");

unset($miArrayNoAsociativo[2]);
//He eliminado "C", resultado (1=>"B");

//Normalizar el array
$miArrayNoAsociativo = array_values($miArrayNoAsociativo);
//resultado (0=>"B");

Otra opción es utilizar array_splice directamente con cada elemento a eliminar, que provoca la eliminación inmediata de la posición del array y su normalización. Para eliminar los mismos elementos en este caso, hacemos:

$miArrayNoAsociativo[0]="A";
$miArrayNoAsociativo[1]="B";
$miArrayNoAsociativo[2]="C";

//Indicamos el array de dónde eliminar, la posición,
// y el 1 es para que sólo elimine esa posición
array_splice($miArrayNoAsociativo, 0, 1);
//resultado (0=>"B",1=>"C");

array_splice($miArrayNoAsociativo, 1, 1);
//resultado (0=>"B");

Eliminar por clave en array asociativo

Para este tipo de arrays, utilizamos unset:

$miArrayAsociativo["a"]="A";
$miArrayAsociativo["b"]="B";
$miArrayAsociativo["c"]="C";

unset($miArrayAsociativo["a"]);
//He eliminado "A", resultado ("b"=>"B","c"=>"C");

unset($miArrayAsociativo["c"]);
//He eliminado "C", resultado ("b"=>"B");

Eliminar por valor en array NO asociativo

$miArrayNoAsociativo[0]="A";
$miArrayNoAsociativo[1]="B";
$miArrayNoAsociativo[2]="C";

$posicionAEliminar = array_search("B",$miArrayNoAsociativo,false);
array_splice($miArrayNoAsociativo, $posicionAEliminar, 1);
//resultado (0=>"A",1=>"C");

Eliminar por valor en array asociativo

$miArrayAsociativo["a"]="A";
$miArrayAsociativo["b"]="B";
$miArrayAsociativo["c"]="C";

$posicionAEliminar = array_search("B",$miArrayAsociativo,false);
array_splice($miArrayAsociativo, $posicionAEliminar, 1);
//resultado ("a"=>"A","c"=>"C");

sábado, 16 de agosto de 2008

Recuperar datos de formulario cuando la acción de envío detecta error en PHP

Es algo básico cuando programamos una web: los formularios y la gestión de errores de validación que pueden generar.
Supongamos que tenemos una página donde tenemos un formulario: formulario.php
Supongamos que tenemos un script que realiza la acción pretendida del formulario: action_formulario.php

Nuestro fomulario realiza el envío de datos al action, y éste, antes de nada, valida la corrección de los datos (los valores numéricos realmente lo son, si se pide un email, éste debe ser correcto, etc.) .

Tras la validación, el action redirigirá a otra página que mostrará el resultado de la operación, pero si no ha conseguido validar los datos, redirigirá al formulario para que el usuario vuelva a completarlo de manera correcta.
En este punto hay que tener en cuenta dos cosas: conviene informar al usuario de los errores cometidos, y por supuesto hay que dejarle el formulario con los mismos datos que introdujo para no tener que completar todo de nuevo.

Así pues, para hacer esto, utilizamos variables de sesión, tanto para el mensaje al usuario, como para pasar de nuevo los valores que el usuario introdujo:

fomulario.php

<?
$postAnterior = $_SESSION["POST_ANTERIOR"];
if (isset($_SESSION["mensajeAction"])){
echo "<div>".$_SESSION["mensajeAction"]."</div>";
unset($_SESSION[”mensajeAction”]);
}
?>
<form action="action_formulario.php" method="post">
<p>
<label for="nombre">
Nombre:
<input type="text" name="importe"
value="<?=$postAnterior["importe"]?>" />
</label>
</p>
</form>
<?unset($_SESSION["POST_ANTERIOR]);?>

action_formulario.php

//Validaciones
(...)
if ($error){
$_SESSION["mensajeAction"] =
"<p>El importe debe ser...</p>";
$_SESSION["POST_ANTERIOR"]= $_POST;
header("Location: fomulario.php");
exit;
}else{
//Acciones
(...)
$_SESSION["mensajeAction"] =
"<p>Ha introducido correctamente los datos y...</p>";
header("Location: paginaPrincipal.php");
exit;
}

viernes, 23 de mayo de 2008

HSQLDB: Instalación y uso

Objetivos


Contar con una base de datos de prueba para nuestras aplicaciones.
Es fácil de instalar y proporciona las utilidades básicas. Está basada en ficheros.
Esta base de datos permite varios modos de ejecución, entre los que destaco:

  • Modo standalone: La base de datos se ejecuta incrustada en el proceso que hará uso de ella de manera que no dependamos de nada más que de nuestra aplicación

  • Modo servidor: La base de datos se ejecuta como un servidor separada de nuestra aplicación pero estando así disponible para cualquier proceso y desde cualquier equipo de la red.


Requisitos antes de empezar



hsqldb.jar [http://www. hsqldb.org/]

Arranque de la base de datos


Si queremos utilizar HSQL en modo servidor:

Creamos un directorio que servirá como almacén de los datos: data
Arrancamos el servidor con la orden java desde el directorio de datos:
C:\data>java -classpath [rutaHsqldb]\hsqldb.jar org.hsqldb.Server


Si queremos utilizar HSQL en modo standalone

En este caso el arranque de la base de datos se hace desde la propia aplicación que utilizará la base de datos.

Administración gráfica


La propia librería proporciona una utilidad gráfica
>java -classpath [rutaHsqldb]\hsqldb.jar org.hsqldb.util.DatabaseManagerSwing

Al ejecutar el comando aparece un panel de conexión, donde podemos seleccionar los parámetros de conexión. La siguiente figura nos conecta a una base de datos HSQL arrancada en modo servidor en nuestra máquina:

HSQLDB Pantallazo de administración gráfica

Conexión desde Java


Base de datos arrancada en modo standalone


try {
Class.forName("org.hsqldb.jdbcDriver" );
} catch (Exception e) {
System.out.println("ERROR: failed to load HSQLDB JDBC driver.");
e.printStackTrace();
return;
}

Connection c =
DriverManager.getConnection("jdbc:hsqldb:file:data/pruebahsql", "sa", "");

Base de datos arrancada en modo servidor


try {
Class.forName("org.hsqldb.jdbcDriver" );
} catch (Exception e) {
System.out.println("ERROR: failed to load HSQLDB JDBC driver.");
e.printStackTrace();
return;
}

Connection c =
DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/alias", "sa", "");

NOTAS

  • Debe haberse arrancado previamente la base de datos con
    #java -classpath [rutaHsqldb]\hsqldb.jar org.hsqldb.Server


  • Si no se ha definido alias, no es necesario ponerlo


NOTA
En algunas ocasiones hay que escribir la línea siguiente para obtener la conexión:
Class.forName("org.hsqldb.jdbcDriver").newInstance();

Ejemplo completo


En este ejemplo se muestra el uso de una base de datos incluida en el propio proceso de nuestra aplicación.
Se muestra cómo se arranca la base de datos (y se crea si no existe), se crea una tabla, se añaden registros y finalmente se recuperan.

package es.arcoe;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Conector {

private static Connection dbcon;
public static Connection getConexion(){

if (dbcon==null){
try {
Class.forName("org.hsqldb.jdbcDriver" );
dbcon =
DriverManager.getConnection("jdbc:hsqldb:file:data/pruebahsql",
"sa", "");
}catch (Exception e) {
System.out.println("ERROR: Fallo al conectar con HSQLDB JDBC driver.");
e.printStackTrace();
}
}
return dbcon;
}

public static void endConexion(){
if (dbcon!=null){
try {
dbcon.close();
}catch (Exception e) {
System.out.println("ERROR: Fallo al cerrar HSQLDB.");
e.printStackTrace();
}
}
}

public static void main(String[] args) {
//creo un statement de la conexión
try{
Statement stmt = Conector.getConexion().createStatement();
//Borramos la tabla de prueba que utilizaremos
try{stmt.executeQuery("DROP TABLE PRUEBAHSQL");}
catch(java.sql.SQLException e){}

//Creamos una tabla PRUEBAHSQL CON COLUMNAS ID, NOMBRE, APELLIDO, EDAD
stmt.executeQuery("CREATE TABLE PRUEBAHSQL (ID BIGINT PRIMARY KEY, "+
"EDAD INTEGER,NOMBRE VARCHAR(255),APELLIDO "+
"VARCHAR(255))");

//Insertamos dos registros
stmt.executeQuery("INSERT INTO PRUEBAHSQL (ID,EDAD,NOMBRE,APELLIDO) "+
"VALUES (1,22,'Manuel', 'Manuélez')");
stmt.executeQuery("INSERT INTO PRUEBAHSQL (ID,EDAD,NOMBRE,APELLIDO) "+
"VALUES (2,24,'José' , 'Joselez')");

// Realizamos una modificación de un registro
stmt.executeUpdate("UPDATE PRUEBAHSQL SET APELLIDO='Josélez' WHERE ID=2");

//Obtenemos los registros de la BBDD para mostrarlos por consola
ResultSet resultado = stmt.executeQuery("select * from PRUEBAHSQL");
while (resultado.next()){
System.out.println(resultado.getString("NOMBRE") +
" " +resultado.getString("APELLIDO")+ ": "+
resultado.getInt("EDAD") + " años" );

}
resultado.close();//liberamos resultados

stmt.close();//liberamos recursos

Conector.endConexion();//cerramos conexión

}catch(Exception e){
System.out.println("ERROR: Fallo al recoger datos de la bbdd.");
e.printStackTrace();
}

}

}

NOTA
Es necesario tener en el classpath la librería hsqldb.jar

Problemas típicos con código PHP

__PHP_Incomplete_Class en variables de sesión
Se produce cuando intentamos utilizar una variable de sesión cuyo tipo aun no ha sido declarado.
Se debe a que no se ha encontrado la declaración de la clase antes de abrir la sesión con session_start(). Para que no ocurra hay que cargar la definición de la clase que quieres que persista, antes de iniciar una sesión.

Sería correcto:

class MiClase(){
...
}
session_start();
$_SESSION[“variableMiClase”]->

Warning: Cannot modify header information - headers already sent by …
Posiblemente sea que estemos incluyendo o requiriendo en nuestro archivo otros ficheros, y en alguno de ellos haya espacios en blanco antes o después de las etiquetas .
Abrir el archivo y borrar todos los espacios en blanco por que haya por fuera de dichas etiquetas y asunto arreglado.

Esto se debe a que la cabecera no puede modificarse una vez haya habido salida.

Por ejemplo:
global.php

<?
define(“prueba”,”prueba”);
?>

<?
define(“prueba2”,”preba2”);
?>

pagina.php

<?include_once("global.php");?>
<?header(“….”);
...
?>

En el ejemplo se ve como en el fichero global.php, que incluimos desde pagina.php, hay un espacio entre las dos secciones de código PHP. Este espacio está provocando la salida que impide que más tarde en pagina.php podamos modificar la cabecera. Ojo, porque el espacio que provoca el error también puede estar al comienzo de un fichero o al final en un salto de línea inesperado.

Referencias:
www.xinterface.net

jueves, 20 de marzo de 2008

Hello world! De blogger a arcoe.es

Ahora que tengo mi propio dominio, paso mi blog desde blogger.

Espero seguir escribiendo regularmente sobre todo aquello que me voy encontrando. Si de paso le sirve a alguien mejor que mejor, igual que a mi me sirven post de otros blogs que leo.

viernes, 8 de febrero de 2008

Error al arrancar Apache por falta de alguna dll

Este es un error de estos que pasan y pierdes el tiempo de lo lindo intentando solucionarlo.

Cuando al arrancar Apache te aparece un error porque no se encuentra una dll como por ejemplo este:

"Error al iniciar la aplicación porque no se encontró iconv.dll. La reinstalación de la aplicación puede solucionar el problema."



Pues nada, que no reinstales, que no hace falta.

Sencillamente copia el fichero dll que te indique el error en una carpeta que esté en el path, por ejemplo en C:\Windows\System.

domingo, 3 de febrero de 2008

Configurar efectos de escritorio Ubuntu

Introducción

Esta es una nota para instalar el configurador de Compiz Fusion.

Cuando instalamos Ubuntu Gutsy tenemos la posibilidad de activar los efectos visuales de los que tanto se habla gracias a que Compiz Fusion (Beril+Compiz) viene instalado por defecto.

Lo único que necesitamos es contar con una tarjeta gráfica con aceleración y que esté soportada por Ubuntu (con Gutsy no tendremos problemas de compatibilidad)

Al lío

Por defecto no tenemos activada la configuración personalizada de Compiz Fusion, para ello simplemente escribimos en la consola:


$ sudo aptitude install compizconfig-settings-manager emerald


Y con esto ya podemos configurar completamente todos los efectos de nuestro escritorio accediendo al menú Sistema -> Preferencias -> Advanced Desktop Effects Settings.

Configuraciones recomendadas

Una vez dentro de la ventana de configuración, recomiendo instalar:

  • Cubo de escritorio
  • Girar cubo
  • Cube reflection
  • Window Previews


Fundamental para ver el cubo es contar con 4 escritorios virtuales, para esto es necesario entrar donde dice General Options -> Desktop Size y donde dice "Tamaño horizontal virtual" poner un 4.

Algunos comandos para empezar a alucinar:

  • Ctrl + Alt + flecha dch o izq : Girar cubo
  • Ctrl + Alt + clic ratón y mover : Girar cubo en 3D
  • Ctrl + Alt + flecha arriba o abajo : Tira de escritorios
  • Win + Tab: Cambiar aplicación (como Alt + Tab en bonito)


Referencias