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')
あと、はてな記法はこのまま CoffeeScript や Haml に対応しないままなんですかね。
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 の勢いはとどまるところを知らないッ!というわけで、これらをサクッっとインストールするためのスクリプトを書いた。
CoffeeScript を GitHub から入れる 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 アドレスを指定する。接続元を限定することにより、よりセキュアな環境を構築することができる。