JuanCri.com

RSS: RSS
Shared Items: RSS
Add to Google

viernes 31 de enero, 2014 a las 03:26

RutSharp es una implementación del RUT chileno en C# para Mono y .Net.

El proyecto intenta implementar en la forma más simple validaciones, generación, parseo y formateo de Rut :)

Espero que les sirva y háganme llegar sus comentarios por Twitter a @juancriolivares.

martes 27 de agosto, 2013 a las 02:02

Me ha llamado mucho la atención la polémica que surgió la semana pasada sobre el "uso de bots" en "HolaSoyGerman".

HolaSoyGerman es un canal de YouTube creado por Germán Garmendia. Germán es chileno y, actualmente, su canal es el sexto canal de YouTube con más suscriptores en el mundo. Sigo su canal hace más de un año y por eso me llamó mucho la atención este asunto.

La polémica fue lanzada el jueves 22 por el usuario Diego Mexivergas (sí, bueno, cada uno elige su nombre) en este video. Luego, Germán publicó su respuesta aquí y la contrarrespuesta aquí.

Los hechos

En el segundo 40 del video sobre redes sociales -subido el 22 de enero de 2012- aparece una captura de su pantalla donde se incluyen los siguientes sitios en sus favoritos:

En base a estos enlaces en sus favoritos, se acusa a germán de "usar bots" (aunque, por alguna razón, algunos le dicen "boots", que vendría siendo "bots" en Spanglish).

¿Qué son los bots?

Lamentablemente, la mayor parte de los acusadores ha fallado en los términos, describiendo mal a los "bots". ¿Bots? ¿YouLikeHits? ¿AddSocials? ¿Es lo mismo?.

¿Qué es un bot? Un bot es software. Eso es lo primero. Un bot es un software programado para interactuar con otros sistemas como si fuera un humano. Es decir, un bot simula el comportamiento humano. Un bot no es un sitio web. Un sitio web sí podría ser usado para configurar bots, pero no es un bot en sí mismo. 

