apache commons ソースリーディングの会:codec

62
Apache Commons ソースリーディングの会

Upload: moai-kids

Post on 28-Jan-2015

113 views

Category:

Technology


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Apache Commons ソースリーディングの会:Codec

Apache Commonsソースリーディングの会

Page 2: Apache Commons ソースリーディングの会:Codec

本日のお題

Apache Commonsのライブラリ群のうちネット上でデータのやり取りを行う際に多く用いられる「符号化」関連の処理をつかさどる「Codec」を今日は取り上げます。

※符号化とは?→データを、後で復元可能な形で変換を加えること(encode)。また変換を加えられたデータを元に戻す事(decode)

Page 3: Apache Commons ソースリーディングの会:Codec

前提:なぜ符号化が必要?

以下のような用途が考えられる。(他にもあるかもしれません)•暗号化•圧縮•データの標準化文字コードや、動画・音声形式等々

•データのポータビリティダブルバイトの文字列をシングルバイトでも表現できるように変換する(ex.Base64)ことで多くのソフトがそのまま使用できる、など

Page 4: Apache Commons ソースリーディングの会:Codec

アジェンダ

✓Commons Codecについて概説✓org.apache.commons.codec✓org.apache.commons.codec.binary✓org.apache.commons.codec.digest✓org.apache.commons.codec.language✓org.apache.commons.codec.net✓まとめ

Page 6: Apache Commons ソースリーディングの会:Codec

パッケージ構成

• org.apache.commons.codec.binary- バイナリ処理関連のエンコーダー- Base64 / Hex / Binary Codec

• org.apache.commons.codec.digest- MD5やSHA1の符号化補助

• org.apache.commons.codec.language- 主に英語の言語処理の際に用いられる符号化- Soundex / Metaphone

• org.apache.commons.codec.net- インターネット上で使用される符号化- URLCodec(URL Encode) / Quoted Printable Codec /

BCodec / QCodec

Page 7: Apache Commons ソースリーディングの会:Codec

アジェンダ

✓Commons Codecについて概説✓org.apache.commons.codec✓org.apache.commons.codec.binary✓org.apache.commons.codec.digest✓org.apache.commons.codec.language✓org.apache.commons.codec.net✓まとめ

Page 8: Apache Commons ソースリーディングの会:Codec

org.apache.commons.codec

• 後述する各種パッケージのルート(親玉)になるもの。

• インターフェースの定義、ならびにExceptionの定義がされている。- Encoder / Decoder

- BinaryEncoder / BinaryDecoder- StringEncoder / StringDecoder

- StringEncoderComparator- DecoderException / EncoderException- CharEncoding(charset名を定数で管理)

Page 9: Apache Commons ソースリーディングの会:Codec

アジェンダ

✓Commons Codecについて概説✓org.apache.commons.codec✓org.apache.commons.codec.binary✓org.apache.commons.codec.digest✓org.apache.commons.codec.language✓org.apache.commons.codec.net✓まとめ

Page 10: Apache Commons ソースリーディングの会:Codec

org.apache.commons.codec.binary

• バイナリ関連のエンコード/デコード- BinaryEncoder / BinaryDecoder

- Base64- Base64InputStream / Base64OutputStream

- Hex- BinaryCodec

- StringUtils

Page 11: Apache Commons ソースリーディングの会:Codec

Base64

• 64種の印字可能な英数字を用いてデータを符号化する。

• 電子メール、Basic認証などで使用• データサイズは、元データの4/3程度になる。

Page 12: Apache Commons ソースリーディングの会:Codec

Base64 Encoding

• エンコードテーブルを用いて符号化• 一般的には[0-9a-zA-Z+/]• Commons Codec実装では二つのテーブルが用意されている。• STANDARD_ENCODE_TABLE

• [0-9a-zA-Z+/]• URL_SAFE_ENCODE_TABLE

• [0-9a-zA-Z-_]• RFCに準拠した実装

http://www.ietf.org/rfc/rfc2045.txt

Page 13: Apache Commons ソースリーディングの会:Codec

コンストラクタ

• 無指定• urlSafe:boolean• lineLength:int• lineLength:int, lineSeparator:byte[]• lineLength:int, lineSeparator:byte[],

urlSafe:boolean

Page 14: Apache Commons ソースリーディングの会:Codec

• lineLength• 改行を行うバイト数の指定

• デフォルト:76(バイト)• RFC2045 section 6.8.に規定

http://tools.ietf.org/html/rfc2045#section-6.8

コンストラクタ

Page 15: Apache Commons ソースリーディングの会:Codec

• lineSeparator• 改行文字

