プログラミング -> 言語 -> Ruby

Ruby で "sh" を実行しようとしたら Not Found と言われたとき

結論 require 'rake' をする。 公式ドキュメント docs.ruby-lang.org

Ruby で Time.parse しようとすると undefined method `parse' for Time:Class のエラーが出るとき

結論 require 'time' する。

Ruby で Google::Apis::DriveV3 を用いて Google Drive のファイルを操作する方法

前提条件 サービスアカウントを用いて認証を行うとします 使う gem google-api-client google-apis-sheets_v4 でもいいですが、名前が適切な方が誰からも分かりやすいので google-api-client がよいと思います 注意事項 当該ドライブ(フォルダ等)に、サー…

Ruby で インスタンス変数 に File.open を格納して複数のメソッドで each_line したらハマった

結論 こんな感じに書くと、Hoge#bar では期待通りの挙動*1にならないです。 class Hoge def initialize @file = File.open('/path/to/piyo.txt') end def foo @file.each_line do |line| puts line end end def bar @file.each_line do |line| puts line end…

macOS で Bundler で pg gem をインストールしようとする際に Can't find the 'libpq-fe.h' header というエラーが出る場合の対処方法の一つ

前提 Intel Mac pg のバージョンは 1.4.6 Ruby のバージョンは 3.2.2 PostgreSQL のバージョンは 15 結論 bundler の config にて、build.pg に対して --with-opt-dir="/usr/local/opt/libpq" を設定する。 具体的な設定方法 設定方法は 2つ あります。 1. b…

Nokogiri や REXML で "entity expansion has grown too large" エラーが出るときの対処方法

結論 XML がでかすぎるのが原因なので、上限を引き上げましょう REXML::Document.entity_expansion_text_limit の値を増やします。単位はバイトで、デフォルト値は 10240 (10KB) です REXML 配下なので require 'rexml/document' が必要になることがあります…

巨大な XML(XMLファイル)を Nokogiri で取り扱うときは Nokogiri::XML::Reader を用いる

結論 たとえば、数GBある XML ファイル sample.xml があったとします*1。 これを以下のように読み込むとエラーになります*2。 xml = Nokogiri::XML.parse(File.open('sample.xml')) なので、そのような場合には Nokogiri::XML::Reader を以下のように用いま…

M2 Mac で rbenv install 3.2.1 にて configure: error: something wrong with LDFLAGS エラーが出たときの対処方法の一つ

前提 macOS 13.2.1(22D68) uname $ uname -a Darwin FOOBAR.local 22.3.0 Darwin Kernel Version 22.3.0: Mon Jan 30 20:38:43 PST 2023; root:xnu-8792.81.3~2/RELEASE_ARM64_T8112 arm64 Xcode $ pkgutil --pkg-info=com.apple.pkg.CLTools_Executables …

Cloudflare R2 の 署名付きURL の取得を Ruby の AWS の gem を用いて実現する

MinIO の場合とほとんど同じです。 obel.hatenablog.jp 事前準備 「R2 API トークンの管理」から、トークン(アクセスキーとシークレットアクセスキー)を予め作成しておきます 「エンドポイント」は https://アカウントID.r2.cloudflarestorage.com/ になる…

MinIO の 署名付きURL の取得を Ruby の AWS の gem を用いて実現する

少しだけ注意する点がありますが、それ以外はいつもどおりです。 結論 必要な gem aws-sdk nokogiri nokogiri でなくとも ox や oga や libxml や rexml でもいいです nokogiri を選んだ理由は、Rails の場合は明示的に入れなくてよく、馴染み深いから、とい…

Ruby で Google Analytics 4 (GA4) の「アカウント」や「プロパティ」を API で取得する方法

結論 gem として google-analytics-admin-v1alpha を用います。各種データを取得するための Data API とは異なるので注意です。 公式ドキュメント cloud.google.com 具体的なコード例 具体的なコード例は次のとおりです。Data API のとき とほぼ同じです。 (…

Ruby で Google Analytics 4 (GA4) のデータを API で取得する方法

前提 2023年3月17日(金)現在の話です。 API の公式ドキュメント developers.google.com 結論 どの gem を使うか? google/analytics/data/v1beta です。 API の認証はどうするか? GCP のサービスアカウントを作成し、認証用の JSON ファイルである creden…

Ubuntu 22.04 (WSL2) で rbenv で Ruby v3.2.1 をインストールしようとすると require': cannot load such file -- optparse (LoadError) が出る場合

結論 以下のようにしたら自分の環境ではインストールに成功しました。 1. グローバルに利用する Ruby を v2.7.3 に設定する v2.7.3 を持っていない場合は $ rbenv install 2.7.3 で入れ、グローバルなバージョンとして v2.7.3 を指定します。 $ rbenv global…

(最近の)Ruby で YAML.load_file によってエイリアスが読み込めないときの対応

結論 キーワード引数として aliases: true を付与する。 例 yaml = YAML.load_file('config.yml', aliases: true) 補足 Psych というワードと併せて検索すると背景が分かります 現時点では、素の Ruby じゃないと遭遇しない現象かもしれません

Google Sheets API (Ruby) で update_spreadsheet_value メソッドの引数の意味

前提 以下のようなメソッド実行例です。 便宜上、以降では以下のコメントに基づいて 1つめ、2つ目... という形で引数を呼ぶことにします service.update_spreadsheet_value( sheet_id, # 1つめ range, # 2つめ value_range_object, # 3つめ value_input_opti…

Twitter で凍結されたアカウント情報を取得しようとした場合のレスポンス

※ 2022年4月10日(日)現在の情報です 結論 Ruby (https://github.com/sferik/twitter) の場合 /path/to/vendor/bundle/ruby/3.1.0/gems/twitter-7.0.0/lib/twitter/rest/request.rb:97:in `fail_or_return_response_body': User has been suspended. (Twitt…

