野良 Gem 'Utils'

RubyGems.org には上げていませんが、Bundler を使って GitHub からインストールできる Gem(野良Gem)です。

Gemfile に

gem "utils", github: 'obelisk68/utils'

を追加して、$ bundle install でインストールされます。詳細は下。
GitHub - obelisk68/utils
アップデートは $ bundle update utils。
 
 

この Gem の使い方

require 'bundler/setup'
require 'utils'


使い方というか、いつも僕が使っているコードの寄せ集めです。自分用。

Utils.imgexist?("http://www.ninjintei.jp/onetyan/image1203.jpg")    #=>[1016, 1476]

で url の先が画像かどうかを判断します。画像が存在すればそのサイズが配列で返り、存在しなければ nil が返ります。

"http://www.ninjintei.jp/onetyan/image1203.jpg".imgsuffix    #=>".jpg"

は String#imgsuffix で、文字列の最後が画像の識別子ならそれを返し、そうでなければ空文字列を返します。

Utils.getfile(url, "image.jpg")

は url の先をダウンロードします。後の引数は保存されるファイル名です。バイナリ・ファイルも DL 可能です。

[2, 3..5, ["a", "b"]].nest_loop {|i, j, k| print "#{[i, j, k]}  "}; puts

は簡単に多重ループを作ります。ここを参照。

p "327865".pickup(2, nil)    #=>"7865"
p [3, 2, 7, 8, 6, 5].pickup(-1, -4, -1)    #=>[5, 6, 8]

Python のスライスの Ruby 実装です。ここを参照。


※追記
さらに機能を追加しました。

p "12345678".separate(3)

は String#separate(n) で、文字列をあらゆる組合せで n 分割し、すべての組合せを配列に入れて返します。ここを参照。(※追記 ブロックがある場合はそれを実行、ない場合は Enumerator を返すようにしました。)

loop_with_index {|i| print "\e[1G#{i}  "; sleep(0.5)}

は Kernel#loop_with_index で、インデックス付き無限ループです。ここを参照。

p ("10.(952)".to_r + "5.26(3)".to_r).to_rec_decimal    #=>"16.21(628)"

は String#to_r のオーバーライドと、Rational#to_rec_decimal で、循環小数を扱います。ここを参照。

p 150.divisors_int    #=>[1, 2, 3, 5, 6, 10, 15, 25, 30, 50, 75, 150]

は Integer#divisors_int で、約数を配列で返します。ここを参照。


機能追加(2/27)

p 3.0.integer?    #=>true

は Float#integer? で、レシーバーの小数点以下が 0 なら true、それ以外は false を返します。

p Array.make([2, 3], "a")    #=>[["a", "a", "a"], ["a", "a", "a"]]

は Array.make(ar, ob) で、多重配列を簡単に作成します。ar は Array、ob は初期値(省略可能)ですが、初期値は Array.new とちがって、ob のコピーが入ります。ここを参照。


機能追加(3/11)

p Utils.key_wait

はキーボードからの一文字入力です。

[[1, 2], [3, 4]].deep_copy

は Object#deep_copy で、オブジェクトのいわゆる「ディープコピー」をします。

p 5.factorial    #=>120

は Integer#factorial で、階乗を返します。

p Utils.time_lexic    #=>"kimgfpxtuzl"

はマイクロ秒まで採った現在時刻を、アルファベットの辞書順になるように変換して、String で出力します。ここを参照。


機能追加(4/23)

a = [1, 5, 9, 1, 6]
a.change(1, "a")    #=>["a", 5, 9, "a", 6]
a.change!(1, "a")

は Array#change(a, b) (change! は破壊的メソッド)で、配列のすべての要素 a を b に置き換えます。

p Utils.permutation(4, 2)    #=>12
p Utils.combination(4, 2)    #=>6

は順列と組み合わせを求めます。


機能追加(7/29)
末尾再帰を回避するメソッドを2つ、Utils.trcall と Module#tco を追加しました。詳細はここを参照して下さい。


機能追加(11/10)

p "test".flow {|x| x.upcase}.chars    #=>["T", "E", "S", "T"]

Object#flow は self をブロック内で処理して最後の値を返します。

p "te*st".fname_filter   #=>"test"

String#fname_filter は self に含まれているフォルダ名・ファイル名に使っていけない文字を取り除いて返します。破壊的メソッド。

p nil.nil_trans([])    #=>[]

Object#nil_trans(obj = "") は self が nil ならば obj(デフォルトは "")を返し、それ以外なら self 自身を返します。

Counter.make(:count, 100, -4)
10.times {puts count}

Counter.make はカウンターを作ります。詳細はここを参照して下さい。

{:A=>0, :B=>2, :C=>0}.collect_keys(0)    #=>[:A, :C]

Hash#collect_keys(ob) は、ob の値を持つキーをすべて集めて配列で返します。詳細はここを参照して下さい。

{1=>2, 3=>4, 5=>6}.map_to_h {|k, v| [k, (v ** 2).to_s]}    #=>{1=>"4", 3=>"16", 5=>"36"}

Hash#map_to_h は、Hash#map して返り値を to_h します。


機能追加(2017/1/24)

5.times_retry(message: true, wait: 1) {raise "test error"}

Integer#times_retry はブロック内でエラーが起きた場合 n 回リトライし、それを超えた場合は停止します。詳細はここを参照。


機能追加(2017/2/10)

Utils.progress_bar do |bar|
  for i in 0..20
    bar.fraction = i / 20.0
    sleep(0.5)
  end
end

Utils#progress_bar は GTK+ で簡単にプログレスバーを使います。詳細はここを参照。


機能追加(2017/2/12)

Utils.delete_non_img("text")    #=>true

Utils.delete_non_img は画像ファイルでなければ削除します。詳細はここを参照。


機能追加(2017/6/8)

Utils.delete_empty_folder('pictures')

Utils.delete_empty_folder は指定したディレクトリの空フォルダを削除します。

Utils.bell

Utils.bell はベルを鳴らします(Ubuntu)。