【歩きスマホは危険】スマホ画面見ながら前方(進行方向)をみるアプリ

「歩きスマホ」は危険ですよね。

国土交通省によると、携帯電話やスマートフォンを操作していて駅のプラットホームから転落する事故は、2010年度は11件、2011年度は18件、2012年度は19件(転落者数の0.6%だが、36.2%にあたる1,185人は「その他、不明」で、また、同省の担当者は「酔客は酔っているから自分では線路から上がれず、駅員が助けるから転落の事実がわかるが、歩きスマホで転落する者は自分で上がってしまい、自ら駅員に『スマホのため』とは告げないため、不明に入っているか、件数に上がっていない可能性がある」と指摘)、2013年度は45件と、年々増加している。

歩きスマホ - Wikipedia

ほぼほぼ、スマホの背面カメラは前方(進行方向)を向いています。

なら、スマホにそれを表示しておいたらどうだろうかというアプリ。

Camera Preview - Apps on Google Play

ロングタップで「ピクチャインピクチャ」モードです。

アプリを操作しながらその上にカメラ画像を表示できます。

ただ、カメラ画面を表示しているだけですが、

いろいろ使えそうです。

けど、ホントにそんなにおまいら忙しいか?

危ねえからやめなさい!


【DIY】700円でつくる Magic Keyboard/Trackpad2 向け Mac Book Pro 13インチ型縦配置の枠

横に並べて置くことを想定して設計されていますよね、Magic Keyboard/Trackpad2。

Magic Keyboard - 英語(US) - Apple(日本)

MacのためのMagic Trackpad 2(シルバー)を購入 - Apple(日本)

Keyboard の厚さが 4.1-10.9mm、
Trackpad2 の厚さが 4.9-10.9mm。

元々 Mac Book Pro 13インチ から移行した人にとっては、手の横移動が億劫に感じます。

かといって、縦に並べておくと誤操作連発でイライラすぎ。

この厚みの差が問題なんですよね。

探してみると、こんなのありますが。

BulletTrain eXpress Keyboard Platform | Indiegogo

商品詳細 Crispy Backboard 2

なんだかな...。

ホームセンターの木材加工サービスを利用して作ることにします。

材料

Mac Book Pro 13インチの寸法を雑に測っておきます。

これに近い雰囲気で縦に並べて置くことにして考えます。

縦に並べて置くには、厚さが、6.8-10.9mm の板が良さそう。

ホームセンターに行ってみると、300x300x7mm の木板が、328円であったのでこれにしました。

プラスチック板もあったのですが、今回は木製にします。

設計

ホームセンター内の加工サービス受付で、簡単な図面を書きます。

「直線で切り落としのみ」ということで、途中でカット作業は止めることができないそうなので、切り落とした部材をパズルのように並べることにします。

数分でカットされてきます。

1カット80円ということで、320円でした。

組み立て

とはいっても並べるだけです。

7mmなので木工用ボンドで接合しても強度が弱いので、その場合は薄い何かの上に並べて貼り付ければいいでしょう。

できあがり

手前の板は不要に思っていたのですが、パームレストのようにあると腕が疲れません。

とりあえず、まあいいか。

使いながら改良していこうと思います。

→ A Mac Book Pro style Wooden Dock for Magic Keyboard and Trackpad 2

めんどくさいでの買うか、電動ノコ。

木端、気になるので丸めたいんだよな、グラインダーか。


【Android】Kotlin でモダンな concurrency その5

ライフサイクルとコルーチン

Actor は、UI管理にも便利で、タスクのキャンセルをシンプルにし、UIスレッドのオーバーロードを避けることができます。

まず、Activity に適用する JobHolder インターフェースを作成します。これは、セットしたタスクの親となり、それのキャンセルを可能にします。


interface JobHolder {
  val job: Job
}

Activity が destroy されるときに、job.cancel() を行います。


class MyActivity : AppCompatActivity(), JobHolder {

  override val job: Job = Job() // the instance of a Job for this activity

  override fun onDestroy() {
    super.onDestroy()
    job.cancel() // cancel the job when activity is destroyed
  }
}

Extension Function にして、JobHolder の すべての View からアクセス可能にします。


val View.contextJob: Job
  get() = (context as? JobHolder)?.job ?: NonCancellable

これらを組み合わせて、setOnClick に onClick のアクションを管理させるための conflated な Actor を作らせます。複数回の連続クリックは無視され、ANR を避けることができます。

そして、これらのアクションは、contextJob のコンテキストで実行されます。

また、Activity が destroy されるとキャンセルもされます。


fun View.setOnClick(action: suspend () -> Unit) {
  val eventActor = actor<Unit>(
    context = UI,
    start = CoroutineStart.UNDISPATCHED,
    capacity = Channel.CONFLATED,
    parent = contextJob
  ) {
    for (event in channel) action()
  }
  setOnClickListener { eventActor.offer(Unit) }
}

この例では、ここでは多すぎるイベントを無視するために Channel を conflated としてセットしています。すべてをイベントキューとしたい場合は、Channel.UNLIMITED とすることができます。その場合でも ANR は発生しません。

コルーチンとライフサイクルを組み合わせて、UIタスクのキャンセルを自動化することもできます。


val LifecycleOwner.untilDestroy: Job get() {
  val job = Job()

  lifecycle.addObserver(object: LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun onDestroy() { job.cancel() }
  })
  return job
}

// 使い方
launch(UI, parent = untilDestroy) {
  // 何らかの処理
}

【Android】Kotlin でモダンな concurrency その1
【Android】Kotlin でモダンな concurrency その2
【Android】Kotlin でモダンな concurrency その3
【Android】Kotlin でモダンな concurrency その4


関連ワード:  Kotlin開発