發表文章

BASH Snippet

自動找出mediaserver的pid,並印meminfo和該pid的memory map while [ true ] do   top -n 1 | grep mediaserver   cat /proc/meminfo   cat /proc/`ps | grep -i mediaserver | awk {'print $2'}`/maps   echo ' '   echo ' ' done 顯示指定檔案的size和md5 #!/bin/bash if [ "$#" -lt 1 ] || ! [ -f "$1" ] then     echo 'should assian a valid file';     exit -1; fi file=$1 if [ -f "$file" ] then     fsize=`ls -l $file | awk {'print $5'}`;     md5val=`md5sum $file | awk {'print $1'}`;     echo "filename=$file size=$fsize md5sum=$md5val"; else     echo "$file not found."     exit -1; fi 顯示環境變數PATH中的各個目錄 #!/bin/bash (IFS=':' idx=0 for p in $PATH; do   echo "PATH[$idx]=$p"   idx=$((idx+1)) done) 產生短版日期 #!/bin/bash echo "$(date +%y%m%d)" 2016/8/24執行時會產生結果160824 印出目前主機的login使用者 w w -h # ignore table header w -...

BASH snippet 2

圖片
取得網路卡IP-方法1 #!/bin/bash if [ $# -lt 1 ]; then   ifname="eth0" else   ifname=$1 fi ifconfig "$ifname" > /dev/null 2> /dev/null if [ $? -eq 0 ]; then   ifconfig "$ifname" | awk '{print $2}' | xargs | awk '{print $2}'| cut -d ':' -f 2 fi 取得網路卡IP-方法2 ifconfig | grep 'inet addr:' | grep Bcast | awk '{print $2}' | awk -F: '{print $2}' 取得網路設備名稱 cat /proc/net/dev | awk -F: '/eth.:|wlan.:/{print $1}' 取得系統記憶體大小 cat /proc/meminfo | awk '/MemTotal/{print $2}' cat your.csv | awk -F, 'BEGIN{OFS=","}{print $1,$4,$3,$2,$5}' > new.csv

BASH取得目錄名, 檔案名及副檔名及參數抽換功能

指令取得檔案名稱 basename /etc/sysconfig/network   #會得到檔案名稱network 指令取得目錄名稱 dirname /etc/sysconfig/network     #會得到路徑 /etc/sysconfig 取得檔案路徑中的檔名和副檔名 FILENAME=$(basename "${path}") EXTENSION="${FILENAME##*.}" FILENANE_WITHOUT_EXT="${FILENAME%.*}" 關於上面這個用法是 Bash Parameter Substitution 的功能 ${parameter##pattern}是從前端開始移除符合pattern的最長內容 所以符合*.的意義就是檔案路徑與名稱到點的部分都要移除,因此只剩下副檔名。 ${parameter%pattern}是從尾端開始移除符合pattern的最短內容 所以符合.*的意義就是點與副檔名的部分要被移除掉,因此只剩下檔名的部分。 長短的部分對於pattern中沒有*的時候,%表示移除最後一個符合的內容,而#表示移除最前一個符合的內容。 $ FILE=".tar.gz.xcache-1.3.0.tar.gz" $ echo ${FILE%.tar.gz} .tar.gz.xcache-1.3.0 $ echo ${FILE#.tar.gz} .xcache-1.3.0.tar.gz $ echo ${FILE##.tar.gz} .xcache-1.3.0.tar.gz $ echo ${FILE%%.tar.gz} .tar.gz.xcache-1.3.0 應用這個功能就能快速完成轉換副檔名的工作 for f in *.bin do      mv "${f}" "${f%%bin}txt" done 衍伸的相關用法可以參考下面這些網站 1.  Advanced Bash-Scripting Guide:Chapter 10. Manipulating Variables 2.  HowTo: Use Bash Parameter S...

Bash Script除錯與檢測

圖片
shell script可以用內建的-n 參數檢測語法 -x顯示每一個指令執行前的內容 -v在script執行前將整份script輸出, 一般比較少用, 除非是有寫template script用sed之類的函數及時替換內容 Ubuntu安裝方式 sudo apt-get install shellcheck 檢測Script的方式 shellcheck {your-shell-script-path} Shellcheck官方github https://github.com/koalaman/shellcheck Sublime裏面可以安裝shellcheck的plugin - SublimeLinter https://github.com/SublimeLinter/SublimeLinter-shellcheck Sublime package manager的sublimelinter套件頁 https://packagecontrol.io/packages/SublimeLinter-shellcheck 安裝方法可以參考 http://ephrain.pixnet.net/blog/post/59641837-%5Bmac%5D-%E5%9C%A8-sublime-text-3-%E4%B8%AD%E5%AE%89%E8%A3%9D-shellcheck-plugin 參考資料 http://www.tecmint.com/shellcheck-shell-script-code-analyzer-for-linux/?utm_content=buffer3a176&utm_medium=social&utm_source=facebook.com&utm_campaign=buffer

硬體解碼真4K影片

圖片
真4K的完整規格是影片使用HEVC編碼,畫面解析度3820x2160,每秒60個畫楨,HDR10則是指每個像素的RGB色彩使用10bit表示(Full HD是8bit)。 要真正解碼並輸出到真4K電視需要下面三者配合,缺一不可 1. 處理器內顯/顯示卡 2. 輸出介面的規格和線材 3. 使用的播放器 使用顯示卡 已知確認支援真4K的GPU(不完整列表): Nvidia GTX 950/960/1060/1070/1080 雖然官方網站上有列出支援4K的GPU,但是因為技術細節面並沒有提到HDR,所以我會建議買之前請店家用本文下面提到的DXVA checker檢查是否可以支援真4K硬解 http://www.geforce.com.tw/hardware/technology/4k/supported-gpus 使用處理器內顯 Intel在15.36.14.4080版的HD Graphics Driver納入硬體解碼功能,細節請看 這裡 已確認支援真4K的CPU(不完整列表): Intel第五代的Core處理器並要使用內顯HD graphics 5500/6000或是Iris graphics 6100;筆記型電腦處理器需要能使用HD Graphics 520/620 提醒!! 如果電腦有裝GPU則是要看GPU是否支援真4K解碼而不是看CPU哦! 在 Wikipedia的Intel Quick Sync Video條目 中有整理Intel各架構下的硬體codec支援程度 確認你的電腦硬體是否可以硬解真4K DXVA checker 應該要有HEVC_VLD_Main10這個項目 http://www.coolpc.com.tw/phpBB2/viewtopic.php?f=19&t=224212 像是下圖我電腦的nVideia GTX 960就有HEVC_VLD_Main10這個項目 輸出介面的規格和線材 真4K的影片內容因為所需頻寬過高,所以需要HDMI 2.0介面,如果想要看Netflix 4K更是需要HDCP 2.2版以上的內容保護協定。舊有的HDMI 1.4介面只能播放假4K,解析度3820x2160,每秒30畫楨。如果要使用DisplayPort,則是要使用DP1....

Screen分頁工作

如果不嫌棄Screen版本太舊,可以直接安裝Ubuntu的套件 安裝Ubuntu的套件包 sudo apt-get install screen 自行編譯套件 官網下載程式碼 https://www.gnu.org/software/screen/ 編譯程式碼 ./configure --prefix=/home/yhchiu/screen --bindir=/usr/local/bin --enable-colors256 make && sudo make install Screen設定檔 沒有設定的Screnn你感覺不到差異,會覺得什麼事情都沒有發生 所以要參考別人的screen設定檔,放在~/.screenrc https://www.puritys.me/docs-blog/article-168-%E5%A6%82%E4%BD%95%E5%9C%A8-Win-,-Mac-,-Chrome-%E8%A8%AD%E5%AE%9A%E5%AF%A6%E7%94%A8%E7%9A%84-.screenrc.html http://napmas.blogspot.tw/2011/09/screenrc.html 加入切換Tab的功能鍵 bindkey ^[z prev # 往上個Tab Alt+z bindkey ^[x next # 往下個Tab Alt+x Screen快捷鍵 全部都要先按一次Ctrl+a,再按功能鍵, 大小寫有分 Ctrl+a, ? 快捷鍵的說明文件 Ctrl+a, v 看版本 Ctrl+a, c 開新tab, 在screen裏面輸入screen指令也是開新視窗 Ctrl+a, p 往上個tab Ctrl+a, n 往下個tab Ctrl+a, k 關閉當前tab,會詢問是否真的要離開 Ctrl+a, C 清除terminal內容 Ctrl+a, Z 清除terminal內容 Ctrl+a, \ 離開Screen,會詢問是否真的要離開 Ctrl+a, w 顯示tab, 並用星號顯示目前所在tab Ctrl+a, N 顯示目前所在tab的編號 Ctrl+a, S 上下分割視窗 Ctrl+a, Ctrl+i 上下分割視窗 Ctrl+a, ...

背景執行程式

Linux上讓程式背景執行的方法 Linux上有些指令的運作時間比較長,我們會希望他在背景執行,好讓我們同時間可以處理其他事情,這種情況下,我們可以在指令最後加上 & 讓程式放在背景執行。 例如我用find指令從根目錄搜尋符合"the file"的檔案 find / -name "the file" & 系統就會顯示放入背景執行的程式PID,而你的Console可以繼續輸入指令。 恢復成前景執行 要把背景執行中的程式,到前景時則是輸入 fg 察看背景執行的程式清單與狀態 輸入jobs就能夠 jobs #顯示程式狀態與執行的指令 jobs -l #比jobs多顯示PID jobs -r #顯示Running狀態的程式 jobs -s #顯示Stopped狀態的程式 因為jobs是shell指令,要看jobs指令的用法要輸入 help jobs 針對已經正在執行的程式 如果已經在執行的可以先按Ctrl+z暫停程式執行,Console會顯示你的程式變成Stopped狀態,然後輸入bg讓程式變成背景執行。 bg 如果Ctrl+z之後沒有要放到背景執行的話,可以直接輸入fg,讓程式恢復Running狀態。 遠端狀況下的背景執行 使用ssh的時候會希望ssh session關閉後程式還能運作,這時候就要用nohup來避免中斷程式 因為nohup執行程式時的輸出會直接到nohup.out中,所以要跑多個程式最好自己指定螢幕輸出的檔案 nohup your_command &>myout.txt & 參考資料 http://dragonspring.pixnet.net/blog/post/33257496-%5Blinux%5Btips%5Dnohup:-%E8%AE%93command%E5%9C%A8%E9%81%A0%E7%AB%AF%E5%9F%B7%E8%A1%8C%EF%BC%8C%E4%B8%8D%E5%9B%A0%E7%99%BB%E5%87%BA

Android.mk解決JNI library不會被包進APK內的問題

要包裝JNI library到APP中,在不同版本的ANDROID環境中的設定不太相同 主要是build system中的預設行為被改變了,目前我使用過的4.4.2/5.x/6.0/7.0都可統一用下面方法把JNI Libray包進APP中 在APP的Android.mk修改下面兩項:  將原本的tag改成tests或是samples LOCAL_JNI_SHARED_LIBRARIES := {加入你的所需要的library名稱}

Ubuntu Terminal快捷鍵與設定

圖片
起動Terminal Ubuntu系統快捷鍵 Ctrl+Alt+T Command line指令 gnome-terminal 常用的快捷鍵 Ctrl+Alt+T  open a new terminal Ctrl+Shift+T open a new tab Ctrl+Shift+W close current tab Ctrl+Shift+Q close the whole terminal Ctrl+Shift+C  拷貝內容畫面上所選內容到系統剪貼簿 Ctrl+Shift+V  從系統剪貼簿貼上所選內容 由於我們編輯程式常常會開多個Vim並剪貼部份程式碼,為了跨Process剪貼,會需要使用系統剪貼簿來輔助。如果你的vim已經有support直接剪貼系統剪貼簿,或者你是用vim的分頁功能,則不太會需要使用到這個快捷鍵。 Shift+"Page up" 畫面向上捲 Shift+"Page down" 畫面向下捲 Tab 使用自動完成(auto-complete)功能 Terminal的無限buffer功能 上方Menu的Edit→Profile Preferences選分頁Scrolling,勾選裏面的unlimited功能 設定Terminal的快捷鍵 Terminal的快捷鍵設定在上方的Edit的Keyboard Shortcuts中可以找到,我自己會設定Terminal 的Rest and Clear快捷鍵為F9,方便我快速清除Terminal的buffer。 用bash的clear指令是不會清除Terminal的Buffer,只要用上下滑動滑鼠滾輪,或是捲動畫面得快捷鍵就會看到之前的指令訊息,對於查錯誤很不方便。 自動紀錄Terminal的指令與訊息 如果想要把每個Terminal的資訊都儲存下來,可以參考下面資料使用script指令,開始紀錄到指定檔案,再用Ctrl+D結束紀錄到檔案。 https://answers.launchpad.net/ubuntu/+source/gnome-terminal/+question/7131

Java與C++的函式參數傳遞比較

圖片
Java參數傳遞測試 Java的參數傳遞對於基本型態是複製,而物件型態則是類似C/C++的指標行為, 是複製物件的位址到函式中,所以在函式內assgin的新物件不影響外部變數所指的變數。 C++參數傳遞測試 而C++的參考則是會讓外部變數跟內部變數的狀態保持一致。 Java測試用程式碼 public class test {     static class MyObject {         public int iv = 0;         public String is = "initial field";         public MyObject io = this;         public MyObject() {         }         public MyObject(int primitive, String string, MyObject object) {             iv = primitive;             is = string;             io = object;         }     }     static public void setSomething(int primitive, String string, MyObject object) {         System.out.println("setSomething");         primitive = 200;     ...