2009年7月11日土曜日

ブログ引越し~

Bloggerの使い勝手がいまいちだったので、livedoor Blogに切り替えました。
新URLはこちら↓

http://blog.livedoor.jp/akanuma_out/

2009年7月10日金曜日

入間はいなか?

今朝出勤途中でふと足元を見てみると黒い物体。
おおっ、これはカブトムシじゃないですか。
メスだけど結構な大きさのしっかりしたやつ。
久しぶりに見たなぁ、生のカブトムシ。

このまま踏まれてもかわいそうなので近くの木にくっつけてあげました。
こんなのがいるってことは、やっぱり入間はいなかなのか。。。

2009年7月9日木曜日

えきなかユニクロ


会社からの帰り、JR池袋駅構内を歩いていると工事の囲い。
そこにはこんなポスター。

おおっ、なんと改札の中にユニクロがっ。

最近駅中もずいぶんいろんな店が出てるようで。
そういえばユニクロもどっかの駅にはすでに改札内にあったよね。

新しいデザインのユニクロっていうのはどう違うんだろうか。

会社帰りに服買っちゃうかも。
っていうか相方に色々頼まれるようになりそうかも。。。

2009年4月16日木曜日

Java屋としては待望のGoogle App Engine Java。
サインアップも無事終了しているので、とりあえず動かしてみようと
Google Plugin for Eclipse3.4をインストール。
そしてGoogleボタンからプロジェクトを作成して、
Webアプリケーションとして実行!

・・・が、エラー発生orz

2009/04/16 0:43:23 java.util.prefs.WindowsPreferences
警告: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.

うーむ、どうしたもんか。
とりあえずAcer AspireOneの方でも同様に実行すると、こちらは成功。

Windows Vistaのせいとかあるのかな~。
AspireOneはXPだからOK?
でもAspireOneの小さい画面でEclipseガシガシ使っていくのはちとしんどい。。。
まだほとんど原因調べていないけど、何とか解決したいっす。。
そしてWicketを動かしてみたい。

2009年3月29日日曜日

Wicketいい感じ

最近開発を始めたシステムでWicketというJavaのフレームワークを使用。
会社の人に紹介してもらってはじめて使い始めたのだけど、今のところかなりいい感じ。

Apache Wicket
http://wicket.apache.org/

日本Wicketユーザーグループ
http://www.wicket-ja.org/

このフレームワークの思想は、「サーバサイドJavaプログラムにもオブジェクト指向を」というもの。

JavaのWebアプリのフレームワークといえば代表的なものはやはりStruts。
そしてStrutsはServletの上で動いていて、ServletはHTTPの仕様に基づいた動作をするわけです。

Javaを使っている = オブジェクト指向 というイメージがあるけれど、よく考えてみると
Struts(Servlet)の動作というのは基本的に手続き型。
Requestというデータを受け取ったServletが処理を行って結果を返しておしまいというもの。
HTTPの上で動くのでステートレス。
でもオブジェクト指向の考え方はデータ(プロパティ)と処理(メソッド)を持ったオブジェクトが
連携して処理を行うというもの。もちろんオブジェクトは状態を持っている = ステートフル。

JavaのスタンドアロンのプログラムやGUIプログラムはオブジェクト指向本来のつくりをしているけれど、
Webアプリについてはこれまで基本的に手続き型のつくりをされてきている。
MVC タイプ2というものがあるけれど、これは本来MVCというもともとのオブジェクト指向のものを
Webアプリに適用できる形にしたものだそうな。

WicketはWebアプリのJavaでも本来のオブジェクト指向のプログラミングを、Javaの面白さを
取り戻そうということで作られている。
今までのフレームワークとは全く構造が違って、画面上のそれぞれのパーツ = Javaのコンポーネント となっていて、
つくっていてオブジェクトを組み合わせていく感じがとても面白い。

まだまだ使い始めたばかりなので悪いところが見えていないが、とてもこの先が楽しみ。

2009年3月19日木曜日

美人時計

美人時計というサイトがあると聞いて見てみた。

http://www.bijint.com/

街中で時刻を書いた黒板(?)をもった女性の写真が1分ごとに切り替わって時計になっているというもの。
いや私が女好きとか言うわけではなく、ほんとに全員美人なのかと言ったら全部確認はしてないですが、
アイディアがおもしろい。

知ってみれば単純な内容だけど、なかなか思いつかないと思う。

そして自分で写真とって時計作ってみても面白いんじゃないかと。
家族の写真で家族時計とか。
1分1枚写真が必要なので、1日分だと60分×24時間で1440枚必要ですが。

