03 May 2014, 09:53

[Coursera]Web Application Archtecturesを受講しました

CourseraでWeb Application Archtecturesを受講しました。

Motivation

ちょうど仕事でもRubyを使い始めたときだった。

Rubyのキラーアプリ。Railsに触れる、”チャンス”と思ってやってみた。

Course

Lecture

<div class="outline-text-3" id="text-2-1">
  <p>
    Railsをあつかいながら、ウェブアーキテクャチャを学ぶ講義。
  </p>

  <p>
    スライドでいろいろと概念が説明されたあとに、 コンソール画面で実際にコーディングする進め方。 毎週少しずつ、ブログサービスを作成する。(イテレーション)
  </p>

  <p>
    内容もそうだが、動画がおもしろい。画面を先生がいろいろと飛び回る!
  </p>

  <p>
    上から下からGreg先生がスライドインしてきたり、先生が巨人になったり小人になったり・・・ (一度だけ、2人に分身して表示された!)。この人は動画編集で遊んでるなと思った。
  </p></p>
</div></p>

Assignment

<div class="outline-text-3" id="text-2-2">
  <p>
    4つのAssignmentがだされる。 講義の内容を自分でも手を動かして真似するだけなので、とても簡単。だれでもできる。
  </p>

  <p>
    完成したら、git commit してbitbucketにpushする。 そうすると、それをトリガとしてRSpecで自動採点されるという仕組み。
  </p>

  <p>
    自分の宿題repositoryは以下。
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://bitbucket.org/tsu-nera/coursera-webapplications-assignment">https://bitbucket.org/tsu-nera/coursera-webapplications-assignment</a>
    </li>
  </ul>
</div></p>

Contents

<div class="outline-text-3" id="text-2-3">
  <p>
    期間が6weekということで、広く浅くという内容だ。
  </p>

  <p>
    Railsというのは、ウェブを学ぶための手段だった。 実際は、Railsをつかってインターネットやウェブの歴史と技術が紹介された。
  </p>

  <p>
    git, Agileに関わる開発手法、Rubyもあわせて学べる。 また、言語もRubyだけではなくて、HTMLやCSS, JQueryなどなど。幅広い。
  </p>

  <p>
    Web開発に関わるいろんな知識がたくさんでてくる。
  </p></p>
</div>

<div id="outline-container-sec-2-3-1" class="outline-4">
  <h4 id="sec-2-3-1">
    Webの発展
  </h4>

  <div class="outline-text-4" id="text-2-3-1">
    <p>
      まずは、Webの歴史が紹介される。
    </p>

    <ul class="org-ul">
      <li>
        Web1.0 ・・・クライアントは静的ページをWebサーバから取得する。ウェブページ。ウェブを読む。
      </li>
      <li>
        Web2.0 ・・・クライアント/サーバ側で動的にページを作成する。ウェブサービス。ウェブを使う。
      </li>
      <li>
        Web3.0 ・・・クライアントごとがつながりあう。データの上のメタデータをあつかう。 <ul class="org-ul">
          <li>
            クラウドコンピューティング ・・・あらゆるデバイスがネットにつながる。
          </li>
          <li>
            セマンティックウェブ ・・・ビックデータの統計解析から価値を生み出す。 <p>
              <a href="http://dmtc.jp/magazine/archives/=1461">迫り来るWeb3.0時代を生き抜くエンジニアが持たなければいけない3つの視点 | DMTC Magazine</a>
            </p>
          </li>
        </ul>
      </li>
    </ul>
  </div></p>
</div>

<div id="outline-container-sec-2-3-2" class="outline-4">
  <h4 id="sec-2-3-2">
    Web Archtecture
  </h4>

  <div class="outline-text-4" id="text-2-3-2">
    <p>
      概ね、以下のようなアーキテクチャの各部分を、各週に分けて説明される。
    </p>

    <div class="org-src-container">
      <pre class="src src-language">  Web Client
  |

