5月 182012
 

素直に入ってくれないと悲しいよね。
ググって解決策見つけてもうまくいかないことも多いし。

と言う事で私の環境では次のコマンドで入りました。
mysqlはhomebrewで5.5.20を入れたので、libやincludeのパスは各環境のに合わせること。

sudo env ARCHFLAGS="-arch x86_64" gem install mysql -- --with-mysql-dir=/usr/local/Cellar/mysql --with-mysql-lib=/usr/local/Cellar/mysql/5.5.20/lib/ --with-mysql-include=/usr/local/mysql/5.5.15/include  --with-mysql-config=/usr/local/Cellar/mysql/5.5.20/bin/mysql_config

上の例はhomebrewでmysql入れているので、mysqlをまだインスコして無い場合はbrew install mysqlしてね。

 Posted by at 7:31 PM
5月 112012
 

Rails3で、bootstrapを入れるなどすると1ページ読み込むたびに複数のJSファイルやCSSファイルを読み込むため、ログがぶわーっ!っと流れてしまい、ログが使い物にならなくなる。たとえば次のようなログが大量に流れる。

Started GET "/assets/twitter/bootstrap/bootstrap-collapse.js?body=1" for 127.0.0.1 at 2012-05-11 17:30:36 +0900
Served asset /twitter/bootstrap/bootstrap-collapse.js - 200 OK (2ms)

Started GET "/assets/twitter/bootstrap/bootstrap-carousel.js?body=1" for 127.0.0.1 at 2012-05-11 17:30:36 +0900
Served asset /twitter/bootstrap/bootstrap-carousel.js - 200 OK (2ms)

で、このようなログを出力しないようにする。

解決方法はこちら。Rails3.1とRails3.2で方法が違うので注意。

Rails3.1の場合、app\config\initializers\quiet_assets.rbを作成し次の内容を記述する。

Rails.application.assets.logger = Logger.new('/dev/null')
Rails::Rack::Logger.class_eval do
  def before_dispatch_with_quiet_assets(env)
    before_dispatch_without_quiet_assets(env) unless env['PATH_INFO'].index("/assets/") == 0
  end
  alias_method_chain :before_dispatch, :quiet_assets
end

Rails3.2の場合、app\config\initializers\quiet_assets.rbを作成し次の内容を記述する。

Rails.application.assets.logger = Logger.new('/dev/null')
Rails::Rack::Logger.class_eval do
  def call_with_quiet_assets(env)
    previous_level = Rails.logger.level
    Rails.logger.level = Logger::ERROR if env['PATH_INFO'].index("/assets/") == 0
    call_without_quiet_assets(env).tap do
      Rails.logger.level = previous_level
    end
  end
  alias_method_chain :call, :quiet_assets
end 

Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true と言うログが大量に出てやっぱりログが流れる場合は次のようにする。
環境によって異なるが、 ~/.rbenv/versions/1.9.3-p125/lib/ruby/1.9.1/webrick/httpresponse.rb にこちらのような修正をする。

 Posted by at 5:47 PM
5月 102012
 

Mac上にRoR3をインストールする方法は以前紹介した。今度はUbuntu12.04上にRoR環境を構築する。
Ubuntu12.04には必要なライブラリが最初から入っていないので、入れる。

$ sudo apt-get install zlib1g-dev

ちなみに上記を実行しないと、後々のrailsインストール時に次のようなエラーが出る。

$ gem install rails
ERROR:  Loading command: install (LoadError)
    cannot load such file -- zlib
ERROR:  While executing gem ... (NameError)
    uninitialized constant Gem::Commands::InstallCommand

続いてrbenvのインストール

$ sudo apt-get install rbenv

ruby-buildのインストール

$ git clone git://github.com/sstephenson/ruby-build.git
$ cd ruby-build
$ sudo ./install.sh

zshを使っているので、.zshrcに次の記述を追加

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

rubyのビルド

$ CONFIGURE_OPTS="--with-readline-dir=/usr/local" rbenv install 1.9.3-p194
$ rbenv rehash
$ rbenv global 1.9.3-p194

以上でRubyのインストールはOK。続いてRuby on Rails3を入れる。

$ gem install rails

入ったか確認してみる。

$ rails -v
Rails 3.2.3

インストール完了!

 Posted by at 2:06 PM
4月 252012
 

Ruby on Rails3で、Flashから何らかのデータをPOSTしようとすると、次のように怒られる。

WARNING: Can't verify CSRF token authenticity

これは、Railsでフォームを使うとCSRF対策にトークンが自動生成されるんだけど、そのトークンが送られてないよ!と怒っている。GETメソッド以外はCSRFトークンが必須となっているようだ。CSRF対策を無効にして回避することも出来るのだけれど、さすがにそれはしたくない。と言う事で、FlashにCSRFトークンを渡し、FlashからPOSTする際にそのトークンを渡すようにする。ついでにセッションIDも同じように渡し、POSTする際にセッションが有効になるようにす

