網誌

Python 2.7以及Python Virtual Environment – 安裝

因ubuntu從18.04開始,內建的python版本都是為3.6以上 (舊的內建2.7),所以要手動輸入版本號

安裝python2.7

sudo apt update
sudo apt install python2.7 -y

檢查一下python2.7版本:

python2.7 -V

輸出結果:

安裝pip套件

這邊的作法是下載get-pip.py來安裝。

注意:
第3行的URL不一定是最新的,若有跳出錯誤訊息是URL找不到,請自行更換成錯誤訊息跳出的URL。

cd ~
cd 下載
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py
python2.7 get-pip.py 

若安裝成功,最後會看到這個訊息:

(可略過不做)
為使用pip套件建立別名:
後面的指令pip2請自行改成python2.7 -m pip

cd ~
touch .bash_aliases
echo "alias pip2='python2.7 -m pip'" >> .bash_aliases
source .bash_aliases
pip2 -V

輸出結果:

pip 20.3.4 from /home/ubuntu/.local/lib/python2.7/site-packages/pip (python 2.7)

使用pip安裝virtualenv

日後為每個專案製作一個專屬的python environment

pip2 install virtualenv
# 等同於 python2.7 -m pip install virtualenv

為virtualenv製作別名

這是因為如果安裝其他python版本的virtualenv,用別名來區分使用的版本。也可以略過,後續指令virtialenv2.7自行替換成virtualenv

echo "alias virtualenv2.7='python2.7 -m virtualenv'" >> ~/.bash_aliases
source .bash_aliases
# 測試一下
virtualenv2.7 --version
# 輸出結果
# virtualenv 20.4.3 from /home/ubuntu/.local/lib/python2.7/site-packages/virtualenv/__init__.pyc

製作一個test_venv專屬的python environment。

mkdir python27_venv
cd python27_venv
virtualenv2.7 test_venv  # 方法1:有製作別名(上方操作)才可使用此方法
python27_venv python2.7 -m virtualenv test_venv  # 方法2

創建完後進入虛擬環境:

source ~/python27_venv/test_venv/bin/activate
# 命令列多出前綴(test_venv)。表示已經啟用此虛擬環境
(test_venv)$ python -V
Python 2.7.17 # 輸出結果
(test_venv)$ pip list
# 離開虛擬環境
(test_venv)$ deactive

# 前綴消失,表示已經關閉虛擬環境

ubuntu背景執行py方法

主要介紹在linux下使用Terminal來背景執行python的幾種方式,
一個用python寫的監控腳本test.py,一直運行,每5秒、10秒、15秒顯示一次現在時間。

以下為test.py、test2.py、test3.py這三隻同時使用背景來執行的畫面。

執行test.py後,會顯示跳出PID為25270。

# code:utf-8
from datetime import datetime
from time import sleep

while(1):
    count = 1
    sleep(5)
    print(str(count) + " : " + str(datetime.now().strftime('%Y-%m-%d %H:%M:%S')))

再執行一隻test2.py,不會讓原本的test.py停住,還是會繼續執行,並且顯示新的PID。

# code:utf-8
from datetime import datetime
from time import sleep

while(1):
    count = 2
    sleep(10)
    print(str(count) + " : " + str(datetime.now().strftime('%Y-%m-%d %H:%M:%S')))

再執行test3.py。

# code:utf-8
from datetime import datetime
from time import sleep

while(1):
    count = 3
    sleep(15)
    print(str(count) + " : " + str(datetime.now().strftime('%Y-%m-%d %H:%M:%S')))

查詢一下背景運行的程式有哪些。

ps -ef

想停止某隻程式的話,就輸入:

kill PID


kill掉後原本的Terminal會出現已終止某隻程式。

原本的test2.py和test3.py還會繼續執行。

HTML -標記的語法規範與結構

語法

單標記

只有一個標記,既能表示開始,也能表示結束
語法:<標記> 或 <標記/>
ex:

<br> 或 <br/> 換行
<hr> 或 <hr/> 一條水平線
<img> 或 <img/> 圖片
<input> 或 <input/> 表單控件

單標記是沒有內容文字的,所以沒有</img>,建議寫成<img />
在>前加上一個”/”,這樣的話就可以很清楚的看見這個元素的結束。

雙標記

