2017年12月28日 星期四

[Android] Autolock


  • 在 trace Android media player時, 常看到 function有些有加 _l suffix的, 有的沒有. e.g. prepare, prepare_l
    • 主要的差異在於是否有用 Mutex lock住
    • 但此時又看到神奇的 code
      • /frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
      • status_t NuPlayerDriver::prepare() {
            ALOGV("prepare(%p)", this);
            Mutex::Autolock autoLock(mLock);
            return prepare_l();
        }
        
      • /frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp 因此會發出疑問, 這個 autoLock 是做什麼的? 定義卻沒有使用?
        • 簡單說, 就是利用 constructor跟 deconstructor 來呼叫 mutex lock 跟 mutex unlock
    • 而此處的 prepare_l 有 l結尾的應該就是指 lock後執行的程式碼

[C++] do...while(0)


  • 優點:
    • block 區塊, 可以在其內宣告變數, 在像 C89需要將變數定義在最上方這方面大有幫助
    • 以 do...while(0) 取代 goto, 將 goto 後的東西放 while外面, 裡面用 break來達到 goto的效果
    • 程式碼易讀且效能並沒損失
    • 避免 marco 沒有加 {}, 又接在 if() 單行執行內容有分號的 case
      • e.g. 
      • #define swap(x, y) int temp; temp = x; x = y; y = temp;
        if(x > y)
                   swap(x, y);
            
  • Reference:宏定义中使用do{}while(0)的好处

2017年12月27日 星期三

[Graphics] blit


