Oregano tiene nuevo lider

December 26th, 2011 | by | oregano, programación

Dec
26

Luego ya de muchisimos años (parece eterno) alguien con pilas apareció Marc Lorber, quien va a ser el nuevo lider y main developer de Oregano, proyecto que salio de este grupo alguna vez. Marc estaba completando el port a Gtk3 y al nuevo canvas además de tener pilas para arreglar los bugs históricos que arrastramos hace tiempo :) .

El main git fue movido a https://github.com/marc-lorber/oregano por lo que es la nueva fuente oficial.

Saludos y Feliz 2012 para todos!

No Comments »

Git branch & Subversion detection en el prompt de Bash

September 6th, 2011 | by | gnu+linux

Sep
06

Simple, agregar en el .bashrc lo siguiente :

function parse_git_branch {
  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
 
function detect_svn {
  test -d .svn && echo "(svn)"
}
 
function proml {
  local         RED="\[\033[0;31m\]"
  local   LIGHT_RED="\[\033[1;31m\]"
  local      YELLOW="\[\033[0;33m\]"
  local LIGHT_GREEN="\[\033[1;32m\]"
  local       WHITE="\[\033[1;37m\]"
  local  LIGHT_GRAY="\[\033[0;37m\]"
  local LIGHT_PURPLE="\[\033[1;34m\]"
  case $TERM in
    xterm*)
    TITLEBAR='\[\033]0;\u@\h:\w\007\]'
    ;;
    *)
    TITLEBAR=""
    ;;
  esac
 
PS1="${TITLEBAR}\
$LIGHT_PURPLE\w$YELLOW\$(parse_git_branch)\$(detect_svn)\
$LIGHT_GRAY\$ "
PS2='> '
PS4='+ '
}
proml

Y se ve algo como (sin colores, sorry :) :

~/src/some_git_project(master)$
~/src/some_svn_project(svn)$

No Comments »

Validar y limpiar un form AJAX en Rails

August 16th, 2011 | by |

Aug
16

Template

<%= form_for @object, :remote => true do |form| %>
 
  <%= submit_tag 'Enviar', :class => 'submit' %>
<% end %>

Javascript

$(function () {
  var loading = $('<img />').attr('src', '/images/loadingAnimation.gif').addClass('submit');
 
  $('form').bind('ajax:complete', function(evt, data, status, xhr) {
    // Mostrar el boton y sacar la imagen de loading
    $(this).find('.submit').show();
    $(loading).detach();
 
    $(this).find('textarea').val('');
    $(this).find('input').val('');
    // Cualquier otra regla de limpieza que se quiera aplicar :)
  }).bind('ajax:beforeSend', function () {
    var valid = true; // Poner logica de validacion;
 
    if (valid) {
      // Ocultad el boton y mostrar la imagen de loading en su lugar
      $(this).find('.submit').hide();
      $(this).find('.submit').before(loading);
    }
 
    return valid;
  });
});

No Comments »

Filtro de Contenido para T!

May 11th, 2011 | by | programación

May
11

Hoy estuve leyendo este post donde los dueños de Taringa declara que “no podemos investigar el destino final de cada uno de los 20.000 post diarios”. Lejos de ser algo “colectivamente inteligente” como declaración, es una terrible boludez :) . Con aplicar algunos filtros automáticos, permitir que cualquiera de forma rápida y fácil reporte los contenidos ilegales y actuando más o menos rápido en su eliminación uno se cubre el 90% del orto. El otro 10% hay que pelearlo por carta documento porque hay gente muy al pedo ahí afuera, pero ni en pedo llegamos a un juicio oral teniendo un poco de criterio :) .

El problema es que filtrar a mano es caro, y además filtrar hace que nuestros usuarios bajen pues no tiene ya toda la piratería al alcance de la mano ;) . Pero veamos como hacer un filtro para determinar por heurística los posts que posiblemente sean ilegales, de manera de poder revisar a mano solo los que tal ve son malos, y así bajar el trabajo necesario y por ahí bajar el costo y aumentar el profit :) .

No lo voy a explicar muy en detalle, pero básicamente el programa siguiente hace un scraping de la home de T! y agarra los ‘Ultimos posts’. Para cada uno de ellos, lee el contenido y aplica una heurística muy básica para ver si es potencialmente ilegal :

require 'rubygems'
require 'net/http'
require 'hpricot'
 
AGENT = "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.10) Gecko/20100915 Ubuntu/10.04 (lucid) Firefox/3.6.10"
 
url = URI.parse("http://www.taringa.net/")
http = Net::HTTP.new("www.taringa.net")
html = http.request_get('/', {'User-Agent' => AGENT})
 
doc = Hpricot(html.body)
(doc/"html/body/div[2]/div[4]/div[4]/div/div[2]/ul/li/a").each do |link|
  text = http.request_get(link.attributes['href'], {'User-Agent' => AGENT})
  doc1 = Hpricot(text.body)
  content = (doc1/"html/body/div[2]/div[4]/div[4]/div/div[2]/div[2]").first.to_s
 
  if (content =~ /megaupload/i) || (content =~ /free/i) || (content =~ /mediafire/i) || (content =~ /fileserve/i)
    puts "#{link.inner_html.strip} posible post ilegal"
  else
    if (content =~ /Este post es privado/i)
        puts "#{link.inner_html.strip} es privado. Al menos si es ilegal no lo ve todo el mundo :)"
    else
      puts "#{link.inner_html.strip} parece legal."
    end
  end
end

Con esto podemos saber :

  • Cuantos posts parecen legales
  • Cuantos parecen ilegales
  • Cuantos no son públicos, por lo que podemos revisarlos o no, no es tan terrible

Con un poco de bash sacamos las stats :

gazer@Max:~$ ruby tfilter.rb > post.txt
54 post.txt
gazer@Max:~$ grep 'posible post ilegal' post.txt | wc -l
2

Solo el 3.7% de los posts analizados parecería ser ilegales, por lo que en lugar de tener que revisar 20.000 posts por día solo deberia revisar 740, el número es otro. Si de esos ademas sumás el report del user, seguro no te quedan mucho más y hasta por ahí lo podés moderar mientras desayunas :) .

Obviamente mi filtro se basa solamente en linksharing (que es el 90% del problema de T! y del uso que sus usuarios le dan al site). Seguramente haya servicios de upload que no puse, pero para demostrar que filtrar el contenido es una terrible pelotudez y que Taringa! no lo hace porque no le conviene, alcanza y sobra :) .

Posts analizados

6 Comments »

vBulletin 3.6.x disable YouTube autoplay

February 14th, 2011 | by |

Feb
14

If you have defined a bbcode like [yt]VIDEO_ID[/yt], you’re in trouble. Now your users can pass the new autoplay options calling [yt]VIDEO_ID&autoplay=1[/yt]. When you have 5 or more videos on a page, that’ s really a problem :)

To avoid this just force autoplay to 0 when parsing your bbcode :

--- class_bbcode.php.orig	2011-02-14 03:05:22.000000000 -0300
+++ class_bbcode.php.fixed	2011-02-14 03:05:47.000000000 -0300
@@ -378,6 +378,9 @@
 	{
 		global $html_allowed;
 
+		// Avoid autoplay on bbcodes
+		$text = preg_replace('/autoplay=1/i', 'autoplay=0', $text);
+
 		$this->options = array(
 			'do_html'    => $do_html,
 			'do_smilies' => $do_smilies,

No Comments »