martes, 14 de diciembre de 2010

Programillas para el iPhone

tsocks
Cydia Source: http://sid77.slackware.it/iPhone/
(Si está caido... instalar a mano -> Acá)


Perl 5
Cydia Source: http://coredev.nl/cydia


bigbosshackertools
Cydia Source: BigBoss
Excelente recopilaci&oacuten de las mejores aplicaciones para la CLI.

Ej: adv-cmds, apt, basic-cmds, bootstrap-cmds, bzip2, class-dump, coreutils, developer-cmds, diskdev-cmds, file-cmds, gawk, gdb, git, gzip, iokittools, less, make, nano, network-cmds, ldid, openssh, rsync, shell-cmds, system-cmds, com.ericasadun.utilities, top, uikittools, findutils, inetutils, diffutils, lsof, subversion, vim, xar, tar, patch, unrar, unzip, wget, whois, xml2, zip, p7zip

adv-cmds: finger, fingerd, last, lsvfs, md, ps
basic-cmds: msg, uudecode, uuencode, write
bootstrap-cmds: Bootstrap Commands
coreutils: core set of Unix shell utilities from GNU
developer-cmds: ctags, error, hexdump, rpcgen, unifdef
diskdev-cmds: mount, quota, fsck, fstyp, fdisk, tunefs
file-cmds: chflags, compress, ipcrm, ipcs, pax
iokittools: ioalloccount, ioclasscount, ioreg
network-cmds: arp, ifconfig, netstat, route, traceroute
shell-cmds: killall, mktemp, renice, time, which
system-cmds: iostat, login, passwd, sync, sysctl
com.ericasadun.utilities: Info.
uikittools: UIKit Tools
findutils: indexes and searches filesystems
inetutils: ftp, inetd, ping, rlogin, telnet, tftp
diffutils: compare two files for differences

sábado, 20 de noviembre de 2010

Datos para escribir y hablar mejor ;)

Dado que siempre el chilenito tiene problemas con ciertas palabras y sintaxis a la hora de hablar o escribir, aquí les paso dos definiciones de nuestros mayores errores:

Solecismo.- Es de varias naturalezas:
a) Cuando en una frase "sobran" (decir, por ejemplo Debes de obedecer a tu papá, en vez de Debes obedecer a tu papá, recordando que ambas formas existen, pero con significados distintos) o "faltan" palabras (Voy ir, en vez de Voy a ir).
b) Cuando en una palabra “sobran" (trajistes, hicistes, pudistes, comprastes, etc., en vez de trajiste,hiciste, pudiste, compraste) o "faltan" letras (gasolinera en vez de gasolinería).
c) Cuando se emplea un dativo como acusativo (le vi en vez de lo vi o de la vi).
d) Cuando, sin justificación, se comprime el lenguaje (deja veo), o cuando se usan unos verbos por otros (no te hagas el occiso).

Pleonasmo.- Es la repetición, sin sentido, de un mismo concepto con palabras sinónimas o con frases análogas. Ejemplos: "Subir para arriba, bajar para abajo, salir para afuera, lapsos de tiempo, los problemas difíciles de una ciudad no tienen soluciones fáciles.


...con esto ya saben como llamarlas por lo menos ;)

jueves, 9 de septiembre de 2010

GetLyric: Buscador de Letras de Canciones

Bueno, aquí se viene otro código más...

Este entrega la letra (o lyric) de una cierta canción!

Como funciona:
Fácil, solo tienen que correr el Escri por linea de comando (usa Perl) y pasarle como parámetro el nombre del artista y el nombre de la canción.
El script buscará la letra en dos sitios distintos (en caso de que falle el primero, se utiliza el segundo ;) ) y si dá con él entonces lo mostrará por pantalla, sino, se queda callado y termina la ejecución del script corta y fome :P

