Ruby on Rails開発のインターン (Day 7)
こんにちは、皆さん!
今日は調子よし、そして、またメモリリークやっていくぜ!
- トピック:
- 疑問:
- 問題:
- ウェブサイト上でpdfを作った際にメモリリークが起きていること
- 学習した内容:
config/locales/en.yml
は英語版のウェブサイトのテキストを保管しているtop
コマンドでLinuxにおいて、メモリの用途を確認できる
- 今後やりたいこと:
- 2か国語以上のウェブサイトを作る
- 多言語化について別で記事を書く
- リソース:
- How I spent two weeks hunting a memory leak in Ruby
- Rails Internationalization (I18n) API — Ruby on Rails Guides
Railsで多言語対応のテキストを実行
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を作成するページをリロードする前
それで、リロードした後は
見ての通り、赤くマークしたところの数字が上昇。これはメモリリークの可能性を強く表している。
この問題はおそらく今回のインターンでの一番の山場だろう(笑)
まとめ
次はもっと前進できることを祈って!
ご精読ありがとうございました。では、また次回まで✌
Ruby on Rails開発のインターン (Day 6)
こんにちは、皆さん!
今日は30分遅刻なので、終わるのも30分遅くなりそう...
今日の内容はメモリリークの処理だから難しそう
(更新)結局この記事ではメモリリークに触れるところまではいきませんでした(笑)
- トピック:
- 疑問:
- 問題:
- 学習した内容:
git cherry-pick
コマンドcherry-pick
とpull
の違い- 整っていて応用性の高い
seed.rb
ファイル database_cleaner
でテスト後のデータベース自動掃除- コマンドの代わりに
Rails.application.load_seed
で自動でデータを読み込む
- 今後やりたいこと:
- 上記の
seed.rb
ファイルを自分で実行する cherry-pick
とpull
の違いについて動画を作る
- リソース:
- Git - git-cherry-pick Documentation
- You mean the difference between a pull and a cherry-pick? I've been a user of gi... | Hacker News
- What does cherry-picking a commit with git mean? - Stack Overflow
- 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-pick
とpull?
はどう違うのか
***この部分に関しては正直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の新しいコマンドだったり。次は実際に自分で使ってみて、頭に入れなきゃ!明日はもっといろんなもの学べるといいなーー
ご精読ありがとうございました。では、また次回まで✌
Ruby on Rails開発のインターン (Day 5)
こんにちは、皆さん!
勤務開始時は少し眠い感じ。ちゃんと起きてられるといいが...
- トピック:
- 疑問:
- 問題:
- 学習した内容:
- reCAPTCHAの実行
- 今後やりたいこと:
- reCAPTCHAを自分のプロジェクトにも追加する
- reCAPTCHAのチュートリアル動画を作る
- リソース:
reCAPTCHAとは?
これはグーグルが提供しているAPIであり、登録して必要なキーさえ手に入れたら、自分自身のアプリケーションで使うことができます!
登録はこちら→reCAPTCHA: Easy on Humans, Hard on Bots
Railsで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間違えた場合とフォームを確実に埋めることができなかった時の両方の場合ともフォームに戻ってくれます。
まとめ
いづれにいろ、今日はバグを一つ直し、reCAPTCHAを実行することもできたのですごいいい感じ!!
明日どんな新しいことに出会えるか楽しみです☺
ご精読ありがとうございました。では、また次回まで✌
Ruby on Rails開発のインターン (Day 4)
こんにちは、皆さん!
最初の週末が終わり、二週目に突入!!
週末は仕事のことは何も触れなかったし、それはいいこと。でも、残念ながら増やす予定だった勤務時間をしっかりやらなかったから今週は毎日8時間勤務だ(笑)
次はもっと計画的に...
- トピック:
- 疑問:
- 問題:
- 学習した内容
- 今後やってみたいこと:
- リソース:
- Ruby for Newbies: Testing with Rspec
- Controller specs - RSpec Rails - RSpec - Relish
- Ruby code coverage using RSpec, SimpleCov and Jenkins
Rspecの実行方法
ここからは下記の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で全体のコードのうちどれだけの範囲のコードがしっかりとテストされているかを示してくれます。もちろん100%が一番望ましいが、大きいプロジェクトなら90%以上で大丈夫!
コードカバレッジを見るためにはGemfile
に新しいgemを追加しないといけない
gem 'simplecov', require: false, group: :test
bundle install
したのち、sepc/spec_helper.rb
の初めの部分に下記のコードを入れます
require 'simplecov' SimpleCov.start
そしたら、Rspecをrspec 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
ファイルを開いて詳細をみましょう!
僕のはこんな感じ:
build(..)
とcreate(..)
関数の違い
build
関数はデータベースに作成したものを保存しないのに対し、create
関数はします。データベースにデータを書いたり、読み込むのは時間がかかることが知られています。
ですので、データベースを使わないときは
build
関数を使いましょう!まとめ
Rspecの基礎を学べたのもうれしい。
明日はreCAPTCHAを実行する予定なので頑張っていきますぜ!
ご精読ありがとうございました。では、また次回まで✌
Ruby on Rails開発のインターン (Day 3)
こんにちは、みなさん
インターン三日目がやってきました!
今度はしっかり睡眠をとったので、最後までやれるかな(笑)
えっと、今日の仕事内容はHerokuでのPostgreSQLのバックアップとRspecの学習って感じですね!
- トピック:
- 疑問:
- 学習した内容
- Herokuにおけるデータベースのバックアップ
- 問題:
- 今後してみたいこと:
- HerokuでGoogle Mapを実行する
- リソース:
- https://richonrails.com/articles/environment-variables-in-ruby-on-rails
- https://devcenter.heroku.com/articles/config-vars
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
まとめ
とりあえず、この自由な感じが将来の自分の職場で当たり前であることを祈ってます(笑)
ご精読ありがとうございました。皆さんの役に立てると嬉しいです(ニコリ)。では、また次回まで✌
Ruby on Rails開発のインターン (Day 2)
こんにちは、皆さん!
インターン2日目がやってきました。
十分に寝てないので、途中でバテるかも
(仕事中にこれ書いてます笑)
最初にミーティングがあって、2日目ということもあり、何もできなかったけど、開発者たちのミーティングがどういうものなのか体験できる貴重な経験でした
- トピック:
- 疑問:
- ターミナルで
-u
はどんなことをするのか ?
- 学習した内容:
- Herokuは
config/database.yml
をつかっていないから、.gitignore
に入れてPostgreSQL のパスワードを安全に保護できる - Linuxのいいところはエラーが発生した時にどこの何がダメなのか教えてくれて、足りないものがあれば、それをインストールするためのコマンドも教えてくれるところ
- クラウド版のBalsamiqがあり、簡単に他の人とコンテンツをシェアできる
- TwilioはメッセージやビデオなどのAPIを提供している会社
- Railsでローカルサーバーが使えるのはPumaのおかげである
- migrationで既存のデータベースにコラムを追加する
- 問題:
- Postgresqlのパスワードが違って、データベースを作れない (解決)
- masterじゃないブランチをHerokuにプッシュすることができない (解決)
- 今後知りたいこと:
- Twilioの使い方
- リソース:
- https://medium.com/coding-blocks/creating-user-database-and-adding-access-on-postgresql-8bfcd2f4a91e
- https://devcenter.heroku.com/articles/git#deploying-code
- 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にプッシュする
これは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 する必要はないかと思います。
既存のデータベースにコラムを追加する
後になって、新しいカテゴリーの情報を保持して欲しいからデータベースにコラムを追加したくなることはしょっちゅうあります。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の勉強に時間をかけなければと思ってるところです。
それでも、この自由な環境には感謝してます。彼らは僕が何をしているかは全然気にせず、リフレッシュするために仮眠したり、出歩いてもいいって感じです。ほんとありがたい!!
多分今夜は明日の仕事のためにちゃんと寝ると思う…わかんないけど笑
ご精読ありがとうございました。では、また次回まで✌︎