表をOCRで処理する

この業界、頭が異様に悪くて何故か表をAutoCADで描いたりします

構造をもった電子データであるという認識を捨てて単なる画像として処理することを考えて手段を探すと色々と術が見つかってきました。紙で渡されるのとほとんど同じ処理をするハメになるわけですね。ひたすらOCROCROCR,,,,,

で、AutoCADで描かれた表を手打ちしたら死ぬのでOCRです。

続きを読む

クソPDF戦記

解析結果が書かれたPDFををplaintextに変換しようとして一週間もかかってしまってほんまクソ、ということでメモを残しておく。

そもそも何でPDFなのか?


ミッション:plaintextがedocument library pdf filterとかいうウンコライブラリでPDF化された5000ページぐらいあるPDFから、100ページぐらいの表組みをplaintextに戻し、手元での解析結果とWinMergeで比較。

試した順に書いていきます。

続きを読む

YAPC::Asia Tokyo 2015行ってきた

YAPC初参加ですよプロデューサーさん!!!!!!!チケット買った時は札幌配属だったけど本社に転属したので前夜祭から参加できて*大勝利*。

チケット買って有給取りに行こうと事務所行ったら社長の現場訪問と被ってることが発覚*1してギャピーってこともありましたが、本社に転属してそれもなくなってサビ残騒動起きて本社に転属したお陰です。


まぁそれはそれとして「blog書くまでがYAPCですよ」ということでつらつらと聞いてきたトークについて。

ほんとは自分でメモ取りたかったんですが、ノートマシンの充電器ケーブルが腐って*2充電できなくなってしまったのでスマホガラケーで戦う羽目になってしまって悲しみ。様々な方面で知的刺激を受ける三日間でした。

*1:社長来るのに有給とか狂ってるって言われたんですね。うんk

*2:9年目突入したレッツノートなので本体ぶっ壊れててもおかしくないんですが、充電器新調したら復活してなにより。マダマダイクヨー!!!!!!!!!

続きを読む

Control.Invoke() と Control.BeginInvoke() での例外処理

はじめに

C#のWinForms*1はUIスレッドを一つしか持てず*2、そのUIスレッドに対して他のスレッドからちょっかいをかけようとするとSystem.InvalidOperationException例外が飛びます。

private void button1_Click(object sender, EventArgs e)
{
    textBox1.Text = "[開始]";

    Task.Factory.StartNew(() => {
        Thread.Sleep(5000);

        textBox1.Text += "[5秒経ったよ!]"; // ここで例外が発生する
    });

}

そこで、Control.InvokeないしControl.BeginInvokeを使ってUIスレッドに該当の処理をさせなさい、というのは有名な話。

今回はControl.Invokeを使ってハマった話。

*1:WPF使ったことなし。

*2:普通にWindows APIでウィンドウを作ると、メッセージポンプを回すスレッドはワーカーでも回せます。例えばMFCのCWinThreadクラスはUIスレッドを作ることが出来ます。

続きを読む

後期高齢者医療広域連合WebサイトURI一覧を眺めてみる

最近話題になることが少ない後期高齢者医療制度ですが、これの事務は各都道府県ごとに全市町村が所属する広域連合を結成して処理することになっています*1。つまり48の広域連合が設置されたことになります。

最近はどんな組織もWebサイトを持つ例が多く、この後期高齢者医療制度を処理する広域連合は全てWebサイトを持っています。厚労省Webサイトの制度ページに各都道府県の後期高齢者医療広域連合Webサイト一覧があったのでドメインが分かるように列挙してみた。

