D.

Asset Pipeline でまとまった JS から必要な処理だけ呼び出す。

Rails 3.1 から Asset Pipeline で JS がひとつに纏められて全部読み込まれるから対策が必要だよねという話。
http://text.ssig33.com/81


色々やり方があるが、おそらく現状では JS の URL Dispatcher とか Router で分岐するのが正解なのだろう。
http://aligach.net/diary/20110306.html


リンク先の記事では jQuery Router が紹介されている。早速 js2coffee で CoffeeScript 化して assets/javascript に置こうとしたが、よく考えてみると分岐を書いたコードより Router 本体が先に読まれないと正常に動作しない。 Asset Pipeline で読み込み順を制御する方法があれば誰か教えてください。


(12/28 追記)
application.js のコメントで読み込み順を制御でき Rails.application.config.assets.paths でロードパスを確認できるようだ。
http://ja.asciicasts.com/episodes/279-understanding-the-asset-pipeline



そんなわけで現状はこうしている。

Haml
- title 'ほげ新規作成画面'

.hoges-new-page
  hogehoge
CoffeeScript
hoge_function = () ->
  ...

$ ->
  if $('.hoges-new-page').is(':visible')
    hoge_function()

小規模なアプリケーションならこれで良いかという感じ。 Haml のタグを命名規則で縛る必要があるのが少しダルい。


(2012/1/10 追記)
layout/application.html.haml 等で以下のようにするのが良さげ。

%body(class='#{controller_name}-#{action_name}-page')


あと、はてな記法はこのまま CoffeeScriptHaml に対応しないままなんですかね。

CoffeeScript で URL パラメータと値を取得する。

/hoge/new?key=value&hoge=fuga みたいな URL パラメータと値を取得したい。

get_url_param = () ->
  v = []
  hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&')
  for hash in hashes
     h = hash.split('=')
     v.push(h[0])
     v[h[0]] = h[1]
  alert v.key # value が取れるのであとは適当に利用

$ ->
  if $('.hoge-new-page').is(':visible')
    get_url_param()

参考 (jQuery でのやりかた)

Get URL parameters & values with jQuery
http://jquery-howto.blogspot.com/2009/09/get-url-parameters-values-with-jquery.html


CoffeeScript で書いている人がいるかと思って軽く検索したけど見つからなかったので書き残しておく。あと、はてなダイアリースーパー pre 記法って CoffeeScript には対応していないんですかね。

Node.js と CoffeeScript を入れる。

サーバーサイド JavaScript の Node.js と、その JavaScript にトランスコンパイルされる新しいプログラミング言語 CoffeeScript の勢いはとどまるところを知らないッ!というわけで、これらをサクッっとインストールするためのスクリプトを書いた。


CoffeeScriptGitHub から入れる install_coffee.sh (Node.js が予め必要)

setup_environment() {
    test -n "$2" || SUDO=sudo
    test -n "$2" && SUDO=
}

gitpull() {
    echo "Pulling $1 $3"
    if [ -d $HOME/local/$1/$3 ]; then
        cd $HOME/local/$1/$3
        git pull
    else
        cd $HOME/local/$1
        git clone git://github.com/$2/$3.git
    fi
    test -L $HOME/$3 && rm $HOME/$3
    ln -fs $HOME/local/$1/$3 $HOME/$3
}

gitpull_all() {
    test -d $HOME/local/github || mkdir -p $HOME/local/github
    gitpull github jashkenas coffee-script
}

make_and_install_coffee() {
    $SUDO bin/cake install
}

install_coffee() {
    test -d $HOME/local/github/coffee-script || exit 1
    cd $HOME/local/github/coffee-script
    make_and_install_coffee $*
}

main() {
    setup_environment $*
    gitpull_all
    install_coffee $*
    coffee -v
}

main $*


Node.js と npm を入れる install_nodejs.sh

setup_environment() {
    test -n "$1" || VERSION=0.6.8
    test -n "$1" && VERSION=$1
    NODE=node-v$VERSION
}

save_sources() {
    sudo mkdir -p /usr/local/src/node.js
    sudo cp -av $NODE /usr/local/src/node.js
    sudo chown -R root:root /usr/local/src/node.js
}

install_npm() {
    sudo sh -c 'curl http://npmjs.org/install.sh | sh'
}

install_node() {
    setup_environment $*

    mkdir install_node
    cd install_node

    wget http://nodejs.org/dist/v$VERSION/$NODE.tar.gz
    tar xzvf $NODE.tar.gz
    cd $NODE
    ./configure
    make
    sudo make install
    cd ..
    test -n "$2" || save_sources
    cd ..
    rm -rf install_node
    install_npm $*
}

install_node $*
追記 (2012/1/26)

ついでに npm なパッケージをまとめて入れる install_npm.sh

install_npm() {
    test -n "$1" && export NPM=$1/bin/npm
    test -n "$1" || export NPM=npm
    sudo $NPM install js2coffee -g
    sudo $NPM install mysql -g
    sudo $NPM install express -g
    sudo $NPM install ejs -g
}

