<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5391756727274905428</id><updated>2024-11-01T15:41:57.638+09:00</updated><category term="Android"/><category term="Javascript"/><category term="Node.js"/><category term="Xcode4.2"/><category term="iPhone"/><category term="Objective-C"/><category term="Cordova"/><category term="PhoneGap"/><category term="Heroku"/><category term="HTML5"/><category term="Java"/><category term="Unity"/><category term="jQuery"/><category term="MongoDB"/><category term="WebGL"/><category term="jQuery1.7"/><category term="three.js"/><category term="CSS3"/><category term="GAE/P"/><category term="Python"/><category term="Xcode"/><category term="Xcode4.6"/><category term="jPlayer"/><category term="3D"/><category term="AWS"/><category term="Android Studio"/><category term="Blender"/><category term="C#"/><category term="Datastore"/><category term="EC2"/><category term="Eclipse"/><category term="Facebook"/><category term="Flash"/><category term="GAE"/><category term="GLSL"/><category term="MYSQL"/><category term="Mono"/><category term="MonoDevelop"/><category term="OpenGL"/><category term="SNS"/><category term="Safari"/><category term="Swiffy"/><category term="VR"/><category term="Xcode4.4"/><category term="iOS"/><category term="iPad"/><category term="jQuery Mobile"/><title type='text'>今ここまで覚えました</title><subtitle type='html'>web関連技術の備忘録</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>75</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5391756727274905428.post-2315342742917180090</id><published>2017-10-10T18:50:00.000+09:00</published><updated>2017-10-10T19:09:27.796+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Blender"/><title type='text'>Blenderのショートカットキー</title><content type='html'>&lt;style&gt;
table.type02 {
 border-collapse: separate;
 border-spacing: 0;
 text-align: left;
 line-height: 1.5;
 border-top: 1px solid #ccc;
 border-left: 1px solid #ccc;
}
table.type02 th {
 width: 150px;
 padding: 10px;
 font-weight: bold;
 vertical-align: top;
 border-right: 1px solid #ccc;
 border-bottom: 1px solid #ccc;
 border-top: 1px solid #fff;
 border-left: 1px solid #fff;
 background: #eee;
}
table.type02 td {
 width: 350px;
 padding: 10px;
 vertical-align: top;
 border-right: 1px solid #ccc;
 border-bottom: 1px solid #ccc;
}
&lt;/style&gt;
&lt;h2&gt;ショートカットキー&lt;/h2&gt;
&lt;table class=&quot;type02&quot;&gt;
&lt;tr&gt;&lt;th&gt;オブジェクトの移動&lt;/th&gt;&lt;td&gt;E&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;オブジェクトの回転&lt;/th&gt;&lt;td&gt;R&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;オブジェクトの拡大&lt;/th&gt;&lt;td&gt;S&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;ボーン追加&lt;/th&gt;&lt;td&gt;E&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;左右対象にボーン追加&lt;/th&gt;&lt;td&gt;SHift + E&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;オブジェクトを隠す&lt;/th&gt;&lt;td&gt;H&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;隠した物を表示する&lt;/th&gt;&lt;td&gt;Alt + H&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;全てを選択&lt;/th&gt;&lt;td&gt;A&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;h2&gt;マウス操作&lt;/h2&gt;
&lt;table class=&quot;type02&quot;&gt;
&lt;tr&gt;&lt;th&gt;オブジェクトの選択&lt;/th&gt;&lt;td&gt;右クリック&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;画面の回転&lt;/th&gt;&lt;td&gt;マウスの中ボタン&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;画面の移動&lt;/th&gt;&lt;td&gt;SHift + マウスの中ボタン&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</content><link rel='replies' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/2315342742917180090/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kakurenboman.blogspot.com/2017/10/blender.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/2315342742917180090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/2315342742917180090'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/2017/10/blender.html' title='Blenderのショートカットキー'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5391756727274905428.post-6164746989944533983</id><published>2016-10-27T14:52:00.000+09:00</published><updated>2016-10-27T16:39:45.520+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="WebGL"/><title type='text'>Webgl GLSL gl.uniform 対応表</title><content type='html'>&lt;code&gt;&lt;pre&gt;
gl.uniform1f (floatUniformLoc, v);                 // for float
gl.uniform1fv(floatUniformLoc, [v]);               // for float or float array
gl.uniform2f (vec2UniformLoc,  v0, v1);            // for vec2
gl.uniform2fv(vec2UniformLoc,  [v0, v1]);          // for vec2 or vec2 array
gl.uniform3f (vec3UniformLoc,  v0, v1, v2);        // for vec3
gl.uniform3fv(vec3UniformLoc,  [v0, v1, v2]);      // for vec3 or vec3 array
gl.uniform4f (vec4UniformLoc,  v0, v1, v2, v4);    // for vec4
gl.uniform4fv(vec4UniformLoc,  [v0, v1, v2, v4]);  // for vec4 or vec4 array
 
gl.uniformMatrix2fv(mat2UniformLoc, false, [  4x element array ])  // for mat2 or mat2 array
gl.uniformMatrix3fv(mat3UniformLoc, false, [  9x element array ])  // for mat3 or mat3 array
gl.uniformMatrix4fv(mat4UniformLoc, false, [ 16x element array ])  // for mat4 or mat4 array
 
gl.uniform1i (intUniformLoc,   v);                 // for int
gl.uniform1iv(intUniformLoc, [v]);                 // for int or int array
gl.uniform2i (ivec2UniformLoc, v0, v1);            // for ivec2
gl.uniform2iv(ivec2UniformLoc, [v0, v1]);          // for ivec2 or ivec2 array
gl.uniform3i (ivec3UniformLoc, v0, v1, v2);        // for ivec3
gl.uniform3iv(ivec3UniformLoc, [v0, v1, v2]);      // for ivec3 or ivec3 array
gl.uniform4i (ivec4UniformLoc, v0, v1, v2, v4);    // for ivec4
gl.uniform4iv(ivec4UniformLoc, [v0, v1, v2, v4]);  // for ivec4 or ivec4 array
 
gl.uniform1i (sampler2DUniformLoc,   v);           // for sampler2D (textures)
gl.uniform1iv(sampler2DUniformLoc, [v]);           // for sampler2D or sampler2D array
 
