読者です 読者をやめる 読者になる 読者になる

あさのひとりごと

3日坊主にならないように、全力を尽くします。 記事は個人のひとりごとです。所属する組織の意見を代表するほど、仕事熱心じゃないです。

Docker on AzureでJavaEE実行環境を構築する手順

はじめに

Microsoftが提供しているクラウドサービスであるAzureを使って、Ubuntuで動くJavaEEによるWebアプリケーションの実行環境をDockerを使って作ってみたいとおもいます。

前提知識

Microsoft Azureは、マイクロソフトクラウドプラットフォーム(PaaS/IaaS)です。WindowsServerだけでなくUbuntuなどのLinuxサーバも動作するオープンなクラウドサービスです。

  • Dockerとは?

Docker(ドッカー)は、仮想化環境でアプリケーションを管理/実行するためのオープンソースのミドルウエアです。Linuxカーネル上で動作するのが特徴です。アプリケーションと実行環境をすべて含めて「Dockerイメージ」にパッケージングして、管理できます。

JavaEEとは、Javaによる大規模Webアプリケーション構築のためのエンタープライズなプラットフォームです。JSF/EJB/JDBC/JNDI/Servlet/JSP/JTA/JAX-RS/CDI/ELなどの技術仕様を総称したもので、、、(続きを読む)

1. JavaEEアプリのwar作成

適当なWebAPSampleという名前のサンプルアプリを作ります。 今回は、動かすだけなのでJSFのひな形そのままな感じのもので。 作成したWebAPSample.warファイルを使ってDockerイメージを作っていきます。

2. Dockerイメージ作成

作成したwarファイルをGlassFishで動かすためのDockerfileを作成します。

なお、Dockerをクライアントにインストールしていないときは、DockerToolboxをダウンロードしてインストールします。

Dockerイメージは、GlassFish公式イメージをベースに作ります。

GlassFishは、オープンソースのWebアプリケーションサーバで、JavaEEの参照実装です。

GlassFishのWeb管理コンソールを使うため、パスワードの設定やセキュリティの設定をして、サービス用の8080番ポートと管理コンソール用の4848番ポートを開放します。

Dockerfileはこんな感じで。

# GlassFishでWebアプリケーションをデプロイする
# 
# ベースイメージの取得
FROM glassfish:4.1-jdk8

# 作成者情報
MAINTAINER 0.1 asashiho@mail.asa.yokohama

# 環境変数の設定
ENV GLASSFISH_HOME /usr/local/glassfish4
ENV PASSWORD glasspass
ENV TMPFILE /tmp/passfile

# 管理者パスワードとセキュリティの設定
RUN echo "AS_ADMIN_PASSWORD=" > $TMPFILE && \
    echo "AS_ADMIN_NEWPASSWORD=${PASSWORD}" >> $TMPFILE  && \
    asadmin --user=admin --passwordfile=$TMPFILE change-admin-password --domain_name domain1 && \
    asadmin start-domain && \
    echo "AS_ADMIN_PASSWORD=${PASSWORD}" > $TMPFILE && \
    asadmin --user=admin --passwordfile=$TMPFILE enable-secure-admin && \
    asadmin --user=admin stop-domain && \
    rm $TMPFILE

# warコンテンツの配置
ADD WebAPSample.war $GLASSFISH_HOME/glassfish/domains/domain1/autodeploy

# ポートの解放
EXPOSE 4848 8080

# glassfishの実行
CMD ["asadmin", "start-domain", "-v"]

このDockerfileと作成したWebAPSample.warを同じディレクトリに置きます。 そして、docker buildコマンドでイメージを作成します。

$ ls
Dockerfile  WebAPSample.war

$ docker build -t asashiho/glassfish .

作成したイメージをDockerHubにアップロードします。

$ docker login
$ docker push asashiho/glassfish

作成が面倒な方は、こちらのDockerイメージを使ってください。 docker-glassfish

3. AzureでのDocker実行環境作成

Azure上でGlassFishコンテナを動かすために、Dockerの実行環境を作ります。 Docker Machineは、Dockerの実行環境を自動生成するためのコマンドです。各種クラウドVMなどに環境を作ってくれます。

Azureだけじゃなくて、AWS/SoftLayer/Rackspace/VirtualBoxなどさまざまな環境にDocker実行環境を自動生成できます。

今回は、docker-machneコマンドで、Azure上にDocker実行環境を構築します。

まず事前準備として、Azureにアクセスするため、証明書を作成します。 こんな感じで。

$ openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem
$ openssl pkcs12 -export -out mycert.pfx -in mycert.pem -name "My Certificate"
$ openssl x509 -inform pem -in mycert.pem -outform der -out mycert.cer

生成した証明書(mycert.cer)を[Azure クラシック ポータル]-[設定]-[管理証明書]-[アップロード]からアップロードします。

これで、準備完了です。

準備が完了したので、いよいよAzure仮想マシン上にDocker実行環境を構築します。 仮想マシン名(docker-asaasa)は任意の名前に変更してください。

$ docker-machine create -d azure \
 --azure-subscription-id="サブスクリプションID" \
 --azure-subscription-cert="mycert.pem" \
 --azure-location "Japan Wast" \
 --azure-username "ユーザ名" \
 --azure-password "パスワード" \
 docker-asaasa

これでAzureの仮想マシン生成&Dockerの環境構築が完了です。 ちゃんと動いているのが分かります。

$ docker-machine ls
NAME             ACTIVE   DRIVER       STATE     URL                                      SWARM
default          -        virtualbox   Running   tcp://192.168.99.100:2376      
docker-asaasa   *        azure        Running   tcp://docker-asaasa.cloudapp.net:2376

4. GlassFishコンテナを動かす

作成したAzure仮想マシンに以下のコマンドでアクセスします。

$ docker-machine env docker-asaasa
$ export DOCKER_TLS_VERIFY="1"
$ export DOCKER_HOST="****"
$ export DOCKER_CERT_PATH="****"
$ export DOCKER_MACHINE_NAME="docker-asaasa"


$ docker-machine ssh docker-asaasa
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-36-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

 System information disabled due to load higher than 1.0

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

次のコマンドで、先ほど作成したGlassFishのDockerイメージをダウンロードします。

$ sudo docker pull asashiho/glassfish

Dockerイメージからコンテナを起動します。 ここで、あらかじめAzure仮想マシンのエンドポイントに8080ポートと4848ポートを設定しておいてください。

# コンテナの起動
$ sudo docker run -d -p 8080:8080 -p 4848:4848 asashiho/glassfish

# コンテナの確認
$ sudo docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                                        NAMES
6ea4bd4c5368        asashiho/glassfish   "asadmin start-domain"   30 minutes ago      Up 29 minutes       4848/tcp, 8181/tcp, 0.0.0.0:8080->8080/tcp   thirsty_poincare

5. 動作確認

GlassFishでサンプルアプリが動作していることを確認するために、ブラウザから以下のURLにアクセスします。

http://(Azure仮想マシンDNS名):8080/WebAPSample/ docker1.png

6. Azure上のDocker実行環境削除

削除もばさっと。

$ docker-machine stop docker-asaasa
$ docker-machine rm docker-asaasa

今回はAzureで動作させましたが、DockerMachineを使うと、どのクラウドサービスで動かしてもdocker-machineコマンドで一括操作できます。 クラウドごとのCLIは不要です。

まとめ

AzureといえばMicrosoftMicrosoftといえばWindowsMicrosoftといえば.NETなイメージなのですが、Dockerも動くし、UbuntuJavaも動きました。

