Mac Leopardにnode-v0.8.1.pkgで入れたnodeをアンインストールする

先日nodeの安定版0.8.0がリリースされた*1ので、nvmで入れようとしたけどエラーで入らない。Leopardがもう古いので、サポート対象外かも*2しれないけど、試しにMacintoshインストーラのnode-v0.8.1.pkgを使って入れてみました。これは、すんなり入ったのはいいんだけど/usr/local/bin/nodeにしか入れることが出来ない作りだったので、インストールが出来ることだけ確認して消すことにしました。しかし、困ったことに、nodeのpkgインストーラーは、アンインストール手段を提供してないらしく、どうにか手動で取り除く方法を探しました。

解決策

[注意]sudo rmするコマンドをwhileで回すという、間違えたら怖いコマンドです。

自分自身、後述するstackoverflowにあったコマンドを、ほぼそのまま、あまり意味もわからず実行しているので、安全の保証は出来ません。
コマンドもsudo rm /usr/local/${i}のところをls ${i}にして、while文がちゃんと動くかや、何が消されるのかを確認したりしました。
下記のコマンドを何も考えずにコピーペーストするのは、とても危ないです。

lsbom -f -l -s -pf /Library/Receipts/boms/org.nodejs.pkg.bom \
| while read i; do
  sudo rm /usr/local/${i}
done
sudo rm -rf /usr/local/lib/node \
     /usr/local/lib/node_modules \
     /var/db/receipts/org.nodejs.*

注意のところでも触れてるけど、見つけた方法を深追いせずに実行したのでこれで全部消せたかどうかも、ちゃんと把握はしてないです。ただ、どうやらMacではpkgのインストール情報が残っていてlsbomで取得できるっぽいというだけ。

stackoverflow

lsbom -f -l -s -pf /var/db/receipts/org.nodejs.pkg.bom \
| while read i; do
  sudo rm /usr/local/${i}
done
sudo rm -rf /usr/local/lib/node \
     /usr/local/lib/node_modules \
     /var/db/receipts/org.nodejs.*
node.js - How do I uninstall nodejs installed from pkg (Mac OS X)? - Stack Overflow

見つけたstackoverflowだけどorg.nodejs.pkg.bomの場所が違います。自分のMacではこの場所にはなく、色々探した結果/Library/Receipts/boms/org.nodejs.pkg.bomに見つけました。

環境

