メモ帳

やったこととかちまちまと書く 需要のない記事を生成している

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が終了されるらしい?

注意

libディレクトリは起動時のコンパイルでしか読み込まれないようで、コマンドラインツールをつけっぱなしで再コンパイルしても更新されない。なので変更を反映させたければ一度コマンドラインツールを終了させる必要がある。

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で動かすのが一番楽な気がする