Load to Professional...

最高の凡人系Webエンジニアへ。地に足をつける。

AWS-SAAに一発合格しました

概要

12/27にAWS-SAAを受験し、無事合格しました。

自己紹介

試験2週間前までのまとめ

  • 前回記事で、受験のきっかけ、勉強開始〜2週間前までにどのような試験対策をしていたかまとめています

AWS-認定SAAに挑戦します - Load to Professional...

試験直前2週間前にやったこと

①「AWSWEB問題集で学習しよう」でひたすら問題を解く

試験直前は「AWSWEB問題集で学習しよう」の問題#80〜#140を正答率をGoogle Spread Sheetにメモしながら1周し、正答率が低かったもののみ2週目を行いました。

2週目ですべての問題で8割以上の正答率を超えた頃に、「本試験モード」にて2回連続9割以上を得点できたので

「AWSWEB問題集で学習しよう」の回答ページは、問題の選択肢毎にAWSの公式ホワイトペーパーや某methodさんのAWS記事へのリンクが貼られていて、

② 苦手箇所をAWS BlackBeltで学習

重点的に学習するべき項目の勉強に役に立ちました

  • CDN系(Cloudfront)
  • サーバレス系(Lambda、API Gateway)
  • ストレージ系(S3、FSX、Storage Gateway) ..etc

試験について

試験内容については守秘義務があるので詳しくは書けませんが、 「AWSWEB問題集で学習しよう」の設問の範囲の知識がある人だったら、どの問題も2択までは絞ることができると思います。

2択から1つをどのように選ぶかは、その問題がどのような意図で出題されているかを考えるべきです。 →パフォーマンス重視?コスト最適化重視?保守運用のしやすさ重視?など

一部初めて見る問題や、全然わからない問題もありましたが、大半は自信を持って答えられたので良しとしました。それでも結果的に合格できました。

やればよかったなと思ったところ

短期間でAWS SAAの合格を目指す試験対策的にはこの学習内容で良いと思います。

ですが、合格後AWSを少し触っていて、今後実務で使う頃を考えると知識だけでは足りずハンズオンや実際の環境構築などの知識以外の経験が必要だなと感じました。

最後に

この1年資格を1つでも多く取れる1年にしたいので慢心せず、勉強を続けたいと思います。 今の所の予定は下記

勉強していく中で、アウトプットの癖をつけるという意味でもまたブログにかけるといいなと思います。

AWS-認定SAAに挑戦します

はじめに

自己紹介

なぜ受験するか?

資格とってみよう、の第一歩と パブリッククラウドへの興味、憧れ。

インフラエンジニアとしての今後のキャリアを考えたとき、周りに能力を証明できる資格をなにも持っていないのはまずいと考えたことと、 クラウド案件の経験はないが今後経験させてもらえるように最低限この資格は持っておきたかった。

この二点が理由でした。

これまでの学習

勉強方法

  • 参考書
  • WEB資料(AWS blackbelt)
  • udemy講座

使用している参考書/WEB資料

参考書

  • AWS認定資格試験テキスト AWS認定 ソリューションアーキテクト-アソシエイト

www.amazon.co.jp

  • 徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書

www.amazon.co.jp

udemy講座
  • これだけでOK! AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座

www.udemy.com

学習期間

-2019/4〜

最初にudemy講座を買った日。

ほぼ未着手のまま1年くらい立っていた気がする。。。

ので実際は下記の期間。

  • 2020/6末〜2020/12 現在

最初に参考書を買った日を初日としてます

学習時間

平日:30分〜1時間

休日:1時間〜3時間

やったりやらなかったりしていたので、 今日まで100時間いかないくらいやった気がします

学習方法
① ハンズオン学習 (勉強期間:数ヶ月)
  • udemyの「これだけでOK〜」を実践

良かった点:

ハンズオンでAWSのサービスを実際に触りながら勉強できたことがよかった。このあとは参考書メインの勉強になったが、はじめにハンズオンをやっていてよかったと感じたことも少なくなかったと思う。

解説セクションは、②、③の参考書より内容はずっと濃く、サービスのより詳細についてまで網羅。

良くなかった点:

とにかく長い。

一本一本が長くすべて順番通り実施しようとしてしまったため、感想までにめちゃめちゃ時間がかかってしまって、完全に学習のボトルネックになっていた。



② 参考書学習(期間:2ヶ月)
  • AWS認定資格試験テキスト〜」(オレンジ本)

良かった点:

