SlideShare una empresa de Scribd logo
1 de 41
Descargar para leer sin conexión
Rails Plug-in Flextures の使い方
ところで
Rails でテストデータ取り込むアレ
fixtures って " クソ " ですよね♪
実例その1:案件 A
Test::Unit 使用
データ fixture 作成
データは csv で作成


開発は順調に進行していたが…
さーて、基本機能できたし
そろそろ同値クラステストや境界値テストの
     フェーズに移りますか
      ( リリース1ヶ月前 )
Fixture の欠点 1
1 テーブルにつき1ファイルしか用意できない
同値クラステストや境界値テスト仕様とする
 頃には、依存関係の塊でそれどころではない
さらに開発は進むが…
えっ?、登録から3日以内のユーザーには
    1日1回アイテム付与?
Fixture の欠点 2
基本的にデータが静的
日時チェックのテストあたりはテストするな
 と言われているようなもの…
(YAML は erb 使えるのである程度回避できますけどね)
案件 B
RSpec でテスト
Fixture はマスターデータは CSV それ以外は
  yaml
Fixture の欠点
YAML で作れば erb が使えるけど活躍できる舞
 台はなかった
関連を生成してくれる機能があるけど、特に
 書きやすいものでもない ( 書式が面倒 )
総論としては大体の場合は csv の方が便利
案件 C
Rspec
FactoryGirl
これで全ての問題は解決したかに見えたが…
現実 : 開発の遅延
開発初期には1日に2,3回は migration が走
  る
migration するたびに、作った Factory がしば
  しば止まる
データの不整合が起こるたびに factories.rb を
  修正
テストできない状況では作業できないの
  で、”待ち”が発生する
FactoryGirl の欠点
データ1件の生成、修正コストは yaml 以上に
 高い
テーブルの構成が変わった時のコストも高い
実は hatbm のテーブルって全テーブルの 1 割と
 かで旨みが少ない
という感じの募り募った”恨”が今回の
     gem 作成のきっかけ
総論
どの方法をとってもテーブルの migration がか
  かったあとのデータの修正コストがすごい
( 初期開発ではテーブルの構成変更がよくある
  のでこれは痛い )
柔軟な方法ほど記法が致命的に長くなって途
  中でわけがわからなくなる…
( そしてだんだんデータの維持管理ができなく
  なる )
解決策
データの一覧性、編集しやすさは csv は一番高
 い
動的性質に関しては FactoryGirl が群を抜いて
 いる
両方の機能のイイトコ取りをしつつ、これま
 での問題の解決法を組み込んで行けばいいは
 ず…
機能その 1
データのお手軽ダンプ


rake db:flextures:dump
rake db:flextutes:load


実は csv をお手軽ダンプできるものは無かった
 (YAML はある )
機能その2
カラムの変更点を検知して値を自動補完する
1つか2つカラムが増減しても、よく変わる
 部分のカラムは設計上重要では無いのでエ
 ラーが出ても開発を完全停止させないほうが
 いい
RSpec で使用可能
同じ書式で使える
fixtures :users
flextures :users
読み込むファイルを切り替え可能
flextures :users => "login_test/users"
FaftoryFilter
FactoryGirl 風の書式でデータを動的に変更可
  能

  Flextures::Factory.define :users do |f|
   f.last_login_date = Time.now
  end
( 実は ActiveRecord のモデルをもらっているの
   で、 AcitiveRecord で可能は事はここででき
   る)
Case1: テストデータの生成
      ( 実演含 )
想定させる使い方
ソーシャルゲームを仮定して users テーブルを
 作成
データ生成:その 2
10 人分のデータを生成したいので、 1 〜 10 で
  id だけを生成して csv ファイルを作成
( デフォルトは spec/fixtures/users.csv)
データ生成:その 1
「 config/flextures.factory.rb 」にフィルタを記
 述する。今回は faker を使ってデータを生成
データ生成:その 3
もう一度「 rake db:flextures:dump F=users 」を
 実行してデータをダンプ
Case2: 本番環境データの取り込み
検証環境のデータを取り込み
検証環境で携帯を使いながら操作していると
  戦闘で、バグらしき挙動を発見
関係するテーブルのデータを吐き出し
rake db:flextures:dump T=users,items,battle_log
これを開発環境の spec/fixtures/battle 以下に移
 動
検証環境のデータを取り込み
持ってきたデータを spec/fixtures/battle 以下に
  移動させて
rake db:flextures:load DIR=battle
DB に検証環境のデータを取り込まれたので
rails console でコンソールを起動して周辺の
  コードを試し打ちしたり ruby-debugger でブ
  レークポイントを貼ったりしてバグ探し
