(WSL)(ruby) WSLの環境でpryを使うと最初にパーミッションの警告が出て五月蠅い場合

rubyに関する記事一覧→ rubyのまとめ



pryが出すメッセージの通り ディレクトリのパーミッションが777になっているのがあるのが原因です

指定したディレクトリ以下のディレクトリを一括して755にしてあげましょう

find /home/<ユーザ名>/.rbenv -type d -exec chmod 755 {} +

インストール直後だとrbenvでもrvmでも同じように警告が出されるので
まずは .rbenv や .rvm のディレクトリを指定してやりましょう


それ以外のケースだと
node.js の n などをインストールした後に同じ警告が出るケースがあります
もちろん上のコマンドを読み替えて

find /home/<ユーザ名>/n -type d -exec chmod 755 {} +

の様にすれば解決します
面倒ですがWSLの環境下では警告が出るたびに
関連のディレクトリに上のコマンドを実行してあげましょう

(ruby)(rbenv) rbenvでrubyをインストール

rubyに関する記事一覧→ rubyのまとめ



注意:

この記事の内容は
ubuntu 17.10
lubuntu 17.10
Windows Subsystem for Linux(WSL)
Fedora 27
CentOS 7
の環境で動作を確認しています、
その他の環境ではうまく行かない可能性がありますので予めご了承ください


rvmが入っている環境ならまずはrvmを除去します

rvm seppuku

でアンインストールして
.bashrc等に追加した source ~/.rvm/scripts/rvm の部分を削除してください
端末を再起動したのち rvmの環境が無くなったかを確認してください


ここから rbenvのインストール手順の本編です
githubから引っ張ってくるのが手っ取り早いです

git clone https://github.com/rbenv/rbenv.git ~/.rbenv


.bashrcなどに以下を追加します

if [ -e $HOME/.rbenv ]; then
    export PATH="$HOME/.rbenv/bin:$PATH"
    eval "$(rbenv init -)"
fi


ここで端末を一旦再起動します


rbenvが使えるようになったかを確認します

type rbenv

を実行して、以下のような結果が返ってきているならOKです

rbenv は関数です
rbenv ()
{
    local command;
    command="${1:-}";
    if [ "$#" -gt 0 ]; then
        shift;
    fi;
    case "$command" in
        rehash | shell)
            eval "$(rbenv "sh-$command" "$@")"
        ;;
        *)
            command rbenv "$command" "$@"
        ;;
    esac
}


続けて rbenv install を使えるようにします

git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build

rbenv ins 位まで入れて Tabキーで rbenv install と補完されるようになっているならインストールに成功しています


続いて、rbenvでrubyをインストールする前に、rubyのビルドに必要な物をインストールします
(ここに書いているのはdebian/ubuntu系の方法です、その他の環境の場合は読み替えて対応するものをインストールしてください)

sudo apt-get install build-essential libssl-dev libreadline-dev zlib1g-dev

redhat系だとおそらく 以下のでおおよそ同等になるかと思います

sudo yum groupinstall 'Development tools'
sudo yum install openssl-devel readline-devel zlib-devel


とりあえずの基本的な使い方は

rbenv install -list でインストール可能なバージョン一覧表示
rbenv install <バージョン> で指定したバージョンをビルドインストール
rbenv versions でインストール済バージョン一覧表示
rbenv global <バージョン> で通常使用するバージョンを指定
rbenv local <バージョン> でそのディレクトリ内で使用するバージョンを指定
rbenv local --unset でローカルで使用するようにした設定を解除
rbenv uninstall <バージョン> で指定したバージョンをアンインストール


インストール可能なバージョンのリストを更新したい場合は
ruby-buildのあるディレクトリ(~/.rbenv/plugins/ruby-build) へ移動して

git pull

git fetch --prune
git merge origin/master

などとして最新の状態にしてあげればOKです

(node.js)(javascript) 外部プログラムを呼び出して、それに標準入力をして、それの標準出力を取得する

node.jsに関する記事一覧→ node.jsのまとめ



今回想定したシチュエーションは、ちょっと特殊かもしれませんが

euc-jp文字コードの文字列をutf-8に変換したいけどiconvだとなんかうまくいかないので
外部プログラムのnkfを使って変換したものをまたスクリプト側で取得したい

とします、まあ nkfの部分を色々と別のものに読み替えればいいだけですね。

#!/usr/local/bin/node

// rubyと同じ感じでコンソールに出力できるように
const puts = console.log;
const print = (str)=>{process.stdout.write(str)};

// 外部プログラムを呼び出す準備
const exec = require('child_process').exec;

// ファイル操作をする準備
const fs = require('fs');

// euc-jp.txt には euc-jpの文字コードで書かれた内容が入っているとします
// 非同期モードだといろいろめんどくさいので readFileSyncの同期モードで読み込んでます
// これで euc_textにeuc-jpの文字列データ(データ自体はUint8Arrayの状態)が入っている状態を作ります
// (例えば requestで取得した「euc-jpで書かれたwebページ」の bodyのデータに相当します)
var euc_text = fs.readFileSync('euc-jp.txt');

// nkfを使って utf-8 に変換したいので
// 第一引数のコマンド部分は 'nkf -w -Lu'
// -Luオプションを付けることで改行コードをLFで統一してくれます
// 第二引数に外部プログラムの結果を受けるコールバック関数をセットします
// 外部プログラムの標準出力は stdoutにセットされています
const nkf = exec(
	'nkf -w -Lu',
	(err, stdout, stderr)=>{
		puts(stdout);
	}
)

// 外部プログラムの標準入力に euc_textの内容を流し込みます
nkf.stdin.write(euc_text);

// 外部プログラムの標準入力を閉じます
// これをやらないと終わりを待ち続けるのでスクリプトの実行が固まります
nkf.stdin.end();