2020年1月29日 星期三
安裝CKAN
CKAN 是著名的開放資料入口平台(Data Portal Platform)
因為原始安裝方法,問題太多,裝不進去,故改用docker-compose安裝,很順利的迅速裝好,以下說明如何安裝:
1.準備好專案目錄及git CKAN下來
cd /path/to/my/projects
git clone https://github.com/ckan/ckan.git
2. 將範例.env.template檔,複製成.env檔,並將.env裡的CKAN_SITE_URL參數改成連到CKAN的網址
cp contrib/docker/.env.template contrib/docker/.env
3. 輸入下列指令建立docker
cd contrib/docker
docker-compose up -d --build
4. 剛安裝ckan是沒有管理者,用下列指令在docker中建管理者,[your name] 換成你的帳號
docker exec -it ckan /usr/local/bin/ckan-paster --plugin=ckan sysadmin -c /etc/ckan/production.ini add [your name]
因為原始安裝方法,問題太多,裝不進去,故改用docker-compose安裝,很順利的迅速裝好,以下說明如何安裝:
1.準備好專案目錄及git CKAN下來
cd /path/to/my/projects
git clone https://github.com/ckan/ckan.git
2. 將範例.env.template檔,複製成.env檔,並將.env裡的CKAN_SITE_URL參數改成連到CKAN的網址
cp contrib/docker/.env.template contrib/docker/.env
3. 輸入下列指令建立docker
cd contrib/docker
docker-compose up -d --build
4. 剛安裝ckan是沒有管理者,用下列指令在docker中建管理者,[your name] 換成你的帳號
docker exec -it ckan /usr/local/bin/ckan-paster --plugin=ckan sysadmin -c /etc/ckan/production.ini add [your name]
命令列執行的python程式 - 抓Json list超過時間的項目
本篇是寫一個在命令列執行的Python程式,功能是抓Json list裡超過基準時間的項目。這個程式特別在要保持可攜性,因為Python程式如果要求要一堆特別的套件,才能實現功能,交給同事使用時,就會很難正常使用。這個Python程式的原則是,只處理shell script不容易作到的事情,其它盡量在命令列模式下完成,使用時指令會像下列格式:
python parse.py list.json 2019-12-05T03:28:14Z > id.txt
輸入和輸出都是靠命令列完成,Python不用管太多。
以下Python程式還是要裝Python-dateutil或py-dateutil套件,但已經非常精簡,而且不分Python版本都能執行:
-----------------------------------------------------------------------------------------------------------------------------
import sys
import json
import dateutil.parser
# 檔案名,此檔包含從ckan抓回來的,資料集內的檔案清單
jsonFile = sys.argv[1]
# 基準時間,時間格式是ISO 8601
baseTime = sys.argv[2]
# 將Dataset的資料JSON讀出來
with open(jsonFile, 'r') as f:
try:
jsonDatasetMeta = json.load(f)
except:
print('-1')
print('JSON format error')
exit(1)
# 將基準時間轉成時間變數
try:
lastTime = dateutil.parser.parse(baseTime)
except:
print('-1')
print('base time error')
exit(1)
if 'result' not in jsonDatasetMeta:
print('-1')
print('JSON file content error: result not in jsonDatasetMeta')
exit(1)
if 'resources' not in jsonDatasetMeta['result']:
print('-1')
print('JSON file content error: resources not in jsonDatasetMeta')
exit(1)
try:
for file in jsonDatasetMeta['result']['resources']:
fileCreated = dateutil.parser.parse(file['created'] + 'Z')
if fileCreated > lastTime:
print(file['url'])
except Exception as e:
print('-1')
print('File created time error.')
print(e)
exit(1)
---------------------------------------------------------------------------------------------------
2020年1月14日 星期二
Tesseract OCR
Tesseract OCR 是一套可以辨識照片中的文字的強大工具。
本篇文章介紹如何安裝及使用。
1.
在Linux安裝套件可以簡單的執行
sudo apt-get install tesseract-ocr
sudo apt-get install tesseract-ocr-chi-tra #中文語言包
sudo apt-get install tesseract-ocr-eng #英文語言包
2.
安裝好後,再到
自行下載最佳語言包,到下列語言包目錄
/usr/share/tesseract-ocr/5/tessdata
覆蓋舊的chi-tra及eng.traineddata
3.
執行方法:tesseract sample.jpg sample -l chi_tra+eng --psm 1 --oem 1 alto
參數說明:
sample.jpg是你要辨識的照片
sample是輸出主檔名
chi_tra+eng是中文模型加英文模型(模型名稱可以參考這個模型清單https://github.com/tesseract-ocr/tessdata_best)
--psm 1是Automatic page segmentation with OSD
--oem 1是LSTM引擎
alto 是Output in ALTO format (OUTPUTBASE.xml).,類似hOCR的格式
4.
辨識的結果是XML格式,裡面包含了辨識的字和位置,要讀這個檔案的內容,可以用下列軟體:
http://www.prima.cse.salford.ac.uk/tools/PAGEViewer
開啟剛才完成的XML檔案和原始圖片,PageViewer會合併在一起秀給你看。將鼠標放在圖片的字上,就會秀出辨識的字串。
簡潔啟動gunicorn_service.sh
本篇介紹將Gunicorn的gunicorn_service.py,再包一個shell script,讓服務啟動的指令簡潔一些。
原本python程式包好Gunicorn後,啟動方式如下:
source activate normTime
python gunicorn_service.py --port 1234 start
source deactivate
如果要關閉服務,或是reload,也要照上面的指令,但start改成stop或reload。
我另外寫一個shell script,將上述指令包起來,並把變數抽出來,執行檔存為gunicorn_service.sh :
#!/bin/bash
PORT=1234
APPNAME=timeRestful
ENVNAME=normTime
source activate ${ENVNAME}
python gunicorn_service.py --port ${PORT} --app ${APPNAME}:app $1
source deactivate
上述程式碼將port號碼、APP檔名、python虛擬環境名稱,抽出來,使更換服務時,方便修改。
gunicorn_service.py要加下列兩段程式碼,使"--app"參數可以用:
--------------------------------------
parser.add_argument(
'-a',
'--app',
metavar='APP',
type=str,
default='',
help='Flask APP name with "....:app".'
)
--------------------------------------
.
.
if args.app != '':
self.config.app = args.app
--------------------------------------
啟動時,可以直接下./gunicorn_service.sh start ,停止服務./gunicorn_service.sh stop,重載服務./gunicorn_service.sh reload。
其實後面的start, stop, reload都是直接傳遞給gunicorn_service.py,故任何gunicorn_service.py可以接授的關鍵字,都可以用。
Flask用Route參數和Get參數比較
原本之前寫Python的Flask是用Route的方式,如下範例:
http://server:50000/norm1/字串/norm2/字串
程式寫法如下:
@app.route("/norm1//norm2/ ")
def normAPcode(APstr,APstr2):
使用GET的方式取後參數,形式如下:
http://server:50000?norm1=字串&norm2=字串
程式寫法如下:
@app.route("/nenormalize")
def nenormalize():
dicParam = request.args
dicParam["norm1"]
dicParam["norm2"]
Route方式傳參數缺點
1.最大的缺點是,字串裡有"/"的話,會無法處理(用瀏覽器開時會被當成網址裡的路徑),也許寫程式時,用url encode可以避免,但變成不能用瀏覽器測試。
2.如果有多個參數要傳,就要寫死在Route上,如果有時候只想傳一個,就要另外再寫一個Route,跟GET傳參數比起來,GET可以可有可無,在程式碼內加個if判斷norm2 in dicParam就好。
訂閱:
文章 (Atom)
-
Line提供Python的套件,給Python程式設計者可以使用套件API跟LINE互動,就不需要撰寫太多複雜的程式及JSON傳輸格式。套件是以Flask提供服務,啟動後,就是LINE的Webhook。 下載套件方法: pip install line-bot-sdk...
-
這個Python程式可以線上將TWNIC的台灣IP清單,轉成iptables的指令,貼到/etc/iptables.rules上,就可以限制只能台灣的IP能存取。 限制port時,用如下寫法,port 80使用"TaiwanIP"規則(平常我們是寫ACC...
-
https://blog.xuite.net/yh96301/blog/367515625-Ubuntu+15.1%E5%AE%89%E8%A3%9DVMware+Workstation+Player+12.1 https://blog.csdn.net/yzf0011/ar...
