2013-08-15

incrementing version number (Visual Studio)

自動增加版本號

stackoverflow 看到一篇增加版本號的討論,其中使用 TextTransform.exe 將樣板建立成有新的版本號的 assemblyinfo.cs。裡面的步驟需要的依序建立 assemblyinfo.tt,然後在專案的建置屬性設置 prebuild。

  如果每個新建專案都要加入 assemblyinfo.tt 和設定 Prebuild 又有點麻煩,所以我直接修改 Visual Studio 的 ProjectTemplates 達到每次新增專案,就已經是配置好的項目。



樣板路徑 是 Visual studio 安裝路徑
%ProgramFiles%\Microsoft Visual studio 9.0\Common7\Ide\ProjectTemplates
%ProgramFiles%\Microsoft Visual studio 9.0\Common7\Ide\ProjectTemplatesCache

在使用時會從 ProjectTemplatesCache 產生專案,所以可以只改 ProjectTemplatesCache


增加編譯時自動增加版本號的樣板,例如 Windows Application
D:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ProjectTemplates\CSharp\Windows\1028\WindowsApplication

1. 覆製 assemblyinfo.cs  -> assemblyinfo.tt

=====assemblyinfo.tt=====================================
<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Windows.Forms" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Text.RegularExpressions" #>
<#
    int incRevision = 1;
    int incBuild = 1;

    try { incRevision = Convert.ToInt32(this.Host.ResolveParameterValue("","","Debug"));} catch( Exception ) { incBuild=0; }
    try { incBuild = Convert.ToInt32(this.Host.ResolveParameterValue("","","Release")); } catch( Exception ) { incRevision=0; }
    try {
        string currentDirectory = Path.GetDirectoryName(Host.TemplateFile);
        string assemblyInfo = File.ReadAllText(Path.Combine(currentDirectory,"AssemblyInfo.cs"));
        Regex pattern = new Regex("AssemblyVersion\\(\"\\d+\\.\\d+\\.(?<revision>\\d+)\\.(?<build>\\d+)\"\\)");
        MatchCollection matches = pattern.Matches(assemblyInfo);
        revision = Convert.ToInt32(matches[0].Groups["revision"].Value) + incRevision;
        build = Convert.ToInt32(matches[0].Groups["build"].Value) + incBuild;
    }
    catch( Exception ) { }
