2016年9月13日 星期二

YouCompleteMe in MSYS2 on Windows

Table of Content

To use YouCompleteMe in an MSYS shell, you will need to:
  1. Install MSYS2
  2. Install CMake
  3. build libclang
  4. Install YCM (and vundle, of course)
  5. Bulid YCM

Install MSYS2

reference https://www.youtube.com/watch?v=pb6Yb819pF0
  1. Download MSYS2 64bit version is better
  2. Execute the installer binary, install MSYS2 to  C:\msys64 
  3. Run a MSYS2 shell, execute  update-core 
  4. Close the MSYS2 shell window
  5. Run a MINGW64 shell
  6. Execute  pacman -Su 
  7. Close the MINGW64 shell window
  8. Run a MINGW64 shell
  9. Execute  pacman -Su  AGAIN
  10. Execute  pacman --needed -S git mingw-w64-x86_64-gcc base-devel  install compiler tool chain
Check following:
  1. vim  :echo has('python')  it should be 1
  2.  gcc -v 
  3.  make -v 
  4.  cmake  should NOT installed, if installed, REMOVE it. Because we don't want MINGW's cmake, but Windows'. Only Windows version can generate "MSYS Makefiles" format, which is what we need.

Install CMake

  1. Download from here, download the Windows 64 bit version
  2. Install to  C:\CMake 

Build libclang

reference
http://clang.llvm.org/get_started.html
https://github.com/rust-lang/rust/issues/34489

  1. Get LLVM and Clang source. We don't clone the whole repo, just download the tar file. It's much faster.
    1.  wget http://llvm.org/releases/3.9.0/llvm-3.9.0.src.tar.xz -O llvm.tar.xz 
    2.  wget http://llvm.org/releases/3.9.0/cfe-3.9.0.src.tar.xz -O clang.tar.xz 
    3.  tar xvfJ llvm.tar.xz 
    4.  tar xvfj clang.tar.xz 
    5.  mv clang llvm/tools 
  2. Use CMake to generate make file.
    1. Before run cmake, you need to apply some modification:
      1. Use Windows version python, not MSYS's python, to generate correct source path.  vi llvm/CMakeLists.txt  replace  COMMAND ${PYTHON_EXECUTABLE} ${LLVMBUILDTOOL}  with  COMMAND C:/Python27/python.exe ${LLVMBUILDTOOL} 
      2. Add CXX flag  --Wa,-mbig-obj  otherwise the output .obj file will be too large.
      3. Add LINK flag  -L/usr/lib 
    2. Generate the make file.
      1.  mkdir build-llvm 
      2.  cd build-llvm 
      3.  /c/CMake/bin/cmake.exe -G "MSYS Makefiles" ../llvm 
    3. Make it
      1.  make 
    4. FAIL. Build fail at last step link the result file liblibclang.dll, the error message is ld.exe: cannot find -ldl but I did not pass -ldl to the linker, and I don't know how to remove it. according to http://discourse.chaiscript.com/t/basic-question-about-compiling-chaiscript-with-mingw-g/170 "dl is only needed in unix". so why my toolchain try to link it? after more search, maybe add a -L/usr/lib can fix that problem. That is weird the toolchain didn't add it at default.

To Be Continue




2016年4月20日 星期三

Universal Windows Platform XAML 自訂 Button Style

最近在寫 Windows 程式,我想要在 XAML 裡面設定 Button 滑鼠移上去,也就是 hover 的時候的顏色。CSS 當然簡單啦,直接可以設定 hover 的樣式。但 XAML 就花了我一點功夫才弄懂。

首先 XAML 也是有 Style 的。就叫做 Style(對我專講廢話)。XAML 所預設提供的每一個 Control 都已經有配上 Style。所以如果要改變 hover 的顏色,需要 override 掉他預設的 Style。以下介紹怎麼 override 掉一個 Button 預設的 Style。

首先,先來看看一顆 Button 平常的樣子(左邊),跟滑鼠移上去的樣子(右邊),右邊有個深灰色的框框。


假設我不喜歡那個框框,我希望背景變色,然後字也變色,那我們就要去修這個 Button 的 Style。

開始,首先,每個 Control 都有所謂的 template,Style 是決定在這個 template 裡面。所以我們其實要編輯的是這個 Button 的 template。現在,讓我們在 Visual Studio 裡面,拉出一個 Button 放到 design 視窗裡面。


