Middlemanでgemをvendor/bundleにインストールしたプロジェクトをRubyMine 6.3で開いたらエラーメッセージが出まくってまともに編集できない

こんなメッセージが出まくります。

f:id:yuichi_katahira:20140429145915p:plain

Compass: Failed to run compass on '/Users/my_account/RubymineProjects/slim-test/vendor/bundle/gems/middleman-core-3.3.2/fixtures/sinatra-app/config.rb'

ファイルをちょっと編集するたびにこれが出まくり、しばらくRubyMineから反応が返ってこなくなります。

対処方法を先に書いておくと、vendor/bundleにbundle installしない、RubyMineの古いバージョンを使う、RubyMineではなくほかのもので編集する、あたりです。

で、原因ですが表示メッセージ通りで、Compassがconfig.rbをもとにrunしようとして失敗したのが原因です。
その事自体は正常なことなのですが、問題は、プロジェクトrootだけじゃなくて、vendor/bundle下にある、config.rbも全部探して実行しようとしてしまうというのが原因です。
例えば自分の場合だとちょっと編集するたび59個エラーが出て、反応が返ってこなくなるので、とてもまともには作業できません。

#こういうのに反応してばんばん実行して失敗します
vendor/bundle/gems/middleman-core-3.3.2/fixtures/wildcard-directory-index-app/config.rb

あと、設定でCompassを制御するような項目がないので、対処法としては、vendor/bundleにbundle installするのはやめるしかないのかなと。

すでにfix済みで次バージョンで直るようなので、それまでは待ちましょう。 http://devnet.jetbrains.com/thread/453860?tstart=0 http://youtrack.jetbrains.com/issue/RUBY-15160

Bitbucketでリポジトリの移譲を行ったらwerckerに登録したAWSの設定が消えた

昨日エントリーしたBitbucketにpushすると、werckerが自動でS3にデプロイする のやつですが、werckerに登録した自分のリポジトリを、チーム作ってそっちに移譲したら、werckerのサイトで設定したAWSのキーID,シークレット、バケットURLの設定が消えました。
リポジトリのエンドポイントが変わるし、Bitbucketのリポジトリに追加したwerckerbotアカウントの権限も消えていたので、そりゃそうだという話なのですが。

で、さっそく昨日のエントリを見ながら再設定しました。
作業メモ残しておいてよかった事案。

ちなみにwerckerに作ったAPPは多分一回削除して作りなおさないといけないかと。
APPのSettingsみるとリポジトリのURLは表示だけで変更出来ないようになってました。塗りつぶしてるので見えないでしょうけど・・

f:id:yuichi_katahira:20140428103459p:plain

f:id:yuichi_katahira:20140428103707p:plain

末尾にDelete applicationがあるので、クリックして削除。

f:id:yuichi_katahira:20140428103751p:plain

ちなみにクリックしても画面上何も変わらず消えてないのかなと思いましたが、一旦サインアウトしてサインインしなおしたら消えてました。

Bitbucketのプライベートリポジトリで管理しているJekyllで作った静的サイトを、無料のCIサービスwerckerを使って自動でS3にデプロイする

先日S3に移行した片平堂のサイトですが、Jekyll、Bitbucketのプライベートリポジトリ、CIサービスのwerckerを利用して、リポジトリにpushしたら自動でS3に反映するようにしました。

なお、静的サイトジェネレータはMiddlemanとJekyllで迷ったのですが、非プログラマな方も触るので、規約がMiddlemanとくらべてうるさくないと感じたJekyllにしてみました。
ちなみに自分一人だけならMiddlemanを選ぶかなと思いました。
テンプレートもHamlとかSlimとか色々選べますし、Asset Pipelineも使えますし。
触る方のスキルが上がったらMiddlemanに乗り換えるかもしれません。
後、S3にデプロイするためにjekyll-s3 とかありますが、前述の通り、デプロイ作業をするのが一人ではないので、CIを使ってみました。

