僕がエンジニアとしてやっていくために(おそらく)必要なこと

 

 営業職からwebエンジニアに変わったわけだけど、そんな僕がすーぱーはかーになるために必要なことはどんなことだろう。

 勉強しなくちゃいけないことばかりで少し焦りを覚えてきたので、簡単に箇条書きでも書き出してみようかと。

 

アルゴリズム

・なんか重要らしい

 

■数学

・なんか重要らしい

 

■データーベース

・当然のごとく重要。

・来年にDBスペシャリストでもとるかな。

 

■OS(Linux

LPICで勉強している。

・ただ、実践の場がないと本当には身につかないのではないかという懸念。

 

オブジェクト指向とかコーディングに関する知識

・リーダブルコードとかオブジェクト指向に関する本何冊か読んで、あとは業務でやってくしかないかなー。

 

上に上げたようなことをだいたいざっと1年半くらい?でやろうと思うと、

各分野に費やせる時間は 18ヶ月 ÷ 5分野 = 2ヶ月強。

2ヶ月強か、まぁまぁある気がする。

 

とりあえずLPICをちゃっと取ってしまうか。で、その次はDB。

アルゴリズムはとりあえず継続的にやることにするかな。

あと、コーディング系の本も。

 

 

Getting Real

・ライバルを持ち、相手が強調している点と異なる点を強調する。先駆者の追随になってはならない。競合比較ではなく、何が根本原因なのかを考えなければならない。

・アプリケーションのポイントを決め、それに基づいたビジョンを定め、ビジョンに沿って行動する。

・成功と満足の秘訣はディテールにあるが、完璧主義者になるのは後回しで。

・アプリケーションのコア市場を見つけ、ターゲットを絞り込む。

・不完全な製品ではなく、本当に必要な機能を持った半分の製品を作る。機能を削る。

・追加機能はノーから入る。いらない機能を尋ねる。

・できるだけ早く実現させる。現実のものにする。

 

■アイディアを現実に

1.インスピレーション ー プロジェクト全体を見渡せる大局観、俯瞰図

 そのアプリケーションは何が必要なのか?それがいつ役に立つのか、どのように知るのか?いったい何を作ろうとしているのか?

2.紙スケッチ

3.HTML

4.コードにする。

 

・環境設定を委ねすぎない。苦情があれば変更する。

・実行すること。

・各タスクのスケジュール、規模を細分化しよう。

・干渉されない時間を作る。

・ミーティングをできるだけしない。する時には、必要最低限のメンバー、タイマーをセットして、話の内容が定めてから。

・小さな成功を見つけて自分をチームをモチベートする。

・良い文章を書く。

・インターフェースから作る。インターフェースがデザイン。

・ページの中核部分()から始める。ロゴやフッターなどはいったん無視。

・ソフトウェアの導入部分が評価を決める大きな要素になる。

・インターフェースには必ずしも一貫性は不可欠ではなく、ユーザーがその時点で本当に必要なものを与えることが重要。

・より少ないソフトウェア。より少なく、きれいなコード。

・説明ではなく、体験を書く。

・バグに重要度をつける。

・無料登録やブログとか使うとかってプロモーションとか運用してく話が後半にある。

HTTPの教科書

ーー 第1章 Web とネットワークの基本を知ろう ーー

 

TCP / IP 

アプリケーション層。HTTPやFTP

トランスポート層TCPが信頼性を担当。データ(HTTPメッセージ)を通信しやすいようにバラバラにしたり、スリーウェイハンドシェイクで確実に相手に送信する。

ネットワーク層。IPが配送を担当。宛先としてMACアドレスを追加。

 

URI(Uniform resource Identifier)のフォーマット

http://user:pass@www.example.jp:80/dir/index.html?uid=1#ch1

・「スキーム名」リソース取得に用いるプロトコルの指示(ex)https. http, ftp

・「資格情報」サーバーからリソースを取得するのに必要なアイパスなど(オプション)

・サーバーアドレス、ポート番号、ファイルバス、クエリー文字列、フラグメント識別子

 

 

ーー 第2章 シンプルなプロトコルHTTP ーー

 

■HTTPは状態を保持しないステートレスなプロトコル

・状態の保持には Cookie を用いる。

・あるサーバーへの1度目のリクエストに対するレスポンスの際に、Set-Cookie というヘッダーフィールドでCookieをクライアントに保存するよう指示。同一サーバーへの2回目以降のリクエストの際には、Cookieをヘッダーフィールドに付加することで同一のクライアントであると認識される。

 

■HTTPメソッド

・「GET」リソースの取得

・「POST」エンティティボディの転送

・「PUT」ファイルの転送。セキュリティ上の問題があるので、Webアプリケーションの認証機能やWeb同士が連携するRESTという設計様式を利用する場合に利用されることが多い。

・「HEAD」メッセージヘッダーの取得。URIの有効性やリソースの更新時間を確かめる目的で使われる。

・「DELETE」ファイルの削除。PUTと同様セキュリティ上の問題。

・「OPTIONS」サポートしているメソッドの問い合わせ。

・「TRACE」経路の調査。

・「CONNECT」プロキシへのトンネリング要求。

 

■通信量の節約

・「持続的接続」クライアントとサーバーいずれかが明示的に接続を切断しない限り、TCP接続を持続する。リクエスト毎の前にTCP接続を行う必要がなくなる。

・「パイプライン化」レスポンスを待たずにリクエストを発行できる。

 

 

ーー 第3章 HTTPの情報はHTTPメッセージにある ーー

 

■メッセージの転送

・「コンテンツエンコーディング」圧縮して送る。gzip, compress, deflate, など

・「チャンク転送コーディング」大きなサイズのデータの時分解して送る

・「マルチパート」MIMEの仕組みを使って、テキストや画像など異なるデータを送信できる。MIME・・画像などのバイナリデータをASCII文字列にエンコードする方法や、データの種類を表す方法を規定している。

・「レンジリクエスト」エンティティの範囲を指定してリクエストを行う。

・「コンテンツネゴシエーション」言語や文字セット、エンコーディング方式毎に最適なリソースを提供する仕組み。サーバー、クライアント、両方が駆動するタイプがある。

 

 

ーー 第4章 結果を伝えるHTTPステータスコード ーー

 

ステータスコードのクラス

・1XX リクエストが受け付けられて処理中

・2XX リクエストが正常に処理を完了した。

・3XX リクエストが完了するには追加動作が必要(リダイレクトとか)

・4XX クライアントエラー

・5XX サーバーエラー

 

 

ーー 第5章 HTTPと連携するWebサーバー ーー

 

■バーチャルホスト

・1台のサーバーで複数ドメインを実現する。

・同じIPアドレスで異なるホスト名やドメイン名を持った複数のWebサイトが稼働しているバーチャルホストの仕組みがあるため、FQDN( Fully Qualified Domain Name )かHostヘッダーフィールドでの指定が必要。

 

■通信を中継するプログラム

・「プロキシ」サーバーとクライアントの両方の役割をする中継プログラム。キャッシングプロキシと透過型プロキシがある。

・「ゲートウェイ」HTTPサーバー以外のサーバーへの中継。データベースへの接続やクレジットカードの決済など。

・「トンネル」クライアントとサーバーが安全に通信を行うための通信路を確立する。HTTPリクエストを解釈しない。

 

・キャッシュはクライアントとサーバーの双方に存在する。

 

 

ーー 第6章 HTTPヘッダー ーー

 

・HTTPヘッダーフィールドは、HTTPメッセージを構成する要素の1つで、HTTPプロトコルの中で、メッセージボディのサイズや、使用している言語、認証情報などをブラウザやサーバーに伝える。

 

■4種類のHTTPヘッダーフィールド

・「一般ヘッダーフィールド」リクエスト、レスポンス両方で用いられる。

・「リクエストヘッダーフィールド」

・「レスポンスヘッダーフィールド」

・「エンティティヘッダーフィールド」

 

 

ーー 第7章 Webを安全にするHTTPS ーー

 

■HTTPの弱点

・通信が平文(暗号化しない)なので盗聴可能

・通信相手を確かめないのでなりすまし可能

・完全性を証明できないので改竄可能。

 

HTTPS = HTTP + 暗号化 + 認証 + 完全性保護

公開鍵暗号方式共通鍵暗号方式を併用して暗号化。

・ネットワークに負荷がかかることから通信が遅くなる。

・暗号化や復号化の必要があるのでCPUやメモリを使い処理が遅くなる。

 

 

ーー 第8章 誰がアクセスしているかを確かめる認証 --

 

■HTTP/1.1 で利用できる認証方式

BASIC認証

・DIGEST認証

SSLクライアント認証 - HTTPSのクライアント認証を利用した証明方式で、利用するのにコストがかかる。

・フォームベース認証 - 認証の大半はフォームベース認証が用いられ、セッション管理とCookie による実装が行われている。

 

 

ーー 第9章 HTTPに機能を追加するプロトコル --

 

■HTTPのボトルネック

・1コネクションで1リクエストしか送れない。

・リクエストをクライアントからしか開始できない。レスポンスだけを受け取れない。

・ヘッダーが圧縮されずに送られる。ヘッダーが冗長。

・データの圧縮は任意だが、圧縮して送られることが強制ではない。

 

■解決方法

・「Ajax

・「Comet」サーバーに更新があるまでレスポンスを保留。(疑似的サーバープッシュ)

・「SPDY」多重化ストリーム、リクエストの優先順位付け、HTTPヘッダーの圧縮、サーバープッシュ機能、サーバーヒント機能

・「WebSocket」ブラウザで双方向通信を行う。通信料削減

 

WebDAV(Web-based Distributed Authoring and Versioning)

 Webサーバー上のファイル管理を行う。

 

 

ーー 第10章 Webコンテンツで使う技術 --

 

・「CGI」リクエストのたびにプログラムを起動するので、大量にアクセスがあるとWebサーバーに負担がかかる。

・「サーブレット」Webサーバーと同じプロセスの中で動作するので、負荷を軽減できる。

XMLAtomRSSJSON

 

 

ーー 第11章 Webへの攻撃技術 --

 

・出力値の不備による脆弱性

・設定や設計の不備による脆弱性

・セッション管理の不備による脆弱性

など

 

 

ーー 感想 --

 

・基本情報を取った人には重複した内容も多く、簡単すぎるかもしれない。とはいえ、HTTPヘッダーの各ステータスやHTTPSなど、中身については知らないものも少なくはなかった。

・最初に入るには悪くはないかもしれないがオススメはしない。難易度がとても半端で、もう少し解説があったらという用語がいきなり出てきたりする。

金持ち父さん 貧乏父さん

■6つの教え

 

1 金持ちはお金のために働かない

 

 <=> お金のために働くこと。

 

2 お金の流れの読み方を読む

 

・金持ちになりたければお金について勉強しなければならない。

・資産と負債の違いを認識し、資産を増やすこと。

 資産 ー 収入になるもの(株式、債券、不動産、知的財産等)

 負債 ー 支出になるもの(ローン、クレジットカードの未払い分等)

・損益計算書と賃借対照表からお金の流れを読むこと。

・「金持ちは資産を買う」

 「貧乏人の家計は支出ばかり」

 「中流の人間は資産と思って負債を買う」

 

3 自分のビジネスを持つ

 

・自分がその場にいなくても収入を生み出すビジネス。

マクドナルドは不動産ビジネス。

 マクドナルドのフランチャイズ権を買う人はその土地の代金を肩代わりしている。

 マクドナルドは世界で一番土地を所有している。

 

4 会社を作って節税する

 

・ファイナンシャルインテリジェンス

 1 会計力(ファイナンシャルリテラシー

  財務諸表を読んで理解できる能力。

 2 投資力

  戦略と方式が必要

 3 市場の理解力

  投資のファンダメンタルな側面やテクニカルな側面を知ること。

 4 法律力

  会社にすることで税制面での優遇を受けることができる。

 

5 金持ちはお金を作り出す

 

・ファイナンシャルインテリジェンスを高めること。

・市場の動向に合わせて投資対象を変化させることや不動産買い替えなど。

・度胸を持って臨むこと。

 

6 お金のためでなく学ぶために働く

 

・お金のためでなく学ぶために働くこと、そして長い目で見て学ぶこと。

 

■TIPS

・資産形成や教育等、自分への支払いを先に済ませる。

・強い目的意識を持つ。

 ー「やりたいこと」と「やりたくないこと」を明確にする。

・贅沢品は資産に買わせる。

・投資を容易に感じさせるヒーローを持つこと。

・欲しい、知りたいと思ったらまずは与え、教えること。

 

 

■感想とか

・資産を増やさなあかん。不労所得を生み出す株、不動産、債権などはもちろん、自分の能力という意味でも。

・お金のためでなく学ぶために働く。

・不動産や会社の設立なんかは日本の法律や状況によってどうなんか分からん。

 

コーディングを支える技術

ーー 第1章 言語を深く効率的に学ぶには ーー

 

■「比較から学ぶ」

・複数の言語を比較しながら学ぶ。

・何がいくつもの言語で共通していることなのかを学べる。

 

■「歴史から学ぶ」

・言語がどう変わったか、変わる前にはどういう問題点があったかを学ぶ。

・言語が持ついろいろな機能がなぜ生まれたのかを学べる。なぜ存在するのか。

 

 

ーー 第2章 プログラミング言語を俯瞰する ーー

 

プログラマの三大美徳ー無精・短気・傲慢ー

・「無精」エネルギーの総支出を減らすために、多大な努力をするようにあなたを駆り立てる性質。

 

■言語により「楽さ」は異なる

・高速なコードを書くのが楽な言語、可読性の高い言語、言語仕様を把握するのが楽な言語など、楽なことはそれぞれ。

・目的によって適切な言語は異なる。

 

 

ーー 第3章 文法の誕生 ーー

 

文法とはどういう文字列を書いたらどういう構文木ができるか、というルール

簡単な文法ではなく、自然と思える書き方を実現できる文法が受け入れられた。

 

 

ーー 第4章 処理の流れのコントロール ーー

 

while は条件式、for は回数で繰り返しを制御。

if や for や while などの制御構文は、これらがなくとも go to を使うことで実現できる。この意味で、制御構文は 「 制限付きのgo to 」と言える。しかし、可読性や簡易さを考慮すると制御構文を使うべき。

 

 

ーー 第5章 関数 ーー

 

■関数の役割

「理解」意味的にひとかたまりのコードをくくり出して名前をつけることで、そのコードが何をしているか把握しやすくなる。

「再利用」プログラムが短くなる。何度も同じコードを読む必要がなくなる。

 

 

ーー 第6章 エラー処理 ーー

 

■エラー処理の2つの方法

「返り値で伝える」失敗を見落としたり、コードが読みづらくなったりすることが。

「例外処理」対にしなければならない処理を正しく対にしづらくなったり、関数がどんな例外を投げるかが、その関数のコードからは伝わらなくなる。

 

 

ーー 第7章 名前とスコープ ーー

 

ローカルな「静的スコープ」とグローバルな「動的」スコープ

 

 

ーー 第8章 型 ーー

 

正直あんまりよく分からんかった。

以前は「静的型付け」が多かったが、最近は「動的型付け」が増えている。

「静的型付け」ー「変数名」「値が保存されているメモリ上の位置」「そのメモリの内容はどういう種類の値か」をセットにして持っている。

「動的型付け」ー上記の「種類の情報」に加えて、値自体までセットになっている。

 

 

 ーー 第9章 コンテナと文字列 ーー

 

■配列と連結リスト

・多くの言語が配列と連結リストともにサポートしている。

・「配列」メモリ上に連続して値を格納している。

 ○ n番目の要素をすぐに取り出せる。(O(1))。メモリの容量が少ない。

 × 値の挿入には時間がかかる。

・「連結リスト」メモリ上で値と次の値のアドレスを連続して格納する。

 ○ 挿入が容易。

 × n番目の要素の取り出しに時間がかかる。

 

■ハッシュテーブルと木

・辞書、ハッシュ、連想配列の格納にはハッシュテーブルか二分木が用いられる。

・「ハッシュテーブル」キーをハッシュ関数を使って整数に変換し、その整数のアドレスに値を格納する。

 ○ 計算量が少ない、被りがなければO(1)。

 × ハッシュテーブル用の大きな配列を用意する必要があるため、メモリを消費する。

・「二分木」右を大きい、左を小さい値として、木を形成する。

 ○ メモリの消費が少ない?

 × 計算量がかかるO(log n)。

 

■文字列

・何が文字であるかは、取り決めによって決まる。

文字集合文字符号化方式、文字列の実装は言語によって異なっている。

 

 

ーー 第10章 並行処理 ーー

 

これでプロセスとスレッドの違いや仮想アドレスなんかをまず見てみよう。

http://moro-archive.hatenablog.com/entry/2014/09/11/013520#

 

■処理を切り替える2通りの方法

・「協調的マルチタスク」区切りのいいところでタスクを交代する。タスクが無限ループになった場合などは変更されないなどのデメリット。

・「プリエンティブマルチタスク」強制的にタスクが交代される。現在のOSで採用されている方法。

 メモリを複数のプログラムで共有するか否かで問題が起こった。トランザクションなどの解決策が模索されている。

 

 

ーー 第11章 オブジェクトとクラス ーー

 

■オブジェクト

オブジェクト指向は現実世界のモノの模型を作るために生まれてきた。

・言語によって言葉自体の意味や実現方法は異なる。

 

 ■クラス

・まとまったものを作る生成器

・どういう操作が可能かという仕様

・コードを再利用する単位

 

 

ーー 第12章 継承によるコードの再利用 ーー

 

■3種類の継承

・一般化 / 抽象化

・共通部分の抽出

・差分実装

 

■多重継承による名前解決の問題へのアプローチ

・多重継承自体の禁止

・メソッド解決順序自体の工夫

・Mix - In による処理の混ぜ込み

・トレイト

 

■クラスの役割

・「再利用の単位」機能ごとの、余計なものを持っていない、小さなクラス

・「インスタンス生成器」完結した、必要なものを全部持った、大きなクラス

 

 

 

ーー 感想 ーー

・後半になるにつれてちょっと難しくなった。ある程度の具体を経験していないと分かりにくかったり、例外処理や並列処理なんかは前提がないと分からなかったりするのではないかな、と。

・とはいえ、この本の目的である、比較や歴史からプログラミングを学ぶという目的はある程度は達成できたのではないかと思う。

・後半はもう少し経験を積んで、あるいは他の言語を自分で学んで違いを実感した上で再読したいと思った。

プログラムはなぜ動くのか(前編)

ーー第1章 プラグラマにとってCPUとはなにかーー

 

■プログラム実行のイメージ

1、高水準言語でプログラムを記述する。

2、プログラムをコンパイルしてマシン語のEXEファイルに変換する。

3、プログラムの起動時に、EXEファイルのコピーがメモリー上に作成される。

4、CPUがプログラムの内容を解釈・実行する。

 

■CPU

・メモリー ー 大抵の場合は、メイン・メモリー(主記憶)。CPUと制御用チップなどを介して繋がっていて、命令とデータを格納する。

・機能面から考えると、「レジスタ」「制御装置」「演算装置」「クロック」の4つの装置から構成されている。

・「レジスタ」処理対象となる命令やデータを格納する領域。

・「制御装置」メモリー上の命令やデータをレジスタに読み出し、命令の実行結果に応じて、コンピュータを制御する。

・「演算装置」メモリーからレジスタに読み出されたデータを演算する役目を持つ。

・「クロック」CPUが動作するタイミングとなるクロック信号を発生させる。

 

■条件分岐と繰り返しの仕組み

・プログラムの流れはプログラムカウンタによって決められる。

・プログラムの流れは3種類

「順次進行」アドレスの値の順に命令を実行すること

「条件分岐」条件に応じて任意のアドレスの命令を実行すること

「繰り返し」同じアドレスの命令を何度か繰り返し実行すること。

 

■関数呼び出しの仕組み

・コール命令とリターン命令によって実現される。

・「コール命令」関数の入り口のアドレスをプログラム・カウンタに設定する前に、関数呼び出しの次に実行すべき命令のアドレスをスタックに格納。

・「リターン命令」スタックに保存されたアドレスをプログラム・カウンタに設定する。

 

■TIPS

・ベースレジスタとインデックスレジスタによって配列を実現する。

・CPUで主にできること

「データ転送命令」「演算命令」「ジャンプ命令」「コール/リターン命令」

 

 

ーー第2章 データを2進数でイメージしようーー

 

2進数について、シフト演算、補数とか

 

 

ーー第3章 コンピュータが少数点数の計算を間違える理由ーー

 

浮動小数点数やそれに用いられる、正規表現やイクセス表現など

 

 

ーー第4章 四角いメモリーを丸く使うーー

 

モリーの仕組みや、スタック、キュー、リスト、二分探索木など。

 

 

ーー第5章 メモリーとディスクの親密な関係ーー

 

ストアドプログラム方式、ディスクキャッシュ、仮想記憶、ページング、DLLファイルの関数共有など。

プログラムはなぜ動くのか(後編)

プログラムはなぜ動くのか

 

第6章 自分でデータを圧縮してみよう

 

■ランレングス法

・文字が何回連続したとかで圧縮する。

 →画像ファイルとかはいいけど、文字ファイルとかだとサイズが大きくなることも。

 

■ハフマン法(LHA)

・文字が多く使われている文字に、少ないバイナリーを割り当てる。

 例えば、文章中にあが最多で10回だったから、「10」を割り当てる。

 通常なら1バイトとかだが、これなら2ビットで済む。

・ハフマン木によって判別。詳しくは調べて。

 

 

第7章 プログラムはどんな環境で動くのか

 

■CPUはそのCPU固有のマシン言語しか解釈できない

マシン語になっているプログラムを「ネイティブ・コード」、C言語などで作成したプログラムを「ソース・コード」と呼ぶ。

・「ソース・コード」→コンパイル→「ネイティブ・コード」

 

■OSによってCPU以外の違いが吸収される

Windows 以前のMS-DOS では、アプリケーションはマシン毎に作られる必要があった。というのも、OSの機能を利用できるときと、直接ハードウェアを制御する必要があるときがあったから。

・ただし、Windows OS自体は、CPU毎に固有のマシン語が使われているため、それぞれ作れられなければならない。

 

FreeBSD

UNIX 系のOS

Ports という仕組みを用いることで、異なるCPUでも同じネイティブコードを再利用できる。アプリケーションのソースコードを現在のハードウェアに合わせてコンパイルして、確実に実行できるソースコードを取得。目的のアプリケーションのソースコードがハードディスク上になければ、自動的にFTPを使って取得。

 

エミュレータ

・マシンのOSとは異なるOSを使える。仮想環境のこと?

 

Java 仮想マシン

Java ソースコード → バイトコード → Java 仮想マシン(CPU毎に異なる) → ネイティブ・コード

 

BIOS とブート・ストラップ

BIOSBasic Input/Output System )

 ーROMに記憶され、あらかじめコンピュータ本体に内蔵されているプログラム。

  キーボード、ディスク、グラフィックス・ボードなどの基本制御プラグラムに加

  えて、「ブート・ストラップ・ローダー」を起動する機能を持っている。

・ブート・ストラップ・ローダー

 ーハード・ディスクなどに記憶されたOSをメモリにロードして実行する機能。

 

 

ーー第8章 ソース・ファイルから実行可能ファイルができるまでーー

 

コンパイラ

・各言語用のコンパイラがソース・コードをマシン言語に翻訳する。

・どの言語用か、どのCPU用か、どの環境で使うのかによって異なったコンパイラが必要。

 

■実行可能ファイルの生成

・ソースファイル → (コンパイル) → オブジェクト・ファイル + スタートアップ + ライブラリファイル + インポートライブラリ → (リンク) → 実行可能ファイル

・オブジェクトファイルとは、データと処理の集合体でネイティブ・コードだが未完成である。というのも、外部シンボルが未解決であるから。

・外部シンボル(他オブジェクト・ファイル内にある関数や変数)の解決には、スタートアップやライブラリ・ファイルを結合する必要がある。

・スタートアップ ー 全てのプログラムの先頭に結合する共通的な処理が記述されたオブジェクトファイル。

・ライブラリファイル - 複数のオブジェクトファイルをまとめて1つのファイルに格納したもの。リンカーで指定すると、必要なオブジェクトファイルだけを抽出して、他のオブジェクトファイルと結合して実行可能ファイルを生成する。

・インポートライブラリ - DLLファイルが格納されているフォルダ情報だけが存在する。プログラム実行時に関数が結合されるというダイナミックリンクが行われる。( ↔ スタティックリンク ー オブジェクトファイルの場所情報ではなく、実体が直接実行可能ファイルに結合される形式)

 

■実行可能ファイルの実行

・EXEファイルのメモリー・アドレスはどうなっている?

 EXEファイルの中で、変数や関数に仮のメモリー・アドレスが与えられ、実行時に実際のメモリー・アドレスに変換される。

 EXEファイルの先頭にメモリー・アドレスの変換が必要な部分を示す情報である再配置情報がリンカーによって付加してされており、それを参照する。

 再配置情報は相対アドレスとなっている。

・ロードされたプログラムは、変数、関数、スタック、ヒープのための4つの領域からなっている。

・スタック - ローカル変数や関数呼び出しの引数を格納するためのデータ領域。関数処理の前後で確保・解放が暗黙的に行われる。

・ヒープ - プログラム実行時に任意のデータやオブジェクトを格納するためのメモリー領域。明示的にメモリー確保・解放を行う必要があるので、メモリー・リークに注意する必要がある。

 

■TIPS

コンパイラ ー 実行前にソースコード全体を解釈して処理する。

インタプリタ ー 実行時にソースコードの内容を1行ずつ解釈して処理する。

・分割コンパイル ー プログラム全体を複数のソースコードに分割して、別々にコンパイルして、最後に1つの実行可能ファイルにリンク。ソースコードが短くなるので、プログラムの管理がよういになる。

・DLLファイルのメリット ー DLLファイルの中にある関数は複数のプラグラムから共有されることで、メモリーとディスクを節約できる。関数の内容を修正しても、スタティックリンクを再度する必要がない。

ガベージコレクションGC) ー 処理が終わって不要となったヒープ領域のデータやオブジェクトを破棄し、メモリー領域を解放すること。

 

 

