Rust part11

■ このスレッドは過去ログ倉庫に格納されています
2021/06/17(木) 00:24:12.56ID:NvYoNP9C
公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust

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

日本語の情報
https://rust-jp.rs/

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

※C++との比較は専用スレへ
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/

前スレ
Rust part10
https://mevius.5ch.net/test/read.cgi/tech/1617367084/
2021/07/12(月) 19:46:32.99ID:NCQjfvng
>>292
https://developer.mozilla.org/ja/docs/Web/API/Element/compositionstart_event
はい次
2021/07/12(月) 20:38:52.08ID:hS+nIw/n
>>291
いいね!
取得した文字列をOsStringに変換しなくても
なぜかファイルパスとして正常に動作するし(UTF16じゃなくていいのか……)
encoding_rs標準になればいいのに
2021/07/12(月) 22:26:31.98ID:+ke1h7j2
encoding_rsが標準になって欲しい(stdに入って欲しい?)のはなぜ?
2021/07/12(月) 22:49:13.65ID:hS+nIw/n
>>295
・基本機能だから
・ロジックを標準化するため
・Cargo.tomlのdependancyに記述するのが面倒だから
特にバージョン指定
2021/07/13(火) 00:30:07.97ID:n/daahFD
>>296
stdに取り込む提案のRFC書いてみたら?
2021/07/13(火) 03:10:04.82ID:EtxXgsUj
>>293
中身を理解して無いくせに黙ってろ。
2021/07/13(火) 03:20:46.36ID:qEHxTKb1
www
2021/07/13(火) 06:39:54.56ID:cTgR7KKr
UTF8(とASCII)以外の文字コードを扱うのが基本機能とは思えんが
301デフォルトの名無しさん
垢版 |
2021/07/13(火) 07:23:42.37ID:b6J4OLfP
>>296
> 基本機能だから
UTF-8さえ標準で扱えれば問題ない、UTF-8は世界標準だから
よって基本機能ではない
なので標準化する必要もないし、cargo.tomlに依存ライブラリを書くのが面倒ならapt-getでライブラリをインストールして使うC言語でも使えばいい
2021/07/13(火) 08:54:58.88ID:NU/mwW4g
>>301
「utf8以外を使う場合のやり方を標準化してほしい」って要望に対して
「utf8を使え」ってのは答えになってない
2021/07/13(火) 09:10:42.11ID:lb+vVVj1
今は多少議論の余地があっても、数年したら
「なんでstdにSJIS扱うライブラリ入ってるの? めったに使わないのにバカじゃねーの」
って言われるのが目に見えてる
2021/07/13(火) 09:14:58.89ID:n/daahFD
エンコーディング関連のコードは量が多いだろうから
あらゆるプログラムのコンパイル時間を増やしたりバイナリサイズを大きくしたりするだけの価値があるかという議論にはなりそう
2021/07/13(火) 09:17:07.48ID:NU/mwW4g
encoding_rsはSJISのためのライブラリじゃないでしょ
2021/07/13(火) 09:36:27.67ID:/A7/SyKa
Cとかだと依存ライブラリの導入が面倒すぎるから標準化してほしいというのもわかるが
Cargo.tomlに一行書くのが面倒と言われてもあまり共感は得られないんじゃないかな
2021/07/13(火) 11:03:30.55ID:pwZ9R0Fi
>>291
変換したくないって話じゃなかったの?
308242
垢版 |
2021/07/13(火) 11:43:58.46ID:dtNqNBdW
>>285
その通り。だから、
>>251
に書いたように、ユーザー名・ファイル名などのシステムには、ascii しか使えない

システム内部で、UTF-8/16 のどちらを使っているか不明だから、
共通項のasciiしか使えない

ただ、Windows で日本語のファイル名を使っている人も多いから、その場合は、
>>242
に書いたように、WSL で、Linux, UTF-8 に変換できると言うだけ

