Document Actions
Python
Up one levelDocument Actions
はじぱい
初めてのPython
はじぱい
ノートパソコンが来た。ヒューレットパッカードのやつである。メモリは1G積んでいる。ウヒョー。
新年というには遅すぎる時期だけど何だか心機一転な感じがするわけで(うかれすぎ)、とりあえずZPTとかPythonとか勉強しなきゃと思ってしまった。
私はかなりガキんちょである。ガキんちょはおもちゃが大好きである。ファミコンに夢中になり、Macに夢中になり、htmlで遊び、Linuxをほげほげしてきた私の、今のおもちゃはZopeである。
おもちゃで楽しむためにはそのおもちゃをよく知る必要がある。楽器をうまく吹くには楽器を・音楽を知ることが大切であるのと同様、Zopeで遊ぶためにはPythonを知ることが必要だろう。
ちなみに私はPythonが全くわからない。かけらも知らない。しかし何事にも始まりがあるものだ。はじめは何もわからなくて当然である。と、言い訳しておこう。
とりあえずPythonScriptを追加してみる
いきなりZopeの中身を見たりするのはあまりに無謀。しかし地道にチュートリアルとかやるのも何だかなー、ということで、Zopeの中にPythonScriptを追加してみることにする。
helloと名付けたPythonScriptを追加するとあらかじめサンプルコードが書いてある。
# Example code:
# Import a standard function, and get the HTML request and response objects.
from Products.PythonScripts.standard import html_quote
request = container.REQUEST
RESPONSE = request.RESPONSE
# Return a string identifying this script.
print "This is the", script.meta_type, '"%s"' % script.getId(),
if script.title:
print "(%s)" % html_quote(script.title),
print "in", container.absolute_url()
return printed
これを適当にdtml methodから呼んでやって
<html>
<body>
<dtml-var hello>
<body>
<html>
表示すると
ふーむ。%sのとこにはその後にある%ほにゃららが入る模様。下から4行目のとこには条件がある。script.titleというくらいだから、このスクリプトにタイトルがあるかどうか判断しているのだろう。タイトルがあればそれも表示せよ、といっているように見える。
追加せずにはいられない。
「はろ~」とタイトルをいれ、再び表示。
出た!予想通りに動いてくれると楽しい( ´艸`)
まぁ、そんな感じで今日は寝る。
- Category(s)
-
Python
- The URL to Trackback this entry is:
- http://nagosui.org:8080/Nagosui/COREBlog2/learning-python/tbping
バインディングてあんた…誰…
containerとかscriptとか
Ploneも2.1.2になり入力フィールドにグラデなんかかかっちゃったりして、おー、新しいぜぇって感じですが、昨日サンプルスクリプトをほんの少しだけいじってみたものの、中身はよくわからん。ポートレットとかがべた塗りなのに入力フィールドだけグラデがかかってるPloneくらい意味不明である。
全然わからんといえばそれまでなのだが、とりあえず目に付いたのはこいつ↓とか
request = container.REQUESTこいつ↓とか。
script.meta_type
ピリオドでひっついてるやつはどうもよくわからん。
何でこいつらに目をつけたかというと、何となくわかりそうだから。わかりそう、というと何だか偉そうですな…。もちろん名前が比較的わかりやすいというのもあるけれど、ZMIをよく見るとヒントくさいのがある。
↑ここらへんである。
containerとかscriptとかいうのはバインディング変数である。バインディングというのは、ひっつけるということである。よくわからんけど、とりあえずバインディングタブを見てみると…
contextの綴りが違っているのがわかる(違
contextじゃなくてcontainerはスクリプトが入ってる容器であるオブジェクト(ここではPythonというフォルダオブジェクト)、script はスクリプト自体を指してると理解していいのだろうか。まー、そういうことにしておこう。
さてはこいつらを使ってほげほげできるということだな。ふつーならいろいろ自分で用意しなきゃいけないものが最初から用意されてるとは親切ではないか。さっそく遊んでやろう。
書式はよくわからんが、サンプルスクリプトの中で
script.title
script.meta_type
container.absolute_url()
こんな使われ方をしてるわけだから、
「container.title」とか「container.meta_type」とか「script.absolute_url()」とかしてやれば、コンテナのタイトルとかメタタイプとか、スクリプトのURLとかが得られるハズ。ということはたとえば…
print "コンテナのタイトルは「", container.title, "」で、コンテナのメタタイプは「", container.meta_type, "」ナリよ"なんていうふうにすれば、コンテナのタイトルとメタタイプを教えてくれるハズ。
ということで新しくcontainer_infoというPythonScriptを追加。わからない所はいじらずにそっとしておくのが味噌だと思う。
# コンテナのタイトルとメタタイプを教えてくれるコード:これを呼んでやると。
# Import a standard function, and get the HTML request and response objects.
from Products.PythonScripts.standard import html_quote
request = container.REQUEST
RESPONSE = request.RESPONSE
print "コンテナのタイトルは「", container.title, "」で、コンテナのメタタイプは「", container.meta_type, "」ナリよ"
return printed
できたヾ(゜∀゜)/ウヒョ~
しかし何故absolute_url()には括弧がついてるんだろう…
- Category(s)
-
Python
- The URL to Trackback this entry is:
- http://nagosui.org:8080/Nagosui/COREBlog2/learning-python-binding/tbping
Products PythonScripts standardをいじってみるテスト
まだまだサンプルスクリプトにはわからないことが満載である。わからないときの基本はヘルプである。ZMIにはヘルプへのリンクがあるのでポチッとな。
いかにもなリファレンス発見。いろいろ書いてあるではないか。しかもサンプルスクリプトの中で一番難しそうなProducts.PythonScript.standardについてのヘルプもある。せっかくなのでこれを読んでみたところ、…さっぱりわからない( ´艸`)
サンプルスクリプトではこいつはどういうふうに使われてたっけか。
from Products.PythonScripts.standard import html_quote
Products.PythonScript.standardからhtml_quoteをインポートする、と言っている。で、ヘルプを見てみると確かにProducts.PythonScript.standardのリファレンスのところには「html_quote」というやつの説明もある。ほかにもいろいろな機能の説明が書いてあることから敷衍すればおそらく、Products.PythonScript.standardっていうのは基本的な機能のセットで、このセットの一機能としてhtml_quoteがあるということか。
そういえばサンプルスクリプトの最後の方でhtml_quoteが使われてる。逆に言えばこの機能を使うためには、最初の方でこの機能を使うことを宣言しなければならないということなのだろう。
せっかくなので簡単な機能を使ってみよう(・∀・)
めっちゃ簡単そうなやつ↓
- thousand_commas(number)
- whole_dollars(number)
- dollars_and_cents(number)
数を扱うだけなので簡単なのさ。
numberという名前のスクリプトを追加して
# Products.PythonScripts.standardのテストコード
from Products.PythonScripts.standard import whole_dollars,dollars_and_cents
print whole_dollars(12345)
print dollars_and_cents(12345)
return printed
などとしてやる。
#thousand_commasは使っちゃダメっていわれた…
結果ワー、
うむ。いい感じ。
- Category(s)
-
Python
- The URL to Trackback this entry is:
- http://nagosui.org:8080/Nagosui/COREBlog2/Products-PythonScripts-standard-help/tbping
Zopeのprintedって輩のこと
ヘルプを眺めてたらprintedについて書いてあるのを発見した。
サンプルスクリプトの最後には「return printed」と書いてあって、こりゃなんだー、と思ってたところだったのだ。「print」ってのはプログラムでよく見るけど、「printed」はあんまり見ないからなぁ。
Because the "print" statement cannot operate normally in Zope, its effect has been changed.
で、結局、
The special builtin name "printed" evaluates to the concatenation of all text printed so far during the current execution of the script.
ということらしい。要するに、いろいろprintしたものをつないでそいつら全部をまとめちゃうわけね。ということは、
print "このスクリプトのタイトルは"
print script.title
print "なんですよ。マジで。"
return printed
なんてふうにすれば…
となるのか。「つなぐ」といってもインライン要素みたいにつなぐわけじゃないのね…。
- Category(s)
-
Python
- The URL to Trackback this entry is:
- http://nagosui.org:8080/Nagosui/COREBlog2/learning-python-zope-printed/tbping
ExternalExampleをいじって自分好みのプロダクトにする
以前、容量の大きなファイルをファイルシステム上に保存して利用するプロダクトとして、PloneLocalFolderNGというのを使ってみたのですが、Plone2.5になってどうも「@@plone」というグローバル変数が悪さをしているらしく使えなくなってしまっていました。私にはこれに手を入れるだけの技量が無いので、他のプロダクトをいじってみることにしました。候補は
です。
しかしこやつらは純粋なプロダクトではなく、ATフィールド(?)を提供してくれるだけの、開発者向けプロダクトなのです。ということはこれを利用したプロダクトを自分で用意せねばならない(あるいは既存のプロダクトを拡張する)というなかなかチャレンジングなことを要求してくれるプロダクトなわけです。
いや私はインプットするのは大好きなので別に何の問題もないといえばそうなのですが、なにせ今はやること・やりたいことが多い。否、多すぎる。Turbogearsもいじりたいし、COREBlogのMLで話題になったPlacefulWorkflowもいじってみたいし、PlonePASもいじりたいぞぅ。そういえばgmailAuthPluginでトラブったのを思い出してしまった。これも一度使えるようにしてみたい。なごすい関係のタスクもやってしまいたいぞぅ。
というわけで目の前にあるものがてんこ盛りなのですが、一度始めるといったんキリがつくまでは続けてしまうという悪い病気がぶり返してきて結局いじってしまったのでした。
で、二つの候補があるのですが、ExternalStorageの方には親切にもExternalExampleというサンプルプロダクトが同梱されていて(ExternalStorageのexampleフォルダ以下にあります)、これを利用するのが一番手っ取り早いだろうという推測から、ExternalExampleを自分の好みに編集して使ってしまおうという結論に至りました(でも実はFileSystemStorageの方も最近バージョンアップしたということがあって魅力的なのでした)。
とりあえずExternalExampleを通常のプロダクトのようにインストールして使ってみると、
- ComplexExample
- ExternalArticle
という二つのコンテンツタイプを追加できるようになりました。
ComplexSampleはこんな感じです。
ExternalArticleはこんな感じです。
どういう仕組みになっているのかExternalExampleのフォルダの中を見てみると
- __init__.py
- ComplexSample.py
- config.py
- ExternalArticle.py
- StreamingFile.py
- README
- refresh.txt
- Extensionsフォルダ
- skinsフォルダ
といった内容になっております。
予想以上の少なさなので結構らくちんかも~(と思っていつもどこかでハマるのですが、やっぱり今回もハマりました)。予想は立てやすいファイルの構成になっています。
というのも、ExternalExampleをインストールしたことによってComplexSampleおよびExternalArticleが追加できるようになり、しかもフォルダの中に「ComplexSample.py」とか「ExternalArticle.py」とか、いかにも私が担当してます的なファイルがあるので、これをいじればよろしいという予測が立つからです。
手を入れる方針としては、とりあえず今回はComplexSampleはいらないので削除し、ExternalArticleを編集するという感じでいきましょう。
(中略)
…で、すんごく眠いのでとりあえず動くところまではこぎつけましたので、ファイルシステム上のコンテンツはこんな感じでということで。いじったプロダクトはこんな感じ。あくまで動かす所までというだけで、skinをいじったり、もう少し中身を研究したりということはまた今度。おやすみなさい…。
- The URL to Trackback this entry is:
- http://nagosui.org:8080/Nagosui/COREBlog2/exmediafile/tbping

ExMediaFile 0.1

nyusukeさま、こんにちは。
私もLocalFolderNGを使っているのですが、こちらの記事を拝見して、再度Plone本拠地のProduct情報を確認したところ、今は誰もメンテナンスしてくれる人がいない状況なんですね?
Plone2.5に移行したとしても、同じように使いたいなあと思っていただけに、ショック...。
また、External Storageなんかも、今ひとつ使い方が判らなかったので、手を出せませんでした。これは、基本的にはLocalのファイルシステムをマウントしてくれるというものじゃなくて、保存先をローカルのファイルシステムに指定できる、という意味合いのものなんですね...。
でも、解説いただいているので、大変助かりました。サンプルがあるなどと言うのは、判りませんでしたから...。
やっぱりちゃんとPythonなりPloneなりを勉強してProductを作れるようにしたいですねぇ。