◎正当な理由による書き込みの削除について:      生島英之とみられる方へ:

Rust part11


動画、画像抽出 || この掲示板へ 類似スレ 掲示板一覧 人気スレ 動画人気順

このスレへの固定リンク: http://5chb.net/r/tech/1623857052/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。

1デフォルトの名無しさん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
http://2chb.net/r/tech/1619219089/

前スレ
Rust part10
http://2chb.net/r/tech/1617367084/

2デフォルトの名無しさん2021/06/19(土) 01:15:49.18ID:3FFA7ImF
>>1 おつ

3デフォルトの名無しさん2021/06/19(土) 01:20:06.41ID:VXoz87sA
>>1

4デフォルトの名無しさん2021/06/19(土) 02:14:18.53ID:tZhqlEYm
勉強中でいまいちよくわかってないんだけどさ
よくRsutでメモリの扱いが安全になるとか言われてるけど、これって解放忘れを防いでくれるだけであって、オーバーフローを防いでくれるものではないわけ?
それとも登場する全ての型がオーバーフローしないような仕組み(スタックプロテクター以上の何か)があるの?

5デフォルトの名無しさん2021/06/19(土) 03:26:44.04ID:5peZoltk
>>4
型のオーバーフローっていうのは算術オーバーフロー(桁あふれ)のことかな?
であればここを読むといいと思う
https://doc.rust-lang.org/book/ch03-02-data-types.html#integer-overflow

6はちみつ餃子 ◆8X2XSCHEME 2021/06/19(土) 04:22:00.60ID:/f53/cxR
スタックプロテクターの話題を出すってことは
バッファオーバーフロー (バッファオーバーラン) のことじゃないかな。

配列は大きさの情報を持っているし、
配列の一部の範囲を受け渡すときはポインタでなくスライスで扱うのが Rust の基本的な設計になってる。
ポインタと違ってスライスは範囲の情報を持っているのでチェック可能で、チェックする仕様になってるよ。
溢れたら panic する。
(もちろん unsafe な操作をしたらいくらでも危険な操作は出来る。)

絶対に溢れないことがコンパイル時に見抜ける場合であれば
チェックしないように最適化したりすることもあるし、
チェックする場合でも現代的な CPU ではほぼ確実に分岐予測が成功するから
処理速度が遅くなる分は十分に小さいとかいう話があったはず。

7デフォルトの名無しさん2021/06/19(土) 09:47:40.12ID:5peZoltk
バッファオーバーフローのことなのか
Safe Rustでは基本的に発生しないが仕組みというより
unsafeなコードを書く人が要求された安全性を保証するという約束の上に成り立ってる

Rustの要求するメモリ安全性を保証するためには
unsafeなコードでポインタをdereferenceする前にout-of-boundsかどうかのチェックが必要

8デフォルトの名無しさん2021/06/19(土) 14:15:48.54ID:lGsmv2n4
境界チェックなんて他の言語でもあるし、別にそこがRustの特別な強みではないんだよな
それよりは、

> これって解放忘れを防いでくれるだけであって

だけじゃなくて、use-after-freeとか、
思わぬ箇所でオブジェクトが変更されることによるデータ競合とか、
をコンパイル時にチェックできるのが強い

詳細はThe Book 4章に
https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html
日本語版はこっち
https://doc.rust-jp.rs/book-ja/ch04-02-references-and-borrowing.html

9デフォルトの名無しさん2021/06/19(土) 15:41:11.20ID:7Y2aa0wT
解放忘れ(メモリーリーク)はRustは
保証してないのでは?

10デフォルトの名無しさん2021/06/19(土) 16:32:09.25ID:+A5T+Cz1
Rc/Arc以外でメモリリークって起こるの?

11デフォルトの名無しさん2021/06/19(土) 16:52:09.35ID:5/JSw/kX
Box::leakして返された参照を捨てるとメモリリーク起こせる

12デフォルトの名無しさん2021/06/20(日) 02:45:16.68ID:O2AvtKTb
最近勉強始めたんだが、正直ムズイ

特にwinapiのポインタ引数が(構造体のポインタではなく)DWORDで定義されてたりするので、
キャストするのが超絶面倒臭い
microsoftはcrate修正してほしい

まあ、rustというよりwinapiの問題なんだが……

13はちみつ餃子 ◆8X2XSCHEME 2021/06/20(日) 02:57:43.41ID:h62I7Iw3
わかる。
DWORD とポインタをカジュアルに同一視する API はまだマシなほうで、
Rust は文字列をスライスで扱うから単純にポインタに変換してもヌル終端されてないのがクソめんどい。
文字列を渡すとかすごく普通にあることなんで、それがこんなに面倒くさいの勘弁して欲しい。

14デフォルトの名無しさん2021/06/20(日) 06:34:35.27ID:9R7FlmLP
普通に書いててwinapiとか使う機会ないと思うけどOS機能を直接触る必要のあるライブラリでも書いてるのかな?

15デフォルトの名無しさん2021/06/20(日) 15:00:11.94ID:ZAMdhkls
OS層に近いAPI全く使わないならrustやc++とかデメリットの方が多いような。

16デフォルトの名無しさん2021/06/20(日) 16:38:08.85ID:K2CzG+CP
俺も最近Rust勉強してるんだけど、GC無しでのメモリ管理が最高に気持ちいい
何もかもRustで書きたくなる

17デフォルトの名無しさん2021/06/20(日) 17:33:03.51ID:D+WmuL2+
ワイは基本moveってところが気に入ってる
参照をもって回るんじゃなくて
実態をmoveで渡してmoveで返されるとき清々しいのを感じる

18デフォルトの名無しさん2021/06/20(日) 17:51:48.27ID:BAitg4NO
システムコールや低レベルなライブラリをいい感じに安全にラップしてくれるcrateが提供されてるのはrustの良いところ

19デフォルトの名無しさん2021/06/20(日) 19:32:30.59ID:5UZIMOEC
moveって最適化ビルドだと消えたりしてるのかな?

20デフォルトの名無しさん2021/06/20(日) 21:04:33.39ID:BAitg4NO
moveが消えるとは?
moveがコンパイルされた結果のmemcpyなどが消えることはある

21デフォルトの名無しさん2021/06/20(日) 22:37:40.54ID:X7PAuK/l
>>13
Rustのスライスは、ほぼPascal文字列だから、Cよりも古くから作法や
概念は存在している。
しかし、なぜCがPascal文字列ではなく0終端文字列にしたのかには
理由があって、文字列の途中(部分文字列)を扱わない場合においては効率が良いから。
0終端文字列の欠点は、部分文字列を扱おうとするととたんに面倒なことになること。
ただ、strcmpみたいなものを書いたり、字句解析を書いたりするときには、効率は良い。
字句解析では決定性オートマトンの理論がグラフ的(状態遷移図的)になっており、
Cの0終端文字列とはとても相性が良い。
そして、コンパイラの実行時間の大部分は、実測してみると、意外にも字句解析が占めている。
字句解析は単純ではあるが、量が多いので1クロックの差がものをいう世界である。
ただ、Pascal文字列(スライス)が字句解析でも有利に働く場面はあるにはあるが。
どちらの方式が一方的に優れているとはいえない。

22デフォルトの名無しさん2021/06/20(日) 22:45:58.47ID:X7PAuK/l
>>21
すまん。今調べたら、Pascal文字列は、配列の先頭に文字数が
入っている特殊な形式で、スライスとはまた違うものだった。
今まで誤解していたわ。
Pascal文字列はダメだわ、全く意味無し。

ただ、俺が言いたかったのは、Rustのスライス方式も古くから概念自体は存在し、
Win32APIでもGetTextExtentPoint32()なんかが、ポインタと、その後に続く
文字数の両方を指定する方式を取っている。
このやり方は、文字列の中に 0x00 を埋め込まなくても部分文字列を扱えて
便利は便利。もしこれを部分文字列の場所を少しずつ変えていくようなの場合に、
0終端文字列でやろうとすると、効率が悪くなる。
ただ、いつでもスライスの方が0終端文字列より効率が良いという訳ではない。
それが>>21で言いたかったこと。決定性や非決定性オートマトンの考え方で字句解析を
する際には、Cの0終端文字列はスライスより効率が良い。

23デフォルトの名無しさん2021/06/20(日) 22:54:46.58ID:D+WmuL2+
読む価値無い文章をダラダラ書いちゃうのって
なんらかの障害なんやろな

24デフォルトの名無しさん2021/06/21(月) 00:08:08.49ID:85An+spJ
>>22
そのせいでPascal文字列は長さ255文字までに制限されてたのよな。

25デフォルトの名無しさん2021/06/21(月) 00:46:14.79ID:PP3lMGGZ
結論は、Rustがそんなにすばらしい言語とは到底思えないということだ。

26デフォルトの名無しさん2021/06/21(月) 02:03:12.76ID:wnQSc3ge
ええんやで

27デフォルトの名無しさん2021/06/21(月) 03:36:25.54ID:JQDu6zSa
>>25 まぁ用途によるやろ
発展途上なところもあるし、そもそもRustが向いてないような用途もある

28デフォルトの名無しさん2021/06/21(月) 07:39:35.72ID:3uERIKtL
>>13
様々な文字列処理をしたことがある人になら自明ですが
文字列を扱う場合は¥0終端よりもスライスのほうが圧倒的に有利です
例えば何段か深いディレクトリの絶対パスが与えられた時に各ディレクトリのリストを返す(つまりsprit)時
¥0終端方式だと元の文字列を書き換え破壊しない限りコピーが発生してしまいます
スライス方式だと書き換えもコピーも発生しません

これは正規表現によるパターンマッチングでも同じで¥0終端方式だと結果である部分文字列をコピーしなければ返せません
またHTMLやJSONなどの様々な構造データの解析結果でもそうです
JSON文字列を解析して内部構造化表現にする時もスライス方式ならば文字列のコピーが発生せずに済むわけです

29デフォルトの名無しさん2021/06/21(月) 08:53:58.31ID:xiUkcw19
>>28
>文字列を扱う場合は¥0終端よりもスライスのほうが圧倒的に有利です

有利だろうが何だろうが、APIや過去の資産を活用するのに面倒という事実は何も変わらないが

30デフォルトの名無しさん2021/06/21(月) 09:07:04.10ID:WbPJLyAM
そういやRustの std::ffi::OsString って¥0終端なんだっけ?

31デフォルトの名無しさん2021/06/21(月) 09:43:03.40ID:ILFJsIgR
>>30
違う
null terminatedはCString

32デフォルトの名無しさん2021/06/21(月) 11:29:12.30ID:+vRECSeH
>>29 FFIのことを考えつつスライスの恩恵(境界チェックなど)も受けるなら今のRustの文字列に最後に\0を入れるようにしたらいいと思ったけどなんでしないんやろ
\0分の1バイトぐらい今のPCじゃ問題にならないはず

33デフォルトの名無しさん2021/06/21(月) 11:49:33.30ID:hH2X9nxJ
>>32
従来の &str (部分文字列) とnul終端文字列を区別しないといけないけど
型で区別しようとすると結局今のCStr/CStringと同じになるのでは
文字列は部分文字列含め全部Stringみたいにヒープアロケーションするなら良いけどさすがに効率が悪すぎる

