Category Archives: Programación

HowTo: Instalando unos buenos Railes [RoR]

rails.pngRuby es un lenguaje de script similar a python, que aunque no era muy conocido anteriormente (antes de RoR), gracias al framework RoR, está creciendo en popularidad a pasos agigantados y además por méritos propios.

El framework Rails se basa en el patrón de diseño MVC (model view controller). Igual otro día explico en detalle este patrón, pues es muy interesante. Ahora vayamos con la instalación de Rails, que es de lo que se trata en este post.

Podríamos hacer la instalación con un simple $ sudo aptitude install rails, pero es mejor instalarlo mediante Gem, un gestor de paquetes para ruby (algo así como PEAR para php o cpan.org para perl, o el propio apt-get para Debian)

Supongo que tenemos instalada una base de datos, por ejemplo MySQL, y repositorios universe de Ubuntu dapper (para otras distros se podrían aplicar todos los pasos, realizando, quizás, ciertas modificaciones…). Primero instalaremos Ruby y unos paquetes adicionales necesarios para el correcto funcionamiento de Gem

$ sudo aptitude install ruby irb rdoc libzlib-ruby libyaml-ruby liberb-ruby rdoc libdrb-ruby libyaml-ruby libzlib-ruby

irb es un entorno de ejecución interactivo de ruby, podemos ejecutarlo y hacer un hola mundo xD

$ irb
irb(main):001:0> print “hola mundo!”
hola mundo!=> nil

innncreible xD. Ahora instalemos Gem


$ cd /tmp && wget http://rubyforge.org/frs/download.php/28174/rubygems-0.9.5.tgz
$ tar xfz rubygems-0.8.11.tgz
$ cd rubygems-0.8.11/
$ sudo ruby setup.rb

Ok, ya lo tenemos instalado, para información de como funciona, ver aquí. Ahora para instalar rails solo tenemos que hacer:

$ sudo gem install rails --include-dependencies

Ya está!, tenemos Ruby On Rails instalado! Mooola. Vale, pero y ahora que hago?. Vamos a hacer un par de pruebas para ver que realmente funciona todo bien.

Suponemos que nuestro directorio de trabajo será ~/dev/rails, por ejemplo:

$ cd ~/dev
$ rails rails # el parametro es el nombre de la carpeta que creará
$ cd rails
$ script/server

Ok, ahora si entramos en http://localhost:3000/ veremos la pantalla de bienvenida de Rails. Vale, funcionar, funciona, o algo sale. Pero como pongo hago yo cosas?, eh?, eh?. Vamos a hacer un hola mundo!.

Paramos el servidor (ctrl+c) y ejecutamos

$ script/generate controller prueba
$ vim app/controllers/prueba_controller.rb # lo modificamos tal que asi:
$ more app/controllers/prueba_controller.rb
class PruebaController < ApplicationController def index render_text "hola mundo!" end def lalala render_text "como mola esto nano!" end end

$ script/server

Y al entrar a http://localhost:3000/prueba veremos nuestro gran hola mundo! :). Y entrando a http://localhost:3000/prueba/lalala veríamos el otro texto que hemos escrito. Inncreible xD.

Vale, ya hemos hecho una tontería, hagamos otra más cool. Al inicio de este coñazo HowTo dije que suponía que teníamos instalada MySQL (u otra BD). Instalemos soporte para ruby para nuestra base de datos

$ sudo aptitude install libmysql-ruby1.8 # o el equivalente para nuestra BD!
$ irb
irb(main):001:0> require "mysql"
=> true
irb(main):002:0> exit

Creamos un par de bases de datos y por temas de seguridad también sería aconsejable crear un usuario con permisos más restrictivo, usaré "root" por simplificar este howto

$ sudo mysql -u root -p
mysql> create DATABASE rails;
mysql> create DATABASE rails_test;
mysql> quit

Ahora vamos a decir a Rails cual es nuestra base de datos, editamos ~/dev/rails/config/database.yml quedando algo como esto:

$ more config/database.yml
development:
adapter: mysql
database: rails
username: root
password: NUESTRAPASS
host: localhost

test:
adapter: mysql
database: rails_test
username: root
password: NUESTRAPASS
host: localhost

production:
adapter: mysql
database: rails
username: root
password: NUESTRAPASS
host: localhost

Vale, todo perfecto. Ahora hagamos lo siguiente:

$ script/generate model Thing
$ vim db/migrate/001_create_things.rb
algo como esto (por ejemplo...):

class CreateThings < ActiveRecord::Migration def self.up create_table :things do |t| t.column :nombre, :string t.column :uso, :string t.column :cantidad, :integer end end def self.down drop_table :things end end

$ rake db:migrate
$ script/generate scaffold Thing AdminDeCosas
$ script/server

Ahora entrando a http://localhost:3000/AdminDeCosas podremos añadir entradas de "cosas", verlas, editarlas y borrarlas. Curioso, eh?

