Dropbox 強制再起動

30分だけ一時停止、って指示してもずっと一時停止になってて困るケースが増えてきた。

なので強制的にやってやるぞ

batファイル

echo ■Dropbox再起動
rem Dropbox を強制終了
taskkill /IM Dropbox.exe /F
rem 少し待つ
timeout /t 3 > nul
rem Dropbox を再起動
start "" "C:\Program Files (x86)\Dropbox\Client\Dropbox.exe"

powershell

Stop-Process -Name "Dropbox" -Force
Start-Sleep -Seconds 3
Start-Process "C:\Program Files (x86)\Dropbox\Client\Dropbox.exe"

windows環境で py で優先設定する方法は?

Python Launcher は以下の 2か所の設定ファイルを読み込みます。

ユーザー用:
%LOCALAPPDATA%\py.ini
例
C:\Users\あなた\AppData\Local\py.ini

システム用:
C:\Windows\py.ini

通常は ユーザー用 py.ini を作成します。

C:\Users\<ユーザー名>\AppData\Local\py.iniを作って中身を以下にします。

[defaults]
python=3.12

こうすると3.12が優先になります。

プロンプトで確認します

py -0

pythonに pip install済のものリストアップして別PCで全部同じようにインストールする手順

requirements.txt を作成

python.exe -m pip freeze > requirements.txt

別 PC にコピー

requirements.txt を USB などで別 PC に移しておきます。

別 PC で同じパッケージを一括インストール

python.exe -m pip install -r requirements.txt

エラー出たらChatGPTにぶん投げれば対処方法教えてくれる

windows WSL環境で .NET SDK のインストール方法

前提条件の確認

  • Windows 上で WSL2 が有効になっており、Linux ディストリビューション(例:Ubuntu)が起動可能であること。

→ 例えば PowerShell/管理者モードで wsl --install または wsl --set-version <ディストリビューション> 2 等を使います。

  • Linux 側で、パッケージマネージャ(apt など)が動き、インターネット接続があること。
  • SDK をインストールする対象の .NET バージョンを決めておく(例:6.0、7.0、8.0)。ドキュメントではバージョンによる注意点があります。

Microsoft パッケージリポジトリの登録

この手順で、Microsoft が提供する .NET SDK/ランタイムのパッケージを apt からインストールできるようにします。

# 最新のリポジトリ登録用パッケージを取得
wget https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb

# パッケージをインストール
sudo dpkg -i packages-microsoft-prod.deb

# 不要となったファイルを削除
rm packages-microsoft-prod.deb

# リポジトリ・情報を更新
sudo apt update

SDK のインストール

.NET SDK 8.0 をインストールする場合

sudo apt install -y dotnet-sdk-8.0

インストール確認

インストールが成功したか、以下コマンドで確認します

dotnet --version
dotnet --list-sdks
dotnet --info

注意点・トラブルシューティング

Ubuntu 24.04 等、特定バージョンではパッケージの依存関係が合わずエラーになるケースがあります。

過去に Snap パッケージ方式でインストールした場合、SDK が正常認識されないことがあるため、apt 方式を使うのが安定しています。

WSL 内で UI/GUI を使った開発環境(例:VS Code Remote – WSL)と併用する場合、SDK のPATHや環境変数(DOTNET_ROOT 等)に注意が必要です。

.NET Framework SQLite.Interop.dllの置くフォルダを変更する

普通はx64 x86フォルダ固定だけど、どうしても違うフォルダにしたい場合の設定方法


コード(vb)

Imports System.Runtime.InteropServices

....

    ' --- Win32 API 宣言 ---
    <DllImport("kernel32.dll", SetLastError:=True)>
    Private Shared Function SetDllDirectory(lpPathName As String) As Boolean
    End Function

    ' 対応OSなら安全な検索順序へ(Windows 8+)
    <DllImport("kernel32.dll", SetLastError:=True)>
    Private Shared Function SetDefaultDllDirectories(dwDirectoryFlags As UInteger) As Boolean
    End Function

    <DllImport("kernel32.dll", CharSet:=CharSet.Unicode, SetLastError:=True)>
    Private Shared Function AddDllDirectory(NewDirectory As String) As IntPtr
    End Function

    Private Const LOAD_LIBRARY_SEARCH_DEFAULT_DIRS As UInteger = &H1000UI
    Private Const LOAD_LIBRARY_SEARCH_USER_DIRS As UInteger = &H400UI

...

