2009年12月14日 星期一

[備忘] RGB565 To PNG/JPEG

竟然忘掉了… 寫在這備忘

ffmpeg -vcodec rawvideo -f rawvideo -pix_fmt rgb565 -s 1024x720 -i input.raw -f image2 -vcodec png output.png

2009年10月13日 星期二

Oprofile 0xdroid Android on Beagleboard

Android supports oprofile actually. And you can play happily with that with some oprofile knowledge on G1. However the external/oprofile in Android does not support ARM_V7 for now. To play with it patch the following type and trigger support of ARM_V7


diff --git a/libop/op_cpu_type.c b/libop/op_cpu_type.c
index b9d13de..737f63e 100644
--- a/libop/op_cpu_type.c
+++ b/libop/op_cpu_type.c
@@ -74,6 +74,7 @@ static struct cpu_descr const cpu_descrs[MAX_CPU_TYPE] = {
{ "ppc64 POWER5++", "ppc64/power5++", CPU_PPC64_POWER5pp, 6 },
{ "e300", "ppc/e300", CPU_PPC_E300, 4 },
{ "AVR32", "avr32", CPU_AVR32, 3 },
+ { "ARM V7 PMNC", "arm/armv7", CPU_ARM_V7, 5},
};

static size_t const nr_cpu_descrs = sizeof(cpu_descrs) / sizeof(struct cpu_descr);
diff --git a/libop/op_cpu_type.h b/libop/op_cpu_type.h
index be95ae2..f4db260 100644
--- a/libop/op_cpu_type.h
+++ b/libop/op_cpu_type.h
@@ -72,6 +72,7 @@ typedef enum {
CPU_PPC64_POWER5pp, /**< ppc64 Power5++ family */
CPU_PPC_E300, /**< e300 */
CPU_AVR32, /**< AVR32 */
+ CPU_ARM_V7, /**< ARM V7 */
MAX_CPU_TYPE
} op_cpu;

diff --git a/libop/op_events.c b/libop/op_events.c
index b4a10e7..7f0ed25 100644
--- a/libop/op_events.c
+++ b/libop/op_events.c
@@ -793,6 +793,7 @@ void op_default_event(op_cpu cpu_type, struct op_default_event_descr * descr)
case CPU_ARM_XSCALE2:
case CPU_ARM_MPCORE:
case CPU_ARM_V6:
+ case CPU_ARM_V7:
case CPU_AVR32:
descr->name = "CPU_CYCLES";
break;
diff --git a/opimport_pull b/opimport_pull
index 7dbac4a..bf1f19a 100755
--- a/opimport_pull
+++ b/opimport_pull
@@ -1,4 +1,4 @@
-#!/usr/bin/python2.4 -E
+#!/usr/bin/python -E

import os
import re


And adding event tables for ARMv7

commit f129bca975b1704c06e07df7710d29de13a1e922
Author: Tick Chen <tick@0xlab.org>
Date: Sat Sep 26 22:56:44 2009 +0800

[oprofile] adding metadata of armv7

