誤解されている 6 つの Ruby の機能の真相を知る

C++ プログラマーを惑わせがちな Ruby の機能について学ぶ

C++ 開発者が Ruby を使って何らかのプロトタイプを短時間で作成しなければならないとします。「つるはし本」として知られる Ruby のリファレンス・ガイドや、Ruby のサイトを調べると、クラス宣言やスレッドのサポート、そして例外処理など、C++ 開発でお馴染みの構成体が目に入ってきます。開発者はこれで Ruby の仕組みは把握できたと思ったところで、Ruby コードでの並行処理は Boost スレッドのように動作しないこと、catchthrow はその見掛けとは違うこと、そして Ruby スクリプトの至るところで self というものが使われていることなどが、次々に発覚してきます。Ruby の世界へようこそ!

Arpan Sen, Author, Independent

Arpan Sen は電子設計自動化業界でソフトウェア開発に従事する先進的なエンジニアです。彼はこれまで、Solaris や SunOS、HP-UX、IRIX など、さまざまな種類の UNIX を扱ってきており、また Linux と Microsoft Windows にも数年の経験があります。彼はソフトウェアのパフォーマンス最適化技術やグラフ理論、並列コンピューティングに大きな関心を持っています。彼はソフトウェア・システムの修士号を取得しています。



2012年 5月 31日

C++ プログラマーが Ruby を使って作業する場合には、多少の学習が必要です。この記事では、Ruby の初心者が誤解しやすい以下の 6 つの Ruby の機能について説明します。これらの機能は、C++ のように、Ruby と何となく似ている環境を使い慣れているプログラマーにとっては特に誤解を招きがちな機能です。

  • Ruby のクラス階層
  • Ruby でのシングルトン・メソッド
  • self キーワード
  • method_missing メソッド
  • 例外処理
  • スレッド化

注: この記事に記載するすべてのコードは、Ruby バージョン 1.8.7 でテストし、このバージョンに基づいています。

Ruby のクラス階層

Ruby のクラス階層には注意が必要です。Cat という型のクラスを作成し、そのクラスの階層を操作してみてください (リスト 1 を参照)。

リスト 1. Ruby での暗黙的クラス階層
irb(main):092:0> class Cat
irb(main):093:1> end
=> nil

irb(main):087:0> c = Cat.new
=> #<Cat:0x2bacb68>
irb(main):088:0> c.class
=> Cat
irb(main):089:0> c.class.superclass
=> Object
irb(main):090:0> c.class.superclass.superclass
=> nil
irb(main):091:0> c.class.superclass.superclass.superclass
NoMethodError: undefined method `superclass' for nil:NilClass
        from (irb):91
        from :0

Ruby では、(ユーザー定義オブジェクトでさえも) すべてのオブジェクトが Object クラスの子孫であることはリスト 1 を見れば明らかです。これは、C++ とは際立って対照的な点です。Ruby には、例えば C/C++intdouble のような単純データ型はありません。リスト 2 に、整数 1 のクラス階層を記載します。

リスト 2. 1 のクラス階層
irb(main):100:0> 1.class
=> Fixnum
irb(main):101:0> 1.class.superclass
=> Integer
irb(main):102:0> 1.class.superclass.superclass
=> Numeric
irb(main):103:0> 1.class.superclass.superclass.superclass
=> Object

ここまでは順調です。これで、クラス自体は Class 型のオブジェクトであることがわかりました。一方、リスト 3 の Ruby に組み込みの String クラスに示されるように、Class は突き詰めるところ、Object から派生しています。

リスト 3. クラスのクラス階層
irb(main):100:0> String.class
=> Class
irb(main):101:0> String.class.superclass
=> Module
irb(main):102:0> String.class.superclass.superclass
=> Object

Class の基底クラスは Module ですが、これには、ユーザー定義の Module クラスを直接インスタンス化することはできないという欠点があります。Ruby の内部構造にまで踏み込むことはしたくないという場合、ModuleC++ の名前空間と同様の特性を持つと考えるのが無難です。したがって、このクラスには独自のメソッドや定数などを定義することができます。ModuleClass の中に組み込むと、魔法のごとく、Module のすべての要素が Class の要素になります。リスト 4 に一例を記載します。

リスト 4. 直接インスタンス化できない Module は、クラスと一緒でないと使用できません
irb(main):020:0> module MyModule
irb(main):021:1> def hello
irb(main):022:2> puts "Hello World"
irb(main):023:2> end
irb(main):024:1> end
irb(main):025:0> test = MyModule.new
NoMethodError: undefined method `new' for MyModule:Module
        from (irb):25
