Engine Yard Cloudを使っててrailsのproduction.logをちょっとしたフィルターかけてサッと見たい。(productionでのバグの原因究明などで)

production.logを探るのってEYCに限らず、機会が多いわりに面倒臭い。

$ scp deploy@app.kowabana.jp:/data/kowabana/shared/log/production* .
$ gzip -d production.log-*.gz
$ grep -r 'foo' .

とか。productionサーバーへのアクセス権がある人しか見れないのも手軽じゃない。

次からはこんなことしたくないのでEYCのlogentries addonを使ってみた。logentriesは無料でも使える範囲が大きいし、以前使ったことがあるので慣れているのでちょうどいい。

Getting started with Logentriesの通りに進めていき、下記のようにproduction.logを追加した。

diff --git a/cookbooks/le/recipes/configure.rb b/cookbooks/le/recipes/configure.rb
index 8a4432d..8225077 100644
--- a/cookbooks/le/recipes/configure.rb
+++ b/cookbooks/le/recipes/configure.rb
@@ -16,6 +16,7 @@ follow_paths = [
 ]
 (node[:applications] || []).each do |app_name, app_info|
   follow_paths << "/var/log/nginx/#{app_name}.access.log"
+  follow_paths << "/data/#{app_name}/shared/log/production.log"
 end

upload, applyしてからLogentriesのDashboardにアクセス。

自前でログサーバー作ってアレコレすると大変なので手軽で重宝しそうです。

@yukihrに聞いて衝撃を受けた設定。

人類が有史以来cmd-qによって失った生産性の低下はcrontab -rと合わせると第二次世界大戦に匹敵すると言われています。

何故頻繁に使うcmd-wの横に破滅的なキーを置くのか。crontab -eの隣に置くのか。(Dvorak民大勝利とかいってるそこのあなた。人類全体のことを考えなさい!)これは人類にとっての損失です。

そこで手軽にその悲劇を防ぐ方法が発明されました。

spotlightをcmd-qに割り当てましょう。

spotlightの設定画面からやろうとしてはいけません。cmd-qを押したら設定Windowが閉じてしまうからです。あー忌々しい。

KeyboardのShortcutの設定からならWindowを閉じることなく設定できます。

ついでにIDEで補完に使われることの多いC-Spaceも空いて一石二鳥!

God bless you.

sinatraset :foo, 'bar'みたいなDSLを使って値を設定できる。でもこの値ってどこにどうやって保存されているんだろう?

普通、最終的にはインスタンス変数かクラス変数に格納されてるって思うよね。

(class << self; self; end).class_eval do
  undef_method(name) if method_defined? name
  String === content ? class_eval("def #{name}() #{content}; end") : define_method(name, &content)
end

sinatra/lib/sinatra/base.rb at v1.4.5 · sinatra/sinatra

ところがset :foo, 'bar'するとbarを返すfooというメソッドが定義されるという形で保存されている。

setするたびにundef_methodして定義し直すので変数みたいに使えるようだ。静的な頭で考えてたのでクラクラするような格納方法だ。

$LOADED_FEATURESっていうのがある。

