K.Maebashi's BBS

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

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

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

[307] Re:書き方覚えて後から理解
投稿者:(ぱ)
2007/02/20 02:13:25

>単刀直入に言うと >「ゴチャゴチャ長ったらしい。いずれわかるものを余計にわからなくしてるんじゃないか」 繰り返し確認ですが(3回目くらいかしら)、これは、私が書いた 「疑り深いあなたのためのオブジェクト指向再入門」 http://kmaebashi.com/programmer/object/index.html に関する言及ですか? (Y/N) >で、ちょっとこう説明すればいいんじゃないかってのを書いたんで見てください >http://kill.s31.xrea.com/object.html で、こっちの説明のほうが、「疑りぶかい~」の説明よりも優れている、という 主張であると。 まあねえ、初心者向けにどんな説明がよいか、なんてことは、実際に初心者を大量に 連れてきてアンケートでもしないとわからないことなので、どっちが優れているかは 私にはなんとも言えませんが。 まあ、初心者としての感想は初心者の人に任せるとして、一応初心者ではないつもりの 私の目から、norgeさんの説明を見ると。 >結論:クラスは構造体としても使える 12~13年前のC++の入門書では、こういうふうに、クラスを構造体の拡張として 説明しているものが多かったですね。 で、getterとsetterをつけて、「ほらカプセル化できてるでしょ」とやるわけです。 が、この説明じゃ、norgeさん自身が書いているように、 >実際はこんなバカな事は誰もやらないだろうが、 と思われるだけでしょう。ていうか私がPointの例で言っているように、 setterを解放しといてカプセル化もクソもないもんだ。 おそらくnorgeさん自身そう思うからこそ、getter/setterの話より先に、 >構造体ではなくクラスを使う意味 として、 >public int attack() { > return power + weapon; //攻撃力と武器の攻撃力の和を返す >} これを出したんでしょうが… 「なぜattackすると整数値が返ってくるの?」 [258]の例: >public int run (int gas) { > return (gas * this.mileage); >} 「なぜrunすると整数値が返ってくるの?」 「オブジェクト指向的に考えてこんなメソッドはおかしい」的な議論は私自身 嫌いなわけですが、そんな私から見ても、こんな設計、仮に仕事で若いのが書いてきたら コードレビューの段階で却下します。 void attack(Enemy) ならともかく。 だいたい、attack()みたいなメソッドをCharcterに入れるのは、ポリモルフィズムを 期待するのでもない限り無意味で、「char1.power + char.weapon」をあちこちに 分散させるのが嫌なら void attack(Character, Enemy) という「関数」を作ってもいいはずだから、「 >結論:簡単に記述できるようになる にはなりませんね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[306] Re:書き方覚えて後から理解
投稿者:norge
2007/02/20 02:13:25

どうもどうも、返事がアレだけだったんでしばらく見てなかった 単刀直入に言うと 「ゴチャゴチャ長ったらしい。いずれわかるものを余計にわからなくしてるんじゃないか」 と思ったもんで で、ちょっとこう説明すればいいんじゃないかってのを書いたんで見てください http://kill.s31.xrea.com/object.html あくまで「こんな感じに説明すればいいんじゃないか」というわけなんで実際に初心者に見せるときはもうちょい細かくわかりやすく書いた方がいいと思う
[この投稿を含むスレッドを表示] [この投稿を削除]
[305] Re:「スレッド順インデックス」の表示について
投稿者:(ぱ)
2007/02/20 02:13:25

>細かいことを言えば、復活した新規投稿の投稿時刻が一律 >「2005/2/10 02:26:00」 >になってしまっているという問題が残っていますね。 言われて初めて気が付きました… 今回変更された6本の投稿について、日付が変わってしまったのは申し訳ないですが しょうがないとして(すみません)、 ・データ構造上、日付を保持するフィールドがposteddateしかないこと。 ・それがTIMESTAMP型であること。 ・よって、削除などを行った場合にも、posteddateが変更されてしまうこと。 は、仕様としてかなりどうかと思うので、いずれ修正しようと思います。 これまたご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[304] Re:「スレッド順インデックス」の表示について
投稿者:yuya
2007/02/20 02:13:25

