n進数に変換

ユーザに一意な値を割り当てたいときがある。将来永劫にわたって同じ値は使いたくない。こんなとき一番便利なのはmicrotime関数でUNIXタイムスタンプ値を少数単位まで算出してやればだいたい問題なさそう。ただ、整数部分だけでも10桁あり、例えば少数第4位まで使用するにしても、合計で14桁の数値(文字列)を使わなければならない。これではちょっと長すぎて使いづらい。

そこで思いついたのだが、各桁で使用する数字が10種類(0、1、2、3・・・)しかないから14桁も必要になるわけで、使用する文字種を増やしてやればもっと小さな桁数で表現することができる。数字は10種類あるので、これにアルファベット26文字を足せば合計36種類になる。つまり10進数を36進数で表現すれば文字列の桁数を減らすことができる。

進数の変換をするための関数が用意されている。base_convert関数だ。

この関数を使って14桁の数値(10進数)を36進数に変換すると9文字の英数字に変換してくれる。5文字のお得となる訳だ。ただし、base_convert関数は、極端に大きな数を対象とする場合は誤差が生じるらしい。おおむね14桁の精度らしいが、OSに依存するようだ。

変換関数を作らなければならないと思っていたけど、とりあえずこれで使うことにする。

JavaScriptベースのWYSIWYGエディタ

2010/08/14 | JavaScript/Ajax

最近はJavaScriptベースのリッチテキストエディタ(Rich Text Editor)が数多く出回っている。HTMLの知識がなくてもウェブページ上でHTMLコンテンツを手軽に生成できるため、とても便利だ。CMSに実装することも多い。しかしどれも一長一短的なところがある。WYSIWYGエディタを調べてみたのでメモしておく。

  • TinyMCE
    http://tinymce.moxiecode.com/
    おそらく現時点で最強のJavaScript WYSIWYGエディタ。世の中のWYSIWYGエディタに実装されている機能は、おそらく全て網羅されているのではないだろうか。カスタマイズにも対応(自作ボタンを用意して自作コマンドを実行することもできる)。jQueryのプラグインとしても動作する。WordPressのエディタとして有名。難点は重いこと。
  • FCKEditor
    http://ckeditor.com/
    今では「CKEditor」と名前が変わっている。FCKEditorのクオリティとインターフェイスを継承している強力なWYSIWYGエディタ。TinyMCEと双璧をなす。
  • WYMeditor
    http://www.wymeditor.org/
    Drupal等のCMSでも採用されいているポピュラーなWYSIWYGエディタ。インターフェイスはやや特殊だが、玄人好み。一般ユーザには使用しにくいかも。
  • nicEdit
    http://nicedit.com/
    軽量のWYSIWYGエディタ。XHTMLに対応。クロスブラウザ対応。
  • jHtmlArea
    http://jhtmlarea.codeplex.com/
    jQueryのプラグインとして動作するWYSIWYGエディタ。 作者曰く「公式にはIE6に対応しない」とのこと。クロスブラウザ対応。
  • jwysiwyg
    http://code.google.com/p/jwysiwyg/
    jQueryのプラグインとして動作するWYSIWYGエディタ。 WYMeditor互換で、機能縮小版。そのかわりに軽量化。
  • markItUp
    http://markitup.jaysalvat.com/home/
    他のエディタと違い、プレビューモードと編集モードが別の場所に表示。一般向けではないように思われる。
  • openwysiwyg
    http://www.openwebware.com/
    XHTML非対応。クロスブラウザ対応だがSafari、Chrome系はNG。

他にもいくつか見つけたが、現状ではこんなところ。

Return-Pathってなんだろう

2010/06/25 | PHPの基本

組み込みのmail関数でReturn-Pathを設定できるということを知らなかったのでメモ。というよりも仕組みを理解していなかったのでメモ。

まずReturn-Pathというヘッダの意味を理解しないといけない。メールソフト等でメールを受信したら生データを確認してみる。そうすると、Return-Pathというヘッダがどこに記述されているかわかるのだが、必ずReturn-Pathヘッダの下にReceivedヘッダの記述があるはずだ。Recivedヘッダは、メールを受信したサーバが順々に付与していくことになるので、複数のメールサーバを経由した場合は、複数のReceivedヘッダがついているはずだ。

Receivedヘッダの記述を見るとわかるが、メール生データの上ほど新しい日時になっているはずだ。つまりメールサーバは、メールを受信するとメール生データの先頭にReceivedヘッダをつけて、次のメールサーバへリレーするようになっている。つまりこれから考えると、Return-PathヘッダはReceivedヘッダが付いた後に付加されたことになる。すなわち、メール作成時にいくらReturn-Pathヘッダ等を指定しても、メールには付与されない。Return-Pathはそもそもサーバが付与するヘッダだからだ。

