TCP/IP -データリンク層と物理層-

データリンク層と物理層の概要

ネットワーク層の下に位置する、データリンク層はネットワーク間の違いを埋める働きがあります。データリンク層ではデータにヘッダをつけたものをフレームと言います。

また、データリンクの中で信号が流れている部分を物理層と言います。ここでは、ビット列と信号の返還が行われますが、その方法は機器の持つ性質に依存するため、決まったプロトコルはありません。物理層は、他の層と性質が異なるので、データリンク層の一部と考えたり、TCP/IPの階層には含まない場合もあります。

コンピュータからネットワークの玄関口となる機器をネットワークインターフェースカード(NIC)と呼んでいます。NICにはMAC(Media Access Control)アドレスという固有のアドレスが割りふられていて、データリンク層ではこの番号を使って機器を特定しています。ネットワークを超えるときにはIPアドレスが、データリンク層に入ってからはMACアドレスが使用されます。IPアドレスとMACアドレスの違いは、私の解釈ですがIPアドレスはコンピュータを識別するためのもので、送信先と送信元に割り振られてます。一方でMACアドレスはルータなどにも割り振られていて、どの機器を仲介して通ってくるかを指定する目的で使用されるものだと思います。IPアドレスはソフト的に割り振られているため変更が容易です。

[expand title=”Trigger Text”]

データリンクを構成する要素  

  • ノード:データリンク上にある機器のことで、コンピュータやルータのことを指します。
  • 通信媒体:ノード間をつなぐケーブル。その種類には金属線ケーブル、光ファイバーケーブル、無線などがあります。金属線ケーブルが電圧の変化で信号を伝えるのに対して、光ファイバーケーブルは光の明滅で信号を伝えています。
  • ノードと通信媒体をつなぐ機器:ビット列と信号の変換を行います。ネットワークインターフェースカード(NIC)やモデムなどがあります。

データリンクの種類  

  • イーサネット:ネットワーク上のすべての機器上に信号を送り、該当する機器だけが受け取る。最も普及しているデータリンク
  • トークンリンク:ネットワーク上に流れているトークン(しるし)というフレームを使って通信。トークンを取得したコンピュータしか送信できないので(トークンパッシング方式)、フレームの衝突が起きない。
  • FDDI:光ファイバーを使った、トークンパッシング方式のデータリンク。
  • 無線LAN:電波や赤外線を利用。
  • Bluetooth:2.4GHzの電波帯を利用。

xDSLとWiMAXについて  

ADSLや、SDSLなど電話線を使ったデジタル通信の技術を総称してxDSLと呼びます。SDSLがアップロードとダウンロードの速度が等しいのに対して、ADSLはダウンロードの方が早くなっています。現在では携帯電話やWiWAX(Worldwide Interoperability for Microwave Access)など無線系のインターネット接続サービスが増え、ADSL利用者は減少してきています。WiMAXは高速モバイル通信を実現する次世代ブロードバンドで、下り最大40Mbps、上り最大15.4Mbpsと光通信には及ばないものの、動画を再生するにも十分な通信速度です。残念ながら私のアパートではカバーされていませんが、人口カバー率は主要都市では99%、全国でも90%もカバーしているようです。モバイルルーターだけでなくPC、スマートフォンなどに内蔵されたものもあります。

データリンク上の機器について  

  • リピーター:ネットワーク上の信号を補正し、信号の劣化を防ぐ。
  • ブリッジ:信号の補正に加えて、異なる2つのデータリンクをつなぐ機能を持つ。
  • ハブ:ネットワーク上でケーブルを分岐するための機器。リピータの役割も持つ。
  • スイッチングハブ:宛先MACアドレスを見て、特定のノードにのみ信号を送る。

—————————————以下参考文献————————————————–

IPアドレスとMACアドレス」 http://www.mm-labo.com/computer/tcpip/ipaddress/ipaddressandmacaddress.html
「WiMAXと光を比較」 http://wimax-hikari.provider-fan.com/
「TCP/IPの絵本」 アンク著