• デフォルト:CRLF(\r\n)• RFC2045 section 2.1.に規定

http://tools.ietf.org/html/rfc2045#section-2.1mailのRFC(RF822)とも関連

コンストラクタ

Page 16: Apache Commons ソースリーディングの会:Codec

• urlSafe• 使用するエンコーディングテーブルを選択

• true:URL_SAFE_ENCODE_TABLE• false:STANDARD_ENCODE_TABLE

(default)

コンストラクタ

Page 17: Apache Commons ソースリーディングの会:Codec

encodeBase64

• binaryData:byte[]• binaryData:byte[] ,isChunked:boolean• binaryData:byte[] ,isChunked:boolean

,urlSafe:boolean• binaryData:byte[] ,isChunked:boolean

,urlSafe:boolean, maxResultSize:int

Page 18: Apache Commons ソースリーディングの会:Codec

encodeBase64

• binaryData• 符号化したいデータ

• nullまたは空配列の場合は、戻り値として引数がそのまま返される

Page 19: Apache Commons ソースリーディングの会:Codec

encodeBase64

• isChunked• 符号化したデータを改行するかどうか

• true:76バイト、もしくはlineLengthで指定したバイト数で改行される。(正確にはlineLength / 4 * 4)

• false:改行されない

Page 20: Apache Commons ソースリーディングの会:Codec

encodeBase64

• urlSafe• 使用するマッピングテーブルの選択

• 既にコンストラクタで指定していても、Base64.encodeBase64()呼び出し時に指定した値が優先して使用される

Page 21: Apache Commons ソースリーディングの会:Codec

encodeBase64

• maxResultSize• データの最大サイズ(バイト)

• 符号化後のデータがここで指定した値よりも大きい場合はIllegalArgumentExceptionが返却される。

Page 22: Apache Commons ソースリーディングの会:Codec

encodeBase64

• 内部処理• null/空配列チェック• maxResultSizeサイズチェック• Base64インスタンス生成• encode

• null/空配列チェック• 符号化後サイズ計算• 符号化(データ、EOF)• パディング後処理

Page 23: Apache Commons ソースリーディングの会:Codec

decodeBase64

• base64data:byte[]• base64String:String

• 内部でStringUtils.getBytesUtf8() によってUTF-8の文字列としてバイト配列に変換される。

Page 24: Apache Commons ソースリーディングの会:Codec

decodeBase64

• 内部処理• 複合後の長さ取得• 複合化(データ、EOF)

Page 25: Apache Commons ソースリーディングの会:Codec

org.apache.commons.codec.binary

• バイナリ関連のエンコード/デコード- BinaryEncoder / BinaryDecoder

- Base64- Base64InputStream / Base64OutputStream

- Hex- BinaryCodec

- StringUtils

Page 26: Apache Commons ソースリーディングの会:Codec

Hex

• バイト配列を16進数表記の文字列(char配列)に変換。もしくはその逆。• LOWER or UPPER• 詳細な説明は割愛

Page 27: Apache Commons ソースリーディングの会:Codec

org.apache.commons.codec.binary

• バイナリ関連のエンコード/デコード- BinaryEncoder / BinaryDecoder

- Base64- Base64InputStream / Base64OutputStream

- Hex- BinaryCodec

- StringUtils

Page 28: Apache Commons ソースリーディングの会:Codec

BinaryCodec

• バイト配列を2進数表記の文字列(char配列)に変換。もしくはその逆。• 詳細な説明は割愛

Page 29: Apache Commons ソースリーディングの会:Codec

アジェンダ

✓Commons Codecについて概説✓org.apache.commons.codec✓org.apache.commons.codec.binary✓org.apache.commons.codec.digest✓org.apache.commons.codec.language✓org.apache.commons.codec.net✓まとめ

Page 30: Apache Commons ソースリーディングの会:Codec

org.apache.commons.codec.digest

• MessageDigest関連の処理の補助的なクラス- DigestUtils

Page 31: Apache Commons ソースリーディングの会:Codec

MessageDigest?

• 一方向ハッシュ。不可逆ハッシュ。• MD5、SHA1など

• Javaではjava.security.MessageDigest経由でハンドリングする

• DigestUtilsはMessageDigestクラスの補助ツール的な処理が実装されている。

Page 32: Apache Commons ソースリーディングの会:Codec

DigestUtils

• 対応するダイジェスト方式• MD5、SHA1、SHA256、SHA384、SHA51

2• 引数

• バイト配列、Stream、文字列(UTF-8で扱われる)

• 戻り値• バイト配列、16進数表記の文字列

Page 33: Apache Commons ソースリーディングの会:Codec

アジェンダ

