cakePHP + smarty + 絵文字表示

とりあえず表示だけ。
入力、保存、出力はまたあとで。

携帯絵文字変換スクリプト様++

便利なものを作成してくださっている。
携帯絵文字変換スクリプトをPHPで作ってみた。 携帯サイトを作ろう! -ちょっと詳しいモバイルサイトの作り方-
最新版はこっちにあるらしい
携帯絵文字変換スクリプト 3キャリア対応版 - HTMLタグボード
ダウンロードは最新版から落とそう。

Smartyで携帯絵文字カスタム関数様++

別にそういう名前の関数ではないのだけど、なんて呼んでいいのかわからないので、こうやって呼びました。
Smarty で携帯絵文字 - ZeBeVogue別館

簡単に言うと、

{emoji num="120"}

とか書くだけで、3キャリア対応絵文字が出るようになります。
素敵。

設定

変換スクリプトを落として解凍しましょう

trans.php - 絵文字変換スクリプト本体
emojix.csv - 絵文字変換テーブル(XHTML用)
emojih.csv - 絵文字変換テーブル(HTML用)
images - PC表示用絵文字格納フォルダ

これら四つのファイルを受け取ります。
自分が使用するサイトに合わせて、

を選びましょう。


次に、カスタム関数を保存して、function.emoji.phpという名前にします。
保存先は、smarty/plugins/以下


そしてここに、先ほどダウンロードした、

  • emojix.csv - 絵文字変換テーブル(XHTML用)

も保存します。

function.emoji.phpの調整

cake + smarty の環境だと画像ファイルの設定が相対パスになっていて動かないので、絶対パスに変えます
75行目を

	//絵文字変換表
	$emoji_data = "絶対パス"

また、emojix(emojih).csv ファイルの名前も適時変えましょう。
まぁ、どんな方法でも読み込めればOKです



あとは、tpl側で、

{emoji num="120"}

で動きます。


追記

SoftBankで不要な改行が入ってた。
csvから絵文字取りだす部分で、

$line = rtrim( $line );

とかでいける。
改行コードは環境に合わせて。


sjis以外の文字コード使う場合、docomoが化けるので、その場合は、csvファイル自体の文字コード変えて対応。


PCでのアクセス時に画像を出したい場合は、imgのパイルパスを適時変える

レンタルサーバでcakePHPとsmartyで開発環境作るまでのメモ

もともと
cake使ってみたい => サイト作るか
という不純(?)な動機でスタート。


さくらVPS借りようかと思ったけど、FTPでもいけっかな、って思って、とりあえず今あるレンタルサーバで作って見ることに。
どうせVPSは遅かれ早かれいつか使うだろうし。

download

CakePHP: 高速開発 php フレームワーク。 Home
ここからstableののバージョン落としてきた。
申し訳ないけど、寄付はせず普通に落とす。


解答して、FTPで全部あげる。


とりあえずこれで、ページは見えるようになる

mod_write

もし、見える画面内に、緑色や黄色がなければ、それは、mod_writeが有効になってないです。
もしくは、.htaccess の記述方法が違うかな。
特に、何か適当なディレクトリにcakeを解凍してupした場合、base url の追加が必要かも。

404 Not Found
The requested URL /Users/yuichi/Sites/cake_tutorial/app/webroot/ was not found on this server.
とかって出てしまう場合は以下の修正を加えると巧くいきます。

CakePHPのルートにある .htaccess に RewriteBase を追加

諸設定

セキュリティ的によくなかったり、オールグリーンになっていなかったりするところを変えていく


webから開いてみると、エラーメッセージが何個かでているのでつぶしていく

