17 Feb 2015, 13:50

フリーで高性能な OSS アンケートツール!LimeSurvey を Windows で動かす

はじめに

職場で簡単なアンケートを実施したいとおもった.

メールベースで作成すると集計が大変だ. できれば CSV 形式で出力して, 相関関係を Excel か R で分析までしたいところ.

なにかうまい手はないかと思っていたら, OSS のアンケートツールを見つけたので試す.

環境

  • Windows 8.1

職場でも, あいている Windows サーバが自分の端末にいれようと考えている.

ちなみに, LimeSurvey の HP には, サポートは 7 までとかいてあるが, 8 でもばっちり動いた.

LimeSurvey について

フリーで高性能な OSS アンケートツール.

ネットで調べてると, ほぼこのツール以外に見つからない. デファクトスタンダードっぽい.

Windows にインストール

インストールは, 以下の方法がある.

  • appatch & mysql がある環境にインストール.
  • (windows) xampp 上で動作させる.

Windows でサクッとためするには, XAMPP がおすすめ.

以下からダウンロードして, インストーラを起動するだけという簡単さ!

ちなみに, インストール先でデフォルトの C:xampp 以外をしていすると, 動作しなかった. おそらく PHP の PATH 設定かと.

XAMPP をイントラネット内に公開

もともと, xampp は Windows ローカル環境で PHP などの開発環境を作成する ためのツール. 今は, vagrant とか docker が取って代わった気がする.

そのため, xampp のサイトを外部に公開するには, 一工夫必要.

サンプルでアンケート作成

以下, スクリーンショットとともに. まずは, admin/password でログイン.

file:c:/cygwin64/home/tsu-nera/futurismo/blog/img/SnapCrab_NoName_2015-2-17_22-8-41_No-00.png

ログインすると, アンケート作成のガイダンスが出る.

file:c:/cygwin64/home/tsu-nera/futurismo/blog/img/SnapCrab_NoName_2015-2-17_22-17-54_No-00.png

ガイダンスにしたがって作成した. 次に作成したアンケートをテスト.

file:c:/cygwin64/home/tsu-nera/futurismo/blog/img/SnapCrab_NoName_2015-2-17_22-23-45_No-00.png

完了!!

file:c:/cygwin64/home/tsu-nera/futurismo/blog/img/SnapCrab_NoName_2015-2-17_22-23-58_No-00.png

おわりに

Windows 環境での導入の気楽さに感動した.

作成はやや手間がかかるものの,

  • その後の集計作業
  • イケテル UI
  • 回答率の管理

などなど, かける労力に対するリターンは大きそうな印象を受けた.

もう少しいじってみて利用できそうか見極めてみる.

13 Jul 2013, 05:13

最後にして最強のターミナルになれるか!Linux用端末『FinalTerm』

最近、hackernewsを流し読みしていますが、そんななかFinalTermなるものがあった。

