jueves, 3 de octubre de 2013

Linux: Bloqueando y apagando el monitor

Hoy les traigo un poco de administración de equipos en ambiente Linux.

Estos script que les dejo hoy aquí,son: uno es para apagar el monitor y el otro es para bloquearlo.

Para que funcionen de forma automática, les recomiendo colocarlos en el crontab.

El de apagar el monitor deben hacerlo en el cron de root:

55 16 * * * turnOnOffMonitor.sh off

Y el de bloquear el monitor lo hacen desde un usuario que no sea root (crontab -e -u <usuario>):

50 16 * * * bloquearMonitor.sh

Los enlaces de los archivos son los siguientes:
https://dl.dropboxusercontent.com/u/71252081/bloquearMonitor.sh
https://dl.dropboxusercontent.com/u/71252081/turnOnOffMonitor.sh

Espero que les sea de utilidad, hasta una próxima.

martes, 1 de octubre de 2013

Codeigniter: Generando un XML

En la entrada de hoy, voy a regresar al framework Codeigniter, y voy a mostrar, como de forma muy sencilla y con pocas lineas, se puede generar un xml a partir del resultado de una consulta.

Parto del principio que ya tienen instalado (si se puede llamar así) el framework, y tienen una base de datos en Mysql con alguna tabla.

En mi caso, tengo una base de datos de nombre "ci", y los parámetros de la conexión ya los tengo configurados en el archivo database.php de la carpeta config.

Primero creo un modelo de nombre prueba, y dentro tengo la función


        function consulta($sql){
return $this->db->query($sql);
}

La cual recibe como parámetro el sql a ejecutar.

Luego tengo mi controlador llamado generateXML, el cual contiene las siguientes funciones


        public function generar()
{
$this->load->dbutil();
$this->load->model('prueba');
$config = array (
'root'    => 'usuarios',
'element' => 'registro',
'newline' => "\n",
'tab'    => "\t"
);
header("Content-Type: application/rss+xml; charset=utf-8");
echo $this->dbutil->xml_from_result($this->prueba->consulta('select Id as identificador,Usuario as login, Password as pass from ci.Usuarios'),$config);
}


       public function __construct() {
// TODO: Auto-generated method stub
parent::__construct();
$this->load->helper('xml');
}

Uso la clase dbutil para poder realizar la exportación a xml. Esta clase tiene varias funciones muy importantes, una de ella que me llamo la atención ( a parte de la que uso en este post) es la de backup, la cual próximamente estaré hablando de ella en un sistema que estoy realizando.

El resultado lo estoy mostrando por pantalla, pero podría mandarlo a un archivo, para lo cual tendrían que hacer lo siguiente:

$this->load->helper(array('xml','file')); //Esto en construct en vez de solo xml

Comentar el header y el echo en la función generar y colocar


              if(!write_file('/ruta/a/guardar/tabla.xml', $this->dbutil->xml_from_result($this->prueba->consulta('select Id as identificador,Usuario as login, Password as pass from ci.Usuarios'),$config)))
echo "No se pudo";
else
echo "Se grabo";


Es importante, la ruta en donde se va a guardar el archivo debe tener permiso de escritura para el usuario www-data.

Espero que les sea de utilidad, y hasta el siguiente post.



viernes, 20 de septiembre de 2013

Perl - Un sistema que almacena claves

Hoy les traigo, un trabajo que tengo dos días realizando. Esta hecho en lenguaje perl, es algo sencillo pero expansible.

La idea del sistema es que este administre las claves de los usuarios,  las genere aleatoriamente y permita, si asi lo desea, que el usuario pueda ingresar su clave deseada.

Esta información se guarda en un archivo plano, y cuando se decida salir del sistema, este encripte el archivo usando gnupg.

Probablemente, muchos se pregunten porque hago este sistema si ya hay varios parecidos en la red, y la respuesta es sencilla, me gusta crear mis propios sistemas ( a pesar de que ya existen) y cuando quiero aprender un nuevo lenguaje, me gusta hacerlo haciendo un sistema verdadero.

Para ejecutar el sistema, se debe tener instalado perl y gpg.

La ejecución es sencilla
perl sistClaves.pl


Aquí se les dejo el enlace para que lo descarguen y prueben.
https://dl.dropboxusercontent.com/u/71252081/sistClaves.pl

Espero que lo disfruten.

martes, 16 de julio de 2013

Iniciando con Symfony 2


Buenas, después de un tiempo sin publicar, vuelvo con algo de programación. En esta oportunidad, les voy a comentar sobre un framework en php que siempre me ha llamado la atención, y que últimamente por cuestiones de trabajo he estado usando y me parece asombroso, es Symfony.

En el pasado les he comentado sobre codeigniter, que en mi opinión es un framework fácil de aprender, robusto, y con un gran futuro; Symfony es un poco mas complicado de aprender y trabajar, pero con muchas herramientas para el programador, muy grande, y con una posibilidad de desarrollo impresionante.

Para el momento del desarrollo de esta publicación, esta disponible en la pagina oficial del framework, http://symfony.com/, la versión 2.3.1.

En Internet se consiguen varias formas de poder instalarlo, entre ellas (o las mas comunes):

La instalación, como pueden ver, es como la de codeigniter, solo descomprimir (composer hace algo parecido), y colocar en el servidor web.

Una vez que hayan "instalado" Symfony, nos colocamos en una consola en el directorio interno de la instalación, ejemplo: /var/www/symfony. Si todo funciona bien, al ejecutar el siguiente comando, php app/console,  te debería dar la lista de opciones.

Para comprobar que no hace falta nada mas en el servidor para que Symfony funcione bien, ejecutamos el siguiente comando php app/check.php. Esto nos va a indicar si todo esta funcionando correctamente.

Los directorios que componen el framework son claros, pero a pesar de todo los voy a explicar rápidamente.
  • app Contiene archivos de configuración (config/ , AppKernel.php ), directorios de cache y log (cache, logs) y vistas las cuales son validas para todos tus proyectos (Resources)
  • bin Archivos de ejecución
  • src Contiene tus proyectos (bundles)
  • vendor Los bundles de terceros
  • web Están los estilos, js, imagenes ( bundles/ ), y app_dev y app que serían los index, desde donde se gestiona la carga del framework.
Espero que les haya servido lo presentado hasta ahora, y en los próximos post les hablare un poco mas de este maravilloso framework.

domingo, 5 de mayo de 2013

Script de backup


Buenas a todos,

 todos sabemos lo molesto que es perder información por falla en nuestro pendrive, o en nuestro disco duro, quizás por esto es que se han hecho mas común los servicios en la nube.

También se vuelve molesto y tedioso, cuando estas trabajando en el desarrollo de un nuevo sistema, y tienes que copiar todo el directorio en el pendrive, y luego cuando llegas a la casa, tener que copiar todo el directorio en el equipo de la casa; y después tener que hacer lo mismo pero en sentido inverso.

Bueno esto me estaba pasando recientemente con un proyecto en el que estoy trabajando, hago algunas cosas en la oficina, pero después en la noche, en la comodidad de mi casa, hago otro poco mas, y me parecía muy incomodo tener que copiar los directorios completos y responder las preguntas del sistema "Desea sobrescribir el contenido del escritorio?", es por eso, que dedique un poquito de tiempo, y escribí un script, que me permite, copiar el contenido de mi directorio de trabajo en el directorio que tengo sincronizado con Dropbox, y luego en la casa(u oficina) hacer lo inverso ( de dropbox a mi escritorio de trabajo).

En este script uso por supuesto a nuestro amigo rsync.

Aquí les dejo el código:


#!/bin/bash

diaHora=$(date +"%m-%d-%Y  %T")

ruta=$(pwd)

origen=$1
destino=$2
opciones="-aczuv --stats --delete --no-whole-file --exclude-from=$ruta/exclude-list "

