fluid_27’s blog

駆け出しエンジニアが頭を整理するために綴るブログ

AWSのCodeシリーズだったりをまとめてみた

AWSの勉強で、CodePipelineとかCodeCommitとか出てきて、えーと、それぞれどういうやつ?ってなったので、かなりザックリまとめました。

 

 

まず、図で見ると把握しやすいですね。

f:id:fluid_27:20210420024155p:plain

CodePipeline

完全マネージド型の継続的デリバリーサービス。

コードソフトウェアの構築、テスト、デプロイまでの過程を自動化し、短時間でアップデートできるようCI/CDをサポートするサービス。

 

CodeCommit

セキュリティ性が高く、拡張性の高いフルマネージド型ソースコントロールサービス。

コードへの変更を管理してくれるので、わざわざソース管理システム自体の管理や、ソフトウェアをダウンロードする必要がなくなる。

 

CodeBuild

クラウドで動作する完全フルマネージド型ビルドサービス。

ソースコードコンパイルし、テストを実行し、デプロイ可能なソフトウェアパッケージを作成できる。

 

CodeDeploy

ビルドしたアプリケーションのデプロイを自動で実行するフルマネージド型サービス。

 

codeシリーズ図でのまとめ。こういった図は非常に助かりますね。 

f:id:fluid_27:20210420024542p:plain

 

CloudFormation

AWSクラウド環境内の全インフラリソースを記述してテンプレート化して展開する環境自動設定サービス。

 

ElasticBeanstalk

WEBアプリケーションの定番構成の構築・デプロイの自動化サービス。

速く簡単にデプロイするサービス

コードに基づいてWEBサーバー環境またはワーカー環境を設置する。

 

f:id:fluid_27:20210420024546p:plain

 

OpsWorks

ChefまたはPuppetを使用してアプリケーションを設定及び運用する為の管理サービス。

ChefやPuppetによる、インフラ設定・運用の仕組みをAWS上でマネージド型サービスとして提供している。

Chef とは・・・様々な形式のインフラへのサーバーやアプリケーションの展開を容易にする環境自動化フレームワーク

 

OpsWorks for Chef Automation

Chefサーバーを作成し、継続的デプロイメント及びコンプライアンスチェックの為の完全マネージド型サーバーサービス。Chefのcookbookやレシピを利用してインフラ管理を自動化するサービス。

 

OpsWorks for Puppet Enterprise

フルマネージド型Puppetマスターにより、アプリケーションのテスト・展開・運用を自動化する。

Puppetマスターとは・・・

マニフェストを使用して制御するすべてのノードの重要な構成情報を管理するシステム。

 

OpsWorksスタック

スタックとアプリケーションの作成及び管理の為のシンプルで柔軟な方法を提供するオリジナルサービス。

 

f:id:fluid_27:20210420024727p:plain

 

check_boxやcheck_box_tagの使い方

の違いについて。

 

 

使い分け

  • check_box 関連するモデルがある時
  • f.check_box 関連するモデルがある時、かつform_forまたはform_withの中で使う際
  • check_box_tag 関連するモデルがない時
  • f.check_box_tag 関連するモデルがない時、かつform_forまたはform_withの中で使う際
  • collection_check_boxes すでにあるモデルからチェックボックスを自動生成。多対多のリレーションのモデルを表現する時に便利

 

check_box

構文

check_box(オブジェクト名, メソッド名[, オプション, checked_value = "1", unchecked_value = "0"])

  • 第1引数(オブジェクト名)・・・データを保存したいモデル名
  • 第2引数(プロパティ名)・・・データを保存したいカラム名
  • 第3引数(オプション)・・・クラス名など
  • 第4引数、第5引数・・・チェックが入っている際のvalue値。デフォルトはチェックが入っている→1 チェックが入っていない→0 だが、trueとfalseにすることもできる。

 

例文

check_box :user, :post, {class: "check_box"}, true, false

 

 

f.check_box

構文

基本的にcheck_boxと同じ。第1引数が省略できる。

 

例文

f.check_box :post, {class: "check_box"}, true, false

 

 

check_box_tag

構文

check_box_tag(要素名 [, value値, checked = false, オプション or HTML属性 or イベント属性])

  • 第1引数(要素名)・・・データを保存したいモデル名
  • 第2引数(value値)・・・チェックされた時に格納する値
  • 第3引数(checked = false)・・・デフォルトの状態が「チェックが入っていない状態」にするかどうか
  • 第4引数・・・オプションとしてクラス名を付与できたり、イベント属性としてonclickなどを指定できたり

例文

check_box_tag(name, value = "1", checked = false, options = {})

 

 

collection_check_boxes

多対多のモデル設計をしている際などに便利。

例えば、中間テーブルを介してつながっているgroupテーブルとuserテーブルがある。

オブジェクトにgroupをコレクションにUser.allなどを指定すれば全userを選択肢としてチェックボックス を作成し、選択されたものをgroupモデルとして送信できる。

 

構文