接著在 Button 上按滑鼠右鍵,選「編輯範本」→「編輯副本」


範本就是 template,那編輯副本(edit copy...)是什麼意思呢?因為其實 Button 本身已經有一個預設的 template,那一個預設的 template 是我們動不了的,所以我們要從那個 template copy 一份出來編輯。你可以看到「編輯目前項目」這個選項是 disabled 的,表示我們無法直接編輯這個 Button 目前所套用的那個 template。「建立空白」則是說我們想要從頭建立一個 template,但我們不想,太麻煩了,我們想要從現有的這個改。


現在你有幾個選項可以選,上面那個「全部套用」我不知道是啥意思,我很無知。但我知道取個名字是什麼意思 XD 我來取個鳥名字叫做「ChangeColorButtonStyle」。下面那個選項「定義於」比較簡單,因為 template 也是用 XAML 描述的,所以他其實就是問你要把這個範本存在哪邊。


  1. 應用程式(App)的話,就是整個 App 到處都可以使用到這個 template,應該是會放在 App.xaml 裡面
  2. 此文件,那就是存在你目前編輯的這個 XAML 檔裡面,你還可以選擇你要放在哪裡,是要放在整個 Page 裡面,還是你只想要放在這個 Button 裡面。如果你放在這個 Page 裡面,那只要在這一頁裡面,其他的 Button 也都可以使用這個 Style。如果放在 Button 裡面,就只有這個 Button 可以使用了,假設你有好幾種 Style 想要讓這個 Button 自己切換,且別人都用不到這些 Style,就可以使用這個選項。
  3. 資源字典(Resource Dictionary)是 XAML 裡面用來管理 Resource 集合的容器,因為我目前沒有自訂任何 Resource Dictionary,所以他也不讓我選,算了,哼哼。


以這個範例來說,因為我只有一個 Page,我就放在 Page 吧。按下「確定」


可以看到我的 XAML 檔從本來的


變成


太 awesome 了。看不懂,沒關係,不重要,重點就是上面那一整駝,就是他生出來的用來描述 Style 的 XAML。然後他也幫你把 Button 指定的 Style。看到沒有,名字一樣。


所以接下來,我們只要編輯上面那個 XAML 就可以了……昏倒……那真不是人幹的,所以我要用「Blend」,今日最重要關鍵字,沒有之一。

Blend 是微軟用來 design XAML 的 GUI 工具,長的有點像 Visual Studio,但是專注在 design UI 上。現在請到「方案總管(Solution Manager)」在你那個 XAML 上,按滑鼠右鍵,選「Edit in Blend」


等一段時間,如果你從來沒有執行過 Blend,他第一啟動會有點久 = =|| 耶~終於好了!

他會跳一個你看不懂的視窗。一個好的程式設計師的習慣,就是一定要搞懂每一個細節,不能放任東西不懂就這樣過去了,所以我們按下「不要再提示我」跟「確定」,叫他閉嘴。


搭拉~傳說中的 Blend


在 Button 上按下右鍵,現在我們要來編輯這個 Button 的 Style。因為我們剛剛已經有幫他建立 Style 了,所以這次「編輯目前項目」是可以選的,選他,因為我們要編輯我們剛剛給名字的那個 ChangeColorButtonStyle。

好,講古時間到。在 XAML Style 裡面,有一種東西叫做 VisualState。什麼是 Visual State 呢?就是「看起來什麼樣」比方說 Button 在「平常」是一個 VisualState,在「滑鼠滑上去」的時候是另外一個 VisualState,在「按下去」的時候是另外一個 VisualState,在「Disable」的時候又是另外一個 VisualState。所以 Button 總共有四種 VisualState:

  1. Normal 正常
  2. Pressed 起蕊
  3. Disabled 失常
  4. PointerOver 指標在上


Blend 讓你可以分別輕鬆的設計這四種 VisualState 長什麼樣子。

那我們要怎麼編輯這些 VisualState 呢?來,看到畫面左上方


那個 State 給他點下去,我們就可以看到,Button 有四個 VisualState。
我們隨便看兩個,請點一下 Normal,可以看到 Button Normal 的樣子


嗯,很 normal,現在點下 PointerOver 來看看很什麼樣子


嗯,很 over。

我現在想要把這個 Border 拿掉,點一下那顆 Button,畫面右邊會顯示這個 Button 的屬性,但是你會發現他 BorderThinkness 的地方,被黃色的框框框起來,不給你改!ㄟ!其實是因為這些屬性已經被之前我們 copy 的那個 Style 設定過了,所以如果我們要再設定他的話,要先 reset 他


