Symfoware

Symfowareについての考察blog

OpenCV 3.2をDebian 8にインストールする

OpenCV
2017.1.22時点で最新版の3.2をDebian 8にインストールしてみます。



インストールスクリプト



ソースからビルドしてインストールします。
・・・が依存しているライブラリが多く、インストールは結構面倒なようです。

調べてみると、親切な方がインストールスクリプトを公開してくださっています。
http://milq.github.io/install-opencv-ubuntu-debian/

これを使わせていただくことにしました。


まず、実行に必要なライブラリをインストール。


# apt-get install sudo wget




apt版のopencvがインストールされている場合は、事前に削除しておきます。


# apt-get autoremove libopencv-dev python-opencv




インストールスクリプトをダウンロードして実行。


# cd /usr/local/src/
# wget --no-check-certificate https://raw.githubusercontent.com/milq/scripts-ubuntu-debian/master/install-opencv.sh
# chmod +x install-opencv.sh
# ./install-opencv.sh



これでインストール完了です。
※私の環境では、インストールに20分程度必要でした




Pythonから呼び出しとバージョン確認



Python2からcv2をインポート。
バージョンを確認してみます。


# python
Python 2.7.9 (default, Jun 29 2016, 13:08:31)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.2.0'




Python3も同様に試してみます。


# python3
Python 3.4.2 (default, Oct 8 2014, 10:45:20)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.2.0'




ちゃんとインポートできていますね。


テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/01/22(日) 22:40:15|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

JenkinsのパラメータージョブをPythonでリモートから実行する

PythonでJenkinsのジョブが実行できるようになりました。
JenkinsのジョブをPythonでリモートから実行する

パラメーターを指定してのジョブ実行を試してみます。


ジョブの編集



「target_id」というパラメーターを追加しました。

699_01.png


シェルスクリプトでは、受け取ったパラメーターを表示するよう変更しています。

699_02.png


ここで指定された値を実行に時間のかかるジョブに渡す想定です。





Pythonプログラム



パラメーター付きのジョブを実行する際は、
「job/[job名]/buildWithParameters」
にGETリクエストを送信します。

「要因」の項目にもデータを送るサンプルはこのようになりました。



  1. # -*- coding:utf-8 -*-
  2. import urllib2, base64, urllib
  3. build_param = {}
  4. build_param['token'] = u'sample_token'
  5. build_param['target_id'] = '日本語パラメーター'
  6. build_param['cause'] = 'ここが要因'
  7. data = urllib.urlencode(build_param)
  8. # URLは[jenkins]/[ジョブ名]/buildWithParameters
  9. url = 'http://192.168.1.102:8080/job/test-job/buildWithParameters'
  10. # 設定画面で表示されたユーザID、APIトークンでベーシック認証
  11. username = 'symfo'
  12. password = 'eb6d158c477b8f8f700d54c2d9c6dc12'
  13. request = urllib2.Request(url + '?' + data)
  14. # http://stackoverflow.com/questions/2407126/python-urllib2-basic-auth-problem
  15. # You need the replace to handle encodestring adding a trailing newline
  16. # (https://docs.python.org/2/library/base64.html#base64.encodestring)
  17. base64string = base64.encodestring('%s:%s' % (username, password)).replace('\n', '')
  18. request.add_header("Authorization", "Basic %s" % base64string)
  19. result = urllib2.urlopen(request)




ちゃんとパラメーターが送信できました。
日本語でも問題ありません。

699_03.png

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2016/06/29(水) 00:50:51|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

JenkinsのジョブをPythonでリモートから実行する

処理に時間のかかるバッチプログラムをJenkinsのジョブとして定義。
クライアントからはそのジョブを起動する処理を書いて、すぐに処理を終了させる。
なんてことができないか調べてみました。


最初にうまく行かなかった方法を記載しておきます。


JenkinsのAPI Token



Jenkins 2.11のジョブを実行してみます。
まず、API Tokenを取得する必要があるようです。

ログインした状態で、設定画面を開きます。

698_01.png


画面の中央辺りに、「APIトークンの表示」というボタンがあるのでクリック。

698_02.png


ここにユーザーIDとAPIトークンが表示されます。

698_03.png





ジョブの作成



「test-job」というジョブを作成。
内容は、文字列をechoするだけです。

698_04.png

698_05.png


これを別端末からPythonで実行してみます。




Pythonのサンプルプログラム



job/[jobの名称]/buildにpostすれば動くとのことだったので、こんなプログラムを作成しました。

※このプログラムは動作しません。


  1. # -*- coding:utf-8 -*-
  2. import urllib2
  3. import json
  4. # URLは[jenkins]/[ジョブ名]/build
  5. url = 'http://192.168.1.102:8080/job/test-job/build'
  6. # 設定画面で表示されたAPIトークン
  7. password = 'eb6d158c477b8f8f700d54c2d9c6dc12'
  8. # POSTする値はtoken?
  9. data = {
  10.     'token' : password
  11. }
  12. request = urllib2.Request(url, data=json.dumps(data))
  13. request.get_method = lambda: 'POST'
  14. # job実行
  15. response = urllib2.urlopen(request)
  16. ret = response.read()
  17. print 'Response:', ret
  18. print 'ok'




