2014年9月24日水曜日

Rails update時に値を変更して更新したい。

たとえば、保存時10円単位で四捨五入して保存したい場合。
ついでに登録日を1日ずらす。

日付型の項目は、年、月、日、時、分、秒と別れてパラメタに入ってくるので、
扱いづらい。
ので、一旦モデルに突っ込んで処理し、その後ハッシュに変換する。

def update
#パラメタを一旦モデルに突っ込む
tmp = Syohin.new(syohin_params)
#金額を10円単位で丸める
tmp.kingaku = tmp.kingaku.round(-1)
#日付型の登録日を1日ずらす。
tmp.record_datetime = tmp.record_datetime + (60 * 60 * 24)
#モデルをハッシュに変換する。
tmp2 = tmp.attributes
#不要なキーを削除
["id","created_at","updated_at"].each do |key|
tmp2.delete(key)
end
#updateに突っ込む
respond_to do |format|
if @syohin.update(tmp2)
format.html { redirect_to @syohin, notice: '更新完了' }
else
format.html { render :edit }
end
end
end

2014年9月23日火曜日

CloudStack勉強会、オープンソースカンファレンス、中国DB勉強会に参加してきました。

9/19:第22回 CloudStackユーザー会 in 広島
9/20:オープンソースカンファレンス広島&WebTouchMeeting
9/21:中国地方DB勉強会

っと、勉強会3連チャン参加してきました。

CloudStackユーザ会in広島

広島では初開催というCloudStackユーザ会の勉強会でした。
私自身CloudStackは何度も個人的に構築しており、またかなり苦労した経験があるので、
楽しく参加することが出来ました。

参加者がそんなにいなかったのですが、その分色々質問できました。
Citrixから来られていたのもあるのでしょうが、CloudStackとXenServerが一番相性が良い。との事。
ただ、XenServer有料だし、無料版も年一回WindowsなPCでアクティベーションしないといけないし・・・と質問したところ、今は無料版(オープンソース版)XenServerがあり、アクティベーションしなくても使用できると教えてもらいました。

また、今回Citrix様のご好意により、Citrix CloudPlatformラボ環境にて、CloudStack構築を体験できました。
スクリプトで早回しとかどうなっているんだろうと覗いてみたり・・・・
こういう検証環境が用意できると、勉強会でもかなり魅力的だなと感じました。
懇親会ではお好み焼きを食べながら、楽しくすごせました。


オープンソースカンファレンス広島

今年も多数のセミナーや展示がありました。
自分は今年はスタッフではなく、サーバーユーザ友の会(仮)として、自宅クラウドやOpenStackライブ構築などを行いました。

今年もラズパイクラスタの展示やX68kとかハードウエア系展示、CloudStackやさくらのクラウドなど、仮想技術関連、UnityやCocos2dなどゲーム関連と幅広い展示やセミナーで大盛況でした。

展示ブースでVyOSってどうなの?と質問をされたり、いろんな方と交流が出来るのがいいですね。

WebTouchMeeting

オープンソースカンファレンス広島の懇親会終了後、その足でWebTouchMeetingへ。
ひむらさんが電子書籍に挑戦されたことについて話をされました。

自分はてっきり表紙だけのネタ企画だと思っていたのですが、ガチで作ってありました。
なんでも、このために2週間集中して執筆したのだとか。
この方のバイタリティというか、なんか、凄いとしか言い様が無いです。

槌本さんによる、Webサービスの立ち上げと長期運営という内容で、学生時代に自分用に立ち上げたWebサービスが、どのような変遷を経て、今に至ったのかを丁寧に話されました。
本業は高エネルギー物理学で、100本以上の論文を共著されたというすごい経歴の方でした。
問題に直面した際の状況分析能力や、省力化のための分散コンピューティングシステム構築などは流石学者さんだなと思いました。
本業が忙しくなると、サービスを放置や畳んでしまうところが多い中、継続させつづけたのは凄いことだと思います。
産休などの制度も充実させているが、1日30分でも、働ける時間に働くというスタイルから、仕事へのブランク期間が短い点が評価されているなど、従業員を大切にしているなぁと感じました。


中国地方DB勉強会

すでにフラフラになりながら、朝からリアルゴールドと牛丼大盛りで挑みました(笑)

Oracleデータベースのトラブルシューティングでは、特に新しいことはありませんでしたが、
逆に言うと、見るところは変わらないということ。
普段から正常値を把握しないと、異常値の検出ができない。
スナップショットを取るのに負荷が掛かる。最初の見積もり時にはバックアップやスナップショットなどの負荷も入れておく。負荷がかかるから取らないのではなく、取る前提でシステムを構築する。
アプリケーション側でもエラーログ出力しておくほうが良い。
など。
昨今の情報漏洩などから、Oracleもセキュリティ周りは充実してきている感じでした。

MySQLトラブル解析入門では、入門と言いながら全然入門じゃない(笑)
クラッシュやデータ破壊については、なかなか解説しているところがないので、参考になりました。

他にもPostgreSQLやSQL Server、MongoDBと非常に内容の濃い盛り沢山な内容でした。

懇親会ではDBあるあるな話で各自盛り上がりました。









・・・・・・・・疲れた・・・

2014年9月17日水曜日

Rails4+DeviseでActiveDirectory(LDAP)認証を試してみた。

Rails4+Deviseで、ActiveDirectory認証を試してみました。

ActiveDirectoryはユーザ名がcnではなくてsAMAccountNameなんて項目に入っていたり、
標準でうっかり日本語でユーザつくろうものなら嵌ること間違いなしな罠が地味にあります。

幸いRubyは日本製なので、日本語でも問題ありませんでしたが・・・


詳細はWiKiにまとめておきます。

2014年9月15日月曜日

Vagrant起動時に、[Error relaunching VirtualBox VM process: 5]と表示されて起動しない。

本日これで3時間ほど無駄にしたわけですが・・・

結論から言いますと、Windows7+VirtualBoxのバージョン4.3.14で発生します。

なんかアンチウイルスソフトが原因??・・・

対処法は、最新の4.3.16に上げることです。


てっきり仮想マシンがお亡くなりになったと思って、泣く泣く再構築したのですが、結果症状変わらず・・・・








俺の休みが・・・・・



俺的メモ:RailsでCronで動かすバッチ処理を書きたい。でもActiveRecordは使いたい。

RailsなWebアプリケーションフレームワークでcronで動かす前提なバッチ処理プログラムを書くという変態奇特な方がいらっしゃったのでメモ。

【Rails】バッチ処理を実装したいけどActiveRecordを中で使ったりもしたいし


RAILS_ROOT/lib/tasks/直下にdel_user.rbってな感じで作成する(実は/lib配下ならどこでもいい)
実行は

rails runner Tasks::DelTmpUsers.execute

な感じ。
クラス名は、/lib/に作成したディレクトリ名の先頭大文字にしたもの::Hogehogeって名前にしないといけない。

例えば、/lib/crontask/hogehoge.rbに配置したら、
クラス名は
Crontask::Hogehoge
になる。

注意点は、モデルクラスの読み込みはされないので、使うモデルはrequireしないといけない。

Railsのテストサーバ(WEBric)はシングルスレッド?!

このところ、Rails漬けな生活を余儀なくされつつあって、四苦八苦しながら日々少しづつ山を崩していますが、地味にハマったのでメモ。

Railsな人には常識なのかもしれませんが、Railsの開発サーバである、WEBrickは、実はシングルスレッドで動作しているので、同時に複数のリクエストを処理できません。

なお、当然これはWEBrickの制約なので、Rails自体がマルチスレッドで動作しないわけではありません。

簡単に実験してみました。(Ruby 2.1.2 + Rails4)

rails g controller test1 index
rails g controller test2 index
っと、2つページを作成し、test1のindexアクションにこんな感じでスリープを入れます。


class Test1Controller < ApplicationController
  def index
    sleep(30)
  end
end

rails s
でWEBrickを起動し、localhost:3000/test2/indexにアクセスします。
普通にtest2のページが表示されるはずです。
では、その状態で別のブラウザまたは別のタブを開いて、localhost:3000/test1/indexにアクセスします。

開くのに30秒ほどかかるはずです。

では、test1にアクセスして、読み込み中のときに、test2を開いてみましょう。
おそらくtest2も応答待ちになったと思います。

ちなみに、Productionモードで起動しても同じでした。

開発用簡易サーバということで、あまり負荷がかかるのを想定されていないのでしょうが、
コントローラに重いトランザクション処理をさせて、別ブラウザで他のページを参照するテストが全く動かなくて焦りました・・・
(RubyというかRails的には、そもそも長時間サーバを専有するようなコードは書くべきではないし、やるなら別スレッドで非同期処理しろってことなんでしょうけど。)

なお、Apache+Passengerの環境では、普通にマルチスレッドで処理されるので、上記のような問題はありませんでした。

開発サーバでもマルチスレッドで動作させたい場合は、unicornなどを使用すると良さそうですが、
開発マシンのメモリがガシガシ食われるのでvagrant環境だとちょっと厳しい。