collection_check_boxes(オブジェクト名, メソッド名, コレクション名[, オプション, checked_value = "1", unchecked_value = "0"])

  • 第1引数(オブジェクト名)・・・データを保存したいモデル名
  • 第2引数(メソッド名)・・・データを保存したいカラム名
  • 第3引数(コレクション名)・・・チェックボックスの選択肢となる配列
  • 第4引数(オプション)・・・デフォルトでのチェックの有無を指定するcheckedなどを付与できる
  • 第5引数・・・チェックが入った時のvalue
  • 第6引数・・・チェックボックスと一緒に作成されるテキスト

 

例文

collection_check_boxes(:group, :ids, User.all, :id, :name)

 

 

f.collection_check_boxes

構文

基本的にcollection_check_boxesと同じ。第1引数が省略できる。

 

例文

collection_check_boxes(:ids, User.all, :id, :name)

 

 

 

参考サイト

https://railsdoc.com/form

https://qiita.com/tanutanu/items/b86c4adc26ae464c71fd

https://qiita.com/hibriiiiidge/items/f993c46ee84b3eb124da

https://qiita.com/sho012b/items/3a595fde14516081dff5

dependent: :destroy や foreign_keyについての備忘録

railsでアプリを作っていて、何回かモデル設計する際に「これどういう意味だっけ?」となったので、備忘録としてのまとめ

 

 

accepts_nested_attributes_for

親モデルにの方に記述することで、子モデルのテーブルの更新も同時にできるようになる。

 

例えば、以下のような1人のuserに対して複数のpostが紐づいている多対1のモデルがあったとする。

 

userクラス

Class User

  has_many posts

  accepts_nested_attributes_for :posts

end

 

postクラス

Class Post

  belongs_to :user

end

 

受け取ったパラメータ

params = {  user: {

  name: "sample",

  email: "abcde@example.com",

  post_attributes: [

    { title: "初めての投稿"},

    { title: "2回目の投稿"},

  ]

} }

というパラメータが送られてきた際にuserテーブルだけでなく、userに紐づいているpostテーブルのデータも更新される。

 

 

 

dependent: :destroy

親モデルを削除する際にそれに紐づいている子モデルも同時に削除される。

 

userクラス

Class User

  has_many posts, dependent: :destroy

end

 

postクラス

Class Post

  belongs_to :user

end

 

とすることで、userを削除したら、そのuserが持つpostも同時に削除される。

 

 

references,  foreign_key

referencesm forgien_keyを付与することで得られるメリットがいくつかある。

 

1人のuserが複数postを持つ、多対1のモデルがあったとすると、postテーブルのマイグレーションファイルの方に

references :users, foreign_key : true

を付与することで

  • インデックスを自動で貼ってくれる
  • userでなくuser_idというカラムを自動で作ってくれる
  • 外部キー制約がつく

 

ちなみに、

外部キー制約とは

親テーブルと子テーブルの整合性を保つ為のもので、子テーブルにデータを追加する際、親テーブルのカラムにあるデータしか格納できなくなる。

(上記の例でいうと、Postテーブルのuser_idというカラムにはUserテーブルのuser.idにある値しか格納できなくなる)

Herokuとgithubを連携させてデプロイ 初デプロイまでの道のり④

以前、Herokuでデプロイさせる記事をまとめたんですが、今回はyoutubeでHerokuとgithubを連携させて簡単にデプロイできる方法の動画を見つけたので、実際に今作っているアプリをデプロイさせてみました。

 

www.youtube.com

 

 

Herokuとgithubを連携させてデプロイしてみる

 

まず、今のアプリはAWSでデプロイしようとしてたのですが、すったもんだ上手くいかず、何が悪いのか原因がわからないので、とりあえずHerokuでデプロイしてみます。

ま、AWSはそのうちに。。

 

動画では何種類かデプロイの方法を紹介してくれているのですが、今回はHerokuのダッシュボード上でgithubのブランチをデプロイする方法をとってみました。

 

Herokuには以前の記事の中でアカウントを作成しています。

fluid-27.hatenablog.com

 

早速、やってみます。

 

・・・・

You are trying to install ruby-2.6.2 on heroku-20. ! !

Ruby ruby-2.6.2 is present on the following stacks: ! !

- cedar-14 !

- heroku-16 !

- heroku-18 ! !

Heroku recommends you use the latest supported Ruby version listed here: ! https://devcenter.heroku.com/articles/ruby-support#supported-runtimes ! !

For more information on syntax for declaring a Ruby version see: ! https://devcenter.heroku.com/articles/ruby-versions ! ! Push rejected, failed to compile Ruby app. ! Push failed

 

Rubyのバージョンがサポートされてない?

 

Heroku recommends you use the latest supported Ruby version listed here: ! https://devcenter.heroku.com/articles/ruby-support#supported-runtimes

とあるので、上記のリンクに飛んでみます。

 

