12 Apr 2014, 12:37

ExcelVBAのコードをimport/exportする

Excel VBAの最大の課題が、保守性。 Excelの中にコードが縛られている。このコードを外に出すと、

  • バージョン管理ができる
  • VimやEmacsなどのエディタで開発できる
  • テスト駆動開発できる

などなど。

レガシーなExcelVBAもバージョン管理、テスト、自動化という 現代ソフトウェア開発の三種の神器に従って開発ができる。

調べてみると、同じようなことを考えている人たちがいた。

これらの方法を利用してもいいのだが、 現在VBA絶賛勉強中のため、自分の学習も兼ねて、 VBAのコードをExcel内からimort/exportするコードを書いてみた。

苦労した点とか

Rubyの win32oleがつかえなかった

<div class="outline-text-3" id="text-1-1">
  <p>
    はじめはRubyでやっちゃえと思ったけど、どうもwin32oleではメソッドがみつからなかった。
  </p></p>
</div></p>

Excel Objectについて

<div class="outline-text-3" id="text-1-2">
  <p>
    標準モジュール、クラスモジュールはImpot/Exportができるのだが、 ThisWorkbookやSheetなどのExcel Objectはそれができない。 これらは、行の削除と挿入で対応した。
  </p>

  <pre><code>Private Sub InsertLines(myFile As String)

Dim myFSO As New FileSystemObject Dim myBaseName As String: myBaseName = myFSO.GetBaseName(myFile)

With ThisWorkbook.VBProject.VBComponents(myBaseName).CodeModule .DeleteLines StartLine:=1, count:=.CountOfLines .AddFromFile myFile

' Delete header lines
.DeleteLines StartLine:=1, count:=4

End With

Set myFSO = Nothing End Sub

自分で自分をリロードできない

<div class="outline-text-3" id="text-1-3">
  <p>
    VBAで書くと、自分自身のコードをimport/exportすることができない。
  </p>

  <p>
    なので、ThisWorkbookとFileManagerという二種類のファイルに処理を分けて 2段階でインポートすることにした。
  </p></p>
</div></p>

Environment

<div class="outline-text-3" id="text-1-4">
  <ul class="org-ul">
    <li>
      Windows 7 64bit
    </li>
    <li>
      Excel 2010
    </li>
  </ul>

  <p>
    </div>
  </p>
</div></p>

最後に

<div class="outline-text-2" id="text-2">
  <p>
    このベージの解説が素晴らしい。本当に、Special Thanks.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://rsh.csh.sh/text-scripting-vba/">vi で書こう VBA — Text Scripting on VBA</a>
    </li>
  </ul>
</div></p>

05 Apr 2014, 18:15

Excel VBAで テスト駆動開発してみる

2年前に、VB Lite Unitをいじっていたことがあるが、 より未来派ハッカーに近づいたいま、改めていじってみる。

クラスモジュールでないとテストできない

VBAには、ユーザフォーム、標準モジュール、クラスモジュールの3種類のコードの種類がある。 VBLiteUnitでは、クラスモジュールに対してテストを実施する。

クラスモジュールっなんだっけ?という僕たちには、以下のリンクが参考になる。

テスト実行用マクロをつくる

以下のようなSubプロシージャを用意することで、テスト実行をマクロにする。

Public Sub RunAllTests
        Runtests New Tst_Data
End Sub

テスト実行用のVBSをつくる

コマンドラインからRunAllTestsを実行したい。

以下を参考にして、Excelのマクロをコマンドラインから実施するためのVBSを作成。


Dim objExcelApp ,objExcelBook
Dim macro_path

macro_path = "C:\cygwin\home\TSUNEMICHI\repo\vba-study\sample\test.xlsm"

Set objExcelApp = CreateObject("Excel.Application")
Set objExcelBook = objExcelApp.Workbooks.Open(macro_path, , True)

objExcelApp.Run "'" + macro_path + "'!ThisWorkbook.reloadModule"
objExcelApp.Run "'" + macro_path + "'!ThisWorkbook.runAllTests"

objExcelBook.Saved = True
objExcelBook.Close False
Set objExcelBook = Nothing
Set objExcelApp = Nothing

テスト実行用のRakefile作成

TDDっぽくするために、rakefileを作成してみた。rake testでテストを実行する。


require 'rake/clean'

FILE_PATH  = "./test.xlsm"

task :default => "open"

task :open do
  `cygstart  #{FILE_PATH}` 
end

task :test do
  `cygstart test.vbs` 
end

テストコード作成

src/testディレクトリ配下にそれぞれ作成。

完成品

<div class="outline-text-2" id="text-1">
  <p>
    githubにアップ。
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/tsu-nera/ExcelVBA_TDD_Sample">https://github.com/tsu-nera/ExcelVBA_TDD_Sample</a>
    </li>
  </ul>
</div>

<div id="outline-container-sec-1-1" class="outline-3">
  <h3 id="sec-1-1">
    Special Thanks
  </h3>

  <div class="outline-text-3" id="text-1-1">
    <ul class="org-ul">
      <li>
        <a href="http://rsh.csh.sh/text-scripting-vba/">http://rsh.csh.sh/text-scripting-vba/</a>
      </li>
      <li>
        <a href="http://vb-lite-unit.sourceforge.net/">http://vb-lite-unit.sourceforge.net/</a>
      </li>
    </ul>
  </div></p>
</div></p>

05 Apr 2014, 11:33

EmacsでのExcel VBA開発環境を構築

Excel VBAなどの開発環境は、たいていVisual Basic Editorです。