Notice (1024): Please change the value of 'Security.salt' in app/config/core.php to a salt value specific to your application [CORE\cake\libs\debugger.php, line 548


5月 2010 | すぐに忘れる脳みそのためのメモ
これらのサイトを参考にする
'Security.salt'がデフォルトのままよ。ってエラーかな。
/app/config/core.php

	Configure::write('Security.salt', 'hogehogehoge');   // hogehogehogeの部分を適当に変える


Notice (1024): Please change the value of 'Security.cipherSeed' in app/config/core.php to a numeric (digits only) seed value specific to your application [CORE/cake/libs/debugger.php, line 688]

同じくデフォルト値変えればいい
/app/config/core.php

	Configure::write('Security.cipherSeed', '1234567890');    //1234567890を適当に

Your database configuration file is NOT present.
Rename config/database.php.default to config/database.php

database設定書いてないから
書きましょう。
app/config/database.php.default
上記ファイルをコピーして、
app/config/database.php
を作りましょう。




キャッシュしてくれたりするので、そのディレクトリを書き込み権限に変えてあげる。

app/tmp/cache/
          models/        *
          persistent/    *
          views/         *
        sessions/        *
        logs/            *
        tests/           *

印をつけたディレクトリに書き込み権限をあげる


smarty

smarty 使いたいから、使ってみる
第11回 Smartyとフレームワーク(その1:CakePHP編) - Smarty講座
ここ参考に


smarty
Download | Smarty
ここらdownload
stableを選ぶ


SmartyViewクラスは、1.0.0.7が最新版。
最新版だと、
第11回 Smartyとフレームワーク(その1:CakePHP編) - Smarty講座
ここで指摘されているような修正はしなくても、すでにコードが修正済みになってた。


ここのサイト様の言うとおりにすれば特につまらなかったから、まぁ次もこのサイトみよ

vim でのエンコードを指定した読み込み直しと、エンコードを変更して保存

vim でのエンコードを指定した読み込み直しと、エンコードを変更して保存

文字コードを指定してファイルを開き直す

:e ++enc=euc-jp

文字コードを変更して保存する

:set fileencoding=euc-jp

メモとして...



すてきなサイト
ずんWiki - vim

simple_test のススメ

phpでテストscript書こうと思って、せっかくなんでちゃんと世間的に有名な書き方に慣れておこうと思った。
なので、まずはphpでよく使われるtest codeを探す

SimpleTest

なんかSimple Testが有名らしい。
symfonyのUnitTestにも使われているらしいし、CakePHPでも使ってる人いた。
今回のtest codeはシンプルだし、使いやすそうなこいつを使う事にする。

install

基本は、落として、解凍して、適当なdir置くだけ。


本家
SimpleTest - Unit Testing for PHP
落として
SimpleTest - Unit Testing for PHP

使い方

読み込みましょう。

require_once 'simpletest/unit_tester.php';
require_once 'simpletest/reporter.php';
// UnitTestCase を継承して
// 適当にわかりやすいクラス名で
class TestHoge extends UnitTestCase
{
// php のversionに合わせて、コンストラクタの呼び方は適当に変えて
    public function __construct()
    {
        $this->UnitTestCase();
    }

// test という文字列で始まるテストコードを書く
    public function testSample()
    {
        // ここにテストを書く
    }
}

$test = new TestHoge;
$test->run(new TextReporter());

な感じで使う。
ある程度ひな形。


内部のメソッドは複数書いてOK。
なんか、test*****を勝手に探して、勝手に実行してくれる。
便利。


んで、テストコードの書き方だけど、

$this->assertTrue($hoge);

とか、

$this->assertEqual($first, $second);

とか、色々なメソッドがある。
全部書くと大変だから、ちょっとだけまとめると、

  • assertTrue($x)
    • Fail if $x is false : $xが偽でエラー
  • assertFalse($x)
    • Fail if $x is true : $xが真でエラー
  • assertNull($x)
    • Fail if $x is set : $xがNULLでエラー
  • assertNotNull($x)
    • Fail if $x not set : $xがNULLじゃなければエラー
  • assertIsA($x, $t)
    • Fail if $x is not the class or type $t : $xオブジェクトが$tタイプじゃなかったらエラー
  • assertNotA($x, $t)
    • Fail if $x is of the class or type $t : $xオブジェクトが$tタイプだったらエラー
  • assertEqual($x, $y)
    • Fail if $x == $y is false : $xと$yが等しくなければエラー
  • assertNotEqual($x, $y)
    • Fail if $x == $y is true : $xと$yが等しければエラー


他にもあるけど、あまり使わないかな。
原文だけのせておく。

assertWithinMargin($x, $y, $m)	Fail if abs($x - $y) < $m is false
assertOutsideMargin($x, $y, $m)	Fail if abs($x - $y) < $m is true
assertIdentical($x, $y)	Fail if $x == $y is false or a type mismatch
assertNotIdentical($x, $y)	Fail if $x == $y is true and types match
assertReference($x, $y)	Fail unless $x and $y are the same variable
assertClone($x, $y)	Fail unless $x and $y are identical copies
assertPattern($p, $x)	Fail unless the regex $p matches $x
assertNoPattern($p, $x)	Fail if the regex $p matches $x
expectError($x)	Swallows any upcoming matching error
assert($e)	Fail on failed expectation object $e


ちなみにレポートの吐き出し方は、TEXTとHTMLがあるようで、

$test->run(new HtmlReporter());

こんなのも行ける。
ちなみに使った事ないので、どうなるかしらないw
きっと、HTML吐き出して、エラーとか見やすいんだと思う。

phpにおける継承、抽象化、ポリモーフィズム再確認してみた

phpを使うようになって、perlの頃よりoopを意識するようになった。
せっかくなので今まで曖昧だったoopについて、再確認の意味も込めて書いてみる。


とりあえず書いてみましょう。
初心者なので、つっこみ大歓迎

ピアノを作ってみる

  1 <?php
  2 
  3 class Piano {
  4     private $name = 'piano';
  5     public function play() {
  6         echo "ドレミ";
  7     }
  8 }
  9 
 10 $piano = new Piano();
 11 $piano->play();
 12 
 13 ?>

ピアノクラスを作って見ました。


さて、ここで、ギターも買ったとします。
すると、ピアノクラスとギタークラスで、playという同じメソッドができることになるでしょう。
これはちょいと無駄です。
なわけで、楽器クラスを作り、その楽器クラスを継承してplayというメソッドを使いましょう

継承

  1 <?php
  2 
  3 class Gakki {
  4     private $area= "music";
  5     public function play() {
  6         echo "ドレミ\n";
  7     }
  8 }
  9 
 10 class Piano extends Gakki {
 11     private $name = "piano";
 12 }
 13 
 14 class Guitar extends Gakki {
 15     private $name = "guitar";
 16 }
 17 
 18 $piano = new Piano();
 19 echo "piano : ";
 20 $piano->play();
 21 
 22 $guitar = new Guitar();
 23 echo "guitar : ";
 24 $guitar->play();
 25 
 26 ?>

Gakkiクラスを作って、それを継承してみました。
ところがこのままだと、ピアノもギターも同じ音色です。
こーいつは困った。
というわけで、ピアノを弾いた場合は、「ピアノでドレミ」と出すようにしましょう。

オーバーライド

  1 <?php
  2 
  3 class Gakki {
  4     private $area= "music";
  5     public function play() {
  6         echo "ドレミ\n";
  7     }
  8 }
  9 
 10 class Piano extends Gakki {
 11     private $name = "piano";
 12     public function play() {
 13         echo "ピアノでドレミ\n";
 14     }
 15 }
 16 
 17 class Guitar extends Gakki {
 18     private $name = "guitar";
 19 }
 20 
 21 $piano = new Piano();
 22 echo "piano : ";
 23 $piano->play();
 24 
 25 $guitar = new Guitar();
 26 echo "guitar : ";
 27 $guitar->play();
 28 

このように継承元と同じメソッド名でメソッドを定義し、新たに別の機能を与えることを、オーバーライド。
んでもって、もしオーバーライドされたくなければ、final修飾詞を付ける。
final修飾詞を付ければ、不用意にオーバーライドされることを防げます。


では、ギターを弾いた場合も、「ギターでドレミ」とでるようにしましょう。
しかし、これでは、ピアノもギターもplayメソッドを持ち、楽器クラスでplayを定義する意味がないです。
ただ、今後も楽器が増えることを考えると、「楽器は演奏するもの」という定義は残しておきたい。
こういうときには抽象メソッドという考えを使いましょう。
abstract修飾詞をメソッドの前につけます。
また、抽象メソッドを含むクラスを、抽象クラスと呼ぶようです。

抽象 (abstract)

抽象化メソッドは中身はありません。
ただし、継承元で抽象化メソッドを定義すると、継承先メソッドで必ずそのメソッドがオーバーライドされることを強要します。
サブクラスでオーバーライドされないかぎり、インスタンス化できません

  1 <?php
  2 
  3 abstract class Gakki {
  4     private $area= "music";
  5     protected abstract function play();
  6 }
  7 
  8 class Piano extends Gakki {
  9     private $name = "piano";
 10     public function play() {
 11         echo "ピアノでドレミ\n";
 12     }
 13 }
 14 
 15 class Guitar extends Gakki {
 16     private $name = "guitar";
 17     public function play() {
 18         echo "ギターでドレミ\n";
 19     }
 20 }
 21 
 22 $piano = new Piano();
 23 echo "piano : ";
 24 $piano->play();
 25 
 26 $guitar = new Guitar();
 27 echo "guitar : ";
 28 $guitar->play();
 29 
 30 ?>

ポリモーフィズム

実は、なんとなくポリモーフィズムというものができちゃってます。
昨今は、ポリリズムのほうが有名ですが、
Java初心者です。ポリモーフィズムがよく分かりません。ポリリズムとどう違うんですか?|質問・相談が会員登録不要のQ&AサイトSooda!(ソーダ)
一体ポリモーフィズムとはなんざんしょ。

ポリモーフィズム - Wikipedia

ポリモーフィズムあるいはポリモルフィズム(Polymorphism)とは、プログラミング言語の型システムの性質を表すもので、プログラミング言語の各要素(定数、変数、式、オブジェクト、関数、メソッドなど)についてそれらが複数の型に属することを許すという性質を指す。多態性、多相性、多様性とも呼ばれる。対義語はモノモーフィズム(Monomorphism)、単態性、単相性で、プログラミング言語の各要素が唯一つの型に属するという性質を指す。

わかんねぇ・・。


もう少し噛砕きましょう。
ポリモーフィズムとは同名のメソッドが異なる挙動を示すことを表します。
こちらのサイト様が非常に分かりやすい。
独学PHP はじめよう、PHPでオブジェクト指向

ポリモーフィズムとは同名のメソッドで異なる挙動を実現することをいいます。ポリモーフィズムのメソッドは、同じ目的の機能に同名のメソッドを割り当てることができるということです。これは一連の関連するクラスを利用する場合に、異なるメソッド名を覚えなくていいため、利用者にとって利便性が増します。実装には、単なる継承とオーバーライドだけではそれぞれのサブクラスが同名のメソッドを持つことが必ずしも保証できないため、抽象メソッドという概念をPHPの場合利用します。

つまり、「楽器」には全て「演奏」という機能を「同名メソッド」で与えたい。
それには、「継承」と「オーバーライド」だ。
でも、それだとサブクラスが勝手に、「演奏」以外の独自名でメソッド作っちゃうかも。
それにはphpだと、抽象化が便利だ。
あれ?
これポリモーフィズムじゃね?


ってなわけです。


でも、これにはさらに一個問題を含んでいるらしいです。
それは、phpは多重継承ができないんので、サブクラスが同時に複数のスーパークラスを持てません。
つまり、ポリモーフィズムを実現したいすべてのメソッドを抽象クラスに持たせることに。
サブクラスがスーパークラスの機能を必要としない場合も、オーバーライドしないといけません。。。


わお。冗長。
例えるならなんだろう。
「演奏」の他に、打楽器用の「たたく」と、吹奏楽器用の「吹く」と、指揮用の「ふる」と、歌用の「歌う」メソッドが、すべての楽器サブクラスにあるようなもの?


そんなときに使うのが、interface

interface

インターフェイスとは配下のメソッドがすべて抽象メソッドである特別なクラスを言います

だそうですが、今日は眠いのでまた今度書く

素晴らしく参考にさせていただいたサイト

独学PHP はじめよう、PHPでオブジェクト指向

MySQL CSVファイル出力

CSVファイルでデータを出したい場合

SELECT * FROM table_name INTO OUTFILE "/tmp/sample.csv" FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';

こんな感じ

注意点と解説
  • 権限はmysqlユーザで作成されるので、/home/hoge以下とかに作ろうとするとエラーになったり
  • FIELDS TERMINATED BY で他の値を指定すれば、CSV以外でも作れるはず
  • ENCLOSED BY は文字列を["]で囲うかどうか。
    • 囲う値は"以外もいけるよ

auの新しい機種で、li要素間にdiv要素が含まれると表示がくずれるらしい

li間に行間を持たせたくて、

<li>ほげ</li>
<div><img src="s.gif" width="1" height="5" /></div>
<li>ふが</li>
<div><img src="s.gif" width="1" height="5" /></div>
<li>ばー</li>
<div><img src="s.gif" width="1" height="5" /></div>

こんなことした場合


昔のauの機種だとうまいこと、1,2,3 と番号が勝手にふられてくれたが、最近の携帯じゃ無理っぽい。



ま。メモ的に。