admin のすべての投稿

警報アプリ

日付指定,UTCとJSTが混在してが面倒な場合,最新20が表示されるURLが

(機種によってはUTCが取得される?)

“http://api.aitc.jp/jmardb/search?areacode=230000&order=new”

これの中身を上から順に検索していけばよい

ただしレスポンス悪いので,ロード中は「取得中」とか表示させればいいのでは?

 

警報の判定

最新時刻で警報が出ているかどうかの確認ができる.

これに現時間で判定させる仕組みを入れるとできあがり.

<html>
<head>
<title>警報書き出し</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no">
<!-- metaタグで スマホの挙動を制限している -->
</head>
<body>
<h2>警報データ検索(ダミーデータ)</h2>
 
<script type="text/javascript">
var hantei = new Array();
var alertURL;
//var hantei;
 
///日付からURL作成
myDate = new Date();
Year = myDate.getFullYear();
Month = myDate.getMonth();
Day = myDate.getDate();
///昨日の日付
yDate = new Date(Year, Month, Day);
yDate.setDate (yDate.getDate() - 1);
YYear = yDate.getFullYear();
YMonth = yDate.getMonth();
YDay = yDate.getDate();
 
var myURL = "http://api.aitc.jp/jmardb/search?areacode=230000&datetime=" + YYear + "-" + YMonth + "-" + YDay +"&datetime="+ Year + "-" + Month + "-" +Day;
console.log(myURL);
 
httpObj = new XMLHttpRequest();//XML読みに行ってね
httpObj.open("get", myURL, true);//発令のダミーデータがここに
httpObj.onload = function(){
var myData = JSON.parse(this.responseText);//読み込んだデータをテキスト化してmyDataに格納
console.log(myData);
var txt = "";//表示用にダブルクォーテーションで文字列化するための準備

for(i=myData.data.length-1; i > -1; i--){//warning[2]はエリア
console.log(myData.data[i].title);
if(myData.data[i].title == "気象特別警報・警報・注意報" || myData.data[i].title == "気象警報・注意報"){
alertURL = myData.data[i].link + ".json";
myAlert();
return;
}
}
}
httpObj.send(null);
 
 
 
 
function myAlert(){
 
httpObj = new XMLHttpRequest();//XML読みに行ってね
//httpObj.open("get", "http://api.aitc.jp/jmardb/reports/84a9b370-b399-35b1-aee5-9dbb8a03597a.json", true);//テスト用のアドレス
httpObj.open("get", alertURL, true);//発令のダミーデータがここに
httpObj.onload = function(){
var myData = JSON.parse(this.responseText);//読み込んだデータをテキスト化してmyDataに格納

var txt = "";//表示用にダブルクォーテーションで文字列化するための準備

for(var i=0; i < 6; i++){//warning[2]はエリア
for(var a=0; a<myData.report.body.warning[2].item[i].kind.length; a++){//itemの長さは実際に55ありiを1つずつ加算しその要素を調べる
if(myData.report.body.warning[2].item[i].kind[a].code == 5 || myData.report.body.warning[2].item[i].kind[a].code == 35 || myData.report.body.warning[2].item[i].kind[a].code == 33){//警報の要素はaを1つずつ加算し中を見る.5が暴風警報,33は大雨特別警報.35が暴風特別警報
txt += myData.report.body.warning[2].item[i].area.name + "で" + myData.report.body.warning[2].item[i].kind[a].name + myData.report.body.warning[2].item[i].kind[a].status + "<br />";
//area.nameは地域名,kind[a].nameは警報の名前 kind[a].statusは発令か継続か(あまりないけど解除とか)

var addTex = "" + myData.report.body.warning[2].item[i].kind[a].status;

hantei.push(addTex);

		}else{
		txt = "警報は出ていません";
		}
	}
	
alertCheck();

}
document.getElementById("result").innerHTML = txt;
}
httpObj.send(null);
}


