Google Chart API - 簡單大方的 Chart
最近又發現好神的 Google 的新 API: Google Chart API
看看這個:
目前是還沒機會深入使用它, 不過光是這麼簡單的用法, 就非常吸引我了.
參考文章: Google图表及gchartrb初探
文章內除了介紹這個 API 外, 也介紹了封裝了這個 API 的 Ruby Library.
Latte 是一種令人喜愛的食物
最近又發現好神的 Google 的新 API: Google Chart API
看看這個:
目前是還沒機會深入使用它, 不過光是這麼簡單的用法, 就非常吸引我了.
參考文章: Google图表及gchartrb初探
文章內除了介紹這個 API 外, 也介紹了封裝了這個 API 的 Ruby Library.
Ext 2.2 又多了幾個重要的 component, 加油 Ext !!
FileUploadField 是 Ext 2.2 才開始有的元件, 且尚未納入正式的 API 內.
目前用 FileUploadField 最大的問題在於, 置於 TabPanel 內, FileUploadField 的 Input 長度會設定不正確. 由於我目前沒能力(或是沒時間?) 把它改得更好, 只好直接使用暴力法, 在 FileUploadField 物件產生後, 直接去修改其 css width 屬性(通常在 doLayout 之後做, 比較保險), 硬是把它調整過來:
Ext.getCmp(field_id).getEl().setStyle('width',null);
另一個問題是, FileUploadField 的 button 元件, 在 IE6 顯示下, 左半部按下會沒有作用, 右半部按下才會出現 dialog, 很明顯是 component render 時出了問題.
另外, 若是使用 hideLabel: true, 想把 fieldLabel 隱藏起來, 結果會整個不見. 目前只能把fieldLabel 及 seperatorLabel 清空來因應
總之, 這個元件還不夠成熟.
來源:
http://wiki.eclipse.org/Starting_Eclipse_Commandline_With_Equinox_Launcher
使用 BAT 來啟動 Eclipse 的一個好處是可以預先在 BAT 指定好各項環境變數. 若 ANT build 有需要讀取環境變數時, 在 BAT 內預先設定, 這會是很方便的方式.
測試 function:
object.getClass().getResourceAsStream(filename);
Project 的資料夾結構:
結論:
* 只寫檔名只能找到與該 class 相同的 namespace 下的檔案.
* 若以相對路徑的寫法, 則 jar 檔內的檔案一律找不到. 即使在相同目錄也找不到.
* 以絕對路徑的寫法, 可以完全找到.
Project: ResTest1
package tw.purple.test;
import java.io.*;
public class ResTest1 {
public static void main(String[] args) {
ResTest1 test = new ResTest1();
test.runTest();
}
public void runTest() {
String[] pathList = {
""
,"./"
,"/"
,"../"
,"../../"
,"../../../"
,"/tw/"
,"/tw/purple/"
,"/tw/purple/test/"
,"/tw/yahoo/"
};
String[] nameList = {
"log4j_1.properties"
,"log4j_2.properties"
,"log4j_3.properties"
,"log4j_4.properties"
,"log4j_5.properties"
,"log4j_6.properties"
,"log4j_7.properties"
,"log4j_8.properties"
};
for (int i=0; i<pathList.length; i++) {
for (int j=0; j<nameList.length; j++) {
String filename = pathList[i] + nameList[j];
InputStream stream = this.getClass().getResourceAsStream(filename);
if (stream==null) System.out.print(" not found: ");
else System.out.print(" found: ");
System.out.println(filename);
}
}
}
}
package tw.purple.test;
public class ResTest2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ResTest1 test1 = new ResTest1();
test1.runTest();
}
}
[關掉 Spelling]
在編輯文字檔案時, Spelling 會進行檢查, 不合格的英文字下方就會有 underline 出現, 看起來挺礙事的, 自己是完全不會用上併字檢查的功能, 就關了它吧.
Windows->Perferences:
General->Editors->Text Editors->Spelling
[調整常用 Editor 字體大小]
Windows->Perferences:
General->Appearance->Colors and Fonts
Basic->Text Font: 調整一般文字檔的字體設定
Java->Java Editor Text Font: 調整 .java 檔案的字體設定
Java->Properties File Editor Text Font: 調整 .properties 檔案的字體設定
Debug->Console font: 調整 Console View 裡的文字大小
[Validation]
Eclipse 在很多時候會執行 Validation 的動作, 若機器等級不夠, 可是會讓人等翻天.
Windows->Perferences:
General->Validation 內有各種的 Validation, 可視需要把不需要的關掉, 或乾脆全關掉.
當然, 也可以至某 Project 內的 Properties 單獨設定 Validation 的開關.
[版本]
Eclipse 3.3.2
Axis2 1.4
[問題原因]
主要的問題在於 Code Generator plugin 內缺少了 backport-util-concurrent-3.1.jar 檔案
[解決方案]
- 關閉 Eclipse
- copy %AXIS2_HOME%\lib\backport-util-concurrent-3.1.jar 到下列 folder
%ECLIPSE_HOME%\plugins\Axis2_Codegen_Wizard_1.3.0\lib
- 註冊此 jar 檔案: 編輯 %ECLIPSE_HOME%\plugins\Axis2_Codegen_Wizard_1.3.0\plugin.xml , 在 <runtime> 內加入下面的字串
<library name="lib/backport-util-concurrent-3.1.jar">
<export name="*"/>
</library>
- 執行 Eclipse 即可
- 若問題仍存在, 嘗試改變 Eclipse 使用的 JRE, 換成 JAVA 6
- 使用 JRE 1.6 啟動 Eclipse 後, 若仍有問題, 試著加入 -clean 參數啟動 Eclipse, 清除 osig cache:
eclipse.exe -vm "c:\java\jre1.6.0_05\bin\java.exe" -clean -console -consoleLog -debug -vmargs -Xmx384M
- 關閉 Eclipse 後, 再以一般方式啟動 Eclipse, 應可解決問題
[參考]
Error while using Axis2 Code Generator Plugin for Eclipse
http://www.nabble.com/Error-while-using-Axis2-Code-Generator-Plugin-for-Eclipse-td17147595.html
終於如願以償地擁有了新的 Notebook, 現在當然是要開始執行許多以來的願望了, 其中一個就是要有一個 VM 是專門用來測試不同的 Browser 的 -- 最簡單的環境, 但要有許多不同的 Browser.
目前我準備裝:
Firefox 3(RC1)
Firefox 2.x
IE 7
IE 6
IE 5.5
Firefox 多版安裝很好解決, 只要裝 Firefox Protable 即可.
IE 多版安裝就比較麻煩了...
* 首先由於系統是 WinXP, 內建的是 IE6, 安裝 IE7 時會要求驗證, 特地找來了這篇 blog 協助:
安裝IE 7 跳過驗證的安裝方法
http://hi.baidu.com/203x/blog/item/7d385dcf85eab43cf8dc6150.html
這樣會讓原本的 IE6 變成 IE7. 不過很奇怪, 我在第一次應該會失敗的驗證, 結果成功通過了, 或許是 MS 政策改變了吧(太多人想用它 !?)
* 接著安裝 MutipleIE:
Install multiple versions of IE on your PC
http://tredosoft.com/Multiple_IE
它提供了各種版本的 IE(IE3, IE4.01, IE5, IE5.5, and IE6), 選擇需要的安裝即可
目前這裡寫的 tomcat 版本是: 6.0.16
1. 先確認已經安裝好 JDK 或是 JRE, 並且設定好 JRE_HOME 或是 JAVA_HOME 的環境變數. 這樣 tomcat 才可以執行.
例如: JRE_HOME=c:\java\jre1.6.0_05
2. 至 tomcat 官方網站(http://tomcat.apache.org/)下載 .zip 檔案:
apache-tomcat-6.0.16.zip
3. 解壓縮到欲安裝的目錄(例如: c:\server), 因此 tomcat 預設的根目錄會是:
c:\server\apache-tomcat-6.0.16
4.啟動 tomcat => c:\server\apache-tomcat-6.0.16\bin\startup.bat
5.測試是否安裝成功, 以 firefox 開啟 http://localhost:8080/ 可以看到 tomcat 的頁面, 表示安裝成功.
6.關閉 tomcat => c:\server\apache-tomcat-6.0.16\bin\shutdown.bat
實在是很簡單吧. 根本就是 copy & paste & run !!
這樣給了我們開發人員需要的彈性. 這樣可以安裝不同的 tomcat 版本, 不用擔心衝突的問題, 視需要才啟動需要的版本, 使得系統的負擔降到最低. 如果環境很簡單, 只有一個 tomcat, 也可以安裝成 service, 開機時就啟動 tomcat:
執行 service.bat
c:\server\apache-tomcat-6.0.16\bin\service install tomcat6
其中 tomcat6 是註冊到 windows service 的名稱, 可以自行定義.
若不重新開機, 要啟動tomcat service 的話, 直接執行: net start tomcat6
停止 service: net stop tomcat6
移除這個 service 的註冊(檔案不會被刪除):
c:\server\apache-tomcat-6.0.16\bin\service remove tomcat6
以上的安裝雖然可以裝多個版本, 但若需要同時執行多個 tomcat, 應該還需要一些設定, 以後有需要再來試試吧.
當然, tomcat 進階的設定一定還是有, 可以參考 Tomcat User Guide:
http://tomcat.apache.org/tomcat-6.0-doc/index.html
不知道有多少人跟我一樣, 在剛接觸 Web Development(javascript) 時, 最想知道的答案的三大問題之一就是: 我要怎麼傳參數到另一個網頁呀 ?
就我目前的學習成果裡, 用了兩種方法, 而這兩種方法適用的地方不同.
function parseQuery ( query ) {
var Params = new Object ();
if ( ! query ) return Params; // return empty object
var Pairs = query.split(/[;&]/);
for ( var i = 0; i < Pairs.length; i++ ) {
var KeyVal = Pairs[i].split('=');
if ( ! KeyVal || KeyVal.length != 2 ) continue;
var key = unescape( KeyVal[0] );
var val = unescape( KeyVal[1] );
val = val.replace(/\+/g, ' ');
Params[key] = val;
}
return Params;
}
var params = parseQuery(location.href.replace(/^[^\?]+\??/,''));
v1 = params["name"] // vito
v2 = params["country"] // taiwan
$("#product_wrapper").load("product_page.html");
標籤: javascript
Basecamp 是一個簡易的 Web 型式專案管理系統, 主旨是促使團隊的協同合作. 它有 messages, to-do list, milestone, writeboard, chat, file 等功能. 團隊成員可在裡面做訊息發佈, 檔案分享
message 其實就是討論區, team member 都可以發佈及回覆, 也提供 email 提醒的功能.
to-do list是待辦事項, 專案經理可以 assign 給某位成員, 並與 milestone 結合, 追蹤進度. writeboard 可以當作一個草稿區塊, 並讓 member 一起參與修改, 用這個功能把網頁內容草稿放在這裡讓客戶直接去改是最好的了. chat 提供多個 chat room, 每個 room 可以容納二位以上的 member 一同 chat, chat 包含了 message 及 talk, 也能即時上傳圖片至 chat room 裡, 使所有參與者看得到. file 就不多講了, 就是檔案上傳啦
以功能來看, 它並不提供很華麗或很龐大的功能, 它的功能都維持在最需要, 最簡單使用的層面上, 但又不忽略解決協同合作時會發生的問題及需求.
不必再管 server 一堆的鎖事, 就像租用虛擬主機一樣的意思. 我只要用它, 發揮出價值即可. Basecamp 的 writeboard, file 都提供版本控制的功能, 會將每次修改的版本都記錄區隔開來, writebord 甚至可以做 compare, 不過這些功能都維持在極簡易使用的型式. 跟有些大型合作軟體內提供的華麗功能, 它是相當樸素的, 不過只要使用者自己覺的夠用, 就好了. 像 compare, 若真的需要高級的 compare, 那我就取出這兩個檔案, 再用 Beyond compare 就好了.
說了一堆它的好話, 不過還是有一點不滿意, 就是它的英文操作介面. 雖然是這樣, 但我在裡面輸入中文並使用中文檔案名稱, 都沒有任可問題, 系統發出的 mail 中文字也能正確顯示. 希望未來會有中文的介面
早上在看這本"超越式CSS"時, 突然想到一句話: "站在巨人的肩膀上", 沒幾秒鐘又想到了另一句: "放下我執". 瞬間感到有點奇怪, 這兩句話都是耳熟能詳的話, 但今天卻突然同時間冒出來, 沒多久我就瞭解了, 最後得出這句:
放下我執, 站在巨人的肩上看這美麗的世界
今天很高興的運用 Firefox 裡用 Firebug 做 css 的修改, 還對自己修改得比較順手沾沾自喜時, 突然想到老婆都是用 IE6, 所以用 IE Tab 來檢視一下, 結果慘不忍睹, 果然高興不了太久. 痛定思痛, 決定要更深入瞭解 CSS, 並克服跨瀏覽器的問題.
馬上就跑到金石堂買了這本: 超越式CSS-網頁視覺設計の王道. 吸引我的原因是這本書是以親和力為核心價植(當然還是免不了討論到技術面), 而非以技術面為核心價值. 再來是整本書的設計感增加了整本書的價值, 這讓我有了更深刻的領悟:
不論做什麼網站, 若是沒辦法使網站瀏覽者感受到價值存在(無論是文字,版面,配色,影像,互動性等各層面), 再優秀的技術也是枉然. 設計者用充滿價值的心來製作, 客戶也能感受得到它的價值, 自然就與低價的產品有所區隔.
最後就是譯者在這領域也是專家, 自然更能表達出作者的精神了.
總之, 開始超越 CSS 吧.
(咦 ? 好像離 Ruby,RoR 愈來愈遠了...)
在製作彩油的展示與選取頁面時, 遇到不少問題, 在此記錄:
* Blogger 使用的是 UTF8 格式的檔案, .js 檔案內可能會有中文資料, 若不是以 UTF8 存檔, 可能會造成執行時期的錯誤.
* Blogger 內的文章可以貼入 <script>....</script>, 但卻不可貼入 <style>...</style>, Blogger 會自動將 <style> 及其內的所有資料全部移除, 所以放了也沒用. 因此 <style> 變成只能靠修改 template 置入. 但 template 卻是所有文章共用的區域, 久了不但 template 會變得複雜混亂, 也會使整體網頁顯示變慢. 拜這個問題所賜, 讓我找到了動態讀取 css 及 javascript 檔案的方法:
function loadCSS(css_filename) {
var css=document.createElement('link');
css.setAttribute('rel', 'stylesheet');
css.setAttribute('type', 'text/css');
css.setAttribute('href', css_filename);
document.getElementsByTagName('head')[0].appendChild(css);
}
function loadScript(script_filename) {
var js = document.createElement('script');
js.setAttribute('language', 'javascript1.2');
js.setAttribute('type', 'text/javascript');
js.setAttribute('src', script_filename);
document.getElementsByTagName('head')[0].appendChild(js);
}
標籤: CSS, dribs, hack-blogger, javascript, jquery
雖然有了 jQuery 這把神兵利器, 提供了很多現成的方案也解決了不少的問題, 不過現在進入了必須要靈活運用的階段, 東拼西湊的情形無法維持太久, 須要多花點時間熟悉 javascript 及 DOM 的基礎面, 並多寫點 code.
想起以前剛開始用 delphi 的時候, 現在這種情形跟當時好像. 由於有 coding 經驗, 知道整體要學的部份有那些, 所以有時就想偷懶跳過一些基礎的部份, 直接做更後面一些的部份, 剛開始會感覺很好, 但往往在不久之後, 這些被忽略的部份仍會反應出來. 直到靜下心來瞭解, 才發現這些看似簡單的基礎有多麼重要.
所以...把馬步蹲好, 不然 jQuery 會哭的, 呵呵.
猶豫了一天, 最後還是決定把 jQuery 等相關的檔案移到 Google Pages. 不過由於在 Google Pages 內無法建立資料夾, 所以針對檔名做了統一的修改:
圖檔 - img.jq.(plugin).(filename).(ext)
CSS - css.jq.(plugin).(filename).css
JavaScript - jq.(plugin).pack.js
將之前增加在 template 的 CSS 移至獨立的 .css 檔案內.
對 CSS 還不熟, 但為了將喜愛的圖放在上方, 還是花了一番苦心呀:
#top_background {
width: 100%;
height: 160px;
position: absolute;
top: 0px;
left: 0px;
z-index: 1;
filter: alpha(opacity=20); /* for IE 濾鏡*/
opacity: 0.20; /* for CSS3 濾鏡 */
-moz-opacity: 0.20; /* for Mozilla 濾鏡*/
}
<div align="center" id="top_background">
<img width="320" src="..."/>
</div>
標籤: hack-blogger
http://www.templatemonster.com/
號稱世界最大的 template provider , 提供非常多各式的 template, 它還提供 100% Satisfaction Guaranteed 的服務, 保證購買的 template 完全符合案子的需要, 否則退費. 所以它是論件收費的. 還有經銷方案喔, 國內有些網站就是跟 templatemonster 配合的.
http://www.zeustemplates.com/
http://www.deonixdesign.com/
跟 templatemonster 不同的是, 它們提供固定時間無限 download 的模式, 有 6 month / 1 year / 2 year 的方案, 不過在數量上跟 templatemonster 差很多啦
[隨時記錄關於 blogger template 方面的事]
基本 widget 的格式
<b:widget id="Header1" locked="true" title="孚力資訊 (標頭)" type="Header">
id 為識別名稱, locked 用於 Template-Page Elements 頁面表示此 widget 是否被鎖定, type 為 widget 的種類. widget 目前觀察的結果, 裡面都會有一個名為 <b:includable id="main"> 的 tag, 表示widget 執行的進入點.
* 在 template 加了一些像 b:if 的 code 之後, 再更換另一個內建的 template, 發現 template 已更新, 但我加的 code 卻還能保留, 實在佩服.
* <data:blog.pageType/> 在首頁值是 "INDEX", 在文章內值是 "ITEM"(xxxx.html), 在 Archive 的年份值是 "INDEX", 在月份值是 "ARCHIVE"(年份用 search, 月份則用yyyy_mm_dd.html), 在 Label Vew 值是 "INDEX"(label 使用的是 search)
* 修改 template 的過程, 有時會下載到本機做修改再上傳, 有時會直接使用"網頁元素"做修改, 若兩者交互使用時, 記得在使用"網頁元素"做修改後, 一定要下載最新的 template 至本機修改, 以免發生覆蓋的情形.
* 只要加入 b:section tag 即可在"網頁元素"內新增一塊 dockable(可停駐)的區域.
* 用來判斷是否為單一文章的頁面:
<b:if cond='data:blog.pageType == "item"'>
* 需要針對特定文章做處理的話, 可以用下面指令判斷:(nnnnnnnnnn 是指 blogID)
<b:if cond='data:post.id != "nnnnnnnnnn"'>
* 尚不知何時有值:
<data:pageTitle>
標籤: hack-blogger
忍了一段時間, 終於受不了啦. 今天檢查了一下到底裝了那些東西, 結果發現令我意外的一些東西. 原來我們的 HP Color LaserJet 2840 裝了這些東西呀...快昏了: