OGP(Open Graph Protocol)設定してみた

ということで付けてみましたOGP。

今までこんな感じでイイネ!だったのが、


こうなりました。


groupon-now.jpがグルーポンなうになっただけだけどね。。
最近各クーポンサイトがOGP導入し始めてて、クロールする側としては便利でうれしい。


設定したときにちょっとハマったのでメモ。
og:typeをwebsiteにするのはトップページだけぽい。
なので個別の商品ページはarticleで設定したらうまくいった。

Open Graph protocol - Facebook開発者によると

Use article for any URL that represents transient content - such as a news article, blog post, photo, video, etc. Do not use website for this purpose. website and blog are designed to represent an entire site, an og:type tag with types website or blog should usually only appear on the root of a domain.


てことなので、グルーポンなうでいうと
トップページにはog:typeをwebsiteで
クーポン詳細にはog:typeをarticleで設定ですね。

PHPでスクレイピング xpathとscrape_func.php

ここ最近というか結構前からhtmlスクレイピングすることが多いのでメモ。
最初はいろいろ試してたんだけど、今使ってるのは2パターン。
ベンチマークとって最速だったからとかじゃなく、単に慣れかも。

scrape_func.php

このオライリーの本のサンプルコードに含まれているファイル。
http://www.oreilly.co.jp/books/4873111870/download.html
始点と終点書いて直感的に取ってこれる。
$_rawData = getURL($url);
$_rawData = mb_convert_encoding($_rawData, "UTF-8", "auto");
$_rawData = cleanString( $_rawData );

$headline = getBlock("<div id=\"headline\">","</div>",$_rawData,false);

$title = getElement("h1", $_rawData);

XPATH

xpath使うのが一般的だとは思うけど、ちっちゃい処理だと上に挙げたライブラリの方が早いんだよね。
でも言語に限らず使えるから便利。
このブログのタイトル取る例。
$res = file_get_contents($url);
$dom = @DOMDocument::loadHTML($res);
$xml = simplexml_import_dom($dom);

//最新記事のタイトル
$title = $xml->xpath("//div[@class='hentry']/h2/a/text()");
echo (string) current($title);

//3番目の記事のタイトル
$title = $xml->xpath("//div[@class='hentry'][3]/h2/a/text()");
echo (string) current($title);
//3番目の記事のリンク
$link = $xml->xpath("//div[@class='hentry'][3]/h2/a/@href")

スクレイピングって地道な作業だよね。
各サイトごとにほぼ手動対応。。

【CakePHP】住所から緯度経度取得 byGoogleMapsAPI

何気にGoogleMapsAPI使うの初めてだったりする。
今回「グルーポンなう」作るときに使いました。
単純にAPI叩いてるだけなのでメモ程度に。

前回の記事 【CakePHP】位置情報の取得と、2点間の距離計算のコンポーネントに追加すると便利かも。

というわけで、

App/controllers/components/geo.php

class GeoComponent extends Object {
  public function addr2geo($addr=""){
    $url = sprintf("http://maps.google.co.jp/maps/geo?q=%s&output=json&key=%s",
                   urlencode($addr),
                   'GoogleMapsAPIKEY');
    $res = file_get_contents($url);
    $data = json_decode($res);
    $geo = $data->Placemark[0]->Point->coordinates;
    return array('lng' => $geo[0], 'lat' => $geo[1]);
  }
}
あ、データ取得できなかった時とかの処理は別途書いてね。。

App/controllers/foo_controller.php

class FooController extends Controller {
  var $name = 'Foo';
  var $components = array('Geo');

  function index () {
    $addr = '東京都新宿区新宿三丁目38-1';
    $geo = $this->Geo->addr2geo($addr);
    echo $geo['lat']; //緯度
    echo $geo['lng']; //経度
  }
}


位置情報をサービスに使うとおもしろいね。
今後もいろいろ作っていければいいなー。

【CakePHP】モバイルのかんたんログインを作る

20100630211430 よくありそうなこんなかんじのログイン画面。
かんたんログインボタンと、ID/PASS入力するフォーム。

かんたんログインはいろいろありますけど、とりあえず今回は触れません。
キャリアのゲートウェイのIP制限はしましょうってかんじ。


標準のAuthコンポーネントと、ktaiライブラリを使ってます。

