Exchange serverでメールを送信

Microsoft Exchange serverをつかってrubyからメールを送る方法。みんなActionMailerつかってるけどRailsつかわないときは山ほどgemを入れられるのがつらいので、mail + ruby-ntlmでやる方法をメモ。

require 'mail'
require 'ntlm/smtp'

Mail.defaults do
  delivery_method :smtp, {
    :address              => 'mail.server.com',
    :domain               => 'domain name',
    :user_name            => 'user name',
    :password             => 'password',
    :authentication       => :ntlm,
    :enable_starttls_auto => true
  }
end

Mail.deliver do
  from     'your email address'
  to       'recipients'
  subject  'Hello'
  body     'Test'
end

NVD3.js

綺麗なチャートを表示するのにnvd3.jsを使ってるんだけど、ハマリどころが多いのでメモ。

nvd3.org

追記> こちらにちゃんとしたdocumentがありました。 Nvd3 - reusable charts for D3.js

  • データは各シリーズでx値が一致して抜けがないように。抜けは0やnullで補完する。x値の順序も同じようにソートしておく。
  • chartのx,yメソッドで値のスケーリングや演算ができるが、おかしくなることも多いので、演算済みのデータを渡すのが吉。

    chart.x(function(d) { return d['x'] / 1000 })
    
  • 日付はUnix tampstampをm secでわたす。javascriptで以下のように希望のフォーマットに変換する。

    chart.xAxis.tickFormat(
      function(d) {return d3.time.format('%Y-%m-%d')(new Date(d));});
    
  • 色を変えたいときはjavascriptでcolorをインジェクトしたが、元データに埋め込んでも可。

    data[0]['color'] = '#00cc00';
    
  • グラフのサイズはsvgタグのサイズで指定(slimつかってます)

    div#qty 
      svg style="height:300px; width:100%;"
    
  • 要望: line chartで、ぬけてるポイントは飛ばして線をつなげてほしい。

  • slimのテンプレを貼っておく

      doctype html
      html
        head
          meta charset="utf-8"
          title NVD3.js template
          link href="nv.d3.css" rel="stylesheet"
          script src="d3.min.js"
          script src="nv.d3.min.js"
          javascript:
            d3.json('data.json', function(data) {
              nv.addGraph(function() {
                var chart = nv.models.multiBarChart()
                  .rotateLabels(-45)
                  .margin({top: 30, right: 100, bottom: 100, left: 100});
                chart.multibar.stacked(true);
                chart.xAxis
                     .tickFormat(function(d) {
                       return d3.time.format('%Y-%m-%d')(new Date(d));});
                chart.yAxis
                  .tickFormat(d3.format(',d'))
                  .axisLabel('Number');
                data[0]['color'] = '#00cc00';
                data[1]['color'] = '#ffcc00';
                data[2]['color'] = '#ff9900';
                data[3]['color'] = '#ff3300';
                d3.select('#chart svg')
                    .datum(data)
                    .call(chart);
                nv.utils.windowResize(chart.update);
                return chart;
              });
            });
        body
          span
            h2 style="text-align:center;" Test chart
          div#chart
            svg style="height:300px; width:100%;"
    

AccelTCPで遅延削減

ラズパイVPNサーバの総仕上げとしてAccelTCPでレイテンシーを最小化してみた。 AccelTCPは”プロキシサーバ間のコネクションプーリングにより、TCPコネクションの確立時に発生する3Wayハンドシェイクのオーバーヘッドを削減し、比較的小さなデータのやりとりを行う通信の待ち時間を大幅に短縮できます。”というものです。これで日独間のping 300ms分の遅延を減らすのが目的です。

dsas.blog.klab.org

web browser --> acceltcp:8080 --> (SoftEther VPNでL2TP/IPsec) --> acceltcp:10381 --> squid:3128 --> web site というフローになる。

まず、ラズパイにはsquidをhttp proxyとしてインストールしてポート3128で待機しておく。 キャッシュはいらないので/etc/squid/squid.confで

cache_dir null /tmp

としてディスクキャッシュは無効にしておく。 AccelTCPのbuildは簡単です。

sudo apt-get install libev-dev
git clone git://github.com/KLab/AccelTCP.git
cd AccelTCP
cmake .
make
sudo cp acceltcp /usr/local/bin

まずラズパイにAccelTCPサーバを立てる。AccelTCPは10381で待機します。-4でipv4にするか明示的に自アドレスを書かないとaddress already in useと言われました。バグっぽいです。

acceltcp -q -- --server -4 10381:127.0.0.1:3128

または

acceltcp -q -- --server 127.0.0.1:10381:127.0.0.1:3128

クライアントは自分のmacで下のようにして100本ほどプールを作ります。ラズパイのipは192.168.0.100とします。

acceltcp -q -- -4 --connection-num=100 8080:192.168.0.100:10381

あとはwebブラウザのプロキシを127.0.0.1:8080にすると、日本のサイトへのアクセスは爆速になります。ベンチマークだと1.5倍から2倍弱ですが、体感はもっと速い感じです。webのように小さなファイルをたくさんダウンロードすると効果はてきめんです。http/2が広まるまでは役に立ちそうです。 (googleのdata compression proxyもかなり速い)

