「No!!!」と言える勇気

おはようございます。

本日は題名どおり「Noと言うことの大切さ」について書いていこうと思います。

Noというのは決して悪いことではない

「KY」
この言葉が現れてから、日本ではみんなと考えを合わせることが美徳と考えられて来ました。
学校においても、「仲間はずれはダメ。」、「誰とでも仲良くしなさい」と言われますよね。

しかし、みんなに合わせるのがそんなに大事でしょうか?
僕はそうは思いません。
何故なら僕たちは他の誰でもない自分だけの人生を歩んでいるからです。

「他の人がこれをやっているから、僕も」
これって他人の考えを基に生きてますよね?

そんな人生虚しくありませんか?

だから、僕は人に合わせるようなことはしません。
本当に自分がしたいことをします。
人に流されることもまだまだありますけどね笑
しかし、以前よりはNoと言えるようになってきました。

一度きりの人生です。
自分に正直になって生きて行きたいです!!!!!

rails tutorial 8章まとめ

おはようございます。

つい先日、rails tutorial8章目を終えました。
2周目だったのですが、それでも理解度は70~80%くらいでした笑
なので、一度文章でまとめてみようと思います。

rails tutorial 8章

第8章はセッションについてでした。

sessionとは

sessionとはwebサイトにアクセスしてサイトを閉じるまでに行う一連の動作のことを言います。
また、サイトを開いていても一定時間が経過してしまうと2sessionにカウントされることもある。

sessionの実装

