福野泰介の一日一創 - create every day

交流深い、鎌倉と鯖江。
鎌倉に本社を置くカヤック、社長の柳澤さんより届いた新刊「鎌倉新本主義

なんと、帯デビューというスゴイ演出、ありがとうございます!(柳澤さんによる解説

地域内最適をするほどに下がってしまうGDPという20世紀指標に替わる、地域資本のバランスという考え方とその実践が、鎌倉資本主義に詰まってました。

鎌倉資本主義提唱の地域資本を引用しつつ、新指標を勝手に名付けた「NDD」
N - 何をするか? 地域経済資本(財源や生産性) 地域内GDP?
D - 誰とするか? 地域社会資本(人のつながり) 社会的欲求、承認欲求を満たすもの?(自己実現理論より)
D - どこでするか? 地域環境資本(自然と文化) その土地の魅力?

1つ目のDは、地域通貨の流通、2つ目のDは、そこに住む人の幸福度でそれぞれ計測し、バランスと総量で比較するとおもしろそう。


カマコンバレーからカマコンとなって全国へ拡散中!
福井県鯖江市の名前も入れてもらっていました。

課題に対して理由を探るのは縦だとすると、みんなでアイデアを積み重ねるブレストは横。
縦で思考すると、横の思考が鈍るというのはなんとなく思い当たる気がします。
鯖江を楽しくイノベーションする「ブレスト」、「サバコン」としてやってみましょう!

次回、UDトークなど、多言語アプリをテーマにした鯖江市商工会議所でのイベント「あたらしもんずき勉強会 vol.3」でもブレストします。 ご都合つく方、ぜひどうぞ!

イベントの司会進行を多言語かつ自動で進めるスクリプトを作ってみました。
ひとまず、Macの標準搭載の音声合成コマンド「say」を活用したコンソール版。

時間とアナウンスして欲しい言葉を記述言語、アナウンス言語、テキストの順に書くCSVファイルを作ればOK。

0,ja,ja,英語でカップラーメンの作り方をご案内します 10,ja,en,カップラーメンにお湯を注いでください 20,ja,en,3分間の蒸らし時間に入ります 30,ja,en,10秒経過しました 40,ja,en,20秒経過しました 80,ja,en,残り2分です 140,ja,en,残り1分です 190,ja,en,10秒前 200,ja,en,カップラーメンができあがりました。どうぞお召し上がりください。

プログラムは、オープンソース、「tagengo - GitHub」にあります。
多言語翻訳アプリコンテストのアイデアやサンプル実装としてもどうぞ!
webアプリ化できると手軽に使えて便利かも。

イベントがより手軽に楽しくできるようになるツールで、地域資本主義も一歩前進!?

参考までに、多言語翻訳ライブラリを使った、Python3のプログラムはこんな感じ

import sys if len(sys.argv) < 4: print("[client_id] [clint_secret] [script.csv]") exit(0) client_id = sys.argv[1] client_secret = sys.argv[2] csvfn = sys.argv[3] from getAccessToken import getAccessToken access_token = getAccessToken(client_id, client_secret) from datetime import datetime startt = int(datetime.now().strftime('%s')) import csv with open(csvfn, newline = '') as csvfile: reader = csv.reader(csvfile, delimiter = ',') for row in reader: dt = int(row[0]) src = row[1] dst = row[2] text = row[3] if src != dst: from translate import translate text2 = translate(access_token, src, dst, text) print("time " + str(dt) + "sec : " + text + " -> " + text2) else: print("time " + str(dt) + "sec : " + text) text2 = text from time import sleep while 1: sleep(0.1) now = int(datetime.now().strftime('%s')) if now > startt + dt: break from say import say say(dst, text2)

links
- 新刊『鎌倉資本主義』の「はじめに」と第一章を全文無料公開します。 | 面白法人カヤック
- UDトーク | コミュニケーション支援・会話の見える化アプリ

越前がにロボコンなどのイベント会場で便利な会場案内。
音声合成を使って手軽に、翻訳も使えば多言語案内も即時に反映できて便利!


オートアナウンサー(越前がにロボコンデモ)

多言語音声翻訳コンテスト」で無料トライアル可能な音声合成APIを使っています。
GitHub上に、音声合成呼び出し用の Python3 のプログラムを追加したので、参考にどうぞ!
tagengo - GitHub / taisukef

音声合成API、「越前がにロボコン」のイントネーション違いが気になる。
直したいけど直す方法あるのかな?
IchigoJamでも使える、AquesTalk なら自由自在に制御可能だけど、全部設定するのがちょっと大変。
技術は適材適所で使いましょう。

日本国、内閣府の「官民研究開発投資拡大プログラム」PRISM予算で開催「多言語音声翻訳コンテスト
中学生以上の誰でも応募できるアイデア部門に加えて(小学生は残念!)、音声認識翻訳生成APIを使っての試作品コンテストもスタート!

初回で3万回、5回おかわりできる5万回分のAPIアクセス権を使って試作可能!(計28万回)
ということで、早速 Wikipedia を使った英語学習アプリを作ってみました。
英語と日本語で交互に読み上げる辞典を聞き流すことで学習する「DicLearning(ディクラーニング)」


キーワードを英語でいれると、英語版 Wikipedia で検索し、本文を1文ごとに英語で読み上げ、続いて、翻訳APIを使って日本語化した日本語で読み上げ、再度、英語で読み上げます。 関心あるキーワードだと、頭に入りやすく、操作が殆どいらないので、運転などの移動中などでも楽しく勉強できます。

試作なので、APIアクセス権を取得して使ってください。
こちらからサンドボックスサーバーのアクセス権を申請します。
届いた、client_id / client_secret を使って、GitHub "tagengo" からダウンロードしたPython3のプログラムを動かします。

python3 translateWikipedia [client_id] [client_secret] MSX

AccessToken取得、翻訳API、Wikipediaの取得などができるサンプルとしても活用ください!
* 現在、音声読み上げは Mac に付属の say コマンドを使用しています(音声生成API接続への改造もどうぞ)

まだ謎多い「多言語音声翻訳コンテスト
豪華審査員、総務大臣賞、協賛企業賞等の副賞など、どうなるんでしょうね?
それはともかく、自由にAPIが遊べる大チャンス、あれこれ遊んでみましょう!

プログラミング初心者の方には、「万華鏡アプリコンテスト」もどうぞ!

舞鶴高専出身、さくらインターネット田中さんが委員長を務める、CSAJプログラミング教育委員会に初参加、総務省提唱の地域ICTクラブと採択地域の一例として、福井県こどもプログラミング協議会などを情報提供。

いかに次世代を創るか、企業も行政も、国を含む地域を超えて人類共通の課題。MSX世代だったり、BASICからマシン語へと燃えたあの時も共有できてうれしい。(Armマシン語入門 with IchigoJam


こどもの創造と表現の場を2002年から提供し続ける、NPO法人CANVASの理事長で、超教育協会の幹事、石戸奈々子さん with 光るイチゴ帽子

便利なSaaSがあふれる現代、パソコンさえあれば、サーバーの契約など面倒なことをしなくても、オープンデータの公開、解析、人工知能活用までこどもであっても一直線。 ガンガン小中学生が楽しいエンジニアリングの世界の第一線に来れる環境づくりを目指したい。


KI of taisuke fukuno - Ambient」気分によって送信される福野泰介の「気」の値、オープンデータ

BASICでIoT、IchigoJam x sakura.io や、無線LAN MixJuiceを使ったこども簡単IoT。 サーバーがないこども視点で使えるサービス「Ambient」を使ってみました。

メールアドレスがあれば、無料登録でき、チャンネルをとりあえず生成。チャネルIDと書き込み用のライトキーと値を Python で書いたプログラム sendambient.py で送れば、即折れ線グラフ化してくれました。(参考、AmbientDataInc/ambient-python-lib - GitHub

import http.client import json import sys domain = "ambidata.io"; record = { "writeKey": sys.argv[2], "d1": sys.argv[3] } requestJson = json.dumps(record) headers = { "Content-Type": "application/json" } connect = http.client.HTTPConnection(domain) connect.request("POST", "/api/v2/channels/" + sys.argv[1] + "/data", requestJson, headers) response = connect.getresponse() print(response)

呼び出しコマンドはこちら([writekey]は一応秘密、だけど非SSL)

python sendambient.py 6728 [writekey] 15

送ったデータの読み出しは、単純にwebアクセスで JSON で取得ok!
http://ambidata.io/api/v2/channels/6728/data
(callbackパラメータを指定できるとwebアプリで簡単に使えてうれしいところ!)

IchigoJam x MixJuice を使ったサンプルの丁寧な解説もあります!
IchigoJam + MixJuiceで製作するIoTセンサ – Ambient

いろんなサービスとの連携、開発、提案、紹介していきたいと思います!

教育は最大の投資なり

Maker Faire Tokyo 2018、閉幕。今年もいろんな刺激とたくさんの出会いがありました。
ハッシュタグを追いかけ見つけた、見たかった作品はこちら、IoT黒電話!


なんと小学生がラズパイとPythonで作ったとのこと。こどもの活躍、うれしい!


台湾のプログラミング教育のためのWiFiBoy32で、初MicroPythonに挑戦してみました。

WiFiBoy32で、MicroPythonをインストールし、エルチカするまでの手順
1. esp32用ツールにパスを通す

export PATH=$PATH:/Users/[username]/Documents/Arduino/hardware/espressif/esp32/tools/

2. MicroPythonをダウンロード
3. バイナリを WiFiBoy32 に転送(しばし待つ)

esptool.py --chip esp32 --port /dev/tty.SLAB_USBtoUART write_flash -z 0x1000 esp32-20180805-v1.9.4-440-g3bef7bd78.bin

4. シリアルで接続する

screen /dev/tty.SLAB_USBtoUART 115200

5. 記事を参考にLEDを光らせてみる

import machine led = machine.Pin(16, machine.Pin.OUT) led.value(0)

* WiFiBoy32のLED、回路図を見るとGPIO16をOFFで光るように接続されている
6. エルチカ(上キーを押したら光りっぱなし)

import machine import utime up = machine.Pin(33, machine.Pin.IN, machine.Pin.PULL_UP) led = machine.Pin(16, machine.Pin.OUT) while True: if up.value(): led.value(1) utime.sleep_ms(500) led.value(0) utime.sleep_ms(500)

できた!
いつものPythonで動くのは便利!

でも、やっぱり短いコードなら、IchigoJam BASICの方が簡単!

10 LED BTN(UP)=0:WAIT30 20 LED0:WAIT30 30 GOTO10

IchigoJamでいろいろいじって工夫して、物足りなさを感じてからのステップアップがおすすめです。


こどもプログラミングの老舗、LEGOマインドストームは20周年!貴重な初代モデル展示がありました!


子どもプログラミング喫茶、たくさんの感動が生まれました!


大人も体験プログラミング!


訪ねてきてくれたIchigoJamオーナーと記念写真!


USBシリアルと電源の切り替えスイッチを搭載した、自慢のオレンジカムロボを見せてくれました。


IchigoJam、一度教わると、教えられそうかなっと思えるくらいの簡単さが特徴です。
大人にも喜んでもらえるとうれしい!


上級者にはIoT対応IchigoSodaをいろいろいじってもらってメンタリング。どんどん勝手に夢膨らむ感じがステキ!


IchigoJamの初参加!OtOMOの倉本さん、楽しい機会をありがとうございました!


15歳のWiFiBoy創業者、PCNブースにも来てくれました!


供の操縦、楽しそう!タミヤのムカデロボ、すでにサーボでラジコン化されてました。


PCN北千住&PCNブース、おつかれさまでした!


PCNブース、たくさんのご来訪ありがとうございました。子供でもできちゃう手書きPOPメソッド。


花添えた、未就学児でも楽しめるプログラミング環境「IchigonQuest」のエルイー


たくさんのこどもたち!


こどもが作った作品を、こどもが楽しむ!


こどもが開発、笑顔になれるボタン!


高専カンファレンス、おびなたさん!


イスラエルから!


Pimoroni x MagPi


ラズパイユーザーグループ太田さんと!


同時開催のデザフェス、オレンジの作業服が決まってる「紙でできた道路アクセサリー」というレアジャンル!


極小LEDをなんと手半田して作っている光るペンダント。光るアクサリー、来ますね!


大好きなBLAMEのような世界観。


融合するともっと楽しいことになりそう!


Startup Weekend Tokyo @ Maker Faire Tokyo


今回のMaker Faire内開催の発端となった、大田区、スゴイ!沖縄も鯖江市も負けてはられません!


子供の発想による自由な作品が増えるともっとすごいイベントになりそう!
Maker Faire、次は大垣開催

100円コンピューターでも秒回5000万計算。 元々はグラフィックス用に開発されたGPUの汎用利用により、手軽に秒間1兆回という単位の計算をこなせるようになっている現代のパソコン。 普段はその持てる力をほとんど使っていない状態です。

AIの一種、機械学習は脳をモデル化したもの。入力と出力をつなぐ、大量のパラメーターを有り余るコンピューターの計算力を使って、いい感じに求める技。 複雑な脳のモデル化(ディープラーニング)も、現代コンピューターによってなんとかなってしまう時代です。

機械学習に便利なオープンソースなライブラリTensorFlowと触れ合う金曜イベント、TensorFriday#02のテーマは手書き文字認識。 短いPythonのプログラムを動かして、ディープじゃないラーニング(nn)の結果と、ディープラーニング(cnn)の結果を体験しました。

せっかくなら、自分でかいた文字を認識させてみたいところなので、webアプリのお絵かきツール「freepad」を改造してPython用の28x28の配列データを生成するアプリ「fornn」を作成。 見事、パッドで書いた下手な数字「5」を認識してくれました!

テストデータを入れ、5を認識するように改造した nn.py in Python3

次回のTensorFlow#03に向けた、講師やテーマ、募集中!

Code for Japan 地域フィールドラボ、健康と特定健康診断をテーマにしたディスカッション。
人ではとても見きれない健康に関する多量のデータでも、機械学習に突っ込んでみることで、なんとかなりそうな気がします。

links
- Hana道場、若宮さんと学ぶIoTとIchigoJamプログラミングと地域フィールドラボ第5期スタート!
- 地域フィールドラボの募集テーマを大公開! | Code for Japan

元ホワイトハッカーな友達、あみるとペアプログラミング。
得意なwebアプリ&SPARQLと、あまり触らないサーバーサイドの知識。
1台のPCを2人で使う、ペアプログラミング形式でトレード。

無数に存在し、日々世界中の開発者によって進化するソフトウェアという道具。
慣れているがゆえの罠は、ちょっとの不便が日常化してしまうこと。
便利なツールがないかと探す手前で、毎日少しずつ、時間ロスを積み重ねていることになる。

ペアプログラミングという共同作業で、明らかになるちょっと便利。
それならこうするともっと便利、これを使うと楽、こんな方法もあるよ、など。
教わるだけでなく、教えられることもあり、なかなかおもしろい体験。

伝授してもらったエンジアリングツール
軽量仮想環境 docker
便利と噂の iTerm2
高速ウィンドウ整理 ShiftIt
クリップボードマネージャー Flycut
PCパスワードで保存パスワードは確認できちゃう(再発行手間を省く) Chrome
DvorakユーザーとQwertyユーザーがペアプロするためのドングル QIDO

そこまで困ってないからこそ、その場でコミュニケーションしながら最速の学習時間で導入できることにメリットあり。

ちょっとした不満、やり過ごさないために、前々から思っていたすばやく使える手元英和辞書を作成。


dict - コマンドラインから英単語を入れると、ヒットする項目を日本語と共に表示するツール

手元辞書 dict 作り方
1. オープンソースな辞書を検索。(マッシュアップ可能なライセンスの英語辞書(フリー辞書)
2. ライセンスが、CC BY SA EDRDG の辞書に決定
3. ダウンロードしてみる JMdict-EDICT Dictionary Project 内の "JMdict_e.gz - the JMdict file with only English glosses"
4. 中身は巨大な1ファイルのXMLと確認

<entry> <ent_seq>2836190</ent_seq> <k_ele> <keb>北京原人</keb> </k_ele> <r_ele> <reb>ペキンげんじん</reb> </r_ele> <sense> <pos>&n;</pos> <gloss>Peking man (Homo erectus pekinensis)</gloss> </sense> </entry>

5. Python3でプログラムを書く

# coding: utf-8 import sys from xml.etree.ElementTree import * key = sys.argv[1] print("keyword: " + key) tree = parse("JMdict_e") ele = tree.getroot() cnt = 0 hit = 0 for e in ele.getiterator("entry"): s = e.find(".//gloss").text if key in s: ja = e.find(".//keb") if ja != None: print(ja.text) else: ja = e.find(".//reb") if ja != None: print(ja.text) print(s) hit += 1 cnt += 1 print("hit: " + str(hit) + " / " + str(cnt))

6. 使える!便利!
高速化や、辞書を拡充する機能、しゃべらせる機能などは必要に応じてつくる、お楽しみにとっておく。

ペアプログラミング、ハッカソンなどのイベントから実践してみると良さそう。
凄腕ハッカーに、ザザっとアセスメントしてもらうサービスもありかも。

自学は大事、でも、その罠を認識することもまた大事。
うまくハマれば、大いに時間を創り出してくれるのが、ツール。
お気に入りの道具、シェアしましょう!

日本語を(一部)理解する、スマートIchigoJamができました。声でプログラミング!

IchigoJamの基本的な単語(コマンド)と数を聞き分け、代わりにキーボードを打ってくれます。
(正確にはシリアルでIchigoJamへ送っています)


「LEDつけて」と呼びかけても、耳がついてないIchigoJamはやってくれないよ。
と、IchigoJamプログラミング体験の時に紹介しますが、「耳」とそれを聞き分ける「機能」をつければOKです!

スマートIchigoJamの作り方 (for Mac)
オープンソースでフリーな日本語音声認識「Julius」(ジュリアス)を準備する
オフラインでフリーで使える音声認識 Julius、声で操作するロボを自作しよう

認識する辞書をつくる

cat > test.yomi % ACTION 1 いち 2 に 3 さん 4 よん 5 ご 6 ろく 7 なな 7 しち 8 はち 9 きゅう 9 く 10 じゅう LED1 えるいーでぃーつけて LED0 えるいーでぃーけして WAIT60 まって GOTO1 いちえいって RUN らん LIST りすと ESC とめて ENTER えんたー % NS_B [s] silB % NS_E [s] silE

文法をつくる

cat > test.grammar S : NS_B TARGET ACTION NS_E S : NS_B TARGET WO ACTION NS_E

Julius用に変換

iconv -f utf-8 -t eucjp test.yomi | yomi2voca.pl | iconv -f eucjp -t utf-8 > test.voca perl ~/sandbox/julius-kits/grammar-kit-4.3.1/bin/linux/mkdfa.pl test

Juliusをモジュールモードで起動

julius -C ~/sandbox/julius-kits/grammar-kit-4.3.1/hmm_mono.jconf -input mic -gram test -module

Python3で認識したコードをIchigoJamに送る言葉に変換するプログラムをつくる
(XMLパースにElementTree、シリアル接続にpyserialを使用)

cat > julius-client-ichigojam.py #!/usr/bin/env python3 import xml.etree.ElementTree as ET import socket import serial ser = serial.Serial("/dev/tty.SLAB_USBtoUART", 115200, dsrdtr=True) def recog(words): s = "" for w in words: s += w print(s) if s == "1": ser.write(b"1 ") elif s == "2": ser.write(b"2 ") elif s == "3": ser.write(b"3 ") elif s == "4": ser.write(b"4 ") elif s == "5": ser.write(b"5 ") elif s == "LED1": ser.write(b"LED1\n") elif s == "LED0": ser.write(b"LED0\n") elif s == "WAIT60": ser.write(b"WAIT60\n") elif s == "GOTO1": ser.write(b"GOTO1\n") elif s == "RUN": ser.write(b"RUN\n") elif s == "LIST": ser.write(b"LIST\n") elif s == "ESC": ser.write(b"\x1b") elif s == "ENTER": ser.write(b"\x10") client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(("127.0.0.1", 10500)) sockfile = client.makefile() data = "" while 1: line = sockfile.readline() if line != ".\n": data += line else: root = ET.fromstring(data) data = "" if root.tag == "RECOGOUT": words = [] for wordtag in root.iter("WHYPO"): words.append(wordtag.attrib["WORD"]) words.pop(0) words.pop() recog(words)

実行!音声コントロールIchigoJamのできあがり!

python3 julius-client-ichigojam.py

pyserialがなければ、pipでインストール(USBシリアルは環境に合わせて書き換えてください)

pip install pyserial

自分なりの「スマート」をプログラミングしちゃいましょう!
ネットワークが不要なので、ラズパイゼロなどに入れて、コンパクトに動かす音声認識モジュールにすると良さそうです。

links
- オフラインでフリーで使える音声認識 Julius、声で操作するロボを自作しよう

APIを使った音声認識の精度はなかなか高いのですが、ネット接続が必須なので電力的やコスト的にまだ合わない場面多々。

そこで、Interface 2018.4号で発見、オフラインかつフリーで使える音声認識エンジン「Julius
読みは、ジュリアス、でした、ユリウスではなく(Thanks < 青木さん

事前に音声調整をすることなく使え、認識精度もそこそこいい感じ。辞書を自分で作って、その中から認識させることができて使い勝手良し。 ラズパイ0や小型でオフラインのA+などにいれて、IchigoJam連携するモジュールにするのにもいい感じそう!


「テレビ付けて」を認識した様子 on Mac

Juliusのインストールから、独自語彙認識させるまでのメモ (for Mac)
インストール

git clone https://github.com/julius-speech/julius.git cd julius ./configure --enable-words-int make sudo make install cd ~ mkdir -p sandbox/julius-kits cd sandbox/julius-kits wget -O dictation-kit-v4.3.1.tar.gz https://github.com/julius-speech/dictation-kit/archive/dictation-kit-v4.3.1.tar.gz wget -O grammar-kit-4.3.1.tar.gz https://github.com/julius-speech/grammar-kit/archive/v4.3.1.tar.gz tar xvf dictation-kit-v4.3.1.tar.gz tar xvf grammar-kit-4.3.1.tar.gz mv dictation-kit-dictation-kit-v4.3.1 dictation-kit-v4.3.1 cd ~/sandbox/julius-kits/grammar-kit-4.3.1/bin/linux/ ln -s `which mkfa` ln -s `which dfa_minimize`

独自語彙設定

mkdir -p ~/sandbox/test cd ~sand/box/test cat > test.yomi % TARGET IchigoJam いちごじゃむ テレビ てれび アンプ あんぷ ウーハー うーはー LED えるいーでぃー % ACTION つけて つけて 消して けして ON おん OFF おふ % WO を お % NS_B [s] silB % NS_E [s] silE

独自文法設定

cat > test.grammar S : NS_B TARGET ACTION NS_E S : NS_B TARGET WO ACTION NS_E

独自語彙をJulius用に変換しておく

iconv -f utf-8 -t eucjp test.yomi | yomi2voca.pl | iconv -f eucjp -t utf-8 > test.voca perl ~/sandbox/julius-kits/grammar-kit-4.3.1/bin/linux/mkdfa.pl test

独自語彙を設定して、音声認識エンジンを動かすスクリプト

cat > julius-server.sh julius -C ~/sandbox/julius-kits/grammar-kit-4.3.1/hmm_mono.jconf -input mic -gram test -module &

音声認識エンジンに接続して、認識したコマンドを受け取るスクリプト(Python3)

cat > julius-client.py #!/usr/bin/env python3 import socket client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(("127.0.0.1", 10500)) sockfile = client.makefile() while 1: line = sockfile.readline() print(line)

試しに、音声認識エンジンを動かし、認識させてみる

sh julius-server.sh python3 julius-client.py

client.sendで、認識を一時中止したり、認識語彙を切り替えてYES/NOのみを待ったりといろいろできて、便利そう!
モジュールモードについて - Julius

links
- 声だけでプログラミング! 耳がついたスマートIchigoJamの作り方

消火栓がすっぽり埋まってしまうほどの大雪に見舞われた福井県。
大雪警報は継続中です。
大雪に伴う市民生活情報 – めがねのまちさばえ 鯖江市


左:完全に埋まった消火栓、右:消火栓救出成功!

火事から守る命綱、消火栓も合わせて除雪しておきましょう。

消火栓を探す - findhydrant
金沢では金属探知機で消火栓を探していたそうですが、緯度経度データ付きの消火栓オープンデータで市民の力で防災対策が可能です。 odp / オープンデータプラットフォームの消火栓テンプレートで登録すれば、すぐにこのアプリに反映されます!
金属探知機で消火栓探し除雪 金沢市消防局 | NHKニュース

警報チェックにオープンデータを活用します。
気象庁による配信されているオープンデータが、AITCによってSPARQL APIで取得できるようになっていました。
先端IT活用推進コンソーシアム - 公開API

福井県の警報・注意報のデータがあるURLを取得するSPARQLクエリーがこちら

select * { <urn:uuid:f57b5866-0c8c-3c92-9aff-10a715cdf48b> atom:entry ?o. ?o atom:updated ?updated. ?o atom:content ?content. ?o atom:link ?link. ?o atom:title ?title. FILTER(REGEX(?content, "福井")) FILTER(REGEX(?title, "気象特別警報・警報・注意報")) } order by desc(?updated) limit 1

これを使って、市町村毎の警報、注意報を取得するPython3のプログラムを作ってみました。

import urllib.request import urllib.parse import xml.etree.ElementTree as ET import dateutil.parser import sys if len(sys.argv) == 1: print("getalerm.py [pref] [city]") print("ex) python3 getalerm.py 福井 鯖江市") print() pref="福井" city="鯖江市" else: pref=sys.argv[1] city=sys.argv[2] query = ( 'PREFIX atom: <http://www.w3.org/2005/Atom#>\n' 'select * {\n' ' <urn:uuid:f57b5866-0c8c-3c92-9aff-10a715cdf48b> atom:entry ?o.\n' ' ?o atom:updated ?updated.\n' ' ?o atom:content ?content.\n' ' ?o atom:link ?link.\n' ' ?o atom:title ?title.\n' ' FILTER(REGEX(?content, "' + pref + '"))\n' ' FILTER(REGEX(?title, "気象特別警報・警報・注意報"))\n' '} order by desc(?updated) limit 1\n' ) print(query) url = "http://api.aitc.jp/ds/sparql?query=" + urllib.parse.quote(query) + "&output=xml" #print(url) resfn, headers = urllib.request.urlretrieve(url) #resfn = "/var/folders/0p/8n831_gn5j97jrlqmh5ddggc2s2n0c/T/tmpaqzg7_ib" print("sparql result file: " + resfn) tree = ET.parse(resfn) root = tree.getroot() xmlurl = tree.find(".//{http://www.w3.org/2005/sparql-results#}binding[@name='link']")[0].text updated = tree.find(".//{http://www.w3.org/2005/sparql-results#}binding[@name='updated']")[0].text supdated = dateutil.parser.parse(updated).astimezone().strftime("%Y/%m/%d %H:%M:%S") # xmlfn = "4848abcd-56a2-3170-8468-4fef8be3d405.xml" xmlfn, headers = urllib.request.urlretrieve(xmlurl) print("xml file: " + xmlfn) print("updated: " + supdated) tree = ET.parse(xmlfn) root = tree.getroot() warn = root.find(".//{http://xml.kishou.go.jp/jmaxml1/body/meteorology1/}Warning[@type='気象警報・注意報(市町村等)']") for item in warn: area = item.find(".//{http://xml.kishou.go.jp/jmaxml1/body/meteorology1/}Area") name = area.find(".//{http://xml.kishou.go.jp/jmaxml1/body/meteorology1/}Name").text # print(name) if name == city: for kind in item: if kind.tag == "{http://xml.kishou.go.jp/jmaxml1/body/meteorology1/}Kind": alert = kind.find(".//{http://xml.kishou.go.jp/jmaxml1/body/meteorology1/}Name").text print(alert)

SPARQLクエリーの渡し方、ネームスペース付きXMLのパース、日付の日本時間変更などやってます

備えあれば憂い無し。災害は忘れた頃にやってくる。
痛い目に遭った今こそ、次に向けた手を創っておきましょう!

links
- 気象庁防災情報XMLフォーマット | 技術資料
- 大雪に伴う市民生活情報 – めがねのまちさばえ 鯖江市
- odp / オープンデータプラットフォーム

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / アイコン画像 / プロフィール画像