2010年12月21日火曜日

fgetcsv で文字化け!

「文字化け」

そこはかとなく初心者風味ですね!
それはおいといて、状況説明を。

とあるプロジェクトでCSVをDBに取り込む処理を作る必要が出てきました。
このプロジェクトは、結構昔から動いているシステムにプラグイン的に機能を追加していくような雰囲気のものなんですが、古いだけあって、システムの基幹部分が EUC-JP で組まれている。
で、インポートしたいのはご多分にもれず、Excelから吐き出した Shift_JISのCSV。
CSVの項目内に、「ダブルクオートされたコンマ区切りのデータ列」が含まれるから困ったもんで。
オイラ、基本的にPHPの fgetcsv関数を信用してないもんで、いつもなら fgets してから explodeなりpreg_split なりするんだけど、この状況では、単純な正規表現では切り分けられない。
頑張れば組めそうだけど、そんな目に見えないところに力を注いでる時間もない、ってんで、渋々 fgetcsv関数を使う事に決めたわけですよ、奥さん。
最初はうまくいってるように見えましたよ。最初は。
でも、いろんなデータをインポートしてみたら、ときどきエラーが出ちゃうのね。
なんだ?ってんで確認してみたら、

"パッソ","セッテ","クラウン"

てな感じの行を取り込んだ配列をダンプしたら
array(3) {
[0]=>
string(15) "パッソ",セッテ""
[1]=>
string(8) "クラウン"
}

だってさ。
つまりこういう事だ。
「ソ」ってShift_JISの文字化けトラブルナンバー1の文字なのはご存じのとおり。
で、「ソ"」っていう並びをfgetcsvが取り込もうとした時に、「ソ\"」って変換しちゃったもんだから、次のフィールドまで含めて1つのデータだと勘違いしちゃった感じですね。

結論。

やっぱ fgetcsv は使えねぇ!!

$in = fopen($srcFile, "r");
$out = fopen($dstFile, "w");
while(!feof($in)) {
fputs($out, mb_convert_encoding(fgets($in), "EUC-JP", "SJIS"));
}
fclose($out);
fclose($in);
$fp = fopen($dstFile, "r");
while(!feof($fp)) {
$csv = fgetcsv($fp);
:
:
}
fclose($fp);

ま、結局使うんだけどね。


そんな日。

2010年11月22日月曜日

iPhoneローカライズのメモ

いろんなところに情報があるけど、自分でやった分のメモ。

まず、何も考えずにアプリを作る。
だいたい形ができたところで、文字列 (@"~")を指定している部分は
NSLocalizedString(@"~", @"")
とする。
その後おもむろに、コンソールを立ち上げて
genstring (.mファイル)
とすると、カレントディレクトリに Localizable.String ファイルができるので、en/ なり ja/ なりコピーする。
これでソース中でたとえば、
NSLog(@"Connection failure!!");
なんて書いてる場所を
NSLog( NSLocalizedString(@"Connection Failure!!", @"") );
として、ja/Localizable.Strting に
"Connection Failure!!" = "接続できませんよ!"
なんて書くと、端末の言語設定が日本語になっていれば、"接続できませんよ!"とログに吐きだされる。
注意点としては、 genstring の挙動で、Localizable.String が既にあっても上書きしちゃってマージしてくれないので、Localizableファイルを作成するのは遅ければ遅い方が楽ってこと。
Localizableファイルがなければ、NSLocalizedString はそのままの文字列を出力してくれるので、問題は起きない。

以上。

2010年11月17日水曜日

iPhoneで撮影した画像をライブラリに保存する

情報がなかなか見つからんかった。
http://iphone.longearth.net/2009/02/15/%E3%80%90iphone%E3%80%91%E7%94%BB%E5%83%8F%E3%82%92%E3%83%95%E3%82%A9%E3%83%88%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AB%E4%BF%9D%E5%AD%98%E3%81%99%E3%82%8B/

ここに書いてます。
撮影して加工するのは色々サンプルあるけど、それをサーバーに送るとか、WebViewを通してアップロードするとか、ライブラリに保存するとか、そういう点について説明してるサイトが少ないね。
まぁいいけど。

2010年11月15日月曜日

iPhoneアプリ

わからんなりに進めております。
基本的には、WEBサイトを独自のアプリで表示させて、機能的に足りない部分をアプリ側で補っていく感じにしようかと。
で、問題は、写真を撮ってそのままフォームで送信、とかしたいのね。
手間を省くために、基本的にアプリの表示画面は UIWebView で拵えようと思っているので、どうしたもんかと小一時間。

