DOBON.NETプログラミング道掲示板
(現在 過去ログ1 を表示中)

[ 親記事をトピックトップへ ]

このトピックに書きこむ

過去ログには書き込み不可

■32981 / inTopicNo.1)  Re[3]: アプリケーションにマクロ機能を搭載するには?
  
□投稿者/ MS・ハマー 一般人(1回)-(2015/06/05(Fri) 12:23:40)
  • アイコン2015/06/05(Fri) 12:42:13 編集(投稿者)

    最近私が仕事で作った内容になりますが。
    エクセルシート上でデータ編集方法を利用者が定義できるよう、VBAで
    マクロ機能を作りました。
    マクロはIF文や四則演算、独自関数をもたせてます。

    イメージ的にはこんな感じで
    IF:CELL(Current-1,Current+1)>200
    CELL(Current-1,Current+1)=0
    SET Val=ExcelSql(select * from hoge)
    ELSE:
    CELL(Current-1,Current+1)= CELL(Current-1,Current+1)+1
    SET Val=ExcelSql(select * from hoge2)
    ENDIF:
    SetBackColor(Current-1,Current+1,Red)

    マクロを逆ポーランド記法変換をつかって演算子や関数の処理優先度を
    判定して実行してます。

    逆ポーランド記法への変換プログラムは四則演算のものがネットに転が
    っているので、それを参考にしました。

    求める機能が大規模になってくるとこの方法はちょっとお勧めできない
    ですけどね^^;


引用返信 削除キー/
■32980 / inTopicNo.2)  Re[2]: アプリケーションにマクロ機能を搭載するには?
□投稿者/ 群馬 一般人(2回)-(2015/06/04(Thu) 11:44:57)
  • アイコン魔界の仮面弁士さん
    ------------------

    リプライありがとうございます。Windows PowerShell ですか〜、なるほど。
    PowerShell を実務で利用したことがありませんが、登場した当初少しだけ触っていました。
    (そして忘れておりました。)

    * Microsoft Windows 7 以降であればプリインストール済み
    * Microsoft .NET Framework との親和性が高そう(なイメージ)
    * Pash という mono 環境を使った OSS 実装も一応あるみたい

    というメリットがありそうです。逆に、言語自体が純粋に評価され普及したものではないので、

    * 後ろ盾(Microsoft)が手を退くと利用者が置いてけぼりになりそう
    * コミュニティや OSS としてのメンテナ(いる?)が活発ではなく、資産や資料が乏しそう
    * 動作している PC は多いはずなのに、圧倒的にシェアが少ない (一例: http://namaristats.com/)

    といったデメリットもありそうです。

    魔界の仮面弁士さんのご提案は、それらも考慮した上でメリットを活かすアプローチだと
    受け取っております。
    大規模なマクロを作ったり使ったりしようとせず、長期的なメンテが不要なプロジェクトでは
    PowerShell はかなり効果的に利用できそうな気がしています。

    実コードも大変参考になりました。System.Management.Automation.dll についてはまだ詳しく
    調べていませんが、魔界の仮面弁士さんのコードを見る限り、あまり煩雑な手続きをすること
    なく、簡潔に要件を満しているように見受けられました。

    なお、上に述べましたデメリットは、それこそ本腰を据えて Ruby や Python、Perl といった処理系を
    組み込んだりラッピングすることにより解決することができると思われます。
    その上で、魔界の仮面弁士さんのご提案は上手い着地点をご教示いただいたと脱帽いたしました。
    PowerShell を考えの中心にそえて、さらに考えていきたいと思います。


    hihijijiさん
    ------------

    リプライありがとうございます。

    > この要件が難易度を極端に上げているのではないでしょうか?
    > もし私がこんな要件を出されたら、尻尾を巻いて逃げます。

    おっしゃるとおりです…。要件というほどではありませんが、将来のメンテナンス性や移植性を
    考慮した実装を求められることが多くなってきました。
    (一例: 「このソフト、Android タブレットでも動かないの?開発元なら簡単にできるでしょ?」
    …こわいです。)

    また、C# はまだ良いとして、C++/CLI に至っては移植性という意味では絶望的です。
    その一方で .NET アプリケーション側から大規模なアンマネージド DLL のクラス群を
    用いなければならないプロダクトが多くあり、避けては通れない状況です。

    > ・環境依存の部分はモジュール化するなど、後から追加・変更しやすくする設計にする。
    > ・当座はWindows専用の実装とする。
    > 程度で妥協してはどうでしょう?

    顧客(ユーザ)にとっての資産はアプリケーションの実装自体ではなく、それが提供する
    ロジック部分ですのでハードコーディングされた実装と切り離した状態で保持する形が
    理想だと考えております。
    問題は、いかに環境依存しているコードを小さくし、本質的機能を上位に置いやって
    ポータビリティを確保するか…というところでしょうか。

    > その上で、わたしなら JavaScriptベース で実装します。

    JScript.NET を JIT コンパイルしたアセンブリを叩くということしょうか?
    それとも Node.js 等の別実装を呼ぶということでしょうか?
    ご都合がよろしければ、そちらも伺いたいです。

引用返信 削除キー/
■32977 / inTopicNo.3)  Re[1]: アプリケーションにマクロ機能を搭載するには?
□投稿者/ hihijiji 一般人(1回)-(2015/06/02(Tue) 16:07:48)
  • アイコン>必須要件というわけではありませんが、非 Windows ホスト環境(mono)での動作も視野に考えているため、Microsoft Script Control や Microsoft.JScript/Vsa といったライブラリも極力参照したくありません。

    この要件が難易度を極端に上げているのではないでしょうか?
    もし私がこんな要件を出されたら、尻尾を巻いて逃げます。
    ここは、
    ・環境依存の部分はモジュール化するなど、後から追加・変更しやすくする設計にする。
    ・当座はWindows専用の実装とする。
    程度で妥協してはどうでしょう?

    その上で、わたしなら JavaScriptベース で実装します。
