20210418_アウトプット(docker・php)

アウトプット画像

やったこと

4/14
  • dockerとは?(1時間)
4/15
  • SPI(1時間)
4/16
  • SPI(1時間半)
  • EC担当者の知識と業務(1時間)
4/17
  • EC担当者の知識と業務読了(11時間)
4/18
  • EC担当者の知識と業務、最終まとめ(2時間)
  • 初めてのphp第2章まで(4時間)


1%の成長

  • EC担当者の知識と業務を読んだことで、普段Amazon楽天の利用者でしかなかったが、出店者側の視点を持てたこと。
  • php楽しみながら学べたこと。


新しい発見

dockerとは?

  • dockerとは、アプリケーションに必要なLinuxファイルシステムをdockerイメージとしてパッケージ化してコンテナとして動かすもの。
  • dockerコンテナとして実行するには、dockerイメージが必要。
  • コンテナは特別な状態のプロセスで、Linuxカーネルのさまざまな名前空間を分離し起動するもの。(CentOSカーネルは共通で、その上に各コンテナを作成する)
  • dockerイメージはイメージレイヤーの積み重ね。
  • 各イメージレイヤーの中に「ファイルシステム」と「メタ情報(データの位置)」を含む。
  • イメージレイヤーは親子関係。
  • 複数のレイヤー上のファイルやディレクトリが一つに見える。
  • コンテナ実行でプログラムを実行する際には、dockerイメージの上に新しく読み書き可能なレイヤーが乗っかっている。なので、読み書き以外の部分を派生できるので素早く起動できる。



php

CGIとは?
  • Common Gateway Interfaceの略。
  • 下記の佐々木さんの記事がとってもわかりやすかった!
  • CGIとは、Webサーバー上における動的なプログラムを返せる仕組みのこと。
  • phpであれば「今日の日付」とか「合計の人数」とか、クライアントからのリクエストに対し、その都度、処理をして返すことができるがその仕組みのことと理解。
  • スーパーにある🍣お寿司🍣の内容は変えることはできないけれど、その場で握ってくれる🍣お寿司🍣であればワサビなどの量を調整できる=その仕組みがCGIというのがとってもわかりやすかった◎

https://wa3.i-3-i.info/word112.html

printf()関数とは?
  • printf()関数は、出力項目を渡し、その内容について出力形式を指定して表示できるもの。
  • 渡す出力項目は、計算式でもOK。
  • 変換指定子はたくさんある。(下記は一部)
名前 指定子 説明
符合指定子 +,- 数値にプラスまたはマイナスの記号をつけることを指定
パディング指定子 0,空白 表示幅指定子を満たすためにこの文字を使って幅を埋める 0または空白以外の文字で埋めたい場合はシングルクォートとともにその文字を指定
表示幅指定子 数字 結果を最低何桁にするかを指定
型指定子 f 浮動小数点として扱い、小数点つきの10進数表記にする
型指定子 d 10進数
型指定子 s 文字列


<?php
$price = 5; $tax = 0.075;
printf('The dish costs $%.2f', $price * (1 + $tax));
👇出力結果👇
The dish costs $5.38
<?php
$price = 5
$tax = 0.33
printf( 'Total costs $%.1f', $price * $tax );
👇出力結果👇
Total costs $1.7
  • 上記のポイントは、端数が出る場合、指定された小数点以下の部分で四捨五入して表示されること。
  • 具体的には、5✖️ 0.33は1.65となるが、小数点第2位が「5」なので、四捨五入されて1.7と出力される。
<?php
$hamburger = 4.95;
printf("%d %-9s at \$%.2f\n each: \$%5.2f\n", 2,'Hamburger', $hamburger, 2 * $hamburger);
👇出力結果👇
2 Hamburger at $4.95
 each: $ 9.90

感想

  • SPIについて、Youtubeの桐生さんの動画を見ながら勉強してた。めちゃくちゃ分かりやすくてこんな面白いんだと気づけた。
  • プログラミングの勉強始める前は、力づくで解くことに「まあいいか」と感じてしまっていたけれど、SPI勉強するたびに「これ何とかならないのかな」と思っていた。
  • そしたら、色々コツがあるんだということを知って、もっと早く知っていればー!!と思った。
  • 数学も苦手意識だったけれど、「楽しさ」からはじめたらもっと違って見えていたかもしれない。プログラミングのおかげで難しい概念に対する免疫がついたので(笑)いろんなことに対して学び続けることが楽しいと思えるようになったなとSPIしながら感じた。
  • dockerについて、概念はわかったけれど、コード見ながらもっと具体的に学ぶ必要があると感じた。開発者の環境を統一できることは、開発を進める上ですごい便利な技術・・どうやって思いついたんだろう。
  • 最近、瞑想を続けられている◎今日は、散歩がてら外で技術書を読んだり、花を買って帰ったり、運動したりした。
  • メリハリも大事にしよう。今日みたいな「ひたすら楽し〜」と思って学ぶ時間を増やせるための努力をしよう。
  • 最近、仕事が残業続いている。忙しい時期でも、何か新しいことをなんだかんだずっと学んでいるのが楽しい。これを仕事に出来るように(転職できるように)乗り切ろう!!

