Ruby on Rails開発のインターン (Day 7)

こんにちは、皆さん!

今日は調子よし、そして、またメモリリークやっていくぜ!


  • トピック:
  1. Railsで多言語対応のテキストを実行
  2. en.ymlファイル内のテキストにアクセスするには
  3. 僕のマネージャーがメモリリークを発見した方法


  • 疑問:


  • 問題:
  1. ウェブサイト上でpdfを作った際にメモリリークが起きていること


  • 学習した内容:
  1. config/locales/en.ymlは英語版のウェブサイトのテキストを保管している
  2. topコマンドでLinuxにおいて、メモリの用途を確認できる


  • 今後やりたいこと:
  1. 2か国語以上のウェブサイトを作る
  2. 言語化について別で記事を書く


  • リソース:
  1. How I spent two weeks hunting a memory leak in Ruby
  2. Rails Internationalization (I18n) API — Ruby on Rails Guides


Railsで多言語対応のテキストを実行

リソース: Rails Internationalization (I18n) API — Ruby on Rails Guides

i18tというAPIがあり、これのおかげで簡単にウェブサイトを多言語化できる!


config/locales/en.ymlは主に英語版のテキストを保管し、このストラクチャーがウェブサイトの多言語化を簡単にしてくれる。例えば、他にja.ymlというファイルがあったとする。このファイルは日本語版のテキストを保管する。そうすれば簡単に英語と日本語のウェブサイトに行き来できる。
以下は一つの例、config/locales/en.yml

en:
  hello: "Hello!"

while config/locales/ja.yml

jp:
  hello: "こんにちは"

これで同じ変数に2か国語の内容が与えられた。


そしたら、やることはどっちの言語を使うか指定することだけ!
これをするためにはI18n.locales = :jaのように日本語を指定することで日本語になり、逆も同じようにできる。

en.ymlファイル内のテキストにアクセスするには

僕が思うにテキストをアクセスする一番簡単な方法は

<%= t('hello').html_safe %>

かな...
ここでは、t関数で'hello'というキーワードをインプットして、ymlファイル内の該当する部分のテキストを返してもらっている。
html_safe関数は以下のようにテキスト内にHTMLタグを入れた時にそれをちゃんとHTMLタグとして取り出すようにしている。

en:
  hello: '<p>Hello!</p>'


僕のマネージャーがメモリリークを発見した方法

僕のマネージャーがしたのはターミナルで

$ top

というコマンドをタイプして、コンピューターのメモリーの用途を確認すること
下記のは例のpdfを作成するページをリロードする前
f:id:Coding_Studio:20180714044656p:plain
それで、リロードした後は
f:id:Coding_Studio:20180714044738p:plain
見ての通り、赤くマークしたところの数字が上昇。これはメモリリークの可能性を強く表している。


この問題はおそらく今回のインターンでの一番の山場だろう(笑)

まとめ

今日は勤務時間のほとんどをメモリリークにあてちゃった。それで何かって何もわからなかった(笑)
次はもっと前進できることを祈って!


ご精読ありがとうございました。では、また次回まで✌






Day 6はこちら↓↓
programming-shop.hatenablog.com

Ruby on Rails開発のインターン (Day 6)

こんにちは、皆さん!

今日は30分遅刻なので、終わるのも30分遅くなりそう...
今日の内容はメモリリークの処理だから難しそう
(更新)結局この記事ではメモリリークに触れるところまではいきませんでした(笑)

  • トピック:
  1. cherry-pickでコミットだけを今のブランチに
  2. cherry-pickpull?はどう違うのか
  3. 使いやすいseed.rbファイルの書き方


  • 疑問:


  • 問題:


  • 学習した内容:
  1. git cherry-pickコマンド
  2. cherry-pickpullの違い
  3. 整っていて応用性の高いseed.rbファイル
  4. database_cleanerでテスト後のデータベース自動掃除
  5. コマンドの代わりにRails.application.load_seedで自動でデータを読み込む


  • 今後やりたいこと:
  1. 上記のseed.rbファイルを自分で実行する
  2. cherry-pickpullの違いについて動画を作る


  • リソース:
  1. Git - git-cherry-pick Documentation
  2. You mean the difference between a pull and a cherry-pick? I've been a user of gi... | Hacker News
  3. What does cherry-picking a commit with git mean? - Stack Overflow
  4. GitHub - DatabaseCleaner/database_cleaner: Strategies for cleaning databases in Ruby. Can be used to ensure a clean state for testing.


