3 月 3rd, 2010 | ave | No Comments Yet

だいぶ今更感はありますが、改めてNexus OneをDocomo端末として使うまでに設定したこと。4月からはXperiaを初めとした日本キャリア公式端末がでるのであまり役に立たないかもしれませんが。。

  • iモードの利用

Nexus Oneはそのままだとiモードサービスは使えません。iモードメールやiモード情報サイトへの加入やお財布ケータイなどの機能は捨てて、GmailなどのGoogleサービスに乗り換える必要があります。ただ、以下の方法でiモードメールを使うことが可能です。

  1. iモード.netに加入する。
  2. アンドロイドアプリ「IMoNi」をインストールする。

iモード.netに加入することでパソコン上からiモードメールの管理ができるようになり、そのクライアントソフトであるIMoNiを使うことでアンドロイド上からiモードメールの管理ができるようになります。

  • 電話帳の移行

アンドロイド端末では電話帳はGmailの連絡先で管理されます。HT-03Aなどのキャリア公式端末の場合は非常に簡単の電話帳移行できるようですが、Nexus Oneにはそんな便利な機能はありません。どの方法がベストかわかりませんが、私は以下の方法をとりました。

  1. ケータイデータお預かりサービスに加入していたので、My Docomoの管理画面から電話帳データのCSVファイルをダウンロードする。
  2. 自分のGmailアカウントから連絡先のCSVデータを出力して、Gmail側の連絡先のCSVフォーマットを確認して、MyDocomoからダウンロードしたCSVをそのフォーマットに整える。
  3. 整えたCSVファイルをGmailの連絡先にインポートする。

これでとりあえず電話帳の移行はできました。

  • おさいふケータイ

これは使えないってことで諦めました。。モバイルSuicaが使えなくなるのが痛い。しかたなく一度捨てたSuicaカードをまた買いました。

  • Docomoの契約プランの変更

Docomoの契約プランはいままでは、パケホーダイフル/タイプSバリュー、という契約でした。Androidでパケット使い放題にするにはBizホーダイダブル(シンプル)かパケホーダイダブル(シンプル)に契約してmoperaにも加入する必要があるそうです。Docomoのサポートの方にも聞きながら最良プランを検討したところ、パケホーダイダブルとmoperaのUライトプランの組み合わせがいいようです。最終的にはパケホーダイダブル/mopera Uライトプラン/タイプSバリュー、という契約に落ち着きました。パケホーダイダブルとBizホーダイダブルの違いが最後までよくわかりませんでしたが、この二つは4月に統合されるようなのでもうあまり関係なさげ。

2 月 26th, 2010 | ave | 2 Comments

以前も紹介したように、Visualforceページを使ってPDFファイルを出力することができます。

[salesforce]VisualforceでPDF出力時の日本語対応

これと近い方法で、マイクロソフトワード、エクセルのファイルも出力することが可能です。

参考:How to Create Word, PDF or Excel Files with Salesforce Data

サンプルソース

<apex:page showHeader="false" contentType="application/msword">
<head>
<style type="text/css">
@page
{

/* Landscape orientation */
size:landscape;

/* Put page numbers in the bottom right corner of each
page in the pdf document. */
@bottom-right {
content: "Page " counter(page);
}
}

body {
font-family: Arial Unicode MS;
font-size:9pt;
}

td {
font-size:11pt;
font-family:Tahoma;
}

</head>
<body>
</body>
</apex:page>

参考サイトの中盤にありますが、<apex:page>タグのContentType属性に

  • ワードの場合: contentType=”application/msword”
  • エクセルの場合:contentType=”application/x-excel”

と指定すると、ワード、エクセルで開いて編集ができるファイルとして出力されます。

この出力されるファイルは、テキストエディタで開くとわかりますがただのHTMLファイルです。そのファイルをワードやエクセルで開いて編集しているという状態です。

ここで注意点として、

  • VisualforceページはUTF-8で出力されるので、出力されるワード、エクセルファイルもUTF-8。MSWord、ExcelはファイルをShift-JISで開こうとするので、日本語は文字化けしてしまう。そのため、日本語を含む場合は事前に別のテキストエディタなどでShift-JISに変換しておく必要がある。

ということがあります。

2 月 25th, 2010 | ave | No Comments Yet

名前だけ知っててきちんと調べたことのなかったGoogle Data APIs ツールキットを調査してみました。

Google Data API Toolkit

Force.com側のAPEXコード内で使えるツールキットで、
[Force.com][GoogleApps]
の方向でGoogleAppsのAPIにアクセスしてGoogleApps上の各種データを操作できるクラス群が提供されています。操作できるGoogleAppsの内容は

  • Googleドキュメント
  • Googleスプレッドシート
  • Googleカレンダー
  • Blogger
  • 連絡先

となっています。なんでも操作できるわけではなく、それぞれに制約事項があるようなので見ていってみましょう。

環境準備

Google Data APIs Toolkit Setup
こちらの手順に従って、まずは自分のForce.com組織でGoogle Data APIsツールキットが使える状態にします。

Googleドキュメント連携

Google Documents API
Googleドキュメントはいわゆるワードファイルが作成できるサービスですが、このツールキットを使ってGoogleドキュメント上のワードファイルの内容の作成/編集などはできません。というかGoogle側でそういうAPIが提供されていないようです。このツールキットを使ったGoogleドキュメント連携でできることは、Google Documents List Data API というAPIを使って

  • Googleドキュメントに保存されているファイルリストの取得
  • Gogoleドキュメントへのファイルアップロード
  • 既に保存されているGoogleドキュメント上のファイル検索

ということが可能です。

ファイルリスト取得
サンプルソースを見ればわかりますが操作は非常に単純で

DocumentService service = new DocumentService();
service.setAuthSubToken(sessionAuthToken);

こんな感じでDocsに接続して、

GoogleData documents = service.getDocuments(); // list all documents
documents.dump();

こんな感じで全ファイルリストが取得できます。実に簡単。

ファイルアップロード
ファイルアップロードを行う例としては、APEXコード内でCSVファイルっぽいデータを生成してその内容をCSVファイルとしてDocsの領域に保存したり、Force.com上のドキュメントとか添付ファイルとかをDocs側に退避させたり、などが想定できます。アップロードのサンプルも

string doctitle = 'upload sample.csv';
string csvBody = 'name,city,state' + '\n' + 'bill,new york,new york';
GoogleData sheet = service.uploadDocument(
csvBody,
doctitle,
'text/csv');
sheet.dump();

こんな感じで、タイトルとファイル内容を定義するだけでOK。

ファイル検索
Googleドキュメント上のファイルを様々な条件で検索することができます。例えば、

GoogleData documents = service.getFeed (
DocumentService.feedUrl + '-/presentation/starred' );
documents.dump();

こうすることで、☆を付けたドキュメントのファイルリストが取得できますし、

GoogleData documents = service.getFeed (
DocumentService.feedUrl +
'-/{http:%2F%2Fschemas.google.com%2Fdocs%2F2007%2Ffolders%2Femail}starred');
documents.dump();

こうすることで特定フォルダ内のファイルリストが取得できますし、

GoogleData documents = service.getFeed (
DocumentService.feedUrl + '?q=example+query');
documents.dump();

こうすることでファイル名をテキスト検索することができます。

注意点
使ってみた感想としては、アップロードする際のファイルサイズやファイルリストを取得する際のタイムアウト時間などはForce.com側のガバナ制限が適用されるのでその点に注意する必要があります。APEXのHTTPリクエストのタイムアウトガバナ制限は1ミリ秒~60秒で設定できてデフォルトは10秒です。ツールキット内のGoogleServiceクラスの128行目に

req.setTimeout(60000);

と追記するとタイムアウト時間が最大値になるのである程度の負荷まで耐えられました。

Googleスプレッドシート連携

Google Spreadsheets API
ドキュメントのAPIとは違い、スプレッドシートのAPIでは実際にスプレッドシートを作成/編集することができます。例えば、Force.com側のレコードやスキーマなどの情報をスプレッドシートにはき出して保存することが可能です。各サンプルコードは省略しますが、

  • Googleスプレッドシートに保存されているファイルリストの取得
  • 既存ブック内のワークシートの追加/編集/削除
  • 既存ワークシート内データのソート、検索、列と列の追加/編集/削除
  • 既存ワークシート内データの個々のセルの検索、編集、一括編集

といったことができますので、ツールキット側から柔軟にスプレッドシートの編集を行うことが可能です。

Googleカレンダー連携

Google Calendar API
こちらもGoogleカレンダーに予定を追加/編集/削除することができますので、Salesforceのカレンダーや各種情報をGoogleカレンダーと同期することが可能です。APEXスケジューラとの合わせ技で自動同期もきっとできるはずです。

  • Googleカレンダーに保存されている全カレンダーリストの取得、自分が所有するカレンダーリストの取得
  • 新規カレンダーの作成、既存カレンダーの編集/削除
  • Googleカレンダーに登録されている予定一覧の取得、色々な条件による予定の検索
  • 予定の新規作成/編集/削除
  • バッチリクエストによるそれぞれの処理の一括処理の実行

といったことが可能で、カレンダー操作に関するほぼ全ての操作が可能となっています。

Google連絡先連携

Contacts API
ContactとはGoogleで管理できる「連絡先」のことです。連絡先にはGmailで送受信したメールアドレスや、Androidを使っている場合はその電話帳が保持されています。この連絡先とSalesforce側の取引先や取引先責任者を同期させたい、なんて場面もあるかもしれません。連絡先連携でできることは、

  • 連絡先の新規作成、編集、削除
  • 連絡先リストの全取得、検索、連絡先のプロフィール画像の取得

となっています。

ブロガー連携

Blogger API
これは省略します。すいません。。

総括

各連携を、APEXスケジューラやトリガと合わせ技で使えば、ある程度までの連携システムはForce.com内で自律的に可動させ続けられるんじゃないかなと。

2 月 24th, 2010 | ave | No Comments Yet

Androidアプリの開発時に、Eclipseを起動すると、Android SDK Content Loaderみたいなエラーがでて固まることがあります。理由はよくわかりませんがはまってる人は多いようで以下に解決策がありました。

Android SDK Content Loader gets stuck….

Projects -> Build Automatically のチェックをはずせば無事起動できました。ちなみに使ってるEclipseのバージョンは3.3.2です。SDK1.5から発生してる問題のようです。

2 月 18th, 2010 | ave | No Comments Yet

絶賛評判にも関わらずあまり売れていないという噂のNexus Oneをゲットしました。自腹購入です。せっかく買ったのでゴリゴリ使い倒そうと思います。

Androidそのもののレビューはいつか行うとして、まずは早速Salesforceアプリをインストールしてみました。

使用しているのはこちらのアプリです。
SalesforceAndroid 0.2.5
Google Code
去年の4月から開発が開始されているようで、まだまだ絶賛発展中です。ここで提供されている状態そのままだとインストールに結構手間どりました。足りないクラスがあったり、ソースの修正が必要だったり。以下の文書が参考になりました。

Droid - Salesforce - First Steps
Android Eclipse Classpath - want to add classpath container path but eclipse won’t let me.

アプリ自体は機能的には、決めうちの標準オブジェクトが参照できるというだけの内容です。Nexus Oneだからかどうかわかりませんがかなり快適にさくさく動きました。ただ、アプリの仕様上ログインした最初の時点で参照する全オブジェクトの全レコードを取得しているようなのでその部分で10秒くらいかかるのが微妙でした。

他のAndroid/iPhoneアプリもそうですが、Wikipediaとかネットラジオとか大元の情報ソースは同じで、(広い意味での)UIで勝負という例はたくさんあるのでこれ自体もまだまだ改善の余地ありで色んな方向性がありうるだろうなあという印象でした。うちでも色々いじってみようと思います。OEMの特定アプリ特化型とかもありですね。

2 月 14th, 2010 | ave | No Comments Yet

そのSalesforce組織内でカスタマーポータル、パートナーポータルが使える状態になっているかどうか(有効化の有無は問わない)をAPEXスクリプト内から判別する方法。

カスタマーポータルの場合

