Windows,環境構築

こんにちは、しきゆらです。
今回はあまり需要がないであろう自作PCネタです。
そして、前回の記事が3月末ということに驚いてます。

半年ほど前、Radeon RX6800のリファレンスモデルを購入しました。
記事:【自作PC】Radeon RX6800を買ったので5700XTから差し替える

上記記事の時点では、もともと6800XTが狙いだったが購入できなかったので場つなぎ的な意図で6800を購入した状態でした。
その後、定期的にお店を回ったり通販をのぞいたりしてもほぼほぼ購入不可能な状態でした。
あるのはぼったくり価格で売っている怪しい業者か転売を生業としている方ばかり・・・。
そして仮想通貨の高騰によりマイニングする方が増えたり、半導体不足などの影響による価格高騰など様々な要因が重なり購入できず状態でした。

発売日に購入した6800が8.5万程度だったが、現在は16万以上という状況である昨今。
この値段を出すんであれば上位モデルが買えるのでは、と思いつつサイトを眺めていましたが最上位は値段もありある程度は変えそうな雰囲気でした。
そして、買おうと思っていたSapphireの6900XTに新しいモデルが出たので、これは買うしかない、となってポチってしまいました。

購入したモデル

ということで、ドン!

購入したのはSAPPHIREのRadeon RX6900XT SEモデルです。
Radeonの最上位モデルである6900XTであり、RadeonといえばSAPPHIREということで購入。
ちなみに、狙いはSAPPHIREの6800XTだったんですが、購入できないのでこちらを購入。

中身は、本体と説明書類とステーまでついていました
(なぜか、本体単体の写真を撮影し忘れたのでありません・・・。)

そして、メイン機として活躍してくれた6800リファレンスモデルとの比較は以下の通り。

サイズ的には、だいぶ大きいです。
長さは31cm程あり、ある程度大きいケースでないとそもそも入らなそう。
6800リファレンスモデルも3連ファンでデカいなぁと思っていましたが、さらに大きい。
ファンも9cm?10cm?くらいあり、かなり大きい。
とはいえ、6800リファレンスはぐるっと金属でおおわれているのに対して、6900XTはプラスチックなので大きさの割に重くはないです。

リファレンスと違い、お尻は開いているタイプ。
そして、結構側面・上面が開いているので排熱もよさそう。

厚みの比較はこんな感じ。
6800リファレンスは2スロット厚に対して、6900XT SEは2.7スロット厚。

上から見るとこんな感じ。
やはり厚みがすごい。
補助電源は8ピン2つと6ピン1つ。
3つピン刺すモデルは初めて。

背面がこんな感じ。
バックパネルはもちろんついているとして、注目は左端。
排熱が抜けるように工夫されていますね。
某緑のメーカーのFEモデルと同じような感じで、排熱を吹き出すだけでなくきちんとケース内で抜けやすくなるように工夫されています。

刺して起動するとこんな感じ。
上面、背面はこれでもか、というくらいビッカビカ光ります。
個人的には光る必要はないのでSE出ないモデルにしようと思っていたんですが、新しく出たモデルがSEで光るモデルだったのでやむを得ず。
ツールで光り方の制御やOFFにすることもできます。

ベンチマーク

詳しい性能比較などは、大手メディアを見ていただきたいですが、手元でも軽くとってみました。
構成的には、以下の通り。
前回の記事から、割とゴリゴリ組み替えてます。

パーツ名称
CPURyzen7 5800X
マザーボードB550 Steel Legend
メモリコルセア DDR4-3200MHz 32GB (8GB * 4)
電源PHANTEKS PH-P1200PS 1200W

まずは6800リファレンスモデルから。

Time SPYのスコア的には13473。

スコア的には、割と上位らしい。
ここからどこまで上がるか。

6900XTはこちら。

スコアは17493。
単純にGPUを差し替えただけで4000ほどスコアが上がってます。

スコアは最上位レベル。
某氏のいうところの心の安寧です。
ベンチマーク的にはかなりのスペックアップです。
とても良い。

ゲーム性能

ゲーム性能といっても、FPS系のよく言われるゲームはあまりやっていないので手元でやっているものだけ軽くメモしておきます。
といっても最近あまりやっていないので、参考程度に。

MHWIBは6800の時点で144Hz出ていたのであまり変化はわかりませんでした。

