發表文章

strace追蹤程式使用的system call

圖片
追蹤指令使用的system call strace cat /dev/null -t 追蹤輸出加入時間資訊, 時:分:秒 -tt 使用時:分:秒.微秒資訊, 例如11:22:33.123456 -ttt 使用timestamp微秒數值 -r 顯示相對時間 -T 顯示耗用時間 -o {Output file path} 輸出到檔案, 如果不使用-o 也可以用重導向stderr 2>{Output file path}  -c 統計呼叫的次數與錯誤 -x 以十六進位輸出含有不可印的字串 -xx 所有字串以十六進位輸出 -s {length} 輸出字串時最多印出的字數, 超過就會在後面加上...表示大於長度 -v 輸出所有的系統呼叫, 因為會太多資訊所以一般會使用-e指定要追蹤的類型 -f 追蹤fork -ff 追蹤fork, 如果有-o選項的話, fork的pid會輸出到{Output file path}.{pid} -F 追蹤vfork -u {username} 以特定使用者執行程式並追蹤 追蹤已啟動的process運作 strace -p {ProcessID} 追蹤特定的system call 像是可以用-eopen來追蹤loader載入的library strace -eopen -f ./test 或是追蹤gcc的運作 strace -eopen -f gcc test.c -o test -e 的語法是 -e [qualifier=][!]value1[,value2]... qualifier的選項有trace,abbrev,verbose,raw,signal,read,write,預設不寫是用trace, 所以上面的指令用-eopen等於是-e trace=open !表示不包含/排除 value的選項通常有open,close,rean,write,all,none, trace本身有額外的value可用, file,procee,Network,signal,ipc signal有其他的用法, 像是要排除signal SIGIO的部分, 可以寫-e signal=!SIGIO 實際使用...

Android Studio加上Java編譯參數

圖片
在Android Studio加上Java Compile option 有時會想知道javac編譯時跑出來的Warning訊息的細節,例如-Xlint:deprecation 其實只要像下圖在build.gradle編譯設定中加入 tasks.withType(JavaCompile) {   options.compileArgs << "-Xlint:deprecation" }

BASH分割檔案, 切除檔頭

分割檔案 使用split指令,可以用檔案大小來分割 split -b {檔案大小} {輸出的 分割 檔名} 例如:  split -b 100M bigfile split_file_prefix 或是用行數來分割 split -l {最大行數} {輸出的分割檔名} 如果有換行問題, 可以先用dos2unix處理再split 切除檔頭 可以使用dd來處理 dd的skip忽略的單位以bs為準的,也是dd一次的讀寫單位,太低的話效率很差,bs設太高效率也不好 下面這兩個輸出的結果是相同的,只是後者會更快完成。 dd if=orignal.file of=output_bs1.file skip=717824 bs=1 dd if= orignal.file  of=output_bs1024.file skip=701 bs=1024

tar, tar.gz, tar.bz打包與壓縮解壓縮

壓縮z compress {filename} #壓縮檔案 uncompress {zipped file} #解壓.z compress -d {zipped file} 壓縮bz2 bzip {file name} bzip -z {file name} bzip -d {zipped file} #解壓.bz2 bzcat {zipped file} # 顯示bz2檔案內容 壓縮gz gzip {filename} gzip -{number} {filename} #用number指定壓縮比, 大的表示壓縮率高 gzip -d {zipped file} #解壓gz gunzip {zipped file} zcat {zipped file} #顯示gz檔案內容 產生tar tar cvf {created tar file} {directory} tar zcvf {created tar,gz file} {directory} # tar並壓縮gz eg. tar zcvf filename.tar.gz /home/test/* #打包/home/test下的所有檔案 tar zcvf  {created tar,gz file} {directory} --exclude mnt --exclude proc #打包tar.gz不過要排除特定目錄 tar -N '2017/06/25' zcvf {created tar,gz file} {directory} #比 2017/06/25新的檔案才打包 tar zcvfP {created tar.gz file} {directory} # -P會以絕對路徑壓縮目錄, 解tar的時候要小心 tar zcvfp {created tar.gz file} {directory} # -p是保留檔案原始權限 tar ztvf {tar.gz file} #查看tar.gz內容 tar jtvf {tar.bz file} #查看tar.bz內容 tar xvf {tar file} #解tar tar zxvf {tar.gz file} #解tar.gz tar jxvf {tar.bz} #解...

