速記一些常用到的快捷鍵:
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
星期六, 5月 17, 2014
星期一, 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才行......
現在舉一個例子,我們需要寫一支程序,能把某區間的所有整數相加後回傳,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才行......
標籤:
Programming,
Scheme
星期日, 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
因此發展另一概念:
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
標籤:
Cryptography,
Python,
Security
星期五, 7月 27, 2012
sizeof(bug)
關於C語言中的sizeof,如果不小心可能會產生蟲兒。
來看一下程式碼及執行結果:
其實是因為sizeof回傳的形態皆為unsinged。
加上當進行signed int d與unsigned int比較時,signed int會被轉成unsigned int。
所以d在是-1的情況下,其signed bit為1,當其轉為unsinged時,signed bit就成為most significant bit,使得d轉為極大的數了。
修正方法只要加上型態轉換即可:
來看一下程式碼及執行結果:
MaCarrick:mists-of-time cacaegg$ cat subtle-bug.c為什麼d明明是-1卻印出F呢?
#include
int array[] = {23, 34, 12, 17, 204, 99, 16};
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
main(){
int d = -1, x;
if(d <= TOTAL_ELEMENTS-2){
printf("T\n");
}else{
printf("F\n");
}
}
MaCarrick:mists-of-time cacaegg$ gcc subtle-bug.c
MaCarrick:mists-of-time cacaegg$ ./a.out
F
其實是因為sizeof回傳的形態皆為unsinged。
加上當進行signed int d與unsigned int比較時,signed int會被轉成unsigned int。
所以d在是-1的情況下,其signed bit為1,當其轉為unsinged時,signed bit就成為most significant bit,使得d轉為極大的數了。
修正方法只要加上型態轉換即可:
if(d <= (int) TOTAL_ELEMENTS - 2)
標籤:
Bugs,
C,
Programming
星期四, 1月 05, 2012
Booting Kernel inside the Xen Paravirt Dom U
記錄一下
先create image,然後將Dom 0的
最後就是/etc/xen/squeeze-1.cft中的設定,要指定kernel位置以及root fs的位置
先create image,然後將Dom 0的
#xen-create-image --hostname=squeeze-1 --size=8Gb --dist=squeeze --memory=256M --dhcp
....
#mount -o loop=/dev/loop2 /home/xen/domains/squeeze-1/disk.img /mnt/
#cd /mnt/boot
#cp /boot/vmlinuz-2.6.26-1-xen-686 ./
#cp /boot/initrd.img-2.6.26-1-xen-686 ./
#mkdir grub
#cd grub/
#cp /boot/grub/* ./
#vim device.map
#vim menu.lst
# cat device.map
(hd0) /dev/sda
## cat menu.lst
...
...
title Debian GNU/Linux, kernel 2.6.26-1-xen-686
root (hd0)
kernel /boot/vmlinuz-2.6.26-1-xen-686 root=/dev/sda ro quiet
initrd /boot/initrd.img-2.6.26-1-xen-686
title Debian GNU/Linux, kernel 2.6.26-1-xen-686 (single-user mode)
root (hd0)
kernel /boot/vmlinuz-2.6.26-1-xen-686 root=/dev/sda ro single
initrd /boot/initrd.img-2.6.26-1-xen-686
最後就是/etc/xen/squeeze-1.cft中的設定,要指定kernel位置以及root fs的位置
#指定disk.img export 到/dev/sda,然後再指定root是/dev/sda
# Configuration file for the Xen instance squeeze-1, created
# by xen-tools 3.9 on Thu Jan 5 17:35:59 2012.
#
#
# Kernel + memory size
#
kernel = '/boot/vmlinuz-2.6.26-1-xen-686'
ramdisk = '/boot/initrd.img-2.6.26-1-xen-686'
memory = '256'
#
# Disk device(s).
#
root = '/dev/sda ro'
disk = [
'file:/home/xen/domains/squeeze-1/swap.img,sda1,w',
'file:/home/xen/domains/squeeze-1/disk.img,sda,w',
]
訂閱:
文章 (Atom)