IchigoJamで動作する数十byte単位のプログラムも実装可能なモダンプログラミング言語 Rust。 サーバー実装の実験にリアルタイムwebの要、WebSocketを使って単純に送った文字列が返ってくる、echoサーバーづくり!

JavaScriptのランタイム Denoと、HTTPサーバーモジュール Servest を使った WebSocket の echo server のコードは Servest を使ってこんな感じ。 (servest 1.1.0 では、Deno 1.2.0 でエラーが発生、stdモジュールを新版への差し替えプルリク、下記は servest v1.1.1で動作します!)

import { createApp } from "https://servestjs.org/@v1.1.1/mod.ts"; function handleHandshake(sock) { async function handleMessage(sock) { for await (const msg of sock) { if (typeof msg === "string") { sock.send(msg); } } } handleMessage(sock); } const app = createApp(); app.ws("/ws/", handleHandshake); app.listen({ port: 8080 });

続いて、WebSocketのclient

import { WebSocket } from "https://deno.land/x/websocket/mod.ts"; const endpoint = "ws://127.0.0.1:8080/ws/"; const ws = new WebSocket(endpoint); ws.on("open", () =< { ws.send("hello!"); }); ws.on("message", message =< { console.log("recv", message); ws.close(); });

シンプルに書けて、いい感じ!(deno run -A server.js と den run -A client.js で実行)

続いて、Rustで書く WebSocket の echo server には、速そうな(TechEmpower Web Framework Benchmarksで現在2位)の Actix を使ってみました。

use actix::*; use actix_web::{web, App, Error, HttpRequest, HttpResponse, HttpServer}; use actix_web_actors::ws; struct EchoSession { } impl Actor for EchoSession { type Context = ws::WebsocketContext<Self>; fn started(&mut self, _ctx: &mut Self::Context) { } fn stopping(&mut self, _ctx: &mut Self::Context) -> Running { Running::Stop } } impl StreamHandler<Result<ws::Message, ws::ProtocolError>> for EchoSession { fn handle(&mut self, msg: Result<ws::Message, ws::ProtocolError>, ctx: &mut Self::Context) { let msg = match msg { Err(_) => { ctx.stop(); return; } Ok(msg) => msg, }; match msg { ws::Message::Ping(_) => { }, ws::Message::Pong(_) => { }, ws::Message::Text(text) => { ctx.text(text); } ws::Message::Binary(_) => println!("Unexpected binary"), ws::Message::Close(reason) => { ctx.close(reason); ctx.stop(); } ws::Message::Continuation(_) => { ctx.stop(); } ws::Message::Nop => (), } } } async fn echo_route(req: HttpRequest, stream: web::Payload) -> Result<HttpResponse, Error> { ws::start(EchoSession {}, &req, stream) } #[actix_rt::main] async fn main() -> std::io::Result<()> { HttpServer::new(move || { App::new() .service(web::resource("/ws/").to(echo_route)) }) .bind("127.0.0.1:8080")? .run() .await }

必要なものはきっちり書くスタイルなので、少し長いですが、やっていることは一緒です。Cargo.tomlにパッケージ名を記入して、cargo runでコンパイル&実行しておきましょう。

[dependencies] actix = "0.9.0" actix-web = "2.0.0" actix-web-actors = "2.0.0"

続いて、client は、こう書けます。

use websocket::{ClientBuilder, Message}; fn main() { let mut client = ClientBuilder::new("ws://127.0.0.1:8080/ws/") .unwrap() .connect_insecure() .unwrap(); let message = Message::text("hello!"); client.send_message(&message).unwrap() let mes = client.recv_message().unwrap(); println!("{:?}", mes); }

Cargo.toml の dependencies に websocket="*" を追加し、Cargo run で動きます。

コネクション確立後、「hello!」を送って返ってくるものを100回繰り返して、時間を計測。 最速タイムで、Deno:35msec、Rust:25msecと、Rustが速いですが、Deno/JavaScriptでもベースは十分速そうです。

ちょっと応用、RustのActix、ブラウザから接続するチャットのサンプルを動かしてみました。 JavaScriptのコードが、jQueryコードだったので、モダンスタイルに更新!(src on GitHub)

