2015年7月18日土曜日

Pythonのテンプレートエンジンmakoを使ってみる・その1

pythonにはテンプレートエンジンが沢山あって、
何を使うのか迷うのですが、
今回は、makoを試して見ました。

makoは、

$ cd ~
pip install mako
で準備可能です。

さて。

ひとまず試す

hellomako.py
from mako.template import Template

print(Template("hello ${data}!").render(data="world"))

まずはこれから。

python hellomako.py

出力結果
hello world!

"hello ${data}!" の ${data}部分が、
render(data="world"))の情報で置き換わってます。

これが最も単純な利用例でしょう。

ただ、まあ、このようにはあまり使いませんね・・・
ということで、ファイル参照をする方法に。。

先ほどの、”hello ${data}!”だけ抜き出して、hellomako.txtで保存します

hellomako.txt
hello ${data}!

で、
from mako.template import Template

mytemplate = Template(filename = "hellomako.txt")
print mytemplate.render(data="World")

と、ファイルを指定してあげれば外部ファイルからテンプレートを読み込ませる事が可能です。

出力結果
hello World!

さて、文字の置き換えは出来る様になりましたが、
これだけだとイマイチな部分もあります。


次に、リストの情報を、書きだしてみます。

テンプレートファイルを、
hellomako2.txt
%for elem in data:
hello ${elem}!
%endfor
こんな形にします。
これを、
hellomako2.py
from mako.template import Template

value = ["Tokyo","Osaka","Nagoya","Japan"]

mytemplate = Template(filename = "hellomako2.txt")
print mytemplate.render(data="World")
で読み出してみます。
出力結果
hello Tokyo!
hello Osaka!
hello Nagoya!
hello Japan!

とループして出力されましたね♪

ちなみに、loop.indexという予約後を使うと、ループ回数が得られるので、

%for elem in data:
${loop.index+1}: hello ${elem}!
%endfor
とすると、

出力結果
1: hello Tokyo!
2: hello Osaka!
3: hello Nagoya!
4: hello Japan!

ってな感じになります。

往々にしてデータはハッシュ(dict)の事もありますよね。
この場合は、
hellomako3.py
valuehash = {"english":"apple", "japanese":u"りんご"}
mytemplate2 = Template(filename = "makotest3.txt",  input_encoding='utf-8')
print(mytemplate2.render(data=valuehash))

テンプレート側は、
makotest3.txt
英語: ${data["english"]}
日本語 : ${data["japanese"]}
てな感じになります。

出力結果
英語: apple
日本語 : りんご
になります。

当然、ハッシュはリストの要素としても使えますので、
hellomako4.py
mytemplate2 = Template(filename = "makotest4.txt",  input_encoding='utf-8')

valuehash = [{"english":"apple", "japanese":u"りんご"},{"english":"orange", "japanese":u"みかん"},{"english":"banana", "japanese":u"ばなな"}]

print(mytemplate2.render(data=valuehash))

で、テンプレート側はforを使って、
makotest4.txt
%for elem in data:
英語: ${elem["english"]}
日本語 : ${elem["japanese"]}
%endfor

出力結果
英語: apple
日本語 : りんご
英語: orange
日本語 : みかん
英語: banana
日本語 : ばなな
ってなります。

また、ハッシュ(dict)の別の使い方として、key,valueとして渡す方法もあります。
沢山の引数を渡したいときも当然あると思います。
mytemplate2.render(data=valuehash,hoge=aaaaaa,hige=bbbbb)
なんて、書けば良いのですが、これは面倒です。
そういう時は、ハッシュ(dict形式)で渡すと便利です。

まず、テンプレートから。
makotest5.txt
英語: ${english}
日本語 : ${japanese}
hellomako4.py
from mako.template import Template

mytemplate2 = Template(filename = "makotest5.txt",  input_encoding='utf-8')
valuehash = {"english":"apple", "japanese":u"りんご"}
print(mytemplate2.render(**valuehash))

てな具合でソースを書きます。
mytemplate2.render(**valuehash)
と、**valuehashと、**変数名で、key=value渡しになります。


出力結果
英語: apple
日本語 : りんご

となります。

dict形式でデータがあるときに、keyの情報を取得したい場合も出てくると思います。
その時の対応方法です。

hellomako6.py
from mako.template import Template
mytemplate = Template(filename = "makotest5.txt",  input_encoding='utf-8')

valuehash = {"1111":{"english":"apple", "japanese":u"りんご"},"2222":{"english":"orange", "japanese":u"みかん"},"3333":{"english":"banana", "japanese":u"ばなな"}}