34デフォルトの名無しさん2021/06/21(月) 12:03:56.90ID:vy1X2bYf
これps5は60fpsでます??

35デフォルトの名無しさん2021/06/21(月) 12:11:12.63ID:743v8uRC
Rust違いです
ってかゲームのほうのRustって個別スレ無いんだね

36デフォルトの名無しさん2021/06/21(月) 12:12:05.66ID:oYpDc35T
FFIが必要な箇所で
let cstr = std::ffi::CString::new(str);
すれば済む話だからね

Win32APIだと\0終端の2バイト文字も渡したりするからCStringでも使い勝手悪そう
let wcstr: Vec<u16> = std::ffi::CString::new(str).to_str().unwrap().encode_utf16().collect();
で動くかな(試してない)
こっちは自分で'\0'足す方が簡単かもしれない

37デフォルトの名無しさん2021/06/21(月) 12:43:27.64ID:UE5kS0Iw
>>28
気持ちは分かるし、実際、その例に挙がっているケースではそうなんだけど、
字句解析は、コンパイラ理論の状態遷移図に基いて行うと効率が良いが、
それは 0 終端文字列の方が効率が良い。

38デフォルトの名無しさん2021/06/21(月) 12:53:52.20ID:UE5kS0Iw
何度も言うが、全面的にスライスが良いならC言語でも0終端文字列をやめに
してしまえばいいのだが、そういう訳ではない。
>>28 に挙がっているようなケースで、自分も同じような気持ちになったことは有るが、
一方で 0終端文字列の方が効率が良い例も少なからず存在しているので全面的に
スライス方式に変えてしまうのは難しい。
一番単純な例を書けば、英大文字の部分だけを読み飛ばす場合、

(1) ptrが0終端文字列を挿している場合:
while ( *ptr >= 'A' && *ptr <= 'Z' ) ptr++;

(2) (ptr, len)でスライス文字列を表現している場合 :
int cnt = 0;
while ( cnt < len && *ptr >= 'A' && *ptr <= 'Z' ) {ptr++; cnt++;}

後者だと、cnt < len と cnt++; の部分が追加されて効率が落ちる。

39デフォルトの名無しさん2021/06/21(月) 13:02:34.21ID:WbPJLyAM
Linuxカーネル開発における「Rust」採用の動き、グーグルとISRGがさらなる後押し
https://japan.zdnet.com/article/35172646/

> Googleは、ウェブサーバーソフトウェアの「Apache HTTP Server」向けのモジュールをRustによるモジュールで置き換えるというISRGのプロジェクトも支援している。

40デフォルトの名無しさん2021/06/21(月) 13:11:18.52ID:+4cAknZI
windows apiを使ってメッセージダイアログボックスを表示するサンプルが載ってるサイト教えてください

41デフォルトの名無しさん2021/06/21(月) 13:25:05.28ID:hH2X9nxJ
>>38
今のcpuとコンパイラの最適化で両者にどれくらいの性能差があるか示したベンチマークなどある?

rustでも文字列末尾に0を差し込めば同じことはできるので、本当に速くなるなら最適化の手法として採用しても良いかもしれない

42デフォルトの名無しさん2021/06/21(月) 13:41:31.99ID:G7rEBmCP
>>41
試しに手元の環境で1GB分やってみたが1割くらい差があるね
コンパイラはgcc9
でもRustの文字列ってnull文字含むことができるんじゃなかったっけ?試したことないけど

43デフォルトの名無しさん2021/06/21(月) 13:52:57.02ID:xiUkcw19
>>40

use winapi::um::winuser::*;

fn main() {
let str: Vec<u16> = "Hello, world!".encode_utf16().chain(Some(0)).collect();
unsafe{
MessageBoxW(std::ptr::null_mut(), str.as_ptr() , str.as_ptr(), MB_OK);
}
}

44デフォルトの名無しさん2021/06/21(月) 14:00:39.66ID:yyeRDQfZ
設計判断ってのは常にトードオフの選択だからな
ヌル終端にすることで得られるものと失うものを天秤にかける必要がある

得られるものしか見ないやつは設計からは手を引け

45デフォルトの名無しさん2021/06/21(月) 14:01:15.31ID:yyeRDQfZ
トレードオフね
あー恥ずかし

46デフォルトの名無しさん2021/06/21(月) 14:13:19.21ID:t12YpwM9
ああトードオフは重要だよな

47デフォルトの名無しさん2021/06/21(月) 14:31:05.42ID:ILFJsIgR
>>38
ptrとlenが分かってるなら別途カウントアップしていかなくても
どの位置のptrまで読めばいいか最初に分かるんじゃない?

48デフォルトの名無しさん2021/06/21(月) 14:45:15.77ID:6c6Y8dXA
Rustってなんでprintlnの後にビックリマークあるの?

49デフォルトの名無しさん2021/06/21(月) 14:51:45.48ID:G7rEBmCP
>>47
確かに。end_ptrとの比較で終了判定した場合は(1)と差はなかった
比較一個分くらいなら今どきのプロセッサの並列実行で
十分吸収できるということかな

50デフォルトの名無しさん2021/06/21(月) 14:58:01.41ID:oYpDc35T
>>48
printlnは関数じゃなくマクロだから
ちなみにマクロにしてる理由は引数の型と個数が不定だから

51デフォルトの名無しさん2021/06/21(月) 15:29:27.47ID:+4cAknZI
>>43
先輩ありがとうございます!

52デフォルトの名無しさん2021/06/21(月) 15:40:08.22ID:WbPJLyAM
そういや、可変長引数を直接書けないからRustはクソって言う人はまだ見た事ないな
あんまり使わないからかな?

53デフォルトの名無しさん2021/06/21(月) 16:23:01.35ID:hH2X9nxJ
>>42
文字列中にNULが含まれないことを前提とした最適化だから
NUL含む場合は使えないという制約はあるね
Cの文字列と同じ制約だから実用上あまり困らないんじゃないのかな知らんけど

54デフォルトの名無しさん2021/06/21(月) 16:29:47.09ID:hH2X9nxJ
>>52
Cで可変長引数使いたくなるのってprintf系関数以外なんかある?

55デフォルトの名無しさん2021/06/21(月) 16:52:01.19ID:xiUkcw19
>>54
ない
標準関数ではprintfとscanfだけ

56デフォルトの名無しさん2021/06/21(月) 17:01:59.90ID:UE5kS0Iw
>>47
なるほど、こういうことかな:
(2)' (ptr, len)でスライス文字列を表現している場合 :
int btm = ptr + len;
while ( ptr < btm && *ptr >= 'A' && *ptr <= 'Z' ) {ptr++;}

>>49
差は少なくはなるが、無くなるわけではない。
ptr < btm という部分が残るから。整数比較命令と 条件jmp命令の
合計2命令はまだ(1)より多い。

57デフォルトの名無しさん2021/06/21(月) 17:23:50.71ID:a6mPBEl9
>>56
そりゃ命令数に差があるのは当然だけど
現代的なプロセッサの並列発行や分岐予測を考慮して
なおパフォーマンス差があるかを見たかっただけなので
そちらは実際測定して差を確認できた?

58デフォルトの名無しさん2021/06/21(月) 17:32:00.25ID:xiUkcw19
議論するのそこ?
むしろセキュリティ(バッファオーバーランの危険性)とパフォーマンスを秤にかけて
rustはセキュリティの方を採用したってだけじゃない?

パスカル文字列なんて昔からあったわけだし

59はちみつ餃子 ◆8X2XSCHEME 2021/06/21(月) 17:54:38.56ID:5bV+3LP7
>>52
どうしてもやりたければビルダーパターンでまとめてから渡すイディオムが確立してるから
そんなに不満にもならないんじゃない?

60デフォルトの名無しさん2021/06/21(月) 18:00:00.24ID:W8eb/Sbg
>>58
いや安全な方を選んだってのはそのとおりだと思うけど
理論上遅いはずってのを実際測るとそうでもなかったってのはよくある話で
そこが気になっただけ

61デフォルトの名無しさん2021/06/21(月) 18:49:34.95ID:xiUkcw19
>>60
rustが組み込みも視野に入れている以上、現代的なプロセッサは当てにできないと思う
8bitマイコンとかでrustが動くのかどうかはわからないけど

62デフォルトの名無しさん2021/06/21(月) 19:12:19.82ID:Qd3Oxzyr
>>61
別にRustはあらゆるアーキテクチャでのパフォーマンスを保証するつもりはないと思うけどね
実際測定してるのはTier1環境だけだろうし

63デフォルトの名無しさん2021/06/21(月) 21:14:54.92ID:MXwcp+e6
winapiクレートを使うことってもうなくね?
Microsoft公式のwindiwsクレートの方がよっぽど使いやすいよ

64デフォルトの名無しさん2021/06/21(月) 21:47:08.31ID:L+7FW+LR
>>38
>(1) ptrが0終端文字列を挿している場合:
>while ( *ptr >= 'A' && *ptr <= 'Z' ) ptr++;

その場合でも、まず与えられたデータが0終端しているかどうかを確認する必要がありますよね。
データがどこから来るのかは、
ネット上の通信相手か
ディスク上のファイルか
メモリ上の他言語等APIかになりますが、
いずれも盲目的に信頼せずに処理する必要があります。

そして小さいデータならばどんな処理方法でも誤差になるのでしょうが、
大きなデータの場合は>>28のように元はJSONとかHTMLのように構造をもっており、
その解析結果である各一部分が対象文字列になります。
すると0終端させた方がわずかに速く扱える可能性があるからといって、元の大きなデータから毎回コピーして0終端文字列を作る場合と、
コピーをせずにスライスのまま部分文字列を扱う場合との、比較になるのでははいでしょうか?

65デフォルトの名無しさん2021/06/21(月) 22:00:11.19ID:xiUkcw19
>>64
>元の大きなデータから毎回コピーして0終端文字列を作る場合

どこからコピーの話が出た?

66デフォルトの名無しさん2021/06/21(月) 22:22:17.51ID:oYpDc35T
>>65
変更したくない文字列"あいうえおかきくけこ"から部分文字列"かき"を取り出す場合、
スライス式だと元の文字列の[5:7]の範囲という形で表現できるからコピー不要だけど
ナル終端式だと"く"が邪魔で"かき\0"にできないからどこかに"かき"のコピーが必要になる

って話が>>28に出てる

67デフォルトの名無しさん2021/06/21(月) 22:57:58.01ID:xiUkcw19
>>66
なるほど、理解した

68デフォルトの名無しさん2021/06/21(月) 22:58:56.43ID:ILFJsIgR
その比較は部分文字列をコピーするかスライスで表現するかの違いであって
0終端文字列のメリット・デメリットとは少し違うんじゃない?
0終端でも同じようにスライスを(ptr, len)で作ればコピーは不要

69デフォルトの名無しさん2021/06/21(月) 23:46:42.70ID:oYpDc35T
>>68
> 0終端でも同じようにスライスを(ptr, len)で作ればコピーは不要

それをやってしまうとその部分文字列に対して0終端のメリットが効かなくなるわけで
コピーしないとメリットを得られないというのがデメリットになってる

70デフォルトの名無しさん2021/06/22(火) 02:10:06.59ID:JEO56Dr7
つまり部分文字列を扱う場合は、コピーが発生する0終端方式が不利になりますね。
具体的にファイルパスからディレクトリ部分を得るとか、URLからホスト名を得るとか、元データを破壊したくない時は0終端方式だとコピーするしかないです。
つまり一貫してRustのように始点&長さ方式の方が、有利かつメモリ安全ではないでしょうか?

さらに文字列比較の場合も長さ方式よりも0終端方式が不利です。
これはCのmemcmpとstrcmpの比較に還元されますが、
memcmpは64bit比較やSIMD利用ができるからです。

71デフォルトの名無しさん2021/06/22(火) 02:44:25.97ID:fStlaCDg
&strって3つの意味があると思うんだよね
1: 文字列リテラル
2: Stringの参照
3: 部分文字列
文字列リテラルとStringは終端にNULLを付けるようにして(今まで通りlenやcapは残す)、部分文字列は部分文字列を意味する別の型を作ればいいと思った
こうすることでRust側ではlenやcapを使い、C側ではNULL終端を利用できるという状態になる(Stringや&strをRustで使ってもCで使ってもゼロコスト)
もしNULL終端ではない部分文字列をCで使いたければStringに変換すれば使えるようになる(これはコストがかかるけどCの文字列も同じ問題を抱えてるので問題なし)

72デフォルトの名無しさん2021/06/22(火) 08:19:32.37ID:7Ks2gqqv
>>70
それやるには文字列がimmutableでなければならないから、それによって生じるスペースコストとどっちをとるかって話だな。
それにimmutableな文字列って、部分変更に相当する処理をする場合に逆にコピーが必要になるし。
どっちにしても一概に、コピー不要だからこっちが有利、みたいな話にはならんかと。

73デフォルトの名無しさん2021/06/22(火) 12:15:08.38ID:UUxAOJV3
rustで初心者がハマるポイントを初心者が紹介します

・所有権の概念が難しい
・何をするにしても外部ライブラリが必要(乱数生成など)
・ポインタが難しい

74デフォルトの名無しさん2021/06/22(火) 12:16:52.83ID:hfO2UPRV
・検索すると同名のゲームの話ばかり出てくる

75デフォルトの名無しさん2021/06/22(火) 12:26:02.44ID:jOUHjhXv
・static変数の扱いが面倒臭い

76デフォルトの名無しさん2021/06/22(火) 12:52:20.13ID:P9tLBTwV
>>64
>その場合でも、まず与えられたデータが0終端しているかどうかを確認する必要がありますよね。
「0終端文字列」
というのは、必ず0終端されている文字列の事なので確認は不要。
それを明確にするために、C言語では、const char *pszText; のように、
psz という接頭辞をつける流儀がある。
psz = pointer to string ending with zero.
   「0で終端している文字列へのポインタ」
という意味。これは、単なる const char *ptr; とは意味が異なる。
char c = 'A';
const char *ptr = &c;  // 単なる文字へのポインタ。0終端されていない。
char szText[] = "Hello"; // 0終端文字列。0終端されている。
const char *pszText = szText; // 0終端文字列へのポインタ。0終端されている。

77デフォルトの名無しさん2021/06/22(火) 13:23:35.92ID:D73AVe+6
>>76
ファイルから読んだデータをpszHogeに格納するときにゼロ終端の要件満たしてるか確認する必要あるよねって話だぞ

78デフォルトの名無しさん2021/06/22(火) 13:25:24.28ID:RVuteXyT
>>74がマジで深刻すぎる
ついでに加藤純一っていうゲーム実況者とかとじゅんっていうRust/Scala使いがいるのも紛らわしい

79デフォルトの名無しさん2021/06/22(火) 13:35:53.88ID:IhZgQU+B
>>76
>というのは、必ず0終端されている文字列の事なので確認は不要。

という考えで脆弱性を量産してきたC言語の負の歴史を顧みて
Rustを始めとした新しい言語は異なる文字列表現を採用してるわけだ

80デフォルトの名無しさん2021/06/22(火) 14:06:03.07ID:P9tLBTwV
>>77
コンピュータの世界で「確認」とは、データの中を検査するという意味で
使われるが、そういうことは不要。
自分で末尾に 0 を書き込む必要があるだけ。

81デフォルトの名無しさん2021/06/22(火) 14:15:33.98ID:3bNpX0tT
そこで確認不要とか言ってるからユーザにヌル文字含んだ文字列渡されて死ぬのでは

82デフォルトの名無しさん2021/06/22(火) 14:51:42.58ID:jOUHjhXv
セキュアプログラムは面倒だからなー
数値のオーバーフローチェックとかみんなやらないでしょ?
アップキャストして値に結果を放り込んでチェックした後、
ダウンキャストするとか面倒すぎる

83デフォルトの名無しさん2021/06/22(火) 15:18:09.96ID:YfWe7YWP
>>73
Cより面倒臭そうω

84デフォルトの名無しさん2021/06/22(火) 15:19:46.85ID:YfWe7YWP
>>76
そこまで出鱈目な話初めて聴いたわ

85デフォルトの名無しさん2021/06/22(火) 15:22:37.78ID:P9tLBTwV
>>81
そういう外部からの入力に対するエラーチェックはするのは当然だが、
0終端文字列でやる場合には、ファイルのバイト数だけ読み込んで、
一番最後に 0 を書き込んでおくとそれ以上まで進むことはない。
途中の 0 に関しては スライス方式でも同じ問題が残る。
途中に 0 が有っても大丈夫な様に作るだけ。

86デフォルトの名無しさん2021/06/22(火) 15:24:47.81ID:P9tLBTwV
>>84
ちなみに、リアルワールドでは俺は名プログラマだと評価されているぞ。

87デフォルトの名無しさん2021/06/22(火) 15:27:25.45ID:P9tLBTwV
良いプログラムを作るための基本ポリシー:
・外部データと内部データは明確に分ける。
・外部データを内部データに入れる場合は、エラーチェックを徹底的にする。
・内部データに関しては、原則的には完全に正しいことを前提にしてプログラム
 して良い。ただし、プログラムのミスのための念のためのチェックはしても良い。

88デフォルトの名無しさん2021/06/22(火) 15:47:48.20ID:cJZ3y9Eg
>>87
3番目のチェックはアサーション(assert)だと思うけどあれはコードを読む人に背景の条件を明示する意味もあるね
逆にアサーション以外の余計なチェックはコードを読む人を混乱させる可能性がある

89デフォルトの名無しさん2021/06/22(火) 16:20:58.03ID:N/B8oZfx
ヌル終端はパンチカードが現役だった時代に数バイトケチった名残

互換性のためにサポートしなきゃいけないのは理解できるが
今の時代にヌル終端が優れてるとかそれをデフォルトにしろってのは控えめに言って頭おかしい

90デフォルトの名無しさん2021/06/22(火) 16:22:09.51ID:jOUHjhXv
>>87
外部と内部の定義プリーズ

91デフォルトの名無しさん2021/06/22(火) 16:30:14.48ID:P9tLBTwV
>>90
外部でーたとしては、他にも有ると思うが、一例としては、

1. 他人が自由に書けるファイルから読み取ったばかりのデータ。
 (アプリケーション内部にリソースデータとして内蔵し、安全性が
 テスト済みであるようなファイルは内部データとみなしても良い場合も有る。)

2. 安全対策を徹底したいライブラリの場合は、ライブラリを使う側が関数に
 渡してきたテキストデータや引数の値。
 ただし、このようなものまで徹底的にチェックするとなれば遅くなるので、
 設計思想によっては、NO-CHECK、または、軽いチェックだけで済ましても良い。

3. OSの場合は、同様なものとして、APIを呼び出した側が渡してきたデータ。
 これは、安全性チェックは徹底して行う必要がある。

4. データベースソフトなどの場合も、2や3に準ずる。どこまで安全チェックするかは、
 使用目的や用途、設計思想による。

92デフォルトの名無しさん2021/06/22(火) 16:34:27.28ID:jOUHjhXv
ちょっと緩くないか?

93デフォルトの名無しさん2021/06/22(火) 16:48:00.98ID:FRtvqWA7
信頼境界線の引き方は諸説あるだろ。

94デフォルトの名無しさん2021/06/22(火) 19:06:39.53ID:R8WO8pxt
一般に、アプリの外に置いてあるファイルはチェックした方が良いが、
その中でも、テキストファイルは、信頼置け無い事が多いのでチェックは必要。
アプリの外に置いてあっても、バイナリデータだと人が手書きすることはないため、
設計思想にもよるが、安全チェックはある程度省略しても良いと考える流儀もありえる。

95デフォルトの名無しさん2021/06/22(火) 19:33:50.85ID:D73AVe+6
結局アプリケーションがどう使われるか次第でしょ
アプリケーション作成時の前提が利用シーンの増加により後から覆されるなんてことは良くあることだから
性能要件がない限り最初から安全側に倒しておくのが合理的

96デフォルトの名無しさん2021/06/23(水) 11:02:20.62ID:o/eJBU4s
constデフォルトあたりの話ってgoto禁止論みたいになっている気がする
理由を理解していないがとりあえずそうしておけみたいな人を少なからず見かけるような

>>94
パーサーがガバガバで細工したセーブデータで乗っ取られるゲームのことか

97デフォルトの名無しさん2021/06/23(水) 14:27:15.67ID:LIFxwhU8
>>95
MS製のリンカ(link.exe)の入力するlibraryファイル(*.lib)には、
ヘッダ部分にシンボルがアルファベット順にソートされたシンボルテーブル
が入っている。ソートされていることを前提にバイナリサーチが出来るので
シンボルを検索するのが高速になるとされる。バイナリサーチは、ソート
されているデータに対してのみ正しく検索できて、もしソートされていなければ
間違った結果になる。
しかし、link.exeが*.libを入力する時、ちゃんとシンボルテーブルのシンボル
がソートされたかどうかチェックしているかと言うと、定かではない。
だから、もし、サードパーティー製のツールが*.lib を作成した時、
ソートにミスがあったりすると、link.exeはundefined symbolエラーを出すか、
リンクには成功するが、実行段階でアプリが起動できなかったり途中でダウン
してしまうかも知れない。その様な場合、何が原因かは分からないであろうが、
多分、実際、検査はされてない。

98デフォルトの名無しさん2021/06/23(水) 14:30:46.54ID:LIFxwhU8
>>97
実際は、サードパーティー製ツールも、ちゃんと*.libのヘッダのシンボルテーブルの
シンボルはソートしており、その部分にはバグはないので、それがソートされてない
*.libは基本的には存在しない。
ただし、*.libをバイナリエディタで開いて手作業で間違って変更したりすると
ソートされていないものが出来上がる。
それをlink.exeに入力しても、link.exeは、そのことに関してのエラーは出さない
だろう。

