まっそのせかい

やった事のメモとか

VisualStudio2017Communityの導入

VisualStudio 2017 Communityを入手してC言語(C++)でHelloWorld!!を表示するまでのメモ。

ダウンロードとインストー

まずは公式サイトからVisualStudio 2017 Communityのインストーラを入手。
すごい分かりにくいのは気のせいだろうか

f:id:massoumen:20170505113600p:plain

ダウンロードしたらインストールすべく実行します。実行するとこんな感じの画面が出てくる。

f:id:massoumen:20170505113614p:plain

今回はC言語(C++)を使いたいので、とりあえず「C++によるデスクトップ開発」にチェックを入れる。

f:id:massoumen:20170505113622p:plain

右下のインストールを実行するとインストールが始まる。

f:id:massoumen:20170505113628p:plain

完了すると再起動を要求されるので再起動。

f:id:massoumen:20170505113633p:plain

再起動後、VisualStudio 2017が入っている事を確認。

f:id:massoumen:20170505113645p:plain

実行するとサインインを要求される。
マイクロソフトのアカウントを持っているならサインイン、そうでなければアカウントを作りサインインする。

f:id:massoumen:20170505113651p:plain

サインインに成功するとVisualStudio 2017が起動しこんな感じの画面が出る。

f:id:massoumen:20170505113658p:plain

プロジェクトの作成からHelloWorld!!まで

試しにC言語(C++)を使ってコンソール上でHelloWorld!!を表示させる。
まずは「ファイル」→「新規作成」→「プロジェクト」を選択。

f:id:massoumen:20170505113711p:plain

Visual C++の欄からWin32コンソールアプリケーションを選択。
名前とファイルの保存場所はご自由に。(今回名前はTest、保存場所はデスクトップ上にした。)

f:id:massoumen:20170505113719p:plain

決定するとこんな感じの画面が出てくる。

f:id:massoumen:20170505113729p:plain

次にソースコードを記述するためのソースファイルを追加する。
ソースファイルの箇所を右クリックし「追加」→「新しい項目」を選択。

f:id:massoumen:20170505113732p:plain

C++ファイル(.cpp)を選択。ファイル名はご自由に。(今回はSource.cppのまま。)

f:id:massoumen:20170505113735p:plain

すると、ソースコードが書けるようになるので次のコードを記述。

#include <stdio.h>

int main()
{
    printf("Hello World!!\n");

    return 0;
}

f:id:massoumen:20170505113739p:plain

CtrlとF5を同時押しして実行すると「Hello World!!」が表示される(と思う)。

f:id:massoumen:20170505113742p:plain

表示されたら成功。やったぜ。

コンソールが表示されない場合

CtrlとF5を同時押ししても黒い画面が出てこない場合は以下の操作を試してみて下さい。
まず、「プロジェクト」→「(プロジェクト名)のプロパティ」を選択。

f:id:massoumen:20170505114140p:plain

左上の「構成」を「すべての構成」にした後、「構成プロパティ」→「リンカー」→「システム」→「サブシステム」の設定を「コンソール(/SUBSYSTEM:CONSOLE)」に変更。

f:id:massoumen:20170505114204p:plain

設定を終了し再びCtrlとF5を同時押しして「Hello World!!」が表示されるか確認。
表示されたら成功。ダメだったら…僕にはよく分からないわ、ごめん。

後から他の機能を追加

