タグ別アーカイブ: infoscoop

GoogleのAPIを利用したアプリケーションをGoogle Apps Marketplace (Chrome Web Store)で公開する方法 その2

| 1件のフィードバック

前回に引き続き、Google Apps Marketplaceへのアプリケーションの公開手順を紹介します。

手順

  1. 利用するAPIの登録
  2. アプリケーションの開発
  3. Chrome Web Storeへの登録
  4. インストールのテスト
  5. アプリケーションの公開とレビュー申請

今回は3から5の手順です。

注意事項

アプリケーションをGoogle Apps Marketplaceで公開することが目的ですが、アプリケーションの登録はChrome Web Storeのディベロッパーダッシュボードから行います。
また、アプリケーションの公開に伴い、初回の公開時のみ5ドルの支払いが必要となります。

続きを読む

GoogleのAPIを利用したアプリケーションをGoogle Apps Marketplace (Chrome Web Store)で公開する方法 その1

| コメントをどうぞ

Googleが公開しているアプリケーションのプラットフォームとして、
・Google Apps Marketplace(Google Apps for Work利用者向け)
・Chrome Web Store(Googleの個人アカウント向け)
があります。

現在私たちはGoogle Apps向けのポータルサービスとして、infoScoop for Google AppsをGoogle Apps Marketplaceで公開しています。
http://www.infoscoop4g.com/ja/

今回と次回の2回に分けて、GoogleのAPIを利用したアプリケーションを公開する方法を紹介します。
Google Apps Marketplaceに公開する場合もChrome Web Storeに公開する場合も、基本的な流れは同じです。
参考: https://developers.google.com/apps-marketplace/

手順

公開までの手順は大きく5つに分かれています。

  1. 利用するAPIの登録
  2. アプリケーションの開発
  3. Chrome Web Storeへの登録
  4. インストールのテスト
  5. アプリケーションの公開とレビュー申請

今回は1と2の手順です。

続きを読む

[Chef] infoScoopのレシピを作ってみる②

| コメントをどうぞ

infoScoopのレシピを作ってみる①

前回で必要なリソースの調べがついたので、実際にinfoScoopのレシピ(CookBook)を作ってみました。 以下はCookBookの構成です。

/infoscoop
|
├─attributes
│     default.rb
|
├─definitions
├─files
│ └─default
│     infoscoop-opensource-3.4.0.tar.gz
│
├─libraries
├─providers
├─recipes
│     default.rb
│     mysql.rb
│     tomcat7.rb
│
├─resources
└─templates
 └─default
      infoscoop.xml.erb
      my.cnf.erb

動作確認環境は CentOS 6.5。 infoScoop OpenSourceサイトからダウンロードしたtar.gzファイルを使ってリポジトリDBの初期化、Tomcatへのデプロイまで行います。 急拵えなので、冪等性や設定値(Attribute)などは適当です。このへんは後々対応していきたいと思います。

続きを読む

[Chef] infoScoopのレシピを作ってみる①

| コメントをどうぞ

前回の記事で開発環境とサンプルレシピの作成・動作確認まで行ったので、そろそろ本格的なChefレシピの作成を考えてみます。

前回作成したサンプルでは、指定パスにディレクトリを作成する程度の処理しか行っていませんでした。

今回は infoScoop のレシピ化を前提に、もう少し踏み込んだところまで調査してみます。 続きを読む

infoScoopをeXcaleにインストールしてみる

| コメントをどうぞ

新年あけましておめでとうございます。
性懲りもなく帰ってきました。
本日は表題の通り軽めの内容でお送りしたいと思います。
 
 

eXcaleとは

eXcaleとは、TIS株式会社によってアプリケーション開発者向けPaaSとして提供予定のクラウドサービスです。
現在のところRuby、Java、PHP、Node.jsのアプリケーションを動作可能なプラットフォームとなっています。
2013年4月に正式公開ですので、現在のところベータ運用されています。
ベータ期間中はサインアップすれば無料で使えますので、折角ですのでinfoScoopをインストールしてみたいと思います。
 
 