diff --git a/linux-x86/oprofile/arm/armv7/events b/linux-x86/oprofile/arm/armv7/events
new file mode 100644
index 0000000..2550e41
--- /dev/null
+++ b/linux-x86/oprofile/arm/armv7/events
@@ -0,0 +1,53 @@
+# ARM V7 events
+# From Cortex A8 DDI (ARM DDI 0344B, revision r1p1)
+#
+event:0x00 counters:1,2,3,4 um:zero minimum:500 name:PMNC_SW_INCR : Software increment of PMNC registers
+event:0x01 counters:1,2,3,4 um:zero minimum:500 name:IFETCH_MISS : Instruction fetch misses from cache or normal cacheable memory
+event:0x02 counters:1,2,3,4 um:zero minimum:500 name:ITLB_MISS : Instruction fetch misses from TLB
+event:0x03 counters:1,2,3,4 um:zero minimum:500 name:DCACHE_REFILL : Data R/W operation that causes a refill from cache or normal cacheable memory
+event:0x04 counters:1,2,3,4 um:zero minimum:500 name:DCACHE_ACCESS : Data R/W from cache
+event:0x05 counters:1,2,3,4 um:zero minimum:500 name:DTLB_REFILL : Data R/W that causes a TLB refill
+event:0x06 counters:1,2,3,4 um:zero minimum:500 name:DREAD : Data read architecturally executed (note: architecturally executed = for instructions that are unconditional or that pass the condition code)
+event:0x07 counters:1,2,3,4 um:zero minimum:500 name:DWRITE : Data write architecturally executed
+event:0x08 counters:1,2,3,4 um:zero minimum:500 name:INSTR_EXECUTED : All executed instructions
+event:0x09 counters:1,2,3,4 um:zero minimum:500 name:EXC_TAKEN : Exception taken
+event:0x0A counters:1,2,3,4 um:zero minimum:500 name:EXC_EXECUTED : Exception return architecturally executed
+event:0x0B counters:1,2,3,4 um:zero minimum:500 name:CID_WRITE : Instruction that writes to the Context ID Register architecturally executed
+event:0x0C counters:1,2,3,4 um:zero minimum:500 name:PC_WRITE : SW change of PC, architecturally executed (not by exceptions)
+event:0x0D counters:1,2,3,4 um:zero minimum:500 name:PC_IMM_BRANCH : Immediate branch instruction executed (taken or not)
+event:0x0E counters:1,2,3,4 um:zero minimum:500 name:PC_PROC_RETURN : Procedure return architecturally executed (not by exceptions)
+event:0x0F counters:1,2,3,4 um:zero minimum:500 name:UNALIGNED_ACCESS : Unaligned access architecturally executed
+event:0x10 counters:1,2,3,4 um:zero minimum:500 name:PC_BRANCH_MIS_PRED : Branch mispredicted or not predicted. Counts pipeline flushes because of misprediction
+event:0x12 counters:1,2,3,4 um:zero minimum:500 name:PC_BRANCH_MIS_USED : Branch or change in program flow that could have been predicted
+event:0x40 counters:1,2,3,4 um:zero minimum:500 name:WRITE_BUFFER_FULL : Any write buffer full cycle
+event:0x41 counters:1,2,3,4 um:zero minimum:500 name:L2_STORE_MERGED : Any store that is merged in L2 cache
+event:0x42 counters:1,2,3,4 um:zero minimum:500 name:L2_STORE_BUFF : Any bufferable store from load/store to L2 cache
+event:0x43 counters:1,2,3,4 um:zero minimum:500 name:L2_ACCESS : Any access to L2 cache
+event:0x44 counters:1,2,3,4 um:zero minimum:500 name:L2_CACH_MISS : Any cacheable miss in L2 cache
+event:0x45 counters:1,2,3,4 um:zero minimum:500 name:AXI_READ_CYCLES : Number of cycles for an active AXI read
+event:0x46 counters:1,2,3,4 um:zero minimum:500 name:AXI_WRITE_CYCLES : Number of cycles for an active AXI write
+event:0x47 counters:1,2,3,4 um:zero minimum:500 name:MEMORY_REPLAY : Any replay event in the memory subsystem
+event:0x48 counters:1,2,3,4 um:zero minimum:500 name:UNALIGNED_ACCESS_REPLAY : Unaligned access that causes a replay
+event:0x49 counters:1,2,3,4 um:zero minimum:500 name:L1_DATA_MISS : L1 data cache miss as a result of the hashing algorithm
+event:0x4A counters:1,2,3,4 um:zero minimum:500 name:L1_INST_MISS : L1 instruction cache miss as a result of the hashing algorithm
+event:0x4B counters:1,2,3,4 um:zero minimum:500 name:L1_DATA_COLORING : L1 data access in which a page coloring alias occurs
+event:0x4C counters:1,2,3,4 um:zero minimum:500 name:L1_NEON_DATA : NEON data access that hits L1 cache
+event:0x4D counters:1,2,3,4 um:zero minimum:500 name:L1_NEON_CACH_DATA : NEON cacheable data access that hits L1 cache
+event:0x4E counters:1,2,3,4 um:zero minimum:500 name:L2_NEON : L2 access as a result of NEON memory access
+event:0x4F counters:1,2,3,4 um:zero minimum:500 name:L2_NEON_HIT : Any NEON hit in L2 cache
+event:0x50 counters:1,2,3,4 um:zero minimum:500 name:L1_INST : Any L1 instruction cache access, excluding CP15 cache accesses
+event:0x51 counters:1,2,3,4 um:zero minimum:500 name:PC_RETURN_MIS_PRED : Return stack misprediction at return stack pop (incorrect target address)
+event:0x52 counters:1,2,3,4 um:zero minimum:500 name:PC_BRANCH_FAILED : Branch prediction misprediction
+event:0x53 counters:1,2,3,4 um:zero minimum:500 name:PC_BRANCH_TAKEN : Any predicted branch that is taken
+event:0x54 counters:1,2,3,4 um:zero minimum:500 name:PC_BRANCH_EXECUTED : Any taken branch that is executed
+event:0x55 counters:1,2,3,4 um:zero minimum:500 name:OP_EXECUTED : Number of operations executed (in instruction or mutli-cycle instruction)
+event:0x56 counters:1,2,3,4 um:zero minimum:500 name:CYCLES_INST_STALL : Cycles where no instruction available
+event:0x57 counters:1,2,3,4 um:zero minimum:500 name:CYCLES_INST : Number of instructions issued in a cycle
+event:0x58 counters:1,2,3,4 um:zero minimum:500 name:CYCLES_NEON_DATA_STALL : Number of cycles the processor waits on MRC data from NEON
+event:0x59 counters:1,2,3,4 um:zero minimum:500 name:CYCLES_NEON_INST_STALL : Number of cycles the processor waits on NEON instruction queue or NEON load queue
+event:0x5A counters:1,2,3,4 um:zero minimum:500 name:NEON_CYCLES : Number of cycles NEON and integer processors are not idle
+event:0x70 counters:1,2,3,4 um:zero minimum:500 name:PMU0_EVENTS : Number of events from external input source PMUEXTIN[0]
+event:0x71 counters:1,2,3,4 um:zero minimum:500 name:PMU1_EVENTS : Number of events from external input source PMUEXTIN[1]
+event:0x72 counters:1,2,3,4 um:zero minimum:500 name:PMU_EVENTS : Number of events from both external input sources PMUEXTIN[0] and PMUEXTIN[1]
+event:0xFF counters:0 um:zero minimum:500 name:CPU_CYCLES : Number of CPU cycles
+
diff --git a/linux-x86/oprofile/arm/armv7/unit_masks b/linux-x86/oprofile/arm/armv7/unit_masks
new file mode 100644
index 0000000..02464a3
--- /dev/null
+++ b/linux-x86/oprofile/arm/armv7/unit_masks
@@ -0,0 +1,4 @@
+# ARM V7 PMNC possible unit masks
+#
+name:zero type:mandatory default:0x00
+ 0x00 No unit mask