[/expand]

TCP/IP -ネットワーク層-

ネットワーク層の概要
TCP/IPの5階層のうち中間に位置するネットワーク層についてです。この層は複数のネットワークを越えて宛先のコンピュータにデータを届ける役割を担っています。ほかの層とは違い、主となるプロトコルはIP一つしかありません。
[expand title=”Trigger Text”]

IPプロトコルについて

送信側では、トランスポート層からデータを受け取り、宛先を特定する番号(IPアドレス)などを書き込んだIPヘッダをつけて、データリンク層に渡します。トランスポート層でセグメントと呼ばれていたものは、ネットワーク層ではIPヘッダがつけられIPデータグラムと呼びます。IPのデータ転送はベストエフォート方式と呼ばれています。ヘッダが壊れていないかのチェックや宛先の住所が存在しない時の対応はしますが、再送処理はしません。このことから信頼性のないプロトコルと呼ばれることがあります。受信側では、IPヘッダに書かれたIPアドレス(宛先の住所)を確認して、自分あての時のみ受け取ります。そして、トランスポート層の指定されたプロトコルに渡します。

IPアドレスについて

IPアドレスはネットワーク上の機器を区別するための番号です。番号の重複を防ぐためにはICANNという機関が中心になって世界中のIPアドレスを管理しています。32桁のビット列からなり基本的に次のような構造になっています。

ipadresss

ネットワーク部にネットワーク固有の番号が入り、ホスト部に個々のコンピュータを表す番号が入ります。通常は8ビットずつピリオドで区切り、10進数で表します。

宛先窓の道案内

通信サービスにおいて、ネットワーク間をつないでパケットが宛先に届くまでの道案内をするための機器にルータがあります。ルーターのネットワーク層ではIPヘッダに記されたIPアドレスを見て次の転送先を決定します。通信の世界ではコンピュータ間の距離を通過したルータの数で表します。この時に使用する単位をホップといいます。ルーターが行う宛先までの経路決定をルーティングといいます。ルータはルーティングを行うためにルーティングテーブルという情報を持っています。

[/expand]

セキュリティの技術について

近年サイバー攻撃が問題となり話題となっていますが、ウイルスや不正アクセスなど、ネットワークに潜む様々な危険からコンピュータを守る技術があります。

暗号化

情報を守るための最も基本的な仕組みです。データをある法則に基づいて加工し、第三者が容易に読めないようにすることを暗号化、元に戻すことを復号化と言います。送信側は「鍵」と呼ばれる値を使って暗号化し、受信側は「鍵」を使って復号化しています。

電子署名

データが改ざんされていないかをテェックする仕組みです。データを特殊な方法で数値化し、それを暗号化したものを電子署名といいます。受信側は暗号化された数値を復号化し、送信側と同じ方法でデータを数値化し、等しければ改ざんがないと判断されます。

認証局による保証

通信相手の身元を保証する機関として認証局(CA局)があります。認証局は通信者の間に立ち、第三者的な立場から通信を保証する証明書の発行、管理を行います。

セキュリティプロトコル

暗号化や認証を行うセキュリティプロトコルを使うと、TCP/IP通信の安全性を強化できます。セキュリティプロトコルには、階層の間に挿入して使うものや、ある階層に含めて使用するものがある他、既存のプロトコルと組み合わせて使うものもあります。代表的なプロトコルとしては、遠隔ログイン時の通信を暗号化するSSH(Secure Shell)やデータを暗号化するSSL(Secure Socket Layer)があります。

SSH

別のコンピュータにログインする際、通信を暗号化するためのプロトコルです。コマンドを暗号化して流すので、仮に第三者がパケットを盗んでも簡単には通信の内容を解読できません。遠隔ログインで有名なTelnet(テルネット)には暗号化の仕組みがないので盗聴される危険性があります。現在はTelnetによるリモートログインを受け付けているサーバは少なくなっています。

