lunes, 13 de septiembre de 2010

YouTube Starts Testing New Live Streaming Platform

YouTube has announced it will start a two-day trial of its new streaming platform, which enables broadcasters to stream live video directly into YouTube channels.
YouTube has been dabbling with the live video streaming realm for quite some time now, having previously offered a live stream of a U2 concert and Indian Premier League cricket matches. Now, it’s taking it a step further with a platform that will finally bring something like live TV to YouTube’s vast audience.
All broadcasters need for a live stream is a webcam or an external USB/FireWire camera. The platform also includes a live commenting module. It’s a test drive, however, and the video service warns there might be some bumps along the way.
YouTube has brought in four content partners: Howcast, Next New Networks, Rocketboom and Young Hollywood. The test platform will be live for the next two days, starting at 8:00 a.m. PT.

El declive de los lectores de RSS

Tal como comenta Business Insider, los lectores RSS están de capa caída. El artículo cita como posibles causas de este movimiento la complejidad para el usuario medio de usar un lector RSS, así como el auge que tienen los servicios de microblogging como Twitter, o los ofrecidos por las nuevas redes sociales. En dicho artículo citan como prueba la caída de un 27% de usuarios del servicio Google Reader. Además, como bien comenta un usuario en dicha página, otra posible causa de este declive puede haber sido las nuevas aplicaciones de lectura creadas para las nuevas plataformas móviles, como puede ser Flipboard. Estos nuevos servicios permiten mediante aplicaciones cerradas ofrecer contenido de pago muy fácilmente, y así eliminar de un plumazo los problemas que ha traído Google Reader a las editoras. Parece que estamos pasando de la información "gratis" de la web 1 y 2.0 a aplicaciones de pago de 0.99, y a cambio de interfaces cuidadas pero solo para dispositivos muy concretos. ¿Será este el principio del fin de la web tal y como apuntaba Wired?

Un nuevo iPad con cámara y FaceTime podría llegar antes de lo esperado

apple ipad

Los últimos rumores indican que Apple quiere hacer que FaceTime llegue al máximo de usuarios posible, y eso podría llevar la compañía a lanzar un nuevo iPad a tiempo para la temporada navideña con una cámara incorporada para poder realizar llamadas de vídeo con otros dispositivos preparados para ello como el iPhone 4 y el nuevo iPod touch.
Así lo ha dicho una fuente de Appleinsider, que también ha comentado que la siguiente generación de los iPad con capacidad para disfrutar de FaceTime está ya en fase de pruebas avanzadas. No sabemos si este nuevo iPad sería el rumoreado ‘iPad mini’ de 7 pulgadas o si seguiría teniendo el mismo panel de 9,7 pulgadas como el modelo actual.
Lo que sí es cierto es que si este rumor se cumple, Apple nos demostraría una vez más que su prioridad máxima en estos momentos es la de potenciar el iOS entre los consumidores con una frecuencia de actualización muy fuerte, tanto desde el punto de vista del hardware como del software.

Vía | Appleinsider

martes, 7 de septiembre de 2010

Científicos transladan señales del cerebro en palabras

Investigadores en la Universidad de Utah, dicen haber hecho progresos en la identificación de palabras a través de señales del cerebro.

[Original]

Los 5 gráficos indispensables para que todo SEO tenga como referencia

En el proceso de posicionamiento en buscadores existen tantas diversas actividades relacionadas con el marketing, contenido y los aspectos técnicos de un sitio que siempre viene muy bien tener a la mano documentos de referencia no sólo al aprender, sino en el día a día para validar la ejecución de estas tareas (o enviárselas al cliente de requerir fuentes!).
A continuación tiene 5 gráficos y diagramas de flujo SEO que serán una referencia útil en el proceso de optimización:

1. Las Pirámide de los Fundamentos SEO

Excelente gráfico publicado por SEOmoz en el que se muestran los distintos aspectos fundamentales que forman parte de un proceso SEO: Contenido Accesible y de Calidad, Estudio y enfoque de Palabras Claves, Creación de Enlaces y lo “Social“.
Piramides Bases SEO
Descarga el gráfico aquí y te invito a que veas el interesante vídeo publicado junto a él en SEOmoz.

