RunCat - Mac メニューバーでCPU利用率を表示できる

こんな便利でかわいいアプリが無料です。



‎「RunCat」をMac App Storeで

さらに、アプリ内課金で購入すれば、いろいろなキャラが走ってくれます。

RunCat

画像を用意すれば自分でキャラも作成できるようです。

ぜひ、お試しあれ!!


Android で ダークモード

流行りですか、ダークモード。

Mac Mojave とか Chrome とか、

画面はダークな方面に進んでいるようですが。

How to use Dark Mode on your Mac - Apple Support

本当に目に優しいのかどうかは知らんけども、

バッテリーには間違いなく優しそう。

Android端末でも設定してみましょう。

端末のテーマ


設定 (Settings)

↓

ディスプレイ (Display)

↓

詳細設定 (Advanced)

↓

端末のテーマ (Device Theme)

↓

ダーク (Dark)

これだけでは、変更されなかったり。

以下「夜間モード」と関係を持ちながらテーマ変更されているようです。

夜間モード


設定 (Settings)

↓

システム (System)

↓

詳細設定 (Advanced)

↓

開発者向けオプション (Developer Options)

↓

夜間モード (Night Mode)

↓

常にON



階層が深い「設定」項目は上部検索窓から検索できますが、日本語の場合、それぞれキーワードは

「端末のテーマ」

「夜間モード」

くらいになりそうです。

その他、Chrome など各アプリも個別に対応をしてたり、してなかったり。

微妙です。

👉 Chrome ダークモードの選択しているタブが見づらい 

しかし、

最近の日本語を利用しての検索ワードの選択は難しくなってきてません?

How to enable Android dark mode everywhere it's available - 9to5Google


Android Q で本当に戻るボタンがピルボタンに統合されるのか。

Android Qでは戻るボタンがなくなる…? | ギズモード・ジャパン

Pの実装状態を見る限り明らかに左方向は意図的に開けてるよな。



ピルボタン(ホームボタン) の 使い方 と アプリ履歴 の 一括削除 【Android Pie】

しかし、いまやボタン一つの操作方法多すぎじゃね?



Gboard 日本語 12キー 左右のカーソルキーを使ってすばやく上下移動する方法

いちいち

「ボタンをみたら上下左右にグリグリ」

やってみるとかなあ。


「単語リスト(ユーザー辞書)」が変換候補に表示されない場合

Gboardで単語を登録しても変換候補に反映されないときは、

キーボードの設定

単語リスト(ユーザー辞書)

学習した単語を削除

です。

どうやらキーボードアプリによっては(Gboardなど) これまでの入力内容によって自動作成された候補文字列が優先的に変換候補に表示されるようです。

自動作成される変換候補は今現在では意外と使えないので削除してもいいと思いますけども。

それでもダメな場合は、Gboardのキャッシュを削除すると良いです。


「設定」

  ↓

「アプリ」

  ↓

「Gboard」

  ↓

「ストレージ」

  ↓

「キャッシュを削除」

Android OS デフォルトの単語リスト登録画面よりは、「顔文字/絵文字辞書 単語リスト」が便利です。

顔文字や絵文字もガツガツ登録できます。

👉 顔文字/絵文字辞書 単語リスト - Google Play のアプリ 

👉 Gboard でユーザー辞書が変換候補に反映されない場合 


SpaceX REST API で試す Retrofit の coroutine 対応

Retrofit の coroutine 対応が進んでいるようです。

Jake Wharton's retrofit2-kotlin-coroutines-adapter has been the go-to solution for bridging the coroutine world with Retrofit for a little while. But now, a much-anticipated PR has finally been merged, officially bringing coroutine support to Retrofit 2.

Retrofit meets coroutines - zsmb.co

JakeWharton/retrofit2-kotlin-coroutines-adapter: A Retrofit 2 adapter for Kotlin coroutine's Deferred type.

SpaceX-API とか公開されていたのですね。

r-spacex/SpaceX-API: Open Source REST API for rocket, core, capsule, pad, and launch data

https://api.spacexdata.com/v3/rockets

対応する最小限のデータクラスを作って、試してみましょう。


data class Rocket(

    val id: Int,

    @field:Json(name = "rocket_name") 
    val name: String

)


val retrofit = Retrofit.Builder()
    .baseUrl("https://api.spacexdata.com/v3/")
    .addConverterFactory(MoshiConverterFactory.create())
    .build()

val api = retrofit.create<SpaceXApi>()

create() は reified type が使えるようになってます。

JSONのシリアライズはお好みのものを。

そして、interface を書いていきますが、

ここを戻り値に別に見てみます。

Call<List<Rocket>>

interface はこれまでと同じ記述。


interface SpaceXApi {

  @GET("rockets")
  fun getRockets(): Call<List<Rocket>>

}

受け側の3つの例。


runBlocking {
  val rockets: List<Rocket> = api.getRockets().await()
  rockets.forEach(::println)
}


runBlocking {
  val rockets: List<Rocket> = try {
    api.getRockets().await()
  } catch (e: Exception) {
    println("Network error :[")
    return@runBlocking
  }
  rockets.forEach(::println)
}


runBlocking {
  val response = api.getRockets().awaitResponse()
  if (response.code() == 200) {
    response.body()?.forEach(::println)
  }
}

結果はすべて同じ。


Rocket(id=1, name=Falcon 1)
Rocket(id=2, name=Falcon 9)
Rocket(id=3, name=Falcon Heavy)
Rocket(id=4, name=Big Falcon Rocket)

これまで非同期処理時に必要だった コールバック や enqueue の記述は必要ありません。

受け側の記述を変化させることで、Exception や レスポンスコードを拾うことができます。

suspend List<Rocket>

suspend を使うことでさらに直感的に書けます。


interface SpaceXApi {

  @GET("rockets")
  suspend fun getRockets(): List<Rocket>

}


runBlocking {
  val rockets = api.getRockets()
  rockets.forEach(::println)
}

結果。


Rocket(id=1, name=Falcon 1)
Rocket(id=2, name=Falcon 9)
Rocket(id=3, name=Falcon Heavy)
Rocket(id=4, name=Big Falcon Rocket)

List<Rocket> に対して Call や Deferred のようなラッパーは必要ありません。

suspend Response<List<Rocket>>

Response を拾います。


interface SpaceXApi {

  @GET("rockets")
  suspend fun getRockets(): Response<List<Rocket>>

}


runBlocking {
  val response = api.getRockets()
  if (response.code() == 200) {
    response.body()?.forEach(::println)
  }
}

結果。


Rocket(id=1, name=Falcon 1)
Rocket(id=2, name=Falcon 9)
Rocket(id=3, name=Falcon Heavy)
Rocket(id=4, name=Big Falcon Rocket)

最も実用的で簡潔な記述と思われます。

まとめ

Kotlin で記述するにしても、多くの記述が可能となりそうです。

RxJava他ライブラリを利用しての非同期実装を含めると様々となります。

ネット上で検索するにも自分の環境や好みに合った記述を探すのにも時間がかかることになり混乱もありそうで。

Jakeも今後はメンテしないと思われます。

Márton Braun on Twitter: "Retrofit is finally receiving the proper coroutine support it deserves! Read more about it in my latest blog post here: https://t.co/8k9EauzzUa #AndroidDev #Kotlin #Coroutines" / Twitter

ちなみに、これらの話は今現在はSNAPSHOTで進行中です。

以下でどうぞ。


repositories {
  maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
}

dependencies {
  implementation "com.squareup.retrofit2:retrofit:2.5.1-SNAPSHOT"
}