Rust part33

1デフォルトの名無しさん
垢版 |
2025/08/15(金) 17:49:30.70ID:N8TIzbWg
公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust

公式ドキュメント
https://www.rust-lang.org/learn

Web上の実行環境
https://play.rust-lang.org

※Rustを学びたい人はまず最初に公式のThe Bookを読むこと
https://doc.rust-lang.org/book/

※Rustを学ぶ際に犯しがちな12の過ち
https://dystroy.org/blog/how-not-to-learn-rust

※Rustのasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/

※次スレは原則>>980が立てること

前スレ
Rust part32
https://mevius.5ch.net/test/read.cgi/tech/1755057787/
Rust part31 https://mevius.5ch.net/test/read.cgi/tech/1751545806/
Rust part30 https://mevius.5ch.net/test/read.cgi/tech/1748392296/

ワッチョイスレ
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.5ch.net/test/read.cgi/tech/1514107621/
2025/10/27(月) 15:22:52.00ID:8ULsq5Jc
Rust で書いて速くなるものは C でも C++ でも速くなると思う。
適切に再設計できれば。

ただ、書き直す機会があるときにこの時代にあえて C や C++ を使いたいとは思わないし、
元が C や C++ だったら同じ言語で書きなおすと元の設計に引きずられて同じような駄目なことをまたやってしまう。

Rust が特別に良いとまでは思わないけど「一新する良い機会」ではあった。

Go も良い言語だと思うけど抽象度は高くない。
C の駄目 (というか面倒くさい) なところである文法の不必要な複雑さやメモリ管理を楽にしたという側面が強くて、
大規模なプログラムを整理するのはちょっとしんどい。
出来るという人もいるんだけどそういう人はたぶん C でも出来てしまうタイプの剛腕だから参考にならない。
2025/10/27(月) 15:53:13.91ID:qhXNWfqN
そうだよな
TypeScriptの件がたまたまGoだけJSと1対1の対応を取れたのも、Goが抽象度高くない言語だったため
439デフォルトの名無しさん
垢版 |
2025/10/27(月) 17:49:39.72ID:HMompUGJ
Rustが欲しいというよりCargoが欲しいんだよ
って思ってたらCabinとかいうの見つけて笑った
2025/10/27(月) 18:45:30.45ID:l4eceh5X
でもなんでRustは欧米中心で使われててその他で低いんだ?
コミュニテイーの所属者もそんな分布でアジアは低い
1位アメリカ
2位ドイツって
日本は11位
2025/10/27(月) 19:32:35.62ID:UgAh1tV0
Goも似たような感じだね
単にsurveyのアナウンスが拡散されるプラットフォームの人口分布に引っ張られているだけな気もする
RedditとかHackerNewsとか
2025/10/27(月) 19:41:30.85ID:FbhZH/Sk
>>438
違うよ
Rustでも抽象度の低いコードは書けるけど、メモリ管理と所有権システムが邪魔で一対一対応が無理
2025/10/27(月) 19:42:44.69ID:edSRXQey
リファレンスが英語だからな
ガイドは翻訳されてるけどライブラリ周りはどうしようもない
444デフォルトの名無しさん
垢版 |
2025/10/27(月) 20:06:35.18ID:oTj8oDFF
でも中国5位じゃん
2025/10/27(月) 20:56:19.83ID:qhXNWfqN
>>442
その説明は既に>>436で書いた
所有権システムとメモリ管理を並列に「と」で並べるのはおかしい
446デフォルトの名無しさん
垢版 |
2025/10/27(月) 21:04:31.26ID:syMP9q/B
Rustのコレクションは移動なしでは書けまい
2025/10/27(月) 23:32:35.09ID:OMtkXyUi
>>446
意味不明だな
移動は最も基本的な不可欠な概念
移動の概念がなければコレクションどころか何も動かない
448デフォルトの名無しさん
垢版 |
2025/10/28(火) 03:31:36.61ID:jbGu9KYL
Rustのコレクションは基本的でかつ非自明的にすごい
それはシャローコピーでもディープコピーでもないものが書かせた
2025/10/28(火) 17:50:32.18ID:rJCEklN9
>>447
バカなの?
2025/10/28(火) 18:01:51.21ID:KGeQ1yOx
>>446
コピーはダメだけど
コピーよりコストが安くなり得る移動は問題ないでしょ
451デフォルトの名無しさん
垢版 |
2025/10/28(火) 19:07:26.87ID:Zt6hv4It
goてunixの作者が作っとうけえあんなに使われてるんかな
ポイント使えるのにgcがあるとゆうようわからん仕様
2025/10/28(火) 23:49:42.09ID:tW1WhAkg
>>451
Goのポインタは構文はC風だが、できることはJava等のGC言語のオブジェクト参照とほぼ同じ
そして、GC言語のオブジェクト参照はポインタとして実装されており、ポインタとGCの組み合わせは全く矛盾しない
2025/10/29(水) 01:38:08.80ID:KUd6rxlw
C#だってGCあるけどポインタ使えるじゃん
454デフォルトの名無しさん
垢版 |
2025/10/29(水) 12:14:41.38ID:vbO9JSKW
DBを使用するスマホアプリのバックエンド開発でRustを使用してるけど、sqliteがシングルスレッドでしか使えないから
逆に複雑な設計を求められるな。慣れるまできつい
2025/10/29(水) 15:34:17.17ID:L881d/fh
Rustエンジニアをクビにして代わりにペチパー雇って、浮いた金でMySQLに変えた方が遥かに速くなりそうだな
2025/10/29(水) 17:35:51.56ID:DwSXyKDH
RustはSingletonの初期化と共有がすっきりしないな
初期化忘れのunsafeが付き纏うからどこかで割り切らないといけない
457デフォルトの名無しさん
垢版 |
2025/10/29(水) 19:33:33.85ID:OVpZFjzC
once_cellでええやん
2025/10/29(水) 21:05:45.94ID:DwSXyKDH
OnceCellのget_or_initだと初期化処理が動くタイミングが読めない

気持ち悪いからmainの最初で初期化する

共有する時に毎回初期化済みかチェックするの無駄では

unsafe「呼んだ?」
2025/10/29(水) 23:50:28.94ID:xf92jPdM
そんなコード書くやつはクビ
2025/10/30(木) 00:25:31.66ID:9N/j/0Me
別にチェックしたらいいやん
逆にそんな初期化タイミング気にする理由教えてよ
「最初にたまたま使うタイミングで」初期化で自然なのにあえてメイン関数で初期化する理由
2025/10/30(木) 00:26:18.06ID:9N/j/0Me
>>454
sqlite 嫌いや
2025/10/30(木) 00:40:46.28ID:srGle5DG
初期化で重い処理があると変のタイミングで遅延が発生するのが気になる
最初にxxx_init(gl_initとか)で初期化するライブラリに馴染んでるのもあるけど
2025/10/30(木) 01:29:19.31ID:bVySussB
つかOnceCellじゃなくてLazyCell使えば?
初期化タイミング固定したいなら一発getしとけばよし
2025/10/30(木) 03:16:33.13ID:X8TSXlMe
>>454
>sqliteがシングルスレッドでしか使えないから
sqliteはマルチスレッドでも使えるぞ?
465デフォルトの名無しさん
垢版 |
2025/10/30(木) 03:58:11.87ID:KK7tlxBe
dockerhub見るとポスグレのほうがマイエスの2倍くらいpullされとうけどやっぱマイエスてオラクルだから嫌われてるの?
2025/10/30(木) 04:18:06.36ID:92TxX2hJ
>>463
最初のアクセス時に自動初期化してくれるだけでよいならDeref/DerefMutが使えるLazyCellが圧倒的に扱いやすいね
そうでなく初期化のタイミングを自由にして初期化以前はNoneを返したりset/takeを使ったりしたいならOnceCellだね
2025/10/30(木) 10:22:35.58ID:zpGcc97R
どっちもスレッドセーフじゃないだろ
2025/10/30(木) 10:35:58.35ID:bVySussB
そっすね
2025/10/30(木) 10:41:04.39ID:JG/b/82+
それぞれに対応するスレッドセーフ版のOnceLockとLazyLockがある
2025/10/30(木) 10:48:00.79ID:JG/b/82+
なのでそれを常識としてOnceXxxxとLazyXxxxの性質の違いの話かと
2025/10/30(木) 10:52:57.20ID:zpGcc97R
>>458
共有前にmainで必ず初期化するのであれば
共有後に毎回初期化済みかチェックする必要ない

逆に共有後の初回アクセス時に初期化するという形をとるなら
初期化済みかどうか毎回チェックするようなコードがどこかに必要

毎回チェックするコードを自分で書きたくなければ
LazyLock等に肩代わりしてもらえという話
2025/10/30(木) 11:04:47.24ID:zpGcc97R
>>466,470
LazyCell/LazyLockのget/get_mutがもうすぐstabilizeされるから
初期化以前はNoneを返すというのはどちらでも同じようにできるようになる

初期化関数で引数を受け取る必要もなく常に固定の初期化関数を実行すればいいだけならLazyCell/LazyLock
引数を受け取ったり条件によって違う初期化関数を実行したい場合はOnceCell/OnceLock
これが基本的な使い分け
2025/10/30(木) 11:23:27.81ID:JG/b/82+
使い勝手が天と地の差
Lazy~はderefできるから*Xでアクセスできてコードも見やすい
Once~は返値Option処理かget_or_init(|| ...)が必要
2025/10/30(木) 11:31:00.93ID:Nj0jrilV
シングルスレッド+遅延評価ではタイミングが不明
別スレッドのスタックに置けば遅延しないのでかえって違和感が少ない
2025/10/30(木) 12:35:20.68ID:zpGcc97R
>>473
それは使い分けの結果であって原因ではないからな

LazyCell/LazyLockでもinterior mutabilityを使えば
初期化時に引数を受け取るのと同じようなことができるが
get_or_init以上に使い勝手が悪化するから
derefしたいかどうかで選ぶものではない
2025/10/30(木) 13:04:12.82ID:Nj0jrilV
Option処理をしたくないとき
JavaにたとえるとNullPointerExceptionをcatchしたくないとき
必要なのは「catchされませんでした」みたいなパニックを容認すること
これがスタンダード

unsafeが必要だという考えはスタンダードではない
2025/10/30(木) 13:10:40.17ID:Nj0jrilV
unsafeもpanicもどっちも自由に使えばいい
panicを禁止するためにunsafeを使いたいのだとしたら自由とは言えない
2025/10/30(木) 21:08:57.21ID:8A2yOaqe
>>476
>Option処理をしたくないとき
まずこれが全くスタンダードじゃない
Option処理をしたくないなどという理由は容認されない
479デフォルトの名無しさん
垢版 |
2025/10/30(木) 21:45:45.78ID:pM7Xv5YE
例外処理でも条件分岐でも、わざわざ明記することはあっても、いつもそんな起きないことを書いていたら、他人には起きる例外だと認識されてしまう。
2025/10/30(木) 21:53:26.04ID:Nj0jrilV
Optionは長さに制限があるキューと考えられる
キューが空なら読む側はブロックすればいいのにブロックしないから無駄に複雑になる
481デフォルトの名無しさん
垢版 |
2025/10/30(木) 21:56:50.09ID:i4jbq83k
2025/10/30(木) 21:59:43.38ID:JG/b/82+
>>475
そこは併用することで解決できる
まずOnceLockで変数FOOの場合
初期化は例えばこうなる

static FOO: OnceLock<String> = OnceLock::new();
let foo = std::env::var("FOO").expect("no 環境変数FOO");
FOO.set(foo).expect("FOO: 初期化済");

このOnceLockのFOOの利用はこうなり可読性の悪い欠点がある
println!("FOO: {}", FOO.get().expect("FOO: 未初期化"));

一方でLazeLockで変数BARの場合
初期化で引数を渡せない欠点を先程のFOO活用で補える

static BAR: LazyLock<String> = LazyLock::new(|| BAR初期化関数(FOO.get().expect("FOO: not initialized")));
fn BAR初期化関数(foo: &str) -> String {
format!("適当に{foo}を変換")
}

このLazyLockのBARの利用はderefでこうなり可読性が向上する
println!("BAR: {}", *BAR);
483デフォルトの名無しさん
垢版 |
2025/10/30(木) 22:01:59.88ID:dCoHjFig
そういうのは一番嫌われる
484デフォルトの名無しさん
垢版 |
2025/10/30(木) 22:02:57.95ID:dCoHjFig
意味のない値に意味を持たせるのは最悪
2025/10/30(木) 22:17:52.20ID:JG/b/82+
FOOやBARは例示で用いる昔からの慣習だよ
Rustの標準ライブラリのdocでも使われてるよ
2025/10/30(木) 23:31:49.22ID:Nj0jrilV
2進数に集合の意味をもたせるとか、方程式に図形の意味をもたせるとかね
2025/10/31(金) 00:39:35.14ID:Z56C2bCz
>>482
さすが汚コード製造機の二つ名は伊達じゃないな
可読性が向上するw
2025/10/31(金) 01:23:46.44ID:UvKtMOZk
#defineが嫌われていなければexpect云々を#defineするだけで解決するが
嫌われているのが現実?
いや、好感度など無視して解決可能というのが現実じゃないか
489デフォルトの名無しさん
垢版 |
2025/10/31(金) 01:26:08.34ID:VeWziky5
C/C++のクセで毎回、何かを確認しないといけないと思い込んでいるのかな?
2025/10/31(金) 01:36:15.69ID:bL01KoQp
LazyLockは変数宣言を見れば初期化のための式や関数を追える点でも可読性いいよな
2025/10/31(金) 02:15:05.64ID:IDNiCq6B
Cellを激推ししてた時代の複オジを思い出した
成長しないね
492デフォルトの名無しさん
垢版 |
2025/10/31(金) 03:52:17.44ID:VeWziky5
C++のように使いたい人間がいるから面倒なんだよなあ
2025/10/31(金) 04:51:55.42ID:FXqlUjZZ
久しぶりにC++いじったら、依存ライブラリ管理がめんどくさすぎてキレそうになった
cargoはえらい
cmake大嫌い
494デフォルトの名無しさん
垢版 |
2025/10/31(金) 07:07:09.98ID:W/94wpUF
OnceLockやLazyLockを嫌いな人は代わりに何を使っているの?
2025/10/31(金) 08:13:57.15ID:UvKtMOZk
Mutex<Option<T>>
496デフォルトの名無しさん
垢版 |
2025/10/31(金) 08:16:32.55ID:W/94wpUF
>>495
デタラメな回答はダメ
2025/10/31(金) 08:43:37.37ID:zOlX52p0
初心に帰ろう
static mut FOO: MaybeUninit<Foo> = MaybeUninit::zeroed();
498デフォルトの名無しさん
垢版 |
2025/10/31(金) 08:47:38.08ID:W/94wpUF
unsafeは論外
2025/10/31(金) 11:44:05.74ID:UvKtMOZk
デタラメがダメならやはり
ウソでも本当でもないポストモダンみたいな言葉を話すのが一つの手段なんだよな
2025/10/31(金) 14:32:08.02ID:6Y8XYqCD
>>482
なんだこれ?
BAR初期化関数の中で普通に環境変数読めばいいだけだろ?
しかもこんな雑にpanicだらけのコード書くやついたらブチ切れるぞ
2025/10/31(金) 14:41:51.16ID:UvKtMOZk
まあいいじゃんそういうの
2025/10/31(金) 14:48:40.46ID:23LwyDl2
>>500
exampleで本題ではないエラー処理を略すのは常識なんだがdoc.rust-lang.org見たことない人なんやろか
2025/10/31(金) 16:19:06.11ID:Q4NMZH5V
現実にはあり得ないコードで可読性を論じるおバカさん乙
2025/10/31(金) 16:34:52.47ID:nOVciEeR
代案を出せばいいんじゃね
2025/10/31(金) 18:21:19.45ID:UvKtMOZk
案が増える保証はどこにもない
コメのように減産も増産もありうる
2025/10/31(金) 18:29:01.57ID:GZFK+llv
「批判するなら代案だせ」ww
度し難いクソコードに代案を求めるなよ

