Mostrando entradas con la etiqueta desarrollo. Mostrar todas las entradas
Mostrando entradas con la etiqueta desarrollo. Mostrar todas las entradas

jueves, 8 de noviembre de 2012

Build Authz 1.1.2 - Ayuda visual para construir el archivo "authz" [Actualizado]

Hoy liberé la nueva versión (1.1.2rv18) de esta herramienta que ayuda a construir el archivo "authz" para repositorios Subversion.  Referencia

En las novedades de la aplicación están:

  • La opción de verificar el formato del archivo authz (mediante la herramienta de subversion "svnauthz-validate").
  • Cargar usuarios desde un archivo "passwd".
  • Guardar y cargar, la vista previa de los permisos que vamos configurando.
Y algunas correcciones de bugs.


pueden descargar los binarios para:

Windows
Linux
OsX


martes, 30 de octubre de 2012

[fix] Solución al problema de "GPG Badsig" al actualizar Ubuntu/Mint

Bueno, en lo personal, he tenido este problema muchas veces, cuando al estar actualizando se corta por alguna razón la red (algo habitual aquí en la oficina... ¬_¬)  y al momento de actualizar de nuevo, este error aparece "GPG badsig"

La solución es muy sencilla:
Movemos el directorio "lists" de "/var/lib/apt" a lists.old y actualizamos!

Pero! como es recurrente este problema en mi caso, tengo que borrar el directorio "lists" de "lists.old" cada vez que esto sucede, y es algo que se puede automatizar con un sencillo script.


#!/bin/bash
#Autor Max J. Rodriguez Beltran. 2012

user=$(whoami)
directorio="lists"
olddirectorio="lists.old"

if [ $user = "root" ]; then
    cd /var/lib/apt
    if [ -d $olddirectorio ]; then
        #echo "existe" $olddirectorio
        cd $olddirectorio
        if [ -d $directorio ]; then
            echo "borramos " $directorio "de " $olddirectorio
            rm -r $directorio
        fi 
        cd /var/lib/apt
        echo "movemos " $directorio "al dir: " $olddirectorio
        mv $directorio ${olddirectorio}/
        echo "ahora actualizamos la lista..."
        sleep 5;
        apt-get update
    fi
else
    echo "Ejecuta este script con sudo"
    exit 1
fi
echo "Termino ejecución"

pueden copiar y pegar el script, solo recuerden dar permisos de ejecución al script y ejecutarlo como root.

$chmod +x fixgpgbadsig.sh

y ejecutan:

$sudo ./fixgpgbadsig.sh

O pueden descargar el script y leerlo, ejecutarlo y modificarlo a su gusto.
Descarga: fixgpgkeyproblem.sh 


viernes, 26 de octubre de 2012

Build Authz 1.0 - Ayuda visual para construir el archivo "authz"

Este es el primer release de esta pequeña aplicación que nació para facilitar la configuración y creación del archivo "authz" para los repositorios de Subversion. Esta desarrollada en Lazarus 1.0.2.



Para recordar ver el post

SVN - Control de acceso con Authz


Esta aplicación es liberada bajo licencia GPL, es Software Libre y pueden descargar el código fuente desde el siguiente repositorio:


para modificarlo, leerlo y compilarlo a su gusto.

O pueden descargar los binarios precompilados para las diferentes plataformas:
  • Windows
  • Linux/Gtk
  • OsX

La documentación y manual se encuentra en la lista de descarga.

viernes, 12 de octubre de 2012

Llenando un Treeview desde un directorio en lazarus (Linux/Windows)

Bueno vengo a poner un ejemplo sencillo de como llenar un Treeview desde un directorio en Lazarus, algo curioso que note al portarlo a Linux y OsX es que el valor que la constante "faDirectory" en Windows toma un valor de "16" y en SO "Unix" toma el valor de "48" por ese detalle al principio no me listaba los directorios, después de ir viendo paso por paso los valores que tomaban me di cuenta de eso, solo agregamos una validación que identifique el SO en el que se esta ejecutando y ajustar ese valor.

En el ejemplo agregamos al evento OnClick de un botón el siguiente código:

procedure TfrmMain.btnAgregaMarcadorClick(Sender: TObject);
var
    lcSearch: TSearchRec;
    lcFileAttr: integer;
    lcFatherNode: TTreeNode;
    lcChildNode: TTreeNode;
    lcPath: String;
