tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:LightningMessageのインストールを試してみました - Part 1

Lightning Experienceへの移行をする際にChatterメッセージが使えなくなるのが地味に障壁となっていました。Lightning ComponentでつくってあるChatterメッセージアプリがあれば解決するんだけどなと考えていたらそういうアプリを作ってくれている人が居たのを思い出しました。


README.mdにインストール方法も記載されています。
f:id:tyoshikawa1106:20170305184423p:plain

インストール手順

まずはgit cloneコマンドでソースコード一式をダウンロードします。
f:id:tyoshikawa1106:20170305184701p:plain


build-sample.propertiesをコピーしてbuild.propertiesを作成します。
f:id:tyoshikawa1106:20170305185135p:plain


DE組織あたりでパッケージを作成します。(たぶん。。)
f:id:tyoshikawa1106:20170305185206p:plain


lm.namespaceに作成したパッケージ名を入力。ユーザ名とパスワードにDE組織のログイン情報を入力します。
f:id:tyoshikawa1106:20170305185329p:plain


デプロイはantを利用します。Force.com移行ツールの出番です。


build.xmlは用意されています。後はコマンドを実行するだけです。
f:id:tyoshikawa1106:20170305185616p:plain

ant -Dpackage.xml=package.xml -f build.xml deploy


こんな感じ。
f:id:tyoshikawa1106:20170305185820p:plain


よくみるとエラーとなっていました。

Error: No COMPONENT named markup://LightningMessage:LightningMessageCmp found : [markup://c:LightningMessage]


やり方がよくなかったみたいです。ソースコードは取得できているので今回はgulp-jsforce-deployを使う方法で対応します。


git cloneしてソースコード一式取得した後にpkgフォルダにLightning Messageアプリのコードを格納します。
f:id:tyoshikawa1106:20170305191901p:plain


Set upに記載されているコマンドを実行して準備します。


デプロイコマンドはこんな感じ。

$ SF_USERNAME=username@example.com SF_PASSWORD=yourpassword gulp deploy


次のようなエラーがでたらnpm installでインストールすれば解決します。

Error: Cannot find module 'through2'


あとは次のエラーがでるかもしれません。

メインマークアップは空にできません。Lightning 定義バンドルを削除する場合は、代わりにバンドルを直接削除してください。


ソースコードで __namespace__と記述されている箇所があるのでc:とか除外とかすれば解決します。(antのときのエラーはこれが原因かな)
f:id:tyoshikawa1106:20170305192739p:plain



これでデプロイを実施できました。
f:id:tyoshikawa1106:20170305192847p:plain


試しにアプリケーションを開いてみると
f:id:tyoshikawa1106:20170305193721p:plain


どこか設定不足かもしれませんがエラーが。Lightning Componentの仕様は頻繁に変更されているのでそれが原因かもしれません。


antとかよくわからないまま試してみたのでどこか手順ミスがあったかもしれません。またエラーメッセージもちゃんと調べれば解決するかもしれないです。今回はそこまでやる予定はないのでここまで。Force.com移行ツールやgulp-jsforce-deployの使い方を久しぶりに思い出せて良かったです。

追記

antをつかったインストールの正しい手順を確認できたので追記しました。

SFDC:Salesforceの災害対策について

Salesforceは日本用のインスタンスでAP0が用意されています。災害発生などで長期間利用できない状態になった時にどのように対応されるかについてサクセスコミュニティで紹介されていました。災害対策用の専用AP0インスタンスが別に用意されていてリアルタイムで同期を取っているそうです。

Success Community


こういった情報の詳細は下記にまとめられているとのことでした。

Security

保護

f:id:tyoshikawa1106:20170304142048p:plain

SFDC:Spring'17 - 新しい一括処理ジョブページ

Spring'17 へのアップデートで新しい一括処理ジョブページが利用できるようになりました。

f:id:tyoshikawa1106:20170228215218p:plain

Apex 一括処理ジョブの状況監視


設定のApexジョブのページに行くとリンクが追加されています。
f:id:tyoshikawa1106:20170228215406p:plain


