C++幼女先輩

プログラミング成分多め

久々のAndroid開発(いきなりndkでOpenGL)序章

私には出来ませんって 断り続けたものの お客さんがかんたんに許してくれるわけでもなく
3回ほど断ったけど 結局 やってやんよ! というしか無かった Android開発
もちろん NDAの範囲で〜 の話だけど
具体的なことはかけないのだが NDKでAndroidの開発である

過去の栄光

こんなもの捨ててしまえばいいのだ
ただ、知識は捨てる必要はない。先人の7年前の私の話をしよう
7〜8年前に、わたしは某社の社長から特命を受けた
AndroidiOSに両対応したゲームエンジンを作れと
当時はAndroidは2.xで iPhone3 とかの時代だった
OpenGLESは1であったし、なんといっても私は AndroidiPhoneも持ってない
当然 スマホの開発はしたことないし、OpenGLも触ったことがなかった
そんな状況ではあるが、社長はR&Dとして期日も設けず、好きに開発してくれと
結局それから毎日 鬼のように働き3週間でプロトタイプを作成した
その時にとった戦略は、メインライブラリをC++で作り
AndroidにはJNIで、Objective-CにはそのままC++で 呼び出す事だった
最初に面倒なAndroid対応を行った
JNIも初めてで、意外とJavaとの呼び出しに罠が多く苦労した(String関連のメモリの所有者、GC、リフレクションなど)
OpenGLは初めてだけど すぐに理解できた
今の私だと、あの速度で理解出来たのか不明 いや、きっとやればできるはずだ・・
Objective-CC++がそのまま動くので何も問題なくおわった
開発中にGLES2.0が出たので、両対応したり
今考えても3週間で誰の助けもなくよく終わったと思う

その後、Javaの側をつくったり、GLES2.0のレジスタにおさまらないスキンメッシュをCPU計算して
SIMDNEONを使ったり
色んな部分をマルチスレッド化したり
Javaへ例外をやり取りしたり、RTTIに対応したり、本来非対応なものを、ライブラリ無理やり入れて動かした
また、NativeActivityが出たので対応したり

今回の話

あれから7、8年たち、色々と状況変わっているだろうが、結局いつもと同じく やるしかない
自由を手に入れるには 案件を片付けるしかない
まずは環境構築だ

環境

以前はWindowsで vs-androidを使った
これはVisualStudioにプラグインとしてのせて、VisualStudioにツールチェーンを構築してAPK作って転送する
とっても素晴らしいものであった
何が素晴らしいかって、clangでビルド出来て、C++11が使え(本来使えないが無理やり使えるようにツールチェーン作った)
Boostもちゃんと無理やり入れた
そして C++のビルドが早く、Javaを変更しなければそちらのビルドが走らず高速で実行できる
また、C++部分にブレークポイントうってデバッグもでき、控えめに言って最高であった

それに加え、コマンドラインでのビルド(リリース、自動ビルド用)と
EclipseでのNDKビルド環境を作った
Eclipseビルドは C++部分の自動ビルドが非常に遅く、バックグラウンドでCMakeでビルドするほうが早く
そのようなシステムを作ったが、vs-androidよりビルドは遅いし、そのごJavaコンパイルも入り
C++部分のデバッグもVisualStudio様に比べて弱く 非常に使いにくかった
もちろん Java部分の開発にはとてもパワフルだった

ので、C++部分の開発(全体の98%)は vs-androidにて
Java部分(2%)は Eclipseで開発
というスタイルであった

今回は、WindowsPCもMacPCも持っているものの、できればMacにすべて開発移したかったけど
vs-androidの便利さ考えると 悩むところ

ってことで、とりあえず AndroidStudioでのNDK開発を検証してみる

AndroidStudio、NDKなど環境を整え 新しいプロジェクトの作成

f:id:murasame-labo:20180516025235p:plain
すばらしい! 最初から C++14まで選べて、Exception、RTTIも標準でできる
これだけでテンションあがる

生成コード

まず、ビルドがGradleになっている。使ったことないけど 評判は良い
前つかってたときは Antで、Mavienがいいよって中国の技術者に教わって Maven対応したんだけど
とりあえずGradleの沼に入るのは今ではない