This way we can play oprofile on beagleboard already. But you cannot analysis it yet.
Because of that prebuild opreport does not supports ARM_v7. Therefore I downloaded and compile the oprofile 0.9.5. Replace those in prebuild, then we can analysis the data happily.


All of these stuff had been done in 0xdroid, therefore you can play directly with 0xdroid.
The default kernel released in http://downloads.0xlab.org/ currently does not set oprofile flags up therefore you will need to set them up and recompile it.


+ CONFIG_OPROFILE_ARMV7=y
+ CONFIG_OPROFILE=y
+ CONFIG_PROFILING=y
+ CONFIG_HAVE_OPROFILE=y
+ CONFIG_TRACEPOINTS=y


You can throw the vmlinux into a usb storage or SD card with VFAT partition as the first partition.

After booting up 0xdroid beagle-cupcake or beagle-donut, you can run


opcontrol —setup —event=CPU_CYCLES:15000:::1:1 \
—vmlinux=/sdcard/vmlinux \
—kernel-range=0xc0008000,0xcfffffff
echo 16 > /dev/oprofile/backtrace_depth


That will setup the oprofiled to trigger sampling for every 15000 clock cycles. The smaller CPU_CYCLES the more heavy loading of profiling and getting more details. The larger CPU_CYCLES the less detail we get and lower profiling loading.
When I am profiling the overhead of camera preview I found one interesting phenomenon. When I use 150000 as sampling CPU_CYCLES, it's about sampling 30 times per second. I cannot get anything meaningful with the sampling rate. This confused me for a while before I realize it's just about the same frame rate with camera. I always sampled at the same point. Therefore even if we samples a lot, the grid of sampling period should be much smaller than what you want to profile. We always may be blind to some samples. We should be aware of that, and we may need to change various CPU_CYCLES profiling the same topic to get more confidence of the result.