都道府県 URL
北海道 http://iryokouiki-hokkaido.jp/
青森県 http://www.aomori-kouikirengou.jp/
岩手県 http://www.iwate-iryokouiki.jp/
宮城県 http://www.miyagi-kouiki.jp/
秋田県 http://www.akita-kouiki.jp/
山形県 http://yamagata-kouiki.jp/
福島県 http://fukushima-kouikirengou.lineup.jp/
茨城県 http://www.kouiki-ibaraki.jp/
栃木県 http://www.kouikirengo-tochigi.jp/
埼玉県 https://www.saitama-koukikourei.org/
千葉県 http://www.kouiki-chiba.jp/
群馬県 http://www.gunma-kouiki.jp/
東京都 http://www.tokyo-ikiiki.net/
神奈川県 http://www.union.kanagawa.lg.jp/
山梨県 http://www.yamanashi-iryoukouiki.jp/
福井県 http://www.fukui-kouiki.or.jp/
新潟県 http://www.niigata-kouiki.jp/
長野県 http://www.koukikourei-nagano.jp/
富山県 http://www.toyama-iryou.jp/
石川県 http://www.ishikawa-kouiki.jp/
岐阜県 http://www.gikouiki.jp/
静岡県 http://www.shizuoka-ki.jp/
愛知県 http://www.aichi-kouiki.jp/
三重県 http://mie-kouiki.jp/
滋賀県 http://www.shigakouiki.jp/
京都府 http://www.kouiki-kyoto.jp/
大阪府 http://www.kouikirengo-osaka.jp/
兵庫県 http://www.kouiki-hyogo.jp/
奈良県 http://www.nara-kouiki.jp/
和歌山県 http://kouiki-wakayama.jp/
鳥取県 http://www.koureikouiki-tottori.jp/
島根県 http://www.shimane-kouiki.jp/
岡山県 http://www.kouiki-okayama.jp/
広島県 http://www.kouiki-hiroshima.jp/
山口県 http://yamaguchi-kouiki.jp/
徳島県 http://www.koukikourei-tokushima.jp/
香川県 http://wwwa.pikara.ne.jp/kouiki37-1/
高知県 http://www.kochi-kouiki.or.jp/
愛媛県 http://www.ehime-kouiki.jp/
福岡県 http://www.fukuoka-kouki.jp/
佐賀県 http://saga-kouiki.jp/
長崎県 http://www.nagasaki-kouiki.jp/
熊本県 http://www.kumamoto-kouikirengo.jp/
大分県 http://www.oita-kouiki.jp/
宮崎県 http://www.miyazaki-kourei-kouiki.jp/
鹿児島県 http://www.kagoshima-kouiki.jp/
沖縄県 http://www.kouiki-okinawa.jp/

圧倒的な汎用JPドメイン率に震える。


埼玉と東京がgTLDで、福島はASP会社のサブドメ、香川は地元ISPのホームページサービス上に存在してます。広域連合は特別地方公共団体*2なので、LG.JPドメインの登録資格があって、実際神奈川県だけはLGドメイン取ってます*3


何かの弾みで後期高齢者医療制度が改廃されて都道府県単位の広域連合が消滅したら、汎用jpやらgTLDのドメインは適当にexpireして業者に買われるんだろーなぁと。


かつて存在した国会事故調こと東京電力福島原子力発電所事故調査委員会のWebサイト、途中から http://www.naiic.go.jp/ になったけど当初は http://www.naiic.jp/ という汎用ドメインで、このドメインは2014/03/01に無関係の他人が登録してて国会事故調とは別のWebサイトになってます。ちなみに国会事故調のWebサイト、当初はwww.ican.go.jpだったようで、Wikipedia履歴見てたら2012/7/6に書き換えられてた


公的機関はlgドメインとかgoドメインをちゃんと使ってほしいと思うんですが。。。


あと、埼玉県だけsslなんだけど証明書が他ドメインといっしょくた*4でなんかアレ。

*1:高齢者の医療の確保に関する法律 第四十八条

*2:地方自治法第三編 特別地方公共団体で広域連合に関する条文がある。

*3:kanagawa.lg.jpのサブドメっぽく見えますが、union.kanagawa.lg.jpでwhois叩くと神奈川県後期高齢者医療広域連合で登録してると出てきます。

*4:証明書はDNS名 www.asahi-com.net www.dhm7882.co.jp www.gojo-saitama.jp www.larrange.jp www.mamuro-yoho.com www.omy-net.co.jp www.saitama-jinjacho.or.jp www.saitama-koukikourei.org が並んでた

