Ruby

数字を3桁ずつ区切る

通貨みたいな表示 1234567890.to_s.reverse.split(/(\d{3})/).select{|i|i.size>0}.join(',').reverse => "1,234,567,890"1234567890.to_s.reverse.gsub(/(\d{3})/,'\1,').reverse => "1,234,567,890"

公開したgemをrubygems.orgから削除する

yankコマンドはgemcutterに入ってたのか gem install gemcutter gem yank goldfish-poi -v 0.0.1 名前とバージョンを指定いて削除する

Hashie::Mashおかしい

(解決した、下に書いた)これ実行すると #!/usr/bin/env ruby require 'rubygems' require 'hashie' arr = Array.new 3.times do |i| arr.push Hashie::Mash.new(:count => i, :text => 'test'*i) end arr.each do |i| p i puts "count : #{i.count}" puts …

gemを全て新しいRubyに入れなおす

rvmで、新しいrubyに乗り換える時によくやる。ruby-1.8.7-p352 → 1.8.7-p358にしたとする。 rvm get latest rvm reload rvm list known rvm install 1.8.7-p358 gem listを保存しておいて gem list | ruby -lane 'puts $_.split(/\s/)[0]' > ~/gems.txt あた…

mini_magickとImageMagickで画像を切り取る

capybara-webkitで撮影した縦長のwebページスクリーンショット(PNG)を、1:1.41のA4縦長で印刷できるサイズ(JPEG)に分割する。 https://github.com/probablycorey/mini_magick brew install imagemagick gem install mini_magick mini_magick版 #!/usr/bin/en…

画像をpdfファイルにまとめる

