10 May 2014, 03:51

Software Defined Infrastructureに関するブックマーク

Software Defined Storageという用語を知りました。 この用語に関して調べたブックマークメモです。

たったひとつのキーワードからどんどん世界が広がっていき、 調べるのがとても楽しく、またSoftware Defiedの動向に驚いている。

Software Defined xxx とは

ソフトウェアを中心としたインフラ構築のビジョン。

Software-defined data center (SDDC) is a vision for IT infrastructure
that extends virtualization concepts such as abstraction, pooling,
and automation to all of the data center’s
resources and services to achieve IT as a service (ITaaS)

「Software Defined」とは「(手作業ではなく)ソフトウェアで定義・制御する環境」を実現する、または目指すという意味

各ベンダの動向

Intel – Software Defined Infrastructure(SDI)

<div class="outline-text-3" id="text-2-1">
  <p>
    データセンターのサーバー、ネットワーク、ストレージを統合する戦略。
  </p>

  <blockquote>
    <p>
      SDIの大きな特徴は、コンピュート(CPU、メモリ)、ネットワーク、ストレージなど、データセンターを構成するハードウェアをすべて抽象化して、ソフトウェアで自由に設定を変更することができる点
    </p>

    <p>
      ハードウェアとソフトウェアがタイトに結びつくのではなく、ハードウェアを抽象化し、必要に応じてソフトウェアから設定を変更するだけで、サーバーのリソース構成をダイナミックに変更できるシステムが必要になってきた
    </p>
  </blockquote>

  <ul class="org-ul">
    <li>
      <a href="http://itpro.nikkeibp.co.jp/article/NEWS/20130723/493463/">米インテルがSoftware Defined Infrastructureを発表、ストレージとネットワークで攻勢:ITpro</a>
    </li>
    <li>
      <a href="http://cloud.watch.impress.co.jp/docs/column/virtual/20130730_609512.html">【仮想化道場】“やわらかいデータセンター”を作る、IntelのSoftware Defined Infrastructure &#8211; クラウド Watch</a>
    </li>
  </ul>
</div></p>

Cisco – Software Defined Network(SDN)

<div class="outline-text-3" id="text-2-2">
  <p>
    Software-Defined Networking.ネットワークにおけるSoftware defined.
  </p>

  <blockquote>
    <p>
      SDN allows network administrators to manage network services<br /> through abstraction of lower level functionality.
    </p>
  </blockquote>

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

  <blockquote>
    <p>
      広義:「従来システムのネットワーク要素を抽象化し分割する、コンピュータ ネットワークを構築するアプローチ」(wiki より)<br /> 狭義:「(広義のアプローチを具体化するために)ネットワーク機器のコントロール プレーン、データ プレーンを分離し、集中化されたソフトウェアからコントロールして、もっと効率的なこと、便利なことをする!!」
    </p>
  </blockquote>

  <ul class="org-ul">
    <li>
      <a href="http://gblogs.cisco.com/jp/2014/02/open-source-controller-framework-opendaylight-1/">Cisco Japan Blog » オープンソース コントローラ フレームワーク ― OpenDaylight (1)</a>
    </li>
  </ul>

  <p>
    なんと、Courseraに講義を発見!時間があれば受けたいところだが。。。
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://www.coursera.org/course/sdn">Software Defined Networking | Coursera</a>
    </li>
  </ul>
</div></p>

EMC – Software Defined Storage(SDS)

<div class="outline-text-3" id="text-2-3">
  <p>
    EMCのとなえる戦略。ストレージにおけるSoftware Defined.
  </p>

  <blockquote>
    <p>
      Software-defined storage (SDS) is a term<br /> for computer data storage technologies which separate storage hardware<br /> from the software that manages the storage infrastructure
    </p>
  </blockquote>

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

  <p>
    SDNはOpenFlowという共通技術によって浸透したが、 ストレージ分野では共通技術となるようなものがないとか。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.publickey1.jp/blog/14/software-defined_storage.html">Software-Defined Storage、これからのストレージ技術が実現する世界とはどのようなものか? - Publickey</a>
    </li>
  </ul>
</div></p>

実現するためのArchtecture

Software Defined Infrastructe

<div class="outline-text-3" id="text-3-1">
  <p>
    このページで紹介されているアーキテクチャがわかりやすい。
  </p>

  <p>
    <a href="http://www.ctc-g.co.jp/report/column/it_sdi/index.html">よくわかるIT新発見 第1回 「Software Defined xx」の潮流を読み解く!|伊藤忠テクノソリューションズ</a>
  </p>

  <p>
    以下、引用。
  </p>

  <ul class="org-ul">
    <li>
      Orchestration ・・・ 下位の機能レイヤのAPIを通じて全体のプロビジョニングを実施。
    </li>
    <li>
      Controller ・・・ 上位レイヤからのAPIを介した指示にしたがって、Deviceの設定変更を実施。
    </li>
    <li>
      Device ・・・ 上位レイヤのAPIを介した指示にしたがって、必要なITリソースを提供。
    </li>
  </ul>
</div></p>

Rack Scale Architecture(RSA)

<div class="outline-text-3" id="text-3-2">
  <p>
    Intelが提唱するアーキテクチャ。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://news.mynavi.jp/news/2013/04/12/141/">ラックはサーバ集積からモジュール構造へ、Intel | マイナビニュース</a>
    </li>
  </ul>

  <p>
    これはよくわかならいな。
  </p></p>
