08 Oct 2012, 23:34

DoxygenとJenkinsを連携させてみた。

前回までの記事で、Doxygenの基本的な使い方を書いた。

Doxygenでドキュメント管理しても、実は見ないことのほうが多かったりする。その理由は、

  • 目につく場所にないから
  • ソースコードを修正するたびにdoxygenファイルを作り直すのが面倒だから
  • ソースの修正がドキュメントに反映されていないから

などなど、考えられるが、Jenkinsを利用して、Jenkinsジョブを流すたびにドキュメントを更新し、さらにはJenkinsから閲覧できるようにすれば、上に上げた課題は解決するかも。

というわけで、JenkinsとDoxygenを連携してみる。

Doxygen Pluginのインストール

JenkinsにはDoxygen Pluginというものがあるので、インストールする。

[Jenkinsの管理] > [プラグインの管理] からDoxygen Plugeinを選択して、ダウンロードとインストール。

インストールできたらジョブの[設定] からビルドのDoxygenの生成コマンドを追加。

ex.) doxygen doxygen.conf

[ビルド後の処理の追加]から[Publish Doxygen]を選択。

doxygenの設定ファイルを指定する。

image

ビルドを実行して、Doxygenファイルを生成してみる。

DoxyGen HTMLというメニューが現れて、リンク先からDoxygenを閲覧することができる。


注意: こんなエラーがでたら、Doxygenのフォルダパスを指定している。

フォルダではなくて、Doxyfileを指定する。

Publishing Doxygen HTML results.
FATAL: error
java.io.FileNotFoundException: C:\Users\TSUNEMICHI\Dropbox\src\mock_study\html (アクセスが拒否されました。)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(Unknown Source)
    at hudson.plugins.doxygen.DoxygenDirectoryParser.loadDoxyFile(DoxygenDirectoryParser.java:208)
    at hudson.plugins.doxygen.DoxygenDirectoryParser.retrieveDoxygenDirectoryFromDoxyfile(DoxygenDirectoryParser.java:345)
    at hudson.plugins.doxygen.DoxygenDirectoryParser.invoke(DoxygenDirectoryParser.java:53)
    at hudson.plugins.doxygen.DoxygenDirectoryParser.invoke(DoxygenDirectoryParser.java:14)
    at hudson.FilePath.act(FilePath.java:842)
    at hudson.FilePath.act(FilePath.java:824)
    at hudson.plugins.doxygen.DoxygenArchiver._perform(DoxygenArchiver.java:219)
    at hudson.plugins.doxygen.DoxygenArchiver.perform(DoxygenArchiver.java:176)
    at hudson.tasks.BuildStepMonitor$2.perform(BuildStepMonitor.java:27)
    at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:717)
    at hudson.model.AbstractBuild$AbstractBuildExecution.performAllBuildSteps(AbstractBuild.java:692)
    at hudson.model.Build$BuildExecution.post2(Build.java:183)
    at hudson.model.AbstractBuild$AbstractBuildExecution.post(AbstractBuild.java:639)
    at hudson.model.Run.execute(Run.java:1527)
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
    at hudson.model.ResourceController.execute(ResourceController.java:88)
    at hudson.model.Executor.run(Executor.java:236)
Build step 'Publish Doxygen' changed build result to FAILURE






                    

08 Oct 2012, 22:38

Doxygen C言語のコメント備忘録

前回の記事では、Doxygenの導入をまとめたので、

ここではC言語/C++で使えるコメント(Doxygenタグ)の記入方法をまとめる。

公式サイトには、全てのコメント使用例が書いてあるが、ちょっと多すぎる。

http://www.doxygen.jp/commands.html#cmdparam

Doxygenの基本コメントまとめ

doxygenコメントは冒頭に /*! をつける。

C言語ソースでよく利用する(?)コメント(タグ)を列挙する。

共通でよく使う

@brief 説明文

 

  • インデントをそろえたハイフン’-“で箇条書きが表見できる。
  • /*@{*/ と/*@}*/ で囲むことで、グループ化できる。