速さが要のリアルタイムweb用サーバーづくり、Rustで実装、楽しいかも?

なぜ、こどもにプログラミングを教えるのか?
→ プログラミングが汎用的で強力なツールであり、こどもにできるほど簡単だから

社会にネット(=コンピューター)が広まる程、プログラミングの力は強まります。昔はゲームづくりや専門的な解析が中心でしたが、IoT時代、身近な課題解決にもすぐ活用できます。

「十分に発達した科学技術は、魔法と見分けがつかない(クラークの三法則)」
Bluetoothイヤホンで通話しながら歩いている様子はテレパシー、3Dプリンターはテレポーテーション、ドローンの編隊を自在に操る様はまるで魔法。自在に操れたらもっとステキです。


学校を変えた最強のプログラミング教育 | 松田孝
前原小学校元校長の松田さんの本にも、ドローンプログラミングがこどもや大人に与えたインパクトと、意外とシンプルな制御プログラミングが掲載されています。 (その後、更に改良され「FruitPunch(フルーツポンチ) x IchigoDyhook(いちごだいふく)」で、もっとシンプル、もっと手軽にドローンプログラミングできるようになっています。)


松田さんとの出会い、書いてありました!2016年12月、福井で開催した「第1回こどもプログラミングサミット」の会場にて、IchigoJamのはんだづけからのプログラミング体験をしてもらってからのご縁です。 (ナチュラルスタイル松田さんも登場!、学校は「社会の求め」に応えられるか?校長・教頭へのおすすめ本! – about yrm


zoomお茶会IoTと地方創生で共同プロジェクト進行中のKDDI松野さんも参加!
IoTは、ITの集大成。身近な課題から、世界的な課題まで、多方面での活躍が期待されていますが、深刻な担い手不足。小中学校でのプログラミング必修化は大きなチャンス!

今日テーマにしたのは、身近な課題、眠りの快適さをアップするIoT。 きっと、部屋の温湿度が大事!でも、快適と感じる状況は人によって異なります。 まずは計測。IoT対応IchigoJamと、手軽で高性能な温湿度計SHT31を使って、日々の変化を記録してみます。

1 @ARUN 10 POKE#700,#2C,#06:R=I2CR(#45,#700,2,#700,6) 20 IOT.OUT #700,8 30 WAIT 60*60*5 40 GOTO 10

I2Cで取得したデータを(10行)、IchigoSodaで送信し(20行)、5分待って(30行)、くりかえし(40行)。シンプルですね!

sakura.ioのモジュールの管理画面で、DataStoreV2 APIを設定します。1ヶ月分保存なら追加料金はかかりません。 管理画面からCSVでダウンロードができるので、あとは、解析し放題!

解析をプログラムで自動化したい場合、パソコンでデータをダウンロードしましょう。JavaScriptをパソコン上で動かす、Denoをインストールし、このプログラムを test.mjs として保存。 (sensorname: 保存するディレクトリ名、token: DataStoreV2のtoken、moduleid: 使用するモジュール)

import download from "https://code4sabae.github.io/sakuraio-es/download.mjs"; await download(7, "sensorname", "token", "moduleid", 1);

あとはコンソールで動かすだけ!

$ deno run -A test.mjs

これだけで過去1週間分のJSONデータを日付ごとにダウンロード完了です! 詳しく知りたい方は、オープンソースのJavaScriptプログラム(src on GitHub)をどうぞ。 JavaScriptについて学びたい場合は「JSはじめのいっぽ」をどうぞ。 ネットがあれば、わからないものを無限に追求できますね。(社会実装例、バスの走っている場所、混雑状況などのIoTによって進む見える化 by ダイヤ編成〚その筋屋〛公式 ❄ @Sujiya_Systemさん)

このように、実現したいことを叶える技術が急速に発展し、ネットというインフラによって多くはソフトウェア化している上に、その大半がオープンソースソフトウェアとして誰でも自由に利用でき、改造でき、その開発に貢献することもできます。

ものづくりには、ソフトウェア、ハードウェア・素材までさまざまなレイヤーがありますが、ソフトウェアづくりはコンピューターさえあれば誰にでも始められる最も手軽なものづくりです。


バリエーション豊富なIchigoJam、IchigoSodaは4G通信モジュール対応のソーダカラーがかわいいIchigoJamです。 中央のチップが、100円のCPU。今回の高精度温湿度計SHT31も右下、黒い四角がその本体。あとは電源つないで動かすだけ! 世界中から登場する小さくて安くてワクワクする電子パーツたち。 プログラミングでつないで何創る?夢、膨らみますね!

日本一プログラミングを小学校現場で実践した、松田さんによる熱い著書。
学校を変えた最強のプログラミング教育 | 松田孝
ワクワクする未来を、こどもたちへ!

中止になった高専プロコンの競技部門、2020年の競技部門が永遠に失われるのも寂しいので、勝手開催しようと集まった仲間とオンラインハックデー。

釧路、木更津、函館、そして福井から集まった有志で開発した3時間半(16時から19時半)

実は誰も高専プロコン経験者がいなかった今回、まずは高専プロコンと競技部門の概要説明と、今回のルールをソースコードを見ながら解説。 プログラミング言語も、オブジェクト思考も実際触ってみると、理解が深まるものです。(JDK1.0.2での経験者)

スマホで遊んでみたいよねと、webアプリチーム、通信対戦するための仕様決めないとねと、プロトコルチームの2チームに分かれて開発スタート。 1スプリント1時間弱の超短縮スクラム、zoomのブレイクアウトルームでそれぞれ進めました。


GitHub、HTML、CSSがはじめての人向けレクチャーは、画面共有してもらってサポートが便利ですね!(参考、HTML/CSSはじめのいっぽ

今回の進捗はこちら!

Kakomimasu – Figma
オンラインデザインツール「Figma」を使用。イメージがあると、ワクワクしてきますね!


かこみますネットワークプロトコルを決めようの会 - HackMD
前回30回大会時のプロトコルが参考になるのと、連続出場者にも優しそうと、ひとまずそれをベースにして作ることに決まり。

2スプリント終わって、KPTでふりかえり。よかったので続けるキープ、気がついた問題点を挙げるプロブレム、次の挑戦トライ。ばばっと、それぞれ2分ずつ、Slackに書き出して、終了!

次の実装に向けて、イチオシDenoでの実装を提供。JSONで受け取り、JSONで返す。シンプルなAPIサーバーのモックを JavaScript on Deno で作ってみました。

import { createApp } from "https://servestjs.org/@v1.1.0/mod.ts"; // https://servestjs.org/ const api = (token, path, req) => { const res = { yourToken: token, yourPath: path, nActions: req.actions.length, }; return res; }; const app = createApp(); app.handle(/\/*/, async (req) => { try { const token = req.headers.get("Authorization"); const json = await req.json(); console.log("req", json); const res = api(token, req.path, json); console.log("res", res); await req.respond({ status: 200, headers: new Headers({ "content-type": "application/json" }), body: JSON.stringify(res), }); } catch (e) { console.log("err", e); } }); app.listen({ port: 8880 });

使用したフレームワークは、Servest、シンプルに書けて高機能なDeno用のHTTPサーバーです。

app.handle に受け取りたいpathを正規表現で書いて、中身を書くだけ。JSONで受け取り、JSONで返すことに特化した関数 api をいろいろ自由に作りましょう。

curlコマンドを使って、コンソール(コマンドプロンプト)から、呼び出して実験できます。C言語でも何でもコマンド呼び出しさえ使えれば、使えそうですね!

$ curl -H 'Authorization: token1' -X POST http://localhost:8880/action -d '{"actions":[{"agentID": 2, "dx": 1, "dy": 1, "type": "move"}, {"agentID": 3, "dx": 1, "dy": 1, "type": "move"}]}' {"yourToken":"token1","yourPath":"/action","nActions":2}

上記モック実装は、受け取ったactionの数を数える動作。nActionsが2となっています。(src on GitHub

次回は、6/17(水)20:00-22:00、参加希望の高専生、下記Slackまでどうぞ!
Slack: Code for KOSEN

IMI住所変換コンポーネントのコア、lgcodegeocodeを改善し、逆ジオコーディングに対応。
住所のジオコーディング、逆ジオコーディング(丁目レベル)」(src on GitHub)
JavaScriptのランタイム、Denoのキャラクターは、MIT Licenseのオープンデータ。背景に登場してもらったらぐっとかわいくなりました。

日本の地理への理解が深まりましたが、まだ奥が深いです。泊村(とまりむら)、北海道にふたつあるってご存知でしたか? 池田町が4箇所あるなど、都道府県を越えてのかぶりは把握していましたが、道内かぶりの想定も必要でした。北海道の場合、振興局という地方公共団体名が登場します。

geocodeでちょっと古い街区データからの変換時にエラー。最近名前が変わった、丹波篠山市と那珂川市への対応は、ひとまず手動対応しました。(makedata.mjs)

if (city2 === "篠山市") city2 = "丹波篠山市"; // v16は丹波篠山市に改名する前のデータ if (pref === "福岡県" || city2 === "筑紫郡那珂川町") city2 = "那珂川市"; // v16は那珂川市に改名する前のデータ

ただ、住所を正規化する際、古い住所を変換するニーズは割とありそうなので、古い市区町村との対応追加は実装したほうが良さそうです。(現在版は、現存する市区町村のみデータ化しています)


Denoくんがかわいいので、suzuriでTシャツを作ってみました。どう配置するか、バランスが難しい! Denoくんは、チンアナゴではなく恐竜です。
(出展、Deno 1.0リリース記念イラストを描きました - No Regrets in Bathing



Deno goods - suzuri
Denoグッズ、いろいろ作ってみたので、よかったらどうぞ!色やサイズは選べます。登録すれば、配置も自在に調整できますよ!

Denoへのもうひとつプルリクも無事マージ!
自分で使うツールのオープンソースに参加すると、何か合っても自分で解決できる感が高まってよいですね!

気にはなりつつも、使う機会がなかったプログラミング言語 Rust(ラスト)。 お気に入りのJavaScriptの実行環境、Denoで使われています。

Denoで直したいところがあり、最新版1.0.5でも、Issuesプルリクでの話題にもなっていなかったのでプログラムを取得し、改造し。プルリクしたら、主要開発者からコメントが付き、反映された! (プルリクとは、GitHubなどで使われる共同制作ソフトGitの重要機能で、反映要求。承認されて初めて反映される仕組み。)


added mjs files for default test by taisukef · Pull Request #6122 · denoland/deno
有名OSSへの初貢献の内容はこちら。Deno test の mjs 対応。

歴史が長いJavaScript、変数宣言が不要だったり、スコープが分かりづらいvarとの決別した、モジュールベースの新しいJavaScriptの拡張子 .mjs でいこうと決めて、開発しているが、Denoのテストでは、.jsや.tsしか認識してくれない。(参考、jsからmjsへ

.mjs も普通にコンパイルなどは普通にやってくれるので、きっと追加し忘れているに違いない。分かりやすくまとまったRustのコード、該当箇所を発見。

C/C++と同等またはそれ以上の記述力を持つRust。C言語からの系統、ほとんどのプログラムはRustを知らなくても普通に読める。 「||」という演算子は、C、Java、JavaScript、IchigoJam BASICでも同じ「または」を意味する論理演算子。 deno test の対象となる拡張子が並んでいるので、"mjs"を追加。


失敗したのがこちらドキュメントの訂正。mjsの追記だけと思って油断し、チェック後に手書きしたのが悪かった。 PR後の自動テストではねられてしまい、整形してねとコメントがついた。ドキュメントも書式が荒れないよう、規定桁数が設定されていた。 Denoの開発者さん、優しくて助かりましたが、大いに反省。自動テスト、偉い。

$ cargo test $ tools/format.py $ tools/lint.py

Contributing(貢献方法)のプルリク前の確認事項。

1. イシューやプルリクで同様内容をチェック
2. テストが変更点をカバーしていることをチェック
3. 全体テストプログラムを実行して問題ないことを確認 (cargo test)
4. 書式整形プログラムを実行(tools/format.py)
5. プログラムに問題がないことを確認(tools/lint.py)

オープンソースへの参加は、チーム開発に関する最新技術に触れられるので、何かお気に入りにツールへの貢献。チャレンジしてみると良いですね!

自動書式整形の優秀さに触れたので、使うことにした deno fmt。こちらもデフォルトに mjs が含まれていないので、もうひとつプルリク。(→ 後日、無事マージされました)
added mjs files for default fmt by taisukef · Pull Request #6134 · denoland/deno
ちょっとしたコードですが、世界中で使われると思うとうれしいですよ!


鯖江市役所にて、鯖江市長の牧野さん、牧田さんとIT話。
まちづくりもオープンソースにでいきましょう!
条例や、ウェブサイトなど、個人情報に絡まない公開情報は、全部GitHub管理でいいかも?

links
- KEN_ALL!? 郵便番号ESモジュールで開発効率化! 経産省もGitHub公開スタート
- Deno にコントリビュートする (1) - Qiita
- Deno にコントリビュートする (2) - Qiita

反響で散見された KEN_ALL とは、郵便番号データのこと。 郵便番号を扱う、様々なサービスを開発する際に幾度となく使われて来たのだろう。また、この「郵便番号データ」は、頻繁に更新もされるため定期的な運用も、それぞれに発生する。

こういう非効率の解決に、オープンデータとオープンソースが有効!


郵便番号から住所 - 郵便番号
シンプルなサンプルと共に、郵便番号ESモジュールを公開!(src on GitHub)
郵便番号を入れると、即座に対応する住所候補を表示する。プログラマーにうれしい JSON形式。

また、全角や半角や〒マークつきか否かも正規化するので、「半角でご入力ください」などの表記は不要! 早速、経産省の「全角半角統一コンポーネント IMIMojiConverter」を活用させていただきました。

IMI Tool Project
経産省もGitHubにオープンソース公開スタート!

オープンデータとオープンソースで、昭和を令和へ!

ブラウザやDenoでサクッと動く、法人番号からの検索するESモジュールができました。 好評な経産省によるオープンソース「IMIコンポーネントツール」の7つ道具、一通りできました!

IMIコンポーネントツール」法人種別名の抽出コンポーネント追加(src on GitHub)
サンプルとしていれている番号はどんな法人でしょう?
[変換]ボタンを押してみまてください。

使い方は簡単です。下記コードを main.html として保存して、ブラウザで開くだけ!

<script type="module"> import IMIEnrichmentHojin from "https://code4sabae.github.io/imi-enrichment-hojin-es/IMIEnrichmentHojin.mjs"; const main = async () => { const json = await IMIEnrichmentHojin("4000012090001"); alert(JSON.stringify(json, null, 2)); }; main(); </script>

トップレベルawaitに対応している Deno や、Node.js の --experimental-top-level-await 付き実行なら、main関数の定義も不要です。


国税庁法人番号公表サイト」にて、同様の検索ができますが、APIを使うとより柔軟に、より高速に処理できます。


法人番号システム Web-API|国税庁法人番号公表サイト
国税庁公式のAPI提供もありますが、申請から利用可能になるまで1週間。郵送(!)されてくる利用コードを受け取る必要があります。
(フォームに「全角」「半角」の文字。IMIコンポーネント全角半角変換モジュールの出番!)


全件データのダウンロード(各都道府県別)|国税庁法人番号公表サイト
1週間待ちはつらいので、元のコンポーネントのソースを見てみると、こちらから全件ダウンロードするように記述があります。ひとつひとつ手でダウンロードするのは大変なので、プログラムで全部ダウンロードし、展開したヘッダなしCSVファイルを末尾6桁別ファイルに書いていきます。(download.mjs on GitHub)

JSONにしてしまうとファイルサイズが増加し、検索スピードも落ちるのでCSV状態のまま data フォルダに格納。1ファイル最大3.7MB、ちょっと大きいですが、GitHub pages では、gzip圧縮されるので、そこそこいいサイズになっているはず。全部で3,542ファイル、総容量1.2GBほどになっているので、clone するときは容量にご注意ください。

links
- 経産省がソースコードを公開したソフトを配布、進む市民との連携:日経ビジネス電子版
- 日本政府発のJavaScriptライブラリを勝手にweb標準化するプロジェクト、全角-半角統一コンポーネントのESモジュール/Deno対応版公開
- Deno対応ESモジュール対応、IMIコンポーネントツールx4とDenoバッジ
- IMI住所変換コンポーネントをESモジュール化、まずはざっくり正常系だけ動作するβ版を公開

第31回目の高専プロコン、現地開催と競技部門の中止と発表。 自由部門と課題部門は規模縮小し、オンライン開催。現地で会えないのは残念ですが、ここで本領を発揮するのが高専生!

第6回函館大会の競技部門出身として、全国のプログラミング好き高専生へ、オープンソースのプレゼント。 中止になった競技部門のルールを読んでみると、今年のテーマは、1ターン最短3秒で最大14ユニット動かす、1on1の陣取りゲーム。戦況を見つつ人手で補正することや、3チーム以上の混戦も楽しそうなので、実装してみました。


Kakomimasu - 競技システムコアモジュール for Deno/Node.js src on GitHub
500行程度のJavaScriptで書いたクラスライブラリ kakomimasu.mjsと、15行の乱数ライブラリ util.mjsのみのシンプル設計。 IMIツール同様のESモジュールなので、DenoやNode.js、ブラウザ上に組み込むことも簡単です。

ざっくり書いたテストコードは通ってますが、まだまだ検証は足りないので、協力してくれる高専生、大募集。 我こそはという人、チャレンジしてみたい人、GitHubSlack: Code for KOSENTwitterFacbeookで連絡ください。 フォーク、他言語での移植、プルリク、Issue、何でも歓迎、お気軽にどうぞ!


目玉の塗りつぶしアルゴリズム、こんな感じで実装してみました。(full src on GitHub

fillBase () { const w = this.board.w; const h = this.board.h; const field = this.field; for (let pid = 0; pid < this.board.nplayer; pid++) { const flg = new Array(w * h); for (let i = 1; i < w - 1; i++) { for (let j = 1; j < h - 1; j++) { if (flg[i + j * w] || this.field[i + j * w][0] === Field.WALL) { continue; } const fill = new Array(w * h); const chk = function (x, y) { if (x < 0 || x >= w || y < 0 || y >= h) { return false; } const n = x + y * w; if (fill[n]) { return true; } fill[n] = true; const f = field[n]; if (f[0] === Field.WALL) { if (f[1] === pid) { return true } } else { fill[n] = true; } if (!chk(x - 1, y )) { return false; } if (!chk(x + 1, y )) { return false; } if (!chk(x - 1, y - 1)) { return false; } if (!chk(x , y - 1)) { return false; } if (!chk(x + 1, y - 1)) { return false; } if (!chk(x - 1, y + 1)) { return false; } if (!chk(x , y + 1)) { return false; } if (!chk(x - 1, y + 1)) { return false; } return true; } if (chk(i, j)) { fill.forEach((f, idx) => { if (this.field[idx][0] === Field.BASE) { this.field[idx][1] = pid; flg[idx] = true; } }); } } } } }

効率よいアルゴリズムの追求もまたおもしろそう。


高専プロコン
楽しいは創れる!オンライン部門、やりましょう!

links
- 第31回高専プロコン 競技部門「雪降る大地 ミんなで クるっと 囲みマス」 9P〜
- taisukef/Kakomimasu: #procon31 競技部門 コアモジュール for Deno/Node.js

公共団体コードと丁目レベルのジオコーディングモジュールを使って、IMIコンポーネントツールの目玉、住所変換モジュールをESモジュール化しています。 内部構造をガラッと変えて、必要なデータのみを適宜ダウンロードするブラウザ上でも動作する軽量なESモジュールとして使えるようになりました!

IMIコンポーネントツール ESモジュール版」住所変換コンポーネントのβ版追加!
現在は、都道府県名からの住所表記に対応、緯度経度は丁目レベルまでなのはオリジナルと同様です。番地、号にも対応してほしいところですね。

使用は簡単!Denoで下記、実行するだけでOKです!

import IMIEnrichmentAddress from "https://code4sabae.github.io/imi-enrichment-address-es/IMIEnrichmentAddress.mjs"; console.log(await IMIEnrichmentAddress("福井県鯖江市新横江2-3-4"));

ネットアクセスするので --allow-net または -A 付きで、エラーがでた場合 geocode.mjs をアップデートするために -r も一度付けてください。

$ deno run -A -r main.mjs Download https://code4sabae.github.io/imi-enrichment-address-es/IMIEnrichmentAddress.mjs Download https://code4sabae.github.io/imi-enrichment-address-es/lib/find.mjs Download https://code4sabae.github.io/imi-enrichment-address-es/lib/bangou.mjs Download https://code4sabae.github.io/imi-enrichment-address-es/lib/util.mjs Download https://code4sabae.github.io/lgcode/lgcode.mjs Download https://code4sabae.github.io/geocode/geocode.mjs Download https://code4sabae.github.io/lgcode/lgcodemap.mjs [ { @context: "https://imi.go.jp/ns/core/context.jsonld", @type: "場所型", 住所: { @type: "住所型", 表記: "福井県鯖江市新横江2-3-4", 都道府県: "福井県", 都道府県コード: "http://data.e-stat.go.jp/lod/sac/C18000", 市区町村: "鯖江市", 市区町村コード: "http://data.e-stat.go.jp/lod/sac/C18207", 町名: "新横江", 丁目: "2", 番地: "3", 号: "4" }, 地理座標: { @type: "座標型", 緯度: "35.941043", 経度: "136.199640" } } ]

緯度経度、使えます!


住所変換コンポーネント (ES module ver.) on GitHub
データを扱う、公共団体コードや、ジオコードは別モジュールで管理しているので、住所の正規化に特化できたのでJavaScriptのプログラムとしては、下記4ファイルのみとシンプル!

IMIEnrichmentAddress.mjs メイン、文字列やJSON-LDを入力として、find.mjsを使って変換
lib/find.mjs - 住所表記を分解し、緯度経度を付加するコード、find.jsを大幅改定
lib/bangou.mjs - bangou.jsをESモジュール化、漢数字などの番地と号を正規化する
lib/util.mjs - util.js をESモジュール化、漢数字との変換などの便利関数群

施設や、店舗の住所からの変換など、web上の様々な住所表記に対応できるよう、使いながら育てていきたいと思います。 一緒に使ってみる方、バグや要望を送ってくれる方、精度アップのプログラムを書く方、大募集!
imi-enrichement-address src on GitHub by Code for Sabae

経産省のオープンソース「IMIコンポーネントツールESモジュール対応プロジェクト。 いよいよ住所変換コンポーネントに取り掛かるも、ファイルを使ったDB「LevelDB」のラッパー「levelup/leveldown」が使われていてるので、いままでのようなそのまま移植は無理でした。

そこで、ひとまず使用している「統計LOD」と「位置参照情報 ダウンロードサービス」を使った内部モジュールを開発。 ブラウザとDenoで使えるESモジュールができました。

code4sabae/lgcode: 地方公共団体コード ESモジュール

import { getLGCode } from "https://code4sabae.github.io/lgcode/lgcode.mjs"; console.log(getLGCode("東京都", "新宿区")); console.log(getLGCode("福井県", "鯖江市"));

こちらを main.mjs として保存して、deno run で、緯度経度が得られます。

% deno run main.mjs 13104 18207

この地方公共団体コードを住所ジオコーディングした際のデータ管理のIDとして使います。


code4sabae/geocode: 住所ジオコーディング

import { getLatLng } from "https://code4sabae.github.io/geocode/geocode.mjs"; console.log(await getLatLng("福井県", "鯖江市", "新横江2"));

上記、同様に main.mjs として保存して、deno run で、緯度経度が得られます。(geocodeのjsonデータをネットから取得するので、--allow-net オプションか -A 付きで実行してください)

% deno run --allow-net main.mjs 35.941043,136.199640

データの取得と加工方法は、それぞれと tools ディレクトリにまとめています。(参考、住所変換コンポーネント

どちらもシンプルで軽量なモジュールに仕上げました!ウェブでDenoで、ご活用ください。
GitHubを使ったオープンソース、issue、PR歓迎です。お気軽にどうぞ!

次は、こちらを使ったIMIコンポーネント移植にチャレンジです!


コーディング瞬発力を鍛える、Hana道場 x PCN仙台企画、IchigoJamプログラミング大喜利!


6月というお題に対する「かたつむり当てゲーム」!

小学6年生/中学1年生の参加したこどもたちの発想力と実装力に元気、もらいました!
Let's プログラミング!

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