npm 指令用法

本篇紀錄 npm 的指令用法,

簡介

npm 全名為 Node Package Manager, 是 Node.js 的套件管理工具, 以 JavaScript 寫的

npm 把每個專案要使用的函式庫安裝在專案的 node_modules 資料夾底下
這樣專案與專案間(資料夾)就不會有套件衝突相依問題

每次使用 npm install --save 時會安裝的套件並寫入 package.json 的列表裡
以後別人要使用你的 code 可以很輕易知道使用哪些 dependency 以及版本

npm 指令

查看 npm 版本
npm --version

安裝套件在專案下的 node_modules 目錄
npm install [package]

安裝套件在專案下的 node_modules 目錄,並更新該套件資訊到 package.json
npm install [package] --save

Read More

6 種 JSON 排版格式化線上工具

本篇介紹幾款 JSON 排版格式化線上工具,

工具邦JSON格式化

網址:https://tw.piliapp.com/json/formatter/

JSON Formatter & Validator

網址:https://jsonformatter.curiousconcept.com/#

JSON Editor Online

網址:http://jsoneditoronline.org/

Online JSON Formatter

網址:https://jsonformatter.org/

Best JSON Viewer and JSON Beautifier Online

網址:https://codebeautify.org/jsonviewer

Beautify JSON

網址:https://archive.dojotoolkit.org/nightly/dojotoolkit/dojox/gfx/demos/beautify.html

Python 使用 pyinstaller 將程式打包成 exe 發佈

本篇介紹如何使用 pyinstaller 將 python 程式打包成 exe 執行檔發佈,學會這招後將可以把 exe 執行檔拿到任何 windows 電腦裡執行,即使那台 windows 電腦沒有裝 python 環境也可以執行唷!

安裝 pyinstaller

pyinstaller 是一個方便的 python 模組,將 python 的 .py 檔打包成為 exe 執行檔,過程會將所有的相依模組一併打包。
如果沒有 pyinstaller, 先用 pip 安裝

1
pip install pyinstaller

離線安裝 pyinstaller

PyPI下載,目前沒有提供.whl檔下載,
以目前下載到的PyInstaller-3.6.tar.gz為例子的話,輸入下列pip指令就會去安裝pyinstaller

1
pip install PyInstaller-3.6.tar.gz

很可惜地似乎安裝過程中會有其他相依的套件,pip試圖連網安裝缺少的相依套件,結果最後因為離線關係會連線逾時

conda-forge下載 pyinstaller-3.6-py37h7602738_0.tar.bz2
用 conda 指令安裝:

1
conda install pyinstaller-3.6-py37h7602738_0.tar.bz2

以為用 conda-forge 的離線包就能裝完全部相依套件,
最後發現還是少一些套件,只好認命的把缺少的裝一裝了,
分別是

1
2
3
pip install pywin32_ctypes-0.2.0-py2.py3-none-any.whl
pip install pefile-2019.4.18.tar.gz
pip install altgraph-0.17-py2.py3-none-any.whl

裝完後就發現 pyinstaller 指令可以使用了!

使用範例

使用pyinstaller打包成exe最簡單的範例如下所示,預設是會打包成一個資料夾,
pyinstaller 會去分析程式中所用到的 module,最後把這些東西放在一個資料夾或單一執行檔(看你使用的參數)
以這個範例來說,會打包成一個yourprogram資料夾,yourprogram資料夾裡面會有一個yourprogram.exe

1
pyinstaller yourprogram.py

使用pyinstaller打包成一個執行檔exe,並且不顯示 cmd 視窗,

1
pyinstaller -F -w yourprogram.py

常用參數介紹

-h, --help:查看說明
-F:打包成一個exe文件
-w, --windowed:不顯示 cmd 視窗
-c, --console:顯示 cmd 視窗
-D, --onedir:打包成一個資料夾(預設)
-F, --onefile:打包成一個執行檔
--noup:不使用 upx
--upx-dir UPX_DIR:指定 upx 的資料夾,用來可壓縮執行檔
--version-file=file_version_info.txt:帶入版本資訊,可以在exe右鍵內容>詳細資料>明細內容 查看到該資訊