準備するもの

  • infoScoop OSS クイックスタート

 

セットアップ

1.eXcaleにアプリケーションを作成

まずは、eXcaleに入れ物となるアプリケーションを作成します。

ここで作成したアプリケーション名は、後々JNDI名(とアクセスURL)になりますので、慎重につけましょう。
 

2.infoscoop-3.1.0-quickstartの取得

まずは、「infoscoop-3.1.0-quickstart」をダウンロードしてきます。
ダウンロードしたファイルを展開し、以下のファイルを取得しておきます。

  • init_infoscoop.ja.sql
  • apache-tomcat-6.0.28/webapps/infoscoop.war

sqlファイルは初期データを投入するのに使います。
クイックスタートを使うのは、このファイルがあるためです。
 

3.datasource.xmlを修正

現状ではJNDI名がeXcaleで作成されたアプリケーション名と同じになってしまうので、変更します。
通常版のremakewarを利用すればJNDI名を変更できますが、動かなかったので一部修正を含めて、泥臭い方法で修正します。

取得したwarファイルの拡張子をzipに変更し、適当な場所に展開します。(一般的なファイル展開ツールで展開することができます)
展開したファイルに含まれているdatasource.xmlを修正します。

/WEB-INF/classes/datasource.xml

〜修正前〜
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName">
        <value>java:comp/env/jdbc/infoscoop</value>
    </property>
</bean>

〜修正後〜
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
      <property name="jndiName" value="jdbc/<eXcaleに作成するアプリケーション名>" />
      <property name="resourceRef" value="true" />
</bean>

4.web.xmlの修正

次に、web.xmlも修正します。

/WEB-INF/web.xml

〜修正前〜
<resource-ref>
    <res-ref-name><!--start dataSource.jndiName-->
        jdbc/infoscoop
    <!--end dataSource.jndiName--></res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

〜修正後〜
<resource-ref>
    <res-ref-name><!--start dataSource.jndiName-->
        jdbc/<eXcaleに作成するアプリケーション名>
    <!--end dataSource.jndiName--></res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

5.infoscoop.warの作成

変更が終わりましたら、展開したフォルダを丸ごとzip圧縮します。
その後、拡張子をwarに変更して、warファイルの慣性です。
 

6.作成したアプリケーションに初期データを投入

 さて、早速デプロイといきたいところですが、アップロードすると自動的にデプロイまで行ってしまいますので、先に初期データを投入します。


 

7.warファイルのデプロイ

最後に、warファイルをアップロードして完了です。

5〜10分ほどでアクセスできるようになるかと思います。
 
 

参考URL

TIS株式会社
eXcale
infoScoop OpenSource

ZabbixガジェットによるinfoScoop上でのサーバー監視

| コメントをどうぞ

今回はinfoScoop上でのサーバー監視の例を紹介します。
監視に利用するのは、オープンソースの統合監視ソフトのZabbixです。

Zabbixについては下記をご覧ください。
http://www.zabbix.jp/

ZabbixではAPIが提供されており、必要な情報を取得して利用することができます。
http://www.zabbix.com/documentation/1.8/api

このAPIを利用して以下の2つのガジェットを作成しました。

  • グラフガジェット: 指定したアイテム(CPUやメモリなど)の過去数時間の状況をグラフで表示します。
  • 障害情報ガジェット: 最新の障害情報を表示します。

infoScoop for Google Apps上にガジェット配置するとこんな感じになります。

上段は左から、

  • WebサーバーへのHTTPリクエスト数
  • WebサーバーのCPU使用率
  • Webサーバーのメモリ使用率

下段は、

  • 障害情報(左上)
  • Googleドキュメント(ドライブ)の「障害対応」フォルダ内のドキュメント一覧(左下)
  • DBサーバーのCPU使用率
  • APサーバーのCPU使用率