ffmpeg加密串流檔案及即時播放解密

ffmpeg支援crypoto模組加解密 查詢是否有編入crypto模組 ffmpeg -protocols | grep crypto crypto模組文件 https://ffmpeg.org/ffmpeg-protocols.html#crypto crypto模組介面 http://www.ffmpeg.org/doxygen/3.1/crypto_8c.html 加密串流檔案 ffmpeg -i content.ts -c copy -f mpegts -key "527930d9bab56a1ed763991c159d41fa" -iv "a084a4e635e5b32830bdb901089ac0c3" crypto:crypted.mpegts -key 指定加密的AES key -iv 指定加密的Initialization Vector 產生key和iv可以用openssl openssl rand -hex 16 解密串流檔案 ffmpeg -i crypted.ts -c copy -f mpegts -key "527930d9bab56a1ed763991c159d41fa" -iv "a084a4e635e5b32830bdb901089ac0c3" crypto:decrypted.mpegts 直接播放加密檔案 ffplay -key "527930d9bab56a1ed763991c159d41fa" -iv "a084a4e635e5b32830bdb901089ac0c3" -i crypto:crypted.mpegts 參考資料 http://bbs.chinaffmpeg.com/forum.php?mod=viewthread&tid=430

打包好OpenCV2的Visual C++ 2017專案

這是打包好的OpenCV Visual C++ 2017專案,內含OpenCV 2.4.13版本,可用於Visual C++ 2017 15.6.2版本。和 之前提供下載的VC++2010專案 一樣,使用static library,編譯完成的執行檔案較大,但是不需要額外的DLL即可運行。 更新的部分 1. 更新OpenCV至2.4.13版本以便讓VC2017編譯 2. 更新Header目錄:專案屬性→一般→VC++目錄→Include目錄 3. 更新Library目錄:專案屬性→一般→VC++目錄→程式庫目錄 4. 更新Linker的其他相依性:專案屬性→連結器→輸入→其他相依性 5. 加入x64 Release/Debug編譯選項 內容物 VC++專案檔在MyProgram\MyProgram.sln 執行檔會產生在MyProgram\bin內 Header檔案在OpenCV\include\opencv,OpenCV\include\opencv2 Library檔案在OpenCV\x86和Opencv\x64 下載(GoogleDrive) 編譯Release版本用靜態函數庫 IlmImf.lib libjasper.lib libjpeg.lib libpng.lib libtiff.lib opencv_calib3d2413.lib opencv_contrib2413.lib opencv_core2413.lib opencv_features2d2413.lib opencv_flann2413.lib opencv_gpu2413.lib opencv_highgui2413.lib opencv_imgproc2413.lib opencv_legacy2413.lib opencv_ml2413.lib opencv_nonfree2413.lib opencv_objdetect2413.lib opencv_ocl2413.lib opencv_photo2413.lib opencv_stitching2413.lib opencv_superres2413.lib opencv_ts2413.lib opencv_video2413.lib openc...

DesignPattern: Null Object, Singleton

