HappyGoLucky

Web系サーバーサイド寄りの自動化大好きエンジニアの徒然なるブログ

yarnpkgは~/.yarnrcを見ている

なので、シェルをカスタムするためのオレオレ設定を ~/.xxxrc に書いてるとあかんよ、という話。

yarnpkg.com

yarnを使おうとしてインストールしたけど動かなかった。

$ yarn init
yarn init v0.15.1
error SyntaxError: Unknown token 1:0
    at Parser.unexpected (/usr/local/Cellar/yarn/0.15.1/libexec/lib/node_modules/yarn/lib-legacy/lockfile/parse.js:218:11)
    at Parser.parse (/usr/local/Cellar/yarn/0.15.1/libexec/lib/node_modules/yarn/lib-legacy/lockfile/parse.js:323:14)
    at exports.default (/usr/local/Cellar/yarn/0.15.1/libexec/lib/node_modules/yarn/lib-legacy/lockfile/parse.js:13:17)
    at /usr/local/Cellar/yarn/0.15.1/libexec/lib/node_modules/yarn/lib-legacy/registries/yarn-registry.js:105:62
    at next (native)
    at step (/usr/local/Cellar/yarn/0.15.1/libexec/lib/node_modules/yarn/node_modules/babel-runtime/helpers/asyncToGenerator.js:17:30)
    at /usr/local/Cellar/yarn/0.15.1/libexec/lib/node_modules/yarn/node_modules/babel-runtime/helpers/asyncToGenerator.js:28:20
    at run (/usr/local/Cellar/yarn/0.15.1/libexec/lib/node_modules/yarn/node_modules/core-js/library/modules/es6.promise.js:87:22)
    at /usr/local/Cellar/yarn/0.15.1/libexec/lib/node_modules/yarn/node_modules/core-js/library/modules/es6.promise.js:100:28
    at flush (/usr/local/Cellar/yarn/0.15.1/libexec/lib/node_modules/yarn/node_modules/core-js/library/modules/_microtask.js:18:9)

lockfile がどうのと言っているが、 yarn.lock ファイルは作ってない。 GitHubのIssueを漁ったところ

Getting SyntaxError when running basic command · Issue #613 · yarnpkg/yarn · GitHub

~/.yarnrc が原因だと判明。

私は、色々なツール・コマンド用のオレオレ設定を ~/.xxxrc に書いて source で読み込むようにしていた。 その癖で ~/.yarnrc を作って、 export PATH=~/.yarn/bin:$PATH などと設定していたのだけど、それが悪かった。

現在のyarnは、yarn自身の設定を ~/.yarnrc から読み込む。

https://github.com/yarnpkg/yarn/blob/b0611a6ee5220b0b1e955b271b6140640158f96c/src/registries/yarn-registry.js#L50

設定ファイルの管理場所考え直そう..

jqでURLエンコーディング

$ echo "a+b=b&c=hoge&d=hfua piyo" | jq -R '[split("&")[] | ([split("=")[] | @uri] | join("="))] | join("&")'
"a%2Bb=b&c=hoge&d=hfua%20piyo"

jq には @uri で URLエンコーディングする機能がある。 & で split して、= でさらに split して、片っ端から @url して、 = と & で join し直す、という仕組み。

もうちょっとシンプルに出来そう。

Virtualbox + Ubuntu に Android をデバッグモード接続できなくなった時

Android端末に「デバッグモードに接続しました」の通知が出ては消える状態になった。 USB繋げ直したりVMを再起動したりしてもダメ。

http://kobegdg.blogspot.jp/2015/01/androidwindowsusb.html

これの3,4をやったが、ダメだった。

http://stackoverflow.com/questions/16909439/why-does-virtualbox-not-detect-my-android-device

echo Y | sudo tee /sys/module/usbcore/parameters/old_scheme_first やったら何とかなった

Ubuntu16.04のkeyringでパスフレーズ無しSSH鍵を使おうとしたらパス入力求められて使えない

startup-applicationでssh-agentのチェック外してログインし直せばうるさくなくなった。 もとは、パスフレーズを何度も入力しなくても済む便利ツールなのだが...。 パスフレーズ無しなんだから空白のままEnterでOKになってくれればいいのに、パスフレーズを入力せよ、と怒られるのですごく困ってた。