然後就可以改變那些值了,我要把他改成 0 = =||
你現在可以按下 F5 執行看看,滑鼠移上去,邊已經不會顯示了。

但是現在這樣也不太能看的出來有沒有 hover,所以我還要改背景顏色。好像不用我多說這個改,太簡單了,請自己動手。那我就選個霞光虹好了


按下 F5 執行,成功啦!

其實他還可以設計「VisualState 間切換的動畫」,不過我懶的寫了,自己上 youtube 找 XAML Blend Animate 就這樣。掰。

2015年11月30日 星期一

Universal Windows Platform debug output

= =|| 宇宙崩潰,找一個 debug output 方法找超久!!

踹盡網路上各種方法!

什麼  System::Diagnostics::Debug::WriteLine  鬼的根本編譯不會過!

最後才知道根本應該  ::OutputDebugString(L"abc");  才對!

Universal Windows Platform 當關鍵字找到都是錯的 = =||

請用 WinRT 當關鍵字。

然後,project 設定,debugging 那一頁,記得設定成 native

2015年5月4日 星期一

Mycestro 使用心得

先看影片,看看 Mycestro 是什麼東西


就是個像 Wii 的手把一樣,利用加速度計來當作輸入的裝置。
因為越來越懶了,不廢話,直接列優缺點:

優點:


  • 手不用在鍵盤跟滑鼠中間來來去去,對像我這樣的 vim 的使用者很方便,手不用離開鍵盤。
  • 沒了。

缺點:


  • 貴,一隻要價 149 美金,相當於 4500 台幣,還不算運費。運費 30 美金,總價 5400 台幣。
  • 連續使用的話,大概七八個小時以後沒電。其實也蠻久了,畢竟人平常也不太可能連續使用七八個小時,加上他充電也很快。而且沒電的時候就剛好站起來走一走 XD 這樣好像不算缺點
  • 需要一個特製的 BlueTooth dongle,不見,就沒了,就不能用了,要的話,不好意思,再買一隻,19 美金,運費 30 美金,總價 1500 台幣。神奇的來了!MacBook Air 不知道為什麼不需要這個特製的 dongle 就可以直接使用!不理解為什麼 Windows 使用者就得多花錢買一個特製 dongle,寫信給他們,來來回回好幾封,跟我轉圈圈,沒回答。
  • 適應期長,大概要一個禮拜以後才會熟練,可以取代一般的滑鼠。
  • 戴久了手指有點悶悶的
  • Linux 上面沒有 driver,無法控制他的靈敏度,但出廠的預設值調的非常小,用起來要人命。問官方,官方回答「也有人在 Linux 上面沒有 driver 也用的很好」我管別人用的好不好,我要 driver 阿 = =||

Q & A:


  • 可以取代滑鼠嗎?可以,但需要一段時間適應
  • 貴嗎?貴
  • 好用嗎?好用
  • 重嗎?一點點,還好,不會影響打字
  • 推薦買嗎?很難說,他很貴,你很有錢的話就 OK,不然不推

2015年4月20日 星期一

撿到四隻小貓

第一天晚上

大概十二點多回到家,聽到防火巷裡面傳來「哇哇嗚嗚」的聲音,我在想「老鼠又在打架了」不過現在的老鼠還真大膽了,叫這麼大聲,都不怕給貓抓到。

第二天早上

十點,經過防火巷外面,聽到跟昨天晚上一樣的聲音。耶,這就奇怪了,老鼠不可能叫一整個晚上。於是我就探過去看,跟著聲音找,赫然發現地上有一個小東西在動,幹,什麼東西?老鼠?貓!是貓!超小的貓!乳牛貓!連眼睛都還沒有睜開耶,腳被樹根給纏住了,卡住了,走不開,好可憐喔。嘗試想要幫他解開,發現纏得很緊,怪不得他會哭。只好拿出隨身的小剪刀,幫他把那個樹根剪斷。ㄟ?跟樹根纏在一起的這是什麼……胎盤?他的臍帶跟地上的樹根纏在一起了,怪不得他走不開,而且乾掉的臍帶跟樹根也太像了吧……拿在手上,好小喔,真的好小喔……但竟然也是一個生命 @@ 覺得好神奇……

