K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[2357] Re:インターネット上を流れるデータ構造の表現について
投稿者:mhash
2024/01/21 10:44:43

早速のご回答、ありがとうございます。 >>上記例にあげたUDPパケット構造の0~63目までのヘッダ構造の図は、一行32ビット幅で >>書かれているのですが、実際のサーバーやクライアントのメモリは8ビット1バイトの >>配列構造な訳なので、どう解釈したら良いのかネット検索で調べても良く分からなかった >>です。(インターネットではビッグエンディアンなので) > >「インターネットではビッグエンディアンなので」と書いておられるとおり、 >インターネット(TCP/IP)でポート番号やIPアドレスをやりとりする際は、 >ビッグエンディアンで表現するよう定められています。 >これをネットワークバイトオーダーと呼びます。 > >https://atmarkit.itmedia.co.jp/icd/root/72/116970472.html > >>私の仮の理解ですが、以下のようになると思って良いでしょうか? > >なので、これで合っています。 ありがとうございます。安心しました。 >ネットワークバイトオーダーという規定(デファクトですが)をご存じなくて >「どうやってバイトオーダーが違うかもしれないマシン間でデータをやり取り >しているのだろう?」という意図の質問なのかと思いましたが、 >「インターネットではビッグエンディアンなので」とあるのでそれはご存じのようで、 >これで回答になっておりますでしょうか? はい。TCP/IPではバイトオーダーがビッグエンディアンであることは理解していましたが TCPやUDPやらを検索して出てくる図の読み方が分からなかったので、そこの質問でした。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2356] Re:インターネット上を流れるデータ構造の表現について
投稿者:(ぱ)こと管理人
2024/01/21 09:17:34

>上記例にあげたUDPパケット構造の0~63目までのヘッダ構造の図は、一行32ビット幅で >書かれているのですが、実際のサーバーやクライアントのメモリは8ビット1バイトの >配列構造な訳なので、どう解釈したら良いのかネット検索で調べても良く分からなかった >です。(インターネットではビッグエンディアンなので) 「インターネットではビッグエンディアンなので」と書いておられるとおり、 インターネット(TCP/IP)でポート番号やIPアドレスをやりとりする際は、 ビッグエンディアンで表現するよう定められています。 これをネットワークバイトオーダーと呼びます。 https://atmarkit.itmedia.co.jp/icd/root/72/116970472.html >私の仮の理解ですが、以下のようになると思って良いでしょうか? なので、これで合っています。 ネットワークバイトオーダーという規定(デファクトですが)をご存じなくて 「どうやってバイトオーダーが違うかもしれないマシン間でデータをやり取り しているのだろう?」という意図の質問なのかと思いましたが、 「インターネットではビッグエンディアンなので」とあるのでそれはご存じのようで、 これで回答になっておりますでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2355] インターネット上を流れるデータ構造の表現について
投稿者:mhash
2024/01/21 05:14:31