</div></p>

実現するための技術・OSS

OpenStack

<div class="outline-text-3" id="text-4-1">
  <ul class="org-ul">
    <li>
      <a href="http://ja.wikipedia.org/wiki/OpenStack">OpenStack &#8211; Wikipedia</a>
    </li>
  </ul>

  <blockquote>
    <p>
      クラウド基盤を構築するオープンソースソフトウエア。<br /> KVMやXen、VMware ESXi、Hyper-Vといった仮想化ソフト(ハイパーバイザー)と組み合わせ、<br /> IaaS(Infrastructure as a Service)やストレージサービスを提供するための仮想マシンやストレージ、ネットワークの管理機能などを提供する
    </p>

    <p>
      OpenStackを使って構築したクラウド環境は、<br /> 統一したAPIや認証を使って管理できる。<br /> また、IaaSのパブリッククラウドサービスで最大手であるAmazon EC2と互換性を持つ。
    </p>
  </blockquote>

  <ul class="org-ul">
    <li>
      <a href="http://itpro.nikkeibp.co.jp/article/Keyword/20121029/433321/">Networkキーワード &#8211; OpenStack とは:ITpro</a>
    </li>
    <li>
      <a href="http://cloud.watch.impress.co.jp/docs/column/cloud/20140404_642748.html">【クラウド特捜部】プレーヤーがそろい表舞台に立つOpenStack &#8211; クラウド Watch</a>
    </li>
  </ul>
</div></p>

CloudStack

<div class="outline-text-3" id="text-4-2">
  <ul class="org-ul">
    <li>
      <a href="http://www.atmarkit.co.jp/ait/articles/1403/03/news019.html">プロダクトの差はわずか? 活動評価視点で検証:OpenStackとCloudStack、違いは何? (1/2) &#8211; @IT</a>
    </li>
  </ul>
</div></p>

OpenFlow

<div class="outline-text-3" id="text-4-3">
  <p>
    OpenFlowとは、 ソフトウェアによってネットワークの構成を行うための新しい標準。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://e-words.jp/w/OpenFlow.html">OpenFlowとは 〔 オープンフロー 〕 &#8211; 意味/解説/説明/定義 : IT用語辞典</a>
    </li>
    <li>
      <a href="http://www.publickey1.jp/blog/13/openflowsdnopenflowsdn_japan_2013.html">OpenFlow/SDNはなぜ誕生したのか、OpenFlow以前にあった問題とは。生みの親カサド氏が壇上で語る。SDN Japan 2013 - Publickey</a>
    </li>
  </ul>
</div></p>

Hydrogen

<div class="outline-text-3" id="text-4-4">
  <p>
    OpenDaylight Projectとは、 SDN(Software Defined Network)のプラットフォームを開発するプロェクト。 Linux Foundation Projectのひとつ。
  </p>

  <blockquote>
    <p>
      SDN の市場育成とともにこの分野の革新とユーザ環境への導入促進を目的に活動を開始したのが「OpenDaylight」です。業界をリードする素晴らしいメンバー(Platinum/Goldスポンサー:Brocade、Cisco、Citrix、Ericsson、IBM、Juniper、Microsoft、Redhat、NEC、VMWare)が参加し、複数のインダストリ プレイヤーによるコントリビューション(HackFest 参加、ソースコード寄贈、共同開発)によりコントローラ フレームワークを形成
    </p>
  </blockquote>

  <ul class="org-ul">
    <li>
      <a href="http://gblogs.cisco.com/jp/2014/02/open-source-controller-framework-opendaylight-1/">Cisco Japan Blog » オープンソース コントローラ フレームワーク ― OpenDaylight (1)</a>
    </li>
  </ul>

  <p>
    OpenDaylightが開発したオープンソース コントローラ フレームワークがHydrogen。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://sourceforge.jp/magazine/14/02/06/144500">オープンソースSDNプロジェクトのOpenDaylightが初リリース、「Hydrogen」が登場</a>
    </li>
    <li>
      <a href="http://www.atmarkit.co.jp/ait/articles/1402/05/news050.html">SDNのオープンソースプロジェクト:OpenDaylight Project、最初のリリースHydrogenを発表 &#8211; @IT</a>
    </li>
    <li>
      <a href="http://gihyo.jp/dev/serial/01/linuxcon2014/0003">#3 最終回はNeela Jacques氏にOpenDaylightについて伺いました:LinuxCon Japan 2014 Preview|gihyo.jp … 技術評論社</a>
    </li>
  </ul>
</div></p>

09 May 2014, 22:39

Selenium BuilderでRubyコードを自動生成して実行する

次世代Selenium IDEと唱われている、Selenium Builderを試したメモ。

次世代Selenium IDE

次世代という意味は、Selenium2 、 つまりWebdriverをサポートしているということ。

Selenium IDEは Selenium1(or RemoteConsole RC)をサポートしている。

Selenium Builderの準備

