08 Sep 2013, 09:45

JUnitでthrowで投げた例外を検証する方法のメモ

最近記事投稿数が少ないので、ごまかし程度にメモを。

錆びついたJavaの知識にオイル刺しをしている日々ですが、今日は例外処理をJUnitで実施する方法を調べました。

まずは、Javaでの例外の投げ方。以下の用に記述することで、例外を投げてプログラムを終了させることができます。

throw new (エラー)

たとえば、キューにエンキューしたときに、NULLをエンキューしようとしたときは、以下のようにしてjava.lang.NullPointerExceptionの例外を投げる。

public void addFirst(Item item)
  {
    if(item == null)
      throw new java.lang.NullPointerException();
        ...
}

これを、Junitで期待した例外で終了したかどうかを検証するためには、try、catchを利用する。fail()がコールされないことを持ってして、成功と判断する。なかなかトリッキーな方法だ。

 try{
   (例外を発生させる関数);
   fail("Error");
 }catch((エラー) expected){ }

たとえば、以下のようなテストを記述する。

@Test
public void DequeAddFirstNull()
{
 Deque que = new Deque();

 try{
   que.addFirst(null);
   fail("Error");
 }catch(NullPointerException expected){ }
}

08 Sep 2013, 02:00

TopCoder SRM 590 div2 250

TopCoderに参戦!

深夜のTopCoderは起きてるのだけで辛い。。。>_<

CourseraのAlgorithms Part1のノルマをこなすために、この日は朝からずっとアルゴリズム漬けだった。15時間の勉強のあとに、TopCoder参戦。

Courseraはイバラの道だったな。。。休日が課題で潰れる。もっと平日定時退社できればいいのだけれども。

そんなこんなで、疲れ果ててほとんど問題が解けなかった。いつになっても全く成長できない。。。

 

01 Sep 2013, 07:53

EclipseとGithubを連携させるプラグイン『EGit』を利用して、新しいリボジトリを作成する手順メモ

Githubにローカルリポジトリを登録する方法は以前調べました。

今回、Eclipseで管理しているプロジェクトをそのままGithubにアップロードしたかったので、その手順をメモします。

環境

  • Eclipse 4.3 Kepler
  • git 1.7.9

Egitプラグインをインストール

まだEGITがはいっていない場合は、インストールする。たぶん、デフォルトで搭載されているはず。

ローカルリポジトリの作成

Git管理したいプロジェクトを右クリックして

  • チーム -> プロジェクトの共用 -> Git -> 次へ
  • プロジェクトの親フォルダ内のリポジトリを使用または作成をチェック
  • 完了を選択。

これで、すでに.gitがある場合はそれをEclipseから見ることができ、.gitがない場合は新規作成されます。

無視するフォルダを選択して、チーム -> 無視 を選択。これで、.gitignoreにフォルダが登録されます。

  • .setting/org.eclipse.jdt.core.prefsはEclipseの設定ファイルなので、無視。
  • .classpathはビルド時の外部jarのパスがかかれたファイルなので残す。
  • .projectはEclipseプロジェクトの設定ファイルなので、残す。

.gitignore

/bin
/.settings

最後に、初回commitをしましょう。チーム -> コミットでコミットする。

githubにリポジトリリポジトリ作成

githubにリポジトリを作成します。詳細は、以前の記事と同じなので、省略。

ここでは、リモートリポジトリになにも作成しません。

EclipseとGithubを連携する

Githubにpushします。

チーム -> リモート -> プッシュを選択。

URIの欄に、HTTPSのURLを選択

https://github.com/tsu-nera/coursera-algorithms-part1.git

あとの欄は勝手に入力される。

続いて、ref mappingの設定。ここでは、ローカルのmaster branchに、リモートのmasterブランチを対応させる。

  • ソース参照 refs/heads/master
  • 宛先参照 master

これで、プッシュできるようになりました。

つづいて、プルの設定。

チーム -> リモート -> 次から取り出しを選択。

続いて、ref mappingの設定。ここでは、ローカルのmaster branchに、リモートのmasterブランチを対応させる。

  • ソース参照 refs/heads/master
  • 宛先参照 refs/remotes/origin/master