Herokuは、次のRubyバージョンと関連するRubygemsをサポートしています。サポートされているバージョンとは、ツールとプラットフォームが特定のバージョンで動作することを期待できることを意味します。また、テクニカルサポートを受けることができることも意味します。サポートされているRubyバージョンは次のとおりです。

2.6.7、Rubygems: 3.0.3.1

2.7.3、Rubygems: 3.1.6

3.0.1、Rubygems: 3.2.15

と書かれている。

ちなみに、この時の自分のrubyは2.6.2。

当方、ど素人なので、上段の左記の2.6.7のバージョンに合わせろってこと?それとも、その右記にある3.0.3.1に合わせろってこと?

という、疑問が。

が、左がrubyのバージョンで、右がRubygems。つまりgemそのもののバージョンらしい?ということに気づく。 

 

ということで、まずはバージョンあげよう。

 

$ rbenv install -list

 

2.5.8

2.6.6

2.7.2

3.0.0

jruby-9.2.14.0

 

・・・

ん? 

 

rbenv install -listに指定されたバージョン出てこないんですが。。

 

なぜ?と思ってそれらしいキーワードでググっていたところ下記の記事が。

https://qiita.com/ChaaaBooo/items/10c7a484ec83db368960

 

なんでもruby-buildが古い可能性があるとのこと。

なので、試しにバージョン確認。

ruby-build --version

ruby-build 20201225

 

ということでアップデートしてみる。

$ brew upgrade ruby-build

$ ruby-build --version

 

ruby-build 20210405

 

んでもって、もっかいリストを

$ rbenv install -list

 

2.5.9

2.6.7

2.7.3

3.0.1

・・・

 

はい、出ました!

改めて

$ rbenv install 2.6.7

・・・

BUILD FAILED (Mac OS X 10.15.7 using ruby-build 20210405)

Inspect or clean up the working tree at /var/folders/82/ms1x_s_97cqfp273npm88c940000gn/T/ruby-build.20210410180230.11094.O5B1v7

Results logged to /var/folders/82/ms1x_s_97cqfp273npm88c940000gn/T/ruby-build.20210410180230.11094.log

Last 10 log lines:

vm.c:2295:9: error: implicit declaration of function 'rb_native_mutex_destroy' is invalid in C99 [-Werror,-Wimplicit-function-declaration]

rb_native_mutex_destroy(&vm->waitpid_lock);

^

vm.c:2489:34: warning: expression does not compute the number of elements in this array; element type is 'const int', not 'VALUE' (aka 'unsigned long') [-Wsizeof-array-div]

sizeof(ec->machine.regs) / sizeof(VALUE));

~~~~~~~~~~~~~~~~ ^

vm.c:2489:34: note: place parentheses around the 'sizeof(VALUE)' expression to silence this warning

1 warning and 1 error generated.

make: *** [vm.o] Error 1

make: *** Waiting for unfinished jobs....

 

とエラー。。一応、

$ rbenv versions

としてみると、やっぱり2.6.7入ってない

 

色々ググってみると

https://blog.n-z.jp/blog/2021-04-08-old-ruby-with-new-xcode.html

という記事に辿り着く。

CFLAGS="-Wno-error=implicit-function-declaration"

をつけるとエラー回避できる。とあるけど、その前に「古いバージョンだと起きる可能性あり」とあったので

 

$ rbenv install 2.7.3

してみることに。

 

、、、入った!

$ rbenv versions

 

system

2.5.1

* 2.6.2 (set by /Users/tanaberyouni/.rbenv/version)

2.7.1

2.7.3

・・・

 

入ってる!

$rbenv local 2.7.3

実行!!

はい、rubyのバージョンは上げました。ただ、、

  

MySQLはサポートされてないみたいなのでPostgreSQLに置き換えます

 

いま作っているアプリはAWSでデプロイしようと思ってたので、MySQLで作っていたのですが、HerokuではPostgreSQLしか対応していないみたいです。。

なんか、そこを上手くPostgreSQLのままデプロイさせる方法もあるみたいなんですが、正式にはやっぱりサポートされてないみたいです。

なんで、MysqlPostgresqlに置き換えてみようと思います。

 

ググってみると pgloaderというもので簡単に置き換えられる。とあるので、それで試してみようと思います。

pgloader.io

 

まず、GemfileのMySQLを開発&テスト環境のみに

group :development, :test do

  gem mysql

end

 

 

そしてPostgreSQLを本番環境に

 

group :production, :staging do

 gem pg

end

 

で、

$ bundle

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

An error occurred while installing mysql2 (0.5.3), and

Bundler cannot continue.

Make sure that `gem install mysql2 -v '0.5.3' --source

'https://rubygems.org/'` succeeds before bundling.

 

エラーが。。

上記にあるように

 

$ gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'

してみる。

Building native extensions. This could take a while...

ERROR: Error installing mysql2:

ERROR: Failed to build gem native extension.

・・・

2 warnings generated.

compiling infile.c

compiling mysql2_ext.c

compiling result.c

compiling statement.c

