Ivan++

diciembre 27th, 2011 — 1:37am

ivan.age = 33

3 comentarios » | personal

A motion-jpeg stream with Ruby and Sinatra

noviembre 30th, 2011 — 12:37pm

I’ve been trying to set up a Motion-JPEG streaming with ruby, for a webcam which uploads a picture per second to a server. I want new images to be served via streaming instead of making the browser call them every second via a javascript call.

I found many different solutions, some of them including EventMachine, which now is not necessary thanks to the new Sinatra 1.3 streaming feature.
The tricky part was related to the headers, the boundary, and the need to send the content type before each image.

For the test I first created a directory and stored some pictures inside

mkdir /tmp/images
# place some jpg pictures here

And the code. My little app looks like this:

# motion_stream.rb
require 'sinatra'
set :server, :thin

get '/' do |dir|
  boundary      = 'some_shit'
  source_dir    = '/tmp/images'

  headers \
    "Cache-Control" => "no-cache, private",
    "Pragma"        => "no-cache",
    "Content-type"  => "multipart/x-mixed-replace; boundary=#{boundary}"

  stream(:keep_open) do |out|
    while true
      file        = random_file(source_dir) # see also latest_file() below
      content     = File.open("#{source_dir}/#{file}", 'rb') { |f| f.read }

      out << "Content-type: image/jpeg\n\n"
      out << content
      out << "\n\n--#{boundary}\n\n"

      sleep 1
    end
  end
end

## get a random image from a directory
##
def random_file(dir)
  files = Dir.entries(dir).collect { |file| file }
  files -= ['.', '..']
  files[rand(files.size)]
end

## ... or get the newest image
## In this case I'm not taking the latest file
## uploaded by the camera, but the previous one.
## This is to avoid grabbing a currently uploading
## file, which may be shown as corrupt or incomplete.
##
def latest_file(dir)
  files = Dir.entries(dir).collect { |file| file }.sort { |file2,file1| File.mtime(dir+file1) <=> File.mtime(dir+file2) }
  files -= ['.', '..']
  files[1]
end

Then simply create a Gemfile including Sinatra and Thin, as WebRick is not evented and does not support this kind of stream.

# Gemfile
source :rubygems

gem 'sinatra'
gem 'thin'

And that’s all. Run the app and you’re done.

ruby motion_stream.rb

Just visit http://localhost:4567/ with your browser :-)

2 comentarios » | Programación, Ruby

El banco sabadell y el comercio electrónico INseguro

agosto 27th, 2011 — 8:00pm

Ya expliqué en éste otro post una de las mayores cagadas de seguridad en lo que refiere a comercio electrónico.

Seguí quejándome, me dijeron que tenía que escribirlo en una página de Facebook y así lo hice. Pero nadie me contestó ni volvieron a contactar conmigo, así que entiendo que le dieron importancia 0.

Todo este tiempo he estado comprando online con mi tarjeta, y el bug sigue estando ahí.
Hoy al renovar un servidor he vuelto a pagar con tarjeta y me he vuelto a topar con el marrón. Y he vuelto a hacer la pataleta en Twitter (click para ampliar):

A lo que me han respondido esto:

WHAT THE FUCK???

Será una broma no?
Al personal del Banco Sabadell se le debería caer la cara de vergüenza (algo que por lo visto no tienen). Lo que está en juego es el dinero de sus clientes. Las medidas de seguridad online en los bancos deberían ser EXTREMAS. En el Banco Sabadell no sólamente no lo son, sino que además llevan meses haciendo caso omiso de un fallo grave que yo mismo he reportado reiteradas veces.

Lo próximo al volver de vacaciones será poner una queja formal en mi oficina y cambiarme de banco. Y la próxima vez que denuncie esto será a la policía.

Comentar » | Seguridad

Facebook apps, auto-resize and scroll to top

julio 4th, 2011 — 9:47pm

Have you ever written a Facebook application?
One of the most common problems for iframe apps is making canvas auto-resize. It’s solved this way:

    <div id="fb-root"></div>
    <script>
      window.fbAsyncInit = function() {
        FB.init({appId: 'YOUR_APP_ID_HERE', status: true, cookie: true, xfbml: true});
        FB.Canvas.setAutoResize();
      };

      (function() {
        var e = document.createElement('script'); e.async = true;
        e.src = document.location.protocol +
          '//connect.facebook.net/en_US/all.js';
          document.getElementById('fb-root').appendChild(e);
      }());
    </script>

Place this snippet after the body tag, and set your application (at facebook developers config center) to be auto-resizable. And that’s it!

