Ubuntu上でアスカを動かす(成功)

前回記事(Ubuntu上でアスカを動かす(できなかった時のログ))の続き?
続きというほどではないが、やったこととしては続き
もしUbuntuでアスカを動かしたいという人がいるのであれば、この記事を中心にトライしてほしい
それをLinux(Ubuntu18.04)上でWineを使って動かしてみる。

環境

ということで、改めて環境

ハード:core i7 6800K / 32GB / GTX1080
メインPC(ホストOS):Windows 10 pro
VMware:WM ware Workstation 15 Player / 15.5.7 build-17171714
Linux環境(ゲストOS):Ubuntu 18.04.05 LTS

$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="18.04.5 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.5 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

聞いた話からVM環境再設定

前回の記事でも書いてあるが、結局あれから色々やったがだめだった
ということで、予定地さんへ聞いた
DLL等は入れず、wine-developmentのversion 5.0で動くとのこと
あと、VMwareの3Dアクセラレートを無効化も必要らしい
予定地さんのUbuntuは20 らしいが、PPAをやっていたときは、出たか出てないか、ギリギリの時期だったはず(超曖昧記憶)なので、後回し

VMwareの3Dアクセラレータ

VMwareの3Dアクセラレータが描画周りを邪魔して、落ちるらしい
ゲストOSを止めて、設定→ディスプレイから3Dアクセラレータを無効化(下記画像)
これでおk
VirtualboxやらHyperV、WSLなんかはわからないが、このあたり気をつける必要はあるだろう

Wine環境

wineを5.0にする

まず現wine環境

$ wine --version
wine-3.0 (Ubuntu 3.0-1ubuntu1)

やはりというか、バージョンが低い
wine 5.0以上へ更新しようと思うが、apt installで入れただけなので、公式のパッケージは3.0なのだろう
buildして入れるか、なにかしないと行けなさそうだ

Ubuntu 18.04に最新のWINE(5.0.0)をインストールする – 330k info https://www.330k.info/essay/install-wine5-to-ubuntu-18.04/
ここを参考にwine 5.0を入れる
Ubuntu18.04まで同じ環境の人がいるとは

最後まで読んでからであれば気づくが、WineHQに記載のコマンドを実施する前にもう一つレポジトリ追加をする必要がある。
レポジトリURLは環境によって多少変わるだろう。
https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/
ここから環境のRelease.keyを探して、apt-keyに突っ込む

$ wget https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/Release.key
$ sudo apt-key add Release.key
$ sudo apt-add-repository 'deb https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/ ./'
$ rm Release.key
$ sudo apt update

何か入れる必要はない(というか依存関係のパッケージを入れるために必要みたいなそんな感じ)
あとはwinehqからwine 5.0を入れる

$ sudo dpkg --add-architecture i386 
$ wget -nc https://dl.winehq.org/wine-builds/winehq.key
$ sudo apt-key add winehq.key
$ sudo apt-add-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ bionic main'
$ rm winehq.key
$ sudo apt update
$ sudo apt install --install-recommends winehq-stable

これだけでwineの5.0以上が入る
2021/05/07の時点ではwine 6.0が入った

$ wine --version
wine-6.0

wine-developmentを入れる必要があるかどうかはわからないが、
winehq-stableを入れてる状態でwine-developmentを入れるとwinehq-stableが削除され、wine-3.6が入った、そしてアスカは起動しなかった(アスカ起動後検証)
ちなみにwinehq-developmentはない
wineでDLLコンポーネント類は入れる必要なかった

アスカ起動

あとはアスカがあるフォルダでアスカを起動するだけ
前回記事に書いてあるが、Ubuntuに入っているアスカはWindowsにインストールしたあとのフォルダ(C:\Program Files (x86)\CHUNSOFT\AsukaPC)をオフライン化パッチNoCDパッチを当てたバックアップもの

前回記事からwyxe
アスカはCDをISO化して、バックアップしていた。
メインPCにはAsukaPlusが導入されており、VM上のWin10は開発者オプションを付けてAsukaToolsを動かす試みを行って断念したままも状態だった。なので2016年の評価版Win10のVM上でそのISOをマウントして、インストール
そのインストールしたexe郡をそのままNASに入れてバックアップしたものを用意したしていた
→あとに出てくるが、オフライン化パッチを当てる必要があったので、当てたexe郡を更にpatchedとしてバックアップ。それをUbuntuに持ってきて利用した
セーブデータ管理に使われるレジストリ関係はノータッチ

~/CHUNSOFT/AsukaPC$ ls
 00000000.016
 00000000.256
 AsfPc.OLD
 AsfPc.exe
 Asuka.chm
 CheckAppExec.exe
 DrvMgt.dll
 EPatch.exe
 ERROR.LOG
 Loader.exe
 SECDRV.SYS
'[NoCD Patch] 風来のシレン外伝 女剣士アスカ見参! Ver.1.7.0.0..EXE'
 data
 dev_caps.csv
 save
 使用許諾契約書.txt
~/CHUNSOFT/AsukaPC$ wine AsfPc.exe 

前回試行錯誤(.Net周りを入れたり色々した)したせいか、monoやらgeckoやらwineの設定でいくつかが入った。全部OKでおk
今度は起動した!!
ムービーはasf周りが入っていないので、ムービーの再生に失敗しましたはでる
wmvではないんだね、似たようなものだとは思うが

アスカ、起動ムービー失敗画面

ムービー失敗中のwine出力は以下の通り

01c8:err:gstreamer:unknown_type Could not find a filter for caps: "video/x-ms-asf"
01c8:err:gstreamer:watch_bus decodebin0: GStreamer はプラグインを見つけることができません
01c8:err:gstreamer:watch_bus gstdecodebin2.c(4679): gst_decode_bin_expose (): /GstBin:bin0/GstDecodeBin:decodebin0:
no suitable plugins found:
Missing decoder: Advanced Streaming Format (ASF) (video/x-ms-asf)

0024:err:gstreamer:gstdecoder_init_gst Failed to play stream.

OPムービーなんていいんだよ!OKOK

Ubuntuでアスカ起動画面
https://twitter.com/meto4d/status/1390877748944539651

ちゃんと動いた!!!
やったね!
32bit版の問題もあるが、パッケージ入れるときにi386は指定して、ちゃんとそれが入っているので、環境変数周りを設定する必要もないようだ

$ apt list --installed | grep wine
(抜粋)
wine-stable/bionic,now 6.0.0~bionic-1 amd64 [インストール済み]
wine-stable-amd64/bionic,now 6.0.0~bionic-1 amd64 [インストール済み、自動]
wine-stable-i386/bionic,now 6.0.0~bionic-1 i386 [インストール済み、自動]

まとめ

32bitを含めたwine version5.0以上のstableを入れるだけでアスカが動いた
VMwareの場合は3Dアクセラレータ無効化の必要もある
じゃあ次はwineのコンテナやMacで試してみたいな
コンテナでやる場合はGUIをどうするかという問題が先に解決すべき部分だな

ありがとう予定地さん!

 48 total views

Ubuntu上でアスカを動かす(できなかった時のログ)

風来のシレン外伝「女剣士アスカ見参!」for Windowsは2002年12月20日に発売されたWindows用ゲームである。
それをLinux(Ubuntu18.04)上でWineを使って動かしてみる。
結論としてはできなかった。が、何をしてできなかったかを残す。
日記だしね

背景

昔、自分はTwitchPlaysPokemon*1にはまり込んでいた
USE HELIX!!ヽ༼ຈل͜ຈ༽ノ RIOT ヽ༼ຈل͜ຈ༽ノ

今でもたまに見るし、コマンド送信して遊ぶ
そんな思い入れもあり、某配信でそういう話をしてたら、やってくれた。
ペカ界隈で賑わせていたPeercastPlaysAsuka(通称PPA)*2
あれがめちゃくちゃおもしろかったslz

アレはUbuntu(だったかな?)上のwineでアスカを動かしていたので、Linuxでアスカはできるんだ!と感動した
wineというのがあるとは知っていたし、某大学の地下室の実験室はポンコツPCのVineでwineで頑張るなんていう糞環境を使ったこともあった。(さすがに変わっているといいなあの環境は)
知識としては知っていたが、ちゃんと動作しているところを見るのは始めてだった
当時はそういう意味で感動した(2回目)
あの環境を目指したい

加えて、最近なんでコンテナコンテナってやってるかというと、
アスカは面白いんだが、感覚的にやはりWin10環境だと乱数の偏りが違うように感じたり、GTAなどのハック系ゲームがWin10環境だと遊びにくい
そこでコンテナにアスカを閉じ込めてプレイできたらいいんじゃないか?と思ったので、その足がかりとして、Ubuntu18.04(VMware上)にwineを入れて、wineでアスカを動かすということを試しにやってみる。

Voiceroidをコンテナに閉じ込めた話とか聞いたことあるし、そっちもやってみたいね

*1 TwitchPlaysPokemon: Twitchのコメントでポケモンが操作されるという企画もののポケモン配信。誰かがUPとコメントすれば上が入力され、Aとコメントすると、Aが入力される。それをみんなが一斉にコメントで操作するというものだ。最近(3年前?)ポケモンルビーをプレイしながらポケモンスタジアムが動いていたりもした。
*2 PPA: TwitchPlaysPokemonのオマージュで、レスでアスカを操作する企画もののアスカ配信。

環境

2021年5月という時期にUbuntu18.04 LSTを使う
まあ、Linux環境でーってなったら職場PC(CentOS7)とかRaspberryPi(archlinux)を使うので、メインPCのVMwareに入ってるUbuntuが古い
正直VMwareに入れただけになってしまっている

1億年ぶりに起動したら、アップデート関係で結構たいへんだった
大変と言っても、1コア割当の2GBメモリだったり、起動したらしたでアップデートが走って終了できなかったり、終了させないと割り当て変更できなかったり、低スペのまま見守るしかなかったというだけだが
ということで、Ubuntu環境は以下の通り

$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="18.04.5 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.5 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

アスカはCDをISO化して、バックアップしていた。
メインPCにはAsukaPlusが導入されており、VM上のWin10は開発者オプションを付けてAsukaToolsを動かす試みを行って断念したままも状態だった。なので2016年の評価版Win10のVM上でそのISOをマウントして、インストール
そのインストールしたexe郡をそのままNASに入れてバックアップしたものを用意したしていた
→あとに出てくるが、オフライン化パッチを当てる必要があったので、当てたexe郡を更にpatchedとしてバックアップ。それをUbuntuに持ってきて利用した
セーブデータ管理に使われるレジストリ関係はノータッチ

パッケは、以前、実家に帰ってゴタゴタをしたさいに持って帰ってきたからあるよ!

Wineを入れる

まずはwine-stableを入れる
結論として、これだけでは動かなかった

$ sudo apt install wine-stable
$ wine AsfPc.exe 
0027:err:ntdll:RtlpWaitForCriticalSection section 0x7bd017c0 "loader.c: loader_section" wait timed out in thread 0027, blocked by 0028, retrying (60 sec)

たしかにppaの最初そんな話をしていた記憶がある

wine-developmentを入れて、こっちでやってみる
こっちなら動いた

$ sudo apt install wine-development
$ wine AsfPc.exe

Windowsのスタートメニューにある風来のシレンアスカ見参のショートカットからはLoader.exeを起動しているが、アスカ見参の実態はAsfPc.exeなので、こちらをwineで叩く

アスカ初回起動シーン

そりゃそうだわw
パッチ当てたりNoCDを入れたりする

オフライン化パッチを当てたバックアップファイルにNoCDを入れたものを再度wine実施

$ wine AsfPc.exe 
0009:err:d3d:resource_init Out of adapter memory
0009:err:ddraw:ddraw_create_swapchain Failed to create swapchain, hr 0x8876017c.
0009:err:ddraw:ddraw_set_cooperative_level Failed to create swapchain, hr 0x8876017c.
0009:err:d3d:resource_init Out of adapter memory
0009:err:d3d:resource_init Out of adapter memory
0009:err:ddraw:ddraw_create_swapchain Failed to create swapchain, hr 0x8876017c.
0009:err:ddraw:ddraw_set_cooperative_level Failed to create swapchain, hr 0x8876017c.

うーん

D3Dのメモリを変えてみる

$ wine regedit
→これでレジストリエディタを動かせる
これだからLinuxは

マルチバイトが豆腐になってる
というか、なんでわざわざ日本語で起動してくれるんだ
Ubuntuの言語設定読んでるのかな?
ここを参考にフォント入れる。これでOKだった
Wineの文字化けを直す方法 | ばったんの技術系ブログ

ここら辺を参考にメモリというかDirect3D設定を弄ってみる
Manually set VideoMemorySize | Knowledge Base | CodeWeavers
Wine/d3d:resource_init Out of adapter memory[SOLVED] – Linux Mint Forums
書いてあるように、Direct3Dキーを作ってプロパティを書く
HKEY_CURRENT_USER/Software/Wine → Direct3Dを作って、VideoMemorySizeを型REG_SZ(文字列値)で作って512にでも設定

レジストリ設定後

再度wine AsfPc.exe

アスカ起動成功?失敗?

おっ?!おおっ!?
ここまですんなり動くなあ

確かアスカのムービーはWMVで作られていて、Linuxにはそのデコーダがないので、再生に失敗するのを覚えている
そのまま再生に失敗しましたメッセージでゲームが続行したはずだが、完全にフリーズして動かない
後々WMVのデコーダを入れて再生するようにした記憶もあるが、、、
一回強制終了

何もせず2回目起動
変わったエラーを吐いてそのまま終了した

$ wine AsfPc.exe 
0009:err:d3d:wined3d_swapchain_update_swap_interval_cs wglSwapIntervalEXT failed to set swap interval 1 for context 0x16f950, last error 0x591
0009:err:d3d:wined3d_swapchain_update_swap_interval_cs wglSwapIntervalEXT failed to set swap interval 1 for context 0x16f950, last error 0x591
0009:err:d3d:wined3d_swapchain_update_swap_interval_cs wglSwapIntervalEXT failed to set swap interval 1 for context 0x164190, last error 0x591
0009:err:d3d:wined3d_swapchain_update_swap_interval_cs wglSwapIntervalEXT failed to set swap interval 1 for context 0x16c098, last error 0x591
0009:err:quartz:GetClassMediaFile Media class not found
0043:err:seh:raise_exception Unhandled exception code c0000005 flags 0 addr 0x274d258
0037:err:eventlog:ReportEventW L"6"
0037:err:eventlog:ReportEventW L"7"

3回目起動

$ wine AsfPc.exe 
0009:err:d3d:wined3d_swapchain_update_swap_interval_cs wglSwapIntervalEXT failed to set swap interval 1 for context 0x16f950, last error 0x591
0009:err:d3d:wined3d_swapchain_update_swap_interval_cs wglSwapIntervalEXT failed to set swap interval 1 for context 0x16f950, last error 0x591
0009:err:d3d:wined3d_swapchain_update_swap_interval_cs wglSwapIntervalEXT failed to set swap interval 1 for context 0x164190, last error 0x591
0009:err:d3d:wined3d_swapchain_update_swap_interval_cs wglSwapIntervalEXT failed to set swap interval 1 for context 0x16c098, last error 0x591
0009:err:quartz:GetClassMediaFile Media class not found

はっ!!!起動するぞ!!

このあと、ムービーの再生に失敗しましたウィンドウがでて、タイトルに辿り着く前に2回目起動時と同じエラーを吐いて終了
すごく悲しくなった

そのあと、色々やってるとにっちもさっちも動かなくなったのでUbuntu再起動
ちょっと違うエラーが出た

$ wine AsfPc.exe 
0009:err:d3d:wined3d_swapchain_update_swap_interval_cs wglSwapIntervalEXT failed to set swap interval 1 for context 0x16f988, last error 0x591
0009:err:d3d:wined3d_swapchain_update_swap_interval_cs wglSwapIntervalEXT failed to set swap interval 1 for context 0x16f988, last error 0x591
0009:err:d3d:wined3d_swapchain_update_swap_interval_cs wglSwapIntervalEXT failed to set swap interval 1 for context 0x1641c8, last error 0x591
0009:err:d3d:wined3d_swapchain_update_swap_interval_cs wglSwapIntervalEXT failed to set swap interval 1 for context 0x16c0d0, last error 0x591
0009:err:quartz:GetClassMediaFile Media class not found
0046:err:seh:raise_exception Unhandled exception code c0000005 flags 0 addr 0x211140
003b:err:eventlog:ReportEventW L"6"
003b:err:eventlog:ReportEventW L"7"
0050:err:service:process_send_command service protocol error - failed to read pipe r = 0  count = 0!

どうもDirectX周りがだめらしい?
フォントを入れたときのようにwinetricksからDLLを入れる
$ winetricks
これで起動するGUIから、Install a Windows DLL or componentを選択
DirectX周りでエラーが出ているっぽい?ので、なんとなくd3dx9_43、ムービー再生にffdshowが使えるっぽい?ので、これもいれた。
ffdshowはwmv周りのオプションを全部のせで

しかし、これでも結局起動はしなかった
正確に言えば、起動はしたが、ゲーム内に進むことはなかった
基本的に2回目のエラー
0043:err:seh:raise_exception Unhandled exception code c0000005 flags 0 addr 0x274d258
0037:err:eventlog:ReportEventW L"3"
0037:err:eventlog:ReportEventW L"6"
0037:err:eventlog:ReportEventW L"7"

というエラーで終了する。
0037:err:eventlog:ReportEventW L"3"
は出たり出なかったり

結局、起動実績のある人に聞くしかなかった残念
聞いて気づいたが、VMwareの3Dアクセラレータの設定や、Wineのバージョンなど、落ち着いて考えれば気づく話ばかりだった

まとめ

結局だめでした
その後、どう動かしたか聞いて、再チャレンジ
結果動かすことができたので、別記事でまとめます。

余談

なぞのファイルだと思ってたんだけど、これ起動時に出てくるBMP画像ファイルだったんだね
解像度は同じなのにサイズが違って2つある

 34 total views,  1 views today

MyDNSのLet’s Encryptのワイルドカード自動更新を導入した

前回(Let’s Encrypt でSSLワイルドカード証明書を導入する)の続き?
MyDNSが公開しているPHPのscriptを導入して、renewが行えるようにした。

背景

もともとLet’s Encryptでワイルドカード証明書を導入する前はcertbot renewをcronに登録していて放置していた。
そしてDNSのときのと同じくこちらも無料でアラートメールをもらって気づいた
前回(Let’s Encrypt でSSLワイルドカード証明書を導入する)重い腰を上げて導入したワイルドカード証明書関係が更新できていないようだ
そのあたりを調査して、MyDNSの自動更新スクリプトを導入した。というお話
ちなみにアラートメールはこんな感じ

Let’s Encryptからのアラートメールはこんな感じ

JTrimでコピペしたんだけど、jpg圧縮の品質悪いっすね
Affinityもってるんだから、面倒臭がらないで、そっちでするべきだったか

現状

アラートメールを受けて、まずはcronに登録しているコマンドを実施確認
(と、その前にまずはcron確認)

# crontab -l
* * * * * /bin/certbot renew && /bin/systemctl reload nginx
→certbotはrootで動かしているが、他のユーザ管理にしたいね
→cronの時間は念の為マスク

# type certbot
certbot is hashed (/usr/bin/certbot)
# which certbot
/usr/bin/certbot
# ls /bin/certbot -l
-rwxr-xr-x 1 root root 960 Apr  7 10:01 /bin/certbot
# ls /usr/bin/certbot -l
-rwxr-xr-x 1 root root 960 Apr  7 10:01 /usr/bin/certbot
→ cronに登録しているcertbotが/binにたいして、certbotは/usr/binにあった
→ シンボリックリンクでもハードリンクでもない
# sha256sum /bin/certbot
2e92fb3a6ca39f7de974ca3e4161197cc347139da68484398e575ec817600587  /bin/certbot
# sha256sum /usr/bin/certbot
2e92fb3a6ca39f7de974ca3e4161197cc347139da68484398e575ec817600587  /usr/bin/certbot
→どっちとも同じハッシュで問題もなく動くが、/usrに変更
# crontab -e
crontab: installing new crontab
# crontab -l
* * * * * /usr/bin/certbot renew && /bin/systemctl reload nginx
→cronの時間は念の為マスク

certbot確認

# certbot renew
(抜粋)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/meto4d.pgw.jp.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert is due for renewal, auto-renewing...
Could not choose appropriate plugin: The manual plugin is not working; there may be problems with your existing configuration.
The error was: PluginError('An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.')
Failed to renew certificate meto4d.pgw.jp with error: The manual plugin is not working; there may be problems with your existing configuration.
The error was: PluginError('An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.')

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

プラグインエラーが起きているから--manual-auth-hookを使えとのこと

certbot certonly --manual --manual-auth-hook /path/to/http/authenticator.sh --manual-cleanup-hook /path/to/http/cleanup.sh -d secure.example.com

This will run the authenticator.sh script, attempt the validation, and then run the cleanup.sh script. Additionally certbot will pass relevant environment variables to these scripts:

User Guide — Certbot 1.15.0.dev0 documentation https://certbot.eff.org/docs/using.html#pre-and-post-validation-hooks