結局、以下のような雰囲気で実装することにしました。
・HTMLの画像に特殊なリンクをはる
・アプリ側でリンクのタップをフェッチ
・特殊なURLのリクエストであれば、アプリ側に制御をもらってカメラを起動する
・カメラなりライブラリなりから取得した画像をencodeしてjavascriptでHTMLに渡す
これで、たぶんサーバーにカメラ画像が送信できるはず。

Viewのコントロールがめんどくさくて時間かかるのが問題だな。何かバグが出たときに対応できる自信がない・・・

2010年11月10日水曜日

iPhone

あるアプリの製作を依頼されたので、これからiPhoneのアプリ製作を始めるわけですが、ここ数年ヌルいphpにどっぷりハマってしまっているので、対応できるかしら?

なんて思いながら、xcodeを立ち上げて触ってみる。

さっぱりワカランwwwwww
ん?え?outlet??
はぁ?Delegate??

日本語でおk。



っていうか、世の中に存在する優れた言語の体系、それを使って拡張してんだったら、命名を世の中の流れに合わせようよ?
ねぇ、Appleさん?

傲慢すぎるObjective-C の仕様に早速やる気なくしたぞ。

2010年11月1日月曜日

Geohash いまさらながら衝撃を受けました

iPhoneで four squareのような事をしたいと思って、手軽にGPS座標を扱える仕組みを考えていたところ、こういうのにぶち当たりました。

geohash.org

仕組みを読んで納得。これはすげぇ。
メカニズムについては、他の人が詳しく書いてるので、そちらを参照頂くとして、リンク置いときます。

GPS座標を短い文字列で扱えるGeoHashが面白い
Geohashのアルゴリズム
GeoHashのdecodeのアルゴリズムの解説します

下にいくほど詳細な説明になります。
これは、久しぶりに頭をハンマーで殴られたような衝撃ですね。
GPSの座標は、いわゆる座標として計算したりするのが当たり前だと思ってたんですが、そうじゃなかった。
地球を、南北に -90°~0と0~+90°、東西に-180°~0と0~+180°に分割して目的のエリアがそれぞれどちらに含まれるかを、0か1の2ビットで表現する。
それをどんどん繰り返して、最終的には 2cm×3cmのエリアにまで絞り切るわけです。
まぁそこまで絞り込んでも、必要となるデータ量が60bitっていうのも、なんだ。アレだ。エコですわ。

これから座標使うときはコレで決まりですね。
別にGPS座標じゃなくても同じアルゴリズムでいろんな情報のパッケージ化できそうだし。

ちょっと楽しい。

配布されているphp用のライブラリには、近隣エリアのgeohashを求める関数がなかったので、作りました。
ダウンロード

2010年10月26日火曜日

PEAR Spreadsheet::Excel::Writer で印刷範囲を設定

PEARのドキュメントが不親切すぎて、何度 PHPExcel に乗り換えようと思ったことか。
でも PHPExcel は php 5.2 以上じゃないとダメなんだって。
運用中のサーバーで phpのバージョン上げるなんてできるわけもなく、泣く泣く Spreadsheet::Excel::Writer でちゃんと印刷できるような設定の仕方を模索します。

結論から書くと、

// A4指定
$sheet->setPaper(9);
// 出力方向:横向き
$sheet->setLandscape();
// 改ページ指定(テスト)
$sheet->setHPageBreaks(array(35,51,84,115));
// 印刷倍率
$sheet->setPrintScale(63);
// 出力範囲の指定
$sheet->printArea(0,0,144,32);

こんな感じ。
ちょっと横に広くて、縦にも何行あるか良くわからんようなデータの出力で使いました。
縦がどんだけの行数になろうが、横幅をA4横の1ページに収めるための倍率っていうのは、だいたい一意に決まるもので、これはページごとに違うけど、いちいち計算で出すよりは、ページごとに固定の定数で持つのが、たぶん現実的な回答。

んで、あと問題になりそうなのは、setHPageBreaks() の挿入位置。
ある程度定型のシート出力なら、固定で持ってもいいんだろうけど、あいにく、表の行数は変動するし、どこで切ればいいかなんて、あらかじめわかるもんではない。

なので、セルを書き込むときに、ある程度、「この表の下で改ページ」っていうのを決めておくか、「○行出力したら改ページ」みたいにしとくべきかと。

出来上がったワークブックは客に見せるので、縦に合わせて印刷倍率を変えるような事は絶対できない。横は紙いっぱいに印刷したいしね。