「ITエンジニアのための機械学習理論入門」のセットアップ手順(Windows10編)

機械学習の基本的な考え方が丁寧に解説されている、ITエンジニアのための機械学習理論入門の実行環境を、Windows10でセットアップする手順をまとめました。

なお、詳細な説明については書籍を参照してください! f:id:dr_asa:20170511090826p:plain

Amazon CAPTCHA

前提環境

項目 説明
ハードウエア Microsoft Surface Pro4
OS Windows10 pro 64bit

セットアップ手順

1.ダウンロード

Enthought Canopyのサイトからダウンロードします。緑の[GetCanopy]ボタンをクリックします。

f:id:dr_asa:20170511090930p:plain

ここで、[Get Sterted with Canopy Express-Free]の[Download]ボタンをクリックします。

f:id:dr_asa:20170511090941p:plain

OSのアーキテクチャに合わせてインストールモジュールを選択します。私の環境では「Windwos」で「64bit」なので次のように選択し、[DOWNLOAD Canopy]ボタンをクリックします。 f:id:dr_asa:20170511090950p:plain

2.インストー

ダウンロードしたcanopy-1.7.4-win-64.msiをダブルクリックしてインストールを開始します。

f:id:dr_asa:20170511091022p:plain

[I accept the terms in the License Agreement]をチェックして[Next]をクリックします。

f:id:dr_asa:20170511091032p:plain

[Next]をクリックします。 f:id:dr_asa:20170511091041p:plain

[Install]をクリックします。

f:id:dr_asa:20170511091107p:plain

インストールが完了したら、[Launch Canopy when setup exits]をチェックして[Finish]ボタンをクリックします。

f:id:dr_asa:20170511091117p:plain

[Continue]をクリックします。

f:id:dr_asa:20170511091128p:plain

[Start using Canopy]をクリックします。

f:id:dr_asa:20170511091137p:plain

インストールが完了しました。

3.環境設定

書籍を参考にして、Githubからサンプルコードを取得します。 取得したzipファイルを作業用フォルダである[ドキュメント]フォルダで展開します。 次のセットアップ用のバッチファイルを実行します。(ファイルのダブルクリックで可)

$ config_win.bat

デスクトップに生成された「PyLab (64-bit)」アイコンを右クリックして、書籍の内容に従って次のように設定します。

f:id:dr_asa:20170511091150p:plain

サンプルの動作確認

デスクトップの「PyLab (64-bit)」をダブルクリックします。

In [1]: ls
 ドライブ C のボリューム ラベルは TIH0111000A です
 ボリューム シリアル番号は 041E-C592 です

 C:\Users\<YourName>\Documents\ml4se のディレクトリ

2016/12/23  12:27    <DIR>          .
2016/12/23  12:27    <DIR>          ..
2015/06/16  13:13               293 config_centos.sh
2015/06/16  17:45               293 config_mac.sh
2015/08/11  20:21               383 config_win.bat
2015/05/21  06:23            18,047 LICENSE
2015/05/21  06:23                68 README.md
2016/12/23  12:27    <DIR>          scripts

サンプルのフォルダに移動します。

In [2]: cd scripts/
C:\Users\<YourName>\Documents\ml4se\scripts

次のコマンドを実行し、最尤推定法による正規分布の推定結果のサンプルを実行します。

In [3]: run 03-ml_gauss.py

別ウインドウでグラフが表示されます。 f:id:dr_asa:20170511091206p:plain

Nの値が増えるにしたがって、推定結果が正解に近づいているのが分かります。

以上

Raspberry Pi3 でOpenvSwitch+Tremaを動かした~OpenFlow入門~

由緒正しき物理ネットワークの世界では、スイッチやルータなどの通信機器が独立したOSや制御ソフト、ルーティング機能やデータ転送機能もっていて、設定や構成などの作業も手作業で行っていました。ネットワークの構成は物理に依存し、人間によってケーブルを抜き差しするという温かみのある運用を行っていました。私の青春時代は、まさにこれにすべてを費やしていたといっても過言はありません。

SDN(Software-Defined Networking)は、物理的な変更を行わず、ソフトウエアの設定変更のみでネットワーク構成を変更できる、素晴らしいものです。

SDNは通信機器の制御機能データ転送機能を分離し、制御機能をソフトウェアで一元管理することで、どの通信機器にどのような動作をさせるかをソフトウエアで設定できるようになります。

私は、SDNの超初心者ですが、とても楽しそうな世界が果てしなく広がっている気がしてならないので、RaspberryPi3を使ってOpenvSwitchを動かして、Hello Tremaをやってみました。

対象読者

  • OpenFlow超初心者
  • Linuxの基本コマンドが分かる
  • RaspberryPi3がセットアップできる
  • Rubyの文法が分かる

RaspberryPi3のセットアップ

Raspberry Piラズベリーパイ)は、教育用に開発されたシングルボードコンピュータです。ARMプロセッサを搭載し、microUSBで電源を供給し、OSをSDカードにインストールすることで動作します。一言でいってしまえば、約6000円で買うことができる、タバコの箱サイズの小さなパソコンです。秋葉原秋月電子に行けば買えますし、Amazonでポチッとしてもよいでしょう。翌日には届きます。

いくつかのモデルがありますが、最新版のRaspberry Pi3は、CPUが1.2 GHz クアッドコア Cortex-A53 ARMv8 64bit で、2.4GHz帯のIEEE 802.11 b/g/n(1x1:1)に対応したBroadcom BCM43438が搭載されています。f:id:dr_asa:20170511085921j:plain

公式サイトは、以下になります。

Raspberry Pi - Teach, Learn, and Make with Raspberry Pi https://www.raspberrypi.org/

Raspberry Piで利用できるOSは、公式サイトからダウンロードできます。Linuxベースのもの以外にも、Windows10 IoT CoreやRISC OSも利用できます。RISC OS はARMアーキテクチャシステム向けに設計されたOSです。

RaspberryPi3のセットアップは簡単です。公式サイトからダウンロードしたイメージをMicroSDカードに入れて初期セットアップをしてしまえば、すぐに使えます。

詳細な手順については、このあたりを読んでいただければと思います。

Raspberry Piで電子工作をはじめよう! ~まずはRasbian(OS)のセットアップから~ http://codezine.jp/article/detail/9027

RaspberryPiのセットアップが完了し、同一セグメント内の他のPCのターミナルコンソールからアクセスできれば準備は完了です。

OpenvSwitchのインストー

OpenFlowとは、ネットワークをソフトウエアで制御する技術です。ネットワークスイッチの動作を制御する標準プロトコルで、ネットワークの動作をソースコードで記述できます。OpenvSwitchはOpenFlowに対応したソフトウエアスイッチです。 今回は、これをRaspberryPiで動かしたい!まずはここまで頑張ります。

OpenvSwitchの公式サイトは以下の通りです。 http://openvswitch.org/ f:id:dr_asa:20170511090032j:plain

Ubuntu/Debianであればapt-getコマンド、CentOSであえばyumコマンドでインストールできますが、RaspberryPiでは、Rasbian というDebianベースのOSが動いています。そこでソースコードからインストールしていきます。

1. OpenvSwitchのダウンロード

以下のサイトにソースコードが公開されていますので、ダウンロードします。最新版は、2.5.0です。 http://openvswitch.org/download/

