Amazon Dash Button ってどうなってたっけ?

終了してたよね???

調べてみると、終了してました!

Dash Button端末を使用した商品の注文は、2019年8月31日で終了しています。

端末は2019年12月31日に自動的に登録解除およびリセットされるため、お客様による操作は必要ありません。なお、Dash Button端末を廃棄する前に手動での登録解除をご希望の場合は、コンテンツと端末の管理にアクセスして、端末タブから登録を解除できます。お使いのDash Buttonを選択し、登録の解除をクリックしてください。最後に、Dash Button端末を1回押します。ライトが白く点滅した後、赤く点灯します。

ヘルプ&カスタマーサービス - Amazonデバイスサポート - Amazon Dash Button

端末で遊ぼうと思ったのに、手動解除してしまって、WiFiに2度と接続できなくなってしまった! \(-o-)/


from scapy.all import *

def arp_display(pkt):
  if pkt[ARP].op == 1: #who-has (request)
    if pkt[ARP].psrc == '0.0.0.0': # ARP Probe
      print "ARP Probe from: " + pkt[ARP].hwsrc

print sniff(prn=arp_display, filter="arp", store=0, count=10)

👉 How I Hacked Amazon’s $5 WiFi Button to track Baby Data 

\(-o-)/

👉 【Bluetooth】遠隔操作で写真が撮れる39円ボタン hatena-bookmark


Related Categories :  WEB


res を複数作って機能・画面別にディレクトリ分けすると分かりやすい

👉 Split layouts into subfolders in Android Studio - ProAndroidDev 

以下のコードを見ながら。

👉 GitHub - android/architecture-samples at dagger-android 

コードは、画面別にディレクトリ分けしてるが、レイアウトファイルは、複雑なファイル名で res ディレクトリ直下に一緒くたに入ってる。

ここで、build.gradle で設定記述を追加する。


android {
  sourceSets {
    main {
      res.srcDirs = [
          'src/main/res',
          'src/main/res/layouts/tasks',
          'src/main/res/layouts/taskdetail',
          'src/main/res/layouts/addedittask',
          'src/main/res/layouts/statistics',
      ]
    }

こうすることで、レイアウトファイル群を画面別に分けることができる。

Android Studio はデフォルトで、一つのディレクトリのみ


android {
  sourceSets {
    main {
      res.srcDirs = [
          'src/main/res'
      ]

と等価な設定を持ってるので、それに、画面別ディレクトリを複数追加することで、Android Studio は、リソースファイルとして複数ディレクトリからファイルを読み込むことができるようになります。

あとは、それぞれのリソースファイルを振り分けて置くだけ。

以下、やってみた動画。



実際は、レイアウトファイルがもっと多くなるはずなので、分かりやすさはより顕著になる。

👉 Split layouts into subfolders in Android Studio - ProAndroidDev 


長く使える Android 端末はどれなのか?

👉 LineageOS Downloads 

できるだけ長く使いたい Android 端末を考えると、公式サポート切れからのLineage OS 乗り換えで延命が定石。

以下、Lineage OS をインストールできるいくつかの Android 端末の 「発売日」。

Google
Pixel 2018/11

Huawei
P20 Pro 2018/06

Sony
XPeria XA2 Ultla 2018/02

Samsung
S5 Plus 2014/11

ベンダー依存は少なく素のAndroidである Pixel シリーズが間違いない。


ベンダーカスタムの量が多い Samsung などはオープンソースとしての開発者が寄り付かずカスタムOSでも更新が遅すぎなのか?


SQLDelight で View を使うべし

👉 Drive your UI with SQLDelight’s views | Leandro Favarin 
👉 GitHub - cashapp/sqldelight: SQLDelight - Generates typesafe Kotlin APIs from SQL 

SQLDelight は、すべてのクエリーに対して自動的にモデルオブジェクトを作成します。

以下シンプルな名前付きクエリー。


bandsOrderedByName:
SELECT id, name
FROM band
ORDER BY name DESC;

bandsOrderedByAge:
SELECT id, name
FROM band
ORDER BY age;

これから以下が作成される。


data class BandsOrderedByName(id: String, name: String)

data class BandsOrderedByAge(id: String, name: String)

実際は、もっと複雑になります。

以下、join句を使ったクエリーの場合。


SELECT
  band.id,
  band.name,
  album.*
FROM band
JOIN album ON band.id = album.band_id;

SQL View を使うとエレガントになります。


👉 SQLite Query Language: CREATE VIEW 


CREATE VIEW bandWithAlbum AS
SELECT
  band.id,
  band.name,
  album.*
FROM band
JOIN album ON band.id = album.band_id;

bandsOrderedByName:
SELECT *
FROM bandWithAlbum
ORDER BY name DESC;

bandsOrderedByAge:
SELECT *
FROM bandWithAlbum
ORDER BY age;

SQLDelight は、BandWithAlbum タイプを生成します。

続いて、ページネーションの例。


count:
SELECT count(*)
FROM bandWithAlbum;

paged:
SELECT *
FROM bandWithAlbum
LIMIT ?
OFFSET ?;

SQLDelight が生成するモデルは、data クラスなので、DiffUtil コールバックはすぐに書けます。


object BandItemCallback : ItemCallback<BandWithAlbum>() {
  override fun areItemsTheSame(oldItem: BandWithAlbum, newItem: BandWithAlbum): Boolean {
    return oldItem.id == newItem.id
  }

  override fun areContentsTheSame(oldItem: BandWithAlbum, newItem: BandWithAlbum): Boolean {
    return oldItem == newItem
  }
}

また、enum クラスを使ったソートオプション。


enum class Sort { NAME, AGE }

fun bandsSorted(by: Sort): Flow<List<BandWithAlbum>> = when (by) {
  NAME -> db.bandsOrderedByName()
  AGE -> db.bandsOrderedByAge()
}.asFlow().mapToList()

逆に、これらのようなSQL処理をプログラムで実行すると効率は落ちます。
👉 The Resurgence of SQL (Droidcon NYC 2017) - Speaker Deck 

まとめ

欲しいタイプを View にすると、少ないコードで実現できます。

ユーザーの要求は、技術が発達するにつれてますます激しくなることは明らかです。良きユーザエクスペリエンスのための簡単な実装方法を常に把握しておくことが重要になります。


AndroidJUnit4.class is deprecated | androidx.test.InstrumentationRegistry is deprecated

地味にハマる。

こーゆーのは、いちいちググらないといけないのか?

誰の都合の変更だ?

以下、苦悩の動画。



ここら androidx.test.ext に注意していないと分からない。

👉 Google's Maven Repository 


dependencies {

    // …

    androidTestImplementation 'androidx.test:core:1.2.1-alpha02'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2-alpha02' // deprecated AndroidUnitTest4

そういういうことですか。

👉 android - AndroidJUnit4.class is deprecated: How to use androidx.test.ext.junit.runners.AndroidJUnit4? - Stack Overflow 
👉 android - androidx.test.InstrumentationRegistry is deprecated - Stack Overflow 


Related Categories :  AndroidappsDevelopmemtKotlin