Sunday, August 19, 2018

感動,如此創造:日本電影配樂大師久石讓的音樂夢


這本書算是久石讓蠻早期的書(2007),他給自己的定位是商業藝術音樂家,在流行音樂崛起的當下與過往學習的古典音樂,以及追尋的極簡音樂中取得平衡。流行音樂對久石讓來說是透過節奏來提高傳唱度,由於節奏容易了解,所以一般人也可以輕易理解,相較於古典音樂,追求音符的協調,甚至背後也許多理論。傳統古典音樂的奏鳴曲式是莫扎特和海頓產量高的原因,但是過度依據格式會流於形式化,所以才有浪漫樂派和國民樂派的出現,例如:史麥塔那的<我的祖國>與鮑羅定的<中亞草原>,讓音樂從絕對音樂的領域回到標題音樂,音樂也因此有了故事。然而近代過度複雜化的古典音樂,造成觀眾難以理解,也因此有了極簡音樂反動。久石讓說她以前很想創作類似John Cage的前衛音樂,而且他也很喜歡Philip Glass和Michael Nyman的極簡音樂,也希望未來可以創作出極簡音樂樂曲。其實他的配樂中有時也帶有極簡主義色彩,這些過往的經歷是他創作的基礎。久石讓的音樂95%源於過去積累,5%來自感受,他的音樂創作過程是理性的透過過去積累的知性達到感性,旋律來自無意識的神來一筆。