検証環境のデータを取り込み
原因がわかったら spec にバグを再現するテス
  トを作成
データの切り替えは RSpec 中で以下の様に記
  述 
flextures :users => "battle/users",
  :items=>"battle/items", :battle_log =>
  "battle/battle_log"
検証環境のデータを " そのまま " 持ってきて
テストケースとして使用可能
最大の利点
テスト用のデータと開発環境で使うデータを
  同じ場所で管理できる
rails colsole で実行できるデータが rspec と同じ
Case3: 画像のとり込み
画像の DB 取り込み
CSV ファイルの作成

               content に画像が入る




public/images/db/ 以下に 0001 〜 0005.jpg を設
  置
画像の DB への読み込み
さっきと同じで flextures.factory.rb を作成




あとは
rake db:flextures:load T=upload_images
で画像をロード
現在の欠点
安定性 !! (バグが眠っている)
特に DB のデータをリセットするタイミングが
 まだ確定できていない
Rspec で before(:all) を使ったところが転ぶ
Rails3.2 の場合警告メッセージが出る
etc...
現在の欠点2
FactoryFilter への機能集中 ( 1テーブル1個し
  かフィルタを持てない)
一応ファイル名を取得したり対処法はあるけ
  ど、まだまだ研究不足
あと、まとめ
別に fixtures でのデータ読み込みとかは dis っ
 ていない(読み込み速度でかなわない )
FactoryGirl も混ぜて使える(柔軟性ではこち
  らが上 )
まとめ
綺麗に適応する必要はない
DB のデータを csv でダンプする目的だけで
 使ってもよし
テスト用のデータを大量生成するために使っ
 てもよし
RSpec で fixture を切り替えるためだけに使っ
 てもよし
とまぁ色々言いましたが
Gemfile に「 gem "flextures" 」して  bundle
install するだけなので、とりあえず使ってみて
                 ください
      (CSV 吐き出しだけしたいなら、オススメは 1.0.6)
Gemfile に「 gem "flextures" 」して  bundle
install するだけなので、とりあえず使ってみて
                 ください
ありがとうございました

Más contenido relacionado

Similar a Rails-Plugin Flexturesの紹介

Azure Cosmos DB を使った高速分散アプリケーションの設計パターン
Azure Cosmos DB を使った高速分散アプリケーションの設計パターンAzure Cosmos DB を使った高速分散アプリケーションの設計パターン
Azure Cosmos DB を使った高速分散アプリケーションの設計パターンKazuyuki Miyake
 
120331 silverlight5新機能早めぐり
120331 silverlight5新機能早めぐり120331 silverlight5新機能早めぐり
120331 silverlight5新機能早めぐりTakayoshi Tanaka
 
Opencv object detection_takmin
Opencv object detection_takminOpencv object detection_takmin
Opencv object detection_takminTakuya Minagawa
 
Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionGoh Matsumoto
 
【12-A-2】 ケーススタディ:不景気と戦うシステムインテグレート
【12-A-2】 ケーススタディ:不景気と戦うシステムインテグレート【12-A-2】 ケーススタディ:不景気と戦うシステムインテグレート
【12-A-2】 ケーススタディ:不景気と戦うシステムインテグレートdevsumi2009
 
ASP.NET vNextの全貌
ASP.NET vNextの全貌ASP.NET vNextの全貌
ASP.NET vNextの全貌A AOKI
 
mmapパッケージを使ってお手軽オブジェクト管理
mmapパッケージを使ってお手軽オブジェクト管理mmapパッケージを使ってお手軽オブジェクト管理
mmapパッケージを使ってお手軽オブジェクト管理Shintaro Fukushima
 
Lv1から始めるWebサービスのインフラ構築
Lv1から始めるWebサービスのインフラ構築Lv1から始めるWebサービスのインフラ構築
Lv1から始めるWebサービスのインフラ構築伊藤 祐策
 
Elastic7.12 release-new-features-on-0428
Elastic7.12 release-new-features-on-0428Elastic7.12 release-new-features-on-0428
Elastic7.12 release-new-features-on-0428Shotaro Suzuki
 
Google App Engineとその影響(補足)
Google App Engineとその影響(補足)Google App Engineとその影響(補足)
Google App Engineとその影響(補足)なおき きしだ
 
Java fx勉強会lt 第8回
Java fx勉強会lt 第8回Java fx勉強会lt 第8回
Java fx勉強会lt 第8回Taiji Miyabe
 
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門Daiyu Hatakeyama
 