これで、フェッチを選んでもリモートから取れなくて、プルを選択するとリモートから取得できる。このへんは理由がよくわからない。

ちなにみ、作業中に以下のエラーがでた。

現在のブランチはプル用に構成されていません
構成にキー branch.master.merge の値がありません

以下のサイトを参考に解決。

01 Sep 2013, 02:49

テスターの視点を手に入れるために『実践アジャイルテスト』を読みました

実践アジャイルテストを読んだ読書メモです。



開発者以外の視点を手に入れるために、読んで見ました。テスターの人は連日自分のバグを洗い出してくれるので、私は感謝と憎悪そのたもろもろの、複雑な思いをテスターのひとたちに抱いている今日このごろです。

ディベロッパーよりは、テスターのための本。単体テスト、結合テストの上位に位置するテストについて書かれた本です。

また、Fitnesseがたくさん紹介されているらしいという口コミをきいたので、読んでみました。


受け入れテスト用フレームワーク「Fitnesse」導入手順のまとめ | Futurismo


正直にいうと、あまり深くは読んでいないです。流し読み。ただ、テストコードが本に一回も現れないため、スラスラ読めます。珠玉のアイデアを発見できたので、忘れないようにメモしておこうと思います。

ウォーターフォール型テスト vs アジャイルテスト

ウォーターフォールテストでは、長期間の中盤から最後にかけてテストを実施する。

アジャイルテストでは、まず機能テストを書く。テストファースト。短い開発期間の中で、シナリオテストを区切りにして、イテレーションを繰り返していく。テストが開発を駆動する点では、TDDとも言える。

どこでテストを書くかという点が異なる。最後にテストをするのがウォーターフォール。最初にテストをするのがアジャイルテスト。

アジャイルテストマトリックス

アジャイルテストは、4つの象限に分類できる。

機能テスト

第2象限:手動と自動テスト。

探索テスト
シナリオテスト
ユーザビリティテスト

第3象限:手動テストが必要。

単体テスト
結合テスト

第1象限: 自動テスト

パフォーマンステスト
~性テスト

