Ruby 1.8.5 en Leopard

enviat per Ramon Salvadó el dilluns 12 de Novembre del 2007 a les 22:08 hores

Leopard porta tot l’entorn de desenvolupament per a Ruby on Rails i Ruby integrat, cosa que està molt bé ja que facilita enormement l’arrencada de la gent que comença a desenvolupar amb aquestes tecnologies.

La versió de Ruby instal·lada es la 1.8.6 (amb alguns patchs interessants com ara el de suport per a dtrace). Algunes distribucions com ara centos 5 o debian etch utilitzen la versió 1.8.5. Això vol dir que si tenim aplicacions en producció corrent sobre aquestes distribucions probablement voldrem desenvolupar sobre la mateixa versió de Ruby per tal d’evitar “sorpreses”.

Per a aconseguir això podem compilar directament dels fonts o utilitzar macports. La cosa es que en el cas de voler utilitzar macports ens trobarem que no existeix variant per la versió 1.8.5.

El que podem fer es crear el nostre port a partir de la revisió de subversion del repositori macports del port de ruby que es corresponia a la versió 1.8.5:

Primer hem de crear un repositori de ports local:

1
2
mkdir /Users/Shared/dports
sudo sed -e '1i file:///Users/Shared/dports' -i~ /opt/local/etc/macports/sources.conf

Seguidament treiem la versió del repositori que ens interessi:

1
2
3
cd /Users/Shared/dports
svn co --revision 21487 http://svn.macports.org/repository/macports/trunk/dports/lang/ruby/ lang/ruby/
portindex /Users/Shared/dports

Llavors en un món ideal ja podríem instal·lar fent:


sudo port install ruby

I això instal·laria la versió del port en el nostre repositori local (1.8.5), el que passa es que per a que Ruby funcioni en Leopard cal aplicar uns patchs d’apple al codi font segons s’explica aquí

Així doncs el que caldrà fer es descarregar els fitxers dels patchs al directori files del nostre port i modificar el fixter Portfile per a que els apliqui. Si fem això veurem que s’apliquen netament excepte un que falla degut a que aquests patchs estan pensats per a la versió 1.8.6 de Ruby.

El que cal fer quan falla la instal·lació és anar al directori de treball del port, revisar el patch que falla i veure si podem modificar-lo per a aplicar-lo a la versió 1.8.5.

La modificació és molt senzilla, es tracta del fitxer ignore-gsetcontext.diff i un cop modificat per a la versió 1.8.5 queda així:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
--- eval.c.orig        2007-10-31 12:03:10.000000000 +0100
+++ eval.c        2007-10-31 12:03:10.000000000 +0100
@@ -29,9 +29,17 @@
 #endif
 
 #include <stdio>
-#if defined(HAVE_GETCONTEXT) && defined(HAVE_SETCONTEXT)
-#include <ucontext>
-#define USE_CONTEXT
+#if defined(HAVE_GETCONTEXT) && defined(HAVE_SETCONTEXT) 
+# if defined(__APPLE__)
+#   include <availabilitymacros>
+#   if MAC_OS_X_VERSION_MAX_ALLOWED <= 1040
+#     include <ucontext>
+#     define USE_CONTEXT
+#   endif
+# else
+#   include <ucontext>
+#   define USE_CONTEXT
+# endif
 #endif
 #include <setjmp>

Arribats a aquest punt podem instal·lar el port amb la comanda habitual:


sudo port install ruby

Un cop fet tot això disposarem de 2 versions de ruby instal·lades la 1.8.6 que es la que ve per defecte en Leopard i la 1.8.5 que es la que hem instal·lat via macports.

Podem fer servir una o altra segons ens convingui en funció de l’ordre de càrrega dels binaris de macports en la nostra variable PATH, si posem primer la de macports (/opt/local/bin i /opt/local/sbin) s’utilitzarà per defecte la versió 1.8.5 de Ruby i en cas contrari la 1.8.6.

The Little Book of Ruby

enviat per Ramon Salvadó el dissabte 17 de Març del 2007 a les 21:49 hores

Avui he trobat aquest llibre que es pot descarregar en format PDF, que pot ser útil com a introducció ràpida al llenguatge Ruby per als que començen:

The Little Book Of Ruby is a PDF eBook which will guide you through the fundamentals of Ruby programming. Starting with the basics (strings, numbers, objects and methods) it quickly moves on to explain all you need to know to create your own class hierarchies, use arrays, hashes, iterators, modules, mixins and much more besides…

Sembla ser que algú l’ha traduït al brasiler i ha tingut bastant d’èxit.

Encriptació de passwords per a l'useradd

enviat per Ramon Salvadó el dimarts 13 de Març del 2007 a les 15:44 hores

Micro-script ruby per a utilitzar a la comanda useradd amb la opció -p a la que hem de passar el password encriptat. Bàsicament això pot ser útil per a la creació automatitzada d’usuaris de sistema.

1
2
#!/usr/bin/ruby
print ARGV[0].crypt("seedtext") if ARGV.size == 1