Read More

Git 常用指令

branch 分支類操作

開新分支 (根據當前的 HEAD 節點建立新分支)
git checkout HEAD -b <new branch>

查看當前分支
git branch

切換分支
git checkout <branch name>


查看歷史類操作

看 commit 歷史訊息
git log

看所有檔案的歷史修改
git log -p

Read More

Git config 推薦設定方式

以下為我的 gitconfig, 設定完後操作 git 比較快速
存放位置為 ~/.gitconfig

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[user]
name = xxx
email = xxx@xxx.com
[core]
editor = vim
[color]
ui = true
[alias]
st = status
co = checkout
br = branch
cm = commit
au = add --update
cmi = commit -m "init"
cmu = commit -m "update"
cmf = commit -m "fixup"
cmt = commit -m "temp"
cmam = commit --amend
ls = ls-files
glog = log --oneline --graph --decorate
[diff]
tool = meld
[difftool]
prompt = false
[difftool "meld"]
cmd = meld $LOCAL $REMOTE

Git 比對這次 commit 跟前一次 commit 的差異

這算是很進階、很方便的一招, 有時候不小心把垃圾或除錯用的 code 給一起 commit 進去了,
需要把這些東西移除掉,
但是哪段才是想要去除的那段呢?
這時候可以用下列指令比對出這次 commit 跟前一次 commit 的差異,

1
git diff HEAD^ HEAD

也可以跟某個commit比對

1
git diff HEAD^ <SHA1>

也可以使用圖形化比對工具

1
git difftool HEAD^ HEAD

之後就在外部比對工具(meld)裡選擇要移除的 code
之後再 git add 然後 git commit --amend 就搞定了!超方便的技巧!

Shell Script if 條件判斷

本篇 ShengYu 介紹 Shell Script if 條件判斷式,常常在 Shell Script 腳本裡會需要判斷一些條件,但這些條件不單單只是數字比對、字串比較,還會有其他判斷,例如:對檔案的判斷,有時候日子久了也會忘記一些檔案判斷的寫法,也順便紀錄一下當作備忘。以下 Shell Script 除了介紹一下 if 語法介紹外,還會列出各種使用情境與常用的判斷式。

以下 Shell Script if 條件判斷的用法與範例將分為這幾部份,

  • Shell Script if 語法介紹與範例
  • Shell Script if 常用的判斷式
  • Shell Script if 常用範例

那我們開始吧!

Shell Script if 語法介紹與範例

Shell Script 使用 if 條件判斷語法要注意 [ ] 中括號的兩端內側必須要有一個空白字元,且最後必須使用 fi 結尾,以下範例介紹 Shell Script if 的用法,以及比較二個字串是否相等。

範例1-1:if 寫法

Shell Script 最簡單的 if 條件判斷式寫法,範例如下,

if.sh
1
2
3
if [ 'xxx' == 'xxx' ]; then
# do something
fi

也可以將 then 換到下一行那就不用加 ; 分號了,如下所示,

1
2
3
4
if [ 'xxx' == 'xxx' ]
then
# do something
fi

這邊舉個範例,Shell Script 用 if 判斷兩個字串是否相同,

1
2
3
4
5
STR1="apple"
STR2="apple"
if [ "$STR1" == "$STR2" ]; then
echo "Yes"
fi

範例1-2:if else 寫法

if 加上 else 條件判斷式寫法,範例如下,

if-else.sh
1
2
3
4
5
if [ 'xxx' == 'xxx' ]; then
# do something
else
# do something
fi

這邊舉個範例,Shell Script 用 if 加上 else 判斷兩個字串是否相同,

1
2
3
4
5
6
7
STR1="apple"
STR2="lemon"
if [ "$STR1" == "$STR2" ]; then
echo "Yes"
else
echo "No"
fi

範例1-3:if, else if, else 寫法

Shell Script if 的多重條件寫法,範例如下:

