TIM Labs

みんな大好き、Excelの話題です。

Excelは万能です。本来表計算ソフトであるはずのExcelですが、プロジェクトのドキュメントがExcelなのはもちろん、帳票もExcel, 挙げ句スクリーンショットもExcelに貼付けられて送られてくるなど、ありとあらゆる場面で活用されています。本当やめてほしいです。

これだけ広く使われていると、お客様からExcelで読めるようなデータを出力してほしい! という要望もあるかと思います。業務システムの場合、Excelでのデータ出力は必須ではないか、とさえ思われます。

今回はExcelで開けるファイルを出力してほしいと言われた場合、Railsではどのように実装すればいいのか、について考えてみます。

夜間バッチのジョブ管理、皆様どのようにしておられるでしょうか。 私はというと、cronとWheneverというRubyでcronが管理できるGemで頑張っております。

「cronって。。。このジョブ動いたら次これね! みたいな処理はどうやって書いてるの?」

と知り合いに聞かれたのですが、そりゃShellScriptでコマンド列挙して、それをcronで動かしてたりします。って言ったら、そんなんでジョブ管理できるんだ、みたいな反応されました。

そうですよね。バリバリの業務系システムを作ってる人は皆、JP1やA-Autoといったジョブ管理システムを採用しているわけです。でもRailsでこういったジョブ管理システムを使っているっていう話、聞いた事がありません。(私が知らないだけで、実は皆使ってたりするの?)

非同期なバックグラウンド処理ならばsidekiqのようなGemを使えばよいわけですが、やりたいのは定期的に実行するバッチのジョブ管理です。

JP1はLinux版もあるようなので調べてみたのですが、、、ちょっとお値段高いです。気軽に採用できる感じじゃありません。できればフリーで利用できるものがよいです。

と調べているうちに、「SOS Jobscheduler」と「Hinemos」という、オープンソースのジョブ管理システムを発見しました。Hinemosと比べ、SOS Jobschedulerの方がAPIが充実してそうという印象だったため、今回は「SOS Jobscheduler」を試してみることとします。

RubyにはGemと呼ばれるサードパーティのライブラリが豊富に存在します。

Gemは大変便利なもので、こういう機能ほしいなと思った際に The Ruby ToolboxRubyGems.orgGoogle で検索すると大抵誰かがその機能を持ったGemを作っていたりします。

gemを利用するのも、RubyGems.orgに登録されているものならば

gem install xxx  # xxxにはライブラリ名を入れる

と入力することで利用可能となります。

Gemはだれでも簡単に開発でき、審査無しですぐに公開できるため、日々大量のGemたちがRubyGems.orgに登録されています。反面、長年保守されていないGemや品質の低いGemも大量にRubyGems.orgに登録されているのが現状です。

同じ機能を持ったGemも大量に登録されていたりして、どのライブラリを利用してよいのか迷う事も多々あります。

今回は弊社プロジェクトで実際に利用している、便利なgem達を紹介いたします。

なお、Railsなプロジェクトに携わっているのなら誰でも知っている/使っていると思われる基本的なgem(jquery-rails, mysql2, therubyracer等)の紹介は、今回割愛してます。

Railsでの区分値の扱いについて考える の続きです。

区分値情報をDBに保存しておくか、アプリにのみ保存しておくのか、悩ましい所です。 DBに区分値を保存しておくと、ActiveRecordなオブジェクトになって扱いやすいという利点があります。 しかし、DBにもアプリにも区分値の情報(ProductTypeの1はLADIESであるといった情報)を持つ事になり、二重管理の状態となる可能性があります。

一カ所変えたら対になるもう一方の修正もしないといけない、という状態は、システム保守の観点からはよろしくありません。 私は過去にアプリ側に区分値情報を更新したのに、DB側に区分値情報を入れ忘れていた! という失敗を体験しました。

区分値情報をアプリ、DB両方に持ってるのはやめたい。でもActiveRecordライクなオブジェクトで区分値を扱いたい。 ActiveRecordのデータソースがclass内に定義したhashとかファイルになっていればいいのに。そんなときに利用するのがActiveHashです。

今回はActiveHashを使って区分値を扱う方法について説明します。 利用するRailsのバージョンは4.0.2です。

Railsでの区分値の扱い、皆様どのようにしておられるでしょうか?

区分値とは、例えば性別情報(1: MALE, 2: FEMALE)とか、服を扱っているシステムの場合は商品種別(1: LADIES, 2: MENS, 3: KIDS)の事を指します。

