CakePHPで普通のタグを出力する

Written by uechoco 8月 19
CakePHPで普通のタグを出力する はコメントを受け付けていません。
この記事を読む時間:31くらい

久しぶりにCakePHP使ってます。CakePHPで一般的な<meta>タグを出力するには

<?php echo $html->meta(array(‘name’ => ‘y_key’, ‘content’ => ‘xxxxxxxxx’)).”\n”; ?>

と配列にする。上記はYahooサイトエクスプローラ用の<meta>タグです。φ(・_・”)メモメモ

[python]mod_pythonのpublisherとpspを使う

Written by uechoco 8月 09
[python]mod_pythonのpublisherとpspを使う はコメントを受け付けていません。
この記事を読む時間:552くらい

前回はPythonHandlerをファイル指定で使っていましたが、mod_pythonには汎用的なPythonHandlerの指定方法もあるようです。mod_python.publisherというものらしい。publisherを使うと、URLを解析して以下のようにエントリポイントが変わった(私の環境の場合)。

  • http://test.localpy/ … 403 Forbidden
  • http://test.localpy/index … 404 Not Found
  • http://test.localpy/index/ … 404 Not Found
  • http://test.localpy/index.py … /document-root/index.py内のdef index(req):関数が実行された
  • http://test.localpy/index.py/ … /document-root/index.py内のdef index(req):関数が実行された
  • http://test.localpy/index.py/index … /document-root/index.py内のdef index(req):関数が実行された
  • http://test.localpy/index.py/hello … /document-root/index.py内のdef hello(req):関数が実行された
  • http://test.localpy/index/hello … 404 Not Found
  • http://test.localpy/other.py … /document-root/other.py内のdef index(req):関数が実行された
  • http://test.localpy/other.py/index … /document-root/other.py内のdef index(req):関数が実行された
  • http://test.localpy/other.py/world … /document-root/other.py内のdef world(req):関数が実行された
  • http://test.localpy/dir/another.py … /document-root/dir/another.py内のdef index(req):関数が実行された
  • http://test.localpy/dir/another.py/index … /document-root/dir/another.py内のdef index(req):関数が実行された
  • http://test.localpy/dir/another.py/asdf … /document-root/dir/another.py内のdef asdf(req):関数が実行された

参考になるリンクを示しておきます。

お次はPSP。Play Station Portable という意味ではありません(Python for PSPというものが確かにあるらしいですが)。PSPはPython Server Pagesの略です。JSPとかASPの真似っ子ですね。ようはphpみたいにHTML内にPythonが書ける仕組みをmod_pythonが提供しています。このPSPという仕組みは、私がグーグルでいろいろ調べている感じだとあんまり流行ってなさそうな雰囲気です。じゃぁみんなPythonのWebは動やっているんだろう。。。PSPは、mod_wsgiとかではたぶん提供していないと思います。

PSPのサンプルコードとして、Python Server Pages! 略してPSP – Fioの素敵な日々という記事を参考にしました。コードをそのまま拝借して(charsetくらいはUTF-8にして)test.pspを作り、そのまま、http://test.localpy/test.psp?name=uechocoにアクセスすると、以下のようなHTML表示がされます。

これならphpっぽくWebが作れそうですね。といってもmod_pythonに依存しすぎていますが。

ちなみに、今回使ったhttpd.confのVirtualHostは以下のものです。

  1. <VirtualHost *:80>
  2.     ServerName test.localpy
  3.     DocumentRoot "/Users/dev/py_works/test.localpy"
  4.     <Directory "/Users/dev/py_works/test.localpy">
  5.         Allow from all
  6.         AddHandler mod_python .py .psp
  7.         PythonHandler mod_python.publisher | .py
  8.         PythonHandler mod_python.psp | .psp
  9.         PythonDebug On
  10.     </Directory>
  11.     ErrorLog "logs/test.localpy-error_log"
  12.     CustomLog "logs/test.localpy-access_log" common
  13. </VirtualHost>

[python]MacPortsで入れたpython25をApacheで動かすには?

Written by uechoco 8月 09
[python]MacPortsで入れたpython25をApacheで動かすには? はコメントを受け付けていません。
この記事を読む時間:67くらい

最近Pythonを始めたのは皆さんご存知かと思いますが、PythonはWebに特化していないのが厄介ですね。phpはWebに特化していてCLIも出来るというイメージですが、Pythonは軽量でなんでもできる言語なのでWebも出来るというのが現時点での私のイメージです。

