「第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
お前、誰よ?
** 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. 回答コード)
*** 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. 回答コード)
*** udiv function to mgem :exercise1.3: numericクラスに直接追加した非標準のudiv/udiv_roundメソッドを 配布しやすくしよう **** Question 私の作ったこのHappyなudivを 世界中の人につかってもらうにはどうすれば? by head first railser **** Answer ruby2のgemと同様に、 mrubyにはmgemというライブラリ配布の仕組みがあります mgemパッケージを作成しましょう。(PS. 回答コード)
さて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
質問募集^^