雙標記,是有顯示的開始 和 結束標記組成的
<標記>內容
ex:

<b>普通文本</b>
<s>文本內容</s>

有開始,必須有結束,否則會產生意想不到的效果

標記的嵌套

在一對標記中,又出現了其他的標記,相當於就是功能的嵌套

標記嵌套時一定要注意格式問題:
ex:

<s><b>文本內容</b></s>

被嵌套的內容一定要加 縮進

<s>
  <b>文本內容</b>
</s>

標記的屬性 和 值

在標記中,屬性是用來修飾標記的顯示效果的。

  1. 屬性必須聲明在開始元素中
    <元素 屬性聲明位置處>
    <元素 屬性聲明位置處>
  2. 屬性 和 元素之間,用空格隔開
    <元素 屬性聲明位置處>
    <元素 屬性聲明位置處>
  3. 屬性 和 值之間使用 = 連接,值要用”或””引起來
    <元素 屬性=”值”>
  4. 一個元素允許設置多個屬性,並且排名不分先後,
    多屬性間用 空格 隔開
    <元素 屬性1=”值1″ 屬性2=”值2″>
  5. HTML中的註釋
<!-- 這是註釋內容
這也是註釋內容
-->
  1. 注意:
註釋不能出現在<>中
<p<!-- -->></p>

註釋不能嵌套
<!--
這是一段註釋
<!--
這又是一段註釋
-->
-->

HTML文檔結構

HTML頁面

在 文檔類型聲明 之下,使用一對 根標記來表示頁面
html根標記包含兩對子標記:

網頁頭部信息

<head></head>

網頁的主體

顯示給用戶看的內容,是最長編寫的地方。

<body></body>

元素

<head></head> 
  1. 標題內容
  2. 指定網頁內容的編碼格式
<meta charset="utf-8>
  1. 指定網頁的關鍵字 – 面向搜索引擎
<meta name="keywords" content="關鍵字1,關鍵字2,關鍵字3">
  1. 指定網頁的描述文本 – 面向搜索引擎
<meta name="description" content="... ...">

HTML標記

文本

HTML中的特殊字符

&nbsp; 表示一個空格
&lt; 表示一個 <
&gt; 表示一個 >
&copy; 表示一個 c (copyright)
&yen; 表示 ¥

文本樣式標記

改變文本在網頁中的表現形式
特點:以下標記允許與其他文本內容在一行內顯示。

<i></i> : 斜體
<u></u> : 下劃線
<s></s> : 刪除線
<b></b> : 加粗顯示
<sup></sup> : 上標
<sub></sub> : 下標

