2017年7月21日金曜日

メンタルヘルスケアの記事を読んで

http://itpro.nikkeibp.co.jp/atcl/column/16/081800177/061500031/?ST=spleaf

この話はとても分かりやすかった。

メンタルヘルスケアについての話なんだけれど、ある日突然パタッといったりするもんだよということが書かれている。

頑張って働くというのは大変なようで、案外簡単だったりする。仕事だとやらないと、なんていう義務感も働くのでなおさら。

いまは残業にたいして厳しいのでそうでもないけれど、私が仕事を始めた頃はそうでもなかった。プログラマという職業を選んだということもあるかもしれないけれど。

まだ大丈夫なんて自分に言い聞かせはじめたら、かなり危ない兆候で、本当は休まないといけない。まだ大丈夫なんて、通常の状態じゃ思ったりしない。

趣味が楽しくなくなったり、休日に起きれなくなったりと、体からシグナルは意外とたくさん出ていたりする。

「大丈夫?」なんて声をかけたところで「大丈夫」と大抵は答えが返ってくる。普段と言動が変わってしまった人の「大丈夫」なんてまったく信用ならない。

冒頭の記事にもあるようにストレスとはうまく付き合わないといけないわけだけど、これって周囲の協力が必要と思う。

セルフケアが重要なのは当然だけど、ストレスの感じかたは人それぞれで、一概に決めつけられない。精神的に強い人というのはあまり見たことなくて、特定の状況において強いとか、得意なところが人によってちがう。

お互いがお互いをという関係になってくると思うので、あるときは助けるし、別のときは助けてもらえるというのがいい関係だと思う。

2017年7月18日火曜日

Salesforce : ContentDocumentに新しいバージョンをアップロード

ContentVersionのinsertをしてやればApexでContentDocumentに新しいファイルのアップロードを行える。では、すでにアップロードされているファイルの新しいバージョンをアップロードするにはどうすればいいのだろうか。

ContentVersionはContentDocumentIdというフィールドを持っている。これはContentVersionが紐づいているContentDocumentのIDを保持するフィールドだ。なので、insertしてやるときに、新しいバージョンをアップロードしたいContentDocumentのIDをこのフィール―ドにセットしてやればいい。

ContentVersion cv = new ContentVersion();
cv.Title = 'アップロードテスト';
cv.VersionData = this.uploadFile;
cv.PathOnClient = 'test.jpg';
cv.isMajorVersion = true;

// 新しいバージョンを作成するContentDocumentを指定
cv.ContentDocumentId = '06910000009UasWAAS';

insert cv;

2017年7月13日木曜日

Salesforce : ContentDocument?


昨日ContentVersionへのアップロードに成功したのだけれど、このページのURLが気にかかっている。

*****/sObject/ContentDocument/home

ContentVersionにアップロードすると、ContentDocumentに格納されているようなのだ。ContentVersionについて調べているときに、ちらほらと見かけたのを見て見ぬふりをしていたが、真面目に取り組みあわないといけないようだ。

ちょっと調べた感じだとこんなイメージ。


なのだけれど、ContentDocumentHistoryなるオブジェクトも存在していて、VersionとHistoryってなにが違うのかがよく分からない。

2017年7月12日水曜日

Salesforce : ContentVersionはどこに?

昨日ContentVersionのinsertに成功したと思しき結果が得られた。成功したと言いきれないのは、insertした結果のファイルがどこに行ってしまうのかを知らないからだ。

ContentVersionなんだから何かのバージョン管理してるものなんだろうなあ、とか考えてみると気になることはあるのだけれど、とりあえず、insertされたファイルの行方を探そうと思う。

アプリケーションランチャーを開いてみると、「ファイル」という名前の項目がいた。


これじゃないだろうか?


思った通り、アップロードしたファイルを見つけることが出来た。

2017年7月11日火曜日

Salesforce : Apex : transientキーワード

ビューステートにはガバナ制限があるので、128KB以上のデータを扱えない。それ以上のデータを扱うには、このガバナ制限を回避する必要がある。その方法としてtransientキーワードを使う。

transientキーワードを使うとビューステートとして送信できなくなるのだが、逆に考えるとビューステートのガバナ制限は気にしなくていいとも言える。

こんなふうに書く。

public transient Blob uploadFile { get; set; }

