Webとインターネットの違いとそれぞれの意味
Web 技術の基礎を学習しようとしたところで、 そもそも Web とは何か?インターネットとの違いは?と疑問を抱いた。 それぞれの意味と違いをメモ。
結論
Web とは何か
ハイパーテキスト
Web の前身は、各国の実験者がすぐに情報にアクセスできるように作られた。
これが、ハイパーテキスト という仕組み。
このハイパーテキストの仕組みを インターネット上で動くように開発されたのが Web という。
Web
正式名称は World Wide Web。世界中に広がる蜘蛛の巣という意味。
- Web ページ同士がリンクして別の Web ページに繋がっている。
- ひとつの Web ページからまた別の Web ページにリンクでき、Web ページを辿ることで世界中のさまざまな情報に触れられるようになった。
インターネットとは何か
前身は、世界各地の拠点と接続するために開発された。
インターネットとは、世界中のコンピュータ同士が通信する通信網のこと。
- インターネットは当初、接続回線が高価であり、企業や研究機関しか使用できなかった。
- しかし、通信技術の発展により価格が下がっていくにつれ、一般ユーザーに広まっていった。
そこで、Web がインターネット上で使えるものとして登場。
Web とインターネットの発展
Web ブラウザが普及し始め、Web はインターネットとともに世界中に普及していった。
Web は当初文書しか扱えなかったが、画像や動画、音声、3 次元グラフィックにも対応していった。
Web はインターネットとともに爆発的に広まっていった。
まとめ
- Web は、文書同士が繋がるハイパーテキストがインターネット上で使えるシステム。
- インターネットは通信回線で世界中のコンピュータを繋げる通信網。
- Web はインターネットとともに爆速的に世界中に広がった。
参考
- NRIネットコム株式会社 小林恭平・坂本陽. (2018). イラスト図解式 この一冊で全部わかるWeb技術の基本. SBクリエイティブ株式会社.
- https://tone.ne.jp/column/howtouse/whatsbrowser-beginner-smartphone/
- https://www.otsuka-shokai.co.jp/words/hypertext.html
マジックナンバーとは何か、なぜ避けるべきなのか
コードレビューでマジックナンバーを指摘され、マジックナンバーとは何か?なぜ駄目なのか?を調べたのでメモ。
概要
マジックナンバーとは、直接ソースコードに記述された数値で、その意味が不明なものを言う。
コードの可読性を下げ、修正や変更の際に問題が起きやすくなる。
これを避けるために、数値は定数化して、定数名の形で値を参照すべき。
問題のコード
class HomeController < ApplicationController def index @reads = Read.includes([task: :user],[task: :book]).order(read_on: :desc).limit(50) end end
マジックナンバーとは何か
ハードコーディングをした際に、実際に記述された値のことを、マジックナンバーと言います。
- ハードコーディング
ソースコードの中に固定値をそのまま記述してしまうことを、ハードコーディングと言います。
以下のように、~.limit(50)
と数値を直接記述している状態です。
@reads = Read.includes([task: :user],[task: :book]).order(read_on: :desc).limit(50)
つまり上記の 50
がマジックナンバーです。
なぜ避けるべきなのか
なぜ避けるべきなのか、以下のマジックナンバーの例から説明します。
税込み価格の計算
tax_included_price = price * 1.08
1.08
がマジックナンバーです。
1. コードの可読性が下がる
良いコードとは「他人(そして後の自分)が読んで意味のわかるコード」です。
つまり、「誰もがひと目で何の数字かわかること」が必要です。
1.08
ではその数値が何を表すのかが明確ではありません。
1.08
って言ったら消費税じゃん…と思ってしまいますが、
よく考えると、消費税率は時代によって変動するものです。また、日本の消費税率を知らない人がコードを見たらさっぱりわからないですね。
2. 修正や変更時にミスの温床になる
もし税率が変わったら、
コード内の 1.08
の数字をすべて探し出し、ひとつひとつ修正しなければいけません。
探し漏れ、修正漏れが起きることは予想に容易いです。
定数化で解消する
マジックナンバーを解消するには定数化することです。 問題のコードを実際に直してみましょう。
class HomeController < ApplicationController MAX_READS = 50 def index @reads = Read.includes([task: :user],[task: :book]).order(read_on: :desc).limit(MAX_READS) end end
これで、他の人が見ても reads
を取得する最大値だなとすぐにわかりますし、
取得件数を変更するときには MAX_READS
の値を変更するだけで済みますね!
おまけ
定数の命名時の注意点
良いコードを書くためバイブル「リーダブルコード」では、
限界値を含めるときは min
や max
を使うことをおすすめしています。
「未満(限界値を含まない)」なのか「以下(限界値を含む)」なのか明確にするためです。
上記では、limit(50)
=「最大50件まで」と指定しているので、定数に MAX_
を使っています。
参考
Rails モデルの関連付け"has_many"とは
has_many ってなに?
- 他のモデルとの間に、「1対多」の繋がりがあることを示す。
※反対側のモデルにはbelongs_to
が使われることが多い。
規則
has_many
関連付けを宣言する場合、相手のモデル名は複数形にする。
例
ユーザーがそれぞれメッセージを投稿できるアプリがあるとする。 モデルクラスは、UserモデルとPostモデル。
- Userモデルに
has_many :post
- Postモデルに
belongs_to :user
と入れることで、1対多の関連付けができる。 つまり、
User : 多数のpostを持つ。
Post :1つの user_id を持つ。
ということです。
補足
ん?user_id
?
Userのインスタンスなら、user.id
では?
と思いますね。
外部キー(関連付けた相手のクラスのインスタンスを参照するキー)の場合は、user_id
のように、アンダーバーを使用するとRailsが勝手に判断してくれます!
オプション
has_many
に追加できるオプション
:as
:autosave
:class_name
:counter_cache
:dependent
:foreign_key
:inverse_of
:primary_key
:source
:source_type
:through
:validate
まとめ
突然「1対多」という聞き慣れぬ言葉を聞くと構えてしまいますが、
UserとPostの例で考えれば簡単でした。
参考資料
Rails モデルの関連付けとは?
メッセージアプリを作る教材をやっていたら、突然出てきた「モデルの関連付け」。 使い方はわかったけれど、この「関連付け」って一体なに?何のためにするの?
疑問におもったのでお馴染みRailsガイドで調べてみました。
関連付け(association)
目的
モデル同士を関連付けることで、コードの共通操作を簡単にできるようにする。
例
例えば、ユーザーがそれぞれメッセージ投稿を行えるアプリケーションを作っているとして。
UserモデルとPostモデルがあったとする。
もし関連付けがされていないと、
- Userが1つ投稿するときは、Post.createに毎回user.idを指定する文言を入れなければいけない。
@post = Post.create(user_id: @user.id)
- Userを削除するときは、そのuser.idで登録されたメッセージを探し、メッセージを一つ一つ削除するコードを書いてから、user.destroyをしなければならない。
@posts = Post.where(user_id: @user.id)
@posts.each do |post| post.destroy end @user.destroy
- 関連付けによってUserモデルとPostモデルが適切に結びつけられていれば、こうした記述をシンプルにすることができる。
class User < ApplicationRecord has_many :posts, dependend: :destroy end class Post < ApplicationRecord belongs_to :user end
@post = @user.posts.create
@user.destroy
Railsのモデルの関連付けは6種類ある
belongs_to
has_one
has_many
has_many :through
has_one :through
has_and_belongs_to_many
関連付けはマクロのような呼び出しとして実装されている
「関連付け」はRailsの便利な機能だった
関連付けを書くだけで、Railsが勝手にモデル名を推測して、モデル間でコードの共通操作ができるようになる…。
すごいですね。
Railsのソースコードにも記載があったので、今度読んでみようと思います。
参考資料
RailsのMVCとはなにか?
先日、エンジニアの知人より、
という話を聞きました。 基礎概念の理解の大切さが身に沁みたので、 改めて、MVCとは?アーキテクチャとは?をまとめてみようと思います。
まず、アーキテクチャってなに?
ソフトウェアやハードウェアの「基本的な設計概念」のことです。
MVCってなに?
M model
- そのアプリケーションが扱う領域のデータと手続きを書く場所
- データ、ビジネスルール、ロジック、関数など。
V view
- UIへの出力を担当する場所。
C controller
- 入力を受け取りmodelとviewへの命令に変換する
つまり、RailsのMVCはそれぞれ何をしているの?
- Model
- データベースとのやり取りをする場所。モデルクラス(Active Record)とデータベース(テーブル)を作成する。
- View
- その名の通り、画面を表示するファイル。HTMLタグの合間にERBを含む形式で書かれる。
- Controller
- 司令頭。リクエストを受け取り、データをモデルから取得したりモデルに保存したりして、最後にビューを用いてHTML出力を生成する。
まとめ
以上、Railsのアーキテクチャの説明でした。 それぞれのコードがあるべき場所にあること、意外と難しいです…。 Viewについif分岐を書いてしまうことがよくあります。 (本来きちんとヘルパーに切り出すべき) しっかり意識して良いコードを書いていきたいですね!