2011-09-23

DotCloudにJenkins+Nexus環境を構築してBitbucketと連携してみたよ(3/3)

こんにちは!aquilegiaです。

その2の続きになります。今回で最後になりますのでもう少しお付き合いください。

4、Bitbucketの準備
Bitbucketのアカウントを作成して動作確認用プロジェクトのリポジトリを作成します。

4-1、Bitbucketのアカウントを作成してログイン
Bitbucket公式サイトのSign up freeボタンからサインアップしてください。


例ではアカウント名をaquilegiaで登録しています。今後、BItbucket接続URLなどにaquilegiaと出てきた場合は適宜読み替えてください。

4-2、リポジトリを作成
サインアップが完了したらページ上部にあるRepositoriesからcreate repositoryを選択した後、以下の内容で入力してください。

Name: helloworld
Private: チェック有
Language: Java
Description: 動作確認用プロジェクト
Website: (なし)
Project management: (Wiki、Issue trackingはお好みで)

入力が終わったらCreate repositoryボタンを押下してください。これでBitbucketの準備は終わりです。

5、動作確認用プロジェクトの作成
4-2で作成したリポジトリにプッシュするプロジェクトを作成します。動作確認用なので手間をかけずにMavenで作ります。

5-1、プロジェクトを作成
下記コマンドを実行すると

$ cd ~
$ mvn archetype:generate -DarchetypeArtifactId=maven-archetype-quickstart -DgroupId=sample -DartifactId=helloworld -Dversion=0.1-SNAPSHOT
(実行を確認にYと応える)

次の構造のQuickStartプロジェクトが作成されます。

helloworld
├── pom.xml
└── src
    ├── main
    │  └── java
    │      └── sample
    │          └── App.java
    └── test
        └── java
            └── sample
                └── AppTest.java

このままでも動きますが動作確認が目的なので、このプロジェクトが依存しているJUnitを
Nexusから取得するようにpom.xmlにリポジトリ定義を追加します。
</dependencies>の後にDotCloudアカウント名を書き換えたrepositoriesを追加してください。

$ vi helloworld/pom.xml
  <repositories>
    <repository>
      <id>com.dotcloud.nexus</id>
      <url>http://nexus-(DotCloudアカウント名).dotcloud.com/content/groups/public</url>
    </repository>
  </repositories>

5-2、リポジトリへコミット→プッシュ
作成したプロジェクトをBitbucketへプッシュするためにMercurialをインストールします。

$ sudo yum -y install mercurial
$ hg --help

次に作成したプロジェクトにローカルリポジトリを作成してコミットしてください。

