シンタックスハイライト(prettifier)を実装

このブログソースコードが以下の点で凄く見難かった。

1.phpのnl2br関数を使っているので、preタグの中でも改行されてしまう。
2.全て同じ色

で、素直にはてな日記とかで書こうかなと思ったんだけど、そういうのを解決していくのが勉強かなと思い留まり、頑張って実装してみた。

まずは、1つめの改行問題について。
smartyで独自の修飾子で解決できないかなと考え、いろんなところからソース探してきてこんなものが出来た。
参考サイト:No Such Blog or Diary - Nucleus の改行をちょっと頭よくする
function smarty_modifier_mynl2br($value)
{
    $i=0;
    $v2="";
    $n=mb_strlen($value);
    while($i<$n){
        $p=mb_strpos($value,"&lt;pre",$i);
        if($p==FALSE){
            $v2.=nl2br(mb_substr($value, $i));
            break;
        }
        $v2.=nl2br(mb_substr($value, $i,$p-$i));
        $i=$p;
        $p=mb_strpos($value,"&lt;/pre&gt;",$i);

        // 1つも無い場合
        if($p==FALSE){
            $v2.=mb_substr($value, $i);
            break;
        }

        $v2.=mb_substr($value, $i,$p-$i);
        $i=$p;
    }
    return $v2;
}
これで一応preタグ間はbrタグ入らないようになった。

続いて2の問題については、いろいろ探したらjavascriptで色つけれる奴があるみたいだった。
一番簡単そうなのが、Javascript code prettifierって奴だったので、以下のサイトを参考に実装。
参考サイト:コードをプリティに整形するjavascript「code prettifier」 : skuare.net

で、DBに格納しているデータそのものにprettifierってclass名をつけるのがなんだか嫌だったので、これまたsmartyの修飾子を作成。
function smarty_modifier_prettyprint($value)
{
    $result = str_replace('&lt;pre', '&lt;pre class="prettyprint"', $value);
    return $result;
}
んで、smartyのテンプレートで2つとも呼んでやればOKってことにした。
キレイキレイ。

タグ機能&タグクラウドの追加

タグ機能&タグクラウドも実装しました。
参考サイト:
PHP Tag Cloud Tutorial | Prism-Perfect.net
早速タグを入力してみたのですが、なかなかそれっぽくなってます。

PEAR :: PEPr :: Details :: HTML_TagCloudってのもあったんですが、PHP5専用らしいので。

実際タグをつけれるようになると、どんなタグをつければいいのかわかんなくなるので、いいのか悪いのかわかりません。

php4.4.7でtoken_get_all()は動きません

Ethnaでユニットテストをやってみようと思ったら、画面が真っ白に。

ま、エラーなんでしょうけど、一向にわからないので検索したら以下のサイトを発見。
PHPで画面が真っ白になる時はエラーを疑え!

で、ログ調べてたら気になるエラーメッセージが。
Fatal error:  Call to undefined function: token_get_all()

もう、apacheのログを見ながらデバッグするまでに僕もなったのですね。
・・・遅い?

で、IRCに質問したりしていたら、「php4.4.7でtoken_get_all()は動かないみたい」との助言が。


どう見ても「Call to undefined function」て出てきちゃいけないと思ったのですが、バグですね。
折角Ethnaでユニットテストにチャレンジしようとしたのに、残念です。
はぁ・・・。

PHPのmail関数が利用できない

毎日わからないことと格闘の日々です。

タイトルの件も数時間使って解決できず、家に帰っても寝るにも寝れず、家からホスティング会社に問い合わせのメールをしちゃったぐらいです。

で、格闘の記録。

まず、いつも使っているEthnaのMailSenderでメールを送信しても送れないので、Ethna_MailSenderのソースを追ったら、PHPのmail関数を使っていることが判明。
初めてEthnaのソース(アプリ側だけ)をUTF-8にした影響か?と思ったんですが、文字化けとかしてしまうならまだしも、メール自体が送れないってのは変だなと思って、返り値をvar_dumpしてみたら、falseが返ってきました。

こりゃおかしいなと思って、PHPの公式マニュアルに書いてあるようなシンプル&非常に単純なmail関数でもこけるので、こりゃEthnaとかUTF-8とかの次元じゃないことがわかりました。

mail()でメールが送信できるかどうかの確認手順 - よくきたWiki
で、上記のサイトを参考にして問題の切り分けを行ったところ、すべて無事出来ました。
・phpのmail関数は正しいメールデータを生成している
・phpのsendmail_pathで指定されているsendmailのコマンドで入力すると、メールが送られる。

PHPをインストールした時点でsendmailが特定のディレクトリに存在しないと、うまく動かない?時もあるとかないとかってことでしたが、見た感じ動かせるようにインストールはされてる感じがしました。(phpinfo()見た感じでは)

で、なんとなく権限っぽいのかなと思ったのですが、そんなにいじくりまわしていないサーバー状態で、PHPのmail関数が動かないってことは、他のアプリケーション(Xoopsとか)のメール機能も使えないだろうと踏み、ホスティング会社に聞くことにしました。

だって、もうお手上げだから・・・。

そしたら、以下のメールが返ってきました。

メールを送信するケースの場合(CGIからの送信など)送信元のホスト名は
apache@メインホスト名となってしまいます。

CGIプログラムなどできちんとemvelope-fromなどにきちんとサーバーに
設定されたメールアドレスをセットしていただいていれば特に問題はないのですが
そうでない場合、apache@メインホスト名のメールアドレスが
元々定義されていない為にエラーとなってしまいます。

弊社側にてこちらの設定を解除させていただきましたので
送信をお試しいただきますようお願い申し上げます。

結論を良いますと出来ました。
ん~さすがプロ。
すばらしい。
で、折角なのでどこを触ったのか聞いてみました。

設定変更を行った項目は以下の通りでございます。

/etc/mail/virtusertable

ファイル内に以下の項目がございます。

@メインホストドメイン名 error:nouser User unknown

この項目を無効にし(#に拠るコメントアウト)
以下のコマンドからデータベースの再起動をおこないました。

# vnewvirtmaps

「virtusertable」と「error:nouser User unknown」で検索してもなかなか出てこないので、どういったものなのか良くわかりませんが、要はapache@hoge.comってメールアドレスがないので、no userってことで、エラーになってたってことですな。

なんとなくphpの環境関数で「sendmail_from」ってのが「no value」になっていたので、そこになにかしらセットしておけばよかったのかなと思っていましたが、それじゃああんまりにも不便だろうと思っていたら、やっぱりありました↓。
PHPでメール送信する場合にメールサーバで拒否されないために (ITプロフェッショナル部)

・・・奥が深い、また勉強になりました。

あ~いつか試そうかな。
あ~疲れた。

PHP4.4.xで発生するOnly variables should be assignedというNoticeメッセージ

下記のサイトに説明が書かれています。
ホームページサービス(松・竹サービス)でのPHPのバージョンアップについて:お知らせ(京都大学情報環境機構)
追懐 PHP4.4.0で起こるMojavi2.00の不具合

いまいち参照関連が良くわからないですなあ。
コピーじゃなく参照。
実態はそのまま。

ってことはわかっているのですが。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 7 of 9

アーカイブ

2012

  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
  • 08
  • 09
  • 10
  • 11
  • 12

2011

2010

2009

2008

2007

コンタクト

longkey1[at]gmail[dot]com