第4象限:ツールでのテスト

                  <p>
                    &#160;
                  </p>

                  <p>
                    アジャイルとつくからには、自動化できることは自動化しようという意図が裏にある。
                  </p>

                  <h4>
                    第1象限
                  </h4>

                  <p>
                    単体テストや結合テストといっているのが、いわゆるxUnitフレームワークを利用した、開発者が実施するテスト。
                  </p>

                  <h4>
                    第2象限
                  </h4>

                  <p>
                    機能テスト。顧客テスト、ストーリーテストとも呼ばれる。顧客が求めている機能が満たされているかをテストする。
                  </p>

                  <h4>
                    第3象限
                  </h4>

                  <p>
                    シナリオテストや探索的テストがここに入る。
                  </p>

                  <p>
                    シナリオテストは、機能を組み合わせたワークフローのテスト。自動化できたりできなかったり。
                  </p>

                  <ul>
                    <li>
                      <a href="http://blog.livedoor.jp/prjmng/archives/52281332.html" target="_blank">ソフトウェアの品質を学びまくる:「シナリオテスト」とは一体、何なのか &#8211; その1</a>
                    </li>
                  </ul>

                  <p>
                    探索的テストは、バグってそうなところを経験と推測で試行錯誤しながら探していくテスト。詳しくは以下。
                  </p>

                  <ul>
                    <li>
                      <a href="http://www.itmedia.co.jp/im/articles/1111/07/news203.html">情報マネジメント用語辞典:探索的テスト(たんさくてきてすと) &#8211; ITmedia エンタープライズ</a>
                    </li>
                  </ul>

                  <p>
                    想定外の、げっこんなことやるのかよと、ぞっとするのがココ。
                  </p>

                  <h4>
                    第4象限
                  </h4>

                  <p>
                    製品を批評するテストがここに入る。観点のテスト。非機能テスト。例を以下に列挙。
                  </p>

                  <ul>
                    <li>
                      パフォーマンステスト、負荷テスト、ストレステスト。
                    </li>
                    <li>
                      セキュリティ
                    </li>
                    <li>
                      ユーザビリティ
                    </li>
                    <li>
                      保守容易性(mentainability)
                    </li>
                    <li>
                      導入容易性(Installability)
                    </li>
                    <li>
                      信頼性(reliablirity)
                    </li>
                  </ul>

                  <h3>
                    自動化テストのピラミッド
                  </h3>

                  <p>
                    4つのレベルに分類できる。
                  </p>

                  <table cellspacing="0" cellpadding="0" width="482" border="1">
                    <tr>
                      <td valign="top" width="275">
                        手動テスト
                      </td>

                      <td valign="top" width="205">
                        努力
                      </td>
                    </tr>

                    <tr>
                      <td valign="top" width="275">
                        GUI/CLIてテスト
                      </td>

                      <td valign="top" width="205">
                        Selenium,expect・・・
                      </td>
                    </tr>

                    <tr>
                      <td valign="top" width="275">
                        受け入れテスト(APIレイヤのテスト)
                      </td>

                      <td valign="top" width="205">
                        Fit,Fitnesse
                      </td>
                    </tr>

                    <tr>
                      <td valign="top" width="275">
                        単体テスト・コンポーネントテスト
                      </td>

                      <td valign="top" width="205">
                        xUnitフレームワーク
                      </td>
                    </tr>
                  </table>

                  <p>
                    &#160;
                  </p>

                  <p>
                    ここで新しく知ったのが、APIレイアのテスト。GUI/CLIなどの直接外に見えるI/Fの裏側のテスト。APIを直接テストすることで、よりテストを網羅的に、高速に実施することができる。
                  </p>

                  <p>
                    そして、そのためのツールがFitnesse。
                  </p>

                  <h3>
                    まとめ
                  </h3>

                  <p>
                    この本は膨大な分厚さ(500Pくらい!)で、流し読みではなくて何度読んでもそのたびごとに発見があると思われる本。品質保証のすべてが網羅的に書かれている良書。
                  </p>

                  <p>
                    単に、技術的な手法の紹介ではなくて、アジャイル開発に対してテストはどうあるべきかという思想が随所で書かれている。
                  </p>

                  <p>
                    機会があればまた読みなおしたい一冊。
                  </p>

                  <hr />

                  <div class="amazlink-box" style="overflow: hidden; font-size: small; zoom: 1; padding-bottom: 20px; text-align: left">
                    <div class="amazlink-list" style="clear: both">
                      <div class="amazlink-image" style="float: left; margin: 0px 12px 1px 0px">
                        <a href="http://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%83%86%E3%82%B9%E3%83%88-%E3%83%86%E3%82%B9%E3%82%BF%E3%83%BC%E3%81%A8%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%83%81%E3%83%BC%E3%83%A0%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-IT-Architects%E2%80%99Archive-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E3%81%AE%E5%AE%9F%E8%B7%B5/dp/4798119970%3FSubscriptionId%3DAKIAJBCXQ4WQGJ7WU3WA%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4798119970" rel="nofollow" target="_blank"><img style="border-top: medium none; border-right: medium none; border-bottom: medium none; border-left: medium none" src="http://ecx.images-amazon.com/images/I/51TkJaY4jPL._SL160_.jpg" /></a>
                      </div>

                      <div class="amazlink-info" style="margin-bottom: 10px; height: 160px">
                        <div class="amazlink-name" style="margin-bottom: 10px; line-height: 120%">
                          <a href="http://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%83%86%E3%82%B9%E3%83%88-%E3%83%86%E3%82%B9%E3%82%BF%E3%83%BC%E3%81%A8%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%83%81%E3%83%BC%E3%83%A0%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-IT-Architects%E2%80%99Archive-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E3%81%AE%E5%AE%9F%E8%B7%B5/dp/4798119970%3FSubscriptionId%3DAKIAJBCXQ4WQGJ7WU3WA%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4798119970" rel="nofollow" target="_blank">実践アジャイルテスト テスターとアジャイルチームのための実践ガイド (IT Architects’Archive ソフトウェア開発の実践)</a>
                        </div>

                        <div class="amazlink-powered" style="font-size: 80%; margin-top: 5px; line-height: 120%">
                          posted with <a title="アマゾンアフィリエイトリンク作成ツール" href="http://amazlink.keizoku.com/" target="_blank">amazlink</a> at 13.09.01
                        </div>

                        <p>
                          <noscript>
                            <a href="http://bust-up.gob.jp">xn--cck2b5as2b7b</a>
                          </noscript>
                        </p>

                        <div class="amazlink-detail">
                          Janet Gregory
                        </div>

                        <div class="amazlink-sub-info" style="float: left">
                          <div class="amazlink-link" style="margin-top: 5px">
                            <img src="http://amazlink.fuyu.gs/icon_amazon.png" width="18" /><a href="http://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%83%86%E3%82%B9%E3%83%88-%E3%83%86%E3%82%B9%E3%82%BF%E3%83%BC%E3%81%A8%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%83%81%E3%83%BC%E3%83%A0%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-IT-Architects%E2%80%99Archive-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E3%81%AE%E5%AE%9F%E8%B7%B5/dp/4798119970%3FSubscriptionId%3DAKIAJBCXQ4WQGJ7WU3WA%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4798119970" rel="nofollow" target="_blank">Amazon</a> <img src="http://amazlink.fuyu.gs/icon_rakuten.gif" width="18" /><a href="http://hb.afl.rakuten.co.jp/hgc/g00q0724.n763w947.g00q0724.n763x2b4/archives/c=http%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F6255709%2F&m=http%3A%2F%2Fm.rakuten.co.jp%2Frms%2Fmsv%2FItem%3Fn%3D6255709%26surl%3Dbook" rel="nofollow" target="_blank">楽天</a>
                          </div></p>
                        </div></p>
                      </div></p>
                    </div></p>
                  </div>

                  <hr />

