Category: General
Posted by: ryhmrt

CakePHPを少し使ってみようと思い、環境を作ってみたのでそのメモ。

構築環境は下記の通り。

  • Mac OS X Snow Lepard (10.6.6)
  • macports
  • lighttpd (1.4.28)
  • php5 (5.3.5)
  • mysql (5.1.55)

macportsは既に入っていて、mysqlもセットアップされている状態から作業を開始した。

php5 インストール

macportsでインストール。fastcgiで動かしたかったので、variantsを指定した。

$ sudo port install php5  fastcgi

mysqlに繋ぐためのモジュールを追加インストール。(少し前のバージョンではvariantsで指定していたらしいのだが、今のバージョンは別パッケージになっている)

$ sudo port install php5-mysql

php.ini 設定

まずは標準で用意されているテンプレートをコピー。

$ sudo cp /opt/local/etc/php5/php.ini-development /opt/local/etc/php5/php.ini

mysqlに繋ぐための設定。

pdo_mysql.default_socket = /opt/local/var/run/mysql5/mysqld.sock
mysql.default_socket = /opt/local/var/run/mysql5/mysqld.sock
mysqli.default_socket = /opt/local/var/run/mysql5/mysqld.sock

PATH_INFOとPATH_TRANSLATEDがきちんと動くようになるという設定。(何で標準でonになっていないのか理解に苦しむ)

cgi.fix_pathinfo=1

lighttpd インストール

これもmacportsでインストール。

$ sudo port install lighttpd

/opt/local/etc/lighttpd/lighttpd.conf 設定

ドキュメントルートを自分の環境に合わせて設定

実行ユーザの変更をしないようにコメントアウト。

#server.username  = "_www"
#server.groupname = "_www"

CakePHP用のmod_rewrite設定(きれいじゃないけど、とりあえずの用途にはこれで何とかなるのではないかと思う)

url.rewrite-if-not-file = (
  "^/$" => "/app/webroot/",
  "^(.*\.(html|png|jpg|gif|css|js|ico))$" => "/app/webroot/$1",
  "^/(.*)$" => "/index.php?url=$1"
)

/opt/local/etc/lighttpd/modules.conf 設定

mod_rewrite有効化。

server.modules = (
  "mod_access",
#  "mod_alias",
#  "mod_auth",
#  "mod_evasive",
#  "mod_redirect",
  "mod_rewrite",
#  "mod_setenv",
#  "mod_usertrack",
)

fastcgi有効化。

include "conf.d/fastcgi.conf"

/opt/local/etc/lighttpd/conf.d/fastcgi.conf 設定

fastcgi.server = ( ".php" =>
                   ( "php-local" =>
                     (
                       "socket" => socket_dir   "/php-fastcgi-1.socket",
                       "bin-path" => "/opt/local/bin/php-cgi",
                       "max-procs" => 1,
                       "broken-scriptfilename" => "enable",
                     )
                   ),
                   ( "php-tcp" =>
                     (
                       "host" => "127.0.0.1",
                       "port" => 9999,
                       "check-local" => "disable",
                       "broken-scriptfilename" => "enable",
                     )
                   ),

                   ( "php-num-procs" =>
                     (
                       "socket" => socket_dir   "/php-fastcgi-2.socket",
                       "bin-path" => "/opt/local/bin/php-cgi",
                       "bin-environment" => (
                         "PHP_FCGI_CHILDREN" => "16",
                         "PHP_FCGI_MAX_REQUESTS" => "10000",
                       ),
                       "max-procs" => 5,
                       "broken-scriptfilename" => "enable",
                     )
                   ),
                )

app/config/core.php 設定

date_default_timezone_set('Asia/Tokyo');
Configure::write('Security.salt', 'てきとうに入力');
Configure::write('Security.cipherSeed', 'てきとうに入力');

DB作成

mysqlにアプリケーション用のデータベースとユーザを作成。

app/config/database.php 設定

作成したDBの接続情報を設定。