最後の printArea() は、全体の、出力する範囲を決める関数。その中に何ページ含まれるかなんてことは関係ない。
最初、この関数で範囲指定すれば、そこが1ページとして出力されるのかと思って、ちょこっとハマりました。

出力しては、エクセルで表示、ってのを繰り返して、これ以外ないだろう、っていう最終形です。

参考までに。

2010年10月21日木曜日

analyticsの仕様が少しわかってきた

ここ とか ここ とか。

っていうのは、ちょっとしたリンクのテストで。
Analyticsは基本的にページに埋め込まれたjavascriptでどこから来たかとかいろんな情報をgoogleに送るわけですが、

あとは、phpのバージョンが 5.1 なので、PHPExcelが使えない事が判明。
PEARのExcelWriterでなんとか印刷範囲の設定を行います。


後は明日かきます。

2010年10月4日月曜日

twitterのAPIが仕様変更しましたね。

新、っていっても、パラメータが追加されたとかそーいう変更が主体みたいだけど、先月くらいから、ウチのAPI叩いてるモジュールがエラーをはき始めて、なんだろう、と思ってたら、このAPIの仕様変更が原因でした。
少なめにパラメータを指定してtimelineを取得すると、それまでになかったデータが含まれるようになった。
そのせいで、データのパーサーがエラーで落ちてた、と。
まぁパーサーがヘボかった、っていうのはあるんだけど、それにしてもなぁ。仕様変更したらもうちょっと多きく告知してよ、twitterさん。

にしても英語でblog書くのって疲れる。
もうちょっと勉強せねばなぁ。

2010年9月29日水曜日

php + xmlrpc => WordPress [en]

I tried to build application post to WordPress through XMLRPC-API using php and xmlrpc modules.
Almost works good, but i just have a little trouble when setting up categories to posted articles.
XMLRPC-API accepts categoryName instead of categoryID.

My site has auto post system to many SNSes and have arrays of IDs which category to post.
So, i have to use API named 'mt.getCategoryList' everu time posting any articles.
It's so silly process >o<.

Have a good day.

* Thanks.

2010年9月22日水曜日

convert SimpleXMLElement Object to standard class Object.

$stdObj = unserialize(str_replace('O:16:"SimpleXMLElement"', 'O:8:"stdClass"', serialize($xmlElement)));

シリアライズしたら何でもかんでも文字列表現になるので、ちょちょいと。

いろいろ試したけど、これが一番お手軽!

2010年8月30日月曜日

ubuntu 10.04 + emobile D02HW

まず結論。
ううまくいきません。

USBに接続してもデバイスを認識せず。ストレージとしては認識できてるから、何かあるんだろうね。
ノートにubuntu入れてモバイル通信できる環境にしたいのに、全然無理ッス。
とりあえず、野良wlanポイント探すしか。

twitter::update_profile_image で 500エラー

うーん。最新版のtwitterライブラリに更新したらLIST機能が使えたのは僥倖。

しかし、プロフィール画像の更新がうまくいかない。
関数は、画像ファイルへのパスを渡して呼び出すだけの簡単仕様。
なのに、呼び出しても 「500 Internal server error」が返ってくるだけで更新されない。
Google先生によると、うまくできてる例はいっぱいあるのに。

ライブラリのバグかなぁ・・・・?

2010年8月17日火曜日

MovableType XMLRPC-API で投稿してみる!

基本は FC2ブログと同じなので、まぁ問題ないかと思いますが、問題がいくつか。
マニュアルがわかりにくいってのが問題なんだけど、MovableTypeのblogIdとパスワードについて。

blogIdってのは、MovableTypeの管理ツールを端から端まで見て回ってもどこにも書いてませんでした。
なので、blog作成して、そのblogの管理画面を開いたときにURLに付いてるパラメータを参照します。
たとえば、
http://サイトURL/mt.cgi?__mode=view&_type=entry&id=3&blog_id=3
こんな感じ。
"blog_id=3"って書いてあるから、ここでは"3"がblogIdになります。
あと、パスワードは管理画面にログインするパスワードではない。
システム>ユーザー>WEBサービスパスワード
で設定したパスワードを指定します。

これでPOSTできるようになった。
ただ、今のところ、
metaWeblog.newPost
を使ってるんだけど、投稿日時が1月1日になっちゃう。

で調べてみたところ、
http://www.na.rim.or.jp/~tsupo/program/blogTool/mt_xmlRpc.html
ここの情報で
dateCreated は、ISO.8601 形式で表記してください (ただし、省略することも可能です。 省略した場合は現在時刻を指定したものとみなされます)。
 なんだそうな。