さっそく、昨日失敗したファイルアップロードを試してみる。

Visualforce
<apex:page Controller="TestController">
    <apex:form >
        <apex:outputText >ファイルを選択してください:</apex:outputText>
     <apex:inputFile value="{!uploadFile}"/>
        <br/>
        <apex:commandButton value="アップロード" action="{!upload}"/>
    </apex:form>
</apex:page>

Apex
public class TestController {
 /* アップロードするファイル */
    public transient Blob uploadFile { get; set; }
    
    /* アップロード処理 */
    public void upload() {
        ContentVersion cv = new ContentVersion();
        cv.Title = 'アップロードテスト';
        cv.VersionData = uploadFile;
        cv.PathOnClient = 'test.jpg';
        cv.isMajorVersion = true;
        insert cv;
    }
}

エラーは発生しなかったので、うまくいったような気がする。ひとつ問題があって、ContentVersionにinsertしたファイルはどこに行けば確認できるのかが分からない。

ちょっとしたことのはずなのに課題はなくなってくれないなあ。

2017年7月10日月曜日

Salesforce : ビューステートのガバナ制限を回避したい

ビューステートには128KBというガバナ制限がある。けれども、ファイルアップロードするようなVisualforceを作成したら、その程度のガバナ制限はすぐに超えてしまう。どうにかしたい。

どうにか出来ないかなと思って考えたのが次のこと。

実はapex:formタグの外にファイルアップロードを書けばいいんじゃないか

というわけでさっそく試してみた。

もともと、このように書いていたVisualforceを
<apex:page Controller="TestController">
    <apex:form >
        <apex:outputText >ファイルを選択してください:</apex:outputText>
        <apex:inputFile value="{!uploadFile}"/>
        <br/>
        <apex:commandButton value="アップロード" action="{!upload}"/>
    </apex:form>
</apex:page>

このように書き直した。
<apex:page Controller="TestController">
    <apex:form >
        <apex:outputText >ファイルを選択してください:</apex:outputText>
        <apex:inputFile value="{!uploadFile}"/>
    </apex:form>
    <apex:commandButton value="アップロード" action="{!upload}"/>
</apex:page>

そしたら、エラーになってしまった。

<apex:commandButton> (<apex:page> の下にある) は <apex:form></apex:form> タグ間に存在する必要があります。

そういえば、apex:commandButtonタグはapex:formタグに囲われた領域にいないといけないんだった。例えばこんな感じ。

<apex:page Controller="TestController">
    <apex:outputText >ファイルを選択してください:</apex:outputText>
    <apex:inputFile value="{!uploadFile}"/>
    <apex:form >
        <apex:commandButton value="アップロード" action="{!upload}"/>
    </apex:form>
</apex:page>

これだと、apex:commandButtonタグはapex:formタグの内側にあるからOK。ちなみにapex:outputTextタグとapex:inputFileタグは外側にあってもエラーにはならない。

で、どうしたら回避できるんだろう。

2017年7月9日日曜日

Salesforce : ビューステート

ファイルをアップロードするプログラムを書いたのだけれど、エラーとなってしまった。

ビューステートの最大表示サイズの制限 (135 KB) を超えています。このページのビューステートのサイズは、465.039 KB でした

何かのサイズ制限に引っかかったようなのだが、何のことなのかよく分からない。取りあえず、「ビューステート」という用語が理解できれば解決するだろうと辺りをつけて調べてみる。

どうやらVisualfoceでは画面遷移のときの情報を自動的に保持してくれるようになっていて、この保持してくれるやつのことをビューステートと呼ぶらしい。

これにはガバナ制限があって、128KBしか保持できないとのことのようだ。エラーメッセージでは135KBになっているけれど、バージョンの違いのせいだろうか?

アップロードするファイルのサイズは、400KBを超えていたのでこのガバナ制限に引っかかっているよというのがこのエラーの内容。

でも、このくらいのサイズのファイルをアップロードしたくなるときはあると思うのだけれど。諦めるしかないのだろうか?

2017年7月8日土曜日

HTML : CSS : HTMLのテーブルに縦スクロール

昨日はtableに横スクロールをつけたので、今日は立てスクロール。

