aoのプログラミングブログ

あおのエンジニア学習日記

初心者のプログラミング学習記録。

Webとインターネットの違いとそれぞれの意味

f:id:ao_pro_21:20220225174934j:plain

Web 技術の基礎を学習しようとしたところで、 そもそも Web とは何か?インターネットとの違いは?と疑問を抱いた。 それぞれの意味と違いをメモ。

結論

Web とは、インターネット上で文書同士がリンクで繋がっているシステムであり、 インターネットとは、通信回線で世界中のコンピュータを繋げる通信網である。 Web はインターネットとともに爆速的に世界中に広がっため、混合されやすい。

Web とは何か

ハイパーテキスト

Web の前身は、各国の実験者がすぐに情報にアクセスできるように作られた。
これが、ハイパーテキスト という仕組み。

ハイパーテキスト:文書同士を相互に関連付け、結びつける仕組み。
ハイパーテキストを結びつける仕組みを、ハイパーリンクという。

このハイパーテキストの仕組みを インターネット上で動くように開発されたのが Web という。

Web

正式名称は World Wide Web。世界中に広がる蜘蛛の巣という意味。  

  • Web ページ同士がリンクして別の Web ページに繋がっている。
  • ひとつの Web ページからまた別の Web ページにリンクでき、Web ページを辿ることで世界中のさまざまな情報に触れられるようになった。

インターネットとは何か

前身は、世界各地の拠点と接続するために開発された。
インターネットとは、世界中のコンピュータ同士が通信する通信網のこと。

  • インターネットは当初、接続回線が高価であり、企業や研究機関しか使用できなかった。
  • しかし、通信技術の発展により価格が下がっていくにつれ、一般ユーザーに広まっていった。

そこで、Web がインターネット上で使えるものとして登場。

Web とインターネットの発展

Web ブラウザが普及し始め、Web はインターネットとともに世界中に普及していった。

Web ブラウザ:Web ページを閲覧するためのソフト。  
ex)「Internet Explorer(IE)」「Microsoft Edge」「Google Chrome」「Safari」「Firefox」「Opera」など
  • Web は当初文書しか扱えなかったが、画像や動画、音声、3 次元グラフィックにも対応していった。

  • Web はインターネットとともに爆発的に広まっていった。

まとめ

  • Web は、文書同士が繋がるハイパーテキストがインターネット上で使えるシステム。
  • インターネットは通信回線で世界中のコンピュータを繋げる通信網。
  • Web はインターネットとともに爆速的に世界中に広がった。

参考

マジックナンバーとは何か、なぜ避けるべきなのか

f:id:ao_pro_21:20220125114026p:plain

コードレビューでマジックナンバーを指摘され、マジックナンバーとは何か?なぜ駄目なのか?を調べたのでメモ。

概要

マジックナンバーとは、直接ソースコードに記述された数値で、その意味が不明なものを言う。
コードの可読性を下げ、修正や変更の際に問題が起きやすくなる。
これを避けるために、数値は定数化して、定数名の形で値を参照すべき。

問題のコード

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 の値を変更するだけで済みますね!

おまけ

定数の命名時の注意点

良いコードを書くためバイブル「リーダブルコード」では、
限界値を含めるときは minmax を使うことをおすすめしています。
「未満(限界値を含まない)」なのか「以下(限界値を含む)」なのか明確にするためです。
上記では、limit(50) =「最大50件まで」と指定しているので、定数に MAX_ を使っています。

参考

Rails モデルの関連付け"has_many"とは

f:id:ao_pro_21:20220125114026p:plain

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 モデルの関連付けとは?

f:id:ao_pro_21:20220125114328p:plain

メッセージアプリを作る教材をやっていたら、突然出てきた「モデルの関連付け」。 使い方はわかったけれど、この「関連付け」って一体なに?何のためにするの?

疑問におもったのでお馴染み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

関連付けはマクロのような呼び出しとして実装されている

  • モデルの関連付けを行うと、2つのモデルのそれぞれのインスタンスの間で、外部キーなどの情報を保持しておくように等の指示がRailsに伝わる。
  • 便利なメソッドもそのモデルに追加される。

「関連付け」はRailsの便利な機能だった

関連付けを書くだけで、Railsが勝手にモデル名を推測して、モデル間でコードの共通操作ができるようになる…。

すごいですね。

Railsソースコードにも記載があったので、今度読んでみようと思います。

参考資料

RailsのMVCとはなにか?

f:id:ao_pro_21:20220125114026p:plain

先日、エンジニアの知人より、

RailsアーキテクチャMVCMVCアーキテクチャに則って、あるべき場所にあるべきコードがあるのが良いコード。

という話を聞きました。 基礎概念の理解の大切さが身に沁みたので、 改めて、MVCとは?アーキテクチャとは?をまとめてみようと思います。

まず、アーキテクチャってなに?

ソフトウェアやハードウェアの「基本的な設計概念」のことです。

MVCってなに?

  • MVCとは、UIを持つアプリケーションを実装するためのデザインパターンのことです。
  • アプリケーションが持つ内部データを、ユーザーが直接参照・編集する情報から分離しているのが特徴です。

M model

  • そのアプリケーションが扱う領域のデータと手続きを書く場所
  • データ、ビジネスルール、ロジック、関数など。

V view

  • UIへの出力を担当する場所。

C controller

  • 入力を受け取りmodelとviewへの命令に変換する

つまり、RailsMVCはそれぞれ何をしているの?

  • Model
    • データベースとのやり取りをする場所。モデルクラス(Active Record)とデータベース(テーブル)を作成する。
  • View
    • その名の通り、画面を表示するファイル。HTMLタグの合間にERBを含む形式で書かれる。
  • Controller
    • 司令頭。リクエストを受け取り、データをモデルから取得したりモデルに保存したりして、最後にビューを用いてHTML出力を生成する。

まとめ

以上、Railsアーキテクチャの説明でした。 それぞれのコードがあるべき場所にあること、意外と難しいです…。 Viewについif分岐を書いてしまうことがよくあります。 (本来きちんとヘルパーに切り出すべき) しっかり意識して良いコードを書いていきたいですね!

参考資料