Your SlideShare is downloading. ×
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例

3,462
views

Published on

名古屋Ruby会議01 A.3「製造業向け3Dデータ変換ソリューションにおけるRuby活用事例」 …

名古屋Ruby会議01 A.3「製造業向け3Dデータ変換ソリューションにおけるRuby活用事例」
当社の製造業向けの3Dデータ変換、最適化ソリューションASFALIS( http://www.elysium.co.jp/products/asfalis/ )でのRuby活用事例(CANVAS Script)をご紹介します。Ruby採用に至るまでの過程や、その他の社内でのRuby活用事例についてもお話しさせていただきます。

YouTube:
http://www.youtube.com/watch?v=o8Y3mHpPAlE

Published in: Technology

0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,462
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
9
Comments
0
Likes
4
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 製造業向け3Dデータ変換ソリューション におけるRuby活用事例 株式会社エリジオン 内山 滋 / suchi 2009/10/10
  • 2. 最初に要点を
  • 3. 製造業向け ソフトで Ruby採用
  • 4. 製造業向け ソフト開発でも Ruby活用
  • 5. Good
  • 6. 以上
  • 7. はじめに
  • 8. はじめに 自己紹介 会社紹介 背景 事例紹介 ASFALIS 導入まで CANVAS Script 社内利用事例 謝辞
  • 9. 開催おめでとう ございます
  • 10. Ruby といえば 島根 matz江
  • 11. 青春 プレイバック NHKアーカイブス 保存番組検索「青春ブレイバック」 http://archives.nhk.or.jp/chronicle/search/
  • 12. fj.sources 1995/12/21
  • 13. >まつもと ゆきひろ@トヨタケーラムです. >ここのところ,細々と開発を続けて来た >オブジェクト指向スクリプト言語 rubyを >公開します. (fj.sources: 1995/12/21) Newsgroup: fj.sources From: m...@caelum.co.jp (Yukihiro Matsumoto) Date: 1995/12/21 Subject: ruby 0.95 - object-oriented script language (0/7)
  • 14. 名古屋はRuby デビューの地
  • 15. デビュー?
  • 16. 浜松
  • 17. 1990年に卒業して、ソフトハウスに入り ました(中略)でも、浜松で働ける会社と出 合って、そこを選ぶんです。 (中略: 丌景気になり) それでRubyの開発を始めたんです。会 社でやっていましたから、同僚には話して いました。いろいろ応援してくれましたね。 Tech総研「世界のオープンソースRuby開発者まつもとゆきひろ」 http://rikunabi-next.yahoo.co.jp/tech/docs/ct_s03600.jsp?p=001005
  • 18. 浜松は Ruby 誕生の地
  • 19. 浜Matzは Ruby 誕生の地
  • 20. はじめに 自己紹介 会社紹介 背景 事例紹介 ASFALIS 導入まで CANVAS Script 社内利用事例 謝辞
  • 21. 自己紹介
  • 22. suchi http://www.suchi.org/ Ruby Lv: 初心者→中級 好きなメソッド: String#% 好きなrubyist: id: m_seki 好きなアジャイルプラクティス: ありのままの進捗を計測 好きなXPプラクティス: 計画ゲーム 好きなもの: 似てるもの
  • 23. 1990年に卒業して、ソフトハウスに入り ました(中略)でも、浜松で働ける会社と出 合って、そこを選ぶんです。 (中略: 丌景気になり) それでRubyの開発を始めたんです。会 社でやっていましたから、同僚には話して いました。いろいろ応援してくれましたね。 Tech総研「世界のオープンソースRuby開発者まつもとゆきひろ」 http://rikunabi-next.yahoo.co.jp/tech/docs/ct_s03600.jsp?p=001005
  • 24. 同僚のYさん =最初の上司
  • 25. 4107冊 http://hondana.org/suchi
  • 26. 似てるもの
  • 27. 業務では 品質管理 シニアマネージャ (開発もします)
  • 28. http://d.hatena.ne.jp/higayasuo/
  • 29. Coraleef VB/Delphi App → Adobe AIR 移行Tool ・開発リーダー ・フルセットXP開発 ・社内初のアジャイル事例 →以降社内では当たり前の選択肢に http://www.isid.co.jp/solution/development/coraleef.html http://itpro.nikkeibp.co.jp/article/COLUMN/20071128/288169/
  • 30. はじめに 自己紹介 会社紹介 背景 事例紹介 ASFALIS 導入まで CANVAS Script 社内利用事例 謝辞
  • 31. 会社紹介
  • 32. 株式会社エリジオン • 本社: 静岡県浜松市 • 設立: 1999/11/1 • 社員数: 71名 http://www.elysium.co.jp/
  • 33. 技術ベース • 3次元形状処理 • データ変換 • データ検証・修正 http://www.elysium.co.jp/
  • 34. Web採用ページ • 一辺の長さが2nの立方体があり(nは整数)、その中心に 直径2n-1の球を配置します。 • 立方体を一辺1の格子に区切ったとき、球の表面が通過 する格子の数をXとします。 • X>2008となる最小のnはいくつでしょうか? http://www.elysium.co.jp/recruit/pretestx/000014.html
  • 35. Renault F1 Team 公式サプライヤ データ変換 2週間⇒3.5時間 http://www.renaultf1.com/en/_2009/team/partenaires/partenaires_rf1/partenaires_is_it_partners/partenaires_is_it_partners_elysium/
  • 36. 事例紹介
  • 37. はじめに 自己紹介 会社紹介 背景 事例紹介 ASFALIS 導入まで CANVAS Script 社内利用事例 謝辞
  • 38. 背景
  • 39. 3Dデータ処理 • 1) 3D CADデータ変換 • 2) データチェック • 3) データ修正 • 4) データ最適化 • 5) Viewer • 6) and so on...
  • 40. 1)CADデータの変換 CAD(A) CAD(B) NG!
  • 41. 1)CADデータの変換 CAD(A) NG! CAD(B) OK
  • 42. 2) データチェック
  • 43. 3) データ修正 • Healing
  • 44. 4) データ最適化 • 例:簡略化
  • 45. 5) Viewer
  • 46. 6) その他いろいろ Auto-Surfacing Polygon Processing
  • 47. 中間表現 • 多数のCAD • データ変換 – 現在も15種類以上 – NxNの組み合わせ • CATIA V4 • データ処理 • CATIA V5 – 一般化 • I-DEAS • Pro/E • UG • SolidWorks • Inventor • CoCreate • :
  • 48. まもなく Ruby 出てきます
  • 49. はじめに 自己紹介 会社紹介 背景 事例紹介 ASFALIS 導入まで CANVAS Script 社内利用事例 謝辞
  • 50. ASFALISモジュール化 • 3Dデータ処理のためのモジュールパッケ ージ – CAD X用 • ENF Writer • ENF Reader – Optimizer – Checker – Viewer – 内部的に • 共通処理カーネル
  • 51. ASFALIS – ENF中心のソリューション
  • 52. ASFALISの利用方法 • 受託案件におけるコンポーネント • 顧客のシステムへの組み込み • 代理店様の別システムへの組み込み
  • 53. ASFALISをさらに使いやすく • 部課単位で使いたい • 小規模な業務フローを簡単に記述したい • セールスチームが顧客用なシンプルなカ スタマイズしたい
  • 54. シナリオファイル <?xml version="1.0"?> • 手順をXMLで記述 <ScenarioList> <Scenario> – シンプルな手順に有効 <CAD2ENF> <inputfile path="${INPUTFILE} • →さらに使いやすく <outputfile path="${OUTPUTFIL <parameterfile path="${PARAME – 外部モジュールを呼びたい <productcode id="105001" /> <workdir path="${WORKDIR}" /> – 条件分岐/判定したい <logfile path="${LOGFILE}" /> <xmllogfile path="${XMLLOGFIL • モジュール返値 </CAD2ENF> • データチェックの結果 <ASMEDIT> • ファイルの存在 <inputfile path="${OUTPUTFILE <outputfile path="${OUTPUTFIL <parameterfile path="${PARAME <workdir path="${WORKDIR}" /> <logfile path="${LOGFILE}" /> <xmllogfile path="${XMLLOGFIL </ASMEDIT> <ATTREDIT>
  • 55. はじめに 自己紹介 会社紹介 背景 事例紹介 ASFALIS 導入まで CANVAS Script 社内利用事例 謝辞
  • 56. ELYSIUM CANVAS Script
  • 57. お待たせしました Ruby です
  • 58. CANVAS Script • CAx iNtegrator Via Asfalis Solution • Rubyから各モジュールを呼び出せる • モジュールのInput/Outputの接続をわかり やすく • CADが必要なモジュールのリモート呼び出し • ユーザコンポーネントを定義可能 – 顧客独自のコンポーネントの定義が可能
  • 59. スクリプト例 require 'canvas' CANVAS::Session.open {|session| # Shared work folder session.shared_workdir = ARGV[2] # Definition of component parasolid2enf = session.create_component(:parasolid2enf) asmedit = session.create_component(:asmedit) attredit = session.create_component(:attredit) # Connection between the components parasolid2enf[:inputfile] = ARGV[0] parasolid2enf[:CalcMassProperty] = 1 parasolid2enf[:CalcElementNumber] = 1 asmedit[:inputfile] = parasolid2enf[:outputfile] asmedit[:CopySharedPart] = 1 asmedit[:CopySharedAssembly] = 1 attredit[:inputfile] = asmedit[:outputfile] attredit[:mapfile] = 'w:¥conf¥NrkMappingFIle.xml' # Execution session.start # Output attredit.copy_result_to(ARGV[1]) }
  • 60. 準備 require 'canvas'
  • 61. セッション CANVAS::Session.open {|session| : : }
  • 62. コンポーネント生成 parasolid2enf = session.create_component(:parasolid2enf) asmedit = session.create_component(:asmedit) attredit = session.create_component(:attredit)
  • 63. コンポーネントの設定 コンポーネントの接続 parasolid2enf[:inputfile] = ARGV[0] parasolid2enf[:CalcMassProperty] = 1 parasolid2enf[:CalcElementNumber] = 1 asmedit[:inputfile] = parasolid2enf[:outputfile] asmedit[:CopySharedPart] = 1 asmedit[:CopySharedAssembly] = 1 attredit[:inputfile] = asmedit[:outputfile] attredit[:mapfile] = 'w:¥conf¥NrkMappingFIle.xml'
  • 64. セッション実行 session.start
  • 65. スクリプト例 require 'canvas' CANVAS::Session.open {|session| # Shared work folder session.shared_workdir = ARGV[2] # Definition of component parasolid2enf = session.create_component(:parasolid2enf) asmedit = session.create_component(:asmedit) attredit = session.create_component(:attredit) # Connection between the components parasolid2enf[:inputfile] = ARGV[0] parasolid2enf[:CalcMassProperty] = 1 parasolid2enf[:CalcElementNumber] = 1 asmedit[:inputfile] = parasolid2enf[:outputfile] asmedit[:CopySharedPart] = 1 asmedit[:CopySharedAssembly] = 1 attredit[:inputfile] = asmedit[:outputfile] attredit[:mapfile] = 'w:¥conf¥NrkMappingFIle.xml' # Execution session.start # Output attredit.copy_result_to(ARGV[1]) }
  • 66. 詳しいサンプルはWebで http://www.elysium.co.jp/products/asfalis/index.html
  • 67. Desktop Controler • ADC(ASFALIS Desktop Controller) – データ処理をスケジューリング – CANVAS Scriptを生成/実行 – 簡単に定期処理、夜間バッチ変換システムを構築可能 – MFCアプリケーション
  • 68. モジュール図 Ruby Win Script App Server Canvas Canvas CANVAS Library Library Script dRuby dRuby ADC (MFC Win App) ASFALIS Component Loader Scheduler (Console App) (Console App) derived proe2enf asmedit pro2enf.exe asmedit.exe Component Component (Console App) (Console App)
  • 69. Good • 動的言語やモダンな言語のメリット享受 – C/C++と比べて • 驚くほど簡単に記述できる。 • 自然に書けて行数尐ない/手間尐ない。 • メソッド上書きやeval • dRuby • 豊富なライブラリ • 行き詰まったときにWebに情報が多い
  • 70. Bad • (社内)アーリーアダプタ特有のトラブル – 当然あったが – リスクを見込んだスケジューリングでカバー • dRuby – 透過的に書けすぎて、サーバ/クライアントの結合が 密になってしまった
  • 71. Bad • 海外代理店からは「Ruby?」 – 別言語のI/Fを追加するかも – 日本の代理店に置き換えて考えてみよう • Allegro Common Lisp? / Lua? • 理解できる • スピード – 1.9対応したい
  • 72. 要望 • gemでインストールするとき、メモリ消 費が激しい • gemの配布条件を調べるのに手間がかか った – たとえばこんなオプションがあれば – gem -license actionmailer
  • 73. 導入まで
  • 74. はじめに 自己紹介 会社紹介 背景 事例紹介 ASFALIS 導入まで CANVAS Script 社内利用事例 謝辞
  • 75. 現状: 社内Rubyユーザ • 開発者約30人 – カタコトも含めれば2/3はRubyを使える – Ruby技術レベルは決して突出していない • 業務でのRuby利用 – イキのいい若い社員が主導
  • 76. 各個人での利用はずっと前から • さまざまな開発手続きの自動化やワンラ イナー – バッチファイル, Born-Shell, Perl, Ruby, Windows Script(VBScript/JScript), Windows PowerShell, Python • あまり制限されない。任されている • が、ここ5年でRubyがデファクト化
  • 77. 勉強会 • 勉強会が推奨されている – 裁量性なので、時間も自由 – デザインパターン / Effective C++ – Code Complete /アジャイル開発 – ISO 10303-59 / 計算位相幾何
  • 78. 2005-2006 CODE COMPLETE 2nd 勉強会 14名(入社1-2年目社員中心) 34章を1年でCOMPLETE
  • 79. Ruby勉強会 • 2007 • 参加者: 14名 • スキルにあった内容を皆バラバラに学ぶ
  • 80. Ruby導入 • 役員、上司、お客様からの制限はなし – 問題解決指向 • CTO – 技術全般への目の配り – 例: ファウラー「リファクタリング」 • 開発者に基本的に任されている • 社風 – 取り組みを評価する社風 – 例: アジャイル導入 • トップが柔軟で理解がある • 目的指向
  • 81. とはいえ • 安易な考えは却下 • 顧客対応部署に説明できるか • 浮かれRubyistではないか – 手段が目的より優先してないか – おまえRubyって言いたいだけちゃうんか • リスクを認識しているか • 覚悟はあるか – 一度否定されて引っ込めるようではダメ – いざというときRuby/Libraryのせいにしない – いざというときソースを読む覚悟
  • 82. s/Ruby/ソーシャルなんとか/g s/Ruby/クラウド/g s/Ruby/twitter/g s/Ruby/.NET/g s/Ruby/Rails/g
  • 83. Why Ruby? • Good参照
  • 84. バランス感覚重要 • エンジニアの重要な資質? – パラノ資質と共存可能 • 他言語/システムを知っているか – Rubyだけ勉強していてもダメ – 一部業界だけを参考にしてもダメ • 永遠のβ←日本の製造業の超高品質プロセスを維持できるか? • メリット/デメリットを正確に挙げられるか – それ○○でできるよ
  • 85. 社内利用例
  • 86. はじめに 自己紹介 会社紹介 背景 事例紹介 ASFALIS 導入まで CANVAS Script 社内利用事例 謝辞
  • 87. 社内利用例 • 個人的なスクリプト • プロジェクト内のスクリプト • 社内カーネル利用インターフェイス • テストで使うスクリプト • テストシステム(サーバはRails) • Redmine – でも主要は独自タスクDB(運用10年) – アジャイル開発はXPlanner
  • 88. 一時的なスクリプト • Widowsの.rcファイル自動生成 group = { "標準" => ["IDC_BUTTON_PICK", "IDC_BUTTON_ZOOM", ...] "並び替え" => ["IDC_BUTTON_UP", "IDC_BUTTON_DOWN", nil, ...] "編集" => ["IDC_BUTTON_EDIT_HOLE_PATTERN", ...] } x = 9 group.each do |name, list| buttons = [] x1 = x x += 4 list.each do |obj| if obj.nil? x += 3 else buttons.push " PUSHBUTTON ¥"¥",#{obj},#{x},18,16,16,BS_ICON" x += 16 end end puts " GROUPBOX ¥"#{name}¥",IDC_STATIC,#{x1},7,#{x-x1+4},32" puts buttons.join("¥n") x += 10 end
  • 89. テスト用ツール • 高い品質維持 – テストの増加 • テストの自動化 – テストの自動生成
  • 90. 中間ファイル操作ライブラリ • C/C++で作成されたライブラリ – Rubyから呼びだすためのライブラリ • 機能テストの判定に利用 • 開発中に利用
  • 91. ENF Handler ENF Info ENF Rubyによる Reader Editor ... 各種ツール (Ruby) (Ruby) ENF Handler (Ruby) Ruby I/Fは 下層に依存しない Ruby C拡張 Handlerに必要な ところだけ C I/F ELYSIUM Foundation Class Library(C++)
  • 92. テストシステム • Railsを利用したテストサーバ • Rubyによる実行システム • 判定条件を名前付けRubyクラスで記述 • テスト項目は判定条件とパラメータ • →自動テスト可能に
  • 93. 今後
  • 94. 今後のRuby利用 • CANVAS Script – 続々と展開中、典型的利用方法もライブラリ化 • テストシステム開発 • 新規開発プロジェクトでもRuby採用 – 複数言語のシステム • C/C++ ~ 長く継続していたWindows App • C#(.NET) ~ 新規作成Windows GUI App / クライアント • Ruby ~ サーバ(Railsも利用) • サーバ/Client間はSOAP – Rubyにこだわっていない • ←→Rubyに価値がある証拠!
  • 95. はじめに 自己紹介 会社紹介 背景 事例紹介 ASFALIS 導入まで CANVAS Script 社内利用事例 謝辞
  • 96. 謝辞
  • 97. 名古屋Ruby会議 Rubyの会 他Rubyに関わる皆様
  • 98. Regional Ruby会議発案者 角谷信太郎 さん
  • 99. http://b.hatena.ne.jp/entry/twitter.com/suchi/statuses/
  • 100. @Wikiばな Vol.7 http://wikibana.socoda.net/wiki.cgi?WikiBana%2fVOL.7
  • 101. ところで 角谷さんの翻訳された
  • 102. 最後にも要点を
  • 103. 製造業向け ソフトで Ruby採用
  • 104. 製造業向け ソフト開発でも Ruby活用
  • 105. Good
  • 106. 名古屋はRuby デビューの地
  • 107. 開催おめでとう ございます
  • 108. 以上
  • 109. ご清聴 ありがとうございました
  • 110. 付録
  • 111. 現実的なスクリプト例 • 1. 解析に丌要な微小部品を削除 – ASFALISアダプタ(体積取得) – アセンブリ編集コンポーネント(削除) • 2. 解析失敗の原因となる部品間干渉を検証 – 干渉チェックコンポーネント – アセンブリ編集コンポーネント(削除) • 3. 解析に丌適な形状削除 – 形状簡略化コンポーネント(フィレット・段差削除) – 干渉チェックコンポーネント(簡略化後の干渉チェック) • 4. CAEツール向けにデータ修正しParasolidへ変換 – ASFALISアダプタ(ヒーリング/Parasolid形式へ変換)
  • 112. フロー A B A B
  • 113. スクリプト例(1) require 'canvas' require 'parser.rb' CANVAS::Session.open do |session| config = session.parse_config(ARGV[0]) session.shared_workdir = config[:shared_workdir] # コンポーネントを作成 catiav52enf = session.create_component('catiav52enf') asmedit = session.create_component('asmedit') intrcheck = session.create_component('intrcheck') asmedit2 = session.create_component('asmedit') simplify = session.create_component('simplify') dek = session.create_component('dek') enf2parasolid = session.create_component('enf2parasolid')
  • 114. スクリプト例(2) # コンポーネントの出入力データのマッピング定義、オプションを指定 catiav52enf[:inputfile] = config[:inputfile] catiav52enf[:CalcMassProperty] = '1' asmedit[:inputfile] = catiav52enf[:outputfile] asmedit[:DeleteSpecifiedPart] = '1' asmedit[:namelist] = 'namelist1.txt' intrcheck[:inputfile] = asmedit[:outputfile] intrcheck[:ExcludeNoShowElement] = '1' intrcheck[:ReportIntrVolume] = '1' asmedit2[:inputfile] = intrcheck[:outputfile] asmedit2[:DeleteSpecifiedPart] = '1' asmedit2[:namelist] = 'namelist2.txt'
  • 115. スクリプト例(3) simplify[:inputfile] = asmedit2[:outputfile] simplify[:Process].add :RemoveFillet, { :AvoidInterferenceAmongParts => '1', :AvoidInterferenceWithinPart => '1', :FilletMaxRadius => '5', :FilletMinRadius => '1', :ProhibitInvalidGeometryCreation => '1' } simplify[:Process].add :RemoveStep, { :ProhibitInvalidGeometryCreation => '1', :StepMaxHeight => '0.1' } dek[:inputfile] = simplify[:outputfile] dek[:to_cad] = 'parasolid' enf2parasolid[:inputfile] = dek[:outputfile]
  • 116. スクリプト例(4) # 処理を実行 catiav52enf.execute asmedit.execute xml_parse(asmedit[:xmllogfile],namelist1.txt) intrcheck.execute xml_parse(intrcheck[:csvfile],namelist2.txt) asmedit2.execute simplify.execute dek.execute enf2parasolid.execute # 出力ファイルを保存 enf2parasolid.copy_result_to(config[:outputdir]) end