2008年1月13日 星期日

學習 Evas

這陣子開始需要用 Evas 寫一些東西…
個人覺得學一個 library 最快的方法就是去真的拿它去寫程式。
如我的一個好友常說的:學中作,作中學 ^^
所以就寫了支小小的玩具… 和大家分享…


亂畫一個方塊,設定一個重力場,和一個 boundary反彈機制. ( 和一些阻泥 (mark 掉了)) 加上一個色彩空間的旋轉。就玩起來了 ^^

程式:

Filename: toy.c

#include <Ecore_Evas.h>
#include <Ecore.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#define WIDTH 400
#define HEIGHT 400

Ecore_Evas * ee;
Evas * evas;
Evas_Object * base_rect;

double rotation[3][3] = { {0 , 0 , 1},
{1, 0, 0},
{0 , 1, 0}
};

struct bouncer {
Evas_Object *o;
int w,h;
double xs,ys;
double x,y;
double color[3];
};

inline void change_color(struct bouncer *bounce) {
double X[3];
int i,j;
int R,G,B;
for (i=0;i<3;i++) {
X[i]=bounce->color[i];
bounce->color[i]=0;
}
for (i=0;i<3;i++) {
for (j=0;j<3;j++) {
bounce->color[i] += rotation[i][j]*X[j];
}
}
R=bounce->color[0] < 0 ? bounce->color[0] + 255: bounce->color[0];
G=bounce->color[1] < 0 ? bounce->color[1] + 255: bounce->color[1];
B=bounce->color[2] < 0 ? bounce->color[2] + 255: bounce->color[2];
evas_object_color_set( bounce->o , R, G, B, 255);
}

inline void center(struct bouncer *bounce,double *x,double *y) {
*x = bounce->x + bounce->w/2;
*y = bounce->y + bounce->h/2;
}

inline void grav(struct bouncer *bounce) {
const double G=300;
double Gx,Gy,Gs;
double x,y;
double dist;
center(bounce,&x,&y);

dist = pow(pow(WIDTH/2-x,2) + pow(HEIGHT/2-y,2),0.5);
Gs = G/pow(dist,2);
Gx = (WIDTH/2 - x)/dist;
Gy = (HEIGHT/2 -y)/dist;
Gx = Gx * Gs;
Gy = Gy * Gs;

bounce->xs += Gx;
bounce->ys += Gy;

// Slow down~~
//bounce->xs = abs(bounce->xs) > 13 ? bounce->xs *(1/ pow(bounce->xs-10,2)): bounce->xs;
//bounce->ys = abs(bounce->ys) > 13 ? bounce->ys *(1/ pow(bounce->ys-10,2)): bounce->ys;
printf ("x=%2.2f y=%2.2f dist=%4.2f Gs=%2.2f Gx=%2.2f Gy=%2.2f xs=%2.2f ys=%2.2f\n",x,y,dist,Gs,Gx,Gy,bounce->xs,bounce->ys);
}
inline void calculate_pos(struct bouncer *bounce) {
grav(bounce);
bounce->x += bounce->xs;
bounce->y += bounce->ys;

// bounce
bounce->xs = bounce->x >=0 ? bounce->x + bounce->w <= WIDTH ? bounce->xs : -bounce->xs : -bounce->xs;
bounce->ys = bounce->y >=0 ? bounce->y + bounce->h <= HEIGHT? bounce->ys : - bounce->ys : - bounce->ys;
}

int move(void *data) {
struct bouncer *bounce =(struct bouncer *)data;
calculate_pos(bounce);
evas_object_move(bounce->o,bounce->x,bounce->y);
change_color(bounce);
return 1;
}

int main() {
struct bouncer bounce;
ecore_evas_init();

ee = ecore_evas_software_x11_new(NULL, 0, 0, 0, WIDTH, HEIGHT);
ecore_evas_title_set(ee, "Tick's Evas Study");
// ecore_evas_borderless_set(ee, 1); // borderless
ecore_evas_borderless_set(ee, 0); // border
ecore_evas_show(ee);


evas = ecore_evas_get(ee);
evas_font_path_append(evas, "fonts/");


bounce.o = evas_object_rectangle_add(evas);
bounce.w=bounce.h= (double)WIDTH/4;
bounce.x=(double)(WIDTH - bounce.w)/3;
bounce.y=(double)(HEIGHT- bounce.h)/6;
bounce.xs=-1.1; bounce.ys=1.1;
bounce.color[0]=128;
bounce.color[1]=64;
bounce.color[2]=255;
change_color(&bounce);
evas_object_resize( bounce.o, bounce.w, bounce.h);
evas_object_move( bounce.o,bounce.x,bounce.y);
evas_object_show( bounce.o);

ecore_timer_add((double)0.01,move,&bounce);

ecore_main_loop_begin();

return 0;
}


2008年1月9日 星期三

codecovert

Covert C code to Google prettyprint format

Filename: /usr/local/bin/codecovert

#!/bin/bash
for FF in $@;
do
if [ -e $FF ];then
echo Filename: $FF
echo "<pre class=\"prettyprint\">"
sed -e 's/&/\&amp;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/g' $FF
echo "</pre>"
fi
echo
done

Hello world


BITS 32

;section .text
;global _start
;_start:
jmp short two

one:
pop ecx ; using the db
; write
xor eax,eax
mov al, 4
xor ebx,ebx
mov bl, 1
xor edx, edx
mov dl, 13
int 0x80

;exit
xor eax,eax
mov al, 1
xor ebx, ebx
int 0x80

