その身にシステム

大阪在住・新人エンジニアのメモランダム 【GitHub】https://github.com/taka-gh

カバレッジ率(Cなんちゃら)

カバレッジ率のC0、C1、C2がそれぞれどういう意味なのか忘れかけたので、書いておく。
下記のコード例をもとにする。

if ( /* condition1 */ && /* condition2 */ )
{
  /* method1 */
}
else
{
  /* method2 */
}

if ( /* condition3 */ )
{
  /* method3 */
}
else
{
  /* no operation */
}

C0 (statement coverage : 命令網羅)

すべての命令を検証する。
命令が無い分岐は必要ない。
下記2件で満たされる。

condition1 condition2 condition3
Case1 True True True
Case2 True False True

C1 (branch coverage : 分岐網羅)

全ての分岐を検証する。
各分岐についてTrue/Falseを1つずつ検証すればよい。(各"条件"ではない!!)
このあたりからネストが深いとツライ。
下記4件で満たされる。

condition1 condition2 condition3
Case1 True True True
Case2 True True False
Case3 True False True
Case4 True False False

C2 (condition coverage : 条件網羅)

全ての条件を検証する。
理想の検証だがするのは大変。
手動テストだと本当にツライ。
下記8件で満たされる。

condition1 condition2 condition3
Case1 True True True
Case2 True True False
Case3 True False True
Case4 True False False
Case5 False True True
Case6 False True False
Case7 False False True
Case8 False False False

Gitを触ってみる

最近「Git触ったことないの、スキルとしてヤバない?」と感じた。

Gitリポジトリのサービスは色々あるが、
Webベースで有名なGitHubを触ってみる。

GitHubには "Hello World チュートリアル" というものがある。
下記、日本語でまとめられている。最高。
tmnj.hatenablog.com

一通り実施した。

それでWebベースで操作できるのは分かった。
実際にはローカル作業との紐づけも必要なので、そちらも見る。
employment.en-japan.com

詳細は先人のページを見れば十分なので、
思考の整理メモを記載する。

clone
$ git clone 【リポジトリのURL】

リモートリポジトリ(GitHubなど)をローカルにコピー

branch
$ git branch 【作業用の分岐先】

ローカル作業用に自分用の領域(?)を作る。
「マスタ」ブランチは最終的な統合先なので、ここで直接作業すると危険。

add
$ git add 【新規ファイル】

リポジトリに無かったファイルは「アド」して、「リポジトリに含めますよ~」と認識させる。

commit
$ git commit

変更内容を「ローカル上」で反映。
オプションでコミット対象を変えたりできる。
ひとまず「 -a 」で全部反映。

push
$ git push 【リモートサーバ名】 【ブランチ名】

リモートサーバのブランチに反映させる。(ここでようやくローカル上からネットワーク上へ!!)
リモートサーバ名は「origin」(短縮名)がよく使われるらしい。

「originてなんやねん!!」となったので参考にした。
dqn.sakusakutto.jp

pull request

マスタブランチへの反映依頼。
GitHub上で操作。

fgetsを用いた数値入力受付

C における入力受付について、fgets を用いたアルゴリズムを考える。
目的は、scanf との違いを確認すること。

以下に数値入力受付の関数(getInputNum)のソースを記載する。
インクルードファイルは省略。
最大桁数は3桁とする。(配列の要素数で調整できる。)

int getInputNum() {
	int i = 0;
	int isNum = 0;
	char recv[4] = { 0 };  // 3文字+null文字を格納
	char tmp[4] = { 0 };  // バッファオーバー処理用

        // 数値以外の入力があればやり直し
	do {
		fgets(recv, sizeof(recv), stdin);

        // 改行文字がなければストリーム上に残っているはずなので、処理
		if (strchr(recv, '\n') == NULL) {
			while (strchr(fgets(tmp, sizeof(tmp), stdin), '\n') == NULL) {
			}
		}

        // 数値かどうかの判定
		for (i = 0; i < strlen(recv) - 1; i++) {
			isNum = isdigit(recv[i]);
			if (isNum == FALSE) {
				break;
			}
		}
	} while (isNum == FALSE);
	
    // char を int に変換
	return atoi(recv);
}

観察してみると、0~9の数字をそれぞれ1文字ずつ char 型文字として扱っている。
scanf でいきなり int 型変数に格納するよりは、かなり安全だな。オーバーフロー対策になる。
ただし fgets は改行文字も1文字とみなして格納するから、そのあたりの調整は苦労する。

ベーシックな電卓

数式パーサーをある程度理解したので、
それを用いて電卓を作った。

GIFも貼れるのかな?
f:id:taka_system:20170905233009g:plain

機能としては
 ・四則演算
 ・テキスト入力も対応
といった感じ。
今回はパーサーの感覚を知りたかったのでひとまず完成ということで。
時間があれば複雑な計算式も可能なものを作りたい。

今後は資格の勉強も兼ねてしばらくC言語をやる。予定。

数式を解析したい

仕事で構文解析の勉強が必要になった。
今作っている電卓でついでに学んでしまおう。

下記サイトが参考になりそうなので、貼っておく。
qiita.com

木構造は図で表すと簡単だが、コードになると難しいと思った。

電卓で練習

プログラム勉強するなら何かソフト作るのが良い。
というわけで電卓を作る。

今日は外形だけ。
f:id:taka_system:20170829231402p:plain
WPFアプリケーションでも良いのだが、
仕事でWindowsフォームを使うのでそちらで。

C#を触った

仕事でC#の知識が必要になったので、簡単な予習も兼ねて家でも触ってみた。
ひとまずHelloWorld的なものが欲しいので、
クリックしたらメッセージが出るという簡単なプログラムを作った。

f:id:taka_system:20170823233116p:plain

WPFアプリケーションとして作ったので、XAMLを使った。
これはHTMLに雰囲気が似ているから、親しみやすい。