SSL

ブラウザを介してやり取りする相手を認証し、データを暗号化するためのプロトコルです。ショッピングサイトなどで多く使われています。SSLを適用しているWebページのURLは「https」から始まりHTTPとは異なるポートを使用します。

SSLファイアウォール

firewall(防火壁)は、外部の攻撃からコンピュータを守るための仕組みです。送られてくるパケットを無条件に受け入れていては、コンピュータの安全は確保できません。そこで、パケットを制御する機能を持ったソフトウェアやハードウェアを利用します。これらを総称してファイアウォールと言います。パケットを制限したいところに設置し、設置するとチェック済みのパケットのみしか通ることができません。LANの入り口に設置すればLAN全体を守ることができます。ここのコンピュータに設置することもできます。

具体的には、階層ごとにヘッダの内容に応じたチェック項目を設け、それらをクリアしたデータだけを上の階層に渡すという方法で、不審なデータを振るい落としています。

たとえば・・・

■アプリケーション層

ウイルスの侵入を避けるため、決められた形式のファイル以外は受け付けない!

■トランスポート層

決められたポートあてのパケット以外は受け付けない!
通信を確立していない相手からのパケットは受け付けない!

■ネットワーク層

許可されたIPアドレスからのパケット以外は受け取らない!

安全性を重視すれば、その分ユーザーのできることは制限されます。

————————–参考文献—————————————

「TCP/IPの絵本」
「Wikipedia」 http://ja.wikipedia.org/wiki/Telnet

TCP/IP -トランスポート層について-

トランスポート層の概要  

TCP/IPのアプリケーション層の次はトランスポート層と呼ばれています。アプリケーション層がサービスを実現する役割があるのに対して、トランスポート層には、アプリケーション層とネットワーク層のデータのやり取りの橋渡しを行う役割があります。そのデータの橋渡しを行う方法によって、TCP(Trancemission Control Protocol)とUDP(User Dategram Protocol)の2種類のプロトコルが存在します。TCPはwwwサービスや電子メールなどに使われる信頼性を重視した場面で用いられるプロトコルになっています。一方で、UDPはストリーミングやIP電話などスピードが重視される場面で使用されるプロトコルです。
[expand title=”Trigger Text”]

TCPプロトコル  

TCPはデータを確実に届けるために、受信側と1対1の通信を行います。このような通信をコネクション型通信と言い、おおまかに次の3ステップから成り立っています。トランスポート層で扱うデータの単位をセグメントと言います。

  1. 受信側がデータを受け取れる状態でるかどうかを確認してから通信を開始。
  2. データを決められた大きさに分割して、TCPヘッダをつけて順番に送信する。
  3. データを送り終わったら、通信を終了する。

このように受信側との連絡を密に取ることによって、データ送信の確実性を高めています。その通信状況を伝える手段として使われるのが、TCPヘッダにある6ビットのコントロールフラグです。相手に伝えたい項目を「1」にしてフラグを立てます。

brwu

URG(Urgent):1ならセグメントが緊急データを含んでいる。
ACK(Acknowledgment):1なら通信の確認に対して了解した。
PSH(Push):1ならセグメントをすぐにアプリケーション層に移す。
RST(Reset):1なら通信を強制的に切断する。
SYN(Synchronize):1なら通信の開始を要求する。
FIN(Fin):1なら通信の終了を要求する。

また実際の通信を始める前に、両者が扱えるデータ量を確認します。セグメントサイズウインドウサイズ(一度に受け取れる量)を確認して、数値の小さい方に合わせます。ウインドウサイズは通信の途中でネットワークがすいている時は大きくし、混んでいるときは小さくするなど状況に応じて調節できます。

受信側ではTCPヘッダに書き込まれたポート番号を見て、指定されたアプリケーションプロトコルにデータを渡します。データが1つのセグメントに収まっていない場合は受け取ったデータをもとの形に組み合わせてからアプリケーション層に渡します。TCPヘッダでは次のような順序と大きさで書き込むように決められています。