Para próximos posibles post me apunto integrarlo con apache y profundizar más en las posibilidades de Rails. Para cualquier duda, crítica, opinión, insulto o desvario mental, los comentarios ;).

Vencido por un par de alfombras

logo_CodeJamEurope.gif

Hoy era el tan esperado Google Code Jam, lo estaba esperando con bastantes ganas desde hace unos días y despues de volver de la rutina diaria, me he puesto a intentar resolver los problemas que te planteaban (dos, uno de 500ptos. y otro de 250ptos.) en un tiempo de 60minutos.
Al entrar te indicaban la sala que te correspondía (había 30 con unos 50-60 participantes, es decir unos 1500 en total así aproximadamente), con lo cual se evitarían (más o menos…) de posibles lammers que hubiesen registrado dos cuentas para entrar, ver los problemas, resolverlos con tiempo y luego entrar con otra cuenta (lo cual no apruebo :P, prefiero caer con honor que pasar haciendo trampas). Veo las puntuaciones de mi sala (así a ojo quedandote entre los 15 primeros te asegurabas pasar) y compruebo que eran relativamente bajas en general (con hacer 1pto, te ponías el 12º), como suponía que aún faltaría mucha gente de participar y veo que haciendo el segundo (el dificil) conseguiría ponerme entre los 5primeros aprox.(todo depende del tiempo…y no se, si de lo optimo que lo hicieras), así que todo afanoso abro el primer problema

Problema de los 500ptos, dado un entero ‘n’ que corresponda con la longitud de una cadena compuesta por A’s y B’s, cuenta el número total de cadenas posibles que se pueden formar que no tengan más de ‘w’ subcadenas invertibles (por ejemplo, BA invertible en AB). Realmente era algo más complejo, pero no me aclaraba y he empezado a pensar en la representación como binario de las cadenas (te dicen A y B, pero te podías representarlo con 0 y 1, y por lo tanto operar como un numero la cadena total) y despues de estar 20minutos y ver que a los 20minutos estaba igual que hace 10minutos, he decidido dejarlo e ir a por el otro problema. 🙁 Estaba pensando más en el tiempo que en el propio problema realmente…
El segundo problema, (de 250ptos, más facil) iba de alfombras, te daban las medidas de una habitación y tenías que dar las posibles posiciones de poner un par de alfombras con unas restricciones concretas:

  • No se podían solapar
  • Un lado de la alfombra no podía ser dos veces mayor que el otro
  • Se debía dejar, al menos, una unidad cuadrada libre de parqué, representaría la entrada de la habitacion
  • El par de alfombras podían ser de cualquier tipo de medidas, diferentes, iguales…
  • SOLO DEBÍA DE HABER UN HUECO

El último punto lo pongo en mayusculas, porque como estaba al final del todo, yo agil cual gorrión, no lo he leido hasta despues de ponerme como un cosaco a programar sin parar. Termino el caso y cuando voy a hacer las pruebas veo que los casos grandes no me salían (salían muchos más), y repasando el enunciado (por si algo lo había traducido mal…) veo que no había leido esa restricción. Despues de buscar un cuchillo para el suicidio y como debería de levantarme e ir a la cocina para ello, me pongo a intentar arreglar la cosa como sea, quedaban 5min y el contador iba bajando. No me ha dado tiempo :(. Si hubiese perdido algo más de tiempo leyendo atentamente este segundo problema hubiese podido completarlo a tiempo. Mala suerte y poca sangre fria he tenido :-/, no pasa nada, ha sido una hora muy divertida :), para el proximo año espero que lo hagan de nuevo! ahí estaré :). Espero que otros que participaban hayan tenido más suerte.

Null types

Lenguajes fuertemente tipados como C++, C#, java, etc… no soportan valores null para sus tipos primitivos. Erase una persona llamada Mihhon, programador perito, sabio entre todos los peritos, que venía de programar mucho en C a pelo, como los verdaderos hombres, como él deseaba seguir tratando con sus maravillosos y amados NULL’s se hizo una pequeña librería para arreglar este gran e inquietante problema:

static public final boolean isNull(double _value)
{
return (Math.abs(_value) < 0.0001);
}

static public final boolean isVeryNull(double _value)
{
return (Math.abs(_value) < 0.0000000001);
}

Posiblemente otros métodos de la librería serían:

boolean isTruelyNull(double _value)
boolean isReallyQuiteSpectacularlyNull(double _value)
boolean isNullToEndAllNull(double _value)
boolean isMoreNullThanTheOtherNull(double _value)

Script para coding time

Despues de casi 24h programando nonstop, al final se me ha ocurrido hacerme un mini-script para ir viendo como iba progresando xD, se que el número de las lineas que se van escribiendo no es muy importante (y muy variable dependiendo de cada uno y del lenguaje u otros aspectos), pero mientras escribes asqueroso código en Java (odio escribir código con Awt/Swing) sube la moral ver como aumentan las lineas xD. Vamos paranoya de estar programando demasiado tiempo seguido. Se podría hacer en bash en una linea, pero mola mas perl 😛