certbotはshell変数を読み取って認証を取る
--manual-auth-hookを指定することで認証前にスクリプトを実行して、shell変数に代入→--manual-cleanupで変数を削除
ということらしい
そもそもcertbotはワンタイムパスワードを取得して、_acme-challengeのTXTレコードにそのワンタイムパスワードを入力、それを認証局が確認して認証という手順
そのワンタイムパスワード関係をshell変数周りで解決するということ

どうもワイルドカードの場合はAPI先を変更しないといけない関係で、certbot renewだけではだめっぽい
手動で認証を取らないといけないっぽい
うーん、めんどうくさい…

MyDNSのLet’s Encrypt更新スクリプトを導入

ということで、MyDNSが公開していたLet’s Encrypt自動更新スクリプトを導入
スクリプトにPHPはちょっとなあと思っていたが、宗教的な感覚なので、重い腰を上げて導入
MyDNSのDomainInfoにこうある

3-2) Let’s Encryptのワンタイムパスワードについて

Let’s Encryptのサーバー証明書を取得する際に、ワンタイムキーをDNS情報のTXTレコードに書くこと、という説明がありますが、MyDNS.JPでは専用APIと、そのAPIを使うためのスクリプトをGitHUBで公開しています。 ですので、Linuxでご利用の場合にはこちらのスクリプトを導入されることをお勧めいたします。

自宅サーバーやVPSに使える無料のダイナミックDNS (Dynamic DNS) https://www.mydns.jp/members/#domaininfo

GitHUBにて専用APIを叩くPHPスクリプトが置かれている
ご丁寧に導入方法も書いてある
が、導入通りのwgetではなく、git cloneでとってくる
PHP8対応が挟まると更新が必要になるかもしれないしね

専用ディレクトリ(/root/cron/mydns)を作って、そこで作業
上でちょろっと書いたけど、root以外で作業させたいね

# php -v
PHP 8.0.3 (cli) (built: Mar  4 2021 13:26:46) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.3, Copyright (c) Zend Technologies
→PHP8がすでにarchのパッケージに配布されていた

# git clone https://github.com/disco-v8/DirectEdit.git
# ls
DirectEdit
# cd DirectEdit
# ls
README.md  txtdelete.php  txtedit.conf  txtregist.php
# chmod 700 *.php
# chmod 600 *.conf
# vim txtedit.conf
→mydnsのIDやパスワードを入力
→yourdomainはワイルドカード手前のサブドメインまで
→ *.meto4d.pgw.jpであればmeto4d.pgw.jp
# certbot certonly --manual \
--preferred-challenges=dns \
--manual-auth-hook /your/domain/directory/DirectEdit-master/txtregist.php \
--manual-cleanup-hook /your/domain/directory/DirectEdit-master/txtdelete.php \
-d meto4d.pgw.jp -d *.meto4d.pgw.jp \
--server https://acme-v02.api.letsencrypt.org/directory \
--agree-tos -m hogehoge@hoge \
--manual-public-ip-logging-ok

Use of --manual-public-ip-logging-ok is deprecated.
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Use of --manual-public-ip-logging-ok is deprecated.
Cert not yet due for renewal

You have an existing certificate that has exactly the same domains or certificate name you requested and isn't close to expiry.
(ref: /etc/letsencrypt/renewal/meto4d.pgw.jp.conf)

What would you like to do?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Keep the existing certificate for now
2: Renew & replace the certificate (may be subject to CA rate limits)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Renewing an existing certificate for meto4d.pgw.jp and *.meto4d.pgw.jp

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/meto4d.pgw.jp/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/meto4d.pgw.jp/privkey.pem
   Your certificate will expire on 2021-08-01. To obtain a new or
   tweaked version of this certificate in the future, simply run
   certbot again. To non-interactively renew *all* of your
   certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

前回(Let’s Encrypt でSSLワイルドカード証明書を導入する)で登録していたが、certbot certonlyでもrenew動作と同じように更新上書きしてくれる
この記事を書きながら実施する前に、テストで前回と同様のcertbot certonlyでTXTレコードを更新して、云々を実施していたので、証明書が更新済み
それでも更新するかしないかを聞かれている
Use of --manual-public-ip-logging-ok is deprecated.と言われているので、それは後で修正しよう

これでOK
あとはsystemctl reload nginxで読み込んでいる証明書を更新

Cron登録用のshellscriptを作る

上の更新をスクリプトに落とし込んでcronに登録してやる
コード表示用プラグインのせいなんだが、上はshellscriptで下はそれを実施したときのコマンド

#!/bin/bash
if test $# -eq 0 ; then
  INPUT=1
else
  if test $1 -eq 1 || test $1 -eq 2; then
    INPUT=$1
  else
    INPUT=1
  fi
fi

echo $INPUT | /usr/bin/certbot certonly --manual --preferred-challenges=dns --manual-auth-hook /root/cron/mydns/DirectEdit/txtregist.php --manual-cleanup-hook /root/cron/mydns/DirectEdit/txtdelete.php -d meto4d.pgw.jp -d *.meto4d.pgw.jp --server https://acme-v02.api.letsencrypt.org/directory --agree-tos -m hogehoge@hoge
# chmod 700 certbot.mydns.sh
# certbot.mydns.sh 1
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Cert not yet due for renewal

You have an existing certificate that has exactly the same domains or certificate name you requested and isn't close to expiry.
(ref: /etc/letsencrypt/renewal/meto4d.pgw.jp.conf)

What would you like to do?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Keep the existing certificate for now
2: Renew & replace the certificate (may be subject to CA rate limits)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): Keeping the existing certificate

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Certificate not yet due for renewal; no action taken.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Saving debug log to /var/log/letsencrypt/letsencrypt.log

ちゃんと動作しているみたいだ

# crontab -l
* * * * * /root/cron/mydns/DirectEdit/certbot.renew.mydns.sh 1; /usr/bin/certbot renew && /bin/systemctl reload nginx

定期更新の時間はmaskしてるせいで毎分実施されているように見えるが実際は違う
とはいえ、範囲で指定している
certbot renewは更新なくskippedでも正常終了で終わる(ということを今知った)
→systemctl reload nginxが勝手に挟まってしまう
これはなんとかしたいね
不用意にnginxが再ロードされてしまう。

まあ、これはv6.meto4d.pgw.jpが6/30に切れるらしいので、その更新を手動で行って、証明書更新があったときの文字列を見る→grepとかで探してあれば更新にしよう
cronはコメントアウトして、もう一度アラートメールを受け取るようにして今日は終了。

余談:更新するPHPの中身

DirectEdit/txtregist.php at master · disco-v8/DirectEdit · GitHub https://github.com/disco-v8/DirectEdit/blob/master/txtregist.php

単純にcertbotからやってくる可能性のある変数を配列に入れて、MyDNSへクエリを飛ばしているだけだった
PythonとかRubyとかもう少し管理しやすいスクリプトに書き換えて、そっちで管理してもいいかもね。

 69 total views,  2 views today

Windows10にk8sの導入とチェックとdockerと

やばい
このままじゃコンテナ開発マンになってしまう

PHP8を試したよとかpython弄ったよとかって記事を書こうと思ったのにコンテナの方ばっかりいじってる気がする


背景

k8sのingressを試したかった が一番の目的
コンテナで管理していく時、nginxでrewriteとかlocationとか分けてphpやらpythonやらに飛ばしてる部分をもうserviceでrewriteしてfast-cgi://に直接飛ばしたほうがいいんじゃないかって思った

その前段階でdocker buildで作った自前コンテナをk8sでデプロイするまでをやったよ
という備忘録

まずはwin環境にk8sを入れる(DockerDesktopから)

Docker環境導入は前記事(Docker環境を作る)から
DockerDesktopからkubernetes入れられるのは便利ね
しかも設定からEnable Kubernetesにチェック入れるだけ
インストールできたら左下によく見るk8sのマークが入る

導入されたらそれだけでkubectlコマンドが使える(だったはず(曖昧))
はるか昔にminikube入れてたから使えてたかもしれない

cmd> kubectl get node
NAME             STATUS   ROLES    AGE     VERSION
docker-desktop   Ready    master   2d11h   v1.19.7

docker-desktopというnodeが作られる
nodeにsshできるかなと思ったけど、見知らぬipが振られていたので、わからなかった
これはまた今度かな

cmd> kubectl describe node docker-desktop | grep -A 2 Address
Addresses:
  InternalIP:  192.168.yy.4
  Hostname:    docker-desktop

docker image作成

まず2種類のdocker imageを作る
前回(Docker環境を作る)のDocker環境テスト時と同様、特にいじる部分はなし
(多少のフォルダ構成は変えた)

FROM nginx:alpine
COPY nginx/nginx.conf /etc/nginx/
COPY html/index.html /usr/share/nginx/html/
<!doctype html>
<html>
<body>
<h1>Hello Nginx on Docker!</h1>
work on dokcer
</body>
</html>

これでdocker imageを作る

cmd> docker build . -t tiny-nginx:0.1
→tiny-nginx:0.1を作成する
cmd> docker image ls
REPOSITORY                           TAG                                                     IMAGE ID       CREATED         SIZE
tiny-nginx                           0.1                                                     ec5ecaba6758   9 seconds ago   22.6MB

k8sでデプロイする

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx-label
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx-label
    spec:
      containers:
      - name: tnginx
        image: tiny-nginx:0.1
        ports:
        - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: ClusterIP
  selector:
    app: nginx-label
  ports:
  - name: http
    port: 8080
    targetPort: 80
    protocol: TCP
cmd> kubectl create ns dev
namespace/dev created
念の為namespace/devを作っておく
> kubectl get svc -n dev
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
nginx-service   ClusterIP   10.99.233.150   <none>        8080/TCP   2d11h

cmd> kubectl get pod -n dev
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-6465d9766d-6h6wn   1/1     Running   0          31s
nginx-deployment-6465d9766d-784ww   1/1     Running   0          33s

cmd> kubectl exec -n dev nginx-deployment-6465d9766d-6h6wn -- bash
OCI runtime exec failed: exec failed: container_linux.go:367: starting container process caused: exec: "bash": executable file not found in $PATH: unknown
command terminated with exit code 126
→bashは入っていないようだ
cmd> kubectl exec -it -n dev nginx-deployment-6465d9766d-6h6wn -- sh
/ # nginx -v
nginx version: nginx/1.19.10
/ # cat /usr/share/nginx/html/index.html
<!doctype html>
<html>
<body>
<h1>Hello Nginx on Docker!</h1>
work on dokcer
</body>
</html>

ちゃんとlocalで作成したdocker imageがデプロイできている

localでポート開放するためにはkubectl port-forwardで実施できる
kubectl port-forward -n dev nginx-service 80:8080
だとnginx-serviceのpodを探してしまう

