Cloc – 快速計算程式碼行數

最近剛好一個閒來無事

想看看專案規模成長到多大

雖然以程式碼行數來去看是不太準

但起碼依然是指標的一種

 

Cloc不但計算快速

且除了程式碼行數,還會列出檔案總數、空行數和註解行數

 

GitHub: https://github.com/AlDanial/cloc


安裝

Cloc可以透過多種Package manager安裝:

npm install -g cloc                    # https://www.npmjs.com/package/cloc
sudo apt-get install cloc              # Debian, Ubuntu
sudo yum install cloc                  # Red Hat, Fedora
sudo dnf install cloc                  # Fedora 22 or later
sudo pacman -S cloc                    # Arch
sudo pkg install cloc                  # FreeBSD
sudo port install cloc                 # Mac OS X with MacPorts
brew install cloc                      # Mac OS X with Homebrew
choco install cloc                     # Windows with Chocolatey

也可以直接下載Released package進行安裝 (下載頁面 )

 


操作

指令:cloc [options] <file(s)/dir(s)> | <set 1> <set 2> | <report files>

Calos@Workstation:~/project/my-project$ cloc .
     538 text files.
     520 unique files.
     154 files ignored.

https://github.com/AlDanial/cloc v 1.66  T=2.61 s (182.4 files/s, 38389.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
PHP                            299           3141           1457          35339
JavaScript                      97           5996           5308          30628
CSS                             44            386            207          11262
SQL                              2             25             54           2732
HTML                            14            423             98           2699
JSON                            10              1              0            282
Bourne Shell                     8             21              2             77
make                             1             12             13             28
YAML                             1              0              0             10
-------------------------------------------------------------------------------
SUM:                           476          10005           7139          83057
-------------------------------------------------------------------------------

個人常用的參數有三種:

  • –exclude-dir: 排除特定目錄,以逗號隔開
  • –exclude-lang: 排除特定語言,以逗號隔開
  • –exclude-ext: 排除特定副檔名,以逗號隔開

完整參數說明請參考官方文件 

 

以下範例為:

  1. 排除plugins、makefiles、storage三個特定目錄下所有檔案
  2. 排除make語言的所有檔案
  3. 排除副檔名為html的所有檔案
Calos@Workstation:~/project/my-project$ cloc . --exclude-dir=plugins,makefiles,storage --exclude-lang=make --exclude-ext=html
     372 text files.
     364 unique files.
      63 files ignored.

https://github.com/AlDanial/cloc v 1.66  T=0.44 s (808.6 files/s, 102809.6 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
PHP                            286           2986           1390          34250
JavaScript                      39            604            286           4056
CSS                             28            230             23           1055
-------------------------------------------------------------------------------
SUM:                           353           3820           1699          39361
-------------------------------------------------------------------------------

 

[PHP] 利用flush()、ob_flush()強制輸出網頁內容

正常情況下,執行中的 PHP 過程中輸出的內容會先進到緩衝區 (output_buffer)

PHP Script 全部執行完畢後,產生的資料才會從 output_buffer 一次輸出到瀏覽器上

但是若程式要跑一段時間,想要看到執行過程中輸出的內容,可以透過 ob_flush()flush() 達成

雖然看起來名稱很像,但是做的事情不太一樣:

ob_flush():把 PHP output_buffer (假設有打開)的東西輸出,但並不是立刻輸出到終端
flush():把非 PHP output_buffer,伺服器上準備輸出的資料輸出到瀏覽器上”顯示出來”

 

寫一小段測試 code

<?php
header('Content-type: text/html; charset=utf-8');
for ($i = 0; $i < 100; $i++) {
    echo $i . '<br>';
    flush();
    ob_flush();
    usleep(20000); // 20ms
}

 

HTTP Server 設定也會影響到 function

Apache 預設值不影響,不過 Nginx 會

所以如果 HTTP Server 使用 Nginx

需要針對 PHP 類型額外做設定:

編輯 /etc/nginx/site-available/default

# 找到針對PHP的directive
location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
        return 404;
    }

    include fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_read_timeout 300;

    # 加入這三行
    fastcgi_keep_conn on; # fastcgi保持連線
    proxy_buffering off; # 如果沒使用proxy的話這行可以不加
    gzip off; # 關閉gzip壓縮
}

 

值得注意的是 fastcgi_keep_conn 在 Nginx 下預設是 off 的

雖然啟用後理論上效能能得到提升 (Connection TIME_WAIT 數量會明顯下降)

