ume

クッキーとセッションについての復習

#記事の対象者 誰のために⇨cookieとsessionの理解が十分でない方.
何を⇨cookieとsessionの仕組み 記事を書いている私の紹介⇨現在webの知識を勉強して7ヶ月ほど経過しました。そこで今まで私はかなりcookieとsessionの理解は、cookieはログインするために必要でsessionはログインを維持するものだろうって感じやろってフワッと解釈していました。そこで具体的に学んだ結果理解が深まったので記事にさせていただきます。

cookieとは

⇨個人情報が入っている箱のイメージです. 個人情報の例ユーザーidやsession_idなど個人を特定するための情報.
session_idとは個人を特定するためのものぐらいの認識でオッケー.
誰からもらうの?.
⇨サーバー.
どこにcookieはあるの?.
ブラウザーの中(safarigoogle chromeの中).
cookieはいつもらえるの?.
⇨ログイン前やログイン後.
cookieはなぜ必要なの?. ⇨ログイン状態を保つため.
どういう時にcookieを使うの.
⇨webサーバーに何かしたのリクエストを送る時に使う. リクエストの例会員情報見せてなど.

図にするとこんな感じ. 1回目アクセス時にユーザーの情報をwebサーバーの中に保存するとともにcookieを作成しcookieの中にもユーザーの情報などを保存しユーザーにcookieを渡す.
また別の方法でブラウザー側にcookieを渡す方法としてjavascript使用しユーザーがhtmlを読み込んだ時点でブラウザーcookieを持っている状態にすることも できるみたいです.

sessionとは

⇨サーバーが持っている「さっきアクセスしてきた奴リスト」のこと.
さっきアクセスしてきたやつとは「過去にcookieを渡したことあるブラウザー」.
いつこのリストが作られるのか?.
cookieが作られたとき.
sessionはなぜ必要? ⇨個人を特定するため.
sessionはどのように使われるのか?.
⇨今アクセスしてきたユーザーのユーザー情報がさっきアクセスしてきた奴リストの中にあるかどうかをチェックする.
ある場合.
⇨そのユーザーのリクエストに対してのレスポンスを返す.
ない場合.
⇨ログインしてと促す.

疑問

疑問1,じゃあ一回ログインすると永久的にログインしていることになりログインし直す必要はなくなるの?だってログインしている状態を保つには、ブラウザー のcookie情報とwebサーバーの中のさっきアクセスしてきた奴リストの中のcookieの情報が同じだったらログイン状態を保つ、何回アクセスしてもブラウザーcookieの情報とwebサーバーのリストの中の情報が同じだから、つまり永遠にログイン状態なんちゃん? ⇨長期間ログイン状態を保つことは可能で、ログインし直す必要があるときは、以下の時.
①自らログアウトした時 ⇨webブラウザーのさっきアクセスしてきた奴リストの中の自分を特定する情報が削除される= 次回アクセスしてきた時webサーバーはあんた誰的な状態になり再度ログインするよう促す.
ブラウザー内のcookieの有効期限が切れた時.
ブラウザー内でcookieの有効期限が切れるとwebサーバー内のさっきアクセスしてきた奴リストの中の個人を特定するための情報も削除されるので、結果再度ログインが必要

データベース 正規化の欠点と非正規化

この記事を読む前に

誰のために記事にするのか.
⇨データベースをまだ学んで日が浅い未経験者のエンジニアを目指している方.
何を記事にするのか.
⇨データベースと正規化の目的のおさらいとデータベースの正規化の欠点と非正規化について,正規化がもたらすデメリットと非正規化のメリット.

目次

①データベースと正規化の目的.
②正規化と検索SQLのパフォーマンスはトレードオフの関係.
③まとめ.

①データベース、正規化の目的

データベースの目的.
⇨たくさんのデータを保管すること。それは後からデータを活用するために保存している.
注意データベース内には間違ったデータが保存されてはいけない.

正規化の目的は データの整合性を保つこと.
データの整合性を保つとはデータベース内に間違ったデータが管理されないようにする、またデータベースに間違ったデータが保存されないようにするということ. 間違ったデータとは.
⇨データを保存する際ルールがありルールに従わずに保存されたデータは間違ったデータである。 ルールとはデータベース内のデータは一意に特定できないといけない。 例えば  顧客テーブルがあったとして ↑のようなテーブルはデータベース内に保管できない。要は間違ったデータが保管されていることになる。 どこが間違っているかというと顧客IDの中に2つ同じ値がある=データを一意に特定できない.
↑の画像の例でいくと顧客IDが1の値が2つある。これだとデータベースから情報を取得する際に田中か佐藤のどちらの情報を取得すればいいのかPCにはわからない.なのでこの場合顧客IDが1だと田中、2だと佐藤のように顧客IDを指定すると必ず特定の値を示すようにしないといけない.

つまり正規化はデータベースが正しくデータを保存ための方法として正規化がある.

②正規化と検索SQLのパフォーマンスはトレードオフの関係

トレードオフとは「両立できない関係性」を示す言葉として使われています。 言い換えると、一方を尊重すればもう一方が成り立たない状態のこと。 例えば 格闘技で言うと体重を増やすほど力は強くなるが動くスピードが落ちる、逆に体重を減らすほど力は弱くなるが動くスピードが上がる.
つまり力を強くしスピードを上げるのは難しい.
正規化と検索SQLのパフォーマンスも格闘技と同じ関係である.
正規化してデータの整合性を高めれば高めるほど検索SQLの処理に時間がかかり、重複している値を放置(非正規化)しているとデータの整合性が保ちにくくなる が検索SQLの処理の時間が短くなる.

ここでの私の疑問.
なんで正規化したらSQLでデータを取得するスピードは遅くなるん?正規化するとデータの重複(無駄)がなくなりデータベースからデータの取得スピードは上がりそうなのに.
答えは正規化したテーブルからSQLを使ってデータを取得する際『内部結合or外部結合』を行なってからデータを取得しているため.
内部結合と外部結合とは要は複数のテーブルを1つにまとめてから情報を取ってくること.
内部結合と外部結合はSQLで行うわけだがこの処理はSQLからするとすごいコストのかかる作業であるがために処理時間がかかる。特にテーブル数、テーブルのレコード数が増えれば増えるほど処理時間がかかる.
例えば、会社、社員、部署といった3つのテーブルがあったとする このデータベースから、田島さんが勤めている会社を知りたいとする.
会社

会社コード 会社名
C0001 A商事
C0002 B化学
C0003 C建設

社員

会社コード 社員ID 社員名 年齢  部署 
C0001 000A 加藤 40 D01
C0001 000B 藤本 32 D02
C0001 001F 三島 47 D03
C0002 000A 斎藤 47 D03
C0002 009F 田島 25 D01
C0002 010A 渋谷 33 D04

部署

部署コード 部署名
D01 開発
D02 人事
D03 営業
D04 総務

SQLを使ってデータベースから田島さんが勤めている会社を取得する際.
データベースは会社テーブルを見ても会社はわかるけど田島さんがどの会社に勤めているかわからない、社員テーブルを見ても田島さんはいるがどこの会社に勤めているかはわからない。ただ外部キー(会社コード)を社員テーブルは持っていると認識する.そこでデータベースは田島さんと田島さんが勤める会社が1つのテーブルに存在すれば田島さんの勤めている会社わかるよーとなる。つまり正規化して分割したテーブルを元の1つのテーブルに戻せばデータベースから欲しい情報が手に入る。そこで複数のテーブルを1つに戻すことを結合といい。内部結合と外部結合の2種類ある.
今回は内部結合で取得する.
それぞれの使い分けは後ほど紹介する.

SELECT
    会社.会社名
,   社員.社員名
FROM 社員 INNER JOIN 会社 
  ON 社員.社員コード = 会社.会社コード
WHERE 社員.社員コード = '田島';
会社名  社員名
-----  -----
B化学   田島

次は会社ごとに社員数の数が知りたいとする.

SELECT
    会社.会社コード
,   COUNT(社員.社員名) AS 社員数
FROM 会社 LEFT OUTER JOIN 社員
   ON 社員.会社コード = 会社.会社コード
GROUP BY 会社.会社コード

ここでは外部結合を使用する.

会社コード  社員数 
-----    -----
C0001    3
C0002    3
C0003    0

内部結合と外部結合の使い分け方.
⇨取得したいデータによって使い分ける. 例えば.
先ほど説明した会社ごとに社員数の数が知りたいといった時に内部結合を使ってデータを取得すると

会社コード  社員数 
-----    -----
C0001    3
C0002    3

