やりたいことがない
転職して三ヶ月が経った。最初はまた新しい環境で人間関係を作るのか、と少し萎えていたところもあったが、思ったほど心配はしなくて済みそうだった。
周囲の人も気さくでは無いが、共同体というものを感じさせない。言い方を変えると、集団生活という意識に乏しい人が多く、馴染むのはそんなに大変ではなかった。孤独は集団のなかで発生するという言葉が思いだされる。
仕事も前とは大きく変わったが、どうやら期待値は満たしているようだ。
人が少なすぎるというのもあるが、入ってそうそう新しいプロジェクトでは音頭を取ることになったりもしている。
私生活では、GWを活用してラスベガスに遊びに行ってきた。趣味のポーカーのためである。
現地に住んでいる知人が、ポーカープレイヤー向け安宿を知っているらしく、一週間で$100と破格で泊めてくれた。
当日も現地の有名カジノを色々案内してくれたり、現地でポーカーで生活をしている人たちから面白い話を聞いたり、自分も実際にプレイして$400くらい稼いでみたりした。
もう少し滞在期間が長ければ交通費・宿泊費含めてプラスにするのも、そんなに難しくはなさそうだった。
こうやって列挙してみると、順風満帆に見える。
だが、本当にこれで良いのか、わからなくなっている。
ここ4年くらい、人生これで良いのか分からんという問題意識があり、仕事について真面目に勉強していた。結果、転職して給与も上がり、資格もいくつか取り、そこそこ評価燃されつつあるような気がする。
ただ、内的な幸福にはあまり関係がなかったような気がする。
結局、多少何かができるようになっても、この世にはまだまだ高い山が存在するという当たり前の事実に気づかされるに終わった。どうしても目標とする地点を絶えず用意せざるを得ず、定期的に情報を得て追いついていかないような作業は、周囲や世間と常に比較する必要があり、いつまで経っても満足感は得られないようだ。
そこで内的な幸福を得るために、自分が心からやりたいと思うことに目を向けたいと思った。
驚いたことにそれが何も無いのである。
確かにポーカーやゲームは一つの選択肢だが、これもまた他人と競争があるという意味では仕事と変わらないような気がする。どっかで疲れてしまうだろう。
色々なことに手を出しているので、「多趣味でいいね」と言われることがある。
そう言われるたびに、楽しそうにやってるように見えるかもしれませんが、自分でもこれが楽しいのかどうか良く分からないんですよね、と心で答えている。
ReactiveExtensionsへの理解のメモ
何故最近Rxについて調べているのか
個人的な動機
最近は動くことより、読みやすい設計、変更に強い設計などに興味がある。
その中で、Reactive Extensionを使ったReactive Programmingに触れる機会があったので、
勉強してみた。
# ゴール
正直内容の抽象度が高すぎて理解が難しいと思うので、以下を覚えてもらえれば良い。
* ReactiveProgrammingという概念が存在すること
* ReactiveExtensionsというライブラリが存在し、それは特定言語だけではなく様々な言語に存在すること
* ReactiveExtensionsは非同期処理を扱う時に便利であること
# ReactiveExtensionsとは
ReactiveProgrammingを実現するためのデザインとライブラリ。
Java/Kotlin/JavaScript/C#/Scala/Python/Swift etc etc
主に非同期な処理を解決するためのフレームワーク。
## 非同期処理とは
* ユーザーからの画面入力
* ボタンタッチ
* HTTPリクエスト/レスポンス
* 現在地取得センサー
* ファイルアクセス
etc
## 既存の問題解決手法
* delegateパターン(コールバック)
相手に終わったらこれを呼び出してね、とお願いする
* Observerパターン
イベント発信側と受信側を用意し、非同期処理が完了した時点で受信側にそれを通知するというデザインパターン
(GoFデザインパターンなどを参照)
RxはObserverパターンをより拡張(隠蔽)したものである。
ReactiveProgrammingはデザインパターンや思想なので、言語を跨いで利用できる。
実際、RxJSで利用していたのでRxSwiftは簡単に扱えた。
# ReactiveProgrammingのパラダイム
1. 宣言的な記法(どうするではなく、どうなっているを記載する)
2. データの時系列リスト化
* 宣言的プログラミングや関数型プログラミングなど似たような概念が結構あって、僕もまだ区別できていない。
## 反応的(宣言的)
反応的に変化しない命令的な場合
A = 1
B = A * 3
A = 2
A-> 1,B -> 3
反応的に変化する宣言的な場合
A = 1
B = A * 3
A = 2
A -> 1, B -> 6 <— AとBは *3 という関係性が定義されているので、Aの変更がBにまで反映する。
B = A * 3
BとAは*3の関係性を持つ。ここで定義されたのは何をするのか、ではなくどうなっているのか?である
ExcelなどはReactiveと言える。プログラムとしては奇妙だが、動作自体は直感的とも言える。
内部的にはAの変更を検知して、Bに反映されているのだが、その部分を隠蔽してくれるのがRxとも言える。
## 非同期イベントを全てストリーム(時系列リスト)として考える
関係性と考えると、その関係性への入力は「状態」とみなすことができる。
そして、状態というのは時系列に変化する(例えばチェックボックスやテキストボックスも状態と考えることができる)
全てのものがどういう状態の場合、どうなるのか、ということを定義し、
そこに時系列的なデータを入力すると、データや画面が入力に応じてパチパチと変わっていくよね?
ということである。
(すべてのセルに関数が埋め込まれており、ある一つのセルが時系列に応じて変化していく様を想像してほしい)
## そう考えると何が良いのか?
抽象度が高すぎて難しいかもなので、実際のコードを見た方が早いかも。
1. テストがしやすくなる、動作が理解しやすい
手続き型で“BにはAに3をかけたものを入れる”というコードを書いたときのテストは、”BがAの3倍であること”を確認するはずである。これは解説すると、”BにAに3をかけたものを入れた意図は、BがAの3倍であるようにしたいから”という意図を表現したいからである。
宣言型の場合、”BはAの3倍である”と書いており、意図もなく書いた通りである。もう定義の時点で、テストの目的の一つである意図を表現することができているのである。
つまり、テストとはそもそも宣言的なものであるため、宣言的に書かれるとテストがしやすくなるのである。
また、コードは振る舞いそのものなので、振る舞いは当然理解しやすい
2. すべてのデータが変換可能になる
先の例だと、A -> [1,2,3]となったときB->[3,6,9]となる。これは一つのストリームが別のストリームに変換できたことになる。
チェックボックスがクリック何度かクリックされると、そのたびテキストボックスに「使用可」「使用不可」と表示される流れを考える。
[false, true, false] -> [使用不可,使用可,使用不可]というストリーム変換と理解できる。
このように抽象度を引き上げると、全てのものに関係性を記述することが可能になる。
3. 組み合わせられる
"CはAの偶数判定の結果である”という定義があったとする、
A[1,2,3] -> C{false, true, false]となる
当然このCというストリームは2.のテキストボックスの表示に利用することができる。
# memo
* 状態は変化するが、振る舞いは変化しない
* 変化するものを引数にし、変化しないものを固定させる。
→状態を変数化、振る舞いを定数化させる。
→また、状態は時系列に変化するため、状態をシーケンシャルなリストで表現する
RxSwift ReactiveProgramming with Swift メモ2
Subscribing to observables
- ObservableをSubscribeすることはIteratorの.nextを呼ぶことと近い
- event要素はOptionalなのでUnwrapして使うことができる
RxSwift ReactiveProgramming with Swift メモ
Rxswift: Reactive Programming with Swift, Second Edition
- 作者: Raywenderlich Com Team,Florent Pillet,Junior Bontognali
- 出版社/メーカー: Razeware LLC
- 発売日: 2017/12/15
- メディア: ペーパーバック
- この商品を含むブログを見る
届いたので読み始めている。
最近読みたい本が日本語にない。ネットサーフィンも英語のサイトを巡ることが増えて来た。英語はとても苦手なのでGoogle翻訳を駆使している。
Chromeの拡張が便利だ。
しかし、本は拡張を使うこともできないので愚直に辞書を引きながらである。辛い。
■読書メモ
Introduction asynchronous programming
* 非同期プログラミングは一般的になっている
* 音楽再生、キーボード処理、動画ダウンロード全て非同期に行われている
* これらはOSが別スレッドで処理してくれているが、プログラムを書く上ではとても複雑になってしまう
* iOSは非同期を解消するために様々なAPIや実装パターンを用意している。Clousure,delegate,observerのsubscribeなどがそれにあたる
*ただバリエーションが増えるとその分難しくなる
一つのことにすべての力を注ぐこと
命と魂をすり減らしながらゲームしてた。
とりあえずバッドエンドを見て一周。二周目に入ってます。
10時寝2時起きみたいな感じでしたが流石に疲れますね。
でも、何かに集中するという感覚を久々に取り戻しました。日常生活にもこの感覚をうまく取り入れたい。
精神と時の部屋という表現は便利であるな
ゲームをしていたら、飯も食わずに10時間経ってました。
おそろしや。
仕方ないので、飯を食い、ノルマの勉強をこなしてまたゲームに戻ります。
毎日、毎日、やりたいことがいっぱいです。
終わりの始まり
ゲームを買いました。
なんやかんや10年近く毎回毎回新作を楽しみにしていたゲームの最終作。
すべてに始まりあれば終わりもあるのです。
最近勉強時間を計測してみましたが、大体平均一日2時間といったところ、もう少し増やしていきたいですね。