情報は力ではない

UE4 とか Blender とか。

Blenderで作ったモデルをUE4にインポート

f:id:masahiro8080:20170108233709p:plain

Blenderで上図のようなモデルを作ったのでUE4に持ってきた時のメモ。

バージョン

Blender 2.77a
Unreal Engine 4.14.2

Export

Blenderで作ったモデルをfbxでエクスポート。設定は特にいじってないつもり。アニメーションはつけてないので、アニメーションの設定は 見ていない。
f:id:masahiro8080:20170108134736p:plain:w150f:id:masahiro8080:20170108134744p:plain:w150f:id:masahiro8080:20170108134752p:plain:w150

Import

fbxをUE4にインポート。 ここも特に設定はいじってないつもり。 詳しくはらりほまさんのBlender to UE4 (ver.2016) | rarilogを見た方が良いと思います。
f:id:masahiro8080:20170108135239p:plain:w150

インポートした結果がこちら。お腹周りの影が気になるので解消したい。
f:id:masahiro8080:20170108141027p:plain

マップにおいて見た。やはり影が気になる。
f:id:masahiro8080:20170108141322p:plain

インポート時の設定のNormal Import MethodをCompute NormalsからImport Normals and Tangentsに変更してみたら影が消えた。
f:id:masahiro8080:20170108234153p:plain

まだSmooth情報もない気がする。気のせいかもしれないけど。
もう少し調べてみたいと思う。

感想

FBXのExport/Importの設定がまだよく分かっておらず、こうすべきみたいな情報が まだ得られていない。色々試してみる必要がありそう。

新年の目標

新年一発目なので、簡単に目標をば。 去年まで特に目標とか決めずにきたけど、一旦決めてみようかと思う。

  • ゲームを作る。
  • ぷちコンに出る。
  • UE4もしくはBlenderの記事を12本書く。

とりあえずこんなものかと。

去年入門したUE4とBlenderを今年はもっと使っていきたいという思いが今は強いかな。

短いけど、こんなところで。

Yokohama.vim #8に行って来た。

Yokohama.vimに初参加して来ました。

yokohamavim.connpass.com

@gu4さんによる挨拶

www.slideshare.net