我覺得他在此書中對電影配樂的想法十分有趣,在快樂的場面配上快樂的音樂是很常見的做法,但是若是這樣容易預測容易限縮觀眾的思考,他這裡舉了韓劇『冬季戀歌』XD。我覺得漫威最近的電影配樂都被批評沒有記憶點也是這個原因(https://www.youtube.com/watch?v=7vfqkvwW2fs)。有時採取對位作法(反差)更能讓觀眾了解作品意含,例如,北野武(我忘記久石讓提的是不是他了)的電影透過劇內音樂柔和的練習曲配上劇中的打鬥,讓觀眾思考兩人的時代億含。對電影的聲音來說分為『劇內音樂』與『劇外音樂』,大部分的配樂都是劇外音樂,劇內音樂現在都被稱為音效,然而劇外音樂是對於電影內容的形容。過多音樂描訴不一定自然,最自然的情況是完全使用劇內音樂(所以久石讓自己導的電影<四重奏>幾乎都使用劇內音樂)。

對此久石讓也稍微評論了John Williams的星際大戰,星際大戰最有名的就是主要角色幾乎都有自己的主題,有時你甚至光聽音樂就知道有哪些人在同一幕中。對於星際大戰的配樂來說,久石讓認為這是典型好萊塢式的配樂,音樂十分的滿,在星際大戰的例子可以提昇電影格局。然而不一定每種電影都適合。歐洲以及亞洲配樂家比較少用此種技法(也許以後可以多找找歐系配樂來聽),歐亞配樂常對於整個『電影』做主題,例如『霍爾的移動城堡』就是一個主題貫串(宮崎駿要求久石讓用一個主題)。我覺得各有優缺,星際大戰這類商業電影透過人物主題式手法提高了豐富度,也讓觀眾記憶深刻。而歐亞系配樂較為內斂,這類配樂適合描繪感情世界。至於採用民族音樂以及民族樂器,例如尺八、二胡等樂器,久石讓認為不一定比較好,避免過度直接使用與劇中相符的民族樂器,不然會讓觀眾有先入為主的觀念,觀眾思考會定型。此外,使用民族樂器時也需要了解該民族底蘊,他這裡算是批評了『藝妓回憶錄』的尺八用法(日本人幾乎都很討厭這部)。我覺得按照其說法Alexandre Desplat的『歡迎來到布達佩斯大飯店』應該是一個比較好的例子,透過如何俄羅斯以及歐洲的一些民族音樂『偽造』出個假的東歐國家。而Gustavo Santaolalla的『火線交錯』也是算是民族音樂用的比較的例子。此外,久石讓表示『恐怖電影』的配樂其實有些也十分有趣以及工整,我覺得以後也可以聽一些。

久石讓也對日本當時的音樂圈做出些批評。他認為日本人搞音樂過度追求技法,從小就一直過度訓練技術,缺少思考,演奏小家子氣,技巧達到某一階段就停滯。這對我這個圈外人來說有點虛無飄緲,我唯一能聯想到的大概就是『四月是你的謊言』裡的有馬公生和『琴之森』的阿海這兩個人物了。

2018 COSCUP Day2

  • flatpak vs. snap

  • 回望踏入 Linux 内核之旅

  • uTensor: AI on Microcontroller

    • https://hackmd.io/c/coscup18-data/%2Fcoscup18-data-utensor
    • https://github.com/uTensor/uTensor
    • 在MCU上跑Tensor,由於MCU功耗極低,而且超便宜,若能將部份機器學習推論部份搬至MCU上會在應用上更有幫助。然而MCU有其限制,例如code size,ram size小,而且又很慢,因此僅適合做推論。為了克服ram太小問題,可以將資料存於SD卡中(SDTensor)或是ROM(ROMTensor),其中ROM tensor可以不需要SD卡。在編譯期的優化需要判斷哪個Tensor最常被Reference,讓其停留於MCU的data memory中。至於應用,可以用在Sensor Fusion,對資料做前處理,減少傳遞的資料量。也可以做輸入辨識。
    • uTensor建立在ARM mbed平台上。即便如此,程式碼須撰寫的數量仍多,因此有了utensor_cgen的專案,將python tensor轉為uTensor。
    • uTensor專案下方有對於edge computing做介紹。
  • 其他:同場加映-山嵐拉麵



湯濃,但是略油,料豐,但是略貴

2018 COSCUP day 1

  • Introduction to Julia 308

    • https://hackmd.io/c/coscup18-julia/%2Fcoscup18-julia-introduction-to-julia
    • https://www.slideshare.net/ssuserd6984b/coscup-introduction-to-julia
    • 『Write like Python, run like C.』沒什麼比這句或更有吸引力了,這個語言一本上是語法融合R+Python的動態型別語言,不過她速度實測上接近C和Lua,不過按照講者說法Julia需要在宣告時給定變數型別才可獲得最佳效能。
    • pass by sharing,function內變數指向原本的參數位置
    • 語法上有趣的部份是他的陣列Index是從1開始的,陣列支援comprehension展開,此外支援複數型別和有理數型別,而且在有UTF-8,可以輕易的打出希臘字母,對於學術界來說時的親切。也因此金融界,和科學運算界用這個語言比較多。我覺得她可以取代Scipy和Numpy在這些領域的地位。
    • 有內建的profile tool,不用像C/C++需要prof或是valgrind。可以用@time產生火焰圖。
    • 有平行語法@parallel修飾字,基本上就是openmp的#pragma parallel for之類的包裝。
    • @code_native與@code_llvm的修飾字可以方便了解當時程式的組語以及LLVM IR。
    • Machine Learning,Deep Learning和web full stack均有套件,還也史上最強大微分方程套件。
  • 小鴨城 (Duckietown),一個基於 Raspberry Pi 和 ROS 的開源無人小車專案介紹

    • https://hackmd.io/c/coscup18-misc/%2Fcoscup18-misc307-duckietown
    • Ubutu + ROS + OpenCV + Raspberry Pi用來訓練學生對於無人車的設計基本了解。
    • 主要注重車子與雙黃線的距離估計,圖像與真實世界的投影轉換,光影的補完與校正。
    • 交大也有開課歐(軟體創意專題)。
    • Puyuma
  • 在 RISC-V 上的 ftrace 及 perf 工具移植經驗

    • https://hackmd.io/c/coscup18-kernel/%2Fcoscup18-kernel-risc-v-ftrace-perf
    • kernel是黑盒子,需要透過ftrace和perf來了解kernel效能。
    • 流程:開發者使用效能監控工具->改變kernel設定,進入開發模式->產生監控資料->離開監控模式->開發者存取資料
    • Ftrace:以 function 為等級的監控,進入每個函數,綁架正流執行流程,產生執行與離開的時間戳記,使用者透過透過 tracefs 檔案系統取的 trace 內容。
    • Perf : 以 process 為等級的監控,排程器在排入形成時啟動、形成離開時移除 perf 機制,產生包括軟體組態,以及硬體counter,甚至cache miss資料。透過一些gui tool 或是 CLI 獲得perf解碼資料。
    • 均須在compile時加入 -pg flag,插入_mcount
    • _mcount 如何運作,透過更改call stack中當前的return address,讓其進入_mcount產生資料進行計算。https://github.com/lattera/glibc/blob/master/sysdeps/sh/_mcount.S
    • patch重點->硬體counter。
  • 快快樂樂 SIMD

    • https://hackmd.io/c/coscup18-kernel/%2Fcoscup18-kernel-simd
    • https://www.slideshare.net/WeiTaWang/simd-109492525
    • SIMD算是現代CPU特色,Intel每幾年會double一次SIMD大小。SIMD是一些特殊組語,在C語言使用時通常用一些函式包裝,Vector register也會用typedef重新定義。
    • 使用SIMD前一定要會算指令cycle,最好還要有計算機組織的基礎,才有辦法trade off。
    • SIMD除了指令以外,還要了解記憶體與cache。唯有讓運算停留在register中進行愈久愈好。為了避免cache miss,array可以在function中宣告,用O3讓參數穿透(inline),interrupt避免,以免cahce被洗出去。計算cache size,避免在存圖片時cache滿出來。由於編譯器對於指標較難優化。所以避免直接使用間接取址操作,不然會編出大量load/store與cache miss。應該用中繼變數取代。少用陣列多用pointer可以避免編出大量load / store
    • algin很重要,滿出vector size不會得到好的增益。可用align指令包裝。
    • 必須記得當前CPU的register數量,避免滿出vector register的大小。
    • 使用shuffle指令ex: vtrnq(arm)重新排列資料在vector的位置
    • 盡量一口氣load store達到pipeline
    • 使用新版gcc / clang
    • -fvectorize 需要讓編譯器知道迴圈大小裁可以達到最佳優化。
    • 這個議程強調速度,所以會忽略一些可讀性。
  • LPWAN 物聯網通訊技術

  • Web 可用的組合語言 - WebAssembly & 自幹 WebAssembly 虛擬機器


  • The bright future of SUSE and openSUSE

  • The DEXON Network - The Infrastructure of the Internet’s Decentralized Future

  • Lightning Talk

Wednesday, July 25, 2018

Perlman / Film Music - Cinema Serenade (帕爾曼的電影琴聲)

Perlman / Film Music - Cinema Serenade (帕爾曼的電影琴聲)

一、資訊

電影:請見曲目
配樂作家: 很多
演奏:Perlman, Itzhak
發行廠商:Sony Music
Perlman / Film Music - Cinema Serenade


二、心得感想

這張基本上沒什麼好說的,帕爾曼加上John Williams還有其他經典電影等於"買買買"。
尤其是辛德勒的名單,還是帕爾曼最對味。
這張的第二首應該算是很常聽到(每次電視跳tango都是拿這首),不過不知道曲名,而這張剛好有機會讓我重新認識這首。第四首的郵差讓我驚豔,害我特別去spotify找整張來聽,以後有機會應該會入手。

三、曲目

  1. 紫色姐妹花(The Color Purple: Main Title)
  2. 女人香(Scent of a Woman: Tango (Por Una Cabeza))
  3. 楊朵(Yentl: Papa, Can You Hear Me?)
  4. 郵差(Il Postino: Theme)
  5. 純真年代(The Age of Innocence: Theme)
  6. 遠離家園(Theme from Far and Away)
  7. 秋水伊人(The Umbrellas of Cherbourg: I Will Wait for You)
  8. 末日四騎士(Four Horsemen of the Apocalypse: Theme)
  9. 新龍鳳配(Sabrina: Theme)
  10. 遠離非洲(Out of Africa: Main Title)
  11. 黑色奧菲歐(Black Orpheus: Manha de Carnaval)
  12. 辛德勒的名單(Theme From Schindler's List)
  13. 新天堂樂園(Cinema Paradiso: Love Theme)

Sunday, July 22, 2018

The Legend of The Pianist ( la Leggenda del Pianista sull’Oceano ) - Italy Version (海上鋼琴師)

The Legend of The Pianist ( la Leggenda del Pianista sull’Oceano ) - Italy Version (海上鋼琴師)

一、資訊

電影:海上鋼琴師
配樂作家: Ennio Morricone
發行廠商:Sony Music
The Legend of The Pianist ( la Leggenda del Pianista sull’Oceano ) - Italy Version (海上鋼琴師)


二、心得感想

這張基本上有名到我都不想寫什麼介紹了XD,不過秉持著紀錄所有我買過得專輯,所以還是隨手打一篇。這片在買之前裡面的音樂幾乎都已經在各個角落聽過了,即使電影只看過一次,在音樂課,在其他專輯(Yo-Yo Ma Plays Ennio Morricone)或多或少經典曲目包括<Playing Love>、<Magic Waltz>、<A Mozart Reincarnated>還是有名又有梗的鬥琴<Enduring Movement>有在接觸電影配樂的朋友都聽過。其中最喜歡的是<Playing Love>、<Magic Waltz>、<A Mozart Reincarnated>,至於鬥琴那首我到覺得還好。其他也有一些較為不有名曲目如帶有爵士風情的<A Goodbye To Friends>等,還有<Tarantella In 3rd Class>也都十分動聽。我覺得這張真的必收。

三、曲目

  1. Playing Love
  2. The Legend Of The Pianist On The Ocean
  3. The Crisis
  4. Peacherine Rag
  5. A Goodbye To Friends
  6. Study For Three Hands
  7. Tarantella In 3rd Class
  8. Enduring Movement
  9. Police
  10. Trailer
  11. Thanks Danny
  12. A Mozart Reincarnated
  13. Child
  14. Magic Waltz
  15. The Goodbye Between 1990 And Max
  16. Goodbye Duet
  17. Nineteen Hundred’s Madness N. 1
  18. Danny’s Blues
  19. Second Crisis
  20. The Crave
  21. Nocturne With No Moon
  22. Before The End
  23. Playing Love
  24. Ships And Snow
  25. Nineteen Hundred’s Madness N. 2
  26. I Can And Then
  27. Silent Goodbye
  28. 5 Portraits
  29. Lost Boys Calling

Arduino: High resolution PWM (more than 8bits),Arduino提高PWM resolution

Arduino PWM(analogWrite)

Arduino PWM是使用analogWrite,但是其有一個限制,也就是PWM resolution只有256,PWM duty cycle的值只能介於0~255,對於一般的應用來說,這個值還可以應付,但是對於高精度的Servo或是馬達,這個值實在是太小了。(請參考analogWrite)。雖然在有些板子Arduino提供analogWriteResolution這個函式(Zero, Due & MKR Family、參閱:analogWriteResolution)可以將PWM resolution提高至12,更高的值內部會做mapping到比較低解析度。至於其他板子(例如:Arduino Mega 2560),則需要第三方library支援(或是自己寫)。

Arduino的硬體PWM極限(Arduino Mega 2560)

以Arduino Mega 2560為例,在其datasheet(link)中提到其"Six/Twelve PWM Channels with Programmable Resolution from 2 to 16 Bits",ATmega2560有12個PWM channel,resolution可為2~16bits。所以其實Arduino Mega 2560硬體可以比Arduino Framework設計的resolution高很多。至於為什麼Arduino官方不用16bits呢,我猜是因為為了保證0~255的限制是可以達成。Arduino Framework的PWM frequency是固定的(16 MHz / 64 / 255 / 2 = 490.196Hz,見Secrets Of Arduino PWM)。

而PWM resolution並不是你想要16bits就可以有16bits的resolution,PWM resolution跟PWM frequency息息相關。在ATmega2560中,Frequecy與系統頻率、timer prescaler(除頻器),還有最常使用的TOP值(限定Timer counter的最大上限)有關。TOP值的大小即為PWM resolution。依據Atmel PWM resolution公式:
PWM resolution = log(TOP + 1) / log 2
 通常要把PWM resolution拉到最高,PWM frequency會很小,這主要看設計時的選擇。其他細部詳情請見ATmega640/V-1280/V-1281/V-2560/V-2561/V [DATASHEET]第17章。

 arduino-pwm-frequency-library

這裡介紹一個第三方library "arduino-pwm-frequency-library",可以在這個網址找到:https://code.google.com/archive/p/arduino-pwm-frequency-library/downloads
,這個libaray的範例中可以提供你在給定的frequency下,PWM resolution的上限。而程式用起來十分簡單如下:


// Arduino Mega,pins 2 - 13 and 44 - 46.

#include <pwm.h>

unsigned int duty = 1; 

//use pin 11 on the mega for this example to work

int led = 11; // the pin that the LED is attached to

void setup() {

  // put your setup code here, to run once:

  Serial.begin(57600);

  InitTimersSafe(); //initialize all timers except for 0, to save time keeping functions

  pinMode( led, OUTPUT);

  SetPinFrequency(led, 10);

  

}



void loop() {

  // put your main code here, to run repeatedly:

  

  while(1){

    pwmWriteHR(led,duty);

    duty+=10;

    delay(100);

    Serial.print("duty = ");

    Serial.println(duty);

  }

}


然而這個library的function會有一些副作用,由於前面提過要改resolution和frequency需要更改Timer的一些設定,其中Arduino使用Timer0作為delay() 這個函是的時序。所以可能會有影響,另外她同時會更改所有Timer的設定,若有使用其他Timer的話要小心。

Arduino Framework裡的digitalPinToTimer Macro

在Trace arduino-pwm-frequency-library時,我發現其呼叫了這個Marco digitalPinToTimer,其實在Arduino Core[github]中還有多類似的Macro像是 digitalPinToInterrupt等(https://github.com/arduino/ArduinoCore-avr/blob/3f63f2975e7183c3254b6794bfcc8f19ca0301c9/variants/standard/pins_arduino.h)這些Macro實做方式為,在同一個header中使用PROGMEM(program space)建表,可知Arduino framework其實裡面可能使用了些program space存放這些表,即便你沒用到這些函式或marco。若是哪天你不小心寫滿了program space可能就是這個問題。(補充:大部分Arduino cpu如ATmega 2560為哈佛架構的RISC cpu,其有獨立的program memory存放code指令和一些const,還有獨立的data memory存放變數。而我們一般的桌機為拆分快取的哈佛架構,到L1或是L2 cache變為哈佛架構。而8051為Von Neumann,data space和program space共用memory (bus))。

Wednesday, July 18, 2018

對MPLAB X IDE產生之專案導入git

MPLAB X IDE產生之專案架構

MPLAB X IDE產生之專案會XXX.x以.x做結尾。常見的檔案樹如下:
.
├── build
│   └── default
│       └── production
│           ├── main.o
│           └── main.o.d
├── debug
│   └── default
├── dist
│   └── default
│       └── production
│           ├── 4013_test.X.production.elf
│           ├── 4013_test.X.production.hex
│           └── 4013_test.X.production.map
├── main.c
├── Makefile
└── nbproject
    ├── configurations.xml
    ├── Makefile-default.mk
    ├── Makefile-genesis.properties
    ├── Makefile-impl.mk
    ├── Makefile-local-default.mk
    ├── Makefile-variables.mk
    ├── Package-default.bash
    ├── private
    │   ├── configurations.xml
    │   └── private.xml
    └── project.xml
可以發現build/default、debug/default、dist/default/底下存有編譯時期產生之檔案,而nbproject/private則存有當前專案於當前系統中實際之相依toolchain路徑。

Git Ignore

有了前面的事實,我們git ignore應該寫成如下:
*/nbproject/private/
*/dist/default
*/build/default
*/debug/default

至少需拔掉編譯時期會產生檔案。此外nbproject下的Makefile相依檔案,如Makefile*, XXX.mk等一定要進入git。

跨OS issue

雖然MPLAB X IDE產生的專案可以輕易在LINUX上與Windows上運行,不過為了紀錄OS資訊,MPLAB X IDE會在Makefile-genesis.properties這些properties檔案中存入作業系統資訊。因此git在這些區域容易出現問題(confilct)。比較好的辦法就是不要跨平台。然而若是仍須跨平台,Makefile-genesis.properties5這檔案可能會造成MPLAB X IDE找不到compiler或是toolchain。因此可以透過MPLAB X IDE  GUI界面,選擇project properties,重新創立properties。

NetBeans git plugin

MPLAB X IDE是以NetBeans為基礎,所以也可以使用NetBeans的git plugin。

Saturday, July 14, 2018

CMake: find_package and custom find cmake (findXXX.cmake)

CMake: find_package and custom find cmake (findXXX.cmake)

我個人覺得這主題寫最好的是這篇,我會建議大家可以看這篇,不要看我寫的XD
https://gitlab.kitware.com/cmake/community/wikis/doc/tutorials/How-To-Find-Libraries

find_package

find_package是CMake中用來找第三方package的command。這command功能是去找到所需第三方package的資訊(版本、include path、library path等),並將資訊存入定好的variable中。find_package會曲找尋CMakeLists.txt所在資料夾下的FindXXX.cmake,或是cmake本身定義好的FindXXX.cmake,通常系統路徑是/usr/share/cmake/Modules下(Arch Linux是放在/usr/share/cmake-版本號/Modules下)。基本上有名的package都已經被定義好了。若是想要知道有哪些可用可以自行去路徑下找,或是用:
cmake  --help-module-lists
查詢。
在CMake中使用find_package通常會使用類似下列參數。

find_package(OpenCV 3.4.1 REQUIRED)
 find_package(package_name version [REQUIRED] [QUIET] ),Version非必要,主要看package敘述。REQUIRED和QUIET主要用於相依性,若package為必要用REQUIRED,若沒找到直接報錯。選擇性用QUIET,通常會用類似下列方式達成選擇性。若沒找到package不會報任何錯誤。
find_package(OpenMP)
if (OPENMP_FOUND)
    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
endif()
透過find_package 定義的-FOUND判斷是否存在。
find_package通常會定義下列四種變數:
  • _FOUND : 是否找到
  • _INCLUDE_DIRS or _INCLUDES : include path,類似gcc -I/path
  • _LIBRARIES or _LIBRARIES or _LIBS : link library 類似 gcc -L/path -l library
  • _DEFINITIONS
當有這些參數後,即可透過一般CMake include或link方式使用,例如:
include_directories( ${OpenCV_INCLUDE_DIRS} )
target_link_libraries (main ${PCL_LIBRARIES} ${OpenCV_LIBS})
等方式使用。

 custom find cmake (findXXX.cmake) find modules

若是CMake沒提供modules就要自己寫find modules啦。
依照前面的敘述,可以知道Find modules最重要的就是取得那四種變數的值。下面以我寫的FindRealsense2.cmake為例。


find_package(PkgConfig)
find_package(PkgConfig)
if(${CMAKE_VERSION} VERSION_LESS 2.8.2)
    pkg_check_modules(PC_REALSENSE2 librealsense2-dev)
else()
    pkg_check_modules(PC_REALSENSE2 QUIET librealsense2-dev)
endif()

set(REALSENSE2_DEFINITIONS ${PC_REALSENSE2_CFLAGS_OTHER})

#add a hint so that it can find it without the pkg-config
find_path(REALSENSE2_INCLUDE_DIR rs.hpp
          HINTS
          ${PC_REALSENSE2_INCLUDEDIR}
          ${PC_REALSENSE2_INCLUDE_DIRS}
          PATHS
            "${PROGRAM_FILES}/librealsense2/Include"
            /usr/include
            /usr/include/librealsense2
            /user/include
            /user/include/librealsense2
          PATH_SUFFIXES librealsense2
)

if(${CMAKE_CL_64})
    set(REALSENSE2_PATH_SUFFIXES lib64)
else()
    set(REALSENSE2_PATH_SUFFIXES lib)
endif()

#add a hint so that it can find it without the pkg-config
find_library(REALSENSE2_LIBRARY
             NAMES librealsense2.so
             HINTS
             ${PC_REALSENSE2_LIBDIR}
             ${PC_REALSENSE2_LIBRARY_DIRS}
             PATHS
               "${PROGRAM_FILES}/librealsense2"
               /usr/lib
               /usr/lib/x86_64-linux-gnu
               /user/lib
)

set(REALSENSE2_INCLUDE_DIRS ${REALSENSE2_INCLUDE_DIR})
set(REALSENSE2_LIBRARIES ${REALSENSE2_LIBRARY})

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(librealsense2 DEFAULT_MSG
    REALSENSE2_LIBRARY REALSENSE2_INCLUDE_DIR)

mark_as_advanced(REALSENSE2_LIBRARY REALSENSE2_INCLUDE_DIR)

其中最值得關注的是find_path和find_library這兩個command。顧名思義,find_path是拿來找include path的,而find_library則是拿來找shared library location的。find_path主要格式如下(詳情見find_path):
find_path(
<VAR>
name | NAMES include_folder_or_file_name
[HINTS path1 path2 ...]
[PATHS path1 path2 ...]
[PATH_SUFFIXS suffix1 suffix2]
)
其中<VAR>即為XXX-INCLUDE_DIR,name可以是header name,比較特殊的是HINTS和PATHS,HINTS與PATHS最大差別是,HINTS會依照系統現有的變數去推測路徑,PATHS則是直接寫死路徑。PATH_SUFFIXS是路徑後綴,例如說rs.hpp實際上在Ubuntu 16.04的路徑是/usr/include/x86_64-linux-gnu/librealsense2/rs.hpp,而前面我們寫的路徑只有/usr/include/x86_64-linux-gnu,這時她會自動加上librealsense2這後綴到路徑中。PATH_SUFFIXS可以用來處理不同Linux distribution路徑放置的習慣問題(有些會像這個例子一樣把librealsense2的東西放入librealsense2中),若有多個cmake 會都try try看。
另一個類似的command是find_library(詳細在這find_library):
find_library(
<VAR>
name | NAMES libraries_name
[HINTS path1 path2 ...]
[PATHS path1 path2 ...]
[PATH_SUFFIXS suffix1 suffix2]
)
其中<VAR>即為XXX-LIBRARIES,其他欄位都和find_path一樣。而XXX-FOUND,則當find_path或是find_library都找不到東西實設為NOT-FOUND。

這個範例裡還有兩個好用東西值得一提,一是pkg_check_modules,這其實是pkg-config的再包裝,以前找opencv的library的時候很常用:
$ pkg-config opencv --libs
-lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_aruco .......
cmake中的pkg-config功能也差不多,她會幫你找到所需的library放入指定的var中。如下:
 pkg_check_modules(PC_REALSENSE2 librealsense2-dev)
 這裡是用pkg_check_modules先依照package manager裡有的資訊尋找路徑,產生variable放入HINTS中。

另一個好用的東西是mark_as_advanced,這command會將該變數設為最高級別,當使用ccmake時不需要開啟advanced mode即可看到的變數。

CMake跟automake之類的比起來算是蠻方便的。

Friday, July 13, 2018

CMake Tricks: 一些小技巧

CMake Tricks: 一些小技巧

有常在編一些opensource的專案的應該都對CMake不陌生。這篇文章就整理些我在編使用CMake的專案時遇到的一些問題與解法。

追加Compiler flags

CMake裡面有一些變數是用來pass compiler flag給compiler,例如:CMAKE_CXX_FLAGS是用來給g++之類的C++ Compiler。這些變數當然是可以修改的。常見比較好的作法按依照該專案開發者定義的BUILD_TYPE來編,CMake裡面有一些常見的BUILD_TYPE,例如:Debug, Release, RelWithDebInfo ......等。可以透過在產生Makefile時下:
cmake -DCMAKE_BUILD_TYPE=value
來指定BUILD_TYPE,也可以在CMakeLists.txt中修改或是新增:
SET(CMAKE_CONFIGURATION_TYPES  "Release")
來給定。而BUILD_TYPE會使得該BUILD_TYPE中所定義的CMAKE_<LANG>_FLAGS_<BUILD_TYPE>被加入CMAKE_<LANG>_FLAGS中,例如:把build type設為Debug,會使得CMAKE_C_FLAGS_DEBUG被加入CMAKE_C_FLAGS中。這裡cmake官方文件寫得很清楚reference

若要自行追加flags也可以透過新增或是修改flags到CMAKE_<LANG>_FLAGS中。例如:
SET(GCC_COVERAGE_COMPILE_FLAGS "-g")
SET( CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}" )
我這裡的作法是新創一個變數GCC_COVERAGE_COMPILE_FLAGS,將其設為"-g",然後把她加入CMAKE_CXX_FLAGS中。

此外還有一個簡單有效的作法。由於CMAKE_C_FLAGS會依照環境變數CFLAGS初始化,所以只要修改CFLAGS這個環境變數就好。其他常見的對應如下:

  • CMAKE_C_FLAGS -> CFLAGS
  • CMAKE_CXX_FLAGS -> CXXFLAGS 
  • CMAKE_CUDA_FLAGS -> CUDAFLAGS
  • CMAKE_Fortran_FLAGS -> FFLAGS

而若是使用ccmake來產生Makefile,可以在視窗中輸入t開啟進階選項。直接在選單中修改即可。ex:

Option

下選項分為兩種,一是直接下在command line中,另一種則是用ccmake。
下在command line,只要用-D就好,ex:
cmake -DCMAKE_BUILD_TYPE=value
然而用這個很難知道,有什麼選項可以下,而且很麻煩,不過如果你build project是用script只能用這招。至於要知道有哪些選項可以透過:
cmake -L
得到所有選項以及當前選擇。
另外一種下option的方式是ccmake, 在Arch中安裝cmake套件,Ubuntu中安裝cmake-curses-gui即可,用法就是把所有cmake的指令改成ccmake。

當更新選項重新build時,會因為路徑下有CMakeCache.txt造成build成上一個版本的設定。可以把CMakeCache.txt刪除,或是透過make rebuild_cache重新建立CMakeCache.txt

CMake debug

如果要撰寫cmake最大問題是不知道cmake variable的值,經過運行後會變什麼。可以透過查看CMakeCache.txt或是下cmake -LAH來查看值。


其他連結:https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/Useful-Variables

Blogger Syntax highlight over https

Blogger Syntax highlight over https

由於現在blogger要求https,以往的常用的scripts:
http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js
會因為是http而造成瀏覽器報錯,而且載入的code通常會失敗。因此這裡提供一個新的解法。

改用以下cdn由cloudflare提供的。就可以讓你的code在https下漂漂亮亮的。
打開blogger->theme->編輯HTML,在<head></head>中新增以下code。

 

reference:
https://cdnjs.com/libraries/SyntaxHighlighter
http://3cschool.blogspot.com/2014/02/blogger-syntaxhighlighter.html

Friday, March 9, 2018

使用LXC建立USB以及X-forward環境

使用LXC建立USB以及X forward環境

因為修課需要一些debian系的工具,不過我不想讓debian系的和Arch Linux混在一起,所以LXC看起來是一個不錯的解。

環境

  1. OS: Arch Linux (4.15.7-1-ARCH)
  2. LXC
  3. ubuntu on LXC

步驟

LXC準備

安裝 LXC

$ sudo pacman -Sy lxc arch-install-scripts debootstap

建立 Host Network (NAT bridge) (Arch Wiki寫得很好看Arch Wiki)

建立/etc/default/lxc-net(詳情見Arch Wiki)
USE_LXC_BRIDGE="true"
LXC_BRIDGE="lxcbr0"
LXC_ADDR="10.0.3.1"
LXC_NETMASK="255.255.255.0"
LXC_NETWORK="10.0.3.0/24"
LXC_DHCP_RANGE="10.0.3.2,10.0.3.254"
LXC_DHCP_MAX="253"
修改lxc template conf,在/etc/lxc/default.conf新增
lxc.net.0.type = veth
lxc.net.0.link = lxcbr0
lxc.net.0.flags = up
lxc.net.0.hwaddr = 00:16:3e:xx:xx:xx
安裝dnsmasq
$ sudo pacman -Sy dnsmasq
開啟以及設定開機啟動:
sudo systemctl start lxc-net
sudo systemctl enable lxc-net

建立container (ubuntu)

建previleged的container
$ sudo lxc-create -n UbuntuBuild -t /usr/share/lxc/templates/lxc-ubuntu [ -P lxc-location]  
修改container的網路(由於我要裝的軟體的license綁mac address,所以我需要修改一下mac address),修改lxc的路徑下的config file,若沒指定lxc的位置,預設是在/var/lib/lxc/CONTAINER_NAME/config,有指定路徑則在 /PATH/YOU/DEFINED/CONTAINER_NAME/config
## default values
... 
...
## network
lxc.net.0.type = veth
lxc.net.0.link = br0
lxc.net.0.flags = up
lxc.net.0.name = eth0
lxc.net.0.hwaddr = .... ## 自行修改mac address

LXC Xorg

修改container的config(同上位置)
## default values
...
...
# network
...
...
## for xorg
lxc.mount.entry = /dev/dri dev/dri none bind,optional,create=dir
lxc.mount.entry = /dev/snd dev/snd none bind,optional,create=dir
lxc.mount.entry = /tmp/.X11-unix tmp/.X11-unix none bind,optional,create=dir,ro
lxc.mount.entry = /dev/video0 dev/video0 none bind,optional,create=file

lxc.mount.entry = tmpfs tmp tmpfs defaults
基本上邏輯是把Xorg需要的device mount進來。
/dev/dri為direct rendering manager(DRM)的device file,
/dev/snd為音效的device file
/dev/video0為video device file
ubuntu on LXC中安裝X相關套件
$ sudo lxc-console -n UbuntuBuild [ -P /path]
進到ubuntu lxc
# sudo apt-get install xauth x11-apps
使用ssh -X進入LXC
# /usr/bin/xclock
應該要有windows跑出來
其他app可能會需要裝dbus
# sudo apt-get install dbus dbus-x11
其他部份可以看以連結How Do I Get X11 Applications Running in a LXC Container?

LXC USB

修改container的config(同上位置)
## usb
lxc.cgroup.devices.allow = c 189:* rwm

lxc.mount.entry = /dev/bus/usb/001 dev/bus/usb/001  none bind,optional,create=dir
lxc.mount.entry = /dev/bus/usb/002 dev/bus/usb/002  none bind,optional,create=dir
lxc.mount.entry = /dev/bus/usb/003 dev/bus/usb/003  none bind,optional,create=dir
lxc.mount.entry = /dev/bus/usb/004 dev/bus/usb/004  none bind,optional,create=dir
接下來我們來探究一下
lxc.cgroup.devices.allow = c 189:* rwm
這行的意思,首先
$ ls -al /dev/bus/usb/001
drwxr-xr-x 2 root root     80 Mar  8 23:06 .
drwxr-xr-x 6 root root    120 Mar  8 23:06 ..
crw-rw-r-- 1 root root 189, 0 Mar  8 23:06 001
crw-rw-r-- 1 root root 189, 1 Mar  8 23:06 002
你會發現189這個數字,這數字其實是major number,這些數字在Linux的文件中都有定義,請看https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/devices.txt
逗號後為minor number,有於usb裝置多,所以在lxc.cgroup.devices.allow中用wildcard取代。底下部份就是把usb的device folder mount進LXC中。

LXC Serial Port設定

由於修課需要用到serial port,但是Serial Port的tty只有插上後才會出現,這對開機就需mount的lxc來說偏麻煩。這時有一個好用的指令出現了。

lxc-device

在使用lxc-device時仍須注意cgroup是否有允許該裝置。
例如Serial Port常用(USB serial converters)的major number為188。所以需要在config中新增
lxc.cgroup.devices.allow = c 188:* rwm
這樣開機後才有效果。接下來,在插入裝置後找到該裝置device名稱,例如
/dev/ttyUSB1。這時我們需要透過lxc-device把其接入中。
$ sudo lxc-device -n CONTAINER_NAME [-P path] add /dev/ttyUSB1
這樣這個裝置就會被加入LXC中了。

Saturday, February 3, 2018

使用SW4STM32建置STM32 HAL專案

使用SW4STM32建置STM32 HAL專案

上學期修課時需要的一些小技巧紀錄一下。有人蠻多人問過我,所以打一篇文章。

步驟

其實滿簡單的,只要在建立新專案時多勾選一個選項即可。
當選擇完板子時不要急著案完成,繼續按下一步。
下一步後,勾選Hardware Abstraction Layer(HAL),即可導入ST官方提供之HAL library。其他還有一些第三方library如FreeRTOS等,也可在這裡新增。

結果

SW4STM32會建立如下專案:
其中HAL會獨立在HAL_Driver下。有幾個檔案要特別注意。

src/stm32l4xx_it.c和inc/stm32l4xx_it.h這兩個檔案為放置Interrupt handler用的檔案,如有新增的Interrupt handler最好是放在這裡。

src/system_stm32l4xx.c:這個檔案放置系統開機時的初始化(clock和RCC)。

src/syscalls.c:這個檔案放置syscall,如果需要將printf的輸出導到UART,就需要在這個檔案動手腳。如下重新定義_io_putchar(int ch)


其他

若要將其他的STM32CubeMX產生出的檔案放入SW4STM32產生之HAL專案,編譯時可能會遇到一些問題。如:void HAL_MspInit(void) redefination。原因是HAL_Driver/Src/stm32l4xx_hal_msp_template.c這個檔案會有衝突,處理方法即是刪除此檔。

Chasing Pianos: The Piano Music Of Michael Nyman / Valentina Lisitsa Soundtrack Collection

Chasing Pianos: The Piano Music Of Michael Nyman / Valentina Lisitsa

一、資訊


電影:鋼琴與他的情人(The Piano)、《奇異果夢遊仙境》(Wonderland)、《繪圖師的合約》(The Draughtsman’s Contract)、《千鈞一髮》(Gattaca)、《一加二的故事》(A Zed & Two Noughts)、安妮日記(The Diary of Anne Frank) 、Drowning by Numbers 、Carrington、The End of The Affair 、Man With a Movie Camera、The Claim 
配樂作家: Michael Nyman
演奏:Valentina Lisitsa
發行:Decca
Chasing Pianos: The Piano Music Of Michael Nyman / Valentina Lisitsa


二、心得感想

我第一次聽到Michael Nyman這位編曲家是在千鈞一髮(Gattaca)這部我非常喜歡的電影(看看這個部落格的名字就知道了),當時我不是很懂何謂極簡主義音樂,到了近年聽了許多極簡主義的音樂,例如:Philip Glass、Max Richter(後極簡)。等人的作品才開始了解極簡主意的魅力,透過同樣緩慢推移的模式將情緒注入其中。當然同樣的模式一直出現有時也被其他人批評。不過我覺得這類音樂有打動到我,在電影中讓情緒昇華這樣就夠了。

Michael Nyman最有名的配樂作品當屬<鋼琴師與她的情人>(The piano)這部電影了。而這張CD將這部電影中最精華的幾段配樂提取出來。至於其他電影我到是都沒聽過。

三、曲目


  1. The Heart Asks Pleasure First (Copyright 1993, published in Michael Nyman The Piano Collection) From The Piano 04:21
  2. Big My Secret (Copyright 1993, published in Michael Nyman The Piano Collection)From The Piano 02:58
  3. Candlefire From The Diary of Anne Frank 02:29
  4. If (Published 2005 in Michael Nyman The Piano Collection) From The Diary of Anne Frank 03:34
  5. Sheep ‘n’ Tides From Drowning by Numbers 02:32
  6. Goodbye Moortie From The Diary of Anne Frank 01:53
  7. ly Drive From Carrington 00:51
  8. Diary of Love From The End of The Affair 02:44
  9. Time Lapse From A Zed & Two Noughts 04:54
  10. Odessa Beach From Man With a Movie Camera 03:32
  11. The School Room From The Diary of Anne Frank 02:12
  12. Why?From The Diary of Anne Frank 03:59
  13. Chasing Sheep is best left to Shepherds From The Draughtman’s Contract 03:17
  14. Deep Sleep Playing From The Piano 02:19
  15. The Exchange From The Claim 02:51
  16. Here to There From The Piano 01:21
  17. Jack From Wonderland 02:20
  18. Bill From Wonderland 02:39
  19. The Departure From Gattaca 02:49
  20. Lost and Found From The Piano 03:08
  21. All Imperfect Things From The Piano 03:06
  22. The Attraction of The Pedalling Ankle From The Piano 07:42
  23. The Mood That Passes Through You From The Piano 02:36
  24. The Embrace From The Piano 02:31
  25. Silver-Fingered Fling From The Piano 05:15

精選文章

使用Ardunio Atmega2560 連接 nRF24L01+

使用Ardunio Atmega2560 連接 nRF24L01+ 關於library 目前主流有 https://github.com/maniacbug/RF24 與 https://github.com/TMRh20/RF24 這兩個。 其中TMRh20大大做...