2012年5月11日金曜日

Japanese for Programmers

 

You too can find work as a programmer in Japan!

Programming and software development is one of the few fields where non-Japanese can find great jobs in Japan. But in order to work in Japan, it is essential to learn the Japanese language. Especially, one must know the lingo used in the field where one is working -- namely software!

For this purpose, I have gathered notes during my four years working in the Japanese mobile software industry, from real business and technical conversations, e-mails, and countless software specifications. All material on this page comes from real-world usage by Japanese native speakers. Of course, I have edited it a little to not reveal any business secrets. :)
 

Essential Japanese programming vocabulary

These words are core to our profession as software developers. Let's memorize these first before moving on to the heavier stuff.

�数 (hensū) variable

Related words:

  • 割り当てる (wariateru) to assign

Useful derivatives:

  • �境�数 (kankyō hensū) environment variable
  • 外部�数 (gaibu hensū) external variable
  • 共用�数 (kyōyō hensū) shared variable
  • 局所�数 (kyokusho hensū) local variable
  • グロ�バル�数 (gurōbaru hensū) global variable
  • 静的�数 (seiteki hensū) static variable
  • 定��み�数 (teigi-sumi hensū) built-in/predefined variable
  • �数名 (hensū-mei) variable name.
�数 (kansū) function

Related words:

  • 呼び出す (yobidasu) to call (also just 呼ぶ (yobu))
  • 引数 (insū/hikisū) argument (i.e. to a function)
  • 返却� (henkyakuchi) return value
    (Also �り� (modori-chi))

Useful derivatives:

  • 再��数 (saiki kansū) recursive function
    (再� (saiki) in itself means recursion, and 末尾再� (matsubi saiki) is tail recursion)
  • 定��み�数 (teigi-sumi kansū) predefined function
  • メンバ��数 (membā kansū) member function (in C++ or Java, for instance)
  • �数呼び出し (kansū yobidashi) function call
  • �数名 (kansū-mei) function name
  • ��する (fukki suru) to return
メモリ (memori) memory, and the stuff you can do with it

Related words:

  • �保する (kakuho suru) to allocate (memory/resource)
  • �得する (kakutoku suru) to acquire (memory/resource)
  • 解放する (kaihō suru) to release/free (memory/resoruce)
  • 漏れ (more) a leak (watch out for these!)
    (Also メモリリ�ク (memori rīku) memory leak)