cherry-pickでコミットだけを今のブランチに

このテクニックは他の人と共同でプログラムを作っている時に役に立つ
以下のコマンドで特定のコミットだけを今のブランチに反映させることができる

$ git cherry-pick [commit hash]

どこから引き取ったコミットなのかを以下のコマンドで付け足すことができる(強制ではない)

$ git cherry-pick -x [commit hash]


cherry-pickpull?はどう違うのか

リソース: You mean the difference between a pull and a cherry-pick? I've been a user of gi... | Hacker News

***この部分に関しては正直100%正しい自信がないので間違ってたら教えてくれると嬉しいです***
pullは指定したブランチのすべてのコミットをターゲットのブランチに反映させる。しかし、時にそういうことはしたくないときがある。オープンソースを作るだ。この時様々な人がいろんなコミットを反映させようとする。だが、本当に欲しいのはそのうちのいくつかのコミットだけでしょう。だからそのコミットを指定してcherry-pickで反映させる。

使いやすいseed.rbファイルの書き方

職場でものすごく使いやすいseed.rbファイルを見たので、軽くシェアするぜ!
同じものは貼れないので適当に自分で作った簡単なものを載せます

def seed_user
    User.create(name: "anonymous", email: "anonymous@example.com")
end
def seed_admin
    User.create(name: "admin", email: "admin@example.com", admin: true)
end

case Rails.env
    when "development"
        seed_admin
    when "test"
        seed_admin
        seed_user
end

Userモデルがあるとして、上記のようなseed.rbを作る。
そうすると、ローカルとテストの時両方において、管理者(admin)は存在するが、ユーザーはテストの時にだけ読み込まれる。
このように、関数を使ってどのデータを読み込むのか指定すること状況において、必要なデータを読み込む関数を実行するかどうか指定するだけだから修正しやすい。

まとめ

今日は結構のんびりした日。あまり進んだ気がしない。まあ、個人的にはいろんな発見があった気がする。seed.rbの新しい使い方とかgitの新しいコマンドだったり。次は実際に自分で使ってみて、頭に入れなきゃ!
明日はもっといろんなもの学べるといいなーー


ご精読ありがとうございました。では、また次回まで✌




Day 7はこちら↓↓
programming-shop.hatenablog.com


Day 5はこちら↓↓
programming-shop.hatenablog.com

Ruby on Rails開発のインターン (Day 5)

こんにちは、皆さん!

勤務開始時は少し眠い感じ。ちゃんと起きてられるといいが...


  • トピック:
  1. reCAPTCHAとは?
  2. RailsでreCAPTCHAを実行する


  • 疑問:


  • 問題:


  • 学習した内容:
  1. reCAPTCHAの実行


  • 今後やりたいこと:
  1. reCAPTCHAを自分のプロジェクトにも追加する
  2. reCAPTCHAのチュートリアル動画を作る


  • リソース:
  1. Adding reCAPTCHA To Your Rails Application - RichOnRails.com


reCAPTCHAとは?

reCAPTCHAとは下記の写真のロボット対策のセキュリティです。通常フォーム記入の画面で使われます。
f:id:Programming_Shop:20180713093204p:plain


これはグーグルが提供しているAPIであり、登録して必要なキーさえ手に入れたら、自分自身のアプリケーションで使うことができます!
登録はこちら→reCAPTCHA: Easy on Humans, Hard on Bots


