.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
BATファイルでパスワード付きのWindows共有フォルダにアクセスする方法
自動化厨のための忘備録
共有フォルダを利用する流れ
- ユーザー名とパスワードを使い共有フォルダへ接続
- 共有フォルダで削除やコピーなどの作業
- 共有フォルダの切断
対応コマンド(括弧内は任意)
- net use (共有フォルダへのパス) (PASSWORD) /user:(USERNAME) /Y
/Y : 確認なしで接続 - (サーバー上で適当に処理 hogehoge)
- net use (共有フォルダの場所) /delete
記述例(パス付き共有サーバーに日時のディレクトリを作成)
@echo off
setlocal
rem ------ 定義 ------
set SERVER_PATH=\\test_server
set USERNAME=admin
set PASSWORD=admin_pass
rem 日時取得(時間が1桁の場合は空白になるため0で置換)
set time2=%time: =0%
set yyyyMMdd_hhmm=%date:~0,4%%date:~5,2%%date:~8,2%_%time2:~0,2%%time2:~3,2%
set DIRNAME=%yyyyMMdd_hhmm%
rem ------ 処理 ------
rem 1. 接続
net use %SERVER_PATH% %PASSWORD% /user:%USERNAME% /Y
rem 2. 処理
mkdir %SERVER_PATH%\%DIRNAME%
rem 3. 切断
net use %SERVER_PATH% /delete
簡単処理ならこれでOK
もし、GitとかJenkinsを利用しているならばBATファイル実行に失敗する不可解な現象があることに注意(このWindowsのバグで実装が2日は遅れた)
改行コード LF で日本語を含むバッチファイルの動作がおかしい件
Windows 7ですら発生したので、根は深そう。
解決策として全部半角英数字で記述。