きな粉もち.net

初級開発者の備忘録[c#]

Excel × VLOOKUP × うまくできない・・・

とても珍しい忘備録となりますが、Excel作業ではまったことについて、残しておきます。

お題は、「VLOOKUP」関数についてです。

VLOOLUPの説明は以下のようになります。

指定した範囲の一列目で特定の値を検索し、指定された列と同じ行にある値を返す関数です。テーブルは、昇順で並べ替えておく必要があります。

関数に指定する内容は以下のようになります。

VLOOKUP(検索値、範囲、列番号、[検索方法])
※検索方法はオプションです。

実際の利用方法は次のようになります。
f:id:kinakomotitti:20180116224717p:plain

上の例では、第三引数の列番号を3として指定しているので、検索範囲の第3列目であるC列の値が表示されています。


・・・と、いう便利な関数で何にはまったのかというと。。。

指定した範囲の一列目で・・・(以下略)

の部分でした。
指定した範囲の一列目・・・
ずっと、指定した範囲の二列目で、検索をかけ、一列目の値をとろうとしていました。
上の例でいうと、次のようなことになります。
f:id:kinakomotitti:20180116225308p:plain

俺の「げんた」がとってこれない!なんで!!!
みたいなことをやっていました・・・

関数の説明に書いてあるのですけどね・・・

まとめ

Excel*1の関数を利用するときは、説明をよく読み、用法を守って正しく利用しましょう。

*1:Excel以外もですがw

log4net × xml 読み込み処理 × その他の種類まとめ

log4netの初期化処理も中盤に入ってきました。

log4netでは、log出力のconfigファイルの読み込みをXmlConfiguratorクラスの中で、XmlReaderと、XmlDocumentを利用して実装しています。

XmlReaderSettings settings = new XmlReaderSettings();

settings.DtdProcessing = DtdProcessing.Ignore;

XmlReader xmlReader = XmlReader.Create(configStream, settings);

// load the data into the document

doc.Load(xmlReader);

 

Xmlの読み込み・・・

これもよく忘れてしまい、そのたびに検索している気がしますw

いい機会なので、どんな実装方法があるか洗い出し、まとめておきたいと思います!

 

ざっとMSDNを見た感じ、今回の調査対象クラスは以下の通りです。

  1. XmlTextReader
  2. XmlReader
  3. XmlDocument
  4. XMLSerializer
  5. XmlValidatingReader
  6. Json.NET 

 

では、順番に見ていきます。

 

1.XmlTextReader

XmlTextReaderは、.NET Framework1.1以降で利用可能なクラスです。

XmlReader, IXmlLineInfo, IXmlNamespaceResolverを継承、実装しているクラスです。

stream,ファイルパス指定など、たくさんのインターフェースを公開しています。

詳しくはここhttps://msdn.microsoft.com/ja-jp/library/1af7xa52(v=vs.110).aspx

 

public static void Main() {

     XmlTextReader reader = null;

     try {

        // Load the reader with the data file and ignore all white space nodes.         
        reader = new XmlTextReader(filename);
        reader.WhitespaceHandling = WhitespaceHandling.None;

        // Parse the file and display each of the nodes.
        while (reader.Read()) {
           switch (reader.NodeType) {
             case XmlNodeType.Element:
               Console.Write("<{0}>", reader.Name);
               break;
             case XmlNodeType.Text:
               Console.Write(reader.Value);
               break;
             case XmlNodeType.CDATA:
               Console.Write("<![CDATA[{0}]]>", reader.Value);
               break;
             case XmlNodeType.ProcessingInstruction:
               Console.Write("<?{0} {1}?>", reader.Name, reader.Value);
               break;
             case XmlNodeType.Comment:
               Console.Write("<!--{0}-->", reader.Value);
               break;
             case XmlNodeType.XmlDeclaration:
               Console.Write("<?xml version='1.0'?>");
               break;
             case XmlNodeType.Document:
               break;
             case XmlNodeType.DocumentType:
               Console.Write("<!DOCTYPE {0} [{1}]", reader.Name, reader.Value);
               break;
             case XmlNodeType.EntityReference:
               Console.Write(reader.Name);
               break;
             case XmlNodeType.EndElement:
               Console.Write("</{0}>", reader.Name);
               break;
           }       
        }           
     }

     finally {
        if (reader!=null)
          reader.Close();
     }

 

Read()メソッドを利用して、Falseが返却されるまで読み込みを続けるとい流れの実装になります。

備考欄には、.NET Framework 2.0 以降では、XmlReaderクラスの利用を推奨と書かれています。
とはいえ、このクラス自体はXmlReaderクラスから派生ているクラスなのでなぜ推奨なのかが気になります。

公式ドキュメントに従い、XmlReaderを利用するのが良いですよね。

 

2.XmlReader

XmlTextReaderクラスの親クラスです。 
IDisposableを実装しています。

XmlTextReaderは、このクラスを継承しているのに、XmlReaderの利用が推奨されています。
メモ欄には、次のように記載されています。

.NET Framework 2.0 では、 XmlReader インスタンスを使用して、 XmlReader.Create の新しい機能を利用する方法です。

新しい機能があるのが理由みたいです。
中の実装を確認していないので想像ですが、XmlTextReaderでは、この機能をラップしているから使えない。そのため親クラスのXmlReaderを利用してくれ。ということなのでしょうか。。。

このクラスも前方方向の読み取りを行うように設計されているで、ループで回しながら必要なデータにアクセスする実装が必要となります。

各値にはプロパティを呼び出すことでアクセスできます。
サンプル実装は以下のようになります。

    XmlReaderSettings settings = new XmlReaderSettings();
    settings.Async = true;

    using (XmlReader reader = XmlReader.Create(stream, settings))
    {
        while (await reader.ReadAsync())
        {
            switch (reader.NodeType)
            {
                case XmlNodeType.Element:
                    Console.WriteLine("Start Element {0}", reader.Name);
                    break;
                case XmlNodeType.Text:
                    Console.WriteLine("Text Node: {0}",
                             await reader.GetValueAsync());
                    break;
                case XmlNodeType.EndElement:
                    Console.WriteLine("End Element {0}", reader.Name);
                    break;
                default:
                    Console.WriteLine("Other node {0} with value {1}",
                                    reader.NodeType, reader.Value);
                    break;
            }
        }
    }
 ||<

** 3.XmlDocument
Xmlの読み込み、編集、追加の操作を可能にするクラスです。
XmlNodeを継承しています。
1.2.と違い、読み込み以外の操作が単独のクラスで利用できるのがこのクラスの特徴です。

 また、検索する方向も、前方だけでなく、必要に応じて後方もサポートされています。

1.2.と比較してのデメリットとしては、検証で利用する XmlReaderSettingsが利用できないというところです。このため、検証を利用するためにはXmlReaderクラスを利用し、XmlReaderSettingsの設定を行い、XmlDocumentのLoadメソッドにそのインスタンスを渡す必要があります。

検証が必要な場面に出くわしていないので、これがどの程度のものなのかわかりませんが、XmlDocumentを利用する時には注意しておきたいです。 

いろいろ書きましたが、XmlDocumemtを使ったシンプルなシナリオは次の通りです。

>|cs|
XmlDocument doc = new XmlDocument();
    doc.LoadXml("<book ISBN='1-861001-57-5'>" +
                "<title>Pride And Prejudice</title>" +
                "<price>19.95</price>" +
                "</book>");

    XmlNode root = doc.FirstChild;

 

4.XmlSerializer

このクラスの説明は以下のようになっていました。

オブジェクトから XML ドキュメントへのシリアル化および XML ドキュメントからオブジェクトへの逆シリアル化を実行します。 XmlSerializer オブジェクトを XMLエンコードする方法を制御することができます。

XmlDocumentを使って、オブェクトに変換したりするときに利用できるクラスのようです。
使ったことが無かったですが、形式が決まったXmlの入出力をするときには、オブェクトに変換してしまってから操作した方が、可読性、保守性はあまり上がりそうですね。

機会があれば積極的に使ってみたいです!


5.XmlValidatingReader

 このクラスは、互換性のために残されているクラスです。

機能としては、XmlReaderSettingsと同じの様ですが、利用することがなさそうなので、無視します。

 

6.Json.NET

OSSJson.NETを利用してXmlを読み込む方法。

Converting between json and xml機能を利用して、xmljsonに変換。
変換後のjsonJson.NETを利用して読み込み。
xmlを変換する前に、結局XmlDocumentを利用する。
変換処理をOSSにたくすことができることがメリットだと思います。
とはいえ、.NETオブジェクトが欲しいだけなら、手数はXmlDocumentより多くなるのがデメリットですね。

 

 

まとめ

結果的に、XmlDocumentで読み取る。が第一選択肢でいいはず!
(使ったことないけど)検証がしたいならXmlRwaderクラスを利用することになるみたいです。
その他は。。。忘れて良いなかなぁ。。。



そして、後半やや雑になってしまったので、後で修正しよう。。。

Daily .NET Tips ✖︎ Visual Studio ✖︎ Diff File Tool

Daily .NET TipsによるVisual StudioのDiff File Toolの紹介ブログのまとめです。


Visual Studioで開発をしている時、二つのファイルの差分を見たい時ってありますよね。
そんな時、Team Foundation Serverなどで構成管理していれば、前のバージョンのソースとの比較ができます。
ただし、これは前のバージョンのソースとの比較で、別のファイルに実装されたコードとの比較はできませんでした。
クラスは違っても、似たような処理をしているといった時に、それらの比較は、構成管理の比較ツールではできません。
そんな時は、win margeなどのtoolを使って差分を見る。などをする必要がありました。


今回紹介するDiff File Toolは、上記のようなときにでも利用できるVisual Studioの差分表示機能となっています。

正直、知らなかったですw


使い方の手順は以下の通りです。

  • Visual Studio Command Windowを開く。
  • コマンド Tools.DiffFiles を入力。
  • 引数に比較したいファイル名を2つ指定。
  • Enterを押下!

実際にやってみた結果は以下の通りです。
インテリセンスが有効になっているので、入力が楽。。。とのことだったのですが、インテリセンスが反応しませんでした...
※ファイル名を指定するときには、インテリセンスが反応した...
f:id:kinakomotitti:20180113203055p:plain

比較結果は以下のようになりました。
f:id:kinakomotitti:20180113203312p:plain


これまでVisual Studioのcommand windowを使ったことがなかったので、こういった機能に気がつかなかったです。。。
他にも便利な機能が隠れているかもしれないので、いろいろ探してみようと思いました!

まとめ

Visual Studioの標準機能で、2つのファイルの差分を見ることができる。


Compare files in Visual Studio IDE using DiffFiles Tool

Daily .NET Tips ✖︎ Visual Studio ✖︎ Color Indicator

Daily .NET Tipsからの記事です。

英語の勉強も兼ねてまとめています。
今回はVisual StudioのColor Indicatorの機能についてです。

Color Indicatorは、コードの変更や、IDEであるVisual Studioの状態を色で可視化してくれる機能です。

コードの変更

コードの変更は、

  • 黄色
  • 緑色
  • 橙色

の3つからなります。

それぞれの意味としては、

  • 黄色

保存されていないコードの変更。

  • 緑色

保存されたコードの変更。

  • 橙色

前回保存したコードと異なる変更。
を示しています。

無色からコードを変更した時、黄色となり、
黄色を保存した時、緑色となり、
緑色を変更した時、黄色となり、
黄色を違うコードに変更して保存した時、橙色となるイメージです。


正直、変更した箇所は覚えているのでこういった色について意識はしてこなかったです。
しかし、Ctrl + zしたとき、どこまで変更が元に戻ったかわからなくなることもあります。

そういう時に、この機能を使えば効率よく変更を見つけられるかなと感じました。


IDEの状態変化

こっちの機能も、あまり意識していませんでしたが、色でIDEの状態を可視化してくれる機能です。

  • 青色

新規プロジェクト作成時

  • 濃い青色

ビルド、クリーンビルド実行時

  • オレンジ

アプリケーション実行時


まぁ、そんな気がしていたよ。という感じですが、それぞれの色にはしっかり意味があったということが分かります。

まとめ

Visual Studioでは、コードの状態、IDEの状態を色で可視化してくれる機能がある!

Color Indicator for Code Changes and Visual Studio IDE Status Change

MSDN × テクニカルドキュメント × APIリファレンス

よく、C#のクラスの使い方がわからないときに「MSDNで検索しろ」と言われます。
これまでは特に意識せず検索していたけど、
最近MSDNで背景のいろを選択できる機能があることを知りました。
f:id:kinakomotitti:20180107010529p:plain

でも、時々色が変えられないページもあって、なんなんだろう・・・と思っていました。
・・・で、よくよくURLを見てみると、2種類のドキュメントがあることがわかりました!

色が変えられるほう
docs.microsoft.com

色が変えられないほう
Learn to Develop with Microsoft Developer Network | MSDN


よく言われるMSDNって、後者の方でいいのだろうか・・・
そもそも、なんで2つの公式ドキュメントがあるのかわかりませんw

自分が見ていた範囲では、書いてある内容に違いはあまりありませんでした。
ただ、Sampleコードが違ったりすることがありました。

まとめ

なんか二つの公式ドキュメントがあるので、
どちらも確認して分かりやすいほうを採用するようにする!   

新年 ✖️ 抱負 ✖️目標

あけましておめでとうございます。

技術的なこと以外は書かないようにしていますが、今年の抱負と目標だけは残しておこうと思います。

 

抱負

抱負と目標ってどうちがうのだろう。。。

まぁ、抱負=一年の計画として認識しておきます。

去年から技術の発信という行動を取り始め、発信するための情報収集やそれらの情報をまとめることの大切さを感じてきました。

ありきたりですが、今年はそれらの精度を上げていこうと思います。

そして、今年の終わり頃には、単なる初学者の防備録から、ほかの技術者の方にとっても有用な情報を発信できる記事にします!

 

目標

1番の目標は、これ!

  • 月15記事。年180記事。貯金制度あり。

 

ブログの更新回数の多さ自体に重きを置いているわけではないですが、この制約が無いと怠けそうなので、敢えて宣言します!

 

細かい目標 その1

記事の内容では、log4netだけではなくほかのOSSの中身も読み進めていき、いろいろなコーディング技術を学びたいと思います。

今考えているのは、以下の通り。

 

細かい目標その2

Dockerにも挑戦してみたいと思います!

何がしたいかとかまだないですが、ずっと気になっていたので、今年挑戦してみて、その記録をブログに残していきたいと思います!

 

細かい目標その3

英語、日本関係なく(←ここ大事w)、コミュニティやフォーラムに参加して、技術力を磨いていこうと思います。

参加した際には、そのまとめをこのブログから発信していきたいと思います!

自己満足としてですがw

 

まとめ

ということで、

 

今年もよろしくお願いします!

String ✖️ 最大文字数 ✖️ Max Length

あまり意識したことがなかったのですが、String型の最大Lengthについて調べてみました。

何から調べれば良いかわからないので、とりあえず公式のStringクラスの説明を見てみました。

String クラス (System)

 

備考欄を一部抜粋。。。

A string is a sequential collection of characters that is used to represent text. A String object is a sequential collection of System.Char objects that represent a string; a System.Char object corresponds to a UTF-16 code unit. The value of the String object is the content of the sequential collection of System.Char objects, and that value is immutable (that is, it is read-only). For more information about the immutability of strings, see the Immutability and the StringBuilder class section later in this topic. The maximum size of a String object in memory is 2GB, or about 1 billion characters.

書いてあるじゃん!

String Objectは2GB、もしくは約10億文字が最大サイズということでした!

 

 

 

•••以上終了かと思いつつも、Stack Over Flowで似たような議論を探してみました。 

https://stack-overflow.com/questions/140468/what-is-the-maximum-possible-length-of-a-net-string

56番目の方がやられていますが、ループで文字を増やして行く処理を実行すると、1億文字を超えたあたりでSystem.OutOfMemoryExceptionが発生するということでした。

公式の情報と、56番の人の情報のどちらが正しいか分かりません。。。

しかし、自分でも試してみたら1億文字以上でエラーになりました!(56番の人と同じ)

よって、1億文字くらいが最大文字数で良いと思いますw

そんな長い文字列を使うことは無いと思いますが、Stringは無制限でないということだけはっきりと認識しておきたいと思いました。

 

まとめ

  • Stringに格納する文字は1億文字までにする!
  • テストデータの作成には、new string(‘繰り返したい文字’,文字列の数)のコンストラクタが便利!