#>
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// 組件的一般資訊是由下列的屬性集控制。
// 變更這些屬性的值即可修改組件的相關
// 資訊。
[assembly: AssemblyTitle("$projectname$")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("$registeredorganization$")]
[assembly: AssemblyProduct("$projectname$")]
[assembly: AssemblyCopyright("Copyright © $registeredorganization$ $year$")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// 將 ComVisible 設定為 false 會使得這個組件中的型別
// 對 COM 元件而言為不可見。如果您需要從 COM 存取這個組件中
// 的型別,請在該型別上將 ComVisible 屬性設定為 true。
[assembly: ComVisible(false)]

// 下列 GUID 為專案公開 (Expose) 至 COM 時所要使用的 typelib ID
[assembly: Guid("$guid1$")]

// 組件的版本資訊是由下列四項值構成:
//
//      主要版本
//      次要版本
//      組建編號
//      修訂編號
//
// 您可以指定所有的值,也可以依照以下的方式,使用 '*' 將組建和修訂編號
// 指定為預設值:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.<#= this.revision #>.<#= this.build #>")]
[assembly: AssemblyFileVersion("1.0.<#= this.revision #>.<#= this.build #>")]

<#+
    int revision = 0;
    int build = 0;
#>
=====assemblyinfo.tt  End=====================================


2. csWindowsAplication.vstemplate 加入內容       <ProjectItem ReplaceParameters="true" TargetFileName="Properties\AssemblyInfo.tt">AssemblyInfo.tt</ProjectItem>

<VSTemplate Version="3.0.0" Type="Project" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
  <TemplateContent>
    <Project File="WindowsApplication.csproj" ReplaceParameters="true">
      <ProjectItem ReplaceParameters="true" TargetFileName="Properties\AssemblyInfo.tt">AssemblyInfo.tt</ProjectItem>
      <ProjectItem ReplaceParameters="true" TargetFileName="Properties\AssemblyInfo.cs">AssemblyInfo.cs</ProjectItem>
    </Project>
  </TemplateContent>
</VSTemplate

3. windowsapplication.csproj 修改
    3.1 找到 <Compile Include="Properties\AssemblyInfo.cs"/> 用以下內容置換

        <None Include="Properties\AssemblyInfo.tt">
          <Generator>TextTemplatingFileGenerator</Generator>
          <LastGenOutput>AssemblyInfo.cs</LastGenOutput>
        </None>
        <Compile Include="Properties\AssemblyInfo.cs">
          <AutoGen>True</AutoGen>
          <DesignTime>True</DesignTime>
          <DependentUpon>AssemblyInfo.tt</DependentUpon>
        </Compile>

   3.2 找到 <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 這行下面加入以下內容,讓msbuild 時能透過樣板重建 assemblyinfo.cs

  <PropertyGroup>
    <PreBuildEvent>"%25CommonProgramFiles(x86)%25\microsoft shared\TextTemplating\10.0\TextTransform.exe" -a !!$(ConfigurationName)!1 "$(ProjectDir)Properties\AssemblyInfo.tt"</PreBuildEvent>
  </PropertyGroup>

2013-06-01

SSH 免密碼登入


原文:http://josephj.com/article/understand-ssh-key/

關於作者 - JosephJ

D-Link 友訊科技工程師。喜好戶外運動、2008 年 5 月完成「跑步環島」。對於新技術跟程式碼有著強烈的偏執狂。


一、基本流程說明

1. 私密與公開金鑰

以 SSH 登入任何主機都必需要打帳號、密碼,除了不方便、另外還增加了被竊取的風險(有些軟體如 winscp 是可儲存的)。
解決的方式就是使用金鑰產生器來產生一筆公開金鑰(Public Key)與私密金鑰(Private Key)對應做免密碼的登入。
使用者只需將公開金鑰的內容附加系統上特定的檔案中,以及在自己的環境指定好私密金鑰,系統在登入流程中即會自動對應,正確無誤即可登入,讓整個登入流程快速且安全。

2. 金鑰種類

但是對應並沒有想像中這麼簡單,就像是木門上只能裝喇吧鎖而無法裝大鎖,不同的主機所能使用的金鑰機制也有所不同
SSH 有 Protocol 1 及 Protocol 2 兩種[1],常見金鑰編碼機制則有 RSA1、RSA2、以及 DSA 等三種。SSH Protocol 1 使用 RSA1,SSH Protocol 2 使用 RSA或DSA。

3. 保護金鑰的措施

而另外一個問題,如果有人拿到了你的私密金鑰,就相當於他可以在你的主機為所欲為。
保護的措施就是使用 Passphrase(也可以不設)、私密金鑰的密碼,每次要用時就得輸入。

4. Agent 機制

有 Passphrase 保護當然是安全多了,但原本想用金鑰的好處就是可以省去每次打密碼的步驟,
現在若每次又得打 Passphrase,這樣的好處就沒有了,可能還得多記一套密碼、增加打錯的可能性。
還好有 Agent 機制,他相當是你的管家、我們只要把鑰匙及 Passphrase 請他保管,在登入主機時他就會幫你解決輸入 Passphrase 的問題


二、一步一步教到會

以下就只針對 Mac OSX 及 *nix 系統做介紹(若你是使用 Windows 中的 PuTTY,請先做完步驟一與二,再看這裡):

步驟 1. 產生金鑰

在 Command Line 中你可以使用 ssh-keygen 來產生各種類的金鑰,而我也會鼓勵大家一次把三種金鑰產生好,省得碰到不同系統麻煩。

a. 產生 RSA 1 金鑰

這種金鑰是給比較舊的系統,例如 FreeBSD 4 及以前的版本、是走 SSH Protocol 1 的,最好就使用 RSA 1 這種金鑰
$ ssh-keygen -t rsa1
Generating RSA keys: Key generation complete.
Enter file in which to save the key ($HOME/.ssh/identity): [按 Enter 使用預設值(建議)]
Enter passphrase: 輸入你的 Passphrase [建議要使用 passphrase,最少 12 碼]
Enter same passphrase again: 再一次輸入你的 Passphrase
Your identification has been saved in /home/username/.ssh/identity.
Your public key has been saved in /home/username/.ssh/identity.pub.
The key fingerprint is: 1c:a7:25:88:c1:fe:d2:da:a3:41:c3:a2:9f:52:59:b3 username@demo.com

b. 產生 RSA 2 金鑰

比較新的系統,如 FreeBSD 5 及之後版本或 Linux,用 RSA 2 或 DSA 這兩種金鑰
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa): [按 Enter 使用預設值(建議)]
Enter passphrase: 輸入你的 Passphrase (私密金鑰保護密碼,每次使用私密金鑰都要輸入)
Enter same passphrase again: 再一次輸入你的 Passphrase
Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.
The key fingerprint is: 1c:a7:25:88:c1:fe:d2:da:a3:41:c3:a2:9f:52:59:b3 username@demo.com