$ wget http://openvswitch.org/releases/openvswitch-2.5.0.tar.gz
--2016-06-24 22:31:42--  http://openvswitch.org/releases/openvswitch-2.5.0.tar.gz
openvswitch.org (openvswitch.org) をDNSに問いあわせています... 69.56.251.103
openvswitch.org (openvswitch.org)|69.56.251.103|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 4603077 (4.4M) [application/x-gzip]
`openvswitch-2.5.0.tar.gz' に保存中

openvswitch-2.5.0.t 100%[=====================>]   4.39M  2.50MB/s 時間 1.8s

2016-06-24 22:31:44 (2.50 MB/s) - `openvswitch-2.5.0.tar.gz' へ保存完了 [4603077/4603077]

tarコマンドで解凍します

$ tar xzf openvswitch-2.5.0.tar.gz

2. ビルドの依存関係チェック

OpenvSwitchをビルドするにあたり、必要なパッケージをチェックします。

$ dpkg-checkbuilddeps
dpkg-checkbuilddeps: Unmet build dependencies: graphviz autoconf (>= 2.64) automake (>= 1.10) | automake1.10 debhelper (>= 8) dh-autoreconf libssl-dev libtool python-all (>= 2.7) python-qt4 python-twisted-conch python-zopeinterface

いろいろ必要なようですので、apt-getコマンドでインストールしていきます。

$ sudo apt-get -y install graphviz autoconf automake dh-autoreconf libssl-dev libtool python-all python-qt4 python-twisted-conch python-zopeinterface

また、uuid-runtimeとdkmsも必要になるので、ここでインストールしておきます。

$ sudo apt-get -y install uuid-runtime dkms

これで準備が完了しました。

3. OpenvSwitchのビルド

ソースコードを展開すると、以下のような構成になっています。 RaspberryPiのOSはDebian系なので、INSTALL.Debian.mdを読みながらビルド/インストールします。

$ ls
AUTHORS             INSTALL.Windows.md          Vagrantfile       ofproto
CONTRIBUTING.md     INSTALL.XenServer.md        WHY-OVS.md        ovn
COPYING             INSTALL.md                  acinclude.m4      ovsdb
CodingStyle.md      INSTALL.userspace.md        aclocal.m4        package.m4
DESIGN.md           IntegrationGuide.md         appveyor.yml      python
Documentation       Makefile.am                 boot.sh           rhel
FAQ.md              Makefile.in                 build-aux         selinux
INSTALL.DPDK.md     NEWS                        config.h.in       tests
INSTALL.Debian.md   NOTICE                      configure         third-party
INSTALL.Docker.md   OPENFLOW-1.1+.md            configure.ac      tutorial
INSTALL.Fedora.md   PORTING.md                  datapath          utilities
INSTALL.KVM.md      README-lisp.md              datapath-windows  vswitchd
INSTALL.Libvirt.md  README-native-tunneling.md  debian            vtep
INSTALL.NetBSD.md   README.md                   include           windows
INSTALL.RHEL.md     REPORTING-BUGS.md           lib               xenserver
INSTALL.SELinux.md  SECURITY.md                 m4
INSTALL.SSL.md      TODO.md                     manpages.mk

INSTALL.Debian.mdには、次のような記述があります。もし、めっちゃ急いでるようだったら、テスト無しでもできますよ。と。

-------------
If you are in a big hurry, you can even skip the unit tests:
`DEB_BUILD_OPTIONS='parallel=8 nocheck' fakeroot debian/rules binary`

DEB_BUILD_OPTIONS='nocheck' fakeroot debian/rules binary
-------------

というわけで、次のコマンドを実行してビルドします。

$ DEB_BUILD_OPTIONS='nocheck' fakeroot debian/rules binary

ものすごく、時間がかかります。コーヒーでも飲みながら待ちましょう。

なお、ビルドには、build-essentialとfakerootが必要になるので最新版が入っていない時はいれておきます。2016-05-27-raspbian-jessieは、最新版がすでに入っていたので不要でした。

$ sudo apt-get -y install build-essential fakeroot

4. OpenvSwitchのインストー

ビルドが完了したら、親ディレクトリにdebファイルが生成されています。やったね!

$ pwd
/home/pi/hello_trema

$ ls
openvswitch-2.5.0
openvswitch-2.5.0.tar.gz
openvswitch-common_2.5.0-1_armhf.deb
openvswitch-datapath-dkms_2.5.0-1_all.deb
openvswitch-datapath-source_2.5.0-1_all.deb
openvswitch-dbg_2.5.0-1_armhf.deb
openvswitch-ipsec_2.5.0-1_armhf.deb
openvswitch-pki_2.5.0-1_all.deb
openvswitch-switch_2.5.0-1_armhf.deb
openvswitch-test_2.5.0-1_all.deb
openvswitch-testcontroller_2.5.0-1_armhf.deb
openvswitch-vtep_2.5.0-1_armhf.deb
python-openvswitch_2.5.0-1_all.deb

いよいよインストールをしていきます。

$ sudo dpkg -i openvswitch-common_2.5.0-1_armhf.deb
$ sudo dpkg -i openvswitch-datapath-dkms_2.5.0-1_all.deb
$ sudo dpkg -i openvswitch-switch_2.5.0-1_armhf.deb

エラーが出なければ、これでインストール完了です。

5. OpenvSwitchの起動

インストールしたOpenvSwitchを次のコマンドで起動します。

$ sudo service openvswitch-switch start

Tremaのインストー

SDNはソフトウエアでネットワーク全体を制御するものですが、ソフトウエアである以上開発していくときにフレームワークがあったほうが楽です。Trema(とれま)とは、OpenFlowコントローラを開発するためのオープンソースソフトウエアです。

公式サイトは以下の通りです。 http://trema.github.io/trema/

OpenFlowに関しては、以下を読むことをお勧めします。 私はセレブな主婦なので、書籍を購入しました。 f:id:dr_asa:20170511090126p:plain

Tremaをインストールは次のコマンドを実行します。

$ sudo gem install trema

これで準備はすべて完了です。

Hello Trema

ソフトウエアでネットワークを!と言われてもピンと来なかったので、まずはHello Tremaを動かしてみます。考えても分からないところは手に教えてもらう、という勉強法で今まで生きてきたのでそのスタイルを貫きます。

以下からプロジェクトリポジトリをcloneします。

 $ git clone https://github.com/trema/hello_trema.git

普通のRubyのフォルダ構成なので、少し安心です。

$ ls
CHANGELOG.md     Gemfile.lock  README.md  lib    trema.conf
CONTRIBUTING.md  Guardfile     Rakefile   spec
Gemfile          LICENSE       features   tasks

1. スイッチ設定ファイル作成

trema.confというファイルがスイッチの設定ファイルになります。vswitch で始まる行が1台の仮想スイッチで、datapath_id が仮想スイッチを一意に識別するためのIDです。

datapath_id はMACアドレス的なものらしいので、重複しないように設定する必要があります。OpenFlowの仕様では、この値には64ビットの一意な整数値を割り振ることになっています。

この設定ファイルでは、0xabcというdatapath_id の仮想スイッチを1台定義しているという意味になります。

$ cat trame.conf
vswitch { datapath_id 0xabc }

2 制御コードの実装

制御部分は、Rubyで実装していきます。サンプルプロジェクトのlib/hello_trema.rbを使います。Trema::Controllerクラスを継承して作ります。

# Hello World!
class HelloTrema < Trema::Controller
  def start(_args)
    logger.info 'Trema started.'
  end

  def switch_ready(datapath_id)
    logger.info "Hello #{datapath_id.to_hex}!"
  end