AWSのサービスごとにカットされてさらっと書かれていて読みやすい。

内容が薄めなので網羅的にサービスを理解しやすく、出勤時間のお供に最適だったと思う。

良くない点:

いい点でもあるが内容が薄いので、これだけで実際の試験を乗り切るのは正直厳しそう。

本当に学習を始める導入用。



  • 「徹底攻略 AWS認定〜」 (黒本)

良かった点:

オレンジ本はサービスカットだが、黒本はAWS Well-Architected フレームワークカット。

試験はサービス単体の内容より要求されるフレームワークに合ったサービスはどれ?という形式で出ているらしいのでより実践的。

良くない点:

オレンジ本と同じく内容は薄め。

サービス間連携を学ぶ導入としてはとてもいいと思うが。



③ひたすら問題集を解く+知識の補填 (期間:2ヶ月〜)
  • 黒本の問題集、udemyの問題集など

良かった点:

これをもっと早くにやるべきだった。

知識習得 → 実践 → 不足箇所の補填

このサイクルで現在やっていますがただ本を読んでいるより定着率が違う。

今後の資格勉強のベースにしていきたい。

良くない点:

始めることが遅かった。

受験2ヶ月前。。。

これから

12/27に受験します。

正直自信はないですが、、、受かっても受からなくてもまたブログ記事にしてみよーと思います!

さいごに

この試験をとって終わり!とは考えていません。

今年は今後ももっと資格学習進めていきます!

今後取りたい資格

来年にかけて取りたい資格まだまだあるのでAWS-SAAは一発で通りたい!と思っているが果たして。。。



以上、ここまで読んでいただいてありがとうございました。

active_adminを導入しよう

自作Webページにactive_ adminを導入してみたのでその記録をしてみる。

1.開発環境

2.導入理由

  • GUIでDB操作ができるように管理者コンソールを作りたい
  • 0-1で作るのは時間的に厳しいのでgemを使おう

qiita.com

上記Qiitaの記事を読んで、総合的に一番優秀そうな

「active_admin」

に決めました。

3.導入

3-1.Gemfileからのbundle install

gem 'activeadmin'
gem 'devise'
$ bundle install

※当方環境ではDockerを使用しているので、docker-compose build し直しました。
これも設定次第でbuildし直ししなくてもよくなるそうなので適用して近々記事にします!!



うまくいけば下記のように追加されます

3-2.Gemfile.lock

    activeadmin (2.4.0)
      arbre (~> 1.2, >= 1.2.1)
      formtastic (~> 3.1)
      formtastic_i18n (~> 0.4)
      inherited_resources (~> 1.7)
      jquery-rails (~> 4.2)
      kaminari (~> 1.0, >= 1.0.1)
      railties (>= 5.0, < 6.1)
      ransack (~> 2.1, >= 2.1.1)
      sassc-rails (~> 2.1)
      sprockets (>= 3.0, < 4.1)
      sprockets-es6 (~> 0.9, >= 0.9.2)
 
以下略.....
kaminariとかransackとかがありますね〜

3-3.Rails generateする

$ bundle exec rails g active_admin:install

      invoke  devise
    generate    devise:install
      create    config/initializers/devise.rb
      create    config/locales/devise.en.yml
  ===============================================================================

Some setup you must do manually if you haven't yet:

  1. Ensure you have defined default url options in your environments files. Here
     is an example of default_url_options appropriate for a development environment
     in config/environments/development.rb:

       config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

     In production, :host should be set to the actual host of your application.

  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:

       root to: "home#index"

  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:

       <p class="notice"><%= notice %></p>
       <p class="alert"><%= alert %></p>

  4. You can copy Devise views (for customization) to your app by running:

       rails g devise:views

===============================================================================
      invoke    active_record
      create      db/migrate/20191007000038_devise_create_admin_users.rb
      create      app/models/admin_user.rb
      invoke      rspec
      create        spec/models/admin_user_spec.rb
      invoke        factory_bot
      create          spec/factories/admin_users.rb
      insert      app/models/admin_user.rb
       route    devise_for :admin_users
        gsub    app/models/admin_user.rb
        gsub    config/routes.rb
      append    db/seeds.rb
      create  config/initializers/active_admin.rb
      create  app/admin
      create  app/admin/dashboard.rb
      create  app/admin/admin_users.rb
      insert  config/routes.rb
    generate  active_admin:assets
      create  app/assets/javascripts/active_admin.js
      create  app/assets/stylesheets/active_admin.scss
      create  db/migrate/20191007000042_create_active_admin_comments.rb