Un bot simple para visitar YouTube (en C#) puede ser:

var wc = new System.Net.WebClient ();
wc.DownloadString ("http://youtube.com");

Ahora, si se quisiera aumentar las suscripciones de un canal, el bot tendría que realizar -a lo menos- las siguientes acciones:

  • Crear una cuenta en YouTube (probablemente signifique crear una cuenta en Google)
  • Suscribirse al canal deseado

Estas operaciones no son simples ya que, como bien menciona Germán, al menos una de ellas (la creación de una nueva cuenta) requiere que se complete un CAPTCHA (Prueba de Turing pública y automática para diferenciar máquinas y humanos) y, que significa en términos simples (según Wikipedia): "Se trata de una prueba desafío-respuesta utilizada en computación para determinar cuándo el usuario es o no humano" ... "Consiste en que el usuario introduzca correctamente un conjunto de caracteres que se muestran en una imagen distorsionada que aparece en pantalla. Se supone que una máquina no es capaz de comprender e introducir la secuencia de forma correcta por lo que solamente el humano podría hacerlo".

Para completar estas operaciones que incluyen un CAPTCHA, el bot podría usar una de las siguientes estrategias:

  • Contratar personas que pasen los CAPTCHAs: Se sabe que hay organizaciones que lo hacen buscando mano de obra barata; en China por ejemplo.
  • Desarrollar un algoritmo que sea capaz de pasar los CAPTCHA automáticamente: Técnicamente posible, pero requeriría una capacidad de cómputo ridícula -y aqui Germán también tiene mucha razón- probablemente, si alguien desarrollara un algoritmo para pasar el test de un CAPTCHA, no lo usaría para suscribirse a YouTube.
  • Usar cuentas ya existentes obteniendo de alguna forma las credenciales (robándolas, por ejemplo).

Éste es un tipo de bot. El otro lo explico más abajo:

¿Qué es YouLikeHits y AddSocials?

YouLikeHits y AddSocials son sitios de intercambio de seguidores, tweets, retweets, favoritos, vistas, likes, subscripciones, etc. para distintas plataformas sociales: Twitter, YouTube, Pinterest, etc.

Lo que sucede es lo siguiente: una persona se inscirbe en YouLikeHits o AddSocials, ingresa la cuenta o el video que quiere promocionar y luego puede ganar puntos reproduciendo, agregando como favorito o suscribiéndose a otros canales (en el caso de YouTube). Mientras más puntos se tiene, más visibilidad obtiene el canal propmocionado para otros usuarios. Por ejemplo, si tengo el doble de puntos, el video que estoy promocionando estará visible para muchos más usuarios de YouLikeHits o AddSocials y al final eso se traducirá en más reproducciones o suscriptores. Alguien, entonces, podría estar tentado a usar un bot, macro o automatizacion en su propio navegador, visitando más sitios en YouLikeHits para ganar más puntos y, finalmente, obtener más reproducciones y suscriptores en el canal propio. YouLikeHits, en su página principal, establece: "Tenemos una política estricta de NO Bot/Macro/Automatización". 

Esto último es una práctica condenada por el propio YouLikeHits y es difícil comprobarla. El sólo uso de YouLikeHits no es sinónimo del uso de bots.

Otra forma de obtener créditos en YouLikeHits y AddSocials es comprando créditos.

Como conlusiones sobre YouLikeHits y AddSocials:

  • No son bots
  • Su uso no es ilegal
  • Su uso no está en contra de las políticas de Twitter o YouTube (Hasta donde he leído. Por favor, si alguien puede decirme la cláusula violada por el uso de estos sitios, puede dejarlo en los comentarios).
  • Su uso no significa el uso de bots

Lo que yo creo:

  • Es probable que Germán haya utilizado estos sitios. Él dice que no usa bots, pero no habla explícitamente sobre estos sitios. 
  • Si los utilizó, no está infringiendo ninguna regla de YouTube
  • El uso de estos sitios no singifica en ningún caso que haya utilizado bots.
  • Mi impresión personal es que sí usó estos sitios en un inicio. Por supuesto, esto no significa que los 10 millones de seguidores sean falsos, pero sí podría haber obtenido más visibilidad usando estos sitios de intercambio.

Sólo me gustaría pedirles un favor: usen los términos correctamente. Un sitio web no es un bot y el uso de estos sitios no significa que se usen bots.

¿Qué opinan?

 

lunes 11 de marzo, 2013 a las 23:47

Hace algunos meses (o casi dos años), publiqué una forma de validar un número de RUT chileno utilizando programación funcional en C#. Poco tiempo después decubrí que había un error en la fórmula, pero nunca lo corregí en la web. 

Hoy, aprovechando que he rescrito la rutina para utilizar un número sin tener que convertirlo en string, decidí publicar una nueva versión. La forma más corta sería así:

var num = 12345678;
var dv = "0K987654321" [
	Enumerable
		.Range (0, (int) Math.Floor (Math.Log10 (num)) + 2)
		.Select (i =>
			((i % 6) + 2) *
			((num / (int) Math.Pow (10, i)) % 10))
		.Sum () % 11];

Donde num es el número del RUT y dv es el dígito verificador. En palabras simples, aquí recorremos los dígitos (0 hasta el floor(log10(num))+1), obtenemos cada uno (dividiendo por 10 a la i y luego sacando el módulo de 10), multiplicando por el multiplicador correspondiente y sumando al final. El rango inicial (Enumerable.Range) no necesita ser tan preciso ya que si lo extendemos más allá de lo necesario, agregaríamos ceros a la suma final. Si sabemos que el largo no es superior a X caracteres, podemos asumirlos y escribir Enumerable.Range(0, largoesperado).

Por favor, háganme saber si tienen alguna forma de simplificar aún más este cálculo :)

ACTUALIZACIÓN (18/02/2014): Publiqué un proyecto llamado RutSharp que incluye esta rutina optimizada.

domingo 21 de octubre, 2012 a las 14:08

Instalé Ubuntu 12.10 Quantal Quetzal. No soy fan de Unity, así es que instalé GNOME y otras aplicaciones preferidas :).

En primer lugar, al parecer existe un problema de dependencias en los drivers de NVidia. Instalé el paquete nvidia-current, pero no funciona inmediatamente. Al parecer, el problema es que no se instala el paquete linux-headers-generic automáticamente. Lo ideal es instalar este paquete primero y luego los drivers de NVidia.

He notado que la reproducción de videos de YouTube no es tan fluida en Chrome. Investigué un poco y el problema se solucionó al deshabilitar el plugin de flash incluído en Chrome y utilizando en su lugar el plugin instalado por flashplugin-installer.

Por último, Compiz también estaba funcionando mal. Culpé a los drivers de NVidia, pero finalmente pude solucionarlo deshabilitando Framebuffer object en el plugin OpenGL de Compiz. Lamentablemente, esto tiene algunos efectos secundarios como algunas texturas que no se redibujan correctamente. De todas formas, es bastante más fuido.

Con estas pequeñas modificaciones, todo anda sobre ruedas :)

miércoles 12 de septiembre, 2012 a las 23:42

Hace algún tiempo escribí sobre las aplicaciones que instalo cada vez que tengo que trabajar con un nuevo computador o instalación de Ubuntu.

Acá va una lista actualizada:

Escritorio:

  • Gnome: Ya no viene por defecto en Ubuntu
  • Google Chrome: Tampoco viene por defecto (Gratis. Su versión libre es chromium)
  • Synapse: Reemplazó a Gnome-Do
  • Deluge: Sigue siendo mi cliente torrent
  • VirtualBox: Sigue siendo mi preferido para virtualizar (uso la versión gratuita en vez de la versión libre)
  • Mplayer: Reproductor multimedia
  • VLC: Otro reproductor multimedia
  • XChat: No lo uso tanto como antes, pero sigue estando en la lista
  • Midnight Commander: Lo uso todavía para algunas tareas

Desarrollo:

  • Sublime Text: Mi editor de HTML / CSS / JavaScript / SQL preferido y es portable :) (no es libre, pero gratuito)
  • MonoDevelop: IDE para Mono
  • PostgreSQL: Indispensable para desarrollo (junto a pgadmin)

:D

jueves 12 de julio, 2012 a las 10:08

Hay situaciones cuando queremos limitar el ancho de banda utilizado por un proceso para que, por ejemplo, una descarga desde un servidor FTP no consuma todo el ancho de banda disponible y dificulte la navegación o al resto de los usuarios de la red.

Para Linux (y BSD y otros) existe trickle, que permite en forma simple limitar el ancho de banda. Basta con pasar el comando y los argumentos a ejecutar al final de los argumentos de trickle. Supongamos que queremos limitar el ancho de banda de bajada a 200KBps (nota que aquí son kilobytes y no kilobits). Ejecutamos entonces:

trickle -d 200 ncftpget ftp://servidor/ruta/archivo

Pueden leer más en el manual de trickle.

lunes 21 de mayo, 2012 a las 21:19

Hace algún tiempo comencé a subscribirme a canales de YouTube, pero utilizando mi cliente de Feeds/RSS favorito en vez del mismo YouTube, básicamente porque prefiero usar Google Reader para tener todas mis subscripciones en un solo lugar.

Lamentablemente, en algún momento YouTube desactivó el elemento link al RSS o Atom y, por lo tanto, no basta con agregar la URL del usuario en Google Reader. Existe una manera de obtener el RSS y es apuntando a una URL muy difícil de recordar. Para solucionarlo, creé un pequeño sitio que permite acceder directamente al feed: ytrssfeed.com

Entonces, para simplificar el asunto, basta con seguir los siguientes pasos:

  • Ingresa a Google Reader (o tu software / sitio lector de feeds favorito)
  • Cliquea "Subscribir"
  • Agrega la URL http://ytrssfeed.com/usuario (por ejemplo: http://ytrssfeed.com/juancriolivares)
  • ¡Listo! :)

Sé que el diseño del sitio es horrendo, pero hace lo que promete. Si tienes algún comentario, por favor contáctame por Twitter @juancriolivares.

lunes 20 de febrero, 2012 a las 18:01

Flash tiene un pésimo rendimiento en Linux, así es que creé este pequeño script para escuchar Radio Bio-Bio en Linux. Originalmente utilizaba mplayer, pero por alguna razón que desconozco, no funciona bien en Ubuntu Linux 11.10, así es que esta versión usa vlc (para consola):

URL=`wget http://www.digitalproserver.com/ip/biobio/ipstgo.php -O - 2>/dev/null|egrep -o "rtmp://[^\&]+"`;rtmpdump -r $URL/biobiostgo.stream|cvlc -

Los únicos requisitos son wget (incluído por lo general en todas las distribuciones), rtmpdump y VLC.

Esta versión reproduce la estación de Santiago, pero pequeñas modificaciones en la URL podría permitir escuchar las estaciones regionales.

ACTUALIZACIÓN: Lamentablemente, al parecer cambió la configuración del servidor RTMP. Por favor, si alguien tiene una solución, puede enviármela por Twitter. ¡Gracias!

ACTUALIZACIÓN 2 (15/11/2012): Es posible utilizar VLC para escuchar el stream para iPhone/iPad de esta forma:

	cvlc http://movilstream.digitalproserver.com/radio/biostgo/biobiostgo.stream/playlist.m3u8

