pythonでテンプレートエンジンを利用する

pythonでテンプレートエンジンを利用する

バッテリー同梱のpythonはテンプレートエンジンも標準に組み込まれている。
下記の通り利用することができる。

1
2
3
import string
t = string.Template('Hello ${name}!')
t.substitute({'name': 'Python'})

しかし、このテンプレートはとてもシンプルな変換しかできない。
単純なキーワード置換のみ。

そこで簡単に導入できて、ループや条件分岐ができるテンプレートを利用する。

bottle

https://bottlepy.org/docs/dev/

テンプレートエンジンは、bottleの一部の機能。
それでも、十分に高性能なテンプレートが利用できる。

インラインで変換

1
2
3
4
5
6
7
8
9
10
11
12
13
import bottle
bottle.template('''
    {{ msg }}
    % for item in items:
        {{ item['no'] }} : {{ item['name'] }}
    % end
'''
, {
    'msg': 'test bottle',
    'items': (
        {'no': '1', 'name': 'AAA'},
        {'no': '2', 'name': 'BBB'},
    )
})

ファイルのテンプレートを読んで、ファイルに出力する

template.tmpl

1
2
3
4
{{ msg }}
% for item in items:
    {{ item['no'] }} : {{ item['name'] }}
% end
1
2
3
4
5
6
import bottle
import codecs
data = {}
with codecs.open('output.txt', 'w', 'utf-8') as w:
    with codecs.open('template.tmpl', 'r', 'utf-8') as r:
        w.write(bottle.template(r.read(), data))

まとめ

bottleを使うと、一般的なテンプレート機能が使える。
bottleは%の行の変換が適切に行われるので、メールなどのテキストテンプレートに問題なく使える(テンプレートエンジンによっては、余分な改行やスペースが入ってしまったりする)。
また、テンプレートエンジンはbottleの一つの機能でしかなく、もっといろいろなことができる。
スタンドアロンサーバになったりするようだ。
これらも活用できれば、ツールの幅がぐっと広がりそうだ。

同じタグの記事
同じカテゴリの記事

SHARP SH-M04

SHARP SH-M04

DOCOMOは新たにガラケーの製造、販売をしなくなるというので、ガラケーとの別れを告げた。
ガラケーが使えないのであれば、DOCOMOの携帯を使い続ける理由はない。
OCN mobile ONEとSIM FREEのSHARP SH-M04に切り替えた。

SHARP SH-M04の良いところ

  • SIM FREEでおさいふ携帯が使える。

SHARP SH-M04の残念なところ

  • 内蔵メモリで自由に使える部分が極端に少ない(6GB弱)。
  • 指紋認証がない(ZenFone3で使っていて便利だったので)。

まとめ

ガラケーの頃からおさいふ携帯を使っていたので、スマホでもおさいふ携帯が使いたかった。
SIMフリーでおさいふ携帯を利用できる機種は、富士通のarrows M04か、シャープのAQUOS SH-M04。
富士通はCPUが古めだったのでシャープを選んだ。
おさいふ携帯が今まで通り使えたことはとても良かった。
しかし、内蔵メモリが小さいのは残念。うっかりアプリをインストールすると内蔵メモリの空きが1GBをきってしまって警告が出る。
16GBしか搭載していないのに、予約領域が10GBもあるのはどうかと思う。
それなら、多少高価になって良いから32GB搭載して欲しかった。
また、今時指紋認証がないのも面倒。利用開始のたびに、PINやパターンを入力しなくてはならない。

今は、スマホになったメイン携帯だけど、普段のスマホ用途(ネットやゲーム)にはHUAWEI nova liteを使っている。
電話とおさいふ携帯にはSH-M04を使うようにしている。
2つスマホを持つのはじゃまくさい気もするけど、利用用途が分散されるのでバッテリーの持ちは良い気がする。
通信料に関しても、OCN mobile ONEでは、メインのスマホ1,700円と追加SMS SIM500円なので、
それほど高い気もしない。

同じタグの記事
  • ありません。
同じカテゴリの記事

HUAWEI nova lite

HUAWEI nova lite

今更ながら、HUAWEI nova liteを買った。
買った理由は、メインで使っているSH-M04があまりにも貧弱だから。
今までASUS(ZenFone)派であったが、P9 liteを使ってからHUAWEI派になった。