99デフォルトの名無しさん2021/06/23(水) 16:29:36.30ID:6jEPjWCz
Rustのスレだよね?

100デフォルトの名無しさん2021/06/23(水) 17:44:15.71ID:rKa/khCP
小学生が大人に九九暗唱してみせれば微笑ましいが
大人が大人に九九暗唱してみせるなら不気味で滑稽である

101デフォルトの名無しさん2021/06/23(水) 18:25:31.65ID:mfn5LAEG
意図通りに動かないバグにつながるという話と
バッファオーバーフローみたいな脆弱性につながるという話は別だよね

102デフォルトの名無しさん2021/06/23(水) 19:58:13.96ID:smIE1EjE
再帰を使って1x1=1から9x9=81までの答えだけを書く場合
どうやって書けますか?

103デフォルトの名無しさん2021/06/23(水) 20:12:50.89ID:1lBkKsRv
fixコンビネータを使う

104デフォルトの名無しさん2021/06/23(水) 22:38:48.46ID:GhG+XcCm
>>102
題意に沿ってるか分からんけど

fn main() {
f(1, 1);
}

fn f(a: u32, b: u32) {
//println!("{}x{}={}", a, b, a * b);
println!("{}", a * b);
match (a, b) {
(9, 9) => return,
(_, 9) => f(a+1, 1),
(_, _) => f(a, b+1),
}
}

105デフォルトの名無しさん2021/06/23(水) 23:13:30.14ID:Cy7wfzk/
実践的な話をするとRustは末尾再帰最適化が出来ないからなるべく再帰は使わないほうがいいと思う

106デフォルトの名無しさん2021/06/24(木) 01:50:53.81ID:UNoTdpdl
宿題かなんかだろう。
Rustで宿題を課すなんて教官は変態にもほどがある。

107デフォルトの名無しさん2021/06/24(木) 23:17:10.64ID:zHNnGFYG
>>104の例だとtail recursionになっていないから
内部でloop化できる仮言語で書いてもこのように分解するしかなくて
f(1)
fn f(a) {
  f2(a, 1)
  f(a+1) if a != 9
}
fn f2(a, b) {
  print `${a}x${b}=${a*b}`
  f2(a, b + 1) if b != 9
}
結局のところ関数分割→個別ループ化→関数統合で二重ループ化まで自動でしてくれる言語は無いから
再帰は使わずに自分でループ化すればいいよね、って結論
つまりアルゴリズムでは再帰で考えても実装はループにしてコメント残しておくのが正解

108はちみつ餃子 ◆8X2XSCHEME 2021/06/25(金) 00:17:11.72ID:/YhIejlL
>>107
プログラミング言語 Scheme の仕様だと >>104 のようなパターンは末尾文脈の定義にあてはまるし
末尾呼出し最適化が適用されることが保証されるから、
現代的な言語処理系で最適化できないとは信じられないんだけど、
実際にRust コンパイラに >>104 を与えたときにループに最適化はしないの?
Rust のコンパイラの使い方に不慣れでアセンブリコードの出力のさせかたがよくわからん……。

ほぼそのまま C のコードに書き換えてみたら
GCC ではジャンプに置き換えたコードが生成されるみたいだし……。
(ちなみに GCC では末尾呼出しになっていなくても一部の状況では再帰をループに変形できることがある。)

Clang だとループを全部 unroll しやがった!

109デフォルトの名無しさん2021/06/25(金) 11:49:33.37ID:UuPR+dCF
c言語だと再帰が末尾呼び出し最適化されるかどうかがオプティマイズレベルで変わるからややこしい。
リリース版だと動くがデバッグ版だとスタックオーバーフローみたいな事になる。
単純な再帰ならループに書き直してもいいけど、相互再帰みたいなのは末尾呼び出し最適化してくれないと困る。

110デフォルトの名無しさん2021/06/25(金) 11:58:36.77ID:CpYoiDkc
あの、Rustの勉強のために逆引きサンプルwiki作ろうと思うんですけど
テンプレ殿堂入りを目指して作ってもいいですか?
もちろん広告は入れませんが、レンタルwikiが提供している広告は表示されるかもしれませんが。。。

111はちみつ餃子 ◆8X2XSCHEME 2021/06/25(金) 12:05:43.49ID:/YhIejlL
>>110
目指すことは自由じゃないの。
皆がどう判断するかも自由だけど。

112デフォルトの名無しさん2021/06/25(金) 12:18:21.65ID:CpYoiDkc
先輩ありがとうございます!
受け入れてもらえるようなコンテンツを作ります!

113デフォルトの名無しさん2021/06/25(金) 15:26:59.18ID:CCUOu52e
5chに閉じずに本家のコミュニティにも便利と思ってもらえるもの目指した方が良いのでは

114デフォルトの名無しさん2021/06/26(土) 00:57:24.13ID:QiaGJu0I
>>86
ただし石器時代のな

115デフォルトの名無しさん2021/06/26(土) 02:18:19.63ID:morUmgAo
>>114
ミンチメーカー、ではなくスパゲティメーカーとして恐れられてるかもな

116デフォルトの名無しさん2021/06/26(土) 03:08:39.74ID:ljqTs+jf
Rustと他の言語との違いについて興味深い観点で盛り上がってるスレ
特に後半

趣味でプログラミングの勉強するとしたら何言語がいい?
http://2chb.net/r/morningcoffee/1623527901/

117デフォルトの名無しさん2021/06/26(土) 12:15:14.01ID:jgmCFZtl
斜め読みしかしてないから見逃してるかも知れないけどさんざん言い尽くされた話ばかりだった気が
そもそもRust自体はC++を置き換えることを目的にはしていない

118デフォルトの名無しさん2021/06/26(土) 14:26:52.57ID:UK7NU6RE
やたらC++と比較されるのはどっちもbetter Cの側面があるからだろうか
個人的にRustはCとScheme(Lisp)のハーフという印象
SchemeよりMLの方が近いらしいけどMLは使ったことないからよく分からない

手続き型で関数型を疑似表現したり関数型で手続き型を疑似表現する試みがあるけど
Rustはその中間を上手く埋めてる感じ

119デフォルトの名無しさん2021/06/26(土) 14:33:02.82ID:S/dGZFG2
> better Cの側面がある

はぁ?
お前がcもc++もrustもニワカなのは分かった
あと五年間は、カキコ無前にROMに徹してみてほしい

120デフォルトの名無しさん2021/06/26(土) 15:07:09.40ID:UK7NU6RE
>>119
急にどうしたんだ
better Cの意味が分からなかった感じ?

121デフォルトの名無しさん2021/06/26(土) 15:16:37.21ID:zCIOA2Bt
実際にはRustはbetter D

122デフォルトの名無しさん2021/06/26(土) 15:47:21.36ID:vR4ZYNRj
急に発狂する奴はどこの掲示板にもいる 気にするな

123デフォルトの名無しさん2021/06/26(土) 16:24:43.50ID:MKHy+X82
わざわざ自演するようなことかね?

124デフォルトの名無しさん2021/06/26(土) 16:34:36.83ID:jgmCFZtl
mozillaのc++を安全に使う数多の取り組みに疲れ果てた結果出てきた新言語がrustなのでc++と比較されるのは当然

125デフォルトの名無しさん2021/06/26(土) 18:03:00.84ID:cKS/UcnU
この板全域に出没して何でもRubyと比較するガイジみたいなもんだろ
ここにはなぜかいないけど

126デフォルトの名無しさん2021/06/26(土) 18:06:17.50ID:uWTCkdSJ
>>116
Rust布教スレになってんじゃん
不健全

127デフォルトの名無しさん2021/06/26(土) 19:35:22.90ID:pNIxzUaQ
今から新規のプロジェクトをC++かRustで始めるとなったらRustの一択でしょう
つまりRustはbetter C++

128デフォルトの名無しさん2021/06/26(土) 21:22:24.72ID:yvLLLScj
まったく何も資産がない新規であればそうかもしれんが

129デフォルトの名無しさん2021/06/26(土) 21:36:19.59ID:js6oaYoM
>>118
どこらへんがschemeに近い?
よく知らんがschemeってカッコが一杯あって、再帰ばっかりしてるイメージなんだが

130デフォルトの名無しさん2021/06/26(土) 21:43:00.01ID:pNIxzUaQ
つまり過去のしがらみのある案件は時間がかかり遅れるが
いずれも徐々にC++はRustへ置き換えられていく

131デフォルトの名無しさん2021/06/26(土) 21:48:35.28ID:IGj3fs8T
逆に枯れてる分野でしか実装されんわ

132デフォルトの名無しさん2021/06/26(土) 21:51:34.18ID:uWTCkdSJ
emacsとあとなんだっけ? SVGのライブラリ?が
オブジェクトファイル *.o 単位で少しずつCからRustに移植してたな

133デフォルトの名無しさん2021/06/26(土) 22:01:32.26ID:WPp8qNv5
librsvgだね

134デフォルトの名無しさん2021/06/26(土) 23:01:02.22ID:UK7NU6RE
>>129
ifとかmatchのブロックがそのまま値になるところが何となくS式っぽいんだよね
ブロックの最後の式が全体の値になるのも(begin ..)に近いし

135デフォルトの名無しさん2021/06/27(日) 00:09:44.66ID:hddKqCef
それは単に式指向という話なのでは

136デフォルトの名無しさん2021/06/27(日) 00:12:27.99ID:HvPCU4P8
MLの方が普通に近いな
パターンマッチとか束縛がletとかHMの型システムだとか

137デフォルトの名無しさん2021/06/27(日) 01:36:30.56ID:AjjhDlM0
一番近いのは Ocaml。なぜなら、かつてRustはOcamlで組まれていたから。
そして途中でコンパイラをRust自身に直したと聞いた。

138はちみつ餃子 ◆8X2XSCHEME 2021/06/27(日) 03:28:07.65ID:+5rTVQj/
Rust の Scheme っぽいところを探すとしたらマクロだろ。
伝統的な Lisp 系言語だと実行時の環境とマクロ展開時の環境を分けないが、
Scheme は分ける方針をとってる。
(実際には分けない実装をしている処理系もあるし、次の仕様の更新でどうなるか不透明だけど。)

139デフォルトの名無しさん2021/06/27(日) 12:22:30.08ID:HfXxTqRR
何に近いかでここまで盛り上がれるのだね
何も産まないのに

140デフォルトの名無しさん2021/06/27(日) 12:24:39.60ID:lZYiAKce
Parkinson's Law of Triviality

141デフォルトの名無しさん2021/06/27(日) 13:55:37.78ID:00z9rPIn
>>139
比較から何かを見出せる人もいるから何も産まないということはないよ

142デフォルトの名無しさん2021/06/27(日) 14:24:31.82ID:me9wSnu9
そんなセンスのある人がここにいると思うのww?
センスないねw

143デフォルトの名無しさん2021/06/28(月) 20:31:57.40ID:cQA8O+iD
ちょっと見ないうちに色々変わる+自分の理解が浅いせいで追いつけない