>D/Bを復元すると共に、スクリプトも修正しました。 ありがとうございます。 細かいことを言えば、復活した新規投稿の投稿時刻が一律 「2005/2/10 02:26:00」 になってしまっているという問題が残っていますね。 日付順のソートに影響があるわけでもないし、 大きな問題ではないとは思いますが……。 ともあれ、迅速に対応していただいてありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[303] Re:「スレッド順インデックス」の表示について
投稿者:(ぱ)
2007/02/20 02:13:25

テストを兼ねて、敢えて返信ではなく新規投稿にしています。 >「スレッド順インデックス」の表示にすると、 >[292] 投稿者により削除されました >が一番上に表示され、 >それよりも後に立てられたスレッドが全く表示されなくなっていませんか? D/Bを確認したところ、この掲示板では、新規投稿はparent(親投稿のID)がNULLに ならなければならないところ、すべてゼロになっていました。 結果として、全て投稿番号0の子になっていました。 saltがらみでスクリプトを修正した際、SQLをsprintf()で組み立てるところを 直していてポカしたようです。 >各投稿を「日付順インデックス」からたどって「この投稿を含むスレッドを表示」すると、 >どれも上の[292]に属しているような扱いになっている模様です。 これは、上記D/Bの崩れにより発生した問題のようです。 D/Bを復元すると共に、スクリプトも修正しました。 ご指摘ありがとうございました。テストが不十分ですみませんでした。
[この投稿を含むスレッドを表示] [この投稿を削除]
[302] 「スレッド順インデックス」の表示について
投稿者:yuya
2007/02/20 02:13:25

はじめまして。 ご著書、特に「ポインタ完全制覇」を愛読しております。 この掲示板の動作について疑問があるのですが、 「スレッド順インデックス」の表示にすると、 [292] 投稿者により削除されました が一番上に表示され、 それよりも後に立てられたスレッドが全く表示されなくなっていませんか? 各投稿を「日付順インデックス」からたどって「この投稿を含むスレッドを表示」すると、 どれも上の[292]に属しているような扱いになっている模様です。 お時間がありましたらご確認ください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[301] (ぱ)さんへ
投稿者:hiro
2007/02/20 02:13:25

(ぱ)さんへ。 hiroです。 先ほどの件、ファイヤーウォールが接続を制限していた為に 生じたものだったようです。 解除し、無事localhostへ繋がりました。 ご協力頂いて、有難うございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[300] やはり、エラーが出てしまいます・・
投稿者:hiro
2007/02/20 02:13:25

>>ERROR 2003: Can't connect to MYSQL server on 'localhost' >>(10061) >パスを通そうとして、上記エラーが出ることはないはずです。 > >mysqlのクライアントを立ち上げようとした時にこのエラーが出るのなら >わかりますが。 > >もし、コマンドプロンプトから「mysql」とタイプして上記メッセージが出るのなら、 >MySQLのサーバが起動していないのでしょう。サービスに登録するか、 >mysqldを実行する必要があります。 > >ウェルノウンポートでないだけで、65535までのポート番号は存在しうるでしょう。 > こんにちわ。 (ぱ)さん、ありがとうございます。 パスの件、クライアントを立ち上げようと思った、の間違いでした。すみません。 OSはおっしゃる通りWindowsなのですが、テキスト通り C:\mysql\bin\mysql -u root というコマンドを入力しても、サーバーには接続されないという上記のメッセージ が表示されてしまいます。 コマンドプロンプトからユーザー名やパスワードを確認し、起動したいのですが、 どうすれば接続できるのでしょうか? ちなみにサービスは登録されており、「mysql」は管理ツールから開始できる状態です。 お手数ですが、アドバイスを宜しくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[299] Re:hash_user_password()
投稿者:(ぱ)
2007/02/20 02:13:25