if-else-if.sh
1
2
3
4
5
6
7
if [ 'xxx' == 'xxx' ]; then
# do something
elif [ 'xxx' == 'xxx' ]; then
# do something
else
# do something
fi

Shell Script if 常用的判斷式

這邊介紹 Shell Script if 常用的判斷式,

表格1:檔案判斷

判斷檔案是否存在,判斷目錄是否存在,這兩個算是最常用到的寫法,其他幾種也一併列出來。

判斷式 說明 備註
-e <file> 檔名是否存在
-f <file> 檔名是否存在且為檔案
-d <file> 檔名是否存在且為目錄
-x <file> 檔名是否存在且可執行
-L <file> 是否為軟連結
-S <file> 檔名是否存在且為socket

表格2:數字比較

偶爾會使用到數字比對,語法如下所示。

判斷式 說明 備註
"$a" -eq "$b" 兩數字是否相等
"$a" -ne "$b" 兩數字是否不相等
"$a" -gt "$b" a是否大於b
"$a" -ge "$b" a是否大於等於b
"$a" -lt "$b" a是否小於b
"$a" -le "$b" a是否小於等於b

表格3:字串比較

字串比對也是很長使用到的功能,以下整理為常用的寫法,這裡需注意前兩個的寫法都是一樣的。

判斷式 說明 備註
"$str1" = "$str2" 兩字串是否相等
"$str1" == "$str2" 兩字串是否相等
"$str1" != "$str2" 兩字串是否不相等
-n "$str1" 字串長度是否不為0
-z "$str1" 字串長度是否為0

表格4:多重條件比較

多重條件比較這個偶爾會用到,也是整理列出來。

判斷式 說明 備註
條件1 -a 條件2 條件1和條件2都成立時
條件1 -o 條件2 條件1或條件2成立時

Shell Script if 常用範例

這邊介紹 Shell Script if 常用範例,

範例2:判斷是否為檔案

Shell Script 判斷 somefile 是否為檔案,

file-exist1.sh
1
2
3
if [ -f somefile ]; then
echo "Yes"
fi

也可以寫成下面這種,

file-exist2.sh
1
2
3
if test -f somefile; then
echo "Yes"
fi

範例3:判斷是否為目錄

Shell Script 判斷 somedir 是否為目錄,

dir-exist.sh
1
2
3
if [ -d somedir ]; then
echo "Yes"
fi

以上就是 Shell Script if 條件判斷的用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!
下一篇介紹 for 迴圈

其它相關文章推薦
Shell Script 新手入門教學
Shell Script 四則運算,變數相加、相減、相乘、相除
Shell Script for 迴圈
Shell Script while 迴圈
Shell Script 讀檔,讀取 txt 文字檔
Shell Script 判斷檔案是否存在

Linux ag 搜尋字串用法與範例(比 grep 還快)

本篇介紹 Linux 下超強的搜尋字串工具「The Silver Srarcher」,The Silver Srarcher 簡稱 ag, ag 號稱比 ack 快(ack 又號稱比 grep 快),這麼厲害的 ag 搜尋工具還不趕緊手刃在 Linux 裝起來試試。

以下的 Linux ag 用法與範例將分為這幾部分,

  • ag 安裝方法
  • ag 基本用法
  • ag 指定目錄下搜尋
  • ag 排除目錄
  • ag 搜尋內容符合的檔案 pipe 給 sed 取代文字
  • ag 常用選項
  • ag 搭配正規表達式

那我們開始吧!

ag 安裝方法

Ubuntu 下安裝方法為

1
sudo apt-get install silversearcher-ag

macOS 下 Homebrew 安裝方法為

1
brew install the_silver_searcher

ag 基本用法

基本上 ag 跟 grep 大部分用法一樣,甚至一些常用的選項都變成 ag 的預設選項,這樣使用者也不太需要記一堆選項,使用上自然方便很多,假設要搜尋 main 這個關鍵字,那麼 ag 的使令可以這樣用,

1
ag "main\"

