日本政府発行文字環境導入実践ガイドブックにて強く推奨されているJIS X 0213。 文字集合を調べた結果、半角スペースが入っていませんでしたが、会員登録すると読める「JISX0213の仕様書を読むと、半角スペースや、各種制御コードも含まれると明記されていました(X0213_001.pdf)。


JIS X 0213 チェッカー
一通りテストコードを書いて、βを取ったJIS X 0213チェッカーとJavaScriptのライブラリ(JISX0213.js)ができました。ハンカクカナや、全角数字などはJIS X 0213規定外と赤く表示されます。 1byteのコードは唯一0xb5(μの別コード)を除いて有効なJIS X 0213です。「JIS X 0213非漢字一覧」にも記載されていますが、μはUnicodeのU+03bcを使用しましょう。

これで安心して間際らしい表記揺れが少ないキレイなデータづくりができますね!
JIS X 0213に対応する解析ツール(リンター)も用意したいところです。

作成時に発見した、Wikipediaの記載のまちがい、2つ。

JIS X 0213非漢字一覧
グレーブアクセント付きスクリプトA小文字など4つの文字は、U+251+300と2つのコードポイントが記載されていますが、実際のコードはU+1F71などを使います。(JIS X 0213の仕様書を確認)

マイクロ - Wikipedia
「ギリシャ文字ミュー「μ」に代えて、互換性のためにLatin-1領域に存在するU+00B5「µ: micro sign」があり、こちらを使用するのが良い」とありますが、「Μ - Wikipedia」にも記載されているように、U+00B5はJIS X 0213に割り当てられていないので、U+03BCを使用しましょう。 普通に「ミュー」で変換してでてくるもので問題ありません。

国家のデジタル化の基礎データ「ベースレジストリ」のひとつ、文字。基本ですね!

各府省は、文字情報基盤の活用を推進し、文字情報に関する相互運用性を確保する。また、情報システムを整備する際には、一般的業務に係る情報システムにおいて使用する文字の範囲はJIS X 0213を原則とし、UCS(Universal multiple-octet coded Character Set)に従った表現(符号化及び記述法)で情報システムの整備を行う。
デジタルガバメント実行計画
約6万の漢字を国際化した文字情報基盤ですが、まだ環境によって表示できない文字があるので、約1万文字の漢字を含む、JIS X 0213を原則とする。仕方ないですね。

JIS X 0213の定義が政府CIOポータルで見つからないので、68B09さんがMITライセンスで公開している文字情報定義ファイルを使って、JIS文字チェッカーを作りました。


JIS X 0213 チェッカーβ
このチェッカーによると半角スペースはJIS X 0213では無い!?
JIS X 0213は、2012年に改訂され、JIS X 0213:2012があります。半角スペースを含んだ形になったかどうかが気になるところです。
文字という超基本仕様、オープンデータにしてもらいたいですね。
解決、JIS X 0213 でした!


用語.md
文字に関する用語をマークダウンでまとめました。ベースレジストリの文書からリンクして少しずつ読みやすくしています。

links
- 文字コード入門 - とほほのWWW入門 - とほほのWWW入門
- 文字情報基盤整備事業 | 一般社団法人 文字情報技術促進協議会

文字情報基盤に縮退マップのデータを変換して追加し、より探しやすくなりました。

漢字検索、異体字検索 - 福」たくさんの福!

縮退とは6万の漢字を表現できない環境向けに代替漢字へと変換すること。ユニコード前提な現代ではあいまい検索など、正規化に使うと良さそうです。

文字情報基盤 MJ縮退デモ
難解な漢字をいれると適度にやさしい漢字になります。


縮退マップの利用ガイドにおもしろいことが書いてあります。読みも意味も不明な漢字が400字もあるそうです。


漢字検索、異体字検索 - 秀丸
福井高専の先輩、斉藤秀夫さん開発の有名ソフトウェア「秀丸エディタ」はなんと漢字にもなっていた!?