題記の件、TCP/IPモデルに則ったネットワーク(インターネット)上で、特定のデータ構造(IPヘッダやTCPヘッダやUDPヘッダ、あるいは個別のファイルフォーマット等)がどのように各コンピュータの内部で表現されるのかお聞きしたいです。 具体例として、仮にインターネット上の各ホストが全て1バイト=8ビット(1オクテット)のマシンだったとして、たとえばUDPヘッダ(Wikipediaリンク: https://ja.m.wikipedia.org/wiki/User_Datagram_Protocolの「仕組み」-「パケット構造」の章を参照)ってどうメモリ上にマッピングされるのか?ということが分からないです。 上記例にあげたUDPパケット構造の0~63目までのヘッダ構造の図は、一行32ビット幅で書かれているのですが、実際のサーバーやクライアントのメモリは8ビット1バイトの配列構造な訳なので、どう解釈したら良いのかネット検索で調べても良く分からなかったです。(インターネットではビッグエンディアンなので) 私の仮の理解ですが、以下のようになると思って良いでしょうか? 0バイト目:「宛先ポート番号」の上位8ビット分を格納 1バイト目:「宛先ポート番号」の下位8ビット分を格納 2バイト目:「送信元ポート番号」の上位8ビット分を格納 3バイト目:「送信元ポート番号」の上位8ビット分を格納 4バイト目:「チェックサム」の上位8ビットを格納 5バイト目:「チェックサム」の下位8ビットを格納 6バイト目:「データ長」の上位8ビットを格納 7バイト目:「データ長」の下位8ビットを格納 初歩的な質問で恐縮ですが、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2354] Re:! isalnum(ch);
投稿者:トト
2024/01/09 12:02:14

こんな早くに返信して頂きありがとうございます。 11行目の波括弧を付け加えて頂き”読み飛ばしている感じ”がわかりました。 気持ちが晴れました。 ツッコミもありがとうございます。 周りにプログラミングする人がいなく、そのような会話をすることもない為、 自分だけ分かっていればと頭の中では『インスウ、インスウ・・・』、つい出てしまいました。 ご指摘ありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2353] Re:! isalnum(ch);
投稿者:(ぱ)こと管理人
2024/01/09 00:59:36

>はじめまして。 はじめまして。質問ありがとうございます。 >List 1-10 get_word.c内の >上記の!isalnum(ch)が(真)の為、20行目のbuf[len]=ch;には >入力(stdin)時に文字以外の記号などがあれば格納されしまうと思うのです。 英数字以外の記号などが来た場合、isalnum(ch)はfalseですから、 それに!を付けた「!isalnum(ch)」は真になります。 そして、「!isalnum(ch)」が真(かつファイルが終わらない)間、 11~12行目のループがぐるぐる回りますから、英数字以外の文字を読み飛ばすことになって、 17行目では「ここで,chには,単語の最初の文字が格納されている」ことになります。 ええと、11行目のwhile文について、波括弧を省略したのが誤解を招いたでしょうか。 10: /* 空白文字の読み飛ばし */ 11: while ((ch = getc(fp)) != EOF && !isalnum(ch)) { 12: ; 13: } これなら、読み飛ばしている感じがつかめるでしょうか。 ところで、細かいツッコミですみませんが、 >1-4-6「関数の因数として配列を渡す(つもり)」 正しくは「因数」ではなくて「引数」ですが、誤変換さておき、 「引数」の読みは「ひきすう」です。念のため。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2352] ! isalnum(ch);
投稿者:トト
2024/01/08 21:24:11

はじめまして。 c言語を学んでいる者です。 入門学習サイト内で『c言語ポインタ完全制覇』を紹介されていたので、併せて学んでいます。 5章「連結リスト版」では苦戦しましたが、新たなポインタの利用法を知ることができました。  只今、理解を深めるため再度、頭から読み進めています。 理解できてない箇所がいくつかあり自力で解決できず投稿しました。 << 質問 >> 1-4-6「関数の因数として配列を渡す(つもり)」 List 1-10 get_word.c内の 11行目 while((ch=getc(fp))!= && !isalnum(ch));で /*空白文字の読み飛ばし*/が出来る仕組みが理解できずに苦戦しています。 大変恐縮ですが解釈の仕方を教えて頂けたら幸いです。 上記の!isalnum(ch)が(真)の為、20行目のbuf[len]=ch;には 入力(stdin)時に文字以外の記号などがあれば格納されしまうと思うのです。 しかし、buf[len]=ch;には単語の最初の文字が格納され、 結果、プログラムの意図どおり単語のみが表示されます。 このようなレベルですみません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2351] Re:Re:Re:のおじさん問題を修正しました
投稿者:774RR
2023/12/11 12:34:23

あーあー、テステス。 元件名が Re:Re:Re なので一見治っていないようですが この発言分が Re:Re:Re:Re になっていないようなので修正済み確認っス。 お疲れ様です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2350] Re:Re:Re:のおじさん問題を修正しました
投稿者:(ぱ)こと管理人
2023/12/10 23:02:14

