2019/08/13

nodenv を使って複数のバージョンの Node.js を管理する

プロジェクト毎に指定の Node.js のバージョンがあったり、常に最新の Node.js を使いたかったりすると、Homebrew だけで管理するのは面倒になってきます。

今回は nodenv を使って Node.js の環境を作ろうと思います。
ちなみに私は Ruby では rvm より rbenv 派。
なので nvm よりは nodenv かな、と。

環境

  • OS: macOS Mojave 10.14.6
  • zsh: 5.7.1
  • Homebrew: 2.1.9
  • Homebrew/homebrew-core (git revision 2548c; last commit 2019-08-11)
  • nodenv: 1.3.0
  • node-build: 4.6.3


インストール

  • $ brew install nodenv
  • $ nodenv init
    • eval "$(nodenv init -)"
    • を .zshrc に追加せよ、と言ってきますので追記
  • $ nodenv install 12.8.0
    • とかで好きなバージョンを指定
  • $ nodenv global 12.8.0
    • とかで通常使用するバージョンを指定できます。
  • $ nodenv local 12.7.0
    • とかで特定ディレクトリの下で使用するバージョンを指定します。
    • 具体的には .node-version というファイルが作られて、そこにバージョンが書かれる。


nodenv init をちょっと追ってみる

ちなみに zsh 上で
  • $ nodenv init -
とすると


のような設定がされることが分かります。つまり、
  • executables がある PATH を追加する
  • NODENV_SHELL の設定
  • 補完スクリプトを source
  • nodenv rehash (executables の再配置)
  • nodenv の wrapper
    • rehash と shell の両コマンドは特別扱い(eval する感じ)みたいですね
    • 興味がある人はさらに読んでみても良いかと思います。

nodenv init と shell 指定

rbenv を設定していた時に見つけたのですが、特定の shell であることを指定することもできます。
具体的には $SHELL が zsh の状態でも
  • $ nodenv init - bash
とすると

のような、bash 向けの設定が生成されます。
nodenv init - zsh と具体的に違うのは NODENV_SHELL と補完スクリプトの場所くらい。
zsh で bash の設定を読み込むなんてことはほぼ無いと思うので、 nodenv init - で問題無いと思います。


nodenv rehash

ちなみに zshrc に nodenv init - が記述される訳ですから、シェルを立ち上げる度に nodenv init - が実行されます。
気持ち程度の問題だとは思いますが、 rehash を省略するオプションがあって
  • $ nodenv init - --no-rehash zsh
とすると nodenv rehash が実行されません。

とはいえ普通はこのオプションのある無しで実行時間はほとんど変わらないです。
大量に package を入れたバージョンから新バージョンに上がった直後とかなら rehash にコストがかかるかも? 程度

とりあえず、私は .zprofile には rehash 無しの init script を書いてます。
それで、npm install -g とかしたら手で nodenv rehash を打つ、という運用をしています。

2019/06/03

utf8proc が 2.3 から East Asian Ambiguous の文字幅を 2 と判定するようになった

Homebrew でインストールできる tmux は文字幅判定の方法をいくつか持っています。
その中に utf8proc というソフトウェアに任せる、という方法があります。
しかし、その utf8proc は East Asian Ambiguous の幅を固定で 1 にするよう実装していました。
なので、自分用に patch を当てた formula を作ったりして対応していました。

ですが、utf8proc 2.3 から East Asian Ambiguous を 2 と判定する用になりました。
とりあえず自分が使っている patched 2.8 な tmux では問題無さそうなので公式の utf8proc を使うようにします。

蛇足
本当は LC_CTYPE を見て動的に判定する、という実装が理想っぽいですが流石にそこまではしてもらえないようです。

2019/02/20

zsh で c flag を指定すると .zshrc が読み込まれない

.zshrc に定義している function f を zsh -c 'f' 等で実行したいが、 f が無いとエラーが発生する。
なお、Terminal.app から起動した zsh では f は実行可能。


