martes, 27 de agosto de 2013

Perl: Paso de parámetros por referencia

Paso de parámetros por referencia en Perl

Cuando invocamos una subrutina y le pasamos parámetros en realidad le estamos pasando una lista de datos, que se llama @_ . Cuando pasamos vectores (matrices, arreglos o arrays ) o tablas asociativas ( hashes ) como parámetros, en realidad los estamos introduciendo, elemento por elemento, en @_ . La forma más económica de pasar parámetros a subrutinas es pasarlos por referencia. De esta manera no pasamos los datos en sí, si no la dirección que ocupan en memoria. Así no es necesario enumerar y copiar todos los datos a @_, y evitar los problemas de pasar varios hashes o arreglos, y la subrutina que reciba las referencias puede acceder a los datos en su organización original, ya sean escalares, vectores o tablas asociativas, las tres clases de variables en Perl. Por otro lado el paso por referencia permite modificar de forma permanente, no local, los datos pasados como argumento.

1) Ejemplo de paso por referencia

#
# Ejemplo de paso de parámetros por referencia en Perl:
# ¿Como pasar parámetros por referencia y modificar los valores?
# How to pass parameters by reference in perl, modify the values​​?
#This is perl 5, version 14, subversion 2 (v5.14.2)
#!/usr/bin/perl

#use strict;
#use warnings;

my $param = "algo";
my @vector1 = (1,2,3);
function_with_params(\$param, \@vector1);
print "\n";
print $param;
print "\n";
print $vector1[0];
print "\n";

sub function_with_params{
    my ($arg1, $arg2) = @_;
    ${$arg1} = "changed...";
    @{$arg2}[0]=33;    #vector1
    return;
    }

2) Ejemplo de paso por referencia de un array.

#!/usr/bin/perl
use strict;
use warnings;

print "Ejemplo perl de paso por referencia de un array... \n";

my @airlines_travel = ("a","b","b","c","k");
my $arrayRef = \@airlines_travel; #referencia al array
my $string = "b";

print "Count: " . howManyTimesIsString($string, $arrayRef) . "\n";

# Cuenta cuantas veces esta un string en un array
sub howManyTimesIsString {
 my ($string, $arrayRef) = @_;
 my $count = 0;
 foreach my $item (@{$arrayRef}) {
   if ($string eq $item) {
      $count++;
   }
 }
 return $count;
}

3) POO y paso por referencia.


En perl todos los objetos son una referencia. Es decir, cuando tenes un $obj es una variable scalar que simplemente mantiene la referencia al objeto. Cuando pasamos un objeto como parámetro lo que estamos pasando es su referencia (no es necesario hacer nada extraño para explicitar esto).

También se puede explicitar usando \variableObject y $$variableObject pero no es recomendable usarlo de esta manera. A continuación un ejemplo de esta forma:

#This is perl 5, version 14, subversion 2 (v5.14.2)
#...

sub metodo1{
  my ($self) = @_;

  my $obj = Example->new();
  my $o = $self->metodo2(\$obj);
  print $o->getName();
  return;
}

sub metodo2{
  my ($self, $obj) = @_;
#...
  print $$obj->encodeHTMLtoUTF8($str);
  $$obj->setName("modificado");
  return $$obj;
}



Referencias:
-Paso de parámetros por valor y por referencia (Perl).
-Blog: Parametros por referencia en perl.




lunes, 29 de abril de 2013

Perl: Read a Table from database using DBI

¿How to read a Table from database using DBI? 

#!/usr/bin/perl -w

use strict;
use warnings;
use DBI;

use constant DATABASE => "mydatabase";
use constant HOSTNAME => "myhostname";
use constant USERNAME => "user";
use constant PASSWORD => "123";

my $dbh = db_connect();

print "\nRead MyTable table : \n";

my $rows = read_table($dbh);
my $affected_rows = print_table($dbh, $rows);
print "Affected rows: $affected_rows: \n";

#
sub read_table {
    my $dbh = shift;

    my $sql1 = qq(
        SELECT * FROM MyTable

    );
    my $sth1 = $dbh->prepare_cached( $sql1 );
    $sth1->execute();
    my $sql_return = $sth1->fetchall_arrayref( {} );
       
    return $sql_return;
}

#
sub print_table {
    my $dbh = shift;
    my $rows = shift;

    foreach my $row (@$rows) {       
          print "$row->{
columnName_01}\n";
          print "$row->{columnName_02}\n";  
        }

  my $arraySize = scalar (@$rows);
  return $arraySize;
   
}
   
sub db_connect {
   
    my $db   = DATABASE;
    my $host = HOSTNAME;
    my $user = USERNAME;
    my $pass = PASSWORD;

    my $dbh = DBI->connect(
        join(':', 'dbi:mysql', $db, $host), $user, $pass,
        { AutoCommit => 1, PrintError => 1, RaiseError => 1 },
    );

    return $dbh;
}

viernes, 26 de abril de 2013

Perl: Modules installing on Ubuntu system

