11/04/2014
3:54:00 PM 0

Java flatMap vs C# SelectMany

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[][]...
8/26/2014
2:56:00 PM 0

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...
2:47:00 PM 0

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
6:16:00 PM 0

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:...
1:54:00 PM 0

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
2:16:00 PM 0

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
3:19:00 PM 0

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
1:24:00 PM 0

CSS 權重計算

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
4:11:00 PM 0

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
1:24:00 PM 0

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
6:04:00 PM 0

GoDaddy 設定將 domain.com 轉址到 www.domain.com

GoDaddy 設定將 domain.com 轉址到 www.domain.com
首先使用個人帳號登入 在 Products 管理畫面上, 展開 DOMAINS 的下拉表格, 按下 Launch 按鈕 修改 Domain Settings 內的 Forwarding 設定 按下 Add one now 輸入 Forwarding to 的網址 按下 Save 設定完成 完成後的畫面如下, 稍後片刻設定才會生效...
3:48:00 PM 0

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
5:46:00 PM 0

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 無法執行的問題

解決更新 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
2:31:00 PM 0

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
4:48:00 PM 0

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
1:31:00 PM 0

Mutex

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
2:18:00 PM 0

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
3:25:00 PM 0

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
7:58:00 PM 0

Java time zone data

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
3:06:00 PM 0

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...