ラベル Ruby の投稿を表示しています。 すべての投稿を表示
ラベル Ruby の投稿を表示しています。 すべての投稿を表示

2014/11/19

Ruby ARGVとgetsを併用する

まったく知らないことに出くわしたのでメモ。
Rubyで小物ツールを作っていたわけですが…

first_arg = ARGV[0]

とかやって引数を読み込むのはよくやってました。
また、

input = gets

などとして、入力待ちにしといて何か入力させるのも、処理内容を確認させるときなどにこれまでもときどき使ってました。

で、両方同時につかうと、エラーに。

 `gets': No such file or directory

きょとんとしてしまいました。

どうやらgetsはARGF.getsの略で、引数をファイル名とみなしたものを取りに行くのがデフォルトの動作だそうです。そして、引数がない場合にはじめて標準入力を対象とするんだとか。知らんかった…。

input = STDIN.gets

などとして、明示的に標準入力を指定してあげると、期待通りの動作をしてくれました。

2014/11/15

RubyでGmailからメールを送信(したくて結構つまづいた件)

Gmail!Gmail! / FixtheFocus

Ubuntu(14.04)環境にて、あるRubyのシステムでエラーを検出したらメールで通知しようということになり、お手軽そうなのでGmailのSMTPを使うことにしたのですが、当初ものすごく手軽に行けそうな気がしたものの、結構つまづいてしまったお話です。

RubyでGmail送信。ちゃんとお手軽なgemが存在するようなので、さっくりとソレを使うことにします。

gem install gmail

してから、下記のような感じのコードで、手元の環境で動作することを確認。

require 'gmail'
Gmail.connect('account@gmail.com', 'password') do |gmail|
    gmail.deliver do
        to 'address@hoge.com'
        subject 'subject strain'
        text_part do
            body 'body string'
        end
    end
end

…で、借りている本番サーバーに持っていくと動かない。
よくある話ですね。。

Net::IMAP::NoResponseError

なるエラーが返ってくる。そして、Googleアカウントのセキュリティ設定のURLも提示されている。
GmailのヘルプやWeb上から、Googleアカウントの「セキュリティ」「アカウント権限」で「安全性の低いアプリのアクセス」を有効にしちゃえばいいように思うものの、それでも結果は同じ。
この本番環境が仮想環境上にあるので、ひょっとしてそれが関係あるのかしら…?などといろいろと迷走をはじめる。

結果的には、Googleアカウントの「パスワード」の「2段階認証」をONにして、「アプリパスワード」を設定してあげると動いた。
おそらく、手元の環境で難なく動いたのは、普段このアカウントにアクセスしているIPアドレスだったから(…といっても、あまり使ってないアカウントではあったのですが)で、居住地域とはまったく違う本番環境のIPアドレスからのアクセスをセキュリティ的に弾いたような印象です。

じゃあなんで2段階認証にすればOKになるんだ…とか、その辺の事情は分からずじまい。Gmailのヘルプ的にもアカウント権限の設定だけでアクセスできそうな気になっちゃいましたしね。なにはともあれ、2段階認証。

2014/02/14

Ruby 改行コードをWeb向けに置換

Railsにて。
下記でエラーが発生
  項目1 なんか変
  項目2 これも変
このようなエラーを返せと言われた。
しかし、ここは1レコードの要求の場合は画面に、複数レコードの場合はCSVでエラーを返していたので、ちょっとだけ困った。
改行を入れなければならないが、HTMLは改行を<br>で表現せねばならん。

結局、エラーメッセージはCSV向けに改行“¥n”を入れて生成し、画面に直接返す場合は応答直前で
message.gsub(/(\r\n|\r|\n)/, "<br />")
と置き換えた。
ちょっとカッコ悪い気はしつつ。
にほんブログ村 IT技術ブログ IT技術メモへ