ここで問題です、JavaScript でこの難解文字 "𤔜㙒𡙌𡗟".length を表示するとどうなるでしょう?

正解は、7!

見た目は4文字なのに不思議ですね。
ユニコードの仕様で異体字セレクタ(IVS)は2つのコードポイントで表現させるので、1つの文字を表現するために2つのJavaScript文字を使っています。

この仕様のせいでJavaScriptの文字列はややこしいことになっているので改善しましょう。 普通の文字列関数、charAtやcodePointAtでは中途半端なコードにしかならなかったり、indexOfの数がずれてしまったりするので、新たに Str.js を作りました。

import { Str } from "https://code4fukui.github.io/mojikiban/Str.js"; console.log(new Str("𤔜㙒𡙌𡗟").length); // 4

見た目と一致する文字は、書記素(グラフィーム)と言います。以前結合絵文字を扱うときに使った GraphemeSplitter を内部に使っています。

Code for Fukui によるオープンソースプロジェクト。社会OS開発、ぜひご一緒に!
code4fukui/mojikiban src on GitHub

先日発表された「ベースレジストリの指定について」で、即効性ありと区分されているデータに「文字情報基盤」がありました。 「漢字」は、日本での文字コミュニケーションの基本です。デジタルで表現できない文字があるとつらいですね。

いろいろな方の尽力により、日本で使われている漢字ほぼすべて、58,862コの漢字がユニコードで表せるようになっています!スゴイ!


漢字検索、異体字検索src on GitHub
こちらで「よみ」と「漢字」から検索できるようにしました。WebFontもありますが、30MBもあるので、58,862コGitHub Pagesに生成した画像データ(mj)を用意して使っています。

Code for Fukui によるオープンソースプロジェクト。低レイヤーから作る社会OS。ぜひご一緒に!
code4fukui/mojikiban src on GitHub

全国19万あったまち(=町字)ですが、本当のところいくつあるか不明な様子。
ベース・レジストリとしての住所・所在地マスターデータ整備について

地方自治法に「町若しくは字」、住居表示に関する法律に「町又は字」と表現されているが、地方自治法にも住居表示に関する法律にもこれら町字の定義は存在しない。

日本DXはじめのいっぽ、住所をまずはちゃんと定義したいですね。全国ざくっと用意して、各自治体でオーサライズがされればできあがりです。マスターデータ案に記載されている英語表記が気になりました。外国の方向けにひとまずアルファベットでの表記は欲しいですね。 あとは、まちの「よみ」のデータを見つければ、ひとまず自動変換できそうです。


固有名詞のかなローマ字変換
行政基本情報データ連携モデル 住所」に英語表記に関する記載があったので、それに代替準拠する「かなローマ字ライブラリ、Romaji.js」を作りました。 以前作成した Moji.mjs も使って、カタカナや半角にも対応したサンプルアプリも合わせて提供しています。


ヘボン式のローマ字は「観光立国実現に向けた多言語対応の改善・強化のためのガイドライン」にある表をCSV化した「ヘボン式ローマ字.csv」を作成して、使っています(make_json.js)。

低レイヤーからの地味な積み上げが大事な都市OSづくり!

表形式のデータの保存にはCSVが便利です。誰でもプレビュー、テキストエディタ、表計算ソフト、Google Docsなど、様々なツールで開くことができます。

ただ、文字化けやヘッダーの無いデータ、無駄な空行があるデータなど、おかしなデータが多いため、好きになれないプログラマーも多いことでしょう。


そこで作りました、厳格なCSV、StrictCSV!

日本の19万のまち、TownIDのCSV all.csv をStrictCSV all.s.csv に変換すると45%ファイルサイズが削減できました。(9.3MB→5.0MB、gzip後で 1.6MB→1.3MB 14%削減)