¿What Perl Modules Already Installed On My System?
¿Qué módulos tengo instalado en el sistema?

How to list installed perl module? List installed perl module:

$ instmodsh

Available commands are:
   l            - List all installed modules
   m <module>   - Select a module
   q            - Quit the program
cmd? l
Installed modules are:
   Class::Load
   Data::OptList
   Dist::CheckConflicts
   ExtUtils::MakeMaker
   List::MoreUtils
   MRO::Compat
   Module::Implementation
   Module::Runtime
   Mojolicious
   Package::DeprecationManager
   Package::Stash
   Package::Stash::XS
   Params::Util
   Perl
   Perl::Metrics::Simple
   String::Util
   Sub::Exporter
   Sub::Install
   Sub::Uplevel
   Test::Deep
   Test::Exception
   Test::Fatal
   Test::NoWarnings
   Test::Requires
   Test::Tester
   Try::Tiny
   local::lib


Other way:
 
perl -e 'while (<@INC>) { while (<$_/*.pm>) { print "$_\n"; } }'
 
Show all perl paths:
 
perl -E 'say join "\n", @INC'
 
Find a file: 
sudo find / -type f -name 'Example.pm'
 
 
¿What Know if a Perl Modules Already Installed On My System?

perl -MNameModule -e 1
If not installed throw error "Can' locate module....."

For example: 
perl -MException::Base -e 1
perl -MLog::Log4perl -e 1

Install using CPAN:


For example:

sudo perl -MCPAN -e 'install IO::EventMux'
sudo perl -MCPAN -e 'install Log::Log4perl'
sudo perl -MCPAN -e 'install Test::Class'
sudo perl -MCPAN -e 'install Log::Dispatch'
sudo perl -MCPAN -e 'install Params::Validate'
sudo perl -MCPAN -e 'install DBD::mysql'
sudo perl -MCPAN -e 'install JSON::XS'
sudo perl -MCPAN -e 'install Cache::Memcached'  

sudo perl -MCPAN -e 'install Thread'    
sudo perl -MCPAN -e 'install Thread::Pool'

sudo perl -MCPAN -e 'install Exception::Base'
sudo perl -MCPAN -e 'install XML::LibXML' 

Install using System:

For example:

sudo apt-get install libtest-class-perl
sudo apt-get install liblog-dispatch-perl
sudo apt-get install libparams-validate-perl
sudo apt-get install libdbd-mysql-perl
sudo apt-get install libjson-xs-perl
sudo apt-get install libjson-perl
sudo apt-get install libjson-any-perl
sudo apt-get install libcache-memcached-perl

sudo apt-get install libnumber-format-perl
sudo apt-get install libtest-log-dispatch-perl
sudo apt-get install libconfig-inifiles-perl
sudo apt-get install libwww-perl
sudo apt-get install libdigest-md5-perl
sudo apt-get install libproc-daemon-perl
sudo apt-get install libxml-simple-perl

sudo apt-get install libxml-libxml-perl

¿Cómo saber si tenemos un módulo instalado?

Si Module::Util está instalado, use pm_which:
:~$ pm_which EL::Modulo

Use perldoc, pues para saber si un módulo está instalado y donde se encuentra (supuesto que el módulo contiene documentación en su interior) use perldoc -l:
:~$ perldoc -l EL::Modulo

También puede comprobar la existencia cargando el módulo:
:~$ perl -MEL::Modulo -e 1

Instale pmtools y use el comando pminst (Se puede obtener en http://search.cpan.org/~mlfisher/pmtools/.)

Sigue un ejemplo de uso:
pp2@nereida:~/src/perl/IPC-PerlSSH/lib/IPC$ pmdesc EL::Modulo # descripción

pp2@nereida:~/src/perl/coro$ pminst odulo
EL::Modulo
pp2@nereida:~/src/perl/IPC-PerlSSH/lib/IPC$ pmload EL::Modulo  # Que modulos carga

Módulos en el Núcleo de Perl:
:~> perl -MModule::CoreList -e \
   'print Module::CoreList->first_release("Data::Dumper")."\n"'


Referencias:-Saber que Módulos están Instalados: http://www.davioth.com/lhp/node188.html




martes, 23 de abril de 2013

Android: Adapter personalizado


Un Adapter es una extensión de la clase "android.widget.BaseAdapter" que intermedia entre las clases backend de datos y la frontend vista (LayoutInflater). Por ejemplo:

Object <--- ObjectAdapter --->  ObjectLayoutInflater

LayoutInflater es la clase que convierte xmls de vista frontend  a objetos.




Referencia:
-Como crear un adapter en Android.
http://www.nosolounix.com/2010/12/ejecutar-desde-eclipse-en-movil-android.html

miércoles, 17 de abril de 2013

Programación Python desde cero

Aprender Python desde cero en 10 pasos.

El siguiente video es un taller para Aprende a programar en Python desde cero:

A continuación los primeros pasos desde consola Linux:

1) ¿Cómo sabemos si tenemos instalado Python?
consola:~$ python
Python 2.7.3 (default, Aug  1 2012, 05:16:07)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
Si no lo tenes instalado hay que instalarlo. En Linux Ubuntu es como sigue:

