日常で使うRubyプログラミング

日常の作業でRubyを使う際、気になったことをChatGPTに聞いています。

Rubyの正規表現実践例

法令テキストから、Rubyの正規表現を用いて各条の表題を抽出し、 第一条:国内犯 第二条:すべての者の国外犯 ・・ のように表示するプログラムです。 正規表現の威力がよく分かると思います。 注:蛇足ですが、scan() do .. end は、正規表現のグループにマ…

正規表現の基本

知識をまとめたかったので、聞いてみました。 Rubyでの正規表現は、=~演算子でマッチするかどうか判定したり、文字列に対してsub(), gsub(), scan()などを呼び出して用います。 後者については、第一引数に正規表現を指定します。第二引数は、置換テキストで…

RubyのRakeの使い方

RakeはRubyビルドツールで、MakefileのRuby版です。 あるプログラムを別のプログラムの後に実行したいといった、順序を制御したい場合、あるプログラムが別のプログラムの生成ファイルの存在を前提とする場合など、異なるタスクをつなぎ合わせて機能させたい…

RubyでLispらしさを実感してみる

ゆるコンピューターラジオを聴いていて(40時間Lispを勉強したら信者になれる?)、Lisp面白そうだなと思ったものの、違う言語を今からやる気力は無いので、僕がよく使っているRubyとの比較でいろいろ聞いてみました。 面白そう・・。 かなり前に勉強してみた…

RubyでのDSL実装例と拡張バッカス・ナウア記法(EBNF)

DSLの仕様を記述する記法である拡張バッカス・ナウア記法(EBNF)と、Rubyで実際にその仕様を実装する方法について聞いてみました。 言語仕様の構成要素として,終端記号 (Terminal symbols)、非終端記号 (Non-terminal symbols)、導出記号 (::=):、選択 (|)…

RubyのThreadを用いて並行処理を行う方法

聞いてみました。 長い時間のかかる処理を、進行表示をしつつメインスレッドも実行し続けるような場面を想定しています。 進行表示をするためには、時間の掛かるスレッドで更新した値をメインスレッド等から参照する必要があります。 そのためには、スレッド…

RubyでDSL(Domain Specific Language)を設計する

ユーザー側からの入力を簡易プログラミング言語みたいにしたいと思うことがたまにあったので、DSLの作成方法を聞いてみました。 Rubyの場合は、特定のオブジェクトをレシーバーとしつつ、そのオブジェクトのコンテキストでブロック内のコードを実行させるins…

RSpecで、Mockオブジェクトを用いる

聞いてみました。 RSpecで、Mockオブジェクトを用いたテストもできるのでしょうか? Userクラスのダブルオブジェクトに、複数の振る舞いを定義するにはどうすれば良いですか? ダブルに定義できる振る舞いについて、まとめていただけませんか? ダブルを渡す…

RSpecのMatcherまとめ

Matcherは、expect(v).to eq(3)のように、vの値が期待通りかを示す操作のeq(3)の部分のことです。 vがある値に等しいか、以上か、以下か、文字列なら正規表現にあてはまるか、配列やハッシュならある値やキーを含むか、expectの引数がブロックなら期待した…

RSpecの基本的な使い方とTDD開発

RSpecを用いて、テスト駆動開発(TDD)を行う方法をChatGPTに聞きました。 各テストケースで用いるマッチャーについては、機会を改めて聞こうと思います。 RSpecについて教えてください。 contextの使用例も見たいです。 上の例では、describeの引数にクラスの…

RubyXL:Excelのスタイルの内部的な取扱い

RubyXLでExcelを操作する際のExcelのスタイル情報の保持のされ方、利用方法について詳しく聞きました。 文書の容量節約のために、スタイル情報が階層的に、値とは別に管理されていることが分かりました。その分、実際、スタイルを追加したり変更したりはやや…

Ruby版データクラス?:Struct

使おうと思ったときにいつも定義の仕方を忘れてしまうので、気になっていたことも合わせて聞いてみました。 RubyのStructについて教えてください。 Kotlinでdata classを使う文脈で使っても良いですか? Rubyでデータクラスに類似のクラスやオブジェクト使い…

標準クラスに対し、安全にユーザー定義メソッドを加える:Refinement

Rubyは、標準クラスにユーザー定義のメソッドを加えることが簡単に出来ますが、不都合も多そうなので代替策を聞いてみました。 デコレーターパターンを用いる方法と、Ruby2.0以降で追加されたという'Refinement'を使う方法が良さそうです。 標準ライブラリの…

RubyでExcel文書を編集する:RubyXL