このような結果が返ってくる。 内部結合はテーブルを結合する際「両方のテーブルに共通するものを取得する」 ここで上の社員テーブルと会社テーブルを見比べてみるとC0001
C0002が両方のテーブルに存在するのでこの2つの会社それぞれの社員数を表示することになる.
外部結合は「どちらか一方のテーブルに値が存在していれば値を表示する」 C0003 は会社テーブルにしか存在していないが結合するテーブルの片一方に存在していればいいのでc建設の会社の社員数が表示される.
つまり 内部結合は両方に共通する値なので=and 外部結合はどちらか一方にあればいいので=orと覚えればわかりやすい 内部結合のinnerのnはandのこと.
外部結合の外は英語でoutでoはorのこと.

まとめ

非正規化にするか正規化するか迷いどころだが基本的に正規化する方が良い。非正規化は最後の手段である.
参考文献 達人に学ぶDB設計 徹底指南書

データベース後半 正規化〜ER図

前書き

前回実際にデータベースの概念設計の流れについて簡単に説明しました。今回は前回の続きのER図の作成〜物理設計までを実際に手を動かしながら学んでいき新しい発見や気づきを記録として記事にしていこうと思います。

目次

⑤ER図の概要〜ER図の作成まで(テーブルとテーブルの関係性を可視化して関係性を分かりやすくする。正規化を行うとテーブルが増えて関係性が分かりにくくなるので).

ER図とは

⇨テーブル同士の関係性を可視化しデータベースの設計内容を簡単な図にしたもの. 要はER図はデータベースを作成する設計図。

ER図を作成する目的.
⇨①誰でもデータベースの仕様を変更できるようにするために書く。 システムは一度構築すれば終わりではなく、長年稼働しながら改修を繰り返していく。その時チームが10人で、そのうちの1人がデータベースを設計したとする。データベースを作った人がそのチームから別のプロジェクトに異動した際にER図がないと残りの9人がデータベースの仕様を変更しないといけない時にテーブル同士の関係性がわからず困ったり,変更するのに時間がかかる。そうならないようにER図を作成しデータベース設計者以外の人もデータベースの設計内容を理解することで変更を容易にできるようにするためにER図を作成する.
⇨②データベース作成者がデータベース作るためにミスしないようにするため

E = entity(テーブル) R = relationship(関係性)

例 学校のER図を作成する際

校長 - 学校→ 生徒 ↔️ 科目となる

用語.
校長、学校、生徒、科目=entity.
-,⇨、↔️=relationship.
上の学校のentityとrelationshipの関係性を考えてみよう.
entityとrelationshipの関係性3種類.
①1対1.
⇨校長というテーブルと学校テーブルの関係性を考えてみると 1人の校長に対して学校は1つなので 1対1の関係性が成り立つ.
②1対多.
⇨学校と生徒の関係性を見ると.
学校1つに対して生徒は複数在籍している.
なので1対多の関係が成り立つ.

③多対多.
⇨学生と科目の関係性を見ると 学生1人に対して複数の科目を持っているし、1つの科目からしても複数の学生に履修されているので.
多対多の関係が成り立つ.

ER図の書き方.
IE表記法で書いてみる別名「鳥の足表記法」.
手順.
①エンティティの抽出 ②属性を割り振る 四角の箱の上半分に主キー,下半分に主キー以外を書く.
③テーブル間の関係性を鳥の足でつなぐ | = 1を表し.
○ =ゼロ以上. 三 = 複数.
要約すると1(会社テーブルの会社ID)に対し0以上(社員テーブルの外部キー(会社ID))の多という意味になる.

データベース具体的な作成手順 前編 

前書き

データベースの知識がざっくりしているのでデータベース設計に苦戦しています。そこで各用語をおさらいしながら実際にデータベースの論理設計をしていき理解を深めるとともに、私のような初学者の方のお役に立つように記事に残したいと思います。

目次

①データベースの作成手順.

データベースの作成手順.

①画面設計.
②テーブル設計.
③カラム設計.
④テーブルの正規化.
⑤ER図の作成(テーブルとテーブルの関係性を可視化して関係性を分かりやすくする。正規化を行うとテーブルが増えて関係性が分かりにくくなるので).
⑥データベースの作成(①〜⑥で作成したデータベースの設計図を元に作成する).

画面設計とは