cmd> kubectl port-forward -n dev service/nginx-service 80:8080
Forwarding from 127.0.0.1:80 -> 80
Forwarding from [::1]:80 -> 80
■
→inputが戻らず待受状態になる

localhostへ接続

ちゃんとつながった
cmdにはアクセスが有った時Handling connection for 80が表示される
戻るにはCtrl+C

まとめ

Docker Desktop for Windowsでビルドしたimageは、k8s(Docker Desktop for Windows)で直接使える
なんてことはない簡単だった

 36 total views,  1 views today

Archlinuxのnetctlやらresolvconfやらの設定小話

resolv.confではない
resolvconfの設定
知らなかったこんなの

背景

うちで使っているDNSサーバはMyDNS
MyDNSさんは非常に優秀で、IPアドレスの通知が一定期間ないとアラートメールが飛んでくる。
無料でアラートメールまでくれるのはすごく嬉しい
ちなみにアラートメールはこんな感じ

MyDNSからのメール画面

このDNS更新ができていないことと、resolvconfは何が関係あるんだってことだけど、
cronに登録したperl script(register_ip.pl)でDNS更新を行っている。
このregister_ip.plでは、DNSを解決して、登録IPと現IPを比較し、違ったら登録という処理を行っている。
特にIPv6というか、AとAAAAを登録しているauto.meto4dドメインを確認したいときは、DNS Resolvのあたりの処理をしっかり行わないとできない。
そこで、登録IPを確認するためにNet::DNS::Resolverを動かして得るのだが、もともとのresolvが動いていないと失敗する。
しかもこのエラー文がNet::DNSモジュールにどうとかこうとかというエラーで、DNS Resolveができなかったというエラーを出してくれないので、数ヶ月前に苦労したことがあった。
なんかネットワークがおかしいと想いつつ、sshで他のマシンにつなげようとしたときにresolv.confがどうもおかしいと、やっと判明した。

普通(?)は/etc/resolv.confを編集
nameserverが192.168.xx.18.8.8.8
192.168.xx.1と8.8.8.8が192.168.xx.18.8.8.8とtypo
これを直して終わり
だがそうじゃなかった、

% cat /etc/resolv.conf
# Generated by resolvconf
nameserver 192.168.xx.18.8.8.8

resolvconf?で管理されているらしい
確かに、/etc/resolv.confを編集した後に再起動すると、また間違ったresolv.confが流されている
resolvconfで変更を行う必要があるらしい
そもそもresolvconfとやらを見るのは始めてだし、ちょっと調べたという雑記


resolvconfとは

いつも大変お世話になっております。
Archlinux wikiから

openresolv には resolvconf ユーティリティが入っています。これは複数の DNS 設定を管理するためのフレームワークです。詳しくは man 8 resolvconf や man 5 resolvconf.conf を見て下さい。

https://wiki.archlinux.jp/index.php/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E5%90%8D%E5%89%8D%E8%A7%A3%E6%B1%BA#openresolv_.E3.82.92.E4.BD.BF.E3.81.86

そもそも論として、自分が体験していた不具合のように、/etc/resolv.confは影響がでかいconfファイルである。
そのため、openresolvなどで安全に変更するフレームワークとなっている

安全に変更されてへんやんか

resolvconfのconfであるresolvconf.confは/etc/resolvconf.confにある

% cat /etc/resolvconf.conf 
# Configuration for resolvconf(8)
# See resolvconf.conf(5) for details

resolv_conf=/etc/resolv.conf
# If you run a local name server, you should uncomment the below line and
# configure your subscribers configuration files below.
#name_servers=127.0.0.1

なんも設定されてねえ
テストしてみる。
resolvconfの設定を読み込んで/etc/resolv.confに適用するには# resolvconf -u

% sudo vim /etc/resolv.conf
→適当に変える
% cat /etc/resolv.conf
# Generated by resolvconf
nameserver 192.168.xx.1
nameserver 8.8.4.4

% sudo resolvconf -u
→適用させる
% cat /etc/resolv.conf
# Generated by resolvconf
nameserver 192.168.xx.18.8.8.8
→元の間違った設定に戻っている

resolvconf自体は/run/resolvconf/interface/nic0を参照してresolv.confを生成しているらしい

% cat /run/resolvconf/interfaces/eth0


nameserver 192.168.xx.18.8.8.8
→なんかわからん改行が多いが、編集する
% sudo vim /run/resolvconf/interfaces/eth0
% cat /run/resolvconf/interfaces/eth0     
nameserver 192.168.xx.1
nameserver 8.8.8.8

% cat /etc/resolv.conf
# Generated by resolvconf
nameserver 192.168.xx.18.8.8.8

% sudo resolvconf -u
% cat /etc/resolv.conf
# Generated by resolvconf
nameserver 192.168.xx.1
nameserver 8.8.8.8
→とりあえずresolvconf経由では/run/resolvconfを見ているらしい

そもそも論として/run/を編集するのはおかしい
実際、再起動すると/run/resolvconf/がリセットされていた

% cat /run/resolvconf/interfaces/eth0
nameserver 192.168.xx.1
nameserver 8.8.8.8

% sudo reboot now

% cat /run/resolvconf/interfaces/eth0
nameserver 192.168.xx.18.8.8.8

resolvconfは/run/resolvconf/を参照して/etc/resolv.confを設定しているようだが、/run/resolvconf/はどこを参照して作られているかがわからない
interfacesで管理しているようなので、nic周りで管理されているようだが、、man見ても、調べてもよくわからない

nicからということは、もしかしたらnetctlで定義したnicのDNSを参照している可能性がある

% grep -i dns /etc/netctl/eth0
DNS=('192.168.xx.1''8.8.8.8')

すっごい怪しい
調べたら正しい設定は以下のようだ

DNS=('192.168.xx.1', '8.8.8.8')
→コンマがない

特に出てこなかったが、netctl→resolvconfで/etc/resolv.confを管理している可能性がある

試しに変更してrebootしてみる

% grep -i dns /etc/netctl/eth0
DNS=('192.168.xx.1','8.8.8.8')

% sudo reboot now

% cat /etc/resolv.conf
# Generated by resolvconf
nameserver 192.168.xx.1,8.8.8.8

どうもそうみたいだ
でもnameserver 192.168.xx.1,8.8.8.8はだめ
安全に変更してくれよ

どうも単純な構文解析しかしてないようだ

% grep -i dns /etc/netctl/eth0
DNS=('192.168.xx.1','8.8.8.8')
↓
% grep -i nameserver /etc/resolv.conf
nameserver 192.168.xx.1,8.8.8.8

% grep -i dns /etc/netctl/eth0
DNS=('192.168.xx.1' '8.8.8.8')
↓
% grep -i nameserver /etc/resolv.conf
nameserver 192.168.xx.1
nameserver 8.8.8.8

なるほどなあ

まとめ

netctl のDNSは’シングルクォート’で挟んで、間にスペースが必要
間にコロン,やらが入っているとそのまま代入される
スペースがあることで始めてnameserverが分割される
resolvconfは安全に変更するフレームワーク(疎通確認はちゃんと行わない)

これでやっと再起動してもネットワーク不通問題はなくなったでしょう
たぶん

 35 total views

GCP PCA受験ノートまとめ

GCPのPCAに合格したので、合格をもらうまでまとめていた学習ノートをブログ形式でまとめていく。
前回のGCP PCA合格したよという記事でノートまとめまで書きたかったが、長くなったので、別記事にした。
内容は学習ノートなので乱雑、項目もノートを書き写しながらなので、随時更新追記していくだろう。

DataprocとDataflow

DataprocとDataflowの使い分けをしっかりする必要がある
どちらも大量にあるデータを短時間で処理するよというフレームワーク

DataprocはApache SparkやApache Hadoopなど、大量にある静的なデータを処理するもの。10TBの画像データを機械学習にかけるような、そういう用途に使われるもの。Hadoopが使用するファイルシステムのHDFSも知識として必要。OSのファイルシステムではなく、その上に独自でファイルシステムを構築して、大量データの単位時間あたりの読み書き速度を向上させているもの。インデックスを構築し直したようなものという認識。

DataflowはApache Beamのバックエンドで動作しているフレームワーク。こちらはストリーミングでやってくるような動的データの大量処理が得意。ストリーミングデータを並列処理させてリアルタイム分析できるというフレームワークの説明からわかるように、GCPでもストリーミングデータの処理→Dataflowがベストプラックティスという流れが定石。

同じようにストリーミングデータをどう処理するかというものにCloud Pub/Subもある。こちらも100%問題に出るようなフレームワーク。PublishとSubscribeの略。Pullでデータを持ってくるかPushでデータを送り出すか、どちらでも利用できて、どんな状況であってもデータを送受信できる→モバイルやIoTにも最適という特徴がある。

DataprocもDataflowも、大量データの処理はできるという点は同じ。そのため、やろうと思えば、Dataflowで静的データを処理させることも、Dataprocでストリーミングデータを分析させることもできる。何が違うかと言うと、料金が大きく変わる。(どれぐらい変わるかは調べてない)
餅屋は餅屋でやらせることがベストプラックティス(当たり前か)

Bigtable,BigQuery,CloudSQL,Datastoreの比較

殆どが、前述の 「GOOGLE CLOUD PLATFORM エンタープライズ設計ガイド」 に記載されていたデータウェアハウスの選択フローの通り。
PCAの試験に向けては、こう覚えていた

レイテンシ(スループット)重視→BigTable
時系列データ→BigTable
大量データ→BigQuery
分析処理→BigQuery
SQLクエリが使いたい(既存環境と変えたくない)→CloudSQL
データ量が10TB以上→CloudSQL以外
ユーザプロファイルなど消えちゃダメなやつ→Datastore
AppEngine関係→Datastore

分析のレイテンシを早くしたい場合等は、BigTableではなくBigQueryになることがあるが、だいたいこの順番で考えるとPCAは簡単だった。
未だにDatastoreの立ち位置がはっきりしてない。AppEngineのバックエンドだったり、データの整合性が重要なものはDatastoreという感じだろうか

同じデータウェアハウスとして、Spannerも重要だが、結構特殊。
Spannerに関して、どこかで特徴をまとめて書きたいが、これから業務に関係しそうで、書きにくい…
SQL文が使えて、大量データも扱える。それぐらいでいいんじゃないかなPCAに向けては

BigQueryの操作はbqコマンドで扱う。ビュー、テーブル、などBigQuery用語から、bq show、bq lsなどのコマンドオプションの知識も必要。

GCSの詳細

PCAの問題最頻出のGKEの次か同等ぐらいに多いと言われているのがこのGCS関係の問題。