手順としては以下のような感じで進めました。

スタート,既存サイトのHTML(VCS未使用,Cyberduckで手動でS3にアップロードしていた)

Jekyll使用に移行

Jekyll使用にしたものをBitBucketに登録

werckerにユーザ登録,Bitbucketの該当リポジトリを登録

Bitbucketにpushしたらwerckerでbuild出来る所まで設定、テストする

werckerのS3へのデプロイ情報を設定

buildしたものをS3にデプロイできる事を確認

既存サイトをJekyllに移行

4ページ程度のサイトで動的な部分もないのでこの作業は簡単でした。

既存サイトのディレクリでGemfileを用意。

# Gemfile
source 'http://rubygems.org'

gem 'jekyll'
gem 'redcarpet'

bundle installします。

% bundle install --path vendor/bundle 

build時に、Gemfile,vendorなどが含まれないように_config.ymlを用意して設定。

# _config.yml
name: 片平堂
markdown: redcarpet
pygments: true
exclude: ["vendor", "Gemfile", "Gemfile.lock"]

一度問題なく生成できるか確認。

% bundle exec jekyll serve --watch

OKだったので、レイアウトを使用するように。

% mkdir _layouts

default.html用意

<!- _layouts/default.html->
<!DOCTYPE html>
<html>
<head lang="jp">
  <meta charset="UTF-8">
  <title>{{page.title}} - {{site.name}}</title>
</head>
<body>
{{content}}
</body>
</html>

各ページにYAML Front Matterを追加、レイアウト使用に合わせて修正

<!- index.html->
---
layout: default
title: ホーム
---
<div>
  some content
</div>.....

フッター部を部品化。

% mkdir _includes

footer.htmlを用意

<!- _includes/footer.html->
<div id="footer">
  (C) 2007 Katahirado.
</div>

default.htmlにフッターの読み込みを追加

<!- _layouts/default.html->
<!DOCTYPE html>
<html>
<head lang="jp">
  <meta charset="UTF-8">
  <title>{{page.title}} - {{site.name}}</title>
</head>
<body>
{{content}}
{% include footer.html %}
</body>
</html>

Bitbucketに登録

Gitのプライベートリポジトリを無料で使いたかったのでBitbucketにしました。
Bitbucketにユーザ登録してなかったら登録して、サイト用のプライベートリボジトリを作成します。
ssh公開鍵などよしなに。
後はJekyllに移行したサイトディレクトリでいつものように*1

% git init
% git add .
% git commit -m 'initial commit'
% git remote add origin git@bitbucket.org:bitbucket_account/bitbucket_repository.git
% git push -u origin master

SourceTreeを使うのもよいかと。

wercker

参考

f:id:yuichi_katahira:20140427002207p:plain

REGISTER WITH GITHUBを選択。
githubアカウントで登録してみました。

f:id:yuichi_katahira:20140427002641p:plain

スクリーンショット撮り忘れました。
後はアカウント名とメールアドレスを入れてフィニッシュするだけなのでよしなにしてください。

Bitbucketの該当リポジトリを登録

Add an applicationをクリック

f:id:yuichi_katahira:20140427003741p:plain

use Bitbucketをクリック

f:id:yuichi_katahira:20140427003937p:plain

該当リポジトリを選択して、Use selected repoをクリック

f:id:yuichi_katahira:20140427004141p:plain

Bitbucketにpushしたらwerckerでbuild出来る所まで設定、テストする

Add werckerbotをクリック

f:id:yuichi_katahira:20140427004511p:plain

Bitbucketのリポジトリのアクセス管理画面が開くので、先ほどの説明文通り、werckerbotアカウントを書き込み可能な権限で追加します。

f:id:yuichi_katahira:20140427004658p:plain

werckerに戻ってNextをクリック

f:id:yuichi_katahira:20140427004511p:plain

wercker.ymlを作成せよといってますが後で作りますので、Nextをクリック。