#!/usr/bin/perl
sub lineas
{
open(javaF, $_[0]);
@lines = ;
close(javaF);
scalar @lines;
}

$lines=0; $n = 0;
opendir(DIR, ".");
foreach(readdir(DIR))
{
if(/\.java$/io)
{
$n++;
$lines += lineas $_;
}
}
close DIR;
print "Hay $lines lineas en $n ficheros\n";

Ejemplo de ejecución:

[blaxter@helicon]:~/CPS/Proyectos/RegisterUp$ ./suma
Hay 2011 lineas en 9 ficheros

Ahora me acuerdo de un dato que había en mis apuntes de la asignatura de “Proyectos” que decían que la media productiva de un programador era de 20lineas/día o algo asi. Venga que llevo 10000% de productividad jaja. (En verdad el programa que estoy escribiendo es lo más tonto del mundo, así que debería haberme costado la mitad realmente :P, es lo que tiene ser a littlecico gork)

The code room

Code room es una especie de serie de capitulos de media hora que se cuelga en internet emitida por MSDN tv (microsoft). Trata que despues de un evento de microsoft (en el que se anuncia un producto y se muestra su uso y tal) se pillan a tres desarrolladores asistentes a dicha charla y se les encierra en una habitación con un único ordenador y un tiempo limitado para realizar una aplicación que se adapte a los requisitos funcionales que se les pide.

El proposito es claramente publicidad subliminal para microsoft (el primero que he visto ahora mismo, usando todo el rato productos microsoft…asp.net, sql server…) pero esta curioso verlo. Aunque al principio habia pensando que seria una competición entre los tres, lo cual creo que hubiese sido bastante mas divertido. Molaria un programa como este que fuese un poco mas largo y que fuese para construir alguna aplicación (o incrementar algo ya hecho, incrementar funcionalidad) compitiendo con otros, que se fuese viendo como va cada uno y tal xD. “The C0de challenge” o algo así xD

ps: visual studio es para n00bs

Script bitrateFind

Hace un par de meses hice un script para convertir música mp3 a un bitrate elegido por el usuario, ahora, dos meses despues, me encuentro con el problema de que no paro de añadir música a la colección, y al final no se que discos tengo a 128 (el bitrate que quiero) y cuales no.

Mirar cada disco uno a uno, no es una solución, pues me pegaría toda la tarde. Así que, como me aburro mucho estos días, esta mañana me he puesto ha hacer un script para que me diga que directorios tienen mp3’s con bitrate mayor a uno que le indico. Además como me gustan mucho las estadisticas, he hecho que salgan también unas estadisticas globales de los bitrates.

El uso del script es:

bitrateFind [-r|–round] Directorio_base

El parametro round significa si las estadisticas finales se darán redondeadas o no (se refiere a los bitrates, pues los mp3s con VBR al leerlos dan como valor de su bitrate la media, entonces si no se redondea, quedan muy feas las estadisticas xD).

Un ejemplo de ejecución sería este:

[blaxter@helicon]:~/C/BlaxMusic/Trapt$ bitrateFind –round .
*Analizando los mp3’s del directorio /media/C/BlaxMusic/Trapt
Analisis: 100% [============================]D 0h00m00s

Dirs with mp3’s with bitrate > 128
./Trapt
./Someone In Control

Con bitrate 128: 1 (4.3 %) ===>
Con bitrate 192: 11 (47.8 %) =============================>
Con bitrate 256: 11 (47.8 %) =============================>
-Un total de 23 mp3s analizados

Y otra ejecución podría ser esta :D:

[blaxter@helicon]:~/C/BlaxMusic$ bitrateFind –round .
*Analizando los mp3’s del directorio /media/C/BlaxMusic
Analisis: 100% [============================]D 0h02m18s

Dirs with mp3’s with bitrate > 128
./Second – Invisible
./Evanescence/Fallen (Brazil Edition)/cd2
./Evanescence/Performance Live/Live on DC101 24-02-03
(…aqui van muchos directorios mas…)
./Foo Fighters/Foo Fighters/(2003) One By One (Limited Edition)
./Foo Fighters/Foo Fighters/(2003) One By One (Limited Edition)/Bonus CD

Con bitrate < 112: 28 (0.6 %) ->
Con bitrate 112: 28 (0.6 %) ->
Con bitrate 128: 2810 (64.9 %) =======================================>
Con bitrate 160: 89 (2.1 %) =->
Con bitrate 192: 1022 (23.6 %) ==============->
Con bitrate 256: 294 (6.8 %) ====->
Con bitrate > 256: 56 (1.3 %) =>
-Un total de 4327 mp3s analizados

Parece que voy a tener que usar el otro script un poco xD. Pero al menos ahora ya se que tengo que convertir ;).

Aquí para descargarlo