linking shared-object mysql2/mysql2.bundle

ld: library not found for -lssl

clang: error: linker command failed with exit code 1 (use -v to see invocation)

make: *** [mysql2.bundle] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/tanaberyouni/.rbenv/versions/2.7.3/lib/ruby/gems/2.7.0/gems/mysql2-0.5.3 for inspection.

Results logged to /Users/tanaberyouni/.rbenv/versions/2.7.3/lib/ruby/gems/2.7.0/extensions/x86_64-darwin-19/2.7.0/mysql2-0.5.3/gem_make.out

 

 

やっぱり、エラー。

ググってみると

https://valuable.hatenablog.com/entry/20200515/1589506999

という記事発見。記事にある通り

$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"

で解決!

 

 

pgloaderをインストールしてみる

 

続いて、pgloaderのインストールしてPostgreSQLに移行させてみる。

$ brew install pgloader

pgloaderのgithubに載っている通り、まずデータベースの作成してみる。

GitHub - dimitri/pgloader: Migrate to PostgreSQL in a single command!

 

$ createdb pagila

 

createdb: error: could not connect to database template1: could not connect to server: No such file or directory

Is the server running locally and accepting

connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

 

というエラー。

最後の文をコピペしてググってみると、brew info postgresql でpostgresqlの情報を出力してくれると。

 

$ brew info postgresql

 

postgresql: stable 13.2 (bottled), HEAD Object-relational database system

https://www.postgresql.org/ /usr/local/Cellar/postgresql/13.2_1 (3,218 files, 42.6MB) * Poured from bottle on 2021-03-11 at 10:12:00 From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/postgresql.rb License: PostgreSQL

==> Dependencies

Build: pkg-config ✔ Required: icu4c ✔, krb5 ✔, openssl@1.1 ✔, readline ✔

==> Options

--HEAD Install HEAD version

==> Caveats

To migrate existing data from a previous major version of PostgreSQL

run: brew postgresql-upgrade-database

This formula has created a default database cluster

with: initdb --locale=C -E UTF-8 /usr/local/var/postgres For more details,

read: https://www.postgresql.org/docs/13/app-initdb.html

To have launchd start postgresql now and restart at login: brew services start postgresql

Or, if you don't want/need a background service you can just

run: pg_ctl -D /usr/local/var/postgres start

==> Analytics install: 168,476 (30 days), 521,344 (90 days), 2,254,430 (365 days)

 

上記の情報をもとに

$ pg_ctl -D /usr/local/var/postgres start

 

waiting for server to start....2021-04-11 19:20:55.698 JST [76625] FATAL: database files are incompatible with server

2021-04-11 19:20:55.698 JST [76625] DETAIL: The data directory was initialized by PostgreSQL version 12, which is not compatible with this version 13.2.

stopped waiting

pg_ctl: could not start server

Examine the log output.

 

というエラーが。PostgreSQLのバージョンの問題?

ググった情報を頼りに

$ brew postgresql-upgrade-database

でアップデートしてから、再びチャレンジ。

 

$ createdb pagila

$ pgloader mysql://user@localhost/sakila postgresql:///pagila

 

で、上手く行きました!

 

いったん、githubにプッシュしてからHerokuのダッシュボードでデプロイすると、、、

無事できました!!

 

まとめ

  • Herokuのダッシュボードでデプロイできるのは楽。

  • $ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"あたりのコマンドは理解できてない。。場当たり的にググっていくだけでなく、構造的に勉強することが必要。

 

以上です。

 

もし、同じような境遇の方がいれば、参考にしてもらえたらと思います。

補足や間違いがあればご指摘いただけると幸いです。

 

また、一緒にプログラミングを学習していける仲間を探しています。「なんかモチベーションが上がらないなぁ、、」そんな時にも、お互いに触発しあって学習していけたらと思います。ぜひ、下記まで気軽にご連絡ください。

 

twitter.com

そもそもDBやDWHやデータマートとかの違いって??

初学者である私がAWSを勉強していて、Redshiftや、Auroraなどの説明で

「DBとして〜」、「DWHに〜」、「ストレージが〜」

と出てきて、そもそもそれらってどう違うんだっけ?

疑問を持ったので、自分なりに整理してみました。

 

 

そもそもDBとストレージってどう違うんだっけ?

DB(データベース)とストレージ。

どちらも自分の中では「データを保存してあるもの」というふんわりした理解で進んでいました。

改めて、どう違うかと言うと

 

DB・・・共有、検索しやすく整理されたデータの集まり。

ストレージ・・・データを保存しておく記憶装置。

 

です。

DBはデータの集まりです。

それに対し、ストレージはデータ保存を行うツール全般のことを指します。

要はデータを入れるための容れ物、というイメージ。

 

データを様々な紙の資料として例えるなら、

DBとは資料室のような場所に保存されている資料全体を指している。

ストレージとは資料を保存しておく部屋自体のことを指している。

 

という風に理解して差し支えないと思います。

 

 

 

