Slide 1

Slide 1 text

Gunosy.go#2   package/compress Shunsuke  Aihara  

Slide 2

Slide 2 text

compress  is  ... •  http://golang.org/pkg/compress/ •  いわゆる圧縮ファイルを扱うもの –  なんか⾒見見てみたらGoで全部書いてある –  libzlibとかに依存せずgoで完結してる •  複数の圧縮ファイルフォーマットに対応 –  bzip2 –  zlib –  gzip –  lzw

Slide 3

Slide 3 text

実装されている圧縮アルゴリズム •  bzip2 –  Bw変換を⽤用いた圧縮アルゴリズム。 –  遅いが圧縮率率率が⾼高い •  flate(bzip,  zlib) –  zipで⽤用いられている圧縮アルゴリズム(Deflate) –  LZ77  +  ハフマン符号 •  lzw –  deflateと⽐比べると⾼高速だが圧縮効率率率が若若⼲干悪い –  LZ78の改良良アルゴリズム。gifで使われていて昔 特許で騒がれたアレ

Slide 4

Slide 4 text

•  bzip2 –  Bw変換を⽤用いた圧縮アルゴリズム。 –  遅いが圧縮率率率が⾼高い •  flate(bzip,  zlib) –  zipで⽤用いられている圧縮アルゴリズム(Deflate) –  LZ77  +  ハフマン符号 •  lzw –  deflateと⽐比べると⾼高速だが圧縮効率率率が若若⼲干悪い –  LZ78の改良良アルゴリズム。gifで使われていて昔 特許で騒がれたアレ 実装されている圧縮アルゴリズム 圧縮アルゴリズムは共通で、ファイル形式のみ異異なる

Slide 5

Slide 5 text

アルゴリズムについて詳しくは… •  ⾼高速⽂文字列列解析の世界を読みましょう!   •  h9p://www.amazon.co.jp/dp/4000069748

Slide 6

Slide 6 text

compress/*の使い⽅方 •  基本的な使い⽅方はどれも同じ   – 圧縮ファイルを扱う際は…   •  NewReaderで圧縮ファイル読み込み⽤用Reader作成   –  物によっては辞書や圧縮オプションを指定可能(ただし圧 縮時に利利⽤用した物を指定しないとerror)   •  NewWriterで圧縮ファイル作成⽤用Writer作成   –  ものによって辞書(LZ77⽅方式で利利⽤用する初期⽂文脈?)と圧縮 オプションを指定可能   – Bzip2は伸張のみサポート   – 微妙にIFが異異なる   •  Exampleがあるzlibから紹介   •  h9p://play.golang.org/p/GH6_Mtoaek  

Slide 7

Slide 7 text

compress/zlib •  func  NewReader(r  io.Reader)  (io.ReadCloser,  error)   •  func  NewReaderDict(r  io.Reader,  dict  []byte)  (io.ReadCloser,  error)   •  type  Writer   –  func  NewWriter(w  io.Writer)  *Writer   –  func  NewWriterLevel(w  io.Writer,  level  int)  (*Writer,  error)   –  func  NewWriterLevelDict(w  io.Writer,  level  int,  dict  []byte)  (*Writer,   error)   –  func  (z  *Writer)  Close()  error   –  func  (z  *Writer)  Flush()  error   –  func  (z  *Writer)  Reset(w  io.Writer)   –  func  (z  *Writer)  Write(p  []byte)  (n  int,  err  error)   •  その他、圧縮オプションに関する定数値、エラー型を定義   •  中でflateを呼んでいる  

Slide 8

Slide 8 text

解凍時の処理理 •  h9p://golang.org/pkg/compress/zlib/#example_NewReader

Slide 9

Slide 9 text

圧縮時の処理理 •  h9p://golang.org/pkg/compress/zlib/#example_NewWriter

Slide 10

Slide 10 text

compress/flate •  func  NewReader(r  io.Reader)  io.ReadCloser   •  func  NewReaderDict(r  io.Reader,  dict  []byte)  io.ReadCloser   •  type  CorruptInputError   –   func  (e  CorruptInputError)  Error()  string   •  type  InternalError   –  func  (e  InternalError)  Error()  string   •  type  ReadError   –  func  (e  *ReadError)  Error()  string   •  type  Reader   •  type  WriteError   –  func  (e  *WriteError)  Error()  string   •  type  Writer   –  func  NewWriter(w  io.Writer,  level  int)  (*Writer,  error)   –  func  NewWriterDict(w  io.Writer,  level  int,  dict  []byte)  (*Writer,  error)   –  func  (w  *Writer)  Close()  error   –  func  (w  *Writer)  Flush()  error   –  func  (w  *Writer)  Reset(dst  io.Writer)   –  func  (w  *Writer)  Write(data  []byte)  (n  int,  err  error)   •  その他、圧縮オプションに関する定数値、エラー型を定義  

Slide 11

Slide 11 text

compress/gzip •  type  Header   •  type  Reader   –  func  NewReader(r  io.Reader)  (*Reader,  error)   –  func  (z  *Reader)  Close()  error   –  func  (z  *Reader)  Read(p  []byte)  (n  int,  err  error)   •  type  Writer   –  func  NewWriter(w  io.Writer)  *Writer   –  func  NewWriterLevel(w  io.Writer,  level  int)  (*Writer,  error)   –  func  (z  *Writer)  Close()  error   –  func  (z  *Writer)  Flush()  error   –  func  (z  *Writer)  Reset(w  io.Writer)   –  func  (z  *Writer)  Write(p  []byte)  (int,  error)   •  その他、圧縮オプションに関する定数値、エラー型を定義   •  gzipは独⾃自のヘッダ型がある   •  中でflateを呼んでいる  

Slide 12

Slide 12 text

compress/bzip2 •  func  NewReader(r  io.Reader)  io.Reader   •  type  StructuralError   – func  (s  StructuralError)  Error()  string   •  Block  sort(BW変換)のgo実装読んでみた かったけど圧縮は未対応だった  

Slide 13

Slide 13 text

compress/lzw •  func  NewReader(r  io.Reader,  order  Order,   litWidth  int)  io.ReadCloser   •  func  NewWriter(w  io.Writer,  order  Order,   litWidth  int)  io.WriteCloser   •  type  Order