(NetWork) | Web Server | Script/Service | (Connector) | DataBase

    <p>
      Railsということで、MVCアーキも随所随所で強調される。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://ja.wikipedia.org/wiki/Model_View_Controller">Model View Controller &#8211; Wikipedia</a>
      </li>
    </ul>
  </div></p>
</div>

<div id="outline-container-sec-2-3-3" class="outline-4">
  <h4 id="sec-2-3-3">
    Database Layer
  </h4>

  <div class="outline-text-4" id="text-2-3-3">
    <p>
      MVCのモデルに当たる部分。 データベースとそれをRailsからどうあつかうかを学ぶ。
    </p>

    <div class="org-src-container">
      <pre class="src src-language">Week Three – Module 3: Database Interactions

Lecture 1: Relational Databases Lecture 2: Databases in Rails Lecture 3: The Active Record Design Pattern

    <p>
      ブログの記事とコメントの関係をMySQLをつかって説明される。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://ja.wikipedia.org/wiki/%E9%96%A2%E4%BF%82%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9">関係データベース &#8211; Wikipedia</a>
      </li>
    </ul>

    <p>
      モデル層で、データのValidateをチェックする役割も紹介される。
    </p></p>
  </div></p>
</div>

<div id="outline-container-sec-2-3-4" class="outline-4">
  <h4 id="sec-2-3-4">
    Middleware Layer
  </h4>

  <div class="outline-text-4" id="text-2-3-4">
    <p>
      MVCのコントローラに当たる部分。HTTPやそれをベースにした通信プロトコルの解説。
    </p>

    <div class="org-src-container">
      <pre class="src src-language">Week Five – Module 5: Middleware

Lecture 1: What is Middleware? Lecture 2: The Hypertext Transfer Protocol (HTTP) – Introduction Lecture 3: HTTP – Request Lecture 4: HTTP – Response Lecture 5: The Model-View-Controller (MVC) Design Pattern Lecture 6: Rails Controllers – Request Handling Lecture 7: Rails Controllers – Response Lecture 8: MVC Implementation in Rails

    <p>
      以下のような概念が紹介される。 はずかしながら、HTTPについてはじめてまともに勉強した気がした。
    </p>

    <ul class="org-ul">
      <li>
        HTTP, HTTPS(Request, Responce) <a href="http://ja.wikipedia.org/wiki/Hypertext_Transfer_Protocol">http://ja.wikipedia.org/wiki/Hypertext_Transfer_Protocol</a>
      </li>
    </ul>

    <p>
      REST, SOAPは未だにわからないな。。。
    </p>

    <ul class="org-ul">
      <li>
        REST-based, Restful, <a href="http://ja.wikipedia.org/wiki/REST">http://ja.wikipedia.org/wiki/REST</a>
      </li>
      <li>
        RPC-based, SOAP <a href="http://ja.wikipedia.org/wiki/SOAP_(%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB)">SOAP (プロトコル) &#8211; Wikipedia</a>
      </li>
    </ul>
  </div></p>
</div>

<div id="outline-container-sec-2-3-5" class="outline-4">
  <h4 id="sec-2-3-5">
    Presentation Layer
  </h4>

  <div class="outline-text-4" id="text-2-3-5">
    <div class="org-src-container">
      <pre class="src src-language">Week Six – Module 6: Presentation/User Interface

Lecture 1: Introduction and Background Lecture 2: HTML – Basic Syntax Lecture 3: HTML – Document Structure Lecture 4: HTML – Forms Lecture 5: Dynamic Content Lecture 6: Cascading Style Sheets (CSS) Lecture 7: JavaScript and jQuery Lecture 8: Ajax

    <p>
      Presentation Layerの構成要素は以下。
    </p>

    <ul class="org-ul">
      <li>
        HTML(構造)
      </li>
      <li>
        CSS(表現)
      </li>
      <li>
        JavaScript(動作)
      </li>
    </ul>

    <p>
      これらは絶対に、絶対に、絶対に、分けなければいけないと強調される。
    </p></p>
  </div></p>
</div></p>

感想

今まで漠然と知っていたことを、改めて学び直した気がする。

