ssssをgolangに移植してみた
この記事は、Go2 Advent Calendar 2018の9日目の記事です。
以前、ssssを使った秘密分散について書きました。丁度1年ぐらい前ですね。
ssssというのはSSSS.GRIDMANとは全く関係なくて、Shamir's Secret Sharing Schemeのことです。 Shamirというのは人の名前で、RSA暗号のSの人ですね。
で、これを今回Go言語に移植してみました。 というのもこのssssはC言語でコーディングされており、今時の高級言語には移植されていなかったためです。
Go言語ならWindowsやARM用のバイナリを作るのは簡単ですし、最近ではwasmにも変換できるため、 ブラウザ上で動作させるように改造することも容易になります。
とりあえず移植したレベルですので、ライブラリ化やコマンドラインアプリ部分との分離とかはまだやっていません。 git cloneして、go buildすればssssgoというバイナリができますので、以下のような感じで動作させることができます。
ssssgo$ go build ssssgo$ ./ssssgo -t 3 -n 6 split Generating shares using a (3,6) scheme with dynamic security level. Enter the secret, at most 128 ASCII characters: foo bar baz Using a 88 bit security level. 1-d9bd5efeb34972b41dcb98 2-25c1440f501ee5a1723d81 3-2e14fbbc265d4f36d2ca65 4-bd30c359096f0190188682 5-b6e57cea7f2cab07b87174 6-4a99661b9c7b3c12d78749 ssssgo$ ./ssssgo -t 3 combine Enter 3 shares separated by newlines: Share [1/3]: 6-4a99661b9c7b3c12d78749 Share [2/3]: 3-2e14fbbc265d4f36d2ca65 Share [3/3]: 2-25c1440f501ee5a1723d81 Resulting secret: foo bar baz
コマンドライン書き方がちょっとオリジナルとは違うのと、入力文字列が隠れない点が移植しきれていませんが、ちゃんと動いていることが分かります。
今回はAdvent Calenderの記事でもありますので、git log -pを見ながら移植についての感想みたいなものを書こうかと思います。
最初はやはり勢いが大事です。まずは拡張子.cを.goに書き換えて、go fmtが動くところまで持ってきました。 ただし、ややこしそうなところや、最初の目標と考えていたsplit部分以外はひとまずコメントアウトしました。
で、一番の不安要素としてはgmpの部分をどうやって移植すればよいかと考えていました。 mini-gmpを移植しないといけないのかと。
1つ見つけたのは github.com/ncw/gmp というパッケージで、これはlibgmpをgolangから呼べるようにするもののようでした。
gmpというのは何なのかを調べたところ、大きい整数を扱うための高速なライブラリのようでした。 gmpはGNU Multi-Precision Libraryの略だそうです。
GNU Multi-Precision Library - Wikipedia
今回は高速動作は重要ではないですし、整数のライブラリなら他にもあるだろうと調べたところ、普通に標準ライブラリにありました。math/bigというやつで、この中のInt部分です。
big - The Go Programming Language
この時点での移植プランとしては、とりあえずncw/gmpを使って動作するところまで持っていき、その後でmath/bigへ移植しようと考えました。 ncw/gmpはmath/bigと同じようなインターフェイスを持っているため、ncw/gmpで動けば、ほぼそのままmath/bigでも動くだろうし、libgmpの関数とmath/bigでの呼び方の対応を見るにはncw/gmpのソースコードを見れば分かりそうだったので、非常にありがたかったです。math/bigへの移行はgmp.Intをbig.Intに書き換えるだけです。
オリジナルの乱数は乱数プールから値を読むような処理がありました。これは最初はmath/randのUint32()を使っていましたが、セキュアでないため後でcrypto/randに置き換えました。(wasm化する場合はこれはJavaScriptのSecureRandomあたりにバインディングされるのではないかと思いますが、調べていません。SecureRandomは古い実装だとMath.randomにfallbackする問題があるらしいですが、wasmが動くような最近のブラウザはたぶん大丈夫なのかもしれません。すんません調べていません。)
ということで、できていないところとしてはメモリのロック処理(mlockall)、uidの処理(seteuid)、secret入力時のecho offがありますが、本質的な部分ではないので今はあまり移植するモチベーションがありません。
まとめ
C言語で書かれているコードをWindowsやRasPiやブラウザで動かしたければまずは拡張子を.goに書き換えることからスタートしてみてはいかがでしょうか。
wineでKontakt 6 Playerを動作させた
以前、Kontakt 5 Playerをwine環境で動作させました。
あれからだいぶ時間も経過しまして、Kontaktは6が最新バージョンとなりました。 割と簡単に動くだろうと思っていたのですが、かなり苦労しました。
ある時期にライセンスやダウンロードの管理がService CenterからNative Accessに変更となり、 これを正常に動作させるために非常に苦労したのです。
Kontakt 5 PlayerとService Centerについては今のところLegacy Softwareからダウンロード可能です。 ただしライセンスの管理はできないかもしれませんし、古いソフトのアップグレードのキーの入手は困難と なってきますので、Native Accessに移行せざるを得ないでしょう。
結果的には無理矢理動かすことができましたので、覚えている範囲でつまづき点をメモしておきます。 また、苦労した点は最後の方に書いておきます。
- 使用したwineは64bitの3.20。PlayOnLinuxでビルドした。
- 環境変数は以下のような感じで設定
export PATH=$HOME/.PlayOnLinux/wine/linux-amd64/3.20/bin:$PATH export WINEPREFIX=$HOME/.wine64a export WINE=wine64
- 前回同様winetricksで色々と必要そうなものを追加インストール。winecfgであれこれネイティブ版に切り替えたり戻したりしてみる。
- インストールは
$WINE Native\ Access\ 1.7.3\ Setup\ PC.exe
で実行。特に問題なく終了した。 cd $WINEPREFIX/drive_c/Program\ Files/Native\ Instruments/Native\ Access
でディレクトリを移動。- httpsでのアクセスで問題が起きるようなので、以下のCaddyfileでhttp化したプロキシサーバーを立てる。ポートは443だけどhttpで動作する。
- このままだとNative Access.exeは正規のサーバーにhttpsで接続してしまうので、バイナリにパッチを当てる。
- 今回はbviでapi.native-instruments.comをapi.native-instruments.cozに1文字変更し、その直後にあるhttpsをhttp+ヌル文字に書き換えた。
$ diff -u <(xxd Native\ Access.exe.orig) <(xxd Native\ Access.exe) --- /dev/fd/63 2018-11-11 11:09:20.783091625 +0900 +++ /dev/fd/62 2018-11-11 11:09:20.781091569 +0900 @@ -576386,7 +576386,7 @@ 008cb810: 7400 6d00 7000 0000 4e61 7469 7665 4163 t.m.p...NativeAc 008cb820: 6365 7373 0000 0000 6170 692e 6e61 7469 cess....api.nati 008cb830: 7665 2d69 6e73 7472 756d 656e 7473 2e63 ve-instruments.c -008cb840: 6f6d 0000 6874 7470 7300 0000 0000 0000 om..https....... +008cb840: 6f7a 0000 6874 7470 0000 0000 0000 0000 oz..http........ 008cb850: 7773 733a 2f2f 736f 636b 6574 732e 636c wss://sockets.cl 008cb860: 6f75 642e 6e61 7469 7665 2d69 6e73 7472 oud.native-instr 008cb870: 756d 656e 7473 2e64 6500 0000 0000 0000 uments.de.......
- また、api.native-instruments.cozは存在しないので、sudo vi /etc/hostsでローカルホストに向くように変更する。
- caddyを実行する。ポートは443なのでsetcapとかsudoなどでなんとかする。(caddyのインストールや使い方はQiitaとかにあるので検索してください。)
$WINE Native\ Access.exe
で実行する。うまくいけばログイン画面が出るでしょう。- その後は普通の手順で進むことができると思いますが、スタンドアローン版のKontakt Playerはなぜか音が出ないので、デフォルトパッチの編集だけを行い、あとはairwave+CarlaとかでVSTとして動かすとよいかと思います。
- 各種ソフトウェアのダウンロード後は自動でインストール後に削除されてしまうので、どこかにコピーしておいた方がよいかもしれません。
- スタンドアローン版はwineasioをうまくインストールできたら音が出るようになるかもしれませんが、今のところまだ手順を確立していません。
2018/11/11 14:45追記
wineasioは以下のissueにおおよその手順が書いてあり、自分の環境に合わせて実行するとうまく音が出るようになりました。
苦労した点と調査内容
- WINEDEBUGでのログのキャプチャ。
LANG=C WINEDEBUG=-all,+winhttp,+wininet,+winsock
などを付けてログを見てみる。 - Native Access.exe自体のログがいくつかある。
users/$USER/Local\ Settings/Application\ Data/cache/Native\ Instruments/Native\ Access/NativeAccess_1.log
jq < users/$USER/Application\ Data/Native\ Instruments/Native\ Access/uret_cache
- 関連してそうなホストで絞り込み、tcpdumpでキャプチャしてみる。分かりにくいので.pcapで保存してWireSharkで見てみる。TLSで通信しているだろうから、中身がよく分からないが、あまりにも中身が短すぎておかしい。
- このあたりでTLS周りを疑うようになる。aria2c.exeもインストールされているので、これで適当なhttpsサイトから何かをダウンロードしようとしてみるがうまくいかない。
- mingのcurlを入手し、httpsでダウンロードしてみるとうまくいく。よくみると証明書もbinにインストールされていた。
wine control
でcurlに添付されていた証明書をインストールしてみたが、Native Access.exeの問題は解決せず。- caddyでプロキシを立ててexeとhostsを変更し今に至る。ポート443が使われてしまうのでhttpsのままなのかと思ったが問題なく動作したのでとりあえずOKとした。
- Add a serialではキー入力を受け付けなかったので、5文字ずつコピーしてペーストした。
Ubuntu 18.04 トラックボールでホイールスクロールを模擬
会社で使っているマウスのホイールの調子が悪くなってきました。 ホイールは比較的早く壊れるので、できればこれに頼らないようにしていきたいものです。
家で使っているのはELECOM EX-Gというトラックボールなのですが、せっかくでかいボールが付いているので、 このボールでホイールのエミュレーションをするように設定してみました。
/usr/share/X11/xorg.conf.d に 80-elecom-trackball.conf という名前で以下のような内容のファイルを作りました。
Section "InputClass" Identifier "Wheel Emulation" MatchProduct "ELECOM ELECOM TrackBall Mouse" Driver "evdev" Option "EmulateWheel" "true" Option "EmulateWheelButton" "8" Option "Emulate3Buttons" "true" EndSection
MatchProductの部分はxinputコマンドで出てきた名前を使います。 8と書かれているところはBack, ForwardボタンのBackに相当する部分です。 xevで押してみると確認できます。
元々Back, Forwardボタンは使っていなかったので、しばらくはこれで使ってみようかと思います。
追記1:
Backボタンとしても機能してしまっていたので、以下の設定で中クリック扱いにするようにしました。
Option "EmulateWheelButton" "8" Option "ButtonMapping" "1 2 3 4 5 6 7 2 2"
EmulateWheelButtonはマッピング前の数値を使うようなので、注意が必要です。
ついでにBlenderの操作でForward(中クリック)を押しながら視点の移動ができるようになりました。
追記2:
ホイールのティルト左右でBack, Forwardができるようにしました。
Option "ButtonMapping" "1 2 3 4 5 8 9 2 2"
DSLでMIDI変換スクリプトが書けるLV2プラグインを作成した
作りました。
これまではプログラマブルなMIDI情報の変換にはmididingsとかQmidirouteを使っていましたが、LV2プラグインで欲しいなと思っていました。
スタックマシンなら簡単に実装できるかなと思い、作ってみたところなんとか作成することができました。
命令はすべてASCIIで表現可能なため、Carlaで保存されたXMLを直接編集することで内容を変更することが可能です。 独自の設定GUIは今のところありません。
命令はbrainf*ckの元となったFALSEをベースにしていますが、かなり別物になっています。 そのまま書くと訳が分かりませんので、別の言語(RubyやPythonなど)で生成するようにした方がよいかと思います。
スクリプトの例として以下のようなものを作成しております。
5度上のノートを追加するやつ
Tx8*7-<3N%R%C\7+\
ノートオフを無視するやつ
C%%x/8-3Z%R%%%%
ベロシティを少し上げるやつ
$x8*7-<5Z%7+R%%x8*1-
MIDI CHを1増やすやつ
@1+@@
nanoPAD2の8つのパッドにそれぞれの音程をセットするやつ
\$4h-7N%%5h\R%$5h-7N%%4h\R%$6h-7N%%3i\R%$7h-7N%%2i\R%$8h-7N%%1i\R%$9h-7N%%0i\R%$ah-7N%%fh\R%$bh-7N%%eh\R%$ch-7N%%dh\R%$dh-7N%%ch\R%$eh-7N%%bh\R%$fh-7N%%ah\R%$0i-7N%%9h\R%$1i-7N%%8h\R%$2i-7N%%7h\R%$3i-7N%%6h\R%\
最後のは訳が分かりませんが、ジェネレータ側のdrum_pad.rbを見ていただければなんとなく分かるかと思います。
命令についての解説が全くないので、ぼちぼち書いていこうかと思っています。
WineでDrumMic'a!(KONTAKT Player 5)を動かしてみた
サンプラーと言えばNIのKONTAKTが有名です。 サードパーティの音源も多数あり、Linuxユーザーにとっては非常にうらやましく思うソフトの1つです。 サードパーティの音源は謎の可逆圧縮がかかっておる訳ですが、これはFLACでもALACでもなく、 独自の秘密のフォーマットであり、バイナリの変換ツール単体も提供されておらず、オープンな思想からは大きく外れております。
文句ばっかり言ってても始まらないのでLinuxのWineで動かす方法を探っておりました。
以前、KONTAKT Player 5を動作させたことはあったのですが、それからPCも変わり、いろいろとバージョンも変わってしまい、 手順も忘れていたので改めて環境構築に取り組んでみました。
以前はアクティベーションのソフトが動かなかったのですが、海外サイトでいろいろ調べていると最近のWineでは問題が解決してそうな感じだったのでモチベーションが上がりました。
アクティベーションがもし動くなら、ゼンハイザーがマイクの宣伝用に無償で提供しているドラム音源、DrumMic'a!をインストールし、アクティベートできればKONTAKTのクロスグレードが安く入手できます。 セールのときはさらに半額になったりすることもあるようです。今はKONTAKT 6が控えているのでしばらくセールはないかもしれませんが。
で、結果から言うと動きました。
手順はちょっと整理できていないので、とりあえず苦労した点やコツを箇条書きにしておきます。
- wineはgitのやつからビルドしていたが結局うまくいかず、PlayOnLinuxでビルドしたやつでうまくいった。
- PlayOnLinuxはうまく動かないところがあるが、wineの管理だけはちゃんと動いていた。
- 環境変数のPATH, WINEPREFIX, WINEをちゃんとセットする。(WINEはwine64を指定)
- フォントが文字化けというか豆腐になるのを調べるにはps axでプロセスIDを調べてlsof -pでfontsをgrepする。
- フォントを別のファイルに置き換えたり、消したりすると直ったり、原因の切り分けができたりする。
- winetricksで色々とインストールする。
- winehqのサイトで動かした人のコツを調べる。
- winetricks msvcp140=native は重要。
- winetricks win7 も重要っぽい。
- msvcp140などのdllのサイズが小さくなってしまい、winetricksでいろいろやっても戻らないことがあった。
- 別環境のWINEPREFIXを作成し、そこで入手できるパターンを探す。
- うまくいったときのDLLを保存しておいた方がよい。今回はたまたま別環境にあったのでそれを使って上書きした。
- winehqのサイトではDLLをあるサイトからダウンロードした人もいるが、この方法は危険だと思う。
- sudo mount -t udf -r Kontakt_Factory_Selection.iso cdr -o unhide みたいな感じでマウントする必要あり。
- 今のところKONTAKTはスタンドアローンでは音が出ていない。AirWaveを使ってCarlaのVSTとして読み込むと音が出た。
- AirWaveは本家ではなく、rodlie/airwaveのバージョンを使う。READMEとその変更内容(git log -p)をよく読むこと。
- DrumMicA.zipのダウンロードは時間がかかる。
- sha256sumは 2a8a6a5b5d480b1eb9ef25ec7830e6ead89cf9b6a7fe1d90c95a4399d24e11f9 だった。
- DrumMicA.zipはunzipコマンドでエラーが出るので7z xで展開する。DrumMicA Setup PC.exeを実行する。
あと、Sample Tank 3のメモもついでに書いておきます。
- SampleTank_3_3.7.zipの中のInstall SampleTank.exeをインストールする。
- Program\ Files\ (x86)/IK\ Multimedia/Authorization\ Manager/Authorization\ Manager.exe でアクティベートする。
- SampleTank_3_Sound_Content_Part_1.zipから_8.zipまでを展開し、それぞれインストーラを実行する。
それとKORGのM1とWAVESTATIONのメモも。
- 文字化けしてアクティベーションの画面がよく分からないときは手順のPDFを見ながら操作する。
- wine64でインストールしてもAirWaveでは32bit扱いになり、Carlaでホスティングできない。調査中。32bitのwine環境の方がよいのかも?
- スタンドアローンでは一応動いているが、レイテンシを考えるとwineasioを頑張って入れる必要がある。
- 前はそうしたが、手順をまた調べる必要がありそう。
2018/11/11追記: 続きを書きました。
Pianoteq 6 PROのインストールメモ
Linuxをサポートしている珍しい貴重な音源、Pianoteq 6 PROをインストールしたときのメモです。
まず、Pianoteqのサイトに行き、サインインします。
User areaのDownloadsからLinux, v6.2.2, 32-bit/64-bitをダウンロード。 拡張子は7z。 (なんかOrganteq Alphaというのもダウンロードできるぞ。なんだこれ。)
適当なところで展開して、スタンドアローン版の実行ファイルamd64/Pianoteq 6を実行。
以下のような画面が表示される。
ボタンを押すと以下のような画面となる。
Registered productsに表示されているコードを入力し、Quick Activationを押す。
こんな感じの画面が出れば成功。
設定せよ、と指示があるので以下のようにJACKを指定してみる。 MIDIキーボード(AKAI LPK25)を接続して、それを選択。
なんか画面がでかいので設定でTinyに変更してみた。
JACKで接続。MIDIは接続しなくてもいいみたい。
無事、音が鳴った。
VST/LV2の場合はCarlaで.soを読み込ませるとよい。
こんな感じ。 GUIを出すと...
はみ出て見えない...
Linuxで再生されている音を録音する方法色々
Windowsはよく知りませんが、Linuxでは簡単に再生されている音を録音することができます。
方法1. parecコマンドを使う
$ parec > rec.raw
こんな感じでpavucontrolからどれを録音するか選択できます。
この例ではNull出力を使っています。
~/.config/pulse/default.pa
で以下のように指定すればNull出力が使えるようになります。
load-module module-null-sink
これならオーディオインターフェイスがなくてもいけますね。
あと、録音用のNull出力を別系統にしたい場合は以下のようにして名前を変えてやれば増やすことが可能です。
load-module module-null-sink sink_name=parec sink_properties="device.description=Null2"
動的にやるなら以下のコマンドで。
$ pactl load-module module-null-sink sink_name=parec sink_properties="device.description=Null2"
方法2. PulseAudio+ffmpegを使う
$ ffmpeg -f pulse -i default -y rec.flac
ffmpegなので好きな形式にエンコードすることができます。 PulseAudioありでビルドされている必要がありますが、Debianパッケージならありになっています。
方法3. JACK+timemachineを使う
JACKを開始後、timemachineを起動。
$ timemachine
PulseAudio JACK Sinkの出力をtimemachineに接続。 あとはボタンを押せばRAWで録音開始となります。 ファイル名は現在日時をベースとしたものになります。
これも録音用を別系統にしたければ別名のJACK Sinkを作成すればよいです。
$ pactl load-module module-jack-sink client_name=pulse2
方法4. JACK+ffmpegを使う
方法3とほぼ同じですが、timemachineではなくffmpegを使う方法。
$ ffmpeg -f jack -i ffmpeg -y `date +%Y%m%d_%H%M%S`.flac
ファイル名はなんでもいいですが、ここではdateコマンドで現在日時を使うようにしています。