>>件名が Re:Re:Re のおじさんになるのは仕様のようですね。 修正しました。ご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2349] Re:Re:この掲示板について
投稿者:(ぱ)こと管理人
2023/12/09 02:07:23

>イヤンな spam (?) 投稿が無い分、今のトラフィックで十分幸せになれそうです。 >っていうか spam 投稿フィルタがちゃんと機能しているのでしょうか? 今のところテスト掲示板を含め、spamは消しています。 そんなに数は来ないのですが、何回かは来ています。 spam投稿フィルタは以前と同様NGワードをはじくだけで、spamが来るたびに そこに含まれるURLを登録しているだけなので、あまり聞いてないかと思います。 >件名が Re:Re:Re のおじさんになるのは仕様のようですね。 これはバグ、というか実装漏れですね。昔の私はいろいろちゃんと考えて作っていたようです。 この週末にでも直します……
[この投稿を含むスレッドを表示] [この投稿を削除]
[2348] Re:この掲示板について
投稿者:774RR
2023/12/08 13:23:46

修正済み確認しました。 イヤンな spam (?) 投稿が無い分、今のトラフィックで十分幸せになれそうです。っていうか spam 投稿フィルタがちゃんと機能しているのでしょうか? 件名が Re:Re:Re のおじさんになるのは仕様のようですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2347] Re:Re:この掲示板について
投稿者:(ぱ)こと管理人
2023/12/08 01:29:55

>top page 中 google 検索ボタンのリンクが http:// なので Chrome 120.0.6099.63 で >サイト情報を確認すると「完全には保護されていません」の旨表示されます。 ありがとうございます。Firefoxでも警告が出ました。修正いたしました。 せっかく掲示板を作り直したのに誰も書きこんでくれなくて悲しくなっていたので、 その点でもありがとうございました……
[この投稿を含むスレッドを表示] [この投稿を削除]
[2346] Re:この掲示板について
投稿者:774RR
2023/12/06 12:45:20

今頃気づいた・・・ top page 中 google 検索ボタンのリンクが http:// なので Chrome 120.0.6099.63 でサイト情報を確認すると「完全には保護されていません」の旨表示されます。掲示板のページまで来るとボタンが無いので「この接続は保護されています」になる模様。 証明書の確認は MITM 串が入っている関係で会社からでは不可能でした。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2345] この掲示板について
投稿者:(ぱ)こと管理人
2023/10/07 21:35:10

移転前の掲示板は2005年頃にPHPで作ったものでしたが、今回、共用のレンタル サーバからVPSに乗り換えたので、言語も自由に選べるので、PHP版は捨てて Java + Spring boot + PostgreSQLで作り直しました。 拡張子は.phpになっていますが、これは以前の掲示板へのリンクを生かすためで、 中身はPHPではありません。 仕様もところどころ変わっています。投稿の手数がちょっと減りました。 cssがキャッシュに残っていると中途半端に効いて表示が崩れるので、 Ctrl + F5とかで強制リロードしてください。 過疎掲示板ですが、今後ともよろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2344] Re:掲示板の移行作業を開始します
投稿者:(ぱ)こと管理人
2023/10/07 19:48:31

>この掲示板のデータを移転先サーバに移行します。 >この後に何を書いても、移行対象になりませんのでご注意ください。 移行終了しました(と、新掲示板から書き込む)。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2343] 掲示板の移行作業を開始します
投稿者:(ぱ)こと管理人
2023/10/07 19:32:52

この掲示板のデータを移転先サーバに移行します。 この後に何を書いても、移行対象になりませんのでご注意ください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2342] 近々サーバを移転します
投稿者:(ぱ)こと管理人
2023/10/05 01:19:03