後からC++以外(C#など)を利用したくなった場合の機能の追加方法のメモ。

今回はC#の機能を追加してみる。まず、VisualStudio Installerを起動。

f:id:massoumen:20170505114244p:plain

「変更」を選択。

f:id:massoumen:20170505114251p:plain

最初にインストールする時と同じ画面が出てくるので、追加したいものを選んで右下の「変更」を押す。
今回はC#の機能を追加したいので「.NETデスクトップ開発」を追加。
(追加インストール後に画面をキャプチャしたのでここに載っている画像は「閉じる」になっているが…)

f:id:massoumen:20170505114257p:plain

すると追加のインストールが始まるので見守る。

f:id:massoumen:20170505114303p:plain

終わったら「起動」でVisualStudio 2017を起動する。

f:id:massoumen:20170505114311p:plain

C言語(C++)の時と同様にプロジェクトの新規作成を行うと、項目が増えている。
今回はVisual C#の中の「コンソールアプリ(.NetFramework)」を選択。

f:id:massoumen:20170505114316p:plain

C#の場合最初からソースコードが少し書かれているので、適切な位置に以下の記述を追加。

Console.WriteLine("Hello World!!");

f:id:massoumen:20170505114322p:plain

C++の時と同様にCtrlとF5を同時押しして実行。

f:id:massoumen:20170505114329p:plain

表示されたら成功。

こんな感じで後から他の機能をいろいろ追加できる。

DXライブラリ使用時に終了後もプロセスが残る問題

事の始まり

DXライブラリを用いて通信(チャットプログラム)を試していたら、突然エラーが出るようになった。

f:id:massoumen:20170422190305p:plain

exeを起動しっぱなしの状態で実行すると出てくるエラーだが、今回はちゃんと終了させてから再び実行したはず…
そこで、 タスクマネージャで調べてみると…

f:id:massoumen:20170422190524p:plain

あれ、バックグラウンドでプロセスが残ってる…?(Chat.exeが試してるプログラム)

こいつを終了してやるとエラーが消えたので、やはり原因はこいつが残っている事にある。
しかし、なぜ残っていたのだろうか…

f:id:massoumen:20170422192419p:plain

exeを直接実行しては終了を繰り返すとエライ事に

調べてみたところ、恐らくProcessMessage()やDxLib_End()を適切に実行するようなプログラムを書けていないのが原因である。

ダメなパターン

プロセスが残ってしまう今回のパターンでは次のようなコードを書いた。

#include <DxLib.h>

//省略(他のインクルードやグローバル変数)

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    //省略(初期化やウィンドウサイズの設定など)

    //ZキーかXキーの入力があるまでループ(入力の受け付け)
    while (GetKey(KEY_INPUT_Z) == 0 && GetKey(KEY_INPUT_X) == 0) {
        KeyUpdate();
    }

    //省略(他の処理)

    DxLib_End();

    return 0;
}

大部分を省略してしまったが、GetKey関数とKeyUpdate関数は自作関数で、それぞれキーの状態とキーの入力状態の更新を行う自作の関数だ。
このような無限ループを用意してしまうと、もし入力の受け付け部分の無限ループでウインドウ右上の×を押した際に、恐らくDxLib_End関数まで処理が進まない。
もっと言えばDXライブラリではProcessMessage関数を毎フレーム実行するようにしないといけない(詳しくは知らないが、そうしないと正しく動かない可能性がある)らしいので、その点も悪いと考えられる。
恐らくDXライブラリを用いるプログラムとしては0点である。

(多分)大丈夫なパターン

要するに、DXライブラリを用いる際は

  • ループの時にProcessMessage関数を毎フレーム実行する
  • 最終的にDxLib_End()を実行する

という事に気を付ければいいんだと思う。(多分)

てなわけで早速修正。

#include <DxLib.h>

//省略(他のインクルードやグローバル変数)

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    //省略(初期化やウィンドウサイズの設定など)

    //ZキーかXキーの入力があるまでループ(入力の受け付け)
    while (ProcessMessage() == 0) {
        if (GetKey(KEY_INPUT_Z) == 0 && GetKey(KEY_INPUT_X) == 0) {
            KeyUpdate();
        }
        else {
            break;
        }
    }

    //省略(他の処理)

    DxLib_End();

    return 0;
}

キー入力など毎フレーム受け付けるタイプのものを利用する時はProcessMessage関数を実行する。
こうやって書く事で×ボタンでウインドウが閉じられた際にProcessMessage関数が0以外を返すので、無限ループを抜けDxLib_End関数を実行して終了してくれるはず。

