smellman's Broken Diary

クソみたいなもんです

大熱血!アセンブラ入門読了

今年、東京電機大学*1の「国際化サイバーセキュリティ学特別コース」というものを受講しようとしています。

cysec.dendai.ac.jp

この講義で必要なスキルにi386アセンブラの知識があり、「はじめて読む8086」しか持ってなかったので慌てて「大熱血!アセンブラ入門」を(半額だったということもあり)Kindleで購入しました。

大熱血! アセンブラ入門

大熱血! アセンブラ入門

  • 作者:坂井弘亮
  • 発売日: 2017/09/15
  • メディア: 単行本

総ページ数1167ページという印刷の限界までチャレンジ(坂井さん談)した本著も電子書籍でもダウンロードに時間かかるし、何より中身が濃すぎでめっちゃ読むのが大変ですが、冬休み中という短い期間でもすごく楽しく読めました。

ざっくりいうと「いろんなCPUのアセンブラを比較して読む」という本ですが、それでも「わかりやすそうなCPU」から読んでいくというスタイルなので、だんだんコツがつかめてくるとアセンブラを見るだけで「こういう感じかな」みたいなものが「ぼんやり」と頭に浮かんでくるという、本当に無二の本です。

ちゃんと読んでいたので読み進めていくうちに前半に出てたCPUのアセンブラをだんだん忘れてしまっているような状態にもなるのですが、面白いことに最後の方の脆弱性の章でi386が出てきたときに忘れてたと思ったアセンブラがふわっと出てきて妙な鳥肌が立ちました。

本の難易度としては高め(というか分厚い)のだけど、読んだあとの達成感はすごく良くて、技術書というカテゴリではなく「面白い読み物」という風に読むと良いのではないかなと思います。

ところで肝心のi386の知識は...もうちょっと他の本も読んだほうが良さそうだなという感じなので「はじめて読む8086」を次に読もうかなという感じです。

何度も挫折した本*2だけど、「大熱血!アセンブラ入門」のおかげで読む自信がついたのが嬉しいところです。

というわけで、社会人学生目指していたら50種類ものアセンブラを読んだって話です。そもそも願書の住所を自宅(東京)にしちゃって面接受けられるか怪しいけどな!*3

*1:ちなみに母校ですが、キャンパス的には敵地です

*2:買ったの高校時代なので20年ぐらい挫折してる

*3:問い合わせはこれから

openstreetmap.jpでasia regionをアップしました

tile.openstreetmap.jp

OpenStreetMap Foundation Japanでさくらのクラウドで運用中のタイルサーバで、試しにasia regionをアップしました。

だいぶ雑な北方領土竹島対応をしています。

ちなみに、Ryzen 3400での作成時間は約20日かかりました。長かった...

詳細はこちら。

Japan/OSMFJ Tileserver - OpenStreetMap Wiki

Mapbox GL JS 2.0からオープンソース・ソフトウェアでなくなり、access tokenが必須になりました

クソが!

というわけで、Mapbox GL JSが2.0よりオープンソース・ソフトウェアではなくなりました。

github.com

Mapbox SDK for iOSで起きたことがJavascriptでも発生したという感じです。

何が変わるの?

mapbox.accessToken にアクセストークン(public access token)を埋め込まないといけなくなります。

以下のようなコードを試してみましょう。

<script>
      mapboxgl.accessToken = undefined
      var map = new mapboxgl.Map({
          container: 'map',
          style: 'https://tile.openstreetmap.jp/styles/osm-bright-ja/style.json',
          center: [140, 35],
          zoom: 8
      })
</script>

このコードを実行すると一瞬だけOpenStreetMap.jpのタイルが見えますが、そのあとアクセストークンが正しくないというエラーを吐いて表示されたものが消えます。

最悪ですね!

ちなみに、accessTokenの値はちゃんとAPIアクセスしているので "pk." という文字で騙すこともできません。

最悪ですね!

結論

Mapbox GL JS 2.0により、Mapboxに依存していないインフラを整えていたところもMapboxに依存するようになります。

例えば国土地理院とか国土地理院とか国土地理院とか!

本当に最悪ですね!

アクションカメラ+自転車でMapillary

先日、怪しいアクションカメラを手に入れました。

ちょうどクーポンを使って4000円を切る値段だったので、これを使って自転車で記録を取り、Mapillaryに画像をアップロードしてみました。

まず、GPSロガーを用意します。僕の場合はGarminのInstinct Dual Powerを使っています。