こちらが新しいジョブページです。
f:id:tyoshikawa1106:20170228215505p:plain


特定の一括処理クラスで [詳細情報] をクリックすると、次の情報を含む一括処理クラスの親ジョブが表示されるそうです。

  • 状況
  • 実行日と完了日
  • 各一括処理の経過時間
  • 一括処理された数
  • 一括処理に失敗した数


実行時に表示された内容です。
f:id:tyoshikawa1106:20170228215710p:plain


詳細リンクをクリックしたときの内容はこんな感じでした。
f:id:tyoshikawa1106:20170228215757p:plain


新しいジョブページはClassicとExperienceの両方で利用可能とのことです。

SFDC:Spring'17 - ApexテストのモックフレームワークStub APIを試してみました

Spring'17で正式リリースされたStub APIを試してみました。Apexテストで例外テストができる仕組みを用意できたりするみたいです。

f:id:tyoshikawa1106:20170228224932p:plain

Apex スタブ API を正式リリース


リリースノートだけではイマイチ使い方がわかりませんでしたが、Apex開発者ガイドでサンプルコードが紹介されていました。
f:id:tyoshikawa1106:20170228225143p:plain

Build a Mocking Framework with the Stub API

使い方概要

まずテスト対象のクラスとして下記処理を用意します。

public class DateFormatter {    
    // Method to test    
    public String getFormattedDate(DateHelper helper) {
        return 'Today\'s date is ' + helper.getTodaysDate();
    }
}


次のヘルパークラスに処理部分をもたせます。

public class DateHelper {   
    // Method to stub    
    public String getTodaysDate() {
        return Date.today().format();
    }
}


上記処理は以下のような書き方で呼び出すことができます。

DateFormatter df = new DateFormatter();
DateHelper dh = new DateHelper();
String dateStr = df.getFormattedDate(dh);


このように独立させた処理をスタブAPIをつかって効率よくテストできるみたいです。

試験のために、私たちは隔離したいです getFormattedDate()この方法は、フォーマットが正常に動作していることを確認します。の戻り値getTodaysDate()この方法は、通常、日によって異なります。ただし、この場合には、我々は、フォーマットに私達のテストを分離するために一定の、予測可能な値を返すようにしたいです。むしろこの方法が一定の値を返すクラスの「偽」のバージョンを書くよりも、私たちは、クラスのスタブバージョンを作成します。スタブオブジェクトは、実行時に動的に作成され、私たちはその方法の「スタブ」動作を指定することができます。

Apexクラスのスタブバージョンを使用するには:

  • 実装することで、スタブクラスの動作を定義します System.StubProvider インタフェース。
  • 使用してスタブオブジェクトをインスタンス化します System.Test.createStub() 方法。
  • テストクラス内からスタブオブジェクトの関連するメソッドを呼び出します。


StubProviderインターフェイスの実装します。implements System.StubProvider と宣言したテストクラスになります。

@isTest
public class MockProvider implements System.StubProvider {
    
    public Object handleMethodCall(Object stubbedObject, String stubbedMethodName, 
        Type returnType, List<Type> listOfParamTypes, List<String> listOfParamNames, 
        List<Object> listOfArgs) {
        
        // The following debug statements show an example of logging 
        // the invocation of a mocked method.
       
        // You can use the method name and return type to determine which method was called.
        System.debug('Name of stubbed method: ' + stubbedMethodName);
        System.debug('Return type of stubbed method: ' + returnType.getName());
        
        // You can also use the parameter names and types to determine which method 
        // was called.
        for (integer i =0; i < listOfParamNames.size(); i++) {
            System.debug('parameter name: ' + listOfParamNames.get(i));
            System.debug('  parameter type: ' + listOfParamTypes.get(i).getName());
        }
        
        // This shows the actual parameter values passed into the stubbed method at runtime.
        System.debug('number of parameters passed into the mocked call: ' + 
            listOfArgs.size());
        System.debug('parameter(s) sent into the mocked call: ' + listOfArgs);
        
        // This is a very simple mock provider that returns a hard-coded value 
        // based on the return type of the invoked.
        if (returnType.getName() == 'String')
            return '8/8/2016';
        else 
            return null;
    }
}