ACTUALIZACIÖN 3 (11/07/2013): Cambiaron las URLs. Sería así:

	cvlc http://wow1.lax.digitalproserver.com/biobiosantiago/biobiosantiagolive/biobiosantiago.stream/playlist.m3u8
	cvlc http://wow1.lax.digitalproserver.com/biobiovalparaiso/biobiovalparaisolive/biobiovalparaiso.stream/playlist.m3u8
	cvlc http://wow1.lax.digitalproserver.com/biobioconcepcion/biobioconcepcionlive/biobioconcepcion.stream/playlist.m3u8
	cvlc http://wow1.lax.digitalproserver.com/biobiolosangeles/biobiolosangeleslive/biobiolosangeles.stream/playlist.m3u8
	cvlc http://wow1.lax.digitalproserver.com/biobiotemuco/biobiotemucolive/biobiotemuco.stream/playlist.m3u8
	cvlc http://wow1.lax.digitalproserver.com/biobiovaldivia/biobiovaldivialive/biobiovaldivia.stream/playlist.m3u8
	cvlc http://wow1.lax.digitalproserver.com/biobioosorno/biobioosornolive/biobioosorno.stream/playlist.m3u8
	cvlc http://wow1.lax.digitalproserver.com/biobiopuertomontt/biobiopuertomonttlive/biobiopuertomontt.stream/playlist.m3u8

 

domingo 19 de febrero, 2012 a las 16:51

Manos es un framework para desarrollar aplicaciones web de forma simple. La idea está basada en proyectos como node.js donde un mismo hilo es capaz de manejar varios requests al mismao tiempo utilizando callbacks para las operaciones que requeren esperar por una respuesta, típicamente operaciones de IO, bases de datos, etc. Pueden leer el manifiesto aquí.

Hoy estuve haciendo algunas pruebas y al no encontrar un how-to actualizado, decidí publicar aquí los pasos que utilicé para echar a andar una aplicación "Hola Mundo":

1.- Dependencias

Suponemos que el sistema tiene instalado mono y dmcs (lo probé con Mono 2.10.6.1). En mi caso, tengo distintas instalaciones de mono (por ejemplo, en /opt/mono-2.10.6.1). Para hacer esto, pueden obtener más información aquí.

Además, necesitamos tener instalado libev. En mi caso, corriendo Ubuntu 11.10, ejecuté:

sudo apt-get install libev4 libev-dev

2.- Descargar, compilar e instalar:

Se ejecutan las siguientes instrucciones:

# Descargar
git clone git://github.com/jacksonh/manos

# Compilar
cd manos
./autogen.sh --prefix=DIRECTORIOINSTALACION # Por ejemplo /opt/mono-2.10.6.1
make

# Instalar
make install

3.- Crear una aplicación

Para crear una aplicación llamada "test", ejecutamos:

manos --init test

Esto crea una directorio test con dos archivos dentro: StaticContentModule.cs y test.cs.

4.- Editar la aplicación

Editamos test.cs y dentro del constructor de test dejamos sólo está línea:

Get ("/", ctx => ctx.Response.End ("Hola mundo!"));

5.- Compilar la aplicación

Dentro del directorio test, ejecutamos:

dmcs -target:library -out:test.dll test.cs -r:DIRECTORIOINSTALACION/lib/manos/Manos.dll

Cabe destacar que, como en el paso anterior eliminamos la referencia a la clase StaticContentModule, no necesitamos incluirla en la compilación.

6.- Lanzamos la aplicación

Dentro del directorio test, ejecutamos:

manos --server

7.- Abrimos el navegador en http://localhost:8080/

Eso es todo. Espero que les sirva.

lunes 13 de febrero, 2012 a las 19:19

Ayer vi este post en el blog de Daniel Molina. Se presentaba el siguiente problema:

 

Hoy, tu desafío es crear un programa que tome una serie de números (5, 3, 15), y encuentre cómo estos números pueden ser sumados, restados, multiplicados, o dividido en distintas maneras para relacionarse entre ellos. Esta cadena de números debería resultar en 5 * 3 = 15, o 15 / 3 = 5, o 15 / 5 = 3. Cuando hayas terminado, prueba tus números con las siguientes cadenas:

  • 4, 2, 8
  • 6, 2, 12
  • 6, 2, 3
  • 9, 12, 108
  • 4, 16, 64

Para crédito extra, haz que el programa liste todas las combinaciones posibles. Para incluso más crédito extra, permite que el programa trabaje con cadenas de más de tres números. Por ejemplo, una entrada de (3, 5, 5, 3) debería ser 3 * 5 = 15, 15 / 5 = 3. Cuando hayas terminado, prueba con las siguientes cadenas.

  • 2, 4, 6, 3
  • 1, 1, 2, 3
  • 4, 4, 3, 4
  • 8, 4, 3, 6
  • 9, 3, 1, 7

