Amazon Kindle Fire タブレットが何も反応しなくなった場合の対応

画面真っ暗のまま何も反応しなくなりました。

電源ボタンON -> 何も反応なし

充電器からのケーブルを差す -> 何も反応なし

どうしようもありません。

なんせ電源が入らないのです。

画面がフリーズした、または端末が反応しない

公式トラブルシューティングに以下の記載が。

電源ボタンを40秒間、または端末が自動的に再起動するまで押し続けます。40秒経過する前に端末が自動的に再起動した場合は、電源ボタンを離します。40秒経過しても端末が自動的に再起動しない場合は、電源ボタンを押して端末の電源をオンにします。

Amazon.co.jp ヘルプ: Fireタブレットの基本的なトラブルシューティング

電源ボタンを長押ししてみると、

20秒くらいで正常に起動しました。

バッテリーはすでに満タンに充電されていました。

今回は、ググって見つけることができましたが、

実際はサポートに問い合わせるほうが良さげ。

Amazon.co.jp ヘルプ: お問い合わせ方法

しかし、長押し「数十秒」とか、フツーは気づかないよのう。


Dagger に馴染めない人のためのいくつかの原則

Keeping the Daggers Sharp ⚔️ – Square Corner Blog – Medium

Dagger2 は 素晴らしい Dependency Injection ライブラリですが, なかなか上手に使いこなせません.

分かりやすくするための考え方や実装方法をいくつか見てみましょう.

フィールドよりコンストラクタのインジェクションを使う

フィールドインジェクションは, finalでなく, privateでないフィールドに使います.


// BAD
class CardConverter {

  @Inject PublicKeyManager publicKeyManager;

  @Inject public CardConverter() {}

}

フィールドに @Inject を忘れると NullPointerException の原因となります.


// BAD
class CardConverter {

  @Inject PublicKeyManager publicKeyManager;
  Analytics analytics; // Oops, forgot to @Inject

  @Inject public CardConverter() {}

}

コンストラクタインジェクションはイミュータブルですので, 局所的な状態を持ちませんのでスレッドセーフにつながります.


// GOOD
class CardConverter {

  private final PublicKeyManager publicKeyManager;

  @Inject public CardConverter(PublicKeyManager publicKeyManager) {
    this.publicKeyManager = publicKeyManager;
  }

}

Kotlinでは, さらに簡素化してくれます.


class CardConverter

@Inject constructor(
  private val publicKeyManager: PublicKeyManager)

それでも, フィールドインジェクションを使いたい場合は以下のようになります.


public class MainActivity extends Activity {

  public interface Component {
    void inject(MainActivity activity);
  }

  @Inject ToastFactory toastFactory;

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Component component = SquareApplication.component(this);
    component.inject(this);
  }

}

Singleton はあまり使う必要はない

ミュータブルな状態に対して多くのアクセスが必要な場合は Singleton は便利です.


// GOOD
@Singleton
public class BadgeCounter {

  public final Observable<Integer> badgeCount;

  @Inject public BadgeCounter(...) {
     badgeCount = ...
  }

}

しかし, 変化しない状態に対しては Singleton にする必要はありません.


// BAD, should not be a singleton!
@Singleton
class RealToastFactory implements ToastFactory {

  private final Application context;

  @Inject public RealToastFactory(Application context) {
    this.context = context;
  }

  @Override public Toast makeText(int resId, int duration) {
    return Toast.makeText(context, resId, duration);
  }

}

まれに, 作成のコストがかかるキャッシュインスタンスの走査に使うことがあります. そうすることで, 繰り返し作成して破棄することを避けることができます.

@Provides でなく @Inject を使う

@Provides はコンストラクタを複製すべきではありません.
関係する部分を一つにするとコードがわかりやすくなります.


@Module
class ToastModule {

  // BAD, remove this binding and add @Inject to RealToastFactory
  @Provides RealToastFactory realToastFactory(Application context) {
    return new RealToastFactory(context);
  }

}

このことは, 特に singleton においては重要です. そのクラスを読むときの重要な実装の内容一覧となります. 一部分をみればすべての内容が把握できます.


// GOOD, I have all the details I need in one place.
@Singleton
public class BadgeCounter {

  @Inject public BadgeCounter(...) {}

}

static @Provides を使う

@Provides は static にすることができます.


@Module
class ToastModule {

  @Provides
  static ToastFactory toastFactory(RealToastFactory factory) {
    return factory;
  }

}

モジュールインスタンスを作成する代わりに, 直接メソッドを実行することができます. このときそのメソッドの呼び出しはコンパイラによってインライン化されています.


@Generated
public final class DaggerAppComponent extends AppComponent {

  // ...
  @Override public ToastFactory toastFactory() {
    return ToastModule.toastFactory(realToastFactoryProvider.get())
  }

}

一つだけのメソッドを static にしてもあまり変化はないですが, すべてを static にすると, かなりのパフォーマンスが向上します.

また, モジュールを abstract にすると, static でない @provides メソッドが ひとつでもあるとコンパイルに失敗します.

@Provides よりも @Binds を使う

あるタイプを他にマッピングするときは @Provides でなく @Binds を使う.


@Module
abstract class ToastModule {

  @Binds
  abstract ToastFactory toastFactory(RealToastFactory factory);

}

このメソッドは abstract でなければなりません. @Generated コードは実装内容をそのまま使おうとします.


@Generated
public final class DaggerAppComponent extends AppComponent {

  // ...
  private DaggerAppComponent() {
    // ...
    this.toastFactoryProvider = (Provider) realToastFactoryProvider;
  }

  @Override public ToastFactory toastFactory() {
    return toastFactoryProvider.get();
  }

}

@Singleton の interface binding は避ける

Statefulness is an implementation detail

集中するアクセスがミュータブルな状態にアクセスする必要があるかは実装のみが知っていますので, 実装をインターフェースにバインドさせるとき, アノテーションをつけるべきではありません.


@Module
abstract class ToastModule {

  // BAD, remove @Singleton
  @Binds @Singleton

  abstract ToastFactory toastFactory(RealToastFactory factory);

}

error-prone を使おう

一般的な Dagger のエラーはこれを使うことで分かりやすく検出できます.

👉 MVVM で Hilt のパターン化 💉  hatena-bookmark


パソコンやAndroid間で通信環境なしに簡単にファイルを移動する方法

以下の間でWiFiなど通信環境なしにファイル移動を迫られることとかありません?

パソコン USB 2.0/3.0 Type-A

パソコン USB 3.1 Type-C

Android USB 3.1 Type-C

海外などのネット環境の良くない旅行先や外出先,あるいは,Wifiなどの通信状態が遅い,スマホキャリアの通信料制限で時間がかかりすぎるなど...

これ便利です.


aceyoon USB Type C カードリーダー OTG対応 スマホでも使える USB2.0高速 アルミ合金制 Micro SD カード 4GB ~ 256GBまでの大容量対応 MicroSDXC / MicroSDHC規格 メモリカード ライター

USB Type-A/C対応 SDカードリーダーです.

2016年以降のMacBookPro から それ以前のパソコンへ.

いろいろなパソコンとAndroidとのファイルのやり取りに.

「OTGに対応」していること大事です.

USB OTGを知ってますか? Androidで生かせるクールな5つの使い方 | ライフハッカー[日本版]

USB OTG(USB On-The-Go)でAndroidを活用 - サンワサプライ株式会社

Easy OTG Checker - Android Apps on Google Play

そして今更驚いたのが,

「リーダー」と書いてあるが普通は 読出だけでなく書込もできる

価格.com - カードリーダーの選び方

とういうことでしたがー.