ファイルヘッダ関係

@file ファイル名
@date 日付
@author 作者
@version 版数/バージョン
@par ユーザ定義の記述

 

[text]

/*!

  • @file sample.c

*

  • @dateツꀀツꀀツꀀ Created on: 2012/09/05

  • @authorツꀀ Author: きつね

  • @version 1.0

  • @briefツꀀSツꀀ GoogleMock実験用

  • @parツꀀツꀀツꀀツꀀ History 新規作成

*/

[/text]

image

宣言関係

これらの宣言は、ファイルのどこかに @fileと記載されている必要がある。

@struct 構造体
@enum 列挙型
@def 定義
@var グローバル変数

 

[text]

/*! @struct NUM

*ツꀀ @briefツꀀ ナンバー

*/

typedef struct NUM

{

int num;ツꀀツꀀツꀀツꀀ /*!< 数ツꀀツꀀツꀀツꀀツꀀツꀀ */

int count;ツꀀツꀀ /*!< カウント */

}NUM;

/*! @struct RET

*ツꀀ @bruefツꀀ 戻り構造体

*/

typedef struct RET

{

int ret;ツꀀツꀀツꀀツꀀ /*!< 戻り値ツꀀツꀀ */

int count;ツꀀツꀀ /*!< カウント */

}RET;

/*!@def

  • @brief 数の上限

*/

#define NUM_MAXツꀀ 10

/*!@enumツꀀ collor

  • @brief 色

*/

typedef enum{

red,ツꀀツꀀツꀀツꀀ /*!<赤 */

blue,ツꀀツꀀツꀀ /*!<青 */

yellowツꀀツꀀ /*!<黄色 */

}collor;

[/text]

  • メンバの説明は、/*!< hogehoge */ でも書ける。

image

関数ヘッダ関係

 

@fn 関数宣言
@breaf 要約説明
@param param <引数名> { 引数説明 } 関数の引数
param[in] 入力フォーマット
param[out] 出力フォーマット
param[in,out] 入出力フォーマット
@return { 戻り値の記述 } 戻り値の記述
@detail 詳細説明

 

[text]

/*!

  • @fnツꀀツꀀツꀀツꀀツꀀツꀀツꀀ get_ret

  • @brief

  • @param[in] void

  • @returnツꀀツꀀツꀀ 結果の数

  • @detailツꀀツꀀツꀀ 数をライブラリから取得し、その結果によって処理を分岐する

*/

[/text]

image

07 Oct 2012, 13:10

公式ロゴURLまとめ Twitter/Facebook/Google+/foursquare

このブログのプロフィールを作成しようとして、ソーシャルメディアの商標(ロゴ)について調べてみたので、忘れないように備忘録。

Twitter

twitter-bird-white-on-blue

https://twitter.com/logo

よく見かける『t』の一文字は公式なロゴではないらしい。注意が必要。

Facebook

f_logo

http://www.facebook.com/brandpermissions/logos.php

『f』のロゴは認められているけれども、『facebook』のロゴは認められていないらしい。

Facebookロゴの使用は概して認められません。特定の用途について特別に許可を取得したい場合は、Facebook担当者にお問い合わせください。

Google+

Google+

https://developers.google.com/+/plugins/badge/#configure

Google+の場合は、Google Badgeというサービスで、Web上でリンクを作成する。

foursquare

RSS

ロゴは以下の公式URLから取得できる。

https://ja.foursquare.com/about/logos

 

07 Oct 2012, 08:26

StepCounterでJenkinsからステップ数をカウントしてみる

Jenkinsをつかったステップ数表示について、以前CCCCを紹介した。

CCCCを利用してC言語のステップ数をJenkinsで表示するツꀀ

ネットで調べてみると、他にもステップ数を数える方法があったのでメモする。

  • Sonerを使う
  • c4juを使う
  • StepCounterを使う

