Salesforce開発の基礎編5
Apex の基礎とデータベース
Apex の使用開始
まぁJava書いてたら特に問題なくやれる。言語仕様は体感 Java1.42 位の印象(1.4 よりはマシ?だが5の様なGenericsなどは存在しない)。
ローカルコンパイルできず、Salesforce 組織上でしかコンパイル/実行できない。
Apex の特徴的な機能として
- クラウド開発 (Apex はクラウドで保管、コンパイル、および実行されるため)
- トリガ (データベースシステムのトリガと類似)
- 直接データベースコールが可能なデータベースステートメントと、データのクエリと検索を行うためのクエリ言語
- トランザクションとロールバック
- global アクセス修飾子 (public 修飾子よりも権限が高く、名前空間とアプリケーションの全体でアクセスが可能)
- カスタムコードのバージョン管理
サンプルのコードは非常にうれしい作りではあるのでここでも転記。
Java だとメールサーバに接続して…なんて色々やるけど、そういった内容はすべて Salesforce にビルトイン。
こういう所は楽っちゃ楽
public class EmailManager { public void sendMail(String address, String subject, String body) { Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage(); String[] toAddresses = new String[] {address}; mail.setToAddresses(toAddresses); mail.setSubject(subject); mail.setPlainTextBody(body); Messaging.SendEmailResult[] results = Messaging.sendEmail( new Messaging.SingleEmailMessage[] { mail }); inspectResults(results); } private static Boolean inspectResults(Messaging.SendEmailResult[] results) { Boolean sendResult = true; for (Messaging.SendEmailResult res : results) { if (res.isSuccess()) { System.debug('Email sent successfully'); } else { sendResult = false; System.debug('The following errors occurred: ' + res.getErrors()); } } return sendResult; } }
基本はこっから起動して
クラスを追加
クラス名は StringArrayTest
答えを書いても仕方ないのでテスト内容の翻訳
StringArrayTest
というクラスでpublic
で作りますpublic static
なメソッドgenerateStringArray
を作成しますgenerateStringArray
の仕様はInteger
型の引数List<String>
型の返値型- 引数の値によって
Test 0
,Test 1
... の様な値を返します。
sObject の使用
Salesforce のデータベースはすべてオブジェクト、Apex 的には sObject
型です。
全てのオブジェクトには Id
フィールドがあり、プライマリキーです。型も ID
型で、18文字 String 値が入ってます。
sObject は Salesforce開発の基礎編2 - 技術をかじる猫 このデータモデリング参照。
クエリもソース内でこんな風に書ける
List<Account> values = [SELECT Id, Name FROM Account WHERE Name LIKE 'Test%'];
DML を使用したレコードの操作
DML ってのは、要するにレコード操作
insert, delete, update, upsert, undelete, merge
でデータを色々いじれる。
Account acct = new Account(Name='Acme', Phone='(415)555-1212', NumberOfEmployees=100); insert acct;
insert
や upsert
した直後に Id
フィールドにだけ値が設定される。
数式項目は insert
が完了したときに埋められる…のだけど、insert
に使ったオブジェクトには入らないので、select
しなおさないといけない。
upsert
は insert
としても update
としても使えるコマンドで、merge
は最大 3 レコードを 1 レコードに自動マージして既存レコードを削除して保存される。
一応データベース操作はメソッドでもできる。
Database.insert() Database.update() Database.upsert() Database.delete() Database.undelete() Database.merge()
問題はこんな内容
AccountHandler
クラスを作成しますpublic
でね- 以下の仕様を満たす
public static
なinsertNewAccount
メソッドを作ります- 引数に
String
を受け取り、Account オブジェクトを作成、Account.Name
に設定します。 - 作ったら
Account
をinsert
し、return
する。 - 引数では空文字も受付け、保存に失敗したら
null
を返します。
- 引数に
SOQL クエリの作成
ソース中にクエリが書ける仕様の演習課題。
public class ContactSearch
を作成してくださいpublic static
なメソッドsearchForContacts
を定義します。- 二つの
String
パラメータを受け取ります Contact
を検索します。第一引数はLastName
とマッチさせ、第二引数はMailingPostalCode
と一致検索します。- 最終的に
List<Contact>
を return します。SELECT 内容は Id, Name です。
- 二つの
ニューロンと過学習の割合を観察する
検証内容
アルゴリズムと過学習の関係をざっくり記載する。
設定は以下の感じ
img_size = 8 n_mid = 32 n_out = 10 eta = 0.001 epochs = 301 batch_size = 32 interval = 10
因みにCNNの特徴抽出はせず、あくまでニューロンでの判定のみで行う。
中間層ニューロンを 32 個、バッチサイズ 32 で、エポック 301 回。
単純にニューロン食わして処理するとこんな感じ。
時間経過で誤差が広がる(過学習)が起きてるというよりは、単純にこのアルゴリズムでは精度が上がらないという事かもしれない。
AdaGrad アルゴリズムを適用するとこんな感じ
学習係数に圧がかかってくるので、学習自体が遅くなる。
それによって学習が収束するのがかなり遅くなり、300 回程度では良い結果にならなかった。
ドロップ層を追加したのかこんな感じ
ニューロンの学習が確立的になるので、学習が微妙にガクガクする。
AdaGrad を使うべきかどうかは状況によるのかもしれない。
両方適用するなら、学習回数を更に増やす必要がありそう。
続きを読む
ストレスに関する対策の論文とかを調べてみた
日常でできるストレス対策。
- 緑茶: 含まれるテアニンには向精神作用があります。
https://www.taiyokagaku.com/lab/column/07/
http://www.jsbmg.jp/products/pdf/BG35-4/35-4_9-15.pdf - 背筋を伸ばす: 幸福感を発生させます(コロンビア大学とハーバード大学の共同研究
https://www.lifehacker.jp/2017/08/170805_straighten-your-back-to-be-happy.html - 音楽を聴く: 不安レベルの低下が確認されています(論文
https://repository.kulib.kyoto-u.ac.jp/dspace/bitstream/2433/49406/1/16_89.pdf - 笑う: ストレス反応が大幅に下がります(論文
https://www.jstage.jst.go.jp/article/warai/10/0/10_KJ00000803466/_article/-char/ja/ - パートナーとのハグ: オキシトシン(通称愛情ホルモン)。ソロは(TT) 論文
https://ci.nii.ac.jp/naid/130004857151 - ペットをハグ: 上記と同じ効果(ペット飼いたいな…)(論文
https://www.jstage.jst.go.jp/article/janip/advpub/0/advpub_67.1.1/_pdf - スポーツ(ないしは筋トレ): 体を動かすのはストレス解消になる
https://www.jstage.jst.go.jp/article/jspeconf/41A/0/41A_25/_article/-char/ja/
因みに以前「読書」とは言われてたのだけど、論文を見つけることができなかった。
イギリスの方のニュースで広まったらしく
でもサセックス大学で研究があるとしか言ってない(要するに論文ではなかった)。
まぁ読書自体は良い事なので特に否定する気も起きないのですが…
因みに、ストレスが増えるとカリウムが不足するらしい。
ただしこれも論文見つけれなかった
ベクトルの画像的表示(練習)
ベクトルプロットの練習がてらベクトルの計算
まずは単純にベクトル表示
import numpy as np import matplotlib.pyplot as plt plt.figure() LX, LY=5,5 # ベクトルの plt.quiver(0, 0, 2.5, 1, angles='xy', scale_units='xy', scale=1) plt.xlim([-LX,LX]) plt.ylim([-LY,LY]) plt.grid() plt.draw() plt.show()
なるほどこんな感じでプロットするのか
複数ベクトルの表示は
plt.figure() # ベクトルを行列で表示 X1 = [0, 1, 2] Y1 = [0, 0, 0] U = [0.5, 0.25, -0.5] V = [0.25, 0.5, -0.25] # ベクトルの plt.quiver(X1, Y1, U, V, angles='xy', scale_units='xy', scale=1) plt.xlim([-1, 3]) plt.ylim([-1, 3]) plt.grid() plt.draw() plt.show()
癖が強い…w
因みに矢印の長さは=L2 ノルムって事らしい
仮に以下の様に指定すると
と仮定したとき、 は
plt.figure() # ベクトルを行列で表示 X1 = [0, 0, 2] Y1 = [0, 0, 3] U = [3, 2, 1] V = [8, 3, 5] # ベクトルの plt.quiver(X1, Y1, U, V, angles='xy', scale_units='xy', scale=1) plt.xlim([-1, 5]) plt.ylim([-1, 10]) plt.grid() plt.draw() plt.show()
こんなイメージになると。
ベクトルの引き算 とすると
plt.figure() # ベクトルを行列で表示 # a, b, a-b X1 = [0, 0, -1] Y1 = [0, 0, -5] U = [2, -1, 3] V = [3, -5, 8] # ベクトルの plt.quiver(X1, Y1, U, V, angles='xy', scale_units='xy', scale=1) plt.xlim([-2, 4]) plt.ylim([-6, 4]) plt.grid() plt.draw() plt.show()
この一番長いヤツが引き算結果のベクトルらしい
ベクトルの内積…ってどう書くんだ?とおもったら公式があった。
ってことで ベクトル間の開き角度ってことになるようだ
plt.figure() # ベクトルを行列で表示 # a, b X1 = [0, 0] Y1 = [0, 0] U = [2, 1] V = [3, 5] # ベクトルの plt.quiver(X1, Y1, U, V, angles='xy', scale_units='xy', scale=1) plt.xlim([-1, 3]) plt.ylim([-1, 6]) plt.grid() plt.draw() plt.show()
要するにこの角度
Salesforce開発の基礎編4
- 適切な自動化ツールを選択する
- 「Salesforce フロー」(製品名)には「プロセスビルダー」と「フロービルダー」の二つがある。
- プロセスビルダー: レコード作成/更新/プラットフォームイベント発生で起動。バックグラウンドで関連レコードの操作やメール送信、他タスクのスケジュールなどができる。
- レコードの更新やフェーズなどが更新に付随してデータを更新する場合、上記イベント起因でタスクを作成する場合
- フロービルダー: ユーザのボタン操作や、レコードの作成/更新、プラットフォームイベント発生時、定期実行などで起動。画面操作などでウィザードを作ったり、プロセスビルダーの様にレコード操作などいろいろできる。
- 入力ウィザードが欲しい場合、レコードの更新やフェーズなどが更新に付随してデータを更新する場合、上記イベント起因でタスクを作成する場合
- プロセスビルダー: レコード作成/更新/プラットフォームイベント発生で起動。バックグラウンドで関連レコードの操作やメール送信、他タスクのスケジュールなどができる。
- 両ビルダーの機能は Apex コードで機能追加できる。
- 「Salesforce フロー」(製品名)には「プロセスビルダー」と「フロービルダー」の二つがある。
- プロセスビルダーを使用してシンプルなビジネスプロセスを自動化する
プロセスビルダーを実際に使ってみるハンズオン。プロセスビルダーの画面の使い方などを説明しています。
因みに画像は答えじゃないので、移されても課題を解ける保証しません
- Flow Builder でユーザをガイドしてビジネスプロセスを進める
こっちは Flow Builder のチュートリアルハンズオン。
- 承認でレコードが承認される方法をカスタマイズする
初めて言及される承認プロセスのカスタマイズ。これは Salesforce フローではない。
こんな感じで進めていけばいい。
ただしこの文言には注意
Before You Start In the Account object, check the Type field’s picklist values for Prospect, Customer, and Pending. Add any of these values that are missing.