begin
    {$IFDEF UNIX}
        lcFileAttr:= 48;
    {$ELSE}
        lcFileAttr:= faDirectory;
    {$ENDIF}
    SelectDirectoryDialog1.Execute;
    lcPath:=SelectDirectoryDialog1.FileName;
    if Length(lcPath) > 0 then begin
        lcFatherNode:= TTreeNode.Create(TreeView1.Items);
        lcFatherNode:= TreeView1.Items.AddChild(TreeNodeRoot,lcPath);
        lcFatherNode.ImageIndex:=0;
        lcFatherNode.SelectedIndex:=0;
        lcFatherNode.Expanded:=True;
    end;
    lcPath:=lcPath+PathDelim;
    If FindFirst(lcPath+'*',faDirectory,lcSearch)=0 then begin
        repeat
            if lcSearch.Attr = lcFileAttr then begin
                if (lcSearch.Name = '.') or (lcSearch.Name = '..') then continue;
                lcChildNode:= TreeView1.Items.AddChild(lcFatherNode,lcSearch.Name);
                lcChildNode.ImageIndex:=0;
                lcChildNode.SelectedIndex:=0;
                AddDirectorios(lcChildNode,lcPath+lcSearch.Name);
            end;
        until FindNext(lcSearch) <> 0;
        FindClose(lcSearch);
    end;
   TreeView1.Refresh;
end;

El siguiente procedimiento lo agregamos nosotros, este será llamado desde nuestro anterior proceso cuando encuentre un directorio, y será llamado recursivamente desde él mismo agregando los nodos hijos con el nombre de los directorios encontrados.

procedure TfrmMain.AddDirectorios(elNodo: TTreeNode; cPath: String);
var
    sr: TSearchRec;
    lcFileAttr: Integer;
    theNewNode : tTreeNode;
begin
    {$IFDEF UNIX}
        lcFileAttr:= 48;
    {$ELSE}
        lcFileAttr:= faDirectory;
    {$ENDIF}

    if FindFirst(cPath+PathDelim+'*', faDirectory, sr) = 0 then begin
        repeat
            if sr.Attr = lcFileAttr then begin
                if (sr.Name = '.') or (sr.Name = '..') then continue;
                    theNewNode := TreeView1.Items.AddChild(elNodo,sr.name);
                    theNewNode.ImageIndex:=0;
                    theNewNode.SelectedIndex:=0;
                    AddDirectorios(theNewNode,cPath+PathDelim+sr.Name);
            end;
        until FindNext(sr) <> 0;
        FindClose(sr);
    end;
end;

viernes, 5 de octubre de 2012

Ejemplo sencillo usando Hilos (Threads) con Lazarus 1.0 en Linux (Ubuntu12.04)

Bueno, buscando mejorar el rendimiento de una aplicación que estoy desarrollando *mientras aprendo* usando el IDE Lazarus, supuse que lo mejor sería usar hilos para ciertos procesos de la aplicación que pueden llegar a ser pesados, al ver y probar algunos ejemplos de multithreading en windows vi que era la solución, todo bien, estuve probando y experimentando y funcionaba de lo lindo en windows, al compilarlo en Linux, todo compilaba bien... solo que al llegar a crear el hilo saltaba una excepción fatal!



Revisando el código, probando linea por linea, comparándolo con el ejemplo de multi threading que viene con Lazarus, no encontraba el error, usaba lo que tenía que usar, todo en su lugar... eso creía yo.

Esto es una sugerencia basada en mi experiencia: Si preguntan en algún foro, y esperan una respuesta rápida, pregunten en foros en idioma Inglés, cuando he preguntado en foros en español, o no me contestan, o tardan millones de años.

Bueno lancé la pregunta en el foro de Lazarus y en Stack Overflow, minutos mas tarde ya me estaban respondiendo con algunos tips, y comentarios de lo que podría estar fallando o faltando en mi proyecto.

En resumen la cuestión era que si se van a usar threads en Linux(UNIX, OsX  BSD y demás) es necesario agregar al archivo ".lpr" del proyecto (este archivo es creado automaticamente al crear un proyecto, en el directorio del proyecto) necesitamos agregar la siguiente linea:

{$define UseCThreads}

Quedando de la siguiente forma el documento:


{$mode objfpc}{$H+}
{$define UseCThreads}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, Unit1
  { you can add units after this };
  .
  .
  .

Una vez agregado esto y recompilando, funcionó.

Bueno voy a agregar el pequeño ejemplo:
Comienzan un nuevo proyecto en Lazarus->aplicación, y agregara un form vacío, agregamos un botón y un progressbar para el ejemplo.


unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ComCtrls;

//Creamos el type para lo que será nuestro hilo
type

