K.Maebashi's BBS

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

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

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

[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ファイルが普通なので、書籍化する際に分離したのですが、 この部分について修正が漏れておりました。 よってこの部分は、「このメソッドはサンプル掲示板では使用していません」に 読み替えてください。 正誤表に載せておきます。
[この投稿を含むスレッドを表示] [この投稿を削除]