31 Aug 2013, 02:05

PC操作をジェスチャーでできる『Leap Motion』を購入をしました!初めての使い方まとめ

最近なにかと話題のセンサーデバイス、『Leap motion』(リープモーション)を購入をしました!

20130831091647.jpg

購入方法

注文はamazonでしました。価格は80ドルらしいが、アマゾンで購入したら12000円した。4000円ぼったくられた?畜生、やられたら倍返しだ!



Leap Motionとは

Leap Motionとは、手の動きだけでパソコンを操作するためのセンサーデバイスです。

動画を見たほうが早いかも。Youtubeの公式紹介動画はこちら。

[//www.youtube.com/embed/_d6KuiuteIA?rel=0]

開封してみる

箱の外観図。なんだか、iPhoneを購入した時のように、心がワクワクします!

20130831083848.jpg

箱をあけてみた!うわっ、小さい!Kinect涙目。。。

20130831083922.jpg

手のひらサイズです。手乗りインコのように可愛いです。よしよし、これからかわいがってあげるよ。

20130831091502.jpg

USBケーブルが短いものと長いもので2つついてきます。また、説明書っぽいものがあるけれども、ぽいだけで、実際はネットの情報を元にインストールします。これだけ!

20130831091246.jpg

 

マウスといっしょに撮影したもの。

20130831083959.jpg

LeapMotionを使ってみる

導入手順も動画でまとまっています。

 

Getting Started Windows from Leap Motion on Vimeo.

まずは、パソコンにLeapMotionようのソフトウェアをインストールします。以下からダウンロード。Windows用とMac用が用意されている。

Airspaceというアプリが入りました。これは、iPhoneでいうところのiTunesのようなもので、ここでアプリを管理します。

アプリを起動すると、簡単なオープニングデモ(Orientation)がはじまる。感動した!

20130831104925.jpg

アプリをインストールして遊ぶ

アプリは以下のサイトから落としてくることができます。


Airspace Store by Leap Motion


有料のものと無料のものがあるようです。

まだ、種類は多くないですが、これから大流行しそうな予感がします((o(´∀`)o)



27 Aug 2013, 13:00

TopCoder SRM : 587 Div2 Level1 Level2

TopCoder参戦!今日は、定時退社をしようとおもったけれども結局できずに、会社近くのカフェからTopCoder参戦した。

今週から、CourseraのAlgorithms PartⅠを受講中。本格的に、アルゴリズムの勉強に力を淹れている。


Algorithms, Part I | Coursera



Level1は、過去問で似たような問題を解いたことがあるので、mapを利用して難なくクリア。

Level2は、問題の意味を理解するのに苦戦。最後は、やっつけで条件を追加したらテストをパスしたのでそのまま提出。案の定、システムテストで落とされた。

25 Aug 2013, 11:59

タイムストレッチをC++で実装する方法を調べてみました

タイムストレッチ(TimeStretch)をC++で実装する方法を調べてみました。

調べただけで、結局いい方法が見つかりません。誰か教えてください。

そもそもタイムストレッチとは

タイムストレッチとは、音程(ピッチ)を変えずに速度(テンポ)だけを変更する、音声処理。

アルゴリズム的にはフーリエ変換とかするらしいけれども、大学生の時、その大学の授業は抜け出してフランス映画を見に行った思い出しかないので、自分では無理。便利な変換ライブラリを探してみた。

VLC Player

はじめにとったのがこの方法。VLC Playerをサーバモードで起動しして、C++のソースからソケット通信してコマンドを送りつけた。

これはこれでうまくいったのだが、サーバへの通信を実施するので、微妙なタイムラグが入った。

DirectShow

DirectShowのサンプルがあったので、真似するとタイムストレッチができた。

ほか、参考リンク。

ただ、この方法だと音程も高くなってしまった。実現したいのは、音程はそのままで速度だけ可変にしたい。

このページによると、DirectShow用のフィルタは自分で作りなさいと書いてある。えっ!

Windows Media Player SDK

Windows Media Player SDKの IWMPSettings::put_rate を使用すると再生速度変換ができるらしい。これも、上のリンクに書いてあった方法。

Media player Classic

Media player Classicにフィルタを設定するとタイムストレッチできるみたいだけれども、それがコードからいじれるかは不明。

そして困ったときのStackoverflow

最後にたどり着くのは、やっぱりStackoverflow

ここでは、以下のライブラリが紹介されている。

商用だと以下。

とりあえず、SoundTouchがシンプルでつかえそうなので、これに挑戦してみることにした。

タイムストレッチ(TimeStretch)をC++で実装する方法を調べてみました。

調べただけで、結局いい方法が見つかりません。誰か教えてください。

そもそもタイムストレッチとは

タイムストレッチとは、音程(ピッチ)を変えずに速度(テンポ)だけを変更する、音声処理。

アルゴリズム的にはフーリエ変換とかするらしいけれども、大学生の時、その大学の授業は抜け出してフランス映画を見に行った思い出しかないので、自分では無理。便利な変換ライブラリを探してみた。

VLC Player

はじめにとったのがこの方法。VLC Playerをサーバモードで起動しして、C++のソースからソケット通信してコマンドを送りつけた。

これはこれでうまくいったのだが、サーバへの通信を実施するので、微妙なタイムラグが入った。

DirectShow

DirectShowのサンプルがあったので、真似するとタイムストレッチができた。

ほか、参考リンク。

ただ、この方法だと音程も高くなってしまった。実現したいのは、音程はそのままで速度だけ可変にしたい。

このページによると、DirectShow用のフィルタは自分で作りなさいと書いてある。えっ!

Windows Media Player SDK

Windows Media Player SDKの IWMPSettings::put_rate を使用すると再生速度変換ができるらしい。これも、上のリンクに書いてあった方法。

Media player Classic

Media player Classicにフィルタを設定するとタイムストレッチできるみたいだけれども、それがコードからいじれるかは不明。

25 Aug 2013, 02:06

gccよりも高速な次世代コンパイラClangをCygwinでつかってみた

最近流行のコンパイラ、Clangを試してみました。

Clangとは

Clangとは、gcc,iccのような、コンパイラの一種です。プログラミング言語C、C++、Objective-C、Objective-C++用。

Clangの最終目標は、GNU gccの置き換えらしい。

静的解析能力やリファクタリング機能などももつため、IDEとの結合も目標らしい。

以下は、setreduceという、Googleのエンジニアが開発しているリファクタリングツールのデモ動画。

[//www.youtube.com/embed/mVbDzTM21BQ?rel=0]

Clangを利用すると、コンパイラ時間がgccに比べて短くなるらしい。今回の目的は、それを確かめるためです。Clangのパフォーマンスがgccよりも良かったら乗り換えてみる。

Cygwinへのインストール

setup.exeに用意されているようです。自分はapt-cygで取得。

$ apt-cyg install clang
$ apt-get install llvm
$ clang -v
clang version 3.1 (branches/release_31)
Target: i386-pc-cygwin
Thread model: posix

取得できたものは、3.1。現在の最新は、3.3なので、少し古い。

ベンチマーク

C言語でかかれたプロジェクトをベンチマークとしてコンパイルしてみます。Clangのコンパイラオプションはgccと互換性があるので、makefileのCCオプションを変えるだけで行ける。

tree project

curl -LO http://mama.indstate.edu/users/ice/tree/src/tree-1.6.0.tgz
  • gcc 7.8s
  • clang 9.5s

なんと、gccの勝利。あれ(・・?

screen project

git clone git://git.sv.gnu.org/screen.git
  • gcc 1:34
  • clang 1:02

おお、30秒も速かった!Clangの圧倒的勝利。

Warningメッセージもカラー付きでわかりやすく表示してくれる。

process.c:6272:35: warning: operator '?:' has lower precedence than '+'; '+' will be evaluated first [-Wparentheses]
strncpy(p, buf, 1 + (l < len) ? l : len);
                ~~~~~~~~~~~~~ ^

eclipseからClangでコンパイルする(4.3ではバグってた)

LLVM Tool Chain for Eclipse CDTプラグインをインストールする。

プロジェクトを右クリックして C/C++ビルド > ツールチェーン・エディタ を選択。

互換ツールチェーンのみ表示のチェックを外すと、ツールチェーンにLLVM Clang(cygwin)が選択できるので、選択。

ただし、Eclipse最新版4.3で試したところ、2度めに設定画面を開くとNullPointerExceptionが発生する。つまり、まだバグっているから使わないほうがいいということ。

最後に、ウィンドウ -> 設定 -> LLVM を選択。Library path libstdc++ がある場所のパスを通す。自分の環境では、C:\cygwin\lib\gcc\i686-pc-cygwin\4.5.3

これで、EclipseからClangでコンパイルできた。

24 Aug 2013, 20:55

ボクの相棒ノートPC『VAIO』の容量を増やすために実施したことのメモ(Windows,SSD)

掲題の通り、いつも使っているノートPC VAIOの容量が残り10GBを切ってしまい、イタイイタイ思いをしているため、容量拡大のためにやったことをメモします。

20130824110807.jpg

メディアファイルの削除

ノートPCにはメディアファイルは不要です。必要ならば、自宅のHDDに保存しておけばいいので。ということで、必要最低限を残してすべて削除。

不要なファイル・プログラムの精査

いらないファイルやプログラムはないかどうか精査します。

プログラム

スタートメニューのコントロールパネル > プログラムのアンインストールから、インストールされているプログラム一覧を見て、不要なものを片端から削除。

ファイル

マイドキュメントを見て、いらないファイルを削除

巨大ファイルの削除

巨大なファイルのなかで、不要なものを削除しました。

巨大ファイルの検索方法は、エクスプローラの検索を利用します。検索フィルタのサイズで巨大を選択。これで、129MBより大きなファイルを検索することができます。

自分の場合は、virtualboxのファイルが大きかったので、すべて削除!

ディスククリーンアップの実行

これは、王道ですね。

スタートメニューの コンピュータを選択。次にドライブを選択し、ディスクのクリーンアップを選択。あとは、実行して不要な一時ファイルをすべて削除するのみです。

SSD固有の設定を削除

これは、SSD固有の容量の増やし方。以下のページを参考にしました。


最低限これだけはやっておくべきSSDの書き込み対策と空き容量を増やす方法! – 裏技shop DD


  • hibernate
    ページングファイル
    システムの復元
    RAMディスクとTEMP&キャッシュ移動
    ファイルインデックス

hibernateというのは、休止モード。ノートPCだと、バッテリー充電率が10%を切ると休止モードになるので、これは有効のままにしておいた。これを無効にすると、3GBの容量が手に入る。

あとは、再起動だ!

結果

こうなりました。

SnapCrab_NoName_2013-8-25_5-54-3_No-00

10GBの削減。まあ、sosoのできです。

その他、所感

ほかにも、DropboxやSugerSyncなどのオンラインストレージサービスを利用すると容量増えるかなとおもっていろいろサービスを契約したけど、結果的にはあれらはローカルドライブの容量も食いつぶしていることがわかったorz。

こういう小手先テクニックではなくて、SSDやメモリ増強をしてしまったほうが圧倒的に効果的なキがしますが。それはもう少しこのスペックで頑張ったあとで。

そろそろ、バッテリもヘタってきたのであと1年もつかな(・・?

21 Aug 2013, 15:46

レガシーコードをC言語のTDD用フレームワーク『Fake Function Framework (fff)』ですっぽんぽんにする

以前、こんな記事を書きました。

CMockは素晴らしいツールで、正直これがないとこの3ヶ月で心がへし折られていたと思う。しかし今日は、CMockに対向できるような素晴らしいツールを発見したので紹介。その名も、

FFF

ファイナルファンタジーではないが、魔法のようなツールだ。

FFFってなに

Fake Function Framework。ダミー関数を自動生成してくれる、『C言語』のためのツール。フェイク関数のフレームワークといいつつも、実際はスタブ関数やスパイ関数などなど、いろいろ生成するツールだ。

githubからダウンロードできる。

基本編

一番くわしいリファレンスは、githubのReadme.mdを以下はそれを参考に、いろいろと実験。

git clone git@github.com:meekrosoft/fff.git

xUnitフレームワークは、Unityを利用します。

はじめの一歩

定形の宣言。fff.hのなかに、すべてが集約されている。テストコードに以下を追記。

// Test_uhauha.c
#include "fff.h"
#include 
DEFINE_FFF_GLOBALS;

fff.hのなかで、memsetを利用しているようなので、string.hかが必要。

FFFでDummyする

まずは、ダミー関数を。hogehogeの実体をコンパイルすることなく、uhauha関数からhogehogeを呼び出す。

// uhauha.c
#include "uhauha.h"
#include "hogehoge.h"

void uhauha(void)
{
  hogehoge();
}

// hogehoge.h
int hogehoge(void)

void hogehoge(void)型を置き換えるには、テストコードに以下を追加する。

// Testuhauha.c
FAKE_VOID_FUNC(hogehoge);

これで、ダミー関数が宣言されて、コンパイルが通る。

これだけなのです!!魔法みたい!ウッハウハですね。

FFFでスタプする

hogehoge()をスタブ関数にします。必ず1を返すようにする。。

// uhauha.c
int uhauha2(void)
{
  return hogehoge2();
}

// hogehoge.h
int hogehoge2(void)

テストコードに以下を宣言。

// Testuhauha.c
FAKE_VALUE_FUNC(int, hogehoge2);

そして、実際のテストでは、1を返すようにhogehoge2_fake.return_valに値を入れる。

void test_uhauha2(void)
{
  hogehoge2_fake.return_val = 1;
  TEST_ASSERT_EQUAL(1, uhauha2() );
}

これで、hogehoge2は必ず1を返すフェイク関数ができる。

これだけなのです!!魔法みたい!ウッハウハですね。

FFFでスパイする

Spy関数も生成できるようです。

hogehoge3()に渡された値をスパイして、あとで結果をAssertします。

// uhauha.c
void uhauha3(int x)
{
  x++;
  hogehoge3(x);
}

// hogehoge.h
void hogehoge3(int);

テストコードはこちら。hogehoge3_fake.call_countで呼ばれた回数を、hogehoge3_fake.arg0_valで呼ばれた値を検証している。

// Testuhaha.c
FAKE_VOID_FUNC(hogehoge3,int);

void test_uhauha3(void)
{
  uhauha3(1);

  // check how many times hogehoge3 called.
  TEST_ASSERT_EQUAL(hogehoge3_fake.call_count, 1);
  // chech what value was given
  TEST_ASSERT_EQUAL(hogehoge3_fake.arg0_val, 2);
}

これで、hogehoge3をスパイできる。

これだけなのです!!魔法みたい!ウッハウハですね。

応用編

 スタブとスパイの合わせ技

スタブしつつ、スパイの検証もできる。以下のように宣言。たとえば、

int hogehoge4(int);

をスパイしつつフェイクするには、以下を書く。

FAKE_VALUE_FUNC(int, hogehoge4,int);

シーケンス制御の検証

ほかにも、シーケンスの検証も可能。シーケンスのチェックこそがモッキングフレームワークなのだよ!詳細は省略。

カスタム関数を利用してフェイク、スパイする

登録した関数がコールされた時に、自分で作成した関数に飛ばすことができる。

 hogehoge5_fake.custom_fake = hogehoge_custom_fake;

のように宣言して

void hogehoge_custom_fake(){}

みたいに、自分が関数を用意する。プリプロセッサ接合部で置換するので、関数ポインタやリンク時の整合部を意識することなく、さくっと自前関数に飛ばせる。便利(・∀・)。

個人的最大の課題 データを渡す関数のモック

自分の扱っているコードは、メモリ獲得した構造体データを引数にして関数に渡すことがほとんど。こんな感じ。

//hogehoge.h
typedef struct hogehoge {
  int time;
  int status;
  int factor;
}HOGEHOGE;
void hogehoge5(HOGEHOGE *hogehoge);

//uhauha.c
void uhauha5(void)
{
  HOGEHOGE *hogehoge = (HOGEHOGE *)calloc(1,sizeof(HOGEHOGE));
  hogehoge->time   = 1;
  hogehoge->status = 2;
  hogehoge->factor = 3;

  hogehoge5(hogehoge);
}

こういうhogehoge5をチェックするには、自前のスパイ関数を作成して検証していた。fff.hを利用すれば検証がサクットできる。

HOGEHOGE last_hogehoge;
void hogehoge5_spy(HOGEHOGE *hogehoge)
{
  memcpy(&last_hogehoge,hogehoge,sizeof(HOGEHOGE));
  free(hogehoge);
}

void test_uhauha5(void)
{
  hogehoge5_fake.custom_fake = hogehoge5_spy;
  uhauha5();

  TEST_ASSERT_EQUAL( 1, last_hogehoge.time);
  TEST_ASSERT_EQUAL( 2, last_hogehoge.status);
  TEST_ASSERT_EQUAL( 3, last_hogehoge.factor);
}

感想

以前の記事で、『プリプロセッサ接合部』について書きました。

このfffは、『プリプロセッサスゲーΣ(゚Д゚ノ)』と思わせるツールでした。C言語のプリプロセッサの底力を垣間見たフレームワーク。レガシーC言語バンザイヽ(´ー`)ノ

CMockは便利だが、xUnitがUnityに限定されてしまう。それに対してこのfff.hは、移植性がとても高そうだ。評価してないけど、いろんなフレームワークでいっしょに利用できそう。C言語のフレームワークだが、extern “C”のテクニックをりようすることで、C++系のxUnitフレームワークでも利用可能。

CMockはRubyスクリプトでダミー関数を一気に生成することができる。

fffは必要なダミー関数を必要なだけ作成する点が異なる。自分の扱っているコードはテストがあるなんという金持ち環境ではなく、技術的負債で潰れかけているので、ねじ込むようにテストを書くにはCMockが必須う。

CMockだと、引数に構造体ポインタを渡す関数をうまくモックできなかった(やりかたがわからないだけかも)。そういう場合は、結局自分でモック関数を作成していた。しかし、fffを利用すればちょっと楽がデキそうた。

Reference