直近 2 年ほど、健康の増進を主な目的とし、有酸素運動や筋力トレーニングを行っている。 その延長線上で審美的な観点でのボディメイクも目的としている。 今後も有酸素運動や筋力トレーニングを継続しようと考えているが、同時に情報発信をしていければと考えている。 健康や審美に関わる事柄は、どのような方針の下での活動かが重要になるかと考えているため、自分の背景や考えをまず記しておく。
2020 年のはじめにコロナウィルスが流行し始めた。 それに伴って、自分の本職である IT エンジニア (i.e., SRE, DevOps Engineer) の業務が基本リモートに移行した。 徒歩と電車による通勤がなくなり、それらによるストレスがなくなるというメリットはあったものの、デメリットもあった。 主には体力の低下だった。
リモートによる業務が 1 年くらい継続し、外出する頻度が1週間に1回ほどの近所への買い物程度になった。 そんな生活を過ごしていたのだが、ある日のこと、家から徒歩 1 分のコンビニに買い物に行った際、 階段でやや息切れがしたことに加え、翌日に筋肉痛が来た。 あまりの体力の低下に危機感を覚え、筋力低下や運動不足による健康への影響を考慮し、 明確に運動する機会を設けようと考えたことが最初のきっかけだった。
運動不足を解消するためにまず行ったのはランニングである。 2021 年冬頃からランニングは下記のような強度と頻度で行った。
上記のランニングをおおよそ半年くらい続けたところ、体力が戻ってきた感覚があった。 何より食事が美味しかったという記憶がある。 体力が戻ってきたため、ステップアップとして近所の大手スポーツジムを契約したのが 2021 年の夏頃だったかと思う。
2021 年の夏から 2023 年の夏 (現在) までのトレーニング内容や頻度を簡単に紹介する。
2021 年の夏頃にジムを契約してから 半年ほどは週に 1 回の頻度でジムに通い筋力トレーニングとエアロバイクによる有酸素運動を行った。 その半年後、2022 年の初頭から下記を並行して行うようにした。
土曜にランニングを行い、日曜にジムに行き筋力トレーニングをする、ということが多かったと思う。 体重はあまり増やしたくなかったため、体重の増減はほぼなく、あっても +2 kg ほどだったかと思う。
2022 年の夏あたりから筋肥大を明確に目指すようになり、ジムに行く頻度を増やした。 有酸素運動をジム内のトレッドミルやエアロバイクで代用し、路上でのランニングはほとんど行わなくなった。 2023 年の夏 (現在) においてはおおよそ週に 2 〜 3 回程度ジムに行き筋力トレーニングと有酸素運動を行っている。 2023 年の夏において、体重は 1 年前と比較し +5kg 程度増加し、体脂肪は 13 %程度を推移している。
トレーニングを始めてから得られたメリットとしては下記がある。
これらについてはまた別の機会に詳しく述べられればと思うが、健康面では期待以上の成果があったように思う。 デメリットとしては、筋肥大の影響で以前着ていた服がややきつくなったことくらいかと思う。 特に太ももの周囲が大きくなったことにより、ズボンがきつくなった。
前述の通り、自分は健康の増進のために有酸素運動や筋力トレーニングを始めた。 このため、健康に悪影響が出るような行為は行いたくないと考えている。 健康への考え方は十人十色あり、すべての健康への悪影響を考慮することは難しいと思うが、 自分は一つの尺度として、WADA (JADA) が定めるアンチ・ドーピングの基準に準拠する方針としている。 具体的には食品やサプリメントの成分などについては global DRO (https://www.globaldro.com/home/index) で調べ、 禁止薬物に指定されていないことを確認してから摂取するようにしている。 この基準に従うことで、ある程度の一般性を保った情報 (体験談) を提供できると考えている。
フィットネスに関連する一部の業界においては、禁止薬物の使用が前提になっている雰囲気がある。 このため、アンチ・ドーピングの方針を取っていることを明確に意思表示をすることは有意義であると考えている。
]]>Google Cloud (GCP) のサービスアカウントのトークンを用いて認証し、AWS の機能を利用してみた。
AWS を AWS の外から利用するには、IAM User とそれに付随するアクセスキーを発行して認証することが 簡単かと思われる。しかしながら、アクセスキーは長期的な認証情報のため、 セキュリティ面でのリスクが高く、なるべく用いることは避けたい。
今回、GCP のサービスアカウントを経由して認証することを試みた。 この方式であれば、GCP 内のメタデータサーバからの一時的なトークンによる認証、 もしくは個人の Google アカウントによる認証を用いることができる。 これによって、アクセスキーを用いる必要がなくなり、セキュリティリスク (e.g. クレデンシャルの漏洩) や運用コスト (e.g. 鍵のローテーション) を低減することできる。
今回は個人に紐づく Google アカウント から Google のサービスアカウント
(以下、GSA とする) の一時トークンを生成し、AWS のトークンを取得し、
aws
コマンドを実行する、ということを試みる。
gcloud iam service-accounts create aws-user
gcloud iam service-accounts describe aws-user@{{ google_project_id }}.iam.gserviceaccount.com --format=json
{
"email": "aws-user@{{ google_project_id }}.iam.gserviceaccount.com",
"etag": "{{ etag }}",
"name": "projects/{{ google_project_id }}/serviceAccounts/aws-user@{{ google_project_id }}.iam.gserviceaccount.com",
"oauth2ClientId": "{{ aws-user_client_id }}",
"projectId": "{{ project_id }}",
"uniqueId": "{{ gsa_unique_id }}"
}
gcloud iam service-accounts add-iam-policy-binding \
\
aws-user@{{ google_project_id }}.iam.gserviceaccount.com --member=user:{{ google_account_id }} \
--role=roles/iam.serviceAccountTokenCreator
下記の内容は上記の AWS ドキュメントに記載されている内容である。
curl https://accounts.google.com/.well-known/openid-configuration | jq -r .jwks_uri
↑のようにして account.google.com の jwks 配信サーバの URL ↓を取得する。
https://www.googleapis.com/oauth2/v3/certs
エンドポイントは https://www.googleapis.com であることがわかったので、 このhttpsサーバで用いられている証明書の fingerprint を確認する。
openssl s_client -showcerts -servername www.googleapis.com -connect www.googleapis.com:443 < /dev/null
↑を実行すると↓のような文字列が確認できるが、www.googleapis.com は中間認証局
GTS CA 1O1
とルート認証局 GlobalSign
によって署名されていることがわかる。
depth=2 OU = GlobalSign Root CA - R2, O = GlobalSign, CN = GlobalSign
verify return:1
depth=1 C = US, O = Google Trust Services, CN = GTS CA 1O1
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google LLC, CN = upload.video.google.com
verify return:1
複数の証明書が表示される場合は、表示される最後 (コマンド出力の最後) の証明書を見つけます。
今回は中間認証局 GTS CA 1O1
の証明書が最後に出力されていることから、
中間認証局 GTS CA 1O1
の証明書の fingerprint を AWS 側に登録する。
depth=0
-----BEGIN CERTIFICATE-----
MIIGVDCCBTygAwIBAgIRAMOFqvhu2qDOBQAAAACHvBYwDQYJKoZIhvcNAQELBQAw
QjELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFUdvb2dsZSBUcnVzdCBTZXJ2aWNlczET
MBEGA1UEAxMKR1RTIENBIDFPMTAeFw0yMTA0MTMxMDE2MDdaFw0yMTA3MDYxMDE2
MDZaMHExCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
Ew1Nb3VudGFpbiBWaWV3MRMwEQYDVQQKEwpHb29nbGUgTExDMSAwHgYDVQQDExd1
cGxvYWQudmlkZW8uZ29vZ2xlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA
BGMcGq3tTfwQRLn3HLmu9swf8XqLf3FfG0TbAGeXdssiOuN8nPkK5Ori+fYemhjq
EyEH2Xn27KZKMc7Tz06TDqCjggPfMIID2zAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0l
BAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUNyC3kUnyEuo2
WGSsJ1FQ5Yf12FUwHwYDVR0jBBgwFoAUmNH4bhDrz5vsYJ8YkBug630J/SswaAYI
KwYBBQUHAQEEXDBaMCsGCCsGAQUFBzABhh9odHRwOi8vb2NzcC5wa2kuZ29vZy9n
dHMxbzFjb3JlMCsGCCsGAQUFBzAChh9odHRwOi8vcGtpLmdvb2cvZ3NyMi9HVFMx
TzEuY3J0MIIBmAYDVR0RBIIBjzCCAYuCF3VwbG9hZC52aWRlby5nb29nbGUuY29t
ghQqLmNsaWVudHMuZ29vZ2xlLmNvbYIRKi5kb2NzLmdvb2dsZS5jb22CEiouZHJp
dmUuZ29vZ2xlLmNvbYITKi5nZGF0YS55b3V0dWJlLmNvbYIQKi5nb29nbGVhcGlz
LmNvbYITKi5waG90b3MuZ29vZ2xlLmNvbYITKi51cGxvYWQuZ29vZ2xlLmNvbYIU
Ki51cGxvYWQueW91dHViZS5jb22CFyoueW91dHViZS0zcmQtcGFydHkuY29tghti
Zy1jYWxsLWRvbmF0aW9uLWFscGhhLmdvb2eCHGJnLWNhbGwtZG9uYXRpb24tY2Fu
YXJ5Lmdvb2eCGWJnLWNhbGwtZG9uYXRpb24tZGV2Lmdvb2eCFWJnLWNhbGwtZG9u
YXRpb24uZ29vZ4IRdXBsb2FkLmdvb2dsZS5jb22CEnVwbG9hZC55b3V0dWJlLmNv
bYIfdXBsb2Fkcy5zdGFnZS5nZGF0YS55b3V0dWJlLmNvbTAhBgNVHSAEGjAYMAgG
BmeBDAECAjAMBgorBgEEAdZ5AgUDMDMGA1UdHwQsMCowKKAmoCSGImh0dHA6Ly9j
cmwucGtpLmdvb2cvR1RTMU8xY29yZS5jcmwwggEGBgorBgEEAdZ5AgQCBIH3BIH0
APIAdwD2XJQv0XcwIhRUGAgwlFaO400TGTO/3wwvIAvMTvFk4wAAAXjK8hsOAAAE
AwBIMEYCIQCavqW8CdwK7hXvDYsaAorTCQqKYz26MfnyMXv8q2WfQQIhAOH2M4fa
VTz4yOUQ86RdmRIRaLCKTCvHcJ74ufdC264BAHcARJRlLrDuzq/EQAfYqP4owNrm
gr7YyzG1P9MzlrW2gagAAAF4yvIbSAAABAMASDBGAiEA5AuJL4jq01XnkwWUa4v+
eTkZDcsn9fRGRwPp/2+N+2ECIQDI8SEiaM1lwEAMvEjCudSVhhAsspRsZsf8wKOI
Geh68DANBgkqhkiG9w0BAQsFAAOCAQEAarNIFB1qGp3V96Y7oVADfwhPEGXCszY4
TkhJ9sNb2LWi1o0LzZMR9a/rfyfb8Q6eaP0+2ObY8xlQLNXrXJ+eOXnwTxqq99tT
9/7mEXXr72Fyaag8/uQTm3cNJGPX+XabQRt7r3VzgMtVowWdxcNFoCWTDQUXkloP
Bbap0YsrJy4wcAQqKUihjVVxez0oT5HejbhNamjUMYccQj3MO5akFW5/v8RNBKWM
nWAX5pxKf1qH8nwo6q/2lFKny879Lvv1Knru0P3XI9X+bnuTFxQuANVVf5AiEEJx
H8DdtkxrjS5u5vpSeciULGmfoGkS6weamvG75a/2Xi3kYYpOh68dAg==
-----END CERTIFICATE-----
depth=1
-----BEGIN CERTIFICATE-----
MIIESjCCAzKgAwIBAgINAeO0mqGNiqmBJWlQuDANBgkqhkiG9w0BAQsFADBMMSAw
HgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFs
U2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjAeFw0xNzA2MTUwMDAwNDJaFw0yMTEy
MTUwMDAwNDJaMEIxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVHb29nbGUgVHJ1c3Qg
U2VydmljZXMxEzARBgNVBAMTCkdUUyBDQSAxTzEwggEiMA0GCSqGSIb3DQEBAQUA
A4IBDwAwggEKAoIBAQDQGM9F1IvN05zkQO9+tN1pIRvJzzyOTHW5DzEZhD2ePCnv
UA0Qk28FgICfKqC9EksC4T2fWBYk/jCfC3R3VZMdS/dN4ZKCEPZRrAzDsiKUDzRr
mBBJ5wudgzndIMYcLe/RGGFl5yODIKgjEv/SJH/UL+dEaltN11BmsK+eQmMF++Ac
xGNhr59qM/9il71I2dN8FGfcddwuaej4bXhp0LcQBbjxMcI7JP0aM3T4I+DsaxmK
FsbjzaTNC9uzpFlgOIg7rR25xoynUxv8vNmkq7zdPGHXkxWY7oG9j+JkRyBABk7X
rJfoucBZEqFJJSPk7XA0LKW0Y3z5oz2D0c1tJKwHAgMBAAGjggEzMIIBLzAOBgNV
HQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1Ud
EwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFJjR+G4Q68+b7GCfGJAboOt9Cf0rMB8G
A1UdIwQYMBaAFJviB1dnHB7AagbeWbSaLd/cGYYuMDUGCCsGAQUFBwEBBCkwJzAl
BggrBgEFBQcwAYYZaHR0cDovL29jc3AucGtpLmdvb2cvZ3NyMjAyBgNVHR8EKzAp
MCegJaAjhiFodHRwOi8vY3JsLnBraS5nb29nL2dzcjIvZ3NyMi5jcmwwPwYDVR0g
BDgwNjA0BgZngQwBAgIwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly9wa2kuZ29vZy9y
ZXBvc2l0b3J5LzANBgkqhkiG9w0BAQsFAAOCAQEAGoA+Nnn78y6pRjd9XlQWNa7H
TgiZ/r3RNGkmUmYHPQq6Scti9PEajvwRT2iWTHQr02fesqOqBY2ETUwgZQ+lltoN
FvhsO9tvBCOIazpswWC9aJ9xju4tWDQH8NVU6YZZ/XteDSGU9YzJqPjY8q3MDxrz
mqepBCf5o8mw/wJ4a2G6xzUr6Fb6T8McDO22PLRL6u3M4Tzs3A2M1j6bykJYi8wW
IRdAvKLWZu/axBVbzYmqmwkm5zLSDW5nIAJbELCQCZwMH56t2Dvqofxs6BBcCFIZ
USpxu6x6td0V7SvJCCosirSmIatj/9dSSVDQibet8q/7UK4v4ZUN80atnZz1yg==
-----END CERTIFICATE-----
中間認証局の証明書を /tmp/depth_1.pem
として保存する。
openssl x509 -fingerprint < /tmp/depth_1.pem
↑の openssl
コマンドで fingerprint ↓を得る。
SHA1 Fingerprint=DF:E2:07:0C:79:E7:FF:36:A9:25:FF:A3:27:FF:E3:DE:EC:F8:F9:C2
echo DF:E2:07:0C:79:E7:FF:36:A9:25:FF:A3:27:FF:E3:DE:EC:F8:F9:C2 | tr -d ":" | tr "[[:upper:]]" "[[:lower:]]"
実際に利用する値はコロンを除いた小文字になるため、↑で加工した値 ↓ を利用する。
dfe2070c79e7ff36a925ffa327ffe3deecf8f9c2
前項で得た fingerprint を用いて OIDC プロバイダ accounts.google.com を作成する。
aws iam create-open-id-connect-provider \
--url https://accounts.google.com \
--thumbprint-list dfe2070c79e7ff36a925ffa327ffe3deecf8f9c2
aws iam add-client-id-to-open-id-connect-provider \
--open-id-connect-provider-arn "arn:aws:iam::{{ aws_account_id }}:oidc-provider/accounts.google.com" \
--client-id {{ gsa_unique_id }}
gsa-aws-user.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::{{ aws_account_id }}:oidc-provider/accounts.google.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"accounts.google.com:aud": "{{ gsa_unique_id }}",
"accounts.google.com:sub": "{{ gsa_unique_id }}",
"accounts.google.com:oaud": "arn:aws:iam::{{ aws_account_id }}:oidc-provider/accounts.google.com",
"accounts.google.com:email": "aws-user@{{ google_project_id }}.iam.gserviceaccount.com"
}
}
}
]
}
aws iam create-role --role-name gsa-aws-user --assume-role-policy-document file://gsa-aws-user.json
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-sourcing-external.html
~/.aws/config
の credential_process
という仕組みを用い、
GSA のトークンからAWSの認証情報を作成するための設定を行う。
下記の gsa-oidc.sh
を PATH が通っている場所に配置する。
#!/bin/bash
set -eu -o pipefail
# ${1}:
# gcloud configuration name.
# (if you want to use current configuration, set empty "" string.)
# ${2}:
# Google Cloud service account's email.
# ${3}:
# AWS account id.
# ${4}:
# AWS role name.
GCLOUD_CONFIGURATION=${1}
GSA_EMAIL=${2}
AWS_ACCOUNT=${3}
AWS_ROLE_NAME=${4}
GCLOUD="gcloud --configuration=${GCLOUD_CONFIGURATION}"
GCLOUD_ACCOUNT=$(${GCLOUD} config get-value account)
AUDIENCE="arn:aws:iam::${AWS_ACCOUNT}:oidc-provider/accounts.google.com"
GSA_ID_TOKEN=$(${GCLOUD} --impersonate-service-account=${GSA_EMAIL} auth print-identity-token --audiences=${AUDIENCE} --include-email)
AWS_ROLE_ARN="arn:aws:iam::${AWS_ACCOUNT}:role/${AWS_ROLE_NAME}"
AWS_ROLE_SESSION_NAME="gsa-oidc-${GCLOUD_ACCOUNT}"
aws --profile gsa-oidc sts assume-role-with-web-identity \
--role-arn "${AWS_ROLE_ARN}" \
--role-session-name "${AWS_ROLE_SESSION_NAME}" \
--web-identity-token "${GSA_ID_TOKEN}" \
| jq "{Version: 1} + .Credentials"
実行権限を付与しておく。
chmod a+x gsa-oidc.sh
gcloud config configurations create aws-user
gcloud config set project {{ google_project_id }}
gcloud auth login {{ google_account_email }}
[profile gsa-oidc]
output = json
[profile gsa-aws-user]
credential_process = gsa-oidc.sh aws-user aws-user@{{ google_project_id }}.iam.gserviceaccount.com {{ aws_account_id }} gsa-aws-user
aws --profile gsa-aws-user sts get-caller-identity | jq -r .Arn
↑を実行すると↓のような出力を得られる。
arn:aws:sts::{{ aws_account_id }}:assumed-role/gsa-aws-user/gsa-oidc-{{ google_account_email }}
これで AssumeRole を GSA の認証情報を用いて行えることがわかった。
あとはロール aws-user に適切なポリシーを付与すれば、各種 AWS の機能を使えるようになる。
中間認証局 GTS CA 1O1
の証明書の情報を確認する。
openssl x509 -text <<_EOS_
-----BEGIN CERTIFICATE-----
MIIESjCCAzKgAwIBAgINAeO0mqGNiqmBJWlQuDANBgkqhkiG9w0BAQsFADBMMSAw
HgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFs
U2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjAeFw0xNzA2MTUwMDAwNDJaFw0yMTEy
MTUwMDAwNDJaMEIxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVHb29nbGUgVHJ1c3Qg
U2VydmljZXMxEzARBgNVBAMTCkdUUyBDQSAxTzEwggEiMA0GCSqGSIb3DQEBAQUA
A4IBDwAwggEKAoIBAQDQGM9F1IvN05zkQO9+tN1pIRvJzzyOTHW5DzEZhD2ePCnv
UA0Qk28FgICfKqC9EksC4T2fWBYk/jCfC3R3VZMdS/dN4ZKCEPZRrAzDsiKUDzRr
mBBJ5wudgzndIMYcLe/RGGFl5yODIKgjEv/SJH/UL+dEaltN11BmsK+eQmMF++Ac
xGNhr59qM/9il71I2dN8FGfcddwuaej4bXhp0LcQBbjxMcI7JP0aM3T4I+DsaxmK
FsbjzaTNC9uzpFlgOIg7rR25xoynUxv8vNmkq7zdPGHXkxWY7oG9j+JkRyBABk7X
rJfoucBZEqFJJSPk7XA0LKW0Y3z5oz2D0c1tJKwHAgMBAAGjggEzMIIBLzAOBgNV
HQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1Ud
EwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFJjR+G4Q68+b7GCfGJAboOt9Cf0rMB8G
A1UdIwQYMBaAFJviB1dnHB7AagbeWbSaLd/cGYYuMDUGCCsGAQUFBwEBBCkwJzAl
BggrBgEFBQcwAYYZaHR0cDovL29jc3AucGtpLmdvb2cvZ3NyMjAyBgNVHR8EKzAp
MCegJaAjhiFodHRwOi8vY3JsLnBraS5nb29nL2dzcjIvZ3NyMi5jcmwwPwYDVR0g
BDgwNjA0BgZngQwBAgIwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly9wa2kuZ29vZy9y
ZXBvc2l0b3J5LzANBgkqhkiG9w0BAQsFAAOCAQEAGoA+Nnn78y6pRjd9XlQWNa7H
TgiZ/r3RNGkmUmYHPQq6Scti9PEajvwRT2iWTHQr02fesqOqBY2ETUwgZQ+lltoN
FvhsO9tvBCOIazpswWC9aJ9xju4tWDQH8NVU6YZZ/XteDSGU9YzJqPjY8q3MDxrz
mqepBCf5o8mw/wJ4a2G6xzUr6Fb6T8McDO22PLRL6u3M4Tzs3A2M1j6bykJYi8wW
IRdAvKLWZu/axBVbzYmqmwkm5zLSDW5nIAJbELCQCZwMH56t2Dvqofxs6BBcCFIZ
USpxu6x6td0V7SvJCCosirSmIatj/9dSSVDQibet8q/7UK4v4ZUN80atnZz1yg==
-----END CERTIFICATE-----
_EOS_
↑を行うと↓のような出力を得られる。
:
Validity
Not Before: Jun 15 00:00:42 2017 GMT
Not After : Dec 15 00:00:42 2021 GMT
:
中間認証局の証明書が 2021/12/15 に失効するため、 中間認証局の証明書の fingerprint を更新する仕組みが必要になる。
強凸二次形式の最小元と最小値を求めるために、二次形式の平方完成をしました。
まずは元の式と平方完成した後の式を比較します。 \(Q\) は対称行列で、 \(q\) は一次式の係数ベクトルです。
\[ \begin{align*} f(x) &= x^T Q x + q^T x \text{ (二次形式)}\\ &= (x + z)^T Q (x + z) + c \text{ (平方完成後)}\\ &= x^T Q x + 2 z^TQx + z^TQz + c \end{align*} \]
係数を比較することによって以下の等式が成り立ちます。
\[ \begin{align*} 2 z^TQ &= q^T \\ z^TQz + c &= 0 \end{align*} \]
\(|Q| \neq 0\) (逆行列が存在) と仮定すると、 以下のようにzとcが求まります。
\[ \begin{align*} z &= \frac{1}{2} Q^{-1} q \\ c &= -z^TQz = -\frac{1}{4} q^T Q^{-1} q \end{align*} \]
\(Q \succ 0\) の場合、最小元と最小値は以下のように表されます。
\[\begin{align*} \text{(最小元) } &= -z = -\frac{1}{2} Q^{-1} q \\ \text{(最小値) } &= c = -z^TQz = -\frac{1}{4} q^T Q^{-1} q \end{align*}\]
]]>