20210412・13_アウトプット(Ruby・css・symphony)

アウトプット画像

やったこと

4/12
4/13


1%の成長

  • 前ほど、環境構築に対して抵抗(うっ・・・難しそう・・・という感情)が無くなった気がする!RubyRailsのバージョンアップ、PHPの環境構築と通して「これで合ってるのかな?」と思いつつも動く嬉しさを学べたからかな。
  • 反対にやりたかったけれど出来てなかった技術(ポスグレ・docker・環境構築の練習など)にトライ出来ることが嬉しい。


新しい発見

Rubyのモジュールについて

名前空間について
  • クラス名や変数名が重複していると、前者は後者に記述した内容へ上書きされる。
  • 上書きせずに、別々のものとして扱えるようにするのが名前空間
  • モジュールで定義されている部品(定数)を、クラス名は同じでもモジュールごとに振る舞うことができる。
  • その場合はモジュール名::クラス名で部品(定数)を使えるようになる。



CSS初級:学ぶこと

  • CSSを使うとどんなことができるの? 👉デザイン設定ができる。
  • CSSってどうやって書くの? 👉セレクタ{プロパティ:値}
  • セレクタ?プロパティ?値? 👉セレクタ:どこを変える? プロパティ:何を変える? 値:どんなふうに?
サルワカ(STEP4まで)

Webサイトの仕組みは?Webページの作成〜公開までの流れ

  • 「インターネット」とは?:コンピュータ同士の情報をやりとりする仕組み
  • 見ているものが「Web」。その他にもメール転送や、ファイル転送などもあるよ!
  • Webサーバーとは?:Web上で情報を公開しているソフトウェアコンピュータのこと。
  • Webサーバーからきた情報はコンピュータ向け語だけれど、「ブラウザ」によって人間向け言語にしてくれる。
読み方間違えていたところ

今さら聞けない!読みづらいCSSプロパティの正しい読み方

  • height (ハイト)🛫
  • visibility(ビジビリティ)⚡️
  • hidden(ヒドゥン)
  • border-collapse(コラプス)
  • background-origin(オルジン、オールジン)💇‍♂️
  • border-radius(レイディアス)🙇‍♀️
  • rgba(アールジービーエー)
  • text-emphasis(えんぱしす)
いまいち理解していなかったCSSのリセット

何がいい?リセット、ノーマライズ、サニタイズ、デフォルトCSSを解説 | JAJAAAN

名前 内容
リセットCSS 全てのHTMLタグをリセット 💡一からビューを作るときにおすすめ
ノーマライズCSS ブラウザ間の差異を調整する 💡これでいるところだけにするのがおすすめ
サニタイズCSS ノーマライズCSSの拡張版 より実用的に
(日報より学んだ)最近の主流

CSSセレクタに、「HTMLタグ」は使わず、「class指定」するようにしている。 なぜならば、「divからliに変更した」というような場合でも変更しなくて済むため。 補足:class属性とは、開始タグ内に書く属性の1つ。どのタグにも使える。<タグ名 class=”好きな名前”> (へー!😲メンテしやすいCSSを学びたいので知れて嬉しい。)

(日報より学んだ)inputタグにおけるfont-size

Chrome独自の仕様で、ボタンとしての見た目を変えるために、ボタンの背景やボーダーをいじった場合のみフォントサイズは変えられる。 理由としては、CSSのミスでユーザーがボタンを押せないことを防いだり、見た目でユーザーがボタンを使えないことを防ぐためと考えられる。 (フォントサイズ変えられないの知らなかった!😲)



symphonyに着手

symfony.com

環境構築

lets.postgresql.jp

上記を見ながらポスグレはインストール出来たんだけど、その際にdockerも必要とある。
うろ覚えな知識だけど、dockerって、「カーネルと呼ばれるハードウェアとソフトウェアを繋げる中核部分とOS」は共通でその上にソフトウェアを導入すると理解している。
なので、ポスグレをMacOS本体にインストールしたが、ポスグレ付きdockerを導入した方がいいのではないか?!という疑問も生まれた。
また明日調べてみよう!!


感想

  • 久しぶりのフィヨルドさんの学習となってしまった🙇‍♀️
  • Webサーバは「ソフトウェア含む」ことが曖昧だったので復習できてよかった。
  • CSS学習の目的は、サーバーサイドの実装をするときに、どうやったらフロントサイドの方にとってやりやすい実装に出来るだろうか?と理解すること。
  • なぜならば、オリジナルアプリを作った時に、ついどんどんその場の見た目修正のためにcssセレクタを追加してしまい、メンテしづらくなってしまった・・と後悔したため。
  • symphonyのチュートリアルも今の自分にとってチャレンジなものなので楽しそうだと思った。頑張ろう。

20210411_アウトプット(Ruby、Rails、php)

