2012年9月14日

C.C. Agile 聚會心得-1

坎尼有幸報名了 C.C. Agile Spint 1
所以就跑去聽聽大家 Run Agile Development Process 的心得
Teddy 風趣地用了三個例子解釋他對敏捷開發精神的體悟
(而且 Teddy 講話的聲音和方式真的很像Bill叔 XD)

雖然坎尼關注 XP 許久 (以及最近入門的 Scrum)
但仍然像 Teddy 講的,拿了駕照,但車還是沒開出地下室
主要的原因其實聚會裡都有提到:環境不允許,又沒能力去改變現況

所以就有人問到如果老板不支持怎辦?
坎尼的答案跟 Teddy 很像:既然無法說服,有 guts 一點就把車先偷偷開出去再說
但在開出去之前真的要先確認是不是真的都掌握到相關知識
不要油門和離合器分不清楚、方向燈在哪也不知道、雨刷永遠停不下來就很好笑了

以前看 XP (eXtreme Programming) 的文獻時
Kent Beck 提到最重要的就是不要害怕改變,而是要去擁抱改變
但 MIS 老師卻說:組織裡的員工會抗拒改變「我工作好好的,幹嘛學新的東西」
不確定性太高的事物是不容易讓人接受的

坎尼曾經有偷偷的導入新技術,但沒跟老板講
等專案成功了再說這是 XX 新技術做的,老板當然覺得這東西可以導入
所以還安排了幾次教育訓練分享其他工程師同仁們

但坎尼還是覺得這樣的方式並不是個好的解決方案!
逆練九陰真經久了,一不小心就會走火入魔!

如果無法說服老板,就先把敏捷精神銘記在心
然後一項一項的把方法導入團隊裡:TDD、CI、Daily Standing Meeting...
如果方法不合用,也不要強求,以免練身體練到得內傷

今天胡言亂語就到這邊好了,會不會有第二篇心得就再說囉 XD
另外提供敏捷宣言 英文 中文 讓有興趣的朋友參考

2012年8月16日

[ASP.NET] 在不同的 ContentPlaceholder 中設定 ControlID

有在用 MasterPage 的朋友都知道 ContentPlaceholder
而且主頁中可以放多個 ContentPlaceholder 來讓畫面更有變化且更有彈性
但如果是這種情況,可就要小心本篇中提到的問題囉

I. 多個 ContentPlaceholder

tmp01
可以看到,MasterPage 中可以一次放入多個 ContentPlaceholder
所以坎尼建了個 TooManyContentPlaceholder 的頁面,並選擇這個主頁
tmp02 今天有個需求是要依輸入條件撈出所有符合條件的資料
於是很合情合理的先在畫面上放個輸入框,令使用者可以輸入查詢條件
再放個 Gridview 來顯示條件
不過為求方便,就用 ObjectDataSource 來和取得資料的方法溝通
tmp03 由於坎尼自訂的方法 GetAllData(String MyName) 需要傳入參數
於是就把 TextBox1.Text 當成參數來源設定給 ObjectDataSource 使用
tmp04最後把 GridView1.DataSourceID 設定成畫面上的 DataSource
好了,測試沒問題就可以把程式交付給客戶了~ 樂勝~ 樂勝~

(把頁面跑起來)

tmp05
080725112520xmitead 
啊是在玩我是嗎?
ID也是你叫我設的,我也選了 (詳見圖3及圖4),現在你跟我說找不到 ID (翻桌)

II. 冷靜


好,我們平心靜氣
經過谷歌大神的一番指導之後,坎尼發現完全找不到解決方案 XDDDD
因為大家都在談的是 MasterPage.FindControl 這個問題 (坎尼很久之前也有寫過一篇)

但在一陣誤打誤撞之後,不小心被坎尼試出來了:
若要設定不同 ContentPlaceholder 裡的 ControlID, DataSourceID, TargetControlID…請用該 Control 的 UniqueID

(就是長的像 ctl00$ContentPlaceholder1$TextBox1 這類的ID)

tmp06
把 DataSourceID 和 ControlID 改成 UniqueID 之後,頁面就正常運作了
tmp07

III. 小結


這次遇到這個問題的心得是:谷歌不是萬能 XD
所以記下這篇讓它更聰明一點

此次的範例下載

2012年8月15日

[ASP.NET] 調整傳給 DataSource 的參數值

最近在用 ObjectDataSource 時發現,取回的資料與預期不符
稍微研究一下,發現是參數在搞鬼
於是寫了這篇範例給以後有遇到相同問題,或是有調整參數值需求的人

I. 程式碼配置與情境說明


功能需求取回符合時間區間的登入資料
所以畫面上配置了兩個日期輸入框,以及一個送出按鈕
接著則是 Gridview 及 ObjectDataSource
odp01
給 ObjectDataSource 呼叫的方法則是到資料庫取得資料
可以看到有兩段 where 的判斷式,分別判斷該不該加入起始或結束的條件
odp02
參數的資料來源就是畫面上的兩個輸入框文字
傳入到 Method 的型別則是 DateTime? odp03
寫好之後開啟虛擬伺服器看運作情況
嗯…Great! 看起來沒什麼問題
odp04
但是!!
如果這麼簡單就結束,坎尼就不用寫這篇了…
由下圖可以看到,當日期條件是同一天時,則會顯示不出資料
odp05 嗯,難道這是父親節的詛咒嗎?
0

