2010年2月26日 星期五

C#還是比較好用∼補零原來很簡單!

XXX.ToString("00")
XXX如果是月份函數:則原本1,2,3 ... 12
會變成:01,02,03 ... 12

--
看到、想到、說到、做到 
能夠填平大海的誓言,也比不上邁出一步的價值 
是以吾輩此生,再無任何誓言

2010年2月24日 星期三

Notes-Web化的苦痛:時間選擇器

在Notes還沒有Xpage的時代裡,要將應用程式Web化有幾個特別痛苦的地方。
1.人員名錄選擇器
2.時間選擇器
3.日期選擇器

(↑依照痛苦指數排名)
日期、時間網路上到還有JavaScript的解決方案可以選。
只是要放在Nsf裡面需要一些技巧。而人員名錄就真的只能硬Code了。
自己做子表單、嵌入視界、用JS抓勾選欄位的UNID、再用代理程式撈資料回來…
十分麻煩。雖然之前已經有前輩所作的模組,不過要搬過來要遷就它反而麻煩。
這一部份有空再來整理。先講一下「時間選擇器」搬進Notes裡面的方法。

引用:暗黑執行緒的這篇
http://blog.darkthread.net/blogs/darkthreadtw/archive/2007/09/04/code-javascript-time-picker.aspx
以及所使用的Timepicker模組。

Timepicker模組有兩部份:圖片、JS檔
1.JS檔的部份把程式碼Copy出來,放到Script程式庫然後再於表單的JS表頭引用即可
2.圖片的話必須注意配合放置的路徑。放到NSF檔中的"資源/圖片"裡要引用實在是很
痛苦,而且各AP之間無法共用。所以我是放到"data\domino\icons"下面。
將ImagesPath目錄設為:"/icons/"即可被抓到。
3.在表單中加入這行:
<script type="text/javascript">afa_ExtendTimePicker("AwayTime");</script>
並選取文字~透過HTML即可。

p.s.AwayTime是欄位名稱
完成後如下:

p.s.2
Web開發時,ID不要漏掉。JavaScript很依賴他的!

--
看到、想到、說到、做到 
能夠填平大海的誓言,也比不上邁出一步的價值 
是以吾輩此生,再無任何誓言

2010年2月23日 星期二

與害偕行,以死自繞~哀溺文

暴力和尚一頁書開扁之前都喜歡調一下書包,這樣揍起人來似乎更有感覺!
這次嗆的這句「與害偕行,以死自繞」之前沒聽過?
原來出自…

哀溺文

零陵之氓鹹善遊。一日,水暴甚,有五六氓乘小船絕湘水。中濟,船破,皆遊。其一氓盡力而不能尋常。其侶曰:「汝善遊最也,今何後為?」曰:「吾腰千 錢,重,是以後。」曰:「何不去之?」不應,搖其首。有頃,益怠。已濟者上岸上,呼且號曰;「汝愚之甚!蔽之甚!身且死,何以貨為?」又搖其首,遂溺死。 吾哀之。且若是,得不有大貨之溺大氓者乎?於是作《哀溺》。

吾哀溺者之死貨兮,惟大氓之為憂。洩濤鼓以風湧兮,浩滉蕩而無舟。不讓祿以辭富兮,又旁窺而詭求。手足亂而無如兮,負重逾乎崇丘。既浮頤而滅膂兮, 不欲釋利而離尤。呼號者之莫救兮,愈搖首以沉流。發被齷以舞瀾兮,魂悵悵而焉遊。龜黿互進以爭食兮,魚鮪族而為羞。始貪贏以嗇厚兮,終負禍而懷讎。前既沒 而後不知懲兮,更攬取而無時休。哀茲氓之蔽愚兮,反賊己而從仇。不量多以自諫兮,姑指幸者而為謀。夫人固靈於鳥魚兮,胡昧周而蒙鉤。大者死大兮,小者死 小。善遊雖最兮,卒以道夭。與害偕行兮,以死自繞。推今而鑑古兮,鮮黨以保其生。衣寶焚紂兮,專利滅榮。豺狼死而猶餓兮,牛腹屍而不盈。民既貿貿而無知 兮,故與彼鹹諡為氓。死者不足哀兮,冀中人之為餘再更。噫!