<html>
    <head>
        <title>スクロール</title>
        <style type="text/css">
            .scroll{
                overflow-x:scroll;
                overflow-y:scroll;
            }
        </style>
    </head>
    <body>
        <div class="scroll" style="width:500px;height:500px;">
            <table class="t" frame="border" rules="all" style="width:1000px;">
                <thead>
                    <th>ヘッダヘッダヘッダヘッダヘッダ</th>
                    <th>ヘッダヘッダヘッダヘッダヘッダ</th>
                    <th>ヘッダヘッダヘッダヘッダヘッダ</th>
                    <th>ヘッダヘッダヘッダヘッダヘッダ</th>
                    <th>ヘッダヘッダヘッダヘッダヘッダ</th>
                </thead>
                <tbody>
                 <tr>
                        <td>あああああああああああああああ</td>
                        <td>いいいいいいいいいいいいいいい</td>
                        <td>ううううううううううううううう</td>
                        <td>えええええええええええええええ</td>
                        <td>おおおおおおおおおおおおおおお</td>
                    </tr>
                    <tr>
                        <td>あああああああああああああああ</td>
                        <td>いいいいいいいいいいいいいいい</td>
                        <td>ううううううううううううううう</td>
                        <td>えええええええええええええええ</td>
                        <td>おおおおおおおおおおおおおおお</td>
                    </tr>
                    <tr>
                        <td>あああああああああああああああ</td>
                        <td>いいいいいいいいいいいいいいい</td>
                        <td>ううううううううううううううう</td>
                        <td>えええええええええええええええ</td>
                        <td>おおおおおおおおおおおおおおお</td>
                    </tr>
                    <tr>
                        <td>あああああああああああああああ</td>
                        <td>いいいいいいいいいいいいいいい</td>
                        <td>ううううううううううううううう</td>
                        <td>えええええええええええええええ</td>
                        <td>おおおおおおおおおおおおおおお</td>
                    </tr>
                    <tr>
                        <td>あああああああああああああああ</td>
                        <td>いいいいいいいいいいいいいいい</td>
                        <td>ううううううううううううううう</td>
                        <td>えええええええええええええええ</td>
                        <td>おおおおおおおおおおおおおおお</td>
                    </tr>
                    <tr>
                        <td>あああああああああああああああ</td>
                        <td>いいいいいいいいいいいいいいい</td>
                        <td>ううううううううううううううう</td>
                        <td>えええええええええええええええ</td>
                        <td>おおおおおおおおおおおおおおお</td>
                    </tr>
                    <tr>
                        <td>あああああああああああああああ</td>
                        <td>いいいいいいいいいいいいいいい</td>
                        <td>ううううううううううううううう</td>
                        <td>えええええええええええええええ</td>
                        <td>おおおおおおおおおおおおおおお</td>
                    </tr>
                    <tr>
                        <td>あああああああああああああああ</td>
                        <td>いいいいいいいいいいいいいいい</td>
                        <td>ううううううううううううううう</td>
                        <td>えええええええええええええええ</td>
                        <td>おおおおおおおおおおおおおおお</td>
                    </tr>
                    <tr>
                        <td>あああああああああああああああ</td>
                        <td>いいいいいいいいいいいいいいい</td>
                        <td>ううううううううううううううう</td>
                        <td>えええええええええええええええ</td>
                        <td>おおおおおおおおおおおおおおお</td>
                    </tr>
                    <tr>
                        <td>あああああああああああああああ</td>
                        <td>いいいいいいいいいいいいいいい</td>
                        <td>ううううううううううううううう</td>
                        <td>えええええええええええええええ</td>
                        <td>おおおおおおおおおおおおおおお</td>
                    </tr>
                    <tr>
                        <td>あああああああああああああああ</td>
                        <td>いいいいいいいいいいいいいいい</td>
                        <td>ううううううううううううううう</td>
                        <td>えええええええええええええええ</td>
                        <td>おおおおおおおおおおおおおおお</td>
                    </tr>
                </tbody>
            </table>
        </div>
    </body>
</html>

単純にこう書いてもできるのだけれど、これだと少しだけ具合が悪い。ヘッダーも一緒にスクロールされてしまうからだ。tableタグの外側にあるdivタグでスクロールさせているので当然と言えば当然。

ヘッダーがスクロールされてしまうと実用性がない。なので、tbodyタグだけスクロールするように修正する。

<html>
    <head>
        <title>スクロール</title>
        <style type="text/css">
            .scroll{
                overflow-x:scroll;
            }
            .scroll-thead, .scroll-tbody {
                display:block;
            }
            .scroll-tbody {
                overflow-y:scroll;
                height:100px;
            }
        </style>
    </head>
    <body>
        <div class="scroll" style="width:500px;">
            <table class="t" frame="border" rules="all" style="width:1000px;">
                <thead class="scroll-thead">
                    <tr>
                        <th>ヘッダヘッダヘッダヘッダヘッダ</th>
                        <th>ヘッダヘッダヘッダヘッダヘッダ</th>
                        <th>ヘッダヘッダヘッダヘッダヘッダ</th>
                        <th>ヘッダヘッダヘッダヘッダヘッダ</th>
                        <th>ヘッダヘッダヘッダヘッダヘッダ</th>
                    </tr>
                </thead>
                <tbody class="scroll-tbody">
                 <tr>
                        <td>あああああああああああああああ</td>
                        <td>いいいいいいいいいいいいいいい</td>
                        <td>ううううううううううううううう</td>
                        <td>えええええええええええええええ</td>
                        <td>おおおおおおおおおおおおおおお</td>
                    </tr>
                    <tr>
                        <td>あああああああああああああああ</td>
                        <td>いいいいいいいいいいいいいいい</td>
                        <td>ううううううううううううううう</td>
                        <td>えええええええええええええええ</td>
                        <td>おおおおおおおおおおおおおおお</td>
                    </tr>
                    <tr>
                        <td>あああああああああああああああ</td>
                        <td>いいいいいいいいいいいいいいい</td>
                        <td>ううううううううううううううう</td>
                        <td>えええええええええええええええ</td>
                        <td>おおおおおおおおおおおおおおお</td>
                    </tr>
                    <tr>
                        <td>あああああああああああああああ</td>
                        <td>いいいいいいいいいいいいいいい</td>
                        <td>ううううううううううううううう</td>
                        <td>えええええええええええええええ</td>
                        <td>おおおおおおおおおおおおおおお</td>
                    </tr>
                    <tr>
                        <td>あああああああああああああああ</td>
                        <td>いいいいいいいいいいいいいいい</td>
                        <td>ううううううううううううううう</td>
                        <td>えええええええええええええええ</td>
                        <td>おおおおおおおおおおおおおおお</td>
                    </tr>
                    <tr>
                        <td>あああああああああああああああ</td>
                        <td>いいいいいいいいいいいいいいい</td>
                        <td>ううううううううううううううう</td>
                        <td>えええええええええええええええ</td>
                        <td>おおおおおおおおおおおおおおお</td>
                    </tr>
                    <tr>
                        <td>あああああああああああああああ</td>
                        <td>いいいいいいいいいいいいいいい</td>
                        <td>ううううううううううううううう</td>
                        <td>えええええええええええええええ</td>
                        <td>おおおおおおおおおおおおおおお</td>
                    </tr>
                    <tr>
                        <td>あああああああああああああああ</td>
                        <td>いいいいいいいいいいいいいいい</td>
                        <td>ううううううううううううううう</td>
                        <td>えええええええええええええええ</td>
                        <td>おおおおおおおおおおおおおおお</td>
                    </tr>
                    <tr>
                        <td>あああああああああああああああ</td>
                        <td>いいいいいいいいいいいいいいい</td>
                        <td>ううううううううううううううう</td>
                        <td>えええええええええええええええ</td>
                        <td>おおおおおおおおおおおおおおお</td>
                    </tr>
                    <tr>
                        <td>あああああああああああああああ</td>
                        <td>いいいいいいいいいいいいいいい</td>
                        <td>ううううううううううううううう</td>
                        <td>えええええええええええええええ</td>
                        <td>おおおおおおおおおおおおおおお</td>
                    </tr>
                    <tr>
                        <td>あああああああああああああああ</td>
                        <td>いいいいいいいいいいいいいいい</td>
                        <td>ううううううううううううううう</td>
                        <td>えええええええええええええええ</td>
                        <td>おおおおおおおおおおおおおおお</td>
                    </tr>
                </tbody>
            </table>
        </div>
    </body>
</html>

tbodyタグにoverflow-y:scrollをスタイルで指定してあげる。theadとtbodyにdisplay:block。これで、tblodyだけのスクロールの準備ができた。