聽到旁邊還有聲音,看了一下,發現旁邊約五十公分處的花圃裡面,是另外一隻小貓,同樣也是被自己的臍帶卡住,巨大的胎盤被卡住,爬不動,也是在哭,也幫他把臍帶剪了。感覺母貓應該是想要把小貓生在這個花圃裡,但不知道為什麼有一隻生在外面。看了一下花圃,非常的深,小貓不可能自己爬出來。怎麼會一隻生在裡面一隻生在外面?

我知道遇到小貓不能隨便撿,因為貓媽媽照顧小貓會比人類照顧好很多。但這小貓這樣在外面實在太危險了,我幫他兩隻放在一起,都在花圃裡面,這樣比較不會跑出來,到時候跑不見就完蛋了……

放好以後就要離開了……走出防火巷的時候,看到第上有一隻死老鼠,靠!嚇死我了,差一點就踩到!怎麼會有一隻死老鼠在這邊!死了!仔細看仔細看,發現不是老鼠……是貓!又是一隻貓!跟剛剛的一樣大,應該是同一胎,怎麼會在這麼遠的地方?隔好幾公尺耶!貓媽媽在幹麻 @@ 三隻小貓生三個地方,而且都沒有顧,太奇怪了!阿!動了!沒死,叫了 @@ 還好有看到,不然真的會踩到,沒死也沒我踩死。一樣幫他撿起來,放到那個花圃裡面。希望他媽媽回來會好好照顧。

想了想,回到房間,把阿喵在家裡面的貓飼料通通倒到紙碗裡面,放到花圃的旁邊,這樣貓媽媽就不用因為覓食離開小貓很遠了。通常貓媽媽都會一直顧在小貓旁邊,這次可能是因為為了找東西吃,所以跑到很遠的地方。再確定一次三隻小貓都很正常,就去上班了。

第二天中午

中午的時候,跑去問了在公司旁邊,常去的動物醫院的醫生,說遇到了三隻臍帶連胎盤的小貓。醫生說通常貓媽媽都會在小貓身邊不會離開,如果遇到這種,就是不正常。如果確定貓媽媽不在的話,最好還是送醫院。我問醫生,如果媽媽不在旁邊,一天這樣會活嗎?醫生說如果沒有媽媽在,一天大概就死了,小貓最怕失溫,現在我們人類覺得很熱,但對小貓來說,晚上的溫度還是致命的。我想了想,小貓昨天晚上十二點可能就沒人顧了,到現在白天還好還蠻熱了,但再一個晚上,恐怕真的無法……

第二天下午

下午四點半的時候,實在是擔心阿,請了假就趕快回家,我怕等到六點下班天就涼了。回到家趕快跑去看小貓,發現飼料有被吃過的痕跡,不知道是別的貓吃的,還是貓媽媽吃的,但總之周圍沒有貓媽媽的跡象,這個時候三隻小貓正擠在一起取暖睡覺,樣子好可愛 ^^ 眼睛都沒打開,卻這麼可愛的很安祥的睡。可能是聽到我來了,就醒了,又開始嗚嗚阿阿的哭,也許是餓吧……

彎著腰,看著他們嗚嗚的時候,右邊傳來「哇哇」疑?聽錯了嗎?怎麼會有一聲是從旁邊傳來的?應該是聽錯了,繼續看著眼前的三隻小貓哇哇叫,真的好可愛阿…「哇哇」不對,沒有聽錯,真的是右邊有傳來哇哇聲!沿著聲音過去,又沒聲音了。沿著地上慢慢走,但是沒在地上看到任何東西阿…防火巷裡面因為很陰濕,所以地上某些地方有著厚厚的苔蘚跟泥,就在腳快要踩到的時候,突然有塊苔蘚動了一下 @@ 看到了,是一隻…乳牛貓…第四隻小貓…跟苔蘚混在一起了,胎盤也還在,臍帶跟胎盤,還有貓本身,都跟半乾的苔蘚乾在一起了。天哪,到底在這邊多久了?為什麼媽媽都有回來吃飯了,卻把自己的小孩丟在苔蘚泥巴裡面不管阿…距離早上我把飯放下去都已經好幾個小時了,明明就有回來吃飯,不可能連一隻貓都叼不回吧…可是還是不敢亂撿貓,媽媽照顧一定會比我好多了!把第四隻小貓也撿起來,放到花圃裡。跟他的兄弟姊妹一起取暖,四隻在一起好像很開心 ^^ 還是要再講一次,好可愛阿…而且感覺也很有活力,沒有問題!回公司上班去!