II. 偵錯

於是坎尼開了偵錯模式開始追蹤問題在哪
odp06
odp07
很幸運的馬上就找到問題點了:

傳入的 DateTime 參數如果只有日期的話,會自動設定在00:00
在 8/8 00:00 ~ 8/8 00:00 之間當然找不到資料
此時較好的解法就是在傳入時把值抓出來做調整之後,再送去查詢

問題是,要在哪個事件攔截參數?
odp08
沒錯,就是在 DataSource 的 Selecting 事件!
處理步驟如下:(可搭配上圖一起使用)
  1. ObjectDataSourceSelectingEventArgs.InputParameters 取出參數
  2. 將參數轉型
  3. 處理參數值
  4. 存回參數裡
如此一來查詢的區間就會在 0 時到 24 時之間

坎尼突然想到以前公司同事都是用字串傳日期,加上 00:00:00 和 23:59:59 之後再去 parse,好像也是個不錯的土法煉鋼的方法啦…

再把網頁跑起來一遍,查詢區間都設定為 2012/8/8
odp09
很好,有資料了! 收功!

III. 小結

所有的 DataSource 物件皆有 Selecting 事件
但需要處理參數的大概只有 ObjectDataSource

另外處理參數的時候要注意轉型和 Nullable 型別的判斷
否則可能測試時沒問題,但一上線就有機會發生例外!

此次的範例下載 (不含資料庫)

2012年7月15日

在Apple Online Store欲用教育價購買產品,需注意刷卡人&收貨人需為同一人,且有學生身分

前陣子買了 iMac 21.5" (Mid 2011),本來想在 Apple Online Store 上用教育價優惠(借用女友的學生證),結果過程非常不順利。聽說以前用教育價購買是不需經過身分驗證的(另有一說是只會抽驗),但現在一律必須將身分證明文件(電子檔)寄給 Apple 客服。

基本上只要學生證正反面影本電子檔即可,若是父母買給子女,要另外附上身分證正反面影本以證明親子關係。但我明明寄了學生證正反面影本電子檔,Apple 客服還是鬼打牆說我沒有提供身分證明文件,一怒之下就退單,用其他方式購買了。

退單後女友很認真的打電話去問,結果客服說「下單的人、刷卡的人、收貨的人最好都是同一個,也就是有學生身分的那個人,這樣審核比較容易通過」(看起來好像也不保證會通過),但是從往返的 email 中完全看不出來這一點,只是不斷重複要求我提供身分證明文件。

希望有需要用教育價買 Apple 產品的人可以成功,看來真的是越來越難了 ~~

2012年7月12日

快把你的密碼改成完整的英文句子 (Pass Phrases)

Openfind 2012 Solution Day 筆記中我提到「運用一般家用硬體,在 1 秒內即可破解任何 8 位數(含)以下的密碼」,因此密碼長度基本上是越長越好。從當兵的時候開始為了滿足長度&複雜度的要求,我都用注音輸入法的順序當做密碼,例如「林益世」就是「xup6u4g4」,通常這樣的密碼不但長度夠,而且複雜度也夠。


問題是開始使用 Smartphone 以後,這樣的密碼就變得非常難輸入,沒有桌上的標準尺寸鍵盤,根本就記不住注音符號對應到哪些英數字/標點符號,因此有一段時間都把密碼改為比較簡單的密碼,但這樣風險就變高了。


幸好前陣子看到 Jeff Atwood 的 Passwords vs. Pass Phrases 這篇文章,於是我開始把自己常用網站的密碼都改成完整的英文句子,好處包括:

  1. 長度絕對足夠,且包含標點符號。
  2. 容易記憶,與其用家人的生日「1900/01/01」,不如改為「Tim's bDay was January 1st.」、「My s0n's 1st Xmas is sooo great!!」等句子,並且故意把「英文o,數字0」、「英文l、數字1」之類的字元交替使用(多用英文的網路慣用簡寫),強度更強。
  3. 在 mobile devices 上容易輸入,因為都是英文+數字+標點符號。