$ cd ~
$ mkdir bitbucket
$ hg clone https://(Bitbucketアカウント名)@bitbucket.org/(Bitbucketアカウント名)/helloworld bitbucket/helloworld
$ mv helloworld/* ./bitbucket/helloworld/
$ rm -rf helloworld
$ cd bitbucket/helloworld
$ hg status
$ hg add
$ hg commit -u (Bitbucketアカウント名) -m '初回コミット'

コミット時にユーザ名を指定しておくとBitbucketにリンク付きで表示されます。Bitbucketに存在しないユーザ名を指定するとデッドリンクになるので取得したアカウント名を指定するのが無難です。
最後にBitbucketへプッシュします。

$ hg push https://(Bitbucketアカウント名)@bitbucket.org/(Bitbucketアカウント名)/helloworld

プッシュが成功すればBitbucketのSourceタブにソースが表示されます。


6、動作確認
6-1、Nexus接続情報を設定
Nexusリポジトリは匿名ユーザではアクセスできないように設定したので、 Mavenでビルド時にNexusリポジトリを参照できるよう接続情報を設定したsettings.xmlを作成してください。
またJenkinsがNexusからDLした依存ファイルを保存するローカルリポジトリをjettyユーザが書き込める場所に変更するためlocalRepositoryを指定してください。

$ dotcloud run jenkins.www -- mkdir -p .m2/repository \&\& ls -al
$ dotcloud run jenkins.www -- chmod 775 .m2/repository \&\& ls -l .m2/
$ dotcloud run jenkins.www -- vi .m2/settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<settings>
  <localRepository>/home/dotcloud/.m2/repository</localRepository>
  <servers>
    <server>
      <id>com.dotcloud.nexus</id>
      <username>nexus</username>
      <password>(Nexusパスワード)</password>
    </server>
  </servers>
</settings>

$ dotcloud run jenkins.www -- cat .m2/settings.xml

6-2、動作確認用プロジェクトをビルドするジョブを登録
ブラウザからJenkinsにログインし、左メニューから新規ジョブ作成を選択してください。
以下の内容を入力しOKボタンを押下する

ジョブ名: helloworld
ビルド: フリースタイル・プロジェクトのビルド

ビルドにMaven2/3プロジェクトを指定しないのはsettings.xmlを指定するためです。
次にジョブの細かな設定をします。

ソースコード管理システム: Mercurial
Repository URL: https://(Bitbucketアカウント名):(Bitbucketパスワード)@bitbucket.org/aquilegia/helloworld/

ビルド手順の追加: Mavenの呼び出し
使用するMaven: maven_2.2.1
ゴール: package
高度な設定
JVMオプション: -Dorg.apache.maven.user-settings=/home/dotcloud/.m2/settings.xml

JVMオプションのsettings.xmlファイルの指定は忘れないようにしてください。

6-3、ジョブを実行
登録したジョブの左メニューにあるビルド実行リンクを押下してジョブを実行してください。
ビルド履歴の日付リンクを押下し、左メニューのコンソール出力リンクから詳細を見ることができます。問題がなければ下のようにBUILD SUCCESSFULと表示されるはずです。


画像はわかりやすくするため何回か実行した後のものになりますが、初回はこれに加えてプラグインや依存のDLログが出力されます。



お疲れ様でした。これでDotCloud上にプライベートビルド環境ができました。Jenkinsのジョブ設定で「SCMをポーリング」を指定すればプッシュした後に変更を検知して自動でビルドすることもできます。また今回は手間を省くために動作確認用プロジェクトの作成にEclipseを使いませんでしたが、EclipseのMercurialEclipseプラグイン(updateサイト)を使うとBitbucketとのやり取りが簡単になります。

また注意点としてJenkinsとNexusはどちらもその機能上ディスクを多く使いますがDotCloudはまだディスクの使用制限がはっきりしていません。そのため過度な利用は避けたほうがよさそうです。

開発に使うツールをクラウド上に置くといつでも作業ができて便利です。他のサービスも組み合わせて快適な開発環境を構築してみてください。それではまた。

DotCloudにJenkins+Nexus環境を構築してBitbucketと連携してみたよ(2/3)

こんにちは!aquilegiaです。

その1の続きです。今回はDotCloudにJenkinsを構築します。
Jenkinsは少し面倒ですがお付き合いください。

3、DotCloudにJenkinsを構築
3-1、DotCloud用カスタムWARを作成
JenkinsもNexus同様にjettyユーザが書き込めるJENKINS_HOMEディレクトリが必要ですが、DotCloud環境だとJenkinsが提供する外部指定(JNDIや環境変数、システムプロパティなど)が全て利用できません。その為、あまりやりたくありませんがJenkinsのソースを直接変更してJENKINS_HOMEを指定します。

変更後のJENKINS_HOMEは/home/dotcloud/jenkinsとします。

3-1-1、GitHubからJenkinsのソースコードをDL
ローカルにgitがインストールされていない場合は事前にインストールしてください。

$ rpm -qa | grep git
$ sudo yum -y install git

次にカスタムWARを作るために編集対象のソースが含まれるcoreプロジェクトをcloneします。

$ mkdir -p jenkins/src
$ cd jenkins/src
$ git clone git://github.com/jenkinsci/jenkins.git core

最新ソースの状態になっているので安定してるリリースタグをチェックアウト(後でDLするWARファイルとバージョンを合わせておく)

$ cd core
$ git checkout jenkins-1.430

3-1-2、WebAppMain.javaを編集してJENKINS_HOMEを変更
WebAppMain.javaを開き

$ cd core/core/src/main/java/hudson/
$ cp -p WebAppMain.java WebAppMain.java.org
$ vi WebAppMain.java

getHomeDirメソッドの内容を次の2行にしてください。

        File newHome = new File("/home/dotcloud/jenkins");
        return new FileAndDescription(newHome,"/home/dotcloud/jenkins");

3-1-3、ソースをコンパイル
コンパイルはMavenを利用します。JDKも必要になるので無い場合はインストールしてください。

$ wget http://download.oracle.com/otn-pub/java/jdk/6u27-b07/jdk-6u27-linux-x64-rpm.bin
$ mv jdk-6u27-linux-x64-rpm.bin\?e\=1316438935\&h\=38edd1ecfcdb35d6dd0aa91215bb62fb jdk-6u27-linux-x64-rpm.bin
$ chmod u+x jdk-6u27-linux-x64-rpm.bin
$ sudo ./jdk-6u27-linux-x64-rpm.bin
$ java -version

次にMavenをインストールします。インストールはrootで作業します。

$ su -
# wget http://ftp.kddilabs.jp/infosystems/apache//maven/binaries/apache-maven-2.2.1-bin.tar.gz
# tar xzvf apache-maven-2.2.1-bin.tar.gz
# mv apache-maven-2.2.1-bin /opt/maven2
# rm -f apache-maven-2.2.1-bin.tar.gz
# vi /etc/profile.d/maven2.sh
export M2_HOME=/opt/maven2
export PATH=$PATH:$M2_HOME/bin
# exit
$ source /etc/profile
$ mvn -v

最後のmvnコマンドでバージョン情報が表示されればインストール成功です。

coreディレクトリの直下に移動した後、下記コマンドを実行してコンパイルします。(※数分かかります)

$ cd ~/jenkins/src/core/core
$ mvn compile

OpenJDKを使うとcom.sun.toolsが見つからないというエラーでビルドが失敗するかもしれません。その場合はOpenJDKをアンインストール後、OracleのJDKを入れて試してみてください。

3-1-4、JenkinsのWARファイルをDL
MavenでWARまで作っても構いませんが、無難にリリースされたWARファイルを利用します。

$ cd ~/jenkins/
$ wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war

3-1-5、WAR内のclassesに作成したWebAppMain.classを追加
$ mkdir -p WEB-INF/classes/hudson
$ cp -p src/core/core/target/classes/hudson/WebAppMain.class ./WEB-INF/classes/hudson/
$ cp -p jenkins.war jenkins.war.org
$ zip jenkins.war WEB-INF/classes/hudson/WebAppMain.class

3-2、DotCloudにjenkinsアプリケーションを作成
下記コマンドを実行し、jenkinsアプリケーションを作成してください。

$ dotcloud create jenkins

3-4、DotCloudへデプロイ
デプロイはNexusと同様にビルドファイルを作成し、ビルドファイルとWARファイルのみのディレクトリを作成した後にpushコマンドを実行します。

$ cat > dotcloud.yml <<EOF
www:
  type: java
EOF
$ mkdir deploy
$ mv jenkins.war deploy/ROOT.war
$ mv dotcloud.yml deploy/
$ dotcloud push jenkins deploy/
upload deploy/ ssh://dotcloud@uploader.dotcloud.com:443/jenkins
rsync
Pseudo-terminal will not be allocated because stdin is not a terminal.
building file list ... done
./
ROOT.war
dotcloud.yml

sent 45.19M bytes  received 53 bytes  772.50K bytes/sec
total size is 45.37M  speedup is 1.00
Deployment for "jenkins" triggered. Will be available in a few seconds.
2011-09-19 15:39:50 [api] Deploy jenkins scheduled for revision=latest
2011-09-19 15:39:51 [api] Waiting for the build. (It may take a few minutes)
2011-09-19 15:39:51 [www.0] Deploying...
2011-09-19 15:40:12 [www.0] Service booted
2011-09-19 15:40:12 [api] All the services are ready. Beginning the build.
2011-09-19 15:40:13 [www.0] The build started
2011-09-19 15:40:16 [www.0] Fetched code revision rsync-xxxxxxxxxx.xx
2011-09-19 15:40:18 [www.0]  * Stopping Jetty servlet engine (was reachable on http://jenkins-default-www-0:8080/). jetty
2011-09-19 15:40:21 [www.0]  * Jetty servlet engine stopped. jetty
2011-09-19 15:40:21 [www.0]    ...done.
2011-09-19 15:40:21 [www.0]  * Starting Jetty servlet engine. jetty
2011-09-19 15:40:21 [www.0]  * Jetty servlet engine started, reachable on http://jenkins-default-www-0:8080/. jetty
2011-09-19 15:40:26 [www.0]    ...done.
2011-09-19 15:40:26 [www.0] The build finished successfully
2011-09-19 15:40:26 [api] Deploy finished

Deployment finished. Your application is available at the following URLs
www: http://jenkins-aquilegia.dotcloud.com/

この状態ではNexusと同じ理由でまだ正常に動きませんので、ディレクトリを作成する手順を進めてください。

3-5、DotCloudにJENKINS_HOMEを作成
下記コマンドを実行し、jenkinsディレクトリを作成してください。

$ dotcloud run jenkins.www -- mkdir jenkins \&\& ls -l

Nexusと同様にグループに書込権限を付与してください。

$ dotcloud run jenkins.www -- chmod g+w jenkins \&\& ls -l

3-6、Jenkinsを再起動
これでJenkinsを起動するまでの準備が整いました。
別コンソールでログをtailしつつ、Jenkinsを再起動します。

$ dotcloud logs jenkins.www
$ dotcloud restart jenkins.www

ログにスタックとレースが表示されず、最後に以下のログが表示されれば成功です。

INFO: JNLP slave agent listener started on TCP port 58600
Sep 19, 2011 3:48:56 PM hudson.WebAppMain$2 run
INFO: Jenkins is fully up and running

正常に起動すればブラウザでアクセスするとTOPページが表示されます。

3-7、Jenkinsの初期設定
初期状態は外部に公開されている状態なので自分だけが利用できるように設定します。

3-7-1、ログインユーザを作成
Jenkinsにユーザを作成します。
  • 左メニューから「Jenkinsの管理→システム設定」を選択し、システム設定ページを表示
  • 6番目ぐらいにある「セキュリティを有効化」チェックボックスをON
  • アクセス制御のユーザ情報から「Jenkinsのユーザデータベース」を選択
  • 保存ボタンを押下
保存した後、ページ右上にサインアップリンクが表示されるようになるので
リンクを押下してユーザを作成してください。(例ではjenkinsとします)

ユーザ名: jenkins
パスワード: (パスワードを入力)
パスワードの確認: (パスワードを入力)
フルネーム: jenkins
メールアドレス: (メールアドレスを入力)

サインアップが完了すると作成したユーザでログインした状態になります。
その後はサインアップできないようにします。

  • 左メニューから「Jenkinsの管理→システム設定」を選択し、システム設定ページを表示
  • アクセス制御のユーザ情報にある「ユーザにサインアップを許可」チェックボックスを外す
  • 保存ボタンを押下
これでページ右上からサインアップリンクが消えたはずです。


3-7-2、権限を設定
Jenkinsを利用できるユーザをログインユーザのみにします。
  • 左メニューから「Jenkinsの管理→システム設定」を選択し、システム設定ページを表示
  • アクセス制御の管理権限を行列による権限設定に変更
  • 匿名ユーザはそのままでauthenticatedという名前のユーザを追加
  • 全権限を与える(チェックを全て入れる)
  • 保存ボタンを押下
権限のチェックを終えると次のようになります。


これでログアウトするとホームページにログインフォームが表示されます。ログインしなければ何も利用できなくなっているはずです。

3-7-3、Mavenの自動インストール設定
DotCloud上にMavenをインストールするのは手間なのでJenkinsにやってもらいます。
ですがJenkinsがインストールしたMavenではMavenリポジトリに書き込めないという
おなじみの問題が発生するので後で対処します。
  • 左メニューから「Jenkinsの管理→システム設定」を選択し、システム設定ページを表示
  • ページ中央にあるMeven追加ボタンを押下
  • 名前とバージョンを指定
名前: maven_2.2.1
バージョン: 2.2.1
  • 自動インストールはONのままとしてください。
  • 保存ボタンを押下
また少し下に「利用状況とクラッシュレポートをJenkinsプロジェクトに匿名で報告」という項目がありますが好みで変更してください。

3-7-4、Jenkins Mercurial pluginをインストール
次はBitbucketからソースコードを取得するプラグインをインストールします。
  • 左メニューから「Jenkinsの管理→プラグインの管理」を選択し、プラグインページを表示
  • 利用可能タブから「Mercurial Plugin」を探し、チェックを入れる
  • ページ下部にあるインストールボタンを押下してインストール
この時「インストール後ジョブがなければ再起動する」にチェックを入れると
DotCloudコマンドで再起動しなくて済むので簡単です。



お疲れ様です。以上でJenkinsの構築が終わりました。
次回は動作確認用プロジェクトを作成して動作確認します。

DotCloudにJenkins+Nexus環境を構築してBitbucketと連携してみたよ(1/3)

こんにちは!極稀に記事を書くaquilegiaです。

まずは手順を作るために下記ページを参考にさせて頂きました。多謝!
 * dotcloud いいね!jenkins 編
 * Jenkins Mercurial Pluginでbitbucketにアクセスする

今回は3arrowsやソーシャルから少し離れて、開発者の間で話題?のDotCloudとBitbucketを連携したJavaのコーディング環境を構築する手順をご紹介します。

サービスの詳細は割愛しますが、DotCloudは多くのプログラム言語を実行できるPaaSで無料で2アプリケーションまで作成できます。Bitbucketはプロジェクトホスティングサービスでソースコード管理にMercurialを利用しており、5人までのチームは無料でIssueとWikiがついたプライベートなプロジェクトを無制限に作ることができます。

今回はこの二つを利用して個人向けプライベートビルド環境を作りましょ~というお話になります。手順のアウトラインは次の通りで、少し長いため3回に分けて紹介します。作業はLinux上で行ってだいたい1時間程度かかると思います。

・DotCloudを利用するための準備 ・DotCloudアカウントを取得 ・DotCloudクライアントをインストール ・DotCloudにNexusを構築 ・NexusのWARファイルをDL ・WARファイルから編集ファイルを抽出 ・ベースディレクトリの設定を変更 ・編集したファイルをWARファイルに戻す ・DotCloudにnexusアプリケーションを作成 ・DotCloudへデプロイ ・DotCloudにベースディレクトリを作成 ・Nexusを再起動 ・Nexusの初期設定 ・ログインユーザを作成 ・既存ユーザを無効にする ・DotCloudにJenkinsを構築 ・DotCloud用カスタムWARを作成 ・GitHubからJenkinsのソースコードをDL ・WebAppMain.javaを編集してJENKINS_HOMEを変更 ・ソースをコンパイル ・JenkinsのWARファイルをDL ・WAR内のclassesに作成したWebAppMain.classを追加 ・DotCloudにjenkinsアプリケーションを作成 ・DotCloudへデプロイ ・DotCloudにJENKINS_HOMEを作成 ・Jenkinsを再起動 ・Jenkinsの初期設定 ・ログインユーザを作成 ・権限を設定 ・Mavenの自動インストール設定 ・Jenkins Mercurial pluginをインストール ・Bitbucketの準備 ・Bitbucketのアカウントを作成してログイン ・リポジトリを作成 ・動作確認用プロジェクトの作成 ・プロジェクトを作成 ・リポジトリへコミット→プッシュ ・動作確認 ・Nexus認証情報を設定 ・動作確認用プロジェクトをビルドするジョブを登録 ・ジョブを実行

1、DotCloudを利用するための準備
DotCloud公式サイトのホームページにある緑色のSing Up Freeボタンを押下してアカウントを登録してください。


次にインストールマニュアルに従ってCLIをインストールしてください。DotCloudとやりとりする時にこのCLIを使います。
※CLIはWindows以外をお勧めします。というのも最初Windows版をインストールしてみたところ私のCygwin環境が悪かったのか、コマンド実行時に頻繁にエラーが発生しました。エラーを無視して根気よくコマンドを送れば使えますが、ストレスが溜まるのでLinux版へ替えました。

CLIをインストール後は任意のユーザでdotcloudコマンドを実行してください。初回実行時のみAPIキーの入力が求められます。

$ dotcloud
Warning: /home/aquilegia/.dotcloud/dotcloud.conf does not exist.
Enter your api key (You can find it at http://www.dotcloud.com/accounts/settings): (settingsページに表示されるAPIキーを入力する)
error: usage: dotcloud [-h]

                {info,status,stats,run,logs,versions,url,setup,list,rollback,alias,ssh,push,destroy,create,restart,history}
                ...

コンソールに表示されたURL(http://www.dotcloud.com/accounts/settings)へアクセスすればAPIキーが表示されるはずです。引数なしで実行すると上記のようにエラーになりますが問題ありません。

2、DotCloudにNexusを構築
NexusはそのままではDotCloud上で動きません。これはDotCloud上で動いているサーブレットコンテナはJettyでJettyユーザによって実行されていますが、Nexusがファイルを書き出すruntimeとnexus-workディレクトリに書込権限がなくエラーになるためです。

そのため私達が自由に使えるdotcloudユーザのホームディレクトリにnexusディレクトリを作成してそこを使わせるようにします。

2-1、NexusのWARファイルをDL
作業用のディレクトリを作成した後、ここからNexusのWARファイルをDLしてください。

$ mkdir -p nexus
$ cd nexus
$ wget http://nexus.sonatype.org/downloads/nexus-webapp-1.9.2.2.war

2-2、WARファイルから編集ファイルを抽出
WARから編集するファイルのみ展開してください。

$ unzip nexus-webapp-1.9.2.2.war WEB-INF/plexus.properties

2-3、ベースディレクトリの設定を変更
展開したディレクトリ内のWEB-INF/plexus.propertiesをエディタで開いてruntimeとnexus-workが/home/dotcloud/nexus配下になるよう編集してください。
(例はオリジナルからnexus-homeを追加し、runtimeとnexus-workがnexus-homeの子ディレクトリになるよう変更しました)

$ cd WEB-INF
$ cp -p plexus.properties plexus.properties.org
$ vi plexus.properties
nexus-home=/home/dotcloud/nexus
runtime=${nexus-home}/runtime
apps=${runtime}/apps
nexus-work=${nexus-home}/sonatype-work/nexus
nexus-app=${runtime}/apps/nexus
webapp=${runtime}/apps/nexus/webapp
security-xml-file=${nexus-work}/conf/security.xml
application-conf=${nexus-work}/conf
runtime-tmp=${runtime}/tmp

2-4、編集したファイルをWARファイルに戻す
編集したファイルをWARファイルに戻します。

$ cd ../
$ cp -p nexus-webapp-1.9.2.2.war nexus-webapp-1.9.2.2.war.org
$ zip nexus-webapp-1.9.2.2.war WEB-INF/plexus.propertie

2-5、DotCloudにnexusアプリケーションを作成
ここからはDotCloudへのデプロイ作業に移ります。コンソールから下記コマンドを実行し、DotCloudにnexusアプリケーションを作成してください。

$ dotcloud create nexus
Created application "nexus"

2-6、DotCloudへデプロイ
デプロイにはWARファイルとビルドファイルが必要になります。ビルドファイルは以下の内容でdotcloud.ymlという名前で作成してください。wwwはサービス名で任意の文字でかまいません。(ここでは公式ドキュメントと同じwwwとします)

$ cat > dotcloud.yml <<EOF
www:
type: java
EOF

次に適当な名前のディレクトリ(ここではdeployとします)を作成してWARファイルとビルドファイルと移してください。DotCloudのデプロイは内部でrsyncを使うのですが、指定したディレクトリの全ファイルを同期してしまうので無関係なファイルが送られないようにします。

$ mkdir deploy
$ mv nexus-webapp-1.9.2.2.war deploy/ROOT.war
$ mv dotcloud.yml deploy/

コンテキストルートは/にしたいのでWARファイルは名前をROOT.warに変更しておきます。
最後にコンソールから下記コマンドを実行し、DotCloudにnexusをデプロイする。

$ dotcloud push nexus deploy/
upload deploy/ ssh://dotcloud@uploader.dotcloud.com:443/nexus
rsync
Pseudo-terminal will not be allocated because stdin is not a terminal.
building file list ... done
./
ROOT.war
dotcloud.yml

sent 25.57M bytes received 53 bytes 616.03K bytes/sec
total size is 25.67M speedup is 1.00
Deployment for "nexus" triggered. Will be available in a few seconds.
2011-09-19 10:35:32 [api] Deploy nexus scheduled for revision=latest
2011-09-19 10:35:32 [api] Waiting for the build. (It may take a few minutes)
2011-09-19 10:35:32 [www.0] Deploying...
2011-09-19 10:35:57 [www.0] Service booted
2011-09-19 10:35:57 [api] All the services are ready. Beginning the build.
2011-09-19 10:35:57 [www.0] The build started
2011-09-19 10:35:58 [www.0] Fetched code revision rsync-xxxxxxxxx.xx
2011-09-19 10:36:01 [www.0] * Stopping Jetty servlet engine (was reachable on http://nexus-default-www-0:8080/). jetty
2011-09-19 10:36:03 [www.0] * Jetty servlet engine stopped. jetty
2011-09-19 10:36:03 [www.0] ...done.
2011-09-19 10:36:03 [www.0] * Starting Jetty servlet engine. jetty
2011-09-19 10:36:04 [www.0] * Jetty servlet engine started, reachable on http://nexus-default-www-0:8080/. jetty
2011-09-19 10:36:09 [www.0] ...done.
2011-09-19 10:36:09 [www.0] The build finished successfully
2011-09-19 10:36:09 [api] Deploy finished

Deployment finished. Your application is available at the following URLs
www: http://nexus-aquilegia.dotcloud.com/

ここでデプロイ結果を確認したくなりますがもう少し我慢してください。まだこの時点だと/home/dotcloud/nexusディレクトリが無いので正常に動いていません。

2-7、DotCloudにベースディレクトリを作成
コンソールから下記コマンドを実行し、DotCloudにNexusが使うディレクトリを作成してください。

$ dotcloud run nexus.www -- mkdir nexus \&\& ls -l

次にnexusディレクトリにグループ書込権限を追加します。こうすることでjettyユーザで実行されているNexusからディレクトリへファイルを書き込めるようになります。

$ dotcloud run nexus.www -- chmod g+w nexus \&\& ls -l

2-8、Nexusを再起動
今度は正常に起動できるはずなのでログを監視しながら再起動します。別のコンソールで下記コマンドを実行してログをtailしてください。

$ dotcloud logs nexus.www

そしてnexusアプリケーションを再起動してください。

$ dotcloud restart nexus.www

正常に起動すればログにスタックトレース等は出力されずに最終行が

15632 [main] INFO org.mortbay.log - Started SelectChannelConnector@0.0.0.0:8080
となるはずです。

2-8、Nexusの初期設定
初期状態は外部に公開されている状態なので自分だけが利用できるように設定を変更します。

2-8-1、ログインユーザを作成
ダッシュボードでアプリ名の右側に表示されたサービス名をクリックするとデプロイしたNexusが表示されます。URLは"デプロイ名-アカウント名"を第4レベルドメインにしたものなので覚えられると思います。

http://nexus-aquilegia.dotcloud.com/

右上のLog Inリンクを押下し、下記ID/パスで管理者としてログインしてください。ログイン後は左のSecurityからChange Passwordを選択してパスワードを変更してください。

admin
admin123

ユーザの作成はSecurity→Usersから行います。Usersを選択すると右側に一覧が表示されるので上部に表示された緑色のAddボタンを押下し、Nexusユーザを作成してください。
(ここではnexusというIDで作成したとします)

ID: nexus
EMail: (メールアドレスを入力)
Status: Active
New Password: (パスワードを入力)
Confirm Password: (パスワードを入力)

Role Management: Nexus Developer Role
※メールアドレスは必須項目のため設定していますがAdministration → ServerでSMTPサーバや通知設定をしないと実際には送信されません。必要な方は試してみてください。

2-8-2、既存ユーザを無効にする
Usersの一覧にはもとからadmin、deployment、anonymousがありますがdeploymentは不要なので削除してください。またanonymousは非ログイン状態のユーザになり、削除不可ユーザです。今回は個人で利用するのでリポジトリを匿名ユーザに参照されないようStatusをDisabledへ変更してください。変更後のTOPページは以下のようにRespositoriesも参照できなくなります。


お疲れ様です。これでNexus環境ができました。
今回はここまでです。続きは次回ご紹介します。

2011-04-04

3arrows の OpenSocial RPC API (2-legged OAuth) で、節電呼びかけでんこちゃん社内 bot を作ってみたよ

こんにちは。Nobuhiro Nakajima @ YOKOHAMA です。

3arrows - Google Apps アカウントでも使える社内 Twitter
http://www.3arrows.jp/

3arrows は、2-legged OAuth による OpenSocial RPC API を提供しています。2-legged OAuth は mixiアプリなどソーシャルアプリの世界では、標準化されたリクエスト署名方式で、アプリと外部システムの連携に適しています。詳しくは、次のページを参考にしてください。

2-legged OAuth による API アクセス >> mixi Developer Center
http://developer.mixi.co.jp/appli/spec/pc/restful-api-for-pc/2-legged-oauth-api-access

このエントリでは 2-legged OAuth による OpenSocial RPC API を使って、電力使用状況と節電を呼びかける でんこちゃん 社内 bot の作り方を紹介します。

でんこちゃん社内 bot

就業時間中の1時間に1度、でんこちゃん bot がタイムラインに節電を呼びかける投稿をします。このとき、現在の電力使用状況とその日の推移グラフも合わせて投稿します。



①でんこちゃん bot
②東京電力アプリのロゴ
③東京電力アプリのリンク先 http://www.tepco.co.jp/forecast/index-j.html
④電力使用状況
⑤電力使用状況の推移グラフ (クリックすると、次のとおり拡大する)


でんこちゃんユーザの作成

コントロールパネルで、でんこちゃんを表すユーザを作成します。ここでは、メールアドレスを denkochan@lrlab.to とします。

東京電力アプリの作成

コントロールパネルで、東京電力を表すアプリを作成します。



アプリのガジェットXMLは次のとおりです。アプリのタイトルは東京電力とし、アイコンは Twitter 公式アカウント から拝借します。アプリは、コンテンツを持たせず、東京電力サイトにリンクさせます。
<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="東京電力" description="東京電力から節電のお願いです">
<Link rel="icon" href="http://a0.twimg.com/profile_images/1276730827/tepco_normal.JPG" />
</ModulePrefs>
<Content type="url" href="http://www.tepco.co.jp/forecast/index-j.html"></Content>
</Module>
コンシューマキーとシークレットの入手

2-legged OAuth のコンシューマキーとシークレットは、コントロールパネルから入手できます。OpenSocial RPC API のエンドポイント (URL) も同様です。


バッチの作成

東京電力 から LWP::Simple を使って、電力の使用状況データ (CSV) をダウンロードします。そして、最新の電力使用状況を集計し、Google Chart API を使って、当日の推移グラフを作成します。
use strict;
use warnings;

use LWP::Simple;
use Encode 'decode_utf8';

my $url = 'http://www.tepco.co.jp/forecast/html/images/juyo-j.csv';
my @rows = split(/\r\n/, get($url));

shift @rows;
shift @rows;

# ピーク時供給力(万kW)
my ($cap) = split(/,/, shift @rows); 

shift @rows;
shift @rows;

# 24時間分の当日実績(万kW)
my @hours = map {
    my @cols = split(/,/, $_); $cols[2];
} @rows;

my $latest;

# 最新の当日実績(万kW)
for (reverse(@hours)) {
    last if $latest = $_;
}

# 電力使用率
my $per = sprintf('%.1f', $latest / $cap * 100);

# 当日実績(万kW)の推移グラフ
my $chart = 'http://chart.googleapis.com/chart' . 
    '?chs=400x240' .
    '&cht=bvo' .
    "&chxr=0,0,$cap|1,0,23" .
    '&chxt=y,x' .
    '&chbh=10' . 
    '&chd=t:' . join(',', map { int($_ / $cap * 100) } @hours);
続けて、Activities API を使って、電力使用状況を 3arrows に投稿します。アクティビティの作成を JSON RPC で組み立て、OAuth::Lite::Consumer を使って、リクエストを署名して発行します。

API の Endpoint、Consumer Key、Consumer Secret には、前述のコントロールパネルから入手した値を指定します。また、xoauth_requestor_id には、でんこちゃん(投稿者) を表す denkochan@lrlab.to を指定しています。

アクティビティの作成に成功すると、アクティビティID がレスポンスされます。万が一失敗したときは、JSON RPC のエラーか HTTP ステータスのエラーがレスポンスされます。
use Data::Dumper;
use JSON::XS;
use OAuth::Lite::Consumer;

# アクティビティのタイトル
my $title = <<EOB;
じゃん! 電気を大切にね。
> 電力使用状況 $cap 万kW 中 $latest 万kW ($per%)
> $chart
EOB

# アクティビティの作成を表す JSON RPC
my $content = JSON::XS::encode_json({
    jsonrpc => '2.0',
    method => 'activities.create',
    params => {
        userId => '@viewer',
        group => '@self',
        activity => { title => decode_utf8($title) } # UTF-8 フラグ
    },
    id => 1
});

# API の Endpoint, Consumer Key, Consumer Secret, Viewer
my %options = (
    endpoint => 'http://nakajiman.3arrows.jp/api/rpc/a',
    consumer_key => '{consumer key}',
    consumer_secret => '{consumer secret}',
    requester_id => 'denkochan@lrlab.to',
);

my $consumer = OAuth::Lite::Consumer->new(
    consumer_key => $options{consumer_key},
    consumer_secret => $options{consumer_secret}
);

# リクエストの署名と発行
my $response = $consumer->request(
    method  => 'POST',
    url => $options{endpoint},
    headers => [ 'Content-Type' => 'application/json' ],
    content => $content, 
    params => {
        xoauth_requestor_id => $options{requester_id},
    });

# リクエストの成否
if ($response->is_success) {
    print Dumper(JSON::XS::decode_json($response->decoded_content));
} else {
    warn $response->status_line;
}

1;
バッチの実行

就業時間の 9:00 から 18:00 の間で、1時間に一度、バッチを実行するように cron を登録します。

ダウンロード

でんこちゃん社内 bot のソースコードは、次のページからダウンロードできます。

ダウンロード - 3arrows.jp
https://sites.google.com/a/socialprise.jp/3arrows-jp/downloads

2011-03-30

3arrows アップデート! Google Apps アカウントでログインできるようになりました。

3月28日(月)、企業やチーム向けのプライベートマイクロブログ、3arrows をアップデートしました。アップデートの主な内容は次の通りです。

Google Apps アカウントでログインできるようになりました!

コントロールパネルの 「ユーザーの管理」 画面で、「Google Apps アカウントでログインする」 のチェックボックスにチェックを入れると、以後、3arrows に Google Apps アカウントでログインできるようになります。

なお、Google Apps for Business をご利用の方は、Google Apps の OpenID の設定を有効にする必要があります。


「ログイン」 画面では Google Apps アカウントのドメインを入力してください。


今回の Google Apps アカウントへの対応で、3arrows は個人間のコラボレーション、企業内のコラボレーション、企業間のコラボレーションを支援できるようになりました。

3arrows では、異なるドメインのメールアドレスのユーザー、異なるドメインの Google Apps アカウントのユーザーを、区別せずメンバーとして招待することができます。


全てのアプリケーションの更新をお願いします!

管理者の方は、コントロールパネルのアプリケーションタブから、全てのアプリケーションを更新してください。「更新する」 リンクをクリックすると、アプリケーションを更新できます。「最新」 と表示されれば更新の完了です。


3arrows では、引き続き α テストのユーザーを募集しています。サインアップの手続きはとても簡単です。数分ですぐに利用を始めることができます。企業や個人等、利用条件に制限はありませんので、この機会にぜひお試しください。

2011-03-21

Google Apps Script に続けて Windows Script Host (WSH) で 2-Legged OAuth をやってみました

こんにちは。なかじまん @ YOKOHAMA です。
東北関東大震災で被災された皆さまには心よりお見舞い申し上げます。



Google Apps Script の UrlFetch Services は 2Legged OAuth に対応してないっぽいので自前でやってみた に続いて、Windows Script Host (WSH) を使って Windows のコマンドラインから 2-Legged OAuth をやってみました。

WSH の場合、いろいろな実装方法を選択できそうなのですが、前述の Google Apps Script の JavaScript をそのまま動かす方法を選択しています。

なので、ソースコードはほとんど同じで、UrlFetch Services ではなく XMLHttpRequest を同期で使っているくらいの違いです。
<job>
<script language="JavaScript" src="sha1.js"></script>
<script language="JavaScript" src="oauth.js"></script>
<script language="JavaScript" src="json2.js"></script>
<script language="JavaScript">

  var endpoint = 'http://nakajiman.3arrows.jp/api/rpc/a';
  var consumerKey = '{Consumer Key}';
  var consumerSecret = '{consumer Secret}';
  var requestor_id = 'nakajiman(at)lrlab.to';

  var message = { method: 'POST', action: endpoint, parameters: {} };

  OAuth.setParameter(message, 'oauth_consumer_key', consumerKey);
  OAuth.setParameter(message, 'oauth_version', '1.0');
  OAuth.setParameter(message, 'oauth_timestamp', OAuth.timestamp());
  OAuth.setParameter(message, 'oauth_nonce', OAuth.nonce(6));
  OAuth.setParameter(message, 'xoauth_requestor_id', requestor_id);

  OAuth.SignatureMethod.sign(message, { consumerSecret: consumerSecret });

  var url = OAuth.addToURL(endpoint, message.parameters);
  var data = JSON.stringify({
      jsonrpc: '2.0',
      method: 'activities.create',
      params: { userId: '@viewer', group: '@self', activity: { title: 'Say hello!' } },
      id: 1
  });
  
  var xhr = WScript.CreateObject('MSXML2.XMLHTTP');
  xhr.open(message.method, url, false);
  xhr.setRequestHeader('Content-Type', 'application/json');
  xhr.send(data);
  
  if (xhr.status != 200)
    WScript.Echo(xhr.status + ' ' + xhr.statusText);
  else {
    var res = JSON.parse(xhr.responseText);
    WScript.Echo(res.result);
  }

</script>
</job>
ただいま、 企業やチーム向けのプライベートマイクロブログ 3arrows では、お客様のシステムやサービスとの連携を目的とした「シングルサインオン」と「2-Legged OAuth ベースの API」に取り組んでいます。

2-Legged OAuth ベースの API 公開により、システムやサービスの統合に加えて、Google Apps Script や Windows Script Host から 3arrows を操作して、ユーリティティの用途としても活用できるようになります。

2011-03-07

3arrows アップデート! 投稿内容を引用して返信できるようになりました! Gmail や Trac のような明瞭な引用です!

3月2日(水)、企業やチーム向けのプライベートマイクロブログ、3arrows をアップデートしました。アップデートの主な内容は次の通りです。

ステータスの引用機能の追加

マイクロブログの各ステータスを引用できるようになりました。


Twitter の以前の RT 機能と類似の機能となりますが、引用したステータスがそれと分かるようにスタイリングされ、また、3arrows は Twitter と比較して文字数の制限が緩いため、ステータスを途中で切ることなく引用することができます。

ステータス上でのアプリケーションのアイコンと名前の表示

日報等、各アプリケーションからマイクロブログに通知されたステータスには、それと分かるようにアプリケーションのアイコンと名前を表示するようになりました。


これにより、どのアプリケーションからの通知なのかが一目で分かるようになります。

全てのアプリケーションの更新をお願いします!

管理者の方は、コントロールパネルのアプリケーションタブから、全てのアプリケーションを更新してください。「更新する」 リンクをクリックすると、アプリケーションを更新できます。「最新」 と表示されれば更新の完了です。


3arrows では、引き続き α テストのユーザーを募集しています。サインアップの手続きはとても簡単です。数分ですぐに利用を始めることができます。企業や個人等、利用条件に制限はありませんので、この機会にぜひお試しください。

Facebook のプロフィール写真をウェブカメラを経由でアップロードしてみた。ウェブカメラから multipart/form-data で静止画をアップロードできるライブラリを探しています。

こんにちは。Nobuhiro Nakajima です。

Facebook のプロフィール写真は、ウェブカメラを経由してウェブブラウザからアップロードできるらしいので試してみました。

手持ちのウェブカメラは マイクロソフト ウェブカメラ LifeCam VX-800 JSD-00006 です。↓これ。今なら 1,000 円くらいで入手できます。

マイクロソフト ウェブカメラ LifeCam VX-800 JSD-00006

プロフィール写真の設定ページから写真を撮るボタンをクリックすると、ポップアップが開きます。許可をクリックすると、ウェブカメラの映像が移り出すので、カメラボタンをクリックして、写真を撮ります。



すると、次のとおり、ウェブカメラで撮影した静止画がプロフィール写真として掲載されます。



ウェブカメラからの写真の撮影は Flash で実現されています。Flash 内で、ウェブカメラのストリームを扱い撮影のタイミングで静止画にして、サーバにアップロードするという仕組みのようです。

同じことをやってみたくて、ライブラリなどを探していると、いくつか発見できました。例えば、これとか。

jQuery webcam plugin - Website and Application Intelligence
This plugin provides three different modes to access a webcam through a small API directly with JavaScript - or more precisely jQuery.
ただ、今まで見つけたライブラリは、静止画のデータを HTTP POST の raw データとしてアップロードするものでした。これだと AppEngine の Blob Storage に直接アップロードできないのです。

ということで multipart/form-data でウェブカメラから静止画をアップロードできるライブラリを探しています。もしも、ご存じでしたらぜひ教えてください。

2011-03-03

3arrows アップデート! 無料プラン、独自ドメイン/専用環境プラン、OEM プランを追加しました。

3 月 1 日 (火)、企業やチーム向けのプライベートマイクロブログ、3arrows料金表を改定しました。改定の主な内容は次の通りです。

無料プランの追加

3arrows を無料で利用できるプランを追加しました。今後、ユーザー数が 5 人以内の場合、3arrows は無料で利用できます。

独自ドメイン/専用環境プランの追加

3arrows を独自ドメイン、専用環境で利用できるプランを追加しました。セキュリティポリシー上、共用環境での利用が難しかったお客様でも、今後は独自ドメイン、専用環境で 3arrows を利用できます。(有料になります。)

OEM プランの追加

3arrows を OEM として、お客様のブランドで提供したり、お客様のサービスに組み込んで提供できるプランを追加しました。3arrows は柔軟で堅牢なアーキテクチャーの元で実装されているため、デザイン、機能ともにフルカスタマイズした上で提供することが可能です。

3arrows では、引き続き α テストのユーザーを募集しています。サインアップの手続きはとても簡単です。数分ですぐに利用を始めることができます。企業や個人等、利用条件に制限はありませんので、この機会にぜひお試しください。

2011-03-02

Google Apps Script の UrlFetch Services は 2Legged OAuth に対応してないっぽいので自前でやってみた

こんにちは。なかじまんです。

Google Apps Script の UrlFetch Services は 2Legged OAuth に対応してないっぽいので自前でやってみた。ちなみに 3Legged OAuth は標準でできるみたいです。

はじめに JavaScript の OAuth ライブラリ の内sha1.js と oauth.jp oauth.js を貼り付けます。そして、次のようにリクエストを署名して、UrlFetch Services でエンドポイントを叩きます。

以下の例では、Google Friend Connect の People API を呼び出して、Viewer (xoauth_requestor_id) のプロフィールを取得して、ニックネームを表示しています。
function myFunction() {

  var action = 'http://www.google.com/friendconnect/api/people/@me/@self';
  var accessor = { consumerSecret: '{consumerSecret}' };
  var message = { method: 'GET', action: action, parameters: {}, };

  OAuth.setParameter(message, 'oauth_consumer_key', '{oauth_consumer_key}');
  OAuth.setParameter(message, 'oauth_version', '1.0');
  OAuth.setParameter(message, 'oauth_timestamp', OAuth.timestamp());
  OAuth.setParameter(message, 'oauth_nonce', OAuth.nonce(6));
  OAuth.setParameter(message, 'xoauth_requestor_id', '18200614986198926446');

  OAuth.SignatureMethod.sign(message, accessor);

  var url = OAuth.addToURL(action, message.parameters);

  var response = UrlFetchApp.fetch(url, {method: message.method });
  if (response.getResponseCode() == 200) {
    var res = JSON.parse(response.getContentText());
    Browser.msgBox(res.entry.displayName);
  }
}
今回は Query String で試しましたが Authorization Header でも大丈夫なはず。

ということで Google Apps Script から 2Legged OAuth できちゃいました。

3arrows アップデート! お気に入り機能とダイジェストメール機能を追加しました。

2 月 25 日 (金)、企業やチーム向けのプライベートマイクロブログ、3arrows をアップデートしました。アップデートの主な内容は次の通りです。

お気に入り機能の追加

マイクロブログの各ステータスをお気に入りに追加できるようになりました。

各ステータスの返信、削除と並ぶ 「お気に入り」 メニューをクリックすると、そのステータスをお気に入りに追加できます。また、自分以外のユーザーがステータスをお気に入りに追加した場合、ステータスの下部にお気に入りの合計人数を表示するようになりました。


なお、追加したお気に入りは上部メニューの 「お気に入り」 から一覧できます。


ダイジェストメール機能の追加

1 日 1 回、マイクロブログ上のコミュニケーションのダイジェストを、メールで配信するようになりました。今後、みなさまのご利用状況を踏まえ、オプション化等も検討していきます。


不具合の修正

マイクロブログの返信機能の不具合や Picasa Web Albums の https への対応等、いくつかの改修を実施しました。

全てのアプリケーションの更新をお願いします!

管理者の方は、コントロールパネルのアプリケーションタブから、全てのアプリケーションを更新してください。「更新する」 リンクをクリックすると、アプリケーションを更新できます。「最新」 と表示されれば更新の完了です。


3arrows では、引き続き α テストのユーザーを募集しています。サインアップの手続きはとても簡単です。数分ですぐに利用を始めることができます。企業や個人等、利用条件に制限はありませんので、この機会にぜひお試しください。

2011-02-27

Firefox の location.hash は自動デコードにも関わらず、制御コードはデコードしないとか知ってました?

こんばんは。なかじまんです。

Firefox の location.hash は、他のブラウザと異なり、URI デコードした結果を表すのは、よく知られていると思いますが、なんど制御コードに限ってデコードしない例外があるようです。試しているのは Firefox 3.6 です。

例えば、改行入りのテキストを location.hash で状態を保持しようとすると、改行コードは CR/LF にデコードされず、%0D%0A のままとなってしまいます。なんじゃこれ。何か勘違いしているのかなぁ。

試しに ASCII コードをぜんぶ試してみたところ、
for (var i = 0x0; i <= 0x7f; i++) {
  var hex = Number(i).toString(16);
  var ch = String.fromCharCode(i);
  location.href = '#' + encodeURIComponent(ch);
  console.log('0x' + hex + ': ' + location.hash);
}
制御コードは、デコードされないことを知りました。HTML や DOM の仕様にそぐわないからだろうか。それとも、脆弱性に関するものだろうか。
0x0: #%00
0x1: #%01
0x2: #%02
0x3: #%03
0x4: #%04
0x5: #%05
0x6: #%06
0x7: #%07
0x8: #%08
0x9: #%09
0xa: #%0A
0xb: #%0B
0xc: #%0C
0xd: #%0D
0xe: #%0E
0xf: #%0F
0x10: #%10
0x11: #%11
0x12: #%12
0x13: #%13
0x14: #%14
0x15: #%15
0x16: #%16
0x17: #%17
0x18: #%18
0x19: #%19
0x1a: #%1A
0x1b: #%1B
0x1c: #%1C
0x1d: #%1D
0x1e: #%1E
0x1f: #%1F
0x20: #
0x21: #!
0x22: #"
0x23: ##
0x24: #$
0x25: #%
0x26: #&
0x27: #'
0x28: #(
0x29: #)
0x2a: #*
0x2b: #+
0x2c: #,
0x2d: #-
0x2e: #.
0x2f: #/
0x30: #0
0x31: #1
0x32: #2
0x33: #3
0x34: #4
0x35: #5
0x36: #6
0x37: #7
0x38: #8
0x39: #9
0x3a: #:
0x3b: #;
0x3c: #<
0x3d: #=
0x3e: #>
0x3f: #?
0x40: #@
0x41: #A
0x42: #B
0x43: #C
0x44: #D
0x45: #E
0x46: #F
0x47: #G
0x48: #H
0x49: #I
0x4a: #J
0x4b: #K
0x4c: #L
0x4d: #M
0x4e: #N
0x4f: #O
0x50: #P
0x51: #Q
0x52: #R
0x53: #S
0x54: #T
0x55: #U
0x56: #V
0x57: #W
0x58: #X
0x59: #Y
0x5a: #Z
0x5b: #[
0x5c: #\
0x5d: #]
0x5e: #^
0x5f: #_
0x60: #`
0x61: #a
0x62: #b
0x63: #c
0x64: #d
0x65: #e
0x66: #f
0x67: #g
0x68: #h
0x69: #i
0x6a: #j
0x6b: #k
0x6c: #l
0x6d: #m
0x6e: #n
0x6f: #o
0x70: #p
0x71: #q
0x72: #r
0x73: #s
0x74: #t
0x75: #u
0x76: #v
0x77: #w
0x78: #x
0x79: #y
0x7a: #z
0x7b: #{
0x7c: #|
0x7d: #}
0x7e: #~
0x7f: #%7F
ただ、今日のウェブアプリの作り方からすると、タブや改行コードも含めて状態を保持して欲しいところでもあり、次のように location.href から hash を取り出せば解決しそうな気がするのですが、このようなアプローチをとっている解説が見つからないのはなぜだろう?
window.onhashchange = function() {
  var hash = firefox
    ? (location.href.split('#')[1] || '')
    : location.hash;  
}
参考にした情報などどなど。ただ、Firefox の仕様はどうなっているのかは分かりませんでした。

2011-02-25

3arrows アップデート! カレンダーを利用できるようになりました。

2月16日(水)、企業やチーム向けのプライベートマイクロブログ、3arrows をアップデートしました。アップデートの主な内容は次の通りです。

カレンダーの追加

新しい標準アプリケーションとして、カレンダーを追加しました。

カレンダーの表示画面では、自分のカレンダーの他、フォローしている他のユーザーのカレンダーもまとめて閲覧することができます。


個々のスケジュールの表示画面では、スケジュールの詳細情報を閲覧することができます。スケジュールの詳細情報にはマイクロブログと連携するハッシュタグや、@ 記法によりユーザーへのリンクを含めることもできます。また、スケジュールにはコメントを付けることもできますので、この機能により会議の参加者をコメントで募ったり、会議の議事録をコメントで付けることもできます。(日報のアプリケーションでも同様にハッシュタグや @ 記法を利用することができます。)


また、既に Google カレンダーを利用されている場合には、Google カレンダーをインポートすることもできます。(最大 5 つのカレンダーまで)


次の画像は 「IT 勉強会」 の Google カレンダーをインポートした例です。


なお、日報のアプリケーションと同様に、カレンダーにおけるスケジュールの作成やスケジュールへのコメント等は、全てマイクロブログに通知されます。そのため、ユーザーはマイクロブログを通じてスケジュールを確認したり、また、マイクロブログを起点として、スケジュールについてのコミュニケーションを取ることができるようになっています。

メニューの整理

アプリケーションの右上のメニューを整理しました。今後もタスク管理やファイル共有等のアプリケーション、マイクロブログの検索機能等の追加を見込んでいますので、段階的にメニューの整理を続けていきます。


全てのアプリケーションの更新をお願いします!

管理者の方は、コントロールパネルのアプリケーションタブから、全てのアプリケーションを更新してください。「更新する」 リンクをクリックすると、アプリケーションを更新できます。「最新」 と表示されれば更新の完了です。


3arrows では、引き続き α テストのユーザーを募集しています。サインアップの手続きはとても簡単です。数分ですぐに利用を始めることができます。企業や個人等、利用条件に制限はありませんので、この機会にぜひお試しください。

2011-02-21

Amazon S3 でウェブサイトがホストできるようになったので移転してみた

こんにちは。なかじまんです。

ずっととある VPS を利用していて、料金がもったいないなぁと思いつつも、過去に作ったコンテンツを破棄するのもなんだしなーと放置していたウェブサイトがあったのですが、なんと Amazon S3 でウェブサイトがホストできるようになったので、さっそく移転してみました。

移転元のサイト

Postal Search APIs & Solutions
http://developmentor.lrlab.to/postal/

移転で捨てたこと

Perl5 による CGI がいくつかあったのですが、この機会に削除しました。また、Apache 固有の .ht ファイルも削除しました(もちろん不可視であるべきファイルも削除しました)。ので、正しく表示されないページやデッドリンクがありますが、そこはご愛敬で。

バケットの作成と設定

developmentor.lrlab.to という新バケットを作りました。バケット名は CNAME と同じにしないとダメです。ここは今までと同じ。

バケットの設定

AWS Management Console からバケットのプロパティを開くと、Website タブが追加されています。ここで Enable のチェックを ON する。そんで Index Document: index.html、Error Document: 404.html とした。

Index Document には / や /foo/ や /foo/bar/ のときに表示するファイルを指定する。今までは XML が表示されてしまったが、これでウェブサイトっぽくなる。ちなみに /foo/bar など末尾の / を省略したとき bar がフォルダのときは、302 でリダイレクトするあたりもウェブサイトと同じ。

Error Document には、HTTP ステータスコードが 4xx のときに表示するファイルを指定する。指定したファイルはルートに置いておけばよい。Amazon S3 の仕様上は、400, 403, 404 が起こりうるが、ファイルは1つしか指定できない。ちょっと Amazon の手抜きっぽい気はするが、実質は 404 Not Found を表すファイルを追いておけば不自由ない。

ファイルのアップロード

移転元のサイトのファイルをアップロードしました。ここも今までと同じ。

移転先のサイト

Amazon S3 のエンドポイントは、今までと同じ↓と思いきや、これが違うのです。このエンドポイントは、いわゆる S3 として振る舞うもので、Website とは関係ないようです。

http://developmentor.lrlab.to.s3.amazonaws.com/postal/

構成上、そりゃそうかとも思えるし、いっしょにしてよとも思えるし。それで WebSite のエンドポイントは、特別に用意されたものがあり↓、今までと異なりました。しかも、選択した地域によって URL が違います。ありゃりゃ。

http://developmentor.lrlab.to.s3-website-us-east-1.amazonaws.com/postal/

DNS の設定
CNAME developmentor.lrlab.to
    developmentor.lrlab.to.s3-website-us-east-1.amazonaws.com
とすれば、おけ。

さようなら VPS

というわけで、次の更新のときには VPS を解約します。元々のアクセスはそれなりにありますが Amazon S3 の単価のほうが安いでしょう。また、気持ち的に管理主体が、自分から Amazon に移った気持ちになれるので、そこが気楽でいいかな。どうがんばったって第三者が悪さできることもないしね。

ちょう適当メモですが、参考になれば幸いです。

3arrows アップデート! 多数のご要望を受けて、マイクロブログをキーワード検索できるようにしました! ブラウザの検索バーにも対応してます!

2月18日(金)、会社やチーム向けプライベートマイクロブログ 3arrows をアップデートしました。

マイクロブログのキーワード検索

ユーザーからの多数のご要望を受けて、マイクロブログをキーワード検索できるようにしました。

アプリの検索ボックスから検索

マイクロブログと各アプリの右上メニューに、検索ボックスを配置しました。キーワードを入力して、検索ボタンをクリックすると、マイクロブログを検索できます。



任意のキーワードのほか、ハッシュタグやユーザーID、文中の URL でも検索できます。
  • キーワード
  • #ハッシュタグ
  • @ユーザーID
  • http(s):// ...

なお、2月18日(金)からの投稿が検索対象になります。

ブラウザの検索バーから検索

Firefox 3、IE8、IE7 の検索バーから 3arrows のマイクロブログを直接検索できます。



アプリケーションのアップデートをお願いします。

管理者の方は、コントロールパネルのアプリケーションタブにアクセスして、各アプリケーションを更新してください。「更新する」リンクをクリックすると、アプリケーションを更新できます。「最新」と表示されれば、アップデートの完了です。



3arrows では αユーザーを募集しています。

3arrows では、αユーザーを募集しています。サインアップの手続きはとても簡単です。数分ですぐに利用を開始できます。会社や個人など利用条件に制限はありませんので、この機会にぜひご利用ください。

2011-02-14

3arrows アップデート! ご登録のメールアドレスからメールを送信してマイクロブログに投稿できるようになりました!

2月11日(金)、会社やチーム向けプライベートマイクロブログ 3arrows をアップデートしました。アップデートの主な内容は、次のとおりです。

メールからマイクロブログへの投稿

ご登録のメールアドレスから、メールを送信してマイクロブログに投稿できるようになりました。

次の例では、Google AdWords から 10,000 円分の無料クーポンが届いたので、そのメールをマイクロブログに投稿して、何か広告を出すかメンバーに聞いています。



投稿先のメールアドレスは、マイクロブログの右上メニューのツールから入手できます。



マイクロブログのリアルタイム性の向上

ブラウザでマイクロブログを開いている間、新着の投稿があれば、順々と表示するようになりました。もう更新の操作は必要ありません。

プラットフォームの性能向上

各アプリケーション (OpenSocial AppData) のデータ格納方法を見直して効率化することで、さらにパフォーマンスが向上しました。

アプリケーションの改善

日報アプリのいくつかの不具合を修正しました。

マイクロブログ、日報アプリのアップデートをお願いします。

管理者の方は、コントロールパネルのアプリケーションタブにアクセスして、各アプリケーションを更新してください。「更新する」リンクをクリックすると、アプリケーションを更新できます。「最新」と表示されれば、アップデートの完了です。



3arrows では、αユーザーを募集しています。サインアップの手続きはとても簡単です。数分ですぐに利用を開始できます。会社や個人など利用条件に制限はありませんので、この機会にぜひご利用ください。

2011-02-10

3arrows のマイクロブログと日報アプリを通じて、日報を中心としたコラボレーション、チームの知識や問題意識の共有を促進しよう!

プライベートマイクロブログ 3arrows は、マイクロブログと連携する日報アプリも提供しています。

日報は、上司への報告、チームへの共有という一方通行な関わりになりがちですが、マイクロブログと日報の組み合わせにより、マイクロブログを通じて、日報を中心とした双方向のコラボレーション、知識や問題意識の共有といった様々な効果が期待できます。

マイクロブログと日報アプリの使い方(使われ方)をご紹介します。

日報を登録する

仕事が終わったら、日報アプリを使って、今日の業務内容や連絡事項を入力して、日報を登録します。



日報を共有する

日報を登録すると、日報の概要がマイクロブログに投稿されます。そして、マイクロブログを通じて、メンバーや上司は、日報の登録があったことを知ります。



日報にコメントする

メンバーや上司は、マイクロブログから日報を開き、日報の詳細を確認します。また、必要に応じて、日報にコメントをします。



日報のコメントを確認する

日報にコメントすると、そのコメントもマイクロブログに投稿されます。コメントの返信先は、日報を登録したユーザになります。ですので、マイクロブログへの返信を確認すれば、日報へのコメントをまとめて把握できます。さらにコメントを返すこともできます。



メールで日報を共有する

日報を登録すると、日報を登録したユーザをフォローしているメンバーや上司に対して、日報の内容をメールで通知します。例えば、上司は、報告を必要とするユーザさえフォローしておけば、マイクロブログを使わずとも、メールにより、日報を受け取ることができます。
3arrows - #日報 #2011/02/09 3arrows のテスト、不具合修正
なかじまんソフトウェア の Nobuhiro Nakajima さんからメッセージが届いています。
-- メッセージここから --
下記の不具合を修正しました。
(1) 日報、コメントの投稿の際にタグをエスケープするようにしました。
(2) コメントの表示順を最新日時順にしました。
(3) いくつかの JavaScript エラーを修正しました。
下記の改善をしました。
(1) 定期的にトークンをリフレッシュして、ログインの有効期限の間 API にアクセスできるようにしました。
出社時刻 10:30、退社時刻 18:00、勤務時間 06:30
-- メッセージここまで --
今後とも 3arrows をどうぞよろしくお願いいたします。
--
3arrows
http://www.3arrows.jp/
メッセージを送信したアプリケーション
http://nakajiman.3arrows.jp/a/@dailyreport
過去の日報を確認する

過去に登録した日報は、後からいつでも再確認できます。日報のコメントも確認できますので、情報がバラバラになることもありません。



いかがでしょうか。3arrows によって、さらに日報を活用してみませんか。

3arrows では、αユーザーを募集しています。サインアップの手続きはとても簡単です。数分ですぐに利用を開始できます。会社や個人など利用条件に制限はありませんので、この機会にぜひご利用ください。

2011-02-08

3arrows のマイクロブログで、各メンバーの最新投稿を確認して、出社状況や今日の予定をまとめて把握しよう

プライベートマイクロブログ 3arrows のマイクロブログは、時系列のタイムライン表示に加えて、各メンバーの最新投稿を確認 できます。

朝の 9:00 過ぎに、各メンバーの最新投稿を確認すると、各メンバーの出社状況や、今日の予定がまとめて確認できるでしょう。また、投稿がなければ寝坊や事件に巻き込まれているのかもしれません。

例えば、次のように表示されます。



この会社では、朝イチにラジオ体操をするようです。ミーティングで客先に直行している社員がいます。今日は、仕事が終わったら、社長がご馳走してくれるようです。

※この会社はフィクションであり、実在の人物・団体等とは一切関係がありません。(^_^;)

プライベートマイクロブログ 3arrows では、αユーザーを募集しています。サインアップの手続きはとても簡単です。数分ですぐに利用を開始できます。会社や個人など利用条件に制限はありませんので、この機会にぜひご利用ください。

2011-02-05

3arrows アップデート! ユーザーからの多数のご要望を受けて、オリジナル画像をプロフィールアイコンに設定できるようにしました!

2月4日(金)、会社やチーム向けマイクロブログ 3arrows をアップデートしました。

オリジナル画像によるプロフィールアイコンの設定

ユーザーからの多数のご要望を受けて、オリジナル画像をプロフィールアイコンに設定できるようにしました。マイクロブログの右メニューの設定リンクをクリックすると、プロフィール編集のページが開きます。



続けて、画像をアップロードするリンクをクリックして、オリジナル画像をアップロードしてください。オリジナル画像は自動リサイズしますが、あらかじめ 48x48 サイズのものをアップロードすることをお勧めします。



なお、3arrows は 管理者があらゆることをコントロールできること を原則に掲げて取り組んでいます。この原則に変わりはなく、管理者の方は、今までどおり、コントロールパネル上で各メンバーのプロフィールアイコンを上書き変更できます。

また、アップロードした画像は、同じ会社やチームのメンバーしか閲覧できないように制限しています。

マイクロブログのサムネイル表示

マイクロブログのサムネイル表示対象を拡大しました。 赤字 が追加分です。



ドキュメント: PDF, Word, Excel, Power Point, Cacoo, SlideShare, JPEG, GIF, PNG
動画: Ustream, YouTube, Vimeo
写真: Flickr, Picasa, 壁紙.com, フォト蔵, TwitPic, Yfrog
地図: Google Maps
ニュース: Teckwave, Web 担当者 Forum, CNET Japan, ITpro
レビュー: DIME, ブクログ, coneco.net, MonoColle
コラム: ダイヤモンド・オンライン
グルメ: ホットペッパー, ぐるなび, 食べログ
クーポン: ポンパレード, グルーポン, Piku
ファッション: ママ・マーケット, BUYMA, ホットペッパービューティー, ZOZOTOWN
通販: アイテムポスト, カラメル
自動車: グーネット, グーワールド, グーバイク
Q & A: 教えて! goo
ブログ: goo ブログ, Blogger
結婚: ウエディングパーク
コミュニティ: cooboo
エンタメ: 講談社コミックプラス

3arrows は αテストのユーザーを募集しています。サインアップの手続きはとても簡単です。数分ですぐに利用を開始できます。会社や個人など利用条件に制限はありませんので、この機会にぜひご利用ください。

2011-02-04

Twitter 上の情報収集、チーム内共有、発信までのワークフローを支援するツイートインアプリをアップデートしました!

2月2日、マイクロブログ 3arrows の「ツイートイン」アプリをアップデートしました。

「ツイートイン」アプリは、ソーシャルメディア Twitter からの情報収集、チーム内共有、発信までのワークフローを支援することを目的としたアプリケーションです。



アプリケーションの特徴や使い方、導入方法は、ソーシャルメディアの情報収集、チーム内共有、発信までのワークフローを支援するツイートインアプリのご紹介 をご覧ください。

アップデートの内容は、次のとおりです。

ウォッチ対象の並び替え

マウスのドラッグ&ドロップで、ウォッチ対象を並び替えできるようにしました。



重複ハッシュタグの除去

ハッシュタグが重複しないようになりました。ツイートをマイクロブログで共有するとき、ウォッチ条件をハッシュタグとして付与していましたが、すでにツイートにハッシュタグが含まれるときは、付与しないようにしました。

アプリ名ハッシュタグの追加

ツイートをマイクロブログで共有するとき、「#ツイートイン」ハッシュタグを付与するようにしました。

3arrows は αテストのユーザーを募集しています。サインアップの手続きはとても簡単です。数分ですぐに利用を開始できます。会社や個人など利用条件に制限はありませんので、この機会にぜひご利用ください。もちろん、α版の期間中は無料でご利用いただけます。

2011-01-29

ソーシャルメディアの情報収集、チーム内共有、発信までのワークフローを支援するツイートインアプリのご紹介

会社やチーム向けマイクロブログ 3arrows の可能性を証明する活動として、3arrows チーム内では、さまざまなアプリケーションの開発を試みています。

今回はその成果のひとつである「ツイートイン」アプリを紹介します。「ツイートイン」アプリは、ソーシャルメディアの情報収集、チーム内共有、発信までのワークフローを支援することを目的としたアプリケーションです。ソーシャルメディアは Twitter を題材としています。

「ツイートイン」アプリは、様々な条件で Twitter 上のツイートをウォッチできます。ダッシュボードスタイルを採用して、ひとつのページ内でまとめて情報収集できます。次の画面イメージは、Twitter 上の自社ブランドに対するツイートをウォッチしている様子を表しています。



自社ブランドに対する質問や苦情、ファン、有益な情報を見つけたときは、そのツイートを引用する形でマイクロブログに投稿して、社内で情報共有できます。そして、続けてマイクロブログで、そのツイートへの対応をディスカッションして、その結果をマイクロブログから直接 Twitter へ発信できます。

さらに、見つけたツイートのユーザやハッシュタグからマイクロブログを検索して、過去の話題を引き出すこともできます。例えば、あるユーザの自社ブランドに対する発言が、ネガティブからポジティブに変わったといった変化を追跡できる可能性が高まります。

「ツイートイン」アプリは、使えば使うほど (マイクロブログに投稿が蓄積されるほど) 効果が高まる仕組みとなっていますので、ぜひ使ってみてください。ご要望がありましたらぜひフィードバックをお願いします。作者としては公式アプリに格上げしたい意気込みです。

詳しく機能と使い方をご紹介します。

ウォッチ対象の追加

ツイートのウォッチ対象は、①ユーザ、②リスト、③キーワードの 3とおりで、フォームから簡単に追加できます。



ウォッチの内容とマイクロブログでの共有

ウォッチ対象は、緑のボックスで表示し、最新 20件のツイートを表示します。また、新しいツイートが見つかると、メッセージでお知らせします。

① タイトルは、ウォッチ対象を表し、クリックすると Twitter の該当ページを開きます。
② ×アイコンをクリックすると、ウォッチ対象を削除します。
③ (後述)
④ 同じ対象をウォッチしているフォロワーをアイコンで表します。
⑤ (後述)
⑥ ユーザのアイコンをクリックすると、Twitter のプロフィールページを開きます。
⑦ 日時をクリックすると、Twitter のツイートページを開きます。



③ 共通リンクをクリックすると、ツイートの URL と内容をマイクロブログに投稿します。このとき、ウォッチ対象をハッシュタグとして加えます。また、ツイートの内容に URL が含まれるときは サムネイル画像を表示 します。



⑤ ユーザ名やハッシュタグをクリックすると、該当ユーザやハッシュタグでマイクロブログを検索します。



ツイートボタンをクリックすると、マイクロブログの投稿内容をそのまま Twitter に投稿できます。



「ツイートイン」アプリは、3arrows の管理者権限があれば、特別な条件なくいつでも導入できます。「ツイートイン」アプリの導入手順は、次のとおりです。

(1) 次のページから tweet-in.xml ファイルをダウンロードしてください。

https://sites.google.com/a/socialprise.jp/3arrows-jp/downloads

(2) 3arrows にログインし、コントロールパネルのアプリケーションタブを選択します。
(3) アプリケーションを追加するボタンをクリックし、テンプレートアプリを作成します。
(4) テンプレートアプリをクリックして、アプリケーションの情報を表示します。
(5) 編集するボタンをクリックして、オンラインエディタを開きます。
(6) tweet-in.xml ファイルの内容をそのまま貼り付けて、保存ボタンをクリックします。
(7) 実行ボタンをクリックすると、「ツイートイン」アプリを実行できます!

導入手順は少し敷居が高くなっています。もしも分からないことがありましたら、お気軽にお問い合わせください。導入をお手伝いします。