第二天晚上

九點多,下班,回家。第一件事就是衝去防火巷裡面,飼料又少了!有貓吃飼料。小貓還在花圃裡,果然憑他們自己的體型絕對爬不出這麼高的花圃。但媽媽到底去哪了,會不會我進來之前她還在,看到我來才跑掉?摸了摸小貓周圍的地面,冷的。貓媽媽沒有幫他們取暖,小貓的溫度感覺也比下午的時候更冷了一點。我判定媽媽棄養了。打了電話給獸醫,醫生說開到十點,我馬上帶著小貓衝去找獸醫了!途中先去路上買了醫生推薦的 BMR 貓奶粉。

在九點五十分的時候趕到了獸醫院,醫生幫忙看了一下,把第四隻小貓的胎盤跟臍帶剪掉,教我之後要怎麼餵奶粉,教我要怎麼促使小貓排泄。醫生用溼棉花輕輕拍著小貓的下腹部,地一隻小貓完全沒反應。醫生說可能是因為完全沒有進食,所以沒東西可以排泄,然後拍拍第二隻,竟然尿了一滴,但是是血尿…醫生說不確定是因為憋太久還是因為健康已經有問題。醫生把小指放到小貓嘴前,小貓有吸吸的動作,醫生說這樣就會吃奶,就還有機會。叫我要注意保暖的問題,這個天氣對人類可能覺得很熱,但對小貓來說,還是很致命的溫度,小貓很容易就失溫。我問醫生要怎麼保暖,醫生拿了一個電毯給我「我先借你一個,你真的有需要再買…」醫生人超好,哈哈哈,醫生想要找奶瓶給我,但是他的奶瓶已經丟掉了。但已經超過十點了,大部分的寵物店都關門了。醫生跟我說公館的金吉利還開著,我去金吉利買了奶瓶,回到辦公室,想要把小貓養在辦公室,這樣上班時間才有辦法照顧。

回到辦公室,發現 nan 還有 ryan 還在呢!跟 ryan 兩個人用阿喵的外出籠鋪了小貓的床,底下是電毯。然後跟 nan 兩個人開始手忙腳亂的泡奶粉,餵小貓。我嘗試餵,但好像不太成功 Q_Q 後來都是給 nan 餵的,可能 nan 是女生,比較會帶小孩吧,小貓真的有吃喔,喉嚨有做出吞嚥的動作。雖然只吃了一點點,四隻貓好像才吃了幾 cc 吧。然後把小貓放進暖暖的床,四隻就奎在一起睡了,好可愛喔,剛剛還是這麼餓的樣子一直叫的樣子,現在卻是吃飽飽了,然後睡在暖暖的床舖裡面。四隻堆在一起,腹部起伏起伏的,好像很舒服的樣子,摸了一下身體,溫度好像比較好了。就這樣睡了。

十二點多了,我回家,順路把 nan 也送回去。回家洗澡,想說洗完以後再跑來。這樣半夜如果貓貓肚子餓了,叫了,我就可以馬上餵他們吃飯。騎車回去的路上,我一直在想,怪不得有些貓中途,送養貓咪的時候,會對飼主的身份要求這麼多,如果是我這樣捧在手上帶大的,我一定也會希望小貓遇到的主人要對他很好,那是我捧在手心上的寶貝捏!怎麼可以讓人欺負!雖然沒當過父母,不過那瞬間好像可以體會一點點當父母的感覺,好像可以理解,為什麼以前遇過的一個很嚴厲的教授,在當了媽媽以後,整個眼神都改變了,那個當下我覺得我也有改變喔。真的。

回到家起完澡。東摸摸西摸摸,結果 muting 打電話來了,說他到了辦公室,叫我也趕快去吧,他說聽到小貓一直叫,我說應該是因為小貓餓了。我收收東西就出發了,大概快三點的時候到了辦公室。打開小貓的籠子,看他們睡的好靜喔…

太靜了…怎麼沒動…沒有起伏…

血、跟糞便。貓吐血了,也拉肚子。兩隻已經不會動了。還有兩隻,正在很痛苦的呼吸著。為什麼?才不過兩個多小時。怎麼會?剛剛還是吃很飽的,在那邊呼呼大睡,為什麼,我做錯了什麼事情嗎?哪邊出錯了?不懂。

