2015年10月14日 星期三

有關C語言的struct進階初始化



假設有一個student的結構定義如下:

typedef struct student{
  char name[50];
  int studentNo;
  int age;
}student;


按照一般教科書上的寫法,初始化的方式是先宣告一個struct student的變數,然後再用點(dot)運算子去存取內部成員並賦值,例如:

struct student st1;
st1.name = "Peter";
st1.studentNo = 1234;
st1.age = 18;


但是進階的初始化方法卻是宣告直接再以點(dot)運算子賦值,例如:

student st1={
  .name = "Peter",
  .age = 18,
  .studentNo = 1234
};


原來點運算子就可以等同struct內的成員,多個成員則用(,)來分開,類似陣列(array)的宣告方法,不同的是,他賦值的順序是可以不用按照struct定義內的先後順序的!

說到陣列(array),他的宣告也是有幾種神奇的方法。
例如:

int a[7] = { [4]=29, 33, [2]=15 };
相當於
int a[7] = { 0, 0, 15, 0, 29, 33, 0 };

可以用[index]= value 的方法指定給特定的元素,沒有指派的值就是0這樣。

結合上面struct的用法,也可以一併使用combo連續技,例如:

student st2[5]={
  [3]={
      .name = "Titus",
      .age = 22,
      .studentNo = 1041 },
  [2]={
      .studentNo = 1042
      .age = 23,
      .name = "Stephen", },
}

[index]= 可以不必按照順序,裡頭的成員也不必按照順序,其餘沒指派的元素會自動初始化為0。


當然也可以將一連串連續的元素賦予相同的值,例如:

int a[]= { [0 ... 9]=1, [20 ... 99]=2, [100] =3};


其實這些進階的寫法有什麼實際的好處我也還沒參透(難道是這樣「看起來」有比較OO嗎?哈哈),但至少能看懂這些,以後再看別人的code有用這種語法時就不會再覺得好古怪好神奇了。這些小東西看在用JAVA或C#的人可能不值一提,不過我在這古老而傳統的C語言上能看見這些寫法,仍是感到十分特別又有趣的,所以說,C語言也是會與時俱進的!C語言好棒阿!(這種將C變成既簡潔又充滿彈性的極致語言我看就是Ruby了吧!哈哈!)

PS:以上應該都是使用革奴牌(GNU gcc)的延伸C語法,而不是標準的C語法,如果你是在非GNU gcc的compiler上要特別注意這種寫法是否能夠使用囉!

2015年9月22日 星期二

alias 的使用 .bashrc

http://jslinux.pixnet.net/blog/post/15534168-%E5%A5%BD%E7%94%A8%E7%9A%84-alias-%E6%8C%87%E4%BB%A4


寫在home底下的  .bashrc

# User specific aliases and functions
alias grep='grep --color=auto -n '
alias cat='cat -n '

 alias tmux='TERM=xterm-256color tmux -2'
~

2015年7月3日 星期五

source Insight 使用技巧

最近使用soruce insight 的一些常用技巧


Source Insight 4 遇到使用上非常log 卡頓
    => Options ->  Preference ->Display -> Page number in status bar  打勾取消


2015年5月19日 星期二

struct 宣告 在big_endian 和 little_endian 上的排列

若是以bit 為單位在
big_endian : struct 由上而下 在記憶體的位置則是以bits為單位  由高位排至低位
little_endian :struct 由上而下 在記憶體的位置以1byte 為單位  由最高位byte的最低位bit開始 往記憶體低位排



以ipv6 addr packet 的前4個byte  為例 (from wiki)

例子如下:
#ifdef _BIG_ENDIAN
uint32 version:4;
uint32 tclassH:4;

uint32 tclassL:4;
uint32 flow_lblH:4;

uint32 flow_lblL:16;
#elif  _LITTLE_ENDIAN
uint32 tclassH:4;
  uint32 version:4;

uint32 flow_lblH:4;
uint32 tclassL:4;

uint32 flow_lblL:16;
#endif

其中big_endian 其實也可以寫的更簡潔
uint32 version:4;
uint32 tclass:8;
uint32 flow_lblL:20;


2015年4月20日 星期一

c語言中的0UL或1UL是什麼意思

0UL表示無符號長整型 0
1UL表示無符號長整型 1

如果不寫UL後綴,系統默認為:int, 即,有符號整數。
1.數值常數有:整型常數、浮點常數;
2.只有數值常數才有後綴說明;
3.數值常數後綴不區分字母大小寫。
(1)整型常數的表示形式有:十進制形式、以0開頭的八進制形式、以0x開頭的十六進制形式,無二進制形式。
整型常數默認是signed int的。
對整型常數進行類型轉換的後綴只有:u或U(unsigned)、l或L(long)、u/U與l/L的組合(如:ul、lu、Lu等)。例:100u; -123u; 0x123l; 
(2)浮點常數的表示形式有:科學計數形式和小數點形式。
浮點常數默認是double的。
對浮點常數進行類型轉換的後綴只有:f或F(單精度浮點數)、l或L(長雙精度浮點數)。(注:因浮點型常數總是有符號的,故沒有u或U後綴)。例:1.23e5f; 1.23l; -123.45f;

2015年3月18日 星期三

synology NAS 建立 git server


基本上DSM 說明上有教你怎麼設定

若要允許使用者使用 Git:

  1. 使用具管理權限的帳號登入 DSM。前往控制台 > 終端機並啟動 SSH 服務。
  2. 啟動 Git 套件。選擇要讓哪些使用者從 repository check in 及 check out 檔案。

注意:

Git 使用者會受到 git-shell 之限制,僅能進行與 Git 相關的活動。此登入型 shell 會套用至 Git 使用者,以確保這些帳號僅用於 Git 相關之操作。因此,Git 使用者僅能使用 SSH 連線來 push 或 pull Git repository,無法完整存取 DSM。

若要新增 Git repository:

  1. 透過 SSH 以 root 或 admin 身份登入您的 Synology 伺服器。
  2. 變更目錄至 /volumeX (X 代表儲存空間編號) 來建立資料夾。例如:「git_repos」。該資料夾的權限會與 Linux 相同。
  3. 於資料夾中執行 git init 來建立空的 repository。
  4. Repository 建立完畢後,Git 用戶端可輸入下列指令來存取此 repository:
    git clone ssh://[Git 使用者]@[您的 Synology 伺服器 IP 位址或主機名稱]/[Git repository 路徑]

照著上面設定完後就可以開心使用Git server 拉~~~  才怪



2015年2月10日 星期二

c/c++ 演算法技巧

今天看code 看到一個莫名其妙的東西,上網搜尋一下

unsigned popcount (unsigned u)
{
u = (u & 0x55555555) + ((u >> 1) & 0x55555555);
u = (u & 0x33333333) + ((u >> 2) & 0x33333333);
u = (u & 0x0F0F0F0F) + ((u >> 4) & 0x0F0F0F0F);
u = (u & 0x00FF00FF) + ((u >> 8) & 0x00FF00FF);
u = (u & 0x0000FFFF) + ((u >> 16) & 0x0000FFFF);
return u;
}

原來是個不知為何的演算法得出來的結果,原理大概是查表,此用法只適用於32位無號整數,目的是在算input u 總共有幾個bit為1,稍微紀錄一下。

=> 使用分治法
https://zh.wikipedia.org/wiki/%E6%B1%89%E6%98%8E%E9%87%8D%E9%87%8F

簡單來說就是先算出兩個bit裡面有幾個1
A=b'1111
(A) &(b'0101) +(A>>1)&(b'0101) =b'1010 
代表第
0,1 bit 有兩個為1 
2,3bit 有兩個為1
接著就是 shift跟加法的問題



ref.

http://blog.csdn.net/rappy/article/details/1788969

2015年1月21日 星期三

How many bytes in a packet?

Sometime, we found some devices that point out "forwarding rate, Mpps". The "pps" is the short term for packet per second. However, how many bytes in a packet? It depends, there is no specification on how many byte in a packet, you define it by yourself.

In the 100M Ethernet network,
100M bps / 8 = 12.5 MBps = 12500000 Bytes/s(Bps)

If you define the frame size is 64 Bytes (Minimum Ethernet framz size):
8 Bytes (preamble) + 64 Bytes + 12 Bytes (interframe gap) = 84 Bytes

So forwarding rate will be
12500000 Bps / 84 bytes = 148809 pps

If you define the frame size is 1518 Bytes (Maximum Ethernet framz size):
8 Bytes (preamble) + 1518 Bytes + 12 Bytes (interframe gap) = 1538 Bytes

So forwarding rate will be
12500000 Bps / 1538 bytes = 8127 pps

100M Ethernet's forwarding rate formula:
12500000 Bps / ( 8 Bytes (preamble) + (Feame Size) + 12 Bytes (interframe gap)) = forwarding rate, pps

2015年1月9日 星期五

c/c++ 運算子優先順序

優先 符號                                     運算種類                         結合
---- ----------------------                   -------------                       ------
1     ( ) [ ] -> .                                運算式                             左至右
2     ! ++ -- -                             (運算元) 一元運算子     右至左
        * & sizeof
3     * / %                                       //餘數                      左至右
4     + -                                           /                               左至右
5     << >>                                      左移/右移                       左至右
6     < <= > >=                               關係運算子                    左至右
7     == !=                                      關係運算子                    左至右
8     &                                            位元 AND                       左至右
9     ^                                             位元 XOR                       左至右
10    |                                             位元 OR                          左至右
11   &&                                         邏輯 AND                       左至右
12   ||                                             邏輯 OR                          左至右
13   ?:                                            條件運算子                    右至左
14   = += -= *= /= %=                  指定運算子                    右至左
        <<= >>= &= |= ^=
15   ,                                              循序計值                        左至右