我在上海

出張で上海にいます。今回は結構ゆっくり。6月13日(日)から6月16日(水)までいる予定。
6月16日(水)に、関空に行って、そのまま大阪で研修を受けます。これで念願の認定スクラムマスターになれます。

今日も明日も明後日も、現地の技術者と面談しっぱなし。
万博は行ってる暇無いかも。


写真は同行してる人たちと行ったレストランでの写真。
やっぱ中国、何食っても旨いっすわ。

料理 メバルを食う

メバルが398円で売ってたので買ってきました。
イサキ・イナダ・アジ・サンマは時々やるんですが、メバルは初。
身が柔らかくて大変なのでは?と思いましたが、意外と平気でした。

それにしてもメバルって肝がデカイんですね。
メバル旨い!ハマリそう。




こんな大きさ。俺の手との比較。ちなみに俺は身長175センチです。そこそこの大きさのメバル


三枚におろします。腹から包丁入れてハラワタ出して、頭落として、骨に沿って包丁入れて、ザクっと切り取ります。


腹の部分の肋骨があるので包丁で削ぎとっておきます。皮が旨そうなので、最初刺身にしようと思ったけど湯引きにしようと思います。ということでざるに入れたとこ。


熱湯を皮にだけかけます。皮があっという間にしなしな〜〜〜って縮みます。皮って火を入れないと固くて噛めないのに、火を入れると物凄く軟らかくなるんですね。不思議。


これを切って湯引きの刺身出来上がり。肝が旨そうだったので肝醤油にしてみました。旨かった。あとアラは味噌汁に。

こんだけ飲み屋で飲み食いしたら3000円くらいしそうだけど、自分でつくれば1000円もかかりません。

今夜も旨し。

特訓内容

今日も特訓、というか練習しました。
参考にさせていただいたのは
http://www.lab.ime.cmc.osaka-u.ac.jp/~kiyo/pub/lecture/unixpro/ruby/#basic
ですが、さすがに2005年のサイトだと、情報が結構古いみたいで、コンパイルエラーが結構出ました。
それはそれで勉強になりました。
以下は今日1時間くらいでやった内容です。調べたりしながらやってるのであんまり行数はありません。

あと今日知ったのが、Rubyにはインクリメント演算子が無い、ということ。有名な事なんでしょうけど、今日知った。。。

あとirbが固まる?みたいな現象が。昨日も出てましたが。最後が"になっちゃって、何も効かなくなってしまいます。。。
何でしょう?いわゆる固まった状態?


C:\Users\hangai_m>
C:\Users\hangai_m>edlin grep.rb
New file
*
*
*exit

