名古屋Ruby会議01...
-
Upload
shigeru-uchiyama -
Category
Technology
-
view
3.565 -
download
8
description
Transcript of 名古屋Ruby会議01...
製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
株式会社エリジオン内山滋 / suchi
2009/10/10
最初に要点を
製造業向けソフトで
Ruby採用
製造業向けソフト開発でも
Ruby活用
Good
以上
はじめに
はじめに
自己紹介
会社紹介
事例紹介
導入まで
社内利用事例
謝辞
背景
ASFALIS
CANVAS Script
開催おめでとうございます
Rubyといえば
島根matz江
青春プレイバック
NHKアーカイブス 保存番組検索「青春ブレイバック」http://archives.nhk.or.jp/chronicle/search/
fj.sources1995/12/21
>まつもと ゆきひろ@トヨタケーラムです.
>ここのところ,細々と開発を続けて来た>オブジェクト指向スクリプト言語 rubyを>公開します.
(fj.sources: 1995/12/21)
Newsgroup: fj.sources
From: [email protected] (Yukihiro Matsumoto)
Date: 1995/12/21
Subject: ruby 0.95 - object-oriented script language (0/7)
名古屋はRubyデビューの地
デビュー?
浜松
1990年に卒業して、ソフトハウスに入り
ました(中略)でも、浜松で働ける会社と出
合って、そこを選ぶんです。
(中略: 丌景気になり)
それでRubyの開発を始めたんです。会
社でやっていましたから、同僚には話していました。いろいろ応援してくれましたね。
Tech総研「世界のオープンソースRuby開発者まつもとゆきひろ」http://rikunabi-next.yahoo.co.jp/tech/docs/ct_s03600.jsp?p=001005
浜松はRuby
誕生の地
浜MatzはRuby
誕生の地
はじめに
自己紹介
会社紹介
事例紹介
導入まで
社内利用事例
謝辞
背景
ASFALIS
CANVAS Script
自己紹介
suchihttp://www.suchi.org/
Ruby Lv: 初心者→中級好きなメソッド: String#%好きなrubyist: id: m_seki
好きなアジャイルプラクティス: ありのままの進捗を計測好きなXPプラクティス: 計画ゲーム
好きなもの: 似てるもの
1990年に卒業して、ソフトハウスに入り
ました(中略)でも、浜松で働ける会社と出
合って、そこを選ぶんです。
(中略: 丌景気になり)
それでRubyの開発を始めたんです。会
社でやっていましたから、同僚には話して
いました。いろいろ応援してくれましたね。
Tech総研「世界のオープンソースRuby開発者まつもとゆきひろ」http://rikunabi-next.yahoo.co.jp/tech/docs/ct_s03600.jsp?p=001005
同僚のYさん
=最初の上司
4107冊
http://hondana.org/suchi
似てるもの
業務では
品質管理シニアマネージャ(開発もします)
http://d.hatena.ne.jp/higayasuo/
Coraleef
http://www.isid.co.jp/solution/development/coraleef.htmlhttp://itpro.nikkeibp.co.jp/article/COLUMN/20071128/288169/
VB/Delphi App
→ Adobe AIR 移行Tool
・開発リーダー
・フルセットXP開発
・社内初のアジャイル事例
→以降社内では当たり前の選択肢に
はじめに
自己紹介
会社紹介
事例紹介
導入まで
社内利用事例
謝辞
背景
ASFALIS
CANVAS Script
会社紹介
株式会社エリジオン
• 本社: 静岡県浜松市
• 設立: 1999/11/1
• 社員数: 71名
http://www.elysium.co.jp/
技術ベース
• 3次元形状処理
• データ変換
• データ検証・修正
http://www.elysium.co.jp/
Web採用ページ
• 一辺の長さが2nの立方体があり(nは整数)、その中心に直径2n-1の球を配置します。
• 立方体を一辺1の格子に区切ったとき、球の表面が通過する格子の数をXとします。
• X>2008となる最小のnはいくつでしょうか?
http://www.elysium.co.jp/recruit/pretestx/000014.html
Renault F1 Team 公式サプライヤ
http://www.renaultf1.com/en/_2009/team/partenaires/partenaires_rf1/partenaires_is_it_partners/partenaires_is_it_partners_elysium/
データ変換
2週間⇒3.5時間
事例紹介
はじめに
自己紹介
会社紹介
事例紹介
導入まで
社内利用事例
謝辞
背景
ASFALIS
CANVAS Script
背景
3Dデータ処理
• 1) 3D CADデータ変換
• 2) データチェック
• 3) データ修正
• 4) データ最適化
• 5) Viewer
• 6) and so on...
1)CADデータの変換
CAD(A) CAD(B)
NG!
1)CADデータの変換
CAD(A)
CAD(B)
NG!
OK
2) データチェック
3) データ修正
• Healing
4) データ最適化
• 例:簡略化
5) Viewer
6) その他いろいろ
Auto-Surfacing
Polygon Processing
中間表現
• データ変換
– NxNの組み合わせ
• データ処理
– 一般化
• 多数のCAD
– 現在も15種類以上
• CATIA V4
• CATIA V5
• I-DEAS
• Pro/E
• UG
• SolidWorks
• Inventor
• CoCreate
• :
まもなくRuby
出てきます
はじめに
自己紹介
会社紹介
事例紹介
導入まで
社内利用事例
謝辞
背景
ASFALIS
CANVAS Script
ASFALISモジュール化
• 3Dデータ処理のためのモジュールパッケージ– CAD X用
• ENF Writer
• ENF Reader
– Optimizer
– Checker
– Viewer
– 内部的に• 共通処理カーネル
ASFALIS – ENF中心のソリューション
ASFALISの利用方法
• 受託案件におけるコンポーネント
• 顧客のシステムへの組み込み
• 代理店様の別システムへの組み込み
ASFALISをさらに使いやすく
• 部課単位で使いたい
• 小規模な業務フローを簡単に記述したい
• セールスチームが顧客用なシンプルなカスタマイズしたい
シナリオファイル
• 手順をXMLで記述– シンプルな手順に有効
• →さらに使いやすく– 外部モジュールを呼びたい
– 条件分岐/判定したい• モジュール返値
• データチェックの結果
• ファイルの存在
<?xml version="1.0"?>
<ScenarioList>
<Scenario>
<CAD2ENF>
<inputfile path="${INPUTFILE}" />
<outputfile path="${OUTPUTFILE}_1_imp.enf" />
<parameterfile path="${PARAMETERFILE}" />
<productcode id="105001" />
<workdir path="${WORKDIR}" />
<logfile path="${LOGFILE}" />
<xmllogfile path="${XMLLOGFILE}" />
</CAD2ENF>
<ASMEDIT>
<inputfile path="${OUTPUTFILE}_1_imp.enf" />
<outputfile path="${OUTPUTFILE}_2_asm.enf" />
<parameterfile path="${PARAMETERFILE}" />
<workdir path="${WORKDIR}" />
<logfile path="${LOGFILE}" />
<xmllogfile path="${XMLLOGFILE}" />
</ASMEDIT>
<ATTREDIT>
<inputfile path="${OUTPUTFILE}_2_asm.enf" />
はじめに
自己紹介
会社紹介
事例紹介
導入まで
社内利用事例
謝辞
背景
ASFALIS
CANVAS Script
ELYSIUMCANVAS
Script
お待たせしました
Rubyです
CANVAS Script
• CAx iNtegrator Via Asfalis Solution
• Rubyから各モジュールを呼び出せる
• モジュールのInput/Outputの接続をわかりやすく
• CADが必要なモジュールのリモート呼び出し
• ユーザコンポーネントを定義可能– 顧客独自のコンポーネントの定義が可能
スクリプト例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])
}
準備
require 'canvas'
セッションCANVAS::Session.open {|session|
:
:
}
コンポーネント生成
parasolid2enf = session.create_component(:parasolid2enf)
asmedit = session.create_component(:asmedit)
attredit = session.create_component(:attredit)
コンポーネントの設定コンポーネントの接続
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'
セッション実行
session.start
スクリプト例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])
}
詳しいサンプルはWebで
http://www.elysium.co.jp/products/asfalis/index.html
Desktop Controler
• ADC(ASFALIS Desktop Controller)– データ処理をスケジューリング
– CANVAS Scriptを生成/実行
– 簡単に定期処理、夜間バッチ変換システムを構築可能
– MFCアプリケーション
モジュール図
ADC(MFC Win App)
CANVASScript
Scheduler(Console App)
CanvasLibrary
dRuby
Server
CanvasLibrary
dRuby
proe2enfComponent
ASFALISComponent
derived
asmeditComponent
Loader(Console App)
asmedit.exe(Console App)
pro2enf.exe(Console App)
RubyScript
WinApp
Good
• 動的言語やモダンな言語のメリット享受– C/C++と比べて
• 驚くほど簡単に記述できる。
• 自然に書けて行数尐ない/手間尐ない。
• メソッド上書きやeval
• dRuby
• 豊富なライブラリ
• 行き詰まったときにWebに情報が多い
Bad
• (社内)アーリーアダプタ特有のトラブル– 当然あったが
– リスクを見込んだスケジューリングでカバー
• dRuby– 透過的に書けすぎて、サーバ/クライアントの結合が
密になってしまった
Bad
• 海外代理店からは「Ruby?」– 別言語のI/Fを追加するかも
– 日本の代理店に置き換えて考えてみよう• Allegro Common Lisp? / Lua?
• 理解できる
• スピード– 1.9対応したい
要望
• gemでインストールするとき、メモリ消費が激しい
• gemの配布条件を調べるのに手間がかかった– たとえばこんなオプションがあれば
– gem -license actionmailer
導入まで
はじめに
自己紹介
会社紹介
事例紹介
導入まで
社内利用事例
謝辞
背景
ASFALIS
CANVAS Script
現状: 社内Rubyユーザ
• 開発者約30人– カタコトも含めれば2/3はRubyを使える
– Ruby技術レベルは決して突出していない
• 業務でのRuby利用– イキのいい若い社員が主導
各個人での利用はずっと前から
• さまざまな開発手続きの自動化やワンライナー– バッチファイル, Born-Shell, Perl, Ruby,
Windows Script(VBScript/JScript), Windows PowerShell, Python
• あまり制限されない。任されている
• が、ここ5年でRubyがデファクト化
勉強会
• 勉強会が推奨されている– 裁量性なので、時間も自由
– デザインパターン / Effective C++
– Code Complete /アジャイル開発
– ISO 10303-59 / 計算位相幾何
2005-2006CODE COMPLETE 2nd 勉強会14名(入社1-2年目社員中心)34章を1年でCOMPLETE
Ruby勉強会
• 2007
• 参加者: 14名
• スキルにあった内容を皆バラバラに学ぶ
Ruby導入
• 役員、上司、お客様からの制限はなし– 問題解決指向
• CTO – 技術全般への目の配り– 例: ファウラー「リファクタリング」
• 開発者に基本的に任されている
• 社風– 取り組みを評価する社風
– 例: アジャイル導入• トップが柔軟で理解がある
• 目的指向
とはいえ• 安易な考えは却下
• 顧客対応部署に説明できるか
• 浮かれRubyistではないか– 手段が目的より優先してないか
– おまえRubyって言いたいだけちゃうんか
• リスクを認識しているか
• 覚悟はあるか– 一度否定されて引っ込めるようではダメ
– いざというときRuby/Libraryのせいにしない
– いざというときソースを読む覚悟
s/Ruby/ソーシャルなんとか/gs/Ruby/クラウド/gs/Ruby/twitter/gs/Ruby/.NET/gs/Ruby/Rails/g
Why Ruby?
• Good参照
バランス感覚重要
• エンジニアの重要な資質?– パラノ資質と共存可能
• 他言語/システムを知っているか– Rubyだけ勉強していてもダメ
– 一部業界だけを参考にしてもダメ• 永遠のβ←日本の製造業の超高品質プロセスを維持できるか?
• メリット/デメリットを正確に挙げられるか– それ○○でできるよ
社内利用例
はじめに
自己紹介
会社紹介
事例紹介
導入まで
社内利用事例
謝辞
背景
ASFALIS
CANVAS Script
社内利用例
• 個人的なスクリプト
• プロジェクト内のスクリプト
• 社内カーネル利用インターフェイス
• テストで使うスクリプト
• テストシステム(サーバはRails)
• Redmine– でも主要は独自タスクDB(運用10年)
– アジャイル開発はXPlanner
一時的なスクリプト
• 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
テスト用ツール
• 高い品質維持– テストの増加
• テストの自動化– テストの自動生成
中間ファイル操作ライブラリ
• C/C++で作成されたライブラリ– Rubyから呼びだすためのライブラリ
• 機能テストの判定に利用
• 開発中に利用
ENF Handler
Ruby C拡張
C I/F
ENF Handler (Ruby)
ENF Info Reader(Ruby)
ENF Editor(Ruby)
ELYSIUM Foundation Class Library(C++)
Handlerに必要なところだけ
Ruby I/Fは下層に依存しない
Rubyによる各種ツール
...
テストシステム
• Railsを利用したテストサーバ
• Rubyによる実行システム
• 判定条件を名前付けRubyクラスで記述
• テスト項目は判定条件とパラメータ
• →自動テスト可能に
今後
今後のRuby利用
• CANVAS Script– 続々と展開中、典型的利用方法もライブラリ化
• テストシステム開発
• 新規開発プロジェクトでもRuby採用– 複数言語のシステム
• C/C++ ~ 長く継続していたWindows App
• C#(.NET) ~ 新規作成Windows GUI App / クライアント
• Ruby ~ サーバ(Railsも利用)
• サーバ/Client間はSOAP
– Rubyにこだわっていない• ←→Rubyに価値がある証拠!
はじめに
自己紹介
会社紹介
事例紹介
導入まで
社内利用事例
謝辞
背景
ASFALIS
CANVAS Script
謝辞
名古屋Ruby会議Rubyの会
他Rubyに関わる皆様
Regional Ruby会議発案者
角谷信太郎さん
http://b.hatena.ne.jp/entry/twitter.com/suchi/statuses/
@Wikiばな Vol.7
http://wikibana.socoda.net/wiki.cgi?WikiBana%2fVOL.7
ところで角谷さんの翻訳された
最後にも要点を
製造業向けソフトで
Ruby採用
製造業向けソフト開発でも
Ruby活用
Good
名古屋はRubyデビューの地
開催おめでとうございます
以上
ご清聴ありがとうございました
付録
現実的なスクリプト例
• 1. 解析に丌要な微小部品を削除– ASFALISアダプタ(体積取得)
– アセンブリ編集コンポーネント(削除)
• 2. 解析失敗の原因となる部品間干渉を検証– 干渉チェックコンポーネント
– アセンブリ編集コンポーネント(削除)
• 3. 解析に丌適な形状削除– 形状簡略化コンポーネント(フィレット・段差削除)
– 干渉チェックコンポーネント(簡略化後の干渉チェック)
• 4. CAEツール向けにデータ修正しParasolidへ変換
– ASFALISアダプタ(ヒーリング/Parasolid形式へ変換)
フロー
A
A
B
B
スクリプト例(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')
スクリプト例(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'
スクリプト例(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]
スクリプト例(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