shiki0331’s blog

Webエンジニアの勉強ブログ。HTML/ CSS / JavaScript / Ruby / Ruby on Rails / React.js を中心に学んでいます。 ブログ内容で間違っている箇所などありましたら、ご指摘していただけると助かります。

「コンピュータはなぜ動くのか」まとめ。GW企画

GWなのでたくさん本を読んでいきたいと思います。

読むだけではあまり知識が定着しなさそうなので、自分で大事そうなところをまとめてアウトプットしていきますー!

 

「コンピュータはなぜ動くのか」

まずは1冊目の「コンピュータはなぜ動くのか」をまとめていきます。

 

shop.nikkeibp.co.jp

 

本の概要を簡単に説明すると、前半はコンピュータの基礎知識について学びます。

中盤から後半にかけては、データ構造・データベース・TCP/IPなどの知識を学んでいきます。

 

コンピュータの三大原則

以下が三大原則です。

  1. コンピュータは、入力・演算・出力を行う装置
  2. プログラムは、命令とデータの集合体
  3. コンピュータの都合は、人間の感覚と異なる場合がある

 

「ハードウェア」は入力・演算・出力の3つを行う装置。

例えば、「1」と「2」という情報をキーボードから入力して、プログラミングでそれらを足し算するという演算を行い、その結果である「3」を画面に表示するのがコンピュータです。

 

Webの閲覧やゲームなどの複雑な機能も、結局は入力・演算・出力の3つが組み合わさって出来ているのです。

 

 

「プログラム」は命令とデータの集合体です。

命令とは、入力・演算・出力をコンピュータに指示するものです。

データとは、命令の対象となる入力情報または命令の結果によって得られる出力情報のことです。

 

コンピュータの都合は、人間の感覚と異なる場合があります。

例えば、コンピュータの世界では文章・画像・音楽など全ての情報を2進数の数字で表します。

このようにコンピュータの都合があるので、人間にとっては難しく感じることもあるのです。

 

2進数については下記の記事をご覧ください。

bit byte 2進数とは? - shiki0331’s blog

 

 

ハンド・アセンブル

コンピュータは、前述した通りに2進数の数字しか理解することができません。

これを「マシン語」といいます。

 

しかし、2進数の数字の羅列であるマシン語を人間が使うには大変ですよね。

 

そこで、少しでも人間が理解しやすいように英語に似たニックネームを付けてプログラムを作成することを「ニーモック」と呼び、ニーモックを使ってコンピュータに命令するプログラミング言語を「アセンブリ言語」と呼びます。

 

コンピュータは「マシン語」だけしか理解ができないので、「アセンブリ言語」を理解できません。なので、コンピュータに最終的なお願いをするときは「マシン語」に変換してから伝えてあげなくてはいけません。

 

このアセンブリ言語で記述したプログラミングをマシン語に変換する作業を「ハンド・アセンブル」といいます。

 

ちなみに現在よく使われている「Ruby」や「PHP」は「高級言語」といいます。

これらの言語も最終的には「マシン語」に変換されてコンピュータに伝えていることを理解しておきましょう。

 

オブジェクト指向プログラミング

オブジェクト指向プログラミングには「クラス」と「オブジェクト」という概念があります。

 

「クラス」は「オブジェクト」の定義であり、「クラス」が実体を持ったものが「オブジェクト(=クラスのインスタンス)」。

 

現実に例えると、お菓子のクッキーを作る際の「クッキーを作るための型」が「クラス」で「くり抜かれたクッキー」が「オブジェクト」です。

 

オブジェクト指向には大きな三本柱があります。

「継承」・「カプセル化」・「多態性」です。

 

「継承」はクラスの機能を新しいクラスを作成する際に継承することで、簡単に前のクラスの機能+新しい機能を作成することができます。

また機能を変更する際にも、継承元のクラスを変更するだけで継承先のクラスも変更することができます。

 

カプセル化」は必要のないクラスの情報をブラックボックス化することで、使いやすい部品となり保守性が上がります。

 

多態性」は同じメッセージで複数の操作が行えるクラスを作れば、クラスを使う人は覚えることが少なくて済みます。

 

どれも大型プロジェクトを作成する際に凄く役立つ機能なので、個人での小さい開発などではオブジェクト指向の良さが実感しにくいかもしれません。

 

データベース

以下のような3つのテーブルがあるとします。

 商品                    売り上げ                     顧客
・商品ID             ・売り上げID             ・顧客ID
・商品名     1対多    ・商品ID     多対1    ・顧客名
・単価                 ・顧客ID                    ・住所
                            ・売上数量                 ・電話

 

商品ID・売り上げID・顧客IDがそれぞれ主キーとなります。

「主キー(primary key)」はレコードを特定するIDです。

 

売り上げデーブルには、顧客IDと商品IDというフィールドがあります。

これらは、他のテーブルの主キーであり、売り上げテーブルにとって「外部キー(foreign kye)」と呼ばれます。

 

同じ値の主キーと外部キーによって複数のテーブルが関連づけられ(relation)データを芋づる式に取り出せます。

 

リレーションシップの形態は「多対多」とはなってはいけません。複数のテーブルを芋ずる式にたどることが困難になるからです。

 

「多対多」になってしまう場合は、上記のリレーショシップのように2つのテーブルの間にもう一つテーブルを作成します。

これを「結合テーブル(リンクテーブル)」と呼びます。

 

DBMSの機能の一つとして、テーブルの個々のフィールドに「インデックス(index」を設定できます。

 

インデックスは、データの検索と並べ替えの速度を向上させる内部的な仕組みです。

 

フィールドにインデックスを設定すると、そのフィールドのためのインデックス・テーブルが自動的に作成されます。

インデックス・テーブルは、フィールドの値と、そのフィールドを持つレコードの位置を記録したものです。

 

例えば、顧客テーブルの顧客名フィールドにインデックスを設定すると、「顧客名」と「ファイル上の位置」という2つのフィールドを持ったインデックス・テーブルが作成されます。

 

インデックス・テーブルは元のテーブルに比べてフィールド数が少ないので、高速に検索や並び替えが行えます。

インデックス・テーブルで検索や並び替えを行ってから、元のテーブルのレコードを取り出します。

 

そうなると、全てのフィールドにインデックスを設定すれば良いのでは?と思いますね。

 

しかし、インデックスを設定するとテーブルにレコードが登録されるたびにインデックス・テーブルの更新処理が必要になります。

 

検索と並び替え速度向上の代償に、登録の速度が低下するのです。

 

そのため頻繁に検索や並び替えが行われる場合にだけインデックスを設定するべきです。

 

 

トランザクションに関して、SQLの命令が用意されています。

  1. DBMSトランザクションの開始を知らせるBEGIN TRANS-ACTION命令
  2. トランザクションの終了を知らせるCOMMIT命令
  3. トランザクションの途中でトラブルが発生した場合に、トランザクション開始前の状態にデータベースの内容を戻すROLL BACK

 

 

TCP/IPネットワーク

インターネットを通して情報が電気信号として伝わるからコンピュータ同士で情報を交換できます。

 

電気信号を受信したコンピュータは、それが自分宛てものであれば受け取り、そうでなければ無視します。

電気信号の宛先は「MAC(Media Access Control)アドレス」と呼ばれる番号で指定されます。

 

個々のネットワーク・カードが持つROM(Read Only Memoly=読み出し専用メモリー)には、あらかじめ一枚ずつ異なるMACアドレスが焼きこまれている一意な番号です。

 

MACアドレスだけでインターネットを実現すると、インターネットに接続している膨大な数のコンピュータには、何もグループ化されていないMACアドレスがあるだけです。

 

これでは情報の送り先を見つけるのに、もの凄く時間がかかってしまいます。

 

そこで、TCP/IPネットワークでは、ハードウェア的なMACアドレスとは別の、ソフトウェア的な番号をコンピュータごとに設定しています。

この番号が「IPアドレス」です。

 

ただし、最終的に情報を受け取るネットワーク・カードを識別するのがMACアドレスであることには変わりありません。

 

IPアドレスによって、例えば1~3つ目の数値で企業を表、4つ目の数値で企業内のコンピュータを表すようなグループ化が簡単に行えます。

IPアドレスMACアドレスと同様に一意な数値です。

 

インターネットの世界ではIPアドレスという数値でコンピュータを識別しているはずなのに、普段私たちは「www.example.com」のような文字列でWebサーバーを指定できていますよね。

 

実は、インターネットには「www.example.com」という文字列をIPアドレスに変換してくれる「DNS(Domain Name System)サーバー」というものが存在しています。

 

 

TCP」はデータの受信者と送信者がお互いに相手の確認を取りながら、確実にデータを受け渡すためのプロトコルです。

他のも大きなデータを「パケット(小包)」と呼ばれる単位に分割して送信し、それを受信側で元のデータに復元するためのプロトコルもあります。

 

 

 

少しだけですがまとめてみました。

途中難しい章もあって飛ばした部分もありましたが、基礎を学ぶ上では良い本だったなと思います。

 

amazonkindle版では1000円ちょっとで買えるので、是非興味ある方は読んでみてください!

 

 

 

 

 

CPUとは? CPUの性能を比較しよう!

CPU(Central Processing Unit = 中央 処理 装置)
 
CPUとは、人間に例えると「脳」です。CPUの性能が高ければコンピュータの処理速度が速くなります。
ただし、画像処理に関しては主にGPUが担当しているので、CPUの性能が高くてもカバーできません。

 

CPUの性能が高ければ高いほど良いってのはわかったけど「どこで性能を見れば良いの?」と思いますよね。

 

CPUの性能を比較するときには、以下の項目をチェックしましょう。

 

・コア数

・スレッド数

ベンチマークスコア(passmark)

・クロック周波数 

キャッシュメモリ

 

上から順に説明していきます。

 

「コア数」とは先ほどの人間の例えを使うと「脳の数」です。

 

なので、コア数が多ければ多いほど脳が沢山ある事になるので、処理速度が速くなります。

 

なぜ処理速度が速くなるかというと、一つ一つの機能に対して一つの脳で担当できるからです。

 

例えば4つのコアがあったとすると、1つはWindows担当。2つ目はExcel担当。3つ目はChrome担当。4つ目はペイント担当。このように振り分けることができます。

 

これが1つのコアでは4つの機能を1つのコアで担当しなければなりません。

 

こう考えると当然、コア数が多ければ処理速度は速くなりますよね。

 

 

次は「スレッド数」です。

 

スレッド数は一つのコアが担当できる仕事の数です。

 

例えば1コア2スレッドとすると、1つのコアでは2つの仕事までしか同時にできません。

 

つまり「スレッド数」とは、1コアあたりの同時にこなせる作業数です。

 

ちなみに1コア1スレッドで同時に複数の作業を行えないわけではないですが、効率よく仕事を遂行できないので処理速度は落ちます。

 

 

次は「ベンチマーク」です。

 

ベンチマーク様々な企業がCPUの格付けを数値化しているものです。

 

その中でもPassmark社の「passmark」という数値があらゆるCPUを数値化しているようです。

 

この「passmark」の数値が高ければ高いほどCPUの性能が高いことを表しています。

 

しかし、注意が必要です。

 

ベンチマークの数値で比較した結果通りにならないケースもあります。

 

理由は、CPUが発揮する性能はプログラムによって異なるからです。

 

Passmark社がベンチマークスコアを出すために実行するプログラムと、パソコンを使用する人が利用するプログラムが完全に一致することはありえません。

 

そのため「passmark」の数値は必ずしも正確ではありません。

 

ただ指標としては参考になります。数値を鵜呑みにせず、CPUの性能を検討する必要があるでしょう。

 

 

次は「クロック周波数」です。

クロック周波数は「回路が処理の歩調を合わせるために用いる信号が、1秒に何回発生するかを示す値」。

 

クロック周波数が高ければ高いほど、コンピュータはたくさんの作業を同一時間内にできると考えていただければ大丈夫です。

 

周波数なので単位は「Hz(ヘルツ)」です。

 

現在主流なのは「GHz(ギガヘルツ)」です。

20年くらい前は「MHz(メガヘルツ)」だったみたいです。技術の進歩により向上したんです。

 

ちなみに

1MHz 1秒あたりに100万回

1GHz 1秒あたりに10億回

 

こう見るとめちゃくちゃ技術が進歩してますね!!

 

 

最後に「キャッシュメモリ」です。

 

キャッシュメモリ」と一緒に「メインメモリ」と「ハードディスク」について学びましょう。

 

同時に学んだ方が理解がよりしやすいためです。

 

上記の3つは大枠で捉えると、全て「データを記憶する装置」です。

 

違いは「処理速度」です。

 

                処理速度

(速) キャッシュメモリ  <  メインメモリ  <  ハードディスク (遅)

 

「ハードディスク」から処理を行うデータをCPUに渡します。

 

しかし、CPUの処理速度はとても速いので「ハードディスク」からCPUにデータを送るのでは間に合いません。

 

その中間地点として「メインメモリ」があります。

 

しかし!これでもまだCPUの処理速度には追いつきません。

 

そこでCPU内にある「キャッシュメモリ」が存在するのです。

 

よく使われるデータは「キャッシュメモリ」に入れといて、すぐにデータを出せるようにしておくのです。

 

キャッシュメモリの容量が多ければ、すぐにデータを出せるようにできるデータ量も多いわけですね。

なので容量が多いにこしたことはないですね!

 

最後にCPUの性能を比較するときの項目をもう一度確認しましょう!

 

・コア数

・スレッド数

ベンチマークスコア(passmark)

・クロック周波数 

キャッシュメモリ

 

個人的にはプログラミングをする上で、全部の項目をすみずみまで理解する必要はないと思うので、なんとなーく理解しておきましょう!!

 

 

最後まで読んでいただきありがとうございました。

 

 

2進数から10進数 10進数から2進数への変換方法

2進数から10進数、10進数から2進数への変換方法を解説していきます!

 

2進数?10進数?とわからない人は下記のブログを読んで下さい。

shiki0331.hatenablog.com

 

 

2進数を10進数に変換するには、2進数の各位の数字にその位の「重み」を掛けて、すべての桁について足します

 

は?って感じですよね。笑

 

僕はそうでした。笑

 

説明していきます!

 

「重み」から理解していきましょう。

2進数のn桁目の重みは、2n-1

 

例として、2進数である「11010」の重みを求めましょう。

 

  1     1    0     1    0

5桁 4桁 3桁 2桁 1桁

 

重みを求めるには、上記の2n-1に当てはめてみましょう。

 

5桁目の重みは、25-124

となります。

4桁目は24-123となります。

3桁・2桁・1桁も上記と同じように計算します。

 

「11010」の重みは

 

2進数   1   1  0  1  0

重み    16  8  4  2  0

 

上記のようになります。

 

2進数を10進数に変換する計算式をもう一度確認しましょう。

 

2進数の各位の数字にその位の「重み」を掛けて、すべての桁について足します。

 

なので次は、2進数の各位の数字にその位の「重み」を掛けます

 

2進数   1   1  0  1  0

重み    16  8  4  2  0 

1×16 + 1×8 + 0×4 + 1×2 + 0×0  =  26

 

上記の計算から

2進数である「11010」を10進数に変換すると26になります。

 

 

次は10進数から2進数に変換する計算をみていきましょう。

 

10進数を2進数に変換するには、変換する10進数を2で繰り返し割っていき、その余り(0か1になる)を下位から上位へ順に並べていきます。

 

文だけ見ても想像しにくいと思うので、早速説明していきます。

 

今回は10進数である「26」を2進数に変換していきます。

 

まずは「変換する10進数を2で繰り返し割っていき、その余り(0か1になる)」を書き出していきます。

 

26 ÷ 2 = 13  余り 0

13 ÷ 2= 6     余り 1

6 ÷ 2 = 3      余り 0

3 ÷ 2 = 1      余り 1

 

これを最後の答えである1から順に並べていきます。

 

下から並べると「11010」となります。

 

これが10進数である「26」を2進数に変換したものとなります。

 

ポイントとしては、最後の答えから順に並べることです。

 

今回の計算に置き換えると、最後の答えである3 ÷ 2 = 1 を書き出します。

 

1  

 

後は各余りを下から順に並べるだけです。

 

11010

 

理解できましたでしょうか?

 

 

ご不明な点などありましたら気軽にコメント or 連絡頂けたらと思います。

 

最後まで読んで頂きありがとうございました。

 

bit byte 2進数とは?

コンピュータの世界ではbitbyteという単位があります。

 

他にも、KBキロバイト)・MB(メガバイト)などの単位もあります。

 