このブログもWordPressでできており、 ブログの改造をすることでHTMLやCSS,JavaScriptをつかったこともあったが、 それらの役割や関わりを基礎からおさえられた気がした。

もっとウェブサービスを理解したいと思って、こんな本も購入してみた。

02 May 2014, 02:23

CleanCodeはよいわけではない、場合によっては悪いこと

はじめに

今日からゴールデンウィーク初日!

仕事のほうも2月から3ヶ月間続いたプロジェクトが一区切りだ。

過去のブログ記事と関連づけながら、ここで振り返りをしてみる。

[toc]

前提

<div class="outline-text-3" id="text-1-1">
  <p>
    このプロジェクトに入る前は、精神的につぶれてた。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/1998">エンジニアとプログラマの違いについて定義してみた | Futurismo</a>
    </li>
  </ul>

  <p>
    なので、1月はリハビリのために特定のプロジェクトには参加していなくて、 毎日Emacsをいじっていた。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/2146">Beautiful Colorful Terminal – Emacsターミナル環境をカラフルに彩る | Futurismo</a>
    </li>
  </ul>

  <p>
    2月になってすこしずつ元気になってきたので、 お試し開発のプロジェクトに参加することになった。
  </p>

  <p>
    お試しという意味は、まだ顧客もいなくて、 ビジネスとしてなりたつのかよくわからない、 予算の限られたトライアルプロジェクトという意味。
  </p></p>
</div></p>

よかったこと

Rubyistになった

<div class="outline-text-3" id="text-2-1">
  <p>
    そして、Rubyistになった。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/2189">Rubyistになった日 | Futurismo</a>
    </li>
  </ul>

  <p>
    以前から、いつか仕事でRubyがつかえたらいいなと漠然と心に抱いていたので、 これはうれしかった。
  </p>

  <p>
    RubyTkをつかったGUIアプリケーションの開発がまかされた。
  </p>

  <p>
    わからないことが毎日あったが、 お金がないから残業できないので、その分は定時後にスタバにこもって勉強した。
  </p>

  <p>
    どうでもいいRubyTk関連の記事の投稿をこのブログにも怒涛のごとくしてた。
  </p></p>
</div></p>

Excel VBAをみにつけた

<div class="outline-text-3" id="text-2-2">
  <p>
    Rubyistとしてワクワクしている月日は1.5ヶ月くらいで終わった。 それからExcel VBAer?になった。
  </p>

  <p>
    ExcelVBA知らないけど、1日100Step、5日で完成という工程。 かなり厳しいと思ったが、3日くらいで不自由なく読み書きできるようになった。 前知識としてC++,Java,Rubyがあったからだと思う。
  </p>

  <p>
    これは、正直驚き、また自信につながった。 オブジェクト指向言語ならば、他の言語もそんなに苦にならずに 身につけられるような気がした。
  </p>

  <p>
    大事なのは、パラダイムを押さえることではと思った。MOOCでこんな講座もはじめた。
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://www.edx.org/course/louvainx/louvainx-louv1-01x-paradigms-computer-1203#.U2L2PhMu2IM">LouvainX: Louv1.01x: Paradigms of Computer Programming | edX</a>
    </li>
  </ul>

  <p>
    今後は関数型プログラミングのパラダイムを身につけたい。というか、EmacsLisp書きたい!
  </p>

  <p>
    また、ExcelVBAの開発環境が貧弱すぎることも、 Eclipse大好きな僕には嫌だった。なので、ネット上に散らばったツールをrakeでまとめた。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/2395">ExcelVBA統合BDD開発環境をrakeでまとめてみた | Futurismo</a>
    </li>
  </ul>

  <p>
    この背景には、C言語のTDD開発環境ceedlingに感動した体験がある。 Rubyがすごいと思いはじめ、Rubyがやりたくなったのもこの体験があったから。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/1498">Rubyで書かれた統合C言語TDD開発環境 「Ceedling」 がけっこう便利そうな件 | Futurismo</a>
    </li>
  </ul>
</div></p>

わるかったこと

コスト意識がなかった

