はてなキーワード: ポーリングとは
「仕事を任せる」という言葉の意味は「君一人が担当者なので、君がいなくなると仕事が止まる組織を作り上げる」ことではない。「任せる」とはなんだろう。信じる、に近い。しかし、信じてはいけない。ポーリングは必要だ。進捗どうですか? は任せているから出てくる言葉だ。任せていないのなら、こうやれ、あれやれ、と指示を出すからだ。これまで何社、何人も上役に接したが、任せるのが上手な人は少なかった。任せすぎが任せないかのどちらかだった。
私も、任せたり、任せられたりする位置になった。任せるのは苦手で、任せられるのは負担に思う。責任感、がいまだによくわからない。他人に求められるのは、すこし、気が重くて、けっこう、負担だ。じぶんでやってしまうと、自分でできる量しか作業ができない。だからどうしようもなく任せなければならない。だから任せるための準備をする。ちゃんと任せられるように。任せてくれた人には、こまめに報告をする。任せてくれてありがとう、って気分で。こうだから任せて安心してね、って思って。できれば。
ライフハッカー読者とか、意識高い系の人はリーダーを目指してるんだろう。大勢を使って目的を達成したい人がより理想の自分を目指す行動が、ライフハックだったり、啓蒙だったり、啓発だったり、意識高いなのだろう。
私は、そういうのは、苦手だ。
ライフハッカーの記事とか、自己啓発本とか、には、「職場の雰囲気をよくする」方法を見かけない。効率化を追及するばかりで、居心地のいい雰囲気を作ろう、みたいな記事はでてこない。歓迎されないのだろうか。任せられた時に負担に感じない職場づくりだったり、任せられたいと思える関係を作るとか、言葉遣いのほうが、意識高い系よりよほど大切だ。
話がそれたけど、私は任せられたくないんだよ。
国内クラウド最大手のIIJ GIOが驚くほどクソっていう話を書きます。
クラウドならIIJ GIO(ジオ)- IIJの高品質クラウドサービス にあるように、クラウド上にいろんなサービスを乗せてくれるヤツです。
まぁAWSでいいじゃんって話が出ると思うので、AWSとの違いをまとめてくれた方がいましたので紹介します。IIJ GIO にあって AWS にない(なさそうに見える)10のサービス - yoshidashingoの日記 なお、このエントリー以降にAWSも進化していて、中国リージョンの開設やVDIサービスの提供がアナウンスされています。
一つには国内ベンダーっていう安心感ですかね。どこに登記されてるとも知れないAWSに任せると、いきなり「今度このへんのラックメンテするからEC2のインスタンス落ちるよ」みたいのがあったりしますしね。
あとは、運用監視サービスをやってます。AWSだとCloudWatchみたいな簡易なやつしかないですが、GIOだとアプリのログとかポート監視もやってくれます。まぁAWSでもサードパーティで運用をやってくれる会社はありますが。
残念ながら、上記の「選ぶ理由」はどれも裏切られます。
不定期メンテは普通にありますし、ろくに通知もないです(電話1本とか)。内容も、ネットが切れるとかサーバを落としてくれとか割りとデカめです。国内ベンダーだからちゃんとしてるだろうというファジーな期待は裏切られます。
運用監視サービス、これがまたゴミです。監視のカスタマイズなんかお願いしようものなら「これが仕様なんで…」と突っぱねられます。ポーリング間隔ですらカスタマイズできません。あと運用。「このアラートは即電話ね」と決めていても、24/365対応している現場の人間は適当なバイトなので、ろくに伝わっていなくて見逃される、みたいのもザラです。
思わずスクショに撮っちゃったんだけど、『はてな匿名ダイアリー』のエントリの題名で
携帯から検索をかけたら、「48 secs ago」という表示が題名の後に表示された。
yahooのリアルタイム検索で、自分のTwitterの投稿内容がどれくらいで反映されるのか
セルフ検索にかけてみたことはあるけど、一分以上はかかっていたと思う。
yahooのリアルタイム検索で、専用サーバーだか線だか引っ張ってきて特殊なAPIを叩いてるだろうことを考えると、
上記の一般検索で「48 secs ago」というのはなんか、もう、異次元入ってる。OpenGrokよりわかんない。
クローラーでやっている技術的内容が全く想像できない。論文とか検索したら出てくるのかしら。
たまたま、タイミングがあったにせよIFに普通「secs」を用意する?
「Twitter等リアルタイム性を求めるソーシャルサービスが出てきても
Googleなどの従来型インデクサーが即時検索を可能にするとは思えない。
従って技術的イノベーションが起きるとすれば、これからはレコメンドエンジンだっ!」と
言い放っていたのがちょうど四年前あたりだったと思う。。。四年であの教授は形にできたのかしら。
Googleは多分地味だけど確実に本業も進化してるんだと思う。あんまり話は聞かないけど。
はてな匿名ダイアリーのエントリタイトルが、特に変わった言葉がなくても
Googleの上位に来やすいのは、「はてな匿名ダイアリー」を一つのブログとしてみたときのPV数の多さ、
ぐらいしかSEO対策をしたことがない素人には想像つかない。それを思えば、PVが多いところに
ある程度ウェイトを置いてポーリング監視っぽいことをしてるのかなとも思えたが、
星の数ほどあるウェブサービスをして、それはないと個人的には思う。
ようやくRailsの開発を一人で出来るようになった彼女が、俺に突然質問を投げかけた。
「ねぇ、WebサービスのPushってどうやって実装するの?」
「クールな順にWebSocket、次にコメット、最後にポーリングだよ」
彼女は目を輝かせながら「それでそれで?!」と説明を求めてくる。
「ポーリングは、一定の時間ごと、たとえば3秒ごとにAjaxでサーバにリクエストを送って新着の情報が無いか問い合わせて、もし新着があれば処理を、なければスルーして次の問い合わせに備えるPush通知の実装だ。手軽に実装できる反面、新着がない多くの時間常にリクエストを送り続けることになるので無駄が多い。大規模なサービスで実装すれば、それだけでDDoSっぽくなっちゃう。また、リアルタイムも厳密には実現できなくて、MAXでポーリング間隔分のラグが発生してしまう。小規模なサービスで、とりあえず実装するにはオススメかな。」
なるほどなるほど、と彼女は頷く。
「コメットは?」
「コメットはポーリングを改良したもので、ブラウザからリクエストが送られてきた時点ではサーバはすぐにレスポンスを返さずに、処理中ってことでコネクションを張ったまま一定時間待つんだ。それで、なにか新着があったタイミングで、昔送られてきてたリクエストのレスポンスを返す。そうすると、新着があったタイミング=レスポンスを返すタイミングになるので、レスポンスはほぼリアルタイムになる」
「なるほど!すごい!!!」
「頭の良い実装だよね。Facebookの通知なんかはコメットだよ。ただ、コメットも万能じゃない。まず、レスポンスはいつまでも待てるものではなく、待たせすぎちゃうとタイムアウトになっちゃうんだ。だから一定時間ごとには何もなくても"進捗はなかったよ”というレスポンスを返してあげなきゃいけない。また、サーバはコネクションを常に割り当てないといけないので、IOをブロックするようなサーバだとリソースを食い過ぎて耐えれ無くなっちゃうから大規模な運用には金がかかっちゃうんだ。所詮はHTTPを使ったごまかしでしか無い。オーバーヘッドが大きいんだよ。」
「な、なるほどー」
少し話が小難しくなったためか、一生懸命理解しようと彼女が頑張っている。かわいい。
「そこでWebSocketの登場だ。WebSocketは厳密には違うんだけど、HTML5関連の新しい技術で、ネトゲで使うTCP/IPのセッションのようなコネクションをサーバ側と張ることができる技術なんだ。しかもNATとかも超えてくれる便利な技術。これがあればリアルタイムWebの実装はすごく簡単になるんだけど、まだ新しい技術というのもあるし、対応してるサーバやライブラリの不足や、プログラミングのスタイルがイベント駆動になるという変化もあって、まだまだ一般的にはなってない。対応してるブラウザも最近まで多くはなかったしね。やっとiPhoneでも使えるようになったし、スマフォのWebでも普通に使えるようになってきた。これからが楽しみだね。」
「うーんと、うーんと、つまり」
彼女は今日得た知識のまとめに入ったようだ。一生懸命Webの技術を学ぼうとしている健気な彼女に、僕は心がキュンとなった。
「そう、つまり…」
びっくりして目を見開いている彼女。
「チュッ、チュッ、チュッ、チュッ、チュッ、」
「これがポーリング。」
「チュポッ…」
彼女の頬は少しだけ赤く染まっていた。
「これがWebSocket、そして…」
最後に僕は彼女の顔を両手でホールドし、8秒くらいの長い、とても長いキスをした。
「よし、じゃあコーディングに戻ろう。」
「私、コメットがいいな。。。////」
報告するよう促す。
連絡するよう促す。
自分の席で連絡待ってるってどんだけ?
昔は俺も相手を信じて報告するだろうと思ってたけど、かなりでかい会社のリーダーたちでも、悪い連絡なんて遅い時がある。
報告なんて信じないというポリシーを貫くことにしている。
自分で定期的にポーリングして、様子見て、どう?って聞くようにして、内容見て確認するようにしてる。
でないと、介入が遅れて、大変なことになる。
いいか悪いかは別として、上に立つなら、もう、そうするしかない。
そう思うと、連絡が定期的にやってきて、その内容が正しいひとって、どんだけありがたいかと思う。
Tomcat上のJRubyから呼んだJavaプログラムから呼び出し元のJRubyの環境(Runtime)を使いたいときにどうすればいいのか?
方法が1つわかったのでメモ。
(追記2:こんなめんどいことしなくてもJRuby.runtimeで取れたみたい)
イメージ的には以下の感じ
↑↓
↑
JRubyは1.4.0、jruby-rack.jarは0.9.7、warblerは1.0.1
まずは必要なクラスをimport
import org.jruby.Ruby; import org.jruby.rack.PoolingRackApplicationFactory; import org.jruby.rack.RackApplication; import org.jruby.rack.RackServletContextListener;
ServletContextをどっかから取ってくる(Listener作ってfieldに埋めるとかして)(追記:$servlet_contextで取れる[JRuby-Rack使うから])
ServletContext context;//=~~~
warblerでwar化するとweb.xmlにRailsServletContextListener(extends RackServletContextListener)が登録される。
そのListener起動時にFactoryがServletContextに登録されるので、それを取得する
PoolingRackApplicationFactory factory = (PoolingRackApplicationFactory)context.getAttribute(RackServletContextListener.FACTORY_KEY);
PoolingRackApplicationFactoryのapplicationPoolを取ってくる
(protected fieldなのでリフレクションを使用)
Field poolField = factory.getClass().getDeclaredField("applicationPool"); poolField.setAccessible(true); Queue<RackApplication> pool = (Queue<RackApplication>)poolField.get(factory);
RackApplication ap = pool.peek(); Ruby ruby = ap.getRuntime();
呼び出しもとのJRuby環境を使ってRubyコードを実行できる
ruby.evalScriptlet("p 'test'");