K.Maebashi's BBS

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

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

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

[323] Re:端末ドライバのバッファやstdinバッファの中身を覗くには?
投稿者:chisato
2007/02/20 02:13:25

ご回答大変有難うございます。 > 掲示板では一般にマルチポストは嫌われます。 マルチだと思われたのならお詫び致します。m(_ _)m >  ただ、今回の例だと、時期がずれていて、質問内容も違うので、マルチポストに > 当たるかどうかはわかりません。 そう思っていただければ大変助かります。m(_ _)m > が、この手の掲示板を見ている人は、同じような > ジャンルの掲示板は見ていることが多い、ということは意識している必要があると > 思います。かずまさんも、たまにこの掲示板にも登場されます。 今後、誤解が生じませぬよう成るべく異なるサンプルリストを提示するよう心がけま す。 >>select関数についての振舞いについて調べています。 > 端末ドライババッファとstdinバッファの振舞いについて調べるのに、 > わざわざselectを使う必要があるのでしょうか。もちろん別にselectでもいいです > が、 > getchar()とputchar()でもよいような。 そうですか。参考にしてみます。ただ、最近、select関数を知ったのでちょっと使っ てみたくなりまして。 >  端末ドライバのバッファは覗けないと思います(少なくとも標準的な方法では)。 >  標準入力のバッファは、FILE構造体に紐づいていますから、stdio.hから > 調べればよいでしょう。 >  私の環境(gcc (GCC) 3.4.2 (mingw-special))ではこうなっていました。 : > > [実行結果] > C:\ctest>buffertest > aaa これはエコーバックですよね。 > [aaa] これはdump_buffer関数でのputchar、printf出力ですね。 > a[aa] aが一回だけ入力されているのにこのようになるのですかね??
[この投稿を含むスレッドを表示] [この投稿を削除]
[322] Re:正誤の誤?
投稿者:(ぱ)
2007/02/20 02:13:25

 はじめまして。 > それはさておいて、なんとなしに同書の正誤表を見ていたら「賭け網」と書かれた >箇所に気づきました。「賭け」でよかったのかな、と思ったもので。ちなみにGoogleで >検索するとこちらのサイトがトップ3にランクインしてました。  ご指摘ありがとうございます。まぬけなポカでした。修正しました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[321] 正誤の誤?
投稿者:田中
2007/02/20 02:13:25

 貴著「センス・オブ・プログラミング!」が図書館にあったので今度借りようと思っている者です(著者さんとしてはうれしさ半減?)。  それはさておいて、なんとなしに同書の正誤表を見ていたら「賭け網」と書かれた箇所に気づきました。「賭け」でよかったのかな、と思ったもので。ちなみにGoogleで検索するとこちらのサイトがトップ3にランクインしてました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[320] Re:端末ドライバのバッファやstdinバッファの中身を覗くには?
投稿者:(ぱ)
2007/02/20 02:13:25

 掲示板では一般にマルチポストは嫌われます。  ただ、今回の例だと、時期がずれていて、質問内容も違うので、マルチポストに 当たるかどうかはわかりません。が、この手の掲示板を見ている人は、同じような ジャンルの掲示板は見ていることが多い、ということは意識している必要があると 思います。かずまさんも、たまにこの掲示板にも登場されます。 >select関数についての振舞いについて調べています。 端末ドライババッファとstdinバッファの振舞いについて調べるのに、 わざわざselectを使う必要があるのでしょうか。もちろん別にselectでもいいですが、 getchar()とputchar()でもよいような。 ... >端末ドライバのバッファやstdinバッファの中身を覗くにはどうすれば >いいのでしょうか?  端末ドライバのバッファは覗けないと思います(少なくとも標準的な方法では)。  標準入力のバッファは、FILE構造体に紐づいていますから、stdio.hから 調べればよいでしょう。  私の環境(gcc (GCC) 3.4.2 (mingw-special))ではこうなっていました。 typedef struct _iobuf { char* _ptr; int _cnt; char* _base; int _flag; int _file; int _charbuf; int _bufsiz; char* _tmpfname; } FILE;  _baseがバッファの根元を押さえ、_cntが現在格納されているデータのサイズだと 想像し(外しているかも)、こんなプログラムを書いてみました。 #include <stdio.h> void dump_buffer(FILE *fp) { int i; printf("["); for (i = 0; i < fp->_cnt; i++) { putchar(fp->_base[i]); } printf("]\n"); } int main(void) { int c; while ((c = getchar()) != EOF) { dump_buffer(stdin); putchar(c); } } [実行結果] C:\ctest>buffertest aaa [aaa] a[aa] a[a] a[] bbb [bbb] b[bb] b[b] b[]  それっぽく動いているように見えます。  重要なのは、標準入出力ライブラリの関数は、そのバッファリングのメカニズムを 含め、普通にCで、システムコールの上に実装されている、ということです。 実装を想像すると、理解が深まると思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[319] Re:端末ドライバのバッファやstdinバッファの中身を覗くには?
