Old Java
String[][] names = { { "John", "Mary", "Steven" }, { "Tom", "Jeff" } };
List<String> list1 = new ArrayList<String>();
for (String[] s1 : names) {
for (String s2 : s1) {
list1.add(s2);
}
}
Java 8 Stream API
String[][] names = { { "John", "Mary", "Steven" }, { "Tom", "Jeff" } };
List<String> list2 = Arrays.stream(names)
.flatMap(s1 -> Arrays.stream(s1))
.collect(Collectors.toList());
C# LINQ (method syntax)
string[][]...
11/04/2014
8/26/2014
Docker
Docker 是一個開源的軟體容器(software containers), 利用 Linux kernel 中的隔離(isolation)特性, 實現了OS level virtualization
目前常見虛擬化技術類型(Virtualization Types)
PV(paravirtualization), 透過修改OS核心,植入Hypercall,讓原本無法被虛擬化的指令,可以經過 Hyper interface 直接向硬體提出請求
http://en.wikipedia.org/wiki/Paravirtualization
HVM(hardware virtual machine)http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/virtualization_types.html
Application level virtualization - JVM, CLR
OS level virtualization - docker
Hypervisor 有兩種類型
Type...
PLSQL Developer & SQL Navigator password 備份
PLSQL Developer 儲存的 password 預設存在 C:\Users\[username]\AppData\Roaming\PLSQL Developer\Preferences\[username]\user.prefs或安裝目錄下的 \PLSQL Developer\Preferences\[username]\user.prefs自訂路徑 可修改安裝目錄下的 \PLSQL Developer\params.ini 並且定義 prefpath 參數
SQL Navigator
password 儲存在 HKEY_CURRENT_USER\Software\Quest Software\SQL Navigator ?.?.?\Logon Password...
6/17/2014
Named and Optional Arguments in C#, Python, JavaScript
C#
C# 在使用具名引數上非常方便, function 不需做任何修改即可使用
public double CalculateBMI(double height, double weight, bool isPrint = true)
{
double heightMeter = height / 100D;//double suffix
double bmi = weight / Math.Pow(heightMeter, 2);
//double bmi = Math.Floor(weight / Math.Pow(heightMeter, 2) * 100) / 100;
if (isPrint) Console.WriteLine("BMI=" + bmi);
return bmi;
}
傳入參數的方式使用類似 JSON 的表示法, 且傳入不需有順序性
CalculateBMI(height: 170, weight: 65);
CalculateBMI(height: 170, weight:...
Variable-length Argument in Java, C#, Python
Java
public int sum(int... nums)
{
//nums.getClass().getTypeName() -> int[]
int total = 0;
for (int num : nums )
total += num;
return total;
}
C#
public int Sum(params int[] nums)
{
//nums.GetType() -> System.Int32[]
int total = 0;
for (int i = 0; i < nums.Length; i++)
total += nums[i];
return total;
}
Python
def sum(*nums):
#type(nums) -> <class 'tuple'>
total = 0
for num in nums:
total...
5/27/2014
Apache Commons Logging 整合 java.util.logging
設定 commons logging 使用 java.util.logging
在應用程式的 classpath 中加入 commons-logging.properties 檔案
commons-logging.properties 內容如下,作用是要 commons.logging 使用 Jdk14Logger
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger
若不使用 commons-logging.properties, commons logging 會先搜尋 classpath 中是否存在 log4J , 若存在 log4J 則優先使用 log4J, 若不存 log4J 才會使用 java.util.logging, 順序可參考 org.apache.commons.logging.LogSource
建立 java.util.logging 設定檔
建立設定檔 logging.properties, 檔名可自訂
handlers=...
5/22/2014
Java Type Erasure
Java 的泛型其實是在編譯器上做了手腳,Java 在編譯時期由編譯器幫我們做了型別轉換的檢查,當 compile 成 bytecode 後,我們使用工具觀察,可以發現我們在程式中所使用的泛型全都不見了,也因此程式在 run time 時是看不到泛型的影子,這種泛型的實現方式稱作 type erasure, 其優點是確保了相容性, 而 .NET 的泛型就不一樣了, .NET 的泛型是真正運行於 CLR 層上的功能, 也因此 Java 的泛型與 .NET 相比, Java 多了許多限制
舉個例子,假設我們要實做一個 List, 當索引值超出 List 長度時, 回傳傳入泛型型別的實例
C#
public class Animal
{
public override String ToString()
{
return this.GetType().Name;
}
}
public class Cat : Animal {}
public class Dog : Animal {}
public class...
4/28/2014
CSS 權重計算

CSS 的權重是一個重要觀念,初學者常常遇到新增了 CSS 去改變某個元件的樣式表,但卻沒有作用,很可能是所設定的樣式表被其他權重高的樣式表所覆蓋,以下說明一些權重的計算方式
Style sheets 來源有三種
user agent – 瀏覽器預設樣式, ex: 在 IE 中 float 屬性(property)在瀏覽器預設值是 none, 可參考 http://msdn.microsoft.com/en-us/library/ie/ms530751(v=vs.85).aspx
author – 開發人員定義的樣式, 即網頁撰寫人員在網頁上所定義的樣式表
user – 用戶在瀏覽器中定義的 CSS,不同的瀏覽器有不同的設定方式, 以 IE8 為例, 在工具 / 網際網路選項 可自定樣式表
重要性(importance)規則
normal
important 在CSS規則後添加 !important 權重提高
若沒有使用 important 就屬於 normal, important 就好比是古代的尚方寶劍,使用它可讓權重加到最大
example:
<html>
<head>
<style>
#myid...
3/27/2014
JavaScript this 用法
JavaScript 是個 prototype based 的語言,有些觀念與物件導向不太相同,this 的用法就是其中一例,在 JavaScript 中, this 代表指向呼叫該函式的物件, 也就是函數的擁有者,而且在程式執行過程中 this 不可被重新指派
global context 中的 this
global context 中的 this 指向 global object, 若在瀏覽器中執行 this 指向 window 物件
console.log(this === window);//true
一般函式中的 this
當我們使用 function func1(){} 的方式宣告函數時, 函數的擁有者是 global object, 所以 this 指向 global object
function func1() { return this; }
var obj = { func1 : func1 };//建立物件與函式的連結
obj.func1 === this.func1;//true
obj.func1() ===...
3/26/2014
Eclipse 正式支援 Java 8
Java 8 已於 2014/3月18 發布 , Eclipse 4.4 從 I20140318-0830 這個版本開始正式支援 Java 8
Eclipse Project 4.4.0 頁面 : http://projects.eclipse.org/projects/eclipse/releases/4.4.0
Eclipse Project 下載頁面 : http://download.eclipse.org/eclipse/downloads/
Eclipse 4.3 的使用者也可透過安裝 feature patch 的方式來支援 Java 8 新功能
https://wiki.eclipse.org/JDT/Eclipse_Java_8_Support_For_Kep...
3/19/2014
Fibonacci numbers (斐波那契數列)
義大利數學家 Fibonacci 所發明,他描述兔子生長的數目時用上了這數列,假設兔子每個月都會生產小兔子,如此不停的繁衍,且兔子永不死去
此數列常在程式演算法的教科書中出現,數列的解法有很多種,以下列出幾個簡單的 Java 程式解法
簡單表達式
F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2
遞迴解法
public long fib(int n) {
if (n < 2) return n;
else return fib(n - 1) + fib(n - 2);
}
迴圈解法
public long fib(int n) {
if (n < 2)
return n;
long x = 0L;
long y = 1L;
long temp = 0L;
for (int i = 2; i <= n; i++) {
temp = y;
y = x + y;
x = temp;
...
3/12/2014
GoDaddy 設定將 domain.com 轉址到 www.domain.com
Java 8 Functional Interface
Java 8 新增了 lambda expression 的新概念, 如果要將 method 當作參數傳遞, 就要先定義所需的函式介面(Functional Interface)
什麼是函式介面呢? 簡而言之就是 interface 中, 只定義了一個可被 implement 的抽象 method
Java 內建的函式介面有很多,像是 java.lang.Runnable, java.util.concurrent.Callable, java.util.Comparator,這些 interface 的共同點就是只定義了一個抽象 method, 因為只定義了一個抽象 method, 當在程式中使用 lamdba expression 時, 編譯器自然知道是 implement interface 中的哪個 method
Java8 新增了一個 annotation : @FunctionalInterface, 如果在一個不是 functional interface 的 interface 用這個 annotation, compiler...
3/05/2014
Java ThreadLocal
ThreadLocal 的用途 : ThreadLocal 是在多執行緒中儲存變數值的方式,當不同 thread 共用 ThreadLocal 實例,可設定和讀取屬於自身 Thread 的變數值而不相互干擾,用 thread local variable 來稱呼它或許更為恰當,其概念正好與 singleton 相反
ThreadLocal 提供 3 個 public method 與 1 個 protected method
T get()
protected T initialValue()
void remove()
void set(T value)
ThreadLocal 內部儲存值的方式, 其實是利用到 thread 實例中的 threadLocals 實例變數(instance variable),threadLocals 是個類似於 HashMap 的物件, ThreadLocal 將自身實例當作 key, 將 set 的值設定到 threadLocals 物件參考中
ThreadLocal set method source...
3/04/2014
解決更新 Java 版本後 Applet 無法執行的問題

在過去的 Web 上使用 Java Applet 是相當受歡迎的的技術之一,但 Applet 與一般的 Java 應用程式不同,瀏覽器必需加入 Java Plug-In 才可在瀏覽器上正確執行
如果最近你在 Windows 上做了 Java Update,升級完後卻發現原本可正常瀏覽的 Applet 卻無法執行,可檢查以下設定
設定 Applet 的 Java Runtime 版本
開啟 Java 控制面板
開始 > 設定 > 控制台 > Java, 點擊 Java icon 就可以開啟 Java 控制面板, 如果在 Windows 控制台中找不到可以到 JRE 的安裝目錄下尋找 javacpl.exe 並執行 (ex: Java\jre7\bin\javacpl.exe)
指定 Java Runtime 版本
Java 控制面板 > Java 頁籤 > 檢視 按鈕 > 依需求勾選已啟用欄位
Applet 執行時可從 console 觀察 Applet 執行時所使用的 JRE 版本
設定...
2/27/2014
Java 8 雙冒號 Method Reference
Java 8 加入了 lambda expression 賦予了 Java 新的能力, 在使用 lambda 的同時常發現神奇的 :: 雙冒號 (double colon) 穿插其中, :: 代表什麼意義呢?
舉例來說, 在過去我們要做個由小到大的數列排序,當然使用 java.util.Arrays.sort(Object[] a) 是最快的方式, 如果要自訂排序方式使用 anonymous inner class 是最簡便的方式
例 1 : 使用 anonymous inner class
Integer[] ary = new Integer[] { 9, 8, 7, 6, 5, 4, 3, 2, 1 };
// anonymous inner class
Arrays.sort(ary, new Comparator() {
@Override
public int compare(Integer a, Integer b) {
return Integer.compare(a, b);
}
});
System.out.println(Arrays.toString(ary));
Java...
2/21/2014
Race Condition
Race Condition 在多執行緒的開發中是一個重要的概念,當兩個 thread 同一時間點存取同一個共用變數,因為同步執行造成運算結果相互覆蓋的情形就是 race condition
wikipedia 上有一個很棒的表格,非常清楚的說明 race condition 的概念
以下表格引用自 wikipedia : http://en.wikipedia.org/wiki/Race_condition
狀況一 : Thread 1 & Thread 2 依序執行, 得到一個正確的運算結果
.racetable
{
border-collapse:collapse;
text-align: center;
}
.racetable, .racetable td, .racetable th
{
border:1px solid gray;
}
Thread 1
Thread 2
Integer value
0
read value
←
0
increase value
0
write back
→
1
read...
2/20/2014
Java Volatile
在 Java 多執行緒的環境中 synchronized 是相當常用的關鍵字之一,使用 synchronized 有兩個效果 mutex & visibility
mutex 主要目的是建立 critical section, 而 visibility 的作用是保持記憶體的一致性(memory consistency)
什麼是記憶體一致性呢? 我們知道一般物件是擺在記憶體內的,如果要對物件資料做運算,CPU 通常會將要做運算的資料複製一份到 CPU 的 register 加快處理速度,而運算完的資料有時並不會立刻寫回主記憶體,而是留在 register 內,在多執行緒的環境下,如果此時另一個 CPU 來讀取同一份資料就會產生記憶體不一致的問題,因此 Java 定義了 volatile 關鍵字來處理記憶體資料一致性的問題
Java Language Specification 對 volatile 的定義
A field may be declared volatile, in which case the Java Memory Model...
2/14/2014
Mutex

Mutex 是 mutual exclusion 的縮寫, 中文譯為 "互斥",在多執行緒環境下,防止兩條以上的執行緒對一共用資源做同時存取的動作,一般做法是透過程式代碼 lock 的方式, 建立 critical section, 達到 mutex 的目的
下圖簡單表示 mutual exclusion 的意義
在 Java 1.4 可使用 synchronized 關鍵字來達到 mutex 的目的,但使用 synchronized 有些功能不易做到,例如
如果發現 lock 已被佔用,就只能等待,無法去處理其他的工作
在等待獲取鎖的狀況下,無法被 interrupt
自訂取得鎖的規則(公平鎖,非公平鎖)
Java 1.5 後新增 java.util.concurrent.locks package 補強 synchronized 的不足之處
ReentrantLock中文翻譯為"重入鎖",就字面上的意義代表當某個 thread 獲取某個鎖後,在未釋放鎖的情況下,可以獲得同一把鎖多次,因為 ReentrantLock 內部存在著一個計數器,計算取得鎖的次數,如果取得...
2/12/2014
Semaphore
提供平行運算環境中,控制多個 thread 存取共享資源的一種策略模式,semaphore 是一個計數器的概念,用於保護共享的資源
譬如說有多個 thread 想要對同一塊記憶體變數進行讀寫時,在讀寫這塊記憶體之前,先獲得一個保護變數的 semaphore,當獲得這個 semaphore 時,其他人都不能對這塊記憶體進行讀寫,直到 semaphore 持有者釋放 semaphore 為止,在這種狀況下 semaphore 的值只有二進位的 0 或 1,稱為 binary semaphores,當受保護的資源數量大於 1 的任意數量時,稱作 counting semaphores,semaphore 常用於實作 publisher subscriber model & resource pool 中
Java Semaphore example
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import...
1/29/2014
CAPTCHA
CAPTCHA 是 Completely Automated Public Turing test to tell Computers and Humans Apart 的縮寫,主要功能防止有人使用惡意程式大量送出網頁表單
網頁 CAPTCHA
最基本的 CAPTCHA 是利用程式產生一組數字或文字圖像,讓使用者辨識,並輸入圖像中看到的文字,連同網頁表單一起送出,Server 判斷使用者輸入的答案是否正確,後來發展出解計算題,選擇題,西洋棋遊戲等等,各式各樣不同的作法,在此我們就基本文字 CAPTCHA 的實作方式做討論,因 HTTP 協定是 Stateless,所以網頁在實作 CAPTCHA 面臨如何記憶 CAPTCHA 答案的問題,常見的實作方式有三種
將答案記憶在
web session
實作方便,但如果使用的人多,當 session 量一大,會有拖慢 web server 速度的風險
database
使用資料庫相較其他兩種方法,實作較為複雜,建置資料庫也需要額外的開銷
實作資料庫 CAPTCHA 可參考 CodeIgniter
首先建立...
1/21/2014
Java Atomic Operation
定義
代表一種不可再分割的操作,在 multithreading 的環境中 Atomic Operation 是達成 thread-safe 的方法之一
至於為什麼會取名 Atomic 呢? 可能是過去原子被認定為物質的最小單位,無法再分割有關
舉例來說,當我們在 Java 中執行宣告 int i = 12 會配置 32 bits 的記憶體空間並將 12 這個值寫到記憶體區塊中,將整數 12 寫入記憶體這個操作是一個 Atomic Operation,不會只做一半就被其他操作中斷,而影響指派(assignment)值的正確性
使用硬體裝置支援的 Atomic Operation 可有效地提高程式效率, Intel Software Developer’s Manual 有說明哪些操作 Guaranteed Atomic Operations
Java 除了 double 和 long 這兩個資料型別以外,所有的 primitive types & reference types 讀取和寫入操作都是...
1/16/2014
Java time zone data

今天發現 Java 的 MIT Time Zone 會因為版本的不同而有不同的結果
System.out.println("java version=" + System.getProperty("java.version"));
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSZ");
sdf.setTimeZone(TimeZone.getTimeZone("MIT"));
System.out.println("MIT time=" + sdf.format(now));
以下為測試各版本JRE跑出來的結果
output
------------------------------------------------------------
java version=1.4.2
MIT time=2014-01-15 14:01:06.937-1100
------------------------------------------------------------
java...
1/10/2014
C# Class and Struct
1.Memory Allocation
Class => Reference Type
Struct => Value Type
new operator on a class => heap
instantiate a struct => stack
以上的差異造成傳遞資料到 method 中會有不同的結果
Class => a reference is passed
Struct => a copy of the struct is passed
以下引用 MSDN 的範例程式 http://msdn.microsoft.com/en-us/library/aa288471(v=vs.71).aspx
// struct2.cs
using System;
class TheClass
{
public int x;
}
struct TheStruct
{
public int x;
}
class TestClass
{
public static void structtaker(TheStruct...
Subscribe to:
Posts (Atom)