<div class="outline-text-3" id="text-3-1">
  <p>
    コスト意識がなかったことが、最大の反省点。 なかったわけではなくて、あったことはあったが、もっとあるべきだった。
  </p>

  <p>
    だんだんとまわりから、
  </p>

  <p>
    「これは売り物になるの?iPhoneアプリつくったほうが儲かるんじゃないの?」
  </p>

  <p>
    という実は真実の脅しうけてビクビクしたり、
  </p>

  <p>
    「じつはこのプロジェクトはXX万の予算を投入したんだよね」
  </p>

  <p>
    とぷよぷよされて、プロジェクト参加前に比べて精神が悪化したりした。 しかし、今までコスト意識があまりなかったので、
  </p>

  <p>
    これはよいことなのだと自虐的に受け止めた。
  </p></p>
</div></p>

CleanCodeは悪

<div class="outline-text-3" id="text-3-2">
  <p>
    予算も限られていてかけられる工数が少なかったが、 プログラミングに凝りすぎたことが最大の反省点。
  </p>

  <p>
    具体的には、クラスの依存関係を弱くしたり、小さいメソッドやクラスを書いていた。 以下のようなカルチャーショックの直後だったので、これが今思い返せば悪影響していた。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://futurismo.biz/archives/2200">散文的ブログラミングの哲学につら抜かれたCleanCodeでカルチャーショック体験 | Futurismo</a>
    </li>
  </ul>

  <p>
    自分に求められていたのは、モジュール分割がされていないモンスターメソッドであり、 インスタンスはグローバル変数で保持するような密結合の設計だった。
  </p>

  <p>
    結果的に、予定よりも遅れてしまった。これだけが原因ではなくて、見積りも悪かったのもあるけど。
  </p>

  <p>
    綺麗なコードを書くことを心がけていたが、 その価値観をすこしあらためないといけないと思った。 TDDはよいという価値観も今回の開発でかわった気がする。
  </p>

  <p>
    もちろん、きれいなコードはそれはそれでよいことだし、TDDも素晴らしい。 しかし、仕事はお金稼ぎでやっているので、 綺麗なコードがお金稼ぎにつながるかを考えないといけないと思った。
  </p>

  <p>
    プロジェクトを航海にたとえれば、 ひとりでパンを食べまくった結果、食料がつきて、 目的地にたどり着く前に全員餓死しちゃうような状況。なんて傲慢なんだろう!
  </p>

  <p>
    場合によりけりだとおもうが、 今回のプロジェクトでは綺麗なコードは悪いことだと思ったのが今日の日記の結論。
  </p>

  <p>
    ゴールデンウィーク初日からうつうつだが、 思うところはここに吐き出したので、忘れてリフレッシュしよっと。
  </p></p>
</div></p>

27 Apr 2014, 06:18

org-mode で書いたテキストを Pandoc で Restructured Text に変換する

やりたいこと

org-mode で書いたテキストを Restructured Text に変換したい.

Pandoc を利用すると, org-mode の文章を変換することができる.

[sourcecode language=”text” title=””]
入力 (org-mode) -> 変換 (Pandoc) -> 出力 (Restructured Text)
[/sourcecode]

Pandoc をつかう

Pandoc とは, 汎用的なドキュメント変換ツール. ある形式から別の形式へドキュメントの形式を変換できる.

org-mode の writer は以前からあったが, reader は最近ようやく pull request された.

ということで, 最新の Pandoc を試してみる. github からダウンロード.

pandoc は haskell でかかれてるので, ビルドには haskell がひつよう.

以下を順々に実施.

[sourcecode language=”bash” title=””]
$ cabal update
$ cabal install pandoc
$ pandoc -v
pandoc 1.12.3.3
Compiled with texmath 0.6.6.1, highlighting-kate 0.5.6.1.
[/sourcecode]

実験