トップページにも書きましたが、本Webサイトを置いているレンタルサーバの業者が 事業を撤退するとのことで、近々サーバを移転します。 ドメインは変わらないので閲覧者の皆様に特に影響はないと思いますが、 DNSの切り替えがうまくいかなかったり、当方でサーバを再起動したりで 一時的に不安点になる可能性はあります。 あしからずご了承くださいませ。 移転予定日…10/7~10/9の三連休のどこか この掲示板は、過去投稿のデータを含めて新サーバに移行する予定です。 直前に「今から移行する」旨書き込みますので、その書き込みまでの投稿は 新サーバに移ります。 (……のつもりですが、何しろ私のやることなので、とんでもないポカを やらかす可能性もあります) よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2341] Re:関数の戻り値について
投稿者:mhash
2023/08/05 14:51:51

ご返事ありがとうございます。 >できない理由は特にないので、普通にできます。以下、掛け算九九の表をmalloc()で >確保するプログラムです(これは「普通」には見えない、というならまあもっともですが)。 サンプルコードまで示して回答していただきまして大変感激です。ありがとうございます。 私が試したときは『int (*alloc99(void))[9]』の部分を『(int(*)[9]) alloc99(void)』のように書いてしまっていました(キャストの構文と混同していたようです)。確かにお見せいただいたコードなら「配列へのポインタを関数」の宣言になっていますね。 >ただ、 > >>"func()[0].hoge"みたいなことがやってみたかったのですが、C言語では無理なのでしょうか。 > >上記のやってみたいことからすると、そもそもやりたいことは「配列へのポインタ」を >返すことではないようにも思えます。"func()[0].hoge"と書きたいのなら、やりたいことは、 >「構造体へのポインタ」を返すことではないでしょうか。 これはまったくご指摘の通りです。 投稿してから気づいたのですが、訂正前に回答が来てしまってお恥ずかしい限りです……
[この投稿を含むスレッドを表示] [この投稿を削除]
[2340] Re:関数の戻り値について
投稿者:(ぱ)こと管理人
2023/08/05 14:19:52

>C言語では、「配列へのポインタ」は関数の戻り値にはできないのでしょうか? >VisualC++でやってみたのですが、無理でした。 できない理由は特にないので、普通にできます。以下、掛け算九九の表をmalloc()で 確保するプログラムです(これは「普通」には見えない、というならまあもっともですが)。 #include <stdio.h> #include <stdlib.h> int (*alloc99(void))[9] { return malloc(sizeof(int) * 81); } int main(void) { int (*array99)[9]; int i, j; array99 = alloc99(); for (i = 1; i < 10; i++) { for (j = 1; j < 10; j++) { array99[i - 1][j - 1] = i * j; } } for (i = 1; i < 10; i++) { for (j = 1; j < 10; j++) { printf("\t%d", array99[i - 1][j - 1]); } printf("\n"); } } ただ、 >"func()[0].hoge"みたいなことがやってみたかったのですが、C言語では無理なのでしょうか。 上記のやってみたいことからすると、そもそもやりたいことは「配列へのポインタ」を 返すことではないようにも思えます。"func()[0].hoge"と書きたいのなら、やりたいことは、 「構造体へのポインタ」を返すことではないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2339] 関数の戻り値について
投稿者:mhash
2023/08/05 02:15:14

C言語では、「配列へのポインタ」は関数の戻り値にはできないのでしょうか? VisualC++でやってみたのですが、無理でした。 "func()[0].hoge"みたいなことがやってみたかったのですが、C言語では無理なのでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2338] Re:ポインタ完全制覇(第2版) p75 *pのループ中の計算
投稿者:Okamoto
2023/07/08 17:26:51

