2021年12月26日日曜日

[Book's Review (Develop)]プログラミングC# 第8版

(1)レビュー
 C#8.0の書籍で、
 入門編レベルよりもさらに踏み込んだ技術を習得したい方にお勧め!
 レベルの高い書籍だと、文章がわかりにくかったり、
 無駄にページ数が多かったり、『~編』のようにシリーズ化しているものが多いですが、
 この書籍はわかりやすくまとめてあります。

 非同期ストリーム、インターフェイスのデフォルト実装、null 合体代入 (??=)など
 新機能もわかりやすく解説しています。

(2)リンク
プログラミングC# 第8版

プログラミングC# 第8版

  • 出版社/メーカー: オライリージャパン
  • 発売日: 2021/06/22
  • メディア: 単行本(ソフトカバー)
プログラミングC# 第7版

プログラミングC# 第7版

  • 出版社/メーカー: オライリージャパン
  • 発売日: 2013/11/29
  • メディア: 大型本

2020年11月26日木曜日

[VBA]複数のセルオブジェクトを1つのセルオブジェクトに統合する。

[はじめに]
・あまり知られていないかもしれませんが、
 複数のセルオブジェクトを、1つのセルオブジェクトに統合することができます。
 ※Union関数を使用。

 統合後のセルに対して、
 プロパティやメソッドにアクセスすると、
 統合前のセルすべてに対して、アクセスすることと同じ意味になります。
 複数のセルオブジェクトをまとめて処理したい場合に、便利です。
 ※[注意]セルの結合ではありません。

 以下は、
 「A1」、「B2:D5」、「D3,D5」の複数のセル領域を統合して、
 「Hello」の文字列を設定する例です。
  備忘録としてサンプルソースを掲載します。

[ソース]
Private Sub UnionSample()

    Dim cellArray() As Variant
    Dim cellUnion As Range
    Dim cell As Variant
    
    '① 統合前のセルを定義
    cellArray = Array(Range("A1"), Range("B2:C5"), Range("D3:F5"))
    
    '② ①で定義したセルを
    '  1つのセルオブジェクトに統合する。
    For Each cell In cellArray
        If cellUnion Is Nothing Then
            '初回のみセルを設定
            Set cellUnion = cell
        Else
            '2回目以降は、セルを統合する。
            Set cellUnion = Union(cellUnion, cell)
        End If
    
    Next
    
    '③ 統合後のセルに値を設定。
    cellUnion.Value = "Hello"

End Sub
[VBA]複数のセルオブジェクトを1つのセルオブジェクトに統合する。

2020年11月25日水曜日

[VBA]カラーの定数一覧

[はじめに]
・VBAで、
 色の定数を知りたいことがよくあるので、
 備忘録として掲載します。

カラーの定数一覧
ColorConstants定数
カラーColorConstants定数RGBカラー値
(R+G×256+B×2562)
vbBlack0000
vbBlue0025516711680
シアンvbCyan025525516776960
vbGreen0255065280
マゼンタvbMagenta255025516711935
vbRed25500255
vbWhite25525525516777215
vbYellow255255065535


XlRgbColor定数
カラーXlRgbColor定数RGBカラー値
(R+G×256+B×2562)
rgbBlack0000
ディムグレーrgbDimGray、rgbDimGrey1051051056908265
灰色rgbGray、rgbGrey1281281288421504
濃い灰色rgbDarkGray、rgbDarkGrey16916916911119017
銀色rgbSilver19219219212632256
薄い灰色rgbLightGray、rgbLightGrey21121121113882323
ゲーンズボロrgbGainsboro22022022014474460
ホワイトスモークrgbWhiteSmoke24524524516119285
rgbWhite25525525516777215
スノーrgbSnow25525025016448255
ローズブラウンrgbRosyBrown1881431439408444
薄いさんごrgbLightCoral2401281288421616
インディアンレッドrgbIndianRed20592926053069
rgbBrown16542422763429
れんが色rgbFireBrick17834342237106
栗色rgbMaroon12800128
濃い赤rgbDarkRed13900139
rgbRed25500255
ミスティローズrgbMistyRose25522822514804223
サーモンピンクrgbSalmon2501281147504122
トマトrgbTomato25599714678655
濃いサーモンピンクrgbDarkSalmon2331501228034025
さんごrgbCoral255127805275647
オレンジレッドrgbOrangeRed25569017919
薄いサーモンピンクrgbLightSalmon2551601228036607
シェンナrgbSienna16082452970272
シーシェルrgbSeashell25524523815660543
ピーチパフrgbPeachPuff25521818512180223
サンディブラウンrgbSandyBrown244164966333684
リネンrgbLinen25024023015134970
ペルーrgbPeru205133634163021
ビスクrgbBisque25522819612903679
濃いオレンジrgbDarkOrange255140036095
アンティークホワイトrgbAntiqueWhite25023521514150650
タンrgbTan2101801409221330
バーリーウッドrgbBurlyWood2221841358894686
ブランシュアーモンドrgbBlanchedAlmond25523520513495295
ナバホホワイトrgbNavajoWhite25522217311394815
パパイヤホイップrgbPapayaWhip25523921314020607
モカシンrgbMoccasin25522818111920639
オレンジrgbOrange255165042495
フローラルホワイトrgbFloralWhite25525024015792895
オールドレースrgbOldLace25324523015136253
小麦rgbWheat24522217911788021
ゴールデンロッドrgbGoldenrod218165322139610
濃いゴールデンロッドrgbDarkGoldenrod18413411755384
コーンシルクrgbCornsilk25524822014481663
ゴールドrgbGold255215055295
レモンシフォンrgbLemonChiffon25525020513499135
カーキrgbKhaki2402301409234160
濃いカーキrgbDarkKhaki1891831077059389
ペールゴールデンロッドrgbPaleGoldenrod2382321077071982
アイボリーrgbIvory25525524015794175
ベージュrgbBeige24524522014480885
明るい黄rgbLightYellow25525522414745599
薄いゴールデンロッドイエローrgbLightGoldenrodYellow25025021013826810
オリーブrgbOlive128128032896
rgbYellow255255065535
オリーブドラブrgbOliveDrab107142352330219
イエローグリーンrgbYellowGreen154205503329434
濃いオリーブグリーンrgbDarkOliveGreen85107473107669
グリーンイエローrgbGreenYellow173255473145645
若草色rgbLawnGreen124252064636
シャルトルーズrgbChartreuse127255065407
ハニーデューrgbHoneydew24025524015794160
濃いシーグリーンrgbDarkSeaGreen1431881439419919
明るい緑rgbLightGreen1442381449498256
ペールグリーンrgbPaleGreen15225115210025880
フォレストグリーンrgbForestGreen34139342263842
ライムグリーンrgbLimeGreen50205503329330
濃い緑rgbDarkGreen0100025600
rgbGreen0128032768
黄緑rgbLime0255065280
淡いアクアマリンrgbMediumAquamarine10225517011206502
淡いシーグリーンrgbMediumSeaGreen601791137451452
シーグリーンrgbSeaGreen46139875737262
ミントクリームrgbMintCream24525525016449525
スプリンググリーンrgbSpringGreen02551278388352
淡いスプリンググリーンrgbMediumSpringGreen025015410156544
アクアマリンrgbAquamarine12725521213959039
ターコイズrgbTurquoise6422420813688896
薄いシーグリーンrgbLightSeaGreen3217817011186720
淡いターコイズrgbMediumTurquoise7220920413422920
空色rgbAzure24025525516777200
ペールターコイズrgbPaleTurquoise17523823815658671
濃いスレートグレーrgbDarkSlateGray4779795197615
濃いスレートグレーrgbDarkSlateGrey4779795197615
青緑rgbTeal01281288421376
濃いシアンrgbDarkCyan01391399145088
明るい水色rgbLightCyan01391399145088
濃いターコイズrgbDarkTurquoise020620913749760
水色rgbAqua025525516776960
カデットブルーrgbCadetBlue9515816010526303
パウダーブルーrgbPowderBlue17622423015130800
明るい青rgbLightBlue17321623015128749
深いスカイブルーrgbDeepSkyBlue019125516760576
スカイブルーrgbSkyBlue13520623515453831
薄いスカイブルーrgbLightSkyBlue13520625016436871
アリスブルーrgbAliceBlue24024825516775408
スチールブルーrgbSteelBlue7013018011829830
スレートグレーrgbSlateGray1121281449470064
薄いスレートグレーrgbLightSlateGray11913615310061943
ドジャーブルーrgbDodgerBlue3014425516748574
薄いスチールブルーrgbLightSteelBlue17619622214599344
コーンフラワーブルーrgbCornflowerBlue10014923715570276
ロイヤルブルーrgbRoyalBlue6510522514772545
ゴーストホワイトrgbGhostWhite24824825516775416
ラベンダーrgbLavender23023025016443110
ミッドナイトブルーrgbMidnightBlue25251127346457
ネイビーrgbNavy、rgbNavyBlue001288388608
濃い青rgbDarkBlue001399109504
淡い青rgbMediumBlue0020513434880
rgbBlue0025516711680
濃いスレートブルーrgbDarkSlateBlue72611399125192
スレートブルーrgbSlateBlue1069020513458026
淡いスレートブルーrgbMediumSlateBlue12310423815624315
淡い紫rgbMediumPurple14711221914381203
青紫rgbBlueViolet1384322614822282
インディゴrgbIndigo7501308519755
濃いオーキッドrgbDarkOrchid1535020413382297
濃い紫rgbDarkViolet148021113828244
淡いオーキッドrgbMediumOrchid1868521113850042
あざみ色rgbThistle21619121614204888
プラムrgbPlum22116022114524637
紫色rgbViolet23813023815631086
rgbPurple12801288388736
濃いマゼンタrgbDarkMagenta13901399109643
明るい紫rgbFuchsia255025516711935
オーキッドrgbOrchid21811221414053594
淡いバイオレットレッドrgbMediumVioletRed199211338721863
深いピンクrgbDeepPink255201479639167
ホットピンクrgbHotPink25510518011823615
ラベンダーブラッシュrgbLavenderBlush25524024516118015
ペールバイオレットレッドrgbPaleVioletRed2191121479662683
深紅rgbCrimson22020603937500
ピンクrgbPink25519220313353215
薄いピンクrgbLightPink25518219312695295

2020年11月23日月曜日

[VBA]RGBカラー値からRGBの各々の値を取得

[はじめに]
・RGBの各要素からRGBカラー値を取得する為に、
 VBAではRGB関数が用意されていますが、
 その逆(RGBカラー値から元のRGB各要素を取得)の関数は
 用意されていません。

 たまに必要になることがあるので、
 ユーザ定義関数を作成しましたので、備忘録として掲載します。

[ソース]
'[機能]
' RGB カラー値から、
' 赤(R)、緑(G)、青(B)の各々の値を取得する。
'[引数]
' rgbColor:RGB カラー値
'[戻り値]
' RGBの各値(配列)
'  0番目:赤(R)
'  1番目:緑(G)
'  2番目:青(B)
Public Function GetRgbValues(ByVal rgbColor As LongAs Integer()

    Dim rtnColors(2) As Integer

    '赤(R)
    rtnColors(0) = rgbColor Mod 256
    '緑(G)
    rtnColors(1) = rgbColor \ 256 Mod 256
    '青(B)
    rtnColors(2) = rgbColor \ 65536

    GetRgbValues = rtnColors

End Function
[VBA]RGBカラー値から赤(R)、緑(G)、青(B)の各々の値を取得

2020年11月22日日曜日

[VBA]セルの取得、値の書き込み

[はじめに]
・Excel VBAでよくセルの情報を取得することがありますが、
 様々な書き方があるので、備忘録に記載します。

 セル座標をA1形式や行列番号で指定したり、
 複数セルの範囲指定、その他のブックやシート上のセルの取得 など
 用途に応じたパターンを適用頂ければと思います。

[ソース]
Private Sub WriteToCellValue()

    '■■■1.「A1形式」でセルを指定する。
    ' ①単一セルを扱う。
    ' ※例:セルA1に値を出力
    Range("A1").Value = "あ"
    
    ' ②複数セルを扱う(その1)
    ' ※例:セルA3~A5に値を出力
    Range("A3:A5").Value = "い"

    ' ③複数セルを扱う(その2)
    ' ※例:セルC1~D10に値を出力
    Range(Range("C1"), Range("D10")).Value = "う"

    '■■■2.行番号、列番号でセルを指定する。
    ' 行番号、列番号をカウントアップ等をさせたい場合、有効。
    ' ※例:セル(1行目、6列目)に値を出力
    Cells(1, 6).Value = "え"

    '■■■3.特定のセル範囲内から、相対的にセルを取得
    ' ※例:セルD4(B3~E5内で2行目、3列目)に値を出力
    Range("B3:E5").Cells(2, 3).Value = "お"

    '■■■4.特定のセル範囲内から、相対的な行を取得
    ' ※例:B3~E5内の1行目に値を出力
    Range("B3:E5").Rows(1).Value = "か"

    '■■■5.特定のセル範囲内から、相対的な列を取得
    ' ※B3~E5内の3列目に値を出力
    Range("B3:E5").Columns(3).Value = "き"

    '■■■6.他のシートのセルを扱う。
    ' 指定セルが、他のシートにある場合は、
    ' 以下のように記載します。
    ' シート省略時は、アクティブシートが対象になります。
    ' ※例:シートSheet1のセルA2に値を出力
    '   以下例のRangeは上記の1~5の表記でも可能。
    Sheets("Sheet1").Range("A2").Value = "く"

    '■■■7.他のブックのセルを扱う。
    ' 指定セルが、他のブック、シートにある場合は、
    ' 以下のように記載します。
    ' ブック省略時は、アクティブブックが対象になります。
    ' ※例:当ブックのシートSheet1のセルA3に値を出力
    '   以下例のRangeは上記の1~5の表記でも可能。
    ThisWorkbook.Sheets("Sheet1").Range("A3").Value = "け"

End Sub
[VBA]セルの選択

2020年6月9日火曜日

[.NET][Visual Studio]CodeLensを非表示にする。(○○個の参照)

[はじめに]
 Visual Studioはバージョンアップのたびに様々な便利機能が追加されますが、
 便利な反面、稀に不便なものもあります。
 そのうちの1つがCodeLensです。(あくまでも筆者の感想です)

 CodeLensとは、
 Visual Studio 2015で追加された機能で、
 コードエディタ上で、メソッドやクラスの定義の上の行に、
 そのメソッドやクラスを参照している個数を表示する機能です。
 (図1で「4個の参照」と表示されている箇所です。)

 一見、便利な機能ですが、
 コード編集時に「○○個の参照」の行にカーソルが入らない為、
 編集時に思い通りの動作にならず、不便に感じることがあります。

 CodeLensを無効にする設定が一見わかりづらいので、
 無効にする手順を、備忘録として掲載します。


【図1】
vs_01b.jpg

[CodeLensを無効にする手順]
(1)Visual Studio の「ツール」→「オプション」を選択し、
   オプションダイアログを表示させる。
  vs_02_01.jpg

(2)オプションダイアログの左側のツリービューで、
   「テキストエディタ」→「すべての言語]」→「CodeLens」をクリックし、
   右側のエリアの「CodeLens を有効にする」の
   チェックボックスのチェックを外す。
  vs_02_02.jpg

(3)(2)まで実施すると、CodeLensの表記が表示されなくなります。
  vs_03b.jpg

2020年6月7日日曜日

[.NET]yield returnの使用例(C#)

[はじめに]
 C#には「yield」キーワードがありますが、
 他の言語と比べて特殊でわかりにくいので、使い方の備忘録を掲載します。
 ※「yield」は、
  他の言語(JavaScript、Perl、Python等)でも採用されつつありますが。。。

 「yield」は、
 オブジェクト指向のデザインパターンのIteratorパターンの実装で利用されます。
 Iteratorパターンとは、多数の集合に対してその内部の実装を意識することなく、
 逐次処理するためのデザインパターンです。

 C#では、.NET Framework 2.0(Visual Studio 2005)から
 「yield」が導入されました。
 .NET Framework 1.1(Visual Studio .NET 2003)以前の版で、
 Iteratorパターンを実装するには、
 IEnumerableインタフェース、IEnumeratorインタフェースを実装したクラスを
 記述する必要がありましたが、
 .NET Framework 2.0(Visual Studio 2005)以降では、
 それらのクラスは「yield return」で代用され、
 Iteratorパターンの実装がより簡潔になりました。

[サンプルコード]
以下、2つのサンプルコードを掲載します。
2つのサンプルコードは、各々独立して動作します。
 /// <summary>
 /// yield returnの実装サンプル
 /// </summary>
 public class YieldSample1 : IEnumerable<string>
 {
     /// <summary>
     /// 月の異名の列挙を取得する。
     /// </summary>
     /// <returns>月の異名の列挙</returns>
     public IEnumerator<string> GetEnumerator()
     {
         yield return "睦月";
         yield return "如月";
         yield return "弥生";
         yield return "卯月";
         yield return "皐月";
         yield return "水無月";
         yield return "葉月";
         yield return "長月";
         yield return "神無月";
         yield return "霜月";
         yield return "師走";
     }

     /// <summary>
     /// 月の異名の列挙を取得する。
     /// </summary>
     /// <returns>月の異名</returns>
     IEnumerator IEnumerable.GetEnumerator()
     {
         return this.GetEnumerator();
     }
 }

 public class Program1
 {
     /// <summary>
     /// 列挙を取得し、各々の要素を出力する。
     /// </summary>
     /// <param name="args"></param>
     static void Main(string[] args)
     {
         System.Console.WriteLine("■月の異名を出力する。");

         IEnumerable<string> ie1 = new YieldSample1();
         foreach (var it1 in ie1)
         {
             System.Console.WriteLine(it1);
         }
         System.Console.WriteLine("");

         //[出力]
         // ■月の異名を出力する。
         // 睦月
         // 如月
         // 弥生
         // 卯月
         // 皐月
         // 水無月
         // 葉月
         // 長月
         // 神無月
         // 霜月
         // 師走

         //[補足]
         // 上記コードは、
         // 下記のように書き換えることも可能です。
         // 逆に言うと、foreachで実装すると、
         // 以下のコードに読み替えて実行されます。

         //System.Console.WriteLine("■月の異名を出力する。(while文で処理)");

         //IEnumerable<string> ie1 = new YieldSample1();
         //IEnumerator<string> it1 = ie1.GetEnumerator();
         //while (it1.MoveNext())
         //{
         //    System.Console.WriteLine(it1.Current);
         //}
         //System.Console.WriteLine("");

         System.Console.ReadLine();

     }
 }
[C#]yield returnの使用例(その2)


/// <summary>
/// yield returnの実装サンプル
/// </summary>
public class YieldSample2
{
    /// <summary>
    /// 干支の列挙を取得する。
    /// </summary>
    /// <returns>干支の列挙</returns>
    public IEnumerable<String> GetEto()
    {
        yield return "子年";
        yield return "丑年";
        yield return "寅年";
        yield return "卯年";
        yield return "辰年";
        yield return "巳年";
        yield return "午年";
        yield return "未年";
        yield return "申年";
        yield return "酉年";
        yield return "戌年";
        yield return "亥年";
    }
}

public class Program2
{
    /// <summary>
    /// 列挙を取得し、各々の要素を出力する。
    /// </summary>
    /// <param name="args"></param>
    static void Main(string[] args)
    {
        System.Console.WriteLine("■干支を出力する。");

        YieldSample2 ie1 = new YieldSample2();
        foreach (var it1 in ie1.GetEto())
        {
            System.Console.WriteLine(it1);
        }
        System.Console.WriteLine("");

        //[出力]
        // ■干支を出力する。
        // 子年
        // 丑年
        // 寅年
        // 卯年
        // 辰年
        // 巳年
        // 午年
        // 未年
        // 申年
        // 酉年
        // 戌年
        // 亥年

        //[補足]
        // 上記コードは、
        // 下記のように書き換えることも可能です。
        // 逆に言うと、foreachで実装すると、
        // 以下のコードに読み替えて実行されます。

        //System.Console.WriteLine("■干支を出力する。(while文で処理)");

        //YieldSample2 ie1 = new YieldSample2();
        //IEnumerator<string> it1 = ie1.GetEto().GetEnumerator();
        //while (it1.MoveNext())
        //{
        //    System.Console.WriteLine(it1.Current);
        //}
        //System.Console.WriteLine("");

        System.Console.ReadLine();
    }
}
[C#]yield returnの使用例(その2)
[ご参考]
Iteratorパターンについて
 デザインパターン「Iterator」-Qiita

2019年8月11日日曜日

[Book's Review (Develop)]オラクル認定資格教科書 Javaプログラマ Gold SE 8 (EXAMPRESS)

(1)レビュー
 以下2冊の紹介です。

 (1)『オラクル認定資格教科書 Javaプログラマ Gold SE 8』(通称『紫本』
 (2)『徹底攻略 Java SE 8 Gold 問題集[1Z0-809]対応』(通称『黒本』

 今までMicrosoft系をメインに資格取得に励んできましたが、
 Java系の資格にもチャレンジすることになり、
 参考書として『紫本』を、
 問題集として『黒本』を購入しました。

 JavaSE8といえば、
 新機能のラムダ式ストリームAPI
 日付/時刻API が注目されていますが、
 JavaSE7で追加された
 try-with-resourcesswitch文の拡張(String型のサポート)
 ダイヤモンド演算子例外のマルチキャッチ
 Executor ServiceFork/Join Framework
 数値リテラルのアンダースコアの区切り文字2進数表記 等など
 普段の開発でも使いこなされていなさそうな機能についても、
 分かりやすい解説が充実しています。

 書店のIT系資格コーナーには
 必ずと言っていいほど並んでいる書籍ですが、
 有名なだけあり、内容も充実しています。
   『JavaSE8 Gold』資格取得を目指している方にぜひオススメの2冊です。

 また『Javaプログラマ Gold SE 8』
 『Javaプログラマ Silver SE 8』前提資格となります。
 Goldと併せて、Slver対策として、以下2冊もオススメです。
 (3)『オラクル認定資格教科書 Javaプログラマ Silver SE 8』(通称『紫本』
 (4)『徹底攻略 Java SE 8 Silver 問題集[1Z0-808]対応』(通称『黒本』

 [2019.8.10 合格]
 本試験は、Javaプログラマ歴、7、8年のベテランでも、
 1回の受験で通るのは難しいと言われています。
 Java開発経験は3年程度の私ですが、
 .NET(C#、VB.NET)の10年の開発経験で、
 オブジェクト指向やラムダ式の基本を理解していた為、
 『紫本』による学習、『黒本』による問題演習を、
 各々2周することで、1回の受験で合格できました。

(2)リンク
オラクル認定資格教科書 Javaプログラマ Gold SE 8 (EXAMPRESS)

オラクル認定資格教科書 Javaプログラマ Gold SE 8 (EXAMPRESS)

  • 作者: 山本 道子
  • 出版社/メーカー: 翔泳社
  • 発売日: 2016/07/21
  • メディア: 単行本(ソフトカバー)
徹底攻略 Java SE 8 Gold 問題集[1Z0-809]対応

徹底攻略 Java SE 8 Gold 問題集[1Z0-809]対応

  • 作者: 米山 学
  • 出版社/メーカー: インプレス
  • 発売日: 2016/10/14
  • メディア: 単行本(ソフトカバー)
オラクル認定資格教科書 Javaプログラマ Silver SE 8

オラクル認定資格教科書 Javaプログラマ Silver SE 8

  • 作者: 有限会社ナレッジデザイン 山本道子
  • 出版社/メーカー: 翔泳社
  • 発売日: 2016/02/11
  • メディア: 単行本(ソフトカバー)
徹底攻略 Java SE 8 Silver 問題集[1Z0-808]対応

徹底攻略 Java SE 8 Silver 問題集[1Z0-808]対応

  • 作者: 志賀 澄人
  • 出版社/メーカー: インプレス
  • 発売日: 2016/01/18
  • メディア: 単行本(ソフトカバー)

2019年3月10日日曜日

[JavaSctipt]文字列をクリップボードにコピーする

[はじめに]
ブログで記事の内容をクリップボードにコピーする機能を導入する機会があったので、
JavaScriptクリップボードにコピーするコードを作りました。
動作確認は、『Microsoft Internet Explorer11』、『Microsoft Edge』で実施済です。

備忘録として、以下、2つのサンプルソースを掲載します。
2つのサンプルソースは、各々独立して動作します。
<html>
<head>
</head>
<body>

<table border='1'>
<tr><td>
<button
 type="button"
 onClick="
var ta=document.createElement('textarea');
ta.value=this.parentNode.parentNode.parentNode.getElementsByTagName('tr')[1].innerText;
this.appendChild(ta);ta.select();
document.execCommand('Copy');
alert('コピーしました。');
this.removeChild(ta);
"
>
コードのコピー
</button>
</td></tr>
<tr><td><font size="2" color="red">Hello,World!!</font></td></tr>
</table>

</body>
</html>
[JavaScript]文字列をクリップボードにコピーする(その1)


<html>
<head>
<script language="JavaScript">

/// <summary>
/// クリップボードに文字列をコピーする
/// </summary>
/// <param name="targetText">コピー対象の文字列</param>
/// <param name="docWork">ワーク用TextAreaの作成場所。省略時はdocument.body</param>
/// <remarks></remarks>
function copyText(targetText, docWork){

  //[説明]
  // クリップボードにコピーできる文字列は、
  // 入力可能なテキストコントロール(TextArea等)上で
  // 選択状態になっていることが前提となります。
  // この前提により、
  // テキストコントロール以外に記載された文字列を
  // クリップボードにコピーする為には、
  // 一時的にテキストコントロールを経由する必要があります。
  // 本関数では、
  // テキストコントロールを使用しない、かつ、
  // 改行コードを含む文字列の場合を考慮して、
  // 一時的にTextAreaを追加し
  // クリップボードにコピーした後、
  // TextAreaを削除しています。

  if(docWork==null || docWork==undefined){
    //引数docWorkを省略した場合は、
    //document.bodyとする。
    docWork=document.body;
  }

  //ワーク用のTextAreaを作成する。
  var ta=document.createElement("textarea");
  //コピー対象の文字列をTextAreaに書き込む。。
  ta.value=targetText;
  //ワーク用のTextAreaを追加する。
  docWork.appendChild(ta);
  //TextAreaの文字列を全選択する。
  ta.select();
  //選択状態の文字列をクリップボードにコピーする。
  document.execCommand("Copy");
  //コピー完了後のメッセージを表示する。
  alert("コピーしました。");
  //ワーク用のTextAreaを削除する。
  docWork.removeChild(ta);
}

</script>
</head>
<body>

<table border='1'>
<tr><td>
<button 
  type="button"
  onClick="copyText(this.parentNode.parentNode.parentNode.getElementsByTagName('tr')[1].innerText, this);">
  テキストをコピー
</button>
</td></tr>
<tr><td><font size="2" color="red">Hello,World!!</font></td></tr>
</table>

</body>
</html>   
[JavaScript]文字列をクリップボードにコピーする(その2)

2019年3月9日土曜日

[.NET][Edge対応版]プログラムコードの変換(C#、VB.NET→HTML)

[はじめに]
 ・プログラムソース(C#、VB.NET)を
  ブログ公開用のHTMLに変換するツールです。
  (コード量が膨大の為、変換処理のみ掲載しています。)
[機能]
  プログラムソースの文字列を、HTMLに変換する。
  変換後のHTMLは、<table>タグで整形した形になります。
[変換後HTML]
 ・インデントのスペースが「 」に変換され、ブラウザ上でも表示される。
 ・予約語、コメント、文字列(ダブルコーテーションで囲んだ部分)に色がつく。
 ・ソースコードをクリップボードにコピーする機能を提供。(「コードのコピー」ボタンを付加)
  IE、Edgeで動作確認済。
[制限事項]
 ・言語は、C#とVB.NETのみです。
  但し、VB6やVBA等はVB.NETと言語仕様が似ている為、
  制限事項を考慮の上、利用することもできます。
 ・C#のコメントは、行の先頭の「//」のみサポート。
  行の途中の「//」や「/*」~「*/」はサポートしません。
 ・VB.NETのコメントは、行の先頭の「'」のみサポート。
  行の途中の「'」はサポートしません。
[使い方]
 (1)ビルド前に、「System.Web」を参照設定に追加する。
   追加しないとコンパイルエラーになります。
 (2)CodeConverterToHtml クラスのGetInstanceメソッドで、
   変換オブジェクトを取得します。
   言語の種類(C#かVB.NET)は、GetInstanceメソッドの第1引数で指定します。 
 (3)CodeConverterToHtml クラスのConvertCodeToHtmlメソッドで、
   ソースをHTMLに変換します。
   ConvertCodeToHtmlメソッドの仕様
   ・第1引数:プログラムソースの文字列
   ・第2引数:整形後HTMLのタイトル。(省略可能)
   ・戻り値:変換後のHTMLの文字列
        変換後の文字列(HTML)は、
        <table>タグで整形した形となります。
        (<html>タグでは囲みません。)
'変換クラスを取得する。
Dim conv As CodeConverterToHtml = _
        CodeConverterToHtml.GetInstance( _
            CodeConverterToHtml.ProgLangType.VBNet _
        )

'プログラムソース
Dim strPgSource As String = "・…(プログラムソース)…"

'変換処理(変換結果はブログ等に貼り付けて、利用できます。)
Dim strConv As String = _
    conv.ConvertCodeToHtml(strPgSource, "[VB.NET]変換機能の使用例")
[VB.NET]変換機能の使用例

[改造ポイント]
 ・拡張性
  言語(C#、VB.NET)の固有ロジックを、
  CodeConverterToHtml の派生クラスに定義しています。
  (VBCodeConverterToHtml、CSharpCodeConverterToHtml)
  予約語一覧、キーワードの前景色、背景色、検索条件(正規表現)、変換仕様は、
  派生クラスの修正で変更できます。
  また、言語を追加する場合も、既存の派生クラスの流用が簡単です。
 ・予約語一覧
  予約語一覧は各派生クラスに定義しています。
  予約語の追加、変更、削除が簡単です。
 ・キーワードの検索条件
  正規表現を各派生クラスに定義しています。
  正規表現を修正することで、キーワードの検索条件を変更できます。
 ・キーワードの変換仕様
  正規表現の検索結果毎に、
  MatchEvaluator()メソッドが呼ばれます。
  MatchEvaluator()メソッドの修正で変換仕様を変更できます。
 ・マルチスレッド対応
  スレッドセーフではありません。
  派生クラスのGetRegEx() とGetReservedWords()に、
  複数スレッドが同時アクセスした場合、
  m_RegEx変数、m_ReservedWords変数の値に
  矛盾が生じる可能性があります。
  ASP.NET等のマルチスレッド環境で安全に使用する為には、
  SyncLockで排他をかける必要があります。

[プログラムソース]
Imports System.Text.RegularExpressions
''' <summary>
''' 変換(ソースコード→HTML)
''' </summary>
''' <remarks></remarks>
Public MustInherit Class CodeConverterToHtml

#Region "定数定義"
    ''' <summary>
    ''' HTMLレイアウト
    ''' </summary>
    ''' <remarks></remarks>
    Private Const TABLE_STRING As String =
        "<table width=""100%"" border=""0"" " &
        " bgcolor=""@@@TITLEBGCOLOR@@@"" " &
        " cellspacing=""0"">" &
        " <tr><td>" &
        "  <button type=""button"" value="""" " &
        "   onClick=""" &
        "   var ta=document.createElement('textarea');" &
        "   ta.value=this.parentNode.parentNode.parentNode.getElementsByTagName('tr')[1].innerText;" &
        "   this.appendChild(ta);ta.select();" &
        "   document.execCommand('Copy');" &
        "   alert('コピーしました。');" &
        "   this.removeChild(ta);"">" &
        "   コードのコピー</button>" &
        " </td></tr>" &
        " <tr><td>" &
        " <table width=""100%"" border=""0"" " &
        "  cellpadding=""10"" " &
        "  bgcolor=""@@@BGCOLOR@@@"" " &
        "  cellspacing=""0"">" &
        "  <tr><td>" &
        "   <font color=""@@@FORECOLOR@@@"" " &
        "    style=""font-size: 9pt"">" &
        "    <code>@@@CODE@@@</code>" &
        "   </font>" &
        "  </td></tr>" &
        " </table>" &
        " </td></tr>" &
        " <tr><td>" &
        " <b><font size=""2"">@@@TITLE@@@</font></b>" &
        " </td></tr>" &
        "</table>"
#End Region

#Region "列挙定義"
    ''' <summary>
    ''' 言語の種類
    ''' </summary>
    ''' <remarks></remarks>
    Public Enum ProgLangType
        ''' <summary>
        ''' VB.NET
        ''' </summary>
        ''' <remarks></remarks>
        VBNet = 0
        ''' <summary>
        ''' C#.NET
        ''' </summary>
        ''' <remarks></remarks>
        CSharp = 1
    End Enum

#End Region

#Region "変数定義"
    ''' <summary>
    ''' インスタンス
    ''' </summary>
    ''' <remarks></remarks>
    Private Shared instanceList() As CodeConverterToHtml = _
        New CodeConverterToHtml() { _
            New VbCodeConverterToHtml(), _
            New CSharpCodeConverterToHtml() _
        }

#End Region

#Region "コンストラクタ"
    ''' <summary>
    ''' コンストラクタ
    ''' </summary>
    ''' <remarks></remarks>
    Protected Sub New()

    End Sub

#End Region

#Region "インスタンスを取得"
    ''' <summary>
    ''' インスタンスを取得
    ''' </summary>
    ''' <param name="type">言語の種類</param>
    ''' <returns>インスタンス</returns>
    ''' <remarks></remarks>
    Public Shared Function GetInstance( _
        ByVal type As ProgLangType) As CodeConverterToHtml

        Return instanceList(type)
    End Function
#End Region

#Region "ソースコードをHTMLに変換する。"
    ''' <summary>
    ''' ソースコードをHTMLに変換する。
    ''' </summary>
    ''' <param name="src">ソースコード</param>
    ''' <returns>HTML</returns>
    ''' <remarks></remarks>
    Public Function ConvertCodeToHtml(ByVal src As StringAs String
        Return Me.ConvertCodeToHtml(src, Me.GetDefaultTitle())
    End Function

    ''' <summary>
    ''' ソースコードをHTMLに変換する。
    ''' </summary>
    ''' <param name="src">ソースコード</param>
    ''' <param name="title">タイトル</param>
    ''' <returns>HTML</returns>
    ''' <remarks></remarks>
    Public Function ConvertCodeToHtml( _
        ByVal src As StringByVal title As StringAs String

        Dim wkSrcList() As String = Nothing

        'ソースコードを行単位に分割する。
        '(vbCrLf, vbLf, vbCr毎)
        wkSrcList = src.Split( _
            New String() {vbCrLf, vbLf, vbCr}, _
            StringSplitOptions.None)

        '先頭の空白文字数を取得
        Dim cntIndent As Integer = _
            Me.GetHeadSpaceCount(wkSrcList)

        '先頭の空白文字を削除
        Me.RemoveStringList(wkSrcList, cntIndent)

        'HTMLエンコード
        Me.HtmlEncode(wkSrcList)

        Dim regEx As Regex = Me.GetRegEx()
        Dim regMatchEvaluator As _
            New MatchEvaluator(AddressOf Me.MatchEvaluator)

        'キーワードにタグを付加
        For i As Integer = 0 To wkSrcList.Length - 1
            wkSrcList(i) = wkSrcList(i).Replace( _
                    " ""&nbsp;")
            wkSrcList(i) = regEx.Replace( _
                    wkSrcList(i), regMatchEvaluator)
        Next

        Dim wkStr As String

        wkStr = String.Join(vbCrLf, wkSrcList)
        wkStr = wkStr.Replace(vbCrLf, "<br/>" & vbCrLf)

        Dim wkStrTable As String = Nothing

        wkStrTable = TABLE_STRING.Replace( _
            "@@@TITLE@@@", title)
        wkStrTable = wkStrTable.Replace( _
            "@@@BGCOLOR@@@"Me.GetBackColor())
        wkStrTable = wkStrTable.Replace( _
            "@@@FORECOLOR@@@"Me.GetForeColor())
        wkStrTable = wkStrTable.Replace( _
            "@@@TITLEBGCOLOR@@@"Me.GetTitleBackColor())
        wkStr = wkStrTable.Replace("@@@CODE@@@", wkStr)


        Return wkStr
    End Function

#Region "ヘルパーメソッド"
    ''' <summary>
    ''' HTMLにエンコードする
    ''' </summary>
    ''' <param name="srcLineList">ソース</param>
    ''' <returns>ソース(HTMLエンコード済)</returns>
    ''' <remarks></remarks>
    Private Function HtmlEncode(ByVal srcLineList() As StringAs String()

        For i As Integer = 0 To srcLineList.Length - 1
            srcLineList(i) = System.Web.HttpUtility.HtmlEncode(srcLineList(i))
        Next

        Return srcLineList

    End Function

    ''' <summary>
    ''' インデントの桁数を取得。
    ''' </summary>
    ''' <param name="srcLineList">ソース</param>
    ''' <returns>インデントの桁数</returns>
    ''' <remarks></remarks>
    Private Function GetHeadSpaceCount( _
        ByVal srcLineList() As StringAs Integer

        Const CHR_BLANK As Char = " "c
        Return Me.GetHeadSpaceCount(srcLineList, CHR_BLANK)
    End Function

    ''' <summary>
    ''' インデントの桁数を取得。
    ''' </summary>
    ''' <param name="srcLineList">ソース</param>
    ''' <param name="indentChar">インデントの文字</param>
    ''' <returns>インデントの桁数</returns>
    ''' <remarks></remarks>
    Private Function GetHeadSpaceCount( _
        ByVal srcLineList() As String, _
        ByVal indentChar As CharAs Integer

        Dim cntIndent As Integer = Int32.MaxValue

        If srcLineList.Length = 0 Then
            Return 0
        End If

        For Each wkSrc As String In srcLineList

            For i As Integer = 0 To wkSrc.Length - 1

                If wkSrc.Trim() = "" Then
                    Exit For
                End If

                If i >= cntIndent Then
                    Exit For
                End If

                If wkSrc(i) = indentChar.ToString() Then

                Else
                    cntIndent = Math.Min(i, cntIndent)
                    Exit For
                End If
            Next
        Next

        If cntIndent = Int32.MaxValue Then
            Return 0
        End If

        Return cntIndent

    End Function

    ''' <summary>
    ''' 各行からインデントを除去する。
    ''' </summary>
    ''' <param name="srcLineList">ソース</param>
    ''' <param name="cnt">インデントの桁数</param>
    ''' <returns>処理結果</returns>
    ''' <remarks></remarks>
    Private Function RemoveStringList( _
        ByVal srcLineList() As String, _
        ByVal cnt As IntegerAs Boolean

        If cnt = 0 Then
            Return True
        End If

        For i As Integer = 0 To srcLineList.Length - 1
            If srcLineList(i).Trim() = "" Then
                Continue For
            End If
            srcLineList(i) = srcLineList(i).Substring(cnt)
        Next

        Return True

    End Function
#End Region

#End Region

#Region "変換対象の文字列を検索する正規表現を取得する。"
    ''' <summary>
    ''' 変換対象の文字列を検索する正規表現を取得する。
    ''' </summary>
    ''' <returns>正規表現</returns>
    ''' <remarks></remarks>
    Protected MustOverride Function GetRegEx() As Regex
#End Region

#Region "正規表現の検索結果を編集する。"
    ''' <summary>
    ''' 正規表現の検索結果を編集する。
    ''' </summary>
    ''' <param name="match">検索結果</param>
    ''' <returns>編集結果</returns>
    ''' <remarks></remarks>
    Protected MustOverride Function MatchEvaluator( _
        ByVal match As Match) As String
#End Region

#Region "予約語一覧を取得する。"
    ''' <summary>
    ''' 予約語一覧を取得する。
    ''' </summary>
    ''' <returns>予約語一覧</returns>
    ''' <remarks></remarks>
    Public MustOverride Function GetReservedWords() As String()
#End Region

#Region "タイトルを取得"
    ''' <summary>
    ''' タイトルを取得
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public MustOverride Function GetDefaultTitle() As String
#End Region

#Region "タイトルを取得"
    ''' <summary>
    ''' 前景色(タイトル)を取得
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public MustOverride Function GetTitleBackColor() As String
#End Region

#Region "背景色を取得"
    ''' <summary>
    ''' 背景色を取得
    ''' </summary>
    ''' <returns>背景色</returns>
    ''' <remarks></remarks>
    Public MustOverride Function GetBackColor() As String
#End Region

#Region "前景色を取得"
    ''' <summary>
    ''' 前景色を取得
    ''' </summary>
    ''' <returns>前景色</returns>
    ''' <remarks></remarks>
    Public MustOverride Function GetForeColor() As String
#End Region


End Class

[VB.NET]CodeConverterToHtml


[プログラムソース]
Imports System.Text.RegularExpressions
''' <summary>
''' 変換(C#ソースコード→HTML)
''' </summary>
''' <remarks></remarks>
Public Class CSharpCodeConverterToHtml
    Inherits CodeConverterToHtml

#Region "定数定義"
    ''' <summary>
    ''' 背景色
    ''' </summary>
    ''' <remarks></remarks>
    Private Const BACK_COLOR As String = "#FFFFE0"

    ''' <summary>
    ''' 背景色(タイトル)
    ''' </summary>
    ''' <remarks></remarks>
    Private Const BACK_COLOR_TITLE As String = "#66CCCC"

    ''' <summary>
    ''' 前景色
    ''' </summary>
    ''' <remarks></remarks>
    Private Const FORE_COLOR As String = "#000000"

    ''' <summary>
    ''' 前景色(コメント)
    ''' </summary>
    ''' <remarks></remarks>
    Private Const FORE_COLOR_COMMENT As String = "#008040"

    ''' <summary>
    ''' 前景色(文字列)
    ''' </summary>
    ''' <remarks></remarks>
    Private Const FORE_COLOR_STRING As String = "#FF0000"

    ''' <summary>
    ''' 前景色(予約語)
    ''' </summary>
    ''' <remarks></remarks>
    Private Const FORE_COLOR_RESERVED_WORD As String = "#0000FF"
#End Region

#Region "変数定義"
    ''' <summary>
    ''' 正規表現
    ''' </summary>
    ''' <remarks></remarks>
    Private m_RegEx As Regex = Nothing

    ''' <summary>
    ''' 予約語一覧
    ''' </summary>
    ''' <remarks></remarks>
    Private m_ReservedWords As New List(Of String)
#End Region

#Region "コンストラクタ"
    ''' <summary>
    ''' コンストラクタ
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New()

    End Sub
#End Region

#Region "変換対象の文字列を検索する正規表現を取得する。"
    ''' <summary>
    ''' 変換対象の文字列を検索する正規表現を取得する。
    ''' </summary>
    ''' <returns>正規表現</returns>
    ''' <remarks></remarks>
    Protected Overrides Function GetRegEx() As Regex
        If Not (Me.m_RegEx Is NothingThen
            Return Me.m_RegEx
        End If

        Dim strPatternAll As String = Nothing
        '正規表現パターン
        '※コメント判別
        '(先頭開始、0個以上の「&nbsp;」、1個以上の「//」、0個以上の任意文字)
        Dim strPattern1 As String = "^(&nbsp;)*(//)+.*"
        '※コメント判別
        '(先頭開始、0個以上の空白、1個以上の「//」、0個以上の任意文字)
        Dim strPattern2 As String = "^\s*(//)+.*"
        '※文字列判別
        '(「"」開始、0個以上の任意文字、最も手前の「"」終了)
        Dim strPattern3 As String = """.*?"""
        '※文字列判別
        '(「&quot;」開始、0個以上の任意文字、最も手前の「&quot;」終了)
        Dim strPattern4 As String = "&quot;.*?&quot;"
        '※予約語判別
        '(単語単位で予約語の何れかと同じ)
        Dim wkStr As String = String.Join("|"Me.GetReservedWords())
        Dim strPattern5 As String = "\b(" & wkStr & ")\b"

        strPatternAll = _
                    strPattern1 & "|" & strPattern2 & "|" & _
                    strPattern3 & "|" & strPattern4 & "|" & _
                    strPattern5

        Me.m_RegEx = New Regex(strPatternAll)

        Return Me.m_RegEx
    End Function
#End Region

#Region "正規表現の検索結果を編集する。"
    ''' <summary>
    ''' 正規表現の検索結果を編集する。
    ''' </summary>
    ''' <param name="match">検索結果</param>
    ''' <returns>編集結果</returns>
    ''' <remarks></remarks>
    Protected Overrides Function MatchEvaluator(ByVal match As Match) As String
        If match.Value.Replace("&nbsp;""").StartsWith("//"OrElse _
            match.Value.Trim().StartsWith("//"Then
            'コメントの場合            
            Dim wk1 As Integer = match.Value.IndexOf("//")
            If wk1 = 0 Then
                Return String.Format( _
                    "<font color='{0}'>{1}</font>", _
                    FORE_COLOR_COMMENT, _
                    match.Value.Substring(wk1))
            End If
            Return match.Value.Substring(0, wk1) & _
                    String.Format( _
                    "<font color='{0}'>{1}</font>", _
                    FORE_COLOR_COMMENT, _
                    match.Value.Substring(wk1))
        End If

        If (match.Value.StartsWith("&quot;"AndAlso _
            match.Value.EndsWith("&quot;")) OrElse _
           (match.Value.StartsWith(""""AndAlso _
            match.Value.EndsWith("""")) Then
            '文字列の場合            
            Return String.Format( _
                "<font color='{0}'>{1}</font>", _
                FORE_COLOR_STRING, _
                match.Value)
        End If

        '予約語の場合
        Return String.Format( _
            "<font color='{0}'>{1}</font>", _
            FORE_COLOR_RESERVED_WORD, _
            match.Value)
    End Function
#End Region

#Region "予約語一覧を取得する。"
    ''' <summary>
    ''' 予約語一覧を取得する。
    ''' </summary>
    ''' <returns>予約語一覧</returns>
    ''' <remarks></remarks>
    Public Overrides Function GetReservedWords() As String()
        If Me.m_ReservedWords.Count > 0 Then
            Return Me.m_ReservedWords.ToArray()
        End If

        With Me.m_ReservedWords

            .AddRange(New String() {"abstract""as""base""bool""break"})
            .AddRange(New String() {"byte""case""catch""char""checked"})
            .AddRange(New String() {"class""const""continue""decimal""decimal"})
            .AddRange(New String() {"default""delegate""do""double""else"})
            .AddRange(New String() {"enum""event""explicit""extern""false"})
            .AddRange(New String() {"finally""fixed""float""for""foreach"})
            .AddRange(New String() {"from""get""goto""group""if"})
            .AddRange(New String() {"implicit""in""int""interface""internal"})
            .AddRange(New String() {"into""is""join""let""lock"})
            .AddRange(New String() {"long""namespace""new""null""object"})
            .AddRange(New String() {"operator""orderby""out""override""params"})
            .AddRange(New String() {"partial""private""protected""public""readonly"})
            .AddRange(New String() {"ref""return""sbyte""sealed""select"})
            .AddRange(New String() {"set""short""sizeof""stackalloc""static"})
            .AddRange(New String() {"string""struct""switch""this""throw"})
            .AddRange(New String() {"true""try""typeof""uint""ulong"})
            .AddRange(New String() {"unchecked""unsafe""ushort""using""value"})
            .AddRange(New String() {"virtual""void""volatile""where""while"})
            .AddRange(New String() {"yield"})

        End With

        Return Me.m_ReservedWords.ToArray()

    End Function
#End Region

#Region "タイトルを取得"
    ''' <summary>
    ''' タイトルを取得
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Function GetDefaultTitle() As String
        Return "C#"
    End Function
#End Region

#Region "背景色(タイトル)を取得"
    ''' <summary>
    ''' 背景色(タイトル)を取得
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Function GetTitleBackColor() As String
        Return BACK_COLOR_TITLE
    End Function
#End Region

#Region "背景色を取得"
    ''' <summary>
    ''' 背景色を取得
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Function GetBackColor() As String
        Return BACK_COLOR
    End Function
#End Region

#Region "前景色を取得"
    ''' <summary>
    ''' 前景色を取得
    ''' </summary>
    ''' <returns>前景色</returns>
    ''' <remarks></remarks>
    Public Overrides Function GetForeColor() As String
        Return FORE_COLOR
    End Function
#End Region

End Class
[VB.NET]CSharpCodeConverterToHtml.vb


[プログラムソース]
Imports System.Text.RegularExpressions
''' <summary>
''' 変換(SQLServerコード→HTML)
''' </summary>
''' <remarks></remarks>
Public Class SqlServerCodeConverterToHtml
    Inherits CodeConverterToHtml

#Region "定数定義"
    ''' <summary>
    ''' 背景色
    ''' </summary>
    ''' <remarks></remarks>
    Private Const BACK_COLOR As String = "#FFFFE0"

    ''' <summary>
    ''' 背景色(タイトル)
    ''' </summary>
    ''' <remarks></remarks>
    Private Const BACK_COLOR_TITLE As String = "#66CCCC"

    ''' <summary>
    ''' 前景色
    ''' </summary>
    ''' <remarks></remarks>
    Private Const FORE_COLOR As String = "#000000"

    ''' <summary>
    ''' 前景色(コメント)
    ''' </summary>
    ''' <remarks></remarks>
    Private Const FORE_COLOR_COMMENT As String = "#008040"

    ''' <summary>
    ''' 前景色(文字列)
    ''' </summary>
    ''' <remarks></remarks>
    Private Const FORE_COLOR_STRING As String = "#FF0000"

    ''' <summary>
    ''' 前景色(予約語)
    ''' </summary>
    ''' <remarks></remarks>
    Private Const FORE_COLOR_RESERVED_WORD As String = "#0000FF"
#End Region

#Region "変数定義"
    ''' <summary>
    ''' 正規表現
    ''' </summary>
    ''' <remarks></remarks>
    Private m_RegEx As Regex = Nothing

    ''' <summary>
    ''' 予約語一覧
    ''' </summary>
    ''' <remarks></remarks>
    Private m_ReservedWords As New List(Of String)
#End Region

#Region "コンストラクタ"
    ''' <summary>
    ''' コンストラクタ
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New()

    End Sub
#End Region

#Region "変換対象の文字列を検索する正規表現を取得する。"
    ''' <summary>
    ''' 変換対象の文字列を検索する正規表現を取得する。
    ''' </summary>
    ''' <returns>正規表現</returns>
    ''' <remarks></remarks>
    Protected Overrides Function GetRegEx() As Regex
        If Not (Me.m_RegEx Is NothingThen
            Return Me.m_RegEx
        End If

        Dim strPatternAll As String = Nothing
        '正規表現パターン
        '※コメント判別
        '(先頭開始、0個以上の「&nbsp;」、1個以上の「--」、0個以上の任意文字)
        Dim strPattern1 As String = "^(&nbsp;)*(--)+.*"
        '※コメント判別
        '(先頭開始、0個以上の空白、1個以上の「--」、0個以上の任意文字)
        Dim strPattern2 As String = "^\s*(--)+.*"
        '※文字列判別
        '(「'」開始、0個以上の任意文字、最も手前の「'」終了)
        Dim strPattern3 As String = "'.*?'"
        '※予約語判別
        '(単語単位で予約語の何れかと同じ)
        Dim wkStr As String = String.Join("|"Me.GetReservedWords())
        Dim strPattern4 As String = "\b(" & wkStr & ")\b"

        strPatternAll = _
                    strPattern1 & "|" & strPattern2 & "|" & _
                    strPattern3 & "|" & strPattern4 

        Me.m_RegEx = New Regex(strPatternAll, RegexOptions.IgnoreCase)

        Return Me.m_RegEx
    End Function
#End Region

#Region "正規表現の検索結果を編集する。"
    ''' <summary>
    ''' 正規表現の検索結果を編集する。
    ''' </summary>
    ''' <param name="match">検索結果</param>
    ''' <returns>編集結果</returns>
    ''' <remarks></remarks>
    Protected Overrides Function MatchEvaluator(ByVal match As Match) As String
        If match.Value.Replace("&nbsp;""").StartsWith("--"OrElse _
            match.Value.Trim().StartsWith("--"Then
            'コメントの場合            
            Dim wk1 As Integer = match.Value.IndexOf("--")
            If wk1 = 0 Then
                Return String.Format( _
                    "<font color='{0}'>{1}</font>", _
                    FORE_COLOR_COMMENT, _
                    match.Value.Substring(wk1))
            End If
            Return match.Value.Substring(0, wk1) & _
                    String.Format( _
                    "<font color='{0}'>{1}</font>", _
                    FORE_COLOR_COMMENT, _
                    match.Value.Substring(wk1))
        End If

        If match.Value.StartsWith("'"AndAlso _
            match.Value.EndsWith("'"Then
            '文字列の場合            
            Return String.Format( _
                "<font color='{0}'>{1}</font>", _
                FORE_COLOR_STRING, _
                match.Value)
        End If

        '予約語の場合
        Return String.Format( _
            "<font color='{0}'>{1}</font>", _
            FORE_COLOR_RESERVED_WORD, _
            match.Value)
    End Function
#End Region

#Region "予約語一覧を取得する。"
    ''' <summary>
    ''' 予約語一覧を取得する。
    ''' </summary>
    ''' <returns>予約語一覧</returns>
    ''' <remarks></remarks>
    Public Overrides Function GetReservedWords() As String()
        If Me.m_ReservedWords.Count > 0 Then
            Return Me.m_ReservedWords.ToArray()
        End If

        With Me.m_ReservedWords

            .AddRange(New String() {"ADD""ALL""ALTER""AND""ANY"})
            .AddRange(New String() {"AS""ASC""AUTHORIZATION""BACKUP""BEGIN"})
            .AddRange(New String() {"BETWEEN""BREAK""BROWSE""BULK""BY"})
            .AddRange(New String() {"CASCADE""CASE""CHECK""CHECKPOINT""CLOSE"})
            .AddRange(New String() {"CLUSTERED""COALESCE""COLLATE""COLUMN""COMMIT"})
            .AddRange(New String() {"COMPUTE""CONSTRAINT""CONTAINS""CONTAINSTABLE""CONTINUE"})
            .AddRange(New String() {"CONVERT""CREATE""CROSS""CURRENT""CURRENT_DATE"})
            .AddRange(New String() {"CURRENT_TIME""CURRENT_TIMESTAMP""CURRENT_USER""CURSOR""DATABASE"})
            .AddRange(New String() {"DBCC""DEALLOCATE""DECLARE""DEFAULT""DELETE"})
            .AddRange(New String() {"DENY""DESC""DISK""DISTINCT""DISTRIBUTED"})
            .AddRange(New String() {"DOUBLE""DROP""DUMP""ELSE""END"})
            .AddRange(New String() {"ERRLVL""ESCAPE""EXCEPT""EXEC""EXECUTE"})
            .AddRange(New String() {"EXISTS""EXIT""EXTERNAL""FETCH""FILE"})
            .AddRange(New String() {"FILLFACTOR""FOR""FOREIGN""FREETEXT""FREETEXTTABLE"})
            .AddRange(New String() {"FROM""FULL""FUNCTION""GOTO""GRANT"})
            .AddRange(New String() {"GROUP""HAVING""HOLDLOCK""IDENTITY""IDENTITY_INSERT"})
            .AddRange(New String() {"IDENTITYCOL""IF""IN""INDEX""INNER"})
            .AddRange(New String() {"INSERT""INTERSECT""INTO""IS""JOIN"})
            .AddRange(New String() {"KEY""KILL""LEFT""LIKE""LINENO"})
            .AddRange(New String() {"LOAD""MERGE""NATIONAL""NOCHECK""NONCLUSTERED"})
            .AddRange(New String() {"NOT""NULL""NULLIF""OF""OFF"})
            .AddRange(New String() {"OFFSETS""ON""OPEN""OPENDATASOURCE""OPENQUERY"})
            .AddRange(New String() {"OPENROWSET""OPENXML""OPTION""OR""ORDER"})
            .AddRange(New String() {"OUTER""OVER""PERCENT""PIVOT""PLAN"})
            .AddRange(New String() {"PRECISION""PRIMARY""PRINT""PROC""PROCEDURE"})
            .AddRange(New String() {"PUBLIC""RAISERROR""READ""READTEXT""RECONFIGURE"})
            .AddRange(New String() {"REFERENCES""REPLICATION""RESTORE""RESTRICT""RETURN"})
            .AddRange(New String() {"REVERT""REVOKE""RIGHT""ROLLBACK""ROWCOUNT"})
            .AddRange(New String() {"ROWGUIDCOL""RULE""SAVE""SCHEMA""SECURITYAUDIT"})
            .AddRange(New String() {"SELECT""SEMANTICKEYPHRASETABLE""SEMANTICSIMILARITYDETAILSTABLE"})
            .AddRange(New String() {"SEMANTICSIMILARITYTABLE""SESSION_USER"})
            .AddRange(New String() {"SET""SETUSER""SHUTDOWN""SOME"})
            .AddRange(New String() {"STATISTICS""SYSTEM_USER""TABLE"})
            .AddRange(New String() {"TABLESAMPLE""TEXTSIZE""THEN"})
            .AddRange(New String() {"TO""TOP""TRAN"})
            .AddRange(New String() {"TRANSACTION""TRIGGER""TRUNCATE"})
            .AddRange(New String() {"TRY_CONVERT""TSEQUAL""UNION"})
            .AddRange(New String() {"UNIQUE""UNPIVOT""UPDATE"})
            .AddRange(New String() {"UPDATETEXT""USE""USER"})
            .AddRange(New String() {"VALUES""VARYING""VIEW"})
            .AddRange(New String() {"WAITFOR""WHEN""WHERE"})
            .AddRange(New String() {"WHILE""WITH""WITHINGROUP""WRITETEXT"})

        End With

        Return Me.m_ReservedWords.ToArray()

    End Function
#End Region

#Region "タイトルを取得"
    ''' <summary>
    ''' タイトルを取得
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Function GetDefaultTitle() As String
        Return "SQLServer"
    End Function
#End Region

#Region "背景色(タイトル)を取得"
    ''' <summary>
    ''' 背景色(タイトル)を取得
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Function GetTitleBackColor() As String
        Return BACK_COLOR_TITLE
    End Function
#End Region

#Region "背景色を取得"
    ''' <summary>
    ''' 背景色を取得
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Function GetBackColor() As String
        Return BACK_COLOR
    End Function
#End Region

#Region "前景色を取得"
    ''' <summary>
    ''' 前景色を取得
    ''' </summary>
    ''' <returns>前景色</returns>
    ''' <remarks></remarks>
    Public Overrides Function GetForeColor() As String
        Return FORE_COLOR
    End Function
#End Region

End Class
[VB.NET]SqlServerCodeConverterToHtml

[雑記]ドローン(DJI Mini 3)

(1)雑記 もともと多趣味の友人 masakazu Drone 氏が、 最近、 ドローン にハマり始めて、 更に、新たな趣味が増えたとのこと。 ドローン を始めてから、 まだ1年も経っていないとのことですが、 旅行先で山や川の景色を 空撮 して、 Youtube ...