2008-05-16T11:25:30+09:00
みたいな表記にしないといけないらしい。
めんどくさいから省略しちゃお。

2010年8月4日水曜日

アメブロへの投稿 via API

WSSEヘッダの生成でハマったのでメモ。

最初、前任者が livedoorへの投稿で使ってたやり方を踏襲して、

$nonce       = pack('H*', sha1(md5(time().rand().uniqid())));
$created     = date('Y-m-d\TH:i:s\Z');
$digest      = base64_encode(pack('H*', sha1($nonce . $created . strtolower(md5($password)))));
$wsse_text   = 'UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"';
$wsse_header = sprintf($wsse_text, $username, $digest, base64_encode($nonce), $created);

ってやってた。そしたら全然401エラーから先に進まないの。
参考になるサイトみても、理論上間違ってないし、これで通らない理由がわからん。
で、ふと気付いて。
$nonceの値、なんでこんなややこしいやり方で作ってんの?
どうにも不可思議だったので、極力シンプルに、

$nonce = sha1(md5(time()));
にしてみた。

・・・・・・・・・・・・ 認証通った。


なんじゃそりゃーーーー!!!!!

つわけで、今は記事投稿したら 403になるエラーに遭遇してハマっております。
困ったもんだ。

ブログ API のエンドポイント

 http://sozai.7gates.net/blog/docs/blogapi/
こんだけ集めてくれてると便利。
以下魚拓コピー。

●XML-RPC

goo ブログのエンドポイント
 http://blog.goo.ne.jp/xmlrpc.php
PwBlogのエンドポイント http://www.pwblog.com/xmlrpc
DTI ブログのエンドポイント http://blog.dtiblog.com/xmlrpc.php
FC2 ブログのエンドポイント http://blog.fc2.com/xmlrpc.php 
NetLaputa ブログのエンドポイント http://blog.netlaputa.ne.jp/rpc/mt-xmlrpc.cgi
News-Handler http://blog.nettribe.org/xmlrpc.php
Seesaa ブログのエンドポイント
http://blog.seesaa.jp/rpc (ssl経由は https://ssl.seesaa.jp/blog/rpc 
ココログのエンドポイント http://app.f.cocolog-nifty.com/t/api
ドリコムのエンドポイント http://blog.drecom.jp/api/xmlrpc
269gのエンドポイント http://269g.jp/rpc
プチモールブログのエンドポイント http://www.petitmall.jp/xmlrpc.php
News Handlerのエンドポイント http://blog.nettribe.org/xmlrpc.php
JUGEMのエンドポイント http://*****.jugem.jp/admin/xmlrpc.php
wordpress.comのエンドポイント http://ユーザー名.wordpress.com/xmlrpc.php
ヤプログのエンドポイント http://www.yaplog.jp/xmlrpc
ブログ人のエンドポイント http://app.blog.ocn.ne.jp/t/api xml-rpc形式
さくらのブログのエンドポイント http://blog.sakura.ne.jp/rpc/
so-net ブログのエンドポイント
http://blog.so-net.ne.jp/_atom/blog (記事用)
http://blog.so-net.ne.jp/_atom/image(画像用)

MovableTypeのエンドポイント
http://ドメイン/mtディレクトリ/mt-xmlrpc.cgi
XOOPSのエンドポイント
http://ドメイン/XOOPSのディレクトリ/modules/wordpress/xmlrpc.php
Nucleusのエンドポイント
http://ドメイン/nucleusディレクトリ/xmlrpc/server.php
WP(Word Press)のエンドポイント
xmlrpc.php までのパス ブログのURL/xmlrpc.php


●Atom (REST SOAP)
 
ライブドアのエンドポイント http://cms.blog.livedoor.com/atom
ブログ人のエンドポイント https://app.blog.ocn.ne.jp/t/atom/weblog atom形式
Bloggerのエンドポイント https://www.blogger.com/atom
アメブロのエンドポイント http://ameblo.jp/servlet/_atom/blog


参考:MT実装のXML-RPCメソッド
http://www.sixapart.jp/movabletype/manual/3.2/mtmanual_programmatic.html

2010年8月3日火曜日

simple_xml + serialize

いつもー苦労する。
SimpleXMLクラスってなんであんなに使いにくいの!
使いにくい一番の原因は serializable じゃない、って事。

twitterのAPI叩いてStatusをxmlで取得するんだけど、普通にこれをDBに保存しときたいのね。
で、毎回、この変なクラスからスタンダードな、シリアライズできるオブジェクトに変換する関数を書いてたんだけど。ここにきれいに書かれてるソースがあったから、メモ。
http://techblog.yahoo.co.jp/web/yahoo/post_1/