Null object pattern/空物件模式 我認為空物件模式是讓程式碼保持乾淨,並且語意明確的一種方法。 為了好debug,在寫C時我已養成加上要檢查函數參數中的指標是否為NULL,不然可能程式執行到一半就會crash掉,然後找半天都不知道錯誤在哪裡;不過在寫Java時,這習慣就會變成不檢測,直接讓程式crash反正最後也會有jvm會幫我印出錯誤位置點。 Christopher Okhravi教學影片 https://www.youtube.com/watch?v=rQ7BzfRz7OY 如何實現 Null Object Pattern ? (使用PHP展示) http://oomusou.io/design-pattern/nullobject/ Null Object 模式並非出自 設計模式 一書,而是出現在 重構 的 Ch 9.7,教大家將  null  值重構成  null  物件,因為只要有  null  值,就必須去  if  判斷是否  null ,甚至於去  try catch ,這樣的 API 並不好用,而且只要忘記判斷就可能出錯。 Singleton pattern/單例模式 這個類別在整個世界中只會存在一個實體, 不論如何取得都是同一個實體。 Christopher Okhravi教學影片 https://www.youtube.com/watch?v=hUE_j6q0LTQ 良葛格和RunNoob.com都有用java語言寫幾種範例 這個影片動態的展示了未保護的singleton在multithread狀態會有問題 https://www.youtube.com/watch?v=iyfqDV4wKAQ 1. 實作單例基本精神, 並具備multithread保護的能力 public class Singleton {   private static Singleton instance;   private Singleton (){}   public static synchronized Singleton getInstance() { ...

wireshark封包檔案分割

如果想研究pcapng和pcap檔案格式可以看wireshark原始碼 tcpdump預設使用的pcap https://github.com/wireshark/wireshark/blob/master/wiretap/libpcap.h wireshark預設使用的pcapng https://github.com/wireshark/wireshark/blob/master/wiretap/pcapng.h 老陳獨白: pcap檔案格式解析 http://myblog-maurice.blogspot.tw/2012/02/pcap.html 以封包數分割檔案 Linux   editcap -c 1000 test.pcapng out.pcapng Windows 10 PowerShell e.g.   &"C:\Program Files\Wireshark\editcap.exe" -c 1000 test.pcapng out.pcapng 合併分割的封包檔案 mergecap -w merged.pcapng source_files_*  選取特定封包內容 editcap -r capture.pcap select.pcap 1 5 10-20 30-40 選取1, 5, 10到20, 30到40號封包 pcapng轉換成pcap editcap -F libpcap .pcapng out.pcap 顯示所有封包的MD5 Linux   editcap -v -D 0 capture.pcap /dev/null Windows   editcap.exe -v -D 0 capture.pcap NUL Windows 10 PowerShell e.g.   &"C:\Program Files\Wireshark\editcap.exe" -v -D 0 test.pcapng NUL 參考資料 wireshark文件分割與合併 https://blog.csdn.net/qq_20480611/article/details/50774686 Editcap Guid...

git remote指令操作

推入遠端 將最新的commit(HEAD)推入遠端origin (Code Review) git push origi n HEAD:refs/for/master 推入遠端 git push origin master 邪惡版推入遠端(強制) git push origin master --force -f是--force的短指令 如果我目前分支不是master而是yhchiu , 但是我想推到遠端上改成new_patch這個分支 git push origin yhchiu:new_patch 實際上不見得一定要推分支 , 指定某個commit也可以推 顯示本地跟遠端所有branch git branch -a 顯示有哪幾個遠端名稱/遠端名稱及網址/遠端詳細訊息 git remote show git remote -v 加入新的遠端伺服器,命名為origin2 git remote add origin2 ssh://yhchiu@192.168.10.30:29418/NewDevice 下面是一個遠端同步的應用: 我在遠端伺服器192.168.10.30上面用我的帳號yhchiu的家目錄中建立了一個資料夾public並在上面clone了NewDevice的git庫,所以我就會有一個/home/yhchiu/public/NewDevice的git資料夾 我可以在另一台電腦上直接clone我家目錄下的這個git ssh://yhchiu@192.168.10.30/home/yhchiu/public/NewDevice 另外我也可以將這個url加入remote變成合併原本的目錄和我在我家目錄上建的目錄 刪除某個遠端伺服器 git remote rm origin2 遠端伺服器改名 git remote rename pb paul 更新遠端資料 git pull 不要隨便在任一個commit/branch之後或是使用這個指令,是否亂掉可以用gitk查看左上角的分支線路,不是一條而是有迴圈就是出問題了,得先要恢復到某個版本 git pull origin master 從所有的遠端伺服器上抓取資料/從預...

抓取網路裝置名稱

圖片