When you are ready to profile just enter

opcontrol --start


And then do whatever you want to profile.
Stop oprofile with

opcontrol --stop


After stopping oprofile, you can use a mini usb cable to download all the samples to the host machine, and analysis them.


On device:
1. plug in usb line between laptop and beagleboard (OTG port)
2. netcfg usb0 up
3. ifconfig usb0 192.168.0.202
On you host:
1. sudo ifconfig usb0 192.168.0.200 # beware nm-applet may breaks it, you can set it up.
2. export ADBHOST=192.168.0.202
3. export PATH={Where you put 0xdroid}/out/host/linux-x86/bin:$PATH
4. pkill adb
5. adb devices # If you can see the device then you can do next step, or you may need to checkout what’s wrong.


Then:


cd {Where you put 0xdroid}
. build/envsetup.sh
setpaths
export OPROFILE_EVENTS_DIR=${PWD}/linux-x86/oprofile/
cd external/oprofile
./opimport_pull /tmp/0xdroid-oprofile


Copy your vmlinux to ${OUT}/symbols

Then you can analysis the whole symbols with

${OPROFILE_EVENTS_DIR}/bin/opreport --session-dir=/tmp/0xdroid-oprofile -p ${OUT}/symbols


After analyzing, we can use ooffice, graphvis, gnuplot, or whatever you like to rework the data. For example:







Happy profiling. :-)

2009年8月31日 星期一

murmur

沒什麼,太久沒寫文章,發個聲,証明自已還活著。

今年是一個充滿挑戰的一年,從籌備到成立 0xlab,接受各式各樣的挑戰,同時面對各方面的問題。和一群優秀的人一起工作,做一堆沒人做過的事,真是刺激極了。

這幾個月的目標是建立一個大家可以一同工作的平台,從設備到開發流程的建立。在大家的努力之下,慢慢的把一些東西建立了起來。對內做了相當多的實驗,對外則是提出了一個可以和大家一同工作的軟體平台。第一次的 code drop 之中,把 beagle-cupcake 調到可以玩,可以快速共同開發,容易整合。準備把心中的 item 慢慢一個一個完成。

把基礎打好了,真正的挑戰才要開始。給自已加油,也為大家加油。

這幾個月中之,發現到自已體力上的極限。刻意的放慢自已的腳步,我們是要做長做久的,不可以一下子就把自已燒掉。小心小心切記切記。對於自已一些 FOSS 的案子,真是對使用者感到抱歉,只要有時間和體力,我就會回來看的。 XD

在 lab 進入軌道後,接下來最重要的目標反而是調整好自已:管理好自已的情緒,讓自已更快樂、給自已更多時間,早點下班,多運動,讓自已更健康、訓練自已的表達能力,讓自已更能夠清楚的表達出想法。

希望能給大家和自已一個更好的 Tick. XD

2009年4月27日 星期一

0xlab is opening