2. Las Preguntas sobre SEO más comunes – Una guía

Una serie de infografías que muestran distintas fases, actividades e información de referencia de un proceso SEO: Estudio de Palabras claves, Optimización de una página, Creación de Enlaces, Tácticas SEO, Linkbaiting y Marketing Social y hasta un gráfico de SEO vs. PPC creada y publicada en Datadial.
SEO Infographic
Echa un vistazo a esta serie de gráficas y descárgala aquí.

3. La hoja de Ayuda SEO para Desarrolladores Web

Esta es una hoja de ayuda indispensable a tener como referencia ya que se incluyen los aspectos más técnicos relacionados con el código de la Web, como, optimización de etiquetas title y encabezado, imágenes, enlaces, redireccionamientos, canonicalización, etc.
Hoja de Ayuda SEO para el Desarrollador Web
Puedes ver con mayor detalle los distintos aspectos que se incluyen en la hoja de ayuda y descargarla desde aquí.

4. El Diagrama de Flujo SEO para obtener un magnífico posicionamiento en buscadores

Aunque con un lenguaje “algo” fuerte el diagrama de flujo creado por Create Market Profit nos lleva por las distintas actividades de análisis y optimización a realizar en un proceso de posicionamiento en buscadores.
Diagrama de Flujo SEO
Puedes acceder a ella desde aquí.

5. Cómo gestionar una penalización de Google

Este diagrama de flujo publicado por SEOmoz es una referencia a tener siempre en cuenta, ya que te guiará en caso de sufrir una penalización por parte de Google, porque aunque hagas las cosas bien, siguiendo las actividades en el proceso SEO planteadas en los gráficos anteriores siempre existe el riesgo:
Penalizacion Google
Lee más sobre penalizaciones de Google y descarga el gráfico aquí.

Bonus: 5 Métodos para mejorar el rastreo, Indexación y Posicionamiento

En este gráfico, que forma parte de un interesante artículo de SEOmoz sobre la optimización de la arquitectura del sitio de cara a la mejora de su indexación y posicionamiento se presentan 5 formas para hacerlo.
Arquitectura web - Seo - indexacion - rastreo - posicionamiento
Descarga el gráfico desde este artículo.

domingo, 5 de septiembre de 2010

Compromisos en la implementación de OAuth de Twitter

Esta semana Twitter ha cambiado su sistema de autenticación, y ahora tan solo permite OAuth. A causa de esto diversos programas han dejado de funcionar (desde clientes de Android hasta aplicaciones de demostración), y lo que es peor: Twitter está implementando incorrectamente OAuth. Se está recayendo en el secretismo de la 'consumer key' para identificar clientes y bloquear a los 'spammers'. Esto no aporta seguridad ninguna, ya que es fácil obtener la clave del binario de una aplicación móvil o de escritorio, y deja muy colgados a los clientes libres o que obliguen a mostrar el código (como los hechos en JavaScript). Ryan Paul, editor de Ars Technica y desarrollador de Gwibber, ha escrito un detallado artículo acerca de los problemas de OAuth en Twitter.

[Original]

sábado, 4 de septiembre de 2010

Microsoft patenta el apagado del sistema operativo

Microsoft acaba de recibir la confirmación de una patente que concede a la compañía la propiedad intelectual del apagado del sistema operativo.

[Original]

iOS Bigger than Linux and Android Combined [STATS]

 According to the latest numbers from Net Applications, iOS is the third most popular platform on the Internet, surpassing Linux and Android combined.

[Original]

domingo, 20 de junio de 2010

Mitos en el juego de la ruleta

