インドラの真珠の紹介

この記事はMath Advent Calendar 16日目の記事です.
www.adventar.org
僕は二年ほど前に自分でフラクタルを描きたいと思っていた時,大学の図書館でインドラの真珠という書籍に出会いました.
インドラの真珠: クラインの夢みた世界
2002年に出版されたIndra's Pearlsという書籍の邦訳です.表紙が目に入ってこれだと思いました.以来,クライン群に関するグラフィクスを描画したり,関連事項を勉強するなどしています.
tumblrに少しだけまとめてあるので興味があればご覧ください.
Kleinian groups
円や球が連なるようなものや,らせん状のねじれが特徴です.

インドラの真珠は双曲幾何学の分野におけるクライン群を可視化するということに重きを置いた書籍です.一応行列から解説してくれるので,基本的なプログラミングの知識と,高校数学の知識があれば一応読み進めていけるようになっています.
ただし数学を勉強している人にとっては数学的に厳密な話は少し足りないようです.

僕も一応全て読みましたが,理解の至らないところは多く,この本に載っている全ての図を描画できたわけではありません.日々精進あるのみですね.
図に興味を持った方は手に取ってみてはいかがでしょうか.

ビルドツールninjaのスクリプトを書いてみたメモ.

Ninja, a small build system with a focus on speed
素早いビルドが可能と話題のninjaを試してみました.しかし,僕自身巨大だったり,クロスプラットフォーム対応だったりするC++プログラムを書いたことがないので,実際の運用というのがいまいちわかりませんね…

参考にしたのは以下のエントリです.
ninja build tools使い方メモ - 北海道日記
Wonderlands in Usagi's brain: さすがNinja素速い…(気がする)

手に入れる

Releases · ninja-build/ninja · GitHub
GitHub releasesで取得します.zipファイルを解凍すればninja.exeが手に入ります.

スクリプトを書く

VCのコンパイラを用いてARToolKitを用いたプログラムをビルドするスクリプトを書いてみました.コンパイラ,リンカをフルパスで指定しているのは良くないと思うのですが,あらかじめパスを通したclが64bit版であり,32bit用にビルドされたライブラリであるARToolKitを使用するために32bit版clを使用するためです.

compile_command = cl
compile_options =
link_command    = link
link_options    =
libs            = libAR.lib libARgsub_lite.lib libARgsub.lib libARgsubUtil.lib libARMulti.lib libARvideo.lib
cl_dir          = c:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin

rule compile
  command =  $cl_dir\$compile_command $compile_options $in $libs

rule link
  command = $cl_dir\$link_command $link_options $in $libs

build main.obj  : compile main.cpp
build main.exe  : link main.obj

build.ninjaという名前で置いておき,ninjaを実行すればビルドが走ります.
make cleanに値するものはninja -t cleanで行えます.

TODO

  • 複数ファイルの指定はどうするか.

例えば,同じディレクトリにある.cuファイルすべてを用いてnvccでビルドするmakefileは以下のようになります.

main.exe: main.obj
	nvcc -arch=sm_30 -lglew64 -lglut64 -lAntTweakBar64 -o $@ $^
%.obj: %.cu
	nvcc -arch=sm_30 -dc $^ -o $@
clean :
	rm *.obj

存在するすべてのファイルに対してbuild hoge.obj : compile main.cppなどと書くのは面倒です.ninjaで%のような指定はどうするのか調べる必要があります.(あまり正しい使い方ではない気もしますが…)

  • ライブラリファイルの指定が微妙な気がする.
  • Linux+gcc用の記述を追加してみる.

AppVeyorで自動デプロイを試したメモ

AppVeyorはWindowsのための継続的デリバリーシステムです.ビルド,テスト,デプロイまで行えるようです.GUIによる設定がわかりやすく,あまり迷うことはないと思います.
Continuous Integration and Deployment service for Windows developers - Appveyor
AppVeyorについては以下の記事が非常に参考になります.
AppVeyorを使ってCI環境構築してみた - 亀岡的プログラマ日記
前回(travisCI + Bintrayによる自動デプロイを試したメモ - 心鏡曼荼羅)同様glslangをデプロイしてみます.

