はじめに 2016年12月現在、SlackAPIでは公式に全チャンネルの全発言をリアルタイムに取得する方法が用意されていません。 つまりこれはSlackが我々に叩きつけた挑戦状ではないでしょうか?(?) 全能感を味わうツールを作りたかった私は試行錯誤の上、検索APIを利用する方法で全チャンネルの全発言を取得することができたので、今回作ったツールを含め紹介します。 slackの検索APIについて https://api.slack.com/methods/search.all を使用します。 実は中身は… この検索APIのバックエンド実はsolrなんです!様々なクエリを投げていろいろ実験してるときに白状しました! このリクエストは - 昨日以降の発言 - タイムスタンプでソート とだけ指定してSlackの検索APIを殴っています。 なんとこれだけで、10秒くらいの遅延はあるもののほぼリアルタ
こちらを読みました。 blog.kaneshin.co channel自体にdispatch機構があるからもっとシンプルに書けるのでは?と思って書き直したのがこちら。 コードだけぶん投げてもアレなので、あとで解説書きます。 ついでに「go1.7で標準化されたcontext使ったらどうなるか」も気力次第で書くかもしれません。 というわけで追記というか、本編というか、解説です。 channel整理 元のコードを読んでいくと、 dispatcherのqueueにjobを突っ込む dispatcherがidle状態のworkerをpoolから取り出す 同じ行で取り出したworkerのqueueにjobを渡す workerがjobを受け取って処理する。 というカンジの処理の流れになってるんですが、dispatch機構自体がchannelにはあるので、 dispatcherのqueueにjobを突っ込
Visualizing Concurrency in Go GopherCon, July 11, 2016 Ivan Danyliuk, Typeform Number forms Visualizations How do you see concurrency? Introducing GoTrace tool Hello, world! package main func main() { ch := make(chan int) go func() { ch <- 42 }() <-ch } Hello, world! Timer func tick(d time.Duration) <-chan int { c := make(chan int) go func() { time.Sleep(d) c <- 1 }() return c } func main() { for
golang の channel は他の言語に見ない独特のパラダイムを開発者に提供します。 単純にスレッド間でメッセージングをするだけでもC言語で書けばそこそこの量になったり、慣れていない人であればどう実装すればいいか分からないなんて事もあったと思います。しかし golang の goroutine/channel は、やっている内容の割にとても容易にスレッド間通信やキューイング、処理の受け待ち等を実装できる様になっています。尚、channel をどの様に適用したら良いかについては以下を参照下さい。 Big Sky :: Golang の channel の使い所 golang の特徴と言えば goroutine と channel ですが、その使いどころに悩む人もおられる様です。 goroutine は非同期に実行される処理、channel はその grout... http://mat
5年前に買った『Java並行処理プログラミング ―その「基盤」と「最新API」を究める―』をようやく読んだ。買った頃には Perl やシンプルな JavaScript ばかり書いていたので並行プログラミングなんてほとんど気にすることがなく、実感がなくて読むのも途中で止まってしまっていた本で、家を掃除しているときに見つけたもの。その後も趣味で Android アプリを書くなど Java に触れる機会はあったけれど、せいぜいが AsyncTask を使うくらいで、マルチスレッドを強く意識してコードを書くこともなかった。 Java並行処理プログラミング ―その「基盤」と「最新API」を究める― 作者: Brian Goetz,Joshua Bloch,Doug Lea出版社/メーカー: ソフトバンククリエイティブ発売日: 2006/11/22メディア: 単行本購入: 30人 クリック: 442回
ミドルウェアとして Use するだけでパフォーマンスが向上するなんて夢の様な話はないと思っていたけど、HTTP Coala はそれをやってのけている様です。 goware/httpcoala · GitHub Go http middleware handler for request coalescing https://github.com/goware/httpcoala ちょっと信じがたかったので、まずはベンチマークを取ってみた。 Coala 未使用 package main import ( "net/http" "github.com/zenazn/goji" "github.com/zenazn/goji/web" ) func main() { goji.Get("/", func(c web.C, w http.ResponseWriter, r *http.Reques
そういえば金沢に行って来た話の2〜4日目をかいてる途中で2ヶ月くらい経ったことに気付きましたが、まぁその話はおいておいて今日はGoの話です。 さて、このタイトルを見てGoに詳しく賢明な読者の方々は「あぁまたこの話題だよ、Goでchannelがcloseしてるかどうか知りたいようなパターンはだいたい書いてるアプリの設計とかchannelの使い方が間違ってるんだからやめとけ」と眉をひそめるかもしれません。まぁちょっとまって! オレもそうなんじゃないかなぁという気はしているし、ハマリどころがありそうということはうすうす分かってるけど一応調べて考えてみてもいいじゃないか。 結局の所調べて「こうすればいいね!」ってことは分かったんですが、それも破綻する場合があるので、アンチパターンだなぁと思いつつこの記事を書くことにしました。 まずGoのchannelのナイーブさを再確認する そもそもGoのchan
データチャネルによって従来では成し得なかったP2Pのブラウザアプリケーションの実現が可能となります。WebRTCといえば、多くの人がブラウザ上での音声映像チャットを思い浮かべるでしょう。しかし、WebRTCではP2Pでのデータ通信を提供するデータチャネルも含んでいます。 この記事では、データチャネルの特徴とAPIやプロトコルについて解説し、最後にその活用方法に触れたいと思います。 なおこの記事は、WebRTCについてある程度理解が進んでいる方に向けて書かれています。WebRTC Advent Calendar 2014の1日目の記事であるWebRTCコトハジメ - Qiitaが、この記事の理解の役に立つかもしれません。 なぜデータチャネルか? データチャネルはWebRTC仕様のピアコネクションに含まれており、ブラウザ間でリアルタイムにデータをやりとりする能力を提供します。旧来より、ブラウザ
問題 Go言語をちゃんと学ぼうと思っていろいろ勉強してるのだけれど ダックタイピングって一体なんなのよ【golang】 - DRYな備忘録 Go言語に継承は無いんですか【golang】 - DRYな備忘録 Go言語のgoroutineって一体何よ【golang】 - DRYな備忘録 いよいよgoroutineの実践。 並行処理を書くうえで大きな課題のひとつはデータの共有らしいが、Go言語はこれをchannelというtypeで実装することを推奨している。 チャネル( Channel )は、チャネルオペレータの <- を用いて値の送受信ができる直通ルートの型です。 A Tour of Go ( ゚д゚)... は? しらべてみよう やっぱり Go の並行処理 - Block Rockin’ Codes が分かりやすい 並行処理プログラミングには、ざっくり分けて二つのアプローチがあります。 Sh
負荷のかかる処理を制限なしに並列化しても意味ない.処理の並列数を予測可能な場合は,当たりをつけて最適化するのもよいが,不明確な場合は,CPU数による制限が単純な1つの解になる. TL;DR CPU数に応じたバッファ長のChannelを使ってセマフォを実装する. 実例 mitchellh/gox goxはGo言語製のツールを並列コンパイルするツール.コンパイルの処理は重いため,デフォルトで並列処理数をCPU数で制限している. 簡単な例 例えば,以下のような単純な並列処理を考える.heavy()(重い処理)を並列で実行する. package main import ( "fmt" "sync" "time" ) func heavy(i int) { fmt.Println(i) time.Sleep(5 * time.Second) } func main() { var wg sync.W
libchan を読んだのでまとめてみる。 libchanとは libchanはdockerに使われているライブラリの1つで、先月の DockerCon で発表された。 非同期かつ一方向の通信チャネルをインプロセスでもネットワーク越しでも扱えるというGoライブラリである。 一方向とはいうものの、チャネル自体をデータに添えて他のチャネル越しに送れる。なので、返信や待ち合わせが必要ならば自分宛のチャネルを送って相手に使ってもらい、自分はそのチャネルの上で待機していれば良い。 早い話がGo言語の機能であるチャネルをネットワーク対応したようなものだ、と書いてある。 DockerはこのDockerConではDocker 1.0に加えてlibcontainer, libchan, libswarm, Docker Hubを発表していて一応キーノートの話題の1つではあったものの、 個人的にはlibswa
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く