星期四, 9月 18, 2014

Visitor Pattern、Functor與Lambda

Visitor Pattern與Functor都是為了保留計算環境,再將其用做之後的計算以達到彈性的目的。
例如這樣的Java程式碼可以把someone中的元素都加上3:

AddVisitor add_v = AddVisitor(3);
someone.accept(add_v);

C++也可以做出類似的計算,只是比較麻煩就不寫在這。

上述兩者只需要Lambda所產生的Closure,就可以輕鬆達到了
例如下列Python程式碼:

add_v = (lambda x: lambda y: x + y)(3)
someone.accept(add_v)
Lambda遠比許多人所想的更有威力,不是嗎?

星期日, 8月 24, 2014

Java與C#的Generic Programming的比較

Java說everything is an object真是吃力不討好,很多簡單的東西也要包到物件裡面。
例如整數好了,在Java李就要分成Primitive type跟Wrapped Object。

為什麼要這樣分呢?
其實是為了Generic Programming而衍伸出來的做法。
因為在Java裡一切都是物件,所以連Generic中的東西都要用物件去包,才能保證語言的形態安全。
於是在Java裡面不能使用
Stack s;
而要使用
Stack s;

塞個東西進去要
s.push(Integer(1));
而不能使用
s.push(1);

這不僅是語法上的不便,更是造成實際執行的效能影響。
因為每個物件存取都需要在經過一層reference,比起1直接使用,
操作一多效率可就影響大了。

在這方面,C#中對built-in type的generic programming,例如Stack是允許的,相較之下可就顯得進步多了。

星期六, 5月 17, 2014

emac中編輯Scheme的快捷鍵

速記一些常用到的快捷鍵:

1. c-x 2
   將目前Window一分為二

2. c-x o
    不同Window切換

3. c-c c-e
    把當前游標的expression,丟給變數scheme-program-name中的Interpreter

4.c-x b
  把指定buffer讀到當前Window

5. c-shift 左右鍵
  左鍵: 將當前expression中最後一個推到現在expression後面
  例如 (+ 1 1 (+ 2 2))就會變成 (+ 1 1) (+ 2 2)
  右鍵則相反

6. c-/  
   Undo

7. c-g c-/
   Redo

8. Set Mark c-@

9. Copy & Paste c-c & c-v

星期一, 10月 07, 2013

初探Higher Order Procedure(一)

若一支程序會去修改一另支程序,來達成某種目的,則此程序可稱之為Higher Order Procedure。此外,此程序的參數要是程序。接下來的說明就用Scheme語言來表示。

現在舉一個例子,我們需要寫一支程序,能把某區間的所有整數相加後回傳,Scheme程序如下:

(define (sum-integer a b)
  (if (> a b)
      0
      (+ a (sum-integer (+ a 1) b)))

使用此程序能把從a到b間的整數相加。而今天有另外一件事,是想要相加某區段立方體體積,則可以用下列程序表示:

(define (cube x) (* x x x))
(define (sum-cube a b)
  (if (> a b)
      0
      (+ (cube a) (sum-cube (+ a 1) b)))

可以觀察到sum-integer及sum-cube都有很大程度的相似,這時就可以用Higher Order Procedure來簡化。未來有各種類似工作,都可以此輕鬆達到相同目的:

(define (sum term a next b)
  (if (> a b)
       0
      (+ (term a) (sum term (next a) next b))))

term是用來產生每一個單位的程序。next則是接後現在的值,產生下一個要處理的值。a及b不消分說,就是開始以及結束了。使用此Higher Order Procedure後,我們可以改寫原本的sum-integer & sum-cube如下:

(define (identity x) x)
(define (sum-integer a b)
  (sum identity a 1+ b))
(define (cube x) (* x x x))
(define (sum-cube a b)
  (sum cube a 1+ b))

多有用的一種程序。能把程序寫的簡單又明瞭,除了Scheme以外,我想用其他現在流行的程式語言(C, C++, Java, C#)要達到相同效果,無非是邯鄲學步吧!光是要能直接用程序作為參數,Java就需要借用Command Pattern才行......

星期日, 6月 16, 2013

Chained XOR Encoding

通常以單一的XOR作為Key,很容易就被發現了。

因此發展另一概念:
1. 以Content的頭或尾作為第一把XOR Key
2. 用這把Key去XOR,產生的OUTPUT作為下一個Byte的Key

PoC Python Code

a = [0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8]
key = a[-1]
e = []

for i in range(len(a)):
    out = a[i] ^ key
    e.append(out)
    key = out

print "Encoded Bytes: ", e

d = []
for i in range(len(e)-1, 0, -1):
    d.append(e[i] ^ e[i-1])
d.append(e[0] ^ d[0])
d.reverse()
print "Decoded Bytes: ", d