#18qiita.com明日はYUARAさんです。調子に乗って登録しまくったらトップバッターが大遅刻ですよ。バカ!!!!!!!!!本当に申し訳ございません。CalendarではErlangの記事を2つ書いてきましたが、いずれもErlangの特徴である並行処理やアクターモデルには触れていない内容の記事でした。いうわけで、Erlangの並行処理事始め的な感じで簡単にアプリを作ってみました。OAuth周り頑張ったりGUIつけたりすればサービスとしてリリースもできると思います。(他力本願)このメッセージは自動的に消滅する。こんなセリフを聞いたことがある人も記事を読んでいる人の中にはいるのではないのでしょうか。スパイ大作戦という、アメリカのドラマでのセリフです。Wikipediaこのアプリを使うと、スパイ大作戦の指令書のように指定秒数後に自動的に消滅するツイートをすることができます。これで不穏ツイートし放題ですね。(消滅するまでの間に魚拓を取られたとかで何かしらの問題に発展した場合でも私は責任を取りません。)リポジトリは以下です。ビルドツールにはrebar3を使っています。アプリへの接続はwebsocketを通して行うのでそこらへんは自由にやってください。github.comリポジトリ名が「ジェームズ・ボンド」になっているのは気にしないでください。記事を書くまで勘違いしていたなんて口が裂けても言えない。implementationなんでこれを作るのにErlangなのかというと、ツイートの投稿→削除までの流れを動的に起動した一つひとつのプロセスに任せることによってsleep関数を挟んでもラグなどが起きずに複数のツイートを並行して自動削除することができるからです。一つのツイートにつき一つのプロセスを起動して削除までを管理させることによって、連続でツイートを投稿してもキッチリ投稿から指定秒数後に自動削除されるようになっています。structureプロセスツリーと相関図は雑ですけど上みたいな感じです。シンプルでよくあるテンプレート的な構造をしています。クライアント(=wscat)とアプリをwebsocketでつなぐハンドラ。websocket経由で受け取ったメッセージを引数として、後述のjamesbot_supに対してワーカプロセスを起動するように伝える。ツイートを送信、削除するためのワーカプロセスを管理するスーパーバイザー。ワーカプロセスはws_handlerから受けとったメッセージ毎に一つずつ起動する(simple_one_for_one)。アプリのメインとなるロジックを持つワーカプロセス。モジュール内private関数にpost/1、delete/1を持ち、失敗時には再送処理を行いながら正しい順序で投稿と削除をする。投稿から削除までのインターバルや、TwitterのOAuth認証に必要な情報はconfig.hrlに書くようになっている。TwitterAPIエンドポイントがあるところ。実装解説していきます。State}.ほぼcowboyのテンプレ通りです。websocket経由でメッセージを受け取るとjamesbot_supに対してワーカを起動するよう伝えます。websocket_handleはwebsocket経由でメッセージを受け取ったときのコールバック関数、websocket_infoはハンドラのプロセスに対してメッセージパッシングされたとき、ボックスからメッセージを取り出したときのコールバック関数です。実装がおかしいのでここはあまり参考にしないほうが良さそう。}.ワーカプロセスのスペックはマクロ関数で定義してあります。再起動戦略はtransientなので、イレギュラーなEXITに対しても自動的にプロセスが再起動されるようになっています。start_worker/2が前述のハンドラから叩くための関数になっています。error.投稿、削除をする部分の関数と、レスポンスをパースしてTweetIDを取得するための関数です。(API経由でツイートを削除するにはTweetIDが必要なのです。)実装はこちらの記事を参考にさせていただきました。qiita.com意外と簡単。OK以外のレスポンスが返って来た場合の再送処理も含めているので少しコードが冗長で読みにくくなっています。ここには載せていませんが、jamesbot_srv:init/1の中でワーカプロセス自身にsend_tweetのメッセージを送信しています。先にhandle_info/2の中でツイートの投稿が成功するまで繰り返すようにし、成功した時点でtimer:apply_after/4を使ってツイートの削除をするための処理が含まれる関数を呼んでいます。(厳密には、削除の処理が書かれているのはその関数のコールバック関数の中です。apply_after/4はMFAを引数にとるのでgen_server:cast/2を呼んでhandle_cast/2の中で削除処理を行うようにしました。)handle_cast/2の中でもhandle_info/2と同様に削除が成功するまで再送をするようにし、成功したらプロセスが正常終了するようになっています。なんだかかなり納得のいかないコードになっていますが、投稿と削除の責務を別のプロセスとして分割するべきなのではと思ったのですがどうなんでしょう。誰か教えてください...。summaryobserver:start/0なんかを使ってプロセスを監視してみると、jamesbotのワーカプロセスが投稿するツイート毎に起動して削除後に消滅するのが確認できると思います。皆さんも並行処理を感じてみてください。19日の記事はYUARAさんです。バイク月別アーカイブリンクPortfolioはてなブログをはじめよう!mic_psmさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。