ビルド

windowsでのビルドはcmakeを走らせた後にVisualStudioのプロジェクトファイルが生成されるのでそれを用います.ALL_BUILD.vcxprojからglslangに含まれる全てのものをビルドすることができます.
ちなみにwindowsでglslangValidatorを動かすにはVS2015のランタイムコンポーネントが必要です.
Download Visual Studio 2015 の Visual C++ 再頒布可能パッケージ from Official Microsoft Download Center

AppVeyorの準備

GitHubアカウントでログインした後はNew Projectからプロジェクトをインポートします.GitHubの他にもBitBucketなどからもインポートできるようです.
その後はSETTINGから設定を行います.どうやらymlファイルでも設定を記述できるようですが,今回はGUIから設定していきます.

Build設定

とりあえずいじる項目はBuildでしょうか.
設定は以下のような感じ.
f:id:soma_arc:20151204155125p:plain
f:id:soma_arc:20151204155132p:plain
今回はVisualStudioのプロジェクトファイルからビルドを行います.プロジェクトファイルは自動検出されますが,複数のファイルがあるとエラーが出ます.cmakeによって複数のプロジェクトファイルが生成されてしまうので,どれを用いてビルドを行うのか指定する必要があります.
また,Before build Scriptの項目からcmakeを走らせるコマンドを記載しておきます.WindowsPowerShellも使えるようですが,僕は使ったことがないのでcmdです.

Artifacts設定

成果物のアップロードはArtifactsで設定します.PATH TO ARTIFACTで指定したディレクトリ以下がzipで固められます.glslangはmake installでinstall以下に成果物がまとめられるのですが,VSのプロジェクトファイルからビルドするとそれぞれのディレクトリに成果物が分かれてしまいます.成果物それぞれを指定するのも面倒ですし,とりあえずbuildディレクトリ以下を全てアップロードするようにしてしまいました.
ちなみにルートディレクトリはC:\projects\project-name\になります.
f:id:soma_arc:20151204161449p:plain

Test設定

glslangにおけるテストスクリプトWindowsではそのまま動かないようなので動かしていません.
テストは自動検出もされるようですが,VisualStudioにおけるテストがどのように実行されるかはわからないので何もしていません.

成果物の取得

AppVeyorの実行は手動でも行うことができます.
f:id:soma_arc:20151204154551p:plain
f:id:soma_arc:20151204154648p:plain

終わり

AppVeyorはビルドからテスト,デプロイまでできるのが便利ですね.
しかし,今回はテストのスクリプトが動かせませんでした.また,本来は成果物のみを取り出したいのですが,MSBuildの結果,ばらけてしまったため,buildディレクトリ自体をアップロードするようにしてしまいました.ここら辺はきちんとした設定が必要ですね.
自分のリポジトリではないのでしょうがないのですが,全てのプラットフォームにおいて継続的デリバリーを行うには特にWindowsに気を使う必要がありますね.

travisCI + Bintrayによる自動デプロイを試したメモ

Bintrayはソフトウェア配布のためのサービスです.これを利用して,travisCIを使ってテストを行った後に自動でデプロイできるような仕組みを構築します.
今回デプロイしようとするソフトウェアはこれです.
KhronosGroup/glslang · GitHub
GLSLのリファレンスコンパイラです.BSDライセンスで配布されています.こちらをフォークしてテストを回し,デプロイしてみます.

ビルドしてみる

まずはこちら側でビルドしてテストを行ってみます.Linux環境の場合はSetupLinux.shを実行するだけです.ビルドにはC++11が動くコンパイラとbisonというパーサジェネレータが必要です.windowsの場合はリポジトリに最初から含まれているbison.exeでも良いはず.windowsの場合,cmakeを走らせた後にVisualStudioのプロジェクトが生成されるのでそれを用いてビルドします.テストはTestディレクトリに移動した後にruntestsを実行します.シェルスクリプトっぽいのでコマンドプロンプトでは動かないみたいです.