⇨どんな画面にするのかを決める=viewの作成=ユーザーさんが実際に見る画面のこと ↑何かしらの商品の注文を受ける注文書の画面を作成しようと思います.
なぜユーザーさんが見ている画面から作成するのか?
⇨それはその画面を操作するのはユーザーさんだからです。なのでユーザーさんにとって最も使い画面を先に作ってからデータベースの作成を行う.
ユーザーさんが実際に見る画面のことをUl(user interfaceという)

テーブル設計

⇨どんなテーブルが必要なのかを決めるのがテーブル設計.
どんなテーブルを作成すればよいかの方法.
⇨①画面設計で作成した画面は「何をするためのシステムかを考える」.
注文書なのだから注文をするための情報がデータベースに登録されるんだろうなと推測できる.
注文書を作成するためには「注文」というテーブルが必要そうと推測する ②5W1Hを考えてどんなテーブルが必要かを絞る 今回の注文書では「いつ」「誰が」「何を」注文するのだろうと考え、それらに該当するのは「注文日」に,「顧客」が,「商品」を,というように当てはめ、この該当するテーブルは必要そうと推測.
5W1Hとは=when ,where, what,who,why,how

カラム設計

⇨テーブル設計したテーブルの中にはどんなカラムが必要なのかを考える.
↑これらのテーブルの中に 注文書の中の項目(氏名、電話番号、住所など)管理するべき情報をどのテーブルのカラムとして持たせるのかを考える.
管理するべき情報を各テーブルに配置するとこんな感じ↓.
注意:注文書の中の項目を各テーブルのカラムに追加するのはもちろんだが、ユーザーが見ている画面には表示しないけど管理すべき項目があったりする場合がある。そういった項目もどのテーブルの中のカラムに割り振るか考える必要がある。今回はそういった項目はない.
ここから作成したテーブルとカラムを再度見渡し今回必要なさそうなカラムやテーブルを見直す.
 注文日年月日というカラムは注文テーブルに移してもいいと判断し、注文日というテーブルは必要なさそうなので消す.

テーブルの正規化

→正規化とは1つのテーブルの中のデータの重複や無駄をなくすこと.
正規化の目的.
⇨①テーブルの独立性を高める. ②データ容量の削減をし、データ処理の効率も良くしユーザーが快適にサービスを利用するため.
正規系とは.
⇨正規化された後の状態のこと=無駄や重複を取り除いた後の状態のこと 正規化の種類. 第一正規系〜第五正規系まである。この記事では第三正規系までを紹介するものとする.

正規化前(無駄を省く前の状態).
⇨何がいけないのか?それは1つのフィールドに複数の値が入っている。上の例でいくと商品カラムの中の1つのフィールドにtシャツ、靴下、スニーカーが入っている。それの何がいけないのか?⇨データベースから情報を正確に取得できない。例えば田中太郎さんが注文したtシャツの情報を取得しようとした時にpcはtシャツ、靴下、スニーカーのうちどの商品を取得したらいいのかわからない。そこで解決策が↓

第一正規系. ⇨1つのフィールドに1つの値しか含まない状態にする.

第二正規系. ⇨第一正規系から部分関数従属を取り除いた状態.

部分関数従属とは? ⇨複数の主キーがある場合に主キーの一部(2つの主キーの内1つの主キー)によって決まる値のこと=Aの値が決まるとBの値も決まることを部分関数従属.
具体的に例を挙げて見ていこう.
前提として先ほどのテーブル(第一正規系のとこで使用したテーブル)にもう1つ商品IDという主キーを追加し今注文ID と商品IDの2つの主キーがあります.
それぞれ注文ID と商品ID に従属している列があるか1つずつ見ていこう= それぞれ注文ID と商品ID=A 、従属している列=B ⇨Aが決まるとBが決まる列があるか探す.
まず注文IDの場合『注文日』『注文者』は注文ID に従属しているとわかる=A(注文ID)が決まるとB(注文日、注文者)が決まる状態です.
なぜならばテーブルを見てわかる通り1行目の注文IDが001の時、注文日は2019/11/26日になり 2行目の注文ID も001の時、注文日は2019/11/26日になっています.
つまりA(001)の時、必ずB(2019/11/26日)になるということは,Aの値が決まるとBの値も決まる関係になっているので注文日は注文IDに従属しているとわかる。 同様に注文者も注文ID に従属しているとわかる、注文IDが001の時必ず田中太郎さんになるので、A =Bの関係が成り立つ.
商品IDと商品名も同様の見分け方で部分関数従属があるとわかる.
部分従属かどうかの見分け方.
A=Bの関係になっている.

