SlideShare a Scribd company logo
How to make gem
ライブラリの作り方
最初に必要なもの
 Ruby
$ ruby -v
ruby 2.0.0p353 (2013-11-22 revision 43784) [x86_64-darwin13.0.0]

 gem (Ruby標準添付)
$ gem -v
2.1.11

 bundler
$ gem install bundler
$ bundle –v
Bundler version 1.5.2

 Git
$ git –-version
git version 1.8.3.4 (Apple Git-47)
Gemの主要ファイル構成
Path

Description

bin

実行可能ファイル配置パス
ここに配置されたファイルが実行ファイルとして配置される

lib

このディレクトリが$(Rubyライブラリの探索パス)に追加される
sample
(ライブラリ名)

sample.rb
spec

lib/sample.rbからrequireするファイル群を配置

require “sample”でロードされるファイル

version.rb

バージョンを記載するファイル

テスト用のを格納するディレクトリ(RSpecの場合)
spec_helper.rb

Rspecの共通設定を定義するファイル

Gemfile

bundlerで依存解決を解決する為の設定ファイル

Rakefile

rakeタスクの定義ファイル

sample.gemspec

ライブラリのメタデータや設定を定義するファイル
ひな形の作成
以下のコマンドでライブラリのひな形を作成
$ bundle gem sample
create sample/Gemfile
create sample/Rakefile
create sample/LICENSE.txt
create sample/README.md
create sample/.gitignore
create sample/sample.gemspec
create sample/lib/sample.rb
create sample/lib/sample/version.rb
gemspecの編集1
ライブラリのメタデータを入力する。(以下はsample.gemspecの一部)
Gem::Specification.new do |spec|
spec.name
= "sample"
spec.version
= Sample::VERSION
spec.authors
= ["i2bskn"]
spec.email
= ["i2bskn@gmail.com"]
spec.summary
= %q{Sample library}
spec.description = %q{Gem for first time.}
spec.homepage
= "https://github.com/i2bskn/sample"
spec.license
= "MIT”
# snip
end
gemspecの編集2
ライブラリの設定を入力する。(以下はsample.gemspecの一部)
今回は変更しない。
Gem::Specification.new do |spec|
# snip
spec.files
= `git ls-files -z`.split("x0")
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
spec.require_paths = ["lib"]
# snip
end





files : 全てのファイルの配列。
executables : 実行ファイル名の配列。bin以外の場所に配置する場合は変更。
test_files : テスト用ファイルの配列。test,spec,features以外に配置する場合は変更
require_paths : $:(Rubyのライブラリ探索パス)に追加するディレクトリ。
gemspecの編集3
ライブラリの依存関係にRSpecを追加する。(以下はsample.gemspecの一部)
RSpec以外も必要な場合は適宜追加する。
Gem::Specification.new do |spec|
# snip
spec.add_development_dependency "bundler", "~> 1.3"
spec.add_development_dependency "rake"
spec.add_development_dependency "rspec"
end

 add_dependency “ライブラリ名” : 実行時に必要な依存関係の定義。
 add_development_dependency “ライブラリ名” : 開発時に必要な依存関係の定義。
依存ライブラリのインストール
ライブラリのルートディレクトリに移動して以下のコマンドを実行する。
$ bundle install --path .bundle





.bundleというディレクトリが作成される。
.bundle/configはbundleの設定ファイルで2回目以降はオプションの指定が不要。
.bundle/rubyに依存関係のライブラリがインストールされる。
.bundle/rubyにインストールされたライブラリは他のシステムに影響を与えない。

.bundle/rubyにインストールされたライブラリのコマンドはbundle execを付け
る事で実行する事が可能。(rspecは例)
$ bundle exec rspec
テストコードの作成1
テスト用ディレクトリとspec_helper.rbの作成
$ mkdir -p spec/sample
$ touch spec/spec_helper.rb

spec_helper.rbのコードを記述する。
require “sample”
RSpec.configure do |config|
config.order “random”
end
テストコードの作成2
テストコードの作成
$ touch spec/sample/foo_spec.rb

ここではRSpecの解説は省きます。
require "sample"

describe Sample::Foo do
describe "#greet" do
it "returns greeting message" do
expect(Sample::Foo.new.greet).to eq("Hello World")
end
end
end
Rakefileの編集
Rakefileにテストを実行するタスクを定義してデフォルトタスクにする。
require "bundler/gem_tasks"
require "rspec/core/rake_task"
desc "Run all specs"
RSpec::Core::RakeTask.new(:spec) do |t|
t.rspec_opts = ["-c", "-fs"]
end
task :default => :spec
テストの実行
テストを実行してみる。
$ bundle exec rake spec
/path/to/ruby -S rspec ./spec/sample/foo_spec.rb -c –fs
/path/to/sample/spec/sample/foo_spec.rb:3:in `<top (required)>': uninitialized constant
Sample::Foo (NameError)

Sample::Fooクラスが定義されていない為、NameErrorがthrowされる。
rakeタスクでなくrspecコマンドでも実行可能。
$ bundle exec rspec
/Users/iiboshiken/work/sample/spec/sample/foo_spec.rb:3:in `<top (required)>':
uninitialized constant Sample::Foo (NameError)
ライブラリの実装
Sample::Fooクラスの作成。
$ touch lib/sample/foo.rb
module Sample
class Foo
def greet
"Hello World"
end
end
end