Bintrayの準備

Bintrayの概要については以下の記事等が参考になります.
GradleでBintrayにアップロードする手順 - Qiita
Bintray - Download Center Automation & Distribution w. Private Repositories
Bintrayはアカウントの下にいくつかのタイプのリポジトリが存在し,その下にPackageとしてソフトウェアを置きます.mavenrpmなど6種あります.今回はどれでもないので最初からあるgenericを使います.
GitHubアカウントでログインした後はOwned Repositoriesからgenericを選択し,Import from GitHubから使いたいリポジトリを選択します.これで,Bintray上にPackageが作成されます.
また,後で使用するのでEdit your profileからAPI Keyも確認しておきます.

travisCIで自動テストを回す.

travisCIのテスト環境はUbuntuらしいのですが,デフォルトではc++11が使えるgccが入っていません.そこでgccをアップデートする必要があります.
c++ - Travis CI with Clang 3.4 and C++11 - Stack Overflow
上記の回答を参考にします.新しいgccを入れた後はパスの設定も変更しなければcmakeが新しいgccを用いてビルドしてくれません.今回はg++4.8.1を入れます.
自動テストを回す.travis.ymlは以下のようになりました.

sudo: required
language: cpp
compiler:
    - gcc
script:
  - ./SetupLinux.sh
  - cd Test
  - ./runtests
before_install:
  # g++4.8.1
  - if [ "$CXX" == "g++" ]; then sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test; fi
  - sudo apt-get update -qq
install:
  # g++4.8.1
  - if [ "$CXX" = "g++" ]; then sudo apt-get install -qq g++-4.8; fi
  - if [ "$CXX" = "g++" ]; then export CXX="g++-4.8"; fi

sudoが必要なければキャッシュが使えるのですが,sudoなしにする方法はわからないのでこのままです.これでテストは回るはずです.

Bintrayへの自動デプロイ

次に,Bintrayへのアップロードを行う処理を記述していきます.
Bintray Deployment - Travis CI
公式の手順に従います.genericへのアップロードは以下のようにcurlでも行えるようですが,travisが指示する方法が良いと思います.

curl -T <FILE.EXT> -usoma-arc:<API_KEY> https://api.bintray.com/content/soma-arc/generic/<YOUR_COOL_PACKAGE_NAME>/<VERSION_NAME>/<FILE_TARGET_PATH>

bintrayのAPIキーをtravis encryptで暗号化して.デプロイ用の記述を追記します.

deploy:
  provider: bintray
  file: "/home/travis/build/soma-arc/glslang/bintray.desc"
  user: "soma-arc"
  key: $BINTRAY_API_KEY
env:
  secure: "hogehoge"

fileにはbintray用のdescriptionファイルを指定します.ここにデプロイ用の情報が記述されます.拡張子をどうしたら良いかわからなかったので,bintray.descにしておきました.
上述のURLに記載されているテンプレートを埋めて作成します.あらかじめbintrayにパッケージを作っていれば最小の構成は以下のようになると思います.

{
    "package": {
        "name": "glslang", // Bintray package name
        "repo": "generic", // Bintray repository name
	"subject": "soma-arc"
    },
    "version": {
        "name": "0.1"
    },
    "files":
        [
        {"includePattern": "/home/travis/build/soma-arc/glslang/build/install/bin/(.*)", "uploadPattern": "bin/$1"},
	{"includePattern": "/home/travis/build/soma-arc/glslang/build/install/lib/(.*)", "uploadPattern": "lib/$1"}
        ],
    "publish": true
}

filesでアップロードするディレクトリを決めています.ここはRuby正規表現で指定するようです.SetupLinux.shを実行した後はglslang/build/installに成果物がまとめられるので,そこを指定してやればその中身がアップロードされます.
以上の作業を行うことでtravisCIでテストが行われた後にデプロイすることができます.
f:id:soma_arc:20151204132956p:plain