<div class="outline-text-3" id="text-1-1">
  <p>
    Selenium Builderは forefoxのブラグイン。 なので、まずはfirefoxをインストール。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.mozilla.org/ja/firefox/new/">Firefox のダウンロード — 自由な Web ブラウザ — Mozilla</a>
    </li>
  </ul>

  <p>
    次に、以下からプラグインをインストール。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://sebuilder.github.io/se-builder/">Selenium Builder &#8211; The next evolution</a>
    </li>
  </ul>

  <p>
    firefoxを再起動後、Ctrl+Alt+B or メニュー -> 開発ツール -> Launch Senium Builder.
  </p>

  <p>
    Selenium Builderについては、以下の記事がとても詳しい。Special Thanks!!
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://blog.trident-qa.com/2013/12/selenium-builder-vs-ide-recap/">次世代のIDE、Selenium Builderまとめ | 品質向上ブログ</a>
    </li>
  </ul>

  <p>
    まとまったドキュメントはここ。
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/sebuilder/se-builder/wiki">Pages · sebuilder/se-builder Wiki</a>
    </li>
  </ul>
</div></p>

ruby selenium webdriverの準備

<div class="outline-text-3" id="text-1-2">
  <p>
    rubyから seleniumを利用するために、selenium-webdriverを利用する。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">gem install selenium-webdriver

  <p>
    プロキシ配下では以下。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">gem install selenium-webdriver -r -p http://username:password@proxy.hostname:port

<div id="outline-container-sec-1-2-1" class="outline-4">
  <h4 id="sec-1-2-1">
    Windows環境のワナ
  </h4>

  <div class="outline-text-4" id="text-1-2-1">
    <p>
      Windows環境でgem installを動かすためには、devkitのインストールが必要。 RubyInstallerと Devkitをセットでインストールする必要がある。
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://rubyinstaller.org/">RubyInstaller for Windows</a>
      </li>
    </ul>
  </div></p>
</div>

<div id="outline-container-sec-1-2-2" class="outline-4">
  <h4 id="sec-1-2-2">
    Cygwin環境のワナ
  </h4>

  <div class="outline-text-4" id="text-1-2-2">
    <p>
      そもそも、Cygwin環境では 依存パッケージのffiがバグっててインストールできない。
    </p>

    <p>
      Cygwin64bit版は依存しているffiライブラリがバグってる! パッチを当てる必要があるという茨の道。
    </p>

    <ul class="org-ul">
      <li>
        <a href="https://github.com/ffi/ffi/issues/284">https://github.com/ffi/ffi/issues/284</a>
      </li>
    </ul>

    <div class="org-src-container">
      <pre class="src src-sh">$ gem install selenium-webdriver

Building native extensions. This could take a while… ERROR: Error installing selenium-webdriver: ERROR: Failed to build gem native extension.

    /usr/bin/ruby.exe extconf.rb

checking for ffi.h… *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more

    <p>
      回避方法をためしてみても、自分の環境ではうまくいかなかったので諦め。
    </p></p>
  </div></p>
</div></p>

Rubyコードを生成

自動化したいページで右クリックする。

SeleniumBuilderが立ち上がる。記録の開始を選択して、作業を記録。

記録が終わったら、ツールバー -> ファイル -> エクスポートを選択。

Selenium2としては以下の形式へExportできる(2014/5現在)

  • JSON
  • Java(Junit/TestNG)
  • Ruby
  • Python
  • PHP
  • Node.JS
  • C#

Selenium1としてExportするとさらに対応言語が多くなる。

  • HTML
  • Groovry
  • Perl

Selenium1だと、RubyのRSpecやtextunitにも対応しているようだ。 もっともっと多くなるのは時間の問題だろう。スゴい!

Rubyを選択して、Rubyのコードを生成。

require 'rubygems'
require 'selenium-webdriver'
wd = Selenium::WebDriver.for :firefox

wd.get "https://www.google.co.jp/"
wd.find_element(:id, "lst-ib").click
wd.find_element(:id, "lst-ib").clear
wd.find_element(:id, "lst-ib").send_keys "Selenium Builder"
wd.find_element(:css, "div.tsf-p").click
wd.find_element(:name, "btnK").click
wd.quit

<p>
  selenium-webdriverがrequireされいてるところに注目されたし。
</p></p>

Rubyコードを実行

生成したコードをコマンドラインから実行するだけ!こんなに簡単だとは!

07 May 2014, 10:36

プログラミングの世界観を変える衝撃!Paradigms of Computer Programmingで震えるほどの知的感動を体験した

はじめに

MOOCのEdxでParadigms of Computer Programmingという講座を受けた。

感動というものを頭に走る電撃と定義するならば、 このCourseは自分にとって、まちがいなく最高の感動だった。

[toc]

内容

感動的な講義の展開

プログラム言語のパラダイムやコンセプトが紹介される。

5つのパラダイムが紹介される。

  • Functional Programming(関数型プログラミング)
  • Object-Oriented Programming(オブジェクト指向プログラミング)
  • Deterministic Dataflow Programming(決定性データフロープログラミング)
  • Multi-Agent Dataflow Programming(マルチエージェントデータフロープログラミング)
  • Active Object Programming(アクティブオブジェクトプログラミング)

感動すべきは、その講義の展開だ。

はじめに、すべてのBaseになる関数型パラダイムからスタート。

そして、関数型パラダイムに、 State(状態)という概念を追加することで、 オブジェクト指向パラダイムに発展させる!

また、関数型パラダイムに Concurrency(並行性)、Thread(スレッド)という概念をを追加することで、 決定性データフローパラダイムに発展させる!

そして、決定性データフローパラダイムに Port(ポート)という概念をを追加することで、 マルチエージェントデータフローパラダイムに発展させる!