Sonerは高機能なメトリクス解析ツール。だけど、メモリをたくさん消費するらしいので、サーバではなくノートPCで実験している自分には不向きなのでパス。

c4juはCCCCの出力XMLから Jenkins の「JUnitテスト結果の集計」で利用できる XML を出力ツール。こちらのサイトで紹介されている。

CCCC + Jenkins – ブログズミ

ただ、JUnitテスト結果の集計ビューはすでにGoogleTestで使っているため、これもパス。

残るは、StepCounter Plugin。こちらのサイトで紹介されている。

StepCounterプラグインの紹介- takumaの備忘録

結論としては、これが良い感じ。

StepCounter Pluginを使ってみる。

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

https://github.com/jenkinsci/stepcounter-plugin/tree/57da29cfa10a2f0f4cd62c544353044e343391d7

(現時点ではアップデートに必要な stepcounter.hpi がなかった)

ダウンロードしたら、[Jenkinsの管理] > [プラグインの管理] > [高度な設定] >[プラグインのアップデート]を選択。

ここで、/target配下にあるstepcounter.hpiを選択して、アップデートを選択。

そして、Jenkinsを再起動する。

これでStepCounterが使えるようになった。

あとは、ジョブの[設定] > [ビルド後の処理の追加]から[StepCounter]を選択してそれなりの設定を入れる。

image

出力結果

image

ファイルごとにステップ数もでる。

image

時系列の推移も大丈夫そうだ。