install_npm $*

Ubuntu で古いカーネルを破棄する

Ubuntu でアップデートを繰り返すと、古いカーネルがたまってきて Grub2 のブートセレクタが埋め尽くされディスク容量も無駄に占有してしまう。手作業で古いカーネルを削除しても良いのだが面倒だしミスが怖い。そこで現在のカーネル以外を一括で消去するスクリプトを書いた。

#!/bin/sh

CURKERNEL=$(uname -r|sed 's/-*[a-z]//g'|sed 's/-386//g')
LINUXPKG="linux-(image|headers|ubuntu-modules|restricted-modules)"
METALINUXPKG="linux-(image|headers|restricted-modules)-(generic|i386|server|common|rt|xen)"
OLDKERNELS=$(dpkg -l|awk '{print $2}'|grep -E $LINUXPKG |grep -vE $METALINUXPKG|grep -v $CURKERNEL)

sudo aptitude purge $OLDKERNELS

ただしバックポートカーネルを適用している場合は上手く行かない。それ以外の通常の利用であれば現バージョン以外のカーネルを綺麗に抹消できる。

RedHat/CentOS で古いカーネルを破棄する

yum -y update を発行してカーネルを更新した場合、古いカーネルを破棄しないとディスク容量をどんどん占有していくので package-cleanup --oldkernels でクリーンアップする必要がある。

$ df -T -h
Filesystem    Type  サイズ  使用  残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
              ext3    992M  685M  257M  73% /
...
/dev/hda1     ext3     99M   33M   61M  35% /boot

$ sudo package-cleanup -y --oldkernels
Setting up yum
I will remove the following 3 kernel related packages:
kernel-2.6.18-238.12.1.el5
kernel-2.6.18-238.el5
kernel-devel-2.6.18-238.12.1.el5

$ df -T -h
Filesystem    Type  サイズ  使用  残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
              ext3    992M  483M  458M  52% /
...
/dev/hda1     ext3     99M   20M   75M  21% /boot


Hyper-V などの仮想化環境のゲストとして稼働している場合、カーネルの変更後に再起動すると Mac アドレスが変化する場合がある。したがって Mac アドレスの静的な指定は避けたほうが良い。

$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
BROADCAST=172.16.xx.xxx
#HWADDR=XX:XX:XX:XX:XX:XX ← コメントアウトして無効にする
IPADDR=172.16.xx.xxx
NETMASK=255.255.255.0
NETWORK=172.16.xx.0
ONBOOT=yes

Mac で git 等を利用する際に UTF-8-MAC 問題を解決する方法。

Mac で主に git などを利用すると、日本語の濁音ファイル名がおかしくなる問題がある。通称 UTF-8-MAC 問題という。詳細は以下を参照のこと。

対策

いろいろ解決方法は考えられるのだが、ここでお手軽な方法を紹介する。


まず SSH で接続可能な Linux サーバーを適当に用意する。さくら VPS でも Amazon EC2 でも自宅サーバーでも何でも良い。


次に Macfusion をインストールする。これは Mac で利用できる sshfs クライアントである。
http://www23.atwiki.jp/selflearn/pages/55.html

あとは、この Macfusion で Linux サーバーのファイルシステムをマウントする。ここに git clone すれば良い。

実例

Windows のショートカットを git に突っ込んだリポジトリがあったので、それを利用して試しに実験。まずは Mac で git clone してみた。


同様のファイルを Linux のターミナルから見たのがこちら。日本語ファイル名に問題が無いことがわかると思う。

おまけ

Subversion の場合、パッチを当てればネイティブで解決するらしい。
http://www23.atwiki.jp/selflearn/pages/55.html


ただ自前でビルドするのも面倒だし、なんでもかんでもすべて sshfs でマウントして解決するのがラクだと思う。最初からファイルがリモートにあれば Dropbox すら要らない。

svn+ssh は利用できるが対話的なログインはできないユーザーを作成する。

svn+ssh は安全に svn を利用する方法のひとつとして広く知られている。このとき、対話的な ssh ログインを許可しておくと、そのユーザーアカウントの権限内でシステム内部を参照されてしまうことになる。単に svn サービスを他者に提供する場合、最小権限の法則に従い svn は利用できるが対話的なログインは不可能とするユーザーを作成するのが基本である。そこで、この方法を説明する。


公開鍵の登録ファイル ~/.ssh/authroized_keys の内容を編集し、冒頭に以下の文字列を追加する。

command="/usr/bin/svnserve -t",from="xxx.xxx.xxx.xxx",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAA... (略)

command="/usr/bin/svnserve -t" によりサーバーサイドで起動できるコマンドを svnserve に限定する。これによりシェルの起動が不可能となり、対話的な ssh ログインができなくなる。
from="xxx.xxx.xxx.xxx" にはクライアントのドメイン名 (ワイルドカード可) もしくは IP アドレスを指定する。接続元を限定することにより、よりセキュアな環境を構築することができる。