- for
var myArray = [1,2,3]; for (var i = 0; i < myArray.length; i++) { alert(myArray[i]); }
output
--------------------------------------------
1
2
3
- for in
var obj = { a : 1, b : 2 }; for(var key in obj) { alert(key); }
output
--------------------------------------------
a
b
- forEach (IE9 之後才支援)
forEach 是從 Array.prototype.forEach 來的, 因此只要是 Array 物件就擁有 forEach 方法
function alertElements(element, index, array) { alert(element); } [1,2,3].forEach(alertElements);
output
--------------------------------------------
1
2
3
在 ECMAScript 5, 也可使用 forEach 取得物件屬性名稱
var obj = { a : 1, b : 2 }; Object.keys(obj).forEach(function(key) { alert(key); });
output
--------------------------------------------
a
b
- while
var i=0; var myArray = [1,2,3]; while(myArray[i]) { alert(myArray[i]); i++; }
output
--------------------------------------------
1
2
3
- do while
var i = 1; var sum = 0; do { sum += i; i++; } while (i <= 100); alert(sum);
output
--------------------------------------------
5050
7/07/2013
7/03/2013
Hash Collision DoS
oCERT Advisories ==> http://www.ocert.org/advisories/ocert-2011-003.html
Hashtable 在 Java 中是很常被使用的 class 之一, Hashtable 的原理是利用 hash code 的方式, 算出陣列的索引, 來加速資料搜尋, 最佳狀況下, hash code 是不會重覆的, 因此可以達到快速搜尋的效果
Wikipedia 對 Hash table 的說明 ==> http://en.wikipedia.org/wiki/Hash_table
hash code 的運算方式有很多種, 但不管使用哪一種方式, 都難免發生兩種不同的 Key, 算出同樣 hash code 的狀況, 稱之為碰撞(collision)
我們來看 Java HashMap 如何去處理 collision
未發生 collision 的狀況下資料結構應該是長這樣
當發生 collision 時, Hashtable 變形為 single linked list
在一個線性串列中,如果資料量很大,花費在搜尋上的時間成本也就隨之增加,
有心人士可利用這個特性來對 Java 撰寫的 Web 做攻擊
Hashtable 在 Java 中是很常被使用的 class 之一, Hashtable 的原理是利用 hash code 的方式, 算出陣列的索引, 來加速資料搜尋, 最佳狀況下, hash code 是不會重覆的, 因此可以達到快速搜尋的效果
Wikipedia 對 Hash table 的說明 ==> http://en.wikipedia.org/wiki/Hash_table
hash code 的運算方式有很多種, 但不管使用哪一種方式, 都難免發生兩種不同的 Key, 算出同樣 hash code 的狀況, 稱之為碰撞(collision)
我們來看 Java HashMap 如何去處理 collision
public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); for (Entry<k> e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, key, value, i); return null; } public V get(Object key) { if (key == null) return getForNullKey(); int hash = hash(key.hashCode()); for (Entry<k> e = table[indexFor(hash, table.length)]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) return e.value; } return null; }
未發生 collision 的狀況下資料結構應該是長這樣

當發生 collision 時, Hashtable 變形為 single linked list
在一個線性串列中,如果資料量很大,花費在搜尋上的時間成本也就隨之增加,
有心人士可利用這個特性來對 Java 撰寫的 Web 做攻擊
6/20/2013
JavaScript 變數宣告(使用 var 與不使用 var 的區別)
JavaScript 變數使用 var 來宣告,
如果不使用 var, 則屬於 global object
--------------------------------------------
1
2
exception : ReferenceError: c is not defined
變數宣告後在作用範圍內都有效
--------------------------------------------
undefined
1
注意 :
第一次 alert 時並未發生 exception, 而是輸出 undefined, 因 a 的作用範圍在 function test2 裡都有效果, a 尚未出始化, 所以輸出 undefined, 這行為稱之為提昇(Hoisting)
我們可以使用 delete 來刪除物件上的特性, 當不使用 var 宣告的變數, 就屬於 global object 中的一個特性, 相當於我們使用 delete 來刪除變數
--------------------------------------------
1
2
false (false 表示無法刪除)
true (true 表示特性刪除成功)
1
ReferenceError: b is not defined
JavaScript 有幾個內建的 Data Types, 都可使用 var 來宣告
a = 1; //global function init() { b = 2; //global var c = 3; //local } function test1() { init(); console.log(a); console.log(b); console.log(c); } test1();output
--------------------------------------------
1
2
exception : ReferenceError: c is not defined
變數宣告後在作用範圍內都有效
function test2() { console.log(a); var a = 1; console.log(a); } test2();output
--------------------------------------------
undefined
1
注意 :
第一次 alert 時並未發生 exception, 而是輸出 undefined, 因 a 的作用範圍在 function test2 裡都有效果, a 尚未出始化, 所以輸出 undefined, 這行為稱之為提昇(Hoisting)
我們可以使用 delete 來刪除物件上的特性, 當不使用 var 宣告的變數, 就屬於 global object 中的一個特性, 相當於我們使用 delete 來刪除變數
var a = 1; b = 2; console.log(a); console.log(b); console.log(delete a); console.log(delete b); console.log(a); console.log(b)output
--------------------------------------------
1
2
false (false 表示無法刪除)
true (true 表示特性刪除成功)
1
ReferenceError: b is not defined
JavaScript 有幾個內建的 Data Types, 都可使用 var 來宣告
- Primary Data Types
- String
- Number
- Boolean
- Composite Data Types
- Object
- Function
- Array
- Date
- RegExp
- Array
- Object
- Special Data Types
- Null
- Undefined
var a;//a is undefined var b = "test";//b is String var c = 1;//c is a Number var d = new Array();//d is Array
6/07/2013
Service Locator Pattern
將取得服務的方法進行封裝, 可降低程式碼間的耦合度
import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; import java.util.Collections; import java.util.HashMap; import java.util.Map; public final class ServiceLocator { private static ServiceLocator sl = new ServiceLocator(); private Context c; private Map m; private ServiceLocator() { try { c = new InitialContext(); m = Collections.synchronizedMap(new HashMap()); } catch (Exception ex) { throw new ExceptionInInitializerError(ex); } } public static ServiceLocator getInstance() { return sl; } public DataSource getDataSource(String name) throws NamingException { DataSource ds = null; if (m.containsKey(name)) { ds = (DataSource) m.get(name); } else { ds = (DataSource) c.lookup(name); m.put(name, ds); } return ds; } }
11/05/2011
解決 windows 2003 升級 sp2 後 RDP(遠端桌面) 無法使用的方法
1. 尋找 %WINDOWS%\Driver Cache\i386\sp2.cab 這個檔案
2. 解壓縮 sp2.cab 取出 termdd.sys
3. Copy termdd.sys to %windows%\system32\drivers
4. 重新啟動 Terminal Services
2. 解壓縮 sp2.cab 取出 termdd.sys
3. Copy termdd.sys to %windows%\system32\drivers
4. 重新啟動 Terminal Services
Subscribe to:
Posts (Atom)