Sample::Fooクラスをsample.rbからrequireする。(以下はlib/sample.rb)
require "sample/version"
require "sample/foo"
テストの再実行
テストを再度実行する。
$ bundle exec rake spec
/path/to/ruby -S rspec ./spec/sample/foo_spec.rb -c -fs
Sample::Foo
#greet
returns greeting message
Finished in 0.00252 seconds
1 example, 0 failures

「1 example, 0 failures」なのでテスト成功。
実行ファイルの追加
binディレクトリとコマンドの作成
$ mkdir bin
$ touch bin/sample
$ chmod 755 bin/sample

コマンドを実装。
#!/usr/bin/env ruby
require "sample"
puts Sample::Foo.new.greet

今回は実行ファイルのテストは書かないが、実際はテストした方が良い。
Commitとビルド
ひと通り実装したのでコミットしておく。
リモートリポジトリが無い場合はpushしなくてもよい。
$ git add --all
$ git commit -m “first commit”
$ git push -u origin master

ビルドしてインストールする。
$ bundle exec rake build
$ bundle exec rake install

グローバルにインストールする場合はgemコマンドを使う。
$ bundle exec rake build
$ cd pkg
$ gem install -l sample
コマンドの実行
 インストールしていない場合
$ ruby -I lib bin/sample
Hello World

 rake installした場合
$ bundle exec sample
Hello World

 gem install -l sampleした場合
$ sample
Hello World
Fin

More Related Content

What's hot

PostgreSQL共有バッファと関連ツール
PostgreSQL共有バッファと関連ツールPostgreSQL共有バッファと関連ツール
PostgreSQL共有バッファと関連ツール
Masahiko Sawada
 
R以外の研究ツール
R以外の研究ツールR以外の研究ツール
R以外の研究ツール弘毅 露崎
 
データベースのお話
データベースのお話データベースのお話
データベースのお話
Hidekazu Tanaka
 
Capistrano
CapistranoCapistrano
Capistrano
Yasuharu Fukuda
 
オープンソースでシステム監視!Zabbix 1.8の機能と簡単インストール手順の紹介
オープンソースでシステム監視!Zabbix 1.8の機能と簡単インストール手順の紹介オープンソースでシステム監視!Zabbix 1.8の機能と簡単インストール手順の紹介
オープンソースでシステム監視!Zabbix 1.8の機能と簡単インストール手順の紹介
Kodai Terashima
 
Cakephp勉強会@tokyo #4
Cakephp勉強会@tokyo #4Cakephp勉強会@tokyo #4
Cakephp勉強会@tokyo #4
ichikaway
 
OSC東京2013/Spring_JPUG資料
OSC東京2013/Spring_JPUG資料OSC東京2013/Spring_JPUG資料
OSC東京2013/Spring_JPUG資料
Chika SATO
 
Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅-
Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅- Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅-
Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅-
Daisuke Ikeda
 
Openstack+Ceph設定ガイド
Openstack+Ceph設定ガイドOpenstack+Ceph設定ガイド
Openstack+Ceph設定ガイド
OSSラボ株式会社
 
WDD2012_SC-004
WDD2012_SC-004WDD2012_SC-004
WDD2012_SC-004
Kuninobu SaSaki
 
ぼくの考えた最強のpipeline構成
ぼくの考えた最強のpipeline構成ぼくの考えた最強のpipeline構成
ぼくの考えた最強のpipeline構成
Naoto Nishizono
 
Cephのベンチマークをしました
CephのベンチマークをしましたCephのベンチマークをしました
Cephのベンチマークをしました
OSSラボ株式会社
 
Fabricでサーバー管理をDRYにしよう
Fabricでサーバー管理をDRYにしようFabricでサーバー管理をDRYにしよう
Fabricでサーバー管理をDRYにしよう
max747
 
New configurationoferogamescaperev3
New configurationoferogamescaperev3New configurationoferogamescaperev3
New configurationoferogamescaperev3
hiroin0
 
serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?Sho Hashimoto
 
lilo.linux.or.jp の話 (2017年8月)
lilo.linux.or.jp の話 (2017年8月)lilo.linux.or.jp の話 (2017年8月)
lilo.linux.or.jp の話 (2017年8月)
Kazuhiro Nishiyama
 
