2015年1月11日日曜日

昨年の振り返りと、今年の目標

振り返り

2013年1月が最後の振り返りだったので、2年分振り返ります。

できた事

2013年

  • まちクエストとの出会い
    まちクエスト@jishihaに声をかけていただき、少しだけお手伝いさせていただきました。さらに、サービス開発に関する経験させていただいたり、多くの人達との出会う事ができました。
    • Vagrant + ChefSoloで開発環境構築
      最初の課題として、まちクエスト開発メンバー内に、同じ開発環境を利用するための環境を作成しました。数人で開発する現場に触れる事ができとても新鮮でどきどきしました。その時のブログはこちら
    • Rspec + Capybaraでのtest環境の構築
      2番目の課題として、integration testをRspec + Capybaraで書きました。javascript driverはdefaultでSeleniumを使いますが、testで使うには時間がかかりすぎるので一旦中止しました。
      その後、headlessのPolterguistで動作確認したので、次のtestでは、Rspec + Capybara + Polterguistを使います。
    • Ruby on Rails
      まちクエストではRailsを使っています。それまでPerlぐらいしか触った事なかったので、RubyおよびWeb MVC frameworkとしてのRailsを勉強する事にしました。
    • 散歩の習慣化
      ユーザーとして、まちクエストを楽しむようになり、自宅や通勤時の散歩の機会が増えました。まちクエストの楽しみ方として、「クエストを作成する」「クエストを発見する」の2つがありますが、私は主に前者が多いです。私のまちクエストのページはこちら
    • 256interns
      @jishihaの紹介で256internsに参加させてもらいました。256internsは、「スタートアップにインターンして、web開発に必要なプログラムとデザインの学習環境」を提供します。今まで断片的だったweb開発に必要なスキルが、つながりました。

2014年

  • webサービス作成、リリース
    知人・友人と野球のスコアを共有できるBaseballScoreをリリースしました。web開発はもちろん、いかにユーザーにつかってもらうか、サービスプロモーション・UIの試験の場としても使っています。Rails, Bootstrap,Websocket等を使用しています。
  • AngularJS
    会社の同僚に影響で勉強中。次のwebサービスで利用予定。
  • 一人もくもく会を開始
    2014年3月から、早朝の時間を使って1時間程のweb開発時間を確保。MacBookAir + iPhoneテザリングでどこでも開発できる環境ができたので、通勤電車内も利用し、早朝2時間をweb開発に確保できた。
  • 社内有志の勉強会を開始
    社内の技術情報の共有方法から話がすすみ、2014年春頃から、毎月1回、勉強会を開始する事になりました。最初10人から開始して、20人ぐらい参加してくれるようになりました。スピーカーの確保が課題かなと思ってましたが、予想以上にスピーカーへの応募があり、そこはうれしい誤算になってます。
  • 元旦マラソン大会の参加
    2015年元旦マラソンに家族で参加しました。私は4kmに参加し、なんとか完走できました。

できなかった事

  • iPhoneアプリリリース
    2014年にBaseballScoreのiPhoneアプリをリリースしたかったができませんでした。後述。
  • ジョギング
    2014年は継続実施ができませんでした。

2015年の目標

  • iPhoneアプリリリース
    BaseballScoreのUX向上のため、プッシュ通知機能を検討中。Web Viewを利用したnativeアプリにする事で、必要最小限の開発ですすめたいと思います。せっかくなので、Swiftで開発したいと思います。春までにはリリースしたい。
  • 新サービスの作成、リリース
    画像投稿・編集系のサービスを検討中。AngularJSを使って、気持ちのよいUXを実現したい。
  • PaaSの調査
    • Dokkuを触り始めて、deis,flynn等いろいろある事を知ったので、docker利用のPaaSを試していきたいと思います。
  • 一人もくもく会の継続
    上述のアプリ、webサービスの開発を行います。
  • 社内有志の勉強会の継続
    スピーカーの発掘および、参加者の増加を目指します。
  • ジョギングの習慣化
    • 元旦マラソンで完走できたので、今年は、週末のジョギングを継続したいと思います。来年の元旦マラソンは順位も意識します。まずは、30日継続を目指します。
  • コンテストの参加
    まだ漠然とですが、プログラミングスキルの向上を目的に、プログラミングコンテストに参加してみたいなと考えています。今は問題の意味がよく分からない状況からですが。。。