end

このクラスには2つのハンドラがあります。

  • start ハンドラ コントローラの起動イベント発生時に呼び出される

  • switch_ready ハンドラ スイッチがコントローラに接続し、初期化が完了したときに呼び出される

つまり、コントローラが起動したら、コンソールに 「Trema started.」が表示され、コントローラにスイッチが接続したら、「Hello スイッチのdatapath_id!」が表示されるぞ!と。

ほかにもたくさんハンドラがあるので、すこしずつ勉強していきたいと思います。

ハンドラ 説明
switch_disconnected スイッチがコントローラから切断したとき
packet_in Packet In メッセージがコントローラへ到着したとき
flow_removed フローが消えたときのFlow Removedメッセージ到着時

3. Hello Tremaの実行

tremaコマンドを使って実行します。仮想スイッチの設定ファイルは-cオプションで指定します。

$ trema run lib/hello_trema.rb -c trema.conf

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for pi: 
Trema started.
Hello 0xabc!
Hello 0xabc!

う、動いた!

仮想スイッチを複数にしたらどうなんだろう、trema.confで5台ほど設定してみます。

vswitch { datapath_id 0xa01 }
vswitch { datapath_id 0xa02 }
vswitch { datapath_id 0xa03 }
vswitch { datapath_id 0xa04 }
vswitch { datapath_id 0xa05 }

動いた!!

 $ trema run lib/hello_trema.rb -c trema.conf
Trema started.
Hello 0xa05!
Hello 0xa03!
Hello 0xa04!
Hello 0xa01!
Hello 0xa02!

ありえないほど、地味ですね。どうしよう。 しかし、言葉では表現できないほど楽しい。 f:id:dr_asa:20170511090208j:plain

まとめ

RaspberryPi3をつかって、Trema+OpenvSwitchが動く環境ができあがりました。 ビルドでは、いろいろなエラーが出て苦戦しましたが、Tremaのおきて「最後まで絶対に諦めずやりぬく心」があればできるな!ということが分かりました。

実は、RasbperryPiではなく、Ubuntuの普通のサーバで「OpenFlow実践入門」を読みながら一通り動かしているのですが、スイッチ監視ツール、インテリジェント・パッチパネル、ラーニングスイッチなど動きはしたものの理解ができているか、と言われれば理解は出来ていない部分も多々です。ネットワーク技術とRubyの実装がどっちも分かってないと、果てしなくアレなので、時間をかけて勉強していきたいと思います。

おわり

「プログラマのためのGoogle Cloud Platform入門」が発売されます。

翔泳社より、表題の書籍が出版されることになりました。
監修であり共著者の中井さんを始めとして、執筆にご協力いただいた方々に改めてお礼を申し上げます。

本書では、Google Compute Engine、Google Container Engine、Google App Engineを中心としたGCPの主要サービスを用いて、最適なアプリケーションアーキテクチャーを実現する方法を具体的なサンプルアプリケーションを使って説明しています。

特に、GCPを利用する上で理解しておきたいインフラの基礎技術についても解説が加えられていますので、GCPを通してインフラ技術の基礎を習得したいという方におすすめな入門書となっています。

f:id:dr_asa:20170423230137j:plain]

Amazon CAPTCHA


技術の進化はとても早く、流行とともに忘れ去られるものもたくさんあります。
しかし、時が経っても大きく変わらないものもあります。

本書にまとめた、インフラ技術の基礎は
私が、新卒のころに担当していたオンプレミスの大規模基盤構築プロジェクトで
先輩エンジニアの皆さんから教えていただいたことをベースに書いています。

非常に厳しいプロジェクトでしたが、とりわけ出来の悪かった私に
基礎をていねいに体系立てて指導してくださった先輩方のおかげで、今の私があると思っています。



私は、出産と子育てで約8年間もの長い間、IT業界からは離れていましたが、
2016年の中頃、子育てがひと段落したので、ふたたびSIに携わりたいと思い、現職につきました。

私が育児で現場を離れている間、クラウドや仮想化、大規模分散システムなど
インフラストラクチャを構成する技術要素は大きく変わりました。

そんな中、オンプレミスで止まってしまっている私の知識と経験を十分知ったうえで
「一緒に本を書こう!」と声をかけてくださった、中井さんへの感謝は、、、、言葉にはできないものがあります。

いかに本質的なものを学ぶことが大事か、を
中井さんの圧倒的に高い技術力をベースにして、たくさん教えていただきました。




クビを覚悟のうえで。

私は、ものづくりが好きです。

刻々と変化する時代に合わせ、顧客のビジネスニーズに応じて、顧客と一緒にシステムを作る、というのは
非常にエキサイティングな仕事です。
それが大規模な社会基盤であったり、ミッションクリティカルであるほど、やりがいも大きくなるものです。
再就職にあたり、プライムベンダーに身を置いたのは、顧客に近い位置でものづくりに携わりたかったからです。

しかし、今日のSIの現状は、エンジニアが楽しんで、より良いものをつくろう!という
モチベーションで仕事ができない環境が多いのではないかと感じています。

そのような現状を打破し
新しい技術や開発手法にチャレンジして、イノベーションを起こすには
エンジニア自らがさまざまなことを学び続け、環境を変える以外に選択肢はないのかなと思っています。

しかし、ただやみくもに技術トレンドを追うだけではいけません。
型破りな人間になるためには、破るべき型がなになのかを知らなければなりません。

本書は、そんな若いエンジニアの皆さんのはじめの一歩を踏み出す手助けになればいいな!と思って書きました。
そして、またいつかエンジニアになりたいな、と思っている私自身にむけても。

おわり



www.youtube.com

Share My World (Mary J. Blige) 1997.04.22

Share my world
Don't you leave
Promise I'll be here
Whenever you need me near

TensorFlowでAIとピアノ連弾してみた話

音楽は良いですね。
音楽は、お酒との相性が抜群です。

というわけで、、、、
TensorFlow/Magentaを使った
A.I.Duet」でコンピュータとピアノ連弾する方法をご紹介します。

おことわり
人工知能が音楽を生成するというと、
何かしらの知性や才能のようなものが宿って
そこから生んでいるという感じですが、

人工知能にとって、音楽は「音のデータの連なり」です。
そして、「音楽を生成する」ということは
「それまでの音のデータの連なりからして、適切な次の音を予測する」ということです。
from 同僚の@icoxfog417 先生の詩集より

TensorFlow/Magentaとは

機械学習とは、データが持つ数学的な構造をコンピュータによる計算で見つけ出すしくみのことです。
機械学習の中でも、特に注目を集めているのが、ディープラーニング(深層学習)と呼ばれているものです。

アートの世界での機械学習の応用も、多くはこのディープラーニングの技術を使っています。

TensorFlowは、米Google社がオープンソースとして公開してるディープラーニング対応ライブラリです。
TensorFlow/Magentaは、ディープラーニングを研究するGoogle人工知能部門である「Google Brain」による
ニューラルネットワークを使って、アートを生成するプロジェクトです。
f:id:dr_asa:20170314124427p:plain


オープンソースソフトウェアで、Githubで開発が進められています。
Magenta

A.I.Duetとは

パソコンのキーボード(または対応するMIDIキーボード)でメロディーを奏でると
コンピューターがデュエット演奏してくれるWebアプリです。

TensorflowのMagentaをつかい、事前にプログラムされたアルゴリズムではなく、
既存のメロディーを使った訓練を受け、そこで得た知識を使ってレスポンスを返します。