irb(main):026:0> class MyClass
irb(main):027:1> include MyModule
irb(main):028:1> end
=> MyClass
irb(main):029:0> test = MyClass.new
=> #<MyClass:0x2c18bc8>
irb(main):030:0> test.hello
Hello World 
=> nil

以上の説明をまとめると、Ruby で c = Cat.new と記述する場合、cCat 型のオブジェクトであり、CatObject から派生したものです。Cat クラスは Class 型のオブジェクトであり、ClassModule から派生し、ModuleObject から派生したものです。したがって、オブジェクトとオブジェクトの型は両方とも有効な Ruby オブジェクトです。


シングルトン・メソッドと編集可能なクラス

次に検討するのは、シングルトン・メソッドです。例えば、人間社会 (human society) といったものを C++ でモデル化するとしたら、どのような方法を使用しますか? Human という名前のクラスを作成して、数百万個もの Human オブジェクトを作成するとしたら、それはゾンビの社会をモデル化しているようなものです。ゾンビとは違って、それぞれの人間には個性があります。そこで重宝するのが、リスト 5 で説明している Ruby のシングルトン・メソッドです。

リスト 5. Ruby のシングルトン・メソッド
irb(main):113:0> y = Human.new
=> #<Human:0x319b6f0>
irb(main):114:0> def y.paint
irb(main):115:1> puts "Can paint"
irb(main):116:1> end
=> nil
irb(main):117:0> y.paint
Can paint
=> nil
irb(main):118:0> z = Human.new
=> #<Human:0x3153fc0>
irb(main):119:0> z.paint
NoMethodError: undefined method `paint' for #<Human:0x3153fc0>
        from (irb):119

Ruby でのシングルトン・メソッドは、特定のオブジェクトとだけ関連付けられ、一般のクラスで使用することはできません。シングルトン・メソッドのメソッド名の先頭にはオブジェクト名が追加されます。リスト 5paint メソッドはオブジェクト y に固有のメソッドです。y だけに固有であるため、z.paint とすると、メソッドが未定義であるというエラーになります。オブジェクトのシングルトン・メソッドのリストを確認するには、singleton_methods を呼び出してください。

irb(main):120:0> y.singleton_methods
=> ["paint"]

Ruby でシングルトン・メソッドを定義するには、さらに別の方法があります。リスト 6 のコードを見てください。

リスト 6. シングルトン・メソッドを作成するもう 1 つの方法
irb(main):113:0> y = Human.new
=> #<Human:0x319b6f0>
irb(main):114:0> class << y
irb(main):115:1> def sing
irb(main):116:1> puts "Can sing"
irb(main):117:1> end
irb(main):118:1>end
=> nil
irb(main):117:0> y.sing
Can sing
=> nil

リスト 5 も、ユーザー定義クラスや Ruby の既存の組み込みクラス (String など) に新しいメソッドを追加するという点では、興味深い可能性を広げます。C++ では、使用するクラスのソース・コードにアクセスしない限り、新しいメソッドを追加することはできません。今度はリスト 7String クラスをよく見てください。

リスト 7. Ruby では既存のクラスを変更することができます
irb(main):035:0> y = String.new("racecar")
=> "racecar"
irb(main):036:0> y.methods.grep(/palindrome/)
=> [ ]
irb(main):037:0> class String
irb(main):038:1> def palindrome?
irb(main):039:2> self == self.reverse
irb(main):040:2> end
irb(main):041:1> end
irb(main):050:0> y.palindrome?
=> true

リスト 7 では、既存の Ruby クラスを編集して任意のメソッドを追加する方法を明白に示しています。上記では、String クラスに palindrome? メソッドを追加しました。このように、Ruby のクラスは実行時に編集することができます。これは Ruby の強力な特性です。

Ruby のクラス階層とシングルトンについて理解できたところで、次は self に話題を移します。上記の palindrome? メソッドの定義の中で、self が使用されていることに注目してください。


self の解明

self キーワードの最も一般的な用途は、Ruby クラス内での静的メソッドの宣言です (リスト 8 を参照)。

リスト 8. self を使用してクラスの静的メソッドを宣言する
class SelfTest
   def self.test
      puts "Hello World with self!"
   end
end

class SelfTest2
   def test
      puts "This is not a class static method"
   end
end

SelfTest.test
SelfTest2.test

リスト 8 による出力 (リスト 9 を参照) を見るとわかるように、オブジェクトなしで非静的メソッドを呼び出すことはできません。この動作は C++ と同様です。

リスト 9. オブジェクトなしで非静的メソッドを呼び出した場合のエラー
irb(main):087:0> SelfTest.test
Hello World with self!
=> nil
irb(main):088:0> SelfTest2.test
NoMethodError: undefined method 'test' for SelfTest2:Class
        from (irb):88

さらに奥の深い self の使用法と意味を検討する前に、Ruby ではメソッド名の前にクラス名を追加するという方法でも静的メソッドを定義できることに注意してください。

class TestMe
   def TestMe.test
       puts "Yet another static member function"
   end
end

TestMe.test  # works fine

リスト 10 に、より興味深いとは言え、難解に見える self の使用法を記載します。

リスト 10. メタクラスを使用して静的メソッドを宣言する
class MyTest
   class << self 
     def test
        puts "This is a class static method"
     end
   end
end

MyTest.test   # works fine

上記のコードは、少し異なる方法で、test をクラスの静的メソッドとして定義しています。このコードの内容を理解するには、class << self 構文の詳細を検討する必要があります。class << self … end は、メタクラスを作成します。メソッドのルックアップ・チェーンでは、オブジェクトのメタクラスが検索されてから、そのオブジェクトの基底クラスへのアクセスが行われます。メタクラス内にメソッドを定義した場合、そのメソッドは、クラスで呼び出すことが可能になります。これは、C++ での静的メソッドの概念と同様です。

では、メタクラスにアクセスすることは可能でしょうか?答えはイエスです。class << self … end 内から self を返すだけで、メタクラスにアクセスすることができます。注意する点として、Ruby のクラス宣言には、メソッド定義だけを含めなければならないという決まりはありません。リスト 11 にメタクラスを記載します。

リスト 11. メタクラスを取得する
irb(main):198:0> class MyTest
irb(main):199:1> end
=> nil
irb(main):200:0> y = MyTest.new
=> #< MyTest:0x2d43fe0>
irb(main):201:0> z = class MyTest
irb(main):202:1> class << self
irb(main):203:2> self
irb(main):204:2> end
irb(main):205:1> end
=> #<Class: MyTest > 
irb(main):206:0> z.class
=> Class
irb(main):207:0> y.class
=> MyTest

リスト 7 のコードをもう一度見てみると、palindromeself == self.reverse として定義されています。C++ にも、このコンテキストでの self に完全に相当するものがあります。C++ でのメソッドも、Ruby でのメソッドも、状態情報を変更または抽出するためにアクセスする対象となるオブジェクトが必要です。self はこのオブジェクトを指しています。メソッドの操作対象のオブジェクトを示す self キーワードを先頭に追加すれば、オプションでパブリック・メソッドを呼び出すことも可能です (リスト 12 を参照)。

リスト 12. self を使用してメソッドを呼び出す
irb(main):094:0> class SelfTest3
irb(main):095:1> def foo
irb(main):096:2> self.bar()
irb(main):097:2> end
irb(main):098:1> def bar
irb(main):099:2> puts "Testing Self"
irb(main):100:2> end
irb(main):101:1> end
=> nil
irb(main):102:0> test = SelfTest3.new
=> #<SelfTest3:0x2d15750>
irb(main):103:0> test.foo
Testing Self 
=> nil

Ruby では、self キーワードを先頭に追加してプライベート・メソッドを呼び出すことはできません。C++ 開発者にとって、この点はかなり紛らわしいことでしょう。リスト 13 のコードから、プライベート・メソッドで self を使用できないことは明らかです。プライベート・メソッドを呼び出すには、暗黙的オブジェクトを使用しなければなりません。

リスト 13. プライベート・メソッドの呼び出しには self を使用することはできません
irb(main):110:0> class SelfTest4
irb(main):111:1> def method1
irb(main):112:2> self.method2
irb(main):113:2> end
irb(main):114:1> def method3
irb(main):115:2> method2
irb(main):116:2> end
irb(main):117:1> private
irb(main):118:1> def method2
irb(main):119:2> puts "Inside private method"
irb(main):120:2> end
irb(main):121:1> end
=> nil
irb(main):122:0> y = SelfTest4.new
=> #<SelfTest4:0x2c13d80>
irb(main):123:0> y.method1
NoMethodError: private method `method2' called for #<SelfTest4:0x2c13d80>
        from (irb):112:in `method1'
irb(main):124:0> y.method3
Inside private method 
=> nil

Ruby ではあらゆるものがオブジェクトであるため、irb プロンプトで self を呼び出すと、以下の結果となります。

irb(main):104:0> self
=> main
irb(main):105:0> self.class
=> Object

irb を起動した瞬間に、Ruby インタープリターは自動的に main オブジェクトを作成します。main オブジェクトは、Ruby 関連の文献では最上位レベル・コンテキストとも呼ばれています。

self についての説明は以上です。次は、動的メソッドと method_missing メソッドを取り上げます。


method_missing の謎

まずは、リスト 14 の Ruby コードについて検討してみましょう。

リスト 14. method_missing の使用
irb(main):135:0> class Test
irb(main):136:1> def method_missing(method, *args)
irb(main):137:2> puts "Method: #{method} Args: (#{args.join(', ')})"
irb(main):138:2> end
irb(main):139:1> end
=> nil
irb(main):140:0> t = Test.new
=> #<Test:0x2c7b850>
irb(main):141:0> t.f(23)
Method: f Args: (23)
=> nil

ブードゥー教の魔術に興味があるなら、リスト 14 を見て笑みがこぼれることでしょう。このコードでは一体何が行われたのでしょうか?上記では Test 型のオブジェクトを作成した後、引数として 23 を渡して t.f を呼び出しましたが、Test にはメソッドとしての f はないため、NoMethodError や同等のエラー・メッセージを受け取るはずです。Ruby はここで興味深いことを行っています。それは、メソッド呼び出しを method_missing によってインターセプトして処理していることです。method_missing には、欠落しているメソッド (上記の場合は f) が最初の引数として渡されます。2 番目すなわち最後の引数は *args で、ここに f に渡される引数が取り込まれます。このような仕掛けを使用できる言語が他にあるでしょうか?他のオプションとしては、最上位レベルのクラスに呼び出しごとのラッパー・アプリケーション・プログラミング・インターフェースを明示的に提供することなく、クラスに組み込まれた Module やコンポーネント・オブジェクトに簡単にメソッド呼び出しを転送することもできます。

リスト 15 で、さらに別のブードゥー教の魔術を見てください。

リスト 15. send メソッドを使用してルーチンに引数を渡す
irb(main):142:0> class Test
irb(main):143:1> def method1(s, y)
irb(main):144:2> puts "S: #{s} Y: #{y}"
irb(main):145:2> end
irb(main):146:1> end
=> nil
irb(main):147:0>t = Test.new
irb(main):148:0> t.send(:method1, 23, 12)
S: 23 Y: 12
=> nil

リスト 15Test クラスには、method1 というメソッドが定義されていますが、このメソッドを直接呼び出す代わりに send メソッドを呼び出します。sendObject クラスのパブリック・メソッドなので、Test で使用することができます (すべてのクラスは Object から派生することを思い出してください)。send メソッドへの最初の引数は、メソッド名を示すシンボルまたはストリングです。通常では不可能でも、send メソッドでは実行できることは何かと言うと、それは send メソッドを使用すれば、クラスのプライベート・メソッドにアクセスできることです。もちろん、それが有益な機能であるかどうかについては、議論の余地があります。リスト 16 にコードの一例を示します。

リスト 16. クラスのプライベート・メソッドにアクセスする
irb(main):258:0> class SendTest
irb(main):259:1> private
irb(main):260:1> def hello
irb(main):261:2> puts "Saying Hello privately"
irb(main):262:2> end
irb(main):263:1> end
=> nil
irb(main):264:0> y = SendTest.new
=> #< SendTest:0x2cc52c0>
irb(main):265:0> y.hello
NoMethodError: private method `hello' called for #< SendTest:0x2cc52c0>
        from (irb):265
