Kotlin の takeIf を使ってみる

takeIf は知ってるが、どうも使ったことがなく、何か良いことがあるのか分からない。

公式ドキュメントはこちら(すごくシンプル)

takeIf - Kotlin Programming Language

試しに使ってみるか

こういうdata classがあったとして

data class Status(
    val isError: Boolean = false,
    val data: Int = 0
)

例えば

  • isErrorがfalseなら、dataの値を取得して処理を継続させたい
  • もしisErrorがtrueならreturnして処理は停止させる

という動きにする。

ifパターンと、takeIfパターンのコードを書いてみた。

/**
 * ifパターン
 */
fun useIf(status: Status) {
    val data = if (!status.isError) status.data else return
    println("$data を使う")
}

/**
 * takeIfパターン
 */
fun useTakeIf(status: Status) {
    val data = status.takeIf { !it.isError }?.data ?: return
    println("$data を使う")
}

うーん、どっちでもいいな
takeIfを使わなくてもやっていけそう

むしろ有効活用してるコードを見てみたい、自分が知らないだけか...

AndroidのversionNameを自動管理する

この記事はQiitaに投稿した記事と同じ内容である。 Qiitaからいつ退会してもいいように、自分のブログにもコピーしておく

問題

apkを配布するために、app/build.gradle のversionNameのみをインクリメントしてプルリクエストを出す。

これはなかなか面倒だし、手間だなと思った。

versionName なんて修正するまでもなく、自動で加算されてほしい。

どうしたか?

そこでversionNameに日時にしてはどうだろう?

イメージはこんな感じ

static def getCustomVersionCode() {
    return new Date().format('yyMMddHHmm').toInteger()
}

android {
    compileSdkVersion 29
    defaultConfig {
        applicationId "com.xxxx"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 1
        versionName "1.0-${getCustomVersionCode()}" // <= yyMMddHHmm が追加される

これをビルドしたapkの versionName はこうなる

android:versionName="1.0-2004270921"

これでversionNameを毎回修正する必要なくなった。

デメリットは、エラーが発生したときにどのバージョンなのかを特定する必要がある。
エラー情報にversionNameが含まれていれば特定できるんだろうけど。

使用コード

https://github.com/ikemura23/Android-Kotlin-Lab/blob/master/app/build.gradle

t_wadaさんのペアプロ講座を受けてきた

会社の勉強会になんと t_wada さんが来てペアプロについてトークしてくれた。

自分は家からリモートで参加。
用事で呼び出されたり、娘をトイレにつれていったりと途切れ途切れで見聞きしながらメモしてた。

そのメモを雑にブログに投稿しておく。

ペアプロに必要な環境

  • 指差しできる大きさのモニター
  • マウスとキーボード

ノートPCで画面が小さいのではオススメできない。
実装中に指差しでコードの位置を知らせる必要があるので、画面の大きさは大事。

キーボードは2台あってもよい。
自分の入力しやすいキーボードを用意するのもOK

以下、メモの羅列

  • 現代のソフトウェア開発はレビューがボトルネックになっている。
  • ペアプロメインでコード書くプロジェクトがある(すごい)
  • ペアプロで喋ると技術だけでなく、感情の共有ができる
  • 書いたコードをリリースするまでのスループットが高い
  • なぜならペアプロで書いたコードはレビューを受けた状態となり、手戻りが少ないから。
  • 一人で実装だとプルリク→レビューの順番待ちとなり、レビューがボトルネックになるから。
  • ペアプロするために承認をもらうコツは「ダブルチェックになるから」
  • ペアプロを受け付けられない人が2割ほどいる(実装をみられたくないなど)
  • そういう人はソロ開発でもよい、ムリにペアプロを押し付けてはいけない。

最後に感想

これまでの自分のペアプロの印象は
「よく分からない箇所を知ってる人とやると効率がよくて便利」
くらいしか持っていなかった。
こんなたくさんの付加価値があるとは予想外だった。

ペアプロはあくまで手段である。
隣に座ってのペアプロは距離が近いため、受け付けられない人はソロ開発でいい。

ペアプロすごい!
今度試しにやってみよう

Flutterアプリ開発に役立ちそうなコード/ライブラリ/ノウハウ一覧

Flutterでアプリを実装し始めると、「どう書くのがベストなのか?」や「どう配置するのがベターなのか?」と悩み始めた。
そういう時はGitHubで公開されているコードやアプリを参考にしたくなる。

そこで、Flutterアプリ開発に便利そうなコード/ライブラリ/ノウハウを集めてみた。

Flutter公式 : Write your first Flutter app, part 1

https://flutter.dev/docs/get-started/codelab

どのサイトを見てもまずFlutter入門としてここが紹介されいる。
Flutterのプロジェクト作成、シンプルなアプリ作成を丁寧に教えてくれる。

Flutter公式 : Cookbook

ここもFlutter入門としてどこでも紹介されている
アプリの作成中に一般的な問題を解決する方法を示すレシピ集

https://flutter.dev/docs/cookbook

Flutter公式GitHubのサンプル

Flutterスキルの向上に役立つサンプルアプリ、デモ、サンプルが紹介されている。
公式のFlutterチームが厳選したリストらしい
20個くらいのアプリが紹介されている(GitHubリンク付き)

https://github.com/flutter/samples/blob/master/INDEX.md

Flutter Community

Flutter Communityなるものがあり、アプリの公開リストとMedium記事が紹介されている。

List of open-source Flutter apps | It's All Widgets!

Flutterで構築されたアプリのGitHubリスト

https://itsallwidgets.com/?open_source=true

Flutter Community – Medium

良質な記事がたくさんありそう

https://medium.com/flutter-community

Solido/awesome-flutter

awesomeシリーズのFlutter版
記事、動画、プラグインフレームワークオープンソースアプリ、なんでもござれ

https://github.com/Solido/awesome-flutter#articles

Flutter Awesome

Flutterのアプリ、ライブラリ、UIテンプレートが紹介されている
細かくカテゴライズされており、ジャンルや部品毎に検索も可能

https://flutterawesome.com/

Puppeteerのpage.evaluateとpage.$はどちらがいいか

疑問

スクレイピングではPuppeteerをよく使うのだが、page.evaluate()page.$()の違いがよく分からなかった。

ちなみに、自分はpage.evaluate()しか使ったことがない。

回答

何が違うのか、どちらを使うべきか、その疑問が以下リンクを見つけて解決した。

stackoverflow.com

質問者も同じ疑問を持っており、page.evaluate()のほうが作業しやすい、と意見している。

回答が素晴らしいのでまとめてみた。

これらのコード行の主な違いは、Node.jsとブラウザー環境の間の相互作用です。

page.evaluate()は次のことを行います。

  • document.querySelectorブラウザーで実行し、要素ハンドルを(Node.js環境に)返します
  • getPropertyハンドルで実行し、結果を(Node.js環境に)返します
  • ブラウザ内の要素をクリックします

page.$()は単にこれを行います。

  • ブラウザーコンテキストで指定された関数を実行します(そして結果をNode.js環境に返します)

性能

これらのステートメントのパフォーマンスに関して、操り人形師はWebSocketsを介してブラウザと通信することを覚えておく必要があります。したがって、ブラウザに送信されるコマンドは1つだけなので(2つとは対照的に)、2番目のステートメントは高速に実行されます。

接続しているブラウザが別のマシンで実行されている場合(を使用して接続されている場合puppeteer.connect)、これは大きな違いをもたらす可能性があります。スクリプトとブラウザが同じマシン上にある場合、わずか数ミリ秒の差が生じる可能性があります。したがって、後者の場合、大きな違いはないかもしれません。

要素ハンドルを使用する利点

要素ハンドルを使用すると、いくつかの利点があります。まず、のような関数elementHandle.clickは、を使用するのとは対照的に、より「人間らしい」動作をしdocument.querySelector('...').click()ます。puppeteerは、たとえば、click関数を実行するだけでなく、マウスをその場所に移動し、要素の中央をクリックします。

何を使用するか

一般に、page.evaluateこのAPIデバッグもはるかに簡単なので、可能な限り使用することをお勧めします。エラーが発生した場合、ChromeブラウザーでDevToolsを開き、ブラウザーで同じ行を再実行することにより、エラーを簡単に再現できます。多数のpage.$ステートメントを一緒に混在させている場合、問題が何であるか、Node.jsまたはブラウザーランタイム内で発生したかどうかを理解することははるかに困難です。

要素をより長く必要とする場合は、要素ハンドルを使用します(複雑な計算を行ったり、外部イベントから情報を抽出する前に外部イベントを待機した可能性があるため)。

結論

  • page.evaluateを使おう
  • デバッグもエラー再現も簡単

Raspberry pi Camera v2 のケース探し

pi camera v2を使うことになり、カメラのケースは何があるのかと探してみた。

結論を先に書いちゃうと、選択肢は少なく、思ったよりいいモノはなかった。

カメラケース達

三脚マウントナット付きPiカメラケース - スイッチサイエンス

コンパクトなカメラケース 、三脚マウントナットがついてるらしい。
個人的には有力候補

www.switch-science.com

楽天市場Raspberry Pi Camera Case - Black Plastic:マルツオンライン

Amazonでも見かけたけど楽天のリンクを張っちゃう。
「pi camera v2ではフィットしない」という書き込みも見かけた、本当だろうか。

item.rakuten.co.jp

SmartiPi Touch - Raspberry Pi オフィシャル 7" ディスプレイ用ケース、スタンド

モニターケースとカメラがセットになったモノ
カメラ部分はLEGOブロックの形になってるらしい。

www.amazon.co.jp

モニタが不要なら、カメラケース単体でも売ってる。

item.rakuten.co.jp

ラズベリーイカメラフレーム/マウント:ロボショップ

コンパクトで4段階の角度を調整可能
三脚取り付け穴も付いている、いいね

item.rakuten.co.jp

自分が選んだケース

ケースとカメラがセットの SmartiPi Touchにした。

今回はタッチパネルモニタも欲しかったので、自分のニーズと一致したし。

海外のサイトだと、3Dプリンタで自作してる人も多い。
やっぱりそれが1番ベストだよね、自分はできないけど。

Atomで短形選択する方法

Atomをインストールするたびに毎回忘れるので記録しておく

結論

sublime-style-column-selectionパッケージをインストールする

これで短形選択が可能になる

スクリーンショット_2019-05-20_8_57_07.png

短形選択の方法

macだとoptionキー(winだとalt?)を押しながらカーソルを動かす。

パッケージインストール後はエディタの再起動不要で使用可能だった。