Para la solución en C#, usé LINQ. Esto permite hacer la combinatoria de todos los números de cada cadena VS la lista de operaciones, comprobar que se cumpla la operación y hacer el formateo del texto que se imprimirá por pantalla.

El código es el siguiente:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
 
namespace testcombinatoria
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            string line;
            using (var reader = new StreamReader ("/tmp/numbers.txt"))
                while ((line = reader.ReadLine ()) != null)
                    Run (line);
        }
 
        private static void Run (string line)
        {
            var parts = line.Split (',');
            var operations = new Dictionary <string, Func <double, double, double>>
            {
                {"{0} + {1} = {2}", (x, y) => (x + y)},
                {"{0} - {1} = {2}", (x, y) => (x - y)},
                {"{0} * {1} = {2}", (x, y) => (x * y)},
                {"{0} / {1} = {2}", (x, y) => (x / y)}
            };
            var valuesIndexes = parts.Select ((x, index) => new { Index = index, Value = int.Parse (x.Trim ()) });
            var matches =
                from x in valuesIndexes
                from y in valuesIndexes
                from z in valuesIndexes
                from op in operations
                where x.Index != y.Index
                where x.Index != z.Index
                where y.Index != z.Index
                where op.Value (x.Value, y.Value) == z.Value
                select string.Format (op.Key, x.Value, y.Value, z.Value);
 
            foreach (string m in matches)
                Console.WriteLine (m);
        }
    }
}

Como pueden ver, en realidad las operaciones están duplicadas. Existe en el diccionario una llave que es el formato del texto que se imprimirá y la llave que es la misma operación pero como expresión lambda. Esto podría simplificarse si utilizara el compilador como servicio, aunque probablemente también sería menos óptimo.

El código también supone que el archivo con las cadenas está en /tmp/numbers.txt.

Las sugerencias siempre son bienvenidas.

UPDATE: Debido al redondeo de enteros, cambié el tipo de los parámetros de las expresiones lambda a double. Esto previene que se acepten operaciones como 9 / 7 = 1.

lunes 13 de febrero, 2012 a las 19:01

Como respuesta a este hilo en la lista Linux de la USM, envié el siguiente script para calcular el primer y último día hábil del mes y creí interesante compartirlo. Por supuesto, se puede opimizar aún -y no toma en cuenta los feriados-, pero puede ser un buen comienzo.

DOW = Day of week (día de la semana)
DOM = Day of month (día del mes)
LDOM = Last day of month (último día del mes)
FWDOM = First weekday of month (primer día hábil del mes)
LWDOM = Last weekday of month (último día hábil del mes)

#!/bin/bash
DOW=`date +%u`
DOM=`date +%d`
MONTH=`date +%m`
YEAR=`date +%Y`
LDOM=`cal $MONTH $YEAR | egrep -v '[A-Za-z]'|wc -w`
FWDOM=1
ADDFIRST=$(( ($DOM + 7 - $DOW) % 7 ))
if [ $ADDFIRST = 1 ]; then
    FWDOM=2
fi
if [ $ADDFIRST = 2 ]; then
    FWDOM=3
fi
LWDOM=$(( $LDOM ))
REMLAST=$(( (($LDOM - $ADDFIRST - 1) % 7) - 4 ))
if [ $REMLAST = 1 ]; then
LWDOM=$(( $LDOM - 1 ))
fi
if [ $REMLAST = 2 ]; then
    LWDOM=$(( $LDOM - 2 ))
fi
echo "DOW $DOW"
echo "DOM $DOM"
echo "LDOM $LDOM"
echo "FWDOM $FWDOM"
echo "LWDOM $LWDOM"

 

 
viernes 27 de enero, 2012 a las 00:19

Perdón si el título es malo, pero quiero mostrarles una manera elegante de poder enrutar las conexiones de cualquier dispositivo para que pueda conectarse a Internet como si estuviera en otro lugar, ya sea a Internet o una VPN.

Desktop

Mi problema original era poder utilizar Netflix como si estuviera en Estados Unidos, ya que el contenido es distinto. En OSX la solución es bastante simple: basta con conectarse por SSH a un servidor en Estados Unidos abriendo un proxy SOCKS (parámetro -Dpuerto) y luego configurar el navegador para que utilice ese proxy.

Por ejemplo, supongamos que tenemos un servidor llamado servidor (¡qué original!). Podemos ejecutar la siguiente línea en el terminal:

