2015年1月31日 星期六

UX & UI之間的相互關係

原文出處: 國立臺灣大學 計算機及資訊網路中心 電子報 第0027期
                  作者:楊家榮 / 計算機及資訊網路中心程式設計組幹事

日常生活中大家常把「UI」與「UX」混淆使用。UX、UI兩者有何不同呢?本文從網頁設計角度來簡單說明UX & UI之間的相互關係...
前言日常生活中大家常把「UI」與「UX」混淆使用。UX、UI兩者有何不同呢[1]?從字面上解釋,UX是User Experience使用者經驗的簡稱,UI則是User Interface使用者介面的簡稱。UX以使用者為中心,涵蓋範圍極廣,其包含:介面設計、視覺風格、色彩搭配、可使用性、程式效能、功能運作、心理分析等元素,而這眾多元素之間也是相互關聯與影響,無法被分割的。而UI就是使用者與電腦之間進行溝通的介面,利用電腦的功能去「輸入」來達成「輸出」的成果,而輸入與輸出的規劃就是介面,透過介面來操作電腦完成所需。

詳文

2015年1月30日 星期五

UI 設計

原文出處: InSide
UX 設計師寫給 UI 新手的 7 個法則(上)
UX 設計師寫給 UI 新手的 7 個法則(下)

7個法則:
1.光線來自天空
2.黑白優先
3.增加空白空間
4.學會在圖片上呈現文字(第2部分)
5.做好強調和淡化(第2部分)
6.只用好的字體(第2部分)
7.善於借鑒優秀的作品(第2部分)


A Good User Interface: 外國知名設計師Jakub Linowski網站  http://goodui.org/

JavaFX Scene Builder

文章出處: JavaFX Scene Builder : CodeData 黃嘉輝副教授

http://www.codedata.com.tw/java/javafx-scene-builder-fxml/

MySQL 替代品: MariaDB

原文出處: 毫無理由使用MySQL:MariaDB - 自由軟體鑄造場
http://www.openfoundry.org/tw/news/8974

MySQL 曾是(仍是)最受歡迎的開放源碼資料庫,然而在 Oracle 主導下卻正逐漸沒落。出自於 MySQL 創辦人 Michael Widenius "Monty" 的另一套開放源碼資料庫 MariaDB,最近則日漸普及,不僅成為主要開放源碼作業系統的預設資料庫,更在 WikiMedia 等重要組織與企業,取代 MySQL 的地位。日前 SkySQL 與 MariaDB 的總公司 Monty Program Ab 進行合併,擴編了開發者團隊。以下是 Monty 日前進行的專訪,談到了資料庫領域的改變。
問:MySQL 是全球主要專案與企業的預設資料庫,MySQL 如此成功的原因為何?它有哪些特質?是其開放源碼的特性、技術優勢、或是 Sun 的行銷能力?
Monty:MySQL 在被 Sun 買下前就已經很普及了,這也是 Sun 之所以買下它的理由之一。
MySQL 之所以受到如此歡迎的原因是:
  1. 自由軟體/開放源碼
  2. 我們從一開始就對用戶非常友善並且樂意提供協助
  3. 前五年我個人只為了協助用戶就寫了 3 萬封電郵
  4. 雙重授權
  5. 讓我們賺到錢好雇用更多人加入專案
  6. 讓我們吸引到投資者
  7. 從一開始釋出就在大量平台上測試 MySQL 二進位檔案
  8. 當我們開始 MySQL 時,多數自由軟體仍僅有原始碼,也沒有對所有平台做測試
  9. 從一開始我們就設定好,要讓所有人都可以在 15 分鐘內取得並執行 MySQL
  10. 我們很幸運在對的時機推出對的產品
  11. 當我們開始時,市場沒有自由 SQL 資料庫的競爭者