irb(main):266:0> y.send(:hello)
Saying Hello privately
=> nil

throw と catch はその見掛けとは異なります

私のように C++ を経験してきて、例外セーフなコードを作成しようとする傾向があるプログラマーは、Ruby には throw および catch キーワードがあることを知った瞬間に居心地の良さを感じるでしょう。けれども残念ながら、Rubyでの throwcatch の意味は、C++ とはまったく異なります。

Ruby は例外を処理するために、通常は begin…rescue ブロックを使用します。リスト 17 に、一例を示します。

リスト 17. Ruby での例外処理
begin
  f = File.open("ruby.txt")
  # .. continue file processing 
rescue ex => Exception
  # .. handle errors, if any 
ensure
  f.close unless f.nil?
  # always execute the code in ensure block 
end

リスト 17 では、ファイルを開こうとして何らかの問題が発生すると (おそらく、ファイルが見つからないか、ファイルのパーミッションに問題がある場合)、rescue ブロック内のコードが実行されます。ensure ブロック内のコードは、例外が発生したかどうかに関わらず、常に実行されます。ただし、rescue ブロックの後の ensure ブロックはオプションです。また、例外を明示的にスローする必要がある場合、その構文は raise <MyException> となります。独自の例外クラスを使用する場合には、既存のメソッドを利用できるように、Ruby の組み込み Exception クラスから例外クラスを派生させることをお勧めします。

