Froce.comで作ったアプリケーションにVisualforceで作った独自画面を足してみる

こんにちは。mp_hskです。

今日は下記ブログ記事の続きです。

Force.com で 出張申請システムを作ってみる - mp_hskのブログ

上記で作った取引先オブジェクトを一括登録する独自画面を

実装していきたいと思います。

まずざっくり用語解説

作る前に要素について少し解説します。

Visualforceは基本MVCモデルで設計されており、

  • View → Visualforce ページ
  • Controller → Apexのコントローラークラス
  • Model → Apex のモデルクラス

という構成になっています。

今回は簡単な画面なんでModelはなしで View ←→ Controllerで作ります。

Visualforce ページのコーディング

設定→開発者コンソール→File→New →Visualforce Pageでページを作ります

■AccountAdd.vfp(ファイル名)

<apex:page controller="MyCustomCtrl">
  <apex:sectionHeader title="取引先の一括登録" />
  <apex:form >
    <apex:pageBlock title="取引先情報">
      <apex:dataList value="{!acts}" var="ad">
        <apex:pageBlockSection title="Account Information">
           <apex:inputField value="{!ad.name}"/>
        </apex:pageBlockSection>
     </apex:dataList>
     <apex:commandButton value="一括登録" action="{!save}" />
    </apex:pageBlock>
  </apex:form>
</apex:page>

これもざっくり解説すると

  • <apex:page> → ルートタグ+コントローラー紐付け
  • <apex:sectionHeader> → ページのヘッダータグ
  • <apex:form > → HTMLのformタグと同じ
  • <apex:pageBlock> → HTMLのdivタグみたいなモンで背景などのスタイルをデフォルトで入れてくれる
  • <apex:dataList> → ループのタグで valueに指定した変数の要素数分ループでHTMLを生成
  • <apex:pageBlockSection>→ これもHTMLのdivタグみたいなモン
  • <apex:inputField> → HTML のinputタグみたいなモン
  • <apex:commandButton>→HTMLのbuttonタグみたいなもん

処理内容としては、MyCustomCtrlの acts プロパティに指定されたリスト数分、入力用のテキストボックスを作る感じのプログラム。

コントローラーのコーディング

設定→開発者コンソール→File→New →Apex Classでコントローラーを作ります

public class MyCustomCtrl {

  public List<Torihikisaki__c> acts{ get; set; }

  public MyCustomCtrl(){
    acts = new List<Torihikisaki__c>();
    for(Integer i = 0;i < 3;i++){
      acts.add(New Torihikisaki__c());
    }
  }

  public void save(){
    insert acts;
  }
}

これもざっくり解説すると

  • Torihikisaki__cオブジェクトのリストをプロパティにもつ
  • コンストラクタでプロパティに空のTorihikisaki__cオブジェクトを3つセット
  • saveメソッドでプロパティのTorihikisaki__cオブジェクトを永続化

申請業務アプリに作ったページへ遷移するタブを作成

設定→クイック検索で "タブ"を検索 → タブ を選び

Visualforceタブを新規作成する(名前とスタイルは適当に)

f:id:mp_hsk:20170609172612p:plain

作ったら基本デフォルトで申請業務にタブが追加されるが、もし追加されなかったら

アプリケーションマネージャ→申請業務→編集→項目を選択 のタブ

で追加することができます。

作った画面を使ってみる

作った画面はこちらのように取引先名を3つ入力できる感じになる

f:id:mp_hsk:20170609172958p:plain

この状態で一括登録ボタンをクリックして、取引先タブに移動すると

f:id:mp_hsk:20170609173112p:plain

入力した3つの取引先が無事登録されてる。やっ↑た↑ぜ↓

学習のまとめ

今回は以下の点を学習した。

  1. Visualforce Pageを使った独自ページの実装
  2. ページに対してコントローラーを作成し独自処理を実装

Visualforceのタグは紹介した以外にも豊富にあるし、Apexはかなり柔軟に

プログラミングできるので、カスタマイズもこれでいけそう。

ただ、柔軟すぎて色々出来てしまう分、折角Saasを使ってるのに

構築コストがフルスクラッチと同じ!ってなことにならないように

標準でできることをもっと覚えてバランスよく利用できるように

これからは勉強していきたいと思った(小並感)

 

 

以上で紹介した書籍の内容はほぼ網羅したけど、Apexは色々できそうだから

なれるためにもう一回自分で何か書いてみようかな??

Force.com で 出張申請システムを作ってみる

こんにちは。mp_hskです。

