rescue true

11 abril, 2011

Instalando una impresora Canon MG5150 en Ubuntu

Archivado en: Linux — xurdekio @ 9:32 pm
Tags: , , , , ,

Estos días de atrás se murio mi vieja HP así que tocó pasarse por MediaMarkt y hacerse con una Canon MG5150 por 89€. Es una multifuncional con copia sin necesidad de ordenador, impresión por doble cara automática, carga del papel por cartucho inferior.. lo único que se echa en falta en la conexión por WiFi.

Canon suele tener bastante en cuenta a los usuarios de Linux así que no ha sido complicado instalarla, de todas formas aquí os detallo el proceso:

  • Ir a la página de los drivers de Canon y descargarse los oportunos para Linux aquí
  • Descomprimir el archivo, y dentro del mismo descomprimir también el fichero cnijfilter-mg5100series-X.XX-1-deb.tar.gz
  • Navegar hasta cnijfilter-mg5100series-3.40-1-deb/packages e instalar los paquetes common y mg5100 series oportunos con tu sistema
  • Ahora nos vamos a Sistema -> Administracion -> Impresion y hacemos click en Añadir
  • Elegimos si la impresora esta conectada a nuestro pc o en red (en mi caso estaba compartida desde un equipo con Windows XP así que elegí impresora compartida por Samba)
  • En la siguiente pantalla elegimos usar el archivo PPD y navegamos a /usr/share/cups/model/canonmp5100.ppd
  • Hacemos click en siguiente y ya tenemos nuestra impresora lista para usar!

Espero que os sea de utilidad!

8 abril, 2011

¿Por qué usar Software Libre?

Archivado en: Linux,Software Libre — xurdekio @ 10:12 am
Tags: , ,

Desde hoy incorpor a la web el banner de Apoyo a La Comunidad Internacional del Software Libre como candidata a los Premios Príncipe de Asturias 2011 en la modalidad Cooperación Internacional y os dejo unas pinceladas de por qué usar y fomentar el Software Libre:

  • Porque ayuda a aprender: poder ver el código de algunos programas despierta la mente y da mil ideas para afrontar los problemas del trabajo diario como desarrollador.
  • Porque puedes distribuirlo libremente: cuando encuentras un programa genial puedes hacerselo llegar a todos tus amigos para que también lo disfruten sin necesidad de pasar por caja o hacer algo ilegal.
  • Porque sabes lo que hace: La posibilidad de que otros estudien el código elimina las tentaciones de que implemente cosas de dudosa moralidad.
  • Porque ese programa que te gusta siempre sigue evolucionando: rara vez te encontrarás con que el desarrollador ya no de soporte ni siga implementando cosas nuevas, y si esto pasa, siempre puedes seguir tu!
  • Porque fomenta la cooperación: Allí donde tus ideas ya no llegan siempre habrá otra persona dispuesta a echarte una mano y mejorar lo que tu has comenzado.
  • Porque crea nuevos modelos de negocio: En estos tiempos de crisis hay que apretarse el intelecto para llegar a fin de mes y el software libre crea multitud de oportunidadades de negocio aportando herramientas, ideas, soluciones. Todo software necesita un periodo de aprendizaje, una instalación, un mantenimiento que puede aprovecharse.
  • Porque abarata los costes: Y si puedes abaratar tus costes, puedes ser mas competitivo en el mercado.
  • Porque ayuda a crear empleo sin apenas inversión: Por poner un ejemplo… cualquiera puede crear una StartUp montando su propio servidor web con Apache y desarrollar su aplicación con Rails sin pagar mas allá que el alquiler de un servidor, sin pagar ni una sola licencia, solo con una buena idea y software libre.
  • Porque crea una cultura: La cultura de compartir y ayudar desinteresadamente que tanta falta nos hace.

Y asi podría seguir un buen rato, pero creo que con esto ya os haceis una idea…

18 marzo, 2011

Twitter gem + Apigee: incrementar el rate limit de tu aplicación de Twitter

Archivado en: Uncategorized — xurdekio @ 12:22 pm

Estos días he estado inmerso en el desarrollo de una aplicación para Twitter que requería gran cantidad de consultas a la API. Por defecto la API de Twitter tan solo permite 200 queries/hora si no haces las peticiones loggeado y 350 si si lo estas.

En el caso de nuestra aplicación necesitabamos alrededor de 1500 – 2000 queries/hora, lo cual superaba con mucho los limites impuestos. Twitter te permite negociar con ellos tu rate limit, pero lo asocia a una IP o un usuario, lo cual es un problema a la hora de tener la aplicación en varios entornos (distintas IPs) y con varios desarrolladores (distinas API Key).

En este punto nos topamos con Apigee, un servicio para gestionar y monitorizar nuestras APIs que tiene un acuerdo con Twitter para que el rate limit accediendo a través de su servicio sea de 20000 queries/hora. Así que nos registramos, configuramos la API de Twitter y obtenemos un endpoint de la forma: https://tu_api-tu_user.apigee.com. Todas las peticiones que hagamos contra este endpoint seran equivalentes a hacerlas contra el endpoint de la API de Twitter, pero con un rate limit de 20000 queries/hora.

Dicho esto, la gema de twitter que estamos usando es la gema twitter de Jhon Nunemaker, en su versión 1.1.2. Esta gema te permite configurar el endpoint contra el que efectuas las peticiones de la forma

Twitter.configure do |config|
  config.endpoint = "https://tu_api-tu_user.apigee.com/1/"
end

Con este código podemos crear fichero en la carpeta config/initializers para que configure en endpoint al iniciar la aplicación.
En este punto ya tenemos la aplicación lista para realizar miles de queries por hora siempre y cuando no vayan firmadas a través de OAuth.
Si nuestro caso requiere hacer este tipo de peticiones autentificadas, Apigee nos dice que las hagamos a traves del endpoint que ellos nos suministran, pero firmadas como si fuesen al endpoint de Twitter.
Para ello necesitamos desempaquetar la gem con gem unpack twitter dentro del directorio vendor/plugins de nuestra aplicación y editar el fichero twitter/lib/faraday/oauth.rb añadiendo la siguientes siguientes lineas en lugar de las existentes para la construcción de la header

      #Hack para que, aunque estemos usando otro endpoint (lease apigee) la firma oauth se genere para el endpoint original
      url_hack = Addressable::URI.parse(env[:url].to_s.sub(Twitter.endpoint, Twitter::Configuration::DEFAULT_ENDPOINT))
      header = SimpleOAuth::Header.new(env[:method], url_hack, signature_params, @options)

Ahora, si hacemos una petición de rate_limit_status, veremos como Twitter nos informa que disponemos de 20000 queries.
Espero que os haya sido útil e instructivo.

 

4 marzo, 2011

Escribir en el layout desde una vista: content_for

Archivado en: Ruby on Rails — xurdekio @ 12:51 pm
Tags: , , ,

En algunas ocasiones puntuales, por requerimientos de funcionalidad o de diseño, necesitaremos poder escribir desde una vista o un helper en algún lugar del layout que lo pinta (o desde un partial en la vista, etc…), esto podemos hacerlo en rails gracias al método content_for

Una de las maravillas de Rails es que las vistas se procesan al revés de como lo intuimos, se empieza por lo más pequeño hasta llegar al layout. Así es que primero se interpretan los partials, despues las vistas y por último el layout. Esto es lo que nos permite poder escribir desde la vista en el layout.

Vamos a ponernos en el caso de un layout con dos columnas (col_left, col_right), en el cual col_right no siempre va a tener contenido puesto que dependerá de la vista en la que estemos. En col_left tendremo la ya conocida instrucción yield, para pintar dentro la vista, y en col_right usaremos content_for con la etiqueta :col_right.

<body>
 <div class="col_left">
   <%=yield%>
 </div>
 <div class="col_right">
  <%=content_for :col_right%>
 </div>
</body>

Ahora, desde nuestra vista, necesitamos escribir el código que queremos que aparezca dentro de la columna derecha, para ello volvemos a recurrir a content_for, pero esta vez con un bloque que sera lo que se pinte en col_right.

<p>Esto se pinta en col_left</p>
<%content_for :col_right do%>
 <p>Sin embargo esto se pinta dentro de col_right</p>
<%end%>

Cómo nota extra vamos a suponer que no somos muy buenos con las css y queremos que nuestra col_left crezca cuando no existe contenido para col_right. Para ello no queremos que se pinte ese div y además le añadiremos un class al body usando el helper content_for?

<body <%= 'class="no-col-right"' unless content_for? :col_right %>>
 <div class="col_left">
   <%=yield%>
 </div>
<%if content_for? :col_right%>
 <div class="col_right">
  <%=content_for :col_right%>
 </div>
<%end%>
</body>

Podemos usar content_for tambien dentro de un helper, y por supuesto podemos usar tantas etiquetas y tantos content_for como queramos a lo largo de nuestros layouts y vistas.

6 febrero, 2011

Cambiando el servidor propio por sistemas low-cost

Archivado en: Sistemas — xurdekio @ 3:15 pm

Cuando estudiaba asignaturas de sistemas en la carrera me picó la curiosidad de los servidores y decidí montarme uno que tengo bajo mi escritorio. Fueron muchas horas de ensayo y error sobre un Pentium II con 128mb de RAM.
Aún recuerdo el stress cada vez que saltaba la luz en casa para reiniciarlo (hasta que decidí comprar un SAI), montar un sistema de backups etc. Pero ahora con mi próxima emancipación y los problemas con ya.com he decidido matarlo lentamente e ir distribuyendo por la nube los servicios que hasta ahora me ofrecía.
Principalmente el uso que estaba recibiendo era el de ser un servidor web para aplicaciones Rails (antes lo fue para aplicaciones PHP) y el acceso SFTP para tener mis archivos compartidos entre varios ordenadores.
Además hay que tener en cuenta que el coste de mantenimiento del servidor apenas son 3 o 4 euros al mes de consumo electrico no me tiene a cuenta alquilar hosting que me cobren 100€ anuales, con lo cual vamos a buscar soluciones low-cost.
En el tema del hosting rails era complicado hasta hace poco tiempo encontrar un servidor decente y barato, hasta la aparición de Heroku. Tras unos días reconvirtiendo las aplicaciones para que funcionasen correctamente en el nuevo servidor ya estan desplegadas en Heroku. Los mayores problemas fueron:

  • Heroku no da almacenamiento y una de las aplicaciones almacena fotos y códigos de barras. Para ello hubo que recurrir a Amazon S3 y cambiar la gema upload-column por paperclip que da soporte para S3.
  • En el cambio de gema, necesite tambien actualizar Rails en la aplicación, de 2.0.2 a 2.3.10
  • Heroku usa PostgreSQL con lo que algunas consultas específicas de MySQL de la aplicación dejaron de funcionar y hubo que reescribirlas
  • Por ultimo, en Heroku no puedes acceder al sistema de ficheros, tan solo puedes escribir en tmp, lo que obligó a reescribir algunos métodos

En apenas unas horas ya estaba la app funcionando.

Para solucionar el tema de la compartición de archivos, teniendo en cuenta que Heroku no te da espacio para ello, y que los servidores FTP decentes cuestan un dinero.. he optado por Dropbox.
Dropbox te permite tenere una carpeta compartida en varios ordenadores a través de la nube. Es gratuito hasta 2Gb (ampliable a 8Gb con un programa de referencias a amigos) y es una maravilla para compartir cosas rapidamente.
Así, con un par de servicios gratuitos y muy decentes conseguimos quitarnos de la dependencia de un servidor ya obsoleto y moribundo y el único coste que existe ahora es el de Amazon S3, gratuito durante el primer año hasta 15Gb, y luego en una estimación del uso de mis webs, saldrá por poco mas de 1€ mensual con lo cual además de mejorar los servicios del servidor nos ahorramos unos eurillos.

21 noviembre, 2010

Ruby: Diferencias entre “and” y “&&”, “or” y “||”

Archivado en: Ruby,Tips&Tricks — xurdekio @ 12:43 pm
Tags: , ,

Hace unos días me preguntaban por la diferencia en ruby sobre los operadores en sus diferentes formas, esto es and Vs. && y or Vs. ||.
Mucha gente piensa que uno de los dos no sigue los atajos de los circuitos lógicos, sin embargo esto es falso. Las dos formas son igual de eficientes a la hora de evaluarse, es decir, en caso de and y && si la primera condición es falsa no se evalua la segunda, y en caso de or y || si la primera condición es verdadera no se evalua la segunda.
Ahora bien, la diferencia se encuentra en la preferencia de los operadores a la hora de evaluarse. && y || tienen mas preferencia que and y or. Para verlo claramente:

 a = false or true #=> true
 a #=> false

 a = false || true #=> true
 a #=> true

En el primer caso se evalua antes el operador =, con lo que a la variable a se le asigna el valor false. Sin embargo el resultado de la operación es true.
En el segundo caso se evalua primero el operador ||. La expresion devuelve true y a la variable a se le asigna el valor true.

Espero que haya quedado claro, para cualquier cosa.. los comentarios!

11 noviembre, 2010

En IBCmass recibimos dos premios Sociedad de la Información

Recien llegado al nuevo trabajo, tanto que aun no me ha dado tiempo a escribir ningun post de código desde el aterrizaje, tocan buenas noticias sobre IBCmass.
Hemos recibido dos galardones por parte de la Sociedad de la Información para la empresa y para el buque insignia MySpySpot. En concreto:
* Premio a la mejor iniciativa para el desarrollo de la sociedad de la información en Asturias 2010
* Premio mejor iniciativa de la innovación TIC

Os dejo el enlace a la reseña en el blog de IBCmass dónde podeis encontrar mas información: IBCmass ganadora en los VI Premios Sociedad de la Información #premiosSI

Espero volver a escribir el próximo año sobre mas premios a los proyectos en los que participe en el desarrollo, y no solo trayendo la buena suerte!

20 octubre, 2010

Aterrizando en IBCmass!

