深部物性値(P波・S波)

P波・S波
http://www.j-shis.bosai.go.jp/api-dstruct-phys

$BASE_URL = "http://www.j-shis.bosai.go.jp/map/api/dstrct/V1/phys.json";
$obj = json_decode(file_get_contents($BASE_URL));

print_r("<pre>");
var_dump($obj);
print_r("</pre>");

P波
[“SVP”]=>
object(stdClass)#12 (33) {
[“tn31”]=>
string(4) “5500”
[“tn29”]=>
string(4) “5000”
[“tn20”]=>
string(4) “3400”
[“tn8”]=>
string(4) “2100”
[“tn5”]=>
string(4) “1800”
[“tn32”]=>
string(4) “5700”
[“tn7”]=>
string(4) “2000”
[“tn6”]=>
string(4) “2000”
[“tn11”]=>
string(4) “2300”
[“tn25”]=>
string(4) “4000”
[“tn13”]=>
string(4) “2400”
[“tn9”]=>
string(4) “2100”
[“tn4”]=>
string(4) “1800”
[“tn19”]=>
string(4) “3200”
[“tn17”]=>
string(4) “2700”
[“tn30”]=>
string(4) “5500”
[“tn3”]=>
string(4) “1700”
[“tn15”]=>
string(4) “2500”
[“tn33”]=>
string(4) “6000”
[“tn1”]=>
string(4) “1600”
[“tn18”]=>
string(4) “3000”
[“tn28”]=>
string(4) “4600”
[“tn27”]=>
string(4) “5000”
[“tn16”]=>
string(4) “2600”
[“tn10”]=>
string(4) “2200”
[“tn21”]=>
string(4) “3500”
[“tn22”]=>
string(4) “3600”
[“tn23”]=>
string(4) “3700”
[“tn24”]=>
string(4) “3800”
[“tn14”]=>
string(4) “2500”
[“tn26”]=>
string(4) “4000”
[“tn2”]=>
string(4) “1600”
[“tn12”]=>
string(4) “2400”
}

S波
[“SVS”]=>
object(stdClass)#9 (33) {
[“tn31”]=>
string(4) “3200”
[“tn29”]=>
string(4) “2700”
[“tn20”]=>
string(4) “1600”
[“tn8”]=>
string(3) “700”
[“tn5”]=>
string(3) “550”
[“tn32”]=>
string(4) “3300”
[“tn7”]=>
string(3) “650”
[“tn6”]=>
string(3) “600”
[“tn11”]=>
string(3) “850”
[“tn25”]=>
string(4) “2100”
[“tn13”]=>
string(3) “950”
[“tn9”]=>
string(3) “750”
[“tn4”]=>
string(3) “500”
[“tn19”]=>
string(4) “1500”
[“tn17”]=>
string(4) “1300”
[“tn30”]=>
string(4) “3100”
[“tn3”]=>
string(3) “450”
[“tn15”]=>
string(4) “1100”
[“tn33”]=>
string(4) “3400”
[“tn1”]=>
string(3) “350”
[“tn18”]=>
string(4) “1400”
[“tn28”]=>
string(4) “2900”
[“tn27”]=>
string(4) “2700”
[“tn16”]=>
string(4) “1200”
[“tn10”]=>
string(3) “800”
[“tn21”]=>
string(4) “1700”
[“tn22”]=>
string(4) “1800”
[“tn23”]=>
string(4) “1900”
[“tn24”]=>
string(4) “2000”
[“tn14”]=>
string(4) “1000”
[“tn26”]=>
string(4) “2100”
[“tn2”]=>
string(3) “400”
[“tn12”]=>
string(3) “900”
}

地震予想のため、首都圏のP-Wave, S-Waveのリアルタイム値を取得してグラフにしたいんだが、なんか違う気がする。
少し掘ろうとすると、専門性が一気に高くなってついていけん。

usgsの地震情報をphpで取得

タイムスタンプが何故か桁数が多いので、削除しています。項目は気象庁と合わせます。

$BASE_URL = "https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_week.geojson";
$obj = json_decode(file_get_contents($BASE_URL));