allowCustomerActivated = [ SELECT Id FROM Group WHERE Type = 'AllCustomerPortal' ];

パートナーポータルの場合

allowPartnetActivated = [ SELECT Id FROM Group WHERE Type = 'PRMOrganization' ];

それぞれ、AllCustomerPortalというタイプ名のグループレコードと、PRMOrganizationというタイプ名のグループレコードが作られるはずですので、そのレコードの有無で判別できます。グループオブジェクトにはいろんなデータが格納されていてどんな役割を果たしているのかきちんと把握できませんでした。どっかに書いてるんだろうか。

2 月 12th, 2010 | ave | No Comments Yet

今回の事例紹介は、株式会社プラメド様の案件で行った、カスタマーポータルデザイン事例を紹介させて頂きます。
home_header01

◆経緯

プラメド様では、全国の医師、研究者を対象に様々な会員サービス事業を行っており、そのプラットフォームとしてSalesforceのカスタマーポータルを使っています。カスタマーポータルとは簡単にいうと、Salesforce上で管理している顧客向けにそのSalesforce組織内のデータを公開する機能です。Force.com Sitesと似ていますが、完全に一般に公開しているわけではなくSalesforceで管理している顧客に限定して公開している点が異なります。

◆要件

  • カスタマーポータルのデフォルトの簡素なデザインを、もっとWebデザインとして洗練されたものにして、ユーザビリティを向上させたい。

◆全体設計

ws000155
カスタマーポータルはデフォルトでデザイン設定の機能をもっています。
参考: [Force.comでWeb制作]カスタマーポータルを超デザイン

しかしこのデザイン機能は、標準で与えられたデザインの枠組みの中でフォント背景色ボーダー色ロゴ画像が変更できるにすぎません。もっと柔軟にカスタマーポータルで公開するページのWebデザインを行うためにはWebデザインのスキルと以下のような力業が必要となります。

カスタマーポータルで公開されるページの種類

カスタマーポータルで公開されるページには大きくわけて、Visualforceページと非Visualforceページがあります。

  • Visualforceページの場合
    この場合は、普通にWebデザインをする要領でVisualforceページをデザインします。<apex:page>タグの属性でshowheader=”false”にしてあとは一からHTMLを書いていけば完成です。
  • 非Visualforceページの場合
    この場合はやっかいです。非Visualforceページとしてカスタマーポータルで公開できるページには例えばレコードの参照、編集画面、ホーム画面、パスワード変更画面、レポート画面などがあります。これらのページはVisualforceのようにゴリゴリとHTMLを書いてデザインを変更する手段がありません。本当はこれらの代用になるVisualforceページを作ってしまえば良いのですが全部のページに対してその作業を行うとコストが馬鹿にならないので、できるだけこれらの標準ページを使いたいという状況も多々ありそうです。そこで、これらのページデザインを変更するために、カスタマーポータルの設定画面のヘッダHTML読み込み機能を使います。
    ws000053
    カスタマーポータルの設定画面で設定できるこのヘッダーHTML読み込み機能を使うと、カスタマーポータルで公開される全ての非VisualforceでこのHTMLが読み込まれるようになります。このヘッダーHTML内に

    <link rel="stylesheet" type="text/css" href="/resource/test.css" />
    

    というような記述をして外部のCSSを読み込むようにします。そしてその読み込むCSSの中で、非VisualforceページのHTMLの見た目を無理矢理変更するCSSを記述することで、非Visualforceページのデザインが設定できます。

    こうすることで、以下のように各ページのデザインが可能です。
    e38387e382b6e382a4e383b3
    また今回の案件では行いませんでしたが、同じ要領で外部のJavaScriptを読み込むようにしておいてそのJavaScript内でページ名に応じて読み込むCSSファイルを変更する、みたいな設定をすることで、それぞれの非Visualforceページに個別にCSSを設定することもできるはずです。

    注意事項として、非VisualforceページではSalesforce側で勝手にブラウザ判別してHTMLタグの出力を切り替えている場合があります。それらの挙動をページごとにきちんと把握してそれらに合わせたCSSやJavaScriptを設定する必要があります。

