独自のブラウザー拡張機能を作成する: 第 1 回、Chrome を拡張する

Chrome 用のベーシックなブラウザー拡張機能を作成する

どのブラウザーにも、それぞれに固有の長所と短所があり、支持する人もいれば、批判する人もいます。そのなかで、すべてのブラウザーに共通して言えることは、人々がブラウザーで費やす時間がますます増えているということです。 この連載では、Chrome、Firefox、および Safari を対象に、共通のベーシックな拡張機能を作成する方法を検討します。それによって、それぞれのブラウザーを拡張する作業とはどのようなものなのか、また共通する作業の難易度はどの程度なのか、さらには拡張機能を配布する方法とはどのようなものなのかを説明します。今回の記事では、Chrome の拡張機能を作成します。

2013年 3月 13日 ― 概要の内容を更新するとともに、「参考文献」に第 2 回、第 3 回、第 4 回の記事に関する項目とリンクを追加しました。

はじめる前に

この連載について

この全 4 回からなる連載では、3 つのブラウザー (Chrome、Firefox、Safari) を対象に Gawkblocker と名付けた拡張機能を作成します。

  • 今回の記事では、Google Chrome の拡張機能を作成するところから、Chrome ウェブストアに配置するまでのプロセスを説明しています。
  • 第 2 回では、Mozilla Firefox 用のアドオン (拡張機能) を作成します。
  • 第 3 回では、この拡張機能を Safari ブラウザー用に調整します。
  • 第 4 回では、作成したコードを特定のブラウザーに依存しないように微調整します。

この記事の手順に従うには、Google Chrome バージョン 19 もしくはそれ以降のバージョンをダウンロードしてインストールする必要があります (記事で記載する例は、バージョン 19 をベースにしています)。また、HTML、CSS、および JavaScript を編集するためのツールも必要です。Chrome や Chrome の拡張機能を使用した経験があると役立つので、事前に Chrome ウェブストア (「参考文献」を参照) をブラウズして利用可能な拡張機能を調べ、いくつか試してみてください。それが、この記事に必要な背景知識をもたらしてくれるはずです。

ブラウザーの拡張機能を作成する理由

ブラウザーの拡張機能を作成しようと思う理由はいくつかあります。ブラウザー拡張機能の一般的な用途は、ブラウザーが別のアプリケーションまたはサービスとやりとりできるようにすることです。そのような拡張機能としては、Evernote、1Password、Adobe Shadow をはじめ、数多くの例があります。また、ブラウザーに欠けている機能を新しく追加するために、開発者用ツールやスクリーン・キャプチャー・ユーティリティーを追加する場合もあります。さらには、スポーツのスコア追跡機能や、特定の Web サイトに対する機能強化、そして天気予報など、さまざまな目的に絞り込んで拡張機能を作成している開発者もいます。このように、拡張機能を用いてさまざまなことが行われています。皆さんであれば拡張機能で何をするのでしょう。


この記事で作成する拡張機能について

Chrome で拡張機能を作成する実際のプロセスを説明するために、この記事では Gawkblocker と名付けた拡張機能を作成します。Gawkblocker は、ユーザーが何らかの理由でアクセスしたくない特定のドメインをブロックできるようにするための拡張機能です。Gawkblocker には以下のコンポーネントがあります。

  • ポップアップ (ブロック中のサイトを表示)
  • ブラウザーに表示されるアイコン (この拡張機能のエントリー・ポイント)
  • オプション選択ページ (ブロックするドメインと、リダイレクト先を構成するページ)

大まかに言うと、Gawkblocker は個々のタブまたはウィンドウにリスナーをアタッチし、そのタブで URL が変更されると、その URL をブロック対象のドメインのリストと比較します。ブロック対象のドメインのいずれかと URL が一致する場合には、リクエストを別のページにリダイレクトします (図 1 を参照) 。

図 1. Gawkblocker 拡張機能
Gawkblocker によってブロックの対象とされているサイトを示す画面のスクリーン・キャプチャー

Gawkblocker は、特定の方法でブラウザー内部に入り込み、この連載で作成する他の拡張機能でも実行することになる特定の処理を行います。皆さんは以下の質問に回答する必要があります。

  • ブラウザーの UI のどこかにその拡張機能の存在を示すようにする難易度はどの程度か?
  • ブラウザーのセッション間でデータを保持するために必要なものは何か?
  • 拡張機能を構成するコンポーネント同士はどのような方法でやりとりするのか?
  • ユーザーのデータのどこまでアクセスできるようにするのか?