Ayer estuve intentando hacer entrar en razón a un amigo sobre un falso mito acerca del juego de la ruleta. Según él, apostando siempre al mismo color al final siempre te acaba tocando. Esto es cierto en parte, y falso en otra parte (esta parte bastante más grande...).
El juego de ruleta, como cualquier otro juego de azar, es un juego dominado por probabilidades de éxito. Se puede decir por ejemplo, que antes de lanzar a girar la ruleta, existen las mismas posibilidades de conseguir el color rojo o el negro, lo cual es cierto. Sin embargo, muchos jugadores tienden a confundir algunas situaciones de juego, la mas común es creer que si en una jugada ya salió el color rojo, lo mas probable es que en la próxima aparezca el contrario, y decida apostar al color negro.
La realidad es que la ruleta no tiene memoria, y lo que sucede en una jugada no tiene porque afectar las jugadas suguientes, o sea, que cualquier jugada que se realice al apostar a la ruleta, es totalmente independiente de todas las jugadas previas que se hallan efectuado. Entonces si apostamos al 16 rojo y no obtenemos éxito, y decidimos volver a apostar al 16 rojo, tendremos las mismas probabilidades de éxito que en la jugada anterior.
Asi también, si logramos ganar a la ruleta con el 16 rojo, existen tantas posiblidad de volverlo a conseguir en la próxima vuelta como si cambiaramos y apostaramos al 10 negro. A pesar de esto, la gran mayoría piensa que existen mínimas probablilidades de volver a conseguir el 16 rojo, y preferirán apostar en cualquier otro número que para ellos les ofrezca mas posibilidades de ganar a la ruleta.
Ahora viene el truco con el que nos vamos a hacer ricos todos (nótese la ironía). El truco consiste en apostar una cantidad inicial a un color, y ésta será la cantidad que al final habremos ganado. Si se pierde, se apuesta el doble al mismo color. Y así sucesivamente hasta que salga nuestro color. Si hacemos cuentas, la cantidad inicial será la que una vez salga nuestro color habremos granado, independientemente del número de apuestas que hayamos hecho. Aunque apostemos varias veces al mismo color, cada apuesta tiene la misma probabilidad de acierto (independientemente de que anteriormente haya salido un millón de veces el mismo color). Pero es cierto que al final acabaremos ganando. ¿Por qué? ¿Donde está el truco que hace que nadie sea millonario gracias a esto?
A la primera pregunta, es sencillo contestar. Suponamos esta secuencia de colores en diez tiradas de la ruleta:
RRRNNRRNRN (R = rojo [60%], N = negro [40%]). En este caso, si apostamos siempre al mismo color y hemos decidido apostar al rojo siempre, ganaremos 6 veces de 10. La probabilidad de que salga rojo o negro es del 50%, lo que quiere decir que si hacemos esta prueba infinitas veces, al final el número de veces que salga un color o que salga el otro, será el mismo. Si hubiéramos decidido apostar al negro, simplemente habríamos ganado 4 veces, pero habríamos ganado (siempre y cuando hayamos seguido el sistema anteriormente descrito de doblar la apuesta en caso de perderla). ¿Y todo esto por qué? Por apostar siempre al mismo color. Si no lo hacemos así, y decidimos realizar la secuencia de apuestas NNNRRNNRNR, nunca habríamos ganado...
La segunda pregunta también tiene fácil contestación. El sistema era, si perdíamos, doblar la apuesta. Supongamos que apostamos inicialmente 5€. El el caso anterior, si hubíeramos decidido apostar siempre al negro, el número de veces que habríamos perdido seguidas sería de 3 veces (al principio). Por lo que tendríamos que disponer de 5€ + 5€x2 + 5€x4 + 5€x8 = 75€. Como vemos, en la apuesta de 40€ habríamos ganado y nos lo habrían doblado, con lo que ganamos 80€ de los que habíamos perdido 75€, por lo que ganamos la apuesta inicial de 5€. ¿Qué ocurriría si en lugar de haber salido 3 veces seguidar el rojo, sale 13? Es poco probable, pero posible que ocurra...y en este caso, para ganar 5 míseros euros habríamos necesitado 81.915€. Interesante, ¿verdad?

sábado, 27 de febrero de 2010

Cómo se almacenan datos de sesión a través de cookies en rails

Hace algún tiempo estuve leyendo sobre la seguridad de los datos almacenados en sesion en rails. En la actualidad, existen dos modos de almacenamiendo: en cookies o en base de datos. Pues bien, los datos de sesión almacenados en cookies, son totalmente visibles por cualquier usuario un tanto hábil. Sin embargo, esto no quiere decir que almacenar datos en cookies no sea seguro. Veamos el proceso de almacenamiento usado por rails, de forma que al final del texto el lector sea capaz de sacar sus propias conclusiones acerca de ello. Por supuesto, expondré las mias.

Generación del sid (session ID)
Si no existe sesión, una nueva es creada y es cuando rails invoca el método generate_sid:
# actionpack/lib/action_controller/session/cookie_store.rb
def generate_sid
ActiveSupport::SecureRandom.hex(16)
end
Como puede verse, generate_sid devuelve una cadena hexadecimal y aleatoria de longitud 16. Esta función no es invocada de nuevo mientras dure la sesión actual.

Message Verifier
Para generar el valor de la cookie, Rails crea una instancia de ActiveSupport::MessageVerifier. MessageVerifier hace dos cosas: por un lado genera el mensaje a almacenar en la cookie; por otro, añade una cadena "message digest" al final de lo anterior. Así, el mensaje final está formado por por las dos partes anteriores, separadas por -- . El método que genera este contenido es:
def generate(value)
data = ActiveSupport::Base64.encode64s(Marshal.dump(value))
"#{data}--#{generate_digest(data)}"
end

Como puede verse, value es el valor que queremos almacenar en la cookie. En general, Rails almacena un hash con una serie de datos. Marshal nos permite pasar un objeto Ruby a cadena para por ejemplo, almacenarlo en una cookie, y posteriormente con esa cadena poder volver obtener el objeto Ruby original, en nuestro caso un hash. Por último esta cadena es codificada en base 64.

Generate Digest y conclusiones
Generate digest nos genera una cadena, a partir de la cadena que teníamos inicialmente (la que queremos almacenar en la cookie). También hace uso de una clave secreta que podemos encontrar en initializers/session_store.rb .
Por tanto, si nos vamos al contenido de la cookie y le hacemos un simple decode64, podemos ver (aunque con dificultad) el contenido de la session_id, o incluso otros datos almacenados (como user_id, éste muy frecuente). Está bien, ¿y podemos hacer algo con este user_id? Pues la verdad es que no, nada, excepto tener conocimiento de él. Pero...si el sistema de autenticación usa este user_id, ¿podemos cambiar el valor de la cookie y pasar a estar en el sistema como otro usuario? La respuesta es NO. ¿Por qué? Pues simple, porque si cambia el contenido de la primera parte de la cadena almacenada en la cookie, también deberá cambiar la segunda (la generada por generate digest) y a no ser que tengamos acceso a la clave almacenada en initializers/session_store.rb este proceso no nos será posible. Rails básicamente lo que hace es, al leer la sesión, comprobar que esta segunda parte es correcta. Si no lo es, sabrá que algo va mal... Por tanto es seguro, en tanto que un usuario malicioso no nos podrá cambiar su contenido. Sin embargo, no ofrece ninguna seguridad para leer su contenido, por lo que nunca se deberá usar para almacenar datos sensibles, tales como contraseñas, números de cuentas bancarias, etc.

domingo, 6 de diciembre de 2009

CruiseControl

CruiseControl es una herramienta de integración continua escrita en, y para, ruby. Su finalidad básica es la de alertar a los miembros de un proyecto software cuando un cambio en el repositorio de control del código fuente (como svn) rompe dicho proyecto. En el caso de RoR, lo que hará periódicamente será la ejecución de los test de la aplicación, informando del resultado.

Es muy fácil de usar. Basta con descargarlo (es un mini-proyecto RoR), añadirle nuestro proyecto (indicando el repositorio del código fuente), y arrancarlo. Por defecto arranca en el puerto 3333, y si accedemos nos encontraremos algo como esto. Además, podemos integrar rcov en cruisecontrol y obtener información del code coverage de nuestro proyecto.

Usando rcov desde cuisecontrol

Para que CruiseControl nos facilite información sobre el Code Coverage, necesitamos:
  1. Gema rcov ('sudo gem install rcov'). Comprobamos ejecutando 'rcov' en el terminal.
  2. Plugin rails_rcov ( './script/plugin install http://svn.codahale.com/rails_rcov' --> Doc: http://agilewebdevelopment.com/plugins/rails_rcov)
  3. Añadir en lib/tasks/ el fichero cruise.rake con el siguiente contenido:

# Set the artifacts dir for development
ENV['CC_BUILD_ARTIFACTS'] ||= File.expand_path("#{RAILS_ROOT}/metrics")
ENV['RAILS_ENV'] = 'test'

# This hack is needed because db:test:purge implementation for MySQL drops the test database, invalidating
# the existing connection. A solution is to reconnect again.
def reconnect
require 'active_record' unless defined? ActiveRecord
configurations = ActiveRecord::Base.configurations
if configurations and configurations.has_key?("test") and configurations["test"]["adapter"] == 'mysql'
ActiveRecord::Base.establish_connection(:test)
end
end

desc 'Continuous build target'
task :cruise do
# Add local user gem path, in case rcov was installed with non-root access
#ENV['PATH'] = "#{ENV['PATH']}:#{File.join(Gem.user_dir, 'bin')}"

puts
puts "[CruiseControl] Build environment:"
puts "[CruiseControl] #{`cat /etc/issue`}"
puts "[CruiseControl] #{`uname -a`}"
puts "[CruiseControl] #{`ruby -v`}"
`gem env`.each_line {|line| print "[CruiseControl] #{line}"}
puts "[CruiseControl] Local gems:"
`gem list`.each_line {|line| print "[CruiseControl] #{line}"}
puts

out = ENV['CC_BUILD_ARTIFACTS']
mkdir_p out unless File.directory? out if out

if File.exists?(Dir.pwd + "/config/database.yml")
if Dir[Dir.pwd + "/db/migrate/*.rb"].empty?
raise "No migration scripts found in db/migrate/ but database.yml exists, " +
"CruiseControl won't be able to build the latest test database. Build aborted."
end

# perform standard Rails database cleanup/preparation tasks if they are defined in project
# this is necessary because there is no up-to-date development database on a continuous integration box
if Rake.application.lookup('db:test:purge')
Rake::Task['db:test:purge'].invoke
end
if Rake.application.lookup('db:migrate')
reconnect
Rake::Task['db:migrate'].invoke
end
end

if RUBY_VERSION == '1.8.7'
puts '!!!!!! Skipping rcov on Ruby 1.8.7'
Rake::Task["test:units"].invoke
Rake::Task["test:functionals"].invoke
else
ENV['SHOW_ONLY'] = 'models,lib,helpers'
Rake::Task["test:units:rcov"].invoke
mv 'coverage/units', "#{out}/unit test coverage" if out

ENV['SHOW_ONLY'] = 'controllers'
Rake::Task["test:functionals:rcov"].invoke
mv 'coverage/functionals', "#{out}/functional test coverage" if out
end
end

Para probar que funciona correctamente y que cruise-control no va a fallar, podemos probar a ejecutar:
rake cruise

sábado, 14 de noviembre de 2009

Google libera Closure, la librería JavaScript detrás de Gmail y Gmaps

Me hago eco de la siguiente noticia, leída en javahispano.org:

Google ha liberado una librería y un conjunto de herramientas para trabajar con JavaScript: Closure. Closure es empleada por aplicaciones como Gmail y Gmaps. Está formado por un optimizador que permite comprimir el código JavaScript, y a la vez realiza un análisis sintáctico del código para encontrar errores comunes.

Por otro lado está una librería con utilidades para manipular el DOM, comunicarse con el servidor, crear animaciones, soporte para edición de texto... La librería es completamente "multi navegador", su diseño es modular y (obviamente, dada las aplicaciones en las que ha sido empleada) está muy bien testada.

Por último, tenemos un sistema de plantillas tanto para Java como para JavaScript cuyo propósito es simplificar la tarea de generar dinámicamente HTML. Las plantillas están implementadas tanto en Java como en JavaScript, lo que permite emplearlas tanto el servidor como en el cliente.

lunes, 28 de septiembre de 2009

Testing con "redirect_to :back"

Si necesitas testear un controlador rails que contiene un "redirect_to :back" obtendrás un error al lanzar el test. Si vamos a la implementación, podemos encontrar:

  • :back - Back to the page that issued the request. Useful for forms that are triggered from multiple places. Short-hand for redirect_to(request.env["HTTP_REFERER"])
Si estamos testeando no tendremos un request, por lo que fallará la redirección y por lo tanto el test.

SOLUCIÓN:

def test_should_get_new
   @request.env['HTTP_REFERER'] = 'http://whatever'
   get :new, :link_id => 1
   assert_redirected_to 'http://whatever'
end

miércoles, 26 de agosto de 2009

¿Qué licencia Open Source elijo?

Me llega la hora (por fin :) ) de la entrega de mi proyecto fin de carrera. Lo he llamado GASWED, o Gestor de Actualizaciones Software Web en Entornos Distribuidos. Básicamente consiste en un gestor que, ayudándose de svn (subversion), controla revisión de los distintos ficheros de un proyecto software web en distintos servidores y, además, está orientado a paquetes. Es decir, no trabajamos con ficheros individuales como con svn, sino con paquetes de éstos tales que agrupen alguna funcionalidad (tablón, foros...). Además, cada paquete puede ser importado en distintos servidores o eliminado, llevando asociadas sentencias sql que serán ejecutadas en las bases de datos de cada uno de estos servidores. Sí, prometo una explicación más detallada cuando lo finalize y entregue ;) .