{ TMiHilo }

  TMiHilo = class(TThread)
  private
    procedure AvanzaBarra;
  protected
    procedure Execute; override;
  public
    constructor Create(CreateSuspended: boolean);
  end;     

{ TForm1 }
  TForm1 = class(TForm)
    Button1: TButton;
    ProgressBar1: TProgressBar;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;         

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }
//agregamos al evento click del botón, aquí se iniciará nuestro hilo al dar click
procedure TForm1.Button1Click(Sender: TObject);
var
    MiHilo : TMiHilo;
    begin
        //creamos el hilo, pero no lo iniciamos
        MiHilo := TMiHilo.Create(True); // Con el parametro true no se inicia automaticamente
        if Assigned(MiHilo.FatalException) then
           raise MiHilo.FatalException;
        //si no hay ninguna excepción lo iniciamos
        MiHilo.Start;
end;

//aquí definimos los procesos para el hilo
{ TMiHilo }

procedure TMiHilo.AvanzaBarra;
//Este metodo solo es llamado por Synchronize(@AvanzaBarra) y por ello
// es ejecutado por el hilo principal.
//El hilo principal puede acceder a los elementos visuales del GUI por ejemplo a la progressbar 
begin
    Form1.ProgressBar1.StepIt;

    if Form1.ProgressBar1.Position = Form1.ProgressBar1.Max then begin
        Form1.ProgressBar1.Position := 0;
    end;
end;

//Este proceso se ejecuta al iniciar el hilo
procedure TMiHilo.Execute;
begin
    
    //mientras no termine y sea verdadero se ejecutará 
    while (not Terminated) and (true) do begin
        //este loop es del hilo principal 
        Synchronize(@AvanzaBarra);
    end;
end;

constructor TMiHilo.Create(CreateSuspended: boolean);
begin
    //Con esta propieda del hilo no necesitamos liberarlo manualmente al terminar de ejecutar el hilo
    FreeOnTerminate := True;
    inherited Create(CreateSuspended);
end;


end.

Y listo, compilamos y ejecutamos y debemos ver nuestro formulario con un botón y una barra de progreso, al dar clic en el botón esta comenzará a llenarse, cuando se llene se vaciará y comenzara de nuevo. No olviden agregar la linea {$define UseCThreads} en el archivo .lpr de su proyecto para que la validación de "si es compilado en Unix" use cThreads.


jueves, 20 de septiembre de 2012

Desarrollo multiplataforma con Lazarus (Clon de Delphi)

¿Que es Lazarus?

Bueno en su página podemos encontrar lo siguiente:
Lazarus es el conjunto de bibliotecas de clases para el compilador Free Pascal que emula a Delphi. Free Pascal es un compilador de licencia GPL que trabaja sobre Linux, Windows, OsX, OS/2, 68k y más.
Lo interesante de esto es que podemos crear nuestro proyecto en cualquier plataforma y solo tendremos que compilarla en otras para mudarla. Como ejemplo, creamos un proyecto en Windows con componentes normales de este, para migrarlo a Linux solo tenemos que mover el proyecto al equipo con Linux y Lazarus instalado, seleccionar que conjunto de widgets queremos utilizar (GTK o Qt para Linux) y compilarlo, Lazarus se encargará de todo, no tenemos que reescribir nuestro código.

A diferencia de Java que es "compilalo una vez ejecútalo donde sea", con Lazarus lo escribimos una vez y lo compilamos donde queramos".

En cuanto al lenguaje, como se menciono es un clon de Delphi, entonces para los que usaron esta herramienta, será muy familiar para ellos.

A finales del mes pasado (Agosto) acaban de liberar la versión 1.0 de esta herramienta.
Podemos ver las notas de cambios aqui:  http://wiki.lazarus.freepascal.org/Lazarus_1.0_release_notes 

Acá unas imágenes de como se ve trabajando en Linux 


Y acá imágenes del mismo proyecto compilado en Windows:


La herramienta esta muy completa, se encarga de hacer los bindings para la interfaz, tiene soporte nativo para bases de datos, MySQL, PostgreSQL, SQL Sever y más, y es multiplataforma, así que vale la pena probarlo. 

Para Ubuntu/Mint no esta en los repositorios oficiales y desafortunadamente no cuenta con un ppa, pero en la página de descargas ofrecen los paquetes DEB con los que podemos instalarlos fácilmente.


Sitio principal de Lazarus: http://www.lazarus.freepascal.org/





jueves, 5 de julio de 2012

Enviando Correos con PERL usando SMTP de Gmail (Windows & LINUX)