Vertica 8.1.1(8.1 SP1) 新機能
 Vertica 8.1.1(8.1 SP1) 新機能 Vertica 8.1.1(8.1 SP1) 新機能
Vertica 8.1.1(8.1 SP1) 新機能Kaito Tono
 
DOO-013_Docker 最新動向と Azure Container Service 入門
DOO-013_Docker 最新動向と Azure Container Service 入門DOO-013_Docker 最新動向と Azure Container Service 入門
DOO-013_Docker 最新動向と Azure Container Service 入門decode2016
 
Couch Db勉強会0623 by yssk22
Couch Db勉強会0623 by yssk22Couch Db勉強会0623 by yssk22
Couch Db勉強会0623 by yssk22Yohei Sasaki
 

Similar a Rails-Plugin Flexturesの紹介 (20)

Azure Cosmos DB を使った高速分散アプリケーションの設計パターン
Azure Cosmos DB を使った高速分散アプリケーションの設計パターンAzure Cosmos DB を使った高速分散アプリケーションの設計パターン
Azure Cosmos DB を使った高速分散アプリケーションの設計パターン
 
120331 silverlight5新機能早めぐり
120331 silverlight5新機能早めぐり120331 silverlight5新機能早めぐり
120331 silverlight5新機能早めぐり
 
HBaseCon 2012 参加レポート
HBaseCon 2012 参加レポートHBaseCon 2012 参加レポート
HBaseCon 2012 参加レポート
 
Opencv object detection_takmin
Opencv object detection_takminOpencv object detection_takmin
Opencv object detection_takmin
 
Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd edition
 
【12-A-2】 ケーススタディ:不景気と戦うシステムインテグレート
【12-A-2】 ケーススタディ:不景気と戦うシステムインテグレート【12-A-2】 ケーススタディ:不景気と戦うシステムインテグレート
【12-A-2】 ケーススタディ:不景気と戦うシステムインテグレート
 
BPStudy20121221
BPStudy20121221BPStudy20121221
BPStudy20121221
 
ASP.NET vNextの全貌
ASP.NET vNextの全貌ASP.NET vNextの全貌
ASP.NET vNextの全貌
 
mmapパッケージを使ってお手軽オブジェクト管理
mmapパッケージを使ってお手軽オブジェクト管理mmapパッケージを使ってお手軽オブジェクト管理
mmapパッケージを使ってお手軽オブジェクト管理
 
Lv1から始めるWebサービスのインフラ構築
Lv1から始めるWebサービスのインフラ構築Lv1から始めるWebサービスのインフラ構築
Lv1から始めるWebサービスのインフラ構築
 
Nginx
NginxNginx
Nginx
 
Elastic7.12 release-new-features-on-0428
Elastic7.12 release-new-features-on-0428Elastic7.12 release-new-features-on-0428
Elastic7.12 release-new-features-on-0428
 
Tokyo r28 1
Tokyo r28 1Tokyo r28 1
Tokyo r28 1
 
[Japan Tech summit 2017] DAL 005
[Japan Tech summit 2017] DAL 005[Japan Tech summit 2017] DAL 005
[Japan Tech summit 2017] DAL 005
 
Google App Engineとその影響(補足)
Google App Engineとその影響(補足)Google App Engineとその影響(補足)
Google App Engineとその影響(補足)
 
Java fx勉強会lt 第8回
Java fx勉強会lt 第8回Java fx勉強会lt 第8回
Java fx勉強会lt 第8回
 
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門
 
Vertica 8.1.1(8.1 SP1) 新機能
 Vertica 8.1.1(8.1 SP1) 新機能 Vertica 8.1.1(8.1 SP1) 新機能
Vertica 8.1.1(8.1 SP1) 新機能
 
DOO-013_Docker 最新動向と Azure Container Service 入門
DOO-013_Docker 最新動向と Azure Container Service 入門DOO-013_Docker 最新動向と Azure Container Service 入門
DOO-013_Docker 最新動向と Azure Container Service 入門
 
Couch Db勉強会0623 by yssk22
Couch Db勉強会0623 by yssk22Couch Db勉強会0623 by yssk22
Couch Db勉強会0623 by yssk22
 

Más de baban ba-n

Typusとadministrateを比較してみよう
Typusとadministrateを比較してみようTypusとadministrateを比較してみよう
Typusとadministrateを比較してみようbaban ba-n
 
Typusと付き合ってきた話
Typusと付き合ってきた話Typusと付き合ってきた話
Typusと付き合ってきた話baban ba-n
 
ハッカソン。来た、見た、負けた! Spajam2016仙台予選
ハッカソン。来た、見た、負けた! Spajam2016仙台予選ハッカソン。来た、見た、負けた! Spajam2016仙台予選
ハッカソン。来た、見た、負けた! Spajam2016仙台予選baban ba-n
 
