サーバー状態リアルタイム表示について

このQ&Aのポイント
  • サーバー状態リアルタイム表示について考えています。最新の情報を即座に表示する方法を探しています。
  • 現在のwebシステムでは、再表示ボタンを押すことで最新の状態を表示させていますが、ボタンクリック無しで自動的に表示する方法を希望されています。
  • ajaxを使って最新情報を取得する方法や、別プロセスを監視して最新結果を表示する方法を検討しています。自分で実現できる範囲で工数をかけずに解決したいです。
回答を見る
  • ベストアンサー

サーバー状態リアルタイム表示について

お世話になります。 (今夏休み中ですが休み前に大きな宿題を出されてしまい、家で構想だけ練っています) 某システムで、cgiアプリをc++で作成しています。 現webシステムは最新の状態を表示させるには「再表示」ボタンなどを押すことで実現しています。 が、今回は追加機能で、ある状態の最新情報をボタンクリック無しで表示してほしいというのです。 本当は状態が変わったときにpopup表示を希望されたのですが、それは無理ということにしてもらいました! ajaxとかnodeとか、理解できれば簡単なことなのかもしれませんが 期間的にもちょっと無理そうだし、 部分的な表示じゃなくて全画面の再表示をしたとしても 同じ画面では、何か他の既存の処理に影響を与えないか不安だし、、、 なるべく工数かけず、自分で今、出来る範囲で実現したいと思っています。 で、今 以下のようなアルゴリズムを考えました。 1.cgiで、画面(main)を出力する最後に、   結果を監視するプロセス(別cgiアプリ、以降b.exe)を起動(createprocess)しておき、   結果状態表示用にwindows.openで小さな別窓を表示させ、 ←popupもどき!   結果のhtml(以下c.html)を表示する。   ※c.htmlは最初は静的に用意しておき「監視開始」みたいな表示?! 2.b.exeは最新の結果状態を表示するhtmlをc.htmlというファイル名で所定のフォルダーに   (例えば)5秒単位に作成する。 3.c.htmlは reloadまたはメタタグでrefresh設定しておく。 4.mainの画面を閉じるときはb.exeをkillし、c..htmlを削除する。   → 異常系、どうしよう???     もしb.exeが生き残ってたらどうなる?       個別にcreateprocessしないで、システム的に常駐させ、       c.html作り続けたほうが良い?!     もしc.htmlが消せなかったら、、c.htmlを作成するときに一旦削除してからにすればOK?! こんな感じで実現出来るかな、、、と思ってるのですが、 どう思われますか? 調べていくうちに、ajaxを使って、   http://okwave.jp/qa/q6265223.html   のベストアンサー のようなことなら、今の自分にも出来るかな、、、 などと思っています。 周りに相談できる人が皆無なので、いつも御世話になってしまい、すみません。 アドバイス、お願いいたします。 または 他の方法など、もしアドバイスしていただけると助かります。 宜しくお願いします。

  • jg1wjz
  • お礼率91% (148/162)
  • CGI
  • 回答数3
  • ありがとう数17

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.3

> popupもどきというのは、お客さんはポップアップを望んでいるのですが、 > 既存システムのweb画面上に追加してpopupするのは難しい、、、ということ。 うーん。よく分からんけど最近のWebメールやOffice Web Appsなどのように、ブラウザ上で画面ががんがん分割されたりブラウザウィンドウの画面の中でダイアログのようなUIが出てくる奴のことを言っているのかな? あれならjQuery+jQuery UI プラグインで速攻できるよ。まぁ、ブラウザウィンドウの画面の上に動的に移動できるDIVのようなものを追加しているだけなのでリンクとかFORMポストとかで画面遷移があると消えてしまうけど。 だから現在のWebシステムに追加するのが難しいと言っているのかな? それなら確かに難しそうだ。 > ここが良くわからないです。 > レスポンスボディというのは、cgiのexeがprintfで出力したhtmlのコードとは違うのでしょうか? いや、それでいい。cgiのexeがprintfで出力したhtmlのコードがそのままレスポンスボディになる。 「レスポンスボディ」という言葉が指す意味が分からなければHTTPというプロトコルそのものを一度調べてみるといい。cgiをやるならHTTPがどういうものかというのはぜひ知っておくべきだ。 > urlで指定したCGIのEXEは状態を判断してその結果をhtml出力(printf)しようと思ってまして、 > それではダメですか? ばっちぐー。 > それでOKの場合、 >> htmlなので、AJAXでリクエストしたレスポンスを >> そのままHTMLとして扱う。 > ここはcgiの戻りがhtmlそのものなのでOK? いえーす。 > もし違うとしたら、exeで何を返せばいいのか? > printfで出力して(返して)いいのか? jQueryのajax関数でつっつくexeは普通にHTMLを返す普通のCGIでOKよ。 ~~~~ さて、ANo.1でも言ったけど、javascript:window:open()で小ウィンドウを開くなら、そしてその小ウィンドウの中を定期的に全部リフレッシュするならAJAXは後回し(というか最終的に要らないかも)にして何秒かおきにリフレッシュさせるだけでいい。AJAXがー同期がー非同期がーごにょごにょーとか一切関係なしにjavascriptのsetTimeout()というのを使ってもいいし<meta http-equiv="refresh" content="60;URL=serverinfo.exe">でもいい。

