Herokuでrootドメインを独自ドメインで使う - komagata

このエントリー経由でDozensにサインアップしてくれる人が結構いるらしい。エントリーを書いた人間として紹介したかいがあったというものだが…

---------------------------------------------------------------------------------
このメールは【Dozens】より自動的に送信されています。
お心当たりの無い場合や、ご不明な点がありましたら
お問い合わせフォームよりご連絡をお願いいたします。
---------------------------------------------------------------------------------

komagataさん、こんにちは。

Dozensお友達紹介キャンペーンのご利用ありがとうございます。
あなたの招待コードからDozensへの登録がありましたので、
あなたの基準レコードは、 213から216へ増えました!
ぜひご活用ください。

今後ともDozensをよろしくお願いします。

---------------------------------------------------------------------------------
Dozens
http://dozens.jp/
contact@dozens.jp

そんなに使えるDNS Record増えてもどないせっちゅー…。

railsでいつも下記のようにしてたのでgemにしました。

# lib/seed_helper.rb:
require 'active_record/fixtures'
                               
module SeedHelper              
  def import_fixture(name)
    puts "Import #{name}..."   
    ActiveRecord::FixtureSet.create_fixtures \
      "#{Rails.root}/db/fixtures", name
  end                          
end
# db/seeds.rb:
require 'seed_helper'
include SeedHelper # この2行がウザい

import_fixture :users
import_fixture :posts

seed系のgemはたくさんあるけど俺にはどれもオーバースペックだったので。

simple_seed

komagata/simple_seed

使い方

$ mkdir db/fixtures
$ vi db/fixtures/users.yml
user_1:
  name: Jean Valjean
user_2:
  name: Bishop Myriel
user_3:
  name: Cosette
$ vi db/seeds.rb
import_fixture :users
$ rake db:seed
Import users...

rubyのIDEではRubyMineが有名だけど有料なのでEclipse+RDT(Ruby Development Toolkit)を試してみました。(Aptana Studio 3 Pluginは使わない)

Eclipseのインストール

eclipseのサイトからMac OS X 64 Bit版をダウンロード。この時のバージョンは4.3.2でした。

RDTのインストール

-All Available Sites--にしてrubyで絞り込むとRDTが出てくるのでインストール。

PreferencesでRubyのInterpretersを追加。上記のようにrbenvを使ってる場合はshims/rubyを指定すればOKでした。

Enginesで何でdebugするのかというのを選びます。他のはgemが必要だったりバージョン毎に動いたり動かなかったりするのでRuby Build-In Debuggerを選択。

普通のrubyスクリプトをdebug

これは普通にできる。トップレベルのlocal変数が見れない気がするけど。

sinatraアプリをdebug

これも普通に実行するとhttp://localhost:4567/とかで立ち上がるのでブラウザからアクセスするとちゃんとブレイクポイントで止まってくれる。

railsアプリをdebug

怖話で試してみる。

これも要はscript/rails serverを実行してhttp://localhost:3000/にアクセスすればいいだけだからDebug Configurationsで下記のようなものを用意する。

実行するスクリプトはscript/rails

引数はserver

ただでさえ遅い怖話のデバッグ起動はクッソ重いので覚悟すること。

ちゃんとブレイクポイントの上の行の@nowがとれてます。

感想

ややこしいプロジェクトの厄介なバグを本腰入れて追い回す時には良いかも。ただほんとに重いので軽快にdebugしたいならpry-byebugの方が良いかな。

気になった点

ruby1.9からのnew hash syntaxがエラーと認識されている。RDTのどこかで設定できるのかな?

$ brew update
$ brew upgrade rbenv ruby-build
$ CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl` --with-readline-dir=`brew --prefix readline`" rbenv install 2.1.2
$ rbenv global 2.1.2
$ gem install bundler rbenv-rehash

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