2013年2月19日火曜日

PHPでswiffyを自由にhtmlに組み込む方法について

精神と時の部屋でコードが進んで時間が出来たので表題のメモを残しておきます。
ついでに精神と時の部屋とは



のことです。
あとは電車の中とかもすごく進みますね!!
で今日はFlashが使えない端末を救う?GoogleのSwiffyについて。
FlashをSVGに変換、再生出来るようになります。
Swiffyの詳しい内容はこちらのサイトに纏まってます。

Google Swiffy 覚書

つまり

swiffyobject = {...略};

の{...略}の部分のJSONを差し替えて行けば自由にコンテンツを再生できます。
ただ元データが吐き出しが丸々のhtmlですので加工が大変です。
これを以下のPHPのバッチで加工することも出来ます ※2013/02/19現在

//Swiffyの生ファイルたちを置いた場所

$path = "old_swiffy/";
//SwiffyのJSONを抽出したfileの生成場所
$new_path = "new_swiffy/";

if ($dir = opendir("$path")) {
    while (($file_name = readdir($dir)) !== false) {
        if ($file_name != "." && $file_name != "..") {
            make_json($file_name);
        }
    }
    closedir($dir);
}

function make_json($file_name){
    //コマンドラインで実行することを前提
    //functionのスコープの外からglobalを使って参照
    global $path;
    global $new_path;

    $file = "$path/$file_name";
    //Linuxのコマンドを使って整形
    $data = `head -n 10 $file | tail -n 1`;
    //保存
    file_put_contents($new_path . $file_name, $data);
    
    return;
}

でもこれだとruntime.jsのバージョンが変わったりするとFlashの再変換が必要だったり、コンテンツを追加する度に手間です。
なのでサイト表示の際に自動的に抽出&runtime.jsのバージョン確認を出来るようにしました。
ここではhtmlをObjectで扱えるライブラリを使います。

simple_html_dom

英語ドキュメントが嫌な方はこちら

PHPでjQueryチックにWebサイトをクローリングする方法

こちらを使って書いたPHPのコードがこちら。

//$html_file_pathはURLでもfileのpathでも良い
function get_swiffy_data($html_file_path) {
    //ライブラリの読み込み
    require_once 'simple_html_dom.php';

    //最新バージョンの情報を保存する場所
    $swiffy_version_path = 'hoge/swiffy_version.txt';
    $swiffy_version = file_get_contents($swiffy_version_path);

    //simple_html_dom.phpの関数
    $html_Objects = file_get_html($html_file_path);
    //読み込まれるJavaScriptの抽出
    $element = $html_doc->find('script', 0);


    $parse_url = parse_url($element->src);
    if ($swiffy_version != $parse_url['path']) {
        $path_parts = pathinfo($parse_url['path']);
        // 保存先フォルダの作成する。
        $file_path = $path_parts['dirname'];
        if (!file_exists($file_path)) {
            mkdir($file_path, 0775, true);
        }
        file_put_contents($swiffy_version_path, $parse_url['path']);
        file_put_contents($parse_url['path'], file_get_contents($element->src));
    }
    //読み込まれるJavaScriptの抽出
    $result['js_path'] =  $parse_url['path']);
    //Jsonを抽出
    $element = $html_doc->find('script', 1);
    $result['swiffy_json'] = $element->innertext;

    return $result;
}


仕組みとして最新のjs情報と比較して無かったらGoogleから取得しています。
ここでは例としてjsの最新情報をtextに保存してます。
parse_url()pathinfo()はPHPの標準関数です。
名前の通り、それぞれURLとfileのpathを細かくparseしてくれます。
とても便利なのですがよく同じ用途でexplode()を使っているのを見かけます。
なんかの参考になればと思います。

個人的には標準関数を使ったPHPっぽい感じのコードかなと思いますw

2013年2月13日水曜日

今からFuelPHPを使う人が知るべき5つのこと+1