Windows言語だけは特殊。
Windows言語以外のすべての言語は、Linux, UTF-8 が基本
309デフォルトの名無しさん
垢版 |
2021/07/13(火) 11:50:05.93ID:WUJYnH4r
SJIS 死ね
\ 死ね
310デフォルトの名無しさん
垢版 |
2021/07/13(火) 11:52:00.92ID:WUJYnH4r
>>308
うby厨 死ね
311デフォルトの名無しさん
垢版 |
2021/07/13(火) 12:40:03.07ID:pH6df75p
>>302 UTF-8を使えというより、今の標準はUTF-8だから標準化する必要がないということを言いたかった
そんなものを標準化したところで使うのは英語圏以外だけだし、その英語圏以外でも滅多に使うことはないから必要に応じてcargo.tomlに書き加える今の方式で良い
2021/07/13(火) 13:23:53.20ID:EtxXgsUj
>>311
多数決で言えば漢字文化圏の方が人口が多い。
しかも母国語が漢字を使う。英語を母国語とする人口は三億人くらい。
漢字を母国語で使うのは15億人くらい。
漢字以外の多バイト文字を使う国まで入れたら70億人、つまり地球の95%異常
となる。英語の方が少数派。
2021/07/13(火) 13:23:53.20ID:EtxXgsUj
>>311
多数決で言えば漢字文化圏の方が人口が多い。
しかも母国語が漢字を使う。英語を母国語とする人口は三億人くらい。
漢字を母国語で使うのは15億人くらい。
漢字以外の多バイト文字を使う国まで入れたら70億人、つまり地球の95%異常
となる。英語の方が少数派。
2021/07/13(火) 13:40:25.49ID:NU/mwW4g
漢字とかもあるけど、例えばMIME64のデコードとか
エンコード・デコード処理の標準化と考えれば英語圏でもありかも
315242
垢版 |
2021/07/13(火) 13:42:56.59ID:dtNqNBdW
日本語をユーザー名・ファイル名など、システムに使うのは、Windows の香具師だけ

Linux を使うプロは絶対に、ascii しか使わない。
せいぜい、ハイフン・アンダーバーぐらい

もし、半角空白でも使えば、あちこちから怒りの声が届く。
システムがバグるから使うな!
2021/07/13(火) 13:46:44.21ID:NU/mwW4g
>>315
ここにいる人間はそんなことわかってるから、まあ落ち着け
317242
垢版 |
2021/07/13(火) 13:46:50.24ID:dtNqNBdW
Linux のテレビの録画システムで、
日本語のテレビ番組名を、そのままファイル名にしていた香具師がいたけど、

バグって使えない
2021/07/13(火) 13:48:05.76ID:qZprVsAK
なんか変なのが居着いたな
2021/07/13(火) 14:21:53.19ID:Ooc6RI1Q
Rubyボットの活動範囲がさらに広がってきたな
よほど暇なんだろう
2021/07/13(火) 15:12:06.73ID:QsXB5/qu
今日はRust in Actionが45%off
321デフォルトの名無しさん
垢版 |
2021/07/13(火) 15:55:17.99ID:oaeUW36h
>>307
そこは実は本質的な要件ではないらしく

>>249
> sjisファイルを読み込みたい
> でもチュートリアルにあるようにBufReaderは使えない

が本質的な要件だから
utf8と全く同様にFile::openとBufReaderしてreader.lines()を使えれば良いと見て
>>291のコードを提案した
そして「いいね!」とレスしてるからこれでOKのようだ
322デフォルトの名無しさん
垢版 |
2021/07/13(火) 16:00:31.83ID:WUJYnH4r
>>316
だよな
そして >>315 がいつものあいつだということもみんなしってる
2021/07/13(火) 16:16:17.73ID:QSkHhbzy
Windows ではプログラムをインストールするフォルダが Program Files となっているのは
パスが空白を含むくらいでおかしくなるようなカスなソフトを早めに発見するためなんよな。
パスが空白も漢字も含みうる仕様なのに対応してないソフトがあるならそのソフトがカスなだけじゃん。

