跳到主要內容

發表文章

目前顯示的是 2012的文章

Java 零碎知識筆記

1.Arrays.copyof(arg1, arg2)是一種淺層複製(shallow copy)的方法
   參數1是欲複製的陣列,參數2則是新陣列的長度
   因為JVM不會知道Array裡的物件到底有哪些類別及那些屬性
   所以若想進行深層複製,則需要自己實作

2.引用static方法的宣告方式需要完全指名路徑,如:import java.lang.System.out

3.Java的繼承原理是即使是private宣告的成員也會被繼承
  但僅有父類別的方法能存取它

4.重新定義equals()的範例
   public class Cat{
       public  boolean equals(Object other){
        if(this == other){
           return true;        //參考指向同一物件當然是相同
}
if(!(Other instanceof Cat)){
           return false;       //如果不由相同類別宣告自然不會相同
}

Cat cat = (Cat) other;
if(...){                //以下開始比較Cat類別中的類別成員值是否相同
           ....        
}
       }
   }

Java 建構式筆記

建構式之前若有想先執行的流程可以使用{}
以區域概念保留一塊優先執行的區域
Class Demo{
    {
          ...    //do something  
    }

    public Demo(){
           ....
    }
}

若是在這一塊優先執行的區域前加上static敘述
static{
  ...    //do something   
}

則會讓JVM在載入這個class的bytecode後立刻執行區塊內的程式碼
JDBC的class.forName()就是這樣的處理

JavaEE 上傳機制

Servlet 3.0 加入了上傳機制
之前寫過的cos套件也可以拿來比對
除了本篇介紹,另外可參考良葛格的介紹
使用時對於提供上傳的form表單有些前置需求,如下
上傳的頁面demo.jsp================== <!-- action指向處理後續的頁面/Servlet   實作上傳功能時method只能用post         enctype沒指定的話會用預設值application/x-www-form-urlencoded        使用上傳功能時則設定為multipart/form-data-->
<form action="uploadTest" method="post" enctype="multipart/form-data">
    <p>選擇檔案:</p><input type="file" name="file1" value="" /><br />
    <p>選擇檔案:</p><input type="file" name="file2" value="" /><br />
    <input type="submit" name="upload" value="upload" />
</form>
成果大概長這樣:

Python 套件的引入與發行步驟

使用Python程式時常會引用他人寫好的函式或模組來使用
Python Package Index是第三方Python模組的集散地
要看到Python的模組路徑就執行下列兩行
import sys;
print(sys.path)
Python直譯器會到這些被印出的路徑找模組執行

JavaScript - 取得元素在頁面中的位置

在過去,類似下面的程式碼很常被用在取得元素位置

function findPos(obj) {
var left, top;
left = top = 0;
if (obj.offsetParent) {
do {
left += obj.offsetLeft;
top += obj.offsetTop;
} while (obj = obj.offsetParent);
}
return {
x : left,
y : top,
};
};

objPos = findPos(document.getElementById('test'));
alert("x:" + objPos.x + " | y:" + objPos.y);

offsetParent會回傳距離傳入物件最近的容器
這個屬性會依傳入物件及其父元素是否有設定 postion屬性(absolute、relative)變動
一般沒有指定定位的情形下,最外層的offsetParent就是document.body

這個方法的成本偏大,特別是若需進行較多次迴圈運算時
使用時將結果儲存為 local 變數會是比較好的處理作法

既然說了在過去,表示這個做法一定有那裡不夠好
除了上述提過會使用較多的資源來進行計算外
offsetParent也有可能有相容性的疑慮,而卷軸捲動的scrollTop、scrollLeft也會被計算進來

通常我們需要的只是單純的計算元素距離瀏覽器視窗的相對位置
現在該用的作法是 element.getBoundingClientRect();
這個方法會回傳一個物件,物件成員有元素的 left、top、right、bottom、width、height數值
因為這個方法過去是IE獨有,而現在 firefox 和 chrome 也都有支援,所以也不必擔心相容性

[轉載] DROPBOX 創始人當年報名 Y COMBINATOR 的申請書全文,以及對創業者的啟示

原文為有物報告翻譯自Dropbox的文章