こういうサービスを自分でも何か作れたらいいなー。

2009年3月13日金曜日

広告配信システムのアクセスログをどう保持するか思案中。。。

OSSのopenXを使うことを考えていた自社サービスサイトでの広告配信で、
ユーザの属性などでターゲティングしたりアクセス解析できるようにということで内製することに。
そこで悩んでいるのがアクセスログの持ち方。

あとでいろんな視点からアクセス解析できるようにしたいと言うことは、
アクセスログをほとんど生ログの形で保持しないといけないわけです。
解析するからにはログファイルじゃなくてDBに持ってないといけないわけで、
つまりは 「1PV = 1レコード」 というわけ。

仮に広告を表示しているページが1日あたり10万PVだとしたら、
10日で100万レコード、100日で1000万レコードになってしまうわけで、
そんなペースで肥大化していくテーブルなんてあとで扱いに困るわけです。

今のところそのままデータを保持できる解決策が見つからんので、
やっぱり解析できる視点をある程度限定して、定期的(30分~一時間毎ぐらい)に
サマリしたデータを保持するしかないかぁ~。。。

2009年3月10日火曜日

RubyのMarshalデータはバイナリだった

最近触り始めたRailsのシステムで、テストデータを変更する必要があったので調べてみると、
どうやらMarshalというものを使ってテストデータを保持しているらしい。
ファイルを開いてみた感じでは普通にテキストっぽかったので、そのままviで編集、テスト実行。

1) Error:
NoMethodError: You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.[]

・・・。おかしー。どうやってもこける。。。今までこけてなかったところまで。。。
それでは試しにとsvnからテストデータのファイルを取得しなおして実行すると、成功!

うーむ、どうやらMarshalデータを直接いじったのが原因か。
ネットで調べてみるとMarshalでdumpされたデータはバイナリなので直接編集はできないようで。

だってfileコマンドで調べたら不通にASCIIテキストだって言われるんだもん。。。

$ file hoge.yml
hoge.yml: ASCII text, with very long lines

まぁともあれMarshalというものも初めて知ったので、勉強になりました。

2009年3月6日金曜日

Railsの原因不明のエラー解決!

昨日書いたRailsのエラーがやっと解決!