バケットというオブジェクト管理で、1オブジェクト5Tまで扱える。GCS自体には無制限にデータをおける。
GCPはCUI操作だとgcloudコマンドにて扱うが、GCSはgsutilで操作する。

 58 total views

GCP Professional Cluod Architectに合格しました

GCPのProfessional Cloud Architectを受験して、合格をもらってきました。
やったね!

名前を隠すために裏垢エッチな画像みたいな写真になってしまった。
その上でフィルタ加工も入れてるもんだから余計わからん。あとモニタのモアレがすごい(小並感)

資格としてITパスポートとか、ジャブを出してからこういうのは取りたかったが、職場都合で断念
これならいいよwということで、2回受験して、合格をいただきました。
1回落ちたときはあかん!もうだめや!新人のくせに調子乗った!ってひどく落ち込んでた。
合格をもらったことで、今はとにかく嬉しい

職場都合で断念と書いてしまったが、正確には、今の職場では受験費が出ない、もしくは合格報奨金が出ない、ただそれだけ
まあ、こういう資格が絶対必要な仕事ではないからね
実は、大学留年時代、会社に就職してから基本情報とかを取ると、資格取得ということで報酬金が出るという話を信じ込んでいた
英検とか数研とか、そういう仕事に関係しない資格はさておき、基本情報に合格すると1万円もらえる!とか
それなら就職してから取得したほうがいいだろうという安易な理由で、勉強も取得も後回しにしていた。
そんなの会社によるのにね
そしてなんと、今の会社には基本情報等では報奨金がもらえないというお話
しまったなあ
この資格なら受験費用はでる。報奨金は出ない(のかな?)
ちなみに、この資格を持っている人の平均年収は1000万らしい
受かったんでこの平均年収分ください。これからも頑張るんでお願いします。
愚痴はさておき、本題

GCP Professional Cloud Architectとは

Google Cloud Platform(GCP)を「組織が」正しく扱う上で、GCP正しく理解している人に与えられる資格
そうしたGCP資格の中でも、GCP全体のアーキテクチャについての資格

そもそもGCPが提供している様々な認定試験として
・Associate Cloud Engineer
・Professional Cloud Architect
・Professional Developer
・Professional Data Engineer
・Professional Security Engineer
・Professional Machine Learning Engineer
……(等々)
がある。
これの二番目のやつを受験して、2度目にして合格をもらいました

Professional Cloud Architectの立ち位置

GCPのこと知ってますよって人がAssociate Cloud Engineer、
GCP全体のアーキテクチャを正しく理解して、GCP使えますよ、プロジェクトを正しく導けますよって資格がこのProfessional Cloud Architect(以下PCA)
要はGCP専門のプロのインフラマンみたいなもの

詳しくは以下
Professional Cloud Architect 認定資格  |  Google Cloud https://cloud.google.com/certification/cloud-architect?hl=ja

PCAの特徴

全体のことを知っているだとか、後述するがGoogleKubernetesEngine(以下GKE、kubernetesはk8s)のことを知ってるだとか、そういう知識が必要だが、
一番は「組織が」正しく扱う上で。というとこが重要だと思った。
それから、GKE、次いでGoogleCloudStorage(以下GCS)の知識がいる。
例えば、オンプレで動かしているこういうプロジェクトがある。これをGCPに移行させる。どうすればいいか?みたいな問題が多い
選択肢もいやらしい
選択肢のA案、B案、C案どちらでもできる。A案はできるが手間だ。B案は費用がかかる。C案であれば難なく移行できる。なんて解説付きだ。
GCPから模擬試験が出ている。ここの解説が資格を取る上で重要だった情報だった。ちなみに、模擬試験に極近い問題が出題されることもある。
運転免許試験かよって思っていたが、選択肢オンリーの問題なので、運転免許試験の傾向になってしまうことは全国共通なのだろうか

ちなみに、テストを受けてもフィードバックは全くない。あなたは 合格・不合格のみ。フィードバックないのは かなりキツイ

PCA受験時

テストセンターに行って受験もできるし、リモートで受験することもできる。
ただし、リモートで受験する場合、前準備というか、部屋の様子をWebカメラで見せないといけないとか、他のウィンドウが立ち上がると一発NGだとか、結構条件が面倒くさい。2回ともテストセンターで受験した。

受験時間は2時間、問題数は50問。
画面は、一つのウィンドウがあり、内部で左右に分割されている(スプリットビューみたいな感じ)画面。中央はドラッグで移動させられる。
左が問題文及び選択肢で、右側がDress4WinやTerraEarth(だっけ?)などのケーススタディ表示画面。
右側の上にドロップダウンがあり、Dress4Winなどを選ぶことで各ケーススタディのコンセプト等がでてくる。
ケーススタディの内容は何も変わることなく、ケーススタディのページのまま。コンセプト等のいかがテキストとテスト用フォントで表示されている
一応、ここにDress4WinのケーススタディのURLを貼っておく
https://cloud.google.com/certification/guides/cloud-architect/casestudy-dress4win-rev2?hl=ja
フォントサイズは多分11かな?フォントが独特なのか、 英語・ひらがな・漢字でちょくちょくサイズがおかしい。正直読みづらかった。
左側問題文画面の下に、各種ボタンが有る。
左側画面の右下には、「前の問題に戻る」「次の問題へ進む」「すべての問題を見返す」「解答を提出する」の4ボタン。(少し曖昧。もう少し文言が短かったはず)
左側画面の一番右下のボタンが「解答を提出する」ボタンなので、日頃の癖で一番右下のボタンを押すと取り返しのつかないことになる。(実際押すと、提出しても良いですか?みたいな画面に遷移した気もするが)
2つ選択しないといけない問題は、2つ選択しないとエラーが出る。前の画面に戻ることすら許されない。
左側画面の左下にある「後で見返す」みたいなチェックボックスにチェックを入れておくと、「すべての問題を見返す」により、問題番号一覧(1-50までの数字が羅列しているだけ)の番号に*マークがつく。
解答を提出すると、アンケート記述欄が出て、アンケート回答後、合否結果が出力される。

1回目受験時は1時間20分でやっと50問を解ききったという感じだった。2週目を1時間40分で終わらせて、残り20分はどんな問題が出たか覚える方に全力した。2時間経過すると突然解答終了画面に遷移した記憶がある。
2回目受験時は40分で50問終わった。わからなかったものは後飛ばしのセンター試験形式でざっと解いたんで、1時間で2週目及び全問解答、1時間20分で3週目の見返しが終わったので、1時間25分ぐらいで提出した。

受験当日、焦ったのだが、身分証明できるものが2つ必要。運転免許証だけだと不十分。社員証は持ち歩かないし、期限の切れた更新前の学生証を提出した。いけた(いいのか?)

PCA合格時の自分のノート

資格は2年で切れることもあって、テスト対策として、こういう問題出たよ、こういう感じだったということを記事にしようと思っていたが、規約で禁止されている。
ただの自慢話になってしまった。

しかし、自分がPCA合格するまでに書き込んだノートはテストとは関係がない。
俺の財産だ

PCA試験を受けるまで

まず一回目のPCAを受けるまではCourseraを受講していました。
うけたコースはこれ

Google Cloud Platform Fundamentals: Core Infrastructure 日本語版

GCP全体を学習する上ではとても役に立った。
特に、インフラ関係は独学で趣味の範囲でしか学習していないので、そのあたりを学ぶ上で大変役に立った
1週間は無料なので、受けて1週間以内で終わらせられれば無料
キャンセルするのを忘れないように
自分はキャンペーンで1ヶ月無料だったから1ヶ月やった
MachineLearning関係など、今回のPCAに向けては必要のない知識も多かった。
Qwiklabsで実際にGCPを触ることができる
が、自主的にこうするとどうなるんだ、どういう画面はどうなっているんだ、という部分がないと全く役に立たないような実践内容だった

改めて考えると、PCAを受ける上ではかなり情報不足な内容だった。
このコースだと特に、k8sに関してはhello-echo(だっけ?)をデプロイするのみだった。
PCA受験に向けて、kuberがどういう構造になっているか把握しないといけなかったり、特にローリングアップデートなど、GKEのベストプラックティスのデプロイ方法の部分をしっかり把握しないと行けないため、PCAに向けたk8sに関する多くの学習時間を用いた。

読んだ本

主に2冊を読んだ。
Google Cloud Platform エンタープライズ設計ガイド /著:小島 仁志 Amazon
GCPの教科書 /著: クラウドエース株式会社 吉積 礼敏・他 Amazon
2冊しか読んでないが、どちらか1つだけで十分だった。それよりはハンズオンなり、実際に手を動かしたり、公式ドキュメントを読んで、ノートにまとめる作業をしたほうが資格に向けては何倍もいい

Google Cloud Platform エンタープライズ設計ガイド Amazon

黄色く、A5サイズと小さい本。電車の中で読むのに最適だった。(そのため、ボロボロになるまで読んだ)
Courseraを受講しながら空き時間等に読んだ、最初の本
入門用には最適。どちらかというとGCPはどういうフレームワークが用意されているかという概念をしっかり説明してくれるという本。
AWSとの比較を交えてGCPのフレームワークを説明してくれている。だからといってAWSのことを知らなくても読めるように書いてある。(DB周りは少し難しかった記憶はあるが)
そのため、クラウドのこと何も知らんって人が読むと、GCPだけでなく、AWSを少しだけ同時に学ぶこともできる。というか、出来た。
クラウドサービスのため、アップデートが早く多く、こういう本ベースだとアップデートに対応できていないという状況がありえるが、2018年発行のこの本でも、しっかり最新のアップデート差分に対応できるような、概念的な書き方をされているイメージだった。
何より図や表が参考になり、現在でもたまに参照する。
Courseraとこの本でいいというイメージある。
ただ、やはりというか、SpannerやGKEなどは、まだまだその特徴がしっかり書かれてはいない点は否めない。とはいえ、他の本に比べて一番多く書かれており、大変参考にはなるが、、、今後、改訂版とか出てくるといいね。絶対買う。
個人的には、後ろの方に機械学習で使う場合の説明がしっかりと乗っているが、前半部分のGCEなど、より基礎的な部分を、実際のGCPの画面のスクリーンショット画像を用いて、どういう構成ができるかみたいな説明が欲しかったなあとは、再読したときに思った。
ちなみにだが、PCAでは機械学習はちょびっとしか出てこない。分析ができるようにして、機械学習による指標を活用できるようにするみたいな、そういう考えができればいい程度。SpeechAPIとかは全く出てこない(と思う)。
データストアの選択フローの図が記載されているが、GCP公式からはページが変わったのか消えたのか、参照できなかった。しかしこのフロー図は絶対必要な知識なので、この本を参考にノートをまとめた。

