2011年12月14日 星期三

generate MD5 string with T-SQL

要將字串透過T-SQL的函數做MD5的編碼
一開始參考了MSDN的HashBytes說明

執行了下列語法
SELECT hashbytes('MD5','12345')

出來的結果是
0x827CCB0EEA8A706C4C34A16891F84E7B

嗯,我不要前面的0x
所以,再conver一下
SELECT CONVERT(VARCHAR(32),hashbytes('MD5','12345'),2)

輸出結果:
827CCB0EEA8A706C4C34A16891F84E7B

2011年12月12日 星期一

Jenkins管理設定

無法查看此摘要。請 按這裡查看文章。

Jenkins安裝筆記

最近想幫team架個continuous integration server
而我們team的環境是.Net + Windwos + SQL Server
我從之前有接觸過的的CI系統
大概就 CruiseControl.NET
以及Jenkins
不過之前都是同事架好的系統讓我們使用
這次則是自己親手要架一個CI server
因為一些原因,選擇了Jenkins

開始安裝筆記吧
1.download Jenkins for windows版
http://jenkins-ci.org/ 的首頁右邊可以下載windows版本(我目前的版本是jenkins-1.442版)

2.執行unzip後的setup.exe
安裝路徑我都沒改,都用default路徑

3.安裝成功後,到「控制台」的「服務」,先將Jenkins停止
因為目前的機器上面有裝了Tomcat,而Tomcat所用的port與Jenkins都同為8080
怕會有衝突,所以需要將Jenkins所佔用的port做變更,這裡假設是8088

4.修改Jenkins佔用的port
開啟C:\Program Files\Jenkins\jenkins.xml
修改httpPort=8080,將它後面的port改為你要的port

5.Restart Jenkins Windows service
從「控制台」的「服務」將Jenkins給啟動

6.打開browser連線到http://localhost:8088/
localhost後面的port請帶你自己在jenkins.xml中修改的port

7.安裝plugin
由於我的版本控管是用git
所以安裝了「Jenkins GIT plugin」
另外也裝了「Jenkins MSBuild Plugin」
畫面大致如下(請點圖放大):



嗯,以上大概是簡易的說明筆記
都是著重在安裝的部份,關於設定的部份,請參考另外一篇
http://yeahpingchi.blogspot.com/2011/12/jenkins_12.html


2011年12月8日 星期四

git - 在windows環境下使用_netrc來存帳號密碼

之前寫了一篇文章記錄如何在windows環境上裝git server

基本上,依照這篇設定的方式
git client端在pull、push程式時
因為是透過http basic authentication來做帳號密碼的認證的

時間一久,工程師對於重覆的動作是會煩的
來用_netrc檔案來記憶UserName和Password吧
步驟如下:
1.透過cmd.exe來設定環境變數HOME
設定好之後,將命令視窗關掉,再重新執行後打上echo %HOME%來看一下設定後的路徑在哪
通常都是C:\Users\"你的帳號"

2.建一個_netrc檔,放到剛剛echo出來的%HOME%路徑裡
_netrc檔的內容如下:


machine <server name>
login <username>
password <password>


<server name>就是遠端的git repository的路徑
<username>就是http認證的帳號
<password>當然就是密碼

3.就是pull程式試看看吧 XD

2011年11月30日 星期三

C sharp 轉換字串編碼

處理big5轉utf-8
在C#中,要使用Encoding類別來做字元編碼的轉換
首先,因為Encoding類別是在System.Text,所以要using System.Text

using System.Text;

然後把要轉換的字元先轉成byte
再將byte做編碼的轉換
最後再把byte轉成string


byte[] testEncoding = Encoding.Default.GetBytes("接收的參數");
byte[] test = Encoding.Convert(Encoding.GetEncoding("big5"), Encoding.GetEncoding("utf-8"), testEncoding);
string utfString = Encoding.Default.GetString(test);



嗯,跟PHP的編碼轉換比起來,似乎有點麻煩

2011年11月9日 星期三

軟體開發必須做的事之一:版本控管

從事軟體開發一段時間,待過幾家公司,也做過政府大型專案、一般企業專案和產品及網站服務
個人覺得,在整個軟體開發過程中
有一些是最基本、必須要做的項目

2011年10月7日 星期五

Authetication with Active Directory

最近公司的內部系統的登入驗證要使用LDAP對Active Directory進行驗證

主要是參考這篇,裡面的範例直接拿來使用即可
http://msdn.microsoft.com/zh-tw/library/ms180890%28VS.80%29.aspx

不過還是有些觀念稍微memo下來

2011年9月23日 星期五

ASP.NET MVC自訂登入權限