最初にYokohama.vimVimの軌跡の比較をしていた。 スライドに記載していたはずのYokohama.vimの軌跡が残念ながら消えてたらしい :( Yokohama.vim #0は2010年から続いているみたい。 Yokohama.vim.osaka? #7には自分は大阪(Osaka.vim #6)から参加していたなぁとか思ってた。

そういえば10/29(土)にOsaka.vim #8があるそうです。関西の方は是非!

osaka-vim.connpass.com

次にアイスブレイクとして、自己組織化ゲームをした。 指示役と移動役という役割を持った二人一組で行うゲーム。 指示役が「前」といえば、移動役が一歩前に歩くといった感じ。 複数のチームの中でどのチームが一番多く歩けるかというのがゲームに対するモチベーションだった。

今回はVimバージョンということで、指示役が行う指示はhjklだった。 自分の相手は@h0k0r0biさんで、指示役をやらせていただいた。 指示を出すとき、慣れるまでhが左でlが右ということがすっと出てこなかった。 Vim上でカーソルを移動する際におそらくhとかlとかを考えずに指が覚えているからだろうなぁと思った。 このゲームではhjkl以外のmapを使用可能だった。自分たちは特に使用しなかったけど ゲーム中に「gg」とか聞こえて来た気がする。

改めて@h0k0r0biさんありがとうございました。

@Watson_DNAさんの発表

speakerdeck.com

TeXVim scriptのクイックソートを比較していた。 TeXVim scriptも遅いねという感じだった。

@Linda_ppさんの発表

すごいということしかわからなかったのだけれど、CコンパイラVim scriptで作成したいという話だったと思う。すごい。

@thincaさんによるVim 8.0の機能の説明

:help version-8.0の内容を@thincaさんが解説するという急遽開催されたもの。 色々便利なものがあったけど、まだ自分は全然把握できていないので復習をする必要がありそう。

したこと

特に何もせずに話を聞いたり、少しもくもくしたり、TweetVimを始めたりしていた。

所感

Yokohama.vimは初参加だったけど、わいのわいのした感じで楽しかった。 ただ、vimrc読書会でお会いする方々に話しかけたい気もしたけど、人見知りなので話しかけれなかったのが残念だった(これは自分の問題だけれども)。 また参加する時にはお邪魔したいと思います。

Vim 8.0にした。

先々週9/12にVim 8がリリースされたので、だいぶ遅れたがVim 8をインストールした。 今回はソースコードビルドに挑戦してみたので、そのメモを書きます。 何気にソースコードビルドは初挑戦(お恥ずかしいことに今までVim 7.4.729を使っていた...)。

やり方

gitからVimソースコードを持ってきます。

git clone https://github.com/vim/vim.git

あとは、READMEに従ってビルドするだけです。 自分はOS XユーザなのでREADMEdir/README_mac.txtを見ながら実施。

make
sudo make install

これでvim/src以下にVimの実行ファイルが出来ます。 あとは、VimにPATHを通すだけです。 例えば、~Vimをcloneしたのであれば.bashrcとかに

export PATH=~/vim/src/:$PATH

とすれば良いかと思います。

感想

ソースコードからVimをビルドするのは簡単。 これでVim活が捗る(はず)。

TaPL 演習4.2.2

問題

arithの実装におけるeval関数の定義を、大ステップスタイルに変えよ。

答案

もう少しうまく書きたい。

let rec eval1' t = 
  try
    match t with
      TmIf(_, t1, t2, t3) -> (
        let t1' = eval1'(t1) in
        match t1' with
          TmTrue(_)  -> let v2 = eval1'(t2) in v2
        | TmFalse(_) -> let v3 = eval1'(t3) in v3
        | _ -> raise NoRuleApplies)
    | TmSucc(fi, t1) when isnumericval t1 ->
        TmSucc(fi, eval1'(t1))
    | TmPred(_, t1) -> (
        let t1' = eval1'(t1) in
        match t1' with
          TmZero(_) -> t1'
        | TmSucc(_, nv1) when isnumericval nv1 -> nv1
        | _ -> raise NoRuleApplies)
    | TmIsZero(_, t1) -> (
        let t1' = eval1'(t1) in
        match t1' with
          TmZero(_) -> TmTrue(dummyinfo)
        | TmSucc(_, nv1) when isnumericval nv1 -> TmFalse(dummyinfo)
        | _ -> raise NoRuleApplies)
    | _ -> raise NoRuleApplies
  with NoRuleApplies -> t

感想

軽く試した感じは、ちゃんと動いてる。ただ正確に動くかどうかはCoq等で証明すべきなんだろうな。 あとは関数名をeval'とかにすべきだったかも。

vim-ocaml-stdlib-helpを作った。

最近、OCamlを勉強していて、VimOCamlを書いてます。その時に標準ライブラリの機能を調べたいなと思うのだけれど、いちいちブラウザで調べるのも面倒なのでVim pluginを作りました。

github.com

使い方は

:OCamlStdLibHelp {module-name}

という感じです。例えば

:OCamlStdLibHelp Array

とすれば

module Array: sig .. end
Array operations.
val length : 'a array -> int
Return the length (number of elements) of the given array.
val get : 'a array -> int -> 'a
Array.get a n returns the element number n of array a.
   The first element has number 0.
   The last element has number Array.length a - 1.
   You can also write a.(n) instead of Array.get a n.


   Raise Invalid_argument "index out of bounds"
   if n is outside the range 0 to (Array.length a - 1).
val set : 'a array -> int -> 'a -> unit
Array.set a n x modifies array a in place, replacing
   element number n with x.
   You can also write a.(n) <- x instead of Array.set a n x.


   Raise Invalid_argument "index out of bounds"
   if n is outside the range 0 to Array.length a - 1.

といった感じで出力されます。割と雑に作ってるので、まだ読みづらいです。

この標準ライブラリのドキュメントは The standard library から引っ張ってきています。

このサイトのHTMLは<p>タグが閉じられていないのでYQLを使ってタグが閉じられたHTMLを取得しています。

YQL - Yahoo Developer Network

あとはVital.Web.HTTPとVital.Web.XMLを用いてスクレイピングをしている感じです。

github.com

これらの方法はmattnさんのブログを見て作成をしました。

mattn.kaoriya.net

今後

まだ出力結果が見づらいので、そこを変更したい。また、コマンド実行時にVimをブロックしてしまうので非同期処理にしたいなと考えています。

TaPL 演習3.5.14

問題

定理3.5.4が算術演算の評価関係に関しても成り立つことを示せ。
すなわち、 t→t' かつ  t→t'' ならば  t'=t'' であることを示せ。

証明

 t→t' の導出に関する帰納法を使用し、  t→t' の導出で最後に使った規則に対する場合分けにより証明する。

 (i) E-SUCCの場合

 t succ  t_1 という形であり、またある  t_1' が存在して  t_1→t_1' である。
左側の最も外側に  succ を用いている規則はE-SUCCのみである。 よって、 t→t'' の導出で最後に使った規則もE-SUCCであり、ある  t_1'' が存在して t_1→t_1'' である。 帰納法の仮定より、 t_1' = t_1'' 。 したがって、 t' = succ  t_1' = succ  t_1'' = t''

 (ii) E-PREDZEROの場合

 t pred  t_1 という形であり、 t_1 = 0 である。 左側の最も外側に  pred を用いている規則はE-PREDZERO、E-PREDSUCCとE-PREDの3つであるので  t→t'' の導出の最後に使った規則はこのうちのいずれかである。  t→t'' の導出で最後に使った規則はE-PREDではない。 E-PREDであれば、ある  t_1'' が存在して  t_1→t_1'' となるが、0は値なので、評価されないからである。 E-PREDSUCCの場合、 t_1 = succ  nv_1となるが、 t_1 = 0 であるのでE-PREDSUCCでもない。 よって、 t→t'' の導出の最後に使った規則はE-PREDZEROであり、 t' = t'' となる。

 (iii) E-PREDSUCCの場合

 t pred  t_1 という形であり、 t_1 = succ  nvである。  (ii)と同様の推論により、 t→t'' の導出の最後に使った規則はE-PREDSUCCであることがわかる。 よって、 t' = t'' となる。

 (iv) E-PREDの場合

 t pred  t1という形であり、ある  t_1' が存在して  t_1→t_1' である。 (ii)と同様の推論により、 t→t'' の導出で最後に使った規則がE-PREDであることがわかる。 このとき、ある  t_1'' が存在して、 t_1→t_1'' である。 帰納法の仮定より、 t_1' = t_1''。 よって、 t' = pred  t_1' = pred  t_1'' = t''

 (v) E-ISZEROZEROの場合

 t iszero  t_1 という形をしており、 t_1 = 0である。 左側の最も外側に iszero を用いている規則はE-ISZEROZERO、E-ISZEROSUCC、E-ISZEROがあるが  succ  nv_1 と0は異なるので、 t→t'' の導出で最後に使った規則はE-ISZEROSUCCではない。 また、E-ISZEROでもない。なぜなら、E-ISZEROであれば、ある  t_1' が存在して t_1→t_1' となるが 0は値なので評価されないからである。 よって t→t'' の導出で最後に使った規則はE-ISZEROZEROであり、 t' = t''

 (vi) E-ISZEROSUCCの場合

 t iszero  t_1 という形をしており、 t_1 = succ  nv_1 である。  (v) と同様の推論で、 t→t'' の導出で最後に使った規則がE-ISZEROSUCCであることがわかる。 よって、 t' = t''

 (vii) E-ISZEROの場合

 t iszero  t_1という形をしており、ある t_1' が存在して  t_1→t_1' である。  (v) と同様の推論により、 t→t'' の導出で最後に使った規則がE-ISZEROであることがわかる。 このとき、ある  t_1'' が存在して、 t_1→t_1'' である。 帰納法の仮定より、 t_1' = t_1''。 よって、 t' = iszero  t_1' = iszero  t_1'' = t''

以上より、 t→t' かつ  t→t'' ならば  t' = t'' である。

所感

解答に書いている通り、tの構造に関する帰納法を用いたほうが簡潔だなぁ。