このように書き直したところ、終了後にプロセスが残ってなかったので多分これでいいと思う。
用いるライブラリの仕様は最低限把握しておこう。

ネットワークメモ

目次

ネットワーク

  • ネットワークにおいて重要なことは他のコンピュータの情報を利用すること。(情報の共有化)
  • パケット交換方式:データを細かく分けて送る方式

ネットワーク機器の会社が独自の通信ルールを定めると異なる会社の機器を用いた際に通信が上手く行えない。
そこで、異なる機種同士の接続を行うための標準化を進めた。
国際標準化機構(ISO)によって作られたネットワークの標準モデルをOSI参照モデルと呼び、このモデルでは通信機能を7階層に分割している。
また、米国国防高等研究計画局(DARPA)によって作られたTCP/IPモデルというものも存在し、このモデルでは通信機能を4階層に分割している。
いずれも通信ルールを定めるという意味で役割は同じ。
インターネットに使われている通信ルール(TCP/IPプロトコル)はTCP/IPモデルに沿っている。

OSI参照モデル TCP/IPモデル
アプリケーション層 アプリケーション層
プレゼンテーション層 (アプリケーション層)
セッション層 (アプリケーション層)
トランスポート層 トランスポート層
ネットワーク層 インターネット層
データリンク層 インターフェース層
物理層 (インターフェース層)

TCP/IPモデルのアプリケーション層はOSI参照モデルでのアプリケーション層・プレゼンテーション層・セッション層を兼ねる。
TCP/IPモデルのインターフェース層はOSI参照モデルでのデータリンク層物理層を兼ねる。

  • プロトコル:各層におけるデータ転送などのルール
  • カプセル化:各層でデータを送るためのデータを付け足していく処理
TCP/IPモデル プロトコルの例
アプリケーション層 HTTP,DNS,SMTP,POP3
トランスポート層 TCP,UDP
インターネット層 IP
インターフェース層 イーサネット,PPP,PPPoE

以下TCP/IPモデルでの各層についての記述。

インターフェース層

  • LAN:会社内や大学内など特定の狭い範囲で用いられるネットワーク
  • イーサネット:LANで用いられるプロトコル。LANに繋がってる複数のコンピュータがやり取りを行う
  • ハブ:複数のコンピュータを接続するための中継用の機器

複数のコンピュータがデータの送受信を行うので、例えば同時にデータ(電気信号)が通ると衝突して通信に失敗する。
イーサネットではCSMA/CDという仕組みを用いて衝突を回避している

通常のハブの他、スイッチングハブが存在する。
通常のハブの場合、LAN内の他の特定のコンピュータへデータを送信すると接続されている全てのPCにデータが流れ、正しい送信先のコンピュータは流れてきたデータを受け取り、それ以外のコンピュータは自分宛じゃない事を確認して破棄している。
スイッチングハブの場合送信するデータの送信先を調べ該当するコンピュータにのみデータを流す。

  • NIC:これを通してデータを送る。また、各NICに対し番号(MACアドレス)が一意に割り当てられている。

イーサネットではMACアドレス送信先を決定する。

WANはLANと異なり長距離の送信かつ通信事業者の提供するサービスを利用するため、PPPによって認証などが行われる。
PPPの認証機能をイーサネット上で利用するためにPPPoEというプロトコルが存在する。

インターネット層

複数のネットワーク(コンピュータのグループ)をつなぐ。
ネットワーク内の通信は外へは出ず、他のネットワークにデータを送る場合はルータを利用する。

  • ルータ:ネットワーク同士を接続するのに使用する。また、ルーティングというデータの送信に適切な経路を決定する機能も持つ

インターフェース層ではMACアドレスを利用して次にデータを送る機器(中継を含む)を定めているのに対し、インターネット層ではIPアドレスを利用して最終的な送信先を定めている。

  • IPアドレス:ネットワーク上の機器を識別するための数字。ネットワーク部とホスト部からなる
  • サブネット:1つのネットワークをさらに複数の小さなネットワークに分割すること。識別用にホスト部の一部を利用する(サブネット部)
  • サブネットマスク:どこまでがサブネット部なのかを示すための値。ネットワーク部とサブネット部のビットは1、残りのホスト部のビットを0とする

