2010年11月22日月曜日

CommonLispの処理系SBCLで、コマンドラインからLispコードを実行するには


SBCLでコマンドラインからLispコードを実行するには、--scriptオプションを使って以下のようにします。
$ sbcl --script hello.lisp
同じようにして、コンパイルしたコードも実行できます。
$ sbcl --script hello.fasl

--

2010年11月15日月曜日

GnuTLSの使い方(第2回)

前回のエントリでは、「GnuTLSの使い方(第1回)」として、GnuTLSを使って、HTTPSでWebサーバに接続してHTMLを取得しようとしましたが、handshakeに失敗して通信できませんでした。

失敗の原因がどうもよく分かりません。APIの使い方の問題ではなさそうなものの、サーバの環境によるものか、GnuTLSを使う上で何か忘れているものがあるのか。

そこで、いったんGnuTLSの代わりに、OpenSSLを試してみることにしました。

「OpenSSL sample」で検索すると、
An Introduction to OpenSSL Programming(Part I)[PDF]
というちょうどいいドキュメントがひっかかるので、これを参考にします。

このドキュメントにはサンプルコードが用意されており、まずはこのサンプルを動かしてみます。

http://www.rtfm.com/openssl-examples/

まず、OpenSSLをインストールします。
手元の環境はMaxOS Xなので、MacPortを使います。
$ port install OpenSSL
次に、サンプルをビルドします。
$ ./configure --with-openssl=/opt/local/
$ make
MacPortを使ってOpenSSLをインストールしたため、そのインストール場所を--with-opensslオプションによって指定しています。

問題なくビルドができれば、SSLを通してウェブサーバからHTMLを取得してみます。
$ ./wclient -h twitter.com -p 443 -i
今度は、GnuTLSを使った場合と違い、すんなりとHTMLを取得できました。

GnuTLSを使ったときにhandshakeに失敗するのはなぜだろう?

とはいえ、これでSSL通信をする方法はわかったので、もともとのきっかけだった、HaskellからのSMTP over SSL/TLSを実装できそうです。

■関連するエントリ
GnuTLSの使い方(第1回)

--

2010年10月26日火曜日

GnuTLSの使い方(第1回)

GnuTLSとは


GnuTLSはSSL/TLSプロトコルのフリーな実装です。

SSL/TLSプロトコルの実装としてはOpenSSLが有名ですが、OpenSSLのライセンスはGPLに対し非互換のため、GPLの下にあるソフトウェアはOpenSSLを使うことができませんでした。

GnuTLSは、その問題を解決しGNUプロジェクトのアプリケーションでもTLSのようなプロトコルを扱えることを目的として開発されました。

GnuTLSのインストール


MacOSXの場合は、MacPortを使うことで簡単にGnuTLSをインストールできます。
$ port install gnutls
他の環境でもパッケージシステムから同様にインストールできると思います。

GnuTLSのソースコードは、以下のページからダウンロードできます。
http://www.gnu.org/software/gnutls/download.html

GnuTLSを使ったサンプルを試してみる


GnuTLSのドキュメント7.3.1に、HTTPSでサーバに接続してデータを取得するサンプルがあるので、それを試してみました。

sample.c
/* This example code is placed in the public domain. */
 
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <gnutls/gnutls.h>
 
/* A very basic TLS client, with anonymous authentication.
 */
 
#define MAX_BUF 1024
#define MSG "GET / HTTP/1.0\r\n\r\n"
 
extern int tcp_connect (void);
extern void tcp_close (int sd);
 