以下是測試結果。
  • Microsoft Windows Live ID (Hotmail, SkyDrive)
    • 密碼長度:6~16個字元,不允許使用空格。沒有密碼強度提示。
  • Google Account (GMail, Calendar, Drive...)
    • 密碼長度: 沒有明確標示,但可使用長達22個字元的密碼。輸入第8個字元時強度由medium變為strong,不符合現況!
    • 兩階段驗證設定方式
  • Yahoo! Account (Yahoo! Mail)
    • 密碼長度:6~32個字元,有密碼強度提示,輸入第6個字元時強度由「密碼無效」變為「甚強」。
  • Apple ID (iTunes Store, iCloud)
    • 密碼長度:8字元以上,輸入第17個字元的時候強度由moderate變為strong。 可使用長達22個字元的密碼 。
  • Dropbox
    • 密碼長度:沒有明確標示,但可使用長達22個字元的密碼。奇怪的地方是新密碼不用重複輸入兩次。
  • Evernote
    • 密碼長度:沒有明確標示, 但可使用長達22個字元的密碼。沒有密碼強度提示。
  • Plurk (噗浪)
    • 密碼長度:沒有明確標示, 但可使用長達22個字元的密碼。沒有密碼強度提示。
  • Facebook (臉書)
    • 密碼長度:沒有明確標示, 但可使用長達22個字元的密碼。輸入第8個字元時強度由medium變為strong,不符合現況!
    • 兩階段驗證設定方式
  • Skype
    • 密碼長度:6~20個字元,沒有密碼強度提示。
  • Battle.Net
    • 密碼長度:8~16個字元,輸入第11個字元時強度由「中等」變為「強」。
  • PayPal (2012-07-17更新)
    • 密碼長度:8~20個字元, 輸入第11個字元時強度由「一般」變為「高」。
目前看來長度比較危險的是微軟的Windows Live ID & 暴雪的帳號,但暴雪還有手機動態密碼鎖可以保護,因此還是比較安全的。

2012年7月3日

Openfind 2012 Solution Day 筆記

去年也有參加 Openfind Solution Day,今年主題是開創個資防護、郵件安全新浪潮 (協同溝通x內容感知x主動稽核),所有的簡報檔在這裡

承襲去年的優良傳統,最值得聽的 session 是第二場-Xecure Lab 執行長 邱銘彰 (Birdman) 的「從 APT 攻擊剖析 2012 郵件安全技術趨勢」。其餘的 session 都還不錯,自家產品講解的蠻清楚。

CEO Ivan 引用的影片很讚:Scientists Make Easter Island Statue Walk,實驗證實只要 18 個人就可以搬動重達 1萬公斤 (10公噸) 的 Moai 石像,在 2012.10 個資法預計正式上路以後,只要超過 20 個人就可形成團體訴訟,單一案件最高賠償金額 2 億,足以扳倒一家公司。

以下是這次聽到的一些重點:
  • 運用一般家用硬體 (用 nVIDIA 顯卡上的 GPU 透過 CUDA 架構以平行運算的方式來執行暴力破解),在 1 秒內即可破解任何 8 位數(含)以下的密碼,因此若你的密碼小於等於 8 位數,那不如直接設一個字元就好了,意思是一樣的。建議密碼最小長度是 16 位數。由此引申的重點是,若某網站限制密碼長度為 6~8 or 8~12 字元,等於是自廢武功,非不得已最好避免使用這網站。(Google 帳號可支援長達 30 字元的密碼)
  • APT 攻擊 (Advanced persistent threat) 無法利用傳統防毒軟體來阻擋,因為防毒軟體靠的是在 global 散怖的病毒的特徵碼,但 APT 攻擊是針對少數人(公司高層或者可接觸重要資料的人)特別精心設計的,郵件總數可能最多幾十封,因此無法找出特徵碼。以往進行病毒郵件的演練都強調「不要開啟來路不明的郵件」,但 APT 攻擊往往是偽裝成你的上司/熟識的同事來發信,來路都很明,因此極難防範。
  • 近幾年來駭客最愛用的攻擊手法是 Document Exploit,利用 MS Office Files (.doc/.xls/.ppt) & PDF 檔發動攻擊,Xecure Lab 有個線上 APT 偵測服務 - XecScan,我認為這是除了 virustotal 以外大家應該要記住的服務(記住名字用 Google 搜尋即可),收到可疑的文件檔案就趕快丟上去掃描一下,若被判定為有問題,立刻打電話跟發信人求證。
  • Flame 病毒是近年來最可怕的病毒,它是先盜取微軟的數位簽章,將惡意程式簽署以後,再透過 Windows Update 散佈!可說是達到駭客夢寐以求的聖杯,因為地球上所有的防毒軟體都不會阻擋微軟的數位簽章。由此引申出來的重點是,簽章本身固然牢不可破,但駭客不需要設法破解簽章,只要多一個步驟,設法先盜取簽章即可 (Stuxnet 病毒使用的是台灣竹科廠商的合法簽章),這是目前資安防禦上很大的一個盲點,畢竟要辨識「合法的簽章是否被惡意使用」是非常困難的。
Openfind Solution Day 大約在每年 7月左右舉辦,全程免費,而且緊接在 CEO 之後的第二個 session 都請外部資安專家來演講,非常值得一聽,中午有提供便當,下午有 tea time,過程中會抽獎,有興趣的人可以訂閱 Mail 2000 部落格來得知最新消息!

2012年7月2日

設定 ssh 免密碼登入需注意 ~/.ssh 目錄和 ~/.ssh/authorized_keys 檔案的權限

通常要利用排程執行 rsync 將檔案在多台設備間同步,都需要先設定 ssh 免密碼登入(利用 RSA / DSA 金鑰認證),之前我都是參考:ssh keygen 免輸入密碼 (需要設定 passphrase 的話參考這篇),但遇到有一台設備不管怎樣設定都不 work。

