日々是好日

プログラミングについてのあれこれ、ムダ知識など

時刻をパラメータに使用する場合の実装メモ

時刻を扱う場合に、テスト性を持たせるための実装メモ。

インターフェースを介して時刻を実装してやる。

// Kotlin
import java.util.*

interface SystemClock {
  fun getTimeMillis(): Long
  fun getLocale(): Locale
  fun getTimeZone(): TimeZone
}

// 使う側の例
import your.package.SystemClock

fun setTime(d: SystemClock) { ... }

setTime(object : SystemClock {
  override fun getTimeMillis(): Long {
    TODO("Not yet implemented")
  }

  override fun getLocale(): Locale {
    TODO("Not yet implemented")
  }

  override fun getTimeZone(): TimeZone {
    TODO("Not yet implemented")
  }
}

テストのときはエッジケースや定数を実装し、本番ではDate()等を実装すれば( ΦωΦ)σヨシッ!

OpenCV for AndroidでJPGから透過付きBitmapを生成するときのメモ

前後のつながりも何もないメモ。

Imgproc.cvtColorでグレースケールを生成するとき、引数にはImgproc.COLOR_RGBA2GRAYを設定すること。 Imgproc.COLOR_BGRA2GRAYを選択すると、後でsrcMat.copyTo(dstMat, mask)でマスクするときに背景の透過がうまく行われない。 (黒に置換される?)

これで3日くらい溶かした。

OpenCV for Androidで手書き文字をクロッピングする

概要

  • 写真をOpenCVで二値化して、手書き部分のみクロッピングする
  • Bitmapをアルファ付きPNGとして保存するとき、Bitmap#setHasAlphaをセットしないとアルファ値が捨てられる
    • 読み込んだときに背景が黒に置換される模様

動きとしてはこんな感じ。

f:id:kcpoipoi:20201101124152g:plain

  • 概要
  • OpenCV for Androidの導入
  • OpenCVの初期化
  • PNGをBitmapとして取り込む
  • 画像処理テスト用にクラスを作成する
    • MainActivityからの呼び出し
    • ファイルの入出力クラスの作成
  • 二値化の方法について
  • 調べたものリスト
    • Bitmapの保存について
    • BitmapのPixel操作を扱ったもの
    • OpenCVの反転処理を扱ったもの
    • OpenCVで透過処理を扱ったもの
    • OpenCVのMatクラスについて
    • findContours等、輪郭を扱ったもの
    • 平滑化処理を扱ったもの
    • 膨張・収縮処理(Dilation/Elosion)
    • OpenCVリファレンス
    • Core.splitとかmergeとかやってるけど全然分からなかったもの
    • 関係ないけど画像の暗黙的Intentについて
    • OpenCV for Androidのインストール
    • Android単体で画像の切り抜き
続きを読む

Android Studio 4.1 にOpenCV 4.5.0 をインポートするメモ

Android Studioのバージョン更新のためか、Qiitaや個人ブログの方法がそのままでは使えなかったのでメモ。

大筋は下記参照でいいと思うのでポイントだけ。
(まだインポートまでしかやってないけど←)

qiita.com

環境

現象

  • Import Module from SourceダイアログにModule nameが無い
  • デフォルトではモジュール名がsdkとなるが、opencv等任意の名前に書き換える場合はsettings.gradleも修正する必要あり

ぱっとモジュール名を変更すると、Project Structureからモジュールの依存関係を追加するときにモジュールが見つからなくなるという地味なトラップがあった。

対応

File -> New -> Import Module
で表示されるダイアログには、Source directoryはあるがModule nameは無くなっている。

⇒インポート後に、手動でモジュール名とsettings.gradleを修正する

OpenCVをインポートするとき、指定するフォルダがsdkとなっているため、 Android Studioにインポート後もsdkという名前になっている。

任意の名前に書き換えるときはsettings.gradleを修正する必要がある。

include ':app'
- include ':sdk'
+ include ':opencv' // ← モジュール名がsdkでインポートされるため、任意の名前に書き換え
rootProject.name = "OpenCVSample"

とりあえずここまで。あとテストしてハマったら随時追記する。

Mockito+kotlin-allopenプラグインでモックする

Kotlinでテストを書く場合、kotlin-allopenプラグインを使うと簡単にモックできるということですが、ネットに転がってる情報が思いのほか不親切だった(他責)ので個人的まとめ。

  • 結論
  • kotlin-allopenとは
  • リリースビルドではどうするのよ
  • mock-maker-inlineは?
続きを読む

Androidアプリのアップロード鍵.keystoreの作成と管理について

Androidの署名ファイル(keystore)について個人的まとめ。

今のところ一番腑に落ちる配置の仕方かな?

  • keystoreとは
  • 環境
  • 手順
    • /Users/user/.gradle/gradle.propertiesにパスを記述する
    • .gradle/.signingフォルダを作る
    • keystoreファイルを生成する
    • keystoreを.signing/YourProjectNameに移動する
    • パスワードをprojectname.propertiesに記述する
    • build.gradleに署名付きビルドのためのコードを記述する
    • ビルドバリアントをreleaseにしてビルド
  • 参考
続きを読む

Pandoc+Dockerでドキュメント作成環境を整備する

Pandoc、MarkdownからHTMLでもPDFでも、Wordにだって出力できて便利ですね。

軽い気持ちでPandocを導入しようとしたら地獄を見たのでその備忘録です。

なお、筆者の環境は Windows10 Pro + Docker for Windows で構築しています。 Linux歴3週間程度のため、コマンドの打ち方等は未熟な部分がありますのでご容赦ください。

2020/7/27 17:00 更新 HTMLの見出しの採番用Luaフィルタを追加

github.com

リポジトリを作成しました。

  • 目的
  • 概要
  • 手順
    • Docker (Docker for Windows)をインストールする
    • pandoc/latexイメージを導入する
    • LuaTeXパッケージ等導入する
    • 図表対応のため pandoc-crossref を導入する
    • easy-pandoc-templatesを導入する
    • Dockerfileを作成する
    • 長いオプションをDefault fileにまとめる
    • 補足:採番の接頭辞・接尾辞の修正
      • PDF出力の場合
      • HTML出力の場合(easy-pandoc-templates使用を前提)
  • 参考にさせていただいたサイト
続きを読む