Exception from open-uri

e$B1sF#$G$9!#e(B

open-uri e$B$r;H$C$FDj4|E*$Ke(B Web
e$B%Z!<%8$r<[email protected]$9$k%W%m%0%i%`$rAv$i$;$Fe(B
e$B$$$k$H!"<B$K$5$^$6$^$JNc30$,Ej$2$i$l$&$k$3$H$K5$$,$D$-$^$7$?!#e(B

e$B:#$N$H$3$m7P83$7$?$3$H$,$"$k$N$O0J2<$Ne(B 7 e$B$D$G$9e(B
(e$B7P83$7$?=ge(B) e$B!#e(B

  • Errno::ETIMEDOUT
  • OpenURI::HTTPError
  • Errno::ECONNRESET
  • Timeout::Error
  • EOFError
  • Errno::EHOSTUNREACH
  • SocketError

e$B$=$3$G<ALd$G$9!#e(B

  1. open-uri e$B$,Ej$2$&$kNc30$OB>$K$"$k$G$7$g$&$+e(B (Errno::*
    e$B$O$$$/$i$G$be(B
    e$B$"$j$=$&$G$9$,e(B) e$B!#e(B

  2. e$B$3$NCf$GK\MhEj$2$i$l$k$Y$-$G$J$$Nc30$O$J$$$G$7$g$&$+!#e(BEOFError
    e$B$Oe(B
    e$B>/$72x$7$$$H;W$C$F$$$^$9!#%P%[email protected]$H$7$F$be(B Net::HTTP e$B$+e(B
    Timeout e$B$N%P%0e(B
    [email protected]$H;W$$$^$9$,!#$A$J$_$K:F8=$5$;$kJ}K!$O$b$A$m$s$o$+$j$^$;$s!#e(B

  3. e$B$3$N>u67$KBP$7$F!"e(Bopen-uri
    e$B$N%f!<%6$O$I$N$h$&$KBP=h$9$k$3$H$,MW5ae(B
    e$B$5$l$F$$$k$N$G$7$g$&$+!#e(B4 e$B$D;W$$$D$-$^$7$?!#e(B

A. StandardError e$B$re(B rescue e$B$7$F$^$H$a$FBP=h$9$ke(B

B. open-uri
e$B$,Ej$2$&$kNc30$r$9$Y$FGD0.$7!"8D!9$KBP=h$9$k%3!<%I$r=q$/e(B

C. e$B$=$b$=$be(B robust [email protected]$,MW5a$5$l$k%W%m%0%i%`$Ge(B open-uri
e$B$de(B Net::HTTP
e$B$r;H$&$3$H$,A[Dj$5$l$F$$$J$$$N$G!";H$C$F$O$$$1$J$$e(B

D. e$B$=$b$=$be(B robust [email protected]$,MW5a$5$l$k%W%m%0%i%`$Ge(B Ruby
e$B$re(B (e$BN,e(B)

ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
e$B$G?=$7Lu$J$$$N$G$9e(B
e$B$,!"$=$l$>$l$NNc30$,Ej$2$i$l$?$H$-$N%H%l!<%9$r0J2<$KE=$jIU$1$^$9!#e(B

/usr/lib/ruby/1.8/net/http.rb:560:in initialize': Connection timed out - connect(2) (Errno::ETIMEDOUT) from /usr/lib/ruby/1.8/net/http.rb:560:inopen’
from /usr/lib/ruby/1.8/net/http.rb:560:in connect' from /usr/lib/ruby/1.8/timeout.rb:53:intimeout’
from /usr/lib/ruby/1.8/timeout.rb:93:in timeout' from /usr/lib/ruby/1.8/net/http.rb:560:inconnect’
from /usr/lib/ruby/1.8/net/http.rb:553:in do_start' from /usr/lib/ruby/1.8/net/http.rb:542:instart’
from /usr/lib/ruby/1.8/open-uri.rb:242:in open_http' from /usr/lib/ruby/1.8/open-uri.rb:616:inbuffer_open’
from /usr/lib/ruby/1.8/open-uri.rb:164:in open_loop' from /usr/lib/ruby/1.8/open-uri.rb:162:incatch’
from /usr/lib/ruby/1.8/open-uri.rb:162:in open_loop' from /usr/lib/ruby/1.8/open-uri.rb:132:inopen_uri’
from /usr/lib/ruby/1.8/open-uri.rb:518:in open' from /usr/lib/ruby/1.8/open-uri.rb:30:inopen’

/usr/lib/ruby/1.8/open-uri.rb:277:in open_http': 400 Bad Request (OpenURI::HTTPError) from /usr/lib/ruby/1.8/open-uri.rb:616:inbuffer_open’
from /usr/lib/ruby/1.8/open-uri.rb:164:in open_loop' from /usr/lib/ruby/1.8/open-uri.rb:162:incatch’
from /usr/lib/ruby/1.8/open-uri.rb:162:in open_loop' from /usr/lib/ruby/1.8/open-uri.rb:132:inopen_uri’
from /usr/lib/ruby/1.8/open-uri.rb:518:in open' from /usr/lib/ruby/1.8/open-uri.rb:30:inopen’

/usr/lib/ruby/1.8/net/protocol.rb:135:in sysread': Connection reset by peer (Errno::ECONNRESET) from /usr/lib/ruby/1.8/net/protocol.rb:135:inrbuf_fill’
from /usr/lib/ruby/1.8/timeout.rb:62:in timeout' from /usr/lib/ruby/1.8/timeout.rb:93:intimeout’
from /usr/lib/ruby/1.8/net/protocol.rb:134:in rbuf_fill' from /usr/lib/ruby/1.8/net/protocol.rb:116:inreaduntil’
from /usr/lib/ruby/1.8/net/protocol.rb:126:in readline' from /usr/lib/ruby/1.8/net/http.rb:2020:inread_status_line’
from /usr/lib/ruby/1.8/net/http.rb:2009:in read_new' from /usr/lib/ruby/1.8/net/http.rb:1050:inrequest’
from /usr/lib/ruby/1.8/open-uri.rb:248:in open_http' from /usr/lib/ruby/1.8/net/http.rb:543:instart’
from /usr/lib/ruby/1.8/open-uri.rb:242:in open_http' from /usr/lib/ruby/1.8/open-uri.rb:616:inbuffer_open’
from /usr/lib/ruby/1.8/open-uri.rb:164:in open_loop' from /usr/lib/ruby/1.8/open-uri.rb:162:incatch’
from /usr/lib/ruby/1.8/open-uri.rb:162:in open_loop' from /usr/lib/ruby/1.8/open-uri.rb:132:inopen_uri’
from /usr/lib/ruby/1.8/open-uri.rb:518:in open' from /usr/lib/ruby/1.8/open-uri.rb:30:inopen’

/usr/lib/ruby/1.8/timeout.rb:60:in rbuf_fill': execution expired (Timeout::Error) from /usr/lib/ruby/1.8/net/protocol.rb:134:inrbuf_fill’
from /usr/lib/ruby/1.8/net/protocol.rb:116:in readuntil' from /usr/lib/ruby/1.8/net/protocol.rb:126:inreadline’
from /usr/lib/ruby/1.8/net/http.rb:2020:in read_status_line' from /usr/lib/ruby/1.8/net/http.rb:2009:inread_new’
from /usr/lib/ruby/1.8/net/http.rb:1050:in request' from /usr/lib/ruby/1.8/open-uri.rb:248:inopen_http’
from /usr/lib/ruby/1.8/net/http.rb:543:in start' from /usr/lib/ruby/1.8/open-uri.rb:242:inopen_http’
from /usr/lib/ruby/1.8/open-uri.rb:616:in buffer_open' from /usr/lib/ruby/1.8/open-uri.rb:164:inopen_loop’
from /usr/lib/ruby/1.8/open-uri.rb:162:in catch' from /usr/lib/ruby/1.8/open-uri.rb:162:inopen_loop’
from /usr/lib/ruby/1.8/open-uri.rb:132:in open_uri' from /usr/lib/ruby/1.8/open-uri.rb:518:inopen’
from /usr/lib/ruby/1.8/open-uri.rb:30:in `open’

/usr/lib/ruby/1.8/net/protocol.rb:135:in sysread': end of file reached (EOFError) from /usr/lib/ruby/1.8/net/protocol.rb:135:inrbuf_fill’
from /usr/lib/ruby/1.8/timeout.rb:62:in timeout' from /usr/lib/ruby/1.8/timeout.rb:93:intimeout’
from /usr/lib/ruby/1.8/net/protocol.rb:134:in rbuf_fill' from /usr/lib/ruby/1.8/net/protocol.rb:116:inreaduntil’
from /usr/lib/ruby/1.8/net/protocol.rb:126:in readline' from /usr/lib/ruby/1.8/net/http.rb:2020:inread_status_line’
from /usr/lib/ruby/1.8/net/http.rb:2009:in read_new' from /usr/lib/ruby/1.8/net/http.rb:1050:inrequest’
from /usr/lib/ruby/1.8/open-uri.rb:248:in open_http' from /usr/lib/ruby/1.8/net/http.rb:543:instart’
from /usr/lib/ruby/1.8/open-uri.rb:242:in open_http' from /usr/lib/ruby/1.8/open-uri.rb:616:inbuffer_open’
from /usr/lib/ruby/1.8/open-uri.rb:164:in open_loop' from /usr/lib/ruby/1.8/open-uri.rb:162:incatch’
from /usr/lib/ruby/1.8/open-uri.rb:162:in open_loop' from /usr/lib/ruby/1.8/open-uri.rb:132:inopen_uri’
from /usr/lib/ruby/1.8/open-uri.rb:518:in open' from /usr/lib/ruby/1.8/open-uri.rb:30:inopen’

/usr/lib/ruby/1.8/net/http.rb:560:in initialize': No route to host - connect(2) (Errno::EHOSTUNREACH) from /usr/lib/ruby/1.8/net/http.rb:560:inopen’
from /usr/lib/ruby/1.8/net/http.rb:560:in connect' from /usr/lib/ruby/1.8/timeout.rb:53:intimeout’
from /usr/lib/ruby/1.8/timeout.rb:93:in timeout' from /usr/lib/ruby/1.8/net/http.rb:560:inconnect’
from /usr/lib/ruby/1.8/net/http.rb:553:in do_start' from /usr/lib/ruby/1.8/net/http.rb:542:instart’
from /usr/lib/ruby/1.8/open-uri.rb:242:in open_http' from /usr/lib/ruby/1.8/open-uri.rb:616:inbuffer_open’
from /usr/lib/ruby/1.8/open-uri.rb:164:in open_loop' from /usr/lib/ruby/1.8/open-uri.rb:162:incatch’
from /usr/lib/ruby/1.8/open-uri.rb:162:in open_loop' from /usr/lib/ruby/1.8/open-uri.rb:132:inopen_uri’
from /usr/lib/ruby/1.8/open-uri.rb:518:in open' from /usr/lib/ruby/1.8/open-uri.rb:30:inopen’

/usr/lib/ruby/1.8/net/http.rb:560:in initialize': getaddrinfo: Temporary failure in name resolution (SocketError) from /usr/lib/ruby/1.8/net/http.rb:560:inopen’
from /usr/lib/ruby/1.8/net/http.rb:560:in connect' from /usr/lib/ruby/1.8/timeout.rb:53:intimeout’
from /usr/lib/ruby/1.8/timeout.rb:93:in timeout' from /usr/lib/ruby/1.8/net/http.rb:560:inconnect’
from /usr/lib/ruby/1.8/net/http.rb:553:in do_start' from /usr/lib/ruby/1.8/net/http.rb:542:instart’
from /usr/lib/ruby/1.8/open-uri.rb:242:in open_http' from /usr/lib/ruby/1.8/open-uri.rb:616:inbuffer_open’
from /usr/lib/ruby/1.8/open-uri.rb:164:in open_loop' from /usr/lib/ruby/1.8/open-uri.rb:162:incatch’
from /usr/lib/ruby/1.8/open-uri.rb:162:in open_loop' from /usr/lib/ruby/1.8/open-uri.rb:132:inopen_uri’
from /usr/lib/ruby/1.8/open-uri.rb:518:in open' from /usr/lib/ruby/1.8/open-uri.rb:30:inopen’

In article [email protected],
Yusuke ENDOH [email protected] writes:

open-uri e$B$r;H$C$FDj4|E*$Ke(B Web e$B%Z!<%8$r<[email protected]$9$k%W%m%0%i%`$rAv$i$;$Fe(B
e$B$$$k$H!"<B$K$5$^$6$^$JNc30$,Ej$2$i$l$&$k$3$H$K5$$,$D$-$^$7$?!#e(B

e$B4q6x$J$3$H$K!";d$b;w$?$h$&$J$3$H$r$d$C$F$$$^$9!#e(B
samidare e$B$H$$$&%W%m%0%i%`$G$9$,!#e(B

  1. open-uri e$B$,Ej$2$&$kNc30$OB>$K$"$k$G$7$g$&$+e(B (Errno::* e$B$O$$$/$i$G$be(B
    e$B$"$j$=$&$G$9$,e(B) e$B!#e(B

e$B;d$,$d$C$F$$$k$b$N$N%m%0$r$$$^$7$i$Y$?$i!"$H$j$"$($:!"$"$2$ie(B
e$B$l$F$$$k0J30$Ke(B

Errno::ECONNREFUSED
Errno::ENETUNREACH

e$B$,8+$D$+$j$^$7$?!#e(B

  1. e$B$3$NCf$GK\MhEj$2$i$l$k$Y$-$G$J$$Nc30$O$J$$$G$7$g$&$+!#e(BEOFError e$B$Oe(B
    e$B>/$72x$7$$$H;W$C$F$$$^$9!#%P%[email protected]$H$7$F$be(B Net::HTTP e$B$+e(B Timeout e$B$N%P%0e(B
    [email protected]$H;W$$$^$9$,!#$A$J$_$K:F8=$5$;$kJ}K!$O$b$A$m$s$o$+$j$^$;$s!#e(B

EOFError e$B$O0JA0$J$K$+$N0{[email protected][email protected]$C$?3P$($,e(B
e$B$"$j$^$9!#e(B

  1. e$B$3$N>u67$KBP$7$F!"e(Bopen-uri e$B$N%f!<%6$O$I$N$h$&$KBP=h$9$k$3$H$,MW5ae(B
    e$B$5$l$F$$$k$N$G$7$g$&$+!#e(B4 e$B$D;W$$$D$-$^$7$?!#e(B

A. StandardError e$B$re(B rescue e$B$7$F$^$H$a$FBP=h$9$ke(B

e$B;d$,$d$C$F$$$k$b$N$r$_$?$i!"$3$l$G$7$?!#e(B

In article
[email protected],
Yusuke ENDOH [email protected] writes:

A. StandardError e$B$re(B rescue e$B$7$F$^$H$a$FBP=h$9$ke(B

e$B;d$,$d$C$F$$$k$b$N$r$_$?$i!"$3$l$G$7$?!#e(B

e$B!Ve(Bopen-uri e$B$r;H$&$H$-$Oe(B rescue StandardError e$B$G$/$k$!W$H$$$&e(B e$B%$%G%#%*%$,?d>)$5$l$k$o$1$G$9$+$M!#e(B

e$BJL$K?d>)$7$F$$$k$o$1$G$O$"$j$^$;$s!#e(B

e$B$7$+$7e(B open e$B$r%V%m%C%/IU$-$G;H$&$3$H$r9M$($k$H!"$=$l$O>/$7ITJX$G$9!#e(B

e$BF05!$O$o$+$j$^$9!#e(B

e$B$=$3$GDs0F$G$9$,!"e(Bopen-uri e$B$NFbIt$GH/@8$7$?Nc30$Oe(B open-uri e$B$NCf$Ge(B
e$B$9$Y$F=&$C$F!"e(BOpenURI::Error [email protected]$C$?L>A0$NNc30$K$/$k$s$GEj$2e(B
e$B$J$*$9$H$$$&$N$O$I$&$G$7$g$&$+!#e(B
e$B%f!<%6$Oe(B OpenURI::Error [email protected]$1$r=&$($P$$$$$H$$$&$3$H$K$J$C$F!"5$3Ze(B
e$B$G$9!#e(B

e$B$3$NLdBj$Oe(B open-uri e$B8GM-$NLdBj$K$O8+$($^$;$s!#e(B

e$B$D$^$j%V%m%C%/$D$-%a%=%C%I$NF~$l;R9=B$$HNc30JaB*$N$?$a$NF~$le(B
e$B;R9=B$$,0[$J$k$H$$$&LdBj$J$N$G!"$h$j0lHLE*$J2r$,K>$^$l$k$h$&e(B
e$B$K;W$$$^$9!#e(B

open-uri e$B$H$7$F$N2r7hK!$O!“8=;[email protected]$G$O!”%V%m%C%/$r$D$1$J$$$Ge(B
e$B;H$&$N$,$$$$$N$G$O$J$$$+$H;W$$$^$9!#e(B

e$BBP>]$,Bg$-$/$J$1$l$P!"e(BURI#read e$B$,$*A&$a$G$9!#e(B
(samidare e$B$O$=$&$7$F$$$^$9e(B)

e$B$"$k$$$O!"$I$&$7$F$b%V%m%C%/$r;H$$$?$1$l$P!";n$7$F$^$;$s$,%Ue(B
e$B%i%0$r;H$&$N$O$I$&$G$7$g$&$+!#e(B

done = false
begin
open(uri) {|f|
done = true

}
rescue StandardError
raise if done

end

e$B1sF#$G$9!#e(B

2009e$BG/e(B10e$B7ne(B3e$BF|e(B21:05 Tanaka A. [email protected]:

e$B$=$3$GDs0F$G$9$,!"e(Bopen-uri e$B$NFbIt$GH/@8$7$?Nc30$Oe(B open-uri e$B$NCf$Ge(B
e$B$9$Y$F=&$C$F!"e(BOpenURI::Error [email protected]$C$?L>A0$NNc30$K$/$k$s$GEj$2e(B
e$B$J$*$9$H$$$&$N$O$I$&$G$7$g$&$+!#e(B
e$B%f!<%6$Oe(B OpenURI::Error [email protected]$1$r=&$($P$$$$$H$$$&$3$H$K$J$C$F!"5$3Ze(B
e$B$G$9!#e(B

e$B$3$NLdBj$Oe(B open-uri e$B8GM-$NLdBj$K$O8+$($^$;$s!#e(B

e$B$=$NDL$j$G$9!#%a!<%k$rAw$C$?D>8e$K5$$,$D$-$^$7$?$,!"e(Bopen-uri
e$B$Oe(B
e$B;HMQIQEY$N$o$j$KNc30$,B?<oB?MM$9$.$?$?$a$K:[email protected]$1e(B
e$B$G$7$?!#e(B

e$B$D$^$j%V%m%C%/$D$-%a%=%C%I$NF~$l;R9=B$$HNc30JaB*$N$?$a$NF~$le(B
e$B;R9=B$$,0[$J$k$H$$$&LdBj$J$N$G!"$h$j0lHLE*$J2r$,K>$^$l$k$h$&e(B
e$B$K;W$$$^$9!#e(B

e$B$&!<$s!#$I$s$J$N$,9M$($i$l$k$G$7$g$&$M!#e(B

open-uri e$B$H$7$F$N2r7hK!$O!“8=;[email protected]$G$O!”%V%m%C%/$r$D$1$J$$$Ge(B
e$B;H$&$N$,$$$$$N$G$O$J$$$+$H;W$$$^$9!#e(B

e$BBP>]$,Bg$-$/$J$1$l$P!"e(BURI#read e$B$,$*A&$a$G$9!#e(B
(samidare e$B$O$=$&$7$F$$$^$9e(B)

Kernel#open e$B$HF1$8$h$&$K;H$($k$H$$$&e(B open-uri e$B$N$"$j$,$?$_$,e(B
e$B$A$g$C$H8:$C$?5$$,$7$^$7$?$,!“e(BKernel#open e$B$K$b;w$?LdBj$O$”$ke(B
e$B$o$1$G$9$M!#$H$j$"$($:N;2r$7$^$7$?!#e(B

raise if done

end

e$B$&!<$s!D!D!#e(Brescue e$B$K%,!<%I$,=q$1$l$P$b$&>/$79,$;$=$&!#e(B

e$B1sF#$G$9!#e(B

2009e$BG/e(B10e$B7ne(B3e$BF|e(B15:48 Tanaka A. [email protected]:

In article [email protected],
Yusuke ENDOH [email protected] writes:

open-uri e$B$r;H$C$FDj4|E*$Ke(B Web e$B%Z!<%8$r<[email protected]$9$k%W%m%0%i%`$rAv$i$;$Fe(B
e$B$$$k$H!"<B$K$5$^$6$^$JNc30$,Ej$2$i$l$&$k$3$H$K5$$,$D$-$^$7$?!#e(B

e$B4q6x$J$3$H$K!";d$b;w$?$h$&$J$3$H$r$d$C$F$$$^$9!#e(B
samidare e$B$H$$$&%W%m%0%i%`$G$9$,!#e(B

e$B$J$k$[$Ie(B (e$B>Pe(B)

  1. open-uri e$B$,Ej$2$&$kNc30$OB>$K$"$k$G$7$g$&$+e(B (Errno::* e$B$O$$$/$i$G$be(B
    e$B$"$j$=$&$G$9$,e(B) e$B!#e(B

e$B;d$,$d$C$F$$$k$b$N$N%m%0$r$$$^$7$i$Y$?$i!"$H$j$"$($:!"$"$2$ie(B
e$B$l$F$$$k0J30$Ke(B

Errno::ECONNREFUSED
Errno::ENETUNREACH

e$B$,8+$D$+$j$^$7$?!#e(B

e$B$&$&!"$"$j$,$H$&$4$6$$$^$9!#$H$j$"$($:<j85$G$bBP=h$7$F$*$-$^$9!#e(B

  1. e$B$3$NCf$GK\MhEj$2$i$l$k$Y$-$G$J$$Nc30$O$J$$$G$7$g$&$+!#e(BEOFError e$B$Oe(B
    e$B>/$72x$7$$$H;W$C$F$$$^$9!#%P%[email protected]$H$7$F$be(B Net::HTTP e$B$+e(B Timeout e$B$N%P%0e(B
    [email protected]$H;W$$$^$9$,!#$A$J$_$K:F8=$5$;$kJ}K!$O$b$A$m$s$o$+$j$^$;$s!#e(B

EOFError e$B$O0JA0$J$K$+$N0{[email protected][email protected]$C$?3P$($,e(B
e$B$"$j$^$9!#e(B

e$B$&!<$s!"e(Bredmine e$B$KEPO?$9$Y$-$+!#e(B

  1. e$B$3$N>u67$KBP$7$F!"e(Bopen-uri e$B$N%f!<%6$O$I$N$h$&$KBP=h$9$k$3$H$,MW5ae(B
    e$B$5$l$F$$$k$N$G$7$g$&$+!#e(B4 e$B$D;W$$$D$-$^$7$?!#e(B

A. StandardError e$B$re(B rescue e$B$7$F$^$H$a$FBP=h$9$ke(B

e$B;d$,$d$C$F$$$k$b$N$r$_$?$i!"$3$l$G$7$?!#e(B

e$B!Ve(Bopen-uri e$B$r;H$&$H$-$Oe(B rescue StandardError
e$B$G$/$k$!W$H$$$&e(B e$B%$%G%#%*%$,?d>)$5$l$k$o$1$G$9$+$M!#e(B

e$B$7$+$7e(B open
e$B$r%V%m%C%/IU$-$G;H$&$3$H$r9M$($k$H!"$=$l$O>/$7ITJX$G$9!#e(B

open(“http://…”) do |fh|
… # (A)
end

e$B$re(B

begin
open(“http://…”) do |fh|
… # (A)
end
rescue StandardError
… # (B)
end

e$B$H$7$?>l9g!“e(B(A) e$B$NCf$GH/@8$7$?Nc30$,A4Ite(B (B)
e$B$K=&$o$l$F$7$^$$$^$9!#e(B
(A) e$B$NCf$K%P%0$,$”$C$FNc30$,Ej$2$i$l$?>l9g$J$I$O!"e(B(B)
e$B$G=&$o$:$K30$Ke(B
e$BEj$2$FM_$7$$$H;W$$$^$9!#e(B

e$B$=$3$GDs0F$G$9$,!"e(Bopen-uri e$B$NFbIt$GH/@8$7$?Nc30$Oe(B open-uri
e$B$NCf$Ge(B
e$B$9$Y$F=&$C$F!"e(BOpenURI::Error
[email protected]$C$?L>A0$NNc30$K$/$k$s$GEj$2e(B
e$B$J$*$9$H$$$&$N$O$I$&$G$7$g$&$+!#e(B
e$B%f!<%6$Oe(B OpenURI::Error
[email protected]$1$r=&$($P$$$$$H$$$&$3$H$K$J$C$F!"5$3Ze(B
e$B$G$9!#e(B

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs