びぃえるくぅと。

ガラケーは打楽器。

EC2 の Amazon Linux 2 で rbenv を使わずに Ruby 2.4 を入れる (おまけに Node.js)

気づいたら Amazon Linux のメジャーバージョン(?) が 2 になっていたんですね。おめでとうございます。

面倒なので rbenv 使わず新しい Ruby を入れたい

さて Yahoo! とかで Amazon Linux ruby 2.4 とかで検索してみると、ほとんどの記事が rbenv を使ってインストールしているのですが、 まぁ面倒だしせっかくなのでなんとか rbenv を使わずに完結させたいと思った次第です。

検索結果をよく見てみると AWS 公式の記事があったので見てみると

aws.amazon.com

Ruby 2.4 – 2.4 シリーズの最新バージョン Ruby が利用可能になりました。次のようにインストールします。

$ sudo yum install ruby24

なんだぁ yum でインストールできるんじゃ〜んとか思って意気揚々とコマンドを叩くと

[ec2-user@ip-x-x-x-x ~]$ yum search ruby24
Loaded plugins: langpacks, priorities, update-motd
Warning: No matches found for: ruby24
No matches found

おらんのです。

(ちょっと話題から逸れて) 2つの Amazon Linux

docs.aws.amazon.com

AWS には、2 つのバージョンの Amazon Linux: Amazon Linux 2 および Amazon Linux AMI が用意されています。

なるほどさっきのは Amazon Linux AMI を対象とした記事だったんですね。初見殺し。

僕が動かしてるインスタンスAmazon Linux 2 の方なので単純に yum では入れられないようです。 AMI 版(?) の方はおそらく yum でインストールできるようになっていると思われます。

Extras Library

ですが Amazon Linux 2 になってから Extras Library という仕組みが作られたようです。 どういう仕組みで動いているかは把握していませんが amazon-linux-extras コマンドで追加のソフトをインストールすることができます。

2018/02/04 現在で Extras Library 経由でインストールできる トピック (と呼ぶそうです) の一覧を出力してみると

$ amazon-linux-extras list
  0  ansible2   disabled  [ =2.4.2 ]
  1  emacs   disabled  [ =25.3 ]
  2  memcached1.5   disabled  [ =1.5.1 ]
  3  nginx1.12   disabled  [ =1.12.2 ]
  4  postgresql9.6   disabled  [ =9.6.6 ]
  5  python3   disabled  [ =3.6.2 ]
  6  redis4.0   disabled  [ =4.0.5 ]
  7  R3.4   disabled  [ =3.4.3 ]
  8  rust1   disabled  [ =1.22.1 ]
  9  vim   disabled  [ =8.0 ]
 10  golang1.9   disabled  [ =1.9.2 ]
 11  ruby2.4  disabled  [ =2.4.2 ]
 12  nano   disabled  [ =2.9.1 ]
 13  php7.2   disabled  [ =7.2.0 ]
 14  lamp-mariadb10.2-php7.2   disabled  [ =10.2.10_7.2.0 ]

想定したよりも利用可能なトピックは少なかったですが、主要なアプリケーションの最新バージョンが一通り揃っています。 yum でインストールできるバージョンと比較してみると以下の通りになりました。(これも 2018/02/04 現在)

パッケージ (トピック) yum での最新 extras での最新
Ansible N/A 2.4.2
Emacs 24.3 25.3
Memcached 1.4.15 1.5.1
Nginx N/A 1.12.2
PostgreSQL 9.2.23 9.6.6
Python 3 N/A(?) 3.6.2
Redis N/A 4.0.5
R言語 N/A(?) 3.4
Rust N/A 1.22.1
Vim 7.4 (インストール済) 8.0
Go言語 1.8.3 1.9.2
Ruby 2.0.0 2.4.2
Nano 2.3.1 (インストール済) 2.9.1
PHP 5.4.16 7.2.0

Ruby 2.4.x をインストール

ということで Extras Library を経由して Ruby 2.4 をインストールします。

$ sudo amazon-linux-extras install ruby

細かいバージョン指定もできるようなので、EC2 のドキュメントを是非チェックしてみてください。 これで Ruby 2.4 + Gem が使えるようになりました。

[ec2-user@ip-x-x-x-x ~]$ ruby -v
ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-linux]
[ec2-user@ip-x-x-x-x ~]$ which ruby
/usr/bin/ruby
[ec2-user@ip-x-x-x-x ~]$ gem -v
2.6.13
[ec2-user@ip-x-x-x-x ~]$ which gem
/usr/bin/gem

めでたし。

(番外編) そういえば Node.js はどうやって入れたら良いの?

[ec2-user@ip-x-x-x-x ~]$ amazon-linux-extras list | grep node
[ec2-user@ip-x-x-x-x ~]$

・・・。

[ec2-user@ip-x-x-x-x ~]$ yum search nodejs
Loaded plugins: langpacks, priorities, update-motd
=== Matched: nodejs ===
http-parser.x86_64 : HTTP request/response parser for C
http-parser-devel.x86_64 : Development headers and libraries for http-parser
[ec2-user@ip-x-x-x-x ~]$

・・・・・・・・・・・・・・。

正解は

パッケージマネージャを利用した Node.js のインストール | Node.js

こちらを参考にしてみてください(丸投げ)。なるほどリポジトリを追加するんですね。分かるか。

VDMX で NumFX を利用した便利なレイヤー表示操作

お知らせ 1/1(月) に同様の内容の記事を投稿していましたが、中途半端なまま放置してしまったため、書き直しという形で本記事を投稿しました。

挨拶

改めまして、明けましておめでとうございます。本年も何卒よろしくお願い致します。

年越しの WEEKEND RAVERS NYE (#WRNYE) での VJ もなんとか無事に終わり、 2018年幸先よく VJ をスタートすることができたかなと思います。

さて、#WRNYE より前に 12/30 にハトトさんのお宅で開催された #HatotoHouse に招待されたので、 VDMX ヘビーユーザーに囲まれてビクビクしながら自分の VDMX プロジェクトファイルを紹介したのですが、 予想に反して反響がありました。大変嬉しい限りです。

一時的なレイヤー非表示(ミュート)や単独レイヤー表示(ソロ)

特に反響(?)が大きかったのが、一時的にあるレイヤーを非表示にしたり(以下、ミュート)、 一時的にあるレイヤーだけを表示する(以下、ソロ)仕組みでした。

全国 1億人の VDMX ユーザーのほとんどが Layer OpacityMIDI コントローラーの縦フェーダーに割り当てて操作していると思います。 もちろん縦フェーダー操作だけでもミュートやソロは可能ですが、 慌てて瞬間的にフェーダーを操作すると僕はよくミスったりフェーダーのつまみを飛ばしてしまったりします。

そこで私は縦フェーダーの他に、ボタンを押したらミュートしたりソロにできるようにしています。 KORG の nanoKontrol2 を愛用していますが、以下のように割り当てて使っています。

f:id:yadex205:20180107223844p:plain

これらを VDMX の Num FX という機能を使って実現していきます。

前提と準備

今回は 3レイヤー用意し、 それぞれの Layer Opacity をお好みのコントローラーの縦フェーダーにマッピングしているものとします。

f:id:yadex205:20180107223902p:plain

今回はコントローラーの代わりに、上の画像の様に Control Surface を使ってでっち上げたもので解説します。 頭に L1, L2, L3 とついてるボタンやフェーダーがそれぞれ レイヤー1, レイヤー2, レイヤー3 を操作します。

レイヤーミュート

簡単な方から、ミュートを実装しましょう。Resolume だと B ボタンに該当します。 具体的には、Mute ボタンを押したら縦フェーダーがどんな値であろうと、Layer Opacity の値を強制的に 0 にするようにします。

まずはレイヤー1 の Layer Opacity の UI Inspector を開きます。 下の方にボタン Edit Num FX Chain があるのでクリックすると Number FX Chain Inspector という画面が出てきます。

f:id:yadex205:20180107223924p:plainf:id:yadex205:20180107223934p:plain

さて名前からお気づきの方もいらっしゃると思いますが、 Num FX は外部のコントローラからの入力値に対してエフェクトをかけることができる機能です。

例えば 縦フェーダーの入力値に対して常に 0.5 を掛ける エフェクトを追加すれば、 縦フェーダーを目一杯上まで押し上げても VDMX 側で受け取る値は 0.5 までしか上がりません。

ということで、Number FX Chain Inspector 画面の Add Asset: から FX > Multiply を追加します。

f:id:yadex205:20180107224001p:plain f:id:yadex205:20180107224009p:plain

Multiply は外部コントローラーからの入力値に対して、指定した値を掛ける Num FX です。 初期値では 1.25 が指定されてるので、例えば縦フェーダーを真ん中の位置にスライドすると、 VDMX 側では 0.5 * 1.25、つまり 0.625 として受け取られます。

また NumFX 全部に言えますが、 VDMX で映像に対して使うエフェクト同様右上のボタンで ON, OFF が切り替えられます。

最後に、Mute ボタンを Multiply の ON, OFF に割り当てMultiplier の値を 0.00 にすると完成です。 これによって、Mute ボタンを押すと Layer Opacity を 0.00 に固定する NumFX が有効になります。

f:id:yadex205:20180107224711g:plain

あとは他の全てのレイヤーに対して同じ様に NumFX を仕込めば完成です! ちなみに、NumFX が有効になっている場合は四角にNのマークがつきます。

単独レイヤーのみ表示 (ソロ)

仕様

次に複雑になりますが、ソロ機能を実装していきます。Resolume だと S ボタンに該当します。 ここでは各レイヤーは 3つの状態を持つことになります。

  • ソロ機能が無効であり、自身のレイヤーが表示されている。
  • ソロ機能が有効であり、現在自身のレイヤーが選択されているため自身のレイヤーだけ表示されている。
  • ソロ機能が有効であり、現在他のレイヤーが選択されているため自身のレイヤーは非表示になっている。

実現するためには以下の項目について VDMX 側でデータとして持つ必要があります。

  1. 現在ソロ機能が有効になっているかどうか
  2. ソロ機能が有効になっている場合、現在選択されているレイヤーはどれか

今回は VDMX 側がデータとして持つ部分を Control Surface を使って実現し、あとはミュートの時と同じく NumFX Multiply を使っていきます。 なお Control Surface でのデータの保持の仕方は色々な方法があると思いますので、 この記事は参考程度にして自身のしっくりくる方法に落とし込んでいただけたら幸いです。

Control Surface の作り込み

まず、単独で表示するレイヤーとしてどれが指定されているかを Multi-Button で表現します。ボタンの数は レイヤーの数 + 1 用意し、Toggle Buttons? オプションと Mutually-exclusive? オプションの両方にチェックをつけ、Publishing Properties を Publish index of last button にしましょう。Toggle Buttons?Mutually-exclusive? については説明が面倒なので省きますが、ご自身で試していただけると納得の挙動をすると思います。

次にソロ機能が有効になっているかどうかを表すための Button を追加し、先程追加した Multi-Button をこのボタンの Receiving に追加します。

f:id:yadex205:20180108103317p:plain

さて、先程 Multi-Button の Publishing Properties を Publish index of last button に、つまり選択したボタンの番号を他のコントローラに伝えるようにしたわけですが、それによって番号が 1 以上のボタンを選択しているときに Button は ON の状態になります。

f:id:yadex205:20180108103853g:plain

ただし、Multi-Button の発するデータが Publish index of last button の状態だと扱いづらいため、もう一つ同じ個数の Multi-Button を用意し、こちらは Publish as many BOOLs の状態にしておきます。そして新しい Multi-ButtonNavigation > Choose by index に以前の Multi-Button を追加します。

f:id:yadex205:20180108104320p:plain

これで Control Surface の作り込みは完了です。上の画像での Solo activated? ボタンが「ソロ機能が有効になっているかどうか」、Solo activated layer output が「現在単独表示するレイヤーとして選択されているレイヤー」を表現してくれています。

コントローラーと Control Surface と Layer Opacity の連携

ソロ機能の完成に近づいてきました。まずは外部コントローラーの Solo ボタンを Control Surface の 最初に作った Multi-Button に対してマッピングします。 なお、コントローラーの L1 Solo, L2 Solo, L3 SoloToggle button? オプションのチェックを外しています。こちらもご自身で挙動を確認していただけると幸いです。

f:id:yadex205:20180108105208p:plain

次に、ミュートの時と同じ様に Layer Opacity の Number FX Chain Inspector を開き、同様に FX > Multiply を追加します。 そして以下の画像の通りマッピングを行います。注意としては、Multiplier の最大値が 1.00 になるようにフェーダーを設定しておくのを忘れずにお願いします。

f:id:yadex205:20180108105616p:plain f:id:yadex205:20180108105610p:plain

これを全レイヤーに対して行えば、ソロ機能の完成です。

f:id:yadex205:20180108110023g:plain

ちなみに先程作った Control Surface はもう見せる必要がないので僕は消してしまいます。プログラムで関数のような裏方の作業をしてくれる Control Surface のことをよく「隠し Control Surface」とか僕は言ったりしています。

最後に

拙い説明だったと思いますが、いかがでしょうか。初めはとっつきづらいと思いますが Control Surface と NumFX で VDMX はより便利になります。ちょっとしたプログラムを組む感覚だと思います。是非試してみてください。

告知

  • 1/18 (木) アッパーチューナー第2弾 #アパチュナ @ 渋谷 nagomix 告知ページ
  • 1/27(土) ??? @ 渋谷 VUENOS
  • 3/18(日) ??? @ 渋谷某所

本年もよろしくお願い致します🙇

自分の VDMX プロジェクトファイルについて (主に NumFX使ったやつの解説)

改めまして、明けましておめでとうございます。無事大晦日から元旦にかけての Weekend Ravers NYE も VJ をやりきることができました。

さて、以前 VJ さんのお宅で開催された VJ 会議 feat. 寿司 にお邪魔した際に、僕の VDMX のプロジェクトファイルを見ていただき思いの外反響 (?) があったので、 その中でも目立つ箇所とその実装方法的なのを紹介しようと思います。

この記事での前提と準備

基本的に操作は KORG の nanoKontrol2 (以下、ナノコン) で行うものとします。 フェーダー・ノブ・ボタン S M R の 1セットで 1つのレイヤー操作します。

f:id:yadex205:20180101205452p:plain

また、左から順にレイヤー1, 2, 3... を操作するものとします。

これは僕のやり方に近いというだけなので、もし参考にされる場合は各自の方法 (お持ちの MIDI コンや VDMX の Control Surface 等) に落とし込んでいただければと思います。

では説明していくにあたって、とりあえずレイヤーをいくつかとそれぞれのプレビューを用意しておきましょう。

f:id:yadex205:20180101211109p:plain

そして、それぞれの Layer Opacity にナノコンの縦フェーダーを割り当てておきましょう。それでは解説に入ります。

ミュート機能

ちょうど「Mute」の頭文字なので、ナノコンの M ボタンを押したらそのレイヤーがミュートされる、つまり Layer Opacity が強制的に 0.00 になるようにします。仕様は以下の通りです。

  • 1回 M ボタンを押すとミュートが有効になる
  • もう 1回 M ボタンを押すとミュートが解除される

これを Number FX の機能を使って用意します。今回の状況で言えば縦フェーダーの値で Layer Opacity を弄っているわけですが、その縦フェーダーの値に エフェクト をかけることができます。

例えばレイヤー2の UI Inspector を開いてみましょう。下の方に Edit Num FX Chain ボタンがあるのでクリックします。

f:id:yadex205:20180101212422p:plain

すると、Number FX Chain Inspector というウィンドウが出てくると思います。

f:id:yadex205:20180101212653p:plain

では、右上の Add Asset: から FX > Multiply を選びましょう。

f:id:yadex205:20180101213106p:plain

なんとなく想像つく方もいらっしゃると思いますが、これでナノコンの縦フェーダーの値にある数を掛け算した結果を Layer Opacity として使うことができます。初期値では 1.25 なので、縦フェーダーの値 x 1.25 が Opacity として使われます。もし Multiplier2.00 を与えておけば、縦フェーダーを半分程度上げただけで Layer Opacity1.00 になっていますし、逆に Multiplier0.50 を与えると、縦フェーダーを全部上げても Layer Opacity0.50 までしか上がりません。

また VDMX の通常のエフェクトと同じく右上の On Off ボタンを押すと、NumFX の有効無効を切り替えられます。

前置きが長くなってしまいましたが、僕のミュートの実装方法は NumFX Multiply を用意して 値を 0 にし、ナノコンの M で On Off を切り替える というものです。最終的に出来上がったものが以下のようになります。

https://user-images.githubusercontent.com/4597654/34467909-b06e7a20-ef40-11e7-8a63-58c57fd1201a.gif

ソロ機能

すみません近日中に書きます。(2018.01.01現在)

ということで

Number FX で楽しい VDMX ライフを!

余談

パーティー中に他の方の VDMX を見てふと思い立って増築した自分のプロジェクトファイルがこちらになります。

f:id:yadex205:20180101203519p:plain

そして増築直後

今年は荒れそうです。本当にメニューバー出さないよう気をつけます・・・。

2018年明けましておめでとうございます。

明けましておめでとうございます。Yadex205 です。

昨年 2017年は大学院中退や VJ チーム SabaLeoN に所属したこともあり、結果として VJ させて頂ける機会が増えました。 本当にありがたいことですし、出演させて頂けて本当に楽しい時間を何度も過ごすことができました。 繋がりも増え機材も増え、楽しい経験も増え人生で一番充実していた 1年だったと思います。

アルバイトの方では Ruby on Rails に触れてウェブアプリケーションやプログラミングについての知識も身についたと思います。 ISUCON 予選にも参加し、自分の技術がまだ未熟なのを実感しつつ、知らない世界を覗けたことも大変大きかったです。

今年ももちろん VJ をより一層頑張っていきたいのに加え、 4月から社会人になりますのでそちらでも成長していきたいと思います。

2017 年度お世話になったイベント

日付 イベント名 or ハッシュタグ 会場 出演形態
1/22 良い曲 早稲田 茶箱 個人
1/25 アイドルVJ 渋谷 Camelot 個人
5/6 Happiness 武蔵小杉 AlphaCross 個人
5/27 #アジアニ 3 渋谷 Clubasia 個人
6/10 #揺らす 中野 Heavysick Zero 個人
7/22 IMAP++ #imappp 渋谷 WhiteSpaceLab 個人
8/5 アイドルVJ 渋谷 Camelot 個人
9/10 VJ体験交流会 東心斎橋 Libera
9/24 #NNG01 青山 fai 個人
10/07 DefDistortion 42 渋谷 R-Lounge SabaLeoN として
10/09 アイドルVJ 渋谷 Camelot 個人
10/27 #アジアニ 4 渋谷 Clubasia 個人
11/3 DefDistortion #43 渋谷 R-Lounge SabaLeoN として
11/3 GOTTA VISION #ごった 新大久保 UniqueLaboratory 個人
11/4 #しなすたリリパ 渋谷 nagomix SabaLeoN として
11/9 #アパチュナ 渋谷 nagomix 個人
11/11 BunGeee☆ 50 京橋 Beronica 個人(飛び入り)
11/22 Re:animation 11 新木場 STUDIO COAST (ageHa) SabeLeoN として
11/25 #dolive 03 渋谷 LoungeNeo 個人
11/26 Supersonic 渋谷 WOMB SabaLeoN として
12/02 DefDistortion #44 渋谷 R-Lounge SabaLeoN として
12/10 アイドルVJ 渋谷 Camelot 個人
12/16 ravish 10 #ravish 渋谷 R-Lounge 個人
12/22 Supersonic Next 渋谷 R-Lounge SabaLeoN として
12/31 Weekend Ravers NYE #wrnye 渋谷 Clubasia SabaLeoN として

イベントの主催者様出演者様、スタッフ様お客様に大変お世話になりました。本当にありがとうございました。

2018年もどうぞよろしくお願いいたします! VJ オファーお待ちしております!

Case-sensitive な macOS 上で Cinder のビルドにコケた話

ご無沙汰しております。

最近 macOS 10.12 をクリーンインストールする機会があり、もちろん SSD も綺麗にフォーマットしたわけですが、 今まで見落としていたのか「Case-sensitive」(日本語: 大文字/小文字を区別) というものに興味を惹かれて有効にしてみました。

そしたらまさかの Adobe ソフトがインストールできないとまぁ大笑いだったわけですが。

「大文字と小文字が区別されるドライブへのインストールはサポートされていません」エラー

MacIllustrator が使えないのは辛いですね・・・。

Cinder のビルドができない

openFrameworks のライバル(?) である Cinder というものがあり、 公式サイトから既にビルド済みのパッケージをダウンロードすることができますが、 Github 上のリポジトリからソースコードをクローンしてきて CMake でビルドすることもできます。

GitHub - cinder/Cinder: Cinder is a community-developed, free and open source library for professional-quality creative coding in C++.

ところがいざビルドしようとすると、CMake が以下のようなエラーを吐いて止まってしまいます。

CMake Error at proj/cmake/libcinder_target.cmake:14 (add_library):
  Cannot find source file:

    path-to-libcinder/src/AntTweakBar/TwOpenGl.cpp

  Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
  .hxx .in .txx

src/AntTweakBar/TwOpenGl.app が見つからないって言っていますね。 では src/AntTweakBar ディレクトリを見てみましょう。

f:id:yadex205:20171020131849p:plain

なんと TwOpenG"""L""".cpp という名前で存在しています。

おそらく開発陣が CMake ファイルを作られた時に TwOpenG"""l""".cpp と誤植 (と言えるのか) してしまったのかと思われますが、 普通の macOS なら Case-Insensitive (大文字/小文字を区別しない) 環境で動かしていると思いますし、 ビルドに失敗することもなかったのでしょう。実際僕も以前ビルドした時にはこんな問題は起こらなかったです。

Issue を書き込みました。

ぶっちゃけこれが言いたかっただけなのですが、この件は一応 Issue を投げました。

CMake says "Cannot find source file" on macOS with Case-sensitive filesystem · Issue #1920 · cinder/Cinder · GitHub

まぁファイル中の 1文字を直すだけなので、手元にクローンしたやつを書き換えるだけでとりあえず対応はできていますけどね。

まとめ

Case-sensitive なディスク上で macOS を動かすとたまに不便になります。

話が逸れますが、Docker for Mac で 大文字小文字の区別関連で苦労されてる方もいらっしゃるようですね。

qiita.com

こちらは Case-sensitive な方が良いというパターンですので、一概に Case-sensitive はダメ、とも言い切れないですね。

告知など

いつも通りの唐突な告知です。以下のイベントで VJ で出演いたします。

#アジア二 第4期

twipla.jp

GOTTA VISION

GOTTA VISION VOL.5

また、この度 VJチーム SabaLeoN に所属することになりましたので、 SabaLeoN メンバーとしても各所に VJ しに行きます。

何卒よろしくお願いいたします。

Capistrano3 でリモート側の環境変数設定されてないなって思ったら

どうでも良いことで 2時間くらい食って悔しかったのと日本語記事がなかったように思えたので書きなぐりました。

症状

Capistrano でデプロイ先で、.bashrc に書いた環境変数が設定されないまま処理が行われてしまう。

対処

以下の Stackoverflow に答えがありました。

stackoverflow.com

デプロイ先の .bashrc なりシェルの設定ファイルの先頭に

# If not running interactively, don't do anything

みたいなコメントと、その直後に return してそうな箇所はありませんか?

Ubuntu など一部のディストリビューションのシェル設定ファイルの先頭には「インタラクティブシェルじゃないならこの後の設定は読み込まない」ような記述がされていることがあるため、その記述をコメントアウトするなりその記述の前に設定を書くなりの対策をとれば良い感じになると思います。

AmazonLinux だとそのような記述がなかったから完全に見逃してた・・・。

flycheck で走らせるプログラムを探すのに direnv に手伝わせる時の注意点

挨拶

またしても前回の投稿から間が空いてしまいましたが、なんと就活が終わっていたり 大学院を中退していたりと色んなことが起こりました。ひと段落したので VJや動画制作やWebデザインなど、もっと取り組んでいきたいと思います。

flycheck が使う文法チェック系プログラム

Emacs でリアルタイムに文法チェックを行うのに便利なのが flycheck ですが、 flycheck 自体がコードを調査しているのではなく、rubocop やら eslint やらを 実行しているのはご存知かと思います。

それらのプログラムはどのように探されているかというと、シェルが $PATH から プログラムを探すように、Flycheck は Emacs 上の変数 exec-path から探しています。 公式ドキュメントにその記述があります。

また、exec-path の中身は

M-x describe-variable RET exec-path

で見ることができます。

direnv を使ってプロジェクト毎の文法チェックプログラムを探させる

少し話が逸れますが、eslint だったり rubocop と言った文法チェック系のプログラムは、 なるべくグローバルにではなくプロジェクトのディレクトリ内に置いときたい派です。 なんとなくなのでちゃんとした理由があるわけではないです。

なので、例えばNode.js 系のプロジェクトなら npmeslint を導入すると、 node_modules/.bin ディレクトリに実行ファイルが置かれるような状態です。

普通はそのようなディレクトリには $PATH が通ってませんが、direnv を使えば プロジェクトのディレクトリ下に入った時だけ $PATH にそれらを含めることができます。

.envrc というテキストファイルをプロジェクトのルートディレクトリに置き

export PATH="node_modules/.bin:$PATH"

と記載してやると良い感じになります。細かい話などは割愛しますので調べてみてください。

そして、普通シェルから立ち上げた Emacs$PATH から exec-path に値が丸写しされますし (GUI の場合は exec-path-from-shell というパッケージが要るそうです)、 direnv 管理下のファイルを Emacs で開けば .envrc に書かれた内容も もちろん exec-path に反映されています。

.envrc での $PATH の追加の仕方に注意

ただし、上記の export PATH="bin:$PATH" のように相対パスで指定すると、実はうまく動かない時が出てきます。

例えばファイル構成が以下の場合を想定します。

  • /your/great/project/.envrc
  • /your/great/project/node_modules/.bin/eslint
  • /your/great/project/code1.js
  • /your/great/project/nested/code2.js

.envrc には

export PATH="node_modules/.bin:$PATH"

が記載されています。

このとき、Emacs/code1.js を編集しているときは $PATH に従って /node_modules/.bin/eslint を見つけにいきますが、/nested/code2.js を編集しようとすると /nested/node_modules/.bin/eslint を探しに行こうとして見つからずに失敗します(多分そうだと思います)。

なのでEmacs の flycheck を利用する場合は $PATH は必ず絶対パスである必要があります。

PATH_add で楽して絶対パスを指定する

では .envrc には必ず絶対パスを書く面倒なことをしなくちゃいけないのかというとそうではなく、 PATH_add という便利機能が備わって要るので、それを使いましょう。

PATH_add node_modules/.bin

これによって $PATH には /your/great/project/node_modules/.bin のように 絶対パスで追加されます。

結論

プロジェクトディレクトリ以下に文法チェック系のプログラムがあり、 かつ flycheck にそれを見つけさせるために direnv を使う場合は、 PATH_add を使った方が良いと思います。

告知

5月中に 2件VJやります。

初めて学外でVJやった 武蔵小杉アルファクロス 様でまたVJできるのとても楽しみです。 エイジアも2回目になります。前よりゴリゴリ視力削っていきたいです。

お時間あれば何卒よろしくお願いいたします。

Copyright © 2015 Yadex205