最後に、オブジェクト指向パラダイムとマルチエージェントデータフローパラダイムを 融合させることで、アクティブオブジェクト指向パラダイムへ発展させる!

新しいパラダイムやコンセプトが紹介されるごとに、 価値観を覆す感動が自分の頭の中で電撃としてピリピリ走った。 めくるめく感動体験の連続である。

こんな体験はそうめったにできるものではない。スゴい!

情熱的なビーターバンロイさん

レクチャーをするビーターバンロイさんの語り口がとても情熱的だ。

語り口にも感動した。重要な概念になるたびに、 声の音程と強さがあがり、情熱的に語りかけてくる。感動に拍車をかける。

Oz(マルチパラダイム言語)と参考書について

Ozというマルチパラダイム言語を利用する。

個人的には、MozartがEmacsをベースにしているところがとてもよかった。Emacs最高!

しかし、Ozの文法がわからない・・。

情報元やサンプルコードが少なくて、文法を調べるのに苦労した。 概念的にわかっていてもその実装するための文法がわからず時間かかったり。 loopを書くのに2時間つかったり。参考書とforumでサンプルコード漁りまくった。

参考書

分厚くて重い。。900ページある。しかし、これがないと辛い。実はEnglishが一番難しい言語。

通称、CTM本、CTMCP本、ガウディ本というらしい。

感想

モチベーション

講座のなかでは、以下のような利点を強調してモチベーションをあげようとしている。

  • いくつものプログラミング言語がある。全てを学ぶことは不可能。
  • プログラミング言語はパラダイムで分類できる。
  • パラダイム、そこから導出れるコンセプトを抑えることで、多くの言語を理解できる!

なるほど、利にかなっている。

今は、オブジェクト指向が全盛だが、その天下もいつまで続くかは分からない。

技術が進めばマルチコアや並列処理に対応するために、それに適した言語が必要になるかもしれない。 HTMLなんかは宣言的プログラミングの典型で、オブジェクト指向ではどうにもならない。

プロフェッショナルなプログラマを目指すのならば、 オブジェクト指向だけでなくて、他の考え方も知っておきたいところだ。

また高校生のころにこんな本を読んで、とても感激を受けた。

パラダイムを学び、そしてその考えに触れることで自分の価値観が揺るがされる。 新たな世界が見えるようになる。そんな知的興奮をパラダイムは与えてくれる。

実際は、、

講座は2月からはじまったのだが、他のことが忙しくてスケジュールどおりには進められなかった。

なので、4末に講座が終了したあと、5月のGWの休みに集中して一気に勉強した。

AssignmentやExamは締切り後に解いたりして、点数にはならず。それが残念。

プログラミング言語の分類学

プログラミングパラダイムを分類したポスターが以下のサイトからダウンロードできる。

- Classification of the principal programming paradigms

今まで3つのパラダイムしかしらなかった。

  • Declarative Programming(宣言的プログラミング)
  • Procedural programming(手続き型プログラミング)
  • Object-Oriented Programming(オブジェクト指向プログラミング)

このポスターを眺めてみると、プログラミングの世界は広大であり、 自分は視野が狭かった、ほんの片鱗しか見えていなかったと思った。

そして、この講座で紹介されなかったパラダイムもまだまだたくさんあることに驚いた。 もっともっと、いろんな言語やパラダイムに触れたいと、強く思った。

ちなみに、最後にオススメ言語が紹介される。 よい言語は、広く様々なパラダイムをカバーしてていること。 その意味で、ScalaとErlangがオススメ、 C++とJavaもややマルチパラダイムだけどちょっとレガシー、だそうだ。

Coursereで紹介されたプログラムパラダイムのメモ

メモをとりながら、動画を見ていたのでそのメモ。

今まで、あまりメモはとらなかった。満員電車で動画を見ることが多かったので。 今回はGWに集中して取り組めたので、メモをとることはよいことだと思った。

以下、引用がほとんどのメモだけれども、内容が間違っているかもしれないので注意。

これはEmacs org-modeで階層的にメモをとった。 これからも、今回触れられなかったパラダイムを追加していき、 パラダイムツリーを生涯にわたって進化させていきたい。

プログラミングパラダイムとは

プログラミングパラダイムとは、プログラミングの分類方法、スコープ、見方。

なにかを定義しているようでなにもいっていない・・・詳しくはwikipedia参照。

Base Concepts

Valiables

変数の構成要素は以下の2つ。

  • 識別子(Identifier)
  • 格納域実体(Store entity)

Identifires and Store Entity

x = 1 ということはどういうことかを説明する概念。

数学的な写像関係で x = 1 を説明しようとしている。{ X -> x1=1 }みたいな感じ。 x1がメモリ上の実際の(束縛された)値で、Xがそれを指し示す識別子。

environments

識別子と変数の写像関係を環境という。

State

State(状態)とは、必要とされる計算の途中結果を含む、値の時系列。 (sequence of values calculated progressively, which contains the intermediate results of a computation)

状態の導入によって、プログラムに時間の概念を与える。

Declarative Programming

宣言型プログラミング。

第1の意味は、 処理方法ではなく対象の性質などを宣言することでプログラミングするパラダイム。 第2の意味は、 純粋関数型プログラミング、論理プログラミング、制約プログラミングの総称。

HTMLはStateless、Declarative Programming language. 状態はクッキーを導入してしばしば実現する。

Functional Programmming

