SlideShare una empresa de Scribd logo
1 de 59
Descargar para leer sin conexión
Rails あるある
現場での悩みとアンチパターン

http://www.nce.co.uk/features/transport/network-rail-changing-track/8622890.article

札幌市中央区Ruby会議01
2014.02.08

Ruby札幌
佐藤 竜之介(Ryunosuke SATO)
提供
From Sapporo, with Love for Ruby.

Ruby札幌
自己紹介
@tricknotes
I am a software developer who
love JavaScript and Ruby.

http://tricknotes.hateblo.jp/
I love OSS
札幌市中央区Ruby会議01
Sapporo.js
http://sapporojs.org/
よろしく
お願いします
Rails あるある
現場での悩みとアンチパターン

http://www.nce.co.uk/features/transport/network-rail-changing-track/8622890.article

札幌市中央区Ruby会議01
2014.02.08

Ruby札幌
佐藤 竜之介(Ryunosuke SATO)
今日の話
Rails には便利で魅力的な機能がたくさんあります
それらを使えば、簡単にアプリケーションを作ること
ができます
しかし、使いどころを間違えると、あとで変更に弱く
なってしまい開発が苦しくなることがあります。

自分が体験した あるある ネタを紹介しつつ、
メンテナンスしやすいアプリケーションについて
考えてみます
すでに Rails をやっているひと、これからやろう
としているひとにとって、快適に開発をするため
のヒントになれば嬉しい

* 状況設定は架空のものです *
対象バージョン

* Ruby 2.0, 2.1
* Rails 3.2, 4.0
あるある集
あるある①

‘

社員レコードは論理削除で...
default_scope
状況

* 社員の勤怠システムを考える
* 社員は退職することができる
* 社員が退職した場合、社員は社員一覧に表示されない
* ただ、社員の勤怠履歴を参照することはできる必要がある
* そのため、社員レコードに対しては論理削除を適用する
* `default_scope` !!
default_scope とは
“デフォルト” の検索条件を指定できる機能
User.where(deleted_at: nil)

class User < ActiveRecord::Base
default_scope lambda {
where(deleted_at: nil)
}
end
User.all
default_scope とは
“デフォルト” の検索条件を指定できる機能

@user.destroy

@user.update_attribute :deleted_at,
DateTime.now

http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Default/ClassMethods.html#method-i-default_scope
Staff

1

n

Attendance
問題

@attendance.staff #=> nil

Staff.unscoped {
@attendance.staff #=> <#Staff>
}

そもそも、”削除” ではないのでは...??
解決1
退会/移動などを state で持っておいて、必要に
応じて scope をかける
class Staff < ActiveRecord::Base
scope :only_tenured, lambda {
where(state: :tenured)
}
end
Staff.all
Staff.only_tenured
解決2

まったく参照しない = 不要なデータ
不要なデータは実際に消してしまう

Staff.destroy
ポイント
*

“default” は “default”

*

ある条件のときに解除したくなるものは
“default” ではない

*

まったく参照しないなら DB に残っている
必要はない
あるある②

‘

ブログ記事にタグをつけたい
serialize
状況

* ブログシステムを考える
* 記事にはタグを登録することができる
* タグは自由入力のテキストで、
ひとつの記事に複数のタグを付けることができる
* すでに多くのテーブルが存在していて、
極力テーブルを増やしたくない
* `serialize` !!
serialize
Ruby のオブジェクトを YAML にシリアライズし
て、データベースのカラムに保存する
class Post < ActiveRecord::Base
serialize :tags
end
@post = Post.new
@post.tags = ['Ruby', 'chuork01']
@post.save
Post.last.tags #=> ['Ruby', 'chuork01']

http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Serialization/ClassMethods.html#method-i-serialize
問題

特定のタグをもっている記事だけを取得したい
タグ毎に記事を一覧したいときに不便
YAML なので、 SQL で検索できない
Post.where(tags: 'LIKE %Ruby%')

