DIの話

この記事はICT Advent Calendar14日目の記事です。

前日はnemu_souでした。
何か作ったらしいのでえらいですね()。

nemu-sou.hatenablog.com

こんにちは、mitoです。

みなさん、DIしてますか。

DIとは

Dependency Injection のこと

DIとは、コンピュータプログラムのデザインパターンの一つで、オブジェクトなどの間に生じる依存関係をオブジェクト内のコードに直接記述せず、外部から何らかの形で与えるようにする手法。(IT用語辞典)

「依存性の注入」とよく言われています。

依存性とは

ここでいう依存性というのはあるクラス内で他のクラスを利用している状況のことです。
例えば、Aというクラス内でBクラスを利用しているということがあったとします。

class A {
    val b: B = B() // インスタンス化

    fun hoge() {
        b.greeting()
    }
}

class B {
    private val text: String = "Hello, DI"

    fun greeting() {
        print(text)
    }
}

こういう状況でAというクラスの動きにはBというクラスが必要になって、Bクラスがなかった場合にAクラスは機能しません。
これが依存で「AがBに依存している」と言われてます。

ただ、依存という言葉自体にあまり良いイメージはないと思います(薬物...?)
実は英語版のDependency injectionのページには

A "dependency" is an object that can be used

とあり、訳すと「"Dependency"は使用できるオブジェクトです」
そう、オブジェクトです。
オブジェクト指向でのオブジェクトと捉えて問題ないと思います。
そう考えると考えやすくなるかと。

注入とは

注ぎ入れること。つぎこむこと。(Google検索結果)

つまり

あるクラスに対してそのクラス内で使っている他のクラス(オブジェクト)を外部から注入・渡してあげるという感じです。

↑の例ではAクラスの中でBクラスをインスタンス化(生成)させて使っているので、外部から注入されていません。
これに対して、外部(他クラスなど)から入れて・渡してあげることです。

外部って誰?っていう気持ちになるかもしれませんが、今のところはあまり気にしなくてもいいです。(一応書いておくと、Aを使おうとしている他クラスだったりDIコンテナだったりです。)

DIの種類

DIというのは上記の説明のようにパターンの名前でしかないので、それを実現するためにはいくつか種類があります。
- Constructor Injection
- Setter Injection
- DIコンテナを使う

Constructor Injection

コンストラクタ(Constructor)で渡してあげる方法です。

class A(val b: B) { // コンストラクタで渡す
    fun hoge() {
        b.greeting()
    }
}
// Bクラスは上記のコードと同じ

Setter Injection

セッター(Setter)で渡してあげる方法です。

class A(val b: B) {
    lateinit var b: B // セッターを使って後で渡す

    fun hoge() {
        b.greeting()
    }
}
// Bクラスは上記のコードと同じ

DIコンテナを使う

DIコンテナと呼ばれるDIを実現してくれるライブラリのようなものです。
DIコンテナには多く種類がありそれぞれ使い方も全然違うのでここでは説明しないです。

なぜ使うのか

よく言われているのは - テストがしやすくなる
- 柔軟になる

ただ、これを聞いただけではへ〜そうなんだになると思います。(自分も前まで利点は知っていたけどそうなんだくらいにしか思ってなかった)

テストがしやすくなる

Bをモック化してAのテストがしやすくなります。
モックに関しての話はテストの話になってくるので省略するのですが、AクラスがBクラス内のgreeting関数をちゃんと実行できているかなどを試すことができます。

柔軟になる

今、Bクラスをインスタンス化するには、B()だけで済んでいますが、もしBクラスのインスタンス化に仕様変更が入ってめちゃくちゃ長かったり複雑だったりした場合(良い例が思いつかなかった)に、Bクラスをインスタンス化して使っているクラス(例ではAクラス)全てのインスタンス化部分を書き直さないといけなくなります。

他にもいろいろな利点や欠点があるのですが、そこは調べてください。

最後に

今年度で高専も卒業ということで、それに関する記事はまた2,3月くらいにでも書こうと思います。
卒論を書き終わった頃には技術に関する記事をまた書いていこうかなとも思っているので、卒研頑張ります。

