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
に見つけました。
Debianでのalternativesで切り替えられるパッケージはDebian Policyで確認できるっぽい
[Those marked with a (*) are handled using the alternatives mechanism;
http://www.debian.org/doc/packaging-manuals/virtual-package-names-list.txt
others may do so as well.]
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独自の設定のうち、ひろく使われているものについては順次
[debian-users:49016] Re: [Q] Xのインストール
policy として文書化されています。
別のことを調べてる際、たまたまこれを見つけて知りました。これだと、x-terminal-emulator
をupdate-alternatives
で確認して、切り替えできるよう設定があるらしいのが分かるけど、virtual-package-names-listでは(*)付いてない。
ところでalternatives
とupdate-alternatives
同じコマンドらしいけど、何で別にあるんだろう。
ほかのディストリビュージョンの情報もないかな?
こういうのって他のディストリビュージョンではどこに書いてあるんだろう?書いてあるドキュメントがあるのかもわからないけど。
リンク
http://www.debian.org/doc/debian-policy/ch-binary.html#s-virtual_pkg
http://www.debian.org/doc/packaging-manuals/virtual-package-names-list.txt
書いた日
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); }); });​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); }); });​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>​http://jsfiddle.net/dmethvin/SVTUm/
option要素を最初から入れておけば、たとえそれを$().empty()
で消して、改めてoption要素を積んだとしても、エラーは発生しませんでした。
jsdo.it
さっきから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のカウントアップは取り消せないみたい。
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 installGitHub - 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を実行する際に、MAMPのphpを使いたかったんですがalias
で設定したら動かなくてちょっとはまりました。どうやらalias
の設定は、基本的にコマンドラインの対話シェル中じゃないと使えないみたいです。
状況
補足
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
まずMacPortsでbash-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/*
にある色んなコマンドの補完が出来るようになる。MacPortsのport
とか。
$ 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を入れた場合、アンインストールして両方消えたりしないのかなとか、ちょっと疑問はあるけど。
他にも依存関係とかおかしくならないのかとか、心配になる点はあるので、何かあってもなんとか出来るならやってみてもいいかも。
どうやら古い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.vimをMacで使っていると、JDK6からrhinoが同梱された事で、JavaScriptがrhinoで実行されます。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