お知らせ

現在サイトのリニューアル作業中のため、表示が崩れているページが存在することがあります。
2024/01/23 22:15 言語::JavaScriptジャンル::調査

関数の仮引数の書き方でオブジェクトの参照がどう変わるか気になったので試したメモ。別に仮引数でなくても分割代入なら何でも結果は同じになると思う。

これはプロジェクトのコーディング規約に定めがなく、無秩序な状態になっていると不具合を引き起こす因子になると思うので、どの方法を取るのか決めたほうが品質に寄与すると考える。個人的には引数由来であることが明示的であり、必ず参照を引きずるオブジェクト代入方式(後述)が好みだ。

結果

分割代入した結果プリミティブになると元オブジェクトとの参照が切れる

仮引数方式 参照
分割代入
スプレッド代入
オブジェクト代入

分割代入した結果、オブジェクトのままだと元オブジェクトとの参照が残る(Shallow copy)
再代入は参照が切れるので影響しない(再代入で参照アドレスが変わるためと思われる)

仮引数方式 参照
オブジェクト再代入
オブジェクト書き換え

確認コード

// 分割代入
const foo = ({ id, name }) => {
  id = 2;
  name = 'aaaa';
  console.log(id, name);
};

// スプレッド代入
const bar = ({ ...props }) => {
  props.id = 2;
  props.name = 'aaaa';
  console.log(props.id, props.name);
};

// オブジェクト代入
const baz = (props) => {
  props.id = 2;
  props.name = 'aaaa';
  console.log(props.id, props.name);
};

// オブジェクト再代入
const hoge = ({ id, name, dat }) => {
  id = 2;
  name = 'aaaa';
  dat = {
    value: 3,
  };
  console.log(id, name, dat);
};

// オブジェクト書き換え
const piyo = ({ id, name, dat }) => {
  id = 2;
  name = 'aaaa';
  dat.value = 3;
  console.log(id, name, dat);
};


const test1 = { id: 1, name: 'test' };
const test2 = { id: 1, name: 'test' };
const test3 = { id: 1, name: 'test' };
const test4 = { id: 1, name: 'test', dat: { value: 1 } };
const test5 = { id: 1, name: 'test', dat: { value: 1 } };


foo(test1);
console.log(test1);

bar(test2);
console.log(test2);

baz(test3);
console.log(test3);

hoge(test4);
console.log(test4);

piyo(test5);
console.log(test5);

結果

// 分割代入では呼び出し元が影響を受けていない
2 'aaaa'
{id: 1, name: 'test'}

// スプレッド代入では呼び出し元が影響を受けていない
2 'aaaa'
{id: 1, name: 'test'}

// オブジェクト代入では呼び出し元が影響を受ける
2 'aaaa'
{id: 2, name: 'aaaa'}

// オブジェクト再代入では呼び出し元が影響を受けていない
2 'aaaa' {value: 3}
{id: 1, name: 'test', dat: { value: 1}}

// オブジェクト書き換えでは呼び出し元が影響を受ける
2 'aaaa' {value: 3}
{id: 1, name: 'test', dat: { value: 3}}
2024/01/23 22:12 ジャンル::自作PC

先日、StableDiffusionを快適に動かすためにグラボをRTX2060から4070Tiに更新しましたが、Core i7 13700F + RTX3060とレンダリング速度が変わらないということが解り、今回更に構成のアップデートすることにしました。

CPUの世代が古く、前々から構成をアップデートしたかったのもありエイヤで以下の内容を更新しました。メモリ代をケチるためにDDR4を維持できる構成にしてあるのがポイントです。

device before after
CPU Intel Core i9 9900 Intel Core i7 13700
M/B ASUS ROG STRIX Z390-F GAMING ASUS TUF GAMING Z790-PLUS D4

今回CPUソケットが変わり、CPUクーラーをどうするか悩んでいたのですがNoctuaが互換ブラケットを出していてくれたので助かりました。ハイエンド空冷は高いですからね…。

開封の儀

