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の自動入力に任せて英語化をサボったのが悪かった。
直前のコマンドをクリップボードにコピー
直前のコマンドをクリップボードにコピーするaliasを設定した。
alias yy='fc -ln -1 | pbcopy'
Linuxには pbcopy コマンドがないので、
if [ "$(uname)" != 'Darwin' ]; then apt install xsel grep "^alias pobcopy.*" ~/.bash_aliases || echo "alias pbcopy='xsel --clipboard --input'" >> ~/.bash_aliases fi
こんな感じで xsel コマンドをインストールしてる。
Debian系しかフォローしてないひどいあれですが。
Ruby Kaigi Day1 行ってきた
行ってきた。
場所は汐留。新橋駅から歩いて10分くらい。
朝、役所に用事があって行ってたので間に合うか不安だったけど、なんだかんだ30分前には着いた。 朝の時点でサイン対象の本が販売されていて、APIデザインとメタプログラミング買った。超絶技巧はサイン込みで持ってた。 その上二冊の分厚い本に加えて、Tシャツとパーカーも鞄の中に突っ込んだのでパンパンに。
MatzのKeynoteは、80%くらい Ruby ConferenceとRebuildの内容だったので、だいたい分かってる上で聞いてた。そのせいか会場の空気感と外れてしまったのがもやもや。
==~
でヒアドキュメントのインテントを消してくれるのは知らなかった。これは便利そう。
フォードとアランケイのくだり(求められたものではなく、必要とするもの・されるものを作ろう)はすごく心に刺さった。
2.3.0さっそく使おうとしたけど、ruby-buildではまだ対応してなかったので、初めて自分でコンパイルすることに。 せっかくだから rbenv で管理できるようにスクリプト化したけど、Dockerでやってるよ、という人もいて、その手もあったかという感じ。確かに、そろそろMac上で手軽にUbuntuとかCentOSとか触りたいし、導入進めようかなぁ。
続いて、すっごくコアな、Rubyのコンパイルの話やdid-you-meanの仕組みの話などなど聞いた。 テンプレートエンジン戦争とか。
最後の、RubyTrickはすごかった。時間を見つけて解析してみたい。
fcコマンドとpbcopyコマンド
最近、 fc
コマンドを知った。
Windowsの比較コマンドではなくて、Linuxの、コマンド履歴を出力する方。
つまりは history
と同じ。
history
も fc
も、ShellのBuild-inコマンド。
$ type fc fc is a shell builtin
ちなみにうちの環境は、oh-my-zsh入れてるので、history
はfc
のaliasになってる。
$ type history # oh-my-zsh/lib/history.zsh によるもの history is an alias for fc -l 1
fc
だけ打つと、直前のコマンドが実行される。
実行される前に、 Editorが立ち上がり、 /tmp/
以下にファイルが作られて開かれる。
開かれたファイルには、直前のコマンドが入力されている。
このコマンドを編集して保存して終了すれば、直前のコマンドに手を加えて実行することができる。
ちょっと気持ちよくワンライナー書いた後に、修正したくなった時に使うと便利かもしれない。
history
コマンドと同等の出力もできる。
fc -l [数値]
で出力する履歴の数を制御できる。1 だと全て。-1 だと直近1つ。
$ history | tail -n 2 1493 type fc 1494 history $ fc -l -2 1494 history 1495 history | tail -n 2
数値を並べると、逆順にもできる。tac
しなくていい。
$ fc -l 3 1 3 echo $ZSH 2 pwd 1 ls
-n
つければ、番号が消える。
$ fc -ln 3 1 echo $ZSH pwd ls
もともと、fc
を知ったのは、入力したワンライナーをクリップボードにコピペしたかったから。
pbcopy
と組み合わせて、
$ fc -ln -1 | pbcopy
とすれば良い。