問:兩大開放源碼勢力都出自於芬蘭人之手,也就是 Torvalds 與 Widenius。芬蘭的教育系統是否鼓勵這些行動?
Monty:在這兩個案例中,教育系統對產品並無太多影響。
我想比較多是出自於芬蘭人的本性,我們很固執又討厭放棄,即使其他人都說我們做的事一點用都沒有,而且我們不可能與大公司競爭。
就 Linus Torvalds 與我而言,我們都有一種天分,可以讓和我們談過的開發者,對我們所做的事感到興奮。我們兩個人的母語都不是英語,也許這一點有助於和世界各地的開發者進行溝通,因為從一開始我們不設限加入專案的人必須會說流利英語。
問:你曾對 MySQL 賣給 Oracle 有所疑慮(你的疑慮也成真了)。MySQL 的普及率最近正在下滑。你認為下滑的原因為何?Oracle 做錯了什麼?
Monty:是的,MySQL 近來沒落了,不過它所流失的用戶群,多半都跑向 MySQL 生態系的其他產品,像是 MariaDB。
Oracle 做錯的事有:
  1. MySQL 新的企業延伸套件採取封閉源碼
  2. 資料庫的臭蟲不再公開
  3. 不再積極更新 MySQL 的公開代碼庫
  4. 未能快速傳達或修復安全問題,這一點讓 Linux 散佈套件對 Oracle 很不滿
  5. Oracle 選擇移除功能,而非修正臭蟲
  6. MySQL 5.5 的新程式碼不再有測試案例
  7. 來自 Oracle 的部分新程式碼好的出乎意料,但不幸的是品質參差不齊,相當可觀的一部分在我們納入 MariaDB 前,更需要重新改寫


另外,或許最糟糕的是,社群沒辦法與 Oracle 的 MySQL 開發者合作。因為:
  1. Oracle 不接受程式修補
  2. 沒有公開的發展藍圖
  3. 沒有任何方法可以和 MySQL 開發者討論實作細節以及目前程式碼的運作


問:在此同時 MariaDB 逐漸受到重視,對一般用戶而言,MariaDB 與 MySQL 的差異為何?
簡單來說:
  1. MariaDB 比 MySQL 多了 30 個人年以上的開發工作量
  2. 更多功能
  3. 更快
  4. 更穩定
  5. 安全問題更少


最簡單的答案是,毫無理由不選擇 MariaDB 5.5 來取代 MySQL 5.5,這個答案下一版本依然適用。
問:MariaDB 如何改變資料庫領域?MySQL 仍在 Web 上占有主導地位,有任何鼓勵網路託管服務供應商改用 MariaDB 的計劃嗎?
Monty:有許多網路託管服務供應商已經支援 MariaDB。你只需提出詢問,許多供應商就會提供 MariaDB。
我們正在積極遊說網路託管服務供應商,請他們公開支援 MariaDB。然而這的確是個耗時的工作。
問:MariaDB 可以用來直接取代 MySQL。撇開雙方在技術上的相似性不談,這兩個專案在開發與授權上的主要差異為何?
Monty:MariaDB 是由具有開放發展藍圖的社群所開發,任何人都可以輕易參與其中。MySQL 被發展成一個封閉源碼的專案,只有 Oracle 和少數 Oracle 選出的公司才能參與。MariaDB 和 MySQL 一樣採取 GPL,不過 MariaDB 有給 C 和 Java 用的 LGPL 驅動程式。我們也在開發 LGPL ODBC 驅動程式。如果你使用了這些驅動程式,在大多數情況下,你並不需要購買 MySQL/MariaDB 的授權。
問:從 MySQL 轉移至 MariaDB 的難易度?
Monty:只是小事一樁。只要移除 MySQL,然後安裝 MariaDB。你的所有工具,連接程式都可以如常運作。你也不需要匯出和匯入資料。格式與檔案名稱都是相同的。
問:在 WikiMedia 基金會等組織,或是 openSUSE 與 Fedora 這些 GNU/Linux 散佈套件上,我們已經看到若干採用 MariaDB 的例子,但透過 Monty Program Ab 進行商業部署呢?我的意思是,你公司的營收現況為何?
Monty:Monty Program Ab 從某些公司取得了 MariaDB 的開發資金。此外,Monty Program Ab 也從提供第三級支援給 SkySQL 等公司而獲得資金。
問:SkySQL 如今與 Monty Program Ab 合併,這對 MariaDB 的整個開發者基礎有何影響?
Monty:當最好的 MySQL/MariaDB 開發者、支援者、訓練人員、銷售人員齊聚同一家公司,我們如今更能夠提供最好的服務,給所有的 MySQL 與 MariaDB 用戶。
問:你如何確保 MariaDB 不會有和 MySQL 一樣,被其他公司買下的命運?
Monty:這就是我們創建 MariaDB 基金會的原因。MariaDB 基金會是該社群發展的驅動力,也是 MariaDB 伺服器商標的所有者。如此即可確保再也沒有開出 MySQL 新分支的必要了。MariaDB 永遠會是自由且屬於社群的專案。


