要將字串透過T-SQL的函數做MD5的編碼
一開始參考了MSDN的HashBytes說明
執行了下列語法
SELECT hashbytes('MD5','12345')
出來的結果是
0x827CCB0EEA8A706C4C34A16891F84E7B
嗯,我不要前面的0x
所以,再conver一下
SELECT CONVERT(VARCHAR(32),hashbytes('MD5','12345'),2)
輸出結果:
827CCB0EEA8A706C4C34A16891F84E7B
2011年12月14日 星期三
2011年12月12日 星期一
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
而我們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檔的內容如下:
<server name>就是遠端的git repository的路徑
<username>就是http認證的帳號
<password>當然就是密碼
3.就是pull程式試看看吧 XD
基本上,依照這篇設定的方式
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類別來做字元編碼的轉換
嗯,跟PHP的編碼轉換比起來,似乎有點麻煩
在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下來
主要是參考這篇,裡面的範例直接拿來使用即可
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的部份
有些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對於欄位會產生如下:
想要讓該欄位disable,後來找了一下資料,試成這樣:
專案中想讓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下來
主要是參考下面這篇文章
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
例:
後來才發現是TestBasic那個POCO裡面
少了一個TestDetail的關聯,補上如下:
這樣就抓的到了
另外欄位也記得加上PetaPOCO的annotation
或者是拿掉[ExplicitColumns]
所以找了一個替代方案-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是這樣寫
也就是在某一段時間內,給會員用優惠的價格買東西
這個案例在電子商務的世界裡很常見
對於商品的可購買數量,若是在交易過程中,計算錯了
那可是會有一大堆客訴
那時該系統是使用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安裝會自動幫你加)
再來就自己在<system.web> 區塊內加入
還有在<configuration> section為你的xml log檔選個地方存檔
按照上面的部份,照理說就可以work了
不過,我自己看官方文件的時候做完之後,是會導到自訂錯誤頁沒錯
可是看elmah.axd檔時,卻沒有任何error被log下來
後來發現我的web.conf檔有多了一個section
目前還沒研究這一段有何功用
等改天研究好再PO出來
從NuGet下載安裝後
幾乎web.config都設定好了
不過我不想網站發生錯誤時,都跳出詳細的錯誤資訊給別人看
所以需要設定自訂錯誤頁
這時候,把web.config打開來
確認<configSections>有下面的資料(從NuGet安裝會自動幫你加)
<configSections>再來是<httpModules>加上
<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>
<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>最後,確認一下Gobal.asax檔的RegisterRoutes method有沒有加上:
<errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="D:/WebLog" />
</elmah>
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更棒的樣子
XPlanner和XPlanner 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的使用心得
註:
xplanner plus網站: http://xplanner-plus.sourceforge.net/
安裝可從http://sourceforge.net/apps/mediawiki/xplanner-plus/index.php?title=XPlanner_documentation找到相關資訊
Web.config的ConnectionString
不知道大家在多人開發環境.NET時會不會有這樣的問題
如果開發時,team的每個人都是連自己local的DB
從版本控管系統取得程式下來後
自己local端的web.config檔中的connection string被蓋掉了
一般由.NET自行產生的connection string會如下格式:
其實從.NET 4.0之後,可以利用 XML Document Transformation 解決開發環境轉換的問題
但是個人還是不太喜歡這個方法
沒有Java的Maven來得好用
之後我再試看看用MSBuild能否解決開發環境轉換的問題吧
如果開發時,team的每個人都是連自己local的DB
從版本控管系統取得程式下來後
自己local端的web.config檔中的connection string被蓋掉了
一般由.NET自行產生的connection string會如下格式:
<connectionStrings>建議將connection string改為連外部檔案
<add name="DBConnStr" connectionString="Data Source=yourDB;Initial Catalog=yourDDName;User ID=sa; pwd=xxxx;" providerName="System.Data.SqlClient" />
</connectionStrings>
<connectionStrings configSource="MyConnectionString.config">MyConnectionString.config內容如下:
</connectionStrings>
<connectionStrings>再將MyConnectionString.config設為不從版本控管系統更新就可以啦。
<clear/>
<add name="DBConnStr" connectionString="Data Source=yourDB;Initial Catalog=yourDDName;User ID=sa; pwd=xxxx;" providerName="System.Data.SqlClient" />
</connectionStrings>
其實從.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就會被清空。
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抓資料啦
*安裝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抓資料啦
訂閱:
文章 (Atom)