永遠の(プログラマ)生命を求める者が「Hello World」して「Get Wild」した場合、最終的に「The World ~時よ止まれ/そして時は動き出す~」に至るのは自然な流れであり、ある種の人間賛歌とも言えるだろう。
しかし思うところあり、そこは敢えて後進に譲るとして、触れないでおきたい。
代わりに今回は実践的な「波紋の呼吸の訓練法」を紹介しよう。
トレーニングメニュー
- 1秒間に10回の呼吸(10 breaths / 1 sec)
- 1分間息を吸い続け、その後吐き続ける(Continue to breathe / 1 min)
- 最後にグラスのワインを溢さず蛙をメメタァ(me-meta to frogs)
基本的には上記エクササイズ(物理)を日々欠かさず行う事が肝要だが、冷静にQiita的な見地に立つと、これが有益な情報であるかどうか、若干の疑問が残る。
そこで今回はとかく忙しい現代人の為に、上記のカリキュラムをSwift(Playgrounds)を用い、同期・非同期を織り交ぜて効果的に同時実行可能なコードを紹介して筆を折りたい。
HamonTrainingPlayground
//: HamonTrainingPlayground
import UIKit
// 波紋初心者向けとして、手始めに2分間(120s)実施する。
// (最終的には10分間)
let executionTime = 120
let op1 = BlockOperation {
let s = 1
Thread.current.name = "1秒間に\(s)回の呼吸"
for i in 0 ..< executionTime / s {
print(Thread.current.description + ": \(i + 1)回目")
Thread.sleep(forTimeInterval: 1 / Double(s))
}
}
let op2 = BlockOperation {
let m = 1, s = m * 60
Thread.current.name = "\(m)分間息を吸い続け、その後吐き続ける"
for i in 0 ..< executionTime / s {
print(Thread.current.description + ": \(i + 1)回目")
Thread.sleep(forTimeInterval: Double(s))
}
}
let op3 = BlockOperation {
Thread.current.name = "グラスのワインを溢さず蛙をメメタァ"
print(Thread.current.description)
}
op3.addDependency(op1)
op3.addDependency(op2)
let queue = OperationQueue()
queue.addOperation(op1)
queue.addOperation(op2)
queue.addOperation(op3)
queue.waitUntilAllOperationsAreFinished()
実行結果
実行例(抜粋)
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 1回目
<NSThread: 0x600000267880>{number = 5, name = 1分間息を吸い続け、その後吐き続ける}: 1回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 2回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 3回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 4回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 5回目
// 中略
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 55回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 56回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 57回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 58回目
<NSThread: 0x600000267880>{number = 5, name = 1分間息を吸い続け、その後吐き続ける}: 2回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 59回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 60回目
// 中略
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 115回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 116回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 117回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 118回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 119回目
<NSThread: 0x60800026c940>{number = 4, name = 1秒間に1回の呼吸}: 120回目
<NSThread: 0x608000270b40>{number = 6, name = グラスのワインを溢さず蛙をメメタァ}
バージョン情報
Swift:3.1
Xcode:8.3.3 (Swift Playgrounds)