在ASP.NET MVC中
有些Action的執行,必須先判斷使用者是否經過登入,或是有沒有相關權限
所以我們在controller的action名稱前,可加入[Authorize]這個Attribute
若使用者沒有登入,則將他導向Web.config中定義的登入頁
controller的部份

2011年9月9日 星期五

Html attributes for EditorFor() in ASP.NET MVC 3(use Razor)

最近剛使用ASP.NET的新的view engine:Razor
專案中想讓view的某個欄位是disable的
但是原本用Visual Studio幫你產生出來時,view中的code對於欄位會產生如下:

@Html.EditorFor(model => model.EmployeeNo)


想要讓該欄位disable,後來找了一下資料,試成這樣:

PetaPOCO with stored procedure

在試PetaPoco執行stored procedure時
主要是參考下面這篇文章
PetaPoco with parameterised stored procedure and Asp.Net MVC

自己試了之後,有幾項要點先memo下來

2011年9月8日 星期四

PetaPOCO使用JOIN回傳Muti-POCOs

新的案子由於一些考量,不使用Entity Framework
所以找了一個替代方案-PetaPOCO
它是一個輕量級的ORM
這裡這先不介紹它那麼多了
先memo下來我在使用SQL join多table時,要對應到相對的POCO時所發生的問題

使用Fetch時,無法回傳對應的POCO
例:

var sql = PetaPoco.Sql.Builder
                .Append("SELECT Test_Basic.*, Test_Detail.*")
                .Append(" From Test_Basic ")
                .Append(" JOIN Test_Detail ON Test_Basic.MID = Test_Detail.TID Where Test_Basic.Account = 'test' ");
 var test = databaseContext.Fetch<TestBasic, TestDetail>(sql);

後來才發現是TestBasic那個POCO裡面
少了一個TestDetail的關聯,補上如下:

[ResultColumn]
 public TestDetail TestDetailObject { get; set; }

這樣就抓的到了
另外欄位也記得加上PetaPOCO的annotation

[PetaPoco.Column]
 public string Account { get; set; }


或者是拿掉[ExplicitColumns]

2011年9月2日 星期五

MySQL : SELECT ... FOR UPDATE

之前公司有一個功能是負責商品搶購
也就是在某一段時間內,給會員用優惠的價格買東西
這個案例在電子商務的世界裡很常見
對於商品的可購買數量,若是在交易過程中,計算錯了
那可是會有一大堆客訴

那時該系統是使用MySQL
而商品的table是用InnoDB
我們必須在會員購買前,先確認商品的庫存數量
庫存>0的時候,我能才能賣
如果SQL是這樣寫
SELECT quantity FROM product WHERE id="商品編號";

再判斷quantity >0為true的話,就再更新賣掉後的數量
UPDATE products SET quantity = 5 WHERE id="商品編號";
 要是這樣寫的話,就挫起來了
我們必須在這段程式裡包一個交易(transaction)
並且將SELECT的後面再上 FOR UPDATE
才能避免產生race condition
修改如下:
SELECT quantity FROM product WHERE id="商品編號" FOR UPDATE; 
UPDATE products SET quantity = 5 WHERE id="商品編號";

2011年9月1日 星期四

為ELMAH custom error page

ELMAH真是個記錄網站error的好工具
從NuGet下載安裝後
幾乎web.config都設定好了
不過我不想網站發生錯誤時,都跳出詳細的錯誤資訊給別人看
所以需要設定自訂錯誤頁

這時候,把web.config打開來
確認<configSections>有下面的資料(從NuGet安裝會自動幫你加)
<configSections>
    <sectionGroup name="elmah">
      <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" />
      <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah"  />
      <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" />
      <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" />     
    </sectionGroup>  
  </configSections>
再來是<httpModules>加上
<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
 然後<httpHandlers>加上
<add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
以上是從NuGet安裝ELMAH後,會自動加上去的
再來就自己在<system.web> 區塊內加入
<customErrors mode="On" />
這裡可以指定你的錯誤頁,但是我目前預設是用View/Shared/Error.cshtml

還有在<configuration> section為你的xml log檔選個地方存檔
<elmah>
    <errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="D:/WebLog" />
  </elmah>
最後,確認一下Gobal.asax檔的RegisterRoutes method有沒有加上:
routes.IgnoreRoute( "elmah.axd" );  

按照上面的部份,照理說就可以work了
不過,我自己看官方文件的時候做完之後,是會導到自訂錯誤頁沒錯
可是看elmah.axd檔時,卻沒有任何error被log下來
後來發現我的web.conf檔有多了一個section
<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true">
      <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
      <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" />
      <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" />
    </modules>
    <handlers>
      <add name="Elmah" path="elmah.axd" verb="POST,GET,HEAD" type="Elmah.ErrorLogPageFactory, Elmah" preCondition="integratedMode" />
    </handlers>
  </system.webServer>
把它拿掉之後,就可以了
目前還沒研究這一段有何功用
等改天研究好再PO出來

2011年8月30日 星期二

專案管理工具-xplanner plus

最近在survey一個工具來管理專案進度
之前用過XPlanner,覺得還不錯用
不過後來找到XPlanner plus,感覺比XPlanner更棒的樣子
XPlannerXPlanner plus是以極限編程(eXtreme Programming, XP)的概念來設計project control的工具
若有人對XP有興趣,就自己google一下吧

這裡先提一下基本觀念,整個工具繞著XP的觀念走
你必須建Project -> Iteration -> User Story -> Task
先建Project,你的專案名稱(: XX資訊系統)
再建Iteration,這裡可以用模組來分,或是這次要開發的新功能名稱
User Story,我這裡一般都會建立功能名稱,例如:員工資料建檔、或者是會員登入、購物車清單
Task,這部份我之前有針對所屬的user story建立「系統分析」、「開立系統規格書」、「開發」、「測試」,不過這個項目也programmer自己填需要完成哪些副程式也可以。

下次再來談使用xplanner plus的使用心得

註:

Web.config的ConnectionString

不知道大家在多人開發環境.NET時會不會有這樣的問題
如果開發時,team的每個人都是連自己local的DB
從版本控管系統取得程式下來後
自己local端的web.config檔中的connection string被蓋掉了
一般由.NET自行產生的connection string會如下格式:
<connectionStrings>
    <add name="DBConnStr" connectionString="Data Source=yourDB;Initial Catalog=yourDDName;User ID=sa; pwd=xxxx;" providerName="System.Data.SqlClient" />
</connectionStrings>
建議將connection string改為連外部檔案
<connectionStrings configSource="MyConnectionString.config">
</connectionStrings>
MyConnectionString.config內容如下:
<connectionStrings>
  <clear/>
  <add name="DBConnStr" connectionString="Data Source=yourDB;Initial Catalog=yourDDName;User ID=sa; pwd=xxxx;" providerName="System.Data.SqlClient" />
</connectionStrings>
再將MyConnectionString.config設為不從版本控管系統更新就可以啦。

其實從.NET 4.0之後,可以利用 XML Document Transformation 解決開發環境轉換的問題
但是個人還是不太喜歡這個方法
沒有Java的Maven來得好用
之後我再試看看用MSBuild能否解決開發環境轉換的問題吧

2011年8月29日 星期一

ViewData與TempData

都是繼承自System.Web.Mvc.ControllerBase都是實做IDictionary介面

ViewData用途:經由Controller將Data傳給View
TempData用途:經由Controller將Data傳給View

ViewData的生命週期:只有一個Action
TempData的生命週期:可跨Action(存在Session中),但是只能跨一個Action(透過RedirectToAction的方式),之後在下一個Action取出TempData的資料後,Session就會被清空。

2011年8月23日 星期二

git server on windows記錄

*安裝apache

*安裝git

*將git安裝目錄的bin\libiconv2.dll 和 libiconv-2.dll  複製到 libexec\git-core\ 下

*在D槽新增GitRepos,用來放git repository

*修改apache的httpd.config
修改Directory區塊如下

<Directory />
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Allow from all
</Directory>


在最後面加入
#Set this to the root folder containing your Git repositories.
SetEnv GIT_PROJECT_ROOT D:/GitRepos
# Set this to export all projects by default (by default,
# git will only publish those repositories that contain a
# file named “git-daemon-export-ok”
SetEnv GIT_HTTP_EXPORT_ALL
# Route specific URLS matching this regular expression to the git http server.
#若git的存放路徑不同,記得修改最後一行
ScriptAliasMatch \
  "(?x)^/(.*/(HEAD | \
    info/refs | \
    objects/(info/[^/]+ | \
      [0-9a-f]{2}/[0-9a-f]{38} | \
      pack/pack-[0-9a-f]{40}\.(pack|idx)) | \
    git-(upload|receive)-pack))$" \
    "C:/Program Files (x86)/Git/libexec/git-core/git-http-backend.exe/$1"
<Location "/">
    AuthType Basic
    AuthName "GIT Repository"
    AuthUserFile "D:/GitRepos/htpasswd/git.passwd"
    Require valid-user       
</Location>

*產生git.passwd
在命令列下,切換到apache底下的bin目錄
key下面指令: htpasswd -c git.passwd 使用者名稱
之後會要你輸入密碼
若要再產生另外一個帳號到同一個檔案
則輸入htpasswd -m git.passwd 使用者名稱
之後把bin目錄下的git.passwd搬到D:/GitRepos/htpasswd/

*重啟apache

*使用git的bash到D:/GitRepos
  git init --bare --share TestProject
  再切換到TestProject
  git update-server-info

*之後就從client抓資料啦