Other common problem is how to make window scroll up when you click on a link. Usually the page renders but leaves you at the same vertical position you were before clicking.
If you are suffering this and you are using jquery, you can solve it this way:

    <script type="text/javascript">
      jQuery(document).ready(function($) {
        scrollTo(0,0);
        FB.Canvas.setSize({width: 760, height:$('body').height()+20});
      });
     
      function scrollTo(x,y){
        $("body").append('<iframe id="scrollTop" style="border:none;width:1px;height:1px;position:absolute;top:-10000px;left:-100px;" src="http://static.ak.facebook.com/xd_receiver_v0.4.php?r=1#%7B%22id%22%3A0%2C%22sc%22%3Anull%2C%22sf%22%3A%22%22%2C%22sr%22%3A2%2C%22h%22%3A%22iframeOuterServer%22%2C%22sid%22%3A%220.957%22%2C%22t%22%3A0%7D%5B0%2C%22iframeInnerClient%22%2C%22scrollTo%22%2C%7B%22x%22%3A'+x+'%2C%22y%22%3A'+y+'%7D%2Cfalse%5D" onload="$(\'#scrollTop\').remove();"></iframe>');
      }
    </script>

Same as before, place this snippet after the body tag and you’re done.

I don’t remember where I got these snippets. Just wanted to share them because they’re really useful, and because I usually forget them and have to rescue backups of older apps heheh

Hope it helps!

2 comentarios » | Facebook applications, Programación

Comercio electrónico “seguro” y el Banco Sabadell

abril 20th, 2011 — 7:02pm

Mi empresa opera con el Banco de Sabadell. Tengo con ellos la cuenta de mi pequeño negocio, y tengo una tarjeta con la que suelo hacer las compras de las cosas que voy necesitando.
Las cosas que pago en mano (gasolina, comidas, etc) no tienen problema, pero yo compro muchas cosas por Internet y hay algo que no me gusta.

No sé que tan peligroso o inseguro es, pero el caso es el siguiente:

  • Al realizar una compra por internet, algunos comercios implementan el sistema de Comercio Electrónico Seguro (en adelante CES).
  • Con este sistema, me aparece una pantalla ajena al comercio que me pide una clave de mi tarjeta de coordenadas.
  • Normalmente la tarjeta de coordenadas se usa para activar operaciones en la página del banco (transferencias, domiciliaciones, etc), pero en el caso de comercios con CES también se usa para activar una compra.
  • La tarjeta tiene 80 coordenadas, con 80 claves distintas
  • Cada vez que compro (literalmente), el sistema me pide SIEMPRE la misma coordenada. La 01, para ser más exactos.

Al principio pensé que era una coincidencia, ya que estoy en el Banco Sabadell desde hace poco. Pero después de hacer muchas compras me doy cuenta de que no lo es.

He posteado algunos twitts al respecto, y me ha contactado un chico del @bancosabadell por teléfono. En su conversación me ha explicado que:

  1. La inseguridad no es culpa del banco, sino del CES.
    Como si el CES fuese una entidad aparte y no tuviese nada que ver con el banco.
    Me ha explicado que a cada tarjeta de coordenadas, el sistema de CES le asigna una posición, y que al usuario SIEMPRE se le pide esa posición. Nunca cambia.
    Para mi tranquilidad (urgh…!) me ha explicado que si quiero puedo ir periódicamente a una sucursal y pedir que me cambien la tarjeta de coordenadas.
  2. No es una inseguridad.
    A fin de cuentas, la tarjeta de coordenadas no es algo para llevar encima. Porque si alguien me roba la tarjeta de crédito, tendrá todo lo que necesite para comprar cosas en mi nombre.
    También me ha explicado que es difícil que, si alguien supiese mi coordenada 01, también sepa el número de mi tarjeta y el CVV. Son muchos datos.
    Supongo que no habrá pensado en que para irme a ver a un cliente a Madrid y poder comprar el billete de vuelta desde el hotel, necesito mi tarjeta de coordenadas y mi tarjeta de crédito. Las dos juntas.

Después de esta conversación he seguido twitteando un poco, y un chico al que sigo me ha explicado cómo funciona con su banco. Y me ha hecho recordar que en los otros dos bancos con los que he trabajado anteriormente el CES funciona distinto: en uno me envían un SMS con la clave para activar la compra, y en el otro me piden un pin que sólo sé yo y que puedo cambiar cuando me plazca.
En el caso del pin es un poco engorroso, porque hay unas normas de longitud, restricciones de caracteres etc… pero cualquiera de los dos casos me parecen mucho más seguros que el que a mí me afecta.

¿A alguien más le pasa ésto con su banco?
¿¿Acaso no deberían ser los bancos los que más se preocupasen por la seguridad??

9 comentarios » | Bancos, Seguridad

Copy files using ruby

abril 13th, 2011 — 6:16pm

I’m translating my usual sysadmining shellscripts into ruby for fun and practice. One thing I hate from Ruby (maybe the only or the most important one) is its documentation. It is zero browseable and friendly, and makes you waste half of your time trying to find on google which module/class does what you need.

One thing I’ve been trying to find is how to copy a file (OMG!).
Can it be so difficult?? … please, try to find it on File class reference.

You have to figure out that exists a module called FileUtils or its old bro (ruby 1.8.6) ftools. Using them you can easily copy, move, rename and make basic file management.
What I find more surprising is that the File class reference does not mention any of them (Uh!?).

Once I found it the job was easy (using ftools as I’m still on Ruby 1.8.7):

require 'ftools'
File.copy source_file, target_file

Comentar » | Ruby

Pure-ftpd capabilities for OpenVZ hosts