ちゃんと使えそうであります。

(注)
最近は、serializeを使った簡単クラス変換 でやってますwww

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日木曜日

そろそろ

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


がんばろ・・・

2010年6月22日火曜日

短縮URLの利点ってなんだ?!

もちろん、URLが短く書ける、っていうのは最大のメリットだろう。
他にも、パラメータ付きのURLを隠蔽できるからアフィリエイトの誘導に使いやすくなるとか。
ブラウザでアクセスしてもらうんだから、アクセス情報が確実に取れる、とか。
色々ありそうね。

特にアフィリエイトへの誘導に関しては、運営側にメリットをもたらす可能性があると思う。
短縮URLとアフィリエイトを融合させて、アクセス解析やIP分布調査などと併用すれば、かなり質の高いサービスを提供できる可能性がある。
しかも、アフィリエイトがからめば、短縮URL自体を有料サービスにもっていける可能性も出てくるわけだ。
なかなか興味深い。


急ごう。

2010年6月21日月曜日

個人的に

ちょっと思い立って、個人的に短縮URLのサービスを作ってみようかと思う。
短縮URLって要はリダイレクト機能なので、そこに込められた可能性ってまだまだ発掘し尽されてない気がするんだよね。

そんな感じです。

しばらく忙しくなるな!

2010年6月18日金曜日

youtube gdata API

最後の仕上げに youtubeのAPIから情報を取得するモジュールを調べてる。
けど、なんだこれ。
I/Fの仕様はきっちり決まっててドキュメントもあるかわ、実装自体は楽なんだけど、動作がイチイチ怪しい。
inboxに入ってるメッセージの一覧を取ろうとしてるんだけど、何も返って来ない。
自分のチャンネルに登録してある動画の再生回数を調べようとしたら、どうやっても0しか返って来ない。
んー。動画のフィード自体は正常に取れるみたいだから、登録した動画のフィードをひとつずつ取って、再生回数カウントしていけばいいんだけど、inboxの方はどうしようもないね。
gmail経由でデータ取るしかないのかなぁ。

参考URL:
http://code.google.com/intl/ja/apis/youtube/developers_guide_php.html
http://code.google.com/intl/ja-JP/apis/youtube/reference.html

2010年6月17日木曜日

mixiのAPI

もうね、すんごいウザっ!

本文にURLをつけるとですね、かなりの確率ではじかれます。
URLの長さなのか、ドメイン判別してるのか知らないけど。
はじかれるだけならいいんだけど、POSTできない、っていうんじゃなくて、空のデータがPOSTされちゃう。
困るよね、こんな仕様。

受け付けないならブロックしろよ、と。

URL短縮しちゃえば問題ないんだけどね。

bit.lyよ、お前モカ

URL短縮でよく使われる有名な bit.lyですが、このほど、APIへのアクセスでエラーが多発するようになりました。