早速sessionの実装について書いていきたいと思います。

  1. ログインフォームの作成
    ログイン、ログアウトの要素を実装するためにsessionsコントローラーを作成します。

    rails g controller sessions 

    これでsessionsコントローラーを作成できました。
    次にログインフォームを作成します。
    routeとcontrollerは以下の通りです。
    route

    get '/login', to:sessions#new

    controller

    def new
    end

    次にhtmlですが、フォームにはform_forヘルパーを使います。

    <%= form_for() do |f| %>
    ・
    ・
    ・
    <% end %>

    form_forヘルパーの引数にはどのアクションに飛んで欲しいか記述する必要があります。
    また、ユーザーの作成の際には@userを引数に取るだけで「/usersのPOSTアクションに飛んでね。」と指示できましたが、sessionsにはモデルがないのでこのようには記述できません。

    <%= form_for(:session, url:login_path) do |f| %>
    ・
    ・
    ・
    <% end %>

    となります。
    routeに記述したことで名前付きルートが使用できます。
    また、入力欄はfオブジェクトによってhtmlフォームに対応する要素を作り出します。
    よって、入力欄のコードは以下のようになります。
    new.html.erb

    <%= form_for(:session, url: login_path) do |f| %>
    <%= f.label :email %>
    <%= f.email_field :email, class: 'form-control' %>
    <%= f.label :password %>
    <%= f.password_field :password, class: 'form-control' %>
    <%= f.submit "Log in", class: "btn btn-primary" %>
    <% end %>
  2. ユーザー検索と認証
    最初に無効な入力な処理を行います。

    def create
    render 'new'
    end

    ログインフォームから受け取る値はparamsに入っています。
    params[:session]
    また、sessionはemail,passwordの二つのキーを持っています。
    つまり、createが受け取る値はparams[:session][:email],params[:email][:password]の二つです。
    これを使い認証していきます。

    def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
    #ログイン成功
    else
    render 'new'
    end
    end

    find_byメソッドで該当するユーザーを検索します。
    authenticateメソッドで入力されたパスワードのハッシュ化された値と登録されている値が一致しているか確認しています。
    一致していればログインできます。

  3. ログイン
    認証は済んだので次はセッションを実装していきます。
    また、ここからたくさんのメソッドを書いていくのでそれらはhelperにまとめます。
    ログインにはsessionメソッドを使います。

    session[:user_id] = user.id

    このメソッドは使い回せるように関数にします。
    helper

    def log_in(user)
    session[:user_id] = user.id
    end

    このヘルパーメソッドをcreateアクションに記述して完成です。

    def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
    log_in user
    redirect_to user
    else
    render 'new'
    end
    end
  4. ユーザーIDを他のページでも使えるようにする
    別のページでも現在のユーザーを呼び出すためにはsession[:user_id]からユーザー検索を行えばいいです。

    def current_user
    if session[:user_id]
    User.find_by(id: session[:user_id)
    end
    end

    また、何度も上のメソッドを行うのは無駄が多いのでcurrent_userがnilの時のみ行うようにします

      if @current_user.nil?
    @current_user = User.find_by(id: session[:user_id])
    else
    @current_user
    end

    最後に上記のif文をまとめます。

    def current_user
    if session[:user_id]
    @current_user ||= User.find_by(id: session[:user_id])
    end
    end
  5. ログアウト機能の実装
    最後にログアウト機能を実装します。
    helper

    def log_out
    session.destroy[:user_id]
    @current_user = nil
    end
    def destroy
    log_out
    redirect_to root_url
    end

以上でログイン、ログアウト処理の実装が完了しました。
文にしたことで多少は整理できたはず。。。笑

ブログをするメリット

今日は自分の考えを発信することの大切さについて書きたいと思います。

自分の考えを発信するメリット

1.自分の考えと似ている人が集まってくる。

『僕自身はこう思う』、『僕はこうしたい』と口に出して言い続けることでその意見に賛同する人がどんどん集まってきます。
また、反対に自分と意見が違う人はどんどん離れていきます。
つまり、意見を発信することで自分らしく生きられる人間関係を築いて行くのが可能になるのです。
これが一つ目の利点です。

2.自分の考えを文字に起こすことで理解がより深まる。

こちらは考えというより技術的な発信についてです。

教材を読むと確かにわかった気になりますが、実際にそれを外部に発信しようとすると分かったつもりでいても理解できていない部分が明確になります。
つまり、『教材を読み込む』 → 『ブログなどでアウトプットする』これでワンセットなのです。

これが二つ目の利点です。

他にも文章の組み立てが上手になったり、書いたことは記憶に残りやすいなどのメリットもあります。
ブログは始めるためのコストもかからないので興味のある方は是非初めてみて下さい。

Gitについてまとめてみた。

今日はgitについてまとめてみようと思います。

gitとは何か

gitとはソースコードを管理するサービスです。
ソースコードを管理するメリットとしては、

  • うっかりファイルを消してしまった時でも復旧可能である。
  • コードの履歴を追える。

などがあります。
ですので、開発を使う際は積極的に使いましょう。

実際の使い方

ここでは、githubを用いて説明していきます。
まず、コマンドラインソースコードを管理したいディレクトリまで移動し、

git init

と打ち込みます。
そうすると、ディレクトリ内にgitフォルダが出来上がります。
これで準備はできました。

今現在ファイルはステージングという待機用リポジトリに置かれています。
そこからリポジトリに移動させるには

  1. git add

    リポジトリにあげるファイルを選択する

  2. git commit

    で選択したローカルリポジトリに移動する

  3. git push

    でリモートリポジトリにアップする

という三つの手順が必要です。

ブランチやマージの使い方

これらは共同開発でとても役に立ちます。
ブランチとはリポジトリのコピーでそれを使い、それを元に変更を加えていきます。
ブランチで行う変更はメインブランチに影響されないので開発自体に支障は出ません。
そして、最後にマージ(合流)してメインブランチに変更を取り込みます。

以上がgitの説明になります。
gitは会社に入ってチーム開発になると必須のスキルとなるので是非とも今のうちから意識して身につけていきたいですね。

『嫌われる勇気』から考える人が変わる方法

おはようございます。

本日は僕が最近読んだ本、『嫌われる勇気』から人が変わる方法を考えていきたいと思います。

1.あらすじ

この本ではアドラー心理学と言うものを用いながら、幸せに生きる方法について説いていくお話です。
アドラー心理学を研究している老人とその部屋に訪れた青年の対話形式で物語は進んでいきます。

なぜ、人は変われないのか

人が変われない理由には原因論が関係していると思います。
原因論とは過去の経験から今が決まると言う考え方です。
例えば、『今日は疲れたから勉強しなくていいや』、『今週は仕事頑張ったから散財しよ』などです。

しかし、アドラー心理学では逆から考えるそうです。
つまり、
『今日は疲れたから勉強しなくていいや』 → 『勉強したくないから今日は疲れたことを引き合いに出す。』
『今週は仕事頑張ったから散財しよ』 → 『散財したいから今週頑張ったことを引き合いに出す』と考えます。

原因論は現在の目的にかなう過去を引き合いに出しています。
反対に目的論は過去と今を引き離して考えます。
つまり、過去の経験にとらわれずにいきていく事ができます。

また、『人間が変われないのは変わる勇気がないからだ』とも言っています。
これも原因論、目的論と関係しています。
変わりたいと口だけで言っている人は過去の経験を出してきて、やはり行動しません。
変わりたいと本気で思っている人は過去のことなど気にせず、今必死に努力しています。

人が変わる方法

先ほども話した通り、過去の話をして言い訳している時点でもう終わっています。
つまり、やることはただ一つ。今日この日になりたい自分に向かって努力していくだけです。
結局はそこだと思います。
今を変えたいと覚悟をもち必死に取り組んでる人が幸せを掴めると思います。

この本を読むと難しいことを考えずに、今この瞬間を生きないといけないなと思わされます。
気になった方はぜひ読んでみてください。

Helperを使いこなそう

おはようございます。

本日はHelperについての説明をしていこうと思います。

Helperって何?

Helperとは文字通りHelp、助けてくれるものです。
では、何を助けてくれるかと言うと、それはViewをよりシンプルに書くのをです。

Helperの例

<%= form_tag %>
<%= f.submit %>
<%= link_to %>
などはみなさん使ったことはありますよね?
これ全部Helperなんです。

Helperを使うメリット

複数のviewに似たような記述がある時まとめる事ができる

例えば次のようなコードがあったとします。

<h1>Helper</h1>
<a href="#">Helper</a>

など、複数に渡って同じ文字が書かれてるとします。同じ文字を何回も書くのは面倒ですよね。こんな時にHelperを使います。

def test
Helper
end
<h1><%= test %></h1>
<a href="#"><%= test %></h1>

このようにHelper内で関数として定義して、viewで関数を呼び出します。
関数としてまとめる事で修正する時も関数を修正するだけなので手間が省けます。

今回はHelperについて紹介しました。
僕もまだtutorialを始めたばかりなのでアドバイスなどありましたら、どんどん聞かせてください。

今日はありがとうございました。

物事を続けるために気をつけること

おはようございます。
本日は物事を続けるコツについてよく聞くけど問題点やそれに対する自分なりの考えを述べていきたいと思います。

1.毎日やるべきノルマに疲れた

これは誰もが経験があると思いますが、最初に1日◯◯時間もする!!!と壮大な設定をしてしまい段々とやるのが面倒くさくなるパターンです。
僕もよくありました。笑
「これから◯◯時間もやるのか〜」と。笑
こういう場合ですが、そもそも最初の設定が間違っています。
最初のハードルはぐんっっと下げるべきなのです。
塵も積もれば山となると言いますよね。
最後は継続したもの勝ちなのです。

2.やる時間がない

これについては簡単です。
やるべきことをいつやるか時間を決めてその時間と前後1時間は絶対に予定を入れないようにするのです。
僕自身2018年は簿記とプログラミングを学んでいました。
1日最低でも6時間は時間が必要だと思ったので旅行はもちろん、1日遊びに行くこともありませんでした。
1日は24時間と有限です。
なので、自分がしたいことに優先順位をつけて順位が高いものから時間を割り振っていくべきです。

3.やる気が出ない

これは1と関連しています。
「これから◯◯時間もやるのか」と。
心理的ハードルが大分上がっています。
最初の設定をぐんと下げたにも関わらずやる気が起きない。
そんな時は「今日はやらなくていい!でも最初の動作だけはやろう!」ということです。
ここでいう最初の動作とは勉強であれば、机に向かう、パソコンを開くなどです。
それだけでいいの?と思われますが1番怖いのはハードルを上げすぎて挫折するパターンなのです。
塵も積もれば山となります。
1日で成功するようなことは絶対にありません。
ゆっくり確実に歩みましょう。
やる気が出ない方は最初にお金を投資することもおススメです。
僕はプログラミングの勉強で挫けたことは何度もありますがその度に最初にスクール代の30万を払ったことを思い出し奮起していました笑

あ、あと一つ。
勉強中にスマホを見てしまうことよくありますよね?笑
スマホは集中力を奪うのでとても厄介です。笑

僕は自宅で勉強することが多いのですがスマホは絶対に部屋に持っていきません。
視界に入るだけでアウトだと思ってるので。

長々と書いてしまいましたが、要するに勉強に集中できる仕組みを作って、あとはコツコツ地道にやっていこうと言いたいだけでした笑

本日は以上です。
見ていただきありがとうございました。

Rails Tutorial 4章 まとめ

おはようございます。

最近はrails tutorialに苦戦しながらも取り組み、先ほど4章が終了しました。

ですので、一度このブログ内でまとめようと思います。

文字列

文字列は””で囲み、表示させる。

"example"
=>example

結合は+演算子を使う

"今の首相は" + "麻生さん"
=> 今の首相は麻生さん

文字列を組み立てる方法には式展開というものもある。これには#{}というものを使う。

name = "麻生さん"
"今の首相は#{name}"
=>今の首相は麻生さん

このように#{}は変数を文字列に入れるときに使用します。

シングルクォートの使い方

文字列はダブルクォートかシングルクォートで囲み、表示させます。
しかし、シングルクォーテーションだと式展開ができませんので僕は基本的にはダブルクォートを使います。

シングルクォートは#{}をそのまま表示させたいと言った時に使用します。

オブジェクト

オブジェクトとはメッセージに応答するものです。
例えば、

"basket".legth
=> 6

これはlength(何文字?)というメッセージに”basket”文字列が応答したものです。

同様に

"basket".empty?
=>false

こちらはempty?(空っぽ?)というメッセージに対してfalseと返しています。
true,falseという論理値を返すことを?で表します。

if文でも使われます。

s = ""
if s.empty?
"yes,empty"
else
"nonempty"
end
=>yes,empty"

なお、論理値はそれぞれ&&(かつ),||(または),!(not)でも使われます。

a = ''
b = 'nonempty'
puts "both string empty" if a.empty? && b.empty?
=>nil
puts "one of the string empty" if a.empty? || b.empty?
=> "both string empty"
puts b if !b.empty?

なお、上記の文は全てif文が後ろに来てますよね。
trueの処理しか書かない場合、このようにif文を後ろに書くことが可能になります。

次に数字を文字列に変換する方法です。
変換するには”to_s”を使います。

b = 1
puts b
=> 1
b.to_s
puts b
=> "1"

メソッド

メソッドは引数があることが大前提のように思ってましたが、なくても良いらしいです。

def string_message(str = '')
if str.empty?
puts "empty"
else
puts "nonempty"
end
end
$ string_massage
=>"empty"

このように引数を指定しなくてもエラーが出ません。
なぜかと言いますと、メソッドを定義した段階でデフォルト値を含めているからです。(str = ”)
これを定義したことによって引数が渡されなかった場合はデフォルト値が渡されるようになります。

また、rubyでは一度値を返したらその後の値は表示されません。

def string_message(str = '')
return "empty" if str.empty?
return "nonempty"
end

上の関数の場合、2行目はご存知if文ですね。strが空っぽだったらtrueで”empty”が返されます。その場合もう値を返したので3行目のnonemptyは表示されません。
次に2行目がfalseだった場合、”empty”は返されません。
また、まだ一度も値を返していないので3行目に”nonempt”を返すことができます。

このようにif文は書き直すことができます。

配列と範囲

split >>>文字列を区切り表示させます。

a = "asou tarou"
a.split(' ')
=> "asou" "tarou"

次に配列です。配列は特定の順序をもつ要素のリストです。

name = ["太郎", "二郎", "三郎"]
$ name
=>["太郎", "二郎", "三郎"]

インデックスを付けることによって特定の要素だけを取り出すことができます。

$ name[0]
=> "太郎"

配列の追加にはpushメソッドを使います。

name.push = "四郎"
$name[3]
=> "四郎"

to_aメソッドは範囲を配列に変換できます。

$ 0..9 #0~9の範囲
=>0..9
$ (0..9).to_a #配列に変換
=>[0,1,2,3,4,5,6,7,8,9]

mapメソッドは渡されたブロックを配列や範囲オブジェクトに適用し、結果を返す。

(1..5).map{|i| i ** 2}
=>[1, 4, 9, 16, 25]

これは1~5の数字をそれぞれ二乗して新しく配列に入れています。

ハッシュとシンボル

ハッシュは配列と似ていますがインデックスとして整数値以外も呼び出せるのが異なる点です。

president = {"first_name" => "tarou", "last_name" => "asou"}
president[:first_name]
=>"tarou"

このようにハッシュは要素を{}で囲み、その中にキーと対応する値をかきます。
また、railsでは文字列よりもシンボルが主流だそうです。
シンボルとはクォートのかわりに先頭に「:」を付けることです。

先ほどの文は次のように直せます。

president = {:first_name => "tarou", :last_name => "asou"}
president[:first_name]
=>"tarou"

また、:キー => とキー:は等価であるため、

president = {first_name: "tarou", last_name: "asou"}
president[:first_name]
=>"tarou"

と表記することも可能です。

また、ハッシュの値にはなんでも使うことが出来、他のハッシュを使うことも可能です。

params = {}
params[:user] = {:name => "asou" :gender => "man"}
params[:user][:name]
=>"asou"

また、ハッシュもeachメソッドに対応します。

profile = {}
profile = {name: "asou", gender: "man", age: "22"}
profile.each do |key, value|
puts "私の#{key}は#{value}です"
end

このようにハッシュでeach文を作る場合はキーと値の二つの変数を渡すことを注意してください。

クラスの作成

最後にクラスの作成します。

class User
attr_accessor :name, :email
def initialize(attributes = {})
@name = attributes[:name]
@email = attributes[:email]
end
def formatted_email
"#{@name}>#{@email}"
end
end

attr_accessor・・・こちらはname,email属性(attributes)にそれぞれ対応したアクセサーを作成します。
次のinitializeメソッドは新たにインスタンスを作成した時に自動で呼び出されるメソッドです。
attributesのそれぞれのキーに対応する値を@name,@email変数に代入します。
変数の頭に@を付けることでビューでも使用可能になります。

最後のformatted_emailは式展開が使われていますね。

今日は以上です。
最後まで見てくださった方々ありがとうございました。

 

サブクエリ、JOINについてまとめてみた

サブクエリ、JOINについてまとめてみようと思います。

では、サブクエリの説明から。
例としてa君より身長の高い子を取得しようと思います。

前回やったので簡単ですよね。

select height
from class
where name = "a君
;
select name
from class
where height >= a君の身長
;

これで取り出し可能ですね。

でも、sql文2個も書くなんて面倒くさくありませんか???

実はこれ一つにまとめることができるんです。
それがサブクエリなのです。

select name
from class
where height > (
select height
from class
where name = "a君"
);

このようになります。
()を使うことでサブクエリを使用することができます。
()内のsql文を行った後、外側のsql文が行われます。

次にJOINについて説明していきたいと思います。
joinとはテーブルの結合です。

classとは別にcountryテーブルも作り、classに入っている子にも新しくcountry_idを加えます。

出身国ごとに平均身長がどうなっているのか調べましょう。
2つのテーブルを繋げる場合、JOIN文を使います。

select avg(height)
from class
join country
on class.country_id = country.id
group by country.name
;

join文は結合するテーブルの指定を、on文はclassの外部キーとcountryの主キーを紐付けています。
外部キーで他のテーブルの主キーを指定することで紐付けが可能になります。

また、group byに置いてcountry.nameと書きましたが、「.name」とは何なのでしょうか。
今、classとcountryの二つのテーブルがあり両方にnameカラムが存在しますよね。
ですので、カラムの前にテーブル名を記述することによってどのテーブルのカラムかわかるようになるのです。

今回はこれで終わりです。
ありがとうございました。

sqlの初歩

sql文でデータを取り出す方法を書いていきたいと思います。

データベースの仕組み

データベースでは表のようなものでデータを管理していてその表をテーブルと言います。

例・・・最近買ったものを保存する購入テーブル、クラスの人の特徴を保存するクラステーブルなど

また、人間テーブルの中にも名前、身長などの様々な項目があります。その項目一つ一つをカラムと言います。

データを取り出すsql

sql文とはデータを取得するためにデータベースに送る命令文みたいなものです。
早速、紹介していこうと思います。
例として、クラスの人の名前を取得したい場合、

基本的には以下のような文で取り出します。

select name
from class
;

と、なります。

classテーブルからnameカラムを選択して指定していますね。

名前だけでなく生年月日も取得したい場合はどうしましょうか。

select文にカラムを追加しましょう。

select name,bloodtype
from class

と、なります。

では次にクラステーブルから「新宿に住んでいる子」だけ取り出したい場合はどうすれば良いでしょうか。
条件を指定する場合はwhereを使います。

select name
from class
where address = "新宿"
;

と、なります。
where カラム = 指定する条件 で絞り込むことができます。

また、取得した人数を数えたい時にはcountを使います。

select count(name)
from class
where address = "新宿"

では、次に身長160cm以上の人だけ取得したいとします。
その場合は比較演算子を使います。

select name
from class
where height >= 160
;

となります。

この取得したデータを高い順に並び替えたい時にはorder byを使います。

select name
from class
where height >= 160
order by height desc
;

と、なります。

ascは昇順、descは降順になります。

では、平均身長はどれくらいだろう?
そんな時は avgを使います。
avgはaverageの略です。

select avg(height)
from class

のようにします。

次に住所ごとに平均身長がどうなっているのか、調べましょう!!!
グループ分けにはgroup by を使います。

select avg(height),address
from class
group by address
;

となります。

group byを用いる場合、selectできるのはgroup byに指定しているカラムと集計関数のみなので注意しましょう。

次にグループ分けしたものから平均身長が170cm以上の地域を取り出しましょう。
グループ化したデータを更に絞り込みたい場合はhavingを使います。

select avg(height),address
from class
group by address
having 170 >= avg(height)
;

となります。

また、whereとhavingについてですが、whereはデータベース全てから絞り込む時、havingはグループ分けして更に絞り込む時に用います。

データを取得する流れとしては
from文で対象となるテーブルを参照
→where文で絞り込み
→group byで場合分けをし
→havingで更に絞り込みます。

長くなってしまったので、一旦終わりにします。
次回はサブクエリ、joinについて説明したいと思います。