くうと徒然なるままに

モバイルアプリを作りながらバックエンドも作っています。

Android-Kotlin で現在起動してるアプリの設定画面に移動する

コード

      val intent = Intent()
      intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
      val packageName = context?.packageName ?: return@setOnClickListener
      val uri = Uri.fromParts(
        "package",
        packageName,
        null
      )
      intent.data = uri
      startActivity(intent)

参考にしたサイト

stackoverflow.com

Entity Framework Core で Unit Test しやすくするヘルパークラスを書いた@InMemory-SqLite

こんにちは〜!最近C# でサーバーサイドを雑に書いてます〜(Android アプリを作ってたはずが、気づいたらサーバーサイドを書いていた...

TDD を試しているのですが、 Entity Framework Core という 主にASP.NET Core 向けなORM を利用しているところでもTDDしやすくするためなヘルパークラス作りました。

使うとどれくらい楽になるの?

テンプレート的コードが減るのでプログラマの精神的疲労は1/2 ぐらいになりました(体感

コード行数()的な楽さは 1/3 ぐらいになりました思います!(若干誇張

使い方

これだけあればわかると思う

[Fact]
        void DBにデータを保存することができる()
        {
            var testMock = new InmemoryDBTestMock<{DbContextを継承したクラス}>();

            var context = testMock.Context();
            
                var entity = new {Entitクラス}();
                context.{DbSetのプロパティ}.Add(entity);
                context.SaveChanges();
            
            Assert.Equal(1, context.{DbContextのプロパティ}.Count()); 
        }

ソースコード

雑に作っただけなので動かないとかバグがあるとかは多分あります(テストは通ったけど、そこまで複雑なケースは想定してないです。

public class InmemoryDBTestMock<T> : IDisposable where T : DbContext
{
    private static readonly SqliteConnection Connection = new SqliteConnection("DataSource=:memory:");
    private readonly DbContextOptions _contextOptions = new DbContextOptionsBuilder<T>().UseSqlite(Connection).Options;

    public InmemoryDBTestMock()
    {
        Connection.Open();
        Context().Database.EnsureCreated();
    }
    
    public T Context() => (T) Activator.CreateInstance(typeof(T), _contextOptions);

    public void Dispose()
    {
        Context().Database.EnsureDeleted();
        Connection.Close();
    }
}

 まとめ

需要があればGithubにあげてNuget配布します。

Azure DevOps で Android Self Hosted Build Agent をセットアップできるスクリプトがある程度できた。

Azure DevOps ってサービス知ってますか? VSTS とか言われてたやつです。

CI サービスとか タスク管理、Wiki とかの開発で必要そうな奴が詰め合わせになった奴。

Circle CI + Github + Trello とかが合わさったサービスです。(正確には違う)

モバイルDevOps な界隈で CI サービスというと Circle CI or Bitrise な世間ですが、私は無料で使えるということで Azure DevOps を利用していきます。

Azure DevOps 特有のコンテキスト

CI のビルドパイプラインは月に1800分は無料で使える。

1800分あるのである程度はできるかもしれませんが、 CD するのに Managed Agent の方が色々楽なので CI する部分でなるべく無料時間分を使いたくないです。それにガリガリ開発してると割となくなりそう。

追加でビルドしたければ、以下の選択肢があります。

  • マイクロソフトホスティングしてるBuild Agent を一月 4500円ぐらいで借りる
  • 自前で Build Agent を立ち上げる。無料で枠が一つついてる。追加するには一月1500円ぐらい払うとできる

Azure DevOps Services | Microsoft Azure

友達がいない一人DevOps なのでそれ以外にはお金がかかりそうにない感じです。

私の考えるターゲット

  • Azure DevOps で Self Hosted Agent を立ち上げたい人。
  • なるべく安く CI/CD したい人

前提条件

  • Self Hosted Agent のOS は Ubuntu, ASP.NET Core とかは Ubuntu 上で動きそうだし一緒くたにしても良さそう
  • 私は、 Microsoft Azure VM B plan の一番安い奴の上で走らせた, そのため、環境の汚れはある程度適当にやってもいいかなと

成果物

Github に公開してあります。PR 出して改良お願いします。

微妙に動作が不安定なのでそこら辺なんとかしたいのと、変数とか利用してメンテナンスビリティあげたい。

github.com

気をつけた点

Android の環境セットアップと Azure DevOps の環境セットアップでスクリプトを分けたんですよ。

多分しないですが、再利用できるかなと。

ゆるぼ

Bash について知りたくなったので、本買ってください

Amazon.co.jp

就活の時期らしいのでそこらへんのお話ありましたら連絡ください

twitter.com

集中したいときにおすすめ!厳選作業用BGMまとめ(新幹線と航空機編

たまによく数時間集中してやらなければいけないことがありますよね。
私は、10月とかありました。

作業用BGMと言いつつ結局 集中できないわけのわからない音楽 を流すと返って効率が下がってしまいます。

その中で集中するのにちょうど良いBGMが存在したのでご紹介します。

30分ぐらい

台北-東京 航空機

1時間ぐらい

山手線の車窓

羽田-伊丹空港 航空機

2時間半ぐらい

東京-大阪 新幹線 車窓

6時間ぐらい

飯田線上諏訪から豊橋駅

東京-博多 新幹線 車窓

ムーンライトながら

10時間ぐらい

東京-サンフランシスコ 航空機

サンフランシスコ-東京 航空機

サンライズ瀬戸

16時間ぐらい

上野-札幌 寝台列車 車窓

感想

実は、台湾と日本って意外にも近いんですよ!

とはいえ、10時間の作業用BGMを1回で聞いたことはありませんw

Android アプリで現在デバッグ実行中かを判定する方法

Android アプリを作っていて、現在デバッグ実行されているかを確認したいことはたまによくあると思います。

BuildConfig から取得すればいけ感じな。

コード

BuildConfig.DEBUG

情報元

stackoverflow.com

Extended FAB っぽいものを実装してみた

Extended FAB を実装するモチベーションはFAB をよりユーザーにわかりやすく実装するため

普通のアイコンだけのFAB だけで実装してましたが、 「アイコンだけでは何をするためのものかすぐに理解して使い始めることができない」という問題が出てきました。

当初考えたのは、FAB を長押しすればヒントが出るとかそうすれば良いのかなーとか考えてました。けど、長押しするとヒントが出てくるって思わなくない?w

そこでテキスト付きFAB こと Extended FAB を使ってみようかなと。とはいえ、標準ではまだ実装が存在してないみたいなので自力で頑張ってみました...

Material Design 2(?) に導入された Extended FAB はテキスト付きFAB みたいなもの

Extended FAB は Google I/O 2018 で追加されたもので既存のFAB にテキストをつけれるようにしたものです。

ガイドライン的なのは以下のウェブサイトに乗ってます。

material.io

コンテナの中に テキストラベルが存在してて、オプション要素としてアイコンがあるって感じいらしいです。

公式サイトより引用

https://storage.googleapis.com/spec-host-backup/mio-design%2Fassets%2F1nwZJdz065h8Hid2DKIXHnFR03IYDZ4Ri%2Fextended-fab-layout-elements.png

実装方針は Material Button にスタイルを当てて微調整して実装

今回は、 基となるUI コンポーネントmaterial button を利用しました。
そこに、 Floating Action Button のスタイルを当てて、空白等を微調整したって感じです。

具体的な実装コード

以下のようなコードをとりあえず書きました。細かい部分ではまだまだ調整が必要そうですがとりあえずはそれっぽいものが実装できます。

ラベルとアイコン周りの空白の調整に苦戦

Extended FAB は横の幅にゆとりがあるような実装になっています。
Material Button のアイコン周りに Padding を効かせれるのとかは初めて知りましたw

実装のコード

<com.google.android.material.button.MaterialButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="新しいタスクを追加"
    app:layout_anchor="@id/bottom_app_bar"
    app:layout_anchorGravity="top|center"
    android:textSize="12sp"
    app:cornerRadius="24dp"
    android:padding="12dp"
    app:iconSize="24sp"
    app:iconPadding="8dp"
    style="@style/Widget.Design.FloatingActionButton" 
    app:icon="@drawable/ic_baseline_search_24px"/>

実装

Mockito で void なメソッドをモックする

Mockito はいいぞ〜

さて、 void なメソッドを mock するにはどうすれば良いのかってのは少しハマったので書いてきます〜

解決方法

doNothing().when(targetMock).targetMethod() 的な感じで実装してくといけました〜。

コードで解説

val keyword = "hello world"
doNothing().`when`(target).hoge(keyword)
target.hoge(keyword)
verify(target, times(1)).hoge(keyword)