おわり

今回はtravisCIとBintrayでビルド済み成果物をデプロイすることを試しました.
バージョンの指定方法について.gitHubでのタグとの関連,タグ打ちやバージョンの番号に関する話はいつか勉強しないといけませんね.また,バージョンが上がるたびに手動でdescriptionファイルをいじるというのも面倒な話です.そこらへん,実際に運用するにはどうするのか,調べる必要があります.実際に使っている人のリポジトリの設定ファイルを見るのが近道なのでしょうか…
また,travisCIは新しい事を試そうとするには何度も.travis.ymlをリポジトリにプッシュする必要があります.非常に面倒くさい上,履歴も汚れるので,よろしくありません.そろそろCircleCIも試したいところです.
同様のデプロイをWindows用にAppVeyorでも試したので次の記事にします.

Spinnakerを試したメモ

継続的デリバリーのためのシステムであるSpinnakerを試したメモをまとめておきます.
今回はGoogle Compute Engineを使用しました.
Spinnaker: Getting Started
基本的には公式サイトのGetting startedに従います.AWSでのセットアップも載っているので見た感じ面倒くさそうですが思っていたよりも簡単でした.

インスタンスの準備

指示されているAPI(Compute Engine APIとCompute Engine Autoscaler API)を有効にした後,google cloud launcherを用いることで簡単にインスタンスを用意する事ができます.
Cloud Launcher — Google Cloud Platform
Launch on Google Cloud Platform ボタンから順にたどっていけば構築で迷うことはないと思います.インスタンスの起動からspinnakerのインストール,起動を自動で行ってくれます.
この後の操作はspinnakerのサイトにはあまり書かれていませんが,cloud launcherで指示されます.

Google Cloud SDKのインストール

次にGoogle Cloud SDKがなければ入れておきます.Google Compute Engineとやりとりするコマンドラインツールが提供されます.
インストールした後はgcloud initコマンドで使用するgoogleアカウントの設定などを行います.windowsの場合はGoogle Cloud SDK shellは管理者として実行する必要もあると思います.
sshの鍵がない場合は自動的に生成プロンプトが表示されます.

Spinnakerへの接続

あとはGoogle Cloud SDK shellからsshで接続します.コマンドは以下の通りです.

gcloud compute ssh spinnaker-test --ssh-flag="-L 8084:localhost:8084" --ssh-flag="-L 9000:localhost:9000" --ssh-flag="-L 8087:localhost:8087"

spinnaker-testの部分は自分で決めたインスタンス名です.他にも方法があるようですが一番簡単そうなのがこのやり方です.
ただし,windowsの場合はこのままでは動きません.以下の記事で対応策が紹介されています.
NETFLIXのSpinnakerをさわってみた備忘禄 - ゆるふわカウンターアタック

gcloud compute ssh spinnaker-test --ssh-flag="-L" --ssh-flag="8084:localhost:8084" --ssh-flag="-L" --ssh-flag=" 9000:localhost:9000" --ssh-flag="-L" --ssh-flag="8087:localhost:8087"

-Lはポートフォワーディングのオプションです.初めて使いましたが,特定ポートへのアクセスを別のコンピュータの特定ポートへと送る機能だそうです.
SSH ポートフォワーディング
後はブラウザを開きlocalhost:9000にアクセスするとspinnakerのロゴが表示されたページが出るはずです
僕の環境のFireFoxでは先に進めなかったのでChromeを使用しました.

実行

公式のGetting startedにしたがってデリバリーのパイプラインを作り,実行します.
うまくいけば,Google Developers Consoleからinstance groups,VM instancesの下に新しいインスタンスが設定した分だけ起動されているのが確認できるはずです.

テストが終わったら,起動したインスタンスを止めておくのを忘れずに.こちらもspinnakerのコントロールパネルからできます.また,spinnakerのインスタンスを止めて再起動した後もspinnakerは自動的に起動するようです.