<div class="outline-text-3" id="text-unnumbered-3">
  <p>
    これがゴール.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221;]<br /> Hello Sphinx<br /> ============
  </p>

  <p>
    テスト.
  </p>

  <p>
    テスト<br /> ======
  </p>

  <p>
    テストです.<br /> [/sourcecode]
  </p>

  <p>
    これを変換する.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221;]<br /> * Hello Sphinx
  </p>

  <p>
    テスト.
  </p>

  <p>
    * テスト
  </p>

  <p>
    テストです.<br /> [/sourcecode]
  </p>

  <p>
    変換はコマンドラインから以下を実行
  </p>

  <p>
    [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221;]<br /> pandoc -f rst hello2.org<br /> [/sourcecode]
  </p>

  <p>
    こうなった.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221;]<br /> &#8211; Hello Sphinx
  </p>

  <p>
    テスト.
  </p>

  <p>
    &#8211; テスト
  </p>

  <p>
    テストです.<br /> [/sourcecode]
  </p>

  <p>
    箇条がきではなくて, 見出しなのだが. . . 今後に期待ということで.
  </p>
</div>

org-pandoc をつかう

org-pandoc をというツールをつかっても, panodc に対応した色々なフォーマットに変換できる.

仕組みは, 一度 org-mode から markdown に変換して, markdown を pandoc にかけるというもの.

実験

<div class="outline-text-3" id="text-unnumbered-5">
  <p>
    変換には, 以下を評価したあとに, M-x org-pandoc-export-to-pandoc 実 行.
  </p>

  <p>
    [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221;]<br /> (require &#8216;ox-pandoc)<br /> (setq org-pandoc-export-format &#8216;rst)<br /> [/sourcecode]
  </p>

  <p>
    こうなった.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221;]<br /> ======<br /> hello2<br /> ======
  </p>

  <p>
    :Author: tsu-nera
  </p>

  <p>
    .. raw:: html
  </p>

  <p>
    <div id="table-of-contents"><br /> \<h2\>
  </p>

  <p>
    Table of Contents
  </p>

  <p>
    .. raw:: html
  </p>

  <p>
    \</h2\><br /> <div id="text-table-of-contents"><br /> <ul><br /> <li>
  </p>

  <p>
    1. Hello Sphinx
  </p>

  <p>
    .. raw:: html
  </p>

  <p>
    </li><br /> <li>
  </p>

  <p>
    2. テスト
  </p>

  <p>
    .. raw:: html
  </p>

  <p>
    </li><br /> </ul><br /> </div><br /> </div>
  </p>

  <p>
    Hello Sphinx<br /> ============
  </p>

  <p>
    テスト.
  </p>

  <p>
    テスト<br /> ======
  </p>

  <p>
    テストです.<br /> [/sourcecode]
  </p>

  <p>
    ヘッダによけいなものがたくさんつくものの, default pandoc よりいいな.
  </p>
</div>

org-mode から markdown 経由で reST へ変換する

Markdown から reST への変換は いろいろな人がチャレンジして実績があるので, この道を考える.

org-mode には, デフォルトで markdown 変換コマンドあり. MarkDown どころか, HTML,Pandoc,LATex.. いろいろある.

詳しくは, org-export-dispatch (C-c C-e) を実行.

さっきのゴミは, emacs-export 機能のオプションを利用すれば消せた.

[sourcecode language=”text” title=””]
#+OPTIONS: toc:nil
[/sourcecode]

オプションの詳しい説明は, 以下.

コマンドラインから変換したい