C++側のビルドはCMakeだ。何も文句ない

Java側のソース

package com.murasame_lab.cstudio1;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Example of a call to a native method
        TextView tv = (TextView) findViewById(R.id.sample_text);
        tv.setText(stringFromJNI());
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();
}

C++

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring

JNICALL
Java_com_murasame_1lab_cstudio1_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

最初らしく、C++コードから "Hello from C++" の文字を返し
それをJavaで画面に表示している
NewStringUTF() は、メモリJavaが破棄してくれるんだっけ?
そのあたりは 8年前に一通り調べたけど
正直記憶がない。3週間で一夜漬けしたので かんたんに思い出すことは難しいだろう
もう一度JNI周りは調べ直すしかない
記憶はないが 私にはコードという記録がある
いつか思い出すはずだ

ちなみに Static関数でライブラリのLoadをするのは、一つのお作法のようだ
8年前に色々な方法でベストを探したけど、最もかんたんにかけて問題がないのがこの方法であった

とりあえず小さなコードにおいては、AndroidStudioでブレークポイントもかかったし、高速にビルド出来た
そのため、今回はAndroidStudioでもいけるんじゃないかと 期待している

Macbook到着

やっとMacbookが届いた。っていうか予想より速い
北海道の配送センターからやってきたというのに、Primeで課金しているAmazonより速い
もう Amazonは本格的にダメかもわからんね・・・

久々のMacOS

macbook pro 13-inch 2017 Two Thunderbolt 3 ports
HighSierra 10.13.13
3年ぶりぐらいにMacbook手にした。2代目である
初代は 購入時のロジックボード不良という、生まれながらにして死ぬ難病をかかえて産まれてきたんだけど
この子は大丈夫だろうか??
って 購入前から、キーボードのパンタグラフがすぐ壊れる リコールしろ! 署名運動が行われてるんですが・・
大丈夫でしょうか?

嫌なところ

基本Macの嫌な所は他の機種でも同じだけど今回はあえての TouchBar無しモデルなので 少ないはず

まず、USB-Cが2系統あるが 一般的なUSB等がささらないので何も使えない。モニターもささらない
知ってたので最初から変換アダプタも買った

キーボードが嫌。評判以上に酷い。押した感覚がないし押しても反応してない事もあるしで慣れるまで死にそう

Ctrl+CやCtrlSなどのショートカットボタンが違う
以前のMacでもこれでいつも困っていた。もちろんソフトで場所交換できるが今回は使うか・・

ビデオカードが弱い。UNITYが重くて厳しい。想定内

Githubが非常に遅い。。理由不明。時々Google認証エラー出るし、最初エラー出まくって1時間ほどかかったし
なぜかネットも重い。。何か設定必要だろうか?

HDD少ない。256GBでProかよ・・・ って思う

漢字変換ボタンがない、DELキーがない・・・

辞書が酷い。Google変換にかえるか・・

ゲームが出来ない

いいところ

小さくて軽いので、ゲームをしない、ゲーム系の開発以外なら これ1個で旅できる

PC多すぎ問題

今PCが多すぎる・・

  • デスクトップPC1
    特に使っていない・・ ゲーム用に1080Ti 2枚積んだけど
    本格的なゲーム開発になれば実力を示すであろう

  • デスクトップPC2
    特に使ってない。。。 1080と1080Ti 構成。だってGPU安かったんだもん・・

  • Windwsノート RazerBlade
    メインPC。ゲームも出来るし開発もできるし ハイスペック

  • Macbook 新顔。iOS開発や、Golang開発、Rust開発等に
    DockerあればWindowsでもたいていの仕事できるけど、他の人にあわせてMacの方が楽な場合もある

  • Windowsノート
    ゲーミングPC。従業員用に必要になったら貸す

  • WindowsタッチパネルPC ジムで動画みる用。スペック低いので 使ってないが安いからいいか

  • Fujitsuノート 世代古いので重いけど、普通に使う分には十分
    全く起動してないからそろそろ捨ててもいいな

Bitcoinの開発環境について

ビットコインやその他の仮想通貨の開発において、本番でテストを行うと
コインを失ったり、お金でコインを買ったり Feeの支払い等 大変
なので、testnet、regtest というテスト環境がある
それらのメモ

mainnt

通常の起動だと mainnetになる
本番環境であり、価値のある通貨である
そのため、テストでは使わない事を推奨する
データも大きく 100GBオーバーである

testnet

-testnet  オプションをつける事で設定できる
mainnetと同じ動作をする
違うのは、コインに価値がないだけである
mainnetよりデータ量はかなり少ない (といっても数十GBあるが・・)
テストに使う通貨は Faucetから無料で入手する事が出来る
mainnetと同じルールなので、テストに最適である
ただし、mainnetと同じく トランザクション確定まで時間がかかる

regtest

-regtest オプションで設定できる
mainnetやtestnetとは違うルールで動く
完全にローカルのみのテストで 最初はデータがない
自分で好きなブロックを作りテストをする
ブロックは即座に反映されるのでテストにはスムーズ

私の現状

regtestを上手く使いこなせておらず、testnetで開発を行っているが
データを作成するシェルなどを作り、効率的にテストを出来るようになりたい
また testnetで開発しているが、TLSエラーになり動かなかったりする
おそらく regtestならそのあたりの問題を 簡単に解決できると思う
regtest使いこなしたい

マイニングの話

始まりは

昔、あまったCPUリソースを使って宇宙人からのメッセージが来てないかを計算する SETI というプロジェクトがあった
個人的にはそのプロジェクト自体は胡散臭いと思いつつも
世界中のPCの空き時間を計算に使う グリッドPCに興味をもち 参加した
将来は 自作PCの空き時間を売る事で、サーバ費用おさえる世界が来るだろうと思い
その後、新薬計算等に使われたりしていた
そんな中 2011年に 仮想通貨というもの、マイニングでお金が得られるというのを知り
Lite Coinを掘ってみた
もしその時点でちゃんと掘っていれば 今頃億り人と呼ばれていただろう

ところが 当時仕事で使っていたPCはMacbookで、GPUマイニングソフトはWindowsにしか対応しておらず
めちゃくちゃ低速で、しかも当時の低いレートで全然掘れずに 1か月で辞めた
でも 1か月掘ってれば お小遣い程度のコインは掘れてたんだけど
プライベートキーもロストし、 Self Gox し、1円たりとも利益出なかった

2013年ごろ

知人から 仮想通貨のマイニングの話がきた
というか 私が2011年に彼に仮想通貨の話をしたことを覚えていて
ASICでマイニングマシンをつくれば めちゃ儲かるんじゃない? と提案され
機械回路作れる人間を集めて 2回ほど打ち合わせしたが
結局開発費が見積もれず 頓挫

2017年

このころはすでに 仮想通貨で支払える店が多少なりともあり、通貨になりかけていた
過去に少し触っていて、ハードフォーク問題等が気になり 論文を読んだりした
ブロックチェーンに関して 読めば読むほどに、この仕組みは素晴らしい、何かに化けると確信して
コードを読んだり、マイニングしたり、少しづつ関わるようになった

残念ながら、技術方面からみてたので、全然利益は出していないが
今は GPU6個でマイニングしている
電気代考えなければ1日1500円というところか
電気代が高くて利益あんま出ないけど、細々とやってます
将来的には AI用のGPUになるかもしれないし、ゲーム用になるかもしれないけど
人生でこんなにGPUまみれになったのは はじめてなので、わくわくします

部屋は ほんのり暑い

マイニング始めたからだと思うけど、仮想通貨の開発案件がよく来るようになりました
やっぱり世の中そういうもんですよね
アンテナ広げないと仕事来ない

PS4でアマゾンビデオを観れない時

とりあえず そんな時は下記URL参考に

sk-shimane-zakki.com

経緯

シェアハウスに住んでいるのだけど、荷物が入りきらない
知人の家に荷物置かせてもらってるのを そろそろ回収したくてセカンドハウスを借りた
利用目的には物置き以外に、仕事場所、ゲーム配信場所、VRやVirtualYoutuber等の開発環境等
または 越境ECの為の倉庫と幅広い