投稿者:774RR
2007/02/20 02:13:25

http://www3.realint.com/cgi-bin/tarticles.cgi?pointc2+3409 ここの人ですか? せっかく「とても適切でわかりやすい」回答があるのですから、 100回くらい繰り返して読むべきです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[318] 端末ドライバのバッファやstdinバッファの中身を覗くには?
投稿者:chisato
2007/02/20 02:13:25

select関数についての振舞いについて調べています。 (Win2k+Cygwin) #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <sys/types.h> #include <curses.h> #include <signal.h> #include <unistd.h> //=================== void session_loop(){ fd_set mask; FD_ZERO(&mask); FD_SET(0,&mask); fd_set readOK; int width=1; char c; printf("う\n"); while(1){ printf("あ\n"); readOK=mask; printf("こwidth=%d\n",width); select(width,(fd_set *)&readOK,NULL,NULL,NULL); printf("け\n"); if ( FD_ISSET(0, &readOK ) ){ printf("い\n"); c=getchar(); //getcharはバッファリングあり関数 printf("c=%c\n",c); printf("さ\n"); } } } //================= int main(void){ session_loop(); return 0; } というリストで 端末ドライババッファやstdinバッファの振舞いについて学習しています。 端末ドライバにバッファリングされた文字群がgetchar関数のread要求とかでstdinバッファに排出される様子や stdinバッファの文字群がgetchar関数の読込み毎に減っていく様子を垣間見たく思っています。 端末ドライバのバッファやstdinバッファの中身を覗くにはどうすればいいのでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[317] Re:書き方覚えて後から理解
投稿者:(ぱ)
2007/02/20 02:13:25

> ゲームプログラマじゃないですって(^-^;) ありゃりゃ、すみません。旧掲示板でゲームのフレームワークの話をしておられたので ゲーム系の人かと思ってました。失礼しました。 > あとは「僧侶が使うと魔法が発動するが、勇者が使うと武器になる」とか >「フィールドによっては効果が封印されてしまう」など作り込み次第で例外は >いくらでもありそうです。 … > あとはリフレクトされるカウンターなんかがあると更に面倒になるのでしょうね。 >そしてそのカウンターに「反応」できるとなると・・・考えるだけで目が回りそう >です。 うわあ。なるほど。 これで、武器や職業の種類が少なければ、いっそif文べたべたでやってしまえという ことになりそうですが、おそらくそうでもないんでしょうね。 大筋はポリモルフィズムで、例外的なのはif文で場合分け、とかするのかな。 何にせよ大変そうです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[316] Re:書き方覚えて後から理解
投稿者:れぷ
2007/02/20 02:13:25

 ゲームプログラマじゃないですって(^-^;) 大昔に書いたと思いますがバリバリC/S系です。 # 確かに趣味ではゲーム作ってますけど・・・  Cでも関数は書き方、作り方にある程度の定石がありますが、結局のところは適材適所になって例外はいくらでもあるわけで、この辺りは悩みどころかもしれませんね。CADに関してはやったことないのであまり深く言及できませんが、ShapeのZオーダだけで単純に判定できなそう、くらいの認識です。 > このへんは、ダブルディスパッチ(いや、Character→Arm→Enemyのトリプル >ディスパッチかな)でいけそうな気がしますが、どうなんでしょうか。  そうですね・・・アイテム攻撃でも「武器を選択すれば殴れる」ような場合とか「魔法が発動してしまう」場合もあるのでもう1回くらいディスパッチが必要になるかもしれませんね。  あとは「僧侶が使うと魔法が発動するが、勇者が使うと武器になる」とか「フィールドによっては効果が封印されてしまう」など作り込み次第で例外はいくらでもありそうです。  ひと昔前のRPGであれば、攻撃が0、魔法が1などになっていて、引数でどの武器、どの魔法なんて指定していましたが、それをしっかりOOPで纏めるほどディスパッチの回数が多くなりそうな気がします。  あとはリフレクトされるカウンターなんかがあると更に面倒になるのでしょうね。そしてそのカウンターに「反応」できるとなると・・・考えるだけで目が回りそうです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[315] Re:書き方覚えて後から理解
