Re:

感銘高き名言は「1%のひらめきがなければ99%の努力は無駄である」(トーマス・エジソン)

タグ:php

PHP_INI_ALLなので、どこでも設定可。

.htaccess
php_value session.save_path /var/tmp/pocketwarz.com
php_value session.cookie_lifetime 86400
php_value session.gc_maxlifetime 86400
php_value session.gc_probability 1
php_value session.gc_divisor 100

ケータイが主だったから、あまりセッションの細かいことは気にせず作ってきた。

デフォルトだと /tmp 配下に sess_ で始まるセッションファイルが生成されるのは環境共存においては不便だよねってことで、save_path をサービス毎に設定。

ついでにライフタイムを長めに。

save_path を設定しない限り、デフォルトの設定共有において他サービスで実行されるガベージコレクタによって、.htaccess の lifetime に関わらず消失してしまう(←概略)。

probability, divisor に関しては実行確率程度なので設定不要かと思うけど、一応。

vlcsnap-00002

松村未央アナ参戦。


ここ、すごいです。毎日欠かしてないw

http://caplogger.blog83.fc2.com/


月刊アーカイブを見ると、今年からギューンなってる。


さて本題。

PHP-Barcode
http://www.ashberg.de/php-barcode/download/


コマンドライン版をインストールした上で動作するライブラリ。

最終的に、configureでttf関連が足りないとか…またPHP再コンパイルするハメになって、なう!

何気にコンパイル時間かかるんだよね。


バーコードをケータイのカメラで撮影し送信。

添付ファイル画像からEANコードの認識はいい感じです。


EANコードから早くバーコードが生成できるようにしたい。続きを読む

ケータイサイトを作る上で認証として欠かせないのが端末ID(UID)です。

フレームワークにCodeIgniterを利用するしない問わず、静的URLでサイトを構築しているとdocomoのUID送出に必要なパラメータで悩まされます。

動的URLにするしかありません(きっと)。

おまけに、Cookieに対応していない端末だとセッションも毎回変わってしまいお手上げです。なので、

session.use_trans_sid = 1
session.use_cookie = 0

とphp.iniまたはini_set()し、相対パスにsessionが付くように変更したりしなかったりです。


viewやcontrollerなどに動的URLを記述するのも気持ち悪いので、Config.phpコアを継承する形をとり、libraries/MY_Config.phpを作ってsite_url()メソッドをオーバーライドし、第2引数にフラグを渡して出力を切り替える拡張を行います(個人的な対応案です)。

もちろん、configでenable_query_string = TRUEとなっていれば動的に出力し、FALSEなら何も行わない。


PHPのフレームワークには、CodeIgniterがシンプルでいいと思うんですけどねー。

ActiveRecodeも使いやすいですし、必要十分って気がします!

自分的に、Twitterというものがしっくりきてない状態でなんとなく使ってたりする日々です。

というか、ブログエントリーがただつぶやかれてる。

iPhoneにクライアント入れてたりしても、日に一度も立ち上がらないくらいです。


でも一応、タイトルにあるようなことはプログラムできた方が、時代とともに生きられる価値になると思うので、少し頭に入れておきます。


とりあえずはドキュメント


Twitterのデータを利用するシーンの方が多いと思いますし、基本的には

  1. GETリクエスト
  2. XMLなどのデータを受信

だけなので、1と2をサッと実装して、あとは煮るなり焼くなりすればいいです。


あまり難しいことを考えずとも、get_file_contents()を利用してデータが受信できます。

第一引数に取得対象のURL(APIドキュメント参照)、第三引数にstream_context_create()で作成したコンテキストを指定すれば返り値でデータが取得できます。

$xml = file_get_contents($url,false,$context);


XMLで受信(URLのフォーマットが.xml)したデータであれば、simplexml_load_string()にてオブジェクトデータにしたり、あとはPHPで好きなように処理。

$obj = simplexml_load_string($xml);

ひとつだけ。

Twitter APIは、(ほとんどのリクエストに)認証を必要としOAuth、Basic Authの2種類に対応しています。

なので、stream_context_create()に渡すオプション変数でBasic  Authすなわちベーシック認証(Basic認証)を渡すのがポイントとなっています。

セキュアに逝きたい場合はOAuthでしょうが・・・簡潔に実装するのが今の目的なので割愛(いや、知らないだけ)。そして、file_get_contents()とか使ってる時点でセキュアじゃないのかもしれない。

php.net
stream_context_create

ということで、連想配列からなる連想配列でなければならないオプションは、HTTPリクエストでGETメソッドとベーシック認証のふたつ。

$options = array(
  'http' => array(
    'method' => 'GET',
    'header' => 'Authorization: Basic '. base64_encode($username.':'.$password)
  )
);


base64_encode()でユーザ名とパスワードの符号化を。

$context = stream_context_create($options);

取得対象URLをhttp://twitter.com/account/rate_limit_status.xmlとしてデータを受信してみると、APIの利用ステータスを確認できます。

reset-time:カウントがリセットされる日時
reset-time-in-seconds:reset-timeのタイムスタンプ値
remaining-hits:残り取得回数
hourly-limit:1時間あたりの制限回数

たとえば、echo $obj->hourly-limit; // 150

制限回数は現時点で150が上限ですが、30秒に一回はリクエストできる計算なので十二分だと思います。


そんな感じ。


なお、allow_url_fopen、allow_url_include設定によりfile_get_contents()が使えない場合は、ソケットとか使ったり別な方法を試す必要があります。

バージョンが5とかだとPHP_INI_SYSTEMなので、ini_set()や.htaccessでは変更できません。

http://php.net/manual/ja/filesystem.configuration.php

GET/POSTされてきたデータから
絵文字を抽出&置換するサンプルプログラム(PHP)

SoftBankのSJISコード領域が他社と重なる部分があるので、マッピングリストの都合上、&#ではなく&!として置換しています。
しかも、J-PHONEを切り捨ててます。

もちろん固定記述なので、例外の場合とかもろもろの処理修正は必要です。

// キャリア配列
$gl_career =
array
(
 "docomo" => "docomo",
 "kddi" => "au",
 "softbank" => "softbank",
 "vodafone" => "softbank"
) ;

// UserAgent からキャリア取得
function getCareer( $agent = "" )
{
  if( !$agent )
    $agent = $_SERVER["HTTP_USER_AGENT"] ;

  $pattern = "docomo|kddi|softbank|vodafone" ;
  $pattern = sprintf( "/%s/i", $pattern ) ;

  preg_match( $pattern, $agent, $match ) ;

  return $gl_career[ strtolower( $match[0] ) ] ;
}

// 絵文字のエンコード
function emojiEnc( $str )
{
  mb_substitute_character( "long" ) ;
  // 文字コード変換 BAD+F89F
  $str = mb_convert_encoding( $str, "SJIS", "SJIS" ) ;

  return preg_replace_callback( "/BAD\+([0-9A-F]{4})/", "emojiEncInput", $str ) ;
}

// emojiEnc() 内から呼び出されるコールバック関数
// DoCoMo, au の場合 &# 形式
// SoftBank の場合 &! 形式
function emojiEncInput( $match )
{
  global $career ;

  $head = "&#" ;
  if( $career == "softbank" )
    $head = "&!" ;

  return sprintf( "%s%s;", $head, hexdec( $match[1] ) ) ;
}

//======================================================================
// 本体
//======================================================================

$str = "おはよう\xF8\x9F" ;

$career = getCareer() ;
$result = emojiEnc( $str ) ;

var_dump( $result ) ;

↑このページのトップヘ