<div class="outline-text-3" id="text-unnumbered-7">
  <p>
    上記の方法は, Emacs のなかで変換処理を行うのだが, 複数ファイルを処理するとするとコマンドラインから変換処理を行いたい.
  </p>

  <p>
    調べたところ, emacs には batch という機能があるようだ.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://d.hatena.ne.jp/rubikitch/20101107/org2html">org-mode → HTML 変換をする 3 つの方法 &#8211; (rubikitch loves (Emacs Ruby CUI Books))</a>
    </li>
    <li>
      <a href="http://shuzo-kino.hateblo.jp/entry/2014/01/02/012905">CLI で emacs の org-mode を使って html 化する &#8211; Bye Bye Moore</a>
    </li>
    <li>
      <a href="http://www.bookshelf.jp/texi/emacs-20.6-man-jp/emacs_32.html#SEC490">GNU Emacs マニュアル: A. コマンド行引数</a>
    </li>
  </ul>

  <p>
    batch については今回はわからなかったので, 次回に回す. 外部ライブラリまわりで苦戦.
  </p>

  <p>
    [sourcecode language=&#8221;bash&#8221; title=&#8221;&#8221;]<br /> emacs hello.org -f org-md-export-to-markdown<br /> [/sourcecode]
  </p>

  <p>
    とりあえず, なんとなくできるという道が開けた気がした.
  </p>
</div>

20 Apr 2014, 02:44

Mozartをemacsclientから起動する方法のメモ

以前、Oz用のプログラミング環境Mozartをインストールした。

この方法だと、mozart専用のEmacsがたちあがる。

できれば、今動いているemacs-serverにemacsclientでアクセスしたい。

Elispの取得

Oz用のElispを取得して、ロードパスの通った場所におく。

#!/bin/sh
wget https://raw.githubusercontent.com/mozart/mozart2/master/opi/emacs/oz.el
wget https://raw.githubusercontent.com/mozart/mozart2/master/opi/emacs/oz-extra.el
wget https://raw.githubusercontent.com/mozart/mozart2/master/opi/emacs/oz-server.el
wget https://raw.githubusercontent.com/mozart/mozart2/master/opi/emacs/mozart.el

詳細なドキュメントはここ

Elipsと環境変数の設定

設定ファイルに以下を書く。

OZHOMEに mozartをインストールしたパスを設定。PATHにその配下のbinを指定。

(or (getenv "OZHOME")
    (setenv "OZHOME" 
            "/mnt/win/opt/mozart"))   ; or wherever Mozart is installed
(setenv "PATH" (concat (getenv "OZHOME") "/bin:" (getenv "PATH")))

(add-to-list 'auto-mode-alist '("\\.oz\\'" . oz-mode))
(add-to-list 'auto-mode-alist '("\\.ozg\\'" . oz-gump-mode))
(autoload 'run-oz "oz" "" t)
(autoload 'oz-mode "oz" "" t)
(autoload 'oz-gump-mode "oz" "" t)
(autoload 'oz-new-buffer "oz" "" t)

これでもよい。

export OZHOME=/mnt/win/opt/mozart
export PATH=/opt/mozart/bin:$PATH

これで、あとは.oz拡張子がついたファイルを開けば ozモードで 編集できる。ばっちし。

Environment

<div class="outline-text-3" id="text-2-1">
  <ul class="org-ul">
    <li>
      Mint Linux 16
    </li>
    <li>
      Emacs 24.3.1
    </li>
  </ul>
</div></p>

Special Thanks

<div class="outline-text-3" id="text-2-2">
  <ul class="org-ul">
    <li>
      <a href="http://dream.inf.ed.ac.uk/computing/installed/mozart/doc/opi/node2.html">2 Invoking the OPI</a>
    </li>
    <li>
      <a href="http://www.eecs.ucf.edu/~leavens/ComS541Fall06/running_oz.shtml#">Running Oz</a>
    </li>
  </ul>
</div></p>

13 Apr 2014, 06:51

ExcelVBA統合BDD開発環境をrakeでまとめてみた

ExcelVBAで統合BDD開発環境を構築したメモです。

この記事は以下の記事の続きです。

機能

開発環境というところが指す意味は、 rakeをつかってVBA開発で役立つ機能をまとめたということです。

以下のような機能が実装済み。


rake clean    # Remove any temporary products.
rake clobber  # Remove any generated file.
rake export   # export all files to specified dir
rake hide     # Hide Excel
rake import   # import All Modules
rake open     # Open or Connect Excel File
rake release  # Make releasee excel file
rake save     # Save Excel File
rake show     # Show Excel
rake spec     # Run All Tests
rake step     # Count Steps in Project
rake vbe      # Open Visual Basic Editor for Application

rakeからExcelマクロを実行する

<div class="outline-text-3" id="text-1-1">
  <p>
    ruby の win32oleを利用して、Excelのマクロを実行するところがこのツールのキモ。
  </p>

  <pre><code>@book.run("ShowTotalCodeLinesInProject")

  <p>
    こんな感じで、runメソッドをつかって実行する。
  </p></p>
</div></p>

BDD実行エンジン

<div class="outline-text-3" id="text-1-2">
  <p>
    実は、VB Lite Unitが会社の環境では使えなかった。おそらく、Excelが64bit版なことが原因。 ということで、代替手段を探したところ、コンナツールを発見。
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/timhall/Excel-TDD">timhall/Excel-TDD</a>
    </li>
  </ul>

  <p>
    記法がRSpecに似ていて、しかも純VBAで書かれている。これを採用。
  </p>

  <p>
    これと、VBAコードの import/export機能の組み合わせによって
  </p>

  <ol class="org-ol">
    <li>
      Emacsで編集
    </li>
    <li>
      rake spec -> Excelにコードがインポートされてテスト実行
    </li>
    <li>
      イミディエイトウィンドウで結果を確認。
    </li>
    <li>
      バグってたらデバッガでステップ実行とか
    </li>
    <li>
      テストが成功したら、rake exportしてgitにcommit
    </li>
  </ol>

  <p>
    というTDDサイクルを回すことができるようになった。
  </p>

  <p>
    Excelを起動していない状態で rake specを実行すると、 メモリ不足でテストが実行できないというバグがある。(というより解消方法がわからない) rake openしたあとに、一旦 rake saveをすることで回避できる。
  </p></p>
</div></p>

フォルダ構造

<div class="outline-text-3" id="text-1-3">
  <p>
    src/spec/helperの3つに分けた。
  </p>

  <p>
    生産物はsrcにいれる。テストコードは specフォルダに入れる。helperはお助けツール。
  </p>

  <p>
    specの命名規則はxxx_specとする。 ファイル名が_specかどうかでテストコードを判定しているので。 本当はもっと設定ファイルとかで設定させたいけど、そのうち。
  </p></p>
</div></p>

コード

Environment

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

  <p>
    ツールバーから 参照設定を選択肢、以下を追加する必要あり。
  </p>

  <ul class="org-ul">
    <li>
      Microsoft Visual Basic for Application Extention
    </li>
  </ul>
</div></p>

12 Apr 2014, 17:07

ExcelVBAのステップ数をカウントする

Excel VBAのステップ数を数えるツールを探そうとおもったけれども、勉強のために自作してみる。

[toc]

ステップ数を数える方法について

ソースコードから以下の情報を得たい。

  • 全体のステップ数
  • 実行ステップ数
  • コメント行
  • 空白行

こんな出力結果を得たい。


--------------------------
  FileName    Exxecute
--------------------------
 hogehoge.cls       10
 hugahuga.bas       10
--------------------------
 Sum                20
--------------------------

サンプルを探してみた。以下のサイトのコードが良さそうだ。

テンプレートエンジンをつかってみる

テンプレートエンジンについて

<div class="outline-text-3" id="text-2-1">
  <p>
    テンプレートエンジンとは、データとテンプレートからドキュメントを作成するもの。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://ja.wikipedia.org/wiki/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3">テンプレートエンジン &#8211; Wikipedia</a>
    </li>
  </ul>

  <p>
    VBAで利用できるテンプレートエンジンは、「Mini Templator」が唯一の選択肢のようだ。
  </p>
</div>

Mini Templatorについて

<div class="outline-text-3" id="text-2-2">
  <p>
    Mini TemplatorはHTML用のテンプレートエンジン。 VBAだけではなくて、Java, PHPでもつかえる模様。オープンソース。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.source-code.biz/MiniTemplator/">MiniTemplator &#8211; A compact template engine for HTML files</a>
    </li>
  </ul>

  <p>
    上記サイトからVBA用のファイル一式をダウンロード。 なかにあるMiniTemplator.clsをインポートする。
  </p>

  <ul class="org-ul">
    <li>
      MiniTemplator_vbasic.zip <ul class="org-ul">
        <li>
          MiniTemplator.cls
        </li>
      </ul>
    </li>
  </ul>

  <p>
    ドキュメントは以下。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.source-code.biz/MiniTemplator/vbasic/MiniTemplator.htm">MiniTemplator Class API Documentation</a>
    </li>
  </ul>
</div>

Mini Templatorのつかいかた

<div class="outline-text-3" id="text-2-3">
  <p>
    キホンは以下の4ステップ
  </p>

  <ol class="org-ol">
    <li>
      テンプレートエンジン生成
    </li>
  </ol>

  <pre><code>  Dim templator As New MiniTemplator

  <ol class="org-ol">
    <li>
      テンプレート読み込み
    </li>
  </ol>

  <pre><code> templator.ReadTemplateFromFile STEPCOUNTE_TEMPLATE_PATH

  <ol class="org-ol">
    <li>
      データ入力
    </li>
  </ol>

  <p>
    3.1 変数代入 3.2 ブロック代入
  </p>

  <pre><code>    templator.SetVariable "filename", vbcComp.Name
templator.SetVariable "execute", vbcLine
templator.SetBlock "file"</code></pre>

  <ol class="org-ol">
    <li>
      データを文字列 or ファイルに出力
    </li>
  </ol>

  <pre><code>  Debug.Print templator.GenerateOutputToString</code></pre>
</div>

テンプレートを用意

<div class="outline-text-3" id="text-2-4">
  <p>
    こんな感じでテンプレート用意。
  </p>

  <pre><code>-------------------------

FileName} Execute

${filename} ${execute}

————————-

Sum ${execute}

————————-

コード

<p>
</p>

<h3 id="sec-2-6">
  出力結果
</h3>

<div class="outline-text-3" id="text-2-6">
  <p>
    ずれずれ・・・もともとがHTMLようなので、フォーマット出力なんて考えてないようだ。
  </p>

  <p>
    テキスト出力はつらい。
  </p>

  <pre><code>-------------------------

FileName} Execute

ThisWorkbook 39 Sheet2 0 Calc 3 Calc_spec 11 FileManager_spec 47 InlineRunner 112 MiniTemplator 608 SpecDefinition 62 SpecExpectation 164 SpecRunner 4 SpecSuite 42 StepCounter 64

FileManager 129

Sum 1285

printf的なものはないかな

C言語でのprintfにあたる機能がVBAにないものか、と探したらあった。

このツールが良さそうだ。

上記からダウンロードして、PrintF.basをインポート。

使い方も、C言語のprintfと同じ。

コード

<p>
</p>

<h3 id="sec-3-2">
  出力結果
</h3>

<div class="outline-text-3" id="text-3-2">
  <p>
    完璧、素晴らしい。
  </p>

  <pre><code>-----------------------

FileName Execute

ThisWorkbook 39 Sheet2 0 Calc 3 Calc_spec 11 FileManager_spec 47 InlineRunner 112 MiniTemplator 608 mdlPrintF 282 SpecDefinition 62 SpecExpectation 164 SpecRunner 4 SpecSuite 42 StepCounter 51

FileManager 129

Sum 1554

Special Thanks

<div class="outline-text-3" id="text-3-3">
  <ul class="org-ul">
    <li>
      <a href="http://d.hatena.ne.jp/lam_bda/20081124/1227502941">会社でRuby使用禁止になったのなら、VBAでテンプレートエンジンを使えばいいじゃない &#8211; ランバダ</a>
    </li>
    <li>
      <a href="http://wasuke.shioya.jp.net/archives/=344">MiniTemplator VBAで使えるテンプレートエンジン &#8211; わすけのブログわすけのブログ</a>
    </li>
    <li>
      <a href="http://www.1stdegree.co.jp/blog/yokomaku/archives/=103">横のマーク &#8211; EXCELのVBAでsprintf</a>
    </li>
  </ul>
</div>

12 Apr 2014, 12:37

ExcelVBAのコードをimport/exportする

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

などなど。

レガシーな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/