しかし、なんでもEmacs上でやらないと病気になってしまう、 もやしな人間たちにとってはEmacsでVBAが書きたいところ。

というわけで、無謀にもEmacsでVBAの開発がでいないものか、調べてみました。

[toc]

visual-basic-mode.el

visual-basic-mode.elというものを見つけました。

emacswikiからダウンロードして、ロードパスの通った場所に配置します。init.elにも以下を記述。

 (autoload 'visual-basic-mode "visual-basic-mode" "Visual Basic mode." t)
 (setq auto-mode-alist (append '(("\\.\$latex frm\\|bas\\|cls\$$" .
                                 visual-basic-mode)) auto-mode-alist))

VBAのファイルがハイライト表示される。

text-scripting-vba

Excel VBAのコードのインポート・アウトポートを簡単にできる。そうすると、

  • ViやEmacsでコードがかける
  • バージョン管理ができる
  • TDDでコーディングができる

と、いろいろなメリットがある。

本サイトは、以下。

使い方

<div class="outline-text-3" id="text-2-1">
  <p>
    xlsm拡張子のExcelデータを新規作成。test.xlsm
  </p>

  <p>
    開発タブからVBE起動(Alt+F11でも)。 開発タブはデフォルトで隠されているので、表示されていなければオプションから表示させる。
  </p>

  <p>
    ツールバーのファイル -> インポートを選択。 以下から落としてきたThisWorkbook.clsをインポート。
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/tcsh/text-scripting-vba">tcsh/text-scripting-vba</a>
    </li>
  </ul>

  <p>
    ちなみに、文字コードがUTF-8なので、Shift-Jisに変換したほうがよい。変換方法は以下。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/1331">Cygwinにnkfをインストールして文字化け攻略する! | Futurismo</a>
    </li>
  </ul>

  <pre><code>nkf -s ThisWorkbook.cls > ThisWorkbook_sjis.cls

  <p>
    ExportThisNotebokとReloadModuleのマクロが追加される。
  </p>

  <p>
    標準Moduleに追加されるので、その内容をThisWorkBookに切り取り・貼り付けをする。
  </p></p>
</div></p>

コードを書く

<div class="outline-text-3" id="text-2-2">
  <p>
    サンプルとしてコンナコードを書く。./src/hello.bas
  </p>

  <pre><code>Sub Hello()

MsgBox (“Hello VBA”) End Sub

  <p>
    libdef.txtを作成。ここに読みこむソースのパスを相対パスで記述。
  </p>

  <pre><code>./src/hello.bas

  <p>
    マクロ(F5 or Alt+F8)のReloadModuleを実行すると、 先ほど作成したhello.basが取り込まれる。
  </p>

  <p>
    こんなふうにすれば、Emacsで編集して取り込んでテストということが可能。
  </p></p>
</div></p>

VB Lite Unit

VBAで TDDを実施するためのツールとして、VB Lite Unitがある。

詳しくは過去記事参照。

vbasense.el

vbasenseなるものは、オムニ補間ができるとのこと。Special Thanks.

el-getからインストールします。init.elにも以下を追加。

