2014年12月30日火曜日

cronの曜日設定のわな

crontabの設定項目は 分 時 日 月 曜日 だが、なんと日 と 曜日 の両方を指定した場合、どちらかが満たされたら起動してしまう。
頭から設定していくと、AND で各条件が反映されるのに、最後の曜日を入れたとたん、日 と 曜日 どちらかがマッチしたら っという風に該当タイミングが増えてしまう。。。。

知らなかった。。。ショック。。
http://ja.wikipedia.org/wiki/Crontab

2014年12月20日土曜日

【RSpec】成功したテストでもit句に書いたラベルを結果に書き出す方法

 Rspecで書いたunitテストの内容を他の人(特にコードの読めない人)と共有する場合、
テスト内容の一覧表を別に作るのは手間すぎるので、
テストのラベル(name?)の一覧を渡すのが一番よさそう。
(もちろんそれで事足りるかはラベルをわかりやすく書いてないとだけど)

 失敗したテストのラベルは結果の標準出力にでてくるけど、
成功した場合に出す方法がわからなかったが下記でできた。
fオプションに dパラメータを渡す。oオプションは結果をファイルに保存するため。


$ bin/rspec -P "spec/models/card.rb" -f d -o /tmp/card_labels.txt

【サイコロの目が偶数のときだけカードがひけること】
【ジョーカーがでるとサイコロが2つになること】
【ハートのカードを引くともう一度カードがひけること】
【クラブのキングを引くと一回休みになること】
【コインが0になると、ゲームオーバーになること】


 見つけるまで結構時間がかかったけどヘルプをちゃんと読めってことだな。

2014年12月14日日曜日

【RubyOnRails】RspecでActionMailerでのメール送信のtestを書く

 会員登録や受注確定など特定の処理で提携のメールを送る という処理はよくある。Railsでメールを送る処理を書く場合、ActionMailerを継承したクラスにメールの内容を記載するが、そのtestの書き方。できないかと思ってたらできたのでよかった。

まず、config/environments/test.rb で下記のように追加する。


config.action_mailer.delivery_method = :test

# config.action_mailer.perform_deliveries = false


「config.action_mailer.delivery_method = :test」を設定すると、specの中でActionMailerインスタンスを Base::ActionMailer.deliveries.last で取得できる。testの下記方はこの Base::ActionMailer.deliveries.last の戻り値に対して、

mailer = Base::ActionMailer.deliveries.last
expect( mailer.subject ).to eq "本日は晴天なり"

のようにして書く。

添付ファイルがある場合のtest

添付ファイルがある場合、メールはマルチパートになるため添付なしとtestがちょっと変わる。


mailer = Base::ActionMailer.deliveries.last
expect( mailer.subject ).to eq "合格通知"
expect( mailer.from ).to eq "goukaku@test.com"

# 本文はマルチパートになるので下記のように書く
expect( mailer.parts[0].body ).to eq "サクラサク"

# 添付ファイルの件名チェック
expect( mailer.attachments[0].filename ).to eq "合格証明書.txt"



ちなみに、「config.action_mailer.perform_deliveries = false」をonにすると、メールが送信されなくなる。開発環境での誤送信などの防止にはいいがtestできなくなってしまうのでtest環境ではoffがよさげ。


# 余談だけどこのブログで使っている Syntax Hilighterはスマホで見るとうまく動かないらしい。スマホからご覧の場合jsのサンプルソースが見れないようなので(その他のソースもハイライトされてない)PCで見てくださいませ。(ん~どうしよう。)

2014年12月7日日曜日

【JavaScript】JQueryをつかってcheckboxをまとめてつける「全部チェック」「全部チェックはずす」機能

 複数行あるテーブルで、先頭にチェックボックスをつけて、処理したい行にチェックをいれて「まとめて削除」とか「まとめて送信」とかするインターフェースがある。1つ1つチェックするのも大変なので「全部チェック」「全部チェックはずす」などの機能がほしくなる。
 JSでやるんだけど、毎回はまるのでメモ。各inputのcheckboxをJSでon/offには下記のようにpropを使う。




まとめてチェック

  • ABC

  • LMN

  • XYZ






まとめてチェック

  • ABC

  • LMN

  • XYZ

2014年12月3日水曜日

