K.Maebashi's BBS

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

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

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

[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)自動変数の領域は、関数を抜けたら解放される。
[この投稿を含むスレッドを表示] [この投稿を削除]