- StrictCSV 書式
拡張子は .s.csv
文字コードはBOM付きUTF-8
改行コードはLF
ヘッダー行は必須
レコード0件を許容する
ダブルクォート、コンマ、改行を含める場合はダブルクォートで囲む(ダブルクォートは2つにする)
存在しないフィールドは前行以前に存在したフィールドが省略されたものとする

ついでに、データ項目が少ないときは前行以前に登場したコードが省略されたことにするルールをいれたことで、同じ都道府県名や市区町村名がずらっと続くデータをシンプルにできます。


StrictCSV on GitHub / Code for Fukui
まだ実装はESモジュール対応のJavaScriptのみ。お好きな言語でご実装、ご貢献ください!

import { StrictCSV } from "https://code4fukui.github.io/StrictCSV/js/StrictCSV.js"; const data = await StrictCSV.load("test.s.csv") || [{ name: "a", val: 1 }, { name: "b", val: 1 }]; const s = StrictCSV.stringify(data); console.log(s); const data2 = StrictCSV.parse(s); console.log(data2);

Denoやブラウザで動きます。

* 改行コードは現在MacOS/LinuxがLF、WindowsがCRLFです。古いMacOS9がCRだったことから、Windowsが間をとってCRLFにしたようですが、WindowsもLinux化が進む今、人類としての改行コードはLFでいいでしょう。
由来がはっきりしないWindowsの“謎”仕様──Windowsの雑学(諸説あります)

ベースレジストリが熱い様子。日本全体のデジタルを活用した変革、盛り上がってきてます。 せっかくなら、誰にも頼らないID体系がいいですね。 よくあるIDは連番を振りますが、誰かが管理しないといけません。

地球上に位置情報を持つモノに割り当てるIDとして、緯度と経度と精度をひとまとめにするジオコーディング、Geo3x3が使えそう。 「福井県鯖江市新横江一丁目」など、ひとまず日本のまち全部に「TownID」というIDを定義して計算しました。


TownID Japan (日本まちID) by Code for Fukui」

TownIDを取得する方法は都道府県、市区町村、まち名の3つを指定します。

import { TownID } from "https://code4fukui.github.io/TownID/TownID.js"; const townid = await TownID.find("福井県", "鯖江市", "新横江一丁目"); console.log(townid); // E9138732346

都道府県一覧、市区町村一覧、まち一覧の取得APIもあります。
日本に都道府県は47、この区分における市区町村は1,893、まち全部は190,016ありました。
諸説あるかもしれません。

緯度経度からGeo3x3で生成して、ユニークで最短のコードにするコードができたので、いろいろと応用する準備ができました。 ベースレジストリ、何か貢献できること探しましょう。
ベース・レジストリの指定について | 政府CIOポータル

プログラミングにおける日付の扱いは地味ですが大事です。JavaScriptには日付を表すDateクラスがありますが、古いJavaの仕様を引きずっていたり、月が0から始まっていたり、文字列からのパースが多言語化の関係でよくわかんないことになっていて微妙です。

毎回リファレンスを見ながらコードを書くのも面倒なので、スッキリシンプルな日付ライブラリ day-es を作りました。

import { Day } from "https://code4fukui.github.io/day-es/Day.js"; const day = new Day(2021, 6, 5); // 2021/6/5 console.log(day); // Day { year: 2021, month: 6, day: 5 } console.log(day.dayAfter(2)); // Day { year: 2021, month: 6, day: 7 }

ESモジュール対応JavaScriptなので、ブラウザ上や、Denoを使ったサーバーサイドでサクッと使えます。 Dayクラスのインスタンスは西暦1年から9999年までの有効な日付でのみ生成でき、Object.freeze を使ってイミュータブル(不変)にしているので、安全です。 2日後の日付や、月末月初、日付の差などを関数で取得できます。 信頼性は、テストコードでご判断ください。


応用例「カウントダウン
日付の差計算を使ったカウントダウン拡張タグを作りました。下記のHTMLで任意の日付までのカウントダウンができます。

<script type="module" src="./day-countdown.js"></script> 第5回 越前がにロボコンまで、あと<day-countdown target="2021-11-07"></day-countdown>日!