RailsでreCAPTCHAを実行する

*この記事はデータベースにデータを保存する前にreCAPTCHAテストをすることを前提としてます*
いつも通り、最初の作業はgemをGemfileに追加

gem 'recaptcha', require: 'recaptcha/rails'

そしたら、reCAPTCHAのサイトキーとシークレットキーを保存するためにconfig/initializers/recaptcha.rbを作成し、次の内容を中に入れる

Recaptcha.configure do |config|
  config.site_key  = Rails.application.secrets.recaptcha_site_key
  config.secret_key = Rails.application.secrets.recaptcha_secret_key
end

2つのキーを環境変数として設定するのを忘れずに!!
環境変数の設定の仕方については→ Ruby on Rails環境変数の設定 - Programming_Shopの日記


下記の内容をreCAPTCHAを使いたいところに入れましょう

<%= recaptcha_tags %>

そしたら、create関数に下記のコードを入れて、ユーザーがreCAPTCHAの質問に正解できたか確認します (Userを作るためのフォームがある前提で)

verify_recaptcha(model: @user)

ユーザーが正解できたのなら、true、間違えたのなら、falseを返してきます
ということで、下記のようによく利用されます

  def create
    @user = User.new(user_params)
    if !verify_recaptcha(model: @user) || !@user.save
      render "new"
    end
  end

このコードですと、ユーザーがreCAPTCHA間違えた場合とフォームを確実に埋めることができなかった時の両方の場合ともフォームに戻ってくれます。

まとめ

今日の仕事は楽しかった感じがします。controllerのためのRspecコードをどうやって書くかでだいぶ悩んでしまって少し時間を食いました。結局答えは出なかったので、また明日かな(笑)
いづれにいろ、今日はバグを一つ直し、reCAPTCHAを実行することもできたのですごいいい感じ!!
明日どんな新しいことに出会えるか楽しみです☺


ご精読ありがとうございました。では、また次回まで✌




Day 6はこちら↓↓
programming-shop.hatenablog.com


Day 4はこちら↓↓
programming-shop.hatenablog.com

Ruby on Rails開発のインターン (Day 4)

こんにちは、皆さん!

最初の週末が終わり、二週目に突入!!
週末は仕事のことは何も触れなかったし、それはいいこと。でも、残念ながら増やす予定だった勤務時間をしっかりやらなかったから今週は毎日8時間勤務だ(笑)
次はもっと計画的に...


  • トピック:
  1. Rspecの実行方法
  2. Rspecでcontrollerをテストする
  3. Rspecのコードカバレッジの実行
  4. build(..)create(..)関数の違い


  • 疑問:


  • 問題:


  • 学習した内容
  1. Rspecでcontrollerのテスト
  2. Rspecでコードカバレッジを実行する
  3. Rspecにおけるbuild(..)create(..)関数の違い


  • 今後やってみたいこと:
  1. Rspecチュートリアル動画を作る


  • リソース:
  1. Ruby for Newbies: Testing with Rspec
  2. Controller specs - RSpec Rails - RSpec - Relish
  3. Ruby code coverage using RSpec, SimpleCov and Jenkins


Rspecの実行方法

もし、Rspecについてあまり知らないのでしたら、この記事が役に立つかもしれません (Rspec の勉強 (パート1)Rspecのインストール - Programming_Shopの日記)


ここからは下記のUserモデルを使います

class User < ApplicationRecord
    validates :name, presence: true
end



最も基本的なRspecの実行方法は

$ rspec spec

僕の時の結果は

Finished in 0.01031 seconds (files took 0.92375 seconds to load)
1 example, 0 failures

でも、下記の方法でもっと詳細を確認できます

$ rspec spec --format documentation

そして、結果がこれ

User
  is not valid without name

Finished in 0.00977 seconds (files took 1.21 seconds to load)
1 example, 0 failures