ではDBとDWHはどう違う?

ではAWSでも出てきたDWH (データウェアハウス)とDBはどう違うかと言うと。

 

DB・・・現在進行中の状態のデータを格納し、即座に取り出せる状態になっていることが多い。

DWH・・・業務で発生した各種情報を時系列に保管したデータベースのことを指す。あらゆる情報をまとめたサーバーやソフトウェアであり、データベースの利用形態の1つ。

 

DWHとは、その名のとおり「倉庫」として情報を時系列に保管する役割を担っている。過去のデータを集約し、格納するのがDWH

 

また、DWHには定義があり、

  1. データが時系列である
  2. サブジェクトごとに保管してある
  3. データを統合してある
  4. データは消さない

と言うのがDWHの定義だそうです。

 

つまり、先ほどの紙の資料の例でいうと、

どんどん溜まってくる資料を保存し続けていく資料室があり、そこにある資料全体をDBと呼ぶ。

それらの資料を、時系列に並べ、サブジェクトごとに仕分け、倉庫にしまった資料をDWHと呼ぶ

 

という事になるかと思います。

 

 

 

RDSとDWHはどう違う?

RDSとは?

RDS(リレーショナルデータベースシステム)とはAmazonが提供しているRDB(リレーション型データベース)のこと。

 

では、そのRDBとは?

行と列によって構成された「表形式のテーブル」と呼ばれるデータの集合を、互いに関連付けて関係モデルを使ったデータベースのこと。

 

ようはExcelみたいな表形式で保存されているデータ同士を関連づけてあるDBがRDB

 

 

 そして、AmazonRDBであるRDSとDWHの違いは?  

DWH・・・列ごとにデータ処理をするので、データの更新はRDSより時間がかかる

RDS・・・行全体でデータを読み込むので、データが大量になると、DWHより処理に時間がかかる。

 

 ここに関しては下記サイトで図いりで解説されています。

理解に苦しんだ方はぜひ下記サイトに飛んでみてください。

RDSとDWHの違い

RDBとDWHの違い

boxil.jp

 

 

  

データレイクとDWHの違いは?

 

はい。まだまだ出てきます。

続いてデータレイクです。

 

データレイクとは?

多種多様なデータを本来のフォーマットのまま保管する広大な領域のこと。

データウェアハウス等と異なり事前にデータ構造や取得元を設計しておく必要がなく、用途が決まっていないけれど使えそうなデータも取り込める。

 

 

データレイクとDWHの違いでいうと

データレイク・・・構造データや非構造データ、どちらも用途が決まっていない状態で保管する

DWH・・・特定の用途に合わせて、データを時系列に並べたり、サブジェクトごとに仕分けたりして、整理する

※非構造データとは、ログファイルや画像ファイル、音声ファイルなど特定の構造を持たないデータ

 

 つまり、データレイクとは、テキストやソーシャルメディア、IoTデバイスのログファイルやセンサーなど様々な形態のデータを用途が決まってない状態で保存しておく領域のこと。

という理解でいいかと思います。

 

 

はい。まだありますが、息切れしてきたので、以下は自分が上記を調べるにあたって付随的に出てきた情報をサクッと紹介します。

 

データマートとは?

データマートとはDWHに保管された各データの中から、目的に合わせて必要なものだけを抜き出したデータベースのこと。即座に検索や集計ができため、細かい分析が容易にできる。

 

つまりDWHの中から「経理部のデータだけ」とか「営業部のデータだけ」とか特定の項目だけを抜き出したDBのこと。

 

 

データスワンプとは?

失敗したデータレイクの揶揄。なんでも入るからと、計画性のないデータ蓄積を行うとレイク(湖)は、すぐに使いにくいスワンプ(沼)となる。

 

 

EDW(エンタープライズデータウェアハウス)とは?

企業全体向けサービスを提供するデータウェアハウス。

 

 

Biとは?

Bi(ビジネスインテリジェンス)とは、各業務システムから蓄積される膨大なデータを自動的に収集、分析、加工し企業経営における意思決定の迅速化を支援する手法、技術。

BIとはさまざまなデータ解析手法や概念の総称でもあり、DWHはBIの一種でもある。

 

以上です!

 

最後に

この記事は、プログラミング初学者である私が自分が覚えた知識をより定着させるためにまとめてみたものです。

もし、同じような境遇の方がいれば、参考にしてもらえたらと思います。

また、補足や間違いがあればご指摘いただけると幸いです。

 

また、一緒にプログラミングを学習していける仲間を探しています。「なんかモチベーションが上がらないなぁ、、」そんな時にも、お互いに触発しあって学習していけたらと思います。ぜひ、下記まで気軽にご連絡ください。 

 

 

プログラミング勉強を始めようとしている頃の自分へのアドバイス

自分は2020年9月頃からプログラミングの勉強を始めました。

つまり、プログラミング勉強を始めて約半年になります。

 

今回は学習した半年間を振り返って、プログラミング勉強を始めた頃の自分へアドバイスができるとしたら、という前提でアドバイスしてみたいと思います。

 