int
main (void)
{
  int ret, sd, ii;
  gnutls_session_t session;
  char buffer[MAX_BUF + 1];
  gnutls_anon_client_credentials_t anoncred;
  /* Need to enable anonymous KX specifically. */
 
  gnutls_global_init ();
 
  gnutls_anon_allocate_client_credentials (&anoncred);
 
  /* Initialize TLS session 
   */
  gnutls_init (&session, GNUTLS_CLIENT);
 
  /* Use default priorities */
  gnutls_priority_set_direct (session, "PERFORMANCE:+ANON-DH:!ARCFOUR-128",
         NULL);
 
  /* put the anonymous credentials to the current session
   */
  gnutls_credentials_set (session, GNUTLS_CRD_ANON, anoncred);
 
  /* connect to the peer
   */
  sd = tcp_connect ();
 
  gnutls_transport_set_ptr (session, (gnutls_transport_ptr_t) sd);
 
  /* Perform the TLS handshake
   */
  ret = gnutls_handshake (session);
 
  if (ret < 0)
    {
      fprintf (stderr, "*** Handshake failed\n");
      gnutls_perror (ret);
      goto end;
    }
  else
    {
      printf ("- Handshake was completed\n");
    }
 
  gnutls_record_send (session, MSG, strlen (MSG));
 
  ret = gnutls_record_recv (session, buffer, MAX_BUF);
  if (ret == 0)
    {
      printf ("- Peer has closed the TLS connection\n");
      goto end;
    }
  else if (ret < 0)
    {
      fprintf (stderr, "*** Error: %s\n", gnutls_strerror (ret));
      goto end;
    }
 
  printf ("- Received %d bytes: ", ret);
  for (ii = 0; ii < ret; ii++)
    {
      fputc (buffer[ii], stdout);
    }
  fputs ("\n", stdout);
 
  gnutls_bye (session, GNUTLS_SHUT_RDWR);
 
end:
 
  tcp_close (sd);
 
  gnutls_deinit (session);
 
  gnutls_anon_free_client_credentials (anoncred);
 
  gnutls_global_deinit ();
 
  return 0;
}

このサンプルでは、同ドキュメントの7.3.10に書かれている、TCP接続のためのヘルパー関数を使うため、そのコードも用意します。

helper.c
/* This example code is placed in the public domain. */
 
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
 
#define SA struct sockaddr
 
/* tcp.c */
int tcp_connect (void);
void tcp_close (int sd);
 
/* Connects to the peer and returns a socket
 * descriptor.
 */
extern int
tcp_connect (void)
{
  const char *PORT = "5556";
  const char *SERVER = "127.0.0.1";
  int err, sd;
  struct sockaddr_in sa;
 
  /* connects to server
   */
  sd = socket (AF_INET, SOCK_STREAM, 0);
 
  memset (&sa, '\0', sizeof (sa));
  sa.sin_family = AF_INET;
  sa.sin_port = htons (atoi (PORT));
  inet_pton (AF_INET, SERVER, &sa.sin_addr);
 
  err = connect (sd, (SA *) & sa, sizeof (sa));
  if (err < 0)
    {
      fprintf (stderr, "Connect error\n");
      exit (1);
    }
 
  return sd;
}
 
/* closes the given socket descriptor.
 */
extern void
tcp_close (int sd)
{
  shutdown (sd, SHUT_RDWR); /* no more receptions */
  close (sd);
}
※IP、ポートは適切に変更してください

ビルドするためにMakefileを用意します。

Makefile
sample: sample.o helper.o
 gcc -o sample sample.o helper.o `pkg-config gnutls --libs`

.c.o:
 gcc -c $< -I/opt/local/include

makeして実行してみると、handshakeに失敗してエラーになります。
$ make
$ ./sample
*** Handshake failed
GNUTLS ERROR: A TLS fatal alert has been received.

handshakeとは何でしょうか?HTTPSの仕組みを調べる必要がありそうです。

--

2010年10月24日日曜日

豪ドル高は危ない?


最近、豪ドル債が人気です。

しかし、豪ドルは今、円以上に米ドルに対して高くなっています。これは、輸出依存型であるオーストラリア経済にとって悪影響を与えないのでしょうか?

答えはNoです。日本と違い、オーストラリアにとって豪ドル高は経済への大きなマイナスにはなりません。

理由はなんでしょう?

2つあります。
  1. 豪ドル安へ誘導する余地があること
  2.  輸出入の内容が良いこと

豪ドルへ誘導する余地があること


オーストラリアは景気が過熱しないように金利を上げて抑えているため、その金利を下げることで豪ドル安へ誘導してコントロールする余地があります。

逆に、日本はもうこれ以上金利をさげることができないところまできているので、コントロール不能になってしまっています。

