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して、本事象解消を確認しました。
このエントリーをはてなブックマークに追加

2013年11月17日日曜日

MarkdownでBlogger記事を書いてみた

最近、Markdownがマイブームです。
githubのREADMEを書くのに使ったのが最初だったのですが、その後、masuidriveさんがMarkdown対応のオンラインメモサービスwri.peを開発されたりして、少しずつ気になってました。
で、MarkdownでBlogger記事を書く方法を調べた所、いくつか方法がある中で、StackEditというMarkdown対応のオンラインエディタを使う方法が、自分には一番よさそうでした。
2ペイン画面で、リアルタイムでHTMLのPreviewが表示されるので、確認しながらMarkdownで書いていきます。 記事をを書いた後は、左上のアイコンをクリックしmenuから[Publish on...]-[Blogger]を選択します。(詳細は上述のブログをご参照ください)
実際に、StackEditで書いたblogはこちらです。
他に、Markdown関連で調べた事をいくつか。

Markdown対応のBlog

Markdownに対応しているサイトは、Wikipediaの利用例に記載の通り、Stack OverflowやGitHubなどがあります。
Blog関連で有名な所では下記ぐらいでした。もし、BloggerでMarkdownが全く使えなかったら、これらのサービスへの移行も考えていました。

MarkDown対応のEditor

横着してリンクの紹介になりますが、意外にたくさんあります。この中では、Kobitoを使った事があります。 今回使用したStackEditは、「ブラウザエディタ」に該当しそうですが、含まれていませんね。

まとめ

  • BloggerをMarkdownで書く環境が整ったことで、これからはメモを含めて全てMarkdownで書けそうです。
  • Markdownはそのままでも読めるので、メモの記述方法として、覚えておくと便利そうです。
このエントリーをはてなブックマークに追加

2013年11月16日土曜日

VagrantとChefSoloでTremaEdge環境をつくる

最近、OpenFlow徹底入門を読んでいます。再びOpenFlowでいろいろやってみたいと感じています。
この本ではOpenFlowコントローラとしてFloodlightを使用しています。今までOpenFlowコントローラは、主にTremaを勉強してきましたが、いろいろなコントローラを触りながら、OpenFlowの本質を知るのもいいなかなと思っています。
ただ、そのための環境を作成するのは、(webに情報があるとは言え)やはり時間がかかります。また、local PCのリソース(主にdisk容量)を消費するので、どこかのタイミングで、ある環境を削除する判断をしなければなりません。(今までそのような経験をしてきたので、PC購入の際にはdisk容量を多めにするようにしています)
VagrantとChefSoloを使えば、サーバ環境をファイルで管理できる、個々の環境imageを保持する必要がなくなります。よって、diskの使用率を低減することができます。
今後、検証環境を作成する際には、VagrantとChefSoloで作成し、githubで保存していきたいと思います。

今回やること

今回は、trema-edgeの環境を作成してみたいと思います。 trema-edgeはtremaのOpenFlow1.3版で、OpenFlow1.0はサポートしていません。今のところ、tremaとtrema-edgeは別のものです。
また、tremaはRuby1.8環境で動作するのですが、Ruby1.8の開発は終了しています。それに対して、trema-edgeはRuby2.0環境で動作します。詳しくは下記。

設定ファイル

まず今回作成した設定ファイルをgithubに保存しましたので、ご参照ください。
github vagrant-trema-edge

設定のポイント

install手順はgithubのREDAMEに従っています。
手順は難しくありませんが、今回は、rubyのバージョン管理にrvmを使いましたので、rvmの設定のポイントを記載します。

Berksfileの設定

cookbookとしてrvmを登録します。rvm用のcookbookはいくつか存在しますが、今回使用したものが安定しているようでした。
$ vi Berksfile
site :opscode
cookbook 'apt'
cookbook 'rvm', github: 'fnichol/chef-rvm'
cookbook 'myapp', path: './site-cookbooks/myapp'

Vagrantfileの設定

chef.add_recipeとして下記の2行を追加し、chef.jsonでrubyのバージョン指定と、gemsの指定を行います。
$ vi Vagrantfile
-snip-
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-2.0.0",
    "global_gems" => [
      {"name" => "bundler"},
      {"name" => "rake"}
    ]
  }
}
-snip-

Recipeの設定

今回、cookbookでrvmをinstallしているので、rvm_shellリソースが使えるようになっています。rvm_shellでrvmに依存する部分の記載を行います。
また、githubからtrema-edgeのrepositoryを取得するのはgitリソースを使用します。
$ vi site-cookbooks/myapp/recipes/default.rb
git "/home/vagrant/trema-edge" do
  repository "git://github.com/trema/trema-edge.git"
  reference "master"
  action :checkout
  user "vagrant"
  group "vagrant"
end

rvm_shell "install trema-edge" do
  ruby_string 'ruby-2.0.0'
  cwd "/home/vagrant/trema-edge"
  code <<-EOC
    bundle install
    rake
  EOC
end

bash ".bashrc" do
  not_if "which trema"
  code <<-EOC
    echo 'PATH="$HOME/trema-edge/bin:$PATH"' >> /home/vagrant/.bashrc
  EOC
end

まとめ

  • 今回、trema-edgeの環境設定をVagrantとChefSoloで行いました。
  • 設定のポイントとしては、今回はrvmを使用し、ruby2.0.0を指定しています。
  • trema-edge自体は、これから触ってみたいと思います。

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