これを動かすDockerイメージをビルドしたので、遊んでみる手順を簡単に紹介します。

1.Dockerの実行環境構築

ここでは、Google Cloud Platformの仮想マシンでDockerを動かす手順を説明します。

まず、こちらの手順にしたがって、アカウント登録をしてください。
book.mynavi.jp


Cloud Shellとは、GCPのサービスをブラウザから操作できるツールです。
Cloud Consoleの右上のコンソールアイコンをクリックしてください。

f:id:dr_asa:20170314130309j:plain:w400


Cloud Shellで、次のコマンドを実行します。GCPの東京リージョンに、「n1-standard-1」サイズの仮想インスタンスが立ち上がります。

$ GCP_PROJECT_ID=$(gcloud config list project --format "value(core.project)")

$ docker-machine create --driver google \
  --google-project $GCP_PROJECT_ID \
  --google-zone asia-northeast1-a \
  --google-machine-type n1-standard-1 \
  --google-machine-image https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/ubuntu-1404-trusty-v20161109 \
  magenta


これで、Dockerの実行環境が構築できました。

なお、作成した仮想マシンSSHするときは、Cloud Consoleで[SSH]ボタンをクリックします。

f:id:dr_asa:20170314130710p:plain:w400


※なお、Dockerがうごく環境であれば、クライアントPCでもAWSでもAzureでも大丈夫です。
※Dockerって何?、、、そんなあなたは、「プログラマのためのDocker教科書」を図書館で借りてください!


2.「A.I.Duet」のコンテナを動かそう

Dockerが起動している環境にSSHで接続して、次のコマンドを実行します。

$ sudo docker run -it -p 80:8080 --rm --name magenta asashiho/ai-duet

3.「A.I.Duet」でピアノを弾こう

クライアントのブラウザから以下のURLにアクセスします。

http://<Dockerの動いているマシンのIPアドレス>/

こんな感じです。
www.youtube.com


おわりに

Googleらしい、とても面白い取り組みで、TensorFlow/Magentaすごく注目しています。



このMagentaを使ってMIDIデータから音楽を生成するしくみやノウハウなどをまとめた
Signalというタイトルの同人誌を出します。
NN/RNN/LSTMなどの理論や、実際にMagentaを使って音楽を生成する手順などを約40ページでまとめています。
理論は、同僚で共著の@icoxfog417 先生がしっかり書いて、それを私が読んで理解して動かすという感じです。
(想定読者が私になっているので、かなり易しく書かれています)
(私が書いた部分も、彼がきちんと監修してくれているので、ぜんぜん大丈夫です!)

f:id:dr_asa:20170313022558j:plain:w400


4/9(日)に秋葉原で開催される「技術書典2」で頒布しますので、ブース「き-03」にぜひ~!
techbookfest.org

詳しくは、まだ秘密ですが、、、、、
こんな感じです!
www.youtube.com


会場では「littleBits」という簡単な電子工作キットを使って演奏を楽しめます~~~
jp.littlebits.com



おわり

機械学習素人が2か月半で機械学習を入門したことまとめ

ちまたでは、機械学習がブームのようです。
が、、まったく時代についていけていません。

しかし、機械学習、特に自然言語処理に精通した人の採用にかかわる仕事をしている、、、
にもかかわらず、自然言語処理どころか機械学習が全く分からない。

これでは、いけない。ということで
機械学習をたしなむ学生の皆さんと、ふわっと雑談ができるレベル」
を目指して、2017年正月明けから勉強を始めました。

ちなみに、どんなにキリが悪くても1日3時間まで!と決めています。

  1. そもそも機械学習に興味関心があるわけではない
  2. やらなければならない他の仕事がある
  3. 家事育児が優先

なので、すこしでも無理すると続かないためです。

「AIで世界を変えられる!」
人工知能で想像もできない未来が、、、」

みたいなご時世の中、ありえないほどの低テンションで淡々と勉強しているわけで
逆に、そういう意識低い系人間はそんなに多くないでしょうから
なにをやったか、そのログをまとめました。

インプット


■オンライン講座

次の動画を見ました。動画は耳からも情報が入るので、新しく始める分野の勉強にはいいかもしれません。

「みんなのAI講座 ゼロからPythonで学ぶ人工知能機械学習

機械学習に入る前に、PyCharmのインストール
数学の基礎やPythonの基礎などもあるので
ほんとうに初めて触る人にはお勧めできます。

NNの基礎や誤差逆伝播法なども解説があります。
私は、ほぼ知っている内容だったので、途中は端折っています。
www.udemy.com

「Coursera Machine-Learning」

機械学習でとても有名なオンライン講座です。
Octaveという言語を使い、機械学習の理論と実装を学べる講座です。
他の人が、素晴らしいブログを書かれているので、内容はそちらで。

数学の基礎知識が
ほぼ無くても受けられるので、数学嫌いな人にはおすすめです。


まだ途中なのですが、地味に進めたいと思います。
www.coursera.org


「アプリケーション開発者のための機械学習実践講座」

機械学習をビジネスでどう活用するか、という一歩進んだ内容の講座です。
私は、まだビジネスで、、、というレベルまで達してないので
もう少し修業を積んでから受けたいと思います。

私の同僚の@icoxfog417 先生が講師です。
www.udemy.com


■読書

続いて、読んで手を動かした本です。

Pythonによる機械学習入門」

私は、そもそもPythonが苦手なので、まずは苦手意識を克服しようと
Pythonの実装の練習が出来るかなと思って買いました。

機械学習をベースにPythonで実装してみる、という本なので
入門にはおすすめです。半日もかからないです。
shop.ohmsha.co.jp

「ITエンジニアのための機械学習理論入門」

機械学習の理論を数学的な観点から、丁寧に解説されています。
ベストセラーなのは納得です。とても良いです!!

私は機械学習分からない&興味薄めなのですが、
数学は嫌いではないので、そういう方におすすめです。
Amazon CAPTCHAgihyo.jp

「ゼロから作るDeepLearning」

ディープラーニングの入門書です。Pythonでゼロからディープラーニングを作りながら仕組みを勉強できます。
ディープラーニングの基礎や、誤差逆伝播法やCNNなどあります。
数学のかなり易しいレベルまで解説があるので、苦手な人や忘れてしまっている人にはお勧めです。
上記のCourseraの講座もそうですが、偏微分とは?みたいなものもあります。
www.oreilly.co.jp

「TensorFlowで学ぶディープラーニング入門」

こちらのブログで!
dr-asa.hatenablog.com

■講座

「ITエンジニアのための機械学習理論入門」

講師の中井さんとお仕事をさせていただく機会があり、
講座内でDockerを使っていることもあって、サポートとして参加させていただきました。

Codezine Academy


非常に、分かりやすい!!!講座です。
機械学習の理論の丁寧な丁寧な説明があります。
受講するには、大学1年生レベルの数学の知識と、Pythonのコードが読める必要があります。

が、理系大学を卒業して、なにかしらのプログラミング言語が読み書きできる方であれば
どなたでも大丈夫だと思います。
(逆にそうでない方は、しっかりと予習が必要です)

次回は6/29(木)で、4月中旬から募集開始予定なので
効率よく機械学習の理論を勉強したい方は、ぜひー。

またDockerや環境構築などのサポートをさせていただく予定なのでよろしくお願いします。

アウトプット



というのをふまえて、この2か月半での成果です。

■TensorFlow/Magentaの同人誌を書く