今日は転職先で飯の種になる、Sales Forceを使った簡単な申請業務アプリを

作ってみました。

ちなみに下記の書籍にしたがって作っています。

入門書としてはいいレベルだと思うのでやってみたい方は是非(ダイマ)

book.impress.co.jp

※細かい設定のほうほうとかは書籍内容紹介になってしまうので、

 このブログでは大雑把に解説します。

アカウントの取得

下記サイトにアクセスして入力フォームに従い入力します。

(メールアドレスが有効なものであれば他は架空のものでも可)

Salesforce Developers

登録後、登録したメールアドレスにアドレス確認メールが来るので、

本文のURLをクリックすれば完了です。

なお、上記のDevelopersアカウントは利用制限がありますが無料で使えます。

ログイン

下記のサイトで ユーザーID/パスワードを入力すればOK

ログイン | Salesforce

アプリケーションの作成

設定→アプリケーションマネージャ→新規 Lightthing アプリケーション

から作成できます。(詳細な設定は上記書籍にあるので割愛)f:id:mp_hsk:20170608150107p:plain

出張申請オブジェクトの作成

設定→オブジェクトおよび項目→オブジェクトマネージャ→作成→カスタムオブジェクト から作成できます。(詳細な設定は上記書籍にあるので割愛)

f:id:mp_hsk:20170608150721p:plain

またオブジェクト作成後、同じオブジェクトマネージャから作ったオブジェクトにたいしてカスタム項目の追加が可能です。

書籍内ではオブジェクトの設定はアプリケーション設定から行くようになっていますが、今のバージョンではアカウントに紐づくすべてのオブジェクトを一括でオブジェクトマネージャーから管理する仕様に変わったみたいです。

承認プロセスの作成

設定→プロセスの自動化→承認プロセス→承認プロセスの新規作成

から作成できます。(詳細な設定は上記書籍にあるので割愛)

f:id:mp_hsk:20170608151402p:plain

オブジェクトレイアウトの変更

上で作成したオブジェクトのレイアウトを綺麗にできます。

オブジェクトマネージャーから作成したオブジェクトをクリックして詳細を開き

ページレイアウト→新規作成でレイアウトが作成できます。

f:id:mp_hsk:20170608151909p:plainこれで大体完成です。

ここまでの作業はすべてGUIの操作だけでできます。

作った出張申請を使ってみる

実際に使ってみます。申請業務アプリケーションの出張申請タブで移動。

f:id:mp_hsk:20170608152337p:plain新規ボタンを押して、データを入力して保存

f:id:mp_hsk:20170608152841p:plain作った申請データを承認申請する

f:id:mp_hsk:20170608153155p:plain

f:id:mp_hsk:20170608153301p:plainするとマネージャーユーザーのメールアドレスに承認依頼のメールが来るので

メール本文のURLをクリックし、承認ボタンを押してフロー完了!

f:id:mp_hsk:20170608153730p:plain

今回学んだことのまとめ

★Froce.comのアプリケーションとは以下のような構造になっている

       アプリケーション

            └─ オブジェクト....

                    └─ 項目 ....

アプリケーション→利用するオブジェクトをひとまとめにしたもの

オブジェクト→広義の意味のオブジェクトと同じ。

                         幾つかの意味のあるまとまったデータと

                         データに対する操作の集合

項目→オブジェクトのデータ項目

 

★オブジェクトへの操作として、CRMとして典型的なもの(今回の承認フローなど)はGUIで簡単に付加可能。

 

★オブジェクトの項目も、単純データ項目のみでなく数式などいろいろカスタムした項目を設定できる

感想

グループウェアレベルは割りとGUIだけで構築できそうで凄く便利。

今回は承認申請だけだったけど、商談管理もできてそれらはダッシュボードで

サマリを表示とかもできるみたい。

もっと複雑なことは Apexという独自プログラミング言語できるようなので

引き続きそちらも勉強しよう。

 

ツッコミあればお待ちしてます。

ばじめてのぱいそん

こんにちは。mp_hskです。

今日は海外で機械学習やら科学計算で持て囃されているPythonを軽く触ってみました。

What Python?

ざっくりいうと以下のような言語

  • LL言語(ライトウェート ランゲージ 要は軽量で手軽に動かせるってこと)
  • 文法でインデントを強制するので読みやすいコードが書ける
  • フリーソフト(無料で使える)
  • クロスプラットフォーム(どんなOSでも動く、移植も簡単にできる)
  • 科学計算、数値計算系のライブラリが豊富

インストー

Qiitaの以下のページを参考にインストーラーのEXEをダウンロードして実行すればOK

qiita.com

ちょっと触ってみた

hello world

おなじみのhello worldはこんな感じで書ける。めっさ簡単。

■hello.py(ソースファイル)

print("Hello world!")

 

■実行結果

C:\work\python_test>python hello.py
Hello world!

whileループ

whileループで1~100までの数字の合計を計算する。

■while.py(ソースファイル) 

n = 0
sum = 0
while n <= 100:
 sum += n
 n += 1
print(sum)

 

■実行結果

C:\work\python_test>python while.py
5050

 インデントつければ煩わしい{}をつけなくていいのでいい感じ

forループ

上と同じことをforでやってみた。

■for.py(ソースファイル

sum = 0
for n in range(1,101):
    sum += n
    n += 1
print(sum)

 

■実行結果

C:\work\python_test>python for.py
5050

Pythonのforループはシーケンス(イテレータみたいなやつ)を順番に1要素ずつ回す構文で、上記ではrange関数で 1 ~ 100までのシーケンスを作っている。

ちょっと実験してみた

Python数値計算が得意ということで、桁落ちの精度をJavaと比較してみた。

条件:0.1 を1000万回足し合わせた結果を表示

           java 1.8 double型で変数を宣言して実行

           Python 3.6 型指定なしで実行

結果: Java     999999.9998389754

         Python  999999.9998389754

結果は同じになったので、おそらく浮動小数点型の計算ではどちらも特殊処理はしておらず普通に計算してるみたい。この辺はライブラリ使わないとやっぱだめだなー

まとめ

軽く触ってみたけど、同じLL言語Rubyよりはきれいに書けそうな気がした。

また、色々入門サイトみてるとオブジェクト指向でかけるし、

デフォルトでタプル型とか複素数型みたいな珍しい型も扱えるらしい。

気が向いたらもっと深く突っ込んでみます。

参考リンク

www.python-izm.com

ツッコミなどあればお待ちしてます。

筋肉イエイイエーイ

こんにちは。mp_hskです。

今日は技術メモじゃなくて与太話です。

もうすぐ六本木からもお別れになるので

記念として同僚と六本木の筋肉食堂にランチ行きました。

筋肉食堂|KINNIKU SHOKUDO

 

いただいたのは

MixBセット(とりももステーキ + 赤身ハンバーグ) 

 with ランチセット(玄米 + スープ + プロテイン)  1,500円

 

内容はこんな感じ

f:id:mp_hsk:20170601142016j:plain食べた感想としては

  • 1500円にしては結構ボリューミー(肉はあわせて400gくらい)
  • やわらかくて食べやすいいい肉だった
  • 最初に出されたプロテインも凄く飲みやすいいいやつだった

ということでおおむね満足しました。

ウェイターのお兄さんがすげーガタイ良かった...

 

なお、写真は撮り忘れましたが同僚のオーダーは

MixDセット(とりももステーキ+リブロースステーキ)

 with ランチセット(玄米 + スープ + プロテイン)  1800円

日替わりランチ(とり胸のみそ焼き)

   with ランチセット(玄米 + スープ + プロテイン)  1000円

 

肉を食べたい欲求が発生したらまた行きたいと思いました(小並感)

関数の再帰呼び出しをうまく使いたい

こんにちは。mp_hskです。

本日のテーマは知ってるけど業務ではほとんど使わない再帰の復習。

再帰って??

関数(メソッド)内で自身を呼び出す方法。

ループが必要な処理をより簡単に書けることがある手法。

定番 n! を求める

再帰の定番として出題されるのは自然数 n の階乗を求めるプログラム。

こんな感じ。

public class Saiki1 {
    public static void main(String args) {
        System.out.println(kaijyo(5));
    }

    /**
     * n! を求める関数
     */
    private static int kaijyo(int n){
        if(n == 0){
            return 1;
        }else{
            return n * kaijyo(n -1);
        }
    }
}

この場合5!を求め、120が出力される。この仕組みを説明すると

kaijyo(5)

   → n != 0 なので 5 * kaijyo(4)

         → n != 0 なので 4 * kaijyo(3)

              → n != 0 なので 3 * kaijyo(2)

                   → n != 0 なので 2 * kaijyo(1)

                       → n != 0 なので 1 * kaijyo(0)

                            → n == 0 なので 1が返る

       ← 1 * 1 = 1が返る 

                  ←  2 * 1  = 2が返る

              ← 3 *2 = 6 が返る

         ← 4 * 6 = 24 が返る

     ←  5 * 24 = 120 が返る

ってな感じである。(わかりづらい?) 

階乗はループでも書けるが、ループで書くとこんな感じで少しかっこ悪くなる

public class Saiki1 {
    public static void main(String args) {
        System.out.println(kaijyo2(5));
    }

    /**
     * n! を求める関数
     */
    private static int kaijyo2(int n){
        if(n == 0){
            return 1;
        }else{
            int tmp = 1;
            for(int i = 1; i <= n;i++){
                tmp *= i;
            }
            return tmp;
        }
    }

}

エレガントなプログラムを書くにはやっぱり階乗ができるとうれしい。

フィボナッチ数列のn番目を求める

これも有名な問題。フィボナッチ数列とは

1 1 2 3 5 8 13 21 .... と n番目が a(n - 1) + a(n - 2)となる数列のこと。

今度は再帰版とループ版と一気に実装して確かめてみる。

public class Saiki2 {
    public static void main(String[] args) {
        System.out.println(fibo(15));
        System.out.println(fibo2(15));
    }

    /**
     * フィボナッチ数列のn番目を求める(再帰版)
     * n = 0の場合は1にする
     */
    private static int fibo(int n){
        if( n < 3){
            return 1;
        }else{
            return fibo(n - 1) + fibo(n - 2);
        }
    }

    /**
     * フィボナッチ数列のn番目を求める(ループ版)
     * n = 0の場合は1にする
     */
    private static int fibo2(int n){
        if(n < 3){
             return 1;
        }else{
            List<Integer> tmp = new ArrayList<Integer>();
            tmp.add(1);
            tmp.add(1);
            for(int i = 2;i < n;i++){
                tmp.add(tmp.get(i - 1) + tmp.get(i - 2));
            }
            return tmp.get(n - 1).intValue(); }
        }
    }

}

