Clojureを勉強している4

状態とコンカレンシーの話。

  • atom出てきた。
    • reset!で再セットか
    • swap!
      • 別のスレッドで使ってる場合はリトライされるのか。
      • 例ではfutureで別スレッドを用意
      • printlnみたいな副作用を含む関数などを差し挟むと当然同じ出力が発生する
      • しかし、atomは想定通りに更新される。かくしてswap!は副作用がないってわけか。
  • 次はrefs。
    • ClojureはSTM付いてるのか。えらい
    • alterもリトライする
    • atom/swap!ref/alterがそれぞれ対応してるのか
    • commuteはリトライしないとな。DBとか扱うときはこれになるんかな
    • ref-set便利だな。
  • 次はagents。非同期。

    • agent/sendがまた対応してると。
    • send-offはI/O-blockingの可能性があるときに使用するのか
    • 失敗した時restart-agentでリセットすることもできる
    • set-error-mode!set-error-handler!であらかじめ失敗した時の処理を定めておいても良いと。
  • Atom は 同期 で Uncoordinated

  • Ref は 同期 で Coordinated
  • Agent は 非同期 で Uncoordinated

  • Chapter 3 State and Concurrency

    • Handling Real-World State and Concurrency

Living Clojure

Elixir/Phoenixでウェブサービスを作っている15

今日は軽微なコミットしただけで、画面の方考えてた。そろそろサーバの方終わるので、と思ったんだけどサーバ側も増えた。先に画面やるけど。

Done:

  • Phoenix 1.1.1から1.1.3へアップグレード
    • 参考:1.1.1 -> 1.1.2
      • package.jsonを書き換えた後、npm installを実行すること!

Todo:

  • サーバ
    • POST /goals/:target_id/copy?dest_parent_id=:dest_parent_id&dest_position=:dest_position
      • copy
    • Goal
      • child_ids
      • sibling_ids
      • ancestor_ids
      • descendant_ids
    • Activity(activities)
      • id
      • goal_id
      • user_id
      • backup(json)
      • diff(json)
    • Status(statuses)
      • id
      • name
      • position
      • enable
      • ユーザー定義
        • デフォルト
          • 0: todo
          • 1: doing
          • 2: done
          • -1: close
          • done/closeは特別にしたいな……
        • 面倒くさいなこれ。固定にしよっかな
    • Group(groups)
      • 1ユーザー1グループ作る?
      • id
      • name
    • Membership(memberships)
      • user_id
      • group_id
      • pending
    • 操作権限チェックを入れる
    • ルート操作の防止を入れる
  • ブラウザ
    • 兄弟を展開する
    • 子を展開する
    • 先祖を展開する
    • 上下移動
      • jk
    • 右移動
      • h
    • 左移動
      • l
    • new/create
      • n: 新規、enterで作成
    • edit/update
      • e: 編集、enterで更新
    • delete
      • X: 削除
    • copy/cut/paste
      • c: 単体コピー
      • C: サブツリー全体をコピー
      • x: カット
      • v: 下にペースト
      • V: 上にペースト
    • status切り替え
      • f: forward
      • b: back
      • q: close
    • タブ
      • システムメニュー
        • サインイン/サインアウト
      • ユーザーメニュー
        • アクティビティ
          • ユーザー/グループ...
    • オフライン対応
      • すごく欲しいがやらない
  • /goals/:idを/goals/:hash_digestにする
  • User.nickにunique属性つける
  • check_descendants!でArgumentErrorにしてるところを独自例外に変える
  • on_delete: :delete_allと再帰クエリでどっちが速いか調べる

SQLアンチパターン

SQLアンチパターン

Programming Phoenix: Productive; Reliable; Fast

Programming Phoenix: Productive; Reliable; Fast

Elixir/Phoenixでウェブサービスを作っている14

Done:

  • サーバ
    • PUT /goals/:id
      • check_descendants!
        • 自分の子孫に移動しないように確認
      • descendants
      • self_and_descendants
    • DELETE /goals/:id

Todo:

  • サーバ
    • Goal
      • child_ids
      • sibling_ids
      • ancestor_ids
      • descendant_ids
    • POST /goals/:id/copy?to_id=:to_id&to_position=:to_position
      • copy
    • ユーザー権限チェックを入れる
    • ルートガードを入れる
  • ブラウザ
    • 兄弟を展開する
    • 子を展開する
    • 先祖を展開する
    • 上下移動
    • 右移動
    • 左移動
    • new/create
    • edit/update
    • delete
    • copy/cut/paste
    • キャッシュ
  • /goals/:idを/goals/:hash_digestにする
  • User.nickにunique属性つける
  • check_descendants!でArgumentErrorにしてるところを独自例外に変える

SQLアンチパターン

SQLアンチパターン

Programming Phoenix: Productive; Reliable; Fast

Programming Phoenix: Productive; Reliable; Fast

Clojureを勉強している3

今日は第2章第2節から第2章の最後までやりました。いや〜面白かった。綺麗だね。

  • Functions Creating Functions and Other Neat Expressions
    • partialがカリー化か。
    • compすごい。
  • Destructuring
    • 最近の言語は付けるようになってるね。良い
    • mapのdestructuringのキーとバリューの位置がちょっと混乱した。let関数への引数だから妥当か。
    • :asいるよね。
    • destructuringでデフォルト値(:or)書けるのは珍しくない? すごい
    • :keysは頻出すると。
    • 関数定義の引数でも使えると。無名関数もかな?
  • The Power of Laziness
    • rangeは引数付けないだけで自然数の無限リスト得られるのか!へぇ〜
    • (class (range 5))(class (range))で見ると型が違うのな。前者がclojure.lang.LongRange、後者がclojure.lang.Iterate
    • repeatももちろんlazyだとさ。
    • rand-int便利。
    • (repeat 5 (rand-int 10))したら妥当だけどちょっと笑った。
      • 正解は(repeatedly 5 #(rand-int 10))(take 5 (repeatedly #(rand-int 10)))でも良し。
      • repeatedlyさんのrepeatedlyはこれかな?
    • restは無限リストに使えるとのこと。そうだね
  • Recursion
    • 普通の再帰関数の書き方。
    • loop/recurでも書ける。例では引数の1つを隠蔽できるのでこっちが良いとしてる。
    • あー、暗黙の末尾再帰最適化とかじゃなく明示的にrecur使う設計になってるのね。こっちの方が勘違いがなくていい気がする。
  • The Functional Shape of Data Transformations

    • mapの解説。
    • doallで即時実行できるのか
    • reduce、初期値accなくても実行できるんか。doc見たら最初の2つで実行した結果から始めるみたい。すげえ
    • filter/removeか。rejectとかではないんだな。
    • for出た。letとか:inとか:ofとかいらんのね。
      • コレクション複数取ると全組み合わせ出すのか。やべえな
      • おっと:let出てきた。面白いな。
    • flattenRubyと同じ。
    • vecとかsorted-mapとか型を変える関数あるけどintoが何でも対応できて便利だな。
    • partitionは余りは捨てて、拾いたいときはpartition-allか。引数じゃなくて名前が違うんだな
      • partition-byも出てきた。こっちは分ける関数を第1引数に取るのか。
  • Chapter 2 Flow and Functional Transformations

    • Functions Creating Functions and Other Neat Expressions
    • Destructuring
    • The Power of Laziness
    • Recursion
    • The Functional Shape of Data Transformations

Living Clojure

Living Clojure

Elixir/Phoenixでウェブサービスを作っている13

読書の方は1冊読み終わったので1日休憩ズラ。

Done:

  • サーバ
    • PUT /goals/:id
      • update
      • move
        • inc positions
        • dec positions
          • ややこしいしめっちゃ汚い

Todo:

  • サーバ
    • PUT /goals/:id
      • 自分の子孫に移動しないように確認
    • DELETE /goals/:id
    • POST? /goals?:from_id&to_id
      • copy
      • API要検討
    • ユーザー権限チェックを入れる
  • ブラウザ
    • 兄弟を展開する
    • 子を展開する
    • 先祖を展開する
    • 上下移動
    • 右移動
    • 左移動
    • new/create
    • edit/update
    • delete
    • copy/cut/paste
    • キャッシュ
  • /goals/:idを/goals/:hash_digestにする
  • User.nickにunique属性つける

SQLアンチパターン

SQLアンチパターン

Programming Phoenix: Productive; Reliable; Fast

Programming Phoenix: Productive; Reliable; Fast

Elixir/Phoenixでウェブサービスを作っている12

起きるのが遅かったのでここまで。久しぶりにめっちゃ熟睡できたのでヨシ。

Done:

  • サーバ
    • 閉包テーブルやめて隣接リストwith再帰クエリにする
      • DBをPostgresにする
        • 一応テスト書いてたので割りと簡単にできた
      • insert
      • children
      • parent
      • siblings

Todo:

  • サーバ
    • PUT /goals/:id
      • update
      • move
    • DELETE /goals/:id
    • POST? /goals?:from_id&to_id
      • API要検討
      • copy
    • ユーザー権限チェックを入れる
  • ブラウザ
    • 兄弟を展開する
    • 子を展開する
    • 先祖を展開する
    • 上下移動
    • 右移動
    • 左移動
    • new/create
    • edit/update
    • delete
    • insert
    • move
    • copy/paste
    • キャッシュ
  • /goals/:idを/goals/:hash_digestにする
  • User.nickにunique属性つける

SQLアンチパターン

SQLアンチパターン

Programming Phoenix: Productive; Reliable; Fast

Programming Phoenix: Productive; Reliable; Fast

DDDを読んでる15

全部読み終わった。感想は特にない。スマン。

「それは違うだろ」とか「もっと上手いやり方がある」とかは一切出てこなかったな。元々の自分の読書の仕方が「鵜呑み」であるということもあるのだが、至極真っ当なソフトウェアの作り方だと思う。

う〜ん、全て頭に入ってるとは言えないので、もう1周したいが時間がない。経験を積みながら時折参照していくのが一番いいんだろう。6月に読みなおしの予定をいれとこうかな。と思ったら、実践ドメイン駆動設計がその後の10年で積み重ねられた知見が載ってるということなので、これも読まねばならないだろう。3冊ぐらい積んでるのでちょい後回しになるが読もうと思う。

  • 第17章 戦略をまとめ上げる

    • 大規模な構造と境界づけられたコンテキストを組み合わせる
    • 大規模な構造と蒸留を組み合わせる
    • まず評価する
    • 誰が戦略を策定するのか?
      • アプリケーション開発から現れる構造
      • 顧客に焦点を合わせたアーキテクチャチーム
    • 戦略的設計上の意思決定を行うために欠かせない6つのこと
      • 同じことが技術的なフレームワークにも当てはまる
      • マスタプランに注意すること
  • 結論

    • エピローグ
    • 展望

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)