2020年1月29日 星期三

漫谈 Clustering (4): Spectral Clustering



http://blog.pluskid.org/?p=287

Psql 基本操作方式(一)


http://sql.onlinedoc.tw/2016/07/psql.html


安裝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]

命令列執行的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就好。

IKEA吊櫃廚櫃

 好不容易裝好IKEA買來的吊櫃,花了三天。 從組裝,鑽牆,上牆調水平,累死我了。