Rubyで小数第x位までを表示する

String#%

さらっとググると、

  • puts sprintf("%.1f", 0.11111)
  • puts 0.11111.round(1)

などが見つかる。

が、String#%を使った、もっと簡単な方法があった。

puts "%.1f" % 0.11111 # => 0.1

参考) http://ref.xaio.jp/ruby/classes/string/percent http://docs.ruby-lang.org/ja/2.0.0/method/String/i/=25.html

"%.1f" % 0.1"%.1f" .% 0.1

盲点というか、勉強になったのが、 anarchy golf の解答で、

puts "%.1f" .% 0.15 * 2

のような使い方をしているものがあった。

http://golf.shinh.org/p.rb?Convert+Radians+to+Degrees#Ruby2

一瞬、何が違うのか分からなかったが、

puts "%.1f" % 0.15 * 2 # => 0.10.1
puts "%.1f" .% 0.15 * 2 # => 0.3

確かに結果が違う。 . を付けることで、計算の優先順位が変わったようだ。 よくよく考えれば、メソッド呼び出し時のカッコを省略しているので、

puts "%.1f" .% 0.15 * 2
# ↓
puts "%.1f".%(0.15 * 2)

となっている。

追記

@ebanさんから、↓に書いてあると教えていただいた。

Rubyist Magazine - るびまゴルフ 【第 2 回】

ちゃんと勉強してないことが露呈した...

PICTとjoでテストケースをJson形式で作る

はじめに

PICTは、Microsoft製のPairwise法でテストケースをいい感じに絞り込んでくれるコマンドラインツール。 詳しくは↓記事を参照。(私がPICTの存在を知ったきっかけ) qiita.com

で、このPICTの出力は tsv 形式なので、 まあそのままでもテストケースとしては十分に扱いやすい。

ただ、せっかくだから Json 形式にしてあげたい。 そこで jo コマンドを使ってみた。

PICTに食わせるファイル(モデルファイル)

DATA1: A, B, C
DATA2: 1, 2, 3

pictでくみあわせ作成

$ pict a.txt
DATA1   DATA2
A   3
A   2
B   3
C   2
B   1
C   1
B   2
C   3
A   1

作りたい json

[
   {
      "DATA1": "A",
      "DATA2": 3
   },
   {
      "DATA1": "A",
      "DATA2": 2
   },
   {
      "DATA1": "B",
      "DATA2": 3
   },
   {
      "DATA1": "C",
      "DATA2": 2
   },
   {
      "DATA1": "B",
      "DATA2": 1
   },
   {
      "DATA1": "C",
      "DATA2": 1
   },
   {
      "DATA1": "B",
      "DATA2": 2
   },
   {
      "DATA1": "C",
      "DATA2": 3
   },
   {
      "DATA1": "A",
      "DATA2": 1
   }
]

試行錯誤の結果

$ pict a.txt \
 | \ # awk で "jo DATA1=A DATA2=1" のような行を作っている
awk 'NR==1{for(i=1;i<=NF;i++){h[i]=$i}} NR!=1{r="jo"; for(i=1;i<=NF;i++){ r = r " " h[i] "=" $i } } $0 = r' \
 | \ # awk で作った jo コマンドを実行して {"DATA1":"A", "DATA2":1} を作っている
sh \
 | \ # jo -a で Array にしている , -p は pretty-print の意で見やすくするために使用
jo -a -p

メモ

jo -a $(jo DATA1=A DATA2=1) はうまく動くんだけど、 echo jo DATA1=A DATA2=1 | jo -a は動かない。

$ echo jo DATA1=A DATA2=1 | jo -a
["jo DATA1=A DATA2=1"]

まあ、冷静に考えれば当然で、jo -a は渡された文字列をそのまま素直に配列にしてるだけなので、 事前にjsonオブジェクトになるよう書いてあげないといけない。

つまり↓なら良い。

$ jo DATA1=A DATA2=1 | jo -a
[{"DATA1":"A", "DATA2":"1"}]

prometric(US版)でAn error has occurred, please try again later.と出たら

Appointment Verification の時にそんなエラーが出た。

私の場合はすごくショボいミスで、 住所を日本語で書いてたのが不味かったらしい。 Chromeの自動入力に任せて英語化をサボったのが悪かった。