目指せ1級!30代サラリーマンボルダリング日記

都内IT企業で働く30代サラリーマンのクライミング記録

zoomeの動画をタグで検索

最近のゲーム動画はやっぱりzoomeですよね。
画面サイズ大きいし、容量も大きいし、ビットレートも高い。
ニコ動からもだいぶ流れてきてるように思います。
というわけで、zoomeのタグ検索をPHPで。

require_once 'XML/RPC.php';

$arr = array('tagname' => 'ゲーム',
             'offset' => 0,
             'length' => 10
             );
$params  = new XML_RPC_Value(array(
                                   'tagname' => new XML_RPC_Value($arr['tagname'], 'string'),
                                   'offset' => new XML_RPC_Value($arr['offset'], 'i4'),
                                   'length' => new XML_RPC_Value($arr['length'], 'i4'),
                                   ), "struct");

$msg = new XML_RPC_Message('zoome.tagSearch', array($params));
$cli = new XML_RPC_Client('/xmlrpc', 'up.zoome.jp', 80);
$res = $cli->send($msg);

if (!$res->faultCode()) {
  $data = XML_RPC_decode($res->value());
  /* "Total:". $data['count']; */
  foreach($data['list'] as $key => $val) {
    $zoome = array(
                   'zoomeid' => $val['zoomeid'],
                   'diaryid' => $val['diaryid'],
                   'title' => $val['title'],
                   'url' => $val['diaryurl'],
                   'body' => $val['body'],
                   );
  }
} else {
  exit('CODE:'.$res->faultCode(). ':'. $res->faultString());
}


欲をいえばソートがほしいですね。
デフォルトで新着順だと思うんですけど、再生数のソートくらいはほしいかなー。
他にも投稿とかのメソッドがあるので公式ドキュメントを参照してみてください。

参考:zoome API(XML-RPC)ドキュメント
    このエントリーをはてなブックマークに追加

OpenIDでログインして、ニックネームを登録してもらうような画面でのバリデートメモ。

usersテーブルのnicknameカラムにバリデートをかけたい。


チェック項目は3つ。

  • ユニークなニックネームか
  • 文字数制限内か
  • 空白のみではないか

空白のみの入力をfunction notSpaceでチェック。

APP/model/user.php

<?php
class User extends AppModel {
    var $name = 'User';
    var $validate = array(
        'nickname' => array(
                            'notSpace' => array(
                                                'rule' => array('notSpace'),
                                                'message' => '空白のみは登録できません。'
                                                ),
                            'between' => array(
                                               'rule' => array('between', 1, 45),
                                               'message' => '1文字以上入力してください。(全角15文字まで)'
                                               ),
                            'isUnique' => array(
                                                'rule' => 'isUnique',
                                                'message' => 'すでに登録されています。'
                                                ),
                            ),
        );
    function notSpace($field=array()) {
      foreach($field as $name => $value){
        if (preg_match("/^( | )+$/", $value)) {
          return false;
        } else {
          return true;
        }
      }
    }
}
?>
    このエントリーをはてなブックマークに追加

前回(アメブロのAtomAPIが倒せない)の記事から数カ月。。
アクセス解析見てもやっぱり同じように困ってる人がいるみたい。

というわけで、久しぶりに調べ直した。
前回のソースと違う部分をピックアップ。
やっぱりWSSE認証がポイントでした。これさえ通ればあとはすんなり。


$nonce = sha1(md5(time()));


ランダム文字生成だから何でもいいとは思うけど。


$pass_digest = base64_encode(pack('H*', sha1($nonce.$created.strtolower(md5($password)))));


ここが全然逆だった。
大文字にするんじゃなくて小文字にする。


あとはgetで記事情報を取得し、その結果からpostするURLをとって記事を投げるみたい。

今回使用したソース。
続きを読む
    このエントリーをはてなブックマークに追加

とりあえずテストでモバイルサイトで作ってみようと、
既存のぼくが管理してるサイト(ネトゲ)のモバイル版作ってみた。

とくにモバイル用に機能追加などはしておらず、
デイリーだったランキングを数時間単位にして表示したくらい。
あとPC版はZendFrameworkで作ってるけど、モバイル版はCakePHPってところが主な違い。

