100日後にエンジニアになるキミ - 11日目 -  インフラ - OSについて

本日はOSについてのお話です。

開発者にとって押さえておかなければいけないものになります。



## OSについて

Operating System、略称:OS(オーエス)で
コンピュータの操作・運を司るシステムソフトウェアのことです。

OSは通常、アプリケーションとハードウェアの中間に位置していて
ハードウェアの効率的な管理を行っており
各種コンピューターからゲーム機器や家電など
最近の電子機器にはほぼほぼ搭載されています。

## OSの目的

![alt](https://s3-ap-northeast-1.amazonaws.com/samurai-blog-media/blog/wp-content/uploads/2019/11/os-yakuwari.png)

参考：sejuku.net/

OSは操作する側に対して様々な機能を提供しています。
・画面表示
・キーボード、マウス操作の受付
・音声の入出力
・記憶媒体の操作

プログラミングは何らかのOSの上で行うことが一般的です。

プログラミングを行う上では
OSの機能を把握しておかないとアプリケーションの作成が
ままならないこともあります。

OSの仕組みや動作を理解し、OSの動きを考えたコードを書くと
高品質なアプリケーションを作ることに繋がります。

## OSの種類

代表的なOS

PCやサーバー用としてｈ
・Windows
・MacOS
・Linux

などがあります。

スマートフォンなどの小型機器用では
・iOS
・Android

などがあります。

**Windows**

WindowsはMicrosoft社が開発したOSで
PCで使用されているOSの中では、世界で最もユーザーが多いと思われます。

Windowsとは一般的に、「WindowsOSがインストールされたPC」のことを指します。

直近で使われているVersionは
Windows 7
Windows 8
Windows 10
などがあります。

操作性、使用感の悪さ、かゆいところに手が届いていないなど
残念なOSです。


**MacOS**

MacOSはApple社が作ったOSで、AppleのPCに搭載されています。
MacOSはAppleのPCにしか今は提供されていないため
MacOSを使いたければMacを買うしかありません。

洗練された非常に素晴らしいOSで操作性と安定感が抜群です。
デザインと使いやすさも素晴らしいです。

プログラムの開発としてはWindowsと共に人気がありますが
エンジニアとして上を目指したければ迷わずMacOSです。

なおMacOS上にWindowsをインストールできるため
AppleのPCを用いれば、両方のOS環境が手に入ります。

**Linux**

プログラミングを行う上でもう一つ欠かせないものが
Linuxです。

Linuxはリーナス・トーバルズが開発したOSで
誰でも無料で自由に改良できるという利点があります。

そのため、使いこなすのは初心者には難しいですが
現在サーバー用途として用いられているOSとしては
一番普及しているものになるので
エンジニアには欠かすことのできないOSになります。

**iOS**

Apple社のiphoneなどのスマートフォン向けに搭載されているOSになります。
元々はMacOSであるので、Macとの相性が良いものです。

iphone向けの開発をしたければ
当然機能や仕様を把握しておくのが良いでしょう。

便宜上、ipadなどはiPadOSなどど呼ぶこともあります。


**Android**

AndroidはGoogle社がLinuxを改良して作ったOSです。
多種多様なスマートフォンやタブレット機器に搭載されています。

最近ではテレビやゲーム機器などにも搭載されています。

こういった機種向けの開発をしたければ
当然押さえておく必要があります。

**そのほかのOS**

UNIX:
大学などの機関で開発されたものが元になっているOSで
現在主流のLinuxの元にもなったOSです。
使う機会はほとんどないかもしれませんが名前くらいは押さえておきましょう。

Google Chrome OS：

Google社が開発したLinuxベースのOSです。
主にChromeBookの上に搭載されています。

Google Playストア対応のChromebookだと
Androidアプリが使えるのも利点です。

これからChromeBookが流行った際には
このOSで動くアプリケーションを開発する機会が増えるかもしれません。

## OS関係の用語

**カーネル：**
OSの中核を構成するソフトウェアで、動作中のプログラムの実行状態を管理したり
ハードウェア資源を管理して、アプリケーションが
ハードウェアの機能を利用する手段を提供したりします。

**シェル：**
コンピュータのOSを構成するソフトウェアの一つで、利用者からの操作の受け付けや、
利用者への情報の提示などを行います。

シェルは入力装置などによるユーザーの操作を受け付け、
対応する動作をOSカーネルや他のソフトウェアに指示し
出力を画面表示してユーザーに返します。

**インターフェース**
両者の間で情報や信号などをやりとりするための手順や規約を定めたもの。
「ハードウェアインターフェース」
「ソフトウェアインターフェース」
「ユーザーインターフェース」などがある。

**ハードウェアインターフェース**
複数の装置を接続して通信する際の仕様で、
コネクタの形状や電気信号の形式などを定めている。

USB、SATA、IEEE 1394、PCI Express、HDMI
などがある。

コンピュータネットワーク（LAN）の場合は
イーサネット（Ethernet）や無線LAN（Wi-Fi）などの通信規格を指す。

**ソフトウェアインターフェース**
プログラム間でデータや指示をやり取りする手順や形式を定めたもので
OSやミドルウェア、ライブラリなどの機能を外部から利用するため規約である
API（Application Programming Interface）などがある。


**ユーザーインターフェース**
コンピュータが利用者に対して情報を表示する方式や、
利用者が情報を入力するための方式を定めたもので
GUIやCUIがある。

**GUI（Graphical User Interface）：**
主に画面上に表示された図形や画像などをマウス操作や
画面へのタッチなどで指定して操作する方式。

**CLI（Command Line Interface）：**
主にキーボードからの文字入力や画面への文字表示を用いる方式
CUI（Character User Interface）とも呼ぶ。

CUIではコマンドと呼ばれるコンピューターを操作する文字列を入力して
操作を行う。

**コマンド：**
コンピュータの利用者がOSのシェルに与える文字列による命令のこと

各OSでは様々なコマンドが搭載されていて
コンピューターを操作することができる。

**ディレクトリ：**
ストレージのファイルシステムなどで、複数のファイルを格納し、ファイルを分類・整理することができる
保管場所のことをディレクトリと呼ぶ。
OSによっては同様の仕組みを「フォルダ」（folder）ということもある。

階層構造になっており
最上位ディレクトリのことをルートディレクトリと呼ぶ。

固有のユーザー用に作られたディレクトリをホームディレクトリと呼ぶ。

ディレクトリは階層構造になるので、現在いるディレクトリの配下にあるディレクトリを
サブディレクトリなどとも呼ぶ。

**パス：**
ストレージ内でファイルやディレクトリ（フォルダ）の位置を表す言葉。
ディレクトリを階層構造と捉えて、最上位から順にディレクトリ名を並べて記したものがパス。

CLIではパスの概念が重要で、階層構造のうちどこで操作を行なっているのかが大事になる。

現在操作をしているディレクトリ位置（パス）をカレントディレクトリ
そこから相対的な位置を表すのが相対パス。

階層構造の頂点(ルートディレクトリ)からの位置を表すのを絶対パスと呼ぶ。

![alt](http://www.ep.sci.hokudai.ac.jp/~inex/y2013/0419/practical/image/path.png)
参考:ep.sci.hokudai.ac.jp


## まとめ

OSは様々な種類があり、用途や開発に合わせて選定されます。
開発を行う際には機能を把握しておく必要があるので
良く開発で用いられているOSについては詳しく勉強してみましょう。

サーバーを用いた開発ではコマンド群を用いていくので
コマンドについても後日やっていきます。

また、OSのシェア争いも開発の流行を左右する目安になるので
シェアの高いOS、高くなるOSについては押さえておくと良いかもしれません。

シェア争いに負けたOSは、その後の開発が衰退、無くなっていくので
市場の動向を押さえながら、開発について学んでいきましょう。


君がエンジニアになるまであと89日

## 作者の情報

乙pyのHP：
http://www.otupy.net/

Youtube：
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw

Twitter：
https://twitter.com/otupython