Gawkblocker を作成するプロセスから、以上の質問の答えが見つかるはずです。


参考になるドキュメント

皆さんの参考になるドキュメントは、Google Chrome Extensions のドキュメント (「参考文献」を参照) です。Chrome 拡張機能を作成するためのこのドキュメントの大部分は、かなり詳しく説明されています。「Hello World」拡張機能の作成方法に関する 1 ページの簡単なチュートリアルには、拡張機能を作成する方法のごく大まかな概要が示されていますが、その詳しい方法を理解する上ではあまり役に立ちません。


Chrome 拡張機能の構成内容

典型的な Chrome 拡張機能は、マニフェスト・ファイルと、背景ページ、UI ページ、コンテンツ・スクリプトの組み合わせで構成されます。

すべては manifest.json という名前のマニフェスト・ファイルから始まります。皆さんが作成した拡張機能のロード方法について Chrome が認識する必要のある情報は、このファイルに格納されます。例えば、拡張機能のタイトル、説明、必要な権限、アイコン参照などの情報です。

背景ページは、開いているタブやウィンドウの数によらず、独自のコンテキストで起動されて実行される単一のページです。拡張機能が使用できる背景ページは 1 つに限られます。Chrome 内のすべてのページで持続的に実行されるプロセスがあるような拡張機能には、背景ページが役立ちます。

UI ページとは、拡張機能がユーザーに表示する任意のページのことを意味します。UI ページとして考えられるのは、ポップアップ、オプション選択ページ、拡張機能を構成するページ、デフォルトの Chrome ページに手を加えたページ (新しいタブ・ページなど) などです。

コンテンツ・スクリプトとは、Web ページとやりとりするためにそのページに注入される JavaScript ファイルのことです。コンテンツ・スクリプトは、他とは別の独自のコンテキストで実行されますが、ページの DOM にアクセスすることができます。また、コンテンツ・スクリプトは特殊なメッセージ・パッシング API を使用して、拡張機能の他のページと通信することもできます。

Gawkblocker に使用するのは、マニフェスト・ファイル、コア機能 (移植可能にします) を格納する JavaScript ファイル、背景ページ、オプション選択ページ、ポップアップ、リダイレクト先のページ、そして 1 つまたは 2 つのアイコンです。各種のコンポーネントの説明を読みながら、拡張機能の動作を確かめるには、実際に機能する Gawkblocker 拡張機能を Chrome ウェブストアからダウンロードすることができます。


Gawkblocker のマニフェスト・ファイル

リスト 1 は、Gawkblocker の manifest.json ファイルの内容です。

リスト 1. Gawkblocker の manifest.json ファイル
{
  "name": "GawkBlocker",
  "version": "1.7",
  "description": "Tired of taking the Nerd Bait? Use GawkBlocker!",
  "background_page" : "background.html",
  "options_page": "options.html",
  "icons": {
    "16" : "images/GB-19.png",
    "48" : "images/GB-48.png",
    "128" : "images/GB-128.png"
  },
  "browser_action": {
    "default_icon": "images/GB-19.png",
    "default_title": "GawkBlocker",
    "default_popup": "popup.html"
  },
  "permissions": ["tabs"]
}

以下で、このファイルに含まれるエントリーの詳細を説明します。