f:id:yuichi_katahira:20140427005050p:plain

ちなみにすでにwercker.ymlをこの時点ですでに作成してリポジトリにアップしている場合、こんな感じになります。

f:id:yuichi_katahira:20140428104113p:plain

Create applicationをクリック

f:id:yuichi_katahira:20140427010201p:plain

追加がとりあえず完了。

f:id:yuichi_katahira:20140427010411p:plain

ローカルでwercker.ymlを作成します。
bundle installしてjekyll buildして_siteを作成するという内容です。

# our build should run within a Ruby box
box: wercker/ruby
build:
  steps:
    # Run a smart version of bundle install
    # which improves build execution time of
    # future builds
    - bundle-install

    # A custom script step
    # that actually builds the jekyll site
    - script:
        name: generate site
        code: bundle exec jekyll build --trace

wercker.ymlがbuildされないようにexcludeに追加します。

name: 片平堂
markdown: redcarpet
pygments: true
exclude: ["vendor", "Gemfile", "Gemfile.lock","wercker.yml"]

Bitbucketにpushしたら、werckerでbuild出来るか実際にpushしてみます。

% git add wercker.yml
% git commit -m 'add wercker.yml'
% git push origin master

成功しました。

f:id:yuichi_katahira:20140427012030p:plain

f:id:yuichi_katahira:20140427011123p:plain

werckerのS3へのデプロイ情報を設定

SettingsのDeploy targetsでAdd deploy targetのCustom deployを選択します。

f:id:yuichi_katahira:20140427012637p:plain

Deployのターゲットネームとレポジトリを設定。

f:id:yuichi_katahira:20140427012956p:plain

AWS のアクセスキーID,シークレットアクセスキー,bucketのURLを設定していきます。
なお、AWSのシークレットアクセスキーについてはこちらの記事の件にも留意。
Add new variableをクリック

f:id:yuichi_katahira:20140427013019p:plain

キーID用の変数名と実際の値を設定します。

f:id:yuichi_katahira:20140427013250p:plain

続いてシークレット

f:id:yuichi_katahira:20140427013733p:plain

バケットのURL

f:id:yuichi_katahira:20140427013821p:plain

こんな感じになります。

f:id:yuichi_katahira:20140427013906p:plain

wercker.ymlにs3デプロイの設定を追加します。

# our build should run within a Ruby box
box: wercker/ruby
build:
  steps:
    # Run a smart version of bundle install
    # which improves build execution time of
    # future builds
    - bundle-install

    # A custom script step
    # that actually builds the jekyll site
    - script:
        name: generate site
        code: bundle exec jekyll build --trace
deploy:
  steps:
    - s3sync:
        key_id: $KEY
        key_secret: $SECRET
        bucket_url: $URL
        source_dir: _site/

buildしたものをS3にデプロイできる事を確認

% git add wercker.yml
% git commit -m 'Add deployment section'
% git push origin master

Build OK.

f:id:yuichi_katahira:20140427011252p:plain

S3へのDeploy OK.

f:id:yuichi_katahira:20140427014441p:plain

f:id:yuichi_katahira:20140427014653p:plain

感想、その他

自動化するために、自前で用意するものが減って大変便利。
werckerがいつまで無料なのかわかりませんが、無料でここまで出来てありがたい限り。
Middlemanでも同様な感じで設定出来ます。
以上。

*1:実際にはJekyllのレイアウト化の前にローカルのgit使用でバージョン管理していたのですが、話を簡略化

Google フォームから入力された内容をメール送信する

前に Google ドキュメントで作成したWEBフォームに問い合わせがあったら、内容をメール送信する機能を追加する という記事を書いたのですが、 2014年4月25日現在、Google フォームを作成すると、フォームとその回答用のスプレッドシートが別に作成されるように変わっていました。
過去記事ではスプレッドシートにトリガーを追加していましたが、フォームにトリガーを追加するほうがスクリプトがシンプルになって良さそうでしたので、やり方をメモ。

