住所から標高を調べる

住所から標高を調べるツールをPHPで作りました。

→住所から標高チェック

先日、なんとなく標高を調べていたのですが、標高チェックサイトで自宅を調べると「標高5m」と出てきました。
しかし、自宅近くの駅に「標高1.6m」と書かれていたのを思い出し、坂道はないのに値がおかしいとフと疑問に思いました。

標高を調べるサイトを検索してみると、Google MapのAPIを使っているサイトがほとんどで、そこでは「標高5m」と表示されます。

ところが国土交通省の国土地理院のサイトで調べると、やはり自宅の標高は1.9mでした。

災害の備えをするうえで5mと1.9mでは差が大きすぎます。
Googleと国土地理院はどうやって標高を調べているのでしょうか。

Googleはお得意の衛星写真から割り出す方法、国土地理院は航空レーザー測量、もしくは写真測量、あるいは等高線のいずれかの値だそうです。

どう考えても国土地理院のほうが正確です。
というわけで、不動産購入をお考えの皆様で標高が気になる方は、データの出処に注意しましょう。

技術的な話をすると、普通はJavaScriptで作ると思うのですが、それだと他のサイトと同じになってしまうと思い、うちではPHPで作ってみました。

PHPのほうが簡単です・・・。


追記:2020年1月12日

Google Maps APIが有料となり、表示されなくなっていたことに気付きました。

Googleの地図自体は表示されるのですが、緯度経度を取得できなくなっていたので、Yahoo!ジオコーダAPIに変更しました。

標高のデータは国土地理院のままです。

ですので複雑ですが、地図そのものはGoogle、住所から緯度経度を取得しているのはYahoo!ジオコーダAPI、標高は国土地理院のAPIから取得しています。
 

Mac:CatalinaでPHPを動かす設定まとめ

MacのCatalinaをクリーンインストールしました。
前の環境に戻すためPHPとphpMyAdminを入れるための設定をまとめておきます。

PHPはCatalinaに元々入っている7.3.9を使います。

ちなみにですが、MacはCatalinaからbashではなくてzshに変わっているので要注意です。
.bash_profileもまんま.zshrcに変わっています。

■Apacheを起動
後々いろいろ面倒なので先にApacheの起動確認をしておく。

/private/etc/apache2/httpd.conf

ファイルをコピーして一応オリジナルを保管。
httpd.confの186行目辺りの

#LoadModule php7_module libexec/apache2/libphp7.so

コメントアウトを外す。
254行目、255行目辺りの2行にrootディレクトリを設定する場所があるので、

DocumentRoot "/Users/ユーザー名/Sites"
<Directory "/Users/ユーザー名/Sites">

などに変更し、rootにSitesディレクトリを作成、仮のindex.htmlファイルを作っておく。

Sitesフォルダを自動的に「サイト」に変更したい場合はSitesディレクトリに以下の非表示ファイルを作ればおk。

touch ~/Sites/.localized

拡張子phpのファイルをindexにしたい場合は、289行目辺りにindex.phpを追加。

DirectoryIndex index.html index.php

ターミナルで、

sudo apachectl start

すればApache起動。
再起動ならstartをrestart。

http://localhost/にアクセスすると先程のindex.htmlが表示されるはず。

 
■php.iniを設定

/private/etc

にphp.ini.defaultがあるのでコピーしてオリジナルは残しておく。
名前をphp.iniに変更。

1,055行目と1,195行目辺りをそれぞれ以下のように修正。

pdo_mysql.default_socket= "/tmp/mysql.sock"
mysqli.default_socket = "/tmp/mysql.sock"

ここはMacオリジナル設定かと。

 
■phpMyAdminインストール
https://www.phpmyadmin.net/
からダウンロードしてまんまSitesディレクトリに移動。
名前を「phpMyAdmin」にでも変更しておく。

/phpMyAdmin/config.sample.inc.php

をコピーしてオリジナルは残す。
ファイル名をconfig.inc.phpに修正し、18行目辺り、

/* YOU MUST FILL IN THIS FOR COOKIE AUTH! */

とあるところにハッシュ代わりにテキトーな文字列を入れておく。
こんな↓感じ

ww6jghiuaweyrw8743h7nkjt9aieryuqwb563y9wruafiy

34行目辺りのfalseをtrueに変更してパスワードなしでログインできるようにしておく。

$cfg['Servers'][$i]['AllowNoPassword'] = true;

http://localhost/phpmyadmin/
にアクセス。
で、いつものように以下のエラー。