jg1wjz
質問者

お礼

anmochi さん、かなりすっきりしました~ JavaScriptのsetTiemout()ならすぐに使えそうです!^^; METAタグのrefreshも簡単で何よりです。(^^)v ajaxは後回しにして、といいますか、使わなくて良さげなので少し、肩の荷が下りました。 レスポンスボディ、httpプロトコルについて 勉強したいと思います! エンドユーザはブラウザを使ってるという意識があまり無いように思います。 オフライン系のアプリと同じような操作を求めてきます。 ポップアップもalertのような軽い感じで! って言われました。alertという言葉は私の憶測です。 (背景がグレーの小さな画面でいいよ、、、って) リアルタイムで今の画面に?、今回はそれが難しいのに。。。そして周りは誰も難しいということをわかってくれない人たちばかり。。。^^; で、ちょっと思ったのですが window.openで表示する画面のonloadか何かで 結果をalertで表示しようと! window本体の画面にも同じような内容を表示しておけばいいかな、とか。 で、調べたところ、 windowの最低サイズが幅:250、高さ:100らしく、 思ったより大きいということ、 なら、最初から「最小化」で表示、、、と思ったらそれはできないことがわかりました。 まっ、OKかなと。 ホントに有難うございました! コメントがあるかも知れないと思い(^^) 後ほどベストアンサーにさせていただきます。

その他の回答 (2)

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.2

> 上記のサンプルコードですが、popupもどきで表示するhtml内に書くコードですよね? 「popupもどき」という言葉が何を指すかは分からない(ポップアップするのかしないのか)が 上記のサンプルはjavascript:window.open()や<a href="" target="_blank">では「ない」 本体のブラウザウィンドウで動作する事を想定している。 > で、refreshServerInfo() が定期的に実行される関数? その通り。 そのへんの詳しい事情は「javascript setInterval」で検索すれば分かるだろう。 > その中のcgiが、自分に当てはめるとcgiのexe名。 > メソッドがGETで、cgiのexeが結果を記載したhtml(表示しているhtmlと同じ)を出力する? 結果を記載したHTMLというのがcgiが返すレスポンスボディという意味であればその通り。 jQueryのajaxという関数で引数dataType:htmlという指定をすると、urlで指定されたパスにAJAXでリクエストしたレスポンスをそのままHTMLとして扱う。 > ajaxを使うので、実際は全部再表示ではなくて、結果の部分だけ書き換わる? うむ。 実際には、AJAXというのは本体とは別にHTTP通信を行う仕組みであり 画面の一部分を動的に変更する事自体はまた別の機能だ。 つまり、「AJAXで画面の一部を書き換える」というのは、 「JavaScriptでブラウザ本体とは別の独立したHTTP通信を行い、レスポンスを得る」 「JavaScriptでブラウザ本体のコンテンツの一部を任意のタイミングで書き換える」 の2つを連続して行う事で実現している。 > こんなイメージでいいでしょうか? はい。 > ajaxは初めて使いますがjquery本体を最初に読み込んでおけばいいのですね? ANo1で示したサンプルコードはjQueryの機能を使っているからで、 jQueryを読み込まないとAJAXできないという訳ではないという事は理解しておこう。 jQueryというのはブラウザ間のJavaScriptの挙動の違いを吸収したり より便利にJavaScriptの機能をラップしたりするJavaScriptライブラリーであり、 あると便利なものだがjQueryじゃないと実現できないことというのは一つも無い。