これが、オーストラリアと日本の違いの1つです。

輸出入の内容が良いこと


日本は5兆円の貿易黒字のため円高のマイナス影響が大きくなってしまいますが、オーストラリアの貿易収支はトントンです。

さらに、日本と違い、材料を輸出して製品を輸入する形になっているため、豪ドル高の場合は材料を売るのが安くなってしまいますがその分製品を買うのも安くすむので、それで相殺されます。そのため、日本ほど自国通貨高によるダメージを受けません。

これが、もう1つの違いです。

いかがでしょうか。

--

2010年10月12日火曜日

さくらインターネットでcronを使うときの注意点


さくらインターネットのレンタルサーバでcronを使おうとしたときにはまったのでメモ。

pythonスクリプトを動かすときには、
/usr/local/bin/python
のようにフルパスでpythonコマンドを指定しなければいけない。

単にpythonとだけ指定してもコマンドが動作しないので注意。

2010年9月4日土曜日

粒子法による固液連成シミュレーション


先日のエントリを、表面抽出をして奇麗にレンダリングしました。

前半は剛体の密度が流体より小さいケース、後半は剛体の密度が流体より大きいケースです。



シミュレーション上は剛体も粒子として扱い、レンダリングのときだけポリゴンで表現しています。



■流体シミュレーションに関するエントリ
粒子法のプログラム第1回(概要)
粒子法のプログラム第2回(プログラムの大枠)
粒子法のプログラム第3回(データ構造)
粒子法のプログラム第4回(密度と圧力の計算)
粒子法のプログラム第5回(力の計算)
粒子法のプログラム第6回(境界条件と粒子位置の更新)
粒子法のプログラム最終回(粒子の出力)
【粒子法】粒子を流体としてレンダリング
3次元の粒子法シミュレーション
粒子法のシーンを2倍のサイズにしてみたが…
粒子法のシーンを2倍のサイズにしてみた
SPHによる巻き波のシミュレーション2
Haskell、OCamlでSPH法
このあとやりたいこと
カメラ位置を変えて流体をレンダリング
固液連成シミュレーション


■剛体シミュレーションに関するエントリ
粒子ベース剛体シミュレーション(プレビュー)
粒子ベース多体衝突シミュレーション
引き続き、粒子ベース剛体シミュレーション

--

2010年8月3日火曜日

【本】はじめてのCUDAプログラミング - 8.1 1次元配列へのアクセス


「はじめてのCUDAプログラミング」の「8.1 1次元配列へのアクセス」について。

メモリアクセスの例として、1次元配列への足し算を挙げている。

挙げられているサンプルは、要素数Nの配列A、B、Cについて、

C[i] = A[i] + B[i]

を計算するというもの。

GPUで計算した場合とCPUで計算した場合とでどのような違いがあるかというと、CPUでこの計算をするとN回の計算となる一方、GPUで計算すると1スレッドにつき1回の計算をするだけで済むことになる。

処理のステップは、
  • メモリ確保
    ホストとGPUそれぞれにメモリ領域を確保する

  • 初期値の用意
    ホストメモリ上で配列A,B,Cを初期化

  • GPUに初期値をコピー
    GPUメモリにホストメモリから初期値をコピー

  • カーネル関数をコール
    カーネル関数をコールすることで計算を実行

  • 解をGPUからホストにコピー
    計算結果をGPUメモリからホストメモリにコピー

  • 計算が正しく行われていることを確認

となっている。

その後実行性能を求めているのだが、理論値の1/10の性能しかでていないという。また、式をより複雑なものに変えても性能が変わらない。このことから、実はグローバルメモリ転送が処理時間の大半を占めていることが説明されている。ここから、8.3 メモリアクセスの最適化へとつながる。



--

2010年7月31日土曜日

固液連成シミュレーション


固液連成シミュレーションです。

剛体を粒子の集合として扱い、剛体粒子も流体粒子と同様に計算しています。

ムービーには2つのシーンが入っており、1つは固体の密度が流体より軽い場合、もう1つは固体の密度が流体より重い場合です。