インターネットは今はWimax2+を使っているが そろそろ制限になりそうなので 光を契約した
工事まで あと10日ほどかかる

事務所には立ち机のしたに スピンバイクを置き、自転車をこぎながら仕事や遊びが出来る用工夫してある
そこに ネットが通じたらPS4を持っていこうと思う
ついでにPS4でビデオも見れるよう アマゾンビデオの設定もした
ところが アカウント連携させたはずなのに、プライムが有効にならない
原因は上記のとおり デバイス登録が出来てなかったからで
バイスを登録しなおしたら アマゾンビデオが見れるようになった !

さっそくダウンロードして持っていこうとおもったら、PS4はPC扱いなのか スマホではダウンロードできるのに ストリームのみであった
残念

Macbook購入計画

はじめに

まず断っておく。私は宗教家じゃない。WindowsMacも等しく扱う

初代MacbookPro

2011年にiPhone開発が必要になったため、自身初のMacOS購入で MBP Pro 2011mid 購入
予想以上にWindowsと似ていて あまり操作に困らなかった
ところが 私のロットは ロジックボードに初期不良があるロットだったため すぐに修理対象になったが
買って数時間後に 分解してメモリ増設、光学式ドライブ外し SSD追加等行ったため、対象外に
そんな感じで ずっとロジックボードの不具合のなか使っていたので、かなりユーザエクスペリエンスが悪い
例えばスリープ復帰時にビデオがONにならず動いているが画面真っ暗で、操作もできず再起動も出来ず、強制電源OFFしか出来なくなることが頻発し
結局、毎回電源OFFするしかなかったり
暫く使っていると画面にノイズが出て 画面が見えなくなるので そんな時は再起動
とにかく ロジックボード不具合で不便だった
ただ、Proだけありスペックは申し分なく、重量もそこそこ筋トレになる程度あり、気に入っていた
なんといっても 初日に分解して自作した SSDとHDDを組み合わせた、FusionDriveを構成(いわゆる ソフトウェア Hybrid HDD)し、ディスクアクセスも高速で
HDDがテラあったので とても快適

2016年没

4年間良く働いてくれた
今までは仕事は会社のデスクトップか、持ち帰りだと家のデスクトップで行い
ノートPCは あまり持たなかった
持ったとしても、デスクトップ代わりで引っ越し前だから・・ とかで、数か月に一度ぐらい友達の家に持ち込む程度で
実質はデスクトップだった
ところが、2011年より 私の中で働き方革命がおこった。酷いことに 常駐先の会社でiPhone開発を指示されたのに会社のMacbookが無いとの事で
購入申請して入手まで1か月弱かかる と言われ、自分で買って持ち込み許可もらう方が早かったので 自分で買った
ちょっと理不尽な気もするけど、それをきっかけに ノートPCを毎日持ち歩くようになり、ネットがあれば旅行しながら仕事出来る状況を作れ
とても感謝している
それから2016年まで、スマホゲーム、アプリを中心に MTI様、CyberAgent様、スクエア・エニックス様、DMM様、サンレンプ様、源様、叢雲ゲームズ様、ポケットクエリーズ様、スパイラルセンス様・・・ その他色々な方と仕事させていただき
2016年、持病のロジックボード不具合が致命傷となり 二度と起動することがなくなりました
私の中の激動の時代を共にした盟友を失い悲しい気持ちに今でもひたっております(もちろん亡骸は今でも持っています)

新しい相棒 RazerBlade

2016年頃になると、私の中ではiPhone開発の案件は激減していた
というのも UNITYやUnrealといった、クロスプラットフォーム案件がメインになり、また 私が担当する部分がたいてい 技術的にみんなが出来ない
グラフィック系のコア部分と、Androidプラグイン ばかりだった
Unrealにいたっては Macbookではまともに動かず
また、サーバ開発においては、Dockerが主流になっており Macの優位性が減っているように感じられた
また、当時出てきた VR/AR関連は Macでは周辺機器が動かないためWindowsの必要性があった
そのため、次のノートPCには ゲームがサクサク動く、UNITY Unrealで開発出来る、VR/ARが開発出来る GPUのすごい WindowsPC つまりゲーミングPCから選ぶことにした
その中で Windowsの乘ったMacbookと言われている RazerBladeにした。 スペック最高なのに 薄くて軽いのだ
そして この相棒は ゲームにも仕事にもとても活躍しているし、やはり 海外に持ち運んで仕事にも使っている
DockerにおいてはMacよりWindowsのほうが ファイルアクセス20倍速く 本当に快適だ
Docker+WSL(Bash on Ubuntu on Windows)を使えば サーバ開発もサクサクできるので MacOSの必要性がなかった