今回の品はCPUとマザボ、CPUクーラーの互換ブラケットです。

今回の品はCPUとマザボ、CPUクーラーの互換ブラケット

まずはマザボから。ROGからTUFにグレードダウンして何とも言えない気持ちですが、ROGもTUFもPRIMEも大差ない状態なので敢えて選ぶ必要がないので外しました。PRIMEでなく、TUFを選んだのはEthernet AdapterがIntel製だったからです。取り敢えずマザボ本体は以前使っていたROGと比べるとダサい感じになってしまったなと思うものの、マザボの見た目を気にしても仕方ないので考えないことに…。参考程度に箱で比較。

マザボの外箱
ROGと比べるとダサくなったなとか

箱を開けて付属品はこんな感じ。シール、取説、SATAコネクタx1、M2スペーサー x3、ドライバーディスクなどが入ってる感じです。取説を見るとM2ネジも入ってるらしいですが確認してません(後述の理由で必要になるケース少ないと思います)

マザボの付属品、シール、取説、SATAコネクタx1、M2スペーサーx3、ドライバーディスクなど

どうでもいいんですがマザボのシール使う人いるんですかね?バッテリーシールはまだしも、バックパネル側面のシールとか貼るとデザイン性が劣化すると思うんですが…。

CPU電源は今までに見たことがない12ピンでしたが8ピンで動きます。4ピンはおまけみたいなもん。K付きCPUとかOCする人は使うのかな?

マザボの取説

そういえばASUS ROG STRIX Z390-F GAMINGのM2SSDヒートシンクを剥がそうとしたらSSD側にサーマルパッドが固着して剥がれないという無惨な現象に遭遇しました。以前は綺麗に取れたのですが、今回のSSDは表のシール剥がしたからこうなってしまった気がします。多分SSDに貼ってあるシール剥がさないほうがいいですね…。(嗚呼…マザボの中古売却価格が無駄に下がってしまう…)

SSDに固着してしまったサーマルパッド
ヒートシンクのサーマルパッドが千切れてしまったので中古買取価格が下がってしまう…

気を取り直してCPUを開けていきます。13thは今時のフラットデザインという感じで、なかなか悪くないパッケージです。バーコードにある通りドスパラのなんば店で買ってきました。比較用に9thの箱もおいておきます。今見るとなんかダサい感じがしますね。

フラットデザインでカッコいい13thの箱
9thの箱、当時はカッコよかった気がするけど今見ると色褪せて見える気も…

CPU本体はLGA1700になってLGA1151より大きくなってます。多分今後も大きくなっていくんでしょうねこれ。

LGA1151と比べて縦に長くなったLGA1700

次はNoctua NH-U12AをLGA1700に対応させるための純正ブラケットです。取り敢えず必要最低限のパーツだけが入ってる感じ。無料でも入手できますが、レシートとか持ってないのと、オーストラリアからの発送は時間かかるだろうなというので諦めました。

但し実際にはサイズから数日で届くらしいです。

黒いのが好きなのでCHROMAXを買いました
純正ブラケットの中身

取り敢えずCPUソケットにCPUを入れましたが、なんか今回はレバーがきつかった気がします。

9thの時よりCPUカバーがなんか強そう

あとはNoctuaのグリスを塗ってあげて。

Nocutuaのグリス、容量あっていいですよね

気合でクーラーを装着します。これ左右どっちかにちょっとでも寄ってると上手くブラケットにリテンションキットがはまらないので中々苦労します。取り付けるとき素手でやってるからか微妙に錆びてる気もしますが気にしない方向で…。

CPUクーラーは気合で取り付ける

さて最後にM2SSDですが、ネジがいらないと書きましたがプラスチック製のラッチがついていて、これでM2SSDを固定できるようになっています。M2SSDのネジ止めは地味に面倒なのでこれは助かります。このラッチは取り外せるので、外せばネジ止めも恐らく出来ると思います。(ネジ穴自体はあるようにみえるので)

M2SSDの取り付けに便利なラッチがついている

