画像掲示板とブログを足して2で割ったようなWEBサービスのβ運用を開始

gyonikucastanet2007-02-16


展示会2.0

Railsでチョコチョコ作っていたWEBサービスのβ運用を開始してみます。

「展示会2.0」というなんの工夫もない名前ですが、絵師さんのために特化したブログ、といった感じのサービスです。

1つの投稿に1枚の絵が対応していて、その絵は絵師さんのブログで表示されるのはもちろん、システムのトップページにもサムネイルで表示されます。

そしてサムネイルは様々な条件で検索されることができます。これによって、「ある特定の絵を見たい人」と「絵師さんが描くある絵」のN対Nを結び付けられたらいいなぁと思います。

具体的に言うと、例えば「リリカルなのは」の「フェイト」の絵が見たい、と思っている人がそのような条件で検索し、RSSなどで継続チェックしているとき、ある絵師さんがフェイトの絵を描くと、検索者にダイレクトに絵を提示することができます。

また、評価とコメント機能を全ての絵で統一することで、絵を見る人がフィードバックを送りやすいようにしました。自分の描いた絵の反応を知りたい絵師さんは多いと思うので、そこらへんの助けになれば良いなぁと思います。

そんなこんなで、絵を描かれている方は是非登録していただけるとうれしいです。

DreamhostでRailsを使ってみる [mysqlのutf-8が文字化け]

気づくのが遅かったんですが、DBに入れた日本語が文字化けしてました。
LC_ALL=ja_JP.UTF-8を設定しているコンソールから使うmysqlは文字化けしてなかったんですが、なぜだかRailsアプリで使うDBの日本語が崩れる。

いろいろ試行錯誤した結果、database.ymlの

encoding: utf8

が余計だったようで、これを外したら文字化けしなくなりました。

これと同じことをやってるはずの、mysqlコンソールアプリ内でのset names utf8;でもやっぱり文字化けをおこしてしまいました。

うーん、明示的な指定すると崩れるっていうのは気持ち悪いなぁ…

DreamhostでRailsを使ってみる

巷で話題のDreamhost。初年度が実質22$(三千円くらい)で200GBのディスク容量に月の転送量が2TBと、桁まちがってんの?というスペックですが、Railsも動くようなので借りてみました。

sshでログインして、scpでRailsのプロジェクトをコピー。自分のユーザーパスのドメイン名のディレクトリにapacheのヴァーチャルドメインのパスが通っているようなので、

mv (ドメイン名) (ドメイン名)_bk
ln -s (プロジェクト名)/public (ドメイン名)

でパスを通せばすぐさま動かせます。
fastcgiも、public/.htacessの

RewriteRule ^(.*)$ dispatch.cgi [QSA,L]

RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]

に変えるだけで動きます。

ちなみに、現時点(2月5日)の時点でRailsのバージョンは1.2.1、Rubyは1.8.5と最新でしたが、
ImageMagickがちょっと古く、6.2.4でした。resize_to_fit()をRMagickから実行したら「そんなメソッド知らねーよ」と怒られてしまいました。

それ以外では今のところ不満はないですね。
海外とのssh通信も、とくに遅くは感じないと思います。

アクションを直リン禁止にする

DBから画像データをsend_dataするような、ビューから呼び出すからpublicにしなきゃらなんけど、
外から直リンさせたくない、ような関数ってどうやって指定するのかなぁと探したんですが、
見当たらなかったので実装してみました。

def tyokurin_notallowdalbe
  ref = @request.env["HTTP_REFERER"]
  unless ref.to_s =~ /#{@request.host.to_s}/
    flash[:notice] = "直リンできません。"
    redirect_to :action=>"index"
    return;
  end
end

そんで

before_filter :tyokurin_notallowdalbe, :only=>:draw

してやれば、オッケーのようです。

      • 2月5日追記---

同じようなことはActionPackに最初っからついてるhide_actionでもできるようです。
publicインスタンスメソッドをアクションとして認識しないようにするものですが、
コイツだとビューから@pict.drawのように呼び出せても、:action=>:drawのように
間接的に呼び出すのはできないっぽいです。

ExceptionLoggerプラグインを使ってみた

ExceptionLoggerという、運用中に発生した例外をDBに保存しておき、後でAjax画面で管理できるプラグインを使ってみました。

http://blog.masuidrive.jp/articles/2006/09/25/rails-rss-feeds-for-exception-logger
を参考にインストールします。

ruby script/plugin install http://svn.techno-weenie.net/projects/plugins/exception_logger

してから、

ruby script/generate exception_migration
ruby db:migrate

でテーブルを作成。

僕の環境はRails1.6.1のRuby1.8.4なんですが、このままじゃエラーになって動きませんでした。
エラーをキャッチする部分でエラーが発生するもんで捕捉がめんどうでしたが、どうも
plugin/exception_logger/lib/exception_loggable.rb

render_optional_error_file status

が悪さをしているようで、こいつをコメントアウトしたら動きました。
そして/logged_exceptionsにアクセスすると管理画面にいけるわけですが、どうもこの管理画面は
productionモードでないとまともに動かないようです。developmentモードだと、挙動が不安定になって
意味不明でした。

なにはともあれ、自分の見てないところで発生する例外を全部チェックできるのはうれしいですなぁ。


 -------2月18日追記-----------------------
デフォルトのまんまだと、アドレス打ち込むだけで誰でも管理画面に行けてしまいます。
READMEを見ると認証を使った方法が書かれていますが、login_engineを使っているならもっと
簡単にできると思います。
exception_logger/lib/logged_exceptions_controller.rb
で定義されてる全てのアクションに対し、認証フィルタをかけてやります。

class LoggedExceptionsController < ActionController::Base
  cattr_accessor :application_name
  layout nil

  before_filter :nin

  def nin
    #ユーザー認証
    user = session[:user]
    if !user
        redirect_to '/404.html'
        return false
    end
    unless user.login=="root"
        redirect_to '/404.html'
        return false
    end  
  end

login_engineの認証メールを日本語化(JIS化)する

2月5日追記---------------------------------------
SJISじゃなくJISでした。
基本的なこと間違えてすんません ι(´Д`υ)

                                                                                                • -

login_engineの認証メールはUTF-8で送信されます。
でも、日本語で送ると、受け取ったとき文字化けしてしまいます。
大抵のメーラーはJISで読み込もうとするので。
だもんで、認証メールをJIS化する必要があるのですが、
ActiveHeartを使用すると簡単にできます。インストールしたら、
/XXXX/vendor/plugins/login_engine/app/models/user_notify.rb

class UserNotify < ActionMailer::Base

class UserNotify < Iso2022jpMailer

に書き換えます。


これで本文はJISで送れるようになったのですが、タイトルと送信者がJIS化
されていません。ですので、適当にJIS変換関数を定義して、

def jis(text)
 text = NKF.nkf('-j -m0', text)
 text= [text].pack('m').delete("\r\n")
 "=?iso-2022-jp?B?#{text}?="
end

内容を書き換えてやればオッケーのようです。

@from = jis @from
@subject = jis @subject

送信される内容は
/XXXX/vendor/plugins/login_engine/app/views/user_notify/
以下のrhtmlファイルに記載されていますので、これらを日本語に
書き換えます。