Text 型なので Like 検索はできるけど...
解決1
タグを別のテーブルに分ける

Post

1 n

Tagging

n

1

Tag
解決1
タグを別のテーブルに分ける
class Post < ActiveRecord::Base
has_many :taggings
has_many :tags, through: :taggings
end
class Tagging < ActiveRecord::Base
belongs_to :post
belongs_to :tag
end
class Tag < ActiveRecord::Base
has_many :taggings
has_many :posts, through: :taggings
end
@tag.posts
解決2
配列型を利用する
(データベースがサポートしていれば)
PostgreSQL の例
class AddTagsToPosts < ActiveRecord::Migration
def change
add_column :posts, :tags, :array
end
end
Post.where("'Ruby' = ANY (tags)")
ポイント

*

Ruby の世界でしか扱えないデータは扱いづらい

*

適切なデータモデルを選択しましょう
あるある③

‘

一時保存のときは入力チェック
をしたくない
save(validate: false)
状況

* 会員登録できるサービスを考える
* Email だけあれば仮登録できるが、
本登録では名前などその他の情報が必要
* ひとまずレコードだけ作りたい
* `save(validate: false)`
save(validate: false)

validation をスキップして保存することができる

http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-save
問題
*

不完全な状態のデータが保存される

*

一部の validation だけ実行するのが困難

*

データベースに制約をかけられなくなる
解決1
* 状況に応じた validation を行なう
class Staff < ActiveRecord::Base
validates :name, presence: {
on: :registration
}
end
@staff.save(context: :registration)
解決2
* “仮登録”/”本登録” 状態を持たせて validation
class Staff < ActiveRecord::Base
validates :name, presence: {
if: :registration?
}
def registration?
state == 'registration'
end
end
@staff.state = 'registration'
@staff.save
ポイント

*

データを保存するために、
チェックが必須な項目をスキップしてしまう

*

不完全なデータが登録されてしまう
あるある④

‘

他のシステムと連携するための
JSON の API を提供したい
as_json
状況

* 人事評価システムを考える
* 社員の評価を他システムに対しても提供する
* 連携のためのデータを JSON で出力する
* `as_json`
as_json
モデルを JSON へに変換した場合のデータフォ
ーマットを定義する
Rails が as_json を呼び出して JSON に出力して
くれる

http://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html#method-i-as_json
as_json
class User < AvtiveRecord::Base
def as_json
{
id: id,
name: name,
evaluations: evaluations.as_json
}
end
end
class UsersController < ApplicationController
def index
@users = User.all
end
end
as_json

GET /users.json
[{

}]

“id”:
1,
“name”: “tricknotes”,
“evaluations”: [{
...
}, {
...
}]

http://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html#method-i-as_json
問題
データの表示/非表示の扱いが難しい
*

ログインしていると見える情報

*

本人だけ見える情報

*

権限によって見える情報

*

一覧だと不要で、詳細画面だと必要な情報

例: 部長は部下の評価を閲覧できるが、部員は
本人の評価のみを閲覧できる
問題

current_user を参照したくなるので、
Model#as_json だと扱いが難しい
context に依存する変換はモデルの仕事ではな
い
JSON とはデータの表現形式
-> View 層の仕事
問題

その他のデータ形式をサポートしたくなった場合、
似たようなメソッドが並ぶ
as_csv
* as_json
...
*
解決
View として JSON を出力する
jbuilder
* app/views/users/index.json.jbuilder

json.array!(@users) do |user|
json.extract! user,
:id,
:name,
:evaluations
end
ポイント

*

Context によって変化するロジックを
モデルに持たせない

*

データの表示形式はモデルに含めない
他にもまだまだ...
*
*
*
*
*
*

STI
session にオブジェクトを保存
最終更新日 = updated_at
monkey patch
before/after callback
gem の version 固定
...
for more information...
もっと複雑な現実問題に対応するためのヒント
Rails AntiPatterns
http://www.amazon.co.jp/dp/0321604814
Ruby on Rails: The Bad Parts
http://magazine.rubyist.net/?0041-RailsTheBadParts
まとめ
最初から完璧な設計をするのは困難