実行するとこんなエラーが。


Traceback (most recent call last):
File "jenkins.py", line 22, in <module>
    response = urllib2.urlopen(request)
File "/usr/lib/python2.7/urllib2.py", line 154, in urlopen
    return opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 435, in open
    response = meth(req, response)
File "/usr/lib/python2.7/urllib2.py", line 548, in http_response
    'http', request, response, code, msg, hdrs)
File "/usr/lib/python2.7/urllib2.py", line 473, in error
    return self._call_chain(*args)
File "/usr/lib/python2.7/urllib2.py", line 407, in _call_chain
    result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 556, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 403: No valid crumb was included in the request








ビルド・トリガのリモートからビルド



諦めかけていた時、改めてジョブの設定画面を見てみると、
「リモートからビルド」の設定を見つけました。

698_06.png



リモートからビルドを実行するには次のURLを使用します:

JENKINS_URL/job/test-job/build?token=TOKEN_NAME
もしくは、
/buildWithParameters?token=TOKEN_NAME

&cause=要因を追加する(オプション)と、ビルドを実行した要因として記録することができます。




認証トークンに適当な文字列を入力して保存します。

698_07.png


ユーザーIDとAPIトークンはベーシック認証で指定します。
Python標準機能だとうまく認証が通過できなかったので、

Python urllib2 Basic Auth Problem
こちらを参考に、自分でヘッダーに情報を書き込みます。


  1. # -*- coding:utf-8 -*-
  2. import urllib2, base64
  3. # URLは[jenkins]/[ジョブ名]/build
  4. url = 'http://192.168.1.102:8080/job/test-job/build?token=sample_token'
  5. # 設定画面で表示されたユーザID、APIトークンでベーシック認証
  6. username = 'symfo'
  7. password = 'eb6d158c477b8f8f700d54c2d9c6dc12'
  8. request = urllib2.Request(url)
  9. # http://stackoverflow.com/questions/2407126/python-urllib2-basic-auth-problem
  10. # You need the replace to handle encodestring adding a trailing newline
  11. # (https://docs.python.org/2/library/base64.html#base64.encodestring)
  12. base64string = base64.encodestring('%s:%s' % (username, password)).replace('\n', '')
  13. request.add_header("Authorization", "Basic %s" % base64string)
  14. result = urllib2.urlopen(request)




プログラムを実行すると、リモートからジョブが実行できました。

698_08.png

698_09.png


テーマ:サーバ - ジャンル:コンピュータ

  1. 2016/06/29(水) 00:19:48|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Python Query Builder「Orator」のインストールと使い方

しっかりしたORMツールではなく、CodeIgniterに搭載されているQuery Builderのような
SQL文の構築を楽にしてくれるライブラリがPythonにないか探していたところ、
「Orator」を見つけました。

https://orator-orm.com/

ORMがメインですが、Query Builderの機能もあるようです。
https://orator-orm.com/docs/0.8/query_builder.html

Debian 8にインストールして使ってみます。



インストール



まず、必要なライブラリをインストール


# apt-get install python-dev python-setuptools g++



orator自身はeasy_installでインストールしました。


# easy_install orator



ここで

[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)


というエラーが発生する場合は、ca-certificatesをインストールすればOKです。
Debian easy_installで[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)


# apt-get install ca-certificates






簡単なサンプル



CodeIgniter3 JSONを返すAPIサーバーとして使用する

こちらで使用した郵便番号テーブルを検索してみます。


サーバー:localhost
データベース:sample
ユーザー:root
パスワード:P@ssw0rd




テーブルの構成はこんな感じ。


create table zip (
    zip_code char(7) not null primary key,
    address varchar(200)
);




MariaDBを使用しているので、接続用のライブラリをインストールしておきます。


# apt-get install python-mysqldb




こちらを参考に、データベースに接続。
直接SQL文を実行してみます。
Basic Usage


その前に、0.8.1だとこんなエラーが発生しました。


TypeError: 'autocommit' is an invalid keyword argument for this function



orator/connectors/mysql_connector.pyを編集。
35行目の「config['autocommit'] = True」をコメントします。


# vi /usr/local/lib/python2.7/dist-packages/orator-0.8.1-py2.7.egg/orator/connectors/mysql_connector.py




  1.     def connect(self, config):
  2.         config = dict(config.items())
  3.         for key, value in keys_fix.items():
  4.             config[value] = config[key]
  5.             del config[key]
  6.         #config['autocommit'] = True
  7.         config['cursorclass'] = cursor_class
  8.         return self.get_api().connect(**self.get_config(config))




