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
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
ラッコキーワード サービス紹介資料
rakko
1
3.7M
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.5k
Paper Plane
katiecoart
PRO
1
52k
30 Presentation Tips
portentint
PRO
1
330
The Mindset for Success: Future Career Progression
greggifford
PRO
0
370
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
260
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
330
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
470
From π to Pie charts
rasagy
0
220
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
160
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)