厳選 Visual Studioの便利なショートカット

 

エラー箇所にジャンプ

  • 「Ctrl + Shift + F12」

ブレークポイント

  • 設定/解除 「F9」
  • 有効化/無効化 「Ctrl + F9」

ViEmu特有

  • 「:ls」:バッファナンバーのリストを表示。
  • 「:b2」:バッファ2のファイルを開く。
  • 「:n」:次のバッファのファイルを開く。
  • 「:N」:前のバッファのファイルを開く。
  • 「:bui[ld]」:現在のソリューションをビルド。
  • 「:prb」:現在のプロジェクトをビルド。
  • 「:deb」:デバッグ実行。

【SQLServer】カンマ区切で文字列を分割し、N番目の文字列を取り出す方法

以下のSQLで実現できます。


DECLARE @test AS NVARCHAR(20)
SET @test = 'あいう,えお123え,4かきくけこ'

SELECT value FROM (
    SELECT 
        ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS "id"
       ,value
    FROM STRING_SPLIT(@test, ',')
) T WHERE [id] = 2

 取得結果は、以下のとおりです。



Vimで文字数をカウントする方法

 カウント対象の文字列の末尾にカーソルを移動し、以下のコマンドを実行してみて下さい。

g
Ctrl-g
なお、改行を含む場合は、CR+LFの2文字分が加算されます。

【Sencha ExtJs】callSuper(), callParent()の振る舞いの違い

callSuper()とcallParent()メソッドの振る舞いの違いを整理してみました。

違いは、以下のとおりです。


callSuper()では、Overrideされた基底クラスのメソッドは呼ばれません。

 ・Override -> Base.

対してcallParent()では、Overrideされた基底クラスのメソッドが呼ばれます。

 ・Override -> Derived -> Base.

Ext.application({
    name : 'Fiddle',

    launch : function() {
        var object = Ext.create('Ext.some.DerivedClass');
        object.method();
    }
});
/**
 * 基底クラス
 */
Ext.define('Ext.some.Class', {
    method: function() {
        console.log('Base method');
    }
});

/**
 * 派生クラス
 */
Ext.define('Ext.some.DerivedClass', {
    extend: 'Ext.some.Class',
    method: function() {
        console.log('Derived method.');
        this.callParent();
    }
});

/**
 * 派生クラスをOverride
 */
Ext.define('App.paches.DerivedClass', {
    override: 'Ext.some.DerivedClass',

    method: function() {
        console.log('Override method.');
        //this.callSuper(); // Override -> Base.
        this.callParent(); // Override -> Derived -> Base.
    }
});


 以下にデモ&ソースがあるので参考にしてみて下さい。

デモ&ソース

【Sencha ExtJs Modern】Gridの列を通貨形式で表示する方法

Gridの列上で日本円の通貨形式で表示するサンプルを実装してみました。
「renderer」に表示形式をセットする処理を埋め込んで実装しています。

Ext.application({
    name: 'Fiddle',

    launch: function() {
        var store = Ext.create('Ext.data.Store', {
            fields: ['name''email''phone'],
            data: [{
                'name''橋元',
                'email''hashimoto@xxx.com',
                'phone''55-3434-3434',
                'salary''5'
            }, {
                'name''小西',
                'email''konishi@xxx.com',
                'phone''33-3434-3434',
                'salary''8500000'
            },{
                'name''ポク田ポーク',
                'email''pork@xxx.com',
                'phone''55-3434-3434',
                'salary''999999999'
            }]
        });

        var grid = Ext.create('Ext.grid.Grid', {
            title: '名簿',
            store: store,

            columns: [{
                text: '名前',
                width: 100,
                dataIndex: 'name',
                renderer: function(value, record, dataIndex, cell, column) {
                    console.log(value);
                    console.log(record.get('email'));
                    if (value == 'ポク田ポーク')
                        cell.element.dom.style.backgroundColor = "#99ccff";
                    else
                        cell.element.dom.style.backgroundColor = "#ccffcc";
                    return value;

                }
            }, {
                text: 'Email',
                width: 200,
                dataIndex: 'email'
            }, {
                text: '電話番号',
                width: 100,
                dataIndex: 'phone'
            }, {
                text: '給料',
                textAlign: 'right',
                width: 150,
                dataIndex: 'salary',
                align: 'right',
                renderer: function (value, record) {
                    var tmp = Ext.util.Format.number(value, '0,000');
                    if (tmp != '') {
                        var tmp = "¥" + tmp;
                    }
                    return tmp;
                    //return Ext.util.Format.currency(value, "¥");
                }
            }],
            fullscreen: true,
            renderTo: Ext.getBody()
        });
    }
});