Ruby での throw および catch 機能は、本当の意味での例外処理ではありません。throw は、プログラムのフローを変えるために使用することができます。リスト 18 に、throwcatch を使用した例を記載します。

リスト 18. Ruby での throw と catch
irb(main):185:0> catch :label do
irb(main):186:1* puts "This will print"
irb(main):187:1> throw :label
irb(main):188:1> puts "This will not print"
irb(main):189:1> end
This will print
=> nil

リスト 18 では、コード・フローが throw 文に辿り着くと、コードの実行が中断され、インタープリターが対応するシンボルを処理する catch ブロックの検索を開始します。catch ブロックが終了すると、そこから実行が再開されます。今度は、リスト 19throwcatch を使用した例を見てください。注目する点は、catch 文および throw 文を複数の関数に簡単に拡大できることです。

リスト 19. Ruby での例外処理: ネストされた catch ブロック
irb(main):190:0> catch :label do
irb(main):191:1* catch :label1 do
irb(main):192:2* puts "This will print"
irb(main):193:2> throw :label
irb(main):194:2> puts "This won't print"
irb(main):195:2> end
irb(main):196:1> puts "Neither will this print"
irb(main):197:1> end
This will print
=> nil

一部の人々は「Ruby は Cgoto 文の狂気を受け継いで、throwcatch のサポートによる全く新しい高みへと引き上げた」とまで言っています。catch ブロックでは、あらゆるレベルで関数の層を何層にもネストできることを考えれば、goto 文の狂気と似通っているというのも、まんざら大袈裟な話ではないように思います。