Yap, espero que en este código no se me haya quedado una password o algo por el estilo (información sensible) ya que últimamente he cometido ese tipo de errores (pero gracias a Dios que tengo buenos amigos ;) )

Bueno, ahí está el código... Enjoy!

#!/usr/bin/perl
use strict;
use LWP::UserAgent;
use HTML::Entities;


if (($ARGV[0] eq '') || ($ARGV[1] eq '')) {

    print "GetLyric 1.0 ( http://wischv.blogspot.com/ )\n";
    print "Autor: Walter Schmidt\n";
    print "Usage: $0 \"Artist\" \"Song\"\n";
    exit;
}

#################################################


#my $artist = '311';
#my $song   = 'Do You Right';
my $artist = $ARGV[0];
my $song   = $ARGV[1];


my $lyric = '';
if ($lyric = get_lyric_lyricsplugin($artist, $song)) {
    print $lyric;
}
elsif ($lyric = get_lyric_songlyrics($artist, $song)) {
    print $lyric;
}


#################
##  FUNCIONES  ##
#################

sub get_lyric_songlyrics {

    my $body;
    my $artist_song = lc($_[0] . '/' . $_[1]);
    $artist_song =~ s/' / /g; # Livin' And Rockin' => livin-and-rockin
    $artist_song =~ s/'$//g;  # Livin' And Rockin' => livin-and-rockin
    $artist_song =~ s/'$//g;  # Livin' And Rockin' => livin-and-rockin
    $artist_song =~ s/[\?\&\.' ]/-/g; # It's Alright => it-s-alright
    $artist_song =~ s/[^a-zA-Z0-9\-\/]//g;
    # El exceso de '-' (Ej: '---') son limpiados por el server

    my $ua = new LWP::UserAgent;
    my $resource = $ua->get("http://www.songlyrics.com/$artist_song-lyrics/");

    if ($resource->is_success) {

        $body = $resource->content;
        $body =~ s/[^[:print:]]//g;
        $body =~ /(<p id="songLyricsDiv".*)<p id="songLyricsSmallDiv"/i;
        my $lyric = $1;

        decode_entities($lyric);

        $lyric =~ s/<br \/>/\n/g; # Convierte los <br /> en <ENTER>'s
        $lyric =~ s/<[^>]*>//g;   # Elimina los TAGs de HTML existentes
        $lyric =~ s/\n\[ [^\n]+ are found on www.songlyrics.com \]//g; # Elimina los mensajes de Songlyric
        $lyric =~ s/ +/ /g;    # Elimina el exceso de espacios entre las palabras
        $lyric =~ s/^\s+//g;   # Elimina los espacios y <ENTER>'s del comienzo del Lyric
        $lyric =~ s/\n +/\n/g; # Elimina los espacios del comienzo de cada linea
        $lyric =~ s/ +\n/\n/g; # Elimina los espacios del final de cada linea
        $lyric =~ s/\n+$/\n/g; # Elimina el exceso de <ENTER> al final del Lyric

        return $lyric;
    }
    else {

        #print $resource->status_line . "\n";
        return 0;
    }
}


sub get_lyric_lyricsplugin {

    my $artist = shift;
    my $song   = shift;

    my $site   = 'http://www.lyricsplugin.com';
    my $ua = new LWP::UserAgent;
    my $resource = $ua->get("$site/wmplayer03/plugin/?title=$song&artist=$artist");


    if ($resource->is_success) {

        my $body = $resource->content;
        $body =~ /javascript:getContent\('([^']*)', '([^']*)', '([^']*)', '([^']*)'\)/;

        $resource = $ua->get("$site/wmplayer03/plugin/content.php?artist=$1&title=$2&timestamp=$3&hash=$4", 'Referer' => "http://www.lyricsplugin.com/wmplayer03/plugin/?title=$2&artist=$1");

        if ($resource->is_success) {

            my $lyric = '';
            my $lyric_flag = 0;
            foreach my $line (split /\n/, $resource->content) {

                last if (($line =~ /<\/div>/) && ($lyric_flag));
                if ($lyric_flag) {

                    $line =~ s/\r//;
                    $line =~ s/<br \/>/\n/;
                    $lyric .= $line;
                }
                $lyric_flag = 1 if ($line =~ /<div id="lyrics">/);
            }

            return ($lyric eq '') ? 0 : $lyric . "\n";
        }
        else {

            #print $resource->status_line . "\n";
            return 0;
        }
    }
    else {

        #print $resource->status_line . "\n";
        return 0;
    }
}

jueves, 15 de julio de 2010

Problemas al instalar Google Earth 5.2 en Linux

La finalidad de este mensaje no es la de instalar este software, sino más bien como solucionar el siguiente problema que da al ejecutarlo:

Fatal error in __driConfigOptions line 1, column 0: unknown encoding


Solución? ...sumamente simple ;)

