ipex

Salesforceの情報や趣味(ゲーム等)についてフリーに

Salesforce Spring'16 Release Note #0

Salesforce Spring'16 Release Note
http://docs.releasenotes.salesforce.com/en-us/spring16/release-notes/salesforce_release_notes.htm

Spring'16のリリースノート公開されました。

何と言っても特筆すべきは…
この青色の蝶ですよね。

f:id:ipex:20160116143645p:plain:w200

調べてみたら、どうやら「アサギマダラ」という蝶っぽい。

アサギマダラ - Wikipedia

f:id:ipex:20160116145551j:plain:w200

<script>と<apex:includeScript>

<script src="https://..." />
<apex:includeScript value="{!URLFOR($Resource.XXX)}" />

両者の違いについて。

併用するとエラーになることが多く、
何となくで回避してきたけど、下記にまとめてあって理解した。

http://www30304u.sakura.ne.jp/blog/?p=1800

HTML生成時に「apex:includeScript」タグを使ったプラグインの方はhead配下で読み込まれるが、
素のscriptタグを使ったjQuery本体はもっと下のbody近くで読み込まれるようになり、読み込み順が逆転してエラー

ということらしい。

エラーということだけど、
この読み込みタイミングの違いを使って、抜け道的な実装ができそう。

Wordpress + heroku を始めたい

あれはプログラミングのプの字も知らない頃…
記事の執筆のアルバイトをしたことがあるのですが、
その時にWordpressを使って記事を書いていました。

あの時は、用意された環境でマニュアル通りにやっていたので、
// アルバイトなので当たり前ですが
あまり覚えていないのですが、今一度Wordpressを触ってみたいなと思い立ちました。

つまり、WordpressでBlogを新規に立ち上げるということで、
それをこのBlog上で紹介するのは矛盾というか、
ニワトリか卵か、みたいな雰囲気もあるのですが…個人的な技術メモに過ぎないので問題無いですね。

以下を参考にしつつ…

noppiki.hateblo.jp

herokuを使ってWordpressが立ち上げられるみたいなので、herokuも初挑戦。
Salesforceやってるし、herokuも多少はね。

色々初めて尽くしですが、今月を目処に進めます。

共有グループに含まれるユーザのIdを取得する

共有グループのIdを受け取って、
その共有グループに含まれるユーザのIdを返すメソッド

ユーザだけでなく共有グループも含まれている可能性があるため、再帰的に記述する。

/** 
* グループメンバーの取得 
*/ 
public static Set<id> GetUserIdsFromGroup(Id groupId){ 
    Set<Id> result = new Set<Id>(); 

    String userType = Schema.SObjectType.User.getKeyPrefix(); 
    String groupType = Schema.SObjectType.Group.getKeyPrefix(); 

    // 指定のグループのグループメンバーを取得し、ループ 
    for (GroupMember m : [Select Id, UserOrGroupId From GroupMember Where GroupId =: groupId]) { 

        // グループメンバーがUserの場合、resultにadd 
        if (((String)m.UserOrGroupId).startsWith(userType)) { 
            result.add(m.UserOrGroupId);
        // グループメンバーがGroupの場合、再帰呼び出ししてUser単位まで処理してresultにadd 
        } else if (((String)m.UserOrGroupId).startsWith(groupType)) { 
            result.addAll(GetUSerIdsFromGroup(m.UserOrGroupId)); 
        }
    }

    return result; 
}

ビューステートエラー対応

遂にビューステートエラーとご対面してしまったので、
今後のために、実施した対応などをログ。

対応1:ビューステートの確認

ユーザの権限にある「開発モードでビューステートを表示」にチェックを入れた状態で、
Visualforceページを表示し、画面下部のコンソールからビューステートを見てみる。

サイズが大き過ぎる配列などが無いか、不要なデータがVisualforce側に渡っていないか、確認する。

対応2:プログラムの効率化

不要なデータ(項目など)が無いか、
実行しているSOQLのLIMITなどが考慮されているか確認する。

上記の対応で改善しない場合、ページ側の設計の改善を検討する。
(一覧の場合、ページングの実装など)

変数に、transient修飾子の付与の検討。

カスタム設定を使用した、動的な制限の検討(上記のLIMITなど)。

Visualforceのボタンについてのあれこれ

VisualforceのボタンのStyleについてちょっと調べたのでログ

・ボタンを<apex:commandButton>で設置すると、Salesforce標準のCSSが適用されてしまう。

方法1:<apex:page>のstandardstylesheets属性をFalseに設定する
方法2:勝手に適用されたCSSのclassを何かしらの方法で削除する
方法3:HTMLでボタンを作って、<apex:actionFunction>などを使う

・マウスオーバーした際に、ボタンをへこませたりしたい。

<apex:commandButton>のonMouseover属性、onMouseout属性を設定する。

<apex:commandButton image="{!URLFOR($Resource.SampleResourse, 'SampleResourse/images/btn_off.png')}"
                    alt="ダウンロード"
                    styleClass="button1"
                    onMouseover="this.src='{!URLFOR($Resource.SampleResourse, 'SampleResourse/images/btn_on.png')}'"
                    onMouseout="this.src='{!URLFOR($Resource.SampleResourse, 'SampleResourse/images/btn_off.png')}'"/>


image属性:初期表示時の画像(通常)
onMouseover属性:マウスオーバー時の画像(へこむ)
onMouseout属性:マウスオーバー後の画像(通常)

onMouseout属性で、通常の画像に戻してあげるのを忘れない。


ボタンに画像は使わない派だったけど、実際作ってみると楽しい。
デザイン系の仕事もやってみたいなあ。

Apexでランダムな文字列を作成するメソッド

メモ用に。

Apexでランダムな文字列を作成するメソッド
多分、某ブログで共有されていたものの、真似の真似ぐらいのやつ。

public static string getRandomString(Integer LengthRequired){
    String CharList = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_';
    String Res = '';
    integer position;
    for(Integer i = 0; i <= LengthRequired; i++) {
        position = Integer.valueof(String.valueof(Math.roundToLong(CharList.length()*Math.random()))) -1;
        if(position < 0){
            position = 0;
        }
        Res += CharList.substring(position,position+1);
    }
    return Res;
}

凄く便利なメソッドなんだけど、
一番良く使うのが、テストクラスでランダムにユーザ名を付ける時っていうのは何だか切ない。