Ruby のスレッドはグリーン・スレッドにすることができます

Ruby バージョン 1.8.7 では真の並行性をサポートしていません。これは間違いなく本当のことです。けれども Ruby には Thread 構成体があると指摘する方もいることでしょう。おっしゃるとおりですが、Thread.new は呼び出されるたびに真のオペレーティング・システム・スレッドを作成することはしません。Ruby がサポートしているスレッドは、「グリーン・スレッド」です。Ruby インタープリターは、1 つのオペレーティング・システム・スレッドだけを使って、複数のアプリケーション・レベルのスレッドによるワークロードを処理します。

この「グリーン・スレッド」という概念では、便利なことに、あるスレッドが何らかの I/O 処理が行われるのを待機している間、別の Ruby スレッドを簡単にスケジューリングして CPU を有効に利用することができます。ただし、この構成体は、最近のマルチコア CPU には対応していません (ウィキペディアに、グリーン・スレッドの概要を説明している優れた記事があります。「参考文献」のリンクを参照してください)。

最後の例 (リスト 20 を参照) で、Ruby でのスレッドの重要なポイントを明らかにします。

リスト 20. Ruby での複数のスレッド
#!/usr/bin/env ruby
 
def func(id, count)
  i = 0;
  while (i < count)
    puts "Thread #{i} Time: #{Time.now}"
    sleep(1)
    i = i + 1
  end