以下にデモ&ソースがあるので参考にしてみて下さい。
デモ&ソース

Sencha ExtJs Modernで通貨入力のカスタムフィールドを実装

日本円の通貨入力のカスタムフィールドを実装してみました。
Ext.application({
    name: 'Fiddle',

    launch: function () {
        console.log('start.');

        Ext.define('User', {
            extend: 'Ext.data.Model',
            fields: [{
                name: 'phone',
                type: 'auto'
            }],

        });

        var panel = Ext.create('Ext.form.Panel', {
            fullscreen: true,
            focusable: false,
            items: [{
                xtype: 'fieldset',
                title: '通貨フィールドSample(日本円)',
                items: [{
                    xtype: 'currency-field',
                    label: '金額',
                }]
            }]
        });

    }
});

Ext.define('Ext.ux.field.CurrencyField', {
    extend: 'Ext.field.Text',
    xtype: 'currency-field',

    textAlign: 'right',

    statics: {
        PREFIX : '¥'
    },
    
    initialize: function() {
        this.callParent(arguments);
    },

    /**
     * カンマと¥を除去して値を取得
     */
    getValue : function() {
        var str = String(this.callSuper());
        if (str) {
            var num = parseFloat(str.replace(/[^\d\.-]/g,''));
            num = isNaN(num) ? '' : num
            return num;
        }
        return '';
    },

    /**
     * フォーカスを失った時にカンマと¥を付与
     */
    onBlur : function(obj, e, eOpts ) {
        var str = String(this.getValue());

        var tmp = Ext.util.Format.number(str, '0,000');
        if (tmp !== '') {
            var tmp = this.self.PREFIX + tmp;                    
        }
        this.setValue(tmp);
        return this.callSuper(arguments);
    },

    /**
     * フォーカスを得た時にカンマと¥を除去
     */
    onFocus: function (obj, e, eOpts) {
        this.setValue(this.getValue());
        return this.callSuper(arguments);
    }
});


以下にデモ&ソースがあるので参考にしてみて下さい。
デモ&ソース

Markdownの表中に改行を挿入


|名前|
|---|
|hoge<br/>foo|
名前
hoge
foo


MX Compornentで提供される主要なコントロール

このMX Compornentですが旧バージョンも含めてインストールされるので、何を使えば良いか迷うことがあるので、下表にまとめてみました。 是非、参考にして下さい。

コントロール名バージョン説明
ActUtlType4.00APLC通信用のActiveXコントロール。
通信設定ユーティリティを使用して、プログラムを作成する場合に使用する。
ActProgType4.00APLC通信用のActiveXコントロール。
通信設定ユーティリティを使用しないで、プログラムを作成する場合に使用する。
ActEasyIF3PLC通信用のActiveXコントロール。
4.00Aが最新なので特に理由がない限りは使用しなくてよい。
ActSupportMsg4.00AMX Componentの各コントロールが返すエラーコードの該当メッセージを取得するためのActiveXコントロール。
ActSupport4.00AMX Componentの各コントロールが返すエラーコードの該当メッセージを取得するためのActiveXコントロール。
4.00Aが最新なので特に理由がない限りは使用しなくてよい。
DotUtlType4.00AActUtlTypeの.Net移植コントロール。.Net Framework2.0用なので要注意。
DotSupportMsg4.00AActSupportMsgの.Net移植コントロール。.Net Framework2.0用なので要注意。