Dejando un poco de lado a Twitter, buscábamos agregar un modulo para un proyecto para enviar correos, ya tenemos uno, pero al utilizarlo para conectarse al servidor SMTP de gmail, simplemente no funcionaba. Tan fácil como buscar en google, hay muchas bibliotecas para hacerlo, el problema es que para el servidor que se va a utilizar la versión de PERL es la 5.8 o 5.10, y para estas versiones las bibliotecas de ActivePerl para windows solo soportan las versiones 5.14 >
Por eso este post menciona la forma de hacerlo en Windows con un PERL 5.8 y con LINUX usando PERL 5.14.

Vamos con la primera forma de hacerlo con LINUX:

Para esto podemos usar la biblioteca Email::Send::Gmail
en su página de CPAN podemos encontrar un ejemplo de como usarlo.

=======================================================================


#!/usr/bin/perl

use strict;
use Email::Simple;
use Email::Simple::Creator;
use Email::Send;
use Email::Send::Gmail;

send_mail();
print "mensaje enviado";

sub send_mail {

my $usuario = 'tucorreo@gmail.com';
my $password = 'tupassword';

#Creamos el correo, a quien va dirigido, de quien, el asunto y el mensaje
my $email = Email::Simple->create(
    header => [
        To => 'JuanPerez@gmail.com',
        From => $usuario,
        Subject => 'Probando 123',
        ],
    body => "Prueba desde LINUX",
    );

#Aquí especificamos que usara a Gmail como servidor SMTP
my $sender = Email::Send->new(
{    mailer => 'Gmail',
    mailer_args =>[
        username => $usuario,
        password => $password,
        ]
}
);
$sender->send($email);


}

=========================================================================

Hasta aquí todo bien, pero en windows usando PERL 5.8 no está la biblioteca, entonces hurgando un poco en su código, podemos ver como funciona esta, nos podemos dar cuenta que usa la biblioteca Net::SMTP::SSL, y esta si la podemos encontrar para PERL 5.8.

y así quedaría el código para enviarlo en windows:



#!/usr/bin/perl

use strict;
use Net::SMTP::SSL;
  
send_mail('juanPerez@gmail.com','Prueba desde windows', 'probando el correo desde windows ;D');  
print "mensaje enviado";
    
sub send_mail {
  
  my $username = 'tucorreo@gmail.com';
  my $password = '123456';
  my $dest = shift; #'destinatario@algomail.com'
  my $asunto = shift;  
  my $body_mail = shift;

  #creamos la conexión con el servidor SMTP de Gmail
  my $smtp = Net::SMTP::SSL->new(
       'smtp.gmail.com',
       Port  => 465,
       Debug => 0,
       )
        || print 'Email::Send::Gmail: error connecting to server smtp.gmail.com';
    #se realiza al autentificación 
    $smtp->auth( $username, $password )
        or
        print "Email::Send::Gmail: error authenticating username $username";
        
  $smtp->mail($username);        
  $smtp->to($dest);
  #Se envía el correo
  $smtp->data();
  $smtp->datasend("From: ". $username );
  $smtp->datasend("\n");
  $smtp->datasend("To: ". $dest );
  $smtp->datasend("\n");
  $smtp->datasend("Subject: ". $asunto. "\n");
  $smtp->datasend("\n");
  $smtp->datasend($body_mail ."\n");
  
  $smtp->dataend();
  $smtp->quit();
  
  
}
Y así podemos enviar correos usando nuestras cuentas de Gmail a traves de PERL en LINUX y Windows.

lunes, 25 de junio de 2012

Usando la API de twitter con PERL y NET::Twitter parte 2 "Home TimeLine"

Continuando con el uso de la API de Twitter usando PERL ahora veremos como obtener tu Timeline.

Continuando con el script anterior, vamos a agregar un metodo para llamar e imprimir el time line (los ultimos 20 tuits de nuestro timeline)

Nota: elimine los comentarios del script anterior, se pueden revisar en el código del post anterior.

y recuerden en la página de cpan, esta la documentación de la biblioteca y sus metodos: http://search.cpan.org/dist/Net-Twitter/lib/Net/Twitter.pod


!#/usr/bin/perl
use strict;
use Data::Dumper;
use Net::Twitter;

my $youraccesstoken='';    
my $youraccesstokensecret='';   

my $twitterconsumer = 'SdXKgscRc82fcWkzKn3IA';
my $twitterconsumersecret = 'ZLZyzIVaTgXqdMmvszBRI64zWIzIRRa525y8gzaIBA';

my $nt = Net::Twitter->new(
 traits          => ['API::REST', 'OAuth'],
 consumer_key    => $twitterconsumer,
 consumer_secret => $twitterconsumersecret,
);

