domingo, 21 de marzo de 2010

Problemas al compartir carpetas con Windows 7

Si tenemos una red local con Windows 7, es probable que les haya pasado que comparten una carpeta y no pueden acceder a ella desde otros equipos de la red. La causa se debe al tipo de red que tienen configurada (Si es red publica, hogar o trabajo). El Windows medirá las restriciones deacuerdo a estas politicas a la hora de conectarse a una red cableada o WiFi disponible. La solución a esto es irnos al Panel de Control, buscar el Centro de redes y recursos compartidos, y cambiar la politica de la conexión a modo Hogar. Deberán hacer esto en todos los equipos que tengan el mismo problema.

martes, 16 de marzo de 2010

Encriptar y Desencriptar con PHP

Aqui les dejo dos funciones que pueden servirle para encriptar y desencriptar cadenas con una llave (parámetro opcional de las funciones).


function my_encrypt($string, $key = "48623468281AX4") {
for($i=0; $i < strlen($string); $i++) {
$char = substr($string, $i, 1);
$keychar = substr($key, ($i % strlen($key))-1, 1);
$char = chr(ord($char)+ord($keychar));
$result.=$char;
}
return base64_encode($result);
}

function my_decrypt($string, $key = "48623468281AX4" ) {
$string = base64_decode($string);
for($i=0; $i < strlen($string); $i++) {
$char = substr($string, $i, 1);
$keychar = substr($key, ($i % strlen($key))-1, 1);
$char = chr(ord($char)-ord($keychar));
$result.=$char;
} return $result;
}

$message = "HELLO MY WORLD!";
echo "Mensaje: ".$message." ";
$enc = my_encrypt($message);
echo "Mensaje encriptado: ".$enc." ";
echo "Mensaje desencriptado: ".my_decrypt($enc)." ";


en donde el navegador mostrará el siguiente resultado:
Mensaje: HELLO MY WORLD!
Mensaje encriptado: fHmEgoFTgY9YiYeDjZxV
Mensaje desencriptado: HELLO MY WORLD!

Evitar advertencia "La página ha caducado" en el navegador (IE - PHP)

Esto suele ser un problema comun a la hora de hacer POST en html y redireccionar a una nueva página a través de un enlace o algún cambio en el header. Hice una solución que me parece práctica cuando se pulsa el boton del navegador "Atrás" no responda con esa molesta advertencia.

La técnica consiste en tomar todas las variables $_POST, procesar las que se consideren adecuadas y redireccionar las mismas variables a través de un $_GET. Esto funciona bien cuando hacemos formularios de búsqueda que generan un listado, al que luego de hacer click en algún item se redirecciona a un nuevo enlace.

El código puede ser escrito como en el siguiente ejemplo:


function EstandarizarQueryString
($excepciones = "") {
if(!is_array($excepciones))
$excepciones = array($excepciones);
$est = array();
$querystring = "";
foreach($_GET as $key => $value) $est[$key] = $value;
foreach($_POST as $key => $value) $est[$key]=$value;
foreach($est as $key => $value) {
if(!in_array($key,$excepciones)) {
if(!empty($value) && $value!="0" && $value!="null") $querystring.="&".$key."=".urlencode($value);
}
}
return substr($querystring,1);
}


Una vez implementada esta funcion, se pueden reescribir los URL y manejar todos (o algunos) de los parametros REQUEST de la página de la siguiente manera:


if($_POST && !$_POST['botonexcepcion']) {
header("location: ".basename($_SERVER['PHP_SELF'])."?".EstandarizarQueryString());
exit();
}
// Aqui se manejan todos los parametros por $_GET ...

Con esto se evita una reconfirmación del POST cuando se ejecuta un evento history.back o cuando se pulsa el botón "Atrás" del navegador (Generalmente pasa en IE).

jueves, 11 de marzo de 2010

Instalar SSH en Windows XP/Vista/7 (Open SSH)

1. bajar el gygwin en http://www.cygwin.com/setup.exe

2. Instalar cygwin con OPENSSH a traves del setup de cygwin (buscar openssh en el cuadro de texto y marcar para instalación)

3. Como ADMINISTRADOR:
Crear una nueva variable de entorno: CYGWIN con valor ntsec tty

Agregar ;c:\cygwin\bin al Path

Abrir el cygwin con el acceso directo (Windows 7 usar run as administrator)

