martes, 4 de diciembre de 2012

Colocando mi servidor visible publicamente

Este fin de semana,  entre las cosas que tenía pendiente, era colocar mi servidor web a funcionar, y por supuesto, que fuera visible desde la calle.

Tenía todo listo, mi servidor montado con apache, php, mi amado debian actualizado, y mis queridos iptables configurados.

Voy a mi router (Cisco e4200) y entro en la parte de redirección de puertos, y configuro como corresponde, puerto 80 externo al 80 interno de la ip de mi servidor. Para mi sorpresa, una vez que guardo y pruebo, no funciona; me puse a probar todo, ampliar el rango de puertos (es una de las opciones que permite el router al momento de redireccionar), tumbar el firewall, cambiar de servidor, y nada que funcionaba.

En esto estuve varias horas el fin de semana, hasta que decidí, que iba a probar desde la oficina el día Lunes.

Al llegar a la oficina y probar, me doy cuenta que tampoco pasa nada, no puedo llegar al servidor, y el escaneo de puertos con nmap tampoco da resultado, y lo mas extraño de todo, es que no hay registro en los log del router ni en el del servidor.

Al revisar un poco por internet, resulta que cantv (mi proveedor de servicio de Internet) bloquea los primero 1024 puertos como medida de seguridad, lo cual evitaba que puediera ver mi equipo. Una vez que hice el cambio en el redireccionamiento de puertos de mi router (el externo cualquiera mayor a 1024), todo funciona perfecto.

Quiero aclarar, que también existe la opción, que creen que su cuenta en la oficina virtual de cantv, y al entrar con su cuenta, verán una opción en el menú de mano izquierda, que les permite deshabilitar esta medida de seguridad.

Espero que les sirva de algo esta experiencia.

viernes, 5 de octubre de 2012

Hacer funcionar el puerto sd


En estos días necesitaba descargar unas fotos a mi laptop, una Asus x53S,  que había tomado con mi cámara, entonces hago lo común, saco el chip de cámara y lo introduzco en la laptop, y espero a que me diga, como pasa con los pendrive, dispositivo reconocido, pero para mi sorpresa nada de eso ocurría.

Lo que se me ocurrió fue revisar los logs a ver si salia algo, y nada; lo otro que pensé era revisar los componentes usando una conexión usb, o conectados a ellos

#lsusb

Y nada.

Navegando un poco por internet, y preguntándole un poco a aptitude, encontré un paquete que parecía ser importante, libccid; una vez instalado, me reconoce las tarjetas sd sin ningún problema.

Espero que esto los ayude, en caso de que les ocurra a ustedes también.

Por cierto, esta historia ocurrió en una laptop Asus x53S, con Linux Mint 13.

martes, 28 de agosto de 2012

CodeIgniter: Guardando el contenido de nuestro formulario


Buenas a todos, en este nuevo post voy a continuar con CodeIgniter, pero en esta oportunidad vamos a guardar el contenido del formulario creado en el post anterior.

Para recordar un poco lo que hicimos en el post antes mencionado, creamos un formulario con tres campos: nombre, usuario y clave. Y el submit del formulario redirecciona a prueba/guardar, que como vimos, es el controlador prueba, la función guardar.

Ahora vamos a hacer unos cambios en configuración para que las actividades de este post puedan funcionar.

Primero nos vamos al archivo config/autoload.php, y en el vamos a buscar la posición en el arreglo de nombre libreries, y en el vamos a colocar array('form_validation','database','session').

Con esto estamos cargando la librería para validar nuestro formulario, guardar sesiones y poder conectarnos a base de datos.

Luego, nos vamos a config/config.php, y buscamos la posición en el arreglo de nombre global_xss_filtering, y cambiamos su valor de false a true; y $config['encryption_key'] = 'prueba', en donde prueba puede ser cualquier valor. En internet se pueden encontrar diferentes paginas que te generan esta clave, una que usado en oportunidades y me ha funcionado, es http://jeffreybarke.net/tools/codeigniter-encryption-key-generator/.

Con estos pequeños cambios, por ahora, estamos bien.

Como vamos a guardar en base de datos, necesitamos tener una, por lo tanto, creamos una base de datos llamada blog (pueden usar cualquier nombre), y en ella ejecutan el siguiente script:

