jueves, 31 de enero de 2013

micro consejos para programadores - parte3

ALERTA: Publicación numero 200.
Hoy 31 de Enero he llegado a las 200 publicaciones. Aquí os dejo los consejos de hoy:

  1. Sí referencias muchas veces lo mismo añádelo a una variable idUser=user.getId() así sólo cargas/buscas el dato una sola vez.
  2. Sí puedes prescindir de las { } es mucho mejor.
  3. Es mejor tener imagen con el tamaño exacto que redimensionarla con width y height.
Un saludo a todos los leectores y gracias por las más de 45MIL visitas.

miércoles, 30 de enero de 2013

micro consejos para programadores - parte2

Los micro consejos de hoy son:
  1. En JS es mejor hacer for(i=100;i--;) cuando "i" sea 0 el bucle finaliza
  2. En SQL es mejor poner cada uno de los campos y evitar usar *
  3. Es mejor un ISEMPTY que un COUNT

martes, 29 de enero de 2013

micro consejos para programadores - parte1

Buenas hoy inauguro lo que he llamado "micro consejos para programadores" en esta micro sección publicare cada vez 3 consejos sobre el mundo de la programación, muchos los he ido aprendiendo por la breve experiencia que tengo en el tema y muchos otros gracias a Internet o compañeros. Espero que con el tiempo esta sección crezca siendo de una pequeña guía de ayuda.
Para comenzar con algo sencillo estos son mis tres micro consejos de hoy:
  1. Más óptimo hacer 3 IF que 3 CASE
  2. Y es aún mejor hacer un ARRAY con 10 o más posibilidades, que 10 o más CASE
  3. Para los más extremistas es muchísimo mejor hacer un ARRAY[100] que declarar 100 variables

hasta la proxima

lunes, 28 de enero de 2013

refrescar la memoria en SAP

Si se nos presenta el problema en el que los datos con los que estamos trabajando no se refrescan o no terminan por cargarse en la base de datos. Una solución breve y rápida es ejecutar lo siguiente después de nuestra sentencia "problemática".
 CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            WAIT = 'X'.
Esto refresca los datos en memoria almacenándolos correctamente, en parte "mejora el rendimiento".

viernes, 25 de enero de 2013

Hilos en SAP

NO EXISTEN!!
ya está, ya lo he dicho, necesitaba publicarlo.
Si quieres hacer "algo parecido" usa JOBS (y una mierda parecido)

jueves, 24 de enero de 2013

Puertos extraños? descubre quien lo está usando

Comando sencillo pero lo publico porque seguro que más a delante lo necesitaré y no sabre donde buscarlo ;)
sudo netstat -plutn
# Para simplificarlo ejecutamos
sudo netstat -plutn | grep 'LISTEN'
Si tu sistema está en otro idioma tendrás que sustituir 'LISTEN' por el que le corresponda por ejemplo 'ESCUCHAR'.

miércoles, 23 de enero de 2013

ProxyChains aplicaciones a través de un proxy