FinalTerm、最後の端末,最終ターミナル。電車の終点みたい。(´・ω・`)

これは、Linux用のターミナルで、コンソール画面にクリックで操作できるような機能をグラフィック機能を追加したもの。UbuntuとFedora、Arch Linuxでインストールできるようだ。無料。

紹介動画はYoutubeにあります。まずは見るべし。

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

Ubuntuにインストールする

以下の3行だサクッと導入できた!!

sudo add-apt-repository ppa:finalterm/daily
sudo apt-get update
sudo apt-get install finalterm

ちなみに、CentOSに入れようとしたらGTK3がなくて2時間頑張ってもインストールできなかったことを、ここに未練がましく告白する。

試してみる。

FinaltermはGUIアプリケーションなので、finaltermで検索して起動するだけ。

デフォルトでは黒のグラス。クール!!(・∀・)

lsを押すと、リンクっぽい線がかかれた表示が。これをクリックすると、クリックしたディレクトリに対する操作がボップアップされる。ファイラみたいだ。

コマンドを打ち込もうとすると、ポップアップでコマンド履歴が出てくる。

他にも、Ctrl + (なにか)でコマンド実行できたり、いろテーマの変更ができたり。

いろいろ機能がありそうだけれども、それはおいおい調査。

使用感

デフォルトのターミナルに比べて、ほんのすこし速度がもっさりしている気がするが形容範囲。

コマンド補間やグラフィックな選択は、そこまでスンゲェΣ(゚∀゚ノ)ノとは思わなかった。zshみたいには、なれないぞ!そのうち、ウルトラタームとか、スーパータームとか、いろいろな亜種が増えてきそう。

見た目が綺麗なのがよいね。それだけでも、ターミナル乗り換えていいかも。

29 Apr 2013, 07:25

音楽の速度をコマンドラインから自由自在に操れる!多機能すぎるオープンソースの音楽再生ソフト『VLC メディアプレイヤー』

音楽の速度をコマンドラインから操作する方法を探していたら、いいソフトを見つけたので紹介。

VLCメディアプレーヤー

VLCメディアプレーヤーはいわゆる音楽再生用のメディアプレイヤー。音楽再生に必要な機能はある程度実装されているようだ。

特徴は、マルチプラットフォーム、対応コーデックが豊富ということだが、自分がVLCで特に気に入ったのは、

  • オープンソースであること
  • 豊富すぎるコマンドラインインタフェース(やりたいことは全てできそう)

である。

VLCを使ってみる

ダウンロードは以下から。インストーラを立ちあげてインストール。

VideoLAN – オープンソースのビデオフレームワークであるVLCメディアプレイヤーの公式ホームページ

外見はこんな感じ。

skitch.png

速度調整をするためには、ツールバーの[表示] > [ステータスバー]にチェックを入れる。下に[1.00x]という表示が現れるので、マウスでドラッグして変更する。再生中の音楽をリアルタイムで変更できる。0.01単位で変更できるようだ。

また、ネットワーク上のファイルを開くことができるようだ。ツールバーの[メディア] > [ネットワークストリームを開く]を選択して、URLを入れる。youtube の再生もできる。

skitch.png

 

コマンドラインからVLCを操作する

環境

  • Windows 7 64bit(ただし、32bit版をインストールした)

コマンドラインからVLC起動

まずは基本から。コマンドラインからVLCを立ち上げるには、まずはコマンドプロンプトを起動。インストールしたディレクトリに移動して、vlcに再生したいファイルを引数にして実行する。

C:\Users\TSUNEMICHI>cd "C:\Program Files (x86)\VideoLAN\VLC"
C:\Program Files (x86)\VideoLAN\VLC>vlc Concerto_for_Orchestra.m4a

VLCをRCインターフェイスで操作する

VLCをRCモードで立ち上げることで、コマンドラインからいろいろと操作できる。

$ vlc -I rc [ファイル名やディレクトリ名]

で起動すると、新しいコンソールが立ち上がる。ここにコマンドを打ち込んで、いろいろと操作する。対応コマンドは helpと打ちこむとずらずらと出てくる。以下の操作がコマンドラインからできる。

help

+—-[ リモートコントロールコマンド ]

|

| add XYZ … … … … . XYZ をプレイリストに追加

| enqueue XYZ … … . . XYZをプレイリストにキューイング

| playlist … … . 現在のプレイリスト中にある項目を表示

| play … … … … … … . . ストリーム再生

| stop … … … … … … . . ストリーム停止

| next … … … … … . 次のプレイリストの項目

| prev … … … … … . 前のプレイリストの項目

| goto … … … … . インデックスにある項目に移動

| リピート [オン|オフ] … プレイリストのリピートの切り替え

| loop [on|off] … … . . プレイリストループの切り替え

| ramdom [on|off] … … … . ランダム再生の切り替え

| clear … … … … … . プレイリストのクリア

| status … … … … . . 現在のプレイリストの状態

| title [X] … … … 現在の項目のタイトルを設定/取得

| title_n … … … … . 現在の項目の次のタイトル

| title_p … … … … . 現在の項目の前のタイトル

| chapter [X] … … . 現在の項目のチャプターを設定/取得

| chapter_n … … … . . 現在の項目の次のチャプター

| chapter_p … … … . . 現在の項目の前のチャプター

|

| seek X … … . 再生中インスタンスのジャンプ先指定(秒)

| pause … … … … … . . 再生停止の切り替え

| fastforward … … … … … . 最大倍率に設定

| rewind … … … … … … . 最低倍率に設定

| faster … … … … … ストリームの早送り再生

| slower … … … … … . ストリームの遅延再生

| normal … … … … … . ストリームの通常再生

| frame … … … … … . . フレームごとに再生

| f [on|off] … … … … . . 全画面表示の切り替え

| info … … … … … . 現在のストリームの情報

| stats … … … … … … . 統計情報の表示

| get_time … … … . ストリームの最初からの経過時間

| is_playing … … … . ストリーム再生中:1, その他:0

| get_title … … … . . 現在のストリームのタイトル

| get_length … … … … . 現在のストリームの長さ

|

| volume [X] … … … … … . 音量の設定/取得

| volup [X] … … … … 音量を X ステップ分上げる

| voldown [X] … … … . . 音量を X ステップ分下げる

| adev [X] … … … . オーディオデバイスの設定/取得

| achan [X] … … … オーディオチャンネルの設定/取得

| atrack [X] … … … オーディオトラックの設定/取得

| vtrack [X] … … … . . ビデオトラックの設定/取得

| vratio [X] … … . . ビデオのアスペクト比の設定/取得

| vcrop [X] … … … ビデオのクロッピングの設定/取得

| vzoom [X] … … … … . ビデオズームの設定/取得

| snapshot … … … . . ビデオスナップショットを撮る

| strack [X] … … … … 字幕トラックの設定/取得

| key [hotkey name] … … ホットキー操作のシミュレート

| menu …[on|off|up|down|left|right|select] メニューの使用

|

| help … … … … … . . このヘルプメッセージ

| longhelp … … … … … 長いヘルプメッセージ

| logout … … … … 終了する(ソケット接続の場合)

| quit … … … … … … … . VLCを終了

|

+—-[ ヘルプの終り ]

さらに、key [hotkey name](ホットキー操作のシミュレート)を使えば、上記にない操作もできる。[hotkey name]に対応する名前は以下のページに載っている。

Hotkeys table – VideoLAN Wiki

速度変更に関わるキーは以下。

  • Faster key-faster 50%速度を上げる
  • Slower key-slower 50%速度を下げる
  • Normal rate key-rate-normal 通常の速度
  • Faster (fine) key-rate-faster-fine 10%速度を上げる
  • Slower (fine) key-rate-slower-fine 10%速度を下げる

たとえば、10%だけ速度を上げる場合は、[key key-rate-faster-fine]と打ち込む。

VLCサーバにコマンドラインから速度変更を依頼する

起動中のVLCにコマンドを送って操作するために、telnet通信を利用することができる。まずは、VLCをサーバとして起動する。[–rc-host [ホストアドレス]:[Port番号]]のオプションをつける。

vlc -I rc –rc-host localhost:8080

そうすると、telnetコマンドでサーバにアクセスすることができる。アクセスしたらコマンドを投げればよい。

telnet localhost 8080

クライアント側からリモートのホストに通信してコマンドを実行するためには、Linuxではこういう書き方もあるみたい。Windowsでも、Cygwinではできたけれども、コマンドプロンプトからだと、やりかたがワカラなかった。

$ (sleep 0.05;echo key key-slower;sleep 0.05)|telnet localhost 8080

2011年11月25日 VLCをショートカットキーからリモート制御する方法 telnet編:FreeBSD Daily Topics|gihyo.jp … 技術評論社

参考リンク

 

08 Dec 2012, 02:24

PSP実践のOSS「The Software Process Dashboard」を評価する。

会社のプロジェクトでは、作業時間計測が流行っている。(というより、強制的)
ツールに縛りはないため、みんなはTaskCoachを利用している。

しかし、ヘビーOutlookerな自分はOutlookカレンダーに集計時間をリアルタイムで出力できるTimeEditionを利用している。

時間計測は生産物とセットで評価しないと意味がないと常日頃思っているので、時間計測とともに管理できるツールはないかなと思った。また、Webでチャートを簡単に公開したいと思った。

PSPとは

PSPとは、プレーステーション・ポータブルの略である。
いや、派手に間違えた、Personal Software Processの略。パーソナルソフト開発作法。
個人のソフトウェア開発における時間管理の方法。CMMIの個人バージョン。

詳しくは以下のリンクを参照。

GTDに心酔している自分は、タスクに対して時間を割り当てることは、面倒なのでしない。
大きな枠組みで、時間を計測したい。
ここでは、PSPを実践するためのオープンソースProcess Dashboardを使ってみる。

Process Dashboardをインストール

The Software Process Dashboard | The Software Process Dashboard Initiative

以下のリンクより、ダウンロード。

インストーラを起動して、聞かれるままにOKを押せばよい。
ちなみに、日本語対応しているのが嬉しい。

Process Dashboardを使ってみる

image

UIはシンプル。JAVAでできている。
ホットキーに対応していないのが(一番)つらいところだ。
基本的なタイムトラッキングの機能は揃っている。

  • 階層でのプロジェクト管理
  • 手動での時間修正
  • タイムログの表示
  • 時間集計結果

などなど。時間集計結果のチャートはWEB画面でも出力することができる。

LOC Counter

LOC というのは Life Of Codeの略で、要はステップ数のこと。
時間とコードのステップ数を対応して管理できるみたい。
Subversionがデフォルトでサポートされている。

しかし、自分の要件としてはドキュメント作成時間やテスト項目も管理したいので、これでは足りない。

image

基本機能は、こんな感じ。
拡張機能を利用するためには、アンケートに登録する必要がある。しかし、会社で利用して、さらにはよければ他人の展開することも考えると、これは障害になるかな。

25 Nov 2012, 04:41

ReviewBoardインストール手順まとめ(Ubuntu)

コードレビューが不十分だったと思ったので、コードレビューのためのツールを調べた。

調べてみるといろいろあるものだ。
ReviewBoardをトライアルしてみることにした。
ReviewBoardとは、VMware社が開発したコードレビューツール。(無料)
Twitter社でもつかわれているらしい。
http://www.reviewboard.org/

導入は、実はとても大変だった。
まず、Windows 7 64bit 環境で導入しようとしたが、挫折。
公式HPの注意事項にも書いてあるが、Windows 64bit環境では動くのだろうか?
http://www.reviewboard.org/docs/manual/dev/admin/installation/windows/
インストールに必要なPythonモジュールのバージョンがなかったりした。

自分の場合は、Linux(Ubuntu)で導入してみた。
LinuxはWinodowsに比べてとても導入が簡単だった(といっても、ハマったけど)。
以下、Ubuntuでの導入手順を公式HPにそって実施したまとめ。
http://www.reviewboard.org/docs/manual/1.6/admin/installation/linux/

環境

  • Ubuntu 12.10

インストールしたもの

  • Apache 2.2.22
  • MySQL 5.5.28
  • Python 2.7.3
  • python dev 2.7.3
  • Python Setuptools 0.6.28
  • memcached 1.4.14
  • python-memcached 1.48
  • patch 2.6.1
  • Review Board 1.6.13
  • python-mysqldb 1.2.3

Review Boardのインストール

MySQLをインストール

$ sudo apt-get install mysql-server

パスワードをきかれるので、入れる。
http://debianj.com/ubuntu/install/mysql.html

MySQLインストール後、
共有ライブラリとして認識させるために「/etc/ld.so.conf」に以下の行を追記。

/usr/local/lib/mysql

Apacheをイントール

$ sudo apt-get install apache2

apache2の高速化のために、以下の3つのPython Moduleから一つを選ぶ必要がある。

  • mod_wsgi (推奨)
  • fastcgi
  • mod_python (非推奨)

ここでは、推奨であるmod_wsgiを選択する。
以下のHPにしたがって設定。Ubuntuにmod-wsgiいれたメモ

$ sudo apt-get install libapache2-mod-wsgi #インストール
$ sudo a2enmod wsgi  #有効化
$ sudo apache2ctl restart #サーバー再起動

Python Setuptoolsをイントール

Pyhonはインストール済みであること。
ここでは、Ubuntuにデフォルトで入っているPython 2.7を使う。
2.4以降ならばいいらしい。

$ sudo apt-get install python-setuptools

これで、easy_installコマンドが使えるようになり、インストールが簡単になる。

Python Development Headersをインストール

$ sudo apt-get install python-dev

memcachedをインストール

Review Boardを高速化するためのキャッシュツールを入れる。

$ sudo apt-get install memcached
$ sudo easy_install python-memcached

patchをインストール

GNU patch とは、 差分ファイル (パッチファイル) を用いてソースファイルの修正作業を自動的に実行してくれるソフトウェア(らしい)

$ sudo apt-get install patch

Review Boardをインストール

ようやく、主題であるReview Boardのインストールだ。
コマンドは以下を実行。

$ sudo easy_install ReviewBoard

これで、Djblets, Django-Evolution, Django, flup, paramiko and Python Imaging Libraryが足りない場合は、依存性を分析して、ダウンロードしてくれる。
(ここがWindowsと違って感動した)

flupが見つからなかったので、下記サイトを参考にインストール。
http://kaigai-hosting.com/bluehost-django.php

wget http://www.saddi.com/software/flup/dist/flup-1.0.2.tar.gz
tar xzvf flup-1.0.2.tar.gz
cd flup-1.0.2
sudo python setup.py install –user

 

mysql-pythonのインストール

mysqlをpythonから操作するためのモジュールmysql-pythonを入れる。

apt-get install python-mysqldb

ただ、ここでハマった。easy_installも実施しておく。
のちのち、サイトを起動したときに、mysql-pythonが動いていないために、
500エラーとなって、以下のメッセージが表示された。

review board is taking a nap

apacheのエラーログをみると、mysql_config not foundらしい。
以下の2つのコマンドを叩いて解決した。

sudo apt-get instal libmysqlclient-dev
sudo easy_install mysql-python

 

Review Board サイトの作成

Apache起動

/usr/apache2/bin/apachectl start

127.0.1.1にアクセスしてみて、”It works!“が起動されていれば成功。

image

http://kazmax.zpp.jp/apache/apache2.html#ah_1

MySQLデータベース作成

ユーザ「mysql」を作成し、データベースを初期化。

/usr/sbin/useradd mysql
/usr/local/bin/mysql_install_db –user=mysql

MySQLを起動(常駐)

/usr/local/bin/mysqld_safe –user=mysql &

rootパスワードを入れる

/usr/local/bin/mysqladmin -u root password “パスワードを入力”

MySQLにroot権限でログインして、データベース(ここではreviewboard)を作成。

mysql -u root -p

mysql> GRANT ALL privileges ON *.* TO reviewboard@localhost IDENTIFIED BY ‘reviewboard’ WITH GRANT OPTION;
mysql> CREATE DATABASE reviewboard DEFAULT character SET utf8;

つづいて、mysqlユーザのパスワード設定。

mysql> set password for mysql@localhost = password(‘パスワードを入力’);

ちなみに、ここが正しく設定されていないと、

Something broke!

と表示された。

ReivewBoardインストール

以下のコマンドで作成。ここでは” /var/www/reviews.example.com”に作成する。

sudo rb-site install /var/www/reviews.example.com

GUIの設定画面が現れるので、順に回答していく。

image

Domain Name: review
Root Path:/reviews/
Database:mysql
Database Name:reviewboard
Database Server:localhost
database username/password xxx
web server apache
wsqi
…. etc.

(参考サイト)
http://www.atmarkit.co.jp/fjava/rensai4/devtool19/devtool19_3.html

パーミッションの変更

作成したディレクトリ”/var/www/reviews.example.com”にApacheからアクセスするために、アクセス権限を与える。

$ chown -R www-data /var/www/reviews.example.com/htdocs/media/uploaded
$ chown -R www-data /var/www/reviews.example.com/data

Apacheサーバの設定

Apache2とmod_wsgiを選択した場合の設定例。
reviews.example.comディレクトリで自動生成された設定ファイルをApacheの設定ファイルに反映する。

$ cd /etc/apache2/sites-available
$ cp /var/www/reviews.example.com/conf/apache-wsgi.conf reviews.example.com.conf
$ cd ../sites-enabled
$ ln -s ../sites-available/reviews.example.com.conf .

*apache-wsgi.confがASCIIコードでUTF-8に変換しないといけないという記事もあった。
自分の場合はUTF-8だったから問題はなかったけれども。

最後に、/etc/apache2/sites-enabled/000-defaultを削除する。
http://www.natswell.com/techcolumn/2011/10/06/review-board/

Apache再起動。

$apachectl restart

ついに設定完了か?、と思ったらいきなり以下のエラーがでた。

(1146, “Table ‘reviewboard.django_site’ doesn’t exist”)
image

‘reviewboard.django_site’ が存在しない、とのこと。
djangoのコマンドで manage.py syncdbを叩かないといけないらしい。
よくわからないが、以下のコマンドを叩いて直った。

sudo rb-site upgrade /var/www/reviews.example.com/

https://groups.google.com/forum/?fromgroups=#!topic/reviewboard/8b2fH37hLC8

ReviewBoardインストール完了

サイトにアクセスして、ログインできれば成功。
ここでは(http://localhost/review/ )にアクセス。

image

うまくインストール出来ない時の対処方法

Apacheエラーログをみる

エラーログを見れば、メッセージからなんとなく足りないPythonモジュールがわかるかも。

/var/log/apache2/error.log

Pythonデバックフラグを立てる

Something broke! とか出た場合は、apache2ログでは分からない。
こんなときは、デバックフラグをたてて、メッセージを確認する。

reviewboardのディレクトリ配下で、conf/settings_local.pyを開く。
ここでは、(/var/www/reviews.example.com/conf/settings_local.py)
DEBUG = True
と書き換える。

サイトにアクセスしてて、エラーすればメッセージがでる。
出たメッセージをもとにGoogle先生に相談する。

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]