はじめてのモバイルウェブアプリ 3 SPARQLハンズオン...

19
SPARQLハンズオン 水位推移予測ゲームのつくりかた HTML5+JavaScript Webアプリ編 株式会社 jig.jp 代表取締役社長 福野泰介 @taisukef http://fukuno.jig.jp/

Transcript of はじめてのモバイルウェブアプリ 3 SPARQLハンズオン...

Page 1: はじめてのモバイルウェブアプリ 3 SPARQLハンズオン オープンデータ水位ゲーム

SPARQLハンズオン

水位推移予測ゲームのつくりかた

HTML5+JavaScript Webアプリ編

株式会社 jig.jp 代表取締役社長 福野泰介 @taisukef http://fukuno.jig.jp/

Page 2: はじめてのモバイルウェブアプリ 3 SPARQLハンズオン オープンデータ水位ゲーム

http://sparql.odp.jig.jp/

Page 3: はじめてのモバイルウェブアプリ 3 SPARQLハンズオン オープンデータ水位ゲーム

select * { ?s ?p ?o }

※RDFを取得するSPARQL問い合わせhttp://sparql.odp.jig.jp/

Page 4: はじめてのモバイルウェブアプリ 3 SPARQLハンズオン オープンデータ水位ゲーム
Page 5: はじめてのモバイルウェブアプリ 3 SPARQLハンズオン オープンデータ水位ゲーム

水位の上がり下がりを予測するゲームに改造

水位を値段に見立てて買う&売る 元手1,000ポイントの10倍増を狙う

Page 6: はじめてのモバイルウェブアプリ 3 SPARQLハンズオン オープンデータ水位ゲーム

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX dct: <http://purl.org/dc/terms/> PREFIX odp: <http://odp.jig.jp/odp/1.0#>

SELECT ?created ?value { ?s rdf:next rdf:nil; rdf:type odp:WaterLevel; <http://schema.org/spatial> <http://odp.jig.jp/jp/fukui/sabae/waterlevelsensor/1>; dct:created ?created; rdf:value ?value. }

最新の水位を取得するSPARQLクエリー

Page 7: はじめてのモバイルウェブアプリ 3 SPARQLハンズオン オープンデータ水位ゲーム

{ "head": { "vars": [ "created" , "value" ] } , "results": { "bindings": [ { "created": { "datatype": "http://www.w3.org/2001/XMLSchema#dateTime" , "type": "typed-literal" , "value": "2015-02-05T10:35:01+09:00" } , "value": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "62" } } ] } }

最新の水位を取得するSPARQLクエリーの結果

Page 8: はじめてのモバイルウェブアプリ 3 SPARQLハンズオン オープンデータ水位ゲーム

<html> <head> <script src="http://fukuno.jig.jp/fukuno.js"></script> <script>

</script> </head> <body>

<h1>鯖江市 論手川水位メーター</h1> <div id="main"> <div id="level"><span id="value"></span>cm</div> <div id="datetime"></div> </div>

<div id="credit"> DATA: CC BY <a href=http://odp.jig.jp/ target=_blank>odp</a> </div>

</body> 水位表示アプリ、ベース

Page 9: はじめてのモバイルウェブアプリ 3 SPARQLハンズオン オープンデータ水位ゲーム

var getWaterLevelSPARQL = function(sensor, callback) { var query = f2s(function() {/* PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX dct: <http://purl.org/dc/terms/> PREFIX odp: <http://odp.jig.jp/odp/1.0#> select ?created ?value { ?s rdf:next rdf:nil; rdf:type odp:WaterLevel; <http://schema.org/spatial> {sensor}; dct:created ?created; rdf:value ?value. } */}); query = query.replace("{sensor}", "<" + sensor + ">"); var url = "http://sparql.odp.jig.jp/api/v1/sparql?output=json&query=" + encodeURIComponent(query); url += "&callback=" + getCallbackMethod(function(data) { var d = data.results.bindings[0]; callback(d.created.value, d.value.value); }); jsonp(url); }; 水位取得するJavaScript scriptタグ内