うまくいきましたね。

3-4.DB Migration

$ bundle exec rails db:migrate

3-5.seedsでテストユーザを仕込む

$ bundle exec rails db:seed

3-6.ログインしてみる

active_adminの/adminが管理画面のデフォルトのルートになっているので ローカル環境でアクセスしたければ localhost:[ポート]/admin にアクセスしましょう。

f:id:oni_rb:20191008091532p:plain

⬆️作成したテストユーザのEmailアドレスとパスワードでログインしてください。

f:id:oni_rb:20191008091220p:plain

うまくログインできました!

カスタマイズ0でこんなに手軽に完成度の高い管理者コンソールができちゃいます!

4.現行環境に適用

デフォルトでは個別ページとして

  • admin_user
  • comment

のみModelとして登録されているので

既設のModelを登録するためにはactive_adminのresourceに追加する必要があります。

4-1.既存のUserモデルをactive_adminに追加

$ rails generate active_admin:resource User

      create  app/admin/users.rb

f:id:oni_rb:20191008124453p:plain

⬆️Users Modelの追加が確認できました

Modelの操作をする前に... 先ほど作成された「users.rb」に以下を追加しましょう。

permit_params :name, :admin

これでModel操作の準備ができました!

f:id:oni_rb:20191008124857p:plain

string属性のNameの入力フォームだけでなく

boolean属性のadminのチェックボックスも自動生成してくれます。

→ 必要情報を入力しCreate Userを選択すれば....

f:id:oni_rb:20191008124902p:plain

⬆︎testユーザの作成が確認できます。

まとめ

  • 導入簡単
  • Model操作もやってくれる
  • カスタマイズには学習コスト要

以上です。 皆さんもぜひ試してみてください!

Chartkick導入してみた

はじめに

自作しているWebアプリの管理者コンソールが見た目がとても寂しく、、、

f:id:oni_rb:20190802195256p:plain


もっと管理者画面らしいことをできたらな〜〜〜

DBを一括管理できる画面があったらいいな〜〜〜

と思っていたところ

Chartkick

というgemで簡単にカッコいいグラフが作れると知り、導入してみよう!と思い立ちました。

対象読者

・Webアプリにかっこいいグラフをつけたくなった人 ・Chartkick使い始めたいな〜な人



導入には以下の公式リファレンスを参考にしました。

公式リファレンス

準備

環境

OSX : 10.13.6
Ruby : 2.6.3
Rails : 5.2.3
Mysql : 8.0.16

Gemfileに以下を追加してbundle install

gem "chartkick"

app/assets/javascripts/application.jsに以下を追加

//= require chartkick //= require Chart.bundle

Rails5ならこれだけでOKなはず



導入

Controller
〜〜省略〜〜
def index
  @tasks = current_user.tasks.all
end
〜〜省略〜〜
View
〜〜省略〜〜
<%= line_chart @tasks %>
〜〜省略〜〜



これで


f:id:oni_rb:20190802202832p:plain


データも何も入ってませんが、表示させることに成功。


ここまで超簡単です!

それっぽいデータを表示できるようにしてみる
gem "groupdate"


いつものごとくbundle installで導入。

〜〜省略〜〜
<%= line_chart @tasks.group_by_day(:created_at).count %>
〜〜省略〜〜



f:id:oni_rb:20190802210345p:plain

データも表示できました!!

※groupdate導入時にmysqlタイムゾーンを設定していなかったせいでエラーが。。。

https://github.com/ankane/groupdate#for-mysql

→公式サイトに助けてもらいました。

オプションを使えば、、、

プレフィックスサフィックス付与、データ無しの時の「No data」なんかも表示できました!


まとめ

Chartkickは本当に「一瞬」でおしゃれなグラフが作れる。


多重配列付近でNoMethodError for NilClassが出たとき

Webアプリ開発中に、controllerのunit test作成中にNoMethodError for NilClassが出て詰まったためメモ。

 

環境

・コントローラ (session_cotroller)

~略〜
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
log_in user
if user.admin
redirect_to admin_url
else
redirect_to root_url
end
else
flash.now[:danger] = "invalid email/password, failed to login"
render 'new'
end
end
~略〜
 
上記のコントローラに対して、以下のようなテストを記述した
 
・spec/controllers/sessions_controller_spec.rb
describe "#create" do

context "as correct user" do
let(:user) { FactoryBot.create(:user) }
let(:valid_parameters) do
{ email: user.email, password: user.password }
end