144デフォルトの名無しさん2021/06/29(火) 16:25:09.28ID:W3FYE8ZM
RustのIDEでおすすめを教えて

145デフォルトの名無しさん2021/06/29(火) 19:29:01.37ID:EbM9PL2b
VSCode+rust-analyzerが定番

146デフォルトの名無しさん2021/06/30(水) 01:32:52.11ID:kSD4a98e
bindgenって複雑なヘッダーだと全然駄目なんだなあ
殆どそれ目的でRustやってたのに

147デフォルトの名無しさん2021/06/30(水) 09:59:01.57ID:2LaR0NZ5
>>146
実際に使ってみて初めて分かる問題点だね。

148デフォルトの名無しさん2021/06/30(水) 22:36:50.05ID:Nj/xCjQN
>>146
CXXはどうですか?

149デフォルトの名無しさん2021/07/03(土) 10:43:55.27ID:6NDcSyYc
rust始めました!
ってゲームの方を始めてたネタをやろうと思ったけど
想像以上にクソゲー過ぎてダメだった
やっぱり言語の方がいい

150デフォルトの名無しさん2021/07/03(土) 16:18:59.47ID:VnJT/Tz5
検索するとゲームの方と言語の方が出てきてややこしい
Rust(ゲーム)は名前変えてくれ...

151デフォルトの名無しさん2021/07/03(土) 16:30:28.41ID:lPTKqMkr
それな
go(一般動詞)も名前を変えてくれ

152デフォルトの名無しさん2021/07/03(土) 16:48:51.41ID:VnJT/Tz5
GoはGolangって別名があるから問題ないけどRustに関してはRustLangとはあまり言わないのがなぁ

153デフォルトの名無しさん2021/07/03(土) 17:18:42.64ID:HAk/Aizq
まあそれはRustの問題ではないですが、クロス環境に問題を感じているなら、Haskellがお勧めですよ。
あわしろ氏がいつも言ってることですがね。

154デフォルトの名無しさん2021/07/03(土) 18:23:28.50ID:yvqGZDdm
rustlang言わない?

155デフォルトの名無しさん2021/07/03(土) 19:07:06.86ID:3WlrzvVf
そもそもオフィシャルのレポジトリ名がrust-lang/rustだし普通に言うのでは

156デフォルトの名無しさん2021/07/03(土) 19:51:08.37ID:VnJT/Tz5
言わなくはないけどRustLangよりはRustと呼ばれることのが多い気がする
GoだったらGo(golang)とかGolangとか言われることが多いけど

157デフォルトの名無しさん2021/07/03(土) 22:13:02.85ID:yvqGZDdm
単にgoよりgooglabilityが高いことのあらわれじゃね
別にそんなに困ったこと無いけどな

158デフォルトの名無しさん2021/07/03(土) 23:01:24.13ID:5pcVeoYl
ていうかGoはもうgolangに改名したほうがいいと思う
Goではとにかく名前がクソすぎる
そもそもなんかダサいし

159デフォルトの名無しさん2021/07/04(日) 00:56:25.25ID:KTwjVJIR
goはogle(いやらしい目で見る)という名前のデバッガとセットで売り出す予定だったけど
ogleがこけたから残念な名前だけが残ってしまった

160デフォルトの名無しさん2021/07/04(日) 01:51:19.90ID:1GGCqeGW
Rustってゲームなかったっけ?

161デフォルトの名無しさん2021/07/04(日) 05:17:25.91ID:pNIAvX41
あるからこまってる

162デフォルトの名無しさん2021/07/04(日) 09:10:12.70ID:1GGCqeGW
JuliaでAV女優ばっか出てくるのと一緒やな

163デフォルトの名無しさん2021/07/04(日) 09:10:48.09ID:FDfsH90c
たいていは rust + 別の単語 でググるけどゲームの情報が出てきて困ったことはあまりないかな

164デフォルトの名無しさん2021/07/04(日) 09:12:10.94ID:Ik+vLhuV
pythonってそう考えるとなかなかいいネーミング

165デフォルトの名無しさん2021/07/04(日) 09:13:21.27ID:1GGCqeGW
そういやRustはツイッター検索だとかなり厄介だったな

166デフォルトの名無しさん2021/07/04(日) 09:25:35.54ID:FDfsH90c
既存の名詞使うときは perl みたいにスペルに一ひねり加えるのが良いんだろうね
rust でやるのは難しいけど

167デフォルトの名無しさん2021/07/04(日) 17:06:20.02ID:DVzGg7Pn
>>166
pearlとしなかったのは既存言語が存在した偶然みたいだけどね

phpは某雑誌がよく引っ掛かってたな

168デフォルトの名無しさん2021/07/05(月) 22:26:57.75ID:GYdy1bNH
Rust とかGoとか固有名詞やめてほしいよね。。。

169デフォルトの名無しさん2021/07/06(火) 00:14:23.09ID:cmRSsVyO
固有名詞でない言語名...
「名前を言ってはいけないあの言語」みたいな名付けかな

170デフォルトの名無しさん2021/07/06(火) 00:37:05.95ID:GFPrEw7Y
既存の固有名詞じゃない方が珍しい気がする

171デフォルトの名無しさん2021/07/06(火) 07:26:35.07ID:SYh5jqXt
そう言う意味だとCとか最悪だな

172デフォルトの名無しさん2021/07/06(火) 09:07:51.28ID:qxjbHNhG
langを付けると意味が変わるしCは本当に検索ワードに迷う

173デフォルトの名無しさん2021/07/06(火) 10:07:00.27ID:t2+Z62DR
C++もtwitterでは検索できない。C#もだけど。
それは、わざとなんらかかの意図を持ってされていることかも知れない。
twitteの社長や技術者がC++が嫌いだとか。

174デフォルトの名無しさん2021/07/06(火) 11:00:10.66ID:cmRSsVyO
/ も無視されるし単純に記号が無視されるだけでしょ

175デフォルトの名無しさん2021/07/06(火) 11:33:36.74ID:GDULTuH0
つまりまたもやlispが最強だと判明してしまったわけたな

176デフォルトの名無しさん2021/07/06(火) 12:33:05.02ID:paV/EiqB
ガイジ度でRubyには勝てんだろ

177デフォルトの名無しさん2021/07/06(火) 13:48:45.02ID:t2+Z62DR
>>174
技術的には簡単に直せるのに直さないところに意図を感じる。

178デフォルトの名無しさん2021/07/06(火) 15:47:25.27ID:qxjbHNhG
技術的に簡単だと思うなら外部サービスとして提供してみたら?

179デフォルトの名無しさん2021/07/06(火) 17:48:26.50ID:W6OOwnvK
外部から伺い知れない部分について簡単に違いないと断言する人とは議論しとうない

180デフォルトの名無しさん2021/07/06(火) 17:56:26.40ID:luG13vJj
全文検索とか形態素解析を少しでもかじってたら簡単とは思えないはずなんだけどね。

181デフォルトの名無しさん2021/07/06(火) 18:02:06.64ID:t2+Z62DR
>>178
外部サービスとは?
内部の人がやるのは簡単でも、外部の人がやるのはとても大変。

>>180
俺は字句解析系はよくやっているので簡単に感じるが。

182デフォルトの名無しさん2021/07/06(火) 18:08:31.76ID:8bcWgGBz
人は陰謀論が大好きなんですよ

183デフォルトの名無しさん2021/07/06(火) 18:15:25.48ID:nSctAZgU
字句解析と形態素解析や全文検索はまったくの別物だろう

184デフォルトの名無しさん2021/07/06(火) 18:16:09.96ID:t2+Z62DR
陰謀論とかじゃなくて、壊したい相手に不利なようにするのがアメリカ流なんだよ。
卑怯な手口だが、卑怯という概念にはあの国には無いのだろう。
あの国の連中は、ことごとくそういう手口で生き残っているから、そのうち
技術の進歩が遅れてある時、がさっと負けだすかも知れないな、GAFAMも含めて。

185デフォルトの名無しさん2021/07/06(火) 18:17:03.75ID:t2+Z62DR
>>183
形態素解析などに入る前に、例えば、C++をcppと同一視してしまえばいいんだ。

186デフォルトの名無しさん2021/07/06(火) 18:20:48.86ID:M25Qh6q2
簡単に直せる
(計算量が増えたり既存機能に影響を与えたりするかもしれないけど)

ってことでしょ

187デフォルトの名無しさん2021/07/06(火) 19:17:37.60ID:luG13vJj
>>186
それを簡単と呼ぶのは研究とかラボの人間よね。

188デフォルトの名無しさん2021/07/06(火) 20:35:47.80ID:5M+Sovmm
字句解析と形態素解析の違いもわからないのはちょっと…

189デフォルトの名無しさん2021/07/06(火) 23:19:32.02ID:cmRSsVyO
まーたrustと関係ない話してる

190デフォルトの名無しさん2021/07/06(火) 23:35:07.67ID:qUsPK4G4
「また」って言うけど「いつも」の間違いだろ?

191デフォルトの名無しさん2021/07/07(水) 08:37:56.63ID:ICcjc0w9
>>184
で、c++を壊してtwitterにどんなメリットが?アホなの?

192デフォルトの名無しさん2021/07/07(水) 10:14:36.36ID:ifayQQT8
アホだと分かってるなら構うなよ

193デフォルトの名無しさん2021/07/07(水) 10:38:37.05ID:fRD7zTM6
https://lore.kernel.org/lkml/[email protected]/
panic問題は大部分解決されたみたい

194デフォルトの名無しさん2021/07/08(木) 01:55:46.25ID:qbgAaMCH
そういうのは形態素解析したあと、同義語辞書(シソーラス)で単語を正規化する作業になる。
形態素解析の段階で記号は除去しないとややこしくなるから記号入りの単語を使うのが悪いわな。

195デフォルトの名無しさん2021/07/09(金) 19:08:10.80ID:XWrdIq9z
ハッカーが使わない言語は流行らない。メモリ安全だけじゃ一部需要のみ

楽しい言語も流行らない。いつも趣味レベルの言語で終わる

196デフォルトの名無しさん2021/07/09(金) 19:58:26.11ID:/dpK029q
ハッカーって言葉久々に聞いた

197デフォルトの名無しさん2021/07/09(金) 20:07:52.69ID:vKrZ9ebb
自分のこと賢いと思ってそう

198デフォルトの名無しさん2021/07/09(金) 21:36:56.44ID:6sMTa3MH
流行で選ぶってアフィチューバーやアフィブロガーかな?

199デフォルトの名無しさん2021/07/10(土) 06:29:54.67ID:XPpA1ojF
一通り学習したつもりになったから、WebAPIで情報取得するプログラムでもいざ書いてみようと思ったら・・・・
いきなりreqwestのクレートでasync/awaitの壁があったぜ
これThe Bookのキーワードの項目にはあるものの、本編で出てきたっけ???
https://doc.rust-lang.org/book/appendix-01-keywords.html
ちょっと適当に書いてみた感じ、他言語と違ってawaitしたところでアンラップされないのかな・・・・・?全然わからん
これって何を見たら学習できるの?

