【Node.js】 NVMで最新版のNode.jsをインストール
環境 CentOS 7.2 NVM 0.31.1 Node.js 6.2.0
nightlyビルドを使いたいという事でなければ、stable版はnvmを使うのが便利。
■NVMのインストール
git clone https://github.com/creationix/nvm.git ~/.nvm
source ~/.nvm/nvm.sh
■Node.jsのバージョン確認
nvm ls-remote
とすると、インストールできるNode.jsのバージョンがズラーっと出るので、使いたいものを選択する。 今回は最新の6.2.0を使用。
■Node.jsインストール
NODE_VER=6.2.0 nvm install $NODE_VER nvm alias default $NODE_VER
毎度読み込むのは大変なので.bash_profileに
$NODE_VER=6.2.0 if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh nvm alias default $NODE_VER fi
と書いておけば自動で設定される。
【PHP】 正規表現のエスケープ
phpで正規表現(preg系)のエスケープシーケンスの書き方について調べた。
以下のような正規表現がある。
$text = 'abc/def'; preg_match('/abc\\/def/', $text); # (a) preg_match('/abc\/def/', $text); # (b)
さて(a)と(b)、どっちが正しいか?
答えはどっちでもOK。
とはいえ(1)はうまく評価されるが、間違った書き方だと思う。
PHPのマニュアルに、
シングルクォートあるいはダブルクォートで囲まれた PHP の 文字列 の中では、バックスラッシュは特別な意味を表します。 そのため、正規表現 \ を使用して \ とマッチさせたい場合は PHP のコード内では "\\" あるいは '\\' と記述する必要があります。
とある。 つまり
1.PHPの文字列として評価
2.正規表現エンジンでパターンを評価
とされるからバックスラッシュ自体を評価するときは、重ねましょうと言う話のはず。
(a)のように書く人は、以下のように判断していると思われる。
1.PHPの文字列として評価
/abc\\/def/ => /abc\/def/
2.正規表現エンジンでパターンを評価
abc\/def => abc/def
確かに正しく動く。
だが、そもそも正規表現エンジン内では、/
(スラッシュ)はエスケープの必要はない。
なので、なので本来は(b)のパターンでOKで問題ない。
ではバックスラッシュは?
もとのPHPが以下だとする。
$text = '\\'; preg_match('/\\/', $text); # (c) preg_match('/\\\/', $text); # (d) preg_match('/\\\\/', $text); # (e)
これだと(c)はエラーに、(d),(e)はマッチする。
(c)がエラーになるのは
1.で評価された結果、/\/
となる。
しかし2.で評価されるときに、\
しか渡ってこない。
そのため正規表現エンジンに正常に評価されず、エラーになる。
(e)は
1.で/\\/
と変換され、2.で正規表現エンジンんい\\
が渡される。
なので正常に評価される。
では(d)は?
実はこれが良くわからない。
PHPの評価順のせいか正常に評価される。
が、普通に考えれば、1.の段階で3つ目の\
がスラッシュにかかりそうなもの。
しかし、正常に評価される。PHPの評価順のせいなのか?
とはいえPHPマニュアルにも書いてないので、イレギュラーな方法と思っておく。
【参考】
sshのAgent Forwarding
環境 CentOS7.0.1
Agent Forwarding。
puttyだと、pargentで秘密鍵のpassfrazeを毎度入力しなくてよくするあれ。
今回localhostのVirtualBoxから別のサーバーにssh。
そこから更にsshしようとすると、passfrazeを聞かれる。
つまり
ローカル ↓ ↓ Agent Forwardingしてsshログイン ↓ サーバーA ↓ ↓ sshログイン ↓ サーバーB ↓ ↓ sshログイン。passfraze聞かれる ↓ サーバーC
で、イロイロ調べたところ、sshでログイン後に別のサーバーに更にsshするときは、
$ ssh -A User@Server
と、-A
オプションをつけないと、Agent Forwardingされない。
そうするとサーバーAからBへもAgent Forwardingされ、BからCもpassfrazeなしで問題ないというわけ。
今までpargentとかに頼り切って、きちんと知らなかった。反省。
【参考】
【Vagrant】 複数台構成の調査
環境 Vagrant 1.8.1 VirtualBox 5.0.12
Vagrantfileを以下のようにする。
Vagrant.configure(2) do |config| config.vm.provider "virtualbox" do |vb| vb.gui = true end config.vm.define "server1" do |server| config.vm.box = "bento/centos-7.1" server.vm.network "private_network", ip: "192.168.33.10" config.vm.provision "shell", path: "provision1.sh" end config.vm.define "server2" do |server| config.vm.box = "bento/centos-7.1" server.vm.network "private_network", ip: "192.168.33.11" config.vm.provision "shell", path: "provision2.sh" end # Plugin config.vbguest.auto_update = false end
でvagrant up
すれば両方起動。
どちらかにしたいときは
PS> vagrant up server1 PS> vagrant up server2
とかでOK。
で、ちょっと気になった事を確認してみた。
- プロビジョニングは別のものを指定できる
当たり前だけど可能。
ただ、デフォルトのホストとのファイル共有はserver1もserver2も同じ。
なので同じファイルを使うようなときは注意が必要。
- それぞれのサーバーへの接続
ホスト -> server1 : ssh 127.0.0.1:2222
ホスト -> server2 : ssh 127.0.0.1:2200
server1 -> server2 : ssh 192.168.33.11
server2 -> server1 : ssh 192.168.33.10
となる。つまりprivate_networkを設定してないと、ゲスト間は接続できない。