「第57回 Ruby/Rails勉強会@関西」で「mrubyでの整数の割り算」について発表してきた

 発表してきました。
なので以下に発表資料のorg-modeを書いておきます^^;


 あと演習する予定だった問題の回答
(ってか、さすがに30分では演習してもらうのは無理なので、演習1.1のudiv実装部分のコード説明のみで終わりました)
GitHub - murasesyuka/mruby at ruby_rails_kansai_57

発表の概要

 mrubyの夕べで、1/3 => 0.333になるって話を聞いたので、
なら、1/3 => 0になるようにIntegerを書き換えてしまえ><


 で、ここ最近はmruby標準の組み込みライブラリもどんどんmgem化して
コア機能を最小にするのが流行っているようなので
その時流にそって、上記の変更をmgemにする


 って、一連のストーリー仕立てで発表を考えていましたが、
1/3も説明できてなかったし、1/3も伝わらなかったと思いますw;

発表資料

#+TITLE: 普通にmrubyでプログラム
#+AUTHOR: murase_syuka

Ruby/Rails勉強会@関西 57th

  2013年4月13日(土)

  普通にmrubyでプログラム

お前、誰よ?

** murase_syuka

*** work
    C on Linux

*** cook
    C++ from Exceptional C++
    Ruby from Minami.rb
    Debian from DebianKansai
      
*** hobby
    Blender with Python
    + GIMP
    + Inkscape

*** info

+ blog:    http://d.hatena.ne.jp/murase_syuka/
+ twitter: https://twitter.com/#!/murase_syuka

最初に

** 目次
   - what mruby
   - eval to 1/3
   - T -> T -> T
     - udiv
     - round with udiv
     - udiv function to mgem
   - さてmrubyとは一切関係ないですが
   - 最後に
   - Q&A

what mruby

  [[http://forum.mruby.org/][軽量Rubyフォーラム]]
  [[https://github.com/mruby/mruby][github:mruby]]
  
** (PS. 会場質疑内容追加)
   ruby2は、rubyが主、rubyからC言語ライブラリを呼ぶ
   mrubyは、C言語が主、C言語アプリケーション等に組み込む


* eval to 1/3
  さて問題です。1/3は、なんぼ?
  
** answer
   mirb> 1/3 => 0.3333333

   ruby> 1/3 => 0

*** any program lang is eval(1/3) ?
    
    
**** execise 1/3, -1/3, (-1)/3 ?
      
      |         | 1/3       | -1/3       | (-1)/3     |
      |---------+-----------+------------+------------|
      | mruby   | 0.\dot{3} | -0.\dot{3} | -0.\dot{3} |
      | ruby2   | 0         | -1         | -1         |
      | python3 | 0.\dot{3} | -0.\dot{3} | -0.\dot{3} |
      | go      | 0         | 0          | 0          |
      | R       | 0.\dot{3} | -0.\dot{3} | -0.\dot{3} |
      
***** (PS. 会場質疑内容追加)
       -1/3と(-1)/3で、結果が違うことがあったとの認識で上記表を作成
      が、上記表のとおり変わらなかったので会場で質問

       a=1等の変数を上記同様に、-a/3と(-a)/3と計算する場合
      結合度の違いで変わることがあるとの事

***** use version

      - mruby   : commit 887339dc199829c423f58190d65492399a2d4aa9
      - ruby2   : ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-linux]
      - python3 : python 3.3.0 (default, Nov 26 2012, 15:38:36) [MSC v.1500 64 bit (AMD64)]
      - go      : go1.0.2
      - R       : R version 3.0.0 (2013-04-03)

***** your ruby2 is minority
      こうしてみると、crubyはおかしい
       	

T -> T -> T

  1/3は0だろ[[常識的に考えて][JK]]
  
  by C programmer
  
** div :: Integral a => a -> a -> a
  divはfdivで計算するんじゃない、udivがスタンダードなんだ

練習問題

*** mruby add udiv					       :exercise1.1:
     mirb> 1.udiv(3) => 0
     となるudivメソッドを実装しましょう

**** Numeric class hierarchy
     |       | ancestors                                      |
     |-------+------------------------------------------------|
     | mruby | [Fixnum, Integer, Numeric, Comparable, Object, |
     |       | Kernel, BasicObject]                           |
     | ruby2 | [Fixnum, Integer, Numeric, Comparable, Object, |
     |       | PP::ObjectMixin, Kernel, BasicObject]          |

**** related file
     ~/mruby/mrblib/numeric.rb
     ~/mruby/src/numeric.c
     ~/mruby/test/t/numeric.c
(PS. 回答コード)

github:udiv:commit

*** mruby round with udiv					:exercise1.2:
    mirb> 1.udiv_round(2) => 1
    となるudiv_roundを実装しよう
     
    #BEGIN_SRC ruby
    def udiv_round(a,b)
      (a/b + 0.5)
    end
    #END_SRC

**** 整数演算のみで考えてみよう
      四捨五入の計算過程で、Floatを使わずに、
     Integerのみで導出してみてください
     
***** Question
      eval to round. 192/127, 192/128, 192/129

***** Answer
      #+BEGEN_SRC mruby
      192.udiv_round(127) #=> 2
      192.udiv_round(128) #=> 2
      192.udiv_round(129) #=> 1
      #+END_SRC
(PS. 回答コード)

github:udiv_round:commit

*** udiv function to mgem					:exercise1.3:
     numericクラスに直接追加した非標準のudiv/udiv_roundメソッドを
    配布しやすくしよう
    

**** Question
      私の作ったこのHappyなudivを
     世界中の人につかってもらうにはどうすれば?
     
     by head first railser

**** Answer
      ruby2のgemと同様に、
     mrubyにはmgemというライブラリ配布の仕組みがあります
     mgemパッケージを作成しましょう。
(PS. 回答コード)

github:toMgem:commit

さてmrubyとは一切関係ないですが

** ただのgit-svnには興味ありません。
   
*** この中にGitlab、gitorious、Gitblit 、の経験者がいたら、
    
**** 懇親会に来なさい。以上。

最後に

  - [[https://github.com/murasesyuka/mruby/tree/ruby_rails_kansai_57][本発表のソースコード]]
    - [[https://github.com/murasesyuka/mruby/commits/ruby_rails_kansai_57][〜のコミットログ]]
  
  - [[https://github.com/rubinius/rubinius/][github : mruby]]
    - [[https://github.com/mruby/mruby/wiki/Related-Projects][github : mruby : mgem]]
      
  - [[https://github.com/rubinius/rubinius/][github : rubinius]]

  - [[http://blog.masuidrive.jp/index.php/2013/01/24/diff-cruby-mruby/][軽量Ruby – mrubyとRubyの違い]]
    - [[http://www.ipa.go.jp/software/open/ossc/english/ruby/ruby_draft_specification.html][Ruby Draft Specification]]

Q&A

  質問募集^^