相關網址



  1. 毫無理由使用 MySQL:MariaDB、MySQL 創始者 Michael Widenius 的訪談
    http://www.muktware.com/5565/there-no-reason-all-use-mysql-mysql-mariadb-founder-michael-widenius

2015年1月28日 星期三

找回 Windows 8 / Windows Server 2012 的開始按扭

原文出處: 找回 Windows 8 / Windows Server 2012 的经典的开始按钮和开始菜单 (博客: 辛亚平的专栏 )
http://blog.csdn.net/yapingxin/article/details/8519427

坊間傳說的Windows8.1將會重新恢復開始按鈕,但是又見到比較可靠一點的博文說,那個啟動按鈕並不能帶來經典的開始菜單,真是令人空歡喜一場。所以Classic Shell必然繼續成為Windows 8必裝軟件(沒有之一”)。

2015年1月21日 星期三

JPA 技術文章

原文出處: http://www.51140.com/show/1431263.shtml

JPA全稱Java Persistence API.JPA通過JDK 5.0註解或XML描述對象-關係表的映射關係,並將運行期的實體對象持久化到數據庫中。

Sun引入新的JPA ORM規範出於兩個原因:
其一,簡化現有Java EE和Java SE應用開發工作;
其二,Sun希望整合ORM技術,實現天下歸一。

教學網:  http://www.tutorialspoint.com/jpa/


2015年1月13日 星期二

何謂 SA SD SE

原文出處: 網繹數位科技網頁設計公司 Kevin
http://www.eki.com.tw/news/20080610155758.htm

SA System Analyst, 系統分析師
SD Systems Designer, 系統設計師
SE Systems Engineer, 系統工程師



做軟體開發專案規劃時, 常會碰到助理問我一個問題, SA,SD和SE的差別在那裡 ?




這個問題我以前也有過, 還頗為困擾, 系統分析和系統設計及系統工程到底有什麼差別 ? SA和SD的工作又有何不同 ? 這兩者的養成教育又有何差異 ?在過去, SA,SD及SE的確很難區分, 甚至這些角色常常會透過軟體工程師來混合發展。隨著IT領域的發展, SA,SD及SE漸漸的成為了大型專案必需要的專業分工, 這三者間是有相當的差異的, 不管是養成過程, 甚或是未來的發展, 都大相徑庭, 而要成為一名稱職的PM, 是要能區分出這三者的差異, 才能妥善的安排工作的。




[SA System Analysis,系統分析師]

SA是 System Analysis 的縮寫, 一般稱為系統分析, 主要的工作就是透過一系列的分析工作, 把客戶想要的結果產生方式, 以各種文件表達出來, 讓開發團隊可以根據這些文件實作出這個結果。

這樣的解釋比較文縐縐一點, 用個通俗一點的方式比喻, 就像是要做出一道宮保雞丁時, 就會有食譜一樣, 裡面會介紹需要的材料及做菜的順序, 然後裡面也會強調要以怎樣手法才能產生出某種效果, 以促進色香味。

這樣的過程裡, SA是較為偏重於在工作流程和處理邏輯的, 透過SA, 開發團隊才可以理出整個系統的架構, 一種做事的脈絡, 以及系統和工作間的關連性, 最重要的, 是這些結果都會被SA呈現在文件中, 而非放在少數人的腦袋裡。




SA不僅止是要針對電腦裡的東西去運作及規劃, 還包括了現實世界裡的實體流程及組織。在很多的情況下, 配合新系統的組織及流程, 是要由SA來執行的。總結起來, 在一個開發案裡, SA執行以下的工作:




· 藉由系統需求書, 使用者的現有標準作業流程來建立出符合期望的新作業流程及搭配流程的系統功能及模組規劃

· 依據功能及模組規劃案, 定出初步的資料庫內容及系統與使用者間的權限搭配規範

· 定出各個軟體零件的規範, 如物件, 函數庫, ...等等

· 設計新的標準作業流程, 並把系統功能或模組綁入這些流程中

· S.A依據客戶的環境及需求, 尋找合適的SD來搭配




而SA也有以下的特色:

· 對於系統在怎樣的環境及用什麼開發工具, 並不十分在意, 良好的S.A產生出來的文件, 使用不同的開發工具都應該可以完成, 產生相同的結果, 但那一種最合適, 由SD決定

· SA偏重於流程及執行邏輯的表達

· SA著重於軟體邏輯, 對開發工具的學習並不是十分重要, 所以會一種語言即可, 主要是以該語言工具來實踐邏輯觀。

