[Doxygen] [Python] Doxygenのxmlファイルからファイル/関数一覧を抽出する

概要

Doxygenで出力したXML(index.xml)からPythonでファイル - 関数の一覧を抽出する。

コード

import xml.etree.ElementTree as ET

def extract_functions(xml_file):
    tree = ET.parse(xml_file)
    root = tree.getroot()

    functions = []

    # Iterate through compound elements (functions, classes, etc.)
    for compound in root.findall(".//compound[@kind='file']"):
        file_name = compound.find("name").text

        # Iterate through member elements (functions, variables, etc.)
        for member in compound.findall(".//member[@kind='function']"):
            function_name = member.find("name").text
            functions.append(f"{file_name}::{function_name}")

    return functions

if __name__ == "__main__":
    # Specify the path to the Doxygen XML output file
    doxygen_xml_file = "path/to/doxygen/xml/output.xml"

    # Extract functions
    function_list = extract_functions(doxygen_xml_file)

    # Print the list of functions
    for function in function_list:
        print(function)

[PowerShell] Windows 10 等でエクスプローラが固まる時の対応(原因がクイックアクセスと予想される場合)

現象

ある日突然windowsエクスプローラ上で右クリックを押下すると固まる現象が起こった。
右クリック以外にもCtrl+Cなどの操作時にも固まる。

原因

Windowsのクイックアクセスにファイルサーバーなどの外部ネットワークにあるフォルダをピン留めしている状態で
該当のIPアドレスやパスが変わってしまい、そのパスが存在しなくなるとエクスプローラが不調になるケースがあるっぽい。

今回は前日にクイックアクセスにピン留めしたファイルサーバーにあるフォルダの上位フォルダ名の変更がアナウンスされており、クイックアクセスが原因では?と気づけた。

対応

クイックアクセスから該当フォルダのピン留めをはずせば解決するが、右クリックをすると固まってしまい外せない状態に。
レジストリでクイックアクセス自体を表示させない方法もあるが、クイックアクセスは使いたい。
よって、PowerShellで該当項目のみのピン留めを外す方法をとって解決させた。
PowerShell