ご返信いただきまして、ありがとうございます。すっきり理解することができました。 ざっと読んでは細かく読むというのを繰り返している状況です。 また疑問点があった際には質問させていただければと思います。 今後ともよろしくお願いいたします。 >はじめまして。 > >>学生時代に逃げ出したポインタへ改めて向き合おうと思い、ポインタ完全制覇を読ませていただいております。 >>読み進める中で、こちらの投稿と同じところでつまずいてしまったので質問させていただきます。 >>*pという記法の場合、p+1要素のサイズという足し算が各繰り返しごとに行われていると解釈したのですが、 >>掛け算はどの段階で行われているのでしょうか。 > >まず、array[i]の記法の場合、array[i]を使うごとに「array + (i * 1要素のサイズ)」に >相当するアドレス計算を行う必要があります。 >*pの記法の場合、ループの1回のくり返しの中ではpは動かないので、上記のような >アドレス計算を何度も行う必要はない(だから最適化をしないコンパイラなら速くなる)、 >というのが該当の記述の趣旨だったのですが、 > >p.75の該当の記述は以下のようになっていて、 >「*pがループの中に何度出現しても、掛け算と足し算はループの終わりの >1回だけで済みます。」 >*pの記法の場合、各ループの末で行うのはp++であって、毎回ひとつずつ進めるのであれば、 >確かに掛け算は不要です。 > >・array[i]記法では、ループ内にarray[i]が何度も出てきたら、その数だけ掛け算と足し算を行う。 >・*p記法では、*pが何度出てきても、そういう計算は1回でよい。 >ということを言いたかったのですが、「そういう計算」の中身が違いますね。 >本の記述が誤りだと思います。 > >22年以上前の初版本からこの記述はあるのですが、この誤りは見つかっていませんでした。 >ご指摘ありがとうございました。正誤表に入れさせていただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2337] Re:ポインタ完全制覇(第2版) p75 *pのループ中の計算
投稿者:(ぱ)こと管理人
2023/07/08 16:06:07

はじめまして。 >学生時代に逃げ出したポインタへ改めて向き合おうと思い、ポインタ完全制覇を読ませていただいております。 >読み進める中で、こちらの投稿と同じところでつまずいてしまったので質問させていただきます。 >*pという記法の場合、p+1要素のサイズという足し算が各繰り返しごとに行われていると解釈したのですが、 >掛け算はどの段階で行われているのでしょうか。 まず、array[i]の記法の場合、array[i]を使うごとに「array + (i * 1要素のサイズ)」に 相当するアドレス計算を行う必要があります。 *pの記法の場合、ループの1回のくり返しの中ではpは動かないので、上記のような アドレス計算を何度も行う必要はない(だから最適化をしないコンパイラなら速くなる)、 というのが該当の記述の趣旨だったのですが、 p.75の該当の記述は以下のようになっていて、 「*pがループの中に何度出現しても、掛け算と足し算はループの終わりの 1回だけで済みます。」 *pの記法の場合、各ループの末で行うのはp++であって、毎回ひとつずつ進めるのであれば、 確かに掛け算は不要です。 ・array[i]記法では、ループ内にarray[i]が何度も出てきたら、その数だけ掛け算と足し算を行う。 ・*p記法では、*pが何度出てきても、そういう計算は1回でよい。 ということを言いたかったのですが、「そういう計算」の中身が違いますね。 本の記述が誤りだと思います。 22年以上前の初版本からこの記述はあるのですが、この誤りは見つかっていませんでした。 ご指摘ありがとうございました。正誤表に入れさせていただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2336] Re:ポインタ完全制覇(第2版) p75 *pのループ中の計算
投稿者:Okamoto
2023/07/06 21:57:11

学生時代に逃げ出したポインタへ改めて向き合おうと思い、ポインタ完全制覇を読ませていただいております。 読み進める中で、こちらの投稿と同じところでつまずいてしまったので質問させていただきます。 *pという記法の場合、p+1要素のサイズという足し算が各繰り返しごとに行われていると解釈したのですが、掛け算はどの段階で行われているのでしょうか。 ご回答よろしくお願いします。 >はじめまして。読んでいただきありがとうございます。 > >>array[i]は、ループ中に出現するたびごとに「array + (i * 1要素のサイズ)」に相当する >>アドレス計算を行うというのは理解できますが、*pでも「p + (p++ごとに1要素のサイズ)」 >>に相当するアドレス計算を行っているように思えます。「掛け算と足し算はループの終わり >>の1回だけ」という意味をご教示いただけるとありがたいです。 > >「ループの終わりの1回だけ」というのは、たとえばループが100回回ったとして、 >各繰り返しの最後に1回、という意味です。つまり、100回ループが回れば、 >「p + 1要素のサイズ」という計算は100回は行います。 >ただし、ループの中に、array[i]が5回出てくるとすれば、最適化をろくにやらない >コンパイラなら、100回ループが回った時に「array + (i * 1要素のサイズ)」という計算は >500回行われます。それが100回で済むなら、*pの方が高速になるでしょう。 >コメントで「array[i]は、何度も登場する」と書いてあるのはそういう意図です。 > >これで回答になっていますでしょうか? > >
[この投稿を含むスレッドを表示] [この投稿を削除]
[2333] Re:誤植 ポインタ完全制覇 P363
投稿者:TK
2023/05/23 20:27:58

