<   2013年 11月 ( 23 )   > この月の画像一覧
R.NETとExcel-DNAで32bitのExcelからRを使う
目的
Excel2010の32bitと最新のR.NETで以下のことをやる
R.NETとExcel-DNAでRで動くExcelアドインを作る


動作環境
Windows7 64bit
Office2010 32bit
ExcelDNA 0.30   ※要.NET Framework2.0~4.0のいづれか
R.NET 1.5.5         ※要.NET Framework4.0

実行手順
1.R.NETを展開したら次のDLLを32ビットで動くようにする
(32ビットOSでは不要なはず)
  • RDotNet.NativeLibrary.dll
  • RDotNet.dll

コンパイル後のDLLを32ビットで動作させるには次の記事を参考にする。
64bitOSでAnyCPUでコンパイルした32bitプロセスを動かす

2013/11/30 訂正:RDotNet.dll とRDotNet.NativeLibray.dllはCPU Anyでビルドされているので上記の作業は不要


2. 1のDLLと同じパスにExcelDNAのDistributionに入っているExcelDna.xllをコピーして「RNET.xll」と名称を変更する。

3.RNet.dnaとして次のファイルを作成する。
 BOMなしのUTF8で保存しておく。

<DnaLibrary RuntimeVersion="v4.0" Name="R.NET" Description="R.NETをExcelから動作させる試験" Language="CS">
<Reference Path="RDotNet.NativeLibrary.dll"  />
<Reference Path="RDotNet.dll"  />
<![CDATA[
using System;
using System.IO;
using System.Linq;
using RDotNet;

namespace CSLib
{
    public class CSLib
    {
        static REngine engine = null;
        static CSLib()
        {
            var envPath = Environment.GetEnvironmentVariable("PATH");
            var rBinPath = @"C:\Program Files\R\R-3.0.2\bin\i386";
            Environment.SetEnvironmentVariable("PATH", envPath + Path.PathSeparator + rBinPath);
            engine = REngine.CreateInstance("RDotNet");
            engine.Initialize();
        }
       
        public static double[] MyRnorm(int number)
        {
            return (engine.Evaluate("rnorm(" + number + ")").AsNumeric().ToArray<double>());
        }

    }
}
]]>

</DnaLibrary>
4.あとは「R.NETとExcel-DNAでRで動くExcelアドインを作る」と同じ

[PR]
by mima_ita | 2013-11-30 20:49 | R
VisualStdio2012でバッチビルドを行う方法
VisualStdioではバッチビルドという複数の構成を一度でビルドできる機能がありますが、デフォルトでこの機能はメニューに表示されません。

b0232065_18554909.png
1.メニューバーを右クリックして「カスタマイズ」というボタンを押す
b0232065_18561912.png
2.「コマンド」タブを選択して「メニューバー」の「ビルド」を選択する。
 そして、コントロール中でバッチコマンドを入れたい場所を選択してから、「コマンド追加ボタン」をおす
b0232065_19001793.png

3.カテゴリ中の「ビルド」を選択して、コマンドのなかにある「バッチビルド」を選択する。
b0232065_18592904.png
4.すると、コントロール中にバッチビルドが表示されるのでOKをおして画面を終了する。
b0232065_19031609.png
5.メニューでバッチビルドを選択する
b0232065_19035017.png
6.ビルドしたい構成を選択すると、選択したビルドがすべてビルドできる
b0232065_19041782.png



[PR]
by mima_ita | 2013-11-30 19:05 | .NET
64bitOSでAnyCPUでコンパイルした32bitプロセスを動かす
AnyCPUでビルドした場合、動作する環境によってプロセスのビット数がことなる。
  • 64ビットOSでは64ビットプロセスとして動作する。
  • 32ビットOSでは32ビットプロセスとして動作する。


では、64ビットで32ビットプロセスを動かすにはどうしたらいいか?
これは、CorFlagsコマンドを使う。

VisualStudio2008の場合は以下にある。
C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\CorFlags.exe

VisualStdioをインストールしたときにプログラムファイルに記述されるコマンドプロンプトではパスが通っているのでそこからおこなうといい。


そこで次のようなコマンドを実施する

CorFlags /32BIT+ TestR.exe

VS2012では /32BITREQ+ フラグになる。