HUAWEI nova liteの良いところ

  • 指紋認証で瞬時に使い始めることができる。
  • フルHD液晶が美しい。
  • 自由に使える内蔵メモリがそれなりにある。
  • 不要なアプリがあまりインストールされていない。
  • お手頃なお値段

HUAWEI nova liteの残念なところ

  • とても美しい液晶画面だが、淵がカーブしているためガラスフィルムをぴったり貼ることができない。
  • 液晶表面の強度が足りないのか、無防備に使っていたら液晶表面に傷がついてしまった。

まとめ

HUAWEI nova liteは、安い割にとてもよく働いてくれる。
HUAWEI P10 liteが32GBメモリなので、早くも買い換えたい衝動に駆られているが、
HUAWEI nova liteで、特に不満はないため、もう少し使おうと思う。

同じタグの記事
  • ありません。
同じカテゴリの記事

pythonでFTP

pythonでFTPする

サーバ間のファイル転送など、保守作業で安全が確保されている場合にFTPを利用している。
保守作業も定期的な保守となると、pythonスクリプトが役に立つ。

FTPサーバに接続

1
2
3
import ftplib
ftp = ftplib.FTP('ftp-server')
ftp.login('ftp-user', 'ftp-password')

ftp-server,ftp-user,ftp-passwordは適宜書き換える。

FTPサーバへファイルを転送

1
2
3
4
5
'カレントディレクトリを移動'
ftp.cwd('/path/to/data_dir')
'ファイルを開き転送'
with open('target_file.dat', 'rb') as rb:
    ftp.storbinary('STOR target_file.dat', rb)

クライアントファイルは、openの引数で深いディレクトリでもディレクトリを移動せずに指定できる。
サーバファイルは、cwdにディレクトリを移動してから個別に転送する。

FTPサーバからファイルを取得

1
2
3
4
5
'カレントディレクトリを移動'
ftp.cwd('/path/to/data_dir')
'ファイルを取得し保存'
with open('target_file.dat', 'wb') as wb:
    ftp.retrbinary('RETR target_file.dat', wb.write)

サーバファイルは、cwdでディレクトリを移動してから個別に取得する。
クライアントファイルは、openの引数で深いディレクトリでもディレクトリを移動せずに指定できる。

FTPサーバから切断

1
ftp.quit()

まとめ

ftpコマンドにテキストファイルを渡してバッチ処理してもよいが、Pythonで作った方が応用が効いて良いと思う。

2018.9.15 FTP送信のコマンドが間違っていました。FTP送信はRETRではなくSTORが正解です。
mae8bitさん、ご指摘ありとうございました。

同じタグの記事
同じカテゴリの記事

Oracleのパスワードの有効期限

Oracleのパスワードの有効期限

パスワードの有効期限を確認する。

1
2
SET LIN 1000
SELECT * FROM DBA_PROFILES WHERE RESOURCE_NAME = 'PASSWORD_LIFE_TIME';

パスワードの有効期限を無制限にする。

1
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

パスワードを再設定する。

もし、パスワードの有効期限が来てしまったら、パスワードを再設定する。

1
ALTER USER %USER_NAME% IDENTIFIED BY NEW_PASSWORD;
同じタグの記事
同じカテゴリの記事

DBD::SQLite::db do failed: unable to open database file at の対応

DBD::SQLite::db do failed: unable to open database file at の対応

macのapacheでsqlite3を使おうとした時、DBD::SQLite::db do failed: unable to open database file at のエラーが発生した。
検索はできているので、ファイルは見つかっているよう。
INSERTやUPDATEでエラーが発生している。

原因

sqlite3のデータベースは更新時にジャーナルファイルを作成する。
そのジャーナルファイルが作成できない場合に発生する。

対策

sqlite3のデータベースファイルの保存フォルダにアクセス権限を設定する。

1
chmod 777 db_dir
同じタグの記事
同じカテゴリの記事

Magic Mouseの名前変更

Magic Mouseの名前変更

macでbluetooth機器を接続すると、apple製品はパソコンの名前が関連づけられる。
例えば、○○○のマウスや○○○のキーボードなど。
apple製品の場合は、それぞれの機器に名前が保存されるため、どのmacに接続されても同じ名前で表示されて便利。
しかし、他人に譲る場合など、名前が保存されてしまっていると不都合な場合がある。
その名前の変更方法。

システム環境設定からbluetoothを開く

名前を変更したいbluetooth機器を右クリックし、名前を変更する

同じタグの記事
  • ありません。