[C++] Coding convention - prefix k and What


  • trace Android code時, 常會看到如下的 code
  •     enum {
            kWhatSetDataSource              = '=DaS',
            kWhatPrepare                    = 'prep',
            kWhatSetVideoSurface            = '=VSu',
            kWhatSetAudioSink               = '=AuS',
            kWhatMoreDataQueued             = 'more',
            kWhatConfigPlayback             = 'cfPB',
            ...
    
  • 這個 k代表什麼意思呢? => konstant, 因為 c的 prefix 已經被 char 用掉了, 用了 Germany的 konstant, 至於全大寫與 Hungarian notation 就不在這戰了
  • 至於 What, 則猜測這些 enum 主要是用來在 message中傳遞, 對應 message.what 的 int值, 所以在 handler中常會看到自行定義的 enum 用 kWhat當 prefix
    • 節錄 Android doc Message.what
    • what
      int what
      User-defined message code so that the recipient can identify what this message is about. 
    • Each Handler has its own name-space for message codes, 
      so you do not need to worry about yours conflicting with other handlers.
  • Reference:

[Android] DISALLOW_EVIL_CONSTRUCTORS


  • 簡單的 macro, 用來避免未實作的 copy constructor 跟 assignment constructor 被 compiler實作
  • Code
  • #define DISALLOW_EVIL_CONSTRUCTORS(name) \
    name(const name &); \
    name &operator=(const name &) /* NOLINT */
  • Sample: ABuffer.h
  •     struct ABuffer : public RefBase {
            explicit ABuffer(size_t capacity);
            ABuffer(void *data, size_t capacity);
            ...
            private:
            DISALLOW_EVIL_CONSTRUCTORS(ABuffer);
  • Reference:

[Android] Media Player


  • State Diagram
    • fixme later: 補 initialized/prepared/stopped 的 state diagram
  • stagefright/NuPlayer
  • fundamental design
    • ALooper/AMessage/AHandler
  • Interface
    • content source/demuxer/decoder/render (driver)
  • Reference:

2017年12月14日 星期四

[C Programming] strong v.s. weak symbols


  • weak symbol 可以不用 definition
  • strong symbol 可以取代 weak symbol
  • 預設皆為 strong
  • 用法: __attribute __((weak)) or #pragma weak
  • nm tool 來看 symbol table

2017年12月9日 星期六

[Bash] tips


  • quick key
    • ctrl + R: reverse 的快速搜尋之前下過的指令
  • history
    • 可以列出最近下過的指令, 並用
      !number
      執行第 number 的指令

[Android] buid code


  • Android build system
  • tools
    • source /build/envsetup.sh 

2017年12月8日 星期五

[Android] Nougut with Raspberry Pi


  • sync code
    • platform: android
    • Q & A:
      • sync size 太大 (不確定整個 size 是多少? 看起來應該不少於 45GB)
        • 可以用以下指令抓取
        • repo sync -c --no-tags --no-clone-bundle
        • 其中最主要是 -c: 只抓目前 branch
        • 更多細節可以查看
          repo help sync
          
        • Ref:
  • Reference:

[Android] sync code


  • version control tools
    • repo
      • 簡介: 主要靠 Manifest 來記錄 remote, remote url, 各 project revision等資訊. Manifest 為一個 XML格式的檔案, 記錄各 project git 資訊, 預設的檔案名稱是 default.xml
      • 用法:
        • repo init -u mainfestURL -b branch
          • 通常第一步即透過 mainfest 的 URL得到想要的 manifest資訊, 會產生一個隱藏資料夾 .repo, 通常也可以製作 snapshot.xml
        • repo sync
          • 通常緊接於 repo init 或是透過 snapshot init後, 需要由 repo 通知各 project 進行 git checkout的動作
        • repo upload
          • 較少用到, Manifest 裡 remote 的欄位有設 review url的話, 便會進行 git push 的動作.
    • git
      • git checkout -b localBranchName remoteBranchName
      • git commit
        git commit --amend
        可修改最後一次 commit的內容
      • git push
        將 change 上到 remote
      • git pull
        sync .git 的資訊, 更新 metadata, 檔案等尚未進行 sync
      • 與 repo 可以整合應用, e.g.:
        repo forall -c 'git checkout branch'
      • git config
        設定 git的 configuration, 通常用在設定 user name跟 e-mail
      • git add fileName
      • git reset
      • 僅更改 file status
      • git checkout
      • 會重新抓檔案
      • git update-index --chmod=-x fileName
      • git diff (--cached)
      • git status
        非常常用, 看各個檔案目前是在什麼 status: tracked, untracked,...
  • Sync Android code
    • Setup repo
      • mkdir ~/bin
      • PATH=~/bin:$PATH
      • curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
      • chmod a+x ~/bin/repo
    • Setup git
      • git config --global user.name "Your Name"
      • git config --global user.email "you@example.com"
      • P.S.: 若是在 synology nas上操作的話, 可能遇到
        error: could not lock config file /var/services/homes/yourName/.gitconfig: No such file or directory
        的問題
        • 在 Control Panel->User Account->Advanced Option中啟用家目錄即可
      • repo init -u https://android.googlesource.com/platform/manifest
      • repo sync -j8
    • Reference: Downloading the Source

[Android] architecture


  • Linux kernel (GPL license) (aosp中並沒有包含 kernel source code)
  • Hardware Abstract Layer (HAL) (Android license: Apache license)
    • user space C/C++ library layer
    • defines interface that Android requires hardware drivers to implement
    • separates Android platform logic from hardware interface
  • Native C/C++ libraries (library and runtime): OpenMAX AL, libc, OpenGL ES, Media Framework, WebKit
  • Java API frameworks (application frameworks): View System, Content Provider, Activity, ...
  • System Apps
  • Tools

2017年11月29日 星期三

[Profiling] DS-5


  • What is ARM DS-5?
  • Install
    • .config: 建立 kernel config, timer, interrupt, tracers
    • *.ko:
    • gator:
    • gatord:
    • download ARM DS-5
  • Reference:

[Development] using GNU development tools

  • SOP
    • configure
    • make
    • make install

Configure

Build

  • universal binary: 
    • build flag: e.g.
      --arch ppc --arch i386

Install




  • Reference:

  • [Node.js] framework: Express

  • Install
    • library
      • $npm install express -g
    • binary generator
      • $npm install express-generator -g
      • Usage
        • generate template app
          • $express --view=ejs sampleExpress
        • install dependencies:
          • $cd sampleExpress && npm install
        • run the app
          • $DEBUG=sampleExpress:* npm start
        • validate
          • jshint

    2017年11月25日 星期六

    [Kernel] Linux kernel debug


    • 技巧
      • printk dump messages to console
        • 簡單好用, 行為類似 printf, 不過這會改變 kernel行為 (例如: 執行速度變慢, 使得 race condition 行為不一致)
        • 可同時更改 ring buffer size (更改 kernel boot parameter: log_buf_len), 避免 log的訊息被裁斷
        • 更改 log level, 預設為 KERN_WARNING, e.g. 開啟所有 log:
        • , 並刪除 boot parametersquiet, splash (runtime 查看 boot parameters: cat /proc/cmdline)
          echo 7 > /proc/sys/kernel/printk
      • gdb
        • disassemble function codes
          • gdb vmlinux
            (gdb) dissemble functionName
        • locate core dump:
          • gdb crashed_function_obj, e.g. gdb sd.o
          • (gdb) list *(backtrace_func_shown+offset), e.g. list *(sd_remove+0x20
      • 用 objdump
        • objdump -SdCg sample.o
      • ToDo: add2line 指令介紹, ELF 格式介紹, study Kernel Debugging
      • Reference

    2017年8月27日 星期日

    [Mac] Code sign for gdb


    • 在 Mac上以 MacPort 安裝 gdb 後, 會顯示
    •  gdb has the following notes:
          You will need to codesign /opt/local/bin/ggdb
          
          See
          https://sourceware.org/gdb/wiki/BuildingOnDarwin#Giving_gdb_permission_to_control_other_processes
          for more information. 
    • 請按照網頁所列方法為 gdb 做 code sign. 否則在 gdb run的時候會顯示以下 error message:
    • Unable to find Mach task port for process-id 72241: (os/kern) failure (0x5).
       (please check gdb is codesigned - see taskgated(8))
      

    2017年8月16日 星期三

    [Security] DRM - Digital Right Management System



    • 契機
      • 最近在看 ATSC3.0 的 standard, 其中一部分 A/360 Security 問到關於 content protection 的部分, 整個被問倒, 只好好好筆記一下如何做到 content protection. 先來看看 ATSC3.0 定義的 content protection 在哪一層. 有此圖可知, 這是 based on ISO-BMFF 的 format
    • Content Protection
      • standards
        • W3C Encrpyted Media Extension (EME)
          • What: a Javascript API to enable 
          • Who:
            • W3C defined
            • a web application exchanges decryption keys
        • MPEG Common Encrypted (CENC)
          • What: ISO-BMFF format (e.g. mp4 container) 若要使用 DRM, 則需要 CENC, 可想成此規範定義了 ISO-BMFF 支援 DRM時, 需要在那些 box 定義 DRM 相關的 parameters, namely, Protection System Specific Header Box (pssh)
          • Who: 
            • scrambling system
            • ISO-BMFF file
          • Where:
          • When:
          • Why: for DRM system
          • How:
            • only encrypts media samples, and keep metadata un-encrypted
      • DRM comparison

    2017年8月2日 星期三

    [Notes] Linux Devices Drivers 3Ed.


    • Books: Linux Device Drivers
    • Ch1. Introduction
      • 說明驅動程式的角色
      • 設計原則: 提供機制 (mechanism)-要提供什麼能力, 而非法則 (policy)-如何使用這些能力
      • Kernel 概論
        • Module
        • Device分類: character device, block device, network interface
    • Ch2. Module
      • Kernel preparation
      • 展示 Hello World Module
        • build - 
          • include kernel headers (/usr/src/linux-headers)
          • make file - obj-m
        • sample module file
        • #include 
          #include 
          
          MODULE_DESCRIPTION("Hello_world");
          MODULE_LICENSE("GPL");
          
          static int hello_init(void)
          {
           printk(KERN_INFO "Hello world !\n");
           return 0;
          }
          
          static void hello_exit(void)
          {
           printk(KERN_INFO "Bye !\n");
          }
          
          module_init(hello_init);
          module_exit(hello_exit);
          
        • sample Makefile
        • PWD := $(shell pwd) 
          KVERSION := $(shell uname -r)
          KERNEL_DIR = /usr/src/linux-headers-$(KVERSION)/
          
          MODULE_NAME = hello
          obj-m := $(MODULE_NAME).o
          
          all:
           make -C $(KERNEL_DIR) M=$(PWD) modules
          clean:
           make -C $(KERNEL_DIR) M=$(PWD) clean
        • 測試
        • insmod hello.ko
          dmseg
          
        • 程式架構
          • header: 重要 headers: linux/init.h, linux/module.h 含有後面要用到的 marcos
          • license
          • module_init()
          • module_exit
        • Kernel module v.s. user space application
        • insmod/modprobe/rmmod/lsmod
        • module lifecycle - facility
        • module parameter
          • module_param(parameterName, type, permission)

    2017年7月15日 星期六

    [Kernel] Portal


    [Git] Portal


    • What is Git?
      • 分散式版本控制軟體
      • 利用 40 bytes的 hash key當作每次 commit ID
      • stages
      • 每次皆儲存完整內容, not diff
    • 名詞
      • hash
      • commit
      • repository (remote, local)
      • branch
      • HEAD
        • pointer to latest commit of current branch
      • Q: reference, rebase, cherry-pick?
      • parent -> 延伸至哪個 version
    • 行為
      • clone
      • checkout
      • commit
        • 修改 commit: 
          git commit --amend
      • push
      • pull
        • 從 remote 抓取各版 merge成新的 commit
      • fetch
        • 與 pull的差異是, 僅抓取 remote的 log, 不 merge
      • merge
        • fast forward (branch 合回 master, 且 master 未更改)
        • non-fast forward, merge into a new commit
        • rebase, branch的修改會串到 master 後面
          • Merge (From 連猴子都懂的 Git 入門指南)
            修改內容的歷史記錄會維持原狀,但是合併後的歷史紀錄會變得更複雜。
          • Rebase
            修改內容的歷史記錄會接在要合併的分支後面,合併後的歷史記錄會比較清楚簡單,但是,會比使用 merge 更容易發生衝突。
            • e.g. git checkout br3
            • git rebase master
            • 在 master 後面再串上 br3
      • stash
      • blame
        • 可以 line-by-line 秀出各 commiter
    • 教學
    • 設定
      • .gitignore
      • filemode
        • 常看到 git diff 只差在 old mode 100644 與 new mode 100755
        • 可以利用 git config core.filemode false 來隱藏這些錯誤
      • workspace config, user config, global config
    • 可搭配 Google 的 Tool repo 進階 checkout 多個 repository 對應的特定版號, 以 manifest做管理 (xml format), 或是 snapshot.xml 做管理

    2017年7月1日 星期六

    [Raspberry Pi] Portal


    [Raspberry Pi] toolchain


    • Compiler
      • compile option
        • -Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s
          

    [RPi] Raspberry Pi


    • Software
    • Boot process
      • first stage bootloader
        • 在 GPU SoC中, 無法修改, 會去 mount SD card 上的FAT32 filesystem
      • second stage boot-loader (bootcode.bin) - only released by binary
        • retrieve GPU firmware in SD card, and starts the GPU
      • GPU firmware (start.elf) - only released by binary
        • GPU starts up CPU
        • additional fixup.dat will check SDRAM partition
      • User codes
        • any binaries, e.g. kernel image (kernel.img), U-Boot, bare-bone applications

    2017年6月16日 星期五

    [License] GPL v.s. LGPL & GPL in Linux


    • 簡單比較
      • GPL:
        • 保護 application
        • 較嚴苛
        • release binary時, 需要 release source code
        • 僅為執行(非修改)此 binary使用, 不用 release source code
      • LGPL:
        • 保護 library
        • 較寬鬆
        • dynamically or statically link則無限制
    • 在 kernel 上所執行的使用者應用程式都不受 GPL制約

    2017年5月30日 星期二

    [Company] 清算流程


    2017年4月10日 星期一

    [Mantis] enable due date

    • if you use google cloud deployment to deploy bitnami mantis service
      • use ssh to login shell
      • edit /opt/bitnami/apps/mantis/htdocs/config/config_inc.php
    • add following lines in config/config_inc.php
      • $g_due_date_update_threshold = DEVELOPER;
        $g_due_date_view_threshold = REPORTER;
        
    • Reference:

    2017年2月25日 星期六

    [Project] Jarvis

    • 看到 Mark Zuckerberg 在 2016 年完成的 project Jarvis, 整個熱血沸騰. 希望今年有時間也來摸一下吧! 看了一下他設計的架構圖如下 
    • 看起來滿多細節與技術在裡頭, 譬如光 User Interface 就沒列到喇叭與麥克風, 應該是認為 iOS Voice App 就代表跑在手機上, 而這兩者手機都有!? 但, Language Processing 就可能分成 pre-process (e.g. Speech-to-Text), recognition( 其中包含 semantics analysis等), 看起來有點籠統, 喇叭的輸出應該也有 TTS(Text-to-Speech) 才是, Morgan Freeman的聲音不知是預錄的, 還是有特定的 TTS engine組合而成.
    • 若要實作上面的系統, 目前手邊資源: iPhone, Raspberry Pi, 電視, USB camera, 預計架構為: USB camera (including Microphone) 作為 Input, 串接到 Raspberry Pi (RPi), RPi 作為 Server, 上面含有 AI system做任何判斷, 再以 HDMI 串接電視, 作為聲音與影像的輸出. 另外就是應用面的思考了. 360 camera+房仲系統?
    • 既有軟體

    [Mac] 清除 Mail 相關檔案

    Mac OSX Sierra 在 System Information.app (系統資訊) 中加入了儲存空間管理 (Command + U)的功能, 但滿常看到, "郵件" 裡面有許多正在使用的儲存空間, 卻無法移除(如下圖)


    可以到 ~/Library/Mail/V4/ 底下, 將一些數字ID的資料夾清除即可.

    2017年1月22日 星期日

    [Mac] read & writer NTFS by ntfs-3g


    • 以前利用更改 /etc/fstab 或是利用工具 Paragon NTFS 來達成, 但在沒有購買軟體的情形下, 還是參考使用了 ntfs-3g
    • 癮科技的教學來看, 需使用 NTFS-3G+Fuse For OSX + fuse_wait, ...但我第一步下載安裝就一直給我顯示版本錯誤了, 後面提的
      mount -t ntfs-3g /dev/disk2s5 /Volumes/mountPoint
      我也失敗, 就先放棄這作法惹(我的理解, 安裝完應該要有
      /sbin/mount-ntfs03g
      之類的才是...)
    • 以下是我嘗試後, 目前可用的作法
      • 從 MacPort 安裝
      • sudo port install ntfs-3g
      • 查詢要 mount的 ntfs disk並先 unmount, 最後 mount到 newMountPoint
      • diskutil list
        diskutil unmount /dev/disk2s5
        sudo ntfg-3g /dev/disk2s5 /Volumes/newMountPoint
    • Reference

    2017年1月17日 星期二

    [Toolchain] Autotools & CMake

    • Autotools
      • autoconf, automake, libtools
        • Note: Mac OSX 自 XCode 4.3之後, 沒有內建這些 autotools了. 可以透過 port install autoconf automake
      • Open source 三部曲
        • ./configure
          • 產生 Makefile 及 config.h (所以程式中盡量少用 config.h)
        • make
        • make install
      • flowchart
        • 利用 autoscan 建立 configure.ac (舊版 autotool叫做 configure.in)
          • autoscan
            mv configure.scan configure.ac
            • 產生範本 configure.scan, 自行更名為 configure.ac供後面 autoconf使用. 同時會產生 autoscan.log (但成功的狀態似乎沒填任何東西, 要看過程反而是要用 autoscan --verbose來看)
            • 從 verbose可以看到這個 autoscan做了些什麼事, 從掃描 source files開始, 會以目前執行的 directory 當作 srcdir, 分別掃描 cfiles, makefiles, shfiles, 以及瀏覽用到的 function, header, install 及相關變數 lists, 如下 samples (可自行以 open source project 驗證, 或如 reference裡用的 LilyTerm來練習)
            • autoscan: srcdir = .
              cfiles: src/console.c src/console.h src/data.h src/dialog.c src/dialog.h src/font.c src/font.h src/lilyterm.h src/main.c src/main.h src/menu.c src/menu.h src/misc.c src/misc.h src/notebook.c src/notebook.h src/pagename.c src/pagename.h src/profile.c src/profile.h src/property.c src/property.h src/window.c src/window.h
              makefiles: data/Makefile po/Makefile
              shfiles: src/unit_test.sh
              
              function:
              bzero: src/main.c:314
              memset: src/menu.c:1995 src/menu.h:29
        • 修改 configure.ac
          • vi configure.ac
            • configure.ac 基本上就是個 script, 只是裡面呼叫非常多 macros以利 m4 (GNU Marco Processor) 處理, e.g. AC_*( ), 其中 [ ] 為區隔字元, 以及 AC prefix代表 AutoConf 相關 marco; AM_*代表 AutoMake相關marco. 另外注意, macro名稱與左括號 ( 中間不要有空格, e.g. AC_PREREQ([2.69]) 而不是 AC_PREREQ ([2.69])
              • #為註解
            • 未更改
            • #                                               -*- Autoconf -*-
              # Process this file with autoconf to produce a configure script.
              
              AC_PREREQ([2.69])
              AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
              AC_CONFIG_SRCDIR([src/console.c])
              AC_CONFIG_HEADERS([config.h])
              
              # Checks for programs.
              AC_PROG_CXX
              AC_PROG_CC
              AC_PROG_INSTALL
              AC_PROG_MAKE_SET
              
              # Checks for libraries.
              
              # Checks for header files.
              AC_PATH_X
              AC_CHECK_HEADERS([fcntl.h locale.h stdlib.h string.h sys/socket.h unistd.h])
              
              # Checks for typedefs, structures, and compiler characteristics.
              AC_TYPE_PID_T
              
              # Checks for library functions.
              AC_FUNC_FORK
              AC_CHECK_FUNCS([bzero memset setenv setlocale socket strcasecmp strstr])
              
              AC_CONFIG_FILES([data/Makefile
                               po/Makefile])
              AC_OUTPUT
              
              
      • Samples for practice
      • Reference:
    • CMake
      • front-end of make
      • CTest
    • MacPorts
      • 目的: 簡化 compile, install linux software to Mac. 可想成 apt-get, 即為 command line based package management
      • 操作: port install, port search, port contents
      • 通常會放在 /opt/local 底下
      • 亦可透過 pkg-config --cflags port, 找到需要的 installed port header與 library
    • pkg-config --cflags
    • port contents installed | grep gdkkeysyms.h

    2017年1月15日 星期日

    [Blog] 在 blog 中張貼程式碼

    • 原理:
      1. 以 HTML的 pre tag來實作, 如 HTML裡的 <img> 表示圖片、<h1>表示等級1的header等等, pre表示的是 pre-formatted text, 會以定寬字型以及保留空格與換行的方式來處理。
      2. 設計特別的 class 來指定這些程式碼, 如 Google 的 prettyprint
      3. 設計 CSS 來 highlight畫面
      4. 利用 javascript 來做是否為keyword等字的判斷, 來highlight特別的字 (每個語言都有自己的 keywords, 如: class、printf 等等, 這些 keywords因語言不同而不同, 所以應該也要有對不同語言提供不同 keywords highlight的功能)
    • 方法:
      1. 載入上面提到的 CSS (以blog-替程式碼上色提供的 sample為例)與 Javascript (以 Google Code Prettify 為例)
        1. 在 Blogger中, 新增 HTML/Javascript 小工具
        <style type='text/css'>
        .pre-highborder{
            border: 1px solid #ff0000;
            padding: 3px 3px 3px 0;
        }
        
        pre.prettyprint, code.prettyprint {
            border-radius: 8px;
            -moz-border-radius: 8px;
            -webkit-border-radius: 8px;
            padding: 5px;
            overflow: auto;
            background-color: #eee !important;
            color: black;
            box-shadow: 0 0 5px #999;
            -moz-box-shadow: 0 0 5px #999;
            -webkit-box-shadow: 0 0 5px #999;
        }
        
        /*font*/
        pre span, code span {
            font-family: 'Consolas', 'Courier New', 'Microsoft JhengHei', sans-serif !important;
            font-size: 12px !important;
        }
        
        /*each line*/
        li.L0, li.L1, li.L2, li.L3, li.L4, li.L5, li.L6, li.L7, li.L8, li.L9 {
            margin: 0 !important;
            padding: 2px 0 2px 4px !important;
            list-style-type:decimal !important;
            border-left: 1px solid #999;
        }
        
        /*even line*/
        li.L1, li.L3, li.L5, li.L7, li.L9 {
            background-color: #f6f6f6 !important;
        }
        
        /*odd line*/
        li.L0, li.L2, li.L4, li.L6, li.L8 {
            background-color: #FFF !important;
        }
        
        /*line-number background color*/
        ol.linenums {
            color: black;
            background-color: #eee;
            margin-left: 10px;
        }
        </style>
         
        <script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js">
        </script>
      2. 在自己的程式碼中輸入程式碼區塊
        1. 指定為 pre block, 並指定 class 與特定 config (例如特別的語言: lang-*, support list, 或是顯示行號的 linenum)
          <pre class="prettyprint lang-cpp linenums">code snippet</pre>
        2. 需要注意的是, 這邊的 code snippet要經過處理, 也就是有經過 escape符號預處理, 簡單來說, 通常任何程式語言都會有 escape characters, 簡單就是用以告知 compiler/interpreter, 你就是要用該符號, 例如: printf的語法是 printf("what you want to print"), 但你就是要 print 引號 (")的時候怎麼辦咧? 就是加入 escape character (\), 而在 HTML則是輸入 &lt; &gt; 等等, 不過也有網頁服務直接幫你轉換 => HTMLEscape .net
      3. 另外, 也有很多類似的相關 js 可以套用, 如 SyntaxHighlighter

    2017年1月14日 星期六

    [Codec] Video Codec 參考書目

    覺得不錯的參考書目:

    • H.264 and MPEG-4 Video Compression
      • 雖然年代有點久, 但內容滿適合入門以及了解相關知識,包含簡述codec 發展歷史codec 觀念 (Chapter Video Coding Concept - 包含 block diagram, e.g. DPCM/DCT video encoder/decoder架構)及 standard相關細節 (e.g. Chapter H.264/MPEG4 Part 10)
    • Video Demystified
      • 比較偏向訊號面來講解, e.g. 數位訊號(e.g. PAL, color space)、廣播制式(e.g. DVBC/ATSC)
    • Next Generation Video Coding and Streaming
      • 以 HEVC為主, 滿 spec. 導向, 另外在 container(e.g. mp4, ts), 以及 streaming 著墨較多
    以上是目前覺得不錯的書目, 由於工作需要, 所以開始 K相關技術, 若有相關技術可以分享交流, 甚至一起來個讀書會. 都非常歡迎 feedback哦