地盤データのハッカソン
地盤データのオープンデータハッカソンが jig.jp さんで開催されたので、学生さんを何人か誘って、おまけ参加。
github.com に 福井県のボーリング情報があるけど、要望の中に緯度経度が間違ったデータがあるとの
お話だったので、XML データの緯度経度と、ボーリング箇所の町名データを比較するプログラムを書いてみた。
しかしながら、町名といっておきながら、先頭に川の名前がついていたり、複数の町をまたがっているから○○町〜○○町といった町名記載があって、ボーリングの住所から緯度経度がとれないことが多発。
ということで、ボーリングデータを登録する側で、住所の記載方法を統一化してほしいよねぇ〜という感想。
#!/usr/bin/env python3 import requests import csv import re from bs4 import BeautifulSoup import geocoder import math url_top = "https://raw.githubusercontent.com/GeoFUKUI/jiban-opendata/main/filelist.csv" url_data = "https://raw.githubusercontent.com/GeoFUKUI/jiban-opendata/mai\ n/data/" res = requests.get( url_top ) if res.ok : for line in res.text.splitlines() : url , type , size = line.split(',') if re.match( '.*/DATA/BED\d\d\d\d\.XML$' , url ) : xml_url = url_data + url xml_res = requests.get( xml_url ) if xml_res.ok : soup = BeautifulSoup( xml_res.text , 'xml' ) # <経度緯度情報><{緯度|経度}_{度|分|秒}> for lat_lng in soup.find_all( '経度緯度情報' ) : # <調査位置><調査位置住所> lat_deg = int( lat_lng.find( '緯度_度' ).string ) lat_min = int( lat_lng.find( '緯度_分' ).string ) lat_sec = float( lat_lng.find( '緯度_秒' ).string ) lng_deg = int( lat_lng.find( '経度_度' ).string ) lng_min = int( lat_lng.find( '経度_分' ).string ) lng_sec = float( lat_lng.find( '経度_秒' ).string ) lat = lat_deg + lat_min / 60 + lat_sec / 3600 lng = lng_deg + lng_min / 60 + lng_sec / 3600 # print( lat ) addr = soup.find( '調査位置住所' ).string addr = re.sub( '地係$' , '' , addr ) addr = re.sub( ' ' , '' , addr ) addr = re.sub( '(~|から).*$' , '' , addr ) addr = re.sub( '^.*福井県' , '' , addr ) addr = re.sub( '(.*)' , '' , addr ) addr = re.sub( '\(.*\)' , '' , addr ) addr = "福井県" + addr #print( addr ) geo_addr = geocoder.osm( addr , timeout = 5.0 ) if geo_addr is None : print( "None" ) elif isinstance( geo_addr.latlng , list ) : geo_lat , geo_lng = geo_addr.latlng err = math.sqrt( (lat - geo_lat)**2 + (lng - geo_lng)**2 ) if err > 0.001 : print( "(%f,%f)-(%f,%f)-%s" % ( lat , lng , geo_lat , geo_lng , addr ) ) else : print( "(%f,%f) not [LAT LNG] -%s" % ( lat , lng , addr ) )
個人的なお遊びで、Webデータのスクレイピングは色々と体験あるけど、今までは Perl を使っていた。今回は、自分のチャレンジということで、Python を使ってスクレイピング。
緊急連絡システムサーバ移転
Azureサーバ上で動かしていた緊急連絡システムだけど、azure 仮想マシン(クラッシック) で構築してあったけど、クラッシックが2023/3月より動かなくなるので 最近の仮想マシン形式(ARM)のサーバに移転。
といっても、またサーバ移転しなくちゃいけなくなりそうだけど。
qmailからpostfixに移行
これに合わせて以前より問題となっていた qmail ベースで一部サーバにメールが届かない(設定触って届くようにしているけど…)問題を解決。postfix での配送になったので、大量メールでの配送遅延は大きくなったかもしれないけど、さほど影響しないはず。
DKIM, SPF 対応
メール配信に postfix を使うようにしたから、メールの認証も SPF だけでなく opendkim を使って DKIM にも対応させてみた。現時点では、DNS 設定の修正が完全に終われば、spam 扱いも改善されるはず。
SPF は、ドメインから発信されるメールサーバ情報を DNS で公開することで、不正なメール発信を防ぐ方式。DKIM は、DNS に登録してある公開鍵と、個別のメールに付けられる公開鍵を比較することで、不正なメール発信を確認できる仕組み。
付属中学の生徒さんが IoT の調査
福井の付属中学校の生徒さんが、授業の一環での IoT 調査ということで訪問を受けました。農業に IoT を…やりたいとのこと。今日は技術の概要を説明したけど、実際に作るのなら福井市だったら、IchigoBase に行くとプログラミングとか教えてくれるよ~と紹介させていただきました。
VSCodeとXAMPPのインストール
Webアプリ開発の基本を勉強するために、HTML+CSS、JavaScript のフロントエンドと、PHP+データベースのバックエンドを簡単な演習で体験するのであれば、プログラムのエディタの VS Code (Visual Studio Code) と、自分のパソコンで動かせる Webサーバ XAMPP をインストールして演習してみましょう。
Visual Studio Code のインストール
Visual Studio Code は、Microsoft 社が開発しているプログラムのエディタ(様々なテキストの編集ソフト)であり、最近のプログラマーの中で一番利用されています。
まずは、Visual Studio Code をパソコンにインストールしてみましょう。Visual Studio Code で検索すれば、簡単に見つかると思います。
Windows 10,11 (64bit OS)であれば、Windows System Installer 64bit を選んで、ダウンロードしたファイルを実行しましょう。インストールが始まります。
Visual Studio Code の起動と設定
インストールが終わったら、メニューから を起動してください。
拡張機能のインストール機能を用いて、日本語メニューを出すための Japanese Language Pack をインストールしてください。
拡張機能のインストールが終わると Restart の表示がでるので VSCode の再起動を行ってください。
XAMPP のインストール
次に、XAMPP(正式にはシャンプと発音, ザンプは間違いらしい😢) をインストールします。XAMPP は、様々なOS の上で、ウェブアプリケーションの開発に必要な Webサーバ機能(Apache)、データベース機能(Maria DB)、動的Webページ用言語(PHP, Perl) をまとめてインストールでき、ウェブアプリケーションの学習用に広く使われています。
インターネットに自分の作ったウェブアプリケーションのシステムを公開するのであれば、OS Linux で、Apache, MySQL, PHP を動かすのが一般的です。この構成は通称 LAMP (ランプ) と呼ぶことが多い。XAMPP も X(??), Apache, MariaDB, PHP, Perl の組み合わせなので XAMPP と名付けられた。
XAMPPのダウンロード
XAMPPのホームページのダウンロードより、最新の Windows 用 XAMPP 8.1.6 をダウンロードし、実行するとインストールが始まる。
インストーラーを起動するの以下のような画面になるが、次々と “Yes”や”Next”を選んでいく。
インストールする機能の選択の画面で、今回の演習は、Webサーバ機能(Apache)と、動的なWebプログラム言語(PHP)を選択するだけでいい。
XAMPPの起動
XAMPPのインストールが終わったら、メニューの よりプログラムを起動する。
プログラムを起動すると、Windows のファイアウォール機能により、以下のような画面が出てくるが、アクセスを許可する。
XAMPP が起動すると、タスクバーに XAMPP のアイコンが現れるのでクリックすると、XAMPP のコントロールパネルが表示される。一番上の Apache の “Start”ボタンを押すと Webサーバ Apache が起動する。
右上の “Config” ボタンを押し、以下の画面が表示されたら、”Editor:”欄に、先にインストールした “VS Code” や ”Browser:”欄に、自分が使うブラウザを設定しておくと便利。
ブラウザを起動し、URL 欄に “http://localhost/” を入力し、以下の画面が表示できたら、XAMPP が動いていることが確認できる。
XAMPP で表示するファイルを編集する場合は、VS Code を開き、“C:\xampp\htdocs” の中の index.php や *.html , *.css といったファイルを開いて編集すればいい。
緊急連絡システムにSendGridを使ったら
丹南地区の緊急連絡システムを動かしているけど、最近はメールが届かないといった連絡を受けることも多い。
2021/09/10 については、docomo.ne.jp 宛のメールの配送でトラブルが発生し、設定を見直すことで無事に配送ができるように復旧することができました。
基本的に無料で提供しているサービスだけれど、Azure のサーバから送信すると、迷惑メールの送信者と誤認される可能性が高く、最近のキャリアではメールが届かないなどの問題が起こりやすい。
正しく配信されるようにするために、サーバを信用してもらえるような構成にすることも考えられるが、設定のメンテナンスの負担も懸念される。そこで、Azure サーバでメールを配信するための、有料サービス SendGrid を使うことを検討してみた。
最初に、有料システムを利用することになるので、どの課金体系を利用するのかを判断するために、現在の緊急連絡システムの月別のメール流量を集計してみた。この結果、最近ではコロナによる連絡も多いのか平均4万通/月のメールが流れている。多い時には、10万通を超える場合もある。(下図参照)
これを、元にSendGrid を使った場合の費用を算出してみる。一番安い料金 “Essencial 4k” では、1900円/月 (4万通/月,これ以上は、0.125円/通)、”Essencial 10k” では、3800円/月(10万通/月, これ以上は0.094円/通)となる。これを見ると、現状の平均 4万通 からしても Essencial 4k を採用すれば、約 年額 45,000 円 以下に収まると思われる。(下図参照)
ゼロトラスト研究会
EVER/IPのコネクトフリーさんが、鯖江市・越前市・福井県・地元企業と協力して、EVER/IPの活用を見いだすためのゼロトラスト研究会が行われました。
ゼロトラストとは
- LANなどの小さなネットワーク内を安全とする境界型セキュリティから脱却し、世界中のコンピュータを結ぶ。
- 境界型セキュリティの限界。LANの中でも信用しないという考え方
IPv6
- IPアドレスの詐称の可能性がある
EVER/IP
- Advanced Security
- Autonomous Networking
- Authenticated Connectivity
- 公開鍵暗号。公開鍵のハッシュがIPアドレス
- ゼロタッチプロビジョニング
自治体ネットワーク、三層分離の見直し
- 自治体の3層構造
- 個人番号利用事業系
- LGWAN接続系
- インターネット接続系
- LGWAN系、インターネット接続系に、リモートワークシステムが接続するには。
paiza.io 便利だね
講習会の講師依頼があり、プログラミングの基礎を教えることになったけど、場所が学内でもないため、どういった準備をすべきか思案中。
それなら、paiza.io を使ってみたらとの情報をもらう。
https://paiza.io/
これなら、C++, PHP, JavaScript の動作検証も簡単かな。PHPのコードの中に、JavaScript を埋め込んでもそれなりに動くな。
入力のある JavaScript を動かす簡単なプログラム例
<html> <head> <title> じっけん </title> <script> function my_exec() { let a = document.getElementById( "a" ).value ; let b = document.getElementById( "b" ).value ; let c = document.getElementById( "c" ) ; c.value = parseInt( a , 10 ) + parseInt( b , 10 ) ; return false ; } </script> </head> <body> <h1>たいとる</h1> <form method="POST" action="zz.php" > <input type="text" name="a" id="a" /> + <input type="text" name="b" id="b" /> = <input type="text" name="c" id="c" /> <input type="button" value="BUTTON" onclick="my_exec()" /> </form> </body> </html>
<input type=”submit” … /> とか、<form … onsubmit=”my_exec()” > を使うと、ページ遷移が発生するので、paiza.io の環境では、動かなくなる。<input type=”button” onclick=”my_exec()” /> を使えば、大丈夫。