Railsのログにタイムスタンプなどを載せて見やすくする方法

 Railsのログはデフォルトのままだと、タイムスタンプもログレベルも出ずに読みにくい。
本番環境のログの場合、config/environments/production.rb に下記のように書くと、


config.logger = Logger.new("log/production.log")
config.logger.formatter = Logger::FormatterWithTime.new


こんな風に見やすくなる。

[2014-12-03 00:22:10] [info] Rendered home/pie_chart.html.erb (2.6ms)
[2014-12-03 00:22:10] [info] Rendered home/index.html.erb within layouts/application (6565.4ms)
[2014-12-03 00:22:10] [info] Rendered part/_login_form.html.erb (1.3ms)
[2014-12-03 00:22:10] [info] Rendered part/_common_tag.html.erb (0.5ms)

2014年12月1日月曜日

CPUを食っているプロセスを見つける方法

サーバのloadがあがった場合に、原因のプロセスを見つけるには、
top を起動してから Shift+p を押す と CPU%降順でソートできる。

上部の CPUのuser timeの割合が高い場合は実際プログラムの実行に
使っている ということ。

ps auxf で、ツリー上にプロセスを表示できるから、
そこでプロセスの親子関係も確認できる。

sshしているユーザーが実行しているコマンドは sshdの子になっているから、
そうでないやつはバッチや、常駐プロセスだとわかる。

2014年11月25日火曜日

【ruby】文字列の置換をgsubで複数条件繰り返す場合、条件をhashで指定するとどのくらい早いのか。

gsubで文字列置換をするとき、複数組の置換をする場合、メソッドチェーンでgsubをつなげて書くこともできる。
一方組みをhashで渡して1つのgsubで書くこともできる。つどはじめのstringを全部検索しない分hashで渡すほうが
はやいはずだけどどれほど違うのかと気になった。

それぞれ下記のようなコードで50万回のループをまわす。


サンプルA

# coding:utf-8

str = "aaaaabbbbbbcccccc"

500000.times do | i |
str.gsub( /aaa/, 'AAA' ).
gsub( /bbb/, 'BBB' ).
gsub( /ccc/, 'CCC' ).
gsub( /ddd/, 'DDD' ).
gsub( /eee/, 'EEE' ).
gsub( /fff/, 'FFF' ).
gsub( /ggg/, 'GGG' ).
gsub( /hhh/, 'HHH' ).
gsub( /iii/, 'III' )
end

ruby test.rb 4.07s user 0.00s system 99% cpu 4.080 total
ruby test.rb 4.05s user 0.00s system 99% cpu 4.066 total
ruby test.rb 4.11s user 0.00s system 99% cpu 4.125 total

 gsubをつなげるタイプでは4秒程度。

サンプルB

# coding:utf-8

str = "aaaaabbbbbbcccccc"

500000.times do | i |
str.gsub( /aaa|bbb|ccc|ddd|eee|fff|ggg|hhh|iii/, "aaa"=>"AAA", "bbb"=>"BBB","ccc"=>"CCC", "ddd"=>"DDD", "eee"=>"EEE",
"fff"=>"FFF", "ggg"=>"GGG", "hhh"=>"HHH", "iii"=>"III" )
end


ruby test.rb 3.64s user 0.00s system 99% cpu 3.656 total
ruby test.rb 3.59s user 0.00s system 99% cpu 3.604 total
ruby test.rb 3.63s user 0.01s system 99% cpu 3.643 total

 hashを使うタイプは4秒弱。

 まぁ50万回繰り返してこの程度だからたいていは気にならないレベル。
コーディングの早さ優先でたいていの場合はgsubの連続にするかな。

2014年11月16日日曜日

Railsでseedファイルを複数持ちたいとき

Railsでseedファイルを複数持ちたいとき(後でデータを追加する必要ができてときなど)、
下記のようにrakeタスクとして追加するとできる。

あとはdb/seedsディレクトリを作って、seedファイルを追加するだけ。


lib/tasks/seed.rake

# coding:utf-8

Dir.glob( File.join( Rails.root, "db", "seeds", "*.rb" ) ).each do | file |
desc "seeding data by #{file}"
task "db:seed:#{ File.basename( file, ".rb" ) }" => :environment do
load( file )
end
end

2014年7月30日水曜日

