2013-05-07

URL Design


現今的網路世界裡,URL代表的早就不單單僅是擔任一個Identifier(ID)的存在。 實際上,一個好的網站設計,在初期便需思考、規劃所謂的 URL Schema(URL架構)。 好的URL,domain name、path 皆是依據最佳實務做法得來, 下列這兩篇文章,告訴我們URL Design 時,該注意的事項:

URL as UI, Jakob Nielsen’s Alertbox: March 21, 1999
Cool URIs don't change, Tim Berners-Lee(Web 發明人): 1998

雖然年代久遠,但放至今日,仍是適用


閱讀全文...

2010-11-29

Java EE Custom Authentication - j_security_check / j_username / j_password


Java EE 提供了 JSP/Servlet此種 Web Programming Model

在認證/授權 (AA, Authentication & Authorization) 的部分,係透過 Deployment Descriptor 採用宣告式的安全設定(Declarative Security)

然而,在Java EE 的規範當中,儘規範了如何定義角色、如何限制相關的功能(URL)可被何種角色存取

而沒有規範到實際的認證、授權如何進行? 使用者的帳號、密碼、角色 是存在哪裡 ?

實際的使用者資料庫(User Registry)是使用 DB? LDAP? File? OS? 哪一種...

在做 JSP 的 form authentication 時, 我們知道 login 頁面要有一個 form action 為 j_seurity_check, 帳號/密碼欄位名為 j_username、j_password,但是 開發人員不必做任何事情,Java EE Container 即會幫你完成後續的認證/授權相關事宜

實際上,因為Java EE沒有規範Container要如何實作認證授權,所以 每個Container所用的 User Registry可能都不一樣。如,Apache Tomcat 預設就是透過 tomcat-users.xml 這個檔案來儲存使用者的帳號、密碼。

有時候,我們已經有既有的 User Registry 或是 想要自已客製化實作認證/授權時,這時候,就要用到Container 提供的 Custom Registry 機制,來加以客制化。同樣的,因為此段在Java EE沒有規範到,所以是依各Container 的不同,而有不同的作法 (亦即,使用 Custom Registry的Application, 在更換Container時,可能有可攜性的問題要處理,需依新的Container的規定,額外實做Custom Registry的功能)

以 Tomcat 為例,預設是使用 「UserDatabaseRealm」(註: 所謂的Realm, 即用在儲存使用者認證/授權資訊的儲存庫, 即 前述的 User Registry),我們可以在 $CATALINA_BASE/conf/server.xml 此檔案裡,看到相關的宣告:

<resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml">

<realm classname="org.apache.catalina.realm.UserDatabaseRealm" resourcename="UserDatabase">

在Tomcat中,若要自訂其它種User Registry,可以參考官方的說明文件,基本上,它提供了六種管道:

- JDBCRealm
- DataSourceRealm
- JNDIRealm
- UserDatabaseRealm
- MemoryRealm
- JAASRealm

在 WebSphere 中,則是在Container透過 Custom Registry的設定,提供了LDAP、OS 及 自訂三種方法
在使用者自訂Registry的部分,只要實作 com.ibm.websphere.security.UserRegistry 這個介面,並在Container的設定中使用自行實作的 UserRegistry Class 即可~



閱讀全文...

2010-11-22

如何自動回收 IIS 的 Application Pool


在IIS6 中,ASP.NET default 是跑在 worker process isolation mode

即,我們可以透過 Application Pool 的設定,讓不同的 ASP.NET 應用程式,跑在不同的 application pool中,由不同的 worker process 來處理,這樣的做法,可以避免將一個雞蛋放在同一個籠子裡,讓表現異常的應用程式,沒法影響到在其它Application Pool 中的程式

談到「異常」的應用程式...

有些人寫出來的APP就是莫明奇妙會掛點、Hang住、出問題~
積極的處理方式是做完整的測試、Code Review將問題查出並修正
消極的處理方式則是進行 IIS重啟(iisreset) 或 Application Pool Recycle(應用程式集區回收),看看有沒有辦法恢復正常