■流体シミュレーションに関するエントリ
粒子法のプログラム第1回(概要)
粒子法のプログラム第2回(プログラムの大枠)
粒子法のプログラム第3回(データ構造)
粒子法のプログラム第4回(密度と圧力の計算)
粒子法のプログラム第5回(力の計算)
粒子法のプログラム第6回(境界条件と粒子位置の更新)
粒子法のプログラム最終回(粒子の出力)
【粒子法】粒子を流体としてレンダリング
3次元の粒子法シミュレーション
粒子法のシーンを2倍のサイズにしてみたが…
粒子法のシーンを2倍のサイズにしてみた
SPHによる巻き波のシミュレーション2
Haskell、OCamlでSPH法
このあとやりたいこと
カメラ位置を変えて流体をレンダリング
固液連成シミュレーション

■剛体シミュレーションに関するエントリ
粒子ベース剛体シミュレーション(プレビュー)
粒子ベース多体衝突シミュレーション
引き続き、粒子ベース剛体シミュレーション

--

2010年7月30日金曜日

Bloggerにソーシャルボタン機能がついた


Bloggerにソーシャルボタン機能がついたので、さっそく表示してみた。

--

2010年7月21日水曜日

【論文】Two-way Coupling of Fluids to Rigid and Deformable Solids and Shells


Fedkiwらによる、固液連成系のアニメーションについての2008年の論文である。

著者らによると、この論文で提案されている手法には以下の特徴がある。
  • 流体にオイラー法、固体にラグランジュ法を用いる
  • 完全な陰解法
  • 系の運動量が保存される
  • カルテシアン座標を使用
流体にオイラー法、固体にラグランジュ法を用いるという典型的なアプローチをとりながらも、従来手法と違い、系の運動量が保存されるという。

また、完全な陰解法のため時間が経った後や大きな密度比があるような場合でも安定した結果が得られる。

さらに、座標系にはカルテシアン座標を用いるため、四面体メッシュやALEが必要ない。

この方法は非常に汎用的で、煙、水、多相流体、剛体、弾性体、布やシェル状の物体にも適用できるという。

関連研究としてあげられているものに、
  • Yngve et al. 2000
  • Genevanx et al. 2003
  • Carlson et al. 2004
  • Guendelman et al. 2005
  • Losasso et al. 2006a
といった例があるが、これらは、陽解法もしくは半陰解法を使うため、安定性と精度の問題が残るという。

また、
  • Klinger et al. 2006
  • Chentanez et al. 2006
  • Batty et al. 2007
では、完全に陰解法を用いて安定した固液連成シミュレーションを行っているが、シェル状剛体や布には適用できないとのこと。

--

2010年7月18日日曜日

カメラ位置を変えて流体をレンダリング


以前の3次元の粒子法シミュレーションに載せているムービーを、カメラ位置を変えてまたレンダリングしてみました。



■剛体シミュレーションに関するエントリ
粒子ベース剛体シミュレーション(プレビュー)
粒子ベース多体衝突シミュレーション
引き続き、粒子ベース剛体シミュレーション

■流体シミュレーションに関するエントリ
粒子法のプログラム第1回(概要)
粒子法のプログラム第2回(プログラムの大枠)
粒子法のプログラム第3回(データ構造)
粒子法のプログラム第4回(密度と圧力の計算)
粒子法のプログラム第5回(力の計算)
粒子法のプログラム第6回(境界条件と粒子位置の更新)
粒子法のプログラム最終回(粒子の出力)
【粒子法】粒子を流体としてレンダリング
3次元の粒子法シミュレーション
粒子法のシーンを2倍のサイズにしてみたが…
粒子法のシーンを2倍のサイズにしてみた
SPHによる巻き波のシミュレーション2
Haskell、OCamlでSPH法
このあとやりたいこと
カメラ位置を変えて流体をレンダリング

--

sedコマンドの使い方

sedコマンドの使い方をいくつか解説します。

置換


文字列の置換を行うには、-eオプションに続けて置換したい文字列と置換後の文字列を指定します。

$ sed -e "s/置換したい文字列/置換後の文字列/g" ファイル名

出力先は標準出力です。リダイレクトを使えばファイルに記録できます。