ASUSマザーからASUSマザーへの更新だったのでユーティリティやその設定も使い回せて楽ができたのは良かったです。BIOSの設定を最低限変えるだけ(前のマザボと同じ設定にしただけ)で更新できたのでとても楽でした。

ひとまずこんだけあればあと三年は持つと思うので、しばらくは安泰そうです。前回のアップデートも3-4年くらい前でしたし、ぼちぼちなペースです。(前回はかなりアップデートが分散してたなぁ…とか思い返したり)

組み上げ後写真

光るパーツとしてはマザボくらいしかないのですが、そもそも前回写真取ってなかったなということで後で見返すために残しておきく。グラボがROGからZOTACになった影響で見栄えがイマイチ…。

新構成 - 前景
新構成 - 斜め上から
新構成 - マザボ拡大。右端のほうがほのかに光ってるのがわかる

参考程度に以前の構成(グラボ換装前)はこんな感じ。この時はマザボが光る箇所を撮影できてなかったのでアレ(CPUクーラーの死角になってしまっている)

旧構成 - 前景
旧構成 - 斜め上から
旧構成 - マザボ拡大

そして肝心のStableDiffusionの結果については、こっちの話に繋がります。

Colab ProとRTX4070TiでStableDiffusionをベンチマークしてみた

トラブルシューティング

今のところネットワークアダプタ周りのトラブルが多い

ASUS TUF GAMING Z790-PLUS D4トラブルシューティングメモ

おまけ

特に意味は無いですが、前にStableDiffusionで生成した美少女を供養がてら置いておきます。

前にStableDiffusionで生成した美少女

事前準備

事前に必要なコンポーネントをインストールしておく

セットアップコマンド

MSYS2などのPOSIX互換レイヤー上のシェルで動かすことを想定

# get Stable Diffusion web UI
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git

# get extentions
git clone https://github.com/nolanaatama/sd-webui-tunnels stable-diffusion-webui/extensions/sd-webui-tunnels
git clone https://github.com/Mikubill/sd-webui-controlnet stable-diffusion-webui/extensions/sd-webui-controlnet
git clone https://github.com/fkunn1326/openpose-editor stable-diffusion-webui/extensions/openpose-editor
git clone https://github.com/yfszzx/stable-diffusion-webui-images-browser stable-diffusion-webui/extensions/stable-diffusion-webui-images-browser
git clone https://github.com/DominikDoom/a1111-sd-webui-tagcomplete stable-diffusion-webui/extensions/a1111-sd-webui-tagcomplete
git clone https://github.com/Bing-su/dddetailer stable-diffusion-webui/extensions/dddetailer
git clone https://github.com/mcmonkeyprojects/sd-dynamic-thresholding stable-diffusion-webui/extensions/d-dynamic-thresholding

# make resource dirs
mkdir -p stable-diffusion-webui/models/ESRGAN/
mkdir -p stable-diffusion-webui/models/Lora/
mkdir -p stable-diffusion-webui/models/VAE/
mkdir -p stable-diffusion-webui/models/hypernetworks/
mkdir -p stable-diffusion-webui/extensions/sd-webui-controlnet/models/