Ruby にてハッシュの「キーだけ」を加工したい場合には transform_keys メソッドを用いる

結論 たとえば、{ foo: 'bar', hoge: 'fuga' } というハッシュがあったとします。このハッシュの foo および hoge のそれぞれを大文字に変更したい場合には次のようにします。 { foo: 'bar', hoge: 'fuga' }.transform_keys { |key| key.upcase } 上記の戻り…

Danger (JS) を GitHub Actions で導入する

結論 作成するファイルは以下の 2つ です。 .github/workflows/danger_js.yml ファイル名は何でも良いです 単独のファイルとして切り出さず、既存の yml に内容を追加しても大丈夫です dangerfile.js ファイルの内容 2つのファイルの内容は次のとおりです。 …

Rakeタスク で引数を取る時にクォートで囲まないと zsh ではエラーが出る

実例 クォートで囲まないと NG。 $ bundle exec rails foo_task:barbar[hoge,fuga] zsh: no matches found: foo_task:barbar[hoge,fuga] クォートで囲むと OK。 $ bundle exec rails "foo_task:barbar[hoge,fuga]" (正常処理)

Twitter の API で取得できる media(画像)の URL は原寸大画像を示してはいない

結論 たとえば、API で取得できる media_url_https が https://pbs.twimg.com/media/FAlJ_JsUUAAgOSq.jpg であったとします。この URL に wget をしても原寸大画像は得られません*1。 常に原寸大画像を取得するためには https://pbs.twimg.com/media/FAlJ_Js…

Ruby で URL から正規表現で各種文字列(ファイル名など)を抽出する

大前提 正規表現は最後の手段にするべきです。 結論 RFC3986 に従います(後述)。 たとえば対象とする URL が https://pbs.twimg.com/media/FAlJ_JsUUAAgOSq?format=jpg&name=orig であったとします。そのとき、以下のように抽出できます。 url = 'https://…

Ruby で Unicode エスケープシーケンスをデコードする

結論 URI#decode_www_form_component を使いましょう。 具体例 以下、エスケープシーケンスをくくるためにダブルクォートを用いることに注意です。 [1] pry(main)> URI.decode_www_form_component("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86") => "あいう" 検索…

Lita を Heroku で用いる際にヘルスチェックのエンドポイントを作る(Webサーバ機能を使う)

Lita とは www.lita.io 結論 まず以下のようなハンドラーを作ります。 module Lita module Handlers class Healthcheck < Handler http.get '/healthcheck' do |_request, response| response.body << 'OK' end Lita.register_handler(self) end end end そ…

Ruby 3 を用いると Lita にて Webサーバー が応答できずに落ちるので注意する

Lita とは www.lita.io 結論 2021/07/25 時点では、以下のソースにあるように Ruby 3 で escape メソッドが削除されたため、Webサーバ の応答をしようとすると落ちます。 github.com 以下のようにコメントが書いてあります。 # The http_router gem still us…

Lita の config ファイルにおける Redis のアドレスの指定方法

Lita とは Ruby製の ChatBot フレームワークです。 www.lita.io 設定ファイル内での Redis のアドレスの指定方法 lita_config.rb というファイルに設定を書き込んでいきます。その際、Redis のアドレスを指定するには以下のように書きます。 (前略) config…

Lita のローカル開発時にレスポンスを確認するには @Lita をまず先頭に入力する

Lita とは Ruby製の bot のフレームワークです。 docs.lita.io 結論 ローカル(シェル)で動作確認する際には @Lita を先頭に付けないとポストが受け付けられません(レスポンスが返ってきません)。 以下のように、@Lita を先頭につけて bot に話しかける必…

Mac で mimemagic をインストールしようとした際にエラーが出る場合の対処法

gyazo.com 現象 以下のようなエラーメッセージが出る場合です。 An error occurred while installing mimemagic (0.3.9), and Bundler cannot continue. Make sure that `gem install mimemagic -v '0.3.9' --source 'https://rubygems.org/'` succeeds befo…

Twitter REST API の trends で用いる WOEID の一覧(日本)

結論 以下のとおりです。 Kitakyushu: 1110809 Saitama: 1116753 Chiba: 1117034 Fukuoka: 1117099 Hamamatsu: 1117155 Hiroshima: 1117227 Kawasaki: 1117502 Kobe: 1117545 Kumamoto: 1117605 Nagoya: 1117817 Niigata: 1117881 Sagamihara: 1118072 Sappo…

VSCode の Ruby Test Explorer を用いる際にテスト対象 Spec が表示されない場合

結論 設定の Test Framework の項目で明示的にテストに用いるフレームワーク*1 を指定するといける場合があります。 gyazo.com *1:RSpec とか Minitest とか

RSpec で特定のテストだけを実行する方法

結論 --example オプションを使い、その値として「テストの名前」を入れます。 例 以下のような Spec があったとします。 feature 'おはよう' do scenario 'こんにちは' do # ここにテストが入る end end このとき、このテストを実行するためには次のコマン…

Powered by はてなブログ