2010-03-31

wheneverでcron処理情報を管理

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
rubyでcron処理を記述し、実際にcrontabに記載を行うwheneverというものがあることを知りました。

インストール方や利用方法は、
http://tobysoft.net/wiki/index.php?Ruby%2FRuby%20on%20Rails%2Fcron%C5%AA%A4%CA%A4%B3%A4%C8%2Fwhenever
を見ていただくのがよいです。

RAILS_ROOT/config/schedule.rbに
以下のように書いておけば
every 2.days, :at => '4:30am' do
  command "/usr/bin/my_great_command" 
end
crontabに
30 4 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31 * * /usr/bin/my_great_command
と書いてくれるわけです。
RAILS_ROOT配下にcronに関する情報も記載できるのがいい感じだと思います。

こんな感じで毎月5日に実行する処理みたいなことを書きたいと思ったのですが、
at
にどういうふうに書けばよいのかわからなかったのですが、
every 1.months, :at => "jan 5th 22:00"
ととりあえず月まで入れてしまって日付をしていすることで指定できました。
このように指定してもちゃんと毎月の設定になりました。

atの部分の記載は、
Chronic
というものでパースをしているようです。

Chronicについては
http://chronic.rubyforge.org/
をみてください。
こちらのような記述がatの部分にできいるようです。
いろいろな形で指定できるようです。

2010-03-25

MySQLでslow_query_logを有効にするようにmy.cnfに書く

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
MySQLで時間がかかるSQLをログ出力するためには
slow_query_logをONにする必要があります。
でも
my.cnfには
slow_query_log = ON
ではなく
slow_query_log = 1
とかかなくてはいけないのでした。

参考にさせていただいたのは、
http://twitter.com/hirose31/status/2948103962
です。

2010-03-15

OracleさんとPassenger

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Oracleに対して接続するRailsアプリを作り、Passengerで動かしているのですが、
1日2日ほったらかして久しぶりに接続すると接続タイムエラーになり接続できない感じだったりしました。

ちなみにoracleへの接続は
oracleのinstantclient

oracle_enhanced
を利用しています。

ほんとに接続できないかどうか確認するために
sqlplus

script/consoleでモデルに対してfindを実行
したりするとなんら問題なしだったりします。

そしておかしいなぁと思いつつ
apacheを再起動すると動くのが続きました。

RAILS_ROOTに以下のようなsqlnet.logが記録されていました。

Fatal NI connect error 12170.

VERSION INFORMATION:
TNS for Linux: Version 10.2.0.3.0 - Production
TCP/IP NT Protocol Adapter for Linux: Version 10.2.0.3.0 -
Production
Time: 15-MAR-2010 09:23:21
Tracing not turned on.
Tns error struct:
ns main err code: 12535
TNS-12535: Message 12535 not found; No message file for product=
network, facility=TNS
ns secondary err code: 12560
nt main err code: 505
TNS-00505: Message 505 not found; No message file for product=
network, facility=TNS
nt secondary err code: 110
nt OS err code: 0


最初は、たまたま負荷が高いときに接続していて本当に接続タイムアウトになったのかなと思っていたのでが、どうも環境変数がうまく反映されていないようでした。

ちなみに接続には
tnsnames.ora

/usr/local/oracle/network/admin
に記述して利用しています。
なので
config/database.yml
は以下のような感じです。

production:
adapter: oracle_enhanced
database: test
username: test
password: test


なので環境変数を確実に反映されるために以下のようなシェルスクリプトを
/usr/local/bin/ruby_with_env
として用意しました。

#!/bin/bash
export TNS_ADMIN=/usr/local/oracle/network/admin
export NLS_LANG=Japanese_Japan.UTF8
export ORACLE_HOME=/usr/lib/oracle/10.2.0.3/client
export PATH=${ORACLE_HOME}/bin:${PATH}
export LD_LIBRARY_PATH=${ORACLE_HOME}/lib:${LD_LIBRARY_PATH}
/usr/bin/ruby $*

