2016年10月31日月曜日

FindFirstFile にルートパスを指定した場合の挙動について

FindFirstFile(FindFirstFileEx) 関数の lpFileName にルートパスは指定できません。
MSDN でそのように記載されています。
FindFirstFile 関数
FindFirstFile の lpFileName パラメータでは、最後に円記号(\)を付けるかどうかにかかわりなく、ルートディレクトリを指定することはできません。




指定できないのはわかりましたが、実際に指定してしまった場合にどうなるのか検証したところ、厄介な挙動だったので備忘録として残しておきます。

検証にしようしたコードはこちら。



これを実行するとこのような出力になります。

カレントディレクトリがルートパスでない場合

このように INVALID_HANDLE ではなく Find が成功し、しかもなぜかカレントディレクトリ名が取得できます。


これが、カレントディレクトリがルートパスだった場合

期待?通り INVALID_HANDLE が返ります。


ちなみに、FindFirstFileExTest がコメントアウトされていますが、FindFirstFileEx でも同じ挙動を示しました。
(Windows 10 HOME version 1607 build 14393.321)
古い OS での検証はできていないので、もしかしたら挙動が異なるかもしれません。

2016年10月26日水曜日

[Cppcheck] 結果を CSV で出力してエクセルで確認する

なぜそんなことが必要か?
Jenkins で xml を集計している場合は、視覚的に確認ができます。
Visual Studio などから利用した場合も、--template vs で出力ウィンドウからジャンプできますし、拡張機能もあります。
これらの組み合わせを使っている場合は、まったくもって問題ないのですが、スタンドアロンで解析して結果を確認したい場合に、視覚的に確認できる方法が欲しかったので、表題にあるような対応をしました。

方法

出力ログフォーマットを以下のように指定します。
--template={file},{line},{severity},{id},\"{message}\"

あとは、stderr を .csv にリダイレクトすれば OK
(message にたまに "" が含まれている場合があるので、そこだけセルが別れちゃいますが…)


実際にこの方法で確認してみると結構便利だということがわかりました。
ぜひ一度お試しあれ


2016年10月17日月曜日

Bitbucket などから「SourceTree にクローン」をしても SourceTree が起動しない場合にすること

Bitbucket の WEB ページなどからクローンしたりするアレ。


これが無反応だったり、ストアアプリを検索させられたり、うまく動作してなかったので調べました。



そもそもどういう仕組み?
なんか便利な機能程度にしか認識してなかったのですが、ちゃんと調べるとそんなのできたんだーと勉強になりました。
これは、URI Association というものだそうです。
ストアアプリとやり取りしたりするのに使ったりもするようです。

SourceTree のオプションから設定
さて、本題です。
SourceTree の URI Association がなぜか無効になっていることがわかったので(インストール時に設定されないのかな?)、オプションから設定してあげます。

「ツール」>「オプション」を開き、「全般」の上のほうにある「Use this version of SourceTree for URI association」にチェックをいれます。

これで完了です。

おまけ
URI Association はレジストリの HKEY_CLASS_ROOT に以下のような構成で記録されます。


2016年10月13日木曜日

[Cppcheck] 1.76 で Visual Studio プロジェクトファイルの読み込みに対応



--project=     Run Cppcheck on project. The  can be a Visual
                     Studio Solution (*.sln), Visual Studio Project
                     (*.vcxproj), or compile database
                     (compile_commands.json). The files to analyse,
                     include paths, defines, platform and undefines in
                     the specified file will be used.


プロジェクトファイルもしはソリューションファイルを指定すると、その定義に従って解析できるようになりました。
これを待っていた!
(あと cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON で出力できる compile_commands.json にも対応)


iutest で試してみました。


--verbose オプションをつけているので、Define とか Include がどう設定されているのかわかると思いますが、
ちゃんとプロジェクトの設定に従って、しかもすべての構成で解析してくれています!
最高やーん!

みんなも今すぐバージョンアップ!!
ダウンロードはこちらから→ Cppcheck - A tool for static C/C++ code analysis

2016/10/14 追記
Version 1.76 にはハングアップバグがあったようで、その修正バージョンとして 1.76.1 がリリースされていました。

2016年10月11日火曜日

TreeTagger を使ってソースコード中の単語をリストアップしてみた