adeih

確認応答番号ウインドウサイズは受信側が書き込むことになっています。

インターネットでは、パケットがどこかでいきなりなくなる事があリます。 両者で何が届いたかを把握しているため、足りないものを再度送りなおす事が可能です。 このように再度送り直すことを再送と 呼びます。この信頼性は、アプリケーションプログラマにとっては非常にありがたいものです。 普通にプログラムを書く人は「ネットワークでパケットがなくなったらどうするか」や「ネットワークの途中でデータの内容が変わったらどうしよう」というの は考えたくありません。 TCPを使うことにより、プログラマはそのようなわずらわしさから解放されます。 メール、WWW、FTPなどでは、データがそのまま伝わることが要求されます。 そのため、それらのプロトコルはTCPを使った通信を行っています。

UDPプロトコル  

UDPでは、事前に打ち合わせをしないで一方的にデータを送りつけるコネクション型通信を行います。複数の相手に同時にデータを送信することができ、特定の複数の人に贈ることをマルチキャスト、不特定多数に送ることをブロードキャストと言います。UDPでやることは以下の2つだけです。

  1. データが壊れていないか確認し、壊れていたら破棄する。
  2. UDPヘッダを外して、指定されたアプリケーションプロトコルに渡す。

——————————以下参考文献です。——————————

・「TCP/IPの絵本」, アンク, SHOEISYA
・Geekなページ, http://www.geekpage.jp/technology/ip-base/tcp-udp.php

[/expand]

TCP/IP -TCP/IPの概要-

1.TCP/IPとは…

インターネットで採用されているコンピュータネットワークを実現している通信プロトコル群のことです。現在全世界共通の通信プロトコルとして使用されています。通信プロトコルとはコンピュータどうしが円滑にデータのやり取りを行うためのルールのような物です。TCP/IPは特定の機器に依存しないことや、データの伝達速度、信頼性において大変優れた仕組みとなっています。インターネットサーバーを設置したり、ソフトウェア開発を行っていくうえで避けて通ることのできない項目のようです。
[expand title=”Trigger Text”]

pc

2.5つの階層について…

TCP/IPは5つの階層で構成されています。送受信に関わる一連の作業をいくつかの階層に分けて行い、その各段階をレイヤーと言います。5つのレイヤーはそれぞれアプリケーション層トランスポート層ネットワーク層データリンク層物理層に階層化されています。

tcpip

受信側と送信側の各層どうしが情報を交換するために、送信側の各層でヘッダ(データよりも前に付加した情報)やトレーラ(後ろに付加した情報)を付加しています。

3.アプリケーション層

アプリケーション層には、通信サービスにおけるサーバーとクライアントのやり取りを定めたプロトコル(アプリケーションプロトコル)があります。その一例であるwwwサービスを支えているプロトコルであるHTTPプロトコルについてみていきます。HTTPプロトコルは「要求」と「応答」という2種類のパケットを使って、1つの要求に対して1つの応答を返す非常にシンプルなプロトコルです。

httppc

パケットはヘッダボディ(データ)に分かれています。要求パケットのヘッダ部分には要求の種類を示すメソッド要求ヘッダと呼ばれるサーバーへ伝えるクライアント情報(対応しているファイルの種類や文字コード、言語など)が記述されています。項目名と情報はコロンで区切られています。ボディには要求時に必要なデータが入りますが、メソッドがGETの場合は空になります。以下要求パケットの例です。ヘッダとボディの間には空行が入ります。

 GET/home/index.html HTTP/1.1 (メソッド:GETの他にPUTなどがある)