CREATE TABLE `usuarios` (
  `id_usuarios` int(11) NOT NULL AUTO_INCREMENT,
  `nombre` varchar(45) NOT NULL,
  `clave` varchar(45) NOT NULL,
  PRIMARY KEY (`id_usuarios`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

Adicionalmente, necesitamos un usuario que tenga permisos sobre esta base de datos, yo me cree un usuario llamado blog, con clave 123456 y con permisos de select, insert, update y delete.

Ahora bien, una vez que hemos creado la base de datos y hemos hechos los cambios de configuración, procedemos a crear la función guardar, la cual se va a encargar de validar que los datos que llegan están correctos, y de ser así son almacenados en BD.

Este es el código de la función:

public function guardar(){
       
        $datos['titulo'] = "Prueba en CodeIgniter"; // titulo de la pagina
       
        $this->form_validation->set_rules('txtnombre','Nombre','trim|required');
        $this->form_validation->set_rules('txtusuario','Usuario','trim|required');
        $this->form_validation->set_rules('txtclave','Clave','trim|required|md5');
       
        if ($this->form_validation->run() == FALSE)
        {
            $this->load->view('formulario_view',$datos);
        }else{
            $this->load->model('db_model');
           
            $sql = "Insert into blog.usuarios values (default,'" . $this->input->post('txtnombre') . "','" . $this->input->post('txtusuario') . "','" . $this->input->post('txtclave') . "')";
            $return = $this->db_model->ejecutar($sql);
            if($return){
                $this->session->set_userdata('mensaje','El usuario fue agregado correctamente');
                redirect('prueba/formulario');
            }else $datos['error'] = "Ocurrió un error al insertar el usuario en el sistema";
            $this->load->view('formulario_view',$datos);
        }
       
    }

Vamos a analizar un poco el código.

Con set_rules, establecemos las reglas de validación, en nuestro caso le estoy diciendo que el campo txtnombre, en caso de que exista un error, se llama Nombre, y voy a validar, que sea obligatorio y quitando los espacios en blanco al comienzo y al final. En el caso de clave es igual, pero le agrego que aparte de validar lo convierta a md5.

Un dato importante, el idioma por defecto de CodeIgniter es el ingles, es decir, todos los mensajes, eso incluye los de error, son en ingles; por lo tanto, si queremos que los mensajes de error que produzca el form_validation, sean en español (o en otro idioma), podremos hacerlo de cualquiera de estas dos formas ( son las que conozco, no se si existen otras):

  • La primera es colocando después o antes de nuestras rules (es indiferente)
$this->form_validation->set_message('required','El campo %s es requerido');
('required' es la regla a la que le estamos creando un mensaje; y el %s es para que sea sustituido por el nombre del campo; el segundo parámetro colocado en el rules)

  • La segunda forma, es descargando el paquete "Download all" de https://github.com/EllisLab/CodeIgniter/wiki/Language-Translation. Dentro del archivo descargado, esta una carpeta de nombre "es", la cual vamos a colocar en system/language, y vamos a renombrar por spanish. Una vez hecho esto, vamos a config.php, y cambiamos nuestro idioma a español $config['language']    = 'spanish'.
 Aplicando cualquiera de las formas, vamos a tener los mensajes de error, del form_validation, en español.

Luego de aplicar las reglas, preguntamos por el resultado de la validación, esto lo hacemos con  $this->form_validation->run() == FALSE, de ser correcto en que hubo un error (en el caso de cuando inicia la pagina, no hay error pero igual ingresa por aquí), redirigimos a la vista formulario_view para que muestre los errores; en caso contrario almacenamos en BD, esto lo hacemos cargando el modelo "db_model", el cual va estar colocado en la carpeta model, y en nuestro ejemplo se va a llamar db_model.php, y tiene el siguiente código:

class Db_model extends CI_Model{
   
    public function __construct()
    {
        $this->load->database();
    }
    public function ejecutar($sql){        $query = $this->db->query($sql);
        return $query;
    }
   
   
}

En caso de que falle la inserción en BD ($this->db_model->ejecutar($sql)) , guardamos un mensaje de error y llamamos a la vista para que lo muestre. De estar todo correcto, guardamos en una variable de sesión un mensaje, e invocamos al controlador formulario (el cual creamos en el post anterior) pero ahora le vamos a agregar las siguientes lineas antes de invocar a la vista
             $mensaje = $this->session->userdata('mensaje');
             if($mensaje != '') $datos['exito'] = $mensaje;
             $this->session->sess_destroy();
Con esto guardamos el mensaje antes escrito en la sesión, y despues la destruimos.

Por ultimo, nos falta agregarle las siguientes lineas a la vista formulario_view, antes de hacer el form_open
            echo validation_errors('<div id="error">','</div>');
            if(isset($exito))
                echo "<div id=\"exito\">" . $exito . "</div>";
            if(isset($error))
                echo "<div id=\"error\">" . $error . "</div>";

 Con esto, hemos almacenado en BD el contenido de nuestro formulario.



Para poder obtener mas información de form_validation, podemos visitar la página
http://codeigniter.com/user_guide/libraries/form_validation.html

Y en español http://books.openlibra.com/pdf/CodeIgniter_Guia_Usuario_2_0.pdf (en la página 152 habla de form_validation)

martes, 14 de agosto de 2012

Mi primer formulario en CodeIgniter


En esta nueva entrada, vamos a ver como crear nuestro primer formulario en CodeIgniter.

CodeIgniter, pone a la disposición de los desarrolladores, librerías y helpers para hacernos la vida muchisimo mas fácil. Entre alguna de las librerías propias del framework podemos encontrar: database (para manejo de base de datos) y session (para sesiones); y entre alguno de los helpers:  url, form, file, entre muchos otros.

La lista de los helpers y librerías las pueden encontrar en la página del framework www.codeigniter.com y en la guia de usuario http://codeigniter.com/user_guide/.

Por defecto, y para que el framework sea ligero, mucha de estas librerías y helpers no vienen cargados, por lo tanto debemos cargarlas nosotros mismos. Existen ( o conozco dos formas de poder hacerlo); la primera es desde el archivo autoload, ubicado en application/config, hay indicamos que librerías y/o helpers queremos que se carguen al momento de que la pagina sea invocada. La ventaja de esta forma, es que siempre van a estar a la disposición del programador; la desventaja, es que si no siempre se usa, se estarían cargando librerías y helpers innecesarias, haciendo las paginas un poco mas lentas.

La segunda forma, es cargarlas desde el código, y sería de la siguiente forma
$this->load->helper('form');
en este caso estoy cargando el helper form para el diseño de formularios. Las ventajas de esto, es que solo se cargan cuando las necesitemos; desventajas, es que debemos acordarnos de cargarlas.

Ahora empecemos a escribir algo de código.

Primero vamos a nuestro archivo autoload, y cargamos nuestro helper form, esto lo hacemos colocando 'form' dentro del array del helper.

Una vez hecho esto, en el controlador creado en la entrega anterior, creamos una nueva función de nombre formulario, y en ella colocaremos lo siguiente:

public function formulario(){
        $datos['titulo'] = "Prueba en CodeIgniter"; // titulo de la pagina
        $this->load->view('formulario_view',$datos);
    }

Es una función muy sencilla, en donde guardamos como queremos que se llame la página, e invocamos a nuestra vista.

Ahora vamos a crear nuestra vista, que como vimos, se llama formulario_view (ubicada en application/view), y escribiremos lo siguiente:

<html>
    <head>
        <meta http-equiv='Content-Type' content='text/html; charset=utf-8'/>
        <title><?php echo $titulo;?></title>
       
    </head>
   
    <body>
        <div id="formulario">
        <?php
            $attributes = array('class' => 'form', 'id' => 'usuarios');

            echo form_open('prueba/guardar', $attributes);
           
            echo "<div>";
            echo form_label("Nombre: ");
            $attributes = array('id' => 'txtnombre', 'size' => '20','name' => 'txtnombre', 'maxlength' => '20');
            echo form_input($attributes);
            echo "</div>";
           
            echo "<div>";
            echo form_label("Usuario: ");
            $attributes = array('id' => 'txtusuario', 'size' => '20','name' => 'txtusuario', 'maxlength' => '20');
            echo form_input($attributes);
            echo "</div>";
           
            echo "<div>";
            echo form_label("Clave: ");
            $attributes = array('id' => 'txtclave', 'size' => '20','name' => 'txtclave', 'maxlength' => '20');
            echo form_password($attributes);
            echo "</div>";
           
            echo "<div>";
            $attributes = array('id' => 'sbGuardar','name' => 'sbGuardar', 'class' => 'boton');
            echo form_submit($attributes,'Guardar');
            echo "</div>";
           
            echo form_close();
        ?>
        </div>
    </body>
</html>

La parte importante de todo este código, es la creación del formulario mediante el helper form. Como pueden ver es muy sencillo, los valores que se colocan en el arreglo (attributes), son los mismo que colocarían si lo hicieran a mano en html. El primer parámetro que se le pasa al form_open, es a donde va a ir cuando ocurra un submit, en este caso al controlador prueba, función guardar (la cual veremos en la próxima entrega).


Y para darle un poco de color al formulario, creamos una carpeta css en view, y dentro de ella creamos un archivo de nombre estilos.css, y colocamos lo siguiente:

@CHARSET "UTF-8";

body{
    font-family: serif;
    font-size: 12px;
}

#formulario{
    border: 2px solid olive;
    border-radius: 7px;
    width: 300px;
    margin-left: 20px;
    padding: 10px;
}

#formulario div label {
  width: 20%;
  float: left;
}