print(mytemplate.render(data=valuehash))



makotest5.txt
%for key,elem in data.items():
id=${key}
日本語:${elem["japanese"]}
英語:${elem["english"]}

%endfor
出力結果
id=1111
日本語:りんご
英語:apple

id=3333
日本語:ばなな
英語:banana

id=2222
日本語:みかん
英語:orange

まだまだ奥深いのですが、ひとまず使ってみられたかなーと思います

windows7でpythonをひとまず使う

今更ですが、windows7でpythonを使う用事ができたので、
環境構築メモ。

◎パッケージのGET
pythonをダウンロード
まあ、本家からDLするのが無難ですね。
https://www.python.org/downloads/

職場環境がまだpython2系なので、ここはひとまずPython2系を落としてくる。
32ビット・64ビットがあるので、環境に合わせてDL
ひとまず作るならmsiファイルが便利でしょうね。

◎インストール
DL→MSIファイルなので、
ダブルクリックか、右クリック→インストールでOK

デフォルトだと、c:\Python27と、トップレベルがインストールディレクトリに。
私は、トップレベルだとちょっと気持ち悪いので、
c:\Tools\python27
ってしていますが、お好みで。。。

○パス
次に、パスを通します。
これは後でも良いですが、
コマンドラインから、
$path %PATH%;c:\Python27;  ←インストールした場所
のように通します。

○パッケージ管理ツールのインストール
・setuptools:easy_installの用意
素のままのpythonだと、いろいろ足りないので、
豊富に用意されているパッケージの利用をしていく事になります。
このために、pipというスクリプト?を用意すると便利です。

このpipをインストールするために、
setuptools
のインストールをします。

これは、
https://pypi.python.org/pypi/setuptools
にあります。