Sub Main()

        ' --- 1) SQLite.Interop.dll の検索パスを最初に通す ---
        Dim baseDir = AppDomain.CurrentDomain.BaseDirectory
        Dim archFolder = If(IntPtr.Size = 8, "OrgFolder(x64)", "OrgFolder(x86)")
        Dim nativeDir = Path.Combine(baseDir, archFolder)

        Try
            Dim okDefault As Boolean = False
            Try
                okDefault = SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DEFAULT_DIRS Or LOAD_LIBRARY_SEARCH_USER_DIRS)
            Catch
                ' 旧OS等で未実装なら握りつぶし
            End Try

            If Directory.Exists(nativeDir) Then
                If okDefault Then
                    ' Win8+:ユーザーディレクトリに追加入れ
                    Dim p = AddDllDirectory(nativeDir)
                    If p = IntPtr.Zero Then
                        ' 念のためフォールバック
                        SetDllDirectory(nativeDir)
                    End If
                Else
                    ' 旧OS:従来APIにフォールバック
                    SetDllDirectory(nativeDir)
                End If
            Else
                MessageBox.Show($"ネイティブDLLフォルダが見つかりません: {nativeDir}",
                                "起動警告", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            End If
        Catch ex As Exception
            MessageBox.Show("DLL検索パス設定でエラー: " & ex.Message,
                            "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try

...

vbproj

...
  <Target Name="RelocateSQLiteInterop" AfterTargets="CopySQLiteInteropFiles">
    <PropertyGroup>
      <SQLiteInteropX86Source>$(TargetDir)x86\SQLite.Interop.dll</SQLiteInteropX86Source>
      <SQLiteInteropX64Source>$(TargetDir)x64\SQLite.Interop.dll</SQLiteInteropX64Source>
      <SQLiteInteropX86Destination>$(TargetDir)OrgFolder(x86)\SQLite.Interop.dll</SQLiteInteropX86Destination>
      <SQLiteInteropX64Destination>$(TargetDir)OrgFolder(x64)\SQLite.Interop.dll</SQLiteInteropX64Destination>
    </PropertyGroup>
    <MakeDir Directories="$(TargetDir)OrgFolder(x86)" Condition="Exists('$(SQLiteInteropX86Source)')" />
    <MakeDir Directories="$(TargetDir)OrgFolder(x64)" Condition="Exists('$(SQLiteInteropX64Source)')" />
    <Copy SourceFiles="$(SQLiteInteropX86Source)" DestinationFiles="$(SQLiteInteropX86Destination)" SkipUnchangedFiles="true" Condition="Exists('$(SQLiteInteropX86Source)')" />
    <Copy SourceFiles="$(SQLiteInteropX64Source)" DestinationFiles="$(SQLiteInteropX64Destination)" SkipUnchangedFiles="true" Condition="Exists('$(SQLiteInteropX64Source)')" />
    <Delete Files="$(SQLiteInteropX86Source)" Condition="Exists('$(SQLiteInteropX86Source)')" />
    <Delete Files="$(SQLiteInteropX64Source)" Condition="Exists('$(SQLiteInteropX64Source)')" />
    <RemoveDir Directories="$(TargetDir)x86" Condition="Exists('$(TargetDir)x86')" />
    <RemoveDir Directories="$(TargetDir)x64" Condition="Exists('$(TargetDir)x64')" />
  </Target>

...

Fody と Costura.Fody の解説

Fody

Fody は、C# や VB.NET の ビルド後に IL(中間言語)レベルでアセンブリを書き換える「Weaver」フレームワーク です。
NuGet でインストールすると、ビルドプロセスの最後に自動的に実行され、コードを後処理してくれます。

たとえば:

自動プロパティの INotifyPropertyChanged 実装(PropertyChanged.Fody)

依存 DLL 埋め込み(Costura.Fody)

メソッドのログ注入
などが可能です。

Costura.Fody

Costura.Fody の役割

Costura.Fody は、その Fody のアドインの一つで、
「外部 DLL を exe 内にリソースとして埋め込み、単一 exe にまとめる」 機能を提供します。

🧠 仕組み

ビルド時に、プロジェクト参照や NuGet 参照された DLL を抽出

それらを実行ファイルのリソースとして埋め込み

実行時、AppDomain.AssemblyResolve イベントをフックして、埋め込まれた DLL を動的にロード

👉 これにより、実行ファイルと一緒に DLL を配布する必要がなくなり、
「単一の .exe ファイルで配布」が可能になります。

自分のnote記事URL一覧を取得する方法

手順

note記事をエクスポートする

  1. PCでnoteログイン→自分のアイコンを押す
  2. 「自分の記事」ページに移動
  3. ページ上部にある「エクスポート」をクリック、「エクスポートを開始」を押す
  4. 登録アドレスに「【note】記事のダウンロードができるようになりました」というメールが届く。メール内のダウンロードページをクリックして、".xml"ファイルをPCに取得

.xmlからURLを取得

秀丸で開いて

<link> を<link>\n に置換(正規表現ONで)
</link> を</link>\n に置換(正規表現ONで)

grepの実行で 検索するファイルを (現在の内容) にして
検索する文字列を以下にして実行(正規表現ONで)

(?<=<link>)(https?://note\.com/[A-Za-z0-9_]+/n/n[0-9A-Za-z]{12})(?=</link>)

ネタ元

note.com

自己ホストWindowsランナーを作ってgithub Actionから自動テストの仕組みを作る

自前(=自己ホスト)のWindowsランナーを用意して、ログオン済みのデスクトップセッション上で走らせれば、github Actionからwindows guiアプリの自動テストができるようになる。

準備 概要

  • 自己ホストWindowsランナーを1台用意
  • そのマシンに常時ログオン状態の専用ユーザーを作る
  • ランナーをサービスではなく“ユーザーのデスクトップ上”で常駐させる
    • ここで FlaUI / pywinauto / PAD / AutoHotkey などでUI操作→スクショや動画を保存
  • actions/upload-artifact でGitHub Actionsに成果物を返送

ポイント:UI自動化は対話セッション(WinStation\Desktop)が存在しないと動きません。
ログインしっぱなしのPCが必要です。ロックされちゃったらダメ。
サービスセッションでは動作不可。

手順

GitHubでランナーを追加する

  • 対象の GitHubリポジトリを開く
  • 右上の「⚙️ Settings」をクリック
  • 左メニューから “Actions” → “Runners” を開く
  • 「New self-hosted runner」ボタンを押す
  • OSは「Windows」を選択
  • 64bitを選択

すると、こんな画面が出ます👇

# 1. Download
mkdir actions-runner && cd actions-runner
Invoke-WebRequest -Uri https://github.com/actions/runner/releases/download/v2.316.0/actions-runner-win-x64-2.316.0.zip -OutFile actions-runner-win-x64-2.316.0.zip
Add-Type -AssemblyName System.IO.Compression.FileSystem ; [System.IO.Compression.ZipFile]::ExtractToDirectory('actions-runner-win-x64-2.316.0.zip', "$PWD")

# 2. Configure
.\config.cmd --url https://github.com/あなたのユーザー名/リポジトリ名 --token XXXXXXXXXXXXX

# 3. Run
.\run.cmd

上記を3ステップを ランナーにするPCのPowerShell でそのまま実行します

2. Configure の途中で聞かれる項目:

サービス登録はしない
Runner name → デフォルトでOK(または任意)
Work folder → _work のままでOK
ラベル → windows gui などつけると便利(例:windows-gui)

3. Runの注意点

.\run.cmdは管理者権限付で起動したほうがよい。
管理者権限がないためにエラーが発生する場合があるから。

実際にジョブを走らせて確認

リポジトリの .github/workflows/test.yml に以下のような簡単なワークフローを追加

name: Self-hosted test
on: [workflow_dispatch]

jobs:
  test:
    runs-on: [self-hosted, windows]
    steps:
      - run: echo "Hello from self-hosted runner!"
      - run: powershell Get-Date
      - run: systeminfo | find "OS Name"
もしエラーで動かなかったら

actions-runnerフォルダ内の_diagフォルダに Worker_20251003-141317-utc.log といったファイル名でログがでる。

.env から環境変数をロード python

.envを用意して
まずload_env_file()を呼ぶようにすればOK

# ---------------------------
# .env ローダー(簡易版)
# ---------------------------

def load_env_file():
    """.env を現在ディレクトリとスクリプト配置ディレクトリから読み込む。
    既に存在する環境変数は上書きしない。コメント(#)と空行を無視。
    サポート形式: KEY=VALUE / KEY="VALUE" / KEY='VALUE' / export KEY=VALUE
    """
    candidates = [
        os.path.join(os.getcwd(), ".env"),
        os.path.join(os.path.dirname(__file__), ".env"),
    ]
    for path in candidates:
        if not os.path.exists(path):
            continue
        try:
            with open(path, "r", encoding="utf-8") as f:
                for raw in f:
                    line = raw.lstrip("\ufeff").strip()
                    if not line or line.startswith("#"):
                        continue
                    if line.startswith("export "):
                        line = line[len("export "):].strip()
                    if "=" not in line:
                        continue
                    key, val = line.split("=", 1)
                    key = key.strip()
                    val = val.strip().strip('"').strip("'")
                    if key and key not in os.environ:
                        os.environ[key] = val
        except Exception:
            # 読み込み失敗は無視(既存の方式で続行)
            pass

edinet apiキー取得方法

最終的にポップアップウインドウがでるのでブロックされることあり。
事前に https://api.edinet-fsa.go.jp をブロックしないようにするか
Edgeを使って取得するとよい

EDINET APIキー取得の手順

① アカウント作成ページにアクセス

まず以下のページからアカウントを新規登録します:
https://api.edinet-fsa.go.jp/api/auth/index.aspx?mode=1

ここから氏名・メールアドレス・電話番号などを入力してアカウントを作成します。

② メール認証と電話番号認証(多要素認証)

メールアドレスの確認コード入力などの手順を完了します。

電話番号によるSMS認証もあります。
→ 日本の携帯番号の場合、「+81」を選び、直後に先頭の0を省略して入力する点に注意(例: 80-XXXX-XXXX)。これを間違えるとSMSが届かないことがあります。

③ ポップアップの許可設定

認証後にAPIキーがポップアップで表示される構成です。
ブラウザによってはポップアップやリダイレクトがブロックされることがあるので、以下のURLを「許可リスト」に追加することをおすすめします:

https://api.edinet-fsa.go.jp

許可をしておくと APIキー表示画面に正しく遷移できます。

④ APIキーの表示・取得

多要素認証が成功すると、登録した連絡先とともにAPIキーが画面に表示されます:

各種アプリ(スクリプト・ツール)の Subscription-Key や Ocp-Apim-Subscription-Key(Azure APIMスタイル)として利用可能です。