假設要搜尋 main ( 這個關鍵字,( 搜尋特殊字元要加 \

1
ag "main\("

ag 指定目錄下搜尋

指定 src 目錄下搜尋

1
ag "main\(" src

指定 src, aaa, bbb 多個目錄下搜尋

ag 排除目錄

排除 3rdparty 目錄之外

1
ag "main\(" --ignore-dir 3rdparty

排除 3rdparty, doc 多個目錄之外

1
ag "main\(" --ignore-dir 3rdparty --ignore-dir doc

ag 搜尋內容符合的檔案 pipe 給 sed 取代文字

ag 搜尋內容符合的檔案 pipe 給 sed 取代文字的方式如下,範例內容是假設我要搜尋檔案內容有 http 的字串找出來後將這些檔案名稱 pipe 給 sed 取代文字,將這些檔案裡的 http 全部取代成 https,

1
2
3
4
# Linux
ag "http" -l | xargs sed -i 's/http/https/g'
# macOS
ag "http" -l | xargs sed -i "" 's/http/https/g'

如果 ag 換成 grep 的話,可以參考下面這個寫法或這篇

1
2
3
4
# Linux
grep -ri "http" * -l | xargs sed -i 's/http/https/g'
# macOS
grep -ri "http" * -l | xargs sed -i "" 's/http/https/g'

ag 常用選項

ag 另外其他很有用的選項是
ag -i 使用大小寫不敏感的匹配方式
ag -w 全詞匹配
ag -G ".+\.java" 搜索 java 類型的檔案
ag -l 顯示有匹配的檔案路徑
ag -L 顯示沒有任何匹配的檔案路徑
ag -v 反向匹配,將匹配到的資料排除

ag 搭配正規表達式

ag 顯示 abc 開頭,

1
ag ^abc log.txt

ag 顯示 abc 結尾,

1
ag abc$ log.txt

ag 顯示數字,例如 abc0 ~ abc9 開頭,

1
ag abc[0-9] log.txt

其它相關文章推薦
Linux 常用指令教學懶人包
Linux grep 搜尋字串用法與範例
Linux grep/ack/ag 搜尋字串用法與範例
Linux cut 字串處理用法與範例
Linux sed 字串取代用法與範例
Linux find 尋找檔案/尋找資料夾用法與範例

Python 計算程式執行時間

本篇 ShengYu 將介紹如何使用 Python 去計算某段程式碼花了多久執行時間,有時會想計算自己寫的函式需要多久執行時間,以便改善,這時就可以用 Python 的 time 模組來作計算時間。

以下範例示範如何計算自己寫的排序法 my_sort() 要花多久的執行時間,
通常會在執行 my_sort() 前先取得一次當下的時間,執行 my_sort() 後再取得一次當下的時間,
然後兩個時間相減,就是 my_sort() 的執行時間了,

使用範例

以下範例一開始會需要 import time 模組來取得時間,
範例是計算 my_sort() 的執行時間,使用time.time() 來個別取得開始時間 t1 與結束時間 t2,
之後兩個時間相減再印出來。

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import time

def my_sort():
time.sleep(1.1234) # 用 sleep 模擬 my_sort() 運算時間

t1 = time.time()
my_sort()
t2 = time.time()
print('time elapsed: ' + str(round(t2-t1, 2)) + ' seconds')
print('time elapsed: ' + str(t2-t1) + ' seconds')

輸出:

1
2
time elapsed: 0.12 seconds
time elapsed: 0.12355685234069824 seconds

說明

Python 的 time.time() 回傳的數值是浮點數,時間單位是秒,是從1970/1/1 00:00:00 開始到現在經過的秒數。
詳細可以參考 https://docs.python.org/3/library/time.html。
如果要更精準的測量時間應考慮用 time.monotonic() 單調時鐘

相關主題
Python 使用 monotonic 計算程式執行時間
Python 使用 datetime 日期相減
Python 第一支 Python 程式
Python 讓程式 sleep 延遲暫停時間
Python 取得系統當前時間
[Python] 圖片模糊化 blur
[Python] 旋轉圖片 rotate
C++ 計算程式執行時間