chmod +r /etc/passwd
chmod u+w /etc/passwd
chmod +r /etc/group
chmod u+w /etc/group
chmod 755 /var
chmod 664 /var/log/sshd.log


ssh-host-config, responder todo "yes" excepto cuando dice si desea usar un nombre diferente.

cyglsa-config


Reiniciar el PC. y LISTO!! ya tenemos ssh instalado (para configurar es /etc/sshd-config)

lunes, 8 de marzo de 2010

Clase de abstracción de datos para PHP-MySQL (Entidades/Business Objects)

Cuando trabajamos en PHP muchas veces tenemos tareas repetitivas de para crear inserts, updates y cualquier cantidad consultas a la base de datos. Si mejoramos el método podemos encapsular clases que abstraen las tablas en la base de datos y las llamamos "Entidades" o "Business Objects". Por ejemplo si tenemos una tabla "empleados" podriamos crear la entidad "class Empleado" el cual encapsula métodos Read y Save para guardar registros de empleados en particular, junto a todos los métodos que acompañan la clase.

Para automatizar el proceso de crear entidades en PHP, he creado una clase llamada genericDB, que se encarga de crear métodos set, get, getId, setId para cualquier tabla que tenga un id autonumérico (como primary key).

Podriamos ejemplificar su uso suponiendo que tenemos una tabla llamda "empleados" con un id_empleado autonumerico como clave primaria. El código para utilizar la tabla empleado (como entidad) quedaría asi:

<?php

//* Para leer un registro
$miempleado = new GenericDB("empleados");
$miempleado->setId(5);
if(
$miempleado->Read()) {
echo(
"El empleado existe<br>");
echo(
"El nombre del empleado es ".$miempleado->get("nombre"))
}


//* Para modificar un registro:
$miempleado = new GenericDB("empleados");
$miempleado->setId(5);
if(
$miempleado->Read()) {
echo(
"El empleado existe<br>");
echo(
"El nombre del empleado es ".$miempleado->get("nombre")."<br>")
echo(
"modificamos el nombre<br>");
$miempleado->set("nombre","Pedro");
if(
$miempleado->Save()) {
echo(
"El empleado se ha salvado como ".$miempleado->get("nombre"));
}
}

// Para crear un nuevo registro (nombre, apellido y cedula son campos en la tabla empleados):

$miempleado = new GenericDB("empleados");
$miempleado->set("nombre","Carlos Alberto");
$miempleado->set("apellido","Perez");
$miempleado->set("cedula","12346334");
if(
$miempleado->Save()) {
echo(
"Enhorabuena, se ha creado un nuevo registro <br>");
echo(
"El id del nuevo registro es ".$miempleado->getId()."<br>");
} else {
echo(
"error: ".$miempleado->_message);
}

?>
Puedes bajar el código de la clase genericDb haciendo click aqui.

Autologin en SSH con Putty

Una vez intenté establecer conexiones automáticas mediante SSH a través de putty, generando las llaves, colocandolas en el servidor y de repente: sorpresa!... un mensaje que dice "Server Refuse Our Key". Así que me puse a investigar un poco sobre el tema y encontré la solución. Aqui describo los pasos:

1. Descargar Putty y Puttygen (buscar en google)
2. Abrir Puttygen y generar la llave moviendo el mouse en el recuadro del programa.
3. Salvar la llave publica y la llave privada (.ppk)
4. Colocar la llave publica al servidor donde nos queremos conectar.
5. Cambiamos el formato de la llave pública a openssh de esta manera:

ssh-keygen -if llavepublica > llavepublica_openssh

6. Creamos la carpeta .ssh y le asignamos permisologia adecuada.
mkdir .ssh
chmod 700 .ssh

7. copiamos el contenido de la llave publica en el archivo authorized_keys dentro de la carpeta .ssh
cat llavepublica_openssh >> .ssh/authorized_keys

8. Nos vamos a la seccion "Connection > Data " y en el cuadro autologin colocamos el usuario.

9. Abrimos el putty y nos vamos a la configuracion "Connection > SSH > Auth", alli le damos click al botón browse y seleccionamos la llave privada.

10. Salvamos la sesión con el nombre del servidor y LISTO!


Si queremos que inicie sesión automaticamente podemos crear un acceso directo en windows con el siguiente comando. (incluyendo las comillas)

putty.exe -load "misesion"