まとめ

体力維持をすすめつつ、新しい事に挑戦していきたいと思います。そして、新たな出会いや気付きが得られたらいいなと思います。
このエントリーをはてなブックマークに追加

2014年7月19日土曜日

野球の試合速報共有サービス「BASEBALL SCORE」を公開しました

BASEBALL SCOREというwebサービスを公開しました。
子供の野球の試合速報を、観戦に来られない家族や知人と共有する事ができます。



開発のきっかけ

子供の試合速報を知り合いにメールしまくる家内をみて


私には息子が二人いて、長男が中2、次男が小5でどちらも野球チームに所属しています。シーズンになると、週末は二人とも大体試合で、家内と分担してそれぞれの応援に行くわけです。
で、互いの試合結果をLINEやメールで送り合うのですが、非常に面倒。しかも家内は、仕事の都合で応援に来れない他の子の母親や、監督・コーチにも同じような試合速報をメールで、せっせと送信している。これでは、試合に全然集中できない。
でも、応援に来れない人達は、試合がとても気になる。。。
こんな、シチュエーションはどこにでもあるはず。すでに、いい感じのサービスが世の中にあるはず。Yahooとかで使える、プロ野球速報の草野球版があるはず。と探すもなかなか見つからない。
携帯電話用でスマホでは使いにくかったり、スコアブックとしての機能が充実しすぎていたりと、なかなかニーズに合うものがない。
って事は作ればいいのでは。。。
ちょうど、Ruby on Rails Tutorialを勉強して、ユーザ管理とtwitterもどきを作れるようになったので、ちょっとしたコンテンツ投稿のサービスに作れるかも。ちょうどいいテーマじないか!って、思った訳です。

開発期間

1週間ぐらいで形になるかと思ったが甘かった。


着手から実際に使える状態になるまで、大体3週間かかりました。
最初、Ruby on Rails Tutorialのサンプルをベースにしようとしましたが、すすめていくうちに、他のライブラリに置き換えたり、不具合対応でライブラリのバージョンアップしたりで、何かと時間がかかりました。
子供達の野球の試合があるのは週末なので、平日の通勤電車の中で機能実装とバグ潰しを行い、週末に自分と家内で実際に使って、操作の不具合を洗い出しと追加機能のアイデア出しを行う。という事を繰り返しました。

開発環境

MacBook AirとRailsとHeroku


MacBook Air
Ruby 2.0.0
Rails 4.0.4
Bootstrap 3
今まで、Rails 3.2を触っていましたが、Ruby on Rails Tutorialを勉強するタイミングで、Rails4.0を触り初めていました。
この影響で、4.1ではなく4.0で開発する事にしました。
Rails4の情報は十分にネットで見つかる状況でした。
特に、stackoverflowRails Castsを見る機会が多かったです。