サンプルを作成して実行。


  1. # -*- coding:utf-8 *-
  2. from orator import DatabaseManager
  3. config = {
  4.     'mysql': {
  5.         'driver': 'mysql',
  6.         'host': 'localhost',
  7.         'database': 'sample',
  8.         'user': 'root',
  9.         'password': 'P@ssw0rd',
  10.         'prefix': ''
  11.     }
  12. }
  13. db = DatabaseManager(config)
  14. results = db.select("select * from zip where zip_code = %s", ['0600000'])
  15. for row in results:
  16.     print row['address']




MySQLの場合、プレースフォルダーは「?」でなく「%s」を使用すれば良いようです。


# python sample.py
北海道札幌市中央区以下に掲載がない場合








Query Builder



上記SQL直接実行のソースをQuery Builderを使用したパターンに変更してみます。


  1. # -*- coding:utf-8 *-
  2. from orator import DatabaseManager
  3. config = {
  4.     'mysql': {
  5.         'driver': 'mysql',
  6.         'host': 'localhost',
  7.         'database': 'sample',
  8.         'user': 'root',
  9.         'password': 'P@ssw0rd',
  10.         'prefix': ''
  11.     }
  12. }
  13. db = DatabaseManager(config)
  14. #results = db.select("select * from zip where zip_code = %s", ['0600000'])
  15. #for row in results:
  16. #    print row['address']
  17. result = db.table('zip').where('zip_code', '0600000').first()
  18. print result['address']




もちろん、同じ実行結果になります。


# python sample.py
北海道札幌市中央区以下に掲載がない場合







もう少し進んだサンプル



郵便番号が0600000,0600001の住所を取得。
郵便番号の逆順で並び替えてみます。


  1. # -*- coding:utf-8 *-
  2. from orator import DatabaseManager
  3. config = {
  4.     'mysql': {
  5.         'driver': 'mysql',
  6.         'host': 'localhost',
  7.         'database': 'sample',
  8.         'user': 'root',
  9.         'password': 'P@ssw0rd',
  10.         'prefix': ''
  11.     }
  12. }
  13. db = DatabaseManager(config)
  14. #results = db.select("select * from zip where zip_code = %s", ['0600000'])
  15. #for row in results:
  16. #    print row['address']
  17. #result = db.table('zip').where('zip_code', '0600000').first()
  18. #print result['address']
  19. results = db.table('zip').where_in('zip_code', ['0600000','0600001']).order_by('zip_code', 'desc').get()
  20. for row in results:
  21.     print row['address']




実行結果


# python sample.py
北海道札幌市中央区北一条西(1~19丁目)
北海道札幌市中央区以下に掲載がない場合




テーマ:プログラミング - ジャンル:コンピュータ

  1. 2016/05/22(日) 22:19:26|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

APIフレームワークFalconをbjoernで動作させる

Falcon
http://falconframework.org/

このフレームワークを高速軽量なwsgi実装「bjoern」で動かしてみます。
https://github.com/jonashaag/bjoern


bjoernのインストール



今回はDebian 8にインストールしてみました。

インストールは、過去Bottleを動作させた時の記事
高速軽量なPython WSGI Server「bjoern」でBottleフレームワークを動かす

これと、インストールのドキュメントを参考にしました。
https://github.com/jonashaag/bjoern/wiki/Installation


まず、必要なライブラリをインストール。


# apt-get install python-dev libev-dev




bjoernはeasy_installでインストールしました。


# easy_install bjoern



バージョン1.4.3がインストールできました。




サンプルプログラム



Python + Falconで高速APIサーバーを作成する
こちらで使用したサンプルを変更して試してみます。


  1. # -*- coding:utf-8 -*-
  2. import json
  3. import falcon
  4. class HelloResource(object):
  5.     
  6.     # getされた時の動作
  7.     def on_get(self, req, res):
  8.         msg = {
  9.             "message": "Welcome to the Falcon"
  10.         }
  11.         res.body = json.dumps(msg)
  12. app = falcon.API()
  13. app.add_route("/", HelloResource())
  14. if __name__ == "__main__":
  15.     #from wsgiref import simple_server
  16.     #httpd = simple_server.make_server("0.0.0.0", 8000, app)
  17.     #httpd.serve_forever()
  18.     
  19.     import bjoern
  20.     bjoern.run(app, "0.0.0.0", 8000, reuse_port=True)




動作確認用のプログラムです。


  1. # -*- coding:utf-8 -*-
  2. import json
  3. import urllib2
  4. url = 'http://192.168.1.102:8000'
  5. response = urllib2.urlopen(url)
  6. # 戻り値を解析
  7. body = response.read()
  8. response.close()
  9. data = json.loads(body)
  10. print(data['message'])




動いてくれているようです。


$ python api_test.py
Welcome to the Falcon




テーマ:プログラミング - ジャンル:コンピュータ

  1. 2016/05/14(土) 22:22:20|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
前のページ 次のページ