function alertCheck(){
var neko = 0;
////----検索
for(i=0; i < hantei.length; i++){
if(hantei[i] == "発表" ||hantei[i] == "継続" ){
neko = neko + 1;

}
}
}

</script>
 
<div id="result"></div>

 
</body>
</html>

 

開講日のデータ

休校日,土曜日,臨時日のデータです

2014年1月1日を起点とした日付で,11月1日以降です

var rinji = new Array(157,204,205,208,209,210,256,303,332,385,386,387,390,391);
var myClose = new Array(356,360,361,362,363,364,365,366,367,368,369,376,406,444);
var mySat = new Array(357,358,359,384,392,393,394,397,398,399,400,401,403,404,405,407,408,411,412,413,414,415,418,419,420,421,422,425,426,427,428,429,432,433,434,435,436,439,440,441,442,443,446,447,448,449,450,453,454);

 

警報データ取得ライブラリ化検討中

出来る方はやってみてください.

これで特定日のデータは取れるようになりました.

実行すると警報が出ている地域の一覧が出ます

<html>
<head>
<title>警報書き出し</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no">
<!-- metaタグで スマホの挙動を制限している -->
</head>
<body>
<h2>警報データ検索(ダミーデータ)</h2>
 
<script type="text/javascript">

 
httpObj = new XMLHttpRequest();//XML読みに行ってね
httpObj.open("get", "http://api.aitc.jp/jmardb/reports/84a9b370-b399-35b1-aee5-9dbb8a03597a.json", true);//テスト用のアドレス
//httpObj.open("get", "http://api.aitc.jp/jmardb/reports/32df3636-4dab-308b-a1ad-62a609b514c7.json", true);//発令のダミーデータがここに
httpObj.onload = function(){
var myData = JSON.parse(this.responseText);//読み込んだデータをテキスト化してmyDataに格納

var txt = "";//表示用にダブルクォーテーションで文字列化するための準備

for(var i=0; i < 6; i++){//warning[2]はエリア
for(var a=0; a<myData.report.body.warning[2].item[i].kind.length; a++){//itemの長さは実際に55ありiを1つずつ加算しその要素を調べる
if(myData.report.body.warning[2].item[i].kind[a].code == 5 || myData.report.body.warning[2].item[i].kind[a].code == 35 || myData.report.body.warning[2].item[i].kind[a].code == 33){//警報の要素はaを1つずつ加算し中を見る.5が暴風警報,33は大雨特別警報.35が暴風特別警報
txt += myData.report.body.warning[2].item[i].area.name + "で" + myData.report.body.warning[2].item[i].kind[a].name + myData.report.body.warning[2].item[i].kind[a].status + "<br />";
//area.nameは地域名,kind[a].nameは警報の名前 kind[a].statusは発令か継続か(あまりないけど解除か)
		}
	}
}
document.getElementById("result").innerHTML = txt;
}
httpObj.send(null);
</script>
 
<div id="result"></div>

 
</body>
</html>

 

ブラウザにGPS座標を記録していく

外部ライブラリneko.jsを使います

var GPS_DATA;

function myGps(pos) {
  var myIdo = pos.coords.latitude;
  var myKeido = pos.coords.longitude;
 
GPS_DATA = [myIdo, myKeido];
dataSave();
//console.log(GPS_DATA);

}

///----ここからデータセーブのライブラリ
var myData = localStorage;//”localstorage”というのは変えてはいけない
function dataSave() {
  var myDate = new Date().toLocaleString();
  //var myPos = GPS_DATA.toString();
  //myData.setItem(myDate, myPos);
  myData.setItem(myDate, JSON.stringify(GPS_DATA));//日付にJSON形式に変換したGPS座標を入力
  //console.log(GPS_DATA);
  showData();
}

function showData(){
var result = "";
 for(var i=0; i <5; i++){//5個表示
var k = myData.key(i);
result += k + " , " + JSON.parse(myData.getItem(k)) + "<br />";
}
  //  var k = myData.key(i);

  //上のループで作成されたテキストを表示する
 document.getElementById("myReturn").innerHTML = result;
//console.log(result);
}