まだまだ未熟者なので、トンチンカンなことを言っている点があったとしても、心穏やかに対応していただくことを切に願います。

 

プログラミングを学習するにあたってのアドバイス

 

学習する順番をわきまえろ

学習するにあたって、適切な順番があると思う。

ITの基礎技術を全く理解せず、railsの勉強など初めても、途中でずっこける。

私の経験でいうと、Linuxの知識が全然浅い段階でAWSでのデプロイを挑んで、見事に壁に打ち当たった。

学んでおくべきことを学ばないで、先端の技術だけを追いかけて行こうとしても、途中で壁にあたり、星一徹ばりにPCが乗ったちゃぶ台ごと力の限り、ひっくり返したい気持ちになること間違いないので、一見遠回りに見えるようでも、先人達のアドバイスを傾聴して、確実な道を選んでいくべき。

つよつよエンジニアでもあり、youtuberでもあるKENTAさんが学習する順番を説明してくれている動画があるので、参考にしてみるといいと思う。

 

www.youtube.com

 


自分がやったことを可視化しろ

自分もザックリと「〜までにこの学習を終わらせたいなぁ」と思いながら学習を進めて行っているし、計画を立てる。というのは大切なことだと思う。

が、プログラミングの学習を始めて分かったのは、

「Aを理解するには先にBについて理解していないいけない」

という事例が発生する。ということ。

1週間で学習が終わると見積もっていたAが、先にBの方から学習しないといけないことが分かり、スケジュールがどんどん崩れていく。という苦い経験をしたのは私だけではないはず。

学習しなければいけないことは無限にあるので、いつまでも完璧に理解しようとしてはいけないと思うが、自分が立てたスケジュールが音もなく崩れていく時や、進んでも進んでも理解が深まらない時は「所詮、自分には無理だったのかな」と思う時がある。

そんな時に自分を支えてくれるものの1つとして自分の積み上げてきたものを確認する。ということが有効だと思う。

ツイッターで #積み上げなどと書いて、やることをツイートするのもいいと思うが、やったことに関してもツイート、ブログなどでまとめてみるといいと思う。

 


手を動かして行かないと理解できない

動画教材などでよくあるパターンとして

「概要説明」→「ハンズオン」という順番で進むものがある。

ここで、概要説明の時点で完全に腹落ちしてから進もうとすると、かなり時間がかかることに気がついた。

多少?な部分があっても、ハンズオンを進めていくと、「あ、こうなっているのか」と頭の中で整理できてくる。

必ず「覚える」だけでなく、実際に自分で手を動かして試してみることで勉強した知識の定着が進んでいくし、より自分が取り組んでいることの解像度が上がってくる。

とにかく、「理解できない」と悩む前に手を動かしてみい。


もくもく会などに参加してみろ

必ず初期から参加しなければいけない。とは思わない。

全然レベルかんが違うもくもく会に参加しても、ただ単に劣等感や挫折感を感じるだけかもしれない。

でも、同じようなレベル感の会に参加できると、皆同じようなことで悩んでいたり、いい学習方法を知っていたりする。私も、もくもく会で初めてドットインストールを知った。

特に自分よりもちょっとレベルの高い人がいるもくもく会に参加できるといいと思う。分からない点は教えてもらえたり、ためになる話を聴ける可能性がある。

 

 

学習した教材とオススメ度

私が実際に使った教材と、そのオススメ度。

  

  • キタミ式イラストIT塾 情報情報技術者
  • Linux標準教科書
  • 某プログラミングスクール教材
  • ドットインストール
  • プロゲート
  • rails tutorial
  • 現場で使える! Ruby on Rails 5速習実践ガイド
  • udemy AWS
  • udemy HTML~JS

 

キタミ式イラストIT塾 情報情報技術者 ☆

序盤の進数の「10進数のn進数への基数変換」のところで「むむぅ、、」となってしまったが、プログラミングの前に、そもそも知っておかなければいけないネットワークに関する知識などが可愛いイラストと共に分かりやすく説明されているので、非常にとっつきやすい。

https://www.amazon.co.jp/%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88IT%E5%A1%BE-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E4%BB%A4%E5%92%8C03%E5%B9%B4-%E3%81%8D%E3%81%9F%E3%81%BF%E3%82%8A%E3%82%85%E3%81%86%E3%81%98/dp/4297117819/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1T4ZR1K37GNLX&dchild=1&keywords=%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88it%E5%A1%BE+%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85+%E4%BB%A4%E5%92%8C02%E5%B9%B4+%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%8A%80%E8%A1%93%E8%80%85%E8%A9%A6%E9%A8%93&qid=1617802117&sprefix=%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%2Caps%2C280&sr=8-1

 

 

 

Linux標準教科書 

Amazon  Kindle版だと無料で読めるので、Linuxの学習をするならいいと思う。

