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

Friday, October 6, 2017

Cloud Atlas Original Soundtrack

Cloud Atlas Original Soundtrack

一、資訊

電影:雲圖(Cloud Atlas)
配樂作家: Tom Tykwer、Johnny Klimek、Reinhold Heil
發行:Sony Music
CLOUD ATLAS ORIGINAL MOTION SOUNDTRACK

二、心得感想

這部電影其實我沒看過,我當初是因為偶然聽到了這部電影的配樂<Cloud Atlas Sextet>和<Prelude: The Atlas March>後跑去找了這部電影的原著小說來看。這部電影小說的敘事手法十分有趣。她其實六段故事以A-B-C-D-E-F-F-E-D-C-B-A的方式敘述的,而且每段故事時間相差很久,但是前段的故事會有部份連結到下一段,表現出"輪迴"的感覺。當然這種敘事方式拍成電影爆炸機率相當高的,而電影得票房也真的炸了。

如同敘事手法,配樂本身也是有A-B-C-D-E-F-F-E-D-C-B-A的曲目編排。有多首配樂的風格式成對的。不過其中最引人注目的仍是書中提到的<雲圖六重奏>,這首貫串整個故事的曲子。也就是<Prelude: The Atlas March>,之後包括<Cloud Atlas Opening Title>、<Cloud Atlas Finale>、<The Cloud Atlas Sextet for Orchestra>和<Cloud Atlas End Title>,我覺得光片尾幾首曲子的編排與交響編曲,這張專輯就很有收藏的價值了。當然片中的<Templa of Sacrifice>和<All Boundaries Are Conventions>也是我喜歡的曲子。不過剩下幾段的風格我不是很喜歡。

不過這張專輯聽的時候有發現一個問題,最後幾首有時會有不名聲響,我不確定是不是錄音失誤,還是刻意的。

三、曲目

  1. Prelude: The Atlas March
  2. Cloud Atlas Opening Title
  3. Travel to Edinburgh
  4. Luisa’s Birthmark
  5. Cavendish In Distress
  6. Papa Song
  7. Sloosha’s Hollow
  8. Sonmi-451 Meets Chang
  9. Won’t Let Go
  10. Kesselring
  11. The Escape
  12. Temple Of Sacrifice
  13. Catacombs
  14. Adieu
  15. New Direction
  16. All Boundaries Are Conventions
  17. The Message
  18. Chasing Luisa Rey
  19. Sonmi’s Discovery
  20. Death Is Only A Door
  21. Cloud Atlas Finale
  22. The Cloud Atlas Sextet for Orchestra
  23. Cloud Atlas End Title

Wednesday, October 4, 2017

The Imitation Game Original Soundtrack

The Imitation Game Original Soundtrack 

一、資訊

電影:模仿遊戲(The Imitation Game)
配樂作家:Alexandre Desplat
發行:Sony Music
THE IMITATION GAME

二、心得感想

這部電影我本身蠻喜歡的,因為我是資訊背景,這故事本身就有親切感(讀過資工系的或多或少聽過圖零機吧),雖然劇情魔改了Alan Turing的故事,但是改的還算流暢。唯一需要吐嘈的應該就是把發現德軍密碼會有固定內容,而這些內容可以用來剪枝(替除不可能發生的組合)部份改的太戲劇化了。

音樂部份為了呈現Alan Turing數學家的特質,讓音符很離散,很像一群數字在舞動。尤其在<Crosswords>、<Running>、<Decrypting>會有一種問題被拆解被處理的感覺。當然主題旋律<The Imitation Game>和<Alan Turing's Legacy>寫的很有味道。我當初在戲院看到這部電影時有被這兩首曲子觸動。<The Apple>、<Farewell To Christopher>是片中圖靈生命最悲情的時刻,這些悲傷讓我們對圖靈,還有對同性戀的迫害起了反思。

由於我仍是學生,財力不是十分充足,當初看完這部電影後一直去spotify反覆聽這片原聲帶,最後才決定買實體的,以更好的音質品味這張專輯。

三、曲目

  1. The Imitation Game
  2. Enigma
  3. Alan
  4. U-Boats
  5. Carrots And Peas
  6. Mission
  7. Crosswords
  8. Night Research
  9. Joan
  10. Alone With Numbers
  11. The Machine Christopher
  12. Running
  13. Christopher Is Dead
  14. Decrypting
  15. A Different Equation
  16. Becoming A Spy
  17. The Apple
  18. Farewell To Christopher
  19. End Of War
  20. Because Of You
  21. Alan Turing’s Legacy


精選文章

使用Ardunio Atmega2560 連接 nRF24L01+

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