UIDが設定してあれば「かんたんログイン」できて、してなければID/PASS入力してUID設定することもできるという機能。
今回はトップページで行う設定です。
Cakeのバージョンは1.3

APP/controllers/top_controller.php

class TopController extends AppController
{
  var $name = 'Top';
  var $uses = 'User';
  var $helpers = array('Ktai','Session','Form');
  var $components = array('Ktai','Session','Auth');

  function beforeFilter() {
    $this->Auth->loginAction = '/';
    $this->Auth->autoRedirect = false;
    $this->Auth->authorize = 'controller';
    $this->Auth->allow('index');
    parent::beforeFilter();
  }

  function beforeRender() {
    parent::beforeRender();
  }

  function index () {
    if ($user = $this->Auth->user()) {
      if (isset($this->data['add_uid'])) {
        $user['User']['uid'] = $this->Ktai->get_uid();
        $this->User->save($user['User']);
/* 7/14追記 */
        $user = $this->User->findById($set['id']);
        $this->Auth->login($user);
/* 7/14追記ここまで */
      }
      $this->redirect($this->Auth->redirect());
    } else {
      if (isset($this->data['auto_login'])) {
        if ($user = $this->User->findByUid($this->Ktai->get_uid())) {
          if ($this->Auth->login($user['User'])) {
            $this->redirect($this->Auth->redirect());
          } else {
            $this->Session->setFlash('再度かんたんログイン設定をしてください',null);
          }
        } else {
          $this->Session->setFlash('かんたんログイン設定がされていません',null);
        }
      }
    }
  }

  function isAuthorized () {
    $user = $this->Auth->user();
    $user['User']['last_login'] = date('Y-m-d H:i:s');
    $this->User->save($user['User']);

    return true;
  }
}

やっていることは以下の3点。
・ID/PASSでログイン成功して、「かんたんログイン設定する」にチェックがされていれば、UIDをとってテーブルに突っ込む。
・かんたんログインの場合はUIDをキーにusersテーブルからデータを取ってきてAuth->loginに突っ込んでログインさせる。
・isAuthorized()でログインが成功したらログイン日時を更新。

usersテーブル

+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(10)      | NO   | PRI | NULL    | auto_increment |
| username    | varchar(100) | NO   |     | NULL    |                |
| password    | varchar(100) | NO   |     | NULL    |                |
| uid         | varchar(100) | NO   |     | NULL    |                |
| flag        | int(1)       | NO   |     | NULL    |                |
| last_login  | datetime     | NO   |     | NULL    |                |
| created     | datetime     | NO   |     | NULL    |                |
| updated     | datetime     | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+


あ、クッキーが使えない携帯がまだまだたくさんあるため(主にdocomo)、そのための設定も忘れないようにメモ。

APP/config/bootstrap.php

if (!isset($_SESSION)) {
  if ($ini_set) {
    ini_set('session.use_trans_sid', 1);
    ini_set('session.serialize_handler', 'php');
    ini_set('session.use_cookies', 0);
  }
}


2010/07/14追記
ログインの際にUIDをテーブルに追加した場合、
$this->Auth->user()で取れるユーザデータはセッションなので再度ログインしないといけないみたい。

【CakePHP】tinyintにハマる

テーブルのカラムのタイプをtinyint(1)にして、saveしようとしたんだけど値がおかしい。

  $set = array('type' => 2);
  $this->Data->create();
  $this->Data->save($set);

typeに2を入れようとしてるんだけど、データベース見てみると1になってる!!
ぐぐったらいっぱいでてきたので、みんなやっぱりハマるんだね。。
ちなみにCakePHP1.3です。

Cakephpはtinyintをbooleanにするらしい。。。なんてこった。

CORE/libs/model/datasources/dbo/dbo_mysql.php line474
    if (($col == 'tinyint' && $limit == 1) || $col == 'boolean') {
      return 'boolean';
    }

これは実際体験してみないと気づかないね。。
無駄に時間とられた。

【CakePHP】位置情報の取得と、2点間の距離計算

位置情報取得

位置情報を扱うライブラリはこちらを使いました。
docomoのiエリアデータを利用して土地名も返してくれます。
http://labs.unoh.net/2008/08/phpgeomobilejp_converter.html
これをvendors/Geomobilejp/につっこむ。

2点間の緯度経度から直線距離を求める