で、すでに親切丁寧な記事を書いていらした方がいたので、そちらを参照にすると良いかと思います。
http://jmatsuzaki.com/archives/11545

それだけではアレなので、自分のスクリプトも晒しておきます。
自分の使い道は、フォームから入力された内容を自分宛てに送信するという用途なので、ccやbccを使わないシンプルな内容です。
入力項目を全部表示させるだけなら、カラムの名前に依存しなくていいので、過去記事のスクリプトより短くなっています。

function sendForm(e){
  // 件名、本文
  var subject = "[片平堂HPからの問い合わせ]"; 
  var body = "問い合わせ内容\n------------------------------------------------------------";  
  // メール送信先
  var to    = "xxxxx@xxxx.xx";

  var itemResponses = e.response.getItemResponses();
  for (var i = 0; i < itemResponses.length; i++) {
    var itemResponse = itemResponses[i];
    body += '\n\n['+itemResponse.getItem().getTitle()+']\n\n';
    body += itemResponse.getResponse();
  }
  MailApp.sendEmail({to:to,subject:subject, body:body});   
}

他、トリガー追加時に起動失敗の通知を追加しています。

通知をクリック。

f:id:yuichi_katahira:20140425010626p:plain

通知タイミングはimmediatelyにしました。

f:id:yuichi_katahira:20140425010805p:plain

エラーはこんな感じで届きます。

f:id:yuichi_katahira:20140425110654p:plain

送信されるメールは以下の様な感じになります。 お名前、メールアドレス、内容という項目でフォームを作成した場合です。

f:id:yuichi_katahira:20120725155111p:plain

2014/4/25追記: Google Appsでフォームを作成して全体に公開する場合は、フォーム設定の下記のチェックを外しましょう。

f:id:yuichi_katahira:20140425103537p:plain

RubyMineやWebStormで勝手に行末尾の空白を消されないようにする

RubyMineやWebStormで、README.md等のMarkdown記法のスペース2個を消されてしまわないようにする設定のメモ。
RubyMineやWebStormはあまりカスタマイズしないで使っていて、バージョン上げても設定を引き継がないようにしているので、バージョン上げるたびにどこで設定するのか忘れてしまっているので記録。

Settings > Editor と開いて Other の項目にある Strip trailing spaces on Save を None に設定する。

Rails 4.0.4 から 4.1.0 に Update

こんな感じに作業。

https://github.com/katahirado/kkfoodstuff/commit/7aca5b2986e26e88a78d7d58bc041ed97cba5e9e
https://github.com/katahirado/kkfoodstuff/commit/a0c49840145587336b52cb2d56ba71f1dda1e84c

Warning: you should require 'minitest/autorun' instead. Warning: or add 'gem "minitest"' before 'require "minitest/autorun"'

shoulda-matchersを2.5から2.6に

 gem "shoulda-matchers", "~> 2.6.0"

参考

VPSからAmazon S3とGoogle Apps for Businessに移行しました

さくらのVPSで運用していたkatahirado.jp(VALUE DOMAINで取得)を、WebサイトはAmazon S3に、メールはGoogle Apps for Businessにそれぞれ移行しました。
Webサイト、メールサーバの他に、redmine、git、Railsのデモアプリが動いていましたが、 git,redminegithubやPivotal Tracker等を使用することにして、既存のデータはとりあえずローカル(MBP)に。
Railsアプリのデモは動かすならHerokuかなと思っていますが、一旦保留としました。
S3とRoute 53,Google Appsでの作業をメモ。

Amazon S3

katahirado.jpはルートドメインでの静的なWebサイトなので、Amazon Route 53を使ってホストする必要がありました。
Amazon S3でのWebサイトですが、基本こちらの通りで。

www.katahirado.jpと、karahido.jpのバケットを作成しました。
なのですが、バケットポリシーを追加する時に、AWS Sample Bucket PolicyのWebページが丁度なくなっていたので、AWS Policy Generatorを利用してバケットポリシーを作成しました。*1

