Squirrel Mailや Roundcube をLinuxへ導入して
Gmailっぽくメールを読み書きしたいのだけど、
両方共デフォルトではパスワード変更機能を装備していない。
Squirrel Mail はchange_passwdというプラグインがあるのだけど
Ubuntu Serverのaptitudeで導入することができない。
(wgetはできる)
運用をITスキルの低い人に任せる予定なので
できるだけ aptitude での更新でやらせたい。
change_passwdはwgetしたtar.gzファイルを
Squirrel Mailのpluginsディレクトリへ展開して
conf.plするだけでは動作しない。
functions.phpの関数おちょこっと手直ししたり
すごく面倒だ。
aptitudeで出来る方法はないものかと
しらべてみると
poppasswdとpoppass-cgiパッケージを導入すれば
/cgi-bin/poppass
にパスワード変更用のCGIができる。
..もうちょっとかっこいい
(変更履歴管理とか、同じパスワードはさかのぼって変更不能とか)
機能がほしいところだが、
これならaptitude一本で管理できそう。
p.s.
にしても
Server Worldはすごく便利だ。
とっても参考になった。
ほとんどここからパクって
change_passだけGoogleっただけで
メールサーバを上げることができた。
もうCentOS6の情報も載せてるし..
仕事上でわかったことのうち顧客に関わる情報が無い物、一般公開して差し障りのなさそうな事をたまーに投稿しています。 ちなみに、記事上に載せた私が書いたコードは、用途問わず再利用いただいてかまいませんが、保障は一切いたしませんので、あしからず。 ですます調の記事とである調の記事が混ざりますが..こちらも、あしからず。
Translate
2011年7月14日木曜日
2011年7月5日火曜日
UbuntuServer 11.04でhostnameコマンドが効かない
VMware player上に簡易インストールすると
ホスト名がubuntuになってしまう。
で
して
またubuntuに戻っている..
オカルト?
で色々検索すると、
hostname newhostnameしたあとに
sudo vi /etc/hosts
で新ホスト名を追加して
/etc/init.d/networking restart
してrebootしたら
オカルト現象が解消された。
ホスト名がubuntuになってしまう。
で
sudo hostname newhostnameして
rebootしたのだけど..またubuntuに戻っている..
オカルト?
で色々検索すると、
hostname newhostnameしたあとに
sudo vi /etc/hosts
で新ホスト名を追加して
/etc/init.d/networking restart
してrebootしたら
オカルト現象が解消された。
Ubuntu Server11.04をVMware playerへ簡易インストールすると英語キーになる
Ubuntu Server11.04をVMware playerへインストールする時に
通常のインストールをすると、
VMware toolsを入れるときに
やれマウントしろだの
やれgccがないからいれろだの
言われていやになるので、
簡易インストールしてみた。
最初に出てくるコンソールloginをしばらく放置していると
VMware toolsをインストール仕切った状態ににしてくれる。
でもログインしてみると..
今度は英語キーボードになっていて
viで保存するときに:がどこにあるかわからず
迷ってしまう..
しょうがないので
で、ここで
から上下に移動するのに
私のPCの上下キーがきかない..
いろいろおしていくと、
先頭文字のキーを押せばそこにいくことがわかった
んでQwertyのQ、JapaneseのJ、PC110を選択
したらやっと日本語キーボードのことを分かってくれた。
これくらいはインストーラで
自動設定してほしいなあ..
p.s.
そのあと
sudo loadkeys jpを実行すれば
日本語キーになることがわかった。
今はこれを使っている。
通常のインストールをすると、
VMware toolsを入れるときに
やれマウントしろだの
やれgccがないからいれろだの
言われていやになるので、
簡易インストールしてみた。
最初に出てくるコンソールloginをしばらく放置していると
VMware toolsをインストール仕切った状態ににしてくれる。
でもログインしてみると..
今度は英語キーボードになっていて
viで保存するときに:がどこにあるかわからず
迷ってしまう..
しょうがないので
$ sudo su -
# export http_proxy="http://user@password:hostname:port/"
# apt-get update
# aptitude install console-data
で、ここで
Don't touch keymapから上下に移動するのに
私のPCの上下キーがきかない..
いろいろおしていくと、
先頭文字のキーを押せばそこにいくことがわかった
んでQwertyのQ、JapaneseのJ、PC110を選択
したらやっと日本語キーボードのことを分かってくれた。
これくらいはインストーラで
自動設定してほしいなあ..
p.s.
そのあと
sudo loadkeys jpを実行すれば
日本語キーになることがわかった。
今はこれを使っている。
2011年5月21日土曜日
Lync 2010クライアントの前提って何なんだろう..
使えるかどうかの検証で
Linc Server Standard Editionを立ち上げてみた。
あくまで健勝なので
クアッドコアの
Windows 7 Home Edition
にVMware playerを入れて
MSのTechNetで手に入れた
Windows2008 Server:Active Directory
Windows2008 ServerR2:Lync Server Standard Edition
Windows XP SP3:Lync 2010(Client)
と別のWindows 7 上に1つ別のXP SP3
を建ててもう一つのクライアントにする。
でつなげようとしたのだけど
どうもActive Directiryで構築したドメインでログインしないと
Lync 2010がつながらない..
しかも最新のホットフィックスを入れていないと
証明書の検証云々のメッセージが出てつながらない。
クライアントの前提が
よくわからないんだよなあ..
どこかに書いてあるのかなあ..
もしご存じの方はコメントに是非
情報を入力してください
Linc Server Standard Editionを立ち上げてみた。
あくまで健勝なので
クアッドコアの
Windows 7 Home Edition
にVMware playerを入れて
MSのTechNetで手に入れた
Windows2008 Server:Active Directory
Windows2008 ServerR2:Lync Server Standard Edition
Windows XP SP3:Lync 2010(Client)
と別のWindows 7 上に1つ別のXP SP3
を建ててもう一つのクライアントにする。
でつなげようとしたのだけど
どうもActive Directiryで構築したドメインでログインしないと
Lync 2010がつながらない..
しかも最新のホットフィックスを入れていないと
証明書の検証云々のメッセージが出てつながらない。
クライアントの前提が
よくわからないんだよなあ..
どこかに書いてあるのかなあ..
もしご存じの方はコメントに是非
情報を入力してください
2011年5月18日水曜日
Xperia Play に HT-03A に挿していたSIMカードを突っ込んでみる
最近
Xperia arcだとか
Xperia acroだとか
発表していますが、
私が欲しかったのは
Xperia Play!
PlayStationロゴのゲームの動く
Android携帯!
3月に海外では販売されたので
わくわくして待っていたけど
どうも日本では出ないらしいなる記事を
見かけて..
..速攻並行輸入しているサイトで
ぽちってしまった..
SIMフリーってかいてあるので、
docomo HT-03Aに挿していた
SIMカード差しちゃえばうごくだろうと..
で、
到着して早速動かしてみる。
日本語をセットしたら..
「..コイツ、動くぞ」
普通に動くじゃん..日本語で。
とっととうっちまえばいいのに..
画面通りにセットアップしていったけど..
WiFiのない環境で
インターネットに繋がらない..
しょうがないのでGoogleってみると
Xperia PLAYに搭載されている“テザリング”機能を試してみる。
なるサイトをみつけて
このとおりにやってみた。
..うごかない..
mopera.flat.foma.ne.jp
がつかえないようだ。
で、
HT-03A上にあったAPN情報(mpr2.bizho.net)を
そっくりいれてみたが
..やっぱりだめだった。
色々検索して
open.moprera.net
をAPNに登録したら
みえるようになった。
..けど、パケ死するんじゃなかろうか..
..とりあえず今月はWiFiで使って
今月の請求書見てからこのAPN使うかどうかきめようかな..
#後日談:請求金額、2倍になりました..
#このAPNだと定額からはずれることだけはわかったよ。
#まあ10倍とかにならんでよかった..
------
しばらく使ってみて気づいたのは、
SIMカードやSDカードの挿しが甘い
ことがたまに発生する。
SIMが甘いと突然リブートするようになるし、
SDカードが甘いとアンマウントメッセージが
画面上部に表示される。
HT-03AはSIMをしっかりささないと
電池がはまらないのでよかったけど
Playは筐体自体が大きめで多少余裕がある
ことから
持ち運びで結構激しい動きをしてしまうと
勝手にリブートしてしまう..
よく差し替えて使用する人は
気をつけてください。
..だんだん筐体のふとさが
うざくなってきた..
Xperia arcだとか
Xperia acroだとか
発表していますが、
私が欲しかったのは
Xperia Play!
PlayStationロゴのゲームの動く
Android携帯!
3月に海外では販売されたので
わくわくして待っていたけど
どうも日本では出ないらしいなる記事を
見かけて..
..速攻並行輸入しているサイトで
ぽちってしまった..
SIMフリーってかいてあるので、
docomo HT-03Aに挿していた
SIMカード差しちゃえばうごくだろうと..
で、
到着して早速動かしてみる。
日本語をセットしたら..
「..コイツ、動くぞ」
普通に動くじゃん..日本語で。
とっととうっちまえばいいのに..
画面通りにセットアップしていったけど..
WiFiのない環境で
インターネットに繋がらない..
しょうがないのでGoogleってみると
Xperia PLAYに搭載されている“テザリング”機能を試してみる。
なるサイトをみつけて
このとおりにやってみた。
..うごかない..
mopera.flat.foma.ne.jp
がつかえないようだ。
で、
HT-03A上にあったAPN情報(mpr2.bizho.net)を
そっくりいれてみたが
..やっぱりだめだった。
色々検索して
open.moprera.net
をAPNに登録したら
みえるようになった。
..けど、パケ死するんじゃなかろうか..
..とりあえず今月はWiFiで使って
今月の請求書見てからこのAPN使うかどうかきめようかな..
#後日談:請求金額、2倍になりました..
#このAPNだと定額からはずれることだけはわかったよ。
#まあ10倍とかにならんでよかった..
------
しばらく使ってみて気づいたのは、
SIMカードやSDカードの挿しが甘い
ことがたまに発生する。
SIMが甘いと突然リブートするようになるし、
SDカードが甘いとアンマウントメッセージが
画面上部に表示される。
HT-03AはSIMをしっかりささないと
電池がはまらないのでよかったけど
Playは筐体自体が大きめで多少余裕がある
ことから
持ち運びで結構激しい動きをしてしまうと
勝手にリブートしてしまう..
よく差し替えて使用する人は
気をつけてください。
..だんだん筐体のふとさが
うざくなってきた..
Lync Serverインストール中にSqlExpressRtc導入中にエラー2068578304がでる
Lync Serverインストール
「最初のStandard Editionサーバーの準備」
でタイトルにあるような
SqlExpressRtcの前提条件チェック時に赤文字で
エラーコード2068578304
をだした人は、
おそらくActive Directorのドメインコントローラ上に
Lync Serverをインストール使用としている人だと思います。
残念ながら
Lync ServerはAD DC上にインストール出来ません。
厳密には
Lync Serverの構成要素である
SQL Server Expressが
Active Directory ドメインコントローラ上に
インストールできないらしい..
ということで別途ドメインコントローラを
用意してください。
Microsoft Lync Server 2010
Microsoft Lync Server 2010(RC)
ステップバイステップガイド
っていうのを
公開してくれているのはありがたいけど、
このドキュメントの前提条件とかに書いていて欲しかった...
#SQL Server入れる人なら
##知ってて当然なことなのだろう..
..読んでたときに
なぜDCを別にした例で書かれているのか..
..気にはなってたんだよなあ..
DCを別立てにしてインストールしたら
上記のエラーはかわせました。
「最初のStandard Editionサーバーの準備」
でタイトルにあるような
SqlExpressRtcの前提条件チェック時に赤文字で
エラーコード2068578304
をだした人は、
おそらくActive Directorのドメインコントローラ上に
Lync Serverをインストール使用としている人だと思います。
残念ながら
Lync ServerはAD DC上にインストール出来ません。
厳密には
Lync Serverの構成要素である
SQL Server Expressが
Active Directory ドメインコントローラ上に
インストールできないらしい..
ということで別途ドメインコントローラを
用意してください。
Microsoft Lync Server 2010
Microsoft Lync Server 2010(RC)
ステップバイステップガイド
っていうのを
公開してくれているのはありがたいけど、
このドキュメントの前提条件とかに書いていて欲しかった...
#SQL Server入れる人なら
##知ってて当然なことなのだろう..
..読んでたときに
なぜDCを別にした例で書かれているのか..
..気にはなってたんだよなあ..
DCを別立てにしてインストールしたら
上記のエラーはかわせました。
リファレンス:<apex:page>
Visualforceページを表すタグ。
すべてのVisualforceページはこの1組のタグで囲まなくてはならない。
属性名:
属性値の型:
説明:
該当ページがサーバにリクエストされると、属性値に指定したアクションメソッドが呼び出されます。
たとえば、
属性が指定されていない場合は、普通にページがロードされます。
アクションメソッド(アクションメソッドは通常次の遷移先のPageReferenceを返却する)
アクションメソッドはページ描画されるまえに呼び出され、別のページへリダイレクトされます。
アクションメソッドを初期化のために使用すべきではありません。
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
属性値の型:
説明:
該当ページを描画・実行する際に使用されるForce.com WebサービスAPIのバージョンを指定します。
※オプション、APIバージョン10.0以降、アクセス範囲global
属性値:
属性値の型:
説明:
該当ページをキャッシュするかどうか真偽値で指定します。
真値の場合、ブラウザは該当ページをキャッシュします。
指定しない場合は、デフォルトである偽値が指定されたものとして動作します。
しかしForce.com サイトでは、属性
詳細はSalesforce組織のオンラインヘルプの"Caching Force.com Sites Pages"を参照して下さい。
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
属性値の型:
説明:
描画されたページフォーマットとして指定したMIMEタイプが使用されます。
属性値として
MIMEタイプについてはW3C仕様を参照してください。
注意:ファイル名指定のある場合、属性
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
属性値の型:
説明:
該当ページが使用するカスタムコントローラクラス名を指定します。
属性
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
属性値の型:
説明:
キャッシュ期間を秒で指定します。
Force.com Siteの場合、
詳細はSalesforce組織上のオンラインヘルプ"Caching Force.com Sites Pages"を参照の事。
※オプション、APIバージョン14.0以降
属性名:
属性値の型:
説明:
該当ページに追加する拡張コントローラクラス名を指定する(複数指定可能)。
※オプション、APIバージョン11.0以降、アクセス範囲global
属性名:
属性値の型:
説明:
ページ内の別のコントローラから参照されるときに使用するID名。
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
属性値の型:
説明:
Salesforceセットアップツール(ブラウザ:氏名→設定)上で参照されるときに使用するラベル名。
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
属性値の型:
説明:
Salesforce上のトランスレーション(トランスレーションワークベンチ)に結び付けるためのラベル名を指定します。
指定した値で表示しているページの言語をオーバライドします。
Salesforceにてサポートされている言語のキー値を属性値として定義可能です(たとえば"en"や"en-US"など)。
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
属性値の型:
説明:
Force.com Webサービス内のページとして参照するための一意な名前。
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
属性値の型:
説明:
属性
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
属性値の型:
説明:
属性
※オプション、APIバージョン14.0以降
属性名:
属性値の型:
説明:
このレコードセットは、ページ上への表示やレコード上でのアクション実行のための戻り値として式の中で使用することができます。
たとえば、標準コントローラを使用していて
※オプション、APIバージョン14.0以降
属性名:renderAs
属性値の型:
説明:
サポートされているコンテンツコンバータの名前を指定します。
現在サポートされているコンテンツコンバータはPDFのみです。
この属性値に"pdf"を指定することで、該当ページをPDFとして変換されます。
PDF変換が目的のVisualforceページは、ページを印刷用としてデザイン・最適化してください。
入力フィールドやボタン、その他のJava Scriptを許可しているコンポーネントなどのformタグ要素を含む構成である単純ではない標準コンポーネントでは使用すべきではありません。
これはformタグ要素を含めることを制限するわけではありません。
組織へ配置する前に変換ページを確認してください。
PDF変換結果が文字の表示に失敗し場合、CSS内のフォントを調整してください。
(例:
注意:
※オプション、APIバージョン13.0以降、アクセス範囲global
属性名:
属性値の型:
説明:
ページをレンダリングさせるかを真偽値で指定します。
指定しない場合は、デフォルト値として真値が指定されたものとして動作します。
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
属性値の型:
説明:
標準のSalesforceセットアップページのスタイルを使用するかどうかを真偽値で指定します。
もし真値の場合、セットアップのスタイルを使用します。
属性を指定しない場合は、デフォルトである偽値が指定されたものとして動作します。
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
属性値の型:
説明:
Salesforceタブヘッダがページ内に含まれるかどうか真偽値で指定します。
真値の場合、タブヘッダが表示されます。
指定がない場合、デフォルトの真値が指定されたものとして動作します。
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
属性値の型:
説明:
標準Salesforceサイドバーを表示するか真偽値で指定します。
真値の場合、サイドバーが表示されます。
指定がない場合、デフォルトである真値が指定されたものとして動作します。
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
属性値の型:
説明:
該当ページの振る舞いをコントロールするSalesforceオブジェクトの名前を指定します。
この属性はすでに属性
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
属性値の型:
説明:
属性
真の場合、標準スタイルシート群が生成されたページヘッダに追加されます。
指定がない場合、デフォルトで偽値が指定されたものとして動作します。
偽値を設定することで、要求されたSalesforce.com CSSは正しく表示されない場合があります。
また、リリースバージョンによりスタイルが変更される場合があります。
※オプション、APIバージョン11.0以降、アクセス範囲global
属性名:
属性値の型:
説明:
色、スタイル、このページの選択されたタブをコントロールするSalesforceオブジェクトもしくはVisualforceタブを指定します。
カスタムオブジェクトを使用している場合、オブジェクトのDeveloper Nameで指定しなければなりません。
例えば、
標準コントローラを使用している場合、コントローラに関連付けられたスタイルが使用されます。
カスタムコントロールを定義している場合、ホームタブのものがデフォルトで使用されます。
カスタムVisualforceタブを使用する場合、タブの名前(ラベルではない)に続けて"
例えば、名前が"Source"、ラベルが"Sources"の場合、
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
属性値の型:
説明:
ブラウザに表示されるページタイトル。
注意:ページを開発者モードで編集しているときは、ページタイトルは表示されません。
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
属性値の型:
該当ページにて標準Salesforceウィザードページのスタイルを使用するかどうかを真偽値で指定します。
真の場合、ウィザードスタイルが使用されます。
指定がない場合、デフォルトの偽値が指定されたものとして動作します。
※オプション、APIバージョン10.0以降、アクセス範囲global
コード例:
------
上記はSalesforce組織の設定内にある
Visualforce Componetnts のリファレンスを翻訳したものです。
TOEICが残念な人間が翻訳していますので注意してください。
#なお、ほかのタグも気が向いたら翻訳するかもしれません
p.s.
どっかに日本語化されたものがあるかもしれません。
あくまで、参考として..
すべてのVisualforceページはこの1組のタグで囲まなくてはならない。
属性名:
action属性値の型:
ApexPages.Action説明:
該当ページがサーバにリクエストされると、属性値に指定したアクションメソッドが呼び出されます。
たとえば、
action={"!doAction"}の場合、コントローラのメソッドdoAction()が呼び出されます。属性が指定されていない場合は、普通にページがロードされます。
アクションメソッド(アクションメソッドは通常次の遷移先のPageReferenceを返却する)
null値を返した場合、現在の画面を再描画します。アクションメソッドはページ描画されるまえに呼び出され、別のページへリダイレクトされます。
アクションメソッドを初期化のために使用すべきではありません。
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
apiVersion属性値の型:
double説明:
該当ページを描画・実行する際に使用されるForce.com WebサービスAPIのバージョンを指定します。
※オプション、APIバージョン10.0以降、アクセス範囲global
属性値:
cache属性値の型:
Boolean説明:
該当ページをキャッシュするかどうか真偽値で指定します。
真値の場合、ブラウザは該当ページをキャッシュします。
指定しない場合は、デフォルトである偽値が指定されたものとして動作します。
しかしForce.com サイトでは、属性
cacheは指定しない場合、デフォルトとして真値を指定したものと判断され、該当ページをキャッシュします。詳細はSalesforce組織のオンラインヘルプの"Caching Force.com Sites Pages"を参照して下さい。
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
contentType属性値の型:
String説明:
描画されたページフォーマットとして指定したMIMEタイプが使用されます。
属性値として
"text/html"、"image/png"、"image/gif"、"video/mpeg"、"text/css"、"audio/html"などが指定可能です。MIMEタイプについてはW3C仕様を参照してください。
#の後にファイル名を定義することもできます。(例:"application/vnd.ms-excel#contacts.xls")注意:ファイル名指定のある場合、属性
cacheが真でなくては開くことのできないブラウザがあります。※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
controller属性値の型:
String説明:
該当ページが使用するカスタムコントローラクラス名を指定します。
属性
standardControllerと一緒に指定することはできません。※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
expires属性値の型:
Integer説明:
キャッシュ期間を秒で指定します。
cache属性が真値でこの属性が指定されていない場合、デフォルト値として0秒が採用されます。Force.com Siteの場合、
cache値が偽値ではない場合、デフォルト値として600秒が採用されます。詳細はSalesforce組織上のオンラインヘルプ"Caching Force.com Sites Pages"を参照の事。
※オプション、APIバージョン14.0以降
属性名:
extensions属性値の型:
String説明:
該当ページに追加する拡張コントローラクラス名を指定する(複数指定可能)。
※オプション、APIバージョン11.0以降、アクセス範囲global
属性名:
id属性値の型:
String説明:
ページ内の別のコントローラから参照されるときに使用するID名。
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
label属性値の型:
String説明:
Salesforceセットアップツール(ブラウザ:氏名→設定)上で参照されるときに使用するラベル名。
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
language属性値の型:
String説明:
Salesforce上のトランスレーション(トランスレーションワークベンチ)に結び付けるためのラベル名を指定します。
指定した値で表示しているページの言語をオーバライドします。
Salesforceにてサポートされている言語のキー値を属性値として定義可能です(たとえば"en"や"en-US"など)。
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
name属性値の型:
String説明:
Force.com Webサービス内のページとして参照するための一意な名前。
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
pageStyle属性値の型:
String説明:
属性
pageStyleはSalesforce API 16.0の段階でdeprecated扱いとなりました。※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
recordSetName属性値の型:
String説明:
属性
pageStyleはSalesforce API 16.0の段階でdeprecated扱いとなりました。代わりに属性recordSetVarを使用してください。※オプション、APIバージョン14.0以降
属性名:
recordSetVar属性値の型:
String説明:
このレコードセットは、ページ上への表示やレコード上でのアクション実行のための戻り値として式の中で使用することができます。
たとえば、標準コントローラを使用していて
recordSetVar値として"accounts"(商談)が定義されている場合は、次のように記述することで単純な商談レコードのpageBlockTableを作成することができます:<apex:pageBlockTable value="{!accounts}" var="a"><apex:column value="{!a.name}"/></apex:pageBlockTable>※オプション、APIバージョン14.0以降
属性名:renderAs
属性値の型:
String説明:
サポートされているコンテンツコンバータの名前を指定します。
現在サポートされているコンテンツコンバータはPDFのみです。
この属性値に"pdf"を指定することで、該当ページをPDFとして変換されます。
PDF変換が目的のVisualforceページは、ページを印刷用としてデザイン・最適化してください。
入力フィールドやボタン、その他のJava Scriptを許可しているコンポーネントなどのformタグ要素を含む構成である単純ではない標準コンポーネントでは使用すべきではありません。
これはformタグ要素を含めることを制限するわけではありません。
組織へ配置する前に変換ページを確認してください。
PDF変換結果が文字の表示に失敗し場合、CSS内のフォントを調整してください。
(例:
<apex:page renderas="pdf"> <style> body { font-family: Arial Unicode MS; } </style>)注意:
pageBlockやsectionHeaderコンポーネントでの2バイトフォントを使ったPDF変換はサポートされていません。※オプション、APIバージョン13.0以降、アクセス範囲global
属性名:
rendered属性値の型:
Boolean説明:
ページをレンダリングさせるかを真偽値で指定します。
指定しない場合は、デフォルト値として真値が指定されたものとして動作します。
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
setup属性値の型:
Boolean説明:
標準のSalesforceセットアップページのスタイルを使用するかどうかを真偽値で指定します。
もし真値の場合、セットアップのスタイルを使用します。
属性を指定しない場合は、デフォルトである偽値が指定されたものとして動作します。
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
showHeader属性値の型:
Boolean説明:
Salesforceタブヘッダがページ内に含まれるかどうか真偽値で指定します。
真値の場合、タブヘッダが表示されます。
指定がない場合、デフォルトの真値が指定されたものとして動作します。
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
sidebar属性値の型:
Boolean説明:
標準Salesforceサイドバーを表示するか真偽値で指定します。
真値の場合、サイドバーが表示されます。
指定がない場合、デフォルトである真値が指定されたものとして動作します。
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
standardController属性値の型:
String説明:
該当ページの振る舞いをコントロールするSalesforceオブジェクトの名前を指定します。
この属性はすでに属性
controllerが指定されている場合、定義することができません。※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
standardStylesheets属性値の型:
Boolean説明:
属性
showHeaderが偽値である場合、標準Salesforceスタイルシートが生成されたページヘッダに追加されたかどうかを真偽値で指定します。真の場合、標準スタイルシート群が生成されたページヘッダに追加されます。
指定がない場合、デフォルトで偽値が指定されたものとして動作します。
偽値を設定することで、要求されたSalesforce.com CSSは正しく表示されない場合があります。
また、リリースバージョンによりスタイルが変更される場合があります。
※オプション、APIバージョン11.0以降、アクセス範囲global
属性名:
tabStyle属性値の型:
String説明:
色、スタイル、このページの選択されたタブをコントロールするSalesforceオブジェクトもしくはVisualforceタブを指定します。
カスタムオブジェクトを使用している場合、オブジェクトのDeveloper Nameで指定しなければなりません。
例えば、
MyCustomObjectの場合、"MyCustomObject__c"を指定します。標準コントローラを使用している場合、コントローラに関連付けられたスタイルが使用されます。
カスタムコントロールを定義している場合、ホームタブのものがデフォルトで使用されます。
カスタムVisualforceタブを使用する場合、タブの名前(ラベルではない)に続けて"
__tab"を指定してください。例えば、名前が"Source"、ラベルが"Sources"の場合、
tabStyle="Source__tab"と指定します。※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
title属性値の型:
String説明:
ブラウザに表示されるページタイトル。
注意:ページを開発者モードで編集しているときは、ページタイトルは表示されません。
※オプション、APIバージョン10.0以降、アクセス範囲global
属性名:
wizard属性値の型:
Boolean該当ページにて標準Salesforceウィザードページのスタイルを使用するかどうかを真偽値で指定します。
真の場合、ウィザードスタイルが使用されます。
指定がない場合、デフォルトの偽値が指定されたものとして動作します。
※オプション、APIバージョン10.0以降、アクセス範囲global
コード例:
<!-- Page: --> <apex:page renderAs="pdf"> <style> body { font-family: Arial Unicode MS; } </style> <h1>Congratulations</h1> <p>This is your new PDF</p> </apex:page>
------
上記はSalesforce組織の設定内にある
Visualforce Componetnts のリファレンスを翻訳したものです。
TOEICが残念な人間が翻訳していますので注意してください。
#なお、ほかのタグも気が向いたら翻訳するかもしれません
p.s.
どっかに日本語化されたものがあるかもしれません。
あくまで、参考として..
2011年5月14日土曜日
Salesforce.com認定デベロッパー試験を受ける
Salesforce認定デベロッパーは、
Force.com上でカスタムアプリを
作る開発者向きの試験に合格する事で
取得できます。
開発者用の資格には
上級デベロッパーというのもあるのですが、
ブラウザのみで宣言的開発を行う範囲
→デベロッパー
対応する研修:Force.com基礎コース
ApexやVisualforceページを使ったコーディング
→上級デベロッパー
対応する研修:Force.com開発者コース
という切り分けになっています。
ごりんごりんコードを書いたり
VisualforceとAPEXコードで
Springよろしく開発しちゃう人は
上級までの知識が必要になります。
話をもどして..
認定デベロッパー試験は
PCによる選択・多岐選択式の問題が合計60問、
合格点は41点以上で90分の長丁場になります。
私は、
対象の研修を受験してから、
家に帰ってテキストを全部勉強しなおして、
テキストの「確認」と
演習テキストの演習終わりにある"問題"を
一通りといて受けました。
難易度は、
まる2日ほどべったり勉強すれば受かるとおもいます。
まあよくあるベンダの認定資格並みといったところでしょうか。
だいぶ昔にとった
Siebel2000Consultantよりは簡単だった。
テストの難易度は一緒くらいで
あっちはパッケージソフトなので
インストールなどの
導入関連の技術がいっしょくたになっていたため
試験範囲が広かったからなあ..
そうそう
試験終わったときおじさんが「おちた~」と
唸っていました。
おそらく研修を受けただけでそれほど復習せずに
ふらっと受けてしまったんだとおもいます(たぶん、ですけど)。
おじさんにはもうしわけないですが、
研修いっただけの人で何も復習していない人は
きちんと落ちる難易度設定なんだとおもいます。
認定試験に関する情報収集でSalesforce社のサイトに
いったことのある人はごぞんじだとおもいますが、
Study Guideというのが公開されています。
この文書のなかには、
サンプル問題が数題と
細かいセクション別の出題比率がでています。
各セクションごとにボーダーラインがあるわけではないので、
比率の高い箇所から順番に
勉強したほうが効率が良いはずですから、
必ず勉強を始める前に読んでおいてください。
公式の研修を受講された方なら
ご存知の
"人材採用管理アプリケーション"
がけっこうの比率で出題のねたとして
利用されていました。
テキストのSObject間の関係を
見ておいてください。
先のStudy Guideにでていますが、
一番よく出るセクションが
「データモデル」で、
ほとんどが
参照項目と主従項目の違い、
多対多
に関する問題でした。
人材採用アプリでは、
「評価」-(主従)→「申込」とか、
「内定」-(参照)→「申込」とか、
「給与」→「サイト掲載職種」←求人サイト(多対多)
とかを題材にして、
積み上げ集計だとか
数式でリレーションを云々とか
親を消したら子はどうなるとか
子のアクセス権は親に従うか云々
がよくだされていました。
研修用組織へのログインが有効なうちに
このあたりを集中して確認しておいてください。
あとは
プロファイルと組織の共有、共有ルールの振る舞い
なんかも何問かでていました。
次に出題比率の高い
「ビジネスロジック」は
ワークフローや承認プロセスの問題が中心で、
時間トリガ中の更新とか(Study Guideサンプルにもありましたけど)、
並行承認とか
ワークフローアクションをえらべとか
このセクションは比較的取りやすい問題が多かった
記憶があります。
暗号化項目も数問でてました。
データをのぞけるのはだれかとか、
暗号化項目にできる型はなど。
申請中変更のできるユーザを指定できるのは
管理者のみか、管理者と承認者だけかなんてのも
出てましたね。
間違えたのでこの問題はよく覚えています。
「ユーザインタフェイス」は、
レコードタイプとプロファイルでのページレイアウト出しわけとか
が出てました。
あとはページレイアウト上でつけられる制限なんかも。
「データ管理」は
ユーザインタフェイスとの複合問題で、
ユニーク設定をページレイアウト上で設定できるかとか
APIから追加・更新した場合ページレイアウトの必須設定はチェックされるか
出てました。
あとは更新する場合必須の項目なども。
外部IDについても出てました。
これはデータモデルに分類されるのかもしれないですけど。
ああ作れるタブはどれかっていう選択問題もありましたね。
「レポートと分析」は
..勉強しづらいのですが、
問題にできる部分はそう多くないので
比較的取りやすいセクションです。
ダッシュボード上のコンポーネントの種類や
分析スナップショットで作らないといけないものなど。
ダッシュボード結果を電子メールで送信できるのは
Salesforceユーザ以外も可能か、
という問題が出ていたのは覚えてます。
「Force.comプラットフォームの概要」は..
どれがこのセクションの問題だったか..
これこれの機能はどのエディションから使えるか2つ選べ
とかいう問題が出てましたが、
2つ..といっただんかいで
これこれを知らないでも
EEとUEになるのは自明だったりする自明問題が
ここかな。
「アプリケーション設計」は
なにだすのかな..とおもっていましたが
カスタムオブジェクトは3つのもでるのどれにあたるのかとか
ページレイアウト、カスタムタブはどれかとか..
..まああまり勉強しなくても大丈夫のセクションでしょう。
長丁場であるため、
時間は比較的余裕があるとおもいます。
1問1分半なので、
セールス試験よりは
ゆっくり考えることができます。
私は
一旦回答しきって
見直し2回してタイムアップでした。
ただ時間をがっつりかけてしまうと後に響くので
3分以上はかけないなど自分ルールを
決めておくと良いかも。
SI会社のSEの場合は
上級試験範囲やもっと深い知識があったほうが
よいとおもいますが、
利用企業の人が自社内アプリ開発の基盤として
自社社員のみで開発する
とかならデベロッパー試験レベルの知識で
十分だと思います。
というかこのレベル以上の知識を
学習してもっと複雑なアプリを作る必要があるのであれば
Force.com以外のアーキテクチャでの開発が良いかもしれません。
#ケースによりますけど
Force.com基礎コース研修を受講した人は
理解度チェックとして度胸試しに
うけてみてはどうでしょうか。
ただ..
取得してもSalesforce.com社側から受けられる
メリットがあんまりないんですよね..
..って書いたら、誰も受けなくなっちゃうか..
Salesforce.com社にはもっと
資格取得者へ"アメ"を配ってほしいものですなw
p.s.
Salesforce.com認定試験って
なぜかピアソンとかでなく
富士通のeラーニングソフト上に構築された
システムでうごいてました。
試験が終わると
ダイアログがでて
60点中X点でした
とかいうダイアログだけでて終わり..
セールス試験は
一応Javaアプレットでレーダーチャートとか出たのに..
..こっちの方が値段髙いのに、淡白だなあ..
Force.com上でカスタムアプリを
作る開発者向きの試験に合格する事で
取得できます。
開発者用の資格には
上級デベロッパーというのもあるのですが、
ブラウザのみで宣言的開発を行う範囲
→デベロッパー
対応する研修:Force.com基礎コース
ApexやVisualforceページを使ったコーディング
→上級デベロッパー
対応する研修:Force.com開発者コース
という切り分けになっています。
ごりんごりんコードを書いたり
VisualforceとAPEXコードで
Springよろしく開発しちゃう人は
上級までの知識が必要になります。
話をもどして..
認定デベロッパー試験は
PCによる選択・多岐選択式の問題が合計60問、
合格点は41点以上で90分の長丁場になります。
私は、
対象の研修を受験してから、
家に帰ってテキストを全部勉強しなおして、
テキストの「確認」と
演習テキストの演習終わりにある"問題"を
一通りといて受けました。
難易度は、
まる2日ほどべったり勉強すれば受かるとおもいます。
まあよくあるベンダの認定資格並みといったところでしょうか。
だいぶ昔にとった
Siebel2000Consultantよりは簡単だった。
テストの難易度は一緒くらいで
あっちはパッケージソフトなので
インストールなどの
導入関連の技術がいっしょくたになっていたため
試験範囲が広かったからなあ..
そうそう
試験終わったときおじさんが「おちた~」と
唸っていました。
おそらく研修を受けただけでそれほど復習せずに
ふらっと受けてしまったんだとおもいます(たぶん、ですけど)。
おじさんにはもうしわけないですが、
研修いっただけの人で何も復習していない人は
きちんと落ちる難易度設定なんだとおもいます。
認定試験に関する情報収集でSalesforce社のサイトに
いったことのある人はごぞんじだとおもいますが、
Study Guideというのが公開されています。
この文書のなかには、
サンプル問題が数題と
細かいセクション別の出題比率がでています。
各セクションごとにボーダーラインがあるわけではないので、
比率の高い箇所から順番に
勉強したほうが効率が良いはずですから、
必ず勉強を始める前に読んでおいてください。
公式の研修を受講された方なら
ご存知の
"人材採用管理アプリケーション"
がけっこうの比率で出題のねたとして
利用されていました。
テキストのSObject間の関係を
見ておいてください。
先のStudy Guideにでていますが、
一番よく出るセクションが
「データモデル」で、
ほとんどが
参照項目と主従項目の違い、
多対多
に関する問題でした。
人材採用アプリでは、
「評価」-(主従)→「申込」とか、
「内定」-(参照)→「申込」とか、
「給与」→「サイト掲載職種」←求人サイト(多対多)
とかを題材にして、
積み上げ集計だとか
数式でリレーションを云々とか
親を消したら子はどうなるとか
子のアクセス権は親に従うか云々
がよくだされていました。
研修用組織へのログインが有効なうちに
このあたりを集中して確認しておいてください。
あとは
プロファイルと組織の共有、共有ルールの振る舞い
なんかも何問かでていました。
次に出題比率の高い
「ビジネスロジック」は
ワークフローや承認プロセスの問題が中心で、
時間トリガ中の更新とか(Study Guideサンプルにもありましたけど)、
並行承認とか
ワークフローアクションをえらべとか
このセクションは比較的取りやすい問題が多かった
記憶があります。
暗号化項目も数問でてました。
データをのぞけるのはだれかとか、
暗号化項目にできる型はなど。
申請中変更のできるユーザを指定できるのは
管理者のみか、管理者と承認者だけかなんてのも
出てましたね。
間違えたのでこの問題はよく覚えています。
「ユーザインタフェイス」は、
レコードタイプとプロファイルでのページレイアウト出しわけとか
が出てました。
あとはページレイアウト上でつけられる制限なんかも。
「データ管理」は
ユーザインタフェイスとの複合問題で、
ユニーク設定をページレイアウト上で設定できるかとか
APIから追加・更新した場合ページレイアウトの必須設定はチェックされるか
出てました。
あとは更新する場合必須の項目なども。
外部IDについても出てました。
これはデータモデルに分類されるのかもしれないですけど。
ああ作れるタブはどれかっていう選択問題もありましたね。
「レポートと分析」は
..勉強しづらいのですが、
問題にできる部分はそう多くないので
比較的取りやすいセクションです。
ダッシュボード上のコンポーネントの種類や
分析スナップショットで作らないといけないものなど。
ダッシュボード結果を電子メールで送信できるのは
Salesforceユーザ以外も可能か、
という問題が出ていたのは覚えてます。
「Force.comプラットフォームの概要」は..
どれがこのセクションの問題だったか..
これこれの機能はどのエディションから使えるか2つ選べ
とかいう問題が出てましたが、
2つ..といっただんかいで
これこれを知らないでも
EEとUEになるのは自明だったりする自明問題が
ここかな。
「アプリケーション設計」は
なにだすのかな..とおもっていましたが
カスタムオブジェクトは3つのもでるのどれにあたるのかとか
ページレイアウト、カスタムタブはどれかとか..
..まああまり勉強しなくても大丈夫のセクションでしょう。
長丁場であるため、
時間は比較的余裕があるとおもいます。
1問1分半なので、
セールス試験よりは
ゆっくり考えることができます。
私は
一旦回答しきって
見直し2回してタイムアップでした。
ただ時間をがっつりかけてしまうと後に響くので
3分以上はかけないなど自分ルールを
決めておくと良いかも。
SI会社のSEの場合は
上級試験範囲やもっと深い知識があったほうが
よいとおもいますが、
利用企業の人が自社内アプリ開発の基盤として
自社社員のみで開発する
とかならデベロッパー試験レベルの知識で
十分だと思います。
というかこのレベル以上の知識を
学習してもっと複雑なアプリを作る必要があるのであれば
Force.com以外のアーキテクチャでの開発が良いかもしれません。
#ケースによりますけど
Force.com基礎コース研修を受講した人は
理解度チェックとして度胸試しに
うけてみてはどうでしょうか。
ただ..
取得してもSalesforce.com社側から受けられる
メリットがあんまりないんですよね..
..って書いたら、誰も受けなくなっちゃうか..
Salesforce.com社にはもっと
資格取得者へ"アメ"を配ってほしいものですなw
p.s.
Salesforce.com認定試験って
なぜかピアソンとかでなく
富士通のeラーニングソフト上に構築された
システムでうごいてました。
試験が終わると
ダイアログがでて
60点中X点でした
とかいうダイアログだけでて終わり..
セールス試験は
一応Javaアプレットでレーダーチャートとか出たのに..
..こっちの方が値段髙いのに、淡白だなあ..
Salesforce.com認定セールス試験を受ける
Salesforce.com認定セールス試験を受けてきました。
セールス認定には一応メリットがあり、
取得者が1名いれば、
(もしくはコンサル認定1名以上いれば、)
Salesforce CRM/Force.comの協力社契約を
結ぶことができます。
#もしくは1ライセンスでも契約していればOK..だったとおもいます
協力社は
契約企業をSalesforce.com社に紹介することで
年間ライセンスの10%がいただける
というアライアンスです。
Salesforce.com社のパートナ営業がよくいう
はやりの製品を"いっちょかみ"することができます。
最近はやりのクラウドソリューションだけど
自社に載せるメニューがない会社は
この資格を取ることで
Salesforce CRM/Force.comをメニューに
のせることができます。
積極的にうりにいかずとも
メニューに載せられるわけで、
しかも顧客を運よく紹介できたら
受験料のもとは十分取り返せます。
#そんな"オトナ"な企業を探してみるのも
#面白いかもしれません;-p
まあ、いずれにせよ..
..デベロッパー試験よりはメリットがありますねw
私は..
ぶっちゃけ
値段も5000円と安いし、
営業向けの試験だから簡単かな..
とおもって何も考えずに
合格は結構余裕かな的なキモチで申し込みました。
Salesforce社のサイトに
ワークショップがあり
全部の動画を見ることが前提とあったのも
知ってたんですけど..
全く見ないで受けに行ってしまった..
一応合格しましたが..
..ぎりぎりでした..
デベロッパー試験同様
PCから受験するタイプのものなのですが、
時間25分で全50問と
時間が短いくせに設問が多い..
..答えに詰まって考える時間がほとんどない..
くそ、
25分間しかないのに..
50問も出しやがって..
家に帰ってから
ワークショップ動画を
ぱらぱらみてみたら..
..案の定ほとんどこの動画の内容から、でした。
これから受けようという人は
きちんと見て勉強しておいてください。
回答方式は、
多岐選択はほとんどなくて
ほとんどが一答式の
選択問題でした。
合格は50問中40問以上。
先に書いた通り
まず動画は事前に見ておくことをすすめますが、
気を付ける点をもうひとつ。
似たような問題が連投されるので
1問まちがえると数珠つなぎに間違える問題群
があること。
たとえば..
この"Value Buying Process"は
絵の中にある6つの四角の枠内が全部空欄になっていて
選択肢から選ばせる問題が3問ほどでたのですが、
1つ間違えたら数珠つなぎ的に間違えてしまいます。
こういうのは
勉強しないで受けにいった人間からすると
地雷地帯なわけです。
動画から出た問題のサンプルとして
もう1つ紹介しておきます。
"販売モデル"の絵も
問題に出ました。
赤枠で囲った部分が問題になってました。
これも
同じ絵で複数の役割で出題してましたね。
あと..動画見ていない人間が困るのは..
Salesforceの売り上げの国別比率とか、
現在の契約企業数とか..
逆に取りやすいのは一般的な問題。
CRMとは..とか、
顧客の訴求ポイントとか、
クラウドコンピューティングとかは
知らないでも回答できるのでありがたかったです。
気になったのは、
製品の内容についてあまり出てこない点。
..営業といえど
製品の内容についてもっと理解しておかないと
いけないんじゃないかな..と思うのですが..
ぎりぎり合格の私には
でかい口きける立場ではないですけど..
一緒に受けたのは4名、
顔色を見るとみな余裕で受かっている様子でした。
デベロッパー試験のように
「おちた~」
って唸るおじさんはいませんでした。
..っていうか、私がなりそうでした..
p.s.
ああいう認定試験の試験官、
楽そうでいいなあ..
後ろの席で本とか読めるし..
体力使わなさそうだし..
..老後は認定試験の試験官の仕事がいいなあ..
セールス認定には一応メリットがあり、
取得者が1名いれば、
(もしくはコンサル認定1名以上いれば、)
Salesforce CRM/Force.comの協力社契約を
結ぶことができます。
#もしくは1ライセンスでも契約していればOK..だったとおもいます
協力社は
契約企業をSalesforce.com社に紹介することで
年間ライセンスの10%がいただける
というアライアンスです。
Salesforce.com社のパートナ営業がよくいう
はやりの製品を"いっちょかみ"することができます。
最近はやりのクラウドソリューションだけど
自社に載せるメニューがない会社は
この資格を取ることで
Salesforce CRM/Force.comをメニューに
のせることができます。
積極的にうりにいかずとも
メニューに載せられるわけで、
しかも顧客を運よく紹介できたら
受験料のもとは十分取り返せます。
#そんな"オトナ"な企業を探してみるのも
#面白いかもしれません;-p
まあ、いずれにせよ..
..デベロッパー試験よりはメリットがありますねw
私は..
ぶっちゃけ
値段も5000円と安いし、
営業向けの試験だから簡単かな..
とおもって何も考えずに
合格は結構余裕かな的なキモチで申し込みました。
Salesforce社のサイトに
ワークショップがあり
全部の動画を見ることが前提とあったのも
知ってたんですけど..
全く見ないで受けに行ってしまった..
一応合格しましたが..
..ぎりぎりでした..
デベロッパー試験同様
PCから受験するタイプのものなのですが、
時間25分で全50問と
時間が短いくせに設問が多い..
..答えに詰まって考える時間がほとんどない..
くそ、
25分間しかないのに..
50問も出しやがって..
家に帰ってから
ワークショップ動画を
ぱらぱらみてみたら..
..案の定ほとんどこの動画の内容から、でした。
これから受けようという人は
きちんと見て勉強しておいてください。
回答方式は、
多岐選択はほとんどなくて
ほとんどが一答式の
選択問題でした。
合格は50問中40問以上。
先に書いた通り
まず動画は事前に見ておくことをすすめますが、
気を付ける点をもうひとつ。
似たような問題が連投されるので
1問まちがえると数珠つなぎに間違える問題群
があること。
たとえば..
この"Value Buying Process"は
絵の中にある6つの四角の枠内が全部空欄になっていて
選択肢から選ばせる問題が3問ほどでたのですが、
1つ間違えたら数珠つなぎ的に間違えてしまいます。
こういうのは
勉強しないで受けにいった人間からすると
地雷地帯なわけです。
動画から出た問題のサンプルとして
もう1つ紹介しておきます。
"販売モデル"の絵も
問題に出ました。
赤枠で囲った部分が問題になってました。
これも
同じ絵で複数の役割で出題してましたね。
あと..動画見ていない人間が困るのは..
Salesforceの売り上げの国別比率とか、
現在の契約企業数とか..
逆に取りやすいのは一般的な問題。
CRMとは..とか、
顧客の訴求ポイントとか、
クラウドコンピューティングとかは
知らないでも回答できるのでありがたかったです。
気になったのは、
製品の内容についてあまり出てこない点。
..営業といえど
製品の内容についてもっと理解しておかないと
いけないんじゃないかな..と思うのですが..
ぎりぎり合格の私には
でかい口きける立場ではないですけど..
一緒に受けたのは4名、
顔色を見るとみな余裕で受かっている様子でした。
デベロッパー試験のように
「おちた~」
って唸るおじさんはいませんでした。
..っていうか、私がなりそうでした..
p.s.
ああいう認定試験の試験官、
楽そうでいいなあ..
後ろの席で本とか読めるし..
体力使わなさそうだし..
..老後は認定試験の試験官の仕事がいいなあ..
2011年5月11日水曜日
RESTサービス呼び出し、非同期、DOMを使ったApexコードサンプル
Force.comでは
SOAP APIのサーバとしてAPIを公開し他システムへ利用させる(コールイン)ことも、
外部のSOAP APIをApexクラスから呼び出すこと(コールアウト)もできる。
しかし
RESTサービスについてはコールアウト(外部RESTを呼び出す)のみ実装可能で、
残念ながらRESTサービスサーバにすることはできない。
おそらく、
ガバナ制約という足かせプラットフォーム環境で、
よくAjaxで活用されるRESTコールを受け付けるのは
どう考えても向いていないから
なのだろう。
以下のサンプルは、
Force.com開発者コースDEV541の演習8-3で使用したコードである。
このコードはRESTのコールアウトのサンプルでもあるが、
非同期Apexのサンプルでもある。
非同期Apexは、
Javaでいう別Theadのrun()のような非同期メソッドを含む
Apexのことである。
非同期Apexメソッドを呼び出すと、
その結果を待たずに次の行へ処理が進み、
非同期Apexメソッド上の処理は別途スレッドで実行される。
(スレッド、という名前なのかはわからないけど)
ここではApexトリガからRESTサービスを呼び出しているが、
処理時間がインターネットや相手側の負荷でよめないので
非同期メソッド上に処理を記述している。
トリガというアプリ屋泣かせの足かせに
非同期というさらに重石を載せるような
コードをかかなくてはならず、
結果紹介するコードはサンプルのくせに
実装にフラグを使った保守しにくいコードになっている。
さらにこのコードは受け取ったXMLをDOMを使って
要素内の情報を取り出しているサンプルにもなっている。
通常トリガクラスで
呼び出し元となるレコードの更新を行う場合
DML処理(insert/update/delete)はご法度である。
しかしREST結果取得に時間がかかりそうなので
非同期処理化して
使っている。
非同期処理であり、
普通のプログラミング言語でもデバッグが大変なため
上記のようなError_Logカスタムオブジェクトを別途用意して
エラーの詳細情報をくみ取れるようにしておくと便利である。
が、
ログ情報がレコードとしてがんがんたまっていくので
容量上限に気を付けないとシステムが止まってしまう。
おまけに自動削除Apexトリガなどは埋め込みにくいので
人間系管理が面倒になることも注意だ。
ぬふー
SOAP APIのサーバとしてAPIを公開し他システムへ利用させる(コールイン)ことも、
外部のSOAP APIをApexクラスから呼び出すこと(コールアウト)もできる。
しかし
RESTサービスについてはコールアウト(外部RESTを呼び出す)のみ実装可能で、
残念ながらRESTサービスサーバにすることはできない。
おそらく、
ガバナ制約という足かせプラットフォーム環境で、
よくAjaxで活用されるRESTコールを受け付けるのは
どう考えても向いていないから
なのだろう。
以下のサンプルは、
Force.com開発者コースDEV541の演習8-3で使用したコードである。
このコードはRESTのコールアウトのサンプルでもあるが、
非同期Apexのサンプルでもある。
非同期Apexは、
Javaでいう別Theadのrun()のような非同期メソッドを含む
Apexのことである。
非同期Apexメソッドを呼び出すと、
その結果を待たずに次の行へ処理が進み、
非同期Apexメソッド上の処理は別途スレッドで実行される。
(スレッド、という名前なのかはわからないけど)
ここではApexトリガからRESTサービスを呼び出しているが、
処理時間がインターネットや相手側の負荷でよめないので
非同期メソッド上に処理を記述している。
トリガというアプリ屋泣かせの足かせに
非同期というさらに重石を載せるような
コードをかかなくてはならず、
結果紹介するコードはサンプルのくせに
実装にフラグを使った保守しにくいコードになっている。
さらにこのコードは受け取ったXMLをDOMを使って
要素内の情報を取り出しているサンプルにもなっている。
注意
XMLDom クラスは
Force.comにあらかじめ定義されているクラスではありません。
[developerforce]XML Dom parser(英語)
のViewSourceボタンを押してソースを入手できます。
テストクラスも一緒に置いてあるので、
本番環境にもあげられます。
// Apex Code 演習8-3 非SOAP HTTPコールアウト(1) // // trigger CandidateAddressValidation on Candidate__c (after insert, after update, before update) { // トリガ対象が1件のみの場合 if (Trigger.new.size() == 1){ // 新規追加の場合 if (Trigger.isInsert) { // 新規の場合は非同期妥当性検査フラグの状態にかかわらず // 住所情報妥当性チェック(非同期処理)を行い結果を // レコード上に書き込み更新する非同期処理を実行する // なお、非同期実行は1回のApex呼び出しで最大10回まで AddressValidator.validateAddress(Trigger.new[0].id); // 上記メソッド内のロジックは非同期で処理されており // コールしたら結果を待たずに次の処理へ進む } // 更新の場合 if (Trigger.isUpdate){ // 更新前処理の場合 if (Trigger.isBefore) { // 住所情報更新の場合 if ((Trigger.new[0].Street_Address_1__c != Trigger.old[0].Street_Address_1__c) || (Trigger.new[0].Street_Address_2__c != Trigger.old[0].Street_Address_2__c) || (Trigger.new[0].City__c != Trigger.old[0].City__c) || (Trigger.new[0].State_Province__c != Trigger.old[0].State_Province__c)) { // 非同期妥当性検査フラグを偽にする Trigger.new[0].AsyncValidationFlag__c = false; // 更新時妥当性検査処理は // after updateでのみ行うのでフラグを // 偽にすることでいちいち呼び出さない // ようにしている } // デバッグログ System.debug('\ncandidate=' + Trigger.new[0] + '\n'); // 更新後処理の場合 } else { // 非同期妥当性検査フラグが真の場合 if (!Trigger.new[0].asyncvalidationflag__c){ // 住所情報妥当性チェック // (非同期処理)を実行し結果を // 応募者レコード上に書き込む(更新) // 非同期実行は1回のApex呼び出しで // 最大10回まで AddressValidator.validateAddress( Trigger.new[0].id); // 上記メソッド内のロジックは非同期で // 処理されておりコールしたら結果を待 // たずに次の処理へ進む } } } // 更新の場合 } // 1件のみの場合 // 複数県の場合≒バッチ実行で複数件が来た場合は何もしない // おそらく、大量投入されたらコールアウトのガバナ制約を食いつぶすから }
通常トリガクラスで
呼び出し元となるレコードの更新を行う場合
DML処理(insert/update/delete)はご法度である。
しかしREST結果取得に時間がかかりそうなので
非同期処理化して
updateステートメントを使っている。
// Apex Code 演習8-3 非SOAP HTTPコールアウト(1) // // StrikeIronのサービスの1つである住所妥当性検査を使用して // 応募者(Candidate)レコード上の住所情報の妥当性をチェックして // 結果を同レコード上に格納する // public class AddressValidator { // StrikeIronサービスへログインするための情報 static final StrikeIronInfo__c info = [select userid__c, password__c from strikeironinfo__c where active__c = true limit 1]; // StrikeIronInfoはカスタムオブジェクトであり、 // あらかじめStrikeIronサイトで登録したユーザID、 // パスワード(平文)が1行だけ格納されている // 応募者の住所情報妥当性をチェックして結果を // 応募者レコード上に更新書き込みを行う // // ただしこの処理は米国住所のみ対応しており // 日本の住所妥当性は検査できない // 引数: id 応募者レコードID // 戻り値: なし(非同期メソッドはvoid必須) // // 非同期コールアウトメソッドとして指定しているので // このメソッドを呼び出した後は呼び出し元の次の処理へ // 進み、この中の処理は非同期に実行される @Future(callout=true) public static void validateAddress(String id) { // カスタムオブジェクトError_Logがあらかじめ // 定義されておりレコードとして書き込むための // メッセージ用変数 String msg = ''; try { // 引数で渡されたレコードIDから // レコード情報を取得 Candidate__c cand = [select // 非同期妥当性検査フラグ // StrikeIronを通したかどうかであり // 検査結果の合否ではない AsyncValidationFlag__c, // 住所1 Street_Address_1__c, // 住所2 Street_Address_2__c, // 市 city__c, // 州 state_Province__c, // 郵便番号 zip_postal_code__c, // 国 country__c, // 住所妥当性フラグ valid_us_address__c, // 行政区画 county__c, // 議会地区(選挙区?) congress_district__c, // 緯度(99.9999) latitude__c, // 経度(999.9999) longitude__c, // 住所エラーメッセージ // StrikeIronサービスのエラーメッセージ // を格納するための項目 address_error__c // 応募者オブジェクト from candidate__c // 引数で渡されたIDと一致する where id=:id]; // 応募者情報・StrikeIronログイン情報をメッセージに追加 msg += 'candidate=' + cand + '\n\n'; msg += 'info=' + info + '\n\n'; // 送信情報(リクエスト)を生成 HttpRequest req = new HttpRequest(); // エンドポイント(接続するサービスのURL)文字列を // 作成する // GETパラメータもURLの後ろに付加させるので // 適宜EncodingUtilを使用してUTF-8エンコード化して // 文字列を完成させる // エンドポイント用変数 String endpoint = 'http://ws.strikeiron.com/' + 'StrikeIron/USAddressVerification4_0/' + 'USAddressVerification/VerifyAddressUSA?'; // GETパラメータ文字列:ユーザID String uId = 'LicenseInfo.RegisteredUser.UserID=' + // EncodingUtilクラスを使ってエンコード EncodingUtil.urlEncode(info.userid__c,'UTF-8'); // GETパラメータ文字列:パスワード String pw = '&LicenseInfo.RegisteredUser.Password=' + info.password__c; // GETパラメータ文字列:住所情報1 String street1 = '&VerifyAddressUSA.addressLine1='; street1 += cand.Street_Address_1__c != null ? // 存在する場合はEncodingUtilでエンコード化 EncodingUtil.urlEncode( cand.Street_Address_1__c,'UTF-8') : // nullの場合は空文字にする ''; // GETパラメータ文字列:住所情報2 String street2 = '&VerifyAddressUSA.addressLine2='; street2 += cand.Street_Address_2__c != null ? // 存在する場合はEncodingUtilでエンコード化 EncodingUtil.urlEncode( cand.Street_Address_2__c,'UTF-8') : // nullの場合は空文字にする ''; // GETパラメータ文字列:市、州、郵便番号 String citystatezip = '&VerifyAddressUSA.city_state_zip='; citystatezip += cand.City__c != null ? // 存在する場合はEncodingUtilでエンコード化 // して次のデータのための空白1個追加 EncodingUtil.urlEncode( cand.City__c + ' ','UTF-8') : // nullの場合は空文字にする ''; citystatezip += cand.State_Province__c != null ? // 存在する場合はEncodingUtilでエンコード化 // して次のデータのための空白1個追加 EncodingUtil.urlEncode( cand.State_Province__c + ' ','UTF-8') : // nullの場合は空文字にする ''; citystatezip += cand.Zip_Postal_Code__c != null ? // 存在する場合はEncodingUtilでエンコード化 // して次のデータのための空白1個追加 EncodingUtil.urlEncode( cand.Zip_Postal_Code__c,'UTF-8') : // nullの場合は空文字にする ''; // エンドポイント文字列作成 endpoint += uId + pw + street1 + street2 + citystatezip + // 米国住所妥当性検査 '&VerifyAddressUSA.casing=Proper'; // メッセージにエンドポイント追加 msg += 'endpoint=' + endpoint + '\n'; // リクエストにエンドポイント登録 req.setEndpoint(endpoint); // HTTP MethodをGETにする req.setMethod('GET'); // HTTP通信インスタンス生成 Http http = new Http(); // リクエスト送信しレスポンスを受領 HttpResponse res = http.send(req); // HTTP状態コードが200(通信成功)の場合 if (res.getStatusCode() == 200) { // 応募者レコードを更新する // レスポンスから受信メッセージ本文の // DOMオブジェクトを生成 XMLDom doc = new XMLDom(res.getBody()); // メッセージ内のVerifyAddressUSAResultタグ部分 // のElementインスタンスを取得 XMLDom.Element result = doc.getElementByTagName( 'VerifyAddressUSAResult'); // 属性AddressStatus値がValid(妥当性検査合格) // の場合 if (result.getValue('AddressStatus')=='Valid'){ // 住所妥当性検査フラグを真にする cand.valid_us_address__c = true; // 国は米国固定なので決め打ち cand.Country__c = 'US'; // 属性ZipPlus4値を郵便番号に格納 cand.Zip_Postal_Code__c = result.getValue('ZipPlus4'); // 属性County値を行政区画に格納 cand.County__c = result.getValue('County'); // 属性CongressDistrict値を議会地区に // 格納 cand.Congress_District__c = result.getValue( 'CongressDistrict'); // 属性Latitude値を緯度に格納 cand.Latitude__c = // 数値項目なのでDoubleクラスを // 使ってDouble化する Double.valueOf( result.getValue( 'Latitude')); // 属性Longitude値を経度に格納 cand.Longitude__c = Double.valueOf( result.getValue( 'Longitude')); // 妥当性検査成功なので空文字にする cand.address_error__c = ''; // Validでない=不合格の場合 } else { // 住所情報は書き換えない // StrikeIronサービスで取得できる // 行政地区、議会地区、緯度、経度 // は空文字やnull値に初期化しておく // 行政区画を空文字にする cand.County__c = ''; // 議会地区を空文字にする cand.Congress_District__c = ''; // 緯度をnullにする // 画面に項目は出るが値の部分には // なにも出ない cand.Latitude__c = null; // 経度をnullにする cand.Longitude__c = null; // StrikeIronエラーメッセージを格納 cand.address_error__c = // エラー番号 result.getValue( 'AddressErrorNumber') + ' - ' + // エラーメッセージ result.getValue( 'AddressErrorMessage'); // 住所妥当性検査フラグを偽にする cand.valid_us_address__c = false; } // 結果がValidであるかどうかはともかく // StrikeIron妥当性検査を実施したので // 非同期妥当性検査フラグを真にする cand.asyncvalidationflag__c = true; // 更新後応募者レコード情報をメッセージに追加 msg += 'async updated candidate=' + cand + '\n'; // 応募者レコードを更新する update cand; // この更新処理についても // CandidateAddressValidationトリガを // 2度(before update/after update)実行 // されてしまうが、 // トリガ内で住所1、住所2、市、州の更新を // した場合のみafter updateで妥当性検査が // 実行される実装になっているため、 // StrikeIronサービスは呼び出されない // だったらinsertとbefore updateのみの // トリガにすればいいのだけど、 // Apexトリガには // 1. 元のレコードがロード、または初期化される // 2. 新しいレコードの値がロードされ、古い値を // 上書きされ、必須項目などの検証処理が実行 // される // 3. すべてのbeforeトリガが実行される // 4. カスタム検証ルールを含むシステム検証が // 行われる // 5. レコードはデータベースに保存されるが、 // コミットはされない // 6. すべてのafterトリガが実行される // 7. 割り当てルールが実行される // 8. 自動返信ルールが実行される // 9. ワークフロールールが実行される // 10. ワークフローフィールドが更新されたら、 // レコードがリロードされる // 11. レコードの更新後、beforeトリガおよび // afterトリガがもう一度起動される // 12. エスカレーションルールが実行される // 13. すべてのDML操作がデータベースにコミット // される // 14. 電子メールの送信など、コミット後の // ロジックが実行される // ※引用元: // Force.com開発者コードテキストDEV541 p174 // この順番に処理されていく。 // だから、宣言的開発で設定された必須 // チェックや入力規則などを先に実行させたい // がために面倒でもafterで処理しなくてはならな // かったから、と読んだ・ // HTTP状態コードが200ではない(通信失敗の)場合 } else { // デバッグログにレスポンス情報を書き込む System.debug('Callout failed: ' + res); // Error_Logへメッセージやレスポンスの主要情報 // を書き込む msg += 'STATUS:'+res.getStatus(); msg += '\nSTATUS_CODE:'+res.getStatusCode(); msg += '\nBODY: '+res.getBody(); Error_Log__c log = new Error_Log__c(); log.trace__c = msg; insert log; } // HTTP状態コードのif文 // 例外発生時処理 } catch(Exception e) { // デバッグログに例外情報書き込む System.debug('ERROR: '+ e); // Error_Logへ例外情報を書き込む Error_Log__c log = new Error_Log__c(); log.trace__c = msg + '\n' + e.getCause() + '\n' + e.getMessage(); insert log; } // try-catch句:終わり } // validateAddress():終わり }
非同期処理であり、
普通のプログラミング言語でもデバッグが大変なため
上記のようなError_Logカスタムオブジェクトを別途用意して
エラーの詳細情報をくみ取れるようにしておくと便利である。
が、
ログ情報がレコードとしてがんがんたまっていくので
容量上限に気を付けないとシステムが止まってしまう。
おまけに自動削除Apexトリガなどは埋め込みにくいので
人間系管理が面倒になることも注意だ。
ぬふー
2011年5月6日金曜日
VisualforceページをPDF化サンプル
以下のコードは、
Visualforceページの
属性
HTMLではなくPDFとしてユーザに渡すことができるサンプルである。
出自はForce.com開発者コースのVisualforce演習にて
提供されたコードである。
Force.com上のDBデータを使ってPDFが作成できるので
ユーザ間で紙文書としてのやり取りが必要な場合には
活用できる。
ただHTMLとして表現できないものはダメなので
そのへんは癖が結構あると考えた方がいいだろう。
Visualforceページの
<apex:page>タグの属性
renderAsを使うことでHTMLではなくPDFとしてユーザに渡すことができるサンプルである。
出自はForce.com開発者コースのVisualforce演習にて
提供されたコードである。
<!-- Visualforce 演習2-1 Visualforce でのPDFの生成 -->
<!-- 申し込み応募用紙をPDFとして提供する -->
<!-- 申し込みの意思表示のために署名させるためにPDFとして提供しているようだ -->
<!-- 申込(Offer__c)の標準コントローラを使用 -->
<!-- pageタグにはrenderAs属性がありこれをpdfと指定するとPDF化して表示できる -->
<apex:page standardController="Offer__c" showHeader="false" renderAs="pdf">
<body>
<center>
<!-- HTMLのtableタグになる -->
<apex:panelGrid columns="1" width="100%">
<!-- 組織の「組織名」 -->
<apex:outputText value="{!$Organization.Name}" styleClass="companyName"/>
<!-- 組織の「町名・番地」 -->
<apex:outputText value="{!$Organization.Street}"/>
<!-- 組織の「市区群」「都道府県」「郵便番号」 -->
<apex:outputText value="{!$Organization.City}, {!$Organization.State} {!$Organization.PostalCode}"/>
<!-- 組織の「電話番号」
<apex:outputText value="{!$Organization.Phone}"/>
</apex:panelGrid>
</center>
<p>
<br/><br/>
<!-- 申込日の表示を英語表記にしている-->
<apex:outputText value="{!CASE( MONTH(Offer__c.Offer_Date__c) ,
1, "January",
2, "February",
3, "March",
4, "April",
5, "May",
6, "June",
7, "July",
8, "August",
9, "September",
10, "October",
11, "November",
12, "December",
"None")} {!DAY(Offer__c.Offer_Date__c)}, {!YEAR(Offer__c.Offer_Date__c)}" />
<br/><br/><br/>
</p>
<p>
<!-- HTMLのtableタグ -->
<apex:panelGrid columns="1" width="100%">
<!-- 応募者氏名 -->
<apex:outputText value="{!Offer__c.Job_Application__r.Candidate__r.First_Name__c} {!Offer__c.Job_Application__r.Candidate__r.Last_Name__c}" styleClass="candidateName"/>
<!-- 応募者住所1 -->
<apex:outputText value="{!Offer__c.Job_Application__r.Candidate__r.Street_Address_1__c}" />
<!-- 応募者住所1 -->
<apex:outputText value="{!Offer__c.Job_Application__r.Candidate__r.Street_Address_2__c}" rendered="{!NOT(ISNULL(Offer__c.Job_Application__r.Candidate__r.Street_Address_2__c))}" />
<!-- 応募者市区群+都道府県+郵便番号 -->
<apex:outputText value="{!Offer__c.Job_Application__r.Candidate__r.City__c}, {!Offer__c.Job_Application__r.Candidate__r.State_Province__c} {!Offer__c.Job_Application__r.Candidate__r.Zip_Postal_Code__c}" />
<!-- 応募者国名(定義されていた場合のみ) -->
<!-- rendered属性が真であれば有効になる -->
<apex:outputText value="{!Offer__c.Job_Application__r.Candidate__r.Country__c}" rendered="{!NOT(ISNULL(Offer__c.Job_Application__r.Candidate__r.Country__c))}" />
<br/>
<!-- Dear+名前 -->
<apex:outputText value="Dear {!Offer__c.Job_Application__r.Candidate__r.First_Name__c}," />
<!-- テキスト -->
<apex:outputText >
<p>
<!-- 募集職種への申し込み開始云々 -->
I am pleased to offer you a position with Universal Containers (the "Company") as a {!Offer__c.Job_Application__r.Position__r.Name} for a start date of {!MONTH(Offer__c.Job_Application__r.Position__r.Start_Date__c)}/{!DAY(Offer__c.Job_Application__r.Position__r.Start_Date__c)}/{!YEAR(Offer__c.Job_Application__r.Position__r.Start_Date__c)}, reporting to {!Offer__c.Job_Application__r.Position__r.Hiring_Manager__r.Name}.
</p>
<p>
<!-- 給与やボーナスの話 -->
If you decide to join us, you will receive an annual base salary of ${!ROUND(Offer__c.Actual_Salary__c,0)} less applicable withholding, which will be paid semi-monthly in accordance with the Company's normal payroll procedures. In addition, you will be eligible to receive a discretionary {!ROUND(Offer__c.Bonus_Percentage__c,0)}% bonus based on individual performance, Company performance, and corporate matrix.
</p>
<p>
<!-- ストックオプションの話 -->
Subject to approval of the Company's Board of Directors, you will be granted an option to acquire {!ROUND(Offer__c.Stock_Options__c,0)} shares of Common Stock, vesting 25% on the first anniversary of the grant date and 1/48th of the grant amount each month thereafter, so long as your employment with the Company continues. The grant price of the stock option and vesting date of the stock option will be set upon Board approval.
</p>
<p>
<!-- 締め切りの話 -->
As a Company employee, you are also eligible to receive certain employee benefits. The Company reserves the right to change the benefits and compensation programs at any time. This offer expires on {!MONTH(Offer__c.Offer_Expiration_Date__c)}/{!DAY(Offer__c.Offer_Expiration_Date__c)}/{!YEAR(Offer__c.Offer_Expiration_Date__c)}, and is contingent upon the results of your background investigation.
</p>
<p>
<!-- 応募者の権利の話 -->
If you choose to accept this offer, your employment with the Company will be voluntarily entered into and will be for no specified period. As a result, you will be free to resign at any time, for any reason or for no reason, as you deem appropriate. The Company will have a similar right and may conclude its employment relationship with you at any time, with or without cause. In addition, you will be required to gain approval from Universal Containers in the event that you are a member of or would like to participate on the board of any existing or new companies.
</p>
<p>
<!-- 身分証明の話 -->
For purposes of federal immigration law, you will be required to provide the Company documentary evidence of your identity and eligibility for employment in the United States. Such documentation must be provided to us within three (3) business days of your hire date, or our employment with you may be terminated.
</p>
<p>
<!-- 申込時合意事項の話 -->
This offer letter fully sets forth all of your compensation information and expectations, and you agree that in making your decision to join the Company you are not relying on any oral or other representations concerning any other compensation or consideration or the duration of your employment with the Company, including but not limited to any value associated with your stock options.
</p>
<p>
<!-- サインして提出云々 -->
To indicate your acceptance of the Company’s offer, please sign and date this letter in the space provided below and return it to me. A duplicate original is enclosed for your records. You will be required to sign an Employee Inventions and Proprietary Rights Assignment Agreement as a condition of your employment. This letter, along with any agreements relating to proprietary rights between you and the Company, set forth the terms of your employment with the Company and supersede any prior representations or agreements, whether written or oral. This letter may not be modified or amended except by a written agreement, signed by the Company and by you.
</p>
<p>
<!-- オリエンテーションの話 -->
If you accept this job offer, your hire date will be on the day that you attend new-hire orientation. Plan to work for the remainder of the business day after new-hire orientation ends.
</p>
<p>
<!-- 申込追加コメント -->
{!Offer__c.Additional_Instructions__c}
</p>
<p>
<!-- しめくくり -->
We look forward to working with you at Universal Containers. Welcome aboard!
</p>
<p>
<!-- 草々 -->
Best Regards,
</p>
<p>
<br/>
<br/>
<br/>
________________________________
<br/>
<!-- 募集職種担当者(所有者)名前 -->
{!Offer__c.Job_Application__r.Position__r.Owner.Name}
<br/>
<!-- 採用担当 -->
Hiring Coordinator, Human Resources
</p>
<p>
<br/>
<!-- 申し込み用紙 -->
<h4>Accept Job Offer</h4>
By signing and dating this letter below, I, {!Offer__c.Job_Application__r.Candidate__r.First_Name__c} {!Offer__c.Job_Application__r.Candidate__r.Last_Name__c}, accept the job offer of {!Offer__c.Job_Application__r.Position__r.Name} by Universal Containers.
<br/>
Signature:__________________________________ Date:_____________
</p>
</apex:outputText>
</apex:panelGrid>
</p>
</body>
</apex:page>
Force.com上のDBデータを使ってPDFが作成できるので
ユーザ間で紙文書としてのやり取りが必要な場合には
活用できる。
ただHTMLとして表現できないものはダメなので
そのへんは癖が結構あると考えた方がいいだろう。
登録:
投稿 (Atom)
Google Colab相当の環境をローカルPC上のDocker Composeで実現する
Docker Composeの有料版に、お金を払いたくない ^H^Hが使えない ため古いゲーミングPC(GeForce3080)にDocker Composeを入れてその上のコンテナでGoogle Colab相当のノート操作ができないかためしてみた: コンテナイメージとして a...