こちらを参考。
http://www.pahoo.org/e-soul/webtech/php02/php02-21-01.shtm
上記のライブラリのデータをそのまま突っ込めるように、ちょっとだけ修正。
計算部分はそのままです。


で、これらをCakePHPのコンポーネントで使いたかったのでまとめました。

続きを読む »

CakePHPで本番/開発のconfigファイルを切り分ける

サイト全体で使いたい定数、たとえばサイトURLとかを
環境によって切り替えたいなと。

本番、開発どちらでも使うものは
APP/config/common.php

環境に依存するものは
dev.php、production.php
みたいなかんじに。

環境を設定するのは
apacheのconfのvirtualHost書いてるようなところ。
CAKE_CONFIG的な名前で・・・。

SetEnv CAKE_CONFIG dev

APP/controller/app_controller.php

ここでconfigを設定した。
で、beforeRendeerでconfigにセットして
viewでは$configで使えるように。

  function beforeFilter() {
    Configure::load('common');
    if (isset($_SERVER['CAKE_CONFIG'])) {
      Configure::load($_SERVER['CAKE_CONFIG']);
      $this->config = array_merge(Configure::read("common"), Configure::read($_SERVER['CAKE_CONFIG'\
]));
    } else {
      $this->config = Configure::read("common");
    }
  }
  function beforeRender() {
    $this->set("config", $this->config);
  }

セブ8日目〜13日目

最後の週は授業が全部1:1ってこともあってちゃんと授業うけた。
webってどう作るのって聞かれたので、
ちょー簡潔に教えてみた。
基本的にホワイトボードとかないので、ガラスに水性マジックで授業は行われてます。
セブ最終週



あ、木曜日だけ午後の授業サボって学校の裏の海に行ったんだ。。
日本人4人で。
教室はガラス張りなので、海に行く途中にみんなに見られてた。
クレイジージャパニーズだと思われたに違いない。
先生に休みますっていいに行ったときに、
「え、そこの海に!?」
的な感じでおどろいてた。汚いよと。

たしかに海辺にはスラムっぽい家が並んでて、そこから海にいくわけなので、きれいとはいえない。
でもね、東京の海に比べたらぜんぜん透きとおってる。
つーわけで1kmくらいは沖にでたんだけど、まだまだ足がつく深さ。
学校に帰ってきて校内のプールに飛び込んだりしてこの日の午後は終わったんだ・・・。

あとセブ市内のSMっていう巨大ショッピングモールに買い物しにいったり。
セブ最終週


土曜日はジプニーでお土産買いにも行った。
なにげに一人でジプニーに乗ったのこの日が初めて。
軽トラに屋根付いたみたいな乗り物。
道路には普通の車よりジプニーがたくさん走ってる。
そして安い!!
7ペソなので15円くらい。
中はこんなかんじ。
セブ最終週
混んできたら結構ぎゅうぎゅうで乗る。
タクシーと同じように道端で止めて乗って、
降りるときは降りたい場所で降りれる。
なのでこの辺の人はすぐジプニーに乗るので、ぜんぜん歩かないらしい。

あ、金曜日にはプチ卒業式もやって、
みんなで近くの韓国料理屋に行ってご飯。
韓国人の生徒たちが手際よく肉焼いてくれた。


あっというまの2週間でした。
まー英語力はたいして変わってないと思いますがw
気持ちの問題っすね。

セブ6,7日目(ボホール島1泊2日の旅)

この週末はボホール島へおでかけ。
総勢20名弱。

ボホール島


写真多いので続きで。

続きを読む »

セブ5日目

この日は授業が終わって夕ご飯食べた後、
地元のLOFTっていうクラブでパーティ。
うちの生徒約20人くらいで。

22時にオープンするらしく、それまで飲み。
立て続けにテキーラ3杯イッキして、
なんかまだ続きそうだったら、明日が早い僕は何気なく離脱。

セブ5日目


最初は僕らも含め外国人が多かったような気がするけど、
徐々に地元民たちも増えてきた。

ぼくら生徒の内訳は、日本、韓国、中国、ロシア、ベトナム。
けっこうみんな飲んでたから楽しかったなー。

でも僕含めて、明日旅行に行くメンバーもいたから
そのメンバーはAM1:00くらいに帰宅。

あ、来週からの授業は追加料金払って全部1:1にしてもらいました。
livedoor プロフィール
最近購入した本
  • ライブドアブログ

トップに戻る