2015年8月12日 星期三

CSS Selectors

選擇器,顧名思義就是選擇您要定義 CSS 的位置。其種類大約分成以下幾種:
  1. Class selectors(Class選擇器,Dreamweaver稱為類別選擇器,這樣翻譯也對啦)
  2. ID selectors(ID選擇器)
  3. Type selectors(型態選擇器,Dreamweaver稱為標籤選擇器,因為套用於HTML標籤)
  4. Universal selector(通用選擇器)
  5. Attribute selectors(屬性選擇器)
  6. Descendant combinator(後代選擇器)
  7. Child combinator(子選擇器)
  8. Adjacent sibling combinator(同層相鄰選擇器)
  9. General sibling combinator(同層全體選擇器)
  10. Pseudo-classes(偽類選擇器)
  11. Pseudo-elements(偽元素選擇器)
  12. Groups of selectors(群組選擇器)
W3C 定義1~5為單純選擇器 (Simple selectors),6~9為組合選擇器(Combinators)。

W3Schools' CSS reference
http://www.w3schools.com/cssref/css_selectors.asp



2015年7月9日 星期四

H.264 Frame - 2


H.264 Frame - 2

GOP 長度:
一個 IDR frame 到下一個 IDR frame 的範圍。
所以將 GOP 設為無限大(無 IDR Frame)雖然可以增加壓縮率,
但這樣就不能隨意跳轉到其他時間點播放/解碼。


「Frame Rate」是指影片每秒播放靜態畫面的數量。目前的主流規格有PAL與SECAM 的25fps及NTSC 的29.97 fps。有些電玩畫面的Frame Rate會高達60,甚至上百,如果不特別處理,在網路上播放時會因為傳輸速度及CPU處理能力趕不上,而會有掉格(您看到的是跳格)的現象。
「Bit Rate」是指單位時間播放壓縮後影片的位元數量,它相當於影片播放時的頻寬消耗量,以多少Kbps或Mbps為單位。可以想像的是,較高的Bit Rate可容納更高的視訊品質,但與「解析度」有其相配性。以480p配500kbps及720p配800kbps,在電腦銀幕上的觀看效果是不錯的,也同時兼顧了頻寬成本及符合大多數網友可以順暢收看的網路環境!

Bitrate Control

固定位元速率Constant bitrate,簡稱CBR
當形容編解碼器的時候,CBR編碼指的是編碼器的輸出碼率(或者解碼器的輸入碼率)應該是固定制(常數)。當在一個頻寬受限的信道中進行多媒體通訊的時候CBR是非常有用的,因為這時候受限的是最高碼率,CBR可以更容易的使用這樣的信道。但是CBR不適合進行儲存,因為CBR將導致沒有足夠的碼率對複雜的內容部分進行編碼(從而導致品質下降),同時在簡單的內容部分會浪費一些碼率。

平均位元速率(ABR, Average Bit-Rate)在音訊編碼時,指這樣一種編碼方式:它與固定位元速率(CBR)基本相同,會按照設定的目標碼率進行編碼。但當編碼器認為「適當」的時候,會使用高於目標碼率的數值來進行編碼以保證更好的品質。
例如一首192kbps的平均位元速率編碼的MP3,其中可能存在分散著的一些極短的片段使用了高於192kbps的碼率。但由於它們實在太短了,因此最終的目的檔並不會比使用固定位元速率編碼的檔案大很多,通常差異在2~3%左右。

可變位元速率Variable bitrate,簡稱VBR
當形容編解碼器的時候,VBR編碼指的是編碼器的輸出碼率(或者解碼器的輸入碼率)可以根據編碼器的輸入源訊號的複雜度自適應的調整,目的是達到保持輸出品質保持不變而不是保持輸出碼率保持不變。VBR適用於儲存(不太適用於串流傳輸),可以更有效地利用有限的儲存空間:用比較多的碼字對複雜度高的段進行編碼,用比較少的碼字對複雜度低的段進行編碼。

H.264 Frame



H.264 Frame

影片是由許多連續的 Frames 所組成,但並不是所有 Frames 都是完整的畫面,那些 Frames 需要參考其他 Frames 才能解碼出一張完整的畫面。

H.264 的 Frame types 有 I、B、P 三種。

I-frame:
不需要參考其他 Frames,是一張完整的畫面。

