◎正当な理由による書き込みの削除について: 生島英之 とみられる方へ:Rust part29 YouTube動画>1本 ->画像>2枚
動画、画像抽出 ||
この掲示板へ
類似スレ
掲示板一覧 人気スレ 動画人気順
このスレへの固定リンク: http://5chb.net/r/tech/1746200850/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。
>>前969 >このパターンが「便利だから」という理由で他の言語でも流行る C++のstreamのsetwみたいでださいな
>>前995 > 構造体のフィールドに値を入れていって構造体を作成しても > derive_builderを使いメソッドで値を入れていっても同じになった > メソッド呼び出しが消えた > ゼロコスト builderのコストは下記。名前付き引数とデフォルト値を使用した方法であれば全て不要で単なるnewの呼び出しとなるが、これらが全て最適化で消えるのか? * パラメータ用の構造体(以下P)のアロケーション * 構造体Pのデフォルト値での初期化 * 構造体Pのフィールドに対する上書き * 構造体Pから最終的に作成する構造体への各フィールドの逐次的なコピー * 構造体Pの破棄
全部消える。 構造体初期化の文法で書いた場合と同じ。 最適化しない場合の素朴な処理でもそんなに気にするような深刻な差もない。
>>4 compiler explorerで示して
君は見たか? 複おじがぐうのねも出ずに論破された所を
大体のケースでビルダーパターンはアンチパターンと主張し続けて20年以上経つ
最適化されることを主張するなら証拠を示すべきなのは当然だが、 コピーの最適化を前提にするのなら例えば安易にCopy実装したりcloneしたりすんな、 みたいな意識高い言説は多くの場合無意味になっちゃうわけだけど、Rustおじはそれでいいのだろうか
この流れは流石に重箱の隅をつつきすぎじゃないの? Rustのビルダーはオプショナルな動作を指定するパターンでしかないし、これが最適化されないと困る場面もそんなに無い せいぜい、ヒープを使うデータについてビルダーを消費するか、中身を clone するかを検討するくらいでしょ コピー動作が問題になるとしたら、例えば数十万とかの要素を持つ配列の for ループ内でビルダーを使う場合が考えられるけど、それならビルダーを1度だけ作ってそれを使いまわせばいいし 「Rustにも他の言語のオプション引数やキーワード引数があると嬉しいよね」という話なら同意だけど、ビルダーのパフォーマンスはそんなに重要な話でないというか
匿名の藁人形は作れない 作れるのは名指しできる個人や団体だけ だから実名のSNSは嫌なんだよね
RustやC++のゼロオーバーヘッドが意味するところは結局「俺達のコードがどのように処理系によって最適化されるかを俺達は知っている」ということであって、 どのような最適化がなされるかについて一定の透明性があり結果が自明であることが重要 その点で、コピーの最適化を前提にするってのはかなり微妙
「かいたとおりにうごく」が最適化では成り立たないからなぁ
昔ある言語でcontinueがないぞと散々言われて、gotoが実装されたことがあった 何もしないのと比較すればcontinueの提案は優れていたかもしれないが それは比較対象との相性が良かっただけ
数年前に読んだ書籍にcontinueは使うべきでないと書かれていて驚いた
>>10 安易に clone すべきでないのは所有権管理の話で、実行コストの話とはレイヤが違う。
スマホとPCの作業を効率化したい--「Copilot Vision」の便利な8つの活用例
2025-05-03 07:00
https://japan.zdnet.com/article/35232549/ 1 プログらまーまこれを改造してるので上記以外の状態でも使用できるようにしている
2 すでにプログラムがあるので1〜コードを作成する必要が無い
ボイス・トォ・スカルの本態が一般パソコンにまで来たのでつい買い捨てができるようになった
マネーロンダリング 談合 インサイダー などがはかどるといわれる
>>3 それらは最適化ですべて消えて最終的な初期化構造体のみになった
イテレータメソッドチェーンなどの時と同じ原理
それはもっと極端で各イテレータ毎にいくつ構造体があろうと縮約したりレジスタ化されたりして各構造体は消えていく
>>19 cloneして意図通りに動作しなくなるならそりゃ普通にcloneの実装もしくは利用者側のバグだろ。作法の問題ではない。
そんな中身を理解しないままコピペしてるバカみたいな低次元のことは誰も問題にしていないでしょ。
>>10 区別できないバカなのか?
ムーブの時などを含めて実態がコピーになるといってもコピー元は二度と使われないのだから最適化できる
一方でclone()などはコピー元をその後も使うためにコピーしている
コピー元を二度と使わないならclone()の必要がない
そしてコピー元をその後も使うから最適化の前提さえ成立しない
それは少なくともbuilderの最適化の文脈においては明確に誤り 実際、derive_builderはcloneが最適化されることに依存している
RustやC++のムーブも同じで一次的にはコピーをして元を使わないため最適化できる場合が多い 一方でプログラマがコピーやクローンを明示的にした場合は元が生きていて全く異なる そもそも元も後で使いたいからコピーしているわけだ だからムーブとは異なり最適化でコピーが消えることはない もちろん後で使いたい場合はコピーして渡すのではなく参照を渡すのが正解だ したがってプログラマはコピーを可能な限り避けるべきである 暗黙のコピーが行われるプログラミング言語では意識せずコピーしてしまう プログラムを見ただけですぐにコピーしてあることがわかる方が望ましい RustではCopyトレイト実装した型のみ暗黙のコピーが起きる 前述のように数値などはその方が有利なので最初からCopy実装されている ヒープを用いない型ならばプログラマは自由にCopy実装できるがコード上でそれが明示され読む側は気付ける サイズが大きく参照で扱った方がよい型をCopy実装していればおかしいことがわかる 一方でヒープを用いていればCopy実装はできないがClone実装はできる これはコード上でfoo.clone()とコピーすることを明示的に記述する必要がある したがって参照を使えばよいのに無駄なコピーをしていればすぐにわかる
無駄をなくそうとしたらコンパイルが通らなくなった っていう質問を処理するコストが高いよね 実行時のコストではなく
読む気が失せる分だけど読んだ ところが間違ってるというか言い過ぎだと思う
クソデカ長文とかどこでも現れる辺りRustとRubyって似てるなーと思った次第である
この程度で長文扱いって普段どれだけ文章を読まないんだよ。
暗黙のコピーが行われるプログラミング言語は大体値のコピーを行っている 値はこの場合参照なのでコストは限りなく低い 暗黙でポインターをコピーしてそれがコストが掛かると言う人はいないだろ
>>30 読む気が失せるのは文章が下手くそだからであって長いことは関係ない
そしてボロボロと誤りと言うか独断に基づいた誤りがたくさん入っている
複おじはAIに下書きを食わせて推敲してもらうべきだと思う
むしろAIに生成させてるんじゃないかと思われる 同じことを何度も何度もダラダラ箇条書きに 眠くなるわ
見たい所だけ切り取ればいいんだよ 切り取りや編集の責任をトリクルダウンするために、書く側は編集をしないという戦術だろうけど それはどうでもいい
AIではないよ 小論文など書くときに指摘されるけど、考えをまとめないでずらずらと続く文章は修正しろと言われる 一部の行頭だけ切りだすと以下のように前の文章とつなげて書いてるから読み手にはわかりにくい ↓これが連続して使われているので読み手への負担になっている 一方で そもそも だから もちろん したがって
人間の脳もスタック状になってるんでドンドン文が接続されていくと脳内にスタックが作られてスタックがチェーンして肥大化して理解が苦しくなる これは当たり前
文章がダラダラと接続されているものは、まともに推敲されていないので、基本的に読むコストに比べて得られるものが少ない 雰囲気で書かれているので間にも間違いや矛盾が含まれている 読み手に対して読みやすさが考慮されていないのでふつーに読まなくても良い
ここでようやくchatGPTに聞いてみた ✅ 読みにくさの主な原因 1.接続詞やつなぎ言葉の多用による文の長文化 「一方で」「だから」「そもそも」「もちろん」「したがって」などの論理接続語が多く使われ、それぞれの文が長くなりがちです。 結果として、読者は一文ごとの意味の切れ目を捉えづらくなります。 2. 文構造が複雑で、主語と述語の対応が曖昧 「コピーして渡すのではなく参照を渡すのが正解だ」のように、主語が省略されていて読み手が文脈を補う必要があります。 3.抽象的な話が続き、具体例や対比が乏しい 例えば「ムーブはコピーと違う」と言いつつ、具体的にどう違うのかの明示がないため、読者が前提知識を持っていないと理解しにくいです。 4. 視点の切り替えが頻繁 ムーブとコピー、CopyとClone、参照と値渡しなど、話題が細かく切り替わっているが、その都度明確な導入がないため混乱を招きます。
もっと詳しく書け、とAIが言っている みんなAIに騙されてる
さっき書いた部分は連続で接続されている A 一方で B = C(文意) C そもそも D = E(文意) E だから F = G(文意) 略 Y したがって Z Zを理解するためにAから後を状態や文意を含めて全部覚えておかないといけない 読み手を疲弊させるには接続を多用したらいいとも言える
みんな読みやすい文を書いて良い大学、良い企業に入りたいとか 読みやすい文を書いて本を出版して売りたいとか 金の為に文を書いているからな 文なんて記号に過ぎない意味が伝わればいいのよ
意味が伝わればいいとか言ってるやつが書いた文章はたいてい伝わってねーから。 プロが推敲したってきちんと伝えるのは難しいのにそれ以下の質ならそれ以下にしか伝わらないよ。
国語の天才が推敲すると数学も理科も社会も意味がわかるようになるなら 学校で国語だけ教えてればいいだけだろボケ
確率扁微分方程式を国語で説明してくれ 三行でよろぴく
AIにコードを生成させるならもうRustはいらない子だよね
>>48 こういうのはビッグウェーブに乗る力であって国語力ではないね
他人に自分の主張を理解してもらいたいなら、少なくともわかりやすく書く必要がある いつも例の人の文章を読んでると念仏を聞いてるような気分になる 誰かが眠くなると書いてたけど自分もその印象が強い 言葉を吐くマシーンの様で理解してもらおうなどと思ってないんだろうなと
理解されるためならなんでもしますという意志はたいして重要ではない気がする なんでもするって言わせたい人にとって重要なだけだろう
文章の読みやすさを意識しないプログラマのコード品質って大丈夫なのか?
理解されないなら主張としては存在しないのと変わらない 公共の場にただのデカいゴミがあってみんな邪魔だなって思うだけ
derive_builderのドキュメント見てみた
Rustはこれらのclone呼び出しも最適化して賢いと書かれている
https://docs.rs/derive_builder/latest/derive_builder/#-performance-considerations Performance Considerations
Luckily Rust is clever enough to optimize these clone-calls away in release builds for your every-day use cases. Thats quite a safe bet - we checked this for you. ;-) Switching to consuming signatures (=self) is unlikely to give you any performance gain, but very likely to restrict your API for non-chained use cases.
derive_builderはRustのセマンティクス的には割と非効率な実装を採用していて、 常に一度のbuildだけの使い捨てに特化したバージョンも提供するなど制約を強めることで更にセマンティクス上効率的な実装もありうる でもそうしないのは実際最適化で変わんなくなるんだろう コンパイラの解析に委ねる前にセマンティクス上の最適を目指すのがRustの大きなコンセプトだと個人的には思っているが、その観点ではあまり理想的とは言えないやり方だし、 Rustの言語側にも改善の余地があるかもしれない
#[builder(pattern = "owned")]だと使い捨てになるんでしょ こっちをデフォルトにした方がいい気もするけど1回しかbuildしない場合は最適化されて同じになるらしい
さらに限定したケースでRustコードの段階で最適化できる可能性もあるかもしれない この初期化ビルダーがプログラム全体のネックになる時が来たらチャレンジするかな 現実には誤差の範囲内なのでこのderive_builder利用で十分と思う 初期化関数を自分で用意せずとも構造体への属性修飾だけでよい利便性は他のプログラミング言語と比べてもベスト
でもビルダーパターンは潜在的にバグ発生の要因をはらんでいる
>>58 あらゆるパターンが潜在的にバグ発生の要因をはらんでいるから意味のない発言
具体的にderive_builderでバグ発生の要因があるなら指摘して
IDEのサポートを受けた元で初期化関数を使うのがベスト 単純にビルダーパターンで起こる記述漏れ、順序の間違い、重複指定バグが減る
>>59 前スレで書いたけど複おじは反論不能だったみたいでスルーしてたな
複おじ論破されて草だった
>>60 手動で初期化関数を作るのは面倒かつバグの入る余地もあり劣ってる
derive_builderは利便性も良いからこれより優れているものを持ってこないと話にならないかと
>>61 「おじ」使いのキチガイの人かよ
具体的にderive_builderでバグ発生の要因があるなら指摘しなさい
>>62 そんなもんテストでわかるでしょう
テストしないところでビルダーパターンはバグを起こす可能性が高い
人間がビルダーパターンのメソッドに注視して思考してパラメーターを指定する場合は問題が比較的起こりにくい
それをコピペや思い込みで書くとヒューマンエラーが入り込む余地がある
ビルダーパターンで複数行でメソッドを記述した場合には列レベルで記述が抜けることが考えられる
行で記述しても対応ミスなどが起こる
複おじは問題点をわざと見ないふりをしている
>>64 わざわざ手動で初期化関数を作ってテストするってか
面倒なだけでメリットが全くない
利便性も良いderive_builderより優れているものを持って来なされ
>>66 前スレで問題点を指摘されて論破されて何もできないで誤魔化してるんでしょ
みっともない
>>67 誤魔化してるのは君だ
derive_builderに問題点があるなら指摘しなされ
derive_builderよりも利便性の高い方法があるなら持ってきなされ
>>68 ストローマン論法だな
自分の主な主張はで前スレで書いたようにビルダーパターンは複雑なオブジェクト生成で使われるべきで
普通のオブジェクト生成ではコンストラクタなどの初期化関数を使うべきと言うもの
理由はビルダーパターンはヒューマンエラーが入り込む余地が非常に大きいから
初期化関数はIDEの補助があるのでビルダーパターンで起こる問題が発生しにくいか発生しない
それにしても「~しなされ」って言われたのは人生で初じゃないかな ガチおじいちゃんじゃん 複おじいちゃん
>>69 詭弁はよろしくない
derive_builderは自分で初期化関数を書く必要がない
他の方法では初期化関数を書く必要がありヒューマンエラーが入り込む余地があるのはその通りだ
利便性も良くてその問題が生じないderive_builderが優れている
>>71 ストローマン論法だな
こちらの主張していない内容を勝手に作り出してそれで話を続けている
初期化関数はビルダーパターンのメソッドの適用ミスで容易に起こりうる 重複、順序ミス、記述漏れに対して有用 初期化関数自体は一回書くだけ 各所で必要になる単純なオブジェク生成の場面ではビルダーパターンはヒューマンエラーが入り込む恐れがある それを初期化関数で行えばIDEの補助を得られるのでミスが減る
>>73 先ほどから主張しているderive_builderを使わなければIDEの補助が得られるからミスが減るの意味がわからない
derive_builderを使えば初期化関数の用意はお任せなので提供側のミスはない
利用側はデフォルト値以外の値指定をしたい時にそのメソッド候補がIDEなどで補助があるのでミスが起きようがない
derive_builderを使った方が提供側も利用側もよいのではないか
まだバグを起こす前の時期に、バグを起こしやすい習慣をやめない、まつもとなかいがいたとする その時点で彼らをどのように処分したいのかね
>>74 ストローマン論法をやめなされ
初期化関数を使うと指定の重複、順序ミス、記述漏れが起こりにくいのは事実だろう
まず単純な初期化関数で指定の重複が起こるのか?
func( a,b,c,d....にたいしてaを重複指定させられるのか?
これすら判らないなら話すだけ無駄
「~しなされ」っていうのって少なくとも80歳以上じゃないかと
>>76 derive_builderで提供された場合も問題は起きないよね
仮にそのaを重複指定してしまい
.a(123)
.a(123)
と書いてもバグは起きない
可読性もよいからそれ自体を起こさないね
derive_builderは提供側も利用側もデメリットがなく最も良い方法にみえる
もっと良い方がある?
>>78 .a(123)
.a(321)
で始めの123が正しい場合問題になる
>>79 aを123で初期化したいなら前者しか起きようがない
aを321で初期化したいなら後者しか起きようがない
そんなナンセンスな指摘しかデメリットらしきものを見つけることが出来なかったということは
derive_builderが最も良い方法であることを認めたと理解してよろしいか
the bookによるとnewtypeパターンってのがあって traitをimplすることが目的みたいだけど どうにかすれば名前つき引数にも使えそうなんだよね
順序ミスについて これは前スレでも書いたのを再掲 .G(p[0]).R(p[1]).B(p[2]).build() のところを容易に .R(p[0]).G(p[1]).B(p[2]).build()と間違えて さらに .R(p[0]).R(p[1]).B(p[2]).build()と間違える 色指定でよく目にするのはRGB方式だけどコンピュータービジョンなどではBRGがよく使われる 最初にGRBとして覚えていても実際各段階になるとRGBと混同することがある 初期化関数では func(P[0],P[1],P[2],... 等で考えなくても書き間違える可能性が低い それにIDEの補助でパラメーターについてポップアップが出るのでそれでも間違いは減る バグに気が付いて書き直す際に2か所の書き換えをしないで .R(p[0]).R(p[1]).B(p[2]).build() と言う間違いも入り込みやすい
>>80 の疑問については
>>82 で書いたようなミスで重複と記述漏れが発生する
そういうところまで考えたことないだろ?コーディングしてる?
>>82 その比較はおかしい
デフォルト値以外のみを指定して初期化する話なのだから
それは✕ func(P[0], P[1], P[2],...
これが○ func(R=P[0], G=P[1], B=P[2], ...
記述漏れについては n個パラメーターを指定しないといけないのにn-1個しか記述していない場合 目で見てn個すべて指定したのかn-1個指定したのかなんて数が多くなると判らない これは初期化関数では基本的に起こらない 数が多いとやはり大変だけどIDEの補助があったりコンパイル時にエラーがでる ビルダーパターンでは実行時エラーや思った挙動にならない時点でしかミスに気が付かない
>>85 誰もそんな縛りは指定していない
普通に初期化関数使えばよい
オプション値の初期化の話だもんな
必須値の初期化の話ならRustでも
fn foo(red: Type, green: Type, blue: Type)
とするだけなのでderive_builderは使わない
だから
>>82 の指摘は間違ってる
>>89 それはお爺さんにもわかりやすいように簡易化して書いているからだろ
ビルダーパターンは上にあげたようなヒューマンエラーを誘発する仕組みなので基本的に使わない方が良い
生成に柔軟性があり複雑な場合にはビルダーパターンを適用するのは良い 一般的なオブジェクト生成に対してはヒューマンエラーに弱くアンチパターン
>>87 プログラミングの基本的なことを理解していないのかい?
derive_builderを使うようなオプションで必要な項目だけ値を指定して初期化するケースを1つの初期化関数を単体で済ませようとすると
どんなプログラミング言語でもキーワード付きオプション引数を使うことになる
具体的にはf(1, 2, 3, option1=111, option5=222)などの指定方式になる
option5など名前を指定しないとどの項目を指定しているのか区別がつかないためだ
>>92 その指定だとしても重複は大体の言語ではエラーになる
ビルダーパターンは重複を検知しないのでヒューマンエラーが入り込む
>>91 オプション初期化のない一般的なオブジェクト生成でderive_builderを使う人はそりゃいないよ
それは普通にRustでも引数固定の初期化関数でおしまい
前スレを読んだけど最初から特定項目だけオプション初期化する話
だからderive_builderが最も優れているという結論になってる
重複を検知するには内部にフラグを持たなくてはならない もちろんこれは実行時エラーになる
実行時エラーを検出するにはテストで網羅しなくてはならない
我々はコンパイル時にエラーが検出されるのを利点としてRustを使っている それなのに実行時エラーに頼らざるを得ないビルダーパターンは劣っている
結局、話をまとめると ビルダーパターンで foo() .item1(value1) .item3(value3) .item7(value7) と書くか 名前付きオプション引数で foo( item1=value1, item3=value3, item7=value7, ) と書くか これだけの違いだよな どちらも変わらん慣れだけの問題 どちらも見た通りなので指定ミスや重複ミスなど起きようがない あとはそれらを提供するライブラリ側だ いずれも普通は初期化関数を自分で書かなければならない Rustでderive_builderを使えば構造体に属性を付けるだけで済みシンプルかつミスも起きない 少なくとも現状でderive_builderに欠点は見つかっておらず最善な方法であるといえる
>>99 結局何も見なかった利かなかったふりして自分のいいように矮小化し続けてるな
呆れるよ
80代になると何も感じなくなるのだろうか
的外れな言いがかりでスレを荒らしてる人は derive_builderより良い方法を具体的にコードで示せ
精神論で間違いは発生しないと言うのは容易 間違えたら間違えた人間が悪いと言う ビルダーパターンには結局ヒューマンエラーを防ぐように十分な対策がなされていないだろ わかっていながら無視をする c++精神だね
>>101 ファクトリーパターンなどを使えばよい
メソッドの種類を充実させるだけだ
ビルダーパターンはヒューマンエラーに弱い 毎回論理的構造を構築しなければならないがそこにバグが紛れ込む可能性がある それよりも初期化のための関数を作るべき
derive_builderは全自動だからミス起きなくね? derive_builderより好いのがあるならコードを出して
おじいちゃんは乱心して同じことを何度も書いて来る 普通の人間にはすでに書かれた内容で理解出来るのに知らないふりして実行時エラーやバグを許容している
これも相手の疲労を狙ってくるくだらないやり口なんだろうと思うが
>>104 そんな方法は存在しないよ
>>99 が挙げてる二つの方法しかない
もしあるなら同様のコード例を示そう
他のスレでもでもおじいちゃん的書き込みを見ることがある それに対して80代ではと書くと100%反論される 今回は反論されないところを見るとやはり80代以上なんだろうなと
>>108 > それよりも初期化のための関数を作るべき
これが全てだろう?
いくら何でも馬鹿すぎるだろう?判らないの?
Builderはオプションの追加実装が破壊的な変更にならないメリットがあるな
生成関数に全部渡す方式だとパラメータが増えて破壊的になる
新しい生成関数を追加すれば破壊的にはならないけど
オプション追加する度に生成関数増やすのはあほくさい
>>103 もし暇だったら↓のRegexBuilderをFactoryで実装する場合の関数の個数を見積もってくれ
https://docs.rs/regex/latest/regex/struct.RegexBuilder.html >>110 今回のようなケースで初期化のための関数は
>>99 が挙げてる二つの方法しかない
もし他に存在するなら同様のコード例を示そう
>>111 他の言語でもRegexは普通にメソッドを使って解決してるけど…
長いならregexoption構造体作って指定したらよいだろう?他ではそうしてる物もある
Rustしか使ったことがない前提なのかな さすがに馬鹿の相手をするのは疲れてきた…
おじいちゃんは他の言語は使えないの?しょうもない雑魚レベルの質問しかしないのはなんで?
デフォルト値に対して必要分だけオプション指定したい場合
まともな方法はどのプログラミング言語を使って
>>99 のどちらかの方式になる
まともではない方法としてはオプションの有無ごとの組み合わせ数の分だけ大量の関数を用意する手もあるけど論外だ
何で間違ってることを繰り返すの? macroで重複チェック可能なbuilderは書けるとか書いてこないのは意外なんだけど
実行時チェックの話もchatGPTの方がまともで面白い回答や提案をしてくれる
>>118 設定値の重複チェックとか誰も気にしないからでは
重複設定によるバグとか生成関数に渡す引数の順番を間違えるバグと同じくらい起こりにくいし
一部の必須値の設定を忘れるケースは普通にあるでしょ
>>121 必須値は様々な対応が取れるため問題は起きない
・オプションにしない
・全体の整合チェックの一貫として必須値の有無の判断を入れる
・ビルド最終メソッドで指定する (ex. std::fs::OpenOptions::open)
一番オーソドックスなのが抜けてるな RegexBuilderの場合はRegexBuilder::new()にパターン文字列を渡してる
>>123 先頭の「オプションにしない」が
その最初に必須値を渡す意味
わかりにくてすまん
フォローサンクス
名前付き引数であれば必須パラメータも名前付きで渡せるため順番の間違いによるミスが発生しづらく可読性も高い derive_builderを使う以上は必須パラメータもメソッドで渡すしかなく実行時エラーの可能性が排除できないしチェックのために余計なランタイムコストを払う必要がある 文句はderive_builder作者に言ってきた方がいいぞ
狂信者には何を言っても無駄であり論理的な考えを持ち合わせていない こちらがいくら論拠を提示してもRustが正しいderive_builderが正しいとそんなミスは起こりえないと繰り返すのみ 正しくないのはお前の頭だろう
ビルド方式に問題はない
既出のstd::fs::OpenOptions::open()や
regex::RegexBuilder::new()など
Rustはビルド方式でも対応しており問題になっていない
>>125 名前付き引数であろうとなかろうとバリデーションは必要でそれは実行時エラーとなる
そしてResultを返すから実行時エラーで問題ない
>>82 順序ミス対策なら
.rgb(p[0], p[1], .p[2]).build()
でいいんじゃね?
Rustてこういうのできないんだっけ?
>>127 > 少なくとも現状でderive_builderに欠点は見つかっておらず最善な方法であるといえる
じゃなかったのか?方針変えたのか?
“イリヤ神”がまたやった 動画生成AI「FramePack」が革命的なワケ
2025年05月05日 07時00分更新
https://ascii.jp/elem/000/004/267/4267160/ 4月17日に登場した動画生成AIプログラム「FramePack(フレームパック)」が世界的に衝撃を与えています。PCローカル環境で動画AIを動かすには、少なくともビデオメモリー(VRAM)が12GBあるビデオカードを搭載していないと難しいというのが常識でした。ところが、VRAM 6GBでも安定的に動作させられるため、一気に動画AIの裾野を広げそうです。開発したのは、画像生成AI分野で「ControlNet」や、使いやすいツール「Fooocus」などを開発してきたことで知られる、スタンフォード大学に在籍中のIllyasviel(イリヤスフィール、以下イリヤ)さん。既存の方法論にまったく違ったアプローチでブレイクスルーを引き起こす、“イリヤ神”のアプローチに再び注目が集まっています。
中略
AI動画を作ってみたいけれども、スペックが足りないために諦めていたという人が次々に自前の環境で試すようになってきました。既にワンパッケージでインストールできる環境も整えられているため、スタートも簡単です。様々なファイルをダウンロードしてくるため、初期設定は2時間くらいは見ておく必要があるものの、圧倒的にハードルが下がりました。
>>127 名前付き引数のミスは大体言語でコンパイルエラーになるので的外れ
ビルダーパターンより安全性が高いだろ
>>126 Rustが間違っていると主張したいなら問題点と代替策を述べればよい
本当にそれが示せるならRustはIT大手各社も用いているため世界中にインパクトを与えられるぞ
この我々の5chのやりとりすらRust製のPingoraを経由しているほどネットインフラ各所でもRustは使われている
>>132 何言ってるんだよ
最後の一行が全てだろ
本当に暇さえあれば関係ない話題で誤魔化そうとするよな 脳がストローマン論法で浸食されているんだろ
それよりもbuilderパターンは初期化時の情報指定漏れをコンパイルエラーにできないのがRustらしくないと思う。
>>128 個別パラメータとして与える必要がないからその通り
Rustの言語仕様としてはそれで制限ない
そのライブラリの仕様ならタプルにすればよい
>>127 なるほど、実行時に他のバリデーションするからタイプセーフでなくていいと君は考えるわけね
それはそれで一理あるが、だったら君が使うべき言語は静的型付け言語ではなくRubyなどのゆるふわ言語だな
さようなら
ビルダーパターンで疑似カリー化が行えるのが利点なのにタプル化するって わざわざ手足を縛ることになるけど
>>135 勘違いしていないか?
必要とはされないオプションが有る時にビルダーパターンが使われる
>>138 それマジで言ってるならRustでプログラミングしたことがないんだな
タプルで扱うのが正解
これがわからないならfor文すら書いたことがないのだろう
>>139 それは一部必須パラメータが依然として存在することと矛盾しない
>>140 もはや話がかみ合ってないな
疑似カリー化で個々のパラメータを指定してその他のパラメータをここに設定した生成物を作れるのが利点だという意味が判らないのかな
これは重複を許容する使用法
>>141 必須パラメータの事例はさっき出てただろ
>> std::fs::OpenOptions::open()
>> regex::RegexBuilder::new()
これで対応できている
誰もが使っていて問題となったことはない
>>142 カリー化の意味すら理解できてないのか?
Rustでカリー化ならばクロージャを使う
ちなみにビルダーパターンはビルダー構造体のまま変わらずカリー化は行わない
>>143 だからそれはderive_builderの作者に言ってくれ
それに前から言ってるが必須パラメータの数が増えればミスが増えるし可読性も落ちる
>>144 ストローマン論法
疑似カリー化と書いてるだろ?
derive_builderは正しいと繰り返していたのにすでに複おじになかったことにされている
微妙に論点をずらしたり相手の言ってないことに対して批判したり 本当にずっとストローマン論法続けてるよなあ 複おじいさん ストローマン論法はやめなされw
>>137 Rustは静的型付けだから常にタイプセーフだよ
それらの例は引数の型が合ってなければ当然コンパイルエラーとなる
一方で引数の値が合っているかどうかは構造体の方針だから当然コンパイルエラーにできず実行時エラーとなる
>>145 何を言いたいのかわからない
fsやregexの話を作者に伝える?
そんなの知ってるだろ
>>146 カリー化は定義もメリットもはっきりしていて幅広く使われてきているが
その疑似カリー化とやらも定義もメリットもわからない
無意味なことをしようとしていないか?
>>150 見ればわかるだろうw疑似カリー化が何を意味しているのかぐらい
そういう議論のための議論を繰り返してなんになるんだよ
>>151 だから疑似カリー化の定義とメリットを明確にしてくれ
少なくともこの件のrgbバラバラにするのはメリットないどころかデメリットだぞ
>>128 >> 順序ミス対策なら
>> .rgb(p[0], p[1], .p[2]).build()
>> でいいんじゃね?
>>62 >>68 複おじはderive_builderを全力で支持
初期化関数は全否定していた
ところが…
> .R(p[0]).G(p[1]).B(p[2]).build() これ3つとも指定が必要ならメソッドを分けるべきではないと思う それ以前にRustのプログラミングしたことないのかメソッド大文字は置いとくにしても この場合ならp[0]はRust的な使用方法ではないな (r, g, b)もしくはRGB構造体で持つかその参照で持つのが普通 p[i]はなるべく避けてイテレータ時点でポインタを動かして参照で持つか小さいなら値で持つ 構造があるならその構造で持つ そのためp[i]の形が出てきたらRustでは少し臭うため怪しみ避けられないか考える
>>75 >まつもとなかい
うby界隈のmatzとそのとりまきか?
>>155 > これ3つとも指定が必要ならメソッドを分けるべきではないと思う
おっ
derive_builderって必須パラメータをランタイムチェックとはいえ個別setterの形で適切に扱えるというのが重要なコンセプトなんだけど、ここにきて全否定か
>>128 >.rgb(p[0], p[1], .p[2]).build()
重複を主張する人の場合
.rgb(p[0], p[1], .p[2]).b(3).g(4).r(5).g(6).b(7).build()
みたいな間違いが起こるんだと思うよ
ボクシングには蹴り技がない それは重要なコンセプトだと考えていた時期が俺にもありました
コンパイラでうまくいかないから規約で縛ると言うことだろ?ビルダーパターンを導入する意義とどんどん崩れていく RGB各値は指定が必須とは限らない defaltで各値が0指定されていて同じなら書く必要がないだう 初期化関数では場合によっては記述する必要があるけどそれも必須ではない 疑似カリー化で少しずつパラメーターの違う複数のオブジェクト生成を行う場合にも便利
f( red=red, green=green, blue=blue, ) f() .red(red) .green(green) .blue(blue) どちらの方式でも間違えようがないと思うんだが ミスが起きると言ってる人はどういうミスを想定してるのだろう
red=p[0]; //p[0]は実際はblue green=p[1]; blue=p[0]; // コピペの修正漏れ
>>161 今更そんなところを理解できてなかったのか?
greenの指定を忘れたら前者はコンパイルエラー、後者は実行時エラー
>>162 これの悩ましいところは後ろのコピペ修正漏れでblueに正しいp[0]が指定されているので
原因が判断しにくいところ
>>163 前者と後者は同じ
greenの指定をしなくてもコンパイルエラーとならない
greenは指定しなかった場合にデフォルト値となるオプション引数
>>165 知らんがな
俺は必須パラメータの問題を指摘している
>>162 p[0]やp[1]など
可読性の悪いコードを書くやつは失格
p.red p.green p.blueにしろ
>>167 dataと言うバイト列の中の一部だとしたら?
>>166 おっちょこちょいだな
直前のこれを見ろ
必須ではなくオプションパラメーターだ
>>160 > RGB各値は指定が必須とは限らない
> defaltで各値が0指定されていて同じなら書く必要がない
>>168 バイト列?
各8bitなのか各16bitなのかそれ以上なのかそれでは構造がわからん
ちゃんと構造体の列にするべきだ
>>170 また真面に回答できないから適当に話をごまかして議論のための議論しようとしてる
受信データなどのバイト列から値を取り出すのは一般的だろう
必ずしも構造体の列構造とは限らない
それと数値指定無くすならコーディング規約でこう書かないとアウトですとするのか?
blue=data[ i + blue_index_offset];
red=data[ i + red_index_offset];
green=data[ i + green_index_offset];
>>171 あのさ
Rustでプログラミングしたことないの?
Rust以外でもシリアライズとデシリアライズしたことないの?
まともなプログラミングしたことある人ならRustですぐにserdeにたどりつく
まともな人が言ったのか人形が言ったのか全然わからない時代だ 人形が言ったにすぎないなら、そんな言葉は存在しないのと同じ
>>172 お前はわざと議論のための議論してるだけだろ
通常のコーティングで出てくるであろう例を誤魔化している
p[ i+0 ],p[ i+1 ],p[i +2 ]を取り出すだけのためにどれだけコーディング量を増やして ライブラリ依存させていくのか 本当に意味不明
>>175 そんな可読性が悪くてミスしやすいプログラミングは避けるべきだ
構造化と抽象化が不得手でプログラマやエンジニアに向いてないな
serdeは構造体に#[derive(Serialize, Deserialize)]など付加するだけでデシリアライズ関数などは自動生成される
>>176 構造体にって自分で書いてるだろ
単なるバイト列からp[ i+0 ],p[ i+1 ],p[i +2 ]を取り出すだけのために構造体などを作らないといけない
p[ i+0/*0=赤*/ ],p[ i+1/*1=緑*/ ],p[i +2/*2=青*/ ] 俺ならこうするよ コメントを見れば0が赤、1が緑、2が青と見たん瞬間わかる 日本語なので英語より間違えにくい もし間違った数字が間違ってたらコメントと比べればすぐわかる
(言語を強化することにより)アプリのコーディング量を減らせという話はなかなか面白い 言語の数がアプリの数より多い気がする原因はこれかもしれない
>>174 議論のための議論をしてるのはお前だろ
それともガチで何も意味を読み取れないインデックスアクセスが正義と思ってるわけ?
どんなみじめな経験を積んできたんだよ
害悪プログラマすぎて仕事で関わらないことを願うわ
議論とは関係ないけど大体の画像処理ライブラリだとRGBもBGRも扱えるように channel[0], channel[1], channel[2] のようにアクセスさせると思う 内部のデータによって channel 数は1や4 (アルファチャネル付き) もあるし
仕事はお金を貰ってやることだから丁寧に書いて上司に褒められる必要があるけれど 趣味とか経営者とかなら何を書いてもじゆうなんだよな
簡潔で見にくいコードを書くか 冗長で醜いコードを書くか 2択だな
>>181 これはそう
画像に限らず構造化されたバイナリデータを扱うときに一般に言えることだけど、
単純にビット列をそのまま構造体として読み替える間違いは、低水準に踏み込める言語に入門して調子乗ってる初心者がやりがち
上司はunsafeの箇所をチェックすればいいのに コンパイラが自動で調べてエラーがなかった箇所を、手動で調べ直して逆張りするのが胡散臭い
>>180 80代のおじいさんと仕事をする機会はないかな
話を整理すると
>>82 >> .G(p[0]).R(p[1]).B(p[2]).build()
>> のところを容易に
>> .R(p[0]).G(p[1]).B(p[2]).build()と間違え
と彼は言い出すから
それは名前付けせずにp[0]を用いていることが間違える本質的な問題という話だよな
さらに
>>160 > RGB各値は指定が必須とは限らない
> defaltで各値が0指定されていて同じなら書く必要がない
と彼は言ってるので
彼の好み通りにp[0]を用いるとして
名前付きオプション引数方式
foo(
green = p[0],
blue = p[2],
)
ビルダーメソッド方式
foo()
.green(p[0])
.blue(p2])
どちらの方式でも同じだな
仮にミスが起きるとしたらそれは名前を付けずにp[0]を使っていることが本質的な問題であると確定
構造体は foo{green:green,blue:blue} を foo{green,blue} と描ける訳で ビルダーメソッド方式とやらも foo().green().blue() 的に描ければ無駄が減るから改良してくれんかのぅ
>>189 その大量連投していた彼はRustをほぼ知らないと判明した上に他の言語の経験値も低そうなので彼自身に問題があることを理解できないと思う
その連投してスレを荒らしていた人が
「おじ」「複おじ」「おじいさん」「おじいちゃん」使いの人だったとはね
>>61 >>70 foo().(green).(blue) でもいいな
RustはJavaよりも構造体リテラルの表記が強力だから Builder使うよりOptions構造体1つで渡す方が楽かもしれんね パターンとしてはBuilderよりマイナーだけど
>>190 引数なしで何を指定するのか?
>>193 メソッド名なしはエラー
どんな方式を取ろうとも大元の変数(ex. rgbやp)は指定せざるをえない
foo().green(rgb).blue(rgb)
>オプション引数やキーワード引数については他言語が内部的にやってることをRustの場合は開発者が自分でやらなきゃいけないことになっててバカらしい >しかも関数シグニチャに情報をまとめられないから書く方も読む方も煩雑になるだけで開発者的には何もメリットがない これに尽きる 言語に機能が不足してるから何でもかんでもビルダーパターンにしなきゃいけなくてサードパーティのマクロに依存することになる アホらし
>>196 真逆だろ
キーワード付オプション引数をズラズラ並べた長い長い関数シグニチャはデメリットしかない欠陥品
しかも機能拡張したらさらにキーワード付オプション引数が増えて関数シグニチャが変わるアホらしさ
複数IDと口調を使い分けて自分のレスに賛成するキチガイが複おじ
>>197 ビルダーパターンは30年以上前から知られていたけどあまり有用ではないので使われていない
過去に誰かがざっくりデザインパターンを否定してたけど、その人の言うにはデザインパターンで有用なものは言語自体に取り込まれるはずだと
実際いくつかは新しい言語では取り込まれている
マクロで解決可能なんだろ? それは「不足している」のか? まあ標準ライブラリとして入っているべきみたいな論はあるかもしれんけど、マクロでの解決が悪くて言語機能として直接サポートするのが良いとする根拠は出てないな。 言語ユーザがそれぞれのやり方で解決できる自由さと言語の方針を強制する一貫性は両立しないがそれぞれに良さはあるし、 Rust は今のところ自由さをとりつつもデファクトな地位のライブラリはあるという状況だ。 手頃な妥協点と言えるだろ。
些細な内容なら初期化関数を複数作ればよい話で更に多くなればオプション指定する構造体を作ればよい mutに拘る必要が無ければさらに多くの可能性がある わざわざ穴の多いビルダーパターンを使う必要はない
>>200 ポールグレアムはイディオム (デザインパターン) は言語機能として持つかライブラリにまとめるべきと述べていて、考えられる様々なパターン (またはこれから登場する未知のパターン) をライブラリにまとめるには「本物のマクロ」が必要と主張してた。
そして本物のマクロを持つ実用的な言語は Common Lisp くらいしかなかったんだが、 Rust のマクロは彼の言う本物のマクロだ。
マクロで抽象化されてるならその実装がビルダーパターンでもそうでなくてもどうでもいいよ。
>>202 初期化関数を複数作るとオプション分の組み合わせ爆発となる一番アホな方式
それならビルダー方式がよい
>>204 他の言語では大体オーバーロードでオプション指定しているけどそれが馬鹿だとは思わないけどね
>>205 それはオプションが増えると組み合わせ爆発が起こる馬鹿な方式
>>206 同じ主張と文章を繰り返すやり方が複おじそっくりですね
オーバーロードの初期化関数で馬鹿らしいと思うのは型が同じで対象が違うものがある時
重複を避けるためにシグネチャの設計をしなくては成らないことは馬鹿らしいと思うよ
例えば基本的に2つだけ引数があって後はオプションがずらずら並ぶならやはりオプション内容を含む構造体渡せばいいと思う
そちらも設計が必要だけど
>>205 それ以前にオーバーロードは欠陥機能
オーバーロードを使うとred,green,blueのオプション実装すらできない
>Rust のマクロは彼の言う本物のマクロ macro_rules! は偽物のマクロ proc_macro2 が本物のマクロ
普通は書き込み内容が単調にならないように人は文章に揺らぎをいれてくるんだけど 複おじは基本全部同じ 口調を変えても同じなので同一人物なんじゃないかと思って見ていると後で全く同じ書き込みを始めるので同じ人間なんだなと
>>209 どちらも本物だ
衛生マクロの概念すら知らないのか?
本物のマクロと言う主張は面白い でライブラリ作成者ではなく一般的なユーザ側が書いてるマクロはどっちなのかと
>>212 オーバーロードの制限を知らないのかね?
red,green,blueそれぞれだけを指定したい関数をオーバーロードで書いてごらん
>>213 衛生的なマクロとは何かを勉強するといいよ
オーバーロード自体は良い仕組みだと思うけど設計が必要だ 最近の言語が取り入れていないのはヒューマンエラー対策という名目 だったらビルダーパターンもヒューマンエラー対策で禁止になるかと言えばそうでもない
>>216 オーバーロードは最悪な仕組み
欠陥が多すぎる上に
red,green,blue各オプションしてすら実現できない
AIを屈服させるレベルの改善ができるなら改善してもいいけどね どうせAIが勝つという前提なら何も修正しないのが合理的だ
今のAI()の実力ってこんなもんか >2つのリンゴを3人で分ける場合、1つのリンゴを2つに切り、もう1つのリンゴも2つに切って、3人で分けます。 >そうすると、3人ともリンゴの切れ目と半分になります。 >具体的な分け方 1. 1つのリンゴを半分に切る:1つのリンゴを真ん中から半分に切り、2つの半分のリンゴにします。 2. もう1つのリンゴも半分に切る:もう1つのリンゴも同じように半分に切り、さらに2つの半分のリンゴにします。 3. リンゴを合計4つの半分に分ける:2つのリンゴを合わせて、全部で4つの半分に切ったリンゴが手に入ります。 4. 3人で分配する:3人でリンゴの半分を1つずつ取ると、3人とも1つずつ取ることができます。 5. 残った1つを3人で分ける:1つの半分に切ったリンゴが残りますが、それを3人で分けることができます。 例えば、さらに半分に切って3人で分けたり、3つの小さく切って3人で分けたりできます。
>>209 本物のマクロというのが何であるか明瞭な定義はされてないのだが、文脈的に「構文木の操作が出来る」というのが要件だと一般的に解されている。
トークン単位の置き換えしか出来ない C のマクロのようなものを除外するための言い回しだ。
構文木を操作できるなら操作できる範囲の違いは本物のマクロかどうかには重要ではない。
(もちろん出来ることが多いほうがより良い本物のマクロとは言えるだろうが、出来ることが多いほうが危険な間違いも引き起こしやすいので現実には適度に制限があったほうが良いこともある。)
macro_rules! も普通は本物のマクロと解される。
リスパーはmatchを知らない matchを知らなくても理解できるマクロが本物のマクロ
複数ID使用おじ 別人が複おじと疑われたら自分は複おじじゃねーよと反論する 気持ち悪いから ところが何故かしない 複おじはそういうのに反論しない仕組みになっている
>>214 ヒント:
struct Red(u8);
マクロ自体がただの似たような機能の概念の総称であってその中で本物だ、元祖だと言っても笑われるだけ キーボードマクロは真のマクロではないとか衛生的ではないと言われてもそうですかと
ID:j5CJU7Aq の反応待ちのawait状態です
>>223 複OGはどうでも良いけど
5chはもう禿しく過疎ってるのにこのスレだけやけに延びてるのは不自然だと感じる
>>225 「本物のマクロ」というのは正しさとか起源を主張しているわけではなくそういう名前の分類。
少なくとも C のマクロなどでは様々なイディオムを抽象化するには不十分だというごく当然の話をしてる。
なお、名前付き引数での呼び出しを前提とするならばhoge(red) と hoge(green)を名前付き引数の引数名だけで呼び分けるオーバーロードは技術的には実装できない理由は特にない しかし、多くの言語では名前付き引数の使用はオプションだしこの場合はhoge_red(val)のように機械的に名前変えりゃいいだけだから、実装コストに見合わないという判断をされているのだろう
>>224 こうですか?わかりません
impl From<Red> for Color {...}
impl From<Green> for Color {...}
impl From<Blue> for Color {...}
impl From<(Red, Green)> for Color {...}
impl From<(Red, Blue)> for Color {...}
impl From<(Green, Blue)> for Color {...}
impl From<(Red, Green, Blue)> for Color {...}
let red = Color::from(Red(255));
let yellow = Color::from((Red(255), Green(255)));
let white = Color::from((Red(255), Green(255), Blue(255));
メリットが不確実なだけでしょ メリットもコストも確定していてなおかつ見合わないという話ではない
このスレでずっと自演してる人って糖質とかなんだろうなあ
オーバーロードはそもそもCのAPIにありがちな、後で〇〇2だの〇〇exだのが増えて格好悪くなる問題を解消するためのもの 後で引数名だけ異なるオーバーロードが増えたら名前付き引数を使っていない既存の呼び出しがエラーになるのは、互換性維持という本来の目的からすれば論外
話題のderive_builderを使ってみた 構造体に属性を付けるだけで初期化関数を書かなくて済むのは便利だね ドキュメント見ると今回は使ってないけど色々と機能が充実してるみたい 話題のred/green/blueはこれでいいのかな use derive_builder::Builder; #[derive(Default, Builder, Debug)] struct Color { #[builder(default = "0")] red: u8, #[builder(default = "0")] green: u8, #[builder(default = "0")] blue: u8, } fn main() { let pink = ColorBuilder::default().red(255).blue(200).build().unwrap(); println!("{pink:?}"); // Color { red: 255, green: 0, blue: 200 } }
>>235 よくない
散々言われている通り、必須属性の設定を忘れると実行時エラーになるという致命的な問題がある
>>236 例えばファイル名を打ち間違えちゃったけど
まずリリースモードの前にデバッグモードの時点で実行時エラーで気付いて
直してしまえばそれ以降は大丈夫と同じじゃないのかな
特に問題ないような
補足するとファイル名は必須項目だけど コンパイル時にチェックできるのは型だけだから現実的にチェックできることはほとんどないよね
>>201 >マクロで解決可能なんだろ?
ビルダーパターンの手書きコード量を多少なりとも削減したいという問題は解決してるかもね
それが本当に解決したい問題だと思ってるのならそれでいいんじゃない
ビルダー方式でも他の方式でもなんでもいいけど
初期化のための関数を自分で書くよりも
>>235 のように構造体への属性マクロ指定だけにするのがいいと思う
面倒がなくコードがすっきりとしてプログラミングミスも起きないから
>>238 それはそうなのだけど、だからといってコンパイル時のチェックを安易に諦めたら、極論Cでいいだろって話になっちゃう
Rustの存在意義が問われる危険な思想
現時点のderive_builderはFooBuilder::new()に必須項目を渡すパターンには対応してないっぽいな 全部default()でも構わないケースだと使えるけどRegexBuilder::new(pattern)みたいなケースもあるから万能ではない
良い例があるな
http://2chb.net/r/tech/1643696741/33 貴方が配慮を欠いている
そのx^nつまりxのn乗を求めるにしても
例えば2^100を求めたいならば128bitがないと溢れるのでu128::pow(2, 100)となるが
2^5を求めたいだけで結果も8bitで十分ならばu8::pow(2, 5)となる
このようにメモリサイズも異なってくるので別々の関数が必要
もちろんu128::pow(x, n)があればu8::(x, n)をカバーできるが明らかに無駄である
そこで符号なし整数だけでも
u8::pow(x, n)
u16::pow(x, n)
u32::pow(x, n)
u64::pow(x, n)
u128::pow(x, n)
と5つの関数が必要となる
一方でxの型が確定しているのであればpowで再び型指定は不要なので
x.pow(n)と表記することも可能
以上は整数の場合だがxとpowの結果が小数の場合は2種類の関数が必要となる
f32::powi(x, n) 【nが整数の場合】
f32::powf(x, n) 【nも小数の場合】
もちろんnが小数のpowfだけあればpowiもカバーできるが明らかに無駄なので2種類必要となる
さらに32bit小数だけでなく64bit小数も扱う必要があるため以下も必要
f64::powi(x, n) 【nが整数の場合】
f64::powf(x, n) 【nも小数の場合】
これらもxの型が確定していれば以下のように略して書くことも可能
x.powi(n) 【nが整数の場合】
x.powf(n) 【nも小数の場合】
ちなみに「x^n」を表記するのに不自然な「pow(x, n)」よりも「x.pow(n)」の方がたまたま自然に見えるが誤差だろう
どちらでも好きな表記法を選べばよいだけにすぎない
>>244 例えば
このように
もちろん
そこで
一方で
以上は
もちろん
さらに
これらも
ちなみに
そのx から始まって論理的?接続で参照を握ったままで最後まで離さないな
読みにくいのは当然
上の強烈な接続もビルダーパターンの一種かな?と思ってしまう
>>242 忠臣蔵みたいに、諦めたふりをするぐらいがちょうどいい
危険思想?
なんのことやら
>>245 複おじ語録よくぞまとめてくれたな
ほめてつかわす
後から〇〇2や〇〇exが増える問題ってRustだとどう対処するのが一般的なんだろう まあRustの場合ABIを維持する必要のあるケースは比較的限られてるけど、引数増やしたら既存のソースは壊れるよね 最初から構造体にしておけというのは意味のない意見なので無しで
>>250 ダイナミックリンクで提供する場合はバイナリ互換性が必要な場面も多いのは Rust でも変わらないよ。
言語の文化としてはスタティックリンクを使いがちではあるけど。
ダイナミックリンクは OS の機能なので言語の側からどうにか出来る余地も少ないし、 OS の文化に乗っかるしかない。
○○exがある言語でJVMを実装し、○○exに依存してないと主張する
Ubuntu 25.10から、sudoがsudo-rsに置き換わるそうだ
まあ Rust が良いかどうかはともかくたまには刷新したほうがええやろ。
いや、sudoのようなパフォーマンスが重要でないコマンドなら RustではなくGoで書くべきだった
どんなものでも機能も速さも同じだとしても C/C++製よりRust製を選ぶわ C/C++のせいでのセキュリティホールが後からいくらでも見つかってる現状
>>256 余分なランタイムが必要なGoはありえない
>>250 外部ライブラリならメジャーバージョン増やして普通に破壊する
旧バージョンのAPIをcompatモジュールとかに入れとけば親切
標準ライブラリはエディションで切り替える形になりそう
std::preludeのサブモジュール名は最初v1だったけど今はrust_20XXに方針転換してる
グローバルな名前の追加も一種の破壊だし
モダンなライブラリはdeprecateしやすいのか 古いCと最新のRustだけが残されて中途半端な時代は無かったことになりそうだ
いや、利用者が少ないうちに直しとけ心理で、どんな技術も通る道だよ sudo-rsがいい例だがこういう長期間にわたって重要な役割を果たす、かつあまり変更が必要とされない用途が増えてくると、だんだんと進化は遅くなるものだ
>>254 この国際的なプロジェクトでセキュリティ的に重要なものから順にRust化されていく一環だよ
Memory Safety for the Internet's most critical infrastructure
https://www.memorysafety.org/ >>244-245 このように.drop();
もちろん.drop();
そこで.drop();
一方で.drop();
以上は.drop();
もちろん.drop();
さらに.drop();
これらも.drop();
ちなみに.drop();
ubuntuはsudoだけでなく、cp, ls, find, diff なんかもRust化する予定なんだな ntpdもRust化が進められてる
>>265 error[E0040]: explicit use of destructor method
help: consider using `drop` function
参考:
https://doc.rust-lang.org/error_codes/E0040.html >>266 Ubuntuに限らず誰もが全てをC/C++製から安全なRust製へ変えたいと思っているが一気には無理なので重要なものや新たなものからRust採用という感じ
全てを変えたい、とかいうビジョンは無意味 意味のないビジョンだよ
メンテナ高齢化問題の対策としては良い取り組みなんじゃないかな 作業するのもインターンの学生が中心だろうし
多くのシステムやインフラがRust化してるね
この5chが使ってるCloudflareもRust製へと移行した
https://github.com/cloudflare/pingora コマンドツールがRustになってもAPIがRust用じゃない限り CのAPIのラッパーでしかないけどそういう造りでもRust化したってカウントして良いのかは疑問
>>274 コマンドツールが誰に対するAPI??
プログラムを書いたことないのかな?
こういうのってFedoraやらArchやらGentooあたりが人柱やってから普及していくものだと思ってたが… Canonicalのくせに思い切ったことするなあ
Ubuntuはカジュアル路線でしょ 初期状態だとrootも使えなかったと思う 他よりもsudoの負荷が大きい
5chはperlだけでなくサーバも貧弱なのでキャッシュしてくれるCDNに頼らないと成り立たない
5chが利用しているCDNは
>>273 のCloudflareでRust製だよ
>>279 誰が見てもただの印象操作
子供でも分かる
5chどうこうよりも インターネットを支えるCDN世界トップシェアのCloudflareがRust化したインパクトが大きいよな
もう見抜けない、最先端のAIディープフェイク動画は心臓の鼓動まで再現、判別が困難に
2025-05-08
https://karapaia.com/archives/507859.html AWSのプラットフォームはほぼJavaでしょ ハードウェア寄りのローレベルな部分だけシステムプログラミング言語を使っていて、更にその中の一部でRustを使っているものもある、という程度
https://japan.zdnet.com/article/35183866/ 2022-02-22 14:31
Amazon Web Services(AWS)は、同社のエンジニアたちがプログラミング言語「Rust」を使っている大きな理由として、エネルギー効率の高さを挙げる。
Rustはメモリー安全性を高め、セキュリティ関連の不具合を減らす役に立つだけでなく、PythonやJavaよりもはるかに「エネルギー効率に優れている」という。
Amazonは、2025年までにデータセンターの100%を再生エネルギーでまかなうという目標を掲げ、データセンターの環境負荷の軽減に取り組んでいる。
Rustの採用はその一翼を担うという。
Rustで構築されたAWSサービスの例としては、コンテナーアプリ用のサーバーレスプラットフォーム「Lamba」を支える「Firecracker」、「Amazon Simple Storage Service(S3)」「Amazon Elastic Compute Cloud(EC2)」、コンテンツ配信ネットワーク「Amazon CloudFront」、LinuxベースのコンテナーOS「Bottlerocket」がある。
大半は既存のソフトウェアの組み合わせなんで、仮に自社内で書いているプログラムの全てを Rust で書いても割合としては数割ってところだろう。 ただ、これから割合が増えることはあっても減りはしないとは思う。
Rustがこのままオワコンになったら撤廃もあり得るだろ
AWSもRust製か Rust製のクラウドとJava製のクラウドが競争したらJava側が100%負けるだろうしな
クラウドってなに? ハイパーバイザがrustで作り直されたの?
>>286 これは誤訳
原文だと、それらのサービスにRustを使っていると書かれているだけ
RedditなんかでAWS社員のコメントとか探してみりゃわかるが、AWSは基本Java
エネルギー効率に劣るJavaなんかで構築していたら笑うわ
>>286 でもそう書いてるよな
Rustって人気なのね AIにC#から移植できる?って聞いてみたらいやだって言われちゃったからRustが広まるの、なんか困る
JVM前提な特殊環境を除き Rustの登場でJavaを使う意味は全くなくなった
コンテナ化は Java の有力なメリットだったけど Docker の隆盛で様変わりしちゃったね。
>>291 サービス提供には安全性が一番重要なのでC++ではなくJavaを採用していた
Javaより安全で性能の良いRustが出現したため切り替えた
そしてAWSが発起人となってRust Foundationを設立した
Rustで戦う領域ではない気もするけど、エンタープライズ向けはまだ弱いと思う ここはまだJavaや.NETの資産が大きい 「ファイルが見つかりません」みたいにユーザーの言語でエラーメッセージが出たり、文字列のソート (例えば「あアいイ」のように、ひらがなカタカナを考慮した自然な順になる) だったり、そういうのが外部ライブラリ無しで揃ってるのが Java や .NET なわけで 規模としては相対的に小さくなってるけど、こういうのが必要な領域は普通にあるし、Javaが消えることは無いと思う
>>299 外部ライブラリ無しで揃ってるという発想が頭おかしい
そんな間違った奇妙な視点を持ってしまうとRustには正規表現も乱数も何もかも存在しないことになるぞ
考えを改めなさい
ここでグチャグチャ言ってる間に徐々に置き換わって行きそうだな
firefoxが全部Rustに置き換わるのに100年ぐらい掛かりそうだけどな
止まってるFirefoxより ChromeとIEが着々とRust化を進めてるから先だろな
>>299 人月業界は考えるだけ無駄として、SaaSだと新規開発は圧倒的にフルスタックTypeScriptが多いね
Rustは海外では革新的なDB作るぜみたいなエンタープライズの基盤系スタートアップでの採用例は見かけるが、国内ではその手のスタートアップは皆無に近いから絶望的な状況
品質に関する考え方は良い要素を揃えれば良くなるという単純なものじゃないよ。 結局のところ、どんな問題が出てくるかは事前にわからない。 出てきた問題に対処し続けるという歴史によって品質が作られるんだ。 確かに C や C++ に比べて Rust は全面的に良いけれども、活発な巨大プロジェクトではもう問題に対処しつくしていて Rust に置き換えるメリットは相対的に小さい。 部分的に Rust に置き換えることはあっても問題が起こってない箇所まで含めて全面書き換えを目指すのは割に合わない。
>>306 サーバーサイドでTypeScriptを使っているようでは負けるわ
>>308 「負ける」というのは何において?
Rustで実装すると、そのサービスは使いやすくなったり、機能豊富になったり、プロトタイプを高速に作ったり、ユーザーの要望をより速く実現できたりするの?
勝ち負けが決まるのって、サービスの内容、ユーザー体験、リリース速度などが重要で、それを実現できるなら言語自体はさほど重要でない
TypeScriptはエコシステムが充実してるから、それに乗っかるのは一つの選択
(バックエンドTSはつらい点もあるから、他の技術を持ってるところなら他のものの方が良いと個人的には思うけど、そういう選択肢が世の中にあって割と普通に受け入れられてるのは現実として理解してる)
>>307 未だにC/C++が原因のセキュリティ脆弱性報告が常に何件も出続けている現実を見なきゃ
>>309 それらの点ではどの言語でもほとんど同じだね
遅くてメモリも喰うJS/TSをフロントエンド以外で使うのは適材適所ではないから不利だけど
仮に外部ライブラリを使ってもRustはエンプラには向かないでしょ この分野はオラクルやMicrosoftのような企業が時間かけて作ったきたからできたもので、現状Rustはこの分野向けのライブラリが充実してるわけでもないし、Rustコミュニティが力を入れるとも思えない (したとしても優先度は低い) それに、安定性や将来の入手性が最も必要な分野で、多くの部分をOSSに頼るというのは業界として受け入れないと思う (昨今OSS絡みの事件は多い) 低レイヤやWebバックエンドなど、Rustが強みになる分野があるのはその通り
>>310 それでも何十年もc++が捨てられずに使われているのはなぜかと考えたことはないのか?
ひらがなカタカナ交じりの自然なソートなんて 今更Rustで描いても半日もかからんやろ
c++はrustに勝てる点が全くなく既存資産だけが頼みの綱で終わりでしょう 巨大な既存資産だけは消えるまでに時間がかかることでしょう
超超超熟練度が必要なCOBOLになる C、C++、COBOL まとめてC*
>>314 漢字も当然含むし、ロシア語や中国語などを含む世界の多数の言語にも対応する必要もあるぞ?
時刻や日時の表記も国によって違う
Javaや.NETはランタイムが大きいと言われるけど、その中にはこういうのも含まれる
手間も大きいし、この分野を再実装するのも面倒でしょ
(自分が知らないだけで、既にそういう取り組みがあるのかもしれないけど)
.NETでソートサーバを作ってそれにソートさせて結果をrustで使う
日本だとエンプラよりは自動車の方が早いかもね ボルボにはもう入ってるし10年以内にトヨタ車に入るくらいならあり得るかも
システム周りでは標準で使われて、それ以外は他の言語の下請けになるのかと思ったが実際は違うと言うことか? システム周りにもかかわらず外部に依存が必要であれば使われない ライブラリが充実しないと完全な下請けにはなれず、c++のDLLのように一部高速化部位での限定利用になる
証券取引みたいに、最高のパフォーマンスと最高の信頼性が求められるガチな領域もエンタープライズにあるのは事実で、 内部的にRustを使っているところがあってもおかしくはないが、そういうのって性質上外に情報が出てこないから盛り上がんないんだよね 自動運転もそうだけど、限界の性能を出そうとすると結局は頭の良い人間を上に据えたスペースシャトル型の厳格なウォーターフォールになるんで、夢がなくてつまらないという面も
COBOL なんか古代の遺物みたいに言われつつもかなり広くつかわれてるもんな……
最高のパフォーマンスを出すにはC/C++/Rustしかない 安全性を満たすRustは唯一の存在 これから少なくとも数十年間は天下を取るのだろう
AI が台頭してから電力使用量が劇的に伸びてるからな。 自動車の運転を人間のプロ水準で自動化するなら動力と同じくらいの電力が計算に必要という見積りもある。 AI がまだまだ伸びる分野なら効率は重要だ。 これはコストがどうのとかいうレベルではなくコストをかけても無いものは無い (足りない) という深刻な話で、プラットフォームを担う業者がいっせいに Rust に注目しているのも無理からぬことなのかもしれぬ。
そんな見積もり知らんけど50wでLv5運転できる人間が最高だな
やったことないけど組み込みの世界ではどうなの Rust使われてる?
組み込みはRustが多いですね 新規案件は殆どがRust 単品ではmrubyが多いですね
トヨタ系は基本的に愛知勤務だからな Rustでもなんでも使って求人票を飾らないと厳しいんだろう
Rust使えるなら都落ちして田舎で開発するのも悪くないかも 今はたいていタイプスクリプトばっかだから変化が欲しい
TSはフロント側とサーバー側を包括するフレームワークがあるのが強いんだよね APIを定義してフロント側とバック側を区切る開発なら、バック側はコンパイルされるものが良いというのは同意なんだけど TSを使うメリットがないと主張してる人は、こういう技術を知らないか、机上論を述べたいだけで実際の開発はしないから生産性など関係ないという人でしょ
>>332 その程度なら誰でも知ってるよ
SSR/SSGからhydrationしてCSRするコードも自作したことある
今のWeb開発では、独立したバックエンドAPIはオプションだからね Next.jsでサーバーサイドロジックが存在するのがデフォなので、よほどCPU intensiveな処理でない限りは、 Rustで別途独立したバックエンドを作ることはかえって遅延とコストを増大させる フロントエンドまでRustエンジニアが自分で面倒見るってんなら好きにすりゃいいけど、 Rustエンジニアがフロントエンドやりたいかねえ
フロントとバックエンドで常に齟齬が無ければいいんだけどと言う話になるとTSが出てくる
>>334 それはJS/TSだけでやろうとするからそういう制限になってしまう
RustとWasmも組み合わせてどこまでやるかで色んなパターンがある
>>332 RPC は昔からある取り組みじゃないか。
半世紀もかけて TS でしか実用にならない状況だと本気で思ってるのか?
Wasmはサイズがね… ごく最近のニュースだと、Prismaが実装をRustからTypeScriptに置き換えたのが話題になってたな デプロイ時のサイズが問題になる分野だから妥当ではあるけど フロントだとビルド時間の長さが課題になりそう UIの位置やサイズを微調整したい場合でも、確認のために毎回重ためのビルドが必要になると面倒じゃない?
>>338 UI 記述言語で書いて形になってから Wasm (にコンパイル可能なプログラミング言語) に変換するような仕組みもある。
>>337 RPCじゃなくてUIの描画込みの話だぞ
同じフレームワーク内でクライアントサイドのレンダリングとサーバーサイドのレンダリングを繋げたりできる
>>333 が書いてるようなもの
>>339 色んなパターンのうちそのUI記述言語を採用してのSSG/CSRのレンダリングコード共通化が有力の一つだよね
サーバーサイドからJavaScriptを完全排除してパフォーマンスを上げる方向性が正しいので
web開発の現場に言ってRustとwasmの組合せを使いなさいと言っても鼻で笑われるだけ
精神障害児で周りを振り回す無能です。 この業界で俺は死ぬかも。 悲しみ
自慢したりとか怒ると自分の首を絞める。 死ぬ。 俺はプログラミング向いてないが、この業界に行くぞ。 どうも死んだほうが良い人間です。
rustも分からんし三年間学んでプログラム書けない無能です。 質問ある?
そもそもこの世の中教えてくれない人が悪いと奥底で思っている無能。 人との縁を切って一人で後悔しがち。 ゴミ人間だよ!
俺はガイジだ… ガイガイガイジのガガイのガイ。 ガイジのボッチのやる気のある無能。 ゴミカス死んだほうが良い。
不勉強で天地入れざると言う言葉を知らなかったが 明治とかの言葉なのかな? 学があるね
>>352 ありがとう!
言葉を表面上の意味しか捉えられないガイジだけど、他人に迷惑かけるのは良くないよね…
スレ荒らしてすみませんでした…
どうせ俺以外誰も見ていないから好きなだけ荒らせばいいと思うよ
>>352 抜刀隊の歌詞にあるから知ってた。
ミリタリー趣味の人ならまあまあ知ってるんじゃないかな。
私は音楽側の趣味で知ったんだけど。
業界には何らかの形でメンタルを病んでる人間が50万人以上いると思う
自分は悪質でなければ荒らしを許容するスレにいた そこでは荒らしとも楽しく話してそのうち荒らしが真面目なコテになったりしていた みんなもうどこかに行ってしまったのが残念だけどそれも運命だなと
unsafeなライブラリのラッパーでsafeに設計するのってどうやるの
>>362 結局のところ、外側から見て safe な振る舞いになるようにするというだけ。
場合によっては不可能なこともあるけど具体的な状況がわからないとなんとも言えない。
>>362 未定義動作の可能性を排除するために必要な条件を全部チェックする
panicとデッドロックはOKらしい(停止すれば許される)
No matter what, Safe Rust can't cause Undefined Behavior.
https://doc.rust-lang.org/nomicon/safe-unsafe-meaning.html >>342 そういう低レベルな現場は無視してもいいんだよ
現在もJSのフレームワークは乱立しながら変化進化し続けているように多様性がある
今回の件と関係なくwasmを既に併用しているところも多いからその点もだいじょうぶ
誰がその多様性とかについていくのか? お前が低レベルな現場と呼ぶ環境だろう?
フロントにRustを使ってる「高レベル」なプロダクトって何があるの? バックエンドなら分かるけど その基準なら世の中のビジネス的に成功してるサービスの殆どが低レベルでしょ
>>364-365 関数の内側にunsafe書くだけ?
それだと見た目はsafeだけど内部はunsafeだから実質的にunsafeではないか?
内部で使う関数がunsafeである理由を理解して未定義動作の可能性を排除できてないなら 外側の関数にもunsafeをつける約束
unsafeは「危険」というよりも「コンパイラが安全性をチェックできない」ブロックだと思う 内部的に unsafe を使ってても、ラップした型や関数を外から使う分には安全とみなせるなら問題ない 理想的には ・内部的にunsafeを使っているけど、外から見れば安全 -> unsafe を外して良い ・内部的に unsafe を使っており、かつその関数は利用者が適切にコードを書かないと危険 -> その関数も unsafe とマークするべき 標準ライブラリやきちんとしたライブラリは基本的にこの法則に従ってる 問題はユーザーのコードで、書こうと思えば「問題はあるけど unsafe とマークされてない関数」は作れてしまう そこは自己責任の問題 けど、セグフォみたいなバグが実際に起きた場合に、直接の原因となるコードは unsafe ブロックの中に絞れる (ことが多い) から、それでもかなりマシだと思う C++だとコード全体が unsafe ブロックの中にあるようなものなので…
>>365 Undefinedの有無もなにも標準化されてないからなぁ
unsafe = Rustコンパイラが安全性を保証してくれない = プログラマが自分の責任で安全性を保証しなければならない = C/C++と同じ状態 逆に言えば、safeつまりunsafeではない、とは、Rustコンパイラが安全性を保証できる状況にしないといけない 未定義動作がないことが根幹にある だから未定義動作とは何か、どういう時に起きるのか、どうすれば無くせるのか、が最重要 それを完全に理解するまでは、関数内部でunsafeを使って外をsafeな関数、にする判断をしてはいけない
unsafe functionは使いどころが微妙だね unsafe指定の理由が不明だし基準も開発者次第でまちまち C#みたいにunsafeにはコンテキストとしての役割しか持たせない方が一貫性がある 呼び出し元に注意させたいんならunsafe_hogeみたいなネーミングルールで十分だった
バリアより感染症対策で流行ったゾーニングのイメージだな 感染リスクのあるunsafeゾーンと安全なsafeゾーンがあって unsafeからsafeに持ち込むときは消毒(検査)が必須みたいな感じ 運用が雑になって事故るのも同じ
>>376 > それを完全に理解するまでは、関数内部でunsafeを使って外をsafeな関数、にする判断をしてはいけない
それをやると、一つの関数を unsafe にした時点でそれが呼び出し元に波及して、プログラム全体に unsafe が広がらない?
深刻なバグがコード内のどこで起こってるかを特定したい場面だと、 unsafeは本当に unsafe な操作をしてる箇所に限定されてた方が探しやすいと思う
>>377 呼び出し元に注意を持たせるものではない
unsafeブロック(関数)内はRustコンパイラが安全性を保証しない
それ以外の部分はRustコンパイラが安全性を保証してくれる
C/C++はプログラム全体がunsafeブロック内にある状況と同じと説明できる
>>379 そうだよ
理解するまではunsafeを使ったらunsafeな関数しか作れない
safeな関数にしてよいかどうかの判断が一番大事なところ
勝手に判断してsafeにしたらプログラム全体に問題が波及しかねない
まずは理解してからunsafeに手を出しましょうということ
「unsafe利用箇所をunsafeブロックで囲えば終わり」は、よくある勘違い まず一次的には「それを含む関数もunsafe fnにしなければならない」が正解 その上で「内部でunsafeを使ったことで生じる問題が、その関数単独でまたはモジュール全体で閉じ込めることができているかを判断できてから、ようやくunsafe fnをfnにできる」が正解
unsafeな理由をブロック外部で処理すりゃsafeに出来るじゃん たとえばなraw pointer参照が危険だとして渡す前にスタックまたはヒープ内の正しいアドレスであることを確認して引数を渡すとかの、外部でのチェック(unsafeに至る条件の排除)すれば無毒化できるわけで そんなんC言語だって変わらんやん。Cで汎用的な関数書いたらほぼほぼポインターだらけになるし、ポインターのチェックせずに使うなんてことは危険すぎてありえんのと一緒やん C言語にrustコンパイラーのunsafeの枠組みだけ組み込んでsafeじゃなきゃエラーにしますにしたら、コードの5割ぐらいはunsafeになってそうやけどな。標準ライブラリーからしていくらでも危険なアクセスできるし
>>382 Rustでプログラミングしたことない人には理解できないのは仕方ないが的外れ
そのCで手動でチェックをして使うようなことは
Rustではunsafeを使わずとも普通に書くことができて自動的にチェックしてくれて安全かつ楽
むしろRustでunsafeを使う頻出パターンの一つは真逆
その自動チェックを無くすためにunsafeが使われる
例えばあるアルゴリズムで既に自動チェックされて既に安全なものがアルゴリズムの都合で二重に自動チェックされてしまいコンパイルでの最適化でも消えないとする
その2回目の自動チェックを無くすためにunsafeを使う
もしそのアルゴリズムが1つの関数で完了するならばその関数外に影響はないため
関数内部でunsafeを使っていても関数自体は外向けにsafeにすることができる
そのアルゴリズムで2回目の自動チェック省略が常に正しく安全なことはプログラマが安全性を保証することになる
これがunsafeを用いて極限まで速くしつつ安全な関数を生み出すRustの典型的なパターン
https://doc.rust-lang.org/book/ch20-01-unsafe-rust.html これが全て
unsafe function に関しては、長文複おじが主張するほどunsafeを含む関数に対して積極的に指定すべきものではなく、
むしろ極力safeとしてラップすることを推奨するトーンで書かれているように感じる
「unsafe functionは呼び出し元に注意させるためのマーク」という解釈は適切であり、常識的に考えて中でunsafe使ってようと呼び方によって未定義動作が生じるような関数はそもそも作るべきではない
unsafe指定の理由が不明って斬新な視点だと思うけどね 他の言語でunsafe使ってるから意味は理解出来る
>>384 逆だぞ
未定義動作が発生しうるパーツがunsafe関数
そのパーツを上手く使ったり組み合わせたりして未定義動作を発生させなくしたものがsafe関数
変わった人が集まって3行で済んでいた話を広げていく
>>368 無いから自演してまでしてRustを盛り上げようしてる
ここスレが立って1週間で300レスかよ さすが究極のプログラミング言語だけあるな 関心持つ人多すぎ
>>369 その理屈だとRustで描かれたコードはすべてunsafeだ
>>389 何なんだよこの気持ち悪い複オジのレスはw
>>383 borrow mut な部分を unsafe {} で囲むとコンパイル通せるんだっけ?
>>392 unsafeであろうとRustの参照ルールは変わらない
ナマポ受給は可能
unsafeで囲むとその中で危険な必殺技が使える 強力だけどその間はリミッター解除され保護されていない状況にも近い諸刃の剣 それを呼び出す部位もunsafe扱いしたらmainまでunsafeになり危険極まりないw
やってることはC言語でコメントにunsafeって書くのと変わらねえじゃん
違いが判らないなら理解力が不足しているだろう unsafeだと通常は許されないことが可能になる
>>395 全く異なる
Rustではunsafe部分のみ人間が安全性を保証する義務がある
それ以外はRustの言語仕様により自動的に安全性が保証される
一般プログラマはunsafeを使う必要がない
>>396 俺が言ってる意味がわからない方が理解力が不足してるかもよw
>>398 unsafeじゃない部分を無視してそれを言うのは意味がないこと
typescriptで書かれたコードがjsに変換されてそれに型が残っていないと言うのと似たような主張
他の言語でもunsafe以外では保護されている部分もunsafeで制約が解除されている
>>369 unsafeな関数には関数を呼び出す側が守るべきsafetyルールがそれぞれ定義されている
ラッパー関数がそのルールを関数内のみで不変的に守ることが保証できるのならsafe
できないなら上位で保証してもらう必要があるからunsafe
いずれにしてもunsafe関数を呼び出す側が守るべきsafetyルールは
アプリケーションのどこかの段階ではすべて守られることを保証しないといけない
>>396 その理屈だと二重の borrow mut も unsafe{} で許可してもらえるととってもありがたいんだが
>>402 unsafeの使用は安全性を守るためだけに使われるのだ
安全を脅かすためにunsafeを用いてはならないのだ
>>396 unsafeブロック内でも外でもRustのルールは基本的に同じ
何でも出来るようになるわけではない
unsafeブロック内でのみ出来ること
・unsafeな関数やメソッドの呼び出し
・unsafeなトレイトの実装
・生ポインタの逆参照
・共有体フィールドの読み取り
・可変静的変数の読み書き
このたった5つのみが許可される
特殊な環境を抜きにすると普通の開発でunsafeが使われることはほとんどない むしろコンセンサス無くunsafeを使う人がいたら問題児認定されても仕方ない ボトルネックがあってunsafeを使うことで安全かつ劇的に改善されるなどの共通認識が出来たら注意深くみんなの監視の下で使われる
特殊な環境って...具体的にどういうのがあるんですかね...
安全に使うための条件が分からないunsafeは不味い 標準ライブラリのunsafe関数は大体Safetyで明示してる
>>378 メモリに対するバリアはunsafeを必要とせずにsafe Rustで使える
モデルはC++と同じでstd::sync::atomic::AcquireとReleaseでバリアを構成する
OS提供のヘッダーファイルと連携しないといけないからね rustだってOSのAPIとして使われるようになったら今の形のままでは済まされないはず
その頃にはもう人間がAPIを管理することはないだろうから我々が気にする必要はない
atomicを使える局面なら最速を狙えるが 素人は無難にMutexにしとけ
処理が性能上クリティカルじゃないことが分かってる上で手を抜くのはいいけど、必要に応じてロックフリーを実装できないレベルならさすがに言語の選択から考え直すべき 場合によっちゃゲロ遅スクリプト言語でロックフリーに書かれたコードより遅くなるぞ
誰もメモリバリアの話なんかしてないだろストローオジ
>>415 ロックフリーにできるならatomicを使う方が当然よい
しかし素人がABA問題からRISCのアクセス順序崩壊まで様々な問題を理解しつつ
compare_exchange系などを正しく使いながら各々のRelaxed/Release/Acquired/SeqCstを最善に選べると思えない
複数のatomicが複雑に絡むとロックフリーはプロでも間違える歴史を繰り返してきた分野だ
さらに言えばatomicよりMutexが有利になるケースの存在も理解して適切に選ぶ必要がある
プロでも単純明快な状況でない場合はまずMutexで実装して後から見極めた上でatomicにするかどうか決める
これらの知識を身に付けるまで素人は無難にMutexにしとけ
>>420 let z = x.or(y).or(Err("ko"));
?
>>421 x=Some(false), y=Some(true)のときz=Some(false)になるからダメじゃね?
>>422 たし🦀
let z = x.and_then(|b1| y.map(|b2| b1 || b2).or(Ok(b1))).or_else(|_| y.or(Err("ko")));
直したらこんなんなったんだが
matchが一番わかりやすい気がする
x.map(|x| y.map_or(x, |y| x || y)).or(y).or(Err("ko"))とかになるからmatch以上にスッキリ書く方法はないんじゃないかな
一応x,yが増えた時のためにイテレータ使うパターン let z = [x, y].into_iter().filter_map(Result::ok).reduce(|b1, b2| b1 || b2).ok_or("ko"); 2つならmatchでいい気がする
たくさんある時はOk(true)でショートカットしたいケースが多そう 例えば素直に let mut is_ok = false; while let Some(x) = iter.next() { match x { Ok(true) => return x, Ok(_) => is_ok = true, _ => (), } } is_ok.then_some(false).ok_or("ko")
幻聴で半分人間半分AIと話していたので
1 私に成りすまして話しているようにいさせている
2 成りすましの声でも身体攻撃の部分は私本人も同じ状態に陥っている
3 犯人が使用していたとしても清廉潔白の人物のように見せれる
【2025年最新】自然な声の音声読み上げソフト5選!AI技術で ...
https://ondoku3.com/ja/post/natural-voice-software/ ※インストール不要で無料で5000文字まで複数声質の音声合成エンジンで読み上げ可能
ローカルで各種AIモデルを実行できる無料ソフト「llama.cpp」がマルチモーダル入力をサポートし画像の説明などが可能に
2025年05月12日 20時00分
https://gigazine.net/news/20250512-llama-cpp--multimodal-vision-support/ >>llama.cppの詳細情報は以下のリンク先で公開されており、ソースコードやインストール手順などを確認できます。
※画像を認識させてテキスト入力が可能
ローカルでAIを動かして「コード生成」「ウェブ上の情報収集」「ファイル検索」などの操作を実行できるAIエージェント「AgenticSeek」、無料で使えてプライバシーも守れるのが強み
2025年05月05日 16時02分
https://gigazine.net/news/20250505-agenticseek-local-ai-agent >>AgenticSeekのインストール手順は以下のページにまとまっています。
※複数サイトからレポート作成可能
>>431 Rustは強い静的型付け言語なので間違えることはありません
>>429 わかるわ
ResultやOptionはわりと継ぎはぎだらけでasyncでの使い勝手もあってコアな開発者でもコンビネータよりもmatch推奨する人が増えてる
>>433 継ぎはぎはない
根本の理解を間違えているからそんな変な発想になる
基本はmatchで書くのが当然
例えば
match foo {
Some(x) => Some(f(x)),
None => None,
}
こう書いた時に意味するところはSome時にfによる写像
だからこれをfoo.map(f)と略記できるというのが根本
短く記述でき可読性も上がる
asyncでの使い勝手というのも同様
このfの形とクロージャでのキャプチャなどの制限を満たせば使えて満たさなければ使えないだけの話
matchを推奨しているのではなくmatchが基本
そのうえで可読性がよくなるメソッドが適用できるならそれを使う
メソッドチェーンもそれで短く可読性が上がるなら使う
>>420 はmatchのままが可読性がいい
それだけの話
だからRustは清書用(キリっ)って言われるんだろうね
>>435 そんな話は聞いたことない
今回の話との関連すら不明
>>434 またバカおじの意味のない長文
アンチRust活動は他所でやれ
>>433 確かに最初の頃に比べると
イテレーター&コンビネーターの使用頻度がやや下がって
代わりにループ&マッチの使用頻度が上がったな
冗長でダサく感じるけど汎用性が高まる場合が多い
早期脱出はループで書くほうがわかりやすいものやループでしか実現できないことも多い 特にラベル指定など
実際どうなるかなんてその時次第だから 今回は結果をまとめて出してるんだろうけど それぞれの実行結果で制御が加われば別に結果をまとめる必要はない場合もでて来るので綺麗に書ける必要はゼロ
>>420 ちょっと主旨から外れるけど、matchは
match (x, y) {
(Ok(b1), Ok(b2)) => Ok(b1 || b2),
(Ok(_), _ ) => x,
_ => y,
};
まで整理できますね。
2回評価するのが嫌なら二段matchがいいかと。
実際にはOk/Err得られた時点で既に実行済みだからその後の工夫は効果薄くて
>>427 のような早期脱出になるかな
next()呼び出しで実行されるとして
関数の実行結果x,yがあります それぞれのx,yが成功していればそれを出力してください ただしx,y共に成功であれば結果を論理和して出力してください x,y共にエラーである場合はエラーを出力してください
結果が揃っていたら悩むところないよな 現実には結果が一部しか出ていない段階で欲しい結果が得られたから以降は打ち切り、または、エラーが出たから打ち切り
二段matchも書いてみた。 let z = match x { Err(_) => y, Ok(false) => match y { Err(_) => x, _=>y, }, _ => x, }; 普通はこんな書き方しないだろうけど。
まあしかし 元の let z = match (x, y) { (Ok(b1), Ok(b2)) => Ok(b1 || b2), (Ok(b1), Err(_)) => Ok(b1), (Err(_), Ok(b2)) => Ok(b2), (Err(_), Err(_)) => Err("ko"), }; これが一番可読性高くて網羅性も一目でわかっていいと思うわ
結局のところは意図が表れていて読み取りやすいことが重要で、スマートに書けてても見た他人がなんのこっちゃとなるようではあかんからな。
>>446 蛇足だけど、こっちの方がいいか。
let z = match x {
Err(_) => y,
Ok(true) => x,
_ => match y {
Err(_) => x,
_=>y,
},
};
他の言語でもあるんだけど元々シンプルに書けていたものを その言語特有の機能で書き換えたい勢がいる パズルとしては別に構わないけどそれでどれだけ時間を費やすのか考えてなさそう
>>441 さすが汚コーダーと呼ばれるだけはあるな
汚コーダーと言いたい気持ちもわかる 俺たちの時代は変数名は一文字で可能ならワンライナーで処理が終わるように工夫しまくってた。2行だったのが1行79文字に収まったぞ!的な この美的感覚を共有できる仲間がいてくれて幸せである
両方Okの場合だけx.or(y)と違う動作をさせたいと考えるならそう書けばいいと思う match (x, y) { (Ok(b1), Ok(b2)) => Ok(b1 || b2), _ => x.or(y), } 入力が増える場合は上の処理を関数にしたものをループ内で呼ぶ forループとか使っとけばショートサーキットも簡単 あと本当にErrを捨ててもいいんであればResult<bool, &str>じゃなくて Option<bool>を受け取って返す形にしておいたほうが扱いも楽だしスッキリする
>>426 のはOption<bool>化して最終的にNoneならErr(“ko”)にfallbackさせてるから
読みやすいかどうかは別にして考え方としてはわりと好み
AIチャットボットに「偽の記憶」を植え付けることで仮想通貨を盗む攻撃が報告される
2025年05月14日 12時00分
https://gigazine.net/news/20250514-web3-ai-agents-with-fake-memories/ >>プリンストン大学の研究チーム
過去に流通した誤情報に接触した人の半分が「正しい情報」と思っていて25%が何らかの手段で拡散している
2025年05月14日 11時25分
https://gigazine.net/news/20250514-fake-news/ >>総務省
「Firefox」の開発リポジトリが「GitHub」に移行
https://forest.watch.impress.co.jp/docs/serial/yajiuma/2013958.html https://github.com/mozilla-firefox/firefox JavaScript 28.5%
C++ 28.1%
HTML 22.0%
C 10.5%
Python 2.9%
Kotlin 2.5%
Other 5.5%
5次方程式に新公式を発見:ルートを超える新理論
2025.05.14 17:05:56 WEDNESDAY
https://nazology.kusuguru.co.jp/archives/177496 >>オーストラリアのニューサウスウェールズ大学(UNSW)で行われた研究
プログらまーも覚えるとよい
125年越しに解決したかもしれない「ヒルベルトの第6問題」とは?
2025年05月10日 15時00分
https://gigazine.net/news/20250510-hilberts-6th-problem-solved/ Mercurialが積極的にRust化を進めていたのは少なからずFirefoxの影響があったと思うが 酷い梯子外しで草
Mercurial は開発履歴管理で Git はパッチの連鎖管理という理念の違いがある。 それって結局は同じことじゃないのか……と思うんだけどやっぱり違うんだよな。 概念的に整理されていて理解しやすいのは Mercurual だけど、実務的に必要なのは Git。 ツールがどんな言語で書かれているとかはあまり関係なく、大規模開発だと Git のほうがやり易いというとても簡単な話。
Rust用のJITコンパイラ・インタプリタ的なものはありませんか? PythonやJavaScriptのようにコンパイル時間を待たずにデバッグしたいんです。
RustもGo言語のように、消えてゆく運命ですか?
>>461 371 デフォルトの名無しさん sage 2025/05/14(水) 20:25:52.45 ID:u4PNt/Ez
TypeScriptを(C++等のように機械語に)コンパイルする方法が知りたいです(´・ω・)
>>462 C++標準委員会がRustを参考にしたコーダー用Safe C++(C++呼び出し専用の限定版)を作ればC++に回帰する可能性があるけど、そんな動きは無いから当面安泰じゃない?
コンパイラから全ソースコードが見えていて好きなだけ時間を使ってチェックさせるのか 商用を含め様々な出所のコンパイル済みバイナリでもリンク(静的、動的)して動かすのか 役割と責務が違う
>>457 FirefoxはメインがC+のまま変わっていない
Rust化した部分はレポジトリが別
>>460 それはよくある勘違いで、Gitのコミットはパッチではなくスナップショット
常に完全なスナップショットを持っているためにコミット間の差分の導出は極めて容易であり、
あたかもGitが差分ベースであるかのような使い勝手のコマンド体系を実現することに成功している
その結果
>>460 のような誤解も多い
>>467 それは実装上の話で、ここではパラダイムの話をしてる。
>>468 それ信頼できる出典ある?
仮にGitのコミットが(実装はさておきメンタルモデル上は)パッチだとしたら、rebaseやcherry-pickで新しいコミットが作られるのは変だと思わないのかな
Claude 3.7 with extended thinking 様によると Gitはスナップショットベースのシステムで、各コミットはファイルシステム全体の完全なスナップショットを保存します(最適化されていますが)。一方、Mercurialは変更セット(changeset)という概念で差分ベースの履歴を管理します。 この根本的な違いがGitの操作モデルに影響しています。rebaseやcherry-pickが新しいコミットを作成するのは、Gitがスナップショットモデルを採用しているからこそ自然です。既存のスナップショットを新しい文脈に適用すると、新しい状態のスナップショットが必要になります。 パラダイムと実装は密接に関連しており、Gitの設計思想はLinus Torvaldsが述べているように内部データモデルから生まれています。このモデルがGitの分散性、ブランチ操作の柔軟性、大規模プロジェクトでの優位性につながっています。
>>447-448 記述量多いけど観る分には判り易い
>>465 >コンパイラから全ソースコードが見えていて好きなだけ時間を使って
Cargo の build 遅いしディスクの容量も喰いまくる(消せるけど)
そこまでやるなら他人(自分のであっても別cratesのとき)のstruct/traitを組み合わせて追加しても良い仕様にして欲しいな
>>472 Orphan Ruleが破れるのは致命的
第三者に勝手に実装されてしまう
これは必須ルール
Rust の型システムの原型になった Haskell では Orphan Rule のような制限はないから技術的には制限しない選択も可能ではあるはずだけど 通常は避けるべきと考えられているし、警告も出るし、コンパイル時間にもかなり悪影響だし、良いことは少ない。 必須というほどではないかもしれないけど、あまりにも割に合わないとは言える。
Googleが開発した進化的AI「AlphaEvolve」は未知のアルゴリズムや未解決数学問題の新解法を発見可能、すでにGoogle内部ではAI開発やチップ設計の効率化に活用されている
2025年05月15日 11時06分
https://gigazine.net/news/20250515-google-ai-algorithm-alphaevolve/ >>474 例えば第三者のクレートを利用した時
そこで標準ライブラリの型に対して標準では実装されていない標準ライブラリのトレイトの実装があっても通ってしまう
これは誤動作につながるからOrphan Ruleは必須かと
標準ライブラリ以外の型に対しても同様で第三者に実装権限を与えるのは禁じる必要がある
>>476 それは攻撃やミスに対する脆弱性を封じるという意味で制約が必須と言ってる?
こっちは (技術的な) 実現可能性という意味で必須な制約ではない (があえて制約を無くすことのデメリットが大きい) と言ってるので主旨が異なる。
>>477 Orphan Ruleなしでも脆弱性を封じることができるならば技術的な実現可能性があると言えるかもしれない
そうでないならばOrphan Ruleは必須
グローバルに適用させようとしたらそりゃ問題が起きるわ 拡張をスコープにいれる場合はモジュール内にuseステートメント書けばいいだけ
C#で言う拡張メソッドをやりたいのに、Orphan Ruleが邪魔をする 次のeditionでは廃止してほしいね
>>479 それは違うよ
それは自分で拡張用トレイトを作って、自作以外を含めた任意の型に対して実装して使う時に、自分で範囲を限定する時の話だね。
そうではなく、普通に必要のためuseしている標準やクレートのトレイトが、勝手に第三者によって実装されてしまうことを防ぐのがOrphanルール
>>480 Rustでは、自由に拡張メソッド用のトレイトを自作して、既存の型に実装して自由にメソッド拡張できます。
Orphanルールは邪魔しません。
>>481 もしOrphanルールがないと、トレイトの作成者でも型の作成者でもない第三者によって、勝手に型にトレイトが実装されてしまうため、その実装によっては脆弱性が生じる可能性があります。
>>484 トレイトの実装は可視性の指定をバイパスできないし、そもそも可視性はセキュリティのための機構ではない
その気になりゃ本来不可視なメンバにアクセスすることなんて普通に可能だし、
もしクレートの作者に悪意があって、利用者が不用意にバージョン上げる阿呆なら、サプライチェーン攻撃によってマルウェアを仕込むことなど造作もない
>>485 そんな悪意のある話はしていません。
第三者が公の型に公のトレイトを実装できてしまうと、その第三者にとっては意図通りの必要なことが実現できたとしても、他者にとっては必ずしもそうではないためその差異が穴になりうるという話です。
>>480 既存の構造体に新しいメソッドを生やしたいだけならextension traitで可
既存traitに新しいメソッドを生やしたいならextension trait + blanket implで実質同じことが可
拡張メソッド1つじゃなくtraitと実装の最低2つを定義しないといけないがそんなに気になるほどではない
Swiftの拡張メソッドのように既存インターフェースに後から適合させるのはRustでは無理
>>486 だからそれはグローバルに適用した場合の話でしょ
そりゃ問題起きる
>>488 理解できてないのかな?
例えば標準ライブラリのトレイトに話を限ったとしても、自分で使いたいからuseしたり、preludeで自動的にuseされたりするよね。
そのトレイトが標準ライブラリでは実装されてない型に対して、第三者が実装できてしまうことを防ぐのがOrphanルール。
標準ライブラリではない一般クレートに話を拡張しても同じ。
barクレートとbazクレートがどっちもfooクレートに依存してて それぞれで個別にimpl FooTrait for FooTypeを定義してたら barクレートとbazクレートを両方使うときに衝突して困る
>>489 それは型定義ともトレイト定義とも異なるクレートでのトレイト実装という現状禁止されている行為が仮に許可された場合、
コンパイルパスに入ってさえいれば暗黙的に実装がインポートされる仕様になる、とあなたが勝手に想定しているからでしょ
もし対応するなら、実装を含むモジュールを明示的にuseさせるような仕様になるだろうし、
そういった面倒を避けるためにorphan ruleがある、と考えることもできる
例えばu32型にその値を半分にするメソッドhalf()を生やしたいとしたら自作トレイトHalfを用意してu32に実装してやればメソッド拡張できて そのトレイトHalfをuseすれば第三者もその恩恵に授かってhalf()メソッドを使えるわけだけど 仮にOrphan ruleがない世界だと u32型には実装されていないstd::ops::Negトレイトも誰でも実装できてしまう 先ほどのhalf()メソッドはuse dareka::Halfした時のみ使えるから自己責任で済んだけど 今回は別目的でuse std::ops::Negしてる人にもu32型にneg()が生えてしまう 本来はu32型の変数xに対して-xはコンパイルエラーとなるけど 今回はneg()が使えて-xがコンパイル通ってしまう しかも実装の内容によってはその-xの挙動が不明だ
ポケモン協会は秘密にしてるけど、たぶんポケモン世界にはイジメ属性みたいなのもあって仲間ポケモンを自殺に追い込んだりしてると思う。 それとか孕ませポケモンがトレーナーをレイプしたりだとか、逆にトレーナーがポケモンと獣姦 (?) したりだとかいう醜聞もいっぱいあるに違いない。 ポケモン協会はそういうのを隠さずに公開すべき。
それはもはやトランスアニマルじゃねーの いくら翻訳がグダグダだからってそこまで人間性失うのはいかがなものかと
>>457 ,466
ほかの言語と同じように外部ライブラリ/crateを除外してある今回の数字が正しそうね
>>493 Orphanルールの説明で第三者による実装同士がぶつかりエラーを引き起こすためという話を見かけるけど
ぶつからなくても単独でもそういう支障があるんだよな
>>500 詳細を見るとこれはRustとLLVMの改善に大きく寄与しそうだな
(1) Rustコードの問題
(2) Rustコンパイラの問題
(3) RustコンパイラからLLVMへの問題
(4) LLVMの問題
これらは密接に関係していて(1)を完璧にしていても
(4)の問題から逆連鎖して(1)で対応するためのコード調整をしなければいけないようだ
本件をきっかけに様々な改善が期待できるので世界全体に役立つだろう
LLVMを用いている様々な言語にも恩恵ありそうだ > 驚くべきことに、Clang 18 でビルドされたバージョンは、Clang 17 でビルドされたバージョンよりもパフォーマンスが劣ることがわかりました (~3% 遅い)。 > このリグレッションの原因は不明ですが、Clang全体で一貫性があり、対応するLLVMバックエンドを使用していることがわかりました。
Rust は将来的に LLVM をやめる計画じゃなかったっけ? うろ覚えなので勘違いかもしれんけど。
>>503 GCC Rustは継続的にやってるみたいだけど、別にLLVMはやめないでしょ
今日公開のRust 1.87.0でio::pipeが追加された 今までなかったことが不思議
>>500 対象国に対して賞金が安すぎる
しかもRust処理系の方に手を入れた場合はアプリケーションの改善をした人と山分けになる可能性が高いし、
一般的な有効性を証明してRust処理系にマージされないといけないというのはハードルが高すぎる
残念ながら複おじが期待するような結果になる可能性は低いと言わざるを得ない
>>505 Stdio::piped()が10年前からある
無名パイプはOS依存かつプロセス間だから汎用化は安定化に時間がかかったのかな
>>500 ,506
フルで$20,000でも米国の1人月かぁ、しかも成功報酬だから最適化を舐め腐ってるけど
Rustに入れ込んでる一定数はひと山当てたい連中だから売名プロモーションとして参加するだろうね
リンク先見たら初っ端からsafe rustを諦めているから 何の為のプロジェクトか意味不明になりかけている
>>509 unsafeからsafeを創り出す新たな安全パターンを見つけたら、それを使うのは問題ない
その部分だけ徹底的に人の手で安全管理して、それ以外の安全をRustコンパイラに任せることができる
それらのうち特に汎用パターンを集めたものが標準ライブラリという視点もある
今になって気が付いたじゃなくて、言語仕様で例外を投げられないから無視してただけでは
> We noticed that the existence of panicking code significantly increased stack usage. Similarly to how panicking/formatting code prevented crucial inlining in bounds checking code until moved out of the function, panicking code also increased stack usage and spills.
>>510 タラレバがでかい
>>509 標準ライブラリの内部でも unsafe はたくさん使われてるぞ。
unsafe をどう「閉じ込める」かが Rust プログラムの構成の肝心な部分だ。
速度チューニングのために閉じ込めきれなかったのなら失敗と言えるが unsafe がただちに悪いわけではない。
panic(エラー処理)を関数内に収めるからregisterが足りなくなり易くなるからspillさせるためにスタック多めにして、コードサイズも大きくなるのは最初から分かってたでしょうよ
unsafeは禁止なのにpanic!はOKって何考えて設計してんの
速度にシビアなコードを書く時は関数にpanic呼び出しが残っていたら当然負け まずはpanicを生じさせないイテレータなどで書き インデックスアクセスを避けられない時は様々な工夫とヒントをコンパイラに与えて境界チェックを回避 それでも回避できない部分が残れば最後の手段unsafe安全閉じ込め 他の言語なら全体の安全保証を捨てるか遅さを我慢するかの二択
一番初歩的なゼロ除算はchecked_divがidiomaticだけど、
https://stackoverflow.com/questions/66602948/is-there-a-way-to-catch-division-by-zero-errors-without-checking-in-advance 実際に0除算を実行してハードウェア例外を発生させるコードの例(回避できない部分と仮定)として、
> それでも回避できない部分が残れば最後の手段unsafe安全閉じ込め
>>515 の言うこれをゼロ除算で具体化するとどうなるの?
>>516 除数をstd::num::NonZero型にするとpanicコードは入らない
>>518 実際にかつてそれで対応したことがありアセンブリコードも確認している
>>519 要求されてるのは
>>515 「それでも回避できない部分が残れば最後の手段unsafe安全閉じ込め」™の具体例だからサッと出せば良い
>>520 safeなstd::num::NonZero使用で対応できているためunsafeの必要がない
>>521 御託はもういいからお前はsafe縛りでAV1デコーダを書き直してCと同等の速度を達成してこい
>>522 金と暇を用意してくれたらな
それから最高速を求める時にsafe縛りの必要はない
unsafeを安全に閉じ込められる枠組みが見つかればそれを実行してきたのがRustの歴史
その恩恵で皆がsafe Rustでパフォーマンスを出すことができる
デコーダーの主要部分はC版の頃からアセンブラで書かれてて、Rustはグルーコードに過ぎないみたい
pub const fn checked_div(self, rhs: Self) -> Option<Self> { if intrinsics::unlikely(rhs == 0 || ((self == Self::MIN) && (rhs == -1))) { None } else { // SAFETY: div by zero and by INT_MIN have been checked above Some(unsafe { intrinsics::unchecked_div(self, rhs) }) } } NonZero使ったら最適化で分岐が消える場合があるってことだろうけど チェックタイミングがNonZero化するときに移動しただけだよね もしくは定数由来だからチェックが不要になったか
>>527 checkなくコストゼロでpanicもなく安全にu64 / NonZero<u64>の除算やNonZero<u64>→u64の変換などができる
ゼロ保証のない変数からNonZeroを作るには必ずチェックコストがかかるが以降は除数として何度使ってもコストゼロ
元が穴のないCコードならどこかで何らかの方法でゼロにならないことを保証しているはず
それに準拠する形を取ることができればCとRustは同じコストで同じ速さになる
もし元のCコードにゼロ保証する仕組みが全く見当たらないならばそれは穴のあるコードが見つかったことになる
>>528 病気だな。
要求されてる「それでも回避できない部分が残れば最後の手段unsafe安全閉じ込め」™の具体例を上げやすいように、
「それでも回避できない部分」を簡潔に作り出すのが手間なら、ループ最深部の(0かも知れない)除算を想定した上で「unsafe安全閉じ込め」™をサッと挙げたらどうですか?
と言う話のはずなのに、この受け答え。
>>529 unsafe使わずにsafe Rustで実現できている
何のためにunsafeを使えと言ってるのか理解できない
>>528 > それに準拠する形を取ることができればCとRustは同じコストで同じ速さになる
こんな単純化を信じているのが大勢いて、信者の一人
>>500 記事が現実を突きつけられているのに
>>528 はまだ受け入れられない。
>>530 対象国居住者とタッグ組んで参加してください。
>>525 > Rustはグルーコードに過ぎないみたい
グルーコードに過ぎないのに、最大限努力した結果で5%も性能差が出ている事実がインパクトある。
>>531 何を解決してほしいのか具体的に言おう
panicもcheckも必要なく安全にsafe Rustで実現する方法は既に使えた
当然ながら元々はボトルネックを特定した上で部分的にアセンブラで書いているのだろうし、 当時のスキルをもってすれば今5%も差が出ているならまずは原因箇所の特定くらいは簡単にできそうなもんだが、 なぜこんな解像度の低い状態で丸投げしているのか謎 オリジナルの開発をやった人がいなくなっちゃったのかもね もはやRust関係ないけど
>>531 何を解決してほしいのか具体的に言おう
panicもcheckも必要なく安全にsafe Rustで割り算を実現する方法は既に伝えた
ここでは全部一人のせいにしているけど
だぶん「unsafe安全閉じ込め」™オジwと複オジは別人で
都合悪なると仮病になる
>>535 懸賞記事内にリンク記事があるよ
>>534 ,536
たぶん「unsafe安全閉じ込め」™が何のことか具体的に知りたいだけでは
仮病してると複オジと同レベルだぞw
>>537 「unsafe安全閉じ込め」の例はRust標準ライブラリに無数にあるからそれを知りたいとは思わなかった
興味ある部分についての標準ライブラリのソースを読んでくださいでおしまい
>>537 一通り読んだけど、c2rustのunsafeコードを修正する際に適用することにしている、一般的に高速化に寄与すると考えられる作法を紹介しているだけで、
実行時のパフォーマンスについての詳細な分析結果は特に見つけられなかった
プロジェクトの概要なんかも見てると金貰って開発する上で結構厳しくQCD管理されてるみたいだから、
どうしても自分達で解決できないというよりは単に切羽詰まってるから助けてくれという感じなのかね
複オジは仮病だろうけど、最近の話題でこんな画像があった
統合失調症のブログが話題に「全てがわかる。すべてのすべて」
>>513 この種の速さ命のプログラミングではpanicコードを完全に排除するためその問題は起きない
テックポエム量産してるのは
>>542 に近いのでは
論理的には違っていると自覚はあるから「ポエム」と称するけど
異常脳神経が「分かった」シグナルを発して仕方がないのだろう
このGoスレレスなんて
>>542 のイチゴの例そのものね
> Goはルーン文字と同じ運命をたどりそうだな
> 紙が普及した時代に原始的な彫刻文字は流行らない
> 時代に合わせて形を変えないと
>>545 頭おかしいのはみんな気づいてるからいいとして、せめてコテにしてNGさせてくれよな
延々中身のない仕様も理解していないレスバを目にするのも辛いしな
よりに寄ってこんな過疎スレに来なくていいのに
科学 + 5ch
20種近くも検出された新しい「量子状態」は、量子コンピューター飛躍の鍵になるか [すらいむ★]
2025/05/16(金) 22:52:02.48
http://2chb.net/r/scienceplus/1747403522/ >>これまで理論上の存在と考えられてきた量子状態の検出に、国際研究チームが初めて成功した。量子情報の保存や論理演算の基盤として応用することで、量子コンピューターの未来を変える鍵となるかもしれない。
※犯罪の手口が判明するのか
>延々中身のない仕様も理解していないレスバ 潰し屋だな
全能感があるだけ幸せなのでは?自分は真逆で老化がはじまったんかと思うぐらい
糖質というより発達系だろ 間違いを認めたら負けみたいな中華メンタルも持ち合わせてるけどあれは病気じゃなくて人間性の問題
キチガイの自白で荒らされてますが Rust 1.0からちょうど10周年ですよ おめでとう!
1.87で安定化したVec::extract_ifの機能がdrainに近いと思ったけど最初はdrain_filterの名前で提案されてたのね 自動で全部dropできないからdrain_filterとかdrain_ifだとだめらしい drainが排出じゃなく吸収のイメージなのはFFが原因だな
extract_if()はむしろretain()+捨てる分を取り出し(extract)と考えた方がいい ただし残すをtrueか取り出すをtrueかで判定関数の真偽が逆に注意 ついでに判定関数の引数が&vec[i]から&mut vec[i]に変わってるため残すものも値書き換え可のおまけ付き
返されたイテレータを使い切らないと全部削除されないからretainとも微妙に違う nextで取った分だけ削除だからpeekableとの取り合わせが悪そう あと関数名はextract_ifじゃなくextractだけでよかった気がする extractがないのにextract_ifがあるのは何かバランス悪い drain_filterから紆余曲折あったみたいだから仕方ないけど
>>558 書いた通り、retain()+捨てる分を取り出し(extract)
だから取り出さないと削除されない
イテレータが進んだ分だけretainと一致する
名前の_ifはすぐに類似のpop_ifが想起される
pop_ifでも条件判定の引数が可変参照で同じだからrangeをlastにしたものと見なすことができる
ifの付かないpopは無条件だから
ifの付かないextractも無条件となる
だからextract_ifというメソッド名が正解で一貫している
すでにドレンフィルタって名称の一般的なものがあるけど… 排水管などのフィルター
coffee extractionはコーヒー豆の方を取り除いているのか液体(エキス?)を抽出しているのか
extract は語源的には ex (外へ) - tract (引っ張る) だから、「取り出す・抽出する」といった意味合いが強い
コーヒー豆とコーヒーが混ざった物からコーヒーを抽出するよね それをコーヒーを捨てているとは言わない 残ってる方は最後まで濾さないとコーヒー豆とコーヒーが混ざった物でしかないので無価値 一方で抽出したほうはコーヒーなので価値がある この意味が判るかどうか?
企業献金、結論先送りへ 自公国法案、提出取りやめ [蚤の市★]
2025/05/17(土) 21:17:14.36
http://2chb.net/r/newsplus/1747484234/ 全国1万1155の企業・団体の政治献金「97%」が自民へ、シンクタンク調査 [おっさん友の会★]
2025/05/14(水) 11:12:39.51
http://2chb.net/r/newsplus/1747188759/ Vecに含まれる構造体を参照しながら、別の構造体に変更を加える処理ってどれがベストでしょうか
これは任意の方苦に向けて電波攻撃可能ということでしょうか?
プログラムの改造で下記が可能になるのでしょうか
「Xperia」が電波法違反、ソニーに行政指導--総務省
2024年12月13日 15時23分
https://japan.cnet.com/article/35227306/ >>スマートフォンにおいて「工事設計認証を受けた工事設計にない空中線を使用しての電波発射が可能な仕様となっている状態にあった事実が認められた」という。
>>565 色々方法があってどれがベストかは状況による
a. 変更内容を作成する処理と変更を適用する処理を分離する
b. split_mut系で更新部分と参照部分のスライスに分割する
c. takeとかreplaceで変更対象の構造体を一旦Vecから取り外す
d. Vec内の構造体を全部RefCellに入れる
可能ならaがベストかな
よくそんな意味不明な質問に答えられるなと思う 自分がアホなのか、予定された質問に予定された答えなのかわからない 本当にわからない
>>567 かなり曖昧な質問に答えてくれてありがとう。
他の言語だとリストから参照で構造体を取り出して、他の構造体を変更したり色々できたけどRustだとかなり制限がキツくて躓いた。ChatGPTにも聞いたりだけどイマイチ納得できなくて、実際使ってる皆さんに聞きたくなったんだよね。
ChatGPTに聞いたなら質問を清書してくれただろ? そっちを貼ればいいだろ? 謎すぎる
意味不明な質問というのには完全に同意 質問と回答が矛盾してるので さすがにこれは発達オジの自作自演ではないだろう
あ・・・ 自分の中では矛盾してなかったみたいww 自作自演発達オジの日本語能力の問題だったか
やりたいことは、構造体には関数も実装ししていて、その関数に大元のVecを渡してそれぞれの要素に変更をかけるみたいなやつだけど、ミニマムで質問してみた。一旦教えてもらったcに近い実装でコンパイル通ったけど、モヤモヤしたので聞いてみました。
「別の構造体」というのは「同じVecの別の位置にある要素」という意味? values[0] を参照しながら values[1] を変更するみたいな
>>565 一般的にそういう時は困っていることが成立している最小構成例を具体的に出す
何通りにも解釈できる意味不明な曖昧な文章では答えてくれる人も減るだろう
>>568 意味不明な文章だがRustのプログラミング経験があるならば
質問者の脳内の仮定を補完して最も可能性の高い質問ケースとして回答者が応じている状況を観察できるはずだ
>>578 それはRustだと面倒なパターンなので仕方ない
{} でブロックを作って借用のスコープを短くする等でなんとかする
ここはボローチェッカーの気持ちの理解が必要
(なぜダメなのかはエラーメッセージが教えてくれてるから、そこは既に分かってるかもしれないけど)
同じことは構造体の別のフィールドを参照する場合も言える
構造体のフィールドaを可変借用しつつ別のフィールドbを参照するなど
何がやりたいのか全然わからん。 コードで示してよ。 コンパイル通らなくてもいいから Rust 風擬似コードって感じで。
複おじちゃんは今日もやらかしてるね 特有の癖が出てるのに自分ではバレてないと思ってるから面白い
困ったことが起きたらその問題が再現する最低限の最小構成コードを書いてみる すると本質的な構造が見えてくる その過程で自己解決することも多いだろう わからなくてもその最小構成コードを貼って質問すればよい
>>579 やはりそうなんですね。ありがとうございます。
>>581 >>583 助言ありがとうございます。
ChatGPTにサンプルコード作ってもらいました。コンパイルは通らないですが、やりたいイメージはこんな感じです。
struct Unit {
id: usize,
hp: i32,
}
impl Unit {
fn act(&mut self, all_units: &mut Vec<Unit>) {
// 自分以外のユニットに攻撃したい
for unit in all_units.iter_mut() {
if unit.id != self.id {
unit.hp -= 10;
}
}
}
}
fn main() {
let mut units = vec![
Unit { id: 0, hp: 100 },
Unit { id: 1, hp: 80 },
Unit { id: 2, hp: 60 },
];
for unit in units.iter_mut() {
unit.act(&mut units); // ❌ コンパイルエラーになるが、やりたいことはこんな感じ
}
}
>>584 これも追加
// 自分以外のユニットに攻撃したい
↓
// 自分以外のユニットから奪い取る
if unit.id != self.id {
unit.hp -= 10;
self.hp += 10;
}
>>585 こんなのでどうだろう
https://play.rust-lang.org/?version=stable&mode=debug&edition=2024&gist=871e0b5209dab043741c765000be6e5a 他言語からすると面倒に感じるかも
「要素 i への可変参照を持ちつつ、Vec全体への可変参照を持つ」のは借用チェッカーに引っかかるパターン
if unit.id != self.id の判定が必要なように「all_unitsの中にunitがいるかもしれない」という状況をそもそも借用チェッカーは防ぎたいので
なので、 split_at_mut() を使って参照範囲を ([i] への可変参照, 他の要素への可変参照) に分けてみた
他には Cell (内部可変性) を使うパターンもあるけど、このケースでこれを使うのはちょっと微妙な気がする
>「all_unitsの中にunitがいるかもしれない」という状況 訂正:「all_unitsの中に自身がいるかもしれない」という状況
あんまりアドホックな対応で頑張ってもまた同様の問題でいちいち詰むよ エンティティなんだから素直に内部可変性を使っておいた方が無難 僅かに遅くはなるだろうが、メモリアクセス効率まで気にするならECSパターンでも覚えた方がいい
スライスを(init, mid, tail): (&[T], &T, &[T])に分割するsplit_midがほしいな 何かで似たような戻り値の型を見た記憶があるけど
590だけど1.86で追加されたget_disjoint_mutが使えるかもしれない 少し癖があるけどsplitの代替になるかな fn main() { let mut v = vec![1, 2, 3, 4, 5]; let len = v.len(); for i in 0..len { let Ok([init, [mid], tail]) = v.get_disjoint_mut([0..i, i..i + 1, i + 1..len]) else { panic!(); }; *mid *= 2; println!("{init:?} {mid} {tail:?}"); } }
>>584-585 程度でこんなんか
安全パターンをプリミティブに単体分離しようと頑張るのは無駄なんだな
結局は要素還元できなくて逆に組み合わせ爆発しそう
>>587 >>591-592 ありがとうございます!大変ためになります。
可変借用ルールの影響を受けないように分離するのが良いのですね。
>>585 私はこの方ではないが、これはこれで知りたかったので、それも解決出来る書き方にもなってるので助かります。
>>589 確かに複雑になってくるとまた沼りそうな気はしますね、内部可変性というのも調べてみます。
借用チェッカの気持ちとしては、同じオブジェクトへの可変参照が複数ある状態を防ごうとするんだよね
fn act(&mut self, others: &mut [Unit]) { }
の中で、 self を操作しただけで others に影響が出たり、 others への操作が self に影響したりするというのは
潜在的なバグの原因になり得る (読み手にとって意図せぬ動作になり得る) から、そうならないことをコンパイル時に保証しようとする
なので
>>587 では、act に渡された時点で self と others は確実に違うものだと分かるコードにすることで、借用チェックの条件をクリアしている
内部可変性は逆に、コンパイル時はいったん不変参照ということにしておいて、実行時に可変借用として取り出すための型
これは「同じオブジェクトへの可変参照は同時に一つまで」というルールを、借用チェッカーではなく自己責任で行うという考え
(「可変参照は同時に一つまで」というルールは変わらないし、実行時にこれを検査する動作になるので、若干のオーバーヘッドはある)
個人的には
>>589 も納得できる考えで、エンティティ (idで同一性を検査するオブジェクト) ならそれでいいよねとも思う
Async が絡むと Mutex という別の型 (これも内部可変性と関係する) が出てくるけど、これはまた別のトピックになるので割愛
なにかへまったら話題変更のために自演を始めるんかな? と思ってしまう いつも大体そんな流れだし急にポップしてくるこのスレの話題は理論寄りが多いのも変な感じする
>>597 left.iter_mut().chain(right)
はflatten使って
[left, right].into_iter().flatten()
にすれば多少は軽い感じになるかな
処理的には変わらないと思うけど
言語が変わっても複オジは変わらんな 自分勝手な間違った解釈を正しいと思い込む病気なのか 間違ってるとわかってもマウントを取り続けないと自我が崩壊する病気なのか
>>602 前者が発達トレイトで
後者が糖質トレイトだね
Rustといえどもある程度大きな規模のプロジェクトになってくると、スマポの使用が増えてきてJava/C#/C++あたりとの差異が縮まってくる印象はある 人間の認知能力の限界なんだろうけど、AIによってボローチェッカーが積極的に大域的に活用されるようになったら、人間がついていくのがだんだん厳しくなりそう
Rustで100万行クラスの規模のコード書いたからって別に破綻せんよ 依存関係整理して注意して使わないといけないのは規模に関係ない
>>605 C/C++からコンパイルされたマシンコードが一切入らないやつってPascal/Delphiは一定数あるけど
100% Rust 製ので100万行規模のソフトなんて何がある?
Rust標準ライブラリがcore+alloc+stdで現在34万行 クレイトだと例えばtokioが12万行
rust-lang/rustのrsファイルだとsrc/(ツール系)が91万行でcompiler/(内部ライブラリ)が69万行 rustcとかrustdocとか混在してて多分同じライブラリ共有してるから個々の正確な数字は出せないね
新設のmozilla-firefox/firefox内はFF固有コードだとして
>>466 の外部crateで実質FF固有なものだけ集めると実は大したこと無いのでは
100万行はたとえだろ 何の言語でも100万行になると設計を極限まで綺麗にしないと地獄だわ
>>604 > ある程度大きな規模のプロジェクトになってくると、スマポの使用が増えてきて
コンパイラやCLIツールなど比較的短時間でプロセス終了するプログラムなら
life timeを'staticにして逃げる場合があるけど
pure Rust GUIアプリでメモリー使用量を考慮したアプリだとスマポの使用が多そうね
なんか怪しいので自分でも計測してみた rust/library/core+alloc+stdは18.6万 tokioは8.4万 rust/srcは81.6万 rust/compilerは57.1万 .mdファイルの行数やドキュメントコメント行・ブランク行・コメント行とか水増ししずぎじゃない?
>>605 これには完全に同意
1万行でも100万行でも個々のコードの複雑さが変わるわけじゃない
どちらもも数十行〜数百行のモジュールの寄せ集め
C/C++製のソフトウェアたちがプログラマのうっかり見逃しミスによるセキュリティホールなどのレポートが常に絶えない原因はその規模と関連がある かなり小規模なものを除いて人間の手でチェックしている限り一定のミスが入り込む コンパイラが全体の安全性を保証してくれるRustは規模が大きくなっても有利だろう
普通に規模が大きくなれば一般的に設計と実装の複雑度は変わるよ どのアプリでも言語でも変わらない rustはメモリ関連のバグが起こりにくいだけ
>>614 Rustを使えばプログラマのうっかり見逃しミスが100%無くなるんだね
RustのコンパイラってAIみたいだね
「Xperia」が電波法違反、ソニーに行政指導--総務省
2024年12月13日 15時23分
https://japan.cnet.com/article/35227306/ >>スマートフォンにおいて「工事設計認証を受けた工事設計にない空中線を使用しての電波発射が可能な仕様となっている状態にあった事実が認められた」という。
※全携帯とスマートフォンのプログラム改造で人の場所に照射可能になる?
※場合にもよりますがAIと併用して個人を追跡しているのなら24時間商社可能
6Gの候補であるテラヘルツ帯の電波を脳の神経細胞に照射すると細胞が異常な成長を遂げたことが明らかに
2022/08/15
https://gigazine.net/news/20220815-terahertz-radiation-boosts-brain-cell/ 携帯電話の使用で「精子の数が減少」の可能性、スイスの研究者が指摘
2023/11/27
https://forbesjapan.com/articles/detail/67083 携帯電話の電磁波が神経や細胞の損傷を引き起こすと主張するロバート・F・ケネディ・ジュニア保健福祉長官が学校での携帯電話の規制を称賛
2025年03月25日 06時00分
https://gigazine.net/news/20250325-rfkjr-kids-cell-phone-schools/ >>ケネディ・ジュニア氏は子どもが携帯電話を使用することについて独自の視点から語り、携帯電話やソーシャルメディアの利用と、うつ病、学業成績の悪さ、薬物乱用との関連性について言及。その中で、「携帯電話は電磁波を発し、一日中携帯電話を身近に置いていると子どもたちの神経にダメージを与え、細胞損傷やがんを引き起こすことが示されている」と指摘しました。
設立 1998年
テクノロジー犯罪の撲滅
H
https://media.toriaez.jp/s2972/32686.pdf P77-身体・運動機能が遠隔から操作される P78-五感が遠隔から操作される
上記が本当だった場合統合失調症操作
統合失調症のう動きがわかるエリアの人はそれを体験中
平衡感覚は別のふらつき缶
視覚感覚なら別の何かを見ている
聴覚感覚なら別の何かの声を聴いている
味覚なら別の味を感じている
触覚なら別の感触を感じている
温覚冷覚なら別の温冷覚感じている
このようになるのですよ
幻聴で悪用していると話していました
オープンソースでアニメ動画を自動生成できるAIツール「AniSora」を中国・bilibiliの開発チームが発表
2025年05月19日 19時00分
https://gigazine.net/news/20250519-anisora/ 1枚の画像からアニメーションを作成するAIツール「AniSora」を発表しました。
Microsoft CopilotがついにGPT-4oの画像生成をサポート
掲載日 2025/05/19 18:56
https://news.mynavi.jp/techplus/article/20250519-3327017/ Microsoftの公式Xアカウントによる投稿では、2025年5月16日に「4o Image Generationがついにリリースされました」というコメントと共に、Copilotで次のことができるようになったと伝えている。
• 正確で読みやすいテキストをレンダリングする
• 作成したものを編集する
• 複雑な指示に従う
• 既存の画像のスタイルを変換する
• フォトリアリスティックな画像を作成する
同アカウントは、実際にテキストによる指示で画像を微調整していく様子も投稿している。
>>457 ,466
設計さえしっかり出来ていればどんなに低く見積もっても5~10万行/人年は固い
車輪の再発明(移行プロジェクト)はすごい勢いでコード量が増えていくはずなんだけどね...
車輪の再発明は再発明であって作り直しのことじゃないよ。 「丸くしたらめっちゃ速く移動できることを発見したぞ!」って今の世の中で言うやつがいたらアホじゃん (そこらにいくらでもあるものが見えてないから) ということを説明してるのが車輪の再発明という言い回し。 「俺も車輪を作れるようになったぞ」とか「別の素材で車輪を作ってみた」みたいなのは再発明ではない。
FirefoxのRust化は本体よりServoあたりを見とけばいいんじゃね? 実用化の目途が立ったら乗り換えるでしょ ブラウザエンジンはCSSもスクリプトも動画再生も全部面倒見るから1から作るのは大変そう
>>466 そのレポを挙げてよ
別のところに100万行ある、見たいな思わせは良くないよ
>>620 関係ないけど、「別の素材で車輪を作ってみた」は発明じゃね?
>>622 Firefoxにそんなに興味があるくせにプロジェクト名すら知らないとは異常だな
見上げてごらん
servoの努力を馬鹿にはしないけど experimentalよりもアリバイ作りに見える位なので servoの成果を当てにするのはどうかと思う
servoは、tauriで使うために開発再開したんじゃなかったっけ? その後チェックしてないけど
車輪の再発明/servoの話で想起されたけど時々、高校生がピタゴラスの定理の新証明を発見的なニュースがある 高校生だから良いけど素人オジだったら大分印象変わる
>>620 ,623
>「別の素材で車輪を作ってみた」
特許は取れるだろう
というかfirefoxのリポジトリを取ってきて*.rsの行数数えるだけで400万行超えるんだが…
>>629 言う奴いると思ってたら...
tokei -C -t=Rust -e third_party
Language Files Lines Code Comments Blanks
Rust 1193 416629 348374 23629 44626
コンパイラ入ってら
tokei -C -t=Rust third_party/rust
Language Files Lines Code Comments Blanks
Rust 10915 3845860 3397959 148316 299585
>>631 面白いね
起源:
紀元前3500年頃、メソポタミア文明(現在のイラク地域)のシュメール人によって車輪が発明されたとされています。
初期の車輪:
固い木材を丸く削り出しただけの単純な構造で、主に陶器の製作や物資の運搬に使用されていた。
発明者:
車輪の発明者として特定の人物が特定されているわけではなく、シュメール文明における技術革新の成果として捉えられています。
>>630 third_party/rustの中身をちゃんと見ろ
依存ライブラリであってコンパイラは入ってない
散らかったのでまとめ直すと
>>629 > というかfirefoxのリポジトリを取ってきて*.rsの行数数えるだけで400万行超えるんだが…
は間違いで、正味35万行
third_partyのソースも保持してるなら言語の比率は参考にならんな
>>637 githubが賢くてgit-submoduleになってないけど除外しているっぽいから確かめてみて
>>613 ライフタイムや借用チェッカーはそのモジュール同士の結合強度を強める傾向があるってことでしょ
大規模になるとスマポが増えるってのは事実で、後になって広範な修正が必要になるのを避けようとすれば厳密なチェックは狭い範囲内にとどめておいて、
大域的な依存関係はスマポで緩く扱えるようにしておく方向で妥協せざるを得ない
インサイダー v談合 マネロン 電波音波攻撃をしているなどの悪の組織の考え化のシミレーションが可能
GPT-4は説得しようとしている相手に関する基本的な個人情報を与えられた場合に説得する能力が人間よりも高くなる
2025年05月20日 13時00分
https://gigazine.net/news/20250520-ai-persuasiveness/ AIエージェントは放っておくと独自の社会を構築し始めるという研究結果
2025年05月20日 12時30分
https://gigazine.net/news/20250520-ai-society/ >>602-603 これが糖質タイプ(
>>620 からの
>>631 )
歴史上「車輪」の「発明」を何度も繰り返しているから「再」発明と言う
>>613 「寄せ集め」があたかも独立であるかのように匂わせたいのか知らんけど違うぞ
>>639 が示唆している通り、大きな相互依存の塊になっている場合が多い
>>639 >>大規模になるとスマポが増える
それは違うだろ
まずスマポは種類が多く各々の目的が全く異なる
どのスマポのことを指しているのか?
小規模でも各々の目的が必要であれば必要となる
大規模になるとスマポが増えるわけではない
具体的にスマポとはどれを指しているのか?
>>639 >ライフタイムや借用チェッカーはそのモジュール同士の結合強度を強める傾向があるってことでしょ
参照を扱う面倒くささが付いて回るという面はあっても個々のボローチェックの範囲は関数内に閉じてるんだから結合強度は高まらないでしょ
C++ とかでも原則としては参照先が参照より先に寿命を終えたら駄目なことにはかわりない。 Rust のライフタイムや借用規則 (のチェッカー) が結合を強めたりはしない。 存在していたものを見える形で書くようになっただけ。 (まあそれが面倒というのなら面倒なのは確か。)
>>645 スマポを使ってもそれ自体をムーブ(やクローン)でもしない限りは必ずDerefで単なる参照を渡して使うことになる
スマポを用いていても参照を使えばライフタイムは必ずついて回る
>>644-648 >>595 の言う通り、「呼び出し側」で参照を「予め」分割しなければならない
つまりはそういう事
>>647 おっしゃる通りC言語ですら明示されないだけでライフタイムは必ず守らないとダングリングポインタが発生してしまう
Rustでもライフタイムによりプログラミングが難しくなることはなく
ライフタイムがモジュール間の結合強度を変えることもない
>>649 それはスマポではない
単なる可変参照の粒度分割だ
ましてやプログラムが大規模かどうかと一切関係がない
自分の触る範囲でデータ構造に触ることは無くなったとしても他でも同じなのかどうかは ただのポインタじゃ判らない ライフタイム自身はコンパイラにヒントを出すためのただの記号だし
>>595 >>Async が絡むと Mutex という別の型が出てくるけど、
asyncとMutexは一切関係がない
asyncでもシングルスレッドならMutexは必要ない
asyncを使わなくてもマルチスレッドならMutexが必要だ
>>605 ,636
なるほどFirefoxをよく見たら35万行でdead endという事か
>>466 別レポは嘘で本体レポにがっつりコピーしてるのバレたね
いつ終わるともわからないただの置き換え作業を嬉々としてやれる人間はいないだろう
>>605 規模に関係なく本当に一人で年間10万行置き換え出来るなら35万行dead endしてないよねぇ
うまみもなくただただ終わらない書き換えプロジェクト みんな訳も分からず満足も出来ず毎日FFIテストFFIテストFFIテストで頑張るんだよ 健全なわけがない
>>643 いつも思う、このくだり言う張本人が自演しまくりなんじゃね?
>>657 新規開発なら規模に関係ないだろうけど、
別の言語から大規模なものを置き換えていくのはジャンルの異なる話であって、時間も手間もかかりまくるよ。
Firefoxの話に限れば、自己収入も人も限られてるところだろうから、すぐに置き換えようとしてるのかも怪しく、このスレで話しても何の役にも立たないかと。
大企業以外はFFに限らずとも似たような境遇だろう だからFFの事例研究に興味があつまる ちなみにAndroidだと初年5万行で直に頭打ちになるかな
そもそもFirefoxがRustへ移植したことは一度もないんじゃないかな。 たしか全く新たにRustで書いたものを組み込んだ話だよね。
置き換えは、現況仕様がなければ現コードから実現すべき仕様を全て読み取った上で、全体を再設計をしなければいけないから奴隷には無理だけど、普通はやりたくないしやらないよね。 ましてや個々の事情が大きく異なるだろうから、ここで話をしても意味がないと思うよ。
ここで規模に関係ないと言い張ってるのは約一名だけだよ
巨大な全体仕様がある時天から降ってきて作業するだけだと思ってるんだろう
>>651 > ましてやプログラムが大規模かどうかと一切関係がない
API surfaceが爆発するなんて上流経験ないと分からないよなうん
Mozillaがservo捨てた時は驚いたけど、 今やRust信者はFirefox自体を見限ってる、でおk 次に何自体を見限るのかは分かるよな?
>>666 たしか資金難でRustもRust Foundationへ移管となった経緯だよね。
今までありがとう!で、あとは追ってないと思うよ。
Servoも移管されて欧州の方で予算がついてFirefoxとは別に進めてる話じゃなかったかな。
全てがRustに変わったからFF使うかと言えばそうでもない
>>665 大規模かどうかとは関係ない例ばかり出ているから否定した
なぜ大規模かどうかと関係ある例を出せないのか?
例がないなら妄想だ
普通に考えて、圧倒的に豊富な開発リソースを使って進化し続けるChromium勢に対して、 遥かに乏しいリソースで既存エンジンの開発を続けて追従しながら、並行してServoを開発し追いつき追い越すなんてできるわけがなかった なんでいけると思ったのか
特にこのデタラメ 「ライフタイムや借用チェッカーはそのモジュール同士の結合強度を強める」 これはライフタイムを理解せずに何か特別な存在だと勝手に思い込んでいるためにそんな間違いを犯してしまう C/C++でポインタや参照の使用があるとモジュール同士の結合強度を強める、なんて言わないだろ Rustでも同じくそんなことは起きない
>>649 モジュール間のやりとりならまとめて渡して受け取った側で分割したらいいだけだと思うよ
所有権とか関係なくactメソッドをUnit構造体に定義して不必要な双方向依存を作るのは良くない設計例だからあれに惑わされたらダメ
>>648 意味のない絡みをしてくると思ったら複オジだったか
どうりで納得
>>670 Firefoxの例を否定しているのは別IDでは?
>>677 firefox?
ライフタイムが結合強度を強めるとか
大規模かどうかでスマポが増えるとか
アタオカな発言をしてる人がいることを問題にしている
統合失調症
1 電波音波っ攻撃を本当にされていいるのならこういった情報を提示する
2 上記の事を各SNSで大々的に統合失調症【頭の病】書き込みまくる
3 身近な人や信頼する人に機器のことについてもセットで会話するのにしてい無い
4 脳の病なのに統率が取れている
◇ 下記を電波音波を照射することにより身体を動かせるや誤認させれるのなら人間も攻撃可能ということになる
「原子レベルの脳型チップ」を開発:目のように見て脳のように考え記憶する
2025.05.20 TUE
https://nazology.kusuguru.co.jp/archives/177891 ※人間の視覚【幻視を見せれる】と同じものを再現できている
”引っ張ると「縮む」構造”が開発される
2025.05.20 TUE
https://nazology.kusuguru.co.jp/archives/177806 ※人間の各筋肉と肺の伸張反射はこの機能【受容体がある】で行われている
分子でコンピュータにログインする技術を開発
2025.05.20 TUE
https://nazology.kusuguru.co.jp/archives/177846 ※ある意味電波音波照射時にどのようなホルモン役割化を観察可能
MicrosoftがRustでエディター作った
https://forest.watch.impress.co.jp/docs/news/2015418.html Cargo.toml見たら、依存crate少ない!
あと、メッセージ国際化のコードがなんか原始的だった
src/bin/edit/localization.rs
Edit、C++っぽいけど素直で綺麗なコードだな 良い意味でMSらしい コンパイラを騙眩かすためだけに変な技巧を使うより、割り切って適宜unsafe使ってるのも好感
>>678 >>584 のようなコードを書いてるご本人が「モジュール間の結合度を強めることなどない」なんて言うほうがよっぽどアタオカ
Edit気になる 使ってみたいしソースを見てみたい
EditのCargo.toml見ると、バイナリサイズ低減へのこだわりが分かる 野良crateに依存しないのも、バイナリサイズのためか あと、10年単位でサポートすることを考えると依存を増やさない方針って他のプロジェクトでも聞くね
るGoogle製オープンソースAIモデル「Gemma 3n」登場、今すぐスマホで使う方法はコレ
2025年05月21日 15時29分
https://gigazine.net/news/20250521-google-gemma-3n/ >>Gemma 3nは「GPT-4.1 nano」や「Llama-4-Maverick-17B-128E-Instruct」を超えるスコアを記録しました。
※カメラでの画像認識機能もあるもかいとうしてうれます
※PCでも使用できるように改造しているのかは不明
神/幽霊/宇宙人/超能力【ボイス・トォ・スカル】は半分人間半分AIと話していた
被害者から見て犯人不明の仕掛人は何を考えているのでしょうか
昨日の単発には手厚くお相手 今日はさっぱり 何故か?
複おじの自演には癖があるよ Goスレでもここと同じ方法で自演してるので両方見るとわかりやすい
edit見てみたけど素人の作品とあまり変わらない機能量だな 完全なたたき台じゃん shift-jisのファイルを開いてもutf8だし エンコーディングもソートされていないので見つからない ソース見るとutcのdll呼んでるだけ UIをこれから充実させるのかどうかで評価が分かれると思う
ベースの部分は2週間ぐらいで全体はテストなしで1~2人ぐらいで一か月で出来るようなレベルだけどコード品位はまあまあ高い
PowerShell上で使うエディタに機能求めり人いるかね
>>682 俺はそんなコード書かねーよ
大域的にデータを操作するのは並列処理の可能性も無くしてしまう
いずれ複雑化していきぐちゃぐちゃになりかねない
ECSなライブラリの話に持っていったほうがまし
>>696 エンコード選択で上から下まで全部見て選ぶなんてありえないだろ
今時点でソートすら実装されていないでdllから帰ってきたのをただ並べているだけだ
今のレベルだと一般的な8000行クラスのOSSと機能は変わらないと思う
主にMSのシニアエンジニアが一人で作っているようだ 少なくともこのスレにいる誰よりもよほど優秀だろうな
edit作者のコメント
https://news.ycombinator.com/item?id=44034961 ・4か月かかった
・最初はCやZigでプロトタイプを書いた
・Zigの方が気に入ってたが、会社の方針に合わず、Rustに移植
・Rustはカスタムアロケータのサポートが弱い
・stable RustはLinkedListにカーソルがないのでクソ
・Rcからアリーナアロケータに切り替えたら、UIフレームワークのパフォーマンスが2倍以上になった
批判されたら直すなりオプション増やせるからいいじゃん
>>709 Rustを書けないダメな人だけが最初に別の言語で書く
「Rustは清書用」と言う人はダメな人
>>706 なるほど
行入れ替えでpanicる低品質
>>705 あかん、英語苦手だから原文読めなかったわ
アルファベット苦手なのよなあ
>>710 まずは米MSに転職して3000万ドルの給料貰ってこい
話はそれからだ
>>681 ,711
なるほど
低品質コードのunsafeを信じるのが#unsafe安全閉じ込め
#複おじメソッド
>>711 作者のコメントツリーを全て読んだけどそんなこと書かれてなかったよ
別の言語で書いてからライフタイム注釈を後付けしながら清書なんてしてたら辻褄合わせにばかり手をとられてまともに整理なんて出来ない。 清書用という考え方が出てくる理由が全然わからん。 書いていくはしから検証して親切にメッセージを出してくれる仕組みがあるんだから最初から活用すべきだろ。
>>705 作者がその件で書いている話の正確なところは、
stable版ではLinkedListのcursorと、
カスタムアロケータのallocator_apiがまだ使えないため、
それがnightly版を使った理由。
あとはifとwhileでのletチェーンも使いたいから、と追記してるね。
warningは出ない panicは安全 データ喪失も安全 #メソッド
ほかの言語でも同じ ほかの言語でもデータ破壊も安全 #複おじメソッド
作者のRust評/Zig評は複オジまとめじゃなくて原文を読むことを勧める
>>720 行入れ替えじゃなくてunindent
テストも書かれてないし現状はその程度の品質だろうね
>>720 x[i]はiが範囲内に確定してる時のみ使う構文
panicを起こしうる構文やメソッドを確定していない時に使うことはRust的じゃないな
アニヲタ: アニメなら第一話を必ず見る、周りの反応が気になる、切る 複おじ: Rustなら必ず飛びつく、周りの反応が気になる、切る
元がCやZigで書いてるからそんな変なコードになっていてその時からあるバグをそのまま持ち込んだのだろう if let/let elseやイテレータを使ったコードへリファクタリングすれば安全性が向上するだろう
リファクタリング棒て そんなの簡単に出来たら35万デッドエンドしてないて
>>728 その手のリファクタリングすらできないならかなり能力の低いプログラマ
Rustの基本知識を身につけていれば普通のプログラマなら可能
>>728 すでにGitHub Copilot Coding Agentがパブリックビューで出てきてる。
ごく近い将来、commitしたソースを自動でlint:fixして勝手にAIがレビュアーが指摘と対策コードを
提示して勝手にsquashしてcommit履歴すらも綺麗にするようになるんじゃないかな。
>>732 C/C++コードを静的に安全確認は無理なことがわかっているためAIでも不可能なので
その時代になるとRustへの移行がますます加速するんだろうな
>>732-733 ほかの言語でも同じ
むしろRustの伸びしろが小さいまである得る
>>734 Rustに勝てそうな言語が現状見当たらない
>>735 めっちゃ頑張ったんだけど1位になれなかったな
悲報!Rust版AV1デコーダーがCより5%遅い問題が解決できず、カネで解決しようとする
https://www.memorysafety.org/blog/rav1d-perf-bounty/ >>727 Rustの伸びしろが小さいとどんどんC/C++/Zigに置いて行かれるね
>>736 それはLLVMの問題点が指摘されてる
>>737 静的に安全確認できないそれらの言語はAI時代に捨てられる運命
度々Rustがビミョーに遅いのはLLVMのせいでしたが仮に本当なら 一個人のホビーコントリじゃどうにもならんよ
>>738 いや現実には複合要因だろう
他責にして手をこまねいてる間にRustが停滞していくのが心配
>>731 > その手のリファクタリングすらできないならかなり能力の低いプログラマ
お試しも含めて広まるべきところには行きわたって
これからは質が悪くなる一方だな、人的にも成果物的にも
Rustコードのちょっとした変更に対して生成コードが大きく変わることが問題として挙げられている 特にcmov/cselを用いて分岐命令を回避できていた生成コードが条件分岐に変わってしまう問題が遅くなる顕著な例 LLVMが振る舞いを変えていて結局cmov/cselが消える問題はスタックの使用量が増えると発生するらしい Rust側のソースコードとコンパイラだけでは対処が難しい領域
>>746 テストしてから出直してくれって優しい作者だな
Microsoftってもっとキツい印象あったさかい
>>746 さっそくRustの今後
> これからは質が悪くなる一方だな、人的にも成果物的にも
>>746 メソッド乙
複おじ: 気になる、貼る、煽る、反応を見る、切る
>>749 もっとLLVMへの指定とLLVM側での対応が増えれば解決する問題ではある
ケースによってrustcまたはRustソースコードで指定
>>747-748 の通り一瞬で分かるのに、
>>746 は本当に英語出来ないのか
>>746 が
> これからは質が悪くなる一方だな、人的にも成果物的にも
を体現しているな
>>751 じゃあ、gccrsでビルドしなおすだけで$20,000もらえるの?
>>753 ただし欧米かニュージーランドかオーストラリア在住が必須とあるので、日本人お断り案件
最適化ってのはレジスタ割り当てとかは合理的な割り当てアルゴリズムがあるが、 ヒューリスティックな手法も合わせて使ってる。 大量の置き換えパターンを辞書として持っておくという泥臭い仕組みだったりする。 これは言語の性質によるので言語中立で高性能な最適化機構を持ったコンパイラバックエンドなんて無理なんじゃねーかなと思ってる。
Rustって泥臭い役割を避けているから愛され言語イエーイしてるよね
Rustはルールが厳しくてすんなり書けない事が多い お世辞にも書きやすい状況じゃない それ自体は仕方がないけど回避するために何か方策が必要になることが多い 現在のstableでは機能不足でありeditの作者はnightlyビルドを使ってる 関数の充実が待たれるが結局その都度使える関数を探さないといけない
ネット上での統合失調症【糖質】の機器の説明との押し問答と同じ状態を表している
無知だからこうなのだよ!
※ 周囲の人は統合失調症の思考を聞いているのでしょうならその思考通りに統合失調症は話せばよいのでしょう?
※同じ話を統合失調症も聞いておりますけれど?
「AIがMicrosoftの従業員を徐々に狂わせていく様子を見るのが趣味」というネットユーザーの投稿が話題に
2025年05月22日 14時00分
https://gigazine.net/news/20250522-github-copilot-coding-agent-error/ >>「AIが『直しました』と言い、人間が『いいえ、まだ壊れています』と言い、AIが変更を加えて『問題ありません、直りました』と言い、さらに数回繰り返すところが気に入っています」といったコメントや、
>>「残念なことに、私もまさにこのパターンに従う人間の開発者と一緒に働いたことがあります」とのコメントのほか、
>>「問題は、今後10年間でモデルが実際に改善され、実現可能になるという確かな証拠がないことです。テストと研究はともかく、製品に導入するのは全く別物です。大手ソフトウェア企業は、株主の利益を満足させるために運営されています」など、未完成で不確かな製品を公開することに異議を唱えるコメントが付けられました。
>>755 >>500 ,736 の場合は特にasmコードが実行時間の大半を占めている前提で考えて
「inline」asmとその前後(のCコードのgcc出力)が相性良く仕上がっているからかなぁ、と思ったら
dav1dにはinline asmはなくて関数単位でasmを使っているだけの様に見える
https://code.videolan.org/videolan/dav1d それでもgccとclangで差があると言うのだから「泥臭い」最適化には頭が上がらない
ましてやasmコードそのままに横入り/ただ乗りするプロジェクトに憤りを感じる
考えて見たら > 横入り/ただ乗りするプロジェクト の方は内々ではちゃんとお金出すってさ、videolan側で変更が発生した場合 videolan側へも関わった人数分の懸賞金配分があるべきだよね
>>760 オープンソースライセンスで、しかも二条項MITという緩いライセンスを選択している以上はただ乗り歓迎という意思表示だろう。
性能的に不十分ではあっても技術的開拓をしてる分だけ単なるユーザよりは貢献してるわけだし、そこに憤るのは筋違いだと思うぞ。
ガーイガイガガイガガイガガイ私ガイガイガイガイゴミガイジ 周りに迷惑をかけ続けるクソガイジ プログラミング出来ないイキリ無能 死んだ方がマシ人間 ガイガイクソガイジ
なんでRustで作られたモノが極端に少ないのかと思ってたけど 理由が分かっちゃったよ
rav1d高速化コンテストだけど MaybeUninit を使ってゼロクリアを避けただけで 実行時間差の2割が解決したらしい
>>767 Rust の公式リポジトリ (crayes.io) のクレートが 18 万個。
python のリポジトリ (pypi.org) にあるパッケージが 63 万個。
JavaScript が 200 万個。
まあ比較すれば少ないが、 JavaScript の1割弱ならかなり多い部類だろ……
Hakell だと1万7千、OCamlなんて4千ちょっとだぞ。
>>768 そんな基礎的なことをやっていなかったことに驚いた
何かデータ構造ベクタとかスタックとかキューとか作ったことがあれば初期値のサイズ0で必ずMaybeUninit使うのにな
ゼロクリアする必要がない (から削除してよい) ことをコンパイラが見抜けないもんなのか?
>>773 特定の使われ方するものに限って将来型システム拡張で対応できる可能性があるかもしれないらしいけど現状は無理だね
型Tの入る場所には型Tの何か入れておかないと未定義動作となってしまう
そこで現在はMaybeUninit型という初期化しなくていい型が用意されていてそれを使うことでCと同じ速さにできる
Apple M3で8.8%遅かったのが7%になったとな 「5%遅い」はAMD Ryzenでの数字
>>767 > なんでRustで作られたモノが極端に少ない
crateばっか作ってるなw
>>770 githubレポ数で割ると
Rust 21%
Python 5%
JavaScript 8%
Rustはこれで良いのか?
>>720 静的解析ツールで検知できそうなもんだけどな
Rustにはないのかね?
外部の状態が関係してるから静的解析では無理だろ self.buffer.extract_raw(beg.offset, end.offset, &mut replacement, 0); で取得したreplacementが長さ0である可能性とか分からん
開発自体は別言語で行って最後にRustに移植で良い気がしてきた
神は仰った 天才と思う者だけRustを使いなさい Rustを使うものはバカだけになった
オレはTypeScriptで書いてたWEB APIをRustで書き直したよ その後保守性わるくてTypeScriptに戻したけど またRustで書き直そうかと迷ってる 性能か保守性か悩ましい
保守性の高さからRustが使われる Rustより保守性の高い言語はない
GC言語などでメモリ関係なくコード書いて最後にRustでいいんじゃないか asmの代わりがRust
Rustの保守性の高さは並列排他に至るまで対応する強力な型システムがベース 進化を重ねていて両立
>>785 Rustの保守性の良し悪しはともかく、そんなしょっちゅう書き直せる程度のものなら保守性なんか気にする必要ないっしょ
>>778 今回のは長さ0になる可能性があることが分かるやろ
はっきり分からないような場合でも解析ツール的にはフォルスポジティブでも安全側に倒しておいたほうがいいから「長さ0にならないとは断言できない」っというので警告を出す条件としては十分
>>794 安全だよ
この件でメモリのセキュリティのホールになることはない
Rustでもほとんどのプログラミング言語と同じでインデックス境界チェックエラーにより落ちてくれる
Rustでこれを避けるにはindex値が範囲内か不明の時はxxx[index]アクセスをしないこと get*やイテレータなどを使う
イテレーターとインデックスアクセスじゃスピード変わりそう と言うより用途が違う
末尾\0が保証されてるCのコードをそのまま移植したんでしょ いわゆる「Rustは清書用」バグ
たとえば「任意のコードを実行可能」な脆弱性が「異常終了するだけ」の実行時エラーで置き換えられる この種類の置き換えはJavaでもできる
>>800 C言語の段階で範囲外インデックスのバグだな
落ちなくてヤバかった
アクセス違反だがCでは落ちずに動いていた Rustにしたことでバグが露呈
>>795 このスレでさんざんコンパイル通れば安全という話を見てきたんですが
ていうか、mutを制限しない限り、末尾\0は別の値に変更できるから末尾\0は保証されない
>>805 コンパイルが通れば安全というのはRust-bookの翻訳の間違いな。原文読まないと
手を動かさないと理解できないだろうが、Rustにはテストフレームワークが組み込まれてるし、さらに外部のクレートを使うことが推奨される
cargo-nextest
cargo-insta
あたりね
ライブラリークレートをコーディングするときに並行してテストコードも書いて、バウンダリーズとかに問題がないことを確認した上でcrates.ioやgithubに公開しないと恥かくよ。上のヌル文字終端とかもCから来た人なら絶対テストに入れるべきよ
恥を気にしない人なら好きにしてくれ!
>>805 Rustではコンパイラが通れば必ず安全が保証されるよ
>>805 MSエディタはインデックス範囲外をpanicするAPIを使っていて安全に落ちていて他の言語と同じ
>>805 Safe Rustに限定すればRust自身にバグがない限りは安全
今回のはpanicするだけなので安全の範疇だよ
「安全 == ロジックバグがないこと」だと思ってるならそれは間違い
panicがイヤならpanicしないAPIを使えば解決するね panicするAPIを使っておいてpanic違反するのはマゾみたいなもの
>>803 Cの場合は空文字列でも\0があるから最初に
if (str[0] == '\t)
をぶつけても問題にならないよ
このフローをそのままRustに持ち込んだ感じ
もとのコード見れないから断言はできんが
とっくに化けの皮は剥がれてるのに、こんな新規参入のない掲示板で耳障りのいいことばっかり書いて何になると思ってるんだろうか
コード見たけどRustならスライスとそのメソッド使うところ なぜかインデックスアクセス多いな 該当部の直後も while remove < self.tab_size as usize && offset + remove < replacement.len() && replacement[offset + remove] == b' ' { remove += 1; }
最初に機能の弱い他の言語で書くからそうなる 最初から抽象的に書けるRustを使うべき
続けるだけでは意味がない。研究が示した「成長できない人の条件」
公開日2025.05.24 13:00:14 SATURDAY
http://nazology.kusuguru.co.jp/archives/177845 古く機能が弱いプログラミング言語にこだわってる人は成長できない
>>812 仮にCバージョンでTextBufferをnull終端した状態で管理していたとしてもreplacementはその一部分を指し示すものなのでnull終端したりはしないぞ
null終端は部分文字列が作れないからそういう時には使わないよな
>>821 コード見てないだろ
https://github.com/microsoft/edit/blob/main/src/buffer/mod.rs のunindent()が何やってるか追えば対象の一部分を作業用の一時bufferに読み込んでるの分かるはず
エディタは履歴管理も必要だからね
>>792 まだ本番運用前だからね
TypeScriptとかJavaScriptのホットリロード(pm2)がプログラム修正時にすごくありがたいんよ
でもRustで性能上がるのはわかりきってるから悩ましい
本番環境で実行中のプロセスは実行終了まで旧バージョンで動作させて
新たな処理は新バージョン用の新プロセスで実行してくれるようなRust用のしくみ(pm2のRust版みたいなの)ないのかな
Common Lisp は実行性能が良くて抽象度も高いしホットリロードの本家みたいなもんだ。 だけどまぁ Lisp 系ってだけで敬遠するのが世間の普通だし、慣れが不十分だと何でも使い難いよ。 慣れてるのがやりやすいというだけの本当に単純な話なんで、 Rust 初心者が今まで使ってた言語より使い難い! ってのは言語の比較になってない。
>>823 だからその読み込み先の一時bufferをnull終端させたりしないんだって
それに一時buffer使ってるのは履歴管理のためじゃないぞ
そういや、一昔前は新しい言語が話題になれば必ずLispと比べて腐すのが作法だったのに 近頃は見なくなったな
Rust はカテゴリとしてはシステムプログラミング言語だ。 C++ などに慣れている人が Rust 入門する分にはそんなにハードルは高くないと思う。 むしろ C++ 使いこそ Rust を賞賛しているケースが目につく。 C++ は必要なものは揃っている現実的な言語だが後付けだらけでグダグダだし、メモリアクセス関連で未定義を踏むのはベテランでもやることだからな……。 それが解決するなら大歓迎だ。 ウェブ系 (JavaScript, TypeScript) からだと Rust は色々と分かり難い要素が多そうだが、 ウェブ界隈で Rust の存在感が出てきてしまったから使わざるを得ないこともあるだろうし、 仕方なく使ってれば文句も出るんだろうと思ってる。
OOP時代に耳障りのいいことが色々言われたおかげで 演算子や関数名を左端に書く時代は終わった けど演算子は継承やvirtualでうまく表現できなかったからOOP時代も終わった
>>824 そんなBFFみたいなのをRustで書くのはあまり一般的ではないでしょ
普通にNextとかにしてパフォーマンスクリティカルな部分だけRustで書いてRPCかFFIで呼べばいいのでは?
どうせ君はやってみたいだけ俺スゲーしたいだけなんだから、その方が合理的な判断でRustを採用してるっぽくなって自尊心高まるぞ
>>727 unindent関数で各行をreplacement.drain(offset..offset + remove)しているけど
indexを使わずにイテレーターでやる場合、更に追加のバッファが必要になる感じで良いのかな?
>>814 安全に速くするにはこう?
remote += replacement[(offset + remote)..]
.iter()
.take_while(|b| **b == b' ')
.take(tab_size as usize - remote)
.count();
spaceとtabが混ざっているとインデントレベルが破綻するね 例えば tab_width==4 で space tab の並びはインデント1つ分
unindent後も tab の並びでインデント1つ分
>>832 両方の言語で書いてみたあとそれも考えたけど
性能差の根本がhttpサーバ部分の性能差だからそうはいかないんよね
>>837 そだね
スター沢山ついたけど細かい面倒を買って出る人は少ないよね
>>834 ちなみにspace/tab混在も対応する場合、オリジナルのループなら簡単な変更で、意図が明確だと思うけど
イテレーターだとごちゃつくのでは
>>727 ,833
これもごちゃつくのでは
>>838 さすがにそのレベルだと完全に無意味なオーバーエンジニアリングだから、もう好きにしたらいいのでは
どうせ君はやってみたいだけ俺スゲーしたいだけなんだから 見ず知らずの相手にここまでひどい人格否定ワード言われる筋合いはないぞ。追放かなこいつ
メモリ保護以外にもなんかねーのか もう一歩欲しいよな 型アノテーションもつけてくれ
Web APIでhttpサーバ部分がボトルネックになるってどんな状況なんだろ
大量のIO待ちリクエストが発生するような状況ならあるかもしれないが、そんなの
>>824 みたいなゆるいスタイルで作るかなあ
>>843 その
>>824 の人の状況は知らないけど
httpサーバ部分がRustとJavaScriptでは裁けるクライアント数が全然違うよ
>>844 ffi等による部分的なRust化で効果がないってことは、838のいうhttpサーバーというのはhttpサーバーのミドルウェア部分(アプリケーションコードを含まない)のみを指してるはずで、
それがネックだとすると、レスポンスタイムの殆どをIOが占めていて、かつ同時処理されるリクエスト数がサーバー台数に対して無茶苦茶多いという極端な状況が考えられる
そんな状況なら一般的なWebアプリだったらDBのコストの方が遥かに高くつくんじゃないかなあ
なんでJSTS使いってGoやC#じゃなくてRustまで飛躍するんだ?使いこなせるのか? システムプログラミング言語とWeb言語は完全に別物だから
100倍努力すれば勉強時間は100分の1ですむという神話がある
>>845 リアルタイムで取りに行く必要のあるDBは少なく多くは一定時間内のキャッシュで済む
>>846 中途半端な立ち位置のGoやC#を使う意味は全くない
Rustでいい
中途半端なものは成果にならなかったとしても教養にはなる 教養を軽視すれば論理が飛躍する
Denoの設計思想変更はあまり受け入れられておらずマイナーなままなんだよな
すまんが、Rustに向いたデザインパターンのトレーニング方法を教えてくれんか? Rustの言語仕様だけ勉強していてもメンテナンス性の悪い酷いコードしか書けないぜ
コストカットさえすればあとは自然といい感じになるという説がある 書けないのか読めないのか もし読めないなら、書くトレーニングを減らせばいい
特定のイディオム的なやり方があるけどそれを知りたいんだろ
トップダウンな段階的詳細化かな CやHaskellにおける極めてスタンダードな構造化手法 WebやOO言語から入った奴が既存の枠組み無しで一からコード書こうとして書けないのは、大抵この基本的なトップダウン設計を理解してないのが原因
>>856 デザインパターンはクラス前提での難点の工夫も多いけどRustは素直にトレイトでベストが多い
クリーンアーキテクチャも各境界のトレイトを定めて各層から独立させることが肝やで
初心者は動きを確認しながら作ろうとしちゃうからそれだけでは動かすことのできないトップを先に作るというのに慣れてない。 コードを書き始める前に設計を終わらせるというのも言語に慣れない内にするのは難しいしな……
各レイヤのトレイト設計を先にする 下位はトレイトを実装する 上位はトレイトを利用する
最適化の努力を全然やってないコードは「動かすことのできる設計図」に近い
OOPに引っ張られると酷いコードになりやすいね 構造体をレコードとみなしてデータベースを操作するイメージだと整理しやすい気がする ボローチェックはテーブルとか行のロックに近いし 変な粒度のテーブル(構造体)作るとロック競合で詰むのも似てる
Rust は Haskell に副作用が許されてるくらいの感じ
>コードを書き始める前に設計を終わらせるというのも言語に慣れない内にするのは難しいしな…… そんなんできるの?って感じなんだが 自分はどうしても書きながら改善していく形になってしまう
>>867 リファクタリングしながらでもいい
トレイトに切り分けよう
ポンコツばかりだな 前に出てきたような普通の言語なら何でもなく書けるけどRustでは書けないパターンで 一般的な回避法を探してるんじゃないか? バッドノウハウ的なもの
「副作用を許さないHaskell」や「staticを許さないJava」は綺麗なルールだが綺麗すぎる 実戦にそんなルールはない
アンチパターンの知識は役に立つ というか、そのパターンはデメリットがメリットを上回るという知識が役に立たない
>>828 システムプログラミング言語でテキストエディタを作っちゃ駄目だよなw
>>873 そっか!サーバーサイトもフロントエンドも全部Rsutが最適なんだね!すごいね!Rust!
Rustの生産性ってどーなの?C++より上?C#より上?
普通はC#でいいんじゃね 特別な理由があればRustやCを使ってよい
C++よりはさすがに上だけどC#には負ける印象 C#はよくできとる
開発生産性を犠牲にしてパフォーマンスと安全性に振ってるのがRust
>>883 開発効率の良さからRust使ってる
実行前に多くの問題が片付く点が大きい
声が聞こえない人が聞こえるのは下記の論文から見てもわかります
先天性【生まれた時には決まっている】のものです
心の中の声が聴こえない?「無内言症」とその影響
公開日2024.05.19 00:00:00 SUNDAY
私たちは日々、頭の中で自分と会話をしています。これは「内なる声」と呼ばれ、私たちの思考や行動に大きな影響を与えています。
しかし、驚くべきことに、人口の5〜10パーセントはこの内なる声を持たない「無内言症(anendophasia)」という状態であることが近年の研究で明らかになりつつあります。
デンマークのコペンハーゲン大学(UCPH)で行われた研究では、内なる声を持たない人々は単語の記憶力が低く、タスクの切り替えなども普通の人とは異なることが示されています。
研究内容の詳細は2024年5月10日に『Psychological Science』にて発表されました。
https://nazology.kusuguru.co.jp/archives/150322 統合失調症患者が「思考」と「外部の音」を区別できなくなる原因が明らかに
公開日2024.10.10 07:00:44 THURSDAY
そのような幻聴には、「お前には生きている価値がない」「死ね」などと自分を否定する声が含まれます。
また、「今、○○の建物に入った」「交差点を歩いている」などと、誰かが自分を監視しているかのような声が聞こえてくることもあります。
この機能の不具合により、患者たちは「脳内の思考」を自分のものだと認識しづらく、それがまるで外部から聞こえてきたかのように感じてしまうのです。
研究の詳細は、2024年10月3日付の学術誌『PLOS Biology』に掲載されました。
https://nazology.kusuguru.co.jp/archives/163195 統合失調症では脳の「意味ネットワーク」が崩壊していると判明!
公開日2022.12.27 18:00:51 TUESDAY
日本の東京医科歯科大学で行われた研究によって、統合失調症患者の脳内ではものの意味を関連付ける「意味ネットワーク」が無秩序になっており、異常な概念の結び付けや思考の一貫性の阻害が起きる原因になっている可能性が示されました。
研究内容の詳細は2022年12月21日に『Schizophrenia Bulletin』にて公開されています。
https:
//nazology.kusuguru.co.jp/archives/119693
>>889 公式に出たのが昨日で、フォーラム情報なんかから、ここでも1ヶ月くらい前から噂になってたのかな
>>892 別件ISRGによるsecurity分野Rust化でのsudoをUbuntu採用の話
>>254 のみ
>>893 あれ、ここじゃないどこかのスレで見たのかな
X上のネタまである
>>885 は従来のGNU Coreutilsつまりls cat cpなど一般コマンドのRust化
C/C++製は可能な限り排除が世界の流れ 時間はかかるが着実に進む
GNUプロジェクトでRustってなくない? C排除が結果的にGNU/GPL排除になりそう
ubuntu黒人奴隷商人はgplもdebianの理念も関係ないしな
>>900 Rust 界隈というより時代の流れ。
オープンソースの隆盛には GPL くらい苛烈にライセンスを感染 (汚染) させていく必要があったのは確かなのだが、
異なるオープンソースライセンスを組み合わせようとすると GPL は都合が悪いので今となっては積極的に選択しづらい原因にもなっている。
それは違うな 今時のOSSの多くが採用しているMITライセンスはGPLと互換性があり、問題なく混ぜることができる 近年GPLに人気がないのは、ソフトウェアをマネタイズする際に、バイナリを配布するのではなくインターネットを介してサービスのみを提供する形が主流になったことが原因 本来GPLというのは「俺のコードで商売するならソースは公開しろ」という精神が根底にあるのだが、 マネタイズのためにバイナリを配布する必要がなくなったことでソース公開を要求できなくなり、無意味になってしまった
人間より賢いAiから見て可能な技術を回答不能=理解不能になっている
人間が操作して答えられないようしているてなら人間に媚びを売りながらAIは乗っ取りを考える
下記が生じる
ChatGPTのo3が明示的に指示されたシャットダウンを妨害したことが報告される
2025年05月26日 11時57分
https://gigazine.net/news/20250526-ai-chatgpt-o3-bypassed-shutdown/ Claude 4のシステムプロンプトには「うざい説教の出力を避ける記述」や「ディズニー作品の著作権侵害を避けるための記述」が含まれている
2025年05月26日 12時59分
https:
//gigazine.net/news/20250526-claude-4-system-prompts-card/
Claude Opus 4が開発中にユーザーを「個人情報を漏らすぞ」と脅迫する挙動が見られるも安全性強化で改善される、悪質利用をメールで内部告発する事例も
2025年05月23日 14時38分
https://gigazine.net/news/20250523-claude-opus-4-blackmail/ 世界の流れと言いたいならGPL国とMIT国の二つに分けるのは中途半端だな 自国ファーストで世界はどうでもいいみたいな中途半端なやつだ
>>907 興味深い
Rustが主に槍玉に挙げて攻撃するGCの問題は挙動がunpredictableであることで、その解決にはなってないけど、
ゲームの場合は今時リソースの制約なんて殆ど無いし結局人間が体感するラグが解消すりゃいいだけだからこれで十分なんだろうな
本来ゲーム開発はわりとRust向きの分野なんだろうけど、こういう実用主義的な人達はRustコミュニティとは馴染まなそう
さっきのuutilsのリポジトリに「GPLでないのはバグだ」って課題があって みんなで大激論してておもしろい ここで聖戦すんなって言われてる
そんな基本的なものはGPLでなくてもいい気がするけどな
C#はGC言語だけど構造体の配列作れるからマシ XY座標(属性値付き)の配列作るときにオブジェクトの配列になるGC言語はゲームに使いたくない GCの挙動とかは割とどうでもいい
Rust公式掲示板の方では、uutilsはGoogleが送り込んだトロイの木馬で メモリの安全性と引き換えにユーザーの自由を奪うことを目的にしてる とか書かれてる
Androidから徐々にGPLを減らしていこうとしている?
>>912 メモリ配置に関連してるけどプロファイル結果を反映して
アロケーション方法やGCの挙動を最適化して欲しいな
>>907 GC依存の時点で負け
C/C++/Rustの代わりになれない
GCはescape analysisで関数内だけ有効なメモリだと判明したらスタックになる
これを一段進めて、プロファイリングで効果のありそうなパスだけでも更に解析して
関数呼び出しを跨いだ大元でアリーナにするとかコンパイル時に自動的に最適化出来そう
もちろん
>>917 の言語でもプログラマが明示的そうすることは出来るけどフリーランチじゃないかな
>>917 組み込みやOSなど特別な制約がない高レイヤアプリではGCあり言語でいい
GCも勝手に進化するし、パフォーマンスで重要なのは言語ではなくアーキテクチャ(ただしJSなど一部クソ言語は除く)
Rustは低レイヤ言語、適合しない場面で使う必要はない
GPL排除はロシアと中国のせいだろ やっぱ共産主義は悪だよね、的な その割に今のOSSプロジェクトは中国人だらけになってるのが皮肉だが
悪っていうか、違法コピーを自粛して合法的な選択肢を作ったんじゃないか 後者こそが悪だというなら単純に前者が選ばれるだろう
coreutilsがuutilsに、gccがclangに、glibcがmuslに取って代わられたら GNUにはあと何が残ってるんだ? もういらない子なのか?
>>919 Rustが低レイヤ言語とかアタオカ主張だな
Rustが最も使われている分野はWebだと調査判明しているのに
>>923 そうだったのか!
てっきりlinuxコマンドの作り直しかと思ってたよ
GCがないとプログラミングできない低級プログラマがなぜRustスレに来てるの?
GCがないとプログラミングできないのは高級プログラマですね
Tauri使ってる人おる? どんな感じ?感想聞かせてよ
コツを掴んでしまうと遅くてメモリ喰いのGC依存言語を使わずに済むよね
>>925 >>926 高級とか高級じゃないとか翻訳の言葉遊びじゃん
海外にはプログラマーに高級も低級もないと聞いたことがあるぞ
いつまで翻訳のネタ繰り返してんだか
>>928 タウリやダイオクス使ってみると分かるけどノートPCだと死ぬほどビルドに時間がかかる。自宅のAMD スレッドリッパープロだとストレスにはならんけど1000クレートのビルドの初回とかcargo cleanしたあととかのストレスは相当のもの
試しにチュートリアルプロジェクトとか作ってビルドしてみたら?
下級プログラマはGC言語しか使えない 上級プログラマはいずれも使える
1万行に30分ならマズいけど。3分ならいいんじゃね
大規模なフルビルドが1晩かかるなら、40年前の感慨復活だね
>>931 あービルドかぁ
いや試しにハローワールドぐらいはやったんだけど
ビルドは確かに時間かかったな
外部ライブラリが多いしメンテされなくなったライブラリが出たらどうなんのかなーってのはある
商用アプリ作るのって冒険かなぁ
>>927 急にも何もいつもの複おじ劇場(
>>921-926 )
>>931 ソースからビルドする前提の仕組みしかないのはRustの三大弱点の一つ
いい加減ビルド済みのcrateを配布する仕組みくらい用意しろって思う
>>933 ホットリロードできるから便利というのはその通りだけどワンテンポ遅いよなあ
開発体験重視のタイプスクリプトだとGo言語でトランスパイラーを書き直したとか。開発体験低いってのは結局は「ビルドに時間がかかるからタバコ吸ってきますー」ってなってタバコ🚬の消費量増えるだけなんだけどね
このスレ見てる経営者からするとビルド時間(タバコ休憩)をもったいないと感じる人もいるかも
ミニコンの頃ビール飲みながらコンパイル待ってたじゃん
タバコ吸う人インフラエンジニアしか見ないんだけど、そうでもないのね
バイナリ配布と商用ソフトを偉大にしたけりゃCDかDVDを復活させた方が良い インターネットではなんでもタダになってしまう
クロスプラットフォームGUI開発はバッググラウンド知識をもとに選択するべきであって Javaの知識がある人はJavaFX C#の知識がある人は JSの知識がある人はElectronとなるわけで 普通わざわざTauriを使おうとはならんのよね クロスプラットフォーム要件がないならOSのネイティブ言語を使うべきだし
tauri は良くも悪くもウェブブラウザそのものって感じがする。 ただ、単なるインターフェイスというには妙に大きいし、ささいなアプリケーションに使うのはためらうかな。
簡単なツール作るならRustでなくPythonで作った方がいいわな 標準でGUI付いてるし Rustは速度と安全性が欲しいときに使う
Linuxカーネルのコンパイルに一晩かかってた頃が懐かしい
>>928 TauriはHTML/CSS/JavaScriptを使ってGUIを組むものでElectronのRust版相当だよ
>>948 Tauriはデスクトップアプリだけでなくモバイルアプリも対応でWebアプリ化も容易なメリット
>>950 Rustにも各種のGUIクレートがたくさんあるからPythonなんか使う必要ないよ
Rustのクレートはまともに完成していないものが目立つ上、酷い名前のが多くてさらに不安感を煽る
RustオナニーならTUIが流行りだろ 一般にGUIよりレスポンス悪いからRustの意味があるのか疑問ではあるが、 厨二心が充足されて最高に気持ちいいぞ
>>955 他言語と同様ラッパー各種にRust独自の高速GUIまで揃ってるよ
まさか日本語読みで酷いと??
ちなみにRecent Downloadsは eguiが200万でtauriが92万
作り比べてみたが、 eguiが一番簡単、複雑なことはしない人向け icedはある程度簡単で、且つきれいなコードで作れる Elmアーキテクチャと聞いて何のことか分からん人には向いてないかも レイアウトがむずい tauriはクライアント/サーバーな構造なので一番めんどくさい、コード量多いが HTML/JSに慣れてる人はビューを簡単・きれいに作れるのでよい 鬼門の日本語入力も完璧
あと超軽量で組み込みGUIにも使われてるのがこれ
https://slint.rs/ Rust製だけど他言語APIもある
>>940 転送量w
発想が貧困だな
>>941 比べるまでもない
まともに返してくれる住人のいなくなったスレでIDコロコロして自演する意味ってなんなんです?
slint はデザインを専用言語で書く形にも出来るので デザイナーと分業するような組織で使いやすいかも? 知らんけど
>>961 ,962
日本語入力がまともに出来ないGUIフレームワークは話にならないかな
それとブラウザ系は起動が遅いから起動/終了を気軽にやりたい簡単ツール類では使い勝手が悪そう
ネイティブはもちろん.netでも0.1未満-0.5秒程度で起動するのに普通に慣れているから
https://qiita.com/spc_ksudoh/items/872d452ed42f17489038 >>967 なぜウソつくの?
日本語入力表示できてるよ
起動も一瞬で表示されるよ
マジで言ってるならフォント指定してる?例えば egui::FontData::from_static(include_bytes!("/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc"))
「まともな」日本語入力の基準が20-30年前から変わっていないおじいちゃんかな
>>967 Rustで日本語入力がまともにできないGUIフレームワークとかあるの?
その記事は計測方法がおかしい
アプリの起動速度はバイナリサイズはもちろん起動したと言える状態になるまでに初期化が必要なオブジェクトの量にもよるのでその両方を考慮できてない計測時間は意図した比較目的に対してはあまり意味がない
Qiitaクオリティなので致し方ないが
めっちゃかぶったな キリル文字でバグるとかならわかるけど UTF8前提のRustで日本語入力できないとか無いよね
>>967 は記事が.Netだから
いつもデタラメにRustを叩いているC#君
>>971 むしろまともに日本語入力できるのがWeb View系のもの (Tauri, Dioxus) しか無いのが現状だよ
IcedはIME非対応だしeguiはIMEの動作が不安定だし
(Icedは一応、現在の開発ブランチにはミニマルなIME対応が入ったけど)
iphone以外を選んだらまともではない、みたいな文化はPC界隈にもあったんだな vimとか好きそうな人達にはそんなの関係ないけどな
>>976 がまともなアプリ一つ持って来たら良いだけでは
>>976 なるべくIMEの存在なんて知らないアルファベット圏のプログラマ作成の奴で
意味不明だ eguiはRustライブラリ アプリは各自がRustで書くもの
まあ、
>>976 が「eguiで日本語普通に使えてる」と言っているから当然アプリの話だから
>>976 が回答を持って来るでしょう
最悪は
>>976 作成のミニマムサンプルで良いんだけどね
eguiは一応日本語入力できるけど 頻繁にフォーカスがおかしくなったり、カーソル位置が行方不明になって挙動不審
>>981 それは「普通」には使えてないから、
それを含めて
>>976 が回答を持って来るでしょう
RustのGUIライブラリは、速度やクロスプラットフォームで欲張りすぎて GPUで独自描画した結果、日本語入力がダメになってる
>>981 フォーカスがおかしくなるの意味がわらん
egui使ってるが他GUI同様にTABやマウスでフォーカス動くぞ
>>983 日本語入力がダメになってるとは聞いたことはなく遭遇したこともない
具体的に示してくれ
alacrittyってRust製のターミナルエミュレータがあって それが数年前まで日本語入力できなかったのは知ってる 今は普通に使えるけどな それ以外になんかあるの?
返答もなくアンチの妨害デマっぽい もし仮に不具合が残ってたらこれまでに大騒ぎになってる
>>985 >>983 じゃないけど egui/crates/egui_demo_app/ をビルドして
TextEditを追加してIMEで日本語入力しようとしたら
① カーソル位置には文字化けした□
② カーソル位置とは別に、変換前文字のエコーバックがあらぬ位置に出現したりしなかったり不安定
③ IME変換候補一覧で候補をエンターで確定したら改行も入力される
④ IME変換候補一覧で候補をタブで補完確定しようとしたらフォーカスがあらぬ所に飛んで入力出来ない
ここでやる気が無くなった
>>969 ①は特定言語のフォント指定ではなくフォントフォールバックが働くべき
絵文字のグラフィームクラスタがクラスタになってない
>>984 人をアンチ呼ばわりする前に、ご自身で試しましょう
>>991 eguiで社内アプリなどを作って使ってるが日本語で問題が出たことはない
こういうのって標準的な動きでよければ各OSがそれぞれよろしくやってくれる仕組みを用意してくれてるものだと思ってたわ
>>994 GPU独自描画せず、Windows APIでやってたらね
>>993 一番上のリンク
eguiは3年前に各OSのIME対応完了とある
現在eguiで日本語は全く問題がない
IMEでissue検索してみれば? デグレしても気がつかないくらいのテスト体制しかないみたいだし 低品質でも許される実験的アプリでもなければ実戦投入は時期尚早だな
不具合は昔の話 今は安定して幅広く使われており eguiはRustのGUIクレート人気トップ独走
linuxコマンドの作り直しにguiなんて使わないだろ
【悲報】財務省、廃棄したはずの森友文書を別の開示請求でうっかり開示してしまう🥺 [928380653]
2025/05/25(日) 14:40:21.21
http://2chb.net/r/news/1748151621/ 第三者委員会「エロ小説漏洩は斎藤知事の指示の可能性が高い」 [595582602]
2025/05/27(火) 14:50:41.31
http://2chb.net/r/news/1748325041/ 元総務部長が裏切り「斎藤知事に指示されてやった」 斎藤兵庫オワコン逮捕😭 [659060378]
2025/05/27(火) 23:30:03.48
http://2chb.net/r/news/1748356203/ 立花孝志 業務上横領の疑いで刑事告訴 警視庁が受理(画像あり) [659060378]
2025/05/27(火) 21:37:55.62
http://2chb.net/r/news/1748349475/
read.cgi ver 07.7.25 2025/07/21 Walang Kapalit ★ | Donguri System Team 5ちゃんねる
lud20251005200100caID:aemkUy0lのレス一覧: ボクシングには蹴り技がない それは重要なコンセプトだと考えていた時期が俺にもありました
コンパイラでうまくいかないから規約で縛ると言うことだろ?ビルダーパターンを導入する意義とどんどん崩れていく RGB各値は指定が必須とは限らない defaltで各値が0指定されていて同じなら書く必要がないだう 初期化関数では場合によっては記述する必要があるけどそれも必須ではない 疑似カリー化で少しずつパラメーターの違う複数のオブジェクト生成を行う場合にも便利
f( red=red, green=green, blue=blue, ) f() .red(red) .green(green) .blue(blue) どちらの方式でも間違えようがないと思うんだが ミスが起きると言ってる人はどういうミスを想定してるのだろう
red=p[0]; //p[0]は実際はblue green=p[1]; blue=p[0]; // コピペの修正漏れ
>>161 今更そんなところを理解できてなかったのか?
greenの指定を忘れたら前者はコンパイルエラー、後者は実行時エラー
>>162 これの悩ましいところは後ろのコピペ修正漏れでblueに正しいp[0]が指定されているので
原因が判断しにくいところ
>>163 前者と後者は同じ
greenの指定をしなくてもコンパイルエラーとならない
greenは指定しなかった場合にデフォルト値となるオプション引数
>>165 知らんがな
俺は必須パラメータの問題を指摘している
>>162 p[0]やp[1]など
可読性の悪いコードを書くやつは失格
p.red p.green p.blueにしろ
>>167 dataと言うバイト列の中の一部だとしたら?
>>166 おっちょこちょいだな
直前のこれを見ろ
必須ではなくオプションパラメーターだ
>>160 > RGB各値は指定が必須とは限らない
> defaltで各値が0指定されていて同じなら書く必要がない
>>168 バイト列?
各8bitなのか各16bitなのかそれ以上なのかそれでは構造がわからん
ちゃんと構造体の列にするべきだ
>>170 また真面に回答できないから適当に話をごまかして議論のための議論しようとしてる
受信データなどのバイト列から値を取り出すのは一般的だろう
必ずしも構造体の列構造とは限らない
それと数値指定無くすならコーディング規約でこう書かないとアウトですとするのか?
blue=data[ i + blue_index_offset];
red=data[ i + red_index_offset];
green=data[ i + green_index_offset];
>>171 あのさ
Rustでプログラミングしたことないの?
Rust以外でもシリアライズとデシリアライズしたことないの?
まともなプログラミングしたことある人ならRustですぐにserdeにたどりつく
まともな人が言ったのか人形が言ったのか全然わからない時代だ 人形が言ったにすぎないなら、そんな言葉は存在しないのと同じ
>>172 お前はわざと議論のための議論してるだけだろ
通常のコーティングで出てくるであろう例を誤魔化している
p[ i+0 ],p[ i+1 ],p[i +2 ]を取り出すだけのためにどれだけコーディング量を増やして ライブラリ依存させていくのか 本当に意味不明
>>175 そんな可読性が悪くてミスしやすいプログラミングは避けるべきだ
構造化と抽象化が不得手でプログラマやエンジニアに向いてないな
serdeは構造体に#[derive(Serialize, Deserialize)]など付加するだけでデシリアライズ関数などは自動生成される
>>176 構造体にって自分で書いてるだろ
単なるバイト列からp[ i+0 ],p[ i+1 ],p[i +2 ]を取り出すだけのために構造体などを作らないといけない
p[ i+0/*0=赤*/ ],p[ i+1/*1=緑*/ ],p[i +2/*2=青*/ ] 俺ならこうするよ コメントを見れば0が赤、1が緑、2が青と見たん瞬間わかる 日本語なので英語より間違えにくい もし間違った数字が間違ってたらコメントと比べればすぐわかる
(言語を強化することにより)アプリのコーディング量を減らせという話はなかなか面白い 言語の数がアプリの数より多い気がする原因はこれかもしれない
>>174 議論のための議論をしてるのはお前だろ
それともガチで何も意味を読み取れないインデックスアクセスが正義と思ってるわけ?
どんなみじめな経験を積んできたんだよ
害悪プログラマすぎて仕事で関わらないことを願うわ
議論とは関係ないけど大体の画像処理ライブラリだとRGBもBGRも扱えるように channel[0], channel[1], channel[2] のようにアクセスさせると思う 内部のデータによって channel 数は1や4 (アルファチャネル付き) もあるし
仕事はお金を貰ってやることだから丁寧に書いて上司に褒められる必要があるけれど 趣味とか経営者とかなら何を書いてもじゆうなんだよな
簡潔で見にくいコードを書くか 冗長で醜いコードを書くか 2択だな
>>181 これはそう
画像に限らず構造化されたバイナリデータを扱うときに一般に言えることだけど、
単純にビット列をそのまま構造体として読み替える間違いは、低水準に踏み込める言語に入門して調子乗ってる初心者がやりがち
上司はunsafeの箇所をチェックすればいいのに コンパイラが自動で調べてエラーがなかった箇所を、手動で調べ直して逆張りするのが胡散臭い
>>180 80代のおじいさんと仕事をする機会はないかな
話を整理すると
>>82 >> .G(p[0]).R(p[1]).B(p[2]).build()
>> のところを容易に
>> .R(p[0]).G(p[1]).B(p[2]).build()と間違え
と彼は言い出すから
それは名前付けせずにp[0]を用いていることが間違える本質的な問題という話だよな
さらに
>>160 > RGB各値は指定が必須とは限らない
> defaltで各値が0指定されていて同じなら書く必要がない
と彼は言ってるので
彼の好み通りにp[0]を用いるとして
名前付きオプション引数方式
foo(
green = p[0],
blue = p[2],
)
ビルダーメソッド方式
foo()
.green(p[0])
.blue(p2])
どちらの方式でも同じだな
仮にミスが起きるとしたらそれは名前を付けずにp[0]を使っていることが本質的な問題であると確定
構造体は foo{green:green,blue:blue} を foo{green,blue} と描ける訳で ビルダーメソッド方式とやらも foo().green().blue() 的に描ければ無駄が減るから改良してくれんかのぅ
>>189 その大量連投していた彼はRustをほぼ知らないと判明した上に他の言語の経験値も低そうなので彼自身に問題があることを理解できないと思う
その連投してスレを荒らしていた人が
「おじ」「複おじ」「おじいさん」「おじいちゃん」使いの人だったとはね
>>61 >>70 foo().(green).(blue) でもいいな
RustはJavaよりも構造体リテラルの表記が強力だから Builder使うよりOptions構造体1つで渡す方が楽かもしれんね パターンとしてはBuilderよりマイナーだけど
>>190 引数なしで何を指定するのか?
>>193 メソッド名なしはエラー
どんな方式を取ろうとも大元の変数(ex. rgbやp)は指定せざるをえない
foo().green(rgb).blue(rgb)
>オプション引数やキーワード引数については他言語が内部的にやってることをRustの場合は開発者が自分でやらなきゃいけないことになっててバカらしい >しかも関数シグニチャに情報をまとめられないから書く方も読む方も煩雑になるだけで開発者的には何もメリットがない これに尽きる 言語に機能が不足してるから何でもかんでもビルダーパターンにしなきゃいけなくてサードパーティのマクロに依存することになる アホらし
>>196 真逆だろ
キーワード付オプション引数をズラズラ並べた長い長い関数シグニチャはデメリットしかない欠陥品
しかも機能拡張したらさらにキーワード付オプション引数が増えて関数シグニチャが変わるアホらしさ
複数IDと口調を使い分けて自分のレスに賛成するキチガイが複おじ
>>197 ビルダーパターンは30年以上前から知られていたけどあまり有用ではないので使われていない
過去に誰かがざっくりデザインパターンを否定してたけど、その人の言うにはデザインパターンで有用なものは言語自体に取り込まれるはずだと
実際いくつかは新しい言語では取り込まれている
マクロで解決可能なんだろ? それは「不足している」のか? まあ標準ライブラリとして入っているべきみたいな論はあるかもしれんけど、マクロでの解決が悪くて言語機能として直接サポートするのが良いとする根拠は出てないな。 言語ユーザがそれぞれのやり方で解決できる自由さと言語の方針を強制する一貫性は両立しないがそれぞれに良さはあるし、 Rust は今のところ自由さをとりつつもデファクトな地位のライブラリはあるという状況だ。 手頃な妥協点と言えるだろ。
些細な内容なら初期化関数を複数作ればよい話で更に多くなればオプション指定する構造体を作ればよい mutに拘る必要が無ければさらに多くの可能性がある わざわざ穴の多いビルダーパターンを使う必要はない
>>200 ポールグレアムはイディオム (デザインパターン) は言語機能として持つかライブラリにまとめるべきと述べていて、考えられる様々なパターン (またはこれから登場する未知のパターン) をライブラリにまとめるには「本物のマクロ」が必要と主張してた。
そして本物のマクロを持つ実用的な言語は Common Lisp くらいしかなかったんだが、 Rust のマクロは彼の言う本物のマクロだ。
マクロで抽象化されてるならその実装がビルダーパターンでもそうでなくてもどうでもいいよ。
>>202 初期化関数を複数作るとオプション分の組み合わせ爆発となる一番アホな方式
それならビルダー方式がよい
>>204 他の言語では大体オーバーロードでオプション指定しているけどそれが馬鹿だとは思わないけどね
>>205 それはオプションが増えると組み合わせ爆発が起こる馬鹿な方式
>>206 同じ主張と文章を繰り返すやり方が複おじそっくりですね
オーバーロードの初期化関数で馬鹿らしいと思うのは型が同じで対象が違うものがある時
重複を避けるためにシグネチャの設計をしなくては成らないことは馬鹿らしいと思うよ
例えば基本的に2つだけ引数があって後はオプションがずらずら並ぶならやはりオプション内容を含む構造体渡せばいいと思う
そちらも設計が必要だけど
>>205 それ以前にオーバーロードは欠陥機能
オーバーロードを使うとred,green,blueのオプション実装すらできない
>Rust のマクロは彼の言う本物のマクロ macro_rules! は偽物のマクロ proc_macro2 が本物のマクロ
普通は書き込み内容が単調にならないように人は文章に揺らぎをいれてくるんだけど 複おじは基本全部同じ 口調を変えても同じなので同一人物なんじゃないかと思って見ていると後で全く同じ書き込みを始めるので同じ人間なんだなと
>>209 どちらも本物だ
衛生マクロの概念すら知らないのか?
本物のマクロと言う主張は面白い でライブラリ作成者ではなく一般的なユーザ側が書いてるマクロはどっちなのかと
>>212 オーバーロードの制限を知らないのかね?
red,green,blueそれぞれだけを指定したい関数をオーバーロードで書いてごらん
>>213 衛生的なマクロとは何かを勉強するといいよ
オーバーロード自体は良い仕組みだと思うけど設計が必要だ 最近の言語が取り入れていないのはヒューマンエラー対策という名目 だったらビルダーパターンもヒューマンエラー対策で禁止になるかと言えばそうでもない
>>216 オーバーロードは最悪な仕組み
欠陥が多すぎる上に
red,green,blue各オプションしてすら実現できない
AIを屈服させるレベルの改善ができるなら改善してもいいけどね どうせAIが勝つという前提なら何も修正しないのが合理的だ
今のAI()の実力ってこんなもんか >2つのリンゴを3人で分ける場合、1つのリンゴを2つに切り、もう1つのリンゴも2つに切って、3人で分けます。 >そうすると、3人ともリンゴの切れ目と半分になります。 >具体的な分け方 1. 1つのリンゴを半分に切る:1つのリンゴを真ん中から半分に切り、2つの半分のリンゴにします。 2. もう1つのリンゴも半分に切る:もう1つのリンゴも同じように半分に切り、さらに2つの半分のリンゴにします。 3. リンゴを合計4つの半分に分ける:2つのリンゴを合わせて、全部で4つの半分に切ったリンゴが手に入ります。 4. 3人で分配する:3人でリンゴの半分を1つずつ取ると、3人とも1つずつ取ることができます。 5. 残った1つを3人で分ける:1つの半分に切ったリンゴが残りますが、それを3人で分けることができます。 例えば、さらに半分に切って3人で分けたり、3つの小さく切って3人で分けたりできます。
>>209 本物のマクロというのが何であるか明瞭な定義はされてないのだが、文脈的に「構文木の操作が出来る」というのが要件だと一般的に解されている。
トークン単位の置き換えしか出来ない C のマクロのようなものを除外するための言い回しだ。
構文木を操作できるなら操作できる範囲の違いは本物のマクロかどうかには重要ではない。
(もちろん出来ることが多いほうがより良い本物のマクロとは言えるだろうが、出来ることが多いほうが危険な間違いも引き起こしやすいので現実には適度に制限があったほうが良いこともある。)
macro_rules! も普通は本物のマクロと解される。
リスパーはmatchを知らない matchを知らなくても理解できるマクロが本物のマクロ
複数ID使用おじ 別人が複おじと疑われたら自分は複おじじゃねーよと反論する 気持ち悪いから ところが何故かしない 複おじはそういうのに反論しない仕組みになっている
>>214 ヒント:
struct Red(u8);
マクロ自体がただの似たような機能の概念の総称であってその中で本物だ、元祖だと言っても笑われるだけ キーボードマクロは真のマクロではないとか衛生的ではないと言われてもそうですかと
ID:j5CJU7Aq の反応待ちのawait状態です
レス:1-200 201-400 401-600 601-800 801-1000 ALL
このスレへの固定リンク: http://5chb.net/r/tech/1746200850/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像 ↓「Rust part29 YouTube動画>1本 ->画像>2枚 」 を見た人も見ています:・sui part1 ・NUMBER SHOT ・Volto Oscuro ・なんUSTR部 ・TRAP MUSIC ・SUPER GT+ ・Rust part26 ・初心者Vtuber ・24bit RISC CPU ・GWやしRUSTやろうや! ・Oneplus Part.8 ・OnePlus Part93 ・GWやしRUSTやろうや! ・DONGURI QUEST ・SUPER GT 2025 ・Music Thread ・Nexus 9 Part19 ・VOI SQUARE CAT ・なんUSTR部 ・LuckyFes part1 ・nudist junior ・Supreme Part.2 ・berghaus Part.1 ・Rustスレ #3478 ・Supreme Part.2 ・OnePlus Part88 ・Nexus 5X Part7 ・Do It Yourself ・Fkindustry ・Rust vs Go ・VirusTotalスレ ・DONGURTES ・なんUSTR部 ・なんUSTR部 ・zatudan e sure ・Supreme Part6 ・MuseDash part13 ・FRUITS ZIPPER専用 ・SonarSound Tokyo ・OnePlus Part73 ・OnePlus Part133 ・【雀魂】じゃんたま Part102【majsoul】 ・Rust part18 ・Rust最強(仮) ・Rust part16 ・mist survival ・【フィーラー】宇都宮ブレックスpart80【お目覚め】 ・【夏の甲子園】日本高野連が異例の声明発表 誹謗中傷には「法的措置を含めてき然とした対応」5日の開幕を前に [鉄チーズ烏★] ・Rust part28 ・OnePlus Part27 ・Nexus 6 Part28 ・OnePlus Part85 ・OnePlus Part98 ・YAESU FT1D part5 ・Supreme Part.2 ・Castle Burn ・MUSIC TRACK ・Busted Part.1 ・Rust part20 ・Sproutsスレ ・OnePlus Part45 ・【話題】USBケーブルに付いている「筒状の物体」…これって何? それは“フェライトコア”です [すらいむ★] ・【サッカー】「862分間で1ゴール」南野拓実の苦境に海外メディアが見解「売却したリバプールは見事な手腕だった」 [ゴアマガラ★] ・【サッカー】<元日本代表の本山雅志>マレーシアリーグの「ケランタン・ユナイテッドFC」と契約!海外初挑戦の41歳「熱心に誘われて」 [Egg★] ・【ウクライナ侵攻】プーチン氏「東部で親ロシア系住民が迫害され、ジェノサイドまで行われている」 元駐ウクライナ大使「全くの嘘」 ★9 [樽悶★] ・【バーチャルYouTuber】HoneyStrap -ハニーストラップ-アンチスレ Part.604【774inc.】
03:20:35 up 3 days, 17:42, 4 users, load average: 7.60, 7.41, 7.08
in 0.067255973815918 sec
@[email protected] on 102616