jg1wjz
質問者

お礼

anmochi さん、ありがとうございます。 popupもどきというのは、お客さんはポップアップを望んでいるのですが、既存システムのweb画面上に追加してpopupするのは難しい、、、ということ。 なので、今のweb画面の左上などに小さく別窓をオープンして、監視画面とすること。 で、小さな別窓を「もどき」と表現しました。 その、もどき画面を見て、その内容により、エンドユーザがメイン画面の操作を行います。 なので別ブラウザではダメなので、window.openで行おうと思います。 ajax、ちょっと勉強時間が必要かなと。 >結果を記載したHTMLというのがcgiが返す >レスポンスボディという意味であればその通り。 >jQueryのajaxという関数で引数dataType:htmlという >指定をすると、urlで指定されたパスにAJAXで >リクエストしたレ>スポンスをそのままHTMLとして扱う。 ここが良くわからないです。 レスポンスボディというのは、cgiのexeがprintfで出力したhtmlのコードとは違うのでしょうか? urlで指定したCGIのEXEは状態を判断してその結果をhtml出力(printf)しようと思ってまして、それではダメですか? それでOKの場合、 >htmlなので、AJAXでリクエストしたレスポンスを >そのままHTMLとして扱う。 ここはcgiの戻りがhtmlそのものなのでOK? もし違うとしたら、exeで何を返せばいいのか? printfで出力して(返して)いいのか? まだまだ先が長そうですが よろしくお願いします。

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

小窓出しっぱでその中をrefreshしていいんだったら毎回サーバーの状態を出すcgiをrefreshすればいいんでない? 定期的にHTML吐く方が読み書きが同時に起こったら云々等あれこれ考える必要があるような気がするぞなもし。 つーかそれが許されるんなら普通にブラウザ本体でその部分だけ定期的にajaxすればいいんでない? jQueryの本体を読み込んだ後で以下のようにすれば、ページを読み込んだ直後にserverinfo.cgiの結果をserverinfoというIDを持つdivの中に埋め込んでくれて、後は1分ごとにserverinfoの中をリフレッシュしてくれる。serverinfo.cgiの中でimgタグを入れたいときは<img src="hoge.jpg?timestamp=yyyymmddhhmmss">みたいにHTMLが指し換わるたびにURLを変えるようにすればOK。 <script type="text/javascript"> function refreshServerInfo() { $.ajax({ type: 'GET', url: '/serverinfo.cgi', dataType: 'html', success: function(data) { $("#serverinfo").html(data); }, error:function() { $("#serverinfo").html("error!"); } }); } $(function() { refreshServerInfo(); setInterval("refreshServerInfo()", 60000); }); </script> <div id="serverinfo"> </div>

jg1wjz
質問者

お礼

anmochi さん、ありがとうございます。 要領も呑み込みも悪いので、追加で質問させてください。 ajaxを使ってみようと思います! 上記のサンプルコードですが、popupもどきで表示するhtml内に書くコードですよね? で、refreshServerInfo() が定期的に実行される関数? その中のcgiが、自分に当てはめるとcgiのexe名。 メソッドがGETで、 cgiのexeが結果を記載したhtml(表示しているhtmlと同じ)を出力する? ajaxを使うので、実際は全部再表示ではなくて、 結果の部分だけ書き換わる? こんなイメージでいいでしょうか? ajaxは初めて使いますがjquery本体を最初に読み込んでおけばいいのですね? 以上、よろしくお願いします。