翌日は、ねるねるです。
サーバーサイドに強いっていう印象だったけど、プロコンの時にAndroidの話をしていた気がするなって思っています。
翌日からTNG Weekみたいです。

neruneru0419.hatenablog.com

プロコン本戦参加前

はじめに

 私たち、マンゴーごはんは#procon30にGooTravelという、オフライン環境下でのインバウンド客のサポートをするスマートフォンアプリで自由部門にて参加しました。

4月前

 チームが決まりました。
 自分がチーム決め前の面談時に出したリーダーはやりたくないという希望を考慮していただき、リーダーではなかったです。
 メンバーは
- ウエハラ(2年)
- りんぱんまん (5年)
- 漆黒のキャサリン(3年)
- mito(5年)
- たぴおか(1年)(後に合流)

でした。
 1年生のたぴおかは入学後に加入することになります。
 この頃は、去年予選落ちしたmitoとりんぱんまんがいるけど大丈夫かな〜、でもウエハラは結構喋るしキャサリンも去年結構喋るチームにいたしなんとかなるかな〜くらいに考えていたと思います。
 ちなみに、チームリーダーはウエハラでした。
 2年生でチームリーダーの経験がない状態で、学年もバラバラなチームのリーダーをうまく勤めてくれました。:crap:
 さすが委員長

 ちなみに、チーム名のマンゴーごはんに関してなんですが、これはキャサリンが好きと言っていたタイの料理らしいです。
 調べたところ、味付けしたもち米にマンゴーをそのまま乗っけて提供する屋台とかで出るような食べ物らしいです。
 一度、メンバーみんなで食べてみたいんですが、日本で食べれる場所ってあるのかな???(作るしかない??)

始まったアイディア出し

 出ないですね...
 いろいろなアイディア出し方法を試してみたんですが、プロコン向けなアイディアは全然なかったです。
 その中でもいまだにずっと印象に残っているアイディアがあって、アイディア出しの序盤くらいで出た、「粘着テープのようなものでサッカーボールを作って、それを子供に遊んでもらってゴミ回収をする」というものです。
 このアイディア、IT要素もなく粘着テープなボールをどうやって蹴るんだ...って感じですよね、楽しそうだけど。

沈黙のアイディア出し

 これは他の人の記事にも書かれるであろうことなんですが、本当にアイディア出し中喋る人があまりいなくて、mitoが無理やり喋ろう・しゃべらなきゃって考えていました。(結局あまりしゃべれていない)
 正直、mitoは自分が積極的に喋るというより喋っている人たちの話を整理することの方が性に合っていると思っているので大変でした。(去年含む)
 そこから出ないまま時が流れ、企画書提出締め切り約1週間前くらいになっていたと思います。
 時間もないということで、去年一昨年あったアイディアを新しく練り直し企画書も修正していきました。

企画書作成

 時間がありません!
 仕事を結構分担して作業していたのですが、それぞれの進捗は良くなく本当に終わるんか...?って感じでした。
 今見てみると、提出期限2日前の水曜日時点で、企画書全体の構成が確定していない・システム名決まってない・ロゴ完成していない・背景とニーズやばい・もう確定して色変更するだけな状態が開発計画とアルゴリズムの2枚(12枚中)・システム構成の矢印やばい・etc...
 今だから言えることで、この時期に自分のタスクにそこまで余裕があったわけではないのですが、mitoが全部やってしまわないといけない・終わらないのではと一人で考えて悶々としていました。
 結果的にはmitoがほとんど書いてしまうということもなく完成しました。
 結局今年度も自分たちのチームが一番遅くまで作業していて20時くらいに学校から帰り、最終版を提出したのは23時とかだったと思います。
 でも19時くらいには一通り終わって、チームメンバー全員で通しで流れを見た記憶があるので、去年よりはマシだったかなと思います。(正直、去年がどんな感じだったか覚えていない)

結果発表

予想

 正直、通るやろ!笑くらいの気持ちでした。
 はい、去年もそう思っていた節はあるのであてにならないうえに若干嘘ですね。
 確かに通るんじゃないかと思ってはいたけど、それ以上に落ちるとも思っていました。
 それは自分たちのチームだけでなく、うみまもると競技以外は落ちるとまで思っていました。
 GooTravelとunihomeはそれぞれ部門が違う感じが提出前からしていたので、それで落とされるのではないかと思ってました。(これは結果が出た後にるいことも話した記憶)

