REST (REpresentational State Transfer) は、クライアントが独特の方法でサーバーと対話することを可能にする Web ベースの通信のアーキテクチャー・スタイルです。具体的には、REST は所定のサーバー内のリソースを URI (Uniform Resource Identifier) として表現し、HTTP (HyperText Transport Protocol) 上での REST アーキテクチャーの実装を単純化します。この記事では最初に REST と HTTP の背後にある概念を紹介します。その上で、データ表現を詳しく探り、単純な REST クライアントを Ruby 言語で実装します。
個々の REST トランザクションを理解するには、HTTP が重要な鍵となるため、まずは HTTP について簡単に説明します。HTTP は Web ブラウザーをサーバーに接続する基本的な通信プロトコルですが、HTML 以外のさまざまなタイプのデータを転送するのにも役立つプロトコルです。
HTTP は、リクエスト・レスポンス型のプロトコルです。つまり、クライアントがリクエストを送信し、サーバーがレスポンスによってこれらのリクエストに応じます。HTTP の実際のプロトコルは、人間にとってかなり理解しやすいものなので、HTTP の実例を説明するために、ここでは telnet を使って Web サーバーにリクエストを送信します。
リスト 1 に、HTTP リクエストと、Web サーバーからのレスポンスの一部を記載します。ここでは telnet でリクエストを開始するために、Web サーバーのドメイン・ネームとポートを指定します (80 は、標準的な HTTP ポートです)。telnet はこれに応じ、最初にドメイン・ネーム・システムによってドメイン・ネームを IP アドレスに解決し、続いて Web サーバーに接続したことを通知してきます。この通知を受けて、リクエスト行を指定します (この行に、HTTP の GET メソッド、Web サーバー上のリソースへのパス、そして使用しているプロトコル (この例では、HTTP バージョン 1.1) を含めます)。次に、一連のリクエスト・ヘッダーを指定します (これらのリクエスト・ヘッダーはかなりの長さになる場合がありますが、この例では手作業で入力しているため、リクエストを送信している対象のホストとオプションのポートを示す Host リクエスト・ヘッダーだけを指定しています)。このリクエストに続く空白行は、Web サーバーにリクエストが完了したことを通知するためのものです。リクエストが完了したことを通知されると、Web サーバーはレスポンスを返します。このレスポンスで、使用されたプロトコルを示し、ステータス・コード (この例では、有効なリクエストであることを意味する「200 OK」) および一連のレスポンス・ヘッダーを提供します。次に空白行が現われ、その後に 1944 文字のレスポンスが続きます。これは、リクエストしたリソースの表現です。この例では、HTML 文書がその表現に該当します。
リスト 1. telnet で HTTP トランザクションを実行する
$ telnet mtjones.com 80 Trying 198.145.43.103... Connected to mtjones.com. Escape character is '^]'. GET /index.html HTTP/1.1 Host: example.org HTTP/1.1 200 OK Date: Sun, 25 Mar 2012 05:33:07 GMT Server: Apache Last-Modified: Sat, 26 Sep 2009 20:22:36 GMT ETag: "2c984bf-798-d3451b00" Accept-Ranges: bytes Content-Length: 1944 Vary: Accept-Encoding Content-Type: text/html <DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ... |
この例で説明しているのは単純なトランザクションですが、HTTP に実装されているメソッドは、実際には複数あります。GET メソッドは、Web サーバーからリソースを取得するために使用する一方、HEAD メソッドはリソースの (実際のコンテンツではなく) メタ情報だけを取得するために使用します。新しいコンテンツを Web サーバーに提供するには POST メソッドを使用し、Web サーバー上の既存のリソースのデータを更新するには PUT メソッドを使用します。表 1 に、HTTP メソッドの完全なリストを記載します。
表 1. 一般的な HTTP 1.1 のリクエスト・メソッド
| メソッド | べき等性 | 説明 |
|---|---|---|
OPTIONS | あり | 通信オプションに関する情報をリクエストします。 |
GET | あり | URI に対応する表現を取得します。 |
HEAD | あり | URI に対応するメタ情報を取得します。 |
PUT | あり | リソースを作成するか、リソースの表現を置き換えます。 |
POST | なし | 既存のリソースを表現で増補します。 |
DELETE | あり | URI が指定するリソースを削除します。 |
HTTP のこの短い説明のなかで注意しなければならない重要な点は、HTTP は、リソースに対する基本操作をサポートするプロトコルであることです。現在、HTTP は一般的に Web コンテンツをサーバーとクライアントの間で転送するために使用されていますが、分散システムでのやりとりや、異種システム間での通信およびデータ共有を可能にする API (Application Programming Interfaces) の開発で使用されることも多くなっています。
次は、このプロトコル・スタックの上位に位置する REST 層を探ります。
REST は、特定の設計や実装というよりも、アーキテクチャー・スタイルです。RESTful なアーキテクチャーは、図 1 に示す一連の単純な制約によって定義されます。RESTful なアーキテクチャーのコアとなるのは一連のリソースです。これらのリソースは、URI (URL (Uniform Resource Locator) など) と内部表現 (一般に自己記述的なデータという形。これについては、この後すぐに説明します) によって識別されます。さらに、リソースを扱うために使用できる一連の操作があります。
図 1. RESTful なアーキテクチャーの概略図
より具体的な言葉で説明すると、これらのリソースは、さまざまなタイプ (例えば、JSON (JavaScript Object Notation) など) を使用したデータ・オブジェクトを表す場合があります。これらの多様なリソースを URL (http://www.mtjones.com など) でアドレス指定し、一連の標準操作 (HTTP の GET、POST、DELETE など) を使用することができます。HTTP をトランスポート・プロトコルとして使用することで、RESTful なアーキテクチャーの開発は大幅に単純化されます。それは、よく知られていて安定している基本プロトコルを使用することになるためです。さらに、ゲートウェイ、プロキシー、セキュリティー施行エンティティー、HTTP キャッシング・サービスなどのインターネット・サービスを含め、HTTP は広く利用されています。したがって、新しい構成を使用する必要もなくなります。REST サーバーに高度なスケーラビリティーを持たせるには、ロード・バランシングなどの他の有用な機能を利用することもできます。
RESTful なアーキテクチャーは、実装という点でかなりの自由が利きますが、そこには決まって、いくつかの重要な特性があります。
REST が定義するクライアント・サーバー型のアーキテクチャーでは、クライアントはサーバー・リソースにアクセスする手段として、サーバーがエクスポートする表現を使用します。つまり、クライアントはリソースに直接アクセスする代わりに、統一インターフェースを介してリソースの表現にアクセスします。多くのクライアント・サーバー型アーキテクチャーと同じく、REST は階層化アーキテクチャーとして実装されるため、下位層が提供する各種の機能 (HTTP ロード・バランシングなど) を利用することができます。
けれども、RESTful なアーキテクチャーの鍵となる側面は、これがステートレスであることです。サーバーは複数のトランザクションにまたがってクライアントのコンテキストを保持することができないため、1 つひとつのトランザクションが、特定のリクエストを満たすために必要なすべての情報を持たなければなりません。この特性が、RESTful なアーキテクチャーの信頼性強化を促していると同時に、スケーラビリティーの向上にも役立っています。
このセクションでは、RESTful なアーキテクチャーに備わっている特性を説明するために用意した REST 実装のサンプルを見ていきましょう。これまで説明したように、REST はクライアントとサーバーとのやりとりを利用します (図 2 を参照)。クライアント・アプリケーションが RESTful な HTTP リクエストに変換されるリクエストを送信すると、このリクエストが、クライアントからサーバーへのあらゆる HTTP トランザクションと同じように開始されます。サーバーはそれぞれのリクエストに応じた処理を行って、レスポンスを返します。
図 2. クライアントとサーバーとの RESTful なやりとりを行うための階層化アーキテクチャー
単純なクライアントを作成するために使用できる興味深い REST API の一例としては、CrunchBase が挙げられます。CrunchBase は、技術関連の企業、人、投資家の情報を集めた無料のデータベースです。CrunchBase には従来の Web フロントエンドに加え、HTTP を使用した REST/JSON ベースのインターフェースも用意されています。
CrunchBase は、その API を使用して以下の 3 つのアクションを実装します。
- show (特定のエンティティーに関する情報を取得)
- search (指定の検索基準を満たすエンティティーのリストを取得)
- list (指定の名前空間内にあるすべてのエンティティーを取得)
CrunchBase は、CrunchBase での REST によるやりとりに使用する URL フォームに加え、データに対応する 5 つの名前区間 (図 3 を参照) もエクスポートします。(これらの名前空間は、企業、個人、製品、金融機関、サービス・プロバイダーです)。URL に含まれる「/v/1」は、API のバージョンを示すことに注意してください (現在のバージョンは 1 です)。また、<permalink> フィールドが示すのは、データベース内のエンティティーを表す固有の名前であることにも注意が必要です。
図 3. CrunchBase API での名前空間
例えば、IBM に関する最新情報を入手する場合には、company 名前空間を使用して URL を構成します (以下の URL をブラウザーで試してみてください)。
http://api.crunchbase.com/v/1/company/ibm.js |
上記の URL をブラウザーに入力すると、ブラウザーはテキスト形式 (JSON ベース) のレスポンスをレンダリングします (同時に HTTP ヘッダーも使用します)。CrunchBase の JSON フォーマットでのデータ表現について詳しく調べる際に、このレスポンスをさらに詳しく調べてください。
異種システム間での通信には、いくつかの興味深い問題が伴います。その 1 つは、転送するデータのシリアライズです。マシンがデータを表現する方法は (浮動小数点表記の違いから、よくあるバイト・オーダーの不一致に至るまで) さまざまなに異なります。初期のシリアライズの実装には、ASN.1 (Abstract Syntax Notation) フォーマットと (ネットワーク・ファイルシステム内部で使用される) XDR (External Data Representation) プロトコルが含まれていました。他の手法として、ASCII フォーマットの文書内でデータをエンコードする XML も含まれていました。
この 6 年で、JSON フォーマットがよく使われるようになってきました。その名前が示唆するように、JSON は JavaScript 言語から派生したフォーマットで、自己記述的なデータ構造 (連想配列など) を表現するために使用されます。その一方、その名前とは裏腹に、JSON は共通データ交換フォーマットであり、さまざまな言語でサポートされています。また、読んで理解するのも簡単です。
ここで、JSON の一例として、CrunchBase REST インターフェースから返される JSON の例を見てみましょう。この例では対話型の Ruby シェル (irb) を使用するので、リアルタイムで Ruby を試すことができます。
リスト 2 に示すように、まずは対話型の Ruby シェルを実行してください。いくつかのモジュール (具体的には JSON コンポーネントと HTTP コンポーネント) をロードして環境を準備した後、URI を定義します。この例での URI は、(company 名前空間内のパーマリンクとして ibm を指定した) 完全な CrunchBase リクエストであることに注意してください。この URI を Net::HTTP の get_response メソッドに渡します。このメソッドは、指定の URI で GET リクエストを実行するためのショートカットです (URI.parse メソッドによって、URI は個々のコンポーネントに構文解析されます)。resp.body を発行すると、このリクエストに対して返された JSON データを確認することができます。JSON データには、一連の名前と値のペア (例えば、”name” と “IBM” のペアなど) が含まれます。次に、JSON.parse メソッドを使用してレスポンスを構文解析し、Ruby オブジェクト構造にします。そして最後に、名前を指定して特定の値を抽出します。
リスト 2. Ruby を使用して CrunchBase とやりとりする
$ irb
irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'json'
=> true
irb(main):003:0> require 'net/http'
=> true
irb(main):004:0> uri = "http://api.crunchbase.com/v/1/company/ibm.js"
=> "http://api.crunchbase.com/v/1/company/ibm.js"
irb(main):005:0> resp = Net::HTTP.get_response(URI.parse(uri))
=> #<Net::HTTPOK 200 OK readbody=true>
irb(main):006:0> puts resp.body
{"name": "IBM",
"permalink": "ibm",
"crunchbase_url": "http://www.crunchbase.com/company/ibm",
"homepage_url": "http://www.ibm.com",
"blog_url": "",
"blog_feed_url": "",
"twitter_username": "",
"category_code": "software",
"number_of_employees": 388000,
...
=> nil
irb(main):007:0> parsedresp = JSON.parse(resp.body)
=> {"updated_at"=>"Wed Feb 01 03:10:14 UTC 2012", "alias_list"=>nil,
...
irb(main):008:0>
irb(main):009:0* puts parsedresp['founded_year']
1896
=> nil
irb(main):010:0>
|
リスト 2 を見れば、JSON レスポンスから迅速なデータ抽出のプロトタイプを作成するのがいかに簡単であるかがわかるはずです (たった 7 行の入力です)。そこで、次はさらに踏み込んで、CrunchBase と対話するための単純で再利用可能な API を作成します。
REST クライアントを作成する前に、いくつかインストールしなければならないものがあります。まず、Ruby がまだインストールされていない場合は、インストールしてください。この記事では Ubuntu を使用するため、インストール要件のほとんどには Advanced Packaging Tool を利用します (残りのインストール要件には、Ruby gem パッケージ・マネージャーを使用します)。
以下のコマンドを使用して、Ruby パッケージを取得します。
$ sudo apt-get install ruby |
オプションで、対話型の Ruby シェル (irb) を取得します。このシェルは、Ruby 言語を試すには便利な手段となります。
$ sudo apt-get install irb |
最後にもう 1 つ、Ruby 用の JSON gem が必要です。以下のコードに、gem フロントエンドと JSON gem の両方を取得する方法を示します。
$ sudo apt-get install rubygems1.8 $ sudo apt-get install ruby-dev $ sudo gem install json |
環境の準備が整ったら、Ruby を使って単純な REST クライアント API を作成する作業に取り掛かります。リスト 1 で HTTP サーバーと Ruby で通信する方法を学び、JSON オブジェクトに含まれる単純な名前を構文解析する方法も学びました。これらの知識を、単純な API を実装する一連の Ruby クラスに適用します。
まず初めに、CrunchBase REST サーバーとやりとりする 2 つのサンプル・クラスを取り上げます。一方は company 名前空間、もう一方は person 名前空間を焦点とするクラスです。どちらのクラスも最小限のメソッド一式を継承しますが、他のデータ要素に応じて簡単に拡張することができます。
リスト 3 に、company 名前空間を操作するための API を記載します。このクラスが継承するのは、コンストラクター・メソッド (initialize) と、JSON ベースの企業レコードからデータを抽出するために使用する 4 つのメソッドです。このクラスの操作理論では、ユーザーが企業 (パーマリンク) の名前を指定して、オブジェクトのインスタンスを作成します。コンストラクターの一部として、CrunchBase に対して企業レコードが要求されます。URL については、new メソッドの一部として渡された企業名を追加して、動的に作成します。get_response メソッドを使用してレスポンスを取得した後、構文解析された結果 (ハッシュ・オブジェクト) をインスタンス変数 (@record) にロードします。
構文解析されたレコードが使用可能になった後は、各メソッドが呼び出されて、単純に目的のデータを抽出し、それをユーザーに返すだけです。これらの founded_year メソッド、num_employees メソッド、および company_type メソッドは、リスト 1 の説明に基づく単純明快なメソッドですが、people メソッドについては多少説明する必要があります。
CrunchBase からの JSON レスポンスは、数個のキーを含むハッシュで表現されます。最初の 3 つのメソッドには、値を返すためのキーを指定していることに注目してください。people メソッドは、relationships というキーによって識別されるハッシュを繰り返し処理します。それぞれのレコードには、is_past キー (個人が特定の企業にまだ在籍しているかどうかを特定するために使用します)、title キー、および person キー (このキーには first_name、last_name、permalink が含まれます) が格納されています。イテレーターは単純に各レコードをウォークスルーし、is_past キーが false の場合には person と title を抽出して、この情報から新しいハッシュを作成します。他にキーが見つからなくなると、この新しく作成されたハッシュが返されます。JSON.parse で処理したレスポンスを出力すれば、このハッシュ全体を irb 内に表示することができます。
リスト 3. company 名前空間に対応する Ruby の CrunchBase API (company.rb)
require 'rubygems'
require 'json'
require 'net/http'
class Crunchbase_Company
@record = nil
def initialize( company )
base_url = "http://api.crunchbase.com"
url = "#{base_url}/v/1/company/#{company}.js"
resp = Net::HTTP.get_response(URI.parse(url))
@record = JSON.parse(resp.body)
end
def founded_year
return @record['founded_year']
end
def num_employees
return @record['number_of_employees']
end
def company_type
return @record['category_code']
end
def people
employees = Hash.new
relationships = @record['relationships']
if !relationships.nil?
relationships.each do | person |
if person['is_past'] == false then
permalink = person['person']['permalink']
title = person['title']
employees[permalink] = title
end
end
end
return employees
end
end
|
リスト 4 に、リスト 3 で説明した company クラスと同様の関数を記載します。ここには、リスト 3 と同じように動作する initialize コンストラクターに加え、特定の個人の名前を (個人のパーマリンクから) 抽出する 2 つの単純なメソッドがあります。さらに、companies メソッドが relationships キーに対応するハッシュを繰り返し処理して、この特定の個人が過去に関連付けられていた企業 (firm) を返します。この場合、関連企業は単純な (パーマリンクの) Ruby 配列として返されます。
リスト 4. person 名前空間に対応する Ruby の CrunchBase API (person.rb)
require 'rubygems'
require 'json'
require 'net/http'
class Crunchbase_Person
@record = nil
def initialize( person )
base_url = "http://api.crunchbase.com"
url = "#{base_url}/v/1/person/#{person}.js"
resp = Net::HTTP.get_response(URI.parse(url))
@record = JSON.parse(resp.body)
end
def fname
return @record['first_name']
end
def lname
return @record['last_name']
end
def companies
firms = Array.new
@record['relationships'].each do | firm |
firms << firm['firm']['permalink']
end
return firms
end
end
|
以上の 2 つの単純なクラスでは、Ruby が HTTP サーバーの処理の複雑さを Net::HTTP クラスに隠していることに注意してください。JSON レスポンスの構文解析処理の複雑さは、JSON gem によって完全に単純化されています。次は、これらの API を使用する方法を説明するために、これらの API を実際に使用したアプリケーションをいくつか紹介します。
まずは、実際のクラスの説明から始めます。最初の例 (リスト 5 を参照) で目的としているのは、引数で指定された企業に関連付けられている人々を (企業のパーマリンクをベースに) 特定することです。company 名前空間から取得するレコードには、その指定された特定の企業に関連付けられている人々に対応するパーマリンクのリストが格納されているので、このハッシュを繰り返し処理し、パーマリンクに基づいて個人のレコードを取得します。個人のレコードから、その個人の姓名がわかります。また、個人の肩書は (名前と肩書からなるハッシュの一部として返される) 企業レコードに含まれています。
リスト 5. 企業に関連付けられている人々を特定する (people.rb)
#!/usr/bin/ruby
load "company.rb"
load "person.rb"
# Get argument (company permalink)
input = ARGV[0]
company = Crunchbase_Company.new(input)
people = company.people
# Iterate the people hash
people.each do |name, title|
# Get the person record
person = Crunchbase_Person.new( name )
# Emit the name and title
print "#{person.fname} #{person.lname} | #{title}\n"
end
people = nil
company = nil
|
リスト 5 のスクリプトは、リスト 6 に示すように実行します。このスクリプトでは、企業のパーマリンクを指定すると、その企業に関連する個人それぞれの姓名と肩書が結果として返されます。
リスト 6. people.rb スクリプトをテストする
$ ./people.rb emulex Jim McCluney | President and CEO Michael J. Rockenbach | Executive Vice President and CFO Jeff Benck | Executive Vice President & COO $ |
次は、もう少し複雑な例を見てみましょう。この例では、引数で指定された企業を CrunchBase で特定した後、その企業の幹部スタッフを特定します。さらに、これらの幹部が過去に在籍していた企業を特定します。リスト 7 に、この influence.rb と名付けたスクリプトを記載します。このリストに示されているように、企業の名前を引数として取り、企業のレコードを取得し、続いて (people メソッドを使用して) その企業に現在在籍する人々のハッシュを取得します。次に、これらの人々に対して繰り返し処理を行い、それぞれの肩書から幹部を特定します (CrunchBase 内の肩書にはばらつきがあるため、100 パーセント正確ではありません)。特定された幹部のすべてについて、それぞれが勤務したことのある企業を出力します (そのために、個人のレコードから企業の配列を取得します)。
リスト 7. 幹部の関係および影響 (influence.rb)
#!/usr/bin/ruby
load "crunchbase.rb"
input = ARGV[0]
puts "Executive Relationships to " + input
company = Crunchbase_Company.new(input)
people = company.people
# Iterate through everyone associated with this company
people.each do |name, title|
# Search for only certain titles
if title.upcase.include?("CEO") or
title.upcase.include?("COO") or
title.upcase.include?("CFO") or
title.upcase.include?("CHIEF") or
title.upcase.include?("CTO") then
person = Crunchbase_Person.new( name )
companies = person.companies
companies.each do | firm |
if input != firm
puts " " + firm
end
end
end
end
|
リスト 8 は、このスクリプトをビッグデータ企業である Cloudera を対象に実行する例です。リスト 7 を見るとわかるように、Ruby とその gem が多くの詳細を隠すため、開発者は目の前のタスクに専念することができます。
リスト 8. influence Ruby スクリプトのテスト
$ ./influence.rb cloudera Executive Relationships to cloudera accel-partners bittorrent mochimedia yume lookout scalextreme vivasmart yahoo facebook rock-health $ |
これまでに記載した単純な例では、GET メソッドだけを使用して CrunchBase データベースからデータを抽出しました。他のサイトでは、インターフェースを拡張して特定の REST サーバーとの間でデータを受け渡しすることも考えられます。リスト 9 で、その他の Net::HTTP メソッドを紹介します。
リスト 9. その他の RESTful なやりとりを行うための HTTP メソッド
http = Net::HTTP.new("site url")
# Delete a resource
transaction = Net::HTTP::Delete.new("resource")
response = http.request(transaction)
# Post a resource
resp, data = Net::HTTP.post_form( url, post_arguments )
# Put a resource
transaction = Net::HTTP::Put.new("resource")
transaction.set_form_data( "form data..." )
response = http.request(transaction)
|
REST クライアントの開発をさらに単純化するには、他にも使用できる Ruby gem があります。その 1 つは、rest-client です (「参考文献」を参照)。この gem は、HTTP 上に REST 層を重ねて、get、post、delete などのメソッドを提供します。
この記事で簡単に紹介した Ruby での REST 原則から、Web ベースのアーキテクチャーの強力さ、そして Ruby が私のお気に入りの言語である理由を理解していただけたことを願います。REST はコンピューティング・クラウドおよびストレージ・クラウドで最もよく使われている API アーキテクチャーの 1 つなので、REST を理解し、さらに詳しく調べるために時間をかける価値はあります。「参考文献」に記載している、この記事で使用した技術に関する追加情報へのリンク、そして developerWorks のその他の REST に関する記事を参照してください。
学ぶために
- REST は、分散システム間での通信を対象とするソフトウェア・アーキテクチャーです。REST が初めて紹介されたのは、カリフォルニア大学アーバイン校でのRoy Fielding 氏の博士論文「Architectural Styles and the Design of Network-based Software Architectures」です。
- REST は HTTP をベースとしています。Internet Engineering Task Force の Request for Comments-2616 (1.1 バージョン関連) で、HTTP の詳細を学んでください。
- 動画「Intro to REST」では、Google の Joe Gregorio 氏が REST について興味深い紹介をしています。
- この記事で有益な概念および技術として探った URI、URL、JSON について詳しく学んでください。
- Ruby は断然、私のお気に入りのスクリプト言語であり、これまでに使用したなかで最も直感的な言語の 1 つだと思います。Ruby は素早いプロトタイプの作成や実験的開発に役立つだけでなく、本番用のソフトウェア開発にも最適です。Ruby を使うのが初めての場合は、この優れた Ruby の入門書「Ruby in Twenty Minutes」を読んでおくと、後で自分に感謝するでしょう。
- REST について詳しく説明している次の developerWorks 記事を読んでください。
- 「RESTful Web サービスの基本」(Alex Rodriguez 著、2008年11月) は、REST とその基本的な特性を理解するのに役立ちます。
- 「REST application programming」(Paul Sonnenberg 著、2010年9月) では、REST ベースの Java 開発に焦点を当てています。
- 「Twitter REST API の使い方」(Brian M. Carey 著、2009年6月) では、Twitter の REST API を紹介しています。
- Ruby での REST 実装をさらに単純化するには、Github に用意されている
rest-clientgem を試してください。この REST クライアントは、主要な操作のほとんどを単純化して、開発者がアプリケーションに専念できるようにします。 - developerWorks Open source ゾーンには、オープソースのツールおよびオープンソース技術の使用に関する情報が豊富に揃っています。
- さまざまな IBM 製品や IT 業界のトピックに焦点を絞った developerWorks の Technical events and webcasts で最新情報を入手してください。
- 無料の developerWorks Live! briefing に参加して、IBM の製品およびツールについての情報や IT 業界の動向についての情報を迅速に把握してください。
- developerWorks の on-demand demos で、初心者向けの製品のインストールとセットアップから、熟練開発者向けの高度な機能に至るまで、さまざまに揃ったデモを見てください。
- Twitter で developerWorks をフォローしてください。
製品や技術を入手するために
- ご自分に最適な方法で IBM 製品を評価してください。評価の方法としては、製品の試用版をダウンロードすることも、オンラインで製品を試してみることも、クラウド環境で製品を使用することもできます。また、SOA Sandbox では、数時間でサービス指向アーキテクチャーの実装方法を効率的に学ぶことができます。
議論するために
- developerWorks blogs から developerWorks コミュニティーに参加してください。
- developerWorks コミュニティーに参加してください。ここでは他の developerWorks ユーザーとのつながりを持てる他、開発者によるブログ、フォーラム、グループ、ウィキを調べることができます。

M. Tim Jones は組み込みソフトウェアのエンジニアであり、『Artificial Intelligence: A Systems Approach』、『GNU/Linux Application Programming』(現在、第 2 版です) や『AI Application Programming』(こちらも現在、第 2 版です)、それに『BSD Sockets Programming from a Multilanguage Perspective』などの著者でもあります。技術的な経歴は静止軌道衛星用のカーネル開発から、組み込みシステム・アーキテクチャーやネットワーク・プロトコル開発まで、広範にわたっています。彼はコロラド州ロングモン在住で、Intel に勤務するプラットフォーム・アーキテクトであり、執筆活動も行っています。