動かざることバグの如し

近づきたいよ 君の理想に

ruby

シェルスクリプトからrbenv上のrubyを実行したい

環境 rbenv 通常rbenvは/etc/profile.dか~/.bashrcなどの読み込み時にロードされる。 が、シェルスクリプトからだとロードされないのでrbenvが無い環境扱いになってしまう。 ので、以下のように明示的にrbenvを読み込ませる必要がある。 #!/bin/bash export …

RubyのRestClientでエラー時に本文を取得したい

環境 ruby 2.5 RestClient 2.0.2 やりたいこと rubyにrest-clientというHTTPクライアントがある。 RestClientで404とか500とかエラーになった場合例外が発生してしまう。 よって以下のように例外をキャッチするようにする。 begin res = RestClient.get(url)…

Rubyでcomparison of Float with NaN failedエラー

rubyでなんかバッチ回してたら、普段見ないエラーに遭遇した rake aborted! ArgumentError: comparison of Float with -6.94 failed ウチなんも悪いことしてないのにとか思ってたけど、やっぱり悪かった 原因 NaNのせい 当然だが、rubyでは0で割ろうとする…

Rubyで特定の日が祝日かどうかを判別するメソッド

環境 ruby 2.4 やりたいこと 業務処理とか書いてて、特定の日が出勤日かどうか判別したい時がある。 ここでいう出勤日というのは 月曜日〜金曜日 勤労感謝の日とか元旦とかの定められた祝日ではない を指す。 それをtrue/falseで返してくれるメソッドがほし…

RubyでUTF-8をShiftJISに変換するならnkfを使うべき

WindowsとかいうゴミOSを考慮するせいで、もうすぐ東京オリンピック開催の2020年に近づいたというのにShiftJISで出力したいケースがある。 .encode()使えばいいんでしょ? RubyはもともとUTF-8なのでUTF-8→ShiftJISの変換になりstr.encode(Encoding::Windows…

Rubyで配列Aの中に配列Bの値が含まれているかを確認する

1行なので解説も何もないが rubyでは[1, 2, 3].include?(3)のようにすると配列の中に特定の値が含まれているかを一発でチェックできるが、確認したい値が複数ある場合はその都度include?を実行しなければならなくて面倒 だけど > (%w"1 2 3 4" & %w"2 3").an…

Rubyの並列処理でWEBサイトの負荷テストを実行する

いわゆるWEBサイトのベンチマークはApache Benchがいちばん有名だが、いかんせんインストールしてやらなきゃいけなくて面倒 Rubyでサクッと負荷テストしてみたかったので作ってみた 環境 ruby 2.x rest-clientを使ってる コード 10並列で計1000リクエスト実…

rubyで可変長引数を受け取るメソッドに配列で引数を渡す

常識すぎるのか、ググってもなかなか出てこなかったのでメモ 可変長引数とは rubyでは仮引数名の頭に「*」をつけると可変長で受け取ることができる。 def myfunc(*args) p args end myfunc(1, "hello", true) # => [1, "hello", true] 問題点 が、ここで配列…

Rubyの高速JSONパーサーojは本当に高速なのか

rubyでJSONをパースするときはJSON.parseが一般的だがojライブラリを使ったほうが速いらしい。 ohler55/oj: Optimized JSON A fast JSON parser and Object marshaller as a Ruby gem. が、このライブラリ自体は結構昔からあるし、Ruby 2.5時代でも本当に有…

Rubyで配列内の文字数出現回数を集計する

ary.group_by(&:itself).map{|k, v| [k, v.size]}.to_h でいける irb(main):010:0> ary = %w"a b b a c" => ["a", "b", "b", "a", "c"] irb(main):011:0> ary.group_by(&:itself) => {"a"=>["a", "a"], "b"=>["b", "b"], "c"=>["c"]} irb(main):012:0> ary.g…

ダミーのGitHub芝生画像を生成するライブラリたち

はてなブログ芝生で使ったのでメモ Ruby akerl/githubchartでいける gem install githubchartをして githubchart -i example.json example.svg でおk。入力のJSONファイルはgithubchart/input.jsonを参考に。出力はSVGのみ コマンドじゃなくてRubyから呼び…

Rubyで文字列からURLのみを削除する

やり方は以下 require 'uri' text = <<~EOL 夏目漱石: http://www.aozora.gr.jp/index_pages/person148.html 森鴎外: https://ja.wikipedia.org/wiki/%E6%A3%AE%E9%B4%8E%E5%A4%96 EOL URI.extract(text).uniq.each {|url| text.gsub!(url, '')} puts text …

CentOS6にRuby 2.5.0をインストールをしたい人生だった

結論 なんとかできる ビルドできない問題 Ruby 2.5.0がリリースされて、早速ruby 2.5.0をインストールしようとしたが、 rbenv install 2.5.0 エラーになる。どうもビルドでコケるっぽい。 prelude.c: In function ‘prelude_eval’: prelude.c:204: error: #pr…

Google Compute Engine APIを叩いてインスタンス一覧をRubyで取得

やりたいこと Google Compute Engine APIを使ってインスタンス一覧をRubyで取得したい おおまかな手順は以下 認証に必要なJSONを取得 JSONを使ってgoogle-api-clientでAPIを叩く 認証に必要なJSONを取得 まずは認証に必要な権限を得るべく設定して、JSONをダ…

RubyでDateTimeの差を秒単位で取得する

DateTimeはあくまで日ベースなので単純には秒の差が取得できない 方法1 (DateTime - DateTime)はRationalになるので、1日を秒に変換した、「24 * 60 * 60」をかけて秒に変換する require "date" date1 = Date.today date2 = Date.today - 3 puts ((date1 -…

Rubyでファイル一覧を作成日時順に取得する方法

ファイル一覧取得自体はDir.globでできるので、 それをsort_byを使ってファイル更新日時順にソートすればおk Dir.glob("/data/*.json").sort_by{ |f| File.mtime(f) }.each do |file| end ただこのやり方だとファイルの数だけFileオブジェクトが生成される…

Rubyでポートが開放されているか確認する方法

単純にそのホストのポートがListenしてるかの確認はソケット接続を使うとサクッといける コード require "socket" begin s = TCPSocket.open('example.com', 80) rescue puts 'ng' else puts 'ok' ensure s.close end ポイントは2つ。 接続できなかったとき…

RubyでImageMagick使うにはMiniMagickの方がよい

画像処理の王者ことImageMagick。rubyでImageMagickを扱うには、RMagick一択だと思っていたが、最近だとMiniMagickというのもあるらしい MiniMagickのメリット メンテナンスがRMagickより盛ん 書き方がRMagickより直感的(主観 メモリの使用量が少ないらしい…

MacOSをSierraにアップデートしたらbundle install nokogiriでコケる

久々にbundle installでコケた $bundle Fetching gem metadata from https://rubygems.org/.......... Fetching gem metadata from https://rubygems.org/. Resolving dependencies... Using rake 12.3.0 Using concurrent-ruby 1.0.5 Using i18n 0.9.1 Usin…

rubyでTwitterに画像付きツイートを投稿する

一番有名なtwitter gemを利用してRubyでTwitterに画像つきのツイートを投稿するメモ 色んな人がすでに書いているが、どうもやり方が変わってるらしくてできなかった まずはGemfileにgem "twitter"に追加して以下 require 'twitter' tw = Twitter::REST::Clie…

RubyでRSS取得するときにUser-Agentを偽装する

環境 ruby 2.3 多分どのバージョンでも動く 相当古くなければ TwilogのRSSをRubyでしようとしたら403が返って取得できない。ブラウザだとちゃんと表示できてるあたり、どうもユーザーエージェントで弾いてるっぽい。 ってことで偽装すればすんなり取得で…

Capistrano+Railsでassets:precompileが実行されない件

発端 普段はRailsのデプロイにcapistrano3を使ってるんだが、デプロイしてもCSSとJSが読み込まれずに404に。。 よく見るとassets/imagesに入れた画像も404に。ローカル環境だともちろん正しく表示される。でも、Capistranoのログをよく見ると、そもそもasset…

Mechanizeでページを取得するたびにランダムなプロキシサーバーを設定

スクレイピングに便利なMechanize だけどアクセスしまくるとBANされてしまうのでプロキシを使うことで回避しようという話 環境 ruby 2.3 Mechanize プロキシサーバー2台以上 同じポートでアクセスできるようにしてあると便利である やりかた モンキーパッチ…

ActionCable使ったRailsのnginx設定

ActionCableはwebsocketを使うので通常のRailsと設定が違う。たくさんコケる要素があるのでそのメモをまとめた。 環境 Rails 5.0.3 puma Redisは今回使わない nginxの設定 upstream puma-realtime { server unix:///var/www/realtime/shared/tmp/sockets/pum…

gem install eventmachine時に「'openssl/ssl.h' file not found」とエラー

環境 Mac El Capitan Gemfileに 症状 gem install eventmachine ができない gem "eventmachine" でbundle instrallすると Using ref 1.0.5 Using sass 3.2.14 Using simple_oauth 0.3.0 Using elasticsearch-api 1.0.1 Using thread_safe 0.2.0 Using airbra…

【Mac】Rails consoleで日本語が入力できない問題

症状 rails cでRailsのコンソールが開くけどここで日本語が入力できない(文字化けする) これはRailsにかぎらずpryやirbでも同様な文字化けが発生する 原因 入力された文字をirb側に渡すライブラリがデフォルトだと「libedit」というやつだが、コイツが日本…

【Ruby】bundleコマンド叩くとbad interpreter: No such file or directoryとエラーになる件

発端 rubyで開発する際にbundleコマンド使うじゃないですか、bundle installとかにつかうアレ。 あれをRaspberry Piで使おうとしたら pi@raspberrypi:~ $ /bin/bash -lc 'cd /home/pi/hoge && bundle exec ruby save.rb' /bin/bash: /usr/bin/bundle: /usr/b…

Raspberry Pi用RubyをUbuntuでクロスコンパイルしたい人生だった

依存ライブラリのインストール 公式ドキュメントを参考にするといいかも このライブラリたちはクロスコンパイル関係なしにRubyのビルドに必要 sudo apt-get update sudo apt-get install -y git autoconf bison build-essential libssl-dev libyaml-dev libr…

Rubyで指定文字の出現回数をカウントするときは注意が必要

例えば以下の文章があったとする。 当職の弟を当職が殺したなどという当職のアイデンティティを否定する投稿が多数なされておりました。 当職の弟は厚史という名前でした。一つ違いの弟でした。喧嘩もしましたが、私にとってのかけがいのない弟でした。 弟は…

Rubyで行列の回転を行いたい

ぶっちゃけまとめ def display mat mat.each do |row| puts row.join(' ') end puts end matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] display matrix display matrix.reverse.transpose #=> 右回転 display matrix.transpose.reverse #=> 左回転 display ma…