小貓很痛苦,大口的喘著氣,我跟 muting 一人捧著一隻,小貓大口大口的,一口一口的喘氣,呼吸的間隔,越來越長。一開始是一秒一次,幾分鐘以後,變成幾秒一次,幾分鐘以後,變成十秒一次,幾分鐘以後,變成一分鐘一次,然後五分鐘,然後十分鐘。我就捧著他們,等著他們下一次的呼吸。一直等,不知道等了多久,我就接受了,沒有下一次的呼吸了……

實在無法讓 nan 知道小貓死的這麼慘,nan 知道的話一定會哭死的。趁著天亮之前,把小貓的屍體處理掉,奶粉跟奶瓶藏到包包裡。跟 nan 說小貓被當作中途的朋友領走了……

第三天中午

拿著電毯,還有奶粉、奶瓶,去醫生那邊,走進醫院「醫生,這個還你」「用不到了?」「嗯…」「四隻都?」「嗯…」「盡人事了,本來就很難,不要難過,有救有機會」「嗯…」把奶瓶跟奶粉都給了醫生「醫生,這我用不到了,可以給你嗎?」「可以」「如果有人抱著小貓來,那就是有緣,這可以給他們」「嗯…如果有有緣人的話…」

想了想,當初醫生說「我先借你一個,你真的有需要再買…」當時我還聽不懂,為什麼會不需要?當然需要阿,原來是這樣…醫生一定早就知道了吧…

2014年9月7日 星期日

Effective Modern C++ 筆記:Type Deduction 規則

一邊讀《Effective Modern C++》一邊作筆記 = =||
太複雜了,一定會忘記

C++ 總共有三種 Type Deduction

I. template argument deduction


template < typename >
void f(ParamType param);
f(expr); // 從 expr 推導 T 跟 Param

template argument deduction 有三種 case

1. ParamType 是 pointer 或 ref,但不是 universal ref

  • 如果 expr 是 ref,把 ref 拿掉
  • pattern-match,導出  ParamType

2. ParamType 是 universal ref(就是有 && 的形式)

  • 如果 expr 是 lvalue,那 T  ParamType 都導成 lvalue ref
  • 如果 expr 是 rvalue,那就跟平常一樣(平常一樣是啥?)

3. ParamType 不是 pointer 也不是 ref

  • 如果 expr 是 ref,把 ref 拿掉
  • ref 拿掉之後,如果 expr 是 const/volatile,也拿掉
另外,array 跟 function 會退化成 pointer


II.  auto  deduction

跟 template argument deduction 幾乎一樣,除了初始化的時候對待  {...}  不一樣, auto  會把  {...}  推導成  std::initializer_list ,但 template argument 無法推導  {...} 

auto a = {1, 2, 3};  // a 是 std::initializer_list
f({1, 2, 3});        // 編譯失敗,無法推導 T

III.  decltype  deduction

什麼就是什麼

const int a = 7; // decltype(a) 就是 const int
const int& b = a; // decltype(b) 就是 const int&

 decltype  最常用來作的,就是用來傳遞「原原本本的型態」,比方說你有一個 wrapper function,需要 perfect forward,然後 return value 的型別也要一五一十的反應出來,那你的好朋友就是  decltype

template < typename F, typename ... Args >
auto func_timer(F&& f, Args&& ... args)
-> decltype(f(std::forward(args)...))
{
    auto begin = time();
    decltype(f(std::forward(args)...)) result = f(std::forward(args)...);
    std::cout << time() - begin << std::endl;
    return result;
}

func_timer(foo, 1, 2, 3);

因為  foo  的 return value 有可能是 reference,人家有可能寫

func_timer(foo, 1, 2, 3) = bar;

所以連 referenceness 也要保留,所以要用  decltype 。但那一大長串實在太麻煩,所以 C++14 提供  decltype(auto) ,讓你可以簡單

template < typename F, typename ... Args >
decltype(auto) func_timer(F&& f, Args&& ... args) {
    auto begin = time();
    decltype(auto) result = f(std::forward(args)...);
    std::cout << time() - begin << std::endl;
    return result;
}

喔,使用  decltype(auto)  的時候還有一個特例要記住。 decltype(auto)  有兩條規則:
1. 如果遇到單單一個 name 的 lvalue expression, decltype(auto)  就是那個 name 的型別
2. 如果不是單單一個 name 的 lvalue expression, decltype(auto)  帶有 ref

