Ruby,プログラミング

こんにちは、しきゆらです。

昨年に投稿した「【Ruby】メールを送受信する」のプログラムを書き直す機会があったので、改めて書いておきます。

 

上記の投稿に載せたスクリプトをクラスに直して、いくつかのバグを修正しました。

その結果はこれ

require 'net/smtp'
require 'json'
require 'base64'

class SendMail
  def initialize(to: 'to@mail.com', from: 'from@mail.com', option: {})
    # 引数を取り込む
    @smtp_option = {
      server:        'smtp.gmail.com',
      port:            465,
      authentication: :plain,
      ssl:             true, 
    }

    @smtp_option.merge!(option)
    # 認証情報を合わせ
    @smtp_option.merge!(load_secret)
    @from = from
    @to = to
    @date = Time.now.strftime("%a, %d %b %Y %X")
  end

  # パスワードとかを記しておくもの
  def load_secret
    File.open("./secret.json") do |file|
      JSON.load(file)
    end
  end
  
  def create_subject(subject)
    str = ""
    Base64.encode64(subject).split("\n").each do |string|
      str += "=?UTF-8?B?#{string}?= "
    end
    return str.rstrip
  end

  def create_body(subject: 'sample subject', body: 'mail main body')
    @message = <<EOS
Date: #{@date}
From: #{@from}
To: #{@to}
Subject: #{create_subject(subject)}
Content-Type: text/plain; charset=UTF-8
Mine-Version: 1.0

#{body}
EOS
  end

  def send(subject: "test mail", body: "this mail is test!")
    count = 0
    begin
      create_body(subject: subject, body: body)
      mail = Net::SMTP.new(@smtp_option[:server], @smtp_option[:port])
      mail.enable_ssl if @smtp_option[:ssl]
      mail.start(@smtp_option[:server], @smtp_option["mail"], @smtp_option["pass"])
      mail.send_mail(@message, @from, @to)
      mail.finish
    rescue => e
        count += 1
        if count < 10 then
          puts "retry"
          retry
        else
          puts e.class
          puts e.message
        end
    end
  end
end

 

極力外部のライブラリを使わずにメール機能を実装してみました。

使っているのは、標準添付ライブラリのみ。

 

基本的な使い方

SendMailクラスのインスタンスを作るときに送信先、送信者のメールアドレスとオプションを渡します。

オプションでは、smtpサーバ名・ポート番号・SSLを使うかどうかなどを連想配列で渡します。

 

認証情報をsecret.jsonというファイルにJSON形式で書きます。

例えば以下のような感じ。

{"mail": "mail@mail.com","pass": "password"}

これを読み込んで使うようになっています。

 

デフォルトでは、Gmailのsmtpサーバを利用するようになっています。

Googleで2段階認証を設定している場合は、ログインするためのパスワードでは認証できません。

これに対しては、アプリケーション用のパスワードを作成して、secret.jsonに書きます。

作成方法は以下あたりから。

 

送信するときは、そのままsendメソッドを使います。

引数として、subjectとbodyを文字列として渡してやります。

これだけでメールを送ることができます。

一定のタイミングで通知を送るとか、使い方はそれなりにありそう。

 

件名の文字化け対策

また、以前のスクリプトでは件名が文字化けしてしまいます。

これをなんとかするために、create_subjectでいい感じに変換しています。

参考としたのは、以下のサイトたち。

charsetを指定しただけでは件名が化けてしまうようです。

どうも、アスキー文字のみしか使えないようです。

これをなんとかするためには、

=?CHARSET?B?エンコードした文字列?=

という形で書かないといけないようです。

UTF-8で場合は

=?UTF-8?B?エンコードした文字列?=

とします。

エンコードはBase64というものを使ってエンコードしています。

 

また、一定の文字数で区切らないといけないようです。

これに関しては、Base64でエンコードするといい感じのところで区切り文字を入れてくれます。

そこでsplitして、それぞれの文字列を上記のフォーマットで囲ってやっています。

 

 

ブログを見ると、メールを書くプログラムをいつかいたのかと思ったら約1年前だったとは。

久々にこの遺産が役に立ったので、驚きました。

思いついたら書いて、保持しておくのは大事なんだなと思いました。

 

おわり

Ruby,プログラミング

こんにちは、しきゆらです。

今回はクラスタリング手法の一つであるk-means法を実装してみたのでまとめてみます。

使用言語は、もちろんRubyです。

なお、ライブラリ等は使わずに実装してみました。

HTML/CSS,JavaScript,プログラミング

こんにちは、しきゆらです。

急に暑くなってきた今日この頃、いかがお過ごしでしょうか。

 

今回は、HTMLのお話です。

 

HTMLのformタグで、エンターを押した時に送信したい、という場面になりました。

しかも、送信する部分に関してはJSでコードを書いていました。

例としては、以下のような感じ。

<form>
  <label for="user_id">ユーザID:</label>
  <input type="text" id="user_id" name="user_id">
  <button type="button" onclick="login()">ログイン</button>
</form>

ユーザ名IDを入力してもらい、ボタンを押すと入力された情報をサーバへ送りログイン処理を行う、というもの。

これを、エンターを押した時も同じように処理してほしい、というのが今回の話。

 

サーバサイドのスクリプトも自分で書いていたので、HTMLのsubmitに合わせてデータを取得できるようにすればいいんですが、面倒だったのでlogin関数でなんとかできないかな、と思っていました。

結論としては、formタグに「onsubmit="return login();"」と書き込んで、

login関数で 「return false;」とすれば解決でした。