クラスのスタブバージョンをインスタンス化します。

public class MockUtil {
    private MockUtil(){}

    public static MockProvider getInstance() {
        return new MockProvider();
    }
    
     public static Object createMock(Type typeToMock) {
        // Invoke the stub API and pass it our mock provider to create a 
        // mock class of typeToMock.
        return Test.createStub(typeToMock, MockUtil.getInstance());
    }
}


これでテストクラスからスタブAPIを利用する準備ができました。次のようなテストの書き方ができます。

@isTest 
public class DateFormatterTest {   
    @isTest 
    public static void testGetFormattedDate() {
        // Create a mock version of the DateHelper class.
        DateHelper mockDH = (DateHelper)MockUtil.createMock(DateHelper.class);
        DateFormatter df = new DateFormatter();
        
        // Use the mocked object in the test.
        System.assertEquals('Today\'s date is 8/8/2016', df.getFormattedDate(mockDH));
    }
}


無事開発者ガイドのサンプルコードのテストを実行することができました。
f:id:tyoshikawa1106:20170228230941p:plain


開発者ガイドのサンプルでは任意のシステム日付をセットしてテスト実行できることを確認できます。DateHelperクラスの処理でDate.todayでシステム日付を取得しています。MockProviderクラスの30行目でテストデータ用に任意の値で疑似システム日付を準備していました。DateFormatterTestクラスの12行目でスタブAPIをつかって用意した疑似システム日付がただしく利用できていることをassert処理で確認しています。


StubProviderインターフェイスの実装は少しややこしそうですが、疑似システム日付を用意できるのはすごく便利そうです。また、疑似Exceptionなども実装することができればテストがやりやすくなると思います。

SFDC:Lightning Design SystemのProgress Indicatorを試してみました

Lightning Design SystemのProgress Indicatorを試してみました。普段画像などを用意して実装するプログレスバーをCSSとSVGで表現することができます。
f:id:tyoshikawa1106:20170226220955p:plain


バージョン2.1では正しく動作しなかったので現時点で最新の2.2.1で試してみました。
f:id:tyoshikawa1106:20170226212341p:plain

実装時の注意点

Lightning Design SystemのサイトにあるサンプルコードをVisualforceページで動かすと一つ目のマーカーの左側にスペースができてしまいます。
f:id:tyoshikawa1106:20170226213437p:plain


これはCSSでマージンを変更することで解決します。
f:id:tyoshikawa1106:20170226213631p:plain

f:id:tyoshikawa1106:20170226213818p:plain:w300

ol li {
    margin-left: 0;
}

※実際には他のCSSに干渉しないようにクラスやID指定を組み合わせます。


Progress Indicatorで各マーカーの下にラベルを表示したいときがあると思います。その場合はslds-is-relativeをつかって対応可能です。
f:id:tyoshikawa1106:20170226215216p:plain

f:id:tyoshikawa1106:20170226215340p:plain



モバイルレイアウトでも対応してくれる便利なCSSコンポーネントでした。

デモ動画

サンプルコード

SFDC:AppBuilderでChatterグループページのカスタマイズ

Spring'17からLightning ExperienceにChatterグループのカスタマイズ機能が追加されました。
f:id:tyoshikawa1106:20170219205934p:plain

リリースノート


f:id:tyoshikawa1106:20170219210025p:plain


他のページと同じようにLightning App Builderをつかってカスタマイズできます。Lightningコンポーネントを用意すれば自由に機能拡張を行えそうです。
f:id:tyoshikawa1106:20170219210309p:plain

SFDC:LEXでつかえるグループの活動情報表示

Lightning ExperienceではChatterグループのページにエンゲージメントタブが用意されています。こちらの機能をつかってグループの活動情報を表示できます。
f:id:tyoshikawa1106:20170219204428p:plain

リリースノート


f:id:tyoshikawa1106:20170219204507p:plain


投稿数や質問数、未回答のままの質問の件数まで確認することができます。
f:id:tyoshikawa1106:20170219204558p:plain


グループのページで確認できるので便利な機能だと思います。