Impliclite(declarative) State

暗黙的状態。宣言的状態ともいう。

  • 関数の実行結果が値をもつ
  • 同じ入力には必ず同じ出力を返す。
  • Explicite Stateとの対概念。
  • 参照透明性。

Higher-order programming

高階プログラミング。procedure valueをサポートしている言語でのプログラミング技術。 関数を引数としてわたす能力。

Rubyではlambda, procなど。C言語には関数ポインタがある。C言語は2階。

Recursion

再帰的プログラミング。

accumulater

C++の、numericライブラリ(accumuulateなど)で利用されている。

スタックのサイズが均一なことが特徴的。

tail-recursion

末尾再帰。

その中にただ1つの再帰呼び出しがあり、 かつその呼び出しが手続き本体の最後にあるもの。

invariant programming

不変式プログラミング。再帰的に呼ばれる度に、数学的に真になる式。

Imperative Programming

命令型プログラミング。 計算をプログラム状態を変化させる文の列で記述するパラダイム。

Imperative Programmingとは、Function paradigmにCellの概念を加えたもの。

  • Declarative Programingの対になる概念。 Imperative vs Declaretive is also Stateful vs Stateless
Imperative programming = Function paradigm + Cell

  • 実行するたびに、内部の状態によって結果がことなる。
  • 手続き型と同義のこともある。(Procedural programming)

手順やチェックリストはプログラムではないが、 命令型プログラミングのスタイルに似たコンセプトである。 それらのステップが命令であり、実世界が状態を保持している。

  • 械語は命令から構成される

低レベルから見た場合、 プログラムの状態はメモリの内容によって定義され、文としては機械語の命令が相当する。

Explicite State

明示的状態。

  • 生存期間が2度以上の手続的呼び出しに渡るような一つの状態。
  • 関数の実行の中に値をもつ。
  • 手続きの引数に現れないもの。

同様なことを関数型パラダイムで実現するためには、仮引数に状態を持たないといけない。

Cell

Explicite State(明示的状態)を表す基本型。二つの構成要素からなる。

  • 名前値(Vaiue)
  • 単一代入格納域への参照(Identifier)

Function ParadigmsとImperative Paradigmの違いは、

  • Function
    • 状態変化しない(Immunity)
    • 機能追加時にインタフェースの変更の影響度がおおきい。
  • Inperative
    • 機能追加時にインタフェースの変更の影響度がない。(モジュール性, モジュールプログラミング)
    • 状態変化する。

Structured programming

構造化プログラミング。

構造化プログラミングではプログラミング言語が持つステートメントを 直接使ってプログラムを記述するのではなく、 それらを抽象化したステートメントを持つ仮想機械を想定し、 その仮想機械上でプログラムを記述する。 普通、抽象化は1段階ではなく階層的である。 各階層での実装の詳細は他の階層と隔離されており、 実装の変更の影響はその階層内のみに留まる(Abstract data structures)。 各階層はアプリケーションに近い抽象的な方から土台に向かって順序付けられている。 pこの順序は各階層を設計した時間的な順番とは必ずしも一致しない(Concluding remarks)

- 構造化プログラミング - Wikipedia

標準的な制御構造のみを使い、 プログラム全体を段階的に細かな単位に分割して処理を記述していく手法。

「制御の流れ」を構造化しただけであり、 「データ構造」には何の制限や規則も設けていない。

「芸術品」から脱却して「工業製品」へ遷移すること、 あるいは、「処理性能重視」から「保守性重視」へ向かったもの。 別の見方をすれば、処理効率を犠牲にして、作りやすさや理解容易性を求めたもの。

三つの構造化文

ダイクストラが提唱。

  • 順次

順接、順構造とも言われる。 プログラムに記された順に、逐次処理を行なっていく。 プログラムの記述とコンピュータの動作経過が一致するプログラム構造である。

  • 反復

一定の条件が満たされている間処理を繰り返す。

  • 分岐

ある条件が成立するなら処理Aを、そうでなければ処理Bを行なう。

- 構造化プログラミング - Wikipedia

Object-Oriented Programming

オブジェクト指向型プログラミング。

CTMCP, Chapter 6,7

Data abstraction

データ抽象。3つの構成要素がある。

  • Input
  • Output
  • Interface

データ抽象は内部と外部からなるプログラムかつ、両者がインターフェースを通じてやりとりするもの。

A data abstraction is a part of a program that has an inside, an outside, and an interface in between The inside is hidden from the outside.

Input/Output

内部は外部からは隠蔽されている。-> カプセル化という。

The inside is hidden from the outside

Interface

The interface is a set of operations that an be used according to certain rules.

データ抽象には、主に二つの方法がある。

  • Abstract Data Type(ADT) keeps values and operations separate.
  • Object groups together value and operations in a single entity.

Encapsulation

プログラムと内部と内部をインタフェースで分けること。

カプセル化のメリットは大規模開発をシンプルにする。

  • 正しさを保証する。
  • 複雑さを解消する。

Abstract Data Type

抽象データ型。ADTと略されることも。

構造化プログラミングは仮想機械モデルに基づく段階的詳細化法(stepwise refinement)をもたらしたが、 データ構造の変更を行うと変更部分がソースコード中に散在してしまうという弱点があった。 データ抽象の概念はその欠点を補完するものであった

