カテゴリー
プログラミング 開発 PowerShell Python 技術

SING4DATASCIENCE/HSSingLogプロセス概要

大まかな流れ

現在、SING4DATASCIENCE/HSSingLogのセッションにおいてはいくつかのプロセスが存在しています。

  1. 歌唱プレイリスト作成
  2. 歌唱セッション
  3. 歌唱結果集計
  4. メタデータ集計
  5. 結果投稿

この記事においてはこれらのプロセスと、それに使われているツール等に関して紹介していきます。

歌唱プレイリスト作成

歌唱プレイリストの作成は自動化されており、以下のような機能を備えています。

  • 自動選曲抽選システム
  • 固定楽曲システム(現在3曲の楽曲に関して固定)

自動選曲抽選システムは過去の歌唱セッションの情報を元に、これまでに歌唱した回数、及び、最後の歌唱からの日数等などを元に重み付けがされ、抽選がシミュレーションされています。重み付けにより、歌唱回数が少ないものや最後の歌唱から時間が経った楽曲がより高い確率で選曲されるようになっています。

これらはPowerShellで実装されており、抽選ロジックはバイナリモジュール、抽選プロセスに関してはスクリプトモジュールで実装されています。(PowerShell 7を使用。)

自動選曲抽選システムの実行例

歌唱セッション

歌唱プレイリストが作成されると、歌唱指示書が作成されます。このCSVリストでは歌唱する順番及び、現在存在するメタデータが記載されています。

歌唱指示書

歌唱結果集計

歌唱が完了すると、それを集計します。歌唱指示書のうち、Title ID項目を取り出し、集計表で集計していきます。

集計表

集計が完了すると、それをGet-HSLCompiledFileコマンドレットを使用することで検証(スコアに矛盾等がないかを確認)し、登録されているタイトル情報と合成した上で、GitHubにプッシュしているファイルを作成します。

Get-HSLCompiledFile実行例

メタデータ集計

新曲である場合や、現在メタデータが入っていない楽曲がある場合は歌唱指示書の中で入力されていない曲を埋めていき、Update-HSLCsvDataを実行します。このコマンドレットを使用することにより現在、3つある、それぞれのメタデータCSVの情報が更新されます。(3つのメタデータは著作者リスト、リリース日、テンポリストです。)

Update-HSLCsvData実行例

結果投稿

結果を投稿するためにはPythonのスクリプトを使用しています。Pythonのスクリプトには大きく2種類の機能を持っています。(PythonにおいてはpandasMatplotlibを使用しています。)

  • 投稿テキストの作成
  • 投稿グラフの作成
結果投稿生成システム実行例
カテゴリー
PowerShell Python 技術

PowerShell CoreからAnacondaを使用できるようにする方法

Anacondaを設定して、conda initとすると一通り、PowerShell Coreを含めたPowerShell用の設定もしてくれるのだが、この方法はPowerShellを立ち上げると毎回Anacondaが初期化されてしまう欠点がある。PowerShellで毎回Pythonを使うのであれば問題ないのだが、個人的な使用ケースとしてはPowerShellスクリプトのみで完結することも多く、これは非効率的になってしまう。

そのため、Initialize-CondaというCmdletを作成することにした。内容的な以下のような感じ。C:/Path/to/CondaをAnacondaの場所に変える。(GistでWindows版Linux版を取得可能。)

function Initialize-Conda
{
	$CONDA_ROOT_DIR = "C:/Path/to/Conda" # Change this
        [System.Environment]::SetEnvironmentVariable("CONDA_EXE", "$CONDA_ROOT_DIR/Scripts/conda.exe", [System.EnvironmentVariableTarget]::Process)
	[System.Environment]::SetEnvironmentVariable("_CE_M", "", [System.EnvironmentVariableTarget]::Process)
	[System.Environment]::SetEnvironmentVariable("_CE_CONDA", "", [System.EnvironmentVariableTarget]::Process)
    [System.Environment]::SetEnvironmentVariable("_CONDA_ROOT", "$CONDA_ROOT_DIR", [System.EnvironmentVariableTarget]::Process)
        [System.Environment]::SetEnvironmentVariable("_CONDA_EXE", "$CONDA_ROOT_DIR/Scripts/conda.exe", [System.EnvironmentVariableTarget]::Process)

        Import-Module -Scope Global "$Env:_CONDA_ROOT/shell/condabin/Conda.psm1"
        conda activate base
}

環境変数の設定が冗長になっているのは、通常の変数はスクリプト外にスコープを持たないため。.NETのSetEnvironmentVariableprocessのスコープで初期化することにより対応している。(LinuxではCONDA_EXE_CONDA_EXE$CONDA_ROOT_DIR/bin/condaとすること。)

尚、Add-CondaEnvironmentToPromptを使うとプレフィックスとしてConda環境をプロンプトに追加することができるが、挙動が曖昧だったので、今回は割愛している。

これに対応するPSD1は以下の通り。(Gistでも公開。)

@{
    RootModule = 'Conda.psm1'
    ModuleVersion = '1.0.0.0'
    FunctionsToExport = @(
            'Initialize-Conda'
        )
    CmdletsToExport   = '*'
    VariablesToExport = '*'
    AliasesToExport   = '*'
    GUID = '23421dee-ca6f-4847-9c93-1268c629964a'
    Author = 'Hideki Saito'
    Description = 'Anaconda Initializer'
    PowerShellVersion = '6.0'
    CompatiblePSEditions = 'Core'
    Copyright = '(c) 2019 Hideki Saito. All rights reserved.'
    PrivateData = @{
        PSData = @{
            ProjectUri = ''
            ReleaseNotes = ''
        }
    }
}

このファイルをそれぞれConda.psm1Conda.psd1として、Documents\PowerShell\Modules\Conda以下(Linuxでは~/.local/share/powershell/Modules/Conda)に配置すると、Initialize-Condaを読み出せるようになる。