変化が一番わかるのは、最近ハマっているDyson Sphere Program。
設定はフルフルに上げて、144Hz上限にしています。
6800では、もともとは140Hz位出ていましたが、要素が増えてくると100~120hzくらいまで落ちていました。
6900XTでは、そこそこ要素があっても144Hz張り付き状態でした。
しかも、使用率が60%程だったのでまだまだ余裕がありそうでした。
3D版Factorioぽいゲームなので、要素がもりもりになりがちなので、これはありがたい変化でした。

まとめ

今回はGPUを6800から6900XTに買い替えました。
価格や心の安寧のため、最上位を購入しましたが、とても満足しています。

半導体不足や流通の問題などの影響により、正常に戻るには1,2年かかるのでは、とかいう話もあるので
ほしい時が買い時なのかもしれませんね。
緑のメーカーは新しくGPUを発表しましたが、AMDはあるのかな、ないのかな。

ということで、今回はここまで。
おしまい

Linux,環境構築

こんにちは、しきゆらです。
今回は、またまたWSL2環境でsystemdをPID1で動かす手順をメモしておきます。

というのも、またまたPCパーツを買ったので組みなおしつつOSをクリーンインストールしました。
1年程度でOSをクリーンインストールするので、妙な不具合なんかは出ないのでとても良いのですが、
WSL2のインストールももう一度やることになります。
以前の記事「【WSL2】Ubuntu20.04でPID1をSystemdにする」を参考にしてみるとうまくいかない。
なんでや、と思ってもろもろ調べてみると結構手順が変わっていたので、調べながらインストールしました。
その手順をメモしておきます。

公式はこちらに移ったようです。
arkane-systems/genie: A quick way into a systemd “bottle" for WSL | https://github.com/arkane-systems/genie

READMEにはトップページを全部読んでね、と書いてあるので読んでおきましょう。
ではインストール。
なお、環境はUbuntu20.04です。

インストール手順

まずは、依存しているライブラリから。
Ubuntuなので、公式のDebianの手順を参考にしていきます。

dotnet-runtime-5.0を以下を参考にインストール。
https://docs.microsoft.com/ja-jp/dotnet/core/install/linux-ubuntu

wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt-get install -y dotnet-runtime-5.0

続いて本命。
こちらも公式が別で手順を置いてくれていたのでそちらを参考に。
https://arkane-systems.github.io/wsl-transdebian/

sudo apt install apt-transport-https
sudo wget -O /etc/apt/trusted.gpg.d/wsl-transdebian.gpg https://arkane-systems.github.io/wsl-transdebian/apt/wsl-transdebian.gpg
sudo chmod a+r /etc/apt/trusted.gpg.d/wsl-transdebian.gpg

sudo emacs /etc/apt/sources.list.d/wsl-transdebian.list
// Ubuntu 20.04環境なので<distro>をfocalに置換
deb https://arkane-systems.github.io/wsl-transdebian/apt/ focal main
deb-src https://arkane-systems.github.io/wsl-transdebian/apt/ focal main

これにて準備終わり。
本命をインストール。

sudo apt update 
sudo apt install systemd-genie

これにてインストール完了です。
あとはいつも通りgenie -sとかで動かせば終わり。

一応公式使い方を張っておきます。

以下からの引用ですよ。
arkane-systems/genie: A quick way into a systemd "bottle" for WSL | https://github.com/arkane-systems/genie

genie:
  Handles transitions to the "bottle" namespace for systemd under WSL.

Usage:
  genie [options] [command]

Options:
  -v, --verbose <VERBOSE>    Display verbose progress messages
  --version                  Display version information

Commands:
  -i, --initialize           Initialize the bottle (if necessary) only.
  -s, --shell                Initialize the bottle (if necessary), and run a shell in it.
  -l, --login                Initialize the bottle (if necessary), and open a logon prompt in it.
  -c, --command <COMMAND>    Initialize the bottle (if necessary), and run the specified command in it.
  -u, --shutdown             Shut down systemd and exit the bottle.
  -r, --is-running           Check whether systemd is running in genie, or not.
  -b, --is-in-bottle         Check whether currently executing within the genie bottle, or not.

まとめ

だいぶ長いことこの辺を詰まったタイミングで追っていますが、今回はどうもちょっと面倒でした。
というのも、元のリポジトリが移動したことでどこにあるのかを見つけるのに時間がかかりましたね。
見つかってよかった。

そして、元のリポジトリのころは「429 Too Many Requests」のエラーで更新できない状況が続いていましたが、Githubに移行したようで問題なくインストールできました。
何度かアップデートをたたいても問題なさそう。
良き良き。
これで心置きなくLinuxっぽい世界で遊べますね。