GCPの教科書 Amazon

1度GCP PCAの試験に落ちて、2度目の受験まで少し期間があったので(再受験規定もあり、2度目は15日、3度目は60日再受験できない等がある)、この本を復習がてら読んだ。
B5サイズで、とても分厚い。電車の中で読むには難しかった。(この頃は緊急事態宣言も有り、在宅勤務にシフトしたことで、布団の中で読んでいたのだが)
内容は入門向けには最適だが、上の「GOOGLE CLOUD PLATFORM エンタープライズ設計ガイド」に比べて今まさにGCPを使いながら勉強する人向け。
実際の画面を用いて説明があったり、Google提供の図を独自の図に置き換えて、わかりやすく説明してくれている。本の大きさも納得。
ただ、Spannerについては1ページ程度しかないみたいな、GCPアーキテクチャの知識では必要な要素も、公式ドキュメントの概要よりも情報が少なかった。とはいえ、わかりやすくは説明してくれてはいた。気になれば公式ドキュメント見てという、正しいは正しい対応だろう。そのため2冊目という点では勉強には使いづらかった。

その他ノートにまとめていたこと

長くなってきたので、一回ここで記事は切る。
別記事でノートの内容を羅列していきたい。
随時更新で

GCP PCA受験ノートまとめ https://auto.meto4d.pgw.jp/blog/?p=85

 72 total views

サイトのスパム対策をちょっとやった

表題の通り。
無料で使えるものとして、 Invisible reCaptcha を導入した。それだけの話。

背景(余談)

うちの自宅鯖では、ゲームなどの鯖を立て、2ch* に晒すことでみんなとゲームをすることがある。
そうするとどうなるか
いろんなbotがやってくる。

特に、PhpMyAdminやMediaWikiを狙ったbot攻撃は想像以上に多い

初めてのWeb鯖として利用した初代のRaspberryPi 1 Model-B
HPとしてMediaWikiを主に使って更新していた。
すると、こいつMediaWiki使ってるぜ!って大量の、本当に大量のMediaWikiを狙ったbotがやってきた
一瞬DAU1万行ったんじゃないか?(スパムはUserって言わないかw)
ただでさえMySQLはRaspberryPiのCPUを使い潰し、あまりにもリソース不足になるからとSQLiteでやっていた。
自分のためのサイト、知人しか見ないようなサイト、そういう所謂の個人サイトなら初代RasPiでも有り余るほどのリソースだった
しかし、このbotスパムはCPUを使い潰し、SDカードをも焼き尽くした。
俺のすべての資産が消えた。

ちなみに、このMediaWikiを使ってRaspberryPiの設定をいっぱい載せた。
それを冬コミで本にして出そうとしていた
11月にSDカードを焼かれた
SDカードをどう読み込んでも戻ってこない
新刊は落とした
俺は新刊を落とした

もうMediaWikiだけは絶対に使わねえ

このあたりでSQL嫌いが始まったのかもしれない
これは完全な冤罪

改め、背景(本題)

すぐ話が逸れる
こうしたbotはhttpアクセスのaccess.logを眺めているといっぱい見れる。

MediaWiki、PhpMyAdmin、最近はJenkinsを狙うものも多くなった
このWP*を狙ったスパムも多い
奴らは直接コメントを投稿するURLでやってくる
ここを守るしかない

Akismet

インストール時に、最初から入ってたプラグイン
月4500円のプランを超勧めてが、個人で条件付きなら無料で利用できる。

サイトで商売を行っていないことが条件のようだ
どうも広告を貼り付けていることもNGっぽい
漫画を読んで、その感想を書きながら、ついでにちょこっとアドを載せようと思っているからダメだ

一番の理由はアカウント登録も必要なこと、面倒くさくて辞めた

アカウント管理ができなくなってきたのでなんとかしたいと考えていたとこなので、完全に手が止まった。

Google reCAPTCHA

あの「あなたはロボットですか?」って聞いてくる有名なやつ
確かにあれを導入することでスパムは格段と減るだろう
早速導入

導入したプラグインはこれ
invisible reCAPTCHA

invisible reCaptcha

何も難しいことはない、プラグインページでインストールするだけ

というわけにも行かなかった

reCaptchaのAPIをGoogle様からもらう
そしてそれを設定に入れる

reCaptchaにはGoogleのアカウントが必要
Googleのアカウントは流石にこのご時世必要不可欠なのである
reCaptchaにはv2とv3がある
v3のほうがいいだろうという安易な理由で内容を見ずにv3

reCaptchaのドキュメントはここ
Register reCAPTCHA v3 keys here.
から登録できる

このブログにエロマンガを読んで、その感想及びアドを入れる可能性があり、Googleはそういうアダルトコンテンツでの利用は規約で制限されている。
そういう規約を確認していたが、見当たらなかった
ライセンス等々は気をつけてねという表記は見つけたが、ななめ読みでは見当たらなかった。
大丈夫なのか?コメントお待ちしています感謝します。

登録内容は、GCPと同じ感じだった

  • ラベル
    識別用のラベル、名前
  • reCaptcha
    • v3はスコアで判定(と書いてあるだけで追加選択肢はない)
    • v2は非表示だったり、よく見るチェックボックスだったり、Androidアプリでの認証の追加選択肢
  • ドメイン
    ドメイン
  • オーナー
    gmailのアカウント
    G Suite認証かな?
  • 後は利用規約とかアラート(エラー数が増大時にメール?)とか、そういう

必要な項目を入力したら、APIキー(サイトキー)とシークレットキーをもらう
このキーをどこに入力するのかわからなかった

invisible reCaptchaはプラグイン設定だったり、WP自体の設定だったりで設定する
Googleで検索したときはプラグイン設定だった
自分は設定の中にあった
ここに入力し、設定
これでOKでしょう

これで設定終了
動いているかどうか、見えないもんだからわからないけど、大丈夫でしょう
どこかで自演コメントためしてみるかな

※2ch、5chとは言わない
したらばとかnextとかパーとかあるからね
自分の中で、それらをひっくるめて2chって言うようになった
時たま忘れる

※WPってアレですよ、ワードのプレスですよ
まだ未設定なので、左下にpowered by WPってあったりするが、スパムbotにこいつWP使ってるぜー!って攻撃されたくないから、あまり書きたくない

 40 total views

Let’s Encrypt でSSLワイルドカード証明書を導入する

Archlinuxが動いているRaspberryPi君にワイルドカード証明書を導入する。
特段、難しいことはなく、Qiita等々で書かれていたことをトレースしただけだった

前提

入ってるもの
MyDNS
・RaspberryPi鯖

# cat /etc/os-release 
NAME="Arch Linux ARM"
PRETTY_NAME="Arch Linux ARM"
(中略)
# certbot --version
certbot 1.12.0
# date +%Y%m%d_%H%M
20210221_0503

今あらためて気づいたんだけど、Archlinuxってarch-releaseって何も書いてないんだね
CentOSで作業するときのversion番号確認作業がたまにあるんだが、そのときはredhat-releaseを参照してversion番号確認をしている。
少なくともCentOS8はredhat-releaseは/etc/centos-releaseのシンボリックリンクで、今どきな人の中でCentOS使ったことない人も考えると、redhat-releaseを参照するという手順は難しいんじゃないかな?と思ったり
話がすぐ逸れる

ワイルドカード証明書を発行する

Let’s Encryptでもワイルドカード証明書は対応している
が、v2 APIのURLを指定する必要がある。

certbot certonly --manual \
    --preferred-challenges dns \
    --server https://acme-v02.api.letsencrypt.org/directory \
    -m hoge@unko.com \
    -d *.meto4d.pgw.jp

実行すると、以下のような表示が出る

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Requesting a certificate for *.meto4d.pgw.jp
Performing the following challenges:
dns-01 challenge for meto4d.pgw.jp

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.meto4d.pgw.jp with the following value:

xxxxxxx(ランダムな文字列)

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

Enter入力待になるが、DNSレコードが必要なので(MyDNS用に)ブラウザで作業
途中のxxxxxxx(ランダムな文字列) はメモってMyDNSへ

MyDNSにTXTレコードで_acme-challenge.meto4d.pgw.jpを登録する
_acme-challenge.meto4d.pgw.jp   TXT   xxxxxxx
MyDNSは反映が早いとはいえ、1分ぐらい待ったほうが懸命だろう。
反映したかdigコマンドで確認する

% dig @ns0.mydns.jp _acme-challenge.meto4d.pgw.jp -t TXT

; <<>> DiG 9.16.10 <<>> @ns0.mydns.jp _acme-challenge.meto4d.pgw.jp -t TXT
(中略)
;; ANSWER SECTION:
_acme-challenge.meto4d.pgw.jp. 300 IN   TXT     "xxxxxxx"

→一応Googleでも確認
% dig @8.8.8.8 _acme-challenge.meto4d.pgw.jp -t TXT

; <<>> DiG 9.16.10 <<>> @8.8.8.8 _acme-challenge.meto4d.pgw.jp -t TXT
(中略)
;; ANSWER SECTION:
_acme-challenge.meto4d.pgw.jp. 299 IN   TXT     "xxxxxxx"

反映されていたので、certbotに戻ってEnter

....(上のcertbot作業の続き)
Press Enter to Continue [[Enter]]
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/meto4d.pgw.jp-0001/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/meto4d.pgw.jp-0001/privkey.pem
   Your certificate will expire on 2021-05-21. To obtain a new or
   tweaked version of this certificate in the future, simply run
   certbot again. To non-interactively renew *all* of your
   certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

認証が出来ていた

ちょっと待て

  Your key file has been saved at:
   /etc/letsencrypt/live/meto4d.pgw.jp-0001/privkey.pem

meto4d.pgw.jpの証明書はある
*.meto4d.pgw.jpのワイルドカード証明書がmeto4d.pgw.jp-0001に?
気持ち悪いのでmeto4d.pgw.jp-wildにでも移動してもらう

lets encrypt配下のarchive, live内の meto4d.pgw.jp-0001 を移動し、renewal/のconf内を変更していく

(なんか少し怖かったので、sudo su - したshell以外でやった)
% cd /etc/letsencrypt

→証明書の中身を移動
% cd archive
% sudo mv -r  meto4d.pgw.jp-0001 meto4d.pgw.jp-wild
% cp ../live
% sudo mv -r  meto4d.pgw.jp-0001 meto4d.pgw.jp-wild
% cd meto4d.pgw.jp-wild
% ls -l
(抜粋)
lrwxrwxrwx 1 root root  42  2月 21 05:59 cert.pem -> ../../archive/meto4d.pgw.jp-0001/cert1.pem
→シンボリックリンクが前のままなので、変更
% /bin/ls -1 *.pem | xargs -i sh -c "readlink {} | sed 's/0001/wild/g' | xargs -I [] sudo ln -nfs [] {}"
→実はlnのtargetとlink先の順番を間違えて一回消しちゃったw
上書きしてしまったarchiveのmeto4d.pgw.jp-wildをディレクトリ毎消して、certbot certonly --manualを再実行
dns等々はしてあるので、TXTの書き換えもなく即終了
% ls -l
(抜粋)
lrwxrwxrwx 1 root root  42  2月 21 06:42 cert.pem -> ../../archive/meto4d.pgw.jp-wild/cert1.pem