f:id:yuichi_katahira:20140418102545p:plain

Sample Bucket Policiesをクリックするとページがなくなってました。

f:id:yuichi_katahira:20140418102738p:plain

AWS Policy Generatorをクリック。

f:id:yuichi_katahira:20140418102545p:plain

Select Type of PolicyをS3 Bucket Policyにして、Principalを*に。

f:id:yuichi_katahira:20140418103603p:plain

ActionsでGetObjectにチェック。

f:id:yuichi_katahira:20140418103644p:plain

Amazon Resource Name (ARN)のところはご丁寧に formatが乗っているので、それに合わせて入力しました。

arn:aws:s3:::<bucket_name>/<key_name>

arn:aws:s3:::www.katahirado.jp/*

f:id:yuichi_katahira:20140418103750p:plain

Add StatementしてGenerate Policyして表示されたものをコピーして貼り付ければOK

f:id:yuichi_katahira:20140418103848p:plain

f:id:yuichi_katahira:20140418103902p:plain

Amazon Route 53

Amazon Route 53でDNSの設定をします。ここいらを参考に。

Create Hosted Zoneして出来たNS,SOA以外にkatahirado.jpのA,www.katahirado.jpのCNAMEを追加。
MXレコードはGoogle Apps for Businessがまだ処理し終わっていないので、まだ登録しません。
というか出来ません。
VALUE DOMAINの管理コンソールにいってNSのValueをネームサーバとして登録。

なお、メール等のダウンタイムを極力なくすという意味ではAmazon Route 53→Google Apps for Business→S3とかの流れの方が良かった気がします。
ちなみにGoogle Apps for Businessでの処理で若干手間取って、30分ぐらいメールサーバー的にアレになってたかと。

Google Apps for Business

次、Google Apps for Businessを独自ドメインで設定。
以下が大変丁寧。

Google Apps for Businessのドメイン所有権の確認、MXレコード登録の流れで、Google AppsAmazonを行ったり来たりして若干混乱したので流れを整理。

Google Apps for Businessの無料トライアル申し込み

ドメイン所有権の確認(Google Apps for Business)

Google Appsの管理コンソールからTXTレコードに設定する値を取得する

Amazon Route53のコンソールで取得したTXTレコードを登録

ドメインの所有権確認終了(Google Apps for Business)

Google Appsの管理コンソールからMXレコードに設定する値を取得する
http://angelndxp.wordpress.com/2012/05/27/amazon-route53%E3%82%92google-apps%E3%81%AEdns%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%A8%E3%81%97%E3%81%A6%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B-%EF%BD%9E%E7%8B%AC%E8%87%AA%E3%83%89%E3%83%A1%E3%82%A4/

Amazon Route53のコンソールでMXレコードの設定を行う
http://angelndxp.wordpress.com/2012/05/28/amazon-route53%E3%82%92google-apps%E3%81%AEdns%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%A8%E3%81%97%E3%81%A6%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B-%EF%BD%9E%E3%83%A1%E3%83%BC%E3%83%AB%E8%BB%A2%E9%80%81/

MXレコードの設定反映完了(Google Apps for Business)

感想

若干手間取りましたが、がっちりサーバを構築するのに比べるとだいぶお手軽。
クラウドもずいぶん環境整ったなとしみじみ。
サーバ運用を自宅サーバVPSで長いこと続けてきましたが、もうクラウドでいいですね。
追記: 料金はさくらのVPSが年間一括払いだったので、月924円(4/18現在)。
Google Apps for Businessが年払いで一人利用なので、月500円、AWSは運用してみないとわかりませんが、Route 53は1ゾーンで、S3も大したアクセスでもないので両方で多分200円以内、合わせてもVPSより安くなるかなと想定しています。

*1:一時的な問題だったようで作業翌日には復活していました