2018年12月25日 星期二

如何幫小孩辦理護照,流程紀錄

準備文件:
1.2吋照片*2(下巴到頭頂長度至少3.2cm, 背景需全白, 眼睛直視鏡頭,不可露牙齒,劉海不可遮住額頭,耳朵需露出)
2.戶口名簿正本與影本,影本會被收走
3.小孩本人需親自去
4.父母或監護人需陪同辦理,同時需要父母或監護人的身分證正本

如何自製照片:
手機APP: Photo for Passport
電腦後製軟體: PhotoCap

1. 先使用手機拍照,背景盡量白色,光線充足,依照APP指示拍照,建議儲存jpg檔
2. 拍完照之後,把相片傳到電腦上,使用PhotoCap編輯,PhotoCap可以作去背,讓背景變成全白
3. 再使用PhotoCap把照片作成護照格式(4x6共8張大頭照)
4. 到萊爾富把照片洗出來,$6/1張4x6

*若是沒有準備好照片,也可以到外交部一樓,有兩台快照機,拍一次 $120/6張

辦理地點:
外交部領事局(台北市濟南路一段2-2號)

辦理過程:
1. 若是開車去辦理的朋友,可以直接停在外交部領事局旁邊的台大校友停車場,收費$60/H
2. 進入外交部領事局後,在一樓有自動列印資料的機器,印出來後把資料填一填,填寫申請表時, 需要中英文姓名對照表查詢(https://www.boca.gov.tw/sp-natr-singleform-1.html)
3. 在一樓把資料繳交出去,替代役男會幫你檢查蓋章,並給你號碼牌,接著就可以上二樓等叫號了
4. 等到號碼之後,把資料繳出去後,沒問題就會收到繳費收據,小孩$900,大人$1300,需要4個工作天才可以去拿
5. 也可以把收據交給郵局(1F),請他們代為寄送護照,就不用在親自跑一趟,費用 ==>外縣市每件120+12元

通常1.5H內可以辦理完成 ~


最後,若是還有多餘時間,可以帶小朋友到附近的花博公園-舞蝶館 (台北市中山區玉門街1號),去玩耍,因為離松山機場很近,還可以看到很大的飛機,車子可以停在美術館的公有停車場,是不用收費的~

2018年11月26日 星期一

在Linux底下,使用setpci 來設定/讀取 Intel CPU register值

假設我們今天想要更改Intel CPU的PowerResume,首先你必須知道你要改的是文件裡面的AG3E的Register值,其文件大概會如下圖所示:




















首先看到Type,確定他是屬於PCI Configuration Register,你才能夠使用setpci tool來作更改,接著我們可以看到,Offset: [B:0, D:31, F:2]+A4h

其中的英文分別代表 Bus, Device, Function,如文件所描述,我們要更改的為第0個bit,假設我們要把值設定為1,因此在Linux底下我們的指令下法為:

setpci -s 00:1F.2 A4.B=01     
*註(31=1Fh), A4.B意思是從A4寫1Byte

假設你想再把值讀出來看,在Linux底下我們的指令下法為:

setpci -s 00:1F.2 A4.B

2018年10月16日 星期二

縮網址教學-0rz

以下介紹 0rz 的縮網址方法

 一. http://0rz.tw/

假設我想把我的blog網址作縮網址的動作,步驟如下:

1. 進入上面的網站



























2.輸入想要縮的網址,如下圖:



3. 按下"產生短網址"按鈕




4. 已經幫你產生了一個新的短網址,如下圖:


2018年10月9日 星期二

Linux下如何修改Ethernet Interface 介面名稱

假設我想把網路介面名稱改成 eth0, eth1
可以去修改 /etc/udev/rules.d/10-net.rules

內容如下:
SUBSYSTEM=="net", ATTR{address}=="20:18:10:04:10:00", ACTION=="add", NAME="eth0"
SUBSYSTEM=="net", ATTR{address}=="20:18:10:04:10:01", ACTION=="add", NAME="eth1"

**ATTR{address} ===> 必須對應到此介面的MAC Address


或是另一種寫法,使用kernel版本來對應:
SUBSYSTEM=="net", KERNELS=="0000:05:00.0", ACTION=="add", NAME="eth0"
SUBSYSTEM=="net", KERNELS=="0000:05:00.1", ACTION=="add", NAME="eth1"

kernel版本可以從driver的訊息中得到,如下圖:


2018年10月8日 星期一

C語言使用malloc配置一個struct記憶體空間

假設有一個struct如下所示:

struct foo {
     char *a;
     int b;
     char c[20];
};

當我們要用malloc配置記憶體時,通常會用下面的方式來作宣告:


struct foo *ptr = (struct foo *) malloc(sizeof(struct foo));


另一種較簡潔的寫法,如下所示:

struct foo *ptr = malloc(sizeof(*ptr));

2018年10月2日 星期二

編譯Linux Kernel時,版本後面被加了符號,把svn的檔案刪掉的方法

如果你的版本控管是使用svn,Linux Code check out 下來後會有一些svn版本控管的檔案,而這些檔案在你編譯Kernel的時候,會在你的版本號後面多加一些資訊,例如:

- 你使用Kernel 4.14.12版本,並且編譯他,實際上編譯出來的Kernel你使用uname -a 看到的會是4.14.12

- 但若是有伴隨一些svn版本控管的檔案時,編譯出來有可能會是 4.14.12+

以上的差異點,當你編譯module要給別人使用時,別人的Kernel就會報錯,會有如下的訊息:
btn_driver: version magic '4.14.12+ SMP mod_unload ' should be '4.14.12 SMP mod_unload '

======================= 分隔線 =============================
因此要想清除掉svn的檔案,再作編譯Kernel的動作,可以在kernel 根目錄下,用下面的指令:
find . -name '.svn' | xargs rm -rf

清除掉svn檔案之後,再作編譯,就不會有以上的問題發生了~

2018年9月14日 星期五

Ubuntu設定固定時間重新開機 shedule do something

我們可以透過一個工具 ===> crontab

假設你機器上找不到此工具,請先使用apt-get 取得:
sudo apt-get install cron

--------------- 接下來是設定的方法 -------------
1. 先去編輯crontab,命令如下:
#/ sudo crontab -e
**第一次編輯,會詢問你偏好的編輯器,選nano就可以了


2.可以看到文字檔中的說明如下
m      h    dom        mon   dow       command

minute hour dayOfMonth Month dayOfWeek commandToRun
假設我們現在要讓電腦每天早上4點自行重新啟動,請加入下面這行:

0 4 * * * /sbin/reboot



所以最後檔案編輯會如下圖:
















最後按 Ctrl+x 離開並存檔

2018年8月24日 星期五

在Linux作業系統,使用ethtool來切換網路的速度

假設我們要把eth0從10G速度切換成固定1G(關閉Auto-nego),執行下面指令就可以

1. 關閉Auto-negotiation 同時切換網路速度為 1000Mb/s 並設為全雙工
# ethtool -s eth0 autoneg off speed 1000 duplex full



2018年8月6日 星期一

fdisk 自動完成partition,使用一個script來完成切割

把/dev/sda 切一個partition,全部空間都切成一個partition
 echo -e "o\nn\np\n1\n\n\nw" | fdisk /dev/sda


把/dev/sda 切兩個partition,sda1=150GB, sda2=50GB 
echo -e "o\nn\np\n1\n\n+150GB\nn\np\n2\n\n+50GB\nw" | fdisk /dev/sda

2018年8月1日 星期三

busybox 的 udhcpc 執行後,印出的訊息中有取到ip,但是本地端ip沒有更改

今天在我們自己Build的Linux kernel上要使用udhcpc -i eth0來自動分配ip

原先所設定的Static IP為 192.168.1.3 如下:








使用udhcpc -i eth0 指令後,結果出現如下的情形:











udhcpc有從Server端取到IP,但是卻沒設定到eth0介面,後來爬文發現,udhcpc執行的流程會去執行 /usr/share/udhcpc/default.script,這個script會把從Server端取到的IP設定到網路介面


/usr/share/udhcpc/default.script 內容如下:
#################################################
#!/bin/sh

# udhcpc script edited by Tim Riker <Tim@Rikers.org>

[ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1

RESOLV_CONF="/etc/resolv.conf"
[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
[ -n "$subnet" ] && NETMASK="netmask $subnet"

case "$1" in
  deconfig)
    /sbin/ifconfig $interface 0.0.0.0
    ;;

  renew|bound)
    /sbin/ifconfig $interface $ip $BROADCAST $NETMASK

    if [ -n "$router" ] ; then
      echo "deleting routers"
      while route del default gw 0.0.0.0 dev $interface ; do
        :
      done

      for i in $router ; do
        route add default gw $i dev $interface
      done
    fi

    echo -n > $RESOLV_CONF
    [ -n "$domain" ] && echo search $domain >> $RESOLV_CONF
    for i in $dns ; do
      echo adding dns $i
      echo nameserver $i >> $RESOLV_CONF
    done
    ;;
esac

exit 0
####################################################

請自行新增這個檔案,並且使用 chmod 777 /usr/share/udhcpc/default.script,確保可執行。
之後再去執行udhcpc -i eth0 就可以了

可以使用的ntp server的domain name 與 ip address

Domain Name: tw.pool.ntp.org

IP Address: 103.18.128.60

我們可以使用ntpdate去同步ntp_server時間,最後使用指令hwclock -w 來寫入到hwclock

2018年7月23日 星期一

【Linux】如何分辨/dev/底下的裝置名稱,是SATA硬碟 或是 USB硬碟

使用下面的方法可以分辨:
SATA:
ls -l /sys/class/block | grep ata


usb:
ls -l /sys/class/block | grep usb


M.2:
ls -l /sys/class/block | grep nvme

【Linux】mount fat32 格式,chown 回應 "operation not permitted"

事由:
今天我有一支USB隨身碟,他是Fat32格式的,我在Linux使用mount指令把它掛載起來

後來要透過Samba到遠端電腦來修改此USB碟的內容,出現權限不足的問題

因此我使用chown想把它的owner改為nobody,卻出現"operation not permitted"的錯誤訊息









原因&解決方法:
查了一下原因如下:
因為chown(或是chmod)是在Linux的檔案系統才能夠使用的,FAT32或NTFS是無法使用這個指令來操作,而解決方法只有在mount的時候,指定你要操作的人的uidgid

例如我原本想要把owner改為 nobody:nobody
===> 首先,先去確認你的passwd當中,nobody的uid與gid








如上圖,uid與gid都為99
所以我只需要在掛載時,使用下面的指令即可:
mount -t vfat -o rw,uid=99,gid=99 /dev/sdc1 /mnt/USB1


2018年7月20日 星期五

除錯工具strace的用法


strace   [parameter]   [除錯的執行檔]

執行 strace 相關參數
-o ( strace 程式的過程寫至指定的 file )
-s (最多一次 print xxx bytes 的訊息)
-p (strace pid 程序的執行過程)
-f (strace 某子程序的執行過程)

例如:   我執行smbd遇到無法跑在背景,卻又沒有任何錯誤訊息
就可以使用strace來觀察錯誤的原因
===> ./strace -o aa.log -s 1024 /sbin/smbd -D

2018年7月3日 星期二

【shell script】[ :Unexpected operator in shell

今天把一支寫好的script放到Ubuntu跑,原本在板子上的Linux上跑是沒有問題的,但在Ubuntu上Run出現了錯誤訊息,簡單的程式如下所示:

############## test.sh ################
#!/bin/sh

NAME="danny"
NUM=56

if [ $NAME == "david" ]; then
    echo "This is david"
else
    echo "This is danny"
fi

if [ $NUM -gt 48 ]; then
    echo "num great then 48"
fi
####################################

執行程式後的錯誤訊息:
./test.sh: 6: [: danny: unexpected operator


找了一下原因,原來是因為 sh的語法並沒有 "==" 這種語法,而是必須使用單一個"="

而"=="這語法,是bash在使用的

因此解決方法有兩個:

    1. 把程式第一行的 #!/bin/sh 改成 #!/bin/bash

    2. 把語法 "==" 改為 "="



2018年6月7日 星期四

在Linux底下,使用netstat指令來觀察哪些 TCP port 被使用

netstat是busybox提供的一個工具,我們可以透過netstat看到,目前TCP port有哪些已被使用,並可以看出是哪些Process佔用的

指令: netstat
參數:
        -r      Routing table
        -a      All sockets
        -l      Listening sockets
                Else: connected sockets
        -t      TCP sockets
        -u      UDP sockets
        -w      Raw sockets
        -x      Unix sockets
                Else: all socket types
        -e      Other/more information
        -n      Don't resolve names
        -W      Wide display
        -p      Show PID/program name for sockets


實際用法: 我們可以透過以下的指令,觀察出port:23 目前是被Telnetd所佔用的
# netstat -ltp



2018年6月6日 星期三

Ubuntu 16.04 Linux 新增一個automount script,並在開機時自動執行

首先介紹這隻準備加入的Script,automount.sh,其實這隻動作很簡單,我打算在開機的過程中,讓他自動把兩顆HDD分別掛載在 /HDD1 與 /HDD2 資料夾

其內容如下:
============== automount.sh ==============
#!/bin/sh
mount /dev/sda1 /HDD1
mount /dev/sdb1 /HDD2
=======================================

接著該如何讓他在開機過程中就自動執行,先把 automount.sh放在 /etc/init.d/,另外要注意這個script的權限要是可以執行的,我們可以把權限全開
#chmod 777 /etc/init.d/automount.sh

我們可以在/etc/rcS.d/ 底下,新增一個link檔,名為S99automount,建立的指令如下:
# ln -S /etc/init.d/automount.sh /etc/rcS.d/S99automount

因為/etc/init.d/rc 會去掃描/etc/rcS.d/ 裡面的檔案 ,並且依照優先順序把/etc/rcS.d/ 底下的 Script都跑過,S99 就表示優先順序是很後面的

這樣子加完之後,開機後就可以看到sda1, sdb1 都自動被mount起來了~

2018年5月24日 星期四

[shell script] shell script 的Debug方法

假設有一支Shell script 名為TEST.sh,我們可以使用下面的指令來作Debug

sh -x TEST.sh

執行下去之後,會印出整個shell執行的內容與過程,透過這些內容,你可以發現是否有哪些變數寫錯了~

2018年5月16日 星期三

[shell script] 將script 指令指派給變數的方法,變數可取得回傳值

兩種方法可以達到此目的

1. 變數=`command`
ex:
     nowDate=`date  +%s`


2. 變數=$(command)
ex:
    nowDate2=$(date +%s)



寫一個測試shell script
========== command.sh =============
#!/bin/sh
nowDate=`date +%s`
nowDate2=$(date +%s)

echo "nowDate=$nowDate"
echo "nowDate2=$nowDate2"
=================================

實際測試結果,如下圖:



[Linux] Linux中設定rtc alarm時發生 "Device or resource busy" 的解決方法

今天在驗証rtc alarm的功能,我們使用shell script來完成,驗證此功能的步驟大概如下

1. 使用 nowDate=`date +%s`來取得目前rtc時間,並且先存放在變數 nowDate

2. 把關機之後預計幾秒後使用 rtc alarm 把系統叫起,假設10s後叫起,我們會使用 wakeDate=`expr $nowDate + $defaultAlarm` ,把變數存放在變數wakeDate

3. 再來就是把wakeDate存放到你rtc alarm再Linux當中所開出來的介面,rtcPath=/sys/class/rtc/rtc0/wakealarm
echo "$wakeDate" > "$rtcPath"

上面的作法我發現,常常在寫入rtc alarm interface的時候,會出現 sh: write error: Device or resource busy 的錯誤訊息,而導致$wakeDate沒有正確的寫入

4. 後來發現,原來寫入之前必須先清空rtc alarm的內容,因此在設定之前必定先加入下面這行
echo 0 > "$rtcPath"


這樣便沒有問題了!!

2018年5月15日 星期二

[汽機車] 機車換電瓶DIY,sym 風100 efi

今日主角:





















今天幫家裡的機車換了電瓶,其實換電瓶很簡單,沒有經驗的人也可以1個小時內完成。

首先介紹sym的風100 efi,所使用的電瓶為GS牌型號是GTX7A-BS,你只需要去電池的材料行,跟老闆說要買這個型號的就行了














上圖這顆是舊的電瓶,看上面紀錄的日期,也已經用了7年 @@"都沒有更換,也算是壽終正寢了


接下來準備換上新的電池,這台機車電瓶放置的位置在腳踏墊下方,只需拆卸四顆螺絲,就可以把存放電池的朔膠蓋打開,如下圖,紅圈是螺絲的地方,踏墊底下也有兩顆螺絲




























打開後必須先把舊電瓶移除,請先拆負極(黑色線)再拆正極(紅色線)

接下來要安裝新的電瓶,紅色線安裝在電瓶的 + ,黑色線安裝在電瓶的 -,安裝順序先鎖緊正極(紅色線),再去鎖負極(黑色線)

裝好後再把蓋子鎖回去即可

店面買這一顆電池,差不多要$600,網購可以更便宜,如果直接給機車行換,至少要$800吧!

*註: 換下的電瓶,可自行拿去資源回收場,可以賣30元左右

2018年5月4日 星期五

[Windows] BAT批次檔開啟後,不關閉視窗的方法,還可以繼續下命令

EX: 我寫一個批次檔執行 ipconfig 來印出電腦的ip資訊

請使用滑鼠點擊這個寫好的批次檔,是不是一閃而過,甚麼都沒看到 ...


解決方法:
cmd /k ipconfig


只要按照上面寫法,執行完ipconfig之後,視窗不會關閉,還可以繼續下別的命令~

所以解答就是加上 "cmd /k" 就可以了

2018年4月25日 星期三

Ubuntu發行版更換Linux Kernel的方法

首先我們必須到下面的網址去下載想要升級的版本
http://kernel.ubuntu.com/~kernel-ppa/mainline/

以這次的實驗為例子,我們想把 4.10.0的 Kernel版本升級為 4.14.12

我們的電腦,安裝64位元的Ubuntu
因此我們先透過上面的link找到如下圖的檔案:

































下載三個檔案,下載完成後把這三個檔案放在同一個資料夾

  • linux-headers-4.14.12-041412_4.14.12-041412.201801051649_all.deb
  • linux-headers-4.14.12-041412-generic_4.14.12-041412.201801051649_amd64.deb
  • linux-image-4.14.12-041412-generic_4.14.12-041412.201801051649_amd64.deb

接著我們在要安裝的Ubuntu那端,對這三個檔案,執行下面的指令

# sudo dpkg -i *.deb

若是產生 Grub設定檔的部分有Warning訊息,請使用下面指令來更新Grub

# sudo update-grub

安裝完成後,先重新開機,開機後使用 "uname -a" 確認kernel版本應該已經更新到4.14.10

Linux 設定 DNS Server

在Linux底下, 有個設置 DNS 位置的設定文件 ===> /etc/resolv.conf

因此我們只需修改此檔案,來增加我們想要設置的DNS Server

假設我們要增加 168.95.1.1

#vi /etc/resolv.conf
#================= resolv.conf ===============
nameserver 168.95.1.1

#========================================

只需要增加 nameserver那行,這樣就可以了

2018年4月23日 星期一

[Linux Embedded System] Linux的Serial port(ttyS1) 無法登入&輸入訊息,但是透過VGA(tty1)的卻可以

今天遇到了一個很奇怪的問題,首先我的平台有兩個終端介面可以使用,一個是透過VGA輸出到螢幕的終端介面,可供我們對機器下指令。另一個則是透過Serial port(UART),利用Tera Term或是putty等軟體,來對機器下指令

今天遇到的問題是,進入Linux系統之後,VGA那邊的終端介面可以順利的輸入訊息,機器也能順利的給予回饋,而Serial port的部分則是無法輸入任何訊息,看起來就像是無法進到sh一樣(如下圖)。















我也嘗試了一下,從能夠下指令的VGA那方,輸入下面的指令
#echo "ls" | sh > /dev/ttyS1

結果在ttyS1那方還真有一些回饋訊息,看來問題是跟sh有所關係

















後來找了一些資料,發現可能的問題出在/etc/inittab

最後的解決方法,是去修改/etc/inittab 這之檔案,在裡面的內容多加一行 ttyS1::respawn:-/bin/sh

















重新啟動之後便能夠順利的進入shell 模式底下囉!!!


*註
若是進入到 Linux Kernel 底下,無Serial 訊息,請先確認您的硬體是使用UART1 或 UART2
UART1 就必須指定你的Console參數 ===>  Console=ttyS0
UART2 就必須指定你的Console參數 ===>  Console=ttyS1


2018年4月19日 星期四

#pragma pack() 的用途與用法


#pragma pack 會要求compiler 使用特別的對齊方式來包裝 Structure Member . 大多數的compilers, 當你宣告一個結構時, 將會在彼此成元之間插入 padding 來確保他們在記憶體中的對齊。下面舉個例子:

struct Test
{
   char AA;
   int BB;
   char CC;
};

 compiler 可能會在記體中選擇以下列的方式來排列對齊:

|   1       |   2       |   3       |   4       |  

| AA(1) | pad..............................|
| BB(1) | BB(2) | BB(3) | BB(4) |
| CC(1) | pad..............................|
雖然真正的資料只佔了6 (byte),但是 sizeof(Test) 結果會是 4 × 3 = 12(byte)



#pragma比較常使用的時機,是在與Hardware device作溝通的時候,你為了要確保compiler不會插入padding,這時候你就會使用 #pragma pack(1),而結構的排列就會如下:

|   1      |

| AA(1) |
| BB(1) |
| BB(2) |
| BB(3) |
| BB(4) |
| CC(1) |
sizeof(Test) 結果就會變成 1 × 6 = 6(byte).


如果是使用 #pragma pack(2), 結構的排列就會如下::

|   1       |   2       | 

| AA(1) | pad... |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
| CC(1) | pad... |
sizeof(Test) 結果就會變成 2 × 4 = 8(byte).



下面是一個簡單的範例,我們使用#pragma pack(1),並印出structure 大小:
==================   pragma.c  ==========================
#include <stdio.h>

int main()
{
#pragma pack(1)
        struct test {
           char A;
           int B;
           char C;
        };

        typedef struct test Struct_Test;

        Struct_Test AA;
#pragma pack()
        printf("Sizeof Struct_Test is %d\n", (int)sizeof(AA));
        return 0;
}
====================================================

執行結果:


2018年4月11日 星期三

架設 Mantis 遇到 SMTP server 無法寄信的問題,使用Gmail的SMTP server

請先去修改 /var/www/html/mantis/config/config_inc.php
( 或是{mantis_path}/config_inc.php ) 如果缺少此檔,就自己新增一個 ~

=================================================
<?php
$g_hostname               = 'localhost';
$g_db_type                = 'mysqli';
$g_database_name          = 'bugtracker';
$g_db_username            = 'root';    #input your database server username
$g_db_password            = 'root';    #input your database server passwd

$g_default_timezone       = 'Asia/Taipei';

$g_crypto_master_salt     = 'RKCEdulaQd4f+j8zNfdcVzRMjrM4DXI1OlhAZtjNntc=';

$g_phpMailer_method= PHPMAILER_METHOD_SMTP ;
$g_smtp_host= 'smtp.gmail.com';
$g_smtp_username = 'your_gmail_account@gmail.com';
$g_smtp_password = '*******';         #input your smtp server passwd
$g_smtp_connection_mode = 'ssl';
$g_smtp_port = 465;
?>
========================================================

改完之後重新啟動apach即可
#/etc/init.d/apache2 restart

2018年4月10日 星期二

【shell script】Script中,單引號與雙引號,對於變數的差別


變數(例如$Num) 當在'  '裡面時 就只被當作一個字串而不會自動轉成變數的值
ex:
   Num=6
   1. echo '${Num}'     ===>   ${Num}
   2. echo "${Num}"    ===>   6


另外當script有error時,可以透過 -x 參數來作Debug
sh -x /test.sh  <====可以做Debug用途

2018年4月9日 星期一

位元(bit)運算的方法

將 X 變數的第 n 個位元設定為 1 (bit從0開始數):

        X = X | (1 << n)

Example_1:
    X = 11110010,假設我們要把第2個bit改為1

    ==>  X = (11110010) | (1 << 2)
    ==>  X = (11110010) | (00000100)
    ==>  X = 11110110

Example_2:
    X = 11110010,假設我們要把第0個bit改為1

    ==>  X = (11110010) | (1 << 0)
    ==>  X = (11110010) | (00000001)
    ==>  X = 11110011



將 X 變數的第 n 個位元設定為 0 (bit從0開始數):

        X = X & ~(1 << n)

Example:
    X = 11110010,假設我們要把第1個bit改為0

    ==>  X = (11110010) & ~(1 << 1)
    ==>  X = (11110010) & ~(00000010)
    ==>  X = (11110010) & (11111101)
    ==>  X = 11110000



【Linux cmd】Linux查看資料夾大小的指令

先簡單介紹一下 du 指令的用法:
# du [參數] [檔案/目錄]

可使用的參數列表如下:
============================
-a | 顯示目錄中個別檔案的大小
-b | 以bytes為單位顯示
-c | 顯示個別檔案大小與總和
-D | 顯示符號鏈結的來源檔大小
-h | Human readable
-H | 與-h類似, 但是以1000為k的單位而非1024 bytes為區塊的單位
-l | 重複計算鏈結黨所占空間
-L 符號鏈結 | 指定符號鏈結檔的大小
-m | 以 MB 為顯示單位
-s | 只顯示總和
-S | 顯示目錄內容時, 不包含子目錄大小.
-x | 若目錄中有不同的檔案系統, 不顯示相異的檔案系統
--exclude | 忽略指定的檔案或目錄
--max-depth | 僅搜尋指定的目錄層級
==================================

Example(直接看範例怎麼使用):

要查看某個資料夾總大小,可以使用以下的指令(以KB顯示):
#du -s FolderName

若是想直接以 MB 或是 GB 顯示,可以加入-h的參數,指令如下:
#du -sh FolderName

實際操作如下圖:







若是想找出當下目錄,空間佔據前5大的資料夾或檔案,則我們可以搭配管線指令來找出來:
#du -sh * | sort -rn | head -5

2018年4月2日 星期一

【Linux cmd】在Ubuntu Terminal下,把使用者改成具有admin權限

此範例我們新增一個tester使用者,並讓他有admin權限能使用sudo

1. 首先我們必須要先有一個admin權限的使用者先登入(例如:root)

2. 接著使用下面指令,新增一個使用者,過程中會要求你輸入密碼:
#adduser tester

3. 接著我們使用指令"usermod" 來把tester 加入到 sudo 群組
#usermod -a -G sudo tester


接下來你就可以使用 sudo 來作一些需要權限的事情了~

2018年3月27日 星期二

【Linux Tool】i2c-tools 的使用方法, i2cdetect 、 i2cdump、i2cset

i2c-tools是一套OpenSource,透過這個tools我們可以透過i2c 介面與 IC 去作溝通

我們可以到下面的網站去抓整包的SourceCode,然後再透過你的toolchain去編譯出你板子上可以使用的工具,而編譯的方式我這邊就不贅述,我們這篇著重在tool如何使用

Download Path:
https://i2c.wiki.kernel.org/index.php/I2C_Tools

====================================================================
編譯完成後你應該會有i2cdetect、i2cdump、i2cset 這幾個執行檔

i2cdetect  ===> 會列出 i2c的 Bus上所有的Device
i2cdump   ===> 會列出 Device上所有的 Register值
i2cset       ===> 可寫入到某個 Bus上的某個 Device上的 Register值


以下是實際操作的範例:
#./i2cdetect -l     ===> 列出總共有幾個 i2c Bus












從上圖我們可以知道,這台設備上總共有 0 ~ 8 個 I2C Bus


另外我們也可以使用 i2cdetect 來確認 Bus上有哪些 Device
#./i2cdetect -r -y 1   ===> 列出 Bus 1上的所有Device













從上圖我們可以知道,這台設備的 I2C Bus1上,有4個Device,位置分別在 0x37, 0x4a, 0x4b, 0x50


接著我們來使用i2cdump來把某個 Register的值列出來吧!
#./i2cdump -f -y 1 0x50  ===> 列出 Bus1 的 Device 0x50的 Register值














最後我們使用 i2cset來更改Register的值吧!
#./i2cset -y 1 0x50 0x36 0x05  ===> 寫入 Bus1 的 Device 0x50的 0x36 Register值 寫入 0x05

註: i2cset的用法:
#./i2cset -y <bus> <device> <register> <value>

2018年3月14日 星期三

讓 Ubuntu 可以透過網路 ssh登入

只需要安裝ssh server,安裝指令如下:
#apt-get install openssh-server

之後Ubuntu開機會自己啟動 ssh server ~

安裝完成之後也可以透過netstat 指令來確認 sshd有在port 22啟動
#netstat -tulpn | grep 22

如何讓Ubuntu 16.04 啟動時,直接進入文字模式,不進入X11

很簡單,只需要下面一行指令,他會幫你把link到 lightmd 的link檔案刪除,因此開機就直接進入文字介面
1. sudo systemctl disable display-manager


如果想要恢復,一開機就進入X11 GUI介面:
1. sudo ln -s -f /lib/systemd/system/lightdm.service /etc/systemd/system/display-manager.service


如果在文字模式下,想要暫時回到X11模式,可以先輸入:
1. /usr/sbin/lightmd

2018年2月1日 星期四

【shell script】shell script的 "字串比較","數字相加","數字判斷","數字累加","取字串長度",的用法

shell script 的字串比較:
                  yn="GG"
                  if [ "${yn}" == "GG" ]; then
                         echo "is the same !!"
                  fi

shell script 的字串比較方法2 (如果上面判斷行不通):
                  yn="GG"
                  um="GG"
                  if [ ${yn} == ${um} ]; then
                         echo "is the same !!"
                  fi


shell script 的數字相加:
                  a="10"
                  b="20"
                  c=`expr $a + $b`

shell script 的數字判斷:
                  declare -i num="60"
                  if [ $num -gt 50 ]; then
                          echo "correct !!!"
                  fi

shell script 的數字累加:
                  count="1"
                  count=$(($count+1))
                  echo "$count"

shell script 的取字串長度:
                 STR="12345678"
                 LEN=`echo ${#STR}`
                 echo "STR length is $LEN" => 印出 "STR length is 8"

2018年1月19日 星期五

【Linux cmd】查找Linux某個指令的source code,以mke2fs為例

今天在找mke2fs 是哪包Source Code 所編譯出來的

查詢的方式很簡單,使用以下指令即可:

首先先找出mke2fs的路徑,我們知道他位於 /sbin/mke2fs

於是我們使用dpkg -S 來作查詢
#dpkg -S /sbin/mke2fs






所以我們可以知道,mke2fs 是由 e2fsprogs 所產出的執行檔

不過這招只適用於查找 apt-get install 之後所產出的指令,如果是自己進行編譯所產出的,使用dpkg 是找不到的~

2018年1月12日 星期五

error: dereferencing pointer to incomplete type ‘struct task_struct’

今天在編譯iqvlinux的時候,之前在kernel 4.10.17編譯時,都不會有什麼error產生

而今天改成在kernel 4.14.12編譯時出現了以下的錯誤訊息:

make: Entering directory '/home/danny/platform/project-4.14.12/linux-4.14.12'
  CC [M]  /home/danny/platform/project-4.14.12/sysapps/gmac/iqvlinux/src/linux/driver/linuxnaldriver.o
In file included from /home/danny/platform/project-4.14.12/sysapps/gmac/iqvlinux/src/linux/driver/linuxnaldriver.c:42:0:
./arch/x86/include/asm/uaccess.h: In function ‘set_fs’:
./arch/x86/include/asm/uaccess.h:33:9: error: dereferencing pointer to incomplete type ‘struct task_struct’
  current->thread.addr_limit = fs;
              ^

發生錯誤的流程如下說明:
編譯到linuxnaldriver.c的42行,這邊第42行是去include <asm/uaccess.h>,接著錯誤訊息就說明錯誤發生在 set_fs(),然後最後的錯誤是在 uaccess.h 的第33行,錯誤訊息就是如上面的error那行

查了一下google,很多人都說只要include header就可以解決,於是我先找了一下‘struct task_struct’的結構宣告在哪個檔案,google之後發現在<linux/sched.h>
















於是我在 linuxnaldriver.c 42行前面加了 #include <linux/sched.h>

再進行編譯,於是就編譯成功了