sudo apt-get install python python-psycopg2 python-reportlab \
python-egenix-mxdatetime python-tz python-pychart python-mako \
python-pydot python-lxml python-vobject python-yaml python-dateutil \
python-pychart python-webdav

sudo apt-get install python-cherrypy3 python-formencode python-pybabel \
python-simplejson python-pyparsing

sudo apt-get install python-gtk2 python-glade2 \
    python-matplotlib python-egenix-mxdatetime python-hippocanvas

#sudo apt-get install python-xml 


2) El primer código hola mundo en python.
>>> print "Hola mundo"
Hola mundo

3) ¿Listas y diccionarios?
>>> milista=[10,5,"Hola",True]
>>> print milista
[10, 5, 'Hola', True]
>>> usuarios={"Daro":"micuenta", "Carlos":"czantanay", "Codejobs":"codejobs"}
>>> print usuarios["Daro"]
micuenta

4) Tipos implícitos de datos en python:
>>> dato_int=1
>>> dato_str="mi cadena"
>>> type(dato_int)
<type 'int'>
>>> type(dato_str)
<type 'str'>
...presionar Ctrl L para limpiar pantalla.

5) Algunas operaciones en python:
>>> 2 ** 3
8
>>> 100/5
20
>>> 100 % 2
0
>>> 10.5 / 2
5.25
>>> 10.5 // 2
5.0

6) ¿Cómo ejecutar un archivo python?
consola:~$ nano my_first_program.py
#Creamos un archivo...
#El archivo del primer programa:
daro = "micuenta"
if daro == "micuenta":
        print "Mi cuenta es @" + daro
elif daro == "cualquier cosa":
        print "cualquier cosa"
else:
        print "Visita @codejobs"
#guardamos y salimos... presionar: Ctrl O enter + Ctrl X
consola:~$ python my_first_program.py
Mi cuenta es @micuenta

7) ¿Cómo hacer Ciclos en python?
>>>  # bucles while:
consola:~$ python
Python 2.7.3 (default, Aug  1 2012, 05:16:07)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.

>>> i = 0
>>> while i<5:
...     i = i + 1
...     print i
...
1
2
3
4
5
>>> # bucles for:
>>> lenguajes = ["php", "Java", "Perl", "Python", "C"]
>>> for item in lenguajes:
...     print "->" + item
...
->php
->Java
->Perl
->Python
->C
>>>

8) ¿Cómo definir funciones en python?
consola:~$ nano my_second_program.py
#Creamos un archivo...
#El archivo del primer programa:
def suma(dato1, dato2):
        print dato1 + dato2

def desplegar(cadena, numero):
        print numero * cadena

suma(5, 5)
desplegar("cadena ", 5)
#guardamos y salimos... presionar: Ctrl O enter + Ctrl X
consola:~$ python my_second_program.py
10
cadena cadena cadena cadena cadena

9) ¿Cómo leer desde consola?
>>> nombre = raw_input("Ingrese su nombre: ")
Ingrese su nombre:


10) ¿Cómo programar orientado a objetos en python?

#El archivo se debe llamar igual que el nombre de la clase.
consola:~$ nano MiPrimeraClase.py
class MiPrimeraClase:
        """Comentarios"""
        nombre = "daro"
        def __init__(self, nombre):
                self.nombre = nombre
        def hola(self):
                print "Hola " + self.nombre

#Instanciar la clase
miprimeraclase = MiPrimeraClase("cacho")
miprimeraclase.hola()
#guardamos y salimos... presionar: Ctrl O enter + Ctrl X

consola:~$ python MiPrimeraClase.py
Hola cacho

Tener en cuenta que:
"Programar programa cualquiera. Para programar bien hay que estudiar. Estudie."

Referencias:
-Taller de programacion Python en Youtube.
-Python Training for HP OSO.
-Python: Orientación a objetos..


jueves, 4 de abril de 2013

Android: Init with Android on Linux Ubuntu

Init to develop with Android on Ubuntu
How to init a development with Android on Linux Ubuntu?

1) Download:
Search in: http://www.android.com/ 
Open: http://developer.android.com/sdk/index.html
Download: adt-bundle-linux-x86-20130219.zip

2) Install:
Unzip on Home folder.
Home->adt-bundle-linux-x86-20130219

3) First project.
Run Eclipse... Home->adt-bundle-linux-x86-20130219->eclipse
Help->About ADT

New->Android Application Project
Run As->Android Application
Select... Yes
Select... "Launch a New Android Virtual Device"; Select Manager; Select New; Select... Device: Nexus S (4.0,480x800:dhpi)
Select... Target: Android 4.2.2 - API Level 17
Click... Start.



Select... Run Configuration -> Select... Target -> "Always prompt to pick device".

Referencias: