技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

Salesforce開発の基礎編5

trailhead.salesforce.com

Apex の基礎とデータベース

Apex の使用開始

まぁJava書いてたら特に問題なくやれる。言語仕様は体感 Java1.42 位の印象(1.4 よりはマシ?だが5の様なGenericsなどは存在しない)。
ローカルコンパイルできず、Salesforce 組織上でしかコンパイル/実行できない。
Apex の特徴的な機能として

サンプルのコードは非常にうれしい作りではあるのでここでも転記。
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;
    }
}

基本はこっから起動して
f:id:white-azalea:20210524200351p:plain

クラスを追加
f:id:white-azalea:20210524200533p:plain

クラス名は StringArrayTest
f:id:white-azalea:20210524200615p:plain

答えを書いても仕方ないのでテスト内容の翻訳

  • 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;

insertupsert した直後に Id フィールドにだけ値が設定される。
数式項目は insert が完了したときに埋められる…のだけど、insert に使ったオブジェクトには入らないので、select しなおさないといけない。

upsertinsert としても update としても使えるコマンドで、merge は最大 3 レコードを 1 レコードに自動マージして既存レコードを削除して保存される。
一応データベース操作はメソッドでもできる。

Database.insert()
Database.update()
Database.upsert()
Database.delete()
Database.undelete()
Database.merge()

問題はこんな内容

  • AccountHandler クラスを作成します public でね
  • 以下の仕様を満たす public staticinsertNewAccount メソッドを作ります
    • 引数に String を受け取り、Account オブジェクトを作成、 Account.Name に設定します。
    • 作ったら Accountinsert し、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 回。
単純にニューロン食わして処理するとこんな感じ。

f:id:white-azalea:20210523220708p:plain

時間経過で誤差が広がる(過学習)が起きてるというよりは、単純にこのアルゴリズムでは精度が上がらないという事かもしれない。
AdaGrad アルゴリズムを適用するとこんな感じ

f:id:white-azalea:20210523220913p:plain

学習係数に圧がかかってくるので、学習自体が遅くなる。
それによって学習が収束するのがかなり遅くなり、300 回程度では良い結果にならなかった。
ドロップ層を追加したのかこんな感じ

f:id:white-azalea:20210523222406p:plain

ニューロンの学習が確立的になるので、学習が微妙にガクガクする。
AdaGrad を使うべきかどうかは状況によるのかもしれない。

両方適用するなら、学習回数を更に増やす必要がありそう。

f:id:white-azalea:20210523222234p:plain

続きを読む

ストレスに関する対策の論文とかを調べてみた

日常でできるストレス対策。

  1. 緑茶: 含まれるテアニンには向精神作用があります。  https://www.taiyokagaku.com/lab/column/07/
    http://www.jsbmg.jp/products/pdf/BG35-4/35-4_9-15.pdf
  2. 背筋を伸ばす: 幸福感を発生させます(コロンビア大学ハーバード大学の共同研究
    https://www.lifehacker.jp/2017/08/170805_straighten-your-back-to-be-happy.html
  3. 音楽を聴く: 不安レベルの低下が確認されています(論文
    https://repository.kulib.kyoto-u.ac.jp/dspace/bitstream/2433/49406/1/16_89.pdf
  4. 笑う: ストレス反応が大幅に下がります(論文
    https://www.jstage.jst.go.jp/article/warai/10/0/10_KJ00000803466/_article/-char/ja/
  5. パートナーとのハグ: オキシトシン(通称愛情ホルモン)。ソロは(TT) 論文
    https://ci.nii.ac.jp/naid/130004857151
  6. ペットをハグ: 上記と同じ効果(ペット飼いたいな…)(論文
    https://www.jstage.jst.go.jp/article/janip/advpub/0/advpub_67.1.1/_pdf
  7. スポーツ(ないしは筋トレ): 体を動かすのはストレス解消になる
    https://www.jstage.jst.go.jp/article/jspeconf/41A/0/41A_25/_article/-char/ja/

因みに以前「読書」とは言われてたのだけど、論文を見つけることができなかった。
イギリスの方のニュースで広まったらしく

www.comvita.com

でもサセックス大学で研究があるとしか言ってない(要するに論文ではなかった)。
まぁ読書自体は良い事なので特に否定する気も起きないのですが…

因みに、ストレスが増えるとカリウムが不足するらしい。
ただしこれも論文見つけれなかった

www.lbv.jp

ベクトルの画像的表示(練習)

ベクトルプロットの練習がてらベクトルの計算
まずは単純にベクトル表示

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()

f:id:white-azalea:20210520205446p:plain

なるほどこんな感じでプロットするのか
複数ベクトルの表示は

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()

f:id:white-azalea:20210520205539p:plain

癖が強い…w

因みに矢印の長さは=L2 ノルムって事らしい


\parallel a \parallel

仮に以下の様に指定すると


a = (2, 3)^T \\
b = (1, 5)^T

と仮定したとき、  a+b

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()

f:id:white-azalea:20210520205730p:plain

こんなイメージになると。
ベクトルの引き算  a-b とすると

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()

f:id:white-azalea:20210520205838p:plain

この一番長いヤツが引き算結果のベクトルらしい
ベクトルの内積…ってどう書くんだ?とおもったら公式があった。


a^T b = \parallel a \parallel \parallel b \parallel cos \theta

ってことで  \theta ベクトル間の開き角度ってことになるようだ

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()

f:id:white-azalea:20210520210117p:plain

要するにこの角度

数学回(ベクトル)

ベクトルの内積と公式群


u =  ( u_1, u_2, u_3, ... u_d )^T \\
t = ( t_1, t_2, t_3, ... t_d )^T

としたとき、内積は以下の様になる。
(T は転置なので縦軸横軸入れ替えてるよ)


u^T t = ( u_1 t_1, u_2 t_2, ... , u_d t_d )

とこんな感じになって、以下の公式があるよって


0T t = 0 \\
u^T v = v^T u \\
(u + v)^T w = u^T w + v^T w \\
(ku)^T v = k(u^T v)  \\
v^T v = \parallel v \parallel ^2

因みに  k はスカラ倍の定数です

Salesforce開発の基礎編4

trailhead.salesforce.com

  • 適切な自動化ツールを選択する
    • Salesforce フロー」(製品名)には「プロセスビルダー」と「フロービルダー」の二つがある。
      • プロセスビルダー: レコード作成/更新/プラットフォームイベント発生で起動。バックグラウンドで関連レコードの操作やメール送信、他タスクのスケジュールなどができる。
        • レコードの更新やフェーズなどが更新に付随してデータを更新する場合、上記イベント起因でタスクを作成する場合
      • フロービルダー: ユーザのボタン操作や、レコードの作成/更新、プラットフォームイベント発生時、定期実行などで起動。画面操作などでウィザードを作ったり、プロセスビルダーの様にレコード操作などいろいろできる。
        • 入力ウィザードが欲しい場合、レコードの更新やフェーズなどが更新に付随してデータを更新する場合、上記イベント起因でタスクを作成する場合
    • 両ビルダーの機能は Apex コードで機能追加できる。
  • プロセスビルダーを使用してシンプルなビジネスプロセスを自動化する
    プロセスビルダーを実際に使ってみるハンズオン。プロセスビルダーの画面の使い方などを説明しています。
    因みに画像は答えじゃないので、移されても課題を解ける保証しません
    f:id:white-azalea:20210519223035p:plain
    f:id:white-azalea:20210519223229p:plain
    f:id:white-azalea:20210519223555p:plain
    f:id:white-azalea:20210519223829p:plain
  • Flow Builder でユーザをガイドしてビジネスプロセスを進める
    こっちは Flow Builder のチュートリアルハンズオン。
    f:id:white-azalea:20210519224150p:plain
    f:id:white-azalea:20210519224220p:plain
    f:id:white-azalea:20210519224303p:plain
    f:id:white-azalea:20210519224427p:plain
    f:id:white-azalea:20210519224657p:plain
    f:id:white-azalea:20210519224950p:plain
  • 承認でレコードが承認される方法をカスタマイズする
    初めて言及される承認プロセスのカスタマイズ。これは Salesforce フローではない。
    f:id:white-azalea:20210519225645p:plain
    f:id:white-azalea:20210519230223p:plain
    こんな感じで進めていけばいい。
    ただしこの文言には注意

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.

数学回

数列

ってもこんなの義務教育でもちょこっとはやるでしょう(汗
エンジニア大好き数列の一つ偶数とか


a_n = 2n \\
a_1 = 2, a_2 = 4, a_3 = 6, ...

でこの足した合計をこんな感じで記述する。


\sum^{N}_{n=1} a_n

これは一緒に習うと思うけど


\sum^{N}_{n=1} i = \frac{1}{2} n (n + 1) \\
\sum^{N}_{n=1} i^2 = \frac{1}{6} n (n + 1)(2n + 1)

これが掛け算だとこんな感じ


\prod^{N}_{n=1} a_n = a_1 \cdot a_2 \cdot a_3 ... a_N

因みにこんな公式もある。


\sum^{N}_{n=1} (a_n + b_n) = \sum^{N}_{n=1} a_n + \sum^{N}_{n=1} b_n \\
\sum^{N}_{n=1} ka_n = k \sum^{N}_{n=1} a_n
続きを読む