作者:柳宗元 唐
本作品收錄於:《全唐文/卷0583》
--
看到、想到、說到、做到 
能夠填平大海的誓言,也比不上邁出一步的價值 
是以吾輩此生,再無任何誓言

2010年2月21日 星期日

Xpage - 視圖 -自訂超連結

在XPage裡面我們可以很方便的取用視圖內容,呈現在網頁上。
而只要設定幾個步驟就可以用連結的方式開啟文件。那、如果是要開啟自訂的超連結呢?
假設我的世圖中有一欄位DBPath是放電子表單資料庫路徑、eFormName是名稱。
請將來源視圖中的欄位作如下設定:
"[<a href=\\" + DBPath + " target=_blank >"+eFormName+"</a>]"

然後Xpage的視圖直欄作如圖之設定:1.選HTML,2.不要勾產生連結∼

p.s.加前後"中括號"是為了相容傳統Web方式。
--
看到、想到、說到、做到 
能夠填平大海的誓言,也比不上邁出一步的價值 
是以吾輩此生,再無任何誓言

HL2_EP2

今年的年假計畫之一就是把HL2再玩過一遍,然後玩EP1、EP2。最重要的是把Alyx替換為Korin模組,變伸Kawaii的Japan妹。替換人物模組時一開始HL2跟EP1都很順利,只要把解壓縮出來的兩個資料夾放到HL2(或Ep1)目錄下就可以了!但是在EP2到一個奇怪的現象!一樣將檔案放到EP2下面後,一開始都正常。但到了Alyx被"獵人"捅了之後,卻又變回原來的模型?後來才知道似乎後半段用的人物模型有差,所以亦須修對得修改檔名才行。

