PhoenixでAgentを使う
Phoenixの勉強中に躓いてしまったのでメモ
Global変数らしきものが必要だったので今回はAgentを使って実装した。
他の方法としてGenServerなどがあるらしい。
elixir - A global variable in Phoenix app but not a static variable (not setting) - Stack Overflow
追記
全体で値を保持するならAgentでいいが、socketごと?に値を保持をしたければassignsを使えば簡単に実装できる
http://www.phoenixframework.org/docs/channels#section-socket-assigns
https://hexdocs.pm/phoenix/Phoenix.Socket.html#assign/3
答え
lib/projectname.ex
defmodule ProjectName do use Application def start(_type, _args) do import Supervisor.Spec children = [ supervisor(ProjectName.Repo, []), supervisor(ProjectName.Endpoint, []), worker(ProjectName.Worker, []), ] opts = [strategy: :one_for_one, name: ProjectName.Supervisor] Supervisor.start_link(children, opts) end ・・・ end
lib/projectname/worker.ex
defmodule ProjectName.Worker do def start_link do Agent.start_link(fn -> ["lobby"] end, name: Name) end end
始めはChannel内で実装しようとしたのだが、開始元のモジュールが終了すると一緒にAgentが終了されるらしい?
Golangでファイルの更新を監視してみた
痒いところに手が届くビルドツール・ファイル監視ツールがなかった(探し当てられなかった)ので作ってみた
簡単な解説?
ディレクトリ階層の深さは”/”の数から求めたので”../”のようなものは少し手間取った。
指定したディレクトリより下のファイル・ディレクトリはfilepath.Walk()で参照でき、filepath.SkipDirでスキップできる。
ファイルの最終更新時間はos.Stat()とsyscall.Stat()がある。(他にもあるかも)
参考:逆引きGolang (ファイル)
goroutineで並列に処理したり、シグナルを飛ばしてみてもいいかも
はまったところ
ischange()のfor文の
for i := range *list { }
を
for _, i := range *list { }
と書いてしまうとiはlistの値渡しになってしまうので注意
dockerでxv6をビルドする
6.828 / Fall 2016
github.com
MacでビルドするのはめんどくさそうだったのでDockerの練習がてら試してみた
環境
qemu 2.8
docker 1.13.1
実行方法
Dockerfile
FROM ubuntu:14.04 RUN sudo apt-get update RUN sudo apt-get install -y build-essential qemu WORKDIR xv6 ENTRYPOINT ["make"] CMD []
Command
コンテナを起動する際にdocker内でqemuを起動するかローカル上で起動するかの2通りのやり方がある(他にもあるかもしれないが)
gdbには対応していないはず、入れたら済む話だけどね
docker build -t xv6 .
- docker内で実行するパターン
docker run -v $(pwd)/xv6-public:/xv6 -it xv6 qemu-nox
- docker外で実行するパターン
実行方法はMakefileを参考にして動かした
docker run -v $(pwd)/xv6-public:/xv6 -it xv6 qemu-system-i386 -nographic -drive file=fs.img,index=1,media=disk,format=raw -drive file=xv6.img,index=0,media=disk,format=raw -smp 2 -m 512
Dockerのvolumeオプションは絶対パスじゃないと動かないっぽい
昔はqemuってコマンドがあったような気もするけど今はないっぽいので注意、
単に動かしたいだけならDockerで動かすのが一番楽な気がする