An ADT consists of a set of values and  a set of operations.

  • Integer型
    • Value:1,2,3
    • Operation:+
  • Stack型
    • Value: elemtent
    • Operation: push, pop, …

ValueとOperationそれ自体はStateを持たない。

CTM, p433

Diference between ADT and Object。Stackをつかった実装の違い。

  • ADT
local Wrap Unwrap in
  {NewWrapper Wrap Unwrap}
  fun {NewStack} {Wrap nil} end
  fun {Push W X} {Wrap X|{Unwrap W}} end
  fun {Pop W X} S={Unwrap W} in X=S.1 {Wrap S.2} end
  fun {IsEmpty W} {Unwrap W}==nil end
end

この手法はStateful ADTという。

そして、C言語では、こうやってデータ抽象化を行うことがおおい。 もちろん関数ポインタ配列を使えばC言語でもObjectをつくることができるが、 実際にはそこまでやらない。(面倒)

  • Object

オブジェクトでは、データに対する操作はプロシージャ変数として扱われることに注目。

fun {NewStack}
  C={NewCell nil}
  proc {Push X} C:=X|@C end
  proc {Pop X} S=@C in X=S.1 C:=S.2 end
  fun {IsEmpty} @C==nil end
in
  stack(push:Push pop:Pop isEmpty:IsEmpty)
end

オブジェクト指向言語は、 単にObjectをサポートする言語ではなくて、Abstruct Data Typeも強力にサポートしている。

ObjectとADTの意味がごっちゃにつかわれているのが現実の現状。

Object

値と操作をひとつのまとまりとしたもの。以下の構成要素をもつ。

  • 値 ・・・Explicite State(明示的状態)
  • 操作 ・・・Procedural Data Abstruction(手続的データ抽象)

以下の能力を備えている。

Data Abstruction

オブジェクトは内部と外部はインタフェースを通じてやりとりされる。

内部の明示的状態をAttributes,インタフェースをMethodsという。

Procedure Dispatch

オブジェクトは単一なエントリポイントをもつ。(エントリポイント = 呼び出し口) エントリポイントに渡される引数をメッセージという。

下の例だと、Counterがエントリポイント。エントリポイントにinc,getメッセージを送る。

   {Counter inc}
   {Counter get(X)}

エントリポイントから、メッセージに対応するプロシージャが呼びだされる。

メッセージとプロシシージャはあらかじめDispatch(バンドリング)されている。

Instantiation

オブジェクトは一つのメソッドで、 異なる属性をもつ複数のオブジェクトを生成できる。

この能力をInstantiation(インスタンス化)という。

Classes

メソッドと属性を定義する特別なシンタックスをClassという。

属性とメソッドはレコードデータ構造によって管理されているだけである!

Classという概念によって、オブジェクトの”宣言”と”生成(new)“を分離する。

Inheritance

継承。あるオブジェクトが他のオブジェクトの特性を引き継ぐこと。

Exceptions

例外。プログラムがある処理を実行している途中で、 なんらかの異常が発生した場合に、 現在の処理を中断(中止)して、別の処理を行うこと。 その際に発生した異常のことを例外と呼ぶ

よくある2つの概念。

  • try ・・・ 例外ハンドラをもつ例外補足コンテクストを生成。
  • raise・・・ もっとも内部の例外補足コンテキストへjampし、そこにある例外ハンドラを起動。

各コンテキストはスタックで管理され、tryはスタックの1つにmarkerをつける。 raiseはmarkerにジャンプしてmarkerの場所に例外処理のコンテキストを挿入する。

CTM p93参照。

例外をつかわないと、コンテクストごとの結果を検証必要があり、 case文が乱立するうんこコードが出来る。

Concurrenct Programming

複数の相互作用を及ぼす計算タスクの(同時)並行的実行をおこなうパラダイム。

平行プログラミング。(並列プログラミングではない)。

Multiple progressing activities that exist at the same time Activities that can communicate and synchronize

  • Communicate: information passes from one activity to another
  • Synchronize: an activity waits for another to perform a specific action

平行プログラミングには3つの代表的なパラダイムがある。

  • Detarministic Dataflow
  • Message-passing concurrency(Erlang and Scala actor)
  • Shared-State concurrency(Java monitors)

その他、並列実行の競合をさけるためには、以下ようなパラダイムもある。

  • Lazy Deterministic Dataflow
  • Constraint Programming

Detarministic Dataflow Programming

決定性データフロープログラミング。

関数型パラダイムをべースにしている。

スレッド処理、時間経過をともなうのにも関わらず、実行結果はつねに一定! これが、Deterministicと名づけられた所以。

Deerministic is not Obsarbable.

アイデア自体は70年代に提示されたアイデアのに、今まで忘れ去れれていた。

  • MultiCore, ManyCore Processing (マルチコア、メニーコア)
  • Destributed Computing
  • Concurrent Deployment
  • BigData Computing

以上のようなキーワードとともに、 21世紀の今こそ注目をあびるべき、次世代プログラミングパラダイム! (とピーターバンロイさんがいっていた)

CTMCP, Chapter 4

Detarministic Dataflow

Unbound Value

メモリ上に値が存在しないが、宣言された変数。

  • C/C++では、ゴミ(不定データ)が格納されている。
  • Javaは0初期化されている。
  • Prologは実行時にエラー終了する。
  • Ozは値がbindされるまでまちあわせる。

DataFlow Value