Macbookが必要になったワケ

上記のようにWindowsにて UnityやUnrealは快適で サーバも快適なんだが問題が発生した
Golangにおいては Windowsでは対応していない機能(プラグイン等のネイティブ機能)があった
RustにおいてMacコンパイルの設計が違い 共通化する事が難しい
WSLではサーバ運用は想定されていないため、サーバをたてて開発・・というのがローカルで完結しにくい(Docker-compose使えばいけるけど)

上記のWSL問題は 多分 コンテナ間で TLSを解決すればいけるんだけど、そんなメタな事をするぐらいなら Macbook買っちゃえ!別にMac嫌いじゃないし
ってことで 購入する事にした

Macのモデル

数年Macから離れてたので事情を一通り調べた
15インチにしたかったけど、今回は13インチにした
TouchBarは無くて良い
スペックは重さ変わらないなら高い方がいい
ので、MacbookPro 13インチ TouchBar無しモデルにした
SSDは置換可能っぽいので とりあえず 256GB

使い分け予定

ゲーム、VR/AR開発は Windowsでなければ不可能なのでWindows
UNITY、UnrealWindowsの方が速いのでそっちがメイン
DockerはWindowsの方が速いので Dockerで動く開発はWindows使いたいな・・
C++においては VisualC++の使い勝手がすばらしいので、Windows

Rust、Golang はMacで行おう
Webサービスに関しては どちらでもDockerで開発出来るが、他の人との作業考え 基本的にMacで。場合によってはWindows

コード自閉症という言葉

自閉症というものがある
専門外なので詳しい事はわからないのですが
人間という生き物は他人の気持ちを本能的に理解できるという、超能力の一種 テレパシーに類する共感能力を持っている
この能力が著しく低い、まったく備わってない人間を 自閉症というらしい
そのなかでも、他の能力は高い人を 高度自閉症というらしい
例えば アインシュタインなどが有名で、世界の歴史を変えるほどの天才もいる

コード自閉症とは 私がいま 誤変換で作った造語である

凄いコードを書ける。たとえば OSやカーネルを一人で作れたり、グラフィックエンジンやWebフレームワークを一人で作れたり
あるいはC++を完全に理解したり
高度なコーディング能力を有しているくせに
他人のコードを読めない人の事を指す

わたしは 他人のコードに共感する能力が著しく低いのかもしれない
仕様がわかれば他人のコード使って作るより、全部作り直したほうが 早くて速くて安全なものが出来上がる

もちろん 部品として使うものは使うけど、それらはちゃんと使い方が分かる部品しか使えない

一応 BoostやSTLのような 高度生命体の書いた すばらしいコードは読めるので
完全に他人のコードが読めないわけでもなさそうで
OSSのような複数人が手を入れて 、Boostのような 完全なレビューがされてないものが強敵だ

例えていうなら
古代文字で書かれた 論文なら読めるが
現代文字で書かれた ライトノベルや随筆が読めない

そういえば私は 日本語においても、論点の間に 少しでも婉曲表現や遊びが入ると理解しにくい傾向にある
例えば お暇な時で良いのでxxをして戴けませんか? は、暇じゃないからしなくて良いと捕えるし
可能ならxx も 不可能だからしなくていい
お前 こういうところ直せよwww 笑っているのでジョークだ。直さなくていい

つまり 無駄が少しでもあると 読めないのではないか

かといって 私のアウトプットは 無駄が多く入っているのは、周りに合わせようとおもい、無駄を無理やり入れてるが 共感してないので過多になっているのではないか

自分の課題として、他人のコードを読む。無駄があっても読めるようにする
自分のコードは無駄をなくす

ちょっと 他人のコード読む練習しよう