Aquest script reb com a parametre el password de debò i retorna la versió encriptada, exemple d’ús suposant que hem anomenat crypt al script:


useradd -m -k /etc/myskel -g mygroup -p `pwgen | awk {"print $1"} | xargs ./crypt` -d /home/testuser2 testuser2

Pair programming script

enviat per Ramon Salvadó el divendres 2 de Març del 2007 a les 18:15 hores

Aquest script és per a generar parelles pel pair programming i enviar un correu amb les mateixes setmanalment via cron.

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/ruby

programadors = %w( Ramon Carles Aleix Marc Oscar Jordi Guillem Francesc Miquel)
subject = "Programming pairs for the #{Time.now.strftime("%Uth week of %Y")}"
pairs = "Programing pairs:\n"

while programadors.size > 0 do
  pairs << programadors.delete_at(rand(programadors.size)) + " -- " + programadors.delete_at(rand(programadors.size)) + "\n"
end

`echo "#{pairs}" | iconv -f utf-8 -t iso-8859-1 | mail -s "#{subject}" programadors@company.com`

Maneres de millorar-lo, fer-lo més DRY, curt o més idiomàtic?

Instal·lació Ruby, Rails i PostgreSQL en MacOSX

enviat per Ramon Salvadó el dimecres 14 de Febrer del 2007 a les 15:51 hores

Hem trobo que de tant en tant he d’instal·lar tot l’entorn de desenvolupament rails per a un amic que m’ho demana per provar-ho. De fet a força de fer-ho vàries vegades al final vaig automatitzar-ho amb una tasca de capistrano per alleugerir el procés.

Per a que hem serveixi de referència per al pròxim cop (cas que no tingui el meu macbook a mà) els passos a seguir són:

1. Instal·lar les “Xcode tools” (que es troben el els CD’s de sistema), pel compilador.

2. Instal·lar darwinports i actualitzar-lo:

1
2
sudo port selfupdate
sudo port sync

3. Instal·lar programari necessari (ruby, ruby-gems, postgres, etc):


sudo port install screen subversion postgresql81 ruby rb-rubygems

4. Instal·lar les gems que ens interessin, per exemple:


sudo gem install rails rcov gettext mongrel gettext zentest postgres --include-dependencies

5. Preparar la gem del postgres(requereix de fer un petit “hack” per a que trobi les llibreries al compilar) i inicialitzar la base de dades:

1
2
3
4
5
6
7
cd /opt/local/lib/ruby/gems/1.8/gems/postgres-0.7.1
sudo ruby extconf.rb --with-pgsql-include=/opt/local/include/pgsql8 --with-pgsql-lib=/opt/local/lib/pgsql8
sudo make && sudo make install
# Per si de cas
sudo gem install postgres
# Inicialitzem la base de dades (al directori que ens sembli adient)
/opt/local/lib/postgresql81/bin/initdb -D development/pgdata

6. Inicialitzar la base de dades i comprovar que tot funciona amb un projecte de test:

1
2
3
4
5
# Iniciar postgres
pg_ctl -D /development/pgdata -l ~/development/pgdata/psql.log start
# Per aturar-lo pg_ctl -D ~/development/pgdata stop
# Crear un projecte rails per a testejar que tot funciona correctament
rails -d postgresql testproject

7. Opcionalment, continuar la configuració segons aquest post.

require_gem

enviat per Ramon Salvadó el dijous 8 de Febrer del 2007 a les 16:35 hores

De vegades ens trobem que necessitem especificar una versió o versions concretes d’una gem en el nostre codi.

Per exemple, normalment per a utilitzar el gettext faríem:


require 'gettext'

Aquest comanda requeriría la darrera versió de la gem instal·lada al sistema, si volem ser més específics podriem fer:


require_gem 'gettext', '= 1.8.0'

Això requeriría una versió de gettext 1.8.0 específicament, també podríem fer:


require_gem 'gettext', '~> 1.9.0'

Això requeriría una versió de gettext de la serie 1.9.x

Això és una bona pràctica ja que ens permet reduir els problemes d’implementació de la nostra aplicació ja que podem especificar les versions o versions que sabem del cert que funcionaran correctament amb la nostra aplicació.

Customització irb

enviat per Ramon Salvadó el divendres 2 de Febrer del 2007 a les 10:55 hores

l’irb és una eina molt útil a l’hora de desenvolupar, ja que ens permet tant debugar com provar en temps real el codi.

Ara és possible també d’obtenir acoloriment de sintàxi, per a fer-ho primer haurem d’instalar una gem:


sudo gem install -y wirble

I després actualitzar el nostre .irbrc, que podría quedar així per exemple:

1
2
3
4
5
6
require 'irb/completion'
require 'rubygems'
require 'wirble'

ARGV.concat [ "--readline", "--prompt-mode", "simple" ]
Wirble.init

Aquest tipus de “trucos” són des meus preferits, petits detalls que faciliten la rutina diària enormement.

Font: ruby inside