Clojure環境の構築からshadertoneを試してみるまでのメモ

github.com
Shadertoneで遊んでみた – 導入編 | yoppa org

shadertoneを動かしてみました.Clojure環境ないしwindowsだしで苦労したので,Clojure環境構築からメモしておきます.OSはwindows8.1です.

JDKの用意

まずJDKを用意します.理由は後述しますが,32bit用を使います.JDK7でもJDK8でもあまり変わりはないように思います.
Java SE Development Kit 8 - Downloads
インストール先はパスに空白のない方が良いみたいな話もありますが実際のところは分かりません.僕は一度嫌な思いをしたことがあるので,デフォルトから変えています.

Leiningenをインストール

ライブラリ等を管理してくれるLeiningenを入れます.
leiningen-win-installer
windowsインストーラを使ってインストールできます.インストール時に複数JDKがある場合は選択させられます.ちなみに,インストール後は.lein以下にあるconfigure-leiningen-installerを動かすことで使用するJDKを変えることができます.

overtone, shadertoneを試す

overtone, shadertoneが動くか試します.
このリポジトリのものがシンプルな構成で試すことができます.
rogerallen/sot · GitHub
コマンドプロンプトでこのプロジェクトのルートに移動し,以下のコマンドを打ちます.

lein deps
lein run

lein depsでproject.cljに記述された依存関係にあるライブラリが自動的にダウンロードされます.lein runで画面が表示され,音と共に色が変わるのが確認できればokです.

このとき引っかかったのが,overtoneの環境です.overtoneは後ろでSuperColliderが動いているらしいのですが,overtone.liveでcan't connect to native serverのようなエラーが出ます.このnative serverの部分のライブラリがJDK 32bitでできているせいか,64bit版のJDKでinternal serverを動かすことができず,これに気付くのにかなり時間がかかりました.
ちなみに,SuperColliderを手でインストール,起動してconnect-external-serverで接続することもできますが,overtone.liveをuseするには,設定ファイルをいじる必要があるみたいです.ファイルのいじり方は分かりません.

emacsemacs-liveの準備

とりあえず動くことがわかったので,shadertoneのサンプルをいじってみましょう.そのためにはエディタが必要です.エディタにはemacsを使います.また,今回はライブコーディング用にチューンされたemacs-liveを使用します.これを使えば簡単にciderに加え,paredit(S式単位でのコードの編集,移動を扱う拡張)やauto-complete等の機能が使えます.普段使いにはどうなのかわかりませんが,とりあえずClojure書いてみたいという人にはすぐに環境が揃ってよいかも.

まず,.lein以下にあるprofile.cljを編集し,

  :plugins [[cider/cider-nrepl "0.9.1"]
           [refactor-nrepl "1.1.0"]]
  :dependencies [[org.clojure/tools.nrepl "0.2.7"]]

を追記します.

こちらの環境はwindowsなので,公式に書かれているemacs-liveの導入は,あまり参考にならないかもしれません.
以下は僕がやったやり方です.
まずはemacsのバイナリを落としてきます.
Index of /pub/gnu/emacs/windows
emacs-24.5-bin-i686-mingw32.zipを落として展開します.
次にemacs-liveをダウンロードするなり,クローンするなりします.
overtone/emacs-live · GitHub
bin/run-emacsemacsを起動し,emacs-liveのディレクトリにあるinit.elを開き,M-x eval-bufferで全部読み込むとemacsemacs-liveに変身します.
もしも,既にemacsを使っていて,なんらかの設定がされていれば,その内容によっては,正しくemacs-liveの機能が使えない場合があります.emacs-liveしか使わないのであれば.emacs.dにemacs-liveフォルダの中身を全部突っ込んでも良いかもしれません.
僕は試していませんが,他の環境と競合しないので,gnupackをダウンロードして.emacs.dに突っ込んでしまう方法でもよいかもしれません.

shadertoneのサンプルを試す