ではサーバは何を判断して、Return-Pathを設定するのか。

まず根本的なことから考えなくてはいけない。メールには通常作成時にヘッダが付与される。Fromが差出人で、Toが宛先だということは半ば常識的になっている。が、実は本当はそうではない(らしい)。Fromについては御存知の通りで偽装ができるのは有名だ。スパムメールなんてのはFromはたいてい偽装だからだ。しかしToも偽装できる。これがエンベロープアドレスというものだ。

telnetで接続してメールを送信することを考える。この場合、まず差出人と宛先を指定する。しかしこの状態でヘッダを何も指定しないと、subjectもFromもToもないメールが実際に送信される。そもそもメールのヘッダに記載されているFromやToと、実際の差出人や宛先は別個のものなのだ(後者がエンベロープアドレス)。

エンベロープとはすなわち封筒だ。封筒には差出人と宛先の住所を書くだろう。しかし中に各手紙にも「〇〇さんへ」「△△より」と書くだろう。前者がエンベロープアドレス(実際の差出人と宛先)で、後者がメールヘッダだ。

そこでmail関数を考える。引数は5つ。最初の引数は宛先だが、ここは宛先なのだがToヘッダとエンベロープの宛先を兼ねていると考えればよい。2つ目と3つ目のヘッダはタイトルと本文なので説明は省略。

4つ目の引数を考える。ここでヘッダを追加することができるわけだ。Fromを指定することはよくあるだろう。ここで指定するのはメールヘッダのFromだ。ではここにToを指定するとどうなるだろうか。最初の引数で指定する宛先をA、第4引数でToヘッダでBを指定する。どちらのアドレスにもメールは届くのだが、メールを見るとToヘッダが二つ付与されているはずだ(本来は一つのはずなのだが)。

で、第5引数。ここではメール送信プログラムにコマンドラインオプションを渡すことができるのだが、ここでエンベロープの差出人を指定することができる。-fオプションとメールアドレスを指定すればよい。

で、次の問題。この設定はセーフモードが有効になっているPHPでは使えない(第5引数が使えなくなる)。

そして個人的には「どんな設定でも有効になるのかどうか」確たる証拠がない。なんとなくPHPの設定やメールサーバの設定等によっては-fオプションが無効化されている場合もあるような気がする。どんな場合に使えないのか、それともいつでも絶対使えるのか、それがわからないのだ。

以前も同じような記事を書いたが、近頃いろいろ知恵が付いてきたので、それらをからめてメモしておくことにした。

8ビットの文字をメールで送信するとき

あまり文字のことで悩みたくないが、中国語のメール送信プログラムを書いたときのメモ。

タイトル等ヘッダに関する部分は英語記述で対応することにした。マルチバイトな文字が関係しなければ悩む必要なし。

中国語だと本文は当然漢字になる。日本語みたいにISO-2022-JPに変換しちゃえばいい、という具合でもなさそう。結局こんな具合で送信することにした。

  • 本文($body)はUTF-8とする
  • このままだと8bitでメールを送る可能性があるのでimap_8bit関数で変換した。
    $body=imap_8bit($body);
    ただしimap_8bit関数はIMAPモジュールが必要になる(PHP4以上で使える)。
    PHP5.3以上ならquoted_printable_decode関数のほうがいいかも。

メールヘッダも小細工が必要で、以下のヘッダを付与した。

  • MIME-Version: 1.0
  • Content-Type: text/plain; charset=utf-8
  • Content-Transfer-Encoding: quoted-printable

MIME-Versionは必要ないかもしれない。だけど参考にしたメールソフトではついていたので、とりあえずつけておいた。

MySQL使用時のtimezoneの設定

この前PHPのtimezoneの設定について記述した。この設定は当然PHPスクリプトのみで有効だ。MySQLと連携したシステムを作って、SQL文に日付関連の関数を組み込んだ場合、PHPに処理が渡る前にデータベース操作が終わってしまう。となると、データベース操作で得られる値は、期待したtimezoneでの値とは異なるものになる可能性が高い。そんな時に使うのがこれ。

SET time_zone = ‘+9:00′;

MySQL使用時に「SET NAMES binary;」というおまじないを付ける人も多いと思う。文字化け関連に対応するためにつけるわけだが、やっていることはこれと同じ。「SET」によって環境を設定している。つまりこれにより、一時的にtimezoneに変更を加えることができる。だからPHPからSQL文を発行するときに、毎回このSQL文を一番最初に発行しておいてやれば良さそうだ。

どんな具合に適用されるのかは、しばらく使ってみて確かめることにする。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net