Webサーバのデーモンと言ったらやっぱりApacheが多いかと思いますが、PythonをApacheで動かすにはどうしたらいいんでしょうか。『入門Trac』に書いてあったのとかを参考に思いつくものを並べてみました。

  • mod_python … 古くからあり、おそらく資料も豊富なはず。ただし、開発プロジェクトは公式に終了宣言されているらしい
  • mod_fastcgi/mod_fcgi … FastCGI系。FastCGI自体の理解はあまりないのだが、CGIで動かしている+αと考えれば、CGIに分類されるはず。
  • mod_wsgi … WSGIというインタフェースに対応したモジュール。mod_pythonの代わりとして徐々に定着しつつある?mod_pythonやmod_fastcgiなどよりは多少速いとか。

他にも、Apacheで動かさないという選択肢もあるようです。フレームワーク自体にサーバ機能が含まれているWeb2pyとかがそうなのかな。Nginxとかはわからないので、別の機会に。

さてさて私のPythonはGAE開発環境を意識して、SnowLeopardにMacPortsで入れたpython25です。ApacheもMacPortsで入れたapache2です。python_selectでSnowLeopard標準のpython26-appleからpython25に切り替えています。

できればMacPortsでモジュールを入れたいです。個人的にはFastCGIは馴染みがないのでmod_wsgiか、mod_pythonに的を絞ります。MacPortsでmod_wsgiをsearchすると、どうやらpython26(標準のともpython25とも違うMacPortsオリジナルのPython 2.6)に依存してしまっているので、python25では使えなさそうです(ソースコード インストールとかはわかりません)。mod_pythonをsearchすると、mod_python25やmod_python26などがあり、mod_python25であれば私がインストールしたpython25に依存しているようです。

早速「sudo port install mod_python25」でインストールし、

  1. ########################################################
  2. # to enable mod_python add
  3. #  LoadModule python_module modules/mod_python.so
  4. # to your apache2 config file:
  5. #  /opt/local/apache2/conf/httpd.conf
  6. ########################################################

というメッセージが表示されるので、LoadModule宣言を指定のhttpd.confに書き込み、Apacheをgracefulします。

続いて、3.3 mod_python は一体何をやっているのかを参考に、VirtualHostの設定やリクエストハンドラを設定しておきます。私の場合は以下のような感じにしています。もちろんtest.localpyというのは架空のドメインですので、/etc/hostsにも登録してあります。

  1. <VirtualHost *:80>
  2.     ServerName test.localpy
  3.     DocumentRoot "/Users/dev/py_works/test.localpy"
  4.     <Directory "/Users/dev/py_works/test.localpy">
  5.         Allow from all
  6.         AddHandler mod_python .py
  7.         PythonHandler mptest
  8.         PythonDebug On
  9.         DirectoryIndex mptest.py
  10.     </Directory>
  11.     ErrorLog "logs/test.localpy-error_log"
  12.     CustomLog "logs/test.localpy-access_log" common
  13. </VirtualHost>

あとは、上記DocumentRootにmptest.pyというファイルを作成し、以下のプログラムを記載します。

  1. from mod_python import apache
  2.  
  3. def handler(req):
  4.     req.content_type = "text/plain"
  5.     req.write("Hello Apache mod_python!")
  6.     return apache.OK

