Gunosy.Go#5 index/io/log

6e8d1cd646b7cc589fdd5bdea0fd9bf1?s=47 shunsukeaihara
July 10, 2014
73

Gunosy.Go#5 index/io/log

6e8d1cd646b7cc589fdd5bdea0fd9bf1?s=128

shunsukeaihara

July 10, 2014
Tweet

Transcript

  1. Gunosy.go#5   index/io/log Shunsuke  Aihara  

  2. Index  pacakge •  Indexって… –  ⽂文字列列検索索の索索引の意味でのindexらしい •  Suffix  Arrayだけが実装されている • 

    普通に実装すると、記号異異なり数を無視すれば元デー タサイズがn、検索索⽂文字列列⻑⾧長がmならO(m  log  n)で検 索索可能 •  Larsson  Sadakane法でSuffix  Arrayを構築 –  O(N  log  N)の時間で構築 –  http://golang.org/src/pkg/index/suffixarray/ qsufsort.go »  読みやすい良良い実装 »  マルチバイトコードの⽂文字列列検索索とかはバイト列列単位 のインデックスなので変になりそう
  3. index/suffixarray •  type  Index   – func  New(data  []byte)  *Index  

    – func  (x  *Index)  Bytes()  []byte   – func  (x  *Index)  FindAllIndex(r  *regexp.Regexp,  n   int)  (result  [][]int)   – func  (x  *Index)  Lookup(s  []byte,  n  int)  (result  []int)   – func  (x  *Index)  Read(r  io.Reader)  error   – func  (x  *Index)  Write(w  io.Writer)  error  
  4. index/suffixの使い⽅方 •  sufffixarray.Newにバイト配列列を⼊入⼒力力してsuffixarrayを構築   –  構築時間はおおよそバイト数Nに対してO(N  log  N)   – 

    普通にQuickSortしてるだけっぽい   •  read/writeでインデックスを保存・読み込み可能
  5. io  package •  今まで頻出していたBytes.Readerとか Bytes.Writerのインターフェイス型が定義   –  データ読み込み/書き込み系のインターフェイス と、それの操作を⾏行行う関数が定義されている  

    •  io/iouPls   –  Reader、Writerに対するユーティリティ関数群   –  ファイル読んだり書いたりディレクトリからファ イル⼀一覧取得したりtempファイル処理理したり
  6. io  packageのVariables •  Variables   – EOF以外はエラー   – EOF   – ErrClose

      – ErrNoProgress   – ErrShortBuffer   – ErrShortWrite   – ErrUnexpectedEOF  
  7. io  packageのfuncPon •  func  Copy(dst  Writer,  src  Reader)  (wriWen  int64,

     err  error)   –  ReaderからWriterにコピー   •  func  CopyN(dst  Writer,  src  Reader,  n  int64)  (wriWen  int64,  err   error)   –  指定バイト数分コピー   •  func  ReadAtLeast(r  Reader,  buf  []byte,  min  int)  (n  int,  err   error)   –  最低でもminバイトコピー。最低値以下だとエラー   •  func  ReadFull(r  Reader,  buf  []byte)  (n  int,  err  error)   –  指定したバッファサイズ分コピー。バッファ・サイズ以下だと エラー   •  func  WriteString(w  Writer,  s  string)  (n  int,  err  error)   –  ⽂文字列列を書き込み
  8. io  packageのType •  基本のインターフェイス   – type  Closer   – type  Reader

      – type  Writer   – type  ReadWriter   – type  Seeker  
  9. io  packageのType •  基本のインターフェイス   –  type  ReadCloser   – 

    type  ReadSeeker   •  seekできるリーダー   –  type  ReaderAt   •  任意の⼀一から読み込み   –  type  ReaderFrom   •  リーダーからバッファに読み込み   –  type  SecPonReader   •  read,  seek,  readatが使える物  
  10. io  packageのType •  基本のインターフェイス   –  type  WriteCloser   – 

    type  WriteSeeker   •  seekができる   –  type  WriterAt   •  指定した位置に書き込み   –  type  WriterTo   •  WriteTo関数のラッパ。引数に与えたバッファが空にな るかエラーが出るまで書き込み  
  11. io  packageのType •  基本のインターフェイス   –  バイト単位の読み込みをする場合   •  type

     ByteReader   •  type  ByteScanner   •  type  ByteWriter   –  Rune(⽂文字列列)の読み込みをする場合   •  type  RuneReader   •  type  RuneScanner   –  パイプ   •  type  PipeReader   •  type  PipeWriter   –  type  LimitedReader   •  指定値分読む  
  12. io/iouPl  package •  Variablees   –  Discard  (何も返さないライター)   • 

    func  NopCloser(r  io.Reader)  io.ReadCloser   –  何もしないCloserを返す   •  func  ReadAll(r  io.Reader)  ([]byte,  error)   –  エラーがでるかEOFまで読み込み   •  func  ReadDir(dirname  string)  ([]os.FileInfo,  error)   –  ディレクトリからファイルの⼀一覧を取得   •  func  ReadFile(filename  string)  ([]byte,  error)   –  指定したファイル名のファイルを読み込んで内容を返す   •  func  TempDir(dir,  prefix  string)  (name  string,  err  error)   –  指定したディレクトリに指定したprefixの名前の⼀一時ファイル⽤用ディレクトリを作成   •  func  TempFile(dir,  prefix  string)  (f  *os.File,  err  error)   –  指定したディレクトリに指定したprefixの名前の⼀一時ファイルを作成   •  func  WriteFile(filename  string,  data  []byte,  perm  os.FileMode)  error   –  指定したファイルにバイト列列を書き込み   –  ファイルが存在しない時は、指定したパーミッションで新規作成  
  13. log  pacakge •  普通のloggerとlogging⽤用関数群 – 標準ロガーに出⼒力力する関数群 – 標準ロガーの出⼒力力先やフラグを切切り替える関 数 – 独⾃自に定義するロガー •  ⼀一つのロガーは複数のgoroutineから利利⽤用

    可能 •  logelevelみたいな概念念が無いのが不不便便
  14. logのユーティリティ関数 •  標準ロガーに出⼒力力する関数群 •  func  Print(v  ...interface{}) •  func  Printf(format

     string,  v  ...interface{}) •  func  Println(v  ...interface{}) –  標準ロガーにそれぞれPrint、Printf、Printlnする •  func  Fatal(v  ...interface{}) –  Printしてos.exit(1)を呼ぶ •  func  Fatalf(format  string,  v  ...interface{}) –  Printfしてos.exit(1) •  func  Fatalln(v  ...interface{}) –  Printlnしてos.exit(1) •  func  Panic(v  ...interface{}) –  printしてpanicを呼ぶ •  func  Panicf(format  string,  v  ...interface{}) –  Printfしてpanic •  func  Panicln(v  ...interface{}) –  Printlfしてpanic
  15. logの標準ロガーの挙動切切り替え関数 •  func  Prefix()  string –  標準ロガーのprefixを取得 •  func  Flags()

     int –  標準ロガーのFlagを取得 •  func  SetFlags(flag  int) –  標準ロガーにFlagを指定 •  func  SetOutput(w  io.Writer) –  標準ロガーの出⼒力力先を変更更 •  func  SetPrefix(prefix  string) –  標準ロガーのPrefixを指定
  16. log.Logger •  独⾃自にロガーを定義可能。挙動は標準ロガーと同じ •  type  Logger –  func  New(out  io.Writer,

     prefix  string,  flag  int)  *Logger –  func  (l  *Logger)  Fatal(v  ...interface{}) –  func  (l  *Logger)  Fatalf(format  string,  v  ...interface{}) –  func  (l  *Logger)  Fatalln(v  ...interface{}) –  func  (l  *Logger)  Flags()  int –  func  (l  *Logger)  Output(calldepth  int,  s  string)  error –  func  (l  *Logger)  Panic(v  ...interface{}) –  func  (l  *Logger)  Panicf(format  string,  v  ...interface{}) –  func  (l  *Logger)  Panicln(v  ...interface{}) –  func  (l  *Logger)  Prefix()  string –  func  (l  *Logger)  Print(v  ...interface{}) –  func  (l  *Logger)  Printf(format  string,  v  ...interface{}) –  func  (l  *Logger)  Println(v  ...interface{}) –  func  (l  *Logger)  SetFlags(flag  int) –  func  (l  *Logger)  SetPrefix(prefix  string)