【C#】yieldキーワード

yieldキーワード

C#2.0で追加されたIEnumerableまたはIEnumeratorをより直感的に作成できる仕組み。
yield return文
以下のように使用する。

yield return expression; // expressionにはイテレータの要素を指定
yield return文の評価タイミングはコルーチンであるため、コンピュータが実行状態を保存後に停止させ、次に使用するときに即座に停止直前の状態に復帰する(レジューム)。
このため、yield returnが呼び出されると、その時点でメソッドは処理を中断し、制御を返す。
このとき、オブジェクトのMoveNext()に対してyield returnの内容が割り当てられる。
そして、MoveNext()が実行されるたびに、前回のyield return文からブロックが再開される。
以下のコードで、*の箇所にブレークポイントを設定し、デバッグすると動作が分かりやすい。

private static void CreateFruits()
{
    var fruits = CreateFruits(1000);// ①
    foreach (var fruit in fruits)
    {
        System.Console.WriteLine(fruit.Name + ":" + fruit.Price);
    }
}

private static IEnumerable<Fruit> CreateFruits(int number)
{// *1
    for (int i = 0; i < number; ++i)
    {
        yield retun new Fruit("Name", price); // *2
    }
}
①の呼び出しにより*1に移動する。その後、foreachのたびに*2に移動する。
yield break文
yield break文は、この文が実行された時点で、要素の終了を強制する。
つまり、yield break文はMoveNext()メソッドの戻り値をfalseにする。

【C#】IEnumerable

IEnumerableインタフェース

非ジェネリックコレクション(System.Collections)に対する単純な反復処理をサポートする列挙子を公開する。
IEnumeratorインタフェースを返す抽象メソッドGetEnumerator()を持つ。

IEnumeratorインタフェース

反復処理をサポートする、状況に応じて配列を動的に制御するインタフェース。
以下の関数とプロパティを持つ。
bool MoveNext() イテレータを次に進ませる
void Reset() イテレータを初期位置に戻す
void Dispose() アンマネージリソースの解放
object Current 現在のイテレータ
代表的な反復処理:foreach文
コレクションのすべての要素を一回ずつ読み出すことが出来る

foreach (T 変数 in コレクション)
{
    処理;
}
上記は糖衣構文で、コンパイラによって以下のように展開される。

try
{
    IEnumerator e = array.GetEnumerator();
    while(e.MoveNext()){
        T 変数名 = (T)e.Current;
        処理;
    }
}
finally
{
    Dispose処理;
}

【IT】ダンプ(dump)

ダンプ(dump)

加工しないで出力することで、特に未加工で出力する点が、出力と異なる。
コンピュータの記憶装置(メモリやストレージなど)に記録された内容をまとめて表示、印刷、記録などすることや、そのようにして写しとられた内容をダンプという。
メモリの内容をファイル等に出力することをメモリダンプ
データベースの内容をファイル等に出力することをDBダンプ
という。

正規表現

正規表現とは

正規表現(Regular Expression)とは、”文字の組み合わせ”を表現する記法の1つで、正規表現が多く用いられる場面は文字列に対してパターン(正規表現)マッチングである。
例えば、毎年リリースされるiPhoneシリーズについて考える。一般的にiPhoneシリーズは「iPhone バージョン」で表されるが「iPhone 4S」や「iPhone X」など規則性が崩れることがある。 ここで、「iPhone NN Pro」(Nは整数)をデータから探すことを考える。このとき、データ入力者によっては”i”と”Phone”の後に半角スペースや全角スペースを入れる場合や”phone”の様に入力する場合もあり表記揺れが発生するかもしれない。 このとき有用になるのが正規表現を用いたパターンマッチングである。

iPhone NN Proを探す

はじめに正規表現を用いてiPhone NN Proのデータを探すためには、表記揺れの許容範囲をする定義する必要がある。今回は、以下のように定義する。
  • “i”と”Phone”の間には「0または1」の「半角スペースまたは全角スペース」を許容する
  • 「“Phone”または”phone”」を許容する
  • “Phone”と”NN”の間には「0または1」の「半角スペースまたは全角スペース」を許容する
  • “Pro Max”シリーズは含まない

メタ文字

