Folding@Homeを深夜電力時間帯だけ実行してコロナ解析に貢献する

# Folding@homeが新型コロナの解析をしているらしい
Folding@home、懐かしい。昔PS3で参加していた覚えがあります。
そのプロジェクトが新型コロナ治療に向けた解析を始めたようなので、普段無駄に余らせているゲーミングマシンで社会貢献や！と考えたわけです。

# でも電気代が高い

それなりのマシンを24時間ブン回すと電気代が結構かかるので、心理的負担が大きい。
特に自宅が深夜電力契約をしているので、昼間時間帯の高い電気を使いたくない。。

# 深夜電力時間帯だけ実行できるようにしよう

ケチくさいと思われるかもしれませんが、こういう寄付的なものは心理的負担が少ない範囲で無理なく参加できるのがいいと思います。
ということで、自分用に指定時間で演算を行うスクリプトを作成したのでよかったら。

# とりあえず実行
### 環境
Windows10 / Powershell 5.1 (Powershell 3以上なら動く気がする)
### 使い方
- folding@homeを全てデフォルトでインストールする
- GUIで良い感じに設定して動くことを確認する。(GUIのやり方は一杯落ちてるからググってね。)
- メモ帳に下のコードを貼り付ける
- コードのユーザー入力欄を好きに変更
  - exepath = folding@homeのインストールパス、デフォルトインストールならそのまま
  - starttime = 演算を開始したい時間
  - endtime = 演算を止めたい時間(7を指定すると7:00に止まる)
  - finished = 止めた後にシャットダウン/スリープしたい場合は、shutdown/sleepを入れる。
* BOM付きのUTF-8、拡張子を.ps1で保存
<img width="586" alt="2020-03-30_012205.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565369/af86374a-e460-bb54-16bc-389b4478d826.png">
* 右クリック⇒Powershellで実行(指定時間内なら即演算開始、それ以外なら待機処理になります。)

```powershell:fahcontroll.ps1
####ユーザー入力欄############
#folding@homeのインストールパス
$exepath = "C:\Program Files (x86)\FAHClient"
#実行時間の指定(24h表記)
$starttime = 23
$endtime = 7
#終了後にシャットダウンしたい場合はshutdown、スリープしたい場合はsleepを指定
#何もしない場合は空
$finished = ""
############################

#function
function Judge-Exec ($st, $et, $nt) {
    if (($st -le $nt) -xor ($nt -lt $et) -xor ($st -lt $et)) {
        return $true
    }
    return $false
}
function Suspend-Computer {
    $state = [System.Windows.Forms.PowerState]::Suspend
    [bool]$force = $true
    [bool]$disableWakeEvent = $false
    [System.Windows.Forms.Application]::SetSuspendState($state, $force, $disableWakeEvent)
}

#main
$logdir = Join-Path $HOME "foldinghomedata"
if (!(Test-Path $logdir)) {
    New-Item $logdir -ItemType Directory
}
Set-Location -Path $logdir
$exe = Join-Path $exepath "FAHClient.exe"

while ($true) {
    $now = [int](Get-Date -Format "HH")
    if(Judge-Exec $starttime $endtime $now) {
        break
    }
    Write-Host "$($starttime)時まで待機"
    Start-Sleep 60
}
& $exe --send-unpause

while ($true) {
    $now = [int](Get-Date -Format "HH")
    if(!(Judge-Exec $starttime $endtime $now)) {
        break
    }
    Write-Host "$($endtime)時まで実行中"
    Start-Sleep 60
}
& $exe --send-pause
& $exe --send

Start-Sleep 10
if ($finished -eq "shutdown") {
    Stop-Computer -Force
}
if ($finished -eq "sleep") {
    Suspend-Computer
}
exit 0

```

# 実行できない場合
デフォルトだとスクリプトの実行ができないので、「Powershellを管理者権限で実行」して以下のコマンドを放っておく。

```
Set-ExecutionPolicy RemoteSigned
```
ログ等で↓のメッセージが出て負荷が上がらない場合は、今あなたに計算してもらうのないよ的な意味なのか、待っていると落ちてくるので放置でOKと思われる。

```
WARNING:WU00:FS00:Failed to get assignment from '18.218.241.186:80': No WUs available for this configuration
```

# 定期実行
タスクスケジューラで自分がログインしたら自動実行するように設定して、PCを切らずに寝るだけです。
お好きなように設定してくださいなのですが、このスクリプトはログインしていることを前提にして書いていて、裏で実行される想定にしていません。
Powershellのタスクの書き方はちょっと変わってるので、[このへん](https://www.atmarkit.co.jp/ait/articles/1412/03/news125.html)を参考にどうぞ。

### 設定例
<img width="406" alt="2020-03-30_014308.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565369/bc79398f-feef-995f-be55-e5c504f1a151.png">
<img width="454" alt="2020-03-30_014040.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565369/6913c0d1-ba9b-1c3c-bbc4-eb2eac49059e.png">
<img width="340" alt="2020-03-30_014248.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565369/0e6b339b-ebab-37a9-93b8-6cf53f1394f2.png">