200デフォルトの名無しさん2021/07/10(土) 07:10:52.64ID:hr5Pc4AR

201デフォルトの名無しさん2021/07/10(土) 08:40:15.75ID:FBIqRA7j
reqwest::blocking使えば?

202デフォルトの名無しさん2021/07/10(土) 09:30:24.80ID:GKhTMPF2
ぼこぼこDLしてウザ過ぎる

203デフォルトの名無しさん2021/07/10(土) 09:31:26.47ID:GKhTMPF2
x.py build したあと、x.py install したら、

また意味不明にボコボコビルドし始めたんだけど、


知恵遅れなの?

204デフォルトの名無しさん2021/07/10(土) 09:47:05.85ID:4hsXIyfP
そういう所は今後改善して欲しいわな

205デフォルトの名無しさん2021/07/10(土) 13:41:38.31ID:e+Cu97LZ
>>195
面白い観点だな。
楽しい言語も流行らないか・・・、なんか考えさせられる。

206デフォルトの名無しさん2021/07/10(土) 13:52:24.60ID:aG/WAOkt
>>199
ureq 使えよ

207デフォルトの名無しさん2021/07/10(土) 14:01:01.07ID:4hsXIyfP
ハッカー専用の言語ってあるの?

208デフォルトの名無しさん2021/07/10(土) 14:20:32.32ID:hyh546Qk
prolog

209デフォルトの名無しさん2021/07/10(土) 14:25:24.27ID:jayrPH8y
いつまで miri のトラブルを放置しておくの?

ゴミ言語

210デフォルトの名無しさん2021/07/10(土) 14:28:17.22ID:a84ckjUx
ハッカーって・・・なに?

211デフォルトの名無しさん2021/07/10(土) 14:44:49.05ID:e+Cu97LZ
unsafeモードが使えても、safeモードでのコード生成結果が予測できないのであれば
使うのは難しい。

212デフォルトの名無しさん2021/07/10(土) 14:53:04.04ID:SrgkCeWe
無駄な通信と監視と役立たずのゴミでツリーを汚すゴミ

213デフォルトの名無しさん2021/07/10(土) 16:15:47.34ID:9b6+aeFV
ハッカーは書くスピードと実行時間が重要だからnimとかが向いてそう
少なくともRustは絶対にハッカーの第一言語にならない

214デフォルトの名無しさん2021/07/10(土) 16:53:00.70ID:zdV39cNV
お前がそう思うんならそういうことでいいよ

215デフォルトの名無しさん2021/07/10(土) 17:38:05.35ID:nAGZi/ZP
ハッカーとか呼んでねえからキーボードでもしゃぶってろ

216デフォルトの名無しさん2021/07/10(土) 17:43:28.58ID:IKbPFXW0
最強言語議論スレでやれ

217デフォルトの名無しさん2021/07/10(土) 17:56:33.98ID:wJrCg/wx
犯罪者用言語とか使いたくないなあ

218デフォルトの名無しさん2021/07/11(日) 01:09:10.02ID:MzFRAytS
ハッカー != 犯罪者 がモダンな解釈だと思うんだが。
○にかけのお爺さんかな?

219デフォルトの名無しさん2021/07/11(日) 02:27:33.50ID:0Hcxwo3i
ロシア人ハッカーグループって言ったら
犯罪者っぽくね?

220デフォルトの名無しさん2021/07/11(日) 02:54:13.69ID:6/u0+cwV
イスラエル人ハッカーグループって言うと
なにか巨大な国際政治がらみの陰謀っぽい

221デフォルトの名無しさん2021/07/11(日) 03:33:22.44ID:PFbpUEa3
日本人ハッカーグループ
よわそう

222デフォルトの名無しさん2021/07/11(日) 03:47:16.72ID:OgOa7vqd
日本は、一人当りのGDPだと先進30カ国中最下位レベルだけど、純粋な頭脳線だと、
三位以内に入ることが良くある。

223デフォルトの名無しさん2021/07/11(日) 09:25:42.31ID:Z2zeAI0N
純粋な頭脳線

224デフォルトの名無しさん2021/07/11(日) 09:54:14.29ID:HGkeQify
>>199
Rustはasync/awaitを言語レベルでゼロコストでサポートする代わりに非同期ランタイムを別途用意する必要がある
これによりRustでは様々な非同期ランタイムを言語と独立に自由に作ることができる
例えば非同期ランタイムを自作することも当然できてfuturesクレイトをその部品として使うことができる

もちろん非同期ランタイムを自作せずとも既に様々なコミュニティから提供されているのでそれを使うこともできる
具体的には例えば最も使われているtokioなどのチュートリアルを見るのが良いかな
https://tokio.rs/tokio/tutorial

225デフォルトの名無しさん2021/07/11(日) 11:06:14.34ID:MzFRAytS
>>219-220
その考え方が古い。(というか最初から?)間違ってる。

ハッカー == 凄い奴 的な意図でしかないので
ロシアだろうがイスラエルだろうが某大陸だろうが
超エリートなんだろうなとしか思わない(事になってる)。
犯罪者はクラッカーと言って区別される(事になってる)。