これは聞いたことがある人も多いのではないでしょうか?

 

bitはコンピュータが扱う最小単位

 

byteはbitが8個集まったものです。

ex)8bit = 1byte

     32bit = 4byte

 

 

次に2進数です。

 

コンピュータのデータは全て2進数で表現されていることを知りましょう。

 

2進数とは01の2種類の数字で表現されます。

 

2種類のみで数字や文字、画像や動画、音声などを表現しているのです!

 

ビックリですよね!

 

ちなみに人間が使用しているのは10進数です。

私たちは0〜9の10種類で数字を表現していますよね。

 

「え、でも2進数だとどうやって6とか20とかの数字を表すの?」と思いますよね。

 

2進数では「1」の次に繰り上がりが起きます。

ex)10進数である「2」を2進数で表すには、「10」

  10進数である「3」を2進数で表すには、「11」

     10進数である「4」を2進数で表すには、「100」

     10進数である「10」を2進数で表すには、「1010」

 

10進数では「9」の次に繰り上がりが起きますよね。

それと考え方は同じなのですが、馴染みがないので理解しにくです。

 

「2進数を10進数 10進数を2進数に変換する計算式」があります。

下記のブログをご覧ください。

 

shiki0331.hatenablog.com

 

 

ちなみに、なぜコンピュータは2進数を採用しているかというと、2進数だと電圧や電流のONとOFFで表現できます。

 

電気信号に置き換えるには10進数ではなく、2進数が単純で適しているのです。

 

 

最後に蛇足です。

1946年に作られた世界で最初のコンピュータであるENIACは10進数を用いられていました。

 

しかし、複雑になってしまい失敗してしまったという歴史もあります。

 

 

 

最後まで読んでいただき、ありがとうございます。

 

 

 

30分チャレンジ プロになるためのWeb技術入門 第二章「Webはどのように発展したか」 前半

30分チャレンジです!
 
今回の第二章は長かったので前半・後半に分けます!
 
「Webはどのように発展したか」前半部分を要約していきます。
※注 要約してみたら「Webがどのように発展したか」というよりも、用語の説明が多くなってしまったのでご了承ください、、
 
 インターネットの原型は1969年に生まれたが、20年近くは大学や研究機関の関係者達しか利用していなかった。
 その理由はコンピュータやネットワーク資源が非常に高価。利用用途が電子メールの交換やファイル共有といった地味なものが中心だったのが理由として考えられる。
 
WWW(World-Wide-Web)が生まれたことで、たくさんの人達にも普及した。
 
WWWとは、1989年にCERNの研究者が情報共有を目的に発明された。まず研究成果をHTML(Hyper Text Markup Languageの形式で表現することを考えた。
 
ここで注目されたのは、Hyper Textと呼ばれる仕組みで、文章間の参照がHyper Linkというコンピュータが理解できる形式で記述されているので、参照先の文章をすぐに閲覧できる。
 
WWWの仕組みにより情報の伝達効率が大幅に上がった。
 
 
WWWによるHyper Textの公開と閲覧は、
・Webサーバー(server=仕える人) ex)Apache
・Webクライアント(client=お客様) ex)Chrome,Safari
2つのソフトウェアで実現されている。
 
Webサーバーがネットワーク上に公開するHyper Textを蓄積し、Webクライアントの要求でHTMLファイルを渡す仕組みになっている。
 
 
クライアントとサーバの2つに役割を分けるのは、コンテンツをWebサーバのように1つのコンピュータにまとめた方が更新が楽だからである。
 
一方、コンテンツを閲覧するためにコンテンツを保管しているWebサーバーを利用者が直接操作するのは非現実的。
 
そのため利用者のコンピュータをWebクライアントと利用できるようにし、WebサーバーとWebクライアントの間をインターネットで接続することでWWWを実現している。
 
 
しかし、Webサーバーは大量のデータからWebクライアントの要求に応え、必要な情報を取得するのは大変。
 
そのためにURL(Uniform Resource Locator=統一資源位置子)でリソースの場所を示してあげる必要がある。
 
 
URLは、スキーム・ホスト名・パス名で構成されている。
 
スキームはリソースを取得するための方法を表します。ほとんど「http」が使用されている。
 
ホスト名はリソースが存在するホスト(コンピュータ名)を表す。
ホストコンピュータはネットワークに接続されて他のコンピュータから要求を受け取り、処理した結果を返すようなコンピュータのこと。
 
ex)www.littleforest.jp
wwwはwwwサーバというコンピュータ
littleforestはlittleforestという組織
jpは日本の
 
 
パス名はホスト名で指定されたコンピュータ上のリソースの位置を示す。
 
ex)webtext/index.html
webtextディレクトリの下にあるindex.htmlというファイルを示している。
 
 
HTTP(Hyper Text Transfer Protocol)とは、WebサーバーとWebクライアントが通信をするための共通の約束事。
 
約束事を決めることで、どのコンピュータ同士でも通信ができるようになっている。
 
他のことで例えると、点字は決まった点の配置でなんて読むか約束が決まっている。この約束事がなければ、点字はただの散らばった点になってしまう。
 
そうならないように、コンピュータ同士でも約束事が必要なのである。
 
 
 
前半は以上です。
 
自分が要約するとタイトルの「Web はどのように発展したか」というよりも、WWW・Webサーバー・Webクライアント・URL・HTTPの説明みたいになっていますね。笑
 
本当はWebがどのように発展したか細かく書いてあるんですよ!笑
 
重要なとこを抜き取ったら用語の説明みたいになってしまった、、、
 
 
もしWebがどのように発展したか気になる人は、実際に本を読んでみてください笑
 
次回は後半です!

15 分チャレンジ プロになるためのWeb技術入門 第一章「Webアプリケーションとは何か」

今回から「プロになるためのWeb技術入門 なぜ、あなたはWebシステムを開発できないのか」を読んで要約していきます。

 

15分で第一章「Webアプリケーションとは何か」を要約していきます。

 

 

 

Webアプリケーションとはなんでしょうか?
 
アプリケーションを大きく分けると、2つに分けられます。
デスクトップアプリケーションとWebアプリケーションに分けられます。
 
デスクトップアプリケーションから説明していきます。
・特徴は基本的に全ての処理がPC上で行われている。
・画面はOS上で表示されている。
・利用するにはソフトウェアをPCへインストールする必要があり、インストールされたPC上でのみ動作します。
 
ex)Word、ExcelOutlookなどのオフィスアプリケーション
 
 
次にWebアプリケーションです。
・特徴は主な処理はPC上ではなくサーバーと呼ばれるコンピュータがで担当している。
・画面はHTMLで表現され、 Webブラウザ(chromeInternet Explorer、Fireboxなど)上に表示されている。
・アプリケーションをPCへインストールする必要がない。インターネットに繋がっているPCがあればいつでも利用できる。
 
ex)駅の乗り換え検索、Amazonなど
 
 
 
なんとなく違いはわかっていましたが、理解があやふやだったので知識の整理になりましたね!
 
現在は当たり前のようにスマホでWebアプリケーションが使われていますね。
本当に便利な世の中です!!
 
最後まで読んでいただき、ありがとうございました。
 

振り返り KPT 2

面談で自分の考え方・価値観を伝えられるようになってきた。

今までは会社の理念やミッションに近寄ろうとしてしまっていた。


面談の中で質問の受け答えや、聞きたいことを質問することはできている。

しかし、質問で終わってしまい会話ができていないと感じた。

その人を知るには質問ではなく、会話が必要なのではないか。


質問ではなく会話をするには、深く考えずに疑問に思ったことを聞き、話たいことを話すようにするべきではないか。


日常での会話とおなじに考えるべきだろう。



振り返りを行うと明日の行動に理由が持てていいですね!


長期間の大きな目標よりも、短期間の小さな目標が大切なんじゃないかと思うけどこの頃。笑