Si tú tambien eres programador y estás desarrollando una aplicación a la que le quieres aplicar una licencia Open Source, seguramente te hayas dado cuenta de que hay muchas opciones. ¿Cuál es la mejor elección a la hora de trabajar con Open Source? Es en lo que trata de ayudarnos un completo artículo en el que un desarrollador ha analizado cada una de las licencias Open Source que existen actualmente.

Shlomi Fish, un joven desarrollador especializado en desarrollos Open Source, ha elaborado un interesante artículo en el cual compara las distintas alternativas que los programadores de Software Libre y Open Source (Free and Open Source Software, FOSS) tienen cuando están trabajando en un nuevo proyecto.

Lo cierto es que este tipo de decisión cada vez es más compleja debido al creciente número de licencias que han ido apareciendo con el paso del tiempo. Aunque la GPL es la más conocida y extendida -sobre todo en su versión 2- en los últimos años distintas organizaciones han propuesto otro tipo de licencias que ofrecían ciertas ventajas con respecto a otras alternativas, de modo que básicamente cada programador disponía de una licencia que más o menos se ajustaba a sus necesidades.

Fish elabora un completo análisis dividiendo el actual segmento de las licencias FOSS en tres grandes grupos:
  1. Licencias de Dominio Público: permiten hacer prácticamente cualquier cosa que te convenga con el software y su código fuente. Ejemplos de estas licencias: licencias BSD, MIT X11, Apache e ISC.
  2. Licencias Copyleft "débiles": este tipo de licencias obligan que el código fuente derivado de estos desarrollos siga usando la misma licencia, aunque uno puede enlazar esa licencia débil e integrarla en un desarrollo global con otra licencia -incuyendo licencias que no son Open Source. Ejemplos: LGPL, Artistic Licence, o la MPL.
  3. Licencias Copyleft "fuertes": parecidas a las anteriores, pero que obligan a que incluso desarrollos que incluyan a código fuente con esa licencia tengan que usar esas licencias, y no otras. Ejemplos: la famosa GPL (tanto en su versión 2 como en su versión 3), o la Sleepycat License.