◆作ってみて

カスタマーポータルは、Salesforceプラットフォーム上で会員制Webサイトを作る協力な機能です。Spring’10では新たに認証済みWebサイト機能「Authenticated Sites」が提供されます。このことにより、ライセンス価格や機能面でカスタマーポータルライクな機能がより身近で利用しやすいものになるはずです。

そうした時に、カスタマーポータルやAuthenticated Sitesが一般向けサイトとして普及していくためには、洗練されたWebデザインは必須事項です。コストをかけて全てをVisualforceページで開発すれば柔軟なデザインが可能ですが、そうできない場合のためにそれぞれの非Visualforceページのデザインで出来ること出来ないことを把握しておくことが重要です。

2 月 10th, 2010 | ave | No Comments Yet

弊社がSaleforceの導入支援をお手伝いさせて頂き導入完了したお客様数が100社を突破いたしました!案件ベースでは150案件を超えております。

100210

2008年1月からSalesforce関連事業を本格稼働し始めて、約2年あまりでここまで辿り着きました。弊社のような小規模な会社でこの数の導入社数というのは、まさにSalesforceのメリットを最大限活かした結果です。

今後ともどうぞよろしくお願いいたします。

2 月 7th, 2010 | joe | No Comments Yet

こんにちわ、Joeです。

Google App EngineをやってみたいけどPython版とJava版どっちでやればいいのだろう?誰もが迷うところかと思いますが、結論から言わせていただきますと「Java触ったことあるならJava、どっちも経験がないのならPython」だと思います(あくまで私の主観ですので参考までに)

Javaの方が後発だった為かTaskQueueなどの新しい機能はPython先行で実装されるなど新機能のリリース時期に若干の差はありますが、基本的に両者にできることに違いはありません。APIの使い方や周辺機能の使い方も似通っていて、どちらか触ったことあるならもう片方も感覚で触ることができます。

PHP, JavaScript, C#, VB.NET, Java, Ruby, Pythonと雑食な(裏を返せば得意な言語がない…)私には、Google App Engineの手軽さはLLの世界に近い感覚があります。だからPythonもJavaも知らないのなら広大なJavaの世界は難解すぎるのではないかと思います。

一方Javaに慣れている方はJava版で開発するべきでしょう。今まで培ってきたJavaの周辺知識をそのまま活用できて、尚かつ手軽な開発環境、デプロイ環境が手に入るのですから。広大なJavaの世界にGoogle App Engineという手軽さが持ち込まれたことによる開発手法の変化は目を見張るものがあります。

私の場合、単にGAEを始めた時にJava版がなかったというのもありますが…

2 月 4th, 2010 | joe | No Comments Yet

こんにちわ、Joeです。

Google App Engineのデプロイはforce.comと同様、非常に手軽で、クラウド開発の恩恵を体感できます。Python版でUnix/Linux系OSやWindowsの場合、基本的にコンソールでappcfg.pyを叩いてデプロイします。※Pythonアプリケーションのアップロードと管理参照

しかし、Mac OS XのSDKだけGoogleAppEngineLauncher.appというapp形式になっているので/usr/local/binにappcfg.pyが作られないようです。EclipseにPyDevを入れた環境であればプロジェクトのメニューに「PyDev: Google App Engine」というメニューがあって、そこからアップロードやその他の管理コマンドを入力できます。Java版はEclipse環境の場合「Deploy Project to Google App Engine」というボタンがありますので更に楽ですね。

ただ、たまに以下のようなエラーではじかれる場合があります。

Error 403: — begin server output —
You do not have permission to modify this app.
— end server output —

同じソースコードをapp.yamlのapplication: だけ変更して違うアプリケーションIDのところへデプロイしようとした時によく出ます。これ実はappcfg.pyがcookieを利用して前回入力したアカウントを記憶しているので、cookieに保存されているアプリケーションIDとapp.yamlに記述されたアプリケーションIDが異なっていることが原因です。

これを回避するには–no_cookiesオプションを付与します。こうすればcookieを利用しないでデプロイ可能です。

appcfg.py update --secure --no_cookies <application path>