Ajax with Classic ASP using jQuery(代替远程脚本)

Standard

My simple article on Ajax with Classic ASP is one of the most popular on this site. So I thought it’s about time I updated it to show how to use jQuery to Ajaxify a Classic ASP page.

First of all, why use jQuery when the previous article works? Well, jQuery is a library that is designed to help web developers work with Javascript in a much more streamlined way. Internally, it handles a lot of the nonsense that developers have to work with in terms of cross-browser incompatibilities and it’s syntax and chaining abilities generally results in far less code being written. A lot more information about jQuery can be found here along with the downloads.
The scenario I shall use will stay the same – an initial Select box containing the Company Names from the Northwind database, with the address and other details being retrieved asynchronously when a company is selected. These will be displayed in a specific area on the page. There is one difference – apart from the use of jQuery – in that the data relating to the company details will be generated as a JSON string, rather than a snippet of html. But let’s start with the page that the user will see:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
<%
strConn = "Data Source=127.0.0.1;Initial Catalog=NorthWind;Integrated Security=SSPI;"
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open strConn
Set rs = Conn.Execute("SELECT [CustomerID], [CompanyName] FROM [Customers]")
If Not rs.EOF Then
arrCustomer = rs.GetRows
rs.Close : Set rs = Nothing : Conn.Close : Set Conn = Nothing
%>
<form>
<select name="CustomerID" id="CustomerID">
<option> -- Select Customer -- </option>
<%
for i = 0 to Ubound(arrCustomer,2)
    Response.Write "<option value=""" & arrCustomer(0,i) & """>"
    Response.Write arrCustomer(1,i) & "</option>" & VbCrLf
next
%>

</select>

</form>
<%
Else
  rs.Close : Set rs = Nothing : Conn.Close : Set Conn = Nothing
  Response.Write "<p>Something bad went wrong</p>"
End If

%>
<div id="CustomerDetails"></div>
</body>
</html>

The VBScript connects to a local SQL Server Northwind database and obtains the ID and the Company Name for all the Customers. Assuming that they were retrieved succesfully, they are placed in an array through the RecordSet.GetRows() method. The array is iterated through, and elements are dynamically added to the page with the ID as the Value, and the CompanyName as the text that the user sees. In the original example, the had an onchange event handler hard-coded in it. This time it doesn’t. jQuery is all about “unobtrusive” Javascript and has a nice way to manage the registration of an event handler with an html element. But before we get to the Javascript, we’ll deal with the code that returns individual Customer Details. This will be a separate .asp file called FetchCustomers.asp:

This is a fairly standard piece of VBScript data access. It connects to the database and retrieves the company record associated with the CustomerID value passed in the QueryString. It uses parameters to protect against any chance of SQL Injection. If successfully retrieved, a JSON string is constructed from the record. All the doubling of quotes in the VBScript code makes it difficult to see exactly what the format of the output will be, so here’s how it would appear if the record was for GROSELLE-Restaurante:

{“j”:[{“__type”:”Customer”,”CompanyName”:”GROSELLA-Restaurante”,”Address”:”5ª Ave. Los Palos Grandes”,
“City”:”Caracas”,”Region”:”DF”,”PostalCode”:”1081″,”Country”:”Venezuela”,”Tel”:”(2) 283-2951″}]}

This is a Javascript object, which I have called j, which contains one property. The property is an array of nested Javascript objects. This array only contains one element or object, which has a number of properties with their values set. Now it’s time to look at the Javascript that will be responsible for calling the page, passing the querystring values and managing the JSON that’s returned in the Response:

$(function() {
   $('#CustomerID').change(getCustomer);
});

function getCustomer() {
$.ajax({
type: "GET",
url: "FetchCustomer.asp",
data: "CustomerID=" + $('#CustomerID').val(),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(response) {
var customer = (typeof response.j) == 'string' ? eval('(' + response.j + ')') : response.j;
$('#CustomerDetails').empty();
$('#CustomerDetails').append('

' + customer[0].CompanyName + '
' +
customer[0].Address + '
' +
customer[0].City + '
' +
customer[0].Region + '
' +
customer[0].PostalCode + '
' +
customer[0].Country + '
' +
'Tel: ' + customer[0].Tel + '

');
}
});
}

After linking to the minimised jQuery file that’s available from Google Code, we get to the script that it specific to the page. The first instruction finds the element with the id of CusomterID (which is the , and adds an event handler to the onchange event. In this case, the getCustomer() function is called. Then the getCustomer() function is defined. Using jQuery’s built-in AJAX functionality, a GET request is prepared which calls the FetchCustomer.asp page. The selected value from the list is passed in as a QueryString parameter. If the call is successful, the Response is first validated then eval() is used to deserialise the JSON string back into Javascript objects.
From there, the div with the id “CustomerDetails” is cleared of any existing content, and the properties of the customer object are written to the div instead.
Whether you return JSON or formatted html is up to you. JSON carries a significantly smaller overhead in terms of payload over the network, but requires more code to manage on the client. Sometimes you may have no choice, for example if you are usig an external web service that returns JSON. In this case, as you have no control over the returned content, you should not use eval() to deserialise the JSON string. If you dig around among the jQuery plugins, you will find some that have been created purely to validate and deserialise JSON of unknown origin safely.

易筋洗髓經

Standard
    易筋洗髓經‧又訣(三等)

〔原文〕
入手起功,漫用呼吸。未納菁英,先吐濁積。一吐一納,生新去余。行至坐身,乃用呼吸。學成之後,清濁分析。初勢既畢,呼吸如式。恐有濁礙,酌量追逼。一圖數圖,多寡不拘。俟濁盡淨,呼吸隨及。純清無濁,功起即起。
〔譯文〕
凡是練初步的立身動功時,不要隨便運用呼吸法。在這些功法中,雖名為呼吸,其實都是配合呼吸的吐納法。前面「呼吸論」講過,要「先吐納,後呼吸」。因為初步練功的人,身內有濁氣阻礙,菁英之氣是無法進入的。故在未納入菁英之氣前,先吐積聚的濁氣,然後再納清新之氣。這樣一吐一納,體內清新之氣不斷生長,而多餘的濁氣則不斷排除。當練功到坐功的階段,才可以運用呼吸法。按照這個程序漸進修煉,到進行坐功時,體內運用呼吸法,清升濁降就較明顯。

當然,立身的動功和坐身的靜功是相間為用的。一般說,練完動功再練靜功,就可用上述呼吸方法。不過,初步練動功,一個勢子下來,濁氣不一定能排完。故而在靜功之初,也還可以加適當吐納法,把濁氣排盡。選擇立身動功,可選一個連續做,也可以選擇幾個一個接一個做,總之要等濁氣排盡,才可以行靜功呼吸法。到體內沒有濁氣皆是純清之氣時,一入靜功,內氣的陰陽升降即刻就能出現。

按:要達到「純清無濁,功起即起」的內氣陰陽升降,是要經過一定階段的動功靜功修煉過程。而這個過程因人而宜,沒有準確的時間界定。一般說,身體素質好,領悟能力強,能平心靜氣,消除雜念,就來得快,反之則來得慢。再者,內氣升降循環是真實現象,而有些氣功教人以意運氣,常不免出現有意而無氣的假循環空轉周天,此須學者認真體悟,切莫誤入歧途。

    易筋洗髓經‧呼吸訣(次第)

〔原文〕
一呼水生,一吸火聚。再吸再呼,火騰水起。三度交關,坎離相濟。吸七呼七,週而復始。二七十四,重複不已。三七二一,三復功畢。九九八一,純陽至極。運行三百,六十五氣。往來無窮,周天之紀。先吸後呼,達摩真諦。圖曰呼吸,俗語如此。導引內功,呼吸第一。無多無少,不徐不疾。氣不可湊,志不可移。亦不可餒,無過不及。出入不聞,定氣調息。

〔譯文〕
呼吸法的妙用是,呼為生水,吸為聚火。(按:水為精,火為神。生水即生精,聚火即聚神。)呼吸的連續運用,在於精要活,神要靈,這叫做火騰水起。在功中,呼吸法一般要經過三次,方能達到坎離相濟,即精神相濟。每一次中,意識著重在吸上七次,然後著重在呼上七次(按:所謂著重,只是觀察而已,非為著意或督促呼吸。)這樣,每一次就有七呼七吸共十四次。說是次數,其實並沒有間隔,是不斷重複。這樣做三次,就有三七二十一對陰陽呼吸。做夠這三次的反覆呼吸,方可收功。日日堅持行功,會使身中濁陰漸消,純陽漸長。當濁陰消盡的時候,就是純陽圓滿至極的時候。陽數最大者為九,純陽至極乃是最大陽數相乘所致,故稱九九八十一度數。一年有三百六五天,天天行功,一日合一日之身內周天,一年合一年自然周天,所以這周天之紀就是往來無窮。周天能往來無窮,不就能生生不息嗎?

呼吸法是先用吸後用呼,這是達摩祖師呼吸法的真諦,不能錯用。雖然圖徑上說是呼吸,它的內含是調節陰陽,升清降濁,因為人們說呼吸容易懂,就用了呼吸這個說法。在引導內功中,調節呼吸是第一重要的。(按:這裡強調呼吸法在導引內功中使用,十分得當,此是為一般初學者所設之法。若內藥已產,一入功便可心腎相交,便無需導引,無需再用呼吸法也。)呼吸法關鍵在順其自然,一呼一吸,既不能多,也不能少,既不要慢,也不要快。人體本有呼吸的自然調控系統,只能順應它,而不能為了湊夠呼吸法規定的次數而加速。功夫的完成不是靠湊數,而是靠堅定不移的意志。

呼吸法固然是順其自然,然而又不能撒手不管,如果撒手不管,那還要呼吸法做什麼,那不過跟常人不練功的呼吸是一回身。那種做法只能是餒氣。順其自然就是既不能過多,也不能達不到目標。

呼吸法要循序漸進,先是外呼吸,比較短,比較粗,漸漸轉入內呼吸,就漸漸長、漸漸細。最後,外不入,內不出,鼻孔無絲毫呼吸的感覺,這才達到了定氣調息的目標境界。

按:呼吸之出入不聞狀態,就是胎呼吸狀態。胎呼吸狀態境界有三大遞進層次:第一層次,澎湃鼓蕩;第二層次,細蘊潤澤;第三層次,空明通徹。

    易筋洗髓經‧呼吸歌(總訣)

〔原文〕
一吸通關,一呼灌頂,一屈一伸,一濁一清。雷鳴地震,清濁攸分,一升一降,一陽一陰。上下順逆,陰陽交生,河車搬動,轆轤時行。三百六五,運煉丹成。

〔譯文〕
吸,可以使丹田氣沿督脈上升而通關;呼,則可使濁氣下降,腦部空虛,從而為督脈氣上升灌頂創造了條件。吸為屈縮,呼為伸放,呼吸一直在做清升濁降的工作。呼吸可使內氣鼓蕩起來,就像大自然發生的風雷,能把大地催震動搖,這種對身體的催震動搖,可以使體內清濁不分、陰陽不調的狀態改變分佈結構,恢復到陰陽清濁各而有序的狀態中去。呼吸的作用是不斷的一升一降、一陰一陽,上為逆,下為順,這種順逆的方法會使陰陽交生。丹道的呼吸法,就稱為河車搬運法。周旋無間,就像井上轉動的轆轤。自然中,地球繞太陽轉一週是三百六五天一個週期,它會年復一年地這樣周轉,體內元氣也會沿任督二脈做這種三百六五天似的週期運轉。周天運行正常,叫做周天通,這種周天通的不斷運煉,可以達到丹成境界。

按:「三百六五」之說,也可視為丹功在一定階段層次,再經過一年三百六五天傚法自然的修煉,完成丹道的一種層次效應。

    易筋洗髓經‧呼吸論

〔原文〕

    呼吸與吐納有異,呼吸是吸下呼上,吐納是吐出納入。吐納可分清濁而不可合陰陽,呼吸可合陰陽並可分清濁。易筋洗髓工夫吐納少,呼吸多。先吐納,後呼吸。呼吸有順有逆,順以運一身清氣,逆以合兩儀清氣。用法次第規模,譯各圖說及歌訣中。

〔譯文〕
呼吸法與吐納法是有區別的,呼吸是吸自於下呼自上,吐納是吐為出納為入。吐納對於氣來說可以分出清濁,如納入的為清氣,吐出的為濁氣,但這一吐一納不能合於陰陽。而呼吸可以合於陰陽分出清濁。如吸為升,升為升清氣;呼為降,降為降濁氣。易筋洗髓的功夫中,吐納少,因為它不合陰陽,呼吸多,重在調和陰陽。雖然吐納不合陰陽,然而對入門也有作用,故而把吐納法用在前面,把呼吸法放在後面。呼吸法有順呼吸和逆呼吸,順呼吸可以運一身之清氣,逆呼吸則合陰陽兩儀的清氣。關於呼吸法的先後次第用法,以及運用的規模,詳見各有關圖說及歌訣。

    易筋洗髓經 古本詮釋

夫人之一身,內而五臟六腑,外而四肢百骸,內而精氣神,外而筋骨肉,共成其一身也。如臟腑之外,筋骨主之。筋骨之外,肌肉主之。肌肉之內,血脈主之。週身上下動搖活潑者,此又主之於氣。是故習練之功,全在易筋培養氣血為要。欲求易筋之道,需求新陳代謝,欲求新陳代謝,在於汗液,汗液不出,肌肉筋骨氣血,都不起變化。是故要出汗,初行功始見汗,是為微汗,微汗後當加功倍練,要出大汗,是為大汗,大汗後有汗,是為微汗,經過三層出汗水,全身氣血大變矣。初期三年為小期,十年為大期,小期能易筋肉,大期能易氣血。待到二期三期,定達上乘矣。練到骨節通靈處,週身龍虎任意行。「龍者為氣,虎者為血。氣使血行,週身貫通,所謂渾元一氣。」

〔原文〕

通關一法,非駕陰陽二竅不行。陰陽二竅,乃水之河車,火之輪車,一身氣道之樞紐。陰竅起,則後三關可直衝上頂;陽竅駕,則前三關可直貫注底。翻陰竅、翻陽竅時,氣又可翻下逆上。分而言之,陰竅起於根,舉於足。陽竅起於肩,駕於手。合而言之,陽陰竅皆起於足,應於手。陰竅起則任督通,陽竅駕則鵲橋、尾閭應。陰陽竅上下交應,則吸可到底,呼可至巔。上下順逆,錯綜變幻,如意運行,轆轤轉而玉環活,氣通關竅無阻滯,亦無障蔽。故古人云:掌合指立,陰陽竅通。

〔譯文〕

疏通週身關竅的方法,非憑借陰陽二竅筋脈的運行不可。以內丹必用逆行之法而言,陰陽二竅,就如同農夫抽水倒灌的河車,和戰場上將火引燃於對方的載火輪車,它們確是一身氣道疏通的樞紐、關鍵。陰竅逆用是由下往上升,用陰中之陽,主動,所以陰竅脈動則可通督脈上尾閭、夾脊、玉枕三關(按:亦有言尾閭、命門、夾背為三關者。此是人身難通之竅,故稱關。總之,何處不通,難通皆為關)而直達頭頂;陽竅逆用是由上往下降,用陽中之陰,主靜,所以陽竅脈動可融貫前三關(按:《黃庭經》指鼻、目、心。也可指上、中、下三丹田。總是泛指,不必拘泥。因人之關竅通與不通,也有大致相同之處,也有不同之處。何處不通,何處則為關也)而直通貫於底。陰陽竅的運行,使內氣在體內翻下逆上周流循環不斷。若分別言陰陽竅的各自主要作用,陰竅起於腳底,舉於腿;陽竅起於肩,駕於手。若合起來言它們的作用,陰陽竅都起於腳,應於手。陰竅脈的勃動可使任督二脈通,陽竅脈的行駛則使任督升降交接處的鵲橋、尾閭應合。陰陽竅上下交相呼應運行,內氣由吸而上行,可從最底處發起;內氣由呼而下行,可從最高處下降。陰陽竅的發動是上下順逆,錯綜變換,達到真息時便如意運行。這種狀態就像轆轤的轉動不可分別上下順逆,總是靈活不停,故而體內周天這個玉環就是活的,氣道上任何關竅都無阻滯,也無故障或蒙蔽之處。所以古人說:掌合指立,陰陽竅便通。

按:此最後一句,乃是指和尚打坐練功的姿態。和尚打坐,雙掌相合,立於胸前,此乃用以來接通陰陽二竅。不過,此句又是借這一姿勢來說明陰陽竅相接的作用,不可認為僅用此一姿勢便得妙用。內丹之法最講辯證活用,一拘泥便致誤,可不慎乎!又,此篇言運功,乃言內氣非駕陰陽二竅的狀態,非指具體的方法。

    易筋經說

《易筋經》練其功法,可使人「臂腕指掌,迥異尋常。以意努之,硬如鐵石。併其指可貫牛腹,側其掌可斷牛項」。這種效能,非一般之勇力,而是靠氣。故非外壯,而是內壯;非一般之勇力,而名為神勇。〈內壯篇〉說:

內與外對,壯與衰對。壯與衰較,壯可久也。內與外較,外勿略也。內壯言堅,外壯言勇,堅而能勇,是真勇也。……凡練內壯,其則有三:一曰守中道。守中者,專於積氣也。……守之之法,在乎含其眼光、凝其耳韻、勻其鼻息、緘其口氣、逸其身勞、鎖其意馳、四肢不動、一念冥心。……守在於是,則一身之精氣與神俱注於是。……二曰勿他馳想。……三曰持其充周。……氣既積矣,精神血脈悉皆附之。守之不馳,揉之且久,氣唯中蘊而不旁溢,氣積而力自積,氣充而力自周。

內壯,是靠守中積氣,以達到積力之效的。〈總論〉更申言易道與陰陽二氣之運,把「易筋」之「易」推原其義到《易經》上去:

其所言易筋者,易之為言大矣哉!易乃陰陽之道也,易即變化之易也。易之變化,雖存乎陰陽,而陰陽之變化,實有存乎人。……人勿為陰陽所羅,以血氣之軀,而易為金石之體。

《易筋經》講內功、論內壯、說積氣,所要達到的,仍是剛的效果。在具體功法方面,它也不純用導引。而是以藥洗、服食、揉打來配合意守養氣。

所謂藥洗,是用湯藥來洗身體,幫助筋骨堅實。服藥與揉打則一內一外,所謂「外資於揉,內資於藥」。揉,即按摩之法,以揉按心臍之間為主。心臍間的膜,不容易揉按到,則用杵搗槌打。「般剌密諦」對此亦特加按語解說云:

易筋以練膜為先,練膜以煉氣為主。然此膜人多不識,不可為脂膜之膜,乃筋膜之膜也。脂膜,腔空中物也。筋膜,骨外物也。筋則聯絡肢骸,膜則包貼骸骨。筋與膜較,膜軟於筋。肉與膜較,膜勁於肉。膜居肉之內,骨之外,包骨襯肉之物也。其狀若此。行此功者,必使氣串於膜間,護其骨、壯其筋、合為一體,乃曰全功。這才是《易筋經》獨特的功法與見解。

也許可以說槌打為天竺按摩導引法之特色,而《易筋經》就是發展了這個特色。按摩槌打,是揉按、杵搗、槌打,漸次加重的。木杵、木槌之外,尚要輔以石袋、石杵。木杵、木槌,用於有肉處。骨縫間,則用石袋、石杵。它與道家運氣法不同之處,在於道家主要靠存想,以意運氣,讓氣流走於任督二脈;它不是如此,而是在揉打時,意注於揉打之處。所以揉打至何處,意與氣也就到了那個地方。先揉於前身心下臍上,「功至二百日,前胸氣滿,任脈充盈;則宜運入脊後,以充督脈」。共行功十二個月。

按月行功,是宋代發展出來的導引法,相傳出於陳摶。《易筋經》沿用了這種按月行功的觀念,所以內中有〈初月行功法〉、〈二月行功法〉、〈三月行功法〉、〈四月行功法〉、〈五六七八月行功法〉、〈九十十一十二月行功法〉六篇。

經此十二月行功並服藥洗藥之後,神功已成,氣滿於內,但還有兩事需要補充:

第一件事,揉打積氣,只在前胸後臂,故氣僅充於身體上,還不能把氣運到手上,所以接著要練手:一是仍用揉打之法,用石袋從肩頭往下打,直至小指尖再用手搓揉;二是用藥洗;三是藥洗後加以鍛練。先努氣生力,然後用黑豆綠豆拌在斗中,用手去插,以磨礪其筋骨皮膚。

第二件事,是要學習賈力運力的姿勢和方法。全身積氣,殆如水庫蓄水,水既蓄滿,便須學怎麼行水用水,此所以又有〈賈力運力勢法〉篇。此類勢法,其實就是八段錦、十二段錦之類導引動功,也有些版本稱之為「易筋經十二勢」:韋陀獻杵三勢、摘星換斗勢、倒拽九牛勢、出爪亮翅勢、九鬼拔馬刀勢、三盤落地勢、青龍探爪勢、餓虎撲食勢、打躬勢、掉尾勢等。這些勢,其實均非攻擊或禦守的架勢及招式,而是導引的姿勢。

– 摘自 佛光大學校長 龔鵬程 論文《達摩《易筋經》論考》

本人注:易筋經習煉五大步驟 – 揉、戳、鎚打、布氣(炁)、竄氣(炁)。

SQL Server 2000 实现Row Number

Standard

思路很简单,使用一列没有重复值的列作为参考。排序后计算在此行前的行数加一就是该行号:

比如:

select (select count(1)+1 as rownum from employees t2 where t2.fullname<t1.fullname) rownum ,* from employees t1 order by t1.fullname

C#实现Runas

Standard

某些场合执行某个程序需要比当前操作系统登录用户更高的权限。微软提供的Runas完成这一需求,但是runas不能自动传入密码,这在自动处理时很不方便。因此考虑自己编写一个工具。
此时可以通过调用CreateProcessWithLogonW API实现。