2010年1月18日にPCサイトでモバイル版の告知。
約1週間の計測。

■モバイル版


moPV

moUU



■同期間のPC版。


pcPV

pcUU



■考察


UUをみると、このままでもPC版の1/10くらいのユーザは来そうな感じ。
まーでも、このサイトの9割近くのユーザがネトゲヲタなのでPCの方が使い勝手とか親和性が高いってことか。
ゲームの裏画面でチェックすることが多そうだし。
残りの1割のリア充(笑)が移動中とかに見てるって考えると、この結果は非常に納得。

あ、よく見るとモバイル版のPVが1/23、1/24とそこだけ凹んでる。
この2日間は土日・・・。

要するに外には出ずに、家でずっとネトゲっていうパターンね。


なんかここまで考察に確信が持てるってなかなかないよね。。
    このエントリーをはてなブックマークに追加

前回に引き続き、次はGoogleAnalyticsの導入。
直接書いてもいいんだけど、とりあえずヘルパーに突っ込んた。
vendorにそのままいれるほうがいいのかな。

■APP/views/helpers/ga.php

公式のサンプルソースをヘルパー用に書き換え。

<?php
class GaHelper extends Helper {
  private $GA_ACCOUNT="MO-XXXXXX-X";
  private $GA_PIXEL="/ga.php";

  function getUrl() {
    $url = "";
    $url .= $this->GA_PIXEL . "?";
    $url .= "utmac=" . $this->GA_ACCOUNT;
    $url .= "&utmn=" . rand(0, 0x7fffffff);
    $referer = isset($_SERVER["HTTP_REFERER"]) ? $_SERVER["HTTP_REFERER"] : '';
    $query = $_SERVER["QUERY_STRING"];
    $path = $_SERVER["REQUEST_URI"];
    if (empty($referer)) {
      $referer = "-";
    }

    $url .= "&utmr=" . urlencode($referer);
    if (!empty($path)) {
      $url .= "&utmp=" . urlencode($path);
    }
    $url .= "&guid=ON";
    return str_replace("&", "&", $url);
  }
}
?>

■APP/controllers/app_controller.php

すべてのページで出すから、app_controllerで宣言。

<?php
class AppController extends Controller {
  var $helpers = array('ga');

■APP/views/layouts/main.ctp

メインのレイアウトのbodyタグ上に書く。

<html>
<head></head>
<body>
   ・
   ・
<?php $googleAnalyticsImageUrl = $ga->getUrl(); ?>
<img src="<?php echo $googleAnalyticsImageUrl; ?>" />
</body>
</html>

■APP/webroot/ga.php

あとはGAの管理画面からDLできるga.phpをwebrootに置いて準備完了。
ちゃんと動いてるみたい。

    このエントリーをはてなブックマークに追加

■xml宣言

<?xml version="1.0" encoding="Shift_JIS"?>

これだけで書くとエラーになる。
たぶんみんな最初にこれでつまづくんだろね。
ぐぐったらすぐでてきた。

解決方法はいくつかあって、
・echoでだす。
・apache
とか。

今回はechoで出します。
<?php echo'<?xml version="1.0" encoding="Shift_JIS"?>'."\n"; ?>

■DOCTYPEの指定

<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">

・3キャリア別にDOCTYPE分ける場合のメモ
http://ma-san.org/2009/10/htmlphpdoctype.html

■Content-Typeヘッダの指定

<meta http-equiv="Content-Type" content="application/xhtml+xml ; charset=Shift_JIS" />

今回はapacheでの設定ではなくレン鯖とか汎用的にいけるようにソースに。
app_controller.phpのbeforerenderで出力。
*)継承先のbeforerender()でparent:beforerender()を忘れずに。

APP/controller/app_controller.php

<?php
class AppController extends Controller {
  function beforerender() {
    header('Content-Type: application/xhtml+xml');
  }
}

■エミュレータ

docomo
http://www.nttdocomo.co.jp/service/imode/make/content/browser/html/tool2/index.html

softbank
http://creation.mb.softbank.jp/web/web_tool.html

