2010年3月13日

[輕鬆學會 Chart Control] 將圖表匯出至 Excel - 使用NPOI

好久沒開 Chart Control 議題了
剛好前陣子 Codeplex 出現可以輕鬆建立 Excel 檔案的 Library-NPOI
於是坎尼想說研究一下,看能不能把 Chart Control 匯出圖片到 Excel 中
沒想到只花了不到1小時就研究出來了,真的是很簡單 :D

I.準備

首先是下載 NPOI Library,並將它加入至專案中
其他相關說明可以參考 MSDN 上的文章
在 Server 端存取 Excel 檔案的利器:NPOI Library

坎尼這邊就不多話,直接進入今天主題

II.範例

首先開啟一個 Web 專案,把 NPOI 的 Library 加入專案中
建立一個 Web page,在畫面上放入一個 Chart Control
另外再放個 Gridview 來呈現資料 ,最後建立 Button 來觸發匯出的事件
nwc01 將畫面切換到 .cs 檔裡
引用這次範例中會用的兩個 Namespace:
NPOI.HSSF.UserModel – 建立 Excel 內容
NPOI.HSSF.Util - 建立相關樣式屬性

nwc00 
接著到匯出按鈕事件,建立 workbook 部分也跳過 (那不就什麼都沒講嗎? 毆
nwc03上面的 Code 就不詳細說明,主要是將 Chart 存成 Stream
再利用 NPOI 提供的圖片插入方法,把 Stream 轉為 Excel 可讀取的圖片格式
(注意圖片的匯出格式以及匯入格式)
最後再將整個 workbook 匯出即可 (見下圖)
nwc02 資料部分坎尼本來還想加上樣式,後來覺得有點麻煩就作罷 (喂!

III.結論

NPOI 真的是很好用的 Library,建議有需求的人都可以去下載來試玩看看

本次範例 下載

參考資料:
NPOI Codeplex
在 Server 端存取 Excel 檔案的利器:NPOI Library
用 NPOI 操作EXCEL--插入圖片

2010年3月11日

[Solaris] 調整設定檔之注意事項 & vi 使用技巧 (設定密碼重設不可使用3代以內的密碼 & ssh 登入失敗達 3 次 即斷線)

昨天因為資安的需要,動手修改了 19 台 Solaris 主機的設定,以下記錄過程中遇到的問題 & 發現的小技巧。

我要實作的設定包括:
  1. 密碼重設不可使用3代以內的密碼:修改 /etc/default/passwd 檔案,設定 HISTORY=n (n代)
  2. 帳號登入失敗達3次即斷線:修改 /etc/ssh/sshd_config 檔案,設定 RETRIES=n (輸入密碼時可錯誤 n 次,第 n+1 次輸入錯誤時即斷線)。設定完畢以後要 restart sshd daemon,方法請參考 solaris restart sshd 一文中最下面的一個回應,以 root 身分執行此指令:/lib/svc/method/sshd restart。(在 Linux 上 restart sshd daemon 的指令為:service sshd restart,或者 /etc/rc.d/init.d/sshd restart)
以上的設定都可參考 Solaris-強化密碼的安全性一文中的說明。

在修改設定檔時必須要使用 vi 這個編輯器,跟友善的 Linux 不同,Solaris 上的 vi 相當的難用(或者該說很難上手),因此我首先參考的是 vi editor Quick Reference 這篇文章,通常都是以 vi 打開欲編輯的檔案後,移動游標到想要修改的那一行(例如:#HISTORY=0)的上一行,按「O」新增一個空白行,再手動重新打一次我想要的設定值(例如:HISTORY=3),接下來按「Esc」跳出編輯模式,把游標移到原本的那一行(#HISTORY=0),按「dd」把這行刪掉。

為什麼要這麼麻煩呢?總之 vi 這東西在 Solaris 上很難用就對了,用這樣的方法是我覺得最單純的(雖然看起來很蠢),如果之後有空會再慢慢研究更好的修改方式。

補充1:雖然修改 /etc/default/login 檔案也可達到如修改 /etc/ssh/sshd_config 的作用,但是很多位於 /etc/default 目錄下的檔案都是連 root 都沒有寫入權限的 (例如 /etc/default/passwd),因此我在調整設定前必須要先下 chmod u+w passwd 指令,讓 passwd 檔案變成可以寫入,調整完設定值之後,再下 chmod u-w passwd 指令來移除寫入權限,以確保系統檔案的讀寫權限在調整設定前後維持一致。

由於修改讀寫權限太麻煩了,而且在 Linux 系統中沒有 /etc/default 這個系統內建目錄,必須修改 /etc/ssh/sshd_config 檔案,為了讓 Linux 和 Solaris 所修改的檔案相同,未來方便維護,因此在 Solaris 上也採取修改 /etc/ssh/sshd_config 的方式。

補充2:Solaris 的設定檔有個跟 Linux 設定檔非常大的不同,那就是每一行設定值的後面不能摻雜註解!舉例來說,以下這行設定在 Linux 上可以正確執行:

MaxAuthTries 3 #modified by Tim

但是在 Solaris 上就不行,這行設定值會變成無效!(然後系統就會套用該設定值的預設值) 要讓設定值正確的生效,必須把 Linux 上面的一行拆成以下兩行:

#modified by Tim
MaxAuthTries 3

以上就是昨天調整 Solaris 主機設定的心得啦,希望以後跟 Solaris 可以越來越熟 :O)

2010年3月10日

[ASPNET] 動態更新 Gridview 上的資料

前陣子坎尼在 MSDN 論譠上看到有人問
「如何每10秒刷新一次資料?」
今天就抽個空寫了個範例來介紹一下如何動態刷新頁面上的資料

I. 流程說明

此次的流程很簡單:
Gridview 顯示資料 –> 使用者修改資料 –> Gridview 刷新資料
當然,是以 AJAX 做為 Client-side 及 Server-side 的溝通橋梁

為了呈現方便,坎尼用了 iframe 分別讀入資料修改頁及呈現頁
dgd01資料部分在此次範例中是以 xml 檔來存取資料
資料欄位含有:ID(唯一值)、Name 及 Age
dgd02
明顯地,這是人蛇集團的童工目錄

II. 程式說明

Gridview 的呈現和資料的修改坎尼就不贅述

最主要的是下列這段 Javascript
可針對每個 Table Row 進行取 ID 的動作,並透過 AJAX 到後端取資料
dgd03取得資料的部份 Code
dgd04 
以下為實際執行畫面
Kenny 謊報年齡所以偷偷的進系統修改
dgd05 在人蛇集團還沒發現之前,身份證上的年齡還是假造的
dgd06 被發現了,所以拿到一張新的身份證繼續行騙
dgd07
換頁之後一樣可以做部分更新 (注意 ID 一定要是唯一值)
dgd08
如何,很簡單吧 :P

III. 結論

其實以現在的開發語言而言,很多問題都已經不是無解或難解
重點是如何將習得的技術拼湊起來,成為新的應用 :)

此次的 範例下載
2012/6/7 調整

2010年3月5日

利用 Joomla 做資產管理 (Asset Management) -2 : 安裝過程紀要 (Linux)

在上一篇文章中,我紀錄的是在 Windows 平台上的安裝過程,今天開始在我的 Red Hat Linux 測試機上安裝 Joomla,因此再來補完一下。基本上也是透過 Joomla 內建的 installer.php 進行安裝,以下記錄在 Linux (RHEL5) 上要特別注意的地方。(安裝 AMP 還在卡關中,等之後搞清楚再來補補完 … 用 RHEL 安裝預設的 AMP 套件就可以繼續往下安裝 Joomla 了。)
補充0:Joomla 的發音
前陣子看到一篇好文:網路流行新名詞 Linux, Google, Skype, …的正確念法,因此對於 Joomla 這個拼字看起來很特殊的字也找了一下正確的發音,以下是兩個比較有代表性的參考資料 (都是相同的發音):
希望大家都可以唸出正確 (比較順耳) 的發音阿 XD
補充1:在安裝 Joomla! 1.5.x 的時候,無法安裝預設範例資料的解法。如同此文中所說,我在 RHEL 中如果把 configuration.php 檔案設定為可以寫入,就會遇到「ERROR: The XML response that was returned from the server cannot be processed」的錯誤訊息,按照此文中的解法即可正確安裝預設資料。
補充2:調整 Joomla 網站首頁顯示的內容
Joomla! 安裝完成後,若不安裝預設資料,也不安裝中文化支援,則網站首頁會長的像下面這樣,非常簡潔:
joomla_English_default_blog
若有安裝預設資料以及中文化支援,網站首頁就會看到很多資料:
joomla_Chinese_default
如果要讓網站首頁變得簡潔一點,有以下幾個設定可以調整。首先是模組管理:
joomla_module_management
再來是首頁管理:
joomla_homepage_menegement
補充3:手動安裝中文化支援
參考: Joomla! 123 圖解架站教學網-安裝 joomla 繁體中文化,language 檔的安裝目錄分成以下兩個層級:
  • Site (網站): [Joomla installation folder]/language
  • Administrator (管理區): [Joomla dir]/administrator/language
將從 Joomla! 123 圖解架站教學網下載的 joomla 完整安裝的主程式解壓縮以後,在相對應的 language 資料夾中,把各語系的 .ini 檔複製到 Joomla! 安裝目錄內相對應的 language 資料夾中,再到管理員後台設定預設語言即可。
.ini 檔的內容類似下圖:
joomla_i18n
補充4:查看 Joomla 的系統資訊
進入管理員後台-> 說明->系統資訊,包括 Linux、Apache、MySQL、PHP 以及 Joomla 的版本:
joomla_system_info
補充5:查看 Joomla 內建的說明文件
進入管理員後台-> 說明->Joomla!說明
joomla_builtin_help
接下來說明 Joomla 擴充套件 (extensions) 的安裝,以 Fabrik 套件為例:
步驟一:賦予 apache 對各目錄的寫入權限 (command: chmod o+w [dir])
  • [Joomla dir]/administrator/components
  • [Joomla dir]/administrator/language/en-GB
  • [Joomla dir]/components
  • [Joomla dir]/language/en-GB
  • [Joomla dir]/media
註:
  1. 由於安裝套件也是透過 joomla 的 web 介面,因此對於 OS 來講是以 apache 這個帳號存取 file system。
  2. 不用更改父目錄的存取權限! (例:不需要變更 [Joomla dir]/administrator 目錄的權限,僅需變更 administrator 下的 components 目錄權限即可)
  3. 在 WinXP SP3 上面安裝 Fabrik 的話,基本上不用擔心權限設定問題。
步驟二:進入管理員後台 –> (上方工具列) 擴充套件 –> 安裝/移除
install_component_menu
下一個畫面長這樣:
Joomla_component_installation_UI
要注意的是,把 component 解壓縮到 tmp 目錄下後,UI 上的安裝目錄路徑要寫:/var/www/html/Joomla/tmp/[component name] 才可以 ([component name]也是一個目錄)。
一切順利的話,不用幾秒鐘整個 extension 就安裝成功啦!
步驟三:手動建立以下目錄,並解壓縮相對應的 tar.gz 檔 (tar –xzvf)
  • Joomla/components/com_fabrik/libs
  • Joomla/components/com_fabrik/views
註:
  1. 不知道為什麼自動安裝檔在這個步驟都會失敗 (在 Windows 上不會有這個問題),但是手動執行以後網站都可以正常運作。
  2. Fabrik 套件的 libs.tar.gz 檔案解壓縮後不會自動產生 libs 資料夾 (同理,views.tar.gz 也不會自動產生 views 資料夾),有點麻煩。
步驟四:開始使用 Fabrik!
安裝好了以後,在管理員後台的「元件」中,就會看到 Fabrik 套件的管理 UI 了:
fabrik_admin_UI
包括 Tables、Forms、Groups、Elements 都是需要設定的:
fabrik_admin_UI_homepage
至於詳細的設定,就留待下一篇再來細談囉!

本系列其他文章:

2010年3月2日

在 IBM x3650 上安裝 RHEL5 & 設定 RAID5

昨天灌好一台 IBM x3650 Server,組長有提到要先 survey 要做 RAID5 or RAID6 比較好,所以我找了以下資料:
  1. RAID (zh.wikipedia.org) : 針對各種 level 的 RAID 技術的簡介
  2. Chapter 3. Redundant Array of Inexpensive Disks (RAID) (redhat documentation) : RHEL 的 RAID 說明文件
  3. RAID5 到 RAID6,數據安全提高多少?: 這篇討論的蠻深入,還有提到 RAID 機制背後的數學基礎
  4. RAID-6 的必要性 : 這篇蠻白話的,看完上面的基礎文章後可以很快瞄一下
看完 wiki 以及上述第三篇資料以後,由於這台 Server 是要給內部使用,不是對外提供服務給用戶使用,因此為了較高的讀寫效能,我決定採用 RAID5。
接下來又找了怎樣在 RHEL 上設定 RAID5 的資料:
  1. Chapter 10. Software RAID Configuration (redhat documentation) : 又是 RHEL 的說明文件,蠻詳細的,可惜只有舉 RAID1 為例。
  2. 3.3 Hardware RAID versus Software RAID (redhat documentation) : 看到這篇我才注意到 RAID 還有分 Hardware/Software,基本上用 Hardware 來做效能會比較好,但是硬體當然比較貴。但這篇對於 Hardware RAID 的說明很少。
跟組長確認過之後,確定要以 Hardware 來做 RAID,於是又找到另一篇參考資料:
這篇就講的很清楚了,除了 Hardware/Software RAID 之外,另外提出一種以主機板晶片來協助做到 RAID 機制的作法,稱為 ATA(SATA) RAID / BIOS RAID / Fake RAID (假的XD)。雖然這篇文章是以華碩主機板+Fedora Core 5的環境為範例,但其實在 IBM x3650 + RHEL5 的環境下步驟也是一樣的,簡單來說就是以下幾個步驟:
  1. 開機後,按「Ctrl+A」進入 IBM ServeRAID Controller 設定畫面 (這張就是內建在 IBM Server 中的硬體 RAID 控制卡,設定畫面看起來/操作上跟 BIOS 差不多)。(為什麼我會知道要按 Ctrl+A 呢? 因為開機的時候螢幕上面有印出這個訊息嘛~)
  2. 如果目前 Server 上已經有設定 Disk Array,就先把它砍掉。
  3. Create 一個新的 Disk Array,把所有的硬碟都選進去這個 Array,幫這個 Array 取個名字,並且把 RAID level 設定為 RAID5,之後系統會自動處理好剩下的設定。
  4. 退出 ServeRAID Controller 的設定畫面,此時應該會看到成功建立起 Disk Array 的訊息。
  5. 以 RHEL5 安裝光碟重新開機,開始安裝 RHEL5。此時對 RHEL 來說,所有的實體硬碟在邏輯上會被 group 成一個稱為「sda」的硬碟 (也就是對 OS 來講只看到單一一顆硬碟啦),所以接下來就按照一般切割 partition 的方式,把「/」、「/boot」、「/home」、「/usr」、「/var」、「/tmp」、「/swap」切一切就好啦!比 Software RAID 簡單很多!(不用自己設定 RAID Device/RAID Group)
這台 Server 上共安裝四顆實體硬碟,每一顆的容量都是 136.6G,總和為 546.4 G,做成 RAID5 之後,可用空間剩下 400.85G,耗損率約為 27%。
以上就是第一次在 IBM Server 上安裝 RHEL & 設定 RAID5 的心得,用硬體來做實在是太簡單啦 XD

2010年3月1日

iPhone App 推薦-1: 如何免費(不用信用卡)申請各國 iTunes Store 帳號

上次介紹過 iPhone 的操作介面使用心得,接下來的重點就是 AppStore 上多達 14  萬個應用程式啦!

第一次使用 iPhone 會進入首頁,裡面都是內建App:訊息、行事曆、相機、地圖、天氣等等,如下圖:
003
最下面則是最常用的幾個功能,包括打電話、收發郵件、上網瀏覽,和 iPod。關於內建 App 的使用方式還有 iPhone 基本的操作,可以參考以下網頁:
接下來就是申請 iTunes Store 的帳號啦!
由於 iTunes Store 有台灣版,因此預設應該會連到台灣版的網站,裡面的內容就是 AppStore:
iTunes Store Taiwan
對於大部分使用者來說,在 App Store 就可以下載到絕大多數好用的 App,但是美國的 iTunes Store 的商品比台灣多太多了,包括電影、影集、音樂等等:
iTunes Store US
至於美國的 iTunes Store 有啥好康呢?可以參考手機王:善用你的 iTunes Store 帳號吧,包括以下幾點:
  • 每週送歌曲:只要你登入 iTunes Store 的首頁,中間就有一個大大的圖寫著「Single of the Week」,讚啦!(送的歌曲都是挑選過的)
  • 下面還有個 「free on iTunes」專區。按一下「See All」就可以知道本週送什麼東西囉!
  • 除了免費音樂之外偶爾運氣好會看到免費的電影喔!
看到這邊就很想趕快申請一個美國帳號阿!那要怎麼作呢?
申請台灣帳號很簡單,若要申請其他國家的帳號,我參考的是 m01 的教學:[教學]免費(不用信用卡)取得各國Itunes Store帳號,照著教學內容一步一步往下作就 ok 啦!
iTunes Store create account 
填寫地址時,Apple 只會檢查地址格式是否正確,反正沒有要真的買東西,所以格式對了就好。我用的是微軟總部的地址 XD
在申請過程中,如果輸入的資料格式錯誤,會看到清楚的錯誤訊息:
iTunes Store clear error message
要注意的是,zip code 是 5 碼,必須要跟你選的 county 可以 match,電話號碼則是前3後7,例如:091 - 2345678,這樣就可以啦!
iTunes Store 美國帳號的使用上沒什麼問題,但是有些 App 或者網站是會鎖 IP 的,例如 Pandora Radio,還有 CNN:
009 (4)
除此之外,絕大部分的 App 在台灣都可以正常使用喔!
以上是申請 iTunes Store 帳號的介紹,之後會再慢慢介紹好用的 App :D

[Linux/Unix] 養成好習慣,使用 passwd 指令要註明欲變更的帳號

今天維護廠商要以 root 帳號登入某台 linux 主機的時候發現無法登入,密碼不知道被誰改掉,查了老半天之後發現兇手就是我 Orz(不過廠商還不知道這件事情=.=) 在將 root 密碼還原以後,從 /var/log/secure 裡面就可以看到 pam_unix 模組所寫的 log 了。


根據 log 可以看出,造成這次意外的原因在於上週剛好進行設備交接,因此在該主機上建立了我的帳號,但我在沒注意到目前使用者身份是 root 的情況下使用 passwd 指令變更密碼,才會造成這樣的結果。因此,養成好習慣,在變更系統狀態前先確認目前的使用者身份是誰,思考一下會不會造成副作用,是很重要的!

先來看一下 passwd 指令的說明:
passwd_1

重點在於 [username] 這個參數,此參數若忽略,表示要變更的是「目前下達 passwd 指令的使用者」的密碼;若加上 [username] 參數,則可變更指定使用者的密碼 (當然前提是執行指令的 user 要有足夠的權限)。由於大部分時候都是用自己的帳號在系統中操作,因此下 passwd 指令也只會影響自己的密碼,因此都養成習慣忽略掉 [username] 參數,這時候如果不小心用「su」或「su -」指令切換為 root 身份,就有可能不小心變更到 root 的密碼 。

雖然下達 passwd 指令後螢幕上會印出一行:Changing password for user [username],但是有時候就是沒注意到,當成功變更密碼後,螢幕上印出的是:passwd: all authentication tokens updated successfully.,看到 successfully 這個字眼以後就覺得很放心,不會想太多了 =.=
所以,在變更 root 密碼的過程中,螢幕上會看到以下資料:

passwd_2

結論:養成習慣加上 [username] 參數是最好的作法,這樣在下指令的時候就會很清楚要變更的密碼是屬於哪個使用者的,例如確實要變更 root 密碼時:
passwd_3

都已經打了「passwd root」了,總該有自覺現在是要變更 root 的密碼了吧!
補充1:雖然上面有出現「BAD PASSWORD: it is based on a dictionary word」的警告訊息,但系統還是讓我成功變更密碼了,為什麼呢?那是因為目前我的執行身份是 root,而 root 的權限是最大的,可以忽略在 pam_unix 模組中所設定的任何限制!

之所以要補充這一點,是因為前陣子我在練習實作帳號管理的功能時,一開始都用 root 帳號登入 (這也是因為當時沒有限制 root 不能以 SSH 連線登入,but … 這個改天再講好了),導致我設定的「密碼必須大於 6 個字元」等等限制看似完全無效,因為 root 是可以為所欲為的!害我一直覺得很奇怪,不是有「BAS PASSWORD:」的 warning 嗎,為甚麼系統還是可以讓我變更密碼 Orz 這又說明了「隨時隨地都要注意到目前是以甚麼身份下達指令」的重要性,否則可是會平白無故的浪費很多寶貴時間的阿!

補充2:若某帳號有 sudo 權限,則 sudo passwd 命令修改的會是 root 的密碼,如下圖:
passwd_4

而透過 sudo 下的指令在 /var/log/secure 中會留下紀錄:
passwd_5

Google Spreadsheet 裡用規則運算式

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