Category: General
Posted by: ryhmrt

Cygwinのgetclip, pubclipに当たるものがMacOSXにもあることを初めて知った。

pbcopy が pubclip に当たるもの。

pbpaste が getclip に当たるもの。

pb って pasteboard の略で、Macのクリップボード機能のことみたい。

Category: General
Posted by: ryhmrt

S2JDBCは(というかJPAが、と言うべきか)複合キーをきれいに扱える。

複合主キーは@Idアノテーションを複数のカラムに付ければ良い。

複合キーでの結合のアノテーションはこんな感じ。


@ManyToOne
@JoinColumns({
  @JoinColumn(name = "xx_id", referencedColumnName = "xx_id"),
  @JoinColumn(name = "yy_id", referencedColumnName = "yy_id")
})
public Parent parent;
Category: General
Posted by: ryhmrt

例えばこんな値があったとする。

has 'bar' => (
	isa => 'ArrayRef',
	is => 'rw',
	lazy => 1,
	builder => '_build_bar',
);

後になってもう一度 _build_bar で値を初期化したい場合、

$self->bar($self->_build_bar);

とやれば目的は果たせるのだが、

$self->meta->get_attribute('bar')->clear_value($self);

とやった方がきれいだと思う。

Category: General
Posted by: ryhmrt

近々ImageMagickをちょっと触りそうなので、手元の環境にインストール。

MacPortsならば以下のコマンドでPerlモジュールまで入ることが判明。

port install ImageMagick +perl

+perlがミソ。最初はこれなしで本体だけインストールして、cpanでinstall Image::Magickとかやったんだけど、ライブラリが参照できずにビルドがこけた。

Category: General
Posted by: ryhmrt

FTPでPASV接続した際に調子が悪くて、設定を調べていたら、/etc/vsftpd/vsftpd.confにひどい設定をしていた事実を発見した。

pasv_min_port=330000

エラーで落ちてくれよ。

Category: General
Posted by: ryhmrt

セキュリティ制限により、ドメインが異なるページ間ではJavaScriptでデータのやりとりをすることはできないっぽい。

なんとか回避策はないものかと、ちょっと試行錯誤してみた。

で、見つけた解決策は、URLパラメータでごにょごにょするというもの。

最初のwindowでは、callback関数を定義しておく

window.callback = function(msg){
  alert(msg);
};

で、他のドメインのページを開く

window.open(他のドメインのURL);

開いた先では、直接コールバックをせずに、パラメータ付きで元のドメインのあるページを開く

location.href = あるページのURL + '?' + escape(渡す値)

で、その遷移先のページでコールバック関数を呼んでやる

opener.callback(unescape(location.search.slice(1)));
window.close();

めんどくさい

Category: General
Posted by: ryhmrt

RailsアプリをwarパッケージにしてTomcat上に配備するメモ。

検証環境

  • JDK 1.6.0 update13
  • JRuby 1.2.0
  • Rails 2.3.2
  • warbler 0.9.12
  • jruby-rack 0.9.4
  • activerecord-jdbc-adapter 0.9.1

環境構築

  1. JDKインストール
  2. JRubyインストール(解凍してパス通す)
  3. gemアップデート
    $ jruby -S gem install rubygems-update
    $ jruby -S update_rubygems
  4. gemから必要なものを入れる
    $ gem install rails
    $ gem install activerecord-jdbc-adapter
    $ gem install mongrel
    $ gem install warbler
  5. JDBCドライバをゲット
    ※ 今回はSQL Server JDBC Driverを使用。

ちなみに、database.ymlは以下の様な感じ。

  adapter: jdbc
  driver: com.microsoft.sqlserver.jdbc.SQLServerDriver
  url: jdbc:sqlserver://localhost;database=hoge;
  username: foo
  password: bar

urlにユーザ名/パスワードを書いても無視されるっぽい。