au
http://www.au.kddi.com/ezfactory/tool/ue/
http://web.archive.org/web/*/developer.openwave.com/ja/tools_and_sdk/openwave_mobile_sdk/SDK62K/Openwave_SDK_62K.exe

・fireMobileSimulator
http://firemobilesimulator.org/
    このエントリーをはてなブックマークに追加

日付が変わってしばらくのんびりして、1時過ぎくらいに初詣へ。
眠気と戦ったけどなんとか勝ちました。
東京で年越するのは今年が初めて。

新宿の花園神社まで徒歩で。
2時前くらいでもすごい行列でした。
ちょうど1時間くらい並んで無事初詣終了です。

今年初のおみくじは大吉でした。
でも書いてあることがぜんぜん大吉じゃない・・・。
なにこれこわい。

初詣
    このエントリーをはてなブックマークに追加

ちょっと調べることがあったので、メモとして残しておきます。

日本語のtweetの抽出方法はいろいろあるとおもうんだけど、
今回はフォロワー取得APIでユーザの最新のステータスが取れることから、
特定の有名人のフォロワーのtweetを集めて平均値を出してみようかと。

たぶん統計学的にどのくらいのtweetの平均値をとれば統計として信用できる値とかってあるはずよね。。
習ったような習わなかったような気がするけど、とりあえず適当な数とってみました。

ターゲットとした有名人は勝間さん。
勝間さんのフォロワーをAPIで取得して平均値をだしました。

ちょっと古いAPIの仕様見てたらpage=1とかでページ数指定するって書いてたんだけど、公式のドキュメント見たらcursorになってた。
無駄にハマった。

初期値はcursor=-1を設定して、レスポンスにnext_cursorが返ってくるので次のページを見るときはその値を設定する。
(要するにcursor=1,2,3とかじゃないみたい。)

下に書いてある簡単なバッチ作ってみたところ、
対象Tweet6587tweet
トータル文字数234153文字
平均Tweet文字数35.5文字
以上のような結果に。
*)RTで始まってるtweetは除きました。

何度かやってみてもだいたい30文字台だったので、
日本人は30〜40文字でつぶやいているんでしょう、たぶん。

tweetLength.php

<?php
$username = "USERNAME";
$password = "PASSWORD";
$target = 'kazuyo_k';

$tweet=0;
$length=0;
$cursor = -1;
for ($i=0;$i<150;$i++) {
  if ($cursor == 0) break 1;

  $url = sprintf("http://twitter.com/statuses/followers.json?cursor=%d&screen_name=%s",$cursor,$target);
  $json = request($url,$username,$password);
  if (!is_array($json->users)) continue 1;
  foreach ($json->users as $key => $val) {
    if(isset($val->status)) {
      //RTで始まるtweetは飛ばす
      if(preg_match("/^RT(.+)/",$val->status->text)) continue 1;

      if (mb_detect_encoding($val->status->text) != 'UTF-8') continue 1;
      $tweet++;
      $length+=mb_strlen($val->status->text, 'utf-8');
    }
  }
  $cursor = $json->next_cursor;
}
echo "tweet  : " . $tweet . "\n";
echo "length : " . $length . "\n";
echo "avg    : " . $length / $tweet . "\n";

function request($host='',$username='',$password=''){
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $host);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
  curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
  $result = curl_exec($ch);
  curl_close($ch);

  return json_decode($result);
}
?>
    このエントリーをはてなブックマークに追加



P1000256


ちょうど引越しの時に読まなくなった本を売ろうと思ってたので、
ついでに手順をnanapiに書きました。
写真は自分で引越しの時に撮ったものです。

1回も読んでない本もあったので、来年は読む分だけ買うようにします。。

トータル1万円弱になったので、いらないもの売った割にはいいお値段でした。
    このエントリーをはてなブックマークに追加

いよいよ明日引っ越し。
部屋の中がカオス。
引越し準備


本を片付けてたらリサイクルに売るようの本が3箱できました。


けっこう気に入ってたこの部屋とも今日でお別れです。
引っ越し前夜



あ、準備しなきゃ・・・。
    このエントリーをはてなブックマークに追加

このページのトップヘ