在宅勤務になって作ってみたミニプログラムたち

## はじめに
本記事は、[Code Polaris 2021 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/code-polaris "Code Polaris 2021 Advent Calendar 2021") の21日目の記事です。

思いつきで書き始めたので、公開後も適宜修正をかける可能性があります。

在宅勤務を始めてから作ってみて、我ながら便利だと感じたミニプログラム[^1] たちを紹介してみます。

自分が使うだけなので、プログラム的に配慮が足りなかったり、よくあるコーディングルールに則ってなかったりするのは承知してます。薄目で見るか、気になるようでしたらコメントでこそっと教えていただけると嬉しいです。


## ディスプレイの明るさを切り替えるプログラム

仕事をしているデスクが窓際にあるもんで、時間帯によって日が差し込んだりします。その都度、パソコンのディスプレイの設定を開いて、明るさを調整するのが面倒なので、プログラムで制御できないかな？というのが、最初のニーズです。

それと、私の場合、ディスプレイの明るさは暗め（Windows 10の設定を見ると10でした）が好きですが、たまーに出社して同僚にディスプレイ見せながら話そうと思ったら「暗くない？」って言われて、それでいちいちまた設定開いて・・・というのが面倒というのもありました。

暗くするプログラムで説明します。

```batchfile:display_darker.cmd
powercfg -setacvalueindex 381b4222-f694-41f0-9685-ff5bb260df2e 238c9fa8-0aad-41ed-83f4-97be242c8f20 29f6c1db-86da-48c5-9fdb-f2b67b1f44da 0
powercfg -setdcvalueindex 381b4222-f694-41f0-9685-ff5bb260df2e 238c9fa8-0aad-41ed-83f4-97be242c8f20 29f6c1db-86da-48c5-9fdb-f2b67b1f44da 0
powercfg -setactive 381b4222-f694-41f0-9685-ff5bb260df2e
```

まず1行目と2行目をMicrosoft社のDocsを参考に、構文的に書き換えると下記の通り。

```batchfile
powercfg /setacvalueindex scheme_GUID sub_GUID setting_GUID setting_index
powercfg /setdcvalueindex scheme_GUID sub_GUID setting_GUID setting_index
```

オプションの意味は下記の通り。
`/setacvalueindex` は、電源(ACアダプタ)に接続している時の設定。
`/setdcvalueindex` は、バッテリ駆動時の設定。

引数は下記の通り。Microsoft社のDocsからつまんできています。

| 引数名 | 説明 | 設定値の調べ方 |
|:-|:-|:-|:-|
| scheme_GUID | 電源設定 GUID | コマンドプロンプトで `powercfg /list` を実行して返ってきた値 |
| sub_GUID | 電源設定サブグループ GUID | コマンドプロンプトで `powercfg /query` を実行して返ってきた値の__（ディスプレイ）__と書かれている項目 |
| setting_GUID | 電源設定 GUID | コマンドプロンプトで `powercfg /query` を実行して返ってきた値の__（ディスプレイの明るさ__）と書かれている項目 |
| setting_index | 指定できる値（明るさのレベル） | コマンドプロンプトで `powercfg /query` を実行して返ってきた値の__（ディスプレイの明るさ）__と書かれている項目 |

```batchfile
powercfg /query
```

これで確認してみると、結構たくさんの情報が出力されてきますが、びっくりせず１つ１つ確認しましょう。
明るさは`setting_index`に入れる値を変えることで調整できます。

参考にしたWebサイトは下記の通りです。
[Powercfg のコマンドライン オプション](https://docs.microsoft.com/ja-jp/windows-hardware/design/device-experiences/powercfg-command-line-options "Powercfg のコマンドライン オプション")
[【Windows 7】 powercfg.exeで設定を変更する](https://www.ti-web.net/blog/2012/07/powercfg-exe-windows7.html "【Windows 7】 powercfg.exeで設定を変更する")


## プロキシの設定を切り替えるプログラム

ネットワーク環境が在宅と出社で異なるため、プロキシの設定を切り替える必要があって、これもまたいちいち設定を開いて・・・とするのが面倒なので、プログラムを書いたファイルをキックするだけで済ませたいというニーズです。

環境はWindows 10 Proです。

細かい設定もできるのですが、ここでは__プロキシサーバを使うかどうか__の切り替えをするだけに留めます。

```batchfile:proxy_flg.bat
@echo off
set PROXY_FLG=
set /P PROXY_FLG="フラグを入力(1=ON, 0=OFF):"
if %PROXY_FLG% == 1 (
    reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyEnable /t reg_dword /d 1
) else if %PROXY_FLG% == 0 (
    reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyEnable /t reg_dword /d 0
)
```

`proxy_flg.bat` をダブルクリックすると、下記の標準入力を受け付けます。

```
C:\Users\XXXXXXXX\Desktop\tools>echo off
フラグを入力(1=ON, 0=OFF):
```

フラグは、1：プロキシサーバを使う（オン）、0：プロキシサーバを使わない（オフ）という意味です。
最初は、プロキシサーバを使う設定にするプログラムとプロキシサーバを使わない設定にするプログラムとを分けて作っていましたが、`set /P` で尋ねればいいなと。

ちなみに、プロキシサーバを使わない設定をする方でも`reg add`を使用しているのには意味があります。プロキシサーバの情報や設定は残しておきたいから。`reg delete`もありますが、削除してしまうので。

`PROXY_FLG`の判定が甘いですね、流用されたい方はこの辺りを修正してお使いください。

参考にしたWebサイトは下記の通りです。
[reg コマンド](https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/reg "reg コマンド")
[コマンドでのProxy設定](https://qiita.com/inframemo/items/a524c987bea9ccb26a66 "コマンドでのProxy設定")
[【Windows 10対応】Windowsのバッチファイルの基本的な使い方](https://atmarkit.itmedia.co.jp/ait/articles/1506/26/news026.html "【Windows 10対応】Windowsのバッチファイルの基本的な使い方")


## 在宅勤務になって作ってみたミニプログラムたち
ほんとはあと１つあるんですが、ちょっと見せられない（エラー処理が雑すぎて・・・）ので、概要をザクッとだけ書いておきます。

会社の勤怠管理システムの「出勤」ボタンをプログラムで押すというものです。PythonでSeleniumを使って、スクレイピングするという、よくあるやつです。

在宅勤務開始時のPCは重かったり、VPNが重かったりしたので、メーラーや社内チャットを立ち上げつつ、裏で出勤処理もしたいというニーズで作ってみたものです。また、バージョンアップさせてマシになったら、投稿するかも・・・。


[^1]: ミニプログラム：コメント行を含めて100行に満たない、自分が使用するだけのプログラムやコマンドのこと。勝手に命名してます。