Mac Mac OS X 10.5.8(Leopard

*1:すぐに0.8.1が出たけど

*2:System Requirementsを探してみたけど、見つからなかった。

Debianでのalternativesで切り替えられるパッケージはDebian Policyで確認できるっぽい

[Those marked with a (*) are handled using the alternatives mechanism;
others may do so as well.]

http://www.debian.org/doc/packaging-manuals/virtual-package-names-list.txt

Debianだと、alternativesで切り替えられるものは、このバーチャルパッケージの一覧に書いてあるらしい。(*)の付いてるのがそうらしいけど、「others may do so as well.」とあるから、結局ほとんどがそうなのかな?(*)付きがalternativesに確実対応で、それ以外は多分対応みたいな感じだろうか。

見かけたとこ

> > $ update-alternatives --display x-terminal-emulator
> > x-terminal-emulator -状態は auto。
> > リンクは現在 /usr/bin/mlterm を指しています
> > /usr/bin/mlterm - 優先度 20
> > スレーブ x-terminal-emulator.1.gz: /usr/share/man/man1/mlterm.1.gz
> > 現在の `最適' バージョンは /usr/bin/mlterm です。
>
> 一番の疑問は、x-terminal-emulator というものがあるということをどのように
> 知ることができるか、なんですが、x-terminal-emulator から選ぶ、ということ
> はせず、xterm が動いたのでよしとしました。

Debian Policy マニュアルに掲載されています。

apt-get install debian-policy
で、
/usr/share/doc/debian-policy/virtual-package-names-list.txt.gz
を見れば書いてあります。

各種Debian独自の設定のうち、ひろく使われているものについては順次
policy として文書化されています。

[debian-users:49016] Re: [Q] Xのインストール

別のことを調べてる際、たまたまこれを見つけて知りました。これだと、x-terminal-emulatorupdate-alternativesで確認して、切り替えできるよう設定があるらしいのが分かるけど、virtual-package-names-listでは(*)付いてない。
ところでalternativesupdate-alternatives同じコマンドらしいけど、何で別にあるんだろう。

ほかのディストリビュージョンの情報もないかな?

こういうのって他のディストリビュージョンではどこに書いてあるんだろう?書いてあるドキュメントがあるのかもわからないけど。

書いた日

2011-09-14

jQueryのIE6のバグを報告したら有名なIE6のバグと言われた件

個人的にはIE6なんてもう対応する気もないんだけど、そういう分けにもいかずハマったので、検証コードを書いてみた。それでも再現するので、これはjQueryのバグかと思い報告してみたら(closed bug: cantfix)を頂きました。

This is a well-known issue with IE6 being unable to update options, and can be fixed with setTimeout or one of the solutions suggested in the links below:

#11564 ($('option').attr('selected', true) does not work on IE6) – jQuery - Bug Tracker

well-known issueという事で、割と知られてるIE6のバグ?みたい。検証コードでも再現したからといって、すぐにバグ報告しないでフォーラムにまず書くべきだったかもなぁ。

ちなみに、ブログに書くのがおっくうで、報告したのはもう3ヶ月も前みたいです。

内容

jQuery+IE6の組み合わせで、JavaScriptエラーが発生します。

<form id="foo">
    <select name="foo">
    </select>
    <button>run</button>
</form>
http://jsfiddle.net/dmethvin/SVTUm/

option要素はjQueryで組み立てるつもりで、option要素を持たないselect要素をhtmlに書いてます。

$(function(){
    $('button').click(function(e){
        e.preventDefault();
        var $select = $(this.form).find("select").empty();
        var array = ['ein', 'zwei', 'drei'];
        for( var i=0; i<array.length; i++ ){
            var $option = $('<option>');
            $option.val('').text(array[i]);
            $select.prepend($option);
        }
        $select.children(':first').prop('selected', true);
    });
});&#8203;
http://jsfiddle.net/dmethvin/SVTUm/

そしてjQueryでoption要素をいくつか追加し、どれかをselectedにしようとすると・・・IE6限定でJavaScriptエラーが発生します。>=IE7*1やその他のモダンブラウザでは発生してません。

解決方法

$(function(){
    $('button').click(function(e){
        e.preventDefault();
        var $select = $(this.form).find("select").empty();
        var array = ['ein', 'zwei', 'drei'];
        for( var i=0; i<array.length; i++ ){
            var $option = $('<option>');
            $option.val('').text(array[i]);
            $select.prepend($option);
        }
        setTimeout( function() {
          $select.children(':first').prop('selected', true);
        }, 1);
    });
});&#8203;
http://jsfiddle.net/dmethvin/SVTUm/1/

setTimeout()で非同期処理にすると回避できるようです。

Because it is a timing issue it can't be fixed within jQuery core without introducing even more issues (e.g., what if other things run before we select the option in the timeout?)

#11564 ($('option').attr('selected', true) does not work on IE6) – jQuery - Bug Tracker

英文読解力が足りずに、意図を完全に汲み取れてないんですが、これはタイミングの問題らしい。提示されたstack over flowも読んでみると、JavaScriptで生成した要素にJavaScriptがアクセスする場合の、生成とアクセスのタイミングの事を言ってるような気がしました。

補足
<form id="bar">
    <select name="bar">
    <option value="">dummy</option>
    </select>
    <button>run</button>
</form>&#8203;
http://jsfiddle.net/dmethvin/SVTUm/

option要素を最初から入れておけば、たとえそれを$().empty()で消して、改めてoption要素を積んだとしても、エラーは発生しませんでした。

jsdo.it

Test case for an error of $('option').attr('selected', true) only on IE6 - jsdo.it - Share JavaScript, HTML5 and CSS

さっきからJSFiddleからばかり貼ってるけど、最初はjsdo.itで検証コード書いてたんだよね。

The site jsdo.it does not work for me in IE6. This JSFiddle reproduces the issue:

#11564 ($('option').attr('selected', true) does not work on IE6) – jQuery - Bug Tracker

jsdo.itって、UI英語にしてるし海外でもそこそこ使われてるのかなーとか思ったんだけど、「動かないからJSFiddleで作りなおした」って言われてしまいました。

http://jsfiddle.net/dmethvin/SVTUm/
http://jsfiddle.net/dmethvin/SVTUm/1/

確かにこのJSFiddleは、Saveする度にURLが発行されて、ちょっとしたバージョン管理みたいな感じになってて便利そう。今回の、動かないコードと、直したコードもスッキリとしてるし。ただ、まちがってSaveしちゃっても、URLのカウントアップは取り消せないみたい。

環境

jQuery 1.7.0 1.7.1 1.7.2*2

*1:IE7とそれ以上

*2:試したのは1.7系だけだけど、cantfixなので全バージョンで発生するんだろうと思う。

rbenvとruby-buildとbundlerでRuby環境構築のメモ

GitHub - rbenv/rbenv: Groom your app’s Ruby environmentを使ってRuby環境を構築しました。Rubyは実質初めてなので、二の足を踏んだりよく分からず調べてばかりで、なかなか先に進まなかったりもしたけど、ようやく基本的な要素を把握出来た感じ。そんななので、細かく書きすぎてて若干くどいかもしれない。

rbenvのインストール

$ cd ~
$ git clone git://github.com/sstephenson/rbenv.git .rbenv

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

rbenv自体はこれでインストール完了。
ここで、Terminalを開きなおす等して、.barhrcを読み込ませる。

ruby-buildのインストール

$ ./configure --prefix=$HOME/.rbenv/versions/1.9.2-p290
$ make
$ make install
GitHub - rbenv/rbenv: Groom your app’s Ruby environment

ここにも書いてある様に、rbenvは切り替える機能は提供するけど、Rubyのインストールは自分で・・・というのは面倒なので、ruby-buildというプラグインを入れると、PerlbrewやPythonbrewのようにインストールも出来るようになります。

$ mkdir -p ~/.rbenv/plugins
$ cd ~/.rbenv/plugins
$ git clone git://github.com/sstephenson/ruby-build.git

pluginsディレクトリに配置するだけ。
他にもGitHub - rbenv/rbenv-vars: An rbenv plugin that safely sets global and per-project environment variablesというプラグインもあるみたいだけど、必要になったら考えます。

$ rbenv install
usage: rbenv install VERSION
       rbenv install /path/to/definition

Available versions:
  1.8.6-p383
  1.8.6-p420
[以下略]

$ rbenv install 1.9.2-p320
$ rbenv install 1.9.3-p194
$ rbenv rehash

何も指定しなければ利用可能なバージョンが一覧に出て、バージョンを指定すればインストールが始まります。

Rehash rbenv shims (run this after installing binaries)

新しくRubyをインストールしたらrbenv rehashするものらしいです。何の効果があるのか、なんとなく想像はつくんですが、忘れててもちゃんと動いてる様な気も・・・。まぁちゃんと分かってないです。ruby-buildからのインストールなら、内部で実行済みなのかもしれない。

gemコマンド

$ gem --version
1.8.23
$ gem update --system
$ gem --version
1.8.24

RubyをインストールするとRubygemsも入ってます。バージョンが古い場合があるから、更新しておく。--systemを付けるとRubygems本体を更新する。systemって書かれると、OSに関わりのあるものを変えたりしそうな印象あるけど、selfとかじゃダメだったんだろうか。

$ gem install bundler

Ruby環境構築のエントリーで大抵最初に入れろと書かれてるBundler。詳しくは下記で。gemコマンドはBundlerを入れたたら、もうあまり使う事はないかも。

Bundler

Gem Bundler – Manage your Ruby gemsは、どうも知ってる前提でBundlerとは何かを書いてるエントリーが中々見つけられず、何となく分かるけど正確にはよく分からないやつって印象だった、自分の中でのちょっとした難所でした。

Bundlerとは

Gemfileというファイルに、使いたいgemを定義しておいてbundle installすると、そのgemが一括インストールされるというもの。その際bundle install --path vendor/bundleとオプションを指定すると./vendor/bundle/にgemをインストールできる。プロジェクト毎に使うgemを分けてインストールできるというもの。

bundle installだけでインストールすると、rbenvで入れたRubyなら例えば.rbenv/versions/1.9.2-p320/lib/ruby/gems/1.9.1/gems/にインストールされる。gemコマンドを使った場合も同様。これだと、同じgemだけど最新でも良いアプリと、ちょっと古いバージョンに依存したアプリを使ったり開発したりするのに困ってしまう。

このデフォルトのインストール先は$GEM_HOMEらしいけど、$GEM_HOMEにはBundlerだけ入れておいて、アプリやプロジェクト毎にbundleコマンドで必要なgemを持たせるというのがbundleの使い方らしい。

自分で作っているのも、Gemfileを書いてbundle install --path vendor/bundleして作り、そのままそのGemfileを含めて公開すれば、アプリを使う側も依存するgemをbundle install --path vendor/bundleで一括インストール出来て便利という事みたい。

使い方ざっくり

$ mkdir myapp;cd myapp
$ bundle init
Writing new Gemfile to /Users/myuser/Dev/myapp/Gemfile
$ vi Gemfile
# A sample Gemfile                                                                                  
source "https://rubygems.org"

# gem "rails"

雛形を作るbundle init

# A sample Gemfile                                                                                  
source "http://rubygems.org"

gem "rails"
gem "foo", "1.2.3"
gem "bar", ">=1.2.3"

どうもhttpsだと証明書の検証が通らない問題が出ているらしい。

$ bundle install --path vendor/bundle

どうやらvendor/bundle*1が推奨される置き場所らしい。

毎回 --path vendor/bundle書くのメンドクサイ
path "vendor/bundle"

Gemfileにこれ書いておけばbundle installでも./vendor/bundle/に入りました。これなら楽になりそう。これを書いてるエントリーが全然なくて、試しにやってみたら出来たんだけど、インストール先を強制するGemfileを同梱してアプリを配布しにくいからとかなのかな?

The path `/Users/myuser/Dev/myproject/vendor/bundle` does not exist.

./vendor/bundle/が存在しないと入れられませんでした。 --path vendor/bundleの方はディレクトリ作成もしてくれるんですよねぇ・・・

Gemfileを書く

Gem Bundler – Manage your Ruby gemsは中々分かりにくいのでhttp://www.milligramme.cc/wp/archives/3475とかが分かりやすいかも。

rbenvについてもうちょっと細かく

$ type ruby
ruby is /Users/myuser/.rbenv/shims/ruby

rbenvが動いているとrubyが変わったパスになってます。ファイルパスからはシステムRubyでもないし、rbenvで入れたRubyでもない様子。

$ ruby --version
ruby 1.8.7 (2010-08-16 patchlevel 302) [i686-darwin9]

どうやら実態はシステムRuby

$ rbenv global 1.9.2-p320
$ type ruby
ruby is /Users/myuser/.rbenv/shims/ruby
$ ruby --version
ruby 1.9.2p320 (2012-04-20 revision 35421) [i386-darwin9.8.0]

rbenvを通して使うRubyを設定すると、実際に動くRubyが変わる仕組みらしい。

global Set or show the global Ruby version
local Set or show the local directory-specific Ruby version
shell Set or show the shell-specific Ruby version

指定の方法は3つ。

$ rbenv local 1.9.2-p320
$ cat .rbenv-version
1.9.2-p320

globalとshellは良いとして、localがちょっと特殊です。実行したディレクトリに.rbenv-versionを作って、そこにRubyのバージョンが書いてあります。このファイルがあるディレクトリ内は、そのRubyが使われるというもの。

環境

rbenv 0.3.0

*1:Bundleのドキュメントにvendor/bundleとあったので、このエントリーでもvendor/bundlerからvendor/bundleに変更しました

aliasってcronやシェルスクリプト等からは基本使えないらしい

Vimで書いたコードを直ぐ実行できるquickrun.vimプラグインを導入してみた - kanonjiの日記で入れたquickrunでphpを実行する際に、MAMPphpを使いたかったんですがaliasで設定したら動かなくてちょっとはまりました。どうやらaliasの設定は、基本的にコマンドラインの対話シェル中じゃないと使えないみたいです。

状況

  1. php 5.3から使える様になった無名関数を含んだphpを書いてquickrunで実行したら、5.2系の/usr/bin/phpで処理されてエラー。
  2. alias php='/Applications/MAMP/bin/php5.3/bin/php'を設定するもquickrunで実行すると、同じくエラー。
  3. export PATH=/Applications/MAMP/bin/php5.3/bin:$PATHしてquickrunで実行したら、動作した。

補足

expand_aliasesを使ったりして、シェルスクリプト内でaliasを使う方法もあるっぽいけど、基本的に使えないものと考えた方が良いのかも。Linux/UNIXもそれなりに使ってるけど、細かいとこや深いとこは、こういう風に問題に当たらないと意識もしないし、知らない事多いなぁ。一度体系的に学んでみたい。

環境

Mac Mac OS X 10.5.8(Leopard
default php 5.2.15 (cli) (built: May 5 2011 18:56:00)
MAMP 1.9.6
MAMP php 5.3.5 (cli) (built: Feb 15 2011 16:55:30)

書いた時期

2012-02-15

Gitとプロンプト変数PS1とbash_completionと

開発環境がまだMacになってきたので、プロンプトとかbash_completionとか、だんだん分かってきたbashの細かいとこをちゃんと設定してみた。

成果

見やすいプロンプト。特にgitの状態
myuser@host ~/dev/foo (bar-branch)
$ git rebase -i HEAD^^
myuser@host ~/dev/foo (bar-branch|REBASE-i)
$

ここじゃ再現できないけど色も付いてます。

gitコマンドの補完(gitに限った機能じゃないけど
$ git c[tab][tab]
checkout           cherry-pick        clean              commit             credential-cache
cherry             citool             clone              config             credential-store

設定方法

$ sudo port install bash-completion

まずMacPortsbash-completionを入れる。

$ vim .profile #.bash_profile や .bashrcでも環境に合わせて
if [ -f /opt/local/etc/bash_completion ]; then
    . /opt/local/etc/bash_completion
fi

これが読み込まれた時点で、/opt/local/etc/bash_completion.d/*にある色んなコマンドの補完が出来るようになる。MacPortsportとか。

$ sudo port install git-core +svn +bash_completion

variantsでbash_completionを指定する。svnはお好みで。
この時点で/opt/local/etc/bash_completion.d/gitが出来て、前述のbash_completionが読み込んでくれるので、gitコマンドの補完が働きます。

gitのwork tree内でブランチ情報を出す
$ vim .profile #.bash_profile や .bashrcでも環境に合わせて
# bash_completion.d/git
if [ -f $BASH_COMPLETION_DIR/git ]; then
    export PS1='\[\033[01;32m\]\u@\h\[\033[01;33m\] \w$(__git_ps1) \n\[\033[01;34m\]\$\[\033[00m\] '
else
    export PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$ '
fi

これを読み込むと、プロンプトが最初に書いた様な感じに変わります。この設定は、Cygwinのデフォルト+どこかで見つけたgitのブランチを表示する設定です。Cygwinに設定した時メモしなかったせいで、どこで見つけたのか分からなくなっちゃいました。

Cygwinに設定した際に参考にしたエントリーを見つけました。参考にというか、そっくりそのままだった。Gitブランチ名を__git_ps1でbashプロンプトに表示 - 130単位

すでにgit-coreが入ってる場合 #1

variantsを変えてインストールしようにも、MacPortsはインストール済みをインストールする事が出来ない。git-coreなんて消そうとすると依存関係で色々消えてしまうということで、現実的じゃなくめんどくさい。

$ sudo ln -s /opt/local/share/doc/git-core/contrib/completion/git-completion.bash /opt/local/etc/bash_completion.d/git

補完用スクリプト自体はあるので、シンボリックリンクを作れば+bash_completionを指定出来てなくても補完もブランチ情報も出来ます。

すでにgit-coreが入ってる場合 #2

$ sudo port deactivate curl @7.19.4_0
$ sudo port install curl +ssl
$ sudo port uninstall curl @7.19.4_0

富士山は世界遺産

deactivateすればvariants違いを入れることが可能らしい。自分はこれをやってないので、7.19.4_0をdeactivateして、+sslな7.19.4_0を入れた場合、アンインストールして両方消えたりしないのかなとか、ちょっと疑問はあるけど。
他にも依存関係とかおかしくならないのかとか、心配になる点はあるので、何かあってもなんとか出来るならやってみてもいいかも。

環境

Mac Mac OS X 10.7.4(Lion)
git-core @1.7.10.4_0
bash-completion @1.3_6

どうやら古いquickrunを使っていたらしい事に気がついた

Vimで書いたコードを直ぐ実行できるquickrun.vimプラグインを導入してみた - kanonjiの日記で使い始めたquickrun.vimは、実は2年も前にメンテが止まってるやつでした。たまたま、quickrunについて調べててリポジトリが2つある事に気がつきました。それをTwitterに書いてみたら、片方は古いやつだと教えてもらい・・・一応自分が導入してる方を確認してみると、案の定古い方でしたとさ。新しい方に入れ替えたら、調べてたトラブルも解決するという。

古い方で、今まで使ってたやつ

GitHub - ujihisa/quickrun: quick vim quick

良く見ると、HEADのコミットが2 years agoでした。

quickrun.vimには2種類あるみたいでujihisaさんが作ったquickrun.vimとthincaさんが作ったvim-quickrunがあるみたい。で、ujihisaさんの昨日はthincaさんのvim-quickrunに取り込まれてるらしいので、vim-quickrunを使えば良いみたいです。

The net is vast: vim-quickrunを使って高速開発

そしてこういう事らしく、Twitterでも巷でquickrunといえばvim-quickrunの方って教えてもらいました。

もしVimで書いたコードを直ぐ実行できるquickrun.vimプラグインを導入してみた - kanonjiの日記VimのPythonインターフェースから使うpythonは変更しにくくPYTHONPATHもちょっと違う - kanonjiの日記を見てquickrun.vimを導入したって人が居たら、すっごい申し訳ないです。

余談

古い方のquickrun.vimMacで使っていると、JDK6からrhinoが同梱された事で、JavaScriptrhinoで実行されます。node.jsを入れていても古い方だとrhinoが優先されちゃうみたいなので、困りました。でも、これで調べ始めて、この事に気がついたんだけどね。

$ ls -l /usr/bin/jrunscript 
lrwxr-xr-x  1 root  wheel  80  6 14 18:39 /usr/bin/jrunscript -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/jrunscript