I-frame (IDR):
不需要參考其他 Frames,是一張完整的畫面。
IDR frame 為真正的 關鍵畫格 (keyframes),
P-frame & B-frame 不會越過 IDR frame 去參考其他 Frames,
所以可以隨意跳轉到任意 IDR frame 開始播放/解碼,而不會發生問題。

P-frame:
只紀錄了與之前的 Frames 相異的區塊,最多可以參考 "16 張" 之前的 Frames
播放/解碼時需要參用到之前的 Frames 的部分資料,才能解碼出完整畫面。
在 x264 中,你不能控制 P-frame 數量,但你可以控制一個 P-frame 所能參考的 Frame 數量,
也就是 Reference frame (ref) 的數值。

B-frame:
只紀錄了與前一張與後一張的 Frames 相異的區塊,壓縮率高(由其是在低動態/低變化的影片),
播放/解碼時需要用到前後兩張的 Frames 的部分資料,才能解碼出完整畫面。

由於 P-/B-frame 不是完整的畫面,解碼時必須參考其他 Frames,
所以你不能隨意跳轉到 P-/B-frame 上播放/解碼。
也就是說你如果播放 MPEG 視訊格式,當你跳播放時間點時,
正常而言,並不會跳到你所選的時間點上,而是最近的 IDR / I-frame。

由以上得知,在 bitrate 充足的情況下,則不需要使用較多 B-frame、Reference frame (ref) ,
多少 bitrate 為充足依影片內容為定,高動態影片需要較多 bitrate,低動則較少。

至於使用時機...
提高 B-frame/ref 使用量可以降低 bitrate 的需求,使用較少 bitrate 達到目標品質。
低動態的影片可以使用較多的 B-frame,高動態或是純靜態則是 P-frame 效果較好。

對於相容性與硬體負擔...
提高 B-frame/ref 使用量的副作用是降相容性以及提高硬體負擔,請先保證相容性再來追求壓縮率。
而 ref 的副作用要比 B-frame 強,例如 ref=16 這代表解碼一個 P-frame 必須要連跳回 1~16 張之前的 Frames 取用資料。

2015年6月9日 星期二

IEEE 802.1X principle and function implementation



  • IEEE 802.1X is an IEEE Standard for port-based Network Access Control (“port” means the same physical connection to the LAN infrastructure). It is part of the IEEE 802.1 group of networking protocols. It provides an authentication mechanism for devices to connect to a LAN, either establishing a connection or preventing the connection if authentication fails. IEEE 802.1X prevents what is called “port hi-jacking”; that is, when an unauthorized computer gets access to a network by getting to a network jack inside or outside a building. IEEE 802.1X is useful in, for example, network video applications since network cameras are often located in public spaces where a network jack can pose a security risk. In today’s enterprise networks, IEEE 802.1X is becoming a basic requirement for anything that is connected to a network.

  • Three basic terms in 802.1X.
    1. Supplicant -- user, client
    2. Authentication server  -- RADIUS server
    3. Authenticator -- devices. ex: switch.


  • The protocol used in 802.1X is Extensible Authentication Protocol encapsulation over LANs (EAPOL). There are a number of modes of operation, but the most common case would look something like this (see Figure 1):

    1. The authenticator sends an “EAP-Request/Identity” packet to the supplicant as soon as it detects that the network link is active (e.g., the supplicant, for example a network camera in a network video system, is connected to the switch).
    2. The supplicant sends an “EAP-Response/Identity” packet to the authenticator.
    3. The “EAP-Response/Identity” packet is then passed on to the authentication (RADIUS) server by the authenticator.
    4. The authentication server sends back a challenge to the authenticator, such as with a token password system.
    5. The authenticator unpacks this from IP and repackages it into EAPOL and sends it to the supplicant. Different authentication methods will vary this message and the total number of messages. EAP supports client-only authentication and strong mutual authentication.
    6. The supplicant responds to the challenge by the authenticator.
    7. The authenticator passes the response to the challenge onto the authentication server.
    8. If the supplicant provides proper identity, the authentication server responds with a success message to the authenticator.
    9. The success message is then passed onto the supplicant by the authenticator. The authenticator now allows access of the supplicant to the LAN, possibly restricted based on attributes that came back from the authentication server. For example, the authenticator might switch the supplicant to a particular virtual LAN or install a set of firewall rules.

2015年4月26日 星期日

Self define chroot environment