it "success to log in" do
post :create, session: valid_parameters }
expect(session[:user_id]).to eq user.id
end
end
end
 
すると、こんなエラーが。。。。
 

Failure/Error: user = User.find_by(email: params[:session][:email].downcase)

 

 NoMethodError:

 undefined method `[]' for nil:NilClass

 # ./app/controllers/sessions_controller.rb:10:in `create'

 # ./spec/controllers/sessions_controller_spec.rb:33:in `block (4 levels) in <main>'

 


 

エラー文の内容から、params[:session]がnilになってるのかな?とは推測できましたが、その原因がrspec側にあると考えず、controller側の修正を頑張ってしまうという見当違いなことをしてしまった。。。

 

解決策 

調べているうちに、この記事に出会う。

 https://teratail.com/questions/44554

 

上記記事によると、答えは単純明快。

コントローラ側は、

params[:session][:email]

と多重配列で値を渡しているが、

RSpec側は、

sessions[:email]

としてしまい、エラー。

 

paramsに値を入れられていないのだからnilになるのは当然ですよね、って話だった。

 

原因
user = User.find_by(email: params[:session][:email].downcase)

 

 これの意味を理解してかけていなかったことがそもそもの原因

 

教訓

・「理解できるコード」だけ書くようにしろ、を守れ。

・controllerで渡す値とテストで渡す値はANDになってますよね、って確認しよう。

【Javascriptの基本】変数宣言の使い分け 〜var、let、const〜

■はじめに

Javascriptを学びはじめ、最初に疑問に思ったことが、
変数宣言の方法が2種類あること。

「var」 と 「let」 です。
定数を宣言する「const」も含めたら3種類になります。

Javascript(以下:js)学習に利用させていただいている
https://developer.mozilla.org/ja/ さん
では、

コードでは 「var」ではなく可能な限り「let」 を使用することをお勧めします。コードで古いバージョンの Internet Explorer をサポートする必要がない限り、var を使用する理由はありません

 

とあるのですが、

「巻き上げって何?」
「varはなぜ使う必要がないの?」
「constは?」

と思ってしまい、いまいち使い分けについて理解できませんでした。

今後の自分のために備忘録として、調べてみたことをメモしたいと思います。

■対象読者

・プログラム初学者の方
・将来の自分

■jsにおけるスコープ

スコープとは?

・変数名や関数名の有効範囲のこと

グローバルスコープ

・関数の外(トップレベル)で宣言した変数
・プログラム全体から参照可能

・関数スコープ

・関数の中で宣言した変数
・その関数の中でのみ参照可能

ブロックスコープ

・ブロックの中で宣言した変数
・そのブロックの中でのみ参照可能

# jsではこれまでブロックスコープは存在しなかったが、
ECMAscript5から「let」が登場し、ブロックスコープを作り出せるようになった。

■巻き上げとは?

JavaScriptは関数内のどこでもvarの宣言を書ける
・関数のどこで宣言しても、先頭で定義したものとしてみなされる
・先頭部分で使いたい変数は全て定義するのが定石

つまり
関数の外で宣言を書けば、コードの先頭
関数の中で宣言を書けば、関数の先頭
で、宣言したと見做されてしまう


■それぞれの性質

var

・変数を宣言する (再代入可能)
・関数スコープである
・巻き上げが起こる

let

・変数を宣言する (再代入可能)
・関数スコープかつブロックスコープでもある
・巻き上げが起こる

const

・定数を宣言する (再代入不可)
・関数スコープかつブロックスコープである
・巻き上げが起こる


■まとめ

・「var」は基本使わない。
・再代入が必要な場合(for文など)は、「let」を使う。
・再代入が不要な場合は、「const」を使う。
・巻き上げはどれを使っても起きるので、変数宣言はスコープの一番上で行う。

 

■参考記事様

・スコープについて

https://qiita.com/Kazuuuuuki/items/3c40bbe6e7bb7ff84e3e

 

・使い分けについて

https://qiita.com/wannabe/items/b2a0d63fc786eab13c48

https://qiita.com/masarufuruya/items/096e51c3e4c36c86ae27

 

プログラミング歴:3か月、初学者によるRails Tutorial完走記

こんばんは!

みなさんはGWいかがお過ごしでしたか? 私はたくさん勉強するぞ!!と意気込んで丸3日ほど勉強時間を確保していたのですが、そこまで捗りませんでした。。。

そんな最終日の夜、GWの余韻を感じながらこの記事を書いております。

 

