2017年3月12日日曜日

Elixir初心者向けハンズオンに行ってきました

Elixir初心者向けハンズオンに行ってきました。

https://beam-lang.connpass.com/event/47050/

Elixirについては、随分前から興味はあったのですが、文法がRubyっぽいため、
あまり触ろうとは思っていなかったのでした。


内容としては、以下。

  • mixを使ってプロジェクト作成
  • cow_boyを使った簡単なHelloWorldを表示
  • PheonixのPubSub を使った簡易チャットツール

半日にしては十分な題材かなと。
表面的な手の動かし方としては、RoR系と同じなため、特に違和感なく。


言語仕様的な側面で感じたことは、抽象化の概念があまりない。
リストから要素を取り出す場合、リスト型のメソッドを呼び出すのではなく、リストから要素を取り出すユーティリティ(Enum)が存在する。

OTPの仕組みの部分は深く知っておくと色々他のところにも使えそうなので、調べてみたいなぁ。


今後調べてみようと思うキーワード
  • cow_boy
  • phoenix
  • Supervior
  • behaviours



ゲーム系のリアルタイム性&信頼性が要求されるところで結構使われているらしい。
こっち系は完全に無知になりつつあるなぁ。




EClassの識別を属性名name以外に設定する場合の注意点

 xtextのデフォルトのインスタンスの識別は属性名nameで判断している。
そのため、属性名name以外で判断したい場合は、変更する必要がある。

  • 対象 
    •  bindIQualifiedNameProvider 
      • QualifiedNameを解釈するための定義
      • デフォルトでは、DefaultDeclarativeQualifiedNameProviderを使っている。


  • 拡張方法
    • DefaultDeclarativeQualifiedNameProviderを継承したクラスを作成する。
    • QualifiedNameを取得する方法をname->別名に変更する 
    • MyDslRuntimeModule.xtendでbindするクラスをoverrideで変更する。


/*
 * generated by Xtext 2.9.1
 */
package org.xtext.example.mydsl

import org.eclipse.xtext.naming.IQualifiedNameProvider

/**
 * Use this class to register components to be used at runtime / without the Equinox extension registry.
 */
class MyDslRuntimeModule extends AbstractMyDslRuntimeModule {
  

 override Class bindIQualifiedNameProvider() {
  return MyDslQNP;
 }
 
}

MyDslQNP.java
package org.xtext.example.mydsl;

import org.eclipse.sirius.sample.basicfamily.Identifier;
import org.eclipse.xtext.naming.DefaultDeclarativeQualifiedNameProvider;
import org.eclipse.xtext.naming.QualifiedName;
 
public class MyDslQNP extends DefaultDeclarativeQualifiedNameProvider{
 
    QualifiedName qualifiedName(Identifier e) {
        return QualifiedName.create(e.getShortName());
    }
 
}


Outlineの表示もカスタマイズが必要になる。

MyDslOutlineTreeProvider


class MyDslOutlineTreeProvider extends DefaultOutlineTreeProvider {
 
 override protected _text(Object modelElement) {
  if( modelElement instanceof Identifiable){
   return (modelElement as Identifiable).shortName
  }
 }
 
}

2016年3月20日日曜日

ecoreからdslを作成する

 xtextの新規作成ウィザードで 「Xtext project from existing Ecore models」 を使った場合の手順及び注意点を残す


 DomainModelはsiriusのbasicfamilyを使用する。




model,edit,editorのprojectは下記zip参照

http://eclipse.org/sirius/doc/resources/getstarted/basicfamily.zip


 プロジェクト作成

  1. New > Xtext > 「Xtext Project from Existing Ecore Model」
  2. Select Epackages で「Add...」 でBasicfamilyPackageを選択、Entry Rule を「Family」 を選択
    1. 既存のgenmodelを選択し、含まれているEPackageをインポート
    2. Entry RuleはDSLの包含関係のトップのEClassを指定
  3. New Xtext Projectは、新規作成と同じ

 DSL作成

  1. generate 宣言を定義
    1. 新規作成では作成されるが、ecoreから作成だとgenerateが作成されないため、定義が必要
  2. トップのクラス定義
    1. 既存のecoreをインポートしただけだと、buildした時にxtext無いのpackageが空のため、例外packageにからのため、例外がでる。  
           Caused by: java.lang.IllegalStateException: Generated package 'mydsl' may not be empty.
           at org.eclipse.xtext.xtext.generator.XtextGeneratorLanguage$2.add(XtextGeneratorLanguage.java:346)
      
      

      dslの設定例
      // automatically generated by Xtext
      grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals
      
      generate mydsl "http://www.eclipse.org/sirius/sample/basicfamily2" 
      
      import "http://www.eclipse.org/emf/2002/Ecore" as ecore
      import "http://www.eclipse.org/sirius/sample/basicfamily"
      
      // ↓↓↓追加↓↓↓
      Root:                            
       family=Family            
      ;                                
      // ↑↑↑追加↑↑↑
  3. Generate Xtext Artifactを実行する
    mode/generated/xxxx.ecoreが指定したecoreと関連付いている 



    複数パッケージが定義されているecoreの場合


    上記以外に「GenerateMyDsl.mwe2」を修正する。

    module org.xtext.example.mydsl.GenerateMyDsl
    
    import org.eclipse.xtext.xtext.generator.*
    import org.eclipse.xtext.xtext.generator.model.project.*
    
    var rootPath = ".."
    
    Workflow {
    // ↓↓↓追加↓↓↓
     bean = org.eclipse.emf.mwe.utils.StandaloneSetup{                                                   
      registerGeneratedEPackage="org.eclipse.sirius.sample.basicfamily.BasicfamilyPackage"        
                    // 複数のEPackageを使用する場合には、StandaloneSetupを追加して、registerGeneratedEPackageに使用するEPackageのクラスを指定する。
                    // 単一の場合はgenmodelから解釈されるため、定義不要。
     }
    // ↑↑↑追加↑↑↑
    


    疑問点

    1.  既存のecoreをそのままDSLにすることが出来ないのかが調査できていない。 

2015年8月8日土曜日

Eclipse SirusのValidation & QuickFixについて

Eclipse SiriusのValidation & QuickFixの設定方法について

基本的に以下の2点をViewSpecificaionに設定するだけでよい。

  • ViewSpecification のDiagram にValidationを追加
  • Validation のSemanticsを設定

とりあえず、今回は以下のようなものを設定します。


  • ManクラスにParentのreferenceがない場合、エラー
  • QuickFixとして、Womanクラスを紐づける。

すごい適当な設定ですが、サンプルということで。

ViewSpecification のDiagram にValidationを追加            

Diagram を選択 > New Validation
Validation を選択 > Semantic Validation Rule 

Semantic Validation を選択して、以下を設定
設定項目設定内容説明
LevelERRORValidationでNGの時の警告レベル
TargetClassbasicfamily.ManValidationを実施する対象クラス

message
Parent is not setValidation NGのメッセージ



Validation のSemanticsを設定                     

Semantic Rule を選択  > Audit

Auditを選択して、以下を設定
設定項目設定内容説明
Audit[self.parents->size() > 0 /]Parentが1つ以上の条件




Semantic Rule を選択 > Fix
Fix を選択 > Begin > New Operaion > Set

Seを選択して、以下を設定
設定項目設定内容説明
FeaturemotherQuickFixで設定するFeature
Value Expression[self.eContainer().eAllContents()->filter(Woman)->first()/]featureに設定する内容
Womanクラスの最初のクラス




Diagramを開いて
  • Manノードを作成
  • DiagramのContext Menu > Validation Diagram 


 Problem Viewにエラー内容が表示される。



エラー内容を選択し、右クリックでQuickFixを選択


Quick Fix画面が出て、Quick Fixを選択して、Finishを押下














上記Value Expressionで指定した値が設定される。


■参考
http://melb.enix.org/sirius/validation/

2015年7月26日日曜日

Eclipse Siriusの簡単な使い(3)


セクションを追加                     

  • Defaultを選択 > New Tool > Section を選択
ダイアグラムにパレットが表示される。



ノードを追加                     

パレットからノード追加が行えるようにする。

  • Section選択 > New Element Creation > Node Creation
以下を設定する。
設定項目設定内容説明
IdcreateManID
LabeManパレットに表示するラベル
Node MappingManNode対応するノード


  • Begin 選択 > New Operation > Change Context を選択
以下を設定する
設定項目設定内容
Browse Expressionvar:container


  • Change Context 選択 > New Operation > Create Instance を選択
以下を設定する。
設定項目設定内容説明
ReferenceTypemembers設定するfeatureを指定する
Type Namebasicfamiy.Man対象のクラス
Variable Nameinstance変数名


  • Create Instance選択 > New Operation > Set を選択
以下を設定する

設定項目設定内容説明
Feature Namename設定するfeature
Value Expression['man'+container.eContents()->filter(Man)->size()/]設定する値


設定結果は以下キャプチャのようになる。


Womanノードを作成する場合も上記同様の設定を行う。



関連線を追加                    

パレットから関連が設定できるようにする。
まずは、fatherの関連を引く設定をパレットに表示する。
※ModelでいうとPersonクラスのFatherの属性を設定

  • Sectionを選択 > New Element > Edge Creation
設定項目設定内容説明
idnewEdgeID
LabelfatherEdgeパレットの表示名
EdgeMappingsfatherEdgeマッピングするRelation Base Edge



  • Beginを選択 > Change Context 
  • Change Context を選択 > New Operation > Set  を選択

設定項目設定内容説明
FeatureNamefatherFeature名
Value Expression[target/]fatherに設定する値を指定
今回だと、targetがFatherクラスになるので[target/]

設定結果は以下キャプチャのようになる。





ダイアグラムを表示すると、パレットに関連線を引くアイコンが表示されている。
fatherEdgetを選択して、WomanNodeまたはManNodeからManNodeに関連線を引くことができるようになる。






motherの関連を引く設定をパレットに表示の仕方は上記と同様のため、省略






ここまでが、4MinTutorial をの内容になります。



2015年6月25日木曜日

Eclipse Siriusの簡単な使い(2)

前回の引き続き 以下について説明。
  • ノードに画像の表示
  • WomanNodeの表示
  • 関連の線表示
  • ノード追加方法

ノードに画像を表示                         
  • my.project.designフォルダにiconsフォルダを作成
  • 下記画像をiconsフォルダに保存
    • https://wiki.eclipse.org/images/1/12/Man32.png
    • https://wiki.eclipse.org/images/b/bc/Woman32.png
  • ManNodeを選択
  • New Style > Workspace Image
    • ノードを画像で表示するように設定
タブ設定項目設定内容説明
GeneralWorkspacepath/my.project.design/icons/Man32.png表示するアイコンのパス
LabeShow Iconチェック解除ノードを表示する時に、アイコンを表示有無
Label Expressionfeature:nameラベル表示内容
Label Positionborderラベルの表示場所を境界にする


WomanNodeを表示                         
ManNodeと設定方法は同じ。そのため、画像は省略
  • DefaultLayer を選択
  • New Diagram Element > Node 
  • id: WomanNode
  • Domain Class: basicfamily.Woman
  • Semantics Candidate Expression: feature:members
  • Woman Node を選択
  • New Style > Workspace Image
  • Workspacepath : /my.project.design/icons/Woman32.png
  • Label  Show iconsチェックボックス解除
最終的に表示されるのは以下のようになる。


関連線の表示                         

  • 参照関係の線を定義するのも、ノードと同じような仕組みで定義が可能
  • Default Layerを選択
  • New Diagram Element > Relation Based Edge
  • id: fatherEdge
  • Source Mapping: ManNode ,WomanNode
    • 関連線のソースとなるノードを指定
  • Target Mapping ManNode
    • 関連線のターゲット(矢印の先)となるノードを指定
  • Target Finder Expression: feature:father
    • 関連線のターゲットとなるノードを見つける表現

ダイアグラムを表示すると、関連の線が表示される。

  • motherの関連線も上記同様に設定する。
  • Default Layerを選択
  • New Diagram Element > Relation Based Edge
  • id: motherEdge
  • Source Mapping: ManNode ,WomanNode
    • 関連線のソースとなるノードを指定
  • Target Mapping WomanNode
    • 関連線のターゲット(矢印の先)となるノードを指定
  • Target Finder Expression: feature:mother
    • 関連線のターゲットとなるノードを見つける表現

  • 線の色等を変更したい場合
    • Edge Style solidを選択して、Color > Stroke Colorで変更可能

ノード追加                               


ダイアグラムからノードを追加する方法
  • Default Layerを選択
  • New Tool >  Section

  • New Element Creation > Node Creation


  • id: createMan
  • Label:Man
  • Node Mapping: ManNode


  • Beginを選択
  • New Operation > Change Context


  • Browser Expression: var container
  • Change Contextを選択
  • New Operation > Create Instance
  • Reference Name : members
  • Type Name : basicfamily.Man
  • variable Name : instance

  • Create Instance を選択
  • New Operation > Set


  • Feature Name : name
  • Value Expression : ['man'+container.members->filter(Man).size()/]
  • ダイアグラムにセクションが表示される。
  • Manを選択して、ダイアグラムにD&Dするとインスタンスが作成される。



WomanNodeを追加する方法はManNodeの追加方法と全く同じ。
基本的に上記のManをWomanに変更するのみ。

次回:
 ダイアグラムで関連付けする方法。

2015年6月14日日曜日

Eclipse Siriusの簡単な使い方

数回に分けて、4MinTutorial を簡単にまとめてみます。
そこから、徐々に4MinTutorialに記述されていない機能を追加していく予定です。
Sirisuのハンズオンをやるときの参考資料になればよいかなと。

まずは、Siriusを扱うときの基本的な流れ

  1. Domain Modelの作成
    • 作成するDomainModelを定義
  2. Viewpoint Specificationの作成
    • DomainModelをどのようにDiagramで操作(表示)させるかを定義
  3. モデル作成
    • 扱うモデルを作成
  4. Viewpointsとモデルの紐付け
    • モデルにViewpointsを紐付け
  5. Diagramの作成
    • 実際にモデルを表示するダイアグラムを作成
今回はダイアグラムに限定するが、Tree,Table,Sequenceなども作成可能。

1.Domain Modelの作成                             

今回作成するDomain Modelは4MinTutorial のbasicfamily




  • 新しいruntimeを起動
    • DomainModelのプラグインが入ったruntimeが起動された。





2.ViewSpecificationの作成                          

  • SiriusのPerspectiveを指定する。
  • Viewpoint Specification Projectを作成する。

  • project Name : my.project.design で作成する。

  • プロジェクト作成完了後、Sirius Specification Editorが開かれる。
  • projectを選択して、viewpointを作成する





  • id: persons を設定
  • Model file Extension: basicfamily を設定
    • 連携するモデルの拡張子
  • New Presentation > Diagram Description を選択





  • id : Persons Diagram
    • diagramのIDを設定
  • Domain model: basicfamily.Family
    • DiagramのDomainModelを指定


  • New Diagram Element > Default Layer を指定する。










  • New Diagram Element > Node を指定する。
  • 以下を設定する

  • 設定項目設定内容説明
    IdManNode識別子
    Domain Classbasicfamily.Manノード表示する対象のクラス
    Semantic Candidate Expressionfeature:membersノード表示するときの候補









    • ノードのスタイルを指定する。
    • New Style > Squre



    •  Color light_blue




    • 3.Modelの作成                             

      • Modeling Projectでプロジェクトを作成
      • Project Name : basicfamily.sample
      • New >Others > Example EMF Model Creation Wizards > Basicfamily Modelを選択
      • 以下で作成
        • File name: デフォルト
        • Model Object: Family 

      • 適当にモデルを作成する。


      4.Viewpointsとモデルの紐付け                         

      • Modeling Projectにviewpointsを紐づける
      • personsにチェックを入れてOKにする。


      • Create Presentation を選択する。
      • Person Diagramを選択する。
      • Diagramを作成するDomain Modelを選択する。
      • Diagramの名前を指定する。





      • ManNodeが表示されているダイアグラムが表示される。


      長くなったので、ここまで。
      次回は画像の表示、WomanNodeの表示、関連線、ノード作成の方法を解説