$ sed -e "s/置換したい文字列/置換後の文字列/g" ファイル名 > 保存先ファイル名

ファイルに保存する別の方法として、-iオプションによって同名での上書き保存ができます。-iオプションの場合、同時に置換前のファイルがバックアップされるため便利です。

$ sed -i.bak -e "s/置換したい文字列/置換後の文字列/g" ファイル名

「-i.bak」と指定することで、ファイル名.bakがバックアップのファイル名になります。

ファイル名にワイルドカードを指定することで、複数のファイルを一度に置換できます。これは-eオプション単独ではできないので、-iオプションが便利です。

$ sed -i.bak -e "s/置換したい文字列/置換後の文字列/g" *

ここまで、sedを使った文字列の置換についてでした。

挿入


次は挿入についてです。sedは単なる置換用のコマンドではありません。Stream EDitorという名前の通り汎用的なエディタなので、テキストファイルに対して様々な編集が可能です。挿入もその1つです。

挿入する場合は-fオプションで外部ファイルからコマンドを読み込ませることで行います。
※複数業にわたるコマンドになるため、-eオプションでは不可

$ sed -f コマンドファイル名 編集対象ファイル名

コマンドファイルは以下のように記述します。
挿入したい行(何番目の行か){
i\
挿入したい文字列
}

挿入したい行として指定した行の手前に、挿入したい文字列が挿入されます。たとえば、
10{
i\
この文字列を挿入します。
}
とすると、10行目の手前、つまり9行目と10行目の間に「この文字列を挿入します。」という文字列が挿入されます。

出力先は置換の場合と同様に標準出力です。-iオプションで上書きできることも同様です。

--

2010年4月25日日曜日

【Haskell】正格フラグの使い方


Haskellのデータ構造は一般的にlazyである。それによって、評価されたときにエラーやプログラム停止をもたらすような要素をデータ構造に含めることができる。lazyなデータ構造によってHaskellの表現を高めることができ、Haskellのプログラミングの重要な側面となっている。

内部的には、lazyなデータオブジェクトは、thunkと呼ばれる構造でラップされており、内部にエラーが含まれていても影響がない。たとえば、("a", ⊥)というタプルを保持することができる(⊥は未定義な値を表す)。一方、ほとんどのプログラミング言語は正格で、値が評価されてからデータ構造に入れられる。

ところが、thunkにはオーバーヘッドが大きいというデメリットがある。構築と評価に時間が必要だったり、heapにthunkのためのメモリが必要になる。

Haskellでは、このオーバーヘッドを避けるために、正格評価させるフィールドに正格フラグをつけることができる。正格フラグを付けた方が良いケースとしては、実行中の特定のタイミングで評価されるべきものや、評価がシンプルで決してエラーとならないもの、部分的な未定義値が意味をもたないものがある。

正格フラグの例としては、複素数ライブラリのComplex型があげられる。
data RealFloat a => Complex a = !a +: !a
実部と虚部に正格フラグが付けられており、これらのフィールドには評価後の値が保持される。

正格フラグはデータコンストラクタでのみ使うことができる。逆に、関数の引数に対して正格処理をさせるようなフラグはないが、関数評価に!$演算子を使うことで同等のことを実現できる。

正格フラグを使うときの注意点としては、使用しないデータがメモリに残ってリークしがちな点がある。また、lazinessはHaskellの根本的な性質であり、正格フラグによってその性質を曲げることで、無限ループの発見が難しくなったり、予期せぬ結果をもたらす可能性はある。たとえば、循環定義がある場合には注意が必要である。



2010年4月18日日曜日

【書評】ソフトウェア企業の競争戦略


ソフトウェア企業の競争戦略(原題:The Business of Software)は、MIT(マサチューセッツ工科大学)スローン経営大学院教授のマイケル A.クスマノによる著書である。

著者はもともと70年代後半から、特に自動車の設計と製造に関する、日本の製造管理と品質管理の技術を研究していた。日本の製造業が急成長し、日米の貿易摩擦が顕在化し始めた時期である。

