MFC チェックボックスのテキスト文字に合わせた幅調整する

/// <summary>
/// テキストの幅を計算し、チェックボックスのチェックマーク部分の幅を考慮して、適切なサイズのCRectを返します
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
CRect CalculateCheckboxRect(CButton* pCheckbox, const CString& text)
{
    CDC* pDC = pCheckbox->GetDC();
    CFont* pOldFont = pDC->SelectObject(pCheckbox->GetFont());

    CSize textSize = pDC->GetTextExtent(text);
    pDC->SelectObject(pOldFont);
    pCheckbox->ReleaseDC(pDC);

    // チェックボックスのチェックマーク部分の幅と高さ(システムメトリクスから取得)
    int checkWidth = GetSystemMetrics(SM_CXMENUCHECK);
    int checkHeight = GetSystemMetrics(SM_CYMENUCHECK);

    // 余白を追加(左右に5ピクセルずつ、上下に2ピクセルずつ)
    int width = textSize.cx + checkWidth + 10; // 左右の余白10ピクセル
    int height = max(textSize.cy, checkHeight) + 4; // 上下の余白4ピクセル(2 + 2)

    // x座標に5ピクセル加えて左の余白を確保
    // y座標に2ピクセル加えて上の余白を確保
    return CRect(5, 2, width + 5, height + 2);
}

pythonでライブドアブログのsitemap.xmlからURLの一覧を取得する

import requests
from xml.etree import ElementTree
import time

def fetch_sitemap(url):
    response = requests.get(url)
    return response.content

def parse_sitemap(content):
    root = ElementTree.fromstring(content)

    # サイトマップインデックスの名前空間を取得
    ns = {'sm': root.tag.split('}')[0].strip('{')}

    urls = []

    # サイトマップまたはURLエントリを探す
    for sitemap in root.findall('.//sm:sitemap', ns) + root.findall('.//sm:url', ns):
        loc = sitemap.find('sm:loc', ns)
        if loc is not None:
            urls.append(loc.text)

    return urls

def get_all_urls(start_url):
    to_crawl = [start_url]
    crawled = set()
    all_urls = []

    while to_crawl:
        url = to_crawl.pop(0)
        if url in crawled:
            continue

        print(f"Fetching: {url}")
        content = fetch_sitemap(url)
        urls = parse_sitemap(content)

        for u in urls:
            if u.endswith('.xml'):
                if u not in crawled and u not in to_crawl:
                    to_crawl.append(u)
            else:
                all_urls.append(u)

        crawled.add(url)
        time.sleep(1)  # サーバーに負荷をかけないよう1秒待機

    return all_urls

# 最初のサイトマップURL
start_url = "http://blog.livedoor.jp/hogehoge/sitemap.xml"

# すべてのURLを取得
all_urls = get_all_urls(start_url)

# 結果を表示
print(f"Total URLs found: {len(all_urls)}")
for url in all_urls:
    print(url)

Excelマクロのデジタル署名できないときの対処方法

レジストリをいじります。

  • HKEY_LOCAL_MACHINE\SOFTWARE\SafeNet\Authentication\SAC\へ移動
  • キー追加で"Crypto"
  • 文字列値を追加して"Disable-Crypto" 値を"None"にする

  • PC再起動


マクロ署名についてはマイクロソフト社のおかしなダブルスタンダードのせいでレジストリの変更が必要。

マイクロソフトではデジタル署名が異なるアルゴリズムを使用している場合でも、
引き続き古いMD5ハッシュを必要とします。

MD5という古いアルゴリズムはWindows、SAC、および新しいeTokensでサポート
されなくなった非推奨のアルゴリズムですのでMD5ハッシュ・アルゴリズムを選
択すると署名操作に失敗します。

そのため、VBA プロジェクトに署名するには、レジストリエディタでセーフネットの SHA-1 アルゴリズムを有効にする必要があります。

MFC ウインドウの位置を復元。ただし画面外に飛び出さないようにする

int top = どこからか取得
int left = どこからか取得
int windowHeight = どこからか取得
int windowWidth = どこからか取得;

