ビルドツール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で%のような指定はどうするのか調べる必要があります.(あまり正しい使い方ではない気もしますが…)
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でしょうか.
設定は以下のような感じ.
今回はVisualStudioのプロジェクトファイルからビルドを行います.プロジェクトファイルは自動検出されますが,複数のファイルがあるとエラーが出ます.cmakeによって複数のプロジェクトファイルが生成されてしまうので,どれを用いてビルドを行うのか指定する必要があります.
また,Before build Scriptの項目からcmakeを走らせるコマンドを記載しておきます.WindowsPowerShellも使えるようですが,僕は使ったことがないのでcmdです.
Artifacts設定
成果物のアップロードはArtifactsで設定します.PATH TO ARTIFACTで指定したディレクトリ以下がzipで固められます.glslangはmake installでinstall以下に成果物がまとめられるのですが,VSのプロジェクトファイルからビルドするとそれぞれのディレクトリに成果物が分かれてしまいます.成果物それぞれを指定するのも面倒ですし,とりあえずbuildディレクトリ以下を全てアップロードするようにしてしまいました.
ちなみにルートディレクトリはC:\projects\project-name\になります.
Test設定
glslangにおけるテストスクリプトはWindowsではそのまま動かないようなので動かしていません.
テストは自動検出もされるようですが,VisualStudioにおけるテストがどのように実行されるかはわからないので何もしていません.
成果物の取得
AppVeyorの実行は手動でも行うことができます.
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としてソフトウェアを置きます.mavenやrpmなど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でテストが行われた後にデプロイすることができます.
おわり
今回は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を使用しました.
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するには,設定ファイルをいじる必要があるみたいです.ファイルのいじり方は分かりません.
emacs,emacs-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-emacsでemacsを起動し,emacs-liveのディレクトリにあるinit.elを開き,M-x eval-bufferで全部読み込むとemacsがemacs-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処理系の再インストールが必要でした。
rootログイン禁止
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周りが色々面倒くさそうですが、少しずつ勉強していくしかないですね。
gnupack EmacsのDoing Vfork: resource temporarily unavailableを解決する
ノートPCに最新のgnupackのEmacsをいれました。しかし、diredやshell-modeを使おうとするとDoing Vfork: resource temporarily unavailableと表示され、使えない問題があり困ったので解決する方法のメモです。デスクトップの方にインストールしたときは普通に使えたのでよくわかりませんね。
イッチョカマーの徒然草: Cygwin+Emacs Problem
基本的にはこのサイトの通りに、rebaseallしてlibncursesを再インストールでいけるみたいです。少し補足が必要なので記載しておきます。
1
gnupackフォルダにstartup_rebaseallが存在するので、実行します。多分右クリックで管理者として実行する必要があります。rebaseallが何をしてくれているのかは不明。ちょっと調べましたけど実行しろとしか書かれていませんね…
2
次にcygwinのHPからcygwinのsetupファイルをダウンロードします。
Cygwin Installation
どうやらgnupackは32bit版を使用しているようですのでそれダウンロードしたら起動し、rootディレクトリをgnupack\cygwin\cygwinに設定してlibncursesを再インストールします。rootディレクトリの設定が間違っていなければ、自動的にインストール済みライブラリなどが認識されるとはずです。もしもディレクトリ指定が間違っているとそこに新たにcygwinがインストールされてしまうので注意が必要です。
終わり
これで恐らくエラーが消えます。