2020年9月を振り返る

今が一番過ごしやすい季節ですね。暑くなく寒くもなく。 それでは9月をさらりと振り返ります。

ディズニーシー行った

f:id:shoheikawano:20200930234241p:plain

熱狂的なディズニーファンの後輩さんのオススメもあり行ってきました。

ソアリンめちゃくちゃ良かったですね。小雨も降りつつ、人はこの時期多すぎず大変楽しめました。また行きたい。

引越しした

f:id:shoheikawano:20200930234247p:plain

もともとコロナ渦中になるだいぶ前(2019年11月くらい)から、上長/人事の方々に相談をしたりしていて、 結婚関連の行事を当分延期すると決めてから、自分の実家に近い福岡に引っ越ししました。当初の予定より少しだけスケジュールが前のめりになったという感じです。

こっそりほしいものリスト

その他

  • 本「妻は他人 だから夫婦は面白い」を読んだ

www.amazon.co.jp

こういうふうに二人でやっているよーみたいな感じの話。「食う寝る二人住むふたり」と近い感じでスルスルと読めて面白かった。

  • 映画「スペシャルズ」見た

考えさせられる系。「最強のふたり」と同じ監督の映画です。自分は「最強のふたり」が好きだったので見に行ったって感じです。 「最強のふたり」が好きだったらこの映画も好きかも。

www.youtube.com

最強のふたりはこちら

www.youtube.com

現在のところAmazon Prime Videoで無料で観れるようです。

以上です。 9月もお疲れさまでした!

Kotlin 1.4からStdlibの依存の記述がいらなくなるらしいメモ

f:id:shoheikawano:20200930231113j:plain

Photo by Marc Reichelt on Unsplash

タイトルのとおりですが、Kotlin 1.4のバージョンから、Kotlin Gradle projectではStandard Library org.jetbrains.kotlin:kotlin-stdlib-* の依存の指定が要らなくなるようです。 これは、Kotlin 1.4の記事にも記載されています。

What's New in Kotlin 1.4 - Kotlin Programming Language

Dependency on the standard library added by default You no longer need to declare a dependency on the stdlib library in any Kotlin Gradle project, including a multiplatform one. The dependency is added by default.

The automatically added standard library will be the same version of the Kotlin Gradle plugin, since they have the same versioning.

以下のコミットをたまたま見つけて、調べてみたら、あらそう書いてある、という感じでした。

github.com

Android、KMPなどのKotlinを使ったプロジェクトを開発している方はgradleまわりの記述を少し減らせるかもしれませんね。 雑メモ以上です〜✍

2020年8月を振り返る

最近は曇ったり雨が降ったり。引き続き暑いけどちょっとずつ秋に近づいている感がありますね。 今年はあと30%ちょっと。

それでは8月をさらりと振り返ります。

DTM入門した

Youtube見始めるところから。

ずーっと昔から気になっていたDTM(Desktop Music)という分野ですが、お試し期間を使ってソフト触ってみたりしています。 見様見真似と雰囲気で触ってるレベルです。でも面白い。

f:id:shoheikawano:20200822192408p:plain

興味ある!という方はこちらのサイトがとにかく面白いし幅広いのでやってみてください。

learningmusic.ableton.com

宮崎駿のアトリエ「二馬力 」を拝みに行った

f:id:shoheikawano:20200816145802j:plain

東小金井駅から歩いて5-10分のところにあります。とてもとても暑い日に行ったのですが、アトリエ周辺は木々の葉っぱが覆い被さっているような感じになっていて、周辺だけは別空間かのように涼しかった。。蝉の声もすごかった。来れてよかった。

その他

オリジナルノート作成してきた

hinine(ハイナイン)ノートというお店にてオリジナルノートを作りました。

hininenote.jp

作りましたといっても、色とかデザインとか紙質とかを選んだらあとは作ってもらうだけ。 簡単。ワクワクな感じでした。写真では伝わらないけど、想像以上にかっこいいなって思いました。

f:id:shoheikawano:20200903225206j:plain

f:id:shoheikawano:20200903225209j:plain

アトリエはまたいつか見に行きたいなーって思いました。

以上です。 8月もお疲れさまでした。

Twilio Video Androidサンプルを動かすまでの雑メモ

f:id:shoheikawano:20200903224648p:plain

Twilio Video Androidサンプルを動かす

TwilioのVideo Androidサンプルを動かす際にハマったことなどの雑メモです。 もう数ヶ月前のものなのですが、一応残しておこうとおもい記載。

主に以下のリンクを参考にしました。以下、雑メモです。

github.com

twilioコマンドを実行できるように、依存周りをbrew経由でインストール

brew tap twilio/brew && brew install twilio
brew upgrade twilio

loginを実行する

twilio login

SIDなどもろもろ

? The Account SID for your Twilio Account or Subaccount: ? Your Twilio Auth Token for your Twilio Account or Subaccount: [hidden] ? Shorthand identifier for your profile:

Created API Key XXX and stored the secret in your keychain. See: https://www.twilio.com/console/runtime/api-keys/XXX
twilio-cli configuration saved to "XXX"
twilio plugins:install @twilio-labs/plugin-rtc

warning @twilio-labs/plugin-rtc > @twilio-labs/serverless-api > @types/form-data@2.5.0: This is a stub types definition. form-data provides its own type definitions, so you do not need this installed. warning "@twilio-labs/plugin-rtc > @oclif/command@1.5.19" has unmet peer dependency "@oclif/plugin-help@^2". Installing plugin @twilio-labs/plugin-rtc... installed v0.1.4

twilio rtc:apps:video:deploy --authentication passcode

↑のコマンドを実行したところ、以下のエラーとともに失敗した

Something went wrong GotError [HTTPError]: Response code 409 (CONFLICT)

原因を調べてみると以下のようなissueが

github.com

たまにCLIプラグインが変な状態になることがあるから、トラブルシュートしてとのこと ↓

github.com

twilio plugins:update to update the rtc plugin to the latest version.
twilio rtc:apps:video:delete to delete any existing video apps.

上記2つを実行した上で、再度こちらを実行した

twilio rtc:apps:video:deploy --authentication passcode

今度は成功し、パスコードを無事に取得完了。

deploying app... done
Passcode: XXX
Expires: Sun Apr 19 2020 00:29:11 GMT+0900

こちらの記載をみると、パスコードの有効期限は一週間。以下のコマンドで新しいpasscodeを再生成できるとのこと。

The passcode will expire after one week. To generate a new passcode, run twilio rtc:apps:video:deploy --authentication passcode --override.

開発者が誰でもビルド可能な Community のFlavorでアプリをビルド。

.gradlew assembleCommunityDebug

Android OS Pie搭載のPixel 3 XLにインストールしようとしたら、以下のエラーが

adb: failed to install app/build/outputs/apk/community/debug/app-community-debug.apk: 
Failure [INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res=-113]

ABIの設定を行うために、以下を参考に設定してビルドし直す

github.com

adb install app/build/outputs/apk/community/debug/app-community-arm64-v8a-debug.apk

でインストール完了。

2020年7月を振り返る

残り40%きった〜。早い。最近は、毎日ほんとうに暑いですね。 8月も半ばになってしまいましたが、7月をさらりと振り返ります。

CA.apkでDFMの話をした

配信周りの準備含め、優秀な後輩さんがすべて行った。すげえという感想しかない。 アンケート結果から、満足度も高めだったようで良かった。久しぶりに登壇して反省もあったので引き続き精進。

DFMを使って機能追加を行った際のハマった点などの共有をしました。

id:STAR_ZEROさん、ツイッターにて、登壇資料に向けたご指摘ありがとうございました :bow:

もののけ姫を観た

映画館にて。映画館はしっかり一席ずつ間隔を空けて座るようになっていたり、検温していたりとコロナ対策が徹底されている印象でした。 もののけ姫は、今見ても圧巻だったし面白かった。

エボシ様の立場もアシタカの立場も、いろんな立場があってそれぞれ正義があるんだと思った。(?)森のこだまは怖可愛いかった。

f:id:shoheikawano:20200815163158p:plain

その他

アニメはソードアート・オンラインとリゼロをまたちょっとずつ見始めてます。 何回かみてきた「あの花」がAmazon Primeで配信始まってたのですが、観始めたらきっといっきに観してしまいそうで、控えています。 「あの花」見たことない人は、きっと泣いてしまうと思うので泣きたい人はぜひ!

(最近内容がないよう)

以上です!

HttpLoggingInterceptorのJsonログを整形して表示する

ふと思いついて調べてみたらさくっとできて便利だと思ったので📝です。

HttpLoggingInterceptor