アウトプット画像

先週やっていたこと

  • 4/5:Rubyモジュールの続き

  • 4/6:SPI/Rails🌸@task = Task.newを見た時にここでクラスを生成しているのか!とRubyで学んだことが繋がった。

  • 4/7:PHP🌸パーフェクトPHPの49ページまで

  • 4/8:PHP/志望動機🌸パーフェクトPHPの63ページまで

  • 4/9:Rails/志望動機🌸Slimのビューの場合、表示される場合はイコールを、させたくない時はハイフンで行を始める。

  • 4/10:PHP🌸初めてのPHPの8ページまで/プログラミングアカデミー(おさないさん)のYoutube/phpconfuk2016 PHP7で堅牢なコードを書く(和田卓人さん)の動画をみた

  • 4/11:PHP🌸MAMPの導入/プログラミングアカデミー(おさないさん)のYoutube/ブログによるアウトプット


1%の成長

  • phpのことを楽しみながら学び始めた。
  • Rubyのことをしっかりやった部分がphpを学ぶうえでも差分がわかりやすいことを実感した。


新しい発見

RubyRails

  • rails s -p 3001-pオブションでポート番号を指定することが出来ること。

  • stringやtextという型はリレーショナルデータベースが用意しているデータ型そのものではなく、Railsがリレーショナルデータベース毎の際を吸収した抽象的な型として用意している概念であると知らなかった。Railsが用意している型が実際に使うリレーショナルデータベースのデータ型にマッピング(関連づけ)される💡

PHP

パーフェクトPHPから学んだこと

  • Zend Engine(ゼンドエンジン)って何?:機械語へと解析・実行するためのエンジン。
  • php.ini(イニ)って何?:phpを動かすためのプログラムの設定ファイル。(ここにこういう部品が入っているからね、エラーが起きたらこうして!等が書いてある)
  • phpは「人間が作ったphpの文字が書いてあるコード」「実際に動かすためのコード」「動け!という命令」によって、成り立つと理解。
  • もう少し具体的にいうと、

(1)PHPプログラムがある。
(2)レキサーで、トークンと呼ばれる”ネットワーク上でデータを送信できる権利機能が入った特殊なデータ”となるようバラバラにする。
(3)パーサーでコンピュータが直接実行できる形に近くした”オペコード”と呼ばれる中間コードへ変換する
(4)実行マシンで実行!

  • モジュールとは、Webサーバの機能の一部として実行すること。その一つがApache
  • var_dump関数とは?:使われている型が何かわかる関数。デバッグに使える。
  • 大きく3つのエラーがある。(ざっくりレベル)
エラー 簡単な内容
パースエラー等 シンタックスエラー。オペコードに変換できないからファイルを読み込まないよ!
Fatal Error(フェータルエラー)等 致命的なエラー。メモリが足りてない、定義されてない関数を呼び出そうとしている等
WarningやNotice等 実行は継続するが警告
  • error_reporting()関数によって、出力するエラーレベルを設定できる。
  • ini_set()関数によって、実行時の設定をできる。
  • display_errorsはエラーを表示するか否か設定できる。
  • ini_set('display_errors', 'On';)というように、ini_set()関数display_errorsを組み合わせて使える。

  • isset()関数によって、変数にセットされているかチェックできる。(trueかfalseで値を返す)

  • phpにおけるスコープの概念は、phpブロック内→グローバル変数、関数・メソッド・クラス内→ローカル変数(外に出したい時はglobalつける)
  • phpの変数には「変更不可能な変数はない」ため、うっかり定数を変更しないように注意!
  • マジック定数とは「今いる〇〇」を表現できる定数のこと。(今のフルパスはここだよ__FILE__、今のpwdはこれだよ__DIR__など)

  • エラーの重要度

重要度 エラー名 内容
高い E_PARSE シンタックスエラー(ファイルが実行されることなく終了)
E_ERROR 致命的なエラー(エラーが発生した時点で終了)
E_WARNING 実行時の警告(警告が発生しても実行は継続するが直して!実行した結果、処理進めないことも。)
E_NOTICE 実行時の警告(警告を発生しつつも自動的に対処を施す)
E_DEPRECATED 非推奨(実際に廃止されるまでは動くけど直そうね)
低い E_STRICT 厳格(変更した方が望ましい記述。コンパイル時に発生することも多い。)
  • ユーザーエラー(開発者が自分で作れるエラー)
  • エラーに関する設定は、開発環境では全てのエラー、本番環境では厳格と非推奨以外を表示させるなど、開発環境によって設定するといい。
  • キャストとは型変換。
  • スカラー型とは、phpにおけるよく使う型たちのこと。論理値(boolean)、整数(integer)、浮動小数点数 (float, double)、文字列 (string)の4つを指す。
  • ヒアドキュメントとは、文字列(ベタ文字)をソースコード内に埋め込むための手法の一つ。

brewによる導入

  • brewPHPの導入を行ったが、その後、XMAPPかMAMPで導入した方がデータベースとの連携の環境構築が楽なことを学んだ。