今の時点で現実にそういうソフトがあるから仕方ないという論法だと
SJIS のデータがあるから仕方ないというのと言ってることは同じなわけで、
データが大事かソフトが大事かという点で軸が違うに過ぎない。
2021/07/13(火) 19:45:00.15ID:SMX4Ldwl
cmd「せやな」
2021/07/14(水) 11:14:54.14ID:eOdFkTAr
Windows 11は64-bitのみになるみたいだけど
Rustじゃ i686-pc-windows-gnu, i686-pc-windows-msvc はいつまでTier 1なんだろう?
2021/07/14(水) 11:43:09.28ID:eD4Wlw/y
>>325
32bit macがtier3落ちしたときはxcodeでコンパイルもできないし実行環境もないからって理由だったはず
同様にmsvcはMSがサポート切ってくればなくなるかもね
32bitアプリ自体が動かなくなるわけじゃなさそうだしgnuは大丈夫なんじゃないかな
2021/07/14(水) 13:27:24.91ID:BkkfMVAi
Win11はOSが32bitCPUでは動かないってだけで32ビットアプリはまだ動くのでは
2021/07/14(水) 13:35:34.15ID:FWHo5b9L
それであってる
2021/07/14(水) 16:08:27.83ID:bE2/aeQE
Win11は、16bitが公式では完全に動かなくなる
2021/07/16(金) 07:53:03.75ID:xJNtEE5m
>>329
マジ!? ちょっと困るなぁ
2021/07/17(土) 20:18:11.59ID:Blzyac97
>>329
え?今までも64ビット版Windowsでは 16 bit は NE フォーマットを含めて動かないと思っていました‥‥
だから emu を使っていましたが、今なら動くんですか?
2021/07/17(土) 22:06:07.73ID:u8FQMqKe
Win11は u16, i16 が使えなくなるのか
ま、使ったことないけど
2021/07/17(土) 23:18:45.26ID:H+CbDngl
どうしてそうなる
2021/07/18(日) 01:10:05.65ID:uA1uG+Zo
冗談と気付くまで時間かかっちゃったぞ
335デフォルトの名無しさん
垢版 |
2021/07/19(月) 17:48:08.64ID:Ex9Tt6CE
Rustの文法を教えて欲しいんだけどさあ
https://github.com/seanmonstar/reqwest
ここのExampleの中にある
>.json::<HashMap<String, String>>()
の行って、渡されたデータをHashMapに変換してるようだけど・・・・()があるから関数を呼び出しているんだろうけど、なのに関数名が無いってどういう文法なの?
2021/07/19(月) 18:18:59.22ID:N5AD9uIb
>>335
関数名はjsonで::の後はjsonの型パラメーター
2021/07/19(月) 18:58:43.60ID:R+McuOkS
>>335
turbofishで検索してみると幸せになれるかもよ
338デフォルトの名無しさん
垢版 |
2021/07/20(火) 08:52:59.51ID:m4QWlK0Z
そういうことだったのか
チュートリアルやったつもりが全然身についてなくて、まるで初見の文法に見えたよ
ありがとう!
2021/07/20(火) 11:37:04.97ID:bZGFynsp
async/awaitよく理解できないので質問です。

async fnを.awaitすることは、
thread::spawn(fn)で得られたJoinHandleをjoinすることと何が異なるのでしょうか
2021/07/20(火) 13:18:42.59ID:ZLL16lvF
>>339
https://rust-lang.github.io/async-book/01_getting_started/02_why_async.html#async-vs-threads-in-rust
2021/07/20(火) 13:51:30.35ID:x1qprig3
日本語でOK
2021/07/20(火) 14:46:16.61ID:0ur63h8Z
https://async-book-ja.netlify.app/01_getting_started/02_why_async.html
古い版ベースっぽいが
343デフォルトの名無しさん
垢版 |
2021/07/20(火) 17:53:25.45ID:poqzYj22
>>339
どのプログラミング言語でも同じ概念の話として
非同期プログラミングとスレッドプログラミングの違いをまず学ぶと良いでしょう
非同期プログラミングはスレッド使わないシングルスレッドでも成立するしよく使われます
スレッドは無駄にリソースを喰って重いのでスレッドを使わないシングルスレッドでプログラミング出来る事ならばそれが最も軽くて速いです

まずはシングルスレッドでの非同期プログラミングを経験しておきましょう
もちろん最初はasync/awaitを使わずに非同期プログラミングを体験したほうが良いでしょう
そうすることで初めてasync/awaitの意義と利便性を理解することができます