% pry
[1] pry(main)> $LOADED_FEATURES
=> ["enumerator.so",
 "/usr/local/opt/rbenv/versions/2.1.0/lib/ruby/2.1.0/x86_64-darwin13.0/enc/encdb.bundle",
 "/usr/local/opt/rbenv/versions/2.1.0/lib/ruby/2.1.0/x86_64-darwin13.0/enc/trans/transdb.bundle",
 "/usr/local/opt/rbenv/versions/2.1.0/lib/ruby/2.1.0/x86_64-darwin13.0/rbconfig.rb",
 "/usr/local/opt/rbenv/versions/2.1.0/lib/ruby/2.1.0/rubygems/compatibility.rb",
 "/usr/local/opt/rbenv/versions/2.1.0/lib/ruby/2.1.0/rubygems/defaults.rb",
 "/usr/local/opt/rbenv/versions/2.1.0/lib/ruby/2.1.0/rubygems/deprecate.rb",
 "/usr/local/opt/rbenv/versions/2.1.0/lib/ruby/2.1.0/rubygems/errors.rb",
 "/usr/local/opt/rbenv/versions/2.1.0/lib/ruby/2.1.0/rubygems/version.rb",
(snip)

ほうほう。

rubygems - How do I get a list of files that have been `required` in Ruby? - Stack Overflow

$ brew install dart
$ which dart
/usr/local/bin/dart

hello.dart:

#!/usr/bin/env dart

void main() {
  print('Hello Dart.');
}
$ chmod u+x hello.dart
$ ./hello.dart
Hello Dart.

ニコニコ動画はもっぱらWindowsの専用ブラウザーnFinder2で見ていたんですが、ウォッチ中のマイリストが200を超え、Macや特に寝る前のiPad miniでも見たいのでnFinderのお気に入りをOPMLにエクスポートするスクリプトを書きました。

そもそも動画プレイヤーは何でもよくて、はてなアンテナのような更新監視にのみ使っていたので。

nFinder2のお気に入りをOPMLにエクスポートする - gist.github.com

これを普段とは別アカウント/別ブラウザのFeedlyにimportすれば他のプラットフォームでマイリストの更新監視が捗ります。

続きが気になっていたシリーズ物が2年失踪後に復活とかがよくあるので見逃せません。

でもよく考えると2009年にRemedieでやっていたことがクラウドに移行しただけですね。

Remedie - Debian etch - komagata

時間を表示する時に、rails標準の〜日前とかではなく、現在時刻を基準に

5月2日 # 同じ年だったら
2日 # 月まで同じだったら
10時20分 # 日まで同じだったら
20分 # 時間まで同じだったら

という感じでコンパクトに表示したいという要件があったのでgemにしました。

komagata/time_compact

ActiveRecordのデフォルトではORDER BY区は省略されてるので、「ポスグレでデフォルトの並びってどうなってるんだろう?」と思って調べました。

SELECT - PostgreSQL 9.3.2文書

ORDER BYが指定されない場合は、システムが計算過程で見つけた順番で行が返されます

(略)

ORDER BY句を使うと、結果行を指定した式(複数可)に従ってソートすることができます。 最も左側の式を使って比較した結果、2つの行が等しいと判断された場合は、1つ右側の式を使って比較します。その結果も等しければ、さらに次の式に進みます。 指定した全ての式で等しいと判断された場合は、実装に依存した順番で返されます。

なんとなくINSERT順で出るのでは?と思ってましたが、実装依存なようなので、並びに意味がある箇所では必ず明示的に指定したほうが良さそうです。

SQL92や99、MySQLやSQLiteではどうなってるんだろう?

default_scopeでid ascとかにしとくべきか?でもARのdefault_scopeってバグを踏みやすい勝手な印象が付いてしまっていて過信するのもためらわれる…。

弊社インターンの @odailly_jp さんのお陰でLingrにHubotが設置され、従来のLingr Github Botではできなかったコメントの通知が来るようになった。(IssuesやPRのコメントを拾ってくれるPluginを作ってくれたので。)

odaillyjp/hubot-github-comments-notifier

便利ー!

第二世代?のエラートラッキングサービスrollbarを設定してて気付いたんですが、EngineYardCloudのAddonsのページが新しくなってて、新しい方にはrollbarが入ってる。

Instructionsのページの設定だけだとデプロイ通知はやってくれないっぽいのでdeploy hooksで送るように追記してみました。

# deploy/after_restart.rb:
require 'rubygems'
require 'bundler/setup'
require 'net/https'

on_app_master do
  rollbar_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxx'
  uri           = URI('https://api.rollbar.com/api/1/deploy/')

  Net::HTTP.post_form(uri, 'access_token'   => rollbar_token,
                           'environment'    => config.framework_env,
                           'revision'       => config.revision,
                           'local_username' => 'deploy')
end

OK。