Hace bien poco descubrí ProxyChains. Una maravilla para usar tus programas favoritos de forma anónima.
proxychains nmap
proxychains firefox
proxychains ping http://www.google.com
#... ETC
Sólo está disponible para Linux y su función es hacer una cadena de proxy`s la cual nos permita usar nuestro navegador o aplicación sin dar a conocer nuestra IP publica real. La instalación y configuración es muy sencilla. Para los que usamos Debian/Ubuntu ejecutamos
sudo apt-get install proxychains 
Y configuramos nuestros proxy`s de la siguiente forma
sudo nano /etc/proxychains.conf
Al final de ese mismo fichero donde pone [ProxyList] hay añadimos nuestra cadena de proxy`s. En el mismo fichero hay ejemplos disponibles para que sepamos como añadirlos correctamente. Una vez realizados los cambios está todo listo para ser usado.
Hace poco he publicado Generar lista proxys, nos vendrá muy bien para usarlo con este comando

Generar lista proxys

A muchos les gusta navegar seguros/anónimos por la red y claro eso se consigue conectándose a un proxy. Para hacer la tarea menos engorrosa y de la forma más limpia sin tener que andar navegando por la red en busca de direcciones IP de proxys. Podremos usar este script que nos genera un fichero TXT con el listado de los proxys de la página samir.ru
#!/usr/bin/env python
import re, sys, urllib2, random

fichero = 'samair-proxy.txt'
site = "http://www.samair.ru/proxy/socks"

regex1 = """<script src="/js/m.js" type="text/javascript"></script><script type="text/javascript">(.*)</script></head>"""
regex2 = """([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})<script type="text/javascript">document.write\(":"([\+a-z]+)"""

fich = open(fichero,'a')

for i in range(1,11):
    if i<10:
        cad = "0" + str(i)
    else:
        cad = str(i)
    url = site + cad + ".htm"
    try:
        print ("Obteniendo proxys de la direccion %s" %(url))
        pet = urllib2.urlopen(url)
        contenido = pet.read()
        match = re.search(regex1,contenido)
        claves = match.group(1)
        valores = claves.split(";")
        diccionario = {}
        for v in valores:
            if len(v.split("="))>1:
                diccionario[v.split("=")[0]] = v.split("=")[1]
        sustituir = re.findall(regex2,contenido)
        for s in sustituir:
            IP = s[0]
            rango = s[1].split('+')
            Puerto = ''
            for p in rango:
                if p:
                    Puerto = Puerto + diccionario[p]
            proxy = IP + ":"+ Puerto
            fich.write(proxy + "\n")
    except urllib2.URLError as e:
        print ("Error Obteniendo Proxys: %s" %(e))

automatizar tareas del router con Python

Hoy en día es muy común que cada uno en su casa tenga su router wifi. Por eso vamos a automatizar tareas como reiniciar el router para refrescar nuestra IP o bloquear y desbloquear direcciones MAC. Esta segunda tarea más adelante le daré utilizad desarrollando un script que escane nuestra red LAN y bloque a los intrusos que se encuentren en ella.
#! /usr/bin/python

import getpass
import sys
import telnetlib

HOST = "IP DEL ROUTER"
user = "USUARIO DEL ROUTER"
password = "CONTRASEÑA DEL ROUTER"
tn = telnetlib.Telnet(HOST)

tn.read_until("Login: ")
tn.write(user + "\n")
if password:
    tn.read_until("Password: ")
    tn.write(password + "\n")

tn.write("save_and_reboot\n")
tn.write("exit\n")

print tn.read_all()

El primer script simplemente se conecta a nuestro router vía telnet y ejecuta save_and_reboot. Sencillo script que reinicia nuestro router para cuanto necesitemos refrescar nuestra IP o porque el servicio técnico le pide que lo reinicie ;)
./rebootWifi.py

#! /usr/bin/python

import getpass
import sys
import telnetlib

if len(sys.argv) < 2:
        print "Example: macfilter.py 00:00:00:00:00:00 [option]"
        print "--add (default option)"
        print "--remove"
        sys.exit(0)

HOST = "IP DEL ROUTER"
user = "USUARIO DEL ROUTER"
password = "CONTRASEÑA DEL ROUTER"

MAC = sys.argv[1]
ORDER = "--add"
if len(sys.argv) > 2:
        if sys.argv[2] == '--remove':
                ORDER = '--remove'

tn = telnetlib.Telnet(HOST)

tn.read_until("Login: ")
tn.write(user + "\n")
if password:
    tn.read_until("Password: ")
    tn.write(password + "\n")

tn.write("wlan macfilter --mode deny\n")
if len(ORDER)>2:
        tn.write("wlan macfilter " + ORDER + " " + MAC.lower() +"\n")
else:
        tn.write("wlan macfilter --add " + MAC.lower() +"\n")
        print "wlan macfilter --add " + MAC.lower() +"\n"
tn.write("exit\n")

print tn.read_all()
Este segundo script es un poquito más elaborado. Si le pasamos una dirección MAC este se conecta al router y la añade a las MAC denegadas. En cambio si le pasamos una MAC y --remove este la elimina de la lista de bloqueados.
#Ejemplo para bloquear una dirección MAC
./macFilter.py 11:22:33:44:55:66
#Ejemplo para desbloquear la misma dirección MAC
./macFilter.py 11:22:33:44:55:66 --remove
Una cosa que añadir. Dependiendo del router que tengas los comandos a ejecutar serán unos u otros. Estos script no son genéricos para todos los router. De todas formas espero haberos adelantado el trabajo.

martes, 22 de enero de 2013

Comprobar si mi IP a cambiado y alertar vía email

En 3 sencillos pasos crearemos una tarea que compruebe si nuestra IP ha cambiado y de ser así nos enviará un email.

Paso uno copiar este script escrito en Python y modificar los siguientes parámetros escritos en MAYÚSCULA. El servidor SMTP en caso de que el servidor necesite autentificación introduccir el EMAIL y CONTRASEÑA  y  por último modificamos el EMAIL receptor que será donde recibiremos el correo. En mi caso he llamado al script changeIP.py
#!/usr/bin/env python
import os
from datetime import *
import smtplib
from email.mime.text import MIMEText

def mail(mensaje):
        mailServer = smtplib.SMTP('SMTP.SERVIDOR',25)
        mailServer.ehlo()
        mailServer.starttls()
        mailServer.ehlo()
        mailServer.login("MI@EMAIL.ES","CONTRASEÑAAA")
        mensaje = MIMEText(str(mensaje))
        mensaje['From']="MI@EMAIL.ES"
        mensaje['To']="MI@EMAIL.RECEPTOR"
        mensaje['Subject']="Aviso IP Wifi cambiada"
        mailServer.sendmail("MI@EMAIL.ES","MI@EMAIL.RECEPTOR",mensaje.as_string())
        mailServer.close()

def leer():
        contenido=''
        f = open("oldIP.tmp", "r")
        while True:
                linea = f.readline()
                contenido = contenido + ' ' + linea
                if not linea: break
        f.close()
        return contenido

newip=''
oldip=leer()
while len(oldip) < 4:
        oldip=leer()
while len(newip) < 4:
        os.system("curl ifconfig.me > oldIP.tmp")
        newip=leer()
print "IP vieja: "+oldip
if oldip != newip:
        print "IP nueva: "+newip
        print "enviar mail"
        mail("La IP a cambiado a "+newip+" La antigua IP era "+oldip)
else:
        print "no ha cambiado"
Si habéis investigado el script comprueba siempre el fichero oldIP.tmp ese fichero contendrá nuestra dirección IP vieja y la comparará con la actual para comprobar que ha cambiado. En el segundo paso crearemos nuestro fichero oldIP.tmp con una IP falsa para que el script salte y comprobemos que funciona. Ejecutamos los siguiente
sudo su
cd
echo 0.0.0.0 > oldIP.tmp
En el tercer y último paso crearemos nuestra tarea CRON para que se ejecute automáticamente.
sudo crontab -e
y escribimos al final la siguiente linea
0,15,35,45 * * * * changeIP.py
Guardamos los cambios y listo. Cada 15 minutos se comprobará si nuestra dirección IP a sido modificada.

traductor de google en tu consola de linux

Crear un traductor en la consola de linux, usando el traductor de Google
#!/bin/bash
# access translate.google.com from terminal

help='translate  [[] ]
if target missing, use DEFAULT_TARGET_LANG
if source missing, use auto'

# adjust to taste
DEFAULT_TARGET_LANG=en

if [[ $1 = -h || $1 = --help ]]
then
    echo "$help"
    exit
fi

if [[ $3 ]]; then
    source="$2"
    target="$3"
elif [[ $2 ]]; then
    source=auto
    target="$2"
else
    source=auto
    target="$DEFAULT_TARGET_LANG"
fi

result=$(curl -s -i --user-agent "" -d "sl=$source" -d "tl=$target" --data-urlencode "text=$1" http://translate.google.com)
encoding=$(awk '/Content-Type: .* charset=/ {sub(/^.*charset=["'\'']?/,""); sub(/[ "'\''].*$/,""); print}' <<<"$result")
#iconv -f $encoding <<<"$result" | awk 'BEGIN {RS="
]* id=["'\'']?result_box["'\'']?/ {sub(/^.*id=["'\'']?result_box["'\'']?(>| [^>]*>)([ \n\t]*<[^>]*>)*/,"");sub(/<.*$/,"");print}' | html2text -utf8 iconv -f $encoding <<<"$result" | awk 'BEGIN {RS="
"};/]* id=["'\'']?result_box["'\'']?/' | html2text -utf8 exit
La librería que uso para resaltar el código generaba muchos errores por eso he decidido ponerlo tal cual, espero que os funcione sin problema. Para usarlo ejecutamos
./traductor.sh Hola eu
o el clasico
./traductor.sh "Hola mundo" en

lunes, 21 de enero de 2013

Crear diccionarios de palabras por idiomas

Cómo crear un diccionario de palabras con ASPELL en texto plano:
#! /usr/bin/python
import os, sys

if len(sys.argv)<2:
        print "crear-dict.py idioma"
        sys.exit(0)

first=True
for LANG in sys.argv:
        if first:
                first=False
                continue
        print "Generando dicconario "+LANG
        os.system(" aspell --lang="+LANG+" dump master | aspell --lang="+LANG+" expand | tr ' ' '\n' >> dict.txt")

Su uso es muy sencillo. Si queremos crear un diccionario en euskera
./crear-dict.py eu
Que queremos crear uno de Castellano y Euskera en el mismo fichero ejecutamos:
./crear-dict.py es eu

Ejemplos del algoritmo QuickSort

Hace tiempo que termine un libro de criptografía y mostraba diferentes algoritmos de cifrado. QuickSort era uno de ellos y por su enorme "fama" voy a dedicarle el siguiente post. A continuación mostraré un ejemplo del algoritmo en diferentes lenguajes de programación que conozco. La mayoría del parte del código está sacado de la siguiente web rosettacode.org.

Comenzaré haciendo una pequeña versión del algoritmo "raíz" y como se mejora. (En el siguiente ejemplo escrito en Python creo que se entenderá mejor.)

Python con pivote "fijo"

def qsort(lista):
    if lista == []:
        return []
    else:
        pivote = lista[0]
        izq = qsort([x for x in lista[1:] if x < pivote])
        dech = qsort([x for x in lista[1:] if x >= pivote])
        return izq + [pivote] + dech

Python con pivote aleatorio.

from random import randrange
def qsort(lista):
    def qsort(lista):
        if lista == []:
            return []
        else:
            pivote = lista.pop(randrange(len(lista)))
            izq = qsort([l for l in lista if l < pivote])
            dech = qsort([l for l in lista if l >= pivote])
            return izq + [pivote] + dech
     return qsort(lista[:])

Los algoritmos hacen lo mismo ordenar una lista de elementos. La diferencia entre el algoritmo "sin pivote" y el que lo tiene implementado es simple. La pila se desborda en aproximadamente a los 1000 elementos ordenados. Sin embargo, mediante la de un pivote asignado al azar se evita el desbordamiento de pila, y logra un buen rendimiento. Es decir para pocos elementos usamos la primera ya que usar el segundo método ralentiza el proceso al intentar asignar el numero aleatorio. Pero para el resto de casos mejor la segunda opción.

Y partiendo de este breve ejemplo y explicación os dejo un ejemplo en diferentes lenguajes listos para su uso. Espero que al transcribir el código no se me haya colado nada que pueda dar error en el código, si encontráis erratas avisarme para corregirlas.

Quicksort en PHP

<?php
     function qsort($array,$inicio,$fin){
         $mitad=$array[floor(($inicio+$fin)/2)];
         $i=$inicio;
         $j=$fin;
         do{
             while ($array[$i]<$mitad) $i++;
             while ($array[$j]>$mitad) $j--;
             if ($i<=$j){
             $temp=$array[$i]; $array[$i]=$array[$j]; $array[$j]=$temp;
                 $i++; $j--;
             }
         }while ($i<=$j);
        if ($fin<$j) $this->qsort($array, $inicio, $j);
        if ($i<$fin) $this->qsort($array, $i, $fin);
  }

// lo usamos de la siguiente manera
$list=array(5,4,3,2,1,6,8,9);
$this->qsort($list,0,count($list)-1);
//mostramos el listado ordenado
for($i=0;$i<count($list);i++) echo list[$i]." - ";
?>

Quicksort en JavaScript

function particion(array, inicio, fin, pivote){
 var piv=array[pivote];
 array.swap(pivote, fin-1);
 var aux=inicio;
 var ix;
 for(ix=inicio; ix<fin-1; ++ix){
  if(array[ix]<=piv) {
   array.swap(aux, ix);
   ++aux;
  }
 }
 array.swap(fin-1, aux);
return aux;}

function qsort(array, inicio, fin){
 if(fin-1>inicio){
  var pivote=inicio+Math.floor(Math.random()*(fin-inicio));
  pivote=particion(array, inicio, fin, pivote);
  qsort(array, inicio, pivote);
  qsort(array, pivote+1, fin);
 }
}


Ejemplo con Ruby

def qsort(lista, p, r)
    if p < r then
        q = particion(lista, p, r)
        qsort(lista, p, q-1)
        qsort(lista, q+1, r)
    end
end

def particion(lista, p, r)
    pivote = lista[r]
    i = p - 1
    p.upto(r-1) do |j|
        if lista[j] <= pivote
            i = i+1
            lista[i], lista[j] = lista[j],lista[i]
        end        
    end
    lista[i+1],lista[r] = lista[r],lista[i+1]
    return i + 1
end

# forma de usarlo
a = [9,4,10,12,3,5,10,3,2,25,6,21,33,23,19,13,38,26,12,3]
qsort(a, 0, a.length-1)
puts a


Quicksort con Java

import static org.junit.Assert.assertArrayEquals;
import org.junit.Test;

public class Qsort {
    static <T extends Comparable<? super T>> void qsort(T[] array){
        qsort(array, 0, array.length - 1);
    }

    static <T extends Comparable<? super T>> void qsort(T[] array, int izq0, int dech0){
        int izq = izq0;
        int dech = decht0 + 1;
        T pivote, aux;
        pivote = array[izq0];
        do {
            do izq++; while (izq <= dech0 && array[izq].compareTo(pivote) < 0);
            do dech--; while (array[dech].compareTo(pivote) > 0);
            if (izq < dech) {
                aux = array[izq];
                array[izq] = array[dech];
                array[dech] = aux;
            }
    }while (izq <= dech);
    aux = array[izq0];
    array[izq0] = array[dech];
    array[dech] = aux;
    if (izq0 < dech) qsort(array, izq0, dech);
    if (izq < dech0) qsort(array, izq, dech0);
}

    String[] array = {"Batman", "Spiderman", "Anthony", "Zoolander"};
    qsort(array);
    String[] correcto = {"Anthony", "Batman", "Spiderman", "Zoolander"};
    assertArrayEquals(correcto, array);

}

Bueno creo que con estos ejemplos ya hay suficiente en la página de rosettacode.org Hay muchísimos más ejemplos.

Linux comando CONVERT


Pasar un PNG a JPG
convert *.png *.jpg

Pasar un PDF a JPG
convert fichero.pdf imagenHojasPdf.jpg

Pasar solo ciertas páginas del PDF a JPG
convert fichero.pdf[0-6] imagenHojasPdf.jpg