參考:
EP2 FIX: After Alyx is attacked by the Hunter, she switches back to her old model. To fix this, make a copy of all the files in the model folder. Change their names to alyx_ep2. Leave the file type the same. (You should now have a bunch of 'alyx' and 'alyx_ep2' model files in your model folder
把"alyx"都變成"alyx_ep2"就OK了!!
google了半天korin mod hl2 ep2都找不到解答,後來轉而參考其他模組在EP2上如何使用材終於找到答案!
 
 --
看到、想到、說到、做到 
能夠填平大海的誓言,也比不上邁出一步的價值 
是以吾輩此生,再無任何誓言

2010年2月13日 星期六

Notes-如何在Notes client中要求使用者再次輸入密碼

一般在使用Notes client的時候,都是在一開始的時候就輸入ID密碼驗證身份。進入系統後開啟每支AP時,由AP本身的設定去檢查該名使用者是否有權限可以進入或是讀寫…
最近客戶Boss丟了這個問題出來:希望可以在開啟某支AP時要求該名使用者再次輸入一次密碼。乍聽之下有點怪,明明Notes已經有良好的權限控管機制了?不過再代入角色想一下,大概是覺得怕自己已經登入使用中的電腦,被別人偷用。利用他的ID進入存取資料∼好的…那Soluction?

目想到的是利用Lotus Script執行讀取ID的方式來達成:

Sub Postopen(Source As Notesuiview)
'------------------測試強制切換ID-----------------------------
Dim w As New NotesUIWorkspace
Dim s As New NotesSession
Dim uidb As NotesUIDatabase
Dim myID As notesID
Dim CurrentUserName As String
Dim IsAllow As Boolean
Set uidb = w.CurrentDatabase
fNames = w.OpenFileDialog( False, "請選擇ID檔",, "D:\lotus\NotesID")

If Not(Isempty(fNames)) Then
'On Error Goto ErrorHandler
CurrentUserName =s.UserName
Set myID = New notesID( fNames(0) )
If (CurrentUserName = myID.userName ) Then
msgStr$ = "OK!"
IsAllow = True
Else
msgStr$ = "No good!"
IsAllow = False
End If
msgStr$ = msgStr$ & Chr(10) & myID.userName
msgStr$ = msgStr$ & Chr(10) & myID.commonname
msgStr$ = msgStr$ & Chr(10) & myID.internationalPublicKey
'msgStr$ = msgStr$ & Chr(10) & myID.internationalPrivateKey
'ProgEnd:
Else
IsAllow = False
End If
Msgbox msgstr$

If Not ( IsAllow) Then
Call uidb.Close
End If

'ErrorHandler:
'Msgbox "Error:" & Err & "__ID:" & fNames(0)
'Call uidb.Close
End Sub

這是網路上找到的讀取ID檔Class。
NotesID Class
利用它存取ID檔並觸發密碼驗證,之後再比對是否與現行ID相符以達成身份驗證的目的。
p.s.1.寫在postopen中是因為DB必須先開啟,才能用UI去Close
p.s.2.要調用myID.internationalPublicKey才會觸發密碼驗證。

--
看到、想到、說到、做到 
能夠填平大海的誓言,也比不上邁出一步的價值 
是以吾輩此生,再無任何誓言

2010年2月12日 星期五

Xpage上要如何調用CGI變數

Notes傳統開發Web的時候,可以將欄位名稱設CGI變數名稱,以取得CGI變數資料。
例如使用者IP、HTTPS狀態、Server Name等。
但我們在Xpage上無法再用設定欄位名稱的方式來取得CGI變數資料。
而computeWithForm = both的方式只能用在@Formula上。
所幸我們有現成的程式庫可以達成這需求:
1.到Demo Discussion(討論區範本)中把程式庫:xpCGIVariables搬回來。
2.在程式中我們用Server端的JavaScript去呼叫並取用它:
facesContext.getExternalContext().getRequest().getRemoteAddr());
而我則是把它作成一個「自訂控制項」來方便取用這些CGI資訊
類似傳統上作成「子表單」的方式。


--
看到、想到、說到、做到 
能夠填平大海的誓言,也比不上邁出一步的價值 
是以吾輩此生,再無任何誓言

2010年2月10日 星期三

Xpage_檔案上傳救星

從前Notes Web的檔案上傳真是一場惡夢!
現在Xpage來救你了!

在表單中準備好一個"有錢的"欄位檔作存放區。


然後把上傳元件、下載元件都繫結過去就OK啦!


如下:



--
看到、想到、說到、做到 
能夠填平大海的誓言,也比不上邁出一步的價值 
是以吾輩此生,再無任何誓言

2010年2月4日 星期四

Notes(NSF檔)中調用圖片及CSS




放在Notes中的圖片要調用
將一般路徑:images/img01.gif
改成: ./img01.gif


Xpage中的空白字元代碼:&#160;


網路上寫好的CSS檔要拿到Notes裡面使用。由於使用Xpage的「自訂控制項」放入Xpage裡面後ID會被改掉,所以CSS檔裡面ID宣告法(用"#"做開頭的定義),必須改為Class(用"."做開頭的定義)的方式。而原本頁面中引用ID的地方,必須再去指定他的Class。
選擇器 {
屬性:設定值;
...
}
p.s.1.頁面中原先使用id宣告的部份若是有多層,則設定Class時也必須手動上層的Class定義加進來。
p.s.2.注意!在修改ID成Class時不要用「全部尋找/取代」的方式,不然會把色彩設定的#也改到。



當使用Xpage出現「未授權檢視此網頁」時,除了注意ACL中
Anonymous是否有加入並給予權限。
另外也檢查一下是否使用正確的ID建立Nsf檔!


