Si quieres suscribirte al feed RSS del blog, este es el canal por defecto: http://www.sirius06.es/feed/
What do you need, besides a miracle? --- Guns. Lots of guns.

Publicado en Septiembre de 2009:

Phusion PassengerParece ser que una de las últimas versiones de Passenger (”mod_rails” para los amigos), la 2.2.4, tiene un bug bastante conocido pero sin solución aparente: la carpeta temporal se crea sin permisos de escritura.
Como en todos los lenguajes de servidor, a la hora de subir un archivo se copia el mismo a un directorio temporal, donde permanece hasta que la transferencia ha llegado al 100%. Como paso posterior a este, vendría el momento de moverlo a su ubicación definitiva, pero es mucho antes cuando ocurre el error que estamos tratando.

Si echamos un vistazo al log, veremos que el proceso falla porque dicho directorio no tiene permisos de escritura. Podríamos pensar en dárselos sin más, pero esto sería sólo una solución temporal, pues este path se renueva cada vez que reiniciamos el server. Para arreglar esto de forma definitiva, deberemos abrir el archivo “Utils.cpp” y buscar esta línea:

  1. makeDirTree(tmpDir + "/webserver_private", "u=wxs,g=,o=", workerUid, workerGid);

Una vez la hayamos encontrado, la sustituimos por esta y reiniciamos el proceso:

  1. makeDirTree(tmpDir + "/webserver_private", "u=wxs,g=wx,o=wx", workerUid, workerGid);

Fuente: Fermín, mi compañero de Jet. :D Yo estaba a su lado, pero en realidad el cerebrito de todo esto es él, ¡gracias tío! ;)

El primo de Zetapé

17/06/2009 - Zapatero: “No va a haber más subidas de impuestos”

Asegura que la subida del impuesto del tabaco “no es recaudatoria” y “es positiva para la sociedad”.

18/09/2009 - Salgado confirma que no subirá el IVA reducido

La vicepresidenta segunda, Elena Salgado, confirmó hoy que el Gobierno no aumentará el IVA superreducido, que grava con el 4% los productos de primera necesidad, a pesar de que, dijo, haya países que no lo tengan y cuya tributación más baja está en el entorno del 7%.

26/09/2009 - El Gobierno subirá el IVA dos puntos a partir de julio de 2010

El tipo general del IVA pasa del 16% al 18%; el reducido, del 7% al 8%.

SpotifyAunque hay infinidad de webs que ya han comentado esto que voy a poner, creo que nunca viene mal repetirlo una vez más, máxime cuando todavía hay mucha gente que no lo sabe:
Resulta que el equipo de Spotify mantiene que el servicio, al estar en versión beta, sólo puede ser usado si dispones de una invitación (tal y como pone en esta página: Get started), pero aun así hay una URL donde podemos ir y registrarnos sin esperas. Es esta:

https://www.spotify.com/en/get-started/

Si te apetece una tarde de música, date de alta y entra en SpotifyFriends, SpotifyList, SpotyList, YourSpotify, SpotifyLists o ElectroPlastas. En ellas podrás compartir tus listas y ver las de otros usuarios, descubriendo así cientos de artistas que hasta ahora te estabas perdiendo.

PostgreSQLRoR tiene muy buena integración con todos los tipos de BBDD existentes, aunque a veces su compatibilidad con algunas características deja mucho que desear. Este es el caso de los “schemas” de PostgreSQL, que para ser usados en la sentencia “set_table_name” de un modelo necesitan que pongamos el siguiente código en el fichero “environment.rb“:

  1. ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
  2.   def quote_table_name(name)
  3.     name
  4.   end
  5. end

Jet Multimedia (1)

Jet Multimedia (2)

Nieve en la calle y un café en la mesa… lo mejor si tienes que estar en la oficina. :)

“El club tiene la obligación de devolver a la sociedad parte de lo que nos da y la mejor forma de hacerlo es utilizando el fútbol como herramienta, para llevar esperanza a millones de niños vulnerables de todo el mundo”

Barça-UnicefEstas son las palabras de Joan Laporta, presidente del F. C. Barcelona, el día que decidió romper con la irracional aunque respetable tradición de no llevar publicidad en la camiseta del primer equipo. A diferencia de otros clubs, este hecho no le iba a reportar grandes beneficios, sino todo lo contrario