投稿者:(ぱ)
2007/02/20 02:13:25

>使う側は全体魔法の場合は、こう書く...かなぁ? > for( i=0; i<number_of_enermy; i++) Attack( enermy[i], magic); 「全体魔法の場合は」というif文が出てくるのが、本来は美しくないんでしょうけど。 現実問題そこの場合分けなしではうまく書けないのかもしれませんし。 >でも、やっぱりattack()がintを返すのは問題かなぁ。 >enermyのステータスなり何なりに効果を与えるのが自然...かな? ということで、条件分岐は避けられないとするのなら、いっそget_attack_point() にして後の判断は上位に任せるという方法もあるかとは思います。OO的ではないですが。 もちろん、そのメソッド名が「attack()」では全然ダメですけどね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[314] Re:書き方覚えて後から理解
投稿者:(ぱ)
2007/02/20 02:13:25

私はそもそもRPGをろくすっぽやったこともないんですが。 # 家庭用ゲーム機持ってないもんで… # 大昔、PC1500版labyrinthを作ろうとして挫折した記憶が(以下略) > これもまた面倒で、明らかに敵のグループを選択して魔法を撃つ場合と、 > フィールド上で「ボカーン!」と爆発する魔法を撃つ場合を考えないと > いけないでしょうね。(後者は味方の巻き添えもありえますし)  プロのゲームプログラマさんの投稿ありがとうございます。  こういうのは、いわゆる「教科書的なOO」が適用できないケースですよね。 RPGに限らず、CADなどでも、例外的な事象はいくらでもあるわけで。  ユーザが画面上である座標をクリックしたとき、最寄の図形を選択したいわけですが、 ・「折れ線」の上に「中間点(vertex)」がある場合、vertexを優先して検出したい。 ・せっかく直線を選択したのなら、クリックした座標から下ろした垂線の足も  検出したい。  とかの要望も出てきて、  Shape#distance(double x, double y)  をいろんなShapeでオーバーライドすれば完璧! とはなかなかならないのが現実です。 > ですからAttackTo(Enemy)と書いた場合でも、内部的にはEnemy.DamageFrom(This)と >書いて、Enemy側で「その攻撃が本当にダメージになるか」などを判断する必要が >あるのじゃないかと思います。  このへんは、ダブルディスパッチ(いや、Character→Arm→Enemyのトリプル ディスパッチかな)でいけそうな気がしますが、どうなんでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[313] [業務連絡]改行について
投稿者:(ぱ)
2007/02/20 02:13:25

>「はてな」で書くときの癖で改行入れるの忘れました・・・orz これなんですが、この掲示板では当初発言内容をすべて<pre>で囲んでいたため、 手で改行を入れないと改行されなかったのですが、 現在は、<tt>で囲み、かつ空白を&nbsp;に置換することで、 改行を行いつつ、ソースを貼っても極端にインデントが崩れないようにしています。 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&from=25&range=1 # 要するに、OTDの時は<pre>で囲む以外手がなかったんだけど、今はスクリプト # 自体が自作なんだから、空白を&nbsp;に置換することなんて簡単なのに # しばらくそれに気付かなかった私がアホだったわけで。 よって、現在は、ことさら手作業で改行を入れる必要はなくなっています。 私は、返信の際にうまく「>」が入るように、改行を入れていますけど。 ということでお気になさらず。
[この投稿を含むスレッドを表示] [この投稿を削除]
[312] Re:書き方覚えて後から理解
投稿者:本多
2007/02/20 02:13:25