1. Create new required root directory.
2. Create all needed directories. ($newroot $newroot/dev $newroot/bin $newroot/home $newroot/lib $newroot/etc $newroot/usr/lib $newroot/usr/bin $newroot/proc $newroot/dev/pts)
3. Collect needed execution files and libraries. Copy these needed files . The destination location will be on ${newroot}/bin and ${newroot}/lib
4, Copy required configuration files. (/etc files:   group  passwd  profile)
5. Do chroot command. (In user SSH login session, or define in inittab to chroot during sysinit boot time)

2015年4月20日 星期一

影像取樣與擷取

取樣(Sampling) - 連續函數數位化的過程

奈奎斯特定理 (Nyquist Theorem)
奈奎斯特定理說明必須以高於受測訊號的最高頻率兩倍以上的速度進行取樣,才能正確地重建波型

數位影像(digital image)和一般(類比)照片的不同之處在於其xyf(x,y) 的值都是不連續(或離散)的。
數位影像可以看成一個連續影像經過取樣而成的大型陣列。這些點就是所謂的像素pixels),組成了數位影像。

2015年4月16日 星期四

sqlite lacks some libraries.

# which sqlite3
/bin/sqlite3

# sqlite3
sqlite3: error while loading shared libraries: libreadline.so.5: cannot open shared object file: No such file or directory

Get package "readline-5.2.tar.gz" from gnu, cross compile , install libreadline.so.5.2 on /lib

# cd /lib
# ln -s libreadline.so.5.2 libreadline.so.5
# ln -s libreadline.so.5.2 libreadline.so

# sqlite3
sqlite3: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory

Get package "ncurses-5.9.tar.gz" from gun, cross compile , install libtinfo.so.5.9, libncurses.so.5.9 on /lib

# ln -s libncurses.so.5.9 libncurses.so.5
# ln -s libncurses.so.5.9 libncurses.so

# sqlite3
SQLite version 3.8.5 2014-06-04 14:06:34
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> .quit



2015年4月9日 星期四

socket programming

Connection-oriented socket (TCP)
connection-oriented




Connectionless socket (UDP)
connectionless

The way to get local IP address in Linux

Kernel Routing tables

open "/proc/net/route" then parse content

$ cat /proc/net/routeIface   Destination     Gateway         Flags   RefCnt  Use     Metric  Mask            MTU     Window  IRTTeth1    0000A8C0        00000000        0001    0       0       0       00FFFFFF        0       0       0eth0    005111AC        00000000        0001    0       0       1       00FFFFFF        0       0       0eth1    0000FEA9        00000000        0001    0       0       1000    0000FFFF        0       0       0eth0    00000000        FE5111AC        0003    0       0       0       00000000        0       0       0


00000000   is default interface

Then get this interface ip address.

Using getsockname with an external connection


new connection outside then use this socket value to check own ip address.

/*
 * Find local ip used as source ip in ip packets.
 * Use getsockname and a udp connection
 */
 
#include<stdio.h> //printf
#include<string.h>    //memset
#include<errno.h> //errno
#include<sys/socket.h>    //socket
#include<netinet/in.h> //sockaddr_in
#include<arpa/inet.h> //getsockname
#include<unistd.h>    //close
 
int main ( int argc , char *argv[] )
{
    const char* google_dns_server = "8.8.8.8";
    int dns_port = 53;
     
    struct sockaddr_in serv;
     
    int sock = socket ( AF_INET, SOCK_DGRAM, 0);
     
    //Socket could not be created
    if(sock < 0)
    {
        perror("Socket error");
    }
     
    memset( &serv, 0, sizeof(serv) );
    serv.sin_family = AF_INET;
    serv.sin_addr.s_addr = inet_addr( google_dns_server );
    serv.sin_port = htons( dns_port );
 
    int err = connect( sock , (const struct sockaddr*) &serv , sizeof(serv) );
     
    struct sockaddr_in name;
    socklen_t namelen = sizeof(name);
    err = getsockname(sock, (struct sockaddr*) &name, &namelen);
         
    char buffer[100];
    const char* p = inet_ntop(AF_INET, &name.sin_addr, buffer, 100);
         
    if(p != NULL)
    {
        printf("Local ip is : %s \n" , buffer);
    }
    else
    {
        //Some error
        printf ("Error number : %d . Error message : %s \n" , errno , strerror(errno));
    }
 
    close(sock);
     
    return 0;
}