· SA一定要有全局觀, 也就是不能拘泥於一個角度或是一個局部去思考問題, 這一點是尋找優秀SA時最困難的。因為在規劃模組及功能時, 一定要同時考量到所有直接相關及間接相關的程序及邏輯問題, 因此要有全局觀。

相較於SD, SA更側重在邏輯及工作順序搭配的表達, SA並不需要去關切使用什麼作業系統或是什麼開發工具, 如前特色所述, 好的SA文件, 可以用任何一種開發工具來實現。當然, SA不受限於IT技術, 但卻會有專業領域的限制。

很少有SA同時專精於數個領域的, 熟悉汽車業運作規範的SA, 在金融業的開發案裡, 就很難討好, 反之亦然。但SD沒有這種限制, 基本上SD可以和任何行業的專案開發團隊配合運作。

會如此的原因是SA是偏重於流程及管理分析及重新再造工作的。而作業流程, 除了少數領域裡共通性高, 在核心流程上, 是需要長期鑽研的。前面提及的汽車及金融業就是一例。




所以, 一個SA必需具備以下的能力,資歷及專業訓練:




1. 至少熟悉一種程式開發語言

2. 熟悉軟體工程, 對於開發工具的元素及特色熟悉

3. 對管理制度或作業流程設計熟悉

4. 熟悉UML或類似的系統描述工具

5. 邏輯能力良好

6. 良好的溝通能力, 主要作為瞭解需求之用

7. 相關的業界熟悉度




在三者之中, SA是最接近PM的, 所以SA在做生涯規劃時, 不妨以PM做為下一個發展的專業目標。




[SD Systems Designer, 系統設計師]

一般來說, SD在生涯規劃裡, 並不是SA或是PM。當然, 一定要硬來一次也沒有什麼不可以, 但要走這條路, 就要趁早轉職, 因為SD畢竟是較為幕後的工作, 在與客戶的溝通協調上, 並不會有太高的要求, 也較不需要公司管理層面的全局觀。




表面上看起來, SD沒有SA那麼多的工作要求, 但實際上SD是最需要天賦的工作, 不管是畫面的構成, 操作的手順及調整, 甚至於元件的定義及物件的規範, 全都需要一些天賦。很多軟體, 功能很強, 但怎麼看怎麼不順眼, 或者怎麼用就怎麼憋扭, 功能帶來的效益, 全都被這些毛病給遮蓋掉了, 這就是SD的問題。




另外, SD也扮演了系統最佳化的推手。SA所規劃出來的要求及佈置, 都只是邏輯上的構思, 在不同的工具上, 可能有更好的方法可以表現, 也可能會難以展示, 這都需要藉由SD對使用環境及開發工具的瞭解, 來進行調整和規劃。




舉例來說, 同樣是一套財務軟體, 在WINDOWS XP, MAC, X WINDOWS下, 就會有很不一樣的展現模式和技巧。如果再搭配上不同的開發工具, 如C++, JAVA, .NET, PHP, ...那差異更多。對SA而言, 這些東西他都不用去考慮, 但SD就不同了, 這些不同的地方, 並不僅僅只是如此而已, 有時還會包括了開發成本及時間問題, SD的重要度, 由此可知。




在一個客製化專案裡, SD的工作內容如下:




· 設計畫面元素規範

· 設計頁面結構及規則

· 設計系統操作畫面, 並編定欄位規範及防呆處理

· 設計權限管理與系統操作機制

· 撰寫使用手冊

· 調整DB之各項定義, 使其符合畫面欄位規範及操作搭配

· 配合SA撰寫系統開發文件, 供程式師CODING之用

· 撰寫UI(使用者介面)測試計劃書




而做為一名稱職的SD, 以下的條件, 是必要的:




1. 至少對一個作業系統極為熟悉, 對於這個作業系統的各個元件特性及API, 有充分的瞭解

2. 熟悉2種以上的開發工具, 而專案所需的工具, 必需是其擅長的之一, 其熟悉度包含了標準安裝裡的各個函數庫, 系統常數, 物件定義, 語法, 主要的輔助工具開發廠商, 及重要的工具使用方法

3. 具一定的美學感

4. 至少能使用一種繪圖工具軟體

5. 曾經擔任職業軟體工程師三年以上