TensorFlow/Magentaは、ディープラーニングでアートを生成するプロジェクトです。

このMagentaを使って音楽を生成するしくみやノウハウなどをまとめた
Signalというタイトルの同人誌を出します。
NN/RNN/LSTMなどの理論や、実際にMagentaを使って音楽を生成する手順などを約40ページでまとめています。
理論は、共著の@icoxfog417 先生がしっかり書いて、それを私が読んで理解して動かすという感じです。
(想定読者が私になっているので、かなり易しく書かれています)

ご安心ください!私が書いた部分も、彼がきちんと監修してくれているので
ぜんぜん大丈夫なクオリティです!

f:id:dr_asa:20170313022558j:plain


4/9(日)に秋葉原で開催される「技術書典2」で頒布しますので、ぜひブース「き-03」に!
techbookfest.org

こんなことができます!
www.youtube.com



マイナビ書籍「機械学習で遊ぼう」の記事連載

これは、機械学習とは何ぞや、、というがっちりした連載ではなく
機械学習をつかったアプリを作ってみよう!というカジュアルな連載なのですが、
初回の記事を寄稿させていただきました。
来月はAndroidアプリ、その次はTensorFlowを使ったなにかを予定しています。

book.mynavi.jp

私以外の他の執筆者が、データサイエンス界隈の錚々たるメンバーなので、
記事の内容うんぬんではなく
「たった2か月たらずの勉強で連載を始めてしまうという、メンタルの強さ
が鍛えられたという、とても大きな成果があったと考えています。



機械学習で遊んでみた

勉強だけだと飽きるので、サンプルを動かしてみたり
改造して機能追加してみた程度のものをいくつか作ってみました。

TensorFlow/Magentaでアート生成

同人誌では、TensorFlow/Magentaを使って音楽を生成していますが
Magentaはアートも生成できます。
というわけで、私のアイコンを生成してみました。
f:id:dr_asa:20170313191934j:plain
TensorFlow/Magenta Sample

RaspberryPi3+TensorFlowを使った物体認識

Raspberry Pi3でTensorFlow/Kerasを使った物体認識を試してみました。
学習済みモデルInceptionV3をRaspberryPiで動かしています。
カメラモジュールの精度が悪く、写真そのものが綺麗に取れないんですが、なんとか認識です。

f:id:dr_asa:20170313022159j:plain:w350

AndroidとTensorFlowでMNIST

こちらは、Android上でMNISTの手書き文字認識を行った例です。
f:id:dr_asa:20170313022218j:plain:w200

AndroidGoogle Vision APIOCR

Google Cloud Platformの画像認識APIであるVision APIをつかったOCRの例です。
f:id:dr_asa:20170127150944p:plain:w200

Azure Cognitive ServicesのFaceAPIでWPFアプリ

こちらは、AzureのCognitive Servicesの画像認識APIであるFaceAPIをつかった顔認識の例です。
ドキュメントも豊富でとても使いやすい感じです。
f:id:dr_asa:20170313191840j:plain

これから



買ったもののまだ読みきれてない本、終わってない講座があるので、
まずはそれをサボらず進めたいと思います。

で、仕事でやっているので
インプットしたものを、少しでもアウトプットしなければいけないわけですが
う~~~~~~~~~~~~ん、難しい。
すでに、データサイエンティストの方がすごい情報を発信しているわけなので。


私は、たまたま数学がそんなに嫌いではなかったのと、良い先生たちが身近にいたので

機械学習に入門しよう!という心理的&技術的ハードルはそれほど高くなかったわけですが
数学が嫌いな人や、なにから手を付けようという人は、とてもしんどいんじゃないかな~と。


なので、彼らから教えてもらったことをきちんと咀嚼して、
機械学習を始めるうえで、ぜったいにはずせない重要かつ基礎的なところである

機械学習はじめたい人のための大学1年生の数学超入門」みたいな連載を
ゆっくりペースで始めたいな~とおもっています。


応援メッセージが届くなど



情報発信は、だるいわけです。

が、ここ最近AWSの本を読んでくださったエンタープライズな方からファンレターをいただくことが増え、とてもありがたいなと思っています。


あと、Twitterでまほうのことば「ナビエストークス」と呟くと、その筋の人から
「Dockerの本読みました!」
とDMが届いたりして、めちゃくちゃ嬉しい。
これは、本当にテンションが上がります。


そして、紙でメッセージをいただくこともあります。
そうじもやってるよ!!!
f:id:dr_asa:20170314092549j:plain:w350


というわけで、無理のない範囲で
インプットしたものを、整理しながら情報発信していければなと思っています。

機械(工学の)学習に必要な数学をやり直してみた話

ちまたでは、機械学習がブームのようです。
が、、まったく時代についていけていません。

機械学習は、数学が大事と言われています。

そこで、機械(工学の)学習に必要な数学をやり直してみようか
という、まさかの左斜め下方向からのアプローチで、すこしタイムスリップしてみました。

※注意: 流行りの機械学習の話は一切出てきません

1.機械工学とは

機械工学(Mechanical Engineering)とは、機械の設計/製作/運用の全てを対象とする工学の分野です。

次の4つの力学(通称:よんりき)を基礎として、あらゆる産業の基幹を支える重工業をはじめ、航空機/鉄道/自動車/船舶/ロボット/ロケット/人工衛星などありとあらゆる分野に応用されている工学分野です。

  1. 機械力学
  2. 熱力学
  3. 流体力学
  4. 材料力学

機械工学が取り扱う学問は、広範囲にわたるので、このうち熱力学と流体力学を取り上げます。

■熱力学とは

熱力学とは、熱や物質の輸送現象やそれに伴う力学的な仕事を解明する学問です。熱力学には次の基本法則があります。

  1. 第0法則(熱平衡)
  2. 第1法則(エネルギー保存則)
  3. 第2法則(エントロピー増大則)
  4. 第3法則(ネルンストの定理)

特に、エネルギーを消費することなく継続的に仕事をする永久機関は存在しない!という第1法則(エネルギー保存則)は、有名です。また、第一種永久機関と呼ばれる「外部から何も受け取ることなく、仕事を外部に取り出すことができる機関」は、ある機関が仕事をするためには外部から熱を受け取るか、外部から仕事をなされるかが必要なので、第一種永久機関は何もエネルギー源の無いところからエネルギーを発生させているので、保存則に反している、と言えます。

熱力学ではエントロピーと呼ばれる、運動状態の混沌性や不規則性の程度を表す重要な状態量があります。これは一般では系の乱雑さを表す量と言われていて、自然界では常にエントロピーが小→大に方向に進むというのが、エントロピー増大則です。つまり、閉じた系では、必ず秩序から無秩序へ向かう!というわけです。私は、方向性のある現象は、一方向には進むものの、逆方向には戻らないものとざっくり理解しています。熱力学におけるエントロピーは、この不可逆性の度合いを、数値にしたものです。

流体力学とは

流体力学とは、水や空気などの流体(Fluid)が流れる現象を、力学的に解析する学問です。流体に対してさまざまな力が作用することで流れ場がつくられます。流体にかかる力は、圧力/重力/慣性力/せん断応力などがあります。これらの力の収支を取ると状態方程式が導出されます。質量の収支式は連続の式、運動量の収支式はナビエ・ストークスの運動方程式と呼ばれています。

流体には、層流と乱流があり、一般的にはレイノルズ数Reという流体の慣性力と粘性力の比を表す無次元数がありますこの、Reがある一定の数値より大きくなると層流から乱流に遷移します。蛇口から出る水の量が少ないときは、規則正しい流れができますがこれが層流です。水量をだんだん増やすと、あるところで不規則な流れに変わります。これが乱流(Turbulence)です。

