行動すれば次の現実

テック中心の個人ブログ

Ruby

【CarrierWave + aws-fog】S3上のファイルをローカルにダウンロードする方法

CarrierWaveとaws-fogを用いてS3上にアップロードしたファイルをローカルにダウンロードする方法を説明します。 サイズの大きいファイルを一旦ローカルにダンロードしてから処理したいケースなどに活用できるかと思います。 実装 モデルの定義 class Invoice …

FTPでCSVファイルをダウンロードしてアプリに取り込む処理の実装例 | Rails

FTPサーバーに配置されたCSVファイルを使ってRailsアプリで処理する機会がありましたので、実装例について説明いたします。 net/ftpを使用した実装例 RubyでFTPサーバー接続するためにはnet/ftpというライブラリを使用します。 ftp = Net::FTP.new ftp.conne…

【Axlsx】Cellのtypeに:dateを指定しているのに日付型のセル書式にならない

前回同様、またAxlsx関連のマニアック話ですが、なぞ仕様に嵌ってしまったので記録として残しておきます。 同じように悩んでしまっている方の一助になれば幸いです。 Cellのtypeに:dateを指定しているのに日付型のセル書式にならない 以下のようにadd_cellで…

Axlsxで出力したExcelをRSpecでテストする方法

RubyでExcelのインポート、エクスポートを実装する場合は、Axlsxを使用することが多いかと思います。 Axlsxでエクセルをインポートする処理をRSpecでテストするというコードはよく見かけるのですが、 エクスポートに関してはあまり見たことがありません。 先…

M1 Macbook Proにrbenv経由でRubyをインストールしようとしたらエラーになってハマった

M1 Max Macbook Proにrbenv経由でRubyをインストールしようとしたところ、エラーが発生してインストールできませんでした。 この原因調査と対応にほぼ丸一日時間を費やしてしまったので、戒めも込めて記事にすることにしました。 誰かのお役に立てれば幸いで…

Railsでよくエラーになるlibv8、therubyracer、mini_racerあたりを調べた

Railsアプリを構築しようとするときにbuildエラーになるライブラリの代表にlibv8、mini_racerなどが上げられると思います。(個人的感覚) 毎回gemを最新化することでなんとなく解決していたのですが、これではその場凌ぎしかなく応用が効きません。 しっか…

Sidekiqで実装したWorkerをRSpecでテストする

Sidekiqで実装したWorkerクラスのRSpecでテストする方法をまとめました。 SidekiqをRSpecでテストする方法 Sidekiqのテスト手法には主に以下の2種類があります。 ① Sidekiq::Testing.fake!を使用したテスト キューへのジョブ登録(エンキュー)から、ジョブの…

Rubyのヒアドキュメント記法

一番ノーマルなヒアドキュメント 終端を示す識別子にはスペースなどの文字列を記述してはいけないので、階層が深いと見づらく感じることがあります。 query = <<SQL select * from users; SQL p query #=> " select *\n from users;\n" => 階層が深い場合のヒアドキュメント 識別子の頭にハイフン「-」</sql>…

AWS SDK for Rubyを使ってS3上のファイル存在チェックをする方法

AWS SDK for Rubyを使用して、S3上に特定のファイルが存在するかどうかチェックする方法をまとめました。 前提 AWS SDK for Ruby Version 3のaws-sdk-s3を使用します。 github.com 実装 # 事前に初期化しておく @s3_client = Aws::S3::Client.new def exists…

RubyのAWS SDKを使用してS3からファイルをダウンロードするときのエンコーディング問題

S3 bucketにあるファイルをダウンロードしてTempfileに書き込みしようとしたところ以下のエラーが発生しました。 Encoding::UndefinedConversionError: "\xE5" from ASCII-8BIT to UTF-8 その時のコードは以下の通りです s3_client = Aws::S3::Client.new Te…

RubyでS3にある巨大なファイルをストリーム処理する方法

最近の案件で、AWS S3に配置された1GB程度のCSVファイルを処理することがありました。 そのままメモリに載せてしまうとすぐにメモリオーバーになってしまうので、ストリーム処理で実装することにしました。 その時の内容を整理してみましたので、同様のこと…

Hashを使って大量のActiveRecordをキャッシュに載せる方法 | Ruby on Rails

ループ処理の中で、あるテーブルに対してアクセスしなければならない場合、ループ毎にテーブルをfindするのは非効率かもしれません。事前に必要なテーブルデータを抽出しておき、そのキャッシュを使って処理するほうが効率的な場合があります。 しかし、この…

Rubyで文字列がURL形式かどうか正規表現でチェックする | Rails

Rubyで文字列がURL形式であるかチェックする場合は URI::DEFAULT_PARSER.make_regexp.match を使用します。 これを使用することで、引数に渡された文字列がURI形式であるかどうかをチェックすることができます。 引数の文字列がURI形式であればMatchDataオブ…

RailsアプリでRubyバージョンアップする方法(2.6 to 2.7)

この記事では、Railsアプリをrbenvを使用してv2.6.8からv2.7.4にアップグレードする方法を説明します。 インストールされているrubyのバージョンアップを確認する rbenv versions インストール可能なrubyのバージョン一覧を確認する rbenv install --list-al…

CSV.generateでUTF-8からShift−JISに変換したときの文字コード変換エラーを回避する

CSV.generateメソッドでUTF-8の文字列をShift-JISに変換して書き込もうとしたら U+2613 from UTF-8 to Windows-31J incompatible character encodings: UTF-8 and Windows-31J というエラーが発生しました。 docs.ruby-lang.org 上記リファレンスに記載の通…

クエリ文字列から特定のパラメータを削除したい | Ruby On Rails

クエリ文字列から特定のパラメータのみを削除する方法を説明します。 実装 uri = URI.parse('https://www.example.com?hoge=1&fuga=2&piyo=3') query = Rack::Utils.parse_nested_query(uri.query) query.delete('fuga') uri.query = query.to_param uri.to_…

RubyとJavascriptにおける連想配列の順序保証の違い

RubyとJavascriptでは連想配列(Rubyの場合はHash、Javascriptの場合はオブジェクトリテラル)の順序保証が異なります。 最近はバックエンドでRuby、フロントエンドはJavascriptの構成にして開発するケースが増えています。 RubyでAPIの結果を連想配列で返し、…

静的クラスっぽくRubyのモジュールを使いたい

Rubyのモジュール(module)といえばミックスインというイメージが強い。 ミックスインは便利だが、わざわざミックスインで組み込まずに、ユーティリティクラスのようにそのままメソッドを呼び出したいケースがある。 (Javaでいう静的クラスを定義して静的メ…