リンカーン 秘密の書 見ました。

最近週末に1本映画を見るようになった。
日中は家族サービス。家事を手伝い、子供と遊び
夜はようやく自分の時間、っということでDVD。
いままであまりレンタルしなかったけどTUTAYAの旧作100円ってすごいな!圧倒的にお徳で楽しい。
旧作っていっても最近の作品の気がするものばっか。

先週はRed


週末は仕事のストレスをわすれるため、戦争もの(ヒューマン系じゃないやつ)・アクションものを選ぶ。
Redおもしろかったけどまぁまぁという感じ。2もそのうち見ると思う。

今週は、「リンカーン 秘密の書」


これもまぁまぁ。終盤のバンパイア軍団との最終決戦はも応えあったけど、
幼馴染のウィルがいつのまにかリンカーン並に強くなってるのが笑えた。
あと、バンパイアがわりとさくさく倒されるのも。(ボスもわりとあっけなく。)
日光を避けるとかはまぁまったく無視されている設定wwwww。

仲間のスピードとか、いつのまにかバンパイアと戦うところまでになっているし、
ジョジョの彼を彷彿とさせる。。。。

2014年3月24日月曜日

【RoR】Loggerのフォーマットを指定する。

 RoRのデフォルトのloggerはタイムスタンプもでないので見づらい。出力のフォーマットをカスタマイズして見やすくするには、config/environments/#{env名}.rb にfommaterを定義して直接渡してもいいが、各envの設定ファイルで記載がいるので冗長になる。
 Logger::Formatterを拡張したクラスを作って、各設定ファイルでそれをformatterとして指定すると最低限の追加でよくなる。


拡張したformatterは以下のように書く。
extras/logger/formatter_with_time.rb

# coding:utf-8
class Logger::FormatterWithTime < Logger::Formatter cattr_accessor(:datetime_format) { "%Y-%m-%d %H:%M:%S" } # 出力フォーマットの定義。ここはお好きに。 def call(severity, timestamp, progname, msg) %![#{timestamp.strftime(datetime_format)}] [#{severity.downcase}] #{msg}\n! end end



extrasの下がautoloadになるように config/application.rbのautoloadの設定をオン(デフォルトではコメントアウトされている)にしておく。
config/environments/development.rb に下記のように追加。

#
# ログフォーマットの変更
#
config.logger = Logger.new("log/development.log")
config.logger.formatter = Logger::FormatterWithTime.new


Railsを再起動すると、下記のようにログにタイムスタンプがかかれて見やすくなった。ログレベルは小文字の方がログが見やすくなっていい。

[2014-03-24 00:22:23] [info]
[2014-03-24 00:22:23] [info] Started GET "/assets/logo.png" for 123.220.144.68 at 2014-03-24 00:22:23 +0900
[2014-03-24 00:22:24] [info] Served asset /logo.png - 304 Not Modified (0ms)

2014年3月17日月曜日

【d3.js】マウスオーバーしたら説明の出るスタック・バー・チャート

スタック棒グラフだと、棒グラフの一部がなんのデータかわからない。
なのでマウスオーバーでデータの説明がでるtooltipを追加する。

デモはこちら










2014年3月8日土曜日

【d3.js】Stack Bar Chart(重ねた棒グラフ)サンプル

http://bl.ocks.org/mbostock/3943967のサンプルを見て、stack棒グラフの部分だけ作ってみた。結構少ないコードでできる。
(相変わらずBloggerのプレビューでは d3.jsもsyntaxhilighterも動作しない。。。)













【d3.js】棒グラフのを作る

基本の棒グラフ。http://bost.ocks.org/mike/bar/3/ は d3.tsvでデータを読み込む
ようになっているが、なんだか遅い。読み込んだデータのループの中で描画をしているからだろうか。

下記のサンプルはデータのjsonをd3に渡す感じ。実際にwebアプリで使う際も
サーバサイドでjsonを作ってview(javascript)に渡すことになるだろう。

























2014年3月4日火曜日

2014年3月2日日曜日

テスト1

おはよう。いまは午前5時43分。
ブログを乗り換えようと思ってbloggerでつくってみた。さてどうだろう。

テストテスト

結構寒いなぁ雪ふるかなぁ。
朝食はなにつくろう。