overtone/shadertone · GitHub
shadertoneのリポジトリをダウンロードするなり,クローンするなりしたらexample/00demo_intro_tour.cljを開き,M-x cider-jack-inします.
あとはC-c C-eでコードを評価していくだけ.結構楽しいです.
それと,僕が試した限りだと,(def snare (sample (freesound-path 26903)))等はダウンロードがタイムアウトして全て使えませんでした.自分で用意する必要があるかも.

感想

結構楽しいし,何か作りたいとは思いますが,僕の環境では不安定で,すぐ落ちます.overtoneが悪いのか,shadertoneが悪いのかはわかりませんが,このままだとパフォーマンスなんかには使えそうにもありませんね…
あとメモリも1GB以上は食うみたいですね.僕のノートPCは4GBしかメモリがないのですが,StackOverflowで落ちたりもしました.
安定化しないかもう少しいじってみる予定ではありますが,今後の開発に期待でしょうか…
現在,ライブコーディングの作品を作ろうとしているのですが,今回は音楽が中心なので,映像はquilにやってもらう方が良いかなぁと思っています.

自動デプロイをちょっとセキュアにしたメモ

前にやったTravis CIでの自動デプロイを少しだけセキュアにしたのでメモしておきます。

sshのポート変更

CentOS 7 で sshd のポートを変更する(firewalld, SELinuxの設定) | CentOS | daily memorandum 3.0.0
SELinuxの設定変更という部分は無視して、この記事と通りに従えば大丈夫です。
途中firewall-cmdがfirewalld-cmdになっていますが、おそらくミスですね。

ユーザー作成

ルートのログイン禁止をする前にユーザーを作成します。
CentOS で root 権限を持ち、sudo を実行できるユーザーを作成する | Webセキュリティの小部屋
sudoのパスワード入力要求はつけておきました。ユーザーを作成した後は、rosコマンドは使えたのですがlisp処理系の再インストールが必要でした。

sudo時にPATHを引き継ぐ

サーバーの起動にはsudoが必要みたいなのですが、sudoするとPATHがリセットされてしまうようです。roswell等々が使えなくなるので設定を行います。
Linux - sudo時にPATHを引き継ぐ方法 - Qiita

.travis.ymlの編集

sshの接続先ポートという環境変数が増えたので、前回の記事と同様に暗号化して追加します。
Travis CIでCommon Lisp Webアプリを自動デプロイするメモ - 心鏡曼荼羅
デプロイ用のスクリプトはsudoをつけて実行する必要があるのと、ポートの指定が必要なのでコマンドを編集します。

after_success:
    - if [[ "$TRAVIS_BRANCH" == "master" ]]; then
        export SSHPASS=$DEPLOY_PASS;
        sshpass -e ssh -t -t -p $DEPLOY_PORT -o "StrictHostKeyChecking"=no $DEPLOY_USER@$DEPLOY_HOST "echo ${DEPLOY_PASS} | sudo -S ${DEPLOY_PATH}/deploy.sh" 1>/dev/null 2>/dev/null;
      fi

sudoには、パスワードが必要なので-Sオプションをつけてechoで渡します。ここらへん、本当にセキュアか怪しいですね…特定コマンドのみsudoのパスワードなしができるみたいなので、こちらの方が良いかもしれません。
特定のコマンドをパスワードなしでsudo する設定 - Slow Dance

文字列中に変数を繋げるためには${}で囲む必要があるみたいですね。
シェルスクリプトで変数を繋げる
シェル・スクリプト・リファレンス - 【 複数の変数を連結する 】:ITpro

また、sshした先でsudoを使用するには色々あるみたいで、とりあえず-t -t オプションをつけておけばよいみたいです。
SSHで「-t」オプションを付けても、失敗するときの対処法 : 元うなぎ屋

終わり

少しだけセキュアにしました。ポート変更前は結構攻撃のログが残っていたのですが、変更だけで攻撃は見られなくなりました。sudo周りが色々面倒くさそうですが、少しずつ勉強していくしかないですね。