※通信設定ユーティリティとは、PLCの接続先をウィザード形式で設定できるツールです。 これを利用しない場合は、通信に必要ないくつかの情報をプログラム内にパラメタとして指定する必要があります。

ちなみに、私が開発する時は、「ActUtlType」、「ActSupportMsg」を利用しています。

MX Compornent(体験版)のダウンロードはこちらから

バッチファイルでProxyのON/OFFを切り替える方法

在宅ワーク時は、プロキシを通さずにインターネットに繋げて、

出社した時はProxyをONにしてインターネットに繋げる人も多いのではないでしょうか。

今回は、インターネットオプションのダイアログを表示せずに、ダブルクリックだけで

ProxyのON/OFFを切り替える方法をご紹介します。


次のコマンドをBATファイルにして実行して下さい。ProxyのON/OFFを切り替えることができます。

------------------------------------------------------------

Rem レジストリを書き換えてProxyをON

reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v "ProxyEnable" /t REG_DWORD /d "1" /f

------------------------------------------------------------

Rem レジストリを書き換えてProxyをOff

reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v "ProxyEnable" /t REG_DWORD /d "0" /f


SQL Server:現在実行中のクエリを確認

 現在実行中のクエリを確認する方法です。
以下のSQLを実行して見て下さい。

SELECT sqltext.TEXT,
req.session_id,
req.status,
req.command,
req.cpu_time,
req.total_elapsed_time
FROM sys.dm_exec_requests req
CROSS APPLY sys.dm_exec_sql_text(sql_handleAS sqltext 

 

Azure VM BシリーズのCPUクレジットの残高を確認する

「勤怠システム」など特定の時間帯だけ高負荷となり、それ以外の時間帯は殆ど使用されないシステムでは、Bシリーズが最適な選択になります。

Bシリーズでは、CPU使用量がベースラインを下回る場合は、CPUクレジットを蓄積し、高負荷となった場合は蓄積したCPUクレジットを消費して、通常より高いパフォーマンスを発揮してくれます。 (例えば、「Standard_B2s」サイズの場合だと最大CPUパフォーマンス200%まで引きあがります)

今回は、CPUクレジットの残高を確認する方法を紹介します。 Azure Portalで以下の操作を行ってください。

  • Azure Portalで対象のVMのページに移動。

  • 「メトリック」を表示し、「CPU Credits Remaining」、「Percentage CPU」を追加。

以下のとおり、CPUクレジットの推移を確認できます。



なお、CPUクレジットを全て使い切った場合は、ベースラインパフォーマンスに戻ります。(「Standard_B2s」サイズの場合だとCPU使用率40%になる。)

また、VMを「再デプロイ」または「停止/起動」するとCPUクレジットが0にリセットされるのでご留意ください。

グループポリシーエディタの起動方法

 

  • ファイル名を指定して実行(Windowsキー + R)を開く

  • 以下のコマンドを実行

gpedit.msc

PLCプログラミング(ラダープログラミング)の知識を深めたい方へ

C#でPLCと通信する方法」の追記です。
ラダープログラミングについてもう少し知識を深めたいという方には、以下の書籍がお奨めです。
こちらもKindle Unlimtedなら無料で閲覧できますので、興味ある方は是非!!

C#でPLCと通信する方法

 例えば、以下のような要望をよく耳にします。

  • 「デバイス値を監視して稼働率を計測したい。」
  • 「デバイス値を監視して予知保全に役立てたい。」
  • 「複数の加工機を統括制御するような.Netプログラムを開発したい。」

このような背景から、C#でPLCと通信するためのプログラム環境構築について、まずは三菱電機さんのGX Works2をターゲットに調査し、書籍に纏めてみました。

現場では、図1のようなシステム構成ですが、本書では、図2のようにエミュレーター環境でプログラムの動作確認ができる方法を紹介しております。

勉強や調査の段階では、PLC実機での動作確認ができない方も多いと思いますので参考にしていただければ幸いです。

Kindle Unlimitedだと無料で閲覧できますので興味のある方は是非!!

図1.製造現場でのシステム構成例

図2.本書でのシミュレータを用いたシステム構成

SendToフォルダを開く

  • ファイル名を指定して実行(Windowsキー + R)を開く

  • 以下のコマンドを実行

shell:sendto

便利なので、是非、試してみて下さい。

Resize, SizeChanged, Layoutイベントの違い

 

イベント説明
Resizeコントロールのサイズが変更された時に発生。
SizeChangedSizeプロパティが変更されたときに発生。
Layoutコントロールが配置し直す時に発生。

上記の説明では、イマイチ違いが解らないので、実際に発生の順序の違いを調べました。

●ユーザのマウス操作でFormサイズを変更した場合

Layoutイベント
 ↓
Resizeイベント
 ↓
SizeChangedイベント

●プログラミングでSizeプロパティを変更した場合

this.Size = new Size(300, 100);
Layoutイベント
 ↓
Resizeイベント
 ↓
SizeChangedイベント

●プログラミングでHeightプロパティを変更した場合

Form.Height += 100;
Layoutイベント
 ↓
Resizeイベント
 ↓
SizeChangedイベント

結果は、どれも同じ順序で発生することが解りました。

なお、Microsoftのドキュメントでは、「Layoutイベントを使用してカスタムレイアウトを処理すること」をお勧めしています。

VimでHTMLを自動インデントする方法

以下のコマンドを実行してみて下さい。

%s/></>\r</g | filetype indent on | setf xml | normal gg=G

Vimのコマンドウィンドウを活用しよう

 

コマンド履歴のコマンドウィンドウを表示

q:

コマンドウィンドウが開くと通常のコマンドモード時の操作が可能になります。

カーソルを再実行したい行に移動してEnterを押下すると再実行されます。

検索履歴のコマンドウィンドウを表示

q/
または、
q?

カーソルを再検索したい行に移動してEnterを押下すると再検索されます。

コマンドウィンドウを閉じる

:q

便利なので、是非、試してみて下さい。

TikaOnDotnetでファイル内の文字列を抽出する方法

 以下のSampleのとおり、TextExtractor.Extract()メソッドで、ファイル内の文字列を取得できます。

※Shift-Jisのテキストファイル(.txt)は、UTF-8に変換しないと抽出に失敗するので要注意。

public void TikaExtractorTest() {
    var txtExtractor = new TextExtractor();

    var path = @"C:\Temp\Test.xlsx";
    var content = txtExtractor.Extract(path);

    Debug.WriteLine(content.Text);
}

C#で文字コードを自動判定する方法

 以下のSampleのとおり、ReadJEnc.JP.GetEncoding()メソッドで文字コードを自動判定することができます。

実装例

public void DetectingEncodeTest() {
    var path = @"C:\Temp\Test.txt";

    byte[] bytes = null;
    using (var fs = new FileStream(path, FileMode.Open)) {
        bytes = new byte[fs.Length];
        fs.Read(bytes, 0, bytes.Length);
    }
    string str = null;
    var encode = ReadJEnc.JP.GetEncoding(bytes, bytes.Length, out str);

    Debug.WriteLine(encode.ToString());
}

実行結果

ShiftJIS

厳選 Visual Studioの便利なショートカット

  エラー箇所にジャンプ 「Ctrl + Shift + F12」 ブレークポイント 設定/解除 「F9」 有効化/無効化 「Ctrl + F9」 ViEmu特有 「:ls」:バッファナンバーのリストを表示。 「:b2」:バッファ2のファイルを開く。 「:n」:次のバッファのファ...