実行結果はどっちも同じ 610になるけどループ版の方は明らかに行数も多いし

無駄にListのオブジェクトを作っているので再帰の方がきれい。

まとめ

再帰は使いこなせるとプログラムをより短く、エレガントに書けるため身に着けたい。

今回はかなりメジャーで簡単なやつを書いたが、難しいアルゴリズムにもトライしたい(小並感)

 

ツッコミあればお待ちしてます。

シリコンバレーニュースを読んでみよう

どうも。エンジニアおじさんのmp_hskです。

何を血迷ったか外資の企業に転職したので、現在英語を勉強中です。

今日はその一環として、シリコンバレーニュースの英語版を読んでみようという試みです。こちらの記事を読んでみました。

techcrunch.com

 

2017/03/28 AWSAmazon Connectという製品をリリース

要約

AWSは3/28にAmazon Connect という新プロダクトをリリースした。

Amazon Connectはクラウドベースのコンタクトセンターソリューションである。

AWSが言うには、この製品は従来のAmazon技術で構築され数百万のユーザーに提供されている。

「The Information」によれば、このソリューションは従来のコールセンターに、"Lily"というタイトルで2月から導入されていると噂されていた。

Amazonはすでにビジネスの領域をクラウドベースに移しており、様々なクラウドベースコンタクトセンターからオファーを受けている。(Zoho, Zendesk, Freshdeskなど

従来のソリューションはクラウドベースではなく、個別インフラを導入しており100億ドル近いコストがかかっていた。

Amazon Connect はほかのAWS製品と同様、先行投資なく低コストでの導入を行え、市場を揺るがすであろうとAWSは望んでいる。

サービスのコアはAmazon claimsというバーチャルコネクトセンターサービスで、

これは数分で設定でき、特別なトレーニングなく使うことができる。

ユーザーは利用した分だけ電話料金+サービス使用料を課金される。

Amazon Connectは既存のAWSサービス(DynamoDB、RedShift、Aurora)やサードパーティのCRMnoのソースデータと統合する。Salse Froceも統合を発表している。

また、Amazon AlexaのようなAIでの自然言語による応答でユーザーへの自動応答をサポートすることも予定している。

以下デモ画像の説明

「10年前はコンタクトセンターのソリューションはスクラッチで開発されていた。

それは適切なスケールやコストでの提供ができていなかったので、我々は顧客に世界一素晴らしいサービスを提供する必要があった。」

AWSバイスプレジデントは語る

「この選択は、結果として何百万もの顧客に利用され、AWSの差別化要因となった。AWS製品として、クラウドのシンプルさ、柔軟性、信頼性、コスト効率の面で、この技術を顧客に提供できることを大変うれしく思っている」

AnswerConnectのナタリー・フォン最高経営責任者(CEO)は、

「24時間365日顧客対応ができる必要がある」

「拠点が離れた企業では遠隔の従業員をつなぐクラウドサービスが不可欠ですがAmazon Connectはそれ以上の価値を提供している。Amazon Connectはリアルタイムレポート機能を備えています。また簡単に既存システムと統合でき、使用量に基づく価格設定は財務影響なしに季節的なスケーラビリティのニーズに対応する。これらの要因のため、Amazon Connectへ移行は我々、および顧客の両方にとって最良の選択であった」と語っている。

 

いままでで一番疲れた。。。。

あと結局どんなサービスかいまいち想像がつかなかったが、

まぁコールセンター業務をクラウドでできるシステムみたい。

Javaで重複順列を列挙してみる

こんにちは。mp_hskです。

今日は、なんか転職活動中のコーディングテストでやたらと出題された

重複順列を列挙する問題をJavaで解いてみます。

問題

A,B,C,D,E の5文字から重複を許可した3文字の文字列をすべて列挙する。

例: AAA, AAB, AAC ......

考え方

重複順列の表示の考え方は基本的に、表示桁数のn(文字種類)進数を0から順に作って

それぞれの各数値と文字を当てはめて変換すればできる。

今回の問題にあてはめると

  1. 0 ~ 5の3乗(全パターン数)までの各数値を5進数に変換する
  2. 0 = A, 1 = B, 2 = C, 3 = D, 4 = E に当てはめて数値を文字に変換する
  3. 変換した文字列を表示する

でできるはず。

組んでみたコード

こんな感じで組んでみた。(ライブラリをあまり使わず組んでみました)

public class Zyunnretu {

// メイン関数
public static void main(String[] args) {

  Map<String, String> convertMap = new HashMap<String, String>();
  convertMap.put("0", "A");
  convertMap.put("1", "B");
  convertMap.put("2", "C");
  convertMap.put("3", "D");
  convertMap.put("4", "E");

  for(int i = 0; i < Math.pow(5, 3);i++){

    String tmp = leftPaddingZero(convert(i,5),3);
    StringBuilder sb = new StringBuilder();
    for(int j = 0;j < tmp.length();j++){
      sb.append(convertMap.get(tmp.substring(j, j+1)));
    }
    System.out.println(sb.toString());
  }
}

/**
* targetをn進数の文字列に変換して返す
*/
private static String convert(int target, int n) {
  StringBuilder sb = new StringBuilder();
  int tmp = target;
  while (tmp > 0) {
    sb.append(tmp % n);
    tmp = (tmp - (tmp % n)) / n;
  }
  return sb.reverse().toString();
}

/**
* Strを左ゼロ埋めする
*/
private static String leftPaddingZero(String str, int length) {
  if (str.length() == length) {
    return str;
  } else {
    return leftPaddingZero("0" + str, length);
  }
}

解説

mainではこんな感じ

  • 変換表をMap型で生成
  • ループで 0から 5の3乗までを、3桁の5進数(足りない部分は0埋め)に変換する処理を呼び出し
  • 取得した5進数を頭から1文字ずつ変換表で変換

n進数変換(convert)ではこんな感じ

  • 渡された数値を nで割ったあまりを文字列に足す
  • 渡された数値をnで割った商を計算する
  • 渡された数値をnで割った商が 0より大きい間上の処理を繰り返す
  • 最後に足した文字列を反転して返す

ちょっとわかりずらいけど、たとえば152なら

  1. 102 ÷ 5 = 20 あまり 2    文字列に2を足す  "2"
  2. 20 ÷ 5 = 4 あまり 0        文字列に0を足す "20"
  3. 4 ÷ 5 =   0 あまり  4        文字列に4を足す "204"
  4. 反転する  "402"
  5. 対応表に当てはめる "EAC"

こんな感じの処理を 0 - 125までやれば列挙できっるて寸法です。

応用

これを使った問題でこんなのが出た

・コインを5回投げて2回連続で表がでるパターンを列挙

この問題は上記プログラムにおいてまず

  •  文字 H, R  (表、裏) で5文字の重複する順列を作る
  • その中で、パターン "HH" (2回表)にマッチする文字列だけ表示する

で対応できた。

ほかにも重複を許す樹形図系の問題では威力を発揮するかもしれない。

参考リンク

説明はこれがわかりやすい

重複順列を辞書式順列で求めるアルゴリズムはどういったもの... - Yahoo!知恵袋

進数変換部分は今回は自分でプログラミングしたが、baseエンコードでできそう

Javaで進数変換を行う方法 - Qiita

 

ツッコミあればお待ちしてます