# 0217 會議記錄
## Flask 小組
### Regular expression
1. [講義](https://docs.google.com/presentation/d/15RqysT1RU1yTgTUcHo_4JErnRBUArnsm_66QnaGWmv4/edit#slide=id.p)
2. 實作
* 先輸入 `ipython3` (互動式直譯器),進到 python 使用畫面
* 使用Regular expression 前先 `import re`
* 退出 `exit`
3. 結合 Flask & SQLite 實作 demo
:::spoiler
```=python
import sqlite3,re
from flask import Flask,request,jsonify
#------regular expession----#
def check_platenum(car_data):
find=0
condition=['[A-Z]{3}\-[0-9]{4}','[A-Z]{3}-[0-9]{3}','[A-Z]{2}-[0-9]{3}',
'[0-9]{3}-[A-Z]{2}','[0-9]{2}-[A-Z]{2}','[0-9]{4}-[A-Z]{2}',
'[0-9]{3}-[A-Z]{3}','[0-9][A-Z]{2}-[0-9]{3}','[A-Z]{2}-[0-9]{2}']
platenum=car_data["platenum"]
for i in range(len(condition)):
res=re.search(condition[i],str(platenum))
try:
res.group()
find=1
break
except:
find=0;
return find
#------------sqlite---------#
def connect_db():
dbcon=sqlite3.connect('example.db')
return dbcon
def insert_db(car_data):
dbcon=connect_db()
cur=dbcon.cursor()
if check_platenum(car_data)==1:
cur.execute(
"INSERT INTO plate(platenum, carcolor, cartype) VALUES(?, ? ,?)",
(car_data['platenum'],car_data['carcolor'],car_data['cartype'])
)
dbcon.commit()
dbcon.close
return db_message(1)
else:
return db_message(0)
def show_db():#將所有的資料回傳
datas = []
try:
dbcon = connect_db()
dbcon.row_factory = sqlite3.Row
cur = dbcon.cursor()
cur.execute("SELECT * FROM plate")
rows = cur.fetchall()
for i in rows:
data = {}
data["platenum"] = i["platenum"]
data["carcolor"] = i["carcolor"]
data["cartype"] = i["cartype"]
datas.append(data)
except:
datas = []
return datas
def db_message(stasus):#response
msg=[]
de={}
if stasus==1:
de["State"]="1"
de["Message"]="Insert data successfully"
else:
de["State"]="0"
de["Message"]="Insert data failed,platenum type error"
msg.append(de)
return msg
#------------flask----------#
app=Flask(__name__)
@app.route('/carapi/insert',methods=[ 'POST',])
def insert_data():
car_data=request.get_json()
return jsonify(insert_db(car_data))
@app.route('/carapi/show',methods=['GET'])
def show_data():
return jsonify(show_db())
if __name__ == '__main__':
app.run(debug=True)
```
:::
### Q&A
* 什麼時候字串前要加 r, 什麼時候不必加?
> 如果用 compile 時就要加 r
> 如果使用 re.search("pattern", "string"),這種方法就不用加 r" "
* 請預測下列程式執行結果 ( compile 沒有加 r ):
```
r = re.compile('(h)(i)')
m = r.match('hi...').group()
print(m)
```
> regex 的跳脫字元跟原本的不一樣,要避免衝突
> 用以下例子說明 :
``` python
print(r'hello\nhello')
print('------------')
print('hello\nhello')
```
```python
import re
regex1 = re.compile('\\^')
regex2 = re.compile(r'\\^')
string = '^'
print(regex1.search(string))
print(regex2.search(string))
```
[參考資料1](https://stackoverflow.com/questions/21104476/what-does-the-r-in-pythons-re-compiler-pattern-flags-mean)
[參考資料2](https://www.pythontutorial.net/python-basics/python-raw-strings/)
## RESTful 小組
1. 一個物件通常有四種操作 : 新增、修改、刪除、搜尋
2. [車辨系統 api](https://hackmd.io/@OsEDv306SvaJ66Gf5whwYQ/HySnBnQTs)
3. 獲取軌跡 (透過事件ID) `URI : /api/tracks/<event_id>` : 想要獲取特定軌跡資料,可以透過 `id`獲取
4. body: 要新增軌跡資料的資訊加進去
5. response : 新增與搜尋結果為何
### Q&A
* 為什麼**獲取軌跡**和**新增軌跡**網址一樣,而其中差別是**GET**和**POST**,會不會造成其誤解?
> 根據 RESTful 定義,網址透過簡白方式,可以使使用者易了解 api 網址的用處。
> 想要獲取軌跡的話,method 使用 GET ; 想要新增軌跡的話,method 改成 POST,就無需再寫一個新的網址。(網址太多使用起來不方便)同理,要刪除的話,method 改成 DELETE。
* 為什麼**分析軌跡**有兩個以上大括號
> `車型軌跡分析`,搜尋結果可能不只一個車牌號碼。
* 能否釐清一下, track 是指一張畫面,還是一串軌跡 (許多張畫面)?
> track是指一張畫面
* 一張畫面叫「軌跡」很奇怪。要不要改名為 event ?一系列 event 串起來才叫 track.
> 改成event應該沒問題
* 另外「搜尋軌跡」並不會產生新資料,為什麼你們用 POST而非 GET?
> 若使用get不會使用body
* 有分成兩派 : 其中一派 CRUD (CREATE、READ、UPDATE、DELETE)這四個功能應用四種不同method: CREATE->POST、READ->GET、UPDATE->PUT、DELETE->DELETE。討論好,後續風格一致。
* `Search` method 用 GET 即可。
## SQLite 小組
1. [table](https://hackmd.io/BqIrB_86RcmVqime7aDDCg)
2. 改善參數、新增table
## 開會
==下次開會時間 : 3/4(六) 14:00==
* 進度 :
1. 先建一個雛形,做測試
2. Flask小組 : 列出有哪些 function -> 其他兩組有無需要分工 (2/28 前看可不可以)
3. SQLite 小組 : 使用現有的車辨系統撈一些測試資料出來 (2/28 測試時,需有足夠資料),建立資料庫和備用。
4. 請冠伶學姊創一個共用的group
5. 若study完,若該技術有意義,可以派各組報告,讓大家多學一點(ex, 今天的regex)。
6. RESTful 小組 : 思考可以用現在訂出來的的api做哪些測試,而這些測試是否可以自動化進行,效果較好。
## 補充
* 警局給的東西有些網頁開啟有亂碼
* 處理方式 : 安裝 [Set Character Encoding](https://chrome.google.com/webstore/detail/set-character-encoding/bpojelgakakmcfmjfilgdlmhefphglae/related)
* 到有亂碼的網頁中 : 右鍵選擇 `Set Character Encoding` -> `Unicode(UTF-8)`
* 冠伶 :
共用的目錄在 `/home/OPEN`,就請 SQLite 小組建一下 table 囉 ~
我將大家都 "developer" 這個群組,並將 /home/OPEN 的 group 設為 developer,並將權限設為 drwxrwxr-x。
* sudo groupadd "developer"
* sudo usermod -a -G developer [username]
* sudo chown :developer OPEN
* sudo chmod 775 OPEN
以上是我為達成目的,而使用的 command。