>これですが、規格書(JIS X3010:2003)の「6.7.8 初期化」に以下の記載があります。 ご指摘ありがとうございます。このような書き方が可能なことを知りませんでした…。 勉強になりました。 良く調べてからご連絡すべきでした。失礼しました。 ご対応もありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2332] Re:誤植 ポインタ完全制覇 P363
投稿者:(ぱ)こと管理人
2023/05/22 19:53:48

お待たせしました。 >「C言語 ポインタ完全制覇」P363 List 6-4 designated_initializer.c の 20 行目は以下ではないでしょうか。 >  誤 Hoge hoge = {.b = 3, .c = 5, {[3] = 10, 11, 12}}; >  正 Hoge hoge = {.b = 3, .c = 5, .array = {[3] = 10, 11, 12}}; これですが、規格書(JIS X3010:2003)の「6.7.8 初期化」に以下の記載があります。 >指示がない場合,現オブジェクト中の部分オブジェクトを,現オブジェクトの型に従う順序で >初期化する。すなわち,配列要素は添字の昇順で初期化し,構造体メンバは宣言の順で初期化し, >共用体では最初の名前付きメンバを初期化する(127)。 >一方,指示が存在する場合,それに続く初期化子を使って要素指示子が示す部分オブジェクトを >初期化する。そして要素指示子で示される部分オブジェクトの次の部分オブジェクトから >順に初期化を続ける(128)。 「要素指示子で示される部分オブジェクトの次の部分オブジェクトから順に初期化を続ける」 とあるので、書き方としては正当だと思います。gccに-std=c99 -pedanticオプションを付けて 警告もなく実行できました。 ただ、説明不足なのは否めませんので、補足を上げようと思います。 ご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2331] Re:誤植 ポインタ完全制覇 P363
投稿者:(ぱ)こと管理人
2023/05/20 02:35:22

>「C言語 ポインタ完全制覇」P363 List 6-4 designated_initializer.c の 20 行目は以下ではないでしょうか。 >  誤 Hoge hoge = {.b = 3, .c = 5, {[3] = 10, 11, 12}}; >  正 Hoge hoge = {.b = 3, .c = 5, .array = {[3] = 10, 11, 12}}; ご報告ありがとうございます。 すみません、この週末は用事がありまして、対応は月曜とさせてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2330] 誤植 ポインタ完全制覇 P363
投稿者:TK
2023/05/18 17:06:59

「C言語 ポインタ完全制覇」P363 List 6-4 designated_initializer.c の 20 行目は以下ではないでしょうか。   誤 Hoge hoge = {.b = 3, .c = 5, {[3] = 10, 11, 12}};   正 Hoge hoge = {.b = 3, .c = 5, .array = {[3] = 10, 11, 12}};
[この投稿を含むスレッドを表示] [この投稿を削除]
[2329] Re:感謝
投稿者:(ぱ)こと管理人
2023/04/06 01:25:33

