/// <summary>
        /// セッションの初期化
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private async void UpdateSessionButton_Click(object sender, RoutedEventArgs e)
        {
            if (!LockUpdate())
            {
                return;
            }

            try
            {
                var text = IksmSessionTextBox.Text.Trim();
                if (Regex.IsMatch(text, "session_token_code=(.*)&"))
                {
                    var sessionTokenCode = Regex.Match(text, "session_token_code=(.*)&").Groups[1].Value;
                    sessionToken = await SplatNet2SessionToken.GetSessionToken(sessionTokenCode, authCodeVerifier);

                    var cookie = await SplatNet2SessionToken.GetCookie(sessionToken);

                    IksmSessionTextBox.Text = cookie;
                }

                // 空白文字だけ? 全角空白やtab?や改行はどうするか
                var iksmSession = IksmSessionTextBox.Text.Trim();
                if (await TryInitializeSessionWindow(iksmSession))
                {
                    ChangeViewGrid(MainGrid);
                }
            }
            finally
            {
                UnLockUpdate();
            }
        }
        /// <summary>
        /// 初期化
        /// </summary>
        private async void Window_Loaded(object sender, RoutedEventArgs e)
        {
            LockUpdate();

            // アップデート後の後処理
            if (Environment.CommandLine.IndexOf("/up", StringComparison.CurrentCultureIgnoreCase) != -1)
            {
                var args = Environment.GetCommandLineArgs();
                var pid  = Convert.ToInt32(args[2]);
                Process.GetProcessById(pid).WaitForExit();
                if (File.Exists("Splatoon2StreamingWidget.old"))
                {
                    File.Delete("Splatoon2StreamingWidget.old");
                }
            }

            try
            {
                // 同期的にasyncメソッドを扱ってTask.Resultとかでawaitを使用しているメソッドを取得しようとするとデッドロックが起きる
                var authURL = SplatNet2SessionToken.GenerateLoginURL();
                authCodeVerifier        = authURL.authCodeVerifier;
                IksmSessionTextBox.Text = authURL.url;

                // iksm_sessionを入力するときは空白や改行などを除去
                foreach (var cbi in _autoUpdatecomboBoxItems.Select(item => new ComboBoxItem {
                    Content = item.Key
                }))
                {
                    AutoUpdateTimeComboBox.Items.Add(cbi);
                }

                _autoUpdateTimer = new DispatcherTimer {
                    Interval = new TimeSpan(0, 0, 0, 0, 500)
                };
                _autoUpdateTimer.Tick += AutoUpdateTimerElapsed;

                ChangeViewGrid(SessionGrid);
                var ud = DataManager.LoadConfig();
                if (ud.iksm_session == null)
                {
                    return;
                }
                if (await TryInitializeSessionWindow(ud.iksm_session))
                {
                    ChangeViewGrid(MainGrid);
                    return;
                }

                if (ud.session_token == null)
                {
                    return;
                }
                sessionToken = ud.session_token;
                var cookie = await SplatNet2SessionToken.GetCookie(sessionToken);

                if (await TryInitializeSessionWindow(cookie))
                {
                    ChangeViewGrid(MainGrid);
                    return;
                }

                MessageBox.Show("ログインに失敗しました。\n初回起動時と同様、手動でログイン手順を踏んでください。", "ログインに失敗しました", MessageBoxButton.OK,
                                MessageBoxImage.Hand);
            }
            finally
            {
                UnLockUpdate();
                if (await UpdateManager.CheckUpdate())
                {
                    await UpdateManager.ShowUpdateWindow();
                }
            }
        }