トランスポート層

ポート番号を利用して受信したデータがどのアプリケーションのものなのかを判別。
また、正しいデータをアプリケーションへ正しく送信する。

  • ポート番号:各アプリケーションに割り当てられる番号

主要なサービスを提供するアプリケーション(メールの送信、Webサイトの情報送信)のポート番号は基本的に固定。

アプリケーション ポート番号
SMTP 25
DNS 53
HTTP 80
POP3 83

他にもいろいろある。サービスを要求するアプリケーションは提供側や他のアプリケーションと被らない番号を設定する。

トランスポート層での主なプロトコルにはTCPUDPがある。

TCP送信先に確実にデータを送る事を意識しているプロトコルである。
送信先がデータを受信できるか確認(スリーハンドシェイク)を行った後にデータを送信する。
分割したデータに番号を割り振り順序制御や再送制御を行い信頼性を高める。
フロー制御を行い効率化を行う。

UDPTCPとは逆に高速性を意識したプロトコルである。(TCPは信頼性を高める代わりに遅い)
少量のデータ送信やリアルタイム配信などの場合はこちらを用いる。

アプリケーション層

各アプリケーションに対し適切な通信サービスを行う。
Webサービスやメール受信サービスなどで異なるプロトコルが用意されている。

  • クライアント・サーバ型:要求側(クライアント)と提供側(サーバ)に分かれてデータをやり取りする形式

以下代表的なプロトコルとその役割

  • SMTP(Simple Mail Transfer Protcol):電子メールを送信する。POP3と組み合わせて使用
  • DNS(Domain Name System):IPアドレスドメイン名を対応させる(扱いやすいように)
  • HTTP(Hyper Text Transfer Protcol):HTMLによって書かれたデータなどをやり取りする
  • POP3(Pos Office Protcol version3):電子メールを受信する。SMTPと組み合わせて使用。

Markdownで資料を作る

Markdownとは

Markdown(マークダウン)は、文書を記述するための軽量マークアップ言語のひとつである。本来はプレーンテキスト形式で手軽に書いた文書からHTMLを生成するために開発されたものである。
(Wikipediaより引用)

要するに、比較的手軽にメモとか資料が書けるんです。(雑)
Qiitaとかはてなブログの記事を書くのにも使えるっぽいです。

どんな感じのものができるの

最終的にHTMLに変換してブラウザで表示しますが、こんな感じになります。
用いるソフトウェアによってビジュアルは若干変化すると思います。
これは後述するSublime Textを用いてHTMLで出力したものです。

f:id:massoumen:20170415220526p:plain

比較的シンプルな見た目で、ソースコードが結構綺麗に表示できるっぽい。

環境の導入

大まかな手順はこんな感じ

  1. Sublime Textのインストール
  2. Markdownを利用するためのパッケージのインストール

Sublime Textのインストール

この辺を参照

http://webmem.hatenablog.com/entry/sublime-text

Markdownを利用するためのパッケージのインストール

この辺を参照

http://webmem.hatenablog.com/entry/sublime-text-markdown

上のリンクを読みながら最終的にこの辺のパッケージを導入しておけば快適に扱えると思う。

書き方

C言語TeXなどと同様、書き方のルールがあるのでそれに従う。

書き方はこの辺を参照。QiitaでのMarkdown記法とかとは若干挙動が異なる場合がある?(よく分かってない顔
ちなみに、拡張子は[.md]となっている。

http://qiita.com/tbpgr/items/989c6badefff69377da7#%E8%A1%A8%E7%A4%BA%E4%BE%8B-10
http://cartman0.hatenablog.com/entry/2015/03/31/034758

終わりに

綺麗だからみんな使おう!(布教活動)