K.Maebashi's BBS

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

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


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


[2256] Re:C言語体当り学習 filter.cプログラム
返信


投稿者:Hiroyuki Naito
2021/06/27 09:08:27

Link:
ご回答ありがとうございました。

今まで^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

Link:
>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

Link:
首記のプログラムをダウンロードして、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

Link:
ご回答ありがとうございました。

ポインタ演算*(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

Link:
はじめまして。読んでいただきありがとうございます。

>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

Link:
本文p75の「*pがループの中に何度出現しても掛け算と足し算はループの終わりの1回だけで済む」で、引っかかっています。

array[i]は、ループ中に出現するたびごとに「array + (i * 1要素のサイズ)」に相当するアドレス計算を行うというのは理解できますが、*pでも「p + (p++ごとに1要素のサイズ)」に相当するアドレス計算を行っているように思えます。「掛け算と足し算はループの終わりの1回だけ」という意味をご教示いただけるとありがたいです。

よろしくお願いいたします。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2250] Re:テトリス風ゲームについて
返信


投稿者:(ぱ)こと管理人
2021/05/10 23:03:04

Link:
はじめまして。反応が遅れましてすみません。

>http://kmaebashi.com/programmer/tetris/index.html
>こちらのプログラムは、改造して配布しても良い物でしょうか?

そういえばライセンス表記をしていなかったですが、以下のページの説明に
準じるということにします。ご自由にコピーしてください。
(なにしろテトリスなので、「名前を変える」必要もないと思います)

http://kmaebashi.com/programmer/devlang/license.html

よろしくお願いいたします。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2249] テトリス風ゲームについて
返信


投稿者:SINch
2021/05/07 22:08:21

Link:
はじめまして

http://kmaebashi.com/programmer/tetris/index.html
こちらのプログラムは、改造して配布しても良い物でしょうか?
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2248] Re:オンラインブックについて
返信


投稿者:bigen
2021/03/12 10:18:26

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

ありがとうございます。

確かに本を書くというのは当初想像していたよりずっと大変で、改めて書籍を執筆される方の偉大さを身に沁みて理解いたしました・・・。

一方で、先人たちのこういった情報発信によって今の自分がありますので、これにめげず今後も情報発信を続けていこうと思います。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2247] Re:オンラインブックについて
返信


投稿者:(ぱ)こと管理人
2021/03/10 01:00:21

Link:
おひさしぶりです。

>先日ご連絡したオンラインブックがいったんの完結ということになりました。
>初めての書籍ということで書籍全体としてのバランスや文章、締めくくり方など拙い部分ばかりで恐縮ですが、ご報告させていただきます。

https://zenn.dev/bigen1925/books/introduction-to-web-application-with-python

お疲れさまでした。これだけの量を書くのは大変だったと思います。

私も後ほどちょこちょこ読んでみます。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2246] オンラインブックについて
返信


投稿者:bigen
2021/03/07 18:14:34

Link:
前橋先生

ご無沙汰しております。

先日ご連絡したオンラインブックがいったんの完結ということになりました。
初めての書籍ということで書籍全体としてのバランスや文章、締めくくり方など拙い部分ばかりで恐縮ですが、ご報告させていただきます。
https://zenn.dev/bigen1925/books/introduction-to-web-application-with-python

改めてきっかけを与えていただいた前橋先生に感謝を申し上げます。


前橋先生の書籍のおかげでエンジニアとして一つの壁を超えられたという感覚もあり、僕自身がプログラミングを楽しめるようになりました。
また、心のどこかで先人から教えてもらうばかりでなく、どこかで自分からも情報発信をしなければならないという気持ちもあったため、こうして今回オンラインブックという一つの形にできたことを嬉しく思います。

繰り返しにはなりますが、改めて感謝とお礼を申し上げさせていただくとともに、前橋先生の今後のご健勝をお祈りいたします。 
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2245] Re:オンラインブック執筆について
返信


投稿者:bigen
2020/10/25 07:22:59

Link:bigen1925<at>gmail.com
お返事ありがとうございます。

>導入部分を拝読しました。
>
>Webアプリケーションの挙動を理解するためにWebサーバを作るというのは
>私の独創でもないですし、まったく問題ないと思います。

ありがとうございます!
あまり早くないペースでの更新になると思いますが、執筆を進めさせていただきます。


>言語も違うとのことなので、私も読んでみたいです。楽しみにしております。

温かいお言葉ありがとうございます。
とても励みになります。

オンラインブックとはいえ、一冊の書籍のようなまとまった文章を公開するのは初めての経験ですので、拙い言葉にはなるとは思いますが精一杯取り組ませていただきます。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2244] Re:オンラインブック執筆について
返信


投稿者:(ぱ)こと管理人
2020/10/24 14:44:21

Link:
はじめまして。