乱流は、流速/圧力/温度などの物理量が時間的にだけでなく、空間的にも不規則に変動します。そして、大小さまざまなスケールの渦運動が発生します。渦運動には、流体でありながら剛体と同じように、速度wが渦中心からの半径 rに比例して変化する強制渦領域(Forced vortex)と、速度wが渦中心からの半径rに反比例して変化する自由渦領域(Free vortex)があります。流れ場に渦が多数存在すると、フローパターンはものすごく複雑になります。よって、乱流はいまだ解明できてないことが数多くあります。

だから、おもしろい。というわけでCFDの登場です。


2.数値流体力学(CFD)とは

流体力学や熱力学で導出される偏微分方程式の多くは、解析解を求めることができないといわれています。そこで、境界条件(Boundary Condition)と初期条件(Initial Condition)を決め、支配方程式の近似解を求めるため、計算機でシミュレーションして、実際の工業の分野に応用させていきます。熱エネルギーの移動も含める場合は、数値熱流体力学と呼びます。

数値流体力学は、流体力学の支配方程式の理解に加えて、非線形偏微分方程式を計算機上で解析できるようにする離散化という処理やプログラミング言語アルゴリズムの知識が必要になってきます。
あと、仮定した理論や計算結果の正当性を検証するため、実験を行い結果を評価したりもします。

CFDは、航空や自動車などの空力制御などや、重工業やプラントなどでの管内流れ(非定常流や粘性流体)の解析などのエネルギー分野でも多く使われています。

3.数値流体力学(CFD)のために必要な基礎知識

まず、数値流体解析に必要な知識を大まかにまとめると、次のようになります。

f:id:dr_asa:20170516134246j:plain

理論

流体力学

流体力学の基本は、やはり力学です。まず、力学を学ぶうえで、質量/長さ/時間などのSI単位や流速/運動量/エネルギーなどの物理量のちゃんとした理解が必要です。高校までの数学や物理は、教科書に公式があって、それを丸暗記してパターン化すれは、テストでよい点をとることはできます。でも、力学の概念的なところを自分の頭で考えることが難しい&苦手な人は、CFDは難しいと思います。

解析学

CFDでは、ある程度の数学の知識が必要です。特に、解析学です。古典ニュートン力学の基本である微分積分学複素解析などは基礎的なところを学んでおかないと、CFDで行う計算の意味がまったく理解できないと思います。ただし、理学系の理論数学とは異なり、数値解析の世界では「①ある事象を数式で表現し、②それを解くためのテクニック」が必要です。

たとえば、、、、

有限差分法は、微分方程式を解くため、微分を有限差分近似で置き換えて得られる差分方程式で近似する数値解法で、FDMと呼ばれてます。

有限要素法は、解析的に解くことが難しい微分方程式の近似解を数値的に得る方法の一つです。方程式が定義された領域を要素に分割し、補間関数をつかって近似していきます。ナビエ・ストークスの運動方程式など離散化して行列式に分解するときによく使われます。有限要素法には、メッシュ/節点/要素といった考え方が出てきます。


計算機

■ プログラミング

数値解析の主たるタスクは、離散化した方程式を解くことです。そのため、ニュートン法ガウスの消去法、最小二乗法、テーラー展開などを理解しておく必要があります。あとは、膨大な計算を行うため、計算機の知識のプログラミング言語が必要です。CFDの場合は、昔はFortranが多く使われてましたが、最近はC++などが多いようです。そして数値解析を行う上では、誤差の概念や、解の収束や発散などの考え方も必要です。

また、良い解を求めるためには、境界条件や初期条件をどう設定するかが重要です。CFDの境界条件の設定は、試行錯誤によるところもありますが「流体力学の深い知識」が有効に効いてくると思います。

■ ハードウエア

大量の演算を行いますので、計算機のマシンリソースを有効に使うための知識が必要です。機械学習と異なり、大量データを扱う知識よりは、ハードウエアに近い低レイヤーの知識(プロセッサやネットワークなど)が重要だと思います。

ビジネス

数値流体解析が使われる分野は、重工業・プラント・自動車・航空機などの輸送機器など多岐にわたります。
シミュレーションは、あくまでもシミュレーションでしかないので、実際にどう活用するかは、それぞれのビジネスに依存します。




というわけで、ぼんやりを思い出したところで、熱力学・流体力学の基礎方程式を導出する簡単な計算ドリルを解きます。

計算ドリル1: 熱伝導の基礎方程式



まずは、熱力学の基礎である熱伝導方程式を導出していきます。
熱伝導率を kとし、高さ y、奥行き zのコントロールボリューム内の x軸方向のヒートフローを考えます。

微小時間 \Delta tの間に、 xの位置にあるコントロールボリュームに流入する熱量は

$$
g\left( x\right) \Delta t = -k\dfrac {\partial T} {\partial x}\Delta t
$$

で算出すれば、それより\Delta x離れたコントロールボリューム外に流出する熱量は

$$
g\left( x +\Delta x\right) \Delta t = \left( -k\dfrac {\partial T} {\partial x}+\dfrac {\partial } {\partial x}\left( -k\dfrac {\partial T} {0x}\right) \Delta x + O\left( \Delta x^{2}\right) \right) \Delta t
$$

となります。

単位時間・単位質量あたりS_{h}の発熱があれば、微小時間\Delta tにコントロールボリュームないで内部発熱する熱量は、密度を\rhoとすると

$$
\left( \rho \Delta x\right) S_{k}\Delta t
$$

となります。この内部発熱量はコントロールボリューム内の温度上昇\Delta Tとして蓄積される熱量と流出する熱伝導量と一致するはずなので、比熱をcとして式にすると

$$
\begin{align}
\left( \rho \Delta x\right) S_{k}\Delta t &= \left( p\Delta x\right) c\Delta T +(q\left( x+\Delta x\right) \Delta t -q\left( x\right) \Delta t) \\
&=\left( \rho \Delta x\right) c(\dfrac {\partial T} {\partial t}\Delta t + o\left( \Delta t^{2}\right) )+\left( \dfrac {\partial } {\partial x}(-k\dfrac {\partial T} {\partial x}\right) \Delta x+O\left( \Delta x^{2})\right) \Delta t
\end{align}
$$

となります。

ここで、\Delta t\rightarrow 0\Delta x\rightarrow 0とすると、次の式となります。

$$
\rho c\dfrac {\partial T} {\partial t}=\dfrac {\partial } {\partial x}\left( k\dfrac {\partial T} {\partial x}\right) +\rho S_{h}
$$

これは、x方向のみなので、コントロールボリュームを(x,y,z)の3次元として、同様の式を解いていくと、

$$
\rho c\dfrac {\partial T} {\partial t}=\dfrac {\partial } {\partial x}\left( k\dfrac {\partial T} {\partial x}\right)+\dfrac {\partial } {\partial y}\left( k\dfrac {\partial T} {\partial y}\right) +\dfrac {\partial } {\partial z}\left( k\dfrac {\partial T} {\partial z}\right)+\rho S_{h}
$$

となります。


流体は管内を流れることが多いので、デカルト(x,y,z)ではなく円筒座標系(x,r)で同じように式を解いていくと

