くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

2017年12月

R 外部から実行

Rをターミナル使わずに、外部からスクリプト呼んで動かしたい場合。コマンドで動かせるから外部から呼べる。OSはWindows。

R CMD BATCH HOGEScript.R

ただ、デフォだとパスが通ってないと思うので、Rはフルパスで書かないとだめ。それかパス通す。

で、とりあずこれで動くんだけど、何も指定してないと色々微妙。普通に動かすとまず、コンソールに出る出力結果が.Routっていうテキストに出力される。これいらない。必要なときもあるかもね。

あと、終了する時に作業領域が勝手に保存される。すごく邪魔。なので今は↓の感じで読んでる。

R --vanilla --quiet --file=HogeScript.R

あと、スクリプトの中で「q(save="no")」最後に入れたほうがいいかも。

マニュアルの「Invoking R」に書いてあるまま。CMD BATCHって何がいいのかよくわからない。出力をテキストに出してくれるってことなんかな。

で、調べてみたけど、コマンド以外で呼ぶことはできないのかしら。サービスみたいな感じに動かせないものか。。。

エクセルのマクロでHTTPS

エクセルでWebAPI呼んだりSOAP通信する際にHTTP通信を下の感じでやる。

'Getはこっち
Function HTTPGet() As String
    Dim httpObj As Object
    Set httpObj = CreateObject("MSXML2.XMLHTTP")
    
    httpObj.Open "GET", "http://hoge.fuga.com/someapi", False
    httpObj.setRequestHeader "Content-Type", "text/xml;charset=UTF-8"
    httpObj.send
    HTTPGet = httpObj.responseText
End Function

'Postはこっち
Function HTTPPost() As String
    Dim httpObj As Object
    Set httpObj = CreateObject("MSXML2.XMLHTTP")
    
    httpObj.Open "POST", "http://hoge.fuga.com/someapi", False
    httpObj.setRequestHeader "Content-Type", "text/xml;charset=UTF-8"
    httpObj.send "何かのデータ"
    HTTPPost= httpObj.responseText
End Function

HTTPの場合はこれで問題ないんだけど、HTTPSでやる場合はちょっと変える。 てか、変えなくてもまともな証明書(ベリサインとかから買ってるやつ)使ってる場合は 多分大丈夫。

てきとーにその辺のツールで作ったやつとか、いわゆるオレオレ証明書使う場合は、 上述のやつだとエラーになる。ブラウザとかで繋いだ時もセキュリティーの警告とか出るけど、 VBAだとエラー扱いになるっぽい。この場合は↓の感じにする。

'Getはこっち
Function HTTPSGet() As String
    Dim httpObj As Object
    Set httpObj = CreateObject("MSXML2.ServerXMLHTTP") '使うのはServerXMLHTTP
    
    httpObj.Open "GET", "https://hoge.fuga.com/someapi", False
    httpObj.setRequestHeader "Content-Type", "text/xml;charset=UTF-8"
    '証明書関係のエラーを無視する?オプション
    httpObj.setOption 2, httpObj.getOption(2) - SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS
    httpObj.send
    HTTPSGet= httpObj.responseText
End Function
'Postはこっち
Function HTTPSPost() As String
    Dim httpObj As Object
    Set httpObj = CreateObject("MSXML2.ServerXMLHTTP") '使うのはServerXMLHTTP
    
    httpObj.Open "POST", "https://hoge.fuga.com/someapi", False
    httpObj.setRequestHeader "Content-Type", "text/xml;charset=UTF-8"
    '証明書関係のエラーを無視する?オプション
    httpObj.setOption 2, httpObj.getOption(2) - SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS
    httpObj.send "何かのデータ"
    HTTPSPost = httpObj.responseText
'    XMLで戻ってくるやつはこっちの方がいいかな
'    HTTPSPost= httpObj.responseXML
End Function

参考は例によってさすがのStackOverFlow

クライント側に使う証明書をインストールしておけば、最初の奴でも大丈夫かもかも。。。

問合せ