.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してインストールするのみ。

f:id:sechs:20131217153825p:plain

 

その後、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へのアップデート

Redmineのgitリポジトリが更新されていないため、

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つの手法で計算

  1. log10の対数を使う
  2. 10での除算回数
  3. 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]

 

環境

コンパイラ:Cygwin gcc

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

 

一行の中に数式などの上付き文字を表示したいとき

機種依存文字の立方メートル㎥は、フォントに存在しない場合1文字だけ汚い場合がある。(メイリオだと顕著に現れる)

この場合は以下のようにする

 

解説

上付き文字のUnicodeが存在するため、それを利用すると辛うじて綺麗に表示された。

機種依存文字のように1文字全体が違うフォントではなく、3のみが違うフォントになるため辛うじて許せるレベル?

  

比較

㎥   m³

 

参考

■[iPhoneプログラミング]上付き文字、下付き文字を使う

http://d.hatena.ne.jp/nakamura001/20100620

 

 

 

BATファイルでパスワード付きのWindows共有フォルダにアクセスする方法

自動化厨のための忘備録

 

共有フォルダを利用する流れ

  1. ユーザー名とパスワードを使い共有フォルダへ接続
  2. 共有フォルダで削除やコピーなどの作業
  3. 共有フォルダの切断

 

対応コマンド(括弧内は任意)

  1. net use (共有フォルダへのパス) (PASSWORD) /user:(USERNAME) /Y
    /Y : 確認なしで接続
  2. (サーバー上で適当に処理 hogehoge)
  3. 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ですら発生したので、根は深そう。
解決策として全部半角英数字で記述。