kaakaa Blog

この世は極楽 空にはとんぼ

起動中のEC2インスタンスにリダイレクトするアプリ書

Node.js使ってEC2の起動中のインスタンスにリダイレクトするWebアプリ書いてみた。
Herokuに立てておけば、起動するたびに変わるPublic IPアドレスも気にならない。

kaakaa/aws-front

使い方は上記GithubリポジトリのHerokuボタンからデプロイページへ行き、AWSaccess_keyあたりを入力するだけ。
(Herokuのevn入力時にrequireの指定とかって出来るのかな)

AWS_FRONT_TAGSの所に key=value 形式でEC2インスタンスのタグを指定したフィルタリングできる。


もちろんAWSには静的IPをEC2インスタンスに割り当てるElastic IPあるので、普通はコッチを使う。
Elastic IP アドレス(EIP) - Amazon Elastic Compute Cloud

今回は書き辺りを目的として、自分で作ってみたりした。

  • Heroku Buttonの素振り
  • HerokuでNodeアプリを動かしてみる
  • lodashを触ってみる

Heroku Buttonのデプロイページでenvをrequiredで無くする設定は普通にあった。
app.json env values required by default | Heroku Dev Center

node-webkit-builderを実行できない

備忘。

mllrsohn/node-webkit-builder をnpm installして実行しようとするとエラーとなる。

env: node\r: No such file or directory

これは既知の問題のようで、GithubのIssuesではvimのコマンドで解決する方法が紹介されていた。

env: node\r: No such file or directory

    • -

ただ、viのコマンドをコマンドラインで実行できるか分からなかったので、.travis.ymlでは下記を参考に sed コマンドで改行コードを変換する処理を事前にやっておくことでとりあえず解決したようだ。

linux - How to convert DOS/Windows newline to Unix newline in bash script? - Stack Overflow

sed $'s/\r$//'     # DOS to Unix

sed コマンドで元のファイルに上書き保存する方法は下記を参考に。

sedコマンドでファイルを上書き編集 | OpenGroove

      • -

.travis.ymlのafter_successはこんな感じになった。

after_success:
- npm install -g bower
- npm install
- sed -i -e $'s/\r$//' node_modules/node-webkit-builder/bin/nwbuild
- "./build.sh"

Heroku Buttonを試すためにアンケートアプリを作ってみた

Githubに公開してあるソースをボタンひとつでHerokuにデプロイ出来る Heroku Button を試すために、アンケートアプリを作りました。
ので、作成過程の備忘録。

kaakaa/Enquete

動作してるもの
enquete

Heroku Buttonの設置はREADMEにボタンを書いて、app.jsonを用意するだけなのでとてもお手軽。
app.jsonには使用するアドオンなんかも指定できるので、DB使ったアプリとかも問題なしですね。

Heroku Buttonはリファラを見てアクセス元のリポジトリからコードを取得しているようなので、Github上でブランチ生やして、そのブランチ上でHeroku Buttonをクリックすればブランチ上のコードからアプリをデプロイできる。
そこら辺上手く使えると便利そう。

アンケートアプリ自体は、ちゃんと作り込んだ訳ではないので怪しい部分は多々あり。
アンケート作成画面のライブプレビューがちゃんと動かなかったり。。。
Live Preview Error · Issue #18 · kaakaa/Enquete

中身の話

フレームワークSinatra / Haml / ActiveRecord