不過在某些特殊情況下可能會發生異常

所以預設情況下是關閉的

 

Reference: Re: Why does fastcgi_keep_conn default to off?

 

[Linux] iptables ip/port forwarding

※操作系統為Ubuntu-14.04.4-server-amd64
※使用者為root,如果不是用root操作,請記得加sudo

本機端上:

# 轉送外來tcp port 20022封包到本機的port 22
root@localhost:~$ iptables -t nat -A PREROUTING -p tcp --dport 20022 -j REDIRECT --to-port 22

# 也可以使用-i參數指定網路卡(Interface),指定網路卡eth0
root@localhost:~$ iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 20022 -j REDIRECT --to-port 22

 

涉及轉送到其他機器的話,必須先開啟ip forward,有三種方法,但生效時間不一樣

# 注意: 這邊必須以root權限操作,請切換成root或是sudo vim用編輯器編輯
# 方法一:直接echo 1到檔案,這個方式是暫時開啟,重開機後會消失,如果你只是想要暫時當一下Router可以用這種方式 (1為開啟,0為關閉)
root@localhost:~$ echo 1 > /proc/sys/net/ipv4/ip_forward

# 方法二:使用sysctl進行設定,效果等同第一種方法 (1為開啟,0為關閉)
root@localhost:~$ sysctl net.ipv4.ip_forward=1

# 方法三:將上述兩種方法其中一種指令加到/etc/network/interfaces,這樣子每次網路卡重啟時皆會自動開啟轉送,但如果要當下生效的話還是要先利用上面提到的方法
root@localhost:~$ echo 'pre-up sysctl net.ipv4.ip_forward=1' >> /etc/network/interfaces

 

進入主題,將封包轉送到其他機器上的指令

# 轉送外來tcp port 20022封包到內網機器192.168.0.1的port 22
root@localhost:~$ iptables -t nat -A PREROUTING -p tcp --dport 20022 -j DNAT --to 192.168.0.1:22
root@localhost:~$ iptables -t nat -A POSTROUTING -p tcp --dport 22 --dst 192.168.0.1 -j MASQUERADE

 

測試規則是否生效 (192.168.0.253是Server IP)

root@localhost:~$ nc -zv 192.168.0.253 20022
Connection to 192.168.0.253 20022 port [tcp/*] succeeded!

若成功了就會出現successed字樣
實際上server沒有服務在使用port 20022
但是因為我們設定了iptables做forward
所以這個封包並沒有進到server,而是直接被轉到內網的192.168.0.1
而192.168.0.1收到了封包,回傳會先經過server
server收到了回傳封包,透過POSTROUTING的規則,把封包傳回外網的機器

 

因為自定義的iptables rules在重開機之後就會消失
所以我們要在重開機後能自動復原rules

#先保存現在已經設定好的rules
root@localhost:~$ iptables-save > /etc/network/iptables.rules

 

編輯/etc/network/interfaces,在檔案末端加入這行

pre-up iptables-restore < /etc/network/iptables.rules

 

這樣當網路卡啟用的同時,也會一併載入自訂的rules

 

 

Updates:
2017-01-18: 修正錯誤,sysctl重啟網卡後forward一樣會自動關閉,新增自動開啟的方法(第三種)。

[Ubuntu] 掛載 VirtualBox 共享目錄

※在進行之前,要先把VirtualBOX Guest Additions安裝過 (在VirtualBox上排選單 > Devices > Insert Guest Additions CD image)

 

首先,先把自己加進vboxsf群組 (VirtualBox)

sudo usermod -a -G vboxsf $(whoami)

 

編輯/etc/fstab檔

# share_folder: 在VirtualBox設定的共享資料夾名稱
# /srv/share_folder: Ubuntu上的掛載點
share_folder    /srv/share_folder   defaults    0 0

 

remount檔案系統,就會看共享目錄被掛到/srv/share_folder了

sudo mount -a

 

[VIM] 安裝第三方 Color Scheme

如果家目錄沒有.vim/colors資料夾,就先創一個

mkdir -p ~/.vim/colors

 

這裡直接git clone第三方color scheme,以 jacoborus/tender  為例

git clone git@github.com:jacoborus/tender.git

 

tender/colors/tender.vim 這個就是color scheme檔,把這個檔案丟到 ~/.vim/colors/

cp tender/colors/tender.vim ~/.vim/colors/

 

修改vimrc檔案,加入底下這行

colorscheme tender

 

重新啟動vim,就會自動套用新的color scheme了