顯示具有 Computer 標籤的文章。 顯示所有文章
顯示具有 Computer 標籤的文章。 顯示所有文章

2021年2月18日 星期四

Programmer Interview - stack v.s. heap

 stack v.s. heap

  • 與 threads 的互動
    在一個 multi-threaded 的程式中,每個 thread 都各自擁有一個 stack,但共享一個 heap。
  • object 可以儲存在 heap,而非 stack
    在 c++ 可以使用 new,來將 object 實體儲存在 heap。
        void foo () {
            // myClass, myPointer 儲存在 stack
            // myPointer 所指向的 tempClass object 則儲存在 heap
            // function 結束 myClass, myPointer 則會與 stack 一起 remove
            // 而 myPointer 所指向的 tempClass 不會,所以下 delete
            tempClass myClass;
            tempClass *myPointer = new tempClass();
            delete myPointer;
        }
  • Java 或 .NET 可以透過 garbage collection 來作到 delete myPointer; 的效果。
  • stack 跟 heap 的大小
    stack 大小是固定的,有某些語言可以增加其大小。若 stack 不夠則會造成 stackoverflow (ex 無限遞迴)。heap 大小則是靠 OS 給的。
參考資料 :

2020年9月3日 星期四

Linux - Shell Scripts - ln 指令

ln 指令

    ln 指令是用來建立連結檔, 這裡用安裝 nodejs 示範。安裝法為在官網下載編譯好的 nodejs, 然後用 ln 建立連結檔。
    # 從 nodejs.org 下載並解壓縮至 /home/user/software
    $ ln -s /home/daniel/software/node-v12.18.3-linux-x64/bin/node /usr/local/bin/
    $ ln -s /home/daniel/software/node-v12.18.3-linux-x64/bin/npm  /usr/local/bin/
    # 之後利用 node -v 跟 npm -v 來確定安裝是否完成...
    
    daniel@daniel-pc:~/daniel/node-v12.18.3-linux-x64$ ls -al /usr/local/bin/
    總計 8
    drwxr-xr-x  2 root root 4096  9月  3 15:46 .
    drwxr-xr-x 10 root root 4096  2月  4  2020 ..
    lrwxrwxrwx  1 root root   52  9月  3 15:02 node -> /home/daniel/daniel/node-v12.18.3-linux-x64/bin/node
    lrwxrwxrwx  1 root root   51  9月  3 15:46 npm -> /home/daniel/daniel/node-v12.18.3-linux-x64/bin/npm

軟連結(soft/symbolic link) 跟 硬連結(hard link)

    上面範例我用的是軟連結, 指令有加 -s, 硬連結則是不加。下面是兩種連結的比較。
    連結 : 與連結的檔案相同的 inode, 相對路徑不受連結之檔案影響
    連結 : 與連結的檔案不同的 inode, 相對路徑連結之檔案影響
    如果用相對路徑去軟連結, 結果就是 2 個連結檔壞掉, 因為 inode 不同, 軟連結找不到 ./bin/node 跟 ./bin/npm。
    $ sudo ln -s ./bin/node /usr/local/bin/
    $ sudo ln -s ./bin/npm  /usr/local/bin/
    $ ls -al /usr/local/bin/
    總計 8
    drwxr-xr-x  2 root root 4096  9月  3 18:16 .
    drwxr-xr-x 10 root root 4096  2月  4  2020 ..
    lrwxrwxrwx  1 root root   10  9月  3 18:16 node -> ./bin/node
    lrwxrwxrwx  1 root root    9  9月  3 18:16 npm -> ./bin/npm
    如果用相對路徑去硬連結, 因為 inode 相同, 硬連結找得到 ./bin/node。
    $ sudo ln ./bin/node /usr/local/bin/
    $ sudo ln ./bin/npm  /usr/local/bin/
    $ ls -al /usr/local/bin/
    總計 47520
    drwxr-xr-x  2 root   root       4096  9月  3 18:24 .
    drwxr-xr-x 10 root   root       4096  2月  4  2020 ..
    -rwxr-xr-x  2 daniel daniel 48646656  7月 22 23:00 node
    lrwxrwxrwx  2 daniel daniel       38  9月  3 13:34 npm -> ../lib/node_modules/npm/bin/npm-cli.js
    但上面的 npm 是壞的, 因為原本的 npm 也是連結檔, 而且連的是相對位置。雖然透過 inode 找到該連結檔, 但因為是在 /usr/local/bin 下找相對位置所以找不到。所以就如同文章最一開始的安裝示範, 軟連結在相對路徑的處理上會受所連結檔案影響, 反而能成功找到 ../lib/node_modules/npm/bin/npm-cli.js。
參考資料 :

2020年5月10日 星期日

C 語言 - CLI ( Command Line Interface ) 設計 (1)

CLI 命令列介面


    在設計 CLI 的程式時,最好的方法是遵從 IEEE Std 1003 ( POSIX ) 對 program 的 command-line options 之規範。所以用 getopt 去做 parse command-line 是最簡單的,有一點要注意的是 GNU 提供的 getopt 支援 " -- ",這個 POSIX 沒有規範。