今までhomebrewで入れれるpdfjamを使っていたのだが、macportsにしかないpdflatexに依存しているのであまり使いたくない。 prawn(https://github.com/prawnpdf/prawn)を使うとRubyだけで作れるので、乗り換えることにした。 prawnはpngを入れると遅くなるの…

capybara-webkitでwebページのスクリーンショットを撮る

capybara使うと簡単にキャプチャできる。もともとjsのheadless testの為のツールなのでjsも実行されるし良い。 Macの場合 brew install qt gem install capybara capybara-webkit #!/usr/bin/env ruby require 'rubygems' require 'capybara-webkit' driver …

diffをファイルに書き出し

commitのdiffをgrepしたいのだが、gitだけで検索する方法がわからなかったのでとりあえず~/diffに全commitのdiffを書きだした mkdir ~/diff git log | grep '^commit' | ruby -lane 'puts $F[1].strip' | ruby -lane 'arr=ARGF.to_a.map{|i|i.strip}; for i …

ある日付のcommitのIDだけ抜き出す

git-id-date.rb #!/usr/bin/env ruby require 'date' if ARGV.size < 1 STDERR.puts "ruby #{$0} 2011-08-15" STDERR.puts "ruby #{$0} 2011-08-15 2011-09-30" exit 1 end date_start = Date.parse(ARGV.shift) date_end = ARGV.empty? ? Date.today : Date…

camelcaseとsnakecaseの変換

いろいろ丁寧に変換するようにした --to_snake 'ShoHashimoto' => 'sho_hashimoto' 'sho_hashimoto' => 'sho_hashimoto' 'shokai' => 'shokai' 'SHOKAI' => 'shokai' 'This is a pen' => 'this_is_a_pen' 'EventMachine::HTTPRequest' => 'event_machine_htt…

8queen問題

http://ja.wikipedia.org/wiki/エイト・クイーンすげー悩んだけどわりと綺麗にできた。 再帰+lambda渡しは再帰を巻き戻さないで良いので書きやすい。 変な書き方しないようにしたけど20行きった。 #!/usr/bin/env ruby def put(size=8, queens=[], &block) b…

清一色の配牌パターン数を調べる

mlab(masui lab)はmajan labになりました。 清一色の配牌パターン数を調べる。 1が0〜4枚、2が0〜4枚...9が0〜4枚、で合計14枚になるのが正しい配牌なので、ならば富豪的に5進数を使おうchin-itsu.rb for i in 0..(("4"*9).to_i(5)) res = i.to_s(5) puts '0…

curlでbasic認証を通る

http://curb.rubyforge.org/classes/Curl/Easy.html open(out_fname, 'w+') do |out| Curl::Easy.perform(url) do |easy| easy.http_auth_types = [:basic, :digest] easy.username = 'shokai' easy.password = 'homuhomu' easy.on_body do |data| out.print…

ダウンロード速度が遅かったらやめる

http://curb.rubyforge.org/ Ruby+Curlで大きなファイルをダウンロードしつつ、速度を監視して遅かったら切断する。 ダウンロード速度はだんだん上がってくるものなので、開始後しばらくは遅くても切断しないようにした。 普通にeasy performしても大量のwar…

nまでの素数を求める

みょうにシンプルにできたので書いておく ruby -e 'p 2.upto(ARGV[0].to_i).to_a.delete_if{|i| 2.upto(i/2).to_a.detect{|j|i%j == 0} }' 2000[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103…

openssl1.0が落ちる

Rubyを入れなおした直後からこういうエラーがでるようになった openssl/ssl-internal.rb:30: [BUG] Segmentation fault openssl1.0とリンクしたRubyをビルドしてしまうとこうなるらしい。 http://www.cozmixng.org/~w3ml/index.rb/rabbit-shockers/msg/793Ma…

LaTeXフォーマットがshift_jisなのでutf8に変換した

brew install nkf ruby convert_utf8.rb /path/to/source /path/to/dest convert_utf8.rb #!/usr/bin/env ruby if ARGV.size < 2 STDERR.puts "ruby #{$0.split(/\//).last} /path/to/source /path/to/dest" exit 1 end src = ARGV.shift dest = ARGV.shift …

memcached gemインストール

gem install memcached すると rlibmemcached_wrap.c:13285: error: ‘SASL_OK’ undeclared (first use in this function)というエラーでビルドできない libsasl2を入れたら通った sudo apt-get install libsasl2-dev libmemcached-dev libmemcache-dev gem i…

http-post parameterをそのまま取る

post '/' do p env['rack.request.form_vars'] end postした値のname=shokai&location=hogeみたいなのをkey=valueにparseせずにそのまま取り出して使いたい時に便利 curl -d 'こういうのがそのまま渡せる' http://localhost:8080/

UDP

UDPSocket.openすると適当に50000番台の開いているportにbindされる eventmachineでopen_datagram_socketする時は、自分で開いているportを指定する sender.rb #!/usr/bin/env ruby require 'socket' sock = UDPSocket.open loop do sock.send(Time.now.to_s…

bookscanのチューニング後の本の名前を変更する

kindle4_本の名前.pdf という名前が並んでいると見づらいので、 kindle4/本の名前_kindle4.pdf にする。 #!/usr/bin/env ruby dir = '/home/sho/share/books' pattern = /^(ipad|kindle\d|iphone4)_(.+)\.(.+)$/ files = Dir.glob(dir+'/*/*.pdf').map{|f| {…

Ree1.8.7をLionにインストールする

export CC=/usr/bin/gcc-4.2 rvm install ree-1.8.7 CCのpath通しておかないとビルド失敗する。 Cant install Ruby Enterprise Edition with RVM on OSX Lion - Stack Overflow

gemspecの日付がおかしい

system gemにmongoid2.2.0をインストールした rvm use system sudo gem install mongoid で、入ってるか調べたら gem search mongoid 入ってなかった。 Invalid gemspec in [/usr/lib/ruby/gems/1.8/specifications/mongoid-2.2.0.gemspec]: invalid date fo…

エラー

status 404 @mes = {:error => 'not found'}.to_json すぐ処理終わらせてレスポンス返したい時は throw(:halt, [404, {:error => 'not found'}.to_json]) よく忘れる

crontabでrvmのrubyを使い分ける 改良版

http://d.hatena.ne.jp/shokai/20110603/1307052038 で書いたものの改良版。 前のよりすっきり書ける cronの1スクリプト毎の実行時間制限にひっかからない いろんなバージョンのrubyを使い分けやすい などのメリットがある まず rvmrun というshellscriptを…

libnfcでタグを読む

IOデータのNFCリーダーでmifareのタグ読めた。 ぴタッチ(USB2-NFC) | ICカードリーダー(NFC) | IODATA アイ・オー・データ機器 brew install libnfc gem install nfc #!/usr/bin/env ruby require 'rubygems' require 'nfc' loop do NFC.instance.find d…

base64

base64でファイルを転送しようと思っているのでちょっと調べる #!/usr/bin/env ruby require 'base64' total_bin = 0 total_enc = 0 ARGV.each{|file| puts "--- #{file}" bin = File.open(file).read puts "binary => #{bin.size}" total_bin += bin.size e…

ネットワークカメラの画像を監視

研究室のOB降臨システムのカメラの画像をhttpで取得できるので、監視したい imagemagick付属のconpositeとidentifyコマンドが必要参考:2枚の画像のdiff(差分)を超簡単に調べる方法 - 床のトルストイ、ゲイとするとのこと img_watch.rb #!/usr/bin/env rub…

skypeをmarqueeさせる

直前の発言を上キーで編集できるので #!/usr/bin/env ruby require 'rubygems' require 'applescript' script = 'tell application "Skype" activate end tell' AppleScript.execute(script) def right script = 'tell application "System Events" tell app…

LAN内にgrowl通知

gem install ruby-growl #!/usr/bin/env ruby require 'rubygems' require 'ruby-growl' ADDR_BASE = '192.168.0' (1..255).each do |i| Growl.run ['-H', "#{ADDR_BASE}.#{i}", '-m', 'ほむ', '-t', 'title'] end リモートアプリケーション登録を許可