開発手順

  1. 企画
    「少年野球のスコアを家族。知り合いで共有する」を思いついてから、野球のスコアをつけるアプリをwebサービスを確認しました。アプリは本格的なスコアを付けられるものがほとんどで、「スコアを共有する」目的のものはありませんでした。
    また、米国のアプリ、webサービスも調査しましたが、状況は同じでした。Game Changerというアプリが無料にもかかわらず、高機能でした。
  2. 言語、WAF(Web Application Framework)の選択
    上述の通り、Rails4に挑戦する前提でRails4.0とRuby2.0を選択しました。
  3. サーバ(IaaS,PaaS)の選択
    以前からHerokuを使っていたので、今回もHerokuを選択しました。まずは1 DynoとPostgreSQLが使えればよかったので、無料でいけます。
  4. バージョン管理方法の選択
    gitを選択。
    いつもgithub使ってましたが、今回はProvateRepositoryで管理の必要性がでてきたので、Bitbucketを使う事にしました。
  5. 開発環境
    開発環境は上述の通り。IDEは使わず。
    editorはemacsを使用。
    Sublime Textに完全移行しようと考えたが、どうしても使い慣れたemacsを使ってしまっていた。
    localでは、Railsの標準webサーバ(WEBrick)を使用。
  6. テスト環境
    RSpecでTDD開発を実践!と思って最初の数週間は、「test書いてから実装」をやっていたのですが、ある程度形になってきたら、testを書くのがもどかしくなってきて、直接コードを書くようになってきました。
    ただ、実装やコード修正の際、「testが通ればok」の安心感は一人で開発している時には、とてつもない安心感が得られると感じました。
  7. デザイン
    という程でもないですが、bootstrapを使用。
    今回、初めてbootstrap3を使用したので、bootstrap2との差異を確認しながら、すすめました。
    本サービスは、利用シーンとしてスマホでの利用を想定しているのですが、基本的には、bootstrap3ではdefaultでレスポンシブ対応されているので、そちらで対応しました。
    さらにスマホ表示の最適化させるため、追加で、css微調整を実施しました。
  8. ドメインの取得
    当初、score.comのようなシンプルなドメイン取得を予定していましたが、思いつくものは大体取得されていたり、高額だったりしたので諦めました。
    herokuでは、*.herokuapp.comのようなFQDNは無料で利用可能で、baseballscore.herokuapp.comが利用可能だったので、当面はこれでいくことにしました。
    後述しますが、SNSなどの口コミで広げていくつもりだったので、URLで表現した時に、わかりやすければいいかなと判断しました。
    (ただ、途中でFQDN・ドメインを変更するのは、oauth対応やSNSボタンや各種モニタリング登録の変更が必要になり、いろいろと面倒なので、そこは要注意です。)
  9. アクセス分析
    google analytics設定を設定しました。
    より柔軟にリアルタイム分析も行いたかったので、今回はwoopraを初めて使ってみました。
  10. モニタリング
    以前から使用している無料のcmanを利用。
  11. ロゴ
    今回はロゴを準備しました。
    当初は、supalogoで自分で作成しましたが、試しにココナラで作成依頼しました。
    自分のイメージに合いそうな作成者の方に依頼して3日で2案作成いただきました。うち1案を現在使わせてもらっています。
    ココナラは以前から気になっていて今回ちょうどお願いできる事があったので利用しました。500円という費用を考えるととても満足のいくものを作成いただきました。
  12. リリース、プロモーション
    家内を通じて、子供の野球チームの監督・コーチ・保護者の方々にも利用いただき、「これは便利」の声をいただきました。
    スコアブックを作成するアプリ、webサービスはすでに存在するもののやはり利用には敷居が高く、広く浸透していない事を確認する事ができました。
    逆にいうと、「詳細スコアブックの作成」ではなく、「スコアを介したコミュニケーション」を主にしたアプリ・webサービスはまだ存在していないので、ユーザ獲得のチャンスがありそうです。
    プロモーション手段はグロースハッカーを参考に、facebookを主にしたソーシャル口コミで広げたいと考えています。
    ただし、家内の知り合いのお母様方はfacebook,twitterではなくLINEを利用している方がほとんどなので、LINEでの露出も意識してすすめる必要があります。
    まずは、コンテンツ(スコア)を作成してくれる人の獲得が必須です。コンテンツ作成者が増えれば、その人を中心に閲覧者が集まってきて、そのうちの何人かがコンテンツ作成者になり、さらなる閲覧者を集めてくれるからです。
    次は、グロースハッカーにも書いてあった、小判サメ戦略を試してみたいと思っています。

今後

野球の季節である「夏」に、コンテンツ作成ユーザが10人を目指します。
facebook pageを作成したので、これを使ってユーザ獲得施策を実施します。

参考


ご興味ある方は、BASEBALL SCOREをぜひお試しください!
このエントリーをはてなブックマークに追加

2014年4月12日土曜日

RVMでruby1.9.3 installの際、gcc46を使わない方法

何かの手違いでgcc46を削除したようなので、homebrewで再度gcc46をinstallしようとしたが、途中で止まってすすまない。
再度、rvm install 1.9.3しても、やはりgcc46のところで止まってしまう。

こちらをみて下記を実行したらうまくいった。
rvm install 1.9.3 --with-gcc=clang
このエントリーをはてなブックマークに追加

2013年12月31日火曜日

IT関連コンテスト情報まとめてみた