0xlab looks very like 0x'1'ab and 0x1ab is 427. Therefore we choose this day to announce our lab. :)
http://0xlab.org

We are a group of software engineers who have strong passion in Free Open Source Software. We believe the power of knowledge and creativity, and we think we can do something very interesting and valuable.

2009年3月29日 星期日

Beagleboard demo

Demo for the last four days developement.






[beagleboard hacking note] HDMI monitor

I tried to use my LG TV as the monitor of beagleboard for three days, after some turning it works fine with Angstrom distribution. However, not in Android.
I tried to hacked around the driver/video/omap/lcd_omap3beagle.c but without successful. Just cannot see the Android screenshot. :(
After a long try, I almost sure every setting in my kernel is correct.And by checking the log, Android run very well. I thought it may be a problem from my TV, therefore I bring my beagle board to a 3C market and ask for testing a new HDMI monitor. It worked like a charm!! Oh my god, the LG TV waste a lot of my time. :( I bought that monitor without second though immediately.

Finally, I can play Android with my beagleboard. :-)
From beagleboard


But it seem need some other hack to simulate the touch panel events. I am considering write a fake device and sending touch panel event to kernel. (Is that a good idea? I doubt. Any Idea?)

A tiny program read signal from rs232, and translate message to positions and write to a device, and that device triggers input event report of touch panel. XD Hmm.... It's a pure dirty hack. Any suggestion? I don't want to buy another touch panel. I already bought too many stuff. Orz...

murmuring

2009年3月28日 星期六

[beagleboard hacking note] OE references

OE: openembedded a very powerful and complex build system.
beagleboard google code beagleboard info and download center.
Angstrom Distribution a good embedded distribution maintained by Koen, and that is what I am mainly used, and hacking on.

DSS reference a very good document to control the omap fbs


my local.conf of building beagleboard demo image

Filename: local.conf

MACHINE = "beagleboard"
DISTRO = "angstrom-2008.1"
BUILD_ARCH = "x86_64"
#INHERIT += "rm_work"
PARALLEL_MAKE = "-j 3"
BB_NUMBER_THREADS = "1"
TMPDIR = "/home/tick/OE/build/tmp"
BBFILES := "/home/tick/OE/openembedded/recipes/*/*.bb"


> bitbake beagleboard-demo-image
and have fun

[beagleboard hacking note] Bluetooth network

Because of using USB OTG mode, connecting beagleboard with keyboard and mouse. I cannot use usb0 as ethernet card. Therefore, I can use bluetooth dongle to simulate ethernet card.

1. modify the kernel configure, to allow usb bluetooth dongle works.
@@ -455,7 +455,7 @@ CONFIG_BT_HIDP=y
#
# Bluetooth device drivers
#
-# CONFIG_BT_HCIBTUSB is not set
+CONFIG_BT_HCIBTUSB=y
CONFIG_BT_HCIBTSDIO=y
# CONFIG_BT_HCIUART is not set
CONFIG_BT_HCIBCM203X=y

2. After boot, plug the dongle.
determin if bluetooth device detected or not.
> hcitool dev
scan surrounding bluetooth devices
> hcitool scan
If everything goes fine, we can try to connect bluetooth devices (e.g. mouse)

3. make your laptop a network access point (NAP) a very good document you should check
On your laptop with bluetooth RF on
a. turn off /etc/init.d/bluetooth
> /etc/init.d/bluetooth stop
b. modprobe bnep
c. pand -s -r NAP
On beagleboard:
a. finding the baddr of your laptop
> hcitool scan
b.connect to your laptop
>pand -c XX:XX:XX:XX:XX:XX:XX
c. Setup your beagleboard network
> ifconfig bnep0 192.168.0.202
> route add default gw 192.168.0.200
d. On your laptop set, let your laptop becomes an NAT gateway:
> ifconfig bnep0 192.168.0.200
> echo 1 > /proc/sys/net/ipv4/ip_forward
> iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
Enjoy the wireless network :-)

[beagleboard hacking note] USB OTG line