そもそもなぜ第二正規系にしないといけないのか=なぜ部分関数従属を取り除かないといけないのか.
⇨それはデータベースに変更を加えられた際「簡単にデータの更新ができるようにするため」『データの整合性を保つため』.
どういうことかというと.
例えば.
このテーブルの商品ID A-002の商品名靴下→バッグに変更したい時を考えた場合.
2行目の商品ID A-002の靴下と5行目の商品ID A-002の靴下両方の靴下のフィールドをバッグに変更する必要がある。靴下をバッグに2回書き直すぐらいならいいですけどこれが100個、200個の靴下があった場合、靴下⇨バッグに変更する作業は大変です.
そこでデータベースに変更を加えたい場合1ヶ所変更すれば全部の箇所変更できたら便利そうです=簡単にデータの更新ができたら良い.
また靴下⇨バッグに変更する際入力ミスを起こした際、例えば2行目の靴下→バッグ、5行目の靴下→バックなどにしてしまうと, データベースが「あれ?A-002の商品名はバッグ、バックどっち?」といったようにどちらが正しい情報か判断できなくなる=データの整合性が保てていない.
この2つの理由から正規化する必要がある.

第二正規系にするためにすること.
⇨部分関数従属する属性を別テーブルとして切り出してやればいい.
今回の場合 商品ID と商品名と単価を別テーブルに取り出す。 と部分関数従属が解消され商品名が変わっても1ヶ所修正すれば全ての行に変更が加えられるので管理が楽になる. またデータの整合性も保たれる.

第三正規系.
⇨推移的関数従属を取り除いた時の状態.
推移的関数従属とは.
⇨Aが決まるとBが決まり、Bが決まるとCが決まること.
上のテーブルでは{ 会社ID, 社員ID } → { 部署ID } → { 部署名 }の順番で値が決まる.
{ 会社ID, 社員ID } = A { 部署ID } = B { 部署名 } = C

このテーブルの何がいけないのでしょうか? ⇨それは一時的に誰も存在していないけど部署としては存在しているという状態をテーブルに反映できていない状態.
例えば 実は事務と言う部署があるが誰も経理に存在していないみたいなものを表現できていない.
解決策は推移的関数従属が起きている部分を別のテーブルに切り出す.
元のテーブルに外部キーを残しテーブルを分割することで事務という部署があるが誰も今はその部署に存在していないということが表現できるようになる 少し長くなってきたので実際に注文書を例に次回正規化を行いたいと思います

          

データベースの必要性と具体的な作成手順

前書き

今プログラミング学習歴7ヶ月ぐらいで初心者なのですがアプリケーションを何か一つ作成しようと思っています。そこでウェブアプリ作成時にデータベースを学ばないとそもそもアプリケーションを作成できないということを知りました。そこで今回はデータベースの必要性とデータベース作成手順を記事にしたいと思います。

目次

①データベースの必要性.
②データベースの作成手順.

データベースの必要性

もしデータベースがなかった場合とデータベースがある場合を想像してみる。 例えばTwitterに新規登録して、アカウントを編集する場合を例に出してみる.
データベースがある場合

データベースがない場合 補足、1回目のアクセスとはブラウザーを開いて閉じるまでを1回目のアクセスと呼ぶことにする. つまりデータベースがないと「自分の情報を長期間どこかに保存できないしまた,後日その情報を使用できない」.

上の図からデータベースには次の役割がある.
①永続的にデータを保存. ②データの登録、取得、編集、削除

データベースの作成手順.

全体の流れ.
①画面設計(どんな画面にするのかを決める=viewの作成).
②テーブルの設計(どんなテーブルが必要なのか).
③カラムの設計(③で設計したテーブルの中にはどんなカラムが必要なのか).
④テーブルの正規化(テーブルの中に重複や無駄をなくす).
⑤ER図の作成(テーブルとテーブルの関係性を可視化して関係性を分かりやすくする。正規化を行うとテーブルが増えて関係性が分かりにくくなるので) ⑥データベースの作成(①〜⑥で作成したデータベースの設計図を元に作成する) ⑦テスト.

データベースの必要性とデータベース設計について

前書き