早速ですが、本題に入っていきたいと思います。

 

(前回までのあらすじは、 ↓ このあたりの過去記事を読んでいただければわかります!)

ここ1ヶ月の学習状況 - Ashiro-days

プログラミング学習記録 〜Rails Tutorial完走しました〜 - Ashiro-days

 

プログラミング初学者がRailsTutorialを完走してみて?

先日、Rails Tutorial(以下、RT)を完走したプログラミング学習歴3ヶ月の筆者が、今の心境を今後の自分への備忘録、そしてこれからRTを利用してRuby on Railsを学ぼうとしている方の役に立てたらと思い、

 

 

完走してよかったこと

・学習コスト(お金)がかからなかった

 

・学習する癖がついた
・手順書に沿ってだが、Webサイトを0から開発することができた。
・想定していないエラーが出た時に検索し、特定するスピードが徐々についた。

 

反省すべき点

・学習コスト(時間、効率)がかかりすぎた

この期間をどう捉えるかは正直人によると思う。学習を初めて一番モチベーションが高い時期をRTに費やすべきかどうかは考えるべきだった。

(作業予定やWBS的なものを作成しなかったので、結果その日その日のやる気やモチベーションに依存した、行き当たりばったりの開発になってしまったことも反省点。)

 

・0-1で全て自分で開発したわけではないため、ポートフォリオにならない。

RTの手順書はとても丁寧。コードのコピペだけで手順自体は止まらずサクサクと作成することが可能なので、RTの成果物では企業へのアピールにはならないと思う。

私はポートフォリオするつもりで作成したわけではないが、最速もしくはなる早でWeb 系エンジニアへのジョブチェンジを目指す人は意識すべき点だと思う。

 

・技術的要素(主にRails,js)についてほとんどわからないまま終えてしまったこと。

当初、手順書をコピペして進めてしまっていたためサクサクと進みすぎて理解が追いつかないことがしばしばあった。途中からそのやり方を見直し、原則全てコードは手で打つようにしたが、理解できないコードもみたまま写してしまい、結果理解できないまま進んでしまう、ということが続いた。

  

・7章を越えたあたりから急激に難易度が上がり、それ以降は手順に沿ってやることしかできなかった。

作業が難しくなる7章以降、以下のようなサイクルを繰り返してばかりだった。

 

1. 技術的に難しい箇所が現れる → 2. 考えるがわからない → 3. 作業が遅れた気がしてくる → 4. 焦って急いで手順を進める → (1. に戻る)

 

今思えば、わからないところ難しいところが現れたのなら、手を止め理解できるように善処すべきだった。RTは基本的にその章までに扱った記述的要素は理解しているものと見做され、手順が進んでいく。そのため、わからないところを放置してしまうとその先の内容も連鎖的に理解できなくなってしまう。

 

・作業に集中しすぎて、アウトプットが極端に少なかった。

道中、行ったアウトプットは、2度のブログ投稿、たまにTwitterくらいだった。これは完全な怠慢だと思っていて、理解が深まらなかった原因と認識している。次回からの学習では毎日の作業予定の中にアウトプットの時間を必ず組込む。

 

まとめ

ここまでつらつらとよかった点悪かった点を挙げてきましたが、言いたいことを三点にまとめてみます!

 

・頭を使って挑むべき

いきなりWebサイト作るぞ!と飛びつくのではなく、やる目的や確保できるリソースを理解し、判断して、やるかどうか決めるべき。

プログラミング初学者が学ぶべき技術要素は、Ruby on Railsだけでなく他にもたくさんあると思うので、精査に時間を掛け、戦略的に挑もう!

 

・焦らず自分のペースでやろう

理解が思ったように進まないと焦ってよくない方向に進みがちです。

そんな時は手を止め深呼吸して今やるべきことを考えましょう。

ネット上の初学者の方の中にはものすごいスピードで勉強し、ジョブチェンジに成功されている方が何人もいらっしゃいますが、そちらと比較するのをやめ、比べるべきは「昨日の自分」と、です。。

 

・アウトプットは学習と並行してやるべき

ポートフォリオとしての価値は低くなってしまうRTの成果物です。

焦って手順を済ましても、あなたがそれを理解していなければなおさら意味がありません。アウトプットに時間を掛け、理解を深めましょう。もしかしたらそのアウトプットがポートフォリオ代わりになるかもしれませんし!

 

 

以上、私のRails Tutorial反省でした。

みなさん、五月病に負けずに今週から頑張りましょう!