恭喜 Dropbox,達到使用者人數一億人,預估營收也來到美金5億(台幣150億)。去年 Dropbox 被投資人估值約在40億美金(1200億台幣)左右,不論從各方面來看都是一個超級成功的創業故事。

談以壓縮、cache機制加速網路應用

談到壓縮資料時必須先有個概念
壓縮資料可以減少資料的傳輸成本,但相對的會增加計算上的成本
CPU可能會因為壓縮的工作而降低系統的整體處理能力,使用上必須依需求選擇
當然現行系統主要的資料傳遞需求仰賴網路,通常啟用壓縮會是較好的選擇


以網路應用實務上的一般情況來說,效率的瓶頸主要是資料的傳輸
上圖是分別以3G和4G通信取得20KB資料的時間,可以看出資料量大時的影響
另一個要點則是行動裝置的電量,行動裝置使用網路時會大幅減少其電池使用時間

Glassfish 效能調校

Glassfish 是有 open source 版本的 Java EE Server
另一個在Java EE開發中常用到的Tomcat相較之下只涵蓋了web container的部分
以支援的規格、後台的豐富性來說,這是Glassfish較出色的部分

雖然Glassfish功能較多也較強大些,但配置的設定也會較為複雜
如果開發上用不到這麼多東西的話,較輕量且被大量運用的Tomcat會是較好的選擇

JavaScript - 事件指定function與圓括號(parentheses)的關係

標題其實是想說 elementA.onclick = func; 這樣一回事
之前都已經看慣&習慣這個寫法倒也沒有想太多

直到今天寫了一個要輸入參數的function
function specialSetting(obj){
....   //original code 
}

然後就直覺寫上了 elementA.onclick = specialSetting(elementA);
畢竟一開始學寫JavaScript都是 <div ... onClick="specialSetting(this);" > 這樣開始

然後執行時就發現函式一開始就馬上被呼叫一次...
仔細想想才覺得應該是圓括號的關係
猜測 JavaScript 的執行方式是 elementA.onclick = specialSetting(elementA);
先執行一次呼叫 specialSetting(obj); 之後才綁定事件
function在JavaScript中是物件
elementA.onclick = specialSetting;  表明事件綁了個函式物件,而不是要立刻執行函式

那如果要傳入參數呢? 改用匿名函式就好了
elementA.onclick = functionn(){ specialSetting(elementA); };

回想要傳入事件作參數給函式的作法是
elementA.onclick = functionn(evt){ func(); };
從這裡其實就看得出端倪了

Tomcat,Apache配置GZip壓縮(HTTP壓縮)功能

*修改自網路文章,文章源頭不確定

HTTP 壓縮可以大大提高瀏覽網站的速度
它的原理是,在客戶端請求網頁後,從Server將網頁文件壓縮
再下載到Client,由Client的瀏覽器負責解壓縮並瀏覽
相對於普通的瀏覽過程HTML ,CSS,JavaScript , Text ,它可以節省40%左右的流量
更為重要的是,它可以對動態生成的
包括CGI、PHP、JSP、ASP、Servlet、SHTML等輸出的網頁也能進行壓縮

物件容器結構容量大小的調整

StringBuilder 和 StringBuffer 底層都使用char[]來做為資料儲存庫
而且常常需要調整容量大小
調整容量大小的方法就是配置一個容量更大的新的char[]
接著將舊資料複製過來後再拋棄舊的char[]
類似的調整過程也可能發生在使用陣列當作底層資料儲存庫的Java SE Collection

依OpenJDK的實作方式
當儲存文字超過底層資料儲存庫的容量時
會配置一個原本容量兩倍大的新char陣列,而底層的char陣列大小預設為16
實務上很少StringBuffer 或StringBuilder的物件最後只使用了16以內的char元素
要避免StringBuffer 或StringBuilder調整大小的動作,我們可以指定大小給其建構子

如ArrayList、Vector、HashMap和ConcurrenthashMap等Collections因使用陣列儲存資料
同StringBuffer 或StringBuilder,很容易在增加元素時引發調整大小的動作
需要額外的CPU週期來配置新陣列、複製舊陣列的資料,將來也需要回收舊陣列
以HashMap為例,預設建構子的容量是16筆資料,也是經常不夠用
其資料擴張時也是使用原本陣列2倍大的新陣列
又因每次調整時都要計算雜湊(hash)值,當資料量大時耗費的成本也更驚人
遇到這種情形時,比較好的處理方式就是直接將計算容量的算式傳給HashMap的建構子

範例 - JavaScript 等比例縮小圖片

max-width、max-height以及這兩個的 min 版本是偶爾能在某些CSS中看到的屬性設定
不過因為IE不會辨識這些屬性,所以就直接寫JavaScript 調整圖片大小

var img = this.getElementsByTagName("img")[0];

img.onload = function () {
    var maxWidth = "300",
        maxHeight = "80";

    if (img.offsetHeight >= (maxHeight / maxWidth) * img.offsetWidth) {
        img.style.width = img.offsetWidth / img.offsetHeight * maxHeight + "px";
        img.style.height = maxHeight + "px";
    } else {
        img.style.height = img.offsetHeight / img.offsetWidth * maxHeight + "px";
        img.style.width = maxWidth + "px";
    }
};

Python 基礎資料結構介紹與常見BIF示範

參考頁面:[Python]如何在Python排序(Python Sorting)

Python保存資料使用的是類似陣列的清單結構
撰寫時型別由Python編譯器處理,不須再宣告型別
List能混合存入各類型的資料,如字串和數字混合放置,是最常被用到的資料結構
另外List中也能包含其他的list,就像多重陣列一樣
Tuple 資料結構類似 List,差別在於 List 內的資料是可變動的
Tuple 內指標指向的對象則不可變更

除了  List 和 Tuple 外
Python 另外還有 Dictionary 跟 Set 也是常用到的資料結構

Python 安裝配置與 Eclipse PyDev 設定

參考文章:Python: Eclipse+Pydev環境安裝教學
在 Windows 7 環境安裝 Python 2.6.6

本篇文章介紹 Python 3 在 Windows 環境的安裝配置過程
另外開發過程會以PyDev作為IDE

Java 數值轉換函式區別 - 以Integer.parseInt()、Integer.valueOf()為例

之前對於Java在數值轉換中為什麼會提供這兩種功能幾乎一樣的方法感到疑惑 看了原始碼就可以得到解答 public static Integer valueOf(String s) throws NumberFormatException {   return new Integer(parseInt(s, 10)); }
public static int parseInt(String s) throws NumberFormatException {   return parseInt(s,10); }
答案在於回傳型別的不同 parseInt()回傳 int 基本型別,valueOf()則回傳Integer型別 除了Integer外,其他的數值型別也有同樣的方法(Double、Float...etc)
在Java1.4版本以前這兩種方法有差異,但在後來版本裡因為有auto boxing機制而沒差了

JavaScript 少用全域變數的理由

在 JavaScript: The Good Parts 書中即有討論到這個議題(心得文連結)
容易造成變數名稱紊亂這點,可以盡量用匿名函式的寫法解決
在匿名函式中使用的變數名稱就不會跟全域變數產生衝突
但除了這個問題外,還有效能的考量
JavaScript搜尋變數的方式是 區域變數 -> 更上層的區域變數 -> .... -> 全域變數
若有常用到的全域變數,把它另存成區域變數對效能有很大的幫助

var data;

function displayData(){
//caching variables
  var _data = data;
  ....
}

另一個考量則是JavaScript的GC(Garbage Collection)機制
全域變數只有在離開頁面或重新載入時,才會將全域變數回收
就算指定全域變數為null值,如:data = null;
因為JavaScipt的null也是一種物件,所以這樣做並不會移除參考
而在區塊中(含function)宣告的變數則是區塊範圍結束後就被回收
所以多用區域變數就可以避免記憶體等資源被長時間占用

Excel 開啟產出的 .CSV檔為亂碼的解決方式

CSV檔為以逗號區隔欄位,用來儲存資料的純文字格式
指定了編碼的純文字格式應該是與亂碼無緣
但有時以微軟的Excel開啟.csv檔卻會發現內容為亂碼
發生的原因是微軟內部系統處理格式時會在開頭暗中寫入一串判別的字碼
而微軟系統就以文字檔案中是否含這串暗碼來判定要以UTF-8或ASCII格式讀取檔案