Beagleboard supports USB OTG mode, however beagleboard cannot run OTG mode with normal 5 pin mini USB lines.

It needs to short pin 4 and 5. and so that you can play with OTG mode. Therefore I bought a B type mini usb line and remove the cover and short pin 4 and 5, and I can play with OTG mode happily.

From beagleboard


From beagleboard

BTW, beagleboard can play as client with normal mini usb to USB A line as ethernet card. (USB0)

[beagleboard hacking note] Null modem

The first step of hacking beagleboard. You need to connect to beagleboard first.
.You will need a null modem line to connect beagleboard RS232 port and your PC.

My way is very straight forward: just buy a USB to RS232 line, three thin wires, one 2.5mm 5x2 pin slot, and a RS232 female head.

From beagleboard


Actually you only need to connect three wires, pin2 pin3 and pin5, and remember switch pin 2 and 3. Check here!

After made the line for beagleboard, you can use cu , minicom, or even screen to connect beagleboard. Baud rate is 115200n8.

From beagleboard


Therefore you can access the beagleboard u-boot and console.

2009年3月15日 星期日

Taipei App Engine Sprint 2009

感謝 Ping 的邀請,我們團隊的其中三人昨天去 Google 玩了一整天。
也做了一個小玩具 (我就知道大家會把它拿來找正妹)和大家分享。
享受了腦力激盪、高速開發及實踐想像力的快感。
當然,也吃了過量的 Hogan Doz,和鼎泰豐。
感謝 Google Taipei 舉辦這個好玩的活動。
對我們來說是一次非常好的經驗。

感謝大家的欣賞我們的作品和團員之間的無間合作,很高興得到了比賽的第一名。
特別感謝昨日加入我們的 Denial ,補足了我們在於 Web design 經驗上的不足。
畢竟,一群做 Linux Embedded System 的人突然跑來玩 Web,缺乏相當多的 domain knowledge。

昨天不只一次被問到:你們是如何做到一天之內衝出一個網站的? 你們是如何分工的?

其實這也道出了相當多人的相同問題。
這個問題回家想了很後,其實我的答案還是:團隊合作。

事實上大家都知道團隊合作的重要性,可是不知道如何做到。
其實,我個人認為這是沒有標準答案的。

試著把自已的想法寫下來,供自已分析和與大家分享。

人最重要:
當初決定留在台灣,就是抱著一個願望:在台灣,打造出一個有國際一流水準的軟體團隊。
我個人對於自已的 career path 的許多重大決定也是為了完成這個夢想。
很幸運的,在多年的尋覓之後,我們找到了一些有共同想法的伙伴,一群想追求一流而且真的很努力的 FOSS developer 找到了彼此,組成團隊。

事實上,我們之中的任何一個人,都是可以獨當一面的軟體工程師,技術能力也和歐美 hackers 同步。但我們也相當了解,在現在的軟體世界中,要和世界一流的團隊比,我們每個人的時間體力和專長真的不夠多。要真的做出什麼,我們必需互相信賴。
每一個人的專長都不相同,興趣領域也不同,不過都有所專精。
最重要的,信任和分享是我們相當大的特色。

John 特色擅長於洞悉情勢,有相當驚人的觀察力,對問題提出精確的看法
Tick 擅長結構性的思考,演算法選用,軟體系統架構分析和軟體風險估計及開發
Olv 對於新技術的理解能力一流,對於面對的技術可以快速的確實掌握
Erin 擅長提出破壞性思考,提供大家不同面向的思考和刺激
Jeremy 擅長把任務完成,面對問題可提出相當好的分析和實作
Julian 擅長於感性的思考,為技術帶來來自外太空的創意和美感