関連するQ&A

  • createprocessで起動させる別.exeをモーダルで起動したい

    createprocessで起動させる別.exeをモーダルで起動したい お世話になります。 VC++6.0 MFCで開発しております。 現在A.exeのあるボタンを押すとcreateprocessでB.exeを起動させるようにしております。 B.exeを起動後、A.exeの画面表示をクリックするとA.exeがアクティブになるのです。 それを、B.exeが終了しないとA.exeがアクティブにならないように変更したいのですがどのようにすればよいでしょうか? 現状は PROCESS_INFORMATION pi; STARTUPINFO si; si.cb=sizeof(si); CreateProcess(実行EXEパス,コマンドライン,NULL,NULL,TRUE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi); で起動しております。 また、実現不可能というお答えでもいいので教えていただければと思います。 お手数ですが何卒よろしくお願いします。

  • CGIでCreateProcess

    vc++でCGIアプリケーションを作成しています。 今回、画面よりボタンクリックされたら、 CreateProcessで某exeを起動することになりました。 が、そのexeは処理時間がかかるため、終了を待たないで 画面出力をしたいのです。 単純に CreateProcessがうまくいったら、GetExitCodeProcesで「終わったか」を チェックしないで画面を出力しています。 が、画面出力が全部終わりません。 画面(html)はトップから出力し、iframeがあります。 表示の最後(</html>の前)にiframe内に一覧リストを表示させるよう、 JavaScriptでリクエストを行っています。 ログを見るとトップの出力までは書かれています。 その後、CreateProcessで起動したexeが終了すると、 一覧リストは表示されます。 ログも追加されています。 ##例えばexeが5分かかるとすると5分後にログが最後まで書かれています) ##画面も5分後に一覧リストが表示されます。 何故、一覧リストの処理が待たされているのかわかりません。 ソースはこんな感じです。   ↓ iRet = CreateProcess(0, Pbuff(ここにexe名), 0, 0, TRUE, 0, 0, 0, &startUpInfo, &PInfo ); if ( iRet != TRUE ){ CgiError("xxx", "起動できませんでした", "" ) ; return(-1); }  //この後画面表示処理 何か設定とか、間違ってますでしょうか? または何か他にしなければならないことがあるでしょうか? アドバイスをお願いいたします! 因みに、CreateProcessで起動するexeは最大2時間程度の処理時間になります。 よろしくお願いします。

  • 画面遷移制御について

    画面A内のボタンを押すと、画面Bが開きます。 画面B内のボタンを押すと、画面Cが開きます。 画面Bから呼ばれる、画面Cについて 常に1画面しか表示されないようにしたいです。 画面Cの表示内容は、最後に画面Cを表示した状態が、 最新の情報ということで問題ありません。 Javascriptで、実現する方法を教えていただけないでしょうか。

  • サーバー処理のあるwebページがあったとしてサーバー処理のあとクライア

    サーバー処理のあるwebページがあったとしてサーバー処理のあとクライアントにブラウザ画面が表示されたとします。 ※たとえば、検索画面ー>検索結果一覧みたいなながれで このとき検索結果一覧画面で更新(F5)をすると、サーバー処理をもう一度やった後ブラウザ画面が表示されますよね? Ajaxのような通信をおこなって結果をブラウザに表示している場合、更新してしまうとAjaxを行う前のブラウザ画面になってしまうと 思うのですが、Ajaxを無数に行った後の画面を更新してもAjaxを行った結果が表示されるようにするには、どのようにするのでしょうか? 無数なのでクッキーやIEのUserDataなどは使えません。また、ライブラリやフレームワークでそういう機能が用意されているのが あればぜひ教えてください。

    • ベストアンサー
    • AJAX
  • CreateProcess関数と実行後の戻り値について

    VB6からCで作られたEXEを実行した戻り値を取得したいのですが どのように記述すればよいのでしょうか? 制御が戻るまで固まらずに待ち続けるには CreateProcessを使うと良いとは思いますが、 notepadなど一方的に動作させて終了するようなサンプルしかなく、 戻り値を取得するサンプルは見当たりませんでした。 戻り値といってもCのEXEは結果を標準出力で表示されるものですが・・・ 何か良いサンプルはあるでしょうか? CreateProcessを使わない方法でも構いません。 r = CreateProcess( _ cmd, _ param, _ ByVal 0&, _ ByVal 0&, _ 0, _ NORMAL_PRIORITY_CLASS, _ ByVal 0&, _ vbNullString, _ si, _ pi _ )

  • CreateProcess

    さっそくですが… <MS-DOS上で動作するEXE> test.exeを実行する    ↓ データ(文字列)を入力し,Enterを押すと 実行結果が表示されます。 ------------------------------------------- このようなtest.exeがある時, 1)test.txtにデータ(文字列)を入れておきます。 2)実行後,結果を入れるr.txtを作っておきます。 そこで,DOS上で↓このように動かしました。 C:\ ~ \ ~ >test.exe <test.txt >r.txt 以上のことを(環境:BorlandC++Builder6,Windows2000) API関数のCreateProcessを使って動かすことは 可能なのでしょうか??というのは, 現在,CreateProcessでtest.exeを 呼び出すことはできたのですが, どうしても" <test.txt >r.txt "という部分を 入れると引数が渡らないのです。 CreateProcessのpszApplicationNameやpszCommandLine 引数あたりでいろいろ試したのですが,できません。 もしCreateProcessで可能ならば どのようにすればよいのでしょうか?? あまり知識がなく,説明不足かもしれませんが どなたか分かる方がいらっしゃいましたら, 教えて下さい。よろしくお願いします。

  • TwitterのTOP画面にあるような、「リアルタイム情報の表示」の実

    TwitterのTOP画面にあるような、「リアルタイム情報の表示」の実現方法に関して。 Twitter http://twitter.com/ こんにちは。よろしくお願いします。 上記の通り、TwitterのTOP画面にある、各カテゴリ~の「リアルタイム結果」の表示に関してお勉強中です。 ソースを読み込んでザクッと調べてみたり、検索かけてソレらしいものを探してはみたのですが、タイムリミット的にはそろそろちゃんとしたサンプルを元に試しておきたいと思っています。 (出来れば明日試したいと思っているため。 ・ソースを読んで考えてみた結果 とりあえず、jQueryあたりを使い、<ol id="timeline" class="statuses"></ol>に結果を返しているようには思うが、 どこからどういう処理が流れてそうなるのかが追いきれていない。 ・ソレらしいものを探してみた結果 Twitterのプラグイン。 http://juitter.com/ こんな感じで、「Twitterのプラグイン」は見つかりますが、あくまでTwitter用。。。 コレを自分の持ってるWebページに組み込めば、Twitterのつぶやきが同じように表示できるのでしょうが、 Twitterからの情報を表示してもしかたありません。(欲しいのは、Twitterの情報ではなく、このシステムの動きだけ。。。 ダウンロードできるプラグインファイルを改良して、流用するのは現実的なのでしょうか。。? (「新着データを持ってくる場所の指定やら方法」あたりを上手く変えればなんとか。。。? 予定としては、 開発したシステムのトップページ領域に、そのシステムに書き込まれた新着情報を、データベースアクセスでも、Webページアクセスした結果の文章を引っこ抜いてくるでも 何でもいいので、TwitterのTOPページにあるような、「リアルタイム情報の表示」を実現したいと思っています。 随分と、とんちんかんな状態の質問ですが、ざっくりと解説できる方、サンプルをご存知の方など、ご教示いただけると助かります。 よろしくお願いしますm(_ _)m

  • ASP.NETとcgiについて

    ASP.NET上でwebシステムが構築されています。 ブラウザ(既存webシステム:以降Aシステム とします)で、ボタンをクリックすると、 ログイン画面が表示され、別のwebシステム(以降:Bシステム)が動きます。 ※因みに、login.aspxが動いていたので.NETですよね? ---ここまでは既存システム--- このAシステムからBシステムの間のやり取りを .NETではなく、vc++などでcgiを作って動きますか?(拡張子はexeになります) .NETは経験が無いので、実現可能か教えていただきたいのです。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • Google AJAX Feed API 複数ブログを最新更新順に表示

    Google AJAX Feed APIでわからない事があります。 どなたかおわかりの方は教えて頂けないでしょうか。 普通にGoogle AJAX Feed APIを使って最新情報を表示される方法と複数ブログを表示させる方法もできるのですが複数のブログの最新情報1件更新順に表示させる方法のスクリプトを教えていただけないでしょうか? ↓この様に各ブログの最新投稿1件を最新順に表示させたいです。 -------------------------------------- ブログAタイトル / ブログA最新投稿タイトル (2009.04.07) ブログCタイトル / ブログC最新投稿タイトル (2009.04.06) ブログBタイトル / ブログB最新投稿タイトル (2009.04.05) --------------------------------------- どうぞよろしくお願いします。

  • VBS実行時にコマンドプロンプトが表示される

    VBSを実行したときにコマンドプロンプトが表示されてしまいます。 非表示にすることはできませんか? 単純にIF文で結果をpopupで表示させるだけなのですが。 (結果のpopupは表示されますがコマンドプロンプトも後ろで表示されている状態になってしまいます)

専門家に質問してみよう