war生成

  1. まずは普通にRailsアプリ作成
  2. environment.rb修正
    # Bootstrap the Rails environment, frameworks, and default configuration
    require File.join(File.dirname(__FILE__), 'boot')
    の後に
    if defined?(JRUBY_VERSION)
      # hack to fix jruby-rack's incompatibility with rails edge
      module ActionController
        module Session
          class JavaServletStore
            def initialize(app, options={}); end
            def call(env); end
          end
        end
      end
    end
    ※ 最近のはやらなくても大丈夫
  3. warbler実行
    $ jruby -S warble config 
    $ jruby -S warble war
  4. warファイルは無視して、tmp/war以下のファイルを使う
  5. WEB-INF/libの下のjrubyを差し替え
    http://dist.codehaus.org/jruby/1.2.0/jruby-complete-1.2.0.jar
  6. WEB-INF/libの下のrackを差し替え
    http://repository.codehaus.org/org/jruby/rack/jruby-rack/0.9.4/jruby-rack-0.9.4.jar
  7. (必要ならwarに圧縮して)Tomcatに配備
Category: General
Posted by: ryhmrt

Windows + SQL Server + Ruby on Rails + Active Recordという環境を実現するために試行錯誤してみた。

注:以下の実験はWindowsのCRuby(mswin32版)で動作させるための実験的なもの。Windows上だとJRubyの方が安定してるっぽいし、activerecord-jdbc-adapterでSQL Serverにそれなりに接続できるので、そっちに倒した方が良い。

検証環境

  1. Windows XP Professional
  2. SQL Server 2005 Express Edition
  3. Ruby 1.8.7-p72 (mswin32)
  4. Rails 2.3.2
  5. dbi 0.4.1
  6. dbd-odbc 0.2.4
  7. activerecord-sqlserver-adapter 1.0.0.9250

環境構築

Railsまでは入っているという前提

  1. 以下のコマンドでgemのライブラリをインストール
    $ gem install dbi
    $ gem install dbd-odbc
    $ gem install activerecord-sqlserver-adapter --source=http://gems.rubyonrails.org
    
  2. ruby-odbcのWindows用バイナリをダウンロードし、odbc.soとodbc_utf8.soを「C:\ruby\lib\ruby\1.8\i386-mswin32」にコピー
  3. DBD:ODBCライブラリ修正
    C:\ruby\lib\ruby\gems\1.8\gems\dbd-odbc-0.2.4\lib\dbd を修正する
    修正前: require "odbc"
    修正後: require "odbc_utf8"
    ※ これにより、SQL ServerがSJIS(CP932)でも、RailsでUTF8になる

database.yml設定例

  adapter: sqlserver
  mode: ODBC
  dsn: DRIVER={SQL Server};SERVER=.\SQLEXPRESS;UID=user;PWD=pass;DATABASE=dbname;
Category: General
Posted by: ryhmrt

仕事でRubyを使うことになった。 Rubyはやったことないってあれだけ言ってあったのに...

これはWindowsでRuby on Railsを入れたときのメモ。

One-Click Installer

ちょっと古いバージョンでよいならばOne-Click Installerで入れると簡単。

Ruby mswin32

mswin32版は新しいものがこまめにアップされてる。

以下のようなものを別途導入する必要がある。

インストール手順は以下の様な感じ

  1. ruby mswin32を解凍し、c:\rubyに配置
  2. c:\ruby\binをPATHに追加
  3. rubygemsを解凍し、コマンドラインから「ruby setup.rb」
  4. コマンドラインから「gem install rails」
  5. コマンドラインから「gem install mongrel」
  6. コマンドラインから「gem install sqlite3-ruby --version=1.2.3」 ※ 最新版はWindows未対応のため

試しに何かを作ってみる

  1. $ rails test
  2. $ cd test
  3. $ rake db:create:all
  4. $ ruby script\generate scaffold Message title:string body:text
  5. $ rake db:migrate
  6. $ ruby script\server
  7. このURLにアクセス:http://localhost:3000/messages