# get controlnet
curl -Lo stable-diffusion-webui/extensions/sd-webui-controlnet/models/t2iadapter_canny_sd14v1.pth https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_canny_sd14v1.pth
curl -Lo stable-diffusion-webui/extensions/sd-webui-controlnet/models/t2iadapter_color_sd14v1.pth https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_color_sd14v1.pth
curl -Lo stable-diffusion-webui/extensions/sd-webui-controlnet/models/t2iadapter_depth_sd14v1.pth https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_depth_sd14v1.pth
curl -Lo stable-diffusion-webui/extensions/sd-webui-controlnet/models/t2iadapter_keypose_sd14v1.pth https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_keypose_sd14v1.pth
curl -Lo stable-diffusion-webui/extensions/sd-webui-controlnet/models/t2iadapter_openpose_sd14v1.pth https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_openpose_sd14v1.pth
curl -Lo stable-diffusion-webui/extensions/sd-webui-controlnet/models/t2iadapter_seg_sd14v1.pth https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_seg_sd14v1.pth
curl -Lo stable-diffusion-webui/extensions/sd-webui-controlnet/models/t2iadapter_sketch_sd14v1.pth https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_sketch_sd14v1.pth
curl -Lo stable-diffusion-webui/extensions/sd-webui-controlnet/models/t2iadapter_style_sd14v1.pth https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_style_sd14v1.pth
curl -Lo stable-diffusion-webui/extensions/sd-webui-controlnet/models/control_v11e_sd15_ip2p.pth https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11e_sd15_ip2p.pth
curl -Lo stable-diffusion-webui/extensions/sd-webui-controlnet/models/control_v11e_sd15_shuffle.pth https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11e_sd15_shuffle.pth
curl -Lo stable-diffusion-webui/extensions/sd-webui-controlnet/models/control_v11f1e_sd15_tile.pth.pth https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11f1e_sd15_tile.pth.pth
curl -Lo stable-diffusion-webui/extensions/sd-webui-controlnet/models/control_v11f1p_sd15_depth.pth https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11f1p_sd15_depth.pth
curl -Lo stable-diffusion-webui/extensions/sd-webui-controlnet/models/control_v11p_sd15_canny.pth https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15_canny.pth
curl -Lo stable-diffusion-webui/extensions/sd-webui-controlnet/models/control_v11p_sd15_inpaint.pth https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15_inpaint.pth
curl -Lo stable-diffusion-webui/extensions/sd-webui-controlnet/models/control_v11p_sd15_lineart.pth https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15_lineart.pth
curl -Lo stable-diffusion-webui/extensions/sd-webui-controlnet/models/control_v11p_sd15_mlsd.pth https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15_mlsd.pth
curl -Lo stable-diffusion-webui/extensions/sd-webui-controlnet/models/control_v11p_sd15_normalbae.pth https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15_normalbae.pth
curl -Lo stable-diffusion-webui/extensions/sd-webui-controlnet/models/control_v11p_sd15_openpose.pth https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15_openpose.pth
curl -Lo stable-diffusion-webui/extensions/sd-webui-controlnet/models/control_v11p_sd15_scribble.pth https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15_scribble.pth
curl -Lo stable-diffusion-webui/extensions/sd-webui-controlnet/models/control_v11p_sd15_seg.pth https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15_seg.pth
curl -Lo stable-diffusion-webui/extensions/sd-webui-controlnet/models/control_v11p_sd15_softedge.pth https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15_softedge.pth
curl -Lo stable-diffusion-webui/extensions/sd-webui-controlnet/models/control_v11p_sd15s2_lineart_anime.pth https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15s2_lineart_anime.pth

# get embeddings
curl -Lo stable-diffusion-webui/embeddings/badhandv4.pt https://civitai.com/api/download/models/20068
curl -Lo stable-diffusion-webui/embeddings/EasyNegative.pt https://huggingface.co/datasets/gsdf/EasyNegative/resolve/main/EasyNegative.pt

# get model
# upscaler
curl -Lo stable-diffusion-webui/models/ESRGAN/4x-UltraSharp.pth https://huggingface.co/nolanaatama/ESRGAN/resolve/main/4x-UltraSharp.pth
curl -Lo stable-diffusion-webui/models/ESRGAN/TGHQFace8x_500k.pth https://huggingface.co/dwnmf/deliberatev2/resolve/main/TGHQFace8x_500k.pth

# model
curl -Lo stable-diffusion-webui/models/Stable-diffusion/AOM3A1B_orangemixs.safetensors https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/Models/AbyssOrangeMix3/AOM3A1B_orangemixs.safetensors

# vae
curl -Lo stable-diffusion-webui/models/VAE/orangemix.vae.pt https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/VAEs/orangemix.vae.pt
curl -Lo stable-diffusion-webui/models/VAE/kl-f8-anime2.ckpt https://huggingface.co/hakurei/waifu-diffusion-v1-4/resolve/main/vae/kl-f8-anime2.ckpt

