Kotlinのレシーバ付き関数リテラルとは

Kotlinにはレシーバ付き関数リテラルと呼ばれるものがあります。
私自身としては、単語自体は聞いたことがあるけれど、それが何者なのかは分からないといった状態が続いていました。

本記事では、各用語の意味を整理しながら、レシーバ付き関数リテラルについて説明していきます。

  • 関数リテラルとは何か
  • 関数オブジェクト
    • 無名関数による関数オブジェクトの生成
    • ラムダ式による関数オブジェクトの生成
  • レシーバとは何か
  • レシーバ付き関数リテラルとは何か
  • レシーバ付き関数リテラルの使い方
続きを読む

asyncAll()という拡張関数を作ってKotlinのリスト操作の中で並列処理を実行する

前回の記事でawaitAll()を使ったリスト操作の中で並列処理を実行した結果の待ち合わせについて書きました。

tkhs0604.hatenablog.com


その中で、並列処理を実行するときに毎回map { async { hoge() } }と書くのは辛いと思ったので、asyncAll()という拡張関数を作りました。

続きを読む

Kotlinのリスト操作の中でCoroutinesのasync()で並列処理を実行した結果を待ち合わせる方法

タイトルが非常に分かりづらくて申し訳ないです🙇‍♂️
Kotlinのリスト操作の中でネットワーク通信のような時間のかかる処理を並列に実行したい場面があったのですが、Coroutinesを使ってその結果を待ち合わせる方法が最初分からなかったので、本記事はそのメモです。

続きを読む

OSバージョン間の差分を考慮したAndroidのThemeの定義方法

OSバージョン間の差分を考慮したAndroidのThemeの定義方法について整理してみました。基本的にはAppCompatライブラリの定義方法を参考にしています。
Themeについては以下の公式ドキュメントをご参照ください。

developer.android.com


以降は、Android 7.0で追加されたマルチウィンドウAndroid 9で追加されたディスプレイ カットアウトに関する設定をThemeに追加するケースを例とします。

続きを読む

AndroidでHaptic Feedbackを実装する

本記事では、iOSではおなじみのHaptic Feedback(触覚フィードバック)をAndroidで実装する方法について記載しています。
Android Dev Summit 2019」の動画で実装例が紹介されていたので、こちらを参考にしました。


Haptic FeedbackについてはMaterial Designの以下のページが参考になります。

material.io

続きを読む

ディスプレイにおける解像度の話

解像度についていろいろと調べてみました。
解像度の表し方が分野によって異なることが調べていて分かったので、本記事ではPCやスマートフォンのディスプレイにおける解像度についてだけ取り扱います。

なお、本記事は各用語の大まかな意味を理解することを重視しているため、正確でない表現がある可能性があります。
ただ、説明として明確に誤っている内容がありましたらご教示いただけますと幸いです🙇‍♂️


続きを読む

ConstraintLayout下でlayout_widthにwrap_contentを指定したTextViewが制約を無視してはみ出すときの対処法

(タイトルが長い…笑)

以下のようなレイアウトを作成するときにハマった話です。
左右に可変テキストがあり、テキストが長くなって画面に収まらなくなるときに左側の可変テキストの末尾が省略される仕様を想定しています。
(余談ですが、Layout Editorではandroid:ellipsize="end"の指定は見た目に反映されないのですね…)

f:id:tkhs0604:20200516093441p:plain:w400
デフォルトのレイアウト
f:id:tkhs0604:20200516093444p:plain:w400
左側の可変テキストが長くなったとき
f:id:tkhs0604:20200516093449p:plain:w400
右側の可変テキストが長くなったとき
続きを読む

Dartのコンストラクタの書き方

最近Flutterの勉強を始めたのですが、Dartのコンストラクタの書き方が今まで触ってきた言語(主にKotlin、Java)に比べて少しとっつきにくく感じたので、基本的な部分を整理するために書いている記事です。

内容としては、主に以下のページから関連する箇所をピックアップしたものになります。

dart.dev


続きを読む

ターミナルでzshにPATHを通す方法

macOS Catalina以降でデフォルトのシェルがzshになってからPATHを通す作業を初めて行ったので、備忘録を兼ねて。
なお、MojaveなどからOSアップデートした場合はデフォルトのシェルがbashのままになっているようですが、公式サイトにzshへの変更方法が記載されていました。

support.apple.com


少し話が逸れましたが、ターミナルでzshにPATHを通す方法は以下の通りです。

  1. ホームディレクトリ直下に.zshrcというファイルがあるか確認する(なければ新規作成する)
    • find ~/.zshrcなどでファイルがあるか確認できる
    • touch ~/.zshrcなどでファイルが新規作成できる
  2. Vimなどで.zshrcファイルを開き、以下の1行を追記する
    export PATH="$PATH:[追加したいディレクトリの絶対パス]"
  3. .zshrcファイルを閉じ、以下のコマンドを実行する
    source ~/.zshrc


作業としてはこれだけなのですが、ディレクトリの絶対パス~(チルダ)を指定しても展開されなかったり($HOMEは展開されました)、exportコマンドを.zshrcファイルに記述するのではなくターミナルで実行していたせいで一時的にしか有効にならなかったりと、地味に苦戦してしまいました🤦‍♂️


※追記

  • 2.で"を付けずにexport PATH=$PATH:[追加したいディレクトリの絶対パス]と記述すれば、ディレクトリの指定に~が使えました。

    • OK: export ANDROID_HOME=~/Library/Android/sdk
    • NG: export ANDROID_HOME="~/Library/Android/sdk"
      • ~/Library/Android/sdkという文字列がそのまま環境変数ANDROID_HOMEに設定される
  • 上記の"を付けない記述方法において[追加したいディレクトリの絶対パス]にスペースが含まれるときは、\(バックスラッシュ)をスペースの直前に追加してエスケープする必要がありました。

    • OK: export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jre/jdk/Contents/Home
    • NG: export JAVA_HOME=/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home
      • not valid in this context: Studio.app/Contents/jre/jdk/Contents/Homeのように、スペース以降が無効な文字列として認識される