>内容として先生の書籍と似通う部分も多くなりますので、先生にご許諾をいただけた
>場合のみ続編を執筆しようと思っております。
>お手数ではありますが、もしお時間が許すようでしたら、是非ご確認とお返事を
>いただけると幸いです。

導入部分を拝読しました。

Webアプリケーションの挙動を理解するためにWebサーバを作るというのは
私の独創でもないですし、まったく問題ないと思います。

言語も違うとのことなので、私も読んでみたいです。楽しみにしております。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2243] Re:P.17:終了のマークとして0を送付について
返信


投稿者:くまきち
2020/10/21 23:14:26

Link:
ありがとうございます。
とりあえず、HTTP1.0については理解することができました!
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2242] オンラインブック執筆について
返信


投稿者:bigen
2020/10/21 18:31:49

Link:bigen1925<at>gmail.com
はじめまして。

昨年、前橋先生の書籍
- 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

Link:
>大分時間が経ってしまいましたが、回答は理解できました。

おひさしぶりです。反応が遅くなりましてすみません。

>一方で、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

Link:
大分時間が経ってしまいましたが、回答は理解できました。
ありがとうございました。

一方で、Server側をApacheに置き換えたとき、Clientからの送信終了を表す”0”は不要になっています(P.27)。Apacheは何をもってClientがリクエストを送り終えたことを判断しているのでしょうか?
良ければ教えてください。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2239] Re:eclipseでHenacatを作成したい
返信


投稿者:こー
2020/08/18 11:06:21

Link:
解決しました。
ご教授いただきありがとうございました。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2238] Re:eclipseでHenacatを作成したい
返信


投稿者:(ぱ)こと管理人
2020/08/18 00:58:03

Link:
>※ここが原因かもしれません。
>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

Link:
ご回答いただきありがとうございます。

> 崚方が独自につけたアプリケーション名」を含む、クラスファイルを置いた
> 正確な場所
>
>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

Link:
>いいえ、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

Link:
ご回答いただきありがとうございます。

>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

Link:
はじめまして。ご質問ありがとうございます。

>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

Link:
書籍『基礎からの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

Link:
書いている間に他の方から投稿がありました。ありがとうございます。

>これが、(持っていないのでわからないが)あなたの持っている版で
>int hoge[5][3];
>となっていれば、説明としてはインデックスに問題ある(j==3の方)と思います。

正誤表にある限り(ミスが多くて申し訳ありません)、ここを直した形跡はないですし、
オリジナルのLaTeX原稿(笑)を見ても

\begin{verbatim}
  int hoge[3][5];
\end{verbatim}

となっているので、ことここについては、誤植はないと思います。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2231] Re:間違い?
返信


投稿者:(ぱ)こと管理人
2020/04/09 00:11:08

Link:
はじめまして。

>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

Link:
>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

Link:null
174ページ多次元配列の欄ですが配列が[5][3]ではじまって、175ページでi=2,j=3としますっていうのは整合性がとれていませんし、それによって多次元配列の説明が意味不明です。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2227] Re:ポインタ完全制覇(第2版) Fig2-10とデバッグライト
返信


投稿者:(ぱ)こと管理人
2020/02/05 23:13:49

Link:
>printf() の実装は実際のところ 2222 の debug_write() と全く同じことが多くて、
>よって printf() のクロック数と debug_write() のクロック数は全く同じで、

まず、「ポインタ完全制覇」での記載は、

#ifdef DEBUG
printf(表示したい内容);
#endif

という方法を
「こんなものをソース中に大量に埋め込んだら、読みにくくてしょうがありません。」
と書いたうえで、vfprintf()を使ったdebug_write()を紹介しています。
つまりdebug_write()の比較対象は、printf()ではなく、
#ifdefを使った完全に抹殺できるデバッグライトです。

>ついでに言うと printf() の処理中、文字化に要するクロック数と関数呼び出しクロック数では
>後者は無視できるほど小さいっす。
>さらに追加すると標準出力へ出力する際の実処理のクロック数のほうがもっと多い。
>ボトルネックでないところのクロック数を頑張って減らしても全体の速度は大差ない。

で、vfprintf()を使ったdebug_write()にて、フラグか何かを参照し、
デバッグモードでないときは即座にreturnするようにしたとしても、
関数呼び出しそのもののオーバーヘッドは消せない、というのが趣旨なので、
「関数呼び出しのオーバーヘッド」と、「文字化や出力のオーバーヘッド」を
比べているわけではありません。

ただまあ、そのうえで、関数呼び出しのボトルネックだって無視できるほど小さい、
というのは、まあそうだろうなとは思います。ことがデバッグライトだけに、
「本番では死ぬほどループする処理に、1行おきにデバッグライトを入れた」という
状況はもちろん考えられますが。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[ より古い投稿]