> ・・・などとOOPでRPGを作成したことがないので自信なしですが(^-^;) 作成したことのある人のほうが少なそうに思えますが。さて。 > あとはGetAttckPoint()メソッドを作る場合でも、内部ステータス的にアイテム攻撃になる場合もありますし、アンデッドのように属性で効果が変わる場合もあります。 攻撃の効果が相手によって変わるなんてのは 関数Attack()の実装を オブジェクト(攻撃対象)によって 異なる様に記述したいのだから、 継承なり仮想関数なりを使うのが自然なんでしょうかねぇ。 使う側は全体魔法の場合は、こう書く...かなぁ? for( i=0; i<number_of_enermy; i++) Attack( enermy[i], magic); なんかちょっと違う気がする...よーく考えないとあかんかなぁ。 でも、やっぱりattack()がintを返すのは問題かなぁ。 enermyのステータスなり何なりに効果を与えるのが自然...かな?
[この投稿を含むスレッドを表示] [この投稿を削除]
[311] Re:書き方覚えて後から理解
投稿者:れぷ
2007/02/20 02:13:25

「はてな」で書くときの癖で改行入れるの忘れました・・・orz
[この投稿を含むスレッドを表示] [この投稿を削除]
[310] Re:書き方覚えて後から理解
投稿者:れぷ
2007/02/20 02:13:25

> Shapeと違ってCharacterは、そのRPGでしか使わないから、attack(Enemy)でも >良いような気もしますが、RPGではきっと「周囲にいる複数の敵にいっせいに >ダメージを与える技」ってのがありそうですし。  これもまた面倒で、明らかに敵のグループを選択して魔法を撃つ場合と、フィールド上で「ボカーン!」と爆発する魔法を撃つ場合を考えないといけないでしょうね。(後者は味方の巻き添えもありえますし)  前者も炎とかを出すのであれば後者のルーチンと共通化した関数にすることができそうですが、マインドアタックなどの場合は直接効果を与える処理(ステータスなども弄る処理)になるでしょうし。  あとはGetAttckPoint()メソッドを作る場合でも、内部ステータス的にアイテム攻撃になる場合もありますし、アンデッドのように属性で効果が変わる場合もあります。  ですからAttackTo(Enemy)と書いた場合でも、内部的にはEnemy.DamageFrom(This)と書いて、Enemy側で「その攻撃が本当にダメージになるか」などを判断する必要があるのじゃないかと思います。  ・・・などとOOPでRPGを作成したことがないので自信なしですが(^-^;)
[この投稿を含むスレッドを表示] [この投稿を削除]
[309] Re:書き方覚えて後から理解
投稿者:(ぱ)
2007/02/20 02:13:25

>int get_attack_point() const { return power+weapon; } >int get_defence_point() const { return vitality+armor; } >ならとりあえず許します。  これは同意です。  私があちこちに書いている「Shapeにdraw()メソッドを入れてはいけない原則」に 則れば、attack(Enemy)よりもget_attack_point()の方が良いような気もします。  Shapeと違ってCharacterは、そのRPGでしか使わないから、attack(Enemy)でも 良いような気もしますが、RPGではきっと「周囲にいる複数の敵にいっせいに ダメージを与える技」ってのがありそうですし。
[この投稿を含むスレッドを表示] [この投稿を削除]
[308] Re:書き方覚えて後から理解
投稿者:774RR
2007/02/20 02:13:25

attack() を動詞ととるなら確かに「設計がヘン」です。 こんな設計見せられたら、私も却下します。 int get_attack_point() const { return power+weapon; } int get_defence_point() const { return vitality+armor; } ならとりあえず許します。 初心者に最初に見せるサンプルというのはきわめて大事です。 「適切なサンプル」を見せるのなら良い。 「テキトーなサンプル」は見せるだけ有害です。 孵ったばかりの雛鳥と同じく、そのサンプルが刷り込まれてしまいます。 トンデモ系の設計を刷り込まれてしまった初心者のコードは手がつけられなくなります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[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を使うようプログラムを 修正しました。  これに伴い、この投稿以前に設定した削除用パスワードは使えなくなっています。 あしからずご了承ください。 # ここで力尽きたので、解説記事の修正はまだ…
[この投稿を含むスレッドを表示] [この投稿を削除]