$$
\rho c\dfrac {\partial T} {\partial t}= \dfrac {1} {\gamma } \dfrac {\partial } {\partial r}\left( rk\dfrac {\partial T} {\partial r}\right)+\dfrac {\partial } {\partial x}\left( k\dfrac {\partial T} {\partial x}\right) +\rho S_{h}
$$

となり、一般形として次のように表します。

$$
\rho c\dfrac {\partial T} {\partial t}=\nabla \cdot \left( k\nabla T\right) +\rho S_{n} \tag{1}
$$

これが3次元空間における熱伝導の方程式が導出できます。

計算ドリル2:ナビエ・ストーク運動方程式



次は流体の運動量を考えます。
ある流体の微小なコントロールボリュームに作用する力を整理します。

密度を\rho、流体の質量分率を\phiとすると、コントロールボリュームの面より単位時間あたりに流入する質量は

$$
\left( \rho \phi u-\rho\Gamma _{\phi }\dfrac {\partial \phi } {ax}\right) \left( \dfrac {\Delta V} {\Delta x}\right)
$$

となります。ここで、\Delta x離れた面から流出する質量を考えたとき、テイラー展開の第2項までをとり、高次項を無視すると、

$$
\left( \rho \phi u-\rho\Gamma _{\phi }\dfrac {\partial \phi } {\partial x}\right) \left( \dfrac {\Delta V} {\Delta x}\right) +\Delta x\dfrac {\partial } {\partial x}\left( \rho \phi u-pf_{\phi }\dfrac {\partial \phi } {\partial x}\right) \left( \dfrac {\Delta V} {\Delta x}\right)
$$

したがって、単位時間にx方向へ流出する質量は

$$
\dfrac {\partial } {\partial x}\left( \rho \phi u-\rho\Gamma _{\phi }\dfrac {\partial \phi } {\partial \phi } {\partial x}\right) {\Delta V}
$$

となります。

これは、x方向のみなので、コントロールボリュームをデカルト(x,y,z)の3次元として、同様の式を解いていくと、

$$
\Biggl( \dfrac {\partial } {\partial x}\left( \rho \phi u-\rho \Gamma _{\phi }\dfrac {\partial \phi } {\partial x}\right) +\dfrac {\partial } {\partial y}\left( \rho \phi v-\rho \Gamma _{\phi }\dfrac {\partial \phi } {\partial y}\right)+\dfrac {\partial } {\partial z}\left( \rho \phi w-\rho \Gamma _{\phi }\dfrac {\partial \phi } {\partial z}\right)\Biggl)\Delta V
$$

となります。単位時間・単位質量あたりの質量をS_{\phi }とすると、\Delta V\rightarrow 0\Delta t\rightarrow 0とすると、次の式となります。

$$
\rho S\phi =\dfrac {\partial \rho \phi } {\partial t}+\dfrac {\partial } {\partial x}\left( \rho \phi _{u}-\rho\Gamma _{\phi }\dfrac {\partial \phi } {\partial x}\right) +\dfrac {\partial } {\partial y}\left( \rho \phi _{v}-\rho\Gamma _{\phi }\dfrac {\partial \phi } {\partial y}\right) +\dfrac {\partial } {\partial z}\left( \rho \phi _{w}-\rho\Gamma _{\phi }\dfrac {\partial \phi } {\partial z}\right)
$$

この式を、一般形で次のように表します。

$$
\rho S\phi =\dfrac {\partial S\phi } {\partial t}+\nabla \cdot (p\phi u-\rho \Gamma _{\phi }\nabla \phi ) \tag{2}
$$

ここで、質量分率\phi=1、生成率S\phi=0とすると、流体力学における質量保存則を表した連続の式となります。

$$
\dfrac {\partial \rho } {\partial t}+\nabla \cdot \left( \rho u\right) =0 \tag{3}
$$

デカルト (x,y,z)で書くと

$$
\dfrac {\partial \rho } {\partial t}+ \dfrac {\partial \left( \rho u\right) } {\partial x} + \dfrac {\partial \left( \rho v\right) } {\partial y} + \dfrac {\partial \left( \rho w\right) } {\partial z} =0
$$

で、円筒座標系 (x,r)で書くと

$$
\dfrac {\partial \rho } {\partial t}+ \dfrac {\partial \left( \rho u\right) } {\partial x} + \dfrac {1} {r}\dfrac {\partial \left( r\rho v\right) } {\partial r} =0
$$


式(2)と式(3)から、次の式が得られます。

$$
\rho \left( \dfrac {\partial \phi } {\partial x}+\left( u\cdot \nabla \right) \phi \right) =\nabla \cdot \left( \rho \Gamma \phi \nabla \phi \right) +\rho S_{\phi } \tag{4}
$$

ここで、 \phiは速度成分、 \Gamma \phiは動粘性係数 \nuで、密度が変化しないとみなせる非圧縮性流体を考え、かつ体積力が働かないものとすれば、単位質量あたりの x方向の運動量の生成率に対応する S_{\phi }

$$
S_{\phi }=-\dfrac {1} {\rho }\dfrac {\partial p} {\partial x} \tag{5}
$$

です。式(5)を式(4)に代入して、運動量を求めると

$$
\rho \left( \dfrac {\partial u} {\partial t}+u\dfrac {\partial u} {\partial x}+v\dfrac {\partial u} {\partial y}+w\dfrac {\partial u} {\partial z}\right) =-\dfrac {\partial p} {\partial x}+\mu \left( \dfrac {\partial ^{2}u} {\partial x^{2}}+\dfrac {\partial ^{2}u} {\partial y^{2}}+\dfrac {\partial ^{2}u} {\partial z^{2}} \right)
$$

$$
\rho \left( \dfrac {\partial v} {\partial t}+u\dfrac {\partial v} {\partial x}+v\dfrac {\partial v} {\partial y}+w\dfrac {\partial v} {\partial z}\right) =-\dfrac {\partial p} {\partial y}+\mu \left( \dfrac {\partial ^{2}v} {\partial x^{2}}+\dfrac {\partial ^{2}v} {\partial y^{2}}+\dfrac {\partial ^{2}v} {\partial z^{2}} \right)
$$

$$
\rho \left( \dfrac {\partial w} {\partial t}+u\dfrac {\partial w} {\partial x}+v\dfrac {\partial w} {\partial y}+w\dfrac {\partial w} {\partial z}\right) =-\dfrac {\partial p} {\partial z}+\mu \left( \dfrac {\partial ^{2}w} {\partial x^{2}}+\dfrac {\partial ^{2}w} {\partial y^{2}}+\dfrac {\partial ^{2}w} {\partial z^{2}} \right)
$$

となります。

これは流体力学で最も重要な支配方程式であるナビエ・ストークスの運動方程式です。

このナビエ・ストークスの運動方程式をベクトル表示で書くと次の式になります。

$$
\rho \biggl(\dfrac {\partial u} {\partial t}+\left( u\cdot \nabla \right) u\biggl) =-\nabla p-\mu \nabla ^{2}u
$$

上記のようにナビエ・ストークスの運動方程式非線形偏微分方程式で、解析解を求めるのが難しいといわれています。
そこで、初期条件・境界条件をきめ、系の状態の近似解を解いていくのが、数値流体力学です。


4.まとめ

ずいぶん、昔のことなのできれいさっぱり忘れてましたが、ちょっと手を動かしてみれば、ぼんやり思い出しました。

何年たっても、やり直せるもんだなとも思いました。

流れは人間の目に見えません。
けど、流れを数式で表現すれば、流れがどうなっているのがを知ることができます。
ロマンですね。


おわり