cd google-earth/
wget http://librarian.launchpad.net/7037027/libGL.so.1 -O libGL.so.1


A mi me funcionó por lo menos.

[Ubuntu 10.04 (32 bits)]

lunes, 12 de julio de 2010

[Script] Información de minutos utilizados en Entel

Yap, amigos míos... (no se a quien le hablo, si mal que mal, nadie me lee jajaja)
voy a subir un código de mi autoría.
Ya se... muchos tienen que estar preguntándose: ¿y a mi que!?. Bueno, a mi me gusta el código y lo subo igual, punto :)

El código fue creado con la intención de meterlo dentro de mi iPhone para consultar mis minutos utilizados en la telefonía movil de Entel (o EntelPCS), sin tener que logearme en el pinche sitio para ver la info (esa pega se la dejo al "escri").

Dentro del script hay una sección para que ingresen su RUT, número de teléfono y PIN (tranquilos, que el código NO toma esa información para luego enviármela a mi server super secreto "roba-password-entel" ;) ).

Yap... aquí va... (mientras no encuentre un sitio donde almacenarlo, lo subiré aquí grotescamente).

#!/usr/bin/perl

#####################################################
#
# Desarrollado por: Zort
# Fecha: 11 de Julio de 2010
#
# Descripcion:
#   Obtiene la cantidad de minutos hablados (llamadas realizadas),
# los SMS-MMS enviados y los KB navegados (Banda Ancha solamente)
# de la pagina de Entel.
#
# Anexo:
#   Se omitieron todos los acentos en el codigo, para que no se
# vean caracteres erroneos en el caso de que el equipo donde
# se corra este codigo permita ver solo caracteres gringos.
#
# TODO:
#   Ver la posibilidad de que corra bajo SSL.
#
#####################################################

use strict;
use HTTP::Lite;

# Configuracion
# -----------------------
my $debug = 0;
my $movil = ""; # AQUI INGRESEN EL NUMERO DE TELEFONO
my $rut   = ""; # AQUI INGRESEN EL RUT (EJ: 11.222.333-4)
my $pin   = ""; # AQUI INGRESEN EL PIN (EJ: 1234)
# -----------------------


my $value_voz;
my $value_mensajes;
my $value_banda_ancha;
my $flag_voz;
my $flag_mensajes;
my $flag_banda_ancha;
my $flag = 0;
my $cookie;
my $status_message;
my $location;
my $http = new HTTP::Lite;

# Realizando la primera consulta al servidor
# --------------------------------------------------------
my $buic_rutdv = $rut;
$buic_rutdv =~ s/[\.\-]//g;
$location = "http://www.entelpcs.cl/login/valida_ws.iws?origen=home";
my %vars = (
    "funcion" => "ingreso",
    "ext" => "%2526Sistema%253D1011%2526Portal%253DON%2526desdelogin%253D%2526miEPCS%253DNEW%2526MENU%253DSI",
    "Sistema" => "1011",
    "Portal" => "ON",
    "desdelogin" => "SI",
    "buic_rutdv" => $buic_rutdv,
    "miEPCS" => "NEW",
    "buic" => "yes",
    "Movil" => $movil,
    "Rut" => $rut,
    "PIN" => $pin
);
$http->prepare_post(\%vars);
print "*** Consulta: $location\n" if ($debug);
my $req = $http->request($location)
    or die "Unable to get document: $!";