つまり、 「is not valid without name」という名前のテストがクリアしたってことですね


エラーを発生させるパターンのもやりました

  it "raises an error when saving without name" do
    user = User.new(name: nil)
    expect{user.save!}.to raise_error(ActiveRecord::RecordInvalid, "Validation failed: Name can't be blank")
  end

一つ注意したいのが
"Validation failed: Name can't be blank" はこの通りに書かないといけないということです(大文字、小文字含め)

Rspecでcontrollerをテストする

下記のコードでusers_controllerをテストしました

    it "renders index template" do
        get :index
        expect(response).to render_template("index")
    end

やっていることはとてもシンプルでdef indexにアクセスしてindex.html.erbが表示されるかどうかのテストです。そしたら、次のようなエラーが発生しました。

  1) UsersController renders index template
     Failure/Error: expect(response).to render_template("index")

     NoMethodError:
       assert_template has been extracted to a gem. To continue using it,
               add `gem 'rails-controller-testing'` to your Gemfile.
     # ./spec/controllers/users_controller_spec.rb:6:in `block (2 levels) in <top (required)>'

初めて知ったのですが、controllerをテストしたいのなら gem 'rails-controller-testing'Gemfileに追加しないといけないみたい
そのあとは順調にいきました

Rspecのコードカバレッジの実行

リソース: Ruby code coverage using RSpec, SimpleCov and Jenkins

コードカバレッジRspecで全体のコードのうちどれだけの範囲のコードがしっかりとテストされているかを示してくれます。もちろん100%が一番望ましいが、大きいプロジェクトなら90%以上で大丈夫!


コードカバレッジを見るためにはGemfileに新しいgemを追加しないといけない

gem 'simplecov', require: false, group: :test

bundle installしたのち、sepc/spec_helper.rbの初めの部分に下記のコードを入れます

require 'simplecov'
SimpleCov.start

そしたら、Rspecrspec specで実行!
結果:

Finished in 0.0264 seconds (files took 2.12 seconds to load)
3 examples, 0 failures

Coverage report generated for RSpec to /home/boyiy/Desktop/tester/coverage. 67 / 67 LOC (100.0%) covered.

コードカバレッジが100%と表示されています(よっしゃーー)
そしたら、ブラウザーを開いてtester/coverage/index.htmlファイルを開いて詳細をみましょう!
僕のはこんな感じ:
f:id:Coding_Studio:20180710044419p:plain

build(..)create(..)関数の違い

2つともオブジェクトを作成しますが、build関数はデータベースに作成したものを保存しないのに対し、create関数はします。
データベースにデータを書いたり、読み込むのは時間がかかることが知られています。
ですので、データベースを使わないときはbuild関数を使いましょう!

まとめ

今日はすごくよかった。自分で見つけたバグを治し、なんか達成感を感じた。すでに、プログラムが結構大きくなってるので、どこがどことどうつながっているかを学ぶのにものすごい時間がかかっちゃった。でも、昔やった他のプログラミング言語よりは簡単な気がする。RailsのMCVという決まったデザインはプログラマーにもすごく優しいなと改めて感じた。
Rspecの基礎を学べたのもうれしい。
明日はreCAPTCHAを実行する予定なので頑張っていきますぜ!


ご精読ありがとうございました。では、また次回まで✌




Day 5はこちら↓↓
programming-shop.hatenablog.com


Day 3はこちら↓↓
programming-shop.hatenablog.com

Ruby on Rails開発のインターン (Day 3)

こんにちは、みなさん

インターン三日目がやってきました!
今度はしっかり睡眠をとったので、最後までやれるかな(笑)
えっと、今日の仕事内容はHerokuでのPostgreSQLのバックアップとRspecの学習って感じですね!


  • トピック:
  1. Herokuでデータベースのバックアップ


  • 疑問:


  • 学習した内容
  1. Herokuにおけるデータベースのバックアップ


  • 問題:


  • 今後してみたいこと:
  1. HerokuでGoogle Mapを実行する


  • リソース:
  1. https://richonrails.com/articles/environment-variables-in-ruby-on-rails
  2. https://devcenter.heroku.com/articles/config-vars


Herokuでデータベースのバックアップ

iPhoneのバックアップのようにHerokuでもデータベースのバックアップを取ることができます。
知っての通り、Herokuは通常PostgreSQLを使います。ここで使っていくコマンドがbackups!もうその名のとおりですね(笑)
最新のバックアップをチェックするときはこちら↓↓

$ heroku pg:backups

バックアップがない状態ですると下記のようになるはず

=== Backups
No backups. Capture one with heroku pg:backups:capture

=== Restores
No restores found. Use heroku pg:backups:restore to restore a backup

=== Copies
No copies found. Use heroku pg:copy to copy a database to another

単純にバックアップがないってことですね
そしたら、次のように作れます。(iPhoneでいう「バックアップする」のボタンだね)

$ heroku pg:backups:capture

先ほどと同じようにバックアップを確認すると...

=== Backups
ID    Created at                 Status                               Size      Database
────  ─────────────────────────  ───────────────────────────────────  ────────  ────────
b001  2018-07-06 21:55:50 +0000  Completed 2018-07-06 21:56:26 +0000  140.48KB  DATABASE

=== Restores
No restores found. Use heroku pg:backups:restore to restore a backup

=== Copies
No copies found. Use heroku pg:copy to copy a database to another

iPhoneよりも詳細に見れます!
IDの数字はいくつ目のバックアップなのかを示しています。


そしたら、バックアップの復元がもちろん気になるところですね!

$ heroku pg:backups restore [backup_id]

これで指定したバックアップの復元ができます。なお、データベースの内容を一気に大きく変える可能性のあるコマンドなので、確認としてHerokuアプリの名前の入力を要求されるかもしれません!


他にも様々なコマンドがあるので、下のコマンドで確認して試してみましょう!!

$ heroku pg:backups --help


まとめ

職場にはだいぶ慣れてきました。将来の自分の生活がこんな感じって考えると、なんだか満足してる感じがします。これが普通の職場環境かどうかわかりませんが、新しいことを学んだり、音楽を聴いたりするのにYoutubeを使ってても問題ないですし、このブログを書いててもかまいません(確かに仕事のわからないところや学習したことを記録しているが)。
とりあえず、この自由な感じが将来の自分の職場で当たり前であることを祈ってます(笑)


ご精読ありがとうございました。皆さんの役に立てると嬉しいです(ニコリ)。では、また次回まで✌




Day 4はこちら↓↓
programming-shop.hatenablog.com


Day 2はこちら↓↓
programming-shop.hatenablog.com

Ruby on Rails開発のインターン (Day 2)

こんにちは、皆さん!

インターン2日目がやってきました。
十分に寝てないので、途中でバテるかも
(仕事中にこれ書いてます笑)
最初にミーティングがあって、2日目ということもあり、何もできなかったけど、開発者たちのミーティングがどういうものなのか体験できる貴重な経験でした


  • トピック:
  1. Postgresqlの処理
  2. 既存のデータベースにコラムを追加する


  • 疑問:
  1. ターミナルで-uはどんなことをするのか ?


  • 学習した内容:
  1. Herokuは config/database.yml をつかっていないから、.gitignore に入れてPostgreSQL のパスワードを安全に保護できる
  2. Linuxのいいところはエラーが発生した時にどこの何がダメなのか教えてくれて、足りないものがあれば、それをインストールするためのコマンドも教えてくれるところ
  3. クラウド版のBalsamiqがあり、簡単に他の人とコンテンツをシェアできる
  4. TwilioはメッセージやビデオなどのAPIを提供している会社
  5. Railsでローカルサーバーが使えるのはPumaのおかげである
  6. migrationで既存のデータベースにコラムを追加する


  • 問題:
  1. Postgresqlのパスワードが違って、データベースを作れない (解決)
  2. masterじゃないブランチをHerokuにプッシュすることができない (解決)


  • 今後知りたいこと:
  1. Twilioの使い方


  • リソース:
  1. https://medium.com/coding-blocks/creating-user-database-and-adding-access-on-postgresql-8bfcd2f4a91e
  2. https://devcenter.heroku.com/articles/git#deploying-code
  3. http://guides.rubyonrails.org/active_record_migrations.html