Según fuentes oficiales, además de llevar logo de Unicef en la elástica, el Barça se compromete a donar a esta ONG el 0,7% de sus ingresos durante 5 años. Si nos atenemos a informaciones que dicen que su presupuesto para este curso será de 315.000.000€, tenemos que regalarán alrededor de 2,2 kilazos sólo en 2009. Y eso sin tener en cuenta que lo más seguro es que aumente en los sucesivos, claro.

Sabiendo que el top de ingresos en este aspecto lo encabezan Madrid, Chelsea y Manchester, con 20, 16 y 15 millones anuales cada uno, ¿no sería más beneficioso para ambas partes que el Barça se embolsase una cantidad como esa, se quedase con la mitad y le diese otra mitad a la gente que más lo necesita?
De esa manera podrían aportar más del cuádruple a la causa, además de ganar otro tanto para invertirlo en fichajes no imperialistas ni prepotentes, sino ideados desde el ingenio y el esfuerzo.

No hay que ser muy listo para llegar a esa conclusión, digo yo… a menos que las intenciones sean otras. ;)

CSVSiguiendo con lo que os contaba en el post anterior, en otra ocasión tuve que importar un CSV, para lo cual disponemos del un módulo cojonudo con ese mismo nombre. Además de otras muchas cosas, nos permite leer y parsear un archivo con sólo escribir esto:

  1. CSV::Reader.parse(file, ';') do |row|
  2.   # Cálculos, operaciones, mandangas varias…
  3. end

Como veis, se trata de un bucle que saca una línea cada vez, permitiéndonos operar con ella como si de un array se tratase. Si en una de estas operaciones nos decidimos a insertar los datos directamente en la BBDD, podemos encontrarnos con el siguiente fallo:

  1. RuntimeError: ERROR    C22021    Minvalid byte sequence for encoding "UTF8": 0xe17271
  2. HThis error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".
  3. F.\src\backend\utils\mb\wchar.c    L1578
  4. Rreport_invalid_encoding: INSERT INTO personas (nombre, apellido) VALUES('Pepito', 'Garc?a') RETURNING id

Si nos fijamos en los valores del “insert” que intentamos ejecutar, vemos que hay una interrogación (que en este caso se corresponde con una “í“). Esto se debe a que, al ser de texto plano, el archivo no cuenta con ninguna indicación que le permita al parser saber qué codificación tiene, por lo que debemos decírselo nosotros con una simple instrucción que nos brinda “Iconv“:

  1. Iconv.conv('UTF-8', 'ISO-8859-15', campo)

Si conocemos el charset de entrada se lo podemos poner directamente (tal y como hemos hecho ahora). Sino, nos será de gran ayuda una librería como CharGuess, que se encarga de hacer diferentes comprobaciones para decirnos, finalmente, qué encoding cree que se ha encontrado. Es importante remarcar esto último, pues el resultado siempre será una mera conjetura de la aplicación, nunca una verdad absoluta.

File transferTrabajando con Ruby te das cuenta de que en Internet está todo lo que puedas imaginar. No necesitas cursos, profesores ni ejemplos. Nada. Cualquier ayuda extra es bien recibida, aunque sin ella también puedes llegar a la resolución de ese problema que te lleva comiendo la moral una semana.

Eso sí, ser autodidacta tiene dos grandes pegas:

  • Sólo aprendes lo que te exige la experiencia, el día a día.
  • Generalmente, inviertes más tiempo de lo deseable en ello.

Esta pequeña introducción viene a que el otro día, intentando hacer algo tan trivial como copiar un archivo de una ubicación a otra, me encontré con varias supuestas soluciones bastante confusas o erróneas. Pese a esto, que probablemente sea uno de los detonantes del segundo punto, conseguí llegar al final de la historia. Todo ello me llevó a querer postear más a menudo sobre temas breves, sencillos y que no deberían ser problemáticos, pero que a veces nos consumen más tiempo del que deberían…

Al grano

Según un montón de webs, basta con hacer un simple “File.copy“… Nada más lejos de la realidad, pues si lo intentamos sólo conseguiremos ver el siguiente error:

  1. undefined method 'copy' for File:Class

Como no queremos crear un nuevo objeto de la clase “File” ni nada parecido (que es lo que intuyo que necesita el comando anterior), debemos echar mano del módulo “FileUtils“. Este es el más indicado cuando queremos ejecutar métodos de bajo nivel, de entre los cuales elegiremos “copy_file“:

  1. FileUtils.copy_file origen, destino

Fácil, ¿no? :)