$status_message = $http->status_message();
$status_message =~ s/[^[:print:]]//g;
print "STATUS: $status_message ($req)\n" if ($debug);
# --------------------------------------------------------


# Obteniendo la direccion del nuevo salto y la cookie asignada
# --------------------------------------------------------
my @headers = $http->headers_array();
foreach my $header (@headers) {

    print $header . "\n" if ($debug);
    if ($header =~ /^Location: (.*)$/) {

        $location = $1;
    }
    elsif ($header =~ /^Set-Cookie: (.*)/) {

        $cookie = $1;
    }
}
print "------------------------------------\n" if ($debug);
# --------------------------------------------------------


# Realizando la segunda consulta al servidor
# --------------------------------------------------------
$http->reset();
$http->add_req_header("Cookie", $cookie);
print "*** Consulta: $location\n" if ($debug);
my $req = $http->request($location)
    or die "Unable to get document: $!";
$status_message = $http->status_message();
$status_message =~ s/[^[:print:]]//g;
print "STATUS: $status_message ($req)\n" if ($debug);
# --------------------------------------------------------


# Obteniendo la direccion del nuevo salto y la cookie asignada
# --------------------------------------------------------
my @headers = $http->headers_array();
foreach my $header (@headers) {

    print $header . "\n" if ($debug);
    if ($header =~ /^Location: (.*)$/) {

        $location = $1;
    }
    elsif ($header =~ /^Set-Cookie: (.*)/) {

        $cookie = $1;
    }
}
print "------------------------------------\n" if ($debug);
# --------------------------------------------------------


# Realizando la tercera consulta al servidor
# --------------------------------------------------------
$http->reset();
$http->add_req_header("Cookie", $cookie);
my $req = $http->request($location)
    or die "Unable to get document: $!";
$status_message = $http->status_message();
$status_message =~ s/[^[:print:]]//g;
print "STATUS: $status_message ($req)\n" if ($debug);
# --------------------------------------------------------


# Obteniendo la direccion del nuevo salto y la cookie asignada
# --------------------------------------------------------
my @headers = $http->headers_array();
foreach my $header (@headers) {

    print $header . "\n" if ($debug);
    if ($header =~ /^Location: (.*)$/) {

        $location = $1;
    }
    elsif ($header =~ /^Set-Cookie: (.*)/) {

        $cookie = $1;
    }
}
print "------------------------------------\n" if ($debug);
# --------------------------------------------------------


