mrbgemsをC言語で拡張してみる

mrubyの拡張をC言語で行う方法を調べてみた



  • build_config.rb の
  conf.gem 'examples/mrbgems/c_extension_example' do |g|
    g.cc.flags << '-g' # append cflags in this gem
  end
  • の部分、をみてみると CExtension classに c_method メソッドが登録されている
  • これを使いたい場合は、minirakeでbuildして
$ mruby/bin/mirb

> CExtension
 => CExtension
> CExtension.c_method
A C Extension
 => CExtension
> 

となる

ちなみに公式っぽいpdfのgreetingは下記のように使う www.digitalfukuoka.jp/mruby-network/uploaded/16/0222_03.pdf

> Hello.new("yohei").greeting(10)
 => "hellohello, yohei"

mrbgemsを作ってみる方法

下記が一番分かりやすかった 5分でつくる mrbgems

  • 作成するmrbgemsのディレクトリを作る, work/yournamegems とかなんでもよい
  • workディレクトリにmruby持ってくる、中身のbuild_config.rbをいじるのでリンクじゃなくてgit cloneしたやつのほうが最初はいいかな
  • mrubyもってきたら、mruby/build_config.rb に自分のmrbgemsの名前を記載する、例えば下記な感じ
MRuby::Build.new do |conf|
...
    conf.gem '../yournamegems'
...
end

あとはyournamegems内にRubyスクリプトを設置するなどすればよい

例えば下記

work/yournamegems/yourname.rb

class Yourname
    def initialize name
        @name = name
    end
    def yourname
        puts @name
    end
end


ふむ

  • mrubyだけで実装
  • C言語だけで実装
  • C言語 + mrubyで実装
  • といろいろできるらしい
  • よくみたら build_config.rbコメントアウトされてるかたちで
  # Use mrbgems
  # conf.gem 'examples/mrbgems/ruby_extension_example'
  # conf.gem 'examples/mrbgems/c_extension_example' do |g|
  #   g.cc.flags << '-g' # append cflags in this gem
  # end
  # conf.gem 'examples/mrbgems/c_and_ruby_extension_example'
  # conf.gem :github => 'masuidrive/mrbgems-example', :checksum_hash => '76518e8aecd131d047378448ac8055fa29d974a9'
  # conf.gem :git => 'git@github.com:masuidrive/mrbgems-example.git', :branch => 'master', :options => '-v'

みたいなのあるからこのディレクトリの中身みてみてためしてみるのがいいのかなぁ

  • たとえば # conf.gem 'examples/mrbgems/ruby_extension_example'のところ
  • 中身のrbスクリプトが下記
class RubyExtension
  def RubyExtension.ruby_method
    puts "A Ruby Extension"
  end
end
> RubyExtension.ruby_method
A Ruby Extension
 => nil


というわけで下記のようにdefを追加して

class RubyExtension
  def RubyExtension.ruby_method
    puts "A Ruby Extension"
  end

  def extraYK
    puts "extra define from yk"
  end
end

下記のようにmirbで実行することもできる(追加したらコンパイルが必要、たぶん)

> y = RubyExtension.new
 => #<RubyExtension:0x10c4254b0>
> y.extraYK
extra define from yk
 => nil
> 
  • ではまぁなんとなくrubyコードをmruby/build_conf.rbに反映させてmrbgemsを追加する方法というのはわかった
  • あとはC言語と組み合わせるとどうなるんかとか, minirakeってなんやろかとか調べてみる

C言語学習20190405

printfするときの%dとか%cって何?

  • フォーマット指定子
    • フォーマット指定子一覧
    • %c: char
    • %s: char*, 文字列
    • %d: int, short
    • %u: unsigned int, unsigned short, 符号なし整数10真数
    • %o: 整数8進数
    • %x: 整数16進数
    • %f: float
    • %e: float. 指数表示

など


int mainの中身のreturn 0 って必要なの?


ポインタ

  • ポインタ
  • 変数のアドレスを記憶する変数
  • ポインタについて理解するにはアドレスとは何かを理解する必要がある
  • アドレスはメモリ上のある番地(たとえば1000番地)に変数としての領域を確保し、その領域に格納するというような説明になる
// aという変数に123を格納する、123は実際には例えば1000番地に格納される
int a = 123;

// このとき、アドレスは & をつけるとアクセス可能となる
// 例えば下記は、 上記の例だと1000番地を実際は意味する
// アドレスは %p を使えば 16進数8桁の表示でprintfデバッグ可能
printf("%p", &a);

// なので、標準入力する際の
scan("%d", &a);
// というのは、変数aのアドレスが示すメモリエリアに入力データを(この場合intなので?)整数変換して格納する、という意味になる

Unityで神になる本3章 Skybox Material

Unityで神になる本を読んでる

 

 

 

3章, Skybox Materialを自作する、のところ

 

パノラマ画像をprojectに入れてみて

 

Texture Typeを選ぼうとしたけどCubemapが無い

 

これは下記

[Cubemap - Unity マニュアル](https://docs.unity3d.com/jp/current/Manual/class-Cubemap.html)

 

Texture TypeをDefaultにして

 

Texture ShapeをCubeにすればよいみたい