simanのブログ

ゆるふわプログラマー。競技プログラミングやってます。Ruby好き

今年作った gem の紹介 (2017)

この記事は Okinawa.rb Advent Calendar 2017 4日目の記事です。

自分は思いついたアイデアをすぐ gem にするようにしているのですが、今年は結構作った気がしたのでそれを紹介したいと思います。

spellcheck

主に技術系の単語にフォーカスしたスペルチェッカー、スペルミス候補を全部 Hash データで管理していてそれを増やすのが面倒になって放置。

サンプル (aplication がタイポしている

hello world.
I create aplication now.
good bye
$ spellcheck example.md
+----------+--------------------------+------------+-------------+
| Location | Text                     | Pattern    | Expected    |
+----------+--------------------------+------------+-------------+
| 2        | I create aplication now. | aplication | application |
+----------+--------------------------+------------+-------------+

result: 1 typo found.

typogen

英語の typo を生成するコマンド。

前に qiita で紹介したことがあるので詳しくはこちら。

https://qiita.com/siman/items/e3c8dfb72e37142b0b86

spellcheck の辞書データを作っていた時に、typo したときの単語一覧を手入力するのが面倒になった作成した。

$ typogen install
nstall
istall
intall
insall
instll
instal
nistall
isntall
intsall
insatll
instlal
instale

ripper_tree

rubyRipper.sexp の表示を tree コマンド風で表示させる。

$ rtree -e "1+2*3"
:program
 └──── :binary
         ├──── :@int ["1"] 1:0
         ├──── :+
         └──── :binary
                 ├──── :@int ["2"] 1:2
                 ├──── :*
                 └──── :@int ["3"] 1:4

今年作った gem の中では一番使っている。

tspec

TracePoint を使って Ruby で型チェックが出来るようにした gem。

require 'tspec'

def echo(str)
  puts str
end.receive(str: String)

echo('hello world') #=> ok
echo(123)           #=> TSpec::ArgumentTypeError
require 'tspec'

def echo(val)
  puts val
end.receive(val: [String, Float])

echo('hello')  #=> ok
echo(3.14)     #=> ok
echo(123)      #=> TSpec::ArgumentTypeError

ただ、挙動がちょっと怪しいので自分でも使うのをためらっている。

jt

JSON を tree コマンドっぽく表示させる gem

https://qiita.com/siman/items/a59a7ac80fba3e71ed38

rrpn

逆ポーランド記法の計算機と変換器

https://qiita.com/siman/items/d72854c4c4aaaf452868

rpn名前空間ほしかったけど取られていた。(残念

hrm

ヒューマンリソースマシーンに出てくる命令を実装したもの。メモリの初期状態を設定するコードは実装していないかも。

ヒューマンリソースマシンは完全クリアした(ドヤァ

rodir

Ruby のオブジェクト継承ツリーをディレクトリっぽく扱うもの

$ rodir
Ruby@2.4.0 /BasicObject$ ls
<M>   #<Module:0x007fb11a911388>
<M>   Kernel
Ruby@2.4.0 /BasicObject$ cd Kernel
Ruby@2.4.0 /BasicObject/Kernel$ ls
<C>   Object
Ruby@2.4.0 /BasicObject/Kernel$ cd Object
Ruby@2.4.0 /BasicObject/Kernel/Object$ pwd
BasicObject/Kernel/Object

実際に触ってみて 5分で飽きた。

open_class_alarm

オープンクラスに警告を出す gem

https://qiita.com/siman/items/cbc7b85ff45eb5fc58d5

いらない

proc_source

Proc オブジェクトのソースを表示する。

https://qiita.com/siman/items/9ad676cbb4f8afbd15ac

a = -> { 'hi' }
puts a.proc_source
-> { 'hi' }

lier

? で終わるメソッドの返り値を全て逆にする

https://qiita.com/siman/items/475d355fe22e34659149

エイプリルフールネタで作った。テストするときに rspec が壊れてやばかった。(Refinements で影響範囲を限定させた

rtg

Ruby で作ったタイピングゲーム

f:id:simanman:20171204191426g:plain

自分のコンソールの画面に合わせた配色にしたので、場合によっては文字が見づらいかも。

keyevent

keyevent を取得する gem。(Windows では試していない)

require "keyevent"

while input = getkey
  break if input == "Q"

  p input
end

rtg を作っていた時に分離できそうだったので分離した。

まとめ

結構 gem を作ってた。(使ってるとは言ってない