チェリー本のまとめ コツコツと。。。
チェリー本のまとめ 2-1
rubyの基礎知識
文字列
数値
真偽値と条件分岐
メソッドの定義
rubyの基礎知識
まず、全てがオブジェクトとなっている
!? そもそもオブジェクトとは
オブジェクトとは、とても簡単に言うと、関連する変数(値)とメソッド(動作)をまとめて、そのまとまりに名前を付けたもの。関連する変数やメソッドを1つのオブジェクト内で宣言してまとめてしまうことで、管理しやすくするのがオブジェクト指向。
メソッドの呼び出しは「オブジェクト.メソッド(引数1, 引数2, ...)←ない場合は省略可」でできる
コメントは「#」で行う
変数やメソッド、クラスにつける名前を識別子といい、スネークケースで区切ることが多い。予約語は使うことができない。
!? 予約語とは
予約語とはあらかじめ意味が決まっている名前のこと、class,ifがこれに当たる。
変数の宣言と代入は「変数名 = 式や値」で同時に行う。
文字列
rubyで文字列を作る方法は「''」「""」のどちらかで囲う。「""」では式展開が使える。
どちらを使うべきか、はどちらでもいいらしい。企業によって決めれている場合もあるため社内規定に従うか、独学ならやりやすいやり方でいいと思います。
数値
数値は言葉の通りです。一応_を入れても無視されるので 100_000_000のようにわかりやすく区切りに使うといいかもしれません。
四則演算は「+」「-」「/」「*」で計算ができ、「%」で余り、「**」でべき乗が出せる。
真偽値と条件分岐
rubyでは真偽値は
falseまたはnilであれば偽
それ以外はすべて真
と言う性質がある。他の言語を知らないので、どう違うかがわかりません。。。
&&がかつ ||がまたわ でかつの方が優先順位が高い。
if文は
if 条件A # 条件Aが真だった場合の処理 elsif 条件B # 条件Bが真だった場合の処理 else # それ以外の条件の処理 end
と記述する。気をつけなければいけないのは、上から順に処理がされるため、条件Aが真だった場合、条件Bは実行されない。つまり、上の方に細かい条件を書く必要がある。
メソッドの定義
メソッドの定義は
def メソッド名(引数1, 引数2, ...) # 必要な処理 end
と記述する。
FizzBuzzプログラム
FizzBuzz問題という有名な問題があるらしい。
3で割り切れる引数を渡すとFizzをかえす
5で割り切れる引数を渡すとBuzzをかえす
15で割り切れる引数を渡すとFizz Buzzをかえす
それ以外の数値はその数値を文字列に変えてかえす
def fizz_buzz(n) if n % 3 == 0 && n % 5 == 0 "Fizz Buzz" elsif n % 3 == 0 "Fizz" elsif n % 5 == 0 "Buzz" else n.to_s end end # n = gets.chomp.to_i # fizz_buzz(n) 20.times do |i| i += 1 puts "#{i}: #{fizz_buzz(i)}" end
という感じになりました。
実際はtimesをつかわないように書いてあるけれど、せっかくなので使いました。
%を使い、余りが0の時に該当する文字列をかえすこと、また、15の時は最初に記述しないと、FizzかBuzzを返してしまうので注意。
まとめ
今日の進んだところは基礎の当たり前に近い内容だったかもしれない。でも、当たり前を当たり前にしない。
初心者だからこそ、こういうところを不器用でも言葉にしていく。
今日の学習
今日学んだこと 2021/01/14
学習項目
学習内容
オブジェクト指向
アプリケーションを作成するときに、登場する役割ごとに分けて実装する方針のこと設計思想の一つ
メリット
実装がしやすくなる
後からコードを改変するときも他のオブジェクトに影響しない
単一責任の原則
アプリケーションの設計を考える上で、必要となる決まりの1つ。
「1つのクラスは1つの振る舞いしか持たない」という原則の下設計をする。
正規表現
文字列の一部分を抽出・置換したり、文字列が制約を満たしているかを調べるための表現方法
例えば、
090-1234-5678
09012345678
はコンピューターは別物と認識するから、合わせるよう組み替えたりする技術
上のパターンでは
irb tel = '090-1234-5678' tel.gsub(/-/'')
でできる。
.subは何かを何かに置換したい時に使えるもので、
変数.sub(/置き換えたいもの/'取り替えるもの')
と記述する。.gsubは置き換えたいもの全てを対象にする。
例のものはハイフンを空白に置き換えるという意味になる。
パスワード等が問題なく入力できているか調べる方法
パスワードやメールアドレスこれらの字数制限や@の有無はPC上でどのように認識しているのか。
まず、与えられた文字列に対して、内容をチェックするmatchメソッドがある。
word = 'hello, world' word.match(/hello/) => #<MatchData "hello">
このように、match(/検索ワード/)でその文字列に検索ワードがあるかどうかを調べることができる。
その際にヒットしたワードはMatchDateという種類のオブジェクトで返される。
まあMatchDateに変換される感じかな、、、多分
これを使うことによって、文字列に何が入っているかを調べる。
表現方法のいくつか
[a-z] : aからzまでのどれかを指す
[\d] : 数字を指す
{n, m} : 少なくともn回多くてもm回を指す
i : 大文字、小文字を区別しない時に入れる
これらを使って、パスワードが満たしているかどうかを調べられる
password = '好きなパスワード' password.match(/[a-z\d]{8,16}/i) => MatchDate or nil
上記の書き方を日本語にすると、
aからzの英語、数字を含む、8文字から16文字の大文字小文字は両方入っていてもいいパスワード
になる
. : ハイフンやピリオドなど含めた全ての英数字を指す
+ : 直前の文字が1回以上の繰り返しを指す
これを組み合わせて、
.match(/@.+/)
とすると、@以降に1文字以上の繰り返し、つまり@以降に何かの文字がある
と言うことになる。
\A : 直後に置いた文字を文字列の先頭に持つことを指す
\z : 直後に置いた文字を文字列の末尾に持つことを指す
[ぁ-んァ-ヶ一-龥々] : あらゆる日本語に対応することを指す
?= : 直後に設定した文字でチェックをかけて、設定した文字が続く文字列が存在する場合を指す
* : 直前の1文字が0回以上続く場合を指す
.match(/\A([a-z.\d])+(@.+)+([?=com jp])\z/i)
組み合わせると、おそらくこう言うのもありのはず。
railsの基本概念
レールズには言わずもがなDRYの概念があり、同じ情報を繰り返し定義しないと言うものがある
それ以外にフレームワークの概念として、
CoCと言う概念があり、設定よりも規約を優先すると言うものがある。これは簡単に言うと、多分自分で何か設定するより、そもそもあるものを先に使いなさいと言う意味だと思います。
これにより、開発スピードが上がり質も担保できることや、規約は開発者同士の共通認識であるため可読性が向上するなどのメリットがある。
まとめ
railsの基礎概念やそもそものrubyの概念、今後使っていくであろう正規表現の技術と深いところに近づいてきた。ゆっくり、ゆっくりと自分のものにしていく。
今日の学習
今日学んだこと 2021/01/13
学習項目
レスポンシブデザイン ruby応用
学習内容
レスポンシブデザイン
レスポンシブデザインとはざっくりいうとPC、タブレット、スマホで表示するデザインを変えること。
画面の大きさが違うから、それに合わせないと見づらいから変えようって話ですね。特にPCは横長に対して、スマホって縦長だし。
方法は簡単で、CSSに
@media(max-length: 表示を変えたい長さ) { その大きさを指定する .img { width: 50%; } }
こんな感じに記述します。この@media.....のことをメディアクエリといい、表示を変えたい長さをブレークポイントという。
ruby応用
case文
まず、条件処理で一般的なものだと、if文がある。今日習ったのは、case文、書き方は
color = "red" case color when blue puts "進める" when "yellow" puts "危ない" when "red" puts "止まれ" else puts "???" end
というように、それぞれの状況に応じた処理で記述できる。実践だと、もしかしたら、ゲストユーザーor無料会員ユーザーor有料会員ユーザーの時とかの処理で使えそうとうという印象でした。
繰り返し処理
繰り返し処理だと、今まででは、eachやtimesを習っていたが、今日は新しく、whileを学んだ。
while 条件式 # 条件が真である時に繰り返す処理 end
と書き、これの条件式を繰り返す処理と合わないものにすると無限ループが起こる。例えば
number = 0 while number == -1 puts number number += 1 end
これだと、数は永遠に-1になることはないため、常に処理が行われるというループに陥る。実践でのイメージはつかないが使えるようにしておく。
抜け出す方法としては、breakを記述しておくことで、処理を止めることができる。
number = 0 while number == -1 if number == 100 break end puts number number += 1 end
クラスの継承
クラスは継承することができ、継承することで元の性質を引き継ぐことができる
class 子クラス < 親クラス end
タスクの実装
Rakeタスクと呼ばれる、タスクを簡単に実行できるrubyツールがある。これは、railsにも組み込まれている。
タスクの生成
# Rakeタスク用のRakeファイルを作成
% rails g task タスクファイル名
これで、lib/tasks/ディレクトリにタスクファイル名.rakeというファイルが作成される。
また、environmentメソッドを記載することで、アプリケーション環境(今回はrails)に依存した処理を記載することができる。
namespace :ここにグループ名を記述する do desc "ここに処理の説明を記述する" task タスク名: :environment do ここに実際のタスクを記述する end end end
呼び出し方
# Rakeタスクの実行 % rails namespaceの名前:taskの名前
例外処理
期待しない結果が起こった時に、どのような処理をするのかを決めることができるのが例外処理になる。期待しない結果は主にエラーが起こった時のことを言うが、基本はエラーが起こった時はその時点で処理が止まる。
しかし、処理が止まることで困ることがある場合、例外処理を実装する。
基本的には
①例外が起こった後、その処理だけ別の処理をして、元の処理に戻る場合と
②例外が起こった後、その処理だけ別の処理をして、元の処理自体を全て無効にして中止する場合
の二つのパターンがある。
つまり
通常
11111111111(エラー)00000000000となるが
①
1111111111(エラー→別の処理)1111111111
②
1111111111(エラー→別の処理→最初の処理もリセット)
と言うようなイメージ
元の処理に戻る場合
begin # 想定される例外 rescue # 例外が発生した時にrescue以下の処理が呼ばれる end
のようにbeginで例外が起こると想定される処理を書き、rescueで例外が起こった後に行われる処理を書く。 また、raiseを使うことによって意図的にエラーを発生させることができる。
raise 発生させたい例外クラス, 'エラーメッセージ'
元の処理も全て無効にする場合
ActiveRecord::Base.transaction do # 処理1 # 処理2 # ... end
のようにトランザクションを利用する。
まとめ
今日の学習
今日学んだこと 2021/01/10
学習項目
画像のアップロード方法
学習内容
通常何もしない場合、画像はurlを入れて、任意の画像を表示できる。
自分のファイルにある画像を送る方法を学んだので、まとめていく。
まず、rails でファイルのアップロードができるgemはActive Storageで元々はインストールがが必要だっだらしいが、現在は必要ない。
画像に加工できるツール、gemのインストールを行う必要があり、
ImageMagick: コマンドラインから画像に処理を加えることができるツール
MiniMagick: ImageMagickの機能をRubyで扱えるようにしてくれるGem
ImageProcessing: MiniMagickでは提供できない、画像サイズを調整する機能を提供するGem
をそれぞれ、インストールする。
brew install imagemagick
MiniMagick、ImageProcessing はそれぞれ、Gemfileに記述
gem 'mini_magick' gem 'image_processing', '~> 1.2'
bundle install
その後、Active Storageのインストールし、マイグレーションファイルができるので、マイグレートする
rails active_storage:install rails db:migrate
保存したい、モデルとファイルを紐付ける
class モデル < ApplicationRecord has_one_attached :ファイル名 end
画像の表示は image_tag を使う
# ファイルをモデルから指定する場合 <%= image_tag モデル.画像ファイル %> <%= image_tag sample.image %> # app/assets/ディレクトリ下の画像ファイルパスでも指定できる <%= image_tag 画像ファイルのパス %> <%= image_tag "image.png" %> # 以下の記述で、画像が無い場合、表示しないようにできる <%= image_tag sample.image, if message.image.attached? %>
画像の加工は variantメソッド を使う
モデル.ファイル名.variant(resize: '幅x高さ')
まとめ
画像を送る手順を覚えれば、インスタも夢じゃない!!
今日の学習
今日学んだこと 2021/01/06
学習項目
deviseの復習とフロントページの実装
学習内容
今日は新規で学んだことはないんだよね。書くのやめようかと思ったけど、日記だしこういうのってとりあえず書く習慣をつけないと大事なこと書けないと思うので。
フロントページの実装では内容はわかるけど、模範解答と比べるとクラス名がダサかったり、階層が足りなかったりした。発想が足りなかったり、穴が多いなと感じた瞬間でした。
ユーザー管理ページではdeviseがやはりわかりきってない。導入は問題ないが、値の取得の書き方とか細かいところが甘いと思った。数だと思うから。回数重ねるしかないかな。
あと、link_toの書き方が咄嗟だとわからないこととか知識がついているとは思うけど、中途半端なのが悔しい。知識の身につき方が、、、大丈夫なのかなって少し不安になります。3歩進んで二歩下がってる感じかな。
文字にしたことで、少しは整理できただろうか。一歩は進んでる。ゆっくり頑張ろう。うん。大丈夫。
まとめ
気持ちの整理も、言葉にすることも、日記に書くこともきっとどれも大切だと思いました(^ ^)
今日の学習
今日学んだこと 2021/01/04
学習項目
データベース設計
学習内容
今後カリキュラムで作るアプリのデータベースの設計を行った。
今後解説があるとは思うが、自分でも考えることで、今後につなげていく。
特に今回の設計では中間テーブルというのが鍵を握る。
基本的にはデータベースのアソシエーションは1対多又は多対1で作る。
しかし、多対多の条件が発生する場合がある。
例えば、インスタのタグの機能も、一つのツイートや記事に対して多くつけることができるし、タグ自体も記事に多く結びついている。
そういった時は中間に一つ振り分けるデータベースを作り、どの記事がどのダグと結びついているか判断する。
そうすることで、中間テーブルを挟んで、1対多の関係を作ることができる。
まとめ
1対多を作るための発想と工夫がすごい