<form onsubmit="return login();">
    <label for="user_id">ユーザID:</label>
    <input type="text" id="user_id" name="user_id">
    <button type="button" onclick="login()">ログイン</button>
</form>
function login(){
  // なんらかの処理
  return false;
}

onsubmitは、onclickのように関数名を渡せばいいんだと思っていましたが、違うようですね。

onsubmitは、関数等の処理を返す必要があるようです。

 

ただ関数がreturnすればいいのではなく、その値をさらにリターンするイメージですかね。

参考:onsubmitの戻り値をfalseにしてsubmitを実行しない(中断させる)方法 – 小粋空間

 

また、テキストボックスの数によっても挙動が異なるようです。

参考:【HTML】入力欄が1つだけのフォームはEnterキー押下でsubmitされる。submitボタンがなくても。 – SOFTELメモ

 

知らないことがたくさんありますね。

今回はここまで。

おわり。

日記

こんにちは、しきゆらです。

 

先日「【ブラウザ】Vivaldiさんの進化が止まらない」という記事を書きました。

すると、Twitterではこんなことになっていました。

((;゚Д゚) < 公式からフォローされとる・・・

ブログ記事の更新を投稿したツイートも、RT・いいねをいただきました。

ありがとうございます!

今まで、こんなことはなかったので驚きです。

さらにVivaldi好きーがいっぱいいることもわかりました。

Vivaldiさんはみんな大好きなんですね、嬉しいですね。

 

今後のVivaldiさんのアップデートも楽しみです。

先日のライブコーディングも見ていましたが、新機能ももうすぐリリースされるんでしょうか。

(夜中だったので途中で寝落ちしました・・・)

 

雑ですが、感想でした。

Vivaldiの進化が止まらない!!

 

 

おわり。

フリーソフト

こんにちは、しきゆらです。

今回はタイトル通り、みんな大好きVivaldiさんのお話。

ダウンロードはこちらから=> Vivaldi

 

Vivaldiはいいぞ!と言い続け、早数年。

一時期はChromeに浮気した時期もありますが、今ではMac/WindowsともにVivaldiがメインブラウザとなっている今日この頃。

 

少し前までは、タブを引きちぎって別ウィンドウを作れなかったり、開発者ツールが別窓になったりと

微妙に不便な点がありました。

それも、今となっては昔の話!

記憶では、2016年10月か11月あたりにタブをグイっと引きちぎると新しいウィンドウを作ってくれるようになりました。

また、開発者ツールも少し前のアップデートで画面内に表示できるようになりました。

痒い所に手が届く感じがいいですね。

 

さらに、Vivaldiと言えばクイックコマンド!(F2を推すと出てくるアレです)

クイックコマンドからGoogle検索ができるようになりました!!

やったー!

これができると、わざわざ

  • 新しいタブを開く
  • 検索バーに検索ワードを打ち込む
  • 検索実行

なんてしなくてもよくなります。

これでエンターを押せばすぐに検索してくれます。

これに、クイックコマンドの設定で「新しいタブでページを開く」にチェックを入れれば

F2とエンターだけで基本的な動作は完結してしまいます。

すばらしすぎる!!

 

正式リリース前は、自分自身のアップデートのために一時終了しようとして、タスクがすべて消えずにアップデートできない、

なんておちゃめな一面もあったVivaldiさん。

今となっては、その辺のブラウザができることは、当たり前にできるようになりました。

 

さらに、今後も様々な機能拡張をしていくようです。

近い話だとSyncが来るらしいですよ。

Sync is coming. Watch the progress live. – Vivaldi Blog

まだまだ、目が離せそうにありませんね。

 

今回は、最近のVivaldiさんについて雑多に書いてみました。

ぜひ、使ってみてください!

リンクを張っておきます。=> Vivaldi

それでは。

おわり。

日記

こんにちは、しきゆらです。

時間の使い方がうまくできない今日この頃、皆さんはどうお過ごしですか。

 

さて、タイトルの通りスマホをいわゆる格安SIMに変えました。

初めてで不安もありましたが、特に面倒な手続き等もなくスムーズに変えることができました。

そこで今回は、現在乗り換えを考えている人のためになれば、ということで手順等をメモしていこうと思います。

 

ちなみに、今回変えたのはDMM mobileですよ。

 

日記

こんにちは、しきゆらです

立てた目標をすでに達成できていませんね

大学生から院生へジョブチェンジしました

 

さて、今回は久々の更新ということで

最近考えていることをメモしておきます

HTML/CSS,JavaScript,プログラミング

こんにちは、しきゆらです

タイトル通り要素のテンプレートを作るためのタグの存在を知ったためメモしていきます

 

これまでは、特定のタグをテンプレートとして利用するときは

CSSでdisplay:noneとかをかけて見えなくしておいた要素をelement.cloneNode()で複製していくスタイルでした

 

そんな中、HTML5から追加された(?)templateタグというものを見つけました

これの使い方や、他の方法との速度の差などをまとめていきます

 

読書

こんにちは、しきゆらです

今回も読んだ本の話

 

タイトルの通り「自分を変える1つの習慣」という本を読んだので少しまとめておきます

自分を変える1つの習慣

 

読んだ率直な感想としては

わかっちゃいるけどそれができないんだよなぁ・・・

という感じでした

しかし、ちょっと実際に行動に起こしてみようかな

とも思える部分も

 

それでは、どうぞ

読書

こんにちは、しきゆらです

前回、週1回くらい更新したいと目標を立てたがすでに達成できていない今日この頃です

 

タイトル通り、「読んだら忘れない読書術」という本を読んだのでメモを残しておきます

本はこちらのもの↓

読んだら忘れない読書術