ただ、個人的にはとっつき辛く感じたので、先にドットインストールのUNIXコマンド入門などをやって、コマンドに慣れておくと入りやすいかも。

https://www.amazon.co.jp/gp/product/B00BWCSUYS/ref=ppx_yo_dt_b_d_asin_image_o07?ie=UTF8&psc=1

 

 

 

某プログラミングスクール教材 

サンプルとしてはいい。ただ、わざわざお金を払ってまでやる意味はない。

 

 

ドットインストール ☆☆☆☆☆

コスパ最高。かなり守備範囲広く。かつ一本の動画も短く自分がこなした量が可視化できる・より実感できるのがいい。いかに初学者を挫折させずに継続させるかが考慮されていると思う。

とにかく最初の積み上げが一番挫折しやすいと思うので、初学者にとっては最適。

dotinstall.com

 

 

 

プロゲート ☆☆☆☆

この技術ってどんな感じ?何ができるの?そう言った疑問を持った時にprogateを使うのがベスト。ただ、本当に最初の入り口までしかサポートされていなかったりするので、そのあとは別の教材を探していくべき。

prog-8.com

 

 

rails tutorial ☆☆☆☆☆

railsに関して基本的な技術が網羅的に学べるrailsに関してお手本となる教材だと思う。ただ、日本語での説明が変。説明自体がパッと理解しづらい文体になっている。

progateやドットインストールを飛び越えていきなり飛びつくと、理解が思ったように進まない局面があるかも。

railstutorial.jp

 

 

現場で使える! Ruby on Rails 5速習実践ガイド  ☆☆☆

教書として悪くないと思う。けど、レビューにもあるとおり、何もRubyrailsに関して知らない状態で取り掛かると難しく感じるかも。

「万物がオブジェクト」というところの説明から始まるので、人によっては序盤で躓いてしまう人もいるかも。

ただ、デザインなども含め、読みやすいと思うし、rails tutorialの説明文などに比べたら理解しやすい。

https://www.amazon.co.jp/gp/product/B07JHQ9B5T/ref=ppx_yo_dt_b_d_asin_image_o08?ie=UTF8&psc=1

 

 

Amazon Web Services 基礎からのネットワーク&サーバー構築  ☆☆☆

AWSに関して優しく解説してくれている。解説しながらハンズオン形式で進んでいく。最初に手に取る本としては良い。

ただ、すでにAWSを勉強していて、より深く知りたい。という人には物足りないかも。

https://www.amazon.co.jp/gp/product/B084QQ7TCF/ref=ppx_yo_dt_b_d_asin_image_o05?ie=UTF8&psc=1

 

 

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

現在学習中。

AWSの様々な分野に関して、それぞれ概要とハンズオンで勉強していける。

セールで買えばコスパはいいと思う。

ただ、個人的に講師の説明のイントネーションが、なんか聞き取りづらく感じる。

youtubeのような自動文字起こし機能があればかなり便利だと思う。スライドと共に学習していくスタイルだが、重要なことを口で説明している部分やメモをとる際に何度も巻き戻すのが不便。

これだけでOK! AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座(SAA-C02試験対応版) | Udemy

 

 

udemy HTML~JS 「ウェブ開発入門完全攻略コース - HTML/CSS/JavaScript プログラミンングをはじめて学び創れる人へ」 ☆☆☆

これもプログラミングスクールの教材と同じでサンプルとしてはいいと思う。

また、個人的にはJavaScriptはhtmlやrailsに比べ、理解に苦しんだ点があったので、DOM操作などに関して詳しく説明してくれているところは助かった。

必ずやった方がいい。とは言えないが、HTMLから始まりJavaScriptまでカバーしてくれている点を鑑みると、かなりコスパはいいと言える。

他に良質な教材が見つからない、という方は購入する価値があると思う。

ウェブ開発入門完全攻略コース - HTML/CSS/JavaScript. プログラミングをはじめて学び創れる人へ! | Udemy

 

 

 

最後に

はい。以上です。

いかがだったでしょうか?

自分と同じように未経験でプログラミングの勉強を始めよう。という方に対して1つの参考になればと思います。

もちろん、これが正解ではないと思うので、あくまでも参考程度に。

自分がこれから学習を始めよう。というタイミングだったら欲しかったアドバイス、という観点で書いてみました。

 

もし、同じような境遇の方いたら、一緒に学習していけたらと思います。

「なんかモチベーションが上がらないなぁ、、」そんな時にも、お互いに触発しあって学習していけたらと思います。

ぜひ、下記まで気軽にご連絡ください。

twitter.com

一緒に学習しましょう!

初デプロイまでの道のり③ いったんherokuでデプロイしてみた話

 

これまでの道筋

railsで作ったアプリをAWSでデプロイを試みるも、うまくいかず。。

今回は、試しにherokuでデプロイしてみることにしました。

 

herokuでのデプロイ手順

  1. herokuに会員登録する
  2. Heroku CLI (コマンドラインインターフェース)をインストールする
  3. herokuにログインする
  4. heroku create
  5. PostgreSQLのインストール
  6. git commit実行し、git push heroku master
  7. マイグレーションを行う
  8. URLを開く

 