しかも既に代案出してもらってるというのにこのバカは
2025/10/31(金) 18:45:07.30ID:Gjt4wm2R
OnceLockとLazyLockがクソコードってRustのスレッドセーフ初期化で辿り着いた最善案なのに
2025/10/31(金) 18:47:08.71ID:FXqlUjZZ
代案はZigを使うこと
2025/10/31(金) 19:49:57.01ID:MSFuZ4Ne
昔は初期化のためにlazy_static!が使われてた
そこへ改良されたonce_cell::sync::Lazyが登場した
それを標準ライブラリに取り込んだのがstd::sync::LazyLockで最終形
2025/10/31(金) 20:47:30.17ID:T+pQSrXv
質問者が消えて要件不明なのにいつまでも基礎的な部分を整理だけし続けるいつものやつ
2025/10/31(金) 21:12:30.84ID:UvKtMOZk
ギリギリセーフは最善ではない
細かいルールに依存してしまうので些細なルール変更でアウトになる
という基礎知識
512デフォルトの名無しさん
垢版 |
2025/10/31(金) 21:15:37.01ID:+FXrANIZ
>>495
MutexとLazyLockは役割が全く異なる。
staticで使う場合にその目的に応じて以下の3つに使い分けられる。
LazyLock<T> 内部可変は不要で動的初期化をしたい場合
Mutex<T> 内部可変が必要で静的初期化をしたい場合
LazyLock<Mutex<T>> 内部可変が必要で動的初期化をしたい場合
2025/10/31(金) 21:45:15.58ID:T+pQSrXv
内部可変ってそういう意味じゃねえから
2025/10/31(金) 21:48:39.11ID:nBW4bT0X
このようにRustは非常に使いにくい言語です
2025/10/31(金) 22:01:01.32ID:UvKtMOZk
初期化と代入の役割は全く異なるとも言えるし、ほとんど同じとも言える
これも逆転しやすい
些細な変化で善悪が逆転する
2025/10/31(金) 22:20:06.99ID:Bc1Z9Piy
>>507
君の書いた>>475がクソコードなだけで
クソコードで使われてるLazyLockやOnceLockがクソだという話ではない
下手くそな論点ずらしはやめろ
2025/10/31(金) 22:21:19.33ID:Bc1Z9Piy
間違えた
クソコードは>>482だった
518デフォルトの名無しさん
垢版 |
2025/10/31(金) 22:40:17.03ID:+FXrANIZ
>>513
safe Rustではstaticは不変値になり不変参照しか得られない。
そのような不変参照しか持たない場合でも可変な借用を得られる仕組みが内部可変性。
>>512ではそのstaticで内部可変が必要な場合と不要な場合の区別が重要なので分けて説明したが、何を問題視している?
2025/10/31(金) 23:01:52.93ID:UvKtMOZk
任意のTを実体化可能
内部可変を禁止できると思ってるなら事実誤認
2025/10/31(金) 23:53:36.36ID:8btOyh6t
>>516
コード見たけど何が問題なのか教えて
2025/11/01(土) 10:00:34.52ID:aFOqjWrP
>>520
482みたいなAIやら人工知能に書かせたコードの善し悪しなんて語っても無駄
2025/11/01(土) 10:21:55.29ID:uKbhU6EZ
生成AIのほうが>>482なんかよりはるかにまともなコード書くぞ
2025/11/01(土) 10:29:48.54ID:uKbhU6EZ
試しにChatGPTになぜクソコードなのか聞いてみた

====
以下のコードがクソコードだと言われました。なぜクソコードなのでしょうか? どうすればクソコードじゃなくなりますか?

とても良い質問です。
このコード、**「動くけど設計として危険・臭い」**という典型的なクソコード(=悪い設計例)です。
なぜそう言われるか、そしてどう直せばいいか、順を追って説明します。

なぜ「クソコード」扱いされるのか
@ グローバル変数依存(隠れた順序依存)

BAR は FOO の値に依存しているのに、Rustの型システムではそれが表現されていません。
FOOをセットしてからBARを使うという順序前提が、コードの外にあります。
つまり:


A LazyLock と OnceLock の使い分けが不自然
FOO は「後でセットする」ための OnceLock
BAR は「自動で初期化する」ための LazyLock

しかし BAR の初期化に FOO が必要ということは、BAR の「自動初期化」が成立していません。
結局「FOOが先に初期化されていないと壊れる」=「LazyなのにLazyでいられない」状態です。


B 初期化エラーが実行時panic
expect("FOO: not initialized") は、
BARを最初に触ったタイミングでFOOが未初期化だったらpanic