Markdown形式でアンケートが書けると良いなぁということで、StackOverflowのエディタであるwmdを使用しています。
(現在、wmdはpagedownとして公開されているようです pagedown - A JavaScript Markdown converter and editor - Google Project Hosting

元々wmdにform要素を記述する機能は無かったようなのですが、Github上でformタグが記述できるように拡張したフォークが存在したのでそれを使用しています。
さらにSinatraから使えるように少し修正を加えました。
kaakaa/wmd

結果の集計画面は Highcharts による円グラフ等を使用しています。
Highchartsは手軽に使えるので良いですね。

備忘録

作ってる内に躓いた点を備忘として残しておきます。

Gradleハンズオンをやりました

社内勉強会の一貫として、Gradleハンズオンを開催してみました。

Gradle入門の位置づけでやりましたが、時間配分がグダグダで最後の方は飛ばし飛ばしやってしまいました。
分かりづらかったなぁ…反省。

サンプルコード

kaakaa/Gradle_Hands-on

共通のタスクをプロジェクト毎の設定値を利用して実行する

昨日の続き。

build.gradle

allprojects {
	configurations {
		svnant
	}
	
	ext {
		dep_repopath = new File("${project.rootDir}/../svn_repo/").canonicalPath
		dep_destpath = 'dep_project'
		depProjects = []
	}
	 
	dependencies {
		svnant fileTree(dir: "${project.rootDir}/lib_svnant", include: '**/*.jar')
	}

	task svnCheckout << {
		ant.taskdef(resource: 'org/tigris/subversion/svnant/svnantlib.xml', classpath: configurations.svnant.asPath)
	
		depProjects.each { def projectName ->
			def checkoutDest = "${project.rootDir}/${dep_destpath}/${projectName}"
			ant.svn(javahl: 'false', svnkit: 'true', failonerror: 'false') {
				ant.checkout(url: "file://${dep_repopath}/${projectName}", destpath: checkoutDest)
				ant.update(dir: checkoutDest)
			}
		}
	}
}

subprojects {
	apply plugin: 'java'
	
	repositories {
		mavenCentral()
	}
	
	dependencies {
	    compile 'org.slf4j:slf4j-api:1.7.5'
	    testCompile 'junit:junit:4.11'
	}
}

project(':App') {
	ext {
		depProjects = ["Stab"]
	}

	dependencies {
	    compile project(':dep_project/Stab')
	}

	compileJava.dependsOn svnCheckout
}

全プロジェクト共通のタスクsvnCheckoutでは、プロパティdepProjectsで指定されたプロジェクトをチェックアウトしてくる。

共通部分では

ext {
	dep_repopath = new File("${project.rootDir}/../svn_repo/").canonicalPath
	dep_destpath = 'dep_project'
	depProjects = []
}

のようにdepProjectsを空リストとして宣言しておき、Appプロジェクトの設定の方で

project(':App') {
	ext {
		depProjects = ["Stab"]
	}

	dependencies {
	    compile project(':dep_project/Stab')
	}

	compileJava.dependsOn svnCheckout
}

depProjectsに設定値を与えてあげると、共通のタスクをプロジェクト固有の設定値で実行することが出来る。

依存プロジェクトをsvnからチェックアウトしてからビルドを

昨日の続き。

Gradleのマルチプロジェクトビルドで、依存プロジェクトをSVNからチェックアウトしてからビルドを実行するサンプル。


kaakaa/GradleMultiprojectSample

とりあえず動いてはいるけど、SVN checkoutが汎用的に作れていない。
Gradleのタスクに引数を与えられれば、各プロジェクト毎に依存しているプロジェクト名を宣言して、SVN checkoutのタスクに渡して処理もできるんだけど…。

ん〜微妙。

GradleからSVNコマンドを実行する

SvnAntを使用した。
Gradle svn-ant Sample

マルチプロジェクトビルドのサンプル

Gradle マルチプロジェクトビルドのサンプルの備忘。

第56章 マルチプロジェクトのビルド

下記のようなプロジェクト構造の時、Appプロジェクトをビルドする。
AppプロジェクトはStabプロジェクトにプロジェクト依存している。

├── App
└── build
    ├── build.gradle 
    ├── dep_project
    │   └── Stab
    └── settings.gradle
マルチプロジェクトの設定

BuildScript/settings.gradle にビルド対象のプロジェクトを記述する。

settings.gradle

includeFlat 'App'
include 'dep_project/Stab'

includeFlat はsettings.gradleが存在するディレクトリと同階層のプロジェクトを指定する。
includeはsettings.gradleが存在するディレクトリ配下のプロジェクトを指定する。

ビルドの設定

BuildScript/build.gradle にビルドの設定を記述する。

build.gradle

subprojects {
    apply plugin: 'java'

    repositories {
        mavenCentral()
    }

    dependencies {
        compile 'org.slf4j:slf4j-api:1.7.5'
        testCompile 'junit:junit:4.11'
    }
}

project(':App') {
    dependencies {
        compile project(':dep_project/Stab')
    }
}

subprojects に囲まれた部分の設定は、settings.gradleで指定された全てのプロジェクトに適用される。
プロジェクト固有の設定は project(':${プロジェクト名}') に記述する。

(この時、subprojectsの依存関係にStabプロジェクトを記述してしまい、ビルド実行時に「StabプロジェクトをビルドするためにStabプロジェクトをビルドしなければならない」という循環参照エラーで怒られるという失態を犯しました…)

プロジェクト依存の設定は下記の用に設定する。

dependencies {
    compile project(':dep_project/Stab')
}
ビルドの実行

build.gradleを普通に実行すると、settings.gradleに記述されたプロジェクト全てのビルドが実行されます。
(ビルドの順番ってどう決まるんだろ?)

gradle -b BuildScript/build.gradle build

ルートディレクトリから実行する場合、-b オプションでgradleスクリプトファイルを指定します。

特定のプロジェクトに対するビルドを実行したい場合は下記のようにします。

gradle -b BuldScript/build.gradle :App:build
:dep_project/Stab:compileJava UP-TO-DATE
:dep_project/Stab:processResources UP-TO-DATE
:dep_project/Stab:classes UP-TO-DATE
:dep_project/Stab:jar UP-TO-DATE
:App:compileJava UP-TO-DATE
:App:processResources UP-TO-DATE
:App:classes UP-TO-DATE
:App:jar UP-TO-DATE
:App:assemble UP-TO-DATE
:App:compileTestJava UP-TO-DATE
:App:processTestResources UP-TO-DATE
:App:testClasses UP-TO-DATE
:App:test UP-TO-DATE
:App:check UP-TO-DATE
:App:build UP-TO-DATE

BUILD SUCCESSFUL

Total time: 6.736 secs

依存しているStabプロジェクトに対するjarタスクも一緒に実行されています。


とりあえず今日はここまで。
GradleでSVNリポジトリから依存プロジェクトをチェックアウトしてからビルド実行が出来るようにすることが目標。
Gradle svn-ant Sample



Gradleはとても便利で高機能なのに日本語の書籍がないのがもったいないですね。
Gradle in Actionの邦訳とか出ないかな。

Gradle in Action

Gradle in Action