>64才のに元ソフト系エンジニアです。 はじめまして。拙著を読んでいただきありがとうございます。 >やっと時間が出来たので、やはり買ったままになっていた前橋さんの本(2009年の初版)を >読み始めました。ネットに公開されている前橋さんのコードをエディタで関数やデータ型を >探したり眺めたりしながら、前橋さんの本を読み進めています。 この本は日本では初版しかないのですが、どういうわけか中国で評判が良いようで(中国語版が出ています)、中国人の中学生から(英語で)質問メールをもらったりしました。返信の英作文には苦労しましたが、読まれている実感があって嬉しいものです。 Diksamは、書籍出版の後もごそごそいじっていたのですが、追加機能分が結局形にならず放置状態になっているのが心苦しく思っています。 私も、定年退職でもしましたら、趣味プログラムに没頭したいものだと思っております。 >「もうひとつのプログラミング言語を作る」のような次回作を期待しています。 規模からすればDiksamよりはるかに小さいですが、静的型付けのバイトコード実行型言語として、Samplanというおもちゃ言語を作っています。 https://kmaebashi.hatenablog.com/entry/2021/10/31/211618 実用性はまったくないと思いますが、yaccに頼らず手書きの再帰下降パーサで作った言語です。よろしければこちらもどうぞ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2328] 感謝
投稿者:
2023/04/04 11:21:17

64才のに元ソフト系エンジニアです。 在職中はマルチメディア関係のシステムの研究、開発、市場開発、プロジェクト管理などをやっていました。コンパイラには学生時代から関心があり、AhoとUllumanの本を買ったりしましたが、眺めるだけで読み進めることなく定年を迎えました。 やっと時間が出来たので、やはり買ったままになっていた前橋さんの本(2009年の初版)を読み始めました。ネットに公開されている前橋さんのコードをエディタで関数やデータ型を探したり眺めたりしながら、前橋さんの本を読み進めています。 Cは学生時代から30才くらいまでコードを書いていたので分かっているつもりでしたが、結構怪しくて本を参照しながらですが。 やっとcrowbarが終わって、これからDiksamです。 前橋さんの巧妙な語り口に助けられ、補足なども楽しみながら、昔に戻って楽しい時間を過ごしています。Pascalのgotoにラベルが書けない理由、ヘッダファイルをパブリックとプライベートに分ける手法、不完全型の技法などはオールドプログラマには新鮮でした。 「もうひとつのプログラミング言語を作る」のような次回作を期待しています。 それまでになんとかDiksamも読了しておきますので。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2327] Re:入力時のバリデーションについて
投稿者:mhash
2022/11/03 14:18:41

返信が大変遅れまして申し訳ありません。 丁寧にご回答頂きましてありがとうございます。 >まず、「入力時のサニタイズ」と「入力時のバリデーション」は違う話ですよね。 >リンク先の記事を書いている大垣さんも、「入力時のサニタイズ」は擁護していないと >思います。 そうですよね。勝手に改変したものをそのまま後に渡しているのは。 >「入力時のバリデーション」は、変な入力は入力の時点でエラーにして後ろに流さない >わけですが、これは別段セキュリティ関係なく、ユーザの入力ミスに備えてやるべき >ことですし、その要件はアプリケーションの仕様に依存します。 >もちろん、電話番号欄にシングルクォートとか入力されたらエラーにすればよいですし、 >そうすることが結果的にセキュリティに資することもあると思います。 入力時のバリデーションはあくまでも「仕様の問題」ということですね。 >入力時バリデーションは、 >・そもそも要件としてバリデーションできないケースが(かなり)ある。 >・入力から、DBとか、再度画面に表示されるところまでには、プログラム的に > 長い経路があり、「セキュリティのために」狙ってバリデーションするのは > 実際には困難。 > >という問題があります。そこで、入力時バリデーションはセキュリティ対策としては >「あてにできる」ものではない、と私は思います。 入力時バリデーションがセキュリティに有効なこともあるのはあくまで結果論ということですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2326] Re:入力時のバリデーションについて
投稿者:(ぱ)こと管理人
2022/10/30 15:38:35