アカンと思ったら引き返す/直す勇気を!
機能自体が悪かというとそうでもなくて、
使いドコロを間違うと辛い、という話
Rails の機能自体を理解すること、
作るものを理解することが大事!!
パッと見て便利そうな機能でも、
その機能の意味と、
ドメインを考えて組み立てるの大事!!

状況によって適切な選択かどうかは変わってくる
Rails の機能自体への理解
対象領域への理解
作ってわかることもある
変更する勇気
http://www.flickr.com/photos/sakura-kame/479871795/

一歩、一歩

Más contenido relacionado

La actualidad más candente

大規模グラフデータ処理
大規模グラフデータ処理大規模グラフデータ処理
大規模グラフデータ処理
maruyama097
 

La actualidad más candente (20)

Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
フロー効率性とリソース効率性、再入門 #devlove #devkan
フロー効率性とリソース効率性、再入門 #devlove #devkanフロー効率性とリソース効率性、再入門 #devlove #devkan
フロー効率性とリソース効率性、再入門 #devlove #devkan
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
SQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリーSQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリー
 
オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選
 
HashiCorpのNomadを使ったコンテナのスケジューリング手法
HashiCorpのNomadを使ったコンテナのスケジューリング手法HashiCorpのNomadを使ったコンテナのスケジューリング手法
HashiCorpのNomadを使ったコンテナのスケジューリング手法
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
ruby-ffiについてざっくり解説
ruby-ffiについてざっくり解説ruby-ffiについてざっくり解説
ruby-ffiについてざっくり解説
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜
 
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajpAt least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
 
Elasticsearchを使うときの注意点 公開用スライド
Elasticsearchを使うときの注意点 公開用スライドElasticsearchを使うときの注意点 公開用スライド
Elasticsearchを使うときの注意点 公開用スライド
 
WayOfNoTrouble.pptx
WayOfNoTrouble.pptxWayOfNoTrouble.pptx
WayOfNoTrouble.pptx
 
大規模グラフデータ処理
大規模グラフデータ処理大規模グラフデータ処理
大規模グラフデータ処理
 
診断ツールの使い方(Owasp zapの場合)
診断ツールの使い方(Owasp zapの場合)診断ツールの使い方(Owasp zapの場合)
診断ツールの使い方(Owasp zapの場合)
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しようCognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しよう
 
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
 

Destacado

Destacado (12)

gem の探し方
gem の探し方gem の探し方
gem の探し方
 
プレゼンの基本
プレゼンの基本プレゼンの基本
プレゼンの基本
 
伝わるプレゼンをする方法
伝わるプレゼンをする方法伝わるプレゼンをする方法
伝わるプレゼンをする方法
 
プレゼンテーションの考え方20140628
プレゼンテーションの考え方20140628プレゼンテーションの考え方20140628
プレゼンテーションの考え方20140628
 
綺麗なプレゼン資料の作り方、10のテクニック
綺麗なプレゼン資料の作り方、10のテクニック綺麗なプレゼン資料の作り方、10のテクニック
綺麗なプレゼン資料の作り方、10のテクニック
 
良いプレゼン 良いスライド
良いプレゼン 良いスライド良いプレゼン 良いスライド
良いプレゼン 良いスライド
 
魅せるPowerPointビジネスプレゼン【実践編】 
魅せるPowerPointビジネスプレゼン【実践編】 魅せるPowerPointビジネスプレゼン【実践編】 
魅せるPowerPointビジネスプレゼン【実践編】 
 
素敵なプレゼン資料を作るためのKnow-Howてんこ盛りセッション:プレゼン道場 Ver 2.2
素敵なプレゼン資料を作るためのKnow-Howてんこ盛りセッション:プレゼン道場 Ver 2.2素敵なプレゼン資料を作るためのKnow-Howてんこ盛りセッション:プレゼン道場 Ver 2.2
素敵なプレゼン資料を作るためのKnow-Howてんこ盛りセッション:プレゼン道場 Ver 2.2
 