そんな中、著者は自動車の次に日本が挑戦するのはコンピュータ・ソフトウェアだろうと考え、日本企業が大規模な商業用ソフトウェア・システムをどのように構築しているか、すでに日本人が確立しているハードウェアのスキルに高度化されたソフトウェア・スキルをいかに追加しようとしているか、を研究し始めた。

研究を進めるうち、著者は、ソフトウェアが戦略と管理の面で特別な問題をはらむ独特のビジネスであると認識するに至る。85年のことだという。

本書は、著者の20年近くにわたるソフトウェア業界の研究、数十ものソフトウェア企業や組織へのコンサルタントとしてのかかわり合い、さらには1997年から続けられているMITでの「ソフトウェア・ビジネス」クラスでの教育経験から得られた観察をまとめたものである。

第1章には本書の概要を記してある。ソフトウェア・ビジネスが他のビジネスと異なっている点、技術としてのソフトウェア、日本企業からマイクロソフトに至る研究、欧米企業と日本企業の重要な違いについてまとめ、また、ソフトウェア・ビジネスの典型的な事例として、仏ビジネスオブジェクツと米i2テクノロジーズの2社を紹介している。

第2章では、ソフトウェア企業のとるべき戦略について述べている。製品企業なのかサービス企業なのか、ターゲットは個人か法人か、マスかニッチか、水平的か垂直的か、メインストリームを狙うのかキャズムを回避するのか、マーケットリーダーかフォロワーか補完製品メーカーか、会社にどのような特徴を持たせたいのか、といった問いが投げかけられている。

第3章は、ソフトウェアビジネスの歴史である。過去を研究する事で進むべき方向についての示唆を得られるとしている。1950年代にはハードウェアを販売する事が主目的でソフトウェアは付属品であった。独立したソフトウェア製品のビジネスが登場するのは60年代である。70年代に新しいプラットフォーム「PC」が出現する。「ワールド・ワイド・ウェブ(WWW)」という次のプラットフォームが90年代に現れる。この歴史を踏まえて、第4章以下で、次のビジネスチャンスがどこにあるのかを問うていく。

第4章では、ソフトウェア開発のベスト・プラクティスと銘打って、ソフトウェア開発を最適管理するにはどのようにしたら良いか考察している。ソフト開発で繰り返し発生している問題と、多くのソフトウェア・ファクトリーを通して試みられている技術の構造化、およびソフトウェア工学分野での取り組みについて紹介しつつ、それが誤った考え方を導くことになったと指摘し、重要になってくるのは繰り返しのプロセスを生み出そうというSEIの概念や、頻繁な同期と周期的な安定化だと結論づけている。

第5章は、ソフトウェア起業家精神についてである。製品開発の視点にとどまらず、とりわけ戦略とビジネスモデルにまで視点を広げ、ソフトウェアのスタートアップ企業を成功裏に設立するために本書の内容がどう当てはまるかを考察している。

第6章は、スタートアップ10社のケーススタディである。筆者が取締役、顧問、コンサルタントとして知るところとなったスタートアップ企業10社について、成功企業、失敗企業、現段階ではまだ何ともいえない企業の3つに分類して述べている。

最後に第7章で、ソフトウェアのスタートアップ企業にとって「理想的」もしくは「ベストの」モデルは何かを一般化することは考慮すべき変数があまりにも多く難しいとしつつも、少なくとも法人向けソフトウェア企業の場合、ビジネスモデルの判断基準は製品企業、サービス企業、ハイブリッド企業のどれを目指すのかという1つに帰結できると結んでいる。

ソフトウェア開発に関する本は、開発手法やプロジェクト管理についてのものはそれこそ掃いて捨てるほどあるのだが、ビジネスという視点から論じているものは驚くほど少ない(大きめの本屋でコンピュータ関連の棚を見てみればわかるだろう)。ソフトウェア企業の競争戦略は、ソフトウェアをビジネスの面から論じた数少ない本であり、かつ、内容としても非常に優れた良書である。



■その他、本に関係するエントリ

研究開発を着実に利益に結びつける方法
CUDAの入門本
最近読んでいるマーケティング本
コンピュータ将棋のいま

-

引き続き、粒子ベース剛体シミュレーション

引き続き、粒子ベース剛体シミュレーションです。