Archivado en: En la vida hay mas cosas...,Proyectos — xurdekio @ 9:42 pm
Tags: , ,

Hace tiempo que no escribo nada, he estado bastante ocupado cambiando de aires, principalmente de trabajo.
Allá por finales de Agosto principios de Septiembre encontré una oferta para programador Rails en Asturias, mas en concreto en Oviedo y por intentarlo que no quedase! Asi que envie mi CV y finalmente, tras un par de entrevistas, firmé el precontrato con IBCmass.
Atrás queda casi 2 años y medio en Vorago, con todo el agradecimiento del mundo por la oportunidad y la formación, y por delante espero que muchos años en IBCmass.
En estos 3 días que llevo trabajando en el equipo de Fernando Milla ya he podido darme cuenta que la forma de trabajar es completamente diferente, es un equipo de I+D+i con todo lo que ello conlleva (montones de documentos de analisis, reuniones, ideas ‘en caliente’…) y la verdad es que creo que puedo aprender y aportar mucho!
Además, ya de rebote, seguro que esto conllevara muchos posts nuevos en el blog con nuevas y frescas ideas!
Lo dicho pues… declaro inagurada una nueva etapa!

28 septiembre, 2010

Salvando hashs, arrays y otros objetos no mapeables en columnas de texto

Archivado en: ActiveRecord,Ruby on Rails — xurdekio @ 12:00 pm
Tags: , , , , ,

Para hoy algo realmente interesante, que cuando lo ves te acuerdas de aquel proyecto en el que te hubiese venido genial saberlo.
En muchas ocasiones tenemos un hash de opciones, o un array con varios valores que nos gustaría salvar junto con el objeto, pero no hay ninguna estructura de base de datos que se acople a el.
Por ejemplo un usuario que tiene configuraciones sobre cuando quiere recibir emails. Lo ideal seria tener un hash de la siguiente manera:

 alert_me_on = {:new_message => true, :new_event => false, :new_board_message => true}

Para guardar esto en base de datos necesitaríamos 3 columnas en la tabla del usuario o bien una nueva tabla con las 3 columnas y la foreign key del usuario.
Sin embargo Rails nos permite guardar el hash tal cual en una columna de texto, utilizando para ello serialize:

 class User < ActiveRecord::Base
   serialize :alert_me_on, Hash
 end
 u = User.new
 u.alert_me_on = {:new_message => true, :new_event => false, :new_board_message => true}
 u.save
 u.alert_me_on[:new_message] #=> true

Realmente cómodo, y sirve también para arrays, structs… etc. Espero que no lo conocierais!

Edito: La solución es cómoda cuando NO vamos a realizar búsquedas por ese campo. Es decir si necesitamos traer todos los usuarios que requieren una notificación en concreto estamos ralentizando la búsqueda respecto a un campo booleano.

22 septiembre, 2010

Detectando cambios en los atributos: self.changes

Archivado en: Proyectos,Ruby on Rails,Tips&Tricks — xurdekio @ 9:25 am
Tags: , ,

Hoy se nos planteaba el problema de enviar un e-mail a los usuarios inscritos a un evento cuando cuando las fechas cambiasen, para así mantenerlos informados.
Como siempre Ruby y Rails al rescate con el metodo changes, que nos devuelve un completo hash con los cambios en el objeto, y va más allá incluso devolviéndonos el cambio exacto, es decir, estado anterior y estado actual del valor.

  evento = Evento.create(:titulo => "Prueba", :fecha_inicio => Date.today) #Creamos el evento con la fecha de hoy
  evento.fecha_inicio = Date.tomorrow #Cambiamos la fecha..
  evento.changes # Nos devuelve {"fecha_inicio" =>[Wed, 22 Sep 2010, Thu, 23 Sep 2010] }

Como veis, las keys del hash son los nombre de los atributos, y los values el array [valor_anterior, valor_actual].

En nuestro caso solo necesitábamos avisar a los usuarios si el evento estaba pendiente de fecha y ahora ya la tenía, así que aprovechando los callbacks nos queda algo así:

  def after_save
    #Si cambia la fecha de inicio (antes no la tenia y ahora si.. hay que mandar un mail a los inscritos)
    if self.changes.has_key?("fecha_inicio") and self.changes["fecha_inicio"][0].nil?
        self.inscripciones.all(:conditions => ["estado != ?",Inscripcion::ESTADO_CANCELADA]).each do |inscripcion|
          InscripcionMailer.deliver_nueva_fecha(inscripcion)
        end
    end
  end

No será un método desconocido para muchos de vosotros pero tampoco está de más recordar de vez en cuando su funcionamiento!

P.D.: Una vez que el objeto se ha salvado podeis recurrir al método previous_changes

Página siguiente »

El tema Rubric Blog de WordPress.com.

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.