急げ! あと数時間しかないぞ!

持ってる知り合いを探して、クーポン発行をお願いする、なのか?!
詳細はよう分からんがお得なはず!!
急げ! あと数時間しかないぞ!

持ってる知り合いを探して、クーポン発行をお願いする、なのか?!
詳細はよう分からんがお得なはず!!
考え方や汎用性など落とし所をどうするか。
方針:
- 「15」はコードに入れない。
- 表示処理の分離(MVP)を考慮する。
- 文字列の結合には StringBuilder を使う。
(1..100).map {
// P
StringBuilder().apply {
if (it % 3 == 0) append("Fizz")
if (it % 5 == 0) append("Buzz")
if (isEmpty()) append(it)
}.toString()
}.forEach {
// V
println(it)
}
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
...
問う側のスペックを問うブーメラン含みな相性判定なんだろうな。
むしろ方針?
👉 Kotlin で FizzBuzz の適当な記述
あみだくじを罫線で書く
Fizz buzz - Wikipedia
「歩きスマホ」は危険ですよね。
国土交通省によると、携帯電話やスマートフォンを操作していて駅のプラットホームから転落する事故は、2010年度は11件、2011年度は18件、2012年度は19件(転落者数の0.6%だが、36.2%にあたる1,185人は「その他、不明」で、また、同省の担当者は「酔客は酔っているから自分では線路から上がれず、駅員が助けるから転落の事実がわかるが、歩きスマホで転落する者は自分で上がってしまい、自ら駅員に『スマホのため』とは告げないため、不明に入っているか、件数に上がっていない可能性がある」と指摘)、2013年度は45件と、年々増加している。
ほぼほぼ、スマホの背面カメラは前方(進行方向)を向いています。

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

Camera Preview - Apps on Google Play
ロングタップで「ピクチャインピクチャ」モードです。
アプリを操作しながらその上にカメラ画像を表示できます。




ただ、カメラ画面を表示しているだけですが、
いろいろ使えそうです。
けど、ホントにそんなにおまいら忙しいか?
危ねえからやめなさい!
Channel の定義 (JetBrains のドキュメントより):
Channel は、概念的に BlockingQueue とよく似ています。主な違いの一つは、Put の代わりに「送信中断」をを持ち、Take の代わりに「受信中断」を持つことです。

Channel をシンプルに使えるツールが Actor です。
Actor は Handler と非常によく似ており、コルーチンのコンテキスト(つまり、アクションを実行するスレッド)を定義し、シーケンシャルに実行します。
コルーチンを使っており、キャパシティを決めて実行を中断することができます。
Actor は基本的に、処理をコルーチンチャンネルに転送します。実行順序と実行するコンテキストを限定することを保証します。
これで、synchronize は不要となり、すべてのスレッドはフリーです。
protected val updateActor by lazy {
actor<Update>(UI, capacity = Channel.UNLIMITED) {
for (update in channel) when (update) {
Refresh -> updateList()
is Filter -> filter.filter(update.query)
is MediaUpdate -> updateItems(update.mediaList as List<T>)
is MediaAddition -> addMedia(update.media as T)
is MediaListAddition -> addMedia(update.mediaList as List<T>)
is MediaRemoval -> removeMedia(update.media as T)
}
}
}
// 使い方
suspend fun filter(query: String?) = updateActor.offer(Filter(query))
この例では、実行するアクションを選択する際、sealed クラスを利用しています。
sealed class Update
object Refresh : Update()
class Filter(val query: String?) : Update()
class MediaAddition(val media: Media) : Update()
すべてのアクションはキューとなり、決してパラレルには実行されません。mutable なものを密閉するにはいい方法です。
【Android】Kotlin でモダンな concurrency その1
【Android】Kotlin でモダンな concurrency その2
【Android】Kotlin でモダンな concurrency その3
Coroutine コンテキストでは、そのコードをどのスレッドで実行するか、exception がスローされたときの処理の方法、キャンセルを伝える親のコンテキストを定義します。
val job = Job()
val exceptionHandler = CoroutineExceptionHandler {
coroutineContext, throwable -> whatever(throwable)
}
launch(CommonPool+exceptionHandler, parent = job) { ... }
job.cancel() は、それの保持しているすべての coroutine をキャンセルします。
そして exceptionHandler は、それらの中でスローされたすべて Exception を受け取ります。
【Android】Kotlin でモダンな concurrency その1
【Android】Kotlin でモダンな concurrency その2