C:\Users\hangai_m>
C:\Users\hangai_m>
C:\Users\hangai_m>
C:\Users\hangai_m>irb a = [123,"abc",[4,5,6]]
C:/Ruby19/lib/ruby/1.9.1/irb/magic-file.rb:7:in `initialize': No such file or directory - a (Errno::ENOENT)
from C:/Ruby19/lib/ruby/1.9.1/irb/magic-file.rb:7:in `open'
from C:/Ruby19/lib/ruby/1.9.1/irb/magic-file.rb:7:in `open'
from C:/Ruby19/lib/ruby/1.9.1/irb/input-method.rb:77:in `initialize'
from C:/Ruby19/lib/ruby/1.9.1/irb/context.rb:79:in `new'
from C:/Ruby19/lib/ruby/1.9.1/irb/context.rb:79:in `initialize'
from C:/Ruby19/lib/ruby/1.9.1/irb.rb:99:in `new'
from C:/Ruby19/lib/ruby/1.9.1/irb.rb:99:in `initialize'
from C:/Ruby19/lib/ruby/1.9.1/irb.rb:56:in `new'
from C:/Ruby19/lib/ruby/1.9.1/irb.rb:56:in `start'
from C:/Ruby19/bin/irb:12:in `<main>'

C:\Users\hangai_m>
C:\Users\hangai_m>
C:\Users\hangai_m>irb
irb(main):001:0> a = [123,"abc",[4,5,6]]
=> [123, "abc", [4, 5, 6]]
irb(main):002:0>
irb(main):003:0* p a
[123, "abc", [4, 5, 6]]
=> [123, "abc", [4, 5, 6]]
irb(main):004:0>
irb(main):005:0* a.each do |i|
irb(main):006:1* p i
irb(main):007:1> end
123
"abc"
[4, 5, 6]
=> [123, "abc", [4, 5, 6]]
irb(main):008:0>
irb(main):009:0* a.each do |i|
irb(main):010:1* puts i
irb(main):011:1> end
123
abc
4
5
6
=> [123, "abc", [4, 5, 6]]
irb(main):012:0>
irb(main):013:0*
irb(main):014:0* p "pとputsは違うのね"
"pとputsは違うのね"
=> "pとputsは違うのね"
irb(main):015:0>
irb(main):016:0* 1+2+3+4+5
=> 15
irb(main):017:0>
irb(main):018:0* class Fixnum
irb(main):019:1> def + (a)
irb(main):020:2> self * a
irb(main):021:2> end
irb(main):022:1> end
=> nil
C:/Ruby19/lib/ruby/site_ruby/1.9.1/rbreadline.rb:8446:in `_rl_find_next_mbchar': undefined method `force_encoding' for nil:NilClass (NoMethodError)
from C:/Ruby19/lib/ruby/site_ruby/1.9.1/rbreadline.rb:1692:in `block in expand_prompt'
from C:/Ruby19/lib/ruby/site_ruby/1.9.1/rbreadline.rb:1676:in `each'
from C:/Ruby19/lib/ruby/site_ruby/1.9.1/rbreadline.rb:1676:in `expand_prompt'
from C:/Ruby19/lib/ruby/site_ruby/1.9.1/rbreadline.rb:1765:in `rl_expand_prompt'
from C:/Ruby19/lib/ruby/site_ruby/1.9.1/rbreadline.rb:1790:in `rl_set_prompt'
from C:/Ruby19/lib/ruby/site_ruby/1.9.1/rbreadline.rb:4718:in `readline'
from C:/Ruby19/lib/ruby/site_ruby/1.9.1/readline.rb:40:in `readline'
from C:/Ruby19/lib/ruby/1.9.1/irb/input-method.rb:115:in `gets'
from C:/Ruby19/lib/ruby/1.9.1/irb.rb:139:in `block (2 levels) in eval_input'
from C:/Ruby19/lib/ruby/1.9.1/irb.rb:271:in `signal_status'
from C:/Ruby19/lib/ruby/1.9.1/irb.rb:138:in `block in eval_input'
from C:/Ruby19/lib/ruby/1.9.1/irb/ruby-lex.rb:189:in `call'
from C:/Ruby19/lib/ruby/1.9.1/irb/ruby-lex.rb:189:in `buf_input'
from C:/Ruby19/lib/ruby/1.9.1/irb/ruby-lex.rb:103:in `getc'
from C:/Ruby19/lib/ruby/1.9.1/irb/slex.rb:205:in `match_io'
from C:/Ruby19/lib/ruby/1.9.1/irb/slex.rb:75:in `match'
from C:/Ruby19/lib/ruby/1.9.1/irb/ruby-lex.rb:287:in `token'
from C:/Ruby19/lib/ruby/1.9.1/irb/ruby-lex.rb:263:in `lex'
from C:/Ruby19/lib/ruby/1.9.1/irb/ruby-lex.rb:234:in `block (2 levels) in each_top_level_statement'
from C:/Ruby19/lib/ruby/1.9.1/irb/ruby-lex.rb:230:in `loop'
from C:/Ruby19/lib/ruby/1.9.1/irb/ruby-lex.rb:230:in `block in each_top_level_statement'
from C:/Ruby19/lib/ruby/1.9.1/irb/ruby-lex.rb:229:in `catch'
from C:/Ruby19/lib/ruby/1.9.1/irb/ruby-lex.rb:229:in `each_top_level_statement'
from C:/Ruby19/lib/ruby/1.9.1/irb.rb:153:in `eval_input'
from C:/Ruby19/lib/ruby/1.9.1/irb.rb:70:in `block in start'
from C:/Ruby19/lib/ruby/1.9.1/irb.rb:69:in `catch'
from C:/Ruby19/lib/ruby/1.9.1/irb.rb:69:in `start'
from C:/Ruby19/bin/irb:12:in `<main>'

C:\Users\hangai_m>
C:\Users\hangai_m>irb
irb(main):001:0>
irb(main):002:0*
irb(main):003:0*
irb(main):004:0* class Fixnum
irb(main):005:1> def + (a)
irb(main):006:2> self * a
irb(main):007:2> end
irb(main):008:1> end
=> nil
C:/Ruby19/lib/ruby/site_ruby/1.9.1/rbreadline.rb:8446:in `_rl_find_next_mbchar': undefined method `force_encoding' for nil:NilClass (NoMethodError)
from C:/Ruby19/lib/ruby/site_ruby/1.9.1/rbreadline.rb:1692:in `block in expand_prompt'
from C:/Ruby19/lib/ruby/site_ruby/1.9.1/rbreadline.rb:1676:in `each'
from C:/Ruby19/lib/ruby/site_ruby/1.9.1/rbreadline.rb:1676:in `expand_prompt'
from C:/Ruby19/lib/ruby/site_ruby/1.9.1/rbreadline.rb:1765:in `rl_expand_prompt'
from C:/Ruby19/lib/ruby/site_ruby/1.9.1/rbreadline.rb:1790:in `rl_set_prompt'
from C:/Ruby19/lib/ruby/site_ruby/1.9.1/rbreadline.rb:4718:in `readline'
from C:/Ruby19/lib/ruby/site_ruby/1.9.1/readline.rb:40:in `readline'
from C:/Ruby19/lib/ruby/1.9.1/irb/input-method.rb:115:in `gets'
from C:/Ruby19/lib/ruby/1.9.1/irb.rb:139:in `block (2 levels) in eval_input'
from C:/Ruby19/lib/ruby/1.9.1/irb.rb:271:in `signal_status'
from C:/Ruby19/lib/ruby/1.9.1/irb.rb:138:in `block in eval_input'
from C:/Ruby19/lib/ruby/1.9.1/irb/ruby-lex.rb:189:in `call'
from C:/Ruby19/lib/ruby/1.9.1/irb/ruby-lex.rb:189:in `buf_input'
from C:/Ruby19/lib/ruby/1.9.1/irb/ruby-lex.rb:103:in `getc'
from C:/Ruby19/lib/ruby/1.9.1/irb/slex.rb:205:in `match_io'
from C:/Ruby19/lib/ruby/1.9.1/irb/slex.rb:75:in `match'
from C:/Ruby19/lib/ruby/1.9.1/irb/ruby-lex.rb:287:in `token'
from C:/Ruby19/lib/ruby/1.9.1/irb/ruby-lex.rb:263:in `lex'
from C:/Ruby19/lib/ruby/1.9.1/irb/ruby-lex.rb:234:in `block (2 levels) in each_top_level_statement'
from C:/Ruby19/lib/ruby/1.9.1/irb/ruby-lex.rb:230:in `loop'
from C:/Ruby19/lib/ruby/1.9.1/irb/ruby-lex.rb:230:in `block in each_top_level_statement'
from C:/Ruby19/lib/ruby/1.9.1/irb/ruby-lex.rb:229:in `catch'
from C:/Ruby19/lib/ruby/1.9.1/irb/ruby-lex.rb:229:in `each_top_level_statement'
from C:/Ruby19/lib/ruby/1.9.1/irb.rb:153:in `eval_input'
from C:/Ruby19/lib/ruby/1.9.1/irb.rb:70:in `block in start'
from C:/Ruby19/lib/ruby/1.9.1/irb.rb:69:in `catch'
from C:/Ruby19/lib/ruby/1.9.1/irb.rb:69:in `start'
from C:/Ruby19/bin/irb:12:in `<main>'

