Paging DataSourceFactory toLiveData() toObservable() が見つからない。

Javaのこのコードが、


public class ConcertViewModel extends ViewModel {
  private ConcertDao concertDao;
  public final Observable<PagedList<Concert>> concertList;

  public ConcertViewModel(ConcertDao concertDao) {
    this.concertDao = concertDao;
    concertList = new RxPagedListBuilder<>(
          concertDao.concertsByDate(), 50)
                  .buildObservable();
  }
}

Kotlinでこう書けるはずなのに!


class ConcertViewModel(concertDao: ConcertDao) : ViewModel() {
  val concertList: Observable<PagedList<Concert>> =
        concertDao.concertsByDate().toObservable(pageSize = 50)
}

Paging library overview  |  Android Developers

見つからない toObservable()。

- Added DataSourceFactory.toLiveData() as a Kotlin alternative for LivePagedListBuilder
- Added DataSourceFactory.toObservable() and toFlowable() as Kotlin alternatives for RxPagedListBuilder

Paging  |  Android Developers

どうやら -ktx のようです。


implementation "androidx.paging:paging-runtime-ktx:2.1.0"
implementation "androidx.paging:paging-rxjava2-ktx:2.1.0"

Maven Repository: androidx.paging

最近は、同じ処理でも複数の書き方があることが多くなって最初混乱したりします。


【MVVM】 ViewModel の_プロパティ記述

Android Java ではあまり見かけなかったその記述。

Kotlin では、たくさん見かけてはいましたが、
個人的な明示記述小技かと思っていました。


private val _items = MutableLiveData<List<Task>>().apply { value = emptyList() }
val items: LiveData<List<Task>>
    get() = _items


private val _dataLoading = MutableLiveData<Boolean>()
val dataLoading: LiveData<Boolean>
    get() = _dataLoading

android-architecture/TasksViewModel.kt at todo-mvvm-live-kotlin · googlesamples/android-architecture


private val _repositories = MutableLiveData<List<Repo>>()
val repositories : LiveData<List<Repo>>
    get() = _repositories

android - Kotlin: Read Only access of Immutable Type to an Internal Variable of a Mutable Type - Stack Overflow


private val _models = ConflatedBroadcastChannel<Model>()
override val models: ReceiveChannel<Model> get() = _models.openSubscription()

private val _events = Channel<Event>(RENDEZVOUS)
override val events: SendChannel<Event> get() = _events

SdkSearch/SearchPresenter.kt at JakeWharton/SdkSearch

Kotlin公式リファレンスにも書かれていたのですね!

Names for backing properties
If a class has two properties which are conceptually the same but one is part of a public API and another is an implementation detail, use an underscore as the prefix for the name of the private property:


class C {
  private val _elementList = mutableListOf<Element>()
  val elementList: List<Element>
      get() = _elementList
}

Properties and Fields: Getters, Setters, const, lateinit - Kotlin Programming Language

クラス内の処理実装に利用するのが _elementList で、
外部にただ公開するだけのが elementList。

こうやって並べてみると、自然に馴染じめてしまう不思議。

ViewModel作成時のイメージとして持っておくと良い。

👉【Kotlin】バッキング・フィールド/プロパティ
👉【MVVM】ViewModel インスタンスの取得


Let's Encrypt で 謎の「-0001」

以下のような nginx などWEBサーバでの鍵の位置指定。


ssl_certificate /etc/letsencrypt/live/android.benigumo.com/fullchain.pem
ssl_certificate_key /etc/letsencrypt/live/android.benigumo.com/privkey.pem

これが、ファイルの実体だと更新時にコケる。
シンボリックリンクでないとならない。

証明書を確認してみると分かる。


# certbot-auto certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Renewal configuration file /etc/letsencrypt/renewal/android.benigumo.com.conf produced an unexpected error: expected /etc/letsencrypt/live/android.benigumo.com/cert.pem to be a symlink. Skipping.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
  Certificate Name: android.benigumo.com-0001
    Domains: android.benigumo.com
    Expiry Date: 2019-07-19 02:41:22+00:00 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/android.benigumo.com-0001/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/android.benigumo.com-0001/privkey.pem

The following renewal configurations were invalid:
  /etc/letsencrypt/renewal/android.benigumo.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

期限の更新できたつもりが、
謎の「0001」な 証明書が追加発行されとる。


# ls -al /etc/letsencrypt/live/android.benigumo.com
drwxr-xr-x 2 ubuntu ubuntu 4096 Mar  1 00:01 .
drwx------ 4 ubuntu ubuntu 4096 Apr 20 12:33 ..
-rw-r--r-- 1 ubuntu ubuntu 2269 Mar  1 00:00 cert.pem
-rw-r--r-- 1 ubuntu ubuntu 1647 Mar  1 00:00 chain.pem
-rw-r--r-- 1 ubuntu ubuntu 3916 Mar  1 00:00 fullchain.pem
-rw-r--r-- 1 ubuntu ubuntu 3272 Mar  1 00:00 privkey.pem

サーバ移行のファイルコピー時に実体化されたっぽい。

シンボリックリンクにする。
複数ある場合は一番新しいものがリンク元となるのが正しい。


# cd  /etc/letsencrypt/live/android.benigumo.com/
# rm *
# ln -s ../../archive/android.benigumo.com/cert30.pem cert.pem
# ln -s ../../archive/android.benigumo.com/chain30.pem chain.pem
# ln -s ../../archive/android.benigumo.com/fullchain30.pem fullchain.pem
# ln -s ../../archive/android.benigumo.com/privkey30.pem privkey.pem

# ls -al
lrwxrwxrwx 1 root   root     45 Apr 21 08:19 cert.pem -> ../../archive/android.benigumo.com/cert30.pem
lrwxrwxrwx 1 root   root     46 Apr 21 08:19 chain.pem -> ../../archive/android.benigumo.com/chain30.pem
lrwxrwxrwx 1 root   root     50 Apr 21 08:19 fullchain.pem -> ../../archive/android.benigumo.com/fullchain30.pem
lrwxrwxrwx 1 root   root     48 Apr 21 08:19 privkey.pem -> ../../archive/android.benigumo.com/privkey30.pem

追加登録されている0001を削除して期限更新をかける。


# certbot-auto delete --cert-name android.benigumo.com-0001
# certbot-auto renew --dry-run
# certbot-auto renew


# certbot-auto certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
  Certificate Name: android.benigumo.com
    Domains: android.benigumo.com
    Expiry Date: 2019-07-19 22:19:07+00:00 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/android.benigumo.com/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/android.benigumo.com/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

よし。

Let's Encrypt で '-0001' がついた証明書データを削除する方法 | ラボラジアン

Let's Encrypt(certbot)でrenewしたら"expected /etc/letsencrypt/live/~/cert.pem" | KINの雑記帳