Redmine バグ修正チケットのテンプレート
バグチケットの流れ
- 発見者がチケット発行
- チケット担当者はバグ修正開始時にステータスを進行中に変更
- チケット担当者はバグ修正後にステータスを解決、進捗率を90%に変更
(この部分Gitを使って自動変更されるように設定している) - 担当者を発見者に変更
(このときにどのような修正を行ったかを簡易的に記述) - 発見者はバグの修正を確認して、ステータスを終了、進捗率を100%に変更。
1. と 4.の場合にチケットに記述するテンプレートを作成している
1. バグ発見時のチケット説明のテンプレート
|_. 項目 |_. 内容 |
|【バージョン】 |1.01.0000 |
|【現象】 |例:表示バグ|
|【再現性】 | 有 or 無 |
|【データ】 |(画像など必要な場所)|
【詳細/手順】# (#は段落番号自動追加)この文を消去して手順追加
#
# .
上記のように入力すると以下の表示になる
4. バグ修正時のテンプレ
【解決方法】修正/延期/仕様/非再現/修正済み
【原因】
【対策】
以下の表示
4はGitのコミットコメントで良さそう。
(面倒くさいともっぱら評判)
コミットコメントは1行目は英語で、3行目からは日本語で書くのがよい?
.Net Frameworkの難読化ツール Dotfuscator CE 5 をコマンドラインで実行
Visual Studio 2010 の中に標準添付されているDotfuscator Community Edition 5.0は有料版じゃなくてもコマンドラインで難読化ファイルを作成できる。
しかし、ユーザー登録が必要。
その後にダウンロードできるアップデートを適用すると dotfuscatorCLI.exe が新しく作成されるので、これを利用する。
参考(・・・というかまんまこれ)
How to use PreEmptive Dotfuscator in Visual Studio Setup project to protect your code
PreEmptive のサイトにログインした後、 Download タブの中へ行く、
To run Dotfuscator CE5 (2010) from the command line, install version 5.0.2601 を見つければ後はDLしてインストールするのみ。
その後、Visual Studio 2010 のプロジェクトの ビルド後に実行するコマンドラインに
以下を入れればOK。
"C:\Program Files (x86)\Microsoft Visual Studio 10.0\PreEmptive Solutions\Dotfuscator Community Edition\dotfuscatorCLI.exe" /in:$(TargetFileName)
copy /y "$(TargetDir)Dotfuscated\$(TargetFileName)" "$(TargetDir)$(TargetFileName)"
この部分はOSが64bit か 32bitか判別してProgram files の場所を適切に変更するバッチファイルの方が良さそう。
Vista なので Visual Studio 2012以降は残念ながら調べきれず。
7にする許可が欲しい...
追記 2013/12/18 16:39
バッチファイルとビルド後のコマンドラインを作成したので記述
.xmlで、Dotfuscatorの設定データを読みだして変換実行している。
Release_Obfuscation.bat
@echo off
if exist "%systemroot%\sysnative\" (
echo 32bit on 64bit
set ProgramFilesRoot=%ProgramFiles(x86)%
) else if exist "%systemroot%\syswow64\" (
echo 64bit on 64bit
set ProgramFilesRoot=%ProgramFiles(x86)%
) else (
echo 32bit on 32bit
set ProgramFilesRoot=%ProgramFiles%
)
set DOTFUSCATOR_CLI=%ProgramFilesRoot%\Microsoft Visual Studio 10.0\PreEmptive Solutions\Dotfuscator Community Edition\dotfuscatorCLI.exe
set dotfuscatorXML=%1
rem --- exec ---
echo "%DOTFUSCATOR_CLI%" %dotfuscatorXML%
"%DOTFUSCATOR_CLI%" %dotfuscatorXML%
.
ビルド後のコマンドライン Releaseでのみ実行
if $(ConfigurationName) == Release (
call $(SolutionDir)Release_Obfuscation.bat "$(SolutionDir)Dotfuscator.xml"
move /y $(TargetDir)Dotfuscated\$(TargetFileName) $(TargetDir)$(TargetFileName)
)
「英数」キーで英語入力「かな」キーで日本語入力開始に設定すると非常に捗る
家ではMac、仕事でWinなので統一したかった。
以下の記事を見て全力で同意。
カテゴリ: MacPeople , Apple APPLE 2013年12月04日21時00分 Macの英数/かな切り替えに慣れたらWinの「半角/全角」が不便|Mac
でも、仕事では英語版のHHKB使っているので「ESC」で英語、「CTRL+SHIFT+SPACE」で日本語。
非常に便利。
時々ESC押しすぎてダイアログボックスを勝手に閉じるのが玉にキズw
Redmine 2.3.2 -> 2.4.1へのアップデート
Mercurial に変更し、ほぼ最初からインストールし直した
以下の手順通りにインストールすると bundleでエラー発生
Redmine 2.4をCentOS 6.4にインストールする手順
# bundle install --without development test
You cannot specify the same gem twice with different version requirements.
You specified: capybara (~> 2.1.0) and capybara (~> 2.0.0)
意味がぜんぜんわからない・・・
色々調査していると、以前のプラグインが原因だった。
git管理しておらず面倒だったのでアップデートせずに、以下のプラグインを除去。
redmine_theme_changer
redmine_hudson
やっと実行可能になった
その後、httpd を起動時に警告発生
httpd を起動中: WARNING: The 'RailsFrameworkSpawnerIdleTime' option is obsolete.
Please use 'PassengerMaxPreloaderIdleTime' instead.
[ OK ]
passenger の conf ファイルを変更
# vim /etc/httpd/conf.d/passenger.conf
以下の行を削除
RailsFrameworkSpawnerIdleTime 0
これでようやく終了
疲れました。
intの桁数計算の処理時間
intの桁数を求める方法は色々あれど、
どれが一番高速なのかずっと気になっていたため計算してみた。
3つの手法で計算
- log10の対数を使う
- 10での除算回数
- charへ変換してstrlen
結果
500万回ループして求めた測定結果
2<1<<3 の順で高速
- 1はなにげに高速。2の2.7倍くらいの処理時間
- 2が一番高速
- 3は論外、面倒な上遅い。2の15倍位。
結論
最終的に簡潔に記述できるlog10で良さそう。一番良い結果の2.744倍程度だが一番簡潔。
本当に高速を求めることはそうそうないと思われる。(1回の変換時間は約70nsec)
組み込みなどで制限がある場合、math.hをinclude することでサイズ肥大化が気になるときに10除算回数を選択する感じ
log10で計算するともっと時間がかかると思ってたので以外だった。
10で除算するときに、500万回int定義する時間が掛かったのもあるだろうけど。
プログラム
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#define LOOP_NUM 5000000
int digit_calc_log10(int);
int digit_calc_division10(int);
int digit_calc_strlen(int);
void function_loop(int (*p_function)(int));
int main(void){
// 処理 Log10 ()
function_loop(digit_calc_log10);
// 処理 /10
function_loop(digit_calc_division10);
// 処理 strlen
function_loop(digit_calc_strlen);
return 0;
}
// 桁数をLog10で計算
int digit_calc_log10(int value){
return log10(value) + 1;
}
// 桁数を10の除算で計算
int digit_calc_division10(int value){
int digit = 0;
while(value) {
value /= 10;
digit++;
}
return digit;
}
// 桁数をcharの長さで計算
int digit_calc_strlen(int value){
char c_value[100];
sprintf(c_value, "%d", value);
return strlen(c_value);
}
// LOOP_NUM回p_function関数を繰り返す
void function_loop(int (*p_function)(int)) {
clock_t start, end;
start = clock();
int digit;
int value;
for(value=1; value<LOOP_NUM; value++ ){
digit = p_function(value);
// printf("%d:%d\n", value, digit);
}
end = clock();
printf( "処理時間:%d[ms]\n", end - start );
}
実行結果
処理時間:343[ms]
処理時間:125[ms]
処理時間:1684[ms]
環境
CPU: Core 2 Quad Q9650 3.00GHz
モードレスなメッセージボックス表示
モーダルダイアログ : OKボタンを押す事により次の処理を行うダイアログ
モードレスダイアログ : OKボタンを押さずとも裏で処理が動いているダイアログ
これをメッセージボックスに当てはめると以下になる。
モーダルはそのままなので簡単
MessageBox.show("test");
モードレスはスレッドを作成する必要あり
using System.Threading;
new Thread(new ThreadStart(delegate
{
MessageBox.Show("test");
})).Start();
参考
Create a Modeless Messagebox - stackoverflow
追記:
(.NET Framework 4以降ならTaskを使う。ついでにラムダ式も使用)
using System.Threading.Tasks;
Task.Factory.StartNew(() =>
MessageBox.Show("test")
);
ThreadとTaskの違いは以下を参照
[雑記] スレッド プールとタスク - ++C++; // 未確認飛行C