C:\Users\hangai_m>
C:\Users\hangai_m>
C:\Users\hangai_m>
C:\Users\hangai_m>irb
irb(main):001:0>
irb(main):002:0*
irb(main):003:0* def three_times
irb(main):004:1> yield
irb(main):005:1> yield
irb(main):006:1> yield
irb(main):007:1> end
=> nil
irb(main):008:0>
irb(main):009:0* i = i; three_times { i *= 2 }
NoMethodError: undefined method `*' for nil:NilClass
from (irb):9:in `block in irb_binding'
from (irb):4:in `three_times'
from (irb):9
from C:/Ruby19/bin/irb:12:in `<main>'
irb(main):010:0>
irb(main):011:0* three_times { print "abc\n" }
abc
abc
abc
=> nil
irb(main):012:0>
irb(main):013:0*
irb(main):014:0* def foo
irb(main):015:1> yield(1,2)
irb(main):016:1> end
=> nil
irb(main):017:0>
irb(main):018:0* foo {|a,b|
irb(main):019:1* p[a,b]
irb(main):020:1> }
NoMethodError: undefined method `[]' for nil:NilClass
from (irb):19:in `block in irb_binding'
from (irb):15:in `foo'
from (irb):18
from C:/Ruby19/bin/irb:12:in `<main>'
irb(main):021:0>
irb(main):022:0* string = "ABCDE"
=> "ABCDE"
irb(main):023:0> len = string.length
=> 5
irb(main):024:0>
irb(main):025:0* "ABCDE".length
=> 5
irb(main):026:0>
irb(main):027:0*
irb(main):028:0* =begin
irb(main):029:0= これはコメント。あんまり見たこと無くね?
irb(main):030:0= =end
irb(main):031:0*
irb(main):032:0*
irb(main):033:0* print "abc"; print "def"
abcdef=> nil
irb(main):034:0>
irb(main):035:0* VAR = "定数"
=> "定数"
irb(main):036:0> $var = "global hensu"
=> "global hensu"
irb(main):037:0>
irb(main):038:0* def func
irb(main):039:1> var = "local hensu"
irb(main):040:1> end
=> nil
irb(main):041:0>
irb(main):042:0* class Class
irb(main):043:1> @@var = "class hensu"
irb(main):044:1> def initialize
irb(main):045:2> @var = "instance hensu"
irb(main):046:2> end
irb(main):047:1> end
=> nil
irb(main):048:0>
irb(main):049:0* Class.new.initialize
NoMethodError: private method `initialize' called for #<Class:0x1d5ade0>
from (irb):49
from C:/Ruby19/bin/irb:12:in `<main>'
irb(main):050:0>
irb(main):051:0*
irb(main):052:0* a = 100
=> 100
irb(main):053:0> a,b = 10,20
=> [10, 20]
irb(main):054:0>
irb(main):055:0* a = (1+2)/(3-4) * 5
=> -15
irb(main):056:0>
irb(main):057:0* a = (1 &&2) and (3 || 4 ) or !(5)
=> 3
irb(main):058:0>
irb(main):059:0* a = 7 %2
=> 1
irb(main):060:0>
irb(main):061:0* a = 3 ** 0.5
=> 1.73205080756888
irb(main):062:0>
irb(main):063:0* 2 ** 2
=> 4
irb(main):064:0> 8 ** 2
=> 64
irb(main):065:0> 3 ** 2
=> 9
irb(main):066:0> 3 ** 0.3
=> 1.39038917031591
irb(main):067:0> 4 ** 0.5
=> 2.0
irb(main):068:0>
irb(main):069:0* 8 ** 0.5
=> 2.82842712474619
irb(main):070:0>
irb(main):071:0* a = (1 == 2 ) or (3 != 4) or (5 <6) or (7<=8)
=> true
irb(main):072:0>
irb(main):073:0*
irb(main):074:0* a = [1,2,3,4,5]
=> [1, 2, 3, 4, 5]
irb(main):075:0>
irb(main):076:0* b = [6,7,8,9,10]
=> [6, 7, 8, 9, 10]
irb(main):077:0>
irb(main):078:0* a.size
=> 5
irb(main):079:0>
irb(main):080:0* a | b
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
irb(main):081:0>
irb(main):082:0* a & b
=> []
irb(main):083:0>
irb(main):084:0* a -b
=> [1, 2, 3, 4, 5]
irb(main):085:0>
irb(main):086:0* a.shift
=> 1
irb(main):087:0>
irb(main):088:0* a
=> [2, 3, 4, 5]
irb(main):089:0> a.join("/")
=> "2/3/4/5"
irb(main):090:0>
irb(main):091:0* a <<6
irb(main):092:0" a
irb(main):093:0" ;
irb(main):094:0"
irb(main):095:0" ;
irb(main):096:0" aaaa
irb(main):097:0" exit
irb(main):098:0"
irb(main):099:0" ^C
irb(main):100:0" ^C
irb(main):101:0" ^C
irb(main):102:0" ^C
irb(main):103:0"
irb(main):104:0"
irb(main):105:0" ^C
irb(main):106:0" exit
irb(main):107:0"
irb(main):108:0" >
irb(main):109:0" <
irb(main):110:0"