応用例「カレンダー
その日の曜日と、その月の最終日が分かれば作れるカレンダー。国民の祝日にも対応したくなったので・・・


内閣府の「国民の祝日」についてにあるCSVデータをブラウザから取得しようとすると、CORS設定がされていないため弾かれてしまいます。 元データではなく、別にデータを置く必要があり効率が悪いです。GitHubで"holiday japan"で検索すると120もヒットします。 無意味な定期的な運用が増えないようにしたいところです。

ブラウザから直接取得できるようにするには、webサーバーの該当ファイルのレスポンスヘッダーに下記を追加すればOKです。

Access-Control-Allow-Origin: *

アクセスを促したいオープンデータにはぜひ付けましょう。(GitHub Pagesは全部付きます)


応用例「国民の祝日リスト
現在2022年末までの祝日が公開されていました。祝日判定コードも下記のように簡単です。

import { isHoliday } from "https://code4fukui.github.io/dey-es/Holiday.js"; console.log(isHoliday(new Day("2021-07-22"))); // true

国民の祝日オープンデータは、よく使い、関連が深い日付ライブラリ「day-es」とセットにしたリポジトリとして、オープンな開発活動シビックテックの福井版、Code for Fukui 管理とすることで、更新忘れを防ぐ作戦です。 活用いただける方、育てたい方、プログラミングが好きな方、一緒に創りましょう!

クリス&福野による、北陸サイバーバレー宣言が福井新聞の論説に掲載。
北陸サイバーバレー宣言 鯖江を「新経済圏」拠点に | 社会,経済 | 論説 | 福井新聞ONLINE
熱い北陸、始まりました。

福井県庁DXチーム、鯖江市役所DXチームとミーティング at SCC(鯖江商工会議所)
民間と行政、オープンデータ、オープンソース、GitHubなど、気軽なテクノロジーを使ったスピーディーな展開をディスカッション。

経産省がGitHubにて公開提案待ちの契約書オープンデータへ、先日プルリクした Markdown.js による表示方法が、晴れてマージ(受け入れ)されました!日本にちょっと貢献!

シンプルなMarkdownで記述して、表示はCSSで整えましょう。URLを指定して、ボタンを押せばいいだけの画面を追加しました。


CSSの変更実験。まずは文字色を変えるコードはこう書きます。

body { color: red; }

意外と簡単で楽しいですよ! → CSSはじめのいっぽ


モデル契約書ver1.0 秘密保持契約書(新素材)
CSSで縦書き、意外といい感じ!もっと見やすくするにはアラビア数字を漢数字に変換などが必要そう。