>kmaebashiさんが『「サニタイズ言うなキャンペーン」について、私の解釈』や、 >著書でも述べられている、「SQLやHTML等で特別な意味を持つ文字列のエスケープは、 >入力時ではなくそれが外部に出力される直前に行うべき」という主張は納得できる >ものだと私も思います。 >ただ、以下リンク先のページを見ると、CWE-20等の国際的なセキュリティ標準でも >入力時のチェックを奨励しているように思えまして、ちょっと混乱しています。 >https://gihyo.jp/dev/serial/01/php-security/0045 >「ユーザーからの入力はどんな文字列でも扱えるべきだが、システム内の各階層では、 >メソッドの引数チェックなりをしっかりやるように」との意味合いなのでしょうか? まず、「入力時のサニタイズ」と「入力時のバリデーション」は違う話ですよね。 入力時にサニタイズ(無害化)するということは、無害化したその入力を後ろに 流してしまうわけです。実際、当時のPHPのmagic quoteはそんな仕組みでした。 これはどう考えてもおかしいわけで、今はPHPのmagic quoteは廃止されましたし、 リンク先の記事を書いている大垣さんも、「入力時のサニタイズ」は擁護していないと 思います。 「入力時のバリデーション」は、変な入力は入力の時点でエラーにして後ろに流さない わけですが、これは別段セキュリティ関係なく、ユーザの入力ミスに備えてやるべき ことですし、その要件はアプリケーションの仕様に依存します。たとえばこの掲示板の 本文は、シングルクォートだろうがHTMLタグだろうが通さなければいけないでしょう。 もちろん、電話番号欄にシングルクォートとか入力されたらエラーにすればよいですし、 そうすることが結果的にセキュリティに資することもあると思います。 入力時バリデーションは、 ・そもそも要件としてバリデーションできないケースが(かなり)ある。 ・入力から、DBとか、再度画面に表示されるところまでには、プログラム的に  長い経路があり、「セキュリティのために」狙ってバリデーションするのは  実際には困難。 という問題があります。そこで、入力時バリデーションはセキュリティ対策としては 「あてにできる」ものではない、と私は思います。 徳丸浩さんの記事: もう入力値検証はセキュリティ対策として *あてにしない* ようにしよう https://tumblr.tokumaru.org/post/55393403591/%E3%82%82%E3%81%86%E5%85%A5%E5%8A%9B%E5%80%A4%E6%A4%9C%E8%A8%BC%E3%81%AF%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E5%AF%BE%E7%AD%96%E3%81%A8%E3%81%97%E3%81%A6-%E3%81%82%E3%81%A6%E3%81%AB%E3%81%97%E3%81%AA%E3%81%84-%E3%82%88%E3%81%86%E3%81%AB%E3%81%97%E3%82%88%E3%81%86 半面、入力バリデーション(と静的な型付け)で実際の攻撃を防げるケースもかなり あるとも言われてはいて、たとえばOWASPの Application Security Verification Standard 4.0には以下の記述があります。 https://owasp.org/www-pdf-archive/OWASP_Application_Security_Verification_Standard_4.0-en.pdf > Properly implemented input validation controls, using positive whitelisting > and strong data typing, can eliminate more than 90% of all injection attacks. > Length and range checks can reduce this further. ホワイトリストと静的型付けによる適切な入力バリデーションでインジェクション攻撃の 90%以上が防げるとあります。 大垣さんと徳丸さんとのこの手の議論は長くて、嫌気がさすほどですが(最終的に、 徳丸さんの方が、(おそらくは呆れ果てて)議論を放棄している)、 https://ockeghem.hatenablog.jp/entry/20111226/p1 https://tumblr.tokumaru.org/post/55587596019/%E5%8B%9D%E6%89%8B%E3%81%AB%E8%A7%A3%E8%AA%AC%E5%A4%A7%E5%9E%A3%E6%B5%81%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%85%A5%E9%96%80 入力時バリデーションが結果的にセキュリティ対策になることは徳丸さんは 一切否定していないので、どうもこの「議論」は食い違っているように私には見えます。 そもそも徳丸さんは、OWASP Japanアドバイザリーボードという立場の方なので、 OWASP含め、「国際的なセキュリティ標準」が何を言っているのか知らないわけはないですし。
[この投稿を含むスレッドを表示] [この投稿を削除]