end
 
puts "Started at #{Time.now}"
thread1 = Thread.new{func(1, 100)}
thread2 = Thread.new{func(2, 100)}
thread3 = Thread.new{func(3, 100)}
thread4 = Thread.new{func(4, 100)}

thread1.join
thread2.join
thread3.join
thread4.join
puts "Ending at #{Time.now}"

Linux または UNIX マシンで top ユーティリティーを使用できる場合、ターミナル・ソフトで上記のコードを実行してプロセス ID を取得し、top -p <process id> を実行してみてください。top の実行が開始されたら、Shift+H を押して実行中のスレッド数を一覧表示します。すると、わかりきっている事実を裏付けるように、1 つのスレッドだけが表示されます。その事実とは、Ruby 1.8.7 での並行性は謎だということです。

そうは言っても、グリーン・スレッドは悪いものではなく、極めて重い負荷を処理する I/O バウンド・プログラムでは、これが役に立つことには変わりありません。グリーン・スレッドは、さまざまなオペレーティング・システム間でおそらく最も移植しやすい手法であることは、言うまでもありません。


まとめ

この記事では、以下の多岐にわたる範囲を取り上げました。

  • Ruby でのクラス階層の概念
  • シングルトン・メソッド
  • self キーワードと method_missing メソッドの解明
  • 例外
  • スレッド化

Ruby は特異な部分があるものの、プログラミングを楽しい作業にし、最小限のコードで多くの処理を実行できるという点で極めて強力です。Twitter のような大規模なアプリケーションが Ruby を使用してそのアプリケーションが持つ本当の能力を引き出しているのもうなずけます。Ruby でのコーディングを楽しんでください!

参考文献

学ぶために

  • 「つるはし本」として一般に知られている Ruby の必読書、『プログラミング Ruby』(Dave Thomas、Chad Fowler、Andy Hunt 共著、第 2 版) を読んでください。
  • もう 1 つの貴重な Ruby リソース、『The Ruby Programming Language』(Yukihiro "Matz" Matsumoto (Ruby の作成者)、David Flanagan 共著、O'Reilly、2008年) も読んでください。
  • To Ruby From C and C++」にアクセスしてください。Ruby を学びたいと思っている C/C++ プログラマーには願ってもないサイトです。
  • ウィキペディアの優れた説明で、グリーン・スレッドの詳細を学んでください。
  • オープンソース技術を使用して開発し、IBM の製品と併用するときに役立つ広範囲のハウツー情報、ツール、およびプロジェクト・アップデートについては、developerWorks Open source ゾーンを参照してください。
  • developerWorks Linux ゾーンで、Linux 開発者および管理者向けのハウツー記事とチュートリアル、そしてダウンロード、ディスカッション、フォーラムなど、豊富に揃った資料を探してください。
  • さまざまな IBM 製品や IT 業界のトピックに焦点を絞った developerWorks のTechnical events and webcasts で最新情報を入手してください。
  • 無料の developerWorks Live! briefing に参加して、IBM の製品およびツールについての情報や IT 業界の動向についての情報を迅速に把握してください。
  • developerWorks ポッドキャストで、ソフトウェア開発者向けの興味深いインタビューとディスカッションを聞いてください。
  • Twitter で developerWorks をフォローしてください。
  • developerWorks demo で、初心者向けの製品のインストールおよびセットアップから熟練開発者向けの高度な機能に至るまで、さまざまに揃ったデモを調べてください。

製品や技術を入手するために

  • IBM 試用版ソフトウェアを使用して、開発者専用のソフトウェアを使って次のオープンソース開発プロジェクトを革新してください。IBM 試用版ソフトウェアは、ダウンロードまたは DVD で入手できます。

議論するために

  • developerWorks コミュニティーに参加してください。ここでは他の developerWorks ユーザーとのつながりを持てる他、開発者によるブログ、フォーラム、グループ、ウィキを調べることができます。developerWorks コミュニティーで、Real world open source の構築を手伝ってください。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source, Linux
ArticleID=818642
ArticleTitle=誤解されている 6 つの Ruby の機能の真相を知る
publish-date=05312012