decltype(auto) f1() {
    int x = 0;
    return x;     // decltype(auto) 是 int,所以 f() 也是 int
}

decltype(auto) f1() {
    int x = 0;
    return (x);   // decltype(auto) 是 int&,所以 f() 也是 int&
}

2014/09/09 更新


因為有讀書有學到新東西,又感覺已經很久沒寫一些比較深的 C++ 了,所以中秋節剛好來自幹一個 variant (github repo)

2014年8月26日 星期二

我是「媽寶級白目」

突然發現自己不知道從什麼時候開始,
已經變成所謂一直發政治文的「政治魔人」了……

還記得以前覺得政治很無聊、很髒、不該碰……
覺得會去看政論節目的人腦袋都有問題……

從學校畢業以後進入業界,
然後發現這個業界有著很病態的超時工作文化,
雖然我自己沒遭到壓榨,但我開始注意勞工權益,
參加了電子電機資訊工會,然後開始慢慢了解「爭取」是什麼。

然後第一次去了抗議現場,
發現即使我們工會人不多,
但每次活動總有很多其他的社運團體會來支援我們。

然後第一次去了遊行活動,
然後才知道原來早就有很多人已經在街頭上努力了這麼久,
然後知道我們也應該在別的活動去支援別人。
然後知道在這個支援別人的過程,
我們也了解了別人所面臨的,別的社會議題。

然後慢慢知道了一些歷史課本不會寫的東西,
然後慢慢知道了一些新聞媒體不會報的東西,
然後真正體會了當初曾華璧老師在課堂上講的東西。
然後突然之間,那是一個相變的過程,很快速,
我的想法在很短的時間裡面蛻變的很快。
我想那也許就是「公民覺醒」。

我還記得以前有一次看到李敖在電視上說:

  一個真正民主的國家,投票率不會太高,
  如果投票率很高,代表政治對人民生活的影響非常大,
  『我支持的候選人沒上,我要去自殺!』這是不對的!
  民主社會的話,誰當選,對百姓的生活都不應該差太多,
  如果一個社會裡面『誰當選』差很多的話,
  那這個社會就不民主。

當時我的想法是:

  說的真好,那些對政治很投入的人真是白痴,
  台灣就是因為有你們這些人,才顯得台灣不民主。

現在想想當時真是愚蠢的不可思議。
不是因為他們的投入,才顯得台灣的不民主,
而是因為台灣不民主,害得他們不得不投入。

想到讀 Game Theory 講選舉的時候,裡面提到兩種模型,
一種是候選人可以選擇要提出什麼政見的模型,
一種是候選人無法選擇要提出什麼政見的模型。
第二種是因為政見不一定會履行,候選人完全可以胡說亂騙,
所以他的政見應該是他過去作了什麼,不是現在說了什麼。
而理智的公民是有記憶的,我們會記得你過去的為人處事,
所以實際上,候選人無須提出政見,
我們看你過去作了什麼,就知道你未來想幹麻。

兩種模型當然都跟現實有些距離,但還是很有啟發性,
特別是第二種,實質是遠比第一種好的多,
現實若偏向第一種,代表選民都是健忘的,
現實若偏向第二種,而候選人就無法欺瞞選民。
但要作到第二種的前提,是選民必須要長期的關注政治,
知道那些人到底在幹麻,而不是等到快要選舉的時候,
才看看選舉公報、甚至不看選舉公報就投票了。

如果是這種狀況,
那那些選民不過就是四年投一次票政治植物人罷了,
他們根本不會思考,也沒有記憶,
他們有民主的權利,卻沒有民主的能力。
他們胡亂的投票,結果卻是大家一起背負的。
讓所有人一起承擔選出惡劣候選人的責任。

這是不對的。

所以,如果你有投票權,
那麼,關注政治,就是你的社會責任。
因為你的那一票會影響別人,
放空亂投,是讓別人在背負你本來應該背負的責任。

請面對這個事實:「台灣,不是一個民主國家」,
選錯人,很嚴重,請關注政治,負起你的社會責任。

「太辛苦了,而且很沈重」你說

所以大家要看我的臉書。

每天都有又酸、又靠北、又北七的苦中作樂政治文,
把沈重跟嚴肅寄託在低能跟歡樂當中,
我發現我的文章越來越像國寶級白目了,
我真的有夠白目,不過我不到國寶等級,那就媽寶好了,
以後請大家叫我「媽寶級白目」。