とあるStartupに勤めるエンジニアの技術ブログ

Salesforce、テスト関係の技術ブログなどを書く予定

AntでForce.comのStatic Resourceファイルを作成する

Force.comで開発していく上で、Static Resourceファイルを作成するのは手動で行うには面倒です。

Static Resourceファイルはファイル拡張子だけ変更してアップロードしてしまう方法もありますが、そうしてしまうとどんどんファイル数が多くなってしまいので、ZIP圧縮でファイルを一つにまとめてしまったほうがすっきりします。

とはいえ、JavaScriptCSSを変更するたびに手作業で 不要ファイルを除去→ZIP圧縮→ファイル名変更 するのはさすがに厳しいです。そこで、AntでStatic Resourceファイルを作成させてしまえばいいんじゃないか、というわけです。

前提とするファイル構成

ここでは下記のようなファイル構成となっているとします。

[プロジェクト]
 ├ build.properties
 ├ build.xml
 ├ [build](自動で作成する)
 ├ [resource]
 |  ├ [SampleResource]
 |  └ [...]
 └ [src]
    ├ [staticresources]
    └ [...]

Antの呼び出し部分

以下のようにarchiveタスクにリソース名(SampelResource)を指定すると、src/staticresource/SampelResource.resourceを作成するようにAntマクロを作成してみました。中間ファイルとしてbuild以下にZIP圧縮前のファイルをコピーしています。

<target name="make">
  <archive resource="SampleResource" />
</target>

Antマクロ

実際にStatic Resourceファイルを作成しているAntマクロは下記のようになっています。属性として指定されたリソース名に基づいて処理を実行します。一旦build以下にStatic Resourceに含めたいファイルのみコピーしてからZIP圧縮していますので、不要なファイルを開発組織にデプロイすることもなくなります。

<macrodef name="archive">
  <attribute name="resource" />
  <sequential>
    <echo message="compress: @{resource}" />
    <delete dir="${build.dir}/@{resource}" />
    <copy todir="${build.dir}/@{resource}" preservelastmodified="true">
      <fileset dir="${resource.dir}/@{resource}">
        <patternset>
          <include name="**/*.gif"/>
          <include name="**/*.png"/>
          <include name="**/*.js"/>
          <include name="**/*.css"/>
        </patternset>
      </fileset>
    </copy>
    <zip
      basedir="${build.dir}/@{resource}"
      destfile="${src.dir}/staticresources/@{resource}.resource"
    />
  </sequential>
</macrodef>

元ファイルは こちら です。

まとめ

これでStatic Resourceファイルを手軽に作成できるようになりました。
本格的にやるのであればGruntなどを使ってもいいところですが、インストールするものが多くなってしまうので、Antでちゃちゃっとやるのもいいと思います。

Enjoy Deploying!

Salesforce1 Platform Mobile Hack Challenge 2014 Japan 結果発表にビックリ!

本日、Salesforce1 Platform Mobile Hack Challenge 2014 Japanの結果発表がありました!


を見て、

のんきにこんなことを呟いていたら、

中の人から「メール見て」と(汗)。

えと、ありがとうございます!
各所からすごいアプリが登録されてたので、とりあえず動画で笑いが取れればいいや、くらいで完全に想定外でした。

これから各所で公開処刑されるわけですが、頑張っていこうと思います。

Enjoy Hackathon!

Salesforce1 Style Guid

少し前ですが、Salesforce社よりSalesforce1のスタイルガイド(Product Style Guide, Visual guidelines for Salesforce1)が公開されています。Salesforce1 Platform Mobile Hack Challenge 2014 Japanでモバイルアプリを作成するにあたり読み返してみました。

このスタイルガイドは、Salesforce1上に作成するモバイルアプリのデザインを規定するものではなく、Salesforce.com社がSalesforce1に実装するアプリのデザインのルールをまとめたものになります。そのため、スタイルガイドに従ってアプリを作成すれば、似たデザインのアプリを作成できます。

ちなみに、PDFファイルがページの一番下にあります。アイコンのパディングのピクセル数など細かなことはPDFファイルのほうに記載してありますので、ちゃんと理解したい人はこちらを読むことになります。英語版のみの提供となっていますが、スタイルガイドなので図が多くすぐに読みことができます。

自作のPublisher ActionやらFlexible Pageやらの作るうえでのベストプラクティス、使ってはいけないケースなどが載っています。
例えば、Publisher Actionでは使ってはいけないケースとして「複雑なウィザード形式のもの(Complex wizard like multi-step flows.)」的なことが書いてあります。ごめんなさい。

OneStarterのようなSalesforce1のスタイルを適用できるjQueryプラグインも公開している人がいるようなので、標準のSalesforce1の画面と似た画面を作らないといけないようなよくある状況に追い込まれた人は使ってみてもいいかもしれません。
OneStarter

enjoy design!

Salesforce1 Platform Mobile Hack Challenge 2014 Japan に参加しました!

Salesforce1 Platform Mobile Hack Challenge 2014 Japan2014 Japan Salesforce1 Mobile Hack Challenge | Developer Force.com は、Salesforce1 Platformを利用するモバイルアプリケーションを期間内に作成し、応募するものです。なんと賞金総額160万円、一等賞には100万円が贈られます。何がすごいかというとSalesforce1 Platformを使って、しかもモバイルアプリケーションを作るエンジニアの絶対数が…(げほげほっ)。

嘘です。Herokuエンジニア入れたら大量にいます(参加してくるのかな?)。

一応Salesforce界隈で飯を食ってるエンジニアなので、諸々の勉強を兼ねて参加した次第です。

ちなみに、期待の受賞者発表は4月15日までに行われるようです。

続きを読む

Javaパッケージ名ってどうやってつけてますか?

下書きのまま、投稿し忘れてたエントリーがあったので、年を越さないうちに。

Force.com Advent Calendar 2013に参加するにあたって、Javaアプリ(?)を作る機会があったわけですが、Javaのパッケージ名をどうしようかとちょっと調べてみました。
Javaのパッケージ名は、ドメイン名を逆順に並べることで一意性を担保しているわけですが、個人でなかなかドメイン名を取得されている方は少ないんじゃないでしょうか?(エンジニアならドメインぐらい安いんだから取得しとけ、と言われると…)

なんかないかな〜、と調べていたら、こんなサービスがありました!

財団インターネット法人 パッケージ名登録サービスです。
Package BOFホームページ

パッケージ名登録サービスを利用すると、一意なパッケージ名を取得できます。

"jp.gr.java_conf.xxxx" (xxxxは任意) 

便利だ〜。
ローンチが1998年、遡ること15年前。そんな昔からあったのか、知らんかった〜。

SDUG Meetup #4 LT「Salesforce1 パブリッシャーアクションの歩き方(Visualforce編)」

Force.com Advent Calendar 2013 4日目が空いてしまっているので、保守エントリーを。

2013年12月18日にSalesforce Developer User Group [Tokyo] Meetup #4 : ATNDが開催されました。

Heroku ConnectやForce.com CLIなどのツール系の話あり、Salesforce $1M Hackthonの参加報告があったり、飛び入りLT多数、などかなり盛りだくさんな感じでした。なんとなく感じたのは、だんだんとForce.com+Herokuの組合せの話題も多くなってきたのかな、ということ。
今後も統合(連携?)がますます進んでいくでしょうし、楽しみな分野です(早くAPIコール数を消費しないようにならないかな)。

さて、Salesforce $1M Hackthonの参加報告でも少しだけ登壇したのですが、それとは別にSalesforce1ネタでLTしました。

発表資料はこちらです。あまりドキュメントのない状態で手探りだった自社製品のSalesforce1対応のフィードバックをまとめました。よろしければ見てやってください。

発表時に見せたパブリッシャーアクションのソースコードはこちらです(gistを貼り付けてみたかっただけです)。

Salesforce1 Quick Action by Visualforce Page sampl ...

前回からちょっと期間が空いてしまったので、次回はもう少し早めにやりましょう〜!

Enjoy Salesforce1!

あるいはForce.com Security Source Code Scannerの自動化

Force.com Advent Calendar 2013 2日目のブログ記事です。

早速ですが、ISV/OEM パートナーとしてAppExchangeに製品を公開している人にとっては欠かせないのが Force.com Security Source Code Scanner 。とはいえ、なかなか手動で実行してあげないといけないということで忘れがちです。CI(継続的インテグレーション)を実践していくためには自動化しておきたいところです。

そこで、今回は Force.com Security Source Code Scanner の実行をAntで自動化します。Force.com Security Source Code Scanner はWebページから申し込むサービスなので、ブラウザテスト自動化でお世話になる Selenium2 を利用して自動化を目指します。

Selenium IDE 導入

まずは、Selenium IDEを導入。Selenium IDE は特になくても問題ないのですが、ブラウザ操作を記録して各種プログラミング言語ソースコードにエクスポートできるので優れもの。今回は、Antタスクを作成するのでJavaでエクポートしました。

ちなみに、Seleniumのブラウザ自動実行のソースコードはこんな感じになります。

WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

driver.get("http://security.force.com/security/tools/forcecom/scanner");
driver.findElement(By.id("id_username")).clear();
driver.findElement(By.id("id_username")).sendKeys(username);
driver.findElement(By.id("id_description")).clear();
driver.findElement(By.id("id_description")).sendKeys(description);
new Select(driver.findElement(By.id("id_scantype"))).selectByVisibleText(scanProfile.getValue());
driver.findElement(By.cssSelector("button.btn.btn-primary")).click();
driver.findElement(By.linkText("Accept")).click();

driver.quit();
Seleniumライブラリのダウンロード

続いて、Seleniumを実行するために利用するために必要なライブラリをダウンロードします。ダウンロードしたファイルは適当にパスの通ったところに。

Antタスク化

あとは、Antタスク化。Webで先人たちの知恵を検索しつつ、実装。Ant の lib/ant.jar にある org.apache.tools.ant.Task を継承すればほとんどロジックの実装のみで、思ったよりも簡単にできました!

ところが、最後に罠が…。
headless化するためドライバをHtmlUnitDriverに変更してみたところ、エラー!
CSSJavaScript周りがうまく動作せず、押下すべきボタンが見つからない模様。コンソールから実行していたときは正常動作していたように見えたのに…。

ということで、残念ながら今回の記事では時間切れのため、headless化は行わずFirefoxで実行する実装になっています。

現時点の実装では今一歩というところですが、このAntタスクをJenkinsなどで定期実行しているジョブに組み込めば、定期的にソースコードのセキュリティ・品質チェックができるようになります。

RunRscScanner

ソースコードや使い方は、GitHub で公開しています。
諸々途中で断念しているものもありますが、気が向けば見てやってください。

設定ファイルはこんな感じで、Webページから入力するUsername、Description、ScanProfileを設定できるようにしてあります。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project
  basedir="."
  default="scan"
  name="Force.com Security Source Code Scanner Run"
  xmlns:runfscscanner="antlib:jp.gr.java_conf.a_kura.ant.runfscscanner">

  <target name="scan">
    <runfscscanner:runFscScanner
      username="admin@test.org"
      description="Product A"
      scanProfile="Beta Rules (+CRUD/FLS)"
    />
  </target>
</project>

Enjoy Advent Calendar!