図のグラフはすべて17:30時点のもので、5:30から17:30の12時間の観測データを表示しています。
朝の始業時間にかけてリクエスト数が増え、それに伴って各サーバーの負荷が増加している様子が見れます。

ZabbixのWebのダッシュボードでもグラフを並べたスクリーンを作成することができますが、infoScoopではGoogleドキュメント(ドライブ)などの様々なガジェットを一緒に並べることで、障害発生時に障害対応に必要な情報をすぐに取得することが可能です。
また、ガジェットの位置は自由に移動できるため、ユーザごとに自分が必要とする情報だけ表示することができます。

上の図ではZabbix用のタブを紹介しましたが、メールやカレンダー、ドキュメントなどの普段の業務で利用するガジェットと一緒に必要なガジェット並べて、サーバーの状況を常にチェックできるようにしてもいいかもしれません。

infoScoopガジェットとOpenAjax Hub

| 1件のフィードバック

講師 「『公』~これはなんと読むでしょうか?」

学生 「ハム」

講師 「違います」
 

infoScoop OSSがバージョン3.1になり、いくつかのOpenSocial仕様を実装いたしました。
その中でも今回はガジェット間連携を司るOpenAjax Hubに関して触れてみたいと思います。

OpenAjax HubはOpenSocial自体の仕様とは別にOpenAjax Hubとしての仕様を持っています。
以前まで仕様に存在していたPubSubと同じようなことを実現することができます。
(もちろんその他にも若干のエンハンスメントは存在しています)
フロントエンドにてガジェットが取得したデータをやり取りするためには欠かせない技術の一つです。

OpenAjax Hubでは、ホスト側にManagedHubを生成し、それと同時にハブを利用するガジェット側にコンテナを用意します。
このコンテナはManagedHubに接続する機能を提供するHubClientをガジェット側に提供します。
ガジェット側のコンテナとホスト側のManagedHubが接続することで異なるガジェットにメッセージを送信したり、メッセージの購読を行ったりする仕組みです。
ガジェット側ではHubClientより提供されるpublish()やsubscribe()を実行することで、メッセージの送信や購読を操作します。
ManagedHubへの接続はガジェットインスタンスが生成された時点で非同期に行われます。

メッセージは送信するたびにメッセージの内容とトピックをManagedHubに送付します。
トピックとはメッセージをグループ化するためのキーで、このキーを設定している購読側に送り届けられます。
ですので、購読側はsubscribe()時にトピックを指定することになります。

実際にサンプルガジェットとして下記のようなものを用意してみました。

// publish.xml
<?xml version="1.0" encoding="UTF-8"?>
<Module>
    <ModulePrefs title="Publish" scrolling="true" height="350">
        <Require feature="pubsub-2"/>
    </ModulePrefs>
    <Content type="html"><![CDATA[
        <form>
            <input id="topic" value="hogehoge"/><br>
            <input id="message" value="message"/>
            <input type="button" value="publish" onclick="publish( topic.value,message.value )"/>
        </form>
        <div id="console"/>
        <script type="text/javascript">
            gadgets.util;
            var c = document.getElementById("console");

            function nl() {
                c.appendChild( document.createElement("div"));
                return {
                    print: print
                };
            }
            function print( text ) {
                c.lastChild.appendChild( document.createTextNode( text ));
            }

            function main() {
                nl().print( window.name || window.id );
            }

            var n = 0;
            var subId;
            function publish( topic,message ) {
                nl().print([n++, "-", "Topic", topic, "でメッセージ", message, "を送信"].join(" "));
                gadgets.Hub.publish( topic,message );
            }

            main();
        </script>
    ]]></Content>