echo "震央地名:" .$obj->features[65]->properties->place ."<br>";
$date = $obj->features[65]->properties->time;
$date = substr($date, 0, -3);
echo "地震の発生時間:" .date("Y/m/d H:i:s", $date) ."<br>";
echo "マグニチュード:" .$obj->features[65]->properties->mag ."<br>";
echo "緯度:" .$obj->features[65]->geometry->coordinates[1] ."<br>";
echo "経度:" .$obj->features[65]->geometry->coordinates[0] ."<br>";
echo "深さ:" .$obj->features[65]->geometry->coordinates[2] ."km<br>";

問題なさそうなので、最新200を配列に入れます。

$BASE_URL = "https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_week.geojson";
$obj = json_decode(file_get_contents($BASE_URL));

for($i=0; $i<200; $i++){
	$place&#91;&#93; = $obj->features[$i]->properties->place;
	$date = $obj->features[$i]->properties->time;
	$date = substr($date, 0, -3);
	$time[] = date("Y/m/d H:i:s", $date);
	$mag[] = $obj->features[$i]->properties->mag;
	$lon[] =$obj->features[$i]->geometry->coordinates[1];
	$lat[] = $obj->features[$i]->geometry->coordinates[0];
	$depth = $obj->features[$i]->geometry->coordinates[2];
}

テーブルをつくります。

create table weather.quakes(
	id int unsigned auto_increment primary key,
	place varchar(255),
	time datetime unique,
	mag float,
	lat double(8,6),
	lng double(9,6),
	depth float
);

入りました。

index.ctpをつくってあげます。

<?php
	$this->assign('title', '地震速報');
?>
<?= $this->element('menu'); ?>
<h1>地震速報</h1>
<span style="color:gray">※United States Geological Surveyを元に10分毎に最新のデータに更新しています。</span><br><br>

	<?php 
	$i = 1;
	foreach ($quakes as $quake){
	echo "震央地名:" .h($quake->place)."<br>";
	echo "地震発生時間:" .($quake->time)."<br>";
	echo "マグニチュード:".($quake->mag)."<br>";
	echo "深さ:".($quake->depth)."km<br>";
	echo "緯度:". ($quake->lat)."<br>";
	echo "経度:".($quake->lng)."<br><br>";
	}
	?>

Weather系のAPIはMeteomatics APIがいいらしい