ちょっと入用で、ソースコード中の単語をリストアップしてみました。
お仕事で MeCab を使って日本語テキストを解析して、「とあること」の検出ができないかなーと試したことがあったのですが、今回はソースコードの単語を抽出して「とあること」をしようと思いついたので、やってみました。

ソースコードからの単語検出ということで、英語の形態素解析ツールを使うことにしました。
今回使ったのは TreeTagger です。
環境は Windows + TreeTagger + Python です。



TreeTagger のインストール
WIndows にインストールする場合の手順はこちら
tree-tagger-windows-X.X.zip (筆者ダウンロード時は 3.2)をダウンロードしたら展開し、INSTALL.txt に従ってインストールします。
要約すると、Perl のインストールと、必要なパラメーターファイルを .par 拡張子に変えて lib に置くことと、C:\TreeTagger に配置して bin フォルダを PATH に通せば OK。
※ C:\TreeTagger なのは bat ファイルにパスがベタ書きされているため。別にここである必要はないです。
※ Perl も今回は Python から呼び出すのでなくても問題ない

今回、言語は英語を使います。こちらからパラメーターファイル(English parameter file)をダウンロードしました。
http://www.cis.uni-muenchen.de/~schmid/tools/TreeTagger/#Linux

TreeTagger を Python から使う
検索して一番最初に出てきた treetaggerwrapper を使用することにしました。
最初に書いた参考URLではダウンロードしてインストールしていましたが、pip からインストールできるようだったのでそちらでインストールしました。
pip install treetaggerwrapper
pip install six

※ six は treetaggerwrapper が使ってるので、なければインストール

treetaggerwrapper.py は english.par を要求するので、TreeTagger のインストールでダウンロードしてきたパラメーターファイルをコピーリネームしておきます。

試しに以下のサンプルを実行します。
import treetaggerwrapper
import os

tagdir = os.getenv('TREETAGGER_ROOT')
tagger = treetaggerwrapper.TreeTagger(TAGLANG='en',TAGDIR=tagdir)
tags = tagger.TagText(u"Save the time of the reader. SAMPLETEST. SampleTest.")
for tag in tags:
    print tag

TAGDIR には TreeTagger のインストールディレクトリを指定しますが、bin に PATH が通っていれば空で問題ないようです。

