2017年4月19日 星期三

YouCompleteMe 和 vim 內建 Omnicomplete 結合

裝了 YCM 後知道寫 C# 跟 C++ 會自動完成很好用, 最近再找 html/css 自動完成才發現 YCM 可以跟 vim 內建的 html/css Omnicomplete 結合, 不用再裝其他 plugin 就可以做到 html/css 自動完成, 只要在 vimrc 裡面加上下面 config 就好

let g:ycm_semantic_triggers = {
   \   'scss,sass,css': [ 're!^\s{4}', 're!:\s+' ],
   \   'html': ['<', '"', '</', ' '],
   \ }

這邊還有人貼出更多的 language support

2017年4月15日 星期六

RS232 接頭

RS232是序列通訊傳輸用的接頭, 有分 DB9 跟 DB25 兩種, 現在大部分的儀器通訊介面應該都會走 usb 比較多, 但是一些比較老的設備還是會用 RS232, 不過目前見過的都是用 DB9, 還沒見過用 DB25 的

DB9 pin 腳定義
https://www.lammertbies.nl/picture/db9_pin_name.png

實體長相
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR4unL2OnzP_P03VMBaXwOLOrX8-HaI44UV-Mdy_kvR2dcTkwyo

DB25 pin 角定義
https://www.lammertbies.nl/picture/db25_pin_name.png


實體長相
data:image/jpeg;base64,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


grep 出現 Binary file (standard input) matches

在用 grep 時出現 Binary file (standard input) matches 這個錯誤, 看起來像是從 standard input 讀到 binary file 所以不能做 grep, 但我很確定我是餵文字檔給它吃

後來發現加 -a 參數就可以掃 binary file, 用了之後發現是中文, grep 看不懂中文就會以為掃到 binary file

2017年4月12日 星期三

SCPI language 小寫字元可以省略

這裡有說明 SCPI 指令小寫字元可以省略, 難怪他的指令有時候大小寫混合在一起看起來有點怪,

C# 確保 event handler 只註冊一次

有時候不確定 event handler 是否已註冊到某個 event 中, 這時可以先 remove 一次再 register, 因為即使 event handler 沒有註冊過也是可以安全的 remove 的

obj.MyEvent -= MyEventHandler

obj.MyEvent += MyEventHandler

恩, 是個很實用的方法

2017年4月10日 星期一

C# virtual com port 無法接收資料

最近在 C# 中用 SerialPort 這個 class 來打開一個 virtual COM port, 並跟一個裝置溝通, 但怎麼樣都無法從裝置中收到資料, 後來發現要設定了 RtsEnable 這個屬性為 true, 才能收到資料

估狗了一下, 在這裡有寫到 virtual COM port 這個屬性要設為 true 才會觸發接收資料的流程, 在 stackoverflow 也有人寫到應該設定 HandShake 為 RequestToSend, 讓 driver 幫你設定適合的 RtsEnable 值, 測了一下只設定 HandShake 的確也是可以收到資料

猜測比較有可能的原因是 virtual COM port 會需要這些設定, 因為網路上也有一些用 real COM port 的例子是不需要設定 RtsEnable 的屬性就可以接收資料

2017年4月7日 星期五

用 python 剪輯影片

markdown 想要從影片檔中剪一段出來, 用 python 就可以輕鬆辦到, 不過要先下載 moviepy 套件, 只需要幾行 code 就可以將你想要的片段剪出來
from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip
ffmpeg_extract_subclip("video1.mp4", t1, t2, targetname="test.mp4")
moviepy 套件其實背後是使用 ffmpeg 這個強大的工具, 如果你沒有的話, moviepy 也提供了 API 去下載它, 下載後會存到 C:\Users\[user_name]\AppData\Local\imageio\ffmpeg\ 目錄下 ffmpeg 的功能非常多, 若是不想用 python, 直接用這個工具, 也可以做到編輯影片的功能

2017年4月4日 星期二

C# 的 event, delegate, System.Delegate 解析

C# 寫了一段時間, 但幾乎只用過 delegate, 對 event, delegate 之間的關係一直很模糊, 甚至 System.Delegate 類別也不知道是做甚麼用的, 故先在這裡記錄一下

delegate

public delegate void MyDelegate();
MyDelegate d = () => { };
d(); 

上面這段 code 宣告了一個名為 MyDelegate 的型別, 所以可以用 MyDelegate 來 create 變數 d, 並且可以用 () 運算子直接呼叫, 概念上跟 C/C++ 的函式指標很類似


event

public delegate void EventHandler(object sender, My_EventArgs args);
public event EventHandler Click;

event 是用來修飾 delegate 欄位的修飾詞, 被 event 修飾過的 delegate 欄位, 本質上還是 delegate, 但實際上 compiler 會幫你把這個欄位加料, 變成類似屬性的用法, 讓 User 使用這個欄位時多了一些限制, 例如 event 欄位不能用 = 賦值, 只能用 +=, -= 去註冊或註銷你要掛上去的 event handler


System.Delegate


所有的 delegate 類別都會繼承這個類別, 它定義了一些 delegate 都會用到的功能, 例如 Combine 和 Remove, 但我們不該, 也應該沒有機會直接使用他, 通常是 compiler 會用到