ssh usuario@servidor -D1080

Este comando se conectará a servidor y abrirá un puerto en el ambiente local (1080) el cual funciona como proxy SOCKS. Luego, en Firefox u otro navegador, podemos configurar el proxy SOCKS localhost puerto 1080.

Esta solución me funcionó bastante bien hasta que quise utilizar el dispositivo Apple TV. En este caso, como su conexión era por WiFi, y no tiene opción de configurar una VPN, necesité encontrar una solución más rebuscada.

Dispositivos

En el caso de dispositivos como Apple TV o similares, la única opción es enrutar el tráfico transparentemente, es decir, que el dispositivo no se de cuenta de que se está desviando el tráfico. Esto podría ser simple si su router estuviera conectado a una VPN, ya que podría enrutar ciertas conexiones (o todas) a través de esta VPN, sin embargo, el escenario cambia al usar SSH.

Tenía dos desafíos:

  1. Conectar el dispositivo a Internet a través de un PC
  2. Enrutar el tráfico a través de la conexión SSH

1.- Conectar el dispositivo a Internet a través de un PC

Supongamos que tenemos este esquema original:

Para poder controlar el tráfico entre el dispositivo e Internet, podemos intervenir el router o agregar un nuevo eslabón en la cadena. Opté por lo segundo y el diagrama queda así:

Para esto, en mi caso, utilicé un cable ethernet entre el Dispositivo y el PC. Para la conexión entre el PC y el Router ISP, utilicé Wi-Fi. Este escenario es muy común. Para permitir que el PC sea capaz de enrutar el tráfico, se utiliza NAT (network address translation). En Linux, se utiliza iptables para esta tarea.

NAT funciona modificando cada paquete. Cuando un paquete de datos va desde el Dispositivo a Internet, se modifica la dirección de origen reemplazándola por la dirección del PC. Cuando el paquete llega al PC desde Internet, se cambia la dirección de destino para que apunte al Dispositivo y luego se reenvía al dispositivo. De esta forma, el Router ISP sólo sabe que está recibiendo y enviando paquetes desde y hacia el PC. Todo el trabajo de conversión se lo lloeva el PC, en este caso.

Supongamos que el PC tiene las siguientes interfaces de red:

  • eth0 hacia el Router ISP
  • eth1 hacia el Dispositivo

Para configurar NAT, debemos ejecutar los siguientes comandos (como root):

# Habilitar el reenvío de paquetes en el sistema
echo 1 > /proc/sys/net/ipv4/ip_forward
# Enmascarar el tráfico hacia Internet
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# Permitir que los paquetes que vienen desde Internet y que pertenecen a una conexión ya establecida,
# puedan pasar hacia el dispositivo

iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
# Permitir el tráfico desde el Dispositivo hacia Internet
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

Una vez hecho esto, sólo basta configurar manualmente las interfaces tanto en el PC como en el dispositivo. También es posible habilitar DHCP en la interfaz eth1, lo que evitaría tener que configurar la dirección IP manualmente en el Dispositivo. Pueden Googlearlo :)
 
Un punto importante a  tener claro es que las direcciones de red en eth0 y eth1 deben ser distintas. Por ejemplo, si el router ISP nos entrega una dirección IP de la red 192.168.0.0/24 (la máscara 24 significa que la red es 192.168.0.X), la dirección en eth1 debe pertenecer a otra red (por ejemplo, 192.168.1.0/24).
 
En este punto, ya deberíamos poder utilizar el PC como puente para el Dispositivo, aunque todavía falta enrutar el tráfico hacia el servidor SSH.

2.- Enrutar el tráfico a través de la conexión SSH

Si bien, muchas veces he configurado un puente con NAT, el enrutamiento hacia un servidor SSH era lo novedoso para mí :) Para esto, la forma más simple que encontré es utilizando la conexión SOCKS que provee SSH; la misma que utilicé en el ambiente de escritorio, pero esta vez sin configurar el proxy en el Dispositivo, sino en el puente.
 
Para lograrlo, podemos crear una tercera interfaz de red en el PC, pero esta vez, esta interfaz es virtual y envía todo el tráfico hacia un servidor SOCKS. Este proceso es muy simple utilizando tun2socks, disponible aquí.
 
tun2socks se encarga de subir una interfaz virtual y enrutar todo el tráfico que recibe a través de un servidor SOCKS. Para poder utilizarlo, antes debemos tener nuestra conexión SSH abierta, de la misma forma que lo hice en el ambiente de escritorio:
 
ssh usuario@servidor -D1080
 
Ahora, podemos ejecutar tun2socks:
 
