SlideShare uma empresa Scribd logo
1 de 65
Baixar para ler offline
怠惰なRubyistへの道
Enumerator::Lazyの使いかた
      Chikanaga Tomoyuki
         (@nagachika)
          Yokohama.rb




                           1
Agenda

Enumerable
Enumerator
Enumerator::Lazy


                   2
WARNING

 今日の話は
 Ruby 2.0 の
新機能について


              3
Ruby 2.0

2013年リリース予定
[ruby-dev:44691] より

Aug. 24 2012: big-feature freeze
Oct. 24 2012: feature freeze
Feb. 24 2013: 2.0 release
Ruby の生誕 20 周年



                                   4
Ruby 2.0


未来の話


           5
2.0 is in
   development

       ※注※
    仕様は開発中のものであり
リリース版では変更される場合があります




                      6
Install Ruby 2.0

未来を手中に

rvm, rbenv を使っていれば
rvm install ruby-head
rbenv install 2.0-devel


                          7
Ruby 2.0 for
   Windows




               8
Self Introduction
twitter id: @nagachika
ruby trunk changes
(http://d.hatena.ne.jp/nagachika)

CRuby committer
Yokohama.rb → 福岡遠征中
Sound.rb(ruby-coreaudio, ruby-puredata)



                                          9
Enumerator::Lazy


                   10
Enumerator::Lazy



  の前に
                   11
Enumerable

             12
Enumerable


もちろん使ってますよね?




               13
Array, Hash, IO...

Array や Hash, IO は
    Enumerable を
   include している


                     14
Enumerable

【形容詞】 数えられる            [日本語 WordNet(英和))


 可算;可付番       [クロスランゲージ 37分野専門語辞書]


Capable of being enumerated;
countable [Wikitionary]




                                           15
Enumerable


「each メソッドを呼ぶと、何かが
順に(N回) yield で渡される」
というルール(N >= 0)




                      16
Enumerable


each メソッドが定義されて
いるクラスに include して
使う(Mix-in)


                    17
Enumerable

each だけ用意しておけば
map, select, reject, grep, etc...
といったメソッドが使えるようになる
(これらのメソッドが each を使って
実装されている)



                                    18
An Example
class A
  include Enumerable
  def each
    yield 0
    yield 1
    yield 2
  end
end
A.new.map{|i| i * 2 } # => [ 0, 2, 4 ]


                                         19
ここまでのまとめ

Enumerable は each メソッドを使って
多彩なメソッドを追加する
なにが「数え上げられる」のかは
each メソッドがどのように
yield を呼び出すかで決まる




                             20
Enumerator



使ってます?

              21
Enumerator


each に渡すブロックを保留した
状態でオブジェクトとして持ち回す




                    22
to_enum, enum_for

Enumerator の作りかた
•   Enumerator.new(obj, method=:each, *args)
•   obj.to_enum(method=:each, *args)
•   obj.enum_for(method=:each, *args)
•   Enumerator.new{|y| ...}
      ↑これだけちょっと特殊




                                               23
Object#enum_for
each 以外の任意のメソッドの呼び出しを
Enumerator にできる
(実は Enumerable でなくてもいい)


e_byte = $stdin.enum_for(:each_byte)
  => バイトごとに yield
e_line = $stdin.enum_for(:each_line)
  => 行ごとに yield


                                       24
Enumerator.new{|y|}

e =   Enumerator.new{|y|
  y   << 0
  y   << :foo
  y   << 2
}
ブロックが each の代わり。
ブロックパラメータ y に << すると
yield することになる。


                           25
Enumerator.new{|y|}
class A
  def each
    yield 0
    yield :bar
    yield 2
  end
end
A.new.to_enum
と同じ


                      26
Enumerator as
 External Iterator
外部イテレータとして使える

e = (0..2).to_enum
e.next # => 0         each が yield する値が
e.next # => 1         順に next で取り出せる
e.next # => 2
e.next
=> StopIteration: iteration reached an end




                                             27
Method Chain

map, select など一部のメソッドはブロッ
クを省略すると Enumerator を返すので
複数のメソッドを組み合わせて使う
ary.map.with_index { |v,i| ... }




                                   28
Method Chain


[:a, :b, :c, :d].map.with_index do |sym, i|
  i.even? ? sym : i
end
=> [:a, 1, :c, 3]         Enumerator
                       独自のメソッド



                                              29
with_index
[ruby-dev:31953] Matz wrote...
  mapがenumeratorを返すと
obj.map.with_index{|x,i|....}
ができるのが嬉しいので導入したのでした。というわけで、
* eachにもmapにもwith_indexが付けられて嬉しい
というのが本当の理由です。




                                   30
Secret Story of
  Enumerator.

  Enumerator は
with_index の為に
    生まれた!
  というのは嘘ですが
 主な用途は with_index の
 ためのような気がします

                      31
ここまでのまとめ
• Enumerator
• Object#to_enum, enum_for
• 外部イテレータ化
  • Method Chain
•

                             32
Enumerator::Lazy


2.0 の新機能


                   33
Enumerator::Lazy


Enumeratorのサブクラス



                    34
Enumerable#lazy

Enumerator::Lazy の作りかた
Enumerable#lazy を呼ぶ


>> (0..5).lazy
=> #<Enumerator::Lazy: 0..5>



                               35
Enumerator::Lazy

Lazyのmap,select,zipなど一部のメソッ
ドがさらにLazyを返す
>> (0..5).lazy.map{|i| i * 2}
=> #<Enumerator::Lazy:
#<Enumerator::Lazy: 0..5>:map>




                                 36
Enumerator::Lazy
> Enumerator::Lazy.instance_methods(false)

      map          collect                 flat_map
collect_concat      select                  find_all
     reject          grep                     zip
      take       take_while                  drop
 drop_wihle         cycle
      lazy          force
                      [ruby 2.0.0dev (2012-05-30 trunk 35844)]



                                                                 37
force

Enumrator::Lazy#force
to_a の alias
遅延されているイテレータの評価を実行




                        38
A Lazy Demo
>> l = (0..5).lazy
=> <Enumerator::Lazy: 0..5>
>> l_map = l.map{|i| p i; i * 2 }
=> <Enumerator::Lazy: #<Enumerator::Lazy: 0..5>:map>
# この時点ではまだブロックの内容は実行されていない!
>> l_map.force
0
1
2
3
4
5
=> [0, 2, 4, 6, 8, 10]
# force を呼ぶと実行される


                                                       39
Enumeratorとの違い


Method Chain の使いかたがより強力に
中間データの抑制




                           40
Pitfall of
   Enumerator (1)
map, select のようにブロックの戻り値
を利用するメソッドを複数繋げることがで
きない(しても意味がなくなる)


(0..5).map.select{|i| i % 2 == 0 }
 => [ 0, 2, 4 ]
↑ map の意味がなくなっている


                                     41
True Method Chain
map や select といったメソッドもいくつでも
Method Chain できる。
そう、Lazy ならね。


# 1 から 1000 のうち任意の桁に7を含む数を返す
(1..1000).lazy.map(&:to_s).select{|s|
  /7/ =~ s
}.force


                                        42
Pitfall of
   Enumerator (2)
map, select のようにブロックの戻り値
を利用するメソッドを外部イテレータ化し
ても意味がない
e = (0..5).select
e.next # => 0
e.next # => 1
e.next # => 2
e.next # => 3
↑ select の意味がなくなっている


                           43
True External
         Iterator
map などにブロックを渡せるので
適用した結果を順に取り出せる
l = (0..5).lazy.select{|i| i.even? }
l.next # => 0
l.next # => 2
l.next # => 4
l.next # => StopIteration: iteration reached an end



                                                      44
Efficient Memory
       Usage

Lazy は yield 毎に Method Chain の
最後まで処理される




                                 45
Enumerable version
large_array.map{...}.select{...}




                                   46
Enumerable version
large_array.map{...}.select{...}




      map




                                   47
Enumerable version
large_array.map{...}.select{...}




      map        select




                                   48
Enumerable version
large_array.map{...}.select{...}



        GCされる
      map     select




                                   49
Enumerable version
large_array.map{...}.select{...}



        GCされる
      map     select
      map 結果のため
large_array と同じくらいの
     中間データが必要
                                   50
Lazy version
large_array.lazy.map{...}.select{...}.force




                                              51
Lazy version
large_array.lazy.map{...}.select{...}.force




                                              52
Lazy version
large_array.lazy.map{...}.select{...}.force


           GC ed




                                              53
Lazy version
large_array.lazy.map{...}.select{...}.force




                                              54
Lazy version
large_array.lazy.map{...}.select{...}.force


           GC ed




                                              55
Lazy version
large_array.lazy.map{...}.select{...}.force




                                              56
Lazy version
large_array.lazy.map{...}.select{...}.force




       中間データが不要


                                              57
Lazy Chain Demo
>> (0..4).lazy.select{|i|
   p “select:#{i}”; i.event?
 }.map{|i| p “map:#{i}”; i * 2 }.force
“select:0”
“map:0”
“select:1”
“select:2”
“map:2”
“select:3”
“select:4”
“map:4”
=> [0, 4, 8]

                                         58
Lazy with IO

例) $stdin から空行を読むまでの各行の
文字数の配列を返す
$stdin.lazy.take_while{|l|
  ! l.chomp.empty?
}.map {|l| l.chomp.size }




                             59
Lazy with IO

Enumerable だと空行まで先に読んでしまう。
Lazy なら1行読むたびに take_while/map の
ブロックが実行される
 → 逐次処理できる




                                  60
Lazy List
無限に続く要素を扱える


list = (0..Float::INFINITY)
list.map{|i| i * 2}.take(5)
 => 返ってこない
list.lazy.map{|i| i * 2 }.take(5).force
 => [0, 2, 4, 6, 8]


                                          61
Pitfall of Lazy?
メモ化されない
(force を2回呼ぶともう一度 each が
呼ばれる)
 IOなど副作用のある each だと結果が
 変化するけどいいのかなぁ(いいかも)
enum_for のように each のかわりにな
るメソッドを指定できない



                            62
Lazy as a Better
   Enumerator

     Lazy は
  Enumerator の
    正統進化版


                   63
Happy Lazy
Programming!

               64
One More Thing!


https://github.com/nagachika/lazy_sample




                                           65

Mais conteúdo relacionado

Mais procurados

LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
Takeshi Yamamuro
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
yak1ex
 
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介
MITSUNARI Shigeo
 

Mais procurados (17)

Popcntによるハミング距離計算
Popcntによるハミング距離計算Popcntによるハミング距離計算
Popcntによるハミング距離計算
 
Boost.SIMD
Boost.SIMDBoost.SIMD
Boost.SIMD
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 
boost tour 1.48.0 all
boost tour 1.48.0 allboost tour 1.48.0 all
boost tour 1.48.0 all
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
 
深層学習 Day1レポート
深層学習 Day1レポート深層学習 Day1レポート
深層学習 Day1レポート
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
 
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
constexpr idioms
constexpr idiomsconstexpr idioms
constexpr idioms
 
R-hpc-1 TokyoR#11
R-hpc-1 TokyoR#11R-hpc-1 TokyoR#11
R-hpc-1 TokyoR#11
 
Metaprogramming in JuliaLang
Metaprogramming in JuliaLangMetaprogramming in JuliaLang
Metaprogramming in JuliaLang
 
Emcjp item33,34
Emcjp item33,34Emcjp item33,34
Emcjp item33,34
 
深層学習フレームワークChainerの紹介とFPGAへの期待
深層学習フレームワークChainerの紹介とFPGAへの期待深層学習フレームワークChainerの紹介とFPGAへの期待
深層学習フレームワークChainerの紹介とFPGAへの期待
 
Juliaで並列計算
Juliaで並列計算Juliaで並列計算
Juliaで並列計算
 

Destaque (7)

Ruby Kaja のご提案
Ruby Kaja のご提案Ruby Kaja のご提案
Ruby Kaja のご提案
 
CRuby Committers Who's Who in 2013
CRuby Committers Who's Who in 2013CRuby Committers Who's Who in 2013
CRuby Committers Who's Who in 2013
 
Ruby on azure で game server service
Ruby on azure で game server serviceRuby on azure で game server service
Ruby on azure で game server service
 
Magellan on Google Cloud Platform
Magellan on Google Cloud PlatformMagellan on Google Cloud Platform
Magellan on Google Cloud Platform
 
CRuby_Committers_Whos_Who_in_2014
CRuby_Committers_Whos_Who_in_2014CRuby_Committers_Whos_Who_in_2014
CRuby_Committers_Whos_Who_in_2014
 
BigQuery case study in Groovenauts & Dive into the DataflowJavaSDK
BigQuery case study in Groovenauts & Dive into the DataflowJavaSDKBigQuery case study in Groovenauts & Dive into the DataflowJavaSDK
BigQuery case study in Groovenauts & Dive into the DataflowJavaSDK
 
Functional Music Composition
Functional Music CompositionFunctional Music Composition
Functional Music Composition
 

Semelhante a 怠惰なRubyistへの道

Python で munin plugin を書いてみる
Python で munin plugin を書いてみるPython で munin plugin を書いてみる
Python で munin plugin を書いてみる
ftnk
 
Wavelet matrix implementation
Wavelet matrix implementationWavelet matrix implementation
Wavelet matrix implementation
MITSUNARI Shigeo
 
Or seminar2011final
Or seminar2011finalOr seminar2011final
Or seminar2011final
Mikio Kubo
 
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageKink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
Taku Miyakawa
 
フィボナッチ数列の作り方
フィボナッチ数列の作り方フィボナッチ数列の作り方
フィボナッチ数列の作り方
Tomoya Kawanishi
 

Semelhante a 怠惰なRubyistへの道 (20)

Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
 
Boost tour 1_40_0
Boost tour 1_40_0Boost tour 1_40_0
Boost tour 1_40_0
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
Python で munin plugin を書いてみる
Python で munin plugin を書いてみるPython で munin plugin を書いてみる
Python で munin plugin を書いてみる
 
多次元配列の効率的利用法の検討
多次元配列の効率的利用法の検討多次元配列の効率的利用法の検討
多次元配列の効率的利用法の検討
 
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learning
 
不安定な環境の中でのバッチ処理~JobQueueシステムQudoを使った事例~
不安定な環境の中でのバッチ処理~JobQueueシステムQudoを使った事例~不安定な環境の中でのバッチ処理~JobQueueシステムQudoを使った事例~
不安定な環境の中でのバッチ処理~JobQueueシステムQudoを使った事例~
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
 
Tottoruby 20130119
Tottoruby 20130119Tottoruby 20130119
Tottoruby 20130119
 
Wavelet matrix implementation
Wavelet matrix implementationWavelet matrix implementation
Wavelet matrix implementation
 
Or seminar2011final
Or seminar2011finalOr seminar2011final
Or seminar2011final
 
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageKink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
 
フィボナッチ数列の作り方
フィボナッチ数列の作り方フィボナッチ数列の作り方
フィボナッチ数列の作り方
 
"Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz...
"Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz..."Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz...
"Puzzle-Based Automatic Testing: Bringing Humans into the Loop by Solving Puz...
 
続・ゲンバのSwift
続・ゲンバのSwift続・ゲンバのSwift
続・ゲンバのSwift
 
Chainerチュートリアル -v1.5向け- ViEW2015
Chainerチュートリアル -v1.5向け- ViEW2015Chainerチュートリアル -v1.5向け- ViEW2015
Chainerチュートリアル -v1.5向け- ViEW2015
 
フラグを愛でる
フラグを愛でるフラグを愛でる
フラグを愛でる
 
Rの高速化
Rの高速化Rの高速化
Rの高速化
 
x64 のスカラー,SIMD 演算性能を測ってみた @ C++ MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた @ C++  MIX #10x64 のスカラー,SIMD 演算性能を測ってみた @ C++  MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた @ C++ MIX #10
 
Ruby 2.5
Ruby 2.5Ruby 2.5
Ruby 2.5
 

Mais de nagachika t (6)

Make Ruby Differentiable
Make Ruby DifferentiableMake Ruby Differentiable
Make Ruby Differentiable
 
All bugfixes are incompatibilities
All bugfixes are incompatibilitiesAll bugfixes are incompatibilities
All bugfixes are incompatibilities
 
Inspection of CloudML Hyper Parameter Tuning
Inspection of CloudML Hyper Parameter TuningInspection of CloudML Hyper Parameter Tuning
Inspection of CloudML Hyper Parameter Tuning
 
Ruby trunk changes 統計版
Ruby trunk changes 統計版Ruby trunk changes 統計版
Ruby trunk changes 統計版
 
Pd Kai#3 Startup Process
Pd Kai#3 Startup ProcessPd Kai#3 Startup Process
Pd Kai#3 Startup Process
 
Pd Kai#2 Object Model
Pd Kai#2 Object ModelPd Kai#2 Object Model
Pd Kai#2 Object Model
 

Último

研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
atsushi061452
 

Último (14)

Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
 
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
 
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
 
情報を表現するときのポイント
情報を表現するときのポイント情報を表現するときのポイント
情報を表現するときのポイント
 
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
 
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
 
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
 
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
 
Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )
 
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
 
Keywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltdKeywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltd
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf
 
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
 
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
 

怠惰なRubyistへの道