国信大の学生証を読み取るAndroidアプリを作りました

国際信州学院大学の学生証にはIC(FeliCa)が内蔵されていて学生情報が記録されています。

最近では年末の大学事務休業期間に帰省等で安雲野を離れている人のために都内のイベントで発行業務を行ったりしました。

また、2020年度は郵送でも発行を行っています。

郵送で学生証の発行を行います

この学生証に記録された情報をNFCで読み取るAndroidアプリを作ってみました。Android 4.1以降のNFC搭載端末なら動くと思います。

playストアに公開しました。以下のリンクからインストールしてください。

https://play.google.com/store/apps/details?id=jp.kokushin_u.scc.sidreader

アプリ起動後、スマホに学生証をかざすと記録されているデータが表示されます。

NFC対応Android端末とC97等で発行した学生証をお持ちの方は試してみてください。

ソースコードはgithubに公開しています。https://github.com/sui-scc/suiIDviewer

ちなみにICカードへの記録フォーマットはこんな感じです。C97で発行したものはデータ形式バージョン0(上)、2020年になってから発行したものはバージョン1(下)になっています。

データ形式バージョン0
データ形式バージョン1

3Dプリンターで国信大キャンパスを出力

最近は3Dプリンターも安くなってきているので当会にも廉価な3Dプリンターとして定評のあるender-3を導入しました!

そこで早速、手元にあった国信大のキャンパスの3Dデータに土台の追加など手を加え、3Dプリンターで出力してみました!

これを出力したのがこちら!土台を含めて6時間くらいかかりました。

FDMの宿命である積層痕や走査痕が見えたり途中でプラットフォームシートの左下が浮いてしまったので文字が潰れたりムラが若干ありますがいい感じにできています!

PC内で作成した3Dデータが現実に物理的な物体になって出てくるのは感動しますね〜

これから何かアイデアがあれば3Dプリンターを色々活用していたいです。

今回使用したSTLファイルはこちら!(blenderから出力しました)

campus-3dmodel-1.stl

asteriskでIVR(自動音声応答)を構築する

今年に入ってから国信大の事務室の電話がIP化したそうです。(新しい国信大の電話番号は050-5438-6933)
IP化により、ただ電話機で受けるだけではない高度な電話サービスを簡単に実現することができます。自動音声応答もその一つですよね。
そこで、久々にちょっと電話ハックということ自動音声応答(Interactive Voice Response, IVR)を自作してみようと思います。

IVRの構築に必要なものは3つあります。1つは当然ですが電話回線が必要ですよね。2つ目も当然ですが自動音声応答で流れる音声です。そして3つ目がIVRを実装するPBXサーバーです。(PBXっていうのは構内交換機のことです。)

電話回線についてはSIPでレジストできる回線が必要です。NTTのひかり電話は固定電話の番号のままIP化(VoIP)できるので有名ですね。また、050番号のIP電話は多数の会社が提供していると思います。個人趣味でちょっと電話回線が欲しい場合は楽天コミュニケーションズか提供しているFUSION IP-Phone SMARTとかいいんじゃないかと思います。スマホの通話料金を節約するのに便利なサービスですが、番号が月額無料で発行できるのでありがたいです。無料で050番号が持てるサービスは他には050 Freeとかもあります。

自動音声応答で流す音声ですが、21世紀ですから声優やアナウンサーの友達がいなくても適当な方法で音声合成すればいいですよね。ゆっくりに喋らせてもいいですし、Google翻訳の読み上げ機能を使うこともできます。AWSの音声合成サービスのPollyなんかは完全ではないですが自然に近い音声を合成できるのでおすすめです。

そして本題のIVRを構築する方法ですが世の中にはTwillioなど便利なサービスがありますが有償で企業向けだったりするので個人では使いにくいです。無料で済ませるには自前のサーバーでオープンソースのIP-PBXであるAsteriskを動かすのが鉄板です。

Asteriskの導入

まず、サーバーにAsteriskを導入します。debianなら# apt-get install asteriskで一発でインスコできると思います。

次にSIPの設定です。/etc/asterisk/sip.confを編集します。INFファイルの要領で設定を書き換えます。

まず、忘れずに行いたいのは外部から勝手に発信されないようゲスト発信を許可しないことです。[general]セクションにallowguest=noを追加しましょう。

次にSIPアカウントの設定をします。SIPアカウントのログイン情報を用意して[general]セクションに以下を追記します。
register => ユーザー:パスワード@ドメイン
次にsip.confの末尾にもアカウント情報を記載します。

[適当なセクション名]
type=friend
username=ユーザー
fromuser=ユーザー
secret=パスワード
host=ドメイン
fromdomain=ドメイン
context=default
insecure=port,invite
canreinvite=no
disallow=all
allow=ulaw
allow=alaw
dtmfmode=inband
nat=yes

こんな感じで記載します。これでSIPアカウントの設定ができました。
次はいよいよ着信後の動作の設定をします。ここでIVRを組み立てます。/etc/asterisk/extensions.confを編集します。
IVR用のセクションの名前を仮にmy-ivrとでもしておきましょう。
まず、[default]セクションに着信したらmy-ivrセクションに飛ぶように以下の記述をします。
exten => SIPのユーザー,1,Goto(my-ivr,s,1)
これは(SIPのユーザー)への着信は1番目にmy-ivrセクションのsコンテキストの1番目に飛ぶという意味です。

my-ivrセクションを書いていきます。
IVRの流れは例として以下の流れで構築するとします。

  • 音声ファイルの場所は/home/asteriskとする
  • 着信したら5秒間呼び出し音を鳴らした後応答する
  • 最初に音声ファイルhelloを流す
  • 次に音声ファイルmenuを流すと同時に数字入力を受け付ける
  • 1の場合、message1-1、message1-2を流して終了
  • 2の場合、message2-1、message2-2を流して最初の選択に戻る
  • 3の場合、message3を流して1の場合に続ける
  • 無操作は1の場合に続ける
  • 誤った番号は音声ファイルinvalidを流して選択に戻る

上記のIVRの流れの設定をコメント付きで載せてみますのでこれを参考にいじれば自分だけの独自のIVRが構築できると思います。基本的に「exten => コンテキスト,順番,コマンド」を並べて記述します。コンテキストは最初はs、番号別の場合はその番号です。順番は同一コンテキスト内でのコマンドの実行順です。1からスタートして2,3,4…と続いていきますが番号を決め打ちすると後から編集する時に番号の振り直しが発生して大変なので2番目以降はnと書くことで前のコマンドの次と扱われます。

[my-ivr]
;exten => コンテキスト,順番,コマンド
;コンテキストsからスタートします
exten => s,1,Set(dir=/home/asterisk/) ;変数定義(音声ファイルのディレクトリ)
exten => s,n,Ringing() ;呼び出し中であることを明示する
exten => s,n,Wait(3) ;3秒待つ
exten => s,n,Answer() ;応答する
exten => s,n,Playback(${dir}hello) ;音声ファイル/home/asterisk/helloを再生
exten => s,n(menu),Background(${dir}menu) ;音声ファイルmenuを再生しつつ番号入力を受け付ける 後でここに飛べるようにn(名前)という感じで順番に名前をつけることができます。
exten => s,n,WaitExten(10) ;番号が入力されるまで待つ
exten => s,n,Goto(1,1) ;番号が入力され無かった場合コンテキスト1の1番に飛ぶ
;誤った番号(その番号のコンテキストが定義されてない)が入力されるとコンテキストiに飛びます。
exten => i,1,Playback(${dir}invalid) ;音声ファイルinvalidを再生
exten => i,2,Goto(s,menu) ;コンテキストsの順番n(menu)に飛ぶ
;番号選択で1が押されたらコンテキスト1に飛びます
exten => 1,1,Playback(${dir}message1-1)
exten => 1,n,Playback(${dir}message1-2)
;番号選択で2が押されたらコンテキスト2に飛びます
exten => 2,1,Playback(${dir}message2-1&${dir}message2-2) ; &で挟んで複数のファイルを指定できます
exten => 2,n,Goto(s,menu)
;番号選択で3がry)
exten => 3,1,Playback(${dir}message3)
exten => 3,n,Goto(1,1) ;コンテキスト1の順番1に飛ぶ

上記で音声ファイルを指定しましたが、音声ファイルはmp3とかはそのまま使えずgsmやulawでエンコードしたものを用意する必要があります。基本gsm形式で用意して、余裕があったらulawでも用意しておくのが良いと思います。(gsm形式だけでも十分です。)
音声ファイルの変換はsoxコマンドが使えます。
gsm形式に変換(拡張子は.gsm)
$ sox sound.mp3 -r 8000 -c 1 sound.gsm
ulawに変換(拡張子は.ulaw)
$ sox sound.mp3 -r 8000 -c 1 -e u-law -t wav sound.ulaw
extensions.confで音声ファイルを指定するときは拡張子を除いたファイル名を指定します。(sound.gsmファイルを再生したいときはPlayback(sound)って感じ)