SLIPKNOTのベーシスト、PAUL GRAYが死去

http://bit.ly/9RfChh
いやいやいやいやいやいや。ありえねーっつーの。
一昨年ライブ見たばっかだし。あの左利きのベース。
少なからずショックですわ・・・。
38って。。。若過ぎ。

特訓結果


今日も今日とて特訓です。
記号シリーズが一段落し、変数と定数シリーズを動かしてみています。
スコープの辺りの機能はjavaと変わらないので、「あ、これがあれね」という感じですが、publicとかprivateとかを@とか@@とかで表現するってのが新鮮。
以下コードとか実行例晒しです。
まあ誰の役にも立たないと思いますが、絵で言えば30秒ドローイングみたいなもんですかね。
例によってirbで叩いて確認しています。

何度も同じ名前でクラスとかメソッド作ってると怒れられるんですね。
それにしてもirbさまさま。

http://www.ruby-lang.org/ja/man/html/_CAD1BFF4A4C8C4EABFF4.html#a.c4.ea.bf.f4

irb(main):106:0* a = 10
=> 10
irb(main):107:0>
irb(main):108:0* p "a is #{a}"
"a is 10"
=> "a is 10"
irb(main):109:0>
irb(main):110:0*
irb(main):111:0* p((true and false))
false
=> false
irb(main):112:0>
irb(main):113:0* puts `ruby -h`
Usage: ruby [switches] [--] [programfile] [arguments]
  -0[octal]       specify record separator (\0, if no argument)
  -a              autosplit mode with -n or -p (splits $_ into $F)
  -c              check syntax only
  -Cdirectory     cd to directory, before executing your script
  -d              set debugging flags (set $DEBUG to true)
  -e 'command'    one line of script. Several -e's allowed. Omit [programfile]
  -Eex[:in]       specify the default external and internal character encodings
  -Fpattern       split() pattern for autosplit (-a)
  -i[extension]   edit ARGV files in place (make backup if extension supplied)
  -Idirectory     specify $LOAD_PATH directory (may be used more than once)
  -l              enable line ending processing
  -n              assume 'while gets(); ... end' loop around your script
  -p              assume loop like -n but print line also like sed
  -rlibrary       require the library, before executing your script
  -s              enable some switch parsing for switches after script name
  -S              look for the script using PATH environment variable
  -T[level]       turn on tainting checks
  -v              print version number, then turn on verbose mode
  -w              turn warnings on for your script
  -W[level]       set warning level; 0=silence, 1=medium, 2=verbose (default for level)
  -x[directory]   strip off text before #!ruby line and perhaps cd to directory
  --copyright     print the copyright
  --version       print the version
=> nil
irb(main):114:0>
irb(main):115:0*
irb(main):116:0*
irb(main):117:0*
irb(main):118:0* 2.times{
irb(main):119:1*   p defined?(v)
irb(main):120:1>   v=1
irb(main):121:1>   p v
irb(main):122:1> }
nil
1
nil
1
=> 2
irb(main):123:0>
irb(main):124:0* 4.times{
irb(main):125:1*   v  = 1
irb(main):126:1>   p v
irb(main):127:1>   v ++
irb(main):128:1* }
SyntaxError: (irb):128: syntax error, unexpected '}'
        from C:/Ruby19/bin/irb:12:in `<main>'
irb(main):129:0>
irb(main):130:0*
irb(main):131:0* 4.times{
irb(main):132:1*   v=1
irb(main):133:1>   p v
irb(main):134:1>   v++;
irb(main):135:1* }
SyntaxError: (irb):134: syntax error, unexpected ';'
        from C:/Ruby19/bin/irb:12:in `<main>'
