WebAssembly 事始め

WebAssemblyのインストール

WebAssemblyを導入してみようと思い立ち、取り敢えずググること数時間。
WebAssemblyって面白そう!ということで、その辺に転がっていたCentOS 7に取り敢えずインストールして試してみようかな?と言うことでやってみた。

よく解らないながら、node.jsを入れておくと良さそうなので、インストールしておく。

他にも入ってるかも知れないけど、gccとか既に入っていたので無視!
確認のために必要なWebサーバについても、Apacheがインストールされているので、こちらも無視。
まあ、何かあったらエラー出てくるだろう?ということで。。。

適当なディレクトリを作成して、gitでクローンを作るところから始まる。

よくわかんないけど、こんな感じでおまじないを入れる。

最初はそこそこ時間掛かるみたいです。
終わったら、サンプルプログラムを動かしてみようと思います。

サンプルプログラムと実行

サンプルプログラムと言っても、単なるHell Worldですが。。。(^^ゞ

ここではC言語なのに、敢えてsample.cppとして作りました。
コンパイルしてみます。

忘れていました。emsdkを構築したディレクトリで以下のコマンドを実行して、環境設定を行います。

このままだと毎回上記のコマンドを実行する必要が生じますので、ログイン時に設定する様にした方が良いですね。(割愛しますが。。。)

コンパイルします。

.jsだけ作る場合は、以下のコマンドになります。

# emcc -o sample.js

確認方法は2通りあります。
node.jsで動作確認する場合は以下のコマンドで確認出来ます。

# node sample.js

Webサーバで確認する場合は、.jsと.wasmと.htmlを/var/www/html以下の適当なディレクトリへ保存します。
あとは、ブラウザでアクセスしてみてください。

こんな感じ

こんな感じの画面が出たら成功です!

どのファイルがWebサーバに必要なのか解らなかったのですが、結局全部欲しいらしいw
これだけだと、単なるリソースの無駄遣いプログラムを作っただけなのでは。。。?
はい、そうですw

Qtが連携出来そうなので、Qtと連携してみようと思います。

仮想OSでインストールしたWindows 10がLAN上のNASに繋がらない時の対応

概要

VirtualBoxでWindowsをインストールした時に、LAN上のNASが接続出来ない状況が発生しました。
その対処についてまとめます。

最終的な結果として、プレインストールのWindows PCで同現象が発生していないことから、Windowsをメディア等からインストールした時に発生する現象であると思われます。
私の環境では、Windows 10で現象が確認されましたが、Windows Server 2016でも同現象が発生するもとの思われます。
その他Windowsの各バージョンにおいて発生した場合でも参考になるかも知れません。

Windows からNASに接続出来ない場合の対処法として記録します。

具体的な現象

VirtualBoxでWindows 10の環境を構築しました。
VirtualBoxでLAN上のネットワークに接続する方法は他にもありますが、ブリッジ接続を選択しました。
プライベートネットワークとして接続しています。

この状態で、通常のプレインストールされたWindows PCであれば、特に気にすることなく接続出来ると思うのですが、新規にインストールしたWindowsからは見えませんでした。

対策内容

幾つかの対策を行いました。
それぞれ順を追って説明しますが、以下に一覧を記します。

VirtulaBoxにおけるネットワークの設定

WindowsをVirtualBoxで仮想OSとして構築した場合について記載します。
ホストOS(Physical OS)の場合は、この項目の内容を飛ばして、次の設定に進んでください。

Windows側のネットワークの設定

Windowsのネットワーク設定がパブリックになっている可能性があります。
当初、私の環境ではパブリックになっていたのでプライベートに変更しました。設定は以下の手順です。

「ネットワークとインターネットの設定」を開きます。

画面右下のネットワークアイコンを右クリックすると以下のポップアップが表示されます

「ネットワークとインターネットの設定を開く」を選択します。

赤枠で囲んだイーサネットのアダプタをクリックします。

「パブリック」になっていたら、「プライベート」に変更してください。

ネットワークと共有センターの設定

ネットワークと共有センターの設定は、一つ前の画面にある「ネットワークと共有センター」を選択すると移動が楽です。

左メニューの「共有の詳細設定の変更」を選択します。

「ネットワーク探索を有効にする」を設定してください。

ワークグループの設定

「コントロールパネル」→「システム」を開きます。

「設定の変更」を開きます。

「変更(C)」で開かれるダイアログで、ワークグループを適切に設定してください。

ここまで来ると、エクスプローラで「ネットワーク」を選択すると、対象となるNASの名前が表示されたりします。
表示されない場合もありますので、あまり深く考えないで次へ進みましょう。

レジストリの設定

最大の難関はここでした!

「regedit」を起動します。
次に、以下のレジストリを探します。

「AllowInsecureGuestAuth」の項目を確認し、「1」をセットします。

再起動を行うことをお勧めしますが、私の場合は再起動なしでもNASへアクセス出来る様になりました。

ただ、このレジストリが見つからない場合もあります。
環境に依存している可能性もあり、判断が難しいところですが、新規に作ってしまうという手もあるのか?ご自身の責任で試してください。
レジスタを追加するのは、最後の手段にしておく方が良いでしょう。
保証も何もありません。

最後に

この現象はWindowsのアップデート後に発生している方も多い様です。
SMB絡みの不具合でもあると思いますが、MS社からすれば仕様なのかな?
そもそもWindows自体が安定性に乏しいということなのでしょう。
この問題は、Windows Server 2016でも報告されているので、アップデートの際にきちんとしてくれるとかないのかねぇ?MS社は無駄な労力をこういうところで強いるので、サポートをもっと手厚くしてほしいですね。

これがWindowsカテゴリ最初の投稿になるとは・・・w

GeoTiff 座標系変換と結合

前提

国土地理院の地理院地図やGoogle Mapで提供されている航空写真を用いずに、独自に入手した衛星画像や航空写真を用いて広範囲の画像を表示させようとした時、座標系の変換と画像の結合が必要となります。

一般に入手される航空写真などで提供されている画像の座標系はJGD2011など、Web上では使い難い座標系を用いている場合が多く見受けられます。
その為、多くの場合には、座標系を変換する必要が生じるのです。
本資料では、この作業を行うための環境について説明し、衛星画像や航空写真などを用いて、座標系変換を行ってから画像を結合する以下の手順について説明します。

  1. 環境準備
  2. 画像の座標系を確認する。
  3. 座標系を変換する。

では順番に進めましょう。

環境準備

環境準備と言いましても、インストール方法については割愛します。
既に、本サイトでも紹介をしているOSGeo4Wをベースにお話しを進めます。
ただし、衛星画像や航空写真を結合する作業を行うには、正直申し上げてWindows環境はあまり適している環境とは言えません。
その理由としては以下が考えられるでしょう。

  • コマンドライン(シェル)が使い難い
  • 元々メモリの消費が激しく、大量のメモリを消費する作業では使い勝手が悪い。

数枚の画像を扱う程度であれば、GISツール(QGISなど)を用いて、ちまちま行うという方法もあるでしょう。パッチ処理などでまとめて出来るよ!という方もいらっしゃるとは思いますが。。。無視!

ということで少し作業がやり易いように1つツールを入れて作業を行っています。
また、一部の操作に関しては、Linux上で作業を行うかも知れません。

環境としては、以下の環境を準備しました。

Windows 10
OSGeo4W (GDALが入っていればOK!)
 参考情報:https://trac.osgeo.org/osgeo4w/wiki/OSGeo4W_jp
 過去の参考情報:https://tech.godpress.net/?p=368
Gow
 参考情報:https://ja.wikipedia.org/wiki/Gow

実際の作業ではGDALを使用します。
GDALのみをインストールした環境を準備されている方は、その環境を用いてもOKです。(って、そんな環境造っている人が、このサイトを参考にされるとは思いませんが。。。)

画像の座標系を確認する

OSGeo4Wをインストールしている場合、QGISで確認しちゃおう!という方は、GUI上でプロパティ確認で終わっちゃいますね。
でも今回は、コマンドライン操作が基本となりますので、コマンドで対処します。

Gowをインストールしていると、Linuxと同じような感覚でコマンドラインの操作が行える様になります。

なんでコマンドラインで作業を行うかと言いますと、入手した画像が全て同じ座標系であれば、あまり大したことではないのですが、時折、異なる座標系の画像を提供されて結合する場合があり、全ての画像を同じ座標系に統一しないと画像を結合した時にズレが生じて隙間が発生するのです。
間違って座標変換を行わないためには、事前に元画像の座標系を確認しておく必要があるためです。
では、実際のコマンド操作に関して説明します。

以下のコマンドは1つのファイルに対して座標系の確認を行うためのコマンドです。

複数のファイルに対し一括して確認を行う場合は、対象ファイルがあるフォルダーへ移動してから、以下のコマンドを実行します。

「gfind」コマンドは、Linuxの「find」コマンドをGowが実装したコマンドになります。

最初の引数「.」は対象となるフォルダーを指定しています。
対象フォルダーへ移動せずに、直接フォルダーを指定しても構いません。

-name *.tif :対象となるファイル名を指定します。ここではワイルドカードを用いた指定を行いました。全てのtifファイルが対象となります。

「|」で次のxargsコマンドへ出力結果を引き渡しています。
xargsコマンドでは-n 1とすることで、ファイル名を一つづつ処理します。
gdalinfo <ターゲットファイル>がファイル数分処理されます。

最後に、grepで必要な行だけを取得しています。

座標系を変換する

今回は、以下のフォルダー構成を想定して作業を進めます。
<作業フォルダー>—<EPSG102617>
         |
                                   +<EPSG4326>
コマンド操作は、<作業フォルダー>で行います。
<EPSG102617>は元の画像が保存されているフォルダーです。
先程の確認で座標系がEPSG:9001となっていましたが、内部ではEPSG:102617が正式な座標系となるためこの様にしています。

<EPSG4326>は座標変換後の画像ファイルを出力するためのフォルダーです。

既にお分かりのことと思いますが、本資料では、EPSG:102617(9001)→EPSG:4326の座標系変換を行います。

少し長くなりますが、以下のコマンドを実行してみましょう。

gfindコマンドで対象ファイルを特定し、そのファイル名だけを抜き出し、gdalwarpコマンドへ引き渡しています。

gdalwarpコマンドでは、-s_srsで元の座標系(102617)を-t_srsで指定される座標系(4326)へ変換を行うことを指定しています。
-srcnodataでは、元画像の中にある不要なデータのカラーコードを指定しています。同様に-dstnodataで出力時のノーデータを指定しています。

-srcnodataや-dstnodataを指定しなかった場合、画像の繋ぎ目に隙間が生じ、黒く筋が入ってしまうと思います。
座標変換に伴う歪により生じた隙間が黒色で塗潰され、それが隙間となってなって見えている状態になります。

これを除外するために、-srcnodataと-dstnodataを用いて不要なデータ部分を見えなくしているのです

余談・・・画像結合に関して

これだけの画像を準備したのですから、画像結合の話を少しだけ。。。
実は、画像結合してタイル画像を作成する予定だったのですが、マシンの不調とその必要性が無くなってしまったので、余談として記載します。

画像の結合にはgdal_mergeを使用します。

コマンドはこんな感じです。

-a_nodata “255 255 255″を追加した方が良さそうに思います。
環境変数GDAL_CHACHEMAXの値を出来るだけ大きくすると良さそうです。
ちなみに、gdalbuildvrtで仮想ファイルを作成して作業を行う方が効率良いとも思います。

こんな感じでしょうか?
タイル化などにご興味のある方は、別途ご連絡ください。