2017年11月29日 星期三

[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