Postgresqlの処理

rake db:migrateをしようとした時、Postgresqlのパスワードが違うからエラーが出たけど、正しいパスワードも覚えていませんでした笑
ということで、このウェブサイトへ (Creating user, database and adding access on PostgreSQL) それで下記のを試した:

$ sudo -u postgres psql
psql=# alter user [username] with encrypted password '[password]';

これでうまく既存のパスワードを変更することができました。(パスワード前後のクウォート'を忘れずに)


次にconfig/database.ymlでデータベースが作成されていないというエラーが発生しました。
そこで、先ほどのサイトの下記のコマンドを試してみました:

$ sudo -u postgres createdb [dbname]

すると、うまくデータベースが作成され、無事 rake db:migrateすることができました。

masterじゃないブランチをHerokuにプッシュする

masterじゃないブランチのコードをプッシュしたら、見た感じは大丈夫だったのだが、ウェブの立ち上げをしてくれませんでした。
これはHerokuがmasterで指定されてて、そうじゃないブランチからのコードでのウェブ立ち上げはしないようになっているからです。


でも、このウェブ通りにやってみたら、 (Deploying with Git | Heroku Dev Center).

$ git push heroku [local-branch]:master

でも、このコマンドは次のエラーを返してきました。

To https://git.heroku.com/glacial-beach-21775.git
 ! [rejected]        obi_boyis_first_run -> master (non-fast-forward)
error: failed to push some refs to 'https://git.heroku.com/glacial-beach-21775.git'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. Check out this branch and integrate the remote changes
hint: (e.g. 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

これはおそらくすでにHerokuのアプリを作成してあったためだと思います。
それでforce pushをしてみようと思いました。

$ git push -f heroku [local-branch]:master

これで一応解決しました。ただ Herokuのアプリを一度削除してから再度作る という方法でも解決できるんじゃないかなと思います。これなら force push する必要はないかと思います。

既存のデータベースにコラムを追加する

リソース: Active Record Migrations — Ruby on Rails Guides

後になって、新しいカテゴリーの情報を保持して欲しいからデータベースにコラムを追加したくなることはしょっちゅうあります。Railsでは下記のようにそれを達成できます。

$ rails g migration AddUserToProducts

これはProductというモデルにユーザーを追加したい際の例です。このコマンドで下記のものが追加されます。

class AddUserToProducts < ActiveRecord::Migration[5.0]
  def change
  end
end

そしたらchangeメソッドの中に下記の内容を追加:

add_column :products, :user, :string

ちなみに、下記のように一度に全部やることもできます。

$ rails g migration AddUserToProducts user:string

(user:stringの間はスペースなし)

まとめ

総合していうと、結構タフな日でした。
テストをして行くには十分なローカルの環境設定は終わりました。僕の主要な役割はテストとその間に潜在するバグを直す方法を探ること。少しずつややこしくなってきたので、もう少しRspecの勉強に時間をかけなければと思ってるところです。
それでも、この自由な環境には感謝してます。彼らは僕が何をしているかは全然気にせず、リフレッシュするために仮眠したり、出歩いてもいいって感じです。ほんとありがたい!!


多分今夜は明日の仕事のためにちゃんと寝ると思う…わかんないけど笑
ご精読ありがとうございました。では、また次回まで✌︎




Day 3はこちら↓↓
programming-shop.hatenablog.com


Day 1はこちら↓↓
programming-shop.hatenablog.com