AFTER CODEBSE School 5week
今週からRails tutorialに取り組み始めた。(今週の学習時間23時間)
AFTER CODEBASE School 5week
この1週間でやったこと
rails tutorial
progate rails
- 復習(気になったところ)
- たのしいruby本
- 8章「クラスとモジュール」まではざっと読んだ。それ以降は気になったところを少しづつ読んだ
- sinatra自作アプリ制作
- slimで書いてたアプリをsinatraで書き直してみてる
振り返り
反省
- 反省点としては、1週間でどこまでできるかを想定して作業してなかったこと。基本的には、railsチュートリアルを中心にその周辺知識を学んでいくっていうtodoはあるけど、今のところそのtodoに対して一週間でどれだけ時間取れるかっていうのが目標になってる感じ。
- 一応どこまでやるとかは考えるようにするけど、寄り道し始めたりするとまあまあ時間奪われて、想定通りに行かなくなって、テンション下がりそうなので、今のところ目標は時間ベースにする(〜1000時間)
- HTMLとかCSSとかJSとかの基礎レベルで寄り道発生しやすい
来週todo
- railsチュートリアルをどこまで進めれるか計算してみた。
- railsチュートリアル2週180時間=1週90時間で終わると想定する。
- 今のところ1-4章で15時間かかってるから、残り10章を75時間でやる。
- 7.5時間/章
- 1週間に取れる学習時間がだいたい20-25時間なので、だいたい3章分は完了させないと、想定通りの時間でチュートリアル1週できない。
- 来週1週間で5-7章(3章分)を終わらすことを目標にする
- 第5章レイアウトを作成する
- 第6章ユーザーのモデルを作成する
- 第7章ユーザー登録
いいっすね具体的。チュートリアルがもっとかかるかも。だけど2週すると180~200時間はあってそう。
— さぼ@ギークハウス沖縄 (@saboyutaka) 2018年3月26日
まとめ
AFTER CODEBSE School 4week
今週はProgate Railsを22時間やって、やっとProgate Rails 1周完了した(Progate Railsにかけた時間合計で37時間ぐらい)
まとめ
- とりあえず1週したけどすぐ忘れそうなのでいい感じに復習するようにする
- CODE BASEのプログラミング講座終わって1ヶ月がたった。
- ざっくりだけど週20時間ペースの学習時間
この1ヶ月でやったこと
次の1ヶ月で終わっていたいこと
以下、progate rails 作業メモ
Progate Rails まとめメモ
Progate Rails 1
アプリケーションの作成
$ rails new アプリケーション名
サーバー立ち上げ
$ rails server
トップページ作成
$ rails generate controller home top
※home・・・・コントローラー名
※top・・・・・アクション名
※新しくページを作る時に、一度作ったコントローラー名と同じコントローラー名で、このコマンドを利用して、ページを作ることはできない(コントローラーのファイルがすでに作られてるから)
ページ作成に必要な3要素
- ビュー
- コントローラー
- ページを表示するとき、Railsの中ではコントローラを経由してビューをブラウザに返しています。
- app/controller/home_controller.rb
- コントローラー内のメソッドをアクションという
- コントローラ内のアクションは、ブラウザに返すビューをviewsフォルダの中から見つけ出す役割を担っている
- アクションは、コントローラと同じ名前のビューフォルダから、アクションと同じ名前のHTMLファイルを探してブラウザに返します。
- コントローラーは目的に合わせて作成する
- トップページに関するコントローラ
- 投稿に関するコントローラー(投稿一覧/新規投稿など)
- ルーティング
- Rails内ではコントローラを経由してビューを返していますが、ブラウザとコントローラを繋ぐ役割を担うのがルーティング
- ページが表示されるまでの流れは、ルーティング→コントローラ→ビュー
- ルーティングは、送信されたURLに対して「どのコントローラの、どのアクション」で処理するかを決める対応表のことです。
- ブラウザでURLを入力すると、ルーティングがURLを見て、適切なコントローラのアクションを呼び出します。
- get "URL" => "コントローラー名#アクション名"
Routesって何ですか?
- URLとHTTPメソッドに応じて適切なコントローラにリクエストを振り分けるのがroutes
コントローラーって何ですか?
- 受け付けたリクエストを処理するのがコントローラー
ビューって何ですか?
- コントローラでの処理の結果を受け取って、HTMLを返すのがビュー
Progate Rails 1 まとめ
- まず、Routes,コントローラー,ビューの概念を理解するための説明など。
- そのあと、routesを変えたり、cssを適用したり、手を動かしながら上記概念を理解する
- 全体的にtopページ、aboutページを作ってみるのに必要な知識把握できる
Progate Rails 2
- Progate Rails 1 は、homeコントローラーの話だったけど、Progate Rails 2 は、Postコントローラーの話っぽい。Post コントローラー を使って、投稿に関するリクエストを処理する
Post(投稿)ページ作成
$ rails generate controller posts index
※posts・・・・コントローラー名 ※index・・・・・アクション名。(一覧ページを作成する時は、indexというアクション名を使用することが一般的)
- 投稿一覧ページのhtml(ビュー)作った
- 投稿一覧ページの内容を変数を使って表示できるようにした
- 投稿が徐々に増えていくことを想定して、投稿内容は配列にまとめるようにした
- ここまで、上記内容は、全部ビューに書いてたけど、ほんとはアクション(コントローラー)に記述するのが一般的なので、アクションに記述し直した。アクションで定義した変数をビューで使いたい場合は、アクションで定義する変数に@(アットマーク)をつける。そうすれば使える。
- データベース(テーブル)を用意して、データベースに格納しているデータを取ってきて、投稿一覧ページを表示できるようするために
マイグレーションとは?
- データベースに変更を加えること。
- データベースに変更を加えるためのファイルを生成するコマンド
$ rails g model Post content:text
※ Post・・・テーブル名の単数形 ※ content・・・カラム名 ※ text・・・データ型
- 上記コマンドを実行すると、db/migrateフォルダの下にマイグレーションファイルが作られる
- 上記コマンド実行で作成されたマイグレーションファイルをデータベースに反映させるコマンド $ rails db:migrate
※ マイグレーションファイルが存在していてい、そのマイグレーションファイルがDBに反映されていない状態だと、Railsではエラーになる。なので、マイグレーションファイルを作成した後は、必ず、rails db:migrateを実行しましょう
モデルとは、テーブルを操作するためのクラス
- rails g model Post content:text を実行した際に、以下2つのファイルが作られる
- app/modelsフォルダにモデルが定義されたファイル
- db/migrateフォルダにマイグレーションファイル
- ApplicationRecordを継承したクラスをモデルという
- ApplicationRecordクラスとは????
- モデル(クラス)から、インスタンスを作成(Post.new)して、そのインスタンスを使って、テーブルのデータを操作する
- インスタンスを作成した後、データを保存するには、saveメソッドを使う。
- 登録したデータを取得するときは、Post.firstを使う
- 登録したデータを全て取得するときは、Post.allを使う。配列で取得できる
rails consoleとは?
- Ruby のコードを手軽に実行できるやつ
共通のレイアウトをまとめる方法
- Railsでは、views/layouts/application.html.erb にヘッダーなど共通部分を書いてあげれる
- 共通レイアウト views/layouts/application.html.erb に記述されてる <%= yield %> の部分に、他のビューファイルが代入される感じになる
Progate Rails 2 まとめ
- モデル、マイグレーションの概念理解。Railsでマイグレーションファイル作成、反映するの場合のコマンド説明など
- rails consoleで、モデルのインスタンスで、テーブルへの操作するのを理解できるよう手を動かす感じ。
- 最終的には、テーブルからデータを取得し、投稿ページが表示できるようになった。
- この時点では、テーブルのデータを取ってきて、表示させてるだけで、テーブルにデータを登録するなどはできていないので、Progate Rails 3でデータの更新などはやっていく流れっぽい。
Progate Rails 3
- 前回(Progate Rails 2)が投稿ページを表示するというような内容で、Progate Rails 3は実際に投稿 = データ保存する方法をお勉強するっぽい。
- テーブルから特定のidの投稿(レコード)を取得するためには、find_byメソッドを利用する。例えば、Post.find_by(id:2) で、idが2のレコードを取れる。前回までは、Post.firstとかだったやつのid指定パターン
- 投稿したコメントの詳細ページを表示できるようにした。詳細ページは、投稿コメントのidをURLに含めるようにして、そのidの値をparams[:id]で取得するような感じ。
- 【復習】routesは、リクエスト(メソッドとパス)とコントローラー(アクション)を結ぶ定義が書いていあるファイル
- 【復習】コントローラーのファイルは、受け付けたリクエストを処理する、コントローラーと同じ名前のビューのディレクトリからアクションと同じ名前のビューファイルを探して、ブラウザに返す
- 投稿一覧ページの各投稿をlink_to(表示内容,”リンク先パス”)メソッドを使って、詳細ページへリンクするようにした
- 新規投稿ページを作成した。ざっくり、新しくページを追加したい場合の流れは以下。
- 入力ファオームを作成した。新しく作ったページにform定義を書いた。入力フォームには、form_tagメソッドを使った。 form_tag(送信先のURL) do end
- フォームからPostした際の処理(routes,コントローラー)を追加した。
- 更に、createアクションの中身を追加した。
- アクションでの処理は、基本的にアクションと同じ名前のビューファイルを探して、表示させるような動きになるはずだけど、アクションでの処理の中身にリダイレクトの処理などが書いてたら、必ずしもそうなるわけじゃない。redirect_to()メソッド
- フォームのinput要素のname属性を設定すると、name属性の値をキー、入力された値をバリューとしたハッシュが、Rails側へ送信できる。(Rails側のコントローラーのアクションで受け取れる。params[:キー] って感じ)
- 投稿一覧のメッセージをorderメソッドを使って並び替えした。Post.all.order(created_at: :desc)
Paramsとは
- paramsとは、Railsで送られてきた値を受け取るためのメソッドです。
- 送られてくる情報(リクエストパラメータ)は主に、以下2通り。(侍エンジニア塾説明)
- getのクエリパラメータ
- Postでformを使って送信されるデータの2つです。
- paramsは以下の2通りの使い方があるので、整理して覚えておきましょう。(Progate説明)
- 「:○○」を使ったルーティングのURLから値を取得する
- get “/post/:○○ => “”
- 「name="○○"」が付いたフォームの入力内容を受け取る
- 「:○○」を使ったルーティングのURLから値を取得する
Progate Rails 3 まとめ
- フォームからデータを登録する方法を勉強した
- 特定のidのデータを取得する方法 find_by()
Progate Rails 4
- proate rails 3 でフォームに入力したデータをDBに保存するやり方を学んで、今回はそのデータを更新/削除する処理のお勉強をする感じっぽい
- rails consoleを使って、削除と編集(update)の処理を手を動かして理解する。find_by()メソッドを使う。
- rails console でpost.destroyとかpost.content = “変更値” post.saveとかで、データの操作を理解したら、今度はそれをビューのフォームとかからできるようにする
【復習】新しいページを作るとき
- routesにルート追加
- コントローラーにアクション追加
- ブラウザに返すビューを追加
link_toメソッドを使って、post用のリンクを作る(削除したい場合) link_to("表示内容","パス",{method: "post"})
基本的にprogate 1-3の内容をわかってたら、そんなに難しくないっぽい。
Progate Rails 5
バリデーションとは
- 不正なデータがデータベースに保存されないように、データをチェックする仕組みのことをバリデーションという
- バリデーションに引っかかった場合(不正なデータの場合)にはデータベースに保存されない
- バリデーションの設定はモデルで設定する
- 空文字制限する場合は以下
class Post < ApplicationRecord # contentカラムに対して、空の投稿を制限するバリデーションを作成してください validates :content , { presence: true } end
- 文字数制限する場合は以下
class Post < ApplicationRecord # contentカラムに対して、文字数を制限するためのバリデーションを追加してください validates :content, {presence: true,length: {maximum: 140}} end
- データを保存するときの post.save メソッドはデータ保存に成功した時に戻り値true、失敗した時に戻り値falseを返す仕組みになってる
- コントローラーで、編集リクエストがきた場合にpost.saveの結果が成功したか、失敗したかでリダイレクト先を変更するようにした
- validatesでチェックに引っかかって、post.save がfalseになった場合、直前まで入力したデータをそのままに再度入力できるようにする。そのためには、renderメソッドを使う
- そもそも、直前まで入力してたデータが消えてしまうのは、editアクションにリダイレクトされるのが原因。
- なので、直前まで入力していたデータをそのまま使うために、renderメソッドを使う。renderメソッドを使うと他のアクションを経由せずに、ビューを表示することができる(編集フォームを表示することができる)
- renderメソッドを使う場合のパスの指定に注意する。render("フォルダ名/ファイル名")って書く。
- saveメソッドで保存に失敗(バリデーションに失敗した場合)、Rails側で自動的にエラーメッセージが生成されるようになってる。
- @post.errors.full_messagesの中に、エラー内容が配列で格納されてる
- エラーメッセージをビューに出力させる例が以下。(このエラーメッセージを記述するHTMLの場所に戸惑った。form_tagのなかに書くっぽい。
<% @post.errors.full_messages.each do |message| %> <div class="form-error"> <%= message %> </div> <% end %>
<% if flash[:notice] %> <div class="flash"> <%= flash[:notice] %> </div> <% end %>
- 「renderメソッドを使うときは、別のアクションを経由しないで、renderメソッドで指定したビューを使える。そうすることで、renderメソッドを使っているアクションで定義してる変数を使える。」なんだけど、renderメソッドに指定されてるビューのアクションに、renderメソッドを使っているアクションで、定義している変数がなかったら、その別のアクション経由でアクセスした場合にエラーになるから、例えば、@post = Post.newって書いとけば大丈夫
Progate Rails 6
- ユーザーの新規登録/編集ができるようにした
- これまで投稿の機能でやってたことをユーザーに置き換えてやる
- postsテーブルを作って投稿内容を保存してたことと同じことを、usersテーブル作ってユーザーを保存するようにする
- 【復習】usersテーブルのマイグレーションファイルとモデルクラスを作成するコマンド
$ rails g model User name:string email:string
- 【復習】usersテーブルを作成する、DBに変更を反映するコマンド
$ rails db:migrate
- バリデーションで重複した入力を登録できないようにする場合は、uniqueness: trueをつかう
class User < ApplicationRecord # nameカラムに関するバリデーションを作成してください validates :name,{presence: true} # emailカラムに関するバリデーションを作成してください validates :email,{presence: true ,uniqueness: true} end
Progate Rails 7
- ユーザーのプロフィール画像を登録できるようにした
- 画像ファイルは、ファイル名をテーブルに保存して、ファイル自体はpublicフォルダに保存するのが一般的
- プロフィール画像のファイル名をusersテーブルに保存できるように、テーブルの構造を変更した。テーブルの構造を変更するまでの全体的な流れは、
- これまで、テーブルを作成する際には、例えば rails model User image_names:string というコマンドを実行して作成していたが、マイグレーションファイルのみを作成する場合は、rails g migratione ファイル名 コマンドを使う
$ rails g migration add_image_name_to_users
- 作成したマイグレーションファイルに、テーブルを変更したい内容を、changeメソッドの中に記述する
- マイグレーションファイルをDBに反映するために、使っていたコマンド「rails db:migrate」は、このchangeメソッドに記述された内容を実行するためのコマンドで、これまでに、テーブルを作ってた時も(rails model .. を実行した時も)changeメソッドが実行されていた。(rails model .. を実行した時は、changeメソッドの中身は自動で記述されてた)
- カラムを追加するため、上記で作成したマイグレーションファイル編集するために、どんな感じでchageメソッドの中身を記述するかというと、例えば、usersテーブルに、image_nameカラム(string型)を追加したい場合は以下のように記述する。(add_column :テーブル名, :カラム名, :データ型)
class AddImageNameToUsers < ActiveRecord::Migration[5.0] def change add_column :users,:image_name,:string end end
- changeメソッドを記述したら、以下コマンドを実行して、テーブルに反映させる
$ rails db:migrate
プロフィール画像を送信する方法(注意点は以下2点、この時点では画像フォームを作成しただけで、受け付けた画像ファイルを保存する処理は書いていないので、保存できない)
- フォームで、画像をアップロードしたい場合、inputタグに「type="file"」を追加することで、画像ファイルを選択するボタンを表示することができる
- 画像の送信は特殊なので、form_tagに{multipart: true}を追加する必要がある。
publicフォルダにふぁいるを保存する方法を知るために、まずrubyでファイルを作成する方法についてお勉強する。
- Rubyのコードでファイルを扱うには、Rubyに元から用意されてあるFileクラスを使う
- ファイルを作成するためには、Fileクラスのwriteメソッドを使う
- 使い方は「File.write(ファイルの場所, ファイルの中身)」 [1] pry(main)> File.write("public/sample.txt","Hello World") => 11
画像保存時の処理の流れ
- フォームに画像ファイルが入力されたか確認する(if params[:image] 〜)
- テーブルにファイル名を保存するようにする(@user.image_name = "#{@user.id}.jpeg”)
- フォームに入力されたイメージを受け取る(image = params[:image])
- 変数imageに対し、readメソッドを用いることでその画像データを取得できる
- Fileクラスを使って、publicしたに画像ファイルを保存する
if params[:image] @user.image_name = "#{@user.id}.jpeg" image = params[:image] File.binwrite("public/user_images/#{@user.id}.jpeg",image.read) end
Progate Rails 8
- Progate Rails 8 は、ログイン/ログアウト機能を作るセクション
- ログインフォームを作成したし、ログイン状態に応じてアクセス制御したり、パスワード入力するようにしたり、など。
- パスワードを保管するカラムを作成した
rails g migration ファイル名
- 反映
rails db:migrate
パスワードを入力する用のフォームを作った inputタグのtype属性をpasswordとすると、入力したパスワードが伏字となるパスワード用のフォームになります。
ログインした後に、ログイン情報を保持するためには、sessionという変数を使う ページを移動してもユーザー情報を保持し続けるために、sessionという特殊な変数を用います。sessionに代入された値は、ブラウザ(InternetExplorer, GoogleChrome等)に保存されます。sessionに値を代入すると、ブラウザはそれ以降のアクセスでsessionの値をRailsに送信します。
sessionの使い方
session[:キー名] = 値
- sessionに値を代入するときには、user_idをキーとし、値を代入します。@userが存在する場合に変数sessionに@user.idを代入することで、特定したログインユーザーの情報が保持され続けます。Progateの例は以下。
def login @user = User.find_by(email: params[:email], password: params[:password]) if @user session[:user_id] = @user.id flash[:notice] = "ログインしました" redirect_to("/posts/index") else @error_message = "メールアドレスまたはパスワードが間違っています" @email = params[:email] @password = params[:password] render("users/login_form") end end
ログインの処理ってどうやるんだっけてよく忘れちゃうけど、progateの上記コードだと、emailとpasswordの入力値を引数に、find_byして、その結果値を受け取れたら、sessionにユーザーidを格納して、ログイン完了って感じで、find_byした結果、その結果がfalseだったら、ログイン失敗って感じか。
ログイアウトする場合は、sessionの値を空にする ログアウトする、つまり「ログイン状態でなくする」にはsession[:user_id]の値を空にします。session[:user_id]にnilを代入することで、session[:user_id]の値を空することができます。
sessionの値を空にする方法
session[:user_id] = nil
- ログインしているユーザー名を表示させるようにする
- ログインしているかどうかでアクセスを制御する。
各コントローラの全アクションで共通する処理がある場合には、before_actionを使う。before_actionを用いることで、アクションが呼び出される際に必ずbefore_actionの処理が実行されます。これにより、全アクションで共通する処理を1箇所にまとめることができます。(applicationコントローラーの一番最初の行に以下のような感じで書く before_action 全アクションで共通する処理
ここで使う全てのコントローラーの全てのアクションで共通する処理は、applicationコントローラにて記述する 全てのコントローラで共通する処理はapplicaitonコントローラにまとめることができる。例えば、ログイン中のユーザーを取得するset_current_userメソッドを定義し、before_actionに指定する。これで、全コントローラの全アクションで@current_userを定義することができます。
application_controller.rbの記述例
class ApplicationController < ActionController::Base before_action :set_current_user def set_current_user current_user = User.find_by(id: session[:user_id]) end end
- アクセス制御、ログインしていない場合、コンテンツにアクセスできないようにした。ログインしていない場合のアクセス制御は方法は、まず、application_controller.rbに、@current_userがいるかどうか条件分岐にて確認して、いない場合(nilの場合)は、flashでログインが必要ですと表示させた後、ログインページにリダイレクトされるように設定
- そのために必要な関数を以下のような感じで定義する。(application_controller.rbに記述)
def authenticate_user if @current_user == nil flash[:notice]="ログインが必要です" redirect_to("/login") end end
これも共通化するために、application_controller.rbに記述する。ただ、この処理は、全てのアクションに設定するわけではないので、before_action は、(applicationコントローラの先頭ではなくて)該当のコントローラーの先頭に書いて、適用したいアクションにのみ適用する。適用したいアクションはonlyで指定する before_action :authenticate_user,{only: [:index,:show,:edit,:update]}
ここまでは、ログインしていないユーザーのアクセス制御だったけど、つぎはログインしているユーザーのアクセス制御を行う。例えば、ログインしているユーザーに新規登録などのページは不要。application_controller.rbに以下の関数を定義して、ログインしてるユーザーに参照されたくないviewへのアクションに適用するようにする。上記authenticate_userの逆。
- すでにログインしているユーザーのチェックは、@current_userが存在するかどうかのif文で確認
def forbid_login_user if @current_user flash[:notice] = "すでにログインしています" redirect_to("/posts/index") end end
Progate Rails 8 まとめ
- このセクションとこのセクションを含む道場コースは明日もう一度復習する。(すぐ忘れそうな要素多い)
Progate Rails 9
- このセクションでは、投稿とユーザーを紐付ける実装のお勉強。
- postsテーブルに誰が投稿したかがわかるようにuser_idカラムを追加した
- (復習)マイグレーションファイルを作成
$ rails g migration マイグレーションファイル名
- (復習)変更内容追記
def change add_column :users,:user_id,:integer end
- (復習)変更内容反映
$ rails db:migrate
- 投稿するタイミングで、@current_user.idをpostsテーブルのuser_idカラムに保存する。
- (復習)@current_userってどのタイミングでどうやって作成されるだっけ?
- application_controller.rbで定義してて、session[:user_id]の中に入っているユーザーidを条件にusersテーブルからひっぱてきたユーザーを@current_userに格納している。
- session[:user_id]に入っているユーザーidはどっから持ってきたのかというと、ログイン時もしくは、新規登録時のアクションの処理でsession[:user_id]=@user.idで値を保管してる。
- この際の@userインスタンスは、ログイン処理や新規登録処理では、フォームにパスワードやemailの情報を入力するので、その値を使ってusersテーブルから該当ユーザーの情報を取得している
- Railsでは、モデルクラスにインスタンスメソッドを定義することができる。
- (復習)インスタンスメソッドとはなんだっけ???
- クラスに定義されているメソッドで、インスタンスに対して呼び出すことのできるメソッドのこと
どのユーザーが投稿したメッセージかわかるようにするには???(投稿メッセージに投稿したユーザーを表示するようにするには???)
- メッセージを投稿する際、投稿したユーザーの情報をpostsテーブルに保存するようにする(user_idカラム追加)
- 投稿メッセージ(=@postインスタンス)のuser_idの情報を使って、@userインスタンスをリターンするインスタンスメソッドをpostモデルに定義する。このインスタンスメソッドを使って、投稿メッセージのビューを表示するアクションの中に@userインスタンスを定義してあげると、投稿メッセージを表示するビューで、@userインスタンスを利用することができる
def user return User.find_by(id: self.user_id) end
@userを使って投稿メッセージに投稿したユーザーの情報を表示するようにする
特定のユーザーが投稿した投稿インスタンスの情報を、1件のみpostsテーブルから取得する方法は、Post.find_by(user_id: @user.id) とかで取得できる。
- 特定のユーザーが投稿した投稿インスタンスの情報を、複数postsテーブルから取得する場合はwhereメソッドを使って取得する。
- 以下のように書くとuser_idが1の投稿が全て取得され、配列に格納される
Post.where(user_id: 1)
ユーザー詳細ページに、そのユーザーが投稿したメッセージ一覧を出す方法???
- (予想)ユーザーの詳細ページは、/users/:idのURLで、users#showアクションで、表示する。投稿一覧の情報を取得するには、Post.where(user_id :該当ユーザーのid)で取得する。showアクションの中に投稿一覧の配列の情報を取得するようにする????(結果としては違っててた)
def show posts = Post.where(user_id: params[:id]) end
def posts return Post.where(user_id: self.id) end
Progate Rails 10
- このセクションでは投稿メッセージに「いいね」をつける実装のお勉強。(取り消しもできる)
- likeテーブルを作る
- テーブル作成のためのマイグレーションファイルを作成
$ rails g model テーブル名 カラム名:データ型 カラム名:データ型 $ rails g model Like user_id:integer post_id:integer
- マイグレーションファイルをDBに反映
$ rails db:migrate
- (復習)カラムを追加する場合のマイグレーションファイルを作成する方法
$ rails g migrateion マイグレーションファイル名
- likeテーブルには、user_idとpost_idが保存されている。
likeテーブルのデータを使って、どのユーザーがどの投稿にいいねしたか表示する方法???
- likeデータを作成するためには、コントローラーが必要なので作成する。これまで、「rails g controller」コマンドで作っていたけど、今回はビューファイルが必要ないので、(rails g controllerコマンド実行したら、ビューファイルも一緒に作成される。ビューファイルが必要ないということはpostリクエストを処理するアクションのみ必要になるってこと)手動で作成する。ファイル名:likes_controller.rb
- likesコントローラーを作ったので、/likes/:post_id/create のpostリクエストが受けたら、likes_controller.rbに定義したcreateアクションで処理される
「いいね!」するために、createアクションの処理に何が書いてあるでしょうか???
- (予想)ログインユーザーの情報と投稿詳細の情報( /posts/:id ページの情報)をLikeテーブルに保存する処理だな
like = Like.new(user_id: @current_user.id,post_id: @post.id) if like.save flash[:notice] = "いいねしました" end
「いいね!」を取り消すために必要な処理は???
- (予想)Likeテーブルに保存されているデータを削除する
- 削除のpostリクエストをroutesに追加する
- 削除のpostリクエストを受け付けた時のアクションを追加する
- (復習)これまで出てきた削除処理って、どんな感じで書いてたっけ???
- (復習)これまでの削除処理を振り返ってみると、データ削除する際に、postリクエストで受け付けて削除処理してた。データ削除する用のメソッドってなかったけ???
- (復習)データベースに登録してるデータの削除方法忘れた
(正解)routes.rb ※抜粋 post "likes/:post_id/destroy" => "likes#destroy"
(正解)likes_controllerrb ※抜粋 def destroy @like = Like.find_by(user_id: @current_user.id,post_id: params[:post_id]) @like.destroy redirect_to("/posts/#{params[:post_id]}") end
(正解)show.html.erb ※抜粋 <%= link_to("いいね!済み","/likes/#{@post.id}/destroy",{method: "post"}) %>
「いいね!」の見た目を作るには???(ハートのアイコンにする)
Font Awesomeを使う。「Font Awesome」とは、様々なアイコンをフォントとして利用できるようにしたもの
これをlink_to()メソッドに指定してあげる。ただ、上記spanタグのようなHTMLをlink_to()メソッドに指定する場合、これまで書いてきたlink_to()メソッドとは、異なる書き方が必要
- これまで書いてきたlink_to()メソッド
<%= link_to("表示したい文字列","URL") %>
- リンクとして表示した文字列をHTMLで表現したい場合は以下のように書く。
<% link_to("URL") do %> <- ここにHTMLを記述 -> <% end %>
「いいね!」の数を取得するには???
- (予想)投稿メッセージのidをlikeテーブルで検索をかける
@posts = Like.where(post_id: params[:post_id]) @posts.size
- (正解)countメソッドを使う
@likes_count = Like.where(post_id: 2).count
特定のユーザーが「いいね!」した投稿の一覧を表示するには???
- (予想)いいね一覧を表示させるアクションを作成して、その処理の中にユーザーidを条件にlikeテーブルで検索した結果を表示させるようにする
@favarit = Like.where(user_id: prams[:id])
- (正解)routes.rb 抜粋
get "users/:id/likes" => "users#likes"
- (正解)users_controller.rb 抜粋
def likes @user = User.find_by(id: params[:id]) @like = Like.where(user_id: @user.id) end
- (正解)likes.html.erb 抜粋
<% @likes.each do | like | %> <% post = Post.find_by(id: like.post_id) %> <div class="posts-index-item"> <div class="post-left"> <img src="<%= "/user_images/#{post.user.image_name}" %>"> </div> <div class="post-right"> <div class="post-user-name"> <%= link_to(post.user.name, "/users/#{post.user.id}") %> </div> <%= link_to(post.content, "/posts/#{post.id}") %> </div> </div> <% end %>
Progate Rails 11
- このセクションではパスワードの安全な取り扱い方法についてお勉強する
- パスワードを暗号化するためのgem bcryptを使って暗号化する
どうやって暗号化するのか???
- bcryptをインストールすると、has_secure_passwordというメソッドが使えるようになるので、これを使って暗号化する。
- このメソッドをUserモデルクラスで使えるように設定しておくと、新規ユーザー登録の際にパスワードが勝手に暗号化されてる。Userモデルクラスに設定するのは、以下の記述にあるように記載してあげればOK
class User < ApplicationRecord has_secure_password validates :name, {presence: true} validates :email, {presence: true, uniqueness: true} def posts return Post.where(user_id: self.id) end end
- has_secure_passwordメソッドは暗号化したパスワードをpassword_digestというカラムに保存すると決まっている。
- そのため、password_digestカラムを新しくUserテーブルに追加して、passwordカラムを削除する必要がある
- (復習)テーブルに変更を加える時には、まずマイグレーションファイルを作成する
$ rails g migration マイグレーションファイル名 $ rails g migration change_users_columns
- (復習)マイグレーションファイルを作成したら、変更内容を記述する(changeメソッドに変更内容を記述数流)
def change add_column :users,:password_digest,:string remove_column :users,:password,:string end
- (復習)変更内容を反映する
$ rails db:migrate
password_digestカラムを新しく追加して、passwordカラムを削除したので、これまでpasswordカラムに保存してた処理をpassword_digestカラムに保存するように修正しないといけない、と思っていたけどその必要はないらしい。なぜ???
- has_secue_passwordメソッドがpasswordに保存された値をpassword_digestに暗号化して保存するようにしてくれるらしく、問題ないとのこと。
暗号化したパスワードでログインする方法は???
- 元々のログイン方法は、フォーム入力されたemailとpasswordがusersテーブルに存在するかチェックして、存在してたらログインできるという方法だった。パスワードが暗号化されたらどうなるか???
- フォーム入力されたパスワードを暗号化して、保存されている暗号化されたパスワードと一致するか確認する必要がある。その処理の方法は???
- (正解)authenticateメソッドを使う。authenticateメソッドは渡された引数を暗号化し、password_digestの値と一致するかどうかを判定できる。
- このauthenticateメソッドはhas_secure_passwordメソッドを有効にしている場合に利用できるメソッド
AFTER CODEBASE School 3week
AFTER CODEBASE School 2week
今週はCODEBASE Schoolで書いてたSlimのアプリでできたことを、Sinatraでもできるようになることを目標に作業してた。けど、目標達成できず。。。。(今週の学習時間22時間)
AFTER CODEBASE School 2week
- Progate
- ドットインストール
- Slimで書いてたのと同じことをSinatraで書く(先週ドットインストール Sinatra入門終わった後に足りてなそうな知識を中心に学習)
- DBの操作
- セッション(ログイン)->未完了
- 画像アップロード ->未完了
- パスワードをハッシュ化 ->未完了
振り返り
- 今週は本筋じゃないとこで色々ハマって時間取られた。そして結局原因はわからず。。。。。なんかよくわかんないけど動いた(改善した)、にしては時間取られすぎたと思うので、ちゃんと理解できるようにしておきたい。だけど、寄り道しすぎたら目的見失う問題もあるので、バランスよくする
- いろんなことを忘れてるなーと思った。例えば、Slimと同じことをsinatraでやろうと思った時に、Slimでログインする機能作ったときどうやったんだっけ?とか、jQueryとかめっちゃ忘れてた
- ユーザーテーブルを作成 - 新規ユーザー登録フォーム作成 - slimのやつをコピペした - ユーザー登録処理作成 - 既存に存在しないチェック - ハッシュ化 - セッションに追加 - ログインフォーム作成 - slimのやつをコピペした - ログイン処理 - セッションチェック - パスワードチェック - セッションに追加
その他 備忘録メモ
- phpでvar_dumpして変数の中身を調べてたことと同じようなことをしたいと思って調べてたけど、まだちゃんとわかってない
- ドットインストール Active Record入門はsqlite3を使ってるけど、mysqlを使いたかった。以下記事が参考になった
- HTMLはしょっちゅう忘れるので随時いろいろ振り返る
Active Record入門 ドットインストール をやってみた備忘録メモ
Active Recordとは
- OR Mapper (OR Mapper の O は Object、R は Relational database のこと)
- マッピングすることによって、SQL を意識せずに Ruby のオブジェクトのようにデータベースを簡単に扱うことができる
- 例えば、users テーブルのレコードをUserクラスのインスタンスとして扱えるようになる。
class User < ActiveRecord::Base end
バリデーション
- 入力値チェック。レコードを挿入したり更新したりする時に、ルールを付けることができる仕組み
- 以下の例は、空白を防ぐ。nameは3文字以上
class User < ActiveRecord::Base validate :name,:age,presence: true validate :name, length: {minimum: 3} end
コールバック
- callbackの種類は他にもいくつかあり、何らかの処理の前後で特定の処理をしたい場合に使う。
- ActiveRecordで定義されてる
- before_destoryってのと
- after_destroyってのが
- 以下の例は、レコードが削除される前後で標準出力する
require 'active_record' require 'pp' require 'logger' Time.zone_default = Time.find_zone! 'Tokyo' ActiveRecord::Base.default_timezone = :local ActiveRecord::Base.establish_connection( "adapter" => "sqlite3", "database" => "./myapp.db" ) class User < ActiveRecord::Base before_destroy :print_before_msg after_destroy :print_after_msg protected def print_before_msg puts "#{self.name} will be deleted" end def print_after_msg puts "#{self.name} deleted" end end User.delete_all User.create(name: "taka",age: 33) User.create(name: "masa",age: 44) User.create(name: "mari",age: 53) User.create(name: "taro",age: 23) User.create(name: "maki",age: 13) User.create(name: "mika",age: 29) User.where("age >= 20").destroy_all
- 実行結果
$ bundle exec ruby main.rb taka will be deleted taka deleted masa will be deleted masa deleted mari will be deleted mari deleted taro will be deleted taro deleted mika will be deleted mika deleted
アソシエーション
- 複数のテーブル(オブジェクト)を関連づける仕組み
- 例えば、
- ユーザーが複数のコメントをもつという関係
- has_many :comments
- コメントからすると、一つのユーザーに属する関係
- belongs_to :user
- ユーザーが複数のコメントをもつという関係
require 'active_record' require 'pp' Time.zone_default = Time.find_zone! 'Tokyo' ActiveRecord::Base.default_timezone = :local ActiveRecord::Base.establish_connection( "adapter" => "sqlite3", "database" => "./myapp.db" ) class User < ActiveRecord::Base has_many :comments end class Comment < ActiveRecord::Base belongs_to :user end User.delete_all User.create(name: "taka",age: 33) User.create(name: "masa",age: 44) User.create(name: "mari",age: 53) User.create(name: "taro",age: 23) User.create(name: "maki",age: 13) User.create(name: "mika",age: 29) Comment.delete_all Comment.create(user_id: 1,body: "hello01") Comment.create(user_id: 1,body: "hello02") Comment.create(user_id: 2,body: "hello03") comments = Comment.all comments.each do |c| puts "#{c.body} by #{c.user.name}" end
- 実行結果
$ bundle exec ruby main.rb hello01 by taka hello02 by taka hello03 by masa
アソシエーション(削除)
- 例えば、ユーザーを削除して、関連するコメントを一緒に削除したい場合
class User < ActiveRecord::Base has_many :comments, dependent: :destroy end
感想
Active Record の関連付け (アソシエーション) あたりが難しかったので要復習
AFTER CODEBASE School 1week
今週からRubyの勉強を始めた。Slimアプリ修正も少しづつ進めるなど。(今週の学習時間25時間)
AFTER CODEBASE School 1week
Ruby 環境構築
$ brew update $ brew install rbenv ruby-build $ brew list $ echo 'eval "$(rbenv init -)"' >> ~/.zshrc $ source ~/.zshrc $ rbenv --version $ rbenv install -l $ rbenv version $ rbenv versions $ rbenv install 2.5.0 $ rbenv versions $ rbenv global 2.5.0 $ rbenv version $ ruby -v $ gem install bundler $ bundler -v
- local, global コマンドでバージョンを固定する
- ルート(/Users/username) に local 設定しちゃうとlocalだけどglobalっぽい動きになるので注意
- versionsで手元に入っているRubyのバージョンを確認出来る
- それぞれのバージョンごとにgemをインストールするのでバージョンを変えると再度インストールする必要がある
- ~/.rbenv フォルダにrubyのruntimeとgemがインストールされる
- プロジェクト毎にインストールするgemの場所を指定したい場合は bundle install --path=vendor/bundle とする
- こうすることで、全体(global)に影響しないようにできる
- bundle install でGemfileに書いてあるgemがインストールされる
- gem の依存関係もチェックしてくれてインストールされる。(依存関係が考慮されたものはGemfile.lock)
- あと、rbnev install ができない問題解決せず。。。
Sinatra 環境構築
- コマンド(以下二点がポイントでrubymine使いやすくなるらしい)
- rubyのバージョンをローカルで指定する
- gemのインストール先を --path=vendor/bundle で指定する
$ cd ~/Development/ruby/sinatra-sample $ rbenv local 2.5.0 $ bundle init $ vi Gemfile $ bundle install --path=vendor/bundle $ vi app.rb $ bundle exec ruby app.rb
- Gemfile
source 'https://rubygems.org' gem 'sinatra', github: 'sinatra/sinatra' gem 'sinatra-contrib'
- app.rb
require 'sinatra' require 'sinatra/reloader' if development? get '/' do 'Hello world!' end
Sinatra dotinstall
とりあずドットインストール sinatra入門 チュートリアルはやってみた。データの登録とか削除とかざっくりできるようになった。もう少しやってみて、細かいところ理解できるようにする。
- 「@」から始まってる変数は特殊な変数。ビューファイルでも使える
- 共通したViewの記述を views/layout.erb で記述できる
- yieldとは?
- ざっくり色々わかってない(RubyMine 定義元に飛ぶやつ、いまいち使いこなせてない)
ActiveRecord::Base.establish_connection
use Rack::Session::Cookie,secret: "thisissomethingsecret"
use Rack::Csrf, raise: true
Rails 環境構築
- gem install rails でインストールしたrailsコマンでrails new してて、
- rails new で作ったディレクトリで--path=vendor/bundle にインストールしたrailsコマンドでrails立ち上げてる(rails server)
$ cd ~/Development/ruby/rails-sample $ rbenv local 2.5.0 $ gem install rails $ rails $ rails new --skip-bundle sample $ cd sample $ bundle install --path=vendor/bundle $ bin/rails server ※ $ bundle exec rails server
その他 メモ
RubyMineの設定とか
まとめ
- 今週からrubyやってる。「文系から半年でRuby(Sinatra, Rails)を学んだら人生変わった」をやってみようと思ってて、目標はここ300時間ぐらいで、Rails かけるようになりたい(スタートラインに立てるようになりた)。
これは実際そうですね。
— むらい(Progate) (@wyvernMurai) 2018年2月10日
一番おすすめなのは
1, ProgateのRailsコースを2週
2, railsチュートリアルを2周(https://t.co/VPQJg0FWeM )
3, 自分のプロダクトを作ってみる
ですね。自分で作りたいプロダクトがない人はインスタグラムとか有名なサービスの模倣を作ってみるといいです。 https://t.co/NLGCjfOwer
Progate Railsの修了時間の合計が30時間、チュートリアルがざっくり2倍ぐらい時間かかるとして60時間、それぞれ2周したとして計算すると180時間。これに自分のプロダクト作ってみる時間をざっくり120時間で計算すると300時間。なるほど。
— shimabukuromeg (@20092014) 2018年3月24日
これからプログラミングをゼロから学び始める人たちへ(0〜200時間編)
2018年 1月16日(火)から 3月16日(木)の2ヶ月間、CODEBASE主催のプログラミングスクールに通っていました。この2ヶ月間で、本当にたくさんのことを学んだので、僕のように、これからプログラミングを0から学んでいこうと思っている人たちに向けて、このスクールで学んだことを紹介できればと思います。ここでの話は、僕がプログラミングスクールに通い学んだ体験が前提となりますが、ゼロからWebアプリケーションを作れるようになるまでの知識やスキル、それらを学んでいく順序などが、この講義の中ではすごく考慮されていていたので、プログラミング未経験者がスタートラインに立つまでに(プログラミング経験0〜200時間までに)やるべきことの参考になるのではと思い、講義内容を整理してまとめてみました。独学で勉強している/独学で勉強しようと思っている人たちにも参考になっていただけるといいなあと思います。
これからプログラミングを0から学び始める人たちへ
- この2ヶ月間でやったこと(学習時間/CODEBASE School講義)
- プログラミングを学ぶ前と今とでどう変わったか
- 今後どうしていきたいか
この2ヶ月間でやったこと(学習時間/CODEBASE School講義)
- 総勉強時間
普段の業務をこなしながらの勉強だったので、平日に1日2時間〜3時間、週末に7時間〜10時間の学習時間を確保するのが限界でした。2ヶ月間で総勉強時間はだいたい200時間ぐらい程度です。(この200時間って言ってるのはコードを書いてない時間も含めてて、講義を受けてる時間や環境構築だったりツールの使い方だったりを調べてる時間も含んでます)
- 第1, 2回 オリエンテーション・Webの仕組み
まずは、プログラミングを学ぶための環境作りとウェブのしくみを学ぶ。自分のコンピューターでプログラムを動かせるようにする準備、Webサイト(Webアプリケーション)がどうやって動いているのかっていう概要を知る。ちゃんとプログラムを動かせる環境を用意できないと、プログラミングの勉強を始められないっていうのと、ウェブの仕組みを知らないと自分が書くプログラムって何してるんだっけ?ってなると思うので、このあたりを最初に学ぶのは重要だと思いました。
- 第3, 4回 HTML, CSS, Bootstrap
HTML, CSSは、Webサイト/アプリケーションのページを表示するのに使うものなので、Webアプリケーションを作るために必須となる知識です。概念的にはわかりやすいので、ざっくり理解するのは難しくないと思いますが、実際手を動かしてデザインするってなるとすごく難しいです。個人的には、ここでたくさん手を動かして、少しでも理解を深めることが重要だと思います。(Progate HTMLのコースを2周ぐらいしたらいいかも)まあまあ慣れたらBootstrapのサンプルページのコードを読んだり、コピペで動かしてみたりするのも、理解深めまると思います。
- 第5, 6回 オリジナルサイト制
HTML,CSSにまあま慣れてきたら、実際にオリジナルのサイト制作をやってみる。テーマはなんでも良いのですが、自分でオリジナルのものを作ってみることで、ワイヤーフレームを考えたり、他のサイトがどうなっているのかをみてみたり、今までインプットしたものをアウトプットするにはどうすればいいかを考えるようになるので、すごく勉強になると思います。
- 第7, 8回 JavaScript, jQuery
JSは今回の200時間で一番時間使えてなかったなと思っている部分ですが、最低限 ProgateのJavaScriptとjQueryのコースは一通りやるのをオススメします。あんまり意味がわかってなくてもBootstrpとかを使うと、いい感じに動いてくれたりしますが、JSやjQueryを使うときのリンクの貼り方や基本的な仕組みは、理解しておいたい方が良いと思います。(たまに動かなくなった時に、知識なさ過ぎたら、調べることもできなくなるので、それはまずいです)
- 第9, 10回 PHP入門
ここからがサーバーサイドです。今回はPHPを勉強しました。ここでも手を動かすのがすごく重要です。ProgateのPHPのコースを2周ぐらいするのと、詳細!PHP 7+MySQL 入門ノートっていう本のサンプルコードをとりあえず1周写経する。理解が浅いところを繰り返すっていうのがおすすめです。あと今回PHPを学ぶにあたってPHPStormっていうエディタを使ったんですが、補完機能だったり、色々多機能で、初心者な人ほどこのエディタを使うべきだと思います。学習効率がめっちゃ上がります。
- 第11, 12回 Slim入門
マイクロフレームワークを使ってWebアプリケーションを書いていきます。マイクロフレームワークは最低限のHTTPの実装をしているプログラムなので、マイクロフレームワークを使うことでHTTPが何なのかを知ることに繋がっていきます。ここから、MVCという概念も出てきます。ただ、個人的にこのMVCをちゃんと理解するのは難しい気がしてて、ざっくりどういうものか理解しておいて、これから先リッチなフレームワークを使うタイミングで手を動かしながらちゃんと理解するのがいいのかあと感じてます。ここでも手を動かすことが重要なので、nunulk さんがqiitaにあげているSlimチュートリアルを全部やりましょう。このチュートリアルはほんとわかりやすかったです。めちゃめちゃおすすめです。
- 第13, 14回 DB、DB設計、アプリケーション設計、セキュリティ
アプリケーションをゼロから作っていくためにはどうすれば良いのか、何を考えれば良いのか、っていう設計の話をまとめてます。Webアプリケーションの設計プロセスはすごく重要で、これからWebアプリケーションを作ろうと思った時に、ここに書いてあることを振り返るようにしたいと思っています。ただ、設計についていきなり考えるのは難しいので、すでに世の中に出ているサービスがどうなっているのか、ER図とかURLとか想像してみるのが、理解を深めるのに取っ掛かりとしておすすめです。
- 第15, 16回 自作アプリケーション開発
これまで学んできたことHTML,CSS,JS,PHPを使っての集大成。特に13,14回週で学んだことを意識しながら、作るものを考えるのが重要だと感じました。個人的には、この時点で、自分が持ってるスキルを使ってできる最低限のものをまず作ってみて、そこから少しづつ改良していくようなやり方が良いかなと思っています。(ちょっと最初から難しことやっちゃうと、手が止まっちゃうのであんまりよくない感じがしてて、例えばnunulkさんのチュートリアルをベースに、改良を加えていくなどしたら、良いのではと思います)
- 第17 Git入門/GitHub入門
これまでの学習である程度コードがかけてきたら、Git/GitHubでソースコードを管理していきましょう。単純にソースコードを管理するだけじゃなくて、普段自分がどれだけコードを書いているかを見える化できたり、チームでコードを書いていく際には、必須の知識だったりするので、普段から使っていくことをオススメします。取っ掛かりとしてはチュートリアルをやってみたりして、あとは実際にどんどん使っていって、色々ハマって、調べて上達するのが良いかなと思っています。
プログラミングを学ぶ前と今とでどう変わったか
2ヶ月間(200時間)プログラミングを勉強してみて、個人的には成長できたと思っています。卒業制作でそれなりに動くものを作れたのはものすごく感動でした。ですが、対外的には正直これと言って語れる成果を出せてないの現状です(笑)そんな中、この2ヶ月間でプログラミングを学びながら、大きく影響されたこと、自分の意識が変わったことが2つあるのでぜひ紹介させてください。
- 1000時間を積むこと
講義の中で、プログラミングを習得するのに必要な時間についての話があって、それがだいたい1000時間らしいです。プログラミングはセンスとか才能とか全然不要で、本当に取り組んだ時間に比例して上達するので、自分がプログラミングに対して1000時間投資するためにどうやって時間を抽出して、計画するかが重要という話でした。やっぱり才能だったり、始めるタイミングだったりが重要だったりするだろーなって、少なからず思っていたので、めちゃめちゃ励みになりました。何か新しいことを学びたいと思った時に、プログラミング以外のことでも同じことが言えると思います。
- やる気ってあんまり重要じゃない
講義のなかで「何かあたらしいことを身につけようと思ったときに、やる気ってあんまり重要じゃなくて、いかに自分を中毒状態にできるかってのが大事」って話がありました。個人的にも、なんかやる気が出ないなーとか思うことがよくあったので、やる気だけで何かを乗り換えていくって結構大変なことなのでは?と思ってました。なので、自分を中毒状態にする仕組みを、これから意識していきたいなあと思いました。
ぼくは何か学習したいと思ったら、毎日それを習慣にして、無意識に耳に入れたり、それをやってる人と何度もあったり、それに関するtweetを頻繁に目にするようにしたり。結構外的トリガーを整理して環境を作ると内的トリガーに切り替わりやすいという自分の中の実体験、自分の脳の仕組みを少し理解してるつもりなのでそういう感じで仕向けます
やる気って過大評価されますけど、やる気ってあまり関係なくて、脳を中毒症状に持っていければ勝手に自動的に学習する習慣がつきます(たぶん
今後どうしていきたいか
まずは1000時間を積んでいきたいと思っています。この1000時間積むために、中毒性っていうのがすごくポイントだと思っていますが、それに加えて、適切な目標設定をできるかってのも重要だと思っています。1000時間積むために何をやればいのか?が見えなくなってきたら要注意な気がするので、自分の立ち位置とゴールを見誤らないようにしたい(多分、実務をこなすってのが一番だと思うけど、、、この辺りはもう少し考えないとなー)
もうちょっと長期的なふわっとした目標設定なんだけど、ソフトウェアエンジニアリングで課題解決できる能力を身に付けたいと思ってます。あとは、身近な人が喜んでくれるようなものを、作っていけたらなーって思ってます。
スタートラインに立つまでに1000時間
— さぼ@ギークハウス沖縄 👨💻☕️🎹🎧🐈 (@saboyutaka) 2018年3月16日
まとめ
今回のCODEBASE School で学んだプログラミング0から200時間までにやったことを書きました。参考になれば嬉しいです
とは言っても僕も初心者から200時間勉強しただけなので、まだまだ1000時間までは長いです。挫折しそうになってたら助けてください笑
終わりに
最後にこのCODEBASE School の二期生を募集してるとのことです!!!現役のフリーランスエンジニアの [twitter:@saboyutaka] さん、[twitter:@kanbo0605] さん を講師に迎えて、現場感のある情報を講義の中で触れれるのはものすごく良かったなーと感じてます。まじでめちゃめちゃ学びが多いので、プログラミングをこれから始めたいと思っている人やWEBの世界に興味がある人はぜひ応募して見てください。