More useful Japanese programming words

  • 列� (rekkyo) enumeration
  • 配列 (hairetsu) array
  • 文字配列 (moji hairetsu) (character) string
  • �述(子) (kijutsu(shi)) descriptor (e.g. file descriptor/handle)
  • 演算 (enzan) operation (e.g. 浮�小数点演算 (fudōshōsūten'enzan) floating point operation)
  • 差分 (sabun) a diff
  • 例外 (reigai) exception
    (例外を投げる (reigai o nageru) throw an exception)
  • ホゲ (hoge) foobar

Improve your business Japanese!

Gain an advantage by knowing essential business lingo before you're put in front of the customer. This is the best book I know for studying the language used in sales/technical negotiation situations.

Expressions for communicating technical issues

This is a collection of useful expressions for communication technical issues in Japanese to clients, customers, and superiors. Memorize these expressions and then adapt them to the situation you're in, and you will be able to communicate effectively.

Bugs and corrections

  • 本修正は、次回リリ�スに含まれる予定です。
    (Hon-shūsei wa jikai-rirīsu ni fukumareru yotei desu.)
    This modification/fix will be included in next release.

  • 技�的には可能ですが、かなりのリスクを伴う仕��更となりますので、スケジュ�ルの�点からは�理だと思います。
    (Gijutsu-teki ni wa kanō desu ga, kanari no risuku wo tomonau shiyō-henkō to narimasu node, sukejūru no shitek kara wa muri da to omoimasu.)
    This is technically possible, but it would mean a change to the specification that involves quite a risk, so from a scheduling viewpoint it is not possible.

  • ��の原因が特定できました。弊社�にて修正いたします。
    (Mondai no gen'in ga tokutei dekimashita. Heisha-gawa ni te shūsei itashimasu.)
    The cause of the problem has been determined. We will fix it on our side.

  • 本件、弊社�品の仕�となります。
    (Honken, heisha seihin no shiyō to narimasu.)
    This issue is according to our specification.

Software releases

  • 追加された�能、既知の不具合、未�装の�能につきましては、同�のrelease-note.txtをご参照ください。
    (Tsuika sareta kinō, kichi no fuguai, mi-jissō no kinō ni tsukimashite wa, dōkon no release-note.txt o go-sanshō kudasai.)
    Please refer to the included release-note.txt regarding added features, known bugs, and not yet implemented features.

  • ZIPファイルには次のものが含まれています。
    (Zip-fairu ni wa tsugi no mono ga fukumareteimasu.)
    The following items are included in the zip file.

  • ご不明点などありましたらお手数ですがご��ください。
    (Go-fumeiten nado arimashitara, o-tesū desu ga go-renraku kudasai.)
    If there are any points that are not clear, sorry to bother you but please get in contact.

  • 弊社にてこちらをサポ�トするにはかなり��を要するため、今回のリリ�スにて��することは�しい状�です。
    (Heisha ni te kochira o sapōto suru ni ha kanari jikan o yō suru tame, konkai no rirīsu ni te taiō suru koto ha muzukashii jōkyō desu.)
    Since supporting this requires quite some time, the circumstances are such that supporting it in this release would be hard.

Need to improve your kaisha communication?

This is absolutely essential if you're working in a Japanese company (kaisha), but even if you're in a foreign-held business (gaishikei) you'll often have to deal with everyday Japanese office dues, such as answering and forwarding the phone, setting up meetings, and all the other practical ordeals. (Yeah, all we really wanna do is program, right? But sometimes stuff gets in the way...)

More useful Japanese expressions

These expressions come in handy especially when communicating with customers. In Japanese, you can essentially never be too polite!

Expressing thanks, courtesy, and apology

  • お忙しい中�料を送付いただきましてありがとうございます。
    (O-isogashii naka shiryō o sōfu itadakimashite arigatō gozaimasu.)
    Thank you for sending the materials while we know you are busy.

  • 初めてご��させていただきます。よろしくお�いたします。
    (Hajimete no go-renraku sasete itadakimasu. Yoroshiku onegai itashimasu.)
    This is the first time I contact you. I look forward to working with you.

  • お忙しい中ご回答いただきましてありがとうございます。
    (O-isogashii naka go-kaitō itadakimashite arigatō gozaimasu.)
    Thank you for providing us with an answer while you're surely busy.

  • お�束していたご��が�くなり大�申し�ございません。
    (O-yakusoku shite ita go-renraku ga osoku nari taihen mōshiwake gozaimasen.)
    I am terribly sorry for the delay in the promised communication.

  • ご了承�き、ありがとうございます。
    (Go-ryōshō itadaki, arigatō gozaimasu.)
    Thank you for understanding.

Asking for or providing follow-up

  • またご���き、こちらで��がないかご���けますでしょうか?

    (Mata go-kakunin itadaki, kochira de mondai ga nai ka go-renraku itadakemasu deshō ka?)
    Could we ask you to reconfirm and then inform us whether there are no problems here?

  • �明が不十分でしたら、ご指摘お�いいたします。
    (Fumei ka fujūbun deshitara, go-shiteki onegai itashimasu.)
    If there's anything unclear or unsatisfactory, please indicate it to us.

  • 差分情�がいただけるのであれば�きたいという要望を以前から致しておりますが、ご��をお�い致します。
    (Sabun jōhō ga itadakeru no de areba itadakitai to iu yōbō o izen kara itashite orimasu ga, go-kento o onegai itashimasu.)
    We have made the request before to receive information regarding changes, so please consider it.

  • �在弊社内で解析を行っておりますが、まだ��に至っておりません。アップデ�トあり次第、ご��させていただきます。
    (Genzai heisha-nai de kaiseki o okonatte orimasu ga, mada ketsuron ni itatte orimasen. Appudēto ari shidai, go-renraku sasete itadakimasu.)
    An analysis is currently being conducted in our company, but we have not yet arrived at a conclusion. We will contact you as soon as there is an update.

Expressing cooperation

  • ご提案いただいた日程で�めたいと思います。
    (Go-teian itadaita nittei de susumetai to omoimasu.)
    We would like to proceed according to your suggested schedule.

  • ただ今��中でございますが、いつごろまでに回答ができそうか��、ご��差し上げます。
    (Tada ima chōsa-chū de gozaimasu ga, itsu-goro made ni kaitō ga dekisō ka kakunin, go-renraku sashiagemasu.)
    We are currently investigating it, and we will contact you regarding when it looks like we can provide an answer.

  • 弊社都合ばかりで申し�ございません。
    (Heisha tsugō bakari de mōshiwake gozaimasen.)
    I am sorry for being selfish all the time.

  • ご多忙中とは思いますが、��をよろしくお�いいたします。
    (Go-tabō-chū to wa omoimasu ga, chōsa o yoroshiku onegai itashimasu.)
    I think you are very busy right now, but please investigate it.

Kanji literacy is essential

Not being able to read is called illiteracy - and it's not for you!

Literacy is an absolutely essential part of being fluent in any language. And guess what -literacy in Japanese means knowing your kanji! I know that some people think learning kanji is painfully boring, but for me it's always been a fun and interesting challenge. Learning kanji thoroughly really pays off in advancing your knowledge of Japanese. Fortunately, there are some simple tips and tricks you can utilize to learn kanji quickly, and of course some really great books:
 

A look at a software specification

This is an excerpt from a real Japanese software specification, just somewhat anonymized, but the wording is untouched. Have a look and see how much you understand. Below is an explanation of the content.



A file read interface specification

So this is a specification for the function IFile_read, part of the IFile interface. There are 5 subheaders: �明 (setsumei) - explanation, プロトタイプ (purototaipu) - prototype, i.e. the C declaration for the function, パラメ�タ (paramēta) - parameters to the function, �り� (modori-chi) - return values, and コメント (komento) - comments. Pretty straight-forward stuff, huh?

The description says that this function reads out data from a file pointer to the target file. It also adds that if the this function (本�数) returns EWOULDBLOCK, then the device should be activated by running IFile_acquire.

The comment section

The comment section begins with a note on the buffer size. It says that when this function is executed (本�数�行� (hon-kansū jikkō-ji)), the application (アプリ (apuri)) must specify the size of pBuf in pBufSize. When the function returns (�数��� (kansū fukki-ji)), the size of data actually read in (��に�み�まれたサイズ (jissai ni yomikomareta saizu)) is stored (格� (kakunō)) in pBufSize.

The last bit of the comment section deals with how to detect that the end of file has been reached (ファイル�端まで�みきったかどうかの判断方法 (fairu-shūtan made yomikitta ka dō ka no handan-hōhō)). When this is the case, the following requirement/condition (条件 (jōken)) holds: The return value of this function (本�数の�り� (hon-kansū no modori-chi)) is SUCCESS, and pBufSize is 0. The comment section ends with a note that not being able to read the whole specified buffer size (指定したバッファサイズ未�しか�み�めなかったこと (shitei shita baffa-saizu miman shika yomikomenakatta koto)) and having read until the end of the file are not equivalent (等� (tōka)). The last sentense says that this is for performance reasons (パフォ�マンス等の理由から (pafōmansu nado no riyū kara)), after a fixed time (一定��後 (ittei jikan-go)), the function may return.

New technical vocabulary used

  • �象 (taishō) target, object (of something), subject (of something)
  • �み出す (yomidasu) to read out (data)
  • 有�化 (yūkō-ka) to make effective/available
  • �み取る (yomitoru) to read in (data)
  • 格� (kakunō) storage (especially in computer memory)
  • �行 (jikkō) execute (function, program, etc)
  • 不正 (fusei) invalid (parameter, etc)
  • 指定する (shitei suru) to specify (a value, parameter, setting, etc)
  • 状� (jōtai) state (of things)
  • 外部メモリ (gaibu memori) external memory
  • 未�入 (mi-sōnyū) not inserted
  • アプリ (apuri) application (short for of アプリケ�ション (apurikēshon))

2012年5月10日木曜日

Android版「Google Maps 6.7」が公開に--「Google Offers」などを統合

 Android版「Google Maps 6.7」が公開された。大きな変更点は、「Google Offers」の情報が地図中に表示されるようになったことだ。新バージョンでは、地図を閲覧しながら近くのお得情報のリストを引き出したり、地図上に直接表示して見ることもできる。この新機能が便利なのは、その場で即使える情報(基本的にはデジタルクーポン)と事前購入が必要な情報(Grouponなど)の両方が表示される点だ。お得情報を保存し、後からメインメニューの「My Offers」画面から呼び出すことも自由にできる。ただし残念ながら、Google Offersを閲覧できるのは今のところ米国のGoogle Mapsユーザーのみだ。

 Google Maps 6.7に追加されたその他の重要な変更としては、建物内の経路案内ができるようになった点が挙げられる。覚えているかもしれないが、2011年11月のアップデートで、Android版のGoogle Mapsでは米国および日本の一部の空港、さらにはショッピングモールをはじめとする商業施設について、建物屋内の見取り図が追加されていた。今回の新バージョンではさらに、こうした建物内の経路が表示できるようになった。広いターミナルや大規模小売店鋪内で急いで目的の場所に向かう時に、この機能は大きな助けになるだろう。

 最後に、「Google Business Photos」もGoogle Maps内に統合された。これによりユーザーは一部施設の内部のパノラマ写真を見ることができる。Google Business Photosプログラムに馴染みがない人向けに説明すると、これは「Street View」のようなものだが、対象が屋内だという点が異なっている。さらに視点をぐるりと回転させ、360度全方位を見ることも可能だ。

 Android版Google Maps 6.7は「Google Play」からダウンロードできる。

Microsoft、PC 内蔵のスピーカー&マイクだけでジェスチャー検知する技術を完成

Microsoft Research は、Washington 大学と協力して、潜水艦のソナーと同様の方法で、物体検出やジェスチャー認識を行う技術を開発した。この技術では同社のゲーム用のジェスチャーセンサーである Kinect は使用せず、PC に内蔵されたマイクとスピーカーだけで物体認識が可能だという。

このサウンドウェーブと呼ばれる新技術では、音質が距離によって変化するドップラー効果を使用する。具体的には、コンピュータの内蔵スピーカーから 18 〜 22 KHz の音波を出し、人物の手や体の動きで変化する音をマイクで拾い、その差分によってジェスチャーを検知する仕組み。

このシステムの利点はハードウェアの追加が不要なことだがその半面、ひと組のスピーカーとマイクだけで検知するので Kinect などのような精度の高い 3D センシングは出来ない。それでも手の上げ下げで画面スクロールしたり、左右に手をはたくだけで横スクロールなどを行うことは十分に可能だ。暗騒音の多い室内環境でも 90 〜 100 % の精度でジェスチャーを検知するとしている。

Facebook、ソーシャルアプリストア「App Center」を発表

 米Facebookは現地時間2012年5月9日、人々がソーシャルアプリケーションを見つけるための新たな場所とする「App Center」を発表した。数週間以内にWeb版を利用可能にするほか、iOSおよびAndroid対応のFacebookアプリケーションからもアクセスできるようにする。

 App Centerでは、Facebookのキャンバスページ内で動作するキャンバスアプリケーションや、Facebookと連携するWebアプリケーションおよびモバイルアプリケーションを紹介し、手軽に使用できるようにする。すべてのアプリケーションに説明ページが設けられているため、「ユーザーはそのアプリケーションの特徴や人気の理由を理解してから使用することができる」と同社は述べている。

 App Centerでのアプリケーション登録を望む開発者向けには、説明ページ作成や申請のためのチュートリアルを公開している。登録するアプリケーションはApp Centerのガイドラインに準じている必要がある。

 Facebookは、ユーザーによるアプリケーションの格付けや使用頻度などを測定する手段を用いて、アプリケーションの品質を監視する。評判の高いアプリケーションはApp Centerで目立つように表示し、評価が低いアプリケーションやガイドラインの品質基準を満たしていないアプリケーションはリストから除外する。

 また、有料アプリケーション向けにシンプルな決済機能を用意する予定。ユーザーは定額料金を支払ってFacebookサイト上でこれらアプリケーションを使用する。有料アプリケーションのベータプログラムへの参加を希望する開発者は専用ページから申し込む。

dialog要素が追加された

 一般的なダイアログを表す新しい要素、dialogがWHATWG HTML(コミュニティベースで進められている、HTML仕様を更新していくためのワーキンググループ)に追加されました(4.11.6 The dialog element)。

 この新要素がHTML5にも反映されるのか、実装が登場するのかは未知数ですが、WebアプリにダイアログのUIは不可欠なだけに、使い勝手がよさそうで期待できます。以下の記事によれば、ダイアログをフルスクリーン表示することも可能なようです。

File API関連の2仕様が公開

 File API:Writer(Webアプリからのファイル書き出しを実現する仕様)とFile API:Systems and Directories(Webアプリが利用可能な仮想ファイルシステムの仕様)が正式に公開されました。

HTML Editing APIsが公開

 Webページ上でWYSIWYGエディタを作成するためのAPIが公開されました。以前はHTML5仕様の一部でしたが、ラストコール前に分割されたものです。
 

SPDY (スピーディ) プロトコル (前半部) 日本語訳

先日、Google が SPDY プロトコル (スピーディプロトコル) を発表しました。

私も興味があったので、その仕様書を読みつつ日本語訳を書いてみました。とりあえず、概要 (overview) から接続 (connections) までを翻訳してます。スピーディの特徴を把握することは出来ると思います。

続きは、私が余力があればいずれ書きたいと思います。どなたか書かれましたら教えていただければと思います。

SPDY プロトコル

概要

現行の HTTP のボトルネックのひとつは、HTTP は同時並行性 (concurrency) に関して複数の接続にのみ依存しているということです。これは、接続開始のための余計なラウンドトリップ、開始の遅さ、単一のサーバーに大量の接続を開始することを避けるためのクライアントによる接続制限 (訳注: constant rationing はこのことを指すでしょうか) を含むいくつかの問題を引き起こします。HTTP パイプライニング (pipelining) はそのラインの先頭にてリクエストがブロックされるかもしれないので役に立たず、それに加えて多くのプロキシはパイプライニングをあまりよくサポートしていません。多くの接続を作成しようとするアプリケーションは、ドメイン毎の接続スロットリングを回避するために、多くのサブドメインを作成します。

SPDY はこのような現行の Web アプリケーションに関わるアプリケーション層の問題を解決することを目的とします。同時に Web アプリケーションを書く人の観点でいえば、ごくわずかの変更かあるいは全く変更がないようにします。

簡単に言えば、SPDY は単一の TCP 接続に、多重化された複数の同時平行ストリームのためのフレーミング層 (a framing layer for multiplexing multiple, concurrent streams) を追加します。フレーミング層は HTTP 的な要求応答ストリームに最適化されます。

SPDY セッションは HTTP と比較して、三つの基本的な改良を施します。

多重化された要求. 単一の SPDY 接続上で同時に発行できる要求数に上限はありません。単一のチャネル上で複数のリクエストが交互の行き来 (訳注: interleaved) するので、TCP の効率はずっと高まります。
優先順位付けされた要求. クライアントはあるリソースを先に到達させることを要求することが可能です。これによって優先度の高い要求が待ち状態でありながら、重要でないリソースによってネットワークチャネルが混雑した状態になることを防ぐことが出来ます。
圧縮されたヘッダ. 今日のヘッダは HTTP ヘッダを形作る大量の冗長なデータを送信しています。単一のウェブページは 50 あるいは 100 の従属的なリクエスト (subrequest) を必要とする場合があるので、このデータは重要です。ヘッダを圧縮することで HTTP と比べて待ち時間と大域幅を大幅に節約できます。
注意していただきたいのは、多くの部分で SPDY は既存の HTTP の特徴のセマンティクスをそのまま残そうとしていることです。クッキー、ETag、Vary ヘッダ、Content-Encoding ネゴシエーションなどの全ての機能は、HTTP と全く同様に機能します。SPDY はネットワーク上でデータが記述される方法のみを置き換えるのです。

定義

接続 (connection): 二つのエンドポイントの間の TCP レベルコネクション
エンドポイント (endpoint): 接続のクライアントあるいはサーバーのどちらか
セッション (session): フレーム化されたデータチャンクの連続 (訳注: a framed sequence of data chunks) フレームは SPDY フレームとして定義されます。以下のフレーム化 (Framing) を参照してください。
ストリーム (stream): 単一の SPDY セッション内にて、仮想的なチャネルをわたるバイトの双方向の流れ。
HTTP からの主な相違点

SPDY は現行の Web ベースのアプリケーションと可能な限り互換性を保つことを意図しています。これはすなわち、サーバーのビジネスロジックあるいはアプリケーション API の観点からは、何も変更されないことを意味します。これを達成するために、アプリケーション要求及び応答のヘッダーセマンティクスはそのまま保持されます。SPDY は "セッション" を導入しますが、これは HTTP アプリケーション層と TCP トランスポートの間に入り、データの流れを制御します。この "セッション" は HTTP の要求-応答ペアと同種のものです。以下に SPDY と HTTP の違いを示します。

要求

新しい要求を開始するために、クライアントはまず新しい SPDY セッションを作成します。セッションがひとたび作られれば、そのクライアントは要求を運ぶための新しい SPDY ストリームを作ることが可能になります。ストリームを作成することの一部は、HTTP ヘッダブロックを送信することです。SPDY での HTTP ヘッダブロックは現行の HTTP ヘッダブロックとほとんど変わりありません。変更点は以下の点です。

要求の第一行は、他の HTTP ヘッダのように、名前/値ペアへと折り畳まれません。第一行のフィールドの名前は method, url, version です。これらのキーは必須です。url は完全に修飾された URL であり、プロトコル、ホスト、ポート及びパスを含みます。
ヘッダー名の重複は許されません。
ヘッダー名は全て小文字で表記されます。
Connection と Keep-Alive は無効となり、存在しても無視されます。
クライアントは Accept-Encoding: gzip をサポートすることが要求されます。ボディのエンコーディングを指定しないクライアントは、サーバーから gzip エンコードされたデータを受け取ります。
"host" ヘッダーは無視されます。HTTP URL の ホスト:ポート 部が最終的なホストになります。
ユーザーエージェントは、gzip と deflate 圧縮をサポートすること期待されます。ユーザーエージェントから送信された Accept-Encoding によらず、サーバーはいつでも gzip あるいは deflate を選択できます。
POST 固有の変更
POST 要求はポストの一部としてデータストリームを含むことが期待されます。以下のデータフローを参照。
Content-Length は単なるデータ長の参考値です (これによってプログレスメータが機能できます)
チャンクエンコーディングはもはや有効ではありません。
POST データストリームは長さ 0 のデータフレームで終了します。
応答

HTTP 要求に応答する時は、サーバーはクライアントによって作成された SPDY ストリームを使ってデータフレームを送信します。ヘッダーブロックにボディ部が続く構成であるという点においては、レスポンスは HTTP/1.1 と似ています。しかしながら、いくつか注目すべき変更があります。

レスポンスステータス行は、他の HTTP ヘッダーのようには名前/値のペアに折り畳まれません。ステータス行の名前は status と version です。これらのキーは必須です。
もし SPDY 応答が SYN_STREAM の前に発生したなら、それはパラメータを含みます。そのパラメータはクライアントに、このレスポンスを受け取ることになったリクエストの情報を 、url 及び method キーによって含みます。
ヘッダー名は全て小文字で表記されます。
Connection と Keep-Alive レスポンスヘッダーはもはや無効です。
Content-Length は単なる長さのアドバイザリとして扱われます。
チャンクエンコーディングはもはや無効です。
ヘッダー名の重複は許されません。
接続

SPDY セッションの最初の実装は TCP の上で動作します。これは今日の HTTP が機能する仕組みと同様です。クライアントは TCP 接続の開始者であることを期待されています。TCP 上で動作するので、信頼性のある通信を確保できます。HTTP とは異なり、SPDY による全ての接続は永続性のある接続になります。HTTP 接続ヘッダーは適用されません。

最高のパフォーマンスのため、ユーザーが現在の接続で参照している全てのページから外部へ出て行くかサーバーが接続を閉じるまでは、クライアントは接続を閉じないことを期待されます。サーバーは可能な限り接続を開いておくようにしますが、必要ならば動きのないアイドル状態の接続を切断することは可能です。

参考資料

タイトルの通り、この日本語訳資料は 2009年11月28日時点のドラフトを元に作成してあります。

最新版は本家 Chromium プロジェクトの SPDY プロトコル仕様書ページをご覧ください。

Google、HTTPを補う高速化プロトコル「SPDY」発表

GoogleがWebページ表示をスピードアップするプロトコル「SPDY」を発表した。テストではページ読み込み速度が最高で64%短縮できたとしている。

 Googleが目指しているWeb高速化の一環で、HTTPをサポートし、Webページ表示の遅延時間を最小限に抑えるという。

 SPDYに関するホワイトペーパー <http://dev.chromium.org/spdy/spdy-whitepaper> によると、同社はSPDYとともに、同プロトコル対応版のGoogle ChromeブラウザとオープンソースのWebサーバも開発した。これらのアプリケーションをHTTPとSPDYで稼働テストしたところ、ページ読み込み時間が最高で64%短縮できたという。

 SPDYはセッションレイヤーをSSLの上に追加するので、単一のTCP接続で複数の相互データストリームを並列処理できる。HTTPのGETとPOSTの書式はそのまま使うが、データのエンコードおよび送信の新しい作成フォーマットを定める。

 SPDYの目標はページ読み込み速度の50%短縮だ。Googleは開発者にプロジェクトへの参加を呼び掛けている。SPDY対応版Google ChromeのコードはChromeのサイト <http://src.chromium.org/viewvc/chrome/trunk/src/net/flip/> からダウンロードできる。

2012年5月9日水曜日

AndroidにおけるOracle対Google訴訟、陪審員はGoogleによる著作権侵害を認める

Androidに使用されているJava APIがOracleの保有する著作権を侵害しているとしてOracleがGoogleを提訴していたが、サンフランシスコ裁判所の陪審員はGoogleが著作権を侵害していたと判断し、Oracleに有利な部分判決を下したとのこと。

未決定審理となった個所に関しては、今週の終わりにも再審が開始されることになる。判決後、Googleは電子メールを通して声明を出しており、「争点の中心はAPIを特許にすることできるのかどうかであり、その判断は裁判所が下すことになる」としている。

だが、もし今回の裁判員判断が覆されることがなければJavaの自由が制限されてしまうことにもなり、プログラマーにとっては厄介な問題に発展する可能性がある。

2012年5月8日火曜日

JRE (Java SE Runtime Environment) 6 でサポートされているロケール

サポートされるロケールのセットは、Java SE (Java Platform Standard Edition) の実装や機能範囲の違いにより異なります。

ここでは、次の分野において Sun の JDK (Java SE Development Kit) 6 および JRE (Java SE Runtime Environment) 6 でサポートされるロケールについて説明します。

  1. java.util および java.text 機能で有効なロケール
  2. Java Foundation Class (JFC) で有効な書記体系
    1. 概要
    2. テキスト入力
    3. テキストのレンダリング
    4. ドラッグ&ドロップ
  3. ユーザーインタフェースの翻訳

Sun の Java SE Runtime Environment 6 の Windows 版は、完全な国際版とヨーロッパ言語版のどちらのバージョンでもインストールすることができます。JRE のインストールプログラムは、ホストオペレーティングシステムがヨーロッパ言語だけをサポートしていることを識別すると、デフォルトでヨーロッパ言語版をインストールします。インストールプログラムが他の言語の必要性を識別した場合、またはカスタマイズされたインストールでユーザーがヨーロッパ言語以外のサポートを要求した場合は、完全な国際化版がインストールされます。Solaris および Linux 版の JRE と、すべてのプラットフォーム版の JDK では、完全な国際化版が常にインストールされます。


1. java.util および java.text 機能で有効なロケール

java.util および java.text パッケージでのロケールに依存する動作のサポートは、ほぼ完全にプラットフォームから独立しています。そのため、すべてのロケールは、ホストのオペレーティングシステムとその地域には依存せず、同じ方法で同時にサポートされます。プラットフォームに依存している唯一の機能は、ホストオペレーティングシステムのロケールとタイムゾーンに基づいた、最初のデフォルトのロケールおよび最初のデフォルトのタイムゾーンの設定です。

Sun の Java SE Development Kit 6 と国際化版の Java SE Runtime Environment 6 は、次に示すロケールをすべてサポートしています。ヨーロッパ言語版の Java SE Runtime Environment 6 は、次の言語に対応するロケールをすべてサポートしています。アルバニア語、ベロルシア語、ブルガリア語、カタロニア語、クロアチア語、チェコ語、デンマーク語、オランダ語、英語、エストニア語、フィンランド語、フランス語、ドイツ語、ギリシャ語、ハンガリー語、アイスランド語、インドネシア語、イタリア語、ラトビア語、リトアニア語、マケドニア語、マレー語、マルタ語、ノルウェー語、ポーランド語、ポルトガル語、ルーマニア語、ロシア語、セルビア語 (キリル)、スロバキア語、スロベニア語、スペイン語、スウェーデン語、トルコ語、ウクライナ語。

サポートされているロケール

言語

ロケール ID

アルバニア語

アルバニア

sq_AL

アラビア語

アルジェリア

ar_DZ

アラビア語

バーレーン

ar_BH

アラビア語

エジプト

ar_EG

アラビア語

イラク

ar_IQ

アラビア語

ヨルダン

ar_JO

アラビア語

クウェート

ar_KW

アラビア語

レバノン

ar_LB

アラビア語

リビア

ar_LY

アラビア語

モロッコ

ar_MA

アラビア語

オマーン

ar_OM

アラビア語

カタール

ar_QA

アラビア語

サウジアラビア

ar_SA

アラビア語

スーダン

ar_SD

アラビア語

シリア

ar_SY

アラビア語

チュニジア

ar_TN

アラビア語

アラブ首長国連邦

ar_AE

アラビア語

イエメン

ar_YE

ベロルシア語

ベロルシア

be_BY

ブルガリア語

ブルガリア

bg_BG

カタロニア語

スペイン

ca_ES

中国語 (簡体字)

中国

zh_CN

中国語 (簡体字)

シンガポール

zh_SG(*)

中国語 (繁体字)

香港

zh_HK

中国語 (繁体字)

台湾

zh_TW

クロアチア語

クロアチア

hr_HR

チェコ語

チェコ共和国

cs_CZ

デンマーク語

デンマーク

da_DK

オランダ語

ベルギー

nl_BE

オランダ語

オランダ

nl_NL

英語

オーストラリア

en_AU

英語

カナダ

en_CA

英語

インド

en_IN

英語

アイルランド

en_IE

英語

マルタ

en_MT(*)

英語

ニュージーランド

en_NZ

英語

フィリピン

en_PH(*)

英語

シンガポール

en_SG(*)

英語

南アフリカ

en_ZA

英語

英国

en_GB

英語

米国

en_US

エストニア語

エストニア

et_EE

フィンランド語

フィンランド

fi_FI

フランス語

ベルギー

fr_BE

フランス語

カナダ

fr_CA

フランス語

フランス

fr_FR

フランス語

ルクセンブルク

fr_LU

フランス語

スイス

fr_CH

ドイツ語

オーストリア

de_AT

ドイツ語

ドイツ

de_DE

ドイツ語

ルクセンブルク

de_LU

ドイツ語

スイス

de_CH

ギリシャ語

キプロス

el_CY(*)

ギリシャ語

ギリシャ

el_GR

ヘブライ語

イスラエル

iw_IL

ヒンディー語

インド

hi_IN

ハンガリー語

ハンガリー

hu_HU

アイスランド語

アイスランド

is_IS

インドネシア語

インドネシア

in_ID(*)

アイルランド語

アイルランド

ga_IE(*)

イタリア語

イタリア

it_IT

イタリア語

スイス

it_CH

日本語 (グレゴリオ暦)

日本

ja_JP

日本語 (和暦)

日本

ja_JP_JP

韓国語

韓国

ko_KR

ラトビア語

ラトビア

lv_LV

リトアニア語

リトアニア

lt_LT

マケドニア語

マケドニア

mk_MK

マレー語

マレーシア

ms_MY(*)

マルタ語

マルタ

mt_MT(*)

ノルウェー語 (ボークモールå)

ノルウェー

no_NO

ノルウェー語 (ニーノスク)

ノルウェー

no_NO_NY

ポーランド語

ポーランド

pl_PL

ポルトガル語

ブラジル

pt_BR(*)

ポルトガル語

ポルトガル

pt_PT(*)

ルーマニア語

ルーマニア

ro_RO

ロシア語

ロシア

ru_RU

セルビア語 (キリル)

ボスニア - ヘルツェゴヴィナ

sr_BA(*)

セルビア語 (キリル)

セルビア - モンテネグロ

sr_CS(*)

スロバキア語

スロバキア

sk_SK

スロベニア語

スロベニア

sl_SI

スペイン語

アルゼンチン

es_AR

スペイン語

ボリビア

es_BO

スペイン語

チリ

es_CL

スペイン語

コロンビア

es_CO

スペイン語

コスタリカ

es_CR

スペイン語

ドミニカ共和国

es_DO

スペイン語

エクアドル

es_EC

スペイン語

エルサルバドル

es_SV

スペイン語

グアテマラ

es_GT

スペイン語

ホンジュラス

es_HN

スペイン語

メキシコ

es_MX

スペイン語

ニカラグア

es_NI

スペイン語

パナマ

es_PA

スペイン語

パラグアイ

es_PY

スペイン語

ペルー

es_PE

スペイン語

プエルトリコ

es_PR

スペイン語

スペイン

es_ES

スペイン語

米国

es_US(*)

スペイン語

ウルグアイ

es_UY

スペイン語

ベネズエラ

es_VE

スウェーデン語

スウェーデン

sv_SE

タイ語 (西洋数字)

タイ

th_TH

タイ語 (タイ語数字)

タイ

th_TH_TH

トルコ語

トルコ

tr_TR

ウクライナ語

ウクライナ

uk_UA

ベトナム語

ベトナム

vi_VN

(*) これらのロケールに関するデータは、Unicode Consortium の Common Locale Data Repository リリース 1.4 からそのまま抜粋したものです。


2. Java Foundation Class (JFC) で有効な書記法

2.1 概要

Java Foundation Classes (AWT、Swing、2D、Input Method Framework、ドラッグ&ドロップ) の場合は、通常、ロケールは書記体系によってのみ特徴付けられ、国や言語による特別な違いはありません。JFC 内の書記体系のサポートは、ホストオペレーティングシステムにある程度依存しており、複数言語の同時使用は、常に完全にサポートされるとは限りません。

ここでは、ある書記体系に対して、JFC によるすべての機能が次の状況で適切に動作する場合に、その書記体系が JFC でサポートされているとみなします。

  • Windows 98 の場合、その書記法を使用する言語によってローカライズされた Windows システムで実行されるとき。
  • Windows 2000、XP、および 2003 の場合、ユーザーロケールおよびシステムロケールの両方がその書記法を使用する言語に設定された Windows システムで実行されるとき
  • Solaris および Linux の場合、その書記体系を使用する言語、および下の表に示されている、その書記体系のエンコーディングの 1 つに設定されたロケールを使って、ホストオペレーティングシステムで実行されるとき

Sun の Java SE Development Kit 6 と国際化版の Java SE Runtime Environment 6 は、次に示す書記法をすべてサポートしています。ヨーロッパ言語版の Java SE Runtime Environment 6 は、キリル、ギリシャ語、およびラテンの書記法だけをサポートしています。ピア AWT コンポーネントは、書記体系のサブセットに対してのみサポートされます。表の右端の列を参照してください。

機能のそれぞれの範囲については、後の各項で詳しく説明します。

サポートされる書記法

書記体系

言語

Windows エンコーディング

Solaris エンコーディング

Linux エンコーディング

ピア AWT コンポーネント

アラビア語

アラビア語

1256

8859-6,
UTF-8

UTF-8(4)

非サポート

中国語 (簡体字)

中国語

936,
GB18030

gb2312、
UTF-8、
GBK、
gb18030

GB2312(2),
GB18030(3)(5)
UTF-8(4)(5)(7)

サポート

中国語 (繁体字)

中国語

950,
HKSCS

cns11643、
UTF-8、
BIG5、
BIG5HK

Big5(2)(3),
UTF-8(4)(5)

サポート

キリル

ベロルシア語、ロシア語など

1251

8859-5,
KOI8-R、

UTF-8

非サポート

サポート

デーバナーガリー

ヒンディー語

UTF-8

UTF-8

非サポート

非サポート

ギリシャ語

ギリシャ語

1253

8859-7

非サポート

サポート

ヘブライ語

ヘブライ語

1255

8859-8

UTF-8(4)

非サポート

日本語

日本語

932

eucJP(1)
UTF-8、
PCK

eucJP(1)(2)(3),
UTF-8(4)(5)(7)

サポート

韓国語

韓国語

949

5601,
UTF-8

EUC-KR(2)(3),
UTF-8(4)(5)

サポート

ラテン - バルト語派のサブセット

ラトビア語、リトアニア語

1257

8859-13

非サポート

サポート

ラテン - 中欧語派サブセット

チェコ語、ハンガリー語、ポーランド語など

1250

8859-2,
UTF-8

非サポート

サポート

ラテン - マルタ語派サブセット

マルタ語

UTF-8

UTF-8

非サポート

サポート

ラテン - トルコ語派サブセット

トルコ語など

1254

8859-9,
UTF-8

非サポート

サポート

ラテン - 西欧語派サブセット

英語、フランス語、ドイツ語、イタリア語、スペイン語、スウェーデン語など

1252

8859-1,
8859-15,
UTF-8

ISO-8859-1(2)
UTF-8(3)(4)(5)(6),

サポート

タイ語

タイ語

874

TIS620.2533、
UTF-8

非サポート

非サポート

(1) Solaris 上の eucJP は JIS 文字セットの X 0201、X 0208、および X 0212 をサポートし、Linux 上の eucJP は X 0201 と X 0208 のみをサポートする。 (2) Red Hat Enterprise Linux AS 2.1 上でサポートする
(3) Red Hat Enterprise Linux 3 AS、ES、WS 上でサポートする。
(4) Red Hat Enterprise Linux 4 AS、ES、WS 上でサポートする。
(5) Sun Java Desktop System リリース 3 上でサポートする
(6) SuSE Linux 10、SuSE Linux Enterprise Server 9 上でサポートする。
(7) Turbolinux 10 Desktop 上でサポートする

2.2 テキスト入力

テキスト入力に対するサポートは、キーボード配列の解釈と、インプットメソッドを使用したテキスト変換の、2 つの部分から構成されます。Java SE では、キーボード配列の解釈は、ホストオペレーティングシステムに全面的に依存しています。インプットメソッドを使用したテキスト変換については、Java SE では、Java プログラミング言語で開発されたインプットメソッドのほかに、ホストオペレーティングシステムのインプットメソッドマネージャーを使用した、ネイティブインプットメソッドもサポートされます。

Java プログラミング言語により実装されたインプットメソッドによるロケールのサポートは、インストールされているインプットメソッドのセットにのみ依存し、ホストオペレーティングシステムとそのローカリゼーションには依存しません。ただし、Java プログラミング言語により実装されたインプットメソッドをピアコンポーネントで使用する場合のサポートは、以下のように、その実装方法に依存します。

キーボード配列とネイティブインプットメソッドのサポートは、プラットフォームによって異なります。

Windows

Windows 98 では、JRE は、すべてのキーボード配列と、特定ローカライズ版のホストオペレーティングシステムにインストール可能な、IMM ベースのインプットメソッドの使用をサポートします。

Windows 2000、XP、および 2003 では、JRE は、すべてのキーボード配列と IMM ベースのインプットメソッドの使用をサポートします。

グローバル IME はサポートされません。

Java プログラミング言語に実装されたインプットメソッドは、Windows のすべてのバージョンのすべてのコンポーネントでサポートされます。

Solaris および Linux

JRE は、すべてのキーボード配列と、特定の Solaris または Linux ロケールで使用可能なインプットメソッドの使用をサポートします。

Java プログラミング言語に実装されたインプットメソッドは、Swing テキストコンポーネントなどの軽量コンポーネントでサポートされますが、AWT テキストコンポーネントなどのピアコンポーネントではサポートされません。

2.3 テキストのレンダリング

アプリケーションには、フォントを選択する 2 つのオプションがあります。

  • 論理フォント名の Serif、SansSerif、Dialog、DialogInput、および Monospaced の使用
  • 物理フォントの使用 (名前を指定して要求するか、Font.createFont メソッドでインスタンスを生成する)

軽量コンポーネント内でのテキストのレンダリング

論理フォント名を使用する場合は、少なくとも、ホストのロケールの書記体系と、ラテン書記体系の西欧語派サブセットによるテキストがサポートされます。

物理フォントを使用する場合は、単純書記体系と複雑書記体系を区別する必要があります。単純書記体系では文字とグリフが 1 対 1 で対応し、各グリフはベースライン上に左から右へと連続して配置されています。複雑書記法では、同じ文字でも文脈によって異なるグリフが使用されたり、合字が使用されたり、右から左へと書かれる場合があります。また、行のレイアウト中に再配置されたり、結合記号などにより、グリフの配置に別の規則が適用されることもあります。

2D のテキストレンダリングシステムでは、上の表に一覧表示されている単純書記体系と複雑書記体系のどのような組み合わせでもサポートされます。これらの制限内では、サポートされる書記体系の範囲はフォントによって決まります。1 つの TrueType フォントで、Unicode 全体に対応するグリフと、Unicode ベースの文字からグリフへの 1 つのマッピング情報を提供できます。このようなフォントによって、2D ではすべての単純書記体系のほか、複雑書記体系もサポートできます。その他の複雑書記体系はサポートされません。

ピアコンポーネント内でのテキストのレンダリング

論理フォント名を使用する場合は、少なくとも、ホストオペレーティングシステムのロケールの書記法によるテキストがサポートされます。

ピアコンポーネントでは、物理フォントはサポートされません。

印刷時のテキストのレンダリング

印刷 API には、次の 3 つがあります。

  • java.awt.print.PrinterJob.getPrinterJob メソッドを使用する 2D 印刷 API
  • java.awt.Toolkit.getPrintJob メソッドを使用する AWT 印刷 API
  • javax.print パッケージを使用する、プラグ可能サービスの印刷 API

AWT および 2D の印刷 API を使用したテキストレンダリングは、画面上のテキストレンダリングと同等の機能です。プラグイン機能サービスの印刷 API を使用したテキストレンダリングは、使用する印刷サービスによって異なります。 JRE により提供されるサービスは、画面上のテキストレンダリングと同等の機能です。

2.4 ドラッグ&ドロップ

Windows 98 の場合、ホストオペレーティングシステムのローカライズされた書記法によるテキストは、アプリケーション間で転送できます。

Windows 2000、XP、および 2003 の場合、すべての Unicode 文字セットを使用したテキストをアプリケーション間で転送できます。

Solaris および Linux の場合、ホストオペレーティングシステムのロケールの文字エンコーディングによるテキストをアプリケーション間で転送できます。

ホストオペレーティングシステムから独立した任意のテキストを転送する必要のあるアプリケーションでは、直列化を使用してテキストを転送します。それには、DataFlavor.stringFlavor フレーバのみをサポートする Transferable を作成します。このフレーバは、String の直列化表現を表します。転送先でも stringFlavor がサポートされていることを確認してください。転送時に、AWT は転送元で String を直列化し、転送先で直列化を解除します。この動作はネイティブプラットフォームのテキスト転送よりもかなり低速ですが、ネイティブの転送が利用できない場合に有効です。


3. ユーザーインタフェースの翻訳

Java SE Runtime Environment

Java SE Runtime Environment 6 で提供されるユーザーインタフェース要素には、Swing ダイアログや、実行環境によって標準出力ストリームと標準エラーストリームに書き出されるメッセージのほか、JRE の付属ツールによって生成されるメッセージも含まれます。ユーザーインタフェース要素は次の言語にローカライズされます。

言語

ロケール ID

中国語 (簡体字)

zh_CN

中国語 (繁体字)

zh_TW

英語

en

フランス語

fr

ドイツ語

de

イタリア語

it

日本語

ja

韓国語

ko

スペイン語

es

スウェーデン語

sv

Java SE Development Kit

Java SE Development Kit 6 で提供されるユーザーインタフェース要素には、JRE で提供される要素に加えて、JDK 専用ツールによって生成されるメッセージも含まれます。追加のユーザーインタフェース要素は、以下の言語にローカライズされます。

言語

ロケール ID

中国語 (簡体字)

zh_CN

英語

en

日本語

ja