Unbound Valueがbindされるまでプログラムの実行を待ち合わせるような宣言的変数。

Bindされたときの実行を Dataflow Executionという。

このデータフロー変数によって、No Race Conditions(非強豪状態)を実現する! (これがもっともこのパラダイムで大事)

Threads

プログラムの処理の単位(Thread of Program)

  • Each thread is sequential.
  • Each thread is independent of the others.
  • Two threads can communicate if they share a variable

WikipediaではCPUのひとつの処理単位と定義されている。

- スレッド (コンピュータ) - Wikipedia

Streams

リストの終端がUnbound Variableであるもの。

Streamsは2つのThread間の通信チャネルとして利用できる。

Streamの構成要素は以下。

  • Producer ストリームのデータを生成。
  • Consumer Producerから生成されたストリームのデータを受け取ってアクションを起こす。
  • Transformer ProducerとConsumerとの間を仲介する。
  • Pipeline ProducerとConsumerとTransformerの間を仲介する。

単一格納変数(single-assined value)の性質(一度しか代入できない) を同期のスレッド間通信のための手段にする。

平行スレッドのなかでStreamを読み書きするものをAgentsという。

  Produce ———-> Transformer ——–> Consuemer

NonDeterminism

非決定性。プログラムの実行結果を決定ことができるシステムの能力。

Nondeterminismはmanagedされることが必須! しかし、制御がとても難しい。 だからこそ、Determinismが重要なのだと。

Scheduler

どのスレッドを実行するかを決める、システムの一部をスケジューラという。

Concurrency Transparency

平行透過性。

複数のユーザーが1つのリソースを共有して使用するとき、 それらユーザーに競合状態を気づかせてはならない。

concurrency for dummies

平行性のためのダミースレッド。

平行透過性のためには、いくらスレッドを動的に追加しようとも、削除しようとも、 最終的に得られる結果はかわらない(Deterministic!)

それは、スレッドの各処理をincrementalに動作させることで可能となる

Multi-agent dataflow programmming

マルチエジェーントデータフロープログラミング。

Concurrency を解決するためのいろいろなパラダイムのなかで、 最強のパラダイムがこれだとピーターバンロイさんはいう。

なぜなら、Deterministic Dataflow Programmingをベースに、 NonDeterminismの制御を機能追加したから。

(Deterministic Dataflow Programmingに、Portという明示的状態をくわえた)

Distributed Systemともいう。

CTMCP, Chapter 5

Port

ボート。Named Steram.名前のつけられたストリーム。

以下の操作をもつ、Abstruct Data Structure。

  • Port Creation
  • Message Sending
    • Asyncronize
    • Syncronize

Agents

通信モデルは大きく2つに分けられる。

  • Client-Server Architectures
  • Pear-to-Pear Architectures

Client,Server,PearをAgentという。

以下の構成要素をもつ。

  • have identity … mail address
  • recieve messages … mailbox
  • process messeges … orderd mailbox
  • reply to messeges … pre-addressed return letter

エージェントは独立実体で、自身の局所的な目的を目指して仕事をする。 相互作用が適切に設計されていればエージェントは大局的仕事も達成する。

CTMCP, Chapter 5より。

Agentをもちいるプログラミングを、 Object-Oriented Programmingと対比されて、 Agent-Oriented Programmingということもある。

ただし、Agentは必ずしもObjectでなくてもよい。2つのうちのどちらか。

  • Object
  • Transition state-functions

Coordinator

AgentのなかでほかのAgentをまとめるAgentをCoordinatorという。以下の性質をもつ。

  • 代理性 ・・・他のAgentの代理をして処理をおこなう。処理の結果をAgentに通知。
  • 知性 ・・・ 他のAgentから情報をあつめを代表して判断を下す。
  • 移動性 ・・・他のAgentを代表して判断を下す。

Master(Coordinator)-Slave Archtecture.

Stateless Agent

あるメッセージを受信したときに、そのメッセージに応じてアクションをとるAgents. アクションは受信メッセージに依存する。

Agentはひとつのスレッドと複数のポートをもつ。ボートは明示的変数(Cell)と同義。

このPort以外はImmutableなデータ構造。Portのみがメモリ上に確保される。

State with Agent

ポートの他にState(明示的状態)をもつこともある。

処理の実行自体はStreamデータ構造に入ったfunctionのプロシージャごとに実施する (Immutable and incremental)が、StateによってReplyの方法を変える。

Protocol

Messageの送信と受信のルール。

- 通信プロトコル - Wikipedia

プロトコルにしたがうことで、デッドロックを防ぐ。

BroadCast

他の複数のエージェント(Multi-Agent)に通信を送る。

Contract Net

Ozma

Multi-agent dataflow programmmingを実現するための言語。ScalaとOzを合体させた。

ピーターバンロイさん直々の説明動画は以下で見れる。

github repository.

Active Objects Programming(Object-Based Agent)

オブジェクト指向におけるオブジェクトを、 自ら判断し処理できる機能を持ったエージェントと呼ばれるモジュールに 置き換えたもの。

Object-Oriented Programming とMulti-Agent Programmingの2つのパラダイムを 合体させてできたパラダイム。

オブジェクトの属性ではなくて振る舞いが重要視される。

EnglishのWikipediaに OOPとAOPの対応比較表がある。

03 May 2014, 11:45

プログラマは芸術家となりえるか?クヌース先生のプログラム論を読んだ読書メモ