重力を追加し4つのキューブが落下するシーンを計算しました。

■Δt=0.0033sec


さらに、タイムステップによる挙動の違いを見るために、Δtを変えていくつか計算しました。先ほどの動画はΔt=0.0033secです。

■Δt=0.0017sec


■Δt=0.0008sec


■Δt=0.0004sec


■Δt=0.0002sec


これらを見比べると、タイムステップを変えるだけでキューブの挙動が変化しています。タイムステップを変えていき、Δt=0.0004secとΔt=0.0002secまで小さくすると、だいぶ挙動の違いがなくなってきています。


■剛体シミュレーションに関するエントリ

粒子ベース剛体シミュレーション(プレビュー)
粒子ベース多体衝突シミュレーション


■流体シミュレーションに関するエントリ

粒子法のプログラム第1回(概要)
粒子法のプログラム第2回(プログラムの大枠)
粒子法のプログラム第3回(データ構造)
粒子法のプログラム第4回(密度と圧力の計算)
粒子法のプログラム第5回(力の計算)
粒子法のプログラム第6回(境界条件と粒子位置の更新)
粒子法のプログラム最終回(粒子の出力)
【粒子法】粒子を流体としてレンダリング
3次元の粒子法シミュレーション
粒子法のシーンを2倍のサイズにしてみたが…
粒子法のシーンを2倍のサイズにしてみた
SPHによる巻き波のシミュレーション2
Haskell、OCamlでSPH法
このあとやりたいこと
-

2010年4月15日木曜日

粒子ベース多体衝突シミュレーション

いま、粒子ベースのアプローチで多体衝突シミュレーションを実装しています。



剛体を粒子の集まりとして表現することで、衝突判定と応力の計算を行います。

この方法の強みは、ポリゴンベースのアプローチに比べて、アルゴリズムが単純なことと、複雑な形の物体について効率良くシミュレーションできることです。

上のムービーでは立方体の衝突をシミュレーションし、立方体を表現するために使っている粒子をそのままレンダリングしています。

■関連する記事
粒子法のプログラム第1回(概要)
粒子法のプログラム第2回(プログラムの大枠)
粒子法のプログラム第3回(データ構造)
粒子法のプログラム第4回(密度と圧力の計算)
粒子法のプログラム第5回(力の計算)
粒子法のプログラム第6回(境界条件と粒子位置の更新)
粒子法のプログラム最終回(粒子の出力)
【粒子法】粒子を流体としてレンダリング
3次元の粒子法シミュレーション
粒子法のシーンを2倍のサイズにしてみたが…
粒子法のシーンを2倍のサイズにしてみた
SPHによる巻き波のシミュレーション2
-

2010年4月13日火曜日

このブログのアクセス傾向

このブログは粒子法関連のキーワードではいってくる人が多いんだけど、春休みシーズンや年末年始はアクセスが減る傾向がある。

きっと学生さんが見にくることが多いんだろう。

2010年4月4日日曜日

理想的なベッドの選び方


ここのところ数ヶ月、どうも疲れが抜けない。寝ても疲れて、どんどん消耗する困った状態になっている。原因が分からず、運動してみたり仕事の負荷を下げてみているのだが、いっこうに良くならない。

そこで、もう原因として残っているのはベッドだなと思い、ベッドを変えてみることにした。

いま使っているベッドは、折りたたみできる簡易的なもので、その上に布団を敷いて寝ている。以前にもベッドが原因ではないかと疑って床にマットと布団を敷いて寝てみたのだが、そのときは特に改善がみられなかったので、ベッドが原因ではないだろうと思っていた。

とはいえ、寝て起きるときが一番しんどかったり、腰や背中が痛かったりと、症状としては寝疲れなので、思い切ってベッドを変えてみる。

ベッドの選び方


ベッドは、主にベッドフレームとマットレスからなっている。このうち、寝心地に元も影響があるのはマットレスなので、マットレスに絞って調べてみた。

マットレスを決めるポイント


マットレスを決める要素としては、
・スプリング
・枠材の有無
・詰め物の層
・生地
・一層か二層か
といった点があげられる。