$cfg[‘TempDir’] (/Users/hoge/Sites/phpmyadmin/tmp/) にアクセスできません。phpMyAdmin はテンプレートをキャッシュすることができないため、低速になります。

phpMyAdminにtmpフォルダがないため新規作成。
tmpフォルダをコマンド+iで「共有とアクセス権」everyoneに読み/書きOKにする。

 
以上、これが最短距離かと思われます。

PHP: バージョン7でのMySQL接続の雛形

数年ぶりにPHPをいじりました。

あっという間にバージョンが7まで飛んでいまして、やはりまだ5.4くらいで止まっています。

Node.jsに浮気してずいぶんと書き方が変わってしまったので、自分のためにMySQL接続のための雛形です。

一時期PDOが流行りましたけど、結局仕事でもほぼほぼその恩恵に与ることはなく、PHPらしく手続き型です。

PDOはよっぽど設計が悪くない限り必要ないでしょう。

<?php
$id = 1;
$name = '聖徳太子';

$link = mysqli_connect('localhost', 'root', '', 'hoge');
if($link){
  $sql = 'SELECT * FROM foo WHERE id = %d AND name = "%s"';
  $results = mysqli_query($link, sprintf($sql, $id, $name));
  $row = mysqli_fetch_assoc($results);
  var_dump($row);
} else {
  die('ERROR: '.mysqli_connect_error());
}
mysqli_close($link);
?>

以前はsprintf()を使わなかったのですが、こっちのほうがコードがスッキリしますね。

別のコードですが、まったく同じコードをnode.jsでも書いていたのですが、やはりPHPのほうが短くて済みます。。。

Mac SierraのPHPを5から7にバージョンアップする際に気をつけること

MacOS Sierra 10.12.6
PHP 7.1.12
Apache/2.4.29

先日、もう一回最初からMacをサーバーにして遊ぼうと思い、MacBook Proをクリーンインストールしまして、元々入っているPHPを5から7にバージョンアップしました。

まずhomebrewというインストーラを入れてから行う人が多いと思うのですが、普通にbrew install php71でやるとインストールの最後にExtensionsという注意書きが出ました。

With the release of macOS Sierra the Apache module is now not built by default. If you want to build it on your system you have to install php with the --with-httpd option. See brew options php71 for more details.

Google先生に翻訳させると、

macOS Sierraのリリースで、Apacheモジュールはデフォルトではビルドされていません。 あなたのシステムでそれを構築したい場合は、--with-httpdオプションを付けてphpをインストールする必要があります。 詳細については、brew options php71を参照してください。

というわけで、brewでインスコするときに

$ brew install php71 --with-httpd

としなさいね、と言われるのでそうします。
先に言ってくれ。

こちら、その後PHP7.1.17を再インスコした時には出なかったので、うちの環境だけ?みたいでした。

もう一つおまけで、ポート問題。

以前同じようにインスコしたときはデフォルトで80ポートを使っていたので、普通にhttp://localhostで見られたのですが、今回は次のような注意書きが出てました。

The default ports have been set in /usr/local/etc/httpd/httpd.conf to 8080 and in
/usr/local/etc/httpd/extra/httpd-ssl.conf to 8443 so that httpd can run without sudo.

Google先生に翻訳させると、

デフォルトポートは/usr/local/etc/httpd/httpd.confに8080に設定されています。
/usr/local/etc/httpd/extra/httpd-ssl.confを8443に設定して、httpdをsudoなしで実行できるようにします。

デフォルトが8080なので、http://localhost:8080にしないと見られないのです。
どこかで80使われちゃってるみたいですね。

んー、今年のお正月はこれだけで終わってしまった。。。

これも7.1.17では出なかったのでうちの環境だけ?かなと。
 

.htaccessが効かなくて超絶ハマった件

MacBook Proをいじり過ぎたのでいったんクリーンインストールをしまして、バックアップしておいたPHPファイル達を元に戻したら、PHPファイルが一斉に動かなくなりました。

厳密に言うと拡張子をHTMLにしていたPHPファイルが動かないようでした。

まずバックアップファイルのパーミッションが全部777になっていたので755に修正しまして、.htaccessは604に修正しました。

$ chmod 604 .htaccess

それでも.htaccessが動いている感じがせず、google先生に聞くとhttpd.confファイルのAllowOverrideの設定を修正する必要があるとのことでした。

DocumentRootの中にあるAllowOverride NoneをAllに変更します。

#AllowOverride None
AllowOverride All

ところがそれでも動かない! ということでもう少し奥を探すと、同じhttpd.confでmod_rewriteの設定も有効にしないといけないとのことでした。

#LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so
LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so

これにて解決。