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

domingo, 16 de diciembre de 2012

Como instalar Perl en el iphone ios

Esta vez vamos a aprender a instalar Perl en nuestro iPhone/iPod/iPad,de momento yo lo he probado en ipod touch 3g/4g y iphone 4 iOS 5.1.1 con jailbreak.

Necesitan jailbreak y iOS 5,no lo he probado en iOS 4 o 3 pero creo que también funciona :D

Solo les tengo malas noticias,este lenguaje usado en iOS esta dedicado al scripting,ya que no esta(no he encontrado) UICaboodle para perl y crear interfaces graficas basadas en UIApliction :(.

Osea que solo lo podremos usar en scripts como es el caso de ruby,no como python que si incluye UICaboodle por ejemplo esta es la app de python que se instala con python(hello word) y lo que hace es importar los contactos y mostralos en GUI:


# Special thanks goes to Dave Arter (dave@minus-zero.org)
# for actually writing most of this sample application!!

# While I managed to get PyObjC working, I didn't actually
# know any Python to go with it ;P. - Jay Freeman (saurik)

import sys

import objc
from _uicaboodle import UIApplicationMain
from objc import YES, NO, NULL
from sqlite3 import dbapi2 as sqlite 

objc.loadBundle("UIKit", globals(), "/System/Library/Frameworks/UIKit.framework")

class PYApplication(UIApplication):
    def getName(self, contact):
        name = contact["first"]
        if contact["last"] is not None:
            name += " " + contact["last"]
        return name

    @objc.signature("i@:@")
    def numberOfSectionsInSectionList_(self, list):
        return len(self.sections_)

    @objc.signature("@@:@i")
    def sectionList_titleForSection_(self, list, section):
        return self.sections_[section]["title"]

    @objc.signature("i@:@i")
    def sectionList_rowForSection_(self, list, section):
        return self.sections_[section]["row"]

    @objc.signature("i@:@")
    def numberOfRowsInTable_(self, table):
        return len(self.contacts_)

    @objc.signature("@@:@i@@")
    def table_cellForRow_column_reusing_(self, table, row, col, reusing):
        contact = self.contacts_[row]
        if reusing is not None:
            cell = reusing
        else:
            cell = UIImageAndTextTableCell.alloc().init()
        cell.setTitle_(self.getName(contact))
        return cell

    @objc.signature("c@:@i")
    def table_canSelectRow_(self, table, row):
        return NO

    @objc.signature("v@:@")
    def applicationDidFinishLaunching_(self, unused):
        self.contacts_ = []
        self.sections_ = []

        db = sqlite.connect(self.userHomeDirectory() + "/Library/AddressBook/AddressBook.sqlitedb")
        cursor = db.cursor()
        cursor.execute("select first, last from ABPerson where first is not null order by first")
        for first, last in cursor.fetchall():
            self.contacts_.append({"first": first, "last": last})
        cursor.close()
        db.close()

        outer = UIHardware.fullScreenApplicationContentRect()
        self.window = UIWindow.alloc().initWithFrame_(outer)

        self.window.orderFront_(self)
        self.window.makeKey_(self)
        self.window.setHidden_(NO)

        inner = self.window.bounds()
        navsize = UINavigationBar.defaultSize()
        navrect = ((0, 0), (inner[1][0], navsize[1]))

        self.view = UIView.alloc().initWithFrame_(self.window.bounds())
        self.window.setContentView_(self.view)

        self.navbar = UINavigationBar.alloc().initWithFrame_(navrect);
        self.view.addSubview_(self.navbar)

        self.navbar.setBarStyle_(1)

        navitem = UINavigationItem.alloc().initWithTitle_("Contact List")
        self.navbar.pushNavigationItem_(navitem)

        i = 0
        letter = u""
        for contact in self.contacts_:
            name = self.getName(contact)
            now = unicode(name[0])
            if letter != now:
                letter = now
                self.sections_.append({"row": i, "title": now})
            i += 1

        lower = ((0, navsize[1]), (inner[1][0], inner[1][1] - navsize[1]));
        self.list = UISectionList.alloc().initWithFrame_(lower)
        self.view.addSubview_(self.list)

        col = UITableColumn.alloc().initWithTitle_identifier_width_("Name", "name", 320)

        table = self.list.table();
        table.setSeparatorStyle_(1)
        table.addTableColumn_(col)
        table.setReusesTableCells_(YES)

        self.list.setDataSource_(self)
        self.list.reloadData()

UIApplicationMain(sys.argv, PYApplication)



Y se ejecuta con un script en bash:


#!/bin/bash
exec "$(dirname "$0")"/Python "$(dirname "$0")"/HelloPython.py

Así se podría hacer en Perl,pero no hay nada de documentación y tampoco encuentro UICaboodle para perl,para por lo menos traducir las aplicaciones de Python a Perl y crear algunas apps sencillas para que sirvan de ejemplo.

Pero bueno,de todas formas en cydia nos dan muchos módulos muchos para usarlos en scripting desde terminal,que se encuentran en CPAN.




Tutorial



1.Necesitamos ya tener el jailbreak pero también necesitamos instalar de cydia:

openssh

APT 0.7 HTTPS Method

wget 

sbsettings y el toogle de ssh

Y por ultimo Terminal








Solo entran a cydia,los buscan y instalan


2.Ahora en nuestro sistema de escrtitorio necesitamos un cliente ssh,en mi caso Archlinux instale openssh

 sudo pacman -S openssh

 Y nos conectamos por ssh

Encendemos el ssh del iphone y en la Pc/Mac

ssh root@ip_del_iphone

La ip del iphone esta en mismo sbsettings




3.Descargamos el .pub

wget http://coredev.nl/cydia/coredev.pub

Lo añadimos
apt-key add coredev.pub
Usamos un pipe para mandarlo a sources

echo 'deb http://coredev.nl/cydia iphone main' > /etc/apt/sources.list.d/coredev.nl.list
Recargamos los repos

apt-get update

4.Y instalamos

No probé

apt-get install perl

Pero puede que funcione ya que así instale python

Pero para mas seguro:

Salimos del ssh

exit

Entramos a Cydia >> Manejar >> Fuentes y estará una repo con el camello :D


Entramos y buscamos Perl


Instalamos



Hacemos un respring.

5.Creamos Hola Mundo

Abrimos terminal y escribimos:

 echo '#!/usr/bin/local/perl' > hola.pl && echo 'print "Hola Mundo!!!\n"' >> hola.pl

Pueden por ssh,o por con un editor como el de iFile

Y listo


Eso es todo si quieren módulos busquen en la repo hay muchos :D

Referencias:






Leer más...

sábado, 24 de noviembre de 2012

Crear aplicaciones para Android con Perl Ejemplo

Vamos a seguir con el desarrollo de aplicaciones para android con perl,en este caso o mejor dicho en esta entrada ya se tiene tomado en cuenta que ya tienes las apps necesarias para programar listas y instaladas en tu móvil.

Si no es así visita este tutorial:

Tutorial

Bien ahora vamos a hablar claro,el desarrollo de apps para android se puede hacer en muchos lenguajes de programación  desde su lenguaje nativo,en C,C++ en scripting con lenguajes no compilados,android ofrece esta característica a los desarrolladores profesionales o a los aficionados autodidactas como yo,esto se puede integrar a un desarrollo muy bueno,para crear una app muy buena,pero, que pasa con el scripting?

Como funciona el scripting en android?

El scripting en Android funciona gracias a SL4a (Scripting Layer for Android) SL4a usa Android Facades para exponernos las API's disponibles,esto hace que sea el lenguaje de scripting que sea nos brinda el mismo set de API's

Que son las API's?

API (del inglés Application Programming Interface) es el conjunto de funciones y procedimientos  en la programación orientada a objetos, que ofrece cierta biblioteca para ser utilizado por otro software como una capa de abstracción.

Osea que en otras palabras podemos programar algo con el set de API's que nos ofrecen,en otras palabras no tendremos el mismo resultado que si programamos en Java

Asi es como funciona una app de Android con SL4a


Esa imagen es de python,pero SL4A funciona igual con Python,Perl,Lua

Bien aqui un ejemplo

Programa de encuesta para Android escrita en python hecho por cristalab.com

Este programa lo que hace es Abrir una Alerta y preguntar algo y la respuesta se efectúa con botones ,luego con una estructura selectiva muestra una alerta para cada boton:


import android
droid = android.Android()
crear_alerta = droid.dialogCreateAlert('Encuesta','Te gusta http://rootcodes.com?')
boton_no = droid.dialogSetNegativeButtonText('No me gusta')
boton_si = droid.dialogSetPositiveButtonText('Si, me gusta')
boton_cancelar = droid.dialogSetNeutralButtonText('Yo no voto!')
droid.dialogShow()
respuesta = droid.dialogGetResponse().result
if respuesta['which']=='positive':
  droid.dialogCreateAlert('Gracias por tu voto','Me alegra que te guste!')
elif respuesta['which']=='negative':
  droid.dialogCreateAlert('Gracias por tu voto','Una lastima que no te guste!')
else:
  droid.dialogCreateAlert('Gracias por tu voto','Un voto nulo :\\')
droid.dialogShow()


Mas info en cristalab.com

Como también se python traduje ese algoritmo a perl y luce así(cambie el texto y añadí unos botones) pero hace lo mismo.


use Android;

my $droid = Android->new();
$droid->dialogCreateAlert("Encuesta", "Te gusta perl");
$droid->dialogSetNegativeButtonText("No me gusta");
$droid->dialogSetPositiveButtonText("Si me gusta");
$droid->dialogSetNeutralButtonText("Yo no Voto!!");
$droid->dialogShow();

my $respuesta = $droid->dialogGetResponse->{'result'};

my $which = $respuesta->{'which'};

if($which =~ m/positive/) {
$droid->dialogCreateAlert('  Gracias', 'Por tu respuesta');
$droid->dialogSetPositiveButtonText("Salir");
}
elsif($which =~ m/negative/) {
$droid->dialogCreateAlert('  Que mal', 'Gracias por tu respuesta');
$droid->dialogSetPositiveButtonText("oK");
}
elsif ($which =~ m/neutral/) {
$droid->dialogCreateAlert('  Gracias', 'Tal vez luego');
$droid->dialogSetPositiveButtonText("oK");
}

$droid->dialogShow()


Lo explico:


my $droid = Android->new(); # Nueva estructura
$droid->dialogCreateAlert("Encuesta", "Te gusta perl"); # Crea Alerta
$droid->dialogSetNegativeButtonText("No me gusta"); # Crea Botón
$droid->dialogSetPositiveButtonText("Si me gusta"); # Otro botón
$droid->dialogSetNeutralButtonText("Yo no Voto!!"); # Y otro botón
$droid->dialogShow(); # Mostramos la alerta

Eso hace esto:



Ahora esto:

my $respuesta = $droid->dialogGetResponse->{'result'};

Comienza después de pulsar un botón.
Esta variable no sera visible,lo que hace es pedir la respuesta,o mejor dicho ver que botón se pulso,la sintaxis ya la hemos visto,solo que aquí usa los argumentos Android.

Esto:

my $which = $respuesta->{'which'};


Tampoco sera visible,lo que hace es limpiar la respuesta a positive,negative o neutral y guardarlo en una variable ($which).

Y por ultimo:

if($which =~ m/positive/) {
$droid->dialogCreateAlert('  Gracias', 'Por tu respuesta');
$droid->dialogSetPositiveButtonText("Salir");
}
elsif($which =~ m/negative/) {
$droid->dialogCreateAlert('  Que mal', 'Gracias por tu respuesta');
$droid->dialogSetPositiveButtonText("oK");
}
elsif ($which =~ m/neutral/) {
$droid->dialogCreateAlert('  Gracias', 'Tal vez luego');
$droid->dialogSetPositiveButtonText("oK");
}

$droid->dialogShow()



Creamos una estructura selectiva de tres comparadores,solo cabe mencionar que usamos una expresión regular para comparar la respuesta:

$which =~ m/negative/

Al final if :


if($which =~ m/positive/) {
$droid->dialogCreateAlert('  Gracias', 'Por tu respuesta');
$droid->dialogSetPositiveButtonText("Salir");
}


hará esto:


El primer elsif :

elsif($which =~ m/negative/) {
$droid->dialogCreateAlert('  Que mal', 'Gracias por tu respuesta');
$droid->dialogSetPositiveButtonText("oK");
}


Esto:


Y el segundo elsif:

elsif ($which =~ m/neutral/) {
$droid->dialogCreateAlert('  Gracias', 'Tal vez luego');
$droid->dialogSetPositiveButtonText("oK");
}

Esto:




Cabe mencionar que esta forma de programación se hace desde el móvil y es algo molesto, pero pueden hacerlo desde la pc,solo metan el script en la carpeta sl4a/scripts de su memoria del movil



Y checen la API


Es muy buen set


Eso es todo :D



Leer más...

miércoles, 31 de octubre de 2012

Script en perl para ver las dimensiones de una imagen


Como dije,en el lapso del tiempo en el que haga los tutoriales de perl,sacare pequeños programas para que vean para que funciona perl,ya que me he dado cuenta de que muchas personas dicen y me han dicho que no es muy funcional perl,que mejor ponga tutoriales de python,pero no perl es muy muy funcional,para muchas cosas y es mi lenguaje de programación interpretado favorito y sirve para muchas cosas al igual que como hemos visto con bash,solo que perl reune lo mejor de C,sh,AWK, sed, Lisp para poder crear programas como el que vamos a ver hasta programas muy muy potentes,ya sea para multimedia o seguridad informática ademas de muchas otras cosas mas.

Bueno esta entrada no es una parte de nuestra serie te tutoriales sobre perl,solo es un ejemplo de un script que te puede servir para algo como a mi me ha servido.

Nota:Esto es programación si se te hace complicado puedes usar herramientas como gimp,o un visor de imágenes con esta cualidad, que son muchos.Este es un ejemplo para entusiastas a la programación Perl


Lo que hace este script es solo mostrar las dimensiones de una imagen

Ancho por alto

Hice dos scripts

1.Lo lee por entrada del teclado

Así es,es leída la ruta por el teclado, así que no tendrás que poner la ruta en el script sino que la escribirás a la hora de ejecutar el programa.



2.Aun mejor,si tienes zenity lo puedes hacer mas simple,solo ejecutas el script y abrira un buscador grafico ya con las extensiones filtradas.

Primero que nada,necesita el modulo Image::Size

Aprendimos a instalar módulos en la entrada pasada

Enlace

Así que lo instalamos con CPAN

install Image::Size

Y aquí el código

Script 1 sin zenity



Si necesitas saber las dimensiones de una imagen desde un sistema sin shell grafica prueba este script



Enlace

Explicado con #

#!/usr/bin/env perl

use strict;
use Image::Size; # Usar modulo
system("clear"); # limpiar pantalla

print "Ruta de la imagen :"; # < Imprimimos eso
my $imagen = <STDIN>; # Ruta desde entrada del teclado

chop($imagen); # Limpiamos la entrada

my ($ancho, $alto) = imgsize($imagen); # Comandos que miden la imagen

print "Tu imagen $imagen es de :\n";  # < Imprimimos esto
print "Ancho: $ancho x Alto: $alto\n"; # Imprimimos medidas
exit(1);



Script 2 con zenity




Si tienes zenity y gnome,xfce u otro escritorio que soporte zenity y quieres ver un poco de perl en acción,prueba este script

Enlace

Explicado

#!/usr/bin/env perl

use strict;
use Image::Size; # Usar modulo 
system("clear"); # limpiar pantalla

print "Ruta de la imagen :  \n"; # < Imprimimos eso

my @formatos = ( # Array con los formatos compatibles(hay mas)

 'formatos --file-filter=*.JPG',
 'formatos --file-filter=*.bmp',
 'formatos --file-filter=*.jpeg',
 'formatos --file-filter=*.jpg',
 'formatos --file-filter=*.png',
 'formatos --file-filter=*.tif',
 'formatos --file-filter=*.xbm',
 'formatos --file-filter=*.xpm',
 'formatos --file-filter=*.gif'
);

my $imagen =`zenity --file-selection @formatos --title="Selecciona una imagen"`;

# ^ Variable que abre zenity

chop($imagen);  # Limpiamos la seleccion

if ( $imagen eq $1 ) { # Estructura selectiva para ver si se selecciono algo con zenty

print "No elegiste una imagen\n";
exit(1);
}
else{ # Si se selciono algo se ejecuta lo siguiente

my ($ancho, $alto) = imgsize($imagen); # Comandos que miden la imagen

print "Tu imagen $imagen es de :\n";
print "Ancho: $ancho x Alto: $alto\n"; # Imprimos las medidas

exit(1);
}

Para usarlo creen un documento .pl 

En terminal

touch dimension-imagen.pl

Luego con tu editor favorito

editor_favorito dimension-imagen.pl

Por ejemplo

vim dimension-imagen.pl

Pegan el código



Y guardan

Luego le dan permisos de ejecución

chmod +x dimension-imagen.pl

Y ejecutan

./dimension-imagen.pl

Eso es todo

Si no tienes zenity puedes instalarlo ya que el segundo script es mucho mas útil  si usas Gnome,XFCE con

Para Ubuntu

sudo apt-get install zenity

Para openSUSE

sudo zypper in zenity

Para Archlinux

sudo pacman -S zenity

Para Gentoo

Como root

emerge zenity

Bueno puede que el script sea mucha molestia ya que esto se hace con clic derecho información y ahí están los pixeles,pero hay que hacer desde lo basico para poder hacer cosas mas grandes,espero que les haya servido y hayan aprendido algunas cosas.

Leer más...