yonet77的な雑記帳

日々思いついたネタなどを書き留めておきます

Force.com と Heroku の程よい関係を模索して...(1)?

この記事は、Force.com AdventCalendar2013の18日目の記事になります。


先日のDreamforceでは、"Salesforce1"プラットフォームに関する大々的な発表がありました。
それに合わせるかのようにheroku1なんてモノも発表されました。
salesforceのプラットフォームサービスとして、force.comとherokuが結びつく日も近くなってきて、なかなか楽しみですね!


で、force.comとherokuはどう組み合わせるのがいいのさ?

こういった流れからも、force.comとherokuをうまく組み合わせて、何かのソリューションとして提供することも多くなってくるのではないでしょうか?
そんなわけ(?)で、force.comとherokuの程よい関係を模索してみようかと思います。
今回は、とあるところで実際に使ってみたハナシです。ちょっと特殊なところもありますが、何かの参考になれば、という具合で....

始まりは「Salesforceから、Excelの帳票出してよ」

とあるお客様に今使っているシステムの一部をforce.comに置き換える、というよくあるハナシからスタートしました。
そこでは、VB6 + DB2(だったかな?Oracleだったかな..?)を使って、いわゆるC/S構成のシステムを開発していたのですが、ある日"force.com"という黒船がやってきました。
この黒船、ご存知の方も多いかと思いますが、なかなか強力なモノで、いい調子で置き換えを進めてきました。

が、ある日

Excelファイルへの出力機能

にブチ当たりました。しかも面倒なのが

1. システムからExcelファイル出力のための中間ファイルを出力する(ただしShift JISで♪)
 ↓
2. とある .exeファイルを起動して、その中間ファイルを読み込んで、Excelファイルを作成する

という流れになってる...と。

このExcelファイル、なかなか手のこんだモノになってまして、納期的な問題(≒オトナの事情?)とモチベーション的な問題からイチから作っていくのはほぼ不可能でした。
となると、既存のexeファイルを活用する方向で乗り切ろうと考えるワケですね。なるべく作らない方向で...

#1 Shift_JISでのファイル出力

このご時世でUTF-8じゃなくてShift_JISとか爆発して欲しい
とりあえず、なんとかShift_JISでファイルを出力したい。しかもバイト数で長さ区切る制御も必要だとかあって、もうforce.comさんは知らんぷり状態なワケです。
というわけで、そこで

heroku様

の登場です。

force.comとherokuの両者には、

  • 元データの準備は、force.com側で実行する
  • 文字コード変換などは、heroku側で実行する

というタッグを組ませました。要は、文字コード変換、バイト数で区切るといった処理だけをherokuに任せる..というちょっと贅沢なリソースの使い方。
そして、その組合せもハードの手配とか何ら発注行為なくして実現できるのもステキです。
システム構成の概要はこんな感じです。
f:id:yonet77:20131215004330p:plain

サンプルコード..(ソースの雰囲気など)

force.com側:
<コントローラ部>

public with sharing class SampleController {

    public String header {get; set;}
    public String lines {get; set;}

    public class SampleController(ApexPages.Standardcontroller stdCon){
        // 何かゴニョゴニョしながら、herokuに渡すデータのパラメータとして
        // header, linesにデータをセットしていく...
    }
}

<ページ部>

<apex:page standardController="XXXX__c" extensions="SampleController"sidebar="false">
<form action="(herokuのpost先)" method="POST">
	<input name="header" type="hidden" value="{!header}" />
	<input name="lines" type="hidden" value="{!lines}" />

	<input type="submit" class="btn" value="ファイル出力"/>
</form>
</apex:page>


heroku側:
(すみません省略で...)
やってることは、force.com側からpostされたパラメータを受け取って、

  1. 文字コードを変換する
  2. 指定されているバイト数で区切る

という変換処理を経て生成したファイルを返す、という具合です。

こうして、

force.comからデータをherokuに渡してファイルを生成する

が出来上がりました。

#2 ファイル出力のその後...

とりあえず、最初のバージョンでは、ファイルを出力して、exeファイルを何とか使ってもらってExcelファイルを生成してました....が、

全部やってよ

と言われるわけです。要は、ボタンをポチッと押したらExcelファイルがダウンロードされてくる....みたいな感じにして欲しい、と。
つくづく、我々はExcel大好きなんだなぁと思う今日この頃です。

中間ファイルからExcelファイルにするプログラムはWindows上でしか動かないので...今度は

Azure様

の登場です。(別にAWS様でも良いですが)

herokuで変換したデータを、Azureに送ってやって、Excelファイル出力用exeプログラムを起動してExcelファイルを出力する、という流れです。
若干無理矢理感が強いですが、このままやってしまえ...!と。
f:id:yonet77:20131215010828p:plain

force.com側の処理には影響はなく、heroku側の修正とAzure環境の作成といった具合です。
※最初からAzureでやればよくね?という声はありますが、そういう意見もありますね、ということで...(苦笑)

ボタンをポチッと押したらファイルがダウンロードされる仕組みにはなってないですが、レコードにファイル添付することで了承してもらいました。
ファイルが残ってる方が良いよね、という話もありましたし。

おわりに (1)

このソリューションのアイディア元は、@さんからです。
ありがとうございます!ありがとうございます!

おわりに (2)

文字コード変換の伴う中間ファイル出力から始まって、Excelファイル添付処理まで...force.com単体だとやり難いところを、外部のリソースを使ってなんとか組み合わせたところになります。
force.comがニガテなところを、heroku(or Azure, AWS)が補って、何か1つのソリューションとして提供する、というのはよくあると思いますが、そんな事例を1つ共有してみた...という次第です。
このテーマ、次回があるかどうかは....分かりません。


それにしても、今回はコードがほとんどなかったな....(苦笑)

おわりに (3)

そして、今年のAdventCalendarは1周で終わるという快挙(?)達成です!

1年目
2年目
3年目にして、24人集まるまで知名度が上がってきたということでしょうか。
ありがとうございます! 引き続き、よろしくお願いします〜 m(_ _)m