私はプログラミング学習歴6〜7ヶ月の初心者です。基礎学習をある程度終えてポートフォリオを作成しようと思ったのですがデータベースを自ら設計したことがなくそもそもデータベースの知識なしでは良いアプリは作れないので初心者の私がデータベースの設計について学んだことを共有させていただきたいと思い記事に残します. またこれからデータベースを始めて学ぶ方が本記事で少しでもデータベースの概要を抑えられるように記事にしています。

目次

①そもそもデータベースとは.
②データベース設計とは、またなぜデータベース設計が大切なのか.
③データベースからデータを取得する際のデータベースの裏側の挙動について.

①そもそもデータベースとは

データベース=たくさんのデータの集まり。 役割としてはデータの保存と後から保存したデータを活用するためにデータベースが必要.
たくさんのデータの集まり?どのようにデータを活用するのか?
コンビニを例に挙げてみる.

データベースが「パン」「120円」というデータを覚えてくれているおかげでレジのスキャナーで商品のバーコードを読み取ると120円ですと画面に表示される. 上の画像の通りデータベースは例えばコーラ、150円や唐揚げ180円などのたくさんのデータを保存しており、後から簡単に保存したデータを取得し活用できる。

②データベース設計とは、またなぜデータベース設計が大切なのか.

データベース設計とは⇨どのような情報をどういった構造でデータベース化するのか設計することが必要です。このことを「データベース設計」(データモデリング)といいます。例えると家を建てる前の設計図に似ている。家の設計図を作る際ドアの大きさ、ドアを設置する角度等を事前に決めておかないと、設置してから「ドアが歪んでいる」、『ドアが大きすぎる、小さすぎる』など後から取り返しのつかない問題が発生するようにデータもどういった構造でどのようにデータベースという家に置くのかを事前に決めておくことで色んな問題を引き起こさないようにしている

③データベースからデータを取得する際のデータベースの裏側の挙動について.

例えばTwitterのようなアプリがあるとして全ユーザーを画面に表示したい時Userみたいなボタンをクリックするとこのように全ユーザーが表示される.
この時viewからデータベースに全ユーザーの情報を頂戴という指示が飛びデータベースはその全ユーザーの情報をviewに返してるので全ユーザーが画面に表示されているのですが。この時データベースはどのようにユーザーのほしいデータを取得しユーザーにデータを渡し表示しているのかの挙動を見ていく.
その際3つの概念を知る必要がある.
①外部スキーマ=今自分が見ている画面のこと=view.
②概念スキーマ=テーブルの種類とか決めることリレーショナルデータベースにするとか階層型にするとか決める.
③内部スキーマ=データベースのデータの型を決めるstring型にするとか数値型にするとか.

linuxの概要やメリットについて

前書き

過去にLinuxを一度学んだんですが理解が曖昧でそもそもlinuxって『osの1つ』ぐらいの浅い理解で終わっているのでもう一度学び直し理解を深めるとともに同じような初心者の方の助けになればと思い記事にしています。

目次

linuxとは.
linuxをなぜ使うのか.

linuxとは

⇨osの1つ

osとは.
⇨ハードウェアとソフトウェアを管理するためのもの 具体的に

①キーボードから文字を入力すると、入力した文字が画面に表示される.
②マウス・タッチパッドなどで画面を操作できる.
③イヤフォンを指すと、イヤフォンから音が聞こえる.

osはこれらの機能を管理してくれている。なのでパソコンのキーボードで文字を打つと画面に文字が表示されたりする。 osがないとキーボードで文字を入力しても画面に表示されない.
人間に例えると、 パソコン本体は「体」で、 OSは「脳」の役割 を果たしています.
手を動かす、足をうごかすっていう1つ1つの動作は脳からの指示があって初めて動く. パソコンも同様にosが文字を表示してという命令やイヤフォンが指されたら音を出してなどの命令を行う

# linuxをなぜ使うのか なぜmacに使われているosやwindowsに使われているosではなくcloud9などではlinuxを使うケースが多いのでしょうか?
⇨理由は様々だと思いますが以下のことが挙げられます。 ①オープンソースで無料だから appleのosやマイクロソフトのosは有料であるがlinuxは無料公開されているから.
linuxは技術が枯れているから.
linuxは長年たくさんのユーザーに使ってもらって問題もなく使っていただいており大きく変更をする必要がない=技術が枯れているから