(require 'vbasense)

;; キーバインド
(setq vbasense-popup-help-key "C-:")
(setq vbasense-jump-to-definition-key "C->")

;; 必要に応じて適宜カスタマイズして下さい。以下のS式を評価することで項目についての情報が得られます。
;; (customize-group "vbasense")

;; 推奨設定を行う
(vbasense-config-default)

M-x vbasense-load-libraryを実行したときに、 [VBASense] Not yet regist TLBINF32.DLLというエラーがでることがある。

ただし、自分の環境ではどうも動かし方がわかりませんでした。 TLBINF32.DLLの登録方法がわからずに導入は挫折、残念。

windows7 64bitだと、ダメなのかな?

C:\Windows\SysWOW64>regsvr32.exe TLBINF32.DLL

vbasense-tli-filesに自分の環境のパスを変更しても、うまくパスをみつけてくれない。 chkTLI.vbsをNop応答にして、だましで少しつかってみる。

Excelenium

この記事とはまったく関係ないけれども、このツールがとてもおもしろそうなので、memo。

ExcelとSeleniumを組合せたもので、Excelのテスト仕様書からSeleniumを実行できる。しかも、OSSとか。

05 Apr 2014, 06:02

Proxy 配下で git を利用する方法, ほか

掲題のとおり, proxy 配下で git を利用する方法について調べてみました.

[toc]

設定方法

結論からいうと, 以下のコマンドを叩く.

git config --global http.proxy http://proxy.example.com:8080

これによって, ~/.gitconfig ファイルに以下の行が追加される.

[http]
proxy = http://proxy.example.com:8080

認証付きプロキシの場合

場合によっては, ユーザ名とパスワードが必要. 以下のように打ち込む.

git config --global http.proxy http:// (ユーザ名):(パスワード)@proxy.example.com:8080

ユーザ名とパスワードを.gitconfig に書きたくない場合は, 別ファイルに記述を独立させて, 読みこむ.

[include]
path = ~/dotfiles/.gitconfig.local

SSL エラー回避

error: SSL certificate problem, verify that the CA cert is OK. Details:みたいなエラーがでで失敗するときは, SSL を無向にしてやる. .gitconfig に以下を追加.

[http]
sslVerify = false

gitsubmodule をプロキシ配下で実行

git submodule は git プロトコルで実行されるので, プロキシ配下だと失敗することがある.

以下を実行することで, git プロトコルではなくて, http プロトコルでアクセスする.

$ git config --global url.http://github.com/.insteadOf git://github.com/

05 Apr 2014, 05:38

SquidをつかってWindows環境化でプロキシサーバを立ててみる

わけあってプロキシサーバを立ててみたくなったので、 Windows環境でプロキシサーバをたてる方法について調べてみた。

Squidをつかう

フリーソフトのSquidを利用する。Squidはマルチプラットフォームなプロキシサーバソフト。

以下から、windows用のプログラムをダウンロードしてくる。

解凍したものを、C:に配置。

設定ファイルの設定

etc配下にある以下をリネーム。

  • mime.conf.default -> mime.conf
  • squid.conf.default -> squid.conf

600行目あたりに、acl (任意の名前) src (IPアドレス)/(サブネットマスク)を追加。

入力するIPアドレスは コマンドプロンプトから ipconfigコマンドで調べることができる。


#Recommended minimum configuration:
acl all src all
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 
# 以下を追加
acl net localsrc 192.168.1.0/255.255.255.0 

650行目あたりで定義したネットワーク指定をアクセス許可。

ここではhttp_access に localnetを追加。

# Only allow cachemgr access from localhost
http_access allow manager localhost localnet
http_access deny manager

1100行目あたりでプロキシ用ボートを8080に設定。

# Squid normally listens to port 3128
# http_port 3128
http_port 8080

コマンドプロンプトでの操作。

まずは、管理者権限でコマンドプロンプトを起動する。

キャッシュエリア作成

<div class="outline-text-3" id="text-3-1">
  <p>
    C:で以下のコマンドを実行。
  </p>

  <pre><code>C:\squid\sbin>squid -z

2014/04/04 21:39:46| Creating Swap Directories

サービスの起動

<div class="outline-text-3" id="text-3-2">
  <p>
    以下のコマンドで、Windowsの管理のサービスに追加して起動。
  </p>

  <pre><code>C:\squid\sbin>squid -i

C:\squid\sbin>net start squid

  <p>
    停止はnet stop squid。サービスから外すには以下。
  </p>

  <pre><code>C:\squid\sbin>squid -r

たとえばInternet Exploreの設定

IEにプロキシ経由でネットにアクセスするように設定。

[接続] > [LANの設定] > [プロキシサーバ]と移動して、入力欄に自分のIPアドレスとポート番号を入れる。

ここでは、192.168.100.101と8080.

BASIC認証をかける

squidのダウンロードページにおいてある、NCSAsupport.zipをおとして解凍する。

なかに、htpasswd.exe があるので、C:にコピー。以下を実行してpasswdファィルを作成。

C:\squid\etc>htpasswd.exe -c passwd tsu-nera
Adding password for tsu-nera.
New password:**************
Re-type new password:**************

passwd生成用のWebサービスもあるようだ。

C:.confの288行目あたりをコメントアウト。認証用プログラムとパスワードファイルを指定する。

auth_param basic program C:/squid/libexec/ncsa_auth.exe C:/squid/exc/passwd 
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off

以下を追加。

acl password proxy_auth REQUIRED
http_access allow password

さきほど追加したnetはコメントアウトしておく。

# http_access allow net

再起動すれば設定完了。IEからネットにアクセスしてユーザ名とパスワードを効かれたらOK.

29 Mar 2014, 13:45

RSpecのモックについて調べてみた

今日は、RSpecにおけるモックオブジェクト技法について調べてみました。

モックオブジェクト技法とは

モックオブジェクト技法とは、

  • オブジェクト同士のコラボレーションに注目したテスト方法。
  • オブジェクトの状態よりも、オブジェクト同士のやりとりに注目する。
  • インターフェースのテスト、シーケンス図のテストに注力した技法。

詳しくは、この本がいい。

RSpecにおけるテストダブル

基本は以下。double()メソッドでテストダブルオブジェクトを生成。

テストダブルとは、本物のオブジェクトの代役をするオブジェクト。 映画の俳優のスタントマン。

大抵の場合は、テスト対象のオブジェクトの引数としてオブジェクトが渡される。


   real_foo = Foo.new
   double_foo = double('foo')

   # real_fooをつかわないで、double_fooを渡す
   hoge = Hoge.new(double_foo)

記法には2種類ある。

  • should記法 should_recieve …
  • expect記法 allow/expect

expect記法の方が、より英語らしく感じる。文脈に応じて使い分ける。

スタブ

<div class="outline-text-3" id="text-2-1">
  <p>
    スタブメソッドを指定すると、 テストダブルオブジェクトのメソッドから好きな値を戻り値として得ることができる。
  </p>

  <pre><code>

allow(double_foo).to receive(:call).and_return(“Hello”) double_foo.stub(:call).and_return(“Hello”)

モック

<div class="outline-text-3" id="text-2-2">
  <p>
    スタブに検証機能をつけたものをモックという。検証機能とは、
  </p>

  <ul class="org-ul">
    <li>
      期待された引数で呼ばれたか?
    </li>
    <li>
      期待された回数呼ばれたか?
    </li>
    <li>
      期待された順番で呼ばれたか?
    </li>
  </ul>

  <p>
    などなどを検証する。この機能が、モックオブジェクト技法。 オブジェクト同士のやりとりに注力したテストがかける。
  </p>

  <p>
    期待された値で呼ばれたかは、with()メソッドで検証する。
  </p>

  <pre><code>

expect(double_foo).to recieve(:call).and_return(“Hello”) double_foo.should_recieve(:call).and_return(“Hello”)

リファレンスとか

<div class="outline-text-3" id="text-2-3">
  <p>
    機能が細かいので、詳しくは以下のリンクを参照。
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://relishapp.com/rspec/rspec-mocks/v/3-0/docs">RSpec Mocks 3.0 &#8211; RSpec Mocks &#8211; RSpec &#8211; Relish</a>
    </li>
  </ul>

  <p>
    自分は、この書籍を見ながら勉強している。
  </p>

  <div class='amazlink-box' style='text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;'>
    <div class='amazlink-list' style='clear: both;'>
      <div class='amazlink-image' style='float:left;margin:0px 12px 1px 0px;'>
        <a href='http://www.amazon.co.jp/RSpec-Book-Professional-Ruby-Series/dp/4798121932%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4798121932' target='_blank' rel='nofollow'><img src='http://ecx.images-amazon.com/images/I/51-3T735zLL._SL160_.jpg' style='border: none;' /></a>
      </div>

      <div class='amazlink-info' style='height:160; margin-bottom: 10px'>
        <div class='amazlink-name' style='margin-bottom:10px;line-height:120%'>
          <a href='http://www.amazon.co.jp/RSpec-Book-Professional-Ruby-Series/dp/4798121932%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4798121932' rel='nofollow' target='_blank'>The RSpec Book (Professional Ruby Series)</a>
        </div>

        <div class='amazlink-powered' style='font-size:80%;margin-top:5px;line-height:120%'>
          posted with <a href='http://amazlink.keizoku.com/' title='アマゾンアフィリエイトリンク作成ツール' target='_blank'>amazlink</a> at 14.03.29
        </div>

        <div class='amazlink-detail'>
          David Chelimsky
        </div>

        <div class='amazlink-sub-info' style='float: left;'>
          <div class='amazlink-link' style='margin-top: 5px'>
            <img src='http://amazlink.fuyu.gs/icon_amazon.png' width='18' /><a href='http://www.amazon.co.jp/RSpec-Book-Professional-Ruby-Series/dp/4798121932%3FSubscriptionId%3DAKIAJDINZW45GEGLXQQQ%26tag%3Dsleephacker-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4798121932' rel='nofollow' target='_blank'>Amazon</a>
          </div>
        </div>
      </div>
    </div>
  </div>
</div></p>

実装例

以前書いたステートパターンの実装に対してテストコードを書いてみました。

その他所感

<div class="outline-text-2" id="text-4">
  <p>
    Mock系のツールは、GoogleMockとJMockをつかったことがあるけれども、 RSpecの記法はとてもシンプルなので、気に入った。
  </p>

  <p>
    JavaやC++だと、いちいちインタフェースを定義しないといけない。
  </p>

  <p>
    Rubyでは、それがないの
  </p></p>
</div></p>

29 Mar 2014, 04:02

Emacsでrubydbを利用してステップ実行する

ruby-debugについて

Rubyには、debugというデバッカが標準ライブラリとしてついている。

これをつかうと、gdbのようなステップ実行ができる。

使い方

<div class="outline-text-3" id="text-1-1">
  <p>
    コンソールから以下のように入力する。
  </p>

  <pre><code>ruby -rdebug [filename]

  <p>
    (rdb:1)というコンソールが現れて、入力待ちになる。操作方法は以下のとおり。
  </p>

  <p>
    ステップ実行関連のコマンドは以下。ほぼgdbですね。
  </p>

  <pre><code>  

b[reak] [file:|class:][line|method] b[reak] [class.][line|method] set breakpoint to some position

wat[ch] [expression] set watchpoint to some expression

b[reak] list breakpoints

del[ete][ nnn] delete some or all breakpoints

c[ont] run until program ends or hit breakpoint s[tep][ nnn] step (into methods) one line or till line nnn n[ext][ nnn] go over one line or till line nnn l[ist][ (-|nn-mm)] list program, - lists backwards

q[uit] exit from debugger r[estart] restart program

  <p>
    個人的には、このへんの値参照が役立ちそう。
  </p>

  <pre><code>

v[ar] g[lobal] show global variables v[ar] l[ocal] show local variables v[ar] i[nstance] [object] show instance variables of object v[ar] c[onst] [object] show constants of object

  <p>
    あとは、watchコマンドとdispコマンドを組み合わせたのがよさそう。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://d.hatena.ne.jp/takihiro/20100404/1270370312">http://d.hatena.ne.jp/takihiro/20100404/1270370312</a>
    </li>
  </ul>
</div></p>

Emacsといっしょにつかう

Emacsようのelispをつかうと、実行中のステップがEmacsから見ることができる。

elispはRubyのソースコードのmiscディレクトリのなかにある。

rubydb3x.elとrubydb2x.eclが入っているけれど,rubydx2x.elは19.2x以前向けなので,3xを使用する。

rubydb3x.elをロードパスが通った場所において、init.elに以下を追加。

(autoload 'rubydb "rubydb3x" "run rubydb on program file in buffer" t)

これで、M-x rubydbをおすとデバッガが起動する。

ヘルプコマンドから抜きだし

<div class="outline-text-3" id="text-2-1">
  <pre><code>Commands

b[reak] [file:|class:][line|method] b[reak] [class.][line|method] set breakpoint to some position wat[ch] [expression] set watchpoint to some expression catch set catchpoint to an exception b[reak] list breakpoints cat[ch] show catchpoint del[ete][ nnn] delete some or all breakpoints disp[lay] [expression] add expression into display expression list undisp[lay][ nnn] delete one particular or all display expressions c[ont] run until program ends or hit breakpoint s[tep][ nnn] step (into methods) one line or till line nnn n[ext][ nnn] go over one line or till line nnn w[here] display frames f[rame] alias for where l[ist][ (-|nn-mm)] list program, - lists backwards nn-mm lists given lines up[ nn] move to higher frame down[ nn] move to lower frame fin[ish] return to outer frame trace set trace mode of current thread trace all set trace mode of all threads q[uit] exit from debugger v[ar] g[lobal] show global variables v[ar] l[ocal] show local variables v[ar] i[nstance] [object] show instance variables of object v[ar] c[onst] [object] show constants of object m[ethod] i[nstance] [obj] show methods of object m[ethod] [class|module] show instance methods of class or module th[read] l[ist] list all threads th[read] c[ur[rent]] show current thread th[read] [sw[itch]] [nnn] switch thread context to nnn th[read] stop [nnn] stop thread nnn th[read] resume [nnn] resume thread nnn pp expression evaluate expression and pretty_print its value p expression evaluate expression and print its value r[estart] restart program h[elp] print this help

26 Mar 2014, 16:42

インフラ業界の気になるキーワードについて調べてみた

インフラ業界の技術動向について調べてみたブックマークとキーワード集。

なんだか、調べれば調べるほどインフラまわりが熱いということがわかった。

Run Book Automation(RBA)

構築手順を示したドキュメントを英語ではRun Bookと読んでいる。

ドキュメントは、Excelベースのパラメータシートで管理されることが多い。

そして、そのパラメータシートにしたがった手順を自動したものを Run Book Automationという。

別記事として独立。

Code as Infrastructure

<div class="outline-text-2" id="text-2">
  <p>
    Code as Infrastructure、訳すと、インフラストラクチャーとしてのコード。
  </p>

  <p>
    インフラ構築、管理の手順をコードとして扱う概念。<br /> Excel管理の手順書からスクリプトを実行するのではなくて、初めからコードとして手順を記述する。
  </p>

  <blockquote>
    <p>
      インフラストラクチャのコンフィグレーションがスクリプトやファイルによって記述され、バージョン管理されており、その変更が自動的にデータセンターに反映されるやり方を指す。
    </p>
  </blockquote>

  <ul class="org-ul">
    <li>
      <a href="http://www.publickey1.jp/blog/11/rubyjavascriptthoughtworks.html">プログラマブルなインフラ、Ruby、JavaScriptなどが重要なテクノロジと評価される。ThoughtWorksのレポート - Publickey</a>
    </li>
  </ul>

  <p>
    Infrastructure as Code と呼ばれている場合もある。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://d.hatena.ne.jp/naoya/20131215/1387090668">Infrastructure as Code &#8211; naoyaのはてなダイアリー</a>
    </li>
  </ul>

  <blockquote>
    <p>
      単にサーバー構成変更を自動化しましょうという話ではなく、<br /> インフラをすべてソフトウェアとして、<br /> コードで扱うことでアプリケーション開発で行われてきたいろいろな<br /> &#8220;ワークフロー&#8221; をインフラ作業の世界にも導入しましょうねと、そういうことであります
    </p>
  </blockquote>

  <p>
    ニュアンスとして、RBAよりも、よりソフトウェア開発的な文化を感じる。
  </p>

  <ul class="org-ul">
    <li>
      手順書をコードとして扱う。
    </li>
    <li>
      コードレビューする。
    </li>
    <li>
      コードをバージョン管理する。
    </li>
  </ul>

  <p>
    そういえば、こんな本も最近本やで見かけた。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.amazon.co.jp/%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-~%E5%AE%89%E5%AE%9A%E7%A8%BC%E5%8B%95%E3%81%AB%E5%B0%8E%E3%81%8F127%E3%81%AE%E8%A8%AD%E8%A8%88%E6%96%B9%E5%BC%8F-WEB-PRESS-plus/dp/4774162868">Amazon.co.jp: インフラデザインパターン ~安定稼動に導く127の設計方式 (WEB+DB PRESS plus): 株式会社NTTデータ, 杉原 健郎, 吉田 一幸, 岩崎 賢治, 三浦 広志, 吉田 佐智男: 本</a>
    </li>
  </ul>
</div>

<div class="outline-3" id="outline-container-sec-2-1">
  <h3 id="sec-2-1">
    Puppet/Chef
  </h3>

  <div class="outline-text-3" id="text-2-1">
    <p>
      このCode as Infrastructureという概念を実現するツールが、PuppetやChef。
    </p>

    <p>
      Puppet/Chefは、先に書いたRBA本に紹介されている。Chef専用の解説本もKindleで購入できるので、さっそく買った。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://www.amazon.co.jp/%E5%85%A5%E9%96%80Chef-Solo-Infrastructure-as-Code-ebook/dp/B00BSPH158">Amazon.co.jp: 入門Chef Solo &#8211; Infrastructure as Code eBook: 伊藤直也: Kindleストア</a>
      </li>
    </ul>
  </div>
</div>

Test-Driven Infrastructure

<div class="outline-text-2" id="text-3">
  <p>
    ソフトウェア開発のようにインフラを構築するという潮流の中、<br /> Test Driven Developmentのようにインフラを構築しようというのがこの概念。
  </p>

  <p>
    本も最近第2藩としてリニューアルされたようだ。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://shop.oreilly.com/product/0636920030973.do">Test-Driven Infrastructure with Chef, 2nd Edition &#8211; O&#8217;Reilly Media</a>
    </li>
  </ul>
</div>

<div class="outline-3" id="outline-container-sec-3-1">
  <h3 id="sec-3-1">
    ServerSpec
  </h3>

  <div class="outline-text-3" id="text-3-1">
    <p>
      サーバに対する設定をRSpecのようにテストしながら実施するためのツール。
    </p>

    <p>
      まさに、TDDをインフラに当てはめたツール。
    </p>
  </div>
</div>

<div class="outline-3" id="outline-container-sec-3-2">
  <h3 id="sec-3-2">
    RRRSpec
  </h3>

  <div class="outline-text-3" id="text-3-2">
    <p>
      数日前に現れたRRRSpecもなかなかよさそうな予感を感じるのでとりあえずブックマーク。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://techlife.cookpad.com/2014/03/24/rrrspec/">分散テスト実行システムRRRSpecをリリースしました | クックパッド開発者ブログ</a>
      </li>
    </ul>
  </div>
</div>

Blue-Green Deployment

<div class="outline-text-2" id="text-4">
  <p>
    稼働しているシステム(Blue)と待機しているシステム(Green)の2つを用意する。
  </p>

  <p>
    両者はルータで接続されていて、いつでも切り替えられる。
  </p>

  <p>
    デプロイは、ルータを切り替えることでダウンタイムを最小にしつつ、<br /> システムを切り替えることで実現する。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://martinfowler.com/bliki/BlueGreenDeployment.html">BlueGreenDeployment</a>
    </li>
  </ul>

  <p>
    &#8211;<a href="http://www.publickey1.jp/blog/14/blue-green_deployment.html">「Blue-Green Deployment」とは何か、マーチン・ファウラー氏の解説 - Publickey</a>
  </p>
</div>

Immutable Infrastructure

<div class="outline-text-2" id="text-5">
  <p>
    2014年現在、もっとも熱いキーワード。このキーワードを今年一年はWatchしようと思ってる。
  </p>

  <p>
    最近、立て続けにカンファレンスが開かれたようだ。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://dev.classmethod.jp/cloud/immutable-infrastructure-conference-no-1/">Immutable Infrastructure Conference #1 に参加してきた #immutableinfra | Developers.IO</a>
    </li>
  </ul>

  <p>
    Immutableとは、不変性。
  </p>

  <p>
    インフラを一度構築したらその設定が変更されていないことを保証する考え方。
  </p>

  <p>
    サーバに変更が必要になったら、運用中のサーバには触らない。<br /> コードに変更を加えて、新規にサーバを構築しなおす。<br /> そして、いらなくなったらサーバを破棄する。
  </p>

  <p>
    Immuabilityは、仮想化技術が大前提。<br /> サーバをつくったり、捨てたりといったことは仮想化技術があるからこそできる。
  </p>
</div>

<div class="outline-3" id="outline-container-sec-5-1">
  <h3 id="sec-5-1">
    Vagrant
  </h3>

  <div class="outline-text-3" id="text-5-1">
    <p>
      手軽に仮想化環境を手に入れるツールが、vagrant。<br /> vargrantとは、仮想環境をコマンドラインから操作することができるオープンソースRubyスクリプト。
    </p>

    <p>
      仮想環境はいくらでもこわし放題、手軽になんどでも構築できる。
    </p>

    <p>
      去年はvagrantの登場と盛り上がりによって、インフラ界隈の話題により火がついたように見えた。
    </p>

    <p>
      Vagrantについては去年自分でもちょっと遊んでた。なつかしいね、今となっては挫折したけど。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://futurismo.biz/archives/1651">vagrantがスゲエ!コマンドラインからVirtualBoxを自由自在に操る方法 | Futurismo</a>
      </li>
      <li>
        <a href="http://futurismo.biz/archives/1660">仮想環境を破壊しまくっても大丈夫だ、問題ない。vagrantプラグイン『sahara』 | Futurismo</a>
      </li>
      <li>
        <a href="http://futurismo.biz/archives/1667">ミライの組込み開発!vagrant × sahara × minitestで実現する仮想エンドツーエンドテスト | Futurismo</a>
      </li>
    </ul>
  </div>
</div>

<div class="outline-3" id="outline-container-sec-5-2">
  <h3 id="sec-5-2">
    links
  </h3>

  <div class="outline-text-3" id="text-5-2">
    <p>
      ブックマークも大量リンク。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://www.slideshare.net/YukihikoSawanobori/jawsdays-infra">Infrastructure as Codeと 組織のドキュメンテーション + Immutable Infrastructure事例</a>
      </li>
      <li>
        <a href="https://speakerdeck.com/naoya/immutable-infrastructuregakai-fa-purosesuniyu-eruying-xiang-jia-number-immutableinfra">Immutable Infrastructureが開発プロセスに与える影響(仮) #immutableinfra // Speaker Deck</a>
      </li>
      <li>
        <a href="http://www.nttdata.com/jp/ja/insights/trend_keyword/2013122601.html">Immutable Infrastructure~デプロイメントをめぐるシステムインフラの管理~ | NTTデータ</a>
      </li>
      <li>
        <a href="http://apatheia.info/blog/2013/08/10/immutable-infrastructure/">Immutable Infrastracture について &#8211; apatheia.info</a>
      </li>
      <li>
        <a href="http://blog.stanaka.org/entry/2013/12/01/092642">2014年のウェブシステムアーキテクチャ &#8211; stanaka&#8217;s blog</a>
      </li>
      <li>
        <a href="http://qiita.com/kasaharu/items/654d20dbea935438de78">Immutable_Infrastructure &#8211; Immutable Infrastructure 【インフラ環境もソースコード管理しよう】 &#8211; Qiita</a>
      </li>
    </ul>
  </div>
</div>

その他の用語

<div class="outline-text-2" id="text-6">
</div>

<div class="outline-3" id="outline-container-sec-6-1">
  <h3 id="sec-6-1">
    idempotence(べき等性)と immutability(不変性)
  </h3>

  <div class="outline-text-3" id="text-6-1">
    <p>
      べき等性とは、同じサーバに何度も chef/puppet 実行を繰り返しても、<br /> 同じ結果が得られることが保証されるという性質。Puppet や Chefの理念。
    </p>

    <p>
      不変性とは、システムが自動的に生成され、<br /> その時点からいちども変更されていないことが保証されている性質。<br /> 関数型プログラミングのパラダイムが影響を与えている。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://blog.mirakui.com/entry/2013/11/26/231658">今さら聞けない Immutable Infrastructure &#8211; 昼メシ物語</a>
      </li>
    </ul>
  </div>
</div>

<div class="outline-3" id="outline-container-sec-6-2">
  <h3 id="sec-6-2">
    ConfigurationとOrchestration
  </h3>

  <div class="outline-text-3" id="text-6-2">
    <p>
      Configurationは、 いわゆる構成管理ツール。<br /> サーバにたいしてツールを入れたり設定したりすること。
    </p>

    <p>
      それにたいし、Orchestrationとは、<br /> 複数のモジュール(サーバ、ストレージ、スイッチ)が組み合わさったシステムに<br /> ついての設定をしたりすること。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://wslash.com/archives/=5216">今年流行りそうな「インフラエンジニア」向けトレンドのまとめ その1 (Blue-Green DeploymentとImmutable Infrastructure編)</a>
      </li>
    </ul>

    <p>
      サーバの構築をprovisioningという大きな用語でとらえ、<br /> さらにそれを以下の3つに分類する言い方もある。
    </p>

    <ul class="org-ul">
      <li>
        Provisioning <ul class="org-ul">
          <li>
            Bootstrapping … OSインストール
          </li>
          <li>
            Configuration … サーバ単体構築
          </li>
          <li>
            Orchestration … システム構築
          </li>
        </ul>
      </li>

      <li>
        <a href="http://mizzy.org/blog/2013/10/29/1/">インフラ系技術の流れ &#8211; Gosuke Miyashita</a>
      </li>
      <li>
        <a href="http://mizzy.org/blog/2014/02/14/1/">Developers Summit 2014 で「サーバプロビジョニングのこれまでとこれから」という発表を行いました &#8211; Gosuke Miyashita</a>
      </li>
    </ul>
  </div>
</div>

<div class="outline-3" id="outline-container-sec-6-3">
  <h3 id="sec-6-3">
    Amazon と Google/ AWS と MVM
  </h3>

  <div class="outline-text-3" id="text-6-3">
    <p>
      2013年にAmazonが AWSという仮想化サービスを開始した。<br /> それに対抗するようにGoogleが Managed Virtual Machinesというサービスをスタートさせた。
    </p>

    <p>
      Amazon vs Googleという対立構造になるのだろうか??
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://aws.amazon.com/jp/">クラウドコンピューティング なら アマゾン ウェブ サービス | 仮想サーバー、ストレージ、データベースのための Amazon のクラウドプラットフォーム(AWS 日本語)</a>
      </li>
      <li>
        <a href="http://www.publickey1.jp/blog/14/googleawsbigquery75.html">[速報]Google、AWS対抗をあらわにした値下げと新価格体系を発表。継続利用で自動値引き - Publickey</a>
      </li>
      <li>
        <a href="http://www.publickey1.jp/blog/14/googlemanaged_virtual_machinesgoogle_app_engine.html">[速報]Google、「Managed Virtual Machines」発表。Google App Engine内で仮想マシンを管理 - Publickey</a>
      </li>
    </ul>
  </div>
</div>

まとめ

<div class="outline-text-2" id="text-7">
  <p>
    今までの用語をまとめた自分の中でのイメージは以下のような感じ。
  </p>

  <p>
    ・・・
  </p>

  <p>
    インフラ構築のためのテストコードを書いて、<br /> vagrantのような仮想環境を用いてそのテストを検証する。
  </p>

  <p>
    TDDの小さなサイクルを繰り返しつつ、着実に手順を構築していく。
  </p>

  <p>
    仮想環境によってなんどもなんども手順がテストされて安全性が高まる。
  </p>

  <p>
    そして、本番のインフラ構築では十分仮想環境で検証したテストコードによって<br /> 自動でインフラが構築される。
  </p>

  <p>
    構築されたインフラは構築時から変更されていないことが保証されている。
  </p>

  <p>
    なにか不具合があれば、その環境を破棄してまた一から作り直す。
  </p>
</div>

26 Mar 2014, 11:52

Run Book Autmationとはなにかについて調べてみた

Run Book Autmationというキーワードについてまとめてみました。

Run Book Automation

この記事を書くきっかけになったのが、以下の本を買ったからです。

Run Book Automation(RBA)とは

構築手順を示したドキュメントを英語ではRun Bookと読んでいる。

Excelで設定項目に応じてパラメータシートを作成することが多い。以下、RBA本からの抜粋。

  • 構築の順序
  • 実際に投入するコマンドとそのパラメータ
  • 実際に操作するGUIオペレーション
  • コマンドの正常性確認方法
  • エラーの確認方法
  • エラーへの対処方法
  • 関係者に対する確認事項
  • 確認方法

そして、そのパラメータシートの自動化を Run Book Automationという。

各サイトからの引用とブックマーク

<div class="outline-text-3" id="text-2-1">
  <blockquote>
    <p>
      Run Book Automation (RBA) is the ability to define, build, orchestrate,<br /> manage and report on workflows that support system<br /> and network operational processes.
    </p>
  </blockquote>

  <ul class="org-ul">
    <li>
      <a href="http://en.wikipedia.org/wiki/Runbook">Runbook &#8211; Wikipedia, the free encyclopedia</a>
    </li>
  </ul>

  <blockquote>
    <p>
      ITの運用におけるマルチベンダーをまたいだ複雑な処理を、<br /> 1つのプロセスとして定義し、それを自動化していくこと。
    </p>
  </blockquote>

  <ul class="org-ul">
    <li>
      <a href="http://news.mynavi.jp/column/hyper-vcloud/002/">運用の効率化を考えていたらプライベートクラウドになった! (2) 注目を浴びるRunbook &#8211; 自動化のカギを握るテクノロジーと仮想化のツツキ方 | マイナビニュース</a>
    </li>
  </ul>

  <blockquote>
    <p>
      サーバー仮想化ソフトなどのインフラ管理製品には運用自動化機能が実装されつつあるが、<br /> ストレージやネットワークなど、他のシステム構成要素を含めた管理や、<br /> 運用プロセスの統合的な自動化ができないのが現状だ。<br /> そこで注目を集めているのが、<br /> IT運用管理に関するプロセスを自動化する「ランブック自動化(RBA)」である
    </p>

    <p>
      RBAを一言で言うと、従来のワークフローツールに、<br /> 既存の様々なIT運用管理ツール/機能との連携機能を組み入れた、<br /> IT運用管理自動化の仕組みを実現するテクノロジ
    </p>
  </blockquote>

  <ul class="org-ul">
    <li>
      <a href="http://it.impressbm.co.jp/e/2011/01/24/3281">IT運用管理プロセスを自動化し、ビジネス変化の速さに備えるRBA | IT Leaders</a>
    </li>
  </ul>

  <blockquote>
    <p>
      2011年現在、企業情報システムの運用管理の世界では、大きな変化が起こっている。<br /> 日々の運用作業から複数のシステムや部門をまたぐ運用プロセス、<br /> そしてリソースなどの制御を自動実行すること、<br /> すなわち「運用の自動化」が、急速に浸透している。
    </p>
  </blockquote>

  <ul class="org-ul">
    <li>
      <a href="http://itpro.nikkeibp.co.jp/article/Active/20111107/372843/">ITオペレーション(運用)の自動化(1)&#x2014;クラウド運用は自動化が大前提に &#8211; ガートナー直伝!IT導入ワン&#x2026;:ITpro Active</a>
    </li>
  </ul>

  <blockquote>
    <p>
      仮想サーバ環境なら簡単にできてしまうからだ、<br /> その結果、何が起こるか。仮想サーバの乱立だ。
    </p>

    <p>
      仮想化対応のポイントは「監視」と「制御」
    </p>
  </blockquote>

  <ul class="org-ul">
    <li>
      <a href="http://www.itmedia.co.jp/im/articles/1009/15/news118.html">特集:仮想化構築・運用のポイントを探る(5):“自動化”は仮想化運用管理の救世主 (1/2) &#8211; ITmedia エンタープライズ</a>
    </li>
  </ul>
</div></p>

感想

この言葉は最近では話題になっていないようで、一世代前のバズワードのように見える。

運用、監視、仮想化がキーワードのようだ。

RBA本の読書メモ

せっかくなので、書評も書いておく。

23 Mar 2014, 09:53

クールなオブジェクト指向言語 Coolを Linux Mintにインストール

Coolは、Classroom object Oriented Languageの略。

文字通り、教育用オブジェクト指向言語。

courseraで始まったCompilerの講義でつかう。この言語で、コンパイラの仕組みを学ぶ。

Linux Mintにインストールしたメモです。

環境

  • Linux Mint 16

インストール

まずは、依存ライブラリをインストール。


sudo apt-get install flex bison build-essential csh openjdk-6-jdk libxaw7-dev

つづいて、Coolをインストール。


sudo mkdir /usr/class
sudo chown $USER /usr/class
cd /usr/class
wget http://spark-university.s3.amazonaws.com/stanford-compilers/vm/student-dist.tar.gz
tar -xf student-dist.tar.gz
ln -s /usr/class/cs143/cool ~/cool

最後にパスを通す。


export PATH=/usr/class/cs143/cool/bin:$PATH

Hello Cool

お決まりのHello Worldをしてみる。

といっても、/usr/class/cs143/examples/hello_world.cl にサンプルがある。


class Main inherits IO {
   main(): SELF_TYPE {
        out_string("Hello, World.\n")
   };
};

コンパイルして実行。


$ cp /usr/class/cs143/examples/hello_world.cl .
$ coolc hello_world.cl
$ spim hello_world.s
SPIM Version 6.5 of January 4, 2003
Copyright 1990-2003 by James R. Larus (larus@cs.wisc.edu).
All Rights Reserved.
See the file README for a full copyright notice.
Loaded: /usr/class/cs143/cool/lib/trap.handler
Hello, World.
COOL program successfully executed
Stats -- #instructions : 152
         #reads : 27  #writes 22  #branches 28  #other 75

Emacs mode

こんなのがあるらしい。未検証だけど、リンクだけはっておく。