因使用IIS重啟是整個IIS都會被影響到,所以 可以就發生問題的Application Pool 進行回收 以降低影響範圍

Application Pool Recycle 這種被動的方式,除了可透過application pool 設定進行定期的回收外:


有時,我們可能想要透過一監測程式,在監測到有異常時,才執行application pool 回收
更甚者,我們可能在一台主機監測,而需要回收遠端主機的 application pool...

此時,主要可透過兩種方式來達成:

A. 透過 WMI 的方式, 我有 google 到下列的方式,但未試做:
http://gallery.technet.microsoft.com/ScriptCenter/en-us/22b10d93-e734-4fda-8ebe-2df30e54c64b
http://www.vistax64.com/powershell/103705-remote-application-pool-recycle-using-wmi-powershell.html
http://forums.iis.net/p/1033115/1421721.aspx

B. 透過 IIS 主機內建的 c:\windows\system32\iisapp.vbs 此 script,並搭配如 psexec 此類的遠端執行shell 指命的tool, 來達成:

iisapp.vbs 用法:

C:\>cscript c:\windows\system32\iisapp.vbs /a {ApplicationPoolName} /r

搭配 psexec 在 C# 程式中,可以用這種方式來達成遠端回收 application pool的效果:

Process process = new Process();
process.StartInfo.FileName = @"D:\PsTools\psexec.exe";
process.StartInfo.Arguments = @"\\{原端主機IP} -u {帳號} -p {密碼} cscript c:\windows\system32\iisapp.vbs /a {要回收的application pool name} /r";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
process.WaitForExit();

psexec 為 PsTools 內的一項utility,可在此下載


閱讀全文...

Axis2 與 .Net 1.1 Web Services 互通性問題


最近在實驗 Java Client to .Net Web Services 的互通性

Java 的部分,是使用 Apache 的 Axis 2

當我用 Axis 2 呼叫用 VS 2003 開發出來的 .Net 1.1 Web Services 時,總是會出現

Exception in thread "main" org.apache.axis2.AxisFault: Transport error: 404 Error: Not Found

百思不得其解,但使用 Axis 1 時,卻可正常呼叫

透過 WireShark 查知,Axis 2 在用 Http 傳送封包時,Transfer-Encoding 預設係使用 Http 1.1 規範裡新增的 Chunked Encoding 方式傳遞(HTTP Header -> Transfer-Encoding: chunked),而 Axis 1 則不使用 Chunked Encoding

因此,第一直覺,猜想是不是 IIS 的 metabase 設定中 ( C:\WINDOWS\system32\inetsrv\MetaBase.xml)AspEnableChunkedEncoding 這個設定值設成 FALSE 了? (Default 是 TRUE)

但 check 了一下,發現 IIS 有 enable Chunked Encoding

因此,就懷疑是不是 .Net Web Services 不直援 HTTP Chunked Encoding ?? 與用來開發的 .Net 版本有沒有關 ??

所以,就分別使用 VS 2003, 2005, 2008, 2010 製做 Web Services 來實驗

結果發現 不管 IIS 的 AspEnableChunkedEncoding 設定為何
VS 2003 開發出的 Web Services 是不能透過 Chunked Encoding 方式呼叫的
而 VS 2005 以上的版本開發出的 Web Services 則無此限制

因此,若使用 Axis 2 呼叫用 VS 2003 開發出的 Web Services 時,可以調整 Axis 2 呼叫時的參數,以正常呼叫 Web Services, 如下例(註: 我是使用 Axis2 預設的 "ADB Binding" -> XML to Object 的Binding方法啦):

Service1Stub stub = new Service1Stub(); stub._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.CHUNKED, Boolean.FALSE);
Service1Stub.HelloWorld hello = new Service1Stub.HelloWorld();
hello.setName("test");
System.out.println(stub.helloWorld(hello).getHelloWorldResult());

(註: 用 Eclipse 產生 Axis Web Services Client Project 時,目前預設是走 Axis 1, 若用 Axis2 附的 WSDL2Java 來產生 Web Services Stub 的話,則是走 Axis 2)