if ($youraccesstoken && $youraccesstokensecret) {
 $nt->access_token($twitteraccesstoken);
 $nt->access_token_secret($twitteraccesstokensecret);
}

unless ( $nt->authorized ) {
 print "Authorize this app at ", $nt->get_authorization_url, " and enter the PIN#\n";
 
 my $pin =; # wait for input
 chomp $pin;
 
 my($access_token, $access_token_secret, $user_id, $screen_name) = $nt->request_access_token(verifier => $pin);

 print 'Id Usuario: '.$user_id'."\r\n".'Screen name: '.$screen_name."\r\n";
print 'Access token: '.$access_token."\r\n".'Access Token Secret: '.$access_token_secret."\r\n";

}

get_timeline();

sub get_timeline {

my $timeline = $nt->home_timeline();#Este metodo regresa un arrayref

my ($x,$y);

# recorremos el array
    foreach $x(0..@{$timeline-1}){
        foreach $y(0..@{$timeline[$x]}-1)
        {
            print $timeline[$x][$y]->{user}->{screen_name}.":"."\n";
            print $timeline[$x][$y]->{text}."\n";
            print "====================================\n";
        }

        }
#para ver el objeto "timeline" y comprender un poco mas como es que esta armado
#podemos usar Dumper para verlo.

print Dumper($timeline);


}

miércoles, 20 de junio de 2012

Usando la API de twitter con PERL y NET::Twitter parte 1 "Autentificación"

Por curiosidad hace poco comencé a jugar con la API de twitter y lo hice con JAVA y la biblioteca twitter4j, pero solo es para sacarme el polvo en JAVA y ver como funciona twitter.

En mi trabajo comenzamos un proyecto web, que incluye a twitter, y algo de lo que ya hice en java me funcionó para el proyecto, solo que estamos utilizando PERL para ello. Tan fácil como desde CPAN instalar la biblioteca Net::Twitter.
En CPAN esta documentada, los métodos que usa pero a diferencia de  JAVA hay menos ayuda  ejemplos en la web de como usarla. Así que voy a estar subiendo algunos ejemplos básicos de su uso.
Cabe aclarar que no soy un "guru" en perl, de hecho soy bastante nuevo así que me ha servido de practica. Son libres de corregir, criticar y mejorar y compartir la mejora ;D

Lo primero, la autentificación, hay un ejemplo en la pagina de cpan:

!#/usr/bin/perl


use strict;
use Data::Dumper;
use Net::Twitter;

my $youraccesstoken='';     #esta variable contendra el Token Access para autentificarte en twitter, primero la declaramos vacía, después de autentificar tendrá un valor y lo mejor es guardarlo para su uso posterior
my $youraccesstokensecret='';     #esta variable como la anterior una vez obtenido su valor, lo mejor es guardarla

my $twitterconsumer = 'SdXKgscRc82fcWkzKn3IA'; #Estos valores los obtienes al registrar tu aplicación en la página de http://dev.twitter.com
my $twitterconsumersecret = 'ZLZyzIVaTgXqdMmvszBRI64zWIzIRRa525y8gzaIBA';

my $nt = Net::Twitter->new(
 traits          => ['API::REST', 'OAuth'],
 consumer_key    => $twitterconsumer,
 consumer_secret => $twitterconsumersecret,
);

#validamos si el Token acces y el Token Access Secret tienen valores

if ($youraccesstoken && $youraccesstokensecret) {
 $nt->access_token($twitteraccesstoken);
 $nt->access_token_secret($twitteraccesstokensecret);
}

#validamos si los datos de acceso son correctos si no lo son imprime la URl para autorizar la aplicación

unless ( $nt->authorized ) {
 print "Authorize this app at ", $nt->get_authorization_url, " and enter the PIN#\n";
 #esperamos por entrada el PIN que dio la página
 my $pin =; # wait for input
 chomp $pin;
 
        #Aquí obtenemos verificamos el PIN y si todo esta bien, nos regresa una lista con el Access token, el access token secret, el id del usuario y su screen name
 my($access_token, $access_token_secret, $user_id, $screen_name) = $nt->request_access_token(verifier => $pin);

        print 'Id Usuario: '.$user_id'."\r\n".'Screen name: '.$screen_name."\r\n";
 print 'Access token: '.$access_token."\r\n".'Access Token Secret: '.$access_token_secret."\r\n";

 exit();

}
Nota: Si usan UBUNTU, las librerías también las pueden encontrar en los repositorios de Ubuntu, como "libnet-twitter-perl" e instalarla desde synaptic  o un "apt-get install".