version
拡張機能の新しいバージョンを Chrome ウェブストアにアップロードするときには、必ず version の値をプラスしてください。これを行わないと、アップロードは失敗します。
icons
icons プロパティー内には、アイコンのサイズに応じて使用可能なアイコンのリストが含まれます。Chrome はこのリストから、それぞれのコンテキストで使用する特定のサイズのアイコンを探します。リスト 1 に指定されていているアイコン・ファイルのパスは、拡張機能を基準とした相対パスです。
browser_action
browser_action を指定すると、URL バー (Chrome では、URL をオムニバーと呼んでいます) の右側にアイコンを配置し、そのアイコンをクリックすると何らかのアクションが行われるようにするということを Chrome に伝えることになります。この例では、ブラウザーのアクション・ボタンをクリックすると、ポップアップが表示されます。
browser_action を指定するのは、拡張機能を任意の Web ページに適用する場合のみです。特定のページあるいはページのタイプに適用する場合には、page_action を指定します。page_action と browser_action を同時に指定することはできません。いずれか一方だけを指定することができます。
permissions
この例の場合、permissions に指定する必要があるパーミッションは、「tabs」だけです。このパーミッションにより、個々のタブに関する情報が提供されます (そのうち、必要な情報は URL だけです)。これ以外のパーミッションもありますが、必要なパーミッションだけを要求してください。Chrome と Android がパーミッションを処理する方法は極めて似通っています。ユーザーが拡張機能をインストールすると、Chrome は拡張機能が要求しているパーミッションを明示的に表示します。Android アプリケーションをインストールする場合も、同じような方法でパーミッションのリストが表示されます。

マニフェスト・ファイルの内容をひと通り説明したので、次は Gawkblocker に機能を提供するファイルについて見ていきましょう。


Gawkblocker のコア・クラス

Gawkblocker の機能の大部分は、1 つのコアとなる JavaScript ファイルによって制御されます。このファイルで定義するのは、セッション間でデータを保持するための SM (Storage Manager) オブジェクト (今のところ、これは単なる localStorage のラッパーです)、そして共通機能の一部 (ブロック対象サイトのリストとオプションの管理) を扱う GB (Gawkblocker) オブジェクトです。リスト 2 を参照してください。

リスト 2. SM オブジェクトと GB オブジェクトの定義
var SM = (function () {

    var my = {};

    my.get = function (key) {
        return localStorage.getItem(key);
    }

    ...

    return my;

}());

var GB = (function (SM) {
    var my = {};

    my.blockTheseSites = {
        "gawker.com"        : "Gawker Media",
        "io9.com"           : "SciFi Blog",
        "gizmodo.com"       : "Gadget Blog",
        ...
    }

    if (!SM.get("blocklist")) {
        SM.put("blocklist", JSON.stringify(my.blockTheseSites));
    }

    my.getBlockedSites = function () {
        return JSON.parse(SM.get("blocklist"));
    }

    my.setWatchThisInstead = function (value) {
        ...
    }

    my.getWatchThisInstead = function () {
        return SM.get("instead");        
    }

    my.addBlockedSite = function (site) {
        my.blockedSites = JSON.parse(SM.get("blocklist"));
        my.blockedSites[site] = "Custom Add";
        SM.put("blocklist", JSON.stringify(my.blockedSites));
    }

    my.removeBlockedSite = function (site) {
        my.blockedSites = JSON.parse(SM.get("blocklist"));
        delete my.blockedSites[site];
        SM.put("blocklist", JSON.stringify(my.blockedSites));
    }

    return my;
}(SM));

ここでは、ほどほどに移植しやすくする必要のあるいくつかのオブジェクトを作成するために、Module パターンを使用しました。次は、これらのオブジェクトが背景ページでどのように使用されるのかを見てください。


背景ページ

Gawkblocker は、背景ページを使用して URL をリッスンし、それらの URL をブロック対象サイトのリストと照合します。背景ページのインスタンスは 1 つしか使用できないことを思い出してください。1 つの背景ページが、開いているすべてのタブとウィンドウで共有されます (ただし、匿名ウィンドウについては例外です。そのパーミッションを要求するか、ユーザーが明示的に許可していない限り、匿名ウィンドウは背景ページを共有しません)。背景ページ自体には可視のコンポーネントがないため、このページには表示関連の HTML は含まれません。

リスト 3 に、タブの更新をリッスンするコードを記載します。

リスト 3. タブの更新をリッスンするコード
chrome.tabs.onUpdated.addListener(function(tabId, changedInfo, tab) {
    for (site in GB.getBlockedSites()) {
        if (tab.url.match(site)) {
            chrome.tabs.update(tabId, {"url" : GB.getWatchThisInstead()}, 
function () {});
        }
    }
});

ブロック対象サイトのリストを調べるには、上記よりも効率の良い方法がありますが、それは、この記事の焦点ではありません。それよりも、Chrome に接続する方法は、chrome.tabs.onUpdated.addListener を使用してコールバックを渡すことであることに着目してください。