以上が通常のasync/awaitの初心者がたどるべき入門コースです
344デフォルトの名無しさん
垢版 |
2021/07/21(水) 18:10:51.09ID:xEcHVrDP
初級プログラマーは非同期プログラミングをしたことない人もいるけど
中級プログラマーになるには必須の技術だからね
2021/07/21(水) 20:22:35.81ID:zFAfbWuD
初級なら知らなくても仕方ない、中級なら必須という区分けはなんか違和感あるかな。対象の業務次第で知っとけよって範囲は違うからなぁ。
2021/07/22(木) 00:13:25.98ID:nOo3Pk8s
その辺は分野にもよるでしょ
組み込みと可だと初級でもマルチスレッドシラネはかなり問題だぞ
2021/07/22(木) 00:59:16.39ID:GmU5m4WV
昔ながらの言語だとスレッドはできてもコルーチンはできなかったりするので分野次第かな
348デフォルトの名無しさん
垢版 |
2021/07/22(木) 03:11:24.17ID:lswwPTyi
>>346
今回はマルチスレッドしか知らなくて
(シングルスレッドでも動く)非同期プログラミングを知らないという話だから
349デフォルトの名無しさん
垢版 |
2021/07/22(木) 10:08:08.42ID:I7nexIle
プリエンプティブじゃないマルチタスクωですねわかります
350デフォルトの名無しさん
垢版 |
2021/07/22(木) 11:38:36.18ID:K4TSDl0a
await後にどのスレッドが戻ってくるかは運なの?
2021/07/22(木) 13:02:57.44ID:DiCBumX8
>>350
ランタイムの実装次第
352デフォルトの名無しさん
垢版 |
2021/07/22(木) 16:56:26.36ID:PJWgwtfy
>>350
async/awaitとスレッドは直接は関係がない
async/awaitの対象はタスク
例えば1つのスレッドに10000のタスクを動作可能
8つのスレッドそれぞれでそれを行なえば計80000のタスクになるけども
スレッド1つにタスク1つしか使わなければ8つのスレッドで計8つのタスクになるといった具合い
これらはランタイムによってサポートが様々

したがって正確な質問は「await後にどのタスクが戻ってくるかは運なの?」となるけど
これはランタイムのスケジューリング次第
ランタイムはRustの言語仕様範囲外なので自分で決めた方針でスケジューリングするランタイムを作ることが可能
つまり運ではなく自分の思い通りに実行させることも可能
2021/07/22(木) 17:10:57.69ID:KJg/dUdU
JSのasync awaitってややこしい
goroutineのほうが簡単
2021/07/22(木) 20:26:18.99ID:7YxYJ8AQ
promise使うのに比べてそこまで楽か?って言われるとそうでもないわな
2021/07/22(木) 20:40:46.75ID:BtepJ1kx
>>352
え?
そもそもタスクとはどう定義するのですか?
あなたの@プロセスAスレッド、そしてBタスクの定義を教えてください、多分@ABの違いが明確でないので話が混乱しているかと
2021/07/22(木) 23:09:12.36ID:9gEORT6M
JSのawait/asyncとかめちゃくちゃ簡単やろ
シングルスレッドなのと背後にイベントループが存在することを抑えておけば余裕よ
すまんスレチだな
357デフォルトの名無しさん
垢版 |
2021/07/23(金) 00:43:44.14ID:n7dIeb/9
>>355
ここはRustのスレ。
スレッドとはstd::threadであり、いわゆるOSスレッド。
つまり1つのOSプロセスの中で、1つまたは複数のOSスレッドが動く。
一方で、async/.awaitが対象としているのは、スレッドよりさらに小さいタスク。
つまり1つのOSスレッドの上で、1つまたは複数のタスクが動く。
例えばシングルスレッドマルチタスクランタイムでは、1つのOSスレッドの上で無数のタスクを動かすことができる。
async/.awaitはこの非同期に実行されるタスクを扱う。
2021/07/23(金) 02:10:09.02ID:j3QjPF86
asyncは途中I/Oウェイトで待たされるような処理じゃないと意味がない
2021/07/23(金) 10:52:29.51ID:QeE9wwG7
スレッド、プロセス、タスクなどの定義は分野やプラットフォーム等によって異なる
2021/07/23(金) 12:55:46.87ID:luTvzo3i
VSCode+Rust Analyzerの環境で、ミュータブル変数にアンダーラインが付されるのをやめたいのですがどうすればよいですか?
361デフォルトの名無しさん
垢版 |
2021/07/23(金) 13:55:17.59ID:Y7b/5yJk
awaitの前後でスレッドは変わる可能性があるものの、タスクは変わらないんだと思ってたわ
2021/07/23(金) 13:58:58.67ID:c2hWXBFi
>>357の言う「タスク」って1つのasync関数のように読めるんだが、そういう理解で合ってるのか?
2021/07/23(金) 14:46:14.22ID:eQcO0XNp
>>362
tokio::spawnなどの引数に渡すものがタスク
async関数やブロックの場合もあるし、それらをコンビネーターでしたものの場合もある
2021/07/23(金) 15:12:50.36ID:c2hWXBFi
だとすると「スレッドよりさらに小さい」ってのは変だな。大きい小さいあるいは包含関係が決められるものじゃない。
2021/07/23(金) 15:14:21.60ID:6EkuYiQH
そもそも直交する概念だし用途によって使い分けるものでもあるし
2021/07/23(金) 16:49:32.73ID:+8+VImv7
スレッドより軽量という意味での小さいなら分かる
2021/07/23(金) 19:17:06.47ID:Nx0yKcVz
Elixirのプロセスは、軽量プロセスと言われていて、
OSのプロセスやスレッドではなく、Greenスレッドです