[http://www.youtube.com/embed/LUuROdFRfRc]

06 Oct 2012, 07:08

gcovrをWindowsバッチコマンドから実行したらimort siteエラーでハマる

Cygwin環境で、gcovrをWindowsのコマンドプロンプトで実行しようとすると、以下のエラーが出た。 gcovrとは、gcovの結果をCoverture形式のXML出力結果に変換するPythonスクリプトだ。

‘import site’ failed : use 窶砺 for trackback

Pythonを使ったことがないからよくわからないが、調べてみると環境変数にパスが正しく設定されていないと、これが表示されるらしい。

回避方法は以下のサイトによると、

import PYTHONHOME=/usr

を打ち込めばいいらしい。

参考 _ Python ‘import site’ failed; use -v for traceback

これがWindowsのコマンドプロンプトからだと、

set PYTHONHOME=/usr

で回避できた。

環境変数の設定からなんとかしようといろいろ試したけれど、よくわからなかった。
とりあえず、gcovrを実行する前におまじないを叩いてから実行するという、若干ダメな回避方法で凌ぐ。

正しい方法がわかったら、またメモしよう。

03 Oct 2012, 22:38

Doxygenの使い方(セットアップ編)の備忘録

最近、モノ忘れが激しくて困る。

そんな、おとぼけおじさんの、ドキュメント生成ツールDoxygenの使い方の備忘録。

今回は導入まで。

Doxygenのダウンロードとインストール

公式サイトからDoxygenをダウンロード&インストール。

または、自分はCygwinを使っているので、setup.exeからダウンロード&インストール。

image

Doxygenの設定ファイルの作り方

Doxygenを試したいプロジェクトディレクトリで、以下のコマンドを実行。

doxygen 窶堵ツꀀ doxygen.conf

doxygen.confは設定ファイル名なので、任意の名前でよい。実行すると、設定ファイルが出来上がる。設定する項目はたくさん用意されているけれども、とりあえず以下の項目を編集した。

PROJECT_NAME プロジェクト名 mock_study
OUTPUT_LANGUAGE 言語 Japanese
INPUT 入力ディレクトリのパス src/
INPUT_ENCODING 入力ソースのエンコード SHIFT_JIS/EUC-JP
ここをいじらないと、
Doxygenが文字化けする。
FILE_PATTERNS 拡張子指定 *.c *.h
GENERATE_LATEX LATEX形式出力 NO

 

  • デフォルトのエンコードはUTF-8なので、
  • デフォルトではHTMLとLATEX形式の出力が有効になっている。

Doxygenでドキュメントを生成してみる

設定ファイルを引数として、コマンドを実行する。

doxygen doxygen.conf

html/というフォルダができ、その下にドキュメントが生成される。

閲覧するには、index.htmlを開く。

C言語でDoxygenを利用するときの注意点

出来上がったindex.htmlを開くと、

わお、ソースファイルがない!ヘッダファイルしかない!

いろいろ悩んだ結果、設定ファイルで、

EXTRACT_ALLツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ = YES

とすると、Cソースもドキュメント化された。

03 Oct 2012, 12:15

地獄の苦しみ、メモリ破壊をCppcheckで華麗に食い止めよう!

前回の記事の続き。

CppCheckでC言語/C++のメモリリーク(解放漏れ)を静的解析で検出する

Cppcheckを利用して、バッファオーバーランを検出したい。

バッファオーバーランとは、バッファオーバーフロー、メモリ破壊、メモリ不正番地アクセスとも言われていて、組込みエンジニアを一瞬のうちに恐怖に戦かせる魔法のぽぽぽぽーんだ。

いろんなパターンのメモリ破壊をCppCheckで検出できるか、遊んでみた。

メモリ解放したあとにアクセスしてしまうパターン

[c]

void buffer_over_run(void)

{

char *p;

p = (char *)malloc(1);

free(p);

*p = 3;

}

[/c]

[text]

$ cppcheck –enable=all memory_leak.c

Checking memory_leak.c…

[memory_leak.c:21]: (error) Dereferencing ‘p’ after it is deallocated / released

[memory_leak.c:21]: (error) Uninitialized variable: p

Checking usage of global functions..

[/text]

関係ないメモリ領域に勝手にデータを書き込んでしまう領域破壊パターン

[c]

void buffer_over_run(void)

{

char *p;

p = (char *)malloc(1);

memset(p,”c”,2);

free(p);

}

[/c]

[text]

$ cppcheck –enable=all memory_leak.c

Checking memory_leak.c…

[memory_leak.c:11]: (error) Buffer is accessed out of bounds.

Checking usage of global functions..

[/text]

配列で宣言した領域をオーバーするパターン

[c]

void buffer_over_run(void)

{

char c[5];

c[5] = 3;

}

[/c]

[text]

$ cppcheck –enable=all memory_leak.c

Checking memory_leak.c…

[memory_leak.c:8]: (style) Variable ‘c’ is assigned a value that is never used

[memory_leak.c:21]: (error) Array ‘c[5]’ accessed at index 5, which is out of bounds.

Checking usage of global functions..

[/text]

インクリメントすることで、知らないうちに不正番地アクセス

[c]

void buffer_over_run(void)

{

char *p;

p = (char *)malloc(1);

p++;

*p = 1;

printf(“%x”,p);

free(p);

}

[/c]

[text]

$ cppcheck –enable=all memory_leak.c

Checking memory_leak.c…

Checking usage of global functions..

[/text]

あれ、検出してくれない・・・・そして

$ ./a.exe
*p = 800482a8
Aborted (コアダンプ)

ちょ・・・・なんとかしてよ。

おまけ

ネットを徘徊していたら、メモリ破壊についての面白い詩をみつけた。

直接引用はチョッと気が引けるので、参考リンクとしてリンク貼っておく。

諸君、私はC言語が好きだ

02 Oct 2012, 23:35

CppCheckでC言語/C++のメモリリーク(解放漏れ)を静的解析で検出する。

メモリ解放漏れ・メモリ二重解放は組込みエンジニアにとって、背筋が凍る単語だ。

それは、即、残業しなさいという意味に転じる。

そこから、泥沼のデバッグにハマることがよくある。

そんな課題をスマートに解決するために、メモリ解放漏れやメモリ二重解放を検出するツール調べてみたので、メモメモ。

オープンソース CppCheckのインストールをしよう

Cppcheckを使うことでメモリ解放漏れを静的解析で見つけることが可能だ。CppCheckはその他にも、アロケーション(確保と解放)の不一致(メモリ二重解放),バッファオーバーランの検出ができる。OSSなので、誰でも無料で利用可能。

CppCheckのダウンロードはココから

Cppcheckの使い方の日本語訳は、以下のサイトで公開されている。

(ものすごく感謝!)今回はこれを参考に自分でも試してみる。

cppcheck 日本語マニュアル – 一人ぼっちの共鳴

cppcheck 英語マニュアルはこちちから

Cppcheckでメモリリークを検出する

Cppcheckを利用するには、–enable=allオプションをつけて以下のコマンド実行。

[text]

cppcheck –enable=all [フアイル名]

[/text]

試しにこんなコードを書いてみた。

memory_leak.c

[c]

#include

#include

int main(void)

{

int *p = NULL;

printf(“*p = %x\n”,p);

p = malloc(10);

printf(“*p = %x\n”,p);

return 0;

}

[/c]

なかなか、喧嘩を売っているコードだけれども、

これをCppCheckでチェックすると、案の定怒られる。(よしよし (^-^))

[text]

$ cppcheck –enable=all memory_leak.c

Checking memory_leak.c…

[memory_leak.c:12]: (error) Memory leak: p

Checking usage of global functions..

[/text]

自分で定義したメモリ獲得/解放関数のメモリリークをチェックする

次に、ユーザ定義したメモリ獲得/解放関数をチェックする。

普通、C標準のメモリ獲得/解放関数を直接使用することはなく、自前の関数でカスタマイズして使用することが多い。メモリアロケート関数を別ファイルで宣言してみる。

hoge_memory.c

[c]

#include “hoge_memory.h”

void *hoge_malloc(void)

{

return malloc(10);

}

memory_leak.c

void hoge_free(void *p)

{

free(p);

}

#include

#include “hoge_memory.h”

int main(void)

{

char *p = NULL;

printf(“*p = %x\n”,p);

p = (char *)hoge_malloc();

printf(“*p = %x\n”,p);

return 0;

}

[/c]

[text]

$ cppcheck –enable=all memory_leak.c hoge_memory.c

Checking hoge_memory.c…

12 files checked 40% done

Checking memory_leak.c…

22 files checked 100% done

Checking usage of global functions..

[/text]

Oh! 検出してくれないYo!!(゜д゜)/

こんなときは、–appendオプションを使用する。

使い方は、

[text]

cppcheck 窶錀-append=<メモリ獲得・解放関数定義file> <静的解析対象file>

[/text]

[text]

$ cppcheck –enable=all –append=hoge_memory.c memory_leak.c

Checking memory_leak.c…

[memory_leak.c:13]: (error) Memory leak: p

Checking usage of global functions..

[/text]

これで、、メモリリークを検出しました。

メモリ二重解放を検出する

おまけ。メモリ二重解放もこのとおり発見できます!スゲー。

[c]

int main(void)

{

char *p = NULL;

printf(“*p = %x\n”,p);

p = (char *)hoge_malloc();

printf(“*p = %x\n”,p);

hoge_free(p);

hoge_free(p);

return 0;

}

[/c]

[text]

$ cppcheck –append=hoge_memory.c memory_leak.c

Checking memory_leak.c…

[memory_leak.c:15]: (error) Deallocating a deallocated pointer: p

[/text]

使われていない関数宣言

[text]

$ cppcheck –append=hoge_memory.c –enable=all memory_leak.c

Checking memory_leak.c…

Checking usage of global functions..

[memory_leak.c:18]: (style) The function ‘hogehoge_special’ is never used

[/text]

02 Oct 2012, 22:14

倍速再生 Youtube動画を2倍速・スロー再生する方法を知ったメモ

Youtubeを早送りの2倍速で再生する方法を見つけたので、メモ。
しかも、この方法だとパソコンに動画をダウンロードすることなく、再生できるのだ。
手順は3ステップ。

  1. GoogleChrome(HTML5対応のプラウザ)をインストール
  2. 秘密のページでHTML5をYoutubeで有効化
  3. Youtubeで0.5から2倍速再生

では、順に書いていきます。

GoogleChrome(HTML5対応のプラウザ)をインストール

Youtubeを倍速再生するためには、HTML5に対応したブラウザで閲覧する必要がある。
簡単な方法がGoogleChromeで閲覧すること。

他にも、Safari が対応しているらしいが、未検証。

GoogleChromeをダウンロード

秘密のページでHTML5をYoutubeで有効化

次には、Youtubeの設定でHTML5を有効にする必要がある。
以下のページの下に

『HTML5視聴用が無効になっています』

と表示されているので、有効にする。

Youtube HTML5有効設定ページはココから

image

Youtubeで0.5から2倍速再生

設定ができたら、Youtubeで適当な動画を選択。
速度を調節するに、右下の[設定]アイコンをクリックする。

image

最後に

この機能はYoutubeで開発中の機能らしいので、
いづれ、デフォルト機能として搭載されるでしょう。

今回はコチラのエントリを参考にしました。感謝_(-_-)_
HTML5 を使うとYouTubeでスローや早送りができる – 5号館のつぷやき

30 Sep 2012, 23:33

もっとクラウド速聴!iPhoneのPodcast Appで実現する倍速体験

IMG_1825

前回の記事で、自分が普段速聴のためにしていることを書きました。

フリーソフト、『Lilith』を使った方法です。

クラウド速聴!フリーソフト『Lilith』でNHKニュースを3倍速で聴いてみる。

しかし最近、iOS6で搭載された、iPhoneのデフォルトアプリ

『PodCast App』

を利用すると、もっと簡単に高速再生ができることがわかりました。

NHKラジオニュースをクラウドからダウンロードする

iOS6になってから、Podcastを聴くためのアプリ『Podcast App』がデフォルトインストールされるようになりました。このアプリを利用すると、クラウド上のPodcast音源をiPhone/iPadへ直接ダウンロードすることができます。

そして、ダウンロードした音源を0.5~3倍速に変換して聴くことができるのです\(^0^)

アプリを起動して、下の[トップラジオ局]を選択します。

次に、[News & Politics]から[NHKラジオニュース]を選択します。

IMG_1823

すると、登録画面が開くので、番組を登録します。

[Podcast]タプをタッチすると、さきほど登録した番組が表示されます。

ダウンロードできる記事が一覧で表示されるので、早速ダウンロードです。

IMG_1822

iPhoneで音源を3倍速へ加速させる

ダウンロードしたら、次は倍速再生してみます。

ダウンロードした音源をタッチすると、通常速度で音声が再生されます。

速聴をするには、画面を上にスクロールします。

すると、1x というアイコンが中心に表示されるので、好みの速度に変更します。

3倍速にするためには3xを選択します。

IMG_1824

これで、簡単にNHKラジオニュースを3倍速で聴くことが可能となります。(^-^)

Podcastアプリの評価・感想

前回の記事で紹介した方法に比べると、音質は悪いです。ときどき、音が飛びます

ただし、前後関係から判断すれば、まあ理解できるかな、といったところです。

若干手間はかかりますが、前回の記事のLilithで速聴変換した方法の方が私は好きです。

ノイズキャンセリングヘッドホンでNHKニュース中へ現実逃避しよう

NHKニュースの英語版、NHK World Englishも 同じアプリで楽しめるのもいいですね。私は普段、まず3倍速で日本語のニュースを聴いて、そのあとで英語のニュースを聴くようにしています。そのすると、内容がもれなく頭に入ります。

ちなみに、ニュースは通勤中の満員電車の中で聴きます。

耳にはノイズキャンセリングヘッドホンをつけ、目をつぶって音声に集中します。

満員電車は嫌いなので、音楽の世界に逃避して、ほとんど目を開けません。

ノイズキャンセリングヘッドホン、高いけれどとてもオススメです。

最高の現実逃避用のグッズです。

(↑これを使ってます)