(#208) You have exceeded your hourly rate limit for this method.

ぐはっ使いすぎ、でつか。
もう自前でつくろうかな・・・

全文検索とmecab

今、いろんな仕事と平行して走ってるプロジェクトがあって、そこではpostgresqlで全文検索を行うために mecab を使ってアレコレしてる。
この全文検索、なかなかクセ者で、明らかにマッチするであろう単語は期待通りにマッチすることが多い。
でも、マッチしないであろう単語が意外にもマッチしてしまったり、期待してたのと違うレコードがマッチしたりするから、さあタイヘン。

今朝クレームが来たのは、「ほげほげ」って入れて検索すると何にもマッチするはずないのに180件もヒットしたんですけど!っていう内容。
で、ちょこっと調べてみた。

[psql]
database=# explain select keyword from csv_data_rows__2 where to_tsvector('japanese', keyword) @@ to_tsquery('japanese', 'ほげほげ');
QUERY PLAN
-------------------------------------------------------------------------------------------------
Bitmap Heap Scan on csv_data_rows__2 (cost=44.78..247.91 rows=57 width=226)
Recheck Cond: (to_tsvector('japanese'::regconfig, c29) @@ '''ほる'' & ''ほる'''::tsquery)
-> Bitmap Index Scan on idx_csv_data_rows__2_gin (cost=0.00..44.77 rows=57 width=0)
Index Cond: (to_tsvector('japanese'::regconfig, c29) @@ '''ほる'' & ''ほる'''::tsquery)
(4 rows)

「ほげほげ」が「ほるほる」に変化しとるwww
んじゃぁってんでmecabに直接かけてみた。

sh-# echo ほげほげ | mecab
ほ 動詞,自立,*,*,五段・ラ行,体言接続特殊2,ほる,ホ,ホ
げ 名詞,接尾,一般,*,*,*,げ,ゲ,ゲ
ほ 動詞,自立,*,*,五段・ラ行,体言接続特殊2,ほる,ホ,ホ
げ 名詞,接尾,一般,*,*,*,げ,ゲ,ゲ
EOS

ふむふむ。
コレによると、「ほげほげ」っていうワードは分解、解析されて、たいていの「ほ」からはじまる単語にマッチしてしまいそうだ。
単純に「ほ」で検索した場合よりも件数が少ないので、他にも条件はあるんだろうけど。

辞書をマッシュアップすればマシになるんだろうけど、そこまでする仕事じゃないしな。

「仕様です」で乗り切ろう。

2010年6月16日水曜日

facebook

最近、facebookのAPIにフィードをPOSTすると、

(#341) Feed action request limit reached

っていうエラーが返ってくるようになった。しかもある特定のアカウントだけ。
色々調べてみたけど、1日にPOSTできるフィードの数が決まってんだよ、とか、facebookのバグだとか、色々書いてあって、結局原因も解決策もわからない。
でも、自分のアカウントで試してみたけど、一度に20件くらいフィードをPOSTしてもこんなエラーは出てこない。
あと考えられるのは、アカウント情報が間違ってるとか?

と思ってお客さんに、oauthの認証をやり直してもらった。

うまくいったみたい。
なんなんだよ。

php => pop + gmail (続々)

書くの忘れてた。

gmailにpopでログインするときに、ユーザ名に recent: ってつけると、既読、未読関係なく最近の何件かを返してくれる。

同じことを youtubeでもやりたいんだけど、こっちはできないんだよなぁ。そもそもPOPアクセスじゃないしなぁ。
困ったもんだ。

2010年5月25日火曜日

Service_Twitter と json

手軽に使える、という理由でしばらくはデフォルト設定のまま、json出力で Service_Twitterクラスを使ってました。
でも、なんか挙動がおかしい。

で、調べてみると、みんなstatus idとかが同じ値になってる。
しかも見たことある数字!!

どうやら、statusのidがphpで扱えるintegerの範囲を飛び出してしまっているために、jsonのエンコーダに丸め込まれてしまったらしい。
ははーん。こんな事に納品当日の数時間を無駄に使っちまったぜ!

つわけで、Twitterクラスの標準フォーマットを xmlに変更して一件落着・・・

かと思いきや!

SimpleXMLElementとかいう意味不明なオブジェクト配列で返って来るわ、このオブジェクト、serializeしてセッションに突っ込んだら復元不能でFATAL ERROR吐くわ、もうほんと意味不明。
こんなオブジェクト、誰が作った?

とりあえず、戻り値のSimpleXMLElement配列を通常のオブジェクト配列に変換して対処。

もーめんどくさいなぁ・・・

2010年5月24日月曜日

php => pop + gmail (続)

gmailの既読フラグについて。

popでbodyをfetchすると、内部的にフラグが立つ。
headerをfetchしただけでは既読にならない。

で、disconnect したタイミングでサーバー側にフラグの設定が反映されるようだ。
いったん既読にマークされてしまうと、api側からメッセージを取得できなくなる。

いや、何か方法があるのかも知れんが、今のところ見つかってない。

ので、メッセージ一覧を取得したら必ずheaderを見てから取得するメッセージを選別してbodyをfetchすること。

以上。

2010年5月11日火曜日

facebook

phpからバックグラウンド処理でfacebookに投稿する用事があったので調べたんだが。
facebook connectは使えそうで使えない。
2010年4月に公開された新しい仕組み、Facebook Graph APIを使うとできるっぽい。
oAuth認証が必須になるけど、いったん認証が済んでしまえば好き勝手できる。
ちょっと便利かも。
でもI/F側にoAuthの認証を用意しなければならないのが面倒。

はぁ・・・

メールも返って来なくなったら終わりだよな。
吹っ切るしかないか。

2010年5月6日木曜日

php => pop + gmail

なんだか厄介だ。
atomによる取得は、ラベルの区別が出来て便利だと思ったけど、取得件数が制御できなかったり、なんだかんだで、パス。
で、普通に pop経由で gmail にアクセスすることになったんだけど、pop経由でも、1回に296件のメッセージしか取得できない。
なので、LIST取得してから、bodyを読み込んで connectionをクローズした時点で、bodyを読み込んだメッセージが既読扱いになって、LISTに出てこなくなる。
なんだろうね、この仕様。厳密にはpopとは違うよね。

ま、いいや。今回の使い方ではこのほうが便利だし、メッセージはどーせローカルに保管するから問題ないし。

というわけで、以下、popでgmailから取得するphp。

mb_language("Japanese");
mb_internal_encoding("UTF-8");
ob_end_clean();

require_once("Net/POP3.php");

$GM_POP_SERVER = "ssl://pop.gmail.com";
$GM_POP_PORT = "995";

$USER = "hoge";
$PASS = "foo";

$pop = new Net_POP3();
$num = 1;

while (true) {
$pop->connect($GM_POP_SERVER, $GM_POP_PORT);
$pop->login($USER, $PASS);
$message = $pop->getListing();

if ($message) {
echo $pop->numMsg() . " messages here.\n";
echo $pop->getSize() . " size what unit?\n";

foreach ($message as $k=>$row) {
echo "$num : ".$row["msg_id"] . " (".$row["uidl"].")\n";

$header = $pop->getParsedHeaders($row["msg_id"]);
$body = $pop->getBody($row["msg_id"]);

$subject = mb_decode_mimeheader($header["Subject"]);
$body = mb_convert_encoding($body, mb_internal_encoding(), "auto");

echo "Subject: $subject";
echo "\n";
echo "Date: ".$header["Date"];
echo "\n";

++$num;
}
} else {
break;
}
$pop->disconnect();
}

echo "Retrieved $num message(s).\n";


?>

2010年4月13日火曜日

Zendのインストールでハマる

Zend Server CEをダウンロードしてきて、インストーラーを起動すると、ウインドウは開くものの、いくら待っても制御が戻ってこない。
タスクマネージャで見てみると、CPUパワーの30%以上消費してる。
処理中なのかと思って1時間程度待ってみたけど変化なし。
強制終了させて改めて考えてみる。

Google先生も適切な答えを発見できず。

ふと。
マルチコア非対応?

まずインストーラを起動して、タスクマネージャーからプロセスを選択。
関係性の設定で割り当てCPUを0のみにしてみる。

大当たり。

インストールできました。


・・・バグじゃねぇかよ。

2010年4月9日金曜日

【めも】mysqlでcsv出力

mysqldump --tab=[出力先ディレクトリ名] --fields-terminated-by=, --fields-optionally-enclosed-by=\" databasename tablename

[出力先ディレクトリ名]に
テーブル名.sql
テーブル名.txt
テーブル名.log
の3ファイルが作成される。

2010年4月7日水曜日

is_numeric

今まで何にも考えずに使っちゃってた is_numeric。
そのis_numeric()は適切ですか?

もう2年以上前のエントリなんだけど、ちょっと考えさせられた。
PHPの組み込み関数の動作を正確に知らずに思い込みで使っちゃうとエラい目にあうことがある、と。
そもそもPHPなんて動作遅いんだから、オーバーヘッドなんて考えずに文字判定は全部 preg_match でやっちゃう方がいいね。

2010年2月12日金曜日

どこまで真実なのか、確かめる術も無いけど、これが真実だと思わせるだけの下地は、いままでアノ国は作ってきたわけだ。

引用ここから.................................................................................

「民主党に期待して紛れ込む中国人問題。」

私の知り合いに経済界刊「通訳捜査官」の著者でもあり中国人犯罪者の実態を始め、国際情勢について熟知している元警視庁刑事 通訳捜査官の方が居られます。その方より日本人の殆どが知らない非常に深刻な話があったのでご紹介。
****************************************************
国籍法改悪より深刻。

テレビと新聞からの情報を得ていると気が付きませんが、世の中には報道されない大変な事実もたくさんあるのです。

特に日本では、中国に関する真実は報道してはいけない「日中記者交換協定」が存在するのはご存知のとおりで、これを破ると、その会社の中国報道支局は閉鎖され、記者が国外退去処分になってしまいます。そうなると、もう中国国内のニュースは取材不可能。

まあ中国国内の問題についてなら、数々のびっくりニュースをあきれる程度で見ていられるのですが、実は日本国内の中国人犯罪も、最近なんか報道が少なくなってきたと思いませんか?

本来ならニュースにリンクして多くの方々にお知らせしようと思っていたのですが、この問題に関するマスコミの公開を待っていても埒が明かないので、ここに書かせていただきます。

実はこれ、4年ほど前から潜在的に深刻化しているんですよ。国籍法改悪より深刻です。

  ★  ★  ★

拙著「通訳捜査官」「いつまでも中国人にだまされる日本人」にも書いていたのですが、5年ほど前までは日本に来る中国人の半数は密入国者で、残り半分は合法滞在の後ほとんど帰らずに不法滞在者でした。

そして三年前から不法入国者が激減し二年前は来日外国人が過去最高の伸びを見せ、昨年はやっと入国者がわずかに減少しました。密航者の皆さんも、かつての勢いはなくなったように見えます。

ところが実際には違うのですよ。

密航者の来日方法が大きく転換しているんです。今一番問題になっている不法入国の方法は、「なりすまし」です。

これは、中国国内のブローカーが、来日条件を満たしていながら来日することのない中国人から戸籍を買うという方法で、その人の身分証明書類を手に入れ、本来日本に来る条件を満たしていない来日希望者にその書類で出国の手続きを取らせるのです。

具体的に言うと、私の写真を貼った全く別人の真性旅券を準備することが出来るのです。

なぜそんなことが出来るかというと、その身分を証明する公証役場や、旅券を発行する公安局が、みんなグルだから。

そして本来日本に来ることの出来ない密航予備軍が、真性旅券を持って堂々と来日しているのです。

だから、中国からの旅行者が爆発的に増えて、密航がほとんどなくなってしまったのです。

彼らは身分を偽っているとはいえ、自分の顔写真入りの真性の旅券を持って入国しているので、合法滞在者です。

だから、街で警察官の職務質問に遭っても、絶対に見破られません。

ごくまれに、北京語が堪能な通訳捜査官に、旅券の出身地と言葉のなまりが一致していなかったりして見破られることがありますが、そういうのは余罪の関係で通訳捜査官が逮捕現場に臨場しているときか取調べの途中くらいであり、街のおまわりさんが職務質問して見破ることは絶対に出来ないのです。

もし奇跡的にも見破ることが出来たとしても、日本では本人のいいかげんな供述より身分証明となる旅券の方が信憑性が高いので、本人が認めない限り「なりすまし」であることは訴追できません。

また本人が完全に認めたとしても、それを証明する資料が旅券以外に存在しないと立件できませんから、これもまた難しい。

つまり、この「なりすまし」を犯罪として裁く為には、嘘八百(というか嘘3000)の中国人被疑者の自供を取って、さらにその実家の父母を、ごく少数しかいない北京語の堪能な刑事が国際電話で落として事実を認めさせ、戸籍謄本など本当の資料を送ってもらうしかないんです。

中国人なんて、取調室で証拠が挙がっていても9割は否認するんですよ。

あらかじめ打ち合わせできている実家の協力者でもある父母を、税金を使って国際電話で落とすなんて、もう神業です。

しかも送ってもらった資料が本物である確証もない。

はっきり言って、ここまでいい加減な国だと、理詰めで解決しなければいけない警察としては、もうどうしようもないのです。

いま、この「成りすまし」が、日本各地に爆発的に増えています。

もう、密航なんて必要ないんです。

来日中国人の半数近くを占めていた密航者は、今この方法にシフトして、さらに改悪国籍法などにより日本国籍を取得、その後は親戚を本国から日本に呼び込んで、日本各地にそのコミュニティを築くことが目に見えています。

いや、もうそうなっています。

池袋はもうのっとられているようです。

これをマネされると手の打ちようがないだけに大変だと思ったので、去年の拙著には同様の手口の「残留孤児なりすまし」について詳しく書いたものの、一般的「なりすまし」については押さえ気味にしておりましたが、もう明らかにすべき時期ではないか、と思い公表する事に致しました。

この現状を知る警察、特に第一線の勤務員には、職務上言論の自由はありません。

ましてやこの問題の重大さを知るのは、北京語のできる警察官という限られた状況です。

問題をしっかりと理解できる方に、この事実をお知らせした次第。

日本は、外国人票を導入しても政権をとりたい民主党が台頭しはじめ、マスコミはこうした事実を報道せず、中国人犯罪は潜伏化、合法化するばかり。

事の重大性をご理解の方は、コピー自由ですので、中国人問題に真剣な方にお伝えください。

................................................................................. 引用ここまで
<以上、CASSHERNさんより転載>

2010年1月20日水曜日

@font-faceを使う

@font-face generator

ここで、好きなフォントをWEBで使える形式に変換できる。
で、利用するためのサンプル的なHTMLとCSSも出してくれるんだが、これがうまく表示されない。
色々やってみた限りでは、css側で @font-face 指定したあと、
・・・
として、fontタグを使うとどのブラウザでも割とうまく反映されるようだ。

全てをスタイルシートで行えるなんて考えてはいけない。