はじめに

文芸的プログラミングに興味を持ったため、クヌース先生のエッセイ集をAmazonで買ってみました。

一般的なサイエンスとアートの定義

クヌース先生の代表的著作 The Art of Computer Programmingがある。 この本のタイトルである Artという言葉は、 どのような意味でつかっているかを、サイエンスとアートを対比させて述べられている。

古代から中世、近代の各時代におけるアートとサイエンスの言葉の使われ方について紹介される。 いろいろと、その時代ごとに意味が異なることが分かる。 そして、今日的な意味でのサイエンスとアートはこういうものでは、と述べられる。

サイエンスとは、私たちがきわめてよく理解し、したがってコンピュータに教え込むことができるような知識のことである。
もし、私たちが何かを完全に理解したとはいえない場合には、その何かはアートの範疇に入る。

ここでは、未知なものの追求をアート、既知なものがサイエンスと説明されている。

科学的な立場とは、論理的な、系統だった、個性的でない、冷静な、理性的なという言葉で特徴づけられる。

一方、芸術的な立場とは、美的な、創造的な、人間性豊かな、熱心な、理性的でない、といった言葉で特徴づけられる。

そして、コンピュータ・プログラミングはサイエンスでもありアートである、とのべられる。 たとえとして、機械学習があげられる。 機械学習の目的は機械に知性を持たせることなので、 その研究成果はサイエンスだが、その追求の仮定はアート。

クヌース先生の考えるサイエンスとアートの定義

しかし、と文章はつづく。

いろいろ本を読んで歴史的に調べたけど、 なんか違和感があるなぁという前置きで、以下、のべられる。

私が芸術としてのコンピュータ・プログラミングを話す場合は、
主に美的な意味での芸術の様式について考えるのです。
教育者として、また著作者としての私の仕事の目標は、
読者に美しいプログラムを書くことを学んでもうらことであります。

私たちがプログラムを書こうとするときのきもちは、
ちょうど詩をつくったり作曲したりするときの気持ちと同じであります。
それは、プログラミングは知的な満足と感情的な満足の両方を私たちに与えることができます。
それは、プログラミングによって複雑さを征し、
矛盾なく構成された規則の系統を真に樹立することができるからです。

プログラムには、優雅なものもあり、異国風のものもあり、また光り輝くものもあります。
私が申し上げたいことは、壮大なプログラムを、
高貴なプログラムを、そして真実壮麗なプログラムを書くことが可能であるということです。

一般的な意味での芸術として、 クヌース先生はプログラムを作品、マスターピースとしてとらえている。なるほど、それは知ってた。

自分の仕事で書くプログラムを考えるとかなしくなる。 自分はif文にelse文を追加する仕事や、 switch文にcase文を追加するような仕事をしている。 仕事でのプログラミングは労働だ。仕事を楽しむことは諦めている。

しかし、プログラミングは好きだ。 それはわくわくするような行為だ。生まれ変わっても、プログラマでいたい。

プログラムにおける善について

功利主義哲学者、ベンサムについて言及する。そして、 プログラムにおけるよいことが、アートとなりえれば素晴らしいとのべられる。

ベンサムは、美学よりも、結果の有用性のほうが優れているという助言を与えています。

私たちは、美というものの個人的な標準を定める、
ある自由はもっています。しかし、私たちが美しいと考えるものが
ほかの人にとっても有用であると考えられるならば、それ特に素晴らしいでしょう。

私は、なんらかの意味で、たいへんよいプログラムを書くことが楽しいのです。

「よい」ということを要約すると、以下のようなことがかかれている。

  • プログラムが正しく動作すること
  • そのプログラムがユーザとやさしく対話すること
  • コンピュータのもつリソースが実際に使用される効率をあげること

ビジネス的に最もよいプログラムとは、お金を稼げるプログラムだ。

そして、ビジネス的によい(有用である)プログラムと 自分が個人的によいと信じるプログラムが交差するとすると、それは素晴らしい。 逆に言えば、それがずれていると不幸。

意味のあるエラーメッセージを作成したり、誤りを犯しにくい、
柔軟性のある入力形式を設計することは、真の芸術であるといえるでしょう。

言い過ぎな気もするが。。。

Emacsがすばらしいということ

仕事は芸術になるか?以下のようなことが述べられている。

私たちは、ほとんどどうしようもないくらい退屈で、
どんな創造性のはけ口も見当たらないような、
プログラミングの仕事を割り当てられることがあります。

この私の仕事をどうやって芸術にしたらよいのでしょうか?

この状況では創造性や芸術的手腕の余地はないでしょう。
しかしこのような場合でさえ、大きな改良を加える方法はあるものです。
もし仕事のための道具が美しいものであれば、決まりきった仕事をするのも楽しくなるものです。

つまり仕事とは、Emacsを芸術作品に昇華させること、と読めた。

まとめ

まとめると、Artとしてのプログラムとは、

  • 自分が美しいと感じるプログラム
  • 創造的な、独創的なプログラム

であること。

仕事としてではなく、個人として、自分の楽しいと思えるArtを作り上げるとプログラマは幸せになれる。

Artは個人的な感性である。それが、

  • 仕事におけるよいこと交差すればプログラマは幸せになれる。
  • 仕事におけるよいことと交差しなければ、仕事とはEmacsを芸術作品に昇華させることだと割り切れば幸せになれる。

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>