ポケモンGOについて
みんなー!ポケモンGETしてるー?
世の中的にはポケモンGO疲れが始まってるとかなんとか言ってますね。
個人的には思う部分があるので、久々に書こうかと思います。
そもそも論として、
ポケモンGOは位置情報を利用したライフログゲームなんだと思ってます。
そんなライフログゲームを1週間とかずっとやってればそりゃ飽きますよ。
体重の増減をレコーディングすることすら皆3日で飽きちゃうんだから。
ポケモンGOの一番の功績としては、
ライフログをゲームに昇華させたところなんじゃなかろうか?と。
今までもゲームという形でないにせよ、Foursquareやロケタッチなどの位置情報サービスはありましたが、一般層にまで降りきったとは言えない。
そう考えると、ライフログをゲームに昇華させて一般層に浸透させたという所にものすごい価値を感じます。
そしてそういうゲームを作りたいと昔から思ってたので
個人的にはすごく嬉しいなぁ。
そんなボクはレベル15で49匹集めた所です。
これからもマッタリ続けていきます。
cocos2d-js(cocos2d-html5) v3 で遊んでみる
インストール関連はこちらを参考にしました
http://qiita.com/turusuke/items/741267bbfc81a287438a
とりあえずhello worldを弄ってタッチでスプライトを動かすところまで。
main.js
cc.game.onStart = function(){ cc.view.adjustViewPort(true); cc.view.setDesignResolutionSize(640, 480, cc.ResolutionPolicy.SHOW_ALL); cc.view.resizeWithBrowserSize(true); //load resources cc.LoaderScene.preload(g_resources, function () { cc.director.runScene(new MainScene()); }, this); }; cc.game.run();
メイン。
サンプルとほぼ変わらず。
app.js
var PLAYER_WIDTH = 24; var PLAYER_HEIGHT = 32; var MainLayer = cc.Layer.extend({ winSize: null, touchDiff: null, player: null, /** * コンストラクタ */ ctor:function () { this._super(); // 画面サイズ this.winSize = cc.winSize; // 自機設定 var frames = []; for (var i = 0; i <= 2; i++) { frames.push(cc.SpriteFrame.create(res.Player_png, cc.rect(i * PLAYER_WIDTH, 0, PLAYER_WIDTH, PLAYER_HEIGHT))); } var animatoin = cc.Animation.create(frames, 0.25); this.player = cc.Sprite.create(res.Player_png, cc.rect(0, 0, PLAYER_WIDTH, PLAYER_HEIGHT)); this.player.setPosition(this.winSize.width / 2, this.winSize.height / 2); this.player.runAction(cc.RepeatForever.create(cc.Animate.create(animatoin))); this.addChild(this.player); // イベント設定 var self = this; cc.eventManager.addListener({ event: cc.EventListener.TOUCH_ALL_AT_ONCE, onTouchesBegin: function(touches, event) { var now = touches[0].getLocation(); var prev = touches[0].getPreviousLocation(); self.touchDiff = { x: now.x - prev.x, y: now.y - prev.y, } }, onTouchesMoved: function(touches, event) { var now = touches[0].getLocation(); var prev = touches[0].getPreviousLocation(); self.touchDiff = { x: now.x - prev.x, y: now.y - prev.y, } }, onTouchesEnded: function(touches, event) { self.touchDiff = null; }, onTouchesCancelled: function(touches, event) { self.touchDiff = null; } }, this); // updateメソッド利用 this.scheduleUpdate(); return true; }, /** * update */ update: function() { // 自機移動 if (this.touchDiff) { var pos = this.player.getPosition(); pos.x = pos.x + this.touchDiff.x; pos.y = pos.y + this.touchDiff.y; if (pos.x >= this.winSize.width - PLAYER_WIDTH) { pos.x = this.winSize.width - PLAYER_WIDTH; } else if (pos.x <= PLAYER_WIDTH) { pos.x = PLAYER_WIDTH; } if (pos.y >= this.winSize.height - PLAYER_HEIGHT) { pos.y = this.winSize.height - PLAYER_HEIGHT; } else if (pos.y <= PLAYER_HEIGHT) { pos.y = PLAYER_HEIGHT; } this.player.setPosition(pos); } } }); var MainScene = cc.Scene.extend({ onEnter:function () { this._super(); var layer = new MainLayer(); this.addChild(layer); } });
シーン、レイヤー。
イベントの設定がv2系とはかなり変更あり。
v3はListener方式なので要注意。
自機はアニメーションさせています。
resource.js
var res = { Player_png : "res/Player.png" }; var g_resources = []; for (var i in res) { g_resources.push(res[i]); }
リソース。
サンプルとほぼ変わらず。
Web検索APIがあちこち提供終了しているのでbingのAPIを試す 簡易メモ
<?php $key = "APIキー"; $word = "検索文字列"; $url = "https://api.datamarket.azure.com/Bing/Search/Web" . "?Query=" . urlencode("'" . $word . "'") . '&$format=json'; $options = array( "http" => array( "request_fulluri" => true, "header" => "Authorization: Basic " . base64_encode($key . ":" . $key) ) ); $context = stream_context_create($options); $response = @file_get_contents($url, false, $context); $ret = json_decode($response, true); print_r($ret["d"]["results"]); ?>
mongodbのmapReduce 簡易メモ
keyを集計して件数を取得
mapreduce.js
var map = function() { emit( this.key, // key 1 // value ); } var reduce = function(key, values) { var count = 0; values.forEach(function(value) { count += value; }); return count; } var mongo = new Mongo('localhost'); var db = mongo.getDB('db'); var res = db.collection.mapReduce(map, reduce, {out: "tmp_out_collection"}); shellPrint(res);
実行
mongo mapreduce.js
PHPでZendFrameworkを使ってAmazonS3にアクセスする
AWS SDKを使った事例はググれば結構出てくるのですが、
ZendFrameworkのZend_Service_Amazon_S3での利用は
あんまり見つからなかったので
ざっくり使い方メモ。
<?php require_once "Zend/Service/Amazon/S3.php"; class amazonS3 { private $_s3; private $_key = "APIキー"; private $_secret = "APIシークレットキー"; private $_bucket = "バケット名"; public function __construct() { $this->_s3 = new Zend_Service_Amazon_S3($this->_key, $this->_secret); } /** * ファイル一覧取得 * $path 取得したいS3上のディレクトリ ex:images/ */ public fucntion getFileList($path) { $ret = array(); // prefixにディレクトリ名を指定してそれ下のファイルを取得 $files = $this->_s3->getObjectsByBucket( $this->_bucket, array("prefix" => $path) ); // 取得したファイルにディレクトリも含まれるためファイル名だけにして抽出 foreach($files as $file) { $file_name = str_replace($path, "", $file); if (strlen($file_name)) { $ret[] = $file_name; } } return $ret; } /** * ファイルアップロード * $path アップロードしたいS3上のディレクトリ ex:images/ * $file アップロードしたいファイル ex:/home/user/logo.png */ public fucntion uploadFile($path, $file) { $this->_s3->putObject( $path, file_get_contents($file), array(Zend_Service_Amazon_S3::S3_ACL_HEADER => Zend_Service_Amazon_S3::S3_ACL_PUBLIC_READ) ); } /** * ファイル削除 * $file 削除したいS3上のファイル ex:images/logo.png */ public fucntion removeFile($file) { $this->_s3->removeObject($file); } }
これだけだった。簡単。
phpでフォームのinputの最大個数はデフォルト1000だった
<form method="post" action="test.php"> <input type="checkbox" name="chk[]" value="1" checked> <input type="checkbox" name="chk[]" value="1" checked> <input type="checkbox" name="chk[]" value="1" checked> :
でinputの取得できる最大数は1000っぽい。
test.php
<?php $chk= $_REQUEST["chk"]; print_r(count($chk)); ?>
でcheckboxが1000超えてもcountは1000で打ち止めだった。
よくよく調べてみたら
php5.3.9から入ったmax_input_varsで変更可能とのこと。
max_input_varsの値を変更して解決。
moadminでID/PASS付きのmongoDBにアクセスする
36行目
define('MONGO_CONNECTION', 'mongodb://ID:パスワード@サーバIP:ポート');
に変更するだけ。