しょぼいプレゼンをパワポのせいにするな! by @jessedee
しょぼいプレゼンをパワポのせいにするな! by @jessedeeしょぼいプレゼンをパワポのせいにするな! by @jessedee
しょぼいプレゼンをパワポのせいにするな! by @jessedee
 
ビジネスマン必見!キレイな提案書を作るためのデザインの基礎知識
ビジネスマン必見!キレイな提案書を作るためのデザインの基礎知識ビジネスマン必見!キレイな提案書を作るためのデザインの基礎知識
ビジネスマン必見!キレイな提案書を作るためのデザインの基礎知識
 
色彩センスのいらない配色講座
色彩センスのいらない配色講座色彩センスのいらない配色講座
色彩センスのいらない配色講座
 
見やすいプレゼン資料の作り方 - リニューアル増量版
見やすいプレゼン資料の作り方 - リニューアル増量版見やすいプレゼン資料の作り方 - リニューアル増量版
見やすいプレゼン資料の作り方 - リニューアル増量版
 

Similar a Rails あるある

Ruby札幌2008年の活動に向けて
Ruby札幌2008年の活動に向けてRuby札幌2008年の活動に向けて
Ruby札幌2008年の活動に向けて
Koji SHIMADA
 
Ruby on Railsではじめるrspecテスト
Ruby on RailsではじめるrspecテストRuby on Railsではじめるrspecテスト
Ruby on Railsではじめるrspecテスト
Kanako Kobayashi
 
20081220 Rubybonenkai2008 Sapporo
20081220 Rubybonenkai2008 Sapporo20081220 Rubybonenkai2008 Sapporo
20081220 Rubybonenkai2008 Sapporo
Koji SHIMADA
 
How to relaunch "sapporojs.org" ~Introduction to middleman~
How to relaunch "sapporojs.org" ~Introduction to middleman~How to relaunch "sapporojs.org" ~Introduction to middleman~
How to relaunch "sapporojs.org" ~Introduction to middleman~
Ryunosuke SATO
 

Similar a Rails あるある (20)

Ruby札幌2008年の活動に向けて
Ruby札幌2008年の活動に向けてRuby札幌2008年の活動に向けて
Ruby札幌2008年の活動に向けて
 
すこやかRails
すこやかRailsすこやかRails
すこやかRails
 
Long Life RailsApp in the case of REJOB
Long Life RailsApp in the case of REJOBLong Life RailsApp in the case of REJOB
Long Life RailsApp in the case of REJOB
 
Gemの話 紹介編
Gemの話 紹介編Gemの話 紹介編
Gemの話 紹介編
 
RubyKaja 2013
RubyKaja 2013RubyKaja 2013
RubyKaja 2013
 
Ruby on Railsではじめるrspecテスト
Ruby on RailsではじめるrspecテストRuby on Railsではじめるrspecテスト
Ruby on Railsではじめるrspecテスト
 
Sinatra軽量Web開発 - LOUPE Study #1
Sinatra軽量Web開発 - LOUPE Study #1Sinatra軽量Web開発 - LOUPE Study #1
Sinatra軽量Web開発 - LOUPE Study #1
 
Railsのフロントエンド開発を考える
Railsのフロントエンド開発を考えるRailsのフロントエンド開発を考える
Railsのフロントエンド開発を考える
 
Sinatraで鼻歌まじりのWeb開発
Sinatraで鼻歌まじりのWeb開発Sinatraで鼻歌まじりのWeb開発
Sinatraで鼻歌まじりのWeb開発
 
Ruby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてRuby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構について
 
Application Bootstrap
Application BootstrapApplication Bootstrap
Application Bootstrap
 
Railsチュートリアル(second)を終えて
Railsチュートリアル(second)を終えてRailsチュートリアル(second)を終えて
Railsチュートリアル(second)を終えて
 
