2011年3月31日木曜日

最近のOSでsubversion1.4.xがコンパイルしたい

■概要

ubuntu 10.4等最近のOSで、subversion1.4.xをconfigure => make => make install しようとするとconfigureの段階で問題が発生します。

$ tar zxvf subversion-1.4.6.tar.gz 
$ cd subversion-1.4.6
$ ./autogen.sh
...
configure.in:146: warning: LTOPTIONS_VERSION is m4_require'd but not m4_defun'd
build/libtool.m4:67: LT_INIT is expanded from...
build/libtool.m4:102: AC_PROG_LIBTOOL is expanded from...
configure.in:146: the top level
configure.in:146: warning: LTSUGAR_VERSION is m4_require'd but not m4_defun'd
configure.in:146: warning: LTVERSION_VERSION is m4_require'd but not m4_defun'd
configure.in:146: warning: LTOBSOLETE_VERSION is m4_require'd but not m4_defun'd
Creating configure...
configure.in:146: warning: LTOPTIONS_VERSION is m4_require'd but not m4_defun'd
build/libtool.m4:67: LT_INIT is expanded from...
build/libtool.m4:102: AC_PROG_LIBTOOL is expanded from...
configure.in:146: the top level
configure.in:146: warning: LTSUGAR_VERSION is m4_require'd but not m4_defun'd
configure.in:146: warning: LTVERSION_VERSION is m4_require'd but not m4_defun'd
configure.in:146: warning: LTOBSOLETE_VERSION is m4_require'd but not m4_defun'd
configure:5904: error: possibly undefined macro: m4_ifval
      If this token and others are legitimate, please use m4_pattern_allow.
      See the Autoconf documentation.
configure:8391: error: possibly undefined macro: _LT_SET_OPTIONS
configure:8391: error: possibly undefined macro: LT_INIT
...

どうもlibtoolの変更に伴う問題みたいなので(仕方なく)調べました。

■解決方法

参考ページによると*.m4系の内容が別々のファイルに分離したのが問題っぽいので乱暴ながら一時的に一つにするといいみたいです。

$ cd /usr/share/aclocal
$ sudo cp libtool.m4 libtool.m4.org
$ sudo chmod 666 libtool.m4
$ sudo cat lt~obsolete.m4 ltoptions.m4 ltsugar.m4 ltversion.m4 >> libtool.m4

これで下記の手順でビルド&インストールできます!
$ cd subversion-1.4.6
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install

■参考ページ

https://bugs.launchpad.net/ubuntu/+source/php5/+bug/262251

2011年3月24日木曜日

javascriptでの関数内関数について

javascriptでの関数内関数について、基礎的な事が良くわかってなかったのでメモしておきます。
ruby on railsのalias_method_chain的な動きをさせたくて

function foo() {
  console.debug("foo");
}

var fooWithoutBar = foo;

foo = function() {
  console.debug("before foo");
  fooWithoutBar();
  console.debug("after foo");
}

foo();

と書きましたが、これは問題なく動きます。ところが

(function() {
  function foo() {
    console.debug("foo");
  }

  var fooWithoutBar = foo;

  foo = function() {
    console.debug("before foo");
    fooWithoutBar();
    console.debug("after foo");
  }
}());

foo(); // error

は動きません。関数内関数は、本当に関数内関数として動きます!rubyとは違いますな。。

8行目の代入がグローバルスコープ?とか考えてしまいましたが
・変数fooはローカルスコープで宣言されている(2行目)
・8行目で変数を探す際、ローカルスコープから探し始める
・ローカルスコープで発見!
・その変数に新しい関数オブジェクトを代入
という訳で、上記の即時関数の外ではfooは見えません。

ちなみに

  var fooWithoutBar = foo;
  ↓
  fooWithoutBar = foo;

とすると、即時関数外でもfooWithoutBar()は呼び出せます。代入時点ではfooWithoutBarという変数は存在しないのでグローバルスコープの変数となる為と思われます。

2011年3月23日水曜日

backbone.jsをrails3に読み込む為におまじない

■概要

backbone.jsでの開発を始める為に、簡単なgeneratorを作っておくと、うれしいかも

■手順

・新規にgeneratorを作成
$ vim lib/generators/backbone_js_generator.rb

class BackboneJsGenerator < Rails::Generators::Base
  desc "This generator downloads and installs json2.js, underscore.js, backbone.js"
  def download_json2_js
    say_status("fetching", "json2.js", :green)
    get "https://github.com/douglascrockford/JSON-js/raw/master/json2.js",
        "public/javascripts/json2.js"
  end

  def download_underscore_js
    say_status("fetching", "underscore.js", :green)
    download_via_documentcloud("underscore")
    download_via_documentcloud("underscore", "-min")
  end

  def download_backbone_js
    say_status("fetching", "backbone.js", :green)
    download_via_documentcloud("backbone")
    download_via_documentcloud("backbone", "-min")
  end

  private
  def download_via_documentcloud(product, suffix = "")
    get "http://documentcloud.github.com/#{product}/#{product}#{suffix}.js",
        "public/javascripts/#{product}#{suffix}.js"
  end

end

・generatorを起動し必要なjsをファイルを出力する
$ rails g backbone_js

・javascript_include_tag用の設定を作成
$ vim config/initializers/backbone_js.rb

module BackboneJs
  module Rails
    class Railtie < ::Rails::Railtie
      config.before_configuration do
        config.action_view.javascript_expansions[:backbone] =
          ::Rails.env.production? ? %w(json2 underscore-min backbone-min) : %w(json2 underscore backbone)
      end
    end
  end
end
こうしておけば、application.html.erbとかで <%= javascript_include_tag :backbone %> と書けます。 defaultsに混ぜても良いかもしれませんが画面によっては不要そうなので分けてみました。

■TODO
gem化(汗)

■参考
jquery-rails

rails関係でよく忘れるコマンドメモ

関連するコマンドのオプションを良く忘れるので備忘の為メモしておきます。たまに追加しよう。。

■rvm
・rvm自体を最新化する

$ rvm get head
$ rvm reload

・rvmにインストール済みの環境リストを参照する

$ rvm list

・rvmが用意してくれている環境リストを参照する

$ rvm list known

・rvmのdefault環境を覚えさせる

$ rvm --default use xxx ← 次回からは自動的に左記環境になる

■rubygems
・rubygems自体を最新化する

$ gem update --system

・riとかrdocは不要なので速くインストールしたい

$ gem install xxx --no-ri --no-rdoc

これは~/.gemrcに
gem: --no-ri --no-rdoc
って書いておく方が確実かも。