./badvpn-tun2socks --tundev tun0 \
        --netif-ipaddr 192.168.100.2 \
        --netif-netmask 255.255.255.0 \
        --socks-server-addr 127.0.0.1:1080
 
Los parámetros utilizados aquí son:
 
  • --netif-ipaddr 192.168.100.2: Configura la dirección IP del gateway virtual que tendremos en la interfaz. Es decir, esta no es la dirección que tendrá nuestro PC en esta interfaz virtual, sino el gateway o router [también virtual] que deberemos utilizar en esa interfaz.
  • --netif-netmask 255.255.255.0: La máscara de la interfaz. Generalmente 255.255.255.0 (24 bits) está bien.
  • --socks-server-addr 127.0.0.1:1080: Dirección y puerto donde está corriendo el servidor SOCKS. Ya que utilizamos -D1080 en el comando SSH, ése es el puerto que definimos aquí.

Una vez ejecutado este comando, ya se habrá creado una nueva Interfaz, sin embargo, aún tenemos que configurar la interfaz en el PC y las rutas para que el tráfico a ciertas -o todas- las direcciones vaya a través de esta interfaz virtual.

Para configurar la interfaz en el PC local, debemos ejecutar:

ifconfig tun0 192.168.100.1 netmask 255.255.255.0

Pueden notar que la dirección local en la interfaz virtual (192.168.100.1) está en la misma red que la dirección del router virtual (192.168.100.2). Esto es imprescindible.

Éste debería ser el estado actual:

En este paso debemos tener mucho cuidado. Ya que esta interfaz virtual depende de nuestra conexión SSH, debemos asegurarnos de que el tráfico hacia el servidor SSH siga saliendo directamente por el Router ISP. También debemos tener claro que SOCKS sólo soporta conexiones TCP (y no UDP, ICMP o cualquier otro tipo). Esto previene que usemos la configuración actual para enrutar las consultas al DNS, ya que el protocolo DNS utiliza principalmente UDP. A fin de cuentas, necesitamos mantener tanto el tráfico al servidor SSH como al DNS a través del router ISP. Para esto, ejecutamos los siguientes comandos:

# Agregamos el servidor SSH (en este ejemplo 1.2.3.4)
# hacia 192.168.0.1 suponiendo que es la dirección del Router ISP.
# Utilizamos la métrica 5 para que tenga prioridad sobre otras reglas
route add 1.2.3.4 gw 192.168.0.1 metric 5
# Agregamos el servidor DNS (en este caso, un servidor de Google)
route add 8.8.8.8 gw 192.168.0.1 metric 5

En este momento, ya podemos eliminar la ruta por defecto actual, que utiliza el Router ISP, y cambiarla por una ruta hacia nuestro router virtual en la interfaz virtual tun0:

route del default
route add default gw 192.168.100.2 metric 6
 
Este comando toma todo el tráfico (excepto hacia nuestro servidor SSH, hacia el DNS o hacia redes locales) y los envía a través del router virtual. Para comprobar que el tráfico esté saliendo por la interfaz virtual, podemos visitar http://www.whatismyip.com/. La dirección en pantalla debería ser la dirección del servidor SSH.
 
El último paso consiste en habilitar las reglas de iptables que permitan utilizar NAT, pero ahora hacia la interfaz virtual:
 
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
iptables -A FORWARD -i tun0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o tun0 -j ACCEPT
 
¡Ya está! Ya podemos utilizar el Dispositivo como si estuviéramos utilizando el servidor SSH :) Suficiente, me voy a ver una película. ¡Suerte!
 
Por favor, avísenme si hay dudas o errores :) @juancriolivares
lunes 9 de enero, 2012 a las 01:01

NOTA: Recomiendo leer antes la primera parte.

Estuve pensando bastante en esto e, inspirado en el bit de paridad de los RAID, hice lo mismo con operaciones XOR. Por ejemplo, sin variable auxiliar en varias expresiones:

a = a ^ b;
b = a ^ b;
a = a ^ b;

Y, ahora, sin variable auxiliar en una sola expresión:

a = (b ^= (a ^= b)) ^ a;

Una de las características interesantes de la operación XOR es que es conmutativa, lo que permite acortar la expresión.

Se reciben sugerencias :)

martes 3 de enero, 2012 a las 11:18

Éste es probablemente uno de los ejercicios más comunes en un curso de introducción a la programación. Tenemos dos variables y necesitamos intercambiar sus valores. Hay dos approaches que conocía:

1.- Variable auxiliar

