概要 本記事では、Mavenで実行可能なJARファイルを簡単にビルドして作成する方法を記載します。ローカルで実行するようなツール等をJavaで作成する際には、JARファイルをコマンドもしくはダブルクリックで実行可能になるので参考にしていただければと思います。 プロジェクトの作成 mvnコマンドでJavaプロジェクトのスケルトンを作成します。 maven-assembly-plugin maven-assembly-pluginは、プロジェクトの出力をその依存関係、モジュール、ドキュメント、およびその他のファイルと共に単一の配布可能なアーカイブにまとめることを可能にします。今回は、JARファイルの形式でアーカイブしたいので、jar-with-dependenciesを指定します。また、<archive>の<manifest>で実行クラスのパスを指定します。追加で<appendAssemblyId>をfalseに設定しています。そうしないと、作成されるjarファイルに-jar-with-dependenciesが最終的な名前に追加されてしまいます。下記をpom.xmlファイルに記載します。 maven-dependency-plugin maven-dependency-pluginのcopy-dependenciesを使用することで、プロジェクトの直接の依存関係とオプションで推移的な依存関係のリストを取得し、それらを指定された場所にコピーします。下記をpom.xmlファイルに記載します。 サンプル Githubに本記事のサンプルを格納しています。cloneして、mvn packageすることでJARファイルを作成できます。https://github.com/yhayashi30/maven-jar-sample 参考 Apache Maven Assembly Pluginhttp://maven.apache.org/plugins/maven-assembly-plugin/Apache Maven Assembly Plugin Usagehttp://maven.apache.org/plugins/maven-assembly-plugin/usage.htmlApache
Continue readingプラットフォームイベントとは
概要 本記事ではSalesforceのプラットフォームイベントについての概要や使用方法を簡単に整理します。 イベント駆動型アーキテクチャ イベント駆動型アーキテクチャとは、イベントプロデューサ/イベントコンシューマ/イベントバスから構成されます。イベントプロデューサは、イベント発生時の情報を取得してイベントバスにメッセージとして転送します。転送されたメッセージは、プロデューサとは非同期にイベントコンシューマで受信して処理を実行します。従来の要求-応答通信モデルでは、Webシステムやデータベースに要求を実行して同期で応答を受信していました。したがって、応答するWebシステムやデータベースの可用性に依存していました。イベント駆動型アーキテクチャの使用用途は、外部システムとのインテグレーション等で別トランザクションで非同期に処理を実行したいような場合かと思います。そして、プラットフォームイベントは、Salesforce Platform上でイベント駆動型アーキテクチャを実現する機能となります。 https://developer.salesforce.com/docs/resources/img/ja-jp/220.0?doc_id=images%2Fsalesforce_event_bus.png&folder=platform_events カスタムプラットフォームイベントの定義 カスタムプラットフォームイベントは、カスタムオブジェクト(sObject)と同じように定義することができます。また、カスタムオブジェクトと同様に作成したプラットフォームイベントには、カスタム項目を追加することができます。ただし、レイアウトやLightningレコードページで表示することはできません。プラットフォームイベントのAPI参照名のサフィックスは、__eとなります。(通常のカスタムオブジェクトでは、__cとなる部分です。)例) event__e みたいな感じです。 プラットフォームイベントの公開 上記で定義したプラットフォームイベントに対してレコードを作成することがイベントの公開になります。公開するための方法は以下のいずれかとなります。イベント駆動型アーキテクチャでいうと、イベントプロデュースにあたります。 プロセスビルダー フロー Apex API(SOAP API/REST API/Bulk API etc)
Continue readingFlowからApex呼び出し
概要 宣言的型の開発(UIベースでの実装)であるFlowからApex(プログラムベースでの実装)を呼び出して実行するプログラムの実装方法を記載します。特にApexの呼び出しで複数のパラメータを引数として渡したいパターンについて整理します。 InvocableMethod アノテーション まず、Flowから呼び出すApexクラスのメソッドには、InvocableMethodアノテーションをつけて、staticでpublicまたはglobalで宣言します。InvocableMethodアノテーションをつけたメソッドは、クラスに1つのみが宣言可能となります。 InvocableVariable アノテーション InvocableMethodのメソッドで入力もしくは出力のクラス変数のパラメータを定義する際には、InvocableVariable アノテーションを使用します。なので、InvocableMethodのメソッドで複数のパラメータを渡したい場合等には、入力用のクラスを宣言して、そのクラス変数としてInvocableVariableアノテーションをつけます。 サンプル サンプルでは、複数の取引先と親ケースのIDと件名をFlow等から呼び出しの引数として渡して、それらに紐付けたケースを一括作成するような処理を行なっています。 参考 InvocableMethod アノテーションhttps://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_annotation_InvocableMethod.htm InvocableVariable アノテーションhttps://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_annotation_InvocableVariable.htm
Continue reading【JavaScript】関数スコープとブロックスコープ
概要 ES6以前は、JavaScriptの変数はvarで宣言することのみが可能でした。ES6以降はletとconstを加えて、3種類で変数を宣言することが可能となりました。本記事では、これらを使って宣言した変数が関数スコープとブロックスコープでどのような違いがあるかを記載します。 関数スコープ 関数内でvarを使用して宣言した変数は、関数外で使用するとエラーとなります。 ブロックスコープ ifやfor等のブロック内でvarを使用して宣言した変数は、ブロック外で使用してもエラーとならず、そのまま使用することができてしまいます。 letやconstを使用した場合 ES6以降で登場したletやconstを使用することで上記のような関数スコープとブロックスコープの差をなくすことができます。※ 本記事ではletとconstの違いは触れません。簡単にいうと上書きできるかできないかです。 関数スコープ ブロックスコープ 参考 The Difference Between Function and Block Scope in
Continue readingSalesforce CLIを整理してみた
概要 本記事は、Salesforce CLIで使用可能なコマンドを整理したものとなります。筆者が気になったコマンドついては、個別に実行してどのような結果となるかを試してみました。ただし、これらのコマンドは毎リリースで仕様が更新されているので最新情報は下記のURLで確認してください。https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference.htmなお、本記事に記載の情報は、summer’19(Ver46)時点のものとなります。 コマンド整理 alias Commands alias:list CLIのコマンドで使用できる別名をリスト表示 alias:set CLIのコマンドで使用できる別名を設定 sfdx force:alias:listローカルで使用しているユーザIDに対する別名をリストで確認することができます。sfdx force:alias:set YourAlias=username@example.com別名を設定することもできます。 apex Commands apex:class:create Apexクラスの作成 apex:execute Apexクラスの実行
Continue readingSOQLの基礎
概要 本記事では、SOQLの基礎的な事項を実行のサンプルコードをベースにして整理しております。まずSOQLとは、Salesforce Object Query Languageの略であり、データベース(オブジェクト)から必要となるデータを取得する際に利用するものとなります。一般的なSQLとの違いは、いくつかありますが一つはSQLでは複数のテーブルを自由に条件指定することで結合してデータを抽出することができますが、SOQLではオブジェクト同士にリレーションがある場合にのみ結合することができます。また、SQLの’UPDATE’や’DELETE’のようなDMLはSOQLでは使用できないので、Apexで実行する必要があります。 Apexの中でSOQLを実行する2つの方法(静的SOQL、動的SOQL)から紹介します。 静的SOQL(インラインSOQL) Apexでは[ ]句によって、静的なSOQLを記載することができます。[ ]句の中では、 下記のようにバインド変数を使用することで条件を指定できます。 動的SOQL Apexの処理の中で実行するSOQLを動的に編集することができます。実行するSOQL文をStringでDatabase.queryに渡すことができます。SOQLの中で一つのレコードの取得に限定しているのであれば、sObjectで受けることができます。 複数件以上のレコードを取得するのであれば、sObjectのリストで受けます。 サンプルは下記の通りとなります。 また、バインド変数を使用しない例では下記のようにSOQL文を組み立てることもできます。 SOQLの構文(演算子) SOQLで使用することができる各構文(演算子)を記載していきます。 =(等号) >,<,>=,<=(不等号)
Continue reading【JavaScript】==と===の違いおよび型のチェック方法
概要 本記事では、JavaScriptにおける比較演算子の==と===の違い、および変数の型をチェックする方法を記載します。 ==と===の違い ==と===の違いとしては、簡単に言うと===の方が値だけでなく型まで含めて等しいかをチェックするのに対して、==では暗黙的な型変換により型を合わせた上で等しいかをチェックするという部分になります。下記に具体例を記載します。 また、別の記事で記載しておりますがJavaScriptの暗黙的な型変換は少し特殊な変換がなされるため、==を使用した場合には想定外にtrueに判定される時があります。 暗黙的な型変換についての詳細はこちらを参照。 したがって、JavaScriptのロジックにおける比較演算子は===を使用して厳格にすることが推奨されます。ただし、上記のような仕様を理解して上で==を使用するのは全く問題ないと思います。 型のチェック方法 JavaScriptの型をチェックする1つの方法は、typeofを使用することで、変数の型を返すのでそれを元にチェックすることができます。もう1つは、instanceofを使用することで、変数が指定する型と等しいかをチェックすることができます。それ以外にも型によって使えるものがあったり、typeofとinstanceofが使えるかも異なるので下記を参考にしてください。 String Number Array Function Object Nullとundefined Boolean Error Date Symbol まとめ
Continue readingSpring’19の認定資格を更新
概要 本記事は、Salesforceに置けるSpring’19のリリース内容について各種認定資格を更新するためのTrailheadで学習したもののサマリとなります。なお、更新を行ったのは、下記の3つの認定資格となります。アドミニストレーター認定資格の更新 (Spring’19)https://trailhead.salesforce.com/ja/content/learn/modules/administrator-maintenance-spring19Platform アプリケーションビルダー認定資格の更新 (Spring ’19)https://trailhead.salesforce.com/ja/content/learn/modules/platform-app-builder-maintenance-spring19Platform デベロッパー資格の更新 (Spring ’19) https://trailhead.salesforce.com/ja/content/learn/modules/platform-developer1-maintenance-spring19 アドミニストレーター セールスプロセス全体のカスタマイズ リードと商談のフェーズをカスタマイズできるため、リードがどこでどのように商談に変更されたかを確認できる。 Lightning Experience の結合レポート 最大 5 つのブロックを含めた結合レポートを使用して、さまざまな種類の情報を 1
Continue readingVSCodeでSalesforceのPackage.xmlを作成
概要 本記事では、VSCodeのExtensionを使うことでSalesforceの対象組織のメタデータを抽出するのに必要となるPackage.xmlを作成する方法を記載します。 Extension 使用するExtensionは下記になります。なので、まずはこれをVSCodeにインストールします。Salesforce Package.xml Generator Extension for VS Codehttps://marketplace.visualstudio.com/items?itemName=VignaeshRamA.sfdx-package-xml-generator Usage SFDXのプロジェクトを作成 コマンドパレット(Cmd+Shift+P)を開き、 SFDX: Create Project with Manifestを実行します。下記のように空のプロジェクトが作成されます。 SFDXで対象の組織を認証 コマンドパレット(Cmd+Shift+P)を開き、
Continue reading【JavaScript】暗黙的、明示的な型変換
概要 JavaScriptの型変換には、暗黙的と明示的があります。具体的には、Number(value)のような関数が明示的な変換にあたります。暗黙的な変換は、異なる型をオペランドでつなぐ処理でどちらかの型に合わせるように変換するようなものとなります。例えば、Stringは数値を期待されるような場合にはNumber型に変換されます。なので、JavaScriptでは型の不正による予期せぬエラーはほとんどの場合で回避されます。 ===と==の違い ===を使って比較すると、暗黙的な変換はせずに型も含めた比較になります。逆に==の比較では、必要に応じて暗黙的な変換をした上で比較を行います。実際に比較をしてどのようになるかは、下記のテーブル表が参考になります。https://dorey.github.io/JavaScript-Equality-Table/ StringとNumber オペランドによりStringからNumberに暗黙的に変換される処理は、Number関数で変換するのと同じプロセスになります。Number関数は、数字を含むStringであれば正しく変換されますが、数字ではない文字列である場合は、NaN(not a number)を返します。Stringに明示的に変換する場合にはString関数を使用します。 オペランドが-, *, /, %の場合には、Stringは暗黙的にNumberに変換されますが、+の場合にはNumberがStringに変換されるような挙動となります。 Boolean型と空文字列をNumberに変換すると下記のようになります。 Boolean Booean型の変換では、下記の値がJavaScriptではfalseとなります。ちなみに、ifやelse ifの比較や||,&&の演算子があると必要に応じて暗黙的の変換が行われます。 逆に下記がtrueに変換されるものとなります。 Object(Array含む) Object型は、暗黙的な変換では[object Object]という文字列に変換されます。Object型はtoString()を継承しており、暗黙的な変換ではこれが呼び出されます。なので、ObjectのtoString関数を上書きすることで、適切な文字列を返すようにすることができます。また、数値への変換の場合には、valueOf()を継承することで変換時に呼び出されるようにもできます。
Continue reading