ネットの海の片隅で

技術ネタの放流、あるいは不法投棄。

Ruby

Rubotyでくじびきをする

Ruboty pluginを書いたので簡単に紹介しておきます。 https://github.com/s-osa/ruboty-kujibiki https://rubygems.org/gems/ruboty-kujibiki 使い方 GitHubにも書いてありますが ruboty kujibiki の後にカンマ区切りの文字列を渡すと、そのうちの1つをラン…

Rubyでゼロ除算になるかもしれないときの書き方

やりたいこと 分母に0が来る可能性がある除算をRubyで書くときに、すっきり書きたい。 考えるケース 店(Shop)がそれぞれ複数の在庫(Stock)を持っているシンプルなケースを考える。イメージとしては下のような感じ。 class Shop has_many :stocks end cla…

Net::FTPでNAT越えする

解決したいこと FTPはActiveモードを使った時にデフォルトでNATを越えられない。 NAT越えのためにはFTPのPORTコマンドを適切に使用する必要がある。 RubyのNet::FTPにはPORTコマンドあるいは似たようなオプションが無い。 RubyアプリケーションでNAT越えのFT…

EC2からactive modeでFTP通信ができない件

問題 Local require 'net/ftp' ftp = Net::FTP.new("example.com") ftp.login("username", "password") ftp.list # => Array[String] 期待通りに動きます。 EC2 require 'net/ftp' ftp = Net::FTP.new("example.com") ftp.login("username", "password") ftp…

RubyでGmailのAPIを叩く

GmailのAPIに関する情報がほとんどなかったので、ざくっと書き残しておきます。 前提条件 access_tokenは取得している 公式クライアント(google/google-api-ruby-client · GitHub)を使う サンプルコード require "google/api_client" # メッセージの準備 m…

任意のビット列を0以上1以下の数値に変換する

やりたかったこと 文字列に対して0以上1以下の数値を割り当てる 複数回実行した場合でも割り当てる数値は常に等しい 2つ目の要件がなければ乱数を取ってきて割り当てれば良いのだが、再現性が必要なため乱数は使えない。 したがって、文字列をもとに一見する…

Rubyで配列の最多要素を求める

やりたいこと タイトル通りです。 [1,2,2,3,3,3,4,4,5]から最多の要素3を得たいということがあります。最頻値を求めると言っても良いかもしれません。 やはり同じようなことを考えている人がいるようです。 Ruby - 配列内で要素数が最多のものを求める! - m…

RubyにCSV.mapが欲しい。

CSVという邪悪なファイルを扱っていると、CSVの各行を配列のまま取り回すのではなく、各行から必要なデータだけを取り出して小さい配列にしたり、あるいは、自分に都合の良いオブジェクトを生成した上でいろいろと取り回したいことが結構ある。こんな感じ。 …

「継承より委譲」≠「継承使うな」

TL;DR 適材適所。 「継承より委譲」 オブジェクト指向に関する有名な警句に「継承より委譲」があります。 僕はオブジェクト指向について語れるほど立派な人間じゃありませんが、 「むやみに継承使わないほうが良いよ」 「移譲のほうが良いケースが多いよ」 …

String#encodeが変換できそうで変換できない文字

問題 RubyでUTF-8からWindows-31J(Shift_JIS)に文字コードを変換すると、正常に変換できそうであるにもかかわらず、実際には変換が行えず例外が投げられる文字があります。 "\u{301C}" # => "〜" "\u{301C}".encode(Encoding::Windows_31J) # => Encoding:…

不揃いなHashから長方形の配列をつくるgem「Emmental」

ソースはここに置いてあります。 s-osa/emmental · GitHub インストールはgem i emmentalとかbundle installとかのいつものやつで。 使い方 基本 emmental = Emmental.new emmental << {foo: 1, bar: 2} emmental << {fizz: 3, "buzz" => 5} emmental << {fo…

JANコード用のgem「jan」

作ったもの JANコードを便利に扱うためのgemを作りました。 JANコードっていうのはバーコードに使われているこんなやつです。 国際的にはEANコードと呼ばれていたりします。 JANコードとは│JANコード登録│ 一般財団法人流通システム開発センター ean | RubyG…

正規乱数を生成するgem「RandomBell」

Rubyで一様な乱数が欲しければRandomやSecureRandomを使えば良いと思うのですが、「偏った乱数」が欲しいこともあると思います。 イメージとしてはゲームのパラメータとかですかね。 例えば、あるダンジョンで出てくる敵のレベルを20-30の間でランダムに決め…