バックアップと磁気ディスク
上記の書籍を参考にしてバックアップと磁気ディスクについてまとめてみました。
バックアップ
バックアップの方法には、磁気ディスクに保存されている全てのデータをバックアップする「フルバックアップ」や前回の「フルバックアップ」以降に変更されたデータをバックアップする「差分バックアップ」、前回のバックアップ以降に変更されたデータをバックアップする「増分バックアップ」があります。
磁気ディスク
磁気ディスクは「HDD」ともいい、磁性を帯びることが可能な物質である磁性体を塗った円盤状のディスクに「データを記憶する装置」です。セクタ方式を採用しています。セクタ方式とは1トラックを複数のセクタ(扇形)に分割して1ブロックを1個または複数のセクタにまたがって記憶する方式です。
磁気ディスク装置のアクセス時間は、位置決め時間、回転待ち時間、データ転送時間の和で求めることができます。データの追加・削除の繰り返しで起こるデータの断片化のことを「フラグメンテーション」と言い、解消する操作を「デフラグ」と言います。
クライアントサーバシステム
上記の書籍を参考にしてクライアントサーバシステムについてまとめてみました。
クライアントサーバ
クライアントサーバシステムは、クライアントとサーバーで機能を分散させる「分散処理」です。元々は1台の高性能なホストコンピュータにデータや処理を集中させる「集中処理」が主流でしたが、多くのコンピュータをネットワークで接続することで、データや処理を分散させる分散処理が可能となっています。
弱結合
ネットワークの研究は、コンピュータが「核攻撃」を受けたらひとたまりもないという恐怖から生まれました。このネットワークの繋ぎ方には「スター結合」、「強結合」、「弱結合」があります。
スター結合は、ホストコンピュータから放射状にコンピュータを繋ぐやり方ですが、ホストコンピュータが核攻撃を受けたら「全機能が停止」します。
そこで全てのコンピュータを1対1で繋ぐ強結合が考えられますが、「回線が多すぎて無駄」が増えます。
その無駄を減らし、コンピュータ同士を「不規則に繋ぐ」ようにしたものが「弱結合」です。
3層クライアントサーバシステム
プレゼンテーション層、ファンクション層、データベース層の3層構造に分離したアーキテクチャ(コンピュータシステムの論理構造)です。
ストアドプロシージャ
利用頻度の高い命令群をあらかじめサーバ上に用意しておくことです。プロシージャとは複数の処理を1つにまとめたもののことであり、手続きのことです。
シンクライアントシステム
クライアント端末には「必要最低限の機能」だけを持たせるシステムのことです。これはサーバ上でアプリケーションやデータを集中管理することで成り立ちます。実装する仕組みの1つに「VDI」があります。これは、クライアント端末のデスクトップ環境を、仮想化されたサーバ上に集約して稼働させる仕組みです。
NAS
ネットワーク(LAN)に直接接続する「磁気ディスク装置」であり、ファイルサーバ専用機として使われます。
サーバ仮想化
「1台の物理」サーバ上で「複数の仮想」サーバを動作させたり、「複数の物理」的なマシンを「1つのサーバ」として扱ったりするための「技術」です。「ホストOS上」で仮想化ソフトウェアを動作させ、その上で「別のゲストOS」を動かすホスト型、「ハードウェア上」でハイパバイザという仮想化ソフトウェアを動作させ、その上で「複数のゲストOS」を動かすハイパバイザ型、OS上にコンテナエンジンという管理ソフトウェアを動作させ、その上でコンテナと呼ばれる実行環境を動作させるコンテナ型などがあります。
ライブマイグレーション
ある物理サーバで稼働している「仮想サーバ」を停止させず「別の物理サーバ」に「移動させる技術」です。
スケールアップ
個々のサーバの「CPUやメモリなどを増強する」ことで、システムの性能を向上させる手法です。
スケールアウト
「サーバの台数を増やす」ことで、システムの処理能力を向上させる手法です。
AIとは
下記の書籍を参考にしてAIについて軽くまとめてみました。
AIとは、人が行うような学習、認識、予測、判断などの知的な活動を、コンピュータにさせる取り組みや「技術」のことを指します。
学習の仕方は主に5パターンあります。機械学習、教師あり学習、教師なし学習、強化学習、ディープラーニングの5パターンです。
機械学習は、「大量のデータ」をコンピュータに解析させ、コンピュータ自らが「予測や判断」などをできるようにさせることです。
教師あり学習は、あらかじめ「問題と正解」をコンピュータに提示し、誤りを指摘することで、コンピュータ自らがその「特徴を学習」することです。
教師なし学習は、コンピュータ自らが、「統計的性質やある種の条件」に従い、データのグループ分け(クラスタリング)や「情報の集約を行う」ことです。
強化学習は、試行錯誤を通して、「報酬」が最も多く得られるような方策を学習することです。
ディープラーニングは、人の脳神経細胞を模倣したモデル「ニューラルネットワーク」で解析し、AI自らがデータを判別するための特徴を探し出すことです。
ハードウェアとCPU
ハードウェアやCPUに関する情報をまとめておきます。
コンピュータのハードウェアは「制御装置」、「演算装置」、「記憶装置」、「入力装置」、「出力装置」で構成されています。物理的に存在する装置であります。逆に記憶装置に記憶された「1」、「0」の信号として存在するプログラムは「ソフトウェア」と言います。現在のコンピュータは主記憶に記憶されたプログラムを順に取り出し、解読・実行する「プログラム内蔵方式」です。
その中でも「制御装置」と「演算装置」は、まとめて「CPU」(中央処理装置)と言われます。CPUはコンピュータの頭脳にあたり、「プロセッサ」とも呼ばれています。
CPU内部の「クロック周波数」は「内部クロック」と呼び、CPUと主記憶などの周辺回路を結ぶ伝送路のクロック周波数は「外部クロック」と呼びます。
クロック周波数とは、「コンピュータの動作の基準となるクロック信号の高低のサイクルが1秒間に繰り返される回数」のことです。
CPUや主記憶、キャッシュメモリなどで、データを送受信するための伝送路のことを「バス」と言い、バス幅が広く、クロック周波数が大きいほど高速にデータを送受信することができます。
記事を書くにあたって上記の書籍を参考にしました。
計算機がコンピュータになるまでのプロセス
計算機がコンピュータになるまでのプロセスの一端を紹介したいと思います。以下の書籍の内容を参考にしております。
汎用性
複雑な計算でも高速で行ってくれる機械が「電子計算機」です。そして計算専門でなく、色々な用途で使えるようになった「汎用性」のある機械がコンピュータです。
情報のコード化
この「汎用性」はどのようにして生み出されたかというと「情報のコード化」にあります。例えば大学生という1人1人の人間の姿は、簡単に表現できない曖昧な情報です。しかし「名前」が付与されることによって、1人1人の区別がしやすくなりました。さらに「学生番号」が付与されることによって、「同姓同名」の学生を区別することも可能になっています。
このように、名前や学生番号の付与のようなことを「情報のコード化」と言えるのではないでしょうか。学生番号というシンプルに管理されたコードのおかげで、学生たちは図書館の利用や課題の提出など、幅広い場面でスムーズに行動できるようになりまります。
物理学の盲点
情報のコード化によって、電子計算機は計算以外の用途でも使えるといったことを提唱したのは、クロード・シャノン(1916-2001)でした。
コンピュータを「計算マシン」を「汎用マシン」に生まれ変えさせるきっかけとなったこの「情報理論」は、実は物理学の盲点でもありました。
19世紀から20世紀にかけては、世界を動かす原理を「物理とエネルギー」から解き明かそうとした時代でした。しかしシャノンが提唱したことこそが、「物理学だけでは解き明かせないものが情報である」といったことでした。
なぜそんなことが言えるかというと、サルにペンを持たせて何かを書かせた「紙」も、人間が考えて文章を書いた「紙」も、物理学から見れば物質の構成も光の反射も同じだからです。でも実際僕たちから見ればそれそれの紙は「全く異なる情報」として受け取ることができるはずです。
情報の原子「ビット」
この情報のコードを最小の単位で表したものが「ビット」です。これは「0」と「1」のことです。数字を表記するのに0~9という10種類を使い分けるよりも、たった2種類だけの方がシンプルということでしょう。
デジタルとアナログ
ビットでコード化された情報の例を挙げましょう。音楽で言えば、生演奏やカセット・テープはアナログな情報です。しかし「CD」は、ビットの単位まで分解して記録されたデジタルな情報になります。17時10分05秒と表示される「デジタル時計」のように不連続的に区切られているデジタルな情報もコード化されたものであります。
Railsのデータベースについて
Railsで扱うデータベース関連の知識をまとめておきます。
database.yml(データベースヤムル)
Railsアプリケーションのデータベース設定ファイルです。configディレクトリ内にあります。このdatabase.ymlを編集することによって、データベースの設定を「運用環境」ごとに変更できます。
運用環境
システムを「どこで使用するか」定められている環境です。運用環境には3つの種類があります。development(開発環境)、test(テスト環境)、production(本番環境)です。これは環境ごとに設定の変更が必要な場合があることを指します。「バグを探しやすいツール」のように、開発環境で導入すると便利でも、本番環境では余分なツールになる場合があるからです。
ローカルサーバーの再起動
ブラウザを更新すれば、VS Codeでの編集内容が反映される場合が多いです。開発環境で「Rubyバージョンの変更」、「テーブル・カラム情報の変更」、「Gem導入状況の変更」などを行なった場合は、ローカルサーバーを再起動しなければ編集内容が反映されません。
utf8
database.ymlで、「データの保存形式を変更したい」ときに扱います。Railsの最新バージョンでは、「データの保存形式」が絵文字に対応したものの、「マイグレーション」では絵文字に対応していません。互換性がある状態にするためには、「encoding:utf8mb4」を「encoding:utf8」に変更する必要があります。
MySQL
RDBMS(リレーショナルデータベースマネジメントシステム)の1種です。リレーショナルデータベースは、レコードとカラムでデータを管理するデータベースのことです。そのリレーショナルデータベースを管理するシステムがRDBMSです。
RDBMSの中でもMySQLは、「拡張機能が多い」、「小規模から大規模のデータの取り扱いが可能」、「柔軟性が高い」といったメリットがあります。
複数の静的ファイルがブラウザで適用されるまでの仕組み
サーバーサイドでは色々な言語が用いられますが、ブラウザはHTML、CSS、JavaScript、WebAssemblyといった4つの言語しか認識できません。つまりRubyが埋め込まれたHTMLであるERBなどは認識できないということです。
高級言語と低級言語
しかしHTML、CSS、JavaScript、WebAssembly以外にも、より書きやすくて読みやすい言語を作りたいと開発者は考えます。このような人間が理解しやすい言語のことを高級言語と言います。逆に機械が認識できる0と1のコードのことを低級言語と言います。
コンパイル
高級言語を低級言語に「翻訳」する作業のことをコンパイルと言います。コンパイラと呼ばれるプログラムによって行われます。しかしコンパイラでは認識できない言語もあります。
プリコンパイル
「コンパイラが認識できない言語」を翻訳できるようにする事前コンパイルのことをプリコンパイルと言います。またブラウザに表示させるという「メインの処理」に必要な事前の処理でもあります。
アセットパイプライン
プリコンパイルは、アセットパイプラインという流れの1部でもあります。高級言語で書かれたファイルをブラウザで表示させるまでには、「プリコンパイル」した複数の静的ファイルを「連結」させ、「圧縮」して軽量化したものをpublicディレクトリに「配置」するという「仕組み」があります。この仕組みがアセットパイプラインです。
Railsでは、「Sprockets」というGemによるアセットパイプラインがデフォルトで用いられています。これによってCSSやJavaScriptのプリコンパイルが可能になっています。
しかしRailsのバージョン6以降から、「モジュールパンドラ」を使用したプリコンパイルが主流となりました。これは、JavaScriptのライブラリ機能を合わせて開発することが増えたからです。
Sprocketsに関する記述
Ruby on Railsの雛形を作成した際、app/assets/stylesheets/application.cssに「*= require_tree .」という記述があります。require_treeは、引数として与えられたディレクトリ以下のCSSファイルをアルファベット順に全て読み込むという機能を持ちます。「.」(ドット)はカレントディレクトリを表すため、「require_tree .」の記述によって、app/assets/stylesheets/というディレクトリにあるCSSファイルは全てapplication.cssに読み込まれることになります。
このrequire_treeの前にある「*=」はコメントアウトに見えますが、GemであるSprocketsの特殊な記法(ディレクティブ)であり、その行を意味のある記述として認識してもらうためのものです。
モジュール
モジュールとは「処理のまとまり」のことです。JavaScriptにおいて、複数の機能をファイル単位で分割してしまうと、読み込み順によってエラーが生じるといった問題が発生します。そのため、Node.js環境下では、ファイル単位ではなく、モジュール単位で機能を扱います。モジュールは「他の部品と合体可能な部品」であり、機能を1つずつ分けて、他のファイルから読み込めるようにした「処理のまとまり」のことです。
このことによって、読み込み順によってエラーが発生するといった問題は解決します。しかし、複数に分かれたモジュールの依存関係によって、読み込みできていないモジュールがあると正しく動作できないといった問題が発生します。
モジュールパンドラ
この「モジュールの依存関係を解消」して、モジュールを一括で束ねて管理してくれるのが「モジュールパンドラ」です。
webpack
webpackは「モジュールパンドラの一種」です。様々なJavaScriptをひとまとめに管理するためのツールです。webpackは主にエントリー、アウトプット、ローダー、プラグインの4つのことを行います。
エントリー
依存関係解消のために「どのファイルを基準とするか」を決めることです。
アウトプット
基準にされたファイルを「どこへどのような名前で出力するのか」を指定することです。
ローダー
JavaScript以外のHTMLやCSSなどのファイルを「モジュールに変換する方法を読み込み」、指定された処理を行うことです。
プラグイン
圧縮のように、ファイルをまとめること以外で、ローダーが実行できないタスクを導入して「拡張」することです。
このwebpackを用いることで、JavaScriptのライブラリとJavaScript以外の様々な言語を変換、圧縮した上で、好きな場所に配置することが可能になります。
webpacker
webpackをRails仕様にした「Gem」です。Railsにwebpackを導入してコマンドで操作することができますが、設定ファイルの記述に難易度があります。この設定を簡易化してくれるのがwebpackerです。
このwebpackerはRailsバージョン6以降からデフォルトで導入されています。近年では「Sprockets」よりも「webpack」を利用する方針に転換されています。これはJavaScriptのライブラリが充実してきたからです。
webpackerはSprocketsのアセットパイプラインと同じような静的ファイルのプリコンパイルに加えて、JavaScriptのパッケージを管理できるといったメリットがあります。