→設定を変更
% cd renewal
% cat meto4d.pgw.jp-0001.conf
# renew_before_expiry = 30 days
version = 1.12.0
archive_dir = /etc/letsencrypt/archive/meto4d.pgw.jp-0001
cert = /etc/letsencrypt/live/meto4d.pgw.jp-0001/cert.pem
privkey = /etc/letsencrypt/live/meto4d.pgw.jp-0001/privkey.pem
chain = /etc/letsencrypt/live/meto4d.pgw.jp-0001/chain.pem
fullchain = /etc/letsencrypt/live/meto4d.pgw.jp-0001/fullchain.pem
(中略)

% sudo sed -i 's/meto4d.pgw.jp-0001/meto4d.pgw.jp-wild/g' meto4d.pgw.jp-0001.conf
% sudo mv meto4d.pgw.jp-0001.conf meto4d.pgw.jp-wild.conf

→これでいいはず……
(certbotを動かしていたterminalに戻って)
# certbot renew
(抜粋)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/meto4d.pgw.jp-wild.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not yet due for renewal

→特にエラーはないので、これで大丈夫…かな?

Nginxでワイルドカードを使ってみる

nginx/server.confにまとめているので、そこで

ローカル用のデバッグポートに追記
server {
  listen 10080;
  include conf.d/default_ssl.conf;
  ssl_certificate /etc/letsencrypt/live/meto4d.pgw.jp-wild/fullchain.pem; # managed by Certbot
  ssl_certificate_key /etc/letsencrypt/live/meto4d.pgw.jp-wild/privkey.pem; # managed by Certbot
  include conf.d/default_proxy.conf;
  include conf.d/php_fcgi_location.conf;
  location / {
    index index.test.php;
  }
}
% sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
% sudo systemctl reload nginx 

構文チェックしろとよく言われるようになったので、最近ちゃんとnginx -tをしてからreloadするようになった
今までの、まあ大丈夫だろうでrestartして鯖を止めてた時代からは進歩した
確認は無意識でできるようになったが、確認した後、面倒くさって言ってる気がする

ブラウザでアクセスしてみる

まじかよ!

*.meto4d.pgw.jpは meto4d.pgw.jpに使えないってそんなことあるのか

再発行する

% sudo certbot certonly --manual \
    --preferred-challenges dns \
    --server https://acme-v02.api.letsencrypt.org/directory \
    -m hoge@unko.com \
    -d *.meto4d.pgw.jp \
    -d meto4d.pgw.jp
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
You have an existing certificate that contains a portion of the domains you
requested (ref: /etc/letsencrypt/renewal/meto4d.pgw.jp.conf)

It contains these names: meto4d.pgw.jp

You requested these names for the new certificate: *.meto4d.pgw.jp,
meto4d.pgw.jp.

Do you want to expand and replace this existing certificate with the new
certificate?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(E)xpand/(C)ancel: e
Renewing an existing certificate for *.meto4d.pgw.jp and meto4d.pgw.jp
An unexpected error occurred:
requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='acme-v02.api.letsencrypt.org', port=443): Read timed out. (read timeout=45)
Please see the logfiles in /var/log/letsencrypt for more details.

どうもv2 APIではexpand出来ないみたいだ
だからといってタイムアウトはどうなんだとは思ったが
既存設定を削除する必要がある

既存設定を削除

# certbot delete
Saving debug log to /var/log/letsencrypt/letsencrypt.log

Which certificate(s) would you like to delete?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3: meto4d.pgw.jp-wild
4: meto4d.pgw.jp

適当に抜粋
今しがた作ったmeto4d.pgw.jp-wildとmeto4d.pgw.jpを削除

再発行(2度目)

→最後の -d meto4d.pgw.jp を追加
% sudo certbot certonly --manual \
    --preferred-challenges dns \
    --server https://acme-v02.api.letsencrypt.org/directory \
    -m hoge@unko.com \
    -d *.meto4d.pgw.jp \
    -d meto4d.pgw.jp
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Requesting a certificate for *.meto4d.pgw.jp and meto4d.pgw.jp

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/meto4d.pgw.jp/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/meto4d.pgw.jp/privkey.pem
   Your certificate will expire on 2021-05-21. To obtain a new or
   tweaked version of this certificate in the future, simply run
   certbot again. To non-interactively renew *all* of your
   certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

すんなりと行った

Nginxの設定再変更

さっき変更したばっかりのmeto4d.pgw.jp-wild部分を元に?戻す

ssl_certificate /etc/letsencrypt/live/meto4d.pgw.jp/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/meto4d.pgw.jp/privkey.pem; # managed by Certbot

reloadの類いをするした

ブラウザでアクセス

雑スクショだが、ちゃんとワイルドカードで証明書を出せている
いいね!

後は晒せないNginxの設定をワイルドカードに対応させていく

nginxの仕様上、ifで証明書を分けているとそのたびにsslを紐解くらしく、結構遅くなるらしい
どれぐらい遅くなるかは試していないが、以下のようにしていた

server {
  listen 443 ssl;
  server_name "" _;
  include conf.d/localssl.conf;
  include conf.d/ip_location.conf;
}
server {
  listen 443 ssl;
  server_name meto4d.pgw.jp;
  ssl_certificate /meto4d.pgw.jp/....
  ssl_certificate_key /meto4d.pgw.jp/....
  include conf.d/default_location.conf;
}
server {
  listen 443;
  server_name auto.meto4d.pgw.jp;
  ssl_certificate /auto.meto4d.pgw.jp/....
  ssl_certificate_key /auto.meto4d.pgw.jp/....
  include conf.d/default_location.conf;
}
(適当に端折)

公開鯖の都合上、IP直打ちで来る人も多い
(例えばterraria鯖をIPで晒していると、結構IPをブラウザに突っ込んで来る人がいるんだ)
そういう人にこの鯖に簡単にはたどり着けないようにしたいため、設定を変えている
localssl.confは自己署名証明書を読み込むやつ

server_name meto4d.pgw.jp; と server_name auto.meto4d.pgw.jp; で冗長な構成になっていた
ここを整理
v6とv4、dsは残しておく

まとめ

導入は簡単だったが、結局replace作業になったのでちょっと面倒だった
ワイルドカードにとうとうやったので、将来VPSとかk8sで管理するときに楽になったね


ref: let’s EncryptのワイルドカードSSL証明書を取得する。 – nhmasaazu
ref: ACME v2 Production Environment & Wildcards – API Announcements – Let’s Encrypt Community Support

 41 total views,  1 views today

最近の近況

2019?18?年ぐらいからの近況
時系列で簡単に言うと、

  • Macを買った
  • 研究に一区切りつけた
  • 働くようになった
  • SynologyのHDDを増強した
  • 金銭的余裕ができた
  • 本も漫画をたくさん買えるようになった!
  • 好きな勉強もできるようになった
  • ブログの構成を変更し、公開させれるようになった

要はこんな感じでした。

Mac

MacBookPro2019モデルを買った。
実家が嫌いすぎて帰らなかったが、ひょんなことで、一瞬帰省することに。
育ての父の遺産の話になり、持ってると使ってしまうからと、金額や即受け取りは拒否。
ただ、まずは現環境を整えたいからと、50万程度を受け取り、MacBookPro2019とAppleWatch、iPadを購入しました

すごいねこれ
Acerの安ノートPCとリモート環境整備でごまかしていたが、いい加減ちゃんとしたノートPCがほしいという気持ちと、
Mac環境はクリエイティブに関してとてもいいということや、実際にプログラミング配信等で見かけるMacの使い様も大変良さそうだという気持ち、
なによりMacBookは前々から欲しく、もうこれはMacBookPro買うしかないな!ということで一念発起し、購入。
使えば使うほど、慣れてくる使用感、しっかり思ったことをすぐできるのがいい。
コアがcore i5のクロックが1.5GHz(だったかな?)なので、スペック不足は時たま感じるが、十分十分
コピペが片手キーボードで操作しにくい、 US配列に慣れてしまったのに日本語キー配列、などタイピングの問題はあるが、こんなにもいいノートPCがあるのかとべた惚れしてしまった。
購入して1ヶ月は布団の中からもできると、MBPを枕に置いて、MBPと一緒に寝ていたほどだ。

iPadもいい、これもべた惚れしてしまった。
今までNexus7を使い、Dropbox等経由でエロマンガを読みながらオナニー生活
Dropboxを更新してからどうも画像表示が重い、次のページがひらけない、気づいたら落ちてしまう。ということで、KindleFireHDに以降。これもやはりスペック不足ということで、新タブレット
MBPを買うときに、それならiPadにしよう。ペンもあればノート役割も十分だ!ということで、ApplePencilも同時購入
配信視聴やポルノ視聴、リモート操作だけでなく、プログラミングも、ワードなどの資料作成も、お絵かきも、超雑なメモ書きも、なんでもできる。
iPadあればノートPCいらないんじゃないかってほどだった。
親のPCが中古Win8をWin10にしたような、使えはするが、PCの使えない人にはいろいろ考えないといけないような仕様。これも2020年末祖母の慶弔休暇で帰省した際にそれならiPad使いなよってことでiPadAirをその場で購入しプレゼント。
iPhoneが使えるから十分使えているそうで、大満足。
iOS端末は情弱と情強の二分化された端末という話を聞いたことがあるが、まさにその通りだと思った。

AppleWatch5を購入
これはApplePencilと同じように、ここまでApple製品に固まっており、もらった50万までこれを買えばちょうど!どうせならこれも買おう!ってことで購入。
普段の心拍数が100付近をうろついているためか、常に運動状態と言われていることが心配だが、これもすごく便利
通知が音だけでなく、バイブで気付けるようになること。
AppleWatchだけで簡単なメッセージのやり取りはできてしまうこと。
iPhoneで聞いている音楽を音量から次曲送り等、操作できること。
Suicaが使えること。
AppleWatchのロックを解除していれば、MBPのロックなども近づければ解除できること。
特にSiriを気兼ねなく使えることは、持たないと便利さがわからないという点だと思う。
出勤時の着替えている時、服を来ながらSiriに夕方の天気を聞いたり、料理中にタイマーを図ってもらうなど、大活躍をしている。
お笑い話のようだが、AppleWatchというだけで、金銭的な自身がつく。新宿高島屋へ間違えて迷い込んだ時、ルイビィトンやなんだかわからない高級なものを取り揃え、行き交う通行人もなんだか高級な匂いを放っているなか、全身ユニクロマンの俺は、普段ならキョロ充しまくっていたが、AppleWatchのおかげで自身のついた歩みができ、迷うこともなく抜け出せた。思い返せば笑ってしまう話だが、自己肯定感がここまで上がるのはすごくいい気分だ。
さらに、現在の会社の社長も同じAppleWatchをつけているようだ。これは更に自己肯定感に拍車をかけてくれることだろう。

研究

研究に関しては一区切り「つけた」という状態。
大学に所属した研究である限り、基本的には時間との戦いが研究の一番のキモ
この時間制限が守れなく、所謂留年状態で、タイムアップで一区切りつけました。
奨学金頼りの貧乏苦学生。
まず働こうということで、2020年からとうとう働き始めました。

就職

就活自体は今の状況が決まる前から行っていたが、3社程度しか受けず決まらず、ここで働きたいという気持ちもなく、ただただ就活鬱(?)でした。
研究も行き詰まり、自分のやりたいこと、自分の興味のあることが一切なくなってしまうという状況でフラフラしまくっていた。

1社、めちゃくちゃ尊敬していたプログラマの人が長をやっている会社。
求人はしているが会社を立ち上げて期間も短く、所謂新卒枠がない。面接一発で最終だった。入社はOKだが自分みたいな人の扱いが大変難しいとのことで断られた。また何かあれば来てくれと言われたときはすごく嬉しく、心自体は折れなかった。また、この時いろんな疑問や相談にも乗っていただけたので、もし機会があればただただ一プログラマとして恩返しをしたいと強く思えた。
この経験だけは宝物だ
結局、研究ができていない→今は他プログラムも遊ぶこともできない→研究のモチベがない→フラフラグデグデ…
という悪循環ではあったが、その気持で、それでもPCの前に座ることは続けられた。

研究の見通しがつかなくなり、タイムアップが確定。
就職支援でいくつか紹介してもらい、内定もいただけたが、まずは今ある求人という中に気になる会社が。
そこは中学-高校時代大変お世話になった会社で、その時の話が大受け。その会社に決まった。
環境もよく、どんどん現会社全体のことが大好きになってしまった。大学にいるときはあんなにも働きたくない、好きなことをしていたいと言っていたが、好きなことして働いている。
なによりも、研究のときに感じていたつっかかりが、会社では上の人がいることで、すっきりと見通しをつけてなんでもできる。
一番感じたのは相談に乗ってくれる人、何より 教えてくれる人、 この存在はめちゃくちゃ大きいと感じた。
こんな簡単な文章を書きながらも、今の関係が良く、嬉しくて泣きそうになるほどだ。
今まで通り、責任なく好きなことをしているわけではなくなったが、一番下っ端なので責任感のようなものは上司に押し付け!という気持ちで勉強が進めれる。そして、好きなことだけ出来ている。楽しい。
メリハリをつけれず、ダラダラなあなあになってしまう悪い癖をなんとかしたいと思いつつ、今のコロナ禍での在宅勤務。自分のことが不甲斐ないと感じるが、健常者になるため頑張ろうというモチベーションは十分にある。

Synology

3TBから6TBへ増強した。
HDD増強自体は、Win7の旧鯖マシンのHDDが吹っ飛んだ際に取り替えたわけだが、ちゃんと整理をつけたのはつい最近。

Synologyは基本独自フォーマット(よく調べていないがSynologyでサポートしているRAID用のフォーマットなんじゃないか?とは思っているが…)なので、クローンして単純移行とは行かなった。
3TBの移行に別3TBへコピーしてから、6TBで構築してからバックアップを復元という作業が必要だった。
これだけで実時間1週間はかかったんじゃないか?

Toshiba製の6TBHDD (MD04ACA600) だが、レビュー等にある通り、負荷時になんだかカリカリ音が聞こえてくる。
昔はそれが日常だったが、今どきカリカリ音を聞かなくなったので、これはこれで不安になる。信じてるぞ東芝
Toshiba製を信じて使い潰したいが、まずはデータ整理が必要だ。
2週間かけて100GBを開けるみたいなことをしているが、、これは気が長くなる。

金銭感覚

就職したことで、今までの金銭感覚が変わりました。
小学校の頃から感じているが、
「自分が(気兼ねなく?)使える桁。この桁は、なにか自分の位が上がることで、桁が一つ増える。」という認識
小学校は10円単位、中学は100円単位、高校は1,000円単位、大学は10,000円単位、就職後100,000円…という感じ
これは結局、就職後の1桁増えたというそれをまたしても実感してしまった。

コロナ禍でのちょっとした臨時収入などもあったが、働き始めて8ヶ月、もう貯金は100万に到達してしまった。
今までできなかった親へのプレゼントということで、iPadAirやiPhoneSE2、アクセサリー系もプレゼントし、20万一気に使ったが、いい気分だった。

本も漫画も何も考えず、自由に買える。これは本当に嬉しい。
本を買う時、所謂斑目方式(げんしけん)。
買ってからお財布事情を考えるという癖がある。それほどまでに購入欲というか、コレクション欲が強い。
今までは、どうにかして諦めることを考えて、このコレクション欲から逃げていた。
今では、コレクション欲に真っ向勝負。ただ身を任せ浪費するのも良くないからと、勝負を挑むが、何が必要か、何がコレクション欲を刺激しているのかをしっかり考えられる。
負担等ではなく、ただただ楽しい。
30年ぐらい生きて、一般的にお金がある人、特にコンプレックスの一つでもあったゲーセンでお金を入れられる人、ガチャを楽しむことができる人、こうした気持ちがやっと理解できるようになった。
楽しい。
もっと働きたい。
もっとお金がほしい。
手段と目的が入れ替わりそうだ。楽しもう。

漫画

気づいたら今月買った本の数が30を超えていることもあるぐらいだった。
ブログを公開できるようになったことと、自分の気持ち、感想を文章化できるようになりたいという気持ちで、できれば、感想を書いていきたいなとは思う。
ただ、まずは持ってる本のリスト整理だ
数が多すぎる。
今の家から引っ越す時、すごくすごく心配だ。
ただ、読んだら終わりではなく、結局根本にあるのはコレクション欲。
二度と手放せないだろう。
いつかの記事でまた改めて書いていきたいね

好きな勉強

0から1を考えることも、1から5を考えることも、5から10まで作ることも好きだが、特に5-7のあたりに位置しているであろう、既存システムの組み合わせ
組み合わせることでのシナジーを感じるのが好きだ。
今の仕事内容にかぶるが、最短ないし汎用的な道具を集め、シナジーを活かす。
その勉強は0-5までの研究とは大きく異る。
楽しい。これは大好きだ
1-5の、まずは作って検証という部分でもない
ただただシナジーを生み出す。これが好きなんだなと感じれた。

本ブログ

上のHDDを換装とも関係するが、データをあれこれ移行させ、環境を一気に変更させた。

今まで、ほぼローカルでしか使えなかったsynologyのWP*、ローカルで書いて、ローカルのみで公開。
これもこれでいいものだったが、三日坊主で止まってしまった
ただの資料置き場。
HDD換装時に別にいらんだろうwってことで削除
削除したときは、論文などにつけていたひとことメモは全部覚えていたが、人間は忘れる動物
どうして消してしまったんだ。

まず大きな起点はhttps対応。
Lets Encryptで無料SSL証明書は本当にありがたい。
特に管理面ではなく金銭的な部分で自宅鯖運用をしている手前、色々試行錯誤して導入できた。
導入時はワイルドカード証明書はBetaで導入できず。
次の記事ぐらいで、どうやってワイルドカード証明書導入したか書きたいな

話がそれてしまった、
基本的に外部に公開しているのは、RasPiとWin鯖にしたいと考えていて、
Win鯖はもう鏡とペカ、メールとかJaneとか、リモート操作用という立ち位置なので、家内インフラとは別という考え
今管理しているドメインは主に以下の3つ

  • meto4d.pgw.jp
    • メインのドメイン
    • メインとは言いつつ、とりあえずここという気持ち
    • v4のみ
  • auto.meto4d.pgw.jp
    • IPv6対応のドメイン(AとAAAAを出すドメインという言い方が正しい?)
    • どちらかのみ対応のv4.meto4dやv6.meto4dもあるが、基本はここでやらせたいとは考えている。
    • ただ、基本はRaspberryPi3への入り口。考えることは多い
  • ds.meto4d.pgw.jp
    • このブログの実態が動いているSynology用のドメインと考えている
    • 使っているのはSynology DS216J、つまりDiskStationのds

今まではRasPiのnginxで受けて、理解のできていないリバースプロキシで飛ばしていた。
CSSやらJSやらが取れない、TOPに戻ると記事が全部なくなったり、フォーマットやDBアクセスもなんだかおかしい
なんでまあ使えるだろうでちょろちょろ使っていたんだ

SSL証明書に対応させて、NginxのConfがなんだか気持ち悪い状態に、
これはちゃんとなにがどう設定されているか勉強しながら整理しよう!と今まで置いてきた部分をちゃんと整理できた。
Nginxのconf内、locationブロックで、ifで分けてproxy_passを飛ばせない
RasPiのNginxでSSLを紐解いて、DSへはhttpでやらせようとやったが、WPはリクエストヘッダがHTTPSかどうかで出力URLがhttpかhttpsかで変わるという仕様
もうSSL証明書管理をRasPiからds.meto4d.pgw.jpはSynology管理にしようと、一元管理を変更。
proxy_passをうけてのhost名がちゃんと取得できるようにしたことや
set $schema http;
if (ssl_protocols != "") { set $schema https; }
proxy_pass $schema://ds.meto4d.pgw.jp;

と変更
最後のproxy_passの最後のスラッシュ/の有無による処理変更問題もあり、思った以上に時間がかかってしまったが、解決。
最後のスラッシュ/の有無で、アクセスするURLが変わることは知っていたが、httpのレスポンスヘッダも変えてしまうとは思わなかった。

これでとうとう、このSynology管理のブログも外に出るようになった。
サイトの見た目が変とは思うが、まずは書くこと、まずは公開することに慣れたい
10分眺めて、いい外観プラグインがなかったからしょんぼり

まとめ?

とうとう、この雑記帳も全世界に公開されてしまうことだろう。
今までのことから、三日坊主で終わるだろうねw
コメントを書くように、適当なメモでも記事を書いて行きたいが、、、

※WPはワードのプレスのこと
どこかでちょっとちゃんと話したい

 53 total views