>ほとんど文脈無視ですが_o_、salt として本文を使うってのはどうですかね? むにゃ。もう直しちゃいましたし (^^; saltとして本文を使うということは、D/B流出がなくてもsalt漏れまくり、 ということですから、秘密の文字列を併用しなければだめでしょうけど、 それ前提なら使える手かとは思います。 でも、複数の投稿に同じsaltが振られる可能性がそこそこありますし、 別にフィールドを増やすことは可能なので、本文を使う必然性はないですよね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[298] Re:誰か助けてください
投稿者:どぅ
2007/02/20 02:13:25

>>最近C言語を始めたのですが、この問題がどうしても解けません。誰かといてください。お願いします(>_<) > > 宿題は自分でやるべきでしょう。 初めまして、どぅと申します。 前橋さまの「C言語 ポインタ完全制覇」と「Java謎+落とし穴徹底解明」によって蒙を啓かれた者です。まだ理解できていないところもありますが、この二冊には大変お世話になっております(現在進行形)。 さて、本題ですが、宿題は自分でやるべきで、それがマキバオーさんの為だと思いますし、それゆえ(ぱ)さまは流石思いやりのある対応をされたなぁと思うのですが、残念ながら私は利己的で、マキバオーさんの為にはならないと知りながら、申し訳ないけど自分の興味の為に課題をやってしまいました。情けは人の為ならず(←ダブルミーニング!)。尤も正しい答えに到達しているかは分かりませんが。 この手の問題は、半分数学ですね。より正確に言うと、ドコまで数学で解いて、ドコからプログラムにやらせるか。これは連続的にスペクトルをなしていて、一方の端が、「全部人間様が数学を駆使して計算する」反対側の端が「全部プログラムにしてコンピュータが計算する」になってます。つまり大ざっぱにいうと、 1.全部数学で人間様がやる。 2.半分数学で人間様がやって、半分プログラムにしてコンピュータがやる。 3.全部プログラムにしてでコンピュータがやる。 の3パターンに分かれると思います。おそらく出題者は2を期待してるんじゃないかなーと思いますが、どうなんでしょ?1で解くと多分ダメなんでしょうね^^;とりあえず「おそらくこんな解が期待されてるんだろうなぁ」てな2の解を示して、その次に3の解を書いてみます。 ■パターン2 まず、n期目で残高があれば良い。そんで、n期目の残高は、nとmとb(と利率1.05)で決まりますね。つまりn期目の残高はn, m, bの関数になるので Z(n, m, b)と書けると。それが残っていると言うことは、 Z(n, m, b) > 0 となると。この不等式をbについて解けば良いわけですね。じゃあZ(n, m, b)って何なのよ? こういうのはとりあえず普通1期目、2期目、3期目、ぐらいまで具体的に求めてみると何か見えてくる可能性があります。と言うわけで、各期の残高を求めてみると。。。 1期目:1.05(b - m) = 1.05b - 1.05m 2期目:1.05(1.05b - 1.05m - m) = 1.05^2b - 1.05(2.05)m 3期目:1.05(1.05^2b - 1.05(2.05)m - m) = 1.05^3b - 1.05(1.05(2.05) + 1)m ここら辺までくると何かが見えてきますね!?つまりi期目の残高は、 1.05^ib - ???m となりそうです。???のところをよーく見ると、 ???は、前期の???に1を足して、1.05倍する となってそうです。つまり、i期の???をY(i)とすると、 Y(i+1) = 1.05(Y(i) + 1) Y(1) = 1.05 と言えそうです。これ、漸化式ってやつだけど、どうやら解くのは面倒そうですね。。 #根性入れれば解けるので、そうすれば「1」のパターンになる!! とりあえず、Y(i)はそのまま(1から順番にやれば求まりそうだし)とすると、i期における残高は、 X(i)b - Y(i)m ただし、X(i) ,Y(i)は次の通り、 X(i) = 1.05^i Y(i)は、次の漸化式を満たす Y(i+1) = 1.05(Y(i) + 1) Y(1) = 1.05 で表されます。これがn期で残っていると言うことは、 X(n)b - Y(n)m > 0 と言うことになりますので、bについて解くと(X(n) > 0に注意して) b > Y(n)m / X(n) となります。Y(n)は漸化式にしたがって1から順番に計算していけば求まりますが、めんどいなぁ。誰かやってくれないかなぁ。。。人間様が考えるのはここまで。あとはコンピュータにやってもらいまひょ。ついでにX(n) = 1.05^nも計算してもらいます。 で、プログラムは次の通り。解に自信がなかったので、求まったbの値で本当に良いのか、各期残高を順に表示して検算もしてます。求まるbはぎりぎりの値なので、n年目には残高が0円になってしまいますが、bはそれより大きければ良いということで。。。 ちなみに、銀行でどの有効桁数で情報を持っているのか、つまり0.1銭とかにも利子が付くのか!?は気にしてません。doubleの有効桁数の範囲で計算してます。 あと、math.hが入ってますので、コンパイル時に-lmを忘れずに!(←なんて親切なんだ!?) #include <stdio.h> #include <math.h> #include <stdlib.h> int main(int argc, char** argv){ int n = 0; int m = 0; double x_n = 0.0; double y_n = 1.05; double b = 0.0; double zandaka = 0.0; int ii; /* パラメータチェック */ if ( argc != 3 ){ printf("usage %s n m\nn:期間 m:引き出し額\n", argv[0]); return 0; } /* パラメータ取得 */ n = atoi(argv[1]); /* 期間 n */ m = atoi(argv[2]); /* 引き出し額 m */ /* i期における残高: ( X(i) * b ) - ( Y(i) * m ) * ただし、 * X(i) = 1.05^i, * Y(i) : Y(i+1) = 1.05 * ( Y(i) + 1 ), Y(1) = 1.05 * n期において0円以上あるためには * (X(n) * b) - (Y(n) * m) > 0 * これを bについて解くと、 * b > Y(n) * m / X(n) */ /* X(n)を求める */ x_n = pow(1.05, n ); /* Y(n)を求める。ここがキモ */ for ( ii = 2; ii <= n; ii++ ){ y_n = 1.05 * ( y_n + 1 ); } /* b(の下限)を求める */ b = (y_n * m) / x_n; /* 残高の変化の様子を表示(検算) */ zandaka = b; for (ii = 1 ; ii <= n; ii++){ zandaka = 1.05 * ( zandaka - m ); printf("%3d: %f\n", ii, zandaka); } /* 表示 */ /* printf("X(n) = %f\n", x_n); */ /* printf("Y(n) = %f\n", y_n); */ printf("n = %d\n", n); printf("m = %d\n", m); printf("b > %f\n", b); return 0; } ■パターン3 次に、人間様は何も考えないで、全部プログラムでコンピュータにやらせるパターンをやってみます。 b=1万円から初めて、n期目でも残高が残っているまで、bを1万円ずつインクリメントしていきます。なので、精度が1万円単位になってます。1円単位の精度が欲しい場合は0.0001万円から初めて0.0001ずつインクリメントすれば良いでしょう。10000倍遅くなりますが・・・ 言うまでもなく、このアルゴリズムは余りにバカ正直で(特に1円単位なると影響大)、普通はちょっと工夫すると思いますが、「人間様は何も考えない」パターンということで。 これをどうやって高速化するか(スペクトルをちょっと人間様寄りにする)は、マキバオーさんの宿題と言うことで。。。もしかしたらそれが求められている解かも? #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv){ double b = 0; int n = 0; int m = 0; double zandaka; int ii; if ( argc != 3 ){ printf("usage %s n m\nn:期間 m:引き出し額\n", argv[0]); return 0; } n = atoi(argv[1]); /* 期間 n */ m = atoi(argv[2]); /* 引き出し額 m */ /* n期目でも残高が残るまでbをインクリメントしていく */ for ( b = 1 ;zandaka <= 0 ; b += 1){ /* 残高を、残っている限り、最大n期目まで求める*/ zandaka = b; for (ii = 1 ; ii <= n && zandaka > 0; ii++){ zandaka = 1.05 * ( zandaka - m ); } } /* 残高の変化の様子を表示(検算) */ zandaka = b; for (ii = 1 ; ii <= n && zandaka > 0; ii++){ zandaka = 1.05 * ( zandaka - m ); printf("%3d:%f\n", ii, zandaka); } /* 表示 */ printf("n = %d\n", n); printf("m = %d\n", m); printf("b > %f\n", b); return 0; } ソースは無保証です!!! ただ、バグのご指摘、ご批評など頂ければ幸いです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[297] Re:hash_user_password()
投稿者:Shin
2007/02/20 02:13:25

>>これを気にするのであれば、salt とプログラム埋め込みのsecret >>の両方を使うのが良いと思います。どちらか片方だけであれば、 >>salt の方を選ぶのが良い習慣だと思います。 > >両方使うようにして、今までの分はsaltを空文字にしておけば、 >今までの投稿については、以前のパスワードが変わらず使えるかなあ、と >一瞬考えたのですが、D/B流出の時にパスワードがばれる危険性を考えて >いるのだからそれじゃ本末転倒ですね (^^; > >今までの投稿が削除できなくなってもおそらく誰も困らないでしょうから >(いまさら「しくじったので書き直し」はないでしょうから)、今度時間が >できたときに修正しておきます。 ほとんど文脈無視ですが_o_、salt として本文を使うってのはどうですかね? 管理者による本文の修正は出来なくなりますけどね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[296] Re:誰か助けてください
投稿者:(ぱ)
2007/02/20 02:13:25

>最近C言語を始めたのですが、この問題がどうしても解けません。誰かといてください。お願いします(>_<)  宿題は自分でやるべきでしょう。
[この投稿を含むスレッドを表示] [この投稿を削除]
[295] 誰か助けてください
投稿者:マキバオー
2007/02/20 02:13:25

最近C言語を始めたのですが、この問題がどうしても解けません。誰かといてください。お願いします(>_<) 1.ある銀行では毎期末に預金残高に対して5%の利率で利息がつく.この銀行に,例えばa万円を一期間預金すると,期末には1.05×a万円の預金残高になる. 第1期の初めに,Aさんはこの銀行にb万円の預金を持っている.Aさんは,まずb万円から第1期分m万円を引き出す.残りの預金に対し第1期末に5%の利息がつく.ここで,b > mとする.第2期目からも毎期初めにこの預金からm万円ずつを引き出す.ただし,預金残高がm万円に満たないときには,その全額を引き出すものとする. Aさんの預金残高がn期間にわたって0円とならないために必要な第1期初めの預金額「b」を計算したい.期間「n」と毎期の引き出し額「m」を入力して,上の条件を満たす最小の「b」を求めるプログラムを作れ.なお,単位は「万円」とする.また,n >= 2 とする.
[この投稿を含むスレッドを表示] [この投稿を削除]
[293] 削除機構を修正しました
投稿者:(ぱ)
2007/02/20 02:13:25

 kitさんのご指摘を受けまして、パスワード認証にsaltを使うようプログラムを 修正しました。  これに伴い、この投稿以前に設定した削除用パスワードは使えなくなっています。 あしからずご了承ください。 # ここで力尽きたので、解説記事の修正はまだ…
[この投稿を含むスレッドを表示] [この投稿を削除]
[291] Re:Pathが通らないのですが・・
投稿者:(ぱ)
2007/02/20 02:13:25

>MYSQLのことで、ご質問させて頂きます。 >インストール後に、コマンドプロンプトで >パスを通そうとしたところ、以下のエラーが表示されてしまいました。 > >ERROR 2003: Can't connect to MYSQL server on 'localhost' >(10061) Windowsでパスを通すとき通常コマンドプロンプトは使わないと思うし、 パスを通そうとして、上記エラーが出ることはないはずです。 mysqlのクライアントを立ち上げようとした時にこのエラーが出るのなら わかりますが。 もし、コマンドプロンプトから「mysql」とタイプして上記メッセージが出るのなら、 MySQLのサーバが起動していないのでしょう。サービスに登録するか、 mysqldを実行する必要があります。 >10061というポート番号は存在しないのは、理解しています。 ウェルノウンポートでないだけで、65535までのポート番号は存在しうるでしょう。
[この投稿を含むスレッドを表示] [この投稿を削除]
[290] Pathが通らないのですが・・
投稿者:hiro
2007/02/20 02:13:25

MYSQLのことで、ご質問させて頂きます。 インストール後に、コマンドプロンプトで パスを通そうとしたところ、以下のエラーが表示されてしまいました。 ERROR 2003: Can't connect to MYSQL server on 'localhost' (10061) 10061というポート番号は存在しないのは、理解しています。 なるべく具体的にどこのファイルをどう変更すると助言頂けると 助かります。 宜しくお願い致します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[289] Re:hoge
投稿者:kit
2007/02/20 02:13:25

>僕は大学生なのですが、プログラムの先生がhogeを多様していました。 ひょっとして WIDE 関係のネットワークの先生だったりしません? >それどころかfugaなるものをも使用していました。 hoge, fuga は結構よく見ます。 hoge, huga という変種もあるようです。 google で探すと hoge, piyo より多いです。 hoge のページに記載してもいいですよねえ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[288] hoge
投稿者:カンコン
2007/02/20 02:13:25

はじめまして。 むつかしい議論をしている最中恐縮ではありますが・・・ 僕は大学生なのですが、プログラムの先生がhogeを多様していました。 それどころかfugaなるものをも使用していました。 これはほげ学に新風を巻き起こすのでは、と思い、書き込みをしました。 よければ参考にしてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[287] Re:オブジェクト指向から入れば簡単?
投稿者:(ぱ)
2007/02/20 02:13:25

>で、そーいう入門段階を既に過ぎた人でないと >| 継承は確たる「設計思想」が無い場合、スーパークラスが単なる「ごみ置き場」 >| と化していることが多いようです。 >なんて議論は理解できないでしょう。 これはそう思います。 ># 今この場では「入門」の話に限定、していい?のですよね。 了解です。 ちょうどoosquare-mlで継承の話が出てたので[283]のように書きましたけど、 「継承の問題点」のような話は入門者にわかりにくいのは確かだと思いますので、 そういう話は別スレ立てることにして、今この場は「入門」の話に限定、しておきましょう。 まあ入門者相手でも、継承が「ソースの再利用のためのテクニック」だと言われれば それは変だと思いますが、774RRさんの出されている >「ほらほら、『使うほう』はその実体が具体的に何であるか気にしなくていいんだよ」 という例は、継承の使い方としてまっとうだと思いますし。
[この投稿を含むスレッドを表示] [この投稿を削除]
[286] Re:オブジェクト指向から入れば簡単?
投稿者:kei
2007/02/20 02:13:25

仕事中の現実逃避で、前橋さんが紹介されたoosquare-mlを読んでました。 読んだ感想なんですが、僕の中では、ただ単に「手抜きのために継承は使うな」って いうだけのような気がします。(考えなさ過ぎ?) 委譲を使ったとしても、やたらと関連が集中しているクラスを作ってしまったら、 結局ごみ置き場になってしまいますし。 > 「ぴゅあOO」を学んでも、それが明日役立つか、って言われるとキツイものがあります。 > 「入門者でも即、目に見える価値」が無いと教える側としては困るのです。 僕はそれほど教える立場にはいないんですけど、確かにそれは感じますね。 2年ほど前にあったSun Super Tech DaysのBOFを覗いた時、どなたかが 「インドではプログラマを養成する際、UMLなどを使用して、まずオブジェクト指向から 叩き込む。実際のプログラムを教えるのはその後。日本のIT業界もそうでなければ。」 といった趣旨の発言をされていました。 その時は、「あー、そーなんだー。」ぐらいに思っていたんですけど、今になって 思えば、全然そんな事はないんじゃないかと。プログラマなんだから、まずプログラムを 覚えろと。 オブジェクト指向が有効かどうかという判断は、その後なんじゃないかと、最近では 思います。 例えばデザインパターンなんて教えるものじゃなくて、試行錯誤や見よう見真似で、 「気が付いたら使ってた」ぐらいが理想だよなぁ、なんて思ったりします。 で、教える側は、そこに到ることの出来る基礎を身につけさせてあげれば良いのでは、 そしてその基礎というものは、オブジェクト指向というよりも、「プログラムを組む ための地力」となる知識と経験なのでは、と思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[285] Re:オブジェクト指向から入れば簡単?
投稿者:774RR
2007/02/20 02:13:25

飴と鞭、って鞭ぢゃないですけど、既に kei さまが [278] で述べられているとおり > 結局、「それが出来ると何がうれしいのか」ってことを実感してからじゃないと、 これが端的に直感できるのが「使うほうは基底クラス、実装するほうは派生クラス」 だと *個人的には* 思います。 飴が無ければ、鞭で叩かれないと新しい知識の勉強なんてしないでしょ? # そーいうのに興味が無い人の場合。放っておいていい子は教えなくても勝手にやってるし。 C++ の場合 <algorithm> だけでも学ぶ価値&即戦力になる実力があるのですが 「ぴゅあOO」を学んでも、それが明日役立つか、って言われるとキツイものがあります。 「入門者でも即、目に見える価値」が無いと教える側としては困るのです。 で、そーいう入門段階を既に過ぎた人でないと | 継承は確たる「設計思想」が無い場合、スーパークラスが単なる「ごみ置き場」 | と化していることが多いようです。 なんて議論は理解できないでしょう。 # 今この場では「入門」の話に限定、していい?のですよね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[284] Re:hash_user_password()
投稿者:(ぱ)
2007/02/20 02:13:25

>従って、あらかじめ辞書を記憶媒体に作成するのは不可能で、全ての >メッセージについて、試行するしかありません。 >これに要する計算コストは、O(M*D) となり、M が大きければ、 >O(N) や O(D) よりも有意に大きな値になります。 納得しました。計算量はM倍ですよね。 うちの掲示板ではMがそんなに大きくないので、「全てのsaltに対応する 辞書を作成する」というのが現実的と思えず、「探索空間が salt のビット数分 広がる」のところで混乱していました。 丁寧な説明ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[283] Re:オブジェクト指向から入れば簡単?
投稿者:(ぱ)
2007/02/20 02:13:25

>とりあえず俺的には入門者に最初に教えたいのが継承派生です。 ちょうど今、oosquare-mlで継承の是非に関する議論が白熱しています。 http://www.ogis-ri.co.jp/otc/otc2/oosquare-ml/Archive/thread.html なんかもう、「言葉の上だけの議論は空しい」状態になってる気もしますが… まあ継承には色々な問題があると私も思うんですが、一連の議論の中で、 http://www.ogis-ri.co.jp/otc/otc2/oosquare-ml/Archive/200501.month/4468.html | 継承は確たる「設計思想」が無い場合、スーパークラスが単なる「ごみ置き場」 | と化していることが多いようです。 これ、具体的にはどういう例なんだろう… あるクラス群が共通に使うメソッドを、それらのクラスのスーパークラスに 山ほど押し込んでいる、ってことかなあ。 スーパークラスには「外から見て」そのクラスに必要なメソッドが入っていれば よいわけで、サブクラスが共通に使うメソッドなんか持つ必要はないと 思うんですが。共通処理があるのなら、Utility.javaみたいな「関数」を 書けばいい。 >「ほらほら、『使うほう』はその実体が具体的に何であるか気にしなくていいんだよ」 >ある程度プログラム経験がある人だと、これで結構ぐらぐらしてくれます。 これはJavaならinterfaceですよね。 ただ、interfaceには実装がまったく書けないので、やっぱりデフォルトの挙動が 欲しい、とか思ったときに、DefaultHogeとかSimpleHogeとかAbstractHogeとか 作っちゃうわけで… これがよいのかどうか。 http://struts.apache.org/api/org/apache/struts/action/Action.html これなんかはどうなんだろう。私なら、こういうのは反射的にinterfaceにしますが。 クラスにした結果、結構ごみ置き場になってるような気も。
[この投稿を含むスレッドを表示] [この投稿を削除]
[282] Re:hash_user_password()
投稿者:kit
2007/02/20 02:13:25

> また、異なるメッセージであっても、同一ユーザーは同じパスワードを > 使い回すと仮定します。 この仮定は本質的ではないので、N==M とおいて、 Sとして十分大きなビット数を用いると、辞書攻撃に必要な計算量が、 min(M*D/M, M*D/D) == min(D, M) 倍程度になるわけです。 と書いた方が分かりやすかったですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[281] Re:hash_user_password()
投稿者:kit
2007/02/20 02:13:25

> saltがばれてる状態では、「探索空間が salt のビット数分広がる」 > ことはないように思いますが…まだ何か勘違いしてますでしょうか。 D: 辞書のサイズ S: salt のビット数 N: ユーザ数 M: メッセージ数 とします。 ここで、一つのMD5ハッシュ値から辞書を引いてパスワードを得るコスト を O(1) とします。 また、異なるメッセージであっても、同一ユーザーは同じパスワードを 使い回すと仮定します。 なお、2^S は、M より有意に大きいため、ほぼ全てのメッセージについて、 異なる salt が使われているものとします。 ここで、salt なしの場合、辞書作成に必要なコストは O(D)、辞書攻撃に 必要なコストは O(N) です。 では、salt ありの場合は、どうでしょう。 全てのありうる salt に対して辞書を作成するのに必要な計算コスト および記憶コストは O(D * 2^S) ですが、これは S が十分大きければ (例えば S=64) 計算量的にも、あるいは記憶容量的にも実現不能になります。 従って、あらかじめ辞書を記憶媒体に作成するのは不可能で、全ての メッセージについて、試行するしかありません。 これに要する計算コストは、O(M*D) となり、M が大きければ、 O(N) や O(D) よりも有意に大きな値になります。 すなわち、Sとして十分大きなビット数を用いると、辞書攻撃に必要な 計算量が、min(M*D/N, M*D/D) == min(M*D/N, M) 倍程度になるわけです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[280] Re:hash_user_password()
投稿者:(ぱ)
2007/02/20 02:13:25

なんだかすごく初心者な発言をしている気がしますが、聞くは一時の恥ということで。 >データベース中には複数のMD5化されたパスワードが存在する >わけですが、salt がないと、単一の辞書を使って、全ての >パスワードに対する試行を行うことができます。これに対し、 >salt があると、2 の salt のビット数乗 の辞書が必要になる >わけです。 つまりこういうことでしょうか。 ・パスワード候補となりうる文字列に「秘密」を連結し、MD5ハッシュ値を算出する。  大量の文字列に対してこれを行い、辞書を作る。 ・辞書が何らかの記憶媒体に載るとしたら、ハッシュ値がばれればパスワードもばれる。  ハッシュ値の方から逆引きできるようなしかけにしておけば一瞬。 ・辞書を作るにはひとつのパスワードを抜くのと同じ計算量が必要だけど、  「秘密」方式では、その計算量で、全てのパスワードがばれる。 うーん、でも、 >salt があると、探索空間が salt のビット数分広がるため、 saltがばれてる状態では、「探索空間が salt のビット数分広がる」ことはない ように思いますが…まだ何か勘違いしてますでしょうか。 >これを気にするのであれば、salt とプログラム埋め込みのsecret >の両方を使うのが良いと思います。どちらか片方だけであれば、 >salt の方を選ぶのが良い習慣だと思います。 両方使うようにして、今までの分はsaltを空文字にしておけば、 今までの投稿については、以前のパスワードが変わらず使えるかなあ、と 一瞬考えたのですが、D/B流出の時にパスワードがばれる危険性を考えて いるのだからそれじゃ本末転倒ですね (^^; 今までの投稿が削除できなくなってもおそらく誰も困らないでしょうから (いまさら「しくじったので書き直し」はないでしょうから)、今度時間が できたときに修正しておきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[279] Re:PerlでPDFを表示したいのですが。
投稿者:iWA
2007/02/20 02:13:25

http://cpan.org/ に行って「PDF」で検索してみるのもよいかも。
[この投稿を含むスレッドを表示] [この投稿を削除]
[278] Re:オブジェクト指向から入れば簡単?
投稿者:kei
2007/02/20 02:13:25

# どこにぶら下げようか迷いました。。 僕の職場の新人研修は、いきなりJavaです。 会社的には「今はJavaの案件が一番多いから」ぐらいの理由で選んでいるんだと 思います(情けない。。) で、そんな新人研修をしてきた後輩を見る限り、「オブジェクト指向から入れば 簡単」ということでは無さそうです。 確かに、概念的な部分の吸収は早いように感じます。 でもそれって、ただ単に「何も疑問を持たないから」ってだけなんですよね。 しかも、実際のコードでは、オブジェクト指向を「使えない or 使わない」んです。 結局、「それが出来ると何がうれしいのか」ってことを実感してからじゃないと、 使いこなすことが出来ないんじゃないかと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[277] Re:オブジェクト指向から入れば簡単?
投稿者:774RR
2007/02/20 02:13:25

>とりあえず俺的には入門者に最初に教えたいのが継承派生です。 あ、ここでの「入門者」は「プログラム経験があって、でもオブジェクト指向は入門者」です。 今年の新入社員君がプログラム経験無いようなら、いきなり C++ など逝ってみたいと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[276] Re:オブジェクト指向から入れば簡単?
投稿者:774RR
2007/02/20 02:13:25

ウチは組み込み屋さんなのでアセンブラ経験はほぼ全員が、C 経験は半数が、もっています。 C++ を本格的に使っているのは俺だけです。 次のプロジェクトでは後輩君に C を飛ばして C++ をいきなり使わせようとたくらみ中です。 # どうなることやら... とりあえず俺的には入門者に最初に教えたいのが継承派生です。 「ほらほら、『使うほう』はその実体が具体的に何であるか気にしなくていいんだよ」 ある程度プログラム経験がある人だと、これで結構ぐらぐらしてくれます。
[この投稿を含むスレッドを表示] [この投稿を削除]