今回は、ここまで。
おわり

Ruby

こんにちは、しきゆらです。
毎年12~2月は気分が落ち気味で何も手がつかない時期なんですが、今年は何もできてませんでした。
気が付いたら、前回の更新が11月ということに驚いています。

さて、今回はタイトルの通りYAMLに環境変数を埋め込みたいなぁと思って何とかしたのでメモしておきます。
YAMLは設定ファイルなどでよく作りますが、Gitで管理したいが重要項目は共有したくないことはよくあるかと思います。
こんな時、YAMLファイルを知っていそうな人経由で回していく運用とかをしているところもあるかもしれませんが、ずっとうまく回るわけはありません。
ということで、YAMLに必要項目を記載しておき、チーム内だけで見れるところに必要な情報を置いておけばよいだろう、という考えです。

方針としては、ファイルにそれっぽいマーカーをつけて置き、ファイル読み込み時に環境変数と置換してYAMLオブジェクトを作る感じです。
例としてはこんな感じ。

# YAMLファイルを文字列として読み込み
yaml_str = File.read("path/to/yaml.yml")
# ${ENV_VARIABLE}形式で埋め込んだ環境変数を置換する
yaml_str.gsub!(/\${\w*}/) do |matched|
  ENV[matched.gsub(/\W*/, "")]
end
 
# YAML文字列をオブジェクトに変換
YAML.safe_load(yaml_str, symbolize_names: true)

実際に挙動を見てみます。
上記のスクリプトを適当なメソッドにして動かしてみます。

 irb(main):001:1* def test(yaml_str)
 irb(main):002:2*   yaml_str.gsub!(/\${\w*}/) do |matched|
 irb(main):003:2*    ENV[matched.gsub(/\W*/, "")]
 irb(main):004:1*  end
 irb(main):005:1*
 irb(main):006:1*  YAML.safe_load(yaml_str, symbolize_names: true)
 irb(main):007:0> end
 => :test
 irb(main):008:0> test("token: ${SERVICE_TOKEN}")
 => {:token=>nil}
 irb(main):009:0> ENV["SERVICE_TOKEN"]
 => nil
 irb(main):010:0> ENV["SERVICE_TOKEN"] = "hogehoge"
 => "hogehoge"
 irb(main):011:0> ENV["SERVICE_TOKEN"]
 => "hogehoge"
 irb(main):012:0> test("token: ${SERVICE_TOKEN}")
 => {:token=>"hogehoge"}

${SERVICE_TOKEN}という文字列を環境変数の置換して、hogehogeという値を埋め込むことができています。
マーカーは自分で定義しているので、正規表現が書ければ好きな形式で表現できます。
本来はerbとかを使って埋め込んだほうがいらないバグが起きないかと思いますが、中でやっていることはこんな感じなので知っておくと便利かと思います。

今回は、ここまで。
おわり

Windows,環境構築

こんにちは、しきゆらです。
今回は、需要がないと思いますが新しくPCパーツを買ったのでこれまでのパーツと差し替えたのでメモしておきます。
ついでに、いくつかベンチマークを回したのでどのくらいスペックが上がったのかもメモしておきます。

Windows,環境構築

こんにちは、しきゆらです。
今回は、タイトル通りWSL上でGUIアプリを動かせるように環境を作っていきます。

作業としては、WSL側はもちろんですがWin側にも準備が必要になっています。
なお、イメージとしてはWin側がサーバとなり、WSL上のアプリとやり取りしてGUIを表示する感じになります。

Mac,Windows,環境構築

こんにちは、しきゆらです。
今回は、MacからWinへSSH接続してWinにあるスクリプトを編集したい場面があったので、タイトル通りVSCodeを使って環境をつくってみたのでメモしておきます。

これまでWinで開発というとPowerShellとかWinでしか動かないもの以外はあまりやってきていませんでした。
最近はWSLやWindows Terminalの登場により便利にはなりつつありますが、メインはどうしてもMacでやってしまいます。
今回も、PowerShellを書く必要があったのでしょうがなくWinでポチポチしていましたが、キーボードやマウスの操作にイライラしたので、Mac側でWinにアクセスできないかと思って調べたら、意外と簡単にできたのでやってみました。

なお、接続先のWinPCにはWSL2が動いていることが前提となります。
環境がない場合は「【Win/WSL】Windowsで開発環境を整える」あたりを参考に作っておいてください。

RSpec,Ruby

こんにちは、しきゆらです。
少し前、レンタルサーバの支払いを忘れていて一瞬サイトが消えていました。
自分でもびっくりしました・・・。