c. 產生 DSA 金鑰

$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_dsa): [按 Enter 使用預設值(建議)]
Enter passphrase: 輸入你的 Passphrase (私密金鑰保護密碼,每次使用私密金鑰都要輸入)
Enter same passphrase again: 再一次輸入你的 Passphrase
Your identification has been saved in /home/username/.ssh/id_dsa.
Your public key has been saved in /home/username/.ssh/id_dsa.pub.
The key fingerprint is: 41:c3:a2:9f:52:59:b3:0c:cf:45:b6:cc:e8:a9:97:52 username@demo.com
經過這樣的程序,我們總共會有公私鑰共三對:RSA1 ( identity.pub / identity )、RSA2 ( id_rsa.pub / id_rsa )、及 ( id_dsa.pub / id_rsa )。
如果沒有特殊需求,你可以只用一對公私鑰,用任一個系統產生,並把這一對公私鑰給保管好即可

步驟 2. 將公開金鑰放到主機

你現在在自己的機器上已經有了三對金鑰,接下來我們要把公開的三隻 (*.pub) 放到我們要登入的主機上。
$ scp ~/.ssh/*.pub 你欲登入的主機:~/.ssh/.
接著登入該系統,在沒設定好之前當然還是得乖乖打密碼
$ ssh 你欲登入的主機
系統預設處理放置公鑰的檔案叫做 authorized_keys,所以我們要把剛剛所傳的公鑰附加到這個檔案中:
$ cat ~/.ssh/identity.pub >> ~/.ssh/authorized_keys
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
$ chmod 711 ~/.ssh
$ chmod 644 ~/.ssh/authorized_keys
如果沒有意外,你登出再登入主機,就會看到它請你輸入 Passphrase 的訊息。

步驟 3. 設定 ssh-agent

前面所提到,每次都要打 Passphrase 就太麻煩了,所以這裡要設定管家 ssh-agent、以保管私鑰及 Passphrase。
在你每次啟動 shell 後,請照這樣的方式來做:

a. 啟動 ssh-agent

$ eval `ssh-agent -s`

b. 將私密金鑰交給 ssh-agent 保管:ssh-add

我們將要用 ssh-add 來指定金鑰,如果你都照上面放預設的位置及相同的檔名,那就不用有任何的參數。
$ ssh-add
接著會要求你設定輸入 passphrase,如果三個都一樣,就只要打一次。
Enter passphrase for /home/username/.ssh/id_rsa:你的 Passphrase
Identity added: /home/username/.ssh/id_rsa (/home/username/.ssh/id_rsa)
Identity added: /home/username/.ssh/id_dsa (/home/username/.ssh/id_dsa)
Identity added: /home/username/.ssh/identity (username@username.com)
接著再試看看登入已經放好公鑰的主機,應該就可以不用密碼登入了!

c. 自動化流程

如果每次進 Shell 都要做 a、b 動作,可能還是太麻煩且忘記,也因此我去找了可以放在 .bash_profile 的 script ( Joseph M. Reagle Jr ),
一進入 Shell 就會把該做的動作做好,且詢問你 Passphrase:SH_ENV="$HOME/.ssh/environment"
function start_agent {
echo "Initialising new SSH agent..."
/usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
echo succeeded
chmod 600 "${SSH_ENV}"
. "${SSH_ENV}" > /dev/lull
/usr/bin/ssh-add;
}
# Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
. "${SSH_ENV}" > /dev/null
#ps ${SSH_AGENT_PID} doesn’t work under cywgin
ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
start_agent;
}
else
start_agent;
fi


三、公私鑰所需放的機器

我的歸納是,在本機上你必需一直保有這兩份以便後續的再製。而公鑰整理成 authorized_keys,以後有新機器需要登入時一律傳此檔案上去做附加
而除了本機外,那些機器需要放私鑰呢?我的情況是最常用的那台開發機,因為你可能會利用他去 SSH 其它台機器。不然的話,應該減少私鑰的存放地點,以求安全


四、延伸閱讀

[1] ssh-keygen


2013-05-13

GitLab, Window and TortoiseGit

今天要講解如何在 Windows 作業系統使用 Git 做檔案的版本控管。當然在開始前要瞭解一下什麼是 git ,如果不是你需要的就不必花時間再看下去啦!

git 是一個分散式的版本控制工具軟體,而 CVS 和 Subversion 屬於集中式版本控制工具,不同之處在於集中式版本控制工具一定要有伺服器端,而 git 採用分散式版本庫,所以在沒有伺服器端的情況下也能運行版本控制,當有網路連線時再將變更提交到伺服器端。

更多的 git 介紹可以搜尋網路資料:
https://zh.wikipedia.org/wiki/Git
https://www.google.com/search?q=git


本文使用的平台是 GitLab 5.1+ TortoiseGit + mysysgit + Windows XP SP3,GitLab是使用 BitNami 提供的 virtual machines (http://bitnami.com/stack/gitlab) 架設,本文件只教你如何在 Windows 安裝操作軟體的環境。其實操作和 GitHub 很相似,如果是開放專案可以直接使用 GitHub 的免費服務,GitHub 也提供付費的私有版本庫服務。



文件大綱

  1. 下載 TortoiseGit
  2. 下載 mysysgit
  3. 安裝 TortoiseGit
  4. 安裝 mysysgit
  5. 登入 GitLab 確定自己帳號所設定的電子郵件
  6. 用 ssh-keygen 建立公鑰(public key)和私鑰(private key)
  7. 將公鑰(public key)用文字編輯器開啟,將內容加入 GitLab 的SSH Key
  8. 用 puttygen 載入剛才的私鑰,另存成 putty 格式使用的私鑰
  9. 測試


影片連結:
  1. 安裝 TortoiseGit 和 mysysgit


1.下載 TortoiseGit
到 Google Code 的網站下載 TortoiseGit的安裝檔,依據你所欲安裝的作業系統平台下載對應的版本。筆者使用 Windows XP 是 32-bit 作業系統,所以下載  TortoiseGit-1.8.3.0-32bit.msi 來進行安裝。本文撰寫時網站釋出的是 1.8.3.0,請依據你所看到的版本下載較新的進行安裝。


TortoiseGit專案下載頁: https://code.google.com/p/tortoisegit/ 

下載符合你作業系統的版本
安裝檔:TortoiseGit-1.8.3.0-32bit   TortoiseGit-1.8.3.0-64bit
繁體中文語系檔:1.8.3.0-32bit-zh_TW  1.8.3.0-64bit-zh_TW

2.下載 mysysgit(Git for Windows)

在下載頁會看到 Git for Windows 和 mysysGit ,二個雖然都能達到相同的用途但是環境不太一樣,一般使用者只要下載 Git for Windows 安裝即可。mysysGit 是依賴於 MinGW 的版本,包含編譯和建置的所有資源,預設安裝路徑不同,需要的設定項目也比較多。 

mysysgit專案網頁:http://msysgit.github.io/

選擇要下載的mysysgit安裝檔

下載安裝檔


下載最新的版本
安裝檔: Git-1.8.1.2-preview20130201.exe


3.安裝 TortoiseGit

安裝 TortoiseGit 其實沒什麼特別的,就是一直按下一步就安裝完成了。


4.安裝 mysysgit(Git for Windows)



在此安裝過程中,你必須設置一些重要設置,請確保正確設置它們。

未完待續...














adsense