これを関連するDLLを含めておこなう。
AnyCPUでビルドされているDLLは、ExEのプラットフォームに合わせて動作するので不要。
もしx64でビルドされていた場合は、Exeと同様に32ビットフラグを付与すること。

もし強い名称で署名をされている場合は、/Force オプションを付与すること。

CorFlags /32BIT+ /Force RDotNet.dll



[PR]
by mima_ita | 2013-11-30 03:14 | .NET
twitteRを久しぶりに使用したら文字化けしていた件
R言語でtwitteRを使用している場合、以下の条件で文字化けします。
  • Windowsを使用している場合。
  • twitteRのバージョンが1.1.7 (2013/7/8)以降のリリースの場合

そしてこの文字化けしたデータはiconvで修復できない

原因
以下のバグを修正したのが原因
Problems with non UTF-8 and ASCII characters twitteR package in R

comm.R
twFromJSON = function(json) {
  #twitter sends data in UTF-8, paranoidly confirm encoding
  json = iconv(json, "", "UTF-8", sub="")

これは取得したJSONデータでUTF-8に変換できない文字を削除しています。
Windows(日本語)の場合、cp932からutf8に変更してしまうのです。
そして、subを指定して変更できない文字は全部消してしまうので、もとに戻すことはできません。

対策
1. 1.1.6に戻す。以下からダウンロード
 http://cran.r-project.org/src/contrib/Archive/twitteR/
 
2. 1.1.7のソースでさっきのiconvをコメントアウトする

なお、以下のページから開発中のコードを取得できるが、大きく修正をいれようとしていて、不安定そうなので今の時点では、やめたほうがいい。
https://github.com/geoffjentry/twitteR


パッケージのビルド
いづれの対策の場合でも、ソースコードをビルドしてインストールするひつようがある。
rcmd INSTALL --build -l ライブラリをおいているのパス パッケージのパス

このコマンドはコマンドプロンプトから実行する必要がある。rcmdは"C:\Program Files\R\R-3.1.2\bin\x64\Rcmd.exe"に存在する
※32bitの場合はC:\Program Files\R\R-3.1.2\bin\i386

2014/12/17 以下の方法で最新をいれても文字化けは解消されます。

http://qiita.com/mima_ita/items/192df262a89af1f6932c


[PR]
by mima_ita | 2013-11-29 20:25 | R
朝日新聞の 特定秘密保護法案のアンケート結果を分析する
概要
現在、朝日新聞が特定秘密保護法案のアンケートを行っている。
賛成、反対、日本の安全が脅かされているか否かが選択でき、コメントも入力できる。

今回は、コメントを形態素解析して、反対・賛成、日本の安全が脅かされているか否かのそれぞれの立場で、使用する単語にどのような特徴がでるか調べるものとする。

Excelによる形態素解析が必要なので、NMecbComを以下からダウンロードしてインストールすること。
NMecabを用いてVBAやWSHで形態素解析を行なう


以下に集計を行ったExcelを添付する。

Excel analyzeAsapi.xlsm



More
[PR]
by mima_ita | 2013-11-28 18:55 | VBA
Excel VBA でニコニコ動画のコメントを取得する
Excelを使ってニコニコ動画のコメントを取得します。
これにより、粘着質な工作員や、嫌われるコメント、好まれるコメントの分析や、動画の盛り上がるタイミングの確認などができると思います。

Excelsimplemessage.xlsm

必要なもの
・Office2010 Excel
・ニコニコ動画のアカウント(可能ならプレミアム)
・ゆっくり待つ心と多少の障害を気にしない広い心

■使い方
1. 調べたい動画のsmXXXXのアドレスをしらべます。
b0232065_2240359.png



今回は、sm9068558の動画を調べます。
コメント数は3941件です。

30万件のコメントを取得しようとするとExcelが落ちるので、訓練された視聴者のいる動画では厳しいです。
2,3万件までは正常に取得できました。

2. ニコニコ動画にログインするのに使用するメールアドレスとパスワードを入力して、1の動画の番号を入力します。




「最近のメッセージ取得」または「全部のメッセージ」のボタンを押してください。
最近のメッセージは1000件までしか取得できませんが、プレミアム会員でなくても使用で着ます。
全部のコメントを取得したい人は銭っこ払ってプレミアム会員さなってください。

3.どちらかのボタンを押すとニコニコ動画からメッセージを取得します。
エラー処理があまいので、ネットワークの調子が悪かったりすると、落ちたりします。

4.取得結果をワークシートに貼り付けます。プレミアムは全件、それ以外は1000件までとなります。
b0232065_2253133.png


注目すべき項目は次のとおりです。
Vpos:
コメント書き込み位置 (1/100秒)です。これが集中しているシーンはユーザーになんらかの感動をあたえたシーンであると判断できます。

Mail:
文字の修飾や下表示、上表示などのコマンドです。
コメント職人に注目する場合はこの項目の値を見るといいでしょう。
184は次のユーザーIDを隠すコマンドです。


UserId:
ユーザーIDです。粘着している奴や自演している奴を探しましょう
ただし、184コマンドで送信(デフォルト)している場合は、一時的なIDで、特定のタイミング(1週間程度?)でリセットされます。
なので、別動画のユーザーIDはあてにならない可能性があります。

Score
NG共有機能に使用されるスコアです。
NGに指定されると0からどんどん下がっていきマイナスになります。マイナスの
自分のスコアが低くても泣かないようにしましょう。

Nicoru
最近できたの機能の「にこる」です。
人の共感をよぶコメントです。


あとはExcelをつかっていろいろ分析してください。
ニコニコ動画のAPIが正規に公開されているものではないと思うのでいきなり動かなくなる可能性は大いにあります。

2013/11/23
 コミュニティー動画を取得できるように修正
 メールアドレスが入っていない状態で、メッセージの取得をしたら入力を促すように修正
 各種グラフ追加

■参考
ニコニコ動画・ニコニコ生放送のコメント取得 備忘録
http://blog.livedoor.jp/mgpn/archives/51886270.html


ニコニコ動画のコメントを取得するAdd Star
http://d.hatena.ne.jp/MOOOVe/20120229/1330512626
[PR]
by mima_ita | 2013-11-28 08:53 | VBA
配列を経由したセルの値設定の副作用
セルを設定する場合に、以下のように配列を経由する方法があります。

    Dim buf(1 To MAX_ROW, 1 To MAX_COL) As Variant
    Dim r As Long
    Dim c As Long
    For r = LBound(buf, 1) To UBound(buf, 1)
        For c = LBound(buf, 2) To UBound(buf, 2)
            buf(r, c) = r & "," & c & ":" & TEST_STRING
        Next c
    Next r
    Sheet1.Range(Sheet1.Cells(1, 1), Sheet1.Cells(UBound(buf, 1), UBound(buf, 2))).Value = buf

この書き方を紹介しているページの多くは「速度がはやくなる」とだけ書いてあります。
しかし、この書き方の弊害については触れていないと思います。

数倍以上の速度を得るのと引き換えに、配列の分だけメモリを消費します
使用する場合は、どっちを優先するか考えてつかいましょう。



More
[PR]
by mima_ita | 2013-11-27 22:56 | VBA
ニコニコ動画のコメント操作に関する解説
■目的
ニコニコ動画のコメント操作に関する解説をします
以下の動画で紹介したツールの実装の説明になる。





More
[PR]
by mima_ita | 2013-11-27 17:14 | VBA
NMecabを用いてVBAやWSHで形態素解析を行なう
概要

b0232065_21104163.png
.NET Frameworkで作成されたクラスライブラリのNMecabを、ActiveXを経由してVBAやWSHなどから形態素解析を行なうことを目的とします。

NMecabは下記のページで開発されています。
https://sourceforge.jp/projects/nmecab/


ダウンロード

ExcelNMeCabCom.zip


使用方法

このプログラムは.NETFramework2.0の32ビットプロセスで動作します。

もし、64ビットのプロセスで使用したい場合は、NMeCabCom.dllとLibNMeCab.dllを64ビットでビルドしなおしてください。

インストールを行なうにはNMeCabCom\binにあるsetup.batを管理者権限で実行してください。

これにより、参照設定にNMeCabComが表示されるのでチェックをいれてください。
b0232065_20563390.png
その後、以下のようなコードを記述します。
    Dim t As New NmcTagger
    Dim c As NmcNodeCollection
    Dim p As New NmcParam
    p.dicdir = "C:\back\NMeCabCom\bin\ipadic"
    Call t.Create(p)
    Set c = t.Parse("私の名前はLです")
    Dim i As Long
    For i = 0 To c.Count - 1
        Debug.Print c.GetItem(i).Surface & " " & c.GetItem(i).Feature
    Next
NmcTaggerに渡すNmcParamにはシステム辞書とユーザ辞書を指定できます。
ユーザー辞書の作成については、本家のMecabのホームページを参考に作成してください。



WSHなどで、CreateObjectで遅延バインディングする場合は以下のようになります。
dim t
dim ret
dim i
dim p
dim node
set t = CreateObject("NMeCabCom.NmcTagger")
WScript.Echo TypeName(t)

set p = CreateObject("NMeCabCom.NmcParam")

p.dicdir = "./ipadic"
p.userdic = ""
t.Create(p)

set ret = t.Parse("This is a pen.")
WScript.Echo TypeName(ret)

For i = 0 To ret.Count- 1
  WScript.Echo TypeName(ret.GetItem(i))
  WScript.Echo ret.GetItem(i).Surface
Next

もし、アンインストールを行い対場合はuninstall.batを管理者権限で実行してください。

NMecabのユーザー辞書
NMecabはapp.configのUserDicに辞書のパスを指定することでユーザー辞書を指定できますが、少なくとも、当方の環境ではTokenize.Openで落ちました。

以下のような修正を行えば正常にユーザー辞書が使用できます。

修正前:
for (int i = 1; i <= param.UserDic.Length; i++) 

修正後:
for (int i = 0; i < param.UserDic.Length; i++)


[PR]
by mima_ita | 2013-11-25 21:07 | .NET
C#で実装したコードをVBSから使う際の注意点
次の点に注意しなければならない。

Uint、ULONG等のUnsignedの変数は利用できない。

VBAやVBSはUnsignedをサポートしていないので、ULONGなどのインターフェイスは使用できない。


作成したCOMのCPUにあわせて実行するCScriptを切り替える必要がある。
64ビットマシンにはVBScriptを動かすCScriptが二種類存在する。
32ビット用のものはC:\Windows\syswon64\cscript である。
64ビット用のものはC:\Windows\System32\Cscript である。
もし、作成したCOMと実行するCScriptのプロセスのビットが異なる場合、登録したはずのCOMが見つけられず下記のエラーが発生する

C:\dev\NMeCabCom\bin\sample.vbs(6, 1) Microsoft VBScript 実行時エラー: ActiveX コンポーネントはオブジェクトを作成できません。: 'NMeCabCom.NmcTagger'

オブジェクトの配列は返せない

以下のようなCOMのインターフェイスがあったとする。

    public interface INmcTagger
    {
        string GetModulePath();
        void Create(NmcParam p);
        NmcNode[] Parse(string text);
    }

これはVBAやC#などの型を明示できる言語では適切に処理できる。
Dim ret As NmcNode()
ret = t.Parse("This is a pen.")
しかし、VBSの場合、型が明示できないため、Unknownとなり処理できなくなる。
Dim ret ' As NmcNode()
ret = t.Parse("This is a pen.")
WScript.Echo TypeName(ret) ' Unknownとなり、以降処理できない。
こういう場合は、配列を管理するクラスを作成してそれを利用する
    public interface INmcNodeCollection
    {
        int Count { get; }
        NmcNode GetItem(int index);
    }
配列ではないオブジェクトを返した場合は、VBSでも処理ができる
set ret = t.Parse("This is a pen.")
For i = 0 To ret.Count- 1
  WScript.Echo TypeName(ret.GetItem(i))
  WScript.Echo ret.GetItem(i).Surface
Next




[PR]
by mima_ita | 2013-11-25 17:36 | .NET



実験ですお
検索
カテゴリ
最新の記事
.NET4.5におけるasy..
at 2014-07-02 00:46
.NETでTwitterを検..
at 2014-06-29 00:49
Redmineのプラグインで..
at 2014-06-28 03:29
IO.popenのwrite..
at 2014-06-28 03:25
RedmineのWikiでU..
at 2014-06-28 03:16
以前の記事
最新のトラックバック
その他のジャンル
ブログパーツ