`

標題標記

  • 改變文字大小以及加粗效果
  • 每個標題都具備垂直的空白距離
  • 每個標題獨占一行
  • 每個標題都有一個屬性
    屬性:align
    取值:left / center / right
<h1></h1> : 一級標題,文字最大
<h6></h6> : 六級標題,文字最小
<h1 align="left">標題H1 </h1>
<h2 align="left">標題H2 </h2>
<h3 align="center">標題H3 </h3>
<h4 align="center">標題H4 </h4>
<h5 align="right">標題H5 </h5>
<h6 align="right">標題H6 </h6>

段落元素

突出顯示一段文本
獨占一行
每個元素都具備垂直空白距離
屬性:align
取值:left / center / right

<p></p>
<p align="left">left</p>
<p align="center">center</p>
<p align="right">right</p>

換行元素

<br>

水平線元素

<hr>

分區元素

  1. 塊分區元素
    作用:佈局
    獨占一行
    <div></div>
    屬性:align (left / center / right)
  2. 行內分區元素
    設置同一行文本的不同樣式。
    能在一行中顯示多個。
    <span></span>

行內元素與塊級元素

  1. 按照元素不同的表現形式,對元素進行的一個類別的劃分。
  2. 塊級元素
    在網頁中能夠獨占一行的元素都是塊級元素
    p,div,h1~h6
    以上元素都有align屬性
  3. 行內元素
    多個元素能夠在一行內顯示的,都是行內元素
    span,i,b,s,u,sub,sup
<b><i><u>xxxx</u></i></b>

HTML、CSS、JavaScript 簡易介紹

寫網頁時常聽到的三大名稱:

簡單來說:
html是網頁的結構,CSS是網頁的樣式,JavaScript是網頁的行為。

  • HTML 網頁的結構,看起來都方方正正。
  • CSS 把外貌給顯示出來,讓網頁的外貌看起來美觀一些
  • JavaScript 控制網頁裡面的內容以及使用者的操作行為

HTML 基本觀念

  • 巢狀結構
  • 元素(element)
  • 屬性(attribute)
    使用文本編輯軟件即可做開發,以 .html 或 .htm 為結尾的文件,最後使用瀏覽器開啟檔案即可顯示。

巢狀結構

簡單來說就是一層一層的概念
範例:

<html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <h1>標題H1 </h1>
    </body>
</html>

因為巢狀結構有分層級,上層稱為父元素,下層稱為子元素
而層級之間有一定上下、左右的規則,會透過Document Object Model (DOM)來進行遍歷的順序。

元素(element)

使用過程中,需要用 <> 括起來。
HTML元素網址

屬性(attribute)

可以藉由各種方式去設定元素或調整它們的行為。
簡單來說,除了最開頭的元素以外,中間都是屬性。

HTML屬性網址

CSS

CSS就是管理網頁的外貌。

.mainBody{
    min-width: 1024px;
    width: 100%;
    height: 100%;
}
.mainBody .logo{
    height: 45px;
    line-height: 45px;
    background-color: #214D8A;
}

JavaScript – JS

JavaScript 就是管理網頁的內容以及使用者的操作行為,為了要控制網頁的內容。

<script>
</script>

就是實做JavaScript的地方。

Git – 常用指令

git checkout # 有兩個功能,一個是branch, HASH 間的切換,另外一個則是工作區檔案的還原。
git checkout . # 還原所有檔案
git checkout app.html # 還原一個檔案

git remote update # 檢查遠端是否有更新
git branch # 檢查local分支
git branch -a # 檢查雲端最新分支

git stash # 備份當前的工作區
git stash save abcd # 將當前修改的檔案暫存起來並命名為abcd
git stash list # 顯示git內的所有備份,可以利用這個列表來決定從那個地方恢復。
git stash apply stash@{0} # 把Stash撿回來用
git stash drop stash@{0} # 從列表裡刪掉暫存的Stash了
git stash clear # 刪除所有暫存的操作

git reset –hard # 回復到最新提交版本
git reset e1d58ef^ # 拆掉commit的版本

git add -u # 加入所有被更動的檔案(包含 modified 及 deleted)
git log # 查看提交歷史紀錄

git pull origin # 從遠端更新

git push origin my-tag # push 指定標籤 (多個標籤以空白隔開)
git push –tags # push 所有 tag

git diff # 檢查修改內容
git remote -v # 查詢遠端pull、push路徑

tag相關

git tag -l # 查詢所有tag名稱
git tag -a test_tag -m “” # 新增一個名為test_tag的tag
git push origin test_tag # push 指定標籤 (多個標籤以空白隔開)

git push origin –tag # push 所有 tag

git push –tags # push 所有 tag

Line bot – 創建Line bot帳號

建立Heroku

首先進到Heroku的帳戶,登入會看到這個畫面

Create new app,創建名字

建立 屬於自己的Line Bot

developers網址

登入後長下面這樣,點選Create a new provider

請輸入一個Providers的名稱之後,點擊Create

左上角是名字,選擇 Create a Messaging API channel

Channel name
Channel description
Category
Subcategory
Email address

以上這些填一填,最下方打勾

創建完成!

將創建好的Line Bot與Heroku進行串接

點選 Messaging API

點選 Auto-reply messages 右邊的 Edit

點選後會跳出一個新頁面,Webhook設置為啟用

點選Channel access token 右方issue,之後會產生一串有英文數字特殊符號的字串,可以先複製起來,後續會使用到。

移動到最上方,選擇Basic settings後,到Channel secret點擊issue,
這串也會跟著改變,也要複製下來,後面會使用到。

編輯程式

填入自己當時複製起來的字串。第一個最長,第二個是比較短的。

# Channel Access Token
line_bot_api = LineBotApi('YOUR_CHANNEL_ACCESS_TOKEN')
# Channel Secret
handler = WebhookHandler('YOUR_CHANNEL_SECRET')

將代碼傳送到Heroku上

到Heroku的官網,依照自己的系統來安裝套件。Heroku官網

安裝成功後我們來登入Heroku,輸入:

heroku login

會自動開啟新網頁視窗請你登入帳號密碼,下方為登入成功畫面,之後就不需要再管這個畫面了。

Git 基本設定以及Push Hearoku

查看目前的設定

git config --list

如果本來就沒有設定git,需要輸入以下指令來進行初始化:

git config –global user.name “你的名字”
git config –global user.email “你的信箱”

在自己的專案創建一個.git檔案(該動作只需要做一次)

git init 

回到資料夾檢查看有沒有出現.git的資料夾,
通常是被隱藏起來,想看的話要把檢視->隱藏的項目打勾

將 git 資料夾與 Heroku作為連接,這邊HEROKU_APP_NAME是要照你當時在Heroku的專案名稱一樣,
如果不同,他則會報錯

heroku git:remote -a {HEROKU_APP_NAME}

下圖為錯誤訊息:

下圖為設定成功的訊息:

然後照下圖方式

指令如下:

git add .
git commit -m "你想輸入的訊息(必填)" 
git push -f heroku master

最後會執行一段時間,成功如下圖

Line Bot 與 Hearoku 綁定

剛剛已經完成將程式碼PUSH到Hearoku了,現在則是讓Line Bot能夠到Hearoku去運行我們想要機器人為我們做的事情。

回到LINE Developers的Messaging API,
選擇 Webhook URL 點擊Edit 將網址貼上去,格式:

https://{HEROKU_APP_NAME}.herokuapp.com/callback

輸入完後點選Verify,成功後就會將剛剛輸入的URL存上去了。

回到Heroku網站,點選Open app,跳出的新網頁就是你的專案網址。

測試自己做的機器人回覆內容

目前機器人是看打什麼字就回復什麼內容,
如果要關閉每次都跳出那感謝訊息,要到回到回應設定,將自動回覆訊息關閉。

clone heroku 的程式碼

有些人開發不一定是使用同一台電腦,clone的指令如下:

git clone https://git.heroku.com/YOUR_HEROKU_APP_NAME.git

YOUR_HEROKU_APP_NAME這串英文改成你的專案名字就可以成功clone下來了。

Git – ubuntu安裝及簡單設定

Linux 安裝git

sudo apt-get install

驗證git是否已安裝成功

$ which git

查詢git版本

$ git --version

git 產生SSH Key

ssh-keygen

查看SSH Key

cd ~/.ssh
cat ~/.ssh/id_rsa.pub

查詢目錄的狀態

$ git status

查詢目前的設定

$ git config --list

查詢特定檔案的commit

$ git log XXXXX.py

注意:需要有副檔名

查看特定檔案修改什麼

$ git log -p XXXXX.py

+代表新增

-代表刪除

SourceTree的話也可以看到:

在commit時點選:Log Selected 則會另外彈出一個視窗

查詢”單行”代碼作者及修改時間

$ git blame XXXX.py

組合內容為:

commit的識別碼 、 修改人名 、修改日期及時間 該行號(上圖我僅擷取2016行~2023行)

如果檔案太多行了,你只想看某而已,就加入-L 開始行號~結束行號

$ git blame -L 2010,2030 XXXX.py

有些檔案不想放在Git裡面

先建立檔名為:

.gitignore

然後編輯這個檔案的內容:

#忽略 test.py 檔案
test.py

#忽略 log目錄下的所有檔案
log/*

#忽略所有附檔名是 .tmp的檔案
.tmp

#忽略所有檔名為settings的檔案
settings.*

若不知道使用的工具或程式語言通常會忽略哪些檔案,可以至此連結查看

清出忽略

$ git clean -fx

忽略部分補充

如果要忽略的檔案在編輯.gitignore時就已經存在,需要先移出Git控管,之後就會被忽略了。

舉例:在3月1號時已經將test.py加入Git控管中,在3月5號才將.gitignore內新增要將test.py忽略,但此時Git已經在控管了,所以3月5號加的忽略不會進行,必須先將目前控管中的test.py移除。

救回被刪除的檔案

此三個檔案被我不小心刪掉了

救回方式(等同於還原所有檔案):

$ git checkout .

如果想救一個檔案:

$ git checkout S01.py

SourceTree用法

打開SourceTree會看到上面有被誤刪的檔案,點選最右邊的-,讓誤刪的檔案下去Unstaged files的位置。

鼠標移至誤刪的檔案位置,右建點選discard(丟棄)

然後會問你:您確定要放棄對這些文件的更改嗎?

意思就是⇒你不要刪除嗎

按下OK!!!!完成後就會看到誤刪的檔案回來了

補充

並不是所有檔案都能救出來,如果.git的目錄被刪除了,代表歷史紀錄也被刪除,會救不回來。

修改commit描述的訊息文字

修改最後一筆

$ git commit --amend -m "fix commit msg"

退版方式

先查看版本號

$ git log --oneline

方法一:相對位置

$ git reset d7ea967^

最後加的^代表前一次的意思,所以是指da824b4的commit,如果是d7ea967^^,就是前兩個版本,如果超過5個,可以寫成d7ea967~5,畢竟太多^很容易看得眼花。

相對位置也可以用另一種來表示:

$ git reset master^

$ git reset HEAD^

因為HEAD和master目前都是指向d7ea967這個commit,而且d7ea967這數字很難記,所以通常都不會用commit的英數來做,都已以上兩個方式,且都會一樣的結果。

方法二:絕對位置

直接指明在git log的版本號

$ git reset d9d68f9(版本號)

sourceTree用法

回到History,點選右鍵

已經退版但想再回一開始的版本

git reset HEAD~2,現在要在把他reset回到一開始(d7ea967)的commit。

$ git reset d7ea967 --hard

忘記版本的數字

$ git reflog

顯示HEAD有移動時的所有位置,目前HEAD的位置就是在執行完”reset”的位置,所以可以猜測,d7ea967是在reset前的位置,

Reset 的模式

Reset英文單字翻譯為”重新設定”,但事實上Git的Reset指令用中文來說比較像是”前往”或”變成”的概念,事實上並沒有真的把這個commit”拆掉”(放心,所有commit都在)

比較正確的解讀應該是”我要前往兩個commit之前的狀態”,因為實際上git reset指令也不是真的刪除或是重新設定,只是”前往”到指定的commit。

git reset 指令可以搭配參數使用,常見的三種參數,分別:

  • mixed
  • soft
  • hard

HEAD是什麼?

HEAD 是一個指標,指向某一個分支,通常你可以把 HEAD 當做「目前所在分支」看待。

$ cat .git/HEAD

從這個檔案看起來,HEAD 目前正指向著 master 分支。

如果有興趣再深入看一下 refs/heads/master 的內容就會發現,其實所謂的 Master 分支也不過就是一個 40 個字元的檔案罷了:

切換分支,在看看HEAD檔案內容

$ git checkout dog
$ git cat .git/HEAD

HEAD 通常會指向目前所在的分支。不過 HEAD 也不一定總是會指向某個分支,當 HEAD 沒有指向某個分支的時候便會造成「detached HEAD」的狀態,詳情請參閱,待補。

在 SourceTree 的介面裡,HEAD 是以一個「空心的小圈圈」圖示呈現

在切換分支的同時,除了 HEAD 的內容會改變之外,在Reflog,當 HEAD 的內容改變的時候也會留下紀錄。

分支(Branche)

什麼是分支?

在開發軟體時,可能同時會有多人在開發同一功能或修復錯誤,也可能會有多個發佈版本的存在,並且需要針對每個版本進行維護。

為了能支援同時進行數個功能的增加或版本控制,Git具備了分支的功能。

建立分支

$ git branch 新的分支名稱

查詢現在的分支

$ git branch

前方有*代表目前所在分支

切換分支

$ git checkout 分支名稱

在 checkout 命令給定 -b 參數執行,可以同時建立分支和切換。

$ git checkout -b 分支名稱

rebase

離開rebase

git rebase --abort

在.git目錄裡面有什麼

此處先建立一個index.html檔案,再add後查看狀態。

利用hash來確認該檔案的值,來對照資料夾是否有這個檔案名。

.git\objects\30

Git會用40個字的SHA-1值的前面2字作為目錄,剩下38字是檔案名字

檢視差異

參考網址

git difftool --dir-diff --tool=meld HEAD~ HEAD

建立一個方便的Bash函式:

git-diff-meld() (
  git difftool --dir-diff --tool=meld "${1:-HEAD~}" "${2:-HEAD}"
)