正規表現におけるメタ文字とは、特殊な意味や機能をもつ文字のことで、「0または1」等を表現することが出来ます。以下に代表的なメタ文字を記載する。
量化
量化子を置くことによって、直前の表現の出現回数を指定することが出来る。
メタ文字 意味
? 直前の表現が0or1
* 直前の表現が0以上
+ 直前の表現が1以上
{n,m} 直前の表現がn以上、m以下
選言
“|”は選言と解釈され、”|”の直前の表現と直後の表現どちらかをパターンとして指定することができる。
グループ分け
“()”はサブパターンと解釈され、括弧で囲まれたパターンをグループとして指定することが出来る。
位置の指定
位置を表すメタ文字を置くことによって、パターンのマッチングを開始する位置を指定することが出来る。
メタ文字 意味
^ 行頭の位置
$ 行末の位置
定義済みの正規表現
“エスケープシーケンス+文字”で定義済みの正規表現を指定することが出来る。
メタ文字 意味
\t タブ
\r 改行(Carriage Return)
\n 改行(Line Feed)
\d すべての数字
\D すべての数字以外の文字
\s 垂直タブ以外のすべての空白文字
\S すべての非空白文字
\w アルファベット、アンダーバー、数字
\W アルファベット、アンダーバー、数字
任意の1文字にマッチ
“.”は、任意の1文字にマッチするように指定できる
指定した文字のどれか
“[]”は文字クラスと呼ばれ、括弧で囲まれたもののいずれかの一文字をパターンとして指定することが出来る。例えば、[a-zA-Z]はアルファベットのいずれか一文字をパターンとして指定している。

先読みと後読み

イメージ的に位置の指定に近い。先読みや後読みと日本語だと少し混乱するが、英語のlook ahead(先読み)とlook behind(後読み)と考えると分かり易い。以下の4パターン存在する。
肯定の先読み
(?=pattern)で指定し、肯定の先読みの前(ahead)のパターンがマッチした後にpatternがマッチすることを調べる。
否定の先読み
(?!pattern)で指定し、否定の先読みの前(ahead)のパターンがマッチした後にpatternがマッチしないことを調べる。
肯定の後読み
(?<=pattern)で指定し、肯定の後読みの後(behind)のパターンがマッチした後にpatternがマッチすることを調べる。
否定の後読み
(?<!pattern)で指定し、否定の後読みの後(behind)のパターンがマッチした後にpatternがマッチすることを調べる。

iPhone NN Proの正規表現を定義する

“i”と”Phone”の間には「0または1」の「半角スペースまたは全角スペース」を許容する
「0または1」は出現回数なので、”?”で表現できる。「半角スペースまたは全角スペース」は( | )で表現できる。このため、ここでの正規表現は”i( | )?Phone”になる。
「“Phone”または”phone”」を許容する
単純に考えると先ほどと同様に(Phone|phone)になりそうだが、”hone”は共通なので、(P|p)honeで表現できる。このため、前の正規表現と合わせると”i( | )?(P|p)hone”になる。
“Phone”と”NN”の間には「0または1」の「半角スペースまたは全角スペース」を許容する。
ここで新しく必要となるのが、”NN”の2桁の数字。数字が2回出現するので、”[\d]{2,2}”となる。ここまでのを合わせると”i( | )?(P|p)hone( | )?[\d]{2,2}”となる。
“Pro Max”シリーズは含まない
“Pro Max”を考えるとProがマッチした後に、Maxがマッチしなければ良い。このため、否定の先読みを使用すればよい。つまり、”Pro( | )(?!Max)”で表現できる。
以上より、”iPhone NN Pro”の正規表現は”i( | )?(P|p)hone( | )?[\d]{2,2}( | )?Pro( | )?(?!Max)”となる。

C#コード例


    class IPhoneSeries
    {
        private static readonly Regex NNPRo = new Regex("i( | )?(P|p)hone( | )?[\\d]{2,2}( | )?Pro( | )?(?!Max)", RegexOptions.Compiled);

        internal static bool IsNNPro(string iphone)
        {
            var match = NNPRo.Match(iphone);
            return match.Length == iphone.Length;
        }
    }

【Java】エラーと例外

Javaのエラーと例外

Javaのエラー(Error)や例外(Exception)は全てThrowableクラス配下にある。
Javaには他言語と異なりException配下に2つの系統があり、Runtime Exception(非検査例外)とその他(検査例外)がある。

Error

文字通りのエラーで、メモリのオーバーフローなど、プログラムではどうすることも出来ない
このため、catchしても意味がない
  • StackOverflowError
  • OutOfMemoryError
  • ClassFormatError

非検査例外

プログラムが正しく書かれていれば回避することの出来る問題
このため、try-catchは強要されない。
  • NullPointerException
  • ArrayindexOutOfBoundsException

検査例外

プログラムが正しく書かれていても回避することの出来ない問題
このため、try-catchが強要される。
  • IOException
  • SQLException

【MicroSoft Office】パスワード

ファイルのパスワード

Office製品のファイルExcel、Word、Power Pointはxmlをひとまとめにしたもので、拡張子をzipに変更して解凍するとxmlの内部を見ることが出来る。
パスワードをかけた場合の挙動を確かめる。
書き込み 読み取り 書き込み・読み取り
zipに変更できる zipに変更できない zipに変更できない
つまり、書き込みパスワードが設定されている場合でも、zip⇒解凍で対象のxmlファイルを編集することによって、書き込みすることが出来る。
読み取りパスワードが設定されている場合は通常のOffice Open XML形式ではなく、バイナリ形式になっている。

