Nasuta<http://www.nasuta.jp/>

2006年08月06日

QRコードの生成について

QRコード生成のライブラリをRailsに組み込んだら例外が発生して正常に動作せず。(文字コードがらみと思われる。)

http://www.swetake.com/qr/ruby/qr_rb.html

回避策の見当もつかなかったので次善策としてQRコードはAppletで表示することに。

http://www.swetake.com/qr/java/qr_java.html

posted by ふんじ at 00:52| Comment(0) | TrackBack(1) | 開発記録 | このブログの読者になる | 更新情報をチェックする

2006年08月01日

webrickが落ちていたので監視サービスに登録

lighttpd で起動できなくなっていたので暫定的にwebrickでhttp://www.nasuta.jpを動かしてたらいつの間にか落ちていた。

本番運用はむずかしいか。

ということで、lighttpdに戻して無料のサービス監視を使うことに。
http://www.montastic.com/
posted by ふんじ at 09:58| Comment(0) | TrackBack(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

2006年07月28日

携帯対応 ー lighttpdでのトラブル回避

前回のlighttpdに関するトラブルを回避するために lib/に登録するだけでconfig/environment.rb にrequireしなくても使えるように修正しました。ふぅ。

mobile_view2.rb


携帯からのアクセスでレイアウトを切り替えるコントローラに  around_filter ::MobileView::TransFilter.new を記述します。


class HogeController < ApplicationController
around_filter ::MobileView::TransFilter.new



携帯用のレイアウトは app/views/mobile/コントローラ/ の配下に配置します。


svn://www.nasuta.jp/nasuta/trunk
posted by ふんじ at 22:05| Comment(0) | TrackBack(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

2006年07月27日

携帯対応 ー lighttpdでトラブル

携帯対応で必要な機能が一通り動くようになったのだが、lighttpdで起動すると

config/environment.rb 内で定義している 

require "mobile_view"

のところで "mobile_view"見つからないというエラーが出てしまい、終了してしまう。参考元によるとここに定義しないと読み込みの順番の問題でこれまた正常に動作しないとのこと。


どうすればいいんだ。。きつー。
posted by ふんじ at 23:50| Comment(0) | TrackBack(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

2006年07月26日

携帯対応 - viewの明示的な切り替え

昨日、以下のように書いたのですが、とりあえずはUserAgentを判別して自動切り替えを行うコントローラとUserAgentには影響を受けないコントローラをつくることができました。


* UserAgenteでViewを切り替えるコントローラ
* PC専用(UserAgentは考慮しない)コントローラ
* 携帯専用のコントローラ。UserAgentは考慮しないがセッションIDはURLに含める必要がある。

と3種類のコントローラの制御が必要かつ、これらのコントローラ間のやり取りも整合性をとる必要がある。

先のURLからソースを取ってきていろいろトライしてるんですが、今のところうまくいかず。道のりは長いか。。。
続きを読む
posted by ふんじ at 21:49| Comment(0) | TrackBack(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

2006年07月25日

携帯対応の検討課題

携帯対応を開始しました。ネットで調べてみると既にプラグインやライブラリが公開されています。


http://www.kbmj.com/tech/index.php?itemid=28
http://d.hatena.ne.jp/secondlife/20051107/1131348210

携帯対応のポイントとしては、


  • Cookieが使えないことを前提にセッションIDをクエリストリングに変換
  • UserAgentを調べて携帯だったらViewを携帯用に変更
  • ページをSJISに変換
  • リクエストパラメータの値をSJISに変換


先の二つのURLで公開されているソースは非常にスマートに解決してあるみたいです。(何をやってるのかちゃんと理解できてないんですが。^^;)

が、UserAgentを使ってViewを切り替える方法だとキャッシュが使えないのではと思うのです。 http://hogehoge/controller/action という一つのURLでUserAgentを見て出力を切り替えるわけですから。

ということで、コントローラ単位で切り替えられるようにしたいと考えています。これがかなりややこしい。


  • UserAgenteでViewを切り替えるコントローラ
  • PC専用(UserAgentは考慮しない)コントローラ
  • 携帯専用のコントローラ。UserAgentは考慮しないがセッションIDはURLに含める必要がある。


と3種類のコントローラの制御が必要かつ、これらのコントローラ間のやり取りも整合性をとる必要がある。

先のURLからソースを取ってきていろいろトライしてるんですが、今のところうまくいかず。道のりは長いか。。。



posted by ふんじ at 23:26| Comment(0) | TrackBack(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

2006年07月22日

webアプリを公開します。

今までrailsの勉強がてらWEBアプリを開発していましたが、だいぶん形になってきたので公開したいと思います。


http://www.nasuta.jp/

簡単なメモWEBアプリですが、ユーザ管理、アクセス制限、不正アクセス対策が盛り込んであります。
posted by ふんじ at 21:20| Comment(0) | TrackBack(1) | 開発記録 | このブログの読者になる | 更新情報をチェックする

2006年07月20日

カスタムページネーション(Pagenation)

Railsのpaginate は便利なんですが、複雑な条件で検索して尚かつpagenateも使いたいとなると限界があります。

paginate の機能は簡単に結構簡単にできます。Paginatorというクラスを独立してcontrollerから呼べば良いだけですね。こんな感じです。

def itemPaginate(params)
# step 1: read and set the variables you'll need
page = (params[:page] ||= 1).to_i
items_per_page = 35
offset = (page - 1) * items_per_page

# step 2: do your custom find without doing any kind of limits or offsets
# i.e. get everything on every page, don't worry about pagination yet

tag = params[:t]
yyyy = params[:y]
mm = params[:m]
label_color = params[:lc]
order = "items.created_on desc"
conditions = "items.user_id = ?", session[:user_id]

if tag == nil && yyyy == nil && mm == nil && label_color == nil
@item_pages, @items = paginate :items,:per_page => 35,:order => order,:conditions => conditions
else
if tag != nil
@items = Item.find_tagged_with(tag,:order => order,:conditions => conditions )
elsif yyyy != nil && mm != nil
@items = @user.items.find(:all,:conditions => ["entry_year = ? and entry_month = ?",yyyy,mm],:order => order)
elsif label_color != nil
@items = @user.items.find(:all,:conditions => ["label_color = ?",label_color],:order => order)
end

# step 3: create a Paginator, the second variable has to be the number of ALL items on all pages
@item_pages = Paginator.new(self, @items.length, items_per_page, page)

# step 4: only send a subset of @items to the view
# this is where the magic happens... and you don't have to do another find
@items = @items[offset..(offset + items_per_page - 1)]
end
return @item_pages,@items
end


詳しくはこちらを:
http://wiki.rubyonrails.com/rails/pages/HowtoPagination
ラベル:pagenate
posted by ふんじ at 22:04| Comment(0) | TrackBack(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

2006年07月19日

with_scopeを使うのやめることに

こんな感じでwith_scope の定義をapp/controllers/application.rb に設定していたのですが、
around_filter TestScopedAccessFilter.new(Item, :mine)

private
def carbon_copy(item)
recipient = session[:email]
AccountMailer.deliver_carbon_copy(recipient,item)
end

protected
def mine
{
:find => {:conditions => ["user_id = ?", session[:user_id]]},
:create => {:user_id => session[:user_id]}
}
end


with_scope をfilter で使えるようにしたプラグインを使っていたのと、プラグインのフィルタをapp/controllers/application.rb で定義していたため、productionモードで動かすとリクエストのたびにリロードされなくなるためsession[:user_id]が更新されないことが原因で挙動がおかしくなっているよう。

挙動がモードによってかわるのはいまいちだし、かといってそれを避けるようにコーディングするにはどうしたらいいかよくわからんし(というか、そこに労力を払うのは本末転倒)プラグインは使わないこととし、素直にwith_scopeをそのまま使うようにしました。こんな感じ。


Item.with_scope(:find =>{:conditions => ["user_id = ?",session[:user_id]]}) do
@item_pages, @items = paginate :items,:order_by => "created_on desc" ,:per_page => 35
tag = params[:t]
if tag then
@tag = tag
@items = Item.find_tagged_with(tag)
end
end

で、いちいちwith_scopeを設定するほうが面倒なメソッドは has_many() でアソシエーションしてあるので、

 @user = User.find(session[:user_id])
@item = @user.items.find(:id)

とUserモデルを介してアクセスするようにしてwith_scopeを使うのをやめました。
posted by ふんじ at 23:14| Comment(0) | TrackBack(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

直ってなかった。「with access の不具合」

昨日、こうかいたけどやっぱり直ってない。挙動が不安定だったりもする。
うーむ。。こりゃたいへんだ。。

witch_scopeですが、RAILS_ENVをproductionにしたら無効になっているような感じ。

バグっぽいのでrails を1.1.2 から1.1.4にアップしたら直ったみたい。
posted by ふんじ at 20:32| Comment(0) | TrackBack(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

2006年07月18日

with access の不具合?

witch_scopeですが、RAILS_ENVをproductionにしたら無効になっているような感じ。

バグっぽいのでrails を1.1.2 から1.1.4にアップしたら直ったみたい。
posted by ふんじ at 22:01| Comment(0) | TrackBack(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

2006年06月22日

ユーザにアイテムを紐つける

UserモデルにItemモデルを紐つけることによってユーザがログインした後にアイテムのスコープをユーザが所有しているアイテムに限定されるようにしてみます。

かならずUserモデルを介してItemを取り出すことによって他のユーザのデータがみれてしまうというバグを防ぐことができます。

続きを読む
posted by ふんじ at 00:17| Comment(0) | TrackBack(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

2006年06月20日

クリーンアップタスクをRakeで管理

rakeに昨日つくったcleanup のタスクを登録してみる。
lib/tasksに適当にrakeファイルを作成します。



例:

task :cleanup do
sh "script/runner 'User.cleanup'"
end


アプリケーションのトップディレクトリで次のコマンドを実行すればcleanupタスクが実行できます。

% rake cleanup

posted by ふんじ at 22:44| Comment(0) | TrackBack(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

2006年06月17日

共通レイアウトの設定

Ruby on rails では共通に使うHTMLのテンプレートをコントローラ単位で設定することができます。

app/views/layouts/{コントローラ名}.rhtml というファイルを作成して共通のレイアウトを定義します。

例:

<html>
<head>
</head>
<body>
<div id="userContainer">
<div id="main">
<div id="header">
<h1>Title</h1>
</div>

<div id="core">
<%= @content_for_layout %>
</div>

<div id="footer">
Powerd by Nausta.
</div>
</div>
</div>
</body>
</html>

<%= @content_for_layout %> のエリアにコントローラが生成したコードが展開されます。
posted by ふんじ at 21:21| Comment(0) | TrackBack(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

2006年05月13日

cookie をつかったSession Fixation Attack対策

Ruby On Rails ではログイン前もログインの後も同じセッションCookieを使用するためセッション固定攻撃に対する脆弱性があります。

以前の記事ではログインの後にセッションをリセットする方法で実装を行ってみましたが、試してみたところflashにセットした値が取得できないという不具合がありました。例えば、次のコードでは"logged out !"とい文字列がViewで表示されません。(たぶん使い方が悪いのでしょうが。。)
  def logout
reset_session
flash[:notice] = "logged out !"
redirect_to(:action => "login_form")
end


そこで、自前でcookieを発行してログイン状態を管理するように変更してみます。自前でcookie 管理するとセッション管理に非依存になるため挙動の見通しが良く、カスタマイズが容易です。JAVAなどのほかの言語に移植する場合も自前で実装した部分だけを移行すればいいので作業量が減ります。

(セッションは固定されているので仕込まれたセッションを使ってしまうのは気持ち悪いですが、ログインができないので実害は無いでしょう)

続きを読む
posted by ふんじ at 13:36| Comment(0) | TrackBack(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

2006年05月04日

hiddenタグにセッションID(ハッシュ化)を埋め込むCSRF対策

CSRF対策のためにフォームのhiddenタグにハッシュ化されたセッションIDを埋め込み、 リクエストを受けたときにチェックする仕組みを実装します。

  1. フォームのメソッドはPOST
  2. hiddenタグにハッシュ化したセッションIDを埋め込む
  3. フォームの結果を受け取るアクションに関してセッションIDとフォームに埋め込まれた値を比較する
  4. 本サービスではSSLで暗号化して運用する。

ワンタイムトークンを推奨しているおさかなラボさんの説明を読みましたが、 いまのところそこまでする必要性が感じられないのでとりあえず上記の方法で実装します。

続きを読む
posted by ふんじ at 21:24| Comment(1) | TrackBack(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

2006年05月03日

IPアドレスの一致によるセッションハイジャック対策

最初にテストを書くってのがXPっぽいらしいのでテストを作成してから実装することにします。

  # IPアドレスが変わったときのsession riding のテスト
  def test_change_remote_addr
    @request.remote_addr="192.168.0.40"
    test_login_with_valid_user
    get :welcome
    @request.remote_addr="192.168.0.111"
    get :welcome
    assert_redirected_to :action => 'logout'
    assert_equal flash[:notice],"logout to change your ip address"
  end

リモートIPアドレスを明示的に変更してアクセス制御フィルタの動作をテストするメソッドです。

 

続きを読む
posted by ふんじ at 21:34| Comment(0) | TrackBack(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

2006年05月01日

メール配信の実装

Iso2022jpMailerを参考にメール送信の実装をやってみました。

Railsのメール配信コンポーネットであるActionMailerはUTF-8によるメール送信を前提としているのでISO-2022-JPで配送できるように工夫する必要があります。

電子メールの設定

config/environment.rb に電子メール送信の設定を行います。SMTPプロトコルを使うことを前提にしています。

Rails::Initializer.run do |config|
ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.server_settings = {
:address => 'SMTPホスト名',
:port => 25,
:domain => '使用しているドメイン名'
}
ActionMailer::Base.default_charset = 'iso-2022-jp'


Iso2022jpMailer
ISO-2022-JP でメールを送信するために ActionMailer::Base を継承したクラス Iso2022jpMailerクラスを lib/iso2022jp_mailer.rbに作成します。
require 'nkf'
class Iso2022jpMailer < ActionMailer::Base
def base64(text)
if default_charset == 'iso-2022-jp'
text = NKF.nkf('-j -m0',text)
end
text = [text].pack('m').delete("\r\n")
"=?#{default_charset}?B?#{text}?="
end
def create!(*)
super
@mail.body = NKF::nkf('-j',@mail.body)
@mail
end
end


これで前準備は完了です。続きを読む
posted by ふんじ at 01:20| Comment(0) | TrackBack(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

2006年04月29日

Subversion による管理

書籍:「Subversion実践入門」とURL:subversionでRailsアプリを管理するを参考にSubversionによるソースコード管理にトライ

Subversion(以下svn)のリポジトリはclaraのVPSに構築しました。

めんどくさいのでリモートからのsvnへのアクセスは svn+sshプロトコルで行います。WEV-DAVに必要なapache2などもろもろの依存パッケージもインストールしなくても ./configure; make;make install でOK。(BerkleyDBはインストールしました。不要かも)

リポジトリの設定
% groupadd subversion
% usermod -G subversion ユーザ
% mkdir /hoge/svn-repos
% chgrp -R subversion /hoge/svn-repos
% chmod -R 770 /hoge/svn-repos
% svnadmin create /hoge/svn-repos
% chmod g+s /hoge/svn-repos/db


リモートのrailsのアプリのインポート


testアプリをインポートします。リポジトリは一段深くtrunkディレクトリにインポートします。そうしておくと後でブランチディレクトリを切るのが容易になります。
インポートするディレクトリの直下に移動して以下のコマンドを実行
% svn import . -m "コメント" svn+ssh://ユーザ@ホスト名/hoge/svn-repos/test/trunk

ホスト名の後ろはリポジトリのあるディレクトリへの絶対パスを指定します。私はこれではまりました。


svn: No repository found in ....

/svn-repos/ を指定したら、リポジトリが無いってエラーでてしばらく原因が分かりませんでした。

チェックアウトしてユニットテストを起動して動いてるのを確認。問題なさそう。あ、log/*.logを管理外にする処理を忘れずに。最初に紹介したURLにやり方が書いてあります。


Subversion実践入門―達人プログラマに学ぶバージョン管理
Mike Mason でびあんぐる
4274066134
posted by ふんじ at 19:31| Comment(0) | TrackBack(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

2006年04月13日

SaltedHashLoginGenerator

http://wiki.rubyonrails.com/rails/pages/SaltedHashLoginGenerator

一般的には、login generatorが使われているようですが、salted hash login generator というのがありました。

This generator adds ActionMailer support for changed and forgotten passwords, as well as account verification via a registration email with a custom URL sent to the user’s registered address.

ということで、やりたいことのほとんどが出来てしまうのでこれを使うのもありなんですが、勉強もかねてコツコツと作ってみようかなと

続きを読む
posted by ふんじ at 22:39| Comment(0) | TrackBack(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は90日以上新しい記事の投稿がないブログに表示されております。