今回想定するアプリは次のようなモノだ。
1. Rails上で作成したWebページにFlashアプリを埋め込む。
2. Flashアプリ上でデータを入力し、アップロードボタンを押すとPOSTでデータをアップロードする。
3. Railsでデータを受け取る。

何も考えずに作成すると、3でデータを受け取る際に、前述のエラーがでてしまう。

まずはFlashアプリへCSRFトークンとセッションIDを渡す。Flashアプリへ情報を渡すには、FlashVars属性を使う。CSRFトークンは<%= form_authenticity_token %>で、セッションIDは<%=request.session_options[:id] %>で書き出すことが出来る。

<EMBED
    src="/swf/hoge.swf"
    FlashVars="token=<%= form_authenticity_token %>&session=<%=request.session_options[:id] %>"
    TYPE="application/x-shockwave-flash"
    PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer">
</EMBED>

Flashからデータをポストするには次のような感じにする。CSRFトークンはauthenticity_tokenと言う名前、セッションIDはsession_idと言う名前で送信する。

	var params:Object = loaderInfo.parameters;
	var token:String = params["token"];
	var sessionId:String = params["session"];

	var variables:URLVariables = new URLVariables();
	variables.data = "何らかのデータ";
	variables.authenticity_token = token;
	variables.session_id = sessionId;

	var urlRequest:URLRequest = new URLRequest();
	urlRequest.url = "http://localhost:3000/upload";
	urlRequest.method = URLRequestMethod.POST;
	urlRequest.data = variables;

	var postLoader:URLLoader = new URLLoader();
	postLoader.load(urlRequest);

これでFlashからデータをPOSTして、なおかつセッションが有効になるよ!

 Posted by at 1:18 PM
4月 112012
 

今まで、Linux環境にRoRを入れて開発していたけれど、Mac上にRoR環境をつくって開発してみる。
情報は次のサイトを参考にした。これらのサイトの方が詳しいのでそちらを見た方が良いけれど、自分用に簡単にまとめてみる。

これからRubyを始める人たちへ

まず、Rubyのバージョンを確認する。

$ ruby -v

ruby 1.8.7 (2010-01-10 patchlevel 249) [universal-darwin11.0]
と表示されたら古いRubyを実行しているので、新しいバージョンを入れよう。

Rubyはrbenvと言う複数のRubyのバージョンを同時に使えるようにするRubyバージョンマネージャーを使ってインストールする。
rbenvをインストールするには、Homebrewと言うパッケージマネージャーを使う。Homebrewをまだインストールしていない場合は、適当にググってインストールしてくる。

ではrbenvをインストールする。

$ brew update
$ brew install rbenv
$ brew install ruby-build
$ brew install readline
$ brew link readline

次に、rbenvを使うよう、shellの設定を行う。Zshを使っているので、.zshrcに次を追加する。

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

準備が出来たので、Rubyをインストールする。
インストール可能なRubyのバージョンは次のコマンドで確認できる。

$ rbenv install

2012年4月現在、1.9.3-p125がおすすめなようだ。

$ CONFIGURE_OPTS="--with-readline-dir=/usr/local" rbenv install 1.9.3-p125
$ rbenv rehash

ここで、次のように怒られる。

ERROR: This package must be compiled with GCC, and we
couldn't find a suitable `gcc' binary on your system.
Please install GCC and try again.

As of version 4.2, Xcode is LLVM-only and no longer
includes GCC. You can install GCC with these binary
packages on Mac OS X:

https://github.com/kennethreitz/osx-gcc-installer/downloads

リンクからgccをダウンロードし、インストールする。
そして、もう一度試すとインストールが成功するはずだ。

で、ruby -vを実行するが、まだrubyは古いまま。
rbenvを用いて、どのバージョンのrubyをどこで使うか設定する必要があるようだ。
rbenvを用いると、このディレクトリ以下はこのバージョンのrubyなどと柔軟に設定をすることが出来るようだ。
とりあえず今インストールしたrubyを使いたい場合は、次のように設定する。

$ rbenv global 1.9.3-p125

正しく設定できていると、ruby -vで1.9.3になっていることが確認できるはずだ。

続いてRuby on Rails3をインストールする。

$ gem install rails

インストールが出来たか次のコマンドで確認する。

$ rails -v

もし次のように出力されたらインストールできていない。またはshellの設定が有効になっていないので、shellの設定を読み込み直すか、shellを起動し直そう。

Rails is not currently installed on this system. To get the latest version, simply type:

    $ sudo gem install rails

You can then rerun your "rails" command.
 Posted by at 2:07 PM
4月 042012
 

