smellman's Broken Diary

クソみたいなもんです

Mac miniを手に入れた

というわけで、Mac miniを入手しました。

まずはXcodeを入手してからHomebrewを導入しました。

sudo xcodebuild -license
sudo mkdir /opt/homebrew
sudo chown btm:staff /opt/homebrew
cd /opt
curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew

あとは.zshrcを編集して PATH=/opt/homebrew/bin:$PATH を入れてあげればOK。

brew update
brew cask install iterm2

他、Java Web Start+JOSMの起動確認などしました。

openwebstart.com

State of the Map Japan 2020 及び FOSS4G 2020 Japan Online 及び Geoweek and Weekend 2020 を開催したよって話

State of the Map Japan 2020 と FOSS4G 2020 Japan Online が開催されました。

stateofthemap.jp

www.osgeo.jp

僕は両イベントでWebサイトの構築や配信の手伝い、及び発表をしました。

また、プレイベントとしてGeoweek and Weekend 2020を開催しました。

osmfj.github.io

こちらはWebサイトの構築、Discordの準備、当日の司会などいろいろやりました。

まぁ、事後報告なんですが、とりあえず無事乗り切れてよかったです。途中過呼吸になりそうになって危なかったけどw

では、発表内容などを含めて振り返っていきたいです。

日本のコミュニティ向けサーバの現状

speakerdeck.com

まず、State of the Map 2020 Japan では現在構築中...いやリリースをしたサーバの現状について書いています。

リリースをしたのは古いサーバに僕がログインできない上でSSLのエラーが出てあちゃーってなったからです。

本当ならPlanet単位で出してやりたかったのですが、正直いろいろ試行錯誤した結果駄目だったという話になります。

郷古さんからも突っ込まれたけどコミュニティとして運用するなら自宅(実家)サーバはまずいのだと思います。ここは空いているスペック次第ではなんとかなるかも。

しかし、二年間頑張ってリリースしたのが日本の範囲っていうのはちと辛いなぁと思いつつまぁ諦めですね。

Python/Javascriptで読む点群

speakerdeck.com

FOSS4G 2020 Japan Online ではバイナリを読む話をしました。

いちおうスポンサー枠っていうことだったのですが、スタッフをやっているっていうのもあり、完全に「ケツの時間に合わせる」っていう感じでやりました。
あと、スポンサー枠で単にバイナリを読む話ってなんだよ。

内容自体は至ってシンプルなんですが、どうも地理界隈でこの手のプログラミングができる人とできない人の差が激しいのではないかという視点から発表内容を作りました。

まぁ、Javascriptを題材に出したのは仕事で扱ったときにPromiseにしたほうがいいんだろうなーという漠然とした感覚があって、それを実際に実装してみたいっていう感じで選んだっていうのが本音です。ちなみに、仕事の方ではPromise使わなかったぜ。

あとJavascriptでメインスレッドで動いているのかっていう質問があったのだけど、先頭の200〜400バイトぐらい読むだけならメインスレッドで十分ではっていうのがあって、正直何を聞かれてるか理解できなくて適当な回答をしてしまいました。
まぁ、bodyを読むときは考えるだろうけど、正直そんなプログラムはPythonで書きたい(書いてる)のでそこらへんも言及しておけばよかったなぁと思います。

docker-postgis

Geoweek and Weekend 2020 では結構本腰を入れて対応したのがdocker-postgisのmasterビルドパッチです。

元々はMultistage buildの話のはずだったのが、途中でビルドが落ち始めて原因調べたらProjとGEOSの変更でバグってしまってそれをupstreamに報告したりして、最終的にビルドができるようになったっていう話。

いろいろdockerのデバッグ方法のノウハウもついてきたので仕事にも活かしたいなーと思ってる。

翻訳

最後に言及したいのがGeoweek and Weekend 2020でOmegaTを使った翻訳の手順が確立されたってことです。

これはかなり良くて、OSSの翻訳に適用してよいNICTの翻訳エンジンを使って翻訳の爆速化だったり、チームでのワークフローの確立だったり、OmegaTまじで神プログラムになってるなーという印象です。

OmegaTについてはOSMFJの三浦さんが発表をしているので、ぜひ見てほしいです。


OmegaTで、OSM Wikiを快適に翻訳しよう / State of the Map Japan 2020

まぁ、翻訳の方はぼちぼち進めていこうと思います。今日は自転車乗ってるので無理だけどw

macOSでDuke Nukem 3Dを動かしてみる

前回のQuakeに続いてDuke Nukem 3Dを動かしてみます。

まずは公式ドキュメントに沿ってDuke Nukem 3Dのファイルを '~/.eduke32' 以下に作成します。音楽のリッパーとしては cdparanoia を、 wav から ogg への変換を ffmpeg で行います。

mkdir ~/.eduke32
cp /Volumes/ATOMIC15/ATOMINST/DUKE3D.GRP ~/.eduke32
cp /Volumes/ATOMIC15/ATOMINST/DUKE.RTS ~/.eduke32
mkdir ~/.eduke32/music
cd 
cdparanoia -B -- "2-"
for i in `ls *.wav`; do; ffmpeg -i $i -vn -ac 2 -ar 44100 -ab 128k -acodec libvorbis -f ogg `basename $i .cdda.wav`.ogg; done
rm *.wav

ちなみに、ATOMIC EDITIONなのが原因なのかCDDAは一つしか無いのでforを使う必要はないかも。


まず、アプリのビルドをしますが、現在のアプリではEXC_BAD_ACCESSが発生するのでパッチを当てます*1

brew install sdl sdl2 libogg libvorbis flac libvpx luajit
git clone https://voidpoint.io/terminx/eduke32.git
cd eduke32
wget https://gist.githubusercontent.com/smellman/16ea32d274e3da998bebeacf6b52332c/raw/8c3639c7de44572a8579f39247d2fb99bca68a46/eduke32_error_position.diff
patch -p1 < eduke32_error_position.diff
cd platform
./osxbuild.sh --buildppc=0 --build86=0 --build64=1 --debug=0

これで "eduke32/package" に Eduke32.app が完成します。

次に起動についてですが、どうも '~/.eduke32' フォルダを参照してくれないのでとりあえずコマンドラインから起動します。

cd ~/.eduke32
/PATH_TO/eduke32/package/EDuke32.app/Contents/MacOS/eduke32

f:id:smellman:20200906152238p:plain

f:id:smellman:20200906152257p:plain

