20210427・28・29・30_アウトプット(オブジェクト指向でなぜ作るのか・イミテーションゲーム)
行ったこと
第4章まで理解(1670頁/5,000頁)
本の途中で出てきたイミテーションゲーム(映画)をアマプラで観た。
学んだこと
この本から学びたいことは何か?
オブジェクト指向の歴史(機械語から構造化プログラミングまで)
(1)機械語…2進数、コンピュータは今じゃ考えられないほど巨大❗️
🤔 私:1940年代、コンピュータは2進数の「機械語」から始まったんだよね?
🥸先生:そうだよ。当時は、スーパープログラマーだけが操れる時代で、コンピュータを作る前に建物を作らないといけない程、巨大だったんだ。
(2)アセンブリ言語…ちょっと分かりやすくなった記号での表現、コンパイル❗️
🤔 私:そこから、無機質な機械語を人間が分かりやすい記号に置き換えた「アセンブリ言語」が登場したんだよね?
🥸先生:そうそう。このアセンブリ言語こそが、プログラム言語の最初の一歩だったんだ。なぜならば、「コンパイル」をするからだよ。アセンブリ言語を使って書いたプログラムを機械語にコンパイルするために、アセンブラと呼ばれる別の機械に読み込ませて機械語を生成したんだ。しかし、アセンブリ言語は、命令を少し間違えるとプログラムは暴走してしまい、実行命令を一つ一つ指定するプログラミングは煩わしかったんだ。
(3)高級言語…英文に近い命令や構文規則で、人間が理解しやすい表現の言語に進歩❗️
😲私:一気に表現豊かになったね!
🥸先生:1954年頃数学の計算が大得意なFORTRAN(フォートラン)や、1959年に事務処理が得意なCOBOL(コボル)が登場したんだ。記述方法は一気に豊かになったものの、プログラムを書くときは1から全て書き上げる必要があったよ。
ここでのお話「ソフトウェア危機」
🤔 私:ソフトウェア危機とは?
🥸先生:1968年に、NATO主催のカンファレンスで「このままだと総人口がエンジニアになっても、コンピュータ需要に追いつかないぞー!」という危機宣言があったんだ。つまり、このまま一部のコンピュータにめちゃくちゃ詳しい人しか出来ないままだと、需要に全く追いつかないよ!という宣言で、高級言語が登場してもなお、コンピュータの開発をより便利にしたいというニーズは収まらなかったんだ。
(4)構造化プログラミング理論…順序進行、条件分岐、繰り返し(GOTOレス文)❗️
😲私:その危機に対応するため、構造化プログラミングが考案されたんだね。
🥸先生:1968年、計算機科学者エドガー・ダイクストラさんが、「処理の流れも構造的にして分かりやすくしよう!」と提唱したんだ。具体的には、どこでもジャンプできるGOTO文を廃止して、「順次進行」「条件分岐」「繰り返し」の3つの構造だけで表現しようと提唱したよ。
🥸先生:そうそう。話はそれるけど、グラフの最短距離を解くアルゴリズムで使う「ダイクストラ法」のダイクストラさんだね。始点から終点へ至る路のうち、間を通る辺のコストの総和がもっとも小さいものを求められることを考案した方だね。(ベルマンフォード法よりも計算時間が小さいが、負のコストが入っていると正しく答えが求められないので注意)
🥸先生:またこの辺りで言われたのが「サブルーチンの独立性を大事にしよう」という考え方だったんだ。それまではグローバル変数によってどこでも参照できてしまうためバグが起きた時にどこが引き金となっているのか分かりづらかったんだ。そこで「ローカル変数」と「引数」が生まれ、グローバル変数の使用を最小限にして、サブルーチンの独立性を高める技術が進歩したよ。
(5)ついに構造化言語の登場…構造化が言語にも適用❗️
😲私:構造化プログラミング理論の浸透に合わせて、「理論」だけでなく「言語」として、ALGOL(アルゴル)、Pascal(パスカル)、C(しー)言語が登場したんだね!
🥸先生:そうだね。特にC言語は、構造化プログラミングの機能を完全にサポートするだけでなく、従来はアセンブリ言語しかできなかったビット演算や、メモリ領域を効率的に使うためのポインタなどのきめ細かい機能を備えていたんだ。また全てを言語仕様にせずに、関数ライブラリを組み上げるようにしたよ。そのため、アプリケーション開発だけでなく、UNIX OSの言語として使用されるなど、システムプログラミングにまで幅広く使われたよ。
😲私:だから今でも「C言語が祖先なもの」が多いんだね!
この時点における欠点(課題)
🥸先生:はい!ここまで見てきたけれど、機械語から高級言語までの「人間に親しみやすい表現でソースコードを書けること」という流れと、構造化言語からの「出来上がったプログラムを理解しやすく、修正できるようにすること」の流れが今まであったんだね。
😲私:最初は「全て、一から書く」が当たり前だったけれど、「それじゃ追いつかないわ!」と再利用したり、バグの温床にしないソースコードの分かりやすさを模索し始めたんだね。
🥸先生:この時点における課題は「グローバル変数」(ローカル変数じゃ一時的すぎる、なんだかんだグローバル変数書かないと成り立たない)と「貧弱な再利用」(再利用できるのがサブルーチンのみ)だったんだよ。
😲私:そこで、出てきたのがオブジェクト指向プログラミングってわけだね!
オブジェクト指向プログラミングで出来ること(大きく3つ)
🥸先生:グローバル変数と、サブルーチンの課題を解決したのが、オブジェクト指向プログラミング(Object Oriented Programing)における「クラス」「ポリモーフィズム」「継承」という概念だったんだ!
😲私:「グローバル変数を使わない新たな方法」と「サブルーチン以外にも再利用できる仕組み」がOOPのお陰でできたんだね!
🥸先生:それぞれを見ていくよ。(OOPの仕組みは、言語ごとに微妙に異なる。以下は、Javaにおける考え方。)
「クラス」...まとめて隠してたくさん作る仕組み
(1)サブルーチンと変数を「まとめる」
(2)クラスの内部だけで使う変数やサブルーチンを「隠す」
(3)1つのクラスからインスタンスをたくさん「作る」
- クラスにおけるサブルーチンをメソッド、変数をインスタンス変数という。
- クラスのお陰で名前づけが楽になる。(クラスが別であれば、メソッド名やインスタンス変数名がかぶっていても大丈夫!)
private
とpublic
を指定することによって、グローバル変数を使わずにプログラムを書くことが可能になる。- 今までは、呼び出される変数側が、外からどれくらい呼び出されるか予測してその分のメモリを配列で確保しておかないといけない(その分ロジックが複雑)状況だった。
- しかし、クラスとそこから生まれるインスタンスという概念のおかげにより、呼び出される変数側は「どんな変数なのか」だけを定義して、呼び出す側が「インスタンス」として実行したときにメモリを確保するようになったので、複数同時に外から扱うことも可能になった!
- インスタンス変数は、影響範囲を局所化できるローカル変数と、存在期間が長いグローバル変数の良いとこ取りをした柔軟性のある素晴らしい子!!!
「ポリモーフィズム」
「共通メインルーチン」をつくる仕組み。
- 呼び出す側のロジックを一本化する仕組みだよ。
- コツが2つあるよ。それは、呼び出される側を整えること。①具体的には、メソッドの引数や戻り値の形式を統一すること。②ポリモーフィズムで呼び出される側に
extends
と宣言してもらうこと。 - そうすることによって、一本化した仕組みが実行された時に、宣言しているところに対して、共通化したメインルーチンを適用できるよ。
💡こんなふうに理解した💡(例え話:Uber eats)
- 呼び出される側をお店とする。Uberで運ぶには「出来立て鍋に入ったままの状態」「お皿に持った状態」「テイクアウト容器」など料理が完成したときの状態がバラバラだと、同じように運ぶことができないよね!
- なので、Uberで運ぶには「テイクアウト容器」に入れると統一する。(=メソッドの引数や戻り値の形式を統一する。)
- そして、Uberで運ぶには「私、登録店です!」と宣言していないと登録しているのかわからないよね!(=
extends
と宣言) - 上記らによって、呼び出される側を整えられたら準備OK!
- 呼び出す側の仕組みが「バイクで運ぶ」や「自転車で運ぶ」など、方法が変わっても「呼び出される側」に影響せずに、目的を達成することができる!この仕組みがポリモーフィズム。
「継承」...クラスの共通部分を別クラスにまとめる仕組み。
継承は、クラス定義の共通部分を別クラスにまとめて、コードの重複を排除する仕組み。
- さっきのポリモーフィズムでは飽き足らず、似たようなクラスはまとめてしまおう!という機能。
- 共通クラスのことをスーパークラスいい、それを利用するクラスをサブクラスをいう。
- 継承を使うには、ポリモーフィズムと同じように、呼び出される側を整えることと、宣言することができていればOK!
感想
- PHPとRubyなどプログラム言語の「そもそもの根本になる部分」を理解できてすごくスッキリした。今は言語の部分の章だけれども、抽象度ごとに「オブジェクト指向」を知ることができるので今後も楽しみ。(デザインパターンやモデリングなど)
- 理解に時間がかかるけど、大きい収穫なことには間違いない。
- これからPHPの学びを行うにあたっても、Rubyとの違いだけでなくオブジェクト指向型言語にあたり、全体のこのあたりをやっているのかと理解しながら進めることができるため視点が変わった。
- 一番嬉しかったのは、過去からの繋がり(オブジェクト指向以前では、実現できなかった欠点からのつながり)を自分の言葉で理解できたこと。本当にコンピュータの世界、難しいけれど「楽しい」と感じること尽きないなと思った。
- コンピュータ科学の栄誉「チューリング賞」の由来にもなっているアランチューリングさん人生を題材にした作品。本に出てきて「面白そう!」と思ったらプライム会員ならちょうど観れた!!!ラッキー😍
- すーごく面白かった!!!!!!久々の映画!!!!!!!!ストーリーの発展にワクワクしたし、改めてコンピュータって過去の天才たちが作り上げている結晶なんだと思って、感謝の気持ちでいっぱいになった。
- 同時に、過去の偉人って当時は天才すぎて周りが理解できず反発をくらったり、当時の価値観で法が決められておりそのせいで亡くなってしまったり、こんなに恩恵を受けているのに、当時はそれに対する感謝というか、賞賛がないまま亡くなっていることが多い。何十年も何百年も「天才」と名が残る人で、その人が生きている間は「苦しい」ことが多い。価値観ってなんだろう。複雑な気持ちになった。
- だからこそ、自分の価値観もただのサンプル数1なので、自分とは異なる視点の意見にも「なぜそのように思うんだろうか」と好奇心を持って聞く姿勢でありたいと感じた。
- より一層頑張る。本当にありがとうございます。
20210424_アウトプット(Rails・php)
今日やったこと
- 現場で使えるRubyonRails速習ガイド(1時間10分)
- 初めてのphp(2時間50分)
1%の成長
新しい発見
Rails
パーシャルについて
パーシャル(一部分)側(_form.html.slim)
model
について@task
からtask
に変更。
= form_with model: task, local: true do |f| (省略)
呼び出す側(new.html.slim)
- インスタンス変数
@task
を、パーシャル内のローカル変数task
として渡す、という意味になる。 - 明示的にローカル変数として渡すことで、インスタンス変数の定義に依存しない再現性の高いパーシャルにすることができる。
- どんな変数を利用しているかがわかりやすいので見通しの良いコードになる。
(省略) = render partial: 'form', locals: { task: @task }
Railsのビュー内にJavascriptを組み込める
dataオプション
を使って、"confirm: メッセージ内容"を渡すと、リンクをクリックした時にダイアログ(パソコン上の小さな会話ができるポップ)を表示し、OKが出た時だけ動作する。
= link_to '削除', @task, method: :delete, data: { confirm: "タスク#{@task.name}を削除します。よろしいですか?"}, class: 'btn btn-danger'
PHPについて
$i++(後置)と++$i(前置)の違い
- 意味としては、インクリメント(増やすこと)を先に処理するか、後に処理するかの違い
- どの時点で値を返す(出力する)かが異なるので注意!
- 具体的に言うと、後置増分演算子(
$i++
)は、プラス1する前に値を返す。そして次の処理をする前にプラス1して次の処理をスタートする。 - なので
while文
などで、1の時は実行、2の時は実行、10まで繰り返すというような時、1も表示させつつ、10まで続けたい時に、無限ループしないように中止する条件として使える。
インクリメント | 処理 |
---|---|
++$i(前置) | まず先にプラス1、その後他の処理 |
$i++(後置) | 他の処理を行なった後にプラス1 |
<?php $foo1 = 1; $foo2 = 2; 🟢その1(後置) $foo1 = $foo2++; echo $foo1; 👉結果は2 (値を返すのは、$foo1に$foo2の変数を代入した段階で返す。次の繰り返し分を書いていないのでここで終了しているが、次の繰り返しがある場合はプラス1をして、次の処理に移る。) 🟢その2(前置) $foo1 = ++$foo2; echo $foo1; 👉結果は3 ?>
whileとforの違い
- 両方「繰り返す」という意味では同じ
- 書き方として、
while
は「〜の条件の間繰り返す」と書くwhile ($i <= 10)
for
は「初期値はホニャで、〜の条件の間、〇〇を繰り返す」と書くfor ($i = i; $i <= 10; $i++)
(最後はセミコロンいらない!)for
は複雑な式もできる。ここでいう「複雑な式」とは、初期値と繰り返し文をカンマで複数設定できると言う意味。
abs()関数ってなに?
absolute value
(絶対値)のこと。- 数値には、閾値(変動する境目の値)があり、浮動小数点数を比較演算子で比べようとすると誤差が発生する。
- abs()関数を使うと、絶対値で差分を比較するので、適切に比較できる
strcmp()関数ってなに?
- 一言でいうと「文字列2つを辞書順で比較する関数」
- 「大きい」「小さい」の判断を辞書順で決める関数。(数字、大文字、小文字)
- 数字の比較に関しても数値の大きさではなく、辞書順。(例えば
54321
と5678
であれば、4
と6
を比較して、54321
の方が小さいと判断) - 引数に2つの文字列をとり、一番目の方が大きい場合は正数を返す。小さい場合は負数を返す。等しい場合は0を返す。
<?php $x = strcmp('6pack', 55) ; if ($x > 0) { print '6packの方が大きいと判断しているよ'; } elseif ($x < 0) { print '55の方が大きいと判断しているよ'; } ?> 👇出力結果👇 6packの方が大きいと判断しているよ (なぜならば、6の方が辞書順で後ろだから)
宇宙船演算子ってなに?
- 一言でいうと「あらゆるデータ型OKで、方法はstrcmpのような、中身はASCIIの比較演算子と同じ役割をするもの」
- php7より導入。
strcmp
と同じように、左にある方が大きい場合は正数、小さい場合は負数、等しい場合は0を返す。- ただし、数字文字列の場合には
strcmp()
ではなく、<
や>
のような比較をするよ。
<?php $x ='6pack' <=> 55 ; if ($x > 0) { print '6packの方が大きいと判断しているよ'; } elseif ($x < 0) { print '55の方が大きいと判断しているよ'; } ?> 👇出力結果👇 55の方が大きいと判断しているよ (なぜならば、6と55で比較しているから)
(番外編)摂氏と華氏の違いってなに?
- 華氏(°F)から摂氏(°C)に変換するプログラムを書く問題があった。摂氏と華氏の違い、そういえばちゃんとわからないやと思って調べたところ面白かったのでメモ。(ざっくり)
華氏って?
- 今から300年ほど前、ファーレンハイトさんが水銀温度計を発明した。(当時はアルコール温度計が使われており、精度がぐんっと上がった)
- 中国に伝わった時、「ファー氏」が、「か氏」と聞こえて「華氏」となった。
- ファー氏は、何かを基準にして、メモリをきちんと定めようと考えた。その基準を、100°Fを自分の体温、0°Fを氷に食塩を加えた温度(マイナス20℃くらい)にした。
- 自分が作った温度計でいろいろ測りまくっていたところ、水は決まった温度で凍る・沸騰するということを見つけた。(当時は「凍る」「沸騰する」の温度が決まっているという発想がなかった)
- 凍るのが32°F、沸騰するのが212°Fと分かった。
摂氏って?
- セルシウスさんが「体温じゃばらつきがあって曖昧。もっとはっきりしたものを基準にしようよ。」として、凍る時を0°C、沸騰を100°Cにしたもの。
摂氏⇄華氏
- つまり水の凍る・沸騰する温度を基準にすると、摂氏は100等分(0〜100℃)で、華氏は180等分(32°F〜212°F)の違いがある。
摂氏°Cから、華氏°F
に変換したい時は、°C×9/5 +32
華氏°Fから、摂氏°C
に変換したい時は(°F-32)×5/9
なぜ、アメリカやイギリスでは摂氏ではなく華氏が使われているの?(便利って思っているの?)
- マイナスっていう感覚をほとんど使わないので便利。(-5℃の寒い日は、23°F)
- 100°Fは体温が基準なので、100°Fを超えると病気だぞ(熱あるぞ)と目安になりやすいから便利とのこと。
(なるほど・・慣れてないだけで便利なのかも?🤔笑)
ケルビンの絶対温度(気体が分子の温度を止める温度)
- ところで、この世で一番冷たい温度ってなに?そこで出てくるのかケルビン(K)
- シャルルさんは、どんな気体でも温度を1℃上げると、1/273ずつ大きくなることを発見した。(つまり、273℃の時は、2倍の大きさとなる。)
- 反対に、温度が下がっていくと体積は縮んでいく。273度下げたら気体の体積は0になる。つまり、気体の分子は運動を止める。(これ以上温度が下がらない)
- つまり、この世に存在する下限(一番冷たいもの)はマイナス273℃と判断。(上限はない。)
- マイナス273℃を基準(0ゼロ)としたのがK(ケルビン)。
- 水の温度で例えると、マイナス273が0ケルビン、凍る0℃が273ケルビン、沸騰する100℃が373ケルビンとなる。
- 実は、宇宙はとっても寒い。3K (マイナス270℃)。
- この世で一番低温なものとして発見されているのは1K(マイナス272℃)で、宇宙にあるブーメラン星雲とのこと。🌌
感想
- 学んでて楽しかった。今日は特に脱線することが多かったが、新しいことを知れて面白かった。
- 速習ガイドの方は、Bootstrap入れると本当にビュー何もしなくてもわかりやすい表示やポップになっていてすごいと思った。slimもymlもインデントのコツが難しい。(目が慣れてない)
- 今日も運動したり、散歩したり、料理したり、息抜きしながら新しい知識を学ぶのが楽しいと思いながら学べたのがよかったなあ。時間は短かったけど集中できた💡
20210420・21_アウトプット(php)
やったこと
- 初めてのphp(3章ロジックと繰り返し)
1%の成長
- 初見で見た時に「?」と感じた数値や文字列の比較について理解できた。
新しい発見
ASCIIってなんだ?
American Standard Code for Information Interchange
の略で、ASCII(アスキー)と読む。- 半角英数字と記号のみ。以前はアルファベットを使えれば事足りたが、それだと日本語が❌なので、その後アスキーコードにひらがなやカタカナ、漢字を追加した新しい表を作った(なので、UTF8なのか💡)
- 「文字」と「文字に割り当てた番号」を「符号化文字集合」という。
- 「文字に割り当てた番号」と「実際にコンピュータが扱う数字」を「文字符号化形式」という。(アスキーコードは、「符号化文字集合」と「無事符号化形式」が同一)
比較で小さい順 | 内容 |
---|---|
1 | 数字 |
2 | 英語(大文字) |
3 | 英語(小文字) |
なるほど!
- phpでは文字の比較ができる。その時に混乱したのがアルファベット順よりも「数字」「大文字の英語」「小文字の英語」が優先されること。
- 例えば、「W」と「a」の比較だと、「a」の方がアルファベット順だと1番だから前かな?と思いきや、「大文字の英語」の方が優先されるので「W」→「a」と判断される。
<?php // Your code here! if ('W' < 'a') { print 'aの方が後ろだよ'; } else { print 'Wの方が後ろだよ'; } ?> 👇実行後👇 aの方が後ろだよ
様々な比較
比較対象 | 状況 | こう比較される | 結果 |
---|---|---|---|
"x54321"と"x5678" | 文字列+数字 | 3番目にある4 と6 の比較 |
"x54321"の方が小さい! |
"54321"と"5678" | 文字列の数字 | 数値に置き換えられ54321と5678の比較 | 5678の方が小さい |
'6 pack'と'55 card stud' | 数字+文字列 | 1番目にある6 と5 の比較 |
'55 card stud'の方が小さい |
'6 pack'と55 | 数字入り文字列と数字 | 6が数値に置き換えられ6 と55 の比較 |
'6 pack'の方が小さい |
つまり、
- その対象は、比較対象ともに「文字列と数字ミックス」か?
👉一文字目の「数字」「大文字」「小文字」で判断。 - その対象は、比較対象ともに「数字(文字列の数字含む)」または、比較対象片方が「数字(文字列の数字含む)」か?
👉数の大きさで判断。 と理解。
感想
- 整理できてスッキリ。(Rubyの時は、そもそもデータ型が異なるものは違うと判断すると思うので、この概念について学んだ時、初めはどういう意味?って思った)
- なんで、片方数字だと両方数字の比較になることについて、どういうところで使えるんだろう?
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%の成長
新しい発見
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%の成長
- 前ほど、環境構築に対して抵抗(うっ・・・難しそう・・・という感情)が無くなった気がする!RubyやRailsのバージョンアップ、PHPの環境構築と通して「これで合ってるのかな?」と思いつつも動く嬉しさを学べたからかな。
- 反対にやりたかったけれど出来てなかった技術(ポスグレ・docker・環境構築の練習など)にトライ出来ることが嬉しい。
新しい発見
Rubyのモジュールについて
名前空間について
- クラス名や変数名が重複していると、前者は後者に記述した内容へ上書きされる。
- 上書きせずに、別々のものとして扱えるようにするのが名前空間。
- モジュールで定義されている部品(定数)を、クラス名は同じでもモジュールごとに振る舞うことができる。
- その場合は
モジュール名::クラス名
で部品(定数)を使えるようになる。
CSS初級:学ぶこと
- CSSを使うとどんなことができるの? 👉デザイン設定ができる。
- CSSってどうやって書くの? 👉セレクタ{プロパティ:値}
- セレクタ?プロパティ?値? 👉セレクタ:どこを変える? プロパティ:何を変える? 値:どんなふうに?
サルワカ(STEP4まで)
- 「インターネット」とは?:コンピュータ同士の情報をやりとりする仕組み
- 見ているものが「Web」。その他にもメール転送や、ファイル転送などもあるよ!
- Webサーバーとは?:Web上で情報を公開しているソフトウェアやコンピュータのこと。
- Webサーバーからきた情報はコンピュータ向け語だけれど、「ブラウザ」によって人間向け言語にしてくれる。
読み方間違えていたところ
- 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に着手
環境構築
- これを見ながら、PostgreSQL(ポストグレス)をインストール。
上記を見ながらポスグレはインストール出来たんだけど、その際にdockerも必要とある。
うろ覚えな知識だけど、dockerって、「カーネルと呼ばれるハードウェアとソフトウェアを繋げる中核部分とOS」は共通でその上にソフトウェアを導入すると理解している。
なので、ポスグレをMacOS本体にインストールしたが、ポスグレ付きdockerを導入した方がいいのではないか?!という疑問も生まれた。
また明日調べてみよう!!
感想
20210411_アウトプット(Ruby、Rails、php)
先週やっていたこと
4/5:Rubyモジュールの続き
4/6:SPI/Rails🌸
@task = Task.new
を見た時にここでクラスを生成しているのか!とRubyで学んだことが繋がった。4/9:Rails/志望動機🌸
Slim
のビューの場合、表示される場合はイコールを、させたくない時はハイフンで行を始める。4/10:PHP🌸初めてのPHPの8ページまで/プログラミングアカデミー(おさないさん)のYoutube/phpconfuk2016 PHP7で堅牢なコードを書く(和田卓人さん)の動画をみた
1%の成長
新しい発見
Ruby・Rails
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による導入
~ % brew search php ~ % brew install php@7.4
~ % brew reinstall git-secrets
PHPの基礎
🤔私:PHPで出来ることは?
🥸先生:PHPの機能を使って自動的に更新する日時などを作成し(HTMLに変換したものを)ブラウザに表示させたり、(PHPは覚えることが苦手だから)覚えることはデータベースにお願いして、データベースから必要な情報を持ってきて調整・表示するよ。
環境構築
🤔私:PHPを導入するにはにあたり環境構築をするけれど、そもそも「環境構築」とはどういう意味?
🥸先生:コンピュータが理解できる機械語に変換するために、必要な諸々のファイルを自分のコンピュータへインストールして、その場所をコンピュータへ知らせて、開発できる環境を整えることだよ。
🤔私:PHPの環境開発を整えるには、どんなものが必要なの?
🥸先生:Webサーバー用のソフトウェアと、アプリケーションサーバー用のソフトウェアと、データーベース用のソフトウェアの3点セットが必要だよ。それぞれインストールするのは大変だからphpにはおまとめセットがあるんだ。
おまとめセット名 | 内容 | 備考 |
---|---|---|
XMAPP(ザンプ) | Apache・MariaDB・PHP・Perl | 最初のXはクロスプラットフォーム(WindowsやMacOSなど異なるプラットフォームでもOKだよという意味) |
MAMP(マンプ) | Apache・MySQL・PHP | 最初のMはMacintosh(マッキントッシュというApple社が最初に開発したパソコン。最初はMac専用に作られた。) |
アプリケーションサーバー用のソフトウェアはどこ?と思ったが、Apacheが兼ねてくれていることを初めて知った。(↓参考になったサイト)
🤔私:そもそもサーバーってなに?
🥸先生:サーバーとは、いつ何時にアクセスしても大丈夫なように待機するコンピュータのことを指すよ。例えばGoogleで検索したいと思った時にいつでも検索できるのはサーバーというリクエストを待っていてくれる存在がいるからなんだ。
🥸先生:Webサーバー用のソフトウェアは、いつでもアクセスした時にブラウザが読める言語(HTML・CSS・JavaScriptなど)状態に変換するものあり、アプリケーションサーバー用のソフトウェアはいつでもアクセスした時にデータベースとやりとりをするものだよ。
実際にMAMPをインストール
MAMPにした。以下を参考にしながらインストール。(↓)
/Applications/MAMP/htdocs
配下にあるファイルがhttp://localhost/
上に表示されると理解。/Applications/MAMP/conf/php7.4.12/php.ini
のdate.timezone
を東京に設定。
和田卓人さんの動画を見た
- 予防に勝る防御なし:そもそも、誤りが発生しないようなプログラミングスタイルを。
- 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をインクルードしてメソッド群を使えるってことだね。
感想
- クラスを理解した後に、モジュールの概念をもう一度学んだら、違いがより明確に理解できた。モジュールはメソッドのパーツだったのか。(インスタンスを生成できない、という意味がようやくスッキリ。やっぱりクラスがひっかかっていたのか。)
- 日頃の勉強と同じくらい、行きたい企業について向き合うことも大事だと思っていて、時間の使い分けが難しい。ついつい企業のこと調べているとワクワクしてきて時間が経ってしまう。
- あと寝不足になるとドライアイが辛くなる😭早めに寝よう💦