ADS-Bアンテナをベランダに設置してRaspberry Piからflightradar24/FlightAwareへfeedしよう

新年度です。


さて、MH370ですがインマルサットの解析インド洋に向かったという情報が出てきました。ハイジャックからコックピットで火災説まで様々な予測が出ていますが、FDR/CVRを見つけるまでは断言が出来ません。AF447はフランスがメンツを賭けて根性で探して2年後にブラックボックスを発見しましたが、MH370はどうなることやら。英語版Wikipediaブラックボックスが見つかっていない航空事故の一覧がありますね。

それはそれとして、アンテナを作ったりUSBケーブルを外まで引っ張るのに苦労したり、flightradar24にfeedしたりしたので、それをまとめます。

アンテナを作る

aitendoで売ってるTV28Tv2DVB-T(R820T)にはエレメント長118mm(実測)のモノポールアンテナがついてます。1/4波長モノポールと考えたら600MHz帯用ですか。ADS-Bの電波は1090MHz固定なので、折角なら専用のアンテナを作りたいところ。

ADS-B アンテナ 自作 [検索]

探すと、同軸ケーブル使ったコリニアアンテナを作るのが一般的な様子。しかし同軸ケーブル手元にないので買うと高いので却下。更に探すと、チューナ附属のモノポールアンテナ台座を流用した針金でコリニアアンテナを作った記事を発見。

RTLチューナ付属アンテナをADS-B(1090MHz)用コリニアアンテナに改造してみました: K's Memo-Random

これで行きましょう。データはSBS-1 & SBS-3 Mode-S / ADSB Virtual Radar : User Forum xx • View topic - How tu build antenna for sbs-1?にあるとおり。川端のデイツー行って2mmの針金を買ってきました。

上から193mm→直径20mmループ→206mm→直径20mmループ→187mm。針金をこんな感じにペンチ使ってエイヤと曲げてやります。
f:id:W53SA:20140406005650j:plain
縦長写真になっちゃうので横に倒しました。ちなみに隣は附属のアンテナ。

針金を適当にジグザグにして1mmぶんの太さを稼いだ後に高ナットへ叩き込み、元あったアンテナ台座にネジ止め。

これだけアンテナ長くなれば見えるエリア広くなるかなーと思うわけですよ。同じ場所のアンテナで附属のモノポールと自作のコリニアで24時間ほど観測してadsbScopeのMaxRangeを重ねてみました。
f:id:W53SA:20140406010219p:plain
若干広くなったけど、劇的な変化はなし。まぁ数百円の出費ですから、こんなもんでしょう。そもそもベランダに置いてる時点で見えるエリアが偏るのはしゃーないし。

ちなみに、飛行機は様々な高さをもって飛んでるので二次元マップにプロットしたエリアでも見えない飛行機はありますわね。

ベランダに設置

窓際のRaspberry Piとアンテナ(及びチューナ)を1mぐらいのUSB延長ケーブルで繋いでたんですが、これだと窓が閉まらなくて寒い。窓を閉めるためにはエアコンの配管穴を経由して繋がないとだめ。

そこで、寺町マルツまで行って5mのツイストペア4芯ケーブルを買ってきてUSBコネクタ付けてチューナを差してみたわけだ。USBの規格上5mまで行けるんだからこれでよかろう。

しかし

デバイスは見えるけど受信できない。

どうやらケーブル品質にシビアらしい。これEthernetよりめんどいぞ。というか伝送路は単なる2芯ツイストペアで残り2本は単なる送電線なんだから四芯ツイストペア買う必要なかったやんけ…。

仕方ないので、また寺町マルツまで行って5mのUSBリピータケーブル買ってきました。

サンワサプライ USB2.0リピーターケーブル  5m  KB-USB-R205

サンワサプライ USB2.0リピーターケーブル 5m KB-USB-R205

使ってみると、当然ながら(?)一発で受信成功。なんでや、ということでバラしてみた。
f:id:W53SA:20140406011516j:plain
中心に位置するチップは4ポートUSBハブLSIμPD720114

ケーブルが残念だったのもあるかもしれないけど、デバイスから5mも引っ張ったのが敗因な雰囲気。これはUSBハブを5mケーブル先に繋ぎチューナをハブに突き刺せば良かったんちゃうのということですが、これだけのためにUSBハブ買うのもバカっぽいのでこれ以上深入りはせず。

なんで最初からリピーターケーブル買わんかったんや、って話ですけどエアコンの配管穴をUSBコネクタが通るか怪しかったんですね。ですが、結局USBコネクタ付きケーブルを通す羽目に。針金で試行錯誤したら通ってしまい実験してから買えばよかった、という結論に。切ない。

Flightradar24へfeedする

ここまで出来たら自分で近所の飛行機の状況を見れるわけですが、せっかくなのでfr24へfeedしてみましょう。

feedするソフトウェアはLinux版(Raspberry Pi用のARM LE向けbinary blobもある)があるんですが、feedするために必要な共有キーはWindows版クライアントでしか取得できません。

Software - Flightradar24.com - Live flight tracker!

Windows版クライアントを起動して、連絡用メールアドレスと、受信地の緯度経度を入力し、dump1090が走ってるRaspberry Piのhost:portを入れてSign up。上手くdump1090の吐く情報がfr24の情報と一致すれば認証が成功して自動的に共有キーが取得されます。なお、この共有キーはメールアドレスに送信されます。

認証キーを取れればWindows版クライアントを閉じてしまっていいんですが、その前に「flightradar24 PREMIUM」とか書かれたバナーをクリックしてfr24のアカウントを作ることが出来ます*1。データをfeedする限り*2、プレミアムを無料で使わせてくれるって。

ちなみに、このアカウント情報でfeedしている概要が表示できます。
f:id:W53SA:20140406013522j:plain
レーダーは受信地座標の最寄り空港名がつきます。

あとはさっき取得した共有キーを引数につけてLinux版のクライアント*3をRaspberry Piで起動すれば、適当にADS-B受信情報がfr24へfeedされます。

FlightAwareへfeedする

[この項4 Sep 2014追記。また、タイトルを変更しました。]


fr24以外にもADS-Bを記録しているWebサイトはいくつかあって、その一つにFlightAwareがあります。ここが8/14にRaspberry Pi用のFeeder(PiAware)をリリースしたのでこちにもfeedしてみました*4

dump1090が走っていれば、やり方は単純で配布ページからdeb拾ってきて入れるだけ*5。PiAwareはdaemonとして裏で動き、マシンで既に動いてるdump1090のbeast modeから情報を取ってきてfeedします。

で、なんかEnterpriseアカウント(89.95USD/月)に無償でしてくれるって書いてあるんだけど今ひとつ何が嬉しいアカウントなのかわからん。

f:id:W53SA:20140904131905p:plain

Nearest Airportが徳島空港になってる。おそらく、南側しか開けてなくて見えてるエリアの中心に一番近いのが徳島って判断をしたのでしょう。

*1:アカウントは共有キー取る際に使ったメールアドレスで作ってね、という注意事項がアカウント作成時に出るので、その点注意。

*2:データの最終feedから7日、なので適当に再起動したりしてfeedが一時的に止まっても即座にアカウント停止はなさげ。

*3:ちなみに、static linkとdynamic linkがあります。容量ケチる理由がないんでstatic linkedをわたしは使いました。

*4:forum見ると最初はあんまり安定してなくて試行錯誤してたようですが、今のPiAware 1.9は特段何も苦労せずに動きました。

*5:もちろんFlightAwareのアカウント情報がないとfeedできないんでアカウント作っておく必要はありますが

ADS-B受信にチャレンジ

MH370(9M-MRO)は一体何処へ行ってしまったのでしょうか。一週間たっても何の残骸も見つからないって意味がわからないです。