gl.uniform1i (samplerCubeUniformLoc,   v);         // for samplerCube (textures)
gl.uniform1iv(samplerCubeUniformLoc, [v]);         // for samplerCube or samplerCube array
&lt;/pre&gt;&lt;/code&gt;
&lt;br&gt;&lt;a href=&quot;http://webglfundamentals.org/webgl/lessons/webgl-shaders-and-glsl.html&quot;&gt;http://webglfundamentals.org/webgl/lessons/webgl-shaders-and-glsl.html&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;http://www.shaderific.com/glsl-types/&quot;&gt;http://www.shaderific.com/glsl-types/&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://www22.atwiki.jp/opengles/pages/9.html&quot;&gt;https://www22.atwiki.jp/opengles/pages/9.html&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/6164746989944533983/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kakurenboman.blogspot.com/2016/10/webgl-glsl-gluniform.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/6164746989944533983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/6164746989944533983'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/2016/10/webgl-glsl-gluniform.html' title='Webgl GLSL gl.uniform 対応表'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5391756727274905428.post-1581989312735896569</id><published>2015-11-18T17:36:00.000+09:00</published><updated>2015-11-18T17:36:38.497+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MongoDB"/><category scheme="http://www.blogger.com/atom/ns#" term="Node.js"/><title type='text'>Node.jsでMongodb</title><content type='html'>&lt;p&gt;モジュールは2つ見つけましたが、MongooseはMongodbを機能強化的な部分もありますので、純粋なMongodbを味わってみたいと思います。ですので今回のモジュールはmongodbで行きます。&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
npm install mongodb
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;ローカルでテストする予定なので以下で設定&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
var MongoClient = require(&#39;mongodb&#39;).MongoClient,
 db_uri = &#39;mongodb://localhost/testdb&#39;;
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;まずコネクト&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
function connect() {
 &#39;use strict&#39;;
 MongoClient.connect(db_uri, function (err, db) {
  if (err) {
   console.log(err);
  } else {
   console.log(&#39;OK!&#39;);
   db.close();
  }
 });
}
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;データを追加&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
function insert() {
 &#39;use strict&#39;;
 MongoClient.connect(db_uri, function (err, db) {
  var collection, user;
  if (err) {
   console.log(err);
  } else {
   console.log(&#39;OK!&#39;);
   collection = db.collection(&#39;user&#39;);
   user = {name: &#39;test test&#39;, age: Math.floor(Math.random() * 60)};
   collection.insert([user], function (err, result) {
    if (err) {
     console.log(err);
    } else {
     console.log(result);
    }
    db.close();
   });
  }
 });
}
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;データの抽出&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
function find() {
 &#39;use strict&#39;;
 MongoClient.connect(db_uri, function (err, db) {
  var collection, user;
  if (err) {
   console.log(err);
  } else {
   console.log(&#39;OK!&#39;);
   collection = db.collection(&#39;user&#39;);
   collection.find({name: &#39;test test&#39;}).toArray(function (err, result) {
    if (err) {
     console.log(err);
    } else {
     console.log(result);
    }
    db.close();
   });
  }
 });
}
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;データの上書き&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
function update() {
 &#39;use strict&#39;;
 MongoClient.connect(db_uri, function (err, db) {
  var collection, user, cursor, n = 0;
  if (err) {
   console.log(err);
  } else {
   collection = db.collection(&#39;user&#39;);
   collection.updateOne({age: 2}, {$set: {seed: Math.random()}});
   db.close();
   find();
  }
 });
}
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;データの抽出してソートしたりする&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
function cursor() {
 &#39;use strict&#39;;
 MongoClient.connect(db_uri, function (err, db) {
  var collection, user, cursor, n = 0;
  if (err) {
   console.log(err);
  } else {
   console.log(&#39;OK!&#39;);
   collection = db.collection(&#39;user&#39;);
   cursor = collection.find({name: &#39;test test&#39;});
   cursor.sort({age: -1});
   cursor.limit(10);
   cursor.skip(0);
   cursor.each(function (err, doc) {
    n += 1;
    console.log(n);
    if (err) {
     console.log(err);
    } else if (doc === null) {
     db.close();
    } else {
     console.log(doc);
    }
   });
  }
 });
}
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;使いやすいです。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/1581989312735896569/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kakurenboman.blogspot.com/2015/11/nodejsmongodb.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/1581989312735896569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/1581989312735896569'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/2015/11/nodejsmongodb.html' title='Node.jsでMongodb'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5391756727274905428.post-8541778668761588360</id><published>2015-11-17T19:52:00.003+09:00</published><updated>2015-11-18T17:47:20.182+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Android Studio"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><title type='text'>Android Studio1.5でプッシュ通知</title><content type='html'>&lt;p&gt;Android Studioがまたいろいろ変わっていますね、X codeもそうですが1年前に覚えた事がもう使えないという状況はしんどいですね。作成している時間より調べている時間のほうが圧倒的に多いですからね。&lt;/p&gt;
&lt;p&gt;Androidのプッシュ通知はGoogle Cloud Messaging for Android(GCM)というものを使うそうです、これはGoogle Developers Consoleで作業するみたいです。これもまた変わってますね。（2015/11/11現在）こっちは後回しにします。&lt;/p&gt;
&lt;h2&gt;Android Studio&lt;/h2&gt;
&lt;p&gt;まず、ライブラリを入れます、SDKManagerをクリックすると見知らぬの画面が出てきます。&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcyy1krsA6g6xGQX_mE-FfYLF2mj2PQeAX4tyM7P3TAgl9lF8JnT2ml04Dfrx5-LnwOkp2OQ8faHJd8W4L0MlQ3U50w5ShdUjQ1KTCc4r2IIFx3T-rDGKi3V6ACfF9Wg05PuZb1wWY8vg/s1600/01-2.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcyy1krsA6g6xGQX_mE-FfYLF2mj2PQeAX4tyM7P3TAgl9lF8JnT2ml04Dfrx5-LnwOkp2OQ8faHJd8W4L0MlQ3U50w5ShdUjQ1KTCc4r2IIFx3T-rDGKi3V6ACfF9Wg05PuZb1wWY8vg/s320/01-2.jpg&quot; /&gt;&lt;/a&gt;

&lt;p&gt;Default Settings画面に統合したんでしょうね。Android SDK&gt;SDK Toolsに必要なライブラリをチェックしインストール。下にあるLaunch Standalone SDK Managerをクリックすると懐かしい画面が出てきました。&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU4yskXPkLOeuBX8En0k3XY0WOkNiJAQnbK60LUO2208qoHjTFfQqn-RigiEs6fze144YIr-c2887zdm5K00dlZxEy4GUW5EQbsLxNssqlCv2rfIi1344PvVasiaH2o9cDB3mmDg287a8/s1600/02-2.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhU4yskXPkLOeuBX8En0k3XY0WOkNiJAQnbK60LUO2208qoHjTFfQqn-RigiEs6fze144YIr-c2887zdm5K00dlZxEy4GUW5EQbsLxNssqlCv2rfIi1344PvVasiaH2o9cDB3mmDg287a8/s320/02-2.jpg&quot; /&gt;&lt;/a&gt;


&lt;p&gt;次にbuild.gradleに追加したライブラリを書きます、ですがFile&gt;Project StructureでUIを使って追加出来るみたいです。&lt;/p&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiilKfHz9VRDwzTQzPGnXoQReFEUOzmZ8GeTQCk2UT-z_CAhYvKOXi6i0PDexwqnLGAqiUsS96lLZrfUAolk57a8M7dQ8T-rH4boQJaNUoM88deFxQV8qf6bNGFWmvSvP3CN5DXJ162aQU/s1600/03.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiilKfHz9VRDwzTQzPGnXoQReFEUOzmZ8GeTQCk2UT-z_CAhYvKOXi6i0PDexwqnLGAqiUsS96lLZrfUAolk57a8M7dQ8T-rH4boQJaNUoM88deFxQV8qf6bNGFWmvSvP3CN5DXJ162aQU/s320/03.jpg&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8jlkMd8hMPipWBJB45jwNVWDgMcDqStt8mH3gz3exxQeICSyobos3Bv-FZzIS2A4V7l5cczhq1uLXenXCLR4X4Dzv3yNwoCk2uqTZaizbDlV-APQhONmnu0oQYYhoM3euwPauwZEk3i0/s1600/04.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8jlkMd8hMPipWBJB45jwNVWDgMcDqStt8mH3gz3exxQeICSyobos3Bv-FZzIS2A4V7l5cczhq1uLXenXCLR4X4Dzv3yNwoCk2uqTZaizbDlV-APQhONmnu0oQYYhoM3euwPauwZEk3i0/s320/04.jpg&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqF29c8nkmR-C3xChW2H6-TXdgP3D-ZFJ5uBkq8vqd3Bf2zeMWQIkla5qUooKveX7y3itVA-BqE7SeElTNuSTW_jaeMN6HrXKmzQoLoukYXLmLld3hYMegI84Rh2whcdxilpFjxnJo6uQ/s1600/05.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqF29c8nkmR-C3xChW2H6-TXdgP3D-ZFJ5uBkq8vqd3Bf2zeMWQIkla5qUooKveX7y3itVA-BqE7SeElTNuSTW_jaeMN6HrXKmzQoLoukYXLmLld3hYMegI84Rh2whcdxilpFjxnJo6uQ/s320/05.jpg&quot; /&gt;&lt;/a&gt;
&lt;p&gt;このまま行くと実はいろいろエラーが発生しました、恐らくバージョンが合わないのだと思います。SDKのバージョンを上げれる場合はいいのですが、今回は上げるわけにはいかなかったので、いろいろやってる内にエラーで以下のようなエラーが出ました。&lt;/p&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixL08vRPQopMvb9TN2TJet0huvuKLqswOsL_Oz4nDoF3xQLxVN9Dxnd1bQMZ4Oma3Z_6srZ2AiqmK3CWJu2vuOgEgsgBSw6IOaxX6mJg8IsFJBKZJDfBgKivhxMm70FB23OYC0FndtedA/s1600/06.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixL08vRPQopMvb9TN2TJet0huvuKLqswOsL_Oz4nDoF3xQLxVN9Dxnd1bQMZ4Oma3Z_6srZ2AiqmK3CWJu2vuOgEgsgBSw6IOaxX6mJg8IsFJBKZJDfBgKivhxMm70FB23OYC0FndtedA/s320/06.jpg&quot; /&gt;&lt;/a&gt;
&lt;p&gt;恐らく「この中から選べ」ってことだと思います、とりあえず私は以下に設定しました。&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
dependencies {
    compile fileTree(dir: &#39;libs&#39;, include: [&#39;*.jar&#39;])
    compile &#39;com.android.support:support-v4:21.0.2&#39;
    compile &#39;com.android.support:appcompat-v7:21.0.3&#39;
    compile &#39;com.google.android.gms:play-services:7.5.0&#39;
}
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;いろいろ調べる内にGoogle Play ServicesにはいろんなサービスがあるらしくインポートするのはGCMだけをインポートすることもできるみたいです。あとバージョン等がわかるとbuild.gradleを直接書く方が早いです。&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
    compile &#39;com.google.android.gms:play-services-gcm:7.5.0&#39;
&lt;/pre&gt;&lt;/code&gt;
&lt;a href=&quot;https://developers.google.com/android/guides/setup&quot;&gt;https://developers.google.com/android/guides/setup&lt;/a&gt;
&lt;p&gt;ひとまずこれでOKだと思います。まずは通知のためのGCMの設定をします。&lt;/p&gt;
&lt;a href=&quot;https://console.developers.google.com/start&quot;&gt;https://console.developers.google.com/start&lt;/a&gt;

&lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwkKIt-cxJcvXHZt5G7gRKV7vTe9iZQQgb53ka0Wp0J0TN7wEQ5EOVf16cGnACEEbHvTQJe0E-hNAmOpPnqnxu-m7EqVhO58bPeTw3hQMcwbUSekWSOctYVEoOTi2ci-o6sBPu46bRmpc/s1600/api.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwkKIt-cxJcvXHZt5G7gRKV7vTe9iZQQgb53ka0Wp0J0TN7wEQ5EOVf16cGnACEEbHvTQJe0E-hNAmOpPnqnxu-m7EqVhO58bPeTw3hQMcwbUSekWSOctYVEoOTi2ci-o6sBPu46bRmpc/s320/api.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Cloud Messaging for Android&lt;/h2&gt;
&lt;p&gt;これもまた変わりましたね、API Managerを選択プロジェクトが必要な場合は作成&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3N-uvfTPIINHzbZ3J3jqp8lCBrHnNrvEivtz4aDjWWKTJ73QgzysetQ-yR69QtjAFZfFhFG7_i26wfbtALbIRhKOqsIYDXGn1WOCV6rDUNBBLaClDjgOTJ7nYRO7LCX8dcjF3cXiXs9k/s1600/api02-2.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3N-uvfTPIINHzbZ3J3jqp8lCBrHnNrvEivtz4aDjWWKTJ73QgzysetQ-yR69QtjAFZfFhFG7_i26wfbtALbIRhKOqsIYDXGn1WOCV6rDUNBBLaClDjgOTJ7nYRO7LCX8dcjF3cXiXs9k/s320/api02-2.jpg&quot; /&gt;&lt;/a&gt;

&lt;p&gt;これもまた変わりましたね、API Managerを選択プロジェクトが必要な場合は作成&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3QZGVxrtMhUjpAsKB1ZSR8NLA6FxRgKXbR7B3pGMgsCPB2QSBqKNTkhWyI6mNBValf1oYwa1GMfJ4A1bdMOfYN8IqhPxM5O4VSUwNDtojGK_tjZHfCxQJJqXS1WR9xVFqaZNFnReZKk8/s1600/api03.png&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3QZGVxrtMhUjpAsKB1ZSR8NLA6FxRgKXbR7B3pGMgsCPB2QSBqKNTkhWyI6mNBValf1oYwa1GMfJ4A1bdMOfYN8IqhPxM5O4VSUwNDtojGK_tjZHfCxQJJqXS1WR9xVFqaZNFnReZKk8/s320/api03.png&quot; /&gt;&lt;/a&gt;

&lt;p&gt;Cloud Messaging for Androidを選択APIを有効にします&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyQHvOstgI27Ox934jq7XDtUwKrmbcBMyAkgdY3Exwrl-XdFomgOTpIJ-8TeTEf7axqH4-mpNes7aTu1wxEYLpBoNmcWLjlk1nNbCF3TG_OnPGsvqEbC8gAStaRLRZZfqt6_N9eVn0lmo/s1600/api04.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyQHvOstgI27Ox934jq7XDtUwKrmbcBMyAkgdY3Exwrl-XdFomgOTpIJ-8TeTEf7axqH4-mpNes7aTu1wxEYLpBoNmcWLjlk1nNbCF3TG_OnPGsvqEbC8gAStaRLRZZfqt6_N9eVn0lmo/s320/api04.jpg&quot; /&gt;&lt;/a&gt;

&lt;p&gt;認証情報に移動、認証情報を追加、APIキー&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0FIsBD3JgMKB3ROu8Tp-WELNaga4Gi4e3aKQKbvoW33nDmGiMwQyBmkREPiFHI6u2KLyYjsQ5wa1AeGvUBifzeCLwW_9PRiI1f1WO0Ee15ZeDVZc1StLUCmlVBD6ThoIg_Q9y6lsVIk8/s1600/api05.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0FIsBD3JgMKB3ROu8Tp-WELNaga4Gi4e3aKQKbvoW33nDmGiMwQyBmkREPiFHI6u2KLyYjsQ5wa1AeGvUBifzeCLwW_9PRiI1f1WO0Ee15ZeDVZc1StLUCmlVBD6ThoIg_Q9y6lsVIk8/s320/api05.jpg&quot; /&gt;&lt;/a&gt;

&lt;p&gt;認証情報に移動、認証情報を追加、APIキー、サーバーキーを選択&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4z3iukhyG0vi8yQsuQ-Fwcu-U7mngOn4GIMxmuSDH2-y1dLfXWdgCg3LYn4oRyvE7u3y_LwoZ9xfdhtyVixjrqNipoZ_VT-dun9JBPDv4W3u2i8wkLkxim-qexHxaYSkLoKAmDxlvq6Q/s1600/api06.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4z3iukhyG0vi8yQsuQ-Fwcu-U7mngOn4GIMxmuSDH2-y1dLfXWdgCg3LYn4oRyvE7u3y_LwoZ9xfdhtyVixjrqNipoZ_VT-dun9JBPDv4W3u2i8wkLkxim-qexHxaYSkLoKAmDxlvq6Q/s320/api06.jpg&quot; /&gt;&lt;/a&gt;

&lt;p&gt;IPは設定している方がいいと思います。ここで出来たAPIキーとプロジェクト番号をあとで使います。&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOrZAuDM3FUx4KyYnb26rCX52gNPVQGX6j_wmCii6rdSQ3qDV2RlXZZeCfYrKoxwhEs7JdsFo25QLBoC9Ss3sgEPLvB3XaSyZWU2L4hjDa9AF6FXulWp-BEF2L_bdrG-eKs-eoHTtDz3U/s1600/api07.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOrZAuDM3FUx4KyYnb26rCX52gNPVQGX6j_wmCii6rdSQ3qDV2RlXZZeCfYrKoxwhEs7JdsFo25QLBoC9Ss3sgEPLvB3XaSyZWU2L4hjDa9AF6FXulWp-BEF2L_bdrG-eKs-eoHTtDz3U/s320/api07.jpg&quot; /&gt;&lt;/a&gt;

&lt;h2&gt;AndroidManifest.xml&lt;/h2&gt;
&lt;p&gt;パーミッションの追加manifestタグのだいたい最初の方に以下追加&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
    &amp;lt;permission
        android:name=&quot;{プロジェクト名前}.gcm.permission.C2D_MESSAGE&quot;
        android:protectionLevel=&quot;signature&quot; /&gt;
    &amp;lt;uses-permission android:name=&quot;{プロジェクト名前}.gcm.permission.C2D_MESSAGE&quot; /&gt;
    &amp;lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&gt;
    &amp;lt;uses-permission android:name=&quot;android.permission.WAKE_LOCK&quot; /&gt;
    &amp;lt;uses-permission android:name=&quot;com.google.android.c2dm.permission.RECEIVE&quot; /&gt;
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;applicationタグ以下追加&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
        &amp;lt;receiver
             android:name=&quot;com.google.android.gms.gcm.GcmReceiver&quot;
             android:exported=&quot;true&quot;
             android:permission=&quot;com.google.android.c2dm.permission.SEND&quot; &gt;
             &amp;lt;intent-filter&gt;
                 &amp;lt;action android:name=&quot;com.google.android.c2dm.intent.RECEIVE&quot; /&gt;
                 &amp;lt;category android:name=&quot;{プロジェクト名前}&quot; /&gt;
             &amp;lt;/intent-filter&gt;
        &amp;lt;/receiver&gt;
        &amp;lt;service
            android:name=&quot;.GCMListener&quot;
            android:exported=&quot;false&quot; &gt;
            &amp;lt;intent-filter&gt;
                &amp;lt;action android:name=&quot;com.google.android.c2dm.intent.RECEIVE&quot; /&gt;
            &amp;lt;/intent-filter&gt;
        &amp;lt;/service&gt;
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;GCMListenerクラスの作成&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
public class GCMListener extends GcmListenerService {
 private NotificationManager mManager;
 @Override
 public void onMessageReceived(String from, Bundle data) {
  super.onMessageReceived(from, data);

  NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
  Intent notificationIntent = new Intent(this, MainActivity.class);
  PendingIntent pen = PendingIntent.getActivity(this, 0, notificationIntent, 0);

  NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
  builder.setSmallIcon(R.drawable.icon);//アイコン
  builder.setTicker(&quot;テキスト&quot;);//通知バーメッセージ
  builder.setWhen(System.currentTimeMillis());//時間
  builder.setContentTitle(&quot;タイトル&quot;);//タイトル
  builder.setContentText(&quot;内容テキスト&quot;);//内容テキスト
  builder.setSubText(&quot;サブテキスト&quot;);//サブテキスト
  builder.setContentInfo(&quot;Info&quot;);//インフォ
  builder.setContentIntent(pen)//移動場所
  builder.setAutoCancel(true);//削除
  nm.notify(1, builder.build());
 }
}
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;サブテキストあたりはいらない、レイアウトをかえることもできるみたいですが今回は無視、次に認証&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
 private void register() {
  gcm = GoogleCloudMessaging.getInstance(this);
  new AsyncTask&lt;Void, Void, Void&gt;() {
   @Override
   protected Void doInBackground(Void... params) {
    try {
     String regid = gcm.register(getString(R.string.project_id));
     Log.v(&quot;tag&quot;, regid);
    } catch (IOException ex) {
     ex.printStackTrace();
    }
    return null;
   }
  }.execute(null, null, null);
 }
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;cURLというものでテストできるそうです、Macはいいですね。&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
curl --header &quot;Authorization: key={APIキー}&quot; --header &quot;Content-Type: application/json&quot; https://android.googleapis.com/gcm/send -d &quot;{\&quot;registration\_ids\&quot;:[\&quot;{認証キー}\&quot;]}&quot;
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;追記：GCMへプッシュするphpでいいのがありました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://gist.github.com/prime31/5675017&quot;&gt;https://gist.github.com/prime31/5675017&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;通知音鳴らす場合以下でいけました&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
builder.setSound(uri);
&lt;/pre&gt;&lt;/code&gt;</content><link rel='replies' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/8541778668761588360/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kakurenboman.blogspot.com/2015/11/android-studio151.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/8541778668761588360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/8541778668761588360'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/2015/11/android-studio151.html' title='Android Studio1.5でプッシュ通知'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcyy1krsA6g6xGQX_mE-FfYLF2mj2PQeAX4tyM7P3TAgl9lF8JnT2ml04Dfrx5-LnwOkp2OQ8faHJd8W4L0MlQ3U50w5ShdUjQ1KTCc4r2IIFx3T-rDGKi3V6ACfF9Wg05PuZb1wWY8vg/s72-c/01-2.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5391756727274905428.post-1966178810051051752</id><published>2015-11-16T15:16:00.000+09:00</published><updated>2015-11-16T15:16:24.503+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MongoDB"/><title type='text'>Windows版MongoDBのインストール場所が変わってた</title><content type='html'>&lt;p&gt;新たにインストーラーを使ってインストールしたら動きませんでした。どうもインストールの場所が変わったらしいです、MongoDB自体は以下の場所にありました。&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
C:\Program Files\MongoDB\Server\3.0\bin
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;OS的にはまともな場所に移動したのだと思いますが、ここでmongodを叩いてもうごきませんでした。C:\data\db\が無いと言われます、データ自体はそこに置くみたいですね。dataでは分かりにくいのでmongodbにしてC:\mongodb\dbを作成し以下で起動しました。&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
&quot;C:\Program Files\MongoDB\Server\3.0\bin\mongod&quot; --dbpath C:\mongodb\db
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;これでbatを作ればとりあえず動きました。&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/1966178810051051752/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kakurenboman.blogspot.com/2015/11/windowsmongodb.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/1966178810051051752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/1966178810051051752'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/2015/11/windowsmongodb.html' title='Windows版MongoDBのインストール場所が変わってた'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5391756727274905428.post-8320022613387561758</id><published>2015-10-23T18:50:00.001+09:00</published><updated>2015-10-23T18:59:51.540+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Heroku"/><category scheme="http://www.blogger.com/atom/ns#" term="Node.js"/><title type='text'>HerokuのAccess is Denied</title><content type='html'>&lt;p&gt;久しぶりにHerokuにログインしたら何故かできない&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
C:\Users\xxx\AppData\Local\heroku\xxxxxxx\file Access is Denied
C:\Users\xxx\AppData\Local\heroku\node-v4.2.1-windows-x86\bin\node.exe Access is Denied
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;こういう感じのエラーを吐いてました、gitでプッシュは普通に出来ているのでtoolbelt関係なのだろうと思ってましたがGoogleで調べても英文でも同じ症状の人が見当たらない。&lt;br&gt;
何かやってしまったかなと思いtoolbeltを再インストールしても治らない。&lt;/p&gt;
&lt;p&gt;想像するにはAppDataのどこかでアクセス権限が変わってしまい、Herokuがアクセス出来ないのではと思い以下以降を削除&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
C:\Users\xxx\AppData\Local\heroku
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;この状態でtoolbeltを再インストールで治りました。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/8320022613387561758/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kakurenboman.blogspot.com/2015/10/herokuaccess-is-denied.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/8320022613387561758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/8320022613387561758'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/2015/10/herokuaccess-is-denied.html' title='HerokuのAccess is Denied'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5391756727274905428.post-8722121906306739959</id><published>2015-10-19T13:07:00.002+09:00</published><updated>2015-10-19T13:07:32.593+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Node.js"/><title type='text'>クロスドメインでjson通信する方法</title><content type='html'>&lt;p&gt;わりと普通に存在してた&lt;/p&gt;
&lt;a href=&quot;https://developer.mozilla.org/ja/docs/HTTP_access_control&quot;&gt;https://developer.mozilla.org/ja/docs/HTTP_access_control&lt;/a&gt;
&lt;p&gt;結果&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.htacessに書く&lt;/li&gt;
&lt;li&gt;httpヘッダーに書く&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;.htaccess&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
Header append Access-Control-Allow-Origin *
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;httpヘッダー&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
Access-Control-Allow-Origin: *
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;nodeでhttpヘッダー書く場合&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
res.setHeader(&#39;Access-Control-Allow-Origin&#39;, &#39;*&#39;);
&lt;/pre&gt;&lt;/code&gt;
</content><link rel='replies' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/8722121906306739959/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kakurenboman.blogspot.com/2015/10/json.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/8722121906306739959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/8722121906306739959'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/2015/10/json.html' title='クロスドメインでjson通信する方法'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5391756727274905428.post-2150108764918242481</id><published>2015-10-16T15:15:00.000+09:00</published><updated>2015-10-16T15:15:28.778+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Node.js"/><title type='text'>Node.jsからのセットクッキー</title><content type='html'>&lt;p&gt;&lt;a href=&quot;https://nodejs.org/api/http.html&quot;&gt;nodeのドキュメント&lt;/a&gt;のコピペ&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
response.setHeader(&quot;Set-Cookie&quot;, [&quot;type=ninja&quot;, &quot;language=javascript&quot;]);
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;つまりこうかな？&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
var http  = require(&#39;http&#39;),
   server = http.createServer();
server.on(&#39;request&#39;, doRequest);
server.listen(3000);
function doRequest(req, res) {
   res.setHeader(&#39;Content-Type&#39;, &#39;text/plain&#39;);
   res.setHeader(&quot;Set-Cookie&quot;, [&quot;type=ninja&quot;, &quot;language=javascript&quot;]);
   res.end(&#39;OK!!&#39;);
}
&lt;/pre&gt;&lt;/code&gt;
</content><link rel='replies' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/2150108764918242481/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kakurenboman.blogspot.com/2015/10/nodejs.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/2150108764918242481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/2150108764918242481'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/2015/10/nodejs.html' title='Node.jsからのセットクッキー'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5391756727274905428.post-6036167945261323592</id><published>2015-10-15T14:41:00.002+09:00</published><updated>2015-10-15T14:43:40.627+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Facebook"/><category scheme="http://www.blogger.com/atom/ns#" term="Heroku"/><category scheme="http://www.blogger.com/atom/ns#" term="Javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="Node.js"/><title type='text'>FacebookのAPIが変わってた</title><content type='html'>&lt;p&gt;App登録は終わってるものとします。&lt;/p&gt;
&lt;p&gt;GETで以下にアクセスする&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
https://graph.facebook.com/oauth/authorize?client_id={app-id}&amp;redirect_uri={redirect-uri}&amp;scope={scope}
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;{app-id}はApp登録した時のID{redirect-uri}はValid OAuth redirect URIsに設定したredirectでないとエラーを履いてました。&lt;/p&gt;
&lt;p&gt;リダイレクトしたURLにcodeがついてくる&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
{redirect-uri}?code={code}
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;{code}はまぁまぁ長いわけがわからない文字列です。&lt;/p&gt;
&lt;p&gt;{code}を使って以下をPOST&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
https://graph.facebook.com/oauth/access_token
{
client_id: {app-id},
client_secret: {app-secre},
redirect_uri: {redirect-uri},
grant_type: &#39;authorization_code&#39;,
code: {code}
}
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;grant_typeはよくわかりませんが用途に応じて変えるようです。&lt;/p&gt;
&lt;a href=&quot;https://aaronparecki.com/articles/2012/07/29/1/oauth2-simplified&quot;&gt;https://aaronparecki.com/articles/2012/07/29/1/oauth2-simplified&lt;/a&gt;
&lt;p&gt;上記のサイトのWeb Server Appsではauthorization_codeを指定しています。他にはgrant_type=passwordやgrant_type=client_credentialsがあるようですが、無くても同じ動作をしていました。成功すれば以下のような文字列が返ってきます。&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
access_token={access_token}&amp;expires={expires}
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;私はこれでも十分なのですが有効期限が1～2時間らしく、この有効期限を60日に伸ばすことができるそうです。&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
https://graph.facebook.com/oauth/access_token
{
client_id: {app-id},
client_secret: {app-secre},
redirect_uri: {redirect-uri},
grant_type: &#39;fb_exchange_token&#39;,
fb_exchange_token: {access_token}
}
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;これで60日間有効なトークンがもらえるそうです。あとはテキトーに&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
https://graph.facebook.com/me?access_token={access_token}
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;なんでこんな作りにしたんやろ？&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/6036167945261323592/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kakurenboman.blogspot.com/2015/10/facebookapi.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/6036167945261323592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/6036167945261323592'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/2015/10/facebookapi.html' title='FacebookのAPIが変わってた'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5391756727274905428.post-8650124454024702890</id><published>2015-10-14T15:52:00.000+09:00</published><updated>2015-10-14T15:52:50.248+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Heroku"/><category scheme="http://www.blogger.com/atom/ns#" term="Node.js"/><title type='text'>HerokuにNodeのモジュールを入れる</title><content type='html'>&lt;p&gt;package.jsonに書けばいいらしいです。&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
{
 &quot;name&quot;: &quot;xxxxxx&quot;,
 &quot;version&quot;: &quot;0.0.1&quot;,
 &quot;scripts&quot;: {
  &quot;start&quot;: &quot;node app.js&quot;
 },
 &quot;dependencies&quot;: {
  &quot;request&quot;: &quot;2.61.0&quot;
 },
 &quot;engines&quot;: {
  &quot;node&quot;: &quot;0.12.x&quot;,
  &quot;npm&quot;:  &quot;2.11.3&quot;
 }
}
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;dependenciesにモジュールを書けばいいみたいです。どうもバージョンも書かないといけない雰囲気なので今使っているモジュールのバージョンを知る必要があります。npmで以下を叩くとリストしてくれます。&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
&gt; npm list --depth=0
&lt;/pre&gt;&lt;/code&gt;</content><link rel='replies' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/8650124454024702890/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kakurenboman.blogspot.com/2015/10/herokunode.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/8650124454024702890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/8650124454024702890'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/2015/10/herokunode.html' title='HerokuにNodeのモジュールを入れる'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5391756727274905428.post-3869092759289562729</id><published>2015-10-13T16:18:00.002+09:00</published><updated>2015-10-13T18:28:12.083+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Heroku"/><title type='text'>herokuでの更新</title><content type='html'>&lt;p&gt;herokuにログインする&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
&gt; heroku login
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;プロジェクトのディレクトリまで移動する&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
&gt; cd xxx/xxx/projectname
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;gitに追加&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
&gt; git add .
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;gitになんかコメントいれるそんないつも書くことないんだけど・・・&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
&gt; git commit -m &quot;update&quot;
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;データをプッシュ&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
&gt; git push heroku master
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;コマンドプロンプトを使っているせいかなんか怒られる「Warning:Your console font probably doesn&#39;t support Unicode. If you experience strage character in the output, consider swithing to a TrueType font such as Lucida Console!」あなたのコンソールはユニコードをサポートしない、なんやったら「Lucida Console」に変えてみろと？&lt;/p&gt;
&lt;p&gt;面倒なので更新用のbatを作る&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
cd C:\Users\xxxxxx\xxxxxx
git add .
git commit -m &quot;update&quot;
git push heroku master
pause
&lt;/pre&gt;&lt;/code&gt;</content><link rel='replies' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/3869092759289562729/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kakurenboman.blogspot.com/2015/10/heroku.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/3869092759289562729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/3869092759289562729'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/2015/10/heroku.html' title='herokuでの更新'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5391756727274905428.post-4946803206927386708</id><published>2015-08-21T17:23:00.002+09:00</published><updated>2015-08-21T18:05:08.112+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MongoDB"/><category scheme="http://www.blogger.com/atom/ns#" term="Node.js"/><title type='text'>MongoDBをNode.jsで使ってみる</title><content type='html'>&lt;h2&gt;MongoDB&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.mongodb.org/downloads&quot; target=&quot;_blank&quot;&gt;mongodb&lt;/a&gt;をインストールする&lt;/p&gt;
&lt;p&gt;windowsの場合C:\mongodbにインストールされる&lt;/p&gt;
&lt;p&gt;データフォルダを適当なところに作る&lt;/p&gt;
&lt;p&gt;C:\mongodb\bin\mongod.exeがたぶんデーモンぽいので、batで起動できるようにしておく&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
start C:\mongodb\bin\mongod --dbpath C:\mongodb\db
start C:\mongodb\bin\mongo
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;--dbpathは起動オプションでデータフォルダC:\mongodb\dbを指定している&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=EhZTEA-hF3U&quot; target=&quot;_blank&quot;&gt;ここ&lt;/a&gt;にあったstart C:\mongodb\bin\mongoはたぶん直接コマンドラインでmongodbを操作するものだと思う&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
dbのリスト
&lt;code&gt;&lt;pre&gt;show dbs&lt;/pre&gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
どのdbを使うのかを指定testはdb名
&lt;code&gt;&lt;pre&gt;use test&lt;/pre&gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;NodeJSからMongoDBを操作してみる&lt;/h2&gt;
&lt;code&gt;&lt;pre&gt;
/*global console, require, process */
var mongoose = require(&#39;mongoose&#39;),
 Test,
 newtest;

//testというdbを使う
mongoose.connect(&#39;mongodb://localhost/test&#39;);
mongoose.model(&#39;Test&#39;, {name: String});
Test = mongoose.model(&#39;Test&#39;);

//適当なデータを入れてみる
newtest = new Test({name: &#39;aaaaaaaa&#39;});
newtest.save(function (err) {
 &#39;use strict&#39;;
 if (err) {
  console.log(err);
 }
});

//検索してみる
Test.find({}, function (err, doc) {
 &#39;use strict&#39;;
 console.log(err, doc);
});
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;mongooseを使ったほうがいいらしい&lt;/p&gt;
&lt;p&gt;mongodbはVisual C++が必要らしい&lt;/p&gt;

</content><link rel='replies' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/4946803206927386708/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kakurenboman.blogspot.com/2015/08/mongodbnodejs.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/4946803206927386708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/4946803206927386708'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/2015/08/mongodbnodejs.html' title='MongoDBをNode.jsで使ってみる'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5391756727274905428.post-5949854475660707037</id><published>2015-02-28T23:58:00.005+09:00</published><updated>2015-02-28T23:59:55.237+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><title type='text'>AndroidのTimerでsetTextを実行する場合</title><content type='html'>&lt;p&gt;Timerを使った場合以下のコードだとデバイス上でクラッシュします。&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
import android.os.Handler;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends ActionBarActivity {
    private Timer timer;
    private TimeTimerTask task;
    private Handler timeHandler;
    public TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = new TextView(this);
        setContentView(textView);

        timeHandler = new Handler();
        timer = new Timer(true);
        task = new TimeTimerTask();
        timer.schedule(task, 100, 1000);
    }

    public class TimeTimerTask extends TimerTask {
        @Override
        public void run() {
            Log.v(&quot;---&quot;, &quot;----&quot;);
            textView.setText(&quot;---------&quot;);
            timeHandler.post( new Runnable() {
                public void run() {
                }
            });
        }
    }
}
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;TimeTimerTaskクラスでLogだけだとエラーは発生しませんが、textView.setTextをクラッシュします。ところがRunnable上でtextView.setTextを行うと大丈夫らしいです。&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
    public class TimeTimerTask extends TimerTask {
        @Override
        public void run() {
            Log.v(&quot;---&quot;, &quot;----&quot;);
            timeHandler.post( new Runnable() {
                public void run() {
                    textView.setText(&quot;---------&quot;);
                }
            });
        }
    }
}
&lt;/pre&gt;&lt;/code&gt;</content><link rel='replies' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/5949854475660707037/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kakurenboman.blogspot.com/2015/02/androidtimersettext.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/5949854475660707037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/5949854475660707037'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/2015/02/androidtimersettext.html' title='AndroidのTimerでsetTextを実行する場合'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5391756727274905428.post-956819293174956515</id><published>2015-02-15T16:31:00.002+09:00</published><updated>2015-02-15T16:39:19.874+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="GAE/P"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><title type='text'>GAE/PでFacebook API</title><content type='html'>&lt;p&gt;GAE/PでFacebook APIを使うためにいろいろ調べましたが、どうも2011年頃に何があったのかPythonのSDKが見当たらない。&lt;/p&gt;
&lt;p&gt;ただ日本語で説明されている物は少ないのですが&lt;a href=&quot;https://github.com/pythonforfacebook/facebook-sdk&quot;&gt;facebook-sdk&lt;/a&gt;というFacebook Python SDKは見つけました。&lt;/p&gt;
&lt;p&gt;Installationに&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
$ pip install requests
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;と書かれていて嫌な予感がしつつもpipなるものを入れて実行してみてもGAE/Pのプロジェクトフォルダーには何の変化も起きない（そらそうだ）&lt;/p&gt;
&lt;p&gt;そこで、手動でやってみようと思ったのですが、どれがライブラリファイルなのかがわからない...。&lt;/p&gt;
&lt;p&gt;たぶん、__init__.pyというファイルが入っているフォルダーごとがライブラリっぽいきがします。&lt;/p&gt;
&lt;p&gt;GAE/Pのプロジェクトフォルダーに置くだけでは動かず、ログを見ると&lt;a href=&quot;https://github.com/kennethreitz/requests&quot;&gt;requests&lt;/a&gt;というライブラリも必要らしい&lt;/p&gt;
&lt;p&gt;requestsを置いてみてもまた新たなエラーが発生する、このエラーをググルとstackoverflowに「2.0.1を入れたらいいよ」と書かれている気がする英文を見つける&lt;/p&gt;
&lt;p&gt;しかし、githubで下位バージョンをどうやってダウンロードするのかがわからない&lt;/p&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNVTlNhveHI_YjIpmn1vPYFJMdV_ngf4SUvND2ndFys-MwNoYp1_fGwhIyTy96Ya_uLUVwbDfSIO6AioVnCM5Dd3K3aUTqIzVyoFYKBgG6_30aLQAkdNOWe5BHQJNK-G17TpMW6i72FOE/s1600/ss.gif&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNVTlNhveHI_YjIpmn1vPYFJMdV_ngf4SUvND2ndFys-MwNoYp1_fGwhIyTy96Ya_uLUVwbDfSIO6AioVnCM5Dd3K3aUTqIzVyoFYKBgG6_30aLQAkdNOWe5BHQJNK-G17TpMW6i72FOE/s320/ss.gif&quot; /&gt;&lt;/a&gt;
&lt;p&gt;さすがにコレはググルとすぐに出てきた。コレを置くとimpot facebookは成功したが、&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
import facebook
graph = facebook.GraphAPI(access_token=&#39;your_token&#39;, version=&#39;2.2&#39;)
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;Exampleに書かれているコードが動かない、そらそうだyour_tokenって書かれているんだから自分の自分のトークンを入れる必要があるそうで、調べて見つかったのが&lt;a href=&quot;https://developers.facebook.com/tools/accesstoken/&quot;&gt;Access Token Tool&lt;/a&gt;。ここでUser Tokenを生成して設定するといけそうなんですが、どう考えてもこれは私個人のAccess Tokenで私個人の情報しか参照出来ないはず。&lt;/p&gt;
&lt;p&gt;いくら探してもこのライブラリでAccess Tokenの取得の仕方がわからないので、オフィシャルっぽいすごく丁寧に説明されているページに不時着&lt;a href=&quot;http://fb.dev-plus.jp/reference/coreconcepts/authentication/user-login/&quot;&gt;http://fb.dev-plus.jp/reference/coreconcepts/authentication/user-login/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;まずブラウザー側でユーザー側のログインチェックとアプリの承認をするためfacebookに移動する&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&amp;redirect_uri=YOUR_URL&amp;scope=email,read_stream
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;redirect_uriに設定したURLに認証コードと共にリダイレクトされます。scopeは今は無視。&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
http://YOUR_URL?code=A_CODE_GENERATED_BY_SERVER
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;このコード見て「Access Tokenｷﾀ━━━━(ﾟ∀ﾟ)━━━━ !!!!!」となってアクセスするもエラーで返り討ちされ轟沈。よくよむと「このコードを手に入れることによってあなたのアプリはアプリ認証のステップに進み、APIを呼び出す際に必要なaccess tokenを入手することが出来るのです。」だそうです&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
https://graph.facebook.com/oauth/access_token?client_id=YOUR_APP_ID&amp;redirect_uri=YOUR_URL&amp;     client_secret=YOUR_APP_SECRET&amp;code=THE_CODE_FROM_ABOVE
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;これで晴れてaccess_tokenがもらえるのですが、このclient_secretはブラウザー側でやってしまうのは問題がありそうなので、コードをサーバ側に投げてサーバ側でaccess_tokenを取得しようと思います。その通信は先ほど入れたrequestsのライブラリが使えそうなので使ってみることにしました。&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
code = self.request.get(&#39;code&#39;)
url = &#39;https://graph.facebook.com/oauth/access_token&#39;
url += &#39;?client_id=&#39; + FACEBOOK_APP_ID
url += &#39;&amp;redirect_uri=YOUR_URL&#39;
url += &#39;&amp;client_secret=&#39; + FACEBOOK_APP_SECRET
url += &#39;&amp;code=&#39; + code
res = requests.get(url).text
logging.info(res)
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;ここまできたら後は簡単で返ってきた文字列からaccess_tokenを取り出してgraphに投げるだけです。&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
url = &#39;https://graph.facebook.com/me?access_token=&#39; + access_token
content = requests.get(url).json()
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;最後に気づいたことはFacebook Python SDKを使い忘れていました、ここまでをSDKで楽したかったのですが、「ここから楽できますよ～」だったら、私には必要がなかったのかもしれません。&lt;/p&gt;
&lt;p&gt;別件ですが、この件で調べている間にどこかのブログでライブラリを一つのフォルダにまとめる方法を見つけました、appengine_config.pyという設定ファイルがGAEにあるらしくそれを作成し以下のように書けばいいそうです。&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
import os
import sys 
ROOTPATH = os.path.dirname(__file__)
LIBPATH = os.path.join(ROOTPATH, &#39;libs&#39;)
sys.path.append(LIBPATH)
&lt;/pre&gt;&lt;/code&gt;

</content><link rel='replies' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/956819293174956515/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kakurenboman.blogspot.com/2015/02/gaepfacebook-api.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/956819293174956515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/956819293174956515'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/2015/02/gaepfacebook-api.html' title='GAE/PでFacebook API'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNVTlNhveHI_YjIpmn1vPYFJMdV_ngf4SUvND2ndFys-MwNoYp1_fGwhIyTy96Ya_uLUVwbDfSIO6AioVnCM5Dd3K3aUTqIzVyoFYKBgG6_30aLQAkdNOWe5BHQJNK-G17TpMW6i72FOE/s72-c/ss.gif" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5391756727274905428.post-871264883840116551</id><published>2015-02-12T02:35:00.002+09:00</published><updated>2015-02-12T02:35:20.162+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Heroku"/><category scheme="http://www.blogger.com/atom/ns#" term="Javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="Node.js"/><title type='text'>Herokuでnode.jsのテスト、とりあえずExpressは未使用</title><content type='html'>&lt;p&gt;node.jsをインストール&lt;a href=&quot;http://nodejs.org/&quot;&gt;http://nodejs.org/&lt;/a&gt;適当にプロジェクトフォルダを作ってそこに「Hello World」を表示するjsを作成&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
var http = require(&#39;http&#39;);
http.createServer(function (req, res) {
 &#39;use strict&#39;;
 res.writeHead(200, {&#39;Content-Type&#39;: &#39;text/plain&#39;});
 res.end(&#39;Hello World\n&#39;);
}).listen(process.env.PORT || 3000);
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;これをapp.jsとして保存。&lt;/p&gt;
&lt;p&gt;次にpackage.jsonっていうファイルを作る&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
{
  &quot;name&quot;: &quot;プロジェクトの名前&quot;,
  &quot;version&quot;: &quot;0.0.1&quot;,
  &quot;scripts&quot;: {
    &quot;start&quot;: &quot;node app.js&quot;
  },
  &quot;engines&quot;: {
    &quot;node&quot;: &quot;0.10.x&quot;
  }
}
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;次にProcfileっていうファイルを作る&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
web: node app.js
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;&lt;a href=&quot;http://heroku.com&quot;&gt;Heroku&lt;/a&gt;でアカウントを作る。&lt;p&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkeF0Ab6F-k6wFf-dkBvV8gP-uTSg8dYe7PbVec-0PNIVd9sfgKTkSRjnrQ6sY3OI-k9KCtK2X9zt5lx11BgAjRsIpmCDu5Ht33W4BecmIDwYO7F7I3Cvnbtn52qZ0EzXNL9WLEwYM_ao/s1600/heroku.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkeF0Ab6F-k6wFf-dkBvV8gP-uTSg8dYe7PbVec-0PNIVd9sfgKTkSRjnrQ6sY3OI-k9KCtK2X9zt5lx11BgAjRsIpmCDu5Ht33W4BecmIDwYO7F7I3Cvnbtn52qZ0EzXNL9WLEwYM_ao/s320/heroku.jpg&quot; /&gt;&lt;/a&gt;
&lt;p&gt;&lt;a href=&quot;https://toolbelt.herokuapp.com/&quot;&gt;heroku toolbelt&lt;/a&gt;をインストールする&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
&gt; heroku login
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;プロジェクトのフォルダーまで移動して、Herokuのプロジェクトを作る&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
&gt; heroku create プロジェクトの名前
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;次にgitの設定&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
&gt; git init
&gt; git add .
&gt; git commit -m &quot;initial commit&quot;
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;SSHの公開鍵の作成と追加&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
&gt; ssh-keygen -t rsa
&gt; heroku keys:add
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;Deploy&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
&gt; git remote add heroku git@heroku.com:プロジェクトの名前.git
&gt; git push heroku master
&lt;/pre&gt;&lt;/code&gt;




</content><link rel='replies' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/871264883840116551/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kakurenboman.blogspot.com/2015/02/herokunodejsexpress.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/871264883840116551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/871264883840116551'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/2015/02/herokunodejsexpress.html' title='Herokuでnode.jsのテスト、とりあえずExpressは未使用'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkeF0Ab6F-k6wFf-dkBvV8gP-uTSg8dYe7PbVec-0PNIVd9sfgKTkSRjnrQ6sY3OI-k9KCtK2X9zt5lx11BgAjRsIpmCDu5Ht33W4BecmIDwYO7F7I3Cvnbtn52qZ0EzXNL9WLEwYM_ao/s72-c/heroku.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5391756727274905428.post-2892416235763929695</id><published>2014-05-02T19:41:00.001+09:00</published><updated>2014-05-02T19:41:55.428+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Unity"/><title type='text'>Unity C# シングルトン</title><content type='html'>&lt;p&gt;Unityでシーン間の変数のやり取りを、どうしていいのかわかりません。PlayerPrefsでいちいち保存するという方法もあるらしいですが、保存するほどのことでも無い、アプリ全体に対するグローバル変数的な物がほしい。&lt;/p&gt;
&lt;p&gt;で、ググると「シングルトン」だそうです、ActionScriptやJavaでしかシングルトンを書いたことが無い知識でシングルトンを書くと全く動かないし、エラーがでまくります。&lt;/p&gt;
&lt;p&gt;さらにググるといろんな書き方があってさらに混乱・・・。というかコンポーネントとして追加して作るのか、動的にコンポーネントを追加するのか？とかUnityの作法がさっぱりわからない。&lt;/p&gt;
&lt;p&gt;とりあえず動いたものは以下&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;using UnityEngine;
using System.Collections;

public class SingletonMonoBehaviour&lt;T&gt; : MonoBehaviour where T : MonoBehaviour {

 protected static T instance;

 public static T Instance {
  get {
   if (instance == null) {
    instance = (T) FindObjectOfType(typeof(T));
    if (instance == null) {
     Debug.LogError(typeof(T) + &quot; is needed.&quot;);
    }
   }
   return instance;
  }
 }

 protected void Awake () {
  if (this != Instance) {
   Destroy(this);
   return;
  }
  DontDestroyOnLoad(this.gameObject);
 }
}
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;次に上記を継承したクラスを作成&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;using UnityEngine;
using System.Collections;

public class Config : SingletonMonoBehaviour&lt;Config&gt; {
 //テスト用の出力
 private int num = 0;
 void Update () {
  ++num;
  Debug.Log (&quot;num:&quot; + num);
 }
}
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;これを各シーンにGameObject &gt; Create Emptyして空のオブジェクトにコンポーネントとしてスクリプトを追加する、一応動いた・・・。だけど実はC# ジェネリクスがあまり理解していない。要は継承した場合型変わるからだと思われる。なので理解するために以下もテスト&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;using UnityEngine;
using System.Collections;

public class Alon : MonoBehaviour {

 protected static Alon instance;
 
 public static Alon Instance {
  get {
   if (instance == null) {
    instance = (Alon) FindObjectOfType(typeof(Alon));
    if (instance == null) {
     Debug.LogError(&quot;Alon is needed.&quot;);
    }
   }
   return instance;
  }
 }
 
 protected void Awake () {
  if (this != Instance) {
   Destroy(this);
   return;
  }
  DontDestroyOnLoad(this.gameObject);
 }
}
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;つまりnewしないらしい、newの代わりにGameObjectを作成してコンポーネントとして追加する。ここまでは理解できたんですが、これをテストしている時にHierarchyを見ると、シングルトンを設定したGameObjectが二つ見える・・・。&lt;/p&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEFkDnNNRwhyv36rKYkdFgPGpUb95wz-wbFV1DB5_4XVbVvGIpkXRXE1xq849f-OMRSQrBE0G4imIGwGnXJKKRiMmyzKB4mejj7OdxnxsQ92QpeAaC_F3tzziVseaSx9AWy0FtVLLgyVE/s1600/2014-05-02-19.38.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEFkDnNNRwhyv36rKYkdFgPGpUb95wz-wbFV1DB5_4XVbVvGIpkXRXE1xq849f-OMRSQrBE0G4imIGwGnXJKKRiMmyzKB4mejj7OdxnxsQ92QpeAaC_F3tzziVseaSx9AWy0FtVLLgyVE/s320/2014-05-02-19.38.jpg&quot; /&gt;&lt;/a&gt;
&lt;p&gt;DontDestroyOnLoad(this.gameObject)で消してない、から？ただシーンを移動しても2つ以上になることはない・・・。&lt;/p&gt;
</content><link rel='replies' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/2892416235763929695/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kakurenboman.blogspot.com/2014/05/unity-c.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/2892416235763929695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/2892416235763929695'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/2014/05/unity-c.html' title='Unity C# シングルトン'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEFkDnNNRwhyv36rKYkdFgPGpUb95wz-wbFV1DB5_4XVbVvGIpkXRXE1xq849f-OMRSQrBE0G4imIGwGnXJKKRiMmyzKB4mejj7OdxnxsQ92QpeAaC_F3tzziVseaSx9AWy0FtVLLgyVE/s72-c/2014-05-02-19.38.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5391756727274905428.post-7744403648667737450</id><published>2014-04-09T00:49:00.002+09:00</published><updated>2014-04-09T00:52:45.441+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Unity"/><title type='text'>Unity3D Android Plugin</title><content type='html'>&lt;p&gt;Activityを上書きする方法とかいろいろできる分情報が錯綜していて難しい。&lt;br&gt;
そこで、おそらく一番簡単な方法から始めてみます。&lt;/p&gt;

&lt;p&gt;Eclipseをインストール&lt;br&gt;
&lt;a herf=&quot;http://developer.android.com/intl/ja/sdk/index.html&quot; target=&quot;_blank&quot;&gt;http://developer.android.com/intl/ja/sdk/index.html&lt;/a&gt;&lt;br&gt;
Android SDK Managerで必要なバージョンのAPIを入れておく&lt;/p&gt;

&lt;p&gt;プロジェクトの作成&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuvi9jnXVo7TLyRB6KG4_iTyNQlfnZ0plYDdo2Qj0PQC8Dx9pLenp8p8vhLEKHYzoBGm2VN6DdNBlRT0GC_Vz1uSxUQgW_y0YSncB1zLrFfrxpqGde5gooGsZ0jnH9tP4LuHifq-WahtY/s1600/2014-04-07-19.25.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuvi9jnXVo7TLyRB6KG4_iTyNQlfnZ0plYDdo2Qj0PQC8Dx9pLenp8p8vhLEKHYzoBGm2VN6DdNBlRT0GC_Vz1uSxUQgW_y0YSncB1zLrFfrxpqGde5gooGsZ0jnH9tP4LuHifq-WahtY/s320/2014-04-07-19.25.jpg&quot; /&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfDcneuDkQC4HQmfhWL8bm1zkhK4DfsjQAQHB7x3drxY-yvDY4b390WYL5lwGlDVhMkux1bUbvdjQz78-31TtfVcPkni9xsfTfJWB2jh8EvbK0YCVgEdI416qiaE-L2g38m9z5EJUKLI4/s1600/2014-04-07-19.26.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfDcneuDkQC4HQmfhWL8bm1zkhK4DfsjQAQHB7x3drxY-yvDY4b390WYL5lwGlDVhMkux1bUbvdjQz78-31TtfVcPkni9xsfTfJWB2jh8EvbK0YCVgEdI416qiaE-L2g38m9z5EJUKLI4/s320/2014-04-07-19.26.jpg&quot; /&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp6dLxiw9IhrbRzsiVIYKNdzHdkOZwL7QOOelrZS_XiKf6mS2ZrwavFeTAa6cMaOU1DZCB4fBE14sMwtHidd65hvudHQKrWC1woZCFbrVqW0rQEs2l76romuu1kM-mhyVbwwArJLqgpZY/s1600/2014-04-07-19.26.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp6dLxiw9IhrbRzsiVIYKNdzHdkOZwL7QOOelrZS_XiKf6mS2ZrwavFeTAa6cMaOU1DZCB4fBE14sMwtHidd65hvudHQKrWC1woZCFbrVqW0rQEs2l76romuu1kM-mhyVbwwArJLqgpZY/s320/2014-04-07-19.26.jpg&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;パッケージの作成&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj39Ww-Pduz_bgKKTbmVyhkOOK9UPERI4T0Ka5DxAEAQ8DkS0IXv1lX4oTNesuakyNOaxcwohQ1o1qO5XFQi34AaL_zeT39oNBm_lhfvgmR6TyUd3EzpLpzDpK7uUC6aZbiIFn4q2swzto/s1600/2014-04-07-19.27.35.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj39Ww-Pduz_bgKKTbmVyhkOOK9UPERI4T0Ka5DxAEAQ8DkS0IXv1lX4oTNesuakyNOaxcwohQ1o1qO5XFQi34AaL_zeT39oNBm_lhfvgmR6TyUd3EzpLpzDpK7uUC6aZbiIFn4q2swzto/s320/2014-04-07-19.27.35.jpg&quot; /&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghjS9eyrmoVOtSXp4iAniwYua3GzwTeJGyxBqVBkPW6O4ADza3qieKlFCLNxeHBFbu-hcuY5IrD010Vk3fHQfvxySILqxSionAI4jVZ_SHs_VidtSW1CCxosYK-xXcZzVq9-vaImuhIrk/s1600/2014-04-07-19.28.09.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghjS9eyrmoVOtSXp4iAniwYua3GzwTeJGyxBqVBkPW6O4ADza3qieKlFCLNxeHBFbu-hcuY5IrD010Vk3fHQfvxySILqxSionAI4jVZ_SHs_VidtSW1CCxosYK-xXcZzVq9-vaImuhIrk/s320/2014-04-07-19.28.09.jpg&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;クラスの作成&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikk_riMeJx9NaqSruwNR30ENj6wNcrveFRntJtHWvNg16g4K1rAsV_O4eUp6Rx8FTgtaYlm6C2M4oSOdnj4SJNxXmGMX9bVKD_J3Rwavx6K2otq2KHxcejyGEvv1C_Munaj5-PK1ctuAU/s1600/2014-04-07-19.28.16.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikk_riMeJx9NaqSruwNR30ENj6wNcrveFRntJtHWvNg16g4K1rAsV_O4eUp6Rx8FTgtaYlm6C2M4oSOdnj4SJNxXmGMX9bVKD_J3Rwavx6K2otq2KHxcejyGEvv1C_Munaj5-PK1ctuAU/s320/2014-04-07-19.28.16.jpg&quot; /&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWwCJ3WLX-FgwBgN9uzwn_P1ooQWFLAvEiNHr32Na7OmVuf7BuW1m89AGh7_MWZb-bdaC7LkcsXAkGH0bl6Gw32B99oSofBaUP4x8V30RddmFBWph5pot6LdG24csteyoz9N56R5ON2bA/s1600/2014-04-07-19.28.43.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWwCJ3WLX-FgwBgN9uzwn_P1ooQWFLAvEiNHr32Na7OmVuf7BuW1m89AGh7_MWZb-bdaC7LkcsXAkGH0bl6Gw32B99oSofBaUP4x8V30RddmFBWph5pot6LdG24csteyoz9N56R5ON2bA/s320/2014-04-07-19.28.43.jpg&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;code&gt;&lt;pre&gt;package com.example.testplugin;

import android.util.log;

public class Plugin {
   public void func (final String str)
   {
      Log.d(&quot;Unity&quot;, str);
   }
}
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;Unityにプラグイン用のフォルダの作成&lt;br&gt;
Assets &gt; Plugins &gt; Android&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEdVq129XV5GAvsr-6Xd1i8_SwYyZXrzjtgMYvAT2XNGx94kgn9yaxScPUIZS6nxIyjtnPMuC7M1qBhx_R4NBS3URajsYpjOuUkvbu2G-QUyjHc2SNgApysT1872GqmeD7SlqWBQR_hT4/s1600/2014-04-07-19.36.10.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEdVq129XV5GAvsr-6Xd1i8_SwYyZXrzjtgMYvAT2XNGx94kgn9yaxScPUIZS6nxIyjtnPMuC7M1qBhx_R4NBS3URajsYpjOuUkvbu2G-QUyjHc2SNgApysT1872GqmeD7SlqWBQR_hT4/s320/2014-04-07-19.36.10.jpg&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Assets &gt; Pluginsにプラグイン用のファイルの作成&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUAY8RTtsvkO1aOwhqpOe0cPzUXmRxcKh0WlTnwOblXK-5b8mZPvbK9ciyHZmk-YhkxAZA2yYXWf3fvjgg-VvWMCuocIF5IOiYLASinO8hb3-KscMPuGSLZL6nvnAjg5ljfIlU6lBisHw/s1600/2014-04-07-19.36.27.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUAY8RTtsvkO1aOwhqpOe0cPzUXmRxcKh0WlTnwOblXK-5b8mZPvbK9ciyHZmk-YhkxAZA2yYXWf3fvjgg-VvWMCuocIF5IOiYLASinO8hb3-KscMPuGSLZL6nvnAjg5ljfIlU6lBisHw/s320/2014-04-07-19.36.27.jpg&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;code&gt;&lt;pre&gt;#pragma strict

import System.Runtime.InteropServices;
import System;

#if UNITY_ANDROID &amp;&amp; !UNITY_EDITOR

static function Send() {
   var plugin = new AndroidJavaObject(&quot;com.example.testplugin.Plugin&quot;);
   plugin.Call(&quot;func&quot;, &quot;maido!&quot;);
}

#elese

static function Send() {
   Debug.Log(&quot;maido!&quot;);
}
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;上記のプラグインを呼び出すスクリプトを書いて適当なオブジェクトに追加する&lt;/p&gt;

&lt;code&gt;&lt;pre&gt;
#pragma strict

function Update () {
   PluginBind.Send();
}
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;作成したフォルダ「Assets/Plugins/Android」に.jarをExportする&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgnEFkFpEZyaeoMCcqV1CAL0oZwNYe-RHwtXIKT3cL-P39LT1-MK3seR-6CLhzEzEEPJKCOVmLMI1wnI1gZJAValDDjheH9nMFIA3DdLhlEeYQBNsuvRqHrvITY9dI6-FIkvk_k55135A/s1600/2014-04-07-19.42.02.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgnEFkFpEZyaeoMCcqV1CAL0oZwNYe-RHwtXIKT3cL-P39LT1-MK3seR-6CLhzEzEEPJKCOVmLMI1wnI1gZJAValDDjheH9nMFIA3DdLhlEeYQBNsuvRqHrvITY9dI6-FIkvk_k55135A/s320/2014-04-07-19.42.02.jpg&quot; /&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvfEybd2lH7IiIhZy4uQ-rLR0Zp_AP5ZIqJUl9P-Z4IyzYcd6K3OnMEGT8IC-nAl3VoH0S3Wyb6_rjEgUymVaDPepZ75ThlLWDuMq0Pejv2kEsgz324xY3_AJuzN14jBZKl8fESiJCya0/s1600/2014-04-07-19.42.09.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvfEybd2lH7IiIhZy4uQ-rLR0Zp_AP5ZIqJUl9P-Z4IyzYcd6K3OnMEGT8IC-nAl3VoH0S3Wyb6_rjEgUymVaDPepZ75ThlLWDuMq0Pejv2kEsgz324xY3_AJuzN14jBZKl8fESiJCya0/s320/2014-04-07-19.42.09.jpg&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;unityでbuildしてテストし、eclipseでログをチェック&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOW3ZBIbV2spvCAE3pUo9VAM9PkDKuElY2v7u09cjw4WBJGk878gxsKfY-n_Irln2fMeFQS48GtPPKwE9_jdOeS1BeP9iX9hnRPQPYKCAGM3XgOailAr4tFQRyNb9qFLHPof7fdhhzQlM/s1600/2014-04-07-19.52.13.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOW3ZBIbV2spvCAE3pUo9VAM9PkDKuElY2v7u09cjw4WBJGk878gxsKfY-n_Irln2fMeFQS48GtPPKwE9_jdOeS1BeP9iX9hnRPQPYKCAGM3XgOailAr4tFQRyNb9qFLHPof7fdhhzQlM/s320/2014-04-07-19.52.13.jpg&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;com.unity3d.player.UnityPlayerを使わない場合はこれでいけそうです、ただandroidはcontextが必要な場合が多いし、Java側からのコールバックがほしいので、ここからcom.unity3d.player.UnityPlayerを使ってみます&lt;/p&gt;

&lt;p&gt;classes.jarが必要です、WindowsはC:\Program Files (x86)\Unity\Editor\Data\PlaybackEngines\androidplayer\bin\classes.jar、Macは/Applications/Unity/content/PlaybackEngines/AndroidPlayer/bin/直接はアクセス出来なかったので（他に方法があるかもしれません）アプリを右クリックして「パッケージの内容を表示」で開けました。&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipyG9JZXPWnyUMWYrNqcnf3Nsvby1zrlo0wks3KTst98-qVuta5-50B3O6PFkkTDHGO7bMFd3IfdkH9QZ7NrcqJowFjK1oGmeP_7JzZ0FfnINF-gGkcqWDgei41026aVVlhvF_ncXzI78/s1600/mac.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipyG9JZXPWnyUMWYrNqcnf3Nsvby1zrlo0wks3KTst98-qVuta5-50B3O6PFkkTDHGO7bMFd3IfdkH9QZ7NrcqJowFjK1oGmeP_7JzZ0FfnINF-gGkcqWDgei41026aVVlhvF_ncXzI78/s320/mac.jpg&quot; /&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihtxzNaDs0iVvDelCtFu9nrhQa09kpZTpRgnzg5SMA9Vne51i155LI2RXU86oRT5oOaTTNvldBfmLYWXoTn11zVBFcKjqH0CNjT3snYxrOK50MshSTY2nBJ5odvcFkrBLzHXlnrLO06aw/s1600/mac2.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihtxzNaDs0iVvDelCtFu9nrhQa09kpZTpRgnzg5SMA9Vne51i155LI2RXU86oRT5oOaTTNvldBfmLYWXoTn11zVBFcKjqH0CNjT3snYxrOK50MshSTY2nBJ5odvcFkrBLzHXlnrLO06aw/s320/mac2.jpg&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;eclipseのライブラリに追加する&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWo53p-9nZY4d8J2gCV56fQ4FE5d6SMPVPMFKBWv1C24WiAu66emh0pWhzdJSpa4uQUueeCQPHnlEsx8LnycgCOgYNAziP_e1SxXWdH6PLvQOp4s5v46KTKzSFdjoA0Xy9AjpngVW9tfk/s1600/prop.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWo53p-9nZY4d8J2gCV56fQ4FE5d6SMPVPMFKBWv1C24WiAu66emh0pWhzdJSpa4uQUueeCQPHnlEsx8LnycgCOgYNAziP_e1SxXWdH6PLvQOp4s5v46KTKzSFdjoA0Xy9AjpngVW9tfk/s320/prop.jpg&quot; /&gt;&lt;/a&gt;
&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7K4l_o0QQAUuylv9HjZDInoM9Z6a4wkrrLeKAyIAX5N8utXzWcsd1MBkqFluUs7RszfZTtg7Bma_VtJXJFe84JviOxlWaf3AqE7TeuP8SDorloqW60JkBetNYwUYdwtS8p6BjYYyYI-s/s1600/addjar.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7K4l_o0QQAUuylv9HjZDInoM9Z6a4wkrrLeKAyIAX5N8utXzWcsd1MBkqFluUs7RszfZTtg7Bma_VtJXJFe84JviOxlWaf3AqE7TeuP8SDorloqW60JkBetNYwUYdwtS8p6BjYYyYI-s/s320/addjar.jpg&quot; /&gt;&lt;/a&gt;
&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;UnitySendMessageを使ってみます。&lt;/p&gt;

&lt;code&gt;&lt;pre&gt;package com.example.testplugin;

import com.unity3d.player.UnityPlayer;

import android.util.log;

public class Plugin {
   public void func (final String str)
   {
      Log.d(&quot;Unity&quot;, str);
      UnityPlayer.UnitySendMessage(&quot;Object&quot;, &quot;Callback&quot;, &quot;Java kara Maidl!&quot;);
   }
}
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;Unity側のFunctionを書く&lt;/p&gt;

&lt;code&gt;&lt;pre&gt;
#pragma strict

var val = &quot;&quot;;

function Update () {
   PluginBind.Send();
}

function OnGUI () {
   GUI.Label( Rect(100, 100, 200, 200), val);
}

function Callback (str) {
   val = str;
}
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;ビルドしてテストする&lt;br&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVIzivENsWObDsrjkLUHe2JwKGGup5XJqCoODEHU9DckBS1idcDX9FYBJDbg1CbSGrc67UyF-enwF6AgtTHSVnDEBHS9vAs75IEllATINvaLhbx6BAPOmK-UmYplX3CGYFIHAYLE350Jk/s1600/Screenshot_2014-04-07-20-21-36.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVIzivENsWObDsrjkLUHe2JwKGGup5XJqCoODEHU9DckBS1idcDX9FYBJDbg1CbSGrc67UyF-enwF6AgtTHSVnDEBHS9vAs75IEllATINvaLhbx6BAPOmK-UmYplX3CGYFIHAYLE350Jk/s320/Screenshot_2014-04-07-20-21-36.jpg&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;








</content><link rel='replies' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/7744403648667737450/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kakurenboman.blogspot.com/2014/04/unity3d-android-plugin.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/7744403648667737450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/7744403648667737450'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/2014/04/unity3d-android-plugin.html' title='Unity3D Android Plugin'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuvi9jnXVo7TLyRB6KG4_iTyNQlfnZ0plYDdo2Qj0PQC8Dx9pLenp8p8vhLEKHYzoBGm2VN6DdNBlRT0GC_Vz1uSxUQgW_y0YSncB1zLrFfrxpqGde5gooGsZ0jnH9tP4LuHifq-WahtY/s72-c/2014-04-07-19.25.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5391756727274905428.post-7471397349852705378</id><published>2014-04-05T19:17:00.001+09:00</published><updated>2014-04-10T13:33:38.900+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Datastore"/><category scheme="http://www.blogger.com/atom/ns#" term="GAE"/><category scheme="http://www.blogger.com/atom/ns#" term="GAE/P"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><title type='text'>Google App Engine Python Datastore</title><content type='html'>&lt;p&gt;AWSとかいろいろ調べた結果一番実験し易いPaaSはGAEでは？と思いました、AWSのPaaSはEC2上にあるのでPaaSというイメージはあまりしませんね。GAEでの言語はJavaが良さそうなのですが、仕事上eclipseを触りたく無いし、またPHPはDatastoreの使い方が全くわからなかったのでPythonを新たに勉強してみます。&lt;/p&gt;

&lt;h2&gt;Datastore NDB&lt;/h2&gt;

&lt;p&gt;とりあえず、Datastoreだけ&lt;/p&gt;

&lt;code&gt;&lt;pre&gt;from google.appengine.ext import ndb
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;ndb.Model&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;class FirstModel(ndb.Model):
    prop = db.IntegerProperty()

class DataClass(ndb.Model):
    string = ndb.StringProperty(indexed=False)
    type = ndb.StringProperty(required=True, choices=set([&quot;cat&quot;, &quot;dog&quot;, &quot;bird&quot;]))
    list = ndb.StringListProperty()
    body = ndb.TextProperty()
    int = ndb.IntegerProperty(default=0)
    float = ndb.FloatProperty(required=True)
    blob = ndb.BlobProperty()
    boolean = ndb.BooleanProperty()
    date = ndb.DateTimeProperty(auto_now_add=True)
    reference = ndb.ReferenceProperty(FirstModel)
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;
&lt;a herf=&quot;https://developers.google.com/appengine/docs/python/ndb/metadata?hl=ja#representations&quot; target=&quot;_blank&quot;&gt;https://developers.google.com/appengine/docs/python/ndb/metadata?hl=ja#representations&lt;/a&gt;&lt;br&gt;
&lt;a herf=&quot;https://developers.google.com/appengine/docs/python/datastore/typesandpropertyclasses?hl=ja&quot; target=&quot;_blank&quot;&gt;https://developers.google.com/appengine/docs/python/datastore/typesandpropertyclasses?hl=ja&lt;/a&gt;&lt;br&gt;
&lt;a herf=&quot;https://developers.google.com/appengine/docs/python/ndb/modelclass?hl=ja&quot; target=&quot;_blank&quot;&gt;https://developers.google.com/appengine/docs/python/ndb/modelclass?hl=ja&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
ndb.Modelから作ったデータストア用のクラスをKindと言うらしい。KindはSQLのテーブル的なものらしい。&lt;br&gt;
class DataClass(ndb.Model):&lt;br&gt;
これでndb.Modelを継承するらしい。
&lt;/p&gt;

&lt;h2&gt;Representation Types&lt;/h2&gt;
&lt;dl&gt;
&lt;dt&gt;StringProperty&lt;/dt&gt;
&lt;dd&gt;STRING/文字&lt;/dd&gt;
&lt;dt&gt;BooleanProperty&lt;/dt&gt;
&lt;dd&gt;BOOLEAN/ブール値&lt;/dd&gt;
&lt;dt&gt;IntegerProperty&lt;/dt&gt;
&lt;dd&gt;INT64/数字&lt;/dd&gt;
&lt;dt&gt;FloatProperty&lt;/dt&gt;
&lt;dd&gt;DOUBLE/小数点の数字&lt;/dd&gt;
&lt;dt&gt;DateTimeProperty&lt;/dt&gt;
&lt;dd&gt;INT64/時間&lt;/dd&gt;
&lt;dt&gt;DateProperty&lt;/dt&gt;
&lt;dd&gt;INT64/日付&lt;/dd&gt;
&lt;dt&gt;TimeProperty&lt;/dt&gt;
&lt;dd&gt;INT64/時間&lt;/dd&gt;
&lt;dt&gt;UserProperty&lt;/dt&gt;
&lt;dd&gt;USER/ユーザー&lt;/dd&gt;
&lt;dt&gt;BlobProperty&lt;/dt&gt;
&lt;dd&gt;STRING&lt;/dd&gt;
&lt;dt&gt;BlobKeyProperty&lt;/dt&gt;
&lt;dd&gt;STRING&lt;/dd&gt;
&lt;dt&gt;TextProperty&lt;/dt&gt;
&lt;dd&gt;STRING/文章&lt;/dd&gt;
&lt;dt&gt;GeoPtProperty&lt;/dt&gt;
&lt;dd&gt;POINT/座標&lt;/dd&gt;
&lt;dt&gt;GenericProperty&lt;/dt&gt;
&lt;dd&gt;&lt;/dd&gt;
&lt;dt&gt;ComputedProperty&lt;/dt&gt;
&lt;dd&gt;&lt;/dd&gt;
&lt;dt&gt;JsonProperty&lt;/dt&gt;
&lt;dd&gt;STRING&lt;/dd&gt;
&lt;dt&gt;PickleProperty&lt;/dt&gt;
&lt;dd&gt;STRING&lt;/dd&gt;
&lt;dt&gt;StructuredProperty&lt;/dt&gt;
&lt;dd&gt;ndb.Modelクラス&lt;/dd&gt;
&lt;dt&gt;LocalStructuredProperty&lt;/dt&gt;
&lt;dd&gt;STRING&lt;/dd&gt;
&lt;dt&gt;KeyProperty&lt;/dt&gt;
&lt;dd&gt;REFERENCE&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;試行錯誤の上動いたソース&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;# coding: utf-8
import cgi
import webapp2
import json
from google.appengine.ext import ndb

class UserData(ndb.Model):
 fid = ndb.StringProperty()
 fname = ndb.StringProperty()
 data = ndb.StringProperty()
 date = ndb.DateTimeProperty(auto_now_add=True)
 #関数が書けるってことはやはりクラスなんですね、Datastoreって面白いですね
 def to_list_dict(self):
  return dict({
   &#39;fid&#39;   : self.fid,
   &#39;fname&#39; : self.fname,
   &#39;data&#39;  : self.data,
   &#39;date&#39;  : str(self.date),
   &#39;id&#39;    : self.key.id()
  })

#
class MainHandler(webapp2.RequestHandler):
    def get(self):
  qry = UserData.query().fetch()
  body = &#39;&#39;
  
  if qry:
   res = []
   for entry in qry:
    res.append(entry.to_list_dict())
   body = json.dumps(res)
  else:
   body = &#39;{&quot;error&quot;:&quot;no query&quot;}&#39;
  
  self.response.headers[&#39;Content-Type&#39;] = &#39;application/json&#39;
  self.response.write(body)

#
class addHandler(webapp2.RequestHandler):
 def get(self):
  fid = self.request.get(&#39;fid&#39;)
  fname = self.request.get(&#39;fname&#39;)
  data = self.request.get(&#39;data&#39;)
  body = &#39;&#39;
  
  if fid:
   ud = UserData(fid=fid)
   if data:
    ud.data = data
   if fname:
    ud.fname = fname
   ud.put()
   body = &#39;{&quot;st&quot;:&quot;ok&quot;}&#39;
  else:
   body = &#39;{&quot;error&quot;:&quot;error&quot;}&#39;
  
  self.response.headers[&#39;Content-Type&#39;] = &#39;application/json&#39;
  self.response.write(body)

#
class PutHandler(webapp2.RequestHandler):
 def get(self):
  fid = self.request.get(&#39;fid&#39;)
  fname = self.request.get(&#39;fname&#39;)
  data = self.request.get(&#39;data&#39;)
  body = &#39;&#39;
  
  if fid:
   res = UserData.query(UserData.fid==fid).fetch()[0]
   if res:
    if fname:
     res.fname = fname
    res.put()
    body = &#39;{&quot;st&quot;:&quot;ok&quot;}&#39;
   else:
    body = &#39;{&quot;error&quot;:&quot;error&quot;}&#39;
  else:
   body = &#39;{&quot;error&quot;:&quot;error&quot;}&#39;
  
  self.response.headers[&#39;Content-Type&#39;] = &#39;application/json&#39;
  self.response.write(body)

#
class GetHandler(webapp2.RequestHandler):
 def get(self):
  fid = self.request.get(&#39;fid&#39;)
  body = &#39;&#39;
#Keyクラスのidを持っておいて
#u = UserData.get_by_id(int(id))
#ってやるほうがいいと気づきました。
  if fid:
   res = UserData.query(UserData.fid==fid).fetch()[0]
   if res:
    body = json.dumps(res.to_list_dict())
   else:
    body = &#39;{&quot;error&quot;:&quot;no query&quot;}&#39;
  else:
   body = &#39;{&quot;error&quot;:&quot;no id&quot;}&#39;
  
  self.response.headers[&#39;Content-Type&#39;] = &#39;application/json&#39;
  self.response.write(body)

#
app = webapp2.WSGIApplication([
    (&#39;/&#39;, MainHandler),
 (&#39;/add&#39;, addHandler),
 (&#39;/put&#39;, PutHandler),
 (&#39;/get&#39;, GetHandler),
], debug=True)

&lt;/pre&gt;&lt;/code&gt;



</content><link rel='replies' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/7471397349852705378/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kakurenboman.blogspot.com/2014/04/google-app-engine-python-datastore.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/7471397349852705378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/7471397349852705378'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/2014/04/google-app-engine-python-datastore.html' title='Google App Engine Python Datastore'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5391756727274905428.post-2565530192020280748</id><published>2013-10-15T15:40:00.000+09:00</published><updated>2014-04-05T19:22:35.622+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AWS"/><category scheme="http://www.blogger.com/atom/ns#" term="EC2"/><category scheme="http://www.blogger.com/atom/ns#" term="Node.js"/><title type='text'>AWSのEC2にNode.jsをインストール</title><content type='html'>&lt;p&gt;インスタンスはもともと作ってたのを利用、sshでつなぐところからいきます。&lt;/p&gt;
&lt;p&gt;Teratermの場合Public DNSって書いてる（ec2-xxx-xx-x-xx.compute-x.amazonaws.com）これがサーバらしい&lt;br&gt;
&lt;br&gt;
AWS EC2&lt;br&gt;
user:ec2-user&lt;br&gt;
passは.pemの秘密鍵を使用&lt;br&gt;
&lt;/p&gt;

&lt;code&gt;&lt;pre&gt;
//コンパイラとかのインストール
$ sudo yum install gcc-c++ make openssl-devel
//gitのインストール
$ sudo yum install git
//gitからnodeのダウンロード
$ git clone git://github.com/joyent/node.git
//nodeのインストール
$ cd node
$ ./configure
$ sudo make
$ sudo make install
$ sudo ln -s /usr/local/bin/node /usr/sbin/
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;なんかうごかない&lt;/p&gt;

&lt;code&gt;&lt;pre&gt;
$ sudo su
$ visudo
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;これで動いた&lt;/p&gt;
&lt;p&gt;npmもいるっぽい&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
$ git clone https://github.com/isaacs/npm.git
$ cd npm
$ sudo make install
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;これでだいたいいけると思う&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/2565530192020280748/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kakurenboman.blogspot.com/2013/10/awsec2nodejs.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/2565530192020280748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/2565530192020280748'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/2013/10/awsec2nodejs.html' title='AWSのEC2にNode.jsをインストール'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5391756727274905428.post-5693916946136737067</id><published>2013-10-11T21:13:00.003+09:00</published><updated>2014-04-05T19:21:53.029+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="PhoneGap"/><category scheme="http://www.blogger.com/atom/ns#" term="Safari"/><title type='text'>PhoneGap(Cordova)2.9.0からSafariを起動してサイトを表示</title><content type='html'>&lt;code&gt;&lt;pre&gt;- (BOOL) webView:(UIWebView*)theWebView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSString *scheme = request.URL.scheme;
    
    if ([scheme isEqualToString:@&quot;http&quot;] || [scheme isEqualToString:@&quot;https&quot;])
    {
        [[UIApplication sharedApplication] openURL:request.URL];
        return NO;
    }
    else
    {
        return [super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType];
    }
}&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
return [self.viewController webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType];&lt;br&gt;
ここが以下のように変える必要があるね&lt;br&gt;
return [super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType];
&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/5693916946136737067/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kakurenboman.blogspot.com/2013/10/phonegapcordova290safari.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/5693916946136737067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/5693916946136737067'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/2013/10/phonegapcordova290safari.html' title='PhoneGap(Cordova)2.9.0からSafariを起動してサイトを表示'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5391756727274905428.post-5562536639679348759</id><published>2013-10-08T16:38:00.000+09:00</published><updated>2013-10-21T12:43:18.064+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cordova"/><category scheme="http://www.blogger.com/atom/ns#" term="PhoneGap"/><category scheme="http://www.blogger.com/atom/ns#" term="Xcode"/><category scheme="http://www.blogger.com/atom/ns#" term="Xcode4.6"/><title type='text'>PhoneGap 2.9.0 を Xcode4.6.2 にインストール</title><content type='html'>&lt;p&gt;また放置してたらバージョンが上がってなんやいろいろしないと駄目になっていました。&lt;/p&gt;
&lt;p&gt;PhoneGapはNodeJSでインストールするのが公式見解になったのかな？&lt;a href=&quot;http://phonegap.com/install/&quot;&gt;ここ&lt;/a&gt;には以下のコマンド叩いてインストールしてねって書いている気がします。&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
$ sudo npm install -g phonegap
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;とりあえずNodeJSが無いならNodeJSを&lt;a href=&quot;http://nodejs.org&quot;&gt;ここ&lt;/a&gt;から適当にインストールします。&lt;br&gt;
で、上記のコマンドをターミナルで叩く&lt;br&gt;
で、使い方は以下のようにしてねと書いてる気がします。&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
$ phonegap create my-app
$ cd my-app
$ phonegap run android
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;素直にこのまま叩くとエラーをはきます、なんなんでしょうね。で、「Learn more at docs.phonegap.com」って書いてるので見に行くと、「Create the App」に&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
$ phonegap create hello com.example.hello HelloWorld
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;って部分があるのでこれを叩くと動きますね。その下に&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
$ phonegap create hello -n HelloWorld -i com.example.hello
$ phonegap create hello --name HelloWorld --id com.example.hello
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;helloがディレクトリ名で、HelloWorldがアプリ名かな？、com.example.helloがいわゆるidっぽいですね。&lt;br&gt;
次に「Build the App」ってとこに
&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
$ cd hello
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;って書いてるから、helloディレクトリに移動したんでしょうね。helloのなかにwwwがあるんでそこにhtmlを入れておくみたいですね。&lt;br&gt;
しかしそれ以外のplatformsファイルとかが空っぽです。なのでたぶん次のコマンド&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
$ phonegap build ios
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;これを叩くとplatformsの中にiosが出来てあり、でHelloworld.xcodeprojがある感じですね。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/5562536639679348759/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kakurenboman.blogspot.com/2013/10/phonegap-290-xcode462.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/5562536639679348759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/5562536639679348759'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/2013/10/phonegap-290-xcode462.html' title='PhoneGap 2.9.0 を Xcode4.6.2 にインストール'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5391756727274905428.post-1319190115666715858</id><published>2013-09-12T23:07:00.000+09:00</published><updated>2014-04-05T19:20:51.162+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="iPad"/><category scheme="http://www.blogger.com/atom/ns#" term="iPhone"/><title type='text'>iPhone、iPad、Android等の画角サイズ</title><content type='html'>&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;name&lt;/td&gt;&lt;td&gt;device pixel&lt;/td&gt;&lt;td&gt;css pixel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iPhone5c&lt;/td&gt;&lt;td&gt;640x1136&lt;/td&gt;&lt;td&gt;320x568&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iPhone5s&lt;/td&gt;&lt;td&gt;640x1136&lt;/td&gt;&lt;td&gt;320x568&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iPhone5&lt;/td&gt;&lt;td&gt;640x1136&lt;/td&gt;&lt;td&gt;320x568&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iPhone4S&lt;/td&gt;&lt;td&gt;640x960&lt;/td&gt;&lt;td&gt;320x480&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iPhone4&lt;/td&gt;&lt;td&gt;640x960&lt;/td&gt;&lt;td&gt;320x480&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iPhone3G&lt;/td&gt;&lt;td&gt;320x480&lt;/td&gt;&lt;td&gt;320x480&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iPhone3&lt;/td&gt;&lt;td&gt;320x480&lt;/td&gt;&lt;td&gt;320x480&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iPad mini&lt;/td&gt;&lt;td&gt;1024x768&lt;/td&gt;&lt;td&gt;1024x768&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</content><link rel='replies' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/1319190115666715858/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kakurenboman.blogspot.com/2013/09/iphoneipad.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/1319190115666715858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/1319190115666715858'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/2013/09/iphoneipad.html' title='iPhone、iPad、Android等の画角サイズ'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5391756727274905428.post-1458455913467083794</id><published>2013-02-27T19:03:00.002+09:00</published><updated>2013-02-27T19:10:35.523+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cordova"/><category scheme="http://www.blogger.com/atom/ns#" term="PhoneGap"/><category scheme="http://www.blogger.com/atom/ns#" term="Xcode"/><category scheme="http://www.blogger.com/atom/ns#" term="Xcode4.6"/><title type='text'>PhoneGap 2.4.0 を Xcode4.6 にインストール</title><content type='html'>&lt;p&gt;もともとはPhoneGapで作成したアプリのiPhone5対応でした、Xcodeをバージョンアップをしたら以下のエラーが発生&lt;/p&gt;

&lt;code&gt;
ld: file is universal (3 slices) but does not contain a(n) armv7s slice: /Users/Shared/Cordova/Frameworks/Cordova.framework/Cordova for architecture armv7s&lt;br&gt;
clang: error: linker command failed with exit code 1 (use -v to see invocation)
&lt;/code&gt;

&lt;p&gt;以下エキサイトさんに約してもらいました&lt;br&gt;
ld:ファイルは普遍的である(3つのスライス)が、(n)armv7sスライスを含んでいません:&lt;br&gt;
/Users/Shared/Cordova/Frameworks/Cordova.framework/Cordova&lt;br&gt;
鳴り響く:エラー:結合物コマンドはエグジット・コード1(祈願を見るために-vを使用する)で失敗しました。&lt;/p&gt;

&lt;p&gt;iPhone 5からアーキテクチャがarmv7sに変更になったらしく、どうもその辺りだろうと思います。そこでPhoneGapのバージョンアップとなりました。&lt;/p&gt;

&lt;p&gt;で、&lt;a href=&quot;http://phonegap-fan.com/startup/&quot;&gt;ここ&lt;/a&gt;を見る限りpkgがあるはずなのですが、PhoneGap 2.4.0にはないので、いろいろ調べると&lt;a href=&quot;http://d.hatena.ne.jp/ATRA/20130209/1360380574&quot;&gt;nodejsでのインストール&lt;/a&gt;もあるみたいですね。&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizg282hcbu6S38PxCI7hSolGOa3B0KktQMxsLeULfpJlg9Q0yvTU8mzVfJZHLFArmcnesH1ncV26Fp8DTUmd5XdSEO7LVuqexAXUlNW8XqysKdVJ6wS780qI1AQJ84dzYA218jz0-knlQ/s1600/2.2.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizg282hcbu6S38PxCI7hSolGOa3B0KktQMxsLeULfpJlg9Q0yvTU8mzVfJZHLFArmcnesH1ncV26Fp8DTUmd5XdSEO7LVuqexAXUlNW8XqysKdVJ6wS780qI1AQJ84dzYA218jz0-knlQ/s320/2.2.jpg&quot; /&gt;&lt;/a&gt;

&lt;p&gt;とりあえず、基本を学ぼうと更に調べると&lt;a href=&quot;http://docs.phonegap.com/en/2.4.0/index.html&quot;&gt;PhoneGap Documentation&lt;/a&gt;のページの右上に&lt;a href=&quot;http://docs.phonegap.com/jp/2.2.0/guide_getting-started_ios_index.md.html&quot;&gt;日本語の2.2.0&lt;/a&gt;のページがあり、インストールの仕方が書いてあります。&lt;/p&gt;

&lt;p&gt;インストールって書いてますが、インストールしてませんよね。ダウンロードしてきただけですよね。&lt;/p&gt;

&lt;h2&gt;CordovaからSafariにリンクする。&lt;/h2&gt;

&lt;p&gt;私のアプリではSafariにリンクする必要があったのですがCordova.plistが無い「ExternalHosts」の項目も見当たらない、でもとりあえず動いているので「ExternalHosts」は放置&lt;/p&gt;

&lt;p&gt;次にAppDelegate.mにwebViewがコードが無い、MainViewController.mでコメントアウトになっているのを発見。以前のコードをコピペしたらエラーは吐いたので適当に修正。&lt;/p&gt;

&lt;code&gt;
- (BOOL) webView:(UIWebView*)theWebView&lt;br&gt;
 shouldStartLoadWithRequest:(NSURLRequest*)request&lt;br&gt;
 navigationType:(UIWebViewNavigationType)navigationType&lt;br&gt;
{&lt;br&gt;
    NSURL *url = [request URL];&lt;br&gt;
    if( [[url scheme] isEqualToString:@&quot;http&quot;] || [[url scheme] isEqualToString:@&quot;https&quot;])&lt;br&gt;
    {&lt;br&gt;
        [[UIApplication sharedApplication] openURL:url];&lt;br&gt;
        return NO;&lt;br&gt;
    }&lt;br&gt;
    else&lt;br&gt;
    {&lt;br&gt;
        return [super webView:theWebView&lt;br&gt;
        shouldStartLoadWithRequest:request&lt;br&gt;
        navigationType:navigationType];&lt;br&gt;
    }&lt;br&gt;
}
&lt;/code&gt;
</content><link rel='replies' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/1458455913467083794/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kakurenboman.blogspot.com/2013/02/phonegap-240-xcode46.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/1458455913467083794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/1458455913467083794'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/2013/02/phonegap-240-xcode46.html' title='PhoneGap 2.4.0 を Xcode4.6 にインストール'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizg282hcbu6S38PxCI7hSolGOa3B0KktQMxsLeULfpJlg9Q0yvTU8mzVfJZHLFArmcnesH1ncV26Fp8DTUmd5XdSEO7LVuqexAXUlNW8XqysKdVJ6wS780qI1AQJ84dzYA218jz0-knlQ/s72-c/2.2.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5391756727274905428.post-4985508955299491276</id><published>2013-02-06T16:08:00.000+09:00</published><updated>2013-02-08T12:58:59.260+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="Swiffy"/><title type='text'>Swiffy5.0.0のJSONデータを少し調べてみた</title><content type='html'>&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilVn6TTQ7Pv2g-5RzANx3GpoTv1tS5asRdqL2me9nqxpwHcJB79rhSRZFJ_tkzWpg-mkXPxIKgsRa0NxUp2_31K9QJAIT8x9MeWpYJteVQgcZajmTV8e-ksjHd0_RHoJu52f3rOWWPCnE/s1600/swiffy.jpg&quot; imageanchor=&quot;1&quot; style=&quot;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;196&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilVn6TTQ7Pv2g-5RzANx3GpoTv1tS5asRdqL2me9nqxpwHcJB79rhSRZFJ_tkzWpg-mkXPxIKgsRa0NxUp2_31K9QJAIT8x9MeWpYJteVQgcZajmTV8e-ksjHd0_RHoJu52f3rOWWPCnE/s400/swiffy.jpg&quot; /&gt;&lt;/a&gt;


&lt;h2&gt;Google Swiffy&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.google.com/doubleclick/studio/swiffy/&quot;&gt;Google Swiffy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;FlashのExtensionから簡単にjsonデータを吐き出せる&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.gstatic.com/swiffy/v5.0/runtime.js&quot;&gt;runtime.js&lt;/a&gt;が実際のエンジン&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/imdiot/google-swiffy-runtime&quot;&gt;github&lt;/a&gt;バージョンが古い&lt;/li&gt;
&lt;li&gt;Android2以前では動かない&lt;/li&gt;
&lt;li&gt;AS3をいくつかサポートしている &lt;a href=&quot;https://www.google.com/doubleclick/studio/swiffy/actionscript3.html&quot;&gt;ActionScript 3.0 support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;runtime.js&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;githubで見てもなかなか読めない&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;swiffyobject&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;v:Swiffyのバージョンっぽいもの&lt;/li&gt;
&lt;li&gt;version:Flashのバージョンっぽいもの&lt;/li&gt;
&lt;li&gt;frameRate:フレームレートって書いてる&lt;/li&gt;
&lt;li&gt;tags:ほとんどのデータが配列で入っている、配列にはオブジェクトではいっていてだいたいがtypeがあり、typeでこれが何のデータかを示している（と思う）&lt;/li&gt;
&lt;li&gt;type:1:シェイプデータ&lt;/li&gt;
&lt;li&gt;type:2:次のフレーム&lt;/li&gt;
&lt;li&gt;type:3:MC等&lt;/li&gt;
&lt;li&gt;type3のdepthは深度、matrixが2Dマトリックで座標等を持たない&lt;/li&gt;
&lt;li&gt;matrixは「9140L585O585o9140L784i262d」という形式で書かれている、「&quot;matrix&quot;:0」の場合は何もしない状態、「::::271c610d」の:は0&lt;del&gt;または1のマトリックスとしての初期状態&lt;/del&gt;、「::::271c610d」の場合271cがxで610dがy座標&lt;ins&gt;全ての「:」は0で算出した値をマトリックスとしての初期に足している、スケールの場合初期が1なので-1にしようとすると-2が算出された&lt;/ins&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;271cを調べる、1000フレームぐらいかけてMCを0から10まで動くアニメーションでのテスト&lt;/p&gt;

&lt;p&gt;x が 0.05 の時 a&lt;br&gt;
x が 0.1  の時 b&lt;br&gt;
x が 0.15 の時 c&lt;br&gt;
x が 0.2  の時 d&lt;/p&gt;
&lt;p&gt;x = n * 0.05&lt;/p&gt;
&lt;p&gt;ずっとこのまま見ていくと&lt;/p&gt;
&lt;code&gt;
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::y:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::z:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::7b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::8b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::9b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::0c:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::1c:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::2c:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::3c:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::4c:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
&lt;/code&gt;
&lt;p&gt;zが26とした場合27が7bとなる、そこでbを2と考えると72。これ左右を反転したら27。つまり0cとは30とかんがえられる。&lt;/p&gt;
&lt;p&gt;たぶん数字の羅列では境界線がわからないのでアルファベットを入れたのかな。&lt;/p&gt;
&lt;p&gt;次に二桁から三桁になる瞬間&lt;/p&gt;
&lt;code&gt;
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::7z:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::8z:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::9z:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::70b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::71b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::72b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::73b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::74b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::75b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::76b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::77b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::78b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::79b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::80b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::81b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::82b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::83b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::84b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::85b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::86b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::87b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::88b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::89b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::90b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::89b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::90b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::91b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::92b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::93b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::94b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::95b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::96b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::97b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::98b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::99b:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::00c:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::01c:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;::::02c:&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},
&lt;/code&gt;
&lt;p&gt;9zのzが26で反転させると269となるので、次は270になるはず。次は70bとなっていてbは2に変換し反転させるとずばり270。で今まで反転だと思っていたが、70b、71b、72bとなっているので反転というより、アルファベットを数字化し先頭に持っていけばいいことがわかった。&lt;/p&gt;
&lt;code&gt;
function(n){&lt;br&gt;
 return (n.charAt(n.length-1).charCodeAt(0)-96)+n.substr(0,n.length-1)*0.05;&lt;br&gt;
}
&lt;/code&gt;
&lt;p&gt;これでいけるはずだけど、runtime.jsの中には見つける事ができませんでした。&lt;/p&gt;
&lt;p&gt;次に回転も取得しなければならなかったので、前半４つの数値を調べなければなりません。回転させると４つの数値が動くのでとりあえず簡単なxスケールのみを拡大し調査します。&lt;/p&gt;

&lt;code&gt;
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;a:::::&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},&lt;br&gt;
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;b:::::&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},&lt;br&gt;
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;c:::::&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},&lt;br&gt;
{&quot;replace&quot;:true,&quot;matrix&quot;:&quot;d:::::&quot;,&quot;type&quot;:3,&quot;depth&quot;:1},{&quot;type&quot;:2},&lt;br&gt;
&lt;/code&gt;

&lt;p&gt;期待通りの数値で助かったのですがコンソールに拡大率を出してみると&lt;/p&gt;
&lt;code&gt;
[trace] 1 runtime.js:300&lt;br&gt;
[trace] 1.0000152587890625 runtime.js:300&lt;br&gt;
[trace] 1.000030517578125 runtime.js:300&lt;br&gt;
[trace] 1.0000457763671875 runtime.js:300&lt;br&gt;
[trace] 1.00006103515625 runtime.js:300&lt;br&gt;
[trace] 1.0000762939453125 runtime.js:300&lt;br&gt;
[trace] 1.000091552734375 runtime.js:300&lt;br&gt;
[trace] 1.0001068115234375 runtime.js:300&lt;br&gt;
&lt;/code&gt;
&lt;p&gt;0.0000152587890625ずつ足されています。runtime.jsには「0000152587890625」という文字列は存在しません、おそらく定数に何かしたものだろうと予想し調べた結果0.5を16乗したものと判明。しかしruntime.jsにはpowという文字列も存在していない。&lt;/p&gt;
&lt;code&gt;
function(n){&lt;br&gt;
 return (n.charAt(n.length-1).charCodeAt(0)-96)+n.substr(0,n.length-1)*Math.pow(0.5,16);&lt;br&gt;
}
&lt;/code&gt;
&lt;p&gt;残りの傾斜率は&lt;del&gt;たぶん大文字に変わっただけだろうと判断。&lt;/del&gt;&lt;ins&gt;スケールと同じ大文字はマイナスの時に指定され、スケールは1を足したものになる&lt;/ins&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/4985508955299491276/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kakurenboman.blogspot.com/2013/02/swiffyjson.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/4985508955299491276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/4985508955299491276'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/2013/02/swiffyjson.html' title='Swiffy5.0.0のJSONデータを少し調べてみた'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilVn6TTQ7Pv2g-5RzANx3GpoTv1tS5asRdqL2me9nqxpwHcJB79rhSRZFJ_tkzWpg-mkXPxIKgsRa0NxUp2_31K9QJAIT8x9MeWpYJteVQgcZajmTV8e-ksjHd0_RHoJu52f3rOWWPCnE/s72-c/swiffy.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5391756727274905428.post-8540770286154831069</id><published>2013-01-25T12:27:00.000+09:00</published><updated>2013-01-25T12:27:27.958+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="Node.js"/><title type='text'>UglifyJSとNodeJSを使ってMinify JavaScript</title><content type='html'>&lt;p&gt;まず、CoffeeScriptは圧縮しない。&lt;/p&gt;

&lt;p&gt;Minify（難読化）はいくつか存在してた、&lt;a href=&quot;http://yui.github.com/yuicompressor/&quot;&gt;YUI Compressor&lt;/a&gt;、&lt;a href=&quot;http://www.crockford.com/javascript/jsmin.html&quot;&gt;JSMin&lt;/a&gt;、&lt;a href=&quot;http://code.google.com/closure/compiler/&quot;&gt;Google Closure Compiler&lt;/a&gt;、&lt;a href=&quot;https://github.com/mishoo/UglifyJS&quot;&gt;UglifyJS&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;UglifyJSは&lt;a href=&quot;http://nodejs.org/&quot;&gt;NodeJS&lt;/a&gt;が必要なのでインストールする、最近のNodeJSはnpmが標準なので以下でUglifyJSを入れる&lt;/p&gt;

&lt;code&gt;
npm -g install uglify-js
&lt;/code&gt;

&lt;p&gt;Windowsならプロンプトで以下を叩く-oでファイル名を指定する&lt;/p&gt;

&lt;code&gt;
uglifyjs -o file.mini.js file.js
&lt;/code&gt;

&lt;p&gt;面倒なのでbatファイルを作成auto.batとかで保存&lt;/p&gt;

&lt;code&gt;
cd c:\place\where\files\are\&lt;br&gt;
uglifyjs -o file.mini.js file.js
&lt;/code&gt;

&lt;p&gt;以下のようなパスでは無理だった&lt;/p&gt;

&lt;code&gt;
uglifyjs -o c:\place\where\files\are\file.mini.js c:\place\where\files\are\file.js
&lt;/code&gt;</content><link rel='replies' type='application/atom+xml' href='http://kakurenboman.blogspot.com/feeds/8540770286154831069/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kakurenboman.blogspot.com/2013/01/uglifyjsnodejsminify-javascript.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/8540770286154831069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5391756727274905428/posts/default/8540770286154831069'/><link rel='alternate' type='text/html' href='http://kakurenboman.blogspot.com/2013/01/uglifyjsnodejsminify-javascript.html' title='UglifyJSとNodeJSを使ってMinify JavaScript'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>