後來請前輩幫忙看了以後發現,因為 ssh 對檔案/目錄權限控管非常嚴格,因此要 check 以下幾點:

  1. ~/.ssh 目錄的權限必須是 700
  2. ~/.ssh/authorized_keys (/etc/ssh/sshd_config 中的預設金鑰檔) 的權限必須是 644
這兩個權限設定非常重要,必須完全一模一樣才可以,任何一個數字不對就不 work。

通常是不需要特別查這兩個權限設定,但有可能因為 chmod -R 這種指令把整個 home directory  (含 .ssh 這個隱藏目錄)的權限都改了,反而衍生出這個問題。所以說有用到 -R 改權限真的要非常小心阿!

2012年5月14日

[小技巧] 一次將 MS Excel 中的所有工作表匯出為單一 PDF

前幾天老爸很苦惱的問我說:為甚麼 Excel 另存成 PDF 每次只能存一個工作表阿?如果我要印三個工作表就要存成三個 PDF,好麻煩。

仔細看了一下 Excel 另存成 PDF 的選項中,發現只要把「選項」->「發布內容」中的「整本活頁簿」勾起來,就可以把所有工作表匯出為單一 PDF 了:


其實很多時候只要把「選項」打開,仔細看一下就可以找到想要的功能囉!

2012年4月11日

在 RHEL 6 設定 NIC Bonding 的注意事項 (&如何正確關閉 NetworkManager)

在 RHEL/CentOS 4/5 上設定 NIC Bonding 我已經很熟悉了(作法: Network Card Bonding On CentOS),但今天要在 RHEL 6 上設定的時候卻發現已經沒有 /etc/modprobe.conf 檔案了,找到參考作法後歷經一番曲折終於設定好,以下是今天設定的筆記:

  1. /etc/modprobe.conf 已經被 deprecated 了,新的 config 檔要自己去 /etc/modprobe.d/ 目錄下新增 bonding.conf 檔案,內容只要寫「alias bond0 bonding」即可,原本的「options bond0 miimon=100 mode=1 primary=eth0」設定改為寫到 ifcfg-bond0 檔案中。
  2. 承上,在 ifcfg-bond0 中要寫「BONDING_OPTS="miimon=100 mode=active-backup primary=eth0"」,比起 mode=1 來說可是一目了然。
  3. 若在安裝過程中僅針對 eth0 設定固定 IP,則 RHEL 6 自動產生的 ifcfg-eth0 和 ifcfg-eth1 檔案內容差會很多,eth0 多了很多設定,例如「NAME」、「UUID」等 eth1 沒有的內容,因此最好分別編輯兩個檔案,不要先改好 eth0 以後直接用新的 eth0 檔案把原本的 eth1 檔案覆蓋掉,否則可能會造成 MAC Address / UUID / NAME 重複,進而衍生其他問題(詳見下一段)。
基本上有異動的地方只有這兩點,但今天修改第一台設備的設定時遇到一個問題,重開機後只看到 eth1 這張網卡,eth0 不見了!檢查 dmesg 以後發現一個訊息:「udev: renamed network interface eth1 to eth0-eth1」,再用 ifconfig 確認網卡狀態,果然 eth0 已經被 rename 為 eth0-eth1 了,最囧的就是就算把原有的 ifcfg-eth0 檔案 rename 為 ifcfg-eth0-eth1 並修改相關設定也沒用,反而造成 bond0 下只看得到 eth0-eth1 這張網卡,eth1 反而消失了。

好心的同事(怪獸先生)幫忙查了資料以後發現,這是因為在設定過程中我改好了 eth0 檔案,然後直接用 eth0 檔案覆蓋原有的 eth1 檔案,造成 eth1 的 MAC Address 改變,因此 /etc/udev/rules.d/70-persistent-net.rules 檔案的內容錯誤(多了好幾個把 eth0 rename 為 eth0-eth1 的 rule),導致網卡異常。最後很幸運的直接編輯這個自動產生的檔案,把多餘的 rule 刪掉以後重開機就恢復正常了。

另一個問題就是如何停止 Red Hat 內建的 NetworkManager,我發現在安裝 OS 的過程中若設定了固定 IP,就會啟用 NetworkManager 來管理網路,若使用 default 的 DHCP 則不會啟用 NetworkManager。停用的方式很簡單,打開一個 Terminal 視窗 (或者在 runlevel 3 下登入系統),執行 setup,到 System Services 裡面把 NetworkManager 關掉即可。若不進行 reboot,需手動執行 service NetworkManager stop 指令來停止運行中的服務,另外也不要忘記執行 chkconfig 來關閉 NetworkManager,以確保下次 reboot 後 NetworkManager 不會再被啟動。

2012年3月17日

[ASPNET] CS0433之問題

坎尼之前有某個案子的專案在 Debug 的時候很常出現這個問題
所以今天就花了一些時間來追一下問題的發生點

I. 問題說明

此問題發生的時候會出現類似下面的訊息 (可以參考這討論串 

Compiler Error Message: CS0433: The type 'ASP.某個型別' exists in both
'{.Net Framework的路徑}\Temporary ASP.NET Files\root\aaa\bbb\A.dll' and
'{.Net Framework的路徑}\Temporary ASP.NET Files\root\aaa\bbb\B.dll'

CS0433 的官方文件裡寫的很清楚
"在您的應用程式內參考的兩個不同組件包含了相同的命名空間和型別,使其產生了模稜兩可 (Ambiguity) 的情況。"
(但其實 Exception 的內容也講的很清楚了)

只是坎尼檢查了一下專案,感覺不是型別重複的問題
比較像 compiler 快取住某些型別,但重新建置專案之後也只維持一下子
點了幾個頁面之後,有引用到該型別的頁面又會出現此項問題
(都是有引用 Web User Control 的頁面出問題)
(在找解決方法的過程中,發現好像 Web User Control 常會引發這個問題?)


所以坎尼又默默地打開ebay谷歌搜尋
blue-20060625142551

II. 解決方案

首先,在這篇裡提到了3個情況
  1. 不同的 aspx/ascx 引用了相同的 class 當作 code behind 的問題
  2. 因為更名造成有新舊兩種 dll
  3. User Control 的名稱和引用 User Control 的頁面名字一樣

嗯...實際測試之後似乎都不是這些問題,或應該是說,這些都不是主因
坎尼不死心地減少關鍵字,找到了這篇討論串 (其實前面放的討論串也有解法)

解法:在 Web.config 中,把 Compilationbatch 屬性設定為 false

batch 屬性在官方文件的說明為
"If True, eliminates the delay caused by the compilation required when you access a file for the first time. When this attribute is set to True, ASP.NET precompiles all the uncompiled files in a batch mode, which causes an even longer delay the first time the files are compiled. However, after this initial delay, the compilation delay is eliminated on subsequent access of the file."

大意大概是說:當需要該檔案且為第一次進入時才會 compile,以免造成 compile 時間過長,開發人員及客戶都會不爽

所以坎尼猜測就是因為這原因造成下列狀況

  1. A.aspx 引用 UCA.ascx (型別 UCA)
  2. B.aspx 引用 UCA.ascx (型別 UCA)
  3. 進入 A.aspx,進行 compile,沒出現問題
  4. 進入 B.aspx,進行 compile,此時有兩個 .dll 檔都有 UCA 型別

然後系統就混亂了『為什麼有兩個同名的人住在不同的地址,那我到底該去哪個地址找這個人?

『這個地址明明就住大中天,你還要說你是小中天』
dncignn 

III. 小結


不過可能很多人有疑問:為什麼我自己用就好好的,是你自己的問題吧?

其實問題的原因就可能是坎尼之前有做過某些檔案的更名
然後在新增頁面時,就直接把前一頁的程式碼貼過來 (壞習慣啊…)
但也不確定是不是這樣就有可能造成這個問題
畢竟是很久之前的專案,記憶有點久遠…

總之,提供另一個可能 cs0433 的解決方案
希望對同樣遇到這個問題的人有所幫助

2012年3月9日

[Freetalk] 漫談程式設計-II

前篇,本篇就再來舉個例子談談錯誤訊息處理吧

I. 錯誤訊息處理

校方希望全體師生都可以吃青菜,故舉辦了拍附近餐廳的青菜內容上傳的活動
pgs_04 
坎尼也很開心的點開網頁,看看大家的分享內容
但身為一個系統開發人員,注意網址列也是很正常的一件事
asaprogrammer

嗯,如第一張圖所示,是用 Query String 的方式傳送頁面資訊 
很常見的作法,可以節省運算成本,也能有效地達到目的
但好像沒有資料也會顯示該頁,所以坎尼就稍微改了一下參數
pgs_05 在按下Enter鍵的同時坎尼OS「啊啊啊,會不會壞掉?」

pgs_06 嗯…壞掉了 >/////<
但壞掉不要緊,這頁的問題是在它把錯誤訊息給吐出來了

「知道錯誤訊息不好嗎?」
給開發人員知道當然很好,可以馬上了解問題並進行解決

但是!!!

給使用者看到訊息的用意是? 難不成要使用者幫你 Debug 嗎?
還是說這是挑戰,看能不能釣到惡意攻擊的人?

這邊應該要做的是判斷頁數的大小,不合理的數字就該擋掉

II. 同場加映

坎尼想說這個網站會不會還有其他問題,所以就開始隨意瀏覽
除了點連結之外還有改網址…

!!! (出現 FF 中遇敵的音效)
pgs_07 
很明顯的,此站看來是舉辦了大家幫忙一起除錯的全民除錯活動
所以坎尼很好心的連過去 online_resource.php 看有沒有什麼可以幫上忙的

「咦? 奇怪,為什麼顯示 404 page not found? 」
「原來是有做直接存取的限制啊,坎尼放心了不少」
「………」(眉頭一皺,發現事情並不單純)
「不對,是 resource 拼成 resouce 了!!!!」

唉…就算程式沒寫好,英文也要練好啊…

by the way, 如果是系統不能控制的情況,請用 try…catch… 處理
像是 DB Server 當掉,使用者罵的是你而不是管 DB 的人員
(當然如果兩個都是同一個人管的…那…只能說很心酸)

III. 小結

錯誤訊息 (Error Log) 記錄請用 Log 工具
會在頁面上顯示是開發中為了方便做的事,不代表可以在上線之後做

另外最好設計錯誤訊息的顯示格式,到底是 Warning 還是 Fatal
至少要處理的時候可以排出優先順序
Will 保哥在 網站建置不是件簡單的事 @ 打造網站的步驟 的回應也談到
”錯誤訊息在網站企畫階段就要設計。”

至於把訊息曝露給使用者可能會有什麼狀況呢?
可以參考一下同樣是保哥寫的 機會教育:從中華民國總統府網站被發現 XSS 漏洞講起

[Freetalk] 漫談程式設計-I

坎尼自從重回學校之後,寫程式的機會就變少了
但最近在用某些資訊系統時,總覺得怎麼這麼不友善
看來程式魂還是在燒 XD
今天就來舉幾個資訊系統的例子,順便聊一下例子中的問題

I. 資料分類

所有有學過關聯式資料庫設計的人一定都聽過正規化
沒吃過牛肉也要知道瘦肉精,就算不會用也應該會記得1NF、2NF…BCNF …
(不知道正規化有幾階的人請回去找老師或是問維基 資料庫正規化 )

剛好最近用了下面這個XX請修系統
pgs_01

從外表看起來除了 UI 不美觀似乎沒啥大問題
但一打開請修項目:喔喔喔喔喔
pgs_02
幾百個選項一起跳出來,真是令人嘆為觀止
我眼睛也為了找修理項目眼花…

很明顯的,這個請修項目大概只做了第一正規化
坎尼直覺其實可以分為:大類、次類、問題說明 (上圖)
這樣 user 在找的時候可以先選水電類,接著可以找到日光燈,接著再填寫問題
像目前系統做法,日後要是又多了100項
那豈不是要讓下拉選單突破天際瀏覽器邊框了?

當然也有正規化太複雜,導致效能降低的情況,這時候就是要反正規化
但坎尼相信這些資料的量應該還不至於因為正規化而產生瓶頸

當然同頁面的請修地點也有同樣的問題存在
剛好最近又蓋了新宿舍,選單瞬間又加了幾十間房間 orz
pgs_03
 
(1421的同學抱歉啦,如果有看到這篇可以私信給坎尼,再請你們喝飲料)

另外還有個問題,最前面的 610421 很明顯是 primary key 之類的資訊
基本上對使用者是無用的,而且還曝露出自己系統設計原則

設計對白「我是610421的學生,想問幾個問題 (下略)」

除非客服有很好的資訊系統輔助
不然除了通靈之外,鬼才會知道 610421 代表什麼

II. 小結

本來還想多舉個例子的,但篇幅太長就先到這邊
下集待續… (富樫最近都沒休刊,所以坎尼也不能富奸)

2012年3月3日

Windows 8 Consumer Preview (Build 8250) 試玩心得

話說在 2009/1/6 & 2009/2/2 我分別寫了Windows 7 Beta (Build 7000) 安裝心得64-bit Windows 7 Beta (Build 7000) 試用心得兩篇文章,很快的在 2012/02/29 的 WMC 大會上,微軟發表了最新的 Windows 8 Consumer Preview (Build 8250) (發表會完整影片-1.5小時),於是我又手很癢的抓下來玩了。(MS 官方下載網頁,由於只有英文和簡中可以選,因此很自然的選了英文版)

(題外話:我覺得這場發表會上場的 MS 主管講話都太快了,聽眾很少有時間去消化他們講的內容,相較之下還是 Apple 發表會比較精采,聽眾比較能體會這次發表的新產品到底是怎樣的 insanely great)

這次的測試設備規格如下 (大概3~4歲的 NB):
  • Model: ASUS A8E
  • CPU: Intel Core2 Duo T8300 2.40GHz
  • Memory: 2GB
  • 沒有平板/觸控螢幕/藍牙鍵盤之類的配件 Q_Q
安裝過程參考T客邦佛心整理的自製 Windows 7 + Windows 8,玩新系統、舊系統繼續用,除了第一次執行 diskpart 指令要跑有點久以外,可以很順利的把系統裝起來。(更多不同的安裝方式請參考同樣是T客邦出品的 Windows 8 消費者預覽版安裝方法建議與試玩報告,比較之後還是在 Windows 7 系統上用 VHD 安裝比較方便。原汁原味的英文版請參考微軟員工 Scott Hanselman 的 How To Guide to Installing and Booting Windows 8 Consumer Preview off a VHD (Virtual Hard Disk))


現在網路上已經有很多簡介/試玩心得可以參考:
  1. Windows 8 消費者預覽版安裝方法建議與試玩報告-Page 2 介面變很多,關機在哪裡?
  2. [重灌狂人] 非學不可的14個 Windows 8「全新」鍵盤快速鍵
  3. [Engadget] Windows 8 消費者預覽版深入分析
我的感想和 Engadget 這篇差不多, 用平板的人應該會一直停在 Metro 介面(大多會是休閒娛樂/上網閒逛之類的使用情境),需要用傳統鍵盤滑鼠,或者需要用到 browser plug-in 工作的人,還是使用傳統桌面會比較順暢。(要寫程式/用 ssh 管理 unix-like servers 的人就更不用說了,應該有90%以上的時間會使用傳統桌面)

傳統桌面環境的改進:
  1. 三年前在使用 Windows 7 Beta 的時候都要另外安裝 Virtual CloneDrive,現在 Windows 8 Consumer Preview 原生支援可掛載 iso 檔,相當方便,也不需要做「直接把 iso 檔解壓縮出來使用」的蠢事了。
  2. 新的工作管理員更強大了,介面變得更有現代感:
  3. 設定系統啟動時要執行的 services / 軟體可直接在工作管理員中執行,不用再執行 msconfig (視窗無法放大,超爛) 或者到「服務」的管理介面去設定了。

  4. 複製多個檔案的介面也有大幅改進,可隨時暫停/繼續/取消,聽說連休眠後都可以繼續複製:

  5. 新版的 Windows 檔案總管引進 Ribbon 介面,更方便了:

目前安裝成功的軟體:
Also installed:
2012-03-09 : Line PC Version, K-Lite Mega Codec 8.5, Google Earth
2012-03-10 : Visual Studio 11 Ultimate (of course this should work)


目前仍然不 work 的軟體(全部都用最新版測試):
  1. World Community Grid
  2. Google Chrome 官方安裝檔 (但可透過 Avast 7.0/Google Earth 順便安裝)
  3. Dropbox
  4. ImgBurn
  5. FileZilla client
  6. PicPick
  7. 7-zip - 2012-03-09 Update - alternative: bandizip (ref: http://steachs.com/archives/2464)
  8. PPS/PPTV
  9. VLC (可以裝 K-Lite Mega Codec 順便裝 Windows Media Player Classic)
  10. 新酷音 (在傳統桌面可改裝 Yahoo!輸入法,但在 Metro 介面只能用系統內建的簡中輸入法。在傳統桌面切換輸入法的熱鍵沒辦法改成 ctrl + space)
  11. Pidgin (可改裝很多人不愛用的 Windows Live Messenger 2011)
  12. Java & Eclipse
雖然不 work,但 Windows 8 系統已經內建支援的:
  1. PDF -XChange viewer (Windows 8 內建的 Reader App 可直接開啟 PDF<無分頁瀏覽功能>,若需要分頁瀏覽可用 Google Chrome 來開啟多個 PDF 檔案)
  2. VirtualCloneDrive (Windows 8 內建支援直接掛載 iso 檔) 
2012-03-09 Update: 批次刪除 Metro 桌面中不想要的應用程式捷徑(Tile)

最近發現一件事,在傳統桌面安裝了軟體以後,就算在安裝過程中選擇「Don't create Desktop Shortcuts』,還是會在 Metro 桌面留下一大堆應用程式捷徑,讓 Metro 桌面變的很亂,夾雜了一大堆非 Metro style 的圖示。此時只要在所有想要移除的捷徑上按右鍵,就可以將要移除的圖示標記起來(右上角會顯示打勾):

 
然後再按一下左下角的「Unpin from Start」按鈕,就可以讓 Metro 桌面回復乾乾淨淨的狀態啦!
總結

由於一些常用的軟體(Dropbox, FileZilla client, 7-zip)沒辦法安裝,因此我暫時不考慮用 Windows 8 Consumer Preview 當做工作機 ,相信正式版推出以後問題都可以解決。至於公司內的老舊系統 (XP/IE6 Only) 就只能期待 Windows 8 的傳統桌面模式也可以像 Windows 7 一樣裝個 XP Mode 了 (嘆)。

希望 Windows 8 趕快推出,新系統除了有很多改進的地方,用起來總是比較好玩阿!

2012年2月20日

[Solaris 10]在內建的ftp服務中把使用者限定在自己的家目錄中 (chroot)

Solaris 10的設定總是感覺比RHEL複雜,這次要實作的是 FTP chroot,讓使用者透過 FTP 連線後僅能存取自己的 home directory 中的檔案(Linux 的設定請參考鳥哥的文章),Google 一陣子之後很多文章都建議不要用Solaris內建的 ftp,另外安裝 vsftpd or ProFTPD, 難道內建的 ftp 就做不到 chroot 嗎?當然不是,只是網路上相關得文章異常的少,以下就是設定步驟。

參考:How to restrict user to a specific directory in Solaris 10 (詳細步驟列在 Bazookaaa 於2010-10-20 的回覆中)

其實 Bazookaaa 的說明已經很清楚了,以下補充幾點:

  1. Bazookaaa 的步驟從 create new user 開始,但是對現有的 user 也可以作到 chroot,只要略過 Step1,直接執行 Step2 中的 ftpconfig -d /path/to/user's/home/directory 就可以了。
  2. 在 Step3 中提到要在 /etc/ftpd/ftpaccess 檔案中以「guestuser username」的方式新增要 chroot 的 user,若要對一個以上的 user 實作 chroot,要每個帳號寫一行,範例如下:

    guestuser user1
    guestuser user2
  3. Step4 & Step5 只是要再仔細 check 一下,基本上不需要進行特別的調整。

實作過一次以後就不覺得很難了,只是第一次要實作的時候資料很難找就是了 XD

[Solaris10/RHEL4/5] 設定允許使用ssh登入主機的網域白名單

最近發現了廠商會透過類似 SSH Over HTTP 的方式從外部網路直接穿透 80 port 連到機房的內部網路(透過一台在公網有開放 80 port 的設備),而後再以該台設備為跳板連到其他機器。雖然說只是要進行維護的動作,但違反了資安規定,也因此讓我們驚覺還有這種無法透過 firewall 控管的漏洞。(查了一些資料以後發現,據說連 L7 Switch 都擋不住)

為了防堵這樣的連線方式,想到可以透過設定白名單的方式,正面表列允許使用 ssh 跟主機通訊的網域白名單,以下分別說明在 Solaris 10 & RHEL/CentOS 4/5 要如何設定。

Solaris10
參考:
  1. Solaris 10 - IPFilter 防火牆
  2. IP Filter FAQ
其實 IPFilter 的功能很強,透過規則的組合可以達到非常細膩的控制,在參考資料中就可以看到一些範例。要限制可透過 ssh 連線的網域白名單就簡單多了,步驟如下:

Step 1: 確認 pfil & ipfilter service 均已啟用

  • 執行 svcs pfil ipfilter,兩個服務的 STATE 應顯示為「online」。
  • 預設 pfil 服務是啟用的,而 ipfilter 則是 disabled,只要執行 svcadm enable ipfilter 就可以啟用 ipfilter 服務。

Step 2: 修改 ipfilter 設定檔 /etc/ipf/ipf.conf

  • 依序加入以下設定 (順序非常重要,block 的設定要放在最後面):
    pass in quick log proto tcp from 10.10.10.0/24 to any port = 22
    pass in quick log proto tcp from 10.10.11.0/24 to any port = 22
    block in log proto tcp from any to any port = 22
  • 上述設定可允許來自 10.10.10.0 ~ 10.10.10.255 & 10.10.11.0 ~ 10.10.11.255 的 ssh 連線 (inbound),其他 source ip 一律會被阻擋。這是比較簡單的設定法,只要把來自非法網域的 inbound traffic 擋住了,就不用考慮 outbound traffic 了。
Step 3: 執行 ipf -Fa -f /etc/ipf/ipf.conf,以 flush all 並重讀 firewall 規則表。可再執行 ipfstat -io 來確認目前inbound & outbound的規則為何。

Step 4: 在背景執行ipmon,紀錄被阻擋的連線
  • ipmon /path/to/ipf/log &
  • 被阻擋的紀錄範例如下:
    20/02/2012 14:14:07.082422 e1000g0 @0:4 b 10.1.xx.xx,40258 -> 10.1.xx.xx,22 PR tcp len 20 60 -S IN
RHEL/CentOS 4/5
參考:
  1. TCP Wrapper for added Security on SSH
  2. /etc/hosts.{allow|deny} 的設定方式
由於 /etc/hosts.{allow|deny} 設定比較簡單,且 RHEL/CentOS 4/5內建的sshd就有支援 TCP Wrapper,所以就用這種方式囉。

Step 1: 確認目前使用的 sshd 是否支援 TCP Wrapper
  • 執行 ldd /usr/sbin/sshd | grep libwrap,應出現以下 output:
    libwrap.so.0 => /usr/lib/libwrap.so.0 (0x00b22000)
Step 2: 編輯 /etc/hosts.allow (不可使用 10.10.0.0/16 表示法):
  • sshd:10.10.10.0/255.255.255.0
    sshd:10.10.11.0/255.255.255.0
Step 3: 編輯 /etc/hosts.deny (不可使用 10.10.0.0/16 表示法):
  • sshd:ALL

Step 4: 設定完畢後不需重起 sshd,會立刻生效。

Step 5: 查看被阻擋的紀錄

  • log 檔位置在 /var/log/secure,可執行 grep refused /var/log/secure 來查看
  • 範例如下:
    Feb 17 17:26:53 [hostname] sshd[3034]: refused connect from ::ffff:xxx.xx.xxx.xx (::ffff:xxx.xx.xxx.xx)

2012-03-03 Update:
有網友留言詢問此設定能否阻擋reverse ssh tunnel over http,找了一下資料,利用這篇文章中的作法實作之後,發現在連線時 source IP 會是 127.0.0.1,因此只要在 /etc/hosts.allow 裡面不要允許來自 127.0.0.1 的連線,reverse ssh tunnel 就不會通了。

雖然這篇的作法看來是沒有「over http」,但應該只要觀察 ssh 連線的 source IP,就可以利用 /etc/hosts.{allow|deny} 來阻擋了。


Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D