これ読んで行と、windowsは、シンプルに
ez_setup.py
を使えばOKな事がわかります。
で、そのez_setup.pyは、
https://bootstrap.pypa.io/ez_setup.py
から直落としができます。
(直リンもどうかと思うので、一応リンクは切っておきますが、
 ページの中段の、
「Windows (simplified)」
の所にリンクがあるので、そこから落とせば良いと思います。

で、コマンドラインに戻り、

$python ez_setup.py

これで、python27のフォルダの下に、scriptsというフォルダができ、
この中に、easy_install.exeというのができあがります。

・pipの準備
これで、pipのインストールの準備が整いました。
その前に、easy_installが作られた、Scriptsもパスが通ってると便利なので、

$path %PATH%;c:\Python27\Scripts;

でパスを通しておきましょう。

で、

$easy_install pip

で、ようやくpipが使える様になります。

あとは、必要に応じてpipでパッケージをインストールしまくってください。



2014年3月2日日曜日

redmineのチケット一覧に注釈を出す方法

Redmine利用してみているのだが、チケットに対しての進捗は、IF的には、注記を付け加えて行くのが運用的に便利かなと感じている。

しかし、チケット一覧の画面では、そのチケットの状況が判らず、フィールドを追加した方が良いのかな?とか考えたりもした。
ただ、カスタムフィールドは、入力欄が狭く、注記のような使い勝手での記述が難しい。

そこで、チケット一覧の画面に、注記も出せる様な対応をしてやろうということで、実践してみました。


参考:
Redmine Users (japanese) › チケット一覧に「注記」を表示したい。
https://groups.google.com/forum/#!topic/redmine-users-ja/IrEWmTefBKM

こちらのサイトを参考に、もう少し見やすく変更してみました。

私自身で拡張した部分は、
  • 注記の中の改行に対応した
  • 取り消し線に対応した
    (一覧画面でも取り消し線が出て分かり易い)
  • 注記を最新3つにした
    (注記表示個数:issues_helper.rbの変更箇所中のlimit=3で変えられます。書かなければ全て表示されます。
    並べ替え順:現在新しい順ですが、orderの部分のDESCを削除すれば1から順番になります。)

apps/views/issues/_list.html.erb

◎ヘッダ部分に追加
<th class="hide-when-print" width=20%>注釈</th>
◎もう少し下の方に書き部分を追加
  <tr id="issue-<%= issue.id %>" class="hascontextmenu <%= cycle('odd', 'even') %> <%= issue.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>">
    <td class="checkbox hide-when-print"><%= check_box_tag("ids[]", issue.id, false, :id => nil) %></td>
    <%= raw query.inline_columns.map {|column| "<td class=\"#{column.css_classes}\">#{column_content(column, issue)}</td>"}.join %>
---------- 以下の部分を追加  --------
    <td class='status' >
    <%= issue_notes(issue.id) %>
    </td>
---------- ここまで  --------
</tr>

apps/helpers/issues_helper.rb

---------- 以下の部分を追加  --------
 def issue_notes(id)
    issue_notes = Journal.find(:all, :conditions => ["journalized_id= ?", id], :order => "created_on DESC",:limit => 3).map(&:notes).uniq
    issue_notes.map{|note| %Q!#{note}<BR />!}.join..gsub(/-.*-/,’<del>\&</del>’).gsub(/\r\n|\r|\n/, "<br />").html_safe
  end
---------- ここまで  --------
関数だから何処突っ込んでも動くはずですが、一応
def show_detail(detail…………..
の前に突っ込んどきました。

変更したら、apacheの再起動をやらないと反映してくれない。
sudo service httpd restart (リスタートの仕方は各々の環境次第ですが)

またredmineのキャッシュとかのクリアの方法も、書きにメモっておきます。
設定かえたらコレもやっといたほうがいいらしいです。
cd /var/lib/redmine/   (redmineのディレクトリです)
rake tmp:cache:clear
rake tmp:sessions:clear

2013年5月21日火曜日

Acrobat Reader 起動時に読み上げ画面が表示されるのを無効に

Acrobat Reader 起動時に読み上げ画面が表示されるのですが、
やたら遅くて、迅速にページが開けなくてイライラしたことありませんか?

Adobeのページにも無効のやり方が書いてあります。


http://helpx.adobe.com/jp/acrobat/kb/cpsid_91756.html


私の場合は、10.0でしたが、同じ方法で上手く行きました。

C:\Program Files (x86)\Adobe\Reader 10.0\Reader\plug_ins

Accessibility.api →別の名前 (Accessibility.api.org)
ReadOutLoud.api →別の名前(ReadOutLoud.api.org)

私の環境は、Win7ですが、名前変更しようとすると管理者権限を要求されますが、
変えてしまって構いません。


の画面がでますので、次回から表示しないにチェックボックスを入れると、
次からはこれが出なくなります。

読み上げが必要になったときは、上記の変更したファイルを元の名前にもどせばOkです。

2013年5月6日月曜日

Git導入へ(1)~さくらインターネットに。

自宅と会社でバージョン管理を共有したいという事で、
選択肢は、2つくらい。

○自宅にサーバーをたてて、Gitを入れる
○レンタルホストでGitを入れる

自宅には、OpenBlockSだったり、玄箱があった時代もあったのですが、現在は稼働させてません。理由はいろいろあるのですが、まともな理由としては、

  • 上りの回線の不安さ
  • DynamicDNS
  • セキュリティの懸念。

でもまあ、一番の理由は、
うるさい・・・。

OpenBlockSは、ファンレスだったりするのですが、HDDの回転音とか、若干気になるんですよね。寝られない日々の時は。
で、まあ、バックアップやら、なんちゃら考えると、
レンタルサーバが気軽に借りられる現状では、外に借りるかな・・・という選択肢に。

レンタルサーバといえば、ちなみに、プライベートなストレージとして、
googleドライブや、ジャストシステムのインターネットディスクなんかも利用中。
インターネットディスクは回線速度や、ファイルの公開のしやすさで、ちょっと割高かな?とも思いつつ、かなり便利に利用しております。

さくらインターネットは、以前別の用途でスタンダードプランを利用していて、
アカウント持っているけどほぼ非アクティブな状況だったので、
資産の有効利用ということで、掘り出してきて利用することに。

さくらインターネットへのインストールは、

さくらインターネット(スタンダード)にgitをインストールする
http://d.hatena.ne.jp/hidde/20111127/1322369826
さくらインターネットのレンタルサーバに git のリモートリポジトリを作成する
http://mattintosh.blog.so-net.ne.jp/2012-09-14

を参考にしました。

あたり前の話ですが、SSH2で、さくらインターネットに接続する必要があります。
Teraterm
等を用いて、さくらインターネットに接続してください。







host名は、契約してる自分のアカウントですね。



hogehogeの部分は、アカウント名。
Passは、サーバパスワード。契約してから変更してなければ、
先方からのメールに記載されてます。
変更してたら、思い出してくださいw










現在、Gitは最新版は、1.8系に移行しているみたいですが、
1.8系でgmakeするとエラーが出てしまいます。
libgit.a(run-command.o)(.text+0x701): In function `start_async':/home/ACCOUNT/git-1.8.1.5/run-command.c:703: undefined reference to `pthread_create'gmake: *** [git-credential-store] Error 1
というのが出てしまうんですね。
で、まあちょっとした用途ですし、1.7系でもいいっしょ。ということで1.7系をGet.
git-1-7.12.2.tar.gzが最後みたいです。(2013年5月執筆時)
2012年9月リリースみたいなので、まあ問題ないでしょ。という判断から、それを使う事に。

最新版の確認は、
の、Tarballsってところをたどると行けます。
(まあ、下記のサイトに飛ぶんですが)

で、
$ cd ~
$ mkdir local
$ mkdir gitinstall
$ cd gitinstall
$ wget http://git-core.googlecode.com/files/git-1.7.x.x.tar.gz
$ tar xjvf git-1.7.x.x.tar.gz
$ cd git-1.7.x.x/
$ ./configure -prefix=$HOME/local
$ gmake
$ gmake install
という感じでやれば、インストール可能です。
あとは、.cshrcに通せば完了です。

これでひとまずインストールは完了です。

あとひと息ですね。

次に、
共有リポジトリの作成にうつります

まずは、リポジトリを作るディレクトリを作成します。
$ cd ~
$ mkdir git
$ cd git
$ mkdir test.git   ← これが共有リポジトリ名
$ cd test.git
$ git init --bare --shared
--bare --shared を付ける所が味噌です。
 これで、作業が開始できます。 

とまあ、こんな感じなんですが、
先にローカル環境があって、共有リポジトリ作りたいとか、
家の環境でまずは構築して、会社にクローン作りたいとか、
いろいろありますよね。
その辺は次のエントリーで紹介していきたいと思います。





2013年5月5日日曜日

Git導入へ(0)


ちょっとしたプログラムがあれば実現出来るのになあ、でも予算が無いな。。。
なんて事は良くある話しで、、、
まあ、昔取った杵柄、自分で作ろうかなあなんて事になる。

会社でもある程度の年次になってくると、
業務時間内に、自分でプログラミングをする時間が作れない。

本当は、若い人にお願いしたいところだけど、
仕事?に使う物なんで、いろいろ難しくて。。。

ということで、最近は週末プログラマーと化しております。
まあ、それほど重圧のかからないプログラムは、
楽しいからいいんだけども。

で、私の周辺でニーズがあるのが、週末のイベント系に使うコード。

そんなこんな出、金曜日の夜~土曜日にかけてコーディングをして、
イベントが無事に終了すると、週中は完全に触らないような状況。

まあ、1週間あると忘れるんですよね
本業もいろいろ忙しいんで。
あれこれ・・・。

このままじゃいかんということで、
今更ですが、Gitを導入して、ちゃんと管理してみようかとチャレンジしてみました。

その備忘録ですね。
前書き長すぎ。多分のエントリーはこれで終わります(笑)

弊社、IT系の会社ではないので、
プログラム関連の開発のインフラとか思想とか全く無し。。。
なので、いろいろ文献を参考にってな感じでございます。

家と会社でコーディングとか、このご時世いいのか?って気もしますが、
まあそんな事は言ってられないし、
在宅勤務?の布石という意味ではいいんじゃないかなと。

ということで、いざ導入。
共有リポジトリをどこか、会社と自宅両方からアクセスできる場所に置かねば・・・・
という悩みにつきあたり、ひとまず終了。

幸いな事に、うちの会社は、場所に寄っては、
SSHで外に出られる環境が存在してるのが判明したので、
光明が見えてたって話しはあるのですが。

つづく



2013年4月6日土曜日

Excelで時間値を数値として利用する

Excelで、時刻・日付データとして
00:20:00
00:20:04
とかが得られるので、その差を4秒を、”4”という数値で計算に利用したいことがあると思います。

普通に、引き算をすると(例:=A2-A1)とかすると、シリアル値になってしまうため、4という数値ではなく、0.000046...とかの値になります。

シリアル値は、1日を1として表現します。
1時間は1/24=0.04166666
1分は1/(24*60)=0.000694
となります。

HOURとかSECONDの関数があるのですが、
SECOND関数って、60秒以上を返してくれないぽいので、解析には使いづらかったりします。

ということで、人間系?の値に直したい場合は、逆変換をしてあげれば良いので、
シリアル値に、
=(A2-A1)*24*2600
とかしてあげると、思ったような使い方できます。
という備忘録。