✓Commons Codecについて概説✓org.apache.commons.codec✓org.apache.commons.codec.binary✓org.apache.commons.codec.digest✓org.apache.commons.codec.language✓org.apache.commons.codec.net✓まとめ

Page 34: Apache Commons ソースリーディングの会:Codec

org.apache.commons.codec.language

• 英語圏のPhonetic Algorithm関連の処理※Phonetic Algorithm:語の発音などをもとに検索しやすい様に符号化するアルゴリズム- StringEncoder

- Soundex- Metaphone- RefinedSoundex- DoubleMetaphone- Caverphone

- SoundexUtils

Page 35: Apache Commons ソースリーディングの会:Codec

Soundex

• ある英文字から始まる4文字の文字列を生成する。• 一文字目:ある文字列の先頭文字• 二文字目以降:ルールに従い数字を割り当てる

• 似た発音の文字は同じSoundex文字列になる。• “Robert”,”Rupert” → R163

Page 36: Apache Commons ソースリーディングの会:Codec

詳しく知りたい人は・・・

各々ググッてください・・・• Soundex

http://en.wikipedia.org/wiki/Soundex• Metaphone

http://en.wikipedia.org/wiki/Metaphone• Caverphone

http://en.wikipedia.org/wiki/Caverphone

Page 37: Apache Commons ソースリーディングの会:Codec

アジェンダ

✓Commons Codecについて概説✓org.apache.commons.codec✓org.apache.commons.codec.binary✓org.apache.commons.codec.digest✓org.apache.commons.codec.language✓org.apache.commons.codec.net✓まとめ

Page 38: Apache Commons ソースリーディングの会:Codec

org.apache.commons.codec.net

• インターネット上でデータをやり取りする最に使用する符号化方式のエンコーダー/デコーダー- BinaryEncoder / BinaryDecoder / StringEncoder /

StringDecoder- URLCodec- QuotedPrintableCodec- RFC1522Codec

- QCodec- BCodec

- Utils

Page 39: Apache Commons ソースリーディングの会:Codec

URLCodec

• いわゆるURLエンコーディング/パーセントエンコーディングと、そのデコードを行うクラス。

• java.net.URLEncoder / URLDecoderの代替ロジックとして用意されている。• Commons Codecのクラスとして再定義されている。• こちらの方が処理のポータビリティは保たれている?(URLCodecで実装してたものをQuotedPrintableに置き換えたりするのが容易)

Page 40: Apache Commons ソースリーディングの会:Codec

コンストラクタ

• 無指定• charset:String

• charsetを明示的に指定する• 無指定の場合、デフォルトではUTF-8

Page 41: Apache Commons ソースリーディングの会:Codec

encode

• bytes:byte[]• pObject:Object• pString:String• pString:String, charset:String

• charset未指定時は、コンストラクタで指定したcharsetが使用される

Page 42: Apache Commons ソースリーディングの会:Codec

encode

• 内部処理• 1バイトづつ読み込み• バイトの判定

• URL Safeなデータだったらそのまま(半角スペースはʼ+ʼに置き換え)• URL Safe:[0-9a-zA-Z-_.* ]

• URL Safeでない場合は4ビットずつ区切って(2分割して)ʼ%ʼ + 16進数文字列表現に置き換え

Page 43: Apache Commons ソースリーディングの会:Codec

decode

• bytes:byte[]• pObject:Object• pString:String• pString:String, charset:String

• charset未指定時は、コンストラクタで指定したcharsetが使用される

Page 44: Apache Commons ソースリーディングの会:Codec

decode

• 内部処理• 1バイトづつ読み込み• バイトの判定

• URL Safeなデータだったらそのまま(ʼ+ʼは半角スペースに置き換え)• URL Safe:[0-9a-zA-Z-_.* ]

• URL Safeでない場合はʼ%ʼを取り除き、2バイトをビットシフトして合体させて1バイトに

Page 45: Apache Commons ソースリーディングの会:Codec

org.apache.commons.codec.net

• インターネット上でデータをやり取りする最に使用する符号化方式のエンコーダー/デコーダー- BinaryEncoder / BinaryDecoder / StringEncoder /

StringDecoder- URLCodec- QuotedPrintableCodec- RFC1522Codec

- QCodec- BCodec

- Utils

Page 46: Apache Commons ソースリーディングの会:Codec

QuotedPrintableCodec

• RFC1521• 8ビットデータを7ビットで伝送可能にするための符号化方式。電子メール等に良く使われる。• Content-Transfer-Encoding: quoted-printable

• 符号化方式• 0x21(10進:33)~0x3c(60) ならびに 0x3e(62)~0x72(126)のデータはそのまま。