irb(main):136:0>
irb(main):137:0* 4.times{
irb(main):138:1*   v=1
irb(main):139:1>   p v
irb(main):140:1> }
1
1
1
1
=> 4
irb(main):141:0>
irb(main):142:0* n=10
=> 10
irb(main):143:0> n.times{
irb(main):144:1*   p n
irb(main):145:1> }
10
10
10
10
10
10
10
10
10
10
=> 10
irb(main):146:0>
irb(main):147:0*
irb(main):148:0* class Foo
irb(main):149:1>   def initialize
irb(main):150:2>     @a = 1
irb(main):151:2>   end
irb(main):152:1>   def a
irb(main):153:2>     @a
irb(main):154:2>   end
irb(main):155:1>   def b
irb(main):156:2>     @b
irb(main):157:2>   end
irb(main):158:1> end
=> nil
irb(main):159:0>
irb(main):160:0* class Baa < Foo
irb(main):161:1>   def baa_a
irb(main):162:2>     @a
irb(main):163:2>   end
irb(main):164:1> end
=> nil
irb(main):165:0>
irb(main):166:0* p Foo.new.a
1
=> 1
irb(main):167:0>
irb(main):168:0* p Foo.new.b
nil
=> nil
irb(main):169:0>
irb(main):170:0* p Baa.new.baa_a
1
=> 1
irb(main):171:0>
irb(main):172:0*
irb(main):173:0* class Foo
irb(main):174:1>   @a=1
irb(main):175:1>   def self.a
irb(main):176:2>     @a
irb(main):177:2>   end
irb(main):178:1> end
=> nil
irb(main):179:0>
irb(main):180:0* class Baa < Foo
irb(main):181:1> end
=> nil
irb(main):182:0>
irb(main):183:0* p Foo.a
1
=> 1
irb(main):184:0>
irb(main):185:0* p Baa.a
nil
=> nil
irb(main):186:0>
irb(main):187:0*
irb(main):188:0*
irb(main):189:0* class Foo
irb(main):190:1>   @@foo = 1
irb(main):191:1>   def bar
irb(main):192:2>     puts @@foo
irb(main):193:2>   end
irb(main):194:1> end
=> nil
irb(main):195:0>
irb(main):196:0*
irb(main):197:0* Foo.new.bar
1
=> nil
irb(main):198:0>
irb(main):199:0* class Foo
irb(main):200:1>   @@foo = 1
irb(main):201:1> end
=> 1
irb(main):202:0>
irb(main):203:0* class Bar < Foo
irb(main):204:1>   p @@foo += 1
irb(main):205:1> end
2
=> 2
irb(main):206:0>
irb(main):207:0* class Baz < Bar
irb(main):208:1>   p @@foo += 1
irb(main):209:1> end
3
=> 3
irb(main):210:0>
irb(main):211:0* module Foo
irb(main):212:1>   @@foo = 1
irb(main):213:1> end
TypeError: Foo is not a module
        from (irb):211
        from C:/Ruby19/bin/irb:12:in `<main>'
irb(main):214:0>
irb(main):215:0*
irb(main):216:0* module Fox
irb(main):217:1>   @fox = 1
irb(main):218:1> end
=> 1
irb(main):219:0>
irb(main):220:0* class Bar
irb(main):221:1>   include Fox
irb(main):222:1>   p @@fox += 1
irb(main):223:1> end
NameError: uninitialized class variable @@fox in Bar
        from (irb):222:in `<class:Bar>'
        from (irb):220
        from C:/Ruby19/bin/irb:12:in `<main>'
irb(main):224:0>
irb(main):225:0*
irb(main):226:0* module Fox
irb(main):227:1>   @@fox = 1
irb(main):228:1> end
=> 1
irb(main):229:0>
irb(main):230:0* class Bar
irb(main):231:1>   include Fox
irb(main):232:1>   p @@fox += 1
irb(main):233:1> end
2
=> 2
irb(main):234:0>
irb(main):235:0* class Baz
irb(main):236:1>   include Foo
irb(main):237:1>   p @@foo += 1
irb(main):238:1> end
TypeError: wrong argument type Class (expected Module)
        from (irb):236:in `include'
        from (irb):236:in `<class:Baz>'
        from (irb):235
        from C:/Ruby19/bin/irb:12:in `<main>'
irb(main):239:0>
irb(main):240:0* class Baz
irb(main):241:1>   include Fox
irb(main):242:1>   p @@fox += 1
irb(main):243:1> end
3
=> 3
irb(main):244:0>
irb(main):245:0*
irb(main):246:0*
irb(main):247:0* $foobar = 222
=> 222
irb(main):248:0>
irb(main):249:0* class FooBar
irb(main):250:1>   def ppp
irb(main):251:2>     p $foobar
irb(main):252:2>   end
irb(main):253:1> end
=> nil
irb(main):254:0>
irb(main):255:0* FooBar.new.ppp
222
=> 222
irb(main):256:0>
irb(main):257:0*
irb(main):258:0* p __FILE__
"(irb)"
=> "(irb)"
irb(main):259:0>
irb(main):260:0* p __LINE__
260
=> 260
irb(main):261:0>
irb(main):262:0* class Foo
irb(main):263:1>   FOO = 'FOO'
irb(main):264:1> end
(irb):263: warning: already initialized constant FOO
=> "FOO"
irb(main):265:0>
irb(main):266:0*
irb(main):267:0*
irb(main):268:0* class C
irb(main):269:1> end
=> nil
irb(main):270:0>
irb(main):271:0* p C
C
=> C
irb(main):272:0>
irb(main):273:0* module M
irb(main):274:1>   I = 35
irb(main):275:1>   class C
irb(main):276:2>   end
irb(main):277:1> end
=> nil
irb(main):278:0>
irb(main):279:0* p M::I
35
=> 35
irb(main):280:0>
irb(main):281:0* p M::C
M::C
=> M::C
irb(main):282:0>
irb(main):283:0* p ::M
M
=> M
irb(main):284:0>
irb(main):285:0* M::NewConst = 777
=> 777
irb(main):286:0>
irb(main):287:0*