A partir de ahí Fish realiza una serie de recomendaciones en las que por ejemplo indica que es mejor utilizar licencias compatibles con la GPL, pero que no es buena idea usar las licencias GPL o LGPL porque contienen demasiadas restricciones adicionales al concepto de copyleft. Según su opinión, la licencia MIT X11 es "corta, simple y fácil de comprender", y además es compatible con la GPL.

Personalmente, creo que me voy a decidir por una licencia GPL en su versión 3. Como gustos, colores.

EDITED:
Por fin está el proyecto acabado y entregado. Finalmente me decidí por AGPL v3.

¿Es seguro el DNI electrónico?

ElDNI electrónico es el nuevo carnet de identidad de los españoles. Una de las grandes novedades es la incorporación de un chip que permite realizar operaciones de firma electrónica e identificar a los ciudadanos a través de Internet. El DNI-e sitúa a España en la vanguardia mundial en cuanto a firma digital y permitirá agilizar enormemente muchos de los trámites administrativos que hasta hace bien poco solo podían ser realizados en persona o bien requerían de engorrosos trámites técnico-burocráticos -obtención de un certificado, etc-.

Pero... ¿Son totalmente seguras todas estas operaciones? ¿Están nuestros datos personales totalmente seguros? Un estudio llevado a cabo por PenTest nos demuestra que tenemos que andarnos con mucho ojo. Podemos ver este estudio aquí. No tiene desperdicio.

sábado, 4 de julio de 2009

Empezando con Rails

Bueno, pues ya llevo tres días en el trabajo :) . La verdad es que se está muy agusto, hay un muy buen ambiente de trabajo. Estos tres días los he dedicado a entender la forma de programar que usa rails. Es un poco complejo al principio, pero una vez que empiezas a escribir algo de código esa complejidad se convierte en satisfacción.

Hasta ahora, estaba acostumbrado a programar aplicaciones web con PHP. Con Rails, se tiene una forma de desarrollar aplicaciones con una complejidad alta, seguridad alta, etc. y en no mucho tiempo (seguro menos que con PHP). Con PHP todo está a un nivel de abstracción más bajo. Quizá PHP me ha venido muy bien para aprender sobre el desarrollo web. Con Rails te tienes que subir un nivel más arriba y dar por hecho muchas cosas que Rails se encarga de hacer automáticamente, una vez tienes definido el modelo y controlador correctamente. Aparte de todo esto, Rails usa MVC (Modelo-Vista-Controlador) por lo que a pesar de ser aplicaciones mucho más complejas, son también más claras de leer y más fáciles de mantener. Por ahora, ¡con Rails todo son ventajas!

Cuando ya empieze de verdad con aplicaciones complejas, seguro que me van surgiendo muchas curiosidades para postear por aquí. Hasta entonces, o hasta que tenga otro motivo por el que escribir, bye bye.

miércoles, 24 de junio de 2009

Vuelta al blog

Tras algunos meses de parada, vuelvo de nuevo a escribir en mi blog. Estoy a punto de teminar la carrera de ingeniería informática en la Universidad de Granada. Acabo de encontrar un trabajo. Y ahora que espero tener algo más de tiempo para mí (la carrera es terrible, cuando no hay que estudiar un parcial, tienes que entregar prácticas, y cuando no...exámenes finales! Y cuando parece que tienes un respiro...septiembre!!). Espero no tragarme mis propias palabras, pues dicen que estudiar es mucho mejor que trabajar (lo dice quien trabaja...) pero yo creo que estudiamos para poder trabajar de lo que nos gusta, y bueno, no creo que sea tan terrible.

Voy a entrar a trabajar en una empresa dedicada al desarrollo de software. El 95% del trabajo de la misma es desarrollo de aplicaciones web, usando rails. La verdad que de ruby tengo poca idea... Pero bueno, ahora entraré para aprender el lenguaje y el framework a fondo. Rails es un framework para el desarrollo de aplicaciones web con bases de datos de acuerdo con la estructura modelo-vista-controlador. Supongo que se usará ajax en la vista...bueno, no adelanto acontecimientos que aún me queda mucho que aprender.