~ % brew search php
~ % brew install php@7.4 
~ % brew reinstall git-secrets

PHPの基礎

🤔私:PHPで出来ることは?
🥸先生:PHPの機能を使って自動的に更新する日時などを作成し(HTMLに変換したものを)ブラウザに表示させたり、(PHPは覚えることが苦手だから)覚えることはデータベースにお願いして、データベースから必要な情報を持ってきて調整・表示するよ。

環境構築

🤔私:PHPを導入するにはにあたり環境構築をするけれど、そもそも「環境構築」とはどういう意味?
🥸先生:コンピュータが理解できる機械語に変換するために、必要な諸々のファイルを自分のコンピュータへインストールして、その場所をコンピュータへ知らせて、開発できる環境を整えることだよ。
🤔私:PHPの環境開発を整えるには、どんなものが必要なの?
🥸先生:Webサーバー用のソフトウェアと、アプリケーションサーバー用のソフトウェアと、データーベース用のソフトウェアの3点セットが必要だよ。それぞれインストールするのは大変だからphpにはおまとめセットがあるんだ。

おまとめセット名 内容 備考
XMAPP(ザンプ) ApacheMariaDBPHPPerl 最初のXはクロスプラットフォームWindowsMacOSなど異なるプラットフォームでもOKだよという意味)
MAMP(マンプ) ApacheMySQLPHP 最初のMはMacintoshマッキントッシュというApple社が最初に開発したパソコン。最初はMac専用に作られた。)

アプリケーションサーバー用のソフトウェアはどこ?と思ったが、Apacheが兼ねてくれていることを初めて知った。(↓参考になったサイト)

www.sejuku.net

🤔私:そもそもサーバーってなに?
🥸先生:サーバーとは、いつ何時にアクセスしても大丈夫なように待機するコンピュータのことを指すよ。例えばGoogleで検索したいと思った時にいつでも検索できるのはサーバーというリクエストを待っていてくれる存在がいるからなんだ。

🥸先生:Webサーバー用のソフトウェアは、いつでもアクセスした時にブラウザが読める言語(HTML・CSSJavaScriptなど)状態に変換するものあり、アプリケーションサーバー用のソフトウェアはいつでもアクセスした時にデータベースとやりとりをするものだよ。

実際にMAMPをインストール

MAMPにした。以下を参考にしながらインストール。(↓)

qiita.com

  • /Applications/MAMP/htdocs配下にあるファイルがhttp://localhost/上に表示されると理解。

  • /Applications/MAMP/conf/php7.4.12/php.inidate.timezoneを東京に設定。

和田卓人さんの動画を見た

youtu.be

  • 予防に勝る防御なし:そもそも、誤りが発生しないようなプログラミングスタイルを。
  • fail fast:障害を抱えて中途半端に動いているプログラムよりも死んだプログラムの方がダメージは少ない。
  • バグと例外を区別しさらに誰の責任かも見分けられるようにする。

(補足)

  • ここでいう契約とは?あなたが事前条件を満たした状態で呼ぶと約束するなら、お返しに事後条件を満たす状態で最終的に実現することをお約束するということ。
  • 失敗がバグなのか例外なのか切り分けて見極めて。(コード自体に誤りがあって)必ず失敗するものがバグ。(外部要因によって)たまに失敗するものが例外。さらに誰の責任かも見分けられるようにする。
  • 事前条件違反は呼び出し側にバグが証拠である。事後条件違反は供給者側にバグがある証拠である。


賢明なソフトウェアになるための第一歩は、動くプログラムを書くことと正しいプログラムを適切に作成することの違いを認識すること。


  • 心に残った言葉「正しいプログラムとは、要求された以上のことも、それ以下のことも行わない」
  • なぜ見ようと思ったか?:仕組みを作る上で堅牢なコードをかきたいため。phpについて始めたばかりで詳しい技術の部分はわからないかもしれないが、尊敬する人がどういう視点でエラーや関数などを定義して、設計しているのかを知りたかった。その視点の部分を感じながら、今後のphpの勉強を進めたら「ここはあの時に言っていた必要な知識だ!!」と知識の必要性を身近に感じられると思ったため。
  • 具体的に「この知識重点的に学びたい」と感じた部分は、
    (1)プログラムにおいて型がめちゃくちゃ大事であること(誤っているとバグの温床になる)→型宣言や、どのように型を定義するのかを理解しようと思った。
    (2)誤りが判明した時点でストップする仕組みの方が(気付くのが早ければ早いほど)傷は浅くなること→食い違っていることをすぐに気付けるエラーの出し方はどうやるんだろう。ちょろっと学んだエラーファイルの出し方が活きて来るのかな?システムをストップさせるわけにも行かないだろうし、開発環境と本番環境で、設定する方法や知識をもっと学びたい。
    (3)お互いを信頼して定義したり呼び出す方法→変数や関数に定義するとき、処理を呼び出したりするとき、どこまでの責任をどの部分に持たせるのか知りたいな。これは経験がものをいうのかもしれないけれど、ただ定義するだけでなくて、どういう影響を全体に及ぼすかも考えながら学びたい。
  • 心に残った言葉「正しいプログラムとは、要求された以上のことも、それ以下のことも行わない」→気を回してやらないことも大事だし、もちろん満たしていないものもだめ。ピタッと必要なプログラムだけを書けるようになるためには全体の構造を理解していて、その上でその部分に適した必要な部分のコードの輪郭をはっきりさせる鍛錬を常日頃しているからこそかけると感じた。この考え方、素晴らしいなあ。目指す一つの思考になった。


