Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Gunosy.Go#5 index/io/log
Search
shunsukeaihara
July 10, 2014
190
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Gunosy.Go#5 index/io/log
shunsukeaihara
July 10, 2014
More Decks by shunsukeaihara
See All by shunsukeaihara
BONXを支える技術:発話区間検出(VAD)の話/Akerun & BONX Tech Talk
shunsukeaihara
4
7.8k
Goのnet.TCPConnの話/shibuya.go01
shunsukeaihara
3
870
Norikra in Gunosy Network Ads@Norikra meetup #2
shunsukeaihara
1
6.1k
LevelDB on S3 As A KVS
shunsukeaihara
1
2.9k
色恒常性仮説に基づく色補正ライブラリcolorcorrect / 2015-01-31-kantocv27
shunsukeaihara
3
2.6k
Sparkによる分散処理 / 2015-01-16 PyData.Tokyo#3
shunsukeaihara
11
3.6k
ゼロから始めた Gunosyアドサーバ開発運用記 / 2014-12-16-dots
shunsukeaihara
6
1.2k
Gunosy.go#2 package/compress
shunsukeaihara
0
140
Featured
See All Featured
The browser strikes back
jonoalderson
0
1.3k
A Soul's Torment
seathinner
6
3k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
330
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
200
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
260
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
Building AI with AI
inesmontani
PRO
1
1.1k
The Spectacular Lies of Maps
axbom
PRO
1
820
Game over? The fight for quality and originality in the time of robots
wayneb77
1
200
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Deep Space Network (abreviated)
tonyrice
0
210
Transcript
Gunosy.go#5 index/io/log Shunsuke Aihara
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 » 読みやすい良良い実装 » マルチバイトコードの⽂文字列列検索索とかはバイト列列単位 のインデックスなので変になりそう
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
index/suffixの使い⽅方 • sufffixarray.Newにバイト配列列を⼊入⼒力力してsuffixarrayを構築 – 構築時間はおおよそバイト数Nに対してO(N log N) –
普通にQuickSortしてるだけっぽい • read/writeでインデックスを保存・読み込み可能
io package • 今まで頻出していたBytes.Readerとか Bytes.Writerのインターフェイス型が定義 – データ読み込み/書き込み系のインターフェイス と、それの操作を⾏行行う関数が定義されている
• io/iouPls – Reader、Writerに対するユーティリティ関数群 – ファイル読んだり書いたりディレクトリからファ イル⼀一覧取得したりtempファイル処理理したり
io packageのVariables • Variables – EOF以外はエラー – EOF – ErrClose
– ErrNoProgress – ErrShortBuffer – ErrShortWrite – ErrUnexpectedEOF
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) – ⽂文字列列を書き込み
io packageのType • 基本のインターフェイス – type Closer – type Reader
– type Writer – type ReadWriter – type Seeker
io packageのType • 基本のインターフェイス – type ReadCloser –
type ReadSeeker • seekできるリーダー – type ReaderAt • 任意の⼀一から読み込み – type ReaderFrom • リーダーからバッファに読み込み – type SecPonReader • read, seek, readatが使える物
io packageのType • 基本のインターフェイス – type WriteCloser –
type WriteSeeker • seekができる – type WriterAt • 指定した位置に書き込み – type WriterTo • WriteTo関数のラッパ。引数に与えたバッファが空にな るかエラーが出るまで書き込み
io packageのType • 基本のインターフェイス – バイト単位の読み込みをする場合 • type
ByteReader • type ByteScanner • type ByteWriter – Rune(⽂文字列列)の読み込みをする場合 • type RuneReader • type RuneScanner – パイプ • type PipeReader • type PipeWriter – type LimitedReader • 指定値分読む
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 – 指定したファイルにバイト列列を書き込み – ファイルが存在しない時は、指定したパーミッションで新規作成
log pacakge • 普通のloggerとlogging⽤用関数群 – 標準ロガーに出⼒力力する関数群 – 標準ロガーの出⼒力力先やフラグを切切り替える関 数 – 独⾃自に定義するロガー • ⼀一つのロガーは複数のgoroutineから利利⽤用
可能 • logelevelみたいな概念念が無いのが不不便便
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
logの標準ロガーの挙動切切り替え関数 • func Prefix() string – 標準ロガーのprefixを取得 • func Flags()
int – 標準ロガーのFlagを取得 • func SetFlags(flag int) – 標準ロガーにFlagを指定 • func SetOutput(w io.Writer) – 標準ロガーの出⼒力力先を変更更 • func SetPrefix(prefix string) – 標準ロガーのPrefixを指定
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)