これおもしろい

なにはともあれ1日1記事、いや、週1記事

Firebase Remote ConfigをAndroidに入れようとした時にエラーが出た

現象

https://firebase.google.com/support/release-notes/android
Release Notesを見た感じ、Remote Configはcom.google.firebase:firebase-config:16.0.1

そこでimplementationをしてみたら、
Error:Failed to notify dependency resolution listener. The library com.google.android.gms:play-services-basement is being requested by various other libraries at [[15.0.1,15.0.1]], but resolves to 16.0.1. Disable the plugin and check your dependencies tree using ./gradlew :app:dependencies.
と、gradle buildで失敗しました。

解決した方法

play-services-analytics = 16.0.3
firebase-config = 16.0.0
にしたら実行できるようになりました。

過程

stackoverflow.com
stackoverflowのスレッドを見た感じだとPlayService系のものと今回追加したFirebase Remote Configのバージョンが合っていなさそうなので、修正。
PlayService系はGoogleAnalyticsのものしか入れておらず。バージョンは16.0.3(最新は16.0.4
RemoteConfigは最新が上記の通り16.0.1

試しにどちらも最新の状態、PlayServiceのものを16.0.4+RemoteConfigを16.0.1にしてみましたが、結果は同じく転けたので、解決した方法のバージョンに落ち着きました。

3Dプログラミングの小話:ポリゴン

毎日ブログ書こうキャンペーン中ですが、日付が変わりそう...。
という訳で、パッと書けるネタがなかったので過去の知識を記事にします。
(追記: 結局日付変わってしまったので開き直って書いてます。)

ポリゴンとは

最近VTuberなどが流行っているのでよく3Dモデルを見掛けますね。
そんな3Dモデルの最小描画単位が三角形なのはご存知ですか?
ポリゴンと呼ばれるものです。

描画するには

三角形なので、1つのポリゴンを描画するのには3頂点が必要で、頂点は座標インデックスを持っています。

例えば、

[index] (x, y, z)

[0] (1, 1, 0)
[1] (2, 0, 0)
[2] (0, 0, 0)

といった具合です。
このインデックスの指定順に三角形を作ります。
これの場合時計回りの三角形になるはず。

この際、右手座標系(右手の親指、人差し指、中指をそれぞれ90度にして、付け根を原点、親指をX軸、人差し指をY軸、中指をZ軸と見立てた時の座標系:Z軸が手前向き)の場合は反時計周りだと表、左手座標系(左手に置き換えた座標系:Z軸が奥向き)の場合は時計回りだと表です。
(OpenGLは右手座標系、DirectXは左手座標系)
設定で変えられますが、基本的に表示される必要のない無駄なレンダリングを減らすために、表のポリゴンしか描画されません。

これは確実に図を描いた方が親切な気がする。

終わりに

最小の描画としてはこれで大丈夫だったはず。たしか。
実際の3Dモデルにする時はもちろんこれだけでは足りず、色とか面ごとに法線持たせるとか様々必要ですが、一番最初に3Dプログラミングで取り組むポリゴンの描画はこれだけで出来るはず。

久しぶりに記憶を辿った気がする。全然覚えてなくて勿体ないからちゃんと復習したいなぁ。
というかこの内容、そんなん常識っしょ、という感じなのだろうか。

「エミュレータ研究 PHPで学ぶコンピュータアーキテクチャ」の感想:1 / 3

※最初に断っておくと、完全に感想文です。悪しからず。
f:id:takattata:20181010234632j:plain:w300

面白い連載!

SoftwareDesign2018年6-8月号は読まれましたか?
この3月分には素敵な連載があるのですよ!
その名も「エミュレータ研究 PHPで学ぶコンピュータアーキテクチャ」。
ゲームボーイエミュレータを元にコンピュータアーキテクチャを学ぼうという連載です。

最高ですね!iOSDCに参加された方&&アンカンファレンスであったゲーム機のアーキテクチャを語るを楽しまれた方には心くすぐられるテーマではないでしょうか?

構成は

第1回:CPUのエミュレーション:6月号(8ページ分)
第2回:メモリとI/Oのエミュレーション:7月号(7ページ分)
第3回:画面表示のエミュレーション:8月号(9ページ分)

となっています。
本を読んで記事を書こうとすると、どこまで本の内容に触れて良いのか悩みますね...。
とりあえず、ここが面白かったんですよー!という感じで書いてみようと思います。

github.com この連載で題材となっているエミュレータリポジトリは↑こちら。

第1回:CPUのエミュレーション

はじめに

まず、ゲームボーイのスペックが載っています。
細かいところは分かりませんが、4色モノクロで160x144ピクセルRAM8KB/VRAM8KB、この辺りで歴史を感じてまずテンションが上がりますね!

次に、副読本としてオススメされていた、有志の愛好家によって書かれたゲームボーイの仕様の詳細ドキュメントを見て更にテンションが上がります。
http://marc.rawer.de/Gameboy/Docs/GBCPUman.pdf
なんと139ページ!
スペックやプロセッサ、メモリマップなどは勿論のこと、スプライトRAMのバグについても書かれていました。
どうやって調べ上げるんですかね...。すごい...。面白そう...。

CPU

ここまでが大体1ページ分の内容です。期待大の状態で、次はCPUの話に入っていきます。
ゲームボーイのCPUはLR35902なるもので、これはZ80のカスタムCPUだそうです。

はじめて読む8086―16ビット・コンピュータをやさしく語る (アスキーブックス)

はじめて読む8086―16ビット・コンピュータをやさしく語る (アスキーブックス)

この本を過去に途中まで読んだ覚えがあるのですが、8086はZ80と互換性あったりするのでしょうか?
調べてもいまいち分からなかったです...。

レジスタ

レジスタとは、から始まり、LR35902の特徴の紹介、その後にPCレジスタ、SPレジスタ、Fレジスタといった特定用途向けのレジスタ紹介があります。
ゼロフラグとかハーフキャリーフラグとかあったなー!という気持ちになりました。
基本情報技術者試験でも出てきましたっけ?たしか。(落ちてるからなんとも言えない)

命令セット

その後は勿論命令セットの説明です!
これいつも「そうなってるのかー、へー」と理解は出来るものの、実際に動くものを作るイメージがつかないんですよね。

$01 LD BC,d16
普段ずっとこういうものを書いていたらそんなことはないのでしょうが、たまに見る勢としては非常にテンションが上がります。そわそわします。
レジスタ操作、メモリ操作、演算、実行制御などの解説がされていきます。
キャリーフラグなどは演算時に使われますが、その説明を見て、Fレジスタの理解苦手だったなぁというのを思い出しました。
ちゃんと復習したい欲が掻き立てられます。

アセンブラで書かれたものを見た時に「何故ここでわざわざレジスタに格納してから他のレジスタに値を渡すんだろう」とか、「何故ここでわざわざジャンプして処理してから戻ってくるんだろう」と理解に苦しんでいた覚えがありましたが、今思えば効率やメモリマップの制約などがあったのでしょうか?
そう考えると全体を知っていないとろくなものが作れないであろうこの頃の開発者は本当にすごいなと思います。
当時からしたらジェネリクスとか理解出来る今の開発者すごいなとなるのかもしれませんが。

エミュレータ実装

さて!ここまでがゲームボーイ本体の話でした!
エミュレータなので、今まであった動きを実装していかなければなりません。
このコードのところに関しては、別途Kotlinバージョン読んでみた後に記事にしようと思います。
(でないとブログ書くハードルが上がって、この記事アップ出来ない気がする...。)

次は第2回!

メモリとI/Oのところです!これもすごく楽しかったんですよー!
明日書きますー。

第1回が載っている号はこちら。
gihyo.jp