two:
call one
db "Hello_World!!"

Warning of "system" and "pipe"

I chatted with my friend about some security issues days before. I had mentioned about the function call "system" and "pipe" shall be avoid in many cases. It's very simple idea, but as I know many programmers even do not know it's very dangerous.
Please NEVER NEVER NEVER use this function to important programs.
NEVER allow user to touch the args, or PATH.
Please~~~



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void fake_ls(int args,char **argv) {
char buf[50];
char *ptr=buf;
int i;
sprintf(buf,"ls");
for (i=1;i<args;i++) {
ptr = buf + strlen(buf);
sprintf(ptr," %s",argv[i]);
}
printf("The command you send is: '%s'\n",buf);
system(buf);
}
int main (int args,char **argv) {
printf("argv=%p\n",argv);
fake_ls(args,argv);
}


you can use the following argument to execute
extra command: "-al\;cat /etc/passwd"
It's very easy to see how terrible it is. :-)

2007年12月30日 星期日

新年快樂

2007 年再 26.5 小時後就結束了…
發生了好多事。

希望 2008 年是會大好年。

2007年11月3日 星期六

Quilt - Patches 整合 Script

在社群中開發程式往往是用 patch 來做來開發工具。
Developer 會在 mail list 上發 patch 出來,而 Maintainer 會把這些 patches 整合起
個,做好 review 再一個一個 commit 上 mainstream 之中。而當 Patch 的量很大,而又>有相依性之時…
一個 Open Source Project 的 Maintainer 要如何管理這些 Patch 呢?

[Quilt]就是這樣的一個好用的工具。

假設今天你在 maintain 一個案子,叫 ”mypro“ 放在 /work/mypro 底下而你拿到了 5 個
patches
001_ooxx.patch
002_lalal.patch
003_lele.patch
004_bad.patch
005_conflict.patch

你可以在 /work/mypro/ 下建立一個 patches 的目錄 (如果想自已指定請 export QUILT_PATCHES="....")
把 patches 放在 /work/mypro/patches 之中
再建一個檔案 /work/mypro/patches/series 把這五個patches 依序寫入 series 中,一行一個 patch, 如果有base 目錄不同的問題 (quilt default 是打 patch -p1) 可在後面加上 -p.
假設 003_lele.patch 這個 patch 是在 /work/mypro 下用 svn diff > 003_lele.patch 做出來的, 那在 series 之中就要寫成:
003_lele.patch -p0

所以 series 就會變成
---------------------
001_ooxx.patch
002_lalal.patch
003_lele.patch -p0
004_bad.patch
005_conflict.patch
---------------------

如此設好之後,就可以用 "quilt push" 打 patch ,用 "quilt pop " 退回上層…
如果要一次打完所有 patch 可以用 quilt push -a 一次打完…想退回 code base 時,就用 quilt pop -a 一路退到底。

可以用 quilt top 看你上一個打的 patch 是那個 patch ,用 quilt next 看下一個是那個 patch
如果發現 patch 有些地方需要修改,可以用quilt edit <檔案> 做修改…修改好了之後,可以用 quilt refresh 把修改寫入 "上一個打的 patch" ,也就是 quilt top 看得到的那個。

如果要寫新的 patch 可以用 quilt new ,加上 quilt edit <要修改的檔名>,做完後用 quilt refresh 把 diff 寫入 patch。

因為你打了多個 patch 之後 svn diff 就會混合了多個 patch ,如果只想看上個打的 patch 的影響可用 quilt diff 來看。

一般來說,如果你要手動修改你的 series 檔。可先 quilt pop -a 退回 code base 再做修改…如手動 mark 掉一些patch 或加上註解,註解是由 '#' 做為開頭。

如果code base 改變了…可 quilt pop -a 退回開頭,再 svn update (cvs ),再把一些已被 commit 的 patch remove 掉(這個要檢查一下,一般來說有 commit 都會說明 commit 了那些 patch ),再一個一個 push 回來

而如果你想 commit code 時,也可一面 push 一面 commit 。等 commit 完了,再把 series 裏已 push 且 commit 的 patch mark 掉,然後直接砍掉 /work/mypro/.pc 這個目錄…這是 quilt 管理 diff 的目錄…如此就可以直接可 upstream 同步。 (如果你是 maintainer )

當你要 release patch 到 mail list 前,可以把你的 code base 的版號(最好是 HEAD),和你之前相依的 patch (如果有的話),一起 release 出來。如果 release 的 patch 多於兩個。最好也把 series release 出來。

--
Reference:
How To Survive With Many Patches or Introduction to Quilt

2007年10月28日 星期日

十年

人總是在失去後才覺得珍貴。

這幾天正好是我們認識十週年,雖然分手好一段時間了,而我們又各自有了新的戀情。
聽到這首歌,份外有感覺。

對不起,我們錯過了…


十年 - 陳奕迅 曲︰陳小霞 詞︰林夕 編︰陳輝陽
如果那兩個字沒有顫抖
我不會發現我難受
怎麼說出口 也不過是分手
如果對於明天沒有要求
牽牽手就像旅遊 成千上萬個門口
總有一個人要先走

懷抱既然不能逗留 何不在離開的時候
一邊享受 一邊淚流

十年之前 我不認識你
你不屬於我 我們還是一樣
陪在一個陌生人左右
走過漸漸熟悉的街頭

十年之後 我們是朋友
還可以問候 只是那種溫柔
再也找不到擁抱的理由
情人最後難免淪為朋友

直到和你做了多年朋友
才明白我的眼淚 不是為你而流
也為別人而流