ガラホ、なるものに対応してきた
ガラホ、なるものに対応してきたガラホ、なるものに対応してきた
ガラホ、なるものに対応してきたbaban ba-n
 
Minitest調べてみた
Minitest調べてみたMinitest調べてみた
Minitest調べてみたbaban ba-n
 
人工言語ロジバン超入門編
人工言語ロジバン超入門編人工言語ロジバン超入門編
人工言語ロジバン超入門編baban ba-n
 
普通のエンジニアが【ロジバン】やってみた
普通のエンジニアが【ロジバン】やってみた普通のエンジニアが【ロジバン】やってみた
普通のエンジニアが【ロジバン】やってみたbaban ba-n
 
プログラミング言語Cyanの紹介
プログラミング言語Cyanの紹介プログラミング言語Cyanの紹介
プログラミング言語Cyanの紹介baban ba-n
 
Rubyのコードを読んでみよう(オブジェクト編)
Rubyのコードを読んでみよう(オブジェクト編)Rubyのコードを読んでみよう(オブジェクト編)
Rubyのコードを読んでみよう(オブジェクト編)baban ba-n
 
Rubyのソースコードを読んでみよう(入門編)
Rubyのソースコードを読んでみよう(入門編)Rubyのソースコードを読んでみよう(入門編)
Rubyのソースコードを読んでみよう(入門編)baban ba-n
 
rails 管理画面作成gem Typus解説
rails 管理画面作成gem Typus解説rails 管理画面作成gem Typus解説
rails 管理画面作成gem Typus解説baban ba-n
 
名前重要 超重要
名前重要 超重要名前重要 超重要
名前重要 超重要baban ba-n
 

Más de baban ba-n (12)

Typusとadministrateを比較してみよう
Typusとadministrateを比較してみようTypusとadministrateを比較してみよう
Typusとadministrateを比較してみよう
 
Typusと付き合ってきた話
Typusと付き合ってきた話Typusと付き合ってきた話
Typusと付き合ってきた話
 
ハッカソン。来た、見た、負けた! Spajam2016仙台予選
ハッカソン。来た、見た、負けた! Spajam2016仙台予選ハッカソン。来た、見た、負けた! Spajam2016仙台予選
ハッカソン。来た、見た、負けた! Spajam2016仙台予選
 
ガラホ、なるものに対応してきた
ガラホ、なるものに対応してきたガラホ、なるものに対応してきた
ガラホ、なるものに対応してきた
 
Minitest調べてみた
Minitest調べてみたMinitest調べてみた
Minitest調べてみた
 
人工言語ロジバン超入門編
人工言語ロジバン超入門編人工言語ロジバン超入門編
人工言語ロジバン超入門編
 
普通のエンジニアが【ロジバン】やってみた
普通のエンジニアが【ロジバン】やってみた普通のエンジニアが【ロジバン】やってみた
普通のエンジニアが【ロジバン】やってみた
 
プログラミング言語Cyanの紹介
プログラミング言語Cyanの紹介プログラミング言語Cyanの紹介
プログラミング言語Cyanの紹介
 
Rubyのコードを読んでみよう(オブジェクト編)
Rubyのコードを読んでみよう(オブジェクト編)Rubyのコードを読んでみよう(オブジェクト編)
Rubyのコードを読んでみよう(オブジェクト編)
 
Rubyのソースコードを読んでみよう(入門編)
Rubyのソースコードを読んでみよう(入門編)Rubyのソースコードを読んでみよう(入門編)
Rubyのソースコードを読んでみよう(入門編)
 
rails 管理画面作成gem Typus解説
rails 管理画面作成gem Typus解説rails 管理画面作成gem Typus解説
rails 管理画面作成gem Typus解説
 
名前重要 超重要
名前重要 超重要名前重要 超重要
名前重要 超重要
 

Último

2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~arts yokohama
 
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法ssuser370dd7
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor arts yokohama
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfMatsushita Laboratory
 
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦Sadao Tokuyama
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)ssuser539845
 
20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdfAyachika Kitazaki
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見Shumpei Kishi
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-LoopへTetsuya Nihonmatsu
 

Último (12)

2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
 
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
 
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
 
20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf
 
2024 03 CTEA
2024 03 CTEA2024 03 CTEA
2024 03 CTEA
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
 
2024 04 minnanoito
2024 04 minnanoito2024 04 minnanoito
2024 04 minnanoito
 
What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?
 

Rails-Plugin Flexturesの紹介