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

Done:

Todo:

  • ブラウザ
    • ツリー全体を展開する
    • 上下移動
      • 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
    • タブ
      • システムメニュー
        • サインイン/サインアウト
      • ユーザーメニュー
        • アクティビティ
          • ユーザー/グループ...
    • オフライン対応
      • すごく欲しいがやらない
      • 当初想定より簡単にできるかも
  • サーバ
    • 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
    • 操作権限チェックを入れる
    • ルート操作の防止を入れる
  • /goals/:idを/goals/:hash_digestにする
  • User.nickにunique属性つける
  • check_descendants!でArgumentErrorにしてるところを独自例外に変える
  • on_delete: :delete_allと再帰クエリでどっちが速いか調べる

Memo:

Programming Phoenix: Productive; Reliable; Fast

Programming Phoenix: Productive; Reliable; Fast

Clojureを勉強している7

ns関数の引数に(gen-class)を入れないとREPLが立ち上がったときに環境を読んでくれないのでハマった。

  • Basics of core.async Channels
    • まずは同期:
      • chanでチャネルを作成
      • chanの引数に数字を与えるとその分だけバッファが作られる
      • >!!ブロッキングput
      • <!!ブロッキングgetl
      • close!でチャネルを閉じることができる
        • が、バッファを空にするまではgetできる
        • nilをputすることはできない(チャネルが閉じられているときにgetする値がnilだから)
    • 次は非同期:
      • >!でノンブロッキングput。goブロックで囲う必要がある。
      • <!でノンブロッキングget。goブロックで囲う必要がある。
      • go-looprecurで待ち受けできる
      • alts!複数のチャネルを扱うことができる。
  • Serving Tea at a core.async Tea Party
    • Google検索とYahoo!検索の2つのチャネルを作って速い方の結果を取得するサンプルコード
    • と思ったらgoogleとyahooは例えだった。中でランダムミリ秒数スリープして定形の値を返すだけ。
  • Creating a Tea Party to Be Run from the Command Line

    • おお、jar作るのか。起動が速くなるのかな?
    • project.clj(:aot project-name.core)オプションを足すだけ。
    • lein uberjarで作成!
      • コンパイル遅い。もしや、Scalaと同じ悩みがあるのでは? いやいや、立ち上がりが遅いだけだろう。
    • targetディレクトリにjarが出来上がっている
      • -standalone.jarClojureクラスも全部入り。もう一個の方は自分と(この例では)core.asyncのみ入っているjar。
      • java -jar project-name-0.1.0-SNAPSHOT-standalone.jarで実行!
      • やっぱり立ち上がりが遅かった。
  • Chapter 6 Communication with core.async

    • Basics of core.async Channels
    • Serving Tea at a core.async Tea Party
    • Creating a Tea Party to Be Run from the Command Line

Living Clojure

Living Clojure

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

今日は出だしが遅かったので進捗が少ない(しかし、コミット数は多め)。

Done:

  • ブラウザ
    • Component分割
    • CSS3でリストのツリーをカラム表示に変換できるか調査
      • 実験中……
        • 先祖を詰めるのが難しい
    • JSONPathが必要?

Todo:

  • ブラウザ
    • 兄弟を展開する
    • 子を展開する
    • 先祖を展開する
    • 上下移動
      • 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
    • タブ
      • システムメニュー
        • サインイン/サインアウト
      • ユーザーメニュー
        • アクティビティ
          • ユーザー/グループ...
    • オフライン対応
      • すごく欲しいがやらない
  • サーバ
    • 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
    • 操作権限チェックを入れる
    • ルート操作の防止を入れる
  • /goals/:idを/goals/:hash_digestにする
  • User.nickにunique属性つける
  • check_descendants!でArgumentErrorにしてるところを独自例外に変える
  • on_delete: :delete_allと再帰クエリでどっちが速いか調べる

Programming Phoenix: Productive; Reliable; Fast

Programming Phoenix: Productive; Reliable; Fast

Clojureを勉強している6

  • Getting Set Up with a Clojure Editor
  • Creating Our Project with Leiningen
    • なんや知らんがネームスペースをcoreから変えていく。
    • lein testでテスト実行
  • Dependency Management with Leiningen
    • パッケージのリポジトリはデフォルトでは、ClojarsMaven Centralの2つを見ると。
    • snake_case、CamelCaseは知っていたが、kebab-caseと呼ぶのは初めて知った。LISP系はケバブケースが使えるので素敵。
  • Using Libraries in Your Own Project

    • project.clj:dependenciesに使いたいパッケージ名とバージョンを加える。
    • :requireでモジュールを取り込み。:asで別名を付けることができる。
    • module-name/->function-nameで関数呼び出し。
    • (defn -main [& args] ... )でメイン関数を設定しlein runでモジュール名を書かなくても実行できる
  • Chapter 5 How to Use Clojure Projects and Libraries

    • Getting Set Up with a Clojure Editor
    • Creating Our Project with Leiningen
    • Dependency Management with Leiningen
    • Using Libraries in Your Own Project

Living Clojure

Living Clojure

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

Done:

  • サーバ
    • リファクタリングいろいろ
    • Goal.Commands
      • copy
    • Goal.Queries
      • self_and_descendant_ids
      • descendant_ids
    • POST /goals/:target_id/copy?dest_parent_id=:dest_parent_id&dest_position=:dest_position

Todo:

  • サーバ
    • 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

Clojureを勉強している5

  • Javaとの互換性の話。
    • .だけでJavaメソッド呼び出せるのかすげえな。
    • new関数はわかりやすいんだけど、型の後ろに.付けてインスタンス生成するのはちょっと覚えにくいな。
    • ElixirもErlangのモジュール呼び出すの簡単になってるし、VM利用言語は気を使ってるなぁ
    • :importでライブラリのインポート。
    • /を挟んでスタティックメソッドの呼び出し。replのタブ補完が効くのが嬉しい。
    • インポートしなくてもFQDNでライブラリ使える。
    • dotoマクロでメソッドチェーンできる。が、この辺は元の書き方より厳しいものがあるな。
    • 頭に:のないimportでもインポートできるんじゃん。
  • ポリモーフィズム

    • condでクラスに応じて出力変えるサンプルコードが出てきてこれでポリモーフィズムって言う気?と思ったら、その後ちゃんとそれっぽいものが出てきた。
    • defmultidefmethodか。ふむ。
    • :default付けたらmethod_missingみたいな感じか。この例だとclass_missingか。
    • マルチメソッドの他にプロトコルってのもあるよーって。
    • defprotocolにはextend-protocolと。
    • defrecordで型が作れるのか。
    • .-プリフィクスでフィールドにアクセス。
    • おっと、deftypeが出てきた。見た目同じように見えるなぁ。
      • 構造化データを扱うときがdefrecordそうじゃないときがdeftypeとのこと。
  • Chapter 4 Java Interop and Polymorphism

Living Clojure

Living Clojure

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