区別しようと言い出したのは…(ry

226デフォルトの名無しさん2021/07/11(日) 12:38:13.92ID:8RaHq8wW
でも発端の>>195の「ハッカー」はホワイトかブラックかは知らんがセキュリティ関連の話ちゃうんか?

227デフォルトの名無しさん2021/07/11(日) 12:47:21.47ID:sDQUZcY3
>>225
モダンな解釈だと良いハッカー=ホワイトハッカー 悪いハッカー=ハッカーですね
あと老人ホームから抜け出してまで5chなんてしたら家族に迷惑かかりますよ
迷惑かけない内に尊厳死をおすすめします

228デフォルトの名無しさん2021/07/11(日) 12:48:22.75ID:BdwgI/w3
そんな高度な話だったんだ
小学生がうんこちんちんって罵倒してるようなものだと理解していた

229デフォルトの名無しさん2021/07/11(日) 15:23:07.49ID:MzFRAytS
>>227
> 悪いハッカー=ハッカー
では無いよ、と書いてる事が理解できないかな?

>>227 がどう思おうがどうでも良いけど
話が通じないことがある事くらいは理解しといた方が
身のためだぞ。

http://ja.m.wikipedia.org/wiki/ハッカ
迷惑かけない内に勉強し直す事お勧めておきます。

230デフォルトの名無しさん2021/07/11(日) 15:31:18.36ID:lbKLD5N+
相変わらずマウンター専用言語になっとるな

231デフォルトの名無しさん2021/07/11(日) 15:34:34.85ID:HtoAUPrm
正しい定義がどうだろうと>>195の意図なんかわからんのでどうでもいいうんこちんちん

232デフォルトの名無しさん2021/07/11(日) 16:25:58.47ID:SRU4khSo
仕様や実装のマイナーな機能を使って人を驚かせるのがハッカーだ、と思ってるのでは
Cのポインタ祭りとかLISPのマクロ生成マクロとかを好むのだ、と

233デフォルトの名無しさん2021/07/11(日) 16:31:55.44ID:rINaUnOH
クソどうでもいい

234デフォルトの名無しさん2021/07/11(日) 16:37:35.60ID:8jG+0fGV
ハッカーの定義はどうでも良いからせめてrustの何がダメかを語れよ

235デフォルトの名無しさん2021/07/11(日) 16:47:25.03ID:0Hcxwo3i
rustは文字列の扱いに難があるなあ
sjisのコンテンツとかマルチバイトのファイル名(WinだとUTF16?)の扱い方がよくわからん

236デフォルトの名無しさん2021/07/11(日) 16:48:48.06ID:lbKLD5N+
Non-Lexical Lifetimes が制御フローレベルなので実装をデバッグできるやつがほとんどいない。
c++と同じレベルの複雑さを有するようになってきている。
cargoのビルドシステムがあまりに強制的すぎる。
メモリを直接いじる必要のある効率的なアルゴリズムでは結局unsafeになる。
メモリ最適化の許す範囲があまりに非自明でcから呼ぶのは不安定すぎる。

237デフォルトの名無しさん2021/07/11(日) 17:06:54.98ID:vvFM5IKu
コンテナ類が実際にどのように格納されているかが分からないと言うのは、
それをunsafeで扱うのが難しくなってる。
どこでコピーが生じて、どこがmoveなのかも分かりにくいことがあるし。

238デフォルトの名無しさん2021/07/11(日) 17:08:44.89ID:vvFM5IKu
ライフタイムもちゃんと仕様が書いてないから、手探り状態で試さないといけないし
プログラムするのに時間が掛かる。
色々やっても結局、C/C++のような効率のよい方法を取ることは不可能な場合もあるし。

239デフォルトの名無しさん2021/07/11(日) 17:30:39.23ID:QonYN50D
素晴らしい言語ですね
カニかわいい

240デフォルトの名無しさん2021/07/11(日) 18:42:50.97ID:0Hcxwo3i
ときどき、Javaの検査例外みたいなやらかし感を感じる
厳密にしすぎると却って使いづらいみたいな

241デフォルトの名無しさん2021/07/11(日) 19:53:14.68ID:8jG+0fGV
Box<dyn Error>やanyhowやeyreを使えば良いのでは

242デフォルトの名無しさん2021/07/11(日) 21:00:56.13ID:lZiRxAj0
>>235
Windows 系以外のすべての言語は、UTF-8

だから、MSYS/MinGW でも、UTF-8以外でバグるので、
UTF-8以外を使っちゃいけない!

唯一バグらないのは、WSL。
Windows Terminal, VSCode のRemote WSL などで、

ls /mnt/c/Users/Owner/Documents/
と入力すると、日本語のフォルダ名も、正しく表示される

出力



たぶん、Windowsが変換しているのだろう

2432422021/07/11(日) 21:05:19.71ID:lZiRxAj0
WSL は一種のチート

ハイパーバイザーでLinux を起動して、
Linux側から、Windows側のドライブを見た時に、

UTF-8 以外の言語をUTF-8に変換する

まあ、漏れの推測だけど

244デフォルトの名無しさん2021/07/11(日) 21:46:26.10ID:0Hcxwo3i
>>242
そこに文句言われてもねー
要件に文句を付けるのはフェアじゃない

現実にUTF16でネーミングされたファイルがあって、
それにどう対応するかって話なんだけど

2452422021/07/11(日) 22:51:28.82ID:lZiRxAj0
だから、プログラマーの基本は、Windows 系など、UTF-8 以外を使わない事!
この大原則を守っていない人は、システムを作れない

システムには、ascii しか使えない!
これが大原則

246デフォルトの名無しさん2021/07/11(日) 22:51:54.52ID:3favf/XH
>>244
WinならOsStringのエンコーディングは普通にUTF-16だから何の問題もないと思うが
sjis扱いたいならencoding-rsとか
結局何に困ってるのかわからないと何とも言いようがない

247デフォルトの名無しさん2021/07/11(日) 22:52:47.14ID:g6LNT/Hh
Ruby外耳に構うなよ

248デフォルトの名無しさん2021/07/12(月) 00:42:25.80ID:Hp3EIfPo
じつはわしはRustはやったことなかったのだが、
これまでの経験上おそらく >>236 みたいな感じだろうなと想像してたら
ほんとうにそのとおりでワロタw
アホみたいに「安全ドグマ」に縛られるとたいがいそうなる

249デフォルトの名無しさん2021/07/12(月) 01:08:52.63ID:hS+nIw/n
>>245
プログラマーの基本! とか システムを作れない(キリッ とか言われても
既存のシステムがそうなってるんだという話
「システムには、ascii しか使えない!」とか言ったら、客に帰れと言われるだけ

>>246
sjisファイルを読み込みたい
でもチュートリアルにあるようにBufReaderは使えない
そりゃ読み込んだ後、変換処理したら何でもありでしょ
でも、ネイティブに処理できん?と思う
むしろ安全性にこだわる割に文字に対するこの雑さは何なの?と

250デフォルトの名無しさん2021/07/12(月) 01:27:11.82ID:j3ZM+094
論理的な問題点以前に、言語として見た目的な美しさも無いし、記述が
簡潔でもなければ直感的でもなく、無駄に長くなる。

2512422021/07/12(月) 01:50:03.57ID:7a0iIKMk
システムには、ascii しか使わないのは、Linux の基本

AWS でも、そう。
半角空白もバグるから、使わない

必ず、客から注意される。
日本語のファイル名・半角空白を使わないでと。
バグるから

例えば、5ch は、sjis だからバグだらけ。
; を書いていないのに、文字列の後ろに、; が付いてるとか

sjisとか、Windows以外では、どうしようもない

252デフォルトの名無しさん2021/07/12(月) 02:01:17.96ID:uNcygyrG
encoding-rsつかいにくい

253デフォルトの名無しさん2021/07/12(月) 02:17:50.78ID:MXdX1Uu3
>>249
バイト列としてVec<u8>に読んじゃえば後はCと一緒じゃん
それともlocaleとwchar_tフル活用したいという話?

254デフォルトの名無しさん2021/07/12(月) 02:37:38.72ID:hS+nIw/n
>>253
それでcrlfでsplitしろって?
なんて原始的な…

255デフォルトの名無しさん2021/07/12(月) 03:41:51.48ID:3p3WQ9hU
UTF-8(とchar用のUTF-32)以外滅んでほしいが、過去の遺産がそれに対応してないという現実的な問題...
まぁencoding_rsってクレート使って変換してやればヨシ

2562422021/07/12(月) 04:00:29.19ID:7a0iIKMk
>>242
に書いたみたいに、

sjis, UTF-16 などのWindows 用言語で、
唯一バグらないのは、WSL だけ

WSL でLinux側から、Windows側のドライブを見た時だけ、
日本語のファイル名を正常に変換できる

Windows Terminal, VSCode のRemote WSL などで使える

ひょっとして、Windows用言語を扱っていて、WSLを使っていないの?

257デフォルトの名無しさん2021/07/12(月) 09:20:21.53ID:fBGbiQ8q
>>249
変換せずに扱いたいのか?いまいちよくわからんが、既存の言語で理想的なやつってどれ?
Rustは文字列に関しては最もちゃんとしてる方だと思うけど

258デフォルトの名無しさん2021/07/12(月) 09:26:54.48ID:fBGbiQ8q
あ、あとascii/WSLおじさんは気にしなくていいと思うよ
少なくともRustにそんな制限はない
Cとかだとasciiに限定したい気持ちもわからなくはないけど

259デフォルトの名無しさん2021/07/12(月) 09:39:13.23ID:cIYVT4Ba
・ファイルシステム上のエンコーディング
・OSのAPIのエンコーディング
・言語のAPIのエンコーディング
・言語の文字列のエンコーディング
それぞれ独立だし変換しあってることをおじさんは理解していないと見える

260デフォルトの名無しさん2021/07/12(月) 09:40:16.32ID:cIYVT4Ba
最後2つは基本的に同じだけど

261デフォルトの名無しさん2021/07/12(月) 09:56:37.25ID:Jwa42/D9
>>255
でもUTF8は「ひらがな」ですら3バイトになるので困る。

262デフォルトの名無しさん2021/07/12(月) 11:12:15.24ID:k3eDnaJZ
>>256
へー WSL って言語だったんだωωω

263デフォルトの名無しさん2021/07/12(月) 11:13:38.78ID:k3eDnaJZ
>>260
違うよ

264デフォルトの名無しさん2021/07/12(月) 11:24:40.84ID:hS+nIw/n
>>257
どれが理想的というか、rustは特にめんどい気がした
fgetsが出来ればそれでいいんだが

265デフォルトの名無しさん2021/07/12(月) 12:42:05.71ID:4jaglyfV
>>261
最近だと何に困った?

266デフォルトの名無しさん2021/07/12(月) 12:58:50.09ID:Yne+2tk7
>>249
sjisを変換せずそのまま内部表現として標準的に扱うプログラミング言語って具体的に何?

もちろん全ての言語でバイト配列としては扱えるけどsjisにとってそれは無意味であり
先頭から全読みしないとsjisの1バイト目か2バイト目かすらわからない欠陥sjis仕様のためsjisそのまま使うことはないよね

仮に入力も出力もsjisなら内部表現もsjisのままにしてsjis処理関数いっぱい
書くのも見合うケースがあるかもしれないけど
入出力の片方がsjisでないならば他との変換必ず必要だから内部表現をsjisにこだわる意味はないよね

一方で内部表現として処理を無条件に簡単にしようとするとUTF32で1文字32bitにするしかないけど常にUTF32強制ではメモリが無駄すぎる
そこでメモリ上だけでなくファイルもネット通信も無駄を避けるためにUTF8を用いる
という当たり前の帰結になりRustもそうだけどこれの何が不満なの?

267デフォルトの名無しさん2021/07/12(月) 13:37:26.66ID:hS+nIw/n
>>266
いや、内部表現なんてどうだっていいんだって
utf8以外のテキストを使うとResult<Error>でぶっ飛ばされるのが面倒なの

268デフォルトの名無しさん2021/07/12(月) 13:41:52.17ID:Yne+2tk7
>>267
それはUTF8文字列として扱う関数を使うからそうなる
普通に生バイト列として扱う関数を呼べばよい
このへんは多くのプログラミング言語で同じ話

269デフォルトの名無しさん2021/07/12(月) 13:45:10.21ID:XKWfaP9x
>>264
fgetsで良いって言うなら単にVec<u8>で読むだけだと思うけど
エラー処理が面倒というならとりあえずunwrapしてればいいし
そういうので文字数がかさむのが嫌だというなら、Rustは合ってないんじゃないかな
Rustは基本的にソースコード上にいろいろ明記したい言語なので

270デフォルトの名無しさん2021/07/12(月) 14:07:37.33ID:hS+nIw/n
>>269
それって行の切り出し(改行までのsplit)って自分で書かなきゃだめ?

271デフォルトの名無しさん2021/07/12(月) 14:14:18.06ID:XKWfaP9x
>>270
それは書かないといけないね
たぶんRustが好きな人は「fgetsだと何が改行コードとして想定されてるのか分からなくて不安」
って人が多いんじゃないかな
実際Linux環境でCR改行のファイルをfgetsするとどうなるのかよく分からんし
そういうふうに処理系がうまくやってくれることを期待するならGoとかもほうが合っているかも

272デフォルトの名無しさん2021/07/12(月) 14:16:40.71ID:4WArcuIG
splitすればいいだけじゃなくて?

273デフォルトの名無しさん2021/07/12(月) 14:18:27.57ID:hS+nIw/n
うーん、Windowsでsjisファイル読み込むのってそんなにニッチなのか……

>>271
>たぶんRustが好きな人は「fgetsだと何が改行コードとして想定されてるのか分からなくて不安」
>って人が多いんじゃないかな

BufReaderがあるので、それはないかと

274デフォルトの名無しさん2021/07/12(月) 14:29:03.08ID:XKWfaP9x
>>273
read_lineはLF区切りって決まってるからそんなに気にならないけどな
fgetsはプラットフォーム依存じゃなかったっけ?
もう忘れてしまったけど

275デフォルトの名無しさん2021/07/12(月) 14:30:57.94ID:7o0jLcLl
これはRustの問題ではない
例えばスクリプト言語であるJavaScriptでもsjisファイルを読み込むにはNodeでも標準サポートはない
だから生バッファに読み込んで次にそのsjisを内部へ変換するという手順となる
いずれにせよ文字コード変換の一行が余分に入るだけでありどの言語でも大した問題ではない

276デフォルトの名無しさん2021/07/12(月) 14:31:19.34ID:hS+nIw/n
>>272
うん、それはそうなんだ>splitすればいい

でも、なんでこんなにしつこく聞いたかっていうと
最近の言語にこんな基本的な機能ないわけないだろ?と思ったからなんだ

確かに自分で書いたって大した処理じゃない
でも、一人ひとりがそんな原始的なコード書いてるの?
ありえない 標準で用意しとけやって

277デフォルトの名無しさん2021/07/12(月) 14:35:03.79ID:hS+nIw/n
>>275
文字コード変換だけなら文句は言わない
昔からMulitbyteToWideCharを噛ませるぐらいのことはやってたからね

278デフォルトの名無しさん2021/07/12(月) 14:40:47.93ID:XKWfaP9x
最近の言語としては標準ライブラリが小さいというのはあるね
代わりに外部ライブラリをたくさん使うという方針
今のケースならこれかな
https://crates.io/crates/bytelines

279デフォルトの名無しさん2021/07/12(月) 14:48:08.10ID:hS+nIw/n
>>278

おおっ! これ良さそうだね!
試してみる! サンキュー

280デフォルトの名無しさん2021/07/12(月) 14:48:41.98ID:hUBiSSyU
要はバイナリのsplitがあればいいんだろ
まあニッチだし標準には入りにくいだろうな

281デフォルトの名無しさん2021/07/12(月) 14:56:20.42ID:OFdOdpfq
>>265
ログ的なものや、テキストファイルが大きくなる。
開発中にはソースやバイナリを高頻度に単純コピーでバックアップしたいが、
そのとき、毎回毎回大きくなるのでディスクの無駄使いになる。

282デフォルトの名無しさん2021/07/12(月) 15:01:47.66ID:hS+nIw/n
>>281
それはもうutf8の問題じゃないんじゃないか?

283デフォルトの名無しさん2021/07/12(月) 15:08:46.48ID:wU8EXWL2
>>281
今さら何を言ってるんだ?
UTF-8が長いとか短いとか論争してたのは20世紀の過去の話であり今は2021年だ
UTF-9のエイプリルフールRFCが出たのですら16年前の2005年だ
既に20世紀に今後は世界中全てUTF-8で行くと方向が決まった

284デフォルトの名無しさん2021/07/12(月) 15:25:03.01ID:OFdOdpfq
日本語処理が僅かに遅くなる。

285デフォルトの名無しさん2021/07/12(月) 16:15:05.27ID:rb4auT/4
>>242
No.
Linux やら BSD やらでファイル名を UTF-8 と保証しているものはたぶん少数派だ。
ロケール設定で UTF-8 を選ぶのが多数派になっているのは疑いがないが、
システムとして保証しない分だけ Windows よりつらい。

286デフォルトの名無しさん2021/07/12(月) 16:35:47.66ID:OFdOdpfq
>>282
日本人そっちのけで勝手にアメリカ人が作った文字コード。
日本(と中国)だけが不利になった。

287デフォルトの名無しさん2021/07/12(月) 16:36:54.04ID:OFdOdpfq
最近でもJSは日本語の文字イベントがサポートされてない。
アメリカ中心。

288デフォルトの名無しさん2021/07/12(月) 17:25:47.35ID:+TTC9E1P
UTF-8の規格制定の時にはアジア圏も割と口出しだんではなかった?

289デフォルトの名無しさん2021/07/12(月) 17:31:04.46ID:XXt8kyyQ
余り上手く行ってなかったと聞いている。

290デフォルトの名無しさん2021/07/12(月) 17:47:35.65ID:msgpc4nf
>>287
日本語の文字イベントという意味不明なものは何だ?
日本語じゃない文字イベントというのも聞いたことないぞ

291デフォルトの名無しさん2021/07/12(月) 19:18:49.33ID:Yne+2tk7
sjisのfgets()相当の件だけど
標準のBufReaderのlines()で回すのは何が不満なんだっけ?

use std::error::Error;
use std::fs::File;
use std::io::{BufReader, BufRead};
use encoding_rs::SHIFT_JIS;
use encoding_rs_io::DecodeReaderBytesBuilder;

fn main() -> Result<(), Box<dyn Error>> {
 let file = File::open("sjis.txt")?;
 let reader = BufReader::new(DecodeReaderBytesBuilder::new().encoding(Some(SHIFT_JIS)).build(file));
 for line in reader.lines() {
  println!("utf8: {}", line?);
 }
 return Ok(());
}

292デフォルトの名無しさん2021/07/12(月) 19:44:27.20ID:XXt8kyyQ
>>290
nativeのWin32やMFCだと、IMEで日本語入力した時、WM_CHARで
SJISやUnicodeの文字コードを取得できるが、ブラウザ上のJSだと、
英字の範囲でしかそれに該当するイベント、つまり、IMEで
漢字やひらがなを打った結果を取得する文字イベントが無い。

293デフォルトの名無しさん2021/07/12(月) 19:46:32.99ID:NCQjfvng

294デフォルトの名無しさん2021/07/12(月) 20:38:52.08ID:hS+nIw/n
>>291
いいね!
取得した文字列をOsStringに変換しなくても
なぜかファイルパスとして正常に動作するし(UTF16じゃなくていいのか……)
encoding_rs標準になればいいのに

295デフォルトの名無しさん2021/07/12(月) 22:26:31.98ID:+ke1h7j2
encoding_rsが標準になって欲しい(stdに入って欲しい?)のはなぜ?

296デフォルトの名無しさん2021/07/12(月) 22:49:13.65ID:hS+nIw/n
>>295
・基本機能だから
・ロジックを標準化するため
・Cargo.tomlのdependancyに記述するのが面倒だから
特にバージョン指定

297デフォルトの名無しさん2021/07/13(火) 00:30:07.97ID:n/daahFD
>>296
stdに取り込む提案のRFC書いてみたら?

298デフォルトの名無しさん2021/07/13(火) 03:10:04.82ID:EtxXgsUj
>>293
中身を理解して無いくせに黙ってろ。

299デフォルトの名無しさん2021/07/13(火) 03:20:46.36ID:qEHxTKb1
www

300デフォルトの名無しさん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言語でも使えばいい

302デフォルトの名無しさん2021/07/13(火) 08:54:58.88ID:NU/mwW4g
>>301
「utf8以外を使う場合のやり方を標準化してほしい」って要望に対して
「utf8を使え」ってのは答えになってない

303デフォルトの名無しさん2021/07/13(火) 09:10:42.11ID:lb+vVVj1
今は多少議論の余地があっても、数年したら
「なんでstdにSJIS扱うライブラリ入ってるの? めったに使わないのにバカじゃねーの」
って言われるのが目に見えてる

304デフォルトの名無しさん2021/07/13(火) 09:14:58.89ID:n/daahFD
エンコーディング関連のコードは量が多いだろうから
あらゆるプログラムのコンパイル時間を増やしたりバイナリサイズを大きくしたりするだけの価値があるかという議論にはなりそう

305デフォルトの名無しさん2021/07/13(火) 09:17:07.48ID:NU/mwW4g
encoding_rsはSJISのためのライブラリじゃないでしょ

306デフォルトの名無しさん2021/07/13(火) 09:36:27.67ID:/A7/SyKa
Cとかだと依存ライブラリの導入が面倒すぎるから標準化してほしいというのもわかるが
Cargo.tomlに一行書くのが面倒と言われてもあまり共感は得られないんじゃないかな

307デフォルトの名無しさん2021/07/13(火) 11:03:30.55ID:pwZ9R0Fi
>>291
変換したくないって話じゃなかったの?

3082422021/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に書き加える今の方式で良い

312デフォルトの名無しさん2021/07/13(火) 13:23:53.20ID:EtxXgsUj
>>311
多数決で言えば漢字文化圏の方が人口が多い。
しかも母国語が漢字を使う。英語を母国語とする人口は三億人くらい。
漢字を母国語で使うのは15億人くらい。
漢字以外の多バイト文字を使う国まで入れたら70億人、つまり地球の95%異常
となる。英語の方が少数派。

313デフォルトの名無しさん2021/07/13(火) 13:23:53.20ID:EtxXgsUj
>>311
多数決で言えば漢字文化圏の方が人口が多い。
しかも母国語が漢字を使う。英語を母国語とする人口は三億人くらい。
漢字を母国語で使うのは15億人くらい。
漢字以外の多バイト文字を使う国まで入れたら70億人、つまり地球の95%異常
となる。英語の方が少数派。

314デフォルトの名無しさん2021/07/13(火) 13:40:25.49ID:NU/mwW4g
漢字とかもあるけど、例えばMIME64のデコードとか
エンコード・デコード処理の標準化と考えれば英語圏でもありかも

3152422021/07/13(火) 13:42:56.59ID:dtNqNBdW
日本語をユーザー名・ファイル名など、システムに使うのは、Windows の香具師だけ

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

もし、半角空白でも使えば、あちこちから怒りの声が届く。
システムがバグるから使うな!

316デフォルトの名無しさん2021/07/13(火) 13:46:44.21ID:NU/mwW4g
>>315
ここにいる人間はそんなことわかってるから、まあ落ち着け

3172422021/07/13(火) 13:46:50.24ID:dtNqNBdW
Linux のテレビの録画システムで、
日本語のテレビ番組名を、そのままファイル名にしていた香具師がいたけど、

バグって使えない

318デフォルトの名無しさん2021/07/13(火) 13:48:05.76ID:qZprVsAK
なんか変なのが居着いたな

319デフォルトの名無しさん2021/07/13(火) 14:21:53.19ID:Ooc6RI1Q
Rubyボットの活動範囲がさらに広がってきたな
よほど暇なんだろう

320デフォルトの名無しさん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 がいつものあいつだということもみんなしってる

323デフォルトの名無しさん2021/07/13(火) 16:16:17.73ID:QSkHhbzy
Windows ではプログラムをインストールするフォルダが Program Files となっているのは
パスが空白を含むくらいでおかしくなるようなカスなソフトを早めに発見するためなんよな。
パスが空白も漢字も含みうる仕様なのに対応してないソフトがあるならそのソフトがカスなだけじゃん。

今の時点で現実にそういうソフトがあるから仕方ないという論法だと
SJIS のデータがあるから仕方ないというのと言ってることは同じなわけで、
データが大事かソフトが大事かという点で軸が違うに過ぎない。

324デフォルトの名無しさん2021/07/13(火) 19:45:00.15ID:SMX4Ldwl
cmd「せやな」

325デフォルトの名無しさん2021/07/14(水) 11:14:54.14ID:eOdFkTAr
Windows 11は64-bitのみになるみたいだけど
Rustじゃ i686-pc-windows-gnu, i686-pc-windows-msvc はいつまでTier 1なんだろう?

326デフォルトの名無しさん2021/07/14(水) 11:43:09.28ID:eD4Wlw/y
>>325
32bit macがtier3落ちしたときはxcodeでコンパイルもできないし実行環境もないからって理由だったはず
同様にmsvcはMSがサポート切ってくればなくなるかもね
32bitアプリ自体が動かなくなるわけじゃなさそうだしgnuは大丈夫なんじゃないかな

327デフォルトの名無しさん2021/07/14(水) 13:27:24.91ID:BkkfMVAi
Win11はOSが32bitCPUでは動かないってだけで32ビットアプリはまだ動くのでは

328デフォルトの名無しさん2021/07/14(水) 13:35:34.15ID:FWHo5b9L
それであってる

329デフォルトの名無しさん2021/07/14(水) 16:08:27.83ID:bE2/aeQE
Win11は、16bitが公式では完全に動かなくなる


lud20210715191524
このスレへの固定リンク: http://5chb.net/r/tech/1623857052/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。

TOPへ TOPへ  

このエントリをはてなブックマークに追加現在登録者数177 ブックマークへ


全掲示板一覧 この掲示板へ 人気スレ | Youtube 動画 >50 >100 >200 >300 >500 >1000枚 新着画像

 ↓「Rust part11 」を見た人も見ています:
Rust part9
Rust part8
Rust Part5
Rust part10
Rust vs Go
Rust part6
Rust Part7
Ustream終了
Rust Part6
Busted Part.1
Rust part18
Rust part28
Rust part25
Rust part22
Rust part14
Rust part15
Rust part27
Rust part33
Rust part24
Rust part21
C++ vs Rust
Rust part31
Rust part17
Rust part20
Rust part30
Rust part13
Rust part29
Rust最強(仮)
Rust part16
Rust part23
Rust part26
加藤純一のRUST
Ustream Part8
Rustアンチスレ
Duelyst Part7
Duelyst Part8
mist survival
Wanderlust その7
CRUSTスレ Part.8
Duelyst Part.9
ご褒美Rust #3668
Lost Frequencies
CRUSTスレ Part.20
Dust memoryー贅沢編ー
BURST in パンク板
加藤純一のRUST!3
加藤純一のRUST!2
BEAT CRUSADERS 79
乙女@Custom Drive
Rustっていい言語なの?
Houston Rockets 68
Duelyst Part.12
Justin Timberlake#1
CRUSTスレ Part.13
CRUSTスレ Part.21
加藤純一、RUST実況
CRUSTスレ Part.19
CRUSTスレ Part.18
Illustrator総合 16
Android Studio 2
Rustレスバトル会場
Houston Rockets 64
Houston Texans Part6
CRUSTスレ Part.15
Justin Bieber Vol.4
14:40:47 up 22 days, 6:02, 0 users, load average: 63.54, 53.92, 44.68

in 0.031771183013916 sec @[email protected] on 111404