chrome.* API 呼び出しはそれぞれに異なりますが、一般に上記のパターンに従って、メソッドを呼び出してコールバックを渡します。これらの API 呼び出しのほとんどは、非同期です。そのため、この動作を予期していなければ、タイミングの問題が発生する可能性があります。この件に関しては、リファレンス・マニュアルの説明を読んでください。


ポップアップ

Gawkblocker にはポップアップが必須というわけではありません。けれども、ポップアップを組み込めば、ユーザーは現在ブロック対象になっているサイトを簡単に確認することができます。リスト 4 に、ポップアップ・ページの最も興味深い部分を抜粋します

リスト 4. ポップアップ・ページ
$(document).ready(function(){
    $.each(chrome.extension.getBackgroundPage().GB.getBlockedSites(), 
function (index, value) {
        $("#blockedlist").append("<div class='siterow' title='"+value+"'>
<div class='sitename'>"+index+"</div><span class='sitedesc'> : 
"+value+"</span></div>");
    });
});

背景ページからポップアップに情報を取り込むために使っている方法は、chrome.extension.getBackgroundPage().GB.getBlockedSites() を呼び出すというものです。これは、拡張機能に含まれるページ間での通信を処理する唯一の方法ですが、ポップアップでこの方法を使う必要はありません。gawkblocker.js ファイルを組み込んで、GB オブジェクトを直接呼び出すこともできます。ただし、多数の非同期アクティビティーが行われるとしたら、さまざまなコンポーネントに同じ場所から質問させたほうが便利です。

このポップアップは背景ページに対して、ブロックされているサイトのリストを要求し、リストを取得すると、そのリストを繰り返し処理して、ブロック対象のサイトに関する詳細をポップアップ内の表示 div に追加します (図 2 を参照)。

図 2. ポップアップ
ブロック対象のサイトを表示する Gawkblocker のポップアップを示すスクリーン・キャプチャー

オプション選択ページ

拡張機能には、その動作を制御するための場所が必要です。マニフェストを使用して (この例でのように) オプション選択ページを指定すれば、ユーザーは拡張機能の管理ページからでも、あるいはブラウザーのアクション・ボタンを右クリックするという方法でも、簡単にオプション選択ページにアクセスすることができます。オプション選択ページは、それ自体がオプションです (図 3 を参照)。

図 3. オプション選択ページ
Gawkblocker に対して構成可能なオプションを示すスクリーン・キャプチャー

Gawkblocker ではこのオプション選択ページを使用して、ユーザーがブロック対象のサイトにアクセスしようしたときの動作を指定したり、ブロック・リストに新しいサイトを追加したり、あるいはブロック・リストからすべてのサイトを削除したりできるようにします (リスト 5 を参照)。

リスト 5. オプション選択ページ
$("#blockthistoo").click(function () {
    GB.addBlockedSite($("#dontgothere").val());
    ...
});

背景ページの情報を調べるには、ポップアップで使用した方法を使用することができます (リスト 6 を参照)。

リスト 6. 背景ページ
$("#blockthistoo").click(function () {
    chrome.extension.getBackgroundPage().GB.addBlockedSite($("#dontgothere").val());
    ...
});

それぞれの拡張機能に応じて、適切な方法は異なります。


リダイレクト先ページ

最後のコンポーネントは、リクエストをリダイレクトする際のリダイレクト先とするローカル・ページです。このページは、すべてのページのなかで最も単純なもので、YouTube の動画 (「Hey You! Don't Watch That! Watch This!」) を組み込むだけに過ぎません。このページは、拡張機能の他の部分と有意義なやりとりをすることのない、単なるプロセスの終着点です (図 4 を参照)。

図 4. リダイレクト先ページ
「WOULDN’T YOU RATHER WATCH MADNESS?」というタイトルでブラウザー上に動画を流すページのスクリーン・キャプチャー

仕上げ

この素晴らしい拡張機能は完成しましたが、これを試してみるにはどうすればよいのでしょう?それには、まず初めに、拡張機能のファイルをパッケージ化しないでロードします。これは、「パッケージ化されていない拡張機能のロード」と呼ばれ、拡張機能の管理ページ (「参考文献」を参照) から制御します (インストールした拡張機能を右クリックして「Manage Extensions (拡張機能の管理)」を選択するという方法もあります)。

パッケージ化されていない拡張機能のロードを実行するには、「Developer Mode (開発者モード)」ボックスにチェック・マークを付けて、「Load unpacked extension (パッケージ化されていない拡張機能のロード)」ボタンを有効にします。次に、「Load unpacked extension (パッケージ化されていない拡張機能のロード)」ボタンをクリックして、拡張機能が格納されているフォルダーにナビゲートします。マニフェスト・ファイルにエラーが含まれる場合、拡張機能が無効になるか、単にロードされないだけです。その場合には、Chrome がエラーを通知します。

作成した拡張機能を大勢の人々に配布する準備ができたと判断したら、そこで、いくつかの選択肢のなかから配布方法を選ぶことになります。ファイルをそのままの形で送信するという選択肢もありますが、その場合、ユーザーが拡張機能をインストールするには、同じく拡張機能の管理ページで開発者モードを有効にしなければならなくなります。他の選択肢としては、パッケージ化した拡張機能を配布するという方法や、拡張機能を Chrome ウェブストアに登録するという方法があります。


パッケージ化した拡張機能の配布

拡張機能の管理ページには、「Load unpacked extension (パッケージ化されていない拡張機能のロード)」ボタンの隣に「Pack extension (拡張機能のパッケージ化)」ボタンがあります (図 5 を参照)。このボタンをクリックすると、拡張機能を配布用にパッケージ化するプロセスが開始されます。その際 Chrome は、パッケージ化されていない拡張機能のディレクトリーと (オプションで) 秘密鍵ファイルを指定するよう求めてきます。秘密鍵ファイルについては、この後すぐに説明します。

図 5. 拡張機能の管理ページ
Chrome 拡張機能の管理ページを示すスクリーン・キャプチャー

初めて拡張機能をパッケージ化すると、Chrome によって .crx ファイルと .pem ファイルの 2 つが生成されます。.crx ファイルは、パッケージ化されてそのまま配布できる状態の拡張機能です。もう一方の .pem ファイルは、前述の秘密鍵です。Chrome はこのファイルを安全に保管するように指示しますが、それは、更新を拡張機能にパッケージ化する必要がでてきたときに、この秘密鍵ファイルが必要になるからです。秘密鍵ファイルがなければ、Chrome はその更新をまったく新しい拡張機能として扱います。

拡張機能のパッケージ化が完了したら、そのパッケージを自分の気に入った方法で配布することができます。つまり、e-メールで送信することも、Web サイトにアップすることも、独自のインストーラーを作成してパッケージ化することも、フラッシュ・ドライブに収容することも可能であり、自分の計画に合ったあらゆる方法で拡張機能を配布することができるのです。自分で配布する場合の主な欠点は、更新プロセスにも自分で対処しなければならないことです。

Chrome 拡張機能に更新の確認をさせるには、更新をどこで探せばよいのかを指定する行をマニフェスト・ファイルに追加します (リスト 7 を参照)。

リスト 7. 更新の確認
{
  "name": "GawkBlocker",
  "version": "1.7",
  "update_url": "http://yourawesomedomain.com/ext/updates.xml",
  ...
}

そして、リファレンス・マニュアルの「Autoupdating (自動更新)」セクションに指定されているフォーマットに従った XML ファイルをホストする必要があります。これは複雑な作業ではありませんが、開発者側の作業が増えることは確かです。また、この方法の場合、作成した拡張機能は Chrome ウェブストアには公開されないということでもあります。


Chrome ウェブストアに拡張機能を追加する方法

自分で拡張機能を配布する場合に比べると、Chrome ウェブストアに拡張機能を配置するプロセスでは技術的な作業は減りますが、行わなければならない作業がいくつかあります。

まず、Chrome ウェブストアに開発者として登録します。それには、Google アカウントが必要です。Google にサインインして、「Developer Dashboard (開発者ダッシュボード)」に進み、そこで開発者として登録します。登録費としての 5.00 ドルは、Google ウォレットを使用して支払う必要があります。Google アカウントが十分に利用されているアカウントであれば、「Developer Dashboard (開発者ダッシュボード)」ですぐにアカウントがアクティブになりますが、新規のアカウントであったり、あまり使用していないアカウントであったりすると、アカウントの確認に少し時間がかかります。

開発者として登録した後、パッケージ化されていない拡張機能が保管されているディレクトリーに戻って、すべての拡張機能のファイルを 1 つの zip ファイルに圧縮します。圧縮するファイルは、HTML ファイル、CSS ファイル、JavaScript ファイル、そして使われているすべての画像ファイルだけです。.crx ファイルや .pem ファイルは含めないでください。.crx ファイルは、Chrome ウェブストアが zip ファイルから生成し、そのファイルに .pem 秘密鍵ファイルの署名を付けます。

アカウントが有効になって、zip ファイルの用意ができたら、ダッシュボードに表示されている青色の大きな「Add new item (新規アイテムの追加)」ボタンをクリックしてください。これで、拡張機能がアップロードされます (図 6 を参照)。

図 6. Chrome ウェブストア
Chrome ウェブストアの開発者ページのスクリーン・キャプチャー

zip ファイルに問題がある場合は、ダッシュボードにエラー・メッセージが出力されます。zip ファイルが適切に作成されていて、マニフェスト・ファイルの記述が適切なフォーマットになっていれば、拡張機能に関するメタ・データ (スクリーン・キャプチャー、国、説明など) を入力するページが表示されます。拡張機能に関して該当する情報を入力すれば、後は簡単に Chrome ウェブストアに拡張機能をプッシュすることができます。


更新の仕組みを学ぶには

拡張機能が Chrome ウェブストアに追加されたら、更新プロセスがどのようなものかの感覚をつかむために、拡張機能に小さな変更を加えて、その更新を Chrome ウェブストアにアップロードしてください。よくある誤りは、マニフェスト・ファイルのバージョン番号を更新し忘れることです。更新をアップロードしたら、毎回必ず拡張機能の管理ページで「Update extensions now (拡張機能を今すぐ更新)」ボタンをクリックしてください。これで、拡張機能が更新されます。Chrome Extensions は数時間おきに ping を実行して更新の有無を確認するため、ユーザーが更新を入手できるようになるまでに時間はかかりません。


質問に対する回答

私たちの質問に対する答えがどの程度明らかになったかを検討してみましょう。

ブラウザーの UI のどこかにその拡張機能の存在を示すようにする難易度はどの程度か?: かなり簡単であることがわかりました。マニフェスト・ファイルに browser_action を指定して、アイコンを提供するだけで、拡張機能の存在を示すことができます。

ブラウザーのセッション間でデータを保持するために必要なものは何か?: Chrome では、アプリケーションを再起動した後も保持される localStorage にアクセスします。これにより、ブラウザーのセッション間で極めて簡単にデータを保持することができます。

拡張機能を構成するコンポーネント同士はどのような方法でやりとりするのか?: chrome.extension.getBackgroundPage() を使用すれば、すべてのページが背景ページとやりとりすることができます。また、メッセージ・パッシング API により、拡張機能のさまざまなコンポーネント同士が必要に応じてやりとりできるようになります。

ユーザーのデータのどこまでアクセスできるようにするのか?: ユーザーが許す限り、どのデータにもアクセスすることができます。パーミッションにはそれぞれ固有の注意事項がありますが、ユーザーには、これらのパーミッションが意味する内容が完全に明らかにされるわけではありません。


まとめ

Chrome のベーシックな拡張機能を作成し終わった今、さらに高度な拡張機能を作成できるようになるまでに、それほど時間はかからないでしょう。chrome.* API には豊富な機能があり、皆さんはそれを利用することができます。今回の記事では、その表面をかじったに過ぎません。基本を学んだところで、今回学んだ内容をはじめから見直して、Chrome をどこまで拡張できるか調べてください。


ダウンロード

内容ファイル名サイズ
Article source codeGawkBlocker.zip60KB

参考文献

学ぶために

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

  • Google Chrome Release Channel の開発者向けチャネルを使用して、最新バージョンの開発者用ツールを入手してください。
  • ご自分に最適な方法で IBM 製品を評価してください。評価の方法としては、製品の試用版をダウンロードすることも、オンラインで製品を試してみることも、クラウド環境で製品を使用することもできます。

議論するために

コメント

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, Web development, XML
ArticleID=835710
ArticleTitle=独自のブラウザー拡張機能を作成する: 第 1 回、Chrome を拡張する
publish-date=03132014