感想

  • 先週の反省として「全部頑張ろう」と思ってしまった。
  • アウトプットも時間がないから、戦略を変えてブログではなくペラペラ独り言で誰かに説明するように話したり、本に書き込むアウトプット方法を試していたが、心のどこかで「ブログせっかく今まで更新してたのにな」と思っていたりもした。
  • 土曜日は久しぶりに実家のポメ🐶に会えた。プログラミング以外の息抜きをしたのは12月17日以来だった。それまで会社以外の時間は、毎日ただひたすら勉強してた。
  • 実家に帰った時に「本当は家族に会いたかった」気持ちが溢れてきて、泣けてきた(笑)頑張りすぎていたのかもしれない。
  • 仕組みを作れるようになりたい。そのためにはエンジニアになりたい。エンジニアになってからが本番だけれどもまずは就職したい。と張り詰めすぎてたのかもしれない。
  • リフレッシュしたおかげでまた前向きな気持ちになれた。
  • phpも、楽しい。Rubyの環境構築の時、訳もわからずインストールしていたが、「ApacheがWebサーバーとアプリケーションサーバーの役割を担ってくれているおかげでブラウザに反映されるのか」とか2つ目の言語を学び始めたことによって「暗黙の型変換という概念があり、言語によって型変換の強制具合違うんだ」とか、新しい学びがあって本当に楽しい。
  • 新しい技術を覚えようとするとき、遠回りかもしれないけど、本や動画ネットなど様々な媒体で多角的に見る方法が好き。本の言葉だけで理解していたものが、他の媒体で見るとどこが重要とか、本質の捉え方違ったとか気付けるため。時間はかかるかもしれないが、色んな媒体で調べた知識は結構、その後の記憶に残っている気がする。
  • 楽しむところだけ抜き取って、プレッシャーとか焦りとか感じないで集中するのが自分は苦手だと気づけた。できる方法を模索しよう。マルチタスクが苦手な自分を受け入れよう。シングルタスクで切り替え上手な力を身につけたい。

20210406_アウトプット(Ruby)

アウトプット画像

やったこと

  • 志望動機をじっくり考える(4/5)

  • ゼロからわかるRuby超入門の続き(9:モジュール)

1%の成長

  • モジュールについて理解が深まった
  • 企業の求めていることは何かと、自分が貢献できることについて考えている(途中)

新しく学んだこと

モジュール

🤔私:モジュールって何?
🥸先生:メソッドを共同で利用できるようにすることだよ。

(1)モジュールを作る

module モジュール名
end

(2)メソッドを定義する

module モジュール名
 def モジュールのメソッド
  foo
 end
end

(3)クラスで使えるようにする

class Drink
  include モジュール名
 # 省略 クラス内の定義
end

⚠️インスタンメソッドの場合はincludeだけど、クラスメソッドにしたい場合はextendにする。

上記の3つの手順でモジュールは活用する💡

🤔私:クラスと何が違うの?違いがよくわからない。
🥸先生:下記のようなポイントがあるよ。モジュールは主にメソッドを部品として使うことが目的なんだ。

モジュールのポイント
インスタンスを作ることは出来ない(引数や戻り値はOK!)
複数のクラスで何度も部品(メソッド)として使える
クラス継承のポイントである「子は親の一部です」が通じなくてもモジュールは使える
Enumerable(イニューメラブル)モジュール
  • インクルードするクラスには each が定義されていると、便利なイミューメラブルメソッドを使えるよ。

😊私:つまり、自分でクラスを定義した時に、eachメソッドを定義すると、enumerableをインクルードしてメソッド群を使えるってことだね。

docs.ruby-lang.org



  感想

  • クラスを理解した後に、モジュールの概念をもう一度学んだら、違いがより明確に理解できた。モジュールはメソッドのパーツだったのか。(インスタンスを生成できない、という意味がようやくスッキリ。やっぱりクラスがひっかかっていたのか。)
  • 日頃の勉強と同じくらい、行きたい企業について向き合うことも大事だと思っていて、時間の使い分けが難しい。ついつい企業のこと調べているとワクワクしてきて時間が経ってしまう。
  • あと寝不足になるとドライアイが辛くなる😭早めに寝よう💦

20210404_アウトプット(Ruby)

アウトプット画像

今日やったこと

  • ゼロからわかるRuby超入門の続き(7:メソッド〜8:クラスまで)8時間50分