Excelの保護

Excelでは、上記以外に以下の保護が可能
  1. ブックの保護_パスワードを使用して暗号化
  2. ブックの保護_ブック構成の保護
  3. ブックの保護_現在のシートの保護
  4. ブックの保護_最終版
1の場合は、ファイルのパスワード同様にzipに変更することは出来ない。

ブックの保護_ブック構成の保護

シートの構成を制限する機能で、シートの移動、削除、追加などの不要な変更を防止することが出来る。
関連する要素は
18.2.29 workbookProtection[p.1590], CT_WorkbookProtection[p.3967, p.3962]
ワークブックのデータ保護を指定する要素。アプリケーションによっては対応しておらず、その場合は無視される。
パスワードがハッシュされてこの要素に格納されている場合は、UTF-16LEでエンコーディングされた文字列から始まる。BOMがある場合はハッシュ値の計算前に除去される。
すべての属性はoptionalである。
属性 詳細
lockRevision ワークブックの改訂をロックするフラグ(default = false)
lockStructure ワークブックの構造をロックするフラグ(default = false)
1またはtrueの場合、ワークブックの構造がロックされ、ワークシートの移動・削除・表示・非表示・名前の変更・新しいワークブックの挿入ができなくなる。
lockWindows ウィンドウのロック情報を表すフラグ(default = false)
1またはtrueの場合、ワークブックのウィンドウが固定されており、ファイルを開いたときはいつも同じサイズと位置で開かれる。
revisionsAlgorithmName revisionsHashValue属性のハッシュ値を計算するために、salt属性と入力パスワードに使用される暗号化ハッシュアルゴリズムが指定されている。
revisionsHashValue リビジョンロックを解除するために保存されているパスワードのハッシュ値が指定されている。
revisionsSaltValue ハッシュ化する際に、一方向性関数の入力に加えられるランダムなデータ
revisionsSpinCount ハッシュ関数の繰り返し回数が指定されている

ブックの保護_現在のシートの保護

指定したシートに対して、操作を制限する機能
関連する要素は
18.3.1.85 sheetProtection[p.1701]、CT_SheetProtection[p.3940,p.3926]
シートに保護が掛かっていることを表す要素。すべての属性はoptional
属性 詳細
algorithmname 暗号化ハッシュアルゴリズムが指定されている
autoFilter 1またはtrueの場合、シートにオートフィルタを指定することはできない
deleteColumns 1またはtrueの場合、列の削除ができない
deleteRows 1またはtrueの場合、行の削除ができない
formatCells 1またはtrueの場合、セルの書式設定ができない
formatColumns 1またはtrueの場合、列の書式設定ができない
formatRows 1またはtrueの場合、行の書式設定ができない
hashValue ワークシートの編集のためのパスワードのハッシュ値
insertColumns 1またはtrueの場合、列の挿入ができない
insertHyperlinks 1またはtrueの場合、ハイパーリンクの挿入ができない
insertRows 1またはtrueの場合、行の挿入ができない
objects 1またはtrueの場合、オブジェクトの編集ができない
pivotTables 1またはtrueの場合、ピボットテーブルの指定ができない
scenarios 1またはtrueの場合、シナリオの編集ができない
selectLockedCells 1またはtrueの場合、セルのロック指定ができない
selectUnlockedCells 1またはtrueの場合、セルのロック解除ができない
sheet 1またはtrueの場合、シートが保護される
sort 1またはtrueの場合、ソートができない
spinCount ハッシュ関数の繰り返し回数が指定されている

ブックの保護_最終版

最終版として設定される。
workbookパーツのrevisionPtr要素
coreパーツのcontentsStatus要素

【Microsoft Word】アカウント情報を消す

作成者と前回保存者

Miscrosoft Word(以下、Word)で文書を作成して、公開することを考えたときに
対象のファイルを右クリック⇒[プロパティ]⇒[詳細]でWordのアカウント情報が"以下の画像のように作成者"と"前回保存者"に表示されてしまうので、削除する方法

f:id:TTKCD:20211023234252p:plain

初期状態

 

 

プロパティから削除

上記の、[プロパティ]-[詳細]の下にある[プロパティや個人情報を削除]をクリックし、以下の画像のように削除する。

f:id:TTKCD:20211023234737p:plain

プロパティから削除

Wordのドキュメント検査から削除

Wordを開いて、[ファイル]-[情報]-[ドキュメント検査]で削除する。

f:id:TTKCD:20211023234946p:plain

ドキュメント検査から削除

XMLから削除

ECMA-376 3rd\ECMA-376, Third Edition, Part 2 - Open Packaging Conventionsのp.48にある通り、 「ファイル名/docProps/core.xml」にある。
  • creator:コンテンツの主な責任者
  • lastModifiedBy:最後の修正を行ったユーザ
を削除する

f:id:TTKCD:20211023235455p:plain

XMLから削除