2010年11月15日 星期一

Work Note, the adaptive bandwidth rule

adaptivebandwidthrule
Name=""
Category=""
Type="Stream"
Target="CaptureStream"
ResponseAction="ChangeProfile"
// ChangeMulticastTree
RangeMinKbps=
RangeMaxKbps=
ChangeProfileName="none"
ChangeMulticastTree
CallbackAction="fill the callback function name"
/>

C preprocessor, MACRO必要之惡

// file macroAid.hpp
#ifndef MACRO_AID_HPP
#define MACRO_AID_HPP

#define MACRO_SETTER_DECL( type, VarName)\
int Set##VarName(type v);
#define MACRO_SETTER_IMPL( cls, type, VarName, var)\
int cls::Set##VarName(type v) {\
this->var = v;\
return 0;\
}

#define MACRO_GETTER_DECL(type, VarName)\
type Get##VarName();
#define MACRO_GETTER_IMPL( cls, type, VarName, var)\
type cls::Get##VarName() {\
return this->var ;\
}

#define MACRO_VARIABLE_ACCESS_DECL( type, VarName, var )\
private:\
type var;\
public:\
MACRO_GETTER_DECL(type,VarName);\
MACRO_SETTER_DECL(type,VarName);

#define MACRO_VARIABLE_ACCESS_IMPL( cls, type, VarName, var)\
MACRO_SETTER_IMPL(cls, type, VarName, var);
MACRO_GETTER_IMPL(cls, type, VarName, var);
#endif

// a.hpp
#include "macroAid.hpp"
#ifndef A_HPP
#define A_HPP
class A {
MACRO_VARIABLE_ACCESS_DECL(int, Size, size);
MACRO_VARIABLE_ACCESS_DECL(int, Age, age);
};
#endif

// aSetFunc.cpp
#include "a.hpp"
MACRO_VARIABLE_ACCESS_IMPL(A, int,Size, size);
MACRO_VARIABLE_ACCESS_IMPL(A, int,Age, age);

雖然 MACRO會讓程式碼不易讓程式碼分析器 例如:SOURCE INSIGHT 解析,
但它真的很方便可以減少打錯字的危機, 用簡單的幾行就可以完成原本複雜的工作

瞎扯淡Dlib

最近因為在重寫一份library, 本來是毫無結構的c , 因為想要做一個像樣的成品,

開始用c++重寫. 一開始用 c++ template 寫了一個 Indexing-able的 link-list ,

然後利用寫了一個屬於自己的 XML container, 利用 libxml parse xml, 並且把資料放到自己的 container 裏面.

接著就越寫越大, 連 Hash 都寫出來了, hash pair 是 string name : variable pointer ,
想法是把 string 丟進去 hash 他就可以給我 variable 的 pointer + variable type , 之後就可以把值放入該 variable當中

日前閒逛 後發現 dlib 這個 c++ 的 library 存在, 他也打著高效能的號, 這個網址是dlib實作 thread的api 說明 http://dlib.net/api.html#threads , 我自己也有寫一個類似的API行為都很像, 果然用OO的 Modeling Code behavior 最後得到的結論都很像 hmm


我在想如果用來 dlib 做我目前的工作我想可以加快很多, 但 boost license 我並不太了解, 不太敢貿然使用

2010年11月1日 星期一

Work Note and Metaprogramming

Work note
XML Profile Manager
Parameter Manager
to use hashing instead the sequential search

突然想到 LiuKen之前說過的 language sugar 的議題,
c++ 與 c 本身的限制讓需要做些手腳才能夠有類似 javascript 與 c# 等
metaprogramming 的能力.
Metaprogramming
http://en.wikipedia.org/wiki/Metaprogramming
Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data.

"generative programming"
#!/bin/bash
# metaprogram
echo '#!/bin/bash' >program
for ((I=1; I<=992; I++)) do echo "echo $I" >>program
done
chmod +x program