起動コマンド

dddetailerの依存ライブラリインストールで初回起動はかなり時間が掛かるので気長に待つ。

./webui-user.bat

設定

  1. Settings -> User Interface
  2. Quicksettings listに以下を追加
    • , sd_vae, CLIP_stop_at_last_layers
2024/01/23 20:34 ジャンル::ガジェット

G913 TKLはロープロファイルキーボードの中ではかなり良い品だと思いますが、純正のキーキャップの販売がなく、キーキャップが破損しやすい難点があります。そこで、今回はAliExpressでキーキャップを買って使えるかどうか試してみることにしました。

利用したセラーと買ったもの

今回はKite Town Storeというセラーで販売されている互換キーキャップを購入しました。

キーのバラ売りや、UKタイプのセット売り、よく壊れるキーのセット売りなどがあり、非常に充実しています。

https://ja.aliexpress.com/item/1005004841057006.html
https://ja.aliexpress.com/item/1005004344812002.html

今回はAとCtrlが欲しかったので、こちらのページからWASDセットとCtrl2個セットを購入しました。メルカリとかで売られているキーキャップより安いですし、この辺りはメルカリとかだと売り切れてるキーなのでとても重宝します。

注文から到着までは10日だったので、比較的早かったかなと思います。送料は無料でした。

開梱の儀

よくある不透明で外側がやたら頑丈な中華プチプチ

梱包はいつもの中華パックという感じ。

中にはテープ止めされた小箱が入っており、更にクッションで保護されていました。ここまで丁寧な梱包だと安心できます。
image:S:adiary/2023/:20230429_013516.jpg:キーキャップが収められた小さな段ボール箱]

プチプチ+ダンボール+クッションの三重防護

使わないキーの収納に便利な小袋付き

中身は商品ごとに小袋に分けられており、今回使わなかったキーを保管するのに便利でした。

表面のツヤの違いは皮脂の染み混み具合だと思う
裏側も純正と変わらない感じ

Ctrlキーの比較。上が純正、下が今回買った互換キーです。基本的に純正品と変わらないかなと思いました。表面の質感が違うのは使い込んだキーと新品だからだと思います。

こちらも純正と違わない感じ
裏側もバッチリです

Aキーの比較。こちらもCtrlキー同様に純正品と変わらない品質に思いました。手触りにも違和感がないので、特に何か気になることはないと思います。

掃除してないので汚いですが、見た目は純正と変わらないと思います

最後に実際にはめ込んでみたところです。JISキーボードですがCtrlキーのサイズはピッタリでした。またライトアップもキチンと機能するので満足です。見た目も手触りも特段違和感がなく、キーのはめ込みもスムーズで、まるで純正のキートップのように思えました。もしまた壊れたら今回のセラーから買おうと思いました。

キーキャップの取り外しにはFILCO KeyPuller FKP01を利用してます。プラ製のより細くて差し込みやすく、金属製ですがキーキャップに傷が付くこともないので、掃除のときにも重宝してます。

あとがき

G913 TKLのキーキャップはメルカリやヤフオクでも買うことができますが、純正品をバラした余りのようで、キーの品揃えが良くないです。特に壊れやすいキーは出品されてもすぐに売り切れるので狙うのが難しいと思います。しかしJISにしかないキーを入手したい場合や、すぐ手に入れたい場合は有効な選択肢になると思います。

他にもUS配列の互換フルセットがAmazon.co.jpに転がってるので、アリエクを使いたくない人はこちらを検討してみるのもいいかも知れません。ピンポイントで買えないので高いですが…。ちなみにこっちは買ったことがないので品質のほどは不明ですが、レビューを見る限り問題なさそうには見えます。

もし配送時間がかかっても良く、JISキー以外が目的であれば今回のセラーから買うのが無難に思います。

2024/01/22 21:07 ジャンル::OSS活動

小規模なものしかないが、一応活動記録として残しておく。新しい順