Page 10: はじめてのモバイルウェブアプリ 3 SPARQLハンズオン オープンデータ水位ゲーム

window.onload = function() { var sensor = "http://odp.jig.jp/jp/fukui/sabae/waterlevelsensor/1" var f = function() { getWaterLevelSPARQL(sensor, function(datetime, value) { get("datetime").textContent = datetime.replace("T", " "); get("value").textContent = value; }); }; setInterval(f, 5 * 60 * 1000); f(); };

5分置きに取得し表示するJavaScript scriptタグ内

Page 11: はじめてのモバイルウェブアプリ 3 SPARQLハンズオン オープンデータ水位ゲーム
Page 12: はじめてのモバイルウェブアプリ 3 SPARQLハンズオン オープンデータ水位ゲーム

<style> body { text-align: center; } #main { display: inline-block; width: 300px; height: 300px; background-color: #8ca8ff; position: relative; } #level { padding-top: 60px; font-size: 70px; color: #002699; } #datetime { font-size: 18px; color: #002699; } </style> head内にCSSを記述して完成

Page 13: はじめてのモバイルウェブアプリ 3 SPARQLハンズオン オープンデータ水位ゲーム

<h1>鯖江市 論手川水位予測ゲーム</h1> <div id="main"> <div id="level"><span id="value"></span>cm</div> <div id="datetime"></div> <div id=pointdiv><span id="point">1000</span>ポイント</div> <span class=btn id="buy">買う</span><span class=btn id="sell">売る</span><br> <div><span id="stock">0</span>ストック</div> </div>

予測ゲーム用に追加する

Page 14: はじめてのモバイルウェブアプリ 3 SPARQLハンズオン オープンデータ水位ゲーム

.btn { padding: 4px 12px; background: white; border-radius: 8px; margin: 4px; } #pointdiv { margin: 4px; font-weight: bold; }

CSSをstyleタグ内に追記

Page 15: はじめてのモバイルウェブアプリ 3 SPARQLハンズオン オープンデータ水位ゲーム

var point = localStorage["waterlavelgame_point"]; var stock = localStorage["waterlavelgame_stock"]; if (point) { get("point").textContent = point; get("stock").textContent = stock; }

ポイントとストックの読み込み (onload内)

Page 16: はじめてのモバイルウェブアプリ 3 SPARQLハンズオン オープンデータ水位ゲーム

get("buy").onclick = function() { var pnt = parseInt(get("point").textContent); var price = parseInt(get("value").textContent); var stock = parseInt(get("stock").textContent); if (price > pnt) { alert("所持ポイントが足りません!!"); return; } pnt -= price; pnt--; stock++; get("stock").textContent = stock; get("point").textContent = pnt; localStorage["waterlavelgame_point"] = pnt; localStorage["waterlavelgame_stock"] = stock; };

買いオペ (onload内)

Page 17: はじめてのモバイルウェブアプリ 3 SPARQLハンズオン オープンデータ水位ゲーム

get("sell").onclick = function() { var pnt = parseInt(get("point").textContent); var price = parseInt(get("value").textContent); var stock = parseInt(get("stock").textContent); if (stock == 0) { alert("売却するストックがありません"); return; } stock--; pnt += price; if (price >= 10000) { if (!localStorage["waterlavelgame_over"]) { alert("おめでとう!!10,000ポイント達成!!"); localStorage["waterlavelgame_over"] = 1; } } pnt--; get("stock").textContent = stock; get("point").textContent = pnt; localStorage["waterlavelgame_point"] = pnt; localStorage["waterlavelgame_stock"] = stock; };

売りオペ (onload内)

Page 18: はじめてのモバイルウェブアプリ 3 SPARQLハンズオン オープンデータ水位ゲーム

水位の上がり下がりを予測するゲームに完成

Page 19: はじめてのモバイルウェブアプリ 3 SPARQLハンズオン オープンデータ水位ゲーム

http://fukuno.jig.jp/2014/opdapps