エラーのトレースに表示されていた、
/usr/local/profiling/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_s upport/dependencies.rb:422:in `remove_const'
の部分をデバッガでチェック。

parent.send :remove_const, names.last

という処理でこけている。
このとき parent = Object, names.last =
VERBOTEN_TAGS だったので、

Object.send :remove_const, VERBOTEN_TAGS

でこけていると。
VERBOTEN_TAGS という変数をクリアしようとしてこけているらしいので、
rubyのライブラリの中を
VERBOTEN_TAGS で全検索。

find ./ -type f -name "*.rb" | xargs grep VERBOTEN_TAGS

結果ヒットしたのは

./gems/1.8/gems/actionpack-1.13.3/lib/action_view/helpers/text_helper.rb

で、中でこういうこと↓をしている。

VERBOTEN_TAGS = %w(form script plaintext) unless defined?(VERBOTEN_TAGS)

んじゃアプリの中でこれを使っているクラスがあるかと検索すると、ありました1クラス。
しかもclass宣言の前にincludeしている。

include ActionView::Helpers::TextHelper
include ActionView::Helpers::TagHelper

class ContentSlot < ActiveRecord::Base
・・・
end

これだとグローバルな扱いになるので他に影響をあたえるっぽい。
ということで、includeをclass宣言の中に移動。

class ContentSlot < ActiveRecord::Base
  include ActionView::Helpers::TextHelper
  include ActionView::Helpers::TagHelper

  ・・・
end

これで動かしたところ、成功!
いやぁ~、長かった。3日ぐらいかかった気がする。

で、わかってみれば、そういえばあのTracに同じこと書いてあったな、と。。。

http://dev.rubyonrails.org/ticket/6716

ちょっと読んで自分のケースとは違う気がした&英語だったので途中であきらめたので
ちゃんと読んでいなかったんだけど、全く同じ対処が書いてあった。。。
ちゃんと読めてりゃ1日早く解決したかも。。。

まぁなんにしても解決すりゃよしということで。

2009年3月5日木曜日

最近セキュリティきびしいよね。。。

会社のセキュリティ規則が厳しくなって自前ノートPC持ち込み禁止に。
ISMSだとかJ-SOXだとか認証取るんだとか。

今までAcerのAspire-Oneを持ち歩いて通勤中に使ってたりしたのに、それもできなく。。。
そのために買ってまだそんなに経ってないのにー。

毎日コインロッカー借りたら出費がばかにならんし、
誰か会社の近くでPC預かってくれないかな!?

Railsで原因不明のエラー。。。

Railsのデバッガを使うきっかけになったのが、原因不明のエラー。。。
サーバ起動して1回目は普通にページ遷移できるのに、2回目以降は
"そんなメソッドはねぇ。" と言われてエラー画面。

デバッガ使ってみたら1回目の正常に表示されるときの最後にこんなエラーが↓

Processing ApplicationController#index (for 192.168.1.77 at 2009-03-05 18:51:01) [GET]
2009-03-05 18:51:01: Error calling Dispatcher.dispatch #
/usr/local/profiling/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:422:in `remove_const'
/usr/local/profiling/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:422:in `send'
/usr/local/profiling/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:422:in `remove_constant'
/usr/local/profiling/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:273:in `remove_unloadable_constants!'
/usr/local/profiling/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:273:in `each'
/usr/local/profiling/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:273:in `remove_unloadable_constants!'
/usr/local/profiling/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:72:in `clear'
/usr/local/profiling/lib/ruby/gems/1.8/gems/rails-1.2.3/lib/dispatcher.rb:60:in `reset_application!'
/usr/local/profiling/lib/ruby/gems/1.8/gems/rails-1.2.3/lib/dispatcher.rb:116:in `reset_after_dispatch'
/usr/local/profiling/lib/ruby/gems/1.8/gems/rails-1.2.3/lib/dispatcher.rb:51:in `dispatch'
/usr/local/profiling/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/rails.rb:76:in `process'
/usr/local/profiling/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/rails.rb:74:in `synchronize'
/usr/local/profiling/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/../lib/mongrel/rails.rb:74:in `process'
/usr/local/profiling/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:159:in `process_client'
/usr/local/profiling/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:158:in `each'
/usr/local/profiling/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:158:in `process_client'
/usr/local/profiling/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `run'
/usr/local/profiling/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `initialize'
/usr/local/profiling/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `new'
/usr/local/profiling/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `run'
/usr/local/profiling/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `initialize'
/usr/local/profiling/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `new'
/usr/local/profiling/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `run'
/usr/local/profiling/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/configurator.rb:282:in `run'
/usr/local/profiling/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/configurator.rb:281:in `each'
/usr/local/profiling/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/configurator.rb:281:in `run'
/usr/local/profiling/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:128:in `run'
/usr/local/profiling/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/command.rb:212:in `run'
/usr/local/profiling/lib/ruby/gems/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:281
/usr/local/profiling/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:488:in `load'
/usr/local/profiling/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:488:in `load'
/usr/local/profiling/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:342:in `new_constants_in'
/usr/local/profiling/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:488:in `load'
/usr/local/profiling/lib/ruby/gems/1.8/gems/rails-1.2.3/lib/commands/servers/mongrel.rb:60
/usr/local/profiling/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require'
/usr/local/profiling/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
/usr/local/profiling/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:495:in `require'
/usr/local/profiling/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:342:in `new_constants_in'
/usr/local/profiling/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:495:in `require'
/usr/local/profiling/lib/ruby/gems/1.8/gems/rails-1.2.3/lib/commands/server.rb:39
/usr/local/profiling/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require'
/usr/local/profiling/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
script/server:3


これのせいで2回目以降の処理が失敗してるとか?
activesupportのバージョン上げてみるとかどう?(←安易。。。)

ググってもあんまり情報ないし。。。
http://www.ruby-forum.com/topic/119930

実はmongrelのバグとか?
主に作ってた人が今すでにいないのでmongrelで動かしてたか実績は不明。。。
明日CGIで動かしてみよう。

Railsのデバッガ

最近仕事でRuby on Railsに着手。
ローカルのPCは権限の問題やらで環境づくりが面倒なので、テストサーバで直接アプリ動かしたり。。

そんな状況だとIDEのデバッガが使えない!
そこで上司から教えてもらったのが "ruby-debug"(http://www.sitepoint.com/article/debug-rails-app-ruby-debug/)

config/environments/development.rb に require "ruby-debug" と書くだけで使える。
あとはプログラムの止めたいところに debugger と書けばそこでストップ
viewでも <% debugger %> とすれば使える。

mongrel_rails で動かしていたのだけれど、これだとデバッガは使えないようで、
ruby script/server で動かすとそのターミナルがそのままデバッグのコンソールになる。

こいつは使える。