P.S. 這是我測試的結果啦~ 若大家有其它經驗 請再跟我分享 :)


閱讀全文...

2010-02-24

Metaphor: Pig & Chicken


在Scrum裡面有用到一個 pig & chicken 的隱喻 來說明 project 內的參與者

pig - 指的是犧牲、奉獻並對project最終成敗負責的相關角色

chicken - 指的是project的參與者,不必負最終成敗的相關角色

還有 rooster / gamecock 的角色(鬥雞),這些人 光放屁 提出的意見對project的產出有負效果

--

以下是這個metaphor 的緣由

A number of roles are defined in Scrum. All roles fall into two distinct groups—pigs and chickens—based on the nature of their involvement in the development process. These groups get their names from a joke about a pig and a chicken opening a restaurant:[5]

A pig and a chicken are walking down a road. The chicken looks at the pig and says, “Hey, why don’t we open a restaurant?” The pig looks back at the chicken and says, “Good idea, what do you want to call it?” The chicken thinks about it and says, “Why don’t we call it ‘Ham and Eggs’?” “I don’t think so,” says the pig, “I’d be committed, but you’d only be involved.”

So the “pigs” are committed to building software regularly and frequently, while everyone else is a “chicken”—interested in the project but really indifferent because if it fails they’re not the pigs—that is, they weren’t the ones that committed to doing it. The needs, desires, ideas and influences of the chicken roles are taken into account, but are not in any way allowed to affect, distort or get in the way of the actual Scrum project.

ref: wiki Scrum


閱讀全文...

2010-02-23

Notes: ASP.NET Diagnostics


1. Perfmon - windows 內建的 performance monitor

2. IIS Log + Log Parser -> 分析執行時間過長網頁
a. 加入 time-taken log 欄位
b. 安裝 Log Parser, 下 query 統計查詢:

logparser "select top 10 cs-uri-stem, time-taken from ex071105.log group by cs-uri-stem order by time-taken desc" -q:on

3. 安裝微軟 Debug Diagnostic Tool v1.1
a. 可透過 wizard 設定要監控的網址及效能門檻植,並在超過門檻時 進行相關process 的 memory dump, 並透過該工具內建的script 進行分析以產生報表 (可 check memory leak, application hang的問題)
b. 可自製 Debug Diagnostic Service 使用的 script ( C:\Program Files\DebugDiag\Scripts\DbgSvc.vbs) 來自定 trigger core dump 的時機,如 當 Performance Counter 中的 Request Execution Time 超過一定時限時,trigger core dump ),範例可見 C:\Program Files\DebugDiag\Samples\ControlScripts\PerfTriggers\ASPNETExecutionTime\DbgSvc.vbs

ref: http://blogs.msdn.com/debugdiag/

4. 透過 request based tracing

How to Trace Requests for a Specific URL or Set of URLs (IIS 6.0)
How to Create a Provider File for Request-Based Tracing (IIS 6.0)
How to Process and View Trace Log Files (IIS 6.0)



閱讀全文...

2010-01-05

XML element 與 attribute 的使用時機 (元素 v.s. 屬性)


基本上 XML 的標準裡面,並沒有說明何時該用 element, 何時該用 attribute
所以,會出現一種狀況,就是資料有多種表示方式,如:
<person id="123" name="REX"></person> 或
<person id="123"><name>REX</name></person>

下列是看到的兩篇相關文章,各別有建議判斷準則:

1. w3school 中的文章 http://www.w3schools.com/DTD/dtd_el_vs_attr.asp

總而言之,建議 data 放 element, metadata 放 attribute

2. IBM Developerworks 中的文章 http://www.ibm.com/developerworks/xml/library/x-eleatt.html

提到了四類原則:

1. 核心內容原則 (priciple of core content)
屬於主要內容 用來表達所欲傳達資訊時,放在 element
屬於附帶內容或是便於application處理實際的主要內容之用途時,放在 attribute
這個原則,基本上就是 w3school 文章內提到的 data/metadata 的原則

2. 結構化資訊原則 (priciple of structured information)
當資訊必需以結構化方式表示(如, parent/child 的關係) 或結構未來可能會擴充時,使用element
當資訊用最基本方式即可表達時(atomic token),使用 attribute

3. 可讀性原則 (principle of readability)
當資訊是提供給人時,使用element
當資訊是提供給系統以利處理時,使用attribute

4. 元素/屬性繫結原則 (principle of element/attribute binding)
當資訊會因其它attribute值改變 而必然隨之改變時,使用element
(即, 避免一個attribute的變動 連帶變動另一個attribute的狀況發生, 或可說為 避免 attribute 與 attribute 間有binding的關係)

上述的四個原則,在考量採 element or attribute 時,應一併納入進行總體考量

--
以上~ 希望對各位有幫助


閱讀全文...

2009-09-24

Firefox Plugin - Read It Later! (書籤管理、共享及同步工具)


Read It Later 是一個 firefox 上的 plug-in

對我而言,它幫我解決下列的問題

1. 因為很貪心,所以 常常在 firefox 上開了一堆 tab、有一堆待看的文章,但是這些文章都沒消化掉
若是就留在 tab 上面,每次 firefox 開啟時自動 reload 又很佔memory resources
若是把每個都 bookmark 起來一再關掉tab,這樣雖然節省資源 但操作起來又很費工 而且容易忘記閱讀、 bookmark也很容易髒掉

read it later 讓你在「留在 firefox tab」以及「bookmark」中取得一個平衡點
也就是,新增了一個 「待讀列表」的bookmark類別,並可透過該 plug-in 很容易的管理

2. 我有好多台電腦,散佈在家裡、公司,但是 待看的文章也是散佈在各台電腦的 browser tab 記憶內
透過 read-it later 的同步功能,只要在各台電腦上設定 read it later 伺服器上相同的帳號、密碼 就可以透過 read it later 伺服器來同步這些待讀的清單,且 這個帳號、密碼並不用申請 要產生多少 就有多少,是不是很方便呢 ?

3. read it later 與 google book mark 的比較
當然 透過 google book mark 也可以在不同的電腦裡面share同一份bookmark
不過,基於下述理由,我是兩套工具並用:
a. bookmark 是經過消化吸收後 才納入的,與未經消化及閱讀的項目是不同層級的資訊
b. read it later 的同步功能,會把各台電腦的 to-read list upload 到 server, 再download 到 client 變成 local list,在使用上 不用都透過 web、網路 來存取這些 list,相對的速度會較快
且在呈現上,也可依加入待讀列表的時間、網站的位置 等屬性來做排序呈現
雖只是簡單的小工能,但是 卻大大的給了我們方便呢 :)


閱讀全文...

Microsoft SQL Azure 連線方法(Cloud Computing, 雲端運算)


在前篇文章初淺的介紹了 SQL Azure(原名為 SQL Data Services) 及其申請方式

本篇文章,將介紹 SQL Azure 的連線方法

SQL Azure 提供 DB Service 方式,與 Amazon Web Services 的 Simple DB 類似,可以只用 Database 的 service (不過 存取的命令就不同了, Simple DB 是透過 REST or SOAP Interface, 而SQL Azure 則是透過 OLE DB/ODBC/ADO.NET 並透過 T-SQL 語法來存取)
而與 Google App Engine 的模式不同,Google App Engine 內建的 Database 不能單獨存取,只能透過佈署在 App Engine 上面的 Application 存取

既然可獨立存取,所以 想當然爾,運用 Microsoft Cloud Computing 開發 Web Application就會有兩種模式

A. Web Application 佈署在 Windows Azure, 並由 SQL Azure 提供 Database Services
B. Web Application 佈署在 自家環境, 並由 SQL Azure 提供 Database Services

然而,不管使用哪一種模式,Web Application 都是透過傳統 SQL Server 的 1433 port 來存取SQL Azure

所以囉,若是 Web Application or Developer 在 firewall 裡面,對外的連線被管制的話,那麼 使用上述 A 模式會是比較便於開發的

在前篇章提到,若是成功申請 SQL Azure Services後,會提供你三種連線方式的 Connection String



不管是哪一種,簡單來講 該 services 就是 listen 在
tcp:servername.ctp.database.windows.net:1433 這個位置

只要你用對連線的方法 (ODBC, ADO.NET, OLE DB) 且對外的網路通暢,應該就能順利存取

1. 初次使用,最常試的應該會用現有的 SQL Server 2008 SSMS 管理工具來連結,雖然 SQL Azure 與 SQL Server 並不完全相容,但是 使用 SSMS 還是可以順利連上

只要在連線至伺服器處(Connect to Server)
server name的地方輸入 [你的sql azure server name].ctp.database.windows.net
帳號則是要輸入 [你的sql azure帳號]@[你的sql azure server name]

連進去後,會出現一些錯誤訊息 (這是因為 有些功能 SQL Azure 與 SQL Server不相容),不要理它
進去後雖然 object explorer 不能用,不過 可以透過 新增查詢(new query) 的方式來進行 SQL command 的下達,這是沒問題的

step-by-step 的操作,可以參考 http://blogs.msdn.com/jimoneil/archive/2009/08/18/sql-azure-ctp-1.aspx

b. 可以使用 SQLCMD 這個 DOS 下的工具來做連線及管理
這個工具位於你 local 的 SQL Server 安裝位置的 \Tools\Binn 資料夾下

以下是簡單的 demo:

連線:

sqlcmd -S [servername].ctp.database.windows.net -U [username]@[servername] -d [database name]
密碼:

下命令:

1> -- 先建立 table, 注意 在 SQL Azure 上面的 table, 一定要有 clustered index
2> -- 這應該是因為 SQL Azure 會自動幫你做 table partitioning 以提供 scalability 能力的緣故
3> create table jobs
4> (
5> job_id smallint identity(1,1) primary key clustered,
6> job_desc varchar(50) not null
7> )
8> go
1> -- 塞一些簡單的資料
2> insert into jobs(job_desc) values('manager: this is job titled manager')
3> go

(1 個受影響的資料列)
-- Query
1> select * from jobs
2> go
job_id job_desc
------ --------------------------------------------------
1 manager: this is job titled manager

(1 個受影響的資料列)
1>

3. 透過 ODBC 的方式連結,使用 windows 的 ODBC 資料來源管理員
一樣,輸入 server 位置、帳號、密碼後 進行連線
只是,在進行連線測試時 要嘛就出現「網路錯誤」的message 又嘛就出現類似下例的錯誤,
所以 個人目前使用 ODBC 連線 是沒有成功過的

Microsoft SQL Server ODBC 驅動程式版本 03.86.3959

執行連線測試...

試圖連線
連線已建立
查證選項設定
[Microsoft][ODBC SQL Server Driver][SQL Server]Built-in function 'databasepropertyex' is not supported in this version of SQL Server.
與伺服器中斷連線

測試失敗!

4. 透過 ADO.NET 來連線,只要 connection string 的設定正確,是可以正常用 ADO.NET 來存取到的,但如果你是在公司內部開發,那麼要注意對外連線 1433 port 是否有被 firewall 阻檔

5. 透過 3rd party tool
可能是目前很多人遇到 SQL Azure 的連線問題,所以 有個公司開發了一個 Web 的小工具,透過它來連線到您的SQL Azure Server Instance

這篇文章是這個工具的使用介紹: http://www.cerebrata.com/Blog/post/Browser-based-SQL-Azure-Explorer.aspx

基本上,只要先連到 https://onlinedemo.cerebrata.com/SQLAzureClient/default.aspx
輸入:
database name:
username:
password:

後,就會透過該介面連到您的 SQL Azure Server
好處是,因為是 透過該網站中介連過去的,所以 就算你人在 firewall裡面,還是可以透過這個圖形化的工具來管理
壞處當然就是,因為是透過對方中介,所以 你的 帳號、密碼以及中間的使用過程 都能很輕易的被該中介站給攔劫使用

所以,若是要拿來做非測試的用途,還是不建議使用這樣的方式,資安的風險會較高


畫面如下:








* 相關文章: Microsoft SQL Azure 初步介紹及申請


閱讀全文...