OkHttpには、HttpLoggingInterceptorという便利なInterceptorが用意されています。 このクラスを利用することで、API通信時のヘッダー、レスポンスやリクエストボディーなどを簡単にLogcat上で確認できます。

基本的にな使い方や、どのような設定ができるか等は、以下のREADMEを読むのが良いと思います。

github.com

このクラスを利用することで、レスポンスやリクエストボディーなどの値を確認できますが、デフォルトの設定ではLogcatに表示されるJsonや配列の値は整形されません。 ここでは、表示する内容を事前に整形してログに表示するようにする方法をメモ程度に紹介です。

ログデータを整形する

HttpLoggingInterceptorには、コンストラクタ経由でLoggerを渡すことができます。 デフォルトでは、単純にlogを表示するだけの処理を行う、事前にライブラリ側が用意するLoggerがセットされています。

// HttpLoggingInterceptor.kt
class HttpLoggingInterceptor @JvmOverloads constructor(
  private val logger: Logger = Logger.DEFAULT
) : Interceptor {
...

interface Logger {
    fun log(message: String)

    companion object {
      /** A [Logger] defaults output appropriate for the current platform. */
      @JvmField
      val DEFAULT: Logger = object : Logger {
        override fun log(message: String) {
          Platform.get().log(message) // 単純にlogを表示するだけの処理を行っています
        }
      }
    }
  }
...

整形するためには

カスタムなHttpLoggingInterceptor.Loggerを定義し、HttpLoggingInterceptorのコンストラクタに渡すことで、どのような値をログに表示するかを制御できます。

以下、GsonとMoshiを用いた実装例です。

Gson

internal object InterceptorLogger : HttpLoggingInterceptor.Logger {
  private val gson = GsonBuilder().setPrettyPrinting().create()

  override fun log(message: String) {
    if (message.isJsonOrArray()) {
      Platform.get().log(gson.toJson(JsonParser.parseString(message)))
    } else {
      Platform.get().log(message)
    }
  }
}

private fun String.isJsonOrArray() = startsWith('{') || startsWith('[')

Gsonの場合は、setPrettyPrinting()という設定をして初期化することで、整形したJsonの値を返してくれます。

Moshi

// Moshi
internal class InterceptorLogger(moshi: Moshi) : HttpLoggingInterceptor.Logger {
  private val adapter = moshi.adapter(Any::class.java).indent("   ")

  override fun log(message: String) {
    if (message.isJsonOrArray()) {
      val jsonValue = JsonReader.of(Buffer().writeUtf8(message)).readJsonValue()
      Platform.get().log(adapter.toJson(jsonValue))
    } else {
      Platform.get().log(message)
    }
  }
}

private fun String.isJsonOrArray() = startsWith('{') || startsWith('[')

Moshiの場合は、adapterに対してindentというのを設定できます。各階層ごとにindentをうまく挿入して整形してくれます。

参考リンク等

Kotlin error関数

この記事内のKotlinのコードは、kotlin-stdlib-common 1.3.72 で確認しています。


見つけて便利だと思ったので📝です。

Javaでは、Non-nullが想定される値がnullだった際、例外を投げるコードを以下のように書けます。

if (nonNullIsExpceted == null) {
  throw new IllegalStateException("nonNullIsExpceted should not be null.");
}

上記のようなコードをKotlinでは以下のように書くことができます。

パターン1: throwを使う

if (nonNullIsExpceted == null) {
  throw IllegalStateException("nonNullIsExpceted should not be null.")
}

val valid = nonNullIsExpected ?: throw IllegalStateException("nonNullIsExpceted should not be null.")

パターン2: error関数を使う

if (nonNullIsExpceted == null) {
  error("nonNullIsExpceted should not be null.")
}

val valid = nonNullIsExpected ?: error("nonNullIsExpceted should not be null.")

Kotlinの例は、パターン1も2も同じ意味のコードとなります。 error関数の実装はこのようになっています。 渡したメッセージとともにIllegalStateExceptionを初期化しthrowしているのみです。

/**
 * Throws an [IllegalStateException] with the given [message].
 *
 * @sample samples.misc.Preconditions.failWithError
 */
@kotlin.internal.InlineOnly
public inline fun error(message: Any): Nothing = throw IllegalStateException(message.toString())

短かく書けて直感的だと思いました。 また、message引数がNon-nullで、必ず何かしらのエラーメッセージを記述するAPI仕様になっているのも良いなと思いました、まる。

kotlinlang.org