function erase() {
  myData.clear();
}
////ここまで

 

これを使うhtmlです

<!DOCTYPE html>
<html>
<head>
<title>nekoライブラリ</title>
<meta charset="UTF-8">
<script src="./neko.js"></script>
</head>
<body>
    <div id="myReturn"></div>
<input type="button" value="この場所を記録する" onclick="gpsget()">
<input type="button" value="これまでの結果5件表示" onclick="showData()">
<input type="button" value="データ消去" onclick="erase()">
<script type="text/javascript">
//---GPSはここから

function gpsget(){
	if(window.confirm('GPSを記録しますか?')){
	if(navigator.geolocation){
navigator.geolocation.getCurrentPosition(myGps);//GPS取得用
	}
}else{
		window.alert('キャンセルされました'); // 警告ダイアログを表示
	}
}

</script>


</body>
</html>

 

アプリのランキング取得

アプリのランキングは以下のサイトで取得できます.

自分の必要なランキングを作成,そのアドレスにアクセスするとXML形式で戻ってきます.これを解析します.

https://rss.itunes.apple.com/jp/?urlDesc=

 

例えば,無料ゲームのランキングは

https://itunes.apple.com/jp/rss/topfreeapplications/limit=10/genre=6014/xml

のアドレスで取得できます.

これの解析は

http://labo.520328.jp/javascript/google_feed_api_sample/

などはいかがでしょうか?

少しいじると(黄色い1行の部分)

<!DOCTYPE html>
<html>
<head>
<title>おてんき</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no">
<!-- metaタグで スマホの挙動を制限している -->
<script src="./jquery-1.11.1.min.js"></script>
</head>
<body>
    <div id="feed"></div>

<script src="https://www.google.com/jsapi" type="text/javascript"></script>
<script type="text/javascript">
var xmlUrl = "https://itunes.apple.com/jp/rss/topfreeapplications/limit=10/genre=6014/xml";
var setNum = 5;
var setID = "feed";
google.load("feeds", "1");
function initialize() {
    var html = '';
    var feed = new google.feeds.Feed(xmlUrl);
    feed.setNumEntries(setNum);
    feed.load(function(result) {
        if (!result.error){
            var container = document.getElementById(setID);
            for (var i = 0; i < result.feed.entries.length; i++) {
                var entry = result.feed.entries[i];
                var title = entry.title;
                var link = entry.link;
                var description = entry.contentSnippet;
                html += '<p>' + (i+1) +':位<a href="' + link + '">' + title + '</a><br />' + description + '</p>';
            }
            container.innerHTML = html;
        }
    });
}
google.setOnLoadCallback(initialize);
</script>


</body>
</html>

○位:〜〜〜

と表示できます.

気象警報をAPIで取得

以下のAPIでjsonがとれるようです.

使用の注意を読んでから使ってください

注意事項(必ず読む)

http://api.aitc.jp/#attention

そのAPI(愛知県)

http://api.aitc.jp/jmardb/search?areacode=230000&order=new

 

使用例

愛知県の10月6日〜10月7日には実際に警報が出ている.日付指定は

http://api.aitc.jp/jmardb/search?areacode=230000&datetime=2014-10-06%2000:00:00&datetime=2014-10-07%2000:00:00

このうち,linkのタグの中にはURLが入っているので,ここからさらに情報を取ってくる.
http://api.aitc.jp/jmardb/reports/990185c2-0a28-30cc-9779-a8396d3e0c7b

このリンクは,このままアクセスするとXML形式ですが,末尾に.jsonをつけるとJSON形式となり,同じスクリプトで扱えるかと思われます.

http://api.aitc.jp/jmardb/reports/990185c2-0a28-30cc-9779-a8396d3e0c7b.json

このデータ,暴風警報は”code”: “05”で”status”に発表か継続か解除がある.