if (windowHeight > 0 && windowWidth > 0
    && top > 0 && left > 0
) {

    // スクリーンの解像度を取得
    int screenWidth = GetSystemMetrics(SM_CXSCREEN);
    int screenHeight = GetSystemMetrics(SM_CYSCREEN);

    // ウインドウが画面内に収まるように調整
    if (left + windowWidth > screenWidth) {
        left = screenWidth - windowWidth;
    }
    if (top + windowHeight > screenHeight) {
        top = screenHeight - windowHeight;
    }

    // 左上が画面内に収まるように調整
    left = max(0, left);
    top = max(0, top);

    // ウインドウの位置とサイズを設定
    SetWindowPos(NULL, left, top, windowWidth, windowHeight, SWP_NOZORDER);
}

signtoolで証明書のハッシュ値指定で署名する

インストール済の証明書のハッシュ値指定で署名

"C:\Program Files (x86)\Windows Kits\8.1\bin\x64\signtool" sign /sha1 BCBXXXXXXXXXXXXXXXXXXXXXXXXXXXXF068 /fd SHA256 /td SHA256 /tr http://timestamp.sectigo.com /v "hogehoge.exe"

innosetupのSign Toolで設定しようとすると /f が無い とエラーになるが /f "" をつければ通る

インストール済の証明書のハッシュ値を確認する手順

管理者権限で開いたコマンドプロンプトで

certutil -store -user My

VBAで MSHTML.HTMLDocument を使うとでるCookieに関する Windows セキュリティの警告の消し方

oHTML.designMode = "on"って感じのコード入れるとでなくなる

ドキュメントを編集可能なデザイン モードに設定している。
これにより、スクリプトを使用してドキュメントのコンテンツを変更したり、イベントを処理したりできます。

Dim oHTML As MSHTML.HTMLDocument
oHTML.designMode = "on"

セクティゴ EV認証で exeに署名する方法 Explzh利用版

昔と違ってwebから必要ファイルをダウンロードできなくなった。
わざわざカナダからUSBメディアで送付されてくる。

Safenet Authentication クライアントソフトウェア(EV スタンダード)をインストール

インストール関連 | サポート | セクティゴ・コモドSSL
ここの下のほうにダウンロードリンクがある。
インストールしたら一回PC再起動

USBトークンをPCに接続

セクティゴから送られてきたトークンUSBをPCにつなぐ。
署名するときは必須

コードサイン証明書 - 中間証明書をダウンロード

マニュアル | サポート | セクティゴ・コモドSSL
2021年6月1日以降に発行した新基準のコード証明書のEVタイプをダウンロードする

Explzhの証明書設定

ソフトウェア発行証明書に↑でダウンロードしたcrtを指定
あとは画像の通り。PC環境のよってキーコンテナはちょっと違うけどおなじようなの選んで。

最初だけ認証するときに認証パスワードを聞かれる。
3回間違えると使えなくなるので慎重に。

python pandas既存データ上書き

以下のようなコードでCSV読み込んで既存のデータに上書きして出力したい時、

combined_data = existing_data.combine_first(new_data)
だけだと、存在しない日付のデータを埋めてくれるだけ。

combined_data.update(new_data)
もやらないと上書き更新してくれないよ

print('取得開始...')
# 既存のCSVファイルを読み込む
try:
    existing_data = pd.read_csv(aOutPath, index_col=0, parse_dates=True)
    print('既存のデータを読み込みました')
except FileNotFoundError:
    print('既存のファイルが見つかりませんでした。新しいファイルを作成します。')
    existing_data = pd.DataFrame()

# 新しいデータを取得
new_data = yf.download(aCode, start=aStart, end=aEnd)

print('取得完了')

# 前日比と前日比率作成
new_data['Diff'] = new_data['Close'].diff()
new_data['DiffRate'] = new_data['Close'].pct_change() * 100

# 既存のデータと新しいデータを結合(上書き)
combined_data = existing_data.combine_first(new_data)
combined_data.update(new_data)