——————————————————————————————————————-
Host:www.○○○.○○○.co.jp
Accept:
text/html, text/plain, text.sgml */*;u=0.01
Accept-encoding:gzip, compress
Accept-Language:ja, en
If-modified-Since:Wed, 31 Aug 2013 12:00:00 GMT
User-Agent:Internet Exploer7.0
  空行———————————————————————————————————————————
  ●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●

サーバーがクライアントに送る応答パケットのヘッダは処理結果を示すステータス行とクライアントに渡すデータに関する情報を記述する応答ヘッダに分かれています。ボディにはクライアントに渡すデータが入っています。

 HTTP/1.1 200 OK (ステータス行:正常に処理できた場合は200番台の数字が入る)
—————————————————————————————————————
Date:Wed, 31 Aug 2013 23:59:59 GMT
Server:NCSA/1.5.2
Last-modified:Wed, 31 Aug 2013 12:00:00 GMT
content-Type:home/gif
Content-length:334
   空行—————————————————————————————————————-
<html>●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●

HTTPプロトコルはもともと要求されたデータを返すことだけを目的に作られています。そのため一回の要求と応答で通信は完結し、過去に行った通信と関係づけられることはありません。このような一回完結のプロトコルをステートレスプロトコルと言います。

アプリケーションプロトコルにはほかにも電子メールの送信に関わるSMTPプロトコルと受信に関わるPOP3プロトコルなどがあります。

[/expand]

研究背景について

「X線CTの精度向上に関する研究」についての概要

近年,機械デバイスや電子デバイスは様々な部品を複合した一体品として製造・出荷されています。これらのデバイスの内部構造非破壊検査するためには,三次元の形状情報を直接的に得ることが可能なマイクロフォーカスX線CTが非常に有効ですが、様々な被写体を撮影したいという声がありその性能は十分であるとはいえません。

また、真空管の一種であるX線管装置では、フィラメントを加熱して生じた電子を電圧により加速して、ターゲットであるタングステン等の金属にうちこむことでX線を発生させています。しかし、X線の発生効率は非常に低く、電子の運動エネルギーの99%以上は熱エネルギーに変わりターゲットを含む陽極部材を加熱しています。これがX線CT装置における焦点移動の主因となっており、高精度な撮影が必要になるほど焦点移動による影響が大きくなると考えられます。

被写体の例として、マイクロ歯車透析用中空糸を考えてみたいと思います。どちらも数マイクロメートルのスケールでマイクロフォーカスX線CTで、通常の撮影を行っても十分な精度でCT画像を得ることが困難であると考えられています。そこで高精度な撮影を行うために積算回数撮影方向数を増やし画像の精度を向上させることが考えられますが、長時間撮影を行うと焦点移動による画質低下の影響が大きくなり、画像にボケが生じる可能性が高いです。

これまでに機械的に焦点移動を補正する機構はすでに提案されていますが、機械的に補正することには限界があり、さらにコストアップが問題となっています。したがって画像データ上で焦点移動を補正するアルゴリズムはCT装置に大きなメリットをもたらすことができます。

本研究ではX線CT装置における焦点移動に着目し、この現象が画像に与える影響を調べるとともに、その補正を行いX線CT画像の精度を向上させることを目的としています。

ウイルスとトロイの木馬について

通信に潜む危険

ネットワークに接続してほかのコンピュータに接続することは便利な反面、様々な危険を伴う可能性があります。その代表的な例として、ウイルスやトロイの木馬がありその概要を調べてみました。

ウイルス

ほかのプログラムやデータに寄生し、不正動作を行うもの。一つのファイルから別のファイルへと感染していき、ファイルをコピーしたり共有することで別のPCへと感染していく。ほとんどのウイルスはPCを操作不能にすることを目的としているので、ファイルを削除したり、破壊したりという行為を行う。常にアンチウイルスソフトを最新の状態に保ち、怪しげなファイルは開かないことが大切。

トロイの木馬

有用なプログラムを装ってユーザーにインストールさせ、ユーザーの意図しない不正動作を行うもの。ウェブサイトに対してDoS攻撃を仕掛けたり、攻撃を隠すためにプロキシサーバに攻撃したり、スパムメールを大量に送りつけたりといった行為を行う。

DoS攻撃
インターネット経由での不正アクセス。大量のデータや不正パケットを送りつける。
プロキシサーバ

企業などの内部ネットワークとインターネットの境目にあって、直接インターネットに接続できない内部ネットワークのコンピュータに代わって、インターネットとの接続を行うコンピュータ
スパムメール…
受信者の意図しない、無差別かつ大量に送信されるメールのこと。広告メールなど。

スパイウェア

PC内のデータをユーザーに十分に説明することなく収集し抜き取るためのもので、データを破壊する能力はない。トロイの木馬の一種と分類されることもある。収集するデータにはパスワードなどログイン情報や、検索傾向、クレジットカードの番号が含まれる。感染してもPCはこれまで通り正常に動作するので、感染したままPCを使い続けてしまっている可能性がある。多くのスパイウェアに感染してしまうと、PCの動作はだんだん遅くなっていく。

ワーム

ネットワークを介して感染する。

ウイルスなどをまとめてマルウェアと呼んでいます。それぞれの違いについてこれまで意識していませんでしたが、使っているアンチウイルスソフトで対応しているものしていないものがあるようなので、しっかり確認する必要がありそうです。ウイルス以外にも危険は多く、盗聴改ざんによって、不正にパケットが盗まれる場合や、不正アクセスや、DoS攻撃によって外部から攻撃されることもあります。

X線発生原理について

1.X線とは…

1895年、ドイツの物理学者ヴィルヘルム・コンラート・レントゲンにより発見された非常に波長の短い電磁波の一種で、波長は1pm~10nmの範囲にあります。

波長

X線には以下の性質があります。

  • 波長が短いので物質に対し透過性が高い。物質は密度が高く、厚みがあるものほど透過しにくい。
  • 直線的に進み、磁界、電界による影響を受けない。
  • 5感で感じることができない。
  • 原子から電子をはぎ取る(電離する)性質がある。

X線は放射線の一種で一度に大量に浴びると、ガンを発症させたりときには死に至らしめる危険性があります。CT撮影に置いてもX線を使用するため、被爆量に関しては大変シビアになっています。撮影の仕方にもよりますが、胸部撮影で0.1mSv、胃透視で15mSv、CT検査で20mSvとなっています。通常に生活していても大地や宇宙からの放射線で一年間に2.4mSvの放射線を浴びています。さらに成田からNYまで飛行機に乗るだけで0.1mSvの放射線を浴びることになり、年数回の検査では体への影響は心配する必要はなさそうです。ちなみに一度に1000mSvを超える放射線を浴びると白血病やガンになる可能性があるようです。徐々に浴びる分にはあまり体への害を考える必要はなさそうですが、一度に大量に浴びるようなことはさけなければならないようです。

 2.X線発生原理について

下の図のようなX線管では陽極のターゲットに陰極のフィラメントから発生した電子を衝突させることでX線を発生させています。X線管は真空管の一種です。

x-ray tube

この時、陰極には数十~数百kVの高電圧がかけられます。陰極から発生した電子が高電圧下で加速され、タングステン等の重金属でできたターゲットに衝突することで、X線が発生しています。X線発生効率は非常に低く、電子の運動エネルギーの99%は熱エネルギーに変わりターゲットを加熱していると言われています。この時ターゲットは1000℃程度まで熱せられていて熱膨張により形状が変形していることが考えられています。

3.光電効果とコンプトン散乱について

X線の吸収は光電効果コンプトン散乱によって起こります。X線のエネルギーが小さいときは主に光電効果が起き、エネルギーが大きくなるに従ってコンプトン散乱が起きます。

光電効果

X線がそのまま物体に吸収され、代わりに物質から電子が放出される現象。光電効果が発生する確率は物体の原子番号が大きくなるほど高くなります。これは原子番号が増えるに従って電子の数もふえるため、光電効果が起きる確率が高くなります。

コンプトン散乱

短波長(エネルギーの大きい)のX線が比較的に原子番号の小さい原子に衝突した場合に波長が増加(エネルギーを失う)してX線が放出される現象。具体的にはX線のエネルギーが電子の結合エネルギーよりもずっと大きい場合に軌道電子をはねとばし、自らはそのときにぶつかったエネルギーを失って運動の向きを変える現象。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−参考文献−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

「放射線と物質との相互作用」

「Wikipedia 放射線」

「X線(エックス線)による光電効果の発生確率と物質の原子番号との関係」

粒子法

9月21日(金) 流体シミュレータ計算部分の作成

今週からようやく粒子法の計算を行う部分を実装していきます。計算部分は半陰的に解かず、陽的に解いて粒子が近づきすぎたときは、剛体としてはじきとばすという荒技を行いました。それでもなんかそれっぽいのができたので、体調もあまりよくないので今週はここまでで来週以降半陰的な部分を実装していこうと思います。


public void calc(){
    for(int i = 0; i &lt; pNum; i++){
        //壁は計算しない
        if(element[i].q != 4 element[i].q != 2)continue;
        element[i].vx += deltat * grav;
        element[i].x += deltat * element[i].vx;
        element[i].y += deltat * element[i].vy;
    }

    double r2lim = parcSize * parcSize * minlen * minlen;
    //粒子が近づきすぎたとき剛体的にはじき返す
}

今後の課題

  • 粒子が完全に重なったときは粒子を生成しないように設定したい。
  • 半陰的に解いて物性値を考慮する。
  • 画面から消えた粒子は計算しない。

今週のミーティングにて、粒子の生成方法についてだめだしが多かったので、粒子を一つずつ生成する方法と、ペイントソフトで矩形を描くときみたいにして粒子を生成させることができるようにしたい。来週は実家に帰予定なので、実家でゆっくり実装していきたいと思う。やっぱり粘性に関する項はしっかり解かなくては水っぽくならないとわかったので、バグ取りを早めにやりたいと思う。

9月13日(金) 流体シミュレータのはりぼて作り

今週はソフトウェアの外観部分を作成しました。とりあえずシミュレーションを行いたい状況を絵を描くように作るところまでです(あまり進んでない…)。
[expand title=”Trigger Text”]
統合開発環境であるNetBeansでまずは張りぼて作りです。NetBeansではソフトウェアの外観をマウス操作のみ(ドラッグ&ドロップ)で作成することができます。中央にラベルを配置し、左下に生成させる粒子のボタン、右下にアニメーションの開始ボタンと停止ボタンを作りました。とりあえず機能はこれぐらいにしておきます。張りぼてはこれで完成です。これだけでは実行してもボタンしか表示されないので、マウス操作や、ボタンを押したときの操作を記述していきます。

haribote

プログラムは以下のようになりました。


import javax.swing.JPanel;
import java.awt.BorderLayout;

public class MainFrame extends javax.swing.JFrame {

    public MainFrame() {

        initComponents();
        GraphicComponent gc = new GraphicComponent();
        lbl.setLayout(new BorderLayout());
        lbl.add(gc);
        pack();
    }
    //JPanelクラスを継承した内部クラス(描画)
    class GraphicComponent extends JPanel {
        @Override
        public void paintComponent(Graphics g) {
            Graphics2D g2 = (Graphics2D) g;
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                      RenderingHints.VALUE_ANTIALIAS_ON);
            g.setColor(Color.WHITE);
            g.fillRect(0, 0, getWidth(), getHeight());//背景を白く塗りつぶす

            for(int i = 0; i &lt; pNum ; i++){
                if(!wallSt&amp;&amp;!waterSt&amp;&amp;!jellySt&amp;&amp;!inWallSt)break;
                if(element[i].q == 0)g.setColor(Color.blue);//条件に応じて粒子を描画
                else if(element[i].q == 1)g.setColor(Color.green);
                else if(element[i].q == 2)g.setColor(Color.yellow);
                else if(element[i].q == 3)g.setColor(Color.black);
                g.fillOval((int)element[i].x*10, (int)element[i].y*10, 10, 10);
                g.setColor(Color.black);//粒子の輪郭を描画
                g.drawOval((int)element[i].x*10, (int)element[i].y*10, 10, 10);
            }
        }
    }
    //水ボタンが押された時の処理
    private void btnWtActionPerformed(java.awt.event.ActionEvent evt) {
        waterSt = true;
        wallSt = false;
        inWallSt = false;
        jellySt = false;
    }
    //壁ボタンが押された時の処理
    private void btnWlActionPerformed(java.awt.event.ActionEvent evt) {
        waterSt = false;
        wallSt = true;
        inWallSt = false;
        jellySt = false;
    }
    //ゼリーボタンが押された時の処理
    private void btnGlActionPerformed(java.awt.event.ActionEvent evt) {
        waterSt = false;
        wallSt = false;
        inWallSt = false;
        jellySt = true;
    }
    //マウスをドラッグした時
    public int drawX;//X座標
    public int drawY;//Y座標
    public static int pNum = 0;//粒子の数
    int bfx, bfy;
    private void lblMouseDragged(java.awt.event.MouseEvent evt) {

        Point point = evt.getPoint();//マウスの座標を取得
        drawX = (Integer) (point.x/10);
        drawY = (Integer) (point.y/10);

        if(drawX!=bfx || drawY!=bfy) {
            if(waterSt)element[pNum++] = new kouzou(drawX, drawY, 0, 0);//水粒子を生成
            else if(wallSt)element[pNum++] = new kouzou(drawX, drawY, 1, 0);
            else if(jellySt)element[pNum++] = new kouzou(drawX, drawY, 2, 0);
            else if(inWallSt)element[pNum++] = new kouzou(drawX, drawY, 3, 0);
        repaint();//再描画
        }
        bfx = drawX;
        bfy = drawY;
    }
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new MainFrame().setVisible(true);
           }
       });
    }
}

ここまででで粒子法のシミュレーションを行う前段階として、練習問題の状況に合わせて粒子を自由に生成できるようになりました。粒子法(MPS法)では、だいたい粒子自身の直径の2倍程度の範囲にある粒子と相互に作用しあうので、壁は三重にする必要があります。おそらくこのままシミュレーションをスタートさせると計算が安定せずに爆発を起こしそうなので、いろいろ調節が必要だと思います。これから計算部分を実装していく予定です。

haribote2

[/expand]

9月6日(金) 流体シミュレータの構想

arkoakの活動の一環としてCAIソフトウェアの開発を現在行っています。CAIソフトウェアとは、Computer Aided Instructionのことで、学校教育の支援を行うためのソフトウェアのことです。大学で行われている講義の問題点を挙げ、その問題点を解決することを目標としたソフトウェアを提案しました。
[expand title=”Trigger Text”]
私の場合は流体工学の講義で、練習問題を解く際に問題に示されている状況をイメージすることが難しいと感じた経験から、問題に応じてその状況の簡易的なシミュレーションが可能なできるだけ汎用性の高いソフトウェアを作ることを考えています。問題に応じた状況を絵で描いて作り、STARTボタンを押すとリアルタイムにシミュレーション結果をアニメーションで表示します。流体のシミュレーションには粒子法と呼ばれるメッシュレスな手法を用いるつもりです。有限要素法と比較したとき計算量が少なくなることが知られています。今月末に完成させることを目標に開発を進めていくつもりです。

ソフト外観書き方よくわからないけど一応シーケンス図。ちなみに開発言語はJavaで、NetBeansという統合開発環境を使って開発を進めていきます。GraphicComponentクラスが描画用のクラスでJPanelクラスを継承しています。AnimeクラスがThreadクラスを継承したクラスで、オーバーライドしたrun()メソッドの中に制御する処理を記述していきます。MainFrameクラスでそれぞれのクラスをインスタンス化します。イベントを処理するためのクラスとします。sdg

[/expand]