予選結果

 受かるとも落ちるとも思っていたので、結果発表の時はソワソワしてて結果を見て、自由部門に沖縄の文字が見えてめっちゃ嬉しかったし、課題部門見ても2チームとも通っててさらに嬉しかったです。
 それから少し経ってPCKの結果を見て、全チーム通過が決定しそれも嬉しかったです。

開発期間

mitoの考え

 企画書を書いている時点、なんならアイディア出しの時点でmitoは、「今年の開発はガチガチに設計など組んでガチ開発をしてやろう」と考えていました、そう考えていたんです。
 なので、他のメンバーには実際に開発をしてもらおうとしていた機能に似た機能を持つアプリの勉強を兼ねて開発をお願いしておき、自分はその間にどう設計を組んだら良いかどういう開発方針がいいかをいろいろ考え、GitHubのREADMEにひたすら書いていました。
 設計や開発方針を色々と考えていたのは、チームメンバーがAndroidに限らずチーム開発をあまりしたことがなかったため、つまづいてしまわないようにとmitoが開発しやすいようにという目的がありました。(最後は自己中)
 この時に、前にインターンシップでお世話になったメンターさん(ぎあもとさん)やぱらぱら、nemu_souなどにどういう風に開発を進めていけば良いか相談に乗っていただいていました。ありがとうございました。

開発はじめ

 開発では一番最初に、ConstraintLayoutというレイアウトの組み方を教え実際に体験してもらい、使えるぐらいにはマスターしてもらえたはずです。その後、Android開発の仕方(主に、ライフサイクルやリソースファイルに関して)を教えて、あとは各々に開発のヒントを出して調べながらやってもらうという方法で進めました。このときに、その開発期限を明確にしなかったのが問題の始まりではなかっただろうかと考えてます。
 開発期限を明確にしなかったのには一応理由があって、自分以外がAndroidアプリ開発ほぼほぼ初めてでどれくらいでその機能を調べながらできるかの予想ができず、自分の頃を思い出そうにも自分の場合は学業など他のことを気にせず集中してやっていたし3年以上前のことであまり覚えてなく参考にならなかったです。
 なので、時々進捗を聞いてどれくらいの期間で終われそうか各々決めていこうとしました。

進まない進捗

 そして、進捗を聞くと、
「まだ調べきれていないです」→「お、頑張れ〜」
「調べはしたんですがわからなくて」→「どこがわからない?」
「他が忙しくてあまり進捗生やせていないです...」→「プロコンだけが全てじゃないしな、頑張れ〜」
「一応書いたんですけど、なんかうまく動かなくて」→「コードをGitHubにあげて、見るから」→「あげます(あげるとは言っていない)」→「あげた?」→「あげていないです、あげます(あげるとは言っていない)」
みたいな感じで、想像以上に進んでいなかったです。何が悪いんでしょうかね(mitoが甘い)

嬉しい誤算

 その中でも、一番嬉しい誤算だったのがたぴおかです。
 彼女は一年生ということもあったので、mitoも周りもとりあえず開発やプロコンの雰囲気とかに慣れてもらおう、本人がやってみたいということ(プロコンに関すること)を優先的に挑戦してもらおうくらいの気持ちで考えていました。
 それで、本人に聞くと「コードが書きたい」ということだったので、最初に一番簡単な機能のタスクを与えました。
 すると、なんということでしょう。
 たぴおか「完成しました、プルリク投げました」
 mito「一番最初にプルリク投げてきて、それも完成して修正するとこもそんなないやんけ、ウケる」
 こんな感じでした。(多少の誇張や捏造はあります)
 そう、一番最初にプルリクを送ってきて、一番最初にタスクを終えたのです。(mitoを除く)
 この時は本当にびっくりして、素直にすごいと思いました。
 その後、まだコードを書きたいと言っていたので、少しずつ難易度を上げながらタスクを振っていったのですが、それらをことごとく、「完成しました、プルリク投げました」っていうので、超優秀だと思いました。
 そして、最終的にはりんぱんまんに振っていたタスクに近いレベルのタスクを投げても終わらせてきたので本当に驚き。
 mitoの50を超えるコードレビューに対しても折れることなく全て修正してきました。(優秀)
 このころあたりから、同級生とかと「1年生ってプロコンでこんなにコード書いたりタスクこなしたりだったけ?」という話を何回もした記憶があります。
 ここではたぴおかの話しかしてませんが他のチームの1年生である、きしりん・2tf・らずも優秀だと思ってます。
 たぴおかには開発以外でもアプリアイコン作成をやってもらいました、良いアイコンになったと思います。(若干横にずれてるけど)

