2017年12月19日 星期二

【Linux Tool】vim當中取代字串的方法

假設我們要在一個檔案中將所有得aaa取代為bbb

我們可以在vim底下先按下鍵盤Esc按鍵,讓vim進入command模式

接著輸入:1,$s/aaa/bbb/g

輸入完後按下Enter鍵,就可以完成取代功能

2017年12月11日 星期一

USB的種類(OHCI、UHCI、EHCI、XHCI)

USB(Universal Serial Bus)通用串列匯流排:USB1.1規格支援兩種速率:低速(low speed)1.5Mbps和全速(full speed)12Mbps.

USB2.0規格除了支援原有的兩種速度外,還額外支援高速(high speed)480Mbps。

USB3.0支援全雙工,比USB 2.0多了數個觸點,並採用發送列表區段來進行資料發包。USB 3.0暫定的供電標準為900mA,且理論上有支援光纖傳輸的潛力。USB 3.0設計的「Super Speed」傳輸速度為5Gbit/s,理論資料傳輸速度為625MByte/s。

OHCI、UHCI都是USB1.1的介面標準,而EHCI是對應USB2.0的介面標準,最新的xHC則是USB3.0的介面標準。

1. OHCI(Open Host Controller Interface)是支援USB1.1的標準,但它不僅僅是針對USB,還支援其他的一些介面,比如它還支援Apple的火線(Firewire,IEEE 1394)介面。與UHCI相比,OHCI的硬體複雜,硬體做的事情更多,所以實現對應的軟體驅動的任務,就相對較簡單。主要用於非x86的USB,如擴展卡、嵌入式開發板的USB主控。

2. UHCI(Universal Host Controller Interface)是Intel主導的對USB1.0、1.1的介面標準,與OHCI不相容。UHCI的軟體驅動的任務重,需要做得比較複雜,但可以使用較便宜、較簡單的硬體的USB控制器。Intel和VIA使用UHCI,而其餘的硬體提供商使用OHCI。

3. EHCI(Enhanced Host Controller Interface),是Intel主導的USB2.0的介面標準。EHCI僅提供USB2.0的高速功能,而依靠UHCI或OHCI來提供對全速(full-speed)或低速(low-speed)設備的支援。

4. xHCI(eXtensible Host Controller Interface),是最新最火的USB3.0的介面標準,它在速度、節能、虛擬化等方面都比前面3中有了較大的提高。xHCI 支援所有種類速度的USB設備(USB 3.0 SuperSpeed, USB 2.0 High-speed, USB 1.1 Low-speed and Full-speed)。

USB1.1 ---> (Low-Speed and Full-Speed)

USB2.0 ---> High Speed

USB3.0 ---> Super Speed


2017年11月24日 星期五

【shell script】如何判斷變數為空

下面兩種寫法都可以用來判斷變數是否為空值

================ function 1 ==============
#!/bin/sh

if [ ! -n "​​$foo" ]; then
  echo "IS NULL"
else
  echo "NOT NULL"
fi
======================================


================ function 2 ==============
#!/bin/sh

if [ ! "$​​foo" ]; then
  echo "IS NULL"
else
  echo "NOT NULL"
fi
======================================

【shell script】印出檔案中的每一行內容

下面要實作一個範例,這個Script可以取得檔案每一行的內容,並且搭配其他指令來處理


目的:以檔案的內容,來批次的尋找檔案是否存在
OS:Ubuntu

假設5566.txt 內容:
usr/lib/liba.so
usr/lib/libc.so
usr/lib/libd.so
usr/lib/libe.so

此Script的動作有幾個步驟:
1. 一行一行讀取5566.txt的內容,把每行的內容放到$line當中
2. 搭配awk來處理$line,只取得整行路徑最後的檔案名
3. 會在當下目路去尋找,是否有liba.so、libc.so、libd.so、libe.so這四個library,有的話則會印出來


================= parseTXT.sh ===============
#!/bin/sh
filename="5566.txt"
exec < $filename

while read line
do
   #echo $line
   lib=$(echo $line | awk -F'/' '{print $NF}')    #get last one
   #awk '{print $(NF-1)}'    #get last two
   result=$(find . -name $lib)
   #如果尋找的結果非空,則印出來
   if [ -n "$result" ]; then
        echo $result
   fi
   count=$(($count+1))
done
echo "count=$count"
================================================

2017年10月24日 星期二

Windows掛載、刪除網路磁碟net use指令

觀察目前網路磁碟使用狀態
首先先介紹在windows的命令提示字元輸入: net use
可以印出你目前有登入過,或是掛載的遠端資料夾,如下圖:










掛載網路資料夾
接下來,介紹使用指令來掛載遠端資料夾,成為網路硬碟的指令
例如我要掛載 172.23.85.73底下的danny資料夾,成為Y槽,可以輸入以下指令:
net use Y: \\172.23.85.73\danny /user:danny 1234
後面那一串"/user:danny 1234" 表示此資料夾需要輸入帳號:danny 密碼:1234

那如果遠端的資料夾是不用帳號密碼的,那只需要net use Y: \\172.23.85.73\danny即可


刪除已使用或是已掛載的網路資料夾
windows的網路資料夾很方便,有時候也會帶來困擾,因為每當你登入過網路資料夾之後windows會幫你把帳號密碼記下來,當你下次在登入時,你就不用在次輸入帳號密碼,但是當遠端資料夾的帳號密碼有變動的話,就會造成無法登入的情形,因為windows會使用上次的帳密登入。

這時候就需要使用net use /delete來刪除之前的紀錄,指令的使用方法如下
假設我們要刪除已掛載的Y槽,可以使用以下指令:
net use Y: /delete
另外一種,假設我們要刪除之前登入過的 172.23.85.73的danny資料夾,指令如下:
net use \\172.23.85.73\danny /delete

2017年10月18日 星期三

【Linux cmd】在ubuntu上使用mount.cifs掛載遠端網路磁碟的方法

1.首先請先創建一個空資料夾,供我們作為掛載的地方,例如我創一個tmp_mount:
#mkdir tmp_mount

2.請使用mount.cifs指令作掛載動作,假設我們要掛載的路徑是在192.168.2.100底下的danny資料夾此為第一個參數,第二個參數是掛載點即為tmp_mount:
#mount.cifs //192.168.2.100/danny tmp_mount -o username=danny

3.上面的指令下完之後,如果你的遠端分享資料夾有設定密碼,就會跳出輸入密碼的提示,請再接著輸入

4.完成上述三個步驟,就完成了!


****假如找不到mount.cifs的指令請使用apt-get安裝:  sudo apt-get install cifs-utils

2017年10月13日 星期五

使用批次檔時,Win XP 沒有timeout 指令可以用,我們可以用另外指令來取代等待或sleep

timeout指令在Windows XP的系統上並不支援,只有在Windows 2003 或是 Win7 的系統上才有內建支援

因此我們可以使用下面的命令來取代timeout的指令


Example:
假設我們要在批次檔內等待3秒再繼續做,如果在Win7上我們可以這樣做:
timeout /t 3


如果是在Windows XP的系統上沒有timeout指令可以用,我們可以用以下的指令來替代:
ping 192.0.0.2 -n 1 -w 3000 > wait

(ip的部分請指派一個不存在的ip,-w 3000 表示等待3秒的意思)




2017年10月12日 星期四

【Linux cmd】在Ubuntu 16.04 查詢memory Frequency & 安裝類似cpu-z 的軟體

在Ubuntu底下想要查看現在的Memory Size,或Memory Frequency可以用下面的指令來達成:

#sudo lshw -short -C memory

下圖是結果,會秀出容量&頻率 ==> 4GB DDR3 1333MHz








另外還有一個指令也可以達到同樣的目的

#sudo dmidecode -t memory

下圖是結果,看你的設備有幾個Memory的插槽,他都會秀出來,我的電腦共有4個插槽,記憶體是插在第二個插槽,4GB DDR3 1333MHz (圖片太長,只截取兩個插槽資訊)




















======================================================
另外還有一個類似CPU-Z的圖形化介面工具,安裝方式如下:

#sudo add-apt-repository ppa:i-nex-development-team/daily
#sudo apt-get update
#sudo apt-get install i-nex

安裝完成之後,可以照下圖方式來開啟他,如下圖所示名字為 i-nex的工具:











開啟後的介面如下圖:



2017年10月6日 星期五

用 wxWidgets 的GUI Library 搭配CodeBlock 來開發PC端應用程式

今天這篇文章要使用 wxWidget (3.0.3) 搭配 CodeBlock(16.01) 來開發一個簡單的視窗介面應用程式

首先我們會分兩個階段,第一階段我們需要先去編譯wxWidgets這個GUI Library,我們將會使用mingw-w64(GCC)來作為我們的Compiler.

第二階段我們會去用CodeBlock開一個wxWidgets的專案,並且簡單的編譯一個視窗應用程式

========================================================================
首先我們需要去下面的載點下載需要的軟體:
1. mingw-w64 ==>  https://sourceforge.net/projects/mingw-w64/
2. wxWidget (3.0.3) ==> https://www.wxwidgets.org/downloads/
3. CodeBlock(16.01) ==> http://www.codeblocks.org/downloads/binaries
========================================================================

下載完成後,我們先安裝mingw-w64,這是一個自動安裝的檔案,只需照著步驟下一步就可以了,作者是把他安裝在 D:\mingw-w64 底下。

接著我們要把wxWidget解壓縮開,作者把wxWidgets解壓縮在D:\Wxwidget\wxWidgets-3.0.3 底下

先完成上面兩個步驟之後,接著去設定一下Windows的環境變數,讓我們的GCC 可以直接呼叫,步驟如下:















在最後面加上 ===>  ;D:\mingw-w64\i686-7.1.0-posix-dwarf-rt_v5-rev2\mingw32\bin
這樣就完成編譯器的設定


接著打開windows的命令提示字元,並且切換到wxWidget的build\msw路徑底下,













依序輸入下面指令:
1. mingw32-make -f makefile.gcc clean
2. mingw32-make -f makefile.gcc BUILD=debug SHARE=0 MONOLITHIC=1 UNICODE=1
3. mingw32-make -f makefile.gcc BUILD=release SHARE=0 MONOLITHIC=1 UNICODE=1

當整個編譯完成後,我們已經把wxWidget Library成功編譯成Codeblock可以使用的了~


========================================================================第二步驟,請先安裝CodeBlock,安裝完成後請開啟CodeBlock,選擇Create a new project,並且依照下面步驟來建立專案


1.請選擇wxWidgets project來作開發,接著按右邊的"Go"按鈕進行下一步驟
















2.這一頁面會說明此版本支援wxWidgets 2.6.x/2.8.x/3.0.x,我們使用3.0.3版也在此支援範圍之內,若是你想要使用的wxWidgets不在此CodeBlock範圍,你可能就要找其他版本的CodeBlock了。這邊我們直接選"Next"按鈕


















3.選擇我們使用的3.0.x版本,按下一步


















4.接著輸入我們要建立的專案名,我這邊命名為"wxTest",接著進行下一步驟


















5.這邊我們隨便輸入一個作者名即可,進行下一步


















6.這個頁面Preferred GUI Builder請選擇wxSmith,另外Application Type選擇Frame Base.


















7.接著我們要選擇wxWidgets3.0.3所在的位置,也就是第一步驟編譯好的wxWidgets位置,所以我們這邊填入D:\Wxwidgets\wxWidgets-3.0.3


















8.這一步驟請確定Compiler是選擇GNU GCC Compiler,其他應該預設就沒有問題了


















9.這一步驟請按照圖片裡的選項勾選,接著按下一步,Project初始的Wizzard應該就結束了,此時你就會看到有IDE介面出現,可以讓你設計UI


















10. 在作編譯之前,我們先到Settings => Compiler 確定一下設定是否正確,檢查Toolchain executables這個部分,請確認這些編譯器的名子與位置都是正確的,要確認你的Compiler's install directory都有這些執行檔可用。
















11.我們這邊簡單的拉兩個TextEdit,一個Button,並且進行編譯,可以看到編譯完成後就會跳出右邊的小視窗,簡單的視窗程式就大功告成了。


2017年9月15日 星期五

分別在兩台Ubuntu電腦執行同一支shell script,有一台卻發生 Syntax error: "(" unexpected

今天在移植整個編譯Code的環境,當整個環境都移植完成後,準備試著編譯一次相同的Code,結果遇到Shell Script的error訊息,因此朝著新電腦的環境還尋找問題,錯誤大概描述如下

Shell script內容:
===============================================
#!/bin/sh
AAA=(a b c)
for i in ${AAA[@]}; do
        echo $i
done

錯誤訊息為:
line 2,   
Syntax error: "(" unexpected





這種宣告陣列變數的寫法,並不是在所有的shell底下都通用
所以一開始我先用底下指令確認安裝的shell種類,與版本
# echo $SHELL
# echo $BASH_VERSION

結果發現兩台電腦是相同的


後來查資料原來ubuntu預設的shell是使用dash而非bash,用以下指令查看了一下出現錯誤的電腦:
# ls -al /bin/sh




果然是使用dash所造成的

最後解決方法,就是手動更改/bin/sh,把他改為link到bash就可以了









2017年9月8日 星期五

解決 ssh 輸入root帳號與密碼都無法登錄的問題

最近在Device上要使用ssh登入,看了一下Device上sshd都跑在背景了,我使用putty來做ssh連線

連上線之後,要輸入帳號密碼,ssh的帳號密碼應該會跟你透過UART登入使用同樣的帳號密碼,也就是說要改密碼直接使用passwd就行

但是我使用putty透過ssh連上Device後卻一直登入不了(Access Denied)








後來找到解法,發生這種問題,必須先去修改Device上sshd的config檔,位於/etc/ssh/sshd_config,請把位於Authentication底下的PermitRootLogin 後面的值改為 yes












然後重啟Device上的sshd










完成以上步驟之後,就可以順利透過ssh登入了!!!

2017年8月28日 星期一

【Linux cmd】關閉ubuntu防火牆的指令-ufw

ufw 是一個 iptables 的前端設定程式,其名稱為 Uncomplicated Firewall 的簡稱,意謂著「不複雜的防火牆」設定,它的製作目的在於讓一般人很容易的設定 iptables。

要強調的是 ufw 只是一個簡單的 iptables 前端設定工具,無法完全取代 iptables 的所有設定,若想做更複雜的 firewall 設定,還是得回到 iptables 層面。


啟用防火牆
$ sudo ufw enable
Firewall is active and enabled on system startup

停用防火牆:
$ sudo ufw disable
Firewall stopped and disabled on system startup

要確認 ufw 已經啟用,可以看一下 ufw 的 status:

已啟用:
$ sudo ufw status
Status: active

未啟用:
$ sudo ufw status
Status: inactive

2017年8月24日 星期四

在Ubuntu 14.04 無法apt-get install iperf3 的解決方法

首先加入 iperf3 需要的repository
sudo add-apt-repository "ppa:patrickdk/general-lucid"

接著更新你的apt-get的table
sudo apt-get update

最後安裝
sudo apt-get install iperf


*若是找不到命令add-apt-repository 請先使用下面方法安裝,通常安裝第一項就可以,若是不行再依序安裝二、三~
sudo apt-get install software-properties-common
and/or
sudo apt-get install python3-software-properties
and/or
sudo apt-get install python-software-properties

2017年8月17日 星期四

Windows Defender 無法開啟的問題

若是點了控制台的 Windows Defender 出現下面的訊息












可以試試以下步驟:

用管理權限去跑 regedit , 改機碼請小心

機碼位置位於:
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender\DisableAntiSpyware

這個值若為1   試試改為 0

2017年7月27日 星期四

【Linux cmd】vi指令說明

vi指令說明(完整版)
.vi 的操作模式
==============
        vi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode)
        。當使用者進入 vi 後,即處在指令模式下,此刻鍵入之任何字元皆被視為
        指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入
        模式。
.輸入模式
=========
        如何進入輸入模式
                a (append)      由游標之後加入資料。
                A               由該行之末加入資料。
                i (insert)      由游標之前加入資料。
                I               由該行之首加入資料。
                o (open)        新增一行於該行之下供輸入資料之用。
                O               新增一行於該行之上供輸入資料之用。
        如何離開輸入模式
                《ESC》 結束輸入模式。
.指令模式
=========
游標之移動
        h       向左移一個字元。
        j       向上移一個字元。
        k       向下移一個字元。
        l       向右移一個字元。
        0       移至該行之首
        $       移至該行之末。
        ^       移至該行的第一個字元處。
        H       移至視窗的第一列。
        M       移至視窗的中間那列。
        L       移至視窗的最後一列。
        G       移至該檔案的最後一列。
        +       移至下一列的第一個字元處。
        -       移至上一列的第一個字元處。
        (       移至該句之首。 (註一)
        )       移至該句之末。
        {       移至該段落之首。 (註二)
        }       移至該段落之末。
        nG      移至該檔案的第 n 列。
        n+      移至游標所在位置之後的第 n 列。
        n-      移至游標所在位置之前的第 n 列。
        <Ctrl><g>       會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標
                        所在行號佔總行號之百分比。
        註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。
        註二:段落(paragraph)在vi中是指以空白行隔開的文字。
.視窗的移動
===========
        <Ctrl><f>       視窗往下捲一頁。
        <Ctrl><b>       視窗往上捲一頁。
        <Ctrl><d>       視窗往下捲半頁。
        <Ctrl><u>       視窗往上捲半頁。
        <Ctrl><e>       視窗往下捲一行。
        <Ctrl><y>       視窗往上捲一行。
.刪除、複製及修改指令介紹 (此單元較少使用)
=========================
        d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:
        Operator + Scope = command
        (運算子)   (範圍)
        運算子:
        d       刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。
        y       將資料(字組、行列、句子或段落)複製到緩衝區。
        p       放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資
                料放置於游標所在位置之行列下。
        c       修改(change)指令,類似delete與insert的組和。刪除一個字組、句
                子等之資料,並插入新鍵資料。
        範圍:
        e       由游標所在位置至該字串的最後一個字元。
        w       由游標所在位置至下一個字串的第一個字元。
        b       由游標所在位置至前一個字串的第一個字元。
        $       由游標所在位置至該行的最後一個字元。
        0       由游標所在位置至該行的第一個字元。
        )       由游標所在位置至下一個句子的第一個字元。
        (       由游標所在位置至該句子的第一個字元。
        {       由游標所在位置至該段落的最後一個字元。
        }       由游標所在位置至該段落的第一個字元。
        整行動作
        dd      刪除整行。
        D       以行為單位,刪除游標後之所有字元。
        cc      修改整行的內容。
        yy      yank整行,使游標所在該行複製到記憶體緩衝區。
.刪除與修改
===========
        x       刪除游標所在該字元。
        X       刪除游標所在之前一字元。
        dd      刪除游標所在該行。
        r       用接於此指令之後的字元取代(replace)游標所在字元。
                如: ra 將游標所在字元以 a 取代之。
        R       進入取代狀態,直到《ESC》為止。
        s       刪除游標所在之字元,並進入輸入模式直到《ESC》。
        S       刪除游標所在之該行資料,並進入輸入模式直到《ESC》。
.搬移與複製
==========
        利用 delete 及 put 指令可完成資料搬移之目的。
        利用 yank 及 put 指令可完成資料複製之目的。
        yank 和 delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令
        可將緩衝區內的資料複製到螢幕上。
        例:
        搬移一行        ‧在該行執行 dd
                        ‧游標移至目的地
                        ‧執行 p
        複製一行        ‧在該行執行 yy
                        ‧游標移至目的地
                        ‧執行 p
.指令重複
=========
        在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n
        次。
        例:
        刪除10行                ‧10dd
        複製10行                ‧10yy
                                ‧游標移至目的地
                                ‧p
        指標往下移10行  ‧10j
.取消前一動作(Undo)
===================
        即復原執行上一指令前的內容。
        u       恢復最後一個指令之前的結果。
        U       恢復游標該行之所有改變。
.搜尋
=====
        在vi中可搜尋某一字串,使游標移至該處。
        /字串           往游標之後尋找該字串。
        ?字串           往游標之前尋找該字串。
        n               往下繼續尋找下一個相同的字串。
        N               往上繼續尋找下一個相同的字串。
.資料的連接
===========
        J       句子的連接。將游標所在之下一行連接至游標該行的後面。
        若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式
        (可利用 a、i等指令)再按《Enter》即可。
.環境的設定
===========
        :set nu                設定資料的行號。
        :set nonu              取消行號設定。
        :set ai                自動內縮。
        :set noai              取消自動內縮。
        自動內縮(automatic indentation)
        在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自
        動內縮的功能,用下例解釋之:
        ‧vi test
        ‧(進入編輯視窗後)
          this is the test for auto indent
          《Tab》start indent           ← :set ai (設自動內縮)
          《Tab》data
          《Tab》data
          《Tab》data                   ← :set noai (取消自動內縮)
        the end of auto indent.
        ‧註:<Ctrl><d> 可刪除《Tab》字元。
.ex指令
=======
        讀寫資料
        :w                     將緩衝區的資料寫入磁碟中。
        :10,20w test   將第10行至第20行的資料寫入test檔案。
        :10,20w>>test  將第10行至第20行的資料加在test檔案之後。
        :r test                將test檔案的資料讀入編輯緩衝區的最後。
        刪除、複製及搬移
        :10,20d                刪除第10行至第20行的資料。
        :10d                   刪除第10行的資料。
        :%d                    刪除整個編輯緩衝區。
        :10,20co30             將第10行至第20行的資料複製至第30行之後。
        :10,20mo30             將第10行至第20行的資料搬移至第30行之後。
        字串搜尋與取代
        s(substitute)指令可搜尋某行列範圍。
        g(global)指令則可搜尋整個編輯緩衝區的資料。
        s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條
        件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。
        :1,$s/old/new/g                將檔案中所有的『old』改成『new』。
        :10,20s/^/   /         將第10行至第20行資料的最前面插入5個空白。
        :%s/old/new/g          將編輯緩衝區中所有的『old』改成『new』。
.恢復編輯時被中斷的檔案
=======================
        在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未
        被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前
        的檔案內容。
        %vi -r filename
.編輯多個檔案
=============
        vi亦提供同時編輯多個檔案的功能,方法如下:
        %vi file1 file2 ..
        當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後
        再利用 『:n』載入下一個檔案。



Reference from: http://www2.nsysu.edu.tw/csmlab/unix/vi_command.htm 

2017年7月26日 星期三

【shell script】Makefile & Shell Script 取得當下路徑 的方法

在makefile呼叫shell script
 $(SHELL) test.sh

在makefile中抓取目前路徑
CURRENT_DIR  = $(shell pwd)

在shell script中抓取目前路徑
CURRENT_PATH=`pwd`

2017年7月25日 星期二

【Linux cmd】linux系統下,壓縮解壓縮指令

附檔名為 tar.xz 的檔案

壓縮:  tar Jcvf file.tar.zx DirName

解壓縮: tar Jxvf file.tar.zx
============================================

附檔名為 zip 的檔案

壓縮:  zip file.zip DirName
           zip -r file.zip DirName

解壓縮: unzip file.zip
解壓縮到特定資料夾(ex:5566): unzip file.zip -d 5566
==============================================

附檔名為 tgz 的檔案

壓縮:  tar -zcvf file.tgz DirName

解壓縮: tar -zxvf file.tgz
=============================================

附檔名為 tar.tgz 的檔案

壓縮:  tar -zcvf file.tar.tgz DirName

解壓縮: tar -zxvf file.tar.tgz
==============================================

附檔名為 gz 的檔案

壓縮:  gzip file.gz DirName

解壓縮: gunzip file.gz    or    gzip -d file.gz
=============================================



附檔名為 tar.gz 的檔案

壓縮:  tar -zcvf file.tar.tgz DirName

解壓縮: tar -zxvf file.tar.tgz
==============================================

附檔名為 bz 的檔案

解壓縮: bzip2 -d file.bz    or    bunzip2 file.bz
=============================================

附檔名為 bz2 的檔案

壓縮:  bzip2 -z file.bz2 DirName

解壓縮: bzip2 -d file.bz2
==============================================

附檔名為 7z 的檔案

壓縮: 7z a file.7z DirName

解壓縮: 7z x file.7z 
*Ubuntu 7z 的安裝方式:  apt-get install p7zip-full


2017年6月14日 星期三

【Linux cmd】Linux下使用top來監控cpu使用率或記憶體使用率

top可以顯示系統各進程 (process) 狀態的文字模式工具,top 可以列出消耗系統資源最多的十多個進程。

通常我們會用這樣的方式來啟動top,意思是啟動top並且每秒更新狀態
#top -d 1

當啟動 top 後會顯示Process的數目、CPU 和 記憶體使用量等系統資訊,並預設會列出 CPU 使用率 (%CPU) 最高的十多個Process。另外我們可以按不同的按鍵來改變 top 顯示系統方式,包括按【M】鍵列出佔用最多記憶體的Process,【R】排列出 CPU 使用率最高的Process。另外常用的 top 命令有:
     【? 】或 【h】 - 顯示說明畫面。
     【q】 - 離開 top。
     【Space】或【Enter】 - 更新並重新繪畫整個畫面。
     【M】 - 進程依記憶體使用率 (%MEM) 由大至小排列。
     【T】 - 進程依總 CPU 時間 (TIME+) 由大至小排列。
     【I 】- 在 Solaris 和 Irix 模式切換,改變 CPU 使用率的計算方法。預設一般為 Irix 模式,
     【k】 - 終止某個進程。
     【r】 - 改變進程 nice 值,影響進程的優先序。
       ***process priority nice值範圍 -20 ~ +19,越小優先權越高,一般userSpace程式為0


下圖是進入top後的畫面:












整個 top 畫面主要分成三個區域,由上至下分別為:
     概要區 (Summary Area) - 顯示整個系統的資訊
     訊息/提示列 (Message/Prompt Line) - 顯示各命令的結果訊息或讓使用者輸入命令的參數,平常為一列空行。
     任務區 (Task Area) - 顯示各個task/process的資料。


概要區 (Summary Area) - 系統運作時間及平均負載
第一列顯示現時時間、系統運作時間 (up time)、使用者數目 (users) 和平均負載 (load average)。可以按 【l】 鍵切換是否顯示。



平均負載的三個數值分別為在平均過去 1 分鐘、5 分鐘和 15 分鐘在可運行或不可中斷狀態的進程數目。平均負載為 1.0 表示一個 CPU 被佔用所有時間。如果電腦有多個 CPU,平均負載的參考值亦會倍數增長。例如一個雙處理器雙核的電腦,所有 CPU 所有時間被完全佔用時的平均負載應該為 1.0 x 2 x 2 = 4.0。

任務資訊
第二列顯示任務 (task) 資訊,包括任務總數、運行中 (running)、睡眠中 (sleeping)、停止了(stopped) 和不能運作 (zombie) 的process數目。可以按 【t】 鍵切換是否和下一列 CPU 狀態列一同顯示。



CPU 使用率
第三列顯示 CPU 狀態,包括以下資訊:
us (user): 使用者空間 (user space) 佔用 CPU 百分比。此數值主要受較少 I/O 等系統呼叫的進程所影響。
sy (system): 核心空間 (kernel space) 佔用 CPU 百分比。一般在系統要處理大量 IRQ 或任務排程時,此值會較高。
ni (nice): nice 值比一般值 0 大 (優先序較低) 的進程佔用 CPU 百分比
id (idle): CPU 閒置時間百分比
wa (iowait): CPU 等待輸入/輸出的百分比。當些值過高 (如超過 30%),表示系統的儲存或網路 I/O 效能有問題。
hi (H/W Interrupt): CPU 處理硬體中斷時間的百分比。除光碟機不斷檢查是否有光碟外,一般此值不會太高。
si (S/W Interrupt): CPU 處理軟體中斷時間的百分比,此值很少機會會太高。
st: (Steal): 在如 Xen 等虛擬環境下 CPU 運作虛擬機器時間的百分比。太高表示可能需要停止一些虛擬機器。





您可以按 【t】鍵切換不同顯示方式。在多處理器 (multi-processor) 或多核 (multi-core) 系統上,您亦可以按 數字【1】鍵切換使用一列顯示整體 CPU 使用狀態還是每個 CPU 使用一列顯示其狀態。

記憶體和置換空間使用率
接下來的兩列分別顯示記憶體和置換空間 (swap space) 使用率。可以按 【m】 鍵切換是否顯示。




buffers (緩衝區) 表示被用作磁碟寫入快取 (write cache) 的記憶體大小。當系統記憶體不夠時,自然會把 buffers上的資料清出 (flush) 至磁碟並釋放有關記憶體。過大 buffers (超過幾百 MB) 一般表示儲存子系統有問題,導至buffers上的資料無法清出。
cache (快取) 則表示被使用作檔案讀取快取 (read cache) 的記憶體大小。同樣在記憶體不夠時,部份 cache 使用的記憶體會被釋放。當系統正進行大量讀取工作,此值若高會是不錯的現象。但如果此值在有大量讀取工作時過低 (少於總記憶體大小的四成),這表示系統到了需要增加記憶體的時候。
對大部份伺服器工作,當置換空間 (swap) 被使用時,一般都會拖慢整個系統。除 Oracle 等本身會盡用置換空間的服務外,一般伺服器在開始使用超過幾 MB 的置換空間時,就表示需要進行一些微調工作。


任務區 (Task Area)
任務區會顯示Process耗用系統資源的資訊。每個Process預設會顯示以下資料:









PID (Process ID) - Process ID
USER (Effective user name) - 執行此Process的owner。
PR (priority) - Process的優先值,數值越小表示進程的優先順序越高。
NI (nice) - Process的 nice 值,會影響進程的優先順序 (priority),可以為 20 至 -19 任何一個整數,數值越小會令進程的優先序越高。
VIRT (Virtual memory) - Process使用的總虛擬記憶體 (virtual memory) 大小,包括Process的程式碼、資料和共用程式庫再加上被置換 (swap out) 的空間,單位為 KiB。VIRT = SWAP + RES.
RES (Resident size) - Process非Swap的實體記憶體大小,單位為 KiB。RES = CODE + DATA
SHR (Shared Mem size) - Process使用的共用記憶體大小,也就是可以和其他進程共用的記憶體空間,單位為 KiB。
S (Stats) - Process的狀態,可以為:
   D (uninterruptible sleep) - 在不可中斷的休眠中 (一般為正在進行輸入/輸出)
   R (running) - 在運行中或可以被運行 (即在運行序列 run queue)
   S (sleeping) - 在可以被中斷的休眠中 (一般是正在等待某事件完結)
   T (traced or stopped) - 已被停止。因工作控制訊號 (job control signal) 或Process在被追蹤中。
   Z (Zombie) - 不能運作的進程,即所謂殭屍進程。一般因為已終止但未能被其母進程成功接收的進程。
%CPU (CPU usage) - 由上次 top 畫面更新資料後Process的 CPU 使用率。為Process佔用的 CPU 時間除以實際時間 (CPU 時間 / 實際時間),以百分比顯示。顯示小數點後一個位。可以按 I 鍵切換 Irix 模式 (一般計算方法) 和 Solaris 模式 (一般的 CPU 使用率再除系統的處理器數目) 改變此欄顯示的數值。
%MEM (Memory usage) - Process佔用實體記憶體大小與系統總實體記憶體大小的比例,以百分比顯示。
TIME+ (CPU Time) - 由進程被啟動至今的總 CPU 時間。可以按 S 鍵切換是否開啟累計模式 (Cumulative mode) 改變此欄顯示的數值。
COMMAND (Command line or Program name) - 啟動Process的命令,可以按 c 鍵切換只顯示程式名稱或整個連參數的命令行。


主要命令:
  • ? 或 h - 顯示說明畫面。
  • q - 離開 top。
  • 【Space】【Enter】 - 更新並重新繪畫整個畫面。
  • d 或 s - 改變畫面更新時間。
  • z - 切換單色或彩色顯示模式。
  • B - 切換是否以粗體強調重要資料。
  • c - 切換進程命令欄只顯示命令本身還是連參數顯示整個命令。
  • f - 改變會顯示的進程資料欄目。
  • o - 改變顯示進程的排序方法。
  • M - 進程依記憶體使用率 (%MEM) 由大至小排列。
  • N - 進程依 PID 由大至小排序。
  • P - 進程依 CPU 使用率 (%CPU) 由大至小排列,預設一般使用此方法排列。
  • T - 進程依總 CPU 時間 (TIME+) 由大至小排列。
  • I - 在 Solaris 和 Irix 模式切換,改變 CPU 使用率的計算方法。預設一般為 Irix 模式,
  • u - 監察有效 UID (effective UID) 為個別使用者的進程。
  • U - 監察個真正/有效 UID 為別使用者的進程。
  • i - 切換只顯示活躍進程 (不顯示閒置進程 idle process) 或所有進程,預設一般顯示所有進程
  • n - 設定顯示最多進程數目,預設一般會盡用畫面的空間顯示最多的進程。
  • = - 解除如 u/U/i/n 等命令或 -p 選項監察進程的過濾,顯示所有進程。
  • x - 切換是否以粗體或反白強調排序的進程資料欄目。
  • y - 切換是否以粗體或反白強調正在運行的進程。
  • b - 切換 x/y 命令強調的資料以粗體還是反白顯示。
  • k - 終止某個進程。
  • r - 改變進程 nice 值,影響進程的優先序。
  • l - 切換是否顯示系統運作時間 (up time) 和平均負載 (load average)。預設會顯示。
  • m - 切換是否顯示記憶體和置換空間 (swap space) 使用率。預設會顯示。
  • t - 切換是否顯示進程 (task) 和 CPU 狀態。預設會顯示。
  • 1 - 切換以一列顯示所有 CPU 的平均狀態還是每一個 CPU 顯示一列狀態資訊。預設會只顯示一列平均狀態。

也可以直接下命令,例如: top -o %CPU

在 top 命令中,-o 是用來指定排序的選項。具體來說,-o 後面跟著您想要排序的欄位名稱,例如 %CPU 或 %MEM。

這表示您希望 top 根據 CPU 使用率(%CPU)進行排序,這樣 CPU 使用率最高的進程會顯示在最上面。


更詳細的內容請參考以下的鏈結:
http://wiki.linux.org.hk/w/Monitor_processes_with_top

2017年6月2日 星期五

Makefile當中 CFLAGS, LDFLAGS, LIBS的使用方法

1. 首先是CFLAGS: 
       說明: 在Makefile當中這個變數是用來指定header所在的位置
       用法: CFLAGS=-I/usr/include/ -I/usr/local/include (指定兩個以上用空白隔開)

2. LDFLAGS:
       說明: 用來指定編譯時所需要用到的Library的路徑位置
       用法: LDFLAGS=-L/usr/lib -L/lib/ (指定兩個以上用空白隔開)

3. LIBS:
       說明: 用來告訴Makefile需要用到的Library檔名叫做甚麼
       用法: LIBS=-lpthread -lz 

2017年5月22日 星期一

IE遇到日曆 網路對話無法運作的問題,解決的方法

如果你操作IE,遇到"日曆網路對話"沒辦法正常運作的情形(選了無反應,或是下面的功能根本叫不出來),如下圖:













解決方法只需在IE的設定--->相容性檢視 的地方




















把你要操作日曆的網址加入下圖的位置,應該就可以正常操作了~

2017年4月27日 星期四

將ubuntu 14.04桌面, 換成類似windows的Style

新版的ubuntu操作介面用起來實在很不習慣,其實只要安裝一個Gnome套件就可以類似windown的操作介面了

安裝指令如下:
     sudo apt-get update; 
  sudo apt-get install gnome-session-fallback;

安裝完成之後,先登出然後在登入的地方可以看到如下圖,請選紅色框框















然後會出現下圖選項,請選擇 Compiz



















接下來登入進去就會看到Style不一樣了,用起來會比較上手!



2017年3月7日 星期二

交叉編譯memtester來測試記憶體是否有問題

要把memtester移植到arm的版子上來執行,因為memtester本身沒有configure的script來幫你產生Makefile,不過只需要去修改下面兩個檔案就可以達到cross-compiler的目的
1. conf-cc
2.conf-ld

1. 首先來看conf-cc這支,原使內容是使用cc來當作compiler,而我們就只需要把cc改成我們arm的toolchain,所以修改方式如下:

原始內容:
cc -O2 -DPOSIX -D_POSIX_C_SOURCE=200809L -D_FILE_OFFSET_BITS=64 -DTEST_NARROW_WRITES -c

This will be used to compile .c files.

修改後:
/home/danny/toolchain/bin/arm-linux-gnueabi-gcc -O2 -DPOSIX -D_POSIX_C_SOURCE=200809L -D_FILE_OFFSET_BITS=64 -DTEST_NARROW_WRITES -c

This will be used to compile .c files.



2. 接著是conf-ld,修改方式也與上面大同小異,修改方式如下:

原始內容:
cc -s


This will be used to link .o files into an executable.

修改後:
/home/danny/toolchain/bin/arm-linux-gnueabi-gcc -s

This will be used to compile .c files.


修改完上述的兩個檔案後,接著指需執行make就可以編譯成功了!!!

====================================================================


memtester的使用方式如下:

memtester [要測試的大小] [測幾個循環]
ex: memtester 512M 5    // 測試512MB共測試5個round


另外還有其他參數 "-p", "-d",這個參數作者沒實際使用過,不過從README解讀的作用大概如下所述:

"-p"
./memtester -p 0x0 64k 1       //直接對實體位置(physical address) 64K的測試一次


"-d"

./memtester –p 0x0 –d /dev/foodev 64k 1    // 若是沒有/dev/mem這個character device,用-d指定memory device.




2017年3月2日 星期四

在linux下,SVN基本的指令

首先先來了解 SVN Trunk, Tags, Branches 這三個的概念

  • trunk: Main line of development(主要的開發線)
  • tags: Releases (想要 Release 時, 可以標Tag, 之後可依 Tag 來找回之前版本的資料)
  • branches: Preparation of release, bug fixing(分支)


接下來是SVN 基本功能,以及指令操作:


Import: 將整個 project_directory 的資料 import 進 svn 裡面

  • svn import project_directory http://domain_name/svn_project



Checkout: 將整個project從svn checkout 回來

  • svn co http://domain_name/svn_project
  • svn co -r 5 http://domain_name/svn_project # checkout第5版的 projcets



List: 列出project中的檔案/資料

  • svn ls http://domain_name/svn_project


Update: 將目前版本更新成 SVN Server上最新版本.

  • svn up


Commit: 將目前所修改的部分 commit 回 SVN Server

  • svn ci


Status: 查看目前檔案結構 跟 SVN Server上的版本有哪些不同

  • svn st


Add: 新增檔案或目錄到 svn

  • svn add File 或 svn add DIR


MV: 更改檔名, 並且此檔案之前紀錄還要繼續留下

  • svn mv filename new_filename


Revert: 還原這次的修改, 回到前一版(未 commit 前可使用)

  • svn revert [File | DIR]


SVN 檔案狀態資訊:

?: 此檔案不存在 SVN 裡面
A: 此次新增的檔案
C: 此檔案已經有人改過, 合併不成功, 需要人工介入
D: 此次移除的檔案
M: 此檔案有修改過
U: 此檔案有被更新過



另外有進階的指令:

建立一個 branch:

  • svn copy http://domain_name/trunk http://domain_name/branches/my-branch -m 'create a branch' 

建立 Release Tags:

  • svn copy http://domain_name/trunk http://domain_name/tags/Release_0.1 -m 'create Release tags for Release 0.1'


合併兩個版本的檔案     //參考自: 用 Subversion 的 Merge 來 Undo

svn merge -r REV1:REV2 {path/to/workingcopy}
 (UNDO) svn merge -r 123:122 ...
 (MERGE)svn merge -r 123:124 ...
svn merge --dry-run -r 343:344 http://domain_name/trunk



有 "C" 狀態處理完後, 用 resolved  將自動產生的檔案刪除, 才能正常 commit:

  • svn resolved filename    //會把自動產生 diff 等等的檔案刪除



找版本間有什麼不同 diff:

  • svn diff     //自動以現在檔案跟 SVN 內最新版做 diff
  • svn diff -r123:124


Info: 列出現在路徑, 版本編號, 最後一次修改日期等等的資訊

  • svn info


Log: 如果沒輸入參數, 預設會把所有 commit log 都列出來

  • svn log
  • svn log -l 10    //顯示最新10筆Log
  • svn log -c 100    //顯示 revision 100 的 Log
  • svn log -v -c 100    //顯示 revision 100 的詳細 Log
relocate: 假設你的SVN Server換IP Address了,使用此參數來重新定位你目前的這包code
  • svn relocate svn://192.168.1.3/home/repos/test/branch/FW


Propset (propset, pset, ps): 版本控制都有些特殊 Keyword 設定, 如 Id 就是最常用的, 設定方法如下:

在檔案內找地方加入 $Id$
設定此檔案要能吃 Id 的 Keyword: svn ps svn:keywords 'Id' filename (只需設一次即可, 之後就不用再設)
svn ci 後, $Id$ 會自動代換成 $Id:filename 編號 年月日時分秒 username $ 的資訊
svn help ps 可以看到有哪些 Keyword 可以用, 即 Keyword 的說明.(ex: URL, Author, Date, Rev, Id 等.)

2017年2月24日 星期五

Linux內核驅動程序初始化順序的調整


今天在做一個驅動的時候要用到另一個驅動(I2C)提供的API,在內核初始化時碰到了一個依賴問題。

我的驅動在I2C初始化之前就運行起來了,而這時I2C提供的API還處於不可用狀態。查了很多資料,網上有人說所有使用module_init這個宏的驅動程序的起動順序都是不確定的(我沒有查到權威的資料)。

所有的__init函數在區段.initcall.init中還保存了一份函數指針,在初始化時內核會通過這些函數指針調用這些__init函數指針,並在整個初始化完成後,釋放整個init區段(包括.init.text,.initcall.init等)。

注意,這些函數在內核初始化過程中的調用順序只和這裡的函數指針的順序有關,和1)中所述的這些函數本身在.init.text區段中的順序無關。在2.4內核中,這些函數指針的順序也是和鏈接的順序有關的,是不確定的。在2.6內核中,initcall.init區段又分成7個子區段,分別是
?
1
2
3
4
5
6
7
.initcall1.init
.initcall2.init
.initcall3.init
.initcall4.init
.initcall5.init
.initcall6.init
.initcall7.init
當需要把函數fn放到.initcall1.init區段時,只要聲明
?
1
core_initcall(fn);
即可。
其他的各個區段的定義方法分別是:
?
1
2
3
4
5
6
7
core_initcall(fn) --->.initcall1.init
postcore_initcall(fn) --->.initcall2.init
arch_initcall(fn) --->.initcall3.init
subsys_initcall(fn) --->.initcall4.init
fs_initcall(fn) --->.initcall5.init
device_initcall(fn) --->.initcall6.init
late_initcall(fn) --->.initcall7.init


而與2.4兼容的initcall(fn)則等價於device_initcall(fn)。各個子區段之間的順序是確定的,即先調用.initcall1.init中的函數指針,再調用.initcall2.init中的函數指針,等等。而在每個子區段中的函數指針的順序是和鏈接順序相關的,是不確定的。

在內核中,不同的init函數被放在不同的子區段中,因此也就決定了它們的調用順序。這樣也就解決了一些init函數之間必須保證一定的調用順序的問題。按照include/Linux/init.h文件所寫的,我在驅動裡償試了這樣兩種方式:

?
1
2
__define_initcall("7", fn);
late_initcall(fn);
都可以把我的驅動調整到最後調用。實際上上面兩個是一回事:
?
1
#define late_initcall(fn) __define_initcall("7", fn)