結論

function を .zshrc ではなく .zprofile に書いて zsh -l -c 'f' とする。(もしくは zsh -lc 'f')


zsh の -l option について

-l option は LOGIN option (man zshoptions)で、login shell として zsh を起動する。
何も指定しない場合と異なり、設定ファイルをいくつか読み込む。その中に .zprofile が含まれている。


.zprofile と .zshrc の読み込まれるタイミング

  • .zprofile: login 時に読み込まれる
  • .zshrc: terminal session が発生した時に読み込まれる
との事。つまり、 zsh -c では .zprofile も .zshrc も読み込まれない。
そこに -l を追加して .zprofile が読み込まれるようにする。そこに function を書けば良い。


環境

  • OS: macOS Sierra 10.12.6
  • zsh: 5.7.1 (x86_64-apple-darwin16.7.0)

2019/01/23

EastAsianAmbiguous の幅を2に固定した utf8proc のバージョンを 2.2.0 に上げた

さて、今私が使っている tmux は

ようにしています。
が、 utf8proc 側の更新は何気に初ですね。


How to version up

brew で tap 済みなら
  • $ brew upgrade
で終わりです。丁寧に再インストールするのなら
  • $ brew uninstall utf8proc
  • $ brew install atton/customs/utf8proc
でしょうか。便利。


脱線: 楽をするための苦労の話

brew で install できるようにするまでで一番面倒だったのが環境構築。
なのですが、関連ファイルの生成は結構面倒。
www.unicode.org から Unicode の定義ファイルを落としてきてスクリプトで処理とかしているので。
スクリプトには ruby とか julia とか使われてるので微妙に mac の上に作るのはダルい。
今回は docker で fedora 28 の上に使い捨ての環境を作って解決。

fedora 29 だと julia が新しすぎてダメとか、CentOS7 にはデフォルトで julia が無かったりとか、寄り道はいろいろ。
最終的には fedora 28 の上に call-by-need で環境を作って patch を cherry-pick して make update をかけて終了。
brew の formula 回りは tmux で何度も触ってるので特筆すべきことは発生せず。
途中であった謎現象としては www.unicode.org 自体が落っこちていて make update が上手くくいかない事がありました。
何度も make してスパム判定されたとかなのかもしれない。

2018/12/07

ReFe + ref.vim で Neovim から Ruby の document を読む

この記事は Okinawa.rb Advent Calendar 2018 の 7 日目の記事です。
昨日の記事は @hanachin_ さんの 『refineをしてるモジュール取り出せるrefinements_robbery gem』 でした。


なにができるの

カーソルが指している(クラス|メソッド)名のドキュメントが一発で引けます。
これが
こうじゃ

的な感じ。


環境

OS: macOS Sierra 10.12.6
Neovim: 0.3.1
ReFe: 2
Ruby: 2.5.3p105 (2018-10-18 revision 65156)
vim-ref: b45d10f6d0c82e3afd17774626e952fde03274a1



NeoVim + vim-ref

私の環境では NeoVim を使っていますが、Vim でもおそらく動くはずです。
vim-ref というリファレンスを読むのに便利なツールがあり、2014年あたりから私は活用させてもらっています


ReFe 2

クラス名かメソッド名を指定すると該当するドキュメントを表示してくれるツールです。


ReFe + vim-ref

さて。この二つを組み合せていきます。

  • $ bitclust setup
で refe を使えるようにします。
この時点で
  • $ refe Integer
とするだけで

のように表示できます。便利。

ちなみに vim-ref は plugin を入れると refe に関しては設定無しでも動きます。
normal mode で K を押すだけ。便利便利。


まとめ

ということで vim-ref を使って ReFe 2 を引くお話でした。
ちなみに vim-ref で開いた buffer 内のワードでも refe を引けるので、色々と探検できたりします。
後、地味な利点としてオフラインでもドキュメントが見られる点があります。
快適な Ruby ライフをー