20081220 Rubybonenkai2008 Sapporo
20081220 Rubybonenkai2008 Sapporo20081220 Rubybonenkai2008 Sapporo
20081220 Rubybonenkai2008 Sapporo
 
Ruby and I at 神奈川Ruby会議01
Ruby and I at 神奈川Ruby会議01Ruby and I at 神奈川Ruby会議01
Ruby and I at 神奈川Ruby会議01
 
Railsの今昔
Railsの今昔Railsの今昔
Railsの今昔
 
地域Ruby会議に参加してきた話とか
地域Ruby会議に参加してきた話とか地域Ruby会議に参加してきた話とか
地域Ruby会議に参加してきた話とか
 
How to relaunch "sapporojs.org" ~Introduction to middleman~
How to relaunch "sapporojs.org" ~Introduction to middleman~How to relaunch "sapporojs.org" ~Introduction to middleman~
How to relaunch "sapporojs.org" ~Introduction to middleman~
 
RubyとRailsのおいしい使い方
RubyとRailsのおいしい使い方RubyとRailsのおいしい使い方
RubyとRailsのおいしい使い方
 
Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発
 
Svgアニメーションを実装してみよう 20150207
Svgアニメーションを実装してみよう 20150207Svgアニメーションを実装してみよう 20150207
Svgアニメーションを実装してみよう 20150207
 

Más de Ryunosuke SATO

Más de Ryunosuke SATO (16)

片手間JS on Rails
片手間JS on Rails片手間JS on Rails
片手間JS on Rails
 
Ember コミュニティとわたし
Ember コミュニティとわたしEmber コミュニティとわたし
Ember コミュニティとわたし
 
Node.js を選ぶとき 選ばないとき
Node.js を選ぶとき 選ばないときNode.js を選ぶとき 選ばないとき
Node.js を選ぶとき 選ばないとき
 
もっとはじめる Ember.js !! ~ Getting started with Ember.js more ~
もっとはじめる Ember.js !! ~ Getting started with Ember.js more ~もっとはじめる Ember.js !! ~ Getting started with Ember.js more ~
もっとはじめる Ember.js !! ~ Getting started with Ember.js more ~
 
はじめる Ember.js!! ~ Getting started with ember.js ~
はじめる Ember.js!! ~ Getting started with ember.js ~はじめる Ember.js!! ~ Getting started with ember.js ~
はじめる Ember.js!! ~ Getting started with ember.js ~
 
Introduction for Browser Side MVC
Introduction for Browser Side MVCIntroduction for Browser Side MVC
Introduction for Browser Side MVC
 
コミュニティのある風景
コミュニティのある風景コミュニティのある風景
コミュニティのある風景
 
capybara で快適なテスト生活を
capybara で快適なテスト生活をcapybara で快適なテスト生活を
capybara で快適なテスト生活を
 
Testable JavaScript
Testable JavaScriptTestable JavaScript
Testable JavaScript
 
Social coding をもっと楽しみたいあなたへ
Social coding をもっと楽しみたいあなたへSocial coding をもっと楽しみたいあなたへ
Social coding をもっと楽しみたいあなたへ
 
Clean Javascript
Clean JavascriptClean Javascript
Clean Javascript
 
Node.jsってどうなの?
Node.jsってどうなの?Node.jsってどうなの?
Node.jsってどうなの?
 
アジャイル的アプローチから見えてきたこと
アジャイル的アプローチから見えてきたことアジャイル的アプローチから見えてきたこと
アジャイル的アプローチから見えてきたこと
 
脱レガシー化計画
脱レガシー化計画脱レガシー化計画
脱レガシー化計画
 
Pusherとcanvasで作るリアルタイムグラフ
Pusherとcanvasで作るリアルタイムグラフPusherとcanvasで作るリアルタイムグラフ
Pusherとcanvasで作るリアルタイムグラフ
 
ServerSideJavaScript
ServerSideJavaScriptServerSideJavaScript
ServerSideJavaScript
 

Último

Último (10)

Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 

Rails あるある