両方がマッチしているものをカウントする,時間で区切る,関係ない地域を無視するーである程度の判別は可能かと.

なお,時間で区切ったり,最新版を呼び出すなどは以下の仕様表で

http://api.aitc.jp/jmardb-api/help

 

パタン

東三河北部及び東三河南部を除く愛知県下

暴風警報、暴風特別警報、大雨特別警報
の単語をindexOfする

結果 n が >0なら警報出ていると判断

 

ーーーパタンの判別ーーー
現在時 < 07:59:59
解除=講義有り
発令もしくは継続中=休講

現在時08:00:00 < 現在時 && 現在時 <10:59:59
解除=3限より講義有り
発令もしくは継続中=休講

現在時 > 11:00:00
解除=講義有り
発令もしくは継続中=休講

ブラウザにデータを保存できるwebstorageのサンプル

ここのサンプルを少し改造しています.

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset=utf-8>
<script>
//変数storageにlocalStorageを格納
var myData = localStorage;//たぶん”localstorage”というのは変えてはいけない

//myDataに保存する
function dataSave() {
  var myKey = document.getElementById("mykey").value;
  var myValue = document.getElementById("myvalue").value;
  myData.setItem(myKey, myValue);
  show_result();
}

//データを消去
function myclear() {
  myData.clear();
 show_result();
}

//保存されているデータをリスト表示する
function show_result() {
 var result = "";
  //保存されているデータの数だけループ
  for(var i=0; i<myData.length; i++){
    //i番目のキーを取得
  //  var k = myData.key(i);
    var calledData = myData.key(i);

    result += calledData + "は" + myData.getItem(calledData) + "です<br>";
  }
  //上のループで作成されたテキストを表示する
  document.getElementById("show_result").innerHTML = result;
}


  // 
  function removeStorage() {
    var key = document.getElementById("sakujoKey").value;
    myData.removeItem(key);
    key = "";
    show_result();
  }

</script>
<title>Web Storage サンプル</title>
</head>
<body onload="show_result();"><!-- ←ここで結果を自動表示させている-->
<p>
キー:<input id="mykey" type="text">
値:<input id="myvalue" type="text">
<input type="button" value="ストレージに保存" onClick="dataSave()">
</p>
<p>
<div id="show_result"></div>
<input type="button" value="ストレージをクリア" onClick="myclear()">

<input type="button" value="リスト表示" onClick="show_result()">
<br />
削除するキー:<input id="sakujoKey" type="text">
  <button id="button" onclick="removeStorage()">このキーを削除</button>
</p>
</body>
</html>

このデータは共有できるので,同じサーバ(で判別している)であれば別のページからでもこのデータをみられる.

そこで,書き込み用ページと,読み出しようページを分けて,普段は読み出し用ページ,特別な時に書き込みようページへ移動してデータを追加というのも可能です.

データはクリア以外にも,キーワードを指定して削除という方法があります.

「削除するキー」の横に削除したいキーワードを入れて,削除ボタンを押すと,そのキーと値が削除されます.

なお,同じキーの場合は,上書きされますので,日付などで固有化させてください.

例えば,「2014年11月電気代」という風に.

配列に入れているので並び替え可能かと思われますが(ソート)その場合は配列への書き込み方法を変更する必要があるかも.

ローカルファイルにデータ保存(実験)

Webアプリで入力を行わせる場合,通常はサーバ側に記録するのですが,それではデータベースが必要となります.

HTML5ではWeb Storageという機能があり,URLに紐付けてデータをブラウザ側に保存できるようです.ユーザの購買傾向を見てお奨め商品を出してくる通販サイトはこの技術を利用しているようです.

参考

このデータは何かの拍子に消える可能性もありますので,通販のお奨め商品といったレベルで重要な要素には使わない方がいいかもしれませんが,データベースを構築するよりは簡単そうです.

「保存するデータを見るのは自分だけ」「単に数値や文字といった軽いデータだけ」であればこの方法を使ってみてください.

つづく(できなかったら消す)