ctags で PHP のクラス定数も仲間に入れてあげる方法

PHP ファイルに ctags しても const で定義したクラス定数がタグに入らなくて困ってたんです。

<?php
class TestClass
{
    const TEST_CONSTANT = 1;
}

↑こういうの

結構前からまいっかーと思ってスルーしてたんですけど、重い腰を上げて man ctags してみたら、--regex- というオプションを見つけて意外とかんたんにできてしまって、なーんだと

ctags -R --regex-php="/^[ \t]*const[ \t]+([a-z0-9_]+)/\1/d/i"

もっと早く腰を上げておけばよかった。

MacPorts でありがちなこと

% sudo port install postgresql84-server
...
% psql
zsh: command not found: psql

PATH 通ってねえ!!!

/opt/local/lib/postgresql84/bin にいつもの皆様が揃っておられました。

% ls /opt/local/lib/postgresql84/bin
clusterdb   dropdb    initdb          pg_dump       postgres    vacuumdb
createdb    droplang  pg_config       pg_dumpall    postmaster  vacuumlo
createlang  dropuser  pg_controldata  pg_resetxlog  psql
createuser  ecpg      pg_ctl          pg_restore    reindexdb

てか、/opt/local/bin の下に psql コマンドだけってのはどうなんだ。。。

% ll /opt/local/bin | grep postgres
... psql84 -> /opt/local/lib/postgresql84/bin/psql

Python はじめた い

いろいろ思うところあって Python をはじめてみようかと思って、とりあえず一番何も考えないバージョンで FizzBuzz ってみたの図。

for i in range(1, 100):
    if i % 15 == 0:
        print "FizzBuzz",
    elif i % 3 == 0:
        print "Fizz",
    elif i % 5 == 0:
        print "Buzz",
    else:
        print i,

感想とか

  • {} いらないの楽だなあ
  • ; いらないの楽だなあ
  • elif なのかー
  • print の末尾に , 付けると改行されないっぽい(なぜだろう)
  • そういえば range() って PHP にもあるけどほとんど使ったことない気がする(なぜだろう)

PHP でなるべく似せて書いてみたらこんな感じになった。

<?php
foreach (range(1, 100) as $i):
    if ($i % 15 === 0):
        echo 'FizzBuzz ';
    elseif ($i % 3 === 0):
        echo 'Fizz ';
    elseif ($i % 5 === 0):
        echo 'Buzz ';
    else:
        echo $i . ' ';
    endif;
endforeach;

まあ、この程度だとあんまり違いがわからんのでもっと Python 勉強してきます。

OpenPNE3 で Gmail の SMTP サーバを使ってメールを送信する方法

OpenPNE3 の master ブランチを追いかけている人(日本時間の 19:30 くらいから使えるようになりました!)もしくは OpenPNE 3.4 を導入する予定の人向け

config/OpenPNE.yml で mail_smtp_host と mail_smtp_config を以下のように設定してください。

# config/OpenPNE.yml

# SNS から SMTP 経由でメールを送信する場合の SMTP サーバのホスト名
# Hostname of the SMTP server for sending e-mail via SMTP
mail_smtp_host: "smtp.gmail.com"

# SNS から SMTP 経由でメールを送信する場合の SMTP の設定
# Config of the SMTP for sending e-mail via SMTP
mail_smtp_config:
  auth:     "login"
  username: "yourname@gmail.com"
  password: "yourpassword"
  ssl:      "tls"
  port:     587

Zend_Mail で Gmail の SMTP サーバを使ってメールを送信する方法

基本は Zend Framework のマニュアル通り。

http://framework.zend.com/manual/ja/zend.mail.smtp-authentication.html

<?php
$host = 'smtp.gmail.com';
$config = array(
    'auth'     => 'login',
    'username' => 'yourname@gmail.com',
    'password' => 'yourpassword',
    'ssl'      => 'tls',
    'port'     => 587,
);

