雑なメモ書き

気楽にいきます

2019-01-01から1年間の記事一覧

rustのgdbでのdebugでsourceを出力したかった

プログラム言語処理系のslackの#rustでKeenさんという方に色々教わってうまいこと動いたので書き残しておきます。 cargo buildをすると謎のdebug情報が付加される /rustc/412f43ac5b4ae8c3599e71c6972112e9be4758faといったパスが情報に付加される cargo bui…

gormをしらべた(1)

https://gorm.io/docs/ gormを使っていたら中身が気になったので追ってみた 公式のサンプルからとりあえず追う dialectsMapはどこで初期化されているか gorm.initからRegisterDialectが呼ばれている ちなみに、このinitはpostgresなど各種にあり、それぞれ初…

GO111MODULEの影響を追ってみた

main.go func main() { _ = go11tag flag.Usage = base.Usage flag.Parse() log.SetFlags(0) args := flag.Args() if len(args) < 1 { base.Usage() } if args[0] == "get" || args[0] == "help" { if modload.Init(); !modload.Enabled() { // Replace modu…

goのmakeで起こりがちな悲劇

goのmakeを使っていると第3引数をあんまり使わないから これ挙動なんだったっけとなるのでメモする https://golang.org/pkg/builtin/ make(len:0)によるslice作成 よくあるやつ 想像通りの結果 // cap: 0 v := make([]string, 0) pp.Print(v) fmt.Printf("l…

Contextとは何者なのか考えてみた(1)

goでですね、context.Contextがでてから割と立つんですが 並行まわりを全部これでやらないといけ無いんじゃ無いかという強迫観念にとりつかれませんか 素のchannnelやsync.WaitGroupとか使った方が早そうなんだけど 違う道があるんじゃ無いかと考えてしまう …

GDB Dashboardのメモ

GDB Dashboardというものがあってgdbでのdebugを助けてくれる https://github.com/cyrus-and/gdb-dashboard これを~/. gdbinitに設定すると機能する

雑な感じでappengineのcron.yamlをグラフィカルに表示したい

思いつきベース https://github.com/takumakanari/cronv こちらのグラフィカルな機能を使いたかった require 'yaml' YAML.load_file('./cron.yaml')['cron'].each_with_index do |row,i| if m = row['schedule'].match(/^every\s+day\s+(.+)$/) then min_hou…

camelcaseでgoのbenchをやってみた

結論 forの入れ子無くなると早いよね allocationの減少がパフォーマンスに影響が高い []bytes操作はやい ベンチ結果 goのtest benchで実行 go test -bench . -benchmem -count=1 1と2の間は実行速度に差があるレベル 2と3はallocationが減ってる BenchmarkCa…

Golandのショートカットメモ (Mac)

定義元への移動 プロジェクトウインドウの切り替え 指定行へ移動 プロジェクトのテキストの検索 Rename structureの表示・非表示 if err != nilの補完 main関数の補完 Find Useage コメントアウト 大文字小文字の切り替え 定義元への移動 Cmd + B インタフェ…

Makefileをいじってみる(2)

https://www.gnu.org/software/make/manual/make.html これをみて色々試してみる 暗黙のルール https://www.gnu.org/software/make/manual/make.html#make-Deduces https://www.gnu.org/software/make/manual/make.html#Implicit-Rules main.o : main.c defs…

Makefileをいじってみる(1)

https://www.gnu.org/software/make/manual/make.html これをみて色々試してみる 基本的なルール ターゲット: 前提条件 処理内容 target … : prerequisites … recipe … … 実例を見ると以下の様になる このeditの場合は、main.oからutils.oまでを条件にしてcc…

zipのパスワードについてきになったこと

goのzipでパスワード付きのzipを解凍しようとしたんですが https://golang.org/pkg/archive/zip/ 公式を見ている限りその機能がない 結論からいうと https://github.com/yeka/zip こちらのライブラリを使用すると解凍することが出来る 気になったのは、なん…

goのmainの始まる前(1)

そう言えばgoのmainの始まる前をまじまじと折ったことはないなと 思ったのでちょっとだけ追う runtime.mainから呼ばれているようだ // The main goroutine. func main() { getg()が実行されて currentのgが返される g := getg() type g struct { stack stack…

fdというファイルを見つけるのに便利なコマンド

https://github.com/sharkdp/fd 最近はファイルを発見するのにfdというコマンドを使用している installも使用方法も楽なのでおすすめ。

contextについて(1)

ある程度はchannelの時にやってるんですが いざcontextつかって良い感じにやろうと思うと 何が正着だっけという感じで迷うので調べ直しました 基本的なところ https://golang.org/pkg/context/ https://blog.golang.org/context この辺をみつつ、コードを追…

objdumpを触ってみた

objdumpというコマンドのオプションを調べてたら わりかし面白そうなので試して見た --disassemble アセンブラのニーモニックを表示 Disassembly of section .init: 00000000000004e8 <_init>: 4e8: 48 83 ec 08 sub $0x8,%rsp 4ec: 48 8b 05 f5 0a 20 00 mov 0x200</_init>…

nmコマンドで遊んでみた

nm - オブジェクトファイルのシンボルをリストする https://linuxjm.osdn.jp/html/GNU_binutils/man1/nm.1.html このコマンドでオブジェクトファイルのシンボルをリストすることが出来る 割とオプションが豊富で面白いので試す --debug-syms #include <stdio.h> int m</stdio.h>…

gccで生成過程を眺めてみたりした

http://www.cc.kyoto-su.ac.jp/~hxm/cstext/prog06.html Cで開発しているとコンパイラさんが至れり尽くせりすぎて liner周りの知識がもわっとするのでメモ オブジェクトファイル生成 cc1でアセンブラ生成 asアセンブラからオブジェクトファイルを生成 gcc -g…

rustさわってみた(2)

コンパイラに推論させるとどの型になるのか気になった i32になるようだ。 そのほかには型の最大値と最小値がどう取れるかみた。 fn main() { let v = 5; println!("x is {}",v); let u8_min:u8 = std::u8::MIN; println!("u8 min: {}",u8_min); let u8_max:u…

cmakeさわってみた(1)

clion触っていると必要になるので調査 https://cmake.org/cmake-tutorial/ https://qiita.com/shohirose/items/45fb49c6b429e8b204ac ここの記述が分かりやすい ファイルを用意 #include <stdio.h> int main(int argc, char *argv[]) { printf("hello world\n"); retu</stdio.h>…

OpenCensusについて調べてみた

OpenCensusとは https://opencensus.io/ サービスからメトリクスと配布トレースを収集する単一のライブラリ 各言語のライブラリが出ているが今回はGoを調べる サポートされているバックエンドも多い 所謂分散トレーシングシステムへ格納する Azure Monitor、…

goのプログラムを観察するのにgopsが便利だった

gopsというツールがありまして https://github.com/google/gops memstatsやtreeというサブコマンドを使用するとgoで動作しているプログラムから簡単に取得出来たりするので大変便利です profileも楽に取れるしありがたい gops tree gops tree ... ├── 956 │ …

goのsqlにあるfreeConnにどこで追加してるか気になったので調べた

putConnDBLockedというメソッド中でやっていた ここでdb.freeConにappendしている } else if err == nil && !db.closed { if db.maxIdleConnsLocked() > len(db.freeConn) { db.freeConn = append(db.freeConn, dc) db.startCleanerLocked() return true } …

goのsql/databaseの接続でやり方間違えると資源枯渇したりして大変らしいので負荷をかけてみた

http://go-database-sql.org/surprises.html こちらのページに書かれている Opening and closing databases can cause exhaustion of resources. が気になったのでwrkで負荷をかけてみた。 条件 dockerでmysqlを立ち上げる SelectとUpdateが単純に走るだけの…

Goのmemstatsの項目をみてみる

https://golang.org/pkg/runtime/#MemStats MemStatsから取得出来る各項目を一覧してみた 細かいコメント等は本家を参照すること 項目名 説明 Alloc 割り当てられたヒープオブジェクトのバイト数 TotalAlloc ヒープオブジェクトに割り当てられた累積バイト数…

appengineでmemstatsしたかった

appengineのバージョンが古いとデータが取れなかったりするので こちらのコードから必要そうな処理をお借りしました https://github.com/google/gops package hello import ( "encoding/json" "fmt" "net/http" "runtime" "time" "google.golang.org/appengi…

GoのメモリにおけるHeapの確認 (2)

appendでsliceのサイズをいじった場合にどうなるかをみた heapへのescapeはあくまで関数間でデータの受け渡しを参照で行った場合に起きるようだ sliceへappendしてポインタを返した場合 package main func makeHeap() *[]int { v := []int{} for i := 0; i <…

GoのメモリにおけるHeapの確認 (1)

コード 単純にポインタを返すからheapかと言われると インライン展開で最適化されてそうじゃなくなるケースがあるようだ package main func makeHeap() *[]int { v := []int{} return &v } func main() { for i := 0; i < 1000; i++ { _ = makeHeap() } } イ…

子プロセスからpipe経由でデータが欲しかった

https://linuxjm.osdn.jp/html/LDP_man-pages/man2/pipe.2.html https://linuxjm.osdn.jp/html/LDP_man-pages/man2/fork.2.html 大量に同一pipeへデータを一括で書き込もうかと思ったのでとりあえず子プロセスから頑張ってみた。 #include <unistd.h> #include <stdlib.h> #inclu</stdlib.h></unistd.h>…

GoのGCに関して調べてみた

基本的なところ GoのGC Concurrent Mark & Sweepを採用している goroutine はGCされない https://www.yunabe.jp/docs/golang_pitfall.html#goroutine-%E3%81%AFgc%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84 goroutine はガーベッジコレクションの対象ではありま…