最近、次男が通う小学校の教頭先生から小学生向けプレゼンコンテストを教えてもらったり、@jishihaから三鷹のU15,U18 rubyコンテストを教えてもらいました。
思った以上にIT系のコンテスト多い、しかも小中学生が参加できるものもある、賞品・賞金もでる。結構、おいしいんじゃないかと。(@jishihaの受け売りだけど)
で、まとめてみました。


まとめてみると、ITコンテストといってもいろいろな種類がある。プログラム、アプリ、サーバ系そして企画・プレゼン系。
中高校生が参加できるものから小学生が参加できるものや、チームで参加のもの。

まだまだ編集中ですが、まずは公開したいと思います。早いうちに、アプリ系のコンテスト情報追加します…

このエントリーをはてなブックマークに追加

2013年12月16日月曜日

vagrant-cloudstackを試してみた

いまいち周りで、vagrant-cloudstackが盛り上がらないなーと思っていた所、所属する会社の若手エンジニアS君に「vagrant-cloudstackってのがあるんだけどさー、IDCFクラウドセルフタイプでうまく動かないんだよね。」と相談したところ「あ、直しました。本家にPullRequest出してます」と即答。数日後無事マージされた事を確認。ただし、本家のvagrant-cloudstackの機能制限のため、vagrant up,destroyぐらいしかできない。vagrant ssh接続もできない。もちろんsshを利用するprovisionも実行できない。。。という状況でした。

そこで同じくS君に「vagrantはprovisionできないと意味ないよね」と相談したところ、数日後「直しました。PullRequest中です。CloudStackはVM作成とは別に、ネットワーク周りの設定(FW、PortForwarding)を追加しないといけないので機能追加しました」との事。
それから待つこと約2週間。やっと本家にマージされたので、vagrant-cloudstackとIaaSとして私が携わっているIDCFクラウドセルフタイプを使って、VM作成およびサーバ構築の自動化までの方法を紹介したいと思います。

今回はIDCFクラウドセルフタイプを使いますが、CloudStackであれば他事業者のものでも、自社や自宅ラックで動かしているCloudStack環境でも、Vagrantfileのパラメータを変更するだけで利用可能なはずです。
それでは始めます。

Vagarntとは

Vagrant(ベイグラント)はVirtualBoxのフロントエンドに相当するツールです。vagrantコマンドなどを使ってコマンドラインから簡単に新しい仮想マシンを削除したり、不要なVMを削除したりできます。 オープンソースとして公開されています。各種ドキュメントは下記で公開されています。
http://www.vagrantup.com/

VagrantはVM作成後のソフトウェア構築の自動化にも対応しており、その場合はshellやChefSolo,Puppet,Ansibleなどのdeploy toolと連携します。今回は、ChefSoloを使用します。
今回はChefおよびChefSoloの説明は割愛しますが、興味のある方は後述の参考情報をご参照ください。 (@naoyaさんの入門Chef Soloから入るのが王道です)

vagrant-cloudstackとは

Vagrantのpluginです。 上述の通り、Vagrantは元々local PCのVirtualBoxのフロントエンドとして開発されたものですが、VMWareにも対応し、その後、pluginをinstallすることで、様々な機能を追加できるようになりました。

そのpluginの中で、外部環境の仮想マシンの起動やprovisionができるようにしたのが、vagrant-aws pluginがあります。
その後、同じように外部環境を使えるpluginが開発されています。 現在、私の方で確認したものは下記の通りです。これらはvagrant plugin installコマンドでinstallできます。(詳細は各ドキュメントをご参照ください)
vagrant-aws
vagrant-openstack
vagrant-rackspace
vagrant-digitalocean
vagrant-cloudstack

上記以外のpluginについては下記をご参照ください。外部環境の仮想マシンを使うもの以外にも、vagrant-omnibus、vagrant-berkshelf、saharaなど様々なpluginが開発されています。
http://www.rubydoc.info/gems/v

2013年12月現在、vagrant-cloudstackの機能は下記の通りです。(changelog抜粋)
0.1.0
* Plugin now enables parallelization by default.
 + This behaviour can be turned off by invoking vagrant with --no-parallel (this flag requires vagrant 1.2.1)
* Added support for starting, stoping and reloading machines.
* Added support for portforwarding and adding ssh keys.
* Added support for basic network type.
 + Basic means that there is no need to specify a network_id to connecto to.
 + Default network type is advanced.

CloudStackとIDCFクラウドセルフタイプ

CloudStackはオープンソースのクラウド基盤管理ソフトウェアで、コンピューティングリソースをプールすることにより、パブリック、プライベート、およびハイブリッドのIaaS(Infrastructure as a Service)クラウドを構築することができます。
同じようなソフトウェアでOpenStackWakame等があります。

私が所属するIDCフロンティアでは、2011年9月よりCloudStackを使用したIaaSサービス IDCFクラウドセルフタイプ(以下、IDCFクラウド)を提供しています。
IDCFクラウドでは、CloudStack APIを利用可能です。
vagrant-cloudstackでは、このCloudStack APIを利用して、CloudStack環境上に仮想マシンを作成します。

環境

今回はローカルPCとして、MacBook Air(MBA)でVagrant環境を用意します。予め、MBAに下記をinstallします。
  • ローカル環境
    • MBA(MacOSX10.9、メモリ8GB、HDD250GB)
  • ソフトウェア
    • VirtualBox 4.3.2
      下記からDL,installします。
      https://www.virtualbox.org/wiki/Downloads
    • Vagrant 1.3.5
      下記からDL,installします。
      http://downloads.vagrantup.com/
    • Ruby 1.9.3p327
      rbenvを使用
    • Bundler 1.3.5
      ローカルMBAのCLIより、下記コマンドを実施
      $ gem install bundler
    • Vargrant plugin
      ローカルMBAのCLIより、下記コマンドを実施
      • vagrant-berkshelf 1.3.3
        $ vagrant plugin install vagrant-berkshelf
      • vagrant-omnibus 1.1.2 $ vagrant plugin install vagrant-omnibus
      • vagrant-cloudstack 0.1.0 $ vagrant plugin install vagrant-cloudstack

vagrant-cloudstack設定方針

ローカルPCの仮想環境にて仮想マシンを作成する場合には、Vagrant用に設定されたイメージ(vagrantbox)を使用しますが、外部環境を利用する場合はvagrantboxは利用できません。
今回は、IDCFクラウドにて用意されているUbuntu12.04テンプレートを用いて仮想マシンを作成し、その後、必要な設定を追加していきます。
  • 今回はvagrant-cloudstack利用に必要な最小限の設定ファイル(Vagrantfileおよびscript.sh)を用意。それ以外は、VirtualBox環境で利用していたものを利用する(ChefRecipeなど)
  • IDCFクラウドのUbuntu12.04テンプレートを使用
  • id:rootでvagrantの設定を実施
  • vagrant boxの基本設定と同様に、id:vagrantも作成し、no passwordでsudoできるようにしておく。
  • 外部からのsshアクセス用のportは2222を使用
  • installするものは以下の通り。
    • 公開されているcookbookを利用して、rvmをinstallし、ruby1.9.3を指定
    • 自作cookbook(site-cookbook)にて、apche2とmysql-serverをinstall

注意事項

  • IDCFクラウドでアカウント作成後、一度、webのコントロール画面から仮想マシンを作成してください。そうする事で、ネットワークとしてIPアドレスが1つ作成されます。このIPアドレスを使用します。
  • またできれば、上記で作成した仮想マシンは起動した状態で、以下のvagrant-cloudstackの作業を実施してください。(CloudStackでは仮想マシンが0台になると、FW,PortForwarding,DHCP機能を提供するVR(VirtualRouter)が一旦停止し、再度仮想マシンを起動するVRの起動も行うため、余分に時間がかかるためです)
  • 仮想マシン起動中は、料金が発生しますのでご注意ください。作業終了後は起動しっぱなしの仮想マシンがないか確認するようにしましょう。


設定内容

1. Vagrant環境設定用スクリプトを用意
  • scripts/script.shとして下記ファイルを用意します。
  • 内容はこちらと、vagrantbox.esのpostinstall.shを参考にしています。
#!/bin/bash

account=$1