if (($# < 2))
then
    echo "Número de parámetros incompleto. Se esperan dos, el directorio origen y el destino"
else
    if [ ! -d "$origen" ]
    then
        echo "El directorio de origen no existe o es invalido"
        exit
    fi
   
    if [ ! -d "$destino" ]
    then
        echo "El directorio destino no existe o es invalido"
        exit
    fi
   
    echo $diaHora >> log_rsync
    rsync $opciones $origen "$destino" >> log_rsync
fi


Se le pasa por parámetro es la ruta del directorio origen y el directorio destino. Como pueden ver se valida que el número de parámetros sean dos y que los directorios existan. En caso de que se cumpla todo lo anterior,  el comando rsync se ejecuta.

Entre las opciones, incluí una de exclusión, y esto se debe a que no quiero respaldar cosas que no me interesan, aquí les dejo un ejemplo:

*.git
.git/*
cache/*
logs/*


Aquí pueden notar, que no respaldo nada relacionado con git, ni el contenido del directorio cache y logs.

Recuerden, que para que el script pueda funcionar, deben darle permiso de ejecución.

Espero que les sirva de ayuda.

miércoles, 1 de mayo de 2013

Git al rescate de los programadores

Buenas noches, después de un tiempo sin escribir, aquí les traigo una nueva entrada.

En esta oportunidad, quiero tratar sobre el tema de control de versiones. Para los programadores, siempre es importante, tener respaldo constante del código que están desarrollando, y mas aun, tener respaldos sobre versiones de código en el cual estaban seguros que lo que estaba funcionaba bien. Bueno, esa es la razón de ser de los queridos programas que nos permiten el control de versiones, guardar las diferencias, entre el código antiguo y el nuevo, de forma tal, que en cualquier momento poder revisarla y regresar a la misma.

Existen varios programas que nos permiten eso, entre los mas sonados tenemos a subversion y git. En esta oportunidad hablaremos sobre git.

Para instalar git en nuestro querido linux, basta con ejecutar 

aptitude install git git-core

Una vez instalados los paquetes, nos ubicamos en el directorio donde queremos que se haga el control de versiones y se ejecuta: 

git init

Con esta instrucción, lo que se esta haciendo es crear el repositorio en blanco del proyecto que se va a manejar.

Luego, se ejecuta 

git add .

Con esto le estamos diciendo a git que agregue a todos los archivos y directorios ubicados en la posición actual, al repositorio.

Y con

git commit -a

Le indicamos, que ahora guarde en el repositorio todos los cambios que se han ocurrido entre lo que esta en el repositorio y lo que existe actualmente en los archivos. La "-a" me posiciona en mi editor para que escriba un comentario sobre lo que estoy almacenando.

Otro comando muy usado, es 

git status

esto permite ver si existe alguna diferencia entre lo que esta en los repositorios y lo que esta actualmente disponible.

Otros comandos usados, pero en esta oportunidad, para configurar a git

git config --global user.name "TU NOMBRE"
git config --global user.email tuemail@provedor.algo
git config --global core.editor tu_editor (vi, vim, emacs, nano, etc) 

Y siguiendo con las configuraciones, este que te voy a mostrar te permite ver como va tu configuración hasta ahora

git config --list

Como ultimo punto, si no desean incluir en el control de versiones ciertos archivos o directorios, ejemplo: txt, pdf, archivos de claves, etc., la solución es crear un archivo de nombre .gitignore (este debe estar en el directorio que estamos manejando). En el vamos a colocar, por ejemplo:

*/logs/*
*/cache/*
*.txt
*.sql

Lo anterior hace, que se no se maneje en el control de versiones el contenido que se encuentra en el directorio logs y cache (pero el directorio si se crea), tampoco son tomados por el controlador de versiones los archivos terminados en txt y sql.

Algo mas que es de mucha ayuda e importancia, es el manejo de ramificaciones, es decir, por defecto se crea y se trabaja en la rama master ( esto lo podemos saber ejecutando el comando git branch), pero en caso de que queramos una nueva rama, digamos para hacer pruebas, la creamos con el comando git brach prueba, con esto hemos creado la rama prueba. 

Ahora para cambiarse a esa rama ejecutamos el comando git checkout prueba. Todas las modificaciones que hagamos ahora en los archivos que están bajo el control de versiones, serán visibles solo en la rama prueba. Digamos que el código que estábamos probando funciona bien y esta estable, bueno podemos pasarlo a la rama master ejecutando

 git checkout master
 git merge prueba




En caso de que se quiera hacer un roolback:

 git log (obtenemos el id del commit)
 git reset --hard id_commit



En caso de que necesiten mas información, les recomiendo la pagina
http://git-scm.com/
http://www.maefloresta.com/portal/es/git.es
tienen mucha información.

sábado, 23 de febrero de 2013

Borrando los comentarios de forma masiva


Aquí les dejo en esta oportunidad, un script que me hes de mucha utilidad.

Como medida de seguridad y eficiencia, antes de subir mis páginas a los servidores de producción, borro todo lo que son comentarios y lineas en blanco de mi código fuente.
 

#!/bin/bash

#Busca el patron // en los archivos indicados y la sustituye por otra
# Para ejecutar ./comentario.sh *.s
#(trabaja con todos los archivos con extension s)
#Adicionalmente borra los enter y todas la lineas contenidas entre /* */

patron='//'

for i in $*
do
        linea=`grep -n $patron $i`

        if [ -z "$linea" ]
        then
                echo "No se encontró la cadena en el archivo $i"
        else
                #El primero borra las lineas //
                #El segundo los enter
                #Y el tercero lo contenido entre /* */
                sed '/^\/\//d' $i | sed '/^$/d' | sed '/\/\*/,/\*\//d' > $i.tmp
                mv $i $i.backup
                mv $i.tmp $i
        fi
done

echo "Finalizado"

Espero que les sea de utilidad.

lunes, 4 de febrero de 2013

Codeigniter: Enviando email

Despues de un tiempo desaparecido por trabajo y vacaciones, vuelvo con este post, enviando email desde un formulario hecho en Codeigniter.

Aqui les pongo el codigo del controlador:

public function formEmail($exito = ""){
        $datos['titulo'] = "Envio de mensaje"; // titulo de la pagina
        if($exito != "")
            $datos['exito'] = "Mensaje enviado satisfactoriamente";
        $this->load->view('email_view',$datos);
    }


public function sendEmail(){
        $this->load->library('email');
        $datos['titulo'] = "Envio de mensaje";
       
        $config = array(
                        array(
                        'field' => 'txtpara',
                        'label' => 'Para',
                        'rules' => 'required|trim|valid_emails'),
                        array(
                        'field' => 'txtasunto',
                        'label' => 'Asunto',
                        'rules' => 'required|trim|alpha'),
                        array(
                        'field' => 'txtmensaje',
                        'label' => 'Mensaje',
                        'rules' => 'required|trim')
                        );
        $this->form_validation->set_rules($config);
       
        if($this->form_validation->run() == FALSE){
            $this->load->view('email_view',$datos);
        }else{
            $config['protocol'] = 'sendmail';
            $config['mailpath'] = '/usr/sbin/sendmail';
            //esto en caso de que quieran enviar desde un servidor
            //$config['smtp_host'] = 'servidor';
            //$config['smtp_user'] = 'usuario';
            //$config['smtp_pass'] = 'clave';

            $config['charset'] = 'utf-8';
            $config['wordwrap'] = TRUE;

            $this->email->initialize($config);
            $this->email->from('usuario_envia@servidor','nombre_del_que_envia');
            $this->email->to($this->input->post('txtpara'));
            $this->email->subject($this->input->post('txtasunto'));
            $this->email->message($this->input->post('txtmensaje'));
           
            if(! $this->email->send()){
                $datos['error'] = "El mensaje no pudo ser enviado";
                $this->load->view('email_view',$datos);
            }else{
                $exito = "Mensaje enviado satisfactoriamente";
                $post = $this->input->post();
                foreach ($post as $k => $a){
                    $post[$k] = "";
                }
                $this->formEmail($exito);
            }
        }
    }



Y este es el codigo de la vista email_view.php

<html>
    <head>
        <meta http-equiv='Content-Type' content='text/html; charset=utf-8'/>
        <title><?php echo $titulo;?></title>
        <link rel="stylesheet" href="../../application/views/css/estilos.css" type="text/css" media="screen">
    </head>
    <body>
        <div id="formulario">
        <?php
        $attributes = array('class' => 'form', 'id' => 'email');
           
        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>";

        echo form_open('prueba/sendEmail', $attributes);
       
            echo "<div>";
            echo form_label("Para: ");
            $attributes = array('id' => 'txtpara', 'size' => '20','name' => 'txtpara', 'maxlength' => '20', 'value' => set_value('txtpara') );
            echo form_input($attributes);
            echo "</div>";
           
            echo "<div>";
            echo form_label("Asunto: ");
            $attributes = array('id' => 'txtasunto', 'size' => '20','name' => 'txtasunto', 'maxlength' => '20', 'value' => set_value('txtasunto') );
            echo form_input($attributes);
            echo "</div>";
           
            echo "<div>";
            echo form_label("Mensaje: ");
            $attributes = array('id' => 'txtmensaje', 'rows' => '10','name' => 'txtmensaje', 'cols' => '25', 'value' => set_value('txtmensaje') );
            echo form_textarea($attributes);
            echo "</div>";
           
            echo "<div>";
            $attributes = array('id' => 'sbEnviar','name' => 'sbEnviar', 'class' => 'boton');
            echo form_submit($attributes,'Enviar');
            echo "</div>";

        echo form_close();
       
        ?>
        </div>
    </body>
</html>

Cuando hago referencia a "prueba/sendEmail" en la creacion del formulario, se refiere a la función sendEmail que se encuentra en mi controlador prueba (prueba.php)

El estilo al que hago referencia es el siguiente

@CHARSET "UTF-8";

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

#formulario{
    border: 2px solid olive;
    border-radius: 7px;
    -moz-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:6px;
    -moz-border-radius:6px;
    box-shadow: 1px 1px 3px #bbb;
    -webkit-box-shadow: 1px 1px 3px #bbb;
    -moz-box-shadow: 1px 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%;
    border-radius : 8px;
    -moz-border-radius: 8px;
}

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

#error{
    color:red;
    border-color: #e74476;
}


/* Estilo usado en el archivo de mensajes */
#exito{
    color:green;
    border-color: #30d252;
    font-size: 15px;
    margin-top: 10px;
}


Es importante que cargen la libreria form_validation, ya que hago uso de la misma.

Espero que les sea de utilidad.