發表文章

目前顯示的是有「網頁技術」標籤的文章

在 IIS 上執行 ASP.NET Core

圖片
雖然,ASP.NET Core 的程式可以單獨執行(使用內建 kestrel 伺服器),但是 kestrel 畢竟是輕量化服務器,操作與設定不熟悉的人使用起來就會頗困難。 而且,在有規模公司裡面伺服器 IIS 管理人可能又跟寫這程式碼的人不是同一個人,因此大原則上,程式設計就歸程式設計,伺服器管理就歸伺服器管理是比較標準的做法。 那麼 IIS 上如何掛上 ASP.NET Core 的應用呢? 建議使用 IIS 8.0 以上的版本(官方建議啦),原則上就是 Server 2008 以上作業系統。 一、 下載執行環境套件 Runtime : Microsoft Visual C++ 2015 Redistributable (非必要,除非該機器沒有裝過,下載要注意X86或X64版本) .NET Core Runtime (注意你的SDK版本) 在下載 .NET Core Runtime 時,一般都是下載最新版即可,如下圖: 但是如果你的SDK(開發)版本差異太大,例如你使用 SDK 2.0,而 Runtime 使用 2.1 ,則可能發生程式無法執行的錯誤,建議更新 SDK 後再重新編譯程式放到伺服器上,不然就是安裝降版的 Runtime ,若要安裝其它版本 Runtime,請點選下面聯結,尋找適當版本的 Runtime: 選擇其他版本,例如 2.0 版 下載該版本的 Runtime 二、 在伺服器上,將 Microsoft Visual C++ 2015 Redistributable 與 .NET Core Runtime 安裝好。 三、 建立程式放置資料夾與設定權限,如果直接使用 IIS 的內定資料夾 C:\inetpub 者,則省略此步驟。我再這個案例是建立在 D:\inetpub\api ,所以必須增加資料夾使用權限給 IIS 使用。 四、 在IIS管理員裡面新增應用程式集區         名稱雖然可以自己訂,但要易於識別所以取名為 .NET Core,然後 .NET CLR 版本要選『沒有Managed程式碼』(Unmanaged Code)。 五之一、 新增站台方式(如果要繼續使用80port做為http的服務,請確認原本IIS的站台 Default W

AngularJS 使用 $routeProvider 時輸出路徑 "/" 變更成 "%2F" 解決方式

圖片
按照 AngularJS 官方網站 實做了 Wire up a Backend 的範例發現了一些問題,主要是在 routeProvider 變更瀏覽器 URL時,路徑上的 "/" 被改成了 "!/" 與指定路徑 "/new" 被換成 "%2Fnew",導製後續動作都無法解析問題: 按照它的範例執行一開始路徑就怪怪的,當按下『Add』時,沒有切換到 detail.html 的畫面,原因在於路徑出現了非預期的字元。 這個原因出在 routeProvider 回傳時把一些特殊字元進行轉換造成的問題,因此必須修改它的 config 對 routeProvider 處理程式碼片段: (原程式碼) .config(function($routeProvider) {   var resolveProjects = {     projects: function (Projects) {       return Projects.fetch();     }   };   $routeProvider     .when('/', {       controller:'ProjectListController as projectList',       templateUrl:'list.html',       resolve: resolveProjects     })     .when('/edit/:projectId', {       controller:'EditProjectController as editProject',       templateUrl:'detail.html',       resolve: resolveProjects     })     .when('/new', {       controller:'NewProjectController as editProject',       templateUrl:'detail.

CFLOCK多人共用資源鎖定/獨占

WEB是個多人共用的執行環境。 好處是多人多工執行緒,不會互相干擾。 缺點是同時搶資源時處理上就很傷腦筋。 什麼叫『搶資源』,白話說搶票啦,簡單說就是希望讓多人執行可以排隊做"某件事"。 假如資料庫裡面有一個表Tickets,裡面裡面有500筆資料,每一筆都是獨立票號。 當客人要來取票時,系統會找出Tickets裡面沒有被使用的票號發給客人。 所以程式碼會寫成: <cfquery name="check1" datasource="SQLDB">  Select top 1 tick_no  From Tickets  Where tick_used = 'N' </cfquery> <cfif check1.recordcount GT 0>  <cfset newTicket = check1.tick_no>   <cfquery name="update1" datasource="SQLDB">   Update Tickets   Set tick_used = 'Y' , cust_id = '#LoginCust#'   Where Tick_no = '#newTicket#'  </cfquery> </cfif> <cftransaction action="commit" /> <cfif isdefined("newTicket")>  <cfoutput>You Got Tick No : #newTicket#</cfoutput> <cfelse>  <cfoutput>No More Tickets can get !</cfoutput> </cfif> 邏輯上看似沒有問題,但是請別忘記WEB是多人操作的, 結果就發生同時有2個人很湊巧的同一秒鐘按下取票, 因此上面程式碼就被兩個執行緒同時

Coldfusion直接讀取/產生Excel檔案 (使用POI元件)

圖片
最近在 Ben Nadel 先生的網站發現他有個Component計畫,他利用 apache.org 的 poi project 來製作一個可以讀寫 EXCEL 檔案的 Component,操作 EXCEL 檔真的蠻方便的。而且 poi project 以處理 office文件為目標,算是很棒的專案。 正在想如何直接透過 Coldfusion 網頁處理客戶的 Excel 檔案時,這真是一大幫助啊! 請先參考相關連結: apache.org 的 poi 計畫 、  apache poi jar下載 Ben Nadel 的 POIUtility 文章出處 、 Ben Nadel 的 POIUtility 專案 我的環境 本人使用 Railo 3.3.4.003 執行 Coldfusion ,所以核心是 Apache 比較沒有問題,至於Adobe的Coldfusion可能要再研究一下 Ben Nadel 的專案了。 1、下載  JAR 檔案 注意下載的 poi jar 版本,由於我使用的 Railo 3.3.4.003版本無法搭配最新的 poi,所以測試到使用  poi-3.0-FINAL.jar 是沒有問題的,太新的反而不能用。 把下載的 jar 放在 Railo Server 路徑下的 \lib\ext 裡面,重新啟動服務即完成掛載。 2、下載 Ben Nedal 的 POIUtility.cfc 假設網頁運行路徑在 \webroot\ 你可接放在 \webroot\ 而我的測試是放在 \webroot\COM 裡面 (我個人習慣Component都是放在COM路徑下) 3-1、測試一:讀取全部 首先,建立一個 Excel 檔案 "測試活頁簿.xls",裡面有3個Sheet 3-1.1、寫一段讀取用的 script: <!--- 建立並初始化POI物件 ---> <cfset POIobj = CreateObject("component","COM.POIUtility").Init() > <!--- 取得我要測試的Excel檔案路徑. ---> <cfset myFile

Coldfusion 來自不同資料庫的join作法

Coldfusion server 提供了許多資料庫的Native Connection方式,或是Jconnect的方式,在我認為效率總是比ODBC好多了,所以我寫的網頁常常遊走在不同資料庫上,我最常用的資料庫不外乎Sybase ASE 與 MS SQL (或是更早的MSDE)這兩種資料庫,所以需要用到兩種BD來源的Table需要Join的問題: 這技術需要用到 inMemory Query 的作法就可以達成 首先從各資料庫先取出需要 join 的資料(可以盡量使用篩選過的,減少記憶體用量) <cfquery name="emp" datasource="SYB_CONN"> SELECT empl_no,empl_name,title_no FROM rmployee WHERE depart_no = 'sales' </cfquery> <cftransaction action="commit" /> <cfquery name="ttl" datasource="MSSQL_CONN"> SELECT title_no,title_name FROM outsider_title WHERE title_kind = 'S' </cfquery> <cftransaction action="commit" /> Join 兩邊的資料源 <cfquery name="emptlo" dbtype="query"> SELECT a.empl_name,b.title_name FROM emp a, ttl b WHERE a.title_no = b.title_no </cfquery> 輸出測試 <cfloop query="emptlo"> <cfoutput>#empl_name# , #title_name# <br /></cfou

coldfusion send email (1): only text or html

Coldfusion 發送簡易電子郵件的方法: 使用 cfmail 標籤指令 純文字模式 <cfmail   to="recipient1@mail.domain.com,recipient2@mail.domain.com"   from="sender@mail.mydomain.com"   subject="顧客意見反映"   server="mail.mydomain.com"   username="MySmtpAccount"   password="MyPassword"   type=" text "> 本訊息由網頁『顧客意見』發出,請勿回覆此信件。#chr(13)##chr(10)# 發訊時間 :#DateFormat(NOW() , 'yyyy/mm/dd')# #TimeFormat(NOW() , 'HH:mm:ss')# 發訊人姓名:#SenderName##chr(13)##chr(10)# 發訊人電話:#SenderTEL##chr(13)##chr(10)# 發訊人郵件:#SenderMail##chr(13)##chr(10)# = = = = = = = = = = = = = = = = = = = = #MailBodyText# </cfmail> HTML模式 <cfmail   to="recipient1@mail.domain.com,recipient2@mail.domain.com"   from="sender@mail.mydomain.com"   subject="顧客意見反映"   server="mail.mydomain.com"   username="MySmtpAccount"   password="MyPassword"   type=" html "> <div styl

Coldfusion 多個 query 合併

簡單的用法: <cfquery name="q1" datasource="store1" blockFactor="100">  select * from sales_lists where sale_date = '2013/05/02' </cfquery> <cfquery name="q2" datasource="store2" blockFactor="100">  select * from sales_lists where sale_date = '2013/05/02' </cfquery> <cfquery name="datesales" dbtype="query">  select * from q1  union  select * from q2  order by sale_employee </cfquery> 把多個 DB 查詢用 in memory 查詢 union 起來。 那如果是 LOOP 迴圈連續查詢的 query 呢? 那就讓 query name 不一樣就可以了,然後再用LOOP把query union 起來 <cfloop from="1" to="#ListLen(employeelist)#" index="i">  <cfquery name="qresult#i#" datasource="db1">   select * from employee where employee_no = '#ListGetAt(i)#'  </cfquery> </cfloop> <cfquery name="combine" dbtype="query">   <cfloop fro

Coldfusion Query 的 Commit

最近由coldfusion 操作資料庫查詢時發生的一件事情 在sybase資料庫 做 Replication 的兩部資料庫: A-DB 與 B-DB, 本來,Web-Base的作業都連線在 B-DB 上,App-Base都連在 A-DB上 後來因為B-DB資料區有異常,就把 coldfusion 連線全部連到 A-DB , 接下來,慘事發生了...... A-DB 三不五時發生嚴重 lock ,導致所有作業都停擺,細查原因,發現: 1、全部 lock 都是來自 coldfusion 的 connection ,而且都是 jdbc 驅動連線 2、如果 coldfusion 使用 Sybase 驅動連線,不會發生此現象 3、ColdFusion 不管何種連線到 B-DB 都不太會發生 lock 過久問題 4、Web-Base 的查詢幾乎都是大範圍資料查詢 所以,查了一下設定發現,B-DB 的 lock 範圍強制設定在 row lock等級, Read isolation 屬 uncommit ,這樣的設定應該是為了提高網頁端大量查詢的效率 而 A-DB 屬於內部作業使用有需要極高的正確性,因此屬於page lock等級, Read isolation 屬 commit,因此 App-Base 開發時只要使用到 insert/update 一律要 commit/rollback才能繼續。 以上設定應該是因應公司營業型態調整的 所以,如果在不知道細節的情況下, Coldfusion 的 <cfquery> 指令下完之後 ,無論是Select / Insert / Update 都記得要下一行: <cftransaction action="commit" /> 或是 <cftransaction action="rollback" /> 才不至於出現過度lock狀況,當然這也是比較正統的撰寫習慣 至於 sybase driver connector 與 jdbc driver connector為什麼有不一樣的行為, 應該是差在 select 這個指令,sybase driver 對 select 指令會自動 commit 掉, 但是jdbc d

coldfusion query buildin functions

Method Signiture Return Type Method Signiture Description void queryName.first() jump to the first row of a query void queryName.last() jump to the last row of a query boolean queryName.isFirst() true if we are positioned at the first row boolean queryName.isLast() true if we are positioned at the first row boolean queryName.next() go to the next row, return true if there is a next row boolean queryName.previous() go to the previous row, return true if there is a previous row int queryName.findColumn(String name) get the internal zero based Column ID by name void sort(int columnID, boolean ascending) sort by a column, use findColumn to get the column id String getColumnTypeName(int columnID) gets the data type of a column, this one didn't work properly when I tested it, it would return NUMERIC for a field that was a varchar. There is a method called guessColumnType that was probably used to determine it, it guessed wrong. 資料參考來源

sort query in coldfusion

當我們需要用 coldfusion 查詢資料庫時會使用 cfquery 執行SQL指令 <cfquery name="allEmployee" datasource="myDB">  Select employee_no,employee_name,employee.duty  From employee  Where employee_retired = 'N' </cfquery> 當然,資料排序可以直接下 SQL 的 ORDER BY 來完成 但是,如果有特殊需求需要在 coldfusion 內(in memory)才排序的話 有兩種方式可以完成: 1、使用 cfquery 對已經存在的 query 再處理 <cfquery name="sortedEmployee" dbtype="query">  Select *  From allEmployee  Order By employee_name ASC </cfquery> 2、使用query專用指令 <cfset allEmployee.sort(allEmployee.findColumn("employee_name"),true)> 對於第2種用法,可能要非常小心 因為,adobe的 coldfusion 服務器與 Railo 的服務器有不同的使用法 (注意,我測試的adobe coldfusion 是 MX7,可能新的版本有變) 指令 Adobe Coldfusion MX7 Railo QueryName.sort(QueryName.findColumn("ColumnName"),true) 可 不可 QueryName.sort(2,true) 可 不可 QueryName.sort("ColumnName",true) 不可 可 QueryName.sort("2",true) 不可 不可

Operating the HTML table like Powerbuilder's DataWindow chapter 0

圖片
發想來自我接觸最久的程式語言 Powerbuilder,說真的跳通到其他語言時,會非常懷念它的DataWindow 物件。原因不外乎,它讓資料操作變得很簡單,甚至讓程式設計師變懶了。 但如果開始使用其他語言時,例如現在幾乎都要用網頁來工作,就發現網頁要操作資料真的不是那麼容易,尤其使用AJAX技術時,針對頁面的操作,每個工程師寫出來的方式大相逕庭,閱讀理解就變得重重。 有鑑於此,只好將自己理解datawidnow的部份,將其方法(method)實現到javascript裡面來。 盡力讓畫面表單操作變得簡單一些。 這樣的好處是,使用相同套件,程式碼閱讀起來清爽也易懂,比較容易除錯。 下面簡單介紹一下操作原理,與表格架構,DataWindow會用DW簡稱: 1、原則上一個類DW的架構如下: <div id="objid">  <table width="100">   <tr>    <th width="48" cn="field1">欄1標題</th>    <th width="18" cn="field2">欄2標題</th>    <th width="28" cn="field3">欄3標題</th>   </tr>  <table> </div> 這是一個標準table外面包著一個div層,而這個div層的id就是這個datawindow的名稱(datawindow name),一個DW結構(div)裡面只能有一個table存在。 這個結構很重要,因為接下來所有的操作都會參考這個結構的定義。 2、TH屬性的定義: cn :欄位名稱,必要的,英數字,其值就是代表了這個欄位的column name。 edit :編輯模式,選擇性,此屬性表示生成的資料可以編輯,其值(編輯模式)有:text / password / date / ddw / lbox。 key :關鍵欄,選擇性,其值為yes / no,yes=開啟編

使用coldfusion將HTML表格輸出成EXCEL檔案(使用者下載)

Coldfusion 的檔案輸出控制,主要有下面兩個指令 <cfcontent><cfheader> cfcontent 用來告訴瀏覽器等一下要輸出的內容是甚麼格式 cfheader 用來宣告傳輸資料的相關資訊 簡單的輸出測試  saveFileTest.cfm: <cfsetting enablecfoutputonly= "Yes" > <cfcontent type= "application/vnd.ms-excel; charset=big5" > <cfheader name= "Content-Disposition" value= "attachment;filename=ODR10001234567.xls" > <!--- office Excel Format Structure---> <cfoutput> <html xmlns:x= "urn:schemas-microsoft-com:office:excel" > <head> <meta http-equiv= "Content-Type" content= "text/html;charset=big5" > <!--[if gte mso 9]> <xml> <x:ExcelWorkbook> <x:ExcelWorksheets> <x:ExcelWorksheet> <!--- this line names the worksheet ---> <x:Name>訂單狀態</x:Name> <x:WorksheetOptions> <!--- these 2 lines are what works the magic ---> <x:Panes> </x:Panes> </x:WorksheetOptions>

利用 coldfusion 實作 CAPTCHA 驗證功能

圖片
 我當然知道這樣輸入很沒效率,但是這是目前比較好的防廣告文手段。 CAPTCHA,中文常被稱為『驗證碼』,其全名為 Completely Automated Public Turing test to tell Computers and Humans Apart (全自動區分計算機和人類的圖靈測試)。媽呀,好長的名字!!! 需要詳細瞭解者可以看 中文版維基的解釋 或是 英文版本 的。 如果需要輕鬆一點的可以看看 直角兄-淺談各式各樣的網路圖形驗證碼(Captcha) 因為網路上我真的找不太到中文關於使用原生 CFML 來設計 CAPTCHA 驗證碼的文章, 真的有點感嘆,所以就自己動手寫起來以備日後的紀錄與查找。 原始碼出處: http://www.bennadel.com/blog/873-Using-CAPTCHA-In-ColdFusion-8.htm 當然英文看不輪轉的就看我這裡的吧,我已經把註解都中文化,並且稍微修改了一些。

CFSCRIPT是什麼?

來聊一下什麼是 CFSCRIPT 吧: ColdFusion 使用的基礎語言是 CFML ,原文:ColdFusion Markup Language。 意思是 Coldfusion 標記語言,就跟 HTML 一樣屬於標記式 ( tag ) 的程式語法。 相關的資訊可以在 維基網站 查得到,這裡不再多述。 那麼有了 CFML 後為什麼又需要 CFSCRIPT 了呢?

Coldfusion如何使用編/解碼

以下程式碼可能需要 CF9 以上的版本,目前測試 Railo 3.3 可以正常運作。 傳遞資料的時候有時候須要將資料進行編碼或是解碼, 雖然 javascript 可以完成這樣的工作, 但有時候因為隱匿的關係不希望使用者端解譯其運作原理,所以最好是在 Server 端完成。 Coldfusion 可以處理基本的編解碼有三種形式: Hex: use the characters 0-9 and A-F to represent the hexadecimal value of each byte; for example, 3A. UU: use the UNIX UUencode algorithm to convert the data. Base64: use the Base64 algorithm to convert the data, as specified by IETF RFC 2045, at www.ietf.org/rfc/rfc2045.txt . 比較常見的大多是 Base64吧。 以下是完整的測試網頁:

在CFSCRIPT下使用Cookie

Coldfusion繼續來玩Cookie吧, 注意下面的操作可能需要 CF9 以上的版本, Railo 3.3 以上的版本執行上沒有問題。 繼上一篇 Using cookie in CFML 之後,如果想在 Cfscript 中使用cookie的操作要怎麼辦? 目前尋遍 adobe 官方文件 得到的結果是: Direct assignment of Cookie scope memory-only variables. You cannot use direct assignment to set persistent cookies that are stored on the user's system. 真是沒輒!! 但是還是有辦法操作的,就是利用 cf-tag 與 cfscript 混用: 首先,寫一段處理 cookie 的 Function : <cffunction name="setCookie" access="public" returnType="void" output="false">  <cfargument name="name" type="string" required="true">  <cfargument name="value" type="string" required="false">  <cfargument name="expires" type="any" required="false">  <cfargument name="domain" type="string" required="false">  <cfargument name="httpOnly" type="boolean" required="false&q

Javascript的Array中文排序

續上一篇 , 資料讀取到 Array 以後,偶爾使用者會需要排序這些列表資料, 當然 javascript array 有 sort 這個方法來排序,只是這個排序, 只比較合適於內容值為數值的排序,對於文字的排序就不怎麼靈光,不好用了。 因此 javascript 提供的另外一種排序方式 就比較合適文字/中文的排序方式: //SORT data function sortDW1(field,kind){     dwset.sort(function(a,b){         if (kind=="A"){             return a[field].localeCompare(b[field])         }else{             return b[field].localeCompare(a[field])         };     }); }; 關於 localeCompare 可以參考系列網頁資料: http://www.w3school.com.cn/js/jsref_localeCompare.asp http://www.southmaster.com/article/pub.php?page=red2.php&id=5408

將SQL讀出的資料暫存到JavaScript的Array以方便利用

有時候網頁需要讀取列表資料的時候, 通常我會把 SQL 執行語法交由另外一個 Coldfusion page 去執行, 然後取得回傳的內容並且儲存起來。 (這個方式當然是使用 ajax 方式,才不會動不動就要重新 RUN 一次版面) 為什麼要這麼做? 因為多數的時候,這個列表內容可能非常多(1~2千筆), 因此,這個列表就需要動用到分頁顯示, 然而,若是以前的作法是,每次點擊不同的分頁,就必須重新呼叫 SQL 查詢, 並只過濾出我需要顯示的範圍,而這種方式的處理,資料庫讀取就變得相當頻繁,

Using cookie in CFML

若是 Coldfusion 需要設定 Cookie 的變數,基本的用法如下: <cfcookie name="myid" value="a0001" expires="30"> name是key名稱 value是它的值 expires是它的存活期,可以是天數(如範例)、某一日期/時間、now(立即過期)、never(約30年) <cfcookie name="myid" expires="now"> <cfcookie name="myid" expires="12/20/2010"> 進階用法 domain=".mydomain2.com" 這是讓cookie指定給其他網域主機可以使用,一般cookie預設位置在你執行頁面的domain下。 path="/serverlet/login" 可以強制指定可用的網頁位置,一般的cookie是在該domain的root下所有子位置都可以使用,指定以後就只能在該位置下的頁面使用。 httponly 這個屬性是指定這個cookie只能由browser進行http傳送,不可以被其他script(如JavaScript)讀取,若要設定這個屬性必須要再設定其他的頁面屬性,可以參考  http://www.petefreitag.com/item/764.cfm 若要取得cookie設定的變數可以如下: #cookie.myid# 當然,最好取得cookie中自訂變數以前要檢查一下以免發生錯誤: <cfif StructKeyExists(cookie , "myid")>     <cfoutput>#cookie.myid#</cfoutput> </cfif>

引用:Tree's Blog: Blogger code block

來源: Tree's Blog: Blogger code block 由於部落格主要是貼程式碼的地方,因此會需要使用到CODE標籤 可是常常改版面的結果,就是CODE的CSS描述會需要重貼,這就挺麻煩的 所以,引用了 TREE 的這篇文章,每次更改版面時就要記得貼回這段程式碼。 (貼入位置在 /* posts 區段) code, .code { display: block; /* fixes a strange ie margin bug */ font-family: Courier New; font-size: 8pt; overflow:auto; background: #f0f0f0 url(http://klcintw.images.googlepages.com/Code_BG.gif) left top repeat-y; border: 1px solid #ccc; padding: 10px 10px 10px 21px; max-height:200px; line-height: 1.2em; }