JRubyからJavaを呼ぶ

日本JRubyユーザ会に行ったとき、fujibeeさんのデモに感動したけどこれまでためしてませんでした。
http://fujibee.org/2010/05/22/jruby%E3%83%A6%E3%83%BC%E3%82%B6%E4%BC%9A%E3%81%AE%E6%99%82%E3%81%AE%E3%83%87%E3%83%A2/
で解説をしてくださっているのでやってみます。

まずはJRubyのインストール・・・ですが、俺先日インストールしちゃってたし。。。

インストールの仕方は、普通に
http://jruby.org/
から

JRuby 1.5.0 Windows Executable

というリンク先をクリックしてダウンロードしてダブルクリックしてインストールするだけです。何も考えてません。
fujibeeさんの説明だとrvmってのを使ってますが、使えると思うんですが、今回はjirbを使ってしまおうと思います。


コマンドプロンプトを立ち上げて、以下のように打ちます。

C:\Users\mitsuo>jirb
irb(main):001:0>
irb(main):002:0* require 'java'
=> true
irb(main):003:0> frame = javax.swing.JFrame.new("Hello,JRuby!")
=> #<Java::JavaxSwing::JFrame:0x4e21db>
irb(main):004:0> frame.layout = java.awt.GridLayout.new(5,1)
=> #<Java::JavaAwt::GridLayout:0x1751a9e>
irb(main):005:0> 1.upto(5) do |i|
irb(main):006:1*   frame.add(javax.swing.JButton.new("button #{i}"))
irb(main):007:1> end
=> 1
irb(main):008:0>

ここまでは画面は何も変わりません。
まあ、見れば分かる通り、ここまではオブジェクトを作ってるところまでですね。

irb(main):008:0> frame.visible = true
=> true

これをやると、以下の画面が表示されます。

おぉ、スゲエ。

さらに、続けてこれをやると・・・

irb(main):009:0> frame.set_size(200,300)
=> nil

以下の画面が!!

おぉぉぉ!!スゲエ!!!カッコイイ!!!ボタンをrubyでループ処理で5個出してるあたりがイイですね。


そんで最後は

irb(main):010:0> frame.default_close_operation = javax.swing.JFrame::EXIT_ON_CLOSE
=> 3

これで閉じられるようになりますな。

この「CUIGUIを動かす」という感覚に対して、俺はプラレス3四郎をイメージしました。


さて、こうなると、自分が作ったクラスをJRubyから呼ぶには??ってことをやりたくなります。
http://blogs.wankuma.com/kazuki/archive/2008/09/13/156481.aspx#
にしたがってやってみました。

てかもうAntの使い方忘れてる・・・。
かなり遠回り。


適当にクラス作ってjarにして、上記記事の通りやってみましたが・・

C:\Users\mitsuo>jirb
irb(main):001:0> require 'java'
=> true
irb(main):002:0> require 'SampleApp.jar'
LoadError: no such file to load -- SampleApp
        from c:/jruby-1.5.0/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31
:in `require'
        from c:/jruby-1.5.0/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31
:in `require'
        from (irb):2


ありゃりゃ。例外だ。
include対象のクラスはカレントパスになきゃだめなのかな?と思い、以下のようにやってみた。

C:\jruby-1.5.0>cd lib

C:\jruby-1.5.0\lib>jirb
irb(main):001:0>
irb(main):002:0* require 'java'
=> true
irb(main):003:0> require 'SampleApp.jar'
=> true
irb(main):004:0> include_class('com.bangucs.sample.SampleApp')
=> Java::ComBangucsSample::SampleApp
irb(main):005:0> sampleapp = com.bangucs.sample.SampleApp.new
=> #<Java::ComBangucsSample::SampleApp:0x23d275>

うむ、通ったっぽい。なるほどー。
でも・・・

irb(main):006:0> p sampleapp.greet('aaa')
irb(main):007:1'
irb(main):008:1' p sampleapp.greet("aaaa")
irb(main):009:1'
irb(main):010:1' puts sampleapp.greet('abab')
irb(main):011:1'


なぜか結果が表示されない・・・。というとこで時間切れ。
どうやら命令はきちんと通ってるっぽいので、動くことは動くんだろうと思います。

続きはまた今度。。。

rubyでFizzBuzz書いてみた

rubyってやつは記号が多いですね。。。
演算子かと思ったらメソッドだったりするし。なかなか慣れる事が出来てません。fizzbuzzすらも書けない・・・。
仕方がないのでirbを使って特訓しました。本とwebを見ながらひたすらirbで記号を中心にサンプル書いて動かすだけ。
で、そこまでやって、ようやくfizzbuzz壱号が書けました。