私は区分値情報をDBに保存しておこうか、アプリ側でのみもっておこうか、毎回悩まされます。 区分値をDBに保存しておくと、外部キー制約もつけられるしActiveRecordでも扱いやすいといったメリットがあります。 しかし、アプリとDB両方に区分値情報を持っているとデータの二重管理になってしまいます。 DB側の区分値とアプリ側の区分値が食い違ってる! なんていう事態も発生します。

ならば、いっその事DBに保存するのはやめて、区分値情報をアプリ側にのみ持っていた方がよいのでは、というのが最近の私の考えです。

今回はRailsで区分値を扱う方法について考えてみます。

疑問

Gitを使っていると時々コマンドを入力し損ねたまま実行してしまうことがあります。 この時、Gitは親切にも近い名前のコマンドを列挙してくれます:

$ git committ
git: 'committ' is not a git command. See 'git --help'.

Did you mean this?
        commit

$ git pick
git: 'pick' is not a git command. See 'git --help'.

Did you mean one of these?
        fsck
        repack

これは一体どのように実装されているのでしょうか。

ActiveRecord4でこんなSQLクエリどう書くの? Merge編 では、関連先のscopeを使い回すことができるmergeを紹介しました。 ActiveRecord4でこんなSQLクエリどう書くの? Arel編 では、安全にmergeができるscopeをArelを使って組み立てる例を紹介しました。

前回紹介したArelですが、複雑なクエリを組み立てようと思うとarel_tableという記述がいたる所に登場してしまい、処理がごちゃごちゃしてしまいました。 このごちゃごちゃ感を回避するために利用するのが、ActiveRecordの拡張であるsqueelです。

今回は、Arelを使った処理をsqueelで書き直してみます。 テーブルは、前々回紹介したもの を利用します。

ActiveRecord4でこんなSQLクエリどう書くの? Merge編 では、関連先のscopeを使うことができるmergeを紹介しました。mergeを使う事で、変更に強いクエリを美しく組み立てることができました。

今回は、ActiveRecord4で書きにくいSQLクエリたちを紹介します。 書きにくいクエリとは、具体的には以下のものがあげられます。

  • 比較演算
  • OR
  • like
  • left outer join
  • union
  • サブクエリ
  • exists

ActiveRecordでこれらのクエリを組み立てる場合、どうしても美しくない(SQL文字列をべったり書いてしまうような)書き方となってしまいがちです。 この処理を美しく書くためには、ActiveRecordだけの機能では足りず、ActiveRecordが内部で使っているArelというライブラリを使う必要がでてきます。

今回は、Arelを使って華麗にSQLクエリを組み立てる方法を紹介します。

「このデータ取得するのにSQLではこういう風に書けばいいんだけど、ActiveRecordでは一体どう書けばいいの?」

毎回この課題に悩まされています。

特に業務アプリの場合、とてつもなく複雑なSQLを投げる場合があります。 ものすごい数のテーブルをjoinして、existsで条件みて、union allして。。。 なんていう処理がでてくると、さすがにActiveRecordやDatamapperを使ってクエリを組み立てるのをあきらめて、直接SQLを書いてしまうことがあります。

でも、できればActiveRecordを使ってスマートにSQLを組み立てたいものです。 scopeで書いておけば、処理も使い回せますしね。

ということで、こういうSQLはActiveRecordではこういう風に書けばできますよ!っていうサンプルを色々かいてみることにしました。

第一弾は、たぶんActiveRecordで最も便利な機能、mergeを使ったサンプルを紹介します。 これが使えると処理が綺麗にかけるし、使い回せるようにもなるし、ActiveRecordすごい!って思えるようになります。

これまでのあらすじ

オセロを実装し始めて早幾年。 ようやくまともなAIを作る基礎ができたので、 ここからは「より強いAI」をどう作っていくかを考える段階になりました。 しかし、これには色々と問題があります:

  • 「AIの強さ」を定量化できないと 「ぼくのかんがえたさいきょうのAI」がどれぐらい強いのかさっぱり分からない。
  • かといって人間が判定するにしても 「これは雑魚だなー」 「これは手強かったかも」 程度の大雑把な分類しかできない。
  • そもそもこれまでにテストプレイとして何十回もオセロをやってきたので、 もう手動でオセロをプレイするのは面倒臭い。

という訳でAIとAIを対戦させて自動でゲームを進行させれば手間が省けるのではないでしょうか。

最近のコメント