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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
shunsukeaihara
July 10, 2014
200
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
880
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
Product Roadmaps are Hard
iamctodd
55
12k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
150
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
260
GitHub's CSS Performance
jonrohan
1033
470k
Done Done
chrislema
186
16k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
240
YesSQL, Process and Tooling at Scale
rocio
174
15k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.7k
BBQ
matthewcrist
89
10k
Writing Fast Ruby
sferik
630
63k
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)