var a = 1; // Primera variable
var b = 2; // Segunda variable
var c = 3; // Variable auxiliar
c = a;
a = b;
b = c;

2.- Sin variable auxiliar

var a = 1; // Primera variable
var b = 2; // Segunda variable
a = a + b;
b = a - b;
a = a - b;

Hoy estaba pensando en cómo hacer esta operación en una sola expresión y llegué a esto:

var a = 1; // Primera variable
var b = 2; // Segunda variable
a = ((b = (a = a + b) - b) - a) * -1;

¿Habrá alguna otra más simple?

ACTUALIZACIÓN: Hasta ahora, logré simplificarla de esta forma:

a = -((b = (a += b) - b) - a);

ACTUALIZACIÓN 2: Pueden leer la segunda parte aquí.

domingo 18 de diciembre, 2011 a las 23:27

Mi obsesión por el correcto uso del lenguaje -o, a lo menos, el conocimiento de cómo usarlo correctamente- me ha llevado a crear un nuevo blog donde estoy publicando algunos de los errores que escucho más a menudo. Los invito a suscribirse :)

http://vosnolodigai.blogspot.com

domingo 14 de agosto, 2011 a las 12:09

Para nadie es sorpresa que yo sea fan de .Net como plataforma. C#, su lenguaje principal, es una elegante evolución de Java y C++, mientras que su máquina virtual que incluye generics de verdad desde hace 6 años, value types, enums y un sin fin de otros azúcares, es muy atractiva. Nada de esto compensa la frustración que he sentido durante la última semana gracias a los requerimientos de un querido cliente. Acá una lista de ellas:

  • Visual studio depende fuertemente de IIS para lanzar sitios web, debiendo cambiar la configuración de la aplicación desarrollada para poder utilizar alternativas como un servidor liviano de desarrollo. Además, si llegamos a tener algún problema de configuración del debugging, Visual Studio no es capaz siquiera de entregar el detalle del error. En vez de esto, la web de MSDN publica una lista con 4 recetas distintas de cómo solucionar el problema.
  • A pesar de que ASP.NET MVC 3 es software libre (bajo licencia MS-PL), depende de componentes cerrados que no son parte del runtime estándar .Net, lo que en la práctica se traduce en una plataforma casi inutilizable en entornos de software libre (como Linux + Mono + MonoDevelop).
  • Bibliotecas como Unity y otros componentes liberados por el grupo de trabajo pattern and practices no tienen descarga directa de bibliotecas, sino que se amarran a la vieja y mala práctica de tener instaladores para componentes que deberían ser simples bibliotecas. Mi cariño por el stack Spring.Net/log4net/NUnit se reafirma.

¿Alguna otra queja?

lunes 20 de junio, 2011 a las 19:47

¿Te apasiona la programación? ¿Te gusta PHP? ¡Postula ahora! info@cxsoftware.com.

lunes 20 de junio, 2011 a las 19:13

Misión: Comprar Visual Studio

  • Voy al sitio de microsoft, intento comprar en línea. Al finalizar, la compra parece estar restringida a Estados Unidos.
  • Intento ir a microsoft.cl, pero en contacto aparecen números telefónicos de España.
  • Busco en la guía telefónica y llamo al número 800, pero éste parece ser sólo de activaciones

Y ahora, ¿quién podrá defenderme?

domingo 3 de abril, 2011 a las 16:20

Hoy leí este artículo y decidí hacer una versión en C#. Éste fue el resultado:

var valido = 
	("0123456789K" [11 - (rut.ToCharArray ().Take (rut.Length - 2).Reverse ()
	.Select ((a, b) => ((b % 6) + 2) * int.Parse (a.ToString ())).Sum () % 11)]) == rut [rut.Length - 1];

Tal vez no es tan eficiente, pero parece funcionar. Acepto comentarios :)

ACTUALIZACIÓN (12/03/2013): Publiqué la segunda parte, incluída una corrección, aquí.

ACTUALIZACIÓN (18/02/2014): Publiqué un proyecto llamado RutSharp que incluye esta rutina optimizada.

martes 7 de diciembre, 2010 a las 22:49

El webshow Hak5 ha iniciado un ciclo de programas sobre telefonía y telecomunicaciones. Hasta ahora hay dos episodios:

Como bonus track, pueden seguir a otros shows interesantes de Revision3 como HD Nation, Scam School o Scientific Tuesdays.

Creative Commons License
Blog JuanCri.com por Juan Cristóbal Olivares licenciado bajo la Creative Commons Attribution 2.0 Chile License.
Mono PostgreSQL

JuanCri.com