2日間Fabricを触った俺が
 色々解説してみる
2日間Fabricを触った俺が
 色々解説してみる2日間Fabricを触った俺が
 色々解説してみる
2日間Fabricを触った俺が
 色々解説してみる
airtoxin Ishii
 
core.async+transducers Shibuya.lisp #21
core.async+transducers Shibuya.lisp #21core.async+transducers Shibuya.lisp #21
core.async+transducers Shibuya.lisp #21
Kei Tsuji
 

What's hot (20)

PostgreSQL共有バッファと関連ツール
PostgreSQL共有バッファと関連ツールPostgreSQL共有バッファと関連ツール
PostgreSQL共有バッファと関連ツール
 
R以外の研究ツール
R以外の研究ツールR以外の研究ツール
R以外の研究ツール
 
データベースのお話
データベースのお話データベースのお話
データベースのお話
 
Capistrano
CapistranoCapistrano
Capistrano
 
オープンソースでシステム監視!Zabbix 1.8の機能と簡単インストール手順の紹介
オープンソースでシステム監視!Zabbix 1.8の機能と簡単インストール手順の紹介オープンソースでシステム監視!Zabbix 1.8の機能と簡単インストール手順の紹介
オープンソースでシステム監視!Zabbix 1.8の機能と簡単インストール手順の紹介
 
Cakephp勉強会@tokyo #4
Cakephp勉強会@tokyo #4Cakephp勉強会@tokyo #4
Cakephp勉強会@tokyo #4
 
OSC東京2013/Spring_JPUG資料
OSC東京2013/Spring_JPUG資料OSC東京2013/Spring_JPUG資料
OSC東京2013/Spring_JPUG資料
 
Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅-
Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅- Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅-
Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅-
 
Openstack+Ceph設定ガイド
Openstack+Ceph設定ガイドOpenstack+Ceph設定ガイド
Openstack+Ceph設定ガイド
 
Version管理 1
Version管理 1Version管理 1
Version管理 1
 
WDD2012_SC-004
WDD2012_SC-004WDD2012_SC-004
WDD2012_SC-004
 
ぼくの考えた最強のpipeline構成
ぼくの考えた最強のpipeline構成ぼくの考えた最強のpipeline構成
ぼくの考えた最強のpipeline構成
 
Cephのベンチマークをしました
CephのベンチマークをしましたCephのベンチマークをしました
Cephのベンチマークをしました
 
Fabricでサーバー管理をDRYにしよう
Fabricでサーバー管理をDRYにしようFabricでサーバー管理をDRYにしよう
Fabricでサーバー管理をDRYにしよう
 
New configurationoferogamescaperev3
New configurationoferogamescaperev3New configurationoferogamescaperev3
New configurationoferogamescaperev3
 
serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?
 
lilo.linux.or.jp の話 (2017年8月)
lilo.linux.or.jp の話 (2017年8月)lilo.linux.or.jp の話 (2017年8月)
lilo.linux.or.jp の話 (2017年8月)
 
2日間Fabricを触った俺が
 色々解説してみる
2日間Fabricを触った俺が
 色々解説してみる2日間Fabricを触った俺が
 色々解説してみる
2日間Fabricを触った俺が
 色々解説してみる
 
Hadoop on LXC
Hadoop on LXCHadoop on LXC
Hadoop on LXC
 
core.async+transducers Shibuya.lisp #21
core.async+transducers Shibuya.lisp #21core.async+transducers Shibuya.lisp #21
core.async+transducers Shibuya.lisp #21
 

Similar to How to make gem

Bundler kanazawa.rb meetup #2 2012/09/19
Bundler kanazawa.rb meetup #2 2012/09/19Bundler kanazawa.rb meetup #2 2012/09/19
Bundler kanazawa.rb meetup #2 2012/09/19
Hitoshi Kurokawa
 
Ruby In Wheezy
Ruby In WheezyRuby In Wheezy
Ruby In Wheezy
Youhei SASAKI
 
コード読経会報告書
コード読経会報告書コード読経会報告書
コード読経会報告書Masahiko Toyoshi
 
Debian パッケージングチュートリアル
Debian パッケージングチュートリアルDebian パッケージングチュートリアル
Debian パッケージングチュートリアル
Nozomu KURASAWA
 
Mac_Terminal_ver1.0
Mac_Terminal_ver1.0Mac_Terminal_ver1.0
Mac_Terminal_ver1.0
Satoshi Kume
 
Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd edition
Goh Matsumoto
 
Ruby in Wheezy @ 関西闇Ruby
Ruby in Wheezy @ 関西闇RubyRuby in Wheezy @ 関西闇Ruby
Ruby in Wheezy @ 関西闇Ruby
Youhei SASAKI
 