という非常に脆い構造です。
初期化の安全性がコンパイル時に保証されず、実行時の偶然に依存しています。
2025/11/01(土) 10:30:45.08ID:uKbhU6EZ
「動くけど設計として危険・臭い」という典型的なクソコードです!
2025/11/01(土) 10:55:39.21ID:/uJItwLS
なぜAIはクソかを質問して
「AIの学習に人間が必要ということは自動初期化が成立していません」を生成できたら少しは信用できる
2025/11/01(土) 10:58:56.69ID:g3WZAZrD
>>518
たぶんRefCell/Mutex/RwLockあたりのロック付き型のことを内部可変性って呼んでるんだろうなって思ったけど

>不変参照しか持たない場合でも可変な借用を得られる仕組みが内部可変性。

この説明ならやっぱりそういう意味で書いてそうだね
Cell<T>もAtomic***も、さらに言えばLazyCell<T>も内部可変じゃないことになるが、まあそんなわけはないのでちゃんとドキュメント読んでね
2025/11/01(土) 11:04:56.46ID:mdP806Ha
言語に関係なく初期化ルーチンで必ず初期化を行なうグローバル変数などについては依存関係があってもいいんだよ
今回の場合は万が一その依存関係が崩れていればpanicで落ちるから完璧に安全でしょう
まずいのは依存関係が崩れても検知ができずに間違った未初期化の値のままプログラムが進むこと
Rustのpanicはこの基本概念に基づいて安全性のために存在しています
528デフォルトの名無しさん
垢版 |
2025/11/01(土) 11:40:18.77ID:M9NY+bCI
>>526
Rustでは内部可変を段階的に説明していてどちらも正しい。

一番の基本は、内部可変とは不変参照しか持たない時でも可変を許すパターン
https://doc.rust-lang.org/book/ch15-05-interior-mutability.html
Interior mutability is a design pattern in Rust that allows you to mutate data even when there are immutable references to that data
通常の説明ではこれで問題ない。

一方であなたの説明では一番大事な正確な定義が抜けているが、
Rustで内部可変とはUnsafeCellを用いていること、すなわちトレイトFreezeを実装していない!Freeze型を指す。
この!Freeze型とは内部可変をもたらすUnsafeCellを用いているか否かを示している。
AtomicもMutexもLazyLockも全て元を辿るとUnsafeCellが使われていて自動的に!Freeze型となる。
もちろん普段の説明ではこの厳密な定義を用いずに、内部可変とは不変参照しかない時でも可変を得られること、で構わないと思う。
2025/11/01(土) 13:01:38.93ID:s4kd72Pi
コード書くときにこういった謎の禅問答みたいなことを延々と続けてるのか
大変だな
2025/11/01(土) 13:03:56.65ID:g3WZAZrD
"allows you to mutate data"に対して「可変な借用を得られる」だと制限が強すぎて間違いだったのを理解したので
>>528では最初からそう言いたかったんですよってフリで「可変を許す」「可変を得られる」みたいな曖昧な表現にしれっと置き換える
これが所有権の複製話法です
2025/11/01(土) 13:08:31.28ID:c42kdQyz
rustは外部のライブラリーに依存しないで書くのは難しいような気がするのだが
2025/11/01(土) 13:08:31.85ID:TYBdxLbV
>>529
どれも単なる基礎知識だろ
コード書くための前提
2025/11/01(土) 13:19:59.11ID:QjdiwYjo
>>514
Rustの抽象度が高いことを使いにくいと感じる人は色んな知識経験が足りないんじゃないかな
抽象度の高いほうが可読性も保守性も良くて使いやすいよ
2025/11/01(土) 13:26:36.27ID:am2mePEs
>>529
普通はRustでもバイブコーディングでAI任せにして何も考えないから安心
どうでもいいことにこだわってるのは複おじぐらい
535デフォルトの名無しさん
垢版 |
2025/11/01(土) 13:28:11.18ID:b0QDefmP
rustは(知った被りアンチも多く嘘や不正確な情報が蔓延しているので)使いにくい
536デフォルトの名無しさん
垢版 |
2025/11/01(土) 13:35:00.58ID:c42kdQyz
rustはeatherはresultがあるから要らないといってなくなったらしいが、
errorのところにerrorじゃないものを入れてokのところに、
okじゃないものを入れるのにみんな抵抗感は感じないのだろうか
2025/11/01(土) 13:37:12.17ID:s4kd72Pi
GCに依存できる環境だとここまで考えなくてもいいんでしょ?
大変は大変でその代わりメリットがあると
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況