これらのうち、寝たときの姿勢に最も影響するのがスプリングである。スプリングについては、最も重要な要素なので下方で詳述する。

その他の要素として、枠材というのは、スプリングの外側、マットレスの周囲に沿って構造材を入れるかで、これはマットの耐久性に関係する。スプリングだけ では寝返り時の横ズレでスプリングがへたりやすくなるため、周囲に構造材を埋めることでスプリングの耐久性を増すことができる。

詰め物の層とは、スプリングの上に層状に入れられたもので、これは通気性や表面の感触に関係する。マットによっては表面と裏面で材質を変えて、片方は通気性に優れた夏用、もう片方は保温性に優れた冬用、といった機能を持たせているものもある。

生地はマットの一番外側の布地で、これは純粋に肌触りや視覚的な効果に関係する。キングストンなど値段の高いメーカのマットは、このあたりで差別化を図っている。とはいえ、寝たときの姿勢をサポートするというマットレス本来の機能という点では影響しないところでもある。

最後に一層か二層かというのは、マットレスのスプリング層と詰め物層の間にしきりをいれることで、詰め物層で柔らかく体をつつみ、スプリング層でしっかり支える、というもの。二層の方が質が高く、その分高価になる。

スプリングについて


さて、これらのポイントのうち最も重要な要素がスプリングだというのは前で書いた。それでは、スプリングにはどのような種類があるのかというと、大きく2種類あり、
  • ボンネルコイル
  • ポケットコイル
となっている。

ボンネルコイルというのは昔からあるスプリングの種類で、1本のワイヤをいくつものコイルに巻いて敷き詰めた形になっている。特徴としては、体を面で支え、横ズレに強く、通気性が良い。フィーリングとしては堅い印象。ポケットコイルよりも価格は安く、半値になることも。

一方、ポケットコイルというのは、独立したコイルを布で包み、それをマットの中にたくさん敷き詰めた構造となっている。体を点で支えるのが特徴で、より体 全体を包み込む柔らかいフィーリングとなる。ただ、横ズレに弱く、スプリングを布で包むため通気性が悪くなりがちで、値段としては、製造に手間がかかるのでボンネルコイ ルに比べ高価になりやすい。とはいえ、体全体を包み込まれる感じはとても優れている。

どちらのマットを選ぶのが良いか?


どちらのマットが良いかは、体格や体重にもよるので人それぞれだが、販売員の方の話では、ポケットコイルを好む人が7割だそうだ。

ベッドを販売しているお店に行けば実際に横になって寝心地を試すことができるので、一度行ってみると良いだろう。


■最近のエントリ
subversionでテキストがバイナリに誤認識されてしまう場合
WiMAXを契約したのでそのまとめ
Haskell(GHC)をMac OSX 10.6 Snow Leopardにインストールする方法
Silverlightとトロイの木馬
ghciのコマンドまとめ
-

subversionでテキストがバイナリに誤認識されてしまう場合には


subversionに日本語のUTF-8ファイルを追加したときに、テイストファイルであるにも関わらずバイナリと誤認識されてしまうことがあります。バイナリと認識されてしまうと、svn diffで差分を表示することができずに困ります。

バイナリと認識されてしまっていることは、svn addしたときに(bin)と表示されるのでわかります。また、次のようにしても調べられます。
$ svn propget svn:mime-type hoge.tex
application/octet-stream
これはmime-typeがapplication/octet-streamになってしまっていることを表しています。

バイナリと誤認識されたファイルをテキストとして再認識させるには、mime-typeをtext/で始まる文字列にすれば大丈夫です。あるいは単にmime-typeを消すだけでもOK。
$ svn propset svn:mime-type text/x-tex hoge.txt
$ または svn propdel svn:mime-type hoge.txt
$ svn commit -m ''
さらに文字コードを指定したい場合は svn:mime-type 'text/plain; charset=euc-jp' などとすればよいです。

■最近のエントリ
WiMAXを契約したのでそのまとめ
Haskell(GHC)をMac OSX 10.6 Snow Leopardにインストールする方法
Silverlightとトロイの木馬
ghciのコマンドまとめ
MacBookPro用インナーケースまとめ
-