準備としては以下のことをします。

  1. カメラの充電を行う。
  2. カメラの時計とGPSロガーの時計を手動で合わせる*1
  3. カメラのビデオの設定はEIS(手ブレ補正)+4Kが良い*2
  4. カメラを自転車に取り付ける(カメラ付属のパーツでOK)

では、実際にデータを取る手順ですが、以下のようにします。

  1. GPSロガーを有効にします。
  2. カメラの録画を開始します。
  3. 自転車で走ります。
  4. カメラの録画を停止します。
  5. GPSロガーを停止します。

このとき、GPSロガーの有効化とカメラの録画の順番があとで修正するときのポイントになります。

次に、microSDからデータをコピーして作業をします。

まずやらないといけないのが動画の結合です。短い動画だと編集は必要ないですが、長い動画を取ると自動的に分割されるため結合をする必要があります。

今回3つログを撮ったので、以下のようなファイルになりました。

$ ls
FILE201201-094655F.MOV FILE201201-100155F.MOV FILE201201-101918F.MOV FILE201201-102827F.MOV FILE201201-104327F.MOV

このうち、FILE201201-094655F.MOVとFILE201201-100155F.MOV, FILE201201-102827F.MOVとFILE201201-104327F.MOVがセットになります。

では、繋げて行きます。

ls > tmp.txt
cp tmp.txt concat1.txt
cp tmp.txt concat2.txt
vim concat1.txt
vim concat2.txt

concat1.txt の内容を以下のようにします。

file 'FILE201201-094655F.MOV'
file 'FILE201201-100155F.MOV'

あとは ffmpeg でくっつけたり、単にmp4*3に変換したりします*4

ffmpeg -safe 0 -f concat -i concat1.txt 20201201_1.mp4
ffmpeg -i FILE201201-101918F.MOV 20201201_2.mp4
ffmpeg -safe 0 -f concat -i concat2.txt 20201201_3.mp4

次にGPSログをGPX形式で用意します。僕の場合はGarmin Connectからダウンロードしますが、GPX以外のログしかない場合はGPSBabelなどを使って変換をしてください。

ファイル名を整理して、こんな感じになるようにします。

$ ls *.gpx *.mp4
20201201_1.gpx 20201201_1.mp4 20201201_2.gpx 20201201_2.mp4 20201201_3.gpx 20201201_3.mp4

これが今回の入力ソースになります。

次にGPXファイルを編集します。

vim 20201201_1.gpx

GPXの最初のポイントを動画ファイルの最初の時間になるよう調整します。1秒ぐらいの狂いなら問題はないと思います。

f:id:smellman:20201201152458p:plain
GPXの編集

次に Mapillary Tools を導入します。 

github.com

macOSであればzipファイルを展開するだけで動作します。*5
今回は ~/bin/mapillary_tools に保存をしています。

あとはvideo_processingとuploadを行います。処理中にmapillaryの認証がありますのでそこは適当に行ってください。

まずはvideo_processingです。この処理は --advanced オプションをつける必要があります。

~/bin/mapillary_tools video_process --advanced \
  --geotag_source gpx \
  --geotag_source_path 20201201_1.gpx \
  --interpolate_directions \
  --video_import_path 20201201_1.mp4 \
  --user_name smellman \
  --overwrite_all_EXIF_tags \
  --summarize \
  --use_gps_start_time

実行すると mapillary_sampled_video_frames というディレクトリにファイルが生成されます。

この中で特に重要なのが --use_gps_start_time オプションです。このオプションでGPXの時間を開始時間として利用するようになります。

正しく座標が割り当てられたかは実際に地図で見てみる必要があります。macOSならプレビューアプリで参照できます。大まかに目立つ位置が正しく座標がついていれば問題ないです。

あとはアップロードを行います。

~/bin/mapillary_tools upload --import_path mapillary_sampled_video_frames/20201201_1
~/bin/mapillary_tools upload --import_path mapillary_sampled_video_frames/20201201_2
~/bin/mapillary_tools upload --import_path mapillary_sampled_video_frames/20201201_3

以上で終了です。

*1:ちなみに、カメラの時間はどんどんずれていくので毎回合わせる必要がある

*2:1080pだと結構荒くなる

*3:.mov形式でもいけるかもしれないが試してない

*4:このやり方だと重たいのでもっと軽い処理を探した方が良いかもしれない

*5:現在はPython2系なのでLinuxでは注意が必要だと思われます

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を実行するとデバッグできます