• それ以外のデータはʼ=ʼ + 4ビットごと分割(2分割)し16進数文字列表現に符号化(ex.ʼ=ʼ→”=3D”)

Page 47: Apache Commons ソースリーディングの会:Codec

コンストラクタ

• 無指定• charset:String

• charsetを明示的に指定する• 無指定の場合、デフォルトではUTF-8

Page 48: Apache Commons ソースリーディングの会:Codec

encode

• bytes:byte[]• pObject:Object• pString:String• pString:String, charset:String

• charset未指定時は、コンストラクタで指定したcharsetが使用される

Page 49: Apache Commons ソースリーディングの会:Codec

encode

• 内部処理• 1バイトづつ読み込み• バイトの判定

• 符号化非対象のデータはそのまま• 符号化対象のデータは4ビットずつ区切って(2分割して)ʼ=ʼ + 16進数文字列表現に置き換え

Page 50: Apache Commons ソースリーディングの会:Codec

decode

• bytes:byte[]• pObject:Object• pString:String• pString:String, charset:String

• charset未指定時は、コンストラクタで指定したcharsetが使用される

Page 51: Apache Commons ソースリーディングの会:Codec

decode

• 内部処理• 1バイトづつ読み込み• バイトの判定(エスケープ文字ʼ=ʼが出現するかをチェック)• ʻ=ʻでない場合はそのまま• ʻ=ʻ が出現する場合は、以降2バイトをビットシフトして合体させて1バイトに

Page 52: Apache Commons ソースリーディングの会:Codec

org.apache.commons.codec.net

• インターネット上でデータをやり取りする最に使用する符号化方式のエンコーダー/デコーダー- BinaryEncoder / BinaryDecoder / StringEncoder /

StringDecoder- URLCodec- QuotedPrintableCodec- RFC1522Codec

- QCodec- BCodec

- Utils

Page 53: Apache Commons ソースリーディングの会:Codec

RFC1522Codec

• RFC1521~1522はMIMEに関するRFC• メッセージヘッダに非ASCIIな文字を埋め込むための標準的な仕様が制定される。

• RFC1522Codecはメッセージヘッダの符号化に関する実装• [sample] =?ISO-2022-JP?B?GyRCJD8hIxsoQg==?=• QCodec:Quoted Printable 符号化をベース。• BCodec:Base64符号化をベース。

• 上記サンプル文字列はBCodec

Page 54: Apache Commons ソースリーディングの会:Codec

QCodec:コンストラクタ

• 無指定• charset:String

• charsetを明示的に指定する• 無指定の場合、デフォルトではUTF-8

Page 55: Apache Commons ソースリーディングの会:Codec

encode

• pObject:Object• pString:String• pString:String, charset:String

• charset未指定時は、コンストラクタで指定したcharsetが使用される

Page 56: Apache Commons ソースリーディングの会:Codec

encode

• 内部処理• PREFIX文字列を付加(“=?”)• charset文字列を付加• セパレーター(ʻ?ʼ)• エンコーディング方式を表す文字(QCodecならʼQʼ)を付加

• セパレーター(ʻ?ʼ)• Quoted Printableに基づき符号化したデータを付加• POSTFIX文字列を付加(“?=”)

Page 57: Apache Commons ソースリーディングの会:Codec

decode

• pObject:Object• pString:String

• ※QCodecでは符号化データにcharsetが含まれているため、明示的に指定する引数はない

Page 58: Apache Commons ソースリーディングの会:Codec

decode

• 内部処理• 先頭がPREFIX、終端がPOSTFIXであるかチェック• セパレーターを区切り文字としてcharset、エンコード方式(QCodec or BCodec)、エンコードデータを取得。

• 取得したデータを元に複合

Page 59: Apache Commons ソースリーディングの会:Codec

BCodec

• QCodecとの違いは以下2点。それ以外はQCodecと同じ。• エンコーディング方式を表す文字はʼBʼ• 符号化方式はBase64

Page 60: Apache Commons ソースリーディングの会:Codec

アジェンダ

✓Commons Codecについて概説✓org.apache.commons.codec✓org.apache.commons.codec.binary✓org.apache.commons.codec.digest✓org.apache.commons.codec.language✓org.apache.commons.codec.net✓まとめ

Page 61: Apache Commons ソースリーディングの会:Codec

本日お伝えしたいこと

符号化方式を理解して快適なインターネットライフを過ごしましょう。

細かいところまで理解したくないけれど実装上必要だ、という場合はCommons Codecが便利なので使いましょう。

まとめ

Page 62: Apache Commons ソースリーディングの会:Codec

ご清聴ありがとうございました。

ロケ地:香港