動かざることバグの如し

近づきたいよ 君の理想に

ruby

Rubyは何故 if else ではなく if elsif なのか

背景 例のごとくツイッターしてたらこんなツイートが流れてきた。 rubyきもelseifをなんでelsifって書かないとだめなん?Matzさんには悪いけど、これは嫌だ— ぬーばー またの名をぴろまね (@noober_ava) August 14, 2019 これは他の言語やってて、そのあとに…

RubyでSelenium+Capybaraで簡単スクレイピング

環境 Ruby 2.x Capybara 3.28.0 やりたいこと Selenium構文ツラいからCapybara使いたい人生だった(使った require "selenium-webdriver" require "capybara" require "capybara/dsl" include Capybara::DSL Capybara.configure do |capybara_config| capyba…

RubyでHeadless Chromeを操作してスクレイピング

環境 ruby 2.5 概要 RubyでスクレイピングするならMechanize一択だが、昨今のサイトではJavascriptが動かないとデータが取れないサイトも多い。 PhantomJSが死んでしまった今、Headless Chromeが1番いいのだが、Puppeteerはちょっと、、て時にRubyでやりた…

AWSを使ったRspecテストにはモックを使うと簡単

環境 Ruby 2.6 AWS SDK for Ruby V3 やりたいこと Rubyを使ってS3とか扱うこと全然あると思う。例えば以下はバケット一覧を取得して表示するコード require 'aws-sdk-s3' client = Aws::S3::Client.new( region: 'ap-northeast-1' ) bucket_data = client.li…

Rubyで外部コマンドを実行するならopen3が1番よさそう

環境 ruby 2.5 やりたいこと Rubyでは様々な方法でコマンドを実行できるが、1番シンプルなのはバッククオートを使う方法だと思う p `date` # dateコマンドを実行 これは本当に楽なのだが、欠点が一つあって標準出力は取れるが、標準エラー出力、さらに結果…

RubyKaigiのRubyDebugCheatSheetで気になったやつ

NaCl(オープンソース・フロンティア - ネットワーク応用通信研究所)さんが配ってたRubyのデバッグに使えるテクニック集。 コードに書き起こしておいたほうが、コピペもしやすいと思うのでメモ ppでオブジェクトと整形表示 メソッドがある事自体は知っていた…

Mac Mojaveでgem install nokogiriのインストールでエラーになる対処法

毎回忘れるのでいい加減備忘録 環境 MacOS Mojave Ruby 対処法 NOKOGIRI_USE_SYSTEM_LIBRARIES=1 bundle install するだけ 偉大な参考サイト 【Ruby2.0.0 or 1.9.3 on Rails4.0】 Nokogiri 1.6.0 インストールできない?! - TACATAKATACA BLOG

Pumaより速い「Falcon」を試す

RubyKaigi 2019のスライドでちょっと話に出てたので初めて知った 試してみる Falconとは Railsに使うミドルウェアといえば、Unicorn、Pumaあたりが有名だが、falconはわりと新興である。 速さの秘訣は Unicorn マルチプロセスで(Webrickよりかは)速い Puma…

RubyからPythonのMatplotlibグラフを生成する

Rubyでも簡単にグラフ画像を生成したい人生だった やりたいこと RubyからMatplotlibのグラフ画像を生成する。 Rubyでグラフ生成ならtopfunky/gruffが有名だが、最近はあまりメンテされてる感じがないし、どうせならMatplotlibの知見を活かしたい 環境 Ruby 2…

RubyでFile.read()を使うときは注意が必要だった(過去形)

まとめ Ruby 2.6以前ではFile.read()の引数に|から始める文字列を渡すと、それがそのままコマンドとして実行されてしまう ので、WEBアプリケーションで第三者から受け取ったパラメータをFile.read()に渡すのはセキュリティ的に危険 Ruby 2.6.0で修正されたの…

RubyのREXML::Document でXMLをパースする

rubyでXMLを扱いたい人生だった 環境 Ruby 2.5 概要 RubyでXMLをパースする手段はいろいろあるが、ここでは特にライブラリを追加インストールすることなく、標準ライブラリだけで実行可能なREXML::Documentを使うことにした。 で「ruby XML」でググると一番…

jemallocを有効化したRubyをインストールしてRailsで使う

環境 Ruby 2.6.2 Rails 5.1 概要 Ruby、特にRailsだとけっこうメモリ大食いマンになる傾向がある。(Chromeのことを笑えないぐらいには で、いろいろググってたらjemallocを有効にしらRubyだとメモリの消費が減るらしい。ってことで試してみた。 ただしRuby…

Capistrano3でdefault_envとかwithinが効かないとき

環境 Capistrano 3.11 症状 Capistranoは非常に便利なデプロイツールで、Railsをデプロイするなら必須だと思う。いろいろ機能があって、その中でもdefault_envでexecuteするときの環境変数を設定できたり、withinでそのディレクトリの中で実行とかできる。。…

rbenvでインストールした全バージョンのrubyに一括gem installするスクリプト

何がしたいか VS codeを使うようになったんだけど、Rubyの保管をするために拡張機能でsolargraphをインストールした castwide/vscode-solargraph: A Visual Studio Code extension for Solargraph これは非常に便利で、まぁruby書くなら必須拡張機能だよね、…

AWS Lambda RubyとAPI GatewayでSlackへ投稿するAPI作る

完成コード require 'json' require 'slack-notifier' def hello(event:, context:) begin if event.dig('queryStringParameters', 'message').nil? raise "require message" end notifier = Slack::Notifier.new( "HOOK_URL", channel: "#speed_test", user…

RubyのCSVの読み込みを高速化したいならバージョンを今すぐ上げろ

Q. RubyのCSV読み込みが遅い A: Rubyのバージョンを2.6以上にしろ 以上 理由 なぜRubyのバージョンを上げるとCSVのパースが速くなるのか。理由は単純で効率化されているから 以下のサイトがめっちゃ詳しく解説している。 www.clear-code.com 実際にベンチマ…

Rubyで並列処理するなら parallel 一択

使用例 require 'parallel' require 'open-uri' array = Parallel.map(1..10, in_threads: 2) do |num| num ** 2 end p array すでに先人様が解説してくださってるので詳しいことは書かない 使い方の解説 【Ruby】Parallelで並列処理 - しめ鯖日記 勘所 Ruby…

Rubyで配列をn分割する方法

スプラで待機している最中に考えてた。 その時は自分含めて5人いて、2人と3人にチーム分けしたかったのだが、それをRubyの1ライナーでやりたい。どうしようか 5人をAさん〜Eさんとする。ここまでは共通だと思う。 %w(Aさん Bさん Cさん Dさん Eさん).sh…

Capistranoで使えるshared_pathとかcurrent_pathの変数一覧

環境 Capistrano 3.11 current_pathとかshared_pathとかユーザーがsetでセットする変数とは別に、最初から定義されている便利な変数もいくつかある。これをうまく活用するとタスクがスッキリするのでメモ 変数一覧 変数名 例 deploy_to /var/www/article_vot…

Capistrano3系でgit submodulesを使ってデプロイをする

環境 Capistrano 3.11 最近はめっぽう聞かないが、gitにはサブモジュール(git submodules)という機能がある。 この機能自体は便利なんだろうけど、それをCapistrano経由でデプロイしようとすると厄介な話になってくる。というのもCapistranoはgit submodul…

スクレイピングツールMechanizeでリンク先の絶対URLを取得する方法

mechanizeとは言わずとしれたRubyのスクレイピングツールである。 で、例えば以下のようにページ内のaタグからリンク先のURLを取得したいとする。 url = "https://stackoverflow.com/questions/34471102/python-nameerror-name-include-is-not-defined" agen…

Rubyで複数のバージョン(version number)をソートしたい

かなりニッチなニーズかもしれないけどメモ やりたいこと 例えば以下のようなバージョンの配列があったとして versions = ["1.1", "2.0", "1.1.4", "1.6", "2.4.1"] これを古→新順にソートしたいとする 解決策1 ライブラリを使う 探したらあった なんとGith…

シェルスクリプトから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] 問題点 が、ここで配列…