カーネルではなく、VMでスケジューリングされるので軽量、
コンテキストスイッチが発生しない

1軽量プロセスで約300ワードです
2021/07/23(金) 19:46:36.80ID:j3QjPF86
ここはRustスレ
2021/07/23(金) 21:20:19.48ID:O9MjyOb4
いつものRubyキチガイだろう
何言っても無駄だからスルーするしかない
2021/07/23(金) 21:25:52.66ID:c2hWXBFi
>>366
スレッドで動くんだから「スレッドより軽量」ってことはない。
2021/07/23(金) 21:50:34.41ID:TZPR0HeA
>>367
軽量プロセスでもコンテキストスイッチは発生するよ
2021/07/23(金) 22:59:27.49ID:eQcO0XNp
>>370
タスクと同じことをスレッドでやろうとした場合の比較ね
タスクと同じ数のスレッドを作った場合スタックだけで結構な量のメモリが必要になったりする
あとコンテキストスイッチのコストは少なく済んだりするんじゃないかな
2021/07/23(金) 23:08:30.77ID:c2hWXBFi
>>372
「タスク」の定義が>>363のようなものならそれはスレッドと直交する概念だと思うが?
2021/07/24(土) 00:30:53.20ID:LBBZ+Kmj
心臓のスイッチ切って死なねえかなこいつら
375デフォルトの名無しさん
垢版 |
2021/07/24(土) 01:45:40.45ID:5ex845z5
>>370
async/awaitでのタスクはスレッドよりリソースを喰わず軽量
例えば1つのスレッドの上に1万個のタスクでも動作可能でいわゆるC10K問題も対応できる軽量さ

>>373
直交する概念ではなく重量順に
OSプロセス≧OSスレッド≧タスク
(それぞれ=となるのは1プロセス1スレッドおよび1スレッド1タスクで用いる時)
2021/07/24(土) 02:52:34.75ID:F/fcX2Mm
タスクって名前が良くないな
一般的にはタスクってプロセスのことじゃない?
2021/07/24(土) 02:57:53.91ID:UokC4u3Y
んなことないでしょ???
2021/07/24(土) 04:00:31.27ID:NjCPGO8Q
タスクってのは内部実装的には非同期I/Oを使ったシングルスレッドでしょ。
2021/07/24(土) 07:37:56.03ID:vPIKycwR
>>375
OSプロセスは複数のスレッドを持つ場合があるから≧でいいが、>>363の言うタスクなら
1スレッドで同時に実行できるのは1タスクしかないと思うが?
2021/07/24(土) 09:29:01.55ID:qEX1axDl
Rustのasyncについて知りたければ「async-book」は必読なので
次からテンプレに入れよう
https://rust-lang.github.io/async-book/

