K.Maebashi's BBS

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

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

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

[2416] Re:kmaebashi.comが落ちていました
投稿者:(ぱ)こと管理人
2024/11/24 10:32:50

>何かが意図的にApacheをgraceful shutdownしようと >したのでしょうが、そこまでは追えていません。。 dnf historyで確認すると、11/20 06:41にdnfがかかった形跡はあるので、 それだと思うのですが、dnfで更新されたときはメールが飛ぶような設定にしてある はずが、このメールが来てないんですよねえ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2415] Re:kmaebashi.comが落ちていました
投稿者:(ぱ)こと管理人
2024/11/22 22:41:41

11/20 06:44:07に、ApacheがSIGWINCHを食らってシャットダウンしていたようです。 httpd/error_log:[Wed Nov 20 06:44:07.796734 2024] [mpm_event:notice] [pid 253266:tid 253266] AH00492: caught SIGWINCH, shutting down gracefully SIGWINCHというのはその名の通り端末のウインドウサイズを変えたときのシグナルで、 lessだのが表示を調整するために使うものですが、 Apacheはシグナルが足りないからってこれをgraceful shutdownに使っているらしい。 とはいえ私のサーバのApacheはバックグラウンドで動いているので、真の意味の SIGWINCHを食らうはずはなく、何かが意図的にApacheをgraceful shutdownしようと したのでしょうが、そこまでは追えていません。。 アクセスログを見ても11/20 06:43:58を最後に途切れています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2414] Re:kmaebashi.comが落ちていました
投稿者:(ぱ)こと管理人
2024/11/22 00:17:30

どうもです。いつもありがとうございます。 >症状的には DNS ないしは DDNS が落ちてた / 契約切れなどにより名前解決できて >なかったと見ました。 Apache HTTPD 再起動で直ったとはちょっと思えないです。 >その際に DNS/DDNS 類も再起動していたのでは? 「名前解決できてなかった」というのはkmaebashi.comの名前が解決できていなかった のでは、ということでしょうか? 当日の朝、WebサイトはつながりませんでしたがSSHでログインすることはできていて、 SSHでログインする際は % ssh kmaebashi.com と打っていたので、名前解決はできていたと思います。 Apache再起動で直ったのでやはり何らかの原因でApacheが落ちていたのだと思いますが、 ここ数日ちょっとどたばたしているので週末に確認します。現状、何時から落ちていた のかさえ把握しておりませんので。 apache再起動時はTLS秘密鍵のパスフレーズを聞かれたので、それを入れない単なる OS再起動で復旧しなかったのはそのせいだと思いますが。 出勤前であわてていたとはいえ、せめてもうちょっとスクリーンショット等残しておく べきでした。 >んで、証明書期限切れエラーであってもメールは届くわけですが DNS エラーだと >メールも届かないわけですよね。一読者としてはそういう場合にどうやれば管理人に >連絡取れるんですかね>ネットワーク詳しい人? まあ、私の場合は、kmaebashi.comでメールは受け取っておらず公式のメールアドレスは Niftyにあるわけですが、kmaebashi.comが落ちてたらそのアドレスを見つけるのも 難しい、というのはあるかもしれません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2413] Re:kmaebashi.comが落ちていました
投稿者:774RR
2024/11/21 11:12:08

症状的には DNS ないしは DDNS が落ちてた / 契約切れなどにより名前解決できてなかったと見ました。 Apache HTTPD 再起動で直ったとはちょっと思えないです。その際に DNS/DDNS 類も再起動していたのでは? んで、証明書期限切れエラーであってもメールは届くわけですが DNS エラーだとメールも届かないわけですよね。一読者としてはそういう場合にどうやれば管理人に連絡取れるんですかね>ネットワーク詳しい人?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2412] kmaebashi.comが落ちていました
投稿者:(ぱ)こと管理人
2024/11/20 08:11:49

SSHでは入れたのでサーバ自体が落ちていたわけではなさそうですが、 朝で時間もないのでサーバごと再起動、それでもWebページが見えないので Apacheを再起動したら復活したようです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2411] Re:伸長方向?
投稿者:(ぱ)こと管理人
2024/11/07 00:31:44

>(1) char=16bit / short=16bit / int=16bit / long=32bit > C 言語仕様書 ISO/IEC 9899:1999 6.5.3.4 が sizeof(char)==1 を要求しているので > sizeof(char)==1 / sizeof(short)==1 / sizeof(int)==1 / sizeof(long)==2 となるとCHAR_BITが16で、malloc(1)で取れるのは16ビットで、となりますかね。 マイコンだと、UCS2までcharで使えてべんり! とはきっとならずに、 8bit単位で読み書きする必要があるたびにビット演算、となるのですかね。 お疲れ様です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2410] Re:伸長方向?
投稿者:774RR
2024/11/06 09:55:22

> ヒープとスタックが同じ方向に伸びようが無問題、という気はしますが。 御意。 ヒープとスタックが逆向きに伸びる=残り RAM を最大限に利用可能、ってのはシングルタスクシングルスレッド限定の話。今どきはマイコンでもマルチスレッドマルチタスクを使う関係でスタック領域も事前に確保した固定長ですから。 ---- 世の中に x86 系が普及した(普及しすぎた)関係で x86 と違う仕様の CPU はみなゲテモノ扱いされちゃってるのが PC 業界の常識となっちゃっています。でもマイコン業界だとその辺のゲテモノがいっぱい残っていますし面白いですよ。 最近オイラが使った例だと TI 社の C2000 系マイコンなんかまさにゲテモノです。もともとが 16bit な DSP を無理くり 32bit CPU 化したという代物で、そのため (1) char=16bit / short=16bit / int=16bit / long=32bit C 言語仕様書 ISO/IEC 9899:1999 6.5.3.4 が sizeof(char)==1 を要求しているので sizeof(char)==1 / sizeof(short)==1 / sizeof(int)==1 / sizeof(long)==2 (2) スタックは高いアドレスに進む 既存コードが char=8bit を前提に書かれていたりするので、移植の際にはアセンブラ出力の読解が必須だったりします。他人に任せられない(自分自身も信頼できない)という罠
[この投稿を含むスレッドを表示] [この投稿を削除]
[2409] Re:伸長方向?
投稿者:(ぱ)こと管理人
2024/11/05 22:02:27

>奇遇?ですがこんな記事も書いたことがあります。 >https://ja.stackoverflow.com/questions/61298/ >PA-RISC な hpux がウチの部内サーバとして今でも現役っス。 なるほど。確かに奇遇というか、さすがです。 ちょっと調べた範囲だと、HP-UXだからといってsbrkが逆に伸びるわけではなさそうですね。、 https://community.hpe.com/t5/operating-system-hp-ux/sbrk-value/td-p/4961203 | current sbrk value = 0x15A4E000 | Maximum sbrk value = 0x7A000000 どのみちスタックサイズに制限をかけるなら、ヒープとスタックが同じ方向に 伸びようが無問題、という気はしますが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2408] Re:伸長方向?
投稿者:(ぱ)こと管理人
2024/11/05 21:41:03

>intの10要素の配列を3つほど宣言し、先頭アドレスを表示させてみたところ、 >たしかに、あとから宣言したものほど、低いアドレスに置かれていますね… すみません、ここをよく読んでいなかったようですが、 ひとつの関数の中でのローカル変数がメモリ上にどんな順に並ぶかは、 スタックの伸長方向とは無関係で、コンパイラ次第です。 たとえばintが4バイトとして、int a, b, c;という宣言なら、12バイト分の 領域を確保すればよいだけで、a, b, cの順に何かをする必要はありません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2407] Re:伸長方向?
投稿者:774RR
2024/11/05 10:36:14

奇遇?ですがこんな記事も書いたことがあります。 https://ja.stackoverflow.com/questions/61298/ PA-RISC な hpux がウチの部内サーバとして今でも現役っス。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2406] Re:伸長方向?
投稿者:(ぱ)こと管理人
2024/11/04 22:31:49

>Wikipediaを見てみたら、以下の記述がありました。 すみません、Wikipediaのリンクを貼り忘れてました。 https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF
[この投稿を含むスレッドを表示] [この投稿を削除]
[2405] Re:伸長方向?
投稿者:(ぱ)こと管理人
2024/11/04 21:18:36

>intの10要素の配列を3つほど宣言し、先頭アドレスを表示させてみたところ、 >たしかに、あとから宣言したものほど、低いアドレスに置かれていますね… > (linux x86_64, gcc 14.2.1) >不思議… なんでなのでしょう? これはCの問題でもOSの問題でもなく、CPUの問題です。 たいていのCPUにはサブルーチンコールのためのCALL命令があり、戻り先をスタックに 積みます。これは機械語レベルの命令なのですが、この時、スタックはアドレスが小さい方に 向けて伸びるCPUが多いと思います。たとえば、おっさんプログラマならだれでも知っている 大昔の8ビットCPU Z80(1976年発表)でも、CALLすると、スタックの先頭を指しているレジスタで あるSPの値は減ります。 http://www.yamamo10.jp/yamamoto/comp/Z80/instructions/index.php#CALL_RETURN スタックがどちら向きに伸びるのかは、どっちでもよいようなものではありますが、 限られたメモリの中でプログラムを書く場合、プログラマが管理する領域は上から下に、 スタックは下から上に伸ばすようにしていけば、最後までメモリを使い切れる、という 事情はあったのではないかと思います。 今のCPU/言語でも、ポインタ完全制覇のFig2-3にあるように、malloc()で伸びる領域と スタックの領域の間には広大な空間があるわけです。 Wikipediaを見てみたら、以下の記述がありました。 | 昔のコンピュータで、ヒープ領域をアドレスの小さいほうから大きいほうへ伸ばし、 | スタックを大きいほうから小さいほうへ伸ばす(そのようにすると、メモリが足りない場合は | どちらを伸ばす余裕もなく、完全にメモリを使い切って計算続行不可能となる)という | 設計にした名残りから、アドレスの大きいほうから小さいほうへ伸びるものが多いが、 | PA-RISCは逆である。 逆のものもあるようですね。 もっとも、Cの場合、スタックを「アドレスの小さい方へ」伸ばすようにした結果、 バッファオーバーフロー脆弱性がずいぶんと狙いやすくなった、という実害が出ていますが……
[この投稿を含むスレッドを表示] [この投稿を削除]
[2404] Re:「C言語 ポインタ完全制覇(第2版)」正誤表の誤り?
投稿者:(ぱ)こと管理人
2024/11/04 21:02:09

どうも、おひさしぶりです。 >す~~~んごく細かい話で恐縮なのですが、同書 List 2-2(p.98)の45行目でmalloc()して >いますが、free()は要らないでしょうか?(まぁ、4bytesくらい、リブート迄放っておきま >しょう、でもよいかもしれませんが) List 2-2は、Cがメモリをどう使うのかを示すためのテストプログラムで、 まったくもって実用を想定したものではないので、free()はしていません。 free()しなかった場合どうなるかというと、プロセスが終了した時点で解放されます (リブートまで待つ必要はないです)。このプログラムの場合、どのみちすぐに終わるので、 free()してもしなくても同じことですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2403] Re:伸長方向?
投稿者:いずわたのぶかず
2024/11/04 18:48:21

>たびたび細かい話をもうしわけありません。(件名、変えて投稿します) > >同書では、図時する場合、アドレスが増える方向は、多くの場合図の下方になっていると思います(例えば、Fig. 1-6)。そして、配列に関しても、Fig. 1-8では、array[]の添え字が増えるのは下方に向かって、になっています。 > >ところが、Fig. 2-7では、スタックの伸長方向の矢印は、上方に向かって書かれています。 >また、Fig. 2-9 では、hoge[]の添え字が増えるのは、下方に向かって、なのですが、やはり伸長方向の矢印は上向きになっています。 > >これは、「スタックは、番地が減る方向に利用範囲を広げていく」という事なのでしょうか? >積む、というイメージからは、番地が増える方向に利用範囲を広げていくように感じたのですが…(ある領域に固定長の配列をひとまとめに確保する、という場合でも、それは、番地の低い側に?) > >あ、いや、実験してみればよいのですね… 試してみます。 お騒がせして申し訳ありません。 intの10要素の配列を3つほど宣言し、先頭アドレスを表示させてみたところ、たしかに、あとから宣言したものほど、低いアドレスに置かれていますね… (linux x86_64, gcc 14.2.1) 不思議… なんでなのでしょう?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2402] 伸長方向?
投稿者:いずわたのぶかず
2024/11/04 18:40:04

たびたび細かい話をもうしわけありません。(件名、変えて投稿します) 同書では、図時する場合、アドレスが増える方向は、多くの場合図の下方になっていると思います(例えば、Fig. 1-6)。そして、配列に関しても、Fig. 1-8では、array[]の添え字が増えるのは下方に向かって、になっています。 ところが、Fig. 2-7では、スタックの伸長方向の矢印は、上方に向かって書かれています。 また、Fig. 2-9 では、hoge[]の添え字が増えるのは、下方に向かって、なのですが、やはり伸長方向の矢印は上向きになっています。 これは、「スタックは、番地が減る方向に利用範囲を広げていく」という事なのでしょうか? 積む、というイメージからは、番地が増える方向に利用範囲を広げていくように感じたのですが…(ある領域に固定長の配列をひとまとめに確保する、という場合でも、それは、番地の低い側に?) あ、いや、実験してみればよいのですね… 試してみます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2401] Re:「C言語 ポインタ完全制覇(第2版)」正誤表の誤り?
投稿者:いずわたのぶかず
2024/11/04 18:15:46

こんばんは。 す~~~んごく細かい話で恐縮なのですが、同書 List 2-2(p.98)の45行目でmalloc()していますが、free()は要らないでしょうか?(まぁ、4bytesくらい、リブート迄放っておきましょう、でもよいかもしれませんが) p.116では「…使う側にfree()の手間を押し付けることになります。」とも書かれているので… (すみません、昨日から同書を最初から読み直して勉強し直しているもので… 昔のBBS投稿を読み返したところ何年か前に「かずちゃん」というハンドル名で投稿していたようです)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2400] Re:「C言語 ポインタ完全制覇(第2版)」正誤表の誤り?
投稿者:(ぱ)こと管理人
2024/11/04 14:33:30

こんにちは。ご指摘ありがとうございます。 >正誤表に、「p.240 Lis4-5 read_slogan.cの25行目」とありますが、p.241では? p.241ですね。修正いたしました。 >因みに、正誤表のこの箇所以降殆ど、"List"が"Lis"になってしまっているようです。 こちらも併せて修正いたしました。 ポカが多く申し訳ありません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2399] 「C言語 ポインタ完全制覇(第2版)」正誤表の誤り?
投稿者:いずわたのぶかず
2024/11/04 08:51:07

こんにちは。 正誤表に、「p.240 Lis4-5 read_slogan.cの25行目」とありますが、p.241では? 因みに、正誤表のこの箇所以降殆ど、"List"が"Lis"になってしまっているようです。 (初版第1刷所有者)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2398] Re:SSL証明書を更新しました
投稿者:(ぱ)こと管理人
2024/11/01 21:11:00

>正しく見えているようですよ ですね。ありがとうございます。 >更新直後状態から Web UA で証明書の有効期限がちゃんと変わっていましたし。 言われてみれば当たり前ですがそういえばそれを確認していませんでした f(^^:
[この投稿を含むスレッドを表示] [この投稿を削除]
[2397] Re:SSL証明書を更新しました
投稿者:774RR
2024/11/01 18:28:50

正しく見えているようですよ 更新直後状態から Web UA で証明書の有効期限がちゃんと変わっていましたし。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2396] SSL証明書を更新しました
投稿者:(ぱ)こと管理人
2024/10/06 20:34:59

本日、kmaebashi.comのSSL証明書を更新しました。 今のところ問題なく動いているように見えますが、月末が旧証明書の期限切れなので、 それを過ぎないと本当に成功したかどうかはわかりませんかねえ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2395] Re:掲示板が(また)停止していました
投稿者:(ぱ)こと管理人
2024/09/28 13:11:54

Tomcatが落ちてもsystemdが再起動してくれるように設定しました。 kill -9しても生き返ったので大丈夫っぽいです。 メモ。 /etc/systemd/system/tomcat.service の設定は以下の通り。 Restart=alwaysがミソですが、最初設定した時いい加減なWeb記事をうのみにして 設定してしまったので、それだけではすまなかった…… <ここから><ここから><ここから><ここから> [Unit] Description=Apache Tomcat 10 After=network.target [Service] User=tomcat Group=tomcat Type=forking PIDFile=/opt/apache-tomcat-10.1.13/tomcat.pid Restart=always ExecStart=/opt/apache-tomcat-10.1.13/bin/startup.sh ExecStop=/opt/apache-tomcat-10.1.13/bin/shutdown.sh [Install] WantedBy=multi-user.target
[この投稿を含むスレッドを表示] [この投稿を削除]
[2394] Re:掲示板が(また)停止していました
投稿者:(ぱ)こと管理人
2024/09/21 01:13:50

>OSが再起動したらTomcatも起動するように設定しているはずですが、 >もしかしてそこが動いていないのかも? ためしに再起動しましたがちゃんと動いていますねえ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2393] 掲示板が(また)停止していました
投稿者:(ぱ)こと管理人
2024/09/19 23:43:50

また朝の6:26にdnfによるupdateが走って、この掲示板が停止していました。 ちょっと頻度が高いので、まじめに対策を考えます…… OSが再起動したらTomcatも起動するように設定しているはずですが、 もしかしてそこが動いていないのかも?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2392] Re:【雑談】インタプリタは翻訳しないの件
投稿者:(ぱ)こと管理人
2024/09/13 01:10:04

>『これから学ぶJavaScript』という入門本 >著者 WINGS プロジェクト 齊藤 新三 著/山田 祥寛 監修 >https://book.impress.co.jp/books/1117101136 > >(Kindle Unlimitedでサブスクで読めました) > >に「インタプリタは機械語に翻訳しながら実行する」と書いてありました 情報ありがとうございます。 最近この手の入門書は買ってまで読みませんが、ネット上にこれだけこの間違いが あふれている以上、紙書籍にも書いてあるのでしょうね。 しかし、著者の方は存じ上げませんが、山田祥寛さんといえばかなり有名な ライターだと思うのですが、その方が監修してこの有様なんですかねえ。 >>一方、もうひとつは、 >>ソースコードを実行する際にその場でマシン語に変換する方法で、 >>インタプリタといい、この方式をとる言語をインタプリタ言語といいます。 >>こちらの言語は、見た目にはソースコードを直接実行しているように見えますが、 >>実は実行時に変換されています JavaScriptでもJITコンパイラはあるので、実行時に機械語に変換されるという ケースももちろんあるのでしょうが、それをインタプリタというのは明確に誤りですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2391] 【雑談】インタプリタは翻訳しないの件
投稿者:rike1019
2024/09/12 00:55:29

『これから学ぶJavaScript』という入門本 著者 WINGS プロジェクト 齊藤 新三 著/山田 祥寛 監修 https://book.impress.co.jp/books/1117101136 (Kindle Unlimitedでサブスクで読めました) に「インタプリタは機械語に翻訳しながら実行する」と書いてありました >一方、もうひとつは、 >ソースコードを実行する際にその場でマシン語に変換する方法で、 >インタプリタといい、この方式をとる言語をインタプリタ言語といいます。 >こちらの言語は、見た目にはソースコードを直接実行しているように見えますが、 >実は実行時に変換されています 前橋さんがブログに書いていましたが インタープリタは「翻訳」しない https://kmaebashi.hatenablog.com/entry/20160705/p1 未だに入門書には、 インタプリタはマシン語に変換しながら実行すると説明があるようです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2390] 掲示板が停止していました
投稿者:(ぱ)こと管理人
2024/09/06 07:48:28

おそらく今朝06:10頃に動いたアップデートが原因だと思うのですが、 この掲示板が停止していました。Tomcatを再起動したところ、直ったようです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2389] Re:【雑談】アロー関数に関して
投稿者:(ぱ)こと管理人
2024/08/27 00:55:49

こんにちは。 >簡潔になるのは理解できるんですけど、functionを使うのをやめて全部アロー関数に >したほうがいいんですかね? 私はといえば、たとえばこちらでもfunctionを使っていますし、 https://kmaebashi.com/programmer/beginner/javascriptintro.html この掲示板とか(まあここのソースはたいがい古いですが)、その他JavaScriptを 書く時も基本的にfunctionです。下記に書いた通りアロー関数は 『forEach()とかmap()とかで気楽に使うもの』という認識なので、 https://kmaebashi.com/programmer/beginner/javascriptoop.html 名前を付けられるような関数はちゃんと名前を付けるべき、と思っています。 かつてTwitterにはこんなことを書いていましたが、 https://x.com/kmaebashi/status/1130497188729987072 今検索してみると、やはりこれについては悩んでいる人がいて、 https://zenn.dev/rgbkids/books/0b75c912d8ac70/viewer/e0fd3e このあたりを見てみると、各種コーディング規約でもfunctionを勧めているのが 多いようですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2388] 【雑談】アロー関数に関して
投稿者:rike1019
2024/08/26 13:48:06

最近アロー関数という書き方を知ったんですけど、古い書き方をずっと使っていたものからするととっつきにくい気がします。 function a() { console.log("hello, world!") } この関数をアロー関数に変換すると、以下のようになります。 JavaScript const a = () => console.log("hello, world!"); 簡潔になるのは理解できるんですけど、functionを使うのをやめて全部アロー関数にしたほうがいいんですかね?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2387] Re:C言語ポインタ完全制覇のダウンロードページの記述ミス
投稿者:(ぱ)こと管理人
2024/07/16 00:40:27

>と書いてあるのですが、コピペして直し忘れているように見えるので修正したほうがいいと思いました。 うわ、ご指摘ありがとうございます。 直しました…… 気付かないものですねえ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2386] C言語ポインタ完全制覇のダウンロードページの記述ミス
投稿者:rike1019
2024/07/15 22:56:30

「C言語 ポインタ完全制覇(第2版)」ダウンロード https://kmaebashi.com/seiha2/download.html このページに「このページは、拙著「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」の掲載ソースコードのダウンロードページです。」 と書いてあるのですが、コピペして直し忘れているように見えるので修正したほうがいいと思いました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2385] Re:Webサーバを作りながら学ぶ ~のサンプルの文字コードについて
投稿者:(ぱ)こと管理人
2024/07/15 15:34:53

>ちょっと確認し、連休中に対応します。 Java17まではShift-JISが標準だったのが、21でUTF-8になっていることを確認のうえ、 UTF-8版のソースを配置しました。ご指摘ありがとうございました。 この本より後に出したポインタ完全制覇改訂版では最初からUTF-8を配布してますね。 Javaが、ごく最近までShift-JISを標準にしていたのが意外なくらいの話で。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2384] Re:Webサーバを作りながら学ぶ ~のサンプルの文字コードについて
投稿者:(ぱ)こと管理人
2024/07/13 20:39:40

>Shift JIS(CP932)だとデフォルトでVSCodeもEclipseも文字化けしたので、 >UTF-8版のソースコードも配布したほうが親切かなと思います。 ご指摘ありがとうございます。なるほど、そういう時代ですね。 javacのデフォルトエンコーディングは長いことShift-JISでしたが、 今調べたらJava18からUTF-8になってるっぽい? ちょっと確認し、連休中に対応します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2383] Webサーバを作りながら学ぶ ~のサンプルの文字コードについて
投稿者:rike1019
2024/07/12 17:27:21

Shift JIS(CP932)だとデフォルトでVSCodeもEclipseも文字化けしたので、UTF-8版のソースコードも配布したほうが親切かなと思います。Windows PowerShellで一括変換する方法もありました。自分はそうしましたが、できない人もいると思うので。 複数個のファイルの文字コードをShift_JISからutf-8(BOMなし)に変換する https://nagaragawa-r.com/convert-character-code-shift_jis-to-utf-8-without-bom/
[この投稿を含むスレッドを表示] [この投稿を削除]
[2382] Re:C言語の配列とポインタの話題
投稿者:(ぱ)こと管理人
2024/07/03 22:37:38

こんにちは。しばらくここを見てなかったようで返信が遅れました。 >togetterに配列の添字演算子はポインタ演算のシンタックスシュガーだよ、 >という記事が載っていました。 >意外と知られていないみたいです。 >https://togetter.com/li/2393030 紹介ありがとうございます。まとめの中にもポインタ完全制覇は出てきますが、 まだまだ普及が足りてないですかねえ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2381] C言語の配列とポインタの話題
投稿者:mhash
2024/07/01 02:59:33

togetterに配列の添字演算子はポインタ演算のシンタックスシュガーだよ、という記事が載っていました。 意外と知られていないみたいです。 https://togetter.com/li/2393030
[この投稿を含むスレッドを表示] [この投稿を削除]
[2380] Re:ポインタ完全制覇の質問
投稿者:(ぱ)こと管理人
2024/05/27 21:16:14

>C の場合 >変数定義で要素数を書かない場合(上記 static int a[]; が該当)には当該変数は >不完全型な仮定義 (tentative definition) になる・・・と言いたいところなんですが > static がある場合には仮定義にならず一発定義になります。 確認しました。ここについてはこれですかね。 | 6.9.2 外部オブジェクト定義 … | オブジェクトに対する識別子の宣言が仮定義であり,内部結合をもつ場合, | その宣言の型は不完全型であってはならない。 これを普通に読むと、 static int a[]; はそれ自体でコンパイルエラーになりそうなものですが (まあ実際、役に立たないと思いますし)、 | 大きさの分からない配列型は,不完全型とする。その型は,それ以降のその型の | 識別子の宣言(内部結合又は外部結合をもつ)で大きさを指定することによって, | 完全となる。 こっちでは(内部結合でも)それ以降の宣言で大きさを指定すればよい、 とあるようで、これがどういう時に有効なのか、読み解けていません…
[この投稿を含むスレッドを表示] [この投稿を削除]
[2379] Re:ポインタ完全制覇の質問
投稿者:(ぱ)こと管理人
2024/05/25 08:10:03

いつもありがとうございます。 >C の場合 >変数定義で要素数を書かない場合(上記 static int a[]; が該当)には当該変数は >不完全型な仮定義 (tentative definition) になる・・・と言いたいところなんですが > static がある場合には仮定義にならず一発定義になります。 >また、要素数についてはコンテキスト次第で解釈が変わってよいところです。 >とあるコンテキストではこれを int a[1]; と読んでよいことになっています。 >別のコンテキストではこれを不完全型と読んでよい(要素数未知)ことになっています。 この週末は出かけますのでこのあたり帰ってきたら確認します……
[この投稿を含むスレッドを表示] [この投稿を削除]
[2378] Re:ポインタ完全制覇の質問
投稿者:774RR
2024/05/24 13:10:59

この辺 C と C++ で微妙に仕様が違うところピンポイントで踏み抜いているのでいろいろわけわからんことになっています。今この瞬間には C 言語仕様書 JIS X 3010 ならびに C++ 言語仕様書 JIS X 3014 にアクセスできないので記憶とコンパイラの挙動だけで話をします。 サンプルソース tentative.c ないしは tentative.cpp static int a[]; static int a[4]; unsigned long f() { return sizeof a; } C の場合 変数定義で要素数を書かない場合(上記 static int a[]; が該当)には当該変数は不完全型な仮定義 (tentative definition) になる・・・と言いたいところなんですが static がある場合には仮定義にならず一発定義になります。また、要素数についてはコンテキスト次第で解釈が変わってよいところです。とあるコンテキストではこれを int a[1]; と読んでよいことになっています。別のコンテキストではこれを不完全型と読んでよい(要素数未知)ことになっています。詳細は言語仕様書を読まないと出てきません(覚えていません)。 cygwin64 にて $ gcc --version gcc (GCC) 11.4.0 // 以下略 $ gcc -W -Wall -pedantic -O -S tentative.c tentative.c:1:12: error: array size missing in 'a' 1 | static int a[]; | ^ tentative.c:2:12: error: conflicting types for 'a'; have 'int[4]' 2 | static int a[4]; | ^ tentative.c:1:12: note: previous declaration of 'a' with type 'int[1]' 1 | static int a[]; | ^ tentative.c:1:12: warning: 'a' defined but not used [-Wunused-variable] $ ということで gcc-11.4.0 は先の例を static int a[1]; と読んでいます。本当にそう読んだのかアセンブラコードで確認したいところですが、残念ながらコンパイルエラーになっているので確かめられません。 C++ の場合 C にあった仮定義がなくなっている関係で int a[]; は個数不定な「変数定義」になります。なのでこの時点でコンパイルエラー。更に ODR (one definition rule) も適用され int a[4]; と矛盾しここでもエラーになります。 $ g++ -W -Wall -pedantic -O -S tentative.cpp tentative.cpp:1:12: error: storage size of 'a' isn't known 1 | static int a[]; | ^ $ あるいは Visual Studio 2019 の VC++ だと D:\work\tmp>cl -W4 -Ox -c tentative.c Microsoft(R) C/C++ Optimizing Compiler Version 19.29.30154 for x64 Copyright (C) Microsoft Corporation. All rights reserved. tentative.c tentative.c(1): error C2133: 'a': サイズが不明です。 D:\work\tmp>cl -W4 -Ox -c tentative.cpp Microsoft(R) C/C++ Optimizing Compiler Version 19.29.30154 for x64 Copyright (C) Microsoft Corporation. All rights reserved. tentative.cpp tentative.cpp(1): error C2133: 'a': サイズが不明です。 tentative.cpp(2): error C2086: 'int a[]': 再定義されました。 tentative.cpp(1): note: 'a' の宣言を確認してください tentative.cpp(4): error C2070: 'int []': sizeof オペランドが正しくありません。 というわけで不完全型な変数定義になる static int a[]; は書いちゃダメ、コンパイラ次第で挙動が違う、でしょう。まあコンパイルエラーになってくれるので、実行するまでわからないという最恐な事態には陥らなくて済みそうです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2377] Re:ポインタ完全制覇の質問
投稿者:sasaki
2024/05/17 16:47:21

>>OS : Windows10 Enterprise (ver 22H2) >>コンパイラ: gcc 6.3.0 > >ちょっと調べてMinGWはgcc 6.3.0って古すぎないかという記事を見かけたので、 >https://stackoverflow.com/questions/68360901/why-is-the-latest-mingw-gcc-version-6-3-0 > >MinGWなら6.3.0があるのかな、とosdn.netからmingw-get.exeとやらを入手して >6.3.0をインストールしようとしたのですがないと言われて >7.3.0-1を(むりやり)動かしたら再現しました。正直驚きました。 > >>#include <stdio.h> >> >>static int a[]; >> >>int main() >>{ >> >> return 0; >>} > >これだと配列aのサイズが決まっていないわけで、ではコンパイラはaのサイズを >いくつだと思っているのか確認しようと > > printf("sizeof a..%d\n", sizeof(a)); > >とやってみると、 >invalid application of 'sizeof' to incomplete type 'int[]' > >と言われます。aがincomplete type(不完全型)だと言っています。 > >これについては規格でも「6.2.5 型」のところで > >| 大きさの分からない配列型は,不完全型とする。その型は,それ以降のその型の >| 識別子の宣言(内部結合又は外部結合をもつ)で大きさを指定することによって, >| 完全となる。 > >という記載があるので、以下のようにint a[10];を追加したら、 >gccの9.4.0でもコンパイルが通って、「sizeof a..40」と表示されました。 > >#include <stdio.h> > >static int a[]; > >static int a[10]; > >int main() >{ > printf("sizeof a..%d\n", sizeof(a)); > return 0; >} > >それにしても、staticなのにこの.c内でサイズ指定して完全型にならないのなら、 >やっぱりコンパイルを通してはダメだと思うのですが…… >なので最近のgccではエラーにしているのだと思います。 >私も勉強になりました。ありがとうございました。 ご回答ありがとうございます。 私のgccそんなに古かったとは… 環境構築の際に、どこかの参考サイトの書いてあるがままにインストールしていました。(反省します) gccを13.2.0に更新して試してみたところ、前橋様と同じ挙動になりました。 こちらこそ変な質問に丁寧にご対応頂きありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2376] Re:ポインタ完全制覇の質問
投稿者:(ぱ)こと管理人
2024/05/17 00:46:58

>OS : Windows10 Enterprise (ver 22H2) >コンパイラ: gcc 6.3.0 ちょっと調べてMinGWはgcc 6.3.0って古すぎないかという記事を見かけたので、 https://stackoverflow.com/questions/68360901/why-is-the-latest-mingw-gcc-version-6-3-0 MinGWなら6.3.0があるのかな、とosdn.netからmingw-get.exeとやらを入手して 6.3.0をインストールしようとしたのですがないと言われて 7.3.0-1を(むりやり)動かしたら再現しました。正直驚きました。 >#include <stdio.h> > >static int a[]; > >int main() >{ > > return 0; >} これだと配列aのサイズが決まっていないわけで、ではコンパイラはaのサイズを いくつだと思っているのか確認しようと printf("sizeof a..%d\n", sizeof(a)); とやってみると、 invalid application of 'sizeof' to incomplete type 'int[]' と言われます。aがincomplete type(不完全型)だと言っています。 これについては規格でも「6.2.5 型」のところで | 大きさの分からない配列型は,不完全型とする。その型は,それ以降のその型の | 識別子の宣言(内部結合又は外部結合をもつ)で大きさを指定することによって, | 完全となる。 という記載があるので、以下のようにint a[10];を追加したら、 gccの9.4.0でもコンパイルが通って、「sizeof a..40」と表示されました。 #include <stdio.h> static int a[]; static int a[10]; int main() { printf("sizeof a..%d\n", sizeof(a)); return 0; } それにしても、staticなのにこの.c内でサイズ指定して完全型にならないのなら、 やっぱりコンパイルを通してはダメだと思うのですが…… なので最近のgccではエラーにしているのだと思います。 私も勉強になりました。ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2375] Re:ポインタ完全制覇の質問
投稿者:sasaki
2024/05/16 09:30:26

ご回答いただきありがとうございます。 >初期化とは関係なく、配列にはサイズが必要です。 >サイズを入れない空の[]が書ける場所は、「ポインタ完全制覇」なら「3-5-3 空の[]について」で >説明している以下の箇所です。 > >1.関数の仮引数の宣言 >2.初期化子により配列のサイズが確定できる場合 >3.グローバル変数をextern宣言する場合 > >ここで、1はポインタに読みかえられるのでそもそも配列ではなく、 >2と3は、初期化子でサイズがわかったり、別のコンパイル単位にサイズが書いてあることが >期待できる、という理由で空の[]が書けます。 >extern宣言ではないグローバル変数の定義で、初期化子も書かなければ、 >やはりサイズは必要です。 >関数外に、単に > >int a[]; > >と書いて、仮にコンパイルが通ったとして、この配列の要素数はいくつであるのが適当でしょうか? >「少なくとも一つは0が代入され、int a[] = {0};と同義」になったとしても、 >別に便利でもないのではないでしょうか。 確かにおっしゃる通りです。 配列とポインタを混同して勝手におかしな解釈をしていることに気づきました。 ご指摘いただきありがとうございます。 「3-5-3 空の[]について」、「3-6 配列とポインタは別物だ!!」を肝に銘じておきます。 >>②①のあとに、グローバル変数であることが重要なのではなく静的変数であることが重要なのではと考え、 >> 試しにstatic int a[];としたら、これはコンパイルが成功しました。 > >これは普通にコンパイルが通らないのでは、と思います。 > >私がgcc 9.4.0で試したところ、 >関数外にstatic int a[];と書いたら以下のエラーが出ました。 > >test.c:3:12: warning: array ‘a’ assumed to have one element > 3 | static int a[]; > >関数内だと以下です。いずれにしてもエラーです。 > >test.c:6:16: error: storage size of ‘a’ isn’t known > 6 | static int a[]; > >sasakiさんの環境でエラーにならないようでしたら、環境(OS, コンパイラ、コンパイラのバージョン)を >教えてください。また、ソースをまるごとここに貼ってください。 下記の通りです。 【環境】 OS : Windows10 Enterprise (ver 22H2) コンパイラ: gcc 6.3.0 【ソースコード】 #include <stdio.h> static int a[]; int main() { return 0; }
[この投稿を含むスレッドを表示] [この投稿を削除]
[2374] Re:ポインタ完全制覇の質問
投稿者:(ぱ)こと管理人
2024/05/15 22:20:25

>①前回ご教示頂いた内容の私なりの解釈では、グローバル変数などの静的変数は初期化しなかった場合、 > 算術型の変数は0で初期化されると理解しました。 > であれば、int a[]も関数外で宣言することにより、プログラマが初期化しなくてもグローバル変数 > として自動的に初期化され、JIS X 3010:2003「6.7.8 初期化」のc)d)の合わせ技により、配列内に > 少なくとも一つは0が代入され、int a[] = {0};と同義になるのではと思い、関数外であればint a[]; > を宣言できるのではと考え、試しに関数外に宣言してみたのですがコンパイルエラーになりました。 > 前述【超重要!!】の内容はやはり正しいとして、今回私が疑問に思い行った実験は初期化の考え方が > 間違っているのでしょうか? 初期化とは関係なく、配列にはサイズが必要です。 サイズを入れない空の[]が書ける場所は、「ポインタ完全制覇」なら「3-5-3 空の[]について」で 説明している以下の箇所です。 1.関数の仮引数の宣言 2.初期化子により配列のサイズが確定できる場合 3.グローバル変数をextern宣言する場合 ここで、1はポインタに読みかえられるのでそもそも配列ではなく、 2と3は、初期化子でサイズがわかったり、別のコンパイル単位にサイズが書いてあることが 期待できる、という理由で空の[]が書けます。 extern宣言ではないグローバル変数の定義で、初期化子も書かなければ、 やはりサイズは必要です。 関数外に、単に int a[]; と書いて、仮にコンパイルが通ったとして、この配列の要素数はいくつであるのが適当でしょうか? 「少なくとも一つは0が代入され、int a[] = {0};と同義」になったとしても、 別に便利でもないのではないでしょうか。 >②①のあとに、グローバル変数であることが重要なのではなく静的変数であることが重要なのではと考え、 > 試しにstatic int a[];としたら、これはコンパイルが成功しました。 これは普通にコンパイルが通らないのでは、と思います。 私がgcc 9.4.0で試したところ、 関数外にstatic int a[];と書いたら以下のエラーが出ました。 test.c:3:12: warning: array ‘a’ assumed to have one element 3 | static int a[]; 関数内だと以下です。いずれにしてもエラーです。 test.c:6:16: error: storage size of ‘a’ isn’t known 6 | static int a[]; sasakiさんの環境でエラーにならないようでしたら、環境(OS, コンパイラ、コンパイラのバージョン)を 教えてください。また、ソースをまるごとここに貼ってください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2373] Re:ポインタ完全制覇の質問
投稿者:sasaki
2024/05/15 17:16:34

お世話になっております。 また質問をさせてください。(2つあります) 本書P210の【超重要!!】で「int a[]がint *aと同じ意味になるのは、唯一、関数の仮引数の宣言の場合だけ」 という所を読み、2つ実験をしてみて疑問に思った内容の質問です。 ①前回ご教示頂いた内容の私なりの解釈では、グローバル変数などの静的変数は初期化しなかった場合、  算術型の変数は0で初期化されると理解しました。  であれば、int a[]も関数外で宣言することにより、プログラマが初期化しなくてもグローバル変数  として自動的に初期化され、JIS X 3010:2003「6.7.8 初期化」のc)d)の合わせ技により、配列内に  少なくとも一つは0が代入され、int a[] = {0};と同義になるのではと思い、関数外であればint a[]; を宣言できるのではと考え、試しに関数外に宣言してみたのですがコンパイルエラーになりました。  前述【超重要!!】の内容はやはり正しいとして、今回私が疑問に思い行った実験は初期化の考え方が  間違っているのでしょうか? ②①のあとに、グローバル変数であることが重要なのではなく静的変数であることが重要なのではと考え、  試しにstatic int a[];としたら、これはコンパイルが成功しました。  これにより余計に頭がパンクしそうなのですが、静的変数であることを明示するとint a[]がint *aと同義  になるのでしょうか? お手数ですがご教示のほどお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2372] Re:ポインタ完全制覇の質問
投稿者:sasaki
2024/05/13 11:56:08

ご回答いただきありがとうございます。 添付してくださった参照先(JIS X 3010:2003「6.7.8 初期化」)も確認しました。 〇ローカル変数や自分で領域を確保した動的変数は、プログラマが初期値を指定しなかった場合、その値は不定。 〇グローバル変数などの静的変数は、プログラマが初期値を指定しなかった場合、  ・算術型(int型等)…初期値0 ・ポインタ型…初期値NULL と、理解しました。 ご教示いただきありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2371] Re:掲示板が停止していました
投稿者:(ぱ)こと管理人
2024/05/11 09:58:53

ログを見ると、05/11 06:09くらいまでこの掲示板は動いた形跡があって (spamよけ認証エラーが出ていた。こんな過疎掲示板にもspamだけは来るのです)、 06:16くらいに、dnfの自動更新が動いていたので、そのせいっぽいですね。 自動更新はちょくちょく起きるので、今回だけこうなった理由は結局わかりませんが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2370] 掲示板が停止していました
投稿者:(ぱ)こと管理人
2024/05/11 08:36:25

昨晩から今朝にかけてこの掲示板が停止していたようです。 先ほど確認したらTomcatが動いていなかったので、起動したら 動くようになりました。 原因自体は調査中です。ご迷惑をおかけしました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2369] Re:ポインタ完全制覇の質問
投稿者:(ぱ)こと管理人
2024/05/10 22:59:16

>書籍ポインタ完全制覇でC言語を勉強中の者です。 はじめまして。読んでいただきありがとうございます。 >該当の書籍のP-130-131のサンプルプログラムList2-9について質問なのですが、 >使用済みの数字かどうかを判定するフラグused_flagの初期値を最初にゼロにしている >訳ではないのに、33行目のループの最初で0と判定してif文の中身を実行できるのは >どうしてでしょうか? このused_flagはグローバル変数であり、グローバル変数は静的記憶域期間を持ちます。 静的記憶域期間を持つ変数については、プログラムの起動時に初期化されることが 規格で規定されています。 JIS X 3010:2003「6.7.8 初期化」より。 | 静的記憶域期間をもつオブジェクトを明示的に初期化しない場合,次の規定に従う。 | a) そのオブジェクトの型がポインタ型の場合,空ポインタに初期化する。 | b) そのオブジェクトの型が算術型の場合,(正又は符号無しの)0 に初期化する。 | c) そのオブジェクトが集成体の場合,各メンバにa)~d)の規定を(再帰的に)適用し |  初期化する。 | d) そのオブジェクトが共用体の場合,最初の名前付きメンバにa)~d)の規定を | (再帰的に)適用し初期化する。 used_flagはintの配列なので、c)とb)の規則の合わせ技で0に初期化されます。 >自分なりに調べると、特にプログラマが初期値を指定しない場合の初期値は >不定となるそうなのですが、それが何か関係しているのでしょうか。 自動記憶域期間を持つ変数(ローカル変数)や、malloc()でヒープに確保した領域は、 明示的に初期化しない限り値は不定になります。 2章で説明している通り、ローカル変数の領域は関数の呼び出しのたびに確保されますし、 ヒープの領域はmalloc()のたびに確保されます。こういう領域を毎回ゼロとかでクリア するのは性能的に問題が出るかもしれませんが、静的記憶域期間をもつ変数はプログラムの 起動時に1回だけ初期化すればよいので性能上も問題ない、という判断なのかと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2368] ポインタ完全制覇の質問
投稿者:sasaki
2024/05/10 14:56:41

書籍ポインタ完全制覇でC言語を勉強中の者です。 該当の書籍のP-130-131のサンプルプログラムList2-9について質問なのですが、 使用済みの数字かどうかを判定するフラグused_flagの初期値を最初にゼロにしている訳ではないのに、33行目のループの最初で0と判定してif文の中身を実行できるのはどうしてでしょうか? 自分なりに調べると、特にプログラマが初期値を指定しない場合の初期値は不定となるそうなのですが、それが何か関係しているのでしょうか。 お手数ですが、ご教示頂きたくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2367] Re:ポインタ完全制覇 LIST 4-4 realloc.c
投稿者:トト
2024/03/11 21:13:50

返信が遅くなりまして、すみません。 昨夜,投稿に気づきました。 指摘して頂きありがとうございます。 違った解釈をしていました。 【 指摘前(c言語 サイト参照) 】 [Ctrl]+[z]... Mac ↓ “ [1] + Stopped ./a.out  ” ... 停止(Macターミナル表示) [fg] 又は [fg 1] と入力。        ... 再開 ↓ (例)(Macターミナル表示) variable_array[0]..12 variable_array[1]..2 variable_array[2]..1              :              : をしていまし。 >ちょっと不安を感じるのですが、このプログラムで「一時停止、再開動作」を >しているのは、fgets()のところで入力待ちの時に一時停止、入力してENTERを >押したら再開、というところです。しかしこれはgetchar()だろうが >scanf()だろうがfgets()だろうがキーボードで入力待ちになったら発生することです。 > >while (fgets(buf, 256, stdin) != NULL) { > … > >というループが終了するのは、見ての通りfgets()がNULLを返した時です。 >fgets()がNULLを返すのは、ファイルの終わりが来た時で、標準入力 >(デフォルトではキーボード)で、ファイルの終わり(EOF: End Of File)を >示す手段が、WindowsではCtrl+Z、ENTERだということです。 >Macは私は持ってませんが、ターミナルでEOFを示す方法は、(UNIXと同じく) >Ctrl+Dだと思います。 【 指摘後 】 [ Ctrl ] + [ D ]でした。 EOFを入力する手段とは知りませんでした。 (もしかした今まで学習サイトで目にしているのに、忘れているのかもしれません) 質問の仕方が初めから「どうしたらwhile(...(stdin)...!=NULL)ナルを返せますか?(Mac使用)」と、 私が聞ければよかったです。お手間取らせました。 不安を感じて指摘して頂きありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2366] Re:ポインタ完全制覇 LIST 4-4 realloc.c
投稿者:(ぱ)こと管理人
2024/03/03 23:56:35

>>①で、入力を終えるには、Windowsなら、数値をいくつか入力後、 >>Ctrl+Z を押してからENTERを押してください。 > >このような一時停止、再開操作をするプログラムを初めて知りました。 >while(...,stdin)で、たしかに終わりどころは・・・・と思ってもいました。 ちょっと不安を感じるのですが、このプログラムで「一時停止、再開動作」を しているのは、fgets()のところで入力待ちの時に一時停止、入力してENTERを 押したら再開、というところです。しかしこれはgetchar()だろうが scanf()だろうがfgets()だろうがキーボードで入力待ちになったら発生することです。 while (fgets(buf, 256, stdin) != NULL) { … というループが終了するのは、見ての通りfgets()がNULLを返した時です。 fgets()がNULLを返すのは、ファイルの終わりが来た時で、標準入力 (デフォルトではキーボード)で、ファイルの終わり(EOF: End Of File)を 示す手段が、WindowsではCtrl+Z、ENTERだということです。 Macは私は持ってませんが、ターミナルでEOFを示す方法は、(UNIXと同じく) Ctrl+Dだと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2365] Re:ポインタ完全制覇 LIST 4-4 realloc.c
投稿者:トト
2024/03/03 00:13:44

今回も教えて頂きありがとうございます。 >①で、入力を終えるには、Windowsなら、数値をいくつか入力後、 >Ctrl+Z を押してからENTERを押してください。 このような一時停止、再開操作をするプログラムを初めて知りました。 while(...,stdin)で、たしかに終わりどころは・・・・と思ってもいました。 下段、for文内でインクリメントされたsizeを使っていることからも納得です。 「入力するたび・・・イメージしています。」な訳ないですよね。 学習ではMac gccを利用してます。 おかげで操作法の副産物も得る事ができました。 free()の詳細もありがとうございました。 重ねて御礼申し上げます。 「25年くらい前・・・」恐れ入ります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2364] Re:ポインタ完全制覇 LIST 4-4 realloc.c
投稿者:(ぱ)こと管理人
2024/03/02 02:08:03

> ①第4章、List 4-4 realloc.c(p238)でint型の値(数値)を入力しても、 >17行目〜19行目のprintf("variable_array[%d]..%d¥n", i, variable_array[i]);が >表示されません。 このプログラムは、数値を入力するwhileループが11~15行目にあり、 そのwhileループが終わった後、17~19行目に、配列の内容を表示する forループがあります。whileループが終わってからforループが始まるので、 値(数値)を入力するたびに何かが表示されるわけではありません。 このプログラムは、 ①ユーザが数値をいくつか入力する。いくつ入力するかはわからない。 ②ユーザが数値の入力を終えたら、入力された数値を全部表示する。 というものです。①が終わってから②を実行します。 ①でユーザがいくつ数値を入力するかわからないから、realloc()で 配列を伸ばしていく、というのが趣旨です。 ①で、入力を終えるには、Windowsなら、数値をいくつか入力後、 Ctrl+Z を押してからENTERを押してください。 > ②List4-3,4-4でfree(variable_array);と私は記述を加えました。 >本章でfree()を使われていないのはどのような理由からでしょうか。 >入門者向け学習サイトでは「必ずfree()」,「プログラム終了時に消える」、 >様々な事が書かれています。 それについては25年くらい前にここに書きました。 https://kmaebashi.com/programmer/c_yota/malloc.html WindowsでもLinuxでも、まともなOSならプログラム終了時にはfree()しなくても 解放してくれるので、たとえばライブラリとして再利用することなど考えられない 書籍のサンプルコードでは、free()は不要だと私は考えています。 当時のfj.comp.lang.cのやりとりも検索したら残っていました。 https://groups.google.com/g/fj.comp.lang.c/c/G4HRnHTdImg?pli=1 まあ、これぐらいもめる話ではあるので、深入りしないほうが無難かと思います……
[この投稿を含むスレッドを表示] [この投稿を削除]
[2363] ポインタ完全制覇 LIST 4-4 realloc.c
投稿者:トト
2024/02/29 23:14:47

 前回、!isalnumの件で伺った者です。 教えて頂き、ありがとうございました。  今回も「ポインタ完全制覇」内の本章の主旨からずれてますが、 自力解決できない箇所があり、申し訳ありませんが二つ質問さてください。  ①第4章、List 4-4 realloc.c(p238)でint型の値(数値)を入力しても、 17行目〜19行目のprintf("variable_array[%d]..%d¥n", i, variable_array[i]);が 表示されません。 試しに11行目、while分のブロック内で15行目に printf(" VARIABLE_ARRAY[%d] = %d\n", size-1, variable_array[size-1]);と記述を加えたら、 int型の値を入力する度に上記printf文は表示されます。  List4-4の正しい表示結果は、値(数値)を入力するたびに18行目のprintf文が表示される イメージをしています。 なぜ18行目のprintf文が表示されないのか教えてください。 又、私の理解不足がありましたらご指摘ください。 ②List4-3,4-4でfree(variable_array);と私は記述を加えました。 本章でfree()を使われていないのはどのような理由からでしょうか。 入門者向け学習サイトでは「必ずfree()」,「プログラム終了時に消える」、様々な事が書かれています。 教えて頂けたら幸いです。 今回もこのようなレベルですみません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2362] Re:unix 用ソースコードのダウンロード
投稿者:ken
2024/02/23 04:19:07

早速のご対応、ありがとうございました。 無事、ダウンロードできました。 >ken様 >ご指摘ありがとうございます。 >>本書購入後にunix 用のソースコード(https://kmaebashi.com/seiha2/src_unix.tgz)を >>ダウンロードしようとしているのですが、 >>Not found が返されます。 > >経緯はわかりませんが、取り急ぎ復元しました。 >ただ、現在復元した版だと、p.258 Lis4-13 read_line.cの、以下の問題が >直っていないようです。 >https://kmaebashi.com/seiha2/seigo.html#p258 > >申し訳ありませんが修正のうえご利用ください。 >Windows版のsrc_win.zipは直っているのかと思ったら、そちらもそのままでした。 >連休中に対応します。 > >ご迷惑をおかけしまして申し訳ありません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2361] Re:unix 用ソースコードのダウンロード
投稿者:(ぱ)こと管理人
2024/02/23 01:30:01

ken様 ご指摘ありがとうございます。 >本書購入後にunix 用のソースコード(https://kmaebashi.com/seiha2/src_unix.tgz)を >ダウンロードしようとしているのですが、 >Not found が返されます。 経緯はわかりませんが、取り急ぎ復元しました。 ただ、現在復元した版だと、p.258 Lis4-13 read_line.cの、以下の問題が 直っていないようです。 https://kmaebashi.com/seiha2/seigo.html#p258 申し訳ありませんが修正のうえご利用ください。 Windows版のsrc_win.zipは直っているのかと思ったら、そちらもそのままでした。 連休中に対応します。 ご迷惑をおかけしまして申し訳ありません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2360] unix 用ソースコードのダウンロード
投稿者:ken
2024/02/22 06:28:33

お世話になります。 本書購入後にunix 用のソースコード(https://kmaebashi.com/seiha2/src_unix.tgz)をダウンロードしようとしているのですが、 Not found が返されます。 ご確認いただけますでしょうか。 よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2359] Re:無題
投稿者:(ぱ)こと管理人
2024/02/17 16:17:18

>行末に「^」が入っているのは、私がこれをバッチファイルにしたからで、 >バッチファイルではコマンドの途中で開業を入れる時には「^」を書くからです。 以下のページですね。ご指摘ありがとうございます。修正いたしました。 https://kmaebashi.com/programmer/accesscounter/index.html
[この投稿を含むスレッドを表示] [この投稿を削除]
[2358] 無題
投稿者:rike1019
2024/02/17 02:36:29

行末に「^」が入っているのは、私がこれをバッチファイルにしたからで、バッチファイルではコマンドの途中で開業を入れる時には「^」を書くからです。 誤 開業 正 改行
[この投稿を含むスレッドを表示] [この投稿を削除]
[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含め、「国際的なセキュリティ標準」が何を言っているのか知らないわけはないですし。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2325] 無題
投稿者:mhash
2022/10/30 08:34:03

kmaebashiさんが『「サニタイズ言うなキャンペーン」について、私の解釈』や、著書でも述べられている、「SQLやHTML等で特別な意味を持つ文字列のエスケープは、入力時ではなくそれが外部に出力される直前に行うべき」という主張は納得できるものだと私も思います。 ただ、以下リンク先のページを見ると、CWE-20等の国際的なセキュリティ標準でも入力時のチェックを奨励しているように思えまして、ちょっと混乱しています。 https://gihyo.jp/dev/serial/01/php-security/0045 「ユーザーからの入力はどんな文字列でも扱えるべきだが、システム内の各階層では、メソッドの引数チェックなりをしっかりやるように」との意味合いなのでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2324] Re:【雑談】JavaScriptの「オブジェクト指向」はやわかり
投稿者:rike1019
2022/10/15 11:42:19

書いてあったんですね。失礼しました。m(_ _)m
[この投稿を含むスレッドを表示] [この投稿を削除]
[2323] Re:【雑談】JavaScriptの「オブジェクト指向」はやわかり
投稿者:(ぱ)こと管理人
2022/10/15 11:34:06

>読みました。 読んでいただきありがとうございます。 >この参照値という言葉は初出な気がするのですが、 以下のページで出ています。 http://kmaebashi.com/programmer/beginner/javascriptintro.html http://kmaebashi.com/programmer/beginner/array.html 検索経由とかでこのページから読み始める人もいるかもしれませんが、 >JavaScriptでは、オブジェクトは参照経由でアクセスします。 >関数もオブジェクトですから、参照で扱います。ここでは、alertとmyAlertは、 >どちらも同じ関数オブジェクトを「指して」います。 >つまり、alertやmyAlertが保持しているのは関数そのものに対する参照値です。 と書いていて、図も入れてあって「オブジェクトは参照経由でアクセスします」の ところはリンクにもしてありますから、よっぽど大丈夫なんじゃないかと思っています。 ご意見ありがとうございました。 (参照周りは、「参照渡し」とかでググると絶望するほどに誤解の多いところでは あるので、くどいぐらいに書いておいた方がよいのかもしれませんが)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2322] 【雑談】JavaScriptの「オブジェクト指向」はやわかり
投稿者:rike1019
2022/10/14 10:06:40

読みました。 > そして、JavaScriptの関数がオブジェクトであるということは、 > 通常のオブジェクトと同じように、 > その参照値を変数に代入したり、関数の引数にしたり、 > 関数から戻り値として返したりできるということです この参照値という言葉は初出な気がするのですが、 私はJavaを少しかじったのでプリミティブ型と参照型があるんだなー となんとなくわかるのですが、 はじめてのプログラミングの方は「参照って何?」と思うかもしれません。 他のページで解説されている箇所があったらすみません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2321] Re:無題
投稿者:(ぱ)こと管理人
2022/09/30 01:04:31

>コンパイルエラーは警告ではなくエラーなので修正したほうがいいと思います。 ご指摘ありがとうございます。上の行をコピペしてそのままにしてしまいました。 修正しました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2320] 無題
投稿者:rike1019
2022/09/29 05:57:04

「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」ダウンロード http://kmaebashi.com/webserver/download.html このページの > 2022/09/23追記:現状のソースだと、Tomcat10以降は警告が出ます。補足を参照してください。 コンパイルエラーは警告ではなくエラーなので修正したほうがいいと思います。 細かいことですがよろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2319] 無題
投稿者:吉野刹那
2022/09/27 18:35:59

>>2311 変な書き込みをしてしまいすみません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2318] Re:衝突判定と爆発のナビゲーションリンクについて
投稿者:(ぱ)こと管理人
2022/09/27 01:35:22

ご指摘ありがとうございます。 >* 10進数の20は16進数で14で文字はDC4 >* 10進数の32は16進数で20で文字はSP > 前のページ | 前のページ | ひとつ上のページに戻る | トップページに戻る 上記2点とも修正しました。 また何かありましたらよろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2317] 衝突判定と爆発のナビゲーションリンクについて
投稿者:rike1019
2022/09/26 09:46:26

(出先でChromebookで書いているのでリモートホストが変わっていますが) rike1019は同一人物です。 衝突判定と爆発――完全初心者のためのプログラミング入門 http://kmaebashi.com/programmer/beginner/collision.html このページの最下部のナビゲーションの「次のページ」のリンクが コピペでミスしたのか「前のページ」になっていて次のページに飛べません。 > 前のページ | 前のページ | ひとつ上のページに戻る | トップページに戻る 修正したほうがよろしいかと思います。いかがでしょうか? よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2316] 「文字コード」とは何か?ASCIIコードの説明について
投稿者:rike1019
2022/09/26 01:39:47

表1: ASCIIコード表を見ながら文章を読んでいましたが混乱したところがあります。 >今ではほとんど使われないものが大多数ですが、 >9のHTはHorizontal Tabulation――水平タブ、 >要するにTABキーを押すと挿入されるタブのことですし、 >10と13のLF, CRは改行コードとして使われています。 >また、20のSPは、空白を意味しています。 この9と10と13は10進数の数値の欄を指していますが、20のSPは16進数の数値の欄を指しています。混乱します。どちらかに統一したほうがいいと思います。 * 10進数の20は16進数で14で文字はDC4 * 10進数の32は16進数で20で文字はSP 修正したほうがよろしいかと思いますがいかがでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2315] Re:UFOを飛ばそうの部分についての質問
投稿者:(ぱ)こと管理人
2022/09/25 23:15:45

>リスト9: lesson04_5.html(UFOを動かすことに成功) >の20行目で、mainLoop();を呼んでいますが、まだ関数を定義する前の行です。 >なぜ、JavaScriptでこれはエラーにならないのでしょうか? これは、JavaScriptの「巻き上げ」(hoisting)と呼ばれる機能のおかげです。 https://developer.mozilla.org/ja/docs/Glossary/Hoisting JavaScriptがなぜこうしたのかといえば、単純に「その方が便利だと思ったから」 なのだと思います。たとえばJavaではメソッドの宣言順は動作に影響せず、 宣言前のメソッドも呼び出せます。もっと古い言語であるCでは、巻数は事前に 定義されていなければ呼び出せず、関数funcAがfuncBを呼び出し、 funcBがfuncAを呼び出すような相互呼び出しをやりたいときには、どちらか片方を 事前に「プロトタイプ宣言」しておく必要がありました(不便です)。 Cで不便だと思われていて、Javaでは改善されたわけですから、Javaに似せた言語である JavaScriptでは、それはJavaに合わせるでしょう。 もっとも、さすがは変態言語というか、JavaScriptでは「巻き上げ」が 関数だけでなく変数に対しても、しかも関数内の変数に対しても適用されるので、 いろいろ混乱の元になっています。 https://analogic.jp/hoisting/ >私は「完全」初心者ではないのですが、python3では、 >mainloop() >def mainloop(): > print("Hello, world!") >と書くと「NameError: name 'mainloop' is not defined」とエラーが出ます。 pythonではなぜ関数を先に定義しておく必要があるかといえば、pythonでは 関数定義のdefは通常の実行文であり、それが実行されて初めて関数が定義されるからです (逆に言うと、JavaScriptやJavaやCでは、関数定義は実行文ではありません)。 pythonのdefは単なる文なので、たとえばif文の中でdefができます。 a = 10; if a == 10: def func(): print("hoge") else: def func(): print("piyo") func() このコードは、最初にaに代入する値によって、funcの定義が変わります。 CやJavaのような言語では、こういうことはできません。CやJavaでは、関数定義は、 コンパイルの時点で決まります。 JavaScriptはJavaに似せた言語なので、これを引き継いだのだと思います。 ではJavaScriptではif文の中にfunctionは書けないのか、といえば、これがどうも 書けるようで、でも「結果は実装によって一貫性がない」そうです。さすがは変態言語。 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/function | 関数は条件付きで宣言できます。つまり、関数文を if 文の中に入れ子にすることができますが、 | 結果は実装によって一貫性がないので、このパターンを本番コードでは使用すべきではありません。 | 条件付きの関数の作成には、代わりに関数式を使用してください。 私自身、CやJavaのプログラマなので、自分で言語を作ったときには、 型なし言語のcrowbarも、静的型付け言語のDiksamも、関数定義を実行文にはしませんでした。 http://kmaebashi.com/programmer/devlang/index.html なので、JavaScriptの関数定義については、このようにした気持ちはわかります。 変数定義まで(それもローカル変数まで)同じように巻き上げられるようにしたのは、 正直、理解不能ですが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2314] UFOを飛ばそうの部分についての質問
投稿者:rike1019
2022/09/25 20:01:07

リスト9: lesson04_5.html(UFOを動かすことに成功) の20行目で、mainLoop();を呼んでいますが、まだ関数を定義する前の行です。 なぜ、JavaScriptでこれはエラーにならないのでしょうか? 私は「完全」初心者ではないのですが、python3では、 mainloop() def mainloop(): print("Hello, world!") と書くと「NameError: name 'mainloop' is not defined」とエラーが出ます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2313] Re:【雑談】完全初心者のためのプログラミング入門の対象読者について
投稿者:(ぱ)こと管理人
2022/09/25 14:41:37

>「完全初心者のためのプログラミング入門」を楽しく読まさせていただきました。 読んでいただきありがとうございます。 >Windows前提なのが、まず今の子供達持ってるのかな?と思いました。 確かにそれは私も不安に思っているところです。 >GIGAスクール構想で配られてるのがiPadだったりChromebookだったりして >Windows搭載のPCを配ってても開発ツールとか入れられないように >セキュリティガチガチにしてるっぽいですし >まず個人で自由に使えるパソコンを持ってる子供が >少ないんじゃないかな?と思いました。 そのあたりの事情は私は詳しくないのですが、Windows PCを配っていて セキュリティガチガチにされていたとしても、ローカルにHTMLを置いて ダブルクリックしたらEdgeが立ち上がるんじゃないでしょうか。 それも禁止されているのでしょうか。 Chromebookも持ってないのですが、エディタでHTML書いてダブルクリックして 開く、ということはできるようなので、適宜読みかえていただければと思います (子供にそれは難しいかもしれませんが、私が持ってない以上解説も書けませんし)。 >GIGAスクールで配られてるものってスペック低い上に、 >日本はハイエンドスマホのiPhoneの普及率が高いので だからといってiOSアプリを作るとなるとハードルが極端に上がりますからね (AndroidはともかくiOSとなると、私だって作れない。Macを買う気も Appleにお金を払う気もないので)。 スマホはさておきパソコンでさえあれば、MacでもChromebookでも HTMLは書けるでしょうから、「ファイルとフォルダ」、「Webページを作ろう」の章より 後ろのJavaScriptを書き始めたあたりからを参考にしてもらえれば、と思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2312] 【雑談】完全初心者のためのプログラミング入門の対象読者について
投稿者:rike1019
2022/09/25 13:14:48

「完全初心者のためのプログラミング入門」を楽しく読まさせていただきました。 Windows前提なのが、まず今の子供達持ってるのかな?と思いました。 GIGAスクール構想で配られてるのがiPadだったりChromebookだったりして Windows搭載のPCを配ってても開発ツールとか入れられないように セキュリティガチガチにしてるっぽいですし まず個人で自由に使えるパソコンを持ってる子供が 少ないんじゃないかな?と思いました。 西村博之(ひろゆき)がそれを危惧して ゲームもできるパソコンを児童養護施設に配る企画やってましたけど。 GIGAスクールで配られてるものってスペック低い上に、 日本はハイエンドスマホのiPhoneの普及率が高いので 「パソコンってなんか遅いし持ち運ぶのにも重いしスマホ(iPhone)でいいや」 ってならないかと心配です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2311] Re:初めまして
投稿者:(ぱ)こと管理人
2022/09/22 00:08:09

>こんにちは。 こんにちは。 で、何の御用でしょうか? テスト投稿ならテスト掲示板の方にお願いします。 http://kmaebashi.com/bbs/list.php?boardid=testbbs
[この投稿を含むスレッドを表示] [この投稿を削除]
[2310] 初めまして
投稿者:吉野刹那
2022/09/21 15:31:47

こんにちは。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2309] Re:Tomcat 10のパッケージ名の変更について
投稿者:(ぱ)こと管理人
2022/09/21 01:39:18

>https://qiita.com/nfujita55a/items/b335688ea2a696387deb > >このQiita記事に載っていたのですがTomcat10だと >以前以下のように書いていたインポート元を > >import javax.servlet.* > >以下のように書き換えないとコンパイルエラーになるようです。 ご連絡いただきありがとうございます。これはなかなか大きな変更ですね。 週末あたりに、Webページに注記を入れようかと思います。 ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2308] Tomcat 10のパッケージ名の変更について
投稿者:rike1019
2022/09/19 15:29:17

https://qiita.com/nfujita55a/items/b335688ea2a696387deb このQiita記事に載っていたのですがTomcat10だと 以前以下のように書いていたインポート元を import javax.servlet.* 以下のように書き換えないとコンパイルエラーになるようです。 import jakarta.servlet.* JavaとTomcatの環境構築でハマったので報告しておきます。 ウェブ上のほとんどのJava解説記事がjavax.servletと書いているので 何が悪いのかさっぱりわからず困りましたが単純な変更でした。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2307] Re:『Webサーバを作りながら学ぶ~』のコンパイルについて
投稿者:(ぱ)こと管理人
2022/08/28 00:25:52

>OpenJDK 18でコンパイルしたところ、以下のメッセージが表示されました。 >ソースコードが古いAPIを使っているようです。 ご連絡ありがとうございます。私の方でも再現しました。 C:\maebashi\temp\src_20181021\src\appendix\Henacat_0_4>javac -encoding SHIFT_JIS -Xlint:deprecation com\kmaebashi\henacat\webserver\Main.java .\com\kmaebashi\henacat\servletimpl\ServletService.java:12: 警告:[deprecation] ClassのnewInstance()は推奨されません return (HttpServlet)clazz.newInstance(); ^ Tが型変数の場合: クラス Classで宣言されているT extends Object 警告1個 Java9からClass#newInstance()がdeprecatedになっているのですね (執筆時はJava8だったので気付いていませんでした)。 https://qiita.com/deaf_tadashi/items/3c3118e660861fb43434 Webページに案内を入れる等、なんらかの形で対応いたします。ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2306] 『Webサーバを作りながら学ぶ~』のコンパイルについて
投稿者:rike1019
2022/08/27 19:10:56

OpenJDK 18でコンパイルしたところ、以下のメッセージが表示されました。 ソースコードが古いAPIを使っているようです。 以下コマンドプロンプトからコピーしたものです。 F:\Programming\src\appendix\Henacat_0_4>javac -encoding SHIFT_JIS F:\Programming\src\appendix\Henacat_0_4\com\kmaebashi\henacat\webserver\Main.java ノート:.\com\kmaebashi\henacat\servletimpl\ServletService.javaは 推奨されないAPIを使用またはオーバーライドしています。 ノート:詳細は、-Xlint:deprecationオプションを指定して再コンパイルしてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2305] Re:offsetofの定義について
投稿者:mhash
2022/07/10 19:13:03

>>https://www.wdic.org/w/TECH/offsetof >>上記リンク先のページにあるように、Cのoffsetofマクロを >>#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) >>という形式で実装している処理系は多いかと思います。そして、TYPE構造体の先頭部分の >>アドレスを0番地とすれば、MEMBERへのオフセットが取得出来ることも理解できます。 >>しかし、『ポインタ完全制覇』でも触れられていた通り、0という定数は、ポインタ型とし >>て扱われる文脈ではNULLになるはずです。このマクロはNULL参照を行ったとしてクラッシュ >>を引き起こさないのでしょうか? > >ご質問は、ヌルポインタから->MEMBERの形で指す先を参照した時点で落ちるのでは、 >ということですよね。 >これについてはJIS X 3010:2003であれば「6.6 定数式」のところに、「アドレス定数」として >以下の記述があります。 > >| アドレス定数(address constant)は,空ポインタ,静的記憶域期間のオブジェクトを >| 指し示す左辺値を指すポインタ又は関数指示子を指すポインタとする。 >| アドレス定数は,単項&演算子若しくは整数定数のポインタ型へのキャストによって >| 明示的に生成されるか,又は配列型若しくは関数型の式の使用によって >| 暗黙に生成されたものでなければならない。配列添字演算子[],メンバアクセス演算子. >| 及び->,アドレス単項演算子&,間接単項演算子*,並びにポインタへのキャストは, >| アドレス定数の生成に使用してもよいが,これらの演算子を使用することによって >| オブジェクトの値をアクセスしてはならない。 > >空ポインタから->とか&で「アドレス定数」を生成するのはよいが、その先を参照しては >いけない、と書いてあるように読めます。 >このoffsetofの定義は、これに合致しているのではないでしょうか。 > ご返信遅くなり申し訳ありません。 空ポインタからアドレス型の定数を生成するのは大丈夫だから、それを有効なアドレス空間内でポインタ演算して、その先を参照するのはOKということですよね? ご回答ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2304] Re:offsetofの定義について
投稿者:(ぱ)こと管理人
2022/06/29 23:32:51

>https://www.wdic.org/w/TECH/offsetof >上記リンク先のページにあるように、Cのoffsetofマクロを >#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) >という形式で実装している処理系は多いかと思います。そして、TYPE構造体の先頭部分の >アドレスを0番地とすれば、MEMBERへのオフセットが取得出来ることも理解できます。 >しかし、『ポインタ完全制覇』でも触れられていた通り、0という定数は、ポインタ型とし >て扱われる文脈ではNULLになるはずです。このマクロはNULL参照を行ったとしてクラッシュ >を引き起こさないのでしょうか? ご質問は、ヌルポインタから->MEMBERの形で指す先を参照した時点で落ちるのでは、 ということですよね。 これについてはJIS X 3010:2003であれば「6.6 定数式」のところに、「アドレス定数」として 以下の記述があります。 | アドレス定数(address constant)は,空ポインタ,静的記憶域期間のオブジェクトを | 指し示す左辺値を指すポインタ又は関数指示子を指すポインタとする。 | アドレス定数は,単項&演算子若しくは整数定数のポインタ型へのキャストによって | 明示的に生成されるか,又は配列型若しくは関数型の式の使用によって | 暗黙に生成されたものでなければならない。配列添字演算子[],メンバアクセス演算子. | 及び->,アドレス単項演算子&,間接単項演算子*,並びにポインタへのキャストは, | アドレス定数の生成に使用してもよいが,これらの演算子を使用することによって | オブジェクトの値をアクセスしてはならない。 空ポインタから->とか&で「アドレス定数」を生成するのはよいが、その先を参照しては いけない、と書いてあるように読めます。 このoffsetofの定義は、これに合致しているのではないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2303] 無題
投稿者:mhash
2022/06/29 21:11:14

連投申し訳ありません。Cの標準ライブラリのoffsetofマクロについて質問させてください。 https://www.wdic.org/w/TECH/offsetof 上記リンク先のページにあるように、Cのoffsetofマクロを #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) という形式で実装している処理系は多いかと思います。そして、TYPE構造体の先頭部分のアドレスを0番地とすれば、MEMBERへのオフセットが取得出来ることも理解できます。 しかし、『ポインタ完全制覇』でも触れられていた通り、0という定数は、ポインタ型として扱われる文脈ではNULLになるはずです。このマクロはNULL参照を行ったとしてクラッシュを引き起こさないのでしょうか? それとも、offsetofをこのように実装している処理系では何らかの特別な処理を入れているのでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2302] Re:無題
投稿者:mhash
2022/06/29 11:34:51

>>すみません、以前から気になっていたのですが、 >>トップページの「Contents」のサブコンテンツの「プログラマなページ」の項目一覧に >>「プログラミング言語samplan」が記載されていません。 > >うーん、ここには「プログラマなページ」以下にあるものすべてを載せている >わけではないので、 > >http://kmaebashi.com/programmer/index.html > >samplanのようなちょろっと書いたようなプログラムは記載しなくていいんじゃないかな、 >という判断でこうしています。 > ご回答ありがとうございます。 確かに「プログラマなページ」以下の項目すべてを目次に載せているわけではなかったですね。失礼いたしました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2301] Re:C言語とRustの関係について
投稿者:(ぱ)こと管理人
2022/06/28 23:48:08

>今後はRustを勉強していくべきだと思いますか? WebAssemblyはともかくとして、今後のシステム記述言語がRustに置き換わっていくというのは 十分ありそうな話だと思います。さすがにC/C++は危ないので。 なので私もRustを勉強しようと思いつつ、ほぼ手が出せていない状態です……
[この投稿を含むスレッドを表示] [この投稿を削除]
[2300] C言語とRustの関係について
投稿者:rike1019
2022/06/27 17:20:33

リーナスはLinuxカーネルの3000万行あるCコードを Rustで書き直す気はないと言っていますが 第2言語としてRustを採用するらしいです。 今後はRustを勉強していくべきだと思いますか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2299] Re:無題
投稿者:(ぱ)こと管理人
2022/06/19 13:08:39

>すみません、以前から気になっていたのですが、 >トップページの「Contents」のサブコンテンツの「プログラマなページ」の項目一覧に >「プログラミング言語samplan」が記載されていません。 うーん、ここには「プログラマなページ」以下にあるものすべてを載せている わけではないので、 http://kmaebashi.com/programmer/index.html samplanのようなちょろっと書いたようなプログラムは記載しなくていいんじゃないかな、 という判断でこうしています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2298] 無題
投稿者:mhash
2022/06/18 21:36:30

すみません、以前から気になっていたのですが、 トップページの「Contents」のサブコンテンツの「プログラマなページ」の項目一覧に「プログラミング言語samplan」が記載されていません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2297] Re:「関数へのポインタにおける混乱」の「intを返す」という記述について
投稿者:(ぱ)こと管理人
2022/06/15 00:37:54

こんにちは。 >> しかし,C の宣言をここまでに述べた規則に基づいて解釈すれば,たとえばint func();という宣言において, >>funcは「intを返す関数」であり,funcだけを取り出して「intを返す関数へのポインタ」になるのは変です. >>関数へのポインタが必要なら,&を付けて,&funcとしなければならないはずです. >上記文章では「intを返す関数」と、『intを返す』が「」の中に入って強調されていますが、 >実はここではintを返す事自体は重要ではありません。 intを返す事自体は重要ではない、というのはその通りです。 ただ、この本の3章でかなり強調して説明しているのは、Cの宣言の読み方です。 「識別子を起点に優先順位に基づいて英語順に読む」という読み方を前半で説明しているので、 「C の宣言を『ここまでに述べた規則に基づいて』解釈すれば,」と書いているわけです。 3章前半で説明した規則に基づいてint func();を解釈すれば、やはり「intを返す関数」です。 「intを返す」は確かにそう重要ではないですが、だからってここでだけそこをはしょってしまったら、 混乱する読者もいるのではないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2296] 「関数へのポインタにおける混乱」の「intを返す」という記述について
投稿者:jcv
2022/06/13 17:38:41

3-5-4 関数へのポインタにおける混乱(C言語 ポインタ完全制覇(旧版)) 3-5-5 関数へのポインタにおける混乱(C言語 ポインタ完全制覇(第2版)) の、以下の記載に関してです。 > しかし,C の宣言をここまでに述べた規則に基づいて解釈すれば,たとえばint func();という宣言において,funcは「intを返す関数」であり,funcだけを取り出して「intを返す関数へのポインタ」になるのは変です.関数へのポインタが必要なら,&を付けて,&funcとしなければならないはずです. この文章ですが、何度か読んでいるのですが、実は今迄理解出来ていませんでしたが、読み飛してしまっていました。今回、改めて読み直してやっと理解する事が出来ました。わかってしまえば、大した事ではないのですが、他の方が同じ疑問を持たれている可能性もありますので、お知らせしておきます。 上記文章では「intを返す関数」と、『intを返す』が「」の中に入って強調されていますが、実はここではintを返す事自体は重要ではありません。 これがわかりにくくしていると思います。仮に「intを返す」を抜いてみると、 > しかし,C の宣言をここまでに述べた規則に基づいて解釈すれば,たとえばint func();という宣言において,funcは「関数」であり,funcだけを取り出して「関数へのポインタ」になるのは変です.関数へのポインタが必要なら,&を付けて,&funcとしなければならないはずです. となります。この方がずっと理解しやすくなると思います。もし、「intを返す」を入れるのであれば、以下の様に括弧に入れた方が良いと思います。 > しかし,C の宣言をここまでに述べた規則に基づいて解釈すれば,たとえばint func();という宣言において,funcは(intを返す)「関数」であり,funcだけを取り出して(intを返す)「関数へのポインタ」になるのは変です.関数へのポインタが必要なら,&を付けて,&funcとしなければならないはずです. いかがでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2295] Re:『Webサーバを作りながら学ぶ~』の内容は今後も有効か?
投稿者:(ぱ)こと管理人
2022/06/10 01:19:51

こんにちは。タイトル変えました。 >「HTTP/3」が発表されたようですが、 >Webアプリケーションの仕組みはそんなに変わらないと思いますか? >言い換えると前橋さんの著書の >『Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門』 >の内容は今後も有効でしょうか? これは、ふたつの面から考えられると思います。 ひとつは、HTTP/2であってもHTTP/3であっても、変わったところは高速化のために 伝送方式を変えたことであって、ヘッダ圧縮とかコネクションの並列化はやっているに しても、その上を流れるデータはHTTP/1と変わりはないということです。 なので、送受信されるデータ(HTTPリクエスト/レスポンスヘッダとか、ステータス コードとか)の説明については、今後も有効です。 もうひとつは、HTTP/2や3で変わった、伝送方式についてです。 『Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門』では、 TCPを受けるサーバを自作で立てて、それを本物のWebブラウザで叩いてみたり、 自作のTCPクライアントから本物のWebサーバを叩くようなこともしています。 これはまさに伝送方式に関わる部分で、HTTP/2や3で変わったところです。 HTTP/2や3対応のWebサーバを自作しようと思ったら、あの本の知識では無理です。 なのでたとえばEdgeやChromeやFirefoxが、明日からHTTP/2以上しか対応しません、 となれば、自作のHenacatを、普段使いのブラウザで叩くことはできなくなります。 それでは「Webサーバを作りながら学ぶ」という本の趣旨はだいなしですが、 そんな日は、当分来ないのではないかと思っています。 本が古くなる心配といえば、2016年出版の時点でさえ、わざわざブラウザに IEを選ぶことはなかったのではないか、とは自分でも思いますが、 これはそれなりに意図をもって選びました。キラキラWebエンジニアだけでなく、 企業内とかの泥臭いシステムを作っているプログラマにも届けたかったためです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2294] 無題
投稿者:rike1019
2022/06/09 18:40:59

「HTTP/3」が発表されたようですが、 Webアプリケーションの仕組みはそんなに変わらないと思いますか? 言い換えると前橋さんの著書の 『Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門』 の内容は今後も有効でしょうか? IPV6が発表されてからもIPV4がすごく長く使われてることから 既存の技術からの移行ってあまり進まないイメージがあります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2293] Re:無題
投稿者:mhash
2022/05/23 08:50:29

>>現在某所で話題になってるゆっくり動画問題ってどう思われますか? > >本件そんなちゃんと追ってないですが。 >私は「ゆっくり」の動画はそりゃ知ってますけれども、「ゆっくり茶番劇」なる言葉は >知りませんでした(そういう人は多いようです)。でも、検索したら万単位でひっかかってくる >言葉を、縁もゆかりもない人が商標取って、使用料払えってそりゃいくらなんでも >めちゃくちゃでしょう。 > やっぱりそうですよね…自分も「ゆっくり茶番劇」なる名称は知りませんでしたが、「ゆっくり解説」とかの動画はよく見てたので、そういうコミュニティの中で普通に使われてる言葉を独占しようとするのはそりゃおかしいよなと思いました。 >>過去ののまネコ問題との類似性も指摘されているようですが(私はのまネコの方は >>当時中学生くらいだったので詳しくないのですが…) > >のまネコ問題は、 >・本来だったら著作権的に真っ黒なFLASH動画について、本来だったら怒ってもいいavexが > それを面白がって、作者の同意のもとCDに付けたりして、 >・流行ったのでぬいぐるみとかを出すにあたって、モナーやらとはわざわざ形や名前を > 変えたネコをデザインし、そちらで商標を取った。 > >というものです。まったく類似していません。 > あー…そういう感じのものだったんですね。知りませんでした。 確かにあのころの2chって、大手企業には敵意剥き出しな癖に、自分達の権利侵害には無頓着な雰囲気がありましたね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2292] Re:無題
投稿者:(ぱ)こと管理人
2022/05/20 22:22:59

>現在某所で話題になってるゆっくり動画問題ってどう思われますか? 本件そんなちゃんと追ってないですが。 私は「ゆっくり」の動画はそりゃ知ってますけれども、「ゆっくり茶番劇」なる言葉は 知りませんでした(そういう人は多いようです)。でも、検索したら万単位でひっかかってくる 言葉を、縁もゆかりもない人が商標取って、使用料払えってそりゃいくらなんでも めちゃくちゃでしょう。 >過去ののまネコ問題との類似性も指摘されているようですが(私はのまネコの方は >当時中学生くらいだったので詳しくないのですが…) のまネコ問題は、 ・本来だったら著作権的に真っ黒なFLASH動画について、本来だったら怒ってもいいavexが  それを面白がって、作者の同意のもとCDに付けたりして、 ・流行ったのでぬいぐるみとかを出すにあたって、モナーやらとはわざわざ形や名前を  変えたネコをデザインし、そちらで商標を取った。 というものです。まったく類似していません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2291] 無題
投稿者:mhash
2022/05/20 00:53:19

現在某所で話題になってるゆっくり動画問題ってどう思われますか? 過去ののまネコ問題との類似性も指摘されているようですが(私はのまネコの方は当時中学生くらいだったので詳しくないのですが…)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2290] Re:C言語ポインタ完全制覇、記述に関する愚痴(^^;
投稿者:(ぱ)こと管理人
2022/05/12 01:08:24

>ちなみに、手元のK&Rの第2版日本語訳(共立出版、1992年10月10日初版121刷、 >年齢がバレる?前橋さんより4年年上のようです)を開いてみたら、p.35(1.8 引数)の上部に、 >『配列の名前が引数として使われるときは、関数に渡される値は、実際には配列の先頭番地 >すなわちアドレスである。配列の要素のコピーは行われない。』 これはまったくその通りなのですが、『配列の名前が引数として使われるときは』という 限定は本当は不要なんですよね。もちろんここでそれを書く必要もないので、この説明が 悪いというわけではないのですが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2288] Re:C言語ポインタ完全制覇、記述に関する愚痴(^^;
投稿者:かずちゃん
2022/05/10 05:16:53

>>Kenneth A. Reek の"Pointers on C"とかではどう表現されているのか読み直してみようかしらん… > >これは私は読んでいないので、何か面白いことが書いてあったら教えてください。 ちなみに、手元のK&Rの第2版日本語訳(共立出版、1992年10月10日初版121刷、年齢がバレる?前橋さんより4年年上のようです)を開いてみたら、p.35(1.8 引数)の上部に、 『配列の名前が引数として使われるときは、関数に渡される値は、実際には配列の先頭番地すなわちアドレスである。配列の要素のコピーは行われない。』 と、「C言語ポインタ完全制覇」を読んだあとである今読むと素直にピピッと理解でき曖昧さも少ない表現がされていました… その他、英語で書かれたCの本で、(英語での)Cの変数の宣言の読み解き方が、「C言語ポインタ完全制覇」同様にわかりやすく書かれた本があったと記憶していた(それが上記Reekの本だと思っていた)のですが、「ポインタ」含め、いまいち、"あぁ、これだこれだ"という箇所がなく… Reek氏の本は、もう一度ひっくり返してみます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2287] Re:C言語ポインタ完全制覇、記述に関する愚痴(^^;
投稿者:(ぱ)こと管理人
2022/05/09 23:10:42

>どう書いたら自然な言い回しと(お感じに)なりますかね? 僕は、今回新板を初めから >読み直して、あらためて、この『単に「ポインタ」と呼んでしまう』中身をキチンと >区別することが正確な理解に繋がるように思えたのですが。(例えば、新板のp.43に >『混同しないように…』と記した直後のp.46の中程では(この場合の「ポインタ」は >「ポインタ型の変数」のことですね)と書いて下さっています) 初版執筆当時、『どう書いても自然な>いい回しにならないので断念』して、 当時の編集さんにも「それは残念ですね」というようなことを言われた記憶があるのですが、 確かにp.71の「…式の中では、配列はその先頭要素へのポインタに読み替えられるのです。」は 「…式の中では、配列はその先頭要素へのポインタ(ポインタ値)に読み替えられるのです。」と 書いてもそんなには違和感はなかったように思いますね。 当時主に気にしていたのは、「ポインタ型」と、「ポインタ型の変数または値」の 区別だったように思いますが…… >Kenneth A. Reek の"Pointers on C"とかではどう表現されているのか読み直してみようかしらん… これは私は読んでいないので、何か面白いことが書いてあったら教えてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2286] Re:C言語ポインタ完全制覇、"「式」に対するsizeof"のキモは?
投稿者:かずちゃん
2022/05/08 11:18:49

>はじめまして。 遅まきながら、はじめまして。 私めがどういう人間であるかということは、別の投稿の方の末尾に記しました(_o_) ご回答ありがとうございます。 >>「2種類の使い方」"sizeof(型名)"と"sizeof 式"のキモ(使い方・形式は何が違うと言っているのか)は、 >>・括弧の有無、 >>・型名に対してsizeofを使うか、式に対して使うか、 >>のいずれなのでしょうか? > >後者です。 ありがとうございます。 >>ページのほぼ中央部で"「sizeof 式」形式にメリットがあるのは…" >>と書かれており、形式、と言われると、式に対して使うのかそれとも型名に対してか、 >>というよりは、括弧の有無のことか?とも迷ってしまいまして… > >言葉がまずかったですかね。括弧の有無のことを言いたかったわけではなくて、 >あくまで「式に対して使うのかそれとも型名に対してか」のつもりでした。 「形式」、とあったので、迷ってしまいました。「対象とできるものが2種類あって、一つは型名、もう一つは式である」と書かれていれば、迷う可能性も低くなったのかもしれませんが… ご著書のような種類の本にすがるのは、僕のようなトーシロ、つまり、理解があやふやなヤツが正しく理解したいがために、なので、なるべく「読むことによって迷ってしまう」表現が少ないと有り難いです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2285] Re:C言語ポインタ完全制覇、記述に関する愚痴(^^;
投稿者:かずちゃん
2022/05/08 11:10:24

ご返信ありがとうございます。 >>と言っているところの、「ポインタ型の値」のことですよね? >>だから「左辺値ではありません」のですよね? > >その通りです。 ありがとうございます。スッキリしました。 今後も、コード・フラグメントと睨めっこしながら、「3つのうちのどれだ?」と考えるようにします。 >>せめて、『単に「ポインタ」と呼んでしまうことが多いので、混同しないように気をつけてください』と >>注意を喚起しているこの本では、随所の「ポインタ」という記述を、混同しにくいように〈クドく〉 >>書き下して書いておいて頂けると有り難かったです。(文字数が増えるのを防ぐなら、「アドレス」とか?) > >『混同しないように気をつけてください』のところについては、実は本書の、 >「新・標準プログラマーズライブラリ」になる前の旧版では、注に >「※せめて本書の中では、区別して表記しようかと思ったのですが、どう書いても自然な >いい回しにならないので断念しました…… すみません」と書いてありました。 >(あれ? 新版では削ったんだっけ?) >というわけで、ここは著者としても忸怩たるところではあります。 をを、確かに、旧版のp.032に(2016年9月15日初版第18刷発行)、その旨書かれていますね。 (旧版、途中でなにか他のことに興味が移ったのか、3-4辺りで読むのが止まってしまっていたようですが…) どう書いたら自然な言い回しと(お感じに)なりますかね? 僕は、今回新板を初めから読み直して、あらためて、この『単に「ポインタ」と呼んでしまう』中身をキチンと区別することが正確な理解に繋がるように思えたのですが。(例えば、新板のp.43に『混同しないように…』と記した直後のp.46の中程では(この場合の「ポインタ」は「ポインタ型の変数」のことですね)と書いて下さっています) 「ポインタ型」、「ポインタ型の変数」等と明示して頂けると、かなり理解のスピードが早まると思います。 Kenneth A. Reek の"Pointers on C"とかではどう表現されているのか読み直してみようかしらん… (実は、暫く触っていなかったC++の勉強を(Lippmanの本で)し直しているうちに、constがまたまたわからなくなって、ご著書を読み返しておりまして… 基礎がしっかりできていないと、結局基礎的なところに戻って理解し直す、ということの繰り返しです… あ、ワタシは、定年もそう遠くないジジイの自称物理屋で、シミュレーション用のツール・キットを使うためにこういう言語を学んでおります。今頃このレベルってのがナニですが…)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2284] Re:C言語ポインタ完全制覇、記述に関する愚痴(^^;
投稿者:(ぱ)こと管理人
2022/05/08 00:43:54

ご意見ありがとうございます。 >p.71には「…式の中では、配列はその要素へのポインタに読み替えられるのです。」と >あります。これって、"ポインタ"とは書かれていますが(そして上のp.193の記述でも >「ポインタに読み替えられ」とありますが)これらって、全て、p.43に『…厄介なことに、 >世間では「ポインタ型」も「ポインタ型の変数」も「ポインタ型の値」も、単に >「ポインタ」と呼んでしまうことが多いので、混同しないように気をつけてください。』 >と言っているところの、「ポインタ型の値」のことですよね? >だから「左辺値ではありません」のですよね? その通りです。 >せめて、『単に「ポインタ」と呼んでしまうことが多いので、混同しないように気をつけてください』と >注意を喚起しているこの本では、随所の「ポインタ」という記述を、混同しにくいように〈クドく〉 >書き下して書いておいて頂けると有り難かったです。(文字数が増えるのを防ぐなら、「アドレス」とか?) 『混同しないように気をつけてください』のところについては、実は本書の、 「新・標準プログラマーズライブラリ」になる前の旧版では、注に 「※せめて本書の中では、区別して表記しようかと思ったのですが、どう書いても自然な いい回しにならないので断念しました…… すみません」と書いてありました。 (あれ? 新版では削ったんだっけ?) というわけで、ここは著者としても忸怩たるところではあります。 >これまでの僕の間違った理解では「strと書くことによって、str[0]の(1文字分を記録できる)アドレスが >渡り、そこにリテラルで3文字も(ヌルを入れると4文字)押し込もうとしているから駄目なんだよな?」と >思っていたのですが、その理解は完全に間違っていて… この「間違った理解」は、strを「ポインタ型の変数」と間違って解釈した、ということであれば、 クドく書き下すべきだったんですかねえ。 ただ、strが「ポインタ型の変数」と解釈したとするとそれは「str[0]の(1文字分を記録できる)アドレス」 とも違うのでは、とは思いますが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2283] Re:C言語ポインタ完全制覇、"「式」に対するsizeof"のキモは?
投稿者:(ぱ)こと管理人
2022/05/08 00:15:24

はじめまして。 >「2種類の使い方」"sizeof(型名)"と"sizeof 式"のキモ(使い方・形式は何が違うと言っているのか)は、 >・括弧の有無、 >・型名に対してsizeofを使うか、式に対して使うか、 >のいずれなのでしょうか? 後者です。 型名に対するsizeof … sizeof(型名) 式に対するsizeof … sizeof 式 です。 >このページの下の方の例で"sizeof(hoge)"と、型名でないhogeに対してsizeof()と >括弧ありの用法をしているので、式に対して使う場合は括弧が必要である、という >可能性は無いとは思いますが… 式に対して使う場合は括弧が必要である、ということはなく、逆に、 型名に対して使う場合は括弧が必須です。上の例、および本の中の例で 「sizeof(型名)」となっている通りです。 もちろん、式を括弧で囲んだものも式ですから、sizeof(式)という書き方は可能です。 優先順位の低い演算子を含む式なら、括弧が必須になるでしょう。「sizeof 3 + 5」は sizeof(int) + 5でintが4バイトなら9になるでしょうが、「sizeof(3 + 5)」は sizeof(8)なので4です。 その意味では、sizeof(hoge)の場合は括弧は必須ではありませんが、 私はこういう場合たいてい括弧を付けるので書いてしまっています。 >ページのほぼ中央部で"「sizeof 式」形式にメリットがあるのは…" >と書かれており、形式、と言われると、式に対して使うのかそれとも型名に対してか、 >というよりは、括弧の有無のことか?とも迷ってしまいまして… 言葉がまずかったですかね。括弧の有無のことを言いたかったわけではなくて、 あくまで「式に対して使うのかそれとも型名に対してか」のつもりでした。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2282] Re:C言語ポインタ完全制覇、記述に関する愚痴(^^;
投稿者:かずちゃん
2022/05/07 21:56:13

あ、勿論、「四季」→「式」です。 >新・標準プログラマーズライブラリ「C言語ポインタ完全制覇」(2017年12月21日初版第1刷発行)について、少々愚痴をば… > >「3-3-3配列→ポインタの読み替え」のp.192の下部には「そして、配列がポインタに読み替えられたとき、そのポインタは左辺値ではありません。」と記述されていて、次のページに続いて > >char str[10]; >str = "abc"; > >に対して、「代入の左辺のstrはもともと配列であり、四季の中ではポインタに読み替えられますが、左辺値ではありませんから、…」と記されています。 > >これって、これまでの僕の間違った理解では「strと書くことによって、str[0]の(1文字分を記録できる)アドレスが渡り、そこにリテラルで3文字も(ヌルを入れると4文字)押し込もうとしているから駄目なんだよな?」と思っていたのですが、その理解は完全に間違っていて… > >p.71には「…式の中では、配列はその要素へのポインタに読み替えられるのです。」とあります。これって、"ポインタ"とは書かれていますが(そして上のp.193の記述でも「ポインタに読み替えられ」とありますが)これらって、全て、p.43に『…厄介なことに、世間では「ポインタ型」も「ポインタ型の変数」も「ポインタ型の値」も、単に「ポインタ」と呼んでしまうことが多いので、混同しないように気をつけてください。』と言っているところの、「ポインタ型の値」のことですよね? >だから「左辺値ではありません」のですよね? > >せめて、『単に「ポインタ」と呼んでしまうことが多いので、混同しないように気をつけてください』と注意を喚起しているこの本では、随所の「ポインタ」という記述を、混同しにくいように〈クドく〉書き下して書いておいて頂けると有り難かったです。(文字数が増えるのを防ぐなら、「アドレス」とか?) > >という愚痴(雑談)でした…
[この投稿を含むスレッドを表示] [この投稿を削除]
[2281] C言語ポインタ完全制覇、記述に関する愚痴(^^;
投稿者:かずちゃん
2022/05/07 17:58:42

新・標準プログラマーズライブラリ「C言語ポインタ完全制覇」(2017年12月21日初版第1刷発行)について、少々愚痴をば… 「3-3-3配列→ポインタの読み替え」のp.192の下部には「そして、配列がポインタに読み替えられたとき、そのポインタは左辺値ではありません。」と記述されていて、次のページに続いて char str[10]; str = "abc"; に対して、「代入の左辺のstrはもともと配列であり、四季の中ではポインタに読み替えられますが、左辺値ではありませんから、…」と記されています。 これって、これまでの僕の間違った理解では「strと書くことによって、str[0]の(1文字分を記録できる)アドレスが渡り、そこにリテラルで3文字も(ヌルを入れると4文字)押し込もうとしているから駄目なんだよな?」と思っていたのですが、その理解は完全に間違っていて… p.71には「…式の中では、配列はその要素へのポインタに読み替えられるのです。」とあります。これって、"ポインタ"とは書かれていますが(そして上のp.193の記述でも「ポインタに読み替えられ」とありますが)これらって、全て、p.43に『…厄介なことに、世間では「ポインタ型」も「ポインタ型の変数」も「ポインタ型の値」も、単に「ポインタ」と呼んでしまうことが多いので、混同しないように気をつけてください。』と言っているところの、「ポインタ型の値」のことですよね? だから「左辺値ではありません」のですよね? せめて、『単に「ポインタ」と呼んでしまうことが多いので、混同しないように気をつけてください』と注意を喚起しているこの本では、随所の「ポインタ」という記述を、混同しにくいように〈クドく〉書き下して書いておいて頂けると有り難かったです。(文字数が増えるのを防ぐなら、「アドレス」とか?) という愚痴(雑談)でした…
[この投稿を含むスレッドを表示] [この投稿を削除]
[2280] C言語ポインタ完全制覇、"「式」に対するsizeof"のキモは?
投稿者:かずちゃん
2022/05/07 14:45:09

くだらない質問で申し訳ありませんが、新・標準プログラマーズライブラリ「C言語ポインタ完全制覇」(2017年12月21日初版第1刷発行)のp.188, "「式」に対するsizeof"の記述に対して質問させて下さいませ。 「2種類の使い方」"sizeof(型名)"と"sizeof 式"のキモ(使い方・形式は何が違うと言っているのか)は、 ・括弧の有無、 ・型名に対してsizeofを使うか、式に対して使うか、 のいずれなのでしょうか? このページの下の方の例で"sizeof(hoge)"と、型名でないhogeに対してsizeof()と括弧ありの用法をしているので、式に対して使う場合は括弧が必要である、という可能性は無いとは思いますが… ページのほぼ中央部で"「sizeof 式」形式にメリットがあるのは…"と書かれており、形式、と言われると、式に対して使うのかそれとも型名に対してか、というよりは、括弧の有無のことか?とも迷ってしまいまして…
[この投稿を含むスレッドを表示] [この投稿を削除]
[2279] Re:「C言語 ポインタ完全制覇」正誤表に「配列とポインタの完全制覇」URLの変更の記載
投稿者:(ぱ)こと管理人
2022/04/28 20:20:21

追記ですが、 とりあえず、第3刷ではmember.nifty.ne.jpになっていて、 第11刷ではkmaebashi.comになっていることは確認しました……
[この投稿を含むスレッドを表示] [この投稿を削除]
[2278] Re:「C言語 ポインタ完全制覇」正誤表に「配列とポインタの完全制覇」URLの変更の記載
投稿者:(ぱ)こと管理人
2022/04/28 20:06:43

ご指摘ありがとうございます。 >C言語 ポインタ完全制覇 の、初版と第2版を比較していた時に気がついた事です。 確認ですが、比較されたのは、2001年の旧版と、2017年の 「新・標準プログラマーズライブラリ」版のものですよね(旧版の1刷と2刷の比較ではなく)。 私の手元にも旧版のすべての刷が整理されて揃っているわけではないので、 どの時点で直したのかはもはや不明ですが、それも含め、正誤表に記載いたしました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2277] 「C言語 ポインタ完全制覇」正誤表に「配列とポインタの完全制覇」URLの変更の記載
投稿者:jcv
2022/04/27 18:18:19

C言語 ポインタ完全制覇 の、初版と第2版を比較していた時に気がついた事です。 第2版の「はじめに」には、元になった初版からの追加/修正内容が記載されていますが、 旧版の「はじめに」には、その前のベースになった「配列とポインタの完全制覇」の話が出ています。 しかし、ここに記載されているURL http://member.nifty.ne.jp/maebashi/programmer/pointer.html はリンク切れになっています。 URLを置き換えて、 「配列とポインタの完全制覇」(1999/6/29 updated) http://kmaebashi.com/programmer/pointer.html にたどりつきました。 この件、「C言語 ポインタ完全制覇」正誤表 http://kmaebashi.com/seiha/seigo.html に、URLの修正があるかもしれないと思い確認しましたが、ありませんでした。 同じページには、「ほげを考えるページ」のURLについて、修正された事が記載されていますので、 「配列とポインタの完全制覇」のページのURLについても、同様に修正しておくべきと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2276] Re:Webアプリケーション開発入門のP97 コンパイルについて
投稿者:(ぱ)こと管理人
2022/03/24 23:12:25

遅くなりましてすみません。 >以下のコマンドを実行する。 >cd C:\maebashi\doc\webserver\src\chap03\testbbs\WEB-INF\classes >C:\maebashi\doc\webserver\src\chap03\testbbs\WEB-INF\classes 「以下のコマンド」の記載がないので、何が悪いのかわかりませんが、 >以下のコマンドでも同様のエラーとなります。 >javac -classpath ./;C:\Tomcat\lib\servlet-api.jar PostBBS.java ここから推測すると、*.javaではなく、PostBBS.javaを指定したのでしょうか? そうだとすると、私の環境でも、以下のエラーが起きました。 C:\maebashi\temp\src_20181021\src\chap03\testbbs\WEB-INF\classes>javac -classpath C:\Tomcat8\lib\servlet-api.jar PostBBS.java PostBBS.java:9: エラー: シンボルを見つけられません Message newMessage = new Message(request.getParameter("title"), ^ シンボル: クラス Message 場所: クラス PostBBS PostBBS.java:9: エラー: シンボルを見つけられません Message newMessage = new Message(request.getParameter("title"), ^ シンボル: クラス Message 場所: クラス PostBBS PostBBS.java:12: エラー: パッケージMessageは存在しません Message.messageList.add(0, newMessage); ^ エラー3個 PostBBS.javaを単独でコンパイルしようとしても、Message.classがまだないためです。 本にあるとおり、*.javaならコンパイルできます。 C:\maebashi\temp\src_20181021\src\chap03\testbbs\WEB-INF\classes>del *.class C:\maebashi\temp\src_20181021\src\chap03\testbbs\WEB-INF\classes>javac -classpath C:\Tomcat8\lib\servlet-api.jar *.java C:\maebashi\temp\src_20181021\src\chap03\testbbs\WEB-INF\classes>dir ドライブ C のボリューム ラベルは Windows です ボリューム シリアル番号は BAC7-DF60 です C:\maebashi\temp\src_20181021\src\chap03\testbbs\WEB-INF\classes のディレクトリ 2022/03/24 23:10 <DIR> . 2022/03/24 23:10 <DIR> .. 2022/03/24 23:10 666 Message.class 2016/06/19 15:47 409 Message.java 2022/03/24 23:10 1,008 PostBBS.class 2016/06/19 15:47 638 PostBBS.java 2022/03/24 23:10 2,720 ShowBBS.class 2016/06/19 15:47 1,883 ShowBBS.java 6 個のファイル 7,324 バイト 2 個のディレクトリ 114,802,692,096 バイトの空き領域
[この投稿を含むスレッドを表示] [この投稿を削除]
[2274] Webアプリケーション開発入門のP97 コンパイルについて
投稿者:mone
2022/03/20 19:44:11

コンパイルでエラーが発生します。 解決方法につきご教示いただけますと幸いです。 ■事象 以下をファイルをコンパイルするため ・ShowBBS.java ・PostBBS.java ・Message.java 以下のコマンドを実行する。 cd C:\maebashi\doc\webserver\src\chap03\testbbs\WEB-INF\classes C:\maebashi\doc\webserver\src\chap03\testbbs\WEB-INF\classes 下記のエラーとなる。(Message.class参照不可のエラー) === PostBBS.java:4: エラー: シンボルを見つけられません public class PostBBS extends HttpServlet { &#8942; === 以下のコマンドでも同様のエラーとなります。 javac -classpath ./;C:\Tomcat\lib\servlet-api.jar PostBBS.java
[この投稿を含むスレッドを表示] [この投稿を削除]
[2273] Re:比較演算子を使った式の変数への代入について
投稿者:mhash
2022/02/15 01:47:50

ご返信ありがとうございます。 比較演算子==の比較結果はint型の値なんですね。知りませんでした。 ご丁寧に教えて頂きありがとうございました。 >>はじめまして、mhashと申します。 > >はじめまして。 > >>bool = ( a == b ) >>(※bool,a,bは整数型の変数) >>のように比較演算子==での比較結果を直接変数に代入している箇所があったのですが、 >>この書き方は規格上保証されているものなのでしょうか? > >==(等価演算子)については、JIS X 3010:2003なら「6.5.9 等価演算子」に記載があって、 >「各演算子は指定された関係が真の場合は1 を,偽の場合は0 を返す。その結果は, > 型int をもつ。」 >とあるので、この結果をint型の変数に代入するのは完全に合法です。 > >>また、保証されている場合はどのバージョンからでしょうか? > >Cができた当初から、だと思います。いわゆる普通のif文で、 > >if (a == b) > >と書いたとしても、これは等価演算子の結果をもとに条件分岐しているにすぎません。 >
[この投稿を含むスレッドを表示] [この投稿を削除]
[2272] Re:比較演算子を使った式の変数への代入について
投稿者:(ぱ)こと管理人
2022/02/13 23:04:05

>はじめまして、mhashと申します。 はじめまして。 >bool = ( a == b ) >(※bool,a,bは整数型の変数) >のように比較演算子==での比較結果を直接変数に代入している箇所があったのですが、 >この書き方は規格上保証されているものなのでしょうか? ==(等価演算子)については、JIS X 3010:2003なら「6.5.9 等価演算子」に記載があって、 「各演算子は指定された関係が真の場合は1 を,偽の場合は0 を返す。その結果は,  型int をもつ。」 とあるので、この結果をint型の変数に代入するのは完全に合法です。 >また、保証されている場合はどのバージョンからでしょうか? Cができた当初から、だと思います。いわゆる普通のif文で、 if (a == b) と書いたとしても、これは等価演算子の結果をもとに条件分岐しているにすぎません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2271] 比較演算子を使った式の変数への代入について
投稿者:mhash
2022/02/13 13:01:05

はじめまして、mhashと申します。 以前kmaebashi様の著書(『プログラミング言語を作る』だったかと思います)で、Cのソースで bool = ( a == b ) (※bool,a,bは整数型の変数) のように比較演算子==での比較結果を直接変数に代入している箇所があったのですが、この書き方は規格上保証されているものなのでしょうか? また、保証されている場合はどのバージョンからでしょうか? 一般的な処理系ではコンパイルできるのだろうとは想像できるのですが、自分はあまりみたことがない書き方なので、気になって質問させていただきました。 初歩的ですみませんがよろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2270] Re:【ご質問】1.3.4 TCPクライアントでWebサーバーを叩
投稿者:mone
2022/01/31 17:25:20

>moneさん >>■事象 >>TcpCliet.javaを実行→client_rect.txtに408ステータスが出力される。(期待結果:200ステータス) > >これは以前にも同じ現象の問い合わせがありました。 >client_send.txt末尾の空行が入っていないと、この現象が発生します。 > >エディタによっては、最後の空行を勝手に消してしまうものもあるようです。 > >http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&thread=2132 >http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&thread=1960 > > ご回答ありがとうございます。 空行を追加したところ200ステータスが返却されました。 ヘッダの終わりを示す空行が必要のこと理解しました。 お手数おかけしました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2269] Re:韓国からの読者です。
投稿者:(ぱ)こと管理人
2022/01/31 01:41:22

ドゥボーさん すみません、韓国語が化けてしまっていますよね。 この掲示板は大昔に作ったもので、文字コードとしてEUC-JPという日本独自の 文字コードを使っています。そのため韓国語は表示できません。 UTF-8にしたものをここに置きました(どのみち私には読めませんが……)。 http://kmaebashi.com/seiha/20220130_bbs.html >韓国語の語順も日本語の語順と一緒で、同じ説明ができます。 ありがとうございます。安心しました。 (実は「C言語 ポインタ完全制覇」は中国語にも翻訳されているのですが、 中国語は語順はむしろ英語に近いのに、直訳されたのでちょっと残念なことに なっているのです) >日本語版の文脈は「日本語(や韓国語)の語順は英語の語順とは違う」のを指摘して >説明をする文脈ですが、翻訳はいきなり「プログラマー」を仮定して文を書いていますね。 >プログラマーと言えば、韓国人だけではなくアメリカ人やイギリス人もありますから、 >これは理屈が立てない変な文章ですよね。(たとえ韓国人だけ読める韓国語版だとしても、 >やはり「プログラマー」を言うのは変です。) これはやっぱり変ですよね。教えていただきありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2268] Re:韓国からの読者です。
投稿者:ドゥボー
2022/01/30 22:34:55

>ドゥボーさん > >はじめまして。著者の前橋です。韓国からの投稿ありがとうございます。 >私の本を読んでいただき光栄です。 迅速なご回答有難うございます! > >ところで、私は韓国語がまったく分かりませんので、以下の2点について、 >よければ教えていただけないでしょうか。 > >①「普通の日本人には~」について >韓国語版: >http://kmaebashi.com/seiha/korean1.png > >日本語版(旧版): >http://kmaebashi.com/seiha/japanese1.png > >日本語版で「普通の日本人には~」となっている部分は、韓国語だとどのような >意味になっているのでしょうか? ざっとGoogle翻訳で見てみますと、 >「普通のプログラマには~」(?)となっているように見えますが、 >そんなニュアンスでよいのでしょうか? そうですよね。確かに変な翻訳ですね。 私は日本語の原板を読みませんでしたので、この問題を事前には分からなかったんです。 『そして、それは置いておくとしても、この文章を素直に読むと、普通の日本人には「逆じゃないか?」と思えるのではないでしょうか?』 の部分は韓国語にはこういう風に翻訳されるべきだと思われるんですね。 『&#44536;&#47532;&#44256; &#44536;&#44163;&#51008; &#52264;&#52824;&#54616;&#45908;&#46972;&#46020;, &#51068;&#48152;&#51201;&#51064; &#54620;&#44397;&#51064;&#51060;&#46972;&#47732; &#51060; &#47928;&#51109;&#51012; &#44536;&#45824;&#47196; &#51069;&#51008; &#54980; ‘&#48152;&#45824;&#51064; &#44163; &#44057;&#45796;’&#45716; &#45712;&#45196;&#51060; &#46308;&#51648; &#50506;&#49845;&#45768;&#44620;?』 (直訳:そして、それはさて置いても、一般的な韓国人ならこの文章をそのまま読んだ後、「逆だそうだ」と感じませんですか?) 韓国語では、「普通の~」という表現が「一般的な~」よりあまりよく使われませんので、こう翻訳しましたんです。 自分たちのことをあまり「韓国人なら」とかよく言わない韓国語の言語習慣を考えると、 『&#44536;&#47532;&#44256; &#44536;&#44163;&#51008; &#52264;&#52824;&#54616;&#45908;&#46972;&#46020;, &#51068;&#48152;&#51201;&#51004;&#47196; &#51060; &#47928;&#51109;&#51012; &#44536;&#45824;&#47196; &#51069;&#51008; &#54980; ‘&#48152;&#45824;&#51064; &#44163; &#44057;&#45796;’&#45716; &#45712;&#45196;&#51060; &#46308;&#51648; &#50506;&#49845;&#45768;&#44620;?』 (直訳:そして、それはさて置いても、一般的にはこの文章をそのまま読んだ後、「逆だそうだ」と感じませんですか?) の方がもっとよいかも知れませんね。 しかし、韓国語版の翻訳はとても変な翻訳です。 『&#45817;&#49888;&#51060; &#54217;&#48276;&#54620; &#54532;&#47196;&#44536;&#47000;&#47672;&#46972;&#47732; &#51060; &#47928;&#51109;&#51012; &#51069;&#50612;&#48376; &#54980; 「&#48152;&#45824;&#51064; &#44163; &#44057;&#45796;」&#45716; &#45712;&#45196;&#51060; &#46308;&#51648; &#50506;&#49845;&#45768;&#44620;?』 この文章は日本語にすると、こうなります。 『もしあなたが平凡なプログラマーだったら、この文章を読んだ後、「逆だそうだ」と感じませんですか?』 日本語版の文脈は「日本語(や韓国語)の語順は英語の語順とは違う」のを指摘して説明をする文脈ですが、翻訳はいきなり「プログラマー」を仮定して文を書いていますね。プログラマーと言えば、韓国人だけではなくアメリカ人やイギリス人もありますから、これは理屈が立てない変な文章ですよね。(たとえ韓国人だけ読める韓国語版だとしても、やはり「プログラマー」を言うのは変です。) > >「pfはintを返す関数へのポインタ」というような文章では、日本語と英語は、 >語順が逆になります。なので日本語でCの宣言を読もうとすると逆に見えるし、 >正しく読むなら英語で読めばよい、というのがここで書いていることです。 >これは日本語の語順の話ですので、韓国語だとどうなのだろう、というのが >気になっています。 > 韓国語の語順も日本語の語順と一緒で、同じ説明ができます。 (この理由で、世間では「外人のうちに韓国人が日本語を一番易く学ぶ」という話もありますが、漢字のことを除けていえば殆ど事実だと思います。語順が同じで、文法も殆ど同じ、漢語や表現も日本語の影響を多く受けたので、そうだと思われます。) しかし訳者が文脈のことを誤解したようですね。 >②Table3.1について >韓国語版: >http://kmaebashi.com/seiha/korean2.png > >日本語版(旧版): >http://kmaebashi.com/seiha/japanese2.png > >この部分の⑤のところは日本語版では「日本語に訳すと……」になっていますが、 >ここを見ると、韓国語でも、語順は日本語と同じのように見えます。 はい。その通りです。 >韓国の方にとっても、「英語で読め」というアドバイスは、的外れにはなっていない、 >と思ってよいでしょうか。 はい。少なくとも幼い私にはいいアドバイスになりました。 >韓国語版のTable3.1には、日本語版にはある「英語的表現」の列が >なくなっているようで、そこもちょっと不思議です。 その部分は確かに不思議ですね。事情はよく分からないんですけれども、もしかして紙面の都合のためかも知れませんね。 >あいさつの投稿に面倒くさい質問で返してしまって申し訳ありませんが、 >よろしければ教えてください。 いいえ、幼い頃に多く助かった本の著者さんとこうして直接話し合ったり、微力な力でも助けることが出来たり、するのは私にとっては光栄です。こんな機会を下さってとても嬉しいです。 >最近あまり投稿のない掲示板ですみませんが、お待ちしております。 > >よろしくお願いいたします。 改めてご回答有難うございます。 これからもよろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2267] Re:【ご質問】1.3.4 TCPクライアントでWebサーバーを叩
投稿者:(ぱ)こと管理人
2022/01/30 20:55:07

moneさん >■事象 >TcpCliet.javaを実行→client_rect.txtに408ステータスが出力される。(期待結果:200ステータス) これは以前にも同じ現象の問い合わせがありました。 client_send.txt末尾の空行が入っていないと、この現象が発生します。 エディタによっては、最後の空行を勝手に消してしまうものもあるようです。 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&thread=2132 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&thread=1960
[この投稿を含むスレッドを表示] [この投稿を削除]
[2266] 【ご質問】1.3.4 TCPクライアントでWebサーバーを叩
投稿者:mone
2022/01/30 20:32:42

管理人様 基礎からのWebアプリケーション開発入門を勉強させていただいているものです。 初歩的な質問で恐縮ですが、ご確認いただけますと幸いです。 ■テキスト 1.3.4 TCPクライアントでWebサーバーを叩く(P25) ■事象 TcpCliet.javaを実行→client_rect.txtに408ステータスが出力される。(期待結果:200ステータス) Apatchは起動しており、http://localhost/index.htmlで「Itr works!」と表示されている。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2265] Re:韓国からの読者です。
投稿者:(ぱ)こと管理人
2022/01/30 17:30:35

ドゥボーさん はじめまして。著者の前橋です。韓国からの投稿ありがとうございます。 私の本を読んでいただき光栄です。 ところで、私は韓国語がまったく分かりませんので、以下の2点について、 よければ教えていただけないでしょうか。 ①「普通の日本人には~」について 韓国語版: http://kmaebashi.com/seiha/korean1.png 日本語版(旧版): http://kmaebashi.com/seiha/japanese1.png 日本語版で「普通の日本人には~」となっている部分は、韓国語だとどのような 意味になっているのでしょうか? ざっとGoogle翻訳で見てみますと、 「普通のプログラマには~」(?)となっているように見えますが、 そんなニュアンスでよいのでしょうか? 「pfはintを返す関数へのポインタ」というような文章では、日本語と英語は、 語順が逆になります。なので日本語でCの宣言を読もうとすると逆に見えるし、 正しく読むなら英語で読めばよい、というのがここで書いていることです。 これは日本語の語順の話ですので、韓国語だとどうなのだろう、というのが 気になっています。 ②Table3.1について 韓国語版: http://kmaebashi.com/seiha/korean2.png 日本語版(旧版): http://kmaebashi.com/seiha/japanese2.png この部分の⑤のところは日本語版では「日本語に訳すと……」になっていますが、 ここを見ると、韓国語でも、語順は日本語と同じのように見えます。 韓国の方にとっても、「英語で読め」というアドバイスは、的外れにはなっていない、 と思ってよいでしょうか。 韓国語版のTable3.1には、日本語版にはある「英語的表現」の列が なくなっているようで、そこもちょっと不思議です。 あいさつの投稿に面倒くさい質問で返してしまって申し訳ありませんが、 よろしければ教えてください。 >度々この場所にお訪れします。 最近あまり投稿のない掲示板ですみませんが、お待ちしております。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2264] 韓国からの読者です。
投稿者:ドゥボー
2022/01/30 05:03:53

初めまして。韓国からの読者です。 中学生の頃、前橋さんの本である「C言語ポインタ完全制覇」の韓国語版を読んで、C言語を深く理解することができた記憶があります。そのおかげで20代後半になった今もAI研究者としてコンピューターの仕事を続けています。本当に有難うございます! 当時は日本語が分からなかったので、お礼を言うことができませんでしたが、最近、この本についての情報を調べてこの本の改訂版が出たのを遅く分かりました。おめでとうございます!最新のC言語の標準であるC99やC11についてもアップデートされたようで、また買って読むつもりです!今度は日本語の原書で読みます。この間、僕はJLPT N1の試験に合格しましたので日本語の練習もすることも兼ねて。 お礼を言うことが遅れてしまってすみません。そして、改めて有難うございます! 度々この場所にお訪れします。 是非お元気で。 韓国からの読者 ドゥボーより
[この投稿を含むスレッドを表示] [この投稿を削除]
[2263] Re:ブログの誤字について
投稿者:(ぱ)こと管理人
2022/01/27 01:31:18

>はてなブログ「K.Maebashi's はてなブログ」の方のコメントしたのですが、 >通知などが飛ばなくて気づかない可能性があるのでこちらにも投稿します。 ありがとうございます。修正しました。 通知は来るのですが、こんな夜中しか時間が取れなくて……
[この投稿を含むスレッドを表示] [この投稿を削除]
[2262] ブログの誤字について
投稿者:rike1019
2022/01/26 19:22:00

はてなブログ「K.Maebashi's はてなブログ」の方のコメントしたのですが、通知などが飛ばなくて気づかない可能性があるのでこちらにも投稿します。 誤字を見つけました。 xコード下記 oコード書き > 俺もまだこんな風にコード下記に熱中できるんだなあ、という感慨はありますが、それが、何度も書いたことがあり過去コードを貼り合わせたような言語処理系、というのはちょっと残念ですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2261] Re:レビューのお願い
投稿者:(ぱ)こと管理人
2021/12/14 08:28:28

>何か感想や意見を聞かせてください。 >ちなみにポインタはまだ理解してないので、全部値渡しにしています。 >宜しくお願い致します。 すみません、Cはともかく数学的にこれは私の能力を超えるので、 どなたかわかる方に見ていただくのがよいかと。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2259] Re:完全初心者のためのプログラミング入門 lesson04_4
投稿者:Hiroyuki Naito
2021/11/23 23:23:51

ご回答ありがとうございました。 varからletに変わってスコープが有効になるというのは知識としてはあったのですが、関数のスコープしか頭に入っていませんでした。while文やfor文のブロックスコープも有効になるということをご教授いただき、自分の知識も一段深まった気がいたします。 >>しかし、下記の2つのfor文でxについて2回宣言しているように思うのですが、 >>エラーにならないのは何故でしょうか。 > >これは、letで宣言された変数は、ブロックスコープを持つからです。 >for文の第1式で宣言された変数は、for文のブロックの中だけのスコープを持ちます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2258] Re:完全初心者のためのプログラミング入門 lesson04_4
投稿者:(ぱ)こと管理人
2021/11/23 20:02:16

>しかし、下記の2つのfor文でxについて2回宣言しているように思うのですが、 >エラーにならないのは何故でしょうか。 これは、letで宣言された変数は、ブロックスコープを持つからです。 for文の第1式で宣言された変数は、for文のブロックの中だけのスコープを持ちます。 よって、以下のプログラムは、 for (let i = 0; i < 10; i++) { console.log("i.." + i); } console.log("i.." + i); 「i..0」から「i..9」までは表示しますが、最後の、for文の後のconsole.log()の ところで、以下のエラーを出します。 Uncaught ReferenceError: i is not defined https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/let | let 文はブロックスコープのローカル変数を宣言します。 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for | let で宣言された変数は文内のローカル変数になります。 このあたりは、JavaとかC++とかC#とかC99とかと同じで、JavaScriptもletが導入されて ようやく「普通の言語になった」感があります。 昔のJavaScriptではvarしか使えませんでしたが、varによる変数宣言は関数スコープで、 クロージャという仕組みと相俟って、初心者には訳の分からない結果を出すことが ありました…… 例) https://teratail.com/questions/205789
[この投稿を含むスレッドを表示] [この投稿を削除]
[2257] 完全初心者のためのプログラミング入門 lesson04_4
投稿者:Hiroyuki Naito
2021/11/22 21:20:38

お世話になります。 首記のプログラムで1つ質問をさせていただきますので、よろしくお願いいたします。 JavaScriptでは同じ変数と2度宣言すると、 Uncaught SyntaxError: Identifier 'x' has already been declared というエラーが発生します。 しかし、下記の2つのfor文でxについて2回宣言しているように思うのですが、 エラーにならないのは何故でしょうか。 19: for (;;) { 20: for (let x = 0; x <= 720; x += 10) { 21: context.drawImage(ufoImage, x, 10); 22: } 23: for (let x = 720; x >= 0; x -= 10) { 24: context.drawImage(ufoImage, x, 10); 25: } 26: }
[この投稿を含むスレッドを表示] [この投稿を削除]
[2256] Re:C言語体当り学習 filter.cプログラム
投稿者:Hiroyuki Naito
2021/06/27 09:08:27

ご回答ありがとうございました。 今まで^Zによって、キーボードからはEOF(-1)が出力されると思い込んでいました。 「getchar()が行頭の^Z(=26)をファイルの末尾と判断して、EOFを戻り値として 出力する」というご説明ですっきりしました。 >つまり、コマンドプロンプト上で^Zを入力すると、それが行頭である場合に限り >getchar()はEOFを返すが、そうでなければ^Zをそのまま返す、ただし、行内で >^Zより後ろの文字は返さない、ということになります。 >これは、コマンドプロンプトの端末ドライバの仕様ということになると思います。 ----- 中略 ----- >ファイルの末尾に来たらEOFを返す、というだけで、そのEOFはどこからも読み込まれる >わけではありません。Hiroyuki Naitoさんも試されたとおり、^Zは26であって >-1ではありません。 >
[この投稿を含むスレッドを表示] [この投稿を削除]
[2255] Re:C言語体当り学習 filter.cプログラム
投稿者:(ぱ)こと管理人
2021/06/27 00:32:44

>123 >123 >^Z > >のように、 >123<enter>^Zと入力するとEOFを検知してプログラムが終了しますが、 >123^Z<enter>のように入力するとプログラムが終了しません。 本当ですね。正直なところ、この挙動は私は認識していませんでした。 ちなみに123^Z456<enter>と入力すると、プログラムは終了しませんが、 456は読み込まれません。 >if文の前にprintf(" %d ", ch);を挿入して文字コードを表示させると、 >前者の^Zは-1、後者の^Zは26と表示されます。^Zはよくひとつ前の状態に戻る >動作のショートカットキーに使われていたりするのが原因でしょうか。 後者の^Zの26は、ASCIIの制御文字におけるSUBで、これをキーボードから入力する 手段が^Zです。以下Wikipediaを参照してください。 https://ja.wikipedia.org/wiki/%E5%88%B6%E5%BE%A1%E6%96%87%E5%AD%97 つまり、コマンドプロンプト上で^Zを入力すると、それが行頭である場合に限り getchar()はEOFを返すが、そうでなければ^Zをそのまま返す、ただし、行内で ^Zより後ろの文字は返さない、ということになります。 これは、コマンドプロンプトの端末ドライバの仕様ということになると思います。 すっきりしない回答で申し訳ありません。 >また、getchar()は「標準入力から1文字読み込む」とありますが、EOF(FFFFFFFF) >という4バイトのコードに対してはどのような動作で読み込んでいるのでしょうか。 「C言語 体当たり学習徹底入門」では、getchar()について 『getchar()は、標準入力から1文字読み込み、その文字コードを返します。  ファイルの末尾に来たら、EOFを返します。』 と書きました。これはgetchar()(を含むCの標準ライブラリ)の仕様です。 ファイルの末尾に来たらEOFを返す、というだけで、そのEOFはどこからも読み込まれる わけではありません。Hiroyuki Naitoさんも試されたとおり、^Zは26であって -1ではありません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2254] C言語体当り学習 filter.cプログラム
投稿者:Hiroyuki Naito
2021/06/25 23:45:12

首記のプログラムをダウンロードして、gcc+VSCode(ターミナルはcommnad prompt)で 実行してみました。 123 123 ^Z のように、 123<enter>^Zと入力するとEOFを検知してプログラムが終了しますが、 123^Z<enter>のように入力するとプログラムが終了しません。 if文の前にprintf(" %d ", ch);を挿入して文字コードを表示させると、 前者の^Zは-1、後者の^Zは26と表示されます。^Zはよくひとつ前の状態に戻る 動作のショートカットキーに使われていたりするのが原因でしょうか。 また、getchar()は「標準入力から1文字読み込む」とありますが、EOF(FFFFFFFF) という4バイトのコードに対してはどのような動作で読み込んでいるのでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2253] Re:ポインタ完全制覇(第2版) p75 *pのループ中の計算
投稿者:Hiroyuki Naito
2021/06/13 23:52:20

ご回答ありがとうございました。 ポインタ演算*(p + i)が、array[i]の計算の「最適化の手を抜くために付けられた機能」という意味が理解できました。 今後はarray[i]の記法を活用していきたいと思います。 >はじめまして。読んでいただきありがとうございます。 > >>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]は、何度も登場する」と書いてあるのはそういう意図です。 > >これで回答になっていますでしょうか? > >
[この投稿を含むスレッドを表示] [この投稿を削除]
[2252] Re:ポインタ完全制覇(第2版) p75 *pのループ中の計算
投稿者:(ぱ)こと管理人
2021/06/12 20:36:48

はじめまして。読んでいただきありがとうございます。 >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]は、何度も登場する」と書いてあるのはそういう意図です。 これで回答になっていますでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2251] ポインタ完全制覇(第2版) p75 *pのループ中の計算
投稿者:Hiroyuki Naito
2021/06/12 17:25:08

本文p75の「*pがループの中に何度出現しても掛け算と足し算はループの終わりの1回だけで済む」で、引っかかっています。 array[i]は、ループ中に出現するたびごとに「array + (i * 1要素のサイズ)」に相当するアドレス計算を行うというのは理解できますが、*pでも「p + (p++ごとに1要素のサイズ)」に相当するアドレス計算を行っているように思えます。「掛け算と足し算はループの終わりの1回だけ」という意味をご教示いただけるとありがたいです。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2250] Re:テトリス風ゲームについて
投稿者:(ぱ)こと管理人
2021/05/10 23:03:04

はじめまして。反応が遅れましてすみません。 >http://kmaebashi.com/programmer/tetris/index.html >こちらのプログラムは、改造して配布しても良い物でしょうか? そういえばライセンス表記をしていなかったですが、以下のページの説明に 準じるということにします。ご自由にコピーしてください。 (なにしろテトリスなので、「名前を変える」必要もないと思います) http://kmaebashi.com/programmer/devlang/license.html よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2249] テトリス風ゲームについて
投稿者:SINch
2021/05/07 22:08:21

はじめまして http://kmaebashi.com/programmer/tetris/index.html こちらのプログラムは、改造して配布しても良い物でしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2248] Re:オンラインブックについて
投稿者:bigen
2021/03/12 10:18:26

>おひさしぶりです。 > >>先日ご連絡したオンラインブックがいったんの完結ということになりました。 >>初めての書籍ということで書籍全体としてのバランスや文章、締めくくり方など拙い部分ばかりで恐縮ですが、ご報告させていただきます。 > >https://zenn.dev/bigen1925/books/introduction-to-web-application-with-python > >お疲れさまでした。これだけの量を書くのは大変だったと思います。 > >私も後ほどちょこちょこ読んでみます。 > ありがとうございます。 確かに本を書くというのは当初想像していたよりずっと大変で、改めて書籍を執筆される方の偉大さを身に沁みて理解いたしました・・・。 一方で、先人たちのこういった情報発信によって今の自分がありますので、これにめげず今後も情報発信を続けていこうと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2247] Re:オンラインブックについて
投稿者:(ぱ)こと管理人
2021/03/10 01:00:21

おひさしぶりです。 >先日ご連絡したオンラインブックがいったんの完結ということになりました。 >初めての書籍ということで書籍全体としてのバランスや文章、締めくくり方など拙い部分ばかりで恐縮ですが、ご報告させていただきます。 https://zenn.dev/bigen1925/books/introduction-to-web-application-with-python お疲れさまでした。これだけの量を書くのは大変だったと思います。 私も後ほどちょこちょこ読んでみます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2246] オンラインブックについて
投稿者:bigen
2021/03/07 18:14:34

前橋先生 ご無沙汰しております。 先日ご連絡したオンラインブックがいったんの完結ということになりました。 初めての書籍ということで書籍全体としてのバランスや文章、締めくくり方など拙い部分ばかりで恐縮ですが、ご報告させていただきます。 https://zenn.dev/bigen1925/books/introduction-to-web-application-with-python 改めてきっかけを与えていただいた前橋先生に感謝を申し上げます。 前橋先生の書籍のおかげでエンジニアとして一つの壁を超えられたという感覚もあり、僕自身がプログラミングを楽しめるようになりました。 また、心のどこかで先人から教えてもらうばかりでなく、どこかで自分からも情報発信をしなければならないという気持ちもあったため、こうして今回オンラインブックという一つの形にできたことを嬉しく思います。 繰り返しにはなりますが、改めて感謝とお礼を申し上げさせていただくとともに、前橋先生の今後のご健勝をお祈りいたします。 
[この投稿を含むスレッドを表示] [この投稿を削除]
[2245] Re:オンラインブック執筆について
投稿者:bigen
2020/10/25 07:22:59

お返事ありがとうございます。 >導入部分を拝読しました。 > >Webアプリケーションの挙動を理解するためにWebサーバを作るというのは >私の独創でもないですし、まったく問題ないと思います。 ありがとうございます! あまり早くないペースでの更新になると思いますが、執筆を進めさせていただきます。 >言語も違うとのことなので、私も読んでみたいです。楽しみにしております。 温かいお言葉ありがとうございます。 とても励みになります。 オンラインブックとはいえ、一冊の書籍のようなまとまった文章を公開するのは初めての経験ですので、拙い言葉にはなるとは思いますが精一杯取り組ませていただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2244] Re:オンラインブック執筆について
投稿者:(ぱ)こと管理人
2020/10/24 14:44:21

はじめまして。 >内容として先生の書籍と似通う部分も多くなりますので、先生にご許諾をいただけた >場合のみ続編を執筆しようと思っております。 >お手数ではありますが、もしお時間が許すようでしたら、是非ご確認とお返事を >いただけると幸いです。 導入部分を拝読しました。 Webアプリケーションの挙動を理解するためにWebサーバを作るというのは 私の独創でもないですし、まったく問題ないと思います。 言語も違うとのことなので、私も読んでみたいです。楽しみにしております。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2243] Re:P.17:終了のマークとして0を送付について
投稿者:くまきち
2020/10/21 23:14:26

ありがとうございます。 とりあえず、HTTP1.0については理解することができました!
[この投稿を含むスレッドを表示] [この投稿を削除]
[2242] オンラインブック執筆について
投稿者:bigen
2020/10/21 18:31:49

はじめまして。 昨年、前橋先生の書籍 - Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門 を読み、本当に勉強になりました。 まずは感謝を述べさせてください。 あまりに勉強になったので、社内でこれを題材に勉強会等を行っていたのですが、 「この本もっと皆に紹介したい!」 という思いとともに、 - python/Djangoしか経験のないメンバーが多く、Javaやサーブレットを扱うことがハードル - 自分の使い慣れたフレームワーク(Django)のトピックをからめながらだと理解しやすい - 書籍ではなくZennなどのオンラインブックであれば今の若いエンジニアユーザーにリーチしやすいのではないか などのことを感じ、先生の書籍をベースにpython/Djangoを題材としたオンラインブックを書いてみたいと思うようになりました。 先立ちまして、先生の書籍から受けた影響、寄せる思いなどを書いた導入記事を公開しました。 https://zenn.dev/bigen1925/books/e6c9492a82f5e2e10fca/viewer/422445 まだ導入記事以外は執筆しておりません。 また執筆中は無料公開とし、執筆完了後に様子をみて有料化も検討していますが、まだはっきりとは決めていません。 内容として先生の書籍と似通う部分も多くなりますので、先生にご許諾をいただけた場合のみ続編を執筆しようと思っております。 お手数ではありますが、もしお時間が許すようでしたら、是非ご確認とお返事をいただけると幸いです。 もし許諾に関しまして別途お話させていただいく場があったほうが良いようでしたら、Linkに記載のメールアドレス(<at> -> @)までご連絡いただいても構いません。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2241] Re:P.17:終了のマークとして0を送付について
投稿者:(ぱ)こと管理人
2020/10/20 23:13:34

>大分時間が経ってしまいましたが、回答は理解できました。 おひさしぶりです。反応が遅くなりましてすみません。 >一方で、Server側をApacheに置き換えたとき、Clientからの送信終了を表す”0”は >不要になっています(P.27)。Apacheは何をもってClientがリクエストを送り終えたことを >判断しているのでしょうか? TcpServer.javaのような手抜きプログラムとは違い、ApacheはまともなWebサーバなので、 HTTPリクエストを解釈できます。HTTPリクエストは、p.24のリスト1-7にあるとおり、 GETの場合は(普通は)ボディはつかないので空行で終わります。よって、 空行でリクエストの終わりを判定することができます。この本で作っている 簡易WebサーバModoki01.java(リスト1-16)では、実際そのようにしてリクエストの 終わりを判定しています(59行目)。 POSTの場合はボディが付くので、Content-Lengthヘッダのサイズを使います。 この本ではリスト3-17の66行目でContent-Lengthを取得し、69行目のreadToSize()の 呼び出しでそのサイズだけ読み込んでいます。 ――というのは実はHTTP1.0相当の、簡易版の実装で、HTTP1.1では サーバはGETメソッドでもボディを受け取ることが可能でなければならず(そして 無視しなければならず)、POSTメソッドでもContent-Lengthは必須ではありません。 動的にデータを作りながら連続して送るとき、ヘッダの時点ではサイズを確定できない、 という事情があるわけですが、それを受け取るのは本書の(かつ私の能力の)範囲を 越えます。 興味があれば以下を参照ください(RFC2616なので微妙に古いですが問題ないでしょう)。 https://triple-underscore.github.io/rfc-others/RFC2616-ja.html#section-4.4
[この投稿を含むスレッドを表示] [この投稿を削除]
[2240] Re:P.17:終了のマークとして0を送付について
投稿者:くまきち
2020/10/16 12:03:28

大分時間が経ってしまいましたが、回答は理解できました。 ありがとうございました。 一方で、Server側をApacheに置き換えたとき、Clientからの送信終了を表す”0”は不要になっています(P.27)。Apacheは何をもってClientがリクエストを送り終えたことを判断しているのでしょうか? 良ければ教えてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2239] Re:eclipseでHenacatを作成したい
投稿者:こー
2020/08/18 11:06:21

解決しました。 ご教授いただきありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2238] Re:eclipseでHenacatを作成したい
投稿者:(ぱ)こと管理人
2020/08/18 00:58:03

>※ここが原因かもしれません。 >ShowBBS.java、PostBBS.java、Message.javaの3つは、"chapter3"というパッケージの中にあります。 であれば、.classファイルは >C:\Henacat_0_1\webapps\makeTcpServer\chapter3 の下に置いたうえで、Main.javaは以下のようにします。 WebApplication app = WebApplication.createInstance("makeTcpServer"); app.addServlet("/ShowBBS", "chapter3.ShowBBS"); app.addServlet("/PostBBS", "chapter3.PostBBS"); そのうえで、 http://localhost:8001/makeTcpServer/ShowBBS を叩けば表示できると思います。 前回書いたとおり、addServletの 第1引数の"/ShowBBS"がパス、つまり以下のURLの最後の部分、 http://localhost:8001/makeTcpServer/ShowBBS を指すので、第1引数を変えなければ、叩くURLはこのままで構いません。 第2引数がクラス名です。パッケージを使っているならパッケージ名が要ります。 つまり完全限定クラス名「chapter3.ShowBBS」にする必要があります。 >>④長くなっても構いませんので、修正したクラスのソースを丸ごとここに貼ってください。 あ、すみません。ここは、修正した掲示板のソースコード(ShowBBS.javaとかPostBBS.javaとか) のつもりでした。これで動くと思いますが、まだ動かないようであれば貼ってください。 なお、当然ですが、ShowBBS.javaの中の out.println("<form action='/testbbs/PostBBS' method='post'>"); とか、PostBBS.javaの中の response.sendRedirect("/testbbs/ShowBBS"); とかは、それぞれmakeTcpServerに直す必要があります。念のため。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2237] Re:eclipseでHenacatを作成したい
投稿者:こー
2020/08/17 14:01:09

ご回答いただきありがとうございます。 >①「当方が独自につけたアプリケーション名」を含む、クラスファイルを置いた > 正確な場所 > >C:\Henacat_0_1\webapps\makeTcpServer\ > >これで合っていますか? ※を参照願います >②そのフォルダに置いたクラスファイルのファイル名すべて ShowBBS.class Message.class PostBBS.class の3つです。 >③List3-13 Main.javaの8~10行目に相当する箇所のソースコード WebApplication app = WebApplication.createInstance("makeTcpServer"); app.addServlet("/ShowBBS", "ShowBBS"); app.addServlet("/PostBBS", "PostBBS"); となります。 >パッケージを使っているならパッケージ名が要りますし、 >その場合はクラスファイルの置き場所もパッケージに沿ったフォルダ構成に >なっていなければいけません。 ※ここが原因かもしれません。 ShowBBS.java、PostBBS.java、Message.javaの3つは、"chapter3"というパッケージの中にあります。 そのため、フォルダ構成を以下のように変更しました。 C:\Henacat_0_1\webapps\makeTcpServer\chapter3 そのうえで、http://localhost:8001/makeTcpServer/chapter3/ShowBBSをたたいたところ、 C:\webserver\error_documentに格納した404.htmlが表示されました。 (リスト3-14:ServerThread.javaの87行目でNoSuchFileExceptionがcatchされました。) >④長くなっても構いませんので、修正したクラスのソースを丸ごとここに貼ってください。 Main.java package com.kokun.henacat.webserver; import java.net.ServerSocket; import java.net.Socket; import com.kokun.henacat.servletimpl.WebApplication; public class Main { public static void main(String[] args) throws Exception{ WebApplication app = WebApplication.createInstance("makeTcpServer"); app.addServlet("/ShowBBS", "ShowBBS"); app.addServlet("/PostBBS", "PostBBS"); try(ServerSocket server = new ServerSocket(8001)){ for(;;) { Socket socket = server.accept(); ServerThread serverThread = new ServerThread(socket); Thread thread = new Thread(serverThread); thread.start(); } } } } 変更はMain.javaのみです。 よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2236] Re:eclipseでHenacatを作成したい
投稿者:(ぱ)こと管理人
2020/08/16 23:52:36

>いいえ、webapps\testbbs\に配置しております。 >(実際にはtestbbsでなく当方が独自につけたアプリケーション名) 了解しました。「独自につけたアプリケーション名」はmakeTcpServerであると 先の投稿にもありましたね。失礼しました。 本と変えたのであれば、変えたところを教えてください。 具体的には、 ①「当方が独自につけたアプリケーション名」を含む、クラスファイルを置いた  正確な場所 C:\Henacat_0_1\webapps\makeTcpServer\ これで合っていますか? ②そのフォルダに置いたクラスファイルのファイル名すべて ③List3-13 Main.javaの8~10行目に相当する箇所のソースコード 元は以下: > 8: WebApplication app = WebApplication.createInstance("testbbs"); > 9: app.addServlet("/ShowBBS", "ShowBBS"); >10: app.addServlet("/PostBBS", "PostBBS"); アプリケーション名やクラス名を変えたのなら、ここも変えないと動きません。 ただ、8行目のtestbbsをmakeTcpServerに変えていないのだとすれば、 そもそもサーブレットへのリクエストだと認識されずNot Foundが返るので、 8行目は変えてあるはずですね。 9行目と10行目は、リクエストのパスとクラス名の対応付けをしています。 第1引数の"/ShowBBS"がパス、つまり以下のURLの最後の部分、 http://localhost:8001/makeTcpServer/ShowBBS 第2引数がクラス名です。パッケージを使っているならパッケージ名が要りますし、 その場合はクラスファイルの置き場所もパッケージに沿ったフォルダ構成に なっていなければいけません。 ④長くなっても構いませんので、修正したクラスのソースを丸ごとここに貼ってください。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2235] Re:eclipseでHenacatを作成したい
投稿者:こー
2020/08/16 13:04:20

ご回答いただきありがとうございます。 >C:\Henacat_0_1\webapps\ >の直下にShowBBS.classがあるような配置でしょうか。そうだとすると間違っています。 いいえ、webapps\testbbs\に配置しております。 (実際にはtestbbsでなく当方が独自につけたアプリケーション名) >C:\Henacat_0_1\webapps\testbbs\ >の下にShowBBS.class, PostBBS.class, Message.classを配置するのが正解です。 >testbbsフォルダが必要なのは、WebApplication.javaで以下のようにWEBAPPS_DIRにdirを >くっつけたパスからクラスを検索しているからで、 > >20: Path pathObj = fs.getPath(WEBAPPS_DIR + File.separator + dir); >21: this.classLoader >22: = URLClassLoader.newInstance(new URL[]{pathObj.toUri().toURL()}); > >このdirの出処は、List3-13 Main.javaの8行目のこの呼び出しです。 > > 8: WebApplication app = WebApplication.createInstance("testbbs"); > 9: app.addServlet("/ShowBBS", "ShowBBS"); >10: app.addServlet("/PostBBS", "PostBBS"); > >これで回答になっていますでしょうか? ご教授いただいた部分、理解することができました。 しかし、その上で確認をしても誤っている箇所が見つかっておりません。 何かその他に考えうることはありますでしょうか。 お手数おかけしますが、よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2234] Re:eclipseでHenacatを作成したい
投稿者:(ぱ)こと管理人
2020/08/15 22:50:18

はじめまして。ご質問ありがとうございます。 >Mainを実行して、URL(http://localhost:8001/makeTcpServer/ShowBBS)をたたくと、 > >java.lang.ClassNotFoundException: ShowBBS > at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471) > at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588) > at java.base/java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java:899) > at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) > at com.kokun.henacat.servletimpl.ServletService.createServlet(ServletService.java:17) > at com.kokun.henacat.servletimpl.ServletService.doService(ServletService.java:56) > at com.kokun.henacat.webserver.ServerThread.run(ServerThread.java:90) > at java.base/java.lang.Thread.run(Thread.java:834) このスタックトレースから分かることは、Hanecatから掲示板のクラス(ShowBBS)を 読み込もうとしてそれが見つからないのでエラーになっている、ということです。 Henacatでは、サーブレットのクラスファイルを置くパスをソース内にべた書きしているので、 Eclipseの設定とかが原因とも思えません。 >作成したクラスファイルは、WEBAPPS_DIR = "C:\\Henacat_0_1\\webapps"配下に >設置しているのですが、そのほかに原因があるのでしょうか。 ここですが、 C:\Henacat_0_1\webapps\ の直下にShowBBS.classがあるような配置でしょうか。そうだとすると間違っています。 >書籍132ページのクラスファイルの部分が正確に理解できていない気もしていますが、ご教授いただけるとありがたいです。 書籍132ページにはこうあります。 >作成したクラスファイルの配置場所ですが、リスト3-15のWebApplication.javaの8 行目の >WEBAPPS_DIRに設定されているディレクトリの下に、Webアプリケーション名(testbbs)の >ディレクトリを作成し、その直下に入れてください(WEB-INFとかclassesディレクトリは不要)。 つまり、 C:\Henacat_0_1\webapps\testbbs\ の下にShowBBS.class, PostBBS.class, Message.classを配置するのが正解です。 testbbsフォルダが必要なのは、WebApplication.javaで以下のようにWEBAPPS_DIRにdirを くっつけたパスからクラスを検索しているからで、 20: Path pathObj = fs.getPath(WEBAPPS_DIR + File.separator + dir); 21: this.classLoader 22: = URLClassLoader.newInstance(new URL[]{pathObj.toUri().toURL()}); このdirの出処は、List3-13 Main.javaの8行目のこの呼び出しです。 8: WebApplication app = WebApplication.createInstance("testbbs"); 9: app.addServlet("/ShowBBS", "ShowBBS"); 10: app.addServlet("/PostBBS", "PostBBS"); これで回答になっていますでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2233] eclipseでHenacatを作成したい
投稿者:こー
2020/08/15 18:05:40

書籍『基礎からのWebアプリケーション開発入門』をもとに、 eclipseを用いてHenacatを作成(第3章)していますが、以下のような状況です。 なお、Webアプリケーションの名前はmakeTcpServerとしています。 Mainを実行して、URL(http://localhost:8001/makeTcpServer/ShowBBS)をたたくと、 java.lang.ClassNotFoundException: ShowBBS at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588) at java.base/java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java:899) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) at com.kokun.henacat.servletimpl.ServletService.createServlet(ServletService.java:17) at com.kokun.henacat.servletimpl.ServletService.doService(ServletService.java:56) at com.kokun.henacat.webserver.ServerThread.run(ServerThread.java:90) at java.base/java.lang.Thread.run(Thread.java:834) とExceptionが発生してしまいます。 作成したクラスファイルは、WEBAPPS_DIR = "C:\\Henacat_0_1\\webapps"配下に 設置しているのですが、そのほかに原因があるのでしょうか。 書籍132ページのクラスファイルの部分が正確に理解できていない気もしていますが、ご教授いただけるとありがたいです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2232] Re:間違い?
投稿者:(ぱ)こと管理人
2020/04/09 00:23:57

書いている間に他の方から投稿がありました。ありがとうございます。 >これが、(持っていないのでわからないが)あなたの持っている版で >int hoge[5][3]; >となっていれば、説明としてはインデックスに問題ある(j==3の方)と思います。 正誤表にある限り(ミスが多くて申し訳ありません)、ここを直した形跡はないですし、 オリジナルのLaTeX原稿(笑)を見ても \begin{verbatim} int hoge[3][5]; \end{verbatim} となっているので、ことここについては、誤植はないと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2231] Re:間違い?
投稿者:(ぱ)こと管理人
2020/04/09 00:11:08

はじめまして。 >174ページ多次元配列の欄ですが配列が[5][3]ではじまって、 >175ページでi=2,j=3としますっていうのは整合性がとれていませんし、 >それによって多次元配列の説明が意味不明です。 まず、「C言語ポインタ完全制覇」の旧版(表紙に、「新・標準プログラマーズライブラリ」 ではなく、ただ「標準プログラマーズライブラリ」とあって、表紙がロボット型の コーヒーメーカーになっているもの)の話、ということでよいでしょうか? そして、 >174ページ多次元配列の欄ですが配列が[5][3]ではじまって、 これは、p.174の下から3行目の int hoge[3][5]; のことですか? ([5][3]ではなく[3][5]ですね?) そして、 >175ページでi=2,j=3としますっていうのは整合性がとれていませんし、 これはp.174で『hoge[i][j]という形でアクセスするとします』に続けての 図(Fig.3-15)の中で、『hoge[i][j]において、i == 2、j == 3の場合を考える』と 書いてあるところのことですよね? 2次元配列全体のサイズとして、int hoge[3][5];と宣言したうえで、その中の hoge[2][3]をアクセスするのは普通のことで、整合性がとれていないってことは ないと思うのですが、どうでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2230] Re:間違い?
投稿者:ti
2020/04/08 23:31:56

>174ページ多次元配列の欄ですが配列が[5][3]ではじまって、175ページでi=2,j=3としますっていうのは整合性がとれていませんし、それによって多次元配列の説明が意味不明です。 175ページの i==2,j==3 が配列の添字(インデックス)という点はいいですよね。 hoge[2][3] 「配列が[5][3]ではじまって」が気になりますが、 私が持っている初版第2刷では 174ページの宣言は以下のようになっています。 int hoge[3][5]; /*これなら hoge[2][3] OK */ これが、(持っていないのでわからないが)あなたの持っている版で int hoge[5][3]; となっていれば、説明としてはインデックスに問題ある(j==3の方)と思います。 ということなのでしょうか。 ちなみに175ページ最初の「intの配列(要素数5)の配列(要素数3)」の説明は、 int hoge[3][5]; とあっています。 (「3-1-2 Cの宣言を解読する」参照) わかりにくいかもですが。 前橋先生に任せるべきだったかも。私の理解が間違ってるかもしれないし。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2229] 間違い?
投稿者:ta
2020/04/07 19:16:45

174ページ多次元配列の欄ですが配列が[5][3]ではじまって、175ページでi=2,j=3としますっていうのは整合性がとれていませんし、それによって多次元配列の説明が意味不明です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2227] Re:ポインタ完全制覇(第2版) Fig2-10とデバッグライト
投稿者:(ぱ)こと管理人
2020/02/05 23:13:49

>printf() の実装は実際のところ 2222 の debug_write() と全く同じことが多くて、 >よって printf() のクロック数と debug_write() のクロック数は全く同じで、 まず、「ポインタ完全制覇」での記載は、 #ifdef DEBUG printf(表示したい内容); #endif という方法を 「こんなものをソース中に大量に埋め込んだら、読みにくくてしょうがありません。」 と書いたうえで、vfprintf()を使ったdebug_write()を紹介しています。 つまりdebug_write()の比較対象は、printf()ではなく、 #ifdefを使った完全に抹殺できるデバッグライトです。 >ついでに言うと printf() の処理中、文字化に要するクロック数と関数呼び出しクロック数では >後者は無視できるほど小さいっす。 >さらに追加すると標準出力へ出力する際の実処理のクロック数のほうがもっと多い。 >ボトルネックでないところのクロック数を頑張って減らしても全体の速度は大差ない。 で、vfprintf()を使ったdebug_write()にて、フラグか何かを参照し、 デバッグモードでないときは即座にreturnするようにしたとしても、 関数呼び出しそのもののオーバーヘッドは消せない、というのが趣旨なので、 「関数呼び出しのオーバーヘッド」と、「文字化や出力のオーバーヘッド」を 比べているわけではありません。 ただまあ、そのうえで、関数呼び出しのボトルネックだって無視できるほど小さい、 というのは、まあそうだろうなとは思います。ことがデバッグライトだけに、 「本番では死ぬほどループする処理に、1行おきにデバッグライトを入れた」という 状況はもちろん考えられますが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2226] Re:ポインタ完全制覇(第2版) Fig2-10とデバッグライト
投稿者:774RR
2020/02/04 07:08:55

ああツッコミてー printf() の実装は実際のところ 2222 の debug_write() と全く同じことが多くて、 よって printf() のクロック数と debug_write() のクロック数は全く同じで、 ついでに言うと printf() の処理中、文字化に要するクロック数と関数呼び出しクロック数では 後者は無視できるほど小さいっす。 さらに追加すると標準出力へ出力する際の実処理のクロック数のほうがもっと多い。 ボトルネックでないところのクロック数を頑張って減らしても全体の速度は大差ない。 というわけで debug_write() を真に関数として実装して増えるのはプログラムバイト数だけ debug_write() の命令語数の分、せいぜい数十バイト、実行クロック数は同一 なのでこんなところに労力使うくらいなら、別のところでもっと有意義に使いたいっす。 C/C++ ユーザーは実行時クロックを1クロックでも減らしたがるけど、悪い癖っす。 まあ組み込み系だとその数クロック数バイトが重要だったりしますが・・・
[この投稿を含むスレッドを表示] [この投稿を削除]
[2225] Re:ポインタ完全制覇(第2版) Fig2-10とデバッグライト
投稿者:(ぱ)こと管理人
2020/02/01 23:26:52

あれっ、何か妙なことを書いていました。 >ただその下で、 >| C99ではマクロが可変長引数を取ることができるようになったので、 >| 以下のように書けるようになりました。 > >と書いておきながら、わざわざdebug_write()を呼んでいるのはちょっといただけないですね… C99なら可変長引数のマクロが使えるので、コンパイル時に完全に抹殺できます。 よって、fprintf()を呼んでももちろん良いですが、debug_write()を呼んでも 消えてなくなるので別段「ちょっといただけない」こともないですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2224] Re:ポインタ完全制覇(第2版) Fig2-10とデバッグライト
投稿者:(ぱ)こと管理人
2020/01/26 23:15:21

>細かいことで恐縮ですが、Fig2-10で「"&d, %s\n"へのポインタ」とありますが、 >「"%d, %s\n"へのポインタ」の誤植と思われます。 ご指摘ありがとうございます。ミスが多くて申し訳ありません。 この部分は旧版から変えていないところなので、旧版から20年間発覚しなかった ミスかと旧版の正誤表を確認したところ、どうも旧版は ・%dであるべきところが&dになっている ・\nが抜けている というふたつのミスがあり、前者に気づいていながら後者だけ直していたようです。 http://kmaebashi.com/seiha/seigo.html#p102 何が何だか……(後ほど直します) >#define DEBUG_WRITE(...) fprintf(stderr, __VA_ARGS__) >でもokでした。 >「debug_write()関数の呼び出しのオーバーヘッドは避けられない(p127)」という >ことでしたが、fprintf()関数でも同様でしょうか。 読み返すと確かにわかりにくいのですが、 「debug_write()関数の呼び出しのオーバーヘッドは避けることができません。」 という記述は、いわゆるANSI C(C90)についての記載と思ってください。 そのすぐ下に、「マクロなら、コンパイル時に完全に抹殺できるのですが、 ANSI Cまでは、マクロには、可変長引数を渡すことができませんでした。」 とあるとおりです。 ただその下で、 | C99ではマクロが可変長引数を取ることができるようになったので、 | 以下のように書けるようになりました。 と書いておきながら、わざわざdebug_write()を呼んでいるのはちょっといただけないですね… (わずかばかりのオーバーヘッドを考えるより、出力先をまとめて切り替えたり タイムスタンプを足したりする利便性を考えて、私なら、実際にはdebug_write()を 挟みそうな気がしますし、そういう思いだったのかと思いますが) 何かしら補足を考えます。ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2223] Re:ポインタ完全制覇(第2版) Fig2-10とデバッグライト
投稿者:Hiroyuki Naito
2020/01/26 09:40:19

お世話になります。 3番目の質問については、本文の「原理はプリプロセッサのマニュアルを調べよ」にヒントを得て調べてみたら、自己解決しました。 >#define SNAP_INT(arg) fprintf(stderr, #arg "...%d", arg) >の中の#argは引数名そのものを指しているようですが、(他のC言語の解説書では)見たことのない使い方でした。できましたら、補足説明をお願いいたします。 「#演算子は、マクロ実引数を文字列化します」ということでした。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2222] ポインタ完全制覇(第2版) Fig2-10とデバッグライト
投稿者:Hiroyuki Naito
2020/01/26 08:29:45

お世話になります。 細かいことで恐縮ですが、Fig2-10で「"&d, %s\n"へのポインタ」とありますが、「"%d, %s\n"へのポインタ」の誤植と思われます。 私が使っているCコンパイラはgcc 5.4.1 c99でしたので、p128で紹介されている__VA_ARGS__を以下のように使ってみました。 void debug_write(char *fmt, ...) { va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); } #define DEBUG_WRITE(...) debug_write(__VA_ARGS__) でもちろん動作OKでしたが、 #define DEBUG_WRITE(...) fprintf(stderr, __VA_ARGS__) でもokでした。 「debug_write()関数の呼び出しのオーバーヘッドは避けられない(p127)」ということでしたが、fprintf()関数でも同様でしょうか。 〈使用例〉 int i = 300; char *p = "hoge"; DEBUG_WRITE("%s %d\n", p, i); また、 #define SNAP_INT(arg) fprintf(stderr, #arg "...%d", arg) の中の#argは引数名そのものを指しているようですが、(他のC言語の解説書では)見たことのない使い方でした。できましたら、補足説明をお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2219] Re:C言語ポインタ完全制覇(第2版) Fig2-8
投稿者:(ぱ)こと管理人
2020/01/25 00:22:40

正誤表に追加しました。ミスが多く申し訳ありません。 >onlineGDBというWeb上のCコンパイラで、コンパイルオプションをいろいろ試して >ist2-6と同じアセンブルリストが得られたので、本文に沿ってリストを追いかけてみて >気づいた疑問点でした。 おかげで他の方が混乱するのが避けられたと思います(正誤表を見に来た方に限りますが…)。 ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2218] Re:C言語ポインタ完全制覇(第2版) Fig2-8
投稿者:Hiroyuki Naito
2020/01/24 17:39:26

ご回答ありがとうございました。 >①「ローカル変数result」と「退避したベースポインタ」を書く場所を1段間違え、 >②「ベースポインタ」の右の矢印「→」をつけ忘れる onlineGDBというWeb上のCコンパイラで、コンパイルオプションをいろいろ試してist2-6と同じアセンブルリストが得られたので、本文に沿ってリストを追いかけてみて気づいた疑問点でした。 2.5.3までのところで、目からうろこ状態になってしまったのは以下の通りですが、今後もいろいろな発見がありそうなので期待しながら読み進めていきたいと思います。 (1)宣言のときの*や[](区切り子) は、式の中に現れる演算子の*や[]とは、まったくの別物。 (2)式の中では、配列は「その先頭要素へのポインタ」に読み替えられる。 (3)関数は、式の中では「関数へのポインタ」に読み替えらえる。 (4)関数funcへのポインタを格納するポインタ変数は、以下のように宣言する。 int (*func)(double); (5)関数へのポインタを使用したサンプルプログラム:List2-3 (6)自動変数の領域は、関数を抜けたら解放される。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2217] Re:C:言語ポインタ完全制覇(第2版) Fig2-8
投稿者:(ぱ)こと管理人
2020/01/22 00:56:40

はじめまして。ご指摘ありがとうございます。 >ベースポインタ-24、-28と「仮引数a,b」の位置関係が正しいとすると、ベース >ポインタとベースポインタ-4に格納される「退避したベースポインタ」とローカル >変数:resultの位置は、-4バイトずれていないでしょうか。 > >ベースポインタ:-20とベースポインタ:-4の間に、12バイト分のスペースしかない >のも少し気になりました。 申し訳ありません。誤植です。 言い訳になりますが、私が編集さんに渡したFig2-8の原本は以下です。 http://kmaebashi.com/etc/basepointer.png これをデザイナさんが書き直した際に、 ①「ローカル変数result」と「退避したベースポインタ」を書く場所を1段間違え、 ②「ベースポインタ」の右の矢印「→」をつけ忘れる というミスをされたようです。 もちろんゲラをチェックするのは私の仕事ですので、見落として本になって しまったのは私の責任です。 元の図も、「退避したベースポインタ」が4バイトに見える、というのは ちょっと問題ですね…… 正誤表に上げさせていただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2216] C:言語ポインタ完全制覇(第2版) Fig2-8
投稿者:Hiroyuki Naito
2020/01/20 21:05:36

お世話になります。 だいぶ前にpdf版を購入してからしばらくコンピュータの中で眠らせてしまって いましたが、一念発起して読み始めております。 さて、Fig2-8では、アセンブラが割り振るベースポインタとそこに格納される変数の 関係が示されています。 ベースポインタ-24、-28と「仮引数a,b」の位置関係が正しいとすると、ベース ポインタとベースポインタ-4に格納される「退避したベースポインタ」とローカル 変数:resultの位置は、-4バイトずれていないでしょうか。 ベースポインタ:-20とベースポインタ:-4の間に、12バイト分のスペースしかない のも少し気になりました。 以上、お手数ですがご回答をお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2215] Re:c言語ポインタ完全制覇 realloc
投稿者:774RR
2020/01/14 14:23:20

>結局、巨大配列から動的に切り出す仕組みを作りかけたのを思い出しました。 それなんてオレオレ malloc ? 数バイト単位の alloc/free が高頻度で必要 L1 キャッシュヒット率を落とさないよう free 直後領域の再利用を優先するべし みたいな案件でオレオレ malloc/free 相当の関数は組んだことが過去にありました。 でも苦労した割にはそこがボトルネックではなかったでした。 それ以後は実測せずに思い込みの最適化をするなと口酸っぱく言ってます。 まあとりあえず p=realloc(p, sz); は一応注意喚起対象ってことで。 書籍の著者の掲示板まで読んでいる人には周知の事実かもしれませんが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2214] Re:c言語ポインタ完全制覇 realloc
投稿者:(ぱ)こと管理人
2020/01/12 17:02:50

>p=realloc(p, sz); のコードに対して静的解析ツールが警告出したりするので >QAC 絶対主義みたいな頭の固い上司がこのコードにウンと言わない場合が >あったりするとかなかったりするとか。 まあそれはそれで必然性がないわけでもないので、よろしいのではないでしょうか。 >組み込み系では RAM 8KiB をコード実装に入る前の設計段階で静的に割り振って >動的確保なんぞありえないってケースが大半なので、そういう点でオイラは楽できてます。 新人時代、ワークステーションなのに上司がmalloc()禁止と言い出して、 結局、巨大配列から動的に切り出す仕組みを作りかけたのを思い出しました。 (最終的には説得に成功した)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2213] Re:c言語ポインタ完全制覇 realloc
投稿者:774RR
2020/01/08 06:54:29

お久しぶりです。1月に1回くらいは掲示板チェックしてましたよ。 > 「戻り値のチェックは省略しています」という言い訳を付けています。 それなら問題ないっす。この手の解説書き始めると数ページを要してしまうし、 紙面に制約がある状況で本筋からずれた詳細を記載してもねー、と思うわけっす。 # ページに余裕があるなら数行の「コラム」にするのはアリかもしれない。 p=realloc(p, sz); のコードに対して静的解析ツールが警告出したりするので QAC 絶対主義みたいな頭の固い上司がこのコードにウンと言わない場合が あったりするとかなかったりするとか。 組み込み系では RAM 8KiB をコード実装に入る前の設計段階で静的に割り振って 動的確保なんぞありえないってケースが大半なので、そういう点でオイラは楽できてます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2212] Re:c言語ポインタ完全制覇 realloc
投稿者:(ぱ)こと管理人
2020/01/08 02:18:07

おや、ごぶさたしております。 >オイラは買っていませんが [2206] で >> variable_array = realloc(variable_array, sizeof(int) * size); >と引用されていますね。典型的やってはダメと巷で解説されている例でしょう。 この箇所、書籍では、地の分で | List4-4では,ユーザーがint型の値を入力するたびに,realloc()を使って | variable_arrayを拡張しています(ここでも,戻り値のチェックは省略しています). と書いておりまして、「戻り値のチェックは省略しています」という言い訳を付けています。 realloc()の挙動を知るためのサンプルプログラムとしてはありではないでしょうか? ではサンプルではない場合にどうするかといえば、 malloc()だろうとrealloc()だろうと直接呼ぶのはそれ自体NGで、 なんらかのラップをかぶせ、「死ぬしかないにしても、(Segmentation faultではなく) メモリ不足で死んだことがわかるようにする」というのが最低限の対策だと 思っています。 >でもまあ realloc() に失敗するような状況だとほかの処理も一切できなくて >終了するしかない、ってのが実情で、 20年近く前に http://kmaebashi.com/programmer/c_yota/malloc.html の「戻り値チェック」のところにいろいろ書いてて、書籍の方にも似たことを 書いています。 JavaでOutOfMemoryErrorをcatchもしないくせに、Cでmalloc()の戻り値だけ 気にしたってしょうがない。それを言うならRubyなんてかつてはmalloc()が NULLを返しただけで(適切なエラーメッセージも出さず)Segmentation faultで 落ちまくってたぞ、と言いたいですねえ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2211] c言語ポインタ完全制覇 realloc
投稿者:774RR
2020/01/06 19:18:48

オイラは買っていませんが [2206] で > variable_array = realloc(variable_array, sizeof(int) * size); と引用されていますね。典型的やってはダメと巷で解説されている例でしょう。 realloc() に失敗したとき nullptr が返され、旧 variable_array の領域を指すポインタがなくなってしまうので free() できなくなり、リークする というのがよくある解説なわけです。 でもまあ realloc() に失敗するような状況だとほかの処理も一切できなくて終了するしかない、ってのが実情で、 どうせ終了するんだったら現コードでもまいっかと思うわけですが Maebashi さんはどう思います?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2210] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:Hello World
2020/01/05 12:09:19

回答ありがとうございます。 すぐに読ませていただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2209] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:(ぱ)こと管理人
2020/01/03 21:13:33

>もう一つ質問があります。 >ポインタ完全制覇を読んでみて、処理系がどのようにプログラマーの書いたコードを >解釈しているのかが理解できれば、より理解が深まるなと考えています。 >そこで処理系に関するおすすめの書籍などがあれば教えていただけると非常に嬉しいです。 処理系に関する本、というと私が答えるなら当然これになるわけですが プログラミング言語を作る https://amzn.to/2szojNN 10年前の本なので新刊入手は難しいでしょうし、「機械語を生成するCコンパイラ」を 作っているわけではないのでHello Worldさんの目的にはちょっと合わないかもしれません。 Web版なら無料なのでよろしければどうぞ。crowbarはともかくDiksamの方は、 バイトコードコンパイル型の言語なのでCにも通じるところはあるかと思います。 http://kmaebashi.com/programmer/devlang/index.html 機械語を生成するCコンパイラの本であれば、私が大昔に読んだのはこれですが、 yaccによるCコンパイラプログラミング https://amzn.to/2SP8bT1 こちらも入手困難かもしれません(昔はマーケットプレイスでとんでもない高値が ついていました……)。 今なら、Rui Ueyamaさんの、こちらのページとかどうでしょうか(完結していませんが)。 https://www.sigbus.info/compilerbook
[この投稿を含むスレッドを表示] [この投稿を削除]
[2208] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:Hello World
2020/01/02 15:39:55

回答ありがとうございます。と共に返信遅くなり、申し訳ありません。 >はい。realloc()は引数で渡されたポインタとは異なるポインタを返すこともあります。 >2-6-6(p.147)にも書いたとおりです。 2-6-6 読み直しました。4章(List 4-4 realloc.c)で色々試したことにより深く理解することができました。 ありがとうございます。 >どこに疑問を持たれているのかいまひとつわかりませんが、 >確かにrealloc()は異なるアドレスを返すことがあります。 >たとえばrealloc()が6回目までは同じアドレスAを返し、7回目の呼び出しで >アドレスBを返したとして、Bを返すとき、realloc()は >A[0]~A[5]をB[0]~B[5]にコピーしてから返します。 >よって、このサンプルでは、17行目からのforループで値を表示することは >問題なくできます。 > >これで回答になっていますでしょうか? はい、的確な回答ありがとうございます。 17行目の部分も理解することができました。ありがとうございます。 >実験できる環境があるのでしたら、realloc()の下で実際にポインタの値を >表示してみると挙動がわかるかもしれません。 >具体的には13行目と14行目の間に以下の2行を挿入します。 > >printf("variable_array..%p\n", variable_array); >malloc(10); > >明らかに無駄に見える2行目のmalloc(10);は、realloc()で確保した領域の >続きを埋めることでrealloc()が別の領域を返すことを促すためのものです >(コンパイラが最適化で消してしまうかもしれませんが、私の環境(Linux上のgcc)では >最適化オプションを付けなければ大丈夫でした)。これを付けないと、 >何度呼んでもrealloc()は同じアドレスを返しました。後ろが空いているからでしょう >(p.147参照)。 > >上記2行を足すことで、私の環境では、realloc()は7回目で異なるアドレスを >返してきました。 アドレスを表示することは何度もやっていましたが、mallocにより別の領域を返すことを促す発想はありませんでした。 ちなみにわたしの環境では、realloc()は6回目で異なるアドレスを返してきました。 もう一つ質問があります。 ポインタ完全制覇を読んでみて、処理系がどのようにプログラマーの書いたコードを解釈しているのかが理解できれば、より理解が深まるなと考えています。そこで処理系に関する おすすめの書籍などがあれば教えていただけると非常に嬉しいです。 回答ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2207] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:(ぱ)こと管理人
2019/12/29 14:42:22

はじめまして。 >realloc関数について man command で調べたところ(準拠 C89 C99)、返り値の項で >>「realloc関数は新たに割り当てられたメモリーへのポインタを返す。これはあらゆる >>組み込み型に対応できるようにアラインメントされており、ptrとは異なることも >ある。」と説明されています。 はい。realloc()は引数で渡されたポインタとは異なるポインタを返すこともあります。 2-6-6(p.147)にも書いたとおりです。 >List 4-4 realloc.cの17~19行目のfor文のブロックでsscanf関数によって >ヒープ領域にストアした値をprintf関数により、variable_array[i]という形で >参照しています。これは実際には *(variable_array + i) という形に >読み替えられていると思います。 ただ、上記のmanコマンドの返り値の項で >記述されている「ptrとは異なることもある」が実際に起こった場合、 >List 4-4 におけるptrつまりvariable_arrayが指し示すメモリアドレスが >一定ではなくなると思うので、そのメモリアドレスを起点にしてアクセスする >*(variable_array + i)は上手く目的の値をとってくることが、 >できないのではないでしょうか。 どこに疑問を持たれているのかいまひとつわかりませんが、 確かにrealloc()は異なるアドレスを返すことがあります。 たとえばrealloc()が6回目までは同じアドレスAを返し、7回目の呼び出しで アドレスBを返したとして、Bを返すとき、realloc()は A[0]~A[5]をB[0]~B[5]にコピーしてから返します。 よって、このサンプルでは、17行目からのforループで値を表示することは 問題なくできます。 これで回答になっていますでしょうか? >今まだ4章の途中ですが、本当にたくさんのことも学ぶことができています。 >自身の環境で実験をしながら試行錯誤ができ、とてもおもしろいです。 >本を書いてくださりありがとうございました。 ありがとうございます。 実験できる環境があるのでしたら、realloc()の下で実際にポインタの値を 表示してみると挙動がわかるかもしれません。 具体的には13行目と14行目の間に以下の2行を挿入します。 printf("variable_array..%p\n", variable_array); malloc(10); 明らかに無駄に見える2行目のmalloc(10);は、realloc()で確保した領域の 続きを埋めることでrealloc()が別の領域を返すことを促すためのものです (コンパイラが最適化で消してしまうかもしれませんが、私の環境(Linux上のgcc)では 最適化オプションを付けなければ大丈夫でした)。これを付けないと、 何度呼んでもrealloc()は同じアドレスを返しました。後ろが空いているからでしょう (p.147参照)。 上記2行を足すことで、私の環境では、realloc()は7回目で異なるアドレスを 返してきました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2206] c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:Hello World
2019/12/27 19:06:55

・realloc関数についての質問(p238 List 4-4 realloc.c)  realloc関数の呼び出しは13行目 variable_array = realloc(variable_array, sizeof(int) * size); realloc関数について man command で調べたところ(準拠 C89 C99)、返り値の項で 「realloc関数は新たに割り当てられたメモリーへのポインタを返す。これはあらゆる組み込み型に対応できるようにアラインメントされており、ptrとは異なることもある。」と説明されています。 man command のrealloc関数の書式は以下の通り。 void *realloc(void *ptr, size_t size); List 4-4 realloc.cの17~19行目のfor文のブロックでsscanf関数によってヒープ領域にストアした値をprintf関数により、variable_array[i]という形で参照しています。これは実際には *(variable_array + i) という形に読み替えられていると思います。 ただ、上記のmanコマンドの返り値の項で記述されている「ptrとは異なることもある」が実際に起こった場合、List 4-4 におけるptrつまりvariable_arrayが指し示すメモリアドレスが一定ではなくなると思うので、そのメモリアドレスを起点にしてアクセスする *(variable_array + i)は上手く目的の値をとってくることが、できないのではないでしょうか。 拙い文ではありますが、何卒よろしくお願いします。 今まだ4章の途中ですが、本当にたくさんのことも学ぶことができています。 自身の環境で実験をしながら試行錯誤ができ、とてもおもしろいです。 本を書いてくださりありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2205] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:nana
2019/12/21 19:03:55

回答ありがとうございます。 なんとなく分かった気がします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2204] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:(ぱ)こと管理人
2019/12/21 18:06:45

すみません、不明点がいまいちよくわかりません。 >37行目 : read_slogan(stdin, slogan); のように なぜslogan のみで良いのか >理解できずにいます。 … >例えば、 char slogan[7]; を渡す場合は、 >配列は渡せないため、 slogan として配列の先頭要素へのポインタを渡すということは >一応理解できています。 おなじことです。 char slogan[7]; においてsloganの型は「charの配列」です。これを関数に渡すなら、 (配列は渡せないため)sloganとして配列の先頭要素へのポインタを渡します。 式の中では配列はポインタに読み替えられるので、sloganの型は 「charへのポインタ」となります。 char *slogan[7]; においてsloganの型は「charへのポインタの配列」です。これを関数に渡すなら、 (配列は渡せないため)sloganとして配列の先頭要素へのポインタを渡します。 式の中では配列はポインタに読み替えられるので、sloganの型は 「charへのポインタのポインタ」となります。 これで回答になっていますでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2203] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:nana
2019/12/20 16:27:08

回答ありがとうございます。 そのページも読んでいたはずなのですが、理解できていなかったようです。 追加で、もう一つ質問があります。 p.241 のList4-5に関してなのですが、 char *slogan[7]; を渡す際に、 37行目 : read_slogan(stdin, slogan); のように なぜslogan のみで良いのか理解できずにいます。 p.242 では read_slogan()関数には「charへのポインタの配列」を引数で渡していると 書いてありますが、なぜ slogan のみでcharへのポインタの配列を渡すことになるのかが 分かりません。 例えば、 char slogan[7]; を渡す場合は、 配列は渡せないため、 slogan として配列の先頭要素へのポインタを渡すということは 一応理解できています。 回答お願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2202] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:(ぱ)こと管理人
2019/12/20 00:24:07

こんにちは。 >スタックというのは、データ構造なのか、そういった領域があるのか、 >いまいちわかっていません。 >スタックに積むという表現がp.111あたりにありますが、自動変数の場合は >CPUに組み込みで備わっているスタックという機能(データ構造)を使ってくれる >ということなんでしょうか? スタックという言葉自体は広くはデータ構造を指すので、配列や連結リストで スタックを作ることもありますが、Cにおける自動変数の領域の確保は、 通常はCPUに組み込みで備わっているスタックの機能を使います。 p.114 List 2-6のアセンブリ言語を見ると、%rsp(スタックポインタ)という レジスタが登場しています。これにsp(stack pointer)という名前が付いている ことから、このスタックがCPU組み込みの機能であることがわかるでしょう。 もし、CPUに組み込みのスタック機能がないとしたら、別のレジスタやメモリを スタックポインタに使って同等の機能を実現することはできるでしょうが、 その場合、pushq(List2-6の4行目)やpopq(16行目)のように、1命令でスタックに 値を積んだり取り出したりはできなくなります。スタックは有用な機能なので、 昔から、たいていのCPUには組み込みのスタック機能が付いています。 スタックの領域は、p.100のFig.2-3にあるとおり、仮想アドレスのどこかに OSにより割り当てられています。 >ヒープというのはもともとそういった領域が用意されているのでしょうか? これもp.100のFig.2-3にあるとおり、仮想アドレスのどこかにOSにより 割り当てられています。 >また、 >p.141には「malloc()の要求に対して十分な大きさの空きブロックがない場合、 >OSにお願いして領域を拡張してもらいます」 >と書いてあります。 >これは、もともとあるヒープ領域を拡張するという意味なのでしょうか? そうです。Fig.2-3の「malloc()により確保された領域」が下に伸びるイメージです。 >また、くだらないことかもしれませんが、 >p.285のList 5-5 >1行目 include <stdio.h>で # が抜けているように思います。 本当ですね。ご指摘ありがとうございます。正誤表に載せます。 (プログラムリストは、ソースから自動処理で編集さんに渡すテキストに 組み込んでいたので、元原稿にはコンパイルが通らないようなソースは ないのですが…… 編集段階で#が抜けてしまったようです。著者としては ゲラのチェックの段階で気付かなければいけなかったのですが…… もうしわけありません)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2201] c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:nana
2019/12/16 11:08:26

・スタックに関する質問 スタックというのは、データ構造なのか、そういった領域があるのか、いまいちわかっていません。 スタックに積むという表現がp.111あたりにありますが、自動変数の場合はCPUに組み込みで備わっているスタックという機能(データ構造)を使ってくれるということなんでしょうか? ・ヒープに関する質問 p.135にmalloc()は、...「ヒープからメモリを取ってくる関数」ということになります。 と書いてありますが、 ヒープというのはもともとそういった領域が用意されているのでしょうか? また、 p.141には「malloc()の要求に対して十分な大きさの空きブロックがない場合、OSにお願いして領域を拡張してもらいます」 と書いてあります。 これは、もともとあるヒープ領域を拡張するという意味なのでしょうか? 初歩的な質問かと思いますが、お答えいただけると嬉しいです。 また、くだらないことかもしれませんが、 p.285のList 5-5 1行目 include <stdio.h>で # が抜けているように思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2200] X-Drawのページの画像について
投稿者:(ぱ)こと管理人
2019/12/05 23:30:02

ポインタ完全制覇新版のX-Drawのページについて、 http://kmaebashi.com/seiha2/xdraw/index.html 画像がすべて表示できない状態になっていました。 画像ファイルがサーバになくて、404状態でした。 原因はわかりませんし、いつからこの状態だったのかもわかりません (もしかして最初から?)。 ひとまず再アップロードしておきました。 ご迷惑をおかけしまして申し訳ありません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2199] Re:ポインタ完全制覇 - read_slogan.c
投稿者:(ぱ)こと管理人
2019/11/16 02:04:54

はじめまして。ご指摘ありがとうございます。 >buf[slogan_len - 1] = '\0'; > >したあと、 > >slogan[i] = malloc(sizeof(char) * (slogan_len + 1)); > >していますが、bufの大きさは、slogan_len byteで十分なので、 通常、文字数がlenのとき、'\0'の分を含めてlen+1だけmalloc()するのが 定石ですが、このケースではslogan_lenは改行文字を含んでいて、 その改行文字を'\0'に置き換えるので、malloc()するのはslogan_lenの 分だけでよいですね。 改定前のものからのミスだと思います。正直、まだポカが残っているとは 思いませんでした…… 正誤表に入れさせていただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2198] ポインタ完全制覇 - read_slogan.c
投稿者:Tom
2019/11/13 20:20:20

はじめまして、ポインタ完全制覇の四章の`read_slogan.c`での質問です。 buf[slogan_len - 1] = '\0'; したあと、 slogan[i] = malloc(sizeof(char) * (slogan_len + 1)); していますが、bufの大きさは、slogan_len byteで十分なので、mallocのときには、+1する必要はなくて、 slogan[i] = malloc(sizeof(char) * slogan_len); でよいのではないでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2197] Re:オブジェクト指向について
投稿者:(ぱ)こと管理人
2019/10/17 01:47:29

>Javaのメソッド呼び出しの文法が、C++におけるオブジェクトの実体へのアクセスと >同じであるため、混乱していました。 C++はオブジェクトの実体とポインタの両方を扱えるので obj.hoge(); と obj->hoge(); は別の意味ですが、 Javaはポインタしかないので、Javaにおける obj.hoge(); は、C++における obj->hoge(); と同値です。ポインタしかないJavaではわざわざ1文字多い「->」を使うより、 全部「.」を使う方が打鍵数が少なくてよいとは思いますが、紛らわしいのは 確かですね。 ただ、なんにせよ、オブジェクト指向においては「どのオブジェクトに仕事を 頼むのか」が重要なので、「ポインタ(参照)でオブジェクトを指す」のは 概念的にわかりやすく、C++のように実体を扱える言語より、なんでも参照 (ポインタ)の言語の方がとらえやすいかとは思います。どちらが実用的かとか、 そういう話は置いておくとして。 継承を考えればなおのこと、です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2196] Re:オブジェクト指向について
投稿者:C××
2019/10/14 18:40:43

回答ありがとうございます。 Javaのメソッド呼び出しの文法が、C++におけるオブジェクトの実体へのアクセスと同じであるため、混乱していました。 C++からJavaを学ぶ場合(あるいはその逆) 文法が似ているから楽だと書いているサイトをよく見ますが、 かえって紛らわしいなと感じました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2195] Re:オブジェクト指向について
投稿者:(ぱ)こと管理人
2019/10/13 01:47:58

はじめまして。 > ここの記事やほかのサイトを読んでるうちに、結局のところ >「オブジェクトというのはプログラム(ソフトウェア)を保持することができる変数」で >「小規模なソフトウェアの組み合わせで1つのソフトウェアを作るのがオブジェクト指向」 >という結論にたどり着いたのですが、実際のところこの解釈はどうなのでしょうか。 まず、C++を除くたいていのオブジェクト指向言語では、オブジェクトを変数に 格納することはできません。変数に格納できるのはオブジェクトへの参照だけです。 そのうえで、オブジェクトという「小規模なソフトウェア」の組み合わせで それなりの規模のプログラムを作る、というのはそれなりによさげな解釈かと 思います。単に「小規模なソフトウェアの組み合わせで1つのソフトウェアを作る」 だけだと、「モジュール化」と区別がつきませんし。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2194] オブジェクト指向について
投稿者:C××
2019/10/10 00:25:10

 初投稿です  オブジェクト指向についてわかったような気になったり、急にわからなくなったりという哲学じみた事を繰り返している内に、最近このサイトに行き着いた者です。  ここの記事やほかのサイトを読んでるうちに、結局のところ 「オブジェクトというのはプログラム(ソフトウェア)を保持することができる変数」で 「小規模なソフトウェアの組み合わせで1つのソフトウェアを作るのがオブジェクト指向」という結論にたどり着いたのですが、実際のところこの解釈はどうなのでしょうか。  犬猫や、レストランの例えよりは一番しっくり来た表現なのですが、厳密には違うような気がします。( operator=() などで定義しないと代入できない辺り)  はっきりとしない質問で恐縮ですが、意見を聞かせてくだされば幸いです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2193] Re:Webアプリケーション開発入門のP132について
投稿者:(ぱ)こと管理人
2019/09/10 00:25:20

>② C:\Users\java\expand_downloads\src\p77\chap03\Henacat_0_1\com  > >にクラスパスを通してみようとしましたら、エラーが発生してしまいました。 >大変恐縮ですが、ご教授頂けましたら幸いです。よろしくお願い致します。 エラーを見ると、 >PostBBS.java:2: エラー: パッケージcom.kmaebashi.henacat.servlet.httpは存在しません このように、Henacatで作成したサーブレット関連のパッケージやクラスが見えていない ことがわかります。つまり、クラスパスが通っていません。 実行したコマンドラインは以下ですが、 >C:\Users\java\expand_downloads\src\p77\chap03\testbbs\WEB-INF\classes>javac -classpath C:\Users\java\expand_downloads\src\p77\chap03\Henacat_0_1\com *.java これを見ると、「C:\Users\java\expand_downloads\src\p77\chap03\Henacat_0_1\com」に クラスパスを通していますが、p.132冒頭の記載は、 | この修正を加えたうえで、Henacatのクラスファイルのルートであるcomディレクトリが | 存在するディレクトリ(「com\kmaebashi\henacat\……」というディレクトリ階層の | 根元)にclasspathを向けてコンパイルし、クラスファイルを作ります。 です。「comディレクトリが存在するディレクトリ」ですから、comディレクトリの ひとつ上です。 この場合なら、以下のようにすれば通るかと思います。 > javac -classpath C:\Users\java\expand_downloads\src\p77\chap03\Henacat_0_ *.java
[この投稿を含むスレッドを表示] [この投稿を削除]
[2192] Webアプリケーション開発入門のP132について
投稿者:javajava
2019/09/08 15:19:21

いつも大変お世話になっております。P132の文章を理解できていない為と思うのですが、私なりに、 ① chap03\testbbs\WEB-INF\classes の3ファイルのP131に該当する部分を修正し、 ② C:\Users\java\expand_downloads\src\p77\chap03\Henacat_0_1\com  にクラスパスを通してみようとしましたら、エラーが発生してしまいました。大変恐縮ですが、ご教授頂けましたら幸いです。よろしくお願い致します。 【以下エラー文】 C:\Users\java\expand_downloads\src\chap03\Henacat_0_1\com\kmaebashi\henacat\webserver>cd C:\Users\java\expand_downloads\src\p77\chap03\testbbs\WEB-INF\classes C:\Users\java\expand_downloads\src\p77\chap03\testbbs\WEB-INF\classes>javac -classpath C:\Users\java\expand_downloads\src\p77\chap03\Henacat_0_1\com *.java PostBBS.java:2: エラー: パッケージcom.kmaebashi.henacat.servlet.httpは存在しません import com.kmaebashi.henacat.servlet.http.*; //javax.servlet.http.*; ^ PostBBS.java:4: エラー: シンボルを見つけられません public class PostBBS extends HttpServlet { ^ シンボル: クラス HttpServlet PostBBS.java:6: エラー: シンボルを見つけられません public void doPost(HttpServletRequest request, HttpServletResponse response) ^ シンボル: クラス HttpServletRequest 場所: クラス PostBBS PostBBS.java:6: エラー: シンボルを見つけられません public void doPost(HttpServletRequest request, HttpServletResponse response) ^ シンボル: クラス HttpServletResponse 場所: クラス PostBBS ShowBBS.java:2: エラー: パッケージcom.kmaebashi.henacat.servlet.httpは存在しません import com.kmaebashi.henacat.servlet.http.*; //import javax.servlet.http.*; ^ ShowBBS.java:4: エラー: シンボルを見つけられません public class ShowBBS extends HttpServlet { ^ シンボル: クラス HttpServlet ShowBBS.java:13: エラー: シンボルを見つけられません public void doGet(HttpServletRequest request, HttpServletResponse response) ^ シンボル: クラス HttpServletRequest 場所: クラス ShowBBS ShowBBS.java:13: エラー: シンボルを見つけられません public void doGet(HttpServletRequest request, HttpServletResponse response) ^ シンボル: クラス HttpServletResponse 場所: クラス ShowBBS PostBBS.java:5: エラー: メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません @Override ^ ShowBBS.java:12: エラー: メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません @Override ^ エラー10個 C:\Users\java\expand_downloads\src\p77\chap03\testbbs\WEB-INF\classes>
[この投稿を含むスレッドを表示] [この投稿を削除]
[2191] Re:Webアプリケーション開発入門のP99について
投稿者:javajava
2019/09/08 15:06:31

>>早速ですが、ご指摘にしたがってP.97のようにコンパイルしてみましたが、 >>下記のようなエラーが出ます。Message.javaはできたようです。 >>しかし、PostBBS.javaで躓きます。 > >すみません、前回の例示は不正確でした。p.97のとおりにやるなら > >javac -classpath C:\Tomcat8\lib\servlet-api.jar *.java > >ですね。私の環境ではこれで通りました。 > >-classpathでクラスパスの指定をすると、カレントディレクトリがクラスパスから >抜けてしまうので、PostBBS.javaをコンパイルするときにMessage.classが参照できなくて >エラーになっているわけです。以下のようにカレントディレクトリ「./」を >-classpathに加えてもコンパイルできますが、この規模なら*.javaで十分でしょう。 > >javac -classpath ./;C:\Tomcat8\lib\servlet-api.jar PostBBS.java ご回答、ありがとうございます。ご指摘頂いたように「*.java」の方で実行したところ、うまくいきました!ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2190] Re:Webアプリケーション開発入門のP99について
投稿者:javajava
2019/09/08 15:06:26

>>早速ですが、ご指摘にしたがってP.97のようにコンパイルしてみましたが、 >>下記のようなエラーが出ます。Message.javaはできたようです。 >>しかし、PostBBS.javaで躓きます。 > >すみません、前回の例示は不正確でした。p.97のとおりにやるなら > >javac -classpath C:\Tomcat8\lib\servlet-api.jar *.java > >ですね。私の環境ではこれで通りました。 > >-classpathでクラスパスの指定をすると、カレントディレクトリがクラスパスから >抜けてしまうので、PostBBS.javaをコンパイルするときにMessage.classが参照できなくて >エラーになっているわけです。以下のようにカレントディレクトリ「./」を >-classpathに加えてもコンパイルできますが、この規模なら*.javaで十分でしょう。 > >javac -classpath ./;C:\Tomcat8\lib\servlet-api.jar PostBBS.java ご回答、ありがとうございます。ご指摘頂いたように「*.java」の方で実行したところ、うまくいきました!ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2189] Re:Webアプリケーション開発入門のP99について
投稿者:(ぱ)こと管理人
2019/09/03 01:08:02

>早速ですが、ご指摘にしたがってP.97のようにコンパイルしてみましたが、 >下記のようなエラーが出ます。Message.javaはできたようです。 >しかし、PostBBS.javaで躓きます。 すみません、前回の例示は不正確でした。p.97のとおりにやるなら javac -classpath C:\Tomcat8\lib\servlet-api.jar *.java ですね。私の環境ではこれで通りました。 -classpathでクラスパスの指定をすると、カレントディレクトリがクラスパスから 抜けてしまうので、PostBBS.javaをコンパイルするときにMessage.classが参照できなくて エラーになっているわけです。以下のようにカレントディレクトリ「./」を -classpathに加えてもコンパイルできますが、この規模なら*.javaで十分でしょう。 javac -classpath ./;C:\Tomcat8\lib\servlet-api.jar PostBBS.java
[この投稿を含むスレッドを表示] [この投稿を削除]
[2188] Re:Webアプリケーション開発入門のP99について
投稿者:javajava
2019/08/31 22:18:55

回答ありがとうございます! メッセージの件、申し訳ありませんでした。以後、注意します。 早速ですが、ご指摘にしたがってP.97のようにコンパイルしてみましたが、下記のようなエラーが出ます。Message.javaはできたようです。しかし、PostBBS.javaで躓きます。 C:\Users\java\expand_downloads\src\p77\chap03\testbbs_jsp\WEB-INF\classes\bbs>javac -classpath C:\Tomcat8\lib\servlet-api.jar Message.java C:\Users\java\expand_downloads\src\p77\chap03\testbbs_jsp\WEB-INF\classes\bbs>javac -classpath C:\Tomcat8\lib\servlet-api.jar PostBBS.java PostBBS.java:10: エラー: シンボルを見つけられません Message newMessage = new Message(request.getParameter("title"), ^ シンボル: クラス Message 場所: クラス PostBBS PostBBS.java:10: エラー: シンボルを見つけられません Message newMessage = new Message(request.getParameter("title"), ^ シンボル: クラス Message 場所: クラス PostBBS PostBBS.java:13: エラー: パッケージMessageは存在しません Message.messageList.add(0, newMessage); ^ エラー3個 C:\Users\java\expand_downloads\src\p77\chap03\testbbs_jsp\WEB-INF\classes\bbs> このようなエラーが出るのですが、何かお気づきの点等ございますでしょうか? ご教授の程、よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2187] Re:Webアプリケーション開発入門のP99について
投稿者:(ぱ)こと管理人
2019/08/27 01:01:19

>ただ、今度はP102のPostBBS.javaをコンパイルしようとするとエラーが。 エラーが出たというのであれば、せめてエラーメッセージは書いてください。 >普通に >javac PostBBS.java としてるのですが・・・。 p.102にPostBBS.javaはないので、どこのソースのことかわかりませんが、 Tomcatで動かすサーブレットをコンパイルするのであれば、 > javac PostBBS.java ではなくて、p.97にあるとおり、 >javac -classpath C:\Tomcat8\lib\servlet-api.jar PostBBS.java のように、servlet-api.jarをクラスパスに入れてコンパイルする必要があります。 (Tomcatのバージョンや配置先が違うなら、適宜読み替えてください)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2186] Re:Webアプリケーション開発入門のP99について
投稿者:javajava
2019/08/25 19:14:00

ご回答ありがとうございます!素晴らしい書籍の執筆ありがとうございます! 時間がとれたので、早速回答に従ってやってみます・・・のような返信を入れたのですが、Upされてないのか、私が不慣れなのか・・・w とにもかくにも、本日もう一度最初からやり直してみましたら、ちゃんと動きました。 ありがとうございました。 ただ、今度はP102のPostBBS.javaをコンパイルしようとするとエラーが。 普通に >javac PostBBS.java としてるのですが・・・。 ご教授いただければ幸いでございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2185] Re:Webアプリケーション開発入門のP99について
投稿者:(ぱ)こと管理人
2019/08/17 16:12:02

>いつもお世話になっております。初めて投稿します。 はじめまして。 >書籍「Webアプリケーション開発入門」のP99で、「http://localhost:8080/ShowBBS」を >ブラウザで実行すると、書籍の中にあった、「ごめんねごめんねごめんねごめんねごめ >んね・・・」と続くページが表示されてしまい、掲示板が表示されません。 書籍の通りの順番でp.99だとすると、「3.3.3.Tomcat で掲示板を作る」のところです。 章タイトルの通り、ここでは、へなちょこサーブレットコンテナHenacatを作る前に、 Tomcatで掲示板を作ろうとしています。 そして、「ごめんなさいごめんなさいごめんなさいごめんなさいごめんなさい ごめんなさい…」と続くページは、p.74にあるWebサーバもどき「Modoki/0.2」の 404ページです。 Tomcatの設定をわざわざ変えたのでなければ、TomcatがModoki/0.2の404ページを 返すわけがないので、ここではTomcatではなくModoki/0.2を叩いているのでは ないでしょうか。 ただし、Modoki/0.2のポート番号は8001で、Tomcatのポート番号は8080です。 Modoki/0.2のポート番号をわざわざ変えたのでなければ、 「http://localhost:8080/ShowBBS」 であればTomcatが動くはずです。 考えられる可能性としては、 ①本当は「http://localhost:8001/ShowBBS」を叩いていた。 ②Modoki/0.2のポート番号を8080に変えて実行していて、  Tomcatはポートが塞がっているので起動に失敗している。 のどちらかですかねえ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2184] Webアプリケーション開発入門のP99について
投稿者:javajava
2019/08/15 12:22:47

いつもお世話になっております。初めて投稿します。 書籍「Webアプリケーション開発入門」のP99で、「http://localhost:8080/ShowBBS」をブラウザで実行すると、書籍の中にあった、「ごめんねごめんねごめんねごめんねごめんね・・・」と続くページが表示されてしまい、掲示板が表示されません。 Tomcatも動いているようですし、書籍の通りやったつもりなのですが、どこが良くないのかがわかりません。同じようなところで躓いて、ピンときた方、いらっしゃいましたら、ご教授お願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2183] Re:汎整数拡張について
投稿者:d_kuma
2019/08/12 21:46:36

お世話になっております。 細かい内容について答えていただき、ありがとうございます。 char,shortと、intでの処理速度やサイズの違いについて、よく分かりました。 現在の処理環境なら、あまり気にする必要は無いのかな、という気がしました。 スカラの変数ならintを使うということも理解できました。 お忙しいところ、ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2182] Re:汎整数拡張について
投稿者:(ぱ)こと管理人
2019/08/11 01:20:26

『CプログラミングFAQ』は、持ってたはずなのですが、どこを探しても見当たらない…… >①汎整数拡張により、char型やshort型は、値を取り出す時に32ビットに変換されるので、 >int型より処理時間がかかったり、int型より実行ファイルが増大したりするのでしょうか? この手の性能問題は私は全然詳しくないのですが(アプリケーションプログラマですので…)、 今時のCPUを相手に、どちらが良いとか悪いとかそう一概に言えるものではないと思っています。 たとえば先のchar_test.sとint_test.sをそれぞれGAS(GNU assembler)にかけてみると、 movsblの命令長はmovlよりも確かに長いのですが、int int_var = 5; の「5」が 32ビット幅になるので、結局のところ実効形式のサイズとしてはint_test.sの方が 微増しているようです。 char_test.s 17 0008 C645FF05 movb $5, -1(%rbp) 18 000c 0FBE45FF movsbl -1(%rbp), %eax 19 0010 89C6 movl %eax, %esi int_test.s 17 0008 C745FC05 movl $5, -4(%rbp) 17 000000 18 000f 8B45FC movl -4(%rbp), %eax 19 0012 89C6 movl %eax, %esi 特に配列なら、主記憶は十分にあっても、今時キャッシュに乗らないと性能は出ないので、 小さな型を使った方が早いケースはあるかもしれません。 配列でないなら、どちらにしても、そう大差があるとは思えませんが。 >②汎整数拡張があるので、char型やshort型を使わずに、int型を使った方が良いのでしょうか? 配列でないスカラの変数であれば、たとえば1バイト文字しか入らないとわかっていても、 私ならintを使います。「ポインタ完全制覇」にも書きましたが、getchar()の 戻り値やputchar()の引数も、実際intですし。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2181] Re:汎整数拡張について
投稿者:d_kuma
2019/08/08 17:42:29

ご連絡遅くなりました。 アセンブラの解説をしていただき、ありがとうございます。 char型はアセンブラ上で変換が入るということで理解しました。 会社内で汎整数拡張について聞いてみたら、アセンブラ上で差異は無いと言われたので、間違って理解していました。 movsblというのが分からず、ネットで調べました。 movsはsign extension(符号拡張)によるコピー、blはfrom byte(8ビット) to long(32ビット)ということで理解しました。 これに付随して、さらに質問があります。 ①汎整数拡張により、char型やshort型は、値を取り出す時に32ビットに変換されるので、int型より処理時間がかかったり、int型より実行ファイルが増大したりするのでしょうか? ②汎整数拡張があるので、char型やshort型を使わずに、int型を使った方が良いのでしょうか? ①については、char型やshort型を使うと、アセンブラ上で余計な変換が入って実行ファイルが増大してしまう、ということが書かれた技術書を読んだことがあります(『CプログラミングFAQ』だったと思います)。 ②については、C言語ではint型が基準なので、できるだけint型を使うべきなのかなと思っています。 巨大な配列を扱う時にメモリのサイズを減らしたいのでchar型やshort型を使うのはいいと思うのですが、 そうでないなら、できるだけint型を使うべきではと思っています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2180] Re:汎整数拡張について
投稿者:(ぱ)こと管理人
2019/08/07 01:01:42

こんにちは。 >汎整数拡張という機能は、char型やshort型は、アセンブラ上ではint型と同じように >扱われる、ということかなと思うのですが、この認識で合っているでしょうか? >Cのソースコードからアセンブラに変換されるときに、汎整数拡張によって何か >変換処理が行われるわけではないと思っています。 汎整数拡張という機能は、charやshortの変数でも、式の中ではintに変換される、 という機能です。変数に格納された値を使う時にはintでも、変数のサイズは、 charやshortならintより小さいわけですから、メモリから値を取り出して (intと同じビット幅の)レジスタに乗せるときには汎整数拡張による変換処理が 入りますし、逆に(int型の)式の値をcharとかshortの変数に格納するときには、 逆の変換が必要です。 試してみました。 char_test.c #include <stdio.h> int char_test(void) { char char_var = 5; printf("%d", char_var); } int_test.c #include <stdio.h> int int_test(void) { int int_var = 5; printf("%d", int_var); } アセンブラ上の差異は以下です(Linuxでgcc -S)。 char_test.s movb $5, -1(%rbp) ← char_var = 5のところ movsbl -1(%rbp), %eax ← char_varの値をeaxレジスタに移動 int_test.s movl $5, -4(%rbp) ←int_var = 5のところ movl -4(%rbp), %eax ← int_varの値をeaxレジスタに移動 int_test.sでは、単に32ビットを移動するmovl命令が使われていますが、 char_test.sでは、5をchar_varに代入する際にはバイトでの移動命令movbが、 char_varの値を取り出すときにはバイトを32ビットに変換しつつ移動する movsblが使われていることがわかります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2179] 汎整数拡張について
投稿者:d_kuma
2019/08/05 17:43:35

お世話になっております。 汎整数拡張(又は整数拡張)について質問があります。 汎整数拡張という機能は、char型やshort型は、アセンブラ上ではint型と同じように扱われる、ということかなと思うのですが、この認識で合っているでしょうか? Cのソースコードからアセンブラに変換されるときに、汎整数拡張によって何か変換処理が行われるわけではないと思っています。 試しに、char型、short型、int型による演算を、アセンブラ上で比較してみたのですが、差異が出てしまいました。 全て同じような結果になると期待していたのですが、そうはならなかったです。 あまりアセンブラに詳しいわけではないので、自信を持って言えるわけではありませんが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2177] Re:C言語ポインタ完全制覇
投稿者:(ぱ)こと管理人
2019/05/19 00:56:23

はじめまして。 >180ページのTable3-3でint *hoge[10]のサイズが8×10になっていますが >int型の配列へのポインタなので4×10ではないでしょうか? int *hoge[10]は、そのページの説明にもあるとおり、 「int型へのポインタの配列(要素数10)」です。 ポインタのサイズは処理系依存ですが、その前のページでポインタは8バイトと 仮定しているので、8×10で80バイトです。 なお、「int型の配列へのポインタ」であれば、(指す先は何であれポインタなので) 8バイトになりますね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2176] C言語ポインタ完全制覇
投稿者:かずぼん
2019/05/18 08:55:14

最近貴書を購入しました。 一つ質問があります。 180ページのTable3-3でint *hoge[10]のサイズが8×10になっていますがint型の配列へのポインタなので4×10ではないでしょうか? よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2175] Re:Eclipseを使うとclassLoaderで例外が発生
投稿者:Radec
2019/05/12 09:33:25

すみません、自己解決しました。 Eclipseがコンパイル時にデフォルトで使用するバージョンがJavaSE11になっていたので、CokkieTestもreleaseオプションで指定で同バージョンにすることで解決致しました。 (というかそもそもスタックトレース見ろレベルの質問でした、大変失礼致しました。)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2174] Re:Eclipseを使うとclassLoaderで例外が発生
投稿者:(ぱ)こと管理人
2019/05/08 23:34:30

はじめまして。 >URL(http://localhost:8001/testbbs/ShowBBS)を入力したところでclassLoaderが例外を発生させてしまいました。 具体的なスタックトレースがわからないので何ですが、 もし起きているのがClassNotFoundExceptionだったとすると、 ShowBBSのクラスが所定の場所にないのではないでしょうか。 Henacatの場合、Henacat自体のソースやクラスをどこに置くかに関係なく、 サーブレットのクラスは、WebApplication.javaの8行目、 private static String WEBAPPS_DIR = "C:\\Henacat_0_1\\webapps"; この場所に置いてあることを期待しています。 もっとも、ここに置いてないならEclipseでなくても動かないですし、 >ShowBBS等のクラスパス指定もElicpseのプロジェクト配下のクラスパスを >指定してコンパイルしています。 というのは、「3.4.3 Henacat ver.0.1 で掲示板を動かす」の | この修正を加えたうえで、Henacatのクラスファイルのルートである | com ディレクトリが存在するディレクトリ(「com\ kmaebashi\henacat\……」と | いうディレクトリ階層の根元)にclasspathを向けてコンパイルし、 | クラスファイルを作ります。 という記載に沿っていることを意味するのであれば、そのあたりも 当然分かったうえで実行されているように思います。 あとは、具体的な例外を見てみないと、ちょっとわかりません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2173] 無題
投稿者:Radec
2019/05/07 21:33:35

こんばんは、本質的なところと全く違うので恐縮ですが、 「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」の第3章にて実装したHenacat0_1の挙動について質問となります。 Henacat0_1のソースコードをダウンロードし、 コマンドプロンプトにてコンパイルを通してMainを実行したところ、 特に問題なく掲示板が稼動しました。 ところが、同ソースコードをEclipseで作成したJavaプロジェクトにコピペしてMainを実行したところ、 URL(http://localhost:8001/testbbs/ShowBBS)を入力したところでclassLoaderが例外を発生させてしまいました。 (デバッグ実行させたところ、WebApplicationインスタンスやServletInfoインスタンスは値を渡せているように見えます) Eclipseはデフォルト文字コードがUTF-8ですが、本プロジェクトについては個別設定でsjisを設定しているので文字コードは問題ないかと思うのですが。。。 また、binフォルダを見ても無名クラス含めてクラアスファイルはしっかり作成されていますし、ShowBBS等のクラスパス指定もElicpseのプロジェクト配下のクラスパスを指定してコンパイルしています。 文字コードとコンパイルミス以外に考えられる原因等はありますでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2172] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:(ぱ)こと管理人
2019/04/02 01:25:35

返信が遅れて申し訳ありません。 >書籍の中の補足でNULLマクロは処理系によって定義のされ方が違うと書かれていましたが、 >(void*)0であっても0であってもNULLは真偽値で言えば偽が返る値ということですね。 その通りです。これについてはC FAQに記載がありました。 http://www.kouno.jp/home/c_faq/c5.html#3 | 5.3: | ポインターがヌルポインターでないかどうかのテストの省略形 「if(p)」は有効なのか? | ヌルポインターの内部表現が0でない場合は どうなるのか。 | A: | C言語が式のブール値を必要とする場合(if、while、forやdo文において、 | また&&、||、!、?:演算子と共に使う場合)、0と比較して等しい場合は偽の値が | 産み出され、その他の場合は真が産み出される。すなわち | | if(expr) | | と書いたらいつも、「expr」がどんな式かにかかわらずコンパイラは必ず | | if((expr) != 0) | | と書かれたように基本的には動作する。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2171] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:f_ki
2019/03/28 14:41:19

書籍の中の補足でNULLマクロは処理系によって定義のされ方が違うと書かれていましたが、(void*)0であっても0であってもNULLは真偽値で言えば偽が返る値ということですね。 本日読了しました。初心者だったので4章以降の実践的な部分は難しく感じる部分もありましたが、何度も読み返していくことでかなりの部分を理解できたと思います。 入門書を読んだだけで理解が曖昧だったポインタや配列、変数の分類や構造体などのC言語の文法についても改めて整理できました。本書のテーマはC言語のポインタですが、結果的にはC言語の文法全体に触れるような構成になっているのはそれだけC言語とポインタが深く広く結びついているということですね。 長くなりましたが技術書ながらとても読みやすく勉強になる本でした。質問にも丁寧に答えていただきありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2170] Re:C言語の標準入力とEOFの扱いについて
投稿者:f_ki
2019/03/28 14:24:48

stdinも含めてFILE構造体には、ファイルが終端に達したことを示すフラグがあって、そのフラグが立っている場合にはfgetc()で取り出される値はEOFになるということですね。 納得できました。ありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2169] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:(ぱ)こと管理人
2019/03/28 00:12:29

>P.297 List 5-14 11行目で、for文の終了条件にposとあるのですが、 >これは pos != NULL ではないでしょうか。 Cでは0以外は全部真なので、条件式にposと書いてもpos != NULLと書いても 意味は同じです。 Cプログラマは使いがちな書き方ではありますが、p.57の「ポインタ演算なんか 使うのはやめてしまおう」のところで『「一見してわかりにくいように見える」なら、 やっぱり書くべきではないでしょう』とか書いてる本としては ちょっとダブルスタンダードっぽいかな、とは我ながら思わなくもないです (^^;
[この投稿を含むスレッドを表示] [この投稿を削除]
[2168] Re:C言語の標準入力とEOFの扱いについて
投稿者:(ぱ)こと管理人
2019/03/28 00:05:43

あれ、昨晩返信したつもりなのに投稿されていませんでした。 >それとも標準入力において一度EOFが入力されたら、以降標準入力から取り出される値は >EOFとなることが決まっているのでしょうか。 こちらです。 規格では(マクロであることを除き)getc()はfgetc()と等価とされていますが、 そのfgetc()の説明には以下のようにあります。 | 返却値 そのストリームのファイル終了表示子がセットされている場合, | 又はストリームがファイルの終わりに達している場合,そのストリームの | ファイル終了表示子をセットし,fgetc 関数は,EOF を返す。 つまり、FILE構造体には「ファイル終了表示子」というフラグがあり、 ファイルの最後に達するとそれがセットされて、以後はEOFを返します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2167] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:f_ki
2019/03/27 21:55:06

お忙しい中ご返信ありがとうございます。 度々申し訳ないのですが、確認させていただきたい所がございます。 P.297 List 5-14 11行目で、for文の終了条件にposとあるのですが、これは pos != NULL ではないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2166] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:(ぱ)こと管理人
2019/03/27 01:20:56

>はじめまして。 はじめまして。読んでいただきありがとうございます。 >p.114 List2-6 12行目 >コメントとの対応を考えると、%edではなく%edxではないでしょうか。 そうですね。オリジナルのソースを見ると%edxになっているので、 編集段階で(矢印を入れたときに?)xが消えてしまったようです。 確認不足でした。申し訳ありません。 >p.226 10の後の英語的表現 >英文の2行目最後のfucntion(int)の後に閉じ括弧)がありますが、 >不要ではないでしょうか。 こちらもそのとおりです。申し訳ありません。 ご指摘ありがとうございました。後ほど正誤表に入れさせていただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2165] C言語の標準入力とEOFの扱いについて
投稿者:f_ki
2019/03/26 20:40:41

重ねて質問させていただきます。 C言語ポインタ完全制覇 P.243-246 の、read_line()関数を、引数にstdinを渡して呼び出す部分について聞かせていただきたいです。 例えば標準入力から、 abcd[Enter] ef[EOF] というように入力すると、read_line()関数は、P.244 List4-6 の61-75行目の処理で、 まず"abcd\0"を返し、次にline_bufferが"ef"になったところでchがEOFとなるので61行目のwhileを抜けて69行目に進み、結果"ef\0"を返します。 この時点でまだNULLを返さないので、main()関数のwhileは次のループに入り、再びread_line()関数にstdinを渡して呼び出すこととなりますが、この時に61行目のgetc(fp)で取り出される値は何なのでしょうか。 実験してみると、どうもこの段階でEOF(だけ)を取り出していて72行目に進み、read_line()関数がNULLを返しているようなのですが、標準入力においてキーアクションのEOFの後に続けて入力を行うことが可能ならば、getc(fp)でその入力値を受け取ってしまうということはないのでしょうか。 それとも標準入力において一度EOFが入力されたら、以降標準入力から取り出される値はEOFとなることが決まっているのでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2164] c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:f_ki
2019/03/25 17:29:45

はじめまして。 C言語ポインタ完全制覇(初版 第一刷)の内容についていくつか確認させていただきたいです。 C言語勉強中、アセンブリ言語については全く知らない身なので、見当外れな質問でしたら申し訳ないです。 p.114 List2-6 12行目 コメントとの対応を考えると、%edではなく%edxではないでしょうか。 p.226 10の後の英語的表現 英文の2行目最後のfucntion(int)の後に閉じ括弧)がありますが、不要ではないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2163] Re:C言語ポインタ完全制覇について
投稿者:d_kuma
2019/03/22 17:33:36

ご連絡ありがとうございます。 正誤表を確認しました。 ご対応、ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2162] Re:C言語ポインタ完全制覇について
投稿者:(ぱ)こと管理人
2019/03/21 15:18:41

はじめまして。遅くなりましてすみません。 >330ページにある、 >void (*draw_shape_func_table)(Shape *shape)[] >というのは、誤植ではないでしょうか? >正しくは、 >void (*draw_shape_func_table[])(Shape *shape) >だと思います。 確認しました。これはこの本のテーマにもろに重なっているという点で かなりまずいミスでした。申し訳ありません。 「わからない人は3章を読み返しましょう」って書いてあるのが 我ながら余計に痛いです。 正誤表に載せておきます。ご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2161] C言語ポインタ完全制覇について
投稿者:d_kuma
2019/03/18 13:40:27

前橋和弥様 改訂版のC言語ポインタ完全制覇を読んだものです。 非常にためになる本で、常日頃参考にさせて頂いております。 今回は、この本に誤植らしきものがあるので、ご連絡致しました。 330ページにある、 void (*draw_shape_func_table)(Shape *shape)[] というのは、誤植ではないでしょうか? 正しくは、 void (*draw_shape_func_table[])(Shape *shape) だと思います。 前者だとコンパイルが通りませんでした。 以上、確認をお願い致します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2160] Re:ちょっとした事
投稿者:(ぱ)こと管理人
2019/03/13 01:56:14

>ぱさんの本で自分がポインターの何が解っていないか初めて解り >大変良い物だとありがたい限りです はじめまして。読んでいただきありがとうございます。 >ところで次のような物を見つけたのでご存じなければつまみにでもどうぞ >https://cdecl.org/ 紹介ありがとうございます。初めて知りました。 ポインタ完全制覇でも取り上げた、K&Rに載っているdclのWeb版ですね。 Webで簡単に解析できるのは便利なので、あとはひっくり返して日本語に してくれれば…… と思うのですが、自分で作れと言われそう。 時間があれば、作ってみたい気はするのですが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2159] ちょっとした事
投稿者:冷水
2019/03/11 03:34:50

こんばんは ぱさんの本で自分がポインターの何が解っていないか初めて解り 大変良い物だとありがたい限りです ところで次のような物を見つけたのでご存じなければつまみにでもどうぞ https://cdecl.org/
[この投稿を含むスレッドを表示] [この投稿を削除]
[2158] Re:Modoki/0.2のリダイレクトの処理について
投稿者:(ぱ)こと管理人
2019/02/24 20:00:11

>レスが付かないまま1週間以上たってしまったため、自己レスします。 すみません、最近どたばたしておりまして、ちょっと気力がたまりませんでした。 >で、パケット解析をするとすぐわかりますが、ブラウザから [ http://localhost:8001/日本語 ] でアクセスすると、 >サーバからレスポンスコード301が返ってきており、 >そこで指定されている移動先URLが文字化けしています。 なるほど…… これはさすがに気付いてしかるべきでしたね。 パケットキャプチャやFiddlerどころか、F12開発者ツールでわかるレベルの話です。 言い訳しますと、 >SenderThread.javaの24行目に、以下のようにSystem.out.println()を挟んで確認しました。 …という確認をしていたのにリクエストは1回ずつしか来なかったので、 リダイレクトは想定しませんでした。最初の1回はちゃんと飛んでたはずですが (過去投稿を見るとIEではそうだったとの記載もある)、今F12を入れて見てみると、 2回目以後はキャッシュされてますね。 「F12開発者ツール」とか、「変な動きがあればキャッシュを消せ」あたりは Webアプリ開発の基本ですが、どうもぼけてたようです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2157] Re:Modoki/0.2のリダイレクトの処理について
投稿者:mano
2019/02/22 23:53:22

削除パスワードを設定していなかったため修正も削除もできないため返信します。 前回の発言、一部間違っていました。ダウンロードしたのは再現テストの前、一番最初です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2156] Re:Modoki/0.2のリダイレクトの処理について
投稿者:mano
2019/02/22 23:30:27

レスが付かないまま1週間以上たってしまったため、自己レスします。 > さすがにどっかで化けているとしたらブラウザだと思うのですが 思い込みの罠にはまっています。というか傍から見ると自分でフラグ立てていますよ。 fidderをプロキシとしてブラウザとサーバの間に挟むと若干動きが変わりますが、パケット解析には問題ないです。 で、パケット解析をするとすぐわかりますが、ブラウザから[ http://localhost:8001/日本語 ]でアクセスすると、サーバからレスポンスコード301が返ってきており、そこで指定されている移動先URLが文字化けしています。 で、(サポートページから勝手にソースをダウンロードして)問題箇所を見ると、ServerThread.javaのpathの扱いが不注意なところがありました。 まず、25行目で、urldecodeプラスアルファ的なことをしていて、url文字列からPCで扱う文字列にしています。 その後、54行目で、移動先ページの組み立てで、PCで扱う文字列となっているpathを(url文字列形式にせずに)そのまま使っています。 urlデコードしてもしなくても変わらない文字列であれば問題が起きなかったのですが、今回はそのケースではないためエラーが見つかっちゃったんだと思います。 仮に56行目 [ + path + "/"; ]の部分を[ + "/%E6%97%A5%E6%9C%AC%E8%AA%9E/"; ]に書き換えれば意図通りにいっているように見えるんじゃないかな?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2155] Re:Modoki/0.2のリダイレクトの処理について
投稿者:Radec
2019/02/14 23:47:50

なるほど。。。 確かに自分で実装したTcpClientなら余計な補正は働きませんね。 動作確認できました。ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2154] Re:Modoki/0.2のリダイレクトの処理について
投稿者:mano
2019/02/13 20:17:34

最初からガッツリ調べなくても最初はfiddlerでいいんじゃない?appgoatの学習でも使っているツールだし。。。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2153] Re:Modoki/0.2のリダイレクトの処理について
投稿者:(ぱ)こと管理人
2019/02/13 02:39:34

ごぶさたしてます。 >なので、問題となった%E5,%9Eは、日本語をUnicode符合位置で求めた場合の >下位1バイト分に相当します。 あ、気付いていませんでしたが確かにそうですね。 だとしても、なぜ「日本語」の場合だけそうなるのは謎ですが…… 本件、Modoki/0.2はただソケットでデータを受け取るだけなので、 さすがにどっかで化けているとしたらブラウザだと思うのですが、 パケットフィルタリングもちょっと考えてみます。(今でもWiresharkで よかったんだっけ…?)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2152] Re:Modoki/0.2のリダイレクトの処理について
投稿者:(ぱ)こと管理人
2019/02/13 02:26:13

>過去の例にあったような「http://localhost:8001/../conf/httpd.conf」 >をブラウザで入力してデバッグすると、NoSuchFileExceptionが先に発生するような >動きをしてしまいました。 ブラウザは、こんなあからさまにディレクトリトラバーサルを起こしそうなURLを 素直にサーバに送らなければいけない義理もないでしょうから、 >「GET /conf/httpd.conf HTTP/1.1」となっていましたので、 というように(勝手に)変換しているのでしょう。 ただ、攻撃者はブラウザを使うとは限らないわけで、TcpClient.javaを使って client_send.txtに GET /../conf/httpd.conf HTTP/1.1 と書くと、 if (!realPath.startsWith(DOCUMENT_ROOT)) { 側の処理に流れ込むことが確認できます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2151] Re:Modoki/0.2のリダイレクトの処理について
投稿者:mano
2019/02/12 20:11:03

本を持っていないため、推測となってしまいますし、外しているかもしれませんが。。。 日本語のそれぞれの文字のUnicode符合位置は、[日]=U+65E5、[本]=U+672C、[語]=U+8A9Eです。 また、「,」は、Unicode符合位置がU+002Cです。 なので、問題となった%E5,%9Eは、日本語をUnicode符合位置で求めた場合の下位1バイト分に相当します。 この辺を手がかりに、パケットキャプチャすればどのタイミングまでは文字コードが意図通りとなっているかがのあたりがつくかもです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2150] Re:Modoki/0.2のリダイレクトの処理について
投稿者:Radec
2019/02/11 23:20:50

こんばんは。 早々にご確認・ご回答頂きまして、まことにありがとうございます。 当方でも様々な文字で確認してみましたが、やはり上手くいくときといかないときがあり、よくわからない結果となってしまいました。 ブラウザ等の仕様に起因するところもあるかと思うので厳密には分からないかとは思いますが、もともとの目的である動き・仕様は理解できたので先に進もうかと思います。 ちなみに、また別の質問となってしまい恐縮ですが、 Modoki/0.2で、ディレクトリトラバーサル攻撃を検知 → 404.htmlをリターンする、 即ち (!realPath.startsWith(DOCUMENT_ROOT)) を true にするには、 どのようなGETリクエストを飛ばすと実現できるものでしょうか? 過去の例にあったような「http://localhost:8001/../conf/httpd.conf」 をブラウザで入力してデバッグすると、NoSuchFileExceptionが先に発生するような動きをしてしまいました。 TcpServerを動かして、ブラウザに「http://localhost:8001/../conf/httpd.conf」 を入力して、GETリクエストを取得してみると、 「GET /conf/httpd.conf HTTP/1.1」となっていましたので、 サーバがGETリクエストを受け取った時には、pathが/conf/httpd.confとなっているようです。 そうすると、realPathは「C:\Apache24\htdocs\conf\httpd.conf」になるので、 確かに、NoSuchFileExceptionが発生することが自然な動きのようにも思えます。 以上、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2149] Re:Modoki/0.2のリダイレクトの処理について
投稿者:(ぱ)こと管理人
2019/02/11 19:53:57

はじめまして。ご質問いただきありがとうございます。 >入力URL 結果 >/test OK(test配下のindex.htmlが表示) >/test/  OK(test配下のindex.htmlが表示) >/日本語 NG(404.htmlも表示されずブラウザのエラー画面が表示) >/日本語/ OK(日本語配下のindex.htmlが表示) 私も試してみましたが、正直、わけがわからない結果となっています。 Firefox, Edgeでは、 /日本語 の場合だけ、リクエストラインが以下のようになっています。 GET /%E5,%9E/ HTTP/1.1 これをデコードしても該当のフォルダは存在しないので、私が試した範囲では、 404が返りました。 IEでは、1回だけ GET /%E6%97%A5%E6%9C%AC%E8%AA%9E HTTP/1.1 つまり正しくエンコードされた形でリクエストが投げられましたが、 以後何度試しても、そもそもリクエストが投げられず、ブラウザ側で 「このページを表示できません   Web アドレス http://localhost:8001 が正しいか確かめてください」 のエラーになっています。 奇妙なのは、Edge, Firefox, IEのどれにおいても、 http://localhost:8001/日本語/ http://localhost:8001/日本語.html http://localhost:8001/あいうえお http://localhost:8001/中国語 等はうまくいくのに、 http://localhost:8001/日本語 の場合だけ、 GET /%E5,%9E/ HTTP/1.1 になったり、リクエストが投げられなかったりしていることです。 SenderThread.javaの24行目に、以下のようにSystem.out.println()を挟んで確認しました。 while ((line = Util.readLine(input)) != null) { if (line.equals("")) break; System.out.println("line.." + line);
[この投稿を含むスレッドを表示] [この投稿を削除]
[2148] Modoki/0.2のリダイレクトの処理について
投稿者:Radec
2019/02/11 11:45:33

はじめまして。 「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」にて実装したModoki/0.2の挙動について質問となります。 Modoki/0.2では、'/'なしでディレクトリを指定するとリダイレクトさせる仕様となっております。 そのため、「C:\Apache24\htdocs\」の配下にテストディレクトリ「test」と「日本語」を作成し、それぞれのディレクトリ配下にindex.htmlを配置して動かしてみました。 実行結果は以下の通りです。(入力URLはhttp://~8001までは省略) 入力URL 結果 /test OK(test配下のindex.htmlが表示) /test/  OK(test配下のindex.htmlが表示) /日本語 NG(404.htmlも表示されずブラウザのエラー画面が表示) /日本語/ OK(日本語配下のindex.htmlが表示) ブラウザはIEでもFireFoxでも同じ結果でした。 デバッグモードで戻り値を確認してみましたが、MyURLDecoderは「/日本語」を返してくれていますし、realPathの取得時もNoSuchFileExceptionは発生していません。 このような差異が発生してしまう要因として考えられることはどのようなものでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2147] Re:サイト内のリンク切れ
投稿者:(ぱ)こと管理人
2019/01/01 20:21:16

>webサーバを作ってみようページの以下リンクが切れております。 ありえないほど遅くなりましたが、ご指摘ありがとうございます。 とはいえよそのページなので消えるときは消えますし、それについて私にできることは 特にないよなー、と思ったのですが、Wayback Machineの存在を思い出したので そちらに張りなおしておきました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2146] サイト内のリンク切れ
投稿者:榊原
2018/12/13 10:16:34

webサーバを作ってみようページの以下リンクが切れております。 http://ascii.asciimw.jp/books/support/4-7561-1663-9/supplement/0001/shttpd
[この投稿を含むスレッドを表示] [この投稿を削除]
[2145] Re:『Web開発入門』 Henacat ver0.1で掲示板を動かすについて
投稿者:rhino
2018/09/28 23:00:12

>p.84のリスト3-3で、POSTのHTTPリクエストのサンプルを掲載していますが、 >ここでcheck_nameという同一のパラメタが複数回登場しています。 >つまり、チェックボックスを複数選択すると、この状況が発生します。 >p.85の脚注にも書いたとおり、この仕様は使いにくいとは私も思うのですが。 > > テスト掲示板だけでなく、前の入力フォームにも対応できるよう書かれていたのですね。 サーブレットコンテナを作っているのだから、こういう場合も想定しなければならないのに、 どうも頭が固かったみたいです。 お答えいただき、ありがとうございました。 また何かありましたら、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2144] Re:『Web開発入門』 Henacat ver0.1で掲示板を動かすについて
投稿者:(ぱ)こと管理人
2018/09/28 00:51:13

>リスト3-17の21行目でif(paramterMap.containsKey(keyValue[0]))が >trueになるケースはどんな場合でしょうか?本文P119の中頃に、『同一のパラメタが >複数存在し得る』とあるのですが、このパラメタとはtittle, handle, messageのことですよね。 >1回のリクエストでこれらが複数になる場合というのがどうもよくわかりません。 p.84のリスト3-3で、POSTのHTTPリクエストのサンプルを掲載していますが、 ここでcheck_nameという同一のパラメタが複数回登場しています。 つまり、チェックボックスを複数選択すると、この状況が発生します。 p.85の脚注にも書いたとおり、この仕様は使いにくいとは私も思うのですが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2143] Re:『Web開発入門』 Henacat ver0.1で掲示板を動かすについて
投稿者:rhino
2018/09/27 00:53:01

ご回答いただき、ありがとうございます。 >(試していませんが)param.split("=", -1) とすればよいかと思います。 > 試してみたところ、これでうまくいきました。 投稿内容の取得については、教えていただいた流れを追っていき、やっとわかりました。 stringToMapメソッドについて、まだ理解できていない点があるのですが、 リスト3-17の21行目でif(paramterMap.containsKey(keyValue[0]))が trueになるケースはどんな場合でしょうか?本文P119の中頃に、『同一のパラメタが 複数存在し得る』とあるのですが、このパラメタとはtittle, handle, messageのことですよね。 1回のリクエストでこれらが複数になる場合というのがどうもよくわかりません。 教えていただければ幸いです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2142] Re:『Web開発入門』 Henacat ver0.1で掲示板を動かすについて
投稿者:(ぱ)こと管理人
2018/09/26 01:51:19

はじめまして。 >Henacat起動まではうまくできたのですが、掲示板のタイトル・ハンドル名 >・メッセージの内のどこかが >未入力のままで送信を押すと、リスト3-17のServletServiceの28行目で >java.lang.ArrayIndexOutOfBoundsExceptionが発生します。 >keyValue[0]に対するkeyValue[1]がない、ということだと思うんですが、 >これはどこかコードを写し間違えているでしょうか? このケースでは、ServletServiceの20行目の param.split("=") のところで、 split()メソッドの仕様上、「a=」という文字列をparam.split("=")のように split()すると、 ・戻り値の配列の要素数は2で、[0]には「a」が、[1]には空文字が入る のではなく、 ・戻り値の配列の要素数は1で、[0]にだけ「a」が入る という仕様になっているためですね。 https://docs.oracle.com/javase/jp/6/api/java/lang/String.html#split(java.lang.String) (試していませんが)param.split("=", -1) とすればよいかと思います。 Henacatはあくまでサンプル実装なので、こういうエラーケース的なものの 対処が甘いのはご容赦ください、と言いたいところですが、これはちょっと 実用上問題がありすぎるので、後ほど正誤表に上げさせていただきます。 ご指摘ありがとうございました。 >あと、このstringToMapメソッド内のparameterMapに過去の投稿内容も >保持しているという認識で合っているでしょうか? >しかし毎回メソッドが呼ばれるたびにnewしていては過去の内容は >保持できませんよね? parameterMapは毎回メソッドが呼ばれるたびにnewしていて、 1回のリクエストごとに使い捨てです。 リスト3-17 ServletService.javaの76行目で、 info.servlet.service(req, resp); としてサーブレットのservice()メソッドを呼んでいますが、 この呼び出しが、リスト3-26のHttpServlet.javaの13行目のservice()メソッドを 呼び出すことになり、この中で、メソッドがPOSTの場合は(サブクラスの)doPost() メソッドを呼んでいますから(19行目)、これはつまりリスト3-6のPostBBS.javaの doPost()メソッドを呼び出しています。 ここで、新たにMessageクラスのインスタンスをnewして、staticフィールドの messageListにメッセージをつないでいます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2141] 『Web開発入門』 Henacat ver0.1で掲示板を動かすについて
投稿者:rhino
2018/09/23 19:43:53

Henacat起動まではうまくできたのですが、掲示板のタイトル・ハンドル名・メッセージの内のどこかが 未入力のままで送信を押すと、リスト3-17のServletServiceの28行目でjava.lang.ArrayIndexOutOfBoundsExceptionが発生します。 keyValue[0]に対するkeyValue[1]がない、ということだと思うんですが、これはどこかコードを写し間違えているでしょうか? あと、このstringToMapメソッド内のparameterMapに過去の投稿内容も保持しているという認識で 合っているでしょうか?しかし毎回メソッドが呼ばれるたびにnewしていては過去の内容は保持できませんよね? 基本的なところかもしれませんが、どなたかわかる方、教えていただけますでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2140] Re:確かにJavaって嫌な言語だなぁ
投稿者:(ぱ)こと管理人
2018/09/20 02:14:51

>某社 F/W のレコードクラスは、Null値がセットされたメンバの値を get すると、 >長さ 0 の文字列を返す様にカスタマイズされています。その経緯は、過去の開発 >プロジェクトにおいて、ヌルポが氾濫していたのに対し、これを一気に黙らせる為 >の策が、そのまま生き残ったもの、と聞き及んでいます。 これは…… NullPointerExceptionは避けられるかもしれませんが、 アプリの要件として絶対に値を入れなければいけないところを空文字に してしまったら、バグの発覚が遅れるだけですよね。 (この手のことは、拙著「センス・オブ・プログラミング!」で 「バグのあるプログラムには生きる価値はない」として書かせていただきました) 要件として、デフォルト空文字列でよいところは、コンストラクタ等で 空文字列で初期化するのは正しいと思いますが。 >「レコードクラスの100倍肥大化」は、多分、若者の早合点と思っており、若者には >妙な言い訳をすることなく、真因を見極めるアプローチを怠って欲しくないと思い >ます(デバッグ鍛錬)。 早合点なら、それでよいのですけれど。実際にメモリをバカ食いしている以上、 どこかに何かの原因があるのかとは思いますが。 >「Java謎+落とし穴」から、Tiger となり、Java も随分進化したものと思いますが、 >貴殿がもし、同書の改定新版を上梓したとき、「謎+落とし穴」は果たして減って >いるのか増えているのかが、気になるところでございます、Hi。 JavaのGenericsはあれはあれで落とし穴が多いのですが、本1冊書くのは それはそれは大変なので、当面おとなしくしていたいと思います。Hi。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2139] Re:確かにJavaって嫌な言語だなぁ
投稿者:あら
2018/09/18 21:04:39

前橋様 お返事有難うございます。まさかお返事を頂けると思っておりませんでしたので、 ホントに嬉しい限りです。実にショボイ当方の職場のドキュメンタリーは二の次、 先ずは、熱心な貴殿の1ファンの応援メールと受けって頂ければ幸いです。 某社 F/W のレコードクラスは、Null値がセットされたメンバの値を get すると、 長さ 0 の文字列を返す様にカスタマイズされています。その経緯は、過去の開発 プロジェクトにおいて、ヌルポが氾濫していたのに対し、これを一気に黙らせる為 の策が、そのまま生き残ったもの、と聞き及んでいます。 つまり嫌なのは Javaの言語使用なのではなく、このアホダラ F/W で育ったプログ ラマーの資質の低下です。 穿った見方と思いますが、アセンブラや C言語で鍛えられたプログラマーは、設計、 仕様、要件をやらしても、モレや矛盾といったバグを仕込むことが少ないと思いま す。 「ユーザーをバカにするシステムは、良いシステム」という、妙な格言紛いよろし く、「プログラマーをバカにするプログラミング言語は、良い言語」では困りモノ です。考えなくて良くなる分、その代わりに、高品質、短納期、斬新なアイデアを O/P して欲しいものです。 「レコードクラスの100倍肥大化」は、多分、若者の早合点と思っており、若者には 妙な言い訳をすることなく、真因を見極めるアプローチを怠って欲しくないと思い ます(デバッグ鍛錬)。 「Java謎+落とし穴」から、Tiger となり、Java も随分進化したものと思いますが、 貴殿がもし、同書の改定新版を上梓したとき、「謎+落とし穴」は果たして減って いるのか増えているのかが、気になるところでございます、Hi。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2138] Re:確かにJavaって嫌な言語だなぁ
投稿者:(ぱ)こと管理人
2018/09/17 15:25:27

はじめまして。すっかり閑古鳥な掲示板ですが、投稿ありがとうございます。 >貴殿の「Java謎+落とし穴」は私の愛読書で、もう、10年以上も手許に置き、 >休日の午後など、思い出しては手に取って、ニヤニヤしている時間が好き >です。もう少し余裕ができたら、「 プログラミング言語を作る」を読み込 >んでみたいと思ってます(プログラミング工学の楽しい部分なのですが、 >私にはチとハードルが高い)。 ありがとうございます。「Java謎+落とし穴」は、さすがに今となっては 内容が古いのですが、Tiger以前の本としては良く書けた本であったと 自分でも自賛しております。 >このクラスのコンバート元である、いわゆるC言語の関数では、いわゆる >構造体のリストで、その構造体のサイズは80バイト、100万件でも 80MB、 >これにリスト形成に必要なオーバーヘッドを加えても、たかが知れてます。 100倍以上となると単に言語の違いとするには差が大きすぎますし、 Cだと1回のmalloc()で済むものがJavaだといくつものオブジェクトに なってしまうというのもありがちですが(たとえばCなら構造体に intの配列を埋め込んでいたところ、JavaだとArrayList<Integer>を 使ったりすると、あっさり100倍くらいにはなりそうな気がします)、 『某社標準の「フレームワーク」』が問題なのでしょうか。 ものを見ていないので何も言えませんけれども。 >これに対する、若者の回答が問題なのだ。 >  若者「Null Pointer Exceptionが怖くて、それはできません。」 NullPointerExceptionはバグがあるから起きるので、それ自体を避けたからといって 問題の解決にはなりませんよね(『某社標準の「フレームワーク」』を使うと、 どうNullPointerExceptionを避けられるのかはわかりませんが)。 >「メモリ馬鹿ばか食い」はともかく、「プログラマーの資質(≒誇り)」 >まで低下させる、嫌な言語だ、Java は。 とはいえ、それをJavaという言語のせいにするのもちょっと(Javaに対して)酷なような気が……
[この投稿を含むスレッドを表示] [この投稿を削除]
[2137] 確かにJavaって嫌な言語だなぁ
投稿者:あら
2018/09/15 15:57:37

貴殿の「Java謎+落とし穴」は私の愛読書で、もう、10年以上も手許に置き、 休日の午後など、思い出しては手に取って、ニヤニヤしている時間が好き です。もう少し余裕ができたら、「 プログラミング言語を作る」を読み込 んでみたいと思ってます(プログラミング工学の楽しい部分なのですが、 私にはチとハードルが高い)。 私は、Lattice C からの「C言語使い」です。K&Rにも随分お世話になりま した。現在、愛知県某社の某基幹システムのリニューアルで、これまで C言語で実装されていた UNIXサーバーの巨大システムを、Javaにコンバー トする仕事をしております。 仕事と言いましても、もはや定年までカウントダウンの身、第一線から引 き、「相談役」みたいな立場で食い繋がせて頂いております。 Javaプログラマとしての経験は浅いことを申し添えておきます。 昨日、若者から以下の様な相談をされました。   大量データ検証で、あるクラスのアウトプットが、List<データ型>   (ArrayList) で、100万件、消費メモリサイズが 10GB で、これでは   同時並行稼働すると、後続プロセスの JVMが起動することができなく   なる恐れがあります。 該当のサーバーは、今や当たり前の仮想モノで、JVM専用のヒープサイズ として約30GB割り当てられているのですが、これでは、多分2平行でも、 OutOfMemory となってしまうでしょう。何せ、解析ツールによると、 処理中に GC発生しまくりで、いわばメモリ確保とGCの追っかけっこ、 GCが追い付かない時の最大使用メモリが 20GBに達する、とのこと。 このクラスのコンバート元である、いわゆるC言語の関数では、いわゆる 構造体のリストで、その構造体のサイズは80バイト、100万件でも 80MB、 これにリスト形成に必要なオーバーヘッドを加えても、たかが知れてます。 このアウトプットの 10GB と 80MB の差という視点に絞ってサクッと考え ると、Java 側の <データ型> が、bean よりもさらに保安性、利便性?で ガチガチに固められた、某社標準の「フレームワーク」準拠のスーパーク ラスをスーパークラスに、このシステムオリジナルの利便性をプラスした もので、純粋なデータ部分のオーバーヘッドが酷いものと思われる。 これに対し、私は一言、「<データ型>を、せめて bean にしなさい。」と 伝えた。 これに対する、若者の回答が問題なのだ。   若者「Null Pointer Exceptionが怖くて、それはできません。」   私「…。」 「メモリ馬鹿ばか食い」はともかく、「プログラマーの資質(≒誇り)」 まで低下させる、嫌な言語だ、Java は。  「プログラマーの資質(≒誇り)」も、C言語と Java とは違う所に ある様なんですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2136] forget you!
投稿者:minmin
2018/09/13 09:28:24

ふぉげちゅうーてゃ? forget you!が語源かも。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2135] Re:プログラミング言語を作る読了報告
投稿者:(ぱ)こと管理人
2018/05/09 01:51:46

>P.280図8-4で、start_x,y,end_x,y,center_x,yと書いているのに、 >P.281図8-5や、P.282図8-6で、start..x,y,end..x,y,center..x,yと、書き変えて?いる。 ご指摘ありがとうございます。遅ればせながら確認しました。 確かに、アンダースコアであるべきところが「..」になっています。 執筆当時のオリジナル原稿を確認しましたがアンダースコアになっていたので (そりゃ間違えるにしてもこんな間違え方はしないでしょうし)、 書籍用に作図された方にうまく意図が通じなかった&私の確認不足、ということかと 思います。 後日、正誤表に載せさせていただきます。ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2134] プログラミング言語を作る読了報告
投稿者:mano
2018/05/06 22:45:01

理解度はどうあれ、世間でいうGWが終わったので私も読了です。今後しばらくはこの書籍についてはコメント(というか愚痴)はしません。お付き合いいただき、ありがとうございました。 とりあえず、ほとんどどうでもいいことですが、正誤表に上がっていないので1つ。 P.280図8-4で、start_x,y,end_x,y,center_x,yと書いているのに、 P.281図8-5や、P.282図8-6で、start..x,y,end..x,y,center..x,yと、書き変えて?いる。 それでは。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2133] Re:404 Not Foundが返ってこない
投稿者:nacho
2018/05/06 11:07:45

自己解決しました。 client_send.txtの最後の空行がエディタAtomによって勝手に削除されていたことが原因でした。 お騒がせしました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2132] 404 Not Foundが返ってこない
投稿者:nacho
2018/05/05 00:39:24

はじめまして。 現在「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」を勉強中です。 p.54ページのTcpClient.javaを使って存在しないファイルをリクエストするという部分で 404が返ってこず、408のタイムアウトが返ってきてしまいます。 存在するファイルをリクエストしても408が返ってきてしまいます。 これより前は全てうまくいっていたのですが、このタイムアウトはどのような原因が考えられるのでしょうか。 サーバはDocker上でApacheを使用しています。ブラウザだと想定どおりの動きです。 自分で解決することができず、投稿させて頂きました。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2130] Re:いろいろ愚痴りたい((プログラミング言語を作る3章~5章 )
投稿者:mano
2018/05/03 16:13:46

回答ありがとうございます。(1か月ぐらいした後に消そうと思っていて、正直回答を期待していなかったので少し驚きました。) >>p.153のダイナミックスコープの説明でnextから辿る場合、 >>仮に自身と呼び出し元に同じ変数名を定義し、自身内で変数を参照する場合、 >>先に呼び出し元の変数が検知されてしまうので、ダイナミックスコープの動きと >>違うのでは? > >最新のLocalEnvironmentを起点にnextをたどって変数を検索すると、 >先に検知されるのは呼び出し元ではなく自身の方なのでは……? >一応ver.0.2のeval.cのalloc_local_environmentを確認しましたが、 >新LocalEnvironmentのnextに、その時点でのトップのLocalEnvironmentを >連結していますし。 > >635: ret->next = inter->top_environment; >636: inter->top_environment = ret; > > うーん、コード読んでないのがバレました。(だって人が書いた長いコードをインタビューなしで読むのはしんどいもの。。。)で、nextの音の響きから、左から右、上から下、低層から高層(深層)の方向と想定してました。 だから、「最新のLocalEnvironmentのみから検索しますが、nextをたどって、呼び出し経路すべてのLocalEnvironmentから検索するようにすると、」の記述を、 「「最新のLocalEnvironmentのみから検索しますが、【トップレベルでの(グローバル変数に格納された)LocalEnviromnent型の変数を参照の後】nextをたどって、呼び出し経路すべてのLocalEnvironmentから検索するようにすると、」 と補って読んでいました。 なので、nextの本来の使い道はガベージ判定で、ダイナミックスコープ判定の用途でも使えることを言っているのかな?と類推していました。 ま、この部分の私の理解は大体間違っていましたね。 とりあえず、私の理解不足を棚上げしておいて、別の意味に捉えかねないnextの名前が悪い、っと愚痴っときます。(えぇ暴論ですとも。)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2129] Re:いろいろ愚痴りたい((プログラミング言語を作る3章~5章 )
投稿者:(ぱ)こと管理人
2018/05/02 16:46:30

>win_sjisのtest.crbだと、改行にCR(0x0d),LF(0x0a)が入れられていて、 >今使っている処理系(Microsoft Windows Subsystem for Linux上のubuntu) >では、0x0dを無視してくれず、改行コード\n(=0x0a)に到達する前に不正な文字で >引っかかっている、 なるほど、crowbar.lでは「\n」だけを改行扱いにしていますから、 UNIX環境下では0x0dは不正な文字として扱われますね。 もともと、Windows(かつてはDOS)にてCでテキストファイルを扱う際、 改行を\r\nとして扱わなければならないのでは既存のUNIXベースの ソースが軒並み壊滅するので、Windows/DOS環境下では、fopen()とか fgetc()とかの標準入出力ライブラリのレベルで、\r\nを\nに変換するという 対策を取っています(バイナリファイルを扱いたいときにはfopen()に "r"の代わりに"rb"を渡す)。「Microsoft Windows Subsystem for Linux上のubuntu」 ではこの動きにならないのは、WindowsではなくLinuxであるためでしょう。 >今の時代趣味でやる分にはsjisもeucも地雷じゃないかなあ? まあそのあたりは、2009年の本ですので(その当時でもちと古かったのかも しれませんが)。 >電卓の場合yyparse()で無限ループしているのに、crowbarではyyparse()以降の >処理に進んでいることは誰も疑問に思わないのかな、 電卓では入力が終わりませんからね。 >p.121 2個目のelse if文の中の処理、 > left_val.u.double_value=left_val.u.int_value; > eval_binary_double(...) >の部分で、left_val.typeは変えずに(INTのまま)格納する共用体にはdouble値を入れている。 >その後left_valはそのまま使わず、left_val.u.double_valueのみ使っているので >問題にはならいけど、読んでて不安になる。なぜdouble(専用のというか普通)の >型のローカル変数を使わないのかな? ちょっと当時の意図は思い出せませんが、左辺をdoubleに型変換した 感じを出したかったのかもしれません。確かに今見ると、ちょっと意図の よくわからないコードになっているとは思います。 >p.141の網掛けの以下の記述 > a={1,2,3}; > a={2,3,4}; >のあとの図で、aから出ている矢印が{4,5,6}を指している。 >{4,5,6}というのはどこから出てて来た?というか{2,3,4}はどこいった? >とか、 p.146ですね。誤植のようです。正誤表に載せておきます。 ご指摘ありがとうございました。 >p.145のビットフィールド。別にCのプロフェッショナルを目指す本ではないので、 >ビットフィールドなんて説明が必要な機能なんて使わずにしれっとCRB_Boolean >使ったり、そのままズバリintを使えばいいじゃない。 これにはたぶん段階のようなものがあって、 (1)unsigned long flagsみたいは変数にフラグを押し込んで、  自力でビット演算 (2)ビットフィールド (3)しれっとなんでもCRB_Boolean 当時、実用に供されているCのコードだと、(1)が多かったと思います(ひょっとすると 今でも)。それに比べれば進歩(?)だと思っておいてください。 (本にも「まあ、富豪的プログラミングの感覚からすれば、1ビットのフラグでも、 CRB_Boolean型ひとつ割り当てるべきなのかもしれませんけど。」と書いていますが) >p.153のダイナミックスコープの説明でnextから辿る場合、 >仮に自身と呼び出し元に同じ変数名を定義し、自身内で変数を参照する場合、 >先に呼び出し元の変数が検知されてしまうので、ダイナミックスコープの動きと >違うのでは? 最新のLocalEnvironmentを起点にnextをたどって変数を検索すると、 先に検知されるのは呼び出し元ではなく自身の方なのでは……? 一応ver.0.2のeval.cのalloc_local_environmentを確認しましたが、 新LocalEnvironmentのnextに、その時点でのトップのLocalEnvironmentを 連結していますし。 635: ret->next = inter->top_environment; 636: inter->top_environment = ret; >p.178 >mbstate_をmemset()等でゼロクリアというmbstate_ってどこから出てきた? 文脈からすると「mbstate_t」の誤りのようです。正誤表に載せておきます。 >って感じです。あと、5章UNICODEについては、組み文字以外にデータ内に入っている >(文字送り方向や字形の変更など)制御コードをどう扱っているのかも書いてあれば >ななあとも思いました。この辺って、例えば1文字のはずなのにデータは >100byteとか作れそうで、セキュリティホールになりやすい感じがするので、 >なぜ問題にならないかを聞きたかったかも。 この本のプログラムでは、「mbrtowc()を信頼する」というスタンスですかね……
[この投稿を含むスレッドを表示] [この投稿を削除]
[2128] いろいろ愚痴りたい((プログラミング言語を作る3章~5章 )
投稿者:mano
2018/04/30 19:02:25

ゴールデンウィークで読み終えられるかなと思っていたけど全然そうじゃなかった。 やっと、5章まで読み終わった。で、いろいろ愚痴りたい。(今回は投稿にパスワードをつけたので消す準備はバッチリです。) まずは、環境依存の問題 今週末は一人で0x0d問題にぶち当たり全然読み進められなかった。 test.crbを食わせても以下のメッセージしか出ない。 5:(0x0d)@ win_sjisのtest.crbだと、改行にCR(0x0d),LF(0x0a)が入れられていて、 今使っている処理系(Microsoft Windows Subsystem for Linux上のubuntu) では、0x0dを無視してくれず、改行コード\n(=0x0a)に到達する前に不正な文字で引っかかっている、がubuntuのターミナルは、SJISを解釈してくれず文字化けを起こす。結局が悪いのかがわからない。 今の時代趣味でやる分にはsjisもeucも地雷じゃないかなあ? で、読む気力がそがれたので、重箱の隅を突っ込みながら(またしても)表面をなぞる程度の読み込みになっちゃった。ちゃんと読めるのはいつのことになるんだか。。。 で、突っ込みはこんな感じ。 電卓の場合yyparse()で無限ループしているのに、crowbarではyyparse()以降の処理に進んでいることは誰も疑問に思わないのかな、 とか p.121 2個目のelse if文の中の処理、  left_val.u.double_value=left_val.u.int_value; eval_binary_double(...) の部分で、left_val.typeは変えずに(INTのまま)格納する共用体にはdouble値を入れている。 その後left_valはそのまま使わず、left_val.u.double_valueのみ使っているので問題にはならいけど、読んでて不安になる。なぜdouble(専用のというか普通)の型のローカル変数を使わないのかな? とか、 p.141の網掛けの以下の記述  a={1,2,3}; a={2,3,4}; のあとの図で、aから出ている矢印が{4,5,6}を指している。 {4,5,6}というのはどこから出てて来た?というか{2,3,4}はどこいった? とか、 p.145のビットフィールド。別にCのプロフェッショナルを目指す本ではないので、ビットフィールドなんて説明が必要な機能なんて使わずにしれっとCRB_Boolean使ったり、そのままズバリintを使えばいいじゃない。 とか、 p.153のダイナミックスコープの説明でnextから辿る場合、 仮に自身と呼び出し元に同じ変数名を定義し、自身内で変数を参照する場合、先に呼び出し元の変数が検知されてしまうので、ダイナミックスコープの動きと違うのでは? とか、 p.178 mbstate_をmemset()等でゼロクリアというmbstate_ってどこから出てきた? って感じです。あと、5章UNICODEについては、組み文字以外にデータ内に入っている(文字送り方向や字形の変更など) 制御コードをどう扱っているのかも書いてあればななあとも思いました。この辺って、例えば1文字のはずなのにデータは100byteとか作れそうで、セキュリティホールになりやすい感じがするので、なぜ問題にならないかを聞きたかったかも。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2127] Re:【質問】lexのトークン判断優先方法(プログラミング言語を作る3章質問その1)
投稿者:mano
2018/04/28 03:42:24

なるほど、わかりました。回答ありがとうございました。 P.39は、正規表現の話だけかと思って(読み返した時に何度も何度も)読み飛ばしていました。この箇所の記述にlexの動きについて書かれていたのですね。失礼しました。 私が誤解していたのは、最初に現れたトークン定義にマッチした場合に、以降のトークン定義を無視するんだろうなぁと思っていたことです。 なので、P.39に記述について+と++のトークンについては、lexの記述では当然に最初に++の定義があってその後に+の定義があるものと思い込んでいました。実際には+と++はマッチする長さが違うのだからlexの記述では、どちらを先に定義しても動きは変わらないのですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2126] Re:【質問】lexのトークン判断優先方法(プログラミング言語を作る3章質問その1)
投稿者:(ぱ)こと管理人
2018/04/28 00:08:37

>疑問に思ったのは「123.456」を「123」を整数型トークン、「.」を例外トークン、 >「456」の整数型トークンと判断する方法や、「1」,「2」「3」「.」「4」「5」「6」を >全て例外トークンとして扱うこともできそうな気がするのですが、そうならない >理由がわからないためです。 これは、lexがなぜ「123.456」を実数トークンとして解釈するのかがわからない、 ということでしょうか? lexは、「最長一致」でトークンを切り出します。つまり「123」や「1」よりも 「123.456」のほうが長いので、「123.456」は実数トークンとして解釈されます。 それについては本の中ではp.39の一番下の段落で説明しています。 >また、整数トークンと実数トークン、"if"トークンと[ \t]トークンの関係から >推測すると、例えば"for while other if"みたいな命令語もトークンとして >定義できそうですが、その場合に.lファイルでの定義行(ルール順番)によっては >動きが変わるものなのでしょうか? 同じところに書いてある通り、lexはまず「最長一致」でトークンを切り出そうとし、 長さが同じなら、より前の規則、つまり.lファイルでの定義行が上のほうである 規則を優先します。 >整数型の場合「....|"0"」と0をダブルクォーテーションで括っていますが、 >電卓のケースでP.36では、「(....|0|([0-9]....)」と0をダブルクォーテーションで >括っていません。この違いが上の判断条件に影響しているのでしょうか? これはどちらでも同じですね。なぜ片方だけダブルクォートで囲んだのかは、 すみませんがさすがに思い出せません……
[この投稿を含むスレッドを表示] [この投稿を削除]
[2125] 【質問】lexのトークン判断優先方法(プログラミング言語を作る3章質問その1)
投稿者:mano
2018/04/24 07:02:35

たびたびお邪魔します。 3章途中まで読み進めたのですが、わからないところがあったので教えてください。 P.102のcrowbar.lのソースで、59行目で整数型「([1-9][0-9]*)|"0"」、65行目で実数型「0-9]+\.[0-9]+」、78行目で例外「.」のトークンを切り分けているように見えます。 入力が、「123.456」だった場合、なぜ実数型のトークンと判断されるのでしょうか? 疑問に思ったのは「123.456」を「123」を整数型トークン、「.」を例外トークン、「456」の整数型トークンと判断する方法や、「1」,「2」「3」「.」「4」「5」「6」を全て例外トークンとして扱うこともできそうな気がするのですが、そうならない理由がわからないためです。 (済みません。書籍に記述があるのに私が読み飛ばしてしまっているだけかもしれません。) また、整数トークンと実数トークン、"if"トークンと[ \t]トークンの関係から推測すると、例えば"for while other if"みたいな命令語もトークンとして定義できそうですが、その場合に.lファイルでの定義行(ルール順番)によっては動きが変わるものなのでしょうか? 整数型の場合「....|"0"」と0をダブルクォーテーションで括っていますが、電卓のケースでP.36では、「(....|0|([0-9]....)」と0をダブルクォーテーションで括っていません。この違いが上の判断条件に影響しているのでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2124] ほげは方言
投稿者:ほげ
2018/04/17 23:29:09

「ほげ」を探すとここにたどりつきました。 「ほげ」は大分の方言で、くだらないこと、でたらめなことの意味です。 (特に臼杵地区、若い人は言わなくなった) 【応用】 ほげほっぽ  本当にデタラメな ほげんじょう くだらないことばっかり なお、「熊本弁」と書いていた「ほげる」は、穴があいてしまうこと、「ほぐ」は 穴をあけること であり、別に熊本に限らず、九州全体の共通語です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2123] Re:プログラミング言語を作る2章質問
投稿者:mano
2018/04/16 23:48:04

回答いただきありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2122] Re:プログラミング言語を作る2章質問
投稿者:(ぱ)こと管理人
2018/04/15 23:14:00

>はじめまして。 はじめまして。読んでいただきありがとうございます。 >1点目:P.56で、エラーリカバリの実現として、mycalc.yファイルの書き換えとして >lineのルールにerror CRの並びを追加しています。この通りにしてみたもののmycalcの >動きに変わりはありませんでした。で質問ですが、この修正で意図したエラーリカバリ >とは、本文直前の文の記述がある、「一度のコンパイルでできるだけ多くのエラーを >見つけることではないこと」を指しているのでしょうか?つまり何らかの作用により >yaccが出すメッセージを見やすくする対応のものでしょうか? この修正は、その直前の記述である「ただ、電卓の場合、対話的に使うものですから、 入力ミスで即座に死んでしまうのはユーザにとって不親切でしょう」という 問題に対する対応です。 >それとも、mycalc.lにもともと実装されている、エラー出力lexical error後の >exitを消しても、yyclearin;,yyerrok;の作用でError!Error!Error!の >エラー表示に陥らなくなることを指して、エラーリカバリと呼んでいるのでしょうか? よって、エラー時にexit()しなくなる、というのが目的です。 >2点目:P.74で、括弧対応の話で、私の環境ではmycalc.yの11行目、 >トークンの並びにLP,RPを追加しなくては動きませんでした。 >こちら11行目に追加することが、筆者の意図とした変更なのかよくわかっていません。 すみません、こちらはこれが私の意図した変更ですが、 p.74で「たったこれだけのことで~」と書いておきながら他の修正が要るというのは 問題ですね。正誤表に加えておきました。 ご指摘いただき、ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2121] プログラミング言語を作る2章質問
投稿者:mano
2018/04/14 22:40:48

はじめまして。 「プログラミング言語を作る」の2章まで読んだのですがわからない点が2点ありましたので教えてください。 1点目:P.56で、エラーリカバリの実現として、mycalc.yファイルの書き換えとしてlineのルールにerror CRの並びを追加しています。この通りにしてみたもののmycalcの動きに変わりはありませんでした。で質問ですが、この修正で意図したエラーリカバリとは、本文直前の文の記述がある、「一度のコンパイルでできるだけ多くのエラーを見つけることではないこと」を指しているのでしょうか?つまり何らかの作用によりyaccが出すメッセージを見やすくする対応のものでしょうか? それとも、mycalc.lにもともと実装されている、エラー出力lexical error後のexitを消しても、yyclearin;,yyerrok;の作用でError!Error!Error!のエラー表示に陥らなくなることを指して、エラーリカバリと呼んでいるのでしょうか? つづいて、パーサ自作のプログラムは読み飛ばして(=理解を断念して) 2点目:P.74で、括弧対応の話で、私の環境ではmycalc.yの11行目、トークンの並びにLP,RPを追加しなくては動きませんでした。こちら11行目に追加することが、筆者の意図とした変更なのかよくわかっていません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2120] Re:無題
投稿者:(ぱ)こと管理人
2018/04/14 15:36:56

>あっ、細かいツッコミに対応いただいてすみません...。 >...ついでにもう1つ。 >更新状況の2行目が「2013/3/13」になってます...。 「プログラミング言語を作る」へのリンクをコピペで流用しようとして 日付を直し忘れたようですね。修正しました。 こちらもご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2119] Re:無題
投稿者:ほげぴよ
2018/04/13 02:24:49

>修正しました。ご指摘ありがとうございました。 あっ、細かいツッコミに対応いただいてすみません...。 ...ついでにもう1つ。 更新状況の2行目が「2013/3/13」になってます...。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2118] Re:無題
投稿者:(ぱ)こと管理人
2018/04/10 23:11:50

>「はてなダイアリーをK.Maebashi's はてなブログに移行しました(20017/09/11)」 > >西暦2万年まではてなブログは存続できるのかな... 私は昔はてなダイアリーにこんなの書いたこともあるのですが。 http://d.hatena.ne.jp/kmaebashi/20100110/p1 今回は自分でやらかしてしまったようです。 修正しました。ご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2117] 無題
投稿者:ほげぴよ
2018/04/06 23:21:19

「はてなダイアリーをK.Maebashi's はてなブログに移行しました(20017/09/11)」 西暦2万年まではてなブログは存続できるのかな...
[この投稿を含むスレッドを表示] [この投稿を削除]
[2116] Re:無題
投稿者:(ぱ)こと管理人
2018/03/29 02:32:05

>if(line == NULL) は、if(*line == NULL) の間違えではないでしょうか? ご指摘ありがとうございます。確認しましたがその通りだと思います。申し訳ありません。 週末あたりに正誤表に入れておきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2115] 無題
投稿者:ポインタ完全制覇(第2版)の258ページ106行目if(line == NULL)
2018/03/27 22:15:49

ポインタ完全制覇(第2版)の258ページのread_line()の106行目 if(line == NULL) は、if(*line == NULL) の間違えではないでしょうか? *line = mallocでメモリ割り当てているので、*lineのチェックをするべきではないでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2114] Re:鬼車をダウンロードのURLはアクセスできない~
投稿者:(ぱ)こと管理人
2018/03/09 00:45:08

>掲題の件ですが、中国からアクセスすると、下記のエラーになりました。 ご指摘ありがとうございます。私のところからも同じエラーになるので、 中国関係なく、鬼車のWebページが消えていますね…… 今はGitHubに移転しているのでしょうか。後ほど(週末ぐらいに)注記を 入れておきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2113] 鬼車をダウンロードのURLはアクセスできない~
投稿者:土豆
2018/03/06 15:32:38

掲題の件ですが、中国からアクセスすると、下記のエラーになりました。 「ページを表示できません:申し訳ありませんが、アクセスされたページは現在ご利用いただけなくなっています。」
[この投稿を含むスレッドを表示] [この投稿を削除]
[2112] Re:P.124の補足について
投稿者:(ぱ)こと管理人
2018/03/06 01:02:25

>申し訳ありませんが、念のため確認させてください。 >下記の件の結論は、どうなったのでしたっけ? あれ、ここに書き忘れていたようです。 以下の通り正誤表に挙げてありました。 http://kmaebashi.com/webserver/seigo.html#p112
[この投稿を含むスレッドを表示] [この投稿を削除]
[2111] Re:P.124の補足について
投稿者:くまきち
2018/03/04 09:34:41

申し訳ありませんが、念のため確認させてください。 下記の件の結論は、どうなったのでしたっけ? スレッドに残っていないようだったので。 申し訳ありませんが、確認して頂けたらありがたいです。 >>P.124の補足に「GETのパラメタもPOSTのパラメタも、URLデコードしないまま・・・」とありますが、P112の52行目でGETのパラメタはURLデコードされているわけではないのでしょうか? > >すみません、もう記憶はあいまいなのですが、p.112の52行目におけるURLデコードは、 >UTF-8固定でデコードしているところからして、ディレクトリ名やファイル名を >デコードして正しくファイルを開くためのものです(Modoki/0.2で実装したものです)。 > >ここで、クエリストリング部分までデコードしてしまっていますが、 >クエリストリングはUTF-8でエンコードされているとは限らないので、 >これをこの時点でデコードしているのは単純に不具合のように思います。 >すみませんが確認しますので少しお時間をください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2110] Re:serialVersionUID について
投稿者:(ぱ)こと管理人
2018/02/26 01:28:16

>「//拡張子とContent-Typeの対応表」の部分について、P.70にあるリスト2-11では49行目に > > private static final long serialVersionUID = 1L; > >という行がありますが、A-22にはありません。 >これは、どのような違いがあってのことでしょうか?可能であれば、そもそも >「serialVersionUID 」とは何かも教えて頂けるとありがたいです! serialVersionUIDは、シリアライズするクラスのバージョンを示すためのものです。 Javaだとシリアライズ機能でオブジェクトの内容をファイルに保存したりできますが、 プログラム側のバージョンが上がってクラスにメンバが増えたりした(かつ、そのメンバの 値がデフォルト値ではいけなくて、readObject()によるカスタマイズでも対応しないとか 細かい条件はありますが)場合は、バージョンアップ前のプログラムで保存したデータは バージョン違いで読み込めないということになります。 serialVersionUIDは、シリアライズするときに、そのクラスのバージョンを 示すためのものです(バージョンが違うと、デシリアライズ時にエラーになります)。 指定しなくても構いませんが、これを指定しないと、Eclipseでは警告が出たりします。 「private static final long serialVersionUID = 1L;」と書いておけば 警告は抑止できますが、シリアライズを扱っているわけでもない入門書で 余計なコードを入れるのもよろしくないかと思い、本書のサンプルコードでは 基本これは書いていない――はずなのですが、リスト2-11では、Eclipseに うっかり自動生成されたのが残ってしまったのかと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2109] Re:リストA-19の ”if (ct == null)” について
投稿者:(ぱ)こと管理人
2018/02/26 01:09:23

>これは、”ct == null”の場合は、その値をparameterMapに含めないということでしょうか? >また、これはアップロードファイルなどが指定された場合に起こるものでしょうか? multipart/form-dataのPOSTメソッドでどのようなものが送られてくるのかについては、 p.87のリスト3-4に記載しています。 これを見ると、アップロードファイルが指定された場合に、Content-Typeが 付いていることがわかります。 そして、ファイルアップロードの場合、つまりContent-Typeがnullでない場合には、 その内容をgetParameter()で取得することはできないので、その値をparameterMapに 含めないようにしています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2108] serialVersionUID について
投稿者:くまきち
2018/02/25 22:24:30

『基礎からのWebアプリケーション開発入門』のP.280にあるリストA-22について質問させてください。 「//拡張子とContent-Typeの対応表」の部分について、P.70にあるリスト2-11では49行目に  private static final long serialVersionUID = 1L; という行がありますが、A-22にはありません。 これは、どのような違いがあってのことでしょうか?可能であれば、そもそも「serialVersionUID 」とは何かも教えて頂けるとありがたいです! よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2107] リストA-19の ”if (ct == null)” について
投稿者:くまきち
2018/02/24 22:54:22

『基礎からのWebアプリケーション開発入門』のP.277にあるリストA-19について質問させてください。 38行目に”if (ct == null) {”という行があります。 これは、”ct == null”の場合は、その値をparameterMapに含めないということでしょうか? また、これはアップロードファイルなどが指定された場合に起こるものでしょうか? どこかに書いてあるかもしれないですが、探しきれず質問させて頂きました。。 申し訳ありませんが、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2106] Re:リストA-13の ”~Impl” について
投稿者:(ぱ)こと管理人
2018/02/18 13:16:18

>せっかく抽象型を用意しているのであれば、ここは抽象型の変数定義にするのではと >思ったのですが、サブクラスの変数定義を使用している理由があれば、 >教えて頂きたいです。 これは私の流儀であって、Javaでの一般的な書き方かというとそうでもないかも しれませんが、私は、Javaでパッケージを分ける規模のプログラムを書くときは、 パッケージ単位でインタフェースと実装を分けるようにしています。 たとえばHttpServletRequestクラスであれば、インタフェースを com.kmaebashi.henacat.servletに、実装を com.kmaebashi.henacat.servletimplに置いています。 そして、HttpServletRequestの利用者(この場合はサーブレットのプログラムを書く人) にはインタフェース側だけをimportしてもらうようにします。Cookieのような 簡単なクラスを除き、インタフェース側のパッケージには実装は置きません。 こうすることで、利用者にとっては、インタフェース側のパッケージは ほぼAPIドキュメントのようなものになりますし、実装が「作りかけ」の 状態でも、利用者側のプログラムのコンパイルまではできるようになったりします。 公式のサーブレットAPI(javax.servlet)も、利用者には(Cookieのような 簡単なクラスを除き)ほぼインタフェースしか公開していないのは、 同じような考え方に基づくものだと私は思っています。 こういう観点でインタフェースと実装のパッケージを分けているわけですが、 そう考えたとき、実装側のパッケージ内でインタフェースの方の型で変数定義 することに、どれほどの意味があるでしょうか。 実装側のパッケージ内では、インタフェースとしては公開していないメソッドや、 publicではないフィールドを参照することもあり得ます。そのたびにダウンキャスト するぐらいなら、最初から実装側のクラスにしておくほうがマシではないかと思います。 servletimplという実装側のパッケージの内部で、むやみに実装隠蔽しようとしても あまり意味はないかと思います。Javaのアクセス制御が、publicもprivateも つけないデフォルト状態で、(C++やC#と違って)パッケージ内公開になっている、 というポリシーも、「パッケージ内での実装隠蔽はあまり意味がない」という 考えに基づくものではないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2105] リストA-13の ”~Impl” について
投稿者:くまきち
2018/02/18 09:44:47

『基礎からのWebアプリケーション開発入門』のP.267にあるリストA-13について質問させてください。 17行目や19行目の変数定義で”HttpSessionImpl”や”HttpServletResponseImpl”などスーパークラスではなくサブクラスの変数定義をしています。 せっかく抽象型を用意しているのであれば、ここは抽象型の変数定義にするのではと思ったのですが、サブクラスの変数定義を使用している理由があれば、教えて頂きたいです。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2104] Re:リストA-13について
投稿者:(ぱ)こと管理人
2018/02/03 22:12:52

>61行目について >誤:data[0] >正:data[i] ご指摘ありがとうございます。 確認しましたが、ご指摘の通りのバグですね。複数件のケースのテストを 怠っていたようです。 正誤表に載せておきます。ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2103] リストA-13について
投稿者:くまきち
2018/02/02 07:30:59

『基礎からのWebアプリケーション開発入門』のP.267にあるリストA-13について質問させてください。 ちゃんと理解できていないかもしれないですが、もしかすると下記の誤りではないでしょうか? 61行目について 誤:data[0] 正:data[i] ご確認、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2102] Re:第7章のTIPSについて
投稿者:くまきち
2018/01/23 23:36:21

確かに。。 >http://localhost:8080/generatecsv/test.html のように指定すればダウンロードできました。 お騒がせしました! >>ただ、CSVダウンロードだけは、まさに >>>C:\Tomcat8\webapps\generatecsv\test.html >>に置いていたのですがダウンロードできませんでした。。 >>HTTPから指定するのが正式だと思うので、とりあえず気にしないことにしました! > >念のため確認ですが、test.htmlをそこに置いたというのはよいとして、 >参照はどのようにしましたか? > >http://localhost:8080/generatecsv/test.html > >として参照すればダウンロードできると思うのですが、 >もし、HTMLファイルをダブルクリックして開いていたらできませんので、 >一応確認です…… >
[この投稿を含むスレッドを表示] [この投稿を削除]
[2101] Re:第7章のTIPSについて
投稿者:(ぱ)こと管理人
2018/01/18 00:41:05

>ただ、CSVダウンロードだけは、まさに >>C:\Tomcat8\webapps\generatecsv\test.html >に置いていたのですがダウンロードできませんでした。。 >HTTPから指定するのが正式だと思うので、とりあえず気にしないことにしました! 念のため確認ですが、test.htmlをそこに置いたというのはよいとして、 参照はどのようにしましたか? http://localhost:8080/generatecsv/test.html として参照すればダウンロードできると思うのですが、 もし、HTMLファイルをダブルクリックして開いていたらできませんので、 一応確認です……
[この投稿を含むスレッドを表示] [この投稿を削除]
[2100] Re:第7章のTIPSについて
投稿者:くまきち
2018/01/14 06:38:59

ご回答頂き、ありがとうございました。 ただ、CSVダウンロードだけは、まさに >C:\Tomcat8\webapps\generatecsv\test.html に置いていたのですがダウンロードできませんでした。。 HTTPから指定するのが正式だと思うので、とりあえず気にしないことにしました! >>>out.print((char)(ch & 0xffff)); >> >>"& 0xffff"は何をしているのでしょうか?不要な制御情報を削除するなどの >>用途があるのでしょうか? > >ここではint型のchをcharにキャストしているので、結果がcharの >範囲に収まるよう、0xffffとの&を取っています。 >まあ、この場合、直前のif文で負でない保証がされていますし、 >InputStreamReader#read()の戻り値なので、あまり気にする必要は >ないのかもしれませんが。 > >>P.241 リスト7-3 36行目 >>dataOutを多次元配列として定義している理由がよく分かりませんでした。 >>一次元配列でも参照型変数となるので、呼び出され側で値を詰めることができるように >>思います。 > >1次元配列を上位でnewして渡し、呼び出され側で値を詰めてもらう、 >ということはできますが、その場合、newするには呼び出し側でサイズが >わかっている必要があります。ここでは、呼び出し側ではサイズがわからないので、 >呼び出され側でnewした配列を参照型変数に格納して返すには、 >配列の配列(2次元配列)が必要になります。 > >>とありますが、例えばP.226の補足に記載されているような最新投稿を表示する >>ようなパーツが、 >>仮にテキストなどでは無く画像で最新記事を返す形式だったら、 >>XMLHttpRequestとか同一オリジンポリシーなど >>考えなくても良いということでしょうか? > >そうなりますね。(JSONPだってその意味では抜け穴ですが) >現状、例えば怪しいサイトのHTMLが社内イントラの画像をimgタグで抜き取ったとして、 >それを怪しいサーバに送ろうとするとHTML5のCanvasを使わなければならず(たぶん)、 >そちらでは別のオリジンから持ってきた画像はデータ化したりできないようにする等 >対策はされていると思いますけれども。 > >>P.248 注3 >>csvダウンロードできませんでした。リンクを、 >> >>><a href="/generatecsv/GenerateCSV">CSVダウンロード</a> > >HTMLファイルはどこに置きましたか? >ここでは、 >C:\Tomcat8\webapps\generatecsv\test.html >のような場所に置いてあることを想定しています。 > >実際にアプリケーションを開発する際も、HTMLなりJSPなりを >GenerateCSVと同じTomcatでホストしていれば、/generatecsv/GenerateCSVで >見えると思います。 > >>P.249 リスト7-8 5行目 >>下記が誤りのように思います。 >> 誤:"http://localhost/downloadtest/file.mp4; >> 正:"http://localhost/downloadtest/file.mp4"; > >申し訳ありません。これは間違いですね。 >正誤表に載せておきます。 >
[この投稿を含むスレッドを表示] [この投稿を削除]
[2099] Re:第7章のTIPSについて
投稿者:(ぱ)こと管理人
2018/01/11 00:14:06

>>out.print((char)(ch & 0xffff)); > >"& 0xffff"は何をしているのでしょうか?不要な制御情報を削除するなどの >用途があるのでしょうか? ここではint型のchをcharにキャストしているので、結果がcharの 範囲に収まるよう、0xffffとの&を取っています。 まあ、この場合、直前のif文で負でない保証がされていますし、 InputStreamReader#read()の戻り値なので、あまり気にする必要は ないのかもしれませんが。 >P.241 リスト7-3 36行目 >dataOutを多次元配列として定義している理由がよく分かりませんでした。 >一次元配列でも参照型変数となるので、呼び出され側で値を詰めることができるように >思います。 1次元配列を上位でnewして渡し、呼び出され側で値を詰めてもらう、 ということはできますが、その場合、newするには呼び出し側でサイズが わかっている必要があります。ここでは、呼び出し側ではサイズがわからないので、 呼び出され側でnewした配列を参照型変数に格納して返すには、 配列の配列(2次元配列)が必要になります。 >とありますが、例えばP.226の補足に記載されているような最新投稿を表示する >ようなパーツが、 >仮にテキストなどでは無く画像で最新記事を返す形式だったら、 >XMLHttpRequestとか同一オリジンポリシーなど >考えなくても良いということでしょうか? そうなりますね。(JSONPだってその意味では抜け穴ですが) 現状、例えば怪しいサイトのHTMLが社内イントラの画像をimgタグで抜き取ったとして、 それを怪しいサーバに送ろうとするとHTML5のCanvasを使わなければならず(たぶん)、 そちらでは別のオリジンから持ってきた画像はデータ化したりできないようにする等 対策はされていると思いますけれども。 >P.248 注3 >csvダウンロードできませんでした。リンクを、 > >><a href="/generatecsv/GenerateCSV">CSVダウンロード</a> HTMLファイルはどこに置きましたか? ここでは、 C:\Tomcat8\webapps\generatecsv\test.html のような場所に置いてあることを想定しています。 実際にアプリケーションを開発する際も、HTMLなりJSPなりを GenerateCSVと同じTomcatでホストしていれば、/generatecsv/GenerateCSVで 見えると思います。 >P.249 リスト7-8 5行目 >下記が誤りのように思います。 > 誤:"http://localhost/downloadtest/file.mp4; > 正:"http://localhost/downloadtest/file.mp4"; 申し訳ありません。これは間違いですね。 正誤表に載せておきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2098] 第7章のTIPSについて
投稿者:くまきち
2018/01/10 22:11:30

『基礎からのWebアプリケーション開発入門』のP.235からのTipsについて質問させてください。 P.238 リスト7-1 25行目 >out.print((char)(ch & 0xffff)); "& 0xffff"は何をしているのでしょうか?不要な制御情報を削除するなどの用途があるのでしょうか? P.241 リスト7-3 36行目 dataOutを多次元配列として定義している理由がよく分かりませんでした。 一次元配列でも参照型変数となるので、呼び出され側で値を詰めることができるように思います。 P.245 7.3 画像を動的に生成する ><img src="http://localhost:8080/generateimage/GenerateImage"/> ><image>タグは、それが記載されているHTMLとはまったく無関係のドメインからでも・・・」 とありますが、例えばP.226の補足に記載されているような最新投稿を表示するようなパーツが、 仮にテキストなどでは無く画像で最新記事を返す形式だったら、XMLHttpRequestとか同一オリジンポリシーなど 考えなくても良いということでしょうか? なんとなく、いろいろセキュリティ対策しているけど、抜け道はいろいろありそうな気がしてしまいます。 P.248 注3 csvダウンロードできませんでした。リンクを、 ><a href="/generatecsv/GenerateCSV">CSVダウンロード</a> とすると失敗しましたが、下記のようにすると成功しました(IE、Crome、Firefoxで実施)。 ><a href="http://localhost:8080/generatecsv/GenerateCSV">CSVダウンロード</a> P.249 リスト7-8 5行目 下記が誤りのように思います。  誤:"http://localhost/downloadtest/file.mp4;  正:"http://localhost/downloadtest/file.mp4";
[この投稿を含むスレッドを表示] [この投稿を削除]
[2097] Re:JSONPについて
投稿者:(ぱ)こと管理人
2018/01/06 21:26:56

>・P.226 補足 JSONP① >「JSONPの基本的な原理は ~ <script>タグによるJavaScriptの取得は >同一オリジンポリシーに縛られない」という記載があります。 >ここの意図は、「”外部ファイルからのJavaScript取得”は同一オリジンポリシーに >縛られない」で合っていますか? 合っています。外部ファイルからのJavaScript取得には<script>タグを 使うので、そのように書いています。(確かに、HTML中にJavaScriptを 書く時も<script>タグは使いますけれども) >・P.227 補足 JSONP② >「このようにして関数呼び出しを含むJavaScriptを取り込めば、その関数 >(上記で言えばcallbackFunc)が呼び出されます。」という部分で、 >具体的にcallbackFuncが実行されるタイミングがよく分かりませんでした。 JavaScriptの実行タイミングについてはp.218に書きましたが、 <script>タグで外部のJavaScriptを読み込んだ場合、その<script>タグのある 位置で実行されます。 JSONPの場合、その外部JavaScriptからcallbackFuncを呼び出すわけですから、 callbackFuncもそのタイミングで実行されます。 そのため、HTML上では、外部JavaScriptを読み込む<script>タグは、 callbackFuncの定義より後ろにある必要があります。 >網掛け部分にある「callbackFunc」には、なぜコールバック関数という >名前が付いているのでしょうか。webで調べたコールバック関数は >「他の関数に引数として渡す関数」というイメージなので、ここでこの名前 >(callbackFunc)を使う意図がシックリ来ませんでした。 コールバック関数というのは、その名の通り「呼び返される」関数です。 電話をかけて相手がいないときに「コールバックお願いします」と留守電に 残しておくのと同じように、後で別の人から「呼び返してもらう」関数のことを コールバック関数と呼びます。その手段のひとつして、関数を、 他の関数に引数として渡しておいて後で呼び返してもらう、という方法もあるわけです。 JSONPの場合、<script>タグで取り込んだ外部スクリプトから「呼び返してもらう」 関数なので、コールバック関数と呼んでいます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2096] JSONPについて
投稿者:くまきち
2018/01/05 21:33:49

立て続けに申し訳ございません。 『基礎からのWebアプリケーション開発入門』のP.226「補足 JSONP」について、3点質問させて頂きたいです。 ・P.226 補足 JSONP① 「JSONPの基本的な原理は ~ <script>タグによるJavaScriptの取得は同一オリジンポリシーに縛られない」という記載があります。 ここの意図は、「”外部ファイルからのJavaScript取得”は同一オリジンポリシーに縛られない」で合っていますか? 「<script>タグによるJavaScriptの取得」という言い方の理解が不安だった為、質問しました。 ・P.227 補足 JSONP② 「このようにして関数呼び出しを含むJavaScriptを取り込めば、その関数(上記で言えばcallbackFunc)が呼び出されます。」という部分で、 具体的にcallbackFuncが実行されるタイミングがよく分かりませんでした。 下記のように考えておけば良いのでしょうか? HTML────────────────────────┐ │ : │ │ <script src="外部サーバのURL"> │ │ : │ └─────────────────────────┘           + 外部サーバのURL(読み込まれる) ──────────┐ │JSONPの編集と下記のJavaScript生成 │  │・callbackFuncの定義(具体的な表示の編集) │ │・callbackFuncの実行(P.226の網掛け部分) │ └─────────────────────────┘           ↓ HTML────────────────────────┐ │ : │ │┌─────────────────────┐ │ ││・callbackFuncの定義(具体的な表示の編集)│ │ ││★callbackFuncの実行(P.226の網掛け部分) │ │ │└─────────────────────┘ │ │ : │ └─────────────────────────┘ ★が読み込まれたときにcallBackFuncが実行される。 ・P.226 補足 JSONP③ 網掛け部分にある「callbackFunc」には、なぜコールバック関数という名前が付いているのでしょうか。webで調べたコールバック関数は「他の関数に引数として渡す関数」というイメージなので、ここでこの名前(callbackFunc)を使う意図がシックリ来ませんでした。 以上、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2095] Re:同一オリジンポリシーについて
投稿者:くまきち
2018/01/05 21:19:47

なるほど、そういうことですね。 私は勝手に「社内イントラネットのPC=社内イントラネットのサーバ」と考えてしまっていました! 理解することが出来ました。いつも、ありがとうございます。 >>ご指摘のあった続き部分にある「JavaScriptでXMLHttpRequestを使って >>イントラネットの情報にアクセスし・・・」ですが、このときJavaScriptは >>社内イントラネットのPCにダウンロードされてきているものと思います。 > >そうです。 > >>XMLHttpRequestはサーバとの通信を行うものだと思うので、この場合には >>当てはまらないのではないかと思いました(通信の必要は無いのではないか)。 >>確かにJavaScriptのダウンロード元(怪しいページ)と通信先(イントラ)は >>同一オリジンポリシーに反するので、アクセスできないということは分かりましたが、 >>わざわざそのようなことをする事があるのかな?という所に疑問が残ります。 > >その、怪しいサイトからダウンロードしたJavaScriptが、 >XMLHttpRequestを使って社内イントラネットにアクセスして >情報を盗み出す、という危険があるわけです。 > >①昼休みに社員がPCから怪しいサイトにアクセス >②怪しいサイトから、社員のPCに、悪意を持ったJavaScriptがダウンロードされる >③悪意を持ったJavaScriptが、XMLHttpRequest等を使って社内イントラの > 情報にアクセスする。 >④悪意を持ったJavaScriptは、盗んだ情報を、XMLHttpRequestなりPOSTなりで > 怪しいサイトに送信する。 > >もちろんそのためには社内イントラネットの情報源のURLが >わからないといけませんが、それは普通機密情報とみなされないでしょうから >わかっているかもしれませんし、ありがちなグループウェアのURLを >しらみつぶしにするとかも考えられるのではないでしょうか。 > >
[この投稿を含むスレッドを表示] [この投稿を削除]
[2094] ファイル名のみで実行できました!
投稿者:huieders
2018/01/05 20:29:05

早速のご返答ありがとうございます。 Eclipseで作っていたのですが、WebAppというプロジェクトの中にjp.sampleパッケージを作り、そのパッケージの中に各javaとテキストを入れていました。 /WebApp/src/jp/sample/TcpClient.java という格好です。 >たとえばTcpServer.javaのプログラムをTcpServerという名前のプロジェクトで >作ったのだとすると、server_send.txtは > >C:\…\<ワークスペース>\TcpServer\server_send.txt > >という位置に配置する必要があります。 ご指摘のようにプロジェクト直下にテキストファイルを移動したところ、 ファイル名のみで実行でき、recvテキスト二つも作成できました。 パス省略時はどこを探すのかも知らず、お手数おかけし申し訳ございません。 丁寧に説明くださり、大変助かりました。 続きに取り組んでまいります。どうもありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2093] Re:リスト1-1,1-2の各txtのパスについて
投稿者:(ぱ)こと管理人
2018/01/05 15:59:13

はじめまして。 >書籍のとおりソースを書いて実行したところ FileNotFoundException となりました。 クラスファイルはどこにあって、どのように実行していますか? JavaのFileInputStreamでは、フルパスでなくファイル名だけ指定した時、 実行時のカレントディレクトリからファイルを探します。なので、 >TcpServer.java、TcpClient.java、server_send.text、client_send.txt >ファイルはすべて同じフォルダ内に作っています。 という状態で、コマンドプロンプトから C:\Users\誰それ\…\該当フォルダ> javac *.java のようにコンパイルして(するとその場に.classファイルができるはず) C:\Users\誰それ\…\該当フォルダ> java TcpServer と実行すれば、「C:\Users\誰それ\…\該当フォルダ」内のserver_send.txtを 開くことができるはずです。 コマンドプロンプトでコンパイル/実行しているのではなく、 たとえばEclipseで開発しているのだとすると、Eclipseで実行した際の カレントディレクトリはプロジェクトのディレクトリになるので、 たとえばTcpServer.javaのプログラムをTcpServerという名前のプロジェクトで 作ったのだとすると、server_send.txtは C:\…\<ワークスペース>\TcpServer\server_send.txt という位置に配置する必要があります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2092] リスト1-1,1-2の各txtのパスについて
投稿者:huieders
2018/01/04 22:23:56

はじめまして。初版 第1刷のp.15、p.16にあるTcpServer.javaとTcpClient.javaについて質問です。 FileOutputStream、FileInputStreamの引数を書籍のとおりファイル名のみにすると FileNotFoundException になってしまうのですが、なにか手順を飛ばしてしまっているのでしょうか? 【状況】 TcpServer.javaの7・8行目およびTcpClient.javaの7・8行目において、 引数が("server_send.txt")などになっている箇所がございますが、 書籍のとおりソースを書いて実行したところ FileNotFoundException となりました。 TcpServer.java、TcpClient.java、server_send.text、client_send.txtファイルはすべて同じフォルダ内に作っています。 【対処】 ソースの("○○.txt")の部分を、ファイル名だけではなく("C:\\Users\\(省略)\\client_send.txt")という風にパスまで含めたものに記述しなおしたところ、書籍の記載どおり   クライアントからの接続を待ちます。[ここで一旦停止]   クライアント接続   通信を終了しました の手順まで進めることができ、resvファイルもそれぞれ生成できました。 【質問】 書籍p.17の「サーバ側とクライアント側にそれぞれserver_send.txtとclient_send.txtを用意したうえで」とは具体的にどうすればよいのでしょうか? 「対処」で自分がやったようにソースコード上で毎回パスまですべて記述するというのは違和感があるのですが、書籍のようにファイル名のみの指定でうまく動作させる方法が分かりません。 どうかご教示いただけますと幸いですが、 本書で想定している対象読者のレベル以前の質問でしたら申し訳ございません。勉強しなおしてまいります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2091] Re:同一オリジンポリシーについて
投稿者:(ぱ)こと管理人
2018/01/04 15:47:13

>ご指摘のあった続き部分にある「JavaScriptでXMLHttpRequestを使って >イントラネットの情報にアクセスし・・・」ですが、このときJavaScriptは >社内イントラネットのPCにダウンロードされてきているものと思います。 そうです。 >XMLHttpRequestはサーバとの通信を行うものだと思うので、この場合には >当てはまらないのではないかと思いました(通信の必要は無いのではないか)。 >確かにJavaScriptのダウンロード元(怪しいページ)と通信先(イントラ)は >同一オリジンポリシーに反するので、アクセスできないということは分かりましたが、 >わざわざそのようなことをする事があるのかな?という所に疑問が残ります。 その、怪しいサイトからダウンロードしたJavaScriptが、 XMLHttpRequestを使って社内イントラネットにアクセスして 情報を盗み出す、という危険があるわけです。 ①昼休みに社員がPCから怪しいサイトにアクセス ②怪しいサイトから、社員のPCに、悪意を持ったJavaScriptがダウンロードされる ③悪意を持ったJavaScriptが、XMLHttpRequest等を使って社内イントラの  情報にアクセスする。 ④悪意を持ったJavaScriptは、盗んだ情報を、XMLHttpRequestなりPOSTなりで  怪しいサイトに送信する。 もちろんそのためには社内イントラネットの情報源のURLが わからないといけませんが、それは普通機密情報とみなされないでしょうから わかっているかもしれませんし、ありがちなグループウェアのURLを しらみつぶしにするとかも考えられるのではないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2090] Re:同一オリジンポリシーについて
投稿者:くまきち
2018/01/03 21:17:15

回答ありがとうございます。ですが、もう少しだけ分からないため、再質問させて下さい。 ご指摘のあった続き部分にある「JavaScriptでXMLHttpRequestを使ってイントラネットの情報にアクセスし・・・」ですが、このときJavaScriptは社内イントラネットのPCにダウンロードされてきているものと思います。XMLHttpRequestはサーバとの通信を行うものだと思うので、この場合には当てはまらないのではないかと思いました(通信の必要は無いのではないか)。 確かにJavaScriptのダウンロード元(怪しいページ)と通信先(イントラ)は同一オリジンポリシーに反するので、アクセスできないということは分かりましたが、わざわざそのようなことをする事があるのかな?という所に疑問が残ります。 正月早々、申し訳ありませんが、お時間があるときに回答頂けると助かりますww >>「会社で昼休みに・・・」という例が挙がっていますが、この場合、自分から >>怪しいwebページにアクセスしているので、javascriptのダウンロード元と >>通信先が同一になってしまうように思います。つまり、同一オリジンポリシーは >>満たしていると思われるため、この例の意図が分からず質問させて頂いたものです。 > >怪しいページについてはその通りですが、続きに以下のように書いています。 > >>怪しいページにて、JavaScriptでXMLHttpRequestを使ってイントラネットの >>情報にアクセスし、それをXMLHttpRequestなりフォームのPOSTなりで >>外部サーバに送信すれば情報が盗めてしまう、というのでは困ります。 > >つまり、この文脈で、同一オリジンポリシーにひっかかってアクセスできないのは、 >社内イントラネットの情報の方です。 >
[この投稿を含むスレッドを表示] [この投稿を削除]
[2089] Re:同一オリジンポリシーについて
投稿者:(ぱ)こと管理人
2018/01/03 10:13:49

>「会社で昼休みに・・・」という例が挙がっていますが、この場合、自分から >怪しいwebページにアクセスしているので、javascriptのダウンロード元と >通信先が同一になってしまうように思います。つまり、同一オリジンポリシーは >満たしていると思われるため、この例の意図が分からず質問させて頂いたものです。 怪しいページについてはその通りですが、続きに以下のように書いています。 >怪しいページにて、JavaScriptでXMLHttpRequestを使ってイントラネットの >情報にアクセスし、それをXMLHttpRequestなりフォームのPOSTなりで >外部サーバに送信すれば情報が盗めてしまう、というのでは困ります。 つまり、この文脈で、同一オリジンポリシーにひっかかってアクセスできないのは、 社内イントラネットの情報の方です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2088] 同一オリジンポリシーについて
投稿者:くまきち
2018/01/03 01:34:01

『基礎からのWebアプリケーション開発入門』のP.225にある同一オリジンポリシーについて、解説にある例が分からず質問させてください。 「会社で昼休みに・・・」という例が挙がっていますが、この場合、自分から怪しいwebページにアクセスしているので、javascriptのダウンロード元と通信先が同一になってしまうように思います。つまり、同一オリジンポリシーは満たしていると思われるため、この例の意図が分からず質問させて頂いたものです。 初歩的な質問かも知れませんが、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2087] Re:リスト6-11について
投稿者:(ぱ)こと管理人
2017/12/31 16:25:14

>51行目 >誤:<thead> >正:</thead> ご指摘ありがとうございます。ポカが多く申し訳ありません。 正誤表に追加しました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2086] リスト6-11について
投稿者:くまきち
2017/12/31 00:45:55

『基礎からのWebアプリケーション開発入門』のP.219にあるリスト6-11について、非常にささいではありますが誤植かなと思ったところがあったので、念の為、連絡しておきます。 51行目 誤:<thead> 正:</thead>
[この投稿を含むスレッドを表示] [この投稿を削除]
[2085] Re:6.5 認証 について
投稿者:(ぱ)こと管理人
2017/12/30 17:59:56

>P.199 >6.5節の認証はクライアント側の認証、6.4.1節②の認証はサーバ側の認証の話、 >という理解で合っていますでしょうか? まあそうですが、クライアント側、サーバ側というと意味が不明確かと。 ・6.5節の認証は、ログインしているユーザが正しいユーザであることを  確認するための認証 ・6.4.1節②の認証は、通信相手のサーバが正しいサーバであることを  確認するための認証 です。 >P.204 >レルムはパスワードファイル作成時(htdigest)にも指定し、「.htaccess」にも >指定しています。これらの整合性は、どのように扱われるのでしょうか? 同じものを2か所に書いているから整合性が心配だということだと思いますが、 p.204に「これはつまり、複数のレルムのユーザを、1つのパスワードファイルで 管理できることを意味しています」とあるように、レルムをキーに どの領域のユーザかを識別しているわけです(いかにも表示用の文字列を キーにするのが気持ち悪いというのは同意します)。 >P.205 >ncは何をカウントしているのでしょうか?同じノンスに対するレスポンスの >送信回数が2回以上という状況が想像できませんでした。 リプレイ攻撃の防止用です。通信経路が盗聴されている時、正当な利用者が 投げた認証情報とまったく同じ情報を攻撃者が投げると認証が通ってしまう、 という事態を防止するためのものです。 >P.208 >「フォーム認証では~SSL(TLS)を使用しなければ~」とありますが、 >tomcatのフォーム認証は暗号化されているのでしょうか?それとも別途、 >暗号化が必要なものなのでしょうか? リスト6-5のlogin.htmlを見ればわかるようにただのform要素なので、 暗号化はされません。別途TLSを使用する必要があります。 >P.211 >④の後のShowBBSを表示するリクエストとレスポンスで、JSESSIONIDの値が違いました。 >これは、なぜでしょうか?セッションIDの固定化(Session Fixation)攻撃と >関係あるのでしょうか。 関係あります。このページの説明がわかりやすいかと思います。 http://bakera.jp/glossary/%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E5%9B%BA%E5%AE%9A%E6%94%BB%E6%92%83
[この投稿を含むスレッドを表示] [この投稿を削除]
[2084] 6.5 認証 について
投稿者:くまきち
2017/12/29 23:49:01

『基礎からのWebアプリケーション開発入門』のP.199からの認証について何点か質問させてください。 P.199 6.5節の認証はクライアント側の認証、6.4.1節②の認証はサーバ側の認証の話、という理解で合っていますでしょうか? P.204 レルムはパスワードファイル作成時(htdigest)にも指定し、「.htaccess」にも指定しています。これらの整合性は、どのように扱われるのでしょうか? P.205 ncは何をカウントしているのでしょうか?同じノンスに対するレスポンスの送信回数が2回以上という状況が想像できませんでした。 P.208 「フォーム認証では~SSL(TLS)を使用しなければ~」とありますが、tomcatのフォーム認証は暗号化されているのでしょうか?それとも別途、暗号化が必要なものなのでしょうか? P.211 ④の後のShowBBSを表示するリクエストとレスポンスで、JSESSIONIDの値が違いました。これは、なぜでしょうか?セッションIDの固定化(Session Fixation)攻撃と関係あるのでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2083] Re:セッションの補足について
投稿者:(ぱ)こと管理人
2017/12/26 00:07:18

>①Webサーバがたくさんある場合 >「アプリケーションサーバソフトウェア(Tomcatなど)が再起動した場合には、 >セッションが失われてしまいます」とありますが、それはなぜでしょうか? >アプリケーションサーバソフトウェアを再起動すると、その上で動くサーブレットも >再起動となりセッションもクリアされるからでしょうか。その意味では、 >Webサーバがたくさんある場合とは直接関係ないものでしょうか? 確かに、Webサーバが1台でも「Webサーバが壊れたとか、アプリケーションサーバ ソフトウェア(Tomcatなど)が再起動した場合には、セッションが失われてしま」う ことに変わりはないですね。 意図としては、Webサーバがたくさんある場合、普通は「1台くらい壊れても 問題なく動作する」ことを期待して「冗長化」するのであって、にもかかわらず (そのサーバに接続していたユーザだけとはいえ)セッションが失われてしまうのでは Webサーバをたくさんにした意味がない、という趣旨で書いています。 >②セッションをCookie以外で実現する方法 >「URL Writing」の説明に「RefererなどでセッションIDが漏洩しやすい」とありますが、 >それはなぜでしょうか?CookieならばJavascriptから見えないようにすることが >できるからでしょうか? CookieならJavaScriptから見えないようにできるというのもありますが、 この文章での意図としては、書いてある通り「RefererなどでセッションIDが漏洩」すると いうことです。SNSなどで、悪意を持ったユーザが自サーバのURLを貼ったら、 そのサーバのアクセスログのRefererのところに、うっかりリンクを踏んだ人の セッションIDが普通に現れます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2082] セッションの補足について
投稿者:くまきち
2017/12/25 01:02:42

『基礎からのWebアプリケーション開発入門』のP.163、164の補足について質問させてください。 ①Webサーバがたくさんある場合 「アプリケーションサーバソフトウェア(Tomcatなど)が再起動した場合には、セッションが失われてしまいます」とありますが、それはなぜでしょうか? アプリケーションサーバソフトウェアを再起動すると、その上で動くサーブレットも再起動となりセッションもクリアされるからでしょうか。その意味では、Webサーバがたくさんある場合とは直接関係ないものでしょうか? ②セッションをCookie以外で実現する方法 「URL Writing」の説明に「RefererなどでセッションIDが漏洩しやすい」とありますが、それはなぜでしょうか?CookieならばJavascriptから見えないようにすることができるからでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2081] Re:【C言語ポインタ完全制覇】3-1-2 Cの宣言を解読する
投稿者:(ぱ)こと管理人
2017/12/23 23:26:00

>というわけで、プログラム出力は兎も角として、解説の文章では(第2版でも仰っている >ように)必要な冠詞を抜かさず英語としてまともな文章になさるほうが良いと、僕は >思います。 本来の英語としてはそうだろうと思います(intの前とかは微妙な気もしますが)。 本書内のは、まあ、説明用の英語もどきということでご理解ください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2080] Re:【C言語ポインタ完全制覇】3-1-2 Cの宣言を解読する
投稿者:knwifuru
2017/12/22 09:15:25

>># あ、本の中の英語の文章ですが、可算名詞に冠詞が抜けているものが少なからず >>ありました… > >これはK&Rのdclもそうなっているからいいだろう、ということで付けていません。 >第2版では、p.163に注の形で言い訳を入れました。 >(韓国語版では、訳者の方が足してくれたりしたようですが) ># この注で、「declでも付けていませんし」とあるのはdclの間違いですね… ># 後ほど正誤表に挙げます。 あ、本当だ! この件に関しては、第2版を確認せずに投稿しちゃってました… (^^; 確かに、K&$第二版日本語版のp149の、dcl『の実行結果』も、冠詞が抜けています。 原著第二版(1988)のp122ページの『実行出力』でも、ありませんね。 また、"Pointers on C" (Kenneth A. Reek, Addison Wesley(1988))のp355で 紹介されている、cdeclというプログラム https://cdecl.org/ https://github.com/ridiculousfish/cdecl-blocks 『の出力』でも、冠詞は省略しているみたいですね。 $ cdecl Type `help' or `?' for help cdecl> explain int(*f)(void); declare f as pointer to function (void) returning int しかし、これは、あくまでプログラム出力を簡潔にするためだと思います。 実際、"C - A Reference Manual (5ed.)"(Harbison & Steel, Prentice Hall (2002))の 4 Declarationsという章の最初のページ(p73)にも Declarations in C are difficult to describe for several reasons. First, they involve some unusual syntax that may be confusing to the novice. For example, the declaration int (*f) (volid); declares a pointer to a function taking no arguments and returning an integer. と、文章ではきちんと冠詞をつけていることからも、英語としては冠詞が必要である ことが明らかですし、K&R原著第二版で配列が最初に説明される 1.6 Arrays (p22)で でだって、本文文章では The declaration int ndigit[10]; declares ndigit to be an array of 10 integers. と書かれています。 というわけで、プログラム出力は兎も角として、解説の文章では(第2版でも仰っている ように)必要な冠詞を抜かさず英語としてまともな文章になさるほうが良いと、僕は 思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2079] Re:【C言語ポインタ完全制覇】3-1-2 Cの宣言を解読する
投稿者:(ぱ)こと管理人
2017/12/22 01:20:10

>結局、Cの宣言は、日本語的に考えるとダメで(識別子から遠い側の配列宣言[3]を先に解釈 >しないと正しくない)、英語で表現して考えないとダメだ、ということなんでしょうかね… そうです。 まあ、Cの宣言は英語圏でも「酷評を受ける」そうですが、 日本人にとってはさらにひとつハードルが増えますね。 ># あ、本の中の英語の文章ですが、可算名詞に冠詞が抜けているものが少なからず >ありました… これはK&Rのdclもそうなっているからいいだろう、ということで付けていません。 第2版では、p.163に注の形で言い訳を入れました。 (韓国語版では、訳者の方が足してくれたりしたようですが) # この注で、「declでも付けていませんし」とあるのはdclの間違いですね… # 後ほど正誤表に挙げます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2078] Re:【C言語ポインタ完全制覇】ポインタはどれだけ進む?
投稿者:(ぱ)こと管理人
2017/12/22 01:07:55

>コンパイラが密かに(いえ、きちんと被参照型のサイズを考えて)計算して正しい >値(アドレス)に置き換えてくれてる、ということなのですかね(でしょうね)? そういうことですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2077] 【C言語ポインタ完全制覇】3-1-2 Cの宣言を解読する
投稿者:knwifuru
2017/12/21 10:26:47

バカな質問ばかりして恐縮です。 第1版のp144に『②識別子に近い方から、優先順位に従って派生型(ポインタ、配列、関数)を解釈する。』とあります。 これでいくと、Table 3-1の3番目、 int hoge[10][3]; は、  「識別子"hoge"に一番近いのは、配列[10]。その次が配列[3]。最後に、int」 なので、  「要素数10個の配列が、3つ並んで(また配列を作って)いる。(基本型はint)」 となると思えるのですが、“日本語的表現”では  hoge は、intの配列(要素数3) の配列(要素数10) と、「要素数3の配列が10個並んでいる」という意味とされています。(Fig. 3-15でも同様) 結局、Cの宣言は、日本語的に考えるとダメで(識別子から遠い側の配列宣言[3]を先に解釈しないと正しくない)、英語で表現して考えないとダメだ、ということなんでしょうかね… (質問というか、ぼやき?) "'hoge' is an array (with 10 elements) of an array (with 3 elements) of int." # あ、本の中の英語の文章ですが、可算名詞に冠詞が抜けているものが少なからずありました…
[この投稿を含むスレッドを表示] [この投稿を削除]
[2076] Re:【C言語ポインタ完全制覇】ポインタはどれだけ進む?
投稿者:knwifuru
2017/12/21 09:00:12

>>この時、ip はポインタ(型の変数)ですよね? ですから、ip+2、すなわち、 >>ポインタ(型の変数の値)に2加算したポインタ『値』は、あくまで2しか増えて >>いないじゃない!、と僕は思ったわけです。 > >うーん、『「ポインタ型の値」は、実際にはメモリのアドレスのことです』と >p.43には書いてあるわけで、その意味では一貫していると思うのですが…… > >ip+1としたとき、それはもちろん配列の添字として考えれば1しか増えてないですし、 >引き算すれば1になりますが、図を描いて矢印が動く距離を見てみれば、 >「そのポインタが指す型のサイズ分だけ」動いている、と思うのですが。 僕の混乱の原因は、ここにありまして… List 1-4array2.c を、ちょっとだけ変更した次のもの #include <stdio.h> int main(void) { int array[5]; int *p; int *p0=&array[0], *p1=&array[1]; int i; /* 配列arrayに値を設定 */ for (i = 0; i < 5; i++) { array[i] = i; } /* その内容を表示 */ for (p = &array[0]; p != &array[5]; p++) { printf("%d %p\n", *p, p); } printf("p1-p0: %d, %p\n", p1-p0, p1-p0); return 0; } を走らせた結果は 0 0x7ffc25766960 1 0x7ffc25766964 2 0x7ffc25766968 3 0x7ffc2576696c 4 0x7ffc25766970 p1-p0: 1, 0x1 となり、『pには1しか足していないのに(p+=1としても当然同じ)、それを表示 させるとなぜ4ずつ増えている? どこにマジックがある?』という当惑です。 (1足した筈なのに、4増えちゃった? でも、p1とp0の差は、あくまで、1!) コンパイラが密かに(いえ、きちんと被参照型のサイズを考えて)計算して正しい 値(アドレス)に置き換えてくれてる、ということなのですかね(でしょうね)?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2075] Re:【C言語ポインタ完全制覇】ポインタはどれだけ進む?
投稿者:(ぱ)こと管理人
2017/12/21 00:59:23

>この時、ip はポインタ(型の変数)ですよね? ですから、ip+2、すなわち、 >ポインタ(型の変数の値)に2加算したポインタ『値』は、あくまで2しか増えて >いないじゃない!、と僕は思ったわけです。 うーん、『「ポインタ型の値」は、実際にはメモリのアドレスのことです』と p.43には書いてあるわけで、その意味では一貫していると思うのですが…… ip+1としたとき、それはもちろん配列の添字として考えれば1しか増えてないですし、 引き算すれば1になりますが、図を描いて矢印が動く距離を見てみれば、 「そのポインタが指す型のサイズ分だけ」動いている、と思うのですが。 >…というわけで、『ポインタ「の指し示すアドレス」が〇〇だけ進む』などという 『ポインタ「の指し示すアドレス」』だと、ポインタの指す先にあるアドレスが 増えるという意味にとられそうな気もしますけど、 まあ、「ポインタが〇〇だけ進む」と書くよりは、「ポインタが〇〇バイトだけ進む」と 単位を明示した方が、誤解を招かなかったかもしれませんね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2074] Re:WebApplicationクラス
投稿者:(ぱ)こと管理人
2017/12/21 00:51:27

>しかし、自然に考えると「WebAppCollection」クラスを分離して、「WebAppCollection」が >「WebApplication」のコレクションを保有する構造の方が分かりやすいのではないか、と >思ってしまいました。 この構造は、確かにわかりやすくてこれでもよいと思いますが、 >そこで、現在の「WebApplication」の構造にした背景みたいなものがあれば、 >聞いてみたいと思ったわけです。 現状こうなっているのは、「すべてのWebApplicaionのインスタンスが、 必ずwebAppCollectionに格納されていることを保証する」ためです。 コンストラクタがprivateにしてあるので、WebApplicationのインスタンスは WebApplication.createInstance()を呼ぶ以外に生成の方法がなく、 必ずwebAppCollectionに格納されていることが保証されます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2073] WebApplicationクラス
投稿者:くまきち
2017/12/20 23:40:08

『基礎からのWebアプリケーション開発入門』のP.114のリスト3-15にある「WebApplication」クラスについて、少し疑問があります。 書籍の本論とはズレた疑問ですが。。 「WebApplication」は自分自身のコレクション「WebAppCollection」を内部に持っています。 しかし、自然に考えると「WebAppCollection」クラスを分離して、「WebAppCollection」が「WebApplication」のコレクションを保有する構造の方が分かりやすいのではないか、と思ってしまいました。 (「Main」は「WebAppCollection」に「addWebApplication」を依頼する、みたいな) そこで、現在の「WebApplication」の構造にした背景みたいなものがあれば、聞いてみたいと思ったわけです。 このようなことを聞く理由は、次のような感じです。 書籍でHenacatを勉強していて、いろいろなクラスが登場し、それぞれの関係性を理解して、という作業を行ったのですが、なかなか難しいという感想を持ちました。 そう感じる理由はクラス間の関連(全体感)をつかめないからで、もしかするとUMLとかで整理したら分かりやすくなるのかな?と思って試してみました。 しかし、なかなか上手く表現できず「WebApplication」の構造が気になり始めた、という事が理由です。 いつもご迷惑をおかけしますが、よろしくお願いいたします!
[この投稿を含むスレッドを表示] [この投稿を削除]
[2072] Re:【C言語ポインタ完全制覇】ポインタはどれだけ進む?
投稿者:knwifuru
2017/12/20 08:08:58

>>2-3-2ポインタ型派生で(第1版p151、第2版p172)、「くどいようですが繰り返して >>おきます。ポインタに対して加算を行うと、そのポインタの指す型のサイズだけ、 >>ポインタが進むのでした。」とありますが、ポインタの指す型のサイズだけ進むのは、 >>(通常のポインタの実装では)【アドレス】であって、ポインタが進む大きさは、 >>ポインタに加算した量だけ、ではないでしょうか? > >この「ポインタが〇〇だけ進む」という表現は、第2版p.56の > >>ポインタって、要するにアドレスのことなんだろ? >>だったら、1足したら1進むに決まってるじゃないか! > >のところから一貫して「バイト数」を指しているつもりです。 (略) >そして、こういう説明が必要だと思ったからこそ、私はこの本を書いたわけです。 有難うございます。感謝しながら読ませて頂いております。 混乱してきました。あ、勿論、ポインタの指す先がどれだけ進むか?は、理解しているつもりです。 int i, iarray[10]; int *ip; ip = iarray で int が 4bytes である場合に、 *(ip+2); が、iarray の先頭アドレスから 4*2=8bytes を参照していることはわかっているつもりです。 この時、ip はポインタ(型の変数)ですよね? ですから、ip+2、すなわち、ポインタ(型の変数の値)に2加算したポインタ『値』は、あくまで2しか増えていないじゃない!、と僕は思ったわけです。そして、「ポインタが〇〇だけ進む」という表現は、『ポインタ「の値」が〇〇だけ進む』と読めました。その指す先は、勿論、8bytes 進んだ場所ですが… (ipとip+2の差はあくまで2ですが、ip+2がdereferenceする先とipがdereferenceする先の番地の差は、2*sizeof(int)、で、バイト数で考えて意味をもつのは、あくまでdereferenceする先では?) …というわけで、『ポインタ「の指し示すアドレス」が〇〇だけ進む』などという表現の方が、くどい文章になるけれど、誤解する僕のようなバカチンは減るのでは?と申したわけです。 細かくてすみません…
[この投稿を含むスレッドを表示] [この投稿を削除]
[2071] Re:【C言語ポインタ完全制覇】ポインタはどれだけ進む?
投稿者:knwifuru
2017/12/20 07:51:18

>>ついでに申せば、第1版のFig.3-3の「1加算するとここを指す」という説明も、 >>よくわかりません。どういう意味でしょうか?何に1加算すると? > >この図中にある「Tへのポインタ」に1加算すると、です。 あ、配列へのポインタの説明のFig.3-6と見比べて、わかりました。 これ、あるオブジェクトがぽつんとある図ではなく、メモリ空間内で図の上から下にアドレスが大きくなっていっていて、「Tへのポインタ」が「派生元の型T」のとある変数?の場所の手前を指していて、「Tへのポインタ」に「1加算するとここ(「派生元の型T」のとある変数?の場所の次)を指す」、という意味なのですね! 理解しました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2070] Re:【C言語ポインタ完全制覇】バイトオーダー、向き?
投稿者:knwifuru
2017/12/20 07:43:34

返信ありがとうございます。 endianについては、VAX/VMSやらPC98やらをいじっているその昔から(トシがばれる(^^;)苦労させられてきていて、中身はわかっているつもりですので、「何と逆なのか」を明示して頂ければ、僕はそれだけで充分です。(僕が細かすぎですかね?(笑)) >>第1版p135, 第2版p156の、byteorder.cの実行直後の文、『私の環境では「0x12345678」と >>いう値は、メモリ上に、逆向きに配置されているようですね。』とあるのですが、 >>何とは「逆向き」に、なのかがわかりません。何と逆向きなのでしょうか? > >「0x12345678」という16進の表記と逆向き、という意味で書いています。 (略) >「想定読者は過去の自分自身」という視点から逃れられないものなのかもしれません。 繰り返しになりますが、「何と逆か」が明確に示していただければ、「あぁ、それと逆なのね」と、読者の一人としては納得できます。「下位から上位に読んでいったら、全然逆じゃないじゃん!何と逆? うぅーん、わからん!」と考える、ひねくれた読者もおりますので(笑)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2069] Re:【C言語ポインタ完全制覇】ポインタはどれだけ進む?
投稿者:(ぱ)こと管理人
2017/12/20 00:26:09

>ついでに申せば、第1版のFig.3-3の「1加算するとここを指す」という説明も、 >よくわかりません。どういう意味でしょうか?何に1加算すると? この図中にある「Tへのポインタ」に1加算すると、です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2068] Re:【C言語ポインタ完全制覇】ポインタはどれだけ進む?
投稿者:(ぱ)こと管理人
2017/12/20 00:23:07

>2-3-2ポインタ型派生で(第1版p151、第2版p172)、「くどいようですが繰り返して >おきます。ポインタに対して加算を行うと、そのポインタの指す型のサイズだけ、 >ポインタが進むのでした。」とありますが、ポインタの指す型のサイズだけ進むのは、 >(通常のポインタの実装では)【アドレス】であって、ポインタが進む大きさは、 >ポインタに加算した量だけ、ではないでしょうか? この「ポインタが〇〇だけ進む」という表現は、第2版p.56の >ポインタって、要するにアドレスのことなんだろ? >だったら、1足したら1進むに決まってるじゃないか! のところから一貫して「バイト数」を指しているつもりです。 私だって普通にポインタ演算(まあめったに使いませんが)でintの配列の 次の要素を指す時には、「4バイト先」なんてことを意識したりはしませんが、 この本では、「そのポインタの指す型のサイズだけ、ポインタが進む」ということを 強く意識しないと、たとえばp.195の 「ポインタにi加算することは、そのポインタが指す型のサイズ×iだけ、 ポインタを進めることを意味する。hogeの指す先の型は「intの配列(要 素数5)」であるから、hoge + iでは、sizeof(int[5]) * iだけ進む。」 という説明が意味不明になってしまうのではないでしょうか。 そして、こういう説明が必要だと思ったからこそ、私はこの本を書いたわけです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2067] Re:【C言語ポインタ完全制覇】バイトオーダー、向き?
投稿者:(ぱ)こと管理人
2017/12/20 00:13:05

>第1版p135, 第2版p156の、byteorder.cの実行直後の文、『私の環境では「0x12345678」と >いう値は、メモリ上に、逆向きに配置されているようですね。』とあるのですが、 >何とは「逆向き」に、なのかがわかりません。何と逆向きなのでしょうか? 「0x12345678」という16進の表記と逆向き、という意味で書いています。 >(ぱ)さんの環境(little endian)で、78->56->34->12と表示されている、 >というのは、下の位から上の位にメモリアドレスが増えていっているので、 >僕には、逆ではなく【順に】に思えるのです。 うーん、主観の問題とは思いますが、どうなんでしょう。 「下の位を先にメモリに格納する」というのは、コンピュータの事情としては わかるケースもありますが、通常、人間は、数字を印刷・表示した状態の順序で 意識しているのではないでしょうか。過去、この話を新人君やお客様にしたことは 何度かありますが、私の経験した範囲では、「へー、逆なんだ」という反応でした。 ポインタ完全制覇の初版が出てから17年、この点で違和感を表明したのは knwifuruさんが最初です(もちろん、表明しなかっただけで、違和感を感じていた人は いたのかもしれません)。 >しかし、もともと、endianというのは、「卵の尖った側(小さい側)から(先に)食べるか、 >丸い側(大きい側)から食べるか」=「bit/byte列のlower bits側が先に(lower addressに) >置かれるか、higher bitsが先に置かれるか」という事のようなので、 >数字を印刷・表示した時・読んだ時に先に・早く出てくるかどうか?で議論をすると、 >混乱すると思うのですが、いかがでしょうか? まあこれはendianを知らない人向けの説明なので、「もともとendianというのは~」で 説明してもあまり意味はなく、「数字を印刷・表示した時・読んだ時」の順と 逆になっていることから、「そんなこともあるんだ、へー」と思ってもらえば よいかと思っています。 「へー、逆なんだ」と思わない人は、knwifuruさんの他にもいるのかもしれませんし、 実のところどっちが多数派なのかもわかりませんが、本の書き手としては、 「想定読者は過去の自分自身」という視点から逃れられないものなのかもしれません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2066] Re:info.servlet.serviceについて
投稿者:くまきち
2017/12/19 23:31:05

ありがとうございます、納得しました! >>HenacatでRunnableをimplementsしているのはServerThreadだけだと思いますが、 >>もしかしてマルチスレッドの各スレッドから呼び出されるクラスは、ルールの適用無しでも >>(結果として)マルチスレッドで動くという事なのでしょうか? > >もちろん、マルチスレッドの各スレッドから呼び出されるメソッドは >呼び出し元のスレッドで動きますから、マルチスレッドで動きます。 >(クラスとかインスタンスは、この際関係ないですね) >
[この投稿を含むスレッドを表示] [この投稿を削除]
[2065] Re:info.servlet.serviceについて
投稿者:(ぱ)こと管理人
2017/12/19 23:08:47

>HenacatでRunnableをimplementsしているのはServerThreadだけだと思いますが、 >もしかしてマルチスレッドの各スレッドから呼び出されるクラスは、ルールの適用無しでも >(結果として)マルチスレッドで動くという事なのでしょうか? もちろん、マルチスレッドの各スレッドから呼び出されるメソッドは 呼び出し元のスレッドで動きますから、マルチスレッドで動きます。 (クラスとかインスタンスは、この際関係ないですね)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2064] Re:【C言語ポインタ完全制覇】ポインタはどれだけ進む?
投稿者:knwifuru
2017/12/19 23:07:31

ついでに申せば、第1版のFig.3-3の「1加算するとここを指す」という説明も、よくわかりません。どういう意味でしょうか?何に1加算すると? >2-3-2ポインタ型派生で(第1版p151、第2版p172)、「くどいようですが繰り返しておきます。ポインタに対して加算を行うと、そのポインタの指す型のサイズだけ、ポインタが進むのでした。」とありますが、ポインタの指す型のサイズだけ進むのは、(通常のポインタの実装では)【アドレス】であって、ポインタが進む大きさは、ポインタに加算した量だけ、ではないでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2063] Re:info.servlet.serviceについて
投稿者:くまきち
2017/12/19 21:37:28

なるほど、了解です!ありがとうございます。 ですが、もう少し分からないことがあります。 マルチスレッドで動くとなると、クラスがRunnableをimplementsして...のような ルールが必要なのかと思っていたのですが、HttpServletは、そのようになっていません。 HenacatでRunnableをimplementsしているのはServerThreadだけだと思いますが、 もしかしてマルチスレッドの各スレッドから呼び出されるクラスは、ルールの適用無しでも (結果として)マルチスレッドで動くという事なのでしょうか? 入門書を読め!という話なのかも知れませんが、どうぞ宜しくお願いします。 >>分からないのは「info.servlet」がnullでなければ、同じインスタンスが >>使いまわされるのに、並行して複数個所から使いまわされていいんだっけ? >>ということです。 > >p.92の補足にも書きましたが、サーブレットのインスタンスはひとつだけ生成され、 >すべてのリクエストで共有されます。 >よって、インスタンスフィールドを使えば、複数のスレッド間で競合が起きる >可能性がありますし、(補足にも書いたように)リクエスト単位やユーザ単位で >持つべき情報をサーブレットのインスタンスフィールドで保持してはいけません。 > >ただし、ローカル変数はスレッドごとに存在するので、ローカル変数(メソッドの >引数含む)だけを使っている限り、同じインスタンスのメソッドを複数のスレッドで >呼び出すことは問題ありません。 >
[この投稿を含むスレッドを表示] [この投稿を削除]
[2062] 【C言語ポインタ完全制覇】ポインタはどれだけ進む?
投稿者:knwifuru
2017/12/19 08:28:55

2-3-2ポインタ型派生で(第1版p151、第2版p172)、「くどいようですが繰り返しておきます。ポインタに対して加算を行うと、そのポインタの指す型のサイズだけ、ポインタが進むのでした。」とありますが、ポインタの指す型のサイズだけ進むのは、(通常のポインタの実装では)【アドレス】であって、ポインタが進む大きさは、ポインタに加算した量だけ、ではないでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2061] 【C言語ポインタ完全制覇】バイトオーダー、向き?
投稿者:knwifuru
2017/12/19 08:23:16

第1版p135, 第2版p156の、byteorder.cの実行直後の文、『私の環境では「0x12345678」という値は、メモリ上に、逆向きに配置されているようですね。』とあるのですが、何とは「逆向き」に、なのかがわかりません。何と逆向きなのでしょうか? (ぱ)さんの環境(little endian)で、78->56->34->12と表示されている、というのは、下の位から上の位にメモリアドレスが増えていっているので、僕には、逆ではなく【順に】に思えるのです。 数字の左から右(読む向き)とは【逆】という事でしょうか? 確かに、それとは逆ではありますが… しかし、もともと、endianというのは、「卵の尖った側(小さい側)から(先に)食べるか、丸い側(大きい側)から食べるか」=「bit/byte列のlower bits側が先に(lower addressに)置かれるか、higher bitsが先に置かれるか」という事のようなので、数字を印刷・表示した時・読んだ時に先に・早く出てくるかどうか?で議論をすると、混乱すると思うのですが、いかがでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2060] Re:info.servlet.serviceについて
投稿者:(ぱ)こと管理人
2017/12/18 23:55:58

>分からないのは「info.servlet」がnullでなければ、同じインスタンスが >使いまわされるのに、並行して複数個所から使いまわされていいんだっけ? >ということです。 p.92の補足にも書きましたが、サーブレットのインスタンスはひとつだけ生成され、 すべてのリクエストで共有されます。 よって、インスタンスフィールドを使えば、複数のスレッド間で競合が起きる 可能性がありますし、(補足にも書いたように)リクエスト単位やユーザ単位で 持つべき情報をサーブレットのインスタンスフィールドで保持してはいけません。 ただし、ローカル変数はスレッドごとに存在するので、ローカル変数(メソッドの 引数含む)だけを使っている限り、同じインスタンスのメソッドを複数のスレッドで 呼び出すことは問題ありません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2059] info.servlet.serviceについて
投稿者:くまきち
2017/12/18 22:54:13

いつもお世話になっております。おかげさまで安心して読み進めることが出来ます。 『基礎からのWebアプリケーション開発入門』のP.116のリスト3-17の76行目に info.servlet.service(req,resp); という行があります。 この「info.servlet」はnullであれば53行目でインスタンスを作っています。 また「info.servlet」はWebapplicationのメンバーなので、当然、複数箇所から並行して呼ばれることがあるのではないかと思います。 分からないのは「info.servlet」がnullでなければ、同じインスタンスが使いまわされるのに、並行して複数個所から使いまわされていいんだっけ?ということです。 これは、マルチスレッド的な何か仕掛けがあって、このような作りになっているのでしょうか? 初心者で分からないことが多く、ご迷惑をおかけします。もしかして、ものすごく曖昧な質問なのかも知れませんが、よろしければお教えください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2058] Re:C言語ポインタ完全制覇 第1版 4-2-1 可変長配列の配列についての質問
投稿者:884
2017/12/18 14:23:31

ご回答ありがとうございました。理解できました。 こんなにレスポンスが早く、直接、著者より回答がいただけるのは、非常にありがたいです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2057] Re:ポインタ制覇誤植2-3-2冒頭(still in the 2nd ed.)
投稿者:knwifuru
2017/12/17 22:22:15

>>「C言語ポインタ制覇」2-3-2冒頭、『式の中では「関数へのポインタ」に読み替えられる』は >>『読み替えられる』ではないでしょうか? > >間違っている方の記述は「読み替えらえる」ですね。正誤表に入れさせていただきました。 指摘も間違えていて恥かきました(^^; すみません。 また気づいた点がありましたらお知らせいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2056] Re:セッションCookie
投稿者:くまきち
2017/12/17 22:05:21

自己解決しました。 P.166の最終段落「さて、」以降に記載されている部分のことですね。 お騒がせしました。 >『基礎からのWebアプリケーション開発入門』のP.171のリスト5-4の後に、 >「セッションCookieにPath属性が...」との記載があります。 >これは、「CookieにPath属性が...」と見ればいいでしょうか? >それとも、どこかで「セッションCookie」が定義されていたでしょうか? > >誤植のような気もするし、私が失念しただけのような気もするし、曖昧で申し訳ないですが、 >質問させて頂きました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2055] Re:セッションCookie
投稿者:(ぱ)こと管理人
2017/12/17 21:59:06

>『基礎からのWebアプリケーション開発入門』のP.171のリスト5-4の後に、 >「セッションCookieにPath属性が...」との記載があります。 ちょっと遠くてわかりにくかったかもしれませんが、 ここの「セッションCookieにPath 属性が付いていたことからもわかるように、」 という文章は、p.167冒頭のTomcatのセッションCookieにPath属性が付いていたことを 意味しています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2054] Re:ポインタ制覇誤植2-3-2冒頭(still in the 2nd ed.)
投稿者:(ぱ)こと管理人
2017/12/17 15:34:04

>「C言語ポインタ制覇」2-3-2冒頭、『式の中では「関数へのポインタ」に読み替えられる』は >『読み替えられる』ではないでしょうか? 間違っている方の記述は「読み替えらえる」ですね。正誤表に入れさせていただきました。 >第一版で前々から気付いていたのですが、お知らせせずに置いたところ、先日出版された >ことに気づいて慌てて?購入した第二版でもそのままになっているようです。 第1版の方の正誤表にも後ほど記載いたします(第1版では、第2版を書いているうちに 気付いたり査読者にご指摘いただいた箇所がミスがやはり何か所かありまして、 そのうち正誤表に載せようと思ったまま延び延びになってしまっておりました)。 >こういう連絡は、こちらにするので良いのでしょうか? 「密かに別のところに >知らせてくれ」ということであれば、そちらに連絡差し上げますが… こちらでお願いします。また何かありましたらよろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2053] ポインタ制覇誤植2-3-2冒頭(still in the 2nd ed.)
投稿者:knwifuru
2017/12/17 11:58:12

「C言語ポインタ制覇」2-3-2冒頭、『式の中では「関数へのポインタ」に読み替えられる』は『読み替えられる』ではないでしょうか? 第一版で前々から気付いていたのですが、お知らせせずに置いたところ、先日出版されたことに気づいて慌てて?購入した第二版でもそのままになっているようです。 こういう連絡は、こちらにするので良いのでしょうか? 「密かに別のところに知らせてくれ」ということであれば、そちらに連絡差し上げますが…
[この投稿を含むスレッドを表示] [この投稿を削除]
[2052] セッションCookie
投稿者:くまきち
2017/12/16 16:32:15

『基礎からのWebアプリケーション開発入門』のP.171のリスト5-4の後に、 「セッションCookieにPath属性が...」との記載があります。 これは、「CookieにPath属性が...」と見ればいいでしょうか? それとも、どこかで「セッションCookie」が定義されていたでしょうか? 誤植のような気もするし、私が失念しただけのような気もするし、曖昧で申し訳ないですが、 質問させて頂きました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2051] Re:synchronizedについて
投稿者:(ぱ)こと管理人
2017/12/16 00:12:38

>これはラストアクセス時刻を設定するだけのメソッドだと思いますが、 >なぜsynchronizedにする必要があるのでしょうか? ここで設定するthis.lastAccessedTimeはlong型ですが、 Javaではlong型については、代入自体、atomicであることが保証されていません。 https://www.jpcert.or.jp/java-rules/vna05-j.html (intとかは良さそうなのですが、あまりそれに依存したコードは私は 書きたくないところです) >正直、多少ズレても誰にも迷惑をかけないように思ったので質問してみました。 atomicでないということは、時刻が多少ずれるということだけでなく、 「結果がどうなるかわからない」ということだと思います。 (上記ページで引用されているJLSの記述を読むと、32ビット単位で 異なる値が混じる、ということしか起こらないようにも読めますが……)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2050] synchronizedについて
投稿者:くまきち
2017/12/14 23:47:43

『基礎からのWebアプリケーション開発入門』のP.168のリスト5-3の40行目に synchronized void access() という行があります。 これはラストアクセス時刻を設定するだけのメソッドだと思いますが、なぜsynchronizedにする必要があるのでしょうか? 正直、多少ズレても誰にも迷惑をかけないように思ったので質問してみました。 よろしかったら回答頂けると、ありがたいです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2049] Re:『センス・オブ・プログラミング!』の正誤について
投稿者:藤四郎
2017/12/13 19:42:15

お手数おかけしました。ご対応ありがとうございました。 これでこの本も一読者として安心して意味内容に集中して読み返すことができます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2048] Re:C言語ポインタ完全制覇 第1版 4-2-1 可変長配列の配列についての質問
投稿者:(ぱ)こと管理人
2017/12/13 01:51:10

>標準入出力は、テキストファイルと同じように、ファイルポインタで指定して、 >ファイルのように扱ことができる。という理解でよいでしょうか。 そういうことですね。 キーボードのような入力デバイスも、画面のような出力デバイスも、 なんでもファイルとして扱えるようにしてしまえ、というのは もともとUNIXのアイディアで、たとえばWikipediaでUNIXを引くと 「概説」の項に以下のように書いてあります。 >各種の周辺装置やある種のプロセス間通信 (IPC) をファイルとして扱う事 ここで、「各種の周辺装置」はキーボードを含みます。 このUNIXのアイディアをMS-DOSが模倣し、Windowsでもそのまま使えるように なっているわけです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2047] Re:addCookieについて
投稿者:(ぱ)こと管理人
2017/12/13 01:47:40

>name=COUNTERのCookieが増えないように、どこで制御しているのでしょうか? >単純に見落としているだけかも知れないのですが、宜しかったら教えて頂きたいです! 結論から言えば、制御していません。Tomcatも同じです。 https://twitter.com/kmaebashi/status/549803263734718464 このTweetにも書いたように、何の役に立つのかはさっぱりわかりませんが、 Tomcatもそうなっているならまあいいかとそうしています。 もちろん、HttpServletResponseはリクエストの度に作り直されますし、 CookieTest.javaは1回のリクエストで1回しかaddCookie()を呼んでいないので、 同じ名前のCookieが増えることはありません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2046] Re:flush()について
投稿者:(ぱ)こと管理人
2017/12/13 01:39:52

>すごく基本的な質問かもしれないですが、たとえば「メモリ上にだけ持っていて >ディスクに書き出していないデータがあるかもしれないのでflush」という >イメージは分かるのですが、このサンプルの場合はメモリ上のデータの >やり取りだけなので、flushを何のために行っているのか分かりませんでした。 このサンプルの場合はメモリ上のデータのやり取りだけですが、 それは、Henacatが手抜きのためにレスポンスボディをいったんすべて メモリに乗せているからであり、これでは、巨大なレスポンスを返す際には メモリが無駄になります。場合によっては、レスポンスデータを作りながら どんどんクライアントに返してしまいたいケースもあるでしょう。 その場合、クライアントへのデータの返却を始めてしまったら、 もうレスポンスヘッダの変更はできませんから、途中でエラーが起きても ステータスとして500とかを返すことはできず、200 OKを返すことになって しまいますが、それでもいいからクライアントへのデータ返却を始めてしまいたい、 というニーズはあり得ます。それに対応するために、サーブレットAPIでは 「コミット」という概念を導入しています(p.119)。 http://mergedoc.osdn.jp/tomcat-servletapi-5-ja/javax/servlet/ServletResponse.html#getWriter() その場合、HttpServletResponseのgetWriter()で得られるPrintWriterは、 バッファリングする方がよいでしょう。相手はネットワークだからです。 このように、このPrintWriterはバッファリングする(ようになる)可能性もあるため、 ここではflush()しています。 いずれにしても、バッファリングするしないはPrintWriterの実装詳細に 属することでしょうから、flush()する方が堅実なコーディングではないかと 思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2045] Re:『センス・オブ・プログラミング!』の正誤について
投稿者:(ぱ)こと管理人
2017/12/13 00:19:10

>さて、またご面倒をおかけしますが、以下についてそちらの正誤表への追加を >ご検討お願いいたします。年末のお忙しい時期におそれいりますが、またご都 >合のよろしいときにでもご対応いただければ幸いです。 またまたたくさんご指摘ありがとうございます。 ポカが多く申し訳ありません。 遅くなりましたが、対応させていただきました。 >後入れ先出し Last In First Out >先入れ後出し First In Last Out これはまあ、日本語と英語で順序を合わせなければならないというわけでも ないでしょうから、このままとさせてください。 >> 27人集れば、誕生日が衝突する確率は50%を超えます。 私は、どういうわけか27人だと思い込んでいたようですが、 どこからその数字をおぼえたのか、まったく思い出せません… >p.192 l.2 >> O(1/2N^2) > >これは誤りとまではいえないとは思いますが、一応、より細かいことをいえば >(N-1) + (N-2) + ... + 1 = N(N-1)/2 >かと。 (つまり、無視するのは定数の係数だけでなく第二項以降も。) 正しくは1/2 N^2(つまり(N^2)/2)ではなくN(N-1)/2ですが、 さすがにN^2とN(N-1)は丸めてしまって問題ない差だと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2044] addCookieについて
投稿者:くまきち
2017/12/11 22:04:17

『基礎からのWebアプリケーション開発入門』のP.144のリスト4-4の33行目に response.addCookie(newCookie); という行があります。 この分は配列の最後に要素を追加するということなので、nameがCOUNTERの要素(Cookie)が既にある場合も最後に追加するように見えてしまいます。 Tomcatがうまい具合にやっているのかも知れませんが、Henacat版を見ても、やはりCOUNTER要素が増えていくように見えます。 name=COUNTERのCookieが増えないように、どこで制御しているのでしょうか?単純に見落としているだけかも知れないのですが、宜しかったら教えて頂きたいです!
[この投稿を含むスレッドを表示] [この投稿を削除]
[2043] Re:C言語ポインタ完全制覇 第1版 4-2-1 可変長配列の配列についての質問
投稿者:884
2017/12/11 17:14:06

>これで回答になっておりますでしょうか?  おかしな質問をしてすみません。 標準入出力とファイルの関係が理解できていませんでした。 そもそも、stdinは、FILEへのポインタ型なんですね。 標準入出力は、テキストファイルと同じように、ファイルポインタで指定して、 ファイルのように扱ことができる。という理解でよいでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2042] flush()について
投稿者:くまきち
2017/12/10 11:29:01

『基礎からのWebアプリケーション開発入門』のP.116のリスト3-17の80行目に resp.printWriter.flush() という行があります。 すごく基本的な質問かもしれないですが、たとえば「メモリ上にだけ持っていてディスクに書き出していないデータがあるかもしれないのでflush」というイメージは分かるのですが、このサンプルの場合はメモリ上のデータのやり取りだけなので、flushを何のために行っているのか分かりませんでした。 宜しければ、ここでflush()を使用している意図を教えて頂きたいです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2041] Re:C言語ポインタ完全制覇 第1版 4-2-1 可変長配列の配列についての質問
投稿者:(ぱ)こと管理人
2017/12/09 22:06:21

>ここで、このプログラムにおいて、キーボードからの入力(stdin)は、 >void read_slogan(FILE *fp, char **slogan)側で、ファイル(FILE *fp)として、 >認識されるのでしょうか。 すみません、何が質問なのかよくわかりませんが、 リダイレクトでファイルが読み込める、という挙動についてであれば、 read_slogan < slogan.txt というのは、read_sloganの標準入力をslogan.txtというファイルからの入力に 切り替えるという意味です。 標準入力(stdin: standard input)は、デフォルトでキーボードなのですが、 それをファイルからの入力に切り替えているので、 void read_slogan(FILE *fp, char **slogan)側では、fpからslogan.txtの 内容を読むことができます。 これで回答になっておりますでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2040] Re:setCookieについて
投稿者:(ぱ)こと管理人
2017/12/09 21:37:53

>『基礎からのWebアプリケーション開発入門』のP.142の1行目に >「もし、Cookieを複数送りたかったら...」とあります。 >しかし、リスト4-3の29行目からのsetCookieは値を上書きしているように見えます。 >掲示板の動作には影響無いと思いますが、誤植ではないでしょうか? この掲示板の投稿画面のHTMLソースを開いてJavaScriptを見ていただくと、 以下のようになっています。 function set_cookie(key, val) { document.cookie = key + "=" + escape(val) + "; expires=Wed, 01-Jan-2031 00:00:00 GMT;"; } function set_cookies() { set_cookie("name", document.mainForm.name.value); set_cookie("url", document.mainForm.url.value); set_cookie("password", document.mainForm.password.value); } 同様のset_cookieの実装で、複数のCookieを設定することができています。 確かに、代入文を見るとどう見ても上書きに見えるので、妙な仕様だと思いますが、 たとえば以下のMozillaのサンプルでも https://developer.mozilla.org/ja/docs/Web/API/Document/cookie 以下のようにあります。 document.cookie = "name=oeschger"; document.cookie = "favorite_food=tripe"; alert(document.cookie); // displays: name=oeschger;favorite_food=tripe
[この投稿を含むスレッドを表示] [この投稿を削除]
[2039] 『センス・オブ・プログラミング!』の正誤について
投稿者:藤四郎
2017/12/07 22:52:50

『センス・オブ・プログラミング!―抽象的に考えること・データ構造を理解す ること』(第1刷) こちらも大変興味深く楽しく拝読しました。コンパクトな本に「低レベル」か ら「高レベル」までのしくみの解説やノウハウで盛りだくさんで、これらの内 容を血肉化できれば自分にもアプリ開発は夢ではないと思いましたので、これ からも何度も読み返すでしょう。 さて、またご面倒をおかけしますが、以下についてそちらの正誤表への追加を ご検討お願いいたします。年末のお忙しい時期におそれいりますが、またご都 合のよろしいときにでもご対応いただければ幸いです。 p.94 本文 l.4 > 逆行していています p.109 l.1 > 脳内になる p.142 l.17 > Congraturations Congratulations p.149 l.4 > なけばならなくなってしまう。 p.177 4-3-9 スタック > 先入れ後出し方式(LIFO--Last In First Out) 後入れ先出し Last In First Out 先入れ後出し First In Last Out どちらも同じ事柄をさしているとは思いますが、念のためエラッタの候補としてあげます。 p.180 下から 9 行目 > 追加すべき要素 「検索すべき要素」だと思います。 p.183 > 27人集れば、誕生日が衝突する確率は50%を超えます。 https://ja.wikipedia.org/wiki/%E8%AA%95%E7%94%9F%E6%97%A5%E3%81%AE%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9 によれば 23 人とのことです。ちなみに、手元の計算でも $ awk 'BEGIN { p1 = 1; p2 = 0; n = 1; > while (p2 <= 0.5) { ++n; p1 *= (365 - n + 1) / 365; p2 = 1 - p1 } > print n, p2 }' 23 0.507297 となりました。 p.192 l.2 > O(1/2N^2) これは誤りとまではいえないとは思いますが、一応、より細かいことをいえば (N-1) + (N-2) + ... + 1 = N(N-1)/2 かと。 (つまり、無視するのは定数の係数だけでなく第二項以降も。) p.226 注 l.4 > sturct p.250 リスト6-1 l.5 > 多重度が0..* p.246 の記述からして「多重度が1..*」が適切と思います。 p.272 図6-16 > 行かページを 「行がページを」だと思います。 同図 > 表示対象範囲に部分的に含まれる段落 「ページをまたがる段落」だと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2038] Re:『Java 謎』3.3 寄り道 - Cで継承を実現してみる
投稿者:藤四郎
2017/12/07 22:30:08

ご返信ありがとうございます。 >確かに動きますが、ポインタのキャストはやはり荒業なので、 >可能であれば避けるべきかとは思います。 一歩間違えると、領域破壊や原因究明困難なバグにつながるのでしょうね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2037] setCookieについて
投稿者:くまきち
2017/12/07 22:26:27

『基礎からのWebアプリケーション開発入門』のP.142の1行目に「もし、Cookieを複数送りたかったら...」とあります。しかし、リスト4-3の29行目からのsetCookieは値を上書きしているように見えます。掲示板の動作には影響無いと思いますが、誤植ではないでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2036] Re:C言語ポインタ完全制覇 第1版 4-2-1 可変長配列の配列についての質問
投稿者:884
2017/12/07 14:08:14

早速の&ご丁寧なご回答ありがとうございます。 サンプルプログラムの内容が理解できました。 OSは、Windows7です。 統合開発環境 VS 2015のVisualC++ Win32コンソールアプリケーションでプロジェクトを作成し、サンプルプログラムの動作確認をしています。 >stdinはキーボードからの入力なので、たとえばコマンドプロンプトで動かしているのならそのままそこでキーボードから打ち込んでも入力できますし、 キーボードからの入力を、7回行ったら、入力した文字が画面に表示されました。 VS 2015のコンソール画面で、slogan.txt(標語ファイル名)をキーボード入力するとファイルが読込まれると勘違いして、ファイル名を入力をしていました。 >たとえば実行形式名がread_slogan.exeで標語ファイルがslogan.txtなら >read_slogan < slogan.txt >のようにリダイレクトで読み込ませる方法もあります。 コマンドプロンプト上で、VS 2015で生成されたread_slogan.exeに、slogan.txt(標語ファイル名)をリダイレクトで読み込ませて、表示することができました。 ここで、このプログラムにおいて、キーボードからの入力(stdin)は、void read_slogan(FILE *fp, char **slogan)側で、ファイル(FILE *fp)として、認識されるのでしょうか。 度々、申し訳ありませんが、ご教示お願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2035] Re:C言語ポインタ完全制覇 第1版 4-2-1 可変長配列の配列についての質問
投稿者:(ぱ)こと管理人
2017/12/07 01:22:42

はじめまして。 >read_slogan(stdin, slogan); > >のstdinは、キーボードの入力と考えていますが、何を入力すればよいでしょうか。 >1週間分の標語ファイル(.txt)を読み込ませたいのですが、うまくいきません。 stdinはキーボードからの入力なので、たとえばコマンドプロンプトで動かしているのなら そのままそこでキーボードから打ち込んでも入力できますし、 たとえば実行形式名がread_slogan.exeで標語ファイルがslogan.txtなら read_slogan < slogan.txt のようにリダイレクトで読み込ませる方法もあります。 実行しているOSが何かわかりませんが、リダイレクトはWindowsでもMacOSでも Linuxでも使えるので、ぐぐってみてはいかがでしょうか。 たとえばWindowsなら、今探しましたが、以下のようなページがあります。 https://www.adminweb.jp/command/redirect/index4.html
[この投稿を含むスレッドを表示] [この投稿を削除]
[2034] Re:</form>について
投稿者:(ぱ)こと管理人
2017/12/07 01:16:56

>『基礎からのWebアプリケーション開発入門』のP.140にあるリスト4-3について。 >59行目にある</form>は誤植でしょうか? >些細な内容かと思いますが、念の為。 > >仮に誤植だとすると、P.100にあるリスト3-9の37行目も同様かも知れません。 ご指摘ありがとうございます。 formを二重に閉じてしまっていますね。正誤表に上げさせていただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2033] Re:『Java 謎』3.3 寄り道 - Cで継承を実現してみる
投稿者:(ぱ)こと管理人
2017/12/07 01:11:57

>また、『C 言語ポインタ完全制覇』改訂版の発売おめでとうございます。 ありがとうございます。 >>MethodTableIndexは利用者に晒す必要はないので、Shape.hに移動するのは >>よろしくないかと思います。 > >そうしますと、自分自身とサブクラスに公開する "ShapeP.h" にではいかがで >しょう。 サブクラスは各メソッドのインデックスを知る必要はあるでしょうから、 ShapeP.hに置くことになるかと思います。本にあるPolyine.cとかでは、 配列の初期化子にしれっと書くことで、DRAW_INDEXを見ずに済んでいますが…… >ひとつ、またまぬけかもしれない質問を―― >p.179 List 3.16 l.19 などで super.super.…を回避するのに > ((Object *)p)->classDescriptor = &polylineClassDescriptor; >とかやるのはやっばりまずいですか。 (一応、動いてる模様ですが…。) 確かに動きますが、ポインタのキャストはやはり荒業なので、 可能であれば避けるべきかとは思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2032] C言語ポインタ完全制覇 第1版 4-2-1 可変長配列の配列についての質問
投稿者:884
2017/12/06 13:57:34

はじめまして。 現在、C言語ポインタ完全制覇 第1版で学習しています。 4-2-1 可変長配列の配列で疑問があり、質問させていただきます。 List4-5 read_slogan.cで、 read_slogan(stdin, slogan); のstdinは、キーボードの入力と考えていますが、何を入力すればよいでしょうか。 1週間分の標語ファイル(.txt)を読み込ませたいのですが、うまくいきません。 ご教示お願いいたします。 --------------------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> void read_slogan(FILE *fp, char **slogan) { char buf[1024]; int i; for (i = 0; i < 7; i++) { fgets(buf, 1024, fp); /* 改行文字を削除 */ buf[strlen(buf)-1] = '\0'; /* 標語ひとつ分の領域を確保 */ slogan[i] = malloc(sizeof(char) * (strlen(buf) + 1)); /* 標語の内容をコピー */ strcpy(slogan[i], buf); } } int main(void) { char *slogan[7]; int i; read_slogan(stdin, slogan); /* 読み込んだ標語を表示する */ for (i = 0; i < 7; i++) { printf("%s\n", slogan[i]); } return 0; } ---------------------------------
[この投稿を含むスレッドを表示] [この投稿を削除]
[2031] </form>について
投稿者:くまきち
2017/12/05 21:14:35

『基礎からのWebアプリケーション開発入門』のP.140にあるリスト4-3について。 59行目にある</form>は誤植でしょうか? 些細な内容かと思いますが、念の為。 仮に誤植だとすると、P.100にあるリスト3-9の37行目も同様かも知れません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2030] Re:『Java 謎』3.3 寄り道 - Cで継承を実現してみる
投稿者:藤四郎
2017/12/04 19:57:15

今回も懇切なご説明ありがとうございます。 また、『C 言語ポインタ完全制覇』改訂版の発売おめでとうございます。わた しも、 Java の学習曲線がそれなりにゆるやかに感じられるようになったら、 ぜひ拝読して C もちゃんと理解できるようになりたいと思います。 >趣旨としては、複数階層の継承を実現するにはどうすればよいか、ということで >よいでしょうか。 はい。 >MethodTableIndexは利用者に晒す必要はないので、Shape.hに移動するのは >よろしくないかと思います。 そうしますと、自分自身とサブクラスに公開する "ShapeP.h" にではいかがで しょう。 >ただ、上記mtの型は、宣言にあるとおり「voidを返す関数へのポインタへのポインタ」 >なので、sizeof(mt)ではポインタのサイズしか取れません。 初心者らしくやっぱりやらかしてしまいました。 じつは、いただいたご説明をコードに落とすべくそれなりに格闘したのですが、 お恥ずかしいことにとりあえず挫折します。『C 言語ポインタ完全制覇』改訂 版の拝読後に捲土重来を期して…。 ひとつ、またまぬけかもしれない質問を―― p.179 List 3.16 l.19 などで super.super.…を回避するのに ((Object *)p)->classDescriptor = &polylineClassDescriptor; とかやるのはやっばりまずいですか。 (一応、動いてる模様ですが…。) # わたしの理解吸収力がたんにしょぼいだけといえばそれまでではありますが、 # 『Java 謎+落とし穴』は読み返すたびに新たな発見があります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2029] Re:『Java 謎』3.3 寄り道 - Cで継承を実現してみる
投稿者:(ぱ)こと管理人
2017/12/02 00:40:59

>『Java 謎+落とし穴 徹底解明』 3.3 寄り道 - Cで継承を実現してみる >p.177 - List 3.11 - 3.22 について、 たとえば ExtendedPolyline を追加す >るとしたらどうするのか、つたないながら考えてみました。 趣旨としては、複数階層の継承を実現するにはどうすればよいか、ということで よいでしょうか。 >まず、 Shape.c の MethodTableIndex を Shape.h に移動するのはまずいでしょ >うか。しかし、そうしたとして、あとは以下のファイルを改変または追加しました。 >(なお、 Shape は abstract 相当と理解しております。) Shape.hは利用者側(たとえばmain.c)でも#includeするヘッダファイルですが、 MethodTableIndexは利用者に晒す必要はないので、Shape.hに移動するのは よろしくないかと思います。 >/* このへんがとりわけリアリティにかけるのかも…… */ >void initExtendedPolyline(void) { > ClassDescriptor *cd = getPolylineClassDescriptor(); > void (**mt)() = cd->methodTable; > memcpy(methodTable, mt, sizeof(mt)); > methodTable[(int)DRAW_INDEX] = drawExtendedPolylineImpl; >} まず、このmemcpy()は、ExtendedPolyline独自のmethodTableについて、 いったんそのスーパークラスであるPolylineのmethodTableをコピーしておいて、 その中で特定のメソッドだけをオーバーライドするためのものかと思います。 ただ、上記mtの型は、宣言にあるとおり「voidを返す関数へのポインタへのポインタ」 なので、sizeof(mt)ではポインタのサイズしか取れません。 この形で複数階層の継承を実現するには、スーパークラスのメソッドテーブルに 何個のメソッドがあるのかを、できればコンパイル時に知りたい(メソッドテーブルを malloc()で確保するなら別ですが、静的に決まる数の要素をmalloc()で確保するのは 避けたい)わけで、そうなると、各クラスのヘッダファイルを、 アプリケーションに公開するもの、自分自身のサブクラスのみに公開するものに 分ける必要があるかと思います。実際、Xt Intrinsicsや http://kmaebashi.com/programmer/c_yota/inherit.html こちらのサンプルでは、Polyline.hとPolylineP.hを分けています。 また、クラスディスクリプタを初期化する関数を用意するのは良いとして、 それを、利用者側(main.c)から呼び出させるのは美しくないですよね。 この場合、Objectクラスのクラスディスクリプタに、 ・クラスディスクリプタが初期化されているかどうかのフラグ ・スーパークラスのクラスディスクリプタへのポインタ ・クラスディスクリプタを初期化する関数へのポインタ を持たせてやって、 PolylineやRectangleのような各クラスで、それぞれのクラスディスクリプタへの ポインタをグローバル変数として公開し、 /* PolylineClassがPolylineのクラスディスクリプタへのポインタ */ Polyline *polyline = new_instance(PolylineClass); このnew_instanceの中で、 渡されたポインタの指す先のクラスディスクリプタが初期化されていなければ、 そのクラスディスクリプタを初期化する関数を呼び出す。ただしそれを、 親クラスへ遡りながら親クラスから順に行う。 という処理を行えば、クラスディスクリプタの初期化処理を フレームワーク内で行えるのではないでしょうか。 また、new_instanceの中では、各クラスの「コンストラクタ」を 呼ぶこともできます。 こちらのサンプルでは、 http://kmaebashi.com/programmer/c_yota/inherit.html クラスディスクリプタを初期化する関数へのポインタclass_initializerを Coreのクラスディスクリプタに持たせているにもかかわらず、 それを呼び出す処理がどこにも書いてないですね…… orz
[この投稿を含むスレッドを表示] [この投稿を削除]
[2028] 『Java 謎』3.3 寄り道 - Cで継承を実現してみる
投稿者:藤四郎
2017/11/29 00:44:18

『Java 謎+落とし穴 徹底解明』 3.3 寄り道 - Cで継承を実現してみる p.177 - List 3.11 - 3.22 について、 たとえば ExtendedPolyline を追加す るとしたらどうするのか、つたないながら考えてみました。 ここのところいろいろご面倒をおかけしておりますが、またよろしければご叱 正いただけると幸いです。 (なお、 http://kmaebashi.com/programmer/c_yota/inherit.html も拝見しましたが、申し訳ないことにいまのわたしには難解でした。) まず、 Shape.c の MethodTableIndex を Shape.h に移動するのはまずいでしょ うか。しかし、そうしたとして、あとは以下のファイルを改変または追加しました。 (なお、 Shape は abstract 相当と理解しております。) ---- Polyline.h ----------------------------------------- #ifndef POLYLINE_H_INCLUDED #define POLYLINE_H_INCLUDED #include "Shape.h" #include "Point2D.h" typedef struct { Shape super; int nPoints; Point2D *point; } Polyline; Polyline *createPolyline(void); void drawPolyline(Polyline *polyline); ClassDescriptor *getPolylineClassDescriptor(void); #endif /* POLYLINE_H_INCLUDED */ ---- Polyline.c ----------------------------------------- #include <stdio.h> #include <stdlib.h> #include "Polyline.h" static void drawPolylineImpl(void); static void (*methodTable[])() = { drawPolylineImpl }; static ClassDescriptor polylineClassDescriptor = { methodTable }; ClassDescriptor *getPolylineClassDescriptor(void) { return &polylineClassDescriptor; } Polyline *createPolyline(void) { Polyline *p = malloc(sizeof(Polyline)); p->super.super.classDescriptor = &polylineClassDescriptor; p->nPoints = 0; p->point = NULL; return p; } void drawPolyline(Polyline *polyline) { polyline->super.super.classDescriptor->methodTable[(int)DRAW_INDEX](); } static void drawPolylineImpl(void) { fprintf(stderr, "Polylineを描画\n"); } ---- ExtendedPolyline.h --------------------------------- #ifndef EXTENDED_POLYLINE_H_INCLUDED #define EXTENDED_POLYLINE_H_INCLUDED #include "Polyline.h" #include "Point2D.h" typedef struct { Polyline super; int nPoints; Point2D *point; } ExtendedPolyline; ExtendedPolyline *createExtendedPolyline(void); void drawExtendedPolyline(ExtendedPolyline *extendedPolyline); #endif /* EXTENDED_POLYLINE_H_INCLUDED */ ---- ExtendedPolyline.c --------------------------------- #include <stdio.h> #include <stdlib.h> #include <memory.h> #include "ExtendedPolyline.h" static void drawExtendedPolylineImpl(void); static void (*methodTable[])() = {}; static ClassDescriptor extendedPolylineClassDescriptor = { methodTable }; /* このへんがとりわけリアリティにかけるのかも…… */ void initExtendedPolyline(void) { ClassDescriptor *cd = getPolylineClassDescriptor(); void (**mt)() = cd->methodTable; memcpy(methodTable, mt, sizeof(mt)); methodTable[(int)DRAW_INDEX] = drawExtendedPolylineImpl; } ExtendedPolyline *createExtendedPolyline(void) { ExtendedPolyline *ep = malloc(sizeof(ExtendedPolyline)); /* http://kmaebashi.com/programmer/c_yota/inherit.html には super.super.super.... を回避する裏技が紹介されていますが…… */ ep->super.super.super.classDescriptor = &extendedPolylineClassDescriptor; ep->nPoints = 0; ep->point = NULL; return ep; } void drawExtendedPolyline(ExtendedPolyline *extendedPolyline) { extendedPolyline->super.super.super.classDescriptor->methodTable[(int)DRAW_INDEX](); } static void drawExtendedPolylineImpl(void) { fprintf(stderr, "ExtendedPolylineを描画\n"); } ---- draw.h --------------------------------------------- #include "Shape.h" void draw(Shape **shapes); ---- draw.c --------------------------------------------- /* http://kmaebashi.com/bbs/thread.php?boardid=kmaebashibbs&from=1906&range=1 */ #include <stdio.h> #include "Shape.h" void draw(Shape **shapes) { int i; for (i = 0; i < 4; i++) { drawShape(shapes[i]); } } ---- main.c --------------------------------------------- #include <stdio.h> #include "Shape.h" #include "Polyline.h" #include "Circle.h" #include "Rectangle.h" #include "ExtendedPolyline.h" #include "draw.h" int main(void) { Shape *shapes[4]; int i; initExtendedPolyline(); shapes[0] = (Shape*)createPolyline(); shapes[1] = (Shape*)createCircle(); shapes[2] = (Shape*)createRectangle(); shapes[3] = (Shape*)createExtendedPolyline(); draw(shapes); printf("\n"); drawPolyline(createPolyline()); drawPolyline((Polyline*)createExtendedPolyline()); drawExtendedPolyline(createExtendedPolyline()); return 0; } ---------------------------------------------------------
[この投稿を含むスレッドを表示] [この投稿を削除]
[2027] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:(ぱ)こと管理人
2017/11/27 23:50:41

>は p.74 のあやまりと思われますので、またもやこまかすぎる指摘になってしまい恐縮ですが、念のためよろしくお願いいたします。 修正しました。 何度もご指摘ありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2026] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:藤四郎
2017/11/26 09:27:24

正誤表の追加、ありがとうございました。 ただ、その正誤表に関して、ただし今回とは別件で、 http://kmaebashi.com/nazojava/seigo.html#p74 >p.68 8行目 >誤 > >ことにになり > >正 > >ことになり は p.74 のあやまりと思われますので、またもやこまかすぎる指摘になってしまい恐縮ですが、念のためよろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2025] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:藤四郎
2017/11/19 12:54:41

今回もわたしの読みの浅かったところをくわしく解説してくださってありがと うございます。 Visitor パターンだと >「クリックした座標との距離を算出するメソッド」や >「図形を移動させるメソッド」、「図形を囲む最小の矩形を算出するメソッド」等も XXXVisitor として散らばってかくことになるところ……ということですね。 >私の想定したShapeRuntimeは、Shapeとセットになっており、Shapeを >使うあらゆるプログラムで使用するものです。 Shape と draw() を分離することだけかんがえてて、そこまで頭がまわりませ んでした。納得です。 おかげさまで (まだまだ真にふかい理解にはほどとおいですが) Java のしく みがかなりわかってきたような気がします。『センス・オブ・プログラミング!』 等々も参考にさせていただきつつ、小規模なアプリケーションを自作できるよ うになるのが目標です。 今後も質問等をさせていただくこともあると思いますが、その折にもよろしく お願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2024] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:(ぱ)こと管理人
2017/11/19 00:13:43

>としか思いつけませんでした。しかし、こうだと Visitor 同様「 if else を >ずらずら」になるように思います。 AbstractFactoryとその実装クラスにcreateXXXRuntime()がずらずら並ぶ、 というのは確かにそうですが、draw()だけでなく、 「クリックした座標との距離を算出するメソッド」や 「図形を移動させるメソッド」、「図形を囲む最小の矩形を算出するメソッド」等も DrawShapeRuntimeに入れておけば、それを呼び出すところでは、図形の種類分だけの 何かをずらずら書く必要はなくなりますよね。 (DrawShapeRuntimeというのは、draw()メソッドだけ持っていそうな名前なので、 この名前はよくなかったかもしれません…… 付けるならDrawToolShapeRuntimeでしょうか) >また、各 Shape のコンストラクターに >AbstractFactory の分の引数を追加することになるのでしょうか。 それでもよいですし、ShapeRuntimeは、ドローツールならドローツール、 図形ファイルを読み込んで解析するプログラムならそのプログラム、 というように、プログラムの種類ごとに作ることになるのでしょうから、 どこかにstaticに持ってしまってもよいような気もします。 Javaだと、「図形ファイルを読み込んで解析するプログラム」では デシリアライザを使って図形ファイルを読み込むのでしょうから、 その場合、ShapeRuntimeはreadObject()でくっつけることになりますから、 AbstractFactoryはそこから手が届くところにある必要がありますし。 >ちなみに、つぎのようにするのではだめでしょうか。 … >abstract class ShapeRuntime { > protected DrawShapeRuntime drawShapeRuntime; > > abstract DrawShapeRuntime getDrawShapeRuntime(); >} もともとの趣旨として、 「Shapeクラスは、ドローツールだけでなく、たとえばドローツールで作った ファイルを解析する別のプログラムでも使う」 というものがありました。 その点で、このShapeRuntimeは、「ドローツール」と、 「ドローツールで作ったファイルを解析する別のプログラム」で 共用するものなのでしょうか。 私の想定したShapeRuntimeは、Shapeとセットになっており、Shapeを 使うあらゆるプログラムで使用するものです。そして、ドローツールだけで 使うShapeRuntimeのサブクラスがDrawShapeRuntimeです。 同じ趣旨なのであれば、ShapeRuntimeのメソッドの戻り値の型として、 DrawShapeRuntimeが出てきてしまっては、ShapeRuntimeがドローツール 専用品に依存してしまうので、よろしくないのではないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2023] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:藤四郎
2017/11/16 19:37:20

詳しく解説くださり、ありがとうございます。 adjustBoundary() に引数をわ たすとなると、ワールド座標系版とデバイス座標系版にわけるのがすじという ようなはなしになってしまうので、引数なしの adjustBoundary() を採用され たというわけですね。疑問がすっきり解消しました。 さて、 p. 228 「別の方法」について、そもそも Abstract Factory パターン をよくわかってないのでとんだ見当はずれだったらもうしわけありませんが、 「各 Shape のオブジェクトに……くっつける」ときに使い、「いざ描画すると きには…… DrawShapeRuntime にダウンキャスト」するとなると、 abstract class AbstractFactory { abstract PolylineRuntime createPolylineRuntime(Polyline polyline); abstract CircleRuntime createCircleRuntime(Circle circle); abstract RectangleRuntime createRectangleRuntime(Rectangle rectangle); } class DrawFactory extends AbstractFactory { PolylineRuntime createPolylineRuntime(Polyline polyline) { return new DrawPolylineRuntime(polyline); } // ... } としか思いつけませんでした。しかし、こうだと Visitor 同様「 if else を ずらずら」になるように思います。また、各 Shape のコンストラクターに AbstractFactory の分の引数を追加することになるのでしょうか。 ちなみに、つぎのようにするのではだめでしょうか。 abstract class Shape { ShapeRuntime shapeRuntime; } abstract class ShapeRuntime { protected DrawShapeRuntime drawShapeRuntime; abstract DrawShapeRuntime getDrawShapeRuntime(); } class PolylineRuntime extends ShapeRuntime { PolylineRuntime(Polyline polyline) { this.drawShapeRuntime = new DrawPolylineRuntime(polyline); } DrawShapeRuntime getDrawShapeRuntime() { return this.drawShapeRuntime; } } interface DrawShapeRuntime { void draw(Drawable d); } class DrawPolylineRuntime implements DrawShapeRuntime { // 「 PolylineRuntime を継承」無用 private Polyline polyline; DrawPolylineRuntime(Polyline polyline) { this.polyline = polyline; } public void draw(Drawable d) { Point2D[] points = this.polyline.getPoints(); for (int i = 0; i < points.length - 1; i++) { d.drawLine(points[i].getX(), points[i].getY(), points[i+1].getX(), points[i+1].getY()); } } } class Polyline extends Shape { private Point2D[] points; public Polyline(Point2D[] points) { this.points = points; this.shapeRuntime = new PolylineRuntime(this); } public Point2D[] getPoints() { return this.points; } } // Circle, Rectangle の対応分は略 /* XDrawCanvas の paint() の shape.draw(this.drawWindow); を shape.shapeRuntime.getDrawShapeRuntime().draw(this.drawWindow); // 「DrawShapeRuntime にダウンキャスト」不要 に変更。 */
[この投稿を含むスレッドを表示] [この投稿を削除]
[2022] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:(ぱ)こと管理人
2017/11/16 01:05:52

>と (あるいは、いっそ adjustBoundary() の中身を resize() に移動) されなかったのは >どうしてかと思いまして。 adjustBoundary() は意味的に引数をとるような処理ではないし、 > resize() では今後の拡張次第で別の処理もありうるがこのバージョンでは >adjustBoundary() だけ、ということなのでしょうか……。 resize()はリサイズですし、adjustBoundary()は範囲合わせなので別の名前で 別のメソッドにするのが自然なように思います。 確かにこのケースでは、resize()の時しかadjustBoundary()は呼びませんが、 たとえば私が大昔に作ったこちらのプログラム http://kmaebashi.com/programmer/serializer/draw.html では、ZoomやPanの機能があります。このプログラムでは、Zoom時は 別ウインドウが開くのでちょっと特殊ですが、 ・マウスで長方形を指定すると、その範囲がウインドウ全体になるように  拡大されるZoom機能。 ・マウスで座標を指定するとその位置が中心になるように移動するPan機能。 といったものを考えると、 「ワールド座標系で範囲を設定し、adjustBoundary()を呼び出せばけりがつく」 というのは、悪くない方針のように思います。 ただ、そういう意味だと、むしろ「ワールド座標系で範囲を設定し…」の部分が 「事前に変数に値を設定しておく」というグローバル変数渡しまがいで 気持ちが悪いので、むしろadjustBoundary()にはxmin, ymin, xmax, ymaxを 引数として渡すべきだったかな、と思わなくはないですが、 それはそれでウインドウサイズを変えた時にはデバイス座標系での領域変更が 起点になるわけで、では入口のメソッドとしてデバイス座標系起点のadjustBoundaryByDc()とワールド座標系起点のadjustBoundaryByWc()を作って 前者にはwidth, heightを、後者にはxmin, ymin, xmax, ymaxを渡そうか、 とか考え始めるときりがないですね。 まあ、このあたりは、何が正解とも言えない話なのではないかと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2021] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:藤四郎
2017/11/13 19:04:42

貴重なお時間を割いていただき、改めてありがとうございます。 >JLSから引用するのに勝手に変えるわけにもいかずにこうしたのではないかと >思います(記憶の彼方ですが…)。 >ここはこのままとさせてください。 了解しました。 >>X-Draw のソースで DrawWindow.java の l. 110 - >> public void mouseDown(int x, int y) {} >> public void mouseUp(int x, int y) {} >> public void mouseDrag(int x, int y) {} >>は不要と思われます。 > >本当ですね。この手の空メソッドはインタフェースにあるシグネチャのうち >不要なものについて書くのが普通ですが、それにしてもメソッド名から違うので、 >なぜあるのか不明です。正誤表に載せておきます。 僭越ながら、 java.awt.Component に public boolean mouseDown(Event evt, int x, int y) Deprecated. As of JDK version 1.1, replaced by processMouseEvent(MouseEvent). というのはあるので、古い版の X-Draw のがまぎれこんでいたのかもしれません。 >>あと、 l. 164 - >> public void resize(int width, int height) { >> this.adjustBoundary(); >> } >>ですが、今後の拡張を見込んでこのようにされたのでしょうか。 > >このメソッドは普通に呼ばれていますし、試しに処理を抜いてみたら、 >倍率の計算がされずに何も描かれないので、必要なのではないでしょうか。 すみません、言葉足らずすぎでした。 XDrawCanvas.java の l. 39 - で Dimension d = getSize(); drawWindow.resize(d.width, d.height); また、 DrawWindow.java の l. 96 - で private void adjustBoundary() { Dimension canvasSize = canvas.getSize(); double xScale = canvasSize.width / (this.xMax - this.xMin); double yScale = canvasSize.height / (this.yMax - this.yMin); となっているのは、一見 getSize() の二度手間に思えます。つまり、 private void adjustBoundary(int width, int height) { double xScale = width / (this.xMax - this.xMin); double yScale = height / (this.yMax - this.yMin); // ... } public void resize(int width, int height) { this.adjustBoundary(width, height); } と (あるいは、いっそ adjustBoundary() の中身を resize() に移動) されなかったのはどうしてかと思いまして。 adjustBoundary() は意味的に引数をとるような処理ではないし、 resize() では今後の拡張次第で別の処理もありうるがこのバージョンでは adjustBoundary() だけ、ということなのでしょうか……。 ところで、 p. 228 「別の方法」についてもお伺いしたいことがありますけれども、長くなるので別稿にて。 あと、自分の投稿 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&from=2017&range=1 につっこみですが shape.accept(new DrawVisitor(this.drawWindow)); ここは while ループ内なのでここで new するのは効率的にまずいですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2020] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:(ぱ)こと管理人
2017/11/13 01:15:51

週末に返信と言っておきながら日付が変わってしまいました。 遅くなりまして申し訳ありません。 >p. 147 の英文で [emphasis is in the original text] とあるのが反映されていません。 英語版の方で強調部分が太字になっていないということですね。 正誤表に載せておきます。 >また、和訳の方で「どのオブジェクトも参照しない特殊なnull参照」に相当する英文がないです。 この「どのオブジェクトも参照しない特殊なnull参照」という文言は、 JLSには含まれていて、日本語部分はそこから持ってきています。 このFAQのオリジナルの文章をWayback Machineから発掘したところ 「are pointers to these objects."」までで止まっていますが、 JLSから引用するのに勝手に変えるわけにもいかずにこうしたのではないかと 思います(記憶の彼方ですが…)。 ここはこのままとさせてください。 >X-Draw のソースで DrawWindow.java の l. 110 - > public void mouseDown(int x, int y) {} > public void mouseUp(int x, int y) {} > public void mouseDrag(int x, int y) {} >は不要と思われます。 本当ですね。この手の空メソッドはインタフェースにあるシグネチャのうち 不要なものについて書くのが普通ですが、それにしてもメソッド名から違うので、 なぜあるのか不明です。正誤表に載せておきます。 >あと、 l. 164 - > public void resize(int width, int height) { > this.adjustBoundary(); > } >ですが、今後の拡張を見込んでこのようにされたのでしょうか。 このメソッドは普通に呼ばれていますし、試しに処理を抜いてみたら、 倍率の計算がされずに何も描かれないので、必要なのではないでしょうか。 > p.227 の interface Visitor の三つのシグネチャーの頭に void がいるかと。 その通りです。正誤表に載せておきます。 また、 p.228 の > v.visitPolyline(polyline); >は実際には > v.visitPolyline(this); >になるかと。 こちらもその通りです。正誤表に載せておきます。 >ただ、またいまごろきづいてしまいましたが、 p. 228 l. 7 > visitPolyline(), visitCircle, visitRectangle こちらもその通りです。正誤表に載せておきます。 いろいろご指摘ありがとうございました。 >ちなみに、つぎのようにかきましたが、これで適当でしょうか。 >(Polyline たちから draw() を排除するかわりに getter を >いれなければならなくなったのがどうも……。) 描画をPolyline等ではなくDrawVisitorで行うようにしたのですから、 DrawVisitorに対し中身を開示しなければ描画できないというのは、 まあ、しょうがないですよね。 実際問題として、PolylineのようなCでいうところの構造体的なクラスが 外部に中身を開示しないというのは無理があるのではないかなあ、と、 この例を見ても思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2019] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:藤四郎
2017/11/08 20:53:59

大変お忙しい中、おそれいります。こちらはまったく急ぎませんので、ご都合のよろしいときにご対応いただければ幸いです。 ただ、またいまごろきづいてしまいましたが、 p. 228 l. 7 visitPolyline(), visitCircle, visitRectangle 後二者に "()" がないので、こちらもよろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2018] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:(ぱ)こと管理人
2017/11/08 08:27:48

ご指摘ありがとうございます。ちょっとどたばたしておりまして対応が遅れておりまして申し訳ありません。 週末にはご回答いたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2017] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:藤四郎
2017/11/05 20:16:43

おくればせながら、正誤表の追加とソースの訂正、ありがとうございました。おそれいりますが、またいくつかきづいてしまいましたので、ふたたびご面倒をおかけします。今回も当方の勘違いがありましたらお許しください。 (才能に乏しいようでなかなか理解がすすみませんが、趣味としてこつこつやっております。) まずは、またもや細かいことですみませんが……。 p. 147 の英文で [emphasis is in the original text] とあるのが反映されていません。和訳の方はされています。また、和訳の方で「どのオブジェクトも参照しない特殊なnull参照」に相当する英文がないです。 X-Draw のソースで DrawWindow.java の l. 110 - public void mouseDown(int x, int y) {} public void mouseUp(int x, int y) {} public void mouseDrag(int x, int y) {} は不要と思われます。 あと、 l. 164 - public void resize(int width, int height) { this.adjustBoundary(); } ですが、今後の拡張を見込んでこのようにされたのでしょうか。 3.6.7 「本当にdraw()をShapeに入れてよいのか?」が、コードを実地にかいてみることでようやくわかってきました。それできづいたのですが、 p.227 の interface Visitor の三つのシグネチャーの頭に void がいるかと。また、 p.228 の v.visitPolyline(polyline); は実際には v.visitPolyline(this); になるかと。 ちなみに、つぎのようにかきましたが、これで適当でしょうか。(Polyline たちから draw() を排除するかわりに getter をいれなければならなくなったのがどうも……。) class Polyline extends Shape { private Point2D[] points; Polyline(Point2D[] points) { this.points = points; } public Point2D[] getPoints() { return this.points; } void accept(Visitor v) { v.visitPolyline(this); } } // Circle, Rectangle は略 class DrawVisitor implements Visitor { Drawable drawable; DrawVisitor(Drawable drawable) { this.drawable = drawable; } public void visitPolyline(Polyline polyline) { Point2D[] points = polyline.getPoints(); for (int i = 0; i < points.length - 1; i++) { drawable.drawLine(points[i].getX(), points[i].getY(), points[i + 1].getX(), points[i + 1].getY()); } } // visitCircle(), visitRectangle() は略 } XDrawCanvas の paint() の shape.draw(this.drawWindow); を shape.accept(new DrawVisitor(this.drawWindow)); に変更。 その他、まだ消化しきれていないこともありますので、今後もご面倒をおかけしてしまうかもしれませんが、どうぞよろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2016] Re:P.124の補足について
投稿者:くまきち
2017/10/14 22:48:49

毎回、ご回答ありがとうございます。 引き続き熟読させて頂きます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2015] Re:P.124の補足について
投稿者:くまきち
2017/10/14 22:47:04

了解いたしました。 よろしくお願い致します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2014] Re:testbbs_jsp2について
投稿者:(ぱ)こと管理人
2017/10/11 01:30:35

>ソースファイルを見ると、16行目の”<!--”に対応した”//-->”が見当たりません。 >これは省略可能ということでしょうか? 「//-->」がないのは、単純に付け忘れです。申し訳ありません。 ただ、これがなくても動くのは、「<!--」「//-->」の趣旨が、 ・もともと<script>タグの中に「<!--」「-->」を書くのは、<script>タグに  対応していない古いブラウザで、JavaScriptが表示されてしまうことを  防ぐためのものである(古い対策なので、今こんなのを書く必要はないと思いますが)。 ・このため、<script>タグ内の冒頭の「<!--」から改行までは無視されることになっている。  http://www.asahi-net.or.jp/~sd5a-ucd/rec-html401j/interact/scripts.html#h-18.2.1  | JavaScriptエンジンは、SCRIPT要素の始めに文字列「<!--」が存在することを  | 許容し、この場合当該行の末尾までの文字を無視する。 ・このコメントを閉じる「-->」は、JavaScriptとして解釈されないように  「//-->」としてコメントアウトする。 というものであるためで、<script>タグに対応していない古いブラウザなら 「<!--」に対応する「-->」がないとコメントが閉じなくて困るでしょうが、 <script>タグに対応したブラウザなら、最初から「<!--」自体無視するので、 閉じてなくても問題にはなりません。 とはいえミスはミスなので、先ほどの件と併せ、正誤表に入れさせていただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2013] Re:P.124の補足について
投稿者:(ぱ)こと管理人
2017/10/11 01:21:15

>P.124の補足に「GETのパラメタもPOSTのパラメタも、URLデコードしないまま・・・」とありますが、P112の52行目でGETのパラメタはURLデコードされているわけではないのでしょうか? すみません、もう記憶はあいまいなのですが、p.112の52行目におけるURLデコードは、 UTF-8固定でデコードしているところからして、ディレクトリ名やファイル名を デコードして正しくファイルを開くためのものです(Modoki/0.2で実装したものです)。 ここで、クエリストリング部分までデコードしてしまっていますが、 クエリストリングはUTF-8でエンコードされているとは限らないので、 これをこの時点でデコードしているのは単純に不具合のように思います。 すみませんが確認しますので少しお時間をください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2012] testbbs_jsp2について
投稿者:くまきち
2017/10/10 00:21:18

お世話になっております。 たびたび質問させて頂いています。 今回は「testbbs_jsp2」について質問させてください。 ソースファイルを見ると、16行目の”<!--”に対応した”//-->”が見当たりません。 これは省略可能ということでしょうか? 本論とは関係ない初歩的な質問かも知れませんが、よろしければ回答頂ければと思います。 よろしくお願い致します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2011] 全く初歩の初歩
投稿者:kawashima
2017/10/09 11:40:19

サーバーを作るのとクライアントは同じパソコンだと思うのですが、どうも設定が上手くいきません。よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2010] P.124の補足について
投稿者:くまきち
2017/10/08 23:49:22

お世話になってます。 質問があり、投稿させて頂きました。 P.124の補足に「GETのパラメタもPOSTのパラメタも、URLデコードしないまま・・・」とありますが、P112の52行目でGETのパラメタはURLデコードされているわけではないのでしょうか? ひょっとして基本的な事が分かっていないのかもしれませんが、よろしければ回答頂けたらと思います。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2009] Re:Javaの実装の隠ぺいに関して
投稿者:beginner
2017/10/05 11:36:34

ご回答ありがとうございます。 非常に参考になりました。 DIについては軽い知識のみで深く考えたことなかったため、改めて勉強し直すきっかけになりそうです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2008] Re:Javaの実装の隠ぺいに関して
投稿者:(ぱ)こと管理人
2017/10/05 08:33:28

はじめまして。拙著を読んでいただきありがとうございます。 >しかし、Factory.java内で"import com.sample.libimpl.*"を記載せざるを得ません。 >何を気にしているかというと、Cで言えば、パブリックなヘッダに、プライベートなヘッダを書いているようなコードに見える点です。 >利用者から完全に~impl部分を隠ぺいする一般的な手法はあるのでしょうか。 これは確かにその通りなのですが、私はこれについては 「まあ、Factoryだけはしょうがない」 と考えています。 どこかで実装クラスが何であるかを明示しなければいけない以上、 そこでは実装側のパッケージをimportせざるを得ません。 # 「Java謎+落とし穴~」にどう書いたかと思って見返したら、 # 「実はここが頭の痛いところなのですが~」と書いてますね…… 利用者からさらに実装を隠蔽し、状況によって実装クラスを 差し替える手法として、Dependency Injectionという考え方もあります。 ただ、実装をあまり分離しすぎると、それはそれでわかりにくくなったりもします。 https://twitter.com/kudzu/status/862906043591925762 >DI使ってコード書いてるわし「こんな簡潔にモジュラーでテスタブルなコードが書ける!すごい!天才!」 > DI使った他人のコード読んでるわし「おい、これどこから呼ばれてんだよ。わかんねぇぞ。○すぞ。」
[この投稿を含むスレッドを表示] [この投稿を削除]
[2007] Javaの実装の隠ぺいに関して
投稿者:beginner
2017/10/04 09:56:29

はじめまして、前橋さんの各種書籍で一からからプログラミングの基礎体力づけをさせていただいています。 Javaを使った一般的なコードの書き方で疑問を抱いたことがございます。 下に適当な4つのサンプルプログラムを書きました。 mainを呼び出す利用者にimplの実装を隠ぺいすることを目的としています。 Factoryクラスを経由してインターフェースを返すようにしています。 しかし、Factory.java内で"import com.sample.libimpl.*"を記載せざるを得ません。 何を気にしているかというと、Cで言えば、パブリックなヘッダに、プライベートなヘッダを書いているようなコードに見える点です。 利用者から完全に~impl部分を隠ぺいする一般的な手法はあるのでしょうか。 もしよろしければ教えていただけますと大変助かります。 プログラミング初心者のため勘違い含んでいたりした場合大変恐縮です。 ================================== $ vi com/sample/Main.java package com.sample; import com.sample.lib.*; class Main{ public static void main(String[] args){ Another another = Factory.create(); another.hello(); } } ================================== $ vi com/sample/lib/Factory.java package com.sample.lib; import com.sample.libimpl.*; public class Factory{ public static Another create() { return new AnotherImpl(); } } ================================== $ vi com/sample/lib/Another.java package com.sample.lib; public interface Another { void hello(); } ================================== $ vi com/sample/libimpl/AnotherImpl.java package com.sample.libimpl; import com.sample.lib.*; public class AnotherImpl implements Another { public void hello(){ System.out.println("hello another class"); } } ==================================
[この投稿を含むスレッドを表示] [この投稿を削除]
[2006] 【業務連絡】しばらくドメインが停止していました
投稿者:(ぱ)こと管理人
2017/10/02 23:38:12

9/27の夜あたりから、kmaebashi.comにアクセスできない状態になっておりました。 ご迷惑をおかけしまして申し訳ありませんでした。 <原因> kmaebashi.comは、2004年2月頃に、TwodotsNetなる業者でレンタルサーバを 借りて、その際ドメインも取ったのですが、この業者は2005年4月に 倒産してしまいました。 http://kmaebashi.com/zakki/zakki0039.html#rentalserver その際、ドメインの連絡先メールアドレス(Tech Email)の更新を 怠っていたため、無効なメールアドレスだとしてレジストラが停止措置を 取ったとのことです。修正して復旧していただきました。 当方のミスにてご迷惑をおかけいたしました。 今後ともよろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2005] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:(ぱ)こと管理人
2017/09/24 23:53:24

ご指摘の点、正誤表に記載しました。 >>7.3.1の直列化を使った「深いコピー」はある種裏技的なものなので、 >>ここでの「深いコピー」は、あくまで6.5のものを意味しています。 > >お言葉を返すようで恐縮ですが、直列化を使った「深いコピー」は7.3.2で説明され、7.3.1ではその前振りとしてclone()での「深いコピー」の具体的コーディング例が載っています。そして、6.5にはclone()での「深いコピー」の具体的方法の記述は見当たらないようです――というのが私の理解なのですが…。それこそこちらの勘違いでしたら、本当にすみません。 > おっしゃるとおりです。確かに、6.5.ではclone()の実装方法について説明はしていますが、 それは「深いコピー」ではありませんでした。 7.3自体が裏技の説明なので、そこを参照というのも妙な気がしますが、 7.3.1にしか深いコピーの具体的実装はないですね…… 正誤表にはそのように記載しました。ご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2004] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:藤四郎
2017/09/22 21:34:17

ご返信ありがとうございます。 >15年も前の本ですが、色々ご指摘ありがとうございます。 >次の週末に正誤表に掲載いたします。 私は誤解やら勘違いやらをしょっちゅうやらかす人間なので、ほとんどをご確認いただけて安堵しました。お忙しい中お手数おかけして恐縮ですが、いまなお精読するに値する本だと思うので、よろしくお願いします。 >7.3.1の直列化を使った「深いコピー」はある種裏技的なものなので、 >ここでの「深いコピー」は、あくまで6.5のものを意味しています。 お言葉を返すようで恐縮ですが、直列化を使った「深いコピー」は7.3.2で説明され、7.3.1ではその前振りとしてclone()での「深いコピー」の具体的コーディング例が載っています。そして、6.5にはclone()での「深いコピー」の具体的方法の記述は見当たらないようです――というのが私の理解なのですが…。それこそこちらの勘違いでしたら、本当にすみません。 こちらこそ、ありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2003] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:(ぱ)こと管理人
2017/09/21 00:56:22

はじめまして。反応が遅くなりまして申し訳ありません。 15年も前の本ですが、色々ご指摘ありがとうございます。 次の週末に正誤表に掲載いたします。 1点だけ。 >p.99 4行目 >その方法については「6.5 clone()とCloneable」で説明します. >→ 「その」が「深いコピー」を指すのなら、それは7.3.1で説明されているような…。 7.3.1の直列化を使った「深いコピー」はある種裏技的なものなので、 ここでの「深いコピー」は、あくまで6.5のものを意味しています。 >p.340 33行目(下から3行目) >FactoryTestImpl >→ あるいは私の理解が足りないだけかもしれません。しかし、これを直前の段落にあるWindowTestImplに置換すれば理解したつもりになれるのですが…。 ここはWindowsTestImplが正しいです。これが理解の妨げになっておりましたら 申し訳ありません。 ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2002] 『Java謎+落とし穴徹底解明』の正誤について
投稿者:藤四郎
2017/09/16 21:07:59

はじめまして。 『Java謎+落とし穴徹底解明』は改訂も増刷もされていないのがとても残念です。現行のJavaでは本書で指摘されていた問題点の多くは改善されているらしいですが、本質的な理解を得るのに本書はまだまだ「現役」ではないかと素人ながら思います。(ただ、3.6.7や7.1は、相応の開発経験のない私には、まだしっくり理解できません。) さて、まだそちらの正誤表に載っていない事項を見つけたと思いました。重箱の隅的なものばかりで単に煩わしいかもしれませんが、報告させていただきます。(第4刷) p.37 3行目 fillPatternCodeで指定される色 → fillPatternCodeで指定される中塗りパターン p.74 8行目 ことにになり, p.90 12行目 p2 = new Point(); → Point2D() p.99 4行目 その方法については「6.5 clone()とCloneable」で説明します. → 「その」が「深いコピー」を指すのなら、それは7.3.1で説明されているような…。 p.104 Fig.2.14 1 2 3 4 → 0 1 2 3 p.166 下から2行目 elseif p.203 NOTE IntStackがIntArrayの一部であり → 「IntStackはIntArrayを持っている」ので「IntArrayがIntStackの一部であり」かと思います。 p.212 Fig.3.16 Polyine p.213 List 3.24 XDrawApplet.java l.25 "Polyine" p.214 List 3.30 ShapeIterator.java → 誤りではないですが、 4.2.4 (p.246) との整合性からpublicはないほうがよいのでは? Drawableなどの他のinterfaceではpublicされてないですし…。 p.217 List 3.34 DrawWindow.java l.24, 27 scale → 誤りではないですが、他の箇所ではthis.scaleとされています。 p.217 List 3.34 DrawWindow.java l.126, 143, 151, 158 dcToWcX(e.getX()), dcToWcX(e.getY())); → dcToWcX(e.getX()), dcToWcY(e.getY())); // こちらも、 xMin, yMinを 0にしているため発現しませんが。 p.225 1行目 finish() → finishCommand() p.240 Fig4.3 CLASSPAHT p.340 33行目(下から3行目) FactoryTestImpl → あるいは私の理解が足りないだけかもしれません。しかし、これを直前の段落にあるWindowTestImplに置換すれば理解したつもりになれるのですが…。 p.350 } catch (Exception ex) { err.printStackTrace(); p.354 List 7.1 l.1 import java.security.*; → 不要と思われます。 p.355 1行目 SecurityManagerのgetStackTrace()メソッドは → SecurityManagerのgetClassContext()メソッドは p.357 22行目 兼ね合いもなどある p.365 1行目 Colorというフィールド
[この投稿を含むスレッドを表示] [この投稿を削除]
[2001] Re:P.17:終了のマークとして0を送付について
投稿者:(ぱ)こと管理人
2017/08/23 19:06:08

>一方、TcpServerがserver_send.txtを送る際は、終了のマークとして0を送っていませんし、さらに‐1も送っていませんが、TcpClient側は‐1の受信で受信の終了を認識しています。 TcpClient.javaは、InputStremのread()メソッドで入力を1バイトずつ 読み込んでいますが、read()メソッドは、正常に1バイト読み込んだ時、 0~255の値を返します。つまり、TcpClientが-1を受信するということは あり得ません。-1が返るのは、「ストリームの終わりに達した場合」です。 https://docs.oracle.com/javase/jp/6/api/java/io/InputStream.html#read() なぜクライアントから見てストリームが終わるのかといえば、それは サーバ側でソケットをclose()したからです。 TcpClient.javaにて、終了のマーク0を送信しているのは、このソケットは まだサーバからデータを返すのに使うので、このタイミングでclose()するわけには いかないからです。 これで回答になっておりますでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2000] P.17:終了のマークとして0を送付について
投稿者:くまきち
2017/08/21 00:29:24

お世話になっております。 疑問に思った点があり、また質問させて頂きます。 P.16のTcpClient(リスト1-2)では、client_send.txtを送る際、終了のマークとして0を送付することで、P.15のTcpServer(リスト1-1)側は、受信の終了を認識しています。 一方、TcpServerがserver_send.txtを送る際は、終了のマークとして0を送っていませんし、さらに‐1も送っていませんが、TcpClient側は‐1の受信で受信の終了を認識しています。 この違いは、どこから来るものでしょうか? server側とClient側の仕組みの違いからくるものでしょうか?それとも、受信と送信の順番の違いからくるものでしょうか? またまた初歩的な質問なのかも知れませんが、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1999] Re:TestBBS.javaについて
投稿者:(ぱ)こと管理人
2017/08/17 23:11:10

>お世話になっております。 >P.108の最終行に「このメソッドはTestBBS.javaでは使用していません。」と記載がありますが、この”TestBBS.java”が、どのソースコードを意味するものなのか分からず、質問させて頂きました。 申し訳ありません。誤植(というか修正ミス)のようです。 元になったWeb記事 http://kmaebashi.com/programmer/webserver/henacat.html では、ShowBBS.javaとPosBBS.javaをまとめてTestBBS.javaというソースに 含めていました。 ただし、Javaでは1クラス1ファイルが普通なので、書籍化する際に分離したのですが、 この部分について修正が漏れておりました。 よってこの部分は、「このメソッドはサンプル掲示板では使用していません」に 読み替えてください。 正誤表に載せておきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1998] TestBBS.javaについて
投稿者:くまきち
2017/08/15 22:52:03

お世話になっております。 P.108の最終行に「このメソッドはTestBBS.javaでは使用していません。」と記載がありますが、この”TestBBS.java”が、どのソースコードを意味するものなのか分からず、質問させて頂きました。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1997] Re:URLエンコードについて
投稿者:くまきち
2017/08/05 23:06:10

回答、ありがとうございます。 下記の回答内容を見ながらP.76まで読み進めてみて理解することができました! また、質問させていただくかも知れませんが、よろしくお願いいたします。 >>P.63からの「URLエンコードに対応する」の説明で理解できない部分があり、投稿させて頂きました。 >>P.64の上から2行目に、元の文字列の文字コードによって(例えば、Shift-Jisか、UTF-8か、EUCかによって)、エンコード結果が異なると書いてあります。 >>一方で、同じページのもう少し下の部分には「IEやFireFoxともにUTF-8でエンコードしたものを…」と記載があります。 >>これは「元の文字列の文字コードによって」という部分と矛盾するように感じ、よく分からなくなりました。 >>また、P.65の補足(下)でも、Shift-Jisとしてエンコードする例があり、ますます混乱しています。 > >返信が遅くなりまして申し訳ありません。 > >p.64冒頭にあるように、URLエンコードは、『元の文字列をバイト単位で解釈し、 >「%」の後ろにその16進表記をつなげたもの』です。よって、元の文字列を >どのエンコーディング(文字コード)で解釈するかにより結果は変わります。 >JavaのURLEncoderやURLDecoderのようなクラスライブラリで、エンコードするときも >デコードするときもエンコーディングを指定しなければいけないのは、そのためです。 >WebサイトでURLエンコード/デコードの機能を提供しているページもよくありますが、 >そういうページでも、たいては文字コードが選べるようになっていると思います。 > >その上で、各ブラウザがどのエンコーディング(文字コード)でURLエンコードするかに >ついては、W3Cで定められており、それがUTF-8である、ということです。 > >これで回答になっていますでしょうか? >
[この投稿を含むスレッドを表示] [この投稿を削除]
[1996] Re:URLエンコードについて
投稿者:(ぱ)こと管理人
2017/08/04 20:54:02

>P.63からの「URLエンコードに対応する」の説明で理解できない部分があり、投稿させて頂きました。 >P.64の上から2行目に、元の文字列の文字コードによって(例えば、Shift-Jisか、UTF-8か、EUCかによって)、エンコード結果が異なると書いてあります。 >一方で、同じページのもう少し下の部分には「IEやFireFoxともにUTF-8でエンコードしたものを…」と記載があります。 >これは「元の文字列の文字コードによって」という部分と矛盾するように感じ、よく分からなくなりました。 >また、P.65の補足(下)でも、Shift-Jisとしてエンコードする例があり、ますます混乱しています。 返信が遅くなりまして申し訳ありません。 p.64冒頭にあるように、URLエンコードは、『元の文字列をバイト単位で解釈し、 「%」の後ろにその16進表記をつなげたもの』です。よって、元の文字列を どのエンコーディング(文字コード)で解釈するかにより結果は変わります。 JavaのURLEncoderやURLDecoderのようなクラスライブラリで、エンコードするときも デコードするときもエンコーディングを指定しなければいけないのは、そのためです。 WebサイトでURLエンコード/デコードの機能を提供しているページもよくありますが、 そういうページでも、たいては文字コードが選べるようになっていると思います。 その上で、各ブラウザがどのエンコーディング(文字コード)でURLエンコードするかに ついては、W3Cで定められており、それがUTF-8である、ということです。 これで回答になっていますでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1995] URLエンコードについて
投稿者:くまきち
2017/07/30 16:59:05

P.63からの「URLエンコードに対応する」の説明で理解できない部分があり、投稿させて頂きました。 P.64の上から2行目に、元の文字列の文字コードによって(例えば、Shift-Jisか、UTF-8か、EUCかによって)、エンコード結果が異なると書いてあります。 一方で、同じページのもう少し下の部分には「IEやFireFoxともにUTF-8でエンコードしたものを…」と記載があります。 これは「元の文字列の文字コードによって」という部分と矛盾するように感じ、よく分からなくなりました。 また、P.65の補足(下)でも、Shift-Jisとしてエンコードする例があり、ますます混乱しています。 もしかしたら初歩的な質問なのかもしれませんが、詳しい方いましたら、教えてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1994] Re:HenacatのC#版を作りました
投稿者:nendo_code
2017/07/12 22:57:45

下記に公開しました。 https://github.com/nendo-code/Henacat_sharp ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1993] Re:HenacatのC#版を作りました
投稿者:nendo_code
2017/07/12 19:34:43

>まったく問題ありません。どのようなものになっているか私も楽しみです。 > >よろしくお願いいたします。 ありがとうございます! 公開しましたらこちらの掲示板で報告させていただきますね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1992] Re:HenacatのC#版を作りました
投稿者:(ぱ)こと管理人
2017/07/11 07:57:32

はじめまして。 >その結果HenacatのC#移植版のコードが出来たので、もしよろしければGitHubで公開させていただければと考えておりますが、いかがでしょうか。 まったく問題ありません。どのようなものになっているか私も楽しみです。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1991] HenacatのC#版を作りました
投稿者:nendo_code
2017/07/09 17:53:38

はじめまして。nendo_codeと申します。 「基礎からのWebアプリケーション開発入門」読ませていただきました。今までなんとなくぼんやりとしか知らなかったWebの知識を整理する事ができ、非常に勉強になりました。 私はC#プログラマなので、学習にあたり細かい動きを理解するために、C#にHenacatのコードを移植して動かしてみたりしました。 その結果HenacatのC#移植版のコードが出来たので、もしよろしければGitHubで公開させていただければと考えておりますが、いかがでしょうか。 こちらとしては、「なんとなく作っちゃったから公開しよう」くらいのノリですので、ダメであればダメでよいです。(書籍として販売されている以上、ご都合などあるかもしれませんし。) よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1990] テスト
投稿者:みっきー
2017/06/16 14:08:39

ウェブサイトから飛んできました。 掲示板ってどうやって作るのかなあという初心者です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1988] Re:26p~27p
投稿者:kokonotu
2017/04/27 16:29:13

>追加情報ありがとうございます。 >80番に修正はしてあったわけですね。失礼しました。 >その上で、今も以下のエラーが出ている、ということでよいでしょうか。 > >>java.net.ConnectException: Connection refused: connect >> at java.net.DualStackPlainSocketImpl.connect0(Native Method) >> at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) >> at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) >> at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) >> at java.net.AbstractPlainSocketImpl.connect(Unknown Source) >> at java.net.PlainSocketImpl.connect(Unknown Source) >> at java.net.SocksSocketImpl.connect(Unknown Source) >> at java.net.Socket.connect(Unknown Source) >> at java.net.Socket.connect(Unknown Source) >> at java.net.Socket.<init>(Unknown Source) >> at java.net.Socket.<init>(Unknown Source) >> at TcpClient.main(TcpClient.java:6) > >だとすれば、TcpClient.javaの6行目でWebサーバへの接続に失敗しているわけで、 >client_send.txtの内容については(まだ送っていないので)ひとまず無関係ですよね。 > >また、貼っていただいたTcpClient.javaにも不審な点はありません。 >当方で、貼っていただいたTcpClient.javaとclient_send.txtにて >実験してみましたが、正しくclient_recv.txtが生成されました。 >私の環境もWindows 10です。Apacheは2.4.23なので、ほぼ同じといってよさそうです。 > >It works!を表示したまま、とのことなので、Apacheはちゃんと起動していて、 >ブラウザからはアクセスできている状態ですよね。 >この状態で、TcpClient.javaから接続できない原因は、正直、ちょっと >思いつきません。 > >念のため確認ですが、Apacheを起動した方のコマンドプロンプトには、 >何かメッセージは出ていませんか? >私の環境では以下のメッセージが出ています。 > >C:\Apache24\bin>httpd >AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::4cd9:c88:9a45:70bc. Set the 'ServerName' directive globally to suppress this message > >これは、本来httpd.confでServerNameを指定すべきところ、やってないことに >起因するもので、この実験では問題ありません(本の中で説明していないのは >ちょっと手抜きかもしれませんが)。他に何か出ていたりしないでしょうか。 > >あるいは、ファイアウォールとかアンチウィルスソフトとかで接続が >遮断されていないでしょうか。 > >すみません、これぐらいしか思いつきません。 > > ご返信ありがとうございます。 apacheには AH00558: httpd.exe: Could not reliably determine the server's fully qualified domain name, using fe80::b097:7385:e0c9:544f. Set the 'ServerName' directive globally to suppress this message と出ております。 セキュリティソフトはNortonを入れているのでこれが原因なのかもしれません汗
[この投稿を含むスレッドを表示] [この投稿を削除]
[1987] Re:26p~27p
投稿者:(ぱ)こと管理人
2017/04/27 02:01:20

追加情報ありがとうございます。 80番に修正はしてあったわけですね。失礼しました。 その上で、今も以下のエラーが出ている、ということでよいでしょうか。 >java.net.ConnectException: Connection refused: connect > at java.net.DualStackPlainSocketImpl.connect0(Native Method) > at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) > at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) > at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) > at java.net.AbstractPlainSocketImpl.connect(Unknown Source) > at java.net.PlainSocketImpl.connect(Unknown Source) > at java.net.SocksSocketImpl.connect(Unknown Source) > at java.net.Socket.connect(Unknown Source) > at java.net.Socket.connect(Unknown Source) > at java.net.Socket.<init>(Unknown Source) > at java.net.Socket.<init>(Unknown Source) > at TcpClient.main(TcpClient.java:6) だとすれば、TcpClient.javaの6行目でWebサーバへの接続に失敗しているわけで、 client_send.txtの内容については(まだ送っていないので)ひとまず無関係ですよね。 また、貼っていただいたTcpClient.javaにも不審な点はありません。 当方で、貼っていただいたTcpClient.javaとclient_send.txtにて 実験してみましたが、正しくclient_recv.txtが生成されました。 私の環境もWindows 10です。Apacheは2.4.23なので、ほぼ同じといってよさそうです。 It works!を表示したまま、とのことなので、Apacheはちゃんと起動していて、 ブラウザからはアクセスできている状態ですよね。 この状態で、TcpClient.javaから接続できない原因は、正直、ちょっと 思いつきません。 念のため確認ですが、Apacheを起動した方のコマンドプロンプトには、 何かメッセージは出ていませんか? 私の環境では以下のメッセージが出ています。 C:\Apache24\bin>httpd AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::4cd9:c88:9a45:70bc. Set the 'ServerName' directive globally to suppress this message これは、本来httpd.confでServerNameを指定すべきところ、やってないことに 起因するもので、この実験では問題ありません(本の中で説明していないのは ちょっと手抜きかもしれませんが)。他に何か出ていたりしないでしょうか。 あるいは、ファイアウォールとかアンチウィルスソフトとかで接続が 遮断されていないでしょうか。 すみません、これぐらいしか思いつきません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1986] Re:26p~27p
投稿者:kokonotu
2017/04/26 15:12:51

>こんにちは。読んでいただきありがとうございます。 > >>>【結果】 >>java.net.ConnectException: Connection refused: connect > >エラーメッセージがこうなので、Webサーバへの接続に失敗しています。 > >TcpClient.javaは、最初は自前のサーバTcpServer.javaに接続し、 >p.26でApacheに接続しようとしていますが、 >TcpServer.javaはポート番号8001で待ち受けるのに対し、 >Apacheは(設定を変えなければ)80番で待ちます。 > >推測ですが、p.26の一番下のポート番号の変更を忘れている、 >ということはないでしょうか? >当方でやってみたら、同じエラーが再現しました。 > >違っていましたらすみません。 ご返信ありがとうございます。 現在TcpClient.javaに関しては import java.io.*; import java.net.*; public class TcpClient { public static void main(String[] args) throws Exception { try (Socket socket = new Socket("localhost",80); //localにsocketを生成 //下記のtxtに対して出力用のストリームを開く FileInputStream fis = new FileInputStream("client_send.txt"); FileOutputStream fos = new FileOutputStream("client_recv.txt")) { int ch; // client_send.txtの内容をサーバに送信 OutputStream output = socket.getOutputStream(); //ストリームの終わりに達した場合は-1が返る while ((ch = fis.read()) != -1) { output.write(ch); //読み込んだ内容をOutputStreamに } // 終了を示すため、ゼロを送信 //output.write(0); //ここではサーバーからの返信がいるためソケットは閉じない // サーバからの返信をclient_recv.txtに出力 InputStream input = socket.getInputStream(); while ((ch = input.read()) != -1) { fos.write(ch); } } catch (Exception ex) { ex.printStackTrace(); } } } と記述してあります。 client_send.txtには元々 GET /index.html HTTP/1.1 Host: localhost:8001 Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding: gzip, deflate, sdch, br Accept-Language: ja,en-US;q=0.8,en;q=0.6 Cookie: _ga=GA1.1.1220433733.1486961623; PHPSESSID=dl5oi2iab8460ino9qrupnqnr3 だったのを GET /index.html HTTP/1.1 Host: localhost:80 Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding: gzip, deflate, sdch, br Accept-Language: ja,en-US;q=0.8,en;q=0.6 Cookie: _ga=GA1.1.1220433733.1486961623; PHPSESSID=dl5oi2iab8460ino9qrupnqnr3 にしたのですがうまくいきません
[この投稿を含むスレッドを表示] [この投稿を削除]
[1985] Re:26p~27p
投稿者:(ぱ)こと管理人
2017/04/22 01:41:06

こんにちは。読んでいただきありがとうございます。 >>【結果】 >java.net.ConnectException: Connection refused: connect エラーメッセージがこうなので、Webサーバへの接続に失敗しています。 TcpClient.javaは、最初は自前のサーバTcpServer.javaに接続し、 p.26でApacheに接続しようとしていますが、 TcpServer.javaはポート番号8001で待ち受けるのに対し、 Apacheは(設定を変えなければ)80番で待ちます。 推測ですが、p.26の一番下のポート番号の変更を忘れている、 ということはないでしょうか? 当方でやってみたら、同じエラーが再現しました。 違っていましたらすみません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1984] 26p~27p
投稿者:kokonotu
2017/04/20 16:58:55

初めてkokonotuといいます。 ポインタ完全制覇をとても楽しく読ませていただきました。 今回も勉強させて頂きます。 お聞きしたい事は、apacheを起動して[It works]が表記された事が確認後、ブラウザに表示したままTcpClient.javaを起動したのですがコマンドプロンプトにエラーが出てしまいます。何卒宜しくお願い致します。 >【結果】 java.net.ConnectException: Connection refused: connect at java.net.DualStackPlainSocketImpl.connect0(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) at java.net.AbstractPlainSocketImpl.connect(Unknown Source) at java.net.PlainSocketImpl.connect(Unknown Source) at java.net.SocksSocketImpl.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.<init>(Unknown Source) at java.net.Socket.<init>(Unknown Source) at TcpClient.main(TcpClient.java:6) 【補足】 client_sendには以下のように記載しています GET /index.html HTTP/1.1 Host: localhost:80 Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding: gzip, deflate, sdch, br Accept-Language: ja,en-US;q=0.8,en;q=0.6 Cookie: _ga=GA1.1.1220433733.1486961623 【環境】 OS: windows10 apache:2.4.25 ご教授よろしくお願いいたします
[この投稿を含むスレッドを表示] [この投稿を削除]
[1983] Re:書籍「Webサーバを…」の1.3.4について
投稿者:(ぱ)こと管理人
2017/04/03 12:19:39

>GET /index.html HTTP/1.1 >Host: localhost:80 >Connection: keep-alive >Cache-Control: max-age=0 >Upgrade-Insecure-Requests: 1 >User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 >Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 >Accept-Encoding: gzip, deflate, sdch, br >Accept-Language: ja,en-US;q=0.8,en;q=0.6 昼休みなので取り急ぎですが、このclient_send.txtの末尾の空行が抜けてませんでしょうか。 リクエストは飛んでいて、ステータスが408(タイムアウト)になっていますので。 以前も同様の質問があり、その時はレスポンスは返っていたのですが… >3. サポートサイトよりDLした"TcpClient.java(Apache向け)"のファイル名を修正しコンパイル >4. "java TcpClient"で実行 > >【結果】 >25秒ほどたつと実行が終了 >client_recv.txtは生成されるが空 > >【access_log】 >127.0.0.1 - - [01/Apr/2017:16:11:02 -0700] "-" 408 - > >【補足】 >ブラウザからアクセスすると問題なく接続され、access_logにも以下のログが残ります >::1 - - [01/Apr/2017:16:15:12 -0700] "GET / HTTP/1.1" 304 - > > >【環境】 >OS: macOS Sierra 10.12.4 >Server version: Apache/2.4.25 (Unix) >javac 1.8.0_111 > > >何かわかることがございましたらご教授よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1982] 書籍「Webサーバを…」の1.3.4について
投稿者:けんと
2017/04/02 08:18:48

先日「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」を購入し読み進めています。 「1.3.4 TCPクライアントでWebサーバを叩く」の箇所で想定通りのHTTPレスポンスが得られなかったので質問させてください。 最後に詳細な環境をお伝えいたしますが、当方はMacで実行しています。 【手順】 1. Apacheを起動 2. 1.3.3で取得したserver_recv.txtをclient_send.txtにコピー(Hostのポートだけ80に修正してます) GET /index.html HTTP/1.1 Host: localhost:80 Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding: gzip, deflate, sdch, br Accept-Language: ja,en-US;q=0.8,en;q=0.6 3. サポートサイトよりDLした"TcpClient.java(Apache向け)"のファイル名を修正しコンパイル 4. "java TcpClient"で実行 【結果】 25秒ほどたつと実行が終了 client_recv.txtは生成されるが空 【access_log】 127.0.0.1 - - [01/Apr/2017:16:11:02 -0700] "-" 408 - 【補足】 ブラウザからアクセスすると問題なく接続され、access_logにも以下のログが残ります ::1 - - [01/Apr/2017:16:15:12 -0700] "GET / HTTP/1.1" 304 - 【環境】 OS: macOS Sierra 10.12.4 Server version: Apache/2.4.25 (Unix) javac 1.8.0_111 何かわかることがございましたらご教授よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1980] Re:ubuntuのgccで出来てvisualstudioで出来ない
投稿者:k
2017/02/07 23:57:09

1章読み終わりました。 HTTPのことが理解できてとても勉強になりました。 2章以降でも質問させてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1979] Re:ubuntuのgccで出来てvisualstudioで出来ない
投稿者:(ぱ)こと管理人
2017/02/05 17:31:56

>基礎からのWEBアプリケーション開発入門 >購入し読んでおります。 ありがとうございます。 >一番初めの tcp_server.c と tcp_client.cの中に sys/socket.h >が見つからずwin+visualstudioではコンパイルできません。 (紙の本なら)p.18の補足「C, C#の場合」に掲載している tcp_server.cおよびtcp_client.cですね。 説明不足だったかもしれませんが、その補足の冒頭にもあるように 「もともとTCPやソケットはUNIX上で、C言語で使用されてきたもの」なので、 Linuxではそのまま使えても、Visual StudioではWindows版のソケットライブラリ であるWinsockを使うことになります。 >sys/socket.hの中身を見てみたいのですが見当たらないのですが。。 #includeするのはsocket.hではなくwinsock2.hになりますし、 リンク時には ws2_32.libが必要です。今ぐぐったのですが、 たとえば以下のページを参考にしてください。 http://www.geekpage.jp/programming/winsock/
[この投稿を含むスレッドを表示] [この投稿を削除]
[1978] ubuntuのgccで出来てvisualstudioで出来ない
投稿者:k
2017/02/03 09:48:00

基礎からのWEBアプリケーション開発入門 購入し読んでおります。 一番初めの tcp_server.c と tcp_client.cの中に sys/socket.h が見つからずwin+visualstudioではコンパイルできません。 ubuntu 14でgccでコンパイルしたら動きました。 この違いはなんでしょうか? sys/socket.hの中身を見てみたいのですが見当たらないのですが。。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1968] Re:疑りぶかいあなたのためのオブジェクト指向再入門
投稿者:(ぱ)こと管理人
2016/09/06 23:32:31

>そこで、出来ましたら、Java の良い本をご紹介願えますと幸いです。 >何卒、宜しくお願い致します。 すみません、最近の本は知らないのですが…… 手前味噌でよければ、 「Java謎+落とし穴徹底解明」 https://www.amazon.co.jp/Java-%E8%AC%8E-%E8%90%BD%E3%81%A8%E3%81%97%E7%A9%B4-%E5%BE%B9%E5%BA%95%E8%A7%A3%E6%98%8E-%E6%A8%99%E6%BA%96%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%82%BA%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA/dp/4774113611 amazonマーケットプレイスで1円とかで買えるようです。 3章の「継承をどう使うか? どこまで使えるか?」あたりは、ある意味「疑り深い~」の 続きと言えるかと思います。 ただ、かなり古い本ですので(JDK1.3の頃)、今となっては古くなってしまっている ところもあります。Genericsや列挙がないことに不満を述べていますが、それらは Java5で実装されましたので。 あとは定番で、Effective Javaとかでしょうか…… https://www.amazon.co.jp/EFFECTIVE-JAVA-Java-Joshua-Bloch/dp/4621066056
[この投稿を含むスレッドを表示] [この投稿を削除]
[1967] Re:疑りぶかいあなたのためのオブジェクト指向再入門
投稿者:晶夫(あきお)
2016/09/05 11:13:19

前橋 殿 返信ありがとうございます。 私は小企業のIT派遣会社で働いています。 現在、常駐先が見つからず、本社にて「待機」の状況です。 そのため、この様な掲示板にカキコできる時間が取れています。 >私自身割と大手のSIerにいる身ですので、私より年上の方がコード書きの勉強を >されているとなると尊敬しますし励みになります。 私の24年間は大手の製造メーカーで従業員は2万人規模の大会社でした。 そこで、「生産管理システム・MES」の 要件定義~概要設計~基本設計~詳細設計~(開発・単体テスト)~結合テスト~ システムテスト~本番化~保全 という流れで、プログラムは保全でしか見ていませんでした。 しかし、24年間務めた会社を辞め、転職して今の小企業に居ます。 小企業なので、上述の 要件定義~以下すべて~保全 まで出来る人が派遣先が見つけやすいのです。 年齢も高いので、派遣先の年齢制限に引っかかる場合も多く贅沢は言えないのです。 そのため、保全でしかやっていなかったコーディングをやらざるを得ない状況で、 コードの勉強をしています。 「疑りぶかいあなたのためのオブジェクト指向再入門」は継続しない、との事、 残念ですが、忙しい前橋殿に置いては致し方ないと思います。 そこで、出来ましたら、Java の良い本をご紹介願えますと幸いです。 何卒、宜しくお願い致します。 晶夫
[この投稿を含むスレッドを表示] [この投稿を削除]
[1966] Re:疑りぶかいあなたのためのオブジェクト指向再入門
投稿者:(ぱ)こと管理人
2016/09/05 02:39:55

はじめまして。 >SE歴は24年になります。前橋殿より5歳上になります。 私自身割と大手のSIerにいる身ですので、私より年上の方がコード書きの勉強を されているとなると尊敬しますし励みになります。 >それが、昨日、「疑りぶかいあんたのためのオブジェクト指向再入門」 >を読ませて頂き、目からウロコが落ちました。 ありがとうございます。 >この連載は、まだ、続くと書いてありました。 >本当に期待しています。 すみません、「これから随時書き足していくつもりです」と書いたのが かれこれ10年以上前の話ですので、今から続きを書くかというとちょっとお約束 できかねるところではあります。 続きを書くとすると次のネタは「継承」ですが、よくある「Shapeを継承して PolylineやRectangleやCircleを作る」という例は、Pascalの可変レコード型や Cでそれを共用体と列挙型で真似する例のような「データメンバを拡張する例」としては なかなか便利でわかりやすいのですが、 メソッドのオーバーライドの例として、図形を描画するdraw()メソッドを作ろう、 となったあたりでかなりうさんくさくなります。よく入門書では出てくる例ですが、 実のところこの使い方は「間違い」だと私は思っています(本にも何度か書いていますが)。 その辺でうんうんうなっているうちに、10年過ぎた感じです……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1965] 疑りぶかいあなたのためのオブジェクト指向再入門
投稿者:晶夫(あきお)
2016/09/02 15:39:38

前橋和弥 殿 晶夫と申します。 学生時代からPascal やC などを個人的に勉強してきて、就職と同時にSEになった 者です。 SE歴は24年になります。前橋殿より5歳上になります。 その私でも、オブジェクト指向に入れていませんでした。 正直、オブジェクト指向のメリットが分からず、Java や VB.Net や C# の勉強をしていて、 とにかく、全然、自分の物になっていませんでした。 それが、昨日、「疑りぶかいあんたのためのオブジェクト指向再入門」 を読ませて頂き、目からウロコが落ちました。 これから、本格的にオブジェクト指向を学ぶ自信になりました。 思わず、お礼が言いたくて、この投稿を致しました。 この連載は、まだ、続くと書いてありました。 本当に期待しています。 オブジェクト指向のメリットが分からず、先へ進めずにいたのが、 進めます。 とにかく、続きをお願いいたします。 ありがとうございました。 晶夫
[この投稿を含むスレッドを表示] [この投稿を削除]
[1964] Re:Apacheへのリクエストがタイムアウト
投稿者:stonehand
2016/08/03 08:01:20

ありがとうございました。 >一応、client_send.txtの末尾の、HTTPリクエストヘッダの終わりを示す >空行を抜いたら、同様のタイムアウトが返りました。 >念のための確認ですが、同様になっていないでしょうか。 client_send.txtに改行を加えて試したところ、正しく動作しました。 今後とも、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1963] Re:Apacheへのリクエストがタイムアウト
投稿者:(ぱ)こと管理人
2016/08/03 00:22:11

>>(2)client_send.txtをここに貼ってください。 >GET /index.html HTTP/1.1 >Accept: text/html, application/xhtml+xml, */* >Accept-Language: ja-JP >User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko >Accept-Encoding: gzip, deflate >Host: localhost:8001 >DNT: 1 >Connection: Keep-Alive 見たところ不審なところはないですし、これをコピーして作った client_send.txtで、当方では正常動作しました。 症状からして、 ・タイムアウトとはいえレスポンスが返ってきているので、  Apacheと通信すること自体はできている。 ・しかし、Apacheは、HTTPリクエストを最後まで受け取れず、  タイムアウトを返している。 という状況です。 一応、client_send.txtの末尾の、HTTPリクエストヘッダの終わりを示す 空行を抜いたら、同様のタイムアウトが返りました。 念のための確認ですが、同様になっていないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1962] Re:Apacheへのリクエストがタイムアウト
投稿者:stonehand
2016/08/02 08:29:53

お手数をおかけしております。 >(1)TcpClient.javaの修正ですが、修正版のソースが「TcpClient.java(Apache版)」という > ファイル名で同梱されています。これを使ったのでないのなら、一度こちらで > 試していただけますか。 こちらでも同様にタイムアウトしました。 >(2)client_send.txtをここに貼ってください。 GET /index.html HTTP/1.1 Accept: text/html, application/xhtml+xml, */* Accept-Language: ja-JP User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko Accept-Encoding: gzip, deflate Host: localhost:8001 DNT: 1 Connection: Keep-Alive 以上ですが、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1961] Re:Apacheへのリクエストがタイムアウト
投稿者:(ぱ)こと管理人
2016/08/02 01:52:28

>書籍26-27ページの、client_send.txt、TcpClient.javaの内容を変更して実行すると >タイムアウトとなり、client_recv.txtの内容は以下のようになります。 >何が原因なのでしょうか。 情報ありがとうございます。 ただ、当方でも試しましたが再現しません。 念のためApacheのバージョンを2.4.23に上げてみましたが同じでした。 (1)TcpClient.javaの修正ですが、修正版のソースが「TcpClient.java(Apache版)」という  ファイル名で同梱されています。これを使ったのでないのなら、一度こちらで  試していただけますか。 (2)client_send.txtをここに貼ってください。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1960] Apacheへのリクエストがタイムアウト
投稿者:stonehand
2016/08/01 22:10:47

またまた、お世話になります。 書籍26-27ページの、client_send.txt、TcpClient.javaの内容を変更して実行すると タイムアウトとなり、client_recv.txtの内容は以下のようになります。 何が原因なのでしょうか。 よろしくお願いいたします。 HTTP/1.1 408 Request Timeout Date: Mon, 01 Aug 2016 12:49:29 GMT Server: Apache/2.4.23 (Win64) Content-Length: 221 Connection: close Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>408 Request Timeout</title> </head><body> <h1>Request Timeout</h1> <p>Server timeout waiting for the HTTP request from the client.</p> </body></html>
[この投稿を含むスレッドを表示] [この投稿を削除]
[1959] Re:書籍「Webサーバを…」の1.3.3について
投稿者:(ぱ)こと管理人
2016/08/01 01:02:12

>実際に先にブラウザを閉じてしまうと、TcpServerは「java.net.SocketException: Connection reset」の例外をcatchしてスタックトレースを吐いた後に終了します。 確認しました。 確かにIEで試すと、例外を吐いて終了しました。 ただ、Firefoxで試すと、やはり-1を返して無限ループに入りました。 本書は対象をIEとうたっているので何らかのフォローはしようと思いますが、 FirefoxとIEで動きがどう違うのか、現時点ではわかっていません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1958] 書籍「Webサーバを…」の1.3.3について
投稿者:E2E4E9E4
2016/07/30 00:31:48

お世話になります。 以前に1.5.4について質問させていただいたものです。 その節はありがとうございました。(お礼が遅れてすみません) 今回もまた質問させてください。 p24では、「( 先にブラウザを閉じてしまうと、ソケットが閉じられて、ソケット切断後はInputStream.read()は-1を返すのですが、TcpServerはそれに対するチェックを入れていないので無限ループに入ります……)」とあります。 これは、 「(TcpServerは、17行目でクライアントから終了マークである0を受け取るまで処理を継続するようになっていますが、本物のWebブラウザはこのような終了マークを送らないからです)」 とすべきではないでしょうか。 実際に先にブラウザを閉じてしまうと、TcpServerは「java.net.SocketException: Connection reset」の例外をcatchしてスタックトレースを吐いた後に終了します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1957] 最新版を導入、解決しました
投稿者:stonehand
2016/07/29 09:11:04

お手数をおかけしました。 ご指摘の通り、最新版を導入し正しく動作いたしました。 C:\>javac -version javac 1.8.0_101 C:\oza\src\chap01>javac TcpServer.java C:\oza\src\chap01>java TcpServer クライアントからの接続を待ちます。 今後とも、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1956] Re:コンパイルできない
投稿者:stonehand
2016/07/29 08:22:06

お世話になります。 >お使いのJavaが、Java6以前のものなのではないでしょうか。 >javac -versionで何が表示されますか? C:\>java -version java version "1.8.0_91" Java(TM) SE Runtime Environment (build 1.8.0_91-b15) Java HotSpot(TM) 64-Bit Server VM (build 25.91-b15, mixed mode) C:\>javac -version javac 1.6.0_21 となっています。 よろしく、お願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1955] Re:コンパイルできない
投稿者:(ぱ)こと管理人
2016/07/28 22:16:22

>例えば >C:\oza\src\chap01>javac TcpServer.java >TcpServer.java:6: '{' がありません。 > try (ServerSocket server = new ServerSocket(8001); これで見当が付きました。このtryの構文は、Java7から導入された try-with-resource文です。 http://docs.oracle.com/javase/jp/7/technotes/guides/language/try-with-resources.html お使いのJavaが、Java6以前のものなのではないでしょうか。 javac -versionで何が表示されますか? なお、この本の対象はJava8です。本の中に明記した個所があったのでは、 と思い探してみたのですが、あれ? 見当たらない……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1954] Re:コンパイルできない
投稿者:stonehand
2016/07/28 14:30:44

お手数をおかけしております。 >・そもそもOSは何ですか? この本はWindowsを想定しているので、 Windows7Pro 64 bit > ソースの文字コードはShift-JIS, 改行はCR LFになっています。 >・どこからダウンロードしたファイルですか? ページのURLと > ファイル名を教えてください。 書籍8ページにあります http://kmaebashi.com/webserver/index.html より、ダウンロードはこちらから。 ./src_20160619.zip >・javacを実行したディレクトリに入っているファイルの一覧を教えてください。 Chap01ディレクトリの内容 C:\oza\src\chap01>dir /b C CSharp Modoki01 server_send.txt TcpClient.java TcpClient.java(Apache向け) TcpServer.java TcpServer.txt >・エラーメッセージをコピペして、ここに貼ってください。 例えば C:\oza\src\chap01>javac TcpServer.java TcpServer.java:6: '{' がありません。 try (ServerSocket server = new ServerSocket(8001); ^ TcpServer.java:6: ')' がありません。 try (ServerSocket server = new ServerSocket(8001); ^ TcpServer.java:8: ';' がありません。 FileInputStream fis = new FileInputStream("server_send.txt")) { ^ TcpServer.java:27: 'catch' への 'try' がありません。 } catch (Exception ex) { ^ TcpServer.java:27: ')' がありません。 } catch (Exception ex) { ^ TcpServer.java:27: 文ではありません。 } catch (Exception ex) { ^ TcpServer.java:27: ';' がありません。 } catch (Exception ex) { ^ TcpServer.java:6: 'try' への 'catch' または 'finally' がありません。 try (ServerSocket server = new ServerSocket(8001); ^ TcpServer.java:31: 構文解析中にファイルの終わりに移りました } ^ エラー 9 個 以上のようですが、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1953] Re:コンパイルできない
投稿者:(ぱ)こと管理人
2016/07/28 00:32:19

>「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」を購入し >悪戦苦闘しております。 こんにちは。お買い上げいただきありがとうございます。 > 始めの一歩、ソースをダウンロードし、TcpServer.javaおよびTcpClient.java等をコンパイルしようとし、 > >>javac *.java > >などとしましたが、エラーが出てしまい先に進めません。 >エラーの内容は、(がありませんとか、{がありませんとか等です。 本を見ながら手で打ち込んだのならともかく、ダウンロードしたソースで、 「(がありませんとか、{がありませんとか」レベルのコンパイルエラーが出るのは 考えにくいのですが… ・そもそもOSは何ですか? この本はWindowsを想定しているので、  ソースの文字コードはShift-JIS, 改行はCR LFになっています。 ・どこからダウンロードしたファイルですか? ページのURLと  ファイル名を教えてください。 ・javacを実行したディレクトリに入っているファイルの一覧を教えてください。 ・エラーメッセージをコピペして、ここに貼ってください。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1952] Re:PHPで掲示板を作りたい
投稿者:(ぱ)こと管理人
2016/07/28 00:13:08

>そんな私がこれからPHPを学ぶために掲示板を一から作っていきたいのですが、 >どのようにして始めればいいでしょうか? まず、私のサイトにある「PHPとMySQLで掲示板を作る」は、PHP ver.4の頃に 書いたものなので内容が古くなっておりお勧めできません。 Google等で検索のうえ、新しめの記事を探してみてはいかがでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1951] コンパイルできない
投稿者:stonehand
2016/07/27 17:22:42

 ばじめまして、よろしくお願いします。  このような質問をすると、対象読者ではないのではとお叱りを受けそうですが、 「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」を購入し 悪戦苦闘しております。  始めの一歩、ソースをダウンロードし、TcpServer.javaおよびTcpClient.java等をコンパイルしようとし、 >javac *.java などとしましたが、エラーが出てしまい先に進めません。 エラーの内容は、(がありませんとか、{がありませんとか等です。  初歩の初歩、基本的な質問で申し訳ありませんが、コンパイルの手順について詳しく教えていただけますか。よろしくお願い申し上げます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1950] PHPで掲示板を作りたい
投稿者:nikuudon
2016/07/26 16:43:44

はじめまして PHPは超がつくほどの初心者です。 if文やらfor文やらは内容は理解できたのですが、どう使っていけばいいのかが わかりません。 そんな私がこれからPHPを学ぶために掲示板を一から作っていきたいのですが、 どのようにして始めればいいでしょうか? すいません、お教え下さい。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1949] Re:書籍「Webサーバを…」の1.5.4について
投稿者:(ぱ)こと管理人
2016/07/17 17:06:07

はじめまして。ご意見ありがとうございます。 >この2点を実装するためにやるべきことして「マルチスレッド」を挙げていますが、マルチスレッドは必須ではないはずです。実際にマルチスレッド化しなくても(単純な永久ループ化)それなりに動きました。 >この点についてWeb版の記述を見たのですが、そこでは「たくさんの接続先からの接続を並行して受け付けられなければなりません。 」とありマルチスレッドの必要性を説明していました。 >書籍版よりもWeb版の方が親切な説明だと思うのですが、なぜ書籍版のような説明にしたのでしょうか。 書籍版はWeb版を元にしていますから、この記述については「意図して抜いた」のだと思います。 記憶はだいぶあいまいですが、おっしゃるように、単純な永久ループでもそれなりに動く以上、「たくさんの接続先からの接続を『並行して受け付けられなければなりません』」と書いてしまうと、それはそれで不正確というか、ツッコミを受けてしまうかなあ、と腰が引けて抜いたように思います。 もちろん複数スレッドで応答した方がパフォーマンスがよいのは確かですから、陽にそう書くべきだったかも、とは思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1948] 書籍「Webサーバを…」の1.5.4について
投稿者:E2E4E9E4
2016/07/17 15:46:09

はじめまして。 Webサーバの勉強をしようと思い、書籍「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」を読んでおります。 少し疑問に思うことがあり、質問させていただきます。 "1.5.4 普通にWebページを表示できるようにする"では、以下の機能を実装しようとしています。 ・tcp接続を繰り返し受け付けるようにする ・ファイル種別に応じたContent-typeの設定 この2点を実装するためにやるべきことして「マルチスレッド」を挙げていますが、マルチスレッドは必須ではないはずです。実際にマルチスレッド化しなくても(単純な永久ループ化)それなりに動きました。 この点についてWeb版の記述を見たのですが、そこでは「たくさんの接続先からの接続を並行して受け付けられなければなりません。 」とありマルチスレッドの必要性を説明していました。 書籍版よりもWeb版の方が親切な説明だと思うのですが、なぜ書籍版のような説明にしたのでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1944] Re:magic_quotes_gpc
投稿者:(ぱ)こと管理人
2016/07/06 08:01:57

……。 これは、何を言いたいのでしょうか……。 「PHPとMySQLで掲示板を作る」 http://kmaebashi.com/programmer/bbs_dev/index.html の内容が古いので、注意書き付けるなり削除するなりしろよってこと?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1943] magic_quotes_gpc
投稿者:Naohiro19
2016/07/05 08:57:46

PHPにおいて 「magic_quotes_gpc」は5.4.0以降は、デフォルトでOFFに設定されています。 また、mysql_connectなどの巻数がPHP5.5.0以降は非推奨となり、PHP7.0.0で拡張ライブラリが削除されています。 PHPからMySQLに接続するには PDO(PHP Data Object)を使わなければなりません。 PDOの prepare(プリペア)メソッドを使うと名前付きパラメータ(:nameなど)や疑問符パラメータ(?)を利用できます。 例えば ホスト:localhost ユーザー名:root パスワード:なし データベース名:bbs_phpとしてutf-8で接続する場合はこのように書けばOKです。 PDOクラスはPDOExceptionという例外を投げてくるので try-catchで囲む必要があります。 try { $dbh = new PDO('mysql:host=localhost;dbname=bbs_php;charset=utf8','root',''); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); }catch(PDOException $e){ echo $e->getMessage(); exit; } で接続が完了します。 PDOでのデータベースを操作する場合は「ドットインストール」というサイトの「PHPデータベース入門」という動画を視聴してください。 フォームにおいてユーザー入力を$_POST/$_GETで入力を受け取ってはいけないらしいので代わりとなるのが filter_input関数です。 たとえば <input type="text" name="message"> とフォームを入力する欄があるとします。 受け取る場合は $message = isset($_POST['message'] ? $_POST['message'] : null; とするのではなく $message = (string)filter_input(INPUT_POST, 'message'); とするべきでしょう。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1942] Re:変数とは何か
投稿者:var
2016/06/16 23:47:13

ご回答ありがとうございました。 なるほど。 >コンパイル後の オブジェクトファイルに残ってすらいません。 このあたりでピンときました。 スタックマシンタイプであれば、スタックポインタからの位置で参照できるため、 処理系が紐付けてくれているんですね。 変数という文字列なのかシンボルみたいなものがどこかで管理され、 それが参照する先が、例えば数字の5の格納位置を見ている、のようなイメージを持ってしまい混乱していまいました。 大変ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1941] Re:変数とは何か
投稿者:(ぱ)こと管理人
2016/06/16 04:05:24

はじめまして。 >変数hogeのアドレス(&hoge)は"0xbfbfd9e4"。 >そこに数値5をint型で配置する。 >これは分かるのですが、変数hoge自体は、誰がどこで管理しているのでしょうか。 > >図表では、0xbfbfd9e4アドレスからの始まりに5が格納されており、これは分かります。 >しかし、同時に、"hoge"もあります。この辺りで混乱しております。 誤解を招いたなら申し訳ないですが、p.034のFig.1-1において、 図の中に「hoge」が書いてあるのは、読者にとってわかりやすくするためで、 プログラムの実行時に「hoge」という名前がどこかに保持されているわけではありません。 Cの場合、コンパイル時にデバッグオプションを付けたりしない限り、 たいていは、ローカル変数の変数名(この場合hoge)は、コンパイル後の オブジェクトファイルに残ってすらいません。 ではどのように変数hogeを参照しているのかといえば、素朴な実装では、スタック内の、 現在実行中の関数の使用領域(p.095のFig.2-5において、「func()から見える領域」と 書いてある範囲。スタックフレームと言います)内の位置が、コンパイル後の 機械語コードに埋め込まれていて、それを使用して参照します。 こちらの図↓で言えば、BPからの相対位置でアクセスします。 http://www.c-tipsref.com/words/stackframe.html グローバル変数やstatic変数は、リンクの時点でアドレスが決まります。 「2-4-2 分割コンパイルとリンク」を参照してください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1940] 変数とは何か
投稿者:var
2016/06/14 23:48:25

変数とは何か?という議論がWEBでされているのを見かけ自分の一抹の理解の不足を感じ、"C言語ポインタ完全制覇"を開きました。 非常に分かりやすい説明で、変数の理解が得られた、と思ったと同時に、新しい疑問が湧きました。 先の本の序盤で以下の例があります。 int hoge = 5; 変数hogeのアドレス(&hoge)は"0xbfbfd9e4"。 そこに数値5をint型で配置する。 これは分かるのですが、変数hoge自体は、誰がどこで管理しているのでしょうか。 図表では、0xbfbfd9e4アドレスからの始まりに5が格納されており、これは分かります。 しかし、同時に、"hoge"もあります。この辺りで混乱しております。 0xbfbfd9efアドレスからintの大きさまで == hogeという変数 というその紐付けはまたどこかでやっている?ということでしょうか。 恐らく基礎中の基礎のような気もしますが、調べる限り解答にたどり着けず、 理路整然とした解説で好感持っている前橋様に質問させていただいた次第です。 ※ご迷惑おかけします。誤字あったため同内容で再投稿。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1937] Re:単語の出現頻度を数えるプログラムについて
投稿者:(ぱ)こと管理人
2016/05/21 01:18:36

>単語の出現頻度を数えるプログラムがリンカできません。_mainが未解決とエラーが >表示されます。解決方法を教えてください。 はじめまして。 「ポインタ完全制覇」の5章を読んでのことかと思います。読んでいただきありがとうございます。 「_mainが未解決」ということは、つまりmain関数がリンクされていないということです。 単語の出現頻度のプログラムは、List5.3 main.cが、配列版、連結リスト版両方の 共通のメインルーチンとなりますので、これもリンクしてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1936] 単語の出現頻度を数えるプログラムについて
投稿者:くま
2016/05/20 15:33:22

単語の出現頻度を数えるプログラムがリンカできません。_mainが未解決とエラーが表示されます。解決方法を教えてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1935] Re:プログラムを頂きます。
投稿者:みうら
2016/05/14 17:10:37

>>とても綺麗な掲示板ですね! > >ありがとうございます。 > >>これはフリーで使わせて頂いて宜しいのですか? > >Webで公開しているものはご自由に使っていただいて構いませんが、 >だんだん拡張したもののソースを順次貼っているのでそっくりそのままでは >動かないかもしれませんし、PHPのver.4の頃に作ったものなので今となっては >古いコードでもあります。 > >そのあたりを了解の上自己責任で使われるのであれば、ご自由にしてください。 > いいですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1934] Re:プログラムを頂きます。
投稿者:(ぱ)こと管理人
2016/05/12 00:44:36

>とても綺麗な掲示板ですね! ありがとうございます。 >これはフリーで使わせて頂いて宜しいのですか? Webで公開しているものはご自由に使っていただいて構いませんが、 だんだん拡張したもののソースを順次貼っているのでそっくりそのままでは 動かないかもしれませんし、PHPのver.4の頃に作ったものなので今となっては 古いコードでもあります。 そのあたりを了解の上自己責任で使われるのであれば、ご自由にしてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1933] プログラムを頂きます。
投稿者:ブラブラボール
2016/05/10 03:20:04

とても綺麗な掲示板ですね! これはフリーで使わせて頂いて宜しいのですか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1930] kmaebashi.comが停止していました
投稿者:(ぱ)こと管理人
2016/03/03 02:35:36

すみません、私がkmaebashi.comのサーバ料金の振り込みを忘れていたため、 kmaebashi.comが2/29~3/1にかけて停止していたようです。 現在は振り込みましたので復旧しています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1929] Re:訂正
投稿者:(ぱ)こと管理人
2016/02/21 20:53:08

>【文】の elseif、elsifになっていました ちょっとどう対応すればよいのかわからなくて1ヵ月以上放置してしまいました。 今さら書いても投稿者の「けろ」さんは読んでおられないとは思うのですが。 これが、crowbarやらDiksamやらにおいて、else ifがelseifではなくて elsifになっている、というご指摘であれば、それは意図したものです。 こちらを参照してください。 http://kmaebashi.com/zakki/lang0001.html
[この投稿を含むスレッドを表示] [この投稿を削除]
[1928] 訂正
投稿者:けろ
2016/01/12 17:53:25

【文】の elseif、elsifになっていました
[この投稿を含むスレッドを表示] [この投稿を削除]
[1921] おすすめの本はありますか?
投稿者:hello
2015/10/29 01:33:14

はじめまして!前橋さんのCでプログラミング言語を描く方法ガイドを今見つけたのですが、学校でパスカルのコンパイラをJavaで書く勉強をしていますがあまりよくわかりません。なにかおすすめの勉強法かウェブサイトか本はありますか?前橋さんのCのガイドに従ったらある程度わかるようになりますか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1920] Re:C言語ポインタ完全制覇について質問
投稿者:(ぱ)こと管理人
2015/10/22 01:18:10

>222pのlist4-8 read_file.cをコンパイルすると >$ gcc -o read_file read_file.c >C:/DOCUME~1/中村多~1/LOCALS~1/Temp/cc8001MB.o:read_file.c:(.text+0xa9): undefined reference to `read_line' >collect2: ld returned 1 exit status というエラーがでます。 >read_file.cの中に extern char *read_line(FILE* fp);と定義して実行していますが、 >コンパイルできません。どこが間違っているか教えてください。 >`read_line'はread_line.cに定義されている関数です。 単純に、そのread_line.cをリンクしていないからではないでしょうか。 $ gcc -o read_file read_file.c read_line.c
[この投稿を含むスレッドを表示] [この投稿を削除]
[1919] C言語ポインタ完全制覇について質問
投稿者:sanchu
2015/10/21 17:43:49

222pのlist4-8 read_file.cをコンパイルすると $ gcc -o read_file read_file.c C:/DOCUME~1/中村多~1/LOCALS~1/Temp/cc8001MB.o:read_file.c:(.text+0xa9): undefined reference to `read_line' collect2: ld returned 1 exit status というエラーがでます。 read_file.cの中に extern char *read_line(FILE* fp);と定義して実行していますが、 コンパイルできません。どこが間違っているか教えてください。 `read_line'はread_line.cに定義されている関数です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1918] Re:C言語ポインタ完全制覇について質問
投稿者:774RR
2015/10/20 06:50:02

だいたいいい感じだと思います。細かいところで間違っているようですけど... int a[7]; に対して、使える要素は a[0]..a[6] の7個です。 a[7] を使ってはいけません。 read_line を使ってないようですけど・・・ お勉強ならこういうコメントを入れてみるのはとてもお勧めです。 実用に供するソースコードにこんなコメントが入っていたらそいつの実力を疑います。 (ってか以後、コード系の仕事回しませんけど)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1916] キャップ付きハンドサイズスクレーパー
投稿者:キャップ付きハンドサイズスクレーパー
2015/10/10 11:07:47

カーフィルム施工ツール巾着は分厚い材料に使いやすい設計で、フィルム施工の時にツールの取りに大変便利を与えました。施工道具補助ツールを買いたければ、カーライトフィルムツールhttp://www.caright.net/をぜひおすすめします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1913] 蟻力神
投稿者:蟻力神
2015/09/21 12:45:07

蟻力神(イーリーシン)を「勃起不全に効果的!」という口コミを信じて購入しました!確か に効果はありましたが、飲んだ感想としては副作用もあるのでオススメはできないですね 。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1912] Re:Flex
投稿者:(ぱ)こと管理人
2015/08/24 01:59:14

>どうやら、flexの方はGNUじゃないようです。 ご指摘ありがとうございます。 正直、無料公開しているWeb記事はさておき、書籍の方で嘘を書いていたら大変だ、 と思い確認したところ書籍の方にはflexがGNUであるという記述はありませんでした… Web記事の方の更新を怠っていたようです。 後ほど修正いたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1911] Flex
投稿者:flex
2015/08/19 23:54:31

http://kmaebashi.com/programmer/c_yota/calc.html の記事を読ませて頂きました。 flexがlexのgnu版と書いてありますが、WIkipediaには Unlike Bison, flex is not part of the GNU Project.[4] と書いてありました。 どうやら、flexの方はGNUじゃないようです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1910] Re:単語の出現頻度を表示するプログラムについて
投稿者:マロン
2015/08/09 00:19:32

>管理人様 > >C言語ポインタ完全制覇を熟読しています。単語の出現頻度を表示するプログラムについて、osはwindows7,visualStudio2015でビルドしようとしたところ以下のエラーが出てしまい、解決方法がわかりません。つきましては、解決の仕方をお教え頂きたく思います。よろしくお願いいたします。未解決の外部参照となってしまいます。 > >LNK1120 1 件の未解決の外部参照 word_count2 > >\Documents\Visual Studio 2015\Projects\CPlus\word_count2\Debug\word_count2.exe 1 > >LNK2019 未解決の外部シンボル "int __cdecl get_word(char *,int,struct _iobuf *)" (?get_word@@YAHPADHPAU_iobuf@@@Z) が関数 _main で参照されました。 > >Documents\Visual Studio 2015\Projects\CPlus\word_count2\word_count2\main.obj 1 > 解決しました。つまらんこと聴いてごめんなさい。削除してもらって構いません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1909] 単語の出現頻度を表示するプログラムについて
投稿者:マロン
2015/08/08 22:22:36

管理人様 C言語ポインタ完全制覇を熟読しています。単語の出現頻度を表示するプログラムについて、osはwindows7,visualStudio2015でビルドしようとしたところ以下のエラーが出てしまい、解決方法がわかりません。つきましては、解決の仕方をお教え頂きたく思います。よろしくお願いいたします。未解決の外部参照となってしまいます。 LNK1120 1 件の未解決の外部参照 word_count2 \Documents\Visual Studio 2015\Projects\CPlus\word_count2\Debug\word_count2.exe 1 LNK2019 未解決の外部シンボル "int __cdecl get_word(char *,int,struct _iobuf *)" (?get_word@@YAHPADHPAU_iobuf@@@Z) が関数 _main で参照されました。 Documents\Visual Studio 2015\Projects\CPlus\word_count2\word_count2\main.obj 1
[この投稿を含むスレッドを表示] [この投稿を削除]
[1908] Re:Java謎+落とし穴について
投稿者:
2015/08/02 22:36:50

早々にありがとうございます。すっきり理解できました。 10年(ドッグイヤーなら70年)以上前の本への疑問に、「そこまで面倒見られないよ」と言わず答えて下さり、感謝です。 久野禎子・靖さんの著書など、良い本もあるのですが、これでさえ索引に「参照」がないことに、首を傾げています。 そういうわけで『Java謎+落とし穴』は、メモリモデルで考えるためには、現在も唯一無二の拠り所となっています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1907] Re:Java謎+落とし穴について
投稿者:(ぱ)こと管理人
2015/08/02 13:11:34

>暑中お見舞い申し上げます。 こんにちは。 >『Java謎+落とし穴』で、二つ質問があります。 >見方によっては、各オブジェクトが、間接的にではありますが、それぞれ実行コードへのポインタを持つように思えるのですが、いかがでしょう。 「間接的に」実行コードへのポインタを持つのはその通りですね。 ここは、メソッドが10個あった時、各オブジェクトが10のポインタを持つ必要はないですし、 オブジェクトごとに実行コードへのポインタが書き換わることはない、という意味で 書きました。 (プロトタイプベースのオブジェクト指向だと、実際オブジェクトごとに持っていたり しますし) >・177ページ「draw()メソッドを呼び出す部分はPolylineやCircleにまったく依存しません(その構造体を宣言しているヘッダファイルを#includeする必要がない)」について。 >このdraw()メソッドは、183ページのdrawShape(shapes[i])メソッドと同じでしょうか。ここではmain.cに、各ヘッダファイルをincludeしているように見えます。 ここはわかりにくかったですね。 createPolyline()等は各図形の.hで宣言されているわけで、 各図形をnewするところでは各ヘッダファイルが必要です。 ただ、描画するところ(「draw()メソッドを呼び出す部分」)は、 Polyline.hやCircle.hにまったく依存しません。 (これはJavaにおいても同じことで、newするところは各クラスに依存します)。 この例では、main.cでnewと描画を両方やってしまっているので、 おっしゃるとおり、「main.cでincludeしているではないか」と疑問を持たれるのは わかります。 main.cの描画部分(17~20行目)を、draw.cとか、別ソースに分けておくべきだったかも しれません。 10年以上前の本ですが、ご指摘感謝いたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1906] Java謎+落とし穴について
投稿者:
2015/08/02 00:11:09

暑中お見舞い申し上げます。 『Java謎+落とし穴』で、二つ質問があります。 ・46ページ「メソッドの実行コードへのポインタは、オブジェクトごとではなくクラスごとに持てばよい」について。 他方、175ページでは、「各オブジェクトにクラスディスクリプタへのポインタを持たせる」こととされています。 見方によっては、各オブジェクトが、間接的にではありますが、それぞれ実行コードへのポインタを持つように思えるのですが、いかがでしょう。 「①オブジェクトの持つポインタ→②クラスディスクリプタの持つポインタ→③メソッドテーブルの持つポインタ」となっていて、確かに②と③(リフレクションを考えない限り、実質区別なし)は、オブジェクトごとではなく、クラスごとなのかもしれませんが… ・177ページ「draw()メソッドを呼び出す部分はPolylineやCircleにまったく依存しません(その構造体を宣言しているヘッダファイルを#includeする必要がない)」について。 このdraw()メソッドは、183ページのdrawShape(shapes[i])メソッドと同じでしょうか。ここではmain.cに、各ヘッダファイルをincludeしているように見えます。 (これは、たぶん私の誤解、誤読だと思いますが) ご教示をお願いできましたら幸いです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1905] Re:「PHPとMySQLで掲示板を作る」拝見しました。
投稿者:(ぱ)こと管理人
2015/03/10 02:25:38

>本題に入りますが、投稿内容を<PRE>タグで囲むということ(仕様を考えるのページ)ですが、それでは ><br /> >タグが使用できず改行ができなくなる、ということになります。 まず、この掲示板は、用途的にプログラムソースを貼ることが多いので、 基本等幅フォントで表示する必要がある、というのが<PRE>で囲むようにした 理由です。ただし、等幅フォントにするだけなら<TT>で囲めばよいので、 現状ではそうしています。 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&thread=25 <PRE>で囲むと、投稿者が改行を入れなかった場合、画面が際限なく 右に伸びて崩れてしまうので改善したわけです。 というわけで、<PRE>タグ云々の話はすでに現状の実装とはずれているわけですが、 >そこで思ったのですが、そもそも<PRE>タグを使用せずに<や>の記号を無効にすればいいのでは、ということです。 <PRE>タグの中であっても、<や>の記号は普通に特殊文字としての 意味を持ちます。たとえば以下のページに載せているサンプルソースでは、 ソース全体を<PRE>で囲んでいますが、行番号は<FONT>タグで青字にしていますし、 ソース内で<やら>やら"やらを使うときには&lt;とか&gt;とか&quot;とかに しています。 http://kmaebashi.com/programmer/bbs_dev/newbbs.html >そして思ったのが、phpのhtmlspecialchars()関数です。HTMLにとって特別な意味の<>をすべて単なる文字に変換してくれるという非常に便利な関数です。詳しいことは検索などお願いします。 よって、この手のエスケープは、どちらにせよ必要であり、 htmlspecialchars()もすでに随所で使っています。 例) http://kmaebashi.com/programmer/bbs_dev/list.html >要するに、 >$test = $_GET["test"]; >を、 >$test = htmlspecialchars($_GET["test"]); >のようにしてしまおう、という考えです。こうすれば、<PRE>を使わずに済むため、改行が実現できると思います。 ところで、この例だと、入力の時点でhtmlspecialchars()をかけていますが、 これはそもそも考え方が間違っている、ということをこちらで書いています。 http://kmaebashi.com/zakki/zakki0042.html htmlspecialchars()をかけるのは入力時ではなく出力時にすべきです。 で、上記の記事でも言い訳を書いていますが、そして「PHPとMySQLで掲示板を作る」 内にも注釈を足していますが、 http://kmaebashi.com/programmer/bbs_dev/index.html 現状の「PHPとMySQLで掲示板を作る」のプログラムは(実際にここで動いている 掲示板もそうなのですが)、PHP4の時代のデフォルトであるmagic quoteを使って いるので、今となってはよくないプログラムなんですよねえ。 本記事、注釈を付けつつ公開を続けてきましたが、初心者を惑わせるのも よろしくないので、そろそろ消すべきかもしれません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1904] 「PHPとMySQLで掲示板を作る」拝見しました。
投稿者:html21315
2015/03/08 10:20:38

突然失礼します。 ホームページ拝見いたしました。phpで掲示板を作るという発想はありませんでした。 本題に入りますが、投稿内容を<PRE>タグで囲むということ(仕様を考えるのページ)ですが、それでは <br /> タグが使用できず改行ができなくなる、ということになります。 そこで思ったのですが、そもそも<PRE>タグを使用せずに<や>の記号を無効にすればいいのでは、ということです。 そして思ったのが、phpのhtmlspecialchars()関数です。HTMLにとって特別な意味の<>をすべて単なる文字に変換してくれるという非常に便利な関数です。詳しいことは検索などお願いします。 要するに、 $test = $_GET["test"]; を、 $test = htmlspecialchars($_GET["test"]); のようにしてしまおう、という考えです。こうすれば、<PRE>を使わずに済むため、改行が実現できると思います。 -追伸- ほとんどのユーザーは、改行を投稿の中でしたいとき<BR>ではなく単にEnterキーを使って改行をします。これを掲示板上で再現するためには<BR>を使わなければいけないので、そこが私が掲示板作りをしたときの悩みどころでした。 そこで、便利なPHPの関数を見つけましたので紹介します。 nl2br() 改行記号の前に<br />を挿入してくれるというありがたいものです。 $test = nl2br( htmlspecialchars( $_GET["test"] ) ); 一行にするとこうなりますが、わかりやすく書くと $test = $_GET["test"]; //取得 $test = htmlspecialchars($test); //<>の無効化 $test = nl2br($test); //<br />挿入 長文失礼しました。 ※先日誤ってメールで送信してしまいましたが、やはり掲示板に書き込むべきだと、掲示板の方に再投稿しました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1903] Re:オーバーライド時の共変、反変について
投稿者:(ぱ)こと管理人
2015/02/25 03:35:46

>Javaだとこの場合ははオーバライドにはならないで、オーバーロード、 >引数型が違う同名の別メソッドが増えただけと見なすことでガードするという実装なんですね。 こう言っては何なのですが、たぶんこれはJavaを「買いかぶりすぎ」だと思うのです。 引数については、反変はOK、共変はNG、 戻り値については、共変はNG、反変はOK なのですが、 JDK1.4までのJavaでは、 引数については、型が違えばオーバーロード、 戻り値については、型が違えばコンパイルエラー でした。戻り値については共変は許されるべきなのに、古いJavaではコンパイルエラーに してしまっていたのです。 Javaでは、JDK1.5(Tiger)において、「共変戻り値」が許されるようになりました。 後になってこれを許すようになったということは、 当初は、共変とか反変とかそんなことはJavaの作者はあんまりまじめに考えていなくて、 後になって、共変戻り値はOKにすることができたけれど、反変引数は、既にそれを オーバーロードという機能で使ってしまっていたためにOKにできなかったのではないか、 と思います。 メソッドオーバーロードがすごく便利だから反変引数を捨ててでもそちらを取った、 というのは言語設計者の選択肢として理解できますが(私はオーバーロードが便利だと 思わないのでその選択肢は取りませんが)、 本来使えるべき共変戻り値を当初エラーにしてしまっていた(しかも1.5でそれを 撤回した)というのは、あまりこう、ちゃんと考えた結果には見えないんですよねえ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1902] Re:diksamの実装に関して
投稿者:lang
2015/02/24 22:31:49

本質問に関してもご回答ありがとうございます。 8-4-9章に記載あるAとBがクラスの場合の条件の意図をつかめず、 少し混乱しておりましたが、 実行時にチェックする価値があるという視点で読み直すと理解できました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1901] Re:オーバーライド時の共変、反変について
投稿者:lang
2015/02/24 22:31:14

ご丁寧にご回答ありがとうございました。 理解できました。 確かに、引数時はダウンキャストになりますね。 Javaだとこの場合ははオーバライドにはならないで、オーバーロード、 引数型が違う同名の別メソッドが増えただけと見なすことでガードするという実装なんですね。 前橋さんの書籍で共変、反変という言葉を知ったのですが、 非常に一般的な概念のようでした。 直接Diksamとはご関係のない質問になってしまい大変恐縮です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1900] Re:diksamの実装に関して
投稿者:(ぱ)こと管理人
2015/02/24 02:58:14

>"プログラミング言語を作る"の8-4-9章の >A instance of B >の記載に関してです。 > >A、Bがクラスの場合、 >AとBが同じクラスか、AがBのスーパークラスの場合のみ、 >真になる可能性がある、 >とあります。 こちらは説明が不適切な気がしてきました…… たとえばShapeクラスのオブジェクトshapeがあったとき、 shape instanceof Circle という式は、「真になる可能性がある」と言えます。 instanceofは、こうしてクラスをチェックするために使うものでしょう。 全然違う、circle instanceof Windowなら、そもそもコンパイルエラーです。 ここで「真になる可能性がある」と書いているのはそういう意味です。 逆に circle instanceof Shape は、常に真です。常に真ならそれもやっぱり真になるのではないか、 というところですが、その下の説明にあるように、そもそもDiksamは こういうコードは無駄なのでコンパイルエラーにしています。 そういう意味で、実行時にチェックする価値がある、ということで 「真になる可能性がある」と書いたのかもしれませんが、それにしては 「AとBが同じクラスか」部分が余計です。クラスが同じならやっぱり 無駄だからです。 今は時間が時間なので、後日(週末をめどに)正誤表に載せるなり対応を考えます。 ご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1899] Re:オーバーライド時の共変、反変について
投稿者:(ぱ)こと管理人
2015/02/24 02:39:59

はじめまして。最近この掲示板もすっかり閑散としてしまっていて、 投稿に気付くのが遅れてしまいました。すみません。 ご質問いただきありがとうございます。 引用の順番を変更しますが、結論から言えば、 >戻りの値の型が共変、引数の型が共変、 >ともにダウンキャストとなる、という認識ですが、 >なぜ、問題の有無の判断が変わってくるのでしょうか。 引数の型が共変なのはダウンキャストですが、 戻り値の型が共変なのはアップキャストだからです。 >”プログラミング言語を作る”内の8-3-5章にて >下の解説を読みました。 p.289のコードですね。 >class ShapeArray{ > Shape get(int index); > void set(int index, Shape shape); >}; > >class CircleArray extends ShapeArray{ > Circle get(int index); ・・・① > void set(int index, Circle circle); ・・・② >}; まず、このコードは、 p.249の補足で、JavaのArrayStoreExceptionの説明をしていますが、 JavaがArrayStoreExceptionを発生させるという実行時チェックを しなければならなくなった、ということについて、共変の考え方からも 説明できる、ということを示すためのコードです。 ここまではよいでしょうか。 p.249の補足のサンプルコードで、 1: Line[] lines = new Line[10]; 2: Shape[] shapes = lines; 3: shapes[3] = new Circle(); というコードがあったとき、Javaでは3行目でArrayStoreExceptionが 発生します。shapesはあくまでLineの配列であり、Circleの配列では ないからです。 これはJavaにおける配列の話ですが、Javaの配列をShapeArrayとか CircleArrayといったクラスで表現すると、p.289のコードのようになります。 ここで、CircleArrayのインスタンスcircleArrayがあったとして、 Shape shape = circleArray.get(i); というコードは、アップキャストなので合法ですが、 circleArray.set(i, shape); というコードは、ダウンキャストになります。CircleArray.set()の第2引数の 型はCircleなので、もしShapeを渡したければダウンキャストが必要になります。 Javaでは、このダウンキャストに相当する実行時例外が、ArrayStoreExceptionに なっている、と言えるでしょう。 この例ではCircleArrayがShapeArrayを継承しているので、もし引数の共変を 許せば、 ShapeArray shapes = circleArray; shapes.set(i, shape); と書けてしまいます。このshapes.set(i, shape);が、 まさにp.249のコードの shapes[i] = new Circle(); に相当するわけです。 これで回答になっているでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1898] diksamの実装に関して
投稿者:lang
2015/02/22 19:08:07

立て続けに質問して申し訳ございません。 "プログラミング言語を作る"の8-4-9章の A instance of B の記載に関してです。 A、Bがクラスの場合、 AとBが同じクラスか、AがBのスーパークラスの場合のみ、 真になる可能性がある、 とあります。 A instance of B のAというのはオブジェクトという理解で良いでしょうか。 AがBのスーパークラスの場合に真という点に疑問を持ちました。 Aが右辺のBのクラスのサブクラスのオブジェクトであれば 真だという理解ですが、 AがBのスーパークラスの場合に真というのはなぜでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1897] オーバーライド時の共変、反変について
投稿者:lang
2015/02/21 14:30:58

”プログラミング言語を作る”内の8-3-5章にて 下の解説を読みました。 class ShapeArray{ Shape get(int index); void set(int index, Shape shape); }; class CircleArray extends ShapeArray{ Circle get(int index); ・・・① void set(int index, Circle circle); ・・・② }; ①は戻りの値の型が共変なので問題無し。 ②は引数の方が共変であるため実行時チェックが必要。 アップキャストは常に可能ですが、 ダウンキャスト時は実行時チェックが必要だと理解しています。 戻りの値の型が共変、引数の型が共変、 ともにダウンキャストとなる、という認識ですが、 なぜ、問題の有無の判断が変わってくるのでしょうか。 一般的な言語のオーバーライドの動作に関することで 本掲示板への質問が適切かどうか分かりませんが、 もしよろしければ細くいただけると助かります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1895] Re:質問です
投稿者:
2014/09/13 13:34:55

ご返信ありがとうございました。 著者の方に質問できる場所があるって素晴らしいです。 アルゴリズムへの興味を深めることができました。 (個人的にはこの対話で十分満足です) 掲示板やWebサーバーの作り方も書籍化していただければと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1894] Re:質問です
投稿者:(ぱ)こと管理人
2014/09/09 02:00:02

こんにちは。 >sorted_count < score_count-1 > >の間だけ(score_count-2の要素まで)ループを回せば、最後の要素score_count-1は >整列された状態になっているのではないでしょうか。 最後の2要素残ったところでその2要素で交換するわけですから、 確かにループ1回無駄ではありますね。 「全部ソートされた」ことを示すのに while (sorted_count < score_count) { という条件式はそれはそれでわかりやすいとは思うのですが、 境界値がらみの説明を延々としているところですので、なんらかの 説明はいるように思います。 今日はちょっと無理ですが、次の週末にはWebにてフォローします。 ご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1893] 質問です
投稿者:
2014/09/07 12:14:22

こんにちは。 『C言語体当たり学習 徹底入門』103ページについての質問です。 終了条件は、「すべてがソートされたとき」 すなわちsorted_countとscore_countが等しくなったとき sorted_count < score_countの間だけ、ループを回せばよい とありますが、 sorted_count < score_count-1 の間だけ(score_count-2の要素まで)ループを回せば、最後の要素score_count-1は整列された状態になっているのではないでしょうか。 単純選択ソートと単純交換ソートでは、ソート済範囲は絶対に動かない。 単純挿入ソートでは、ソート済範囲も動く可能性がある。 という理解です。 よろしくお願い致します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1892] 「C言語 ポインタ完全制覇」補足目次を作成しました
投稿者:(ぱ)こと管理人
2014/03/30 15:40:57

><補足> supplement を目次へ追加願います。 大変いまさらではありますが、「C言語 ポインタ完全制覇」の補足目次を作成しました。 http://kmaebashi.com/seiha/hosoku_index.html (他の本については、まあ、おいおいと) 元ネタは元原稿のLaTeXファイルから抽出したので、抜けはないはず…… と思ったのですが、 結構最後の最後まで補足の追加とかしていたようで、元原稿になくて本にはある補足が いくつか。補足を書き足してるヒマにちゃんと校正やっとけという話なのですが…… 編集さんご迷惑をおかけしました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1891] Re:「C言語 ポインタ完全制覇」について気がついた事、要望
投稿者:(ぱ)こと管理人
2014/03/24 00:51:35

ご意見ありがとうございます。 >p.149 3-2 Cの型モデル について >この章は、大変重要な事が説明されていると思いますが、それが読者にきちんと >伝わっていない可能性があると思います。 読み返してみました。ここはかなり重要な章だと思いますので、 ここが読者に伝わっていないとなると問題です。 ご指摘の件、改訂版の機会があれば検討させていただきます。 # このレベルの修正だと、第16刷とかで手直しできるレベルを # 超えていると思いますので。 ><補足> supplement を目次へ追加願います。 これは、正直、私もちょっと心に引っかかっていました。 (と言いつつ、その後の本でも直っていないわけですが……) いまさらではありますが、こちらについてはWebで補足目次を作るくらいの ことはできそうです。すぐにやるとは言えませんが、検討します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1890] 「C言語 ポインタ完全制覇」について気がついた事、要望
投稿者:jcv
2014/03/23 19:41:55

今更と思われるかもしれませんが、技術評論社「 C言語 ポインタ完全制覇」について、 気がついた事をお知らせ致します。 参照しているのは、2013年10月10日 初版第15刷です。 p.149 3-2 Cの型モデル について この章は、大変重要な事が説明されていると思いますが、それが読者にきちんと 伝わっていない可能性があると思います。この本を順番に読んで行くと、いきなり Fig.3-1 の表が出て来たという印象を受けました。とまどわれた方も多いのでは ないかと思います。私も何を説明しているのかが理解出来ませんでした。また、 その後の派生型の話も全く記憶に残っていませんでした。最近、読み返して、やっ とこの表や、この章全体が 「Cの型」がどの様に決められているかについての説明 である事がわかりました。改めて章のタイトルを見ると、「Cの型モデル」とあり、 わかった後で読み返すと、Fig.3-1 には、『「型」を図で表現すると…』とあり、 確かに説明がされているのがわかりました。 「Cの型モデル」というこの章のタイトルは、この章の内容を端的に まとめられていて、極めて妥当なタイトルであるとは思います。 後日リファレンスマニュアルとしてこの本を利用する場合には、目次 ですぐに見つかりますので良いと思います。 p.149 の上部には、挿絵があり、その中に「3-2 Cの型モデル」とタイトルが入っ ていはいますが、このタイトル部分が挿絵の中で、色も異なり、絵の内容も本の 内容とは関連も薄く、しかもすべての章節の絵が同じなので、このタイトルに気 がつかずに読み進める読者も多いのではないかと思います。また、このタイトル を読んだとしても、はじめて読む読者が内容を知らずにこのタイトルだけを見て、 すぐに内容が思い浮ぶタイトルではないと思います。 その様な、このタイトルの内容が頭に入っていない状態でこの章を読み始めると、 その後の「3-2-1 基本型と派生型」を見ますが、この用語はこの章の中で解説が されているので、何のことかもわかりません。その状態で、本文を読んでも、 これが、Cの型の説明をしているという事が理解出来ないと思います。 せめて、直前の章の終りで、つぎの章予告等があれば話しは違いますが、直前の 章は、型の話ではありますが、間に約2ページの「補足」が入っているので、リフ レッシュされて前の内容は記憶に残っていないかもしれません。やはりこの章に ついては、最初に何の説明を行うかを記載するのが良いのではないかと思います。 <補足> supplement を目次へ追加願います。 補足には、重要な内容が多く記載されています。そして、他の人への説明に利用 させて頂きたい事や、後から読み返したい事が多いのも、補足の部分に書かれて いる内容についてです。ところが、この補足には、目次がなくアクセスが出来ま せん。更に、索引にも出て来ない事がありました。例えば、p.168 「式」に対す るsizeof は、索引で sizeof を見ても、p. 158 が出て来るだけでした。しかも この補足は違う章に入っていましたので、全ページを探す必要がありました。 (sizeof がたまたま漏れていたのかもしれませんが)是非、補足の目次の追加を お願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1888] Re:コンパイルが通りません.
投稿者:(ぱ)こと管理人
2014/01/05 14:49:53

>例として掲載されているServer01,javaのサンプルコードですが,そのままではコンパイルが通りませんでした. はじめまして。 今手元にjavacがないので貼ったコードを再コンパイル等はしていませんが、 ぱっと見おかしいようには見えません。 コンパイルが通らないとのことですが、 ・コンパイルが通らない際のエラーメッセージ ・ご使用のjavacのバージョン といった情報を教えてもらえないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1887] コンパイルが通りません.
投稿者:新参者
2014/01/03 21:50:28

お世話になっております. 今回,クライアントサーバを1から作ってみようと思い,貴サイトを活用させていただきました. 例として掲載されているServer01,javaのサンプルコードですが,そのままではコンパイルが通りませんでした. ソースコードをここに記載します. import java.io.*; import java.net.*; public class Server01 { public static void main(String[] argv) throws Exception { try (ServerSocket server = new ServerSocket(8001); FileOutputStream fos = new FileOutputStream("server_recv.txt"); FileInputStream fis = new FileInputStream("server_send.txt")) { System.out.println("クライアントからの接続を待ちます。"); Socket socket = server.accept(); System.out.println("クライアント接続。"); int ch; // クライアントから受け取った内容をserver_recv.txtに出力 InputStream input = socket.getInputStream(); // クライアントは、終了のマークとして0を送付してくる while ((ch = input.read()) != 0) { fos.write(ch); } // server_send.txtの内容をクライアントに送付 OutputStream output = socket.getOutputStream(); while ((ch = fis.read()) != -1) { output.write(ch); } socket.close(); } catch (Exception ex) { ex.printStackTrace(); } } }
[この投稿を含むスレッドを表示] [この投稿を削除]
[1884] Re:crowbar_book_ver4について
投稿者:(ぱ)こと管理人
2013/12/02 21:13:12

>たぶんですけど、直すのに影響があんまり出ないやり方があります。crowbarスタックを >一つの配列ではなく、複数の配列をリンクするによりスタックの拡張ができます。 >スタック拡張する場合には新たな配列をmalloc()して、それをもとにあったスタックと >リンクして、それでrealloc()を回避できますますね。これが「chunked stack」とも >言います。 全体を確認していませんが、ざっと見てみると、現状のcrowbarの実装だと スタック操作がpush_value()とかpeek_stack()にカプセル化されているので、push_value()のところで新たにmalloc()してリンクリスト等で管理し、 peek_stack()にて、もし配列の下端より下の領域を参照されたらひとつ前の 領域から算出して返す、ということはできそうですね…… 実のところ同じ現象はDiksamにもあるはずで、こちらはVMの中で直接参照して います。ただし、Diksamは関数呼び出し時にスタックの拡張があるかどうかを 判定していますし、ひとつの関数の実行中だけ連続したスタック領域が見えれば 十分でしょうから、なんとかなるように思います。 (すみません、ちょっとすぐには直せませんが) ご意見ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1883] Re:crowbar_book_ver4について
投稿者:RednaxelaFX
2013/11/30 23:34:37

>どたばたしておりまして対応が遅れました。すみません。 いえ、大丈夫です。返事を頂いてありがとうございます。 >>realloc()が対象データを移動しかねないので、移動した場合、もしスタックのなかでネイティブ関数に渡す引数があれば、それを指すポインタ(arg_p)が無効化される恐れがありますね。 > >本当ですね……初歩的なミスでした。ご指摘ありがとうございます。 >直すなら、ポインタでなく添字を渡して関数経由でアクセスするようにするのかと思いますが、ネイティブ関数全体に影響が出ます。少し考えさせてください。 >ご指摘ありがとうございました。 たぶんですけど、直すのに影響があんまり出ないやり方があります。crowbarスタックを一つの配列ではなく、複数の配列をリンクするによりスタックの拡張ができます。スタック拡張する場合には新たな配列をmalloc()して、それをもとにあったスタックとリンクして、それでrealloc()を回避できますますね。これが「chunked stack」とも言います。 >>ついでに、CRB_create_interpreter()で、interpreter->stack.stack_alloc_sizeの初期値が0になってますが、それがSTACK_ALLOC_SIZEになったほうがいいではないでしょうか。 > >NULLを第一引数とするreallocはmallocと同じなので、どちらでもよいのではないでしょうか。 はい、どちらでも良いですね。 - Kris
[この投稿を含むスレッドを表示] [この投稿を削除]
[1882] Re:crowbar_book_ver4について
投稿者:(ぱ)こと管理人
2013/11/30 12:42:30

どたばたしておりまして対応が遅れました。すみません。 >realloc()が対象データを移動しかねないので、移動した場合、もしスタックのなかでネイティブ関数に渡す引数があれば、それを指すポインタ(arg_p)が無効化される恐れがありますね。 本当ですね……初歩的なミスでした。ご指摘ありがとうございます。 直すなら、ポインタでなく添字を渡して関数経由でアクセスするようにするのかと思いますが、ネイティブ関数全体に影響が出ます。少し考えさせてください。 ご指摘ありがとうございました。 >ついでに、CRB_create_interpreter()で、interpreter->stack.stack_alloc_sizeの初期値が0になってますが、それがSTACK_ALLOC_SIZEになったほうがいいではないでしょうか。 NULLを第一引数とするreallocはmallocと同じなので、どちらでもよいのではないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1881] Re:crowbar_book_ver4について
投稿者:RednaxelaFX
2013/11/27 02:02:07

前橋様、 もう一つ、crowbarスタックとネーティブ仮引数について聞きたいことがあります。 crowbar_book_0_4では、crowbarスタックはrealloc()を使って拡張します。そしてネイティブ関数に渡す引数の配列がはcrowbarスタックに積んでいます。realloc()が対象データを移動しかねないので、移動した場合、もしスタックのなかでネイティブ関数に渡す引数があれば、それを指すポインタ(arg_p)が無効化される恐れがありますね。 ついでに、CRB_create_interpreter()で、interpreter->stack.stack_alloc_sizeの初期値が0になってますが、それがSTACK_ALLOC_SIZEになったほうがいいではないでしょうか。stack_alloc_sizeの初期値が0なら、最初にpush_value()を呼び出すと、stack_pointer == stack_alloc_sizeので無駄にMEM_realloc()でcrowbarスタック拡張をします。 - Kris
[この投稿を含むスレッドを表示] [この投稿を削除]
[1880] Re:crowbar_book_ver4について
投稿者:RednaxelaFX
2013/11/25 00:44:46

はるほど、納得いたしました。 お忙しい中、丁寧なご返事、ありがとうございました。 - Kris >確認しました。確かに無駄なことをしているように見えます。 >そもそも関数名がrelease_global_stringsなのに、文字列に対して >何かしているように見えません。 > >どうしてこうなったのかと思い、調べたのですが、どうも >ver.0.1のこのコードが原因なのかと思います。 > >http://kmaebashi.com/programmer/devlang/crowbar_src_0_1_01/S/15.html#76 >static void >release_global_strings(CRB_Interpreter *interpreter) { > while (interpreter->variable) { > Variable *temp = interpreter->variable; > interpreter->variable = temp->next; > if (temp->value.type == CRB_STRING_VALUE) { > crb_release_string(temp->value.u.string_value); > } > } >} > >ver.0.1時点では、参照カウンタのGCしかなかったので、インタプリタを >破棄するときには文字列の領域はfreeする必要がありました。その処理が >上記のコードです。 > >ver.0.2でGCを組み込んだので、interpreter->variableをNULLにしておけば、 >文字列の領域もcrb_garbage_collect()の呼び出しで解放されます。 >ただ、ver.0.2を作ったとき、ヘッダファイルを直してコンパイルエラーを取って、 >という作業をしているときに、コンパイルエラーの原因のところだけ削って >関数そのものが不要であることに気付かなかったのではないかと思います。 >すみませんでした。再確認のうえ、正誤表に載せる等対応します。 > >細かいところまでソースを読み込んでいただき、作者冥利に尽きます。 >ありがとうございました。 >
[この投稿を含むスレッドを表示] [この投稿を削除]
[1879] Re:crowbar_book_ver4について
投稿者:(ぱ)こと管理人
2013/11/24 23:19:43

>こんにちは、@rednaxelafxことKrisと申します。 中国からありがとうございます。 (中国語版がもう出版されているということを私も今知りました) >このたびはcrowbarについてちょっと聞きたいことがあります。 … >その中のcrowbar_book_0_4ですが、interface.cでのrelease_global_strings()が >こうなっています: >static void >release_global_strings(CRB_Interpreter *interpreter) { > while (interpreter->variable) { > Variable *temp = interpreter->variable; > interpreter->variable = temp->next; > } >} 確認しました。確かに無駄なことをしているように見えます。 そもそも関数名がrelease_global_stringsなのに、文字列に対して 何かしているように見えません。 どうしてこうなったのかと思い、調べたのですが、どうも ver.0.1のこのコードが原因なのかと思います。 http://kmaebashi.com/programmer/devlang/crowbar_src_0_1_01/S/15.html#76 static void release_global_strings(CRB_Interpreter *interpreter) { while (interpreter->variable) { Variable *temp = interpreter->variable; interpreter->variable = temp->next; if (temp->value.type == CRB_STRING_VALUE) { crb_release_string(temp->value.u.string_value); } } } ver.0.1時点では、参照カウンタのGCしかなかったので、インタプリタを 破棄するときには文字列の領域はfreeする必要がありました。その処理が 上記のコードです。 ver.0.2でGCを組み込んだので、interpreter->variableをNULLにしておけば、 文字列の領域もcrb_garbage_collect()の呼び出しで解放されます。 ただ、ver.0.2を作ったとき、ヘッダファイルを直してコンパイルエラーを取って、 という作業をしているときに、コンパイルエラーの原因のところだけ削って 関数そのものが不要であることに気付かなかったのではないかと思います。 すみませんでした。再確認のうえ、正誤表に載せる等対応します。 細かいところまでソースを読み込んでいただき、作者冥利に尽きます。 ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1878] crowbar_book_ver4について
投稿者:RednaxelaFX
2013/11/24 03:34:37

こんにちは、@rednaxelafxことKrisと申します。 たぶん「はじめまして」ではないかと、Twitterで検索したところ、たしかにもっと前から挨拶をしました(笑) https://twitter.com/rednaxelafx/status/14597568550 Web連載も結構前から読みましたが、「プログラミング言語を作る」が本になって本当に嬉しかったです。 去年中国の編集さんにこの本を強く薦めました。いまはやっとその中国語翻訳版が買えるようになりまして、自分のブログでこの本を押したいと思います。 このたびはcrowbarについてちょっと聞きたいことがあります。 本のサンプルコードをこちらからダウンロードしました: http://kmaebashi.com/programmer/devlang/book/unix_utf8_20091228.tgz その中のcrowbar_book_0_4ですが、interface.cでのrelease_global_strings()がこうなっています: static void release_global_strings(CRB_Interpreter *interpreter) { while (interpreter->variable) { Variable *temp = interpreter->variable; interpreter->variable = temp->next; } } この関数がもともと何をしようとしてますか?このままだと、ループしなくても、直接に interpreter->variable = NULL でも同じではないですか? もしかしたらこうしたかったとか: static void release_global_strings(CRB_Interpreter *interpreter) { while (interpreter->variable) { Variable *temp = interpreter->variable; Variable *temp_next = temp->next; temp->next = NULL; interpreter->variable = temp_next; } }
[この投稿を含むスレッドを表示] [この投稿を削除]
[1877] Re:C言語ポインタ完全制覇の質問
投稿者:April
2013/11/22 04:35:57

>>>DEBUG_WRITE(("hoge..%d\n", hoge)); >>を >>DEBUG_WRITE("hoge..%d\n", hoge); >>と書きたい場合は、 >>>>#define DEBUG_WRITE(arg) debug_write(arg) >>と書くことで同じになりますか? > >なりません。引数をひとつしか取らないマクロにふたつの引数を渡しているので >エラーになります。 >というか、そもそもこれでうまくいくのであれば誰も苦労はしないわけで、 >わざわざ二重括弧をつけたりしようとは思いません。 > >ISO C99では新機能により可変長引数を持つマクロが定義できるようになりましたが。 >http://seclan.dll.jp/c99d/c99d02.htm > >処理系をお持ちであれば、実際に試してみて、プリプロセッサの出力を >見てみるのが一番わかりやすいと思いますが、手元に実行できる環境は >ないのでしょうか? > >まあ、私も子どもの頃は、パソコン買ってもらえなくてペーパープログラマー >だったので、だとすればその苦労はわかります。 > 理解できました ありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1876] Re:本当の基礎からのWebアプリケーション入門 typo
投稿者:(ぱ)こと管理人
2013/09/25 02:48:18

>「u行目で定数DOCUMENT_ROOTを設定しています」の「u行目」は、 >7行目の事のはずなので、typo と思われます。 ご指摘ありがとうございます。修正しました。 誤解が起きようがないtypo場所の指摘方法がさすがといいますか、 いろんな人に読まれてますね (^^;
[この投稿を含むスレッドを表示] [この投稿を削除]
[1875] 本当の基礎からのWebアプリケーション入門 typo
投稿者:jcv
2013/09/23 08:56:09

本当の基礎からのWebアプリケーション入門 ――Webサーバを作ってみよう―― Webサーバを作る ひとつのHTMLファイルを返す webserver.html の225行目 「u行目で定数DOCUMENT_ROOTを設定しています」の「u行目」は、 7行目の事のはずなので、typo と思われます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1873] Re:C言語ポインタ完全制覇の質問
投稿者:(ぱ)こと管理人
2013/08/10 11:41:06

>単純にカンマ演算子が評価されて debug_write(hoge); と同値になるだけでしょう。 うひ。その通りです。カンマ演算子をすっかり忘れていました。 ご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1872] Re:C言語ポインタ完全制覇の質問
投稿者:774RR
2013/08/08 18:11:39

一通り質疑応答はきれいに終わったようなので、要らぬ一言を >debug_write(("hoge..%d\n", hoge)); >これは構文エラーです。 単純にカンマ演算子が評価されて debug_write(hoge); と同値になるだけでしょう。 hoge が整数型なら引数の型不一致エラーになるものと思われます。 hoge が char* ならエラーなく通ってしまうはず。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1871] Re:C言語ポインタ完全制覇の質問
投稿者:あり
2013/08/07 08:02:56

ありがとうございます。 理解できました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1870] Re:C言語ポインタ完全制覇の質問
投稿者:(ぱ)こと管理人
2013/08/06 22:45:11

>>DEBUG_WRITE(("hoge..%d\n", hoge)); >を >DEBUG_WRITE("hoge..%d\n", hoge); >と書きたい場合は、 >>>#define DEBUG_WRITE(arg) debug_write(arg) >と書くことで同じになりますか? なりません。引数をひとつしか取らないマクロにふたつの引数を渡しているので エラーになります。 というか、そもそもこれでうまくいくのであれば誰も苦労はしないわけで、 わざわざ二重括弧をつけたりしようとは思いません。 ISO C99では新機能により可変長引数を持つマクロが定義できるようになりましたが。 http://seclan.dll.jp/c99d/c99d02.htm 処理系をお持ちであれば、実際に試してみて、プリプロセッサの出力を 見てみるのが一番わかりやすいと思いますが、手元に実行できる環境は ないのでしょうか? まあ、私も子どもの頃は、パソコン買ってもらえなくてペーパープログラマー だったので、だとすればその苦労はわかります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1869] Re:C言語ポインタ完全制覇の質問
投稿者:あり
2013/08/06 07:59:33

>DEBUG_WRITE(("hoge..%d\n", hoge)); を DEBUG_WRITE("hoge..%d\n", hoge); と書きたい場合は、 >>#define DEBUG_WRITE(arg) debug_write(arg) と書くことで同じになりますか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1868] Re:C言語ポインタ完全制覇の質問
投稿者:(ぱ)こと管理人
2013/08/05 21:39:59

>>>#define DEBUG_WRITE(arg) debug_write arg  >の書き方は、 >#define DEBUG_WRITE(arg) debug_write(arg) >と書くのと同じことになりますか?  なりません。 下の書き方で以下のように呼び出すと、 DEBUG_WRITE(("hoge..%d\n", hoge)); マクロが展開された時点でこうなります。 debug_write(("hoge..%d\n", hoge)); これは構文エラーです。 DEBUG_WRITEの括弧内、つまり DEBUG_WRITE(ココ) にあるものがargの場所に配置されるのですから、当然そうなります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1867] Re:C言語ポインタ完全制覇の質問
投稿者:あり
2013/08/05 08:11:42

返信ありがとうございます。 追加でもう一点お願いします。 >>P108の上半分の >>#ifdef DEBUG >>#define DEBUG_WRITE(arg) debug_write arg  >… の書き方は、 #define DEBUG_WRITE(arg) debug_write(arg) と書くのと同じことになりますか? 
[この投稿を含むスレッドを表示] [この投稿を削除]
[1866] Re:C言語ポインタ完全制覇の質問
投稿者:(ぱ)こと管理人
2013/08/03 16:09:15

>P108の上半分の >#ifdef DEBUG >#define DEBUG_WRITE(arg) debug_write arg  … >でdebug_writeのうしろに空白があって、argがあるのがどういうことか理解できません。 このDEBUG_WRITEの使い方についてはその続きで説明しており、以下のように書いています。 DEBUG_WRITE(("hoge..%d\n", hoge)) これをプリプロセッサにかけたときにどうなるかは、やってみれば一番わかると思いますが、 この2重の括弧の内側が、括弧ごと展開されますので、こうなります。 debug_write ("hoge..%d\n", hoge) これで可変長引数を取るデバッグライト用関数debug_write()を 呼び出すことができるわけです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1865] C言語ポインタ完全制覇の質問
投稿者:あり
2013/08/02 08:15:58

P108 デバッグライト用の関数を作ってみよう に関して質問があります。 P108の上半分の #ifdef DEBUG #define DEBUG_WRITE(arg) debug_write arg  #else ・・・・ でdebug_writeのうしろに空白があって、argがあるのがどういうことか理解できません。 説明いただけないでしょうか。 よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1863] 管理者により削除されました
2013/05/15 01:35:25

テストはテスト用掲示板にてお願いします。
[この投稿を含むスレッドを表示]
[1862] Re:フローチャートについて
投稿者:(ぱ)こと管理人
2013/05/09 02:47:21

>アルゴリズムについてろくに知らないくせに軽視するという傾向がありました。 あう。すみません。 勉強はなんであっても重要ですよね。それこそフロチャートだって、記号の 意味くらいは知っていたほうがよいかと思いますし。 >それと、「インタプリタは翻訳しない」(インタプリタ自身が命令セットを持っている) >ことを他書がどう書いているか、一時期、気になってました。「翻訳する」などとなって >いても、表面上は誤りとも言い切れない表現の本が多いようです(そもそもあまり意識 >していないような)。その点、村瀬康治さんは、さすがに正確に書かれています。 とりあえず手元にある本では、 パソコンプログラミング入門以前 伊藤華子著 初版(1998年) 第10刷(2001年) | 中には、オブジェクトプログラムを生成しない「インタープリタ方式」で、 | ソースプログラムを一括変換しないで、一部分ずつを翻訳し直接実行する | スタイルもあります。 この本ではこの後、通訳に原稿をまるごと翻訳してもらう方法(コンパイル方式)と 比較して、同時通訳をインタプリタにたとえています。これはさすがに言い訳 できないと思います。 プログラムはなぜ動くのか 知っておきたいプログラミングの基礎知識 矢沢久雄著 1版7刷 (1刷ともに2001年) | Q.:コンパイラとインタプリタの違いは何ですか? | A.:コンパイラは、実行前にソースコードをネイティブ・コードに一括して | 翻訳します。インタプリタは、実行時にソースコードの内容を1行ずつ | ネイティブ・コードに逐次変換します。 「これが驚異のべすとせらあ?」とセンス・オブ・プログラミングに書いた本は 実はこれです。 改訂版が出ているので立ち読みしましたが、該当の記述はなくなっているようです。 どちらも増刷を繰り返している、かなり売れている本なんですよねえ。 >「Java謎+落とし穴」、第二版を期待しつつ。 残念ながらその予定はないのですが、この本は、amazonのレビューとかでも 書かれているとおり、今となっては古い本になってしまっていると自分でも思います。 でもなー、あの時点で、Genericsや列挙の不在はもちろん、引数と戻り値の 共変、反変まで書いたってのは、手前味噌ながらなかなかのものだと思うんですよ。 Web上で書評を見ても、2章のポインタ議論あたりまでしか言及されてないのが 多くてですね(愚痴)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1861] Re:フローチャートについて
投稿者:動坂亭
2013/05/07 22:40:31

前橋様 お忙しい中、丁寧にご回答いただき、ありがとうございました。 お答えを自分なりに咀嚼し、今後に活かしたいと思います。もちろん、フロチャートは書かない(こだわらない、忘れる)ようにします。 ちなみに、柴田芳樹さんという方も、「人月の神話」でフローチャートが否定されていることについて「当然のこと」と書かれていました(「ソフトウェア開発の名著を読む」P46)。 「センス・オブ・プログラミング」の感想をあと少し書きますと、これも、影響を受けやすい(読者たる)私自身の責任ですが、アルゴリズムについてろくに知らないくせに軽視するという傾向がありました。最近それを自覚するに至り、まずは人並みにマスターしてから、と思っています。 それと、「インタプリタは翻訳しない」(インタプリタ自身が命令セットを持っている)ことを他書がどう書いているか、一時期、気になってました。「翻訳する」などとなっていても、表面上は誤りとも言い切れない表現の本が多いようです(そもそもあまり意識していないような)。その点、村瀬康治さんは、さすがに正確に書かれています。 「Java謎+落とし穴」、第二版を期待しつつ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1860] Re:フローチャートについて
投稿者:(ぱ)こと管理人
2013/05/05 15:38:27

こんにちは。本を購入いただきありがとうございます。 >一方で、大滝みや子さんの「かんたんアルゴリズム解法」では、副題に「流れ図」と >あるように、フローチャートを扱っています。この本は、基本情報技術者試験の >テキストであるわけですが、国家試験である(らしい)同試験で、初心者に >フローチャートを学ばせていることと、先の常識との関係を、どのように整理すれば >よいでしょうか。 国家試験だからといって必ずしも適切な問題を出しているとは限りませんし、 ひとまず「基本情報 フロチャート」で検索したらまず出たのが以下の過去問でしたが、 http://www.k4.dion.ne.jp/~type_f/FE_18S_AM/FE_18S_AM_42.html この問題は、何についての理解を試しているのでしょう…… フロチャートの書式? それとも、アルゴリズムの基本的な考え方? フロチャートの書式を問う問題には見えないですよね。記号の意味自体は、 それこそ初めて見る人でも、だいたい見当がつきそうです。 この問題はアルゴリズムの考え方を問う問題で、たまたまそこでフロチャートを 使っていると見るべきであるように思います。それが適切かどうかはさておき。 (「Pascal風擬似言語」でもよいと思うのですが、言語非依存にしておかないと 都合が悪い事情はあるかも) >「センス・オブ・プログラミング」でも、基本情報技術者試験の試験範囲と >重なる入門的話題(基数、加算器など)も多く取り上げられていますことから、 >フローチャートはそのレベル以前、とも考えられず、フローチャートには >どういう態度で接すべきか、分かっていません。基本中の基本としては、 >必要なのでしょうか? 実のところフロチャートの記号なんて数種しかありませんし、記号の意味を 覚えておいて無駄になるということはないと思います。 ただ、入門者がおもちゃプログラムを作るときを含め、設計の役にはまったく 立たないと思います。理由は、「センス・オブ・プログラミング」にも書きましたが、 フロチャートは、いまどきの普通のプログラミング言語と比べても「機械語寄り」の 低レベルな記法であるからです。こんなものを書くくらいなら、対象の言語で 直接書くほうがよっぽどマシですし、その方が、コンパイラに怒られたり 動かしてバグを出したり等、勉強にもなります。 ただし、私もフロチャートを書くことはたまにはあって、それは、たとえば システムの運用担当者さん向けに、「エラーが発生したときにどうすべきか」といった 説明資料を作るような時です。これは、フロチャートにしたがって運用担当者さんが それこそCPUのように機械的に動けるように指示するものなので、より「低レベル」な 記法の方が好ましいわけです。 そのようなケース以外で、設計のためにフロチャートを書くことは、もちろん 実務ではありませんし、入門時にどうだったかといえば、私自身はBASIC時代に 入門しているわけでフロチャートも書きましたが、会社に入ったとき同期の連中は まるっきり初心者の人もいましたが、フロチャートなしで入門していました。 動坂亭さんが今までどんなプログラムを作ってこられたかわかりませんが、 何らかのテーマを決めてコードをガリガリ書いていけば100行くらいすぐですし、 100行のコードは、既にフロチャートで表現するのは難しいのではないでしょうか。 フロチャートを書くかどうか迷っている暇にどんどんコードを書いたほうが有益だと 思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1859] フローチャートについて
投稿者:動坂亭
2013/05/03 23:02:01

はじめまして。 私はプログラミング初心者ですが、前橋様のご著書は、「プログラミング言語を作る」を含め、全て所有しています(読めてはいません)。つまりファンということになり、影響も受けていると思います。 さて、「センス・オブ・プログラミング」でフローチャートを書いてはいけない、とされています。他の著者の本でも、このことは常識とされているものも見かけますし、素人たる私としても、疑問の余地がない事実なのであろうと推測します。(ごくごく単純な、構造化プログラミングぐらいの世界で、実務の役に立たないという趣旨なのかなと思ってます) 一方で、大滝みや子さんの「かんたんアルゴリズム解法」では、副題に「流れ図」とあるように、フローチャートを扱っています。この本は、基本情報技術者試験のテキストであるわけですが、国家試験である(らしい)同試験で、初心者にフローチャートを学ばせていることと、先の常識との関係を、どのように整理すればよいでしょうか。 「センス・オブ・プログラミング」でも、基本情報技術者試験の試験範囲と重なる入門的話題(基数、加算器など)も多く取り上げられていますことから、フローチャートはそのレベル以前、とも考えられず、フローチャートにはどういう態度で接すべきか、分かっていません。基本中の基本としては、必要なのでしょうか? ご教示いただけましたら幸いです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1858] kmaebashi.com停止のお詫び(1年ぶり2回目)
投稿者:(ぱ)こと管理人
2013/03/26 03:09:41

おそらく3/22~3/25にかけて、本Webサイトkmaebashi.comが停止しておりました。 管理人である私が、忙しさにかまけてレンタルサーバの利用料金の振込みを失念していたのが原因です。3/23(土曜)に振り込み、月曜に復旧していただきました。 利用者の皆様にはご迷惑をおかけしまして申しわけありませんでした。 1年前… orz http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&from=1812&range=1
[この投稿を含むスレッドを表示] [この投稿を削除]
[1856] Re:スタイルシートに関して
投稿者:misamisa
2013/01/14 17:31:26

管理人様、ご回答ありがとうございます。 ようやく実現できました!
[この投稿を含むスレッドを表示] [この投稿を削除]
[1855] Re:crowbar ver2のnative pointerについて
投稿者:hiro
2013/01/11 16:30:22

774RR様 ご回答ありがとうございます. 納得です.そういえば,昔そういう話を授業で聞いたことを思い出しました. ありがとうございました. >>char *str >>switch(type) { >> case XXX_EXPRESSION: >> str = "文字列" >>} >> >>return str; >>これだと,リターンされる文字列は自動変数なので,関数を抜けたらメモリが開放されるため,バグになる可能性があるのではないでしょうか? > >この例では、実は リターンされる文字列は自動変数 ではないのです。 >消滅するのは、自動変数 str というポインタ変数のためのメモリ領域 >return の前後で str に入っていた値 が複写される >ポインタ変数の値、すなわち str が指す先は "文字列" という [ストリングリテラル] である >ストリングリテラルはプログラム終了まで消滅しない >ので、この例は100%合法です。 > >以下の例だと 文字列 str が真に自動変数であるためバグります。 >const char* buggy_sample_func() { > char str[100]; > strcpy(str, "文字列"); > return str; >} >
[この投稿を含むスレッドを表示] [この投稿を削除]
[1854] Re:crowbar ver2のnative pointerについて
投稿者:774RR
2013/01/11 11:58:28

>char *str >switch(type) { > case XXX_EXPRESSION: > str = "文字列" >} > >return str; >これだと,リターンされる文字列は自動変数なので,関数を抜けたらメモリが開放されるため,バグになる可能性があるのではないでしょうか? この例では、実は リターンされる文字列は自動変数 ではないのです。 消滅するのは、自動変数 str というポインタ変数のためのメモリ領域 return の前後で str に入っていた値 が複写される ポインタ変数の値、すなわち str が指す先は "文字列" という [ストリングリテラル] である ストリングリテラルはプログラム終了まで消滅しない ので、この例は100%合法です。 以下の例だと 文字列 str が真に自動変数であるためバグります。 const char* buggy_sample_func() {  char str[100];  strcpy(str, "文字列");  return str; }
[この投稿を含むスレッドを表示] [この投稿を削除]
[1853] Re:crowbar ver2のnative pointerについて
投稿者:hiro
2013/01/11 08:12:26

管理人様 ご回答ありがとうございます.下記了解いたしました. >ちょっとありえないミスです。申しわけございませんでした。 >該当の実装は、以下で正しいです。 > >>気になって探してみたところ,ver.4のソースコードに >> >>struct CRB_Object_tag { >> ObjectType type; >> unsigned int marked:1; >> union { >> CRB_Array array; >> CRB_String string; >> CRB_Assoc assoc; >> ScopeChain scope_chain; >> NativePointer native_pointer; >> } u; >> struct CRB_Object_tag *prev; >> struct CRB_Object_tag *next; >>}; > >ご報告いただきありがとうございました。週末あたりに正誤表に入れさせて >いただきます。 ありがとうございます.ミスを全部潰すのは大変ですよね... 私もまだver.2までしか進んでいませんが,大変勉強になっています.ありがとうございます. また,もう一点気がついたことがあるので報告させて頂きます. util.cに,crb_get_operator_string関数があるかと思います. 以下のようなコードになっているのですが, --------------------------------------------- char *str switch(type) { case XXX_EXPRESSION: str = "文字列" } return str; --------------------------------------------- これだと,リターンされる文字列は自動変数なので,関数を抜けたらメモリが開放されるため,バグになる可能性があるのではないでしょうか? char *op_str = crb_get_operator_string(operator); こんな風に使っているので... ちなみに,実際にバグが起こっているわけではありません(エラー処理に使っているので,実際には実行されない).
[この投稿を含むスレッドを表示] [この投稿を削除]
[1852] Re:スタイルシートに関して
投稿者:(ぱ)こと管理人
2013/01/11 04:41:29

774RRさんが答えてくださっていますが(いつもありがとうございます) >というのも、掲載されているソースでは、どうしても左よりとなってしまう為、 >なんとかして見栄え良く、この掲示板のような形にしたいと考えています。 この掲示板のCSSは、ソースを見ればわかるように、以下にありますので よければ参考にしてください。 http://kmaebashi.com/bbs/bbs.css
[この投稿を含むスレッドを表示] [この投稿を削除]
[1851] Re:crowbar ver2のnative pointerについて
投稿者:(ぱ)こと管理人
2013/01/11 04:38:38

>「プログラミング言語を作る」を購入し,勉強させていただいております. ありがとうございます。はじめまして。 >著書の4-4-5において,以下のようにネイティブポインタ型の改修を記載されて >おりますが,ご提供されているソースコードのcrowber_book_0_2では,実際の >実装はされていないように思われます. まさかと思ってcrowbar_book_0_2をダウンロードして確認しましたが、 確かに、このバージョンでは、ネイティブポインタ型が値型になっています。 以下のようになっているのは、おっしゃるとおり、ver.0.4からのようです。 >ネイティブポインタ -> CRB_Object->FILE型などの構造体 「プログラミング言語を作る」は、もともとWeb上の連載で、 いろいろ試行錯誤しながら作っておりました。 書籍化にあたり、後になって失敗したと思い改修した箇所を、 前のバージョンに取り込む作業をしており、この件も、ver.0.4から ver.0.2に移動させたつもりだったのですが…… ちょっとありえないミスです。申しわけございませんでした。 該当の実装は、以下で正しいです。 >気になって探してみたところ,ver.4のソースコードに > >struct CRB_Object_tag { > ObjectType type; > unsigned int marked:1; > union { > CRB_Array array; > CRB_String string; > CRB_Assoc assoc; > ScopeChain scope_chain; > NativePointer native_pointer; > } u; > struct CRB_Object_tag *prev; > struct CRB_Object_tag *next; >}; ご報告いただきありがとうございました。週末あたりに正誤表に入れさせて いただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1850] crowbar ver2のnative pointerについて
投稿者:hiro
2013/01/10 06:18:57

はじめまして. 「プログラミング言語を作る」を購入し,勉強させていただいております. 著書の4-4-5において,以下のようにネイティブポインタ型の改修を記載されておりますが,ご提供されているソースコードのcrowber_book_0_2では,実際の実装はされていないように思われます. ネイティブポインタ -> CRB_Object->FILE型などの構造体 気になって探してみたところ,ver.4のソースコードに struct CRB_Object_tag { ObjectType type; unsigned int marked:1; union { CRB_Array array; CRB_String string; CRB_Assoc assoc; ScopeChain scope_chain; NativePointer native_pointer; } u; struct CRB_Object_tag *prev; struct CRB_Object_tag *next; }; このような記述を見つけました.こちらが正しい定義でしょうか? お手数おかけしますが,ご確認よろしくお願いいたします.
[この投稿を含むスレッドを表示] [この投稿を削除]
[1849] Re:スタイルシートに関して
投稿者:774RR
2013/01/09 16:53:32

掲示板ソフトがどうこう、という話ではない、と思うが。 1.最終的に閲覧者の手元に届く HTML ファイルの中にて CSS を使う指定がなされていて 2.同じく閲覧者(の使っている UA)が CSS にアクセスできる ようになっていればいい。 インライン要素で CSS を指定しても良いし ここの掲示板みたいに、掲示板ソフトの出力が別ファイルの CSS にアクセスしてもいい HTML 自体の話であるとか Web server 上の htdocs に CSS ファイルを置くとか そういう問題だと思う。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1848] スタイルシートに関して
投稿者:misamisa
2013/01/08 10:17:41

管理人様、いつも大変参考にさせて頂いております。 現在、管理人様が掲載しているプログラムをベースに掲示板を作成しており、 おおよそ完成しておりますが、管理人様のこの掲示板のようにどうしてもスタイル シートを使用したいと考えています。 というのも、掲載されているソースでは、どうしても左よりとなってしまう為、 なんとかして見栄え良く、この掲示板のような形にしたいと考えています。 どのようにしたら良いのでしょうか??? 教えて下さい。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1847] Re:最新データの表示に関して
投稿者:misamisa
2013/01/08 10:09:44

管理人様、ご回答ありがとうございます。 返事が遅くなり大変申し訳ありませんでした。 ご指摘頂いた内容で問題なくやりたい事が実現しました! ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1846] あけましておめでとうございます
投稿者:(ぱ)こと管理人
2013/01/01 04:01:19

すっかり閑散とした掲示板ですが、本年もよろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1845] Re:最新データの表示に関して
投稿者:(ぱ)こと管理人
2012/12/07 03:20:40

>ただ、その他、例えば新規投稿があったもに関しては、"NEW"を >横に付けるというような事は可能でしょうか? > 先に私が書いたように、「スレッドごとの最終更新時刻」をスレッドトップの 投稿に持たせるのであれば、ふつうに、「3日以内ならNEWと表示する」といったコードを 書けばよいのでは?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1843] Re:最新データの表示に関して
投稿者:misamisa
2012/11/30 17:08:20

管理人様、ご回答ありがとうございます。 ソートの件、参考になります。 ただ、その他、例えば新規投稿があったもに関しては、"NEW"を 横に付けるというような事は可能でしょうか? そのような例がありましたら教えて下さい
[この投稿を含むスレッドを表示] [この投稿を削除]
[1842] Re:最新データの表示に関して
投稿者:(ぱ)こと管理人
2012/11/28 03:52:18

>その中で1点、スレッド形式をトップ画面とした場合、最新の投稿があった場合でも >どこに投稿があったのかが番号では判断が難しく、何か別の方法で最新という事を >表示できないかと考えています。 最新の投稿があったスレッドは上位に表示したい、ということですよね。 以下で紹介しているソースにおいて、 http://kmaebashi.com/programmer/bbs_dev/thread.html 58: $sql_str = sprintf("select * from message where boardid='%s' and parent is null ", 59: $board_id); このSQLが、スレッドのルートを生成しています。 その続きで、order byをかける際に、(スレッドのルートの投稿の)serialidでorder by しているのが現状の仕様です。 63: $sql_str .= sprintf("order by serialid desc limit 0, %d", 64: $range); なので、messageテーブルに1列足して、スレッドごとの最終更新時刻を持てるようにして (parent is nullのレコードだけでよいので)、 それでorder byすればよいかと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1841] 最新データの表示に関して
投稿者:misamisa
2012/11/26 10:32:29

掲示板を作成するにあたり、大変参考にさせて頂いております。 その中で1点、スレッド形式をトップ画面とした場合、最新の投稿があった場合でも どこに投稿があったのかが番号では判断が難しく、何か別の方法で最新という事を 表示できないかと考えています。 <?php while ($row = mysql_fetch_assoc($result)) { if (!isset($firstid)) { $firstid = $row["serialid"]; } $lastid = $row["serialid"]; ?> <li> <a href="./list.php?boardid=<?php echo $board_id ?>&thread=<?php echo $row["serialid"] ?>"> ▼</a> <?php include 'threaditem.php'; show_child($board_id, $row["serialid"]); ?> </li> この部分を改造して、上記のような1発で最新の投稿だ!とわかるような事はできない でしょうか、、、 教えて下さい。 よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1840] 秋冬ファッション最新品
投稿者:秋冬ファッション最新品
2012/11/22 11:20:34

秋冬ファッション最新品 2012年秋冬ファッション人気商品は当店で売買する中です。 靴&ブーツ:http://orosiuri.com/baqgushu-zuakusesati.html レディース(服):http://orosiuri.com/ladies.html コスプレ衣装:orosiuri.com/kosupureishou.html バッグ&財布:orosiuri.com/baggu-saifu.html 弊社では、海外のメーカから本物直輸入販売!高品質の商品を超格安価格で、安心、迅速、確実、にお客様の 手元にお届け致します。 http://orosiuri.com/ 「卸売」ようこそ!
[この投稿を含むスレッドを表示] [この投稿を削除]
[1839] Re:PHP、MYSQLのBBSで質問です
投稿者:(ぱ)こと管理人
2012/11/21 01:59:57

すみません、これはおそらくバグっています。 記憶が曖昧ですが、ずいぶん前に、新しい掲示板を立ち上げるとき、 「ホームページ上の説明のコード」のとおり、 54: $sql_str = sprintf("select count(*)" 55: . " from message where boardid='%s'", 56: $board_id); 57: $result = mysql_query_or_die($sql_str); 58: $row = mysql_fetch_row($result); 59: if ($row[0] == 0) { 60: $serial_id = 0; 61: } else { 62: $serial_id = $row[0]; 63: } count(*)でレコード数をとった値、とすると、レコードの物理削除を行った場合に おかしくなるため修正したような気がします(現在は、あまりのspamの多さに 辟易したため管理者権限で物理削除ができるようになっていますが、当初はその 機能はありませんでした)。 それを考慮して、現状では以下のようにmax()を取るようにしたのですが、 $sql_str = sprintf("select max(serialid)" . " from message where boardid='%s'", $board_id); $result = mysql_query_or_die($sql_str); $row = mysql_fetch_row($result); if ($row[0] == 0) { $serial_id = 0; } else { $serial_id = $row[0] + 1; } その新しい掲示板を立ててからしばらく経ってからのことだったので、 「2回目の投稿」については試していなかったのかと思います。 すみませんが現状こちらではそれを直してテストまでする余裕はありません。 そちらで回避してください。よろしくお願いします。 (serial_idの最小値を1とする、あたりが簡単な気はします)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1838] PHP、MYSQLのBBSで質問です
投稿者:inak2
2012/11/18 19:07:49

Maebashi様 お世話になります。BBSのソースをサーバーにアップして、動作確認しております。 しかし、最初の投稿はできるのですが、2回目からの投稿でエラーが発生します。 エラーの内容を見ると、 SQLエラーinsert into message (boardid, serialid, name, subject, url, message, password, salt, parent, top, ipaddress, remotehost, useragent) values ('1117no2', 0, '以下省略・・・・・・ となっており、serialidが2回目の投稿にもかかわらず0を入れようとしてエラーになっていると考えられます。 テーブルをみると最初の投稿のserialidのフィールドには0が入っています。 そこでinsert.phpのソースコードを見ると、if($row[0]==0) {$serial_id=0;} else {$serial_id=$row[0]+1;} となっております。 ホームページ上の説明のコードでは$serial_id=$row[0];と書かれています。 オートインクリメントを設定してもうまきいきません。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1837] Re:PHP、MySQL掲示板で質問です
投稿者:(ぱ)こと管理人
2012/11/09 03:35:11

こんにちは。返信が遅くなりましてすみません。 >①list.php, plain.php, threaditem.phpは削除機能実装前の古いバージョンで >説明してあると記されていましたので、修正されたものの方をコピペして使用しました。 >しかし、「スレッド順インデックス」の説明のthread.phpも削除機能実装前の >古いバージョンで説明されておられますが、修正バージョンのソースが見当たりません? >修正バージョンをご提示いただければ幸いです。 この掲示板の記事は、掲示板自体を作りながら書いたものですので、 最終的に動く形でのソースコードは公開していません。 もちろん公開は可能ですが、動作する掲示板のソースをまるごと公開すると、 サポートの義務が発生しそうですし、当方にその余力はないのでこの状態になっています。 というよりも、既にPHPのバージョンが古いですし(公開時点ではPHP4でした) magic quoteを前提にしていたりもるので、このソースを参考にして 自作していただくのは大歓迎ですが、これをまるごともっていくのはちょっと お勧めできないです。 どうしても、ということであれば、メールいただければ固めて送ります。 あしからず、ご了承くださいませ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1836] PHP、MySQL掲示板で質問です
投稿者:inak2
2012/11/07 15:07:09

プログラミングのHP、大いに参考にさせていただいております。 「PHPとMySQLで掲示板を作る」コーナーで質問させていただきます。 ①list.php, plain.php, threaditem.phpは削除機能実装前の古いバージョンで説明してあると記されていましたので、修正されたものの方をコピペして使用しました。 しかし、「スレッド順インデックス」の説明のthread.phpも削除機能実装前の古いバージョンで説明されておられますが、修正バージョンのソースが見当たりません?修正バージョンをご提示いただければ幸いです。 ②説明の最後のほうで「修正版のlist.phpの14行目で、get_css($board_id)という関数を呼んでCSSの設定・・・・この関数はutil.phpで定義されていて・・・」と説明がありますが、util.phpにはこの関数の定義が見当たりません。 このためか、当方で設定してBBSを動かそうとし、「投稿成功しました」の表示から「一覧表示に戻る」をクリックしてもこのlist.phpの上部の「<link rel="STYLESHEETY" TITLE="default" TYPE="text/css" href="」の表示でとまってしまいます。 勉強中なのでいいかげんな質問をしているかもしれませんが、よろしくご指導お願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1833] Re:makeできない
投稿者:(ぱ)こと管理人
2012/09/30 19:38:18

すみません、いくつか確認させてください。 >cd ./memory; gmake >指定されたパスが見つかりません。 >gmake: *** [memory/mem.o] Error 1 (1) 使用したcrowbarは、どこからダウンロードしたどのバージョンでしょうか? (2) crowbarを展開し、コマンドプロンプトにてMakefileやcrowbar.yのある  ディレクトリまでcdして、そこからgmakeを実行した、ということでよいでしょうか? (3) crowbarを展開したフォルダ(Makefileやcrowbar.yのあるところ)に、  「memory」という名前のフォルダはあるでしょうか?  (普通に考えて、わざわざ消したり名前を変えたりしない限りあるはずですが…) (4)出たメッセージは上記がすべてでしょうか? crowbarをビルドすると、  「cd ./memory; gmake」が動く前に、以下のようなメッセージが出ているかと  思いますが、出ているでしょうか? bison --yacc -dv crowbar.y flex crowbar.l gcc -c -g lex.yy.c gcc -c -g y.tab.c gcc -c -g -Wall -Wswitch-enum -ansi -pedantic -DDEBUG main.c gcc -c -g -Wall -Wswitch-enum -ansi -pedantic -DDEBUG interface.c gcc -c -g -Wall -Wswitch-enum -ansi -pedantic -DDEBUG create.c gcc -c -g -Wall -Wswitch-enum -ansi -pedantic -DDEBUG execute.c gcc -c -g -Wall -Wswitch-enum -ansi -pedantic -DDEBUG eval.c  質問に質問で申しわけありませんが、確認をよろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1832] Re:makeできない
投稿者:(ぱ)こと管理人
2012/09/29 17:15:31

すみません、最近掲示板を見ておらず、この投稿に今気づきました。 今出先なのですが、この週末中には確認して回答します。 >windows7にてcrowbarをmakeしようとすると、 > >cd ./memory; gmake >指定されたパスが見つかりません。 >gmake: *** [memory/mem.o] Error 1 > >とでてmakeできません。 >gccやmingwも同じバージョンのものを使いました。 > >回答よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1831] makeできない
投稿者:daiki
2012/09/26 18:11:43

windows7にてcrowbarをmakeしようとすると、 cd ./memory; gmake 指定されたパスが見つかりません。 gmake: *** [memory/mem.o] Error 1 とでてmakeできません。 gccやmingwも同じバージョンのものを使いました。 回答よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1830] 掲示板作成に取り掛かり中
投稿者:タカ
2012/09/04 19:02:20

一からはじめるとなかなか手間取りますね…
[この投稿を含むスレッドを表示] [この投稿を削除]
[1829] Re:C++のメモリ管理
投稿者:南山まさかず
2012/07/24 17:46:23

>ただ、文脈上ここは、「Diksamにファイナライザを付けなかった理由」です。  もうちょっと深く読み込むべきでした。ご返信ありがとうございます。 >ヒープに確保したオブジェクトの >deleteのめんどくささを考えるとついつい  C/C++のメモリ管理は確かに面倒くさいですね。僕はもっぱらboost::shared_ptrを使って ますが……。  現在、貴書を参考にプログラミング言語を作成中です。その課程で少し気になったので書 き込みをさせていただいた次第です。  ご返信ありがとうございました
[この投稿を含むスレッドを表示] [この投稿を削除]
[1828] Re:C++のメモリ管理
投稿者:(ぱ)こと管理人
2012/07/24 02:42:22

> 303ページに「オブジェクトの寿命をプログラマが完全に制御しなければならないC++」 >とありますが。 「プログラミング言語を作る」のp.303ですね。 > C++はコンストラクタ、デストラクタによるリソース管理を行っており、 >原則オブジェクトの寿命はそのスコープ内です。 はい(まあ、どこまでのオブジェクトをスタック上に取るかという問題はありますが)。 > そのため、この記述はC++にとっては特殊な状況を除いて正しくない、という >ことにはならないでしょうか ただ、文脈上ここは、「Diksamにファイナライザを付けなかった理由」です。 C++の場合、デストラクタが動くタイミングは、スタックに取ったオブジェクトなら ブロックを抜けるときですし、ヒープに取ったオブジェクトならdeleteする時です。 よって、デストラクタが動くタイミングはプログラマが完全に予期できるので、 C++ではデストラクタは有用なのだけれど、Diksamではタイミングが予期できないので 役に立たない、ということを書いています。 そういう意味だと「オブジェクトの寿命をプログラマが完全に制御できるC++」と いう言い方の方が適切だったかもしれませんが、ヒープに確保したオブジェクトの deleteのめんどくささを考えるとついつい「オブジェクトの寿命をプログラマが 完全に制御しなければならないC++」と書きたくなってしまう……という感情が 私の中にあったかもしれません。 間違いとは思いませんが、C++好きな方からするとカチンとくるかもしれませんね。 失礼しました。 ご意見ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1827] C++のメモリ管理
投稿者:南山まさかず
2012/07/23 18:12:07

 303ページに「オブジェクトの寿命をプログラマが完全に制御しなければならないC++」とありますが。  C++はコンストラクタ、デストラクタによるリソース管理を行っており、原則オブジェクトの寿命はそのスコープ内です。  そのため、この記述はC++にとっては特殊な状況を除いて正しくない、ということにはならないでしょうか
[この投稿を含むスレッドを表示] [この投稿を削除]
[1823] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:yuya
2012/04/03 07:57:41

>まあ、誰もが規格票を参照できるわけではないですし、ここを読む別の人の >参考になればよいのではないでしょうか。 >今回も774RRさんのおかげでいろいろ話題が広がりましたし。 ありがとうございます。 どうもJISのサイトでスンナリ閲覧できないことが多くて、表示できても操作しにくいし(愚痴) あのビジネスモデルだけはホンマに……(愚痴)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1822] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:yuya
2012/04/03 07:56:00

>から、現代的「ヘッダで宣言を100%先行させる」プログラミングにおいて >正しく作られたヘッダはガードしなくても良い可能性があります。 ここだけ読んで「インクルードガードでコンパイラを黙らせるくらいなら、ヘッダファイルを正しく書き直そう」ってキャンペーンを張れるかと思いましたが、 そういうわけには行かなそうですね(笑)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1821] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:(ぱ)こと管理人
2012/04/03 03:14:03

>すみません、規格票は閲覧できるのだから、調べれば分かる質問をしてちゃいけませんね(反省)。 まあ、誰もが規格票を参照できるわけではないですし、ここを読む別の人の 参考になればよいのではないでしょうか。 今回も774RRさんのおかげでいろいろ話題が広がりましたし。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1820] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:774RR
2012/04/02 15:01:47

あとついでに ・先のスレッドで紹介したとおり、関数宣言は(矛盾しない限り)繰り返してよいこと ・同一内容の #define を繰り返すことは認められていること ISO/IEC 14882:1998 16.3 - 3,4 JIS X 3010:2003 6.10.3 ・C++ では typedef の同一内容の繰り返しは認められている (同 7.1.3-2) こと ・C では typedef の同一内容の繰り返しについて記述が無いこと  (未規定なので、処理系は許しても良いしエラーにしても良い) から、現代的「ヘッダで宣言を100%先行させる」プログラミングにおいて 正しく作られたヘッダはガードしなくても良い可能性があります。 typedef の同一内容の繰り返しに関して調査した範囲では ・ Visual C++ 2005 の C コンパイラは無警告で認めています。 ・ GCC 4 の C コンパイラは認めていません。 ・某社の組み込み系コンパイラは認めていません。 (enum/struct 等の繰り返し宣言の認め方については言語仕様書・処理系の挙動とも調べていません) コンパイル時間の短縮のためには「ヘッダの同一内容を複数回 parse しない」よう ガードに類する機構があったほうが望ましいですけどね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1819] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:yuya
2012/04/02 14:21:24

再度ありがとうございます。 考えてみれば、多くの入門書では 分割コンパイルも自分で.h書く局面にも到達しないことが多いから、当然かもしれませんね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1818] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:774RR
2012/04/02 14:05:44

> 意外に少なかったりしません? そんな瑣末なところにページ割くくらいならもっと別なことに使いたい、 んだと思います(俺でもそうします) 入門書では「おまじないとして」 #include <stdio.h> と書くんだよ・・・ と説明しているものが多いような気がします。 (標準)ヘッダとは何か?の解説が必要になるほどの分量が必要なサンプルを作ると 読者がついてこれないでしょう(だからサンプルも hoge.c 1個で完成する程度で) 手前味噌ですが http://kmaebashi.com/bbs/thread.php?boardid=kmaebashibbs&from=1706&range=1 #1712 のような .h と .c の使い分けの認識が必要になる、程度まで来ると それはもう入門レベルではないのかもしれません。 使い分けができるようになって、その先ですからね > 二重 include
[この投稿を含むスレッドを表示] [この投稿を削除]
[1817] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:yuya
2012/04/02 10:39:17

774RRさん、ありがとうございます。 面白いですねぇ。実例があれば見てみたい。 ところで入門書に「標準ライブラリは二重インクルードの心配はないよ」って書いてくれてること、 意外に少なかったりしません?(たくさん読んでいるわけではないので分かりませんが)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1816] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:774RR
2012/04/02 09:50:55

ついでに C++ の場合 ISO/IEC 14882:1998 17.4.2.1 Headers に同等の文言があります。 もっとついでに C にも C++ にも ・「ヘッダ」は必ずしもソースファイルでなくてよい ・ヘッダの < ... > で囲まれた文字の列がソースファイル名でなくてよい とあります(関連節の脚注など) 処理系は「ヘッダ」(のうちの特に <標準ヘッダ>)の1回目の読み込みに関して ・ソースファイルとして提供してもいい ・プリコンパイル済みバイナリファイルで提供してもいい ・処理系固有のビルトイン機能として実装してもいい ・謎の「ほげほげ機能」の結果として実装してもいい ようです。 2回目以後の読み込みに対しては ・正しく include ガードされているソースファイルとして提供してもいい ・処理系側で2回同じ標準ヘッダを読まない機構を用意してもよい  ・処理系側ビルトイン機構として同一<ヘッダ>を2回読まない機構を用意  ・#pragma once 類似機構を設けて<ヘッダ>側記載で回避 わけです。 なんにせよ [実装手段] は問われていない模様です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1815] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:yuya
2012/03/31 14:26:40

>X 3010:2003 (ISO/IEC 9899:1999)の「7.1.2 標準ヘッダ」から引用します。 >| 標準ヘッダはどのような順序で取り込んでもよい。各ヘッダは与えられた有効範囲内で >| 2回以上取り込んでもよいが,その効果は,<assert.h>の取込みの効果がNDEBUG の >| 定義に依存すること(7.2 参照)を除いて,1 回だけ取り込んだ場合と同じとする。 > >とのことなので、保証されています。(実現手段は問わないのでしょうが) ありがとうございます。 すみません、規格票は閲覧できるのだから、調べれば分かる質問をしてちゃいけませんね(反省)。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1814] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:(ぱ)こと管理人
2012/03/31 13:38:26

>標準ライブラリのヘッダファイルにインクルードガードが施されていることって、保証されているものなんでしょうか? X 3010:2003 (ISO/IEC 9899:1999)の「7.1.2 標準ヘッダ」から引用します。 | 標準ヘッダはどのような順序で取り込んでもよい。各ヘッダは与えられた有効範囲内で | 2回以上取り込んでもよいが,その効果は,<assert.h>の取込みの効果がNDEBUG の | 定義に依存すること(7.2 参照)を除いて,1 回だけ取り込んだ場合と同じとする。 とのことなので、保証されています。(実現手段は問わないのでしょうが)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1813] 標準ライブラリのヘッダファイルのインクルードガード
投稿者:yuya
2012/03/30 09:15:50

あの、今更こんなこと恥ずかしくて聞きづらいんですが…… 標準ライブラリのヘッダファイルにインクルードガードが施されていることって、保証されているものなんでしょうか? そうじゃなきゃ使い物にならないことは分かるのですが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1812] kmaebashi.com停止のお詫び
投稿者:(ぱ)こと管理人
2012/03/29 04:30:54

おそらく3/27~3/28にかけて、本Webサイトkmaebashi.comが停止しておりました。 管理人である私が、忙しさにかまけてレンタルサーバの利用料金の振込みを失念していたのが原因です。3/28に振り込んで復旧していただきました。 利用者の皆様にはご迷惑をおかけしまして申しわけありませんでした。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1811] Re:char hoge = 'A';
投稿者:yuya
2012/03/15 11:52:07

>この書き方とは? getchar()==(unsigned char)('a') っすか? >俺ならここまで厳密に書くことは絶対にしない(お仕事コードでも)と思うですよ。 あわわ、ちゃいますgetchar() == 'a'のほうです、紛らわしい書き方ですいません(^^;) >俺が本を書くとしたら 貴重なご意見ありがとうございます。 原理に深入りするかどうかはともかく、getchar() == 'a' が意図したとおりに動くかどうかは、 基本文字集合以外は保証されない、基本文字集合なら保証される、 ということは伝えるべきなのでしょうねぇ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1810] Re:char hoge = 'A';
投稿者:774RR
2012/03/14 18:49:51

この書き方とは? getchar()==(unsigned char)('a') っすか? 俺ならここまで厳密に書くことは絶対にしない(お仕事コードでも)と思うですよ。 俺が本を書くとしたら unsigned char の話には触れないです。 EOF は一般の意味での [文字] ではないため int が必要であるとは書きます。 int c=getchar(); switch (c) { case EOF: case 'a': } のように文字コードに関しては単純に 'a' と書くでしょう。んで、脚注にでも (†1) C はもともと英語圏で発展した言語なので、英語のアルファベットにない文字: ドイツ語のウムラウト文字とかエスツェットとか フランス語のアクサングラーブ文字とか 日本語の各種ひらがなカタカナ漢字とか は、C の初期からある標準関数ではうまく扱えないことがある。 たとえばこの例で case 'ア': と書いても動かない処理系のほうが多い。 (†2) そもそも日本語や中国語などの文字は多バイトで表現するので、 取り扱い方法がまったく変更になることが通例である。 とでもしておきますかね。もしかしたら脚注3で (†2) 標準関数で無理なく問題なく扱える文字の集合を基本実行文字集合と呼ぶ。 とするかもしれないです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1809] Re:char hoge = 'A';
投稿者:yuya
2012/03/14 15:36:23

よく理解できました。 自分がコーディングするときはこの書き方を使い続けることになると思いますが、 初心者に指導する際はどうすればいいんでしょうかねぇ…… 例えば入門書を書く機会があればどうされますか>皆様
[この投稿を含むスレッドを表示] [この投稿を削除]
[1808] Re:char hoge = 'A';
投稿者:774RR
2012/03/14 14:32:29

まあついでに言うと getchar()=='ア' も getchar()=='a' も「本質的には」間違っているわけで。 getchar() は [unsigned char 型として取り込み] [int 型に変換] なので、 返却される文字の値は char 型としての値ではなく unsigned char 型としての値となるため getchar()==(unsigned char)('ア') や getchar()==(unsigned char)('a') としておかないと 言語仕様と不一致になってしまう、と判断すべきでしょう。 これではあまりにもウザイので =='a' のような判断を許すべく 多く使われる基本文字については非負と決めているのだと思われますです。 非負ならば (unsigned char) にキャストしても、しなくても、値が同じなので。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1807] Re:char hoge = 'A';
投稿者:774RR
2012/03/13 12:32:04

処理系依存にならないよう、基本文字は [後半] にできないことになっているようですね。 #1806 基本文字は非負、の文言は C にもありました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1806] Re:char hoge = 'A';
投稿者:774RR
2012/03/13 10:55:31

>>この「非負の」に相当する文言がCの方にはないように思えるんですよね。 >俺が探した範囲でも無いっすね。 C++ で追記されたと読むべきでしょう。 あった。 JIS X 3010:2003 6.2.5 型 型 char として宣言されたオブジェクトは、実行基本文字集合の任意の要素を格納するのに十分な大きさを持つ。 基本実行文字集合の任意の要素を char 型のオブジェクトに格納した場合、その値は非負であることを保証する。 その他の文字を char 型のオブジェクトに格納した場合、その結果の値は処理系定義とするが、 その型で表現可能な値の範囲に含まれなければならない。 ってことは EBCDIC では char 型の内部表現は unsigned char と同じにならざるを得ないってことか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1805] Re:char hoge = 'A';
投稿者:yuya
2012/03/13 10:49:35

kitさん、ありがとうございます。 >いや、それは勘違いです。与れますよ。 >ファイルからコード 255 のバイトを getchar() で読むと、-1 ではなく 255 を返しますから。 あちゃ、まだ完全に分かってませんでした。 getc系の関数はストリームから得た文字をunsigned char型の値として解釈して、それをint型に変換するのでした。 つまり、「ア」の文字コードが 0xB1のとき、 文字定数'ア'の値がデフォルトcharによって異なる(signedならint型の-79、unsignedならint型の177になる)のに対し、 getcの戻り値は必ずint型の177になるのですね。 バイナリエディタで0xB1を書き込んだファイルを使って実験すると、 手元のVCでは 'ア' == getc() が偽になります。 はっきり言って「文字定数」と「getc系関数の戻り値」とは、ぜんっぜん違う!ということですね。 どちらも最終的にint型になるが、【値を解釈するときに】デフォルトcharに合わせるか、unsigned char固定か。 あれ?ということは、 int hoge = getchar(); if(hoge == 'a'){ /* ...... */ } のほうが(C++ではなくCでは)処理系依存ということになるのですか? 「a」が「後半の」文字かもしれないことを考えると。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1804] Re:char hoge = 'A';
投稿者:kit
2012/03/12 16:43:58

>>EOFは-1とは限らない(負でさえあればよい)ので回避のしようはありますね。 > >そうですね。 > >手元のVCだと無印charはデフォルトでsigned、EOFの値は-1になっていて、 >回避できるにも関わらず回避していない。 多くのUNIX系プラットフォームでもそうです。 (powerpc なんかは char のデフォルトが unsigned だったような気もしますが) >getchar()などの戻り値をintで受ける理由は言わずと知れたFAQですが、 >上記のような処理系では、せっかくの「文字コードの空間の外でEOFを扱えるように」という恩恵に与れないことになりますよね。 >(というか、そういう処理系がほとんどのような気がします。) いや、それは勘違いです。与れますよ。 ファイルからコード 255 のバイトを getchar() で読むと、-1 ではなく 255 を返しますから。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1802] Re:char hoge = 'A';
投稿者:yuya
2012/03/07 11:33:17

774RRさん、C++の情報ありがとうございます。 私の理解の変遷: 文字定数は本来はchar型だが、汎整数拡張されてint型になると理解していた →プギャー、規格に「int型を持つ」って明記されてるぅ! (汎整数拡張が抑止されるはずのsizeofでもint型のサイズが返ってくる) →じゃあcharに一旦入れちゃったら、表現しきれない値は壊れるかもしれないのか? →「charの符号の扱いに合わせた」int値になるから大丈夫だよん ということですね。 「なんでcharの符号は処理系定義なのにめったに困ることがないのか」という疑問が晴れたように思います。 ヘンにsigned/unsignedを指定して文字コードを扱ってしまった場合にこそバグるんですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1801] Re:char hoge = 'A';
投稿者:774RR
2012/03/05 14:51:19

>この「非負の」に相当する文言がCの方にはないように思えるんですよね。 俺が探した範囲でも無いっすね。 C++ で追記されたと読むべきでしょう。 # 最初 [基本] を見落としていて 負数のcharは一切ダメ? と思ったのは内緒。 >しかし、EBCDICのC++処理系があるものかどうか (^^; あって、自由に使ってよければ是非試してみたいところです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1800] Re:char hoge = 'A';
投稿者:(ぱ)こと管理人
2012/03/04 23:22:39

すみません、この投稿を見落としていました。 >2.2 - 3 基本実行文字集合 >基本実行文字集合において、それぞれの文字は非負の互いに異なる値をもっていなければならない。 この「非負の」に相当する文言がCの方にはないように思えるんですよね。探したのですが。 >char オブジェクトが負の値をもてるか否かは、処理系定義とする >EBCDIC およびその派生な文字セットの場合 'A'=h'C1, '0'=h'F0 なので、 >[基本文字集合は非負の値] からいくと「単なる char は符号なし」しかダメなんだろう。 なのだろうと思います。しかし、EBCDICのC++処理系があるものかどうか (^^;
[この投稿を含むスレッドを表示] [この投稿を削除]
[1799] Re:char hoge = 'A';
投稿者:yuya
2012/02/28 09:49:14

>EOFは-1とは限らない(負でさえあればよい)ので回避のしようはありますね。 そうですね。 手元のVCだと無印charはデフォルトでsigned、EOFの値は-1になっていて、 回避できるにも関わらず回避していない。 getchar()などの戻り値をintで受ける理由は言わずと知れたFAQですが、 上記のような処理系では、せっかくの「文字コードの空間の外でEOFを扱えるように」という恩恵に与れないことになりますよね。 (というか、そういう処理系がほとんどのような気がします。) ただ「0xFFに文字が割り当てられることは滅多にない」という「実情」に依存しているような……。 >(いつものことですが)私も勉強させていただいております。 こちらこそ、いつも本当にありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1798] Re:char hoge = 'A';
投稿者:774RR
2012/02/28 09:42:53

出遅れ気味... C++ の場合は仕様書の文言が若干違うようです。 以下 ISO/IEC 14882:1998 ならびに JIS X3014:2003 から 2.2 - 3 基本実行文字集合 基本実行文字集合において、それぞれの文字は非負の互いに異なる値をもっていなければならない。 実行文字集合は、基本実行文字集合をその部分集合とする集合とする。 実行文字集合における文字の値は、処理系定義とする。 俺:この文言は [基本文字集合は非負の値] [基本でない文字集合は負でもよい] と読むべきなのだろう・・・ 2.13.2 文字リテラル 文字リテラルは型 char をもち、実行文字集合での符号数値に等しい値を持つ。 俺:C の 6.4.4.4 の例のような文言は無いな・・・ 3.9.1 基本型 char として宣言されたオブジェクトの大きさは、処理系定義である実行文字集合のすべての要素を 格納するのに十分なだけ大きくなければならない。 char オブジェクトが負の値をもてるか否かは、処理系定義とする EBCDIC およびその派生な文字セットの場合 'A'=h'C1, '0'=h'F0 なので、 [基本文字集合は非負の値] からいくと「単なる char は符号なし」しかダメなんだろう。 ただ、実処理系で確認しようにもいろいろ微妙かも。 すぐ使える場所に EBCDIC な処理系は無いし printf("%d\n", '\xF0'); とすると [汎整数拡張] 後の int 型の値確認にしかならないし cout << '\xF0'; だと[文字表記]になって[文字の値]ではないし cout << int('\F0'); だと同 int の確認だし
[この投稿を含むスレッドを表示] [この投稿を削除]
[1797] Re:char hoge = 'A';
投稿者:(ぱ)こと管理人
2012/02/28 03:28:44

># でもEOFとかち合ったりしないのかなぁ…… ここだけ見て、規格にこっそり「charがsignedな処理系では1バイト文字定数は0xFFになってはいけない」みたいなことが書いてないかなあと見てみたのですが書いてなく、それどころか上記引用部には堂々と0xFFのケースが書いてあるわけですが、EOFは-1とは限らない(負でさえあればよい)ので回避のしようはありますね。 (いつものことですが)私も勉強させていただいております。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1796] Re:char hoge = 'A';
投稿者:yuya
2012/02/27 12:37:08

すみません、たぶん自己解決しました。 JIS X3010:2003 6.4.4.4 文字定数 | |意味規則 単純文字定数は、型intをもつ。 |(中略) |単純文字定数が単一の文字又は逆斜線表記を含む場合、その値はその単一の文字又は逆斜線表記の値をもつ |char型のオブジェクトをint型に変換したときの結果の値とする。 |(中略) |例2. 整数に対し2の補数表現を用い、型charをもつオブジェクトに対して8ビットを用いる処理系を考える。 |型charがsigned charと同じ範囲の値をもつ処理系では、単純文字定数'\xFF'は値-1をもつ。型charが |unsigned charと同じ範囲の値をもつ場合、'\xFF'は値+255をもつ。 この例2を見ると、文字定数の値が、「charがsignedかunsignedか」に連動して定まることになりますね。つまり、int型のモノが「char型に対する扱い」に依存するんですね。知りませんでした。 ということは、無印のcharがsignedの処理系であろうとunsignedの処理系であろうと、文字定数を代入して値が変わってしまう心配はない、と。 一番気になっていたのは、「等しいはずの文字を比較したのに『等しくない』と判定されてしまうかも」ということだったのですが、これで心配はなくなりました。 # でもEOFとかち合ったりしないのかなぁ……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1795] Re:char hoge = 'A';
投稿者:yuya
2012/02/27 10:08:44

ありがとうございます。 >これが > >>char hoge[] = {'ア', 'イ', 'ウ', '\0'}; > >だったら間違いなく違和感があると思うのですが。 なるほど、考えてみれば半角カナで実験してみればよかったですね。 #include <stdio.h> int main(void){ printf("%d\n", 'ア'); return 0; } VCでコンパイルして実行すると -79 あり?どうなってるんだ・・・
[この投稿を含むスレッドを表示] [この投稿を削除]
[1794] Re:char hoge = 'A';
投稿者:(ぱ)こと管理人
2012/02/27 01:45:30

どうもです。 >「A」の文字コードは決まっていないし、charがsignedになるかunsignedになるかは処理系によるので、結局この代入自体が処理系定義になるわけですよね。 確かにそうなりそうに思うのですが…… >よくchar配列の初期化の例で、 > >char hoge[] = "ABC"; > >は > >char hoge[] = {'A', 'B', 'C', '\0'}; こういう説明は私もしていますし、でも確かに処理系定義だと思います。 これが >char hoge[] = {'ア', 'イ', 'ウ', '\0'}; だったら間違いなく違和感があると思うのですが。 まあ、'A'がunsigned char側に割り当てられるような処理系はまずないだろうという前提を、たいていのCの入門書著者は置いてしまっているのだと思います。私も含めて。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1793] Re:char hoge = 'A';
投稿者:yuya
2012/02/21 04:04:30

(ぱ)さん、ありがとうございます。 「A」の文字コードは決まっていないし、charがsignedになるかunsignedになるかは処理系によるので、結局この代入自体が処理系定義になるわけですよね。 よくchar配列の初期化の例で、 char hoge[] = "ABC"; は char hoge[] = {'A', 'B', 'C', '\0'}; の略であって……といった説明になるわけですが、この場合も同様だとすると、 あれれ?そんな処理系定義な例で説明がなされているのか?と疑問に思ってしまったわけです。 (すみません、もの凄くアホな勘違いをしているかもしれません。)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1792] Re:char hoge = 'A';
投稿者:(ぱ)こと管理人
2012/02/21 03:15:15

すみません、しばらくここを放置してしまいました。 >C言語において、文字定数は1バイトの表現に収まることが保証されていますが、 >たとえば'A'が200のような値をとっていけないことはないですよね。 >すると、charがsignedな処理系で char hoge = 'A'; と書くと、未定義動作になるのでしょうか? 'A'自体の型はintですので、普通にintからsigned charへの型変換と考えると、 X 3010:2003の6.3.1.3によれば >そうでない場合,すなわち,新しい型が符号付き整数型であって,値がその型で表現できない場合は, >結果が処理系定義の値となるか,又は処理系定義のシグナルを生成するかのいずれかとする。 なので、処理系定義ですかね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1791] char hoge = 'A';
投稿者:yuya
2012/02/19 11:24:57

C言語において、文字定数は1バイトの表現に収まることが保証されていますが、 たとえば'A'が200のような値をとっていけないことはないですよね。 すると、charがsignedな処理系で char hoge = 'A'; と書くと、未定義動作になるのでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1790] fd
投稿者:aa
2012/02/16 19:29:55

fd
[この投稿を含むスレッドを表示] [この投稿を削除]
[1789] test
投稿者:test
2012/02/05 21:15:15

test
[この投稿を含むスレッドを表示] [この投稿を削除]
[1788] 無題
投稿者:くそ河野
2012/01/23 13:50:01

cvgcgdghdgおっぱ
[この投稿を含むスレッドを表示] [この投稿を削除]
[1787] 無題
投稿者:くそ河野
2012/01/23 13:49:22

ああああなんあなん
[この投稿を含むスレッドを表示] [この投稿を削除]
[1786] 無題
投稿者:キリン
2012/01/23 13:49:13

tinkoとmankoを合体させよう
[この投稿を含むスレッドを表示] [この投稿を削除]
[1785] 無題
投稿者:くそ河野
2012/01/23 13:48:52

おppai
[この投稿を含むスレッドを表示] [この投稿を削除]
[1784] 無題
投稿者:はなくそ
2012/01/23 13:48:15

どうもはなくそです
[この投稿を含むスレッドを表示] [この投稿を削除]
[1783] 無題
投稿者:キリン
2012/01/23 13:47:21

鼻隠せ
[この投稿を含むスレッドを表示] [この投稿を削除]
[1782] 無題
投稿者:くそ河野
2012/01/23 13:46:48

河野、がやべぇ鼻の中ほじくりまはわしてる
[この投稿を含むスレッドを表示] [この投稿を削除]
[1781] 無題
投稿者:くそ河野
2012/01/23 13:45:25

mんこのー  おしりのなかを  なまないでくださいー
[この投稿を含むスレッドを表示] [この投稿を削除]
[1780] 無題
投稿者:キリン
2012/01/23 13:45:17

鼻の整形をひきうけましょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1779] 無題
投稿者:くそ河野
2012/01/23 13:43:57

ぱぱぱぱぱぴい
[この投稿を含むスレッドを表示] [この投稿を削除]
[1778] 無題
投稿者:キリン
2012/01/23 13:43:37

河野逃げるな
[この投稿を含むスレッドを表示] [この投稿を削除]
[1777] 無題
投稿者:
2012/01/23 13:42:10

鼻くそ見えてるよ
[この投稿を含むスレッドを表示] [この投稿を削除]
[1776] 無題
投稿者:キリン
2012/01/23 13:41:50

鼻デカ
[この投稿を含むスレッドを表示] [この投稿を削除]
[1775] 無題
投稿者:くそ河野
2012/01/23 13:41:04

ま こ
[この投稿を含むスレッドを表示] [この投稿を削除]
[1773] 無題
投稿者:
2012/01/23 13:39:28

鼻でか
[この投稿を含むスレッドを表示] [この投稿を削除]
[1772] 無題
投稿者:くそ河野
2012/01/23 13:39:24

洋一郎が怒られるのこわいからにげた
[この投稿を含むスレッドを表示] [この投稿を削除]
[1771] 無題
投稿者:くそ河野
2012/01/23 13:37:51

まえののー  おしりのなかを  なめないでくださいー そこに
[この投稿を含むスレッドを表示] [この投稿を削除]
[1770] 無題
投稿者:
2012/01/23 13:37:27

鼻でか
[この投稿を含むスレッドを表示] [この投稿を削除]
[1769] 無題
投稿者:you
2012/01/23 13:37:06

どうすんの?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1768] 無題
投稿者:くそ河野
2012/01/23 13:36:36

あああ
[この投稿を含むスレッドを表示] [この投稿を削除]
[1767] 無題
投稿者:you
2012/01/23 13:33:36

千の風になっての替え歌を作りたいんだが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1766] Re:掲示板を移行しました
投稿者:a
2012/01/22 22:18:48

>仕様について簡単に説明します。 > >・発言内容は全て<pre>で囲まれます。ソースリストを載せるのに便利にするためです。 > 適当な位置で改行を入れてください。 >・でもやっぱり改行を入れ忘れる人もいるので、プレビュー表示をつけました。 > 確認してから「送信」をクリックしてください。 >・タグは全無効です。<font color="red">ほらね</font> >・クリッカブルURLの機能があります。 > http://kmaebashi.com > タグは無効なので<a>タグは書けません。 >・現状では削除機能がないので削除用パスワードは単なるお飾りです。 >・スレッド表示時、スレッドトップの「▼」をクリックすると、そのスレッドの > 発言を一覧表示します。 >・一画面あたりの表示数は以下の通りです。 > - 日付順表示…30 > - 日付順インデックス…50 > - スレッド表示…20スレッド >
[この投稿を含むスレッドを表示] [この投稿を削除]
[1763] Re:DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:(ぱ)こと管理人
2012/01/11 02:10:45

>st_string_literal_buffer[0]:a0 >st_string_literal_buffer[1]:a2 >st_string_literal_buffer[2]:a4 >st_string_literal_buffer[3]:a6 >st_string_literal_buffer[4]:a8 >st_string_literal_buffer[5]:62 >st_string_literal_buffer[6]:62 >st_string_literal_buffer[7]:0 >st_string_literal_buffer[8]:0 >8バイト目以降は、0x00 になります。 > >マルチバイトの1バイトが飛ばされているようです。 確かにそのように見えますし、だとすると、原因はLANG環境変数とかではなく diksam.lということになりそうなのですが…… こちらで現象が再現していません。 >・文字列の取得についてですが、 > デバック用の文字列を入れて確認しました。 > -リテラル(ダブルクォーテーション)の最初と最後の取込みは出来ていました。 > -リテラル部分の取込みは、diksam.l Line295 で行われていました。 お使いのdiksam.lの正確なバージョンは何でしょうか? (元の圧縮ファイルは どれをダウンロードされましたか?) diksam.lについては後半触っていないのでたぶん同じだと思うのですが、たとえば http://kmaebashi.com/programmer/devlang/book/download.html こちらのdiksam_book_0_4ですと、diksam.lの中にdkc_add_string_literal()の 呼び出しが何箇所かありますが、その中の Line285-286, Line295, Line303あたりの呼び出しについて、どのような順序で 呼び出されているかはわかりますでしょうか。それとも全部Line295でしょうか? こちらのデバッグにつきあわせてしまうことになるかもしれませんが、 よろしければご確認ください。 なお、失念していたのですが、diksam.lには以下の不具合があります。 http://kmaebashi.com/programmer/devlang/book/seigo.html#p186 この件には関係しないと思うのですが、追記しておきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1762] Re:DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:ICHIA
2012/01/08 04:59:45

昨年はとてもお世話になりました、 今年もよろしくお願い致します。 連絡が、年を越してすみませんでした。 調査結果を報告します。 >そこで確認ですが、 >①入力ファイルの文字コードは何でしょうか? od -cxかなにかでバイト列は取得できますか? LANG=ja_JP.PCK のSJISです。 ソースのマルチバイトの部分のバイト列です。 println("あいうえおbb"); ^^^^^^^^^^^^^^ 22 82a0 82a2 82a4 82a6 82a8 62 62 22 でした。 >②dvm_mbstowcs_lenに渡す直前の、st_string_literal_bufferのバイト列は取得できますか? st_string_literal_buffer[0]~[12]までの値はわかりますか? > ・dkc_close_string_literal()の文字列長を得る関数の復帰値で、 「-1」が返って来た時に、バイト列を表示してみました。 ============================================== string.c:dkc_close_string_literal()  L47: new_str_len = dvm_mbstowcs_len(st_string_literal_buffer); if (new_str_len < 0) { 追加> for(i=0;i<20;i++) 追加> printf("st_string_literal_buffer[%d]:%x \n",         i,st_string_literal_buffer[i]); ============================================== 結果: st_string_literal_buffer[0]:a0 st_string_literal_buffer[1]:a2 st_string_literal_buffer[2]:a4 st_string_literal_buffer[3]:a6 st_string_literal_buffer[4]:a8 st_string_literal_buffer[5]:62 st_string_literal_buffer[6]:62 st_string_literal_buffer[7]:0 st_string_literal_buffer[8]:0 8バイト目以降は、0x00 になります。 マルチバイトの1バイトが飛ばされているようです。 ・文字列の取得についてですが、  デバック用の文字列を入れて確認しました。  -リテラル(ダブルクォーテーション)の最初と最後の取込みは出来ていました。  -リテラル部分の取込みは、diksam.l Line295 で行われていました。   取込み時にもバイト列を表示させてみましたが、   上記と同じでした。 以上となります。 どうすれば、1バイト目が取り込めるようになるのでしょうか? 現状のdiksam.l で不備はないと思えるのですが・・・ アドバイスをよろしくお願い致します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1761] 管理者により削除されました
2012/01/01 12:23:12

テスト投稿なので削除しました。テスト投稿はテスト用掲示板にお願いします。 # 新年早々こんなことを書かなきゃいけないむなしさよ。
[この投稿を含むスレッドを表示]
[1760] Re:DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:(ぱ)こと管理人
2011/12/22 03:47:16

>入力ソースは1行だけで、 println("あいうえおbb"); ええとですね。 >まだ、マルチバイト無しのエラー系は完璧には動作していません。 「マルチバイト無しのエラー系」が動かないのではなくて、「マルチバイトありの正常系」が動かない、というのが現状ということでしょうか? そうだとして、 >パラメタのst_string_literal_bufferは、”\240「,ヲィbb”で化けております。 >入力ソースは1行だけで、 println("あいうえおbb"); st_string_literal_bufferをデバッガで見たのだと思いますが、それだと、バイト列をデバッガが表示するところで文字化けが起きるので、渡ってきている正確なバイト列はわからないと思います。 ただ、いずれにしてもbbまで出ているわけですから、入力ファイルの、ダブルクォートが始まってから終わるまでの文字列は、dvm_mbstowcs_len()にまで届いているように見えま す。(たぶんですが。バイト数が違うっぽいのが結構怪しいですが) >①~③までの役割は以下の解釈であっているでしょうか? > ①は、マルチバイト処理用、 >  SJISコードの漢字の範囲のコードが来たら2バイト単位で >  リテラルに取り上げる所 > ②は、1バイト処理用 >  リテラル文字を1バイト単位でリテラルに取り上げる箇所 > ③は、②の続きで、 >  コンパイル時の指定文字コードがSJISだった場合、 >  2バイト目に0x5cを持つ可能性がある1バイト目が来た場合、 >  次の2バイト目も一緒にリテラルに吸上げる所 これは合っていますけど、いずれにしてもこの処理は、「入力ファイルの、ダブルクォートが始まってから終わるまでのバイト列」を、間違いなくdvm_mbstowcs_len()に届けるための処理でしかありません。0x5cのような変な文字が来なければ、あまり意識しなくてよいはずのところです。 そこで確認ですが、 ①入力ファイルの文字コードは何でしょうか? od -cxかなにかでバイト列は取得できますか? ②dvm_mbstowcs_lenに渡す直前の、st_string_literal_bufferのバイト列は取得できますか? st_string_literal_buffer[0]~[12]までの値はわかりますか? そこまでわかったら、正確なバイト列がdvm_mbstowcs_len(の中のmbrtowc)に渡ったと仮定できますから、環境変数LANGが何であるのかとかの話になるのかと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1759] Re:DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:ICHIA
2011/12/22 03:10:54

追加情報になります。 diksam.l の動作について SJIS対応の文字リテラルで関係のありそうな箇所(①~③)に、 printf()を入れてデバックしてみました。 ①~③までの役割は以下の解釈であっているでしょうか?  ①は、マルチバイト処理用、   SJISコードの漢字の範囲のコードが来たら2バイト単位で   リテラルに取り上げる所  ②は、1バイト処理用   リテラル文字を1バイト単位でリテラルに取り上げる箇所  ③は、②の続きで、   コンパイル時の指定文字コードがSJISだった場合、   2バイト目に0x5cを持つ可能性がある1バイト目が来た場合、   次の2バイト目も一緒にリテラルに吸上げる所 ######### <STRING_LITERAL_STATE>[\x81-\x9f\xe0-\xef][\x40-\x7e\x80-\xfc] { ① dkc_add_string_literal(yytext[0]); dkc_add_string_literal(yytext[1]); } <STRING_LITERAL_STATE><<EOF>> { dkc_compile_error(dkc_get_current_compiler()->current_line_number, EOF_IN_STRING_LITERAL_ERR, MESSAGE_ARGUMENT_END); } <STRING_LITERAL_STATE>. { Encoding enc = dkc_get_current_compiler()->source_encoding; ② dkc_add_string_literal(yytext[0]); if (enc == SHIFT_JIS_ENCODING && ((unsigned char*)yytext)[0] >= 0x81 && ((unsigned char*)yytext)[0] <= 0x9e) { ③ BEGIN SHIFT_JIS_2ND_CHAR; } } ######### ”表”等の文字を入れても①③が表示されておらず、②ばかりでした。 自分の解釈からすると、日本語は①か③で処理されるはずだと 思っていましたが、どうも違っていました。 enc=SJISだと判定されていないのか? SJIS文字コードは取得できていないのか? どうしてそうなってしまうのか? そこで、encの確認をしてみました。 ③のIFの条件を、SJISだった場合と2バイト目が0x5c範囲を持つものと段階的にバラシて見ました。 #### if(enc == SHIFT_JIS_ENCODING){ ④ if(((unsigned char*)yytext)[0] >= 0x81) && ((unsigned char*)yytext)[0] <= 0x9e) ){ ③ ##### ④は表示されました。コンパイルのencは問題ないようです。 @そこで、solaris特有なのか?と思い、 このサーバにEUCコードの環境を作って動作させて見ました。 ちょっと手を加える必要がありましたが、動作しました。 test/test.dkm を動作させた所、「不正なマルチバイト」が出力されました。 お尻の「日本語」の部分をコメントにしたら、正常に動作しました。 更に、「日本語」を分解していき、「語」があると「不正なマルチバイト」になる事がわかりました。 また、exit(1)を削除して、最後の文字列を表示させてみたら同じく「不正なマルチバイト」になり、上記と同様にしたら「れ」が原因だと判明しました。 語: B8EC れ: A4EC と2バイト目が"EC"で何かあるのでしょうか?0x5cの様なものが。 asciiコードの"EC"を見てもおかしくなるような感じはありませんでしたが・・・ 以上が現在の調査状況になります。 なにか、ヒントがあればよろしくお願い致します。 相手をしてくれて感謝しております。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1758] Re:DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:ICHIA
2011/12/21 00:09:24

回答ありがとうございました。 凄く参考になりました。 GDBで確認しました、内容は以下の通りになります。 >その中のどれでエラーになっているかはわかりますでしょうか? string.c dkc_close_string_literal(void) { ・・・・ ・・・・ dkc_add_string_literal('\0'); new_str_len = dvm_mbstowcs_len(st_string_literal_buffer); if (new_str_len < 0) { ERRORメッセージ出力 不正なマルチバイトのエラーは、 dvm_mbstowcs_len() の復帰値が、”-1”で発生していました。 パラメタのst_string_literal_bufferは、”\240「,ヲィbb”で化けております。 入力ソースは1行だけで、 println("あいうえおbb"); マルチバイトなしでの確認をしました。 入力ソースは1行だけで、 println("aaaaaaaaa"); 正常に動作しました。 パラメタのst_string_literal_bufferは、「aaaaaaaaaa」でした。 なので、マルチバイトの時の読み込みがやはりうまくいっていないのだと 判断してもよいと思われます。 字句解析のどこで詰まっているんでしょうか? GDBで解析してみましたが、イマイチ解析箇所がわかりませんでした。 また、なにかヒントがあれば教えてください。 ピンポイントで指摘して頂けるので、本当に助かります。 以上です、 よろしくお願い致します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1757] Re:DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:(ぱ)こと管理人
2011/12/20 02:41:53

引用の順番を変えています。 >以下の箇所は、EUC版もWINDOWS版(SJIS)も違いがありませんが、 >コード系関係なく同じで構わないのでしょうか? この部分は、 dkc_get_current_compiler()->source_encoding; の値により動きを変えており、それの値はMakefile中の -DSHIFT_JIS_CODEのような指定で制御しています(interface.c)。 しかし、仮にここの指定を誤っていたとしても、入力するソースがASCII文字からだけで構成されているのなら、エラーにはならないように思います。 >やっとDIKSAMが、マルチバイト無しの正常系が動作し始めました。 >まだ、マルチバイト無しのエラー系は完璧には動作していません。 「マルチバイト無しのエラー系」とのことですし。 >自分のSJIS環境では、「不正なマルチバイト文字です。」と >なってしまいます。 このエラーメッセージは、このように、列挙子BAD_MULTIBYTE_CHARACTER_ERRに対応しています。 dkc_compile_error(dkc_get_current_compiler()->current_line_number, BAD_MULTIBYTE_CHARACTER_ERR, MESSAGE_ARGUMENT_END); これが発生する箇所は、BAD_MULTIBYTE_CHARACTER_ERRで*.cを検索するとわかるようにDiksamのver.4系だと5箇所あるようです。 ver.2系だと4箇所のようです。こちら: http://kmaebashi.com/programmer/devlang/diksam_src_0_2/R/19.html その中のどれでエラーになっているかはわかりますでしょうか? 何を言っているのかというと、入力となるDiksamのソースのマルチバイト文字の解釈でエラーになっているのではなく、別の原因で起きたコンパイルエラーの、日本語エラーメッセージの変換でエラーになっているのでは? と思っているわけです。 そちらの環境が再現できてるわけでもないのであくまで推測です。また、もしエラーメッセージの変換で失敗しているのなら、「不正なマルチバイト文字です。」はなぜ正しく出るのかという疑問もわきます。 というわけで確定情報は出せませんが、参考になりましたら。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1756] Re:DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:(ぱ)こと管理人
2011/12/19 12:56:43

すみません、回答遅れております。 その場所はencがSJISであるかどうかで動きが変わるのですが、それを決めているのはMakefileの-DSHIFT_JIS_SOURCEとかです。 今は携帯で辛いので詳細は今夜に。 >先日は、Solaris+SJISコードで動作させる為の環境構築の方法を教えて頂いてありがとうございました。 >やっとDIKSAMが、マルチバイト無しの正常系が動作し始めました。 >まだ、マルチバイト無しのエラー系は完璧には動作していません。 >##################### >int a=0; > >if(a==0){ > println("CCCC"); >##################### >このソースと全く同じではありませんが、「}なし」のエラーを狙いテストしますが、 >EUC版は、「文法エラー($(token)付近)」 が出力されます。 >自分のSJIS環境では、「不正なマルチバイト文字です。」と >なってしまいます。 > >そこで、つっかえている所がマルチバイトの読込み辺りだと当たりがつきます。 > >また、自分の構築している環境では、マルチバイトが処理出来ていません。 >字句解析(lex)でのマルチバイトの読込みがまだうまく出来ていないからだと思っています。 > >ちゃんと調べてもいないのに質問して申し訳ありませんが、教えてください。 >以下の箇所は、EUC版もWINDOWS版(SJIS)も違いがありませんが、コード系関係なく同じで構わないのでしょうか? >自分の構築したい環境でなにか考慮すべき所はありませんでしょうか? > ><STRING_LITERAL_STATE>[\x81-\x9f\xe0-\xef][\x40-\x7e\x80-\xfc] { > dkc_add_string_literal(yytext[0]); > dkc_add_string_literal(yytext[1]); >} ><STRING_LITERAL_STATE>. { > Encoding enc = dkc_get_current_compiler()->source_encoding; > dkc_add_string_literal(yytext[0]); > if (enc == SHIFT_JIS_ENCODING > && ((unsigned char*)yytext)[0] >= 0x81 > && ((unsigned char*)yytext)[0] <= 0x9e) { > BEGIN SHIFT_JIS_2ND_CHAR; > } >} ><SHIFT_JIS_2ND_CHAR>. { > dkc_add_string_literal(yytext[0]); > BEGIN STRING_LITERAL_STATE; >} >
[この投稿を含むスレッドを表示] [この投稿を削除]
[1755] Re:DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:ICHIA
2011/12/16 04:24:32

先日は、Solaris+SJISコードで動作させる為の環境構築の方法を教えて頂いてありがとうございました。 やっとDIKSAMが、マルチバイト無しの正常系が動作し始めました。 まだ、マルチバイト無しのエラー系は完璧には動作していません。 ##################### int a=0; if(a==0){ println("CCCC"); ##################### このソースと全く同じではありませんが、「}なし」のエラーを狙いテストしますが、 EUC版は、「文法エラー($(token)付近)」 が出力されます。 自分のSJIS環境では、「不正なマルチバイト文字です。」と なってしまいます。 そこで、つっかえている所がマルチバイトの読込み辺りだと当たりがつきます。 また、自分の構築している環境では、マルチバイトが処理出来ていません。 字句解析(lex)でのマルチバイトの読込みがまだうまく出来ていないからだと思っています。 ちゃんと調べてもいないのに質問して申し訳ありませんが、教えてください。 以下の箇所は、EUC版もWINDOWS版(SJIS)も違いがありませんが、コード系関係なく同じで構わないのでしょうか? 自分の構築したい環境でなにか考慮すべき所はありませんでしょうか? <STRING_LITERAL_STATE>[\x81-\x9f\xe0-\xef][\x40-\x7e\x80-\xfc] { dkc_add_string_literal(yytext[0]); dkc_add_string_literal(yytext[1]); } <STRING_LITERAL_STATE>. { Encoding enc = dkc_get_current_compiler()->source_encoding; dkc_add_string_literal(yytext[0]); if (enc == SHIFT_JIS_ENCODING && ((unsigned char*)yytext)[0] >= 0x81 && ((unsigned char*)yytext)[0] <= 0x9e) { BEGIN SHIFT_JIS_2ND_CHAR; } } <SHIFT_JIS_2ND_CHAR>. { dkc_add_string_literal(yytext[0]); BEGIN STRING_LITERAL_STATE; }
[この投稿を含むスレッドを表示] [この投稿を削除]
[1754] Re:DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:ICHIA
2011/12/01 01:07:43

素早い回答ありがとうございます。 連絡が遅れてすいませんでした。 >(2)(コンパイラの)Makefileの中に-DEUC_SOURCEとか-DSHIFT_JIS_SOURCEとかの > 指定が入っている。SJISでは、「表」のように2バイト目に0x5Cを含む > 文字が存在しうるので、いわゆる0x5C問題が起こります。これを回避する > コードが入っています。(-DEUC_SOURCEと-DUTF8_SOURCEの動きは同じです) > これを使用しているのはcrowbar.lまたはdiksam.lです。 Makefile を -DSHIFT_JIS_SOURCE に変更しました。 errror_message.c は、iconv で変換しました。 コンパイラはgccを利用していますが、コンパイルも問題なく通りました。 例の場所でのエラーは回避できました! ありがとうございます。 diksamは、ちょっと進んで、コンパイルエラーが出てとまりました。 「int a; 」 だけのテストプログラムなんですが・・・ これから、GDBで詳しく調べていきます。 わからない事があったら、またお願い致します。 ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1752] Re:無題
投稿者:(ぱ)こと管理人
2011/11/27 23:12:35

>高校生活最後の昼休みには何をすればよいか? 高校生は卒業前は学校は半ドンになったりして、高校生活最後の昼休みって 結構早い時期にあったりしてたっけか。 まあ、とりあえず、メシを食えばよいのでは。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1751] Re:DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:(ぱ)こと管理人
2011/11/27 23:10:36

はじめまして。 >なので、漢字コードがSJISになっております。 > >LANG環境変数=ja_JP.PCK > >そこで、もちろんなんですが、EUC版もUTF-8版も下記エラーになってしまいます。 >どの様に対応したらよいのか教えて頂けないでしょうか? crowbarやDiksamのソースコードで、SJIS版、EUC版、UTF-8版の違いは 以下の通りです。 (1)error_message.cの文字コードが違う。crowbar, Diksamともに、  エラーメッセージは日本語で出ますし、そのメッセージはerror_message.c内に  埋め込まれています。エラーメッセージも表示前にwchar_tに変換するのですが、  この変換でエラーになっているというのが現状です。 (2)(コンパイラの)Makefileの中に-DEUC_SOURCEとか-DSHIFT_JIS_SOURCEとかの  指定が入っている。SJISでは、「表」のように2バイト目に0x5Cを含む  文字が存在しうるので、いわゆる0x5C問題が起こります。これを回避する  コードが入っています。(-DEUC_SOURCEと-DUTF8_SOURCEの動きは同じです)  これを使用しているのはcrowbar.lまたはdiksam.lです。 (3)お使いのコンパイラがgccの場合は、gcc自体の0x5C問題に引っかかるので、  SJIS版(Windows版)のerror_message.cでは、随所に\が入っています。  Windows版のerror_message.cを使うか、gccのオプション指定をする必要が  あります。 というわけで、対策は以下のようになるかと思います。(試していません) ・error_message.cの文字コードをSJISにする。必要に応じて\を入れて  0x5C問題に対応するか、gccのオプションを指定する。 ・Makefileの-DEUC_SOURCEとかになっているところを「-DSHIFT_JIS_SOURCE」に  変更する。 Windows版のソースを参考にされるとよいのではないかと。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1750] Re:DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:ICHIA
2011/11/27 03:34:38

初めて投稿します。 Cソースの静的解析ツールを作成したくて、参考になる物を探し続けて やっとこのHPにたどり着きました。ありがとうございます。 自分の使っているサーバの環境ですが、ちょっと変わっています。 PCでソースを編集し、solarisでコンパイルする事になっています。 なので、漢字コードがSJISになっております。 LANG環境変数=ja_JP.PCK そこで、もちろんなんですが、EUC版もUTF-8版も下記エラーになってしまいます。 どの様に対応したらよいのか教えて頂けないでしょうか? お手数をおかけして申し訳ありませんが、 よろしくお願いいたします。 >Assertion failure (wc_format != NULL) file..error.c line..92 >wc_format is null. >Assertion failure (wc_format != NULL) file..error.c line..92 >wc_format is null.
[この投稿を含むスレッドを表示] [この投稿を削除]
[1749] 無題
投稿者:LDK
2011/11/24 23:50:10

高校生活最後の昼休みには何をすればよいか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1748] Re:Cにおける列挙型の扱いについて
投稿者:yuya
2011/10/10 14:07:56

再度ありがとうございます。 ># 集合論的におかしい 激しく同意。例によって例のごとく、といいますか(^^;) >となり、やはり int となるため問題ないです。 了解です。 >6.7.2.2 の[制約]は[定数の値を定義する式]としか書いてないので、 >enum e_bbb { bbb=2147483647, ccc }; は言語規格書的には合法と考えざるを得ません。 ># gcc ではきっちりコンパイルエラーになりますが。 ですよねぇ。そこも凄く気になってました。 ちなみにLSI-Cで試すとコンパイルが通りました。 (intが2バイトで、bbbを32767とするとcccは-32768)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1747] Re:Cにおける列挙型の扱いについて
投稿者:774RR
2011/10/10 12:54:21

以下 JIS X3010:2003 より抜粋するので C の場合に限定 6.7.2.2 - 列挙型 - 列挙子並びの中の識別子は、型 int を持つ定数として宣言され、 この型の定数が許されるところならばどこに現れてもよい なので元ネタのキャストは要らないと判断してよさそうです。 enum e_aaa 型の underlying type は char であってもよい、のと、 その要素である aaa の型は int である、のとが矛盾してるように見えますが・・・ # 集合論的におかしい enum 型の識別子ではなくて enum 型の変数(オブジェクト)が現れた場合には 6.2.5 - 型 - 列挙体は[整数型]である 6.3.1.1 - 整数型 - 整数拡張 元の型のすべての値が int 型で表現可能な場合 int 型に変換される 6.7.2.2 - 列挙型 - 列挙定数の (既述につき snip) となり、やはり int となるため問題ないです。 6.7.2.2 の[制約]は[定数の値を定義する式]としか書いてないので、 enum e_bbb { bbb=2147483647, ccc }; は言語規格書的には合法と考えざるを得ません。 # gcc ではきっちりコンパイルエラーになりますが。 C++ の場合はこの辺いろいろ規制緩和されている+言語仕様も厳密化されているので 仕様書を読んでいて安心できます。先の [制約] のような不安要素も文書化され済み。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1746] Re:Cにおける列挙型の扱いについて
投稿者:yuya
2011/10/09 18:08:45

774RRさん、ありがとうございます。よく理解できました。 列挙体のメンバを右辺値として使うときに「int型の定数」とみなして実質的に不都合が起こることはなさそうですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1745] Re:Cにおける列挙型の扱いについて
投稿者:774RR
2011/10/07 13:32:08

>例えばメンバの値の範囲がcharで収まるなら、 >処理系はcharを使って領域を節約してもよい ですます。たとえば gcc であれば -fshort-enums オプションがあります。 enum e_aaa { aaa=1 }; printf("%zd\n", sizeof (enum e_aaa)); -fshort-enums なしでコンパイルすると 4 -fshort-enums ありでコンパイルすると 1 >あくまで「(charと適合する)列挙型の列挙定数」であって、 >式の中に現れると汎整数拡張されてint型に格上げされる ですます。 ただし sizeof('a') と同様に C と C++ で違うところなので要注意。 printf("%zd\n", sizeof (aaa)); gcc -fshort-enums hoge.c だと 4 g++ -fshort-enums hoge.cpp だと 1
[この投稿を含むスレッドを表示] [この投稿を削除]
[1744] Cにおける列挙型の扱いについて
投稿者:yuya
2011/10/07 09:35:26

C限定の話で、列挙型についての疑問です。 JIS X3010:2003の6.7.2.2 列挙型指定子(p77~p78)に、 > 制約 列挙定数の値を定義する式は、int型で表現可能な値を持つ整数定数式でなければならない (中略) >それぞれの列挙型は、char、符号付き整数型又は符号無し整数型と適合する型とする。型の選択は、処理系定義とする。しかし、その型は列挙型のすべてのメンバの値を表現できなければならない。 とあります。 列挙型が必ずしもint型ではなく上記のような選択の余地を処理系に与えているのは、 例えばメンバの値の範囲がcharで収まるなら、処理系はcharを使って領域を節約してもよい、という意義だと理解してよいのでしょうか? 通常、列挙体のメンバを式中で用いるときには、何も意識せずにint型の定数として (私は)書いているのですが、このメンバ自体はint型とは限らないわけですよね。 ある列挙型に対して例えば「charと適合する型」が選ばれた場合、そのメンバは あくまで「(charと適合する)列挙型の列挙定数」であって、 式の中に現れると汎整数拡張されてint型に格上げされる、という理解でよいのでしょうか? この疑問が生じた直接のきっかけは、(ぱ)さんの「プログラミング言語MIL」の雑誌記事のmini_mvm.cにおいて、 (A)や(B)の箇所でintへのキャストがなされているのを見て、「どんなときにキャストすべきなんだっけ?」と再考したことによります。 相変わらず記事の本筋と関係なくてすみません……。 皆様よろしければご教示ください。 typedef enum { OP_PUSH_INT, OP_ADD, OP_MUL, OP_PRINT } OpCode; int g_bytecode[] = { /* (A) */ (int)OP_PUSH_INT, 10, (int)OP_PUSH_INT, 2, (int)OP_PUSH_INT, 4, (int)OP_MUL, (int)OP_ADD, (int)OP_PRINT, }; int st_stack[STACK_SIZE_MAX]; void mvm_execute(void){ int pc = 0; int sp = 0; // スタックポインタ while (pc < sizeof(g_bytecode) / sizeof(*g_bytecode)) { switch (g_bytecode[pc]) { case OP_PUSH_INT: // 整数をスタックに積む st_stack[sp] = (int)g_bytecode[pc+1]; /* (B) */ sp++; pc += 2; break; case OP_ADD: // 加算 /* 以下略 */ } } }
[この投稿を含むスレッドを表示] [この投稿を削除]
[1743] モチベが~~~
投稿者:
2011/10/05 16:07:12

また、モチベーションが落ちてきた… 根性が居る修正を始めようとして、なぜか横道に逸て、逸れすぎて。 何をしようとしてたか忘れた。 もちろん、大きな内容の修正は忘れてないが、ソースのどの部分を修正しようと してたのか忘れた… 何かしないと復活できない>< (日記ですね;;)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1741] Re:ローカル変数のアドレスをスタックにpushしている?
投稿者:とも
2011/09/11 11:34:04

早速のお返事ありがとうございます。 なるほど、crowbarスタックの構造を勘違いしてました。 Stack構造体のstackメンバがCRB_Value*型だということは、"CRB_Value*"の集合ではなく、"CRB_Value"そのものの集合だということですね。 自分で作成中のものが、スタックを"アドレスの集合"にしているので、それと同じだと思い込んでいました。 参考になりました。 これからも、「プログラミング言語を作る」を参考にオリジナル言語の作成を続けたいと思います。 >こんにちは。ご意見ありがとうございます。 > >>「プログラミング言語を作る」を大いに参考にさせて頂いています。 >>というより、かなりまねをさせてもらってます。 > >そういっていただけると私も嬉しいです。 > >>関数の初頭で、resultというCRB_Value型の変数を宣言していますね。 >>式の評価結果をそれに詰め、最終的にcrowbarスタックにそのアドレスをpushしていると思います。 >>しかし、resultはローカル変数なので、関数を抜けるとその領域は既に使えないのではないか?という心配です。 > >・resultはローカル変数なので、関数を抜けるとその領域は使えません。 >・最終的にcrowbarスタックにresultをpush()する際は、以下のような処理を > 行っています。 > push_value(inter, &result); >・resultのポインタをpush_value()に渡したって、resultの領域は > すぐに開放されてしまうのだから役に立たないのではないか? というのが > ご懸念されていることだと思います。 > >しかし、push_value()の中では、最終的には以下のようにして値をcrowbarスタックに >格納しています。 > >static void >push_value(CRB_Interpreter *inter, CRB_Value *value) >{ >(中略) > inter->stack.stack[inter->stack.stack_pointer] = *value; > >渡されたCRB_Valueは確かにポインタですが、*演算子により >「ポインタの指す先の値」をコピーしてスタックに格納していますので、 >この後でresultが開放されても問題ありません。 > >なお、push_value()の引数として、CRB_Value*ではなくCRB_Valueを受け取るように >することはもちろん可能です。 >現状の実装でなぜポインタを渡しているのかというと…… 構造体は大きいかも >しれないので値渡しをすると効率上の問題が出るかも、という懸念があったのかと >思います。実際問題としては、CRB_Value程度のサイズの型なら値渡しにするという >選択肢は十分考えられると思うのですけれども。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1740] Re:ローカル変数のアドレスをスタックにpushしている?
投稿者:(ぱ)こと管理人
2011/09/11 03:00:48

こんにちは。ご意見ありがとうございます。 >「プログラミング言語を作る」を大いに参考にさせて頂いています。 >というより、かなりまねをさせてもらってます。 そういっていただけると私も嬉しいです。 >関数の初頭で、resultというCRB_Value型の変数を宣言していますね。 >式の評価結果をそれに詰め、最終的にcrowbarスタックにそのアドレスをpushしていると思います。 >しかし、resultはローカル変数なので、関数を抜けるとその領域は既に使えないのではないか?という心配です。 ・resultはローカル変数なので、関数を抜けるとその領域は使えません。 ・最終的にcrowbarスタックにresultをpush()する際は、以下のような処理を  行っています。 push_value(inter, &result); ・resultのポインタをpush_value()に渡したって、resultの領域は  すぐに開放されてしまうのだから役に立たないのではないか? というのが  ご懸念されていることだと思います。 しかし、push_value()の中では、最終的には以下のようにして値をcrowbarスタックに 格納しています。 static void push_value(CRB_Interpreter *inter, CRB_Value *value) { (中略) inter->stack.stack[inter->stack.stack_pointer] = *value; 渡されたCRB_Valueは確かにポインタですが、*演算子により 「ポインタの指す先の値」をコピーしてスタックに格納していますので、 この後でresultが開放されても問題ありません。 なお、push_value()の引数として、CRB_Value*ではなくCRB_Valueを受け取るように することはもちろん可能です。 現状の実装でなぜポインタを渡しているのかというと…… 構造体は大きいかも しれないので値渡しをすると効率上の問題が出るかも、という懸念があったのかと 思います。実際問題としては、CRB_Value程度のサイズの型なら値渡しにするという 選択肢は十分考えられると思うのですけれども。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1739] ローカル変数のアドレスをスタックにpushしている?
投稿者:とも
2011/09/10 21:18:23

始めて投稿します。 趣味で、オリジナルの言語を作成している途中です。 「プログラミング言語を作る」を大いに参考にさせて頂いています。 というより、かなりまねをさせてもらってます。 その中で気になるところがあり、投稿しました。 私自身はC言語をそれなりに習得しているつもりなのですが、誤解があったらご指摘下さい。 気になったのは、書籍の163ページの下部から165ページにわたる、eval_method_call_expression関数の例です。 eval系では、似たようなコードがいくつかあると思います。 関数の初頭で、resultというCRB_Value型の変数を宣言していますね。 式の評価結果をそれに詰め、最終的にcrowbarスタックにそのアドレスをpushしていると思います。 しかし、resultはローカル変数なので、関数を抜けるとその領域は既に使えないのではないか?という心配です。 Cでは関数の戻り値としてローカル変数のアドレスを返そうとすると警告が出ると思います。 書籍の例は、関数の戻り値として返しているわけではないので警告は出ないとは思います。 が、crowbarスタックにpushするということは、後からそれを使用する可能性があると思うのですが。 つまり次のプログラムと本質的には同じ事をしているように思えます。 ---------------------------------------------- #include <stdio.h> typedef struct { int type; char* data; } CRB_Value; CRB_Value *value; void eval_method_call_expression(){ CRB_Value result; result.type = 10; result.data = "Hello!"; value = &result; } int main(){ eval_method_call_expression(); printf("%d\n", value->type); printf("%s\n", value->data); } ---------------------------------------------- コンパイルではエラーも警告も出ないですが、上のプログラムはもちろん不正です。 既に議論済みだったら申し訳ありません。 はたまた、私がとんでもない勘違いをしているかもしれません。 御教示をお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1735] Re:もう忘れられている気が・・・
投稿者:
2011/08/14 16:28:20

返事ありがとうございます。 >これって問題になるほど遅いですかね? 関数パラメータのコピーや、ローカル変数の設定命や、 その初期値の設定等がバイトコードではなく、C++の1関数でまとめて 領域を作成して、定数コピーと参照アドレスの一括変換をする予定なので。 ローカル変数の設定処理に一切のバイトコードが無くなるんです。 その結果、トータルとして関数コールがとても高速になると思いますよ。 >6.5万行というと、言語処理系としては相当なサイズだと思うのですが… いえ、ほとんどは、私が作っている言語以外のシステムのコードです。 言語部分はそれほど多くはないです。 たぶん、前回の出した行数より少し増えただけだと思います。 いまは、画面表示は総てDirectXで表示して、3Dキャラが動き回ってます。 もちろん、コンソール的な機能も持っていて、print関数もDirectX上でコンソール をエミュレートして表示しています。getchar()やgets()関数もある。 これをしたからといってシステムが入力待ちで止まったりはしません。 言語上の1スレッドが入力待ちでシステムにもどる(タスクスイッチのOSに処理が 戻るようなもの)だけです。 いまは、システム全体をセーブして、ロードするとそこから再開できる機能を 作っています。ちょっと苦労してる。 PCで言うところにリジュームみたいな機能です。 今のバイトコードです。 関数コールとリターンを分割したので、void関数コールは速いです 組み込み関数と言語上の関数も分割。 一般的な言語ではなく、組込言語なので、エラー処理のほとんどは システムが受け持って処理するので、ほとんどの関数はエラーリターン がありません。そのため、90%以上の関数はvoid型になり高速処理されます。 そうそう、総ての型にキャスト命令を作っていますが、明示的な型変換の方が いいのか多少悩み中。将来この自動キャストは止めるかもしれません。  ↓ {L"dummy", L"", 0}, {L"push_int_1byte", L"b",8}, {L"push_int_2byte", L"s",8}, {L"push_int_4byte", L"i",8}, // 実際の値を持つ {L"push_double_0", L"", 12}, {L"push_double_1", L"", 12}, {L"push_double_8byte", L"d",12}, // 実際の値を持つ {L"push_string_const", L"s",12}, // 文字列の位置NOを持つ0~ {L"push_null", L"", 8}, /**********/ {L"push_stack_int", L"s", 8}, // intローカル変数をスタックに {L"push_stack_double", L"s", 8}, // {L"push_stack_string", L"s", 12}, // {L"pop_stack_int", L"s", -8}, // スタックのintをローカル変数に {L"pop_stack_double", L"s", -8}, // {L"pop_stack_string", L"s", -12}, // /**********/ {L"push_static_int", L"s", 8}, // int静的変数をスタックに 予約 {L"push_static_double", L"s", 12}, // {L"push_static_string", L"s", 12}, // {L"pop_static_int", L"s", -8}, // スタックのintを静的変数に 予約 {L"pop_static_double", L"s", -12}, // {L"pop_static_string", L"s", -12}, // /**********/ {L"push_sheet", L"s", 8}, // sheet番号をスタックに {L"push_sheet_int ", L"s", 8}, // sheet変数をスタックに {L"push_sheet_double", L"s", 12}, // {L"push_sheet_str ", L"s", 12}, // {L"pop_sheet_int ", L"s", -24}, // スタックからsheet変数に {L"pop_sheet_double", L"s", -28}, // {L"pop_sheet_str ", L"s", -28}, // /**********/ {L"push_sheet_ref", L"s", 8}, // 参照したsheet番号をスタックに {L"push_sheet_ref_int ", L"s", 8}, // 参照sheet変数をスタックに {L"push_sheet_ref_double", L"s", 12}, // {L"push_sheet_ref_str ", L"s", 12}, // {L"pop_sheet_ref_int ", L"s", -24}, // スタックから参照sheet変数に {L"pop_sheet_ref_double", L"s", -28}, // {L"pop_sheet_ref_str ", L"s", -28}, // /**********/ {L"push_array_ref ", L"s", 8}, // 配列参照 {L"push_array_int ", L"s", -1}, // int配列処理 {L"push_array_double", L"s", -1}, // {L"push_array_string", L"s", -1}, // {L"pop_array_int ", L"s", -1}, // スタックからint配列に {L"pop_array_double", L"s", -1}, // {L"pop_array_string", L"s", -1}, // /**********/ {L"and_int", L"", -8}, // 以下は総て算術演算子 {L"or_int", L"", -8}, {L"xor_int", L"", -8}, {L"add_int", L"", -8}, {L"add_double", L"", -12}, {L"add_string", L"", -12}, {L"sub_int", L"", -8}, {L"sub_double", L"", -12}, {L"mul_int", L"", -8}, {L"mul_double", L"", -12}, {L"div_int", L"", -8}, {L"div_double", L"", -12}, {L"mod_int", L"", -8}, {L"mod_double", L"", -12}, {L"minus_int", L"", 0}, {L"minus_double", L"", 0}, {L"increment", L"", 0}, {L"decrement", L"", 0}, // ここまで算術演算子 /**********/ {L"cast_int_to_double", L"", 4}, // 以下はキャスト処理 {L"cast_double_to_int", L"", -4}, {L"cast_string_to_int", L"", -4}, {L"cast_string_to_double", L"", 0}, {L"cast_boolean_to_string", L"", 4}, {L"cast_int_to_string", L"", 4}, {L"cast_double_to_string", L"", 0}, // ここまでキャスト処理 /**********/ {L"eq_int", L"", -8}, // 以下は総て論理演算子 {L"eq_double", L"", -16}, {L"eq_string", L"", -16}, {L"gt_int", L"", -8}, {L"gt_double", L"", -16}, {L"gt_string", L"", -16}, {L"ge_int", L"", -8}, {L"ge_double", L"", -16}, {L"ge_string", L"", -16}, {L"lt_int", L"", -8}, {L"lt_double", L"", -16}, {L"lt_string", L"", -16}, {L"le_int", L"", -8}, {L"le_double", L"", -16}, {L"le_string", L"", -16}, {L"ne_int", L"", -8}, {L"ne_double", L"", -16}, {L"ne_string", L"", -16}, // ここまで論理演算子 {L"logical_and",L"", -8}, // {L"logical_or", L"", -8}, // {L"logical_not",L"", 0}, // /**********/ {L"pop", L"", -8}, // スタックを1つ減らす {L"duplicate", L"", 16}, // スタック内容をコピーしてスタックに {L"jump", L"s", 0}, // 指定ポインターにjump {L"jump_if_true", L"s", -8}, // スタックがtrueならjump {L"jump_if_false", L"s", -8}, // スタックがfalseならjump {L"nop------------",L"", 0}, // nop /**********/ {L"push_function", L"", 0}, // 関数情報をスタック、未使用 {L"call_n_function_v", L"s", 0}, // void 組込み関数コール {L"call_n_function", L"s", 0}, // 組込み関数コール {L"call_function_v", L"ssss", 0}, // void 関数コール {L"call_function", L"ssss", 0}, // 関数コール {L"return_v", L"", -1}, // void 関数戻り {L"return", L"", -1}, // 関数戻り /**********/ {L"set_array_literal_int", L"ss", 0}, // int定数配列を変数にコピー {L"set_array_literal_double",L"ss", 0}, // double定数配列を変数にコピー {L"set_array_literal_string",L"ss", 0}, // string定数配列を変数にコピー
[この投稿を含むスレッドを表示] [この投稿を削除]
[1734] Re:もう忘れられている気が・・・
投稿者:(ぱ)こと管理人
2011/08/10 02:17:58

お久しぶりです。 >・関数コールをVMの再帰ではなく、VM内でそのまま実行に変えました。 > (システムをそっくりセーブロードに必要なために) これはそのほうがよいと思います。そして、そうした場合、 >・関数起動の高速化は、優先順位が低くて保留。 これって問題になるほど遅いですかね? >その時は約3.5万行有ったのが、今は6.5万行になっても、まだ足りません(泣 >いまは、あと半年から1年で初期バージョンをと、またも楽観的な目標を>< 6.5万行というと、言語処理系としては相当なサイズだと思うのですが… javacでも、初代は1万行以内だと聞いたことがあるような気が(記憶違いかも しれませんけど)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1733] もう忘れられている気が・・・
投稿者:
2011/08/04 19:01:43

あまりにもお久しぶりです。 相変わらず作成は続いています。 言語的な変更点は。 ・関数コールをVMの再帰ではなく、VM内でそのまま実行に変えました。  (システムをそっくりセーブロードに必要なために) ・elsif -> else if に変更。(よりCに似せるために><) ・static 宣言の追加、sheetと関数宣言のみ。  (言語上のプログラムを多く書いていますが、やはりスコープが…)  (いっそのこと、継承・多態もないカプセル化だけのクラスを…) その他にもちょこちょこと。 ・関数起動の高速化は、優先順位が低くて保留。 8ヶ月前、半年から1年で初期バージョンができるのを期待していましたが。 その時は約3.5万行有ったのが、今は6.5万行になっても、まだ足りません(泣 いまは、あと半年から1年で初期バージョンをと、またも楽観的な目標を><
[この投稿を含むスレッドを表示] [この投稿を削除]
[1732] 無題
投稿者:test
2011/07/29 22:27:05

test
[この投稿を含むスレッドを表示] [この投稿を削除]
[1730] Re:たちよりました!
投稿者:(ぱ)こと管理人
2011/07/11 01:41:55

>最近、0からphpで掲示板を作ってみようと思ってます。その流れできてみましたー(`・♀・´) はじめまして。 うちのページを参考にしていただけるのは嬉しいのですが、 ・バージョンが古いこと ・magic quoteを前提にしたコードになっていること については留意してください。 こちらも参考にしてみてください。 http://kmaebashi.com/zakki/zakki0042.html
[この投稿を含むスレッドを表示] [この投稿を削除]
[1729] Re: 
投稿者:(ぱ)こと管理人
2011/07/11 01:39:21

>おれは良い意味で良い。 >おれは良い意味で良い。 >お前ら悪い意味で悪すぎ。 また注意書きの読めない人が適当なテスト投稿をしていったのかと思ったら、 はてなのブログのコメント欄まで同様の書き込みが……(消しますが) なんなんだろう。怖い。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1728] たちよりました!
投稿者:p
2011/07/10 19:15:39

最近、0からphpで掲示板を作ってみようと思ってます。その流れできてみましたー(`・♀・´)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1727]  
投稿者: 
2011/07/06 23:40:49

おれは良い意味で良い。 おれは良い意味で良い。 お前ら悪い意味で悪すぎ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1726] 管理者により削除されました
2011/06/29 02:52:57

テスト投稿はテスト掲示板にお願いします、とでかでかと書いてあるのに、なおここに書き込むような人達にはどう対処すべきなのですかねえ。
[この投稿を含むスレッドを表示]
[1722] 管理者により削除されました
2011/03/31 20:46:15

この掲示板の上部にリンクがありますが、テスト投稿はテスト用掲示板にお願いします。
[この投稿を含むスレッドを表示]
[1721] Re:構造体へのポインタを返す関数
投稿者:512
2011/03/21 20:06:13

おーこんなにたくさんの方が! みなさんどうもありがとうございます。 おかげさまでだいぶ大事なことをいくつか理解できました。 .hと.cの使い分けは正直うすうす悩んでいたことなので、 今回の質問で、間接的ではありますが、すっきりできてよかったです。 とりあえず元のコードの.hは大掃除した方がよさそうですね。 あと、intの場合なぜ通ってしまったかは、 これから聞こうと思っていたのですが、 皆さん先回りありがとうございます(笑 ここまで分かるとだいぶすっきり感がありますねぇ。 tiさんのサンプルコード大変参考になります。 たぶんまた近いうちに壁に当たって戻ってきますので 引き続きよろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1720] Re:構造体へのポインタを返す関数
投稿者:774RR
2011/03/21 19:58:15

えっと、今は「関数宣言」の話しかしてない、っての大丈夫? 「関数定義」の話は一切出てきてないんだけど。 関数宣言が何回現れても、関数定義がなければリンクエラーにはならないよん。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1719] Re:構造体へのポインタを返す関数
投稿者:774RR
2011/03/21 19:41:51

すばらしい。 typedef を使っているあたりが素敵すぎる。 というわけで第三者読者へのふぉろーを追加。 typedef は新しい型を作るのではなくて、既存の型への別名を作る。 提示の例だと名前のない構造体(便宜上 anonymous_struct_1 と名づける) struct anonymous_struct_1 { int val; }; に対して、別名1 KOUZOU1 別名2 KOUZOU2 をつけているだけ。 なので KOUZOU1 と KOUZOU2 はどちらも struct anonymous_struct_1 であり、 関数宣言のほうもエラーにならない。 typedef struct { int x; } KOUZOU1, *PKOUZOU2; KOUZOU1 *func(); PKOUZOU2 func(); int main() { return 0; } これもエラーにならない。 一方で KOUZOU3 は struct anonymous_struct_2 { int val; }; の別名になるので これは KOUZOU1, 2 とは別のものになり、宣言が矛盾するエラー。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1718] Re:構造体へのポインタを返す関数
投稿者:mano
2011/03/21 19:31:25

へぇ。そうなんだ。問題ないんだ。 遠い昔、Cコンパイラに怒られるのが嫌で、○○の一つ覚えみたいに、2個目以降はexternを付けたような、、、、確かリンカでエラーが、ん!あぁなるほど、今回はstaticだからだいじょーぶなんだ。。。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1717] Re:構造体へのポインタを返す関数
投稿者:yuya
2011/03/21 18:35:08

にゃるほどー。 コンパイラは宣言がダブってる(re-declared)ことに怒ってるんじゃなくて、 型が合わない(conflicting types)から怒ってるんですね。 >static KOUZOU3 *func();の行だけエラーです。 さすがにデータ構造がたまたま同じでも、別の構造体だとダメか(笑)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1716] Re:構造体へのポインタを返す関数
投稿者:ti
2011/03/21 18:16:48

tiです。 >矛盾しない関数宣言は何回行ってもよい(正しいプログラムである)ので、 >この2行があってもエラーにはならない。 >過去に書かれたソースコードとの互換性を維持するために、このコードに対して >警告は出ないのが大多数のコンパイラの挙動だろうね。 ># 俺的には、出たらびっくり。 どうもそうみたいでびっくりです(VC++ 2008で確認)。 実例です。 typedef struct { int val; } KOUZOU1,KOUZOU2; typedef struct { int val; } KOUZOU3; static KOUZOU1 *func(); static KOUZOU2 *func(); static KOUZOU3 *func(); int main(void) { return 0; } static KOUZOU3 *func();の行だけエラーです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1715] Re:構造体へのポインタを返す関数
投稿者:774RR
2011/03/21 15:56:46

512 氏の [1706] 発言に一言付け加えると理解しやすくなるだろう。 > 構造体ではなくintへのポインタであればエラーは出ません。 「両方を」を追加。 すると main.c 中には static int *func(); // File1.h 由来 static int *func(); // File2.h 由来 と書かれた2行が入ることになる。 矛盾しない関数宣言は何回行ってもよい(正しいプログラムである)ので、 この2行があってもエラーにはならない。 過去に書かれたソースコードとの互換性を維持するために、このコードに対して 警告は出ないのが大多数のコンパイラの挙動だろうね。 # 俺的には、出たらびっくり。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1714] Re:構造体へのポインタを返す関数
投稿者:mano
2011/03/21 12:17:05

[1706]の > 構造体ではなくintへのポインタであればエラーは出ません。 は、どう?エラーじゃなくても警告ぐらい出す気がするんだけど、 こちら、Cが詳しくないのでよく分りません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1713] Re:構造体へのポインタを返す関数
投稿者:(ぱ)こと管理人
2011/03/21 08:01:42

既に回答がついていますが、File1.hとFile2.hの static KOUZOU1 *func(); static KOUZOU2 *func(); このふたつのプロトタイプ宣言が、main.cの中で両方とも見えてしまって いるのが原因です。 「static KOUZOU1 *func()」という関数を、File1.cの中だけで使うのであれば、 .hファイルではなくFile1.cの中で宣言すればOKです。 関数定義自体を、それを呼び出すところよりも先に書けるのであればそれでも OKです(私はこちらの書き方の方が好みです)。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1712] Re:構造体へのポインタを返す関数
投稿者:774RR
2011/03/21 07:07:27

正解っす。あえてフォローするなら ti 氏が解説を省略したところを。 C のプリプロセッサは単純置換を行う機能であるため、 #include "hogehoge.h" は この行が hogehoge.h の中身に置き換わるだけ である、ということを意識すると理解が早い。 main.c は File1.h と File2.h を両方取り込む 取り込んだ結果のファイルを翻訳単位という main.c 中に static KOUZOU1* func(); と static KOUZOU2* func(); が両方入る 同一関数名が違う機能であると宣言されているのでエラー。 gcc -E hoge.c とか gcc -E -C hoge.c とかしてみると参考になるかもしれない。 次のステップへのヒントを 複数人開発をするようになると、重要度は .h ファイル> .c ファイル になる。 .h ファイルには「他人に使ってもらうため」の宣言・コメントを書く .c ファイルにはその実装を書く だから、 ・他人に使ってもらいたくない static 変数や関数は .h に書かずに .c に書く ・inline 展開される前提の短い static 関数は .h に書くことがある
[この投稿を含むスレッドを表示] [この投稿を削除]
[1711] Re:構造体へのポインタを返す関数
投稿者:ti
2011/03/21 02:28:24

tiと申します。 自分の勉強のため回答させていただきますので、 前橋さん間違いや補足のご指摘お願いします。 main.cの中で >#include "File1.h" >#include "File2.h" となっていて、 >static KOUZOU1 *func(); >static KOUZOU2 *func(); /* ここがエラーになります:error: conflicting types for 'func' */ で 展開後にfunc識別子が重複していることが原因です。 どちらかと関係するところを変えればコンパイルできるはずです。 なお、static宣言はmain.cなど、公開したくないソースに対してのヘッダファイルに 含めるべきでないと思います。 公開用(extern宣言の関数)と非公開用(ある関数だけで使うstatic宣言の関数)で ヘッダファイルは分けるべきです。 また、ヘッダファイルは二重展開防止機能をつけておきましょう。 #ifndef FILE1_H #define FILE1_H ~ #endif 以上 >お返事遅れました。 >(ぱ)さん、yuyaさん、ありがとうございます。 >(ぱ)さんの回答にひもづけて続けます。 > >下記がサンプルコードとエラーメッセージです。 >(環境はMac OSXのXcode3.2.4です。) > >main.c >-------------------------------------------------- >#include "File1.h" >#include "File2.h" > >int main (int argc, const char * argv[]) { > > file1(); > file2(); > > return 0; >} >-------------------------------------------------- > >File1.h >-------------------------------------------------- >typedef struct KOUZOU1_tag { > int var; >} KOUZOU1; > >void file1(); >static KOUZOU1 *func(); >-------------------------------------------------- > >File1.c >-------------------------------------------------- >#include <stdio.h> >#include <stdlib.h> >#include "File1.h" > >void file1() { > KOUZOU1 *kouzou; > kouzou = func(); > > printf("%d\n", kouzou->var); >} > >static KOUZOU1 *func() { > KOUZOU1 *kouzou; > > kouzou = malloc(sizeof(KOUZOU1)); > kouzou->var = 1; > > return kouzou; >} >-------------------------------------------------- > >File2.h >-------------------------------------------------- >typedef struct KOUZOU2_tag { > int var; >} KOUZOU2; > >void file2(); >static KOUZOU2 *func(); /* ここがエラーになります:error: conflicting types for 'func' */ >-------------------------------------------------- > >File2.c >-------------------------------------------------- >#include <stdio.h> >#include <stdlib.h> >#include "File2.h" > >void file2() { > KOUZOU2 *kouzou; > kouzou = func(); > > printf("%d\n", kouzou->var); >} > >static KOUZOU2 *func() { > KOUZOU2 *kouzou; > > kouzou = malloc(sizeof(KOUZOU2)); > kouzou->var = 2; > > return kouzou; >} >-------------------------------------------------- > >エラーは >error: conflicting types for 'func' >というもので >File2.h の static KOUZOU2 *func(); >の所に出ます。 > >ちなみに >error: previous declaration of 'func' was here >というメッセージも同時に出て、開くと >File1.h の static KOUZOU1 *func(); >を指していました。 > >やっぱりstaticを付けているのに >「funcさっき宣言したじゃん!」と言われているようなんですが、 >いかがでしょうか。 > >うーん、どこを勘違いしてるんだろうか。。。 > >よろしくお願いします! > >P.S. >「記憶クラス指定子」「型修飾子」の違いなど、 >自分で間違えて指摘されるとスムーズに理解しやすいですね。 >本で読むときはつい飛ばしてしまいがちですが(笑
[この投稿を含むスレッドを表示] [この投稿を削除]
[1710] Re:構造体へのポインタを返す関数
投稿者:512
2011/03/20 17:26:03

お返事遅れました。 (ぱ)さん、yuyaさん、ありがとうございます。 (ぱ)さんの回答にひもづけて続けます。 下記がサンプルコードとエラーメッセージです。 (環境はMac OSXのXcode3.2.4です。) main.c -------------------------------------------------- #include "File1.h" #include "File2.h" int main (int argc, const char * argv[]) { file1(); file2(); return 0; } -------------------------------------------------- File1.h -------------------------------------------------- typedef struct KOUZOU1_tag { int var; } KOUZOU1; void file1(); static KOUZOU1 *func(); -------------------------------------------------- File1.c -------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include "File1.h" void file1() { KOUZOU1 *kouzou; kouzou = func(); printf("%d\n", kouzou->var); } static KOUZOU1 *func() { KOUZOU1 *kouzou; kouzou = malloc(sizeof(KOUZOU1)); kouzou->var = 1; return kouzou; } -------------------------------------------------- File2.h -------------------------------------------------- typedef struct KOUZOU2_tag { int var; } KOUZOU2; void file2(); static KOUZOU2 *func(); /* ここがエラーになります:error: conflicting types for 'func' */ -------------------------------------------------- File2.c -------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include "File2.h" void file2() { KOUZOU2 *kouzou; kouzou = func(); printf("%d\n", kouzou->var); } static KOUZOU2 *func() { KOUZOU2 *kouzou; kouzou = malloc(sizeof(KOUZOU2)); kouzou->var = 2; return kouzou; } -------------------------------------------------- エラーは error: conflicting types for 'func' というもので File2.h の static KOUZOU2 *func(); の所に出ます。 ちなみに error: previous declaration of 'func' was here というメッセージも同時に出て、開くと File1.h の static KOUZOU1 *func(); を指していました。 やっぱりstaticを付けているのに 「funcさっき宣言したじゃん!」と言われているようなんですが、 いかがでしょうか。 うーん、どこを勘違いしてるんだろうか。。。 よろしくお願いします! P.S. 「記憶クラス指定子」「型修飾子」の違いなど、 自分で間違えて指摘されるとスムーズに理解しやすいですね。 本で読むときはつい飛ばしてしまいがちですが(笑
[この投稿を含むスレッドを表示] [この投稿を削除]
[1709] Re:構造体へのポインタを返す関数
投稿者:yuya
2011/03/18 11:07:40

どーでもいい私の感想ですが、 >もちろん関数の名前を変えれば解決するのですが、 >せっかくCを勉強しているので、原因をはっきりさせたいです。 これに惚れますね(笑)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1708] Re:構造体へのポインタを返す関数
投稿者:yuya
2011/03/18 10:46:38

(ぱ)さんのおっしゃる通りで、エラーメッセージ(とサンプルコード)をコピペしたものを見ないと原因は分かりませんが、 >staticが"func"にかかっていないのかな? >という気がしますが、どうなんでしょうか。 このような疑問が湧くということは、 static, extern のような「記憶クラス指定子」と、 constのような「型修飾子」を混同なさっているのではないかと思います。 static が宣言中のどこにあるかによって、宣言の意味が変わることはありません。 先頭以外に書いた場合には、先頭に書いたのと同じ意味になるか、文法エラーになるか、のどちらかです。 ……って言い切っちゃったけど自信ない(^^;)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1707] Re:構造体へのポインタを返す関数
投稿者:(ぱ)こと管理人
2011/03/18 03:34:38

はじめまして。 >最近C言語をがんばって勉強しています。(もちろん楽しいです) >ポインタ完全制覇には大変お世話になりました。 ありがとうございます。 で、ご質問の件ですが、 >現在、ソースファイルを分けてプログラムを書いており、 >他のファイルからアクセスしない関数にはstaticをつけています。 >なので、複数ファイル上で同名の関数を持っていても >エラーは出ません。 > >しかし、構造体へのポインタを返す関数の場合は、 >staticを付けてもエラーになってしまいます。 さすがにこれはありえないと思います。 戻り値の型が構造体へのポインタであっても、文法上、staticで名前を隠蔽することに 関係はしませんし、処理系のバグにしてもあまりにも変に見えます。 具体的にどのようなエラーが出ているのか、エラーメッセージを教えてもらえますか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1706] 構造体へのポインタを返す関数
投稿者:512
2011/03/17 22:11:51

はじめまして! 最近C言語をがんばって勉強しています。(もちろん楽しいです) ポインタ完全制覇には大変お世話になりました。 未だに完全消化できておらず、 この本を消化できれば分かることなのかもしれませんが、 身近に頼れる人がいなく、質問させてください! 現在、ソースファイルを分けてプログラムを書いており、 他のファイルからアクセスしない関数にはstaticをつけています。 なので、複数ファイル上で同名の関数を持っていても エラーは出ません。 しかし、構造体へのポインタを返す関数の場合は、 staticを付けてもエラーになってしまいます。 構造体ではなくintへのポインタであればエラーは出ません。 構造体はそれぞれ別のものです。 もちろん関数の名前を変えれば解決するのですが、 せっかくCを勉強しているので、原因をはっきりさせたいです。 具体的には ファイル1に static KOUZOU1 *func(); ファイル2に static KOUZOU2 *func(); を置いています。 ポインタ完全制覇読者としては staticが"func"にかかっていないのかな? という気がしますが、どうなんでしょうか。 お知恵を拝借できれば幸いです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1704] Re:オセロについて
投稿者:学生
2011/02/19 22:26:47

> >Board.javaのput()メソッドの中のwindow.redraw()を抜けばよいようです。 > >このメソッドは、最終的にはCanvasのrepaint()を呼び出すことで、オセロの >盤面の再描画を行います。石を置いた後、アニメーションとともに画面の更新は >終わっているのですが、「念のために」全体の再描画をかけているわけです。 > >しかし、AWTにおけるrepaint()は非同期なので、即座に実行されるとは限りません。 >この再描画要求が、「次に石を置き、盤面の状態は変わったが、アニメーションの前」 >という状況で実行されると、アニメーション前に盤面の絵が更新されてしまいます。 > >ソースは近日中に差し替えます。ご指摘ありがとうございました。 お忙しい中、ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1703] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/02/14 02:17:25

大変遅くなってしまいましてすみません。学生さんがまだここを見ているかどうかも わかりませんが… >>石がひっくり返るアニメーションの前に、既にBoard内のデータは >>書き換えられているので、もしその前に画面の再描画が動いてしまえば >>現状のような現象になると思うのですが、すみませんが最近どたばたしていて >>私のほうでは原因が追えていません。 > >自分の方で調べて直してみたのですができませんでした。 > >今、お忙しそうですが原因がわかったらでいいので教えてもらえるとありがたいです。 Board.javaのput()メソッドの中のwindow.redraw()を抜けばよいようです。 このメソッドは、最終的にはCanvasのrepaint()を呼び出すことで、オセロの 盤面の再描画を行います。石を置いた後、アニメーションとともに画面の更新は 終わっているのですが、「念のために」全体の再描画をかけているわけです。 しかし、AWTにおけるrepaint()は非同期なので、即座に実行されるとは限りません。 この再描画要求が、「次に石を置き、盤面の状態は変わったが、アニメーションの前」 という状況で実行されると、アニメーション前に盤面の絵が更新されてしまいます。 ソースは近日中に差し替えます。ご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1702] またまた、おひさしぶりです
投稿者:
2011/02/09 00:03:24

またまた、お久しぶりです。 最近は、主に3Dグラフィック関係の組込関数ばかり作っています。 言語部分の修正はあまり無いです。しかし、組み込み関数及び、 普通の関数のほとんどがリターンコード0のばかりだったので、void型を 作りました。関数の戻り値だけにしか使い道がありませんが。  その結果、バイトコードでは、call後のpopが必要なくなったのと、call機能 の実装部分が、void関数ではリターンコード処理がない分シンプルになりました。  おお、今気がついた、voidの関数はcall_voidの様な命令追加して、より シンプルにしよう。ほとんどがvoid関数なので効果が出る。  また、関数コールを数倍速する方法。それは、初期値の定数処理バイト コードが不要になり、パラメータ処理も単純になります。しかし、修正部分が 多いのでまた今度にします。  方法は簡単で、関数コールのスタック情報を事前に総て持っていて、 それをスタックにコピーして、インデックスアドレスとパラメータデータ のみ調整することで高速に関数が呼べます。定数コピーとかパラメータ 領域作成等細かな処理を一発コピーで終わらせます。  いまはまだ出来ませんが、行く行く組込みます。  また、シート変数を普通の関数パラメータに指定できるようにするため、 バイトコードが7つも増えてしまいました。orz  はやく、こんなことがしたかったんですと見せられるといいのですが、 まだまだ先が遠いです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1701] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/02/08 02:57:17

>今、お忙しそうですが原因がわかったらでいいので教えてもらえるとありがたいです。 すみません、ちょっと手間取ってます…
[この投稿を含むスレッドを表示] [この投稿を削除]
[1700] Re:オセロについて
投稿者:学生
2011/02/03 21:52:07

> >石がひっくり返るアニメーションの前に、既にBoard内のデータは >書き換えられているので、もしその前に画面の再描画が動いてしまえば >現状のような現象になると思うのですが、すみませんが最近どたばたしていて >私のほうでは原因が追えていません。 自分の方で調べて直してみたのですができませんでした。 今、お忙しそうですが原因がわかったらでいいので教えてもらえるとありがたいです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1699] Re:「ほげ」について
投稿者:(ぱ)こと管理人
2011/02/02 03:30:05

はじめまして。時間がないので簡単な変身となってしまいますが、 >私のうっすらとした記憶では「Dr.スランプ」で使用されていたのではないかと >思うのですが(ソースが見つけられず、正確な情報でなくて申し訳ございません)。 Dr.スランプ、実家に帰れば文庫版を持っているのですが… >P.S.「ぴよ」といえば、「Dr.スランプ」より「めぞん一刻」や「タッチ」あたりのエプロン、シャツの柄でよく目にする「模様に困ったらpiyo」的なイメージが強いですが・・・これも今書き込もうとしてふと思っただけなので正確な情報でなくてすみません。 で、「ぴよ」のほうですが、こちらは「ほげ」と違い発祥が(たぶん)わかっています。 http://togetter.com/li/47113 やはり響子さんのエプロンが元ネタとのこと。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1698] 「ほげ」について
投稿者:通りすがりのD
2011/02/01 13:26:01

はじめまして。言語のお勉強をしていたはずが、「ほげ」にはまってしまいました(笑) 私のうっすらとした記憶では「Dr.スランプ」で使用されていたのではないかと思うのですが(ソースが見つけられず、正確な情報でなくて申し訳ございません)。 ちょうど80年代前半(1979~1984)あたりですし、全国的に広まった理由としてもまぁ納得かなぁ・・・なんて。 (まぁ、流行とコードなどの命名をいっしょにはできないでしょうが) あられちゃんの「ほよよ」などはメジャーですが、爆発に巻き込まれた後や眠いのを起こされたような場面で使用されているイメージがあります。 http://www.studiohs.com/28if/text/slump/whoswho/ka_ko.html の「暗悪健太」に > スーパーほげげスペシャルをやっていたりする。 や、 http://blog.livedoor.jp/comic2ch/archives/80579.html >213 >羽の生えたでかい猿に喰われそうになってほげげーっとか悲鳴あげてるのにワロタw とありました。 もし、機会があればご確認下さい。 P.S.「ぴよ」といえば、「Dr.スランプ」より「めぞん一刻」や「タッチ」あたりのエプロン、シャツの柄でよく目にする「模様に困ったらpiyo」的なイメージが強いですが・・・これも今書き込もうとしてふと思っただけなので正確な情報でなくてすみません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1696] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/02/01 02:55:43

>これは、どこを直せばよろしいのですか? 前回書いたとおりJudge.javaがGUIのイベントドリブンなスレッドとは 別スレッドで動いていて、石をひっくり返すところは、Judge.javaの方の スレッドで、Board.javaのput()から呼び出されています (window.animationPut()メソッド)。 石がひっくり返るアニメーションの前に、既にBoard内のデータは 書き換えられているので、もしその前に画面の再描画が動いてしまえば 現状のような現象になると思うのですが、すみませんが最近どたばたしていて 私のほうでは原因が追えていません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1695] Re:オセロについて
投稿者:学生
2011/01/30 19:02:26

>>いや、確かに表示がおかしくなってますね。 >>実際にコンピュータ同士対戦させてみて、最後のほうの石の表示を観察してみてください。 >>結果的な盤面変化は問題ないのですが、ひっくり返る過程の表示だけ変です。 > >再確認しました。思い込みとは恐ろしいもので、たくさんの石を一気に >ひっくり返すとき、ひっくり返す前から色が変わっているにもかかわらず >気付いていませんでした。失礼しました > 学生さん > >このプログラムは、ゲームのメインループ(先手後手を切り替えながら >ゲームオーバーまでぐるぐる処理)を普通のループで書きたかったため、 >イベントドリブンであるGUIとは別のスレッドで動かしています。 >その待ち合わせがうまくいっていなくて、アニメーション前に盤面が >再描画されているように思います。 > >何年も前に公開したプログラムなのでいまさらなのですが、ちょっと確認してみます。 > これは、どこを直せばよろしいのですか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1694] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/01/30 14:33:42

>>このプログラムは、ゲームのメインループ(先手後手を切り替えながら >>ゲームオーバーまでぐるぐる処理)を普通のループで書きたかったため、 >>イベントドリブンであるGUIとは別のスレッドで動かしています。 >>その待ち合わせがうまくいっていなくて、アニメーション前に盤面が >>再描画されているように思います。 > >この処理は、どこでやっているんですか? ゲームオーバーまでぐるぐる回る処理のことであれば、 Judge.javaでやっています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1693] Re:オセロについて
投稿者:学生
2011/01/27 22:18:57

>このプログラムは、ゲームのメインループ(先手後手を切り替えながら >ゲームオーバーまでぐるぐる処理)を普通のループで書きたかったため、 >イベントドリブンであるGUIとは別のスレッドで動かしています。 >その待ち合わせがうまくいっていなくて、アニメーション前に盤面が >再描画されているように思います。 この処理は、どこでやっているんですか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1692] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/01/23 16:51:12

>いや、確かに表示がおかしくなってますね。 >実際にコンピュータ同士対戦させてみて、最後のほうの石の表示を観察してみてください。 >結果的な盤面変化は問題ないのですが、ひっくり返る過程の表示だけ変です。 再確認しました。思い込みとは恐ろしいもので、たくさんの石を一気に ひっくり返すとき、ひっくり返す前から色が変わっているにもかかわらず 気付いていませんでした。失礼しました > 学生さん このプログラムは、ゲームのメインループ(先手後手を切り替えながら ゲームオーバーまでぐるぐる処理)を普通のループで書きたかったため、 イベントドリブンであるGUIとは別のスレッドで動かしています。 その待ち合わせがうまくいっていなくて、アニメーション前に盤面が 再描画されているように思います。 何年も前に公開したプログラムなのでいまさらなのですが、ちょっと確認してみます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1691] Re:オセロについて
投稿者:yuya
2011/01/23 16:01:32

>この説明ではなんだかよくわかりませんが、たぶん自動でパスしてるんじゃ >ないでしょうか? このプログラムでは、打つところがないときは勝手にパスします。 > いや、確かに表示がおかしくなってますね。 実際にコンピュータ同士対戦させてみて、最後のほうの石の表示を観察してみてください。 結果的な盤面変化は問題ないのですが、ひっくり返る過程の表示だけ変です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1690] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/01/22 23:15:09

>たとえば、黒を置いた時に白から黒にひっくり返るのですが >最後のほうになると黒を置いた時に石が黒に代わってから白から黒に回って変化して >いるんですけどそれはなんで最後のほうだけなるんでしょうか? この説明ではなんだかよくわかりませんが、たぶん自動でパスしてるんじゃ ないでしょうか? このプログラムでは、打つところがないときは勝手にパスします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1689] Re:オセロについて
投稿者:学生
2011/01/22 22:45:58

>こちらのサンプルアプレットでのオセロゲームで >石がひっくり返るときに > >たとえば、黒を置いた時に白から黒にひっくり返るのですが >最後のほうになると黒を置いた時に石が黒に代わってから白から黒に回って変化して >いるんですけどそれはなんで最後のほうだけなるんでしょうか? 前の質問ですけど コンピュータの時だけなってしまいます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1688] Re:オセロについて
投稿者:学生
2011/01/22 22:29:49

アドバイスのおかげでコンピュータが作成できました。 ありがとうございます。 こちらのサンプルアプレットでのオセロゲームで 石がひっくり返るときに たとえば、黒を置いた時に白から黒にひっくり返るのですが 最後のほうになると黒を置いた時に石が黒に代わってから白から黒に回って変化して いるんですけどそれはなんで最後のほうだけなるんでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1687] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/01/21 00:50:07

>次にミニマック法を作成してみたいと思うのですが >ComputerPlayer.javaでは何手先まで読んでいて、どこでやっているんでしょうか? ComputerPlayer.javaはほぼ全域がミニマックス法とαβ枝刈りなので 「どこで」というのはないのですが、先読みの深さについては以下のように なっています。 ・通常は4手先までです(DEFAULT_SEARCH_DEPTH)。 ・残りのマスの数を数えます。これが残りの手数の概算(パスを考慮しない)と  なるのですが、これが5(WIN_SEARCH_DEPTH)以下になったら、  完全読み切りモードに入ります。 >後、ab法はどこでやっているのですか? 変数alphaBetaValueで処理を分けているあたりです。 今ソースを見ると、残手数がPERFECT_SEARCH_DEPTH以下のときと WIN_SEARCH_DEPTH以下のときとでなにやら分岐していますが、 ここで設定した変数は使っていないので、無視してください。すみません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1686] Re:オセロについて
投稿者:学生
2011/01/20 22:05:39

基本値の計算が作成できました。 次にミニマック法を作成してみたいと思うのですが ComputerPlayer.javaでは何手先まで読んでいて、どこでやっているんでしょうか? 後、ab法はどこでやっているのですか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1685] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/01/20 00:30:23

>Eval00.javaでは、 cellPriority[][]で評価をしていて、 >自分の石だったら足して、コンピュータの石だったら引いているのは >わかるのですか最後のcellsValue + canPutNum * 100では >なぜ100をかけているんでしょうか? canPutNumは石が置ける場所の数(着手数)です。 オセロは石が置ける限りたとえ不利になるとしてもパスはできないので、 着手数は重要です。手詰まりが最大の敵です。 そのため、canPutNumが評価値に対して大きなウエイトを占めるように するために、100をかけています。 もちろん、cellPriorityの各要素の値を小さくしても同じ効果が あるでしょうけど。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1684] Re:オセロについて
投稿者:学生
2011/01/19 22:54:45

返信ありがとうございます。 >Eval00.javaやEval01.javaの方が、Eval02.javaよりはずっと簡単なので、 >読むならそちらの方がよいでしょう。 その通りで、自分にはEval02.javaは難しいので、 Eval00.javaを参考に作成したいと思います。 Eval00.javaでは、 cellPriority[][]で評価をしていて、 自分の石だったら足して、コンピュータの石だったら引いているのは わかるのですか最後のcellsValue + canPutNum * 100では なぜ100をかけているんでしょうか? 後、Eval00.javaは上の説明であっているでしょうか? 違っていたら、流れを教えてもらえないでしょうか? たびたび質問すいません。よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1683] Re:オブジェクト指向のメリット
投稿者:(ぱ)こと管理人
2011/01/19 02:44:56

>インスタンスを理解していないので、「どのインスタンスのメソッドを呼ぶのか」と >いう発想ができず、その場でnewして呼んでしまう。これは、私が以下のページで書いた >画面に線を引くたびにCanvasをnewした新人君と同レベルの発想です。 すみません、「以下のページ」のURLを貼り忘れました。ここです。 http://kmaebashi.com/programmer/object/shigoto.html いやさ、それにしても、本当にこのページの 「「どの」オブジェクトに仕事をさせればよいのか」 あたりの説明を読んで、それでもまったく理解できなかったの? だとすれば、いかに相手がアレな人とはいえ、さすがに私も自信をなくします……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1682] Re:オブジェクト指向のメリット
投稿者:(ぱ)こと管理人
2011/01/19 02:32:48

たいやきさんからの回答がないですが(アクセスログも見ましたが、私が 質問を書いた以後ここを見ていないようです)、 たいやきさんって、ハンドルと発言内容からして、こちらで質問されている taiyaki123さんですよね? http://oshiete.goo.ne.jp/qa/6438120.html >せっかく回答してくださって申し訳ないのですが、100%の自信がないのであれば >回答くださらなくても結構です。ありがとうございました。 ……まあこれはさておき。 他にこちらでも質問されているようですが、 http://oshiete.goo.ne.jp/qa/6438154.html >信じられないのは、インスタンス変数が書き換えられるということです。 >サーブレットではインスタンス変数が共有されるのは理解していますが、 >サーブレットから呼ばれるインスタンスで定義されているインスタンス変数も >それに該当するのでしょうか。 >それとも、サーブレット内だけの話で、サーブレットから呼ばれるインスタンスでは >インスタンス変数は独立していると思ってよいでしょうか。 >後者の認識ですが、こういう書き方をされると、サーブレットから呼ばれた先でも >インスタンス変数が共有されると読めて、怖くて仕方ないです。 どう見ても、明らかに「インスタンス」を理解してないですよね。 (そしておそらくは「参照」も) 「サーブレットから呼ばれるインスタンス」って、そもそもインスタンスは 呼ぶものではありません。呼ぶことができるのは「インスタンスのメソッド」です。 揚げ足取りに見えるかもしれませんが、おそらくこのケースでは違います。 なぜなら、No.1の回答の方への「お礼」のところに、taiyaki123さんは 以下のように書いているからです。 >念のため質問内容が分かるようなソースをつけます。 >SampleClassで定義されているメンバー変数(staticではない変数)が、 >スレッド毎に共有されるかという質問です。 >servletclass extends HttpServet{ > public int a = 0; > public void doPost(){ > SampleClass sc = new SampleClass(); > } >} > >SampleClass{ > public int x = 0; >} >このようなプログラムがあったとします。 >このプログラムを複数の人が、同時にアクセスした場合に、 >SampleClassで定義されているメンバー変数のxが共有されるかという意味です。 >もちろん、共有されないという認識です。 新しいSampleClassをdoPost()のたびにnewしてるんだから、 共有されないのは当たり前です。サーブレットは何も関係ありません。 以下も。 http://oshiete.goo.ne.jp/qa/6438120.html >オブジェクトを作って実行するなら >testclass tc = new testclass(); >tc.method(); >というように2行です。 >オブジェクトを作らないなら、testclass.method() >というように1行です。 なにしろtaiyaki123さんはインスタンスを理解していないので、 インスタンスは、「メソッドを呼ぶときにnewするもの」でしかないのでしょう。 だから必要性もわからないし、「サーブレットから呼ばれるインスタンス」という トンチンカンな言葉も出てくる。 もしこの人がプロのJavaプログラマなのだとすれば(想像したくないですが)、 よく聞く、staticメソッドだけで開発している職場なのかもしれません。 インスタンスを理解していないので、「どのインスタンスのメソッドを呼ぶのか」と いう発想ができず、その場でnewして呼んでしまう。これは、私が以下のページで書いた 画面に線を引くたびにCanvasをnewした新人君と同レベルの発想です。 つまり、まったくのド素人です。 (いや、こんなのと一緒にしちゃ新人君に失礼ですが) 本来であれば、「疑りぶかい~」は、こういう人を対象読者としている はずなのですが…… サーブレットの件で当然の疑問を提示しているNo.1やNo.2の人に、 >ですので、以下の回答は間違いですね。 とか >まったくもって間違った回答ですね。 >サーブレットからインスタンスを呼ぶことができないなんて・・・。 とか答えて、せっかくのアドバイスを拒絶してしまうような人が相手では、 私の文章が理解されなかったのだとしても、私のせいではないでしょう。 http://oshiete.goo.ne.jp/qa/6402168.html このへんも、ねえ……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1681] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/01/19 01:54:09

今見てみたのですが、 >評価関数がどこにあるかといえば、Eval02.javaにあります。 >これはEvaluateBoardインタフェースを実装しており、Eval00.javaとかEval01.javaと >差し替えられるようになっています。Eval02を実際にnewしてくっつけているのは >ReversiApplet.javaです。 Eval00.javaやEval01.javaの方が、Eval02.javaよりはずっと簡単なので、 読むならそちらの方がよいでしょう。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1680] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/01/19 00:43:38

>評価、着手数、要素の計算などはどこでやっているのか教えてもらえないでしょうか? 評価関数がどこにあるかといえば、Eval02.javaにあります。 これはEvaluateBoardインタフェースを実装しており、Eval00.javaとかEval01.javaと 差し替えられるようになっています。Eval02を実際にnewしてくっつけているのは ReversiApplet.javaです。 着手数や要石の計算は、このEval02.javaの中のscanLineで盤面を4方向にスキャンし、 フラグを立てています。以下のページに図があります。 http://kmaebashi.com/javaworld/index.html ただ、「学生」さんの現状のプログラムが、 >コンピュータの作成では、ランダムでしか対戦ができないため、 >コンピュータが強くないので強くしたいと思っている所です。 ランダムで(打てるところに?)打つ、というレベルなら、なにもこんな複雑な 評価関数をいきなり導入しなくてもよいのではないでしょうか。 …と、いうことを前回の返信で言いたかったのですが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1679] Re:オセロについて
投稿者:学生
2011/01/18 22:35:29

ご返信ありがとうございました。 >「学生」さんがどの程度のスキルをお持ちかわかりませんが、 > javaは本を一冊読んだ程度の実力です。 オセロゲームを現在、作成しています。 コンピュータの作成では、ランダムでしか対戦ができないため、 コンピュータが強くないので強くしたいと思っている所です。 リバーシゲームのアルゴリズムは検索して調べてみたのですが、 ソースを見ても詳しくわからないので 評価、着手数、要素の計算などはどこでやっているのか教えてもらえないでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1678] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/01/18 02:16:58

はじめまして。 >javaでオセロゲームを作っているのですが、リバーシゲームの思考ルーチンについて >ソースをダウンロードして見ているんですけど、よくわかりませんでした。 >どうやっているのかを詳しく教えていただけないでしょうか? 「学生」さんがどの程度のスキルをお持ちかわかりませんが、 http://kmaebashi.com/javaworld/index.html このページで簡単に説明しているように、このリバーシゲームのアルゴリズムは ミニマックス法とαβ枝刈りです。 それぞれどんなものかについても上記ページにごく簡単に説明していますが、 もちろんこの説明ではわからないからこそここで質問されたのかと思います。 ミニマックス法とαβ枝刈りはこの手のゲームの思考ルーチンとしては ごく一般的なものなので、検索すれば解説ページは出てきます。 Wikipediaの解説もそんなに悪くないかも。 http://ja.wikipedia.org/wiki/%E3%83%9F%E3%83%8B%E3%83%9E%E3%83%83%E3%82%AF%E3%82%B9%E6%B3%95 αβ枝刈りも検索すれば出ますが、高速化の手段なので(しかもそんな 劇的に早くなるわけでもないので)、最初はなくてもよいかも。 あとは評価関数ですが、少々手抜きの評価関数でも、ある程度先読みすれば、 並の人間の相手は可能なぐらいの強さにはなります。 たとえば盤面の各マスに評価値を付けておいて(当然四隅が最大)、 自分の石があったらその値を加算、敵の意思があったら減算、ぐらいの 評価関数でもそこそこ遊べるようなものになった記憶があります。 私のリバーシゲームでは結構凝った評価関数を実装していますが、 実のところこれがよい評価関数なのか、私には判定できません。 私自身がこの手のゲームが得意でないため、自分の作ったプログラムに まるっきり勝てないので、評価関数を直しても、強くなったのか弱くなったのか 判定できないためです。 実は、私のプログラムの評価関数は、以前別件で作った「6×6オセロ」の 評価関数の焼き直しです。「6×6オセロ」のときは、評価関数同士を 戦わせたりしてまじめに検討したのですが、それを8×8に焼き直すときには、 まったく検証していません。手抜きです……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1677] オセロについて
投稿者:学生
2011/01/17 22:37:20

javaでオセロを作っているものですがよろしくお願いします。 javaでオセロゲームを作っているのですが、リバーシゲームの思考ルーチンについて ソースをダウンロードして見ているんですけど、よくわかりませんでした。 どうやっているのかを詳しく教えていただけないでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1676] Re:オブジェクト指向のメリット
投稿者:(ぱ)こと管理人
2011/01/16 23:52:17

>>オセロゲームですが、普通に一つのオブジェクトしかつくれないようなプログラムを書いておけば、サーブレットから起動されればそれぞれのオブジェクト(オセロ盤)が >>作られますから、マルチインスタンスを気にしなくてもよいと思います。 >>イメージ沸きますでしょうか。 > >すみません、イメージ沸きません。 >「普通に一つのオブジェクトしかつくれないようなプログラム」における >「プログラム」とはどのような単位ですか? >「サーブレットから起動」の「起動」とは、具体的にどういうことですか? >「起動」されたプログラムが終了するタイミングはいつですか? で、こちらについての回答はなしですか? 上記についても答えてもらいたいのですが、回答に時間がかかるかもしれないので、 追加で質問させてください。簡単に答えられるように選択式にしておきます。 たいやきさんは、今まで、サーブレットのプログラムを一度でも書いたことがありますか? a) 自分で全体を書いたことがある。(小さなテストプログラムのようなものでも可) b) 全体を書いたことはないが、仕事でチームで開発する等で、 c) 実際にコードを書いたことはない。ただ、本で勉強したことはある。  (書名を書いてください) d) 書いたこともなければ本で勉強したこともない。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1675] Re:オブジェクト指向のメリット
投稿者:(ぱ)こと管理人
2011/01/16 23:47:43

>そういう色んな経験やスキルがある人で、オブジェクト指向に挫折した人に、 >ちゃんと全てのオブジェクト指向の特徴とメリットを説明することが、 >アンチテーゼとしての役割だと思います。 知らんがな、としか言いようがありませんが。 うちのページが不満なら読んでいただかなくて結構ですし、 もっといい説明方法があると思うのなら、たいやきさんがご自分で Webでもなんでも書けばよいでしょう。 うちのページの趣旨は、「再入門」ですので、他の書籍やWebページの オブジェクト指向の説明において「欠けている」と私が感じた部分に 特化しています。 当時「マルチプルインスタンス オブジェクト指向」で検索しても 1件もヒットしなかったのが、今だと1000件以上ヒットします。 multiple instanceという言葉自体は一般的なものなので、この1000件 すべてが私の記事からの派生ではないと思いますが、それにしても 相応に需要はあったと言えると思います。 >>>継承には、重複コードを省くというメリットがあります。 >>>ポリモーフィズムには、ロジックの共通化というメリットがあります。 >私はこのメリットが正しいということに自信を持っています。 >また、そういう使い方をしているPGも回りにあります。 >また、書きませんでしたが、他にもメリットがあるとも思っています。 >私が言うメリットが正しいかどうかは置いておいて >ここで言いたかったのは、オブジェクト指向の3大特徴には、 >それぞれメリットがあって、それも説明しないと、オブジェクト指向の >説明としては不足であるということです。 >ですので、管理人様が間違っておられると思うのであれば、それはそれでいいと >思いますし、管理人様が思われるメリットを主張されればよいと思います。 >だた、継承やポリモーフィズムの説明をされる際には「今どきやらない」という >表現は誤解を生むと思います。 「今どきやらない」とは私は書いていません。 「今どきは、流行らない」と書いています。 まあ、これは実際紛らわしいですし、ひらがなで書いた私も悪いと思うのですが、 そもそも「継承やポリモーフィズム」について「今どきやらない」とも 「今どき流行らない」とも書いてはいません。ここで「今どき流行らない」と 書いているのはあくまで実装継承についてのみです。正しく読んでください。 で、 >>>継承には、重複コードを省くというメリットがあります。 実装継承については、かつては確かにもてはやされていた時代がありましたし、 便利な局面もあることはあるんでしょう(もちろん、デメリットの方が大きいと 判断されたからこそ流行らなくなったのですが)。 しかし、 >>>ポリモーフィズムには、ロジックの共通化というメリットがあります。 こっちについては実のところ意味がわかりません。 ポリモルフィズムで、どう、ロジックを共通化するのですか? 具体的な例を挙げて説明してください。 >私はこのメリットが正しいということに自信を持っています。 >また、そういう使い方をしているPGも回りにあります。 仕事のプログラムならそのまま提示することはできないと思いますが、 差し支えのない範囲で、どのようなコードを書いているか提示してもらえませんか? 興味があります。ここを見ている他の方もそうでしょう。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1674] Re:オブジェクト指向のメリット
投稿者:たいやき
2011/01/15 17:08:37

>こちらを見ていただくとわかるかと思うのですが、 >http://kmaebashi.com/programmer/object/othello.html > >「メンバー変数を隠したり、メンバー変数やメソッドをまとめたり」というのは、 >「疑りぶかい~」の想定読者は(たとえCで書いても)すでにやっているだろう、 >というのが前提です。 >この前提が正しいかどうかはよくわかりません。世間のCプログラマは、 >staticを使ってデータや関数を隠そうなどとは考えたこともない人が >大部分なのかもしれません。だとすれば、私がやっていることは効率の悪い方法だ、 >ということになるかと思います。 > >ただ、もしこの前提が正しいとするなら、そういうプログラマにカプセル化を >トクトクと語っても、「何だそんなことは俺もとっくにやってるよ」と思われるのが >オチです。 いいえ。そうではありません。 そもそも不思議なのが、なぜ、C言語をやってきた人(C言語に対するある程度 の知識があること)だけが対象なのでしょうか。 オブジェクト指向の理解に挫折した(このサイトを読む)人には、 今までC言語をやってきた人もいれば、やってきてない人もいます。 オブジェクト指向言語が始めてのプログラム言語の人もいると思います。 COBOLだけ知っている人もいると思います。 そういう色んな経験やスキルがある人で、オブジェクト指向に挫折した人に、 ちゃんと全てのオブジェクト指向の特徴とメリットを説明することが、 アンチテーゼとしての役割だと思います。 その特徴やメリットが、これまでのプログラム言語でも既に出来るのであれば、 それはその言語での特徴やメリットが、オブジェクト指向言語にも 連綿とひきつがれているんですと説明すればいいだけです。 そうすれば、「オブジェクト指向は今までの開発言語で出来ることやメリットも 継承しながら、新しい考え方や技術もとりいているんだよ」という事実が 分かってもらえると思います。その事実をちゃんと説明することが大切で、 「なんだそんなこととっくにやっているよ」という人だけを意識して説明することで、返ってオブジェクト指向を正しく理解してもら阻害になっていると感じます。 もし、C言語をやってきた人(C言語に対する知識がある程度ある方)向けの 説明であれば、「疑りぶかいあなたのためのオブジェクト指向再入門」という 名前の付け方や、書かれている内容は適切ではないと感じます。 すごく期待を持たせるようなタイトルであり、書き出しで オブジェクト指向の説明が不適切であることを指摘し、最適な説明を期待させる ような内容になっていながら、実は端にC言語との比較だけの説明になっています。 >>継承には、重複コードを省くというメリットがあります。 >>ポリモーフィズムには、ロジックの共通化というメリットがあります。 > >このメリットはどっちも間違っているような。 >少なくともいまどき実装継承ははやらないですし、ポリモルフィズムは >同じインタフェースで違うロジックを与える機能ですので(Template Methodパターン >みたいな使い方もあるにはありますが)。 私はこのメリットが正しいということに自信を持っています。 また、そういう使い方をしているPGも回りにあります。 また、書きませんでしたが、他にもメリットがあるとも思っています。 私が言うメリットが正しいかどうかは置いておいて ここで言いたかったのは、オブジェクト指向の3大特徴には、 それぞれメリットがあって、それも説明しないと、オブジェクト指向の 説明としては不足であるということです。 ですので、管理人様が間違っておられると思うのであれば、それはそれでいいと 思いますし、管理人様が思われるメリットを主張されればよいと思います。 だた、継承やポリモーフィズムの説明をされる際には「今どきやらない」という 表現は誤解を生むと思います。 もし、管理人様が世界中の全てのコードをみてそういわれているのであれば いいですが、そうではないと思いますから、このような狭い範囲での経験をもって 断定的な表現は、読む方に誤解を与えます。 今使われているかどうかというより、どういうメリットがあるかを一つ一つ正確に 伝えることが、一番正しく理解してもらえると思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1673] Re:オブジェクト指向のメリット
投稿者:(ぱ)こと管理人
2011/01/14 01:15:39

>クラスには、メンバー変数を隠したり、メンバー変数やメソッドをまとめたり、 >オブジェクトをたくさんつくれるというメリットがあります。 こちらを見ていただくとわかるかと思うのですが、 http://kmaebashi.com/programmer/object/othello.html 「メンバー変数を隠したり、メンバー変数やメソッドをまとめたり」というのは、 「疑りぶかい~」の想定読者は(たとえCで書いても)すでにやっているだろう、 というのが前提です。 この前提が正しいかどうかはよくわかりません。世間のCプログラマは、 staticを使ってデータや関数を隠そうなどとは考えたこともない人が 大部分なのかもしれません。だとすれば、私がやっていることは効率の悪い方法だ、 ということになるかと思います。 ただ、もしこの前提が正しいとするなら、そういうプログラマにカプセル化を トクトクと語っても、「何だそんなことは俺もとっくにやってるよ」と思われるのが オチです。でも、クラスには、たいやきさんも挙げておられるように 「オブジェクトをたくさんつくれるというメリット」もあるので、 そこを無視して「何だそんなことは俺もとっくにやってるよ」と思われたら 先に進めない。「疑りぶかい~」でマルチプルインスタンスを強調している 意図はそこです。 継承やポリモルフィズムは、いずれ書こうと思ってほったらかしになっている、 というのが実態ではありますが、 >継承には、重複コードを省くというメリットがあります。 >ポリモーフィズムには、ロジックの共通化というメリットがあります。 このメリットはどっちも間違っているような。 少なくともいまどき実装継承ははやらないですし、ポリモルフィズムは 同じインタフェースで違うロジックを与える機能ですので(Template Methodパターン みたいな使い方もあるにはありますが)。 >オセロゲームですが、普通に一つのオブジェクトしかつくれないようなプログラムを書いておけば、サーブレットから起動されればそれぞれのオブジェクト(オセロ盤)が >作られますから、マルチインスタンスを気にしなくてもよいと思います。 >イメージ沸きますでしょうか。 すみません、イメージ沸きません。 「普通に一つのオブジェクトしかつくれないようなプログラム」における 「プログラム」とはどのような単位ですか? 「サーブレットから起動」の「起動」とは、具体的にどういうことですか? 「起動」されたプログラムが終了するタイミングはいつですか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1672] Re:オブジェクト指向のメリット
投稿者:たいやき
2011/01/13 22:24:25

>JavaでServletを使う場合も、オセロ盤のインスタンスが複数作れないと、 >同時に複数の対戦を行うのはかなりやりにくくないですか? >たいやきさんがどのような作り方を想定しているのか具体的に >教えていただけると嬉しいです。 この質問に答える前に、私はオブジェクト指向が分かっているのか/分かってないのかすら分かりませんが、自分なりにオブジェクト指向とは、 「従来(非オブジェクト指向)のプログラミングを多少なりとも楽にする技術や概念の総称」だと理解しています。 そのオブジェクト指向の考え方を利用した技術や考え方として、フレームワーク、 ザインパターン、UML、オブジェクト指向プログラミングといった技術がありますが、 このサイトではオブジェクト指向プログラミングに焦点を当てておられるので、 それに特化してみると、クラス・継承・ポリフォーフィズムという3つの技術が あると思います。 クラスには、メンバー変数を隠したり、メンバー変数やメソッドをまとめたり、 オブジェクトをたくさんつくれるというメリットがあります。 継承には、重複コードを省くというメリットがあります。 ポリモーフィズムには、ロジックの共通化というメリットがあります。 この中にはオブジェクト指向でなくても出来る点はありますが、オブジェクト指向でも 使える訳で、これらを使うことにより、結果として、従来のプログラミングより 多少なりとも楽が出来るというのが、オブジェクト指向プログラミングだと思います。 これが正しいかどうかわかりませんが、仮りに正しいとすると、他の言語でも出来るとか、最初に覚えることではないとかではなく、 これらを一つ一つ丁寧に説明することが、「疑りぶかい人」へオブジェクト指向 をちゃんと説明することになると思っています。 他の説明を置いておいて、クラスのメリットであるオブジェクトをたくさん 作れることを主眼に置いて説明することは、「疑りぶかい人」にオブジェクト指向を 正しく理解してもらえることにはならないと思います。(私がそうでした。) このサイトは、下手なオブジェクト指向の説明にたいするアンチテーザとして作られた サイトだと思っていますので、このサイトを見た人がさらに挫折することの無いような工夫を期待します。 オセロゲームですが、普通に一つのオブジェクトしかつくれないようなプログラムを書いておけば、サーブレットから起動されればそれぞれのオブジェクト(オセロ盤)が 作られますから、マルチインスタンスを気にしなくてもよいと思います。 イメージ沸きますでしょうか。  
[この投稿を含むスレッドを表示] [この投稿を削除]
[1671] Re:オブジェクト指向のメリット
投稿者:(ぱ)こと管理人
2011/01/11 23:00:21

>サービス毎に(要するに対局1件毎に)別プロセスを起動するってのは UNIX 系では >一般的手法と思う。 それはそうなんですが、たいやきさんの主張は以下なので、 「Servletを使ったとき」を想定しなければいけないでしょう。 >というのはJavaでサーバを動かすときには、servletを使うことが出来ますが、 >その場合はマルチにインスタンスが作れなくても(1つしかつくれなくても)、 >オンラインオセロのようなゲームは作れるためです。 Servletそのもののインスタンスは(少なくとも通常は)全体でひとつなので、 複数対戦をホストしたければBoardのインスタンスを複数作って セッション等からそれを参照するように作るのが自然なように思います。 >俺なら「盤面は先読み1手につき1個必要」と例示するかな・・・ >再帰深さ1段につき盤面1個を要するってことで。 これはわかります。私が作ったプログラムでも実際にそうなっています。 http://kmaebashi.com/javaworld/index.html ただ、これを理解するにはオセロの思考ルーチンに対する理解がある程度必要で、 そうなると本筋から離れてしまいますから、「複数対戦をホストするため」という ことにしました。 ただ、公開当時も「複数対戦をホストするなら、自分ならプロセス分ける」という 方もいらっしゃって、「思考ルーチンで先読みするためにも使いますし」と答えたら 「それなら納得できます」と言われたので、このあたり、どのような説明なら 納得できるかは個人差がありそうです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1670] Re:オブジェクト指向のメリット
投稿者:774RR
2011/01/11 11:36:49

たいやき氏ではないが一意見として サービス毎に(要するに対局1件毎に)別プロセスを起動するってのは UNIX 系では一般的手法と思う。 samba などでも接続1件につき1個 smbd が起動するわけで。 静的変数はプロセス毎に作られるものなので「対戦1件につき1プロセス」なら、 プロセス単位で盤面1個でも別に困らない、ってことではないかな・・・ 俺なら「盤面は先読み1手につき1個必要」と例示するかな・・・ 再帰深さ1段につき盤面1個を要するってことで。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1669] Re:オブジェクト指向のメリット
投稿者:(ぱ)こと管理人
2011/01/09 13:08:07

ご意見をいただくのは歓迎ですし、「偉そうに」とか恐縮される必要は ないのですが、 >マルチプルインスタンスをオブジェクト指向の特徴としてあげるのはよいと >思いますが、オセロでの説明はやめたほうがよいのではと個人的に思っています。 >というのはJavaでサーバを動かすときには、servletを使うことが出来ますが、 >その場合はマルチにインスタンスが作れなくても(1つしかつくれなくても)、 >オンラインオセロのようなゲームは作れるためです。 JavaでServletを使う場合も、オセロ盤のインスタンスが複数作れないと、 同時に複数の対戦を行うのはかなりやりにくくないですか? たいやきさんがどのような作り方を想定しているのか具体的に 教えていただけると嬉しいです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1668] Re:ライザ言語の件(お久しぶりです)
投稿者:
2011/01/08 18:15:11

>迷惑ということはまったくありません。 ありがとうございます。でも、何かありましたら言ってください。 今は3Dグラフィックの組込を行っており、その一部の組み込み関数が87個です。 それでもまだまだ少なく、まだ多くの組込関数が必要です。 今は、3Dのマトリックス演算処理に四苦八苦しています。 いま、数行のプログラムで画面に3Dキャラが出て踊ったりはしているのですが、 それ自体では、システムを作っている意味が全く見えないのが残念です。 意味を持って見せられるようになるのは、先が遠そうです。 ふと、vector なり Matrix 変数型を作りたいとも思ってしまいましたが、 これはでは、本来の目的と外れて本末転倒とも思ってしまいます。 (でも結局 sheet 変数型作ってるけどね) 気は焦りますが、またーりやっていきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1667] Re:オブジェクト指向のメリット
投稿者:たいやき
2011/01/08 14:35:27

管理者様 返信が遅くなり申し訳ありません。 ご回答くださりありがとうございます。 オブジェクト指向でインスタンスがたくさん作れることが特徴であることと、 その特徴によって複数人で同時アクセスできるシステムが作れること (例えばオンラインオセロ)は、まったく無関係だと思います。 マルチプルインスタンスがオブジェクト指向の特徴の一つであることに 異論はありませんが、その説明をオンラインオセロで説明されることは、 返ってオブジェクト指向を間違って説明している(もしくは誤解をさせる)ことに なると思います。 実は、私はオブジェクト指向がわかっておらず、このサイトを読ませていただいて、 オブジェクト指向を教えてくれる親切なサイトがあるんだなとずっと思っていました。 が、最近、オブジェクト指向の本質がわかるにつれ、このサイトの説明は怪しいな と思うようになりました。 マルチプルインスタンスをオブジェクト指向の特徴としてあげるのはよいと 思いますが、オセロでの説明はやめたほうがよいのではと個人的に思っています。 というのはJavaでサーバを動かすときには、servletを使うことが出来ますが、 その場合はマルチにインスタンスが作れなくても(1つしかつくれなくても)、 オンラインオセロのようなゲームは作れるためです。 マルチプルインスタンスの説明は、もっと単純に説明できますし、そのほうが 本当に分かってない人にはわかりやすいと思います。 せっかくご説明をいただいて、偉そうに申し訳ありません。 では、失礼します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1666] Re:ライザ言語の件(お久しぶりです)
投稿者:(ぱ)こと管理人
2011/01/05 23:03:15

お久しぶりです。Diksamはすっかり放置してしまっていますが、そちらは 開発が進んでいるのですね。 > また、日記みたいに書いてしまうかもしれません、問題がありましたら注意 >してください。でも、ここで書く事も1つのモチベーションになるので、ご迷惑 >でなければよろしくお願いいたします。 迷惑ということはまったくありません。 > {L"dummy", L"", 0}, > {L"push_int_1byte", L"b",8}, > {L"push_int_2byte", L"s",8}, > {L"push_int_4byte", L"i",8}, // 実際の値を持つ たぶん中身は全然違っていると思うのですが、バイトコードのニモニックには Diksamの痕跡が残っていますね。うれしいことです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1665] ライザ言語の件(お久しぶりです)
投稿者:
2011/01/04 21:21:06

一年以上のお久しぶりです。8ヶ月ほど別のソフトを作っていたので、その間 何もしていませんでした。が、まだまだ作っています。 グラフィック部分をメインに作成しているので、なかなか見れる物ができません。 現在約4万5千行ほどのプログラムになっています。  また、日記みたいに書いてしまうかもしれません、問題がありましたら注意 してください。でも、ここで書く事も1つのモチベーションになるので、ご迷惑 でなければよろしくお願いいたします。 言語のインプリメントですが色々変えすぎて、何を変えたか分からなくなるほ どです。  まずはバイトコードが変わりました。 C++のwstringはやはり重たく、zwstringをオリジナルに作りました。 もちろんガーベージコレクションを必要としない可変長文字列変数です。 ↓がオペコードリストです。 {L"dummy", L"", 0}, {L"push_int_1byte", L"b",8}, {L"push_int_2byte", L"s",8}, {L"push_int_4byte", L"i",8}, // 実際の値を持つ {L"push_double_0", L"", 12}, {L"push_double_1", L"", 12}, {L"push_double_8byte", L"d",12}, // 実際の値を持つ {L"push_string_const", L"s",12}, // 文字列の位置NOを持つ0~ {L"push_null", L"", 8}, /**********/ {L"push_stack_int", L"s", 8}, // intローカル変数をスタックに {L"push_stack_double", L"s", 8}, // {L"push_stack_string", L"s", 12}, // {L"pop_stack_int", L"s", -8}, // スタックのintをローカル変数に {L"pop_stack_double", L"s", -8}, // {L"pop_stack_string", L"s", -12}, // /**********/ {L"push_static_int", L"s", 8}, // int静的変数をスタックに 予約 {L"push_static_double", L"s", 12}, // {L"push_static_string", L"s", 12}, // {L"pop_static_int", L"s", -8}, // スタックのintを静的変数に 予約 {L"pop_static_double", L"s", -12}, // {L"pop_static_string", L"s", -12}, // /**********/ {L"push_sheet", L"s", 8}, // sheet番号をスタックに {L"push_sheet_int ", L"s", 8}, // sheet変数をスタックに {L"push_sheet_double", L"s", 12}, // {L"push_sheet_str ", L"s", 12}, // {L"pop_sheet_int ", L"s", -24}, // スタックからsheet変数に {L"pop_sheet_double", L"s", -28}, // {L"pop_sheet_str ", L"s", -28}, // /**********/ {L"push_array_ref ", L"s", 8}, // 配列参照 {L"push_array_int ", L"s", -1}, // int配列処理 {L"push_array_double", L"s", -1}, // {L"push_array_string", L"s", -1}, // {L"pop_array_int ", L"s", -1}, // スタックからint配列に {L"pop_array_double", L"s", -1}, // {L"pop_array_string", L"s", -1}, // /**********/ {L"and_int", L"", -8}, // 以下は総て算術演算子 {L"or_int", L"", -8}, {L"xor_int", L"", -8}, {L"add_int", L"", -8}, {L"add_double", L"", -12}, {L"add_string", L"", -12}, {L"sub_int", L"", -8}, {L"sub_double", L"", -12}, {L"mul_int", L"", -8}, {L"mul_double", L"", -12}, {L"div_int", L"", -8}, {L"div_double", L"", -12}, {L"mod_int", L"", -8}, {L"mod_double", L"", -12}, {L"minus_int", L"", 0}, {L"minus_double", L"", 0}, {L"increment", L"", 0}, {L"decrement", L"", 0}, // ここまで算術演算子 /**********/ {L"cast_int_to_double", L"", 4}, // 以下はキャスト処理 {L"cast_double_to_int", L"", -4}, {L"cast_string_to_int", L"", -4}, {L"cast_string_to_double", L"", -0}, {L"cast_boolean_to_string", L"", 4}, {L"cast_int_to_string", L"", 4}, {L"cast_double_to_string", L"", 0}, // ここまでキャスト処理 /**********/ {L"eq_int", L"", -8}, // 以下は総て論理演算子 {L"eq_double", L"", -16}, {L"eq_string", L"", -16}, {L"gt_int", L"", -8}, {L"gt_double", L"", -16}, {L"gt_string", L"", -16}, {L"ge_int", L"", -8}, {L"ge_double", L"", -16}, {L"ge_string", L"", -16}, {L"lt_int", L"", -8}, {L"lt_double", L"", -16}, {L"lt_string", L"", -16}, {L"le_int", L"", -8}, {L"le_double", L"", -16}, {L"le_string", L"", -16}, {L"ne_int", L"", -8}, {L"ne_double", L"", -16}, {L"ne_string", L"", -16}, // ここまで論理演算子 {L"logical_and",L"", -8}, // {L"logical_or", L"", -8}, // {L"logical_not",L"", 0}, // /**********/ {L"pop", L"", -8}, // スタックを1つ減らす {L"duplicate", L"", 16}, // スタック内容をコピーしてスタックに {L"jump", L"s", 0}, // 指定ポインターにjump {L"jump_if_true", L"s", -8}, // スタックがtrueならjump {L"jump_if_false", L"s", -8}, // スタックがfalseならjump {L"nop------------",L"", 0}, // nop /**********/ {L"push_function", L"", 0}, // 関数情報をスタック、未使用 {L"call_function", L"ssss", 0}, // 関数コール {L"return", L"", -1}, // 関数戻り /**********/ {L"set_array_literal_int", L"ss", 0}, // int定数配列を変数にコピー {L"set_array_literal_double",L"ss", 0}, // double定数配列を変数にコピー {L"set_array_literal_string",L"ss", 0}, // string定数配列を変数にコピー また、メイン関数も1つのスレッドになり、待機リターンをしてVMを保持しないようにしました。  ↓例 //===================================================================== // 最初に実行されるmein関数 //===================================================================== int main(int qid,int p1) { if(qid == スレッド開始) { main_init(); return スレッド待機; } elsif(qid == 終了指示) { return スレッド終了; } return スレッドエラー終了; } また、配列操作のバイトコードもよりシンプルになり 2/3以下のバイトコードになりました。 シートの宣言も関数外で↓のようにラベル宣言するようにしました。 sheet s_system[10][20]; // システム設定のシート定義(変更不可) sheet s_key_input[2][256]; // キー入力定義(変更不可) sheet s_mouse_input[2][11]; // マウス入力定義(変更不可) sheet s_pad_input[8][20]; // パッド入力定義(変更不可) 初期バージョン完成にはまだまだかかりそうです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1664] Re:MD5関数ですが
投稿者:sayonara
2010/12/29 16:50:38

>今頃だったら md5 でなく sha1 にするともう少しマシになるかもしれない。 sha1ですか。覚えておきます!
[この投稿を含むスレッドを表示] [この投稿を削除]
[1663] Re:MD5関数ですが
投稿者:774RR
2010/12/29 07:48:13

この種のセキュリティって奴を考察する上では、 ・誰から何を守るのか ・かかるコストが効果に見合うか を考えないと意味がない。 正規の管理人が平文パスワードを(見たくないのに誤って)見てしまうこと対策 掲示板運営している httpd サーバに侵入されて掲示板ソースだけ盗まれた場合の対策 遠隔地からデーターベースに侵入されてデータだけ盗まれた場合の対策 httpd と DB 両サーバに侵入されてソース+データが両方盗まれた場合の対策 下に行くほど、なさそうなシナリオ+被害大、なわけだが ・現実的にありえないような状況に対する施策のために  コスト(金銭的、手間的)をどこまでかける必然があるか? の線引きになるだけのこと。 掲示板ソフト上の固定文字+乱数 salt +ユーザーパスワード、ってのは現実的解だと思う。 今頃だったら md5 でなく sha1 にするともう少しマシになるかもしれない。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1662] Re:MD5関数ですが
投稿者:sayonara
2010/12/28 12:20:28

>また、データベースの中身を覗けている時点で、悪人はPHPのソースを見て >「秘密」の文字列を見ることができている可能性が高いような気もします。 >その場合には、「秘密」は役に立たないということになります。 ここは懸念ですね。ソースに記述しない方法ってあったりするのかな!
[この投稿を含むスレッドを表示] [この投稿を削除]
[1661] Re:MD5関数ですが
投稿者:(ぱ)こと管理人
2010/12/28 01:41:18

774RRさん、毎回ありがとうございます。 それだけでは何なので蛇足ですが。 こちらに以下のような説明がありますが、 http://kmaebashi.com/programmer/bbs_dev/delete.html | また、こうしておくことで、掲示板を運営しているサーバが万一クラックされたり、 | レンタルサーバ業者がD/B情報を漏洩させたりしたときにも、投稿者のパスワードを | 守ることができます。 | なお、いくらMD5アルゴリズムが逆方向の推測が困難だといっても、辞書攻撃や | 総当り攻撃により破られる可能性はあります。そこで、上のソースでは、 | パスワードに対し秘密の文字列(赤字部分)を連結しています。もちろん実際の | ソースでは、ここには「秘密」という文字列ではなく、推測されにくいでたらめな | 文字列が書かれています。こうしておけば、そのでたらめな文字列がばれない限り、 | パスワードそのものを推測することはできません。 saltの話はひとまず除外し、「秘密」についてだけ考えます。 もしこの「秘密」文字列をくっつけなかったとすると、 データベースの内容が悪人に漏洩した場合、悪人は、辞書等の単語に 片っ端からMD5をかけることでパスワードの推測が可能な場合があります。 ちょっと昔のUNIXでは、パスワードに1方向ハッシュをかけた文字列を そのまま(誰にでも見える形で!)保存していて、私も一度、とあるサーバにて、 「ユーザIDと同じパスワードを使っている人」がいないか調べてみたら ぼろぼろ見つかってしまった、ということがありました。 ユーザIDと同じパスワードは論外として、辞書攻撃的なものには「秘密」は 有効ですが、「総当り攻撃」に対しては、本質的には「程度問題」の防御にしか なりません。もっとも文字列長が増えるので、この「程度問題」はかなり 大きな「程度問題」ですけれども。 また、データベースの中身を覗けている時点で、悪人はPHPのソースを見て 「秘密」の文字列を見ることができている可能性が高いような気もします。 その場合には、「秘密」は役に立たないということになります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1660] Re:MD5関数ですが
投稿者:sayonara
2010/12/27 18:10:43

課題1まで理解した上で質問しました。 わかりやすい説明でありがとうございます。 議論の板を読んで、 "秘密"は任意で良いとなんとなく思ってましたが、 確信できずに調べても出てこなかったです。 何度も回答していただいてすみません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1659] Re:MD5関数ですが
投稿者:774RR
2010/12/27 15:42:48

salt の役割を理解していればそんな質問最初から出ないと思うが・・・ 先に挙げた掲示板上の議論の詳細は読んで理解できた? 課題1:パスワードを平文(ひらぶん)で保存するのはユーザにとっても管理人にとってもうれしくない 解決策:パスワードを1方向ハッシュで保存したらいい 1方向ハッシュとして MD5 アルゴリズムを使うとしたら md5($password) でいい # そもそも1方向ハッシュって何か?の解説は略 ここまで大丈夫?これが理解できていないのであれば以下の話は読むだけ無駄。 課題2:データベースクラックされてハッシュ化されているパスワードが漏れたら、 そのときのセキュリティをどう担保すればいい? 解決策:パスワードだけを md5 すると「md5 辞書アタック」で破られうるので、 パスワードに別の文字をくっつけたら「破るコストが跳ね上がる=破られない」。 そのために「くっつける文字」というのを用意するとよい (これが salt) PHP では文字列の連結に . を使う。"hoge" . "piyo" は連結されて "hogepiyo" になる。 http://www.php.net/manual/ja/language.operators.string.php ユーザーが入力したパスワード (例: "hoge") に 掲示板ソフトが用意した乱数文字列 salt (例: "piyo") をくっつけて md5("hogepiyo") としてハッシュ値を保存すれば、 データーベースがクラックされてハッシュ結果と salt の "piyo" が漏れても 元パスワード "hoge" を取り出すコストは膨大なものになる=破りにくい。 # 実用的時間のうちに破ることができないのであれば、破られないと言い切っていい。 先の hash_user_password は「ユーザの入力したパスワード」「ソフトが乱数で用意した salt 」の他に 「掲示板プログラムをインストールするごとに変えられるカスタマイズ可能文字 "秘密" 」をくっつけている。 だから "秘密" のところには何を入れてもいい。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1658] MD5関数ですが
投稿者:sayonara
2010/12/27 09:16:18

54: function hash_user_password($src, $salt) { 55: $dest = md5("秘密" . $src . $salt); 56: 57: return $dest; 58: } 以上の”秘密”のところに何を入れればいいでしょうか。 hash_user_passwordは$src, $saltの値が入力され、$destを出力すると 自分の理解はここまでですが、色々調べても乱数$saltを使ったMD5関数の使い方は見つからなかったです。 どうか教えてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1657] Re:DBにテーブル作成時の項目について
投稿者:(ぱ)こと管理人
2010/12/22 03:48:07

返信が遅くなりましてすみません。 また、774RRさん、回答ありがとうございました。 >このページにある「messageテーブル」についてですが、 >password項目が二個並んでいるのはどうしてでしょうか。 >↓ >password varchar(64) パスワード >password varchar(64) パスワードのsalt このページの記述がこうなってしまっているのは単なる誤植ですね。 修正しました。ご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1656] Re:DBにテーブル作成時の項目について
投稿者:sayonara
2010/12/21 18:04:03

>片方はパスワードではなくて salt であって、要するにただの乱数。 >そのページの最後のほう、およびリンクのある掲示板上の議論参照。 > >salt という乱数を追加することでクラッキングがしづらくなるということ。 分かりました。 項目名をsaltに修正してcreate文が正常終了しました。 ありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1655] Re:DBにテーブル作成時の項目について
投稿者:774RR
2010/12/21 11:59:10

片方はパスワードではなくて salt であって、要するにただの乱数。 そのページの最後のほう、およびリンクのある掲示板上の議論参照。 salt という乱数を追加することでクラッキングがしづらくなるということ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1654] DBにテーブル作成時の項目について
投稿者:sayonara
2010/12/20 15:13:02

質問です。 http://kmaebashi.com/programmer/bbs_dev/delete.html このページにある「messageテーブル」についてですが、 password項目が二個並んでいるのはどうしてでしょうか。 ↓ password varchar(64) パスワード password varchar(64) パスワードのsalt 宜しくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1653] Re:PHPとmysqlで掲示板作成について
投稿者:sayonara
2010/12/20 09:07:02

勉強用に使わせていただいています。 初心者なので、とりあえず動くものが欲しいという段階です。 ご親切にありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1652] Re:PHPとmysqlで掲示板作成について
投稿者:(ぱ)こと管理人
2010/12/18 12:38:50

>get_cssの処理内容を貼ってください。 まあ貼るのはかまいませんけど、 get_css()がないのであれば、そこはひとまずべた書きにしてしまっても 構わないところですよね。 function get_css($board_id) { $sql_str = sprintf("select css from board where boardid='%s'", $board_id); $result = mysql_query_or_die($sql_str); if (mysql_num_rows($result) != 1) { die("掲示板のIDが変です。"); } $row = mysql_fetch_assoc($result); return $row["css"]; } 件のページでは、掲示板のソースを固めたものをダウンロード用として置いていません。 なぜかというと、私にとってあの記事の位置づけは「作り方の解説記事」であり 「掲示板スクリプトの配布ページ」ではないためです。 もちろん何を作るにも実際に動くものを動かしながら勉強する方が身につくものですし、 読者側からすれば動くソースを配布して欲しいという要望があるのもわかるのですが、 まるごと持っていった人にサポートを要求されたりバグの損害賠償を求められたり したらかなわないよな、ということで、現状のようにしています。ご了承ください。 あと、PHP4ですし、いろいろな意味で古くなってしまった記事でもあります。 ご利用は自己責任でお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1651] 管理者により削除されました
2010/12/18 12:39:21

重複投稿だったので削除しました。
[この投稿を含むスレッドを表示]
[1650] PHPとmysqlで掲示板作成について
投稿者:sayonara
2010/12/17 17:52:37

phpとmysqlで掲示板作成してみていますが、 「get_cssのfunctionが定義されていない」というエラーが出ました。 確認したところ、 util.phpに定義されていないです!!! get_cssの処理内容を貼ってください。 宜しくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1649] Re:オブジェクト指向のメリット
投稿者:774RR
2010/12/17 11:39:11

オブジェクト指向という「概念」=抽象 実際のプログラミング言語という「実装」=具体 とがごっちゃになっているからわけわからん気味なのだと思うが C++ なり Python なり「オブジェクト指向を意識した言語」では 「対象物」を示す this や self が言語仕様上必須になっているため、 プログラマが引数の形で明示しなくても「何を対象に」が自動的に表現される =対象指定を欠くことができない =対象を暗示的に使う C の strtok のようなものは実装しづらい だけなのだと思う。 対象を指定することが強制されるってことはすなわち「対象が複数個数あるのが前提」 =マルチプルインスタンスであることは前提条件、当たり前である のだと思う。 C では「言語仕様上」 this が必須でない =「言語仕様上は」対象を明示しなくてもよい、ってだけで プロジェクトの運用方針などで「第一引数を hogehoge* にすること必須」と決めてしまえば それで十分オブジェクト指向なプログラムは可能。 言語側でのネイティブサポートがあるかないか、の違いでしかないと思うの心
[この投稿を含むスレッドを表示] [この投稿を削除]
[1648] Re:オブジェクト指向のメリット
投稿者:(ぱ)こと管理人
2010/12/17 01:34:38

>※C言語では問題という説明でしたよね。strtok()関数の実装[関数仕様]の問題でC言語で不可能という話ではないと思います。 「C言語で不可能」と書いたおぼえはないですが…… 「C言語では問題」と書いたおぼえもないですが…… 「Cの流儀では多くの場合こう書くのではないか」という想定はある程度置いていますけど。 >strtok2( STR, getid, delimiter ); >strtok2( NULL, id, delimiter ); http://kmaebashi.com/programmer/object/othello.html 上記のページで、 void board_put(Board *board, int x, int y, int senteOrGote); というCの関数に対し、 「---つまり、これがオブジェクト指向です。」 と書いています。 同様のことを以下のページでも書いています。 http://kmaebashi.com/programmer/c_yota/module.html >XXX_hoge(XXX_Instance xxx, 第2引数, 第3引数); >敢えて大雑把な言い方をすれば、要するにこれがオブジェクト指向です。 >継承を考えない限りにおいては、 C++でもJavaでも、要するにやってることは >インスタンスのポインタを第1引数に持って回ってるだけのことであって、 >あとは、表記法が若干異なるのと、メソッドの名前空間が異なる程度の話です。 >実例としては昔のSunOSに付属していたSunViewというウィンドウ環境がありました。 私はSunViewはほぼ触ったことがありません。その後のXViewは割と使いました。 Xtはもっと使ってます。 で、このへんのライブラリは、「Cで無理やりオブジェクト指向を実現した例」 だと思っています。 http://kmaebashi.com/programmer/c_yota/inherit.html 私の認識と、「偏」さんの認識はたいへんに近いと思うので、反論(?)の 必要はないですよね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1647] Re:オブジェクト指向のメリット
投稿者:
2010/12/16 23:16:38

はじめまして。 >こちらにStringTokenizerの例を出しましたが、これはどうでしょうか? >http://kmaebashi.com/programmer/object/shigoto.html > >StringTokenizerはCのstrtok()と違って、プログラムの複数の箇所から同時アクセス >できる(というよりは、よそで使われているかどうかを意識せずに使うことができる) >わけです。 それって、strtok()がそういう使い方に配慮されてないだけに思えます。 ※C言語(非インスタンス化言語)だからできないという話とすり替えられているように感じました。 ※strtok()はそんな実装なので、それが保証できない時には別途用意したこっちの関数使おうねで良さそうに感じました。 オブジェクト指向が必要ないといいたい訳ではなく、旧来のC言語でも問題なく処理できる(ライブラリ化可能)と思います。 ※C言語では問題という説明でしたよね。strtok()関数の実装[関数仕様]の問題でC言語で不可能という話ではないと思います。 strtok2( STR, getid, delimiter ); strtok2( NULL, id, delimiter ); と呼び出し手順(IF)を変えてstrtok2内部でSTRを複数保持するようにする事で可能となりますよね。 StringTokenizerのインスタンスとして保持している情報をstrtok2()内部で保持してやる。 char coloncol[]="abc:cde:efg:ghij"; char commacol[]="abc,cde,efg,ghij"; char *result; int idcol, idcom; result = strtok2( coloncol, &idcol, ':' ); result = strtok2( NULL, idcol, ':' ); result = strtok2( commacol, &idcom, ',' ); result = strtok2( NULL, idcol, ':' ); result = strtok2( commacol, idcom, ',' ); result = strtok2( commacol, idcom, ',' ); ※実際使うにはインスタンスの開放的なIFも追加する事になるかと >また、たとえば大昔のBASICやHSPとかでは、画面に線を引く命令が、ウインドウを >引数に取りません。まあ、大昔のBASICにはマルチウインドウがなかったから >当然かもしれませんが、オブジェクト指向的に考えれば、最初から「ウインドウ」という >クラスを作り、複数のウインドウを開けるようにするのではないでしょうか。 実例としては昔のSunOSに付属していたSunViewというウィンドウ環境がありました。 C++が作られるより古い時代ですが、例えばPanelCreate()関数でPanelObjectを作る(もちろん複数可)感じでC言語のライブラリ使い実現されてましたよ。 ※WindowやPanelやItemやCanvasやと色々な部品がありました。同じ種類を複数生成する事もできましたよ。 ※SunOS3.x, SunOS4.xで使えた記憶が。4ではX11ベースのOpenWindowへの移行が推奨されてましたが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1646] Re:オブジェクト指向のメリット
投稿者:(ぱ)こと管理人
2010/12/14 02:22:28

はじめまして。 >しかし、複数の人が同時アクセス出来ることがメリットの一つであるのであれば、 >それはそれで納得できます。 オセロでは確かにそういう例を出しましたが、「複数の人(人間)が」と言ってしまうと、 適用範囲がずいぶん狭くなってしまうように思います。 こちらにStringTokenizerの例を出しましたが、これはどうでしょうか? http://kmaebashi.com/programmer/object/shigoto.html StringTokenizerはCのstrtok()と違って、プログラムの複数の箇所から同時アクセス できる(というよりは、よそで使われているかどうかを意識せずに使うことができる) わけです。 また、たとえば大昔のBASICやHSPとかでは、画面に線を引く命令が、ウインドウを 引数に取りません。まあ、大昔のBASICにはマルチウインドウがなかったから 当然かもしれませんが、オブジェクト指向的に考えれば、最初から「ウインドウ」という クラスを作り、複数のウインドウを開けるようにするのではないでしょうか。 もちろん、オブジェクト指向のメリットはこれだけではなくて、継承やら多態も あるのですけれど、そのあたりは他の本とかにも書いてあるということ、 特に継承についてはあまりいい例題がないということから放置してしまっています。 すみません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1645] オブジェクト指向のメリット
投稿者:たいやき
2010/12/13 18:53:26

疑り深いあなたのためのオブジェクト指向を読ませていただきました。 読んでいくなかで、自分のマルチプルインスタンスに対する知識や理解と、 記載されていることに差異があるように感じました。 どちらが正しいかは別として、まえばし様が記載されている内容を理解した上で、 どちらが正しいのか自分なりに判断したく、まえばし様が記載されている内容を、 私が正しく理解しているかどうか確認させていただければ幸いです。 オブジェクト指向の本質は、マルチプルインスタンスだと記載されており、 その後の説明で、オセロ盤を用いての説明で、C言語では、 (盤面ごとに別プロセスを立ち上げない限り)複数の人が同時アクセスして 使えるようなアプリは作れない(もしくは作りづらい)と書かれている という認識です。 そして、オブジェクト指向型であれば、複数のインスタンス(=盤面)が作成 出来るので、複数の人が同時アクセスするオセロが作れると記載されていると 理解しています。 もし、この理解が正なのであれば、マルチプルインスタンスの必要性やメリットが なんなのかを考えると、マルチプルインスタンスのメリットの一つは、複数の人が 当時アクセス出来るアプリを作ることが出来るアーキテクトであるということに なると思っています。 逆に、C言語のようなものは、複数の人が同時アクセスして動くアプリが作れない (つくりにくい)という特徴を持っていると理解したのですが、その認識は あっていますでしょうか? 私は、マルチプルインスタンスを作ることが出来るのがオブジェクト指向の 特徴であることは理解していますが、では、マルチプルインスタンスが作れる メリットは何なのかと考えると、一向に分かりません。 しかし、複数の人が同時アクセス出来ることがメリットの一つであるのであれば、 それはそれで納得できます。 よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1644] Re:from,phpについて
投稿者:(ぱ)こと管理人
2010/11/25 01:09:23

>すみませんが、この掲示板の作成とは具体的にどういうことでしょうか? >一応、dbは作ったのですが、データを作成するといったことでしょうか? こちらを参照してください。 http://kmaebashi.com/programmer/bbs_dev/newbbs.html 具体的には、boardテーブルにレコードをひとつ作る作業となります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1643] Re:from,phpについて
投稿者:Paulo
2010/11/24 08:59:01

> >よって、ご自分で試されるのであれば、先に掲示板の作成を行ってから >その掲示板のIDを指定するようにしてください。 前橋さま 早速のご返答、感謝しています。 当方は、メインフレーム、AS/400などのプログラミングをブラジルで仕事としてやっていましたが、今後はオープン系のプログラミングを趣味もかねて勉強していこと思っているものです。  すみませんが、この掲示板の作成とは具体的にどういうことでしょうか? 一応、dbは作ったのですが、データを作成するといったことでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1642] Re:from,phpについて
投稿者:(ぱ)こと管理人
2010/11/21 15:28:41

from.phpの中の下記のところで "urlが変です。"と画面にでてきて、処理が先に進まない状態なのですが、進めるにはどうしたらいいのでしょうか? > > 11: if (!isset($_GET["boardid"])) { > 12: die('URLが変です。'); > 13: } 以下のページにも書いてありますが、 http://kmaebashi.com/programmer/bbs_dev/spec.html この掲示板は、仕様として boardid="掲示板のID" というように、掲示板のIDを渡すようにしています。 今あなたが見ているこの掲示板も、 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs という形で、「kmaebashibbs」という掲示板のIDを渡しています。 テスト投稿用のテスト用掲示板も用意していますが、そのURLはこうです。 http://kmaebashi.com/bbs/list.php?boardid=testbbs よって、ご自分で試されるのであれば、先に掲示板の作成を行ってから その掲示板のIDを指定するようにしてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1641] from,phpについて
投稿者:Paulo
2010/11/20 16:33:08

php初心者ですが宜しくお願いします。 いま、このサイトに記載している投稿フォームのプログラムを勉強中なのですが、from.phpの中の下記のところで "urlが変です。"と画面にでてきて、処理が先に進まない状態なのですが、進めるにはどうしたらいいのでしょうか? 11: if (!isset($_GET["boardid"])) { 12: die('URLが変です。'); 13: } 教えて頂ければ幸いです。よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1640] Re:不具合について
投稿者:Tadashi
2010/09/20 10:04:24

>minGW でなきゃならない、ってことは無いので cygwin でも問題ないはず。 >現にウチでは問題ないし。 >まあなんにせよ minGW が欲しいのなら http://www.mingw.org/ > >> exeファイルはできるのですがなぜかcommand not foundとなってしまいます。 >どう作った?どう起動した? >UNIX 系 OS ではセキュリティ的配慮として、標準設定では >カレントディレクトリはコマンド検索パスに含まれない。 >#1621 と同様 gcc -o mycalc y.tab.c lex.yy.c と入力したのであれば >(cygwin の場合) a.exe というファイルが作成される。 >これを起動しようとして a<enter> と入力しても command not found になる。 > >$ ./a.exe <enter> のように どっと すらっしゅ を明示指定し、 >「カレントディレクトリにある a.exe を起動する」とするとよいはずだ。 > ありがとうございます!./で何とか起動しました。 それにしてもなぜ気づかなかったのか?わからないです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1638] Re:不具合について
投稿者:774RR
2010/09/16 22:48:24

>#1621 と同様 gcc -o mycalc y.tab.c lex.yy.c と入力したのであれば >(cygwin の場合) a.exe というファイルが作成される。 ああ、大嘘 (爆) mycalc.exe というファイルが生成されるんだけど、 これを起動しようとして mycalc <enter> と入力すると以下略。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1637] Re:不具合について
投稿者:774RR
2010/09/16 22:40:01

minGW でなきゃならない、ってことは無いので cygwin でも問題ないはず。 現にウチでは問題ないし。 まあなんにせよ minGW が欲しいのなら http://www.mingw.org/ > exeファイルはできるのですがなぜかcommand not foundとなってしまいます。 どう作った?どう起動した? UNIX 系 OS ではセキュリティ的配慮として、標準設定では カレントディレクトリはコマンド検索パスに含まれない。 #1621 と同様 gcc -o mycalc y.tab.c lex.yy.c と入力したのであれば (cygwin の場合) a.exe というファイルが作成される。 これを起動しようとして a<enter> と入力しても command not found になる。 $ ./a.exe <enter> のように どっと すらっしゅ を明示指定し、 「カレントディレクトリにある a.exe を起動する」とするとよいはずだ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1636] 不具合について
投稿者:Tadashi
2010/09/16 12:53:53

はじめまして。Tadashiと申します。非常に初歩的な質問で申し訳ないのですが、MinGW-5.1.4.exeがある場所がわかりません。記載のサイトにアクセスしてみましたが見つかりませんでした。しかたがないのでCygwinで電卓を作成してみたのですが、exeファイルはできるのですがなぜかcommand not foundとなってしまいます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1635] Re:admindeletedindex.php
投稿者:coolm
2010/09/14 18:06:33

>前橋様、 なるほどです。ありがとうございます。 >>管理者削除後、日付順インデックスに、「管理者削除」を表記するためのadmindeletedindex.phpのソースが見当たらないので、ソースを教えていただけないでしょうか? よろしくお願いいたします。 > >たいしたものではありませんがいちおう貼っておきます。 > ><tr> ><td align="right">[<?=$serialid?>]</td> ><td> > <a href="./list.php?boardid=<?=$board_id?>&from=<?=$serialid?>&range=1"> > 管理者により削除されました > </a> ></td> ></tr> > >
[この投稿を含むスレッドを表示] [この投稿を削除]
[1634] Re:admindeletedindex.php
投稿者:(ぱ)こと管理人
2010/09/14 01:33:51

>管理者削除後、日付順インデックスに、「管理者削除」を表記するためのadmindeletedindex.phpのソースが見当たらないので、ソースを教えていただけないでしょうか? よろしくお願いいたします。 たいしたものではありませんがいちおう貼っておきます。 <tr> <td align="right">[<?=$serialid?>]</td> <td> <a href="./list.php?boardid=<?=$board_id?>&from=<?=$serialid?>&range=1"> 管理者により削除されました </a> </td> </tr>
[この投稿を含むスレッドを表示] [この投稿を削除]
[1633] admindeletedindex.php
投稿者:coolm
2010/09/13 01:11:54

前橋様、こんにちは。 前橋様の、「PHPとMySQLで掲示板を作る」を拝見させていただき、掲示板を作らせていただいてる者です。 本当にありがたく拝見させていただき、勉強させてもらいながら、悪戦苦闘しながら作っています。本当に感謝しております。 つまづいてる箇所がありまして、前橋様にお願いがあります。 管理者削除後、日付順インデックスに、「管理者削除」を表記するためのadmindeletedindex.phpのソースが見当たらないので、ソースを教えていただけないでしょうか? よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1629] 管理者により削除されました
2010/09/12 07:39:06

テスト用掲示板を知らずにこっちに書いちゃったのかな、、と思ったら、 テスト用掲示板よりもこっちの方が投稿時刻が遅い謎。
[この投稿を含むスレッドを表示]
[1628] Re:あら捜し
投稿者:(ぱ)こと管理人
2010/08/25 02:53:25

>http://kmaebashi.com/programmer/devlang/book/hosoku.html >不動になってますが浮動でしょうね(3箇所) > >http://kmaebashi.com/taiatari/seigo.html >p.333 scanf は変換個数ではなく代入個数を返す >(http://kmaebashi.com/seiha/seigo.html こっちは修正済み) ご指摘ありがとうございます。2点とも修正しました。 いやもうなんといいますか本当に、いつもお世話になってます(_o_)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1627] あら捜し
投稿者:774RR
2010/08/24 15:15:04

http://kmaebashi.com/programmer/devlang/book/hosoku.html 不動になってますが浮動でしょうね(3箇所) http://kmaebashi.com/taiatari/seigo.html p.333 scanf は変換個数ではなく代入個数を返す (http://kmaebashi.com/seiha/seigo.html こっちは修正済み)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1626] Re:mycalc でエラー発生
投稿者:774RR
2010/08/21 06:57:53

おお、よかったですな。 これに懲りずにいろいろ遊んでみてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1625] Re:mycalc でエラー発生
投稿者:チャチャ丸
2010/08/21 03:20:23

>俺んところでは MinGW をインストールした履歴は無いのでうまく動くのかもしれない。 >特に理由が無ければ MinGW 系をアンインストールしてみるといいかもしれない。 >ないしは cygwin をアンインストールして MinGW だけにしてみるか。 うわー出来ました!! アドバイス通りcygwinをアンインストールしてMinGWの方だけで設定したら出来ました。 本当にありがとうございます。 仰られた通りどっちも読み込んでいた(?)のが原因だったみたいです。 みなさんお忙しいなか何度もアドバイスをありがとうございました。 これからまた色々試してみたいと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1624] Re:mycalc でエラー発生
投稿者:774RR
2010/08/20 16:13:48

俺んところと以下の二箇所が違うね・・(メモリ容量の数値とかは無視) >ignoring nonexistent directory "C" こちらは今回のエラーに直接関係なさそうなので無視してよいと思われる。 >#include <...> search starts here: >\MinGW\include こっちが問題の原因であろうと推測される。俺んところではこの行 (\MinGW\include) が無い。 cygwin 1.7 で MinGW のサポートが打ち切られているはずなので MinGW の関連ファイルを探してしまうのはあまりよろしくないのでは・・・ Q1.過去に minGW をインストールした? Q2.cygwin setup で gcc-mingw gcc-mingw-core とかインストールした? 俺んところでは MinGW をインストールした履歴は無いのでうまく動くのかもしれない。 特に理由が無ければ MinGW 系をアンインストールしてみるといいかもしれない。 ないしは cygwin をアンインストールして MinGW だけにしてみるか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1623] Re:mycalc でエラー発生
投稿者:チャチャ丸
2010/08/20 10:41:31

>ちなみに gcc --version と入力したときになんて表示される? >ウチでは gcc (GCC) 4.3.4 20090804 (release) 1 になっている。 全く同じバージョンでした。 ので出力されたhoge.txt載せますね。 gcc: 2: No such file or directory Using built-in specs. Target: i686-pc-cygwin Configured with: /gnu/gcc/releases/respins/4.3.4-3a/gcc4-4.3.4-3/src/gcc-4.3.4/configure --srcdir=/gnu/gcc/releases/respins/4.3.4-3a/gcc4-4.3.4-3/src/gcc-4.3.4 --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --libexecdir=/usr/lib --datadir=/usr/share --localstatedir=/var --sysconfdir=/etc --infodir=/usr/share/info --mandir=/usr/share/man --datadir=/usr/share --infodir=/usr/share/info --mandir=/usr/share/man -v --with-gmp=/usr --with-mpfr=/usr --enable-bootstrap --enable-version-specific-runtime-libs --with-slibdir=/usr/bin --libexecdir=/usr/lib --enable-static --enable-shared --enable-shared-libgcc --disable-__cxa_atexit --with-gnu-ld --with-gnu-as --with-dwarf2 --disable-sjlj-exceptions --enable-languages=ada,c,c++,fortran,java,objc,obj-c++ --disable-symvers --enable-libjava --program-suffix=-4 --enable-libgomp --enable-libssp --enable-libada --enable-threads=posix --with-arch=i686 --with-tune=generic --enable-libgcj-sublibs CC=gcc-4 CXX=g++-4 CC_FOR_TARGET=gcc-4 CXX_FOR_TARGET=g++-4 GNATMAKE_FOR_TARGET=gnatmake GNATBIND_FOR_TARGET=gnatbind --with-ecj-jar=/usr/share/java/ecj.jar Thread model: posix gcc version 4.3.4 20090804 (release) 1 (GCC) COLLECT_GCC_OPTIONS='-v' '-o' 'mycalc.exe' '-mtune=generic' '-march=i686' /usr/lib/gcc/i686-pc-cygwin/4.3.4/cc1.exe -quiet -v -D__CYGWIN32__ -D__CYGWIN__ -Dunix -D__unix__ -D__unix -idirafter /usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../include/w32api -idirafter /usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/lib/../../include/w32api y.tab.c -quiet -dumpbase y.tab.c -mtune=generic -march=i686 -auxbase y.tab -version -o /cygdrive/c/DOCUME~1/user-1/LOCALS~1/Temp/ccyoqpc6.s ignoring nonexistent directory "C" ignoring nonexistent directory "/usr/local/include" ignoring nonexistent directory "/usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/include" ignoring duplicate directory "/usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/lib/../../include/w32api" #include "..." search starts here: #include <...> search starts here: \MinGW\include /usr/lib/gcc/i686-pc-cygwin/4.3.4/include /usr/lib/gcc/i686-pc-cygwin/4.3.4/include-fixed /usr/include /usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../include/w32api End of search list. GNU C (GCC) version 4.3.4 20090804 (release) 1 (i686-pc-cygwin) compiled by GNU C version 4.3.4 20090804 (release) 1, GMP version 4.3.1, MPFR version 2.4.1-p5. GGC heuristics: --param ggc-min-expand=45 --param ggc-min-heapsize=28600 Compiler executable checksum: f80f2b86ee4951059548b57e98331af2 COLLECT_GCC_OPTIONS='-v' '-o' 'mycalc.exe' '-mtune=generic' '-march=i686' /usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/bin/as.exe -v -o /cygdrive/c/DOCUME~1/user-1/LOCALS~1/Temp/ccVAFJ0o.o /cygdrive/c/DOCUME~1/user-1/LOCALS~1/Temp/ccyoqpc6.s GNU assembler version 2.20.51 (i686-cygwin) using BFD version (GNU Binutils) 2.20.51.20100410 COLLECT_GCC_OPTIONS='-v' '-o' 'mycalc.exe' '-mtune=generic' '-march=i686' /usr/lib/gcc/i686-pc-cygwin/4.3.4/cc1.exe -quiet -v -D__CYGWIN32__ -D__CYGWIN__ -Dunix -D__unix__ -D__unix -idirafter /usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../include/w32api -idirafter /usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/lib/../../include/w32api lex.yy.c -quiet -dumpbase lex.yy.c -mtune=generic -march=i686 -auxbase lex.yy -version -o /cygdrive/c/DOCUME~1/user-1/LOCALS~1/Temp/ccyoqpc6.s ignoring nonexistent directory "C" ignoring nonexistent directory "/usr/local/include" ignoring nonexistent directory "/usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/include" ignoring duplicate directory "/usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/lib/../../include/w32api" #include "..." search starts here: #include <...> search starts here: \MinGW\include /usr/lib/gcc/i686-pc-cygwin/4.3.4/include /usr/lib/gcc/i686-pc-cygwin/4.3.4/include-fixed /usr/include /usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../include/w32api End of search list. GNU C (GCC) version 4.3.4 20090804 (release) 1 (i686-pc-cygwin) compiled by GNU C version 4.3.4 20090804 (release) 1, GMP version 4.3.1, MPFR version 2.4.1-p5. GGC heuristics: --param ggc-min-expand=45 --param ggc-min-heapsize=28600 Compiler executable checksum: f80f2b86ee4951059548b57e98331af2 COLLECT_GCC_OPTIONS='-v' '-o' 'mycalc.exe' '-mtune=generic' '-march=i686' /usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/bin/as.exe -v -o /cygdrive/c/DOCUME~1/user-1/LOCALS~1/Temp/ccEYJmqj.o /cygdrive/c/DOCUME~1/user-1/LOCALS~1/Temp/ccyoqpc6.s GNU assembler version 2.20.51 (i686-cygwin) using BFD version (GNU Binutils) 2.20.51.20100410
[この投稿を含むスレッドを表示] [この投稿を削除]
[1622] Re:mycalc でエラー発生
投稿者:チャチャ丸
2010/08/20 10:27:08

>管理人の前橋です。はじめまして。 >しばらくこちらを見ていなくて、反応が遅くなりましてすみません。 はじめまして。お返事ありがとうございます。 >ここ↑からダウンロードしたファイルに含まれているmake.batやmake.shを >使わず、手作業でyacc(bison?)やlex(flex?)も動かしたということでしょうか? そうですね。bisonとflexを手入力で動かしました。そこではエラーは出ないのですが、 gcc -o mycalc y.tab.c lex.yy.c の所で以下の様なエラーが表示されます。 /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0x8e): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0xc2): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0xed): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0x133): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0x168): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0x1af): more undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x872): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x87f): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x899): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x1195): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x1231): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x16fb): undefined reference to `__errno' collect2: Id returned 1 exit status make.batを使った場合も同じ部分に「アクセスが拒否されました」と表示されます。 >具体的にどう操作されたのでしょうか。また、そこで何かエラーは出て >いないでしょうか。 特に変わった事をしたつもりはなかったのですが僕がした操作は、 mycalc.y mycalc.lをc/cygwin/home/user/に作成して >bison --yacc -dv mycalc.y >flex mycalc.l >gcc -o mycalc y.tab.c lex.yy.c と入力しただけです。 エラーが表示されたのは先ほど記述したインストールの最後に表示されるものだけです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1621] Re:mycalc でエラー発生
投稿者:774RR
2010/08/20 09:54:49

特になにか妙な設定が必要であったとか、そういうことはないはずだけど。 ttp://www.cygwin.com/ から setup.exe をダウンロードしローカルに保存 保存した setup.exe を起動 国内ミラーサイトを選択の上でダウンロード+インストールを実施 cygwin bash shell を起動し cd <to/where/mycalc/is/expanded> bison -y -dv mycalc.y flex mycalc.l gcc -o mycalc y.tab.c lex.yy.c ちなみに gcc --version と入力したときになんて表示される? ウチでは gcc (GCC) 4.3.4 20090804 (release) 1 になっている。 gcc -v -o mycalc y.tab.c lex.yy.c だと何が表示される? 結構膨大な量が出るので、先の --version が同じだった場合のみ実行すればいい。 メモを取ったりすると転記ミスが怖いので gcc -v -o mycalc y.tab.c lex.yy.c 2&>hoge.txt として hoge.txt を見たほうがいい。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1620] Re:mycalc でエラー発生
投稿者:774RR
2010/08/20 08:58:30

cygwin (1.5 も 1.7 も) のデフォルトインストール時は unix 改行。 ダウンロードページの mycalc (sjis/zip) に入っているファイルは dos 改行。 ・cygwin の bash-shell 上で make.sh を使うとこの dos 改行が邪魔して動かない。 ・cygwin の bash-shell 上で make.bat を使うと cmd.exe を呼ぶので下記参照 ・アクセサリ→コマンドプロンプトの cmd.exe 上で make.bat を使うと  cygwin 1.7 の /bin/gcc や /bin/cc が (cygwin 仕様による) symlink であるため  cmd.exe が gcc/cc を認識できず、起動失敗する といういささか困ったチャン状態なので、手打ちしたほうが早いという・・・ 改行コードの違いで動かないことが発見できる人なら改行コード変換もできるだろうけど 初めてチャレンジします!って人にそれを求めるのも酷な話で。 改行を修正しても cygwin には flex しか存在しないので lex → flex に要修正。 (/bin/yacc は /bin/bison の symlink になっているのでこっちは問題ない)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1619] Re:mycalc でエラー発生
投稿者:(ぱ)こと管理人
2010/08/20 03:02:05

管理人の前橋です。はじめまして。 しばらくこちらを見ていなくて、反応が遅くなりましてすみません。 さて、チャチャ丸さんが具体的に行った操作がよくわからないのですが、 >今2章のyacc/lexで電卓を作る部分で、とりあえずmycalc.yとmycalc.lを >模写して実行したのですが、 >"cc -o mycalc y.tab.c lex.yy.c"のコマンドを行うとエラーが出ます。 ということは、 >>http://kmaebashi.com/programmer/devlang/book/download.html ここ↑からダウンロードしたファイルに含まれているmake.batやmake.shを 使わず、手作業でyacc(bison?)やlex(flex?)も動かしたということでしょうか? 具体的にどう操作されたのでしょうか。また、そこで何かエラーは出て いないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1618] Re:mycalc でエラー発生
投稿者:チャチャ丸
2010/08/20 01:42:54

連続投稿ですいません。 インストール時のエラーを見逃していました。 (長時間のインストールのせいでボケていたのでしょうかw) インストール終了時になかったパッケージみたいなのが表示されます。 どのサイトを選んでも同じものが表示されました。 以下 Package: No package boxes.sh exit code 2 brltty.sh exit code 1 docbook-xml-simple10.sh exit code 1 docbook-xml-simple11.sh exit code 1 docbook-xml412.sh exit code 1 docbook-xml42.sh exit code 1 docbook-xml43.sh exit code 1 docbook-xml44.sh exit code 1 docbook-xml45.sh exit code 1 docbook-xsl-ns.sh exit code 1 docbook-xsl.sh exit code 1 exim.sh exit code 1 libglade2.0.sh exit code 2 mined.sh exit code 1 です。 setupの前になにか設定が必要なのでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1617] Re:mycalc でエラー発生
投稿者:チャチャ丸
2010/08/19 23:35:43

タイトルありがとうございます。 >これは多分ライブラリを正しくリンクできていないことが原因だと思われる。 >ソースコードが原因ではなくて、まず間違いなく開発環境側の原因。 >cygwin のインストールが不足しているか、操作ミスと思われる。 今日再インストールしてみたのですが同じエラーが表示されました。 今回は出来る物は一応全部インストールしました。 またバージョンは確認したところ1.7.6でした。 同じバージョンで出来ないということは、やはり環境構築にミスがあるのかもしれないです。 再度調べて検証してみます。 >チャチャ丸氏のところの cygwin のバージョンとかインストール状態が不明なので、 >今この場でこれ以上のアドバイスはできないなぁ。 とても助かりました。ありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1616] mycalc でエラー発生
投稿者:774RR
2010/08/18 21:44:44

タイトル変えておくね > undefined reference to `__imp__iob' > undefined reference to `__errno' これは多分ライブラリを正しくリンクできていないことが原因だと思われる。 ソースコードが原因ではなくて、まず間違いなく開発環境側の原因。 cygwin のインストールが不足しているか、操作ミスと思われる。 で、ウチの cygwin 1.7.6 だと何の問題も無くうまくコンパイル・リンクされる。 実行結果も期待通り。 チャチャ丸氏のところの cygwin のバージョンとかインストール状態が不明なので、 今この場でこれ以上のアドバイスはできないなぁ。 cygwin の再/追加インストールしてみるとか・・・ > # make.sh 中 lex → flex に修正が必要かも はとりあえず忘れていいよ。こっちを追求しだすと横道にそれていくので。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1615] Re:はじめまして
投稿者:チャチャ丸
2010/08/18 20:29:19

素早いお返事ありがとうございます。とても助かります。 >提示部はすべて警告であってエラーぢゃない(=承知の上で使う分には問題ない) >以下略の部分にあるエラー(警告でなくエラー)を見せてもらわないと判断不能。 エラーの方はよくわからなくて勝手にはしょってしまいました。すいません。 以下エラーです。 /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0x8e): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0xc2): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0xed): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0x133): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0x168): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0x1af): more undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x872): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x87f): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x899): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x1195): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x1231): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x16fb): undefined reference to `__errno' collect2: Id returned 1 exit status です。 >とりあえずタイプミスとか無いかい? >http://kmaebashi.com/programmer/devlang/book/download.html >ここからダウンロードした mycalc は正しく動いたよ。 僕もタイプミスしてるのではと思ってそこからダウンロードしたものでも試したんですが同様のエラーが出てしましました。 ># make.sh 中 lex → flex に修正が必要かも とても基本的なことで申し訳ないのですがどのファイルのどのあたりの部分の事でしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1614] Re:はじめまして
投稿者:774RR
2010/08/18 13:14:16

提示部はすべて警告であってエラーぢゃない(=承知の上で使う分には問題ない) 以下略の部分にあるエラー(警告でなくエラー)を見せてもらわないと判断不能。 とりあえずタイプミスとか無いかい? http://kmaebashi.com/programmer/devlang/book/download.html ここからダウンロードした mycalc は正しく動いたよ。 # make.sh 中 lex → flex に修正が必要かも
[この投稿を含むスレッドを表示] [この投稿を削除]
[1613] はじめまして
投稿者:チャチャ丸
2010/08/18 02:34:17

はじめまして。「プログラミング言語を作る」を読み初めて勉強中のチャチャ丸と申します。 まだまだ序盤なのですが質問があって投稿させてもらいました。 今2章のyacc/lexで電卓を作る部分で、とりあえずmycalc.yとmycalc.lを模写して実行したのですが、 "cc -o mycalc y.tab.c lex.yy.c"のコマンドを行うとエラーが出ます。 エラーの内容は-Wallで見たところ y.tab.c: In function 'yyparse' : y.tab.c:1270: warning: implicit declaration of function 'yylex' y.tab.c:1439: warning: implicit declaration of function 'yyerror' lex.yy.c:1120: warning: 'yyunput' defined but not used lex.yy.c:1163: warning: 'input' defined but not used (以下略) と表示されます。 y.tab.cを見てみたところ622行目から #ifdef YYLEX_PARAM # define YYLEX yylex (YYLEX_PARAM) #else # define YYLEX yylex () #endif という部分があったのでyylexは定義されているように思えるのですが、なにが原因なのでしょうか? ちなみにcygwinを利用しています。 何かお答えいただければ幸いです。よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1612] 管理者により削除されました
2010/08/12 02:08:17

広告削除…ふぅ。
[この投稿を含むスレッドを表示]
[1611] 管理者により削除されました
2010/08/08 18:24:55

テスト投稿はテスト用掲示板にお願いします。
[この投稿を含むスレッドを表示]
[1610] Re:prime.milについて
投稿者:yuya
2010/08/01 08:29:09

(ぱ)さん、お返事ありがとうございます。 ご事情、了解いたしました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1609] Re:prime.milについて
投稿者:(ぱ)こと管理人
2010/07/31 18:19:16

>日経ソフトウエア8月号「MIL」の記事を読んでいます。 > >本編に進む前に、p18のprime.milでつまづいてしまいました。 もうしわけありません。たしかにprime.milは直感的なコードとは 言えないと思います。ふつうに考えて、そもそもループが三重である必要は ないはずですし。 prime.milがこうなってしまった事情はいろいろあるのですが、最終的には 私の責任であると思います。もうしわけありませんでした。 まあ、prime.milはMILの機能を示すためのサンプルコードなので、制御構造や 計算等の機能を使っていれば問題ない、ということで雑になってしまった面は あります。そこまで丁寧に読んでいただけるのは正直想定外でした。 ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1608] Re:prime.milについて
投稿者:yuya
2010/07/30 16:56:16

774RRさん、ご意見ありがとうございます。 >ならば処理上は一見無駄に思えるような記述であっても合目的でおkだと思いますが。 ># その無駄さ自体がイイというか ># どこがどう無駄かを読者に考えてもらうのがイイというか おっしゃるとおりで、おかげで私も自分で組んでみる機会を得て勉強になりました。 >yuya さんの投稿プログラムも「素数の個数」には実用的でないですよね? ええ、あれは元のソースとほぼ同じアルゴリズムを、自分に読めるように書き直したものです。 脇道に気を取られて、本編のことに全然言及していませんが、 いつものとおり素晴らしく分かりやすい解説です。 「車輪の再発明」にもピンからキリまで、 歴然としたクォリティの違いがあるものだな、と改めて思いました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1607] Re:prime.milについて
投稿者:774RR
2010/07/30 10:26:31

# 元ネタは読んでいません 記事(というかサンプルプログラム)の目的は、 素数の個数を求めることではなくて、その独自言語の解説なんですよね? ならば処理上は一見無駄に思えるような記述であっても合目的でおkだと思いますが。 # その無駄さ自体がイイというか # どこがどう無駄かを読者に考えてもらうのがイイというか yuya さんの投稿プログラムも「素数の個数」には実用的でないですよね?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1606] prime.milについて
投稿者:yuya
2010/07/29 10:00:34

日経ソフトウエア8月号「MIL」の記事を読んでいます。 本編に進む前に、p18のprime.milでつまづいてしまいました。 かなり時間をかけて、「確かにこれで素数は求まる」ことは納得したのですが、 それでも疑問がたくさん残ります。 たとえば、c を number / 2 まで回すのなら分かりますが、 小さな number に対しても一律 HALF_OF_MAX まで回す必要があるのでしょうか? はじめ、ソースが複雑なのは言語の仕様を切り詰めているせいかと思いましたが、 自分で書いてみるとこうなりました。 MAX = 1000; number_of_prime = 0; number = 2; while(number <= MAX){ i = 2; while(i < number){ # 2 から number - 1 の範囲の整数で if(number / i * i == number){ # 割り切れたら goto *exit; # 素数ではない } i = i + 1; } print(number); number_of_prime = number_of_prime + 1; *exit number = number + 1; } print("the number of prime is"); print(number_of_prime); 書いたあとで再度p18のソースを見ると、 必要以上の複雑さがかなり含まれていると感じました。 (ぱ)さんの記事はいつも日本語が驚異的に分かりやすいので、 ソースにも同じくらいの分かりやすさを無意識に要求してしまっているのかもしれません。 読者のわがままというものですが……。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1605] Re:Diksamのmakeでエラーとなる
投稿者:(ぱ)こと管理人
2010/07/28 03:30:25

はじめまして。 >>bison --yacc -dy diksam.y >>diksam.y:428 13-14: $$ for the midrule at $2 of 'block' has no declared type >>gmake: *** [y.tab..h] Error 1 本件、おそらく正誤表の以下の件(p.206の件)だと思います。 http://kmaebashi.com/programmer/devlang/book/seigo.html#p206 当時、どのように判断したのかは正直なところあまり覚えていないのですが、 公開しているソースが修正されていないのは問題かと思います。 週末あたりをめどに確認させてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1604] bison2.4系列だとDiksamがコンパイル出来ないようです
投稿者:hasim
2010/07/28 01:09:03

こんばんは、hasimと申します。 言語作成に関する詳しい解説、勉強させて頂いてます。 Diksamのソースコードをコンパイルしようとしたのですが、 bisonのバージョンが2.4だとエラーが起きるようです。 bisonのバージョンを2.3に落としたら、無事コンパイル出来ました。 エラー内容は以下のようなものでした。 % bison compiler/diksam.y compiler/diksam.y:748.13-14: $$ for the midrule at $2 of `catch_clause' has no declared type compiler/diksam.y:786.13-14: $$ for the midrule at $2 of `block' has no declared type ご参考になれば幸いです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1601] 管理者により削除されました
2010/07/05 00:20:27

テスト書き込みはテスト用掲示板にどうぞ。 http://kmaebashi.com/bbs/list.php?boardid=testbbs
[この投稿を含むスレッドを表示]
[1600] 一応できたのでソースをさらします。
投稿者:バッファロー
2010/07/01 09:57:49

助言をいただき、それをむねに一応完成したソースを書き込みます。 変なところがあれば、ぜひ助言をお願いします。 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef int (*Compare)(int,int) ; typedef struct DATA DATA; struct DATA { DATA * next; char * name; int math; int language; int sum; }; #define MAX 256 int AscendinOrder(int a,int b); int DescendingOrder(int a,int b); DATA* merge_sort(DATA* top,Compare); DATA* merge_list(DATA* x, DATA* y,Compare); /**************************************** 機能:線形リストのデータをすべて解放する。 引数:top 線形リストのトップデータ comp 使用した比較関数 出力:無し ****************************************/ void AllFree(DATA *top,Compare *comp) { DATA *temp,*freeData; if(*comp == AscendinOrder || *comp == NULL){ temp = top; while(temp->next){ freeData = temp; temp =temp->next; free(freeData->name); free(freeData); } }else if(*comp == DescendingOrder){ temp = top->next; while(temp){ freeData = temp; temp =temp->next; free(freeData->name); free(freeData); } } } /**************************************** 機能:線形リストのノードを作成。 引数:無し 出力:DATA型の新しいノードのポインタ ****************************************/ DATA* newnode(){ DATA *p; p=malloc(sizeof(DATA)); p->next=NULL; return p; } /**************************************** 機能:合計点を求める 引数:data 合計点を求めるDATA型のポインタ 出力:mathとlanguageの合計点 ****************************************/ int SUM(DATA *data) { return data->math+data->language; } /**************************************** 機能:線形リストの末尾にノードを追加。 引数:p リストの先頭 c リストnameにはいる名前 lang リストのlanguageに入る数値 math リストのmathに入る数値 出力:無し ****************************************/ void add(DATA *p,char *c,int lang,int math){ while(p->next != NULL){ p= p->next; } p->math = math; p->language = lang; p->sum = SUM(p); p->name=malloc(strlen(c)+1); strcpy(p->name,c); p->next=newnode(); } /**************************************** 機能:線形リストの内容を表示。 引数:data リストの先頭 comp 使った比較関数 出力:無し ****************************************/ void ShowData(DATA *data,Compare *comp) { DATA *temp; if(*comp == AscendinOrder || *comp == NULL){ for(temp = data; temp->next;temp= temp->next){ printf("name : %s, language : %d, math : %d, sum :%d \n",temp->name,temp->language,temp->math,temp->sum); } }else if(*comp == DescendingOrder){ for(temp = data->next; temp;temp= temp->next){ printf("name : %s, language : %d, math : %d, sum :%d \n",temp->name,temp->language,temp->math,temp->sum); } } } /**************************************** 機能:表示方法の設定。 引数:無し 出力:表示方法の値。 ****************************************/ int ShowCase() { char c; printf("昇順で表示 :1 ,降順で表示:2\n"); c = getchar(); switch(c){ case '1': return 1; case '2': return 2; default: return 0; } } int main() { char data[MAX] = {'\0'}; char ctemp[100] = {'\0'}; int m,l,type; FILE *fp = fopen("data.txt","r"); char *n; DATA *top = malloc(sizeof(DATA)); Compare comp = NULL; type=ShowCase(); if(type == 1){ comp = AscendinOrder; }else if(type == 2){ comp = DescendingOrder; }else{ comp = NULL; } top->next = NULL; while(fgets(data,MAX,fp)){ if(n = strchr(data,'\n')) *n = '\0'; sscanf(data,"%s%d%d",ctemp,&m,&l); add(top,ctemp,l,m); } if(comp != NULL){ top =merge_sort(top,comp); } ShowData(top,&comp); AllFree(top,&comp); return 0; } /**************************************** 機能:線形リストのマージソートする。 引数:top リストの先頭 comp 使う比較関数 出力:ソート済みのリストのポインタ ****************************************/ DATA* merge_sort(DATA* top,Compare comp) { DATA *a, *b, *y; /* リストに含まれる要素数が0または1個のときは、ソートの必要がない */ if( top == NULL || top->next == NULL ){ return top; } a = top; /* aは先頭の要素を指す */ b = top->next; if( b != NULL ){ b = b->next; } /* bは先頭から3番目の要素を指す */ /* 線形リストを中心くらいから半分に分けるため、中心位置がどこにあるのか探る */ while( b != NULL ) { a = a->next; /* aは常に1つだけ進む */ b = b->next; if( b != NULL ){ b = b->next; } /* bは基本的に2つ進む */ } /* 線形リストを2つに分割する */ y = a->next; /* yは分割後の2つのリストのうちの、後半部分の方の先頭を指す */ a->next = NULL; /* 分割した2つのリスト */ return merge_list( merge_sort( top ,comp), merge_sort( y ,comp) ,comp); } /************************************************************************ 機能:2つの線形リストをマージする。 引数:x マージする2つの線形リストのうちの片方の先頭要素へのポインタ  y マージする2つの線形リストのうちの片方の先頭要素へのポインタ comp 比較関数 出力: マージされた線形リストの先頭要素へのポインタ *************************************************************************/ DATA* merge_list(DATA* x, DATA* y,Compare comp) { DATA z, *p; p = &z; /* xとyをマージしてzを作り上げる */ /* 分割されている2つのリストのいずれか一方が空になるまで繰り返す */ while( x != NULL && y != NULL ) { /* 2つのリストの先頭要素同士を比較する */ if( comp(x->sum , y->sum) ) { /* リストxの方の先頭要素を、マージ後のリストに連結する */ p->next = x; p = x; x = x->next; } else { /* リストyの方の先頭要素を、マージ後のリストに連結する */ p->next = y; p = y; y = y->next; } } /* 先に片方のリストが空になるので、残された方のリストの要素を、マージ後リストに連結する */ if( x == NULL ) { p->next = y; } else { p->next = x; } return z.next; } int AscendinOrder(int a,int b) { return a>=b? 1:0; } int DescendingOrder(int a,int b) { return a <= b?1:0; } data.txtの中身 jon 90 30 sum 40 50 jack 20 100 tom 35 70
[この投稿を含むスレッドを表示] [この投稿を削除]
[1599] Re:自己参照構造体のソートの方法がわかりません
投稿者:バッファロー
2010/07/01 07:40:14

>>線形リストをつくったのですが、リストに値をセットした後連結リストをソートしたい >>のですが、わかりません。どなたか教えてください。 > >だったらマージソート…と思ったのですが774RRさんに先に書かれてしまったので、 >本題からずれますが、 > >> DATA *top = malloc(sizeof(DATA)); > >最初にいきなりダミーのノードを作っていて、そのために以後、 >ループをまわすとき、p->nextを終了判定に使うことになっています。 >add()関数が微妙に楽になる以外、ここにダミーノードを置くことは >あまりメリットがないんじゃないかなあ、と私は昔から思っているのですが >(センス・オブ・プログラミングに書いたりもしましたが)どうなんでしょうねえ。 > >あとまあ、ものすごく細かいことですが、 > >>int SUM(DATA *data) >>{ >> return data->language+data->language; >>} > >ここはdata->math + data->languageですよね。 > >また、連結リストのソートは、効率を気にしないのなら単純選択ソートとかでも >できるんじゃないでしょうか。 > >・連結リストを頭からスキャンして、最大値のノードを探す。 >・最大値のノードをリストから引っぺがし、ソート済みリストの先頭につなぐ。 >・上記操作を繰り返す。 > 貴重なご意見ありがとうございました。 たしかにdata->math + data->languageでした。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1598] Re:自己参照構造体のソートの方法がわかりません
投稿者:バッファロー
2010/07/01 07:11:18

>線形リストのソートは結構めんどくさいので、できればやらずにすむのが理想。 >最初からデータをソート済みの形で保持する構造を使うほうがよい結果が出ることが多い。 >二分木構造とかを使うのが普通(実用上、赤黒木になるかな) > >でもどうしても線形リストをそのままソートしたいのであれば、 >まさにそのような目的のために考案された「マージソート」を使うといい。 >http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%BC%E3%82%B8%E3%82%BD%E3%83%BC%E3%83%88 >http://www.geocities.jp/ky_webid/algorithm/021.html > 貴重なご意見ありがとうございました。 無事ソートできました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1597] Re:自己参照構造体のソートの方法がわかりません
投稿者:(ぱ)こと管理人
2010/07/01 01:53:45

>線形リストをつくったのですが、リストに値をセットした後連結リストをソートしたい >のですが、わかりません。どなたか教えてください。 だったらマージソート…と思ったのですが774RRさんに先に書かれてしまったので、 本題からずれますが、 > DATA *top = malloc(sizeof(DATA)); 最初にいきなりダミーのノードを作っていて、そのために以後、 ループをまわすとき、p->nextを終了判定に使うことになっています。 add()関数が微妙に楽になる以外、ここにダミーノードを置くことは あまりメリットがないんじゃないかなあ、と私は昔から思っているのですが (センス・オブ・プログラミングに書いたりもしましたが)どうなんでしょうねえ。 あとまあ、ものすごく細かいことですが、 >int SUM(DATA *data) >{ > return data->language+data->language; >} ここはdata->math + data->languageですよね。 また、連結リストのソートは、効率を気にしないのなら単純選択ソートとかでも できるんじゃないでしょうか。 ・連結リストを頭からスキャンして、最大値のノードを探す。 ・最大値のノードをリストから引っぺがし、ソート済みリストの先頭につなぐ。 ・上記操作を繰り返す。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1596] Re:自己参照構造体のソートの方法がわかりません
投稿者:774RR
2010/06/30 21:41:22

線形リストのソートは結構めんどくさいので、できればやらずにすむのが理想。 最初からデータをソート済みの形で保持する構造を使うほうがよい結果が出ることが多い。 二分木構造とかを使うのが普通(実用上、赤黒木になるかな) でもどうしても線形リストをそのままソートしたいのであれば、 まさにそのような目的のために考案された「マージソート」を使うといい。 http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%BC%E3%82%B8%E3%82%BD%E3%83%BC%E3%83%88 http://www.geocities.jp/ky_webid/algorithm/021.html
[この投稿を含むスレッドを表示] [この投稿を削除]
[1595] 自己参照構造体のソートの方法がわかりません
投稿者:バッファロー
2010/06/30 11:27:14

線形リストをつくったのですが、リストに値をセットした後連結リストをソートしたい のですが、わかりません。どなたか教えてください。 ソース(free用関数は後で作ります。): #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct DATA DATA; struct DATA { DATA * next; char * name; int math; int language; int sum; }; #define MAX 256 void listSort(DATA *top); DATA* newnode(){ DATA *p; p=malloc(sizeof(DATA)); p->next=NULL; return p; } int SUM(DATA *data) { return data->language+data->language; } void add(DATA *p,char *c,int lang,int math){ while(p->next != NULL){ p= p->next; } p->math = math; p->language = lang; p->sum = SUM(p); p->name=malloc(strlen(c)+1); strcpy(p->name,c); p->next=newnode(); } void ShowData(DATA *data) { FILE *fp = fopen("result.txt","w"); DATA *temp; for(temp = data; temp->next;temp= temp->next){ printf("name : %s, language : %d, math : %d, sum :%d \n",temp->name,temp->language,temp->math,temp->sum); } for(temp = data; temp->next;temp= temp->next){ fprintf(fp,"name : %s, language : %d, math : %d, sum :%d \n",temp->name,temp->language,temp->math,temp->sum); } fclose(fp); } int main() { char data[MAX] = {'\0'}; char ctemp[100] = {'\0'}; int m,l; FILE *fp = fopen("data.txt","r"); char *n; DATA *top = malloc(sizeof(DATA)); top->next = NULL; while(fgets(data,MAX,fp)){ if(n = strchr(data,'\n')) *n = '\0'; sscanf(data,"%s%d%d",ctemp,&m,&l); add(top,ctemp,l,m); } listSort(top); ShowData(top); return 0; } void listSort(DATA *top) { //ここのしょりがわかりません //ちなみにsumで比較 }
[この投稿を含むスレッドを表示] [この投稿を削除]
[1593] Re:spam判定テスト
投稿者:(ぱ)こと管理人
2010/06/13 13:45:23

すみません、ものすごく初歩的なバグがあって本来弾けるはずのspamが来ていました。 修正しました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1592] Re:spam判定テスト
投稿者:(ぱ)こと管理人
2010/06/13 06:19:31

>一時的にテスト用のスクリプトを上げます。 NGワード機能を搭載し、ひととおりの動作テストをしました。 ここで高級バッグの話をしたりするとひっかかるかもしれません。 spammer以外の人には申し訳ないですがご了承ください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1591] spam判定テスト
投稿者:(ぱ)こと管理人
2010/06/13 05:58:08

一時的にテスト用のスクリプトを上げます。 しばらくは投稿がエラーになる可能性があります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1577] Re:IF文の判定について
投稿者:通行人B
2010/06/11 17:34:13

管理人さま >どちらについても保証されています。 根拠まで示していただき、ありがとうございました。m(_ _)m 774RRさま、yuyaさま >一方で #define TRUE 1 とかしていることが多いので >func()==TRUE はバグの元だからやらないほうがいいよ 取り急ぎ、アドバイスにお礼申し上げます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1575] Re:業務連絡:ほげほげ認証をほげぴよ認証に変更しました
投稿者:こくぼ
2010/06/11 09:30:04

>IPアドレスがだめで、かつ、人力でやっているのなら、NGワードのような >「spamでない投稿をspam扱いしかねない」手段しかないんですかねえ。 特定のURLが含まれていたらspam扱いする、としたらちょっとはマシになるかも…?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1573] Re:業務連絡:ほげほげ認証をほげぴよ認証に変更しました
投稿者:(ぱ)こと管理人
2010/06/11 03:07:48

>spamがあまりにひどいので、「ほげほげ認証」のキーワードを「ほげほげ」から >「ほげぴよ」に変更しました。投稿時にはご注意ください。 spam、来ましたねえ…… とほほ。 人力でやっているんでしょうか。やっぱり。 IPアドレスがだめで、かつ、人力でやっているのなら、NGワードのような 「spamでない投稿をspam扱いしかねない」手段しかないんですかねえ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1572] Re:IF文の判定について
投稿者:yuya
2010/06/10 14:21:06

>ほげぴよ認証のテストを兼ねて ># ってか既に spam ってるんだけど > >C では、偽は0、真は0以外である。 >一方で #define TRUE 1 とかしていることが多いので > >func()==TRUE はバグの元だからやらないほうがいいよ 賛成。 関数が正常終了したら0を返す慣習って、けっこう頭が混乱しますよね。 「この戻り値は、『何かヘンなことが起こりましたか?』という質問に対する答えだ!」と 自分に言い聞かせて納得するようにしてました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1571] Re:IF文の判定について
投稿者:774RR
2010/06/10 13:24:01

ほげぴよ認証のテストを兼ねて # ってか既に spam ってるんだけど C では、偽は0、真は0以外である。 一方で #define TRUE 1 とかしていることが多いので func()==TRUE はバグの元だからやらないほうがいいよ
[この投稿を含むスレッドを表示] [この投稿を削除]
[1569] 業務連絡:ほげほげ認証をほげぴよ認証に変更しました
投稿者:(ぱ)こと管理人
2010/06/10 00:52:01

spamがあまりにひどいので、「ほげほげ認証」のキーワードを「ほげほげ」から 「ほげぴよ」に変更しました。投稿時にはご注意ください。 spammerが機械的に投稿しているのなら効果があるのかも、と思っています。 IPアドレスによる制限も考えたのですが、結構ばらけているみたいで……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1568] Re:IF文の判定について
投稿者:(ぱ)こと管理人
2010/06/10 00:46:38

>if((func_hoge() == 真) && (func_piyo() == 真)) // (1) > 実行文; > >if(func_hoge() == 真) > if(func_piyo() == 真) // (2) > 実行文; > >上記(1)または(2)において、func_hoge()が偽であった場合、 >func_piyo が実行されないことは文法上保証されるのでしょうか? どちらについても保証されています。 (1)は短絡演算子というやつで、JIS X 3010:2003 (ISO/IEC 9899:1999)であれば 6.1.13に以下の記述があります。 | ビット単位の2項&演算子と異なり,&&演算子は左から右への評価を保証する。 | 第1 オペランドの評価の直後を副作用完了点とする。第1オペランドの値が0と | 比較して等しい場合,第2オペランドは評価しない。 「||」も同様です(6.5.14 論理OR演算子より) | ビット単位の|演算子と異なり,||演算子は左から右への評価を保証する。 | 第1オペランドの評価の直後を副作用完了点とする。第1オペランドの値が0と | 比較して等しくない場合,第2 オペランドは評価しない。 (2)はさすがにif文の動作として自明ではないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1567] IF文の判定について
投稿者:通行人B
2010/06/09 10:51:43

初めまして。お邪魔します。 C言語の文法?について質問させて下さい。 if((func_hoge() == 真) && (func_piyo() == 真)) // (1) 実行文; if(func_hoge() == 真) if(func_piyo() == 真) // (2) 実行文; 上記(1)または(2)において、func_hoge()が偽であった場合、 func_piyo が実行されないことは文法上保証されるのでしょうか? ご教示をお願い致します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1562] Re:C++って使われていますか?
投稿者:(ぱ)こと管理人
2010/06/08 00:31:16

>「使われているそうです」や、「ごくたまにC++を使う機会もあります」 >という表現から考えると、主流ではないようですね。 前回、「.NETってどこで使われているんですか?」と言われた、という話を 出したように、会社や業界により使われている言語はかなりまちまちです。 もちろんそれは私にしても同じですので、私自身が仕事で使う言語の 範囲から「主流ではない」という結論を導かれても困ります。 業界全体でのトレンドを見たければ、たとえば以下のようなページはどうでしょうか。 http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html 現時点で、Java, Cに続いて3位です。昔に比べても伸びているようにも見えます。 http://d.hatena.ne.jp/takoratta/20080430/1209512678 前回リンクしたLinusの投稿にしても、「GitってなんでいまどきC++じゃないの?」 という投稿に対する反論ですから、元発言者にしてみれば、「いまどき C++があたりまえ」という感覚だったわけでしょう。 Linuxはさておき、たとえばOpenOfficeのソースはC++ですよね。 もちろん、Hiropyonさんが以下のように思われるのであれば、 >どうもプログラムオタクがひとりよがりで作った言語のような感じがします。 それはそれでひとつの見識ですし(同意する人も多いはず)、根拠を挙げた上で 主張されれば面白い話になるように思います。 >C++を使う場合というのは、今回のソフトウェア開発はC++でいこう! >とか、仕様で決められて、それでコーディングするのでしょうか? どうでしょうか。Windowsでネイティブアプリを作りたいとか、環境によって 決められてしまうことが多いように思いますが。 組み込みとかでリソースが少なくて、JavaやC#は到底使えないけれど、 Cじゃあんまりだよね、とか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1561] Re:C++って使われていますか?
投稿者:Hiropyon
2010/06/07 18:31:46

管理人様、忙しい中ご回答頂きありがとうございます。 「使われているそうです」や、「ごくたまにC++を使う機会もあります」 という表現から考えると、主流ではないようですね。 C++を使う場合というのは、今回のソフトウェア開発はC++でいこう! とか、仕様で決められて、それでコーディングするのでしょうか? >Hiropyonさん、はじめまして。 > >>単純に思うのですが、実際の現場でC++は使われているのでしょうか? > >これについては774RRさんから回答がついていますが、場所によっては >使われているそうです。私自身も、7~8年くらい前には仕事で使っていました。 >最近は.NETがメインなのですが、ごくたまにC++を使う機会もあります。 > >つい最近、某JavaのMLで、「.NETってどこで使われているんですか?」という話題が出て >「この5年くらいC#ばっかりですが何か?」というようなレスを返したのを >思い出しました…… > >>現にLinuxのプログラムやカーネルソース等もC言語で記述されていて >>だれもC++を使っていないようです。 > >Linuxに関して言えば、Linusさんがこういう人だという理由もあるんでしょう。 > >http://tabesugi.net/memo/2009/1a.html#152154
[この投稿を含むスレッドを表示] [この投稿を削除]
[1555] Re:C++って使われていますか?
投稿者:(ぱ)こと管理人
2010/06/06 21:55:36

Hiropyonさん、はじめまして。 >単純に思うのですが、実際の現場でC++は使われているのでしょうか? これについては774RRさんから回答がついていますが、場所によっては 使われているそうです。私自身も、7~8年くらい前には仕事で使っていました。 最近は.NETがメインなのですが、ごくたまにC++を使う機会もあります。 つい最近、某JavaのMLで、「.NETってどこで使われているんですか?」という話題が出て 「この5年くらいC#ばっかりですが何か?」というようなレスを返したのを 思い出しました…… >現にLinuxのプログラムやカーネルソース等もC言語で記述されていて >だれもC++を使っていないようです。 Linuxに関して言えば、Linusさんがこういう人だという理由もあるんでしょう。 http://tabesugi.net/memo/2009/1a.html#152154
[この投稿を含むスレッドを表示] [この投稿を削除]
[1554] Re:各モジュールについて
投稿者:(ぱ)こと管理人
2010/06/06 21:49:46

HiroakiSoftwareさん、はじめまして。 >メモリ管理モジュール(MEM) >デバッグライト用モジュール(DBG) > >についてなのですが、オリジナルの言語で使用して >作った言語を配布しても問題ないでしょうか? >また、使用にあたって条件等はありますでしょうか? まったく問題ありません。単純なモジュールですが、あんなものでよろしければ いくらでもご利用ください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1553] 各モジュールについて
投稿者:HiroakiSoftware
2010/06/06 21:09:39

前橋様 はじめまして、HiroakiSoftware(※個人のハンドルネームです)と申します。 メモリ管理モジュール(MEM) デバッグライト用モジュール(DBG) についてなのですが、オリジナルの言語で使用して 作った言語を配布しても問題ないでしょうか? また、使用にあたって条件等はありますでしょうか? これは著作権侵害等のトラブルを防止するために、 確認の意味で本投稿(質問)をさせていただきました。よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1552] Re:C++って使われていますか?
投稿者:774RR
2010/06/06 07:25:03

Windows の MFC や ATL は C++ Ruby on Rails の passenger は C++ ウチではワンチップマイコンの組み込みにも使っている。 自分の狭い視野だけで判断してない?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1551] C++って使われていますか?
投稿者:Hiropyon
2010/06/06 00:21:19

前橋 様、このサイトのオブジェクト指向の意見について読ませていただきました。 単純に思うのですが、実際の現場でC++は使われているのでしょうか? どうもプログラムオタクがひとりよがりで作った言語のような感じがします。 現にLinuxのプログラムやカーネルソース等もC言語で記述されていて だれもC++を使っていないようです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1550] 管理者により削除されました
2010/06/06 17:17:20

[この投稿を含むスレッドを表示]
[1549] 管理者により削除されました
2010/06/06 17:17:13

[この投稿を含むスレッドを表示]
[1548] 管理者により削除されました
2010/06/06 17:17:05

[この投稿を含むスレッドを表示]
[1547] 管理者により削除されました
2010/06/06 17:16:38

[この投稿を含むスレッドを表示]
[1546] 管理者により削除されました
2010/06/06 17:15:11

[この投稿を含むスレッドを表示]
[1545] 管理者により削除されました
2010/06/06 17:14:52

[この投稿を含むスレッドを表示]
[1544] 管理者により削除されました
2010/06/06 17:14:41

[この投稿を含むスレッドを表示]
[1543] 管理者により削除されました
2010/06/04 02:53:40

[この投稿を含むスレッドを表示]
[1542] 管理者により削除されました
2010/06/04 02:53:31

[この投稿を含むスレッドを表示]
[1541] 管理者により削除されました
2010/06/04 02:53:22

[この投稿を含むスレッドを表示]
[1540] 管理者により削除されました
2010/06/04 02:53:13

[この投稿を含むスレッドを表示]
[1539] 管理者により削除されました
2010/06/04 02:52:59

[この投稿を含むスレッドを表示]
[1538] 管理者により削除されました
2010/06/04 02:52:46

[この投稿を含むスレッドを表示]
[1537] 管理者により削除されました
2010/06/04 02:52:26

[この投稿を含むスレッドを表示]
[1536] 管理者により削除されました
2010/06/02 03:58:07

spamの履歴、しばし保存しておこう。
[この投稿を含むスレッドを表示]
[1535] 管理者により削除されました
2010/06/01 02:10:16

アクセスログを見ると、どうもいきなり投稿画面に行くのではなく、一度一覧を見ているっぽい(なのでリファラでは弾けない)。しかも一覧画面でしばらく(15秒くらい)滞留している。なんだろこれ。
[この投稿を含むスレッドを表示]
[1533] 管理者により削除されました
2010/06/01 02:06:56

最近テスト掲示板だけでなくこちらの掲示板にもかなりspamが来るようになって、いい加減うざいので対策を検討中。 ちょっと見てみるとIPアドレスは中国っぽいのでそれで弾きますかねえ。
[この投稿を含むスレッドを表示]
[1532] Re:ホームページのリンクについて
投稿者:管理人
2010/05/09 17:07:12

>さて、本題ですが、 >C言語ヨタ話 >その3「モジュールと命名とヘッダファイルと」のページのリンクが死んでいるようです。 報告ありがとうございます。どうもHTMLがPHPとして解釈されているようです。 今は出先なのですが、早めに対処いたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1530] ホームページのリンクについて
投稿者:ぬるぽの使い
2010/05/07 10:52:51

こんにちは。 オブジェクト指向再入門のページを見ました。とてもわかりやすかったです。 さて、本題ですが、 C言語ヨタ話 その3「モジュールと命名とヘッダファイルと」のページのリンクが死んでいるようです。 では。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1529] Re:質問
投稿者:(ぱ)こと管理人
2010/05/03 23:08:32

>過去に投稿をされている 山 さん >のプログラムのソースコードは、 >どこで手に入るのですか? 山さんは私個人宛でソースを送ってくださいましたが、一般公開しているかどうかは私は知りません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1528] 質問
投稿者:test
2010/05/02 19:59:11

過去に投稿をされている 山 さん のプログラムのソースコードは、 どこで手に入るのですか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1522] Re:PHPとMySQLで掲示板を作る
投稿者:HN
2010/04/22 22:14:21

>>PHPとMySQLで掲示板を作るの掲示板のプログラムを圧縮して配布していただけませんか? >>あと、パーミッションの設定も教えていただけませんか? > >そういう要望があり得るとは当初より思っていましたが、そのつもりはありません。 >あのページではあくまで作り方の解説をしているだけであり、掲示板のプログラム >そのものをリリースしようとは考えていないためです。 >すぐにインストールできるようなパッケージとして配布すると、インストールできない >等の質問が来る可能性がありますし、そのサポートをする気もないからです。 >プログラムの作り方に関する質問やクレームであれば受け付けます。そういう情報を >共有することは価値があると思えるからです。 > >あしからずご了承ください。 > >あとまあ正直なところ、あのプログラムはPHP4として書いたものですし(5でも >動いてますが)、記事中で言い訳してますがサニタイズ言うなポリシー的にも >よろしくないものですので。 > そうでしたか。 わかりました。 わざわざ返答していただきありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1521] Re:PHPとMySQLで掲示板を作る
投稿者:(ぱ)こと管理人
2010/03/26 02:28:55

>PHPとMySQLで掲示板を作るの掲示板のプログラムを圧縮して配布していただけませんか? >あと、パーミッションの設定も教えていただけませんか? そういう要望があり得るとは当初より思っていましたが、そのつもりはありません。 あのページではあくまで作り方の解説をしているだけであり、掲示板のプログラム そのものをリリースしようとは考えていないためです。 すぐにインストールできるようなパッケージとして配布すると、インストールできない 等の質問が来る可能性がありますし、そのサポートをする気もないからです。 プログラムの作り方に関する質問やクレームであれば受け付けます。そういう情報を 共有することは価値があると思えるからです。 あしからずご了承ください。 あとまあ正直なところ、あのプログラムはPHP4として書いたものですし(5でも 動いてますが)、記事中で言い訳してますがサニタイズ言うなポリシー的にも よろしくないものですので。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1519] Re:疑り深いあなたのためのオブジェクト指向再入門
投稿者:(ぱ)こと管理人
2010/03/16 02:08:48

>C言語出身の私としては「オブジェクト指向」で言うところのウリ(カプセル化や再利用性など)が、C言語でやってきたこととどこが違うのか!と反発することが理解できない原因だと思ってきましたが、このサイトでは「反発して当然」のように書かれており、かつ説明が非常に具体的でよく理解できました。 ありがとうございます。 >「オブジェクト指向も裏を返せばただの・・・」と思えただけで今後は前回と違った理解ができそうな気がしています。 >再チャレンジするきっかけを与えて頂いてありまとうございました。 孫悟空さんは再チャレンジ中ですので誤解はないと思うのですけれど、 一応補足しますと、私はオブジェクト指向について「役に立たない」とか 「くだらない」と思っているわけではありません。 # 仕事では、あまり使わないケースはあるかもしれないと思っていますが。 http://d.hatena.ne.jp/kmaebashi/20090427/p1 (継承の乱用とかしないで)ちゃんと使えば強力な概念だと思いますので 再チャレンジが成功することをお祈りしております。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1518] Re:lexicalanalyzer.c について
投稿者:(ぱ)こと管理人
2010/03/16 00:48:08

>「入力が char_buf のサイズ(1024)を超えていて fgets がナル文字を付けた場合」 >を想定しておりましたです。 「1024文字もあるんだから普通はオーバーしません!」 とか言い切ってしまうとそれはそれで問題ありかとは思うのですが。 実際、こういう意見↓もあるのですが、 http://www.kijineko.co.jp/tech/superstitions/gets-can-be-replaced-with-fgets-simply.html この程度の用途のプログラムでどこまで想定するかは難しいところだと思います。 私の場合、たとえばポインタ完全制覇のp.79でも 「自分で使う程度のプログラムだったらまず大丈夫でしょう」 とかいって逃げてしまっています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1517] 疑り深いあなたのためのオブジェクト指向再入門
投稿者:悟空
2010/03/15 18:04:23

こんにちは。 かなり以前にオブジェクト指向に挫折したものです。 私の「オブジェクト指向」への反発は、このサイトに書かれている事、一つ一つに該当し全文を読み終えてしまいました。 目からうろこです!大変感謝しております!! C言語出身の私としては「オブジェクト指向」で言うところのウリ(カプセル化や再利用性など)が、C言語でやってきたこととどこが違うのか!と反発することが理解できない原因だと思ってきましたが、このサイトでは「反発して当然」のように書かれており、かつ説明が非常に具体的でよく理解できました。 「オブジェクト指向も裏を返せばただの・・・」と思えただけで今後は前回と違った理解ができそうな気がしています。 再チャレンジするきっかけを与えて頂いてありまとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1516] Re:lexicalanalyzer.c について
投稿者:yuya
2010/03/15 05:27:03

さっそく正誤表で対応して頂き、ありがとうございます。 >改行なしの行を食わせるためにはファイルからリダイレクト等しなければならないので うぐぅ、私は単純に 「入力が char_buf のサイズ(1024)を超えていて fgets がナル文字を付けた場合」 を想定しておりましたです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1515] Re:lexicalanalyzer.c について
投稿者:yuya
2010/03/14 22:22:06

ああそうか、レクサの問題というより、 テストドライバをそんなに厳密に書いていないというだけの話ですね。 ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1514] Re:lexicalanalyzer.c について
投稿者:(ぱ)こと管理人
2010/03/14 21:49:17

>となっています。'\0'に出会ったら BAD_TOKEN として処理するという意図だと思いますが、 >現状だと'\0'が現れた時点でwhileを抜けてしまうので、 >st_line_pos がインクリメントされないまま再び get_token() が呼ばれてしまい、 >実行時に無限ループに陥ります。 BAD_TOKENが返ってきているのにまたget_token()を呼ぶほうが変なんじゃ、と 思って本に掲載されているソースのテストドライバを確認したのですが、 END_OF_LINE_TOKENのチェックはしていてもBAD_TOKENのチェックをしていないので、 たとえば改行で終わらないファイルをリダイレクトで食わせたときに、 確かに無限ループになりますね。 電卓のパーサと組み合わせる限りではそんなにおかしなことにはならないような 気もします。 バグかというと微妙ではないかと思いますが、補足を入れておきます。 ># ただいま「プログラミング言語を作る」を骨の髄までしゃぶる勢いで読んでます。 ># 面白すぎて睡眠不足(笑)。 ありがとうございます。また何かあればご指摘ください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1513] lexicalanalyzer.c について
投稿者:yuya
2010/03/13 09:10:00

「プログラミング言語を作る」p.59の、 lexicalanalyzer.c の23~24行からの構造を見ると、 token->kind = BAD_TOKEN; while(st_line[st_line_pos] != '\0'){ /* メインの処理 */ } となっています。'\0'に出会ったら BAD_TOKEN として処理するという意図だと思いますが、 現状だと'\0'が現れた時点でwhileを抜けてしまうので、 st_line_pos がインクリメントされないまま再び get_token() が呼ばれてしまい、 実行時に無限ループに陥ります。 一度ご確認ください。 # ただいま「プログラミング言語を作る」を骨の髄までしゃぶる勢いで読んでます。 # 面白すぎて睡眠不足(笑)。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1512] Re:「1回以上の繰り返し」の定義
投稿者:yuya
2010/03/10 14:48:02

ご回答ありがとうございます。 >-が降ってきた時点でそれまでの分をreduceしないと左結合にならないわけですが、 >現状、ここでshift/reduce conflictが起きており、shiftが優先されるため >結合規則が逆順になっています。 なるほどー、よく分かりました。もし右結合を明示したければ expression /* 「式」とは… */ : primary_expression /* 「一次式」、 */ | primary_expression ADD expression /* または、「一次式」 + 「式」 */ と書くべきなわけですね。 そもそも件名に「『一回以上の繰り返し』の定義」なんて書いちゃいましたが、 ただ単にそう定義するだけならレクサのレベルの話であって、 階層的な解析木を築くための構文規則を定めるのがパーサの役割だから、 結合規則によって規則の書き方が変わって当然なのですね。 結果的には誤植(?)がきっかけで非常に勉強になりました。引き続き読み進めていきます。
[この投稿を含むスレッドを表示] [この投稿を削除]