同じカテゴリの記事

jythonのヒープメモリ設定

jythonのヒープメモリ設定

jythonプログラムがOutOfMemoryErrorで落ちてしまったとき、その原因はヒープメモリが不足していることが原因だと考えられる。
もっとも、それほどメモリを使ってしまうプログラムが問題かもしれないが、今時のPCならpythonにギガ単位のメモリを使わせても、プログラム自体が簡略化できるのであれば、それもありだと思う。

ヒープメモリ設定方法

現在の割当容量を確認する

1
2
3
jython --print
C:> C:\usr\java\bin\java -Xmx512m -Xss1024k -classpath C:\usr\jython\jython.jar; -Dpython.home=C:\usr\
jython -Dpython.executable=C:\usr\jython\bin\jython.exe -Dpython.launcher.uname=windows -Dpython.launcher.tty=true org.python.util.jython

-Xmx512mより、ヒープサイズが512MBであることが確認できる。

-Xmxを1024MBに拡張

Windows

1
SET JAVA_MEM=-Xmx1024m

Linux Bash

1
export JAVA_MEM=-Xmx1024m

改めて割当容量を確認する

1
2
3
jython --print
C:> C:\usr\java\bin\java -Xmx1024m -Xss1024k -classpath C:\usr\jython\jython.jar; -Dpython.home=C:\usr\
jython -Dpython.executable=C:\usr\jython\bin\jython.exe -Dpython.launcher.uname=windows -Dpython.launcher.tty=true org.python.util.jython
同じタグの記事
同じカテゴリの記事

pythonのバージョン選び

pyhtonのバージョン選び

本当なら、迷わずpython3を選ぶべきなんだろうけど、
置かれている仕事の状況では、python3がベストとならない事があった。
なので、未だにpython2を使うことがよくある。

python2を使う場面

javaで実装されたpythonことjythonを使う場合。

他システムのデータを取り出すときjavaのAPIを呼び出すため、jythonを利用している。
しかし、jythonはpythonのバージョンが2.7.0なので、python2としてコーディングする必要がある。

余談だが、jythonでのコーディングでpythonのバージョン以外で気になることろは

  • sqlite3モジュールがない。(sqlite.jarを使ってJDBC接続すればsqlite3に接続できる)
  • JavaのStringクラスとpythonの文字列の自動変換あたりで思わぬ動作をすることがある。(文字列の結合で失敗することがある。StringBuilderなどを用いて結合すれば問題ない)

サーバーのpythonのバージョンが2.6

利用しているredhatサーバのpythonのバージョンが2.6。サーバのモジュールのバージョン更新はなかなかできないので、2.6のまま利用している。

余談だが、python2.6でコーディングしていて気になるてん

  • ”.format()でフォーマットの中括弧の中の番号を省略できない。(‘{},{}’.format(a,b)が利用できない。ちゃんと'{0},{1}’.format(a,b)という風に、数字を指定する必要がある)

共有端末のmacのpythonがバージョン2.7

動作確認用macで動作するpythonのバージョンが2.7。動作確認用端末なので設定を変更することができない。

python2で問題があるか

python2でも、特に問題はない。
コンパイルエラーは標準ライブラリのパッケージ名が異なることくらい。
実行時エラーは、文字列関連でラフに処理しているところは、strとunicodeの違いでエラーになることがある。

サラッと書いた、このstrとunicodeの違いは、気にするのが面倒なところなので、ここを考えなくて良いだけでもpython3を使うメリットは十分にあると思う。

同じタグの記事
同じカテゴリの記事

Windowsでpython3 ZIPでダウンロードした場合

Windowsでpython3。ZIPでダウンロードした場合

なんらかの事情がって、pythonをインストーラーでなく、ZIPファイルをダウンロードして使う場合、準備が必要。

ZIPを解凍したディレクトリのpython36._pthのファイル名を変更

ZIPを解凍したディレクトリに保存されているpython36._pthのファイル名を変更する。
python36._pth → python36.pth

これを実行しないと、インタラクティブシェルを利用したときに、quit()が利用できない。
pythonの教本には普通に書いてあることができないので、いきなり躓いてしまう。

quit()が利用できないとき

ファイル名変更前にインタラクティブシェルに入ってしまった場合、quit()を利用できない。
そんなときはsysをimportしてexit(0)すればよい。

1
2
import sys
sys.exit(0)
同じタグの記事
同じカテゴリの記事