$tr = new Zend_Mail_Transport_Smtp($host, $config);
Zend_Mail::setDefaultTransport($tr);

default transport を設定した後は通常通り new Zend_Mail() とかして送信すればおk。

ちなみに設定は何通りか書ける。

<?php
$config = array(
    'auth'     => 'plain',  // login の代わりに plain でもOK
    'username' => 'yourname@gmail.com',
    'password' => 'yourpassword',
    'ssl'      => 'tls',
    'port'     => 587,
);
<?php
$config = array(
    'auth'     => 'login',
    'username' => 'yourname@gmail.com',
    'password' => 'yourpassword',
    'ssl'      => 'ssl',  // tls の代わりに ssl でもOK
    'port'     => 465,    // ssl の場合はポートを 465 にする
);

以下はNG集。

# NG
<?php
$config = array(
    'auth'     => 'login',
    'username' => 'yourname@gmail.com',
    'password' => 'yourpassword',
    'ssl'      => 'tls',
    'port'     => 465,
);
# NG
<?php
$config = array(
    'auth'     => 'login',
    'username' => 'yourname@gmail.com',
    'password' => 'yourpassword',
);

opRichTextareaSyntaxHighlightPlugin 作った

http://github.com/balibali/opRichTextareaSyntaxHighlightPlugin

OpenPNE3 のリッチテキストエリア(現在、標準で使われているのは日記の本文の部分のみ)に、ソースコードを貼ったときにシンタックスハイライト(色付け)してくれるプラグインです。

インストール方法と使い方はとってもかんたんなので README.ja を見てください。

以下、内部の技術的な話。

opWidgetFormRichTextareaOpenPNE は、symfony の sfWidgetFormTextarea を拡張したものですが、TinyMCE によるリッチテキストエディタの機能を追加するとともに、自身で外部から拡張可能な機構を備えています(作者のid:ooharabucyou++)

拡張するにはまず opWidgetFormRichTextareaOpenPNEExtension を継承した独自のクラスを作成します。

opWidgetFormRichTextareaOpenPNEExtension には5つの拡張可能なメソッドが用意されています。

  • getPlugins()
  • getButtons()
  • getButtonOnClickActions()
  • getConvertCallbacks()
  • getHtmlConverts()

今回はリッチテキストエディタのボタンやアクションは増やさずに、表示処理だけ変更することにしたので、 getConvertCallbacks() メソッドだけを拡張しました。

getConvertCallbacks() は、キーにタグ名(今回の場合 op:source)、値にコールバック形式を持つ連想配列を返すようにしてやります。

# lib/widget/opRichTextareaSyntaxHighlightExtension.class.php
<?php
class opRichTextareaSyntaxHighlightExtension extends opWidgetFormRichTextareaOpenPNEExtension
{
  static public function getConvertCallbacks()
  {
    return array('op:source' => array(__CLASS__, 'toHtml'));
  }

  static public function toHtml($isEndtag, $tagname, $attributes, $isUseStylesheet)
  {
    ...
    if ($isEndtag)
    {
      ...
      $lang = $attributes['lang'];
      ...
      return sprintf('<pre class="brush: %s">', $lang);
    }
    else
    {
      return '</pre>';
    }
  }
}

コールバック関数側では を置き換える HTML の文字列を返すようにします。第一引数の $isEndtag が false のとき開始タグを、true のとき終了タグを置き換える HTML を返します。

第三引数の $attributes を使えば のように属性値を与えて挙動を変えることができます。

最後に拡張したクラスを opWidgetFormRichTextareaOpenPNE::addExtension() で登録すれば一丁上がりです。

# config/config.php
<?php
opWidgetFormRichTextareaOpenPNE::addExtension('opRichTextareaSyntaxHighlightExtension');

以上、かいつまんで説明しましたが、このプラグイン自体は省略した部分も大した分量はないのでぜひ参考にして独自のプラグインを作ってみてください。