(工事中) Git の仕組み
(工事中) Git の仕組み(工事中) Git の仕組み
(工事中) Git の仕組みTeloo
 
Java 7
Java 7Java 7
LinAction Theme LPICの問題を解いてみる~インストールとパッケージ管理編~
LinAction Theme LPICの問題を解いてみる~インストールとパッケージ管理編~LinAction Theme LPICの問題を解いてみる~インストールとパッケージ管理編~
LinAction Theme LPICの問題を解いてみる~インストールとパッケージ管理編~
cyberblack28 Ichikawa
 
Rails解説セミナー: リリースノート解説編
Rails解説セミナー: リリースノート解説編Rails解説セミナー: リリースノート解説編
Rails解説セミナー: リリースノート解説編
Yohei Yasukawa
 
Management of Gems using Bundler.
Management of Gems using Bundler.Management of Gems using Bundler.
Management of Gems using Bundler.
Tamotsu Furuya
 
はじめてのRuby拡張ライブラリ
はじめてのRuby拡張ライブラリはじめてのRuby拡張ライブラリ
はじめてのRuby拡張ライブラリMasahiro Tomita
 
20130328 第03回福岡debian勉強会 debianパッケージ情報と依存関係の可視化
20130328 第03回福岡debian勉強会   debianパッケージ情報と依存関係の可視化20130328 第03回福岡debian勉強会   debianパッケージ情報と依存関係の可視化
20130328 第03回福岡debian勉強会 debianパッケージ情報と依存関係の可視化Tsuyoshi Yamada
 
Git 実践入門
Git 実践入門Git 実践入門
Git 実践入門
Yasutaka Kanzaki
 

Similar to How to make gem (16)

Bundler kanazawa.rb meetup #2 2012/09/19
Bundler kanazawa.rb meetup #2 2012/09/19Bundler kanazawa.rb meetup #2 2012/09/19
Bundler kanazawa.rb meetup #2 2012/09/19
 
Ruby In Wheezy
Ruby In WheezyRuby In Wheezy
Ruby In Wheezy
 
コード読経会報告書
コード読経会報告書コード読経会報告書
コード読経会報告書
 
Debian パッケージングチュートリアル
Debian パッケージングチュートリアルDebian パッケージングチュートリアル
Debian パッケージングチュートリアル
 
Mac_Terminal_ver1.0
Mac_Terminal_ver1.0Mac_Terminal_ver1.0
Mac_Terminal_ver1.0
 
Git (実践入門編)
Git (実践入門編)Git (実践入門編)
Git (実践入門編)
 
Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd edition
 
Ruby in Wheezy @ 関西闇Ruby
Ruby in Wheezy @ 関西闇RubyRuby in Wheezy @ 関西闇Ruby
Ruby in Wheezy @ 関西闇Ruby
 
(工事中) Git の仕組み
(工事中) Git の仕組み(工事中) Git の仕組み
(工事中) Git の仕組み
 
Java 7
Java 7Java 7
Java 7
 
LinAction Theme LPICの問題を解いてみる~インストールとパッケージ管理編~
LinAction Theme LPICの問題を解いてみる~インストールとパッケージ管理編~LinAction Theme LPICの問題を解いてみる~インストールとパッケージ管理編~
LinAction Theme LPICの問題を解いてみる~インストールとパッケージ管理編~
 
Rails解説セミナー: リリースノート解説編
Rails解説セミナー: リリースノート解説編Rails解説セミナー: リリースノート解説編
Rails解説セミナー: リリースノート解説編
 
Management of Gems using Bundler.
Management of Gems using Bundler.Management of Gems using Bundler.
Management of Gems using Bundler.
 
はじめてのRuby拡張ライブラリ
はじめてのRuby拡張ライブラリはじめてのRuby拡張ライブラリ
はじめてのRuby拡張ライブラリ
 
20130328 第03回福岡debian勉強会 debianパッケージ情報と依存関係の可視化
20130328 第03回福岡debian勉強会   debianパッケージ情報と依存関係の可視化20130328 第03回福岡debian勉強会   debianパッケージ情報と依存関係の可視化
20130328 第03回福岡debian勉強会 debianパッケージ情報と依存関係の可視化
 
Git 実践入門
Git 実践入門Git 実践入門
Git 実践入門
 

Recently uploaded

ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMMハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
osamut
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
Toru Tamaki
 
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
Osaka University
 
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobodyロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
azuma satoshi
 
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
嶋 是一 (Yoshikazu SHIMA)
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
harmonylab
 
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライドHumanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
tazaki1
 

Recently uploaded (7)

ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMMハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
 
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
 
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobodyロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
 
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
 
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライドHumanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
 

How to make gem