FuelPHPいいよFuelPHP。
正直、新規の方にオススメするphpのフレームワークはコレで一択です。
と溺愛してますが職場はZendフレームワーク...
で久々にFuel触ってハマッたのでメモを残しときます。
つまりこんなタイトルですが自分用です(キリッ

#### 2014/09/24にリメイク版作りました ####

OSC2014@広島に行ってきました #osc14hi

#### ここまで ####

1 FuelPHPの使い方

こちらのスライドが参考になります。
というかほぼ網羅してて完璧です。



こちらも綺麗にまとまっていてすごくわかりやすいです。

10分でわかるFuelPHP


ただサーバの設定によっては動かない場合も。
理由はデフォルトのtimezoneの設定がされてないこと。
なので

/etc/php.ini 



date.timezone = "Asia/Tokyo"

を追記するか

fuel/app/config/config.php

のArrayに

'default_timezone'   => 'Asia/Tokyo'

を追記するかのどちらかで対応出来ます。
また詳しくはこちらに書いてあります。

2 JQueryMobileの使い方(localから指定する場合)
まずjQueryMobileサイトからソースを落としてきます。
それとJqueryも必要ですから落として来ます。

ソースを解凍してここにおきます。

public/assets/js
public/assets/css

読み込みはviewにこんな感じ

echo Asset::css('jquery.mobile-1.2.0.min.css');
echo Asset::js('jquery-1.8.3.min.js');
echo Asset::js('jquery.mobile-1.2.0.min.js');

URLを気にせず指定のファイルを直感的に呼べるのはいいですね。
でポイントですがJqueryMobileの1.2.0はJqueryの

1.9系では動かないので1.8系 ※2013/02/13現在

を使いましょう。

3 TwitterAPIとの連携
Fuelのイケてるところと言えばパッケージ。
その導入はシンプルです。
GitHubからサクッとインストール出来るため、皆さんにもどんどん活用して欲しいですね。
と言うわけでここではTwitterAPIとの連携方法について。
まずはfuel-twitterをインストール。
インストールから使い方まではこちらのブログにまとめてあります。
インストール出来ました?
APIを叩いてみましょう。
値が帰ってきてアプリ連携出来ましたね!
次はユーザー情報取ってきましょう。
どうでした?
エラー出たでしょ。

Twitter::get('account/verify_credentials');

そう、コレ動かねーから。

TwitterAPIのバージョンアップに対応してないんですよ本家。
なのでGitHubのNetworkからブランチ追って新しいヤツのDiff見て動く奴探して来ました。
2013/02/13時点では動くソースを上げておきます。

forkして改修したソース

これを入れて試して見ましょう。
ほら、動きましたね!!
Libraryを導入すると実装が簡単に出来る反面、APIなどの仕様変更で動かなくなるモノも多いので注意しましょう。
でもメジャーなモノならGitHubのブランチを追ったりすると大体直ってます。

 4 HTMLヘルパーについて
ここの記事がすごく参考になります。

FuelPHP の Fieldset を使おう(Form の自動生成)Add Star

ほんとSmartyとか必要ない。
最初コレ知らなくてviewModelにゴリゴリプログラム書いてました。
8割くらいこれで要らなくなりました(遠い目

5 FuelはPostgreSQLに優しくない
具体的にはクエリビルダがPostgreSQLのArray型に対応してないです。
というか多くのORMたちは対応してないのですが...
特にハマるのはInsert。
なので簡単な例を載せておきます。

//idをarray型とする
$SQL = 'INSERT INTO t_hoge(id) VALUES (:id)';
//{}で囲ったカンマ区切りの任意の文字列を作る
$id = '{1,2,3}';
$query = DB::query($SQL)->bind('id', $id)->execute();

これは最終的なSQLとしては

INSERT INTO t_hoge(id) VALUES ('{1,2,3}')
となっています。
実施のプログラムは$idの生成を動的に配列から変換してやってます。
自分的にもなんだかなぁって感じです。
もっとスマートなやり方のマサカリ、お待ちしております!!
ついでにクエリビルダの使い方はこちらがすごくまとまってます。


ということで現在、仕事じゃないWEBアプリを作ってます。
公開までもう少し掛かりそうですがまた公開した時に宣伝も兼ねて苦労話したいと思いますw

更に+1 2013/03/27に追記

第4回 岡山PHP勉強会


こちらの登壇資料を追加しておきます。





仕事でFuelPHPを使い始めたので気づいたことを纏めました。

FuelPHPを仕事で使うときに知っておくべき4つのこと