RubyでExcel文書を編集するには、RubyXLを使うそうです。 フォントの種類、サイズ、色、セルの境界線、背景色などのフォーマット設定といったスタイル情報は、Excelファイル内の別のテーブルに管理されているようです。なので、既存のシートからスタイルをコ…

RubyのORMライブラリ:Sequelの使い方

Sequelの基本的な使い方について、聞いてみました。 RubyのORMであるSequelを通してSQLiteデータベースを利用する方法を教えてください。 sqlite3は別途インストールする必要があるのですね? sqlite3 my_database.db ".quit"のコマンドも、gemのインストー…

Rubyで使えるORM:Sequelが良さそう

Ruby on RailsのAntiveRecordみたいなORMを、日常的な用途でも使いたいと思い、ChatGPTに聞いてみました。 Sequelが良さそう。 Ruby on RailsのActiveRecordって、Ruby on Railsの環境以外でも使えるのですか? Rubyで使えるORMライブラリで定番のものは他に…

RubyでCSVを扱うライブラリについて

読み込み時はCSV.foreach, 書き込み時はCSV.openで行うのが良いようです。 なお、読み込み時の'converters'オプションは、以下の例では出ていませんが、CSV.parseだけでなく、CSV.foreachでも使用可能なようです。 あと、改行コードの不要な変換を避けるため…

MacBookにDockerを入れてRubyアプリケーションを実行するまで

開発中のソースコードは、コンテナ内のファイルシステムに置くのではなく、ホストシステムのディレクトリで行うのが通常だそうです。 開発中は、「ボリュームマウンティング」という方法を用いて、そのファイルをコンテナ内の特定ディレクトリに反映させて実…

NokogiriライブラリとXPathの基本

Nokogiriは、RubyでXML文書(含、HTML)を解析・編集できるライブラリです。ウェブから入手した文書から、必要なテキストを抽出・加工する際に威力を発揮します。 基本的な使い方をまとめて知りたくなったので、ChatGPT に詳しく聞いてみました。 RubyのNokogi…

RubyのSinatraの単純なサンプル

5行書くだけでWebサーバーが出来ます。 'Ruby on Rails'の学習もしたことがありますが、正直ややこし過ぎて、1冊本を読み終えた頃には個人用途でアプリケーションを作る気力は失せていました。 単純なものから必要に応じて規模を拡大して行く方が、学習はス…

Rubyの開発環境を丸ごと移転:Docker

手持ちのMacBook Airが古いため、特定Gemがインストールできないといったことがしばしば起こります。 DockerでRubyの開発環境を作ると、どんな感じになるのかイメージしたかったので、ChatGPTにいろいろ聞いてみました。 最近、10年ほど前に買ったMacBook Ai…

文字列に対する正規表現操作:match, =~, scan, sub, gsub

まとめておきたかったので、聞いてみました。 ついでにKotlin, Javaでの操作も確認しましたが、Rubyはやはり、簡潔で良いですね。 Rubyで文字列に対して正規表現を用いた操作をするメソッドについて教えてください。 それぞれの手段の使い分けの目安があれば…

RubyのSinatraで作ったWebサーバーに、ローカルネットワーク上の他の端末からアクセスする

長年知りたかったことが解決しました。 Android上で動くLinuxエミュレータのTermuxを使っているのですが、これで古いAndroid端末をWebサーバーにして、他の端末からデータにアクセスしたり変更したりといったことが出来そうです。 ifconfigのようなコマンド…

Rubyで日時を扱う:Time, Date, DateTime

それぞれに特徴があるようです。 夏時間も含めたタイムゾーンの取扱いは、Timeが得意なようです。 Dateは日付を、DateTimeは日時を扱うクラスですが、和や差を計算したり、前後を比較したりといったことはこちらの方が得意なようです。一方、タイムゾーンの…

Rubyのハッシュは順序を保持しているそうです

Ruby1.9から、Rubyのハッシュは順序を保持しているそうで、組み込みのsort_byなどのメソッドを使ってソートもできるようです。 ただ、sort_byの戻り値はキーと値のペアの配列なので、さらに.to_hを呼び出す必要があります。 rubyのハッシュで、keyの順序を保…

Ruby, SinatraでのWebアプリ開発

Ruby, SinatraでのWebアプリ開発が非常に楽なのに気付き、ChatGPTにいろいろ聞いています。Ruby on Railsは大規模で、複雑過ぎて、個人用途で何かを作る気には到底なれなかったのです。 今回は主に、ファイルの置き場所など。パスの読み替えが行われるのはvi…