# Obteniendo el valor del trafico
# --------------------------------------------------------
my @body = split(/\n/, $http->body());
foreach my $line (@body) {

    if ($line =~ /Voz /) {

        $flag_voz = 1;
    }
    elsif (($flag_voz ==1) && ($line =~ /center/)) {

        $line =~ /align="center">([^<\( ]*)/;
        $value_voz = $1;
        $flag_voz = 0;
    }
    elsif ($line =~ /Banda Ancha/) {

        $flag_banda_ancha = 1;
    }
    elsif (($flag_banda_ancha ==1) && ($line =~ /center/)) {

        $line =~ /align="center">([^<\( ]*)/;
        $value_banda_ancha = $1;
        $flag_banda_ancha = 0;
    }
    elsif ($line =~ /Mensajes/) {

        $flag_mensajes = 1;
    }
    elsif (($flag_mensajes ==1) && ($line =~ /center/)) {

        $line =~ /align="center">([^<\( ]*)/;
        $value_mensajes = $1;
        $flag_mensajes = 0;
    }
}
# --------------------------------------------------------


# Deslogeandose del servidor
# --------------------------------------------------------
$http->reset();
$location = "http://mipcs.entelpcs.com/mipcs2/login?accion=salir";
$http->add_req_header("Cookie", $cookie);
my $req = $http->request($location)
    or die "Unable to get document: $!";
$status_message = $http->status_message();
$status_message =~ s/[^[:print:]]//g;
print "STATUS: $status_message ($req)\n" if ($debug);
# --------------------------------------------------------


print "Trafico Voz        : $value_voz minutos\n";
print "Trafico Mensajes   : $value_mensajes SMS, MMS, otros\n";
print "Trafico Banda Ancha: $value_banda_ancha kilobytes\n";


exit 1;


Shaludos!
Zort

jueves, 3 de junio de 2010

Recuperar archivos eliminados en el iPhone

Bueno... quien investiga aprende, pero antes de aprender, si o si, mete la pata y hasta el fondo jajaja

Aqui vamos con la solución para recuperar las fotos y videos que se perdieron tras utilizar la primera versión del famoso "Spirit" (software para hacerle el jailbreak al iTelefono)

Después de platicar por un par de días con mi amigo Google dí con una opción en la que iTunes no estaba metido entremedio.

Haciendola corta y resumida, lo que tienen que hacer es lo siguiente:


  • Instalar OpenSSH en el iPhone y asegurarse que este se encuentra corriendo.

  • Conectar el iPhone (mediante USB) al Ubuntu.

  • En Ubuntu: Ejecutar el comando "iproxy 3023". Este comando viene con el Ubuntu 10.04, en caso que no lo tengan tienen que instalar el paquete "usbmuxd".
    Este último comando hace un tunel y mueve el puerto 22 del OpenSSH del iPhone al puerto 3023 en el Ubuntu, para que cuando me conecte por SSH al puerto 3023 del Ubuntu, en realidad me voy a estar conectando al iPhone pero a través del USB !!! (osea, mucho mucho más rápido que a traveś del Wi-Fi).

  • En Ubuntu: Ejecutar el siguiente comando en una partición con suficiente espacio para almacenar la partición del iPhone que nos traeremos al Ubuntu:
    ssh -p 3023 root@127.0.0.1 dd if=/dev/rdisk0s2s1 bs=1M | dd of=iphone-user.img
    if=/dev/rdisk0s2s1: Partición del iPhone
    of=iphone-user.img: Archivo que contendrá la imagen de la partición del iPhone.
    La password por defecto de los iPhone es: alpine (en los iPhones reantiguos tenían otra password que ya no recuerdo, pero creanme... son de los primeros jailbreak que se hacian ;) )

  • Una vez termine de traerse la partición del iPhone, tiene que recuperar los archivos que hay dentro (los realmente existentes y los borrados) mediante la utilización del software llamado "Photorec" (en Ubuntu debe instalar el software llamado "TestDisk", el cual contiene el "Photorec")
    Para ejecutar el software, creence un directorio llamado "restore" y hagan lo siguiente:
    "photorec /log /d restore iphone-user.img"
    No es tan difícil utilizar el programilla, si quieren entender que son los comandos de arriba digiten: "photorec -h" :P

  • Listo! sería todo ;)


* No utilicen el "iTunnel" ya que oficialmente ellos recomiendan utilizar "iProxy". Probé el "iTunnel" y me dió problemas.

Links:
http://log.ijulien.com/post/196089712/iphone-recover-your-lost-photos-and-videos
http://log.ijulien.com/post/182804914/iphone-3gs-data-recovery

jueves, 8 de abril de 2010

Decompilar un .class con gedit

Listo, ya encontré una forma rápida de descompilar estos archivos desde mi Ubuntu, sin tener que webiar mucho.

A tomar nota!!

  1. Entrar al sitio de Tomas Varaneckas y descargar su última versión del JAD:


  2. * La "statically linked edition" les funcionará de una.

  3. Descompriman el archivo jad y dejenlo dentro de /opt/jad/

  4. Abran el gedit y entren a la sección de plugins

  5. gedit -> Edit -> Preferences -> Plugins


  6. Seleccionen el plugins llamado "External Tools"
    * Si no lo tienen (lo cual es extraño) tienen que instalar el "gedit-plugins"

  7. sudo apt-get install gedit-plugins

  8. Entren a "Configure Plugin" y comencemos con la configuración de un nuevo comando dándole clic en el boton "New".

  9. Colocale el nombre que quieras... yo lo referenciaré de ahora en adelante como "Decompile .class"

  10. En el campo "Edit:" ingresa lo siguiente:

  11. #!/bin/sh

    /opt/jad/jad -p "`zenity --file-selection 2> /dev/null`" 2> /dev/null

  12. En la opción "Output:" selecciona la opción "Create new document"

  13. Les tiene que quedar algo más o menos así:

  14. Ya puedes darle al botón "Close"

  15. Ejecutemos el plugin:

  16. Toots -> External Tools -> Decompile .class

  17. Buscar el archivo .class y listo!!

viernes, 19 de marzo de 2010

apt-get saliendo a través de un proxy


  1. Abrir el archivo /etc/apt/apt.conf

  2. Agregar las siguientes lineas:

  3. Acquire::http::Proxy "http://127.0.0.1:3128/";
    Acquire::ftp::Proxy "http://127.0.0.1:3128/";

  4. Cerrar el archivo.

  5. Agregar los siguientes exports al sistema:

  6. export HTTP_PROXY=127.0.0.1:3128
    export FTP_PROXY=127.0.0.1:3128

  7. Enjoy!




Actualización!!


Lo único que es necesario para que funcione el apt-get es:

export ftp_proxy=http://127.0.0.1:3128
export http_proxy=http://127.0.0.1:3128

La otra opción es para versiones antiguas...

viernes, 12 de febrero de 2010

jqPlot - Actualizar eje Y

Para redimensionar el eje Y en nuestro gráfico tras la eliminación de una linea, es necesario aplicar los siguientes parches y luego, en nuestro código, setear la variable 'show' en 'false' de nuestra serie (linea) y darle un 'replot' a nuestro gráfico con la opción '{resetAxes:['yaxis']}'


Ejemplo: chart.replot({resetAxes:['yaxis']})


************
* PARCHE 1 *
************


Archivo: jquery.jqplot.js
Funcion: $.jqplot.LinearAxisRenderer.prototype.init

Agregar un 'if (s.show)' en el 'for' interno para que solo se calcule el ymax con las lineas que sean visibles

(var: db = _dataBounds)
(_dataBounds: variable que tiene el valor maximo alcanzado por alguna linea)

---------

for (var j=0; j-> if (s.show) {
if (this.name == 'xaxis' || this.name == 'x2axis') {
if (d[j][0] < db.min || db.min == null) {
db.min = d[j][0];
}
if (d[j][0] > db.max || db.max == null) {
db.max = d[j][0];
}
}
else {
if (d[j][1] < db.min || db.min == null) {
db.min = d[j][1];
}
if (d[j][1] > db.max || db.max == null) {
db.max = d[j][1];
}
}
-> }
}

---------


************
* PARCHE 2 *
************


Para reiniciar la variable _dataBounds es necesario aplicar el siguiente parche:

Archivo: jquery.jqplot.js
Funcion: Axis.prototype.resetScale

Agregar un reset a la variable _dataBounds

---------

Axis.prototype.resetScale = function() {
this.min = null;
this.max = null;
-> this._dataBounds = {min: null, max: null};
this.numberTicks = null;
this.tickInterval = null;
};

---------

Para limpiar estas variables, se debe llamar al 'replot' de la siguiente manera:

chart.replot({resetAxes:['yaxis']});