他チームの方が聞きに来る状態

 夏休み後半や終わったあたりから、チームりんごのベーコンのるいこやきしりんからAndroidアプリ開発に関しての質問が飛んできて、自分のチームメンバーよりも多く質問され答えた覚えがあります。
 この時に、がっつりと質問に関する開発を教えながらうまく進めることができなかったのですが、そのツケが後々来ることになります...

結果

 Androidアプリ開発をmitoはずっとやっていたので、今回のプロコンの開発は例年よりスムーズに進んでいって、プロコン出発前にはデモで見せるような機能はほとんど出来上がっている状態でした。
 実際、本戦でのデモの前もデモ用のデータを追加したり少し修正したりくらいで済みました。
 ただ、本来であればそうでないといけないだろうし、mito的にももっと早めに一通り終わらせる予定だったのでそこは残念でした。

提出書類作成(操作マニュアルや動画、パンフレット原稿)

 基本的に、ウエハラにお願いしてそれっきりでした。
 例年通りみたいな結果になってしまって、申し訳なかったです。
 ベースをウエハラに書いてもらって、それをmitoやM教授が添削して〜っていう感じを繰り返していました。

チーム紹介動画

 チーム紹介動画に関しては、短い動画をいくつか撮ってそれをisatakuに投げて編集してもらいました。
 istakuには、この紹介動画以外にもプレゼン中に使う動画も作ってもらいました。
 編集がめっちゃ上手くて助かりました、ありがとうございます。
 この動画ではmitoとりんぱんまんがリフティングしてウエハラとたぴおかが話をした後に、mitoがチームメンバーに設計の話をしているところがあります。

プロコン行くまでの総括

 楽しかったです。大変だったけど

動かないSlackのチャンネル

 チーム結成からプロコンに行くまでの期間中、チームのSlackチャンネルでの発言がとても少なく、喋っているのはmitoかウエハラだけという状況がずっと続いていました。
 最初の方はまだ打ち解けていなかったのもあったと思うんですがあまり話し合い等は活発的ではなく、集まりもほとんどないような状態でしたがプロコンが近くなるにつれて自然とSlackでコメントする人も増えていって雰囲気も良くなってきていたと思います。(アイスブレイク大事ですね!)
 チーム開発やコミュニケーションなどで多くの問題点や課題が発生していました、それらに関しては都度、他のメンバーにもどうなっているかどうした方が良かったかというのを話していっているので、来年以降に活かされることを願っています。

やったこと

 今回のプロコン本戦に行くまでの期間で、mitoはメンバーに対してひたすらこれやった?これ今から考えなくていいの?という役割と進捗管理をずっとしていました。
 思っていたより、みんなやるべきこととか見えてなくて忘れてたり楽観視してたりしていました、それをmitoが問い詰めるみたいな形になっていたので、特にリーダーはリーダーとしての役割ができていないと結構落ち込んでしまっていたのですが、今年の経験を覚えて次に活かしてくれれば良いと思います。

最後に

 お気づきの方しかいないと思うのですが、この記事ではまだプロコンに行っていません!(表現が合っているのか微妙)
 なので続きの記事が存在します。それも2つ
 残りの記事は
- 高専プロコン移動部門
- 高専プロコン当日
 の話です、今から書くのでしばらくかかります。 (申し訳ないです。)
 お楽しみに!

一年の振り返り

この記事はICT Advent Calenderの21日目の記事です。

こんにちは、mitoです。
最近、Android関係で詰まったことなどばかりを記事にしていたのでどういう風に書けば良いか悩んでいます。

ICT Advent Calenderのまとめ記事

m-kyoujyu.hatenablog.com

前日の記事

hundo.hatenablog.com 前日は1年生のふんど君による記事でした。
1年生の頃から大会に参加していてすごいなという感想を抱いています。

「何が何でも何か一つは作る」

是非頑張って一つと言わずたくさん作って欲しいです。応援しています。
全力で絡みに来るらしいので全力で待っていますね。

はじめに

当初の予定では、アプリをリリースした話と振り返りをしようとしていたのですが ゲームにはまっていたせいで 諸々あって出来てないです。
関わった人に許諾を取っておたすけじゅーるを公開しようとしています。

まあ今回はアプリをリリースしてないのでただ振り返ってみようと思います。

※書き始める時はさっと終われるくらい短くしようとしていたんですが、今年あったことを書いていったら4000字近くにもなっていたので、興味ない方や忙しい方は最後らへんの「この一年」くらいを読むといいかもしれないです。

チーム決め〜プロコン結果発表まで

チーム(リーダー)決め

今年の初めごろにプロコンに参加するということでチーム「ましゅまろココア」が結成されます。
メンバーとしては、mito、りんぱんまん、えびな、えのき、cmyUEの5人です。
このチームでmitoはリーダーを務めていたのですが、結成される前はリーダーはしたくないと思っていました。

今年のチームのメンバー決めの前にリーダーやったことある人出来そうな人が集まって誰がリーダーするのかみたいな集まりがありました。
その時、割と人数がいたので「あ、これは自分はやらない感じになりそう」って思っていたのですが、気付いたらリーダーになっていました。
リーダーの役割が嫌いというよりはリーダーに自分は向いていなくて(優柔不断なので)、それよりも補佐的な感じでリーダーの人に「あれ、終わったの?、〇〇忘れてない?」みたいな感じでいう役割の方が向いていてそっちの方がやりやすいと感じているからです。

チームが結成されてからは、嫌々リーダーをやっていたわけではなく、「リーダーになったからにはちゃんとやってメンバーと一緒に本戦に行くぞ」とい気持ちで臨んでいたので心配しないでください。

アイディア出し・企画書作成

優柔不断なのと甘いというのもあってなかなかメンバーを集めてアイディア出しを行うことができませんでした。
結局、企画書にできそうなアイディアを出せたのは提出期限1週間前くらいで、企画書を1週間で作り上げないといけなくなりました。
なんとか提出日に遅くまで学校に残ってきしもんに手伝ってもらいながらりんぱんまんと完成させて提出することができました。(他のメンバーは寮生なので早めに帰ってもらいました)

結果は予選敗退でした。理由としてはギリギリにしかアイディアを出すことができていなかったのでそのアイディアが実現可能か実用性があるか調査・検討が出来ていない上に企画書に時間を当てられなかったのが大きかったと思います。

その後

プロコンの結果が出た後、チームのメンバーでもう一度集まってこれからどうするかという話をして、またこのチームで別の大会に出ようということで話が決まりました。

ですが、またメンバーを集めることができず結局流れてしまい、mitoが抜けました。
うまく回せなかったりメンバーを集めれなかったり途中で抜けてしまったりでメンバーには大変申し訳ない気持ちです。

プロコン後

プロコンに落ちチームからも抜けたmitoは大会に出ない人となりました。暇人ですね。
去年一昨年とパソコン甲子園からビジコンまで参加し1年中何かに参加しているということが続いたので、何の大会にも参加しないという日々が久しぶりで久しぶりでした。
久しぶりにこういった時間が確保できて、気持ちに余裕を持っていろんなことをできました。
Android Jetpackに関して調べたりゲームしたりエトセトラ...
PS4を買ったのでまたゲームにハマってしまいました...(現在進行形)

また、この時間を使って夏休みには3社にインターンシップに行きました。
インターンシップでは、いろんな知見が生えまくってとても良い経験となりました。本当にありがとうございました。
インターンシップに関してはいつかの高専だよりに掲載される予定なのでそこを見てください。(まだ書いていない)

Hack U

プロコン後、えびなとポテトとヤフー主催のHack Uに参加することとなりました。
こちらもなかなかメンバー全員で集まらず大会数日前にSkypeでアイディアが決まり、開発・プレゼン作成が始まるという超ハードスケジュールとなってしまいました。
また、その開発期間にmitoはインターンシップに来ており大会当日も参加しないという形になってしまい、大変申し訳なく思っています。(作品の様子等はインターンシップ先のHack U担当の方から聞きました)

パソコン甲子園

去年・一昨年と参加し両年でベストデザイン賞に終わったパソコン甲子園
もちろん、ベストデザイン賞も嬉しいんですが、グランプリ狙えると思っていたので残念だった大会です。
今年からは年齢の関係で参加出来ていないのですが、去年同じチームだった破壊神ことびーまかがいるチームがグランプリを取って、更に「先輩たちのリベンジができた」って言ってくれて最高に嬉しかったです。

しゅうがくりょーこん再来

去年の初めくらいから13thにAndroidアプリ開発を教えるというところから始まったしゅうがくりょーこん作成計画。

去年、mitoとnemu_souが教える立場になってAndroidアプリやサーバーサイドについて教えながら13thの5,6人くらいにしゅうがくりょーこんを作成してもらい、mitoが統合・調整して完成。
実際に去年の自分たちの研修旅行で使うことができました。

そして、今年の研修旅行でも使うみたいな話が出てきて自分は最初、去年のやつで重要なバグを直せば使えるなと思っていました。
しかし、デザイン等も一新して1から作り直すことになりました。
mosmos_syrcさんの勉強ということで1から作り直すことになりました。

そこまでは、「あ、やるんだ。頑張ってほしい」くらいにしか思っていませんでしたが、諸々あって研修旅行1ヶ月前くらいになっても作り始めていないという事態になってしまっていたので、急遽しゅうがくりょーこん作成にjoinすることが決まりました。😇(もともと教える予定ではありました)

joinした瞬間、もはやその前から炎上が確定しているプロジェクトはなかなか面白かったですよ。
なんやかんやあってなんとか当日までに去年より良い点呼を取ることができました。
他2人がAndroidアプリ開発初心者だったので教えながらなということと自分もあまり進捗を出すことが出来ずにギリギリまでコードを書いていました。
でも、去年よりバグ少なくできたしAndroid Jetpackの内容使えたし、設計についても考えられたし知見が生えまくったのでとても良かったです。(ギリギリまでやっていたのが良いわけではない)

Android講座

mitoが自分の知りうる情報を後輩に教えてAndroidアプリ開発について話ができる人が欲しいということから始まった講座です。
Twitterで軽く呟くと想定していた人数よりかなり多い人が反応してくれて嬉しかったです。
今の所、まだ一回しかできていませんがこの記事が公開される予定の今日に第二回、年明けた2019年には週一から2週に一度くらいのペースで行って行こうと思うのでお待ちを...!

この一年

この一年は本当に長く感じています。プロコンの企画書を書いていたのは遠い昔のような感覚。
この記事を書いていて「この出来事があったのは去年じゃなく今年だった...」みたいなのが多かったです。(初めてインターンシップ行ったのも今年だし...)

今年度から寮外生になり、3年生までのびっちり入った時間割と比べ物にならないくらいスカスカな時間割、大会に参加しない後期と色々と環境に変化があった年でした。
ただ、その空いた時間を今まであまりできなかったことに当てたり自分について考えたりする時間が多く確保できました。
ゲームにまたのめり込むこともできました。

今年はチームに対して大変申し訳ないことをしたのが多かったです。
来年、チームを組んで大会に参加するということになれば今年のようなことは起こさないようにしたいです。

最後に

最近、ゲームにハマってしまいICTに行く機会が減ってきているんですが年明けたらもっと多くの頻度で行きます、きっと。
長々と駄文になってしまいましたが、ここまで読んでくださった方には感謝の言葉しかないです。
明日は、去年卒業したコーヤ・ロードアゲイン先輩と同級生のがちゃみんです。
コーヤ先輩を知らない後輩達のために説明すると技術強強な面白い先輩です。
がちゃみんはきっと良い記事を書いてくれる。

コーヤ先輩:
がちゃみん:

mito.

"Plugin with id 'androidx.navigation.safeargs' not found."と怒られた

背景

 タイトルのままで、Android JetpackのNavigationで遷移先のFragmentに値を渡したくなって、safe-argsを使ってみようと試そうとし、公式のページとか見ながら追加しようとしたら怒られた。
 他のサイトとかも同じように書いてあったりしたので大丈夫かと思ったらそんなことはなかった...。

起きた問題

 この部分を参考に、app/build.gradleapply plugin: 'androidx.navigation.safeargs'を追加しました。
 そしてsyncさせると Plugin with id 'androidx.navigation.safeargs' not found.と言われてしまい :thinking_face:🤔
 見ていたページの前後を見てみても特にそれ以外に追加すべきなものを書かれていませんでした。

解決法

 ググって、stackoverflowでこのページを見つけました。
 この回答を見ると、"そのクラスパスじゃなくてこっちのクラスパスで試してみて"みたいなこと書いてあり、「クラスパス...?何か追加したっけ....」と思い、質問の方も確認して見ると...
 なんということでしょうapp/build.gradlededependenciesclasspathが追加されているではありませんか(某番組風)

ということでこの質問と回答を参考にapp/bundle.gradleに以下を追加しました。

        classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0-alpha05"

そして、syncすると通りました。

まとめ

 公式だけしか見ないのは罠
 pluginとして使うからclasspathが必要なのは当たり前なんて言われてしまうとごめんなさいとしか言えなくなります...
 直接は関係ないけど、gradleについてまだよくわかっていないので、"build.gradleにこれを追加して"と言われてもどれ...というお気持ちになってしまいませんか。なりませんか。

スコープのitでつまづいた

そのまま

失敗したコード

private fun setupView() {
  binding?.let {
    it.setOnClick {
      Toast.makeText(context, it.title.text.toString(), Toast.LENGTH_SHORT).show()
    }
  }

何がしたかったのか

?.letでbindingがnullじゃないことを保証した上で(binding?.hogeって書かなくて良いように)、スコープ関数を使ってクリックリスナーを設定、かつそのクリックリスナー内でView内のwidgetにアクセスして値を取得したかった

何がいけなかったのか

setOnClickの内外でitが指しているものが違う setOnClick外では、NonNullなbinding setOnClick内では、OnClickのリスナー

解決策

private fun setupView() {
  binding?.let {
    it.setOnClick { _ ->
      Toast.makeText(context, it.title.text.toString(), Toast.LENGTH_SHORT).show()
    }
  }

とかとか

まとめ

itは便利だけど何を指しているのかちゃんと考えて使おうな

こんなことで躓くのは自分しかいなさそう

mito.

ViewModelProvidersが使いたかっただけ

背景

既存プロジェクトにMVVMを導入しようとしてViewModelProvidersを使おうとした。

起こった問題

ViewModelProvidersを使うためにプロジェクトに

implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0-alpha1'

を追加し、Gradle Syncすると"Failed to resolve: fragment"と言われ失敗する。

解決方法

build.gradle内のrepositoriesの中にあるjcenter()とgoogle()の順番を入れ替える。
before

repositories {
        jcenter()
        google()
}

after

repositories {
        google()
        jcenter()
}

mito.

Android-KTXを使っているプロジェクトでAndroidX RefactorしてGradle Syncした時に見つからないと言われた時

背景

もともとAndroid-KTXを使っていたTwitterクライアントアプリケーションのプロジェクトをGoogle I/Oの発表が終わった時に AndroidX Refactorをしてみた

起こったこと

AndroidX RefactorをおこなうとJavaやKotlinのコードが書き換えられるだけでなくbuild.gradleのimplementationのリンク(?)も書き換わります。
書き換わった後にGradle Syncした際に、「android-ktxのcoreが見つからない」みたいなこと言われて失敗しました。

解決方法

AndroidX Refactorした際に、書き換えられた

implementation 'androidx.core:core-ktx:0.3'

implementation 'androidx.core:core-ktx:1.0.0-alpha3'

に修正します。

mito.