def fizzbuzz(n)
  
  for i in 1..n
    if i % 15 == 0 then
      p "fizzbuzz #{i} "
    elsif i % 5 == 0 then
      p "buzz  #{i} "
    elsif i % 3 == 0 then
      p "fizz #{i}"
    else
      p i
    end
  end
end
p fizzbuzz(100)


これを実行すると、1〜100まででfizzbuzzします。
実行結果は以下。

1
2
"fizz 3"
4
"buzz  5 "
"fizz 6"
7
8
"fizz 9"
"buzz  10 "
11
"fizz 12"
13
14
"fizzbuzz 15 "
16
17
"fizz 18"
19
"buzz  20 "
"fizz 21"
22
23
"fizz 24"
"buzz  25 "
26
"fizz 27"
28
29
"fizzbuzz 30 "
31
32
"fizz 33"
34
"buzz  35 "
"fizz 36"
37
38
"fizz 39"
"buzz  40 "
41
"fizz 42"
43
44
"fizzbuzz 45 "
46
47
"fizz 48"
49
"buzz  50 "
"fizz 51"
52
53
"fizz 54"
"buzz  55 "
56
"fizz 57"
58
59
"fizzbuzz 60 "
61
62
"fizz 63"
64
"buzz  65 "
"fizz 66"
67
68
"fizz 69"
"buzz  70 "
71
"fizz 72"
73
74
"fizzbuzz 75 "
76
77
"fizz 78"
79
"buzz  80 "
"fizz 81"
82
83
"fizz 84"
"buzz  85 "
86
"fizz 87"
88
89
"fizzbuzz 90 "
91
92
"fizz 93"
94
"buzz  95 "
"fizz 96"
97
98
"fizz 99"
"buzz  100 "
1..100
Complete(0)

"" がついてるのが気持ち悪いしロジックも洗練されてないけど、やっとこさ自分でイチから書けたので晒します。

ちなみに、irbでやってた特訓の結果は以下です。
楽器で言うところの運指の練習とかオルタネイトピッキングの練習みたいなもんですかね。

Microsoft Windows [Version 6.0.6002]
Copyright (c) 2006 Microsoft Corporation.  All rights reserved.

C:\Users\mitsuo>p(!true)
'p' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

C:\Users\mitsuo>
C:\Users\mitsuo>
C:\Users\mitsuo>irb
irb(main):001:0> p(!true)
false
=> nil
irb(main):002:0> p(!false)
true
=> nil
irb(main):003:0>
irb(main):004:0* p(!1=2)
SyntaxError: compile error
(irb):4: syntax error, unexpected '=', expecting ')'
p(!1=2)
     ^
        from (irb):4
irb(main):005:0> p(!2)
false
=> nil
irb(main):006:0> (!0)
=> false
irb(main):007:0> (!1)
=> false
irb(main):008:0>
irb(main):009:0*
irb(main):010:0* p(3!=5)
true
=> nil
irb(main):011:0>
irb(main):012:0* p(3!=3)
false
=> nil
irb(main):013:0>
irb(main):014:0* /xxx/ !~ yyy
NameError: undefined local variable or method `yyy' for main:Object
        from (irb):14
irb(main):015:0>
irb(main):016:0* /"aaaa"/ !~ "bb"
=> true
irb(main):017:0>
irb(main):018:0* /"aaaa"/ !~ "aaaa"
=> true
irb(main):019:0>
irb(main):020:0* /"aaaa"/ !~ "aaa"
=> true
irb(main):021:0> /"aaaa"/ !~ "aaaaaaa"
=> true
irb(main):022:0> p('%04b%04b' % [3, ~3]
irb(main):023:1> )
"00111100"
=> nil
irb(main):024:0> /'aaaa'/ =~ 'bbb'
=> nil
irb(main):025:0>
irb(main):026:0* /'aaaa'/ =~ 'aaaa'
=> nil
irb(main):027:0>
irb(main):028:0*
irb(main):029:0* p(?a)
97
=> nil
irb(main):030:0> p(?a)  #=>97
97
=> nil
irb(main):031:0>
irb(main):032:0* def aa?
irb(main):033:1>   return false
irb(main):034:1> end
=> nil
irb(main):035:0>
irb(main):036:0* p aa?
false
=> nil
irb(main):037:0>
irb(main):038:0* def ab?
irb(main):039:1>   (1 != 2) ? p(false) : true
irb(main):040:1> end
=> nil
irb(main):041:0>
irb(main):042:0* p ab?
false
nil
=> nil
irb(main):043:0>
irb(main):044:0*
irb(main):045:0*
irb(main):046:0* p ("a is #{a}")
NameError: undefined local variable or method `a' for main:Object
        from (irb):46
        from :0
irb(main):047:0>
irb(main):048:0*
irb(main):049:0*
irb(main):050:0* class  C
irb(main):051:1>   def foo
irb(main):052:2>     @foo
irb(main):053:2>   end
irb(main):054:1>   def foo=( v )
irb(main):055:2>     @foo = v
irb(main):056:2>   end
irb(main):057:1> end
=> nil
irb(main):058:0>
irb(main):059:0* c = C.new
=> #<C:0x42fd024>
irb(main):060:0> c.foo  = 5
=> 5
irb(main):061:0>
irb(main):062:0* p c.foo
5
=> nil
irb(main):063:0>
irb(main):064:0*
irb(main):065:0* class C
irb(main):066:1>   attr :foo,true
irb(main):067:1> end
=> nil
irb(main):068:0>
irb(main):069:0* c = C.new
=> #<C:0x42ed930>
irb(main):070:0> c.foo = 4
=> 4
irb(main):071:0> p c.foo
4
=> nil
irb(main):072:0> foo = bar
NameError: undefined local variable or method `bar' for main:Object
        from (irb):72
        from :0
irb(main):073:0> foo[0] = bar
NameError: undefined local variable or method `bar' for main:Object
        from (irb):73
        from :0