所以我們若要讓我們產出的CSV檔能正確的被Excel讀取,就要在檔案開頭加入暗碼


public CSVWriter(OutputStream out){
    this.out=out;

//Corresponding to Microsoft Excel, make file won't open with scrambles in Excel
    byte[] BOM_UTF8 = { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF };
    try {
out.write(BOM_UTF8);
    } catch (IOException e) {
System.err.println("BOM寫入CSV失敗");
    }
    ....
}

IE 中checkbox的checked=true不打勾問題解決

這個問題是發現在IE中會沒辦法看到checkbox的選項被打勾
檢查其屬性checked=true無誤

追查下發現原因為在該checkbox尚未被IE初始化(還沒加入DOM樹中)前設定此屬性

解決方法有兩種 -
1.將其加入DOM樹中再設定屬性
2.改為設定其 defaultChecked=true

Ajax跨網域議題 - 使用JSONP取得資料

參考文章:【原創】說說JSON和JSONP,也許你會豁然開朗,含jQuery用例
使用 JSONP 跨站請求

JSON為JavaScript中常用的資料交換格式
簡單、輕型的特性讓他成為Web 開發的首選,這裡就不多提了

而在Web開發的過程中,我們有時會遇到跨網域存取資料的需求
不管是基於分散流量需求,又或者是使用雲端提供業者的服務
使用第三方提供的服務、資源
甚至在同一個專案目錄底下開發的檔案也可能因啟用HTTPS而導致網域的不同

我們有這麼多會碰上跨網域的情況
但Browser 本身的安全機制會禁止我們直接從其他網域取得資料
瀏覽器唯一能從其他網域取得資源的機會就是JavaScript的匯入
也因此衍伸出一個非官方的解決方案,也就是JSONP
JSONP的全名是JSON with Padding
這項技巧本身與JSON沒有實際關係,僅僅是因為JSON是實作上最使用的格式

[轉載] POI設置EXCEL單元格格式為文本、小數、百分比、貨幣、日期、科學計數法和中文大寫

轉載來源


以下將要介紹的每一種都會用到這三行中的變量

            HSSFWorkbook demoWorkBook = new HSSFWorkbook();  
            HSSFSheet demoSheet = demoWorkBook.createSheet("The World's 500 Enterprises");  
            HSSFCell cell = demoSheet.createRow(0).createCell(0);

第一種:日期格式

            cell.setCellValue(new Date(2008,5,5));
//set date format
            HSSFCellStyle cellStyle = demoWorkBook.createCellStyle();
            HSSFDataFormat format= demoWorkBook.createDataFormat();
            cellStyle.setDataFormat(format.getFormat("yyyy年m月d日"));
            cell.setCellStyle(cellStyle);

第二種:保留兩位小數格式
            cell.setCellValue(1.2);
            HSSFCellStyle cellStyle = demoWorkBook.createCellStyle();
            cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
            cell.setCellStyle(cellStyle);

這裡與上面有所不同,用的是HSSFDataFormat.getBuiltinFormat()方法,之所以用這個,是因為0.00是Excel內嵌的格式

第三種:貨幣格式

            cell.setCellValue(20000);
            HSSFCellStyle cellS…

除錯 - java.lang.IllegalStateException: getOutputStream() called

今天碰上的這個錯誤訊息是在JSP頁面發生

ServletResponse.getOutputStream()
ServetResponse.getWriter()

這兩個方法都會有可能在JSP輸出頁面內容的時候被調用
當其中一個方法被調用過後,再呼叫另一個方法就會報錯誤
解決的方法不外如下:

out.clearBuffer();                           //清除buff
out = pageContext.pushBody();    //更新out的內容

範例 - JavaScript 存取 Radio Button

簡單來說就是逐一比對相同name屬性的input控制項

HTML part:

<form id="demoForm" method="post" action="...">
<input type="radio" name="statisticType" value="region" checked="checked" />依地區
<input type="radio" name="statisticType" value="time" />依時間<br />
</form>

JavaScript part:

var sType;
var demo = document.getElementById("demoForm");

for (var i = 0; i < demo.statisticType.length; i++) {
    if (demo.statisticType[i].checked) {
        sType = demo.statisticType[i].value;
        break;
    }
}

alert(sType);

Java String型別筆記

1.System.out.printf()是從C那邊取得的方法
   String demoStr = "a %s boy which is %d feet height";
   System.out.pintf(demoStr, "litle", 15);

   字串中的%s,%d 分別會被替換成字串little、數值15
   String.format()方法具有相同的使用方式及效果
   例如:string temp = String.format(demoStr, "litle", 15);

   以下為常用替換表示,大小寫區別在輸出的字串以大寫或小寫輸出
   %%  -            用來在字串中表示%
   %d  -             以10進位整數格式輸出,可用於byte、short、int、long
   %f  -              以10進位浮點數格式輸出,可用於float、double、Float、Double、BigDecimal
   %e、%E  -    以科學記號浮點數格式輸出
                        %e指輸出格式遇到字母以小寫表示,%E則為以大寫表示
   %x、%X  -   以16進為整數格式輸出
   %s、%S  -   以字串格式符號輸出
   %c、%C  -   以字元符號輸出
   %b、%B  -   輸出blloean值

   另一個較常見的替換輸出的需求則是在文字左側補上 0
   例如月份可能不想用 2016/1 而是想用 2016/01
   此時可以直接用 String.format("%02d", number); 這樣的方式處理,上色處為0的位數
   上面那行如果輸入數字1會吐字串01回來,數字11則吐字串11

2.String以+運算符大量連結字串時常會被詬病效率低的因素
   在串聯字串相當簡單的情況下,使用String是可以接受的方法
   例如:String temp = "aaa" + "bbb" + "ccc";
   此時使用+運算符會比StringBuilder跟StringBuffer…

解讀JavaScript的匿名函式寫法

參考文章

滿多的情況下我們會看到下面這一種寫法
(function(m) {
    alert(m);
})("Hello");

解讀方式是 ( 實際上執行的function內容 )( 參數 );
等同於下面這段
var x = function(m) { alert(m); };
x("Hello");

或是更普遍的寫法
function y(m) {
    alert(m);
}
y("Hello");

以上三種寫法結果相同,差別在於第一種寫法不會留下任何函數或變數
對於一次性的動作來說,可以做到真正的船過水無痕

至於在jQuery Plugin開發時,習慣上會寫成以下的格式
(function($) {
//Plugin可以放心地用$代替jQuery
    //不必擔心網頁可能被設了jQuery.noConflict()
    //將$符號保留給其他Javascript Library使用
})(jQuery);

另外還有細節需要注意
有時候會看到傳入 "window" 作為匿名函式的參數

(function(window){
       ...// original code
})(window);

這是因為JavaScript的全域變數及函式是掛在 window 這個物件底下
如果要在函式中使用全域變數或全域函式
JavaScript 的找尋方法是 區域 -> 找不到再找外層 -> 找外層loop -> window
如果將 window 物件作為函式的參數引入,window物件就變成了函式的區域變數之一
這樣就省略了中間那些 "找不到,再往外一層找" 的過程
多少能提升一些效率

[除錯] Firefox上的JSON讀取來源資料問題

今天被這問題折磨很久了....
在Chrome跟IE都可以正常的運作用JSON傳遞資料的AJAX
但在FF摸了老半天都看不到資料被吐出來
最後找到的結論是 -> FF對於傳回資料的預設是 XMLDocument 物件
這個東西丟進JSON.parse()就掛掉了

解決方式:
在資料頁加上ContentType宣告
Java的Sservlet/JSP環境  ->  加入 response.setContentType("text/JSON");

JavaEE 請求與回應處理

updated:2013/05

container載入類別後執行Servlet的建構式
建構式不應自行撰寫,使用預設即可
建構完成之後container會先執行Servlet的 init()
假使有程式碼(資料庫連結之類的)需要初始化,可覆寫 init() 達成需求

JavaEE Web 基礎概念

updated:2012/08

Java用來建置Web Application所使用的技術是Servlet與JSP
Servlet是用來撰寫網頁或是需求的類別
而JSP是提高Servlet可讀性極易維護性所的技術,在執行時會轉譯成Servlet

要撰寫Java Web Application首先要準備好Java開發環境以及Tomcat
 Tomcat是做為container來支援client端的請求與Server間的溝通
另外提供的功能尚有Servlet的生命週期管理、多執行緒支援、宣告式的權限管理、JSP轉譯

Eclipse筆記

實作平台為Eclipse Juno (4.2)

快捷鍵=======================
Alt + /                      範本提議,自動提示未完成的輸入選項

Ctrl + /                    對選擇中的區塊新增/移除註解(//),在html編輯器無效

Ctrl + Shift + /         對選擇中的區塊新增區塊註解(/*~*/)

Ctrl + Shift + \         從選擇的區塊移除區塊註解

Ctrl + Shift + J         對選擇中的區塊新增Javadoc註解雛形

Ctrl + I                    將選擇中的區塊對齊縮排

Alt + Shift + Z         包覆選擇中的區塊,可以選擇try~catch、for迴圈等

Ctrl + T                   彈出類型階層圖    

[轉載]強制使用javascript-檢查該頁面是否啟用javascript

原文====================

現在ajax的技術很流行,也用在很多web 2.0的網站上,但該技術是基於使用者端瀏覽器的javascript,萬一使用者把它關閉怎麼辦?還要為它們另外撰寫ajax或javascript特效的替代程式嗎?我不負責任的回答是:不要!

大部份網頁瀏覽器,預設都是啟用javascript,那誰會停用?
第一個是什麼都不懂,不小心關掉的人;第二個是很懂,非常非常在乎安全,或想亂搞的人。 我會和客戶說,這兩類的人,少之又少,又很難搞定,與其多花時間金錢來照顧它們寫替代程式,不如直接告訴它們請啟用javascript再來瀏覽此頁面。 方法很簡單:
在想強制使用javascript的頁面,<head>和</head>間,插入這段通用的tag

<noscript>
     <META HTTP-EQUIV="Refresh" CONTENT="0;URL=JS_Please.html">
</noscript>


如果有人瀏覽這頁面卻未啟用javascript,就會直接轉到JS_Please.html,接著在JS_Please.html上撰寫請啟用javascript的說明,或教不小心關掉的人要怎麼開啟它
後記:
php有個函式是get_browser,原以為是可以檢查瀏覽器所有的狀態,就很高興的拿來試試…沒想到只能得知瀏覽器是否有支援javascript,卻無法得知是否啟用;真是個讓人白高興一場的函式…
網路上還有很多檢查javascript是否啟用的方法和資訊,但大多複雜難用;用noscript來轉頁,是最簡便的方法。

ASP.NET Web Application 離線方式

這是我目前看ASP.NET中覺得最好的功能之一XD
在網站需要進行維護等需離線的行為時
為了避免讓User誤會而可以使用這個功能

只要在Application的根目錄底下建立App_Offline.htm 並將訊息寫在這個頁面即可
只要目錄底下有這個檔案
.NET就會自動將網頁導覽到這個頁面
如此就可以很方便的進行升級

要注意的事項則是網頁大小必須超過512k
且對於根目錄的權限要小心
以免被惡意寫入這個檔案而導致整個Application不起作用

固定ASP.NET程式開發伺服器的Port for web網站

在web application專案中可以使用專案工具控制([專案]>[屬性]) 而如果只是建置時選擇web網站的話,則用以下方式解決
step1. 在visual studio的[工具]>[選項]>[專案和方案]>[一般]>取消"永遠顯示方案" step2.[工具]>[外部工具]>[加入]>輸入以下設定           標題: sever port:8080       <--隨便打           命令:C:\Program Files (x86)\Common Files\microsoft shared\DevServer\9.0\                       WebDev.WebServer.EXE           引述:/port:8080/path:$(ProjectDir)\ step3.[工具]選項中就會出現剛才輸入的標題,執行以啟動固定的port step4.在網站上按右鍵>[屬性頁]>[起始選項]>[使用自訂伺服器]>基礎URL輸入           http://localhost:8080
測試:直接輸入http://localhost:8080/Default.aspx