さて今回は、というか今回もRSpecのお話。
ここ最近、お仕事で自分の書いている小さなスクリプトにテストがなくて怖いなーという思いが強くなりRSpecを書くことが多いので、その時のメモです。

最近書いているのは、Seleniumでとあるサイトで行っている操作を自動化するというもの。
どうしても外部サイトをあれこれするスクリプトを書いているとテストを書きにくいです。
ということで、直接サイトにあれこれする部分は最低限ログインできるかくらいしかかけていません。
どうするのがいいんでしょうか。

さて、Seleniumでブラウザを制御するときに困るのは、キャッシュやCookieなどの影響で挙動が変わること。
ログインしようとしても前回の残骸が残っていると何度も確かめることができない、なんていうこともあります。
そこで、タイトルの通りテストの時はプライベートモードで動いてほしいなーと思っていい感じに書く方法をあれこれ考えてできたものをメモしておきます。

RSpec,Ruby

こんにちは、しきゆらです。
今回はRSpecで特定の場合だけ動く・動かないようなテストを書く方法を知ったのでメモしておきます。

やりたいこと

ログイン周りのテストをCIで実行したくない

書いていたコードとしては、Seleniumを使ってWebサービスのテストを書いていました。
諸々のテストはいいんですが、ログイン周りのテストは2段階認証などがあるため、Waitをかけて人の手で操作していました。

このRSpecをCI上で動かそうとしたとき、ログイン周りだけは止めたい!
というのが一番初めにあったやりたいことでした。

特定のクラスを継承している場合は実行したくない

合わせて、コードの中で特定のクラスを継承している場合のみこのテストを実行したい、ということもありました。
RSpecはテストを共通化する仕組みがあるので、それを使ってテストコードを共通化していたのですが
一部共通化していたテストの中で、ちょっとまずい事態が出てきました。
上記に関連してSelenium周りなんですが、Seleniumを使うクラスとSeleniumを使わないクラスが出てきたことで共通化していたテストの一部がSeleniumを使わないクラスでは必要なくなるということが起きました。
共通化していた部分を分けてSelenium用の共通コードとSelenium使わないクラスの共通コードに分ければいいんでしょうが、両方とも分類的には同じくくりなので名前を分けるだけだと、名前が似てしまってごちゃっとしてしまいそうでした。

これを回避するために、共通化しているSpec側で実行されているクラスを判定して、必要ない場合は実行しないような世界を作りたかったんです。
こちらも併せて方法が分かったのでメモしておきます。

Linux,Windows,環境構築

こんにちは、しきゆらです。
今回は、MySQLをまっさらな状態からインストールして最初にはまるであろうルートパスワードの設定方法で詰まったのでメモしておきます。

毎回MySQLの初期ルートパスワードで詰まる

これまで、5.xのころからMySQLさんを使ってきましたが、バージョンの違いなのかディストリビューションごとの差異なのかはわかりませんが、初期状態のルートパスワードが変わります。
パスワードなしでログインできたり、どこかにあるログファイルにかかれていたり、いくつかバリエーションがあるようです。

今回、MySQL8.xをインストール後にルートユーザとしてログインしようとしてもログインできませんでした。
パスワードなしでアクセスしても怒られ、ログがそもそもどこにあるのかわからず完全に詰んでいました。
そんな中、過去の記憶を掘り起こしたところ、MySQLの初期化コマンドでルートパスワードを設定していたことを思い出しました。
secure_mysql_installationコマンドです。

Ruby

こんにちは、しきゆらです。
今回は、Rubocopの更新を追っていたときに初めて知ったことをメモしておきます。

Rubocopさんは、Rubyを書く方は大半使っているのではないか、と思われる静的コード解析ツールです。
設定により、メソッドの長さやネストの深さなどを制限することで読みやすいコードを書く手伝いをしてくれる頼もしいツールですね。

そんなRubocopさんですが、先日0.90.0がリリースされました。
使っているGemの更新履歴をある程度追っているため、更新内容を確認していたところ今回の更新でも新しい項目が追加されていました。
それが、Lint/UselessMethodDefinitionです。

There are at least 2 cases:
・empty constructors – this may be just overriding parent’s constructor, but this is bad anyway
・methods just calling super

https://github.com/rubocop-hq/rubocop/issues/8472

ということで、空のinitializeメソッドやsuperしか呼び出していないメソッドを怒ってくれるというものです。
内容的には妥当なcopではないかと思います。
必要ないものは書くべきではないですね。