常見的 Usage 設計

    Usage : 
        my_program tcp <host> <port> [--timeout=<seconds>]
        my_program serial <port> [--baud=9600] [--timeout=<seconds>]
        my_program (-h | --help)
    參數
    my_program   : program name
    tcp   : commands
    -h, --help   : options
    <host>   : arguments

    符號
    [ ]   : optional
    ( )   :  required
     |   :  mutually exclusive
    ...   :  repeating elements

Options 設計


    在設計長命名的 option ( " -- " ),最好需要有一個相對短命名的 option ( " - " ),example : -h, --help。

    每隻程式最好都要有 --help 跟 --version


參考資料 :

2020年4月19日 星期日

Computer Science - MSB LSB

MSB = Most Significant Bit


    簡單來說等於最左邊的 Bit第 2^{n-1} 的 Bit

LSB = Least Significant Bit


    簡單來說等於最右邊的 Bit,第 0 位的 Bit

MS Byte、LS Byte


    Bit 換成 Byte 的概念。

2020年3月17日 星期二

Linux 初學 (3)

Linux 檔案系統

    Linux 採用 FHS ( Filesystem Hierarchy Standard ),基本上規定三項
  • /        : 與開機系統有關
  • /usr   : 與軟體安裝 / 執行有關
  • /var   : 與系統運作過程有關

Linux 目錄指令

    cd [相對路徑或絕對路徑]   // 到該目錄
    cd ~username              // 到該使用者家目錄
    cd ~                      // 到當前使用者家目錄
    pwd                       // 顯示當前目錄

Linux 環境變數 $PATH

    echo $PATH
    /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
某些情況下,即使你已經將 ls 搬回 /bin 了,不過系統還是會告知你無法處理 /root/ls 喔!很可能是因為指令參數被快取的關係。 不要緊張,只要登出 (exit) 再登入 (su -) 就可以繼續快樂的使用 ls 了!

Linux 特殊權限 SUID, SGID, SBIT

    // SUID = 4 ,設在檔案上,讓有檔案執行權利的使用者執行檔案時,權利跟檔案擁有者一樣
    // SGID = 2 ,設在檔案或目錄上,讓有檔案執行權利的使用者執行檔案時,權利跟檔案群組一樣
    // SBIT = 1 ,設在目錄上,使在目錄下的使用者只能對自己的檔案或目錄作刪除/更名/移動等動作
    
    // example
        chmod 4755 test
        ls -l test
        -rwsr-xr-x 1 root root 0 Mar 17 12:38 test


上一篇:

2020年3月13日 星期五

Linux 初學 (2)

Linux 指令查詢

     Linux 指令有很多,使用者不可能全部記下來,所以查詢指令就很重要了。
    man             // 提供一般的查詢,支援度高
    info            // 提供閱讀介面較好的查詢
    /usr/share/doc  // 通常會把指令相關文件放在這

Linux 檔案權限

    ls -al          // l = 列出所有資訊,a = 包含隱藏檔案

    -rwxr--r--.  1 root root 0 Mar 13 17:05 test

    // 第一個字串(字串)
        // 第 1 個字元代表檔案類型
        // 第 1 組 rwx 代表擁有者權限
        // 第 2 組 rwx 代表群組權限
        // 第 3 組 rwx 代表其他使用者權限
    
    // 第二個字串(數字)    // 第三個字串(字串)    // 第四個字串(字串)
        // 檔案連結數          // 擁有者名稱          // 群組名稱
    
    // 第五個字串(數字)    // 第六個字串(時間)    // 第七個字串(字串)
        // 檔案大小            // 最後修改時間        // 檔案名稱
    可得很多當前目錄檔案的訊息,如何閱讀 鳥哥的 Linux 私房菜 都有教學。
    以下指令為修改檔案權限之指令。要有目錄執行權力才能 call cd 或讀取裡面的檔案。
    chown           // 修改擁有者
    chgrp           // 修改群組
    chmod           // 修改權限

上一篇:
下一篇:


參考資料 :
鳥哥的Linux私房菜

2020年3月11日 星期三

Linux 初學 (1)

Linux是一個作業系統


     相較其他作業系統特殊的地方就是 Linux 為 GPL 授權軟體,Open source 的一種。使用者可以免費下載使用且隨意更改原始碼,只要你不修改其 GPL 授權或販賣簡單軟體 ( 簡單軟體指得是 Linux 上開發的軟體,但開發商還是能販售所謂的"服務" )。

Virtual Box 安裝 Linux


     基本上我是照著 鳥哥的 Linux 私房菜 裝的,只是我是用 Virtual Box,不一樣的是 Virtual Box 預設沒有支援 CentOS,所以先新增一個 Red Hat,再將存放裝置讀取從 CentOS.org 所載的 iso 檔,然後注意開機 boot 的順序即可 ( 光碟 > 硬碟 )。



如想嘗試完全照抄鳥哥的安裝法


     鳥哥用 GPT 去切割硬碟,如果想要照抄,得先開啟 EFI ( 也叫 UEFI,EFI 似乎是早期的名子 ),然後多切割一個 /boot/efi ,容量 300 ~ 500 M 就好了。





下一篇:


Popular Posts