設定ができたらasteriskを再読み込みすれば反映されます。(# systemctl reload asterisk)
asteriskが起動していなければ起動します。(# systemctl start asterisk)

# asterisk -vvvcrでasteriskのcliを起動できます。cliを起動後に表示されるログを見ながら電話をかけて動作を確認すればデバッグしやすいと思います。

いかがでしたか?
asteriskにはたくさんの機能がありますので色々組み合わせたら結構高度なことができるんじゃないかと思います。
21世紀は電話も情報化している時代です。ご家庭にある自宅サーバーにasteriskを導入すれば誰でも企業レベルの電話システムをおうちで実現することできます。
くれぐれもセキュリティには十分注意しましょう。勝手に発信されて国際電話されまくって高額な電話代を請求される被害が多いです。(僕も高校生の時、家電をasteriskにつなげて遊んでたら中東方面に国際電話されまくって涙目になったことがあります。数日で気がついたので諭吉数人の被害で済みました。諭吉数人が「これくらいで済んで良かった」と思うくらい国際電話の被害は恐ろしいです。昔のダイヤルQ2みたいな感じで途上国に国際電話して現地の電話会社からキックバックをもらうという手口らしいです。)
被害にあったからと言って電話会社は一切電話代を免除してくれないと思います。
asteriskに収容する電話回線は国際電話できない設定にする、サーバーのファイヤーウォールで外部からSIP接続は遮断するくらいは必要です。allowguest=noの設定も絶対に忘れないでください。

国信大でのヘリコプター弦楽四重奏曲の公演は現実的だったのか

今日(10/14)、国際信州学院大学総合音楽研究部により「秋の現代音楽祭『変容するヨーロッパ』」と題して演奏会が行われました。

https://twitter.com/Kokushin_onken/status/1045371367355375617
秋の現代音楽祭『変容するヨーロッパ』開催のお知らせ

コンピューター同好会の人たちは僕も含めてあまりこういうコンサートに興味なかったのですが、今回のコンサートはなかなか見ることができない貴重な曲目もあるとのことで聞きに行くことにしました。というか部室に音研の人がチケット売りに来たのでつい買っちゃったんですけどね・・・

風変わりな曲やちょっと不気味!?な曲調の曲が多く(特に後半)、不思議なコンサートでした。そして今回のコンサートの目玉で一番最初の曲であるヘリコプター弦楽四重奏曲が今までにない演奏形式で新鮮でした。

なんと演奏者がヘリコプター四機に分乗し、演奏開始→離陸→着陸→演奏終了で約30分、飛んでいるヘリコプターから演奏を映像中継してコンサートホールで見るという斬新な演奏でした。

ヘリコプター演奏の実現方法を考える

ただ、僕は好奇心が旺盛なのでこういう日常離れしたものを見ると裏側が気になって素直に芸術を楽しめないタイプです。公演よりも公演を支える(工学的な)技術に関心がいってしまいます。理系な人間の性なのでしょうか・・・
そこでどうやってこの演奏を実現するのか考えてみました。

ヘリコプター演奏を実現するためにクリアしなければならないポイントは主に3つあります。

  • ヘリコプターをチャーターする
  • ヘリコプターが離着陸する場所を用意する
  • ヘリコプターからコンサートホールへリアルタイムに映像伝送するシステムを構築する

順番にクリアしていきましょう。

ヘリコプターをチャーターする

当然ですがヘリコプターが必要です。会場である国際信州学院大学のコンサートホールまでヘリコプターを回送し、約30分の演奏時間コンサートホール周辺を飛行し、終了後ヘリコプターの拠点まで回送する必要があります。しかも4台も。準備なども考えると回送時間+1時間くらいは飛行時間が必要かと思われます。

キャンパスのある安雲野から一番近いヘリの拠点といえば松本空港(信州まつもと空港)ですよね。松本空港のHPを見ると松本空港にはヘリコプターを運行してる会社が二社あります。(東邦航空株式会社と新日本ヘリコプター) どちらも物資輸送がメインのようです。ヘリは足らなければ別のところからヘリを持ってくる必要があります。東邦航空は長野ヘリポートにも拠点があるようです。

ヘリをチャーターするのにはおいくら万円かかるのでしょうか。

適当にググったら知恵袋経由で参考料金一覧のページにたどり着きました。
アークEFI航空情報センター 航空機チャーター事業部(参考料金一覧)
乗務員を除いて1人しか乗れないような小型のヘリなら一時間8万円台からあるようですが、基本、1時間あたり数十万円はかかりそうですね・・・
4台で100〜200万はしそうです。僕はそんなにたくさんの諭吉を見たことがありません。

ヘリコプターが離着陸する場所を用意する

ヘリコプター弦楽四重奏曲は離着陸も演奏の中に入っていますからヘリが安全に離着陸できるスペースが必要です。

大学HPのアクセスのページに掲載されている周辺地図からコンサートホール周辺を見てみます。

コンサートホールの近くでヘリコプターが離着陸できる場所といえばこくしん広場とこくしんフィールドと3号館の後ろにあるヘリポートくらいですね。4台分くらいのスペースはありそうです。こくしん公園は平地じゃないので駄目です。

ただし、ヘリだってれっきとした航空機ですから、空港でもないそこら辺の土地に自由に離着陸できるわけではありません。

航空法 第七九条 (離着陸の場所)
航空機(国土交通省令で定める航空機を除く。)は、陸上にあつては空港等以外の場所において、水上にあつては国土交通省令で定める場所において、離陸し、又は着陸してはならない。ただし、国土交通大臣の許可を受けた場合は、この限りでない。

そのため、場外離着陸場として離着陸する場所を事前に管轄の空港事務所(長野県なら東京空港事務所)に申請し、許可を得る必要があります。

離着陸する場所は許可さえ取れたら特に問題ないと思います。

ヘリコプターからコンサートホールへリアルタイムに映像伝送するシステムを構築する

コンピューター同好会としてはここが一番気になるポイントです。

演奏者はヘリの中で演奏しますが、観客はコンサートホールの中にいるのでヘリの中の演奏を映像でコンサートホールへ中継する必要があります。
映像、しかもコンサートホールホールへの中継に耐える解像度の映像を中継するにはそれ相応の帯域を有する安定した伝送経路が必要です。

伝送経路が有線で大丈夫な場合はそんなに問題ないと思います。HDMIは短距離しか使えませんが、BNC接続の同軸ケーブルで映像を伝送するSDIなど長く伝送できる規格があります。また、LANケーブルをハブをかましつつ引き回せば手軽に通信経路が確保できます。IPで通信できれば色々方法がありますよね。ちなみに業務用ならNDIっていう動画伝送プロトコルがあります。(ffmpegも組み込んでビルドすれば対応できるっぽい)

でも今回はヘリから中継するため、無線で送らないといけません。テレビ局の報道ヘリとかはマイクロ波回線や衛星回線を使っていますが、コンサートのためだけに簡単に手配できるものでもないですよね・・・。アマチュア無線扱いでデジタルTVの規格(DVB-Sなど)で映像を送るのも前例はあるものの容易ではなさそうです。(手段と目的が逆転する)

映像を自分たちの手でなんとかできそうで大きなコストもかからなそうな方法、それはやっぱり携帯回線を使うのが一番ですね。
特にひねりのないありきたりな手段になってしまいましたwww
21世紀になってもうすぐ18年、LTEやWiMaxの普及で広帯域移動回線が誰でも簡単に身近に使っている時代になりました。

携帯回線は基本的にQoS制御(通信の優先度を制御)できないし混雑すれば遅くなったりしますが、複数回線を用意して束ねて映像のバッファも余裕を持たせておけば少々の遅延はありますが実用に耐えるんじゃないかなと思います。複数回線を束ねるソフトも実際色々ありますし、無制限WiFiルーター(LTE回線)を1日単位で借りることもできます。

コンサートホールのスクリーンを1080pくらいと考えたらヘリ1機あたりの映像は720pあれば十分でしょうし、H.264なら10Mbpsあれば足りるでしょう。
僕は以前、スマホでWiFiオフのままうっかり地デジの生TS(20Mbps前後)をストリーミング再生してしまったことがありますが、WiFiオフに気づくまでの少しの間ですが普通にスムーズに再生されました。(物凄い勢いでギガをドブに捨ててしまいました(泣))
やっぱりLTEは高速です。

安雲野は田舎ですが山間部を除いてしっかりLTEのエリア内です。

演奏者同士が合わせるために他の演奏者の音を演奏者に流す場合は原始的にFMで飛ばせばいいと思います。(音質は重要ではなく、遅延はNGなため)

最後に

ヘリコプター弦楽四重奏曲を国信大で公演するのは現実的に難しいかなと思っていましたが、ヘリのチャーターさえできれば多少の手間はあれど意外と難しくないことがわかりました。

意外と難しくないっていうのは物理的な意味であって、実際演奏する方々にとってはとても難しかったのではないかと思います。ヘリの中では騒音も大きく、楽器の音や他の演奏者の演奏も聞こえづらいですしね。

安雲野市文化振興財団が後援していますし、(おそらく)信州初ということで学外からの鑑賞者も多かったので、多くの人の期待の元で無事公演が成功しました。

総合音楽研究部の皆さん貴重なコンサートをありがとうございました!

僕はヘリの運行のことは全くわからないですし、映像関係の技術についても実務的な知識はありません。実現するための考察について、なるべく正確性を期していますが、適当にググって得た情報がベースのでそのつもりで読んでください。また、文中の企業、機関等はコンサートとは無関係なので問い合わせたりとかはしないでください。

10月17日追記

今回の演奏会の感想を丁寧に記事にされたブログがあります!
この芸術にマジレスするような現実的な記事では演奏会の面白さが伝わらないと思いますので、合わせてお読みください。

各停日乗 ヘリコプター弦楽四重奏曲の日本初演を聞く

コンサートの様子を事細かく書かかれているため演奏会に行かなかった方も雰囲気を感じ取れると思います。

OpenStreetMapのデータに独自に地物を追加してnginxでタイルサーバー構築して大学のアクセスマップを作った

久々のブログです!

今回の記事は技術的な内容が多いので、興味ない方は適当に飛ばしながら読んでください。

国際信州学院大学は都会の大学と違って十分な予算があるわけでもないのでHP制作も外注せず学内で行われています。そのため、僕達のコンピューター同好会にも大学のHPの制作の仕事が回ってくることがあります。

今回はGoogle Maps APIの課金体制が変更になり費用が発生する恐れがあるため、HPのアクセスに掲載する周辺地図をOpenStreetMapにできないかという相談が大学から当会にありました。

OpenStreetMapというのは地図情報を誰もが利用できるように有志で協力して、フリーな地図情報データを作ろうというプロジェクトです。Wikipediaの地図版みたいなものです。

OpenStreetMap(OSM)の地図をサイトに載せようと思えば簡単ですが、国信大の場合2つ問題点があります。
一つは大学のページですから話題になればアクセスが増加し、OSMのサーバーに負荷がかかってしまう可能性があります。
もう一つはOSMの地図は有志の手によって作られているのですが、国信大は田舎の私立大学のため知名度がなくOSMには掲載されていません。OSMは有志が編集に参加できるため、国信大を追加することも可能ですが、今まで無名であった上に某匿名掲示板のユーザー達のイタズラにより架空の大学であるという情報がネットに流布されてしまいました。そのため、架空の大学であると思いこむ人が多く、OSMに追加したところで「架空の地物が追加されてる!これはOSMに対する破壊行為だ!」とか思われて即消しされそうなのでやめておきます。
(OSMは素晴らしい取り組みであり、地上に存在するものをマッピングするなどの決まりがありますので尊重しないといけません。)

そこで、大学の方で自前のタイルサーバー(地図画像を配信するサーバー)を用意し、そこにOSMのデータに修正を加えたものを導入することにしました。タイルサーバーの構築方法は調べればいろいろ出てくるのですが、地図データの編集についてはOSM本家に貢献することが前提となっていてOSMのデータにローカルで独自で地物(地図上の物や概念)を追加する方法の情報があまりありませんでした。試行錯誤の上、場当たり的な泥臭い方法ですがOSMのデータをローカルで修正することができましたのでまとめておきます。もっと適切な方法があれば(多分あるはず)教えていただきたいです。

必要なツールはosmosisとosmconvertとJOSMです。僕はArch Linuxを使っていますがJOSMはpacmanから入り、osmosisとosmconvertはAURから入れました。

まず、OSMのデータを入手します。地球上の全てを網羅したplanet.osmというものがありますが、圧縮しても30-50GBという代物ですしよほどの高スペックマシンでないと扱えないでしょう。ここでは中部地方だけのデータを入手したいと思います。geofabrikのサイトから入手できます。PBF形式でダウンロードできますが中部だけでも249MBもありますね・・・
(OSMデータのファイル形式には複数ありますが、ここでは.osmと.pbfを使います。.osmはXML形式で取り回しがよく編集時に使います。.pbfはバイナリ形式でコンパクトなので広域向けです。)

これでも少し大きいので長野県を囲む矩形領域だけ切り出しましょう。PBFファイルやOSMファイルを変換したりするのにosmosisというコマンドを使います。top,left,bottom,rightを緯度経度で指定し、切り出した領域をnagano-rect.pbfに書き出します。

$ osmosis –rb chubu-latest.osm.pbf –bounding-box top=37.05 left=137.255 bottom=35.15 right=138.85 completeWays=yes completeRelations=yes –wb nagano-rect.pbf

これで長野県を囲む範囲のデータになりましたので、地物を追加修正してタイルサーバーに突っ込みます。追加修正したいのですが、直接編集するにはまだ巨大なファイルです。編集用にキャンパスの周辺だけ.osmファイルに切り出しましょう。

$ osmosis –rb nagano-rect.pbf –bounding-box top=36.4 left=137.8317 bottom=36.366 right=137.89 –wx campus-around.osm

後で差分を取るため、コピーしておきます。

$ cp campus-around.osm camps-around-orig.osm

オリジナルをコピーしたら早速編集します。JOSMっていうjavaでできたOSM用のエディターがあるので先ほどのcampus-around.osmを開いて地物を追加修正削除していきます。iDっていう手軽なエディタがあるらしいけどローカルで修正するのには使えないかも。

うちの大学は田舎の私大のくせにTDL並にキャンパスが大きく、建物も多いのでノード繋いで名前つけてタグ付けして複雑な地物はリレーション設定して・・・正直めんどくさいです。OSMの貢献者の皆様には頭が下がります。(でもなれると楽しい!?)

編集が完了したら保存しJOSMを閉じます。閉じる時にアップロードするか聞かれますがアップロードせず保存するだけにします。早速OSMの差分を取りたいのですが一筋縄にはいきません。泥臭いやり方で強行突破します。

まず、編集後のOSMファイルをテキストエディタで開きます。XMLが見えると思いますが、新しく追加したノード等はid属性が負数になっています。負数のIDは仮のものでOSM本家にアップロードすると正数の固有のIDが割り当てられるそうですが、ここではローカルで済ませたいので負記号と上ひと桁を他と重複しなさそうな適当な数字列に置換してお茶お濁しましょう。ID置換後でも既存のIDより若くなるような数字列で置換すると後でエラーにならずにすみます。

osmosisを使って変換しようと思えばtimestamp,changeset,version属性も必要です。JOSMで追加したノード等には3属性がついておらず、action=’modify’属性がついていますのでそれを置換対象にうまく使って3属性を追加しましょう。ここでは「’ action=’modify’ lat=’」を「’ action=’modify’ timestamp=’2018-06-01T00:00:00Z’ version=’1′ changeset=’1′ lat=’」に置換しました。

nodeだけでなくwayやrelationにも追加する必要があるため「’ action=’modify’>」を「’ action=’modify’ timestamp=’2018-06-01T00:00:00Z’ version=’1′ changeset=’1′>」に置換しました。

次にosmosisが正常にこの.osmファイルを読み込んでくれるか確かめます。osmosisで無意味な変換をしてみます。

$ osmosis –rx campus-around.osm –wx campus-around-test.osm

これでエラーが出たら先ほどの置換を見直すなどしてエラーメッセージ(属性が足りない等)に対応します。何もエラーが出なかったら次に進みます。osmconvertを通します。

$ osmconvert campus-around.osm –emulate-osmosis -o=campus-around-converted.osm

これをしないとJOSMで削除したノード等が生き返ってしまいます。(osmosisがaction=”delete”をスルーしてしまうため)

やっとosmの差分を取る段階にたどり着きました。osmosisコマンドで.osmファイルの差分をとって.oscファイルに書き出します。–rxで.osmファイルを2つ指定していますが、編集後が前でオリジナルが後ろです。

$ osmosis –rx campus-around-converted.osm –rx camps-around-orig.osm –derive-change –write-xml-change file=”campus-around-change.osc”

ついにタイルサーバーに突っ込むデータに差分を適応する段階に来ました。今回は前半で用意したnagano-rect.pbfに適応してみます。もちろん中部全域のPBFファイルでも日本全域でも全世界のplanet.osmでもかまいません。

$ osmosis –read-xml-change file=”campus-around-change.osc” –rb nagano-rect.pbf –apply-change –wb nagano-rect-modified.pbf

これでタイルサーバーのpostgresに突っ込むデータが出来上がりました!!!長かった!!!!

あとはOSMのタイルサーバーの構築方法はググればいろいろ出てくるので構築して、osm2pgsqlで先程のnagano-rect-modified.pbfを突っ込んであげればOKです。

これでめでたく独自追加した地物が表示される自分たちだけのタイルサーバーが出来上がります。やったね!!

ちなみにタイルサーバーの構築はググればOKって言いましたが、こっちの方でもたくさん苦労がありました・・・タイルサーバーの構築まですることになるとは・・・まあ普通に生きててする機会なんてあまり無いですからね。
あとタイルサーバーはApache+mod_tileが鉄板なのですが、鉄板過ぎてそれを使わない方法の情報がなかなか出てこないんですよ・・・
nginxて構築しようと思ったのですが「構築した!」との情報はあっても具体的な指南が見当たらなかったように思います。

いろいろ試行錯誤した挙句postgres(postgis)+tirex(+mapnik)+lua-nginx-osmでタイルサーバーを構築しました。lua-nginx-osmは今回の案件にちょうどよかったのですが、github上のコードはそのままでは動かず少し修正する必要がありました。修正箇所は最後に載せておこうかなと思います。

冒頭にも書きましたとおりうちの大学は潤沢な予算がありません。今回のタイルサーバーとしてあてがわれたマシンも贅沢なものではなくメモリー2GBでCPUは2コア1.66GHz(Core2Duo T5500)と2018年となっては控えめなものです。

タイルサーバーを構築してわかりましたが、これって想像以上に負荷がかかるんですね・・・このマシンではタイルの描画に十数秒〜数分もかかってしまい、描画性能的には使いもになりません。ただ、一度描画したらtirexがキャッシュしていますし、cloudflareもかましていますので、キャンパスの周辺を表示するだけの用途なら一応大丈夫でしょう。

風のうわさで国信大のHPのサーバーはさくらVPSの1Gプランで運用されているとか聞いていてうちの大学はそんなに金がないのか・・・と思っていました。(蛞蝓亭の騒ぎで国信大が話題になったときはアクセスの集中でよく鯖落ちしていましたし)
高スペックの要求されるタイルサーバーもまさか1GのVPSに構築させられるのではないか心配していましたが、大学側が(焼け石に水かもしれませんが)少しマシなマシンを用意してくれたようです。

大学HPのアクセスページに掲載されていますが、一応出来上がった地図を貼っておきます。

OSMのライセンスはいまいちよく把握していませんが、「©OpenStreetMap contributors」って著作権表示をしておき、改変を加えたらそれを明示しておけば大丈夫だと思います。

HPの片隅にある何気ないアクセスマップですが、隠れた技術背景があることを知ってもらえたら構築に関わった者としては嬉しいです。

このようにうちの会は時々大学側から技術的なサポートを求められることもあり、タダ働き貴重な経験をすることができます。

国際信州学院大学に入学したら是非、コンピューター同好会に入会しませんか。

2018年度入会募集中

ちなみに当会は、それなりに活動していて、大学にもよく協力していて、サブドメインももらっていますが、実はまだ非公認のサークルなんです・・・
大学公認のサークルはアンカとかなんとかいうよくわからない方法で決定されているらしく、当会は対象に入ってなかったようです。まあ仕方ないですね。

“OpenStreetMapのデータに独自に地物を追加してnginxでタイルサーバー構築して大学のアクセスマップを作った” の続きを読む

ゲーム「FlappyFlapper」

鬼畜ゲーとして有名なFlappy Birdのフラッパー君バージョンを作りました。

遊び方は簡単です。クリックかタップをするとフラッパー君がジャンプするのでフランスパンに当たらないようにうまくよけてください。
本家みたいに鬼畜ではないですが慣れないと難しいかもしれません。スマホなどのタッチパネルのほうがやりやすいかもしれません。
音が鳴ります。

ランキング対応版FlappyFlapperはこちら→ https://portal.kokushin-u.jp/flappyflapper/

↓下のはランキングに対応していません。