可以這樣說, SA給了系統靈魂和神經系統, SD則是給了系統軀體和外觀, 兩者的結合, 才能產生出正確, 美觀又好用的系統。如果你覺得自己是個不太愛和太多人打交道的IT人, 又對使用者介面有那麼點執著及天賦, 那麼, SD絕對是適合你的好選擇。




[SE Systems Engineer, 系統工程師]

就某種角度來看, SE對PM而言, 算是萬金油, 只要做IT專案, 那就一定用得上, 差別只是要選那一個專業的SE而已。系統建置安裝要SE, 使用者環境要SE, 甚至到硬體選擇及佈建, 都要用到SE, 有什麼IT專案跟這個沒有關係呢 ?




當然, 雖然SE是到處都吃得開, 但相對的也是專案裡面最沈默及少有聲音的一群。他們的工作基本上就是建構出一個可以執行系統的環境, 系統要如何展現, SE可以給SA和SD一些建議, 但建議時機通常都是在系統運行出了些非系統可以掌握的問題後。




系統工程師基本條件上, 和SD最為接近, 但有一點不同, 就是不需要有很好的軟體開發經驗, 也就是不太需要會寫程式。但要對作業系統, 服務器系統, 網路運用環境有相當程度的瞭解。




SE通常是三者中最為博學一員, 好的SE雖然不一定要程式寫的呱呱叫, 但卻不能對編程一無所知, 對作業系統及開發工具也要有一定的熟悉度, 甚至部份網管有關的工作也要有所涉獵, 所以算得上是專案裡的萬金油。




在專案裡, SE所要執行的工作如下:




· 規劃及建置系統執行環境

· 安裝及設定使用者端環境

· SERVER安裝及設定

· 提供環境設置竟見給SA及PM

· 最佳化系統可靠度及效度

· 撰寫可靠度及效能測試計劃書

· 對電腦及相關週邊設備有一定熟悉度




而一名SE則有下列基本要求:




1. 至少熟悉一種作業系統, 尤其是讓系統的設定及微調等相關技術

2. 至少熟悉一種網路伺服器作業系統, 對如何設定及最佳化熟悉

3. 曾任軟體工程師職務一年以上或熟悉一種開發工具

4. 對網路環境有一定的認識, 尤其是一些通訊設置

5. 熟悉可靠度及效能的評估方法, 並瞭解與系統環境相關之設定




基本上, 如果擁有了像SD一樣的技術背景及個性, 但在美學上實在令人不敢恭維, 那麼SE算是極佳的選擇了。一般而言, SE的下一個生涯規劃, 會比較偏重於技術性兵種, 像是DBA或是網管, 對於IT產品比較有狂熱或愛好的人, SE是極佳的出路。




[在專案中的運用時機]




基本上SE是萬金油, 只要是IT的案子裡就一定要塞一個SE進去, 因為沒有IT專案不需要使用工程技術的, 差別只在使用何種工程技術而已。在套裝軟體的導入專案裡, SE負責處理軟體使用環境, 解決非系統性問題, 安置及調整資料庫和網路環境, 然後安裝啟動。所有系統運行所需要的條件, 都要由SE來解決和處理, 但這些工作全都不會出現在眾人的面前, 但卻又重要無比, 算得上是幕後的英雄。




會同時運用到SA,SD及SE的專案, 還是以客製化開發為主的。




在開發型專案裡, SA團隊要負責初期的需求調查及整體架構的規劃, 將所有的系統開發工作內容轉化成井井有條的文件, 並且適度的分割及派送, 並確保未來這些被分割的開發結果能夠在未來可以正確運作。




SD則在SA的文件中去尋求系統呈現的一致性, 易用性及保證開發工具可以正確無誤的展現SA的要求結果。所以SD要負責操作界面的外觀設計, 訂定一致的展現規範, 設計系統操作畫面及操作手順, 同時配合SA完成系統開發文件。基本上, 開發文件中, 是包含系統使用手冊初稿的。




SD在設計時, 必需與SA充分配合, 以確保設計的系統符合需求及運作要求。




除了上述的工作內容外, 這三者都要撰寫測試計劃, SA著重在於資料的流動符合原先規劃的順序及結果測試, SD則著重在操作畫面中的防呆測試及操作介面的正確性, 而SE則在系統可靠度上進行規劃。

2015年1月10日 星期六

Appfuse 相關文章


原始檔下載:
http://appfuse.org/display/APF/AppFuse+QuickStart

1.具備 Java & Maven & MySQL 軟體 (MySQL 需ONLINE)
2.執行下載指令
   在任意一個檔案夾下,執行
mvn archetype:generate -B -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-modular-struts-archetype -DarchetypeVersion=3.0.0 -DgroupId=com.myfuse -DartifactId=myfuse -DarchetypeRepository=https://oss.sonatype.org/content/repositories/appfuse




Eclipse + Maven 2 開發

參考文章:  Eclipse + Maven 2 開發 Java SE 專案 - 1  (作者:Lawrence Cheung)
http://pro.ctlok.com/2010/09/eclipse-maven-2-develop-java-se-project.html

以 Eclipse Version: Luna Service Release 1 (4.4.1) 為例:
1.建立 Maven 專案  File -) Maven Project

2.勾選 Create a simple project

3. Group id: package namespace  / Artifact id: 專案名稱(Eclipse Project Name)

4.修改 JRE 的版本(Default 是 1.5)


在Eclipse開啟  pom.xml 檔案 ,加入以下內容, mainclass是設定要執行主程式
      <build>
        <plugins>
            <plugin>
                <groupid>org.apache.maven.plugins</groupid>
                <artifactid>maven-jar-plugin</artifactid>
                <version>2.3.1</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainclass>com.jazz.Main</mainclass>
                            <packagename>com.jazz</packagename>
                        </manifest>
                        <manifestentries>
                            <mode>development</mode>
                            <url>${pom.url}</url>
                        </manifestentries>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>


完整內容如下



















Eclipse 安裝 Maven Plugin 步驟


1.確認 Maven 網址
   http://download.eclipse.org/technology/m2e/releases/

2.開啟Eclipse的Help頁,選擇Install New Sofware

3.填入步驟1 之 URL

2015年1月7日 星期三

Tomcat JavaEE 版本規範

Tomcat JavaEE 版本規範

參考 http://tomcat.apache.org/whichversion.html

Tomcat6: Servlet 2.5、JSP 2.1、EL 2.1
Tomcat7: Servlet 3.0、JSP 2.2、EL 2.2
Tomcat8: Servlet 3.1、JSP 2.3、EL 3.0
Tomcat9: Servlet 4.0、JSP 2.3、EL 3.0









須注意的是各版本所支援 Java 最低版本

2015年1月3日 星期六

Java專有名詞: DAO

原文出處: 王朝網路 :Java入門:淺談DAO模式
http://tc.wangchao.net.cn/bbs/detail_742251.html

DAO : Data access object     (Struts Hibernate) 數據訪問 interface

DAO是Data Access Object資料庫訪問的接口,資料庫訪問:故名思義就是與資料庫庫打交道。夾在業務邏輯與資料庫資源中間。
  DAO的功能:
  1. DAO用來封裝Data Source的..就比如,Connection conn = DAOFacotry.createConnection()..
  就可以把Driver. URL. username, passpword這一些放在DAO中
  以後要更改數據庫的類型.比如要把MSSQL換成Oracle的話..只需要更改DAOFacory裏面的getConnection()裏面的Driver.URL.之類的..
  2. DAO也是把對數據庫的操作(比如最基本的CRUD操作)全部封裝在裏面..
  比如說你要你要插入一個新的用戶..那麽.在DAO中我們只需要提供一個insertUser(User user)這一個方法就可以了..具體的操作是在DAO中實現的...
  那麽對于要調用DAO的時候.我們只要知道insertUser(User)是用來插入一個新的用戶...而不需要知道是如何實現的。
  一般 DAO是與Abstract Factory模式一起來用的...

2015年1月2日 星期五

Google Chrome 瀏覽器開啟新分頁

在一般瀏覽器以Javascript設計開啟新視窗,
使用 window.open( url , "windown_name", "視窗狀態列設定"); 就可達成,
但在 Google Chrome 瀏覽器卻失效( Google Chrome Default 是自動阻擋新視窗)
但可開啟新分頁, 只要調整 javascript 語法即可
 var newwin = window.open();   //此行一定要如此書寫,否則失效
 newwin.location= url;   // url是 cgi 程式或者超連結 html




PhpMyAdmin 無法看資料庫結構的問題解決

無論是單獨安裝 phpmyadmin 或者套件安裝 WAMP ,這個問題皆會存在
原因是 PHP5以後 與作業系統 windows 7/ Linux 版本相容問題

解決方法:
在phpmyadmin 安裝目錄,找到 Util.class.php 這個檔案
如: wamp 之 D:\wamp\apps\phpmyadmin4.1.14\libraries\Util.class.php
修改如下
找到
return strftime($date, $timestamp);
改為
return date("Y-m-d: H:i:s" , $timestamp);

2015年1月1日 星期四

Javamail for google

原文出處: 龍貓 的心情日記
http://supermand9362787.wordpress.com/2008/11/02/javamail-for-google/

利用JavaMail收/發Gmail郵件(SSL)

Gmail目前已經啟用了POP3和SMTP服務,具體情況請看 http://www.javayou.com/showlog.jspe?log_id=490
與其他郵箱不同的是Gmail提供的POP3和SMTP是使用安全套接字層SSL的,因此常規的JavaMail程序是無法收發郵件的,下面是使用JavaMail如何收取Gmail郵件以及發送郵件的代碼:
1. 郵件收取
package lius.javamail.ssl;
import java.io.UnsupportedEncodingException;
import java.security.*;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeUtility;
/**
* 用於收取Gmail郵件
* @author Winter Lau
*/
public class GmailFetch {
public static void main(String argv[]) throws Exception {
  Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
  final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
  // Get a Properties object
  Properties props = System.getProperties();props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);
  props.setProperty("mail.pop3.socketFactory.fallback", "false");props.setProperty("mail.pop3.port", "995");
  props.setProperty("mail.pop3.socketFactory.port", "995");
  //以下步驟跟一般的JavaMail操作相同
  Session session = Session.getDefaultInstance(props,null);
  //請將紅色部分對應替換成你的郵箱帳號和密碼
  URLName urln = new URLName("pop3","pop.gmail.com",995,null,"[郵箱帳號]", "[郵箱密碼]");
  Store store = session.getStore(urln);
  Folder inbox = null;
  try {
      store.connect();
      inbox = store.getFolder("INBOX");
      inbox.open(Folder.READ_ONLY);
      FetchProfile profile = new FetchProfile();
      profile.add(FetchProfile.Item.ENVELOPE);
      Message[] messages = inbox.getMessages();
      inbox.fetch(messages, profile);
      System.out.println("收件箱的郵件數:" + messages.length);
      for (int i = 0; i < messages.length; i++) {
         //郵件發送者
         String from = decodeText(messages[i].getFrom()[0].toString());
         InternetAddress ia = new InternetAddress(from);
         System.out.println("FROMia.getPersonal()+'(‘+ia.getAddress()+’)’);
         //郵件標題
         System.out.println("TITLEmessages[i].getSubject());
         //郵件大小
         System.out.println("SIZEmessages[i].getSize());
         //郵件發送時間
         System.out.println("DATEmessages[i].getSentDate());
     }
   } finally {
     try {
         inbox.close(false);
     } catch (Exception e) {}
         try {
             store.close();
         } catch (Exception e) {}
     }
   }

   protected static String decodeText(String text)
         throws UnsupportedEncodingException {
    if (text == null)
       return null;
    if (text.startsWith("=?GB") || text.startsWith("=?gb"))
        text = MimeUtility.decodeText(text);
    else
         text = new String(text.getBytes("ISO8859_1"));
     return text;
   }
}
2. 發送郵件
package lius.javamail.ssl;
import java.security.Security;
import java.util.Date;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
/**
* 使用Gmail發送郵件
* @author Winter Lau
*/
public class GmailSender {
   public static void main(String[] args) throws AddressException, MessagingException {
      Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
      final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
      // Get a Properties object
      Properties props = System.getProperties();
      props.setProperty("mail.smtp.host", "smtp.gmail.com");
      props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
      props.setProperty("mail.smtp.socketFactory.fallback", "false");
      props.setProperty("mail.smtp.port", "465");
      props.setProperty("mail.smtp.socketFactory.port", "465");
      props.put("mail.smtp.authrue");
      final String username = "[郵箱帳號]";
      final String password = "[郵箱密碼]";
      Session session = Session.getDefaultInstance(props, new Authenticator()
      {
          protected PasswordAuthentication getPasswordAuthentication() {
             return new PasswordAuthentication(username, password);
          }
      }
   );
   // — Create a new message –
   Message msg = new MimeMessage(session);
   // — Set the FROM and TO fields –
   msg.setFrom(new InternetAddress(username + "@mo168.com"));
   msg.setRecipients(Message.RecipientType.TO,
   InternetAddress.parse("[收件人地址]",false));
   msg.setSubject("Hello");
   msg.setText("How are you");
   msg.setSentDate(new Date());
   Transport.send(msg);
   System.out.println("Message.");
 }
}

手動安裝MySQL on Windows

下載 MySQL for Zip File
http://dev.mysql.com/downloads/mysql/


  1.解壓縮 mysql-5.6.22-win32.zip
 2.將預設的 my-default.ini 改為 my.ini
 3.修改 my.ini:
   設定 MySQL 的執行路徑及資料庫存放路徑(x:為Driver Letter):
   basedir = x:\mysql
   datadir = x:\mysql\data
 4.安裝服務(Windows平台):
      安裝Service: x:\mysql\bin\mysqld --install MySQL
      移除Service: x:\mysql\bin\mysqld --remove      
 5.啟動服務:
    x:\>NET START MYSQL  
    或 x:\>SC start MYSQL
    或用服務管理員來啟動 MySQL

使用 Eclipse 開發Servlet 或 JSP : 安裝篇

下載安裝 JDK7
http://www.oracle.com/technetwork/java/javase/downloads/index.html










































下載安裝 Eclipse Luna 4.4 (For Java EE)
https://eclipse.org/downloads/












下載安裝 Tomcat
http://tomcat.apache.org/download-70.cgi

下載  Zip 檔案 -) 解壓與更名至 x:\Tomcat7

























下載安裝 Tomcat Eclipse Plugin
http://www.eclipsetotale.com/tomcatPlugin.html
選擇適合 Eclipse Luna 4.4 版本 Plugin 下載


























解開 tomcatPluginV331.zip









將解開之 jar 檔 copy至 eclipse 目錄 plugins 檔案夾之下即可




















設定 Tomcat Eclipse Plugin
Window -) Preferences -)



Tomcat -) 選擇 Version 7.x -) Tomcat Home 填入 x:\Tomcat7




















設定 Tomcat 伺服器
Windows -) Show view -) Other -) Server -) Servers





















完成後會在Eclipse開發視窗中出現 Servers 顯示Tab,然後在這視窗按右鍵
-)New -) Server





















選擇 Tomcat7 -) 填入tomcat path



























出現下圖即完成設定











在Google Blog 網頁中嵌入顯示程式碼

原文出處:符碼記憶

http://www.ewdna.com/2012/02/google-code-prettify.html

在網頁中嵌入顯示程式碼:CSS Block:
http://www.ewdna.com/2012/02/css-block.html

範例
prettyprint 風格
public class HelloWorld {

    public static void main (String[] args) {
        System.out.println("Hello, world!");
    }
}
codeblock and prettyprint 風格
public class HelloWorld {

    public static void main (String[] args) {
        System.out.println("Hello, world!");
    }
}
步驟一
嵌入步驟(以Blogger為例):
第一步:
進入Blogger後台(登入後在Toolbar右上點選設計),
選範本 -> 選修改HTML -> 繼續。
















新增一段JavaScript程式碼
<style>
.post .codeblock {
display: block; /* fixes a strange ie margin bug */
font-family: Courier New;
font-size: 10pt;
overflow:auto;
background: #f0f0f0 url(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAASwCAYAAAAt7rCDAAAABHNCSVQICAgIfAhkiAAAAQJJREFUeJzt0kEKhDAMBdA4zFmbM+W0upqFOhXrDILwsimFR5pfMrXW5jhZr7PwRlxVX8//jNHrGhExjXzdu9c5IiIz+7iqVmB7Hwp4OMa2nhhwN/PRGEMBh3Zjt6KfpzPztxW9MSAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzB8HS+J9kUTvzEDMwAAAABJRU5ErkJggg==) left top repeat-y;
border: 1px solid #ccc;
padding: 10px 10px 10px 21px;
max-height:1000px;
line-height: 1.2em;
}
</style>

如果要顯示的是程式碼,若要保持程式的排版,建議使用 <pre> 這個標籤, 如下面這段程式:
<pre class='codeblock'>
public class HelloWorld {

    public static void main (String[] args) {
        System.out.println("Hello, world!");
    }
}
</pre>

Java 不同編碼字串, 其字串長度大小計算

以 Java 開發專案, 在 DAO 寫入資料庫時, 常遇到JAVA 字串與資料庫編碼不一致, 有時會產生字串過長,導致無法寫入資料庫的情況. 這時就要在入庫前, 先驗證 JAVA 編碼字串是否超出資料庫欄位長度 JAVA 依 不同編碼, 其長度是不一樣的 如: ...