2015年6月30日火曜日

GeoGigでGISデータのバージョン管理をする (3)pythonでリポジトリの中を見る

第1回第2回で、GeoGigを使ってデータの登録・更新を試しました。

GeoGigには、geogig-pyというPythonのインターフェースも用意されており、Pythonを使ってリポジトリの操作ができます。今回はこれを使って、前回までに作ったリポジトリの中を見てみます。

事前準備

geogig-pyを使う前に、GeoGigに付属のgeogig-gatewayというプログラムを実行し、GeoGigサーバーを起動しておく必要があります。


リポジトリの取得

Repositoryクラスのインスタンスを作成します。リポジトリ操作は、すべてこのインスタンスを通じて実行します。
from geogigpy.repo import Repository
repo = Repository('C:\\work\\geogig')

ノードの取得

repo.treesで、リポジトリの最上位のノードのリストが拾えます。最初のノードを取得するには、repo.trees[0]を指定します。
node = repo.trees[0]

フィーチャーの取得

node.featuresで、ノード内のフィーチャーのリストが取得できます。
feature = node.features[0]
geom = feature.geom
attrs = feature.attributes

ログの取得

repo.log()で、データセットあるいはフィーチャーのログが取れます。
logs = repo.log(path = 'parks')
logs = repo.log(path = 'parks/1')

ログから更新日時やコミットメッセージなどを取り出すには、次のようにします。
logs[0].committerdate  #更新日時
logs[0].committername  # 更新者
logs[0].message  #コミットメッセージ

今回はここまで。

2015年6月28日日曜日

QGIS付属のpythonにpipをインストールする

QGISには、Pythonコンソールという機能がついており、pythonのスクリプトを実行できます。
このPythonは、WindowsのStandalone Installerでインストールした場合、次の場所にインストールされます。
  • python.exe … <QGISインストールフォルダ>\bin\python.exe
  • ライブラリ類 … <QGISインストールフォルダ>\apps\Python27
QGISコンソールで標準以外のライブラリを使いたいとき、このPython環境上にeasy_installまたはpipをインストールし、ライブラリをインストールすることになります。以下はその手順です。QGISのバージョンは2.8.1(QGIS Wien)を使います。

事前準備

setuptoolsパッケージのサイトから、ez_setup.pyをダウンロードして、任意の場所に置いておきます。


環境変数の設定


まず、コマンドプロンプトを管理者権限で開き、QGIS付属のPythonをコマンドプロンプトで動かすための環境変数の設定をします。
必要なのは、PATHを通すことと、PYTHONPATHを設定することです。

set QGISPATH=C:\Program Files\QGIS Wien
set PYTHONPATH=%QGISPATH%\apps\Python27\Lib;%QGISPATH%\apps\Python27\DLLs;%QGISPATH%\apps\Python27\site-packages;%QGISPATH%\apps\qgis\python
set PATH=C:\Windows\System32;%QGISPATH%\bin;%QGISPATH%\apps\Python27\Scripts

※ここでapps\Python27\Scriptsにパスを通すのは、easy_install.exeがここにインストールされるためです。また、ez_setup.py実行中にcurl使うので、<QGISインストールフォルダ>\binにパスを通しておく必要があります。

setuptoolsのインストール

ダウンロードしたez_setup.pyを実行すれば、easy_installをインストールできます。
python C:\Users\xxxxx\Downloads\ez_setup.py

pipのインストール

easy_installでpipをインストールします。
easy_install pip
これで、pipはまたはeasy_installを使って、他のライブラリをインストールできるようになります。

2015年6月19日金曜日

WMTS配信を使って地理院タイルをQGISで表示してみる

地理院タイルのWMTSメタデータ提供実験が始まったのを受けて、これをQGISで表示させてみます。

まず、「WMS/WMTSレイヤの追加」アイコンをクリックします。

 「WM(T)Sサーバからレイヤを追加」ダイアログで、画面上部の「追加」ボタンを押下します。


「新しいWMSコネクションの作成」ダイアログで、次を入力してOKを押下します。
  • 名称は適当につけます。
  • URLは"http://gsi-cyberjapan.github.io/experimental_wmts/gsitiles_wmts.xml"を指定します。
  • 「軸方位を無視する」にチェックを入れます。


「WM(T)Sサーバからレイヤを追加」ダイアログに戻り、「接続」ボタンを押下します。


レイヤの一覧が表示されるので、表示したいレイヤを選択して(ここでは「標準地図」を選択)、「追加」ボタンを押下すると、選択されたレイヤが追加されます。

レイヤが追加されたところ。

2015年6月12日金曜日

QCon Tokyo 2015に行ってきた

もう1か月半以上前のことになってしまいましたが、4月に今年のQCon Tokyoに初めて参加してきました。

申し込み後、請求書とか送られてきて、「そうか、会社が費用を負担して仕事の一環として行かせるのが普通なのか」と思いつつ、自分は好き勝手やりたいので、費用は全部自腹でしたし、休暇をとって参加しました。


聴講したセッションの内容

プログラムはこちら

Keynote 1:マイクロサービスの実現に必要なのは、多くのコンピュータと新しい企業カルチャー!

そもそもマイクロサービスって何よ?ってところから始めなければなりませんでした。要は、一つのアプリケーションを細かなサービスに分割して、それぞれを独立して稼働させるということなのですね。

細かく分けることによって、それぞれのサービスのリリースサイクルを回しやすくなるというメリットがありますが、実はそれ以上に、小さなチームに分割することによって、コミュニケーションコストを抑えるという隠れた効用があるようです。アプリケーションが成長すると、どうしてもチームメンバーが増え、意思疎通が難しくなりがちですが、分割によってチームを小さく保ち続ける、と。ただし、実装と同様、チームも常に改良を続けていく必要があり、チームの見直しのサイクルも回せ、とのこと。