1%の成長

  • ようやくモヤモヤしていたRubyのクラスと向き合えた

新しく学んだこと

メソッド

putsがメソッド内にある時と外にある時の違い

  • メソッド内にある時・・・表示させることもメソッドの仕事の一つとしている。
  • メソッド外にある時・・・処理と表示は別にしており、表示結果を配列や変数にして別のところで使うこともできる。

💡 つまり、外に「表示させる」ことを持ってくると、利用範囲が広がる。


おさらい 戻り値と引数
  • 戻り値とは? 呼び出し元へオブジェクトを返す
  • 引数とは? メソッドへオブジェクトを渡す
  • returnを使わない限り、最後の値が戻り値となる。


引数の便利な機能

キーワード引数

引数が2つ以上になったときは、キーワード引数を検討しよう!

  • キーワード引数のメリットは、大きく2つある。
    (1)引数の渡す順番が異なっていてもシンボルを手がかりに、きちんとオブジェクトが渡されること
    (2)ラベルのようになるので可読性が上がること
def order(item:, size:)
  "#{item}#{size}サイズでください"
end

puts order(item: "ポテト", size: "大盛り")
#=>  ポテトを大盛りサイズでください


デフォルト値の設定
  • 通常はイコールで代入。
  • シンボルの時だけ、キーと値のように書く。
  • デフォルト値を設定すると、ラベルを探しに行くので、引数の順番がメソッドと呼び出し側で異なっていても適切に渡すことが出来るよ。
def order(item = "ハンバーガー")
    "#{item}をください"
end

puts order
#=> ハンバーガーをください
#💡引数を省略するとデフォルト値が適用
def order(item:, size: "普通")
  "#{item}#{size}サイズでください"
end

puts order(item: "ポテト")
#=>  ポテトを普通サイズでください
#💡:sizeを省略したところ、デフォルト値の「普通」が適用となり、引数エラーとならない。


スコープとは?(おさらい)

  • 変数の見ることのできる範囲と、寿命のこと
  • ローカル変数は、メソッド内でしか使うことが出来ない(外から呼び出したり、中のものを外で使えない)

クラスとは?(おさらい)

  • クラスは工場。クラス自身が仕事をすることもあれば、そこから生まれたオブジェクトが仕事をすることもある
  • 新しいクラスを作ることは、新しい特徴をもったキャラクター(プログラムの世界ではオブジェクト)を作ることができる。
  • クラス名はキャメルケースにする。(=定数でもある)
  • Methodsメソッドとは、そのオブジェクトで呼び出せるメソッドを一覧表示することが出来る。レシーバ.methods



クラスを理解しよう!!!

🤔私:「超入門」からやり直したのもクラスに苦手意識があったからなんだ。どのオブジェクトもクラスに属していることはわかっているんだけど、オリジナルのクラスを組み立てるルールがいまいちわからないよ。
🥸先生:具体的に、どのようなルールが分からなかったの?
🤔私:attr_accessorを使ったり使わなかったり、引数渡したはずなのにエラーになってしまったり、いまいちふわっとした理解で書けないんだよね。
🥸先生:超入門本から基礎をしっかり理解しよう。

超入門本からこんなふうに理解した!

前提知識
  • Rubyは全てがオブジェクトであり、何かしらのクラスに所属している。
  • クラス.newで、クラスがインスタンスとして生成される。
  • レシーバとは、メソッドを使って呼び出されるオブジェクトの中身のこと。(例えば、2.even?では2の「整数オブジェクト」がレシーバであるし、["ポメ", "ペキニーズ"].sizeでは、["ポメ", "ペキニーズ"]の「配列オブジェクト」がレシーバである)
今日理解したこと

クラスの中身を作るにあたって、目的が大きく4つあると理解。

目的 内容 ポイント コード例
ただのローカル変数等を呼ぶため そのままの文字列や渡された引数をシンプルに式展開する等 異なる動作は出来ない
インスタンス変数とするため ゲッターやセッター(あるいはattr_accessor)を使い変数を取得・代入する インスタンス毎に異なる動作が出来る/代入されて実行されることで初めてインスタンスとなる/複数のメソッドを跨いで使える
イニシャライズメソッドとするため newメソッドでクラスを生成時に引数で渡すことによって、生成時に持っていて欲しいデータを設定する 引数として届くことが他のメソッドと違う点
クラスメソッドとするため クラス全体を呼び出される中身として表示する クラスが実行するのでオブジェクトを作ることなく呼び出すことが出来る(全体の振る舞い)
ただのローカル変数等を呼ぶため①
class Drink
  def order(name)
    puts "#{name}をください"
  end
end

drink = Drink.new
drink.order("お茶")

#=> お茶をください


インスタンス変数とするため②
class Drink
  def name=(text) #🌟インスタンス変数へ代入している(👈attr_writer :name)
    @name = text
  end
  def name #🌟インスタンス変数を外から取得出来るようにする(👈attr_reader :name)
    @name
  end
end

drink = Drink.new
drink.name= "お茶"  #💡代入している。「drink.name = "お茶"」でも可。
puts drink.name

#=> お茶
  • ゲッターとセッターはattr_accessor :nameと一つにすることが出来る。


イニシャライズメソッドとするため③
class Drink
  def initialize(name)
    @name = name
  end
  def name
    @name
  end
end

drink = Drink.new("牛乳")
puts drink.name

#=> 牛乳
  • newメソッドへ渡す値を帰ると、色々なDrinkオブジェクトを作れる。
  • 外から呼び出すには、参照用のメソッドを上記のように定義するか、アクセサメソッドが必要である。(ようやく繋がった・・・)


クラスメソッドとするため④
class Cafe
  def self.welcome
    "いらっしゃいませ!"
  end
end

puts Cafe.welcome      🌟呼び出す際はクラス.メソッド名だけでOK

#=> いらっしゃいませ!

あるいは

class Cafe
   class << self
      def welcome
        "いらっしゃいませ!"
      end
   end
end

puts Cafe.welcome

#=> いらっしゃいませ!
  • 下の段は、複数のクラスメソッドを書くときに便利(ネストが一つ深くなる)またちょっと先の話になるけれどクラスメソッドをprivateメソッドにしたいときはclass << selfの構文を使うよ。
  • インスタンスメソッドからクラスメソッドを呼ぶことも出来る(self.class.クラスメソッドまたはクラス.クラスメソッド)逆に、クラスメソッドからインスタンスメソッドを呼び出すことは出来ないので注意。(どのインスタンスメソッドであってもクラスメソッドは共通なので呼び出せるが、インスタンスメソッドはレシーバがその都度異なるため)
  • クラス.newnewはクラスメソッドだよ!!!



そのほか便利なメソッド

メソッド 読み方 内容
instance_variablesメソッド インスタンスバリアブル インスタンス変数の変数名一覧を取得するメソッド
ancestorsメソッド アンセスター(祖先)メソッド 継承関係上の祖先をたどることが出来るメソッド



継承のルール

  • 継承は<一つ!(つい、クラスメソッドの2つとごっちゃになる)
  • 継承の目的は、「似たメソッドを何度も書くの面倒」なので、それらを引き継ぎつつ、「一部変えたい」という時に使える。
  • ”「子クラス」は「親クラス」の一種である”と声に出しても違和感がない時は適切な継承と言える。
  • 親子のクラス🐓🐤で同名のメソッドがある時は、「最初に該当したメソッド🐤」を呼び出す
  • もし「最初に該当したメソッド🐤」ではなく、親クラスの同名メソッドを呼び出したい時は「🐓super🐓」と書く。
  • 同名の「子クラス」と「親クラス」のインスタンス変数や、privateメソッドは、継承がきっかけでオーバーライドを引き起こし、バグを起こす原因にもなりうるので注意。



制限のルール

🤔私:それぞれのメソッドのルールを上手く使えば外からも中からも呼び出せるようになったね!
🥸先生:あえて「レシーバを指定して呼び出すことができないインスタンスメソッド」としてprivateメソッドがあるよ。
🤔私:出来ること減らしてしまうので、無意味では?どうしてプライベートにするの?
🥸先生:privateメソッドにする=外から呼び出さないようにすると明示することで「このクラスとオブジェクトではAメソッドではなくBメソッドを使ってくださいね」と設計上の意図を他のプログラマーに伝える大事な役割を担っているよ。



感想

  • 本当は、SPIや、PHPの基礎なども学びたかったがそこまで行けなかった💦
  • でも、ずっとモヤモヤしていて理解したかったRubyのクラスについて理解することができた。
  • 一つの型をしっかり理解すれば、他の言語の基礎も差分を捉えながら出来ると信じてRubyを今は頑張っている。
  • 今日は午前中、カフェに行ってみた。集中できたのでよかったなあ。前、銭神さんがおっしゃっていた動く椅子だと動くことが気になってしまうことにすごく共感(笑)最近は動かない椅子にハマっている。
  • 大きいモニターを導入!!mac小さかったから画面見やすくなって嬉しい!!!

20210402・03_アウトプット(Ruby)

アウトプット画像

今日やったこと

  • HTMLの理解を深める 50分

  • ゼロからわかるRuby超入門の続き(6)3時間40分

  • Laravelのアプリ 1時間(mysql接続ができておらず、migrateがうまくいかなかった もう少し調べよう)

1%の成長

  • ブロック変数について、ハッシュと配列でごっちゃになっていた部分が整理できた。ハッシュの時は、原則キーと値の2つを渡す。each_keyeach_valueなどのメソッドを使う時だけ、そのうちの一部を指定しているので1つとなる。

  • 配列の時は、配列の直後にメソッドをつけることが出来たが、ハッシュの場合には代入した変数に対してdeletemergeメソッドを行うことを理解。

新しく学んだこと

ハッシュ全体のこと

  • ハッシュをpメソッドで出力する際はハッシュを丸かっこで囲わないと、文法の解釈が曖昧となりエラーとなること。

  • シンボルへ変換するときはto_symメソッドがあること。

  • キーとシンボルを同じ意味に捉えていた。しかし、違った。
    🟢「キーとバリュー」は「見出しと内容」という概念のことを指す。
    🟢シンボルは「キー」を表現する方法の一つ。ハッシュロケットを使う場合には、シンボル以外(文字列など)をキーにすることが出来る。

  • ハッシュに対して、キーを指定して探そうとした時、値がない場合はnilを返すが、デフォルトを設定することもできる。

menu = { coffe: 300, caffe_latte: 400}
menu.default = "その値はないよ"
p menu[:tea]

#=> "その値はないよ"



mergeメソッド

  • merge メソッドを使い、2つのハッシュを1つにまとめることができる。
coffee_menu = { coffee: 300, caffe_latte: 400 }
tea_menu = { tea: 300, tea_latte: 400 }
menu = coffee_menu.merge(tea_menu)
p menu

#=> {:coffee=>300, :caffe_latte=>400, :tea=>300, :tea_latte=>400}
  • 逆でもOK(そうすると、teaからの順になった)
  • menuではなく、coffee_menutea_menuを代入後の変数にしたら、NameErrorになった💡個別で値の代入をする時は書き換え(上書き)が出来るけれど、「ハッシュ自体を定義した変数」と「マージした後の変数」という同義にならない場合はちゃんとエラーになるんだと勉強になった。
  • ハッシュに直接繋いでもNameErrorになった({ coffee: 300, caffe_latte: 400 }.merge(tea_menu)


deleteメソッド

  • キーと値する時はdeleteメソッドを使う。ハッシュ.delete(キー)
menu = { book: 500, note:100 }
menu.delete(:note)
p menu

#=> {:book=>500}


eachメソッド

  • ハッシュでeachメソッドをする時は、ブロック変数としてkeyとvalueの2つを渡す。

  • ブロック変数名はkeyとvalue出なくても可能。

menu = { coffee: 300, tea: 400 }
menu.each do |key, value|
  p "#{key}#{value}円です"
end

#=> 
"coffeeは300円です"
"teaは400円です"


  • 🤔keyだけ、あるいはvalueだけ表示させたい時はどうするの?
  • 🥸each _keyメソッドやeach_valueを使おう
メソッド ブロック変数の数 内容
each 2つ(key・value キーと値を表示
each _key​ 1つ(key) キーのみ表示
each_value 1つ(value 値のみ表示

感想

  • 午前中に、オンラインスクールの時の仲間と近況報告。息抜きになった😌仲間がわからないと言っていたAWSにおけるエンジンエックスの役割を説明したら、理解につながったようで嬉しかった。
  • 最近、メリハリを大事にするよう心掛けている。ついプログラミング以外の時に、心のどこかでプログラミングのことを考える気持ちが抜けないでいた。自分のメンタル的にも関わる相手にとっても良くないなーと感じていたものの、ついつい心配性で考えてしまう癖がある。プログラミングもそうでないことも1つ1つ楽しみながら気持ちを切り替えよう!

20210401_アウトプット(Ruby)

アウトプット画像

今日やったこと

  • ゼロからわかるRuby超入門の続き(5の練習問題)40分

1%の成長

  • リファレンスをみながらメソッドを探すことに少しずつ慣れてきた
  • また練習問題解くときに、vimを使うようにしていて、ファイル作成や行のコピーに慣れてきた
  • メソッドの中でもよく使うsplitやmap、joinメソッドが理解できるようになった


新しい発見

  • 「配列の中身の合計」とみた時に+=で順番に足す構文を想像してしまうが、sumメソッドなら一行で記述できる

  • %Wと%wの違いは、%W(式展開あり)と%w(なし)の違い。””を使わなくて済むのでスッキリする

  • split ⇄ joinである

p ["100", "50", "300"].join(",")
#=> "100,50,300"

p "100,50,300".split(",")
#=> ["100", "50", "300"]
復習
メソッド 意味
uniq 重複なくす
clear 配列の中身を空にする
sample ランダムに配列の中から1つの要素を出力する
map 中身に同じ処理をする(新しい配列を得ることが目的!)
downcase 全て小文字にする


感想

  • 今日は勉強時間をあまり取ることができなかった。しかし15分以上のマイルールは達成できた。(自分を責めずに、休む自分も大事にしよう💦😊)
  • 配列の展開はよく使うと思うので、繰り返し復習したい。
  • やりたいことが沢山あって優先順位に迷うけれど、今やっているRuby超入門の本をまずやり切ろう。
  • あっという間に新年度。昨日と今日、同じ一週間なのに、人事異動で人がガラッと変わると大きく雰囲気が変わる。若干緊張するけどフレッシュな気持ちになるのでこの雰囲気は好きだなあ。天気も暖かくなってきたし、晴れやかでいい。🌸
  • 新年度明けの忙しさと、勉強の両立、乗り切ろう!!!