Not all metaprogramming involves generative programming. If programs are modifiable at runtime or if an incremental compilation is available (such as in C#, Forth, Frink, Groovy, JavaScript, Lisp, Lua, Perl, PHP, Python, REBOL,Ruby, Smalltalk, and Tcl), then techniques can be used to perform metaprogramming without actually generating source code.

網路上找到的範例: 用 c++ 去產生一個 source 然後編譯.

2009年7月5日 星期日

OSnews

OS News 介紹目前各OS動態的網站

以下這篇文章是我覺得蠻有趣的一個主題.

Linux Kernel Patch Works Around Microsoft's FAT Patents

看完這篇新聞的感想就是有時候寫程式除了架構盡量簡單以外, 還有其他因素的事情要考慮, 所以才會看到有些CODE明明可以寫的不用這樣繞一大圈, 可是卻偏偏這樣寫.

X86的開機流程

最近在網路上找到一篇介紹 X86開機流程介紹的文章

作者叫做 Gustavo 他不是 natvie writer 但是他所寫的文章卻非常的流暢, 下筆如行雲流水, 讓人感覺不出他不是美國人, 真的讓人很佩服(遠望...)

1. 介紹 目前 INTEL X86 架構的簡介文章, 淺顯易懂
Motherboard Chipsets and the Memory Map

2. X86開機後 CPU 如何設置, 如何跳到的位置 BIOS 然後就 MBR 然後 就..... (我承認我文筆不好)
How Computers Boot Up ( X86 )

當初看這兩篇是因為我想要了解 Linux kernel 開機的流程.. 因為搞不懂怎麼跳到 GRUB然後怎麼跳到 KERNEL 的那些步驟

3. GRUB的開機流程
Details of GRUB on the PC

最後 The Kernel Boot Process

我在看完這幾篇文章以後 對於X86的開機流程有了大致上的了解.. 感覺不賴~

2009年6月6日 星期六

Android Cupcake on EeePC 900 with Huawei E169

來野人獻曝一下

1. 下載 Android cupcake for eeepc 701
請參考這個網站
http://virtuallyshocking.com/2008/12/20/building-android-for-the-asus-eeepc-701/

2. git 回來的 cupcake/vendor/asus/eeepc_701/kernel 是 2.6.25
cupcake/kernel 為 2.6.27 不過這個沒有關係稍作修改就好了
下載http://wiki.androidx86.org/index.php?title=Asus_Eee_PC_901 裡面的 kernel config

3. 把該 kernel config 複製為 cupcake/kernel/.config
make menuconfig
EXT2 ( installer needs it to mount ramdisk )
PPP ( choose all options )
USB serial
Includes USB GSM and CDMA option
Framebuffer
VESA VGA Driver (雖然 有 I915的Framebuffer driver 但是我試過沒辦法作用)

4. 修改 cupcake/kernel/drivers/rtc/alarm.c
Delete #include

Add below code to alarm.c
#ifdef __i386__
static void save_time_delta(struct timespec *delta, struct timespec *rtc)
{
set_normalized_timespec(delta,
xtime.tv_sec - rtc->tv_sec,
xtime.tv_nsec - rtc->tv_nsec);
}
#endif
5. Enable PPPD for x86
pppd 的 Android.mk 預設只有當 TARGET=arm的時候才會編譯
刪除 pppd\Android.mk 第一行 if 與 最後一行 fi 即可

6. Add chat to source tree
chat 請去 ppp.samba.org 下載 2.4.3 版的 pppd-2.4.3.tar.gz 裡面有 chat.c
複製到 cupcake/external/ppp/chat 內 並且新增一個 Android.mk 在該目錄
------------------------------------Android.mk ------------------------------------------------------
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \
chat.c

LOCAL_SHARED_LIBRARIES := \
libcutils libc

LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/include

LOCAL_CFLAGS := -DANDROID_CHANGES -DTERMIOS -DSIGTYPE=void -UNO_SLEEP -DFNDELAY=O_NDELAY

LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
LOCAL_MODULE_TAGS := eng
LOCAL_MODULE:= chat

include $(BUILD_EXECUTABLE)
----------------------------------------------------------------------------------------------------------

7. 新增兩個 script 到 cupcake/system/core/rootdir/etc/ppp 下面

-----------------------PPP Script : ppp-startup ---------------------------------
#!/system/bin/sh
setprop net.dns1 168.95.1.1
/system/xbin/pppd –detach modem crtscts debug \
/dev/ttyUSB0 460800 noipdefault \
defaultroute usepeerdns \
connect “/etc/ppp/pppondialer”
-------------------------------------------------------------------------
-----------------------chat Script : pppondialer----------------------------------------------------
#!/system/bin/sh
chat –v –s \
TIMEOUT 3 \
ABORT BUSY \
ABORT ERROR \
“” ‘AT’ \
OK ‘ATH0’ \
OK ‘ATZ’ \
TIMEOUT 30 \
OK ‘ATQ0 V1 E1 S0=0 &C1 &C2 +FCLASS=0’ \
OK ‘AT+CGDCONT=1,”IP”,”internet”’ \ internet 為中華電信 APN name
OK ‘AT+CSQ’ \
OK ‘ATD*99#’ \
TIMEOUT 50 \
CONNECT ‘’

-------------------------------------------------------------------------------------

8. 修改 cupcake/system/core/rootdir/Androidk.mk 內 copy_from
copy_from = ....\
etc/ppp/ppp-startup
etc/ppp/pppondialer
don't forget add the execution permission

9.Revise BoardConfig.mk
vendor/asus/eeepc_701/BoardConfig.mk
BOOT_KERNEL_CMDLINE
For using VESA VGA Framebuffer, append option “vga=788 “ to end of line

10 將external/e2fsprogs/Android.mk中第二行註解#字號拿掉
include $(call all-subdir-makefiles)

11. 修改bootable/diskinstaller/init.rc如下:
service installer /system/bin/installer -p /dev/block/sdc2

12. 修改framework/base/preloaded-classes:
#com.android.internal.policy.impl.PhoneLayoutInflater
#com.android.internal.policy.impl.PhoneWindow
#com.android.internal.policy.impl.PhoneWindow$1
#com.android.internal.policy.impl.PhoneWindow$ContextMenuCallback
#com.android.internal.policy.impl.PhoneWindow$DecorView
#com.android.internal.policy.impl.PhoneWindow$PanelFeatureState
#com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState
#com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState$1

13. 修改vendor/asus/eee_701/init.rc:
# Define the oom_adj values for the classes of processes that can be killed by the kernel. These are used in ActivityManagerService.
setprop ro.FOREGROUND_APP_ADJ 0
setprop ro.VISIBLE_APP_ADJ 1
setprop ro.SECONDARY_SERVER_ADJ 2
setprop ro.HOME_APP_ADJ 4
setprop ro.HIDDEN_APP_MIN_ADJ 7
setprop ro.CONTENT_PROVIDER_ADJ 14
setprop ro.EMPTY_APP_ADJ 15
# Define the memory thresholds at which the above process classes will
# be killed. These numbers are in pages (4k).
setprop ro.FOREGROUND_APP_MEM 1536
setprop ro.VISIBLE_APP_MEM 2048
setprop ro.SECONDARY_SERVER_MEM 4096
setprop ro.HOME_APP_MEM 4096
setprop ro.HIDDEN_APP_MEM 8192
setprop ro.CONTENT_PROVIDER_MEM 8704
setprop ro.EMPTY_APP_MEM 16384


14. TARGET_ARCH=x86 TARGET_PRODUCT=eee_701 DISABLE_DEXPREOPT=true make -j8 installer_img 編譯 Android cupcake
然後用 dd if=out/target/product/installer.img of=/dev/sdx 安裝 android 到 usb 隨身碟上面, 接下來插入 eeepc 開機吧~ have for fun

15. 安裝完成後 進入Android 按 Alt+CTRL + F1 進入 Console 呼叫 進入 /system/etc/ppp
插入 E169 如果你有看到 /dev/ttyUSB0 有出現那就 並且執行 ppp-startup 然後試看看你的瀏覽器吧!