Proxyを使って、自前のメールアドレスフィルタを作ったことがありました。更新をさぼっていて最近最新のものに置き換えてみたついでに、昔のスクリプトを改善してみました。発端はshebangです。いうことでやってみました。E-MailRelayで実行するスクリプトには、ちょっとした癖があって、終了コードで動作を変えています。%ERRORLEVEL%が肝となりました。すると、終了コードが正しくE-MailRelay本体に帰っていきます。gemのRinRubyというものがあるのですが、ここ数か月でかなり手を入れさせてもらいました。requestsをして、ということをやっていましたが、fork元に取り込まれていない機能もあったりしますので、僕のforkもご参照いただければと思います。現在のところfork側にしかない機能は以下のとおりです。Rubyで動きインストールが簡単ですので、お奨めしてもよいかなと思い、記事を書きました。Travis-CIとAppVeyorでテストしていますが、色々なRubyのバージョン(2.3以降でテストしていますが、1.9以降でも動くと思います)やjRubyでも動いています。Windowsでもテストを通しています。Rでも実績があります。今後ですが、コードが肥大化しているので気が向いたらリファクタリングをするつもりです。その他にも問題等あるようであれば、githubのIssuesに残していただけると嬉しいです。2018Rubyのコードをいじっていて、とうとうRSpec(テスト)を書く羽目になったのですが、そこでのメモです。テスト対象になるインスタンスが、ソケットを生成していろいろ下準備をしてはじめて使えるようになるものだったので、テストを高速化するためにも、テストケース(RSpecではexampleと呼ぶらしい)間でインスタンスを永続化させて共通にできるところは共通にしたい、ということがありました。いうときは、全テスト前に実行されるbefore(:all)(←before(:context)のエイリアス)ブロックでインスタンスを生成すれば事なきを得そうですが、さらに事情が複雑で、インスタンスの生成方法を共通化したいというのがありました。patternでも作ってそれを中で使えばよいのでしょう。未定義変数アクセス時に遅延評価によって変数内容を生成するRSpecの機能のlet(あるいはそのエイリアスのsubject==let(:subject))を利用してみることにしました。いうことで、いろいろ試してみました(別タブで見たほうが良いかも)。ケースが6つ書いてあります(左側のアイコンを操作するとファイルを切り替えられます)。それぞれこんな感じです。ある、テストケースごとに生成する場合。subject(let)使えばOKたまにみるインスンタス共通化方法(A)。一度だけ作成してインスンタス変数に保持。みるインスンタス共通化方法(B)。テスト始める前にインスンタス作成してインスンタス変数に保持。思った通り動作しない。それぞれのテストケースでインスタンスが作られてしまう。