Macでsshをマウントする方法は以前書いた。
Linuxでsshをマウントする方法をメモしておく。
環境はUbuntu 10.04
マウントするのにroot権限は必要ない。

まず、sshfsをインストールする。

$ sudo apt-get install sshfs

次に、マウントするディレクトリを作成し、sshサーバをマウントする。root権限はいらない。

$ mkdir mnt
$ sshfs [UESR]@[IP-ADDRESS]:/path/hoge mnt/

アンマウントする場合は次のコマンド。

$ fusermount -u mnt
 Posted by at 2:07 PM
3月 082012
 

Emacs 23.4をビルドしてみるで、最新のEmacsをMacにインストールすることができた。

テキストファイルをEmacsに関連づけていると、新しいファイルをFinderなどで開く際に、新しいウインドウで次々開いてしまって不便なことがある。
Finderでテキストファイルをダブルクリックしたときに、Emacsが起動しているとそのEmacsでファイルを開いて欲しい。

それを実現するのがemacsclientだ。実はEmacs 23.4をビルドしてみるでインストールしたEmacsの中にもemacsclientが入っているのだけど、unixコマンドとなっていて、appパッケージになっていない。

そこで、Platypusを使うとunixコマンドをappパッケージにすることができるので、emacsclientをMacのアプリケーションにしてみた。

情報元はCocoa Emacs: emacsclientをAppに変換する
ただ、上記サイトの方法だと、Emacsが起動していない場合にEmacsClientで開こうとすると問題があるので、起動スクリプトを次のように変更した。

/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -n "$1" --alternate-editor /Applications/Emacs.app/Contents/MacOS/Emacs &

これで、Emacsが起動していない場合はEmacsを起動してファイルを開くことができる。

変換したアプリをあげておくので、解凍してアプリケーションにコピーすればOK。
EmacsClient.app.zip

ファイルの関連づけを変更するには、Finderで変更したいタイプのファイルを右クリックし、「情報を見る」を選択する。「このアプリケーションで開く」の項目があるので、EmacsClientを選択し、「すべてを変更」ボタンを選択する。
これで関連づけを変更することができる。

なお、emacsclientを使う場合には、serverの設定をしておかなければならない。
.emacsなどに次の設定を追加しておこう。

(require 'server)
(unless (server-running-p)
  (server-start))
 Posted by at 1:49 PM
3月 062012
 

EclipseのGitで、リモートブランチをチェックアウトすると、no branchになってしまう(事がある?)。

その状態で編集してコミットするけれど、no branchなので、そのコミットはどのブランチにも属していない。
そしてブランチを切り替えてしまうと、そのコミットはブランチに属していないので見ることができなくなってしまう。

そんな状態からの復帰方法。
$ git reflog
を実行し、失ったコミットを確認する。
コミットログから、ハッシュを確認。たとえば次のような行を探す。
5010342 HEAD@{6}: commit: 失ったコミットのコミットログですよ!

$ git master
などとし、失ったコミットを反映したい先に移動する。

$ git merge 5010342
としてマージする。

でOK!

 Posted by at 8:46 PM
2月 162012
 

日頃開発をしていると、SSH経由でサーバをいじることが多い。
そんな時、SSH経由でファイルのやりとりを行うのだけれど、面倒だしSSHをマウントするととても便利だ。

参考にしたのはHow to mount an SSH filesystem on Mac OS X Lion

まず、OSX Fuseを入れる。
これをインストールするとき、インストールするモジュールでMacFUSE Compatibility Layerにチェックを入れること。

次にMacfusionを入れる。
続いてMacfusionを起動し、接続するサーバの情報を入力し、Mountボタンを選択すると、SSHサーバをマウントすることができる。マウントできない場合はMacfusionのメニューからログを表示してエラーを確認しよう。

 Posted by at 3:07 PM
2月 082012
 

MacでEmacsはCarbon Emacsを使っていたけれど、バグがあったり機能が古かったりで、最新のEmacsに移行してみる。
最新のMac用EmacsのバイナリはGNU Emacs for Mac OS Xにあったりするのだけれど、日本語用のパッチが当たっていなかったりするので、自分でビルドする必要があるようだ。

ビルドの方法は次のサイトを参考にした。
Build Emacs 23.4 on Mac OS X Lion

めんどくさいかなぁと思っていたけれど、割とさくっとビルドすることができた。
ほかの環境でビルドするのがめんどくさいので、ビルドしたバイナリをあげておく。
日本語パッチ済みEmacs 23.4

3/8追記
当てたパッチを公開していないのはGPL違反との指摘があったので、パッチをアップしておく。
当てたパッチは参照したサイトに公開されているが、リンク切れ防止のためにも自サーバにアップしておいた。。
emacs-23-lion-fullscreen-test.patch
emacs-inline.patch
fix-shiftmodifier-with-ime.patch
menubar.patch

 Posted by at 10:42 AM