Aquí en el blog iré poniendo curiosidades, problemas que me surjan y resuelva, etc. sobre rails. Me parece una buena forma de compartir con vosotros algunos conocimientos que os pueden venir de perlas (si usáis rails...).

¡Espero que os guste e interese todo lo que vaya poniendo por aquí!

lunes, 22 de junio de 2009

Comparativa de uso de memoria entre navegadores

El navegador Firefox de Mozilla Foundation siempre ha sido muy criticado por su enorme consumo de memoria, un problema que parece haber sido resuelto en las vesiones preliminares de Firefox 3.5, que sorprenden por su eficiencia. Me hago eco de una comparativa que analiza este apartado y enfrenta a Firefox 3.5 RC, Google Chrome 3.0 Dev, Safari 4.0 y Opera 10b. Pese a lo que tenía entendido sobre Chrome, parece ser que es el que sale peor parado al menos con respecto a su consumo de memoria.

¿Mejorarán posteriores versiones al igual que lo han hecho para Firefox? Seguro que sí.

martes, 22 de julio de 2008

Spam

Se denomina spam o correo basura a aquellos mensajes no solicitados, habitualmente de tipo publicitario, enviados en grandes cantidades (incluso masivas) que perjudican de alguna o varias maneras al receptor.
Hoy día, contamos con muchos y muy buenos filtros anti-spam. La mayoría de ellos están basados en el texto del email. Se lee de manera automática la cabecera y cuerpo del mensaje y mediante algunas técnicas de clasificación se lleva a cabo de forma automática una clasificación de dicho email (por ejemplo, podría verse el número de veces que aparece la palabra "viagra"). Normalmente, aquel que es considerado como spam viene colocado en una carpeta distinta a la bandeja de entrada, por ejemplo la carpeta spam.

Los spammers han optado por una nueva forma de spam con el objetivo de saltarse los filtros anteriormente comentados. Básicamente consiste en añadir el texto del mensaje a una imagen, y añadir dicha imagen en el email. De esta forma, no habría texto de forma legible según los métodos anteriormente dichos.
Para tratar de solucionar este nuevo problema, existen programas como SpamAssassin (bajo licencia Apache 2.0) que usan otras técnicas para la clasificación. En particular, para el problema anteriormente propuesto, bastaría con usar un OCR y extraer todo el texto de la imagen para posteriormente pasarlo a un clasificador como los anteriormente mencionados.

Pero los spammers han ido más allá. Ahora tratan de ocultar el texto en imágenes y además tratan de ofuscarlo. Es decir, tratan de meter el texto en imágenes y añaden técnicas para que un programa OCR no sea capaz de extraer dicho texto (como puede ser el uso de fondos de colores no uniformes, trazos de lineas por encima del texto, texto cursivo, etc.).
Para ello, en colaboración con el grupo de investigación P.R.A. de la universidad de Cagliari he desarrollado un plugin para el programa SpamAssassin basado en el trabajo que llevan desarrollando bastante tiempo. Básicamente se trata de extraer ciertas características de la imagen (no de extraer el texto) como el número de colores (una imagen de spam normalmente tendrá muchos menos colores que una imagen legítima...) y una vez normalizados los datos y habiendo entrenado previamente un classificador SVM (Support Vector Machine) con kernel RBF (Radial Basis Function) se procede a la clasificación.
Los resultados obtenidos han sido bastante buenos. No solo basta con tener un número alto de aciertos y bajo de fallos, sino que en este caso debemos tratar de minimizar los falsos positivos (clasificar el email como spam siendo legítimo) aunque a costa de ello perdamos eficacia en los falsos negativos (clasificar el email como legítimo siendo SPAM). A ninguno de nosotros nos gustaría que se clasificase como spam un email que no lo es, ¿vedad? Aunque alguno que sí lo sea lo tengamos que borrar de la bandeja de entrada...

Podéis ver más sobre el trabajo realizado aquí.