Weather系のAPIはMeteomatics API(https://api.meteomatics.com)がいいらしい、とのことで、gmailでsign upしたところ、

Thanks a lot for your interest in our Weather API. Since the Meteomatics Weather API is a premium product primarily targeted at corporate customers, we would kindly ask you to re-send your request from your employer’s mail account.
We will be happy to provide you with a trial account.

しょうがないので、法人のメールアドレスでsign upしたら、一か月の有効期限とのこと。
Thank you very much for your interest in our weather API!
We have just created a trial account for you:
User: hoge
PW: hogehoge
Valid until 2018-04-14

見えるようになりましたが、1カ月はきついですね。
スイスの会社です。言語がEnglishとGerman。そういえばゼミの教授もスイス人でした。

天気予報を表示してみよう

tdを8(=24/3)にして、テーブルで表示してみます。

<style>
.table1 td {
	width: 120px;
	height: 260px;
	vertical-align: top;
}

</style>
<?php

$city = "Marunouchi";
$API_KEY = "foo";
$BASE_URL = "http://api.openweathermap.org/data/2.5/forecast/?q=".$city.",jp&appid=" . $API_KEY . "";

$forecast = json_decode(file_get_contents($BASE_URL), true);

echo "<b>" . $city . "</b><br>";
$list = $forecast["list"];

echo "<table class=\"table1\">";
echo "<tr>";

$i = 1;
foreach($list as $value){
	echo "<td>";
	echo $value["dt_txt"] . "<br>";
	echo $value["weather"][0]["main"] . "<br>";
	echo $value["weather"][0]["description"] . "<br>";
	$temp = $value["main"]["temp"];
	echo "気温 : " . ($temp - 273.15) . "°<br>";
	echo "湿度 : " . $value["main"]["humidity"] . "%<br>";
	echo "雲 : " . $value["clouds"]["all"] . "%<br>";
	echo "風速 : " . $value["wind"]["speed"] . "m<br><br>";
	echo "</td>";
	if($i % 8 == 0){
	echo "</tr><tr>";
	}
	$i++;

}
echo "</tr>";
echo "</table>";
?>

やべー

PHPで丸の内の天気を取得してみよう

<?php

$city = "Marunouchi";
$API_KEY = "not watch";
$BASE_URL = "http://api.openweathermap.org/data/2.5/forecast/?q=".$city.",jp&appid=" . $API_KEY . "";

$forecast = json_decode(file_get_contents($BASE_URL), true);

echo $city . "<br>";
$list = $forecast["list"];
echo $list[0]["dt_txt"] . "<br>";
echo $list[0]["weather"][0]["main"] . "<br>";
echo $list[0]["weather"][0]["description"] . "<br>";
$temp = $list[0]["main"]["temp"];
echo "気温 : " . ($temp - 273.15) . "°<br>";
echo "湿度 : " . $list[0]["main"]["humidity"] . "%<br>";
echo "雲 : " . $list[0]["clouds"]["all"] . "%<br>";
echo "風速 : " . $list[0]["wind"]["speed"] . "m<br>";
?>

foreachに書き換えます。

echo "<b>" . $city . "</b><br>";
$list = $forecast["list"];

foreach($list as $value){
	echo $value["dt_txt"] . "<br>";
	echo $value["weather"][0]["main"] . "<br>";
	echo $value["weather"][0]["description"] . "<br>";
	$temp = $value["main"]["temp"];
	echo "気温 : " . ($temp - 273.15) . "°<br>";
	echo "湿度 : " . $value["main"]["humidity"] . "%<br>";
	echo "雲 : " . $value["clouds"]["all"] . "%<br>";
	echo "風速 : " . $value["wind"]["speed"] . "m<br><br>";
}

うわーでたー

open weather map api  listの中身

listの中身を見てみましょう。取得日を含めて5日分のデータが返ってきます。
一番下の”dt_txt”がその日時のようですね。3時間おきにあります。
09:00:00
12:00:00
15:00:00
18:00:00
21:00:00
00:00:00
03:00:00
06:00:00

[“temp”]=>float(278.11) はケルビンで、273.15を引くと℃になります。
[“pressure”]=>float(994.69) は気圧。hpa
[“deg”]=>float(55.0004) は風向き

気圧はahp

[1]=>
    array(9) {
      ["dt"]=>
      int(1520683200)
      ["main"]=>
      array(8) {
        ["temp"]=>
        float(278.11)
        ["temp_min"]=>
        float(277.249)
        ["temp_max"]=>
        float(278.11)
        ["pressure"]=>
        float(994.69)
        ["sea_level"]=>
        float(1035.79)
        ["grnd_level"]=>
        float(994.69)
        ["humidity"]=>
        int(100)
        ["temp_kf"]=>
        float(0.86)
      }
      ["weather"]=>
      array(1) {
        [0]=>
        array(4) {
          ["id"]=>
          int(500)
          ["main"]=>
          string(4) "Rain"
          ["description"]=>
          string(10) "light rain"
          ["icon"]=>
          string(3) "10n"
        }
      }
      ["clouds"]=>
      array(1) {
        ["all"]=>
        int(80)
      }
      ["wind"]=>
      array(2) {
        ["speed"]=>
        float(1.18)
        ["deg"]=>
        float(55.0004)
      }
      ["rain"]=>
      array(1) {
        ["3h"]=>
        float(0.31)
      }
      ["snow"]=>
      array(0) {
      }
      ["sys"]=>
      array(1) {
        ["pod"]=>
        string(1) "n"
      }
      ["dt_txt"]=>
      string(19) "2018-03-10 12:00:00"
    }

open weather map api

まず、city listをダウンロードします。
http://bulk.openweathermap.org/sample/

コマンドラインで、解凍します。
$ gzip -d city.list.json.gz

すると、city.list.jsonができます。

[vagrant@localhost weather]$ ls
city.list.json  index.php

jpanの国コードはjp
データを見てみましょう。

  {
    "id": 1850144,
    "name": "Tōkyō-to",
    "country": "JP",
    "coord": {
      "lon": 139.691711,
      "lat": 35.689499
    }
  },
  {
    "id": 1848354,
    "name": "Yokohama-shi",
    "country": "JP",
    "coord": {
      "lon": 139.642502,
      "lat": 35.447781
    }
  },

では、今回は丸の内(“Marunouchi”)でデータを取得してみます。
API Keyはサイトで30秒くらいで取得できます。
https://home.openweathermap.org/api_keys

<?php

$city_code = "Marunouchi";
$API_KEY = "hoge";
$BASE_URL = "http://api.openweathermap.org/data/2.5/forecast/?q=Hachioji,jp&appid=".$API_KEY."";

$forecast = json_decode(file_get_contents($BASE_URL), true);

echo "<pre>";
var_dump($forecast);
echo "</pre>";
?>

weather rain など返ってきてますね。

PHPで浜崎あゆみの昔のアルバムを聞きまくろう

10個リクエストを送ります。
重複してレスポンスが返ってくるので、array_uniqueで重複を削除します。

<?php

require 'vendor/autoload.php';

$session = new SpotifyWebAPI\Session(
    'id',
    'secret',
    'http://192.168.33.10:8000/callback/'
);

$api = new SpotifyWebAPI\SpotifyWebAPI();

$count = 10;

if (isset($_GET&#91;'code'&#93;)) {
    $session->requestAccessToken($_GET['code']);
    $api->setAccessToken($session->getAccessToken());


    $tracks = $api->search('浜崎あゆみ', 'track', array(
        'limit' => $count
        ));
 
// print_r('<pre>');
// var_dump($tracks);
// print_r('</pre>');
    for($i=0; $i<$count; $i++){
        $track_id&#91;&#93; = $tracks->tracks->items[$i]->album->id;
    }


    // print_r($track_id);
} else {
    $options = [
        'scope' => [
            'user-read-email',
        ],
    ];

    header('Location: ' . $session->getAuthorizeUrl($options));
    die();
}

$track_id = array_unique($track_id);
foreach($track_id as $value){
    echo "<iframe src=\"https://embed.spotify.com/?uri=spotify:album:".$value."\" width=\"300\" height=\"380\" frameborder=\"0\" allowtransparency=\"true\"></iframe>";
}
?>

あ、これは結構いい。昔の曲が聞ける。

LUNA SEA行ってみよう。 mothersはかっこよかった。

一曲全部じゃないのが惜しいが。

PHPで浜崎あゆみを聞いてみよう

spotify api
$api->searchでtrackが返ってきます。

<?php
require 'vendor/autoload.php';
$session = new SpotifyWebAPI\Session(
    'id',
    'secret',
    'http://192.168.33.10:8000/callback/'
);

$api = new SpotifyWebAPI\SpotifyWebAPI();
if (isset($_GET&#91;'code'&#93;)) {
    $session->requestAccessToken($_GET['code']);
    $api->setAccessToken($session->getAccessToken());
    $tracks = $api->search('浜崎あゆみ', 'track', array(
        'limit' => 1
        ));
    $track_id = $tracks->tracks->items[0]->album->id;
    print_r($track_id);
} else {
    $options = [
        'scope' => [
            'user-read-email',
        ],
    ];
    header('Location: ' . $session->getAuthorizeUrl($options));
    die();
}
// print_r('<pre>');
// var_dump($tracks);
// print_r('</pre>');
?>
<h1>spotify</h1>
<iframe src="https://embed.spotify.com/?uri=spotify:album:<?php echo $track_id; ?>" width="300" height="380" frameborder="0" allowtransparency="true"></iframe>

まあまあいいんだけど、全部サビ前からサビの30秒位なんだよな。
1曲全部聞けないと、物足りない感が尋常ではない。

あ、iframeこんな感じです。うーん、違うな。やっぱりイントロから聞けないと絶対ダメでしょ。

spotify api invalid redirect uri

index.php

$session = new SpotifyWebAPI\Session(
    'client id',
    'client secret',
    'http://192.168.33.10:8000/callback'
);

spotify

invalid URIのレスポンスが返ってくるため、stackoverflowを見ていたら、

stackoverflow
https://stackoverflow.com/questions/32956443/invalid-redirect-uri-on-spotify-auth
app.js:
var redirect_uri = ‘http://localhost:8888/callback’;
Spotify > My application:
http://localhost:8888/callback/

それでもエラーで
なんでだろうと思っていたら、
myappとlocalで、callback urlは完全一致(バックスラッシュ)にしないといけないようです。
http://192.168.33.10:8000/callback/
http://192.168.33.10:8000/callback/

泣きたくなってきた。