irb(main):074:0>
irb(main):075:0* foo.bar = baz
NameError: undefined local variable or method `baz' for main:Object
        from (irb):75
        from :0
irb(main):076:0>
irb(main):077:0*
irb(main):078:0*
irb(main):079:0*
irb(main):080:0*
irb(main):081:0* class C
irb(main):082:1>   def initialize
irb(main):083:2>     @ary = [0,1,2,3,4,5,6,7]
irb(main):084:2>   end
irb(main):085:1>   def [](i)
irb(main):086:2>     @ary[i*2]
irb(main):087:2>   end
irb(main):088:1>   def []=(i,v)
irb(main):089:2>     @ary[i*2] = v
irb(main):090:2>   end
irb(main):091:1> end
=> nil
irb(main):092:0>
irb(main):093:0* c = C.new
=> #<C:0x42c6bdc @ary=[0, 1, 2, 3, 4, 5, 6, 7]>
irb(main):094:0>
irb(main):095:0* p c[3]
6
=> nil
irb(main):096:0>
irb(main):097:0* p c[3]  = 1
1
=> nil
irb(main):098:0>
irb(main):099:0*
irb(main):100:0* a = 10
=> 10
irb(main):101:0> p"a is #{a}"
"a is 10"
=> nil
irb(main):102:0>
irb(main):103:0*
irb(main):104:0* p(10%3)
1
=> nil
irb(main):105:0>
irb(main):106:0* p(20%3)
2
=> nil
irb(main):107:0>
irb(main):108:0* p("%05d" % 10)
"00010"
=> nil
irb(main):109:0>
irb(main):110:0*
irb(main):111:0* p %r{/etc/httpd/logs$}
/\/etc\/httpd\/logs$/
=> nil
irb(main):112:0>
irb(main):113:0* p %w{foo bar baz}
["foo", "bar", "baz"]
=> nil
irb(main):114:0>
irb(main):115:0*
irb(main):116:0* p %!nomad!
"nomad"
=> nil
irb(main):117:0>
irb(main):118:0*
irb(main):119:0*
irb(main):120:0* p (3&5)
1
=> nil
irb(main):121:0>
irb(main):122:0*
irb(main):123:0* i =3
=> 3
irb(main):124:0> p (i &=3)
3
=> nil
irb(main):125:0> p (i &=3)
3
=> nil
irb(main):126:0> p (i &=3)
3
=> nil
irb(main):127:0> p (i &=2)
2
=> nil
irb(main):128:0> p i
2
=> nil
irb(main):129:0>
irb(main):130:0*
irb(main):131:0*
irb(main):132:0*
irb(main):133:0*
irb(main):134:0*
irb(main):135:0* p(3 && 4)
4
=> nil
irb(main):136:0> p(3 | 5)
7
=> nil
irb(main):137:0>
irb(main):138:0* p(3 || 5)
3
=> nil
irb(main):139:0>
irb(main):140:0*
irb(main):141:0* a ||= :some
=> 10
irb(main):142:0>
irb(main):143:0* p a
10
=> nil
irb(main):144:0> a ||= :sec
=> 10
irb(main):145:0> p a
10
=> nil
irb(main):146:0>
irb(main):147:0*
irb(main):148:0*
irb(main):149:0*
irb(main):150:0*
irb(main):151:0*
irb(main):152:0*
irb(main):153:0*  def fizzbuzz(n)
irb(main):154:1>   1.upto(n) do |i|
irb(main):155:2*     if i%3==0 then
irb(main):156:3*       p "fizz : #{i}"
irb(main):157:3>     else i% 5 ==0 then
irb(main):158:3*       p "buzz : #{i}"
irb(main):159:3>     end
irb(main):160:2>   end
irb(main):161:1> end
SyntaxError: compile error
(irb):157: syntax error, unexpected kTHEN, expecting kEND
        from (irb):161
        from :0
irb(main):162:0>
irb(main):163:0* exit

C:\Users\mitsuo>

書いてて思ったけど、俺が楽器上達したのはバンドやってからだったなー。基礎練習だけやってたから上達したんじゃなくて、実践と同時に基礎を学んでたからかな。
楽器とか音楽とプログラミングの上達の仕方って非常に似てると思います。
俺のプログラミングの上達の仕方が楽器と同じだとすると、具体的なモノをコピーして動かしたりしながら基礎を学んだ方がよさそうだ。
繰り返しと制御構造とメソッドの使い方がなんとなくわかってきたので、以降はサンプルコードを読んでは動かし、壊しては作り・・・を繰り返そうと思います。ちょうどコピーバンドやってるような感じ。



しかしirb楽しいなぁ。
最近は、仕事でちょっとした計算するとき、電卓使わないでirbで計算しています。計算の過程も残るし、コピペも楽だし。