あとは指定のURL(私の場合はhttp://test.localpy/)にアクセスすればOKです。DirectoryIndexが効かない場合は、http://test.localpy/aaa.pyみたいに適当なファイル名をつけてみてください。適当なファイル名でもいい理由は3.3 mod_python は一体何をやっているのかに書いてあります。

とりあえず、Webで動いたー!でもちょっとやりづらいのはphpでMVCフレームワークとかに慣れ過ぎなせいですかね。

[symfony]Symfony2はsymfony 2と書いてはダメ

Written by uechoco 8月 08
[symfony]Symfony2はsymfony 2と書いてはダメ はコメントを受け付けていません。
この記事を読む時間:56くらい

そろそろSymfony界隈でもSymfony2の噂が出てきていると思います。Symfony2についてとっても重要なことがあったので、私も微力ながら記事を書いて広めていこうかと思います。それはBlog | Talk about Symfony2, not Symfony 2 | symfony | Web PHP Frameworkという本家の記事のことです。

簡単に言うと、Symfony2に関して、ブログを書いたり、ドキュメントを書いたり、Twitterでつぶやいたりするときは、「Symfony2」と、空白文字を入れずに記述して欲しいというお願いです。これは検索エンジンなどでの検索時に他の1.x系のバージョンの記事と混同させずに出すようにするための施策です。symfony 1.x系とSymfony2系がフレームワーク構造として大きく異なるので、情報を正しく切り分けたいということですね。

拙い英訳ですが、原文の一部を翻訳しておきます。

As we maintain a lot of different symfony versions, it is sometimes difficult to find documentation for the exact version you are using. So, when you start using symfony 1.4 for instance, and search for something on a search engine, you find lots of results for other versions of the framework like 1.0, 1.1, and 1.2. With Symfony2, the problem will be even more annoying, as the framework is very different.

私たちはたくさんの異なったsymfonyバージョンをメンテナンスしているので、あなた方が使用中のまさにそのバージョンのドキュメントを見つけにくいことが時たまあります。ですから、例えばあなたがsymfony 1.4を使い始めて、何かを検索エンジンで探したとき、symfony 1.0や1.1、1.2などの違うバージョンの検索結果をたくさん見つけるでしょう。Symfony2に関して言えば、この問題はなおさらイライラさせることと思います。というのも、Symfony2は大きく違っているからです。

By removing the space between Symfony and the version, like in Symfony2, you can search for “Symfony2” instead of “symfony”, and search engines will then only return results related to “Symfony2”.

Symfonyとそのバージョンの間の空白文字を取り除く、例えばSymfony2というようにすることで、あなたは”symfony”という単語の代わりに”Symfony2″という単語で検索することができ、検索エンジンも”Symfony2″に関する結果だけを返してくれることでしょう。

So, please, as of now, whenever you write a blog post, a piece of documentation, a tweet, or a presentation, never write “Symfony 2” again. Use Symfony2 instead. That way, someone can search for “Symfony2 routing” and he will have only Symfony2 results.

ですから、現時点では、あなたがブログの記事やドキュメントの一部、つぶやきやプレゼン資料を書くときには、”Symfony 2″(注訳:空白文字を含んだ表記)とは書かないでください。代わりにSymfony2という表記を使ってください。そうすれば、”Symfony2 routing”と検索した人は、Symfony2の結果だけを得ることが出来るでしょう。

Blog | Talk about Symfony2, not Symfony 2 | symfony | Web PHP Framework

ということで、みなさんも早いうちからSymfony2という空白文字を含まない表記に慣れ親しんでくださいね!あと、この記事、あるいは同様の記事を書いて、多くの人にこの表記方法知ってもらえるようにお願いします!

[python]MacPortsで入れたPythonでeasy_install

Written by uechoco 8月 07
この記事を読む時間:437くらい

前回は2.5、2.6、3.x系など、バージョンの違い : うえちょこ@ぼろぐにてSnowLeopard標準のPython 2.6ではなく、GAE用にMacPortsを利用してPython 2.5とpython_selectをインストールしました

さて、Pythonにはphpでいうpear/peclコマンド、perlでいうcpanコマンドに当たるようなeasy_installというコマンドがあるようです。PyPI(Python Package Index)というレポジトリから文字通り簡単にライブラリが追加できるコマンドのようです。このコマンドはsetuptoolsというパッケージ(なのかな?)に含まれています。あーありがち – Pyに触ってみたの途中にある比較表が分かりやすいです。

このeasy_installというコマンドもどうやらPythonのインストール環境に依存しているようです。つまりMacPortsで入れたPython専用にeasy_installコマンドがちゃんと用意されています。といってもこれもMacPortsでインストールする必要があります。たとえば、私がインストールしたPython 2.5用のeasy_installコマンドはpy25-setuptoolsというパッケージに含まれています。インストールは以下のような感じになります。
[shcode]
sudo port install py25-setuptools
[/shcode]

インストールしたeasy_installコマンドのパスを確認しておきましょう。普通のeasy_installコマンドは、デフォルトではSnowLeopardに標準で入っているpython26-apple用のものです。
[shcode]
$ which easy_install
/usr/bin/easy_install
[/shcode]
MacPortsで入れたPythonのeasy_installコマンドは別のところにあります。
[shcode]
$ ls /opt/local/bin/easy_install-2.5
/opt/local/bin/easy_install-2.5
[/shcode]

本当にコマンドが違うものなのかどうか、以下のような実験をしてみました(Mac OS X 10.6.4)。

    • 「sudo python_select python25」でMacPortsでインストールしたPython 2.5に切り替え
    • 「sudo /opt/local/bin/easy_install-2.5 django」でDjangoライブラリをインストール
    • 「python」でインタプリタ起動
    • 「>>> import django」でdjangoモジュールを読み込んでもエラーはでない。
    • 「>>> quit()」でインタプリタ終了
    • 「sudo python_select python26-apple」でSnowLeopard標準のPython 2.6に切り替え
    • 「python」でインタプリタ起動
    • 「>>> import django」でdjangoモジュールを読み込むと、「ImportError: No module named django」で読み込めない。
    • 「>>> quit()」でインタプリタ終了
    • 「sudo python_select python25」でMacPortsでインストールしたPython 2.5に切り替え
    • 「sudo /opt/local/bin/easy_install-2.5 django」でDjangoライブラリをインストール
    • 「python」でインタプリタ起動
    • 「>>> import django」でdjangoモジュールを読み込んでもエラーはでない。
    • 「>>> quit()」でインタプリタ終了

ということで、インストールした環境に応じてeasy_installコマンドは違いますので注意しましょう。

参考:あーありがち – Pyに触ってみた