PATHは設定がなくてもよいと思いますが、なんとなく追加です。

chmod 755 /usr/local/bin/ruby_with_env
としておいて

Passengerの設定のRailsRubyを以下のようにします。
RailsRuby /usr/local/bin/ruby_with_env

参考にしたのは、
http://blog.rayapps.com/2008/05/21/using-mod_rails-with-rails-applications-on-oracle/
です。

これでいけるようになった気がします。

iアプリで加速度センサを使ってみようと思ったけど対応していなかったのでした

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
iアプリで加速度センサで遊んでみようと思ってみたわけです。

加速度センサは
com.docomostar.device.location.AccelerationSensor
を利用すればできると書いてありました。

エミュレータではなんとなく値が取れるものができたので、実機で試そうとしたら
エラーが発生しました
といわれて終了。

試したのはSH-04Aだったのですが、
http://www.nttdocomo.co.jp/service/imode/make/content/iappli/technical_data/star/

iアプリコンテンツ開発ガイド for Star-1.x 各機種オプションAPI・拡張API実装状況
を確認してみると確かに対応していませんでした。
というか、対応している機種がほとんどないのです。

画面を傾ければ横画面に切り替わったりするので、使えると思い込んでみました。

ちなみに
iアプリのADF設定で
AppTrace

on
にすると実機で発生した例外が
情報表示のトレース表示
に記録されるようになります。

iアプリって、もっといろんな制限をとりはずして開放していればiPhoneとかが入ってくる余地とかない感じになりえたような気がします。
そしてもう今から開放してももう遅いのだろうなぁという気もします。

2010-03-10

ambienTecの太陽電池

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
おしゃれな太陽電池でキニナリます。
これくらいオシャレならば普段別に充電が必要なわけではないですが、持ちたくなってみたりしました。

rspecでflash.nowのテストを書く

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
rspecでflash.nowにメッセージがセットされていること確認するテストを書く方法です。
通常のflashであれば
flash[:warning].should == "わーにんぐー"
のように書けばよいわけです。

flash.nowの場合調べると
flash.now[:warning].should == "わーにんぐー"
と書けばよさげに見えたのですが、
Rails2.3.5では
response.flash[:warning].should == "わーにんぐー"
と書かないとダメでした。

理由はよくわかりません。

2010-03-03

railsで処理中メッセージを出して他の処理をできないようにする

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
なんかしらの処理を行っている際に他のボタンなどを押してもらいたくないことがあったりします。

Railsには、2重クリック防止として
submit_tag("実行",:disable_with => "処理中...")
のような感じにすれば、そのボタンをdisableにして2重クリックは防止できます。
ただ、あくまでも押したボタンだけが押せなくなるだけで、他のメニューなどは当然クリックなどができます。

これを防止するためにjqueryのプラグインの
jQuery BlockUI Plugin (v2)
を使わせていただくことにしました。

使い型的には、以下のような感じです。
まずはヘッダーぐらいに以下のような感じで書いておきます。
<%= javascript_include_tag 'jquery' %>
<%= javascript_include_tag 'jquery.blockUI' %>
<script type="text/javascript">
 <!--
  $(function($) {
   $('.exec_do').click(function() {
    $.blockUI({ message:'<h1>実行中...</h1>' });
   });
  });
 // -->
</script>

そしてsubmitの部分を
submit_tag("実行",:class => "exec_do")
とすればよいです。

2010-03-02

cache_fuでキャッシュをすべてクリア

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
RailsのActiveRecordの結果をmemcacheにキャッシュしてくれるcache_fuですが、キャッシュ済みのものを削除したいことがあります。
消したいものが明確であれば、expire_cacheを使えばよさげだと思うのですが、一括更新などをしてほとんど更新したから、いっそ全部消してしまいたいということもあります。
そんなときは、
CACHE.flush_all
とすればOKです。
これだとmemcacheでキャッシュされているものをすべて消してしまうので、場合によっては消しすぎになるかもしれませんが。