ソースコード中の単語のリストアップ
とりあえず、コメント行(// で始まる行、/**/ や行末コメントは非対応)除いてリストアップしてみました。
対象のソースコードは iutest の実装全部入り(fused-src/iutest.hpp)です。


C++ のキーワードを除外するとこんな感じ。


圧倒的に iutest が多いですね。(当たり前か)

リストアップに使用したソースコードは github で公開しています。
https://github.com/srz-zumix/taggertool

2016年10月7日金曜日

Visual Studio "15" Preview 5

Announcing Visual Studio “15” Preview 5 | The Visual Studio Blog
Visual Studo 15 Preview 5 がリリースされたのでインストールしました。
実は Preview 4 のときはトラブってかなり苦労したので(結局あきらめた)、今回も…と思ったのですが、
あっさりインストールできてしまいました。



Preview 4 のときはインストールが失敗して苦労したんですよね…




そのころメモってブログにあげようと思ってたのが以下。
(このまま消すのもあれなので、アップしちゃう)


「Visual Studio "15" Preview 4 のインストールが「this directory is not empty」で失敗する」

https://blogs.msdn.microsoft.com/visualstudio/2016/08/22/visual-studio-15-preview-4/#comment-203695

こちらに同様の質問があります。
"Program Files (x86)\Microsoft Visual Studio\VS15Preview" を削除しろと回答があります。
該当のフォルダが残っていたので削除、インストールできたと思ったら別のエラー。。。

2016-08-28T23:04:11 : Verbose : Getting installed product. [installerId: SetupEngine, installationId: 9c96d633, productId: Microsoft.VisualStudio.Product.Enterprise]
2016-08-28T23:11:33 : Warning : Installation package warnings:
Package 'Microsoft.VisualC.RuntimeDebug.14' failed to install
Package 'Microsoft.VisualC.RuntimeDebug.14' failed to install
2016-08-28T23:11:33 : Error : Failed to update product. [installerId: SetupEngine, productId: Microsoft.VisualStudio.Product.Enterprise, installationPath: 'C:\Program Files (x86)\Microsoft Visual Studio\VS15Preview', error: Package 'Microsoft.VisualC.RuntimeDebug.14' failed to install;Package 'Microsoft.VisualC.RuntimeDebug.14' failed to install at Error: Package 'Microsoft.VisualC.RuntimeDebug.14' failed to install;Package 'Microsoft.VisualC.RuntimeDebug.14' failed to install
    at SetupEngineAdapter.handleError (C:\Program Files (x86)\Microsoft Visual Studio\Installer\resources\app\lib\Installer\Adapters\SetupEngineAdapter.js:316:31)
    at C:\Program Files (x86)\Microsoft Visual Studio\Installer\resources\app\lib\Installer\Adapters\SetupEngineAdapter.js:154:45
    at process._tickCallback (internal/process/next_tick.js:103:7)]
2016-08-28T23:11:34 : Verbose : Getting product summaries. [installerId: SetupEngine]
2016-08-28T23:11:34 : Verbose : Getting installed product summaries. [installerId: SetupEngine]
2016-08-28T23:11:34 : Verbose : Getting product. [installerId: SetupEngine, productId: Microsoft.VisualStudio.Product.Enterprise].
2016-08-28T23:11:35 : Verbose : Getting installed product. [installerId: SetupEngine, installationId: 9c96d633, productId: Microsoft.VisualStudio.Product.Enterprise]

https://blogs.msdn.microsoft.com/visualstudio/2016/08/22/visual-studio-15-preview-4/#comment-203435

We will have this issue fixed in the next release of Visual Studio. For now you can ignore the error and the debugger will still work fine.

エラー出るものの使えるみたいです。

しかし、なんとも気持ちが悪いので、上のリンク先にも書いてある vc_runtimeDebug*.msi をアンインストールしてから、再度インストールしました。



一応大丈夫そうです。たぶん。

2016年10月5日水曜日

無料で使える CI サービス比較(定期実行編)

SCM との連携で更新タイミングで CI が実行されるサービスがほとんどですが、ちょっと定期的に実行させたいことがあり調べたのでまとめました。

以前まとめた情報はこちら
※まとめた時期が結構前なのでもう腐った情報になってるかもしれませんので注意!
ブログズミ: 無料で使える CI サービス比較
ブログズミ: 無料で使える CI サービス比較(Artifacts)

AppVeyorCircle CICodeshipdrone.ioMagnum CIsemaphoreShippableSnap CITravis CIWercker
定期実行 × ×

Appveyor
Build configuration - AppVeyor
Syntax はこちら Crontab Expression · atifaziz/NCrontab Wiki
Jenkins と同じ感じです。


Circle CI
Circle CI では定期実行する仕組みはありませんが、外部から実行開始することができます。
Nightly Builds - CircleCI
なので、何かしらの cron サービスと組み合わせれば定期実行は可能というわけです。

実際に定期実行させた例が Qiita にありました。

Codeship
API | Codeship Documentation
API が用意されていて、リスタートはできそうなのですが、新規に実行する方法が?だったので×にしました。

Magnum CI
Circle CI と同様に外部から実行開始できるので △ にしました。
https://magnum-ci.com/docs/integration

Semaphore
Project Settings に Build Scheduler があります。
Scheduling builds - Semaphore


Shippable
API を利用して外部から実行開始できるので △ にしました。
Shippable API for Projects - Shippable Docs

Snap CI
Scheduling and skipping builds | Snap CI Documentation, FAQ, and Troubleshooting
プロジェクトのページに「Build Schedule」があるので、そこから設定できます。



Travis CI
Cron Jobs - Travis CI
Please note that cron jobs are not enabled by default. Set “Build pushes” to on in your settings, then ask us to unlock this feature for your repository: support@travis-ci.com
デフォルトでは使えません。サポートチームに連絡する必要があるようです。

Wercker
Introducing Cronetes
こちらにやり方が書いてあります。が、ちょっと面倒くさそう。

最後に
ここで×としたサービスもただ単に機能を見逃しているだけで使えるかもしれません。
また、この情報記事投稿前の情報です。今後サービスは拡充していくと思いますので、公式ページで最新の情報を確認するようにお願いします。


さて、これで一旦調べ終わったので、どこかで定期実行ジョブを作りたいと思います。
では、今回は以上。