引用返信 削除キー/
■32969 / inTopicNo.4)  Re[1]: アプリケーションにマクロ機能を搭載するには?
□投稿者/ 魔界の仮面弁士 大御所(963回)-(2015/06/01(Mon) 11:22:55)
  • アイコン
    No32968に返信(群馬さんの記事)
    > エンドユーザによるマクロ機能の実装が要件とされる場合がよくあります。
    
    自分なら、PowerShell をマクロ替わりに使ってもらうかな…。
    
    以下、Win7(x64) + VS2008 C# にて動作確認
    
    // 参照設定:System.Management.Automation.dll
    
    public partial class Form1 : Form
    {
        private class Foo
        {
            public DialogResult Msg(string msg)
            {
                return MessageBox.Show(msg, "HOST", MessageBoxButtons.OKCancel);
            }
        }
    
        public Form1()
        {
            InitializeComponent();
        }
    
    
        private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.Text = @"#ホスト機能を $input 経由で受け取る
    $foo = $input | Select -First 1
    
    #関数定義
    function Sum($arg)
    {
    $total = 0;
    foreach($x in $arg) { [void]($total += $x) }
    return $total
    }
    #パイプライン定義
    $p = { foreach($x in $input) { $x * $x } }
    
    #変数を用意(今回は配列)
    $a = 1,2,3,4;
    $b = 5,6,7;
    
    '==メソッド呼びだし=='
    Sum $a
    '----------'
    Sum $b
    '==パイプライン処理=='
    1,2,3,4 | & $p
    '----------'
    5,6,7 | & $p
    '==ホスト機能の利用=='
    $foo.Msg(""ホストの機能を呼び出す"")
    ";
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            string source = this.textBox1.Text;
            using (var invoker = new System.Management.Automation.RunspaceInvoke())
            {
                listBox1.BeginUpdate();
                listBox1.Items.Clear();
                var arg = new Foo();
                var results = invoker.Invoke(source, new object[] { arg });
                foreach (var result in results)
                {
                    listBox1.Items.Add(result);
                }
                listBox1.EndUpdate();
                listBox1.SelectedIndex = listBox1.Items.Count - 1;
            }
        }
    }

引用返信 削除キー/
■32968 / inTopicNo.5)  アプリケーションにマクロ機能を搭載するには?
□投稿者/ 群馬 一般人(1回)-(2015/06/01(Mon) 02:00:20)
  • アイコン環境/言語:[Microsoft Windows 7, C#, Microsoft Framework 3.5] 
    分類:[.NET] 

    はじめまして。

    Microsoft Visual Studio 2008 を利用して C#, C++/CLI を用いたアプリケーション開発を行なっています。
    アプリケーションの規模は大小様々ありますが、エンドユーザによるマクロ機能の実装が要件とされる場合が
    よくあります。

    マクロ機能では、次の機能が求められています。

    * 四則演算
    * 変数および配列の定義と利用
    * 関数の定義と利用
    * 条件分岐、繰り返し処理などの一般的な構文
    * アプリケーション開発者が用意した .NET アセンブリ(静的関数)の呼び出し

    単純な関数型言語が動作すればよく、クラスなどの機能は必要としていません。

    このマクロ機能はユーザが独自に定義して、アプリケーション内で実行することを目的としています。
    また、アプリケーション組み込みの機能もメンテナンス性を考えて、このマクロ機能で対応できる部分は
    可能な範囲内でマクロとして提供することを考えています。

    必須要件というわけではありませんが、非 Windows ホスト環境(mono)での動作も視野に考えているため、
    Microsoft Script Control や Microsoft.JScript/Vsa といったライブラリも極力参照したくありません。
    また、Ruby の本体を C++/CLI で .NET アセンブリとしてビルドしたものを用いてテストして、これはよく
    動作していましたが、こちらも開発環境上の制約が多く、標準的な .NET Framework 内ないし、C# 内だけに
    留まらない依存関係を増やすこととなり、今ひとつしっくりきていません。

    外部に存在するインタプリタ実行バイナリの標準入出力をリダイレクトし、アプリケーションと通信させる
    手法も考え、局所的に利用してきたことはありますが、演算結果の受け渡しやアプリケーションとインタプリタ
    の状態の同期を密にとる部分にコストがかかり、しっくりきていません。

    http://dobon.net/vb/dotnet/programing/eval.html

    のページを拝読し数年前より色々と試行錯誤しております。

    C# のコードを JIT コンパイルして取得したアセンブリを実行、というのも何年も前に一時期アプリケーションで
    採用しておりましたが、数ヶ月ほど前に試してみたところ「古い文法」として非推奨だという情報を目にして
    現在推奨される方法がどのようなものか見つけだすことができませんでした。

    また、C# のコードだけで完結させるため、字句解析器、構文解析器を自前で実装しようと試みましたが、
    こちらもコスト面と大きく膨らんでしまうソースコードのメンテナンス性低下により、現実的ではなさそうです。

    そこで、みなさんが上記に述べた状況で問題を解決するためにどのような実装をお考えになるかをお聞かせ
    いただければと考えております。

    # 私の述べた状況の解決策を求めているより「みなさんならどうしている?」という側面の質問です。
    # こちらでは具体的なコードを示し質問をされている方が大半で、このような質問が適しているかどうかを
    # 「書き込みのルールについて」から読み取ることができませんでしたので、不都合があればご指摘ください。

    以上、よろしくお願いいたします。

引用返信 削除キー/



トピック内ページ移動 / << 0 >>
Mode/  Pass/


- Child Tree -