</Module>
// subscribe.xml
<?xml version="1.0" encoding="UTF-8"?>
<Module>
    <ModulePrefs title="Subscribe" scrolling="true" height="350">
        <Require feature="pubsub-2"/>
    </ModulePrefs>
    <Content type="html"><![CDATA[
        <form>
            <input id="topic" value="hogehoge"/>
        </form>
        <div id="console"/>
        <script type="text/javascript">
            gadgets.util;
            var c = document.getElementById("console");

            function nl() {
                c.appendChild( document.createElement("div"));
                    return {
                    print: print
                };
            }
            function print( text ) {
                c.lastChild.appendChild( document.createTextNode( text ));
            }
            function main() {
                nl().print( window.name || window.id );
            }

            var n = 0;
            var subId;
            function subscribe( topic ) {
                _gel("subId").value = gadgets.Hub.subscribe( topic,function( topic, message, subscriberData ) {
                    nl().print([n++,"-","Topic", topic, "からのメッセージ", message, "を受信", "(subscriberData=" + subscriberData + ")"].join(" "));
                }, this, function(subID){
                    _gel("subId").value = subID
                },"true" );
    
                nl().print([n++,"-","Topic", topic, "を購読", "(subId=" + _gel("subId").value + ")"].join(" "));
            }
            main();
            
            gadgets.util.registerOnLoadHandler(function(){
                subscribe(_gel("topic").value);
            });
        </script>
    ]]></Content>
</Module>

publish.xmlで送信したメッセージを、subscribe.xmlにて受け取り、メッセージを表示させる簡単なガジェットです。
subscribe.xmlではonload時に動的に購読するように設定しています。
動かしてみます。

あれ?
動かない。
javascriptデバックツールのfirebugを起動して、リロードしてみます。

OpenAjax.hub.error.disconnect なるエラーが発生しているようです。
最初に記述したようにOpenAjax Hubでは、コンテナの生成とManagedHubへの接続を行ったのちにメッセージの送信や購読を行えるようになります。
つまり、今回の事態はsubscribe.xmlにて動的に購読命令を出した時には、まだManagedHubに接続されていないために発生していたものと言うことになります。
ですので、少し修正してみます。

// subscribe.xml(修正版)
<?xml version="1.0" encoding="UTF-8"?>
<Module>
    <ModulePrefs title="Subscribe" scrolling="true" height="350">
        <Require feature="pubsub-2"/>
    </ModulePrefs>
    <Content type="html"><![CDATA[
        <form>
            <input id="topic" value="hogehoge"/>
        </form>
        <div id="console"/>
        <script type="text/javascript">
            gadgets.util;
            var c = document.getElementById("console");

            function nl() {
                c.appendChild( document.createElement("div"));
                    return {
                    print: print
                };
            }
            function print( text ) {
                c.lastChild.appendChild( document.createTextNode( text ));
            }
            function main() {
                nl().print( window.name || window.id );
            }

            var n = 0;
            var subId;
            function subscribe( topic ) {
                _gel("subId").value = gadgets.Hub.subscribe( topic,function( topic, message, subscriberData ) {
                    nl().print([n++,"-","Topic", topic, "からのメッセージ", message, "を受信", "(subscriberData=" + subscriberData + ")"].join(" "));
                }, this, function(subID){
                    _gel("subId").value = subID
                },"true" );
    
                nl().print([n++,"-","Topic", topic, "を購読", "(subId=" + _gel("subId").value + ")"].join(" "));
            }
            main();
            
            //追加したところ
            gadgets.HubSettings.onConnect=function(){
                    gadgets.Hub.subscribe(_gel("topic").value);
            }
            
            /* 削除する
            gadgets.util.registerOnLoadHandler(function(){
                subscribe(_gel("topic").value);
            });
            */
        </script>
    ]]></Content>
</Module>

修正版では、registerOnLoadHandler()内でsubscribe()せずに、gadgets.HubSettings.onConnectにsubscribe()する関数を渡しています。
このonConnectは接続が完了した時に実行される処理になります。
接続が非同期に行われる(正確には、ガジェットインスタンスが生成しきった後に非同期に行われる)ため、その終了を待つ必要がある処理を書くために存在しています。
修正したガジェットを使って実験した結果は以下になります。


 

参考URL

opensocial spec
OpenAjax Hub 2.0 Specification
Firebug