あとは、tbodyで縦幅を指定してあげれば、tbodyの表示要素が指定した以上の縦幅を持っているときにスクロールできるようになる。

2017年7月7日金曜日

HTML : CSS: HTMLのtableに横スクロール

HTMLのテーブルに横スクロールをつけたい。

簡単に出来るかと思ったら意外なほど時間がかかった。毎日ブログを更新すると決めているので急いで書かないと間に合わない。

<html>
    <head>
        <title>スクロール</title>
        <style type="text/css">
            .scroll{
                overflow-x:scroll;
            }
        </style>
    </head>
    <body>
        <div class="scroll" style="width:500px;">
            <table class="t" frame="border" rules="all" style="width:1000px;">
                <thead>
                    <th>ヘッダヘッダヘッダヘッダヘッダ</th>
                    <th>ヘッダヘッダヘッダヘッダヘッダ</th>
                    <th>ヘッダヘッダヘッダヘッダヘッダ</th>
                    <th>ヘッダヘッダヘッダヘッダヘッダ</th>
                    <th>ヘッダヘッダヘッダヘッダヘッダ</th>
                </thead>
                <tbody>
                    <td>あああああああああああああああ</td>
                    <td>いいいいいいいいいいいいいいい</td>
                    <td>ううううううううううううううう</td>
                    <td>えええええええええええええええ</td>
                    <td>おおおおおおおおおおおおおおお</td>
                </tbody>
            </table>
        </div>
    </body>
</html>

こんな感じでtableタグのひとつ上の階層をdivタグで囲ってあげて、そこにoverflow-x:scrollをスタイルで指定する。これだけで横スクロールするテーブルの出来上がり。


何に嵌っていたかというと、最初こんなソースを書いてしまった。

<html>
    <head>
        <title>スクロール</title>
        <style type="text/css">
            .scroll{
                overflow-x:scroll;
            }
        </style>
    </head>
    <body>
        <div class="scroll">
            <table class="t" frame="border" rules="all">
                <thead>
                    <th>ヘッダヘッダヘッダヘッダヘッダ</th>
                    <th>ヘッダヘッダヘッダヘッダヘッダ</th>
                    <th>ヘッダヘッダヘッダヘッダヘッダ</th>
                    <th>ヘッダヘッダヘッダヘッダヘッダ</th>
                    <th>ヘッダヘッダヘッダヘッダヘッダ</th>
                </thead>
                <tbody>
                    <td>あああああああああああああああ</td>
                    <td>いいいいいいいいいいいいいいい</td>
                    <td>ううううううううううううううう</td>
                    <td>えええええええええええええええ</td>
                    <td>おおおおおおおおおおおおおおお</td>
                </tbody>
            </table>
        </div>
    </body>
</html>

何が違うかというとdivタグとtableタグのところにstyleでwidthを指定していないこと。


スクロールバーは出ているけれども、スクロールしたいという要望には堪えられなさそうだ。tableより外側にいるdivタグのほうが狭くないとスクロールできない。当たり前。

2017年7月3日月曜日

Salesforce : ContentVersionってなんだ

Einstein Visionはなかなか進まないので、とっかかりになりそうなところから進めていこうと思う。

public List<Vision.Prediction> getCallVisionContent() {
 // Get a new token
 String access_token = getAccessToken();

 // Make a prediction for an image stored in Salesforce
 // by passing the file as blob which is then converted to base64 string
 ContentVersion contents = [SELECT Title,VersionData FROM ContentVersion where Id = '06828000005b65hAAA' LIMIT 1];
 return Vision.predictBlob(contents.VersionData, access_token, 'GeneralImageClassifier');
}

アップロードされたファイルをEinsteinに渡しているのがこのメソッドなんでけれど、実を言うと"ContentVersion"が何なのかよく分かっていない。ひとつひとつ知識を身につけていきたい。

調べてみると"ContentVersion"はSalesforceのファイルストレージの種類のひとつらしい。Salesforceのファイルストレージの種類は以下の4つがある。


  • 添付ファイル:Attachment
  • ドキュメント:Document
  • コンテンツ:ContentVersion
  • ファイル:FeedItem

各ファイルストレージごとに少しずつ役割やアップロードできるファイル容量に差があるみたい。ここが詳しかった。
https://base.terrasky.co.jp/articles/GhMtp

明日はContentVersionにアップロードしてみよう。