2010年7月28日水曜日

Windowsでの機種依存文字の文字化け

根が深そうな割に簡単に片付いたのでメモ。

今回のシステムは、
MS SQL Server
(Windows)
|
apache + php
(Linux)
|
API Server
(Linux)

という構成で、LinuxからWindowsのDBを叩く、というもの。
当然、文字コードも、WindowsはSJISだし、LinuxはUTF-8だし、で変換してあげないといけない。
で、普通に変換かけてたんだけど、(株)とかの機種依存文字が化けちゃう。
色々試してみたところ、
mb_convert_encoding($str, "UTF-8", "SJIS");
じゃなくって、

mb_convert_encoding($str, "UTF-8", "sjis-win");
でやれば、機種依存文字もきれいに変換してくれるみたい。
文字コードの指定、SJISじゃだめなのね。知らんかったよ。

PHPのスコープ演算子 self:: と static::

class A {
    static function getInstance() {
    }

    protected function A2B() {
        echo "A";
    }

    public function _test() {
        self::A2B();
    }
}
class B extends A {
    public function A2B() {
        echo "B";
    }

    public function test() {
        self::A2B();
    }

    public function test2() {
        self::_test();
    }
}
さて、こういうクラスがあったとしましょう。
A::test();
A::test2();
この結果はどうなるでしょうか?
結果は
B
A
となるはず(試してません)です。
クラスの中で self:: というスコープ定義を使用した場合、あくまでも「自分」を参照します。ですから継承先(B)から関数を呼び出しても、その関数が継承元(A)の関数であれば、self:: は A:: と等価です。
では、継承元(A)から継承先(B)を参照したい場合はどうすればよいのでしょうか?
最近、テーブルクラスの汎用化を行う際に梃子摺った問題で、いまだに解決できていません。
phpのバージョンが 5.3以上であれば、self:: のかわりに static:: を使うことで、呼び出し元のクラスを参照することができるようです。

クラス関数を静的(static)な実装にしてしまっているので、コンストラクタで呼び出し先のクラス名を渡す、などの操作もできず。
困りました。


コアインスタンスだけは動的に生成するようにしようか・・・

2010年7月27日火曜日

Microsoft SQL Server

ついにきました。MSSQLいじる仕事。
これまで頑張って避けてたのにな。

それはいいとして。早速テスト。

$conn = mssql_connect('172.16.1.10\Instance01', 'sa', 'pass');

で、エラー。どうやらサーバーの指定に間違いがあるらしい。
マニュアルには、'サーバー名\インスタンス名' って書いてあるし、そのとおりにしてみたんだが。
検索してみると、ここに指定するサーバーの名前は、interfacesファイルに記載されていなければならない、とか。
Free TDS? Interfaces??
なんじゃそりゃ。
さっぱりわからんまま、マニュアル読んでたら、IPアドレスとポートだけで接続先指定してるケースもあった。
とりあえず、IPアドレスだけにしてみる。

$conn = mssql_connect('172.16.1.10', 'sa', 'pass');

つながったwww
わけわからん。

2010年7月23日金曜日

BIGINTとjson_decode

今日 phpのドキュメント見てたら、json_decode の引数に option を渡せるんだってね。
で、指定できる値が
JSON_BIGINT_AS_STRING
なんてこったい。64bit化されたtwitterのID値もこれで文字列として取り込めたのか。
ちゃんとドキュメント読んでませんでした。

うわーー無駄な労力使っちゃったよーー!!

2010年7月22日木曜日

【twitter API】RT/@/DMの取得

あるtweetへの返信(@)は、
$twitter->statuses->mensions
で取得できる。
また、公式RT(RTされた自分のtweet)は、
$twitter->statuses->retweets_of_me
、ダイレクトメッセージは
$twitter->direct_messages
だ。ここまでは誰でもできそう。
で、問題は非公式RT。いわゆるQTとかも含めて。
これは、調べてみたところ、普通に@として取得できるようだ。
なので、システム上、非公式RTと通常のRT,@を区別して扱いたければ、取得した@をうまくふるいにかけて分類してやる必要がある。
一般的に、非公式RTは、
「@として取得できたtweetのうち、@の前に"RT"が付く」
「@として取得できたtweetのうち、@の前に"QT"が付く」

というようなフィルタリングでだいたいいけると思う。
なので、

$statuses = $twitter->statuses->mensions();
foreach ($statuses as $status) {
     if (preg_match('/(RT|QT) *@/', $status->text)) {
        $memsions['QT'][] = $status;
    } else {
        $mensions['@'][] = $status;
    }
}
var_dump($mensions);

こんな感じ?で分類できるのかな?試してないけど。

2010年7月15日木曜日

そろそろ

モバイル向けのアプリの企画を出さないとーっ!
はぁ・・・忙しすぎて心が折れてる・・・


がんばろ・・・