昨天是 Olv, Erin 和我三人受邀參加活動。面對這個題目,三人對於 App engine 各自 survey 結束後,我們開了一次的 brain storm meeting。我可以對不同題目所需要的技術可以快速的提供 scope 和風險分析,而 Erin 提出了相當多很有意思的想法和 Idea,Olv 很快速的理解問題的核心並提出更進一步的看法。當 Erin 說出 "依時間搜尋照片" 七個字時,我和 Olv 兩人都突然不說話了,思考著這個 idea 的可能性。害 Erin 以為這個 idea 不好。我和 Olv異口同聲的說出,“不,這個 idea 很棒。” 是的,這個題目的可能性很高,還不知有人做過,資料相依性應該很高,也是我們能力所及的。
再來就依著這個題目開始做了各種可能性的 brain storm。這是一個我們三個人一天可以做完的題目,我列出這個題目及各種可能性所需的所有技術項目,針對各個項目提出可選擇的技術和風險分析,Olv 針對著這題目提出許多更進一步的看法,和可能性。我們最大的風險是,我們沒有 html 和 javascript 的專長。
題目和項目決定後,我提出一個可以從很小很小的結構開始長大的軟體架構提出 API,把所有問題切成小塊小塊的,並立刻把 framework 實作出來。一個小時後, Olv 和 Erin 就可以進入開發,大約在兩個小時內,我們已經進入遞迴開發的階段,我維持軟體架構的彈性,Olv 神快的把每個小問題解掉,並找出我沒有想清楚的地方提出漂亮的修正。
很幸運的,昨天在活動中找到了一位 web 的開發者 Denial 加入我們的開發,對於 html 及javascript 的風險立刻變得相當的低。活動開始後,我們立刻把開發環境架好,開始把針對 web 這方面開始開發。並提出每個項目完成優先順續,和重要性,並把工作分配下去。在開發中,我們快速的交換各自分配到的 topic 所學到的 infomation。提出問題,和分享自已所了解的東西。其中“腦力激盪、分析、尋找答案、提出想法、實作”是不停的約以一個小時為週期巡迴發生。開始兩個多小時後我分配到的部份就做完了,過沒多久 Olv 的部份也實作完成,再來就開始把 nice to have 的部份一一補上,測試,美化以及互相 support。幫忙把沒做完的地方做出來。
因為得到了 Denial 的技術支援,和 Google Jeff 的 information sharing,我們做出來的比
本來估三人個可以做到的部份還要多。還把本來列為 nice to have 的地理資訊部份實作了出來。Olv 在完成工作後,也開始發揮幽默,把我們本來很工程師的形式的網頁改寫成山寨 Google theme。最後兩小時,大家全力衝刺收尾和 javascript 的部份。

這也是我們團隊成員第一次一起參加這種限時的軟體比賽,証明了我們的團隊能力,對於我們團隊有相當大鼓舞作用,也一再的讓我們深深的體會到,雖然每個人的能力都很不錯,如果能團隊運作起來威力是加乘的。

最後,感謝 Google 舉辦這個活動,和大家的欣賞。

2009年1月12日 星期一

Eagle outside my window!

When I was thinking about an algorithm of project at home. I heard some noise just outside the window. All my cats were rushing around like crazy. After some while, the noise does not stop, and I decide to take a look about that. I was stunned by what I saw. An eagle is just standing out side my window, eating a dove!! I live in Taipei, a mega-city without eagle for a long long time. When I was a boy, I live in the suburb of a small city, Chai-Yi, there were always eagle on the sky. I have not seen eagle in nature for a long time since I move to Taipei.
Suddenly, a eagle is standing out side my window. I am so surprised about this. Maybe the environment is getting better gradually.
It eyes are so beautiful, I have never observe an eagle so closely, less the 1 meteor. But while it's eating, it remind me it's a hunter. It can kill my cats easily with it's claw. This point made me a little bit nervous. Anyway beside of this, I am very happy to see an eagle out side the window.





















2009年1月2日 星期五

My color

Your rainbow is shaded blue.

 
 
 
 
 
 
 

What is says about you: You are a tranquil person. You appreciate friends who get along with one another. You share hobbies with friends and like trying to fit into their routines.

Find the colors of your rainbow at spacefem.com.


還蠻妙的~