最近の飛行機は飛行機の位置座標などを随時放送*1する機械が積まれていています。これをみんなで受信してマップにプロットしたのが、flightradar24(通称fr24)です。MH370失踪が最初にネット上で話題になったのもfr24ですし、成田空港が強風で一時クローズすると千葉沖などでぐるぐるする飛行機がいますがそれをfr24で見て実況する人がいたり、知り合いの乗った飛行機が飛んで行くのを見守ったり、使い方は色々あります。


せっかくだから自分でも受信してみたいよね。


ぐぐると、1000円弱で変えるデバイスを使ったソフトウェアラジオで受信ができるらしい。

というわけで、買ってみたのはaitendoの特売品*2。R820Tはこの手のデバイスで割と優秀なようですが、熱くなって中の水晶振動子がドリフト起こして受信周波数がずれたりするらしい*3

届いたので取り敢えずノートマシンに繋いで様子を見ることに。

ドライバのインストール

ドングルをマシンに突き刺すとドライバインストールダイアログが出ますが閉じて、R820TをWinUSBで叩くためにZadigを使います。Zadigを起動してOption→List all Devicesをチェックするとデバイスが見えます。

f:id:W53SA:20140316180957p:plain

モノによっては見えるデバイス名が違うこともあるようです。二つ見えるので2つともにWinUSBをインストール。

受信する

デバイスが見えるようになったので、まずはソフトウェアラジオ+デコーダADSB#を入れる。入れると言ってもzipを拾ってきて適当に展開して起動するだけ。これで、Frames/secsが0でなければ何か受信してます。telnetlocalhost:47806に繋ぐとデコードされたデータが流れてきているはず。

表示する

デコードされたデータ見ても受信できてることしかわからんので、地図上にプロットします。プロットツールはadsbSCOPEVirtual Radar Serverが有名なようです。

adsbSCOPEを使った画像はこんな感じになりました。
f:id:W53SA:20140316181931p:plain

adsbSCOPEは自前で地図を表示しますが、Virtual Radar Serverを使うとGoogleMapに表示するWebサーバとして動くのでブラウザを使って最新の地図上にプロットされた情報を見ることが出来ます。

どちらもADSB#に繋いでデータをもらってくる設定をしなきゃいけないんですが、ちょっと手間取りました。参考文献あたりを参考にしてください。

次回予告

取り敢えずWindowsマシンに繋いで動くことはわかったので、次はこんなところを予定してます。

  • Raspberry PiでADS-Bソフトウェアラジオ/デコーダを動かす
  • アンテナを作る
  • ベランダに設置する算段を考える
  • R820熱くなりすぎるので放熱を考える

追記

Raspberry Piでさっくり動いてしまいました。

端的に言えば、http://git.osmocom.org/rtl-sdrからソフトウェアラジオライブラリをcloneしてbuildし、https://github.com/MalcolmRobb/dump1090からADS-Bデコーダをcloneしてbuildするだけ。デバイスは突き刺すだけで特段ko入れることなく認識されます。詳細は参考URIを見てください。

dump1090のinteractive表示と、dump1090が内部で持ってるWebサーバ経由でGoogle Mapに描いてる様子。もちろん、adsbSCOPEにdump1090を繋いで表示もできます。dump1090のデフォルト待ち受けポートが30002*4ってことぐらい気をつければいいでしょう。
f:id:W53SA:20140316223301j:plain

いやー、これソフトウェア的にはほぼ出来ていて、アンテナとか熱対策とかハード回りが本番ですね。南向きアパートのベランダなので北側が全く見えなくて辛いところ。桂キャンパスとか受信環境良さそう…。

*1:これをADS-Bと呼びます。

*2:記事執筆時点では品切れになっていました…。魔改造用に二個発注しときゃよかったなぁ。

*3:で、TCXOに根性で置換した人がいるとかなかなか遊び甲斐があるデバイス。

*4:dump1090の起動オプションで変更可能。わたしの環境ではWebサーバ用ポート8080が既に使用済みなので、Webサーバ待ち受けポートだけ起動時の引数で変更した。