body { background-color: #f3f3f3; font-family: serif; writing-mode: vertical-rl; }

背景色を16進法のRGBで指定、フォントを明朝体、モードを縦書きに!
Markdown.js 編集画面

コードフォー活動は、プログラミングできる人だけではありません。文章が書ける人、デザインができる人も大歓迎です。 特許庁の契約書から、ノベルゲームまで、幅広く活躍する構造化テキストファイル、Markdown(マークダウン)。 使う人にどこまでも優しくなれるのがテクノロジーです。

CyberValley、福井でコードフォー活動したい方、Code for Fukui でお待ちしています。
まずはちょっと覗いてみたい方は、サイバーフライデーへどうぞ!(次回、6/25金)

links
- 「研究開発型スタートアップと事業会社のオープンイノベーション促進のためのモデル契約書ver1.0」の改訂に向けた、GitHub(ギットハブ)を用いた意見募集
- Code for Japan
- Code for Fukui

最終金曜日はサイバーフライデー。今日もいろんな「新しい」が生まれました。参加してくれた福井高専現役学生も、来月に向けて意欲も満点!いろいろ創ろう!

CiberFriday、お片付け後の記念撮影。


サイバーフライデーは、見せたいものをもってきて並べるだけ!気軽に出展、OKです!


パワーアップした、スマホ版、投げオセロ、楽しかった!コマがメガネになるモード、ステキ!


新基板、発表!頒布もOKです!


1台、ゲット!


まったさんもゲット!


Code for KOSEN による、プログラムで戦うオンラインボードゲーム「囲みます


音響設備チェック。音を使ったDJ、VJ発表もOK!


Kinectを使って全身使うオリジナルタワーバトルの展示、盛り上がってました!


今日も人気なセグウェイドリフト、2人3脚、2人2脚もいけました。3人2脚は若干重量オーバー、軽ければ行けそう。


メガネをリメイク「フィールシーズ」さん、その場でレーザー刻印してもらった「一日一創」コースター


余った電子部品や、いらなくなったもの交換会もやってます!


VRを使ったアプリづくりも熱い!


意外な出会い、思わぬつながりも!


ステキ軽食 by EIGHT SENSE のホットドッグ!


マフィン、スコーン風マフィン


前回人気のラスク!

何かつくりたくなった方におすすめ、コンピューターを使ったものづくり、コードフォー。


ワクチン接種率ランキング
NDJSONからCSV化&アプリ化Twitterで人気。 せっかくなので、高校情報のサンプルになりそうな簡単な計算と、ブラウザでの表示を作ってみました。

<meta charset="utf-8"><script type="module"> import { style, h1, table, div, hr, link } from "https://js.sabae.cc/stdom.js"; import { CSV } from "https://js.sabae.cc/CSV.js"; onload = async () => { // データ読み込み const url = "https://code4fukui.github.io/covid19vaccine/latest_summary.csv"; const data = CSV.parse(await (await fetch(url)).text()); console.log(data); const urlp = "https://code4fukui.github.io/population_jp/population_jp.csv"; const pop = CSV.parse(await (await fetch(urlp)).text()); console.log(pop); // ランキング計算 const tbl = []; for (let i = 0; i < 47; i++) { const p = pop[i].population_jp; const d = data[i]; tbl.push({ 順位: "", 都道府県: d.pref, 接種完了率: (d.sum / p * 100).toFixed(2) + "%", "初回接種率": (d.mid / p * 100).toFixed(2) + "%", }); } tbl.sort((a, b) => parseFloat(b.接種完了率) - parseFloat(a.接種完了率)); for (let i = 0; i < tbl.length; i++) { tbl[i].順位 = (i + 1) + "位"; } console.log(tbl); // スタイル style({ body: { "text-align": "center" }}); // ページ全体センタリング // DOM h1("ワクチン接種率ランキング"); div("データ更新日:" + data[0].date); table(tbl); hr(); link("データ: 新型コロナワクチンの接種状況(高齢者等) | 政府CIOポータル ", "https://cio.go.jp/c19vaccine_dashboard"); link("データ: 統計局ホームページ/人口推計/人口推計(2019年(令和元年)10月1日現在)", "https://www.stat.go.jp/data/jinsui/2019np/index.html"); link("アプリ: CC BY Code for Fukui", "https://fukuno.jig.jp/3229"); }; </script>

本当は1タグでいきたいところですが、Safariでは文字コードの指定がないとSJISとして解釈されて文字化けしてしまうので、2タグ構成です。 データを読み込み、計算して、スタイルを設定して、ドキュメント構造(DOM)を作ってできあがり! (計算までのJavaScriptのコードはそのまま、Denoを使ってコンソールでも動かせます)

Code for Fukui では、福井や国にまつわるシビックテックをやってます!

月一、最終金曜日イベント「サイバーフライデー
次回h,2021.6.25(金)18:30-22:00 鯖江商工会議所B1F
新しもの好きな方、ぜひどうぞ。


鯖江市本町、西鯖江駅の近くの鯖江商工会議所 SCC、目印はこの最近できた大型看板です。商工会議所の無料駐車場をどうぞ(いっぱいのときは、西山公園の2時間無料駐車場もあり)

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