Keynote 2:脳を模倣して人間のような知能を作る

超ざっくり言えば、「脳の機能を機械学習のアプローチで実現しよう」ということのようです。脳というのは、たかだか50個程度の領野のネットワークで機能しているのだそうで、それぞれの領野はそれほど難しい処理はしていないのだとか。
全脳アーキテクチャ勉強会も面白そうです。BESOMも要チェックです。


ScalaによるMonadic Programmingのススメ

正直ついていけず。並行処理によってプログラムのパフォーマンスを向上させるには、Functional Reactive Programmingという概念を習得する必要があり、今後はこれが主流になるとのこと。そのためには、モナドを使いこなせることが大事だとか。うーん、難しい…。


Go言語の可能性と開発事例

golang初めて見ました。「C++でプログラム書くのかったるいから新しい言語つくったった」というところに、Googleの文化を垣間見ました。GoroutineとかChannelとか、わからない概念がいくつかありましたが、それは実際使うときになったらおいおい勉強するということで。

トリプルストア、RDF、SPARQL:今勉強しないと遅れますよ!

この辺は昔セマンティックウェブの文脈で少しかじったことがあったのですが…。最近では、セマンティックウェブというよりは、オープンデータの文脈でこの辺の話が再燃してきているのでしょうか。話が早くてついていけなかったので、もう一度スライドを見直して勉強せねば。
聴講中に見つけた参考サイト:「RDF入門


雑感


会場とか進行のしかたなんかは他のイベントや勉強会とそれほど変わらないのですが、明らかに違っていたのが、参加者のレベルでした。英語の講演に対しては当たり前のように英語でガンガン質問を飛ばしてきますし。そういうわけで、技術の最先端を追いかけられるという意味でも素晴らしいイベントだったのですが、質の高い参加者に自分がどれだけついていけているかを確認する意味でも、参加する価値がありました。
たぶん来年も参加します。

2015年6月10日水曜日

QGISにコマンドバーを付ける

このツイートを見て、QGISのCommand Bar Pluginの存在を知りました。
https://twitter.com/madmanwoo/status/607845208928043008

プラグインをインストールするには、QGISの「プラグイン」ウィンドウ(メニューから「プラグイン」⇒「プラグインの管理とインストール」を選択すると開きます)で、"Command Bar"を選択して「プラグインをインストール」ボタンをクリックします。





インストールすると、QGISの画面下部に小さなコマンドバーが表示されるようになります。

Ctrl+;(セミコロン)でコマンドの一覧を表示できます。コマンドの数は、ざっと見た限り25個くらいと少ないです。指定のレイヤーの属性テーブルを表示したり、アクティブレイヤーにポイントフィーチャーを追加したりできるようです。
自分でコマンドを作れるようで、既存のコマンドを活用するというよりは、便利なコマンドを自分で作って使えるところにこのプラグインの価値はあるのかなと思います。

2015年6月9日火曜日

C#のFileSystemWatcherでファイル監視が効かなくなることがある話

C#で特定のファイルに対する変更を監視するのに、System.IO.FileSystemWatcherを使うことがあるかと思いますが、そのときに気を付けるべき点がありそうです。

以下は、C:\work\test.txtというファイルの削除を監視するサンプルコードです。
(Visual Studio Express 2013 for DesktopとNET Framework 4.5で検証しています)
FileSystemWatcher watcher
  = newFileSystemWatcher(@"C:\work", @"test.txt"); 
watcher.WaitForChanged(WatcherChangeTypes.Deleted); 
System.Console.WriteLine("File has been deleted");

このプログラムは、実行前に対象のファイルが存在し、その後変更が加えられない場合には正しく機能しますが、あとからこのファイルを作成したり、このファイルを同名のファイルで上書きしてしまうと、ファイルの削除を検知できなくなります。

このような状況でもきちんと機能させるには、WaitForChanged()を使うのではなく、イベントハンドラーを使って非同期処理を行う必要があります。
FileSystemWatcher watcher =  
   new FileSystemWatcher(@"C:\work", @"test.txt");
watcher.Deleted += (sender, eventArgs) =>
{
    System.Console.WriteLine("File has been deleted.");
};
watcher.EnableRaisingEvents = true;

2015年6月8日月曜日

runnableでプログラミングの勉強がはかどりそうな件

何か新しいプログラム言語を勉強し始めるとき、まず面倒なのが、実行環境をダウンロードしてインストールしなければならない点だと思います。特にWindowsユーザーだと、pythonとか標準で入ってるわけではないですし、C/C++もVisual Studio Expressなどをダウンロードしてインストールするのは結構時間がかかるものです。

そういうときに便利そうなのが、runnableというサイトです。これは、オンラインでプログラムを書いて、そのプログラムをオンラインで実行してくれるサービスです。

runnableのトップ
使い方は簡単で、runnableのトップページから言語を選択すると、その言語のプロジェクトが作成され、ソースコードの編集画面に切り替わります。

Javaプロジェクト

ここでソースコードを編集し、"Save and Run"を実行すると、ビルドされ、実行結果が別ウィンドウで表示されます。
Javaプログラムの実行結果

ユーザー登録すると、作業中のプロジェクトを保存できたり、プロジェクトを他のユーザーに公開できるようになるみたいです。

対応している言語が多く、JavaやPythonはもちろん、djangoとかRuby on Railsなんてのもありますし(さすがにデータベースは自前で用意するんでしょうかね)、bashなんてのもあります。今までシェル芸の勉強はAWSでLinuxの仮想マシンを立ててsshでログインして使っていたのですが、runnableを使えば簡単に実行環境を手に入れられるので、勉強がはかどりそうです。