--
看到、想到、說到、做到 
能夠填平大海的誓言,也比不上邁出一步的價值 
是以吾輩此生,再無任何誓言

2010年2月2日 星期二

關於C#讀取CSV檔以及顯示中文亂碼

1.關於C#讀取CSV檔

2.以及顯示中文亂碼∼
using (StreamReader sr = new StreamReader(ytcsv))
變:using (StreamReader sr = new StreamReader(ytcsv,System.Text.Encoding.Default))

string[,] aryResult;
                using (StreamReader sr = new StreamReader(ytcsv,System.Text.Encoding.Default))
                {
                    //讀取文字檔
                    string txt = sr.ReadToEnd().Trim();
                    string[] aryStr = txt.Split('\n');//有幾"列"
                    int hight = aryStr.Length;
                    int width = aryStr[0].Split(',').Length;//有幾"行"
                    aryResult = new string[hight, width];//確定後宣告陣列大小
                    //帶值進去
                    for (int h = 0; h < hight; h++)
                    {
                        string[] arySplit = aryStr[h].Split(',');
                        for (int w = 0; w < width; w++)
                        {
                            aryResult[h, w] = arySplit[w];
                            this.Text = "H:" + hight + "-W:" + width;
                        }
                    }
                }

                //印出結果
                for (int h = 0; h <= aryResult.GetUpperBound(0); h++)
                {
                    for (int w = 0; w <= aryResult.GetUpperBound(1); w++)
                    {
                        //Console.WriteLine("ary[{0},{1}]='{2}'", h, w, aryResult[h, w]);
                    }
                    //列印開始!
                    /*
                    ※96 DPI 時, 1 Inch = 96 Pixels , 1 CM = 1/2.54 Inch = 96/2.54 Pixels = 37.7953 Pixels
                     Sol.1:動態產生控制項,整體一起列印。
                     Sol.2:使用迴圈連續列印。
                     */
                    lbl_cus.Text = aryResult[h, 0];
                    lbl_item.Text = aryResult[h, 1];
                    lbl_content.Text = aryResult[h, 2];
                    lbl_date.Text = aryResult[h, 3];
                    //Print
                }
 

--
看到、想到、說到、做到 
能夠填平大海的誓言,也比不上邁出一步的價值 
是以吾輩此生,再無任何誓言

2010年2月1日 星期一

RAMDisk配套措施


修改 Internet Explorer 的暫存目錄(
Temporary Internet Files )
開啟 IE→工具 網際網路選項 瀏覽歷程記錄設定移動資料夾
登出,然後再登入

修改 Firefox 快取資料夾
1.在網址列輸入「about:config
2.∼發誓!一定會小心。
3.新增→字串。
4.在新增字串的視窗中輸入「browser.cache.disk.parent_directory
5.雙擊「browser.cache.disk.parent_directory」輸入字串的值(例:R:\Temp\_fxTmp)
6.重新啟動 Firefox,設定即可生效。


開機∼
Set fs = CreateObject("Scripting.FileSystemObject")
fs.copyFolder "D:\Temp\_fxTmp\Cache", "R:\TEMP\_fxTmp\Cache"
fs.copyFolder "D:\TEMP\_ieTmp\Temporary Internet Files", "R:\TEMP\_ieTmp\Temporary Internet Files"
fs.copyFolder "D:\TEMP\_tmp", "R:\TEMP\_tmp"

關機∼
Set fs = CreateObject("Scripting.FileSystemObject")
fs.copyFolder "R:\TEMP\_fxTmp\Cache", "D:\Temp\_fxTmp\Cache"
fs.copyFolder "R:\TEMP\_ieTmp\Temporary Internet Files", "D:\TEMP\_ieTmp\Temporary Internet Files"
fs.copyFolder "R:\TEMP\_tmp", "D:\TEMP\_tmp"

--
看到、想到、說到、做到 
能夠填平大海的誓言,也比不上邁出一步的價值 
是以吾輩此生,再無任何誓言