marzo 24th, 2011 — 8:40pm

Trying to get pure-ftpd running on an OpenVZ virtual server and getting this message?

[ERROR] Unable to switch capabilities : Operation not permitted

Shut the VPS down, enter the host via SSH and enable needed capabilities for your VPS (where $VPS_ID is your VPS id, ie 101, 102…)

for CAP in CHOWN DAC_READ_SEARCH SETGID SETUID NET_BIND_SERVICE NET_ADMIN SYS_CHROOT SYS_NICE CHOWN DAC_READ_SEARCH SETGID SETUID NET_BIND_SERVICE NET_ADMIN SYS_CHROOT SYS_NICE; do vzctl set $VPS_ID --capability ${CAP}:on --save; done

That’s it :-)

Comentar » | Linux

Nosql con Redis y Mongodb

febrero 20th, 2011 — 2:19am

Para quien no lo sepa, desde Noviembre de 2010 se viene celebrando una reunión mensual de programadores, sysadmins, diseñadores y en general gente técnica o creativa de la comarca del Maresme. Se le dio el nombre de Maresme Developers Meetup, y tiene su hashtag en Twitter: #maresmedev.
Tenemos un grupo en Googlegroups al que cualquiera se puede suscribir si desea conocer las fechas de las próximas reuniones y de lo que en ellas se va a hablar, y en breve montaremos un site, quizá un blog, en el que colgar los slides y vídeos de las techtalks.
Por el momento nos comunicamos por Twitter y en la mailing, y las slides las compartimos en Slideshare.

La última reunión tuvo lugar ayer (viernes 18 de Febrero de 2011), y la charla corría a mi cargo. Era una pequeña presentación del movimiento Nosql, haciendo un ligero repaso por encima a Redis y a Mongodb.

En realidad yo no sé mucho sobre el tema. Se ha puesto de moda en los últimos dos años, y por pura curiosidad programé mi último proyecto (Fantastic Love Machine) usando Rails 3 y Redis… símplemente con el ánimo de aprender.
La buena prensa de Mongodb me llevó a indagar un poco hace un par de semanas, y después de ver cómo funciona y probar un Orm para Ruby llamado Mongoid, decidí migrar la aplicación.

El resultado es que ahora conozco un poquito como funcionan ambos sistemas, y aproveché el meetup mensual de la #maresmedev para presentar las cuatro cositas que he aprendido en este tiempo.

Y bueno… cómo no: aquí están los slides :-)

3 comentarios » | maresmedev, nosql, Ruby on Rails

Uwish en español!

diciembre 31st, 2010 — 4:46pm

Ha tardado varios meses en llegar. Últimamente Abel y yo hemos estado hasta ariba de trabajo, y por eso no hemos podido mantener el nivel de updates que había al principio en el proyecto. Pero hemos vuelto y venimos con fuerza.
En un principio salimos sólo en inglés porque el servicio nos parecía muy atractivo y no queríamos restringirlo al público español. No obstante la mayoría de usuarios son españoles, cosa que es normal porque casi todos vienen recomendados por gente de nuestro entorno.
Muchos se han encontrado al principio con la barrera del idioma, no entienden cómo funciona o lo que tienen que hacer para registrarse, qué es un wish, cuál es la finalidad del site… bueno pues ya no hay excusa heheh

Desde hoy Uwish tiene versión en inglés y en español :-)

Echadle un vistazo, enviadnos vuestras críticas o sugerencias, y sobretodo poned al día vuestras listas ahora que están a punto de venir los reyes magos!!

PD: Feliz año nuevo 2011 a todos!!

Comentar » | proyectos, Uwish

Fantastic Love Machine

diciembre 27th, 2010 — 2:55am

Los que me conocen saben que me da muchísima rabia programar aplicaciones para Facebook. Y en realiad no es porque me dé rabia Facebook como plataforma (soy twittero de corazón), sino porque el desarrollador está dejado de la mano de dios en cuanto a aplicaciones de Facebook se refiere.

No obstante Facebook es la plataforma ideal para lanzar proyectos que requieren una capa social. Y esto es Fantastic Love Machine.

Se trata de una aplicación que permite al usuario encontrar amantes (o una pareja estable, allá cada cual heheh) entre su círculo habitual de amigos. Funciona de la siguiente manera:

  • El usuario instala la aplicación, y elige las amigas o amigos que le gustan.
  • Los amigos y amigas hacen el mismo proceso
  • Si el usuario ha marcado a una chica, y a su vez ella también le ha marcado a él, la aplicación les avisa a los dos en secreto

Es una aplicación divertida y seguro que a más de uno le ayuda a encontrar novia… o algún ligue asegurado heheh

Como anécdota comentar que la he desarrollado en Rails 3, y como base de datos he usado Redis en lugar de Mysql para experimentar. De momento no he usado ningún ORM, aunque viendo la dificultad de realizar búsquedas entre los documentos ya le tengo echado el ojo a Ohm, y se lo implementaré en breve.

Más info en la fanpage de FLM en Facebook.

Comentar » | proyectos, Ruby on Rails

Volver arriba