XHack勉強会 第6回『Ruby「ゼロから」画像共有サービスを作る』で学んだこと
今回で実質最終章のX-Hack勉強会。
最後はメールの自動送信方法について学んだので
その方法について僕なりの解釈でまとめていきます。
このノートでざっくり分かること。
【git cloneについて】
これはその名の通り複製する為のコマンド。
ディレクトリにリモートリポジトリの内容を複製することが出来る。
GitHubのページの「Clone or download」をクリックし、
中の「Clone with HTTPS」の赤枠内URLをコピー。
そしてターミナル内で下記コマンドを打つと、
現在居るディレクトリ内に緑枠内(コレだとhello_world_rails)の
ディレクトリが作成され、そこに内容がコピーされる。
$ git clone [コピーしたURL]
実際cloneした後は[bundle install]などをしていくのだが、
大抵環境構築方法はReadmeに書いてくれているはず。
共同開発時は、このようにリポジトリをcloneして開発を進めていく。
【git branchについて】
簡単に言うと、機能追加やバグ修正などを元のデータに影響を与えずに
開発作業を並行に進めていく為の機能こと。
ちなみに[branch]とは[枝・支流]と言った意味。
ブランチを作成することを「ブランチを切る」とも言う。
例えば、リリースしたアプリケーションに1つ機能を追加しようと、
元のコードをそのまま改造していく。
そしたらバグの報告があってバグ修正をしないといけない。
でも作りかけのコードが邪魔でバグ修正が出来ない!となります。
では先に機能追加のブランチを作成しその中で作業を進めていた場合。
もし途中でバグ修正をしなければならなくても、
現在のブランチでコミットさえしておけば、
他のブランチにはその作りかけのコードは別のブランチに持ち越さない。
いつでも元のコードに戻れる為、そこからまたブランチを作成し
下図のようにバグ修正も行える。という事。
ブランチを作成するにはターミナルで下記コマンドを打てばOK。
# ブランチの作成
$ git branch [ブランチ名]
# 作成したブランチへの移動
$ git checkout [作成したブランチ名]
# 上記2つをまとめたコマンド
$ git checkout -b [ブランチ名]
# 現在のブランチ一覧
$ git branch
【rakeについて】
Ruby-Makeの略で、定型的な処理をする時に役立つツール。
「Rakefile」に書いた処理内容(タスク)をrakeコマンドで実行できる。
使用するには下記のように「Gemfile」に追記し、インストール。
# Gemfile
gem 'rake'
# その後ターミナルで下記コマンド
$ bundle install --path vendor/bundle
次にプロジェクトディレクトリ直下に今回は分かりやすいように、
「test」ディレクトリを作り、その中に2つファイルを作る。
「sample.rb」と「test.rb」とし下記を記載。
# test.rb
p "hello"
# sample.rb
p "sunny day"
そしてプロジェクトディレクトリ直下に「Rakefile」を作り、下記を記載。
task default: %w[hello sunny] # task指定をしなければhelloとsunnyのタスクが実行
task :hello do # helloの部分を指定して実行する
ruby "test/test.rb" # Rakefileから見たRubyファイルの相対パス
end
task :sunny do
ruby "test/sample.rb"
end
・%w[hello sunny]について
前回書いた%Qと同じような記法。
もし普通に書くと[:hello, :sunny]となる。
そしてターミナルにて下記コマンドにて実行が出来る。
コマンドと結果を並べて書いておく。
$ bundle exec rake
"hello"
"sunny day"
$ bundle exec rake hello
"hello"
$ bundle exec rake sunny
"sunny day"
【メールを自動送信する方法】
この方法を使えば1時間おきにメールを送ったり、
毎朝7時など指定時間などに繰り返しメール送ったり出来るようになる。
■rubyプログラムでメールを送信する
今回はGmailでのメール送信方法。
必要なのは
・gemインストール
・SMTPサーバーの設定
・メール内容(本文や件名)
・Gmailアカウント側で2段階認証プロセスを認証
の4つ。
・SMTPサーバーとは
メールの送信の為のサーバー。
メールソフトがSMTPサーバーに対してメールの配送を依頼し、
SMTPサーバーが相手先に送信する。
ここの設定をいじればGmail以外でも可能。
まず「Gemfile」に下記を記載し、bundleインストール。
gem 'mail'
次に「sendmail.rb」を作成して、下記を記載。
require 'mail'
require 'dotenv/load'
module Sendmail
def send_message(mail_to, mail_subject, mail_body)
mail_from = ENV['MAIL_ADDRESS'] # 「.env」ファイルへの記載を忘れずに
mail_passwd = ENV['MAIL_PASSWD']
Mail.defaults do # SMTPの設定部分
delivery_method :smtp, {
:address => 'smtp.gmail.com',
:port => 587,
:domain => 'gmail.com',
:user_name => "#{mail_from}",
:password => "#{mail_passwd}",
:authentication => :login,
:enable_starttls_auto => true
}
end
m = Mail.new do # メール内容部分
from "#{mail_from}"
to "#{mail_to}"
subject "#{mail_subject}"
body "#{mail_body}"
end
m.charset = "UTF-8"
m.content_transfer_encoding = "8bit"
m.deliver # メール送信実行
end
module_function :send_message
end
そしてグーグルアカウント側の設定にて、
2 段階認証プロセスを有効にする。→参考記事
後は起動部分を作るので、まず「test」ディレクトリ内に
「mailtest.rb」を作成し下記を記載。
require './lib/sendmail' # classの読み込み
puts "mail送信"
Sendmail.send_message("hogehoge@gmail.com", "おはよう", "テスト")
# ↑これがクラス
最後に「Rakefile」内に下記を追記する。
task :mail do
ruby "test/mailtest.rb"
end
そしてターミナルにて下記コマンドで起動してメールが送信されてればOK。
$ bundle exec rake mail
■自動送信部分の実装
メール送信は出来たので、後はこれを自動で送れるようにする。
仕組みとしては、cronというものを使う。
cronとは、UNIX系のOSで動くプログラムであり、
指定した時間にプログラムを起動してくれる。
これをwheneverと呼ばれるgemファイルを使って操作する。
まず「Gemfile」内に下記を追記しbundleインストール。
gem 'whenever', :require => false
次にターミナルにて下記コマンドを実施して、設定ファイルの作成。
$ bundle exec wheneverize .
# 以下結果
[add] creating `./config'
[add] writing `./config/schedule.rb'
[done] wheneverized!
そして作成された「schedule.rb」に下記を記載。
set :output, "log/cron.log" # logファイルをここに出力する
set :environment, "development"
every 1.minute do
rake "mail"
end
後はこのlogファイルの出力先を作る為に、
プロジェクトディレクトリ直下に「log」ディレクトリを作成。
あとはこの設定をcronに伝える必要がある為、
下記コマンドをターミナルにて実行。
$ bundle exec whenever --update-crontab
これでメールが届き、 「log」ファイル内にログが入っていれば完了。
これでパソコンが起動している限り、
1分毎に自動でメールを送り続けるという恐怖なプログラムが完成した。笑
実行間隔は下記のように時間指定や、曜日指定も可能なので
興味があれば試してみるのも面白いかも。
# 毎週日曜日の12時
every :sunday, at: '12pm' do
rake "mail"
end
# 毎日朝の4時半
every 1.day, at: '4:30 am' do
rake "mail"
end
これで『Ruby「ゼロから」画像共有サービスを作る』は終了になります。
後はこの機能を組み合わせて、そこに自分が追加したい機能を盛り込めば
アプリケーションの完成です。
【この2ヶ月間で僕が成長したと感じたこと】
長いようで短かったこの2ヶ月間。
僕がこの2ヶ月間で自分の成長として気付いたことは
・エラーを解決できるようになっている
・作業箇所のイメージが少し頭の中で出来るようになった
・メソッドの中身やコード全体の把握が雰囲気で出来るようになった
かな?
■エラーを解決できるようになっている
これが1番デカイかも。
全くエラーが怖くない。むしろエラー文は情報源という認識になった。
エラーが出た時に読む場所・読み方などもなんとなく分かってきたし、
対応策も少しだけインデックスが出来た。
エラー解決時のスッキリ感が快感。
■作業箇所のイメージが少し頭の中で出来るようになった
第2回とか第3回とかでは正直、松田さんが前に書いてることを
真似して書いてた感じ。
どこのファイルを書き換えてるのか・それはなぜなのか、
よく分かってなかった。
ただ今は言ってることから大体何をしようとしてるかとか、
「あ、多分こういう風な流れで書いてるんだな」とか
理解が出来るようになってきた。
松田さんが「これをこうしましょう」って前で言ってるのを聞いて、
それを何も見ずに考えて追記したりコマンド打てたり、
少しずつ出来るように感じた。
■メソッドの中身やコード全体の把握が雰囲気で出来るようになった
バッとコードを見た時、30行くらいあるだけで嫌悪感あったけど、
今は嫌悪感は消え去って「あ〜、こういうことしてるんだな」と、
時間はかかるけど大体の中身が解読できるようになった。
「これはメソッドで、これは変数。これは引数でこれは相対パス・・・
実行すると多分こういうことが行われる感じがする。」
みたいに、実行した際の結果もなんとなく分かるようになった。
他にも学んだことはたくさんあるので、
今回の勉強会を基礎として今後も色々と勉強していきたいと思います。