$qa = New-Object -ComObject shell.application
($qa.Namespace("shell:::{679F85CB-0220-4080-B29B-5540CC05AAB6}").Items() | Where-Object { $_.Path -EQ '\\192.168.1.10\hoge\fuga}).InvokeVerb("unpinfromhome")

※事前に該当レジストリ({679F85CB-0220-4080-B29B-5540CC05AAB6})のバックアップを取得すること。

参考:

c# - Programatically Pin\UnPin the folder from quick access menu in windows 10 - Stack Overflow




[VBA] Dictionaryの情報が初期化しても残ってしまう場合の対応

概要

VBAExcelマクロ)でDictionaryを宣言し直しても、初期化してもキーが残り、アイテムにemptyが入っている。

Dim dict As New Dictionary
dict.RemoveAll
'上記でもキーが残ってしまう

原因、対応方法

原因は対象のDictionaryをウォッチに追加しているため。
ウォッチから該当の式を削除すれば余計なキーの残りが消える。

参考:

stackoverflow.com



[C#] [mdb] C#でmdbのテーブル定義情報を取得、及びカラム単位のデータ型などを取得

バージョン

C# 8.0

概要

C#でテーブルのスキーマ情報を取得し、そのスキーマ情報に格納されているカラム単位でのデータ型やNULL許容制約などの状態を取得する。

コード

string tableName = "PersonInfo";  // 取得したいテーブル名

string[] restrictions = new string[4];
restrictions[2] = tableName;
// 対象テーブルのスキーマ情報を取得
var dt = con.GetSchema("Columns", restrictions);  // conはOleDbConnectionで事前にOpenしていること

// カラムは先頭から順に格納されている保証がないので注意
foreach (var row in dt.Rows.Cast<DataRow>())
{
    // カラム名
    var colmnname = row["column_name"].ToString();
    // データ型
    var dattype = (System.Data.OleDb.OleDbType)row["data_type"];  // OleDbTypeのenum
    var dattypeint = (int)row["data_type"];  // コード
    // NULL許容
    var nullable = (bool)row["is_nullable"];

    Console.WriteLine("col:" + colmnname + "  datatype:" + dattype.ToString() + "(" + dattypeint.ToString() + ")" +
         "  nullable:" + nullable.ToString());
}

上記コードforeachにあるrowのrow.ItemArrayにカラム情報が格納されているがobject[28]の配列になっており
row.ItemArray[0]にはどのようなデータが入っているかなどが判り難い。
Visual Studioデバッグできるならクイックウォッチでrow.Tableを展開すれば使える要素名、値がわかり、
row["data_type"]のようにして値を取得できる。
指定できる要素名の代表的なものを以下に記載する。

要素名 内容
TABLE_NAME テーブル名
COLUMN_NAME カラム名
IS_NULLABLE NULL許容
DATA_TYPE データ型(※1)

※1・・・データ型はintでコードが格納されている。System.Data.OleDb.OleDbTypeのenumを参照。

各要素についてはOLE DB スキーマコレクションを参考に。(以下サイトの「列」が該当部分)

docs.microsoft.com



[資格] 2021年(令和3年)データベーススペシャリスト試験(DB)合格!対策方法と参考書

概要

R3年 DBスペシャリストに合格した経験と過去3回午後Ⅱで落ちた経験を元に
必要な参考書と対策方法・勉強方法を記載します。

参考書

午後対策は三好康之さんの「情報処理教科書 データベーススペシャリスト」の1冊で十分です。
過去19年分の問題と解説が最強すぎる。

※リンクを最新の2022年版に変更しました。

アイテックの「データベーススペシャリスト総仕上げ問題集」にも手を出したが
三好さんの解説は図と文書で数ページに渡って丁寧に記載しているが、
こちらは文章中心で問題文のどこと紐づいているかが分かり辛い。
過去問も3年分のみと弱い。


午後Ⅰ

私は概念設計と論理設計を選択したので対策を以下に箇条書き。

  • 午後Ⅰ、午後Ⅱに共通するがSQLが避けては通れない出題頻度になっているので、JOIN、参照制約・VIEW・ロール、トリガー、組み込みSQLの基本形は把握しておく。
  • 行間を読まない!午後Ⅰは問題文に記載されている内容以外を想像しないこと。
  • 概念データモデルのリレーションシップで迷ったらとりあえず1対多としておき、全ての問題が終わった後に振り返る。(1対1になるケースは1つあるかどうか)
  • 時間内に全ての問題を解く。各設問に何問かはめちゃくちゃ簡単な問題があるので時間切れはもったいない。



午後Ⅰの勉強法

ほぼ毎日、午後Ⅰの過去問から1つだけ設問を解く。1日20分程度。
これを3週間するだけで午後Ⅰの見え方が変わります。
過去落ちた時は週末にまとめて勉強しただけで、理解度がふんわりしてたな、と今回気づきました。
勉強時には問題文、概念データモデル、関係スキーマに数字を振ると頭に入りやすくおすすめ。
R3年の試験用紙に書いたものを参考までに。
(字が汚いです。。あと、本試験では時間が足りなく途中で問題用紙に記入するのをやめました。)

①関係スキーマ(まずはここに数字を振る)
②概念データモデル(関係スキーマに対応する数字を振る)
③問題文(問題を読みながら数字を振る)


午後Ⅱ

私は概念設計を選択したので対策を以下に箇条書き。

  • 午後Ⅰと違って、行間を読む必要がある。読解力が求められる。
  • 概念データモデルのリレーションシップの線、絵的にあり得ないと決めつけない。とんでもない長さの線を引くこともある。
    ■リレーションシップ図 平成30年度春の午後Ⅱ:



午後Ⅱの勉強法

午後Ⅰの勉強法をすると簡単な問題の取りこぼしは防げる。
午後Ⅱも過去問中心の勉強法以外に対策はない。

結局は過去問なので三好さんの「情報処理教科書 データベーススペシャリスト」の
ダウンロード特典の過去問&解説がないと戦えないです。


過去、私が午後Ⅱで落ちたケースでは主キー、外部キーの思い違いをし、
概念データモデルと関係スキーマをごっそり間違えることがあった。
これだけは避けなければならない。
本文を素直に取り込む部分とひねる部分の切り分けは過去問の反復で身に付けられる。



午前Ⅰ、午前Ⅱ

本試験に挑戦する際に書いたエントリーの対策でOKです。
[資格] 2021年(令和3年)情報処理技術者試験 データベーススペシャリスト試験(DB)対策 ~準備メモ~ - 1分技術ブログ

ただし、午前Ⅰは過去6年分程度は抑えた方がいいかも。
4年前に午前免除取得のために受けた時と問題内容が一新されており
久しぶりに受験する人は勉強のやり直しが必要です。

最後に

DBスペシャリストの試験はネタ切れを起こしているのか基本的なエッセンスは過去3,4年と変わりはないです。
新しい仕組みや用語が登場しているわけでもなく、仮に落ちたとしても来年に再チャレンジしやすいです。
情報処理技術者試験の高度試験で何か1つ取得したい人はまずはDBスペシャリストに挑戦するのはいかがでしょうか?
このエントリーが皆様の参考になれば幸いです。

[C#] メソッドの引数に可変長引数(params)で且つ参照渡し(refキーワード)をしたい

バージョン

C# 8.0

概要

メソッドの引数に可変長で且つ参照渡しをしたい。
結論から書くと、paramsとrefキーワードを併用することができないので、
Actionクラスを可変長引数(params)で渡して対応する。

コード

int型配列に格納された値をチェックや加工をして、順番に画面のテキストボックスにセットする。

public void Sample()
{
  int[] vals = { 1, 22, 333};

  SetData(vals,
    x => { this.HogeTextBox.Text = x.ToString(); },
    x => { this.FugaTextBox.Text = x.ToString(); },
    x => { this.HogeFugaTextBox.Text = x.ToString(); } );
}

public void SetData(int[] vals, params Action<int>[] actions)
{
  if(vals.Length != actions.Length) {
    return;
  }

  for(int i = 0; i < vals.Length; i++) {
    var tempVal = vals[i];

    // ここで値をチェックや加工する
    // something

    // 値をセットする
    actions[i](tempVal);
  }
}