ところで、SwitchバージョンのDuke Nukem 3D買っていたんですよね...(忘れてた

*1:debugビルドをしてもstripが動いてしまうので、debugの際はGNUMakefileでstripしてるところを削除して、Common.makで無理やり-gオプションをつけてからlldbを実行するとデバッグできます

macOSでQuakeを動かしてみる

実家にてQuakeなどのCD-ROMが出てきました。

f:id:smellman:20200905221423j:plain

今回はQuakemacOSで動くかやってみました。

まずは必要なソフトをインストールします。というか、cdparanoiaがまだ生きてるのに衝撃をうけました。

brew cask install quakespasm
brew install cdparanoia

次に適当な作業用ディレクトリを用意して、そこで作業を行います。まずはCD-ROMからのデータをコピーします。

cp /Volumes/QUAKE106/* .

ここで一回中身を確認します。

$ file *
DEICE.EXE:    MS-DOS executable, LZEXE v0.91 compressed
INSTALL.BAT:  DOS batch file text, ASCII text, with CRLF line terminators
RESOURCE.1:   MS-DOS executable, MZ for MS-DOS, LHa self-extracting archive
RESOURCE.DAT: ASCII text, with CRLF line terminators
SETUP.BMP:    PC bitmap, Windows 3.x format, 400 x 312 x 8
SETUP.EXE:    MS-DOS executable, NE for MS Windows 3.x (EXE)
SETUP.INI:    ASCII text, with CRLF line terminators
SETUP.INS:    COM executable for DOS
SETUP.PKG:    data
_INST32I.EX_: data
_ISDEL.EXE:   MS-DOS executable, NE for MS Windows 3.x (EXE)
_SETUP.DLL:   MS-DOS executable, NE for MS Windows 3.x (DLL or font)
_SETUP.LIB:   InstallShield Z archive Data

RESOURCE.1がLHa self-extracting archiveということなので、これの拡張子をexeにしたものをFinderでコピーして、The Unarchiverで解凍します。

次に音源を取得します。QuakeSpasmではoggに対応しているということなので、cdparanoiaでwave形式に書き直してからffmpegoggを作成します。

diskutil unmountDisk /dev/disk2
cdparanoia -B -- "2-"
for i in `ls *.wav`; do; ffmpeg -i $i -vn -ac 2 -ar 44100 -ab 128k -acodec libvorbis -f ogg `basename $i .cdda.wav`.ogg; done

最後にid1フォルダを作成して、必要なファイルをコピーします*1

mkdir /Applications/QuakeSpasm/id1/
cp RESOURCE/ID1/PAK* /Applications/QuakeSpasm/id1
mkdir /Applications/QuakeSpasm/id1/music
cp *.ogg /Applications/QuakeSpasm/id1/music

あとは実行します。

open /Applications/QuakeSpasm/QuakeSpasm.app

ランチャーが起動するので、とりあえず怖いのでフルスクリーンをオフにします。

f:id:smellman:20200905220154p:plain

起動するとこんな感じになります。

f:id:smellman:20200905220305p:plain

そして犬に殺されます。

f:id:smellman:20200905220346p:plain

さて、せっかくなのでexpansionを入れてみましょう。これまた実家にてMALICEというexpansionがあったので、これを動かしてみます。紙のマニュアルを読むとPowerMacの場合〜っていう項目にMALICEっていうフォルダをまるごとコピーせよと書いてあり、確認したらPAK0.PAKなどがあったのでさくっとコピーをしてみます。

cp -fr /Volumes/MALICE_1011/MALICE /Applications/QuakeSpasm/
cdparanoia -B -- "2-"
for i in `ls *.wav`; do; ffmpeg -i $i -vn -ac 2 -ar 44100 -ab 128k -acodec libvorbis -f ogg `basename $i .cdda.wav`.ogg; done
mkdir /Applications/QuakeSpasm/MALICE/music
cp *.ogg /Applications/QuakeSpasm/MALICE/music

あとはランチャーで引数に "-game MALICE" と入力します。

f:id:smellman:20200905223128p:plain

MALICEが起動します。

f:id:smellman:20200905223222p:plain

ちなみにもう一個あったexpansionのCHASMというのがインストーラの形式がわからずおとなしくDOSでやったほうが良さそうな感じでした。

あと、Hexen2は普通にWindowsアプリっぽいのでおとなしくWindowsでやったほうが良さそうな感じでした(いちおうpakファイルをコピーして試したが動かず)。

さて、明日はDuke Nukem 3Dを試してみよう...

*1:これ、brew caskのアップデートで死ぬんじゃないかという疑問はある

掛川城 3D Tilesを作ったって話

静岡県が公開している点群データの中で掛川城のデータを3D TilesにしてCesiumで表示できるようにしてみました。

Kakegawa Castle on Cesium

f:id:smellman:20200823154530j:plain

今回は実際に行った処理について解説してみます。

利用するツール

  1. lastools
  2. entwine
  3. ept-tools
  4. CesiumJS

点群データのマージ

まずは掛川城オープンデータ化プロジェクト(執筆時に何故か静岡県のサイトから反応がないためG空間情報センターの方にリンクを貼っています)をすべてファイルをダウンロードします。

点群データ(lasファイル)のタイル化自体はentwine及びept-toolsで行いますが、entwineで複数ファイルを読んだ場合と一つのファイルにしてから読んだ場合では後者の方がまともなデータになるので、ひと手間加えて24個のファイルを一つのデータにまとめます。

lasファイルをまとめるにはlastoolsのlasmergeコマンドを利用します。ただ、lastoolsとliblasで同じ名前の実行ファイルがあったりして取り扱いが面倒*1なので、dockerを使って処理をします。

今回は仮に$(HOME)/hogehogeで作業するとします。

cd ~/hogehoge
mkdir merged
docker run --rm -v $(pwd):/working smellman/lastools:latest sh -c 'lasmerge -i /working/*.las -o /working/merged/kakegawa.las'

これで単体のkakegawa.lasが得られました。

EPTへの変換

3D Tilesへの変換を行う前にentwineでEPTというフォーマットに変換をします。

なお、entwine.ioではentwineのみで3D Tilesへ変更できるとありますが、これは古い情報で、現在ではEPTから3D Tilesに変換するためにept-toolsを使うようになっています。

では、entwineで変換をしていきます。

今回は以下のようなスクリプトを動かします。

#!/bin/bash

input=/entwine/kakegawa.las
output=/entwine/kakegawa_output

for i in `seq 16`;
do
  docker run -it -v $(pwd):/entwine connormanning/entwine build -t 10 --subset $i 16 -i $input -o $output --srs EPSG:2450 --deep --scale 0.001
done
docker run -it -v $(pwd):/entwine connormanning/entwine merge -o $output

まず、seqと--subset引数を利用して16個のプロセスに分割をしています。
これはentwine自体が強烈にメモリを消費してしまうため、掛川城のデータを全部処理するとdockerで24GB割り当てても死ぬっていうのが発生するため、だいたい4GBぐらいdockerで割り当てても動くようにしています。

--srs引数はept-toolsで変換するときに参照されるため、必須となります。EPSG:2450は静岡県なので平面直角座標系の8番という感じで指定しています。自分の地域がどの平面直角座標系かは「EPSG 平面直角座標系」でググればだいたい出てきます。

--deepはすべての点群を参照するかどうかを決定します。この引数が無いと処理時間が早くなりますが、どうも出力結果が綺麗にならなかったです。

--scaleは本来点群のヘッダにある値で良いはずなのですが、これを指定しないとEPTの出力の一部がぶっ壊れてしまうので、わざと0.001(1ミリ)を指定しています。ここらへんの仕組みがあまり良くわかってなかったりします。

この処理でだいたい3時間ぐらいかかります。メモリの具合によってsubsetを変えてみるなどしてもよいかと思います。

あと、-tでスレッドの数を指定しているのですが、一つのファイルにマージしてしまうと意味がないっぽい感じがしています...*2

3D Tilesへの変換

最後に3D Tilesへの変換を行いますが、この処理を行うept-toolsはEPSG:2450に対応していないので、対応したものを使います。

cd ~/tools
git clone -b dev/add_proj4_text_for_japanese https://github.com/smellman/ept-tools.git
cd ept-tools
npm i
cd ~/hogehoge/merged
node ~/tools/ept-tools/lib/app.js tile kakegawa_output

なお、前述のentwineで処理が一つでも失敗してるとコケるので注意が必要です。

websiteを作成する

作成したkakegawa_output以下にindex.htmlを以下のようなコードで配置します。


Kakegawa Castle on Cesium

ept-tileset/tileset.json が3D Tilesのエントリポイントとなります。

以上で作成は完了です。

個人的にはPotreeConverterがプロプライエタリになってしまってv1.7のdocker imageはもともと作ってあるとはいえ、ThreeJSと現実の世界をつなげるのは厳しい*3のでCesiumで動くものが作れたのはかなり安心感があります。

*1:macではlastoolsはosgeoのformulaを使わないといけないとかもある

*2:docker stat見てもCPU100%以上にならない...

*3:実装はやってるけど...

spatialiteの現状の私的まとめ

この記事は2020年6月30日付でSpatialiteについて調べたものについて記述しています。なので、情報が古いなと思ったら適当に調べてください。

Spatialiteとはなにか?

SpatialiteとはSQLite3に地理空間情報のカラムや検索機能などを追加するソフトウェア及びSQLite3の拡張機能です。

www.gaia-gis.it

似たようなものではSQLite3に暗号化機能を追加するSQLCipherなどがあります。

Spatialiteの最後の安定版のリリースが2015年に出た4.3.0aで、現在は5.0に向けて開発が進められています。

各プラットフォームでの対応

ざっくりと調べた状況をまとめました。

Windows

Spatialiteの最後の安定版のリリースが2015年ということがあり、公式サイトで配布されているバイナリだとdllが古くてハマることがあるそうです。詳しくはググってください。

Visual Studioを使う場合には以下の選択肢があります。

  1. mod_spatialite
  2. NetTopologySuite.IO.SpatiaLite

www.nuget.org

www.nuget.org

なお、NetTopologySuite.IO.SpatiaLiteはmod_spatialiteのラッパーとして実装されています。

Linux

今回調査の対象外だけどたぶん普通に使える。

macOS

homebrewで使えます。

Android

android-spatialiteが使えると思います。

github.com

iOS

Spatialiteの作者がCocoapods作っていたりしますが、バージョンが4.1.0と古いうえ、geosなどの依存関係があるのにconfigureでgeosなどを切ってるという問題があります。

また、libspatialite-iosというものがありましたが、これも中身のバージョンも依存してるライブラリも古いという問題があります。

そこで、libspatalite-iosをベースにCocoapodsを作れないかと試しています。

github.com

とりあえずmod_spatialite.aが作れるところまでやりました。

ReactNative

android-spatialiteを使ったAndroidのみ対応のものがあるが、Android Xに対応してないバージョンなので作り直したほうがよいかも。

調べてわかったことや感想

  • spatialite自体の開発がgitではなくfossilというものでやっていて、かつ開発者自体がgithubへ移行はしないと名言している
  • fossilでどこで4.3.0aのタグが打たれたのかわからなくて詰んだ
  • spatialite 4.3.0aだといくつかパッチを当てないとproj4 6系以上などが使えない。homebrewのパッチを使うと良さそう
  • 4.1.0あたりではCocoapodsが作られてたりiOS対応したりする人がいたりするのに、なぜかそこらへんが継続されていない
  • 全体的に対応がマチマチな感じがあるのでちゃんと取りまとめしたほうが良さそう
  • fossliきつい...
  • iOSやる気ない感じすごい

読了: Pythonハッカーガイドブック

マイナビから献本していただいたPythonハッカーガイドブックを読みました。

book.mynavi.jp

僕の著書も担当した編集の西田さんからバズらせろという司令が来ていましたが、それは一旦無視するとしてとりあえず感想など。

まず、本書で書かれている内容がすごく幅が広く、いろいろと気づきがあります。
例えば、10章のバッファプロトコルとか9章のHyとか13章のシングルディスパッチャとか、使えるテクニックや単純に面白いと思うものが多く、またマニアックな話題も多いのが特徴です。
Lispの話は青春こじらせた頃を思い出してすごくよかったです。

原著が少々古くPython2とPython3を両方対応しようとしているところからコードがちょっと懐かしい感もあったりしますが、少なくともPython2からやっていた僕にはとてもわかりやすく、個人的にはPython2時代からやってる人におすすめです。

あと、全体的に監訳がしっかりしていて、分かりづらいところへの注記がかなりあってものすごく読むのに助けになります。
寺田さんを紹介してよかったなぁと改めて思いました。

明日から書店での販売及びマイナビでの電子版の発売がされるので、Pythonをより深く学びたいという人は是非読んでみてほしいです。

ってか、献本してもらったけど、手元にほしいから電子版買おうかな...