ここまでくるとSoftEtherは拠点間接続にして常時つないでおき、AccelTCPもつなぎっぱなしにしておいたほうが使い勝手が良さそうですね。プロキシだけ切り替えればwebへの経路が変わるというのがよさそう。

CPUファンの効果

ラズパイにファン付きケースを購入しましたが、ファンの有無でCPU温度にどれくらい差が出るか調べてみました。

室温は12月の暖房していない部屋なので10℃くらいでしょうか。ファンを回すとアイドルで24℃くらいですが、止めると40℃まで上昇しました。小さいし静かですが、効果は大きいですね。

Raspberry PiでVPNサーバ

ラズパイとSoftEtherを使ってVPNサーバを作ってみます。古いMBPをVPNサーバにしてたんですが、サーバ用途にはLinuxの方が使いやすいです。

ベースはRaspberry Pi 2 model Bです。パワーは十分でしょうか。

Raspberry Pi 2 Model B (1)

Raspberry Pi 2 Model B (1)

ヒートシンクは効かないそうなので、ファン付きのケースを使用。ファンは静かでほとんど無音です。どれくらい効果があるか不明ですが。温度をモニターしてみたいですね。

SDカードはラズパイと相性があるようですが、とりあえず以下のは問題ないです。

キーボード、マウス、モニタはなし、iPhoneのACアダプタと余り物のusbケーブルを用意しました。

raspbian jessieをマニュアル通りにインストールして起動する。dhcpでipを取得するので、arpでipの一覧をみて、ラズパイのipを見つける。

arp -a

sshでログインして、初期設定する。sdカードの容量拡大、タイムゾーン、パスワード変更など。

ssh -l pi 192.168.0.xx
raspi-config

raspbianをアップデートして最新版に。

sudo apt-get update
sudo apt-get upgrade

ファームウェアもアップデート。

rpi-update

固定ipはjessieから設定する方法が変わったらしい。/etc/dhcpcd.confを修正する。

RaspberryPi - Raspberry Pi 2 (Raspbian: jessie) でIPアドレスを固定する - Qiita

Raspian側の設定はリンク先の通り。

RaspberryPi - Raspberry Pi 2とSoftEther VPNを使ってVPNサーバーを構築しよう! - Qiita

SoftEtherのインストールはマニュアル通りだが、ローカルブリッジはあらたにtapをつくる。tapとeth0がbr0を通じて通信できるようにすると、VPNからログインしてラズパイにsshしたりできます。クライアントは特別準備しなくてよいようにL2TPを有効にしておきます。DDNSサービスが用意されるのが素晴らしいです。DNSは自前VPNの最後の難関ですから。

ルータのポートフォワードを設定して完了。

最後にsdカードの中身をバックアップしておきましょう。SDカードをMacにさしてddでバックアップ。

dd bs=1m if=/dev/rdisk2 of=raspi.img

追記1

ファイアーウォールufwをいれる。

sudo ufw default DENY
sudo ufw limit 22
sudo ufw allow 8080
sudo ufw allow 500
sudo ufw allow 4500
sudo ufw enable

2015 買ったもの

今年の振り返り。

引っ越してバスダブがついたのでziplocしなくていい風呂用タブレットが欲しくなり購入。腕もだるくならない いいサイズですね。初めてのAndroidですが、まぁアレですな。5.1までアップデートできるのは大変よいです。肝心の風呂では画面が濡れるとうまく動かないので、防水とはいえ濡らすわけにいきません。最新世代はぬれてもいいといってるのでUltraサイズに期待です。

www.apple.com 3D touch、taptic engineは体験しないといけないと思って買ったけど、3D touchがついてることを忘れてることもしばしば。まだキラーアプリがない。tweetbotの3D touchとか便利ですけどね。6から結構重くなったのがいたい。でも4.7inchはいいし、処理速度も速い。不満はないです。

www.apple.com 第2世代からグレードアップ。1080p対応、YouTube復活、HDMI経由のTV操作など。アプリ待ち。スクリーンセーバーは素晴らしいです。

日の出が8時前なのでおきるのがつらいからかってみた。値段高い。無いよりいいけど早起きにはなってない。コンセントを抜くと現在時刻を忘れる。

www.google.com 待望の5GHz帯対応。Sligboxもちゃんと動きます。

Canyon | Road | ENDURACE 自転車も買いました。最新のカーボンフレームは乗り心地がすごく良くなっていて驚きました。いいです。

iTunesでダウンロードできない曲

iTunesで買ったのにダウンロードできない曲があったので、再ダウンロードの方法を記す。

症状

  • iPhoneで曲を買う
  • iPhoneでダウンロードできた、iPadでダウンロードできた、Macでダウンロードできない
  • MaciTunesの購入済みの画面ではダウンロードしたことになっている
  • iTunesのMy musicには表示されない
  • iPhone, iPadからの購入済みの転送もできない

解決策

  • 検索窓で検索すると、見えない曲が表示されるので、右の点々からその曲を削除する
  • ここでiTunesの購入済みの画面でダウンロードできるようになるが、ボタンを押してもダウンロードできない。ボタンを押してしまったら上に戻る
  • iPhoneから購入済みの転送をする