Droidkaigiのリポジトリを参考に自分でGradle Pluginを作成してみる

Droidkaigiのリポジトリのように、マルチプロジェクトで設定ファイルを共有する仕組みを知りたいと思って幾星霜。

今まで重い腰が上がらなかったのだが、Wear OSのプロジェクトが設定をベタ書きにしており非常につらい思いをしていたので、必要に迫られてやることにした。誰かの参考になれば幸いである。

Read full post gblog_arrow_right

Modifierの適用順序、難しすぎん?

最近になってようやくJetpack Composeを触り始めた。

はじめはとっつきにくいなあ、レイアウトはXMLでいいじゃんとか思っていたのだが、慣れてしまえば不思議なものである。レイアウト見るためにいちいちXMLファイル見に行くほうが面倒くさいじゃんと今では感じるようになった。

しかしJetpack Composeでもよくわからないことがある。それがModifierである。

Read full post gblog_arrow_right

OkHttpを使ってAndroidでネットワークリクエストを行う

Android端末でネットワークリクエストを行う方法について書いてみる。APIを叩く=Retrofitを使うという図式があるのだが、まずその前段階としてOkHttpを使ってネットワークリクエストをしてみようと思う。

Androidでネットワークアクセスする記事ってあんまりないかもって思ったので書いてみることにした。ついでにいうとリハビリを兼ねてというのと、自分でも振り返ってみるとどうやるんだっけってなったのがきっかけである。

Read full post gblog_arrow_right

IntelliJ IDEAのラインセンスを更新した

去年なんかのキャンペーンでIntelliJ IDEAのAll product ライセンスパックが割安で購入できたので、とりあえずAll Productを買って1年過ごしてみた。あらゆるJetbrains製品が使えるのは最高にエキサイティングな経験であった。

が、残念ながら私にはまったく使いこなせなかった。いや、いくらなんでも全部は使い切れないでしょ。ということで、今回はIntelliJ Idea Ultimateにダウングレードしてライセンスを更新することにした。

Read full post gblog_arrow_right

Kotlin Heroesに挑戦してみた

Kotlinを使ったプログラミングコンテストに参加した。たまたまTwitterで流れてきたのを見て、たまたま時間が空いてたので挑戦してみた。

https://codeforces.com/contests

腕試しになるかなぁという程度の軽い気持ちでの挑戦であったが、「俺ってまったくできないじゃん」と凹む結果に終わってしまった。 そんなに深刻になるレベルではないけれど、それなりにできるんじゃないかという妙な自身は見事に砕かれた。 もっと地道に精進しようと反省である。

Read full post gblog_arrow_right

KotlinのgroupingByについて調べてみた

KotlinにgroupingByなる関数があることを知った。 https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/grouping-by.html Groupingソースなるものを作成するための拡張関数で、listとか配列で使うことができる。 https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-grouping/index.html 例えば”I have a pen”で各アルファベットが何回出現しているかを調べるのに使える。 val result = "I have a pen".groupingBy { it }.eachCount() println(result) // {i=1, =3, h=1, a=2, v=1, e=2, p=1, n=1} groupingBy自体は続く関数オブジェクトで求められるkeyを元にしたMapへ集計できるようにするためのインターフェースで、これ自体呼び出しても何も起こらない。上記の例でいうとeachCount()を呼び出して初めて集計が行われる。 groupByとの違い keySelectorを引数に取るのはgroupByもgroupingByも同じ。 groupByだと指定したkeyごとの要素をListにもつMapを返す。イメージ的にはmapに近い処理。 groupingByはそれ自体は何もしない。keyを元に集計処理を行うインターフェースを用意するだけのメソッドなので、その後に別途集計処理が必要になる。forEachを拡張したものと考えるといいかもしれない。 両者の使い分けは、keyを元にした要素のリストがほしいのか、それともその要素を何らかの処理をして集計した結果だけが欲しいのかで使い分けることになるだろう。集計した結果のみが必要なのであれば、その中間形態であるkeyごとの要素リストは不要なので、groupingByを使ったほうが効率的である。 集計処理 groupingByだけでは集計処理は行われないので、その後に以下のいずれかを利用して集計を行う。 aggregate fold reduce eachCount それぞれ別にxxxToという処理も用意されていて、違いは集計先のMapが指定できるかどうか。Toがついている方は、既存のMapが集計先に利用されるので、前の集計結果にさらに付け足すのに使える。Toがつかない方は空のMapが集計先として利用される。 groupingBy自体は要素のグルーピングを行うわけではなく、aggregateなどを呼び出すことで初めて要素のグルーピングと集計が行われる。 fold / reduce / eachCount の使い分け よほど特殊な事情がない限り、aggregateを直接使うことはないと思われる。大体のケースでfoldを使ったほうが便利だろう。 というのも、aggregateは要素がkeyによるグルーピングを行った最初の要素かどうかを判定したりするのも全て自分で書く必要があるからだ。要素が初出の場合に初期値を用意し、そうでない場合に集計処理をするというのがfoldなので、大抵のケースでfoldで事足りるはず。 最終的にはどれを使ってもList<何らかの型>がMap<指定したキー, 集計後の結果>に集計される。(元のデータがListとは限らないけれど、最終的にMapに集約されるのは変わらない) eachCount keyごとの要素の個数が欲しい場合にこれを使う。引数もいらないので最もシンプル。 foldとreduce 要素の集計にロジックが必要な場合にこちらを利用する。オブジェクトの特定のフィールドだけが集計対象であるときなどに利用することが考えられるだろうか。 どちらも集計処理を行う関数オブジェクトを引数にとるのは同じ。 違いはfoldは集計値の初期値を設定する必要があるが、reduceは初期値すら省略できるというところ。reduceはkeyごとに出現した最初の要素が初期値に使われるからである。 集計処理を行う関数オブジェクトは、集計後の値を返すような関数オブジェクトにすればいい。この関数オブジェクトの戻り値が、次の要素のaccumulatorの値になる。 foldとreduceの違い 集計結果が要素と同じ型になるのかどうかが使い分けの分岐点となる。集計結果が元の要素と同じ型ならreduceを使ったほうが便利(初期値の指定がいらないので)。 というのもreduceの初期値はkeyごとに最初に出現した要素になるからである。だから型の変換が行えない。 data class SalesInfo(val id: String, val date: Date, val sales: Int) val dailySales = listOf(...) // 日々の売上データ // 商品IDごとに売上を集計 val sum = dailySales.groupingBy { it.id } .fold(0) { _, acc, element -> acc + element.sales } println(sum["hoge"]) // 商品ID"hoge"の1ヶ月分の売上を表示 上記の例で言えばSalesInfo型の要素をInt型に集計している。このケースではreduceは使えない。
Read full post gblog_arrow_right