読者です 読者をやめる 読者になる 読者になる

Chrome拡張でCocoaPodsのPodfile.lockのdiffからも各ライブラリの変更へ飛べるようになった

昨日だしたやつが、CocoaPodsのPodfile.lockのdiffからもclickできるようになりました。

また、Pull Requestのページのdiffで発動しなかった問題を修正しました。
権限まわりを変更している関係で、既にインストールした人はv0.0.2にアップグレードされた人は、無効になっていることがあるので注意してください。

Github Library Changes - Chrome ウェブストア

f:id:walf443:20150803075554p:plain

github.com

関連

walf443.hatenablog.com

githubのGemfile.lockやpackage.jsonのdiffからそれぞれのライブラリのdiffへ飛べるChrome拡張を作った

ChangeLogのファイルはプロジェクトにあったりなかったりなので、githubリポジトリのタグ間のdiffへクリックでいけるようにしてみた。
これでbundle updateとかしたときにざっくりどういう更新があったのか確認ができる。

現在は、Gemfile.lockのdiffと、package.jsonのdiffに対応している。

Github Library Changes - Chrome ウェブストア

f:id:walf443:20150803075554p:plain

github.com

rake db:migrateをRidgepoleで置き換える

rails

ちょっとRidgepole試してみようかなと思って使いはじめた。rails書いていると他の人がmigrationふつうにしようとしてしまったりするだろうから、rake db:migrateのデフォルトの動作を無効にして、ridgepoleを動作させたい。

lib/tasks/ridgepole.rakeとかで、

# overwrite db:migrate or db:dump
task 'db:migrate' => :environment do
  ENV['RAILS_ENV'] ||= "development"
  sh "bin/ridgepole -E#{ENV['RAILS_ENV']} -c config/database.yml --apply"
  sh "bin/ridgepole -E#{ENV['RAILS_ENV']} -c config/database.yml --export -o Schemafile"
end

task 'db:dump' => :environment do
  ENV['RAILS_ENV'] ||= "development"
  sh "bin/ridgepole -E#{ENV['RAILS_ENV']} -c config/database.yml --export -o Schemafile"
end

applyした直後でexportするべきかはどうかなーと思ったりしつつ、db:dumpいちいち打つのがダルいことが多いのかな。ということでやることにした。

Gemfileで、activerecordのedgeを指定する

bundler rails

先に結論をまとめると、こうすればよいらしい。

gem 'arel', git: 'https://github.com/rails/arel.git'
git 'https://github.com/rails/rails.git' do
  gem 'activerecord'
end


ライブラリで、特定のバージョン以上にbundlerが指定されていて、それを一時的にtravisなどで、HEADでテストを走らせたい、というときにどうするか、ということですが、railsの場合には、

rails/
-------rails.gemspec
-------activerecord/
-------------------activerecord.gemspec
-------actionpack/
-------------------actionpack.gemspec

のようなディレクトリ構成になっていて、directoryのtopにgemspecがある場合には、gitオプションで指定すればよいのですが、それ以下のディレクトリはどう指定したらいいんだろうか、と悩んでいたのでした。

test with active_record edge. · 3233386 · walf443/activerecord-mysql-unsigned · GitHub

ppの出力先を変えられるようにした

go

pp( k0kubun/pp · GitHub
)は非常にお気軽に使えてよいのだけど、デバッグ中にちょっと出力がウザいので抑えたり、また見たりしたいなー、というときに、import文をコメントアウトしたり変数を_に変えたりするのがめんどくさかった(それがGo wayなのではあるけれども)

そこで、DEBUGが有効なときに使える、Debug*みたいな関数群を追加するのを提案したところ、出力先を切り替えられるようにしてはどうか?という話になったので、実装して無事、取りこまれた。

customizable Print* functions output by walf443 · Pull Request #6 · k0kubun/pp · GitHub

import (
  "github.com/k0kubun/pp"
  "io/ioutil"
  "os"
)

func init() {
    if os.Getenv("DEBUG") == "" {
        pp.SetDefaultOutput(ioutil.Discard)
    }
}

こんな感じにしておくと、pp.PrintしているところがDEBUG環境変数が有効じゃないと出力されなくなるので、コードを変更しなくてもppの出力を抑制できるようになる。

自分は、今書いているパーサーで、実際に使われているデータとかをparseしてASTをdumpするやつ(コミットしていない)をgo testで走るようにしておいてそれをたまにppでdumpしたりしている。便利。

ppは、さらに欲をいえば、

import ( 
  "github.com/pp/pp"
)

みたいにpp organizerでホストされているようになれば、pp/ppで何も考えずimportできるようになって個人的にはとてもうれしい。githubはアクティビティが低いユーザーで良い名前を抑えていた場合、交渉して取れるようになっていると聞いたことがあるような気がするが、この場合はどうだろうか。

pp · GitHub

追記

import "gopkg.in/pp.v1"

できるようになったらしい。すばらしい。

go yaccを使ったプロジェクトの管理

最近、go yaccを使ってparserを書いたりしているのですが、yacc生成前のファイルだけコミットして、生成後のコードはコミットしたくない。

でもyacc生成コードをリポジトリに含めないと、go getが失敗してしまうので、どうしたもんかなと思ってたのですが、使いたいプロジェクト側で、git subtreeで管理すると、個人的にはよさそうな感じでした。(まだあんまり使ってみてないので、やめるかもしれないけど。

これで、parserを使いたいコード側では、このようにTravisCIでbuildおよびtestできるようになった

https://travis-ci.org/walf443/mig/jobs/46194632

カジュアルに実行時間を計測する

go

isuconの予選で、カジュアルにここどれぐらい時間がかかっているか計測したい、ということで作った。
pprofは(使い方間違っているだけなのかもしれないけど)CPU時間での計測なので、io待ちとか、channel待ちとかの時間は出てこないので、web applicationのチューニングにはあまり適さないのかなという気がする。

https://github.com/walf443/stopwatch

やりたいこととしては、

  • 計測コードを簡単に無効にできる
  • ここから、ここまで、という指定以外に前回の実行からどれぐらいたったのか? というのも自動でとりたい

ということを達成したかった。

package main

import (
        "flag"
        "github.com/walf443/stopwatch"
        "time"
)

func main() {
        flag.Parse()

        stopwatch.Reset("start request")
        time.Sleep(100 * time.Millisecond)
        stopwatch.Watch("after something")
        time.Sleep(100 * time.Millisecond)
        stopwatch.Watch("after something 2")

}

こんな感じで、HTTPのサーバーであれば、リクエストの関数の冒頭で、Resetを呼びだし、あとは、計測したいタイミングで、Watchを呼びだしていけばよい

デフォルトでは無効になっているので、計測するには、--stopwatchフラグをつけながら起動すると、

$ go run example.go --stopwatch
stopwatch|2014/10/07 09:27:33 [             0][             0] start request at /Users/yoshimin/project/go/src/github.com/walf443/stopwatch/example/example.go:12
stopwatch|2014/10/07 09:27:33 [  100.892037ms][  100.892037ms] after something at /Users/yoshimin/project/go/src/github.com/walf443/stopwatch/example/example.go:14
stopwatch|2014/10/07 09:27:33 [  201.129537ms][    100.2375ms] after something 2 at /Users/yoshimin/project/go/src/github.com/walf443/stopwatch/example/example.go:16

こんな感じで標準出力にログが出てきて、Resetを呼びだしてからの時間と、前回Watchをしてからの時間がわかる。

グローバル変数で実現しているので、関数間でも、別のファイル間でもカジュアルにstopwatch.Watchとか呼べばよい。
もちろんその反面、HTTPサーバーのハンドラに仕込んでいるときに、同時にリクエストが来て、Resetが呼ばれたりすると、カウンタがおかしくなるが、手動で動作させつつ、大まかな時間を調べるのが目的なので、使い勝手のカジュアルさを重視した。

使い終わったら、stopwatchが書いてある行を削除すれば、だいたい消えてくれると思われる。

matsuuさんに、Practical Goで、Nitroの話を聞いたけど、何って名前だったか覚えてなかったので、適当に作った。あっちの方がライブラリとしてはよっぽどちゃんとしている。