ーー第9章 OSとアプリケーションの関係ーー

 

■システム・コール

・アプリケーションが、OSの機能を呼び出すこと。

・高水準言語では独自の関数名を用いて、それがコンパイルされるときに該当するOSの(複数の)システム・コールに変換するされる。

・直接システム・コールを呼び出すことが可能な高水準言語も存在するが、移植性が悪い。

 

■OSと高水準言語によってハードウェアが抽象化される

・OSの提供するシステム・コールによって、ハードウェアを直接制御する必要がなくなる。高水準言語を用いることで、システム・コールの存在を意識することがなくなる。

 

■WindowsOSの特徴

・32(64)ビットOSである ー Windowsがデータを処理する基本単位が32ビット。

APIという関数セットでシステム・コールを提供する ー APIはいくつかのDLLファイルとして提供される。

GUIマルチタスク機能、ミドルウェアを提供する。

WYSIWYG(What You See Is What You Get) - ディスプレイに表示されたものをそのまま印刷できること。

・プラグ&プレイによるデバイス・ドライバの自動設定ができる

 プラグ&プレイ ー 新しい装置を接続すると、すぐに使える仕組みのこと。

 デバイス・ドライバ ー OSの一部であり、ハードウェアとの基本的な入出力を行う機能を提供するもの。デバイス・ドライバと同時に、このハードウェアを利用するためのAPIが格納されているDLLファイルがインストールされることがあり、このAPIを利用してハードウェアを利用するアプリケーションを作成できる。

 

ーー第10章 アセンブリ言語からプログラムの本当の姿を知るーー

 

アセンブリ言語はネイティブ・コードと1対1に対応

ニーモニック ー マシン語を簡略化した英単語や記号の組み合わせに置換したもの。

アセンブラ ー アセンブリ言語をネイティブ・コードに変換するもの。

 

アセンブリ言語の構文は「オペコード + オペランド

・ 例) mov ebp, esp ー esp の値をebpに格納する。

・オペコード ー 命令の動作( mov など)

オペランド ー 目的語(データの格納先のメモリアドレスや値など)

 

 

ーー第11章 ハードウェアを制御する方法ーー

 

■ハードウェアとの入出力はIN命令とOUT命令で

・IN命令 ー 指定したポート番号のポートからデータを入力し、それをCPU内部のレジスタに格納する。

・OUT命令 ー CPUのレジスタに格納されているデータを指定したポート番号のポートに出力する。

・I / O コントローラ ー コンピュータ本体と周辺装置を接続するためのコネクタに接続され、本体と周辺装置の電気的特性を相互に変換するIC。電圧の違いやデジタルとアナログの違いなどを変換する。

・ポート ー I / O コントローラに内在するメモリー。入出力されるデータを一時的に格納する。

・ポート番号( I / O アドレス ) ー IN命令やOUT命令ではポート番号で指定したポートとCPUの間でデータの入出力を行う。

 

■周辺装置の割り込み要求

・割り込み処理 ー 現在実行中のプラグラムを中断して、他のプログラムに実行を写すために必要な仕組み。

IRQ( Interrupt Request ) ー 割り込み要求を行なった周辺装置を特定するための番号(ポート番号とは別の番号が使われる)。

 

■DMAによって大量のデータを短時間で転送できる。

・DMA( Direct Memory Access ) ー CPUを介さずに周辺装置が直接コンピュータのメインメモリーとデータ転送を行うこと。

・DMAチャネルによって、DMAを行う周辺装置の種類を識別する。

・I/Oポート番号、IRQ、DMAチャネルは周辺装置を識別するために必要。ただし、IRQとDMAチャネルはどの周辺装置にも必要なわけではない。