野良 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)。