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

Done:

  • ブラウザ
    • ゴールツリー全体をセンタリング
    • 現在のゴールが中心になるようにスクロール
    • スクロールのイージング
    • power_assert_exのバグが直ったので再び採用

Todo:

  • ブラウザ
    • 現在あるべき位置をsubscribe()に飛ばしてそこでスクロールする
    • ツリー全体を展開する
    • 上下移動
      • 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を勉強している9

7章の続き。

  • Using Clojure in Your Browser with ClojureScript
    • ClojureScriptだっ!
    • project.cljのdependenciesにorg.clojure/clojurescriptを加え、pluginsにlein-cljsbuildを加え、cljsbuildの設定を書く、と。
    • lein trampoline cljsbuild repl-rhinoでclojurescriptをREPLで試すことができる。
    • clojurescriptライブラリはGoogleなのに、JSエンジンはv8じゃなくてrhinoなんや……
    • js/を頭につけてJSの関数を実行できる。
    • clojure.coreは動く感じだな。classとかはアカン
    • atomはあるけど、agentやrefがない
    • 数値はintegerとfloatだけサポート
    • 充分やな。本の中のものよりバージョン上がってるからいくらかサポートされてたりして。
    • ^:exportexport default functionみたいなもんかなと思ったけど違うっぽい。Google Clojure compilerがminifyで関数名を短縮しないようにだって。
    • lein cljsbuild autoで監視コンパイル
    • :optimizations :whitespace:optimazations :whitespacetypoしてたせいで動かなくて「アレッ?アレッ?」って言ってた。
  • Browser-Connected REPL

    • なんだこの節タイトルは。ブラウザで動いているClojureScript(JS)を動かせるというのか。やべぇな。
    • cljsファイルでclojure.browser.replをrequireして、(repl/connect "http://localhost:9000/repl)"しておく。
    • lein trampoline cljsbuild repl-listenするとつなげる。
    • js/alertしたらダイアログが出るなぁ。すごい。
  • Chapter 7 Creating Web Applications with Clojure

    • Using Clojure in Your Browser with ClojureScript
    • Browser-Connected REPL

Living Clojure

Living Clojure

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

寝てて更新が遅れた。今日は深夜大寒波で足が寒くてプログラミングやってらんなかったのと、Clojureの勉強の方でVimの設定にハマったので、些少な進捗しか出せなかった。明日は頑張る。

Done:

  • ブラウザ
    • 開いてないゴールをdisplay: noneするようにした

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を勉強している8

  • Creating a Web Server with Compojure
    • 第7章はウェブアプリを作るということなので楽しみでござる
    • おっ、ClojureScriptも書くらしい。
    • Compojureというライブラリを使うらしい。
    • CompojureはRingというローレベル・ウェブアプリケーション・ライブラリにシンプルなルーティングを提供するものらしい。RingがRubySinatra相当なのかな?
    • サンプル・アプリケーション名はcheshire-cat。いちいち書かなかったけどこの本のサンプルは全て不思議の国のアリスの筋書きに則っている。
    • Clojure+ClojureScriptって綺麗な組み合わせだよなぁ。JavaScriptで全部書ける次に良い。あとこんなに統一できるのはScala+Scala.jsぐらいか?
    • プロジェクトのスケルトン作るのに、lein new compojure cheshire-catしろって書かれてるんだけど、compojureいつダウンロードしたの?leiningenに組み込みなの???どゆこと?
    • Clojure、謎が多くて、前の章ではcore.asyncってライブラリ使ったんだけど、ダウンロードするコマンドなどは一切打った覚えがなく動いていて、便利と同時になんか表示して欲しい感じがする(自動でCLASSPATHを設定するVimプラグインのせいか?)
    • 実行したら、Retrieving compojure/lein-template/0.4.3/lein-template-0.4.3.{pom|jar} from clojars、みたいなメッセージ出た。
    • 自分で生成したプロジェクトのREADME.mdを読む。ほうほう、lein ring server でサーバが起動するのか。
    • lein ring server したらすごい勢いでダウンロードしだしたw apacheとかjettyとか言う文字列が見えてビビる。マジで?
    • そしてブラウザが自動で開いた。Omakaseだ。
    • Clojure/Ring/Compojureの使うポートは3000で、今Railsプロジェクトやってなくて良かったという思い。いやポート番号ぐらい指定できるだろうけど。(ちなみにPhoenixは4000)
    • まぁ例えだから正確じゃないのでどうでもいいんだが、RingがRack、CompojureがSinatra相当っぽい。
    • 自動生成されるRing middlewareのsite-defaultsのオプションが見たければ、https://github.com/ring-clojure/ring-defaults を見よとのこと。はい。
    • Compojure、ルート追加してもサーバ再起動しなくていいのスゴイな。楽。
  • Using JSON with the Cheshire Library and Ring
    • サンプルプロジェクト名がcheshire-catなんだけど、この中でCheshireというJSONを扱うライブラリを使うのでややこしい
    • lein ring server-headlessするとnot open a new windowだよって書いてあったので実行してみたら、ブラウザのウィンドウが開かないということだった。てっきりターミナルのウィンドウの1つを専有しないって意味かと思ってた。
    • leinと打つたびにleiningenさんのゴーストがささやいてツラい
    • Cheshireはgenerate-stringClojureデータ構造からJSONエンコードparse-stringがデコード。ふむ。
    • ただし、parse-stringの第2引数にtrueを与えると、キーがキーワードになる、と。
    • app-routesではレスポンスに:status, :headers, :bodyを含んだマップを返すことができると。
    • Cheshire使ってJSONエンコードしてたのにRing-JSON入れれば自動的にbodyのClojureデータ構造をJSONに変換してくれるから要らない取り換えと言い出したぞ
    • Cheshireからring-json&ring.util.responseに替えたらoctet-streamを返すようになって、(ring.util.response/response res "application/json; charset=utf-8")する必要があった

この辺で時間切れでギブアップ。というか、tpope/vim-fireplaceがクソ重かったので消したり、kien/rainbow_parentheses.vimがうまく動かなくてluochen1990/rainbowに入れ替えたりしてて時間かかった。

つづく

  • Chapter 7 Creating Web Applications with Clojure
    • Creating a Web Server with Compojure
    • Using JSON with the Cheshire Library and Ring

Living Clojure

Living Clojure

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