2018年08月15日

Schemeの勉強

夏休みということでプログラミング言語Schemeを勉強してみることにしました[1]。Schemeは関数プログラミング言語のひとつで、多くの対話型プログラミング環境が提供されています。今回はDr.Racket[2]を使って動作確認などをすることにしました。

以下は[1]の第2章の内容のメモです。

define: 変数のバインド。トップレベル定義を行えばどこからでも参照可能
lambda: プロシージャの生成
load: ロード

単純式: 文字列、数値、シンボル、リストといった定数データ・オブジェクト
算術演算、前置記法
  (+ 1/2 1/2)
(- 1.5 1/2) ⇒ 1
(* 3 1/2) ⇒ 1.5
(/ 1.5 3/4) ⇒ 2.0
(* 2 (* 2 (* 2 (* 2 2)))) ⇒ 32
(/ (* 6/7 7/2) (- 4.5 1.5)) ⇒ 1.0
リスト
  (1 2 3 4 5)
("this" "is" "a" "list")
carとcdr: リストを切り離す2つの基本的なプロシージャ
car: リストの最初の要素を返す
cdr: リストの残りの部分を返す
それぞれの引数は空でないリスト
  (car '(a b c)) ⇒ a
(cdr '(a b c)) ⇒ (b c)
(cdr '(a)) ⇒ ()
(car (cdr '(a b c))) ⇒ b
(cdr (cdr '(a b c))) ⇒ (c)
(car '((a b) (c d))) ⇒ (a b)
(cdr '((a b) (c d))) ⇒ ((c d))
quote: プロシージャではないことを明示。シングルクォート(')でも指定可能
  '(/ (* 2 -1) 3)
cons: リストを生成する
2つの引数を与える。
  (cons 'a '()) ⇒ (a)
(cons 'a '(b c)) ⇒ (a b c)
(cons 'a (cons 'b (cons 'c '()))) ⇒ (a b c)
(cons '(a b) '(c d)) ⇒ ((a b) c d)
ちゃんとしたリストでなくてもcons可能。その際はドット対記法を使う
  (cons 'a 'b) ⇒ (a . b)
(cdr '(a . b)) ⇒ b
(const 'a '(b . c)) ⇒ (a b . c)
'(a . (b . (c . ()))) ⇒ (a b c)
list: 常に行儀のよいリストを生成する
  (list 'a 'b 'c) ⇒ (a b c)
(list 'a) ⇒ (a)
(list) ⇒ ()
let: letの本体として参照される式exprの並びに変数varと値valを対にしたリストを含めたもの
  (let ((x 2))
(+ x 3)) ⇒ 5
(let ((y 3))
(+ 2 y)) ⇒ 5
(let ((x 2) (y 3))
(+ x y)) ⇒ 5
バインド:letによって変数に値を保持すること
共通化することができる複数の部分式をまとめて扱いたい場合にも使用される
  (+ (* 4 4) (* 4 4)) ⇒ 32
(let ((a (* 4 4)))
(+ a a)) ⇒ 32
(let ((list1 '(a b c)) (list2 '(d e f)))
(cons (cons (car list1)
(car list2))
(cons (car (cdr list1))
(car (cdr list2))))) ⇒ ((a . d) b . e)
lambda: 引数として渡すことができるプロシージャを生成
もっとも一般的な操作例:
  ((lambda (x) (+ x x)) (* 3 4)) ⇒ 24
プロシージャを値として変数にバインド可能:
  (let ((double (lambda (x) (+ x x))))
(list (double (* 3 4))
(double (/ 99 11))
(double (- 2 7)))) ⇒ (24 18 -10)
defineを使ったトップレベル定義を行えばどこからでも参照可能
  (define double-any
(lambda (f x)
(f x x)))
トップレベル定義はletやlambdaで隠蔽される
  (define xyz '(x y z))
(let ((xyz '(z y x)))
xyz) ⇒ (z y x)
carとcdrを組み合わせたcadrやcdrとcdrを組み合わせたcddrといった省略形が用意されている。defineで定義すると:
  (define cadr
(lambda (x)
(car (cdr x))))
(define cddr
(lambda (x)
(cdr (cdr x))))
if: 条件式(if test consequent alternative)
帰結部consequentは条件testが真であった場合に評価される式
代替部alternativeは条件testが儀であった場合に評価される式
  (define abs
(lambda (n)
(if (< n 0)
(- 0 n)
n)))
述語: 引数に関する質問に対して#tか#fを返す
大半の述語は疑問符(?)で終わっている
  (null? '()) ⇒ #t
(eqv? #f #f) ⇒ #t
オブジェクトの型を調べる型述語
  pair?, symbol?, number?, string?
errorプロシージャ
  (define reciprocal
(lambda (n)
(if (and (number? n) (not (= n 0)))
(/ 1 n)
(error 'reciprocal "improper argument ~s" n))))
cond: 複数の条件と代替式を定義可能
  (define abs
(lambda (n)
(cond
((= n 0) 0)
((< n 0) (- 0 n))
(else n))))
簡単な再帰
  (define length
(lambda (ls)
(if (null? ls)
0
(+ (length (cdr ls)) 1))))
map: 「最初の引数をプロシージャとして扱い、それに対して2番目の引数であるリストの
       各要素を引き渡して適用し、出力のリストにマップしていくプロシージャ」
  (map abs '(1 -2 3 -4 5 -6)) ⇒ (1 2 3 4 5 6)
set!: 代入
カウンタ作成
  (define make-counter
(lambda ()
(let ((next 0))
(lambda ()
(let ((v next))
(set! next (+ next 1))
v)))))
スタック作成
  (define make-stack
(lambda ()
(let ((ls '()))
(lambda (msg . args)
(cond
((eqv? msg 'empty?) (null? ls))
((eqv? msg 'push!)
(set! ls (cons (car args) ls)))
((eqv? msg 'top) (car ls))
((eqv? msg 'pop!)
(set! ls (cdr ls)))
((eqv? msg 'print!) ls)
(else "oops"))))))
参考文献
[1] ケント ディヴィグ著、村上 雅章訳、”プログラミング言語SCHEME”、株式会社ピアソン・エデュケーション、2000
[2] http://racket-lang.org/




web拍手 by FC2
posted by シンドラー at 17:19 | Comment(0) | 関数プログラミング | このブログの読者になる | 更新情報をチェックする

2018年07月31日

pbrtのテスト

いつの間にか7月も終わりですね。それにしても毎日暑いです。今月まだ更新してなかったので無理やり更新します。今回は物理ベースレンダラの一つであるPBRTの動作確認です。

ビルド・インストール方法は、GitHubのページに書いてある通りです。依存関係のライブラリのダウンロードなどもまとめて行いたいので、git cloneで取ってきます。

1. Gitのインストール
2. Git Bashの起動
3. インストールしたいディレクトリに移動
4. pbrt-v3のダウンロード

$ git clone --recursive https://github.com/mmp/pbrt-v3/
$ cd pbrt-v3
$ git submodule update --init --recursive

5. サンプルシーンのダウンロード(8GB程度あるので時間がかかります)
http://pbrt.org/scenes-v3.html

$ cd ..
$ git clone git://git.pbrt.org/pbrt-v3-senes

6. cmake-guiの起動

Configure -> Visual Studio 15 2017 Win64

CMAKE_INSTALL_PREFIX: インストール先に変更
他デフォルト

Configure -> Generate -> Open Project

7. ビルド

ALL_BUILDのビルド
INSTALLをスタートアッププロジェクトに設定してビルド→インストール

以上でCMAKE_INSTALL_PREFIXに指定したディレクトリにpbrtがインストールされます。

実行結果

とりあえずサンプルシーンのpbrt-v3-scenes/simple/teapot-metal.pbrtをレンダリングしてみました。

$ pbrt.exe ../pbrt-v3-scenes/simple/teapot-metal.pbrt

大体10分ぐらいかかりました。

teapot-material.png

次回はobjをpbrtに変換するobj2pbrt.exe辺りを試してみたいと思います。LayerLab[2]とかMitsuba physically based renderer[3]とか色々関連プロジェクトもあるようですので、試すかもしれません。

[1] https://github.com/mmp/pbrt-v3
[2] https://github.com/wjakob/layerlab
[3] http://www.mitsuba-renderer.org/

web拍手 by FC2
posted by シンドラー at 22:26 | Comment(0) | Rendering | このブログの読者になる | 更新情報をチェックする

2018年06月11日

glTFのテスト その2

とりあえず読込みできるようになったので、前から作っているGUIに組み込んでみました。
テクスチャがおかしかった問題ですが、モデルによっては頂点カラーのみで、テクスチャ座標を持たないメッシュがあり、こちらで使っている中間データは頂点数=テクスチャ座標数で考えていたので、テクスチャ座標を持たないメッシュがあるとインデックスがずれてしまっていたのが原因でした。

実行結果

いくつかsketchfabのデータを表示してみましたが、大体は問題なさそうです。今回は[1]のデータを表示させていただきました。

glTF_test_002.png

[1] https://sketchfab.com/models/011dc1e272be4245bfe2f7e72503f6ab#
web拍手 by FC2
posted by シンドラー at 22:19 | Comment(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2018年05月31日

glTFのテスト

いつの間にか5月が終わりましたね。何となくglTF[1]対応をしてみようと思いました。
Khronos Group提唱ですので、OpenGLとの親和性が高そうですね。

今回は[2]のライブラリを使用させていただいて、とりあえずファイルを読み込んで.objに変換してみました。
nodeにmatrixやquaternion等の情報が親子関係で定義されていて、そこにmeshが関連付けられています。
meshにはmaterialやaccessorが関連付けられていて、bufferやimagesから各種データを取り出すことができます。
positionはオブジェクト座標ですので、nodeに記述されている位置姿勢を掛けていく行列操作も必要です。

実行結果

sketchfabというサイトではモデルを全てglTFで保存できるようになっているようで、今回は[3]のモデルをテストとして使用させていただきました。行列掛ける順番間違えたり結構苦労して、まだテクスチャ座標がおかしそうですが、とりあえずMeshLabで表示できたので、おおよその読み込みはできたと思います。

glTF_test_001.png

[1] 次世代の3Dデータフォーマット決定版 glTF 2.0 の概要図を日本語訳してみた
[2] Header only C++ tiny glTF 2.0 library
[3] sketchfab - Oculus Rift CV1
web拍手 by FC2
posted by シンドラー at 22:27 | Comment(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2018年04月30日

SFMLのテスト その4

いつの間にか4月が終わりますね。5x5では狭いので15x15に広げてみました。後はCSVファイルを読み込めるようにしてみました。解き方も色々工夫できそうですが、なかなかアルゴリズム考えるのも難しいですね。

実行結果

参考として[1]の問題を使わせていただきました。簡単な問題しか解けませんね。

sfml_tgui_001.png
CSV読込み

sfml_tgui_002.png
1回目

sfml_tgui_003.png
2回目

[1] https://www.minicgi.net/logic/
web拍手 by FC2
posted by シンドラー at 18:35 | Comment(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2018年04月04日

SFMLのテスト その3

TGUIのテストです。お絵描きロジックを自動で解くプログラムでも作ってみようということで、GUIを作ってみました。数値を入力するためのEditBoxと、塗りつぶす所と除外する所の画像を切り分けたかったので、BitmapButtonを使うことにしました。

TGUIにはgui-builderというソフトウェアが付いていますので、基本的な配置はこれを使って行って、後はテキストを編集すると早いかもしれません。

TGUI_002.png

form.txtなどのテキストファイルに出力すると、プログラムから読み込むことができます。
    gui.loadWidgetsFromFile("form.txt");
後はconnect使ってコールバック関数を実装すれば良いかと思います。Gridというクラスがあったので、これを使えば今回のようなプログラムには有効そうでしたが、今のところ無理やりGUIのポインタ経由で操作しています。

後はExampleのMany different widgetsで使われていますが、Themeを使うと比較的楽に部品の設定ができる気がします。

実行結果

TGUI_003.png

とりあえず各行と各列をチェックして、5の時は全部埋めて、0の時は全部×を付ける処理だけ実装しました。ちゃんと解こうとすると大変そうですが、5x5だとあまりパターンもないので楽かもしれません。



web拍手 by FC2
posted by シンドラー at 00:34 | Comment(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2018年03月31日

SFMLのテスト その2

SFML対応のGUIの一つであるTGUI[1]を試してみました。スライダーやボタン、エディットボックスなど色々使えるみたいです。

CMake使ってソースからコンパイルしてもいいですが、バイナリもダウンロードできます。今回は手軽にバイナリから使いました。サイトにチュートリアルや例題があるので、それを見れば特に問題はないかと思います。

実行結果

例題のScalable login screenです。背景画像はLenna画像に差し替えました。

tgui_test_001.png

いつも使っているTweakBarは、どちらかというとメニュー優先っぽいので、ボタンやエディットボックスを含むGUIを手軽に使いたい場合は良いのではないでしょうか。

[1] TGUI: Texus' Graphical User Interface
web拍手 by FC2
posted by シンドラー at 22:03 | Comment(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2018年03月15日

curlとCrypto++によるhttps通信についてのメモ

仮想通貨も色々問題が出て価格も下がって大変ですね。プログラムの題材としては良い気もするのですが。以前ZaifのサイトからデータをGETするためにlibcurlとμjsonを使っていたのですが、トレードまで行うためにはPOSTと暗号化が必要になります。

[1]より引用
    signはPOSTする全てのパラメータ(nonceとmethodおよびメソッド毎のパラメータ)を
    URLエンコードしたクエリ形式(param1=val1&param2=val2)のメッセージとして、
    Secret Keyを用いてHMAC-SHA512で署名します。
よく分かりませんが、[2]のPythonのサンプルコードを参考にさせていただくと、サイトで発行できるSecret Keyを使ってHMAC-SHA512に従って署名したデータをHEADERに付けてPOSTするようです。ということで、C++でHMAC-SHA512が使えるライブラリを探したところ、Crypto++[3]というライブラリがありました。

HMACのサンプル[4]を参考にさせていただきましたが、Secret Keyは既に16進数のデータだったのですが、サンプルコードは文字列を16進数に変換する関数も実行されていたので、2回16進数変換をしていてPythonを使った時と結果が異なるのでちょっと悩みました。そのままコピペは駄目ですね。

後はlibcurlを使ってPOST処理を行います。注意点としては、CMakeでライブラリをコンパイルする場合はhttpsをサポートするようにOpenSSLなどのオプションを選ばないといけないことと、httpsを使うときにはcurl-ca-bundle.crtが無いとエラーが出ますので、準備する必要があります。POST処理は[5][6]を参考にさせていただきました。

これでPOST処理がうまくいけば、JSON形式のデータが戻ってきますので、μjsonを使ったり使わなかったりしながら必要なデータを取り出せば一応取引まで可能になります。

後はRaspberry Pi上で動かしているので、ライブラリに関するメモです。libcurlとopensslはapt-getで取得できます。ライブラリがどこにあるのかと思えば/usr/lib/arm-linux-gnueabihf/とかarm-linux-gnueabihfがついた場所に入れられるみたいです。Crypto++はmakeで普通にインストール・動作しましたので、特に問題ないかと思います。

[1] Zaif api document v1.1.1 現物取引API
[2] 個人投資家のためのFinTechプログラミング (日経BPムック)
[3] Crypto++: free C++ Class Library of Cryptographic Schemes
[4] Crypto++ Wiki: HMAC
[5] Post data with libcurl
[6] Http post header fields with libcurl

web拍手 by FC2
posted by シンドラー at 21:20 | Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2018年03月01日

Appleseedレンダリングエンジンのテスト その12

気がついたら2月が終わっていました…。特に内容を思いつかなかったので小ネタです。
AppleseedレンダラのGlass BSDFを試してみました。モデルは[1]をobjに変換して使用させていただいております。

Appleseedレンダラでモデルを読み込む場合は、オブジェクトタグで定義します。filenameのところにファイル名を書きます。読み込んだオブジェクトはoutという名前で参照できるようにしています。
    <object name="out" model="mesh_object">
        <parameter name="filename" value="glass.obj" />
    </object>
オブジェクトタグで定義したものは、インスタンスとして実体化させる必要があります。
    <object_instance name="out.obj_0_1_inst" object="out.obj_0_1">
        <transform>
            <matrix>
                1.0 0.0 0.0 0.0
                0.0 1.0 0.0 -5.705
                0.0 0.0 1.0 0.0
                0.0 0.0 0.0 1.0
            </matrix>
        </transform>
        <assign_material slot="material_0_1" side="front" material="material_0_1" />
        <assign_material slot="material_0_1" side="back" material="material_0_1" />
    </object_instance>
out.obj_0_1_instがインスタンス名、out.obj_0_1がobjファイルの中に定義されているグループ名だったと思います。out+.の形で子グループにアクセスする感じだと思います。このように、objファイルは1個でも、中に複数グループがあればグループ1個ずつインスタンスを生成することができます。

matrixはモデリング行列です。スケーリング調整、回転、平行移動などさせたい場合はここを変更します。この例では5.705だけY軸方向に下げています。一番右の列が平行移動になるので、行列の転置に気を付ける必要があります。後、この行列はappleseed.studioからは編集できなかったと思います。基本的には他のモデリングソフトのプラグインを使ってくださいということだと思います。

assign_materialがマテリアルの割り当てです。透明な物体の場合はfrontとbackの両面を定義していないとピンク色になってしまいます。

実行結果

中の液体と泡はAlphaを0.5ぐらいにしたLambertモデルだったと思います。グラスの部分は両面デフォルトのGlass BSDFです。液体のあたりは本当はもうちょっと別の設定がいるのかもしれませんが、グラスの部分はグラスっぽいと思います。

appleseed_glass_test_001.png

[1] 発泡ワインセット

web拍手 by FC2
posted by シンドラー at 18:14 | Comment(0) | Rendering | このブログの読者になる | 更新情報をチェックする

2018年01月28日

Appleseedレンダリングエンジンのテスト その11

いつの間にかAppleseed Renderer[1]のバージョンが1.8.1-betaまで上がっていました。1.7でPlastic BRDFというものが実装されていましたので、試してみました。他にもGlass BSDFとかMetal BRDFなど、色々なBRDFが増えているようでした。

実行結果

昔作っていたプログラムでPlastic BRDFのパラメータも出力できるようにしてみました。また、サンプルのCornell Boxを参考に、Cornell Boxの外側だけ出力するようにしました。モデルは以前と同じTda式改変憤怒ミクさんを使用させていただいております。

以前のもの(壁はLambertian、モデルはOren+Ashikhmin)
tda_roku_cornell_ashikhmin2.png

Plastic BRDF(壁もモデルもPlastic)
tda_roku_cornell_plastic2.png

パラメータはデフォルトのものなので調整すればもっと良くなるかもしれません。時間があくと自分で作ったプログラムの操作方法忘れてて困ったものです。

[1] https://appleseedhq.net/
web拍手 by FC2
posted by シンドラー at 18:27 | Comment(0) | Rendering | このブログの読者になる | 更新情報をチェックする