herokuに会員登録する

https://jp.heroku.com/home

にて会員登録

 

heroku CLI (コマンドラインインターフェース)をインストールする

参考にしていた教材によると、heroku CLIをインストールするにあたってnpm経由でインストールすると楽。ということなのでその方法でインストールすることに。

 

ちなみに、

  • CLIとはコマンド操作でherokuにデプロイを可能にするためのもの。
  • npm とは Node.js というプログラミング言語のためのパッケージ管理ソフトで、大抵の場合はNode.jsをインストールすると自動的にnpmもインストールされるそうです。

 

教材では

1. nvm をインストール

2. heroku CLI をインストール

という順番でやってましたが、自分はすでにNode.jsやnpmが入っているので、1は割愛し、heroku CLIのインストールからいきます。

 

$ npm install -g heroku 

(npmを使ってherokuをグローバルにインストール)

 

 

herokuにログインする

$ heroku login

コマンド打つと、google chromeが起動してherokuにログインします。 

 

 

$ heroku create

をする。と、アプリケーションがおかれるURLと、アプリケーションの元となるgitのリポジトリが作成されます。

 

$ git remote -v

でgitのリポジトリが作成されたことを確認。

 

 

PostgreSQLのインストール

herokuでデプロイするにはSQLiteは使えず、PostgreSQLしか使えないので、PostgreSQLのインストールをします。

 

教材では以下のコマンドでインストールしていました。

$ sudo yum install postgresql-server postgresql-devel

ただ、上記はyumを使う場合。自分みたくmacの場合homebrewなどでインストールすることになると思います。

自分の場合はすでにPostgreSQLすでに入っていたので、割愛しました。

 

PostgreSQLに接続できるようにするために下記2点を実行。

・gem 'pg' をインストール

・config/database/ymlの記述変更

 

・まずはgem 'pg' をインストール

Gemfileに

gem  'pg'

group :development, :test do

   gem 'sqlite3'

end

と記述。

そして、

$ bundle install --without production

実行。

 

ただ、この時に

"今後は  bundle install --without production ではなく 

bundle config set --local without 'production' を使うように"

というコメントが出てきました。

 

・続いてconfig/database/ymlの記述変更

config/database/yml

production:

  <<: *default

  adapter: postgresql

  database: 任意の名前

に記述変更。

 

 

git commit実行し、git push heroku master

上記の通り、commitとpushを進めます。

が、pushしたら、herokuのversionに対してrubyのversionが対応していなかったようで、エラーが発生しました。

解決方法としては

  • rubyのversionをあげる
  • herokuのversionを落とす

 

今回はherokuのversionを落としました。

$ heroku stack:set heroku-18

 

再度、エラー。

Failed to install gems via Bundler.

というエラーが。

 

よく読んでみると、上記のエラーの前に

"Your bundle only supports platforms ["x86_64-darwin-19"] but your local platform

is x86_64-linux. Add the current platform to the lockfile with `bundle lock

--add-platform x86_64-linux` and try again."

 

ようは

"bundleは["x86_64-darwin-19"]というプラットフォームをサポートしているよ。 でも、あなたのプラットフォームは[x86_64-linux]だから

bundle lock --add-platform x86_64-linux を実行しなさい。"

というエラー文。

 

また、他箇所にあった

For more information see: https://devcenter.heroku.com/articles/bundler-version#known-upgrade-issues

に飛んでみると、bundleのversionごとに出るエラーが決まっているようで、

 

Bundler 2.2.3でローカルに生成されたアプリのGemfile.lockは、Linuxプラットフォームが明示的に「ロック」されていない限り、Herokuでは機能しない可能性があります。

$ bundle lock --add-platform ruby
$ bundle lock --add-platform x86_64-linux
$ bundle install
$ git add . ; git commit -m "Bundler fix"

 

と書いてある。

 

結論、上記の4行を実行したら解決しました。

 

マイグレーションを行う

$ heroku rake db:migrate

※rakeコマンドってrailsコマンドに統一されて、rails5以降は使わないんじゃ?と思ったのですが、herokuではrailsコマンド使用できないみたいなので、上記の通りのrakeコマンド実行しました。

 

$ heroku ps:scale web=1

ようは無料枠内に収めるためのコマンド実行。

 

URLを開く

$ heroku open

 

トップページをroute.rbで指定していないエラーになる。

その場合はトップページを指定するか、heroku openであいたページの末尾に/postsなど存在するページを指定すれば大丈夫。

 

無事見れました。

 

ということで、途中エラー発生した箇所あったものの、特別悩む部分もなく完了。

AWSでもこうしてデプロイできたら。。(泣)

 

デプロイという経験はできたので、LinuxAWSの勉強に目処が着いたら、再度AWSでのデプロイ再チャレンジしてみたいと思います。

 

まだ、AWSでのデプロイへの道は続きます。