>>980
よろしこ
2021/07/24(土) 10:59:35.94ID:/TMjuFD+
>>379
1スレッドで同時に実行されるタスクが1つというのは正しい

従来のスレッドでの並列化(1スレッド1タスク)の場合、IO処理を呼び出すと処理完了するまでの間はスレッドはsleep状態になってしまっていた
sleepしている間に他のタスクを実行させるためには、実行するタスクと同じ数だけのスレッドを生成する必要があるが
スレッド生成で消費するリソースが多いため数万タスクを同時に捌くことは難しかった

async-awaitではIO処理完了までの間スレッドをsleep状態にするのではなく別のタスクを実行する
これによりスレッドあたりの処理可能タスク数が増えるため、アプリケーション全体で同時に捌けるタスク数も増える

従来の手法でもスレッドをsleepさせないようなプログラミングは可能だけどプログラムの構造を大きく書き換えないといけなかった
普通のスレッド並列のプログラムと同じ書き味でより多くのタスクを捌けるプログラムが書けるというのがasync-awaitの一番のメリット

ただし常にasync-awaitが望ましいわけでもない
async-awaitで効率的に実行できるのはIO待ちが発生するタスクの場合で、CPUをぶんまわす処理には向いていない
適材適所で従来のスレッドによる並列化手法と組み合わせて使うことになる
382デフォルトの名無しさん
垢版 |
2021/07/24(土) 11:28:00.32ID:0bHT8/gy
>>379
いいえ
1つのスレッド上で同時に複数のタスクを並行(concurrent)に実行できるのがasync/awaitのタスクです。
C10Kと言われるように1つのスレッド上で10000のタスクでも並行に実行できます。

ちなみに1つのスレッド上で並列(parallel)に実行されるのは1つのタスクのみなのは当たり前なので、わざわざ言うことはないです。
今回はasync/awaitの話なので、
『1つのスレッド上で同時に複数のタスクを並行(concurrent)に実行できる』が正解です。
2021/07/24(土) 11:33:29.24ID:vPIKycwR
>>381
その1スレッドが時分割で複数タスクを実行できるということのちょうど裏返しで、1タスクは複数スレッドから実行され得る。
つまりそこに大小関係、包含関係などは無い直交した概念。
軽量云々てのはOSスレッドとグリーンスレッドの話とごっちゃになってんじゃないかねぇ。
2021/07/24(土) 12:05:51.45ID:F/fcX2Mm
>>382
>C10Kと言われるように1つのスレッド上で10000のタスクでも並行に実行できます。

本当に並行に実行される?
キューイングされたコールバックを順に呼んでるだけじゃなくて?
2021/07/24(土) 12:13:15.89ID:XrocH4ML
ねえこの引っ込みがつかなくなったゴミクズ共のメンチの切り合いっていつまで続くの?
2021/07/24(土) 12:14:13.90ID:XrocH4ML
包丁刺し合って死んで終わらないからネットのマウント取り合いって性質が悪いんだよね
2021/07/24(土) 12:17:43.31ID:sVj/Jq99
5chに何も期待してるのか
388デフォルトの名無しさん
垢版 |
2021/07/24(土) 12:21:52.26ID:K4Uz+tqB
>>384
あなたは初心者のようだから
まずは基礎知識である並行(concurrent)と並列(parallel)の違いを理解してから
あらためて>>382を読み直して理解しましょう
2021/07/24(土) 12:40:53.43ID:F/fcX2Mm
>>388
理解した
並列じゃないってことね
390デフォルトの名無しさん
垢版 |
2021/07/24(土) 12:41:30.17ID:F/fcX2Mm
間違った
並行じゃないってことね
2021/07/24(土) 12:42:53.22ID:F/fcX2Mm
で、実際のところランタイムってlongjmpみたいなことしてるの?
2021/07/24(土) 12:49:05.14ID:yYYDVwTY
>>391
しない
Futureを実装したオブジェクトのメンバとして持ち回る
クロージャがFnMut/FnOnceを実装したオブジェクトのメンバとして状態を持ち回るのと同じ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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