/* Estilo para elementos de formulario */

label{
    color:#3a454d;
    margin:15px 10px 0 0;
    display:block;
    float:left;
    font-weight: bold;
}

input {
    border:1px solid #899caa;
    border-radius:3px;
    -moz-border-radius:3px;
    box-shadow:inset 0px 1px 3px #bbb;
    -webkit-box-shadow:inset 0px 1px 3px #bbb;
    -moz-box-shadow:inset 0px 1px 3px #bbb;
    padding:8px;
    font-size:12px;
    color:#3a454d;
    font-weight:bold;
    float:none;
    margin-top: 5px;
}

.boton {
    margin-top: 10px;
    margin-left: 35%;
}

/* ---------------- */

Y para que se incluya este estilo en nuestra pagina colocamos en nuestro head
<link rel="stylesheet" href="../../application/views/css/estilos.css" type="text/css" media="screen">

Y con esto ya tenemos listo nuestro primer formulario de registro.

Mi primera página en CodeIgniter



En la entrada anterior realizamos la instalación de nuestro framework CodeIgniter.

Ahora nos queda la parte mas emocinante, programar.

Como ide de desarrollo yo voy a usar eclipse, pero ustedes sientanse en la libertad de usar cualquier editor: vim, nano, gedit, netbeans, etc .....


CodeIgniter esta divido en en dos grandes carpetas, la primera es application, en donde se va a ubicar nuestro sistema; y system, que es donde se encuentra el corazón del framework. Adicionalmente existe otra carpeta, que no afecta en nada ni al framework ni al sistema que se desarrolle, que es user_guide, el cual es un manual/ayuda para el desarrollador.

Este es un framework modelo-vista-controlador, en donde la lógica de la programación estará ubicada en el controlador, la lógica de BD estará en el modelo, y el resultado se mostrara en la vista.

No es el uso correcto, pero el framework permite manejar la vista y el acceso a BD desde el controlador.

Aclaratorias: los controladores están ubicados en application/controller y las vistas en application/views.

Ahora vamos a crear nuestra primera pagina.

Primero vamos a crear un controlador de nombre prueba.php con el siguiente código:

<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Prueba extends CI_Controller {
   
    public function index()
    {
        $datos['titulo'] = "Prueba en CodeIgniter"; // titulo de la pagina
        $datos['mensaje'] = "Primera vista creada en CodeIgniter"; // texto a mostrar en el body
        $this->load->view('prueba_view',$datos);  //llamada a la vista
    }
   
}

La clase se debe llamar igual que el archivo, con la primera letra en mayúscula y debe extender de CI_Controller.

La vista se invoca con load->view, en donde el nombre de la vista es prueba_view, y se le pasa un arreglo con dos valores (para el ejemplo), los cuales vamos a usar en la vista.

Vamos a crear ahora la vista de nombre prueba_view.php y tiene le colocaremos el siguiente codigo:
<html>
    <head>
        <title><?php echo $titulo;?></title>
    </head>
   
    <body>
        <?php echo $mensaje;?>
    </body>
</html>

Como ven las variables titulo y mensaje, son las que pusimos en el arreglo del controlador, y que fueron las que le pasamos a la vista.

Para ver que todo funciona bien colocamos en el navegador

http://localhost/CodeIgniter_2.1.2/index.php/prueba

Debería salir algo parecido a esto



Un dato importante a tener en cuenta con respecto al url, hasta el index.php es parte del dominio, lo que viene después es controlador (en este caso prueba) y después la función (en el caso de ejemplo es index, y es por eso que no sale en el url, pero podrías ponerla si quisieras).

Esto es todo por esta entrega, no vemos en otra oportunidad.

jueves, 9 de agosto de 2012

Instalación de CodeIgniter


Buenas tardes, el día de hoy explicare la instalación del Framework CodeIgniter, que para la fecha es la versión 2.1.2.

Como lo indica Wikipedia "CodeIgniter es un entorno de desarrollo abierto que permite crear webs dinámicas con PHP".

Es un framework muy ligero, portable y con una curva de aprendizaje baja.

Ahora vamos a la acción.

Antes que nada debemos tener instalado apache y php.

Lo primero que debemos hacer es descargarlo de su web, http://codeigniter.com/download.php, ya sea desde su navegador favorito o desde consola
wget http://codeigniter.com/download.php

Una vez descargado procedemos a descomprimirlo,

unzip CodeIgniter_2.1.2.zip

Luego se procede a copiar la carpeta que se crea al descomprimir el anterior archivo en el directorio del servidor web

cp -r CodeIgniter_2.1.2 /var/www/

Para comprobar que el framework esta instalado procedemos a escribir en el browser

http://localhost/CodeIgniter_2.1.2/          (el localhost es por ser mi maquina, en caso contrario iría la ip del servidor)

Si todo esta bien les debe aparecer algo parecido a la siguiente imagen


Con esto ya tienen el framework instalado.

Hasta una próxima entrega ......