useradd -p vagrant -m $account -s /bin/bash
    sed -i -e '/Defaults\s\+env_reset/a Defaults\texempt_group=admin' /etc/sudoers
    groupadd -r admin || true
    usermod -a -G admin $account
sed -i -e 's/%admin ALL=(ALL) ALL/%admin ALL=(ALL) NOPASSWD:ALL/g' /etc/sudoers
echo 'UseDNS no' >> /etc/ssh/sshd_config

vssh="/home/${account}/.ssh"
    mkdir -p $vssh
chmod 700 $vssh
    (cd $vssh &&
  wget --no-check-certificate \
    'https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub' \
    -O $vssh/authorized_keys)
    chmod 0600 $vssh/authorized_keys
chown -R ${account}:vagrant $vssh
unset vssh

2. Vagrantfile作成
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

#  config.ssh.username = "vagrant"
  config.ssh.username = "root"
  config.ssh.private_key_path = "~/.ssh/id_rsa" # IDCFクラウドで仮想マシンを作成時に指定したSSH鍵の秘密鍵を指定
  config.ssh.port = "2222"

  config.vm.box = "dummy"
  config.vm.box_url = "https://github.com/klarna/vagrant-cloudstack/raw/master/dummy.box"

  config.vm.provider :cloudstack do |cloudstack, override|
    cloudstack.scheme = "https"      # IDCFクラウドAPI設定
    cloudstack.host = "api.noahcloud.jp"   # 同上
    cloudstack.port = "443"                # 同上
    cloudstack.path = "/portal/client/api" # 同上
    cloudstack.api_key = "*****"           # 画面右上の[マイプロファイル]から[API資格情報]の[API鍵]をコピペ
    cloudstack.secret_key = "*****"        # 同じく秘密鍵をコピペ

    cloudstack.template_id = "2212"        # IDCFクラウドで使用するテンプレートのIDを指定。今回はIDCFが提供するUbuntu12.04を指定。
    cloudstack.service_offering_id = "24"  #IDCFクラウドの仮想マシンタイプ:XSを指定
    cloudstack.zone_id = "2"               # 2ゾーンあるうち、ゾーン2を指定
    cloudstack.keypair = "*****"           # IDCFクラウドで仮想マシンを作成時に指定したSSH鍵の秘密鍵を指定

    cloudstack.pf_ip_address_id = "*****"  # 使用するIPのIDを使用。[マイリソース]-[ネットワーク]で確認
    cloudstack.pf_public_port = "2222"
    cloudstack.pf_private_port = "22"

    cloudstack.instance_ready_timeout = 1800
  end

  # Chef-solo
  config.berkshelf.enabled = true
  config.omnibus.chef_version = :latest


  config.vm.provision :shell do |shell|
    shell.path = "scripts/script.sh"   # 上述のscript.shを指定
    shell.args = "vagrant"             # script.shの引数を指定
  end

  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = ["./cookbooks", "./site-cookbooks"]
    chef.add_recipe "apt"
    chef.add_recipe "rvm::system"
    chef.add_recipe "rvm::vagrant"
    chef.add_recipe "myapp"

    chef.json = {
      "rvm" => {
        "default_ruby" => "ruby-1.9.3-p448",
        "global_gems" => [
          {"name" => "bundler"}
        ]
      }
    }
  end
end

3. 仮想マシンを作成
下記を実行
vagrant up --provider=cloudstack

4. 仮想マシン作成完了後、仮想マシンにsshで接続
そのままvagrant sshを実行すると、Vagrantfileの内容に従って、rootとして接続します。
$ vagrant ssh
[fog][WARNING] Unable to load the 'unf' gem. Your AWS strings may not be properly encoded.
Welcome to Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-29-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

*** System restart required ***
    ________  ______   ______                 __  _          
   /  _/ __ \/ ____/  / ____/________  ____  / /_(_)__  _____
   / // / / / /      / /_  / ___/ __ \/ __ \/ __/ / _ \/ ___/
 _/ // /_/ / /___   / __/ / /  / /_/ / / / / /_/ /  __/ /    
/___/_____/\____/  /_/   /_/   \____/_/ /_/\__/_/\___/_/     


root@i-229-51079-VM:~#

5. id:vagrantとして、仮想マシンにsshで接続
下記の通り、Vagrantfileを一部コメントアウトすることで、仮想マシン作成時に作成したid:vagrantとしてsshアクセスします。vagrantからsudoコマンドを使って、操作可能です。
#  config.ssh.username = "vagrant"               # この行はコメントインしてもいいが、default値が"vagrant"のため、コメントアウトのままでもよい。
#  config.ssh.username = "root"                  # コメントアウト
#  config.ssh.private_key_path = "~/.ssh/id_rsa" # コメントアウト
下記の通り、login後のidがvagrantになっていることが分かります。
$ vagrant ssh
[fog][WARNING] Unable to load the 'unf' gem. Your AWS strings may not be properly encoded.
Welcome to Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-29-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

*** System restart required ***
    ________  ______   ______                 __  _          
   /  _/ __ \/ ____/  / ____/________  ____  / /_(_)__  _____
   / // / / / /      / /_  / ___/ __ \/ __ \/ __/ / _ \/ ___/
 _/ // /_/ / /___   / __/ / /  / /_/ / / / / /_/ /  __/ /    
/___/_____/\____/  /_/   /_/   \____/_/ /_/\__/_/\___/_/     


vagrant@i-229-51079-VM:~$ id
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant),999(admin),1001(rvm)


サンプルファイル

githubに置きました。
個人に依存するパラメータは伏せ字(*****)にしていますので、適宜適切なパラメータを設定してください。


課題

今回の作業にあたって、下記不具合が確認されました。とりあえず、目的のCloudStack上での仮想マシンの作成は達成できたので、後日調査する事とします。
  • 自作cookbook(site-cookbook)内のrecipeのserviceリソースが正常に動作しない
    通常のVirtualBox環境では動作していたので、vagrant-cloudstackの現在の動作制限もしくは不具合かも。
  • vagrant ssh実行時。下記warningが表示される。
    vagrant-cloudstackはvagrant-awsをfolkして作成されており、そこで利用しているgemに依存している模様。
[fog][WARNING] Unable to load the 'unf' gem. Your AWS strings may not be properly encoded.

  • 今回はUbuntu12.04について紹介したが、CentOSを使用する場合は、今回紹介した設定以外に事前に設定すべき箇所がある模様。

まとめ

  • 駆け足でしたが、vagrant-cloudstackを使用して、IDCFクラウド上に仮想マシンを作成し、さらにソフトウェアのinstallする方法を紹介しました。
  • Vagrant+ChefSoloでlocal PC上に開発環境作成後、IaaS上に本番環境をdeployする流れがイメージいただけたら幸いです。
  • S君ありがとう!


参考情報

今っぽい Vagrant + Chef Solo チュートリアル
Berkshelfベースにvagrant, chef(knife-solo)環境を簡単に構築する方法
dotinstall Vagrant入門
入門Chef Solo - Infrastructure as Code
dotinstall Chef入門
RubyistMagazineChef でサーバ管理を楽チンにしよう! (第 1 回)
このエントリーをはてなブックマークに追加

2013年11月30日土曜日

rubyでHTML mail送信してみる

タイトルの通り、mail送信する事がでてきたので準備してみました。
ポイントは下記
  • 全体的にシンプルに
  • HTML部分はERBを使用
  • 全てを1fileで、見通しよく


mail送信ライブラリを選ぶ

mail送信ライブラリですが、ruby toolboxをみると、Action MailerとMailの2つが主なライブラリのようです。
さらにこちらをみると、Action MailerもMailも書き方はあまり変わらないようです。今回はRubyでMailを送信するだけなので、Mailを使うことにします。


ERBを使う

ERBはHTMLなどの文章の中にRubyスクリプトを埋め込むためのライブラリです。
Railsで、erb fileで馴染みがあったので、今回同じように使いたいなと思った次第です。 ERBについては、るびまの説明が参考になりました。標準添付なのであらためてのinstall不要です。


DATAと__END__を使う

Perlの__DATA__と同様に、RubyではDATAと__END__で、スクリプトファイルにDATAを埋め込むことができます。 DATA部分の読み込みは上述のるびまのサンプルを参考にしました。


サンプル

以上よりサンプルを作ってみました。
事前にMailライブラリはgem install mailなどでinstallしてください。 下記は、smtpサーバを指定していますが、スクリプト動かしているマシンのsendmailに渡せるのであれば、sendmailを使った方が簡単です。
#! /usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'mail'
require 'erb'

user = 'あああ'
name = 'いいい '

mail = Mail.new do
  from    'aaa@aaa.com'
  to      'bbb@bbb.com'
  subject 'sample_subject'
  html_part do
    content_type 'text/html; charset=UTF-8'
    body ERB.new(DATA.read).result(binding)
  end
end

# sendmailに渡すだけでよければ、こちらをコメントイン
=begin
mail.delivery_method :sendmail
mail.deliver
=end

# sendmailに渡すだけでよければ、こちらをコメントアウト
mail.delivery_method :smtp, {
  address: 'smtp.aaa.com',
  port:    587,
  domain:  'aaa.com',
  user_name:    'aaa@aaa.com',
  password:     'xxxxxxxxxxxxxxx',
}
mail.deliver

__END__
<!DOCTYPE html>
<html>
  <body>
    <h1>こんにちは、<%= user %>さん!</h1>
    <p>
      あなたの名前は<%= name %>さんです。よろしくね!
    </p>
  </body>
</html>


まとめ

  • 書いてみるとこんだけなんですが、調べるとそのものずばりの情報がなかったので、忘備録として書いてみました。
  • 「こんな方法があるよ」的な話があると教えてもらえると幸いです。
このエントリーをはてなブックマークに追加

2013年11月20日水曜日

VBoxManage: error: Failed to create the host-only adapter

最近、Vagrant upをするとエラーが発生するようになりました。
本事象は、下記環境で発生するようです。
MacOSX 10.9
VirtualBox 4.2.18 r88780
エラー内容は下記。
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Importing base box 'precise64'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[Berkshelf] This version of the Berkshelf plugin has not been fully tested on this version of Vagrant.
[Berkshelf] You should check for a newer version of vagrant-berkshelf.
[Berkshelf] If you encounter any errors with this version, please report them at https://github.com/RiotGames/vagrant-berkshelf/issues
[Berkshelf] You can also join the discussion in #berkshelf on Freenode.
[Berkshelf] Updating Vagrant's berkshelf: '/Users/snumano/.berkshelf/default/vagrant/berkshelf-20131119-2647-nx5ysd-default'
[Berkshelf] Using apt (1.9.0)
[Berkshelf] Installing rvm (0.9.1) from git: 'git://github.com/fnichol/chef-rvm.git' with branch: 'master' at ref: '7038fb8c518d0d7785767de215b1ae463f237973'
[Berkshelf] Using myapp (0.1.0) at './chef/site-cookbooks/myapp'
[Berkshelf] Using java (1.13.0)
[Berkshelf] Using windows (1.10.0)
[Berkshelf] Using chef_handler (1.1.4)
[Berkshelf] Using chef_gem (0.1.0)
Pruning invalid NFS exports. Administrator privileges will be required...
Password:
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["hostonlyif", "create"]

Stderr: 0%...
Progress state: NS_ERROR_FAILURE
VBoxManage: error: Failed to create the host-only adapter
VBoxManage: error: VBoxNetAdpCtl: Error while adding new interface: failed to open /dev/vboxnetctl: No such file or directory

VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component HostNetworkInterface, interface IHostNetworkInterface
VBoxManage: error: Context: "int handleCreate(HandlerArg*, int, int*)" at line 68 of file VBoxManageHostonly.cpp
対応はこちらを参考に、Local PC側でsudo /Library/StartupItems/VirtualBox/VirtualBox restartを実行するだけ。再度vagrant upすれば正常に起動します。
VirtualBox4.3.0でも上記事象は継続するようですが対応コマンドが、sudo launchctl load /Library/LaunchDaemons/org.virtualbox.startup.plistに変わるので注意。
こちらによるとVirtualBox4.3.2で、本事象は解消されるそうです。VirtualBox起動後、「アップデートを確認」では4.3.2を見つけてくれませんでしたが、DownLoadサイトでは、4.3.2が公開されています。

### 追記(2013/11/26) ###
VirtualBox4.3.2にupgradeして、本事象解消を確認しました。
このエントリーをはてなブックマークに追加