ふらっとC#,C♯,C#(初心者用) Part38at TECH
ふらっとC#,C♯,C#(初心者用) Part38 - 暇つぶし2ch145:デフォルトの名無しさん
09/03/03 23:21:32
日本の法律では、誕生日の前日に年を取る

豆知識

146:デフォルトの名無しさん
09/03/03 23:23:55
>>145
法律的に年利計算は閏年の翌日?前日?

147:デフォルトの名無しさん
09/03/03 23:30:11
>閏年の翌日?前日?


148:デフォルトの名無しさん
09/03/03 23:35:42
TimeSpanに年数を示すプロパティはないんだな。考えてみれば、月数や年数はTicksから
一意に定まるものじゃないものな。
結局場合分けして引き算するしかなさそうだ。
ちなみに、年齢が変わるのは「誕生日の前日の午後12時」なので、誕生日が来たら年齢が変わると考えておk。

// DateTime d1 = 指定日付, d2 = 誕生日
int age;
if (d1 < d2)
{
  // 何かしらエラー処理する
}
else if (d1.Month > d2.Month || (d1.Month == d2.Month && d1.Day >= d2.Day))
{
  age = d1.Year - d2.Year;
}
else
{
  age = d1.Year - d2.Year - 1;
}

149:デフォルトの名無しさん
09/03/03 23:36:04
税金関係は1年=365日で定数だった気が

誕生日の前日に年取るのは閏日生まれの為だし

150:デフォルトの名無しさん
09/03/03 23:42:56
>>106
詳しく!
ヘルプミー
今日で約1週間!俺はアホなのかー♪;;

151:デフォルトの名無しさん
09/03/03 23:48:42
>誕生日の前日に年取る
これじゃ不正確
民法の試験じゃ×になる

152:デフォルトの名無しさん
09/03/03 23:50:26
だからなんだよ。司法関係者にでもなるのか?

153:デフォルトの名無しさん
09/03/03 23:52:06
うん
応援してね

154:デフォルトの名無しさん
09/03/03 23:54:27
                  .∧__,,∧
                 (´・ω・`)
                  (つ夢と)
                  `u―u´

          あなたの後ろに落ちてたこれを、






        ∧__,,∧                         ∧__,,∧
      (`・ω・ ) ミ                   (`・ω・´)
        (     つ  ⌒ヽ               と   ,u、つ
      `u―u'     夢               `u´夢
                YY⌒Y
         こうして、                   こうして、



                    ∧__,,∧
            _     (ω・´ )
         夢 三ニ ☆ __,(    )つ
              ̄    `ー―‐u'

                 こうだ !


155:デフォルトの名無しさん
09/03/04 00:01:14
>>150
Data Source=***.***.***.***,????;Initial Catalog=++++;Persist Security Info=True;User ID=--;Password=\\\\

***.***.***.*** ipaddress
+++ データベース名
-- 接続するユーザ名
\\\\ 接続するユーザ名のパスワード

で接続できた。インスタンスは規定のインスタンスだから指定なし

156:デフォルトの名無しさん
09/03/04 00:02:31
>>151
んでシステム上ではどうするのが正解なんだい

157:デフォルトの名無しさん
09/03/04 00:03:39
すまん
????はポート

158:デフォルトの名無しさん
09/03/04 00:18:44
                  .∧__,,∧
                 (´・ω・`)
                  (つ夢と)
                  `u―u´

                  回収!!


159:デフォルトの名無しさん
09/03/04 00:20:33
ポート・・・?うーん勉強してきます・・・
ありがとう

160:デフォルトの名無しさん
09/03/04 00:20:54
  ∧_∧
  ( ・∀・)
 と    )シュッ
   Y しノ彡    -=ニ三      夢
  ヽ  )



161:デフォルトの名無しさん
09/03/04 00:29:25
                  .∧__,,∧
                 (´・ω・`)
                  (つ夢と)
                  `u―u´

                もう離すものか!!
                だれにも渡さない!



162:デフォルトの名無しさん
09/03/04 00:31:26
      ∧_∧
   ∧_(∀゚ ; )
  ( ・∀・)   つ
  (っ夢⊂≡て ヽ よこせ
  して_)_ノw (_)

  ∧_∧
  ( ・∀・)
 と    )       シュッ
   Y しノ彡    -=ニ三      夢
  ヽ  )



163:デフォルトの名無しさん
09/03/04 00:35:28
いつも思うんだが、お絵かきできてうれしくなっちゃう奴って
精神年齢が幼稚園時代で止まってるのか?

本気で理解できんよ。

164:デフォルトの名無しさん
09/03/04 00:37:57
コピペネタにマジレスかよw

165:デフォルトの名無しさん
09/03/04 00:40:47
                  .∧__,,∧
                 (´・ω・`)
                  (つポート
                  `u―u´
ポートとは何ぞや!

166:デフォルトの名無しさん
09/03/04 00:41:35
コピペだろうが何だろうがマジレスしてもらえるだけありがたいだろ

167:デフォルトの名無しさん
09/03/04 00:42:42
わりい間違えた 
×マジレス
○キチガイレス
だわ

168:デフォルトの名無しさん
09/03/04 00:44:22
>>132
25が重複してるが、当分割と仮定して、

var list1 = list.Take(25).ToList();
var list2 = list.Skip(25).Take(25).ToList();

>>139
int age = target.Year - birth.Year;
if(target < birth.AddYears(age)) age--;

169:デフォルトの名無しさん
09/03/04 00:45:07
>>163
お絵かき楽しいだろ。
素直になれよ。

170:デフォルトの名無しさん
09/03/04 09:49:54
>>159
特別な事情がない限りSQL Serverのポート番号はデフォルトの1433なので省略可能。
ので接続先のマシンがたとえば192.168.1.1でインスタンス名がSQLEXPRESSなら
Data Source=192.168.1.1\SQLEXPRESS
だし、既定のインスタンスに接続するならインスタンス名も省略できて
Data Source=192.168.1.1
で、特別な事情(SQL Server 2000/2005/2008を共存させてるとか)があって別のポート(たとえば11433)を使っているなら
Data Source=192.168.1.1,11433\OTHERINSTANCE
それでもつなげないなら接続先のファイアウォールが邪魔してると思われる。

171:デフォルトの名無しさん
09/03/04 10:12:34
そもそもManageMentStudioExpressとかで繋げてるのかな…・?

172:デフォルトの名無しさん
09/03/04 10:46:18
>>159
>>171も言ってるように、SSMSとかサーバーエクスプローラとかで接続してみるのが先だな。
てか、TCP接続ってデフォルトでOFFじゃなかったか?

それにしても斬新な区切り方だな>>171

173:デフォルトの名無しさん
09/03/04 11:39:32
C#でアッカーマン関数を計算させようとしていますが、スタックオーバーフローが
起きます。C#でスタック領域を広げるにはどうすればいいのですか?

174:デフォルトの名無しさん
09/03/04 11:55:25
多倍長計算させて、それでスタックが足りなくなってるの?
それとも、普通にInt32なりInt64なりを使っていて、再帰が
深くなりすぎてスタックが足りなくなってるの?

後者だとしたら、どうせ計算可能な部分はめちゃめちゃ限られているので、
アッカーマン関数の値を計算していく順序を工夫すべきだと思う。

URLリンク(www.google.co.jp)アッカーマン関数&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
これ見ると分かるけど、m=3以降に関しては、頑張っても報われないよ?


175:デフォルトの名無しさん
09/03/04 11:59:52
>>173
>>174で答えが出てるけど、どうしてもスタック領域を広げたいという話であれば
Threadクラスのコンストラクタで指定できるらしい。試してないけど。
URLリンク(msdn.microsoft.com)


176:デフォルトの名無しさん
09/03/04 12:01:22
>>174
再帰が深くなりすぎます

>>175
具体的にはどのようなコードを書けば良いのでしょうか?さっぱりわかりません

177:デフォルトの名無しさん
09/03/04 12:02:40
例えば大きな配列を確保する時など、後学のためにスタックサイズを
広げる方法を知っておきたいのです。C/C++ならリンカオプションで
簡単に出来るのですがC#では何かよくわかりません

178:デフォルトの名無しさん
09/03/04 12:06:58
Threadクラスの(ThreadStart, Int32)のコンストラクタ

179:デフォルトの名無しさん
09/03/04 12:07:08
.NETの配列はヒープに領域を取るのでスタック関係なし
再帰はスタックサイズの変更よりループに展開することを考えた方がいい

180:デフォルトの名無しさん
09/03/04 12:07:47
>>178
それはヘルプを見て確認していますが、使い方がわからないのです
短いコードで良いので具体的な使い方を教えていただきたいのです

181:デフォルトの名無しさん
09/03/04 12:09:45
別のスレッドを作ってそっちで動かすってこと
C# スレッド でググれ

182:デフォルトの名無しさん
09/03/04 12:10:34
>>181
もちろん既にぐぐっていますがよくわからないのです

183:デフォルトの名無しさん
09/03/04 12:12:09
スレッドが分からないくらいだったら
スタックサイズとか変なこと考える前に基礎をやれとしか

184:デフォルトの名無しさん
09/03/04 12:17:16
using System;
using System.Threading;

class Program
{
static void Main()
{
int maxStackSize = 1 * 1024 * 1024 * 1024;
Thread th = new Thread(DoWork, maxStackSize);
th.Start();
}

static void DoWork()
{
//...
}
}


185:デフォルトの名無しさん
09/03/04 12:27:24
>>184
ありがとうございます
助かりました
これを参考に作り直してみます

186:デフォルトの名無しさん
09/03/04 12:31:13
Stack<T>でも使って引数だけでもヒープに置くようにしたらだいぶマシなんじゃない
>このコンストラクタのオーバーロードを使用しないでください。
だし

187:デフォルトの名無しさん
09/03/04 12:53:12
遅そうだけど素直に展開したらこんな感じか
Stack<long> stack = new Stack<long>();
stack.Push(m); stack.Push(n);
while (1 < stack.Count) {
n = stack.Pop(); m = stack.Pop();
if (m == 0) { stack.Push(n + 1); }
else if (n == 0) { stack.Push(m - 1); stack.Push(1); }
else { stack.Push(m - 1); stack.Push(m); stack.Push(n - 1); }
}
return stack.Pop();

188:デフォルトの名無しさん
09/03/04 14:12:06
>>139-143

20090304 - 19870305 = 219999

これを10000で割った商が年齢になる。
別にうるう年とか全然関係ない。
このスレは算数もできない文系プログラマばっかりなのか?


189:デフォルトの名無しさん
09/03/04 14:20:49
算数や数学の問題じゃないだろうw
ともかくそれで正確な答えが出るんだったら便利だな

190:デフォルトの名無しさん
09/03/04 14:41:44
>>188
すげーw
おまえ天才だなw

191:デフォルトの名無しさん
09/03/04 15:04:33
結局、月を比較して同月なら日を比較してるだけじゃん

192:デフォルトの名無しさん
09/03/04 15:11:11
>>191
何を言っているんだ?

193:デフォルトの名無しさん
09/03/04 15:13:56
さすがC#スレ
レベルが低すぎる
日曜プログラマならぬなんちゃってぷry

194:デフォルトの名無しさん
09/03/04 15:23:20

int ydiff = dt1.Year - dt2.Year;
if (dt1.AddYears(-ydiff).CompareTo(dt2) < 0) { ydiff--; }



195:デフォルトの名無しさん
09/03/04 15:24:52
どうみても算数や数学の問題だろう。
極論を言えば、
1+2+4+8+16+32+.................+1024を求めるときに、
思考を放棄している人間はそのまま足していくか諦める。
思考する人間は、
S=1+2+..........+1024とおいて、
2*S = 2+4+........+2048との差を求めることで和を得る。
これは別に学校で等比級数の公式を習ったかどうかという問題ではない。

>>140で答えが出ているのに、>>143みたいな思考を放棄したプログラマは考えもせずただ

>正確には月を比較して、同月なら日を比較して、年の差から年齢を求めるが正しい気がする。
こんなことを言い出す始末。
これは上の問題で言えばそのまま足していく人間だと言うことだよ。

プログラマだったら便利なメソッドが用意されてなかったら自分で考えて作るくらいのアタマが欲しいところだ。

196:174
09/03/04 15:42:06
アッカーマン関数の話だけど、
・同じ行では左側(nが小さい方)しかか参照しない
・上(mが小さい方)の列程計算可能な行(n)は多い
なので、再帰を使わずに、表の参照と捉えた方が良い。
そうしないと、同じ枡を何度も無駄に計算する事になる。

List<List<int>> Ack = new List<List<int>>();
とか作って、
            const int maxN = 100000;
            int m = 0, n = 0;
            while (true) {
                Ack.Add(new List<int>());
                n = 0;
                while (true) {
                    try {
                        if (n > maxN) throw new Exception();
                        if (m == 0) {
                            Ack[m].Add(n + 1);
                        } else if (n == 0) {
                            Ack[m].Add(Ack[m - 1][1]);
                        } else {
                            Ack[m].Add(Ack[m - 1][Ack[m][n - 1]]);
                        }
                        n++;

197:デフォルトの名無しさん
09/03/04 15:42:47
                    } catch {
                        Console.WriteLine("for m=" + m.ToString("0")+ " calculation is terminated at n=" + n.ToString("0") + ".");
                        break;
                    }
                }
                if (Ack[m].Count == 0) break;
                m++;
            }
ってやれば、再帰は必要ない。再帰ではなく、表の参照だと考えて、
各枡の値を計算するにはどの枡の情報が必要かを考える。

環境によってmaxNを色々変えるとベンチマークにもなるかも。

198:デフォルトの名無しさん
09/03/04 16:06:39
>>192
構造上、比較の優先順構造が桁の上下に投射されているだけだという話だろ

199:デフォルトの名無しさん
09/03/04 16:14:13
ASP.NET でC#使ってます。VS2008。
Default.aspxが呼ばれたときに
それがWebClientからの要求かブラウザからの要求かを
見極める方法はありますか?
WebClientからの要求がTrueでその他はFalseと判断したいです。
ブラウザプロパティを見てみると
WebCleintの場合は"Unknown"と出るんですが、
新しいブラウザが開発されたらUnknownになるかなと思ったんです。
QueryStringによる判断は不可です。
ブラウザで直打ちされたらtrueになるので。
どなたかよろしくお願いします。

200:デフォルトの名無しさん
09/03/04 16:33:00
HTTPリクエストヘッダなんかいくらでも詐称できる

201:デフォルトの名無しさん
09/03/04 16:36:26
>>188
言ってることはわかるし、凄いとも思うんだが、C#のコードで表現すると
さほどシンプルでもないんじゃね。
int age = ((today.Year * 10000 + today.Month * 100 + today.Day)
  - (birthday.Year * 10000 + birthday.Month * 100 + birthday.Day)) / 10000;



202:デフォルトの名無しさん
09/03/04 16:41:10
>>195
「引き算」と書かれてそれを鵜呑みに信じることこそが、真の思考を放棄していないプログラマなんだな。
楽だな。

203:デフォルトの名無しさん
09/03/04 16:44:54
>>201 引き算だってC#で書けるだろ。
>>188はyyyyMMddを引き算すればいいじゃんってことを言っているわけで
わざわざ>>201みたいなコード書く必要ないよ、ってことだよ。
どう考えても>>188がシンプルで >>188の勝ちであることは否めない。
君の負け。

204:デフォルトの名無しさん
09/03/04 16:46:16
>>201
年未満の線形性を切り捨てる代わり、うるう年を考えなくてもいいというのが利点

205:デフォルトの名無しさん
09/03/04 16:48:17
勝ちとか負けとかガキかよw

206:デフォルトの名無しさん
09/03/04 16:48:46
>>203
yyyyMMddをどこから持ってくるかという話でしょ。
intで定義されてるなら>201みたいな操作が必要だし、
Stringでとるならそれでもいいし。

207:デフォルトの名無しさん
09/03/04 16:53:17
>>202
そんな悪態ついてないで素直になれよ。
最も合理的な解決策を見つけるのもプログラマの仕事ってことを言ってるんだろ。
それが積もってパフォーマンスに影響してくるんだからさ。
悔しいのは分かるけど、プライドでプログラムやるもんじゃない。


208:デフォルトの名無しさん
09/03/04 16:57:00
>>206 どこから持ってくるも何も
int.Parse(DateTime.ToString("yyyyMMdd"))
とかでいいじゃん。Convert.ToInt32でもいいよ。


209:デフォルトの名無しさん
09/03/04 16:57:31
>>203
で、コードは?

210:188
09/03/04 16:57:41
>>201
なんだその糞コードは・・・

int nToday = int.Parse(today.ToString("yyyyMMdd"));
int nBirthday = int.Parse(birthday.ToString("yyyyMMdd"));

int age = nToday - nBirthday;

どうみてもシンプルだと思うが。。。
スレ住人のセンスを疑うな・・・

211:デフォルトの名無しさん
09/03/04 16:59:50
日付→文字列→数値と変換するオーバーヘッドを気にする俺は古い人間なのか?

212:デフォルトの名無しさん
09/03/04 16:59:51
>>209
そんなコードも考えられないようなお前の脳みそを疑うよ・・・

213:デフォルトの名無しさん
09/03/04 17:00:21
>>207
「引き算」と言われて何も疑わず信じることが思考停止でなくてなんなんだ?

214:デフォルトの名無しさん
09/03/04 17:01:59
>>210
完全にトドネト脳だな

215:デフォルトの名無しさん
09/03/04 17:02:07
int.Parse(DateTime.ToString("yyyyMMdd"))
これだけの操作の裏で、どれだけ複雑な操作が行われているか想像できない方が
プログラマとして不適格だろ。

216:デフォルトの名無しさん
09/03/04 17:04:18
>>213
必死だなお前w
「引き算」と言われて、>>143みたいに
「引き算だとうるう年とかあるからダメだぜ?分かってねぇなあ。俺みたいにきちんとやるのが正しいんだよ!」
というような、
自分のやり方が一番正しいとして他人の意見をくみ取りもしないことが思考停止って言ってんの。

217:デフォルトの名無しさん
09/03/04 17:06:43
>>207
>正確には月を比較して、同月なら日を比較して、年の差から年齢を求めるが正しい気がする。

>20090304 - 19870305 = 219999
はやり方が違うだけで言ってることは同じ。

下4桁の引き算がif (d1.Month > d2.Month || (d1.Month == d2.Month && d1.Day >= d2.Day)) にあたり、
その結果、単に引くだけか、-1するかの違いだからな。

218:デフォルトの名無しさん
09/03/04 17:07:49
雑談はよそでやれよ

219:デフォルトの名無しさん
09/03/04 17:08:04
>>211
気になったら後でリファクタリングすればいい
まあある程度の規模になるなら、線形性がないという問題を抱え込んだままにしておくのは怖いが。

220:デフォルトの名無しさん
09/03/04 17:08:10
>>213 お前プライドの塊だな。めんどくさいやつだな。

221:デフォルトの名無しさん
09/03/04 17:09:45
>>216
だからその結果が正しいかどうかを疑わず信じろというのは思考停止だろ?
本当にそれで可能かどうか検討もせず受け入れるのが思考停止でなくてなんなんだ?

222:デフォルトの名無しさん
09/03/04 17:11:12
>>216 結果が正しいかどうかはデバッグすればわかるだろ・・・
頭悪すぎるぞこいつ・・・。

223:222
09/03/04 17:12:02
間違えた
×>>216
>>221


224:デフォルトの名無しさん
09/03/04 17:13:12
>>223
>結果が正しいかどうかはデバッグすればわかるだろ・・・
この時点で正しいかどうか疑ってるからデバッグするわけだろ?
思考停止じゃないじゃん。


225:デフォルトの名無しさん
09/03/04 17:14:51
年齢計算で、閏年はどうなるんだ?と考えるのは当然だよな。
盲目的に受け入れるほうがおかしい。

226:デフォルトの名無しさん
09/03/04 17:15:30
>>210
>>194のほうがシンプルじゃないかい?
そのままだと2月29日と2月28日を比較したときに、
2月29日の時刻が比較対象より前だと間違いになるので、
(そもそも時刻成分を考慮する必要がない気がするけど念のため)
ちょっと修正して:

int ydiff = dt1.Year - dt2.Year;
if (dt1.AddYears(-ydiff).Date.CompareTo(dt2.Date) <
0) { ydiff--; }



227:デフォルトの名無しさん
09/03/04 17:18:32
馬鹿にされた文系プログラマがわんさか湧いててワロスwww

>年齢計算で、閏年はどうなるんだ?と考えるのは当然だよな。
うん

>盲目的に受け入れるほうがおかしい。
うん、だから「閏年を考慮したら引き算ではつじつまが合わなくなる」という
自分の意見が正しいという意見を盲目的に信じるのはおかしいよな?

228:デフォルトの名無しさん
09/03/04 17:20:16
Func<DateTime, int> hoge = (x) => int.Parse(x.ToString("yyyyMMdd"));
return (hoge(to) - hoge(from)) / 10000;

Func<DateTime, int> hoge = (x) => x.Year * 1000 + x.Month * 100 + x.Day;
return (hoge(to) - hoge(from)) / 10000;


たいしてかわらん。

229:デフォルトの名無しさん
09/03/04 17:21:18
>>227
そこから検算してああ正しいんだなと理解すれば問題ないじゃんw
言われてはいそうですかじゃアホだろ

230:デフォルトの名無しさん
09/03/04 17:23:29
おいおい、なんでこんな厨臭くなってるんだw
初心者スレで言い合いすんなよガキだな

231:デフォルトの名無しさん
09/03/04 17:24:57
エレガントな解を示したつもりが、あまり賞賛されなかったので拗ねているんです。

232:デフォルトの名無しさん
09/03/04 17:27:15
結局>>217が真理
計算方法が違うだけで意味はどちらも同じ

233:デフォルトの名無しさん
09/03/04 17:34:10
意味がどちらも同じなのはみんな分かってるよ。
今話題になっているのはコードの美しさと可読性だろ?
俺は少なくとも>>148>>228みたいなコードを見比べたら、
>>228の方がデキるプログラマって感じがするけどな。

234:デフォルトの名無しさん
09/03/04 17:36:56
>>233

>>148が文系プログラマ、>>228が理系プログラマですね、わかります。

235:デフォルトの名無しさん
09/03/04 17:38:55
ラムダ式って美しいんですか?(スマートな解という意味で)
美しいなら勉強するよ!

236:228
09/03/04 17:40:31
× x.Year * 1000
○ x.Year * 10000

プギャー(AAry

237:デフォルトの名無しさん
09/03/04 17:46:46
>>235
ぼちぼち美しい

238:デフォルトの名無しさん
09/03/04 17:54:00
動的に処理を差し替えるような必要があればラムダ式は有効だけど
>>228のケースでは意味がないな。違いはメソッドより効率が悪いこと。
長くなるのを避けてるだけだと思う。

239:デフォルトの名無しさん
09/03/04 18:06:02
>>235
まあ>228レベルならC的関数定義の別の書式に等しい。
マ的には現代的関数型言語みたいに、ラムダ計算後にインライン化とか末尾最適化が言語で保障されているなら嬉しいけど。

240:デフォルトの名無しさん
09/03/04 18:18:54
知識はあってもかしこくない
だめだこりゃ
関数がいやならC#やるな

241:デフォルトの名無しさん
09/03/04 18:31:11
どこをどう読んだら誰が関数が嫌なんて言ってるように見えるんだろう

242:デフォルトの名無しさん
09/03/04 18:48:32
ラムダ式は超美しい。

243:デフォルトの名無しさん
09/03/04 18:54:43
どうでもいいよ

244:174
09/03/04 18:56:15
みんなー、アッカーマン関数の話しようぜー。
>>174のコードだと、m=0, n=int.MaxValue-1みたいなケースが計算できない
のが嫌だ。ていうかそもそもの問題は多分アッカーマン関数の表を一気に計算する
コードじゃなくって、与えられたm,nに対してアッカーマン関数の値を計算するコード。

なので、>>187のスタック使ってヒープを使って再帰する方法と、ハッシュ使って
計算済みの値を再利用する方法を組み合わせたアプローチにしてみた。値を再利用
するので、表を生成する用途でも有効。

うちの環境(メモリ1GB)では
m=0でn=int.MaxValue-1まで
m=1でn=10000000くらいまで
m=2でn=5000000くらいまで
m=3でn=20まで
m=4でn=1まで
計算できた。

スレの空気読まずにコードアップするぜ!
        static Dictionary<int, Dictionary<int, int>> Ack
          = new Dictionary<int Dictionary<int, int>>();
        static Stack<int> argM = new Stack<int>();
        static Stack<int> argN = new Stack<int>();
        static int Ackermann(int m, int n)
        {
            argM.Clear();
            argN.Clear();
            argM.Push(m);
            argN.Push(n);
            while (argM.Count>0) {

245:174
09/03/04 18:57:14
                if (!Ack.ContainsKey(argM.Peek())) Ack[argM.Peek()] = new Dictionary<int, int>();
                if (Ack[argM.Peek()].ContainsKey(argN.Peek())) {
                    argM.Pop();
                    argN.Pop();
                    continue;
                } else {
                    int value;
                    if (argM.Peek() == 0) {
                        value = checked(argN.Peek() + 1);
                    } else if (argN.Peek() == 0) {
                        if (Ack.ContainsKey(argM.Peek() - 1) && Ack[argM.Peek() - 1].ContainsKey(1)) {
                            value = Ack[argM.Peek() - 1][1];
                        } else {
                            argM.Push(argM.Peek() - 1);
                            argN.Push(1);
                            continue;
                        }
                    } else {

246:デフォルトの名無しさん
09/03/04 18:58:25
アッカーマン関数なんて使わないし

247:174
09/03/04 19:00:46
                        int n_;
                        if (Ack.ContainsKey(argM.Peek()) && Ack[argM.Peek()].ContainsKey(argN.Peek() - 1)) {
                            n_ = Ack[argM.Peek()][argN.Peek() - 1];
                        } else {
                            argM.Push(argM.Peek());
                            argN.Push(argN.Peek() - 1);
                            continue;
                        }
                        if (Ack.ContainsKey(argM.Peek() - 1) && Ack[argM.Peek() - 1].ContainsKey(n_)) {
                            value = Ack[argM.Peek() - 1][ n_];
                        } else {
                            argM.Push(argM.Peek() - 1);
                            argN.Push(n_);
                            continue;
                        }
                    }

248:デフォルトの名無しさん
09/03/04 19:01:34
                    Ack[argM.Pop()][argN.Pop()] = value;
                    continue;
                }
            }
            return Ack[m][n];
        }
終わり。Ackermann(3,20);あたりで速さが実感できるぜ!。
あと、>>244の「>>174のコード」ってところ、アンカーミスで>>196のコードね。

>>246
>>173を思い出してあげてください。

249:デフォルトの名無しさん
09/03/04 19:08:28
Dictionary<int, Dictionary<int, int>>は効率悪いな
struct Key { public int M; public int N; public override int GetHashCode() { return M ^ N } }
こういうのをキーにしたらDictionary<Key, int>で済むのに

250:デフォルトの名無しさん
09/03/04 19:15:09
>>249
一般にはそうだろうけど、そもそも話題がアッカーマン関数だから、
mはどうせ0から5くらいまでしかとらないんだよね。だから別に
これでかまわないんじゃないかな。

あと、ハッシュ値の衝突って詳しくないんだけど、そういう衝突しまくる
ハッシュ関数って効率はどうなっているの?

251:デフォルトの名無しさん
09/03/04 20:49:39
ファイルを選択して、それを別のコンソールプログラムに読み込ませて
その結果の出力(文字列)を別ウィンドウに表示したいのですが、どうやればいいですか?
ファイル選択まではいいのですが、別のプログラムを起動してそいつに引数を
渡すにはどうすればよいですか?



252:デフォルトの名無しさん
09/03/04 20:51:32
Process

253:デフォルトの名無しさん
09/03/04 20:52:30
>>251
Process のヘルプをじっくり見る。

254:デフォルトの名無しさん
09/03/04 21:12:30
>>228はマイナスの年齢が出るから間違いだろそもそも

255:デフォルトの名無しさん
09/03/04 21:22:08
>>238
別にメソッドと比べて効率悪くならないよ。

モノホンのラムダ式であるリスト構造に基づく関数定義から
実行時に動的にメソッドを生成する、なんて事は行われていない。

匿名メソッドの名前どおり、コンパイル時にコンパイラが勝手な
メソッド名を割り当ててメソッドを作る。自分でメソッド定義する
のと何も違いはない。


256:デフォルトの名無しさん
09/03/04 21:27:19
デリゲート呼び出しが入る
最適化もできなくなるから使い方にもよるけど多かれ少なかれ確実に遅くはなる
その小さい差の意味は置いといて

257:デフォルトの名無しさん
09/03/04 21:31:18
まじ?>>228のhoge(ほにゃらら)みたいなのって、匿名メソッドの呼び出し
として最適化されるんじゃなくて.Invokeされちゃうの?

ちょっとリフレクタで確かめてみる。

258:デフォルトの名無しさん
09/03/04 21:39:14
ほんとだ。C時代のプリプロセッサマクロに代わる、スコープがあって上位スコープ
にアクセスできる素性の良いマクロとして利用する事がたびたびあったから、
ちょっとショック。

259:デフォルトの名無しさん
09/03/04 21:52:18
>>251
P/Invokeを駆使して共有メモリ経由でやりとりする。
{Tcp,Http,Ipc}Channelクラスを使って通信する。
特定の位置にファイル作って監視させる。
アプリケーション構成ファイルを動的に書き換えて起動する。
ProcessStartInfo.Argumentsを設定してProcessオブジェクトのStartを呼ぶ。
Process.Start(string,string)を呼ぶ。

260:デフォルトの名無しさん
09/03/04 23:01:02
>>259
何故難しい順に書く・・・

261:デフォルトの名無しさん
09/03/04 23:06:21
理系プログラマだからさ

262:デフォルトの名無しさん
09/03/04 23:10:49
かっこいい

263:デフォルトの名無しさん
09/03/04 23:15:38
VS2005を使っているのですが2008にすると
C#3.0とかになっちゃうの?
今まで2005で作ったプログラムって2008でも修正可能なんでしょうか?
.NET2.0用で作ってたのが.NET3.5になっても無問題?

264:デフォルトの名無しさん
09/03/04 23:18:25
>>263
> VS2005を使っているのですが2008にすると
> C#3.0とかになっちゃうの?

も、使える

> 今まで2005で作ったプログラムって2008でも修正可能なんでしょうか?

可能

> .NET2.0用で作ってたのが.NET3.5になっても無問題?

没問題

というか、.NET 3.5 って、.NET 2.0 上で動作する拡張なだけだから。

265:デフォルトの名無しさん
09/03/04 23:19:44
>>263
C# 3.0 になる。
2005 → 2008 へのプロジェクトのアップグレードで失敗したって話は見たことも聞いたこともない。
.NET 2.0 が 3.5 になっても問題ない。

266:デフォルトの名無しさん
09/03/04 23:34:30
170-172
今夜も試行錯誤:
Windows認証で
環境(Vista アルティメット) <=  (ヴァーチャルPC Xp home)

Data Source=192.168.1.1\SQLEXPRESS
これでも
11433\OTHERINSTANCE
これでもダメでしたが
SQL Server 2005 に接続しているときときにこのエラーが発生した場合は、
SQL Server の既定の設定がリモート接続を許可しないようになっていることが
エラーの原因である可能性があります。
(provider: TCP プロバイダ, error: 0 - 対象のコンピュータによって拒否されたため、接続できませんでした。)

セキュリティー構成は、サービスと接続のセキュリティ構成-リモート接続-ローカル及びリモート接続

●TCP/IP および名前付きパイプ・・・
にチェックは言っているんですけどねー

まだまだ頑張る・・・応援よろしく


267:デフォルトの名無しさん
09/03/04 23:49:24
>>263
ただ、Windows2000は.Net2.0までしか入らないから
その辺のサポートするならVS2008にしても.Net2.0で作り続ける必要がある。

プロパティ打つのがたるいし型推論も使えない。。orz

268:デフォルトの名無しさん
09/03/04 23:53:50
>>266
まず、MSSQLSMSEで、IPアドレスで接続できるかどうか試してみれよ
サーバ名にIPアドレス、認証はSQL認証で、設定したアカウントを設定しれ。

269:デフォルトの名無しさん
09/03/05 00:03:50
MSSQLSMSE<<とりあえず ぐぐってみる・・・・
まだまだ ど素人だな俺って・・・


270:デフォルトの名無しさん
09/03/05 00:06:21
やっぱりC#使う場合はDBをSQLServerにすることが多い?

271:デフォルトの名無しさん
09/03/05 00:15:47
269だけど
Accessとかもありじゃないでしょうか
おいらはAccess買えない貧乏仕様
定額給付でSqlServer2008でも買うか…

272:デフォルトの名無しさん
09/03/05 00:18:02
実行後に実行プログラム自身を削除するのってどうすればいいですか?

273:デフォルトの名無しさん
09/03/05 00:22:44
SQL Server 2008 Expressでいいんじゃないの?
無料だし、商用にも使えるし

274:デフォルトの名無しさん
09/03/05 00:23:51
実行プログラムを実行して削除するプログラムを作る

275:デフォルトの名無しさん
09/03/05 00:25:34
>>267
.NETとC#のバージョンがごっちゃになってないか?

276:デフォルトの名無しさん
09/03/05 00:29:01
>>267
varはコンパイラの機能だから.NET Framework 2.0対象でも使えるはずだよ。

277:デフォルトの名無しさん
09/03/05 00:33:50
>>268
なんかちょっとわかった!^^進展してないけど明日チャレンジします
ね・・・ねむけが

278:267
09/03/05 00:38:45
あ!そうかも。
LINQが参照できなくて色々できないあたりから
色々思考停止してる。さんくす!

279:デフォルトの名無しさん
09/03/05 00:42:06
ILのレベルでは何も代わっていないのだから、3.5で追加されたクラスライブラリを
使っているかどうかだけが問題なのだと思う。

Linq to ObjectはSystem.Linq.Enumerableクラスの拡張メソッドだから
.NET3.5専用。

でも、拡張メソッド機能自体は、.NET2.0でも使える(多分)、など。
型推論も自動プロパティも匿名メソッドも全部.NET2.0で使えるんじゃないかな(未確認)。

280:デフォルトの名無しさん
09/03/05 00:46:27
>>279
ラムちゃんは?

281:デフォルトの名無しさん
09/03/05 00:50:26
>>279
拡張メソッドは構文糖じゃないし、専用のアトリビュートが必要なのでダメでせう

282:デフォルトの名無しさん
09/03/05 00:55:11
拡張メソッドは構文糖だよ。

283:デフォルトの名無しさん
09/03/05 00:58:43
今日日何が糖衣構文とそうでないものの境界もあいまいな気もする。
糖衣というより、コンパイラが提供する機能と言った方が適切じゃないのか

284:デフォルトの名無しさん
09/03/05 00:58:56
>>252-253
ありがとうございます。出来たのですが、コマンドプロンプト内に表示される出力内容を
取得できません。どうやればいいですか?


285:デフォルトの名無しさん
09/03/05 00:59:02
>>280
        delegate int delTest(int i);
        static void Main(string[] args)
        {
            delTest a = i => i + 1;
            Console.WriteLine(a(3).ToString());
        }
は2.0で通った。
あと、Func<T>(というかSystem.Core.dll)は3.5だけどAction<T>は2.0かららしい。


286:267
09/03/05 01:02:19
やあ。期待に膨らんだ胸がしぼみつつあるよ。

×var
×配列の暗黙的な初期化
○自動プロパティ
○コレクションの初期化

ラムダは試すまでもなく。
それでも.Net2.0のまま短縮できる表記が増えた!感謝!

287:285
09/03/05 01:03:39
なるほど、
foo(this IEnumerable boo){
}

foo([System.Runtime.CompilerServices.ExtensionAttribute] IEnumerable boo){
}
と等価で、System.Runtime.CompilerServices.ExtensionAttributeは
3.5からなんだね。


288:デフォルトの名無しさん
09/03/05 01:07:03
varって何が原因でいけないの?

289:デフォルトの名無しさん
09/03/05 01:07:55
いないいない

290:285
09/03/05 01:07:58
>>286
        static void Main(string[] args)
        {
            List<int> a=new List<int>(){1,2,3,4,5};
            foreach (var i in a) {
                Console.WriteLine(i.ToString());
            }
        }
は通ったけど。

自分、279ですが、やっぱ基本的な基準は>>279でしょう。

291:267
09/03/05 01:18:45
スマソ。今まで1度も使ったことなかったので、
そもそもvarがローカル変数のみに有効ということを知らなかった。
メンバで試してエラーが出たのでダメと判断してた。
色々勉強になった、ありがとう。

292:デフォルトの名無しさん
09/03/05 01:21:36
varはVBのvariantと違うんだ。他の変数同様に厳密な型付けはされる。

型推論によって型を明示しなくてもコンパイラがわかってくれるという
場合にだけ有効。

293:デフォルトの名無しさん
09/03/05 01:25:05
IDEが優秀であれば問題ないかもしれんが、
紙で見てる分にはvarじゃ何の変数だかわからんので困らんのかな

294:デフォルトの名無しさん
09/03/05 01:30:49
紙で見るとかw

295:デフォルトの名無しさん
09/03/05 01:31:12
>>293
まあ、var にして型が何か分かりにくくなるようならやっぱ使わない方がいいと思う。


296:デフォルトの名無しさん
09/03/05 01:35:32
少なくともwebや解説本、MSDNのサンプルプログラムで書かれてたらえらい迷惑

297:デフォルトの名無しさん
09/03/05 01:41:08
.NET2.0の範囲で使えるC#3.0
推論型、匿名型, 暗黙型付け配列
コレクションのイニシャライザ、オブジェクトのイニシャライザ
パーシャルクラス、パーシャルメソッド
自動プロパティ、ラムダ式

.NET3.xが必要になる機能
ラムダ式でFunc<>, Expression<>を使用
LINQクエリ式他
拡張メソッド

>>281
拡張メソッドが使えないのはExtensionAttributeが3.5に含まれるから。
という事で、System.Runtime.CompilerServices.ExtensionAttributeを自分で定義してやれば2.0でも使える。
インテリセンスにゃ出ないけど、まぁそのくらいは我慢できるだろう。

298:デフォルトの名無しさん
09/03/05 01:45:39
>>拡張メソッド、Func<>
ぶっちゃけSystem.Core.dllをローカルコピー=trueにして参照しちゃえば良いんじゃ・・・


299:デフォルトの名無しさん
09/03/05 02:01:05
>>297
なんで必死なのかわからない

300:デフォルトの名無しさん
09/03/05 02:10:52
>>299
なんで必死なのかわからない

301:デフォルトの名無しさん
09/03/05 02:16:06
>>299
>>300
これだから文系は

302:デフォルトの名無しさん
09/03/05 02:22:34
>>301
なんで必死なのかわからない

303:デフォルトの名無しさん
09/03/05 02:34:48
ど、ど、ど童貞ちゃうわ!

304:デフォルトの名無しさん
09/03/05 02:36:07
>299-303の話の流れがさぱりわからないんだが・・・

305:デフォルトの名無しさん
09/03/05 02:41:10
触るな危険。放っておけ

306:デフォルトの名無しさん
09/03/05 02:41:58
>>305
なんで必死なのかわからない

307:デフォルトの名無しさん
09/03/05 02:51:15
>>306
これだから文系は

308:デフォルトの名無しさん
09/03/05 02:51:58
>>307
なんで必死なのかわからない

309:デフォルトの名無しさん
09/03/05 02:53:10
>>308
↓文系

310:デフォルトの名無しさん
09/03/05 02:59:54
>>309
なんで必死なのかわからない

311:デフォルトの名無しさん
09/03/05 03:00:42
OpenFileDialogでファイルを選択して、コンソールプログラムの引数に与えて実行しようとしています。
ファイルのパス名に空白が含まれるときは、どうすればいいですか?


312:デフォルトの名無しさん
09/03/05 03:08:23
>>311
ダブルクォーテーション?

↓文系

313:デフォルトの名無しさん
09/03/05 03:09:15
>>312
なんで必死なのかわからない



314:デフォルトの名無しさん
09/03/05 03:15:02
変数に入ってるので、ダブルクォーテーションができないみたいなんですが、、
こんな感じ。
String s = OpenFileDialog.FileName;
ProcesStartInfo.Arguments = s;
こうやって、ProcessをStartすると、ファイル名のパスに空白があるとそこで引数が終わりと判断されてしまいます。


315:デフォルトの名無しさん
09/03/05 03:24:46
その変数を括ったらどうなる?

316:デフォルトの名無しさん
09/03/05 03:26:11
>>315
なんで必死なのかわからない


317:デフォルトの名無しさん
09/03/05 03:27:35
String s = "\""+OpenFileDialog.FileName+"\"";

318:デフォルトの名無しさん
09/03/05 03:28:59
えー、括ったら単なる文字列になってしまいませんか?
やってみたら、Visual Studioの作業ディレクトリ+"s"というファイル名
をオープンしようとして失敗する、という結果でした。

319:デフォルトの名無しさん
09/03/05 03:30:49
>>318
>>317のように、文字列として括れってこと

320:デフォルトの名無しさん
09/03/05 03:31:21
>>319
なんで必死なのかわからない

321:デフォルトの名無しさん
09/03/05 03:31:28
>>317
できました!
なるほど、そうやるんですか。
ありがとうございました。

322:デフォルトの名無しさん
09/03/05 03:34:04
なんで荒らしがわいてんだ?

323:デフォルトの名無しさん
09/03/05 03:35:05
>>322
なんで荒らしがわいてんのかわからない

324:デフォルトの名無しさん
09/03/05 03:36:49
>>322
自称エレガントな解法を示したつもりが、
誰にも相手にされなかった可哀想な一般人らしい

325:デフォルトの名無しさん
09/03/05 03:38:30
>>324
なんで必死なのかわからない

326:デフォルトの名無しさん
09/03/05 03:41:02
>>324
とりあえずNG登録だな
番号飛ぶけど

327:デフォルトの名無しさん
09/03/05 03:42:19
日曜プログラマ、まだ粘ってたんか

328:デフォルトの名無しさん
09/03/05 03:44:14
なんで文系という言葉に反応するんだろう?

329:デフォルトの名無しさん
09/03/05 03:45:51
>>325
>>326
>>327
>>328
これだから文系は

330:デフォルトの名無しさん
09/03/05 03:48:55
いいえ短小包茎です

331:デフォルトの名無しさん
09/03/05 03:51:50
string.Format("\"{0}\"", path);

332:デフォルトの名無しさん
09/03/05 07:26:57
ToolStripMenuItem で選択後、自動で閉じないようにしたいのですが
どうしたらいいのですか?



333:デフォルトの名無しさん
09/03/05 09:37:28
その奇抜なUIの設計思想を変える

334:デフォルトの名無しさん
09/03/05 10:08:16
自分でパネルにでもラベルとか作って完全に自作して実装すれば?

というかクリックして閉じないとか・・・どうやって閉じるんだ?
Windowsライクな実装の方が使い手も違和感ないと思うんだけど?

335:デフォルトの名無しさん
09/03/05 11:03:21
継承してWndProcをフックすればいけそうな気はする


336:デフォルトの名無しさん
09/03/05 11:23:00
DataGridViewにDataTableをバインドしています。
DataTableの更新が終わるまで描画処理を止めたいのですが、
ListBoxで言うところのBeginUpdate()のようなメソッドってありますか?


337:デフォルトの名無しさん
09/03/05 11:43:50
データソースをBindingSource使うようにして
RaiseListChangedEventsプロパティで一時的にイベント通知無効化して
最後にResetBindingsで更新

338:デフォルトの名無しさん
09/03/05 11:56:13
>>337
ありがとうございます。試してみます。

339:デフォルトの名無しさん
09/03/05 11:58:30
>>293-296
varの最強の用途は、コレクションの要素の型が分かりづらい場合だろう。
例えば、Dictionaryはキーとアイテムの型パラメタ<foo,bar>をとるけど、
要素型はKeyValuePair<foo, bar>。

そこで、まず、
foreach(var a in dic){
}
って書いてvarにマウスポインタを当てる。すると、ツールチップでaの型が
出てくる。この場合KeyValuePair<foo,bar>。それを書き写して
foreach(KeyValuePair<foo,bar> a in dic){
}
とする。これが最強。

varの存在意義を語って存在意義を否定してしまった。

340:デフォルトの名無しさん
09/03/05 12:00:30
>>339
あれって良し悪しだよな・・・・

341:デフォルトの名無しさん
09/03/05 12:02:58
varを右クリックして「実際の型名に置換」とかできたら、バリバリ使っちゃう。

342:デフォルトの名無しさん
09/03/05 12:04:14
>>341
グッドアイデア!

343:デフォルトの名無しさん
09/03/05 12:05:15
それヘジたんがC#3.0についてのインタビューで言ってたことだけどなぜか実装されなかった

344:デフォルトの名無しさん
09/03/05 12:05:53
リファクタメニューに「ソリューション内のvarを実際の型名に置換」機能があったら、バリバリ使っちゃう。

345:デフォルトの名無しさん
09/03/05 12:08:21
VSってアドイン作れるよね?しかも.NETで。誰か作ってよ。(他力本願)

346:デフォルトの名無しさん
09/03/05 12:10:28
IDEの問題で解決できるなら、入力候補の推測機能ってことで実装すればいいのに。

? total = 0m;

という入力を許可し、;を入力した段階でIDEが?を推論した型に置き換える。
上の例だと、自動的に

decimal total = 0m;

に置き換わる。駄目?

347:デフォルトの名無しさん
09/03/05 12:14:06
型を書くかvarを書くかという極端な判断が必要だから
その場に応じて使い分けるというのがどうしてもしづらいんだよな
var total : decimal = 0m;
はじめからこういうスタイルにしとけば型を省略しても誰も違和感を抱かなかった
今作り直したらこうなりそう

348:デフォルトの名無しさん
09/03/05 12:16:44
なるほど、varを変数宣言の開始句として、:の後に型を書くのか。
で、:を入力した時点でInteliSenseが働くと。

でも、そこを弄ったらもう、"C"#じゃないんじゃ。

349:デフォルトの名無しさん
09/03/05 12:20:23
よし、:はクラスやインタフェースの継承に使うし、最近は冗長でも
IDEの入力支援頼みでコードを英語の文章に近付けるのが流行だから、

var total as decimal=10m;

で行こう。あれ?どっかで見たことあるぞ。

350:デフォルトの名無しさん
09/03/05 12:23:23
varの存在で一歩またVBに近づいた!
閣下、我々の陰謀は成功を収めつつあります。

351:デフォルトの名無しさん
09/03/05 12:24:48
実際その点についてはVBのほうが自然だと思うよ
CスタイルのメリットはCやJavaと同じであることくらい

352:デフォルトの名無しさん
09/03/05 12:29:11
型名 変数名;
って、
Animal dog;
でしょ?どう考えても英文法的におかしい。やっぱり、英文との類似性
よりも構文の単純さやキーワードの短さが尊ばれた時代の名残だよね。


353:デフォルトの名無しさん
09/03/05 12:33:53
でも、VBのdimキーワードも、配列宣言からの流用だったりして
英単語的には怪しかったりする。やっぱキーワードはvarで。


354:デフォルトの名無しさん
09/03/05 12:36:43
省略は良くない
今はIDEがあるのだからvarもvariableにするべきだ

355:デフォルトの名無しさん
09/03/05 12:40:50
define a variable dog which is an Animal and let it be a new instance of Animal whose name is "dog";

356:デフォルトの名無しさん
09/03/05 12:47:22
おいおい、文末はピリオドに決まってるだろ

357:デフォルトの名無しさん
09/03/05 12:50:52
そうすると、フィールド、プロパティ参照のピリオドを取りやめないとな。
let the name of the dog be "ポチ".

358:デフォルトの名無しさん
09/03/05 12:50:54
文頭に挨拶を書くのが礼儀だろ
dear my computer

359:デフォルトの名無しさん
09/03/05 12:57:28
Animal myDog=new Animal("dog");
myDog.name="ポチ";
と以下が等価ってわけですね。こんなのの入力もIDEの支援で余裕だぜ!
Dear my computer. Can you please define a variable myDog
 which is an Animal and let it be a new instance of Animal
 whose speciesName is "dog". And then please let the name
 of the myDog be "ポチ".

360:デフォルトの名無しさん
09/03/05 13:03:34
それじゃ面倒だから、これでいいよ

a d = n a("d")
d.n = "ポ"

361:デフォルトの名無しさん
09/03/05 16:10:12
C#ってC++の一種とかんがえていいの?

362:デフォルトの名無しさん
09/03/05 16:28:10
C++とC#は伯父と甥ぐらいの位置
とても一種とはいえない

363:デフォルトの名無しさん
09/03/05 16:36:58
.NET言語は、CLRありきだから、多言語との親戚関係とかの議論は意味が
ないと思う。とりあえず、C++のサブセットでもスーパーセットでもない。
シンタックスがC由来の別物言語と捉えるべき。

それに、Cを拡張して言語仕様を肥大化させてオブジェクト指向を取り入れる
C++的なアプローチとは違い、JAVAを意識した自由度より構造性を優先させた
言語になっている。そのために、JAVA的な、やりたい事に対して解法が唯一つ的
な部分がある。

のわりに、P/Invokeなど泥臭いアプローチをしてでも自由度を確保する貪欲さもあって、
やりたい事ができないという事態も滅多に生じないようになっている。

良い所だけ挙げるならば、こんな感じでバランスの取れた構造的な言語。

プリプロセッサで変態マクロが定義できるC++なんか、もう見たくもないやい。

364:デフォルトの名無しさん
09/03/05 16:53:35
VSのウイザードで作るCOMやらMFCの雛形はひどかった

365:デフォルトの名無しさん
09/03/05 16:55:21
たまたまwin32のAPIと自分が作った関数名が衝突したので
名前空間で分けたらそれでも衝突して、調べて見たらマクロ定義
だった時の憤りといったら・・・

366:デフォルトの名無しさん
09/03/05 16:57:39
C++でマクロを使う奴は馬鹿

367:デフォルトの名無しさん
09/03/05 18:34:26
だからと言って避けて通れないのがC++のどうしようもない点なわけで。

368:デフォルトの名無しさん
09/03/05 18:38:31
なにしろwin32APIが・・・MFCが・・・

369:デフォルトの名無しさん
09/03/05 18:39:26
過去を引きずるのは大変だねとだけ

370:デフォルトの名無しさん
09/03/05 19:01:25
10の位を切り上げる処理をするのに

y= Math.Ceiling (x / 10) * 10;

と書いてるんですが他にいい書き方とかありますか
括弧の使い方とかなんか不安なんですが・・・

371:デフォルトの名無しさん
09/03/05 19:29:09
>>370
>>210をリスペクトして
y = Int32.Parse(String.Format("{0:d}0", (x + 9) / 10));
とか。

(ごめん、冗談だ、念のため。別に>>370の通りで問題ないよ)


372:デフォルトの名無しさん
09/03/05 19:35:17
xが整数以外なら問題あるでしょ。
っていうか整数なら9足すだけなんだけど。。

さて質問。
Windows Form のOnLoadとか適当な場所に

DayOfWeek[] ar = (DayOfWeek[])Enum.GetValues(typeof(DayOfWeek));
listBox1.DataSource = ar;
comboBox1.DataSource = ar;

のようなコードを書くと、コンボボックスとリストボックスの選択が相互に
連動するんだけど、この仕組みと、こういう仕様の意図が知りたい。

373:デフォルトの名無しさん
09/03/05 19:46:27
データバインディング
GUIなんてデータ表示するだけなんだからわざわざTextだのItemsだの使うより
データを汎用的な形で関連付けられた方がいいよねという考え
カレント行の共有はCurrencyManager使ってコントロールの親子関係に基づいて行われる

374:デフォルトの名無しさん
09/03/05 19:54:30
>>373
ごめん、その思想自体はよくわかるんだけど、知りたいのは
2つのまったく無関係のコントロールの選択されているアイテムが連動する仕組みと、
そのような仕様にしてある意図なんだ。

375:デフォルトの名無しさん
09/03/05 19:56:20
windows formsだとそうなんだ。
WPFの場合
DayOfWeek[] ar = (DayOfWeek[])Enum.GetValues(typeof(DayOfWeek));
list1.DataContext = ar;
list1.SetBinding(ListBox.ItemsSourceProperty, "");
list2.DataContext = ar;
list2.SetBinding(ListBox.ItemsSourceProperty, "");
だと選択行は共有されないね。


376:デフォルトの名無しさん
09/03/05 22:41:17
>>341
>varを右クリックして「実際の型名に置換」とかできたら、バリバリ使っちゃう。

それ似たのがReSharperにあるよ。

377:デフォルトの名無しさん
09/03/05 22:42:44
似たようなのじゃためなんだ
僕らはC#に汚染されているんだ!

378:デフォルトの名無しさん
09/03/05 22:46:21
>>377
ReSharperはVS用のアドインだよ。確か。

まあこちとら趣味プログラマのexpress edition使い。
たっかいツールなんか使う機会なんざねーんだけどね。

379:デフォルトの名無しさん
09/03/06 00:03:40
>>268
ダメポ 続きは明日・・・・

380:デフォルトの名無しさん
09/03/06 00:09:08
ちょっと最後に質問SQL serverでLanやりたい場合一般的にDBの配置は
C:\Program Files\Microsoft SQL Serverの配下ですか?
自分で作ったC:\aaaみたいなフォルダでもいいんですかね・・・・

381:デフォルトの名無しさん
09/03/06 00:21:34
>>380
SQLサーバが自分のPCとは異なるPCにある場合、
c:\とか、ファイルを直接指定することはないよ。

接続する側→(LAN)→接続されるSQLServer

という関係で接続しているとき、
接続する側は、単に接続されるSQLServerのIPアドレス(とインスタンスと接続するDB名)を指定するだけ。
実際の物理ファイルのパス指定は接続されるSQLServerのほうで指定するので、
ConnectionStringでパスを指定することはない。

少なくとも自分が経験したスタンドアロンのSQLではそんな感じ。

382:デフォルトの名無しさん
09/03/06 00:24:32
ASP.NETの話になっちゃうんだけど
Web画面上にあるボタンをクリックするとクリックイベントが走りますよね。
でもWebだとクリックイベントの前にPage_Loadイベントが実行されますよね。
ちょくせつクリックイベントに飛ばす方法はないのでしょうか?
またPage_Loadイベントの処理の中で、Page_Loadイベントを抜けたら
次はクリックイベントが走るよというのを知る方法はありますか?

383:デフォルトの名無しさん
09/03/06 00:52:34
>>382
初期化したいのに、PostBackしたときもPage_Loadが呼ばれるから、
ボタンを押した時はPage_Loadは呼んで欲しくないということだろうけど、
そのためのIsPostBackだから、それで判断すればいいのでは?

ASP.NETの場合は、表示するたびに、そのページの新しいインスタンスが生成される。
これはwebという仕組み上仕方のないことなので、Page_Loadを実行せずに
インスタンスが生成する方法は基本的にはない。
クリックイベントが発生するということは、IsPostBackが必ずTrueだから、
それで判断すれば?

・・という意味でなかったら、contextとかみれば、イベントがあるかどうか
わかったほうほうがあるはず・・

384:デフォルトの名無しさん
09/03/06 10:01:27
>>374
無関係じゃないよ。同じ親コントロールに属して同じデータソースを参照してるじゃん。
無関係だと主張したいなら明示的にしないとだめ(Control.BindingContextプロパティ)。
仕組みはCurrencyManagerとかBindingManagerBaseとか調べれ。
意図? MSの人じゃないから答えられん。
まあ親とデータソースが同じなら現在行共有できた方が便利じゃねと思ったんじゃない?

.NET 2.0になってBindingSourceが追加されてデータソース主導になったけどな。

385:デフォルトの名無しさん
09/03/06 11:57:01
web上にあるファイルのサイズを簡単に取得する方法はありますか。
ダウンロードする前に知りたいのです。

386:デフォルトの名無しさん
09/03/06 12:00:40
簡単かどうかはその人次第だからなんとも
取得方法はそのファイルがどういうプロトコルで公開されているのかによるからなんとも
サイズ情報が公開されているかどうかはサーバ次第だからなんとも

387:デフォルトの名無しさん
09/03/06 12:04:25
HTTPならHEADで返してくれればいいけどな

388:デフォルトの名無しさん
09/03/06 15:00:26
HttpWebResponseのContent-Length
駄目な場合もあるけど

389:デフォルトの名無しさん
09/03/06 17:33:22
匿名メソッドと、ジェネリクス(Listなどのコレクション以外)で
うまいこと使用している例や、より利点がわかりやすく紹介されている
サイトがあったら教えてください教えてください。

390:デフォルトの名無しさん
09/03/06 17:43:46
>389
宿題?

391:デフォルトの名無しさん
09/03/06 17:49:54
MSDNでいいんじゃね?

392:デフォルトの名無しさん
09/03/06 18:06:45
匿名メソッドは自分だけが見るソースなら短いイベントハンドラの
定義に使うけど、推奨はできないなあ。

Button1.Click+=delegate{MessageBox.Show("Clicked!");};

とか。

処理の一部をカスタムできるメソッドを作るために使う例を
示せれば良いんだけど、できるだけLINQとか標準機能に落とし
込むようにしているので良い例がない。

ジェネリクスはやっぱり、独自のコレクションを作るとかが
多いんじゃない?

あと、幾つかデータの種類があって、それらのデータが更新された
時に更新値を受け取るコールバックを登録するメソッドが、
データの型をパラメタにとるジェネリックメソッドになっていた
のを見た事ある。でもこの場合、データの種類毎にメソッドを
用意するのと比べた場合の利点がさっぱり分からないコードだった。

393:デフォルトの名無しさん
09/03/06 18:17:46
Regex.Replaceなんかまさに匿名メソッドとかラムダ式の出番

394:デフォルトの名無しさん
09/03/06 19:08:52
>>390
宿題ではないです。

>>391
MSDNではサンプルが少ないのと、こういう時に使うと便利というのが、
イマイチよくわからないので。イベント的なコールバック用途というのは
意味はわかります。

>>392
ありがとうございます。
なるほど。自分も匿名メソッドにあまり利点を見いだせない一人です。
そのためサンプルがみたいと思ったのですが、
いいものがないということで残念です。

ジェネリクスもやはり独自コレクションがメインですか・・
コレクション以外の便利な使い方がイマイチ思いつかないので、
サンプルをお聞きしました。

395:デフォルトの名無しさん
09/03/06 19:30:11
前に複素数のジェネリック型なんて議論されていたよね。
それは特殊でかつ有用な使い方なんじゃないかな。

396:デフォルトの名無しさん
09/03/06 20:34:37
別に無理に利点を発見する必要は無いんじゃないの

必要に迫られたら使えばいい程度のものじゃないかね

397:デフォルトの名無しさん
09/03/06 21:38:25
System.Linq.Enumerableで嫌と言うほど出てくるよ
結局はコレクション操作だから微妙だけどな
くだらない例だけどEventHandler<TEventArgs>とか

398:デフォルトの名無しさん
09/03/06 21:49:34
Hoge a = 共通の前処理();
//aを使った固有の処理
共通の後処理(a);
こういうのが各所に出てきたから
void 共通の処理(Action<Hoge> action) { Hoge a = 共通の前処理(); action(a); 共通の後処理(a); }
こんなメソッドを定義して
共通の処理(a => { /*aを使った固有の処理*/ });みたいにしたことがある

399:デフォルトの名無しさん
09/03/06 21:56:13
>>394
・とくめいめそっど
Win Forms やら WPF の非同期部分で大活躍?

・じぇねりくす
基本、型を爆発させないためにある。これを踏まえると
Func<T> とかなかなかに便利な使い方じゃないか?

400:デフォルトの名無しさん
09/03/06 22:02:27
class HogeCache<T> { public static readonly Hoge Hoge = new Hoge(typeof(T)); }
これだけで型ごとに対応するインスタンスのキャッシュが作れる
Dictionary<Type, Hoge>使うよりも遥かに効率がいい
Comparer<T>.DefaultやEqualityComparer<T>.Defaultなどで使われてるパターン

401:デフォルトの名無しさん
09/03/06 22:19:30
>Button1.Click+=delegate{MessageBox.Show("Clicked!");};
こういう使い方って何でするんですか?
デザイン画面でボタンをダブルクリックするとクリックイベントのソースが出てきますが
そこにMessageBox.Show("Clicked");って記述すればいいと思っちゃうんだけど
わざわざこのように書く理由を教えてください。


402:デフォルトの名無しさん
09/03/06 22:21:19
短く書けるからって言ってんじゃん。アホかよ。

403:デフォルトの名無しさん
09/03/06 22:21:48
それだけかよw糞じゃん。

404:デフォルトの名無しさん
09/03/06 22:22:19
だから推奨はできないって言ってるだろw

405:デフォルトの名無しさん
09/03/06 22:24:25
糞すぎじゃん。
何でこんな機能つけたんだ。

406:デフォルトの名無しさん
09/03/06 22:26:37
つLINQ
ラムダ式で同じことがもっと簡潔に書けるから匿名メソッドは不要になった
そのうち非推奨だとコンパイラが警告出すようになってもおかしくない

407:デフォルトの名無しさん
09/03/06 22:28:19
状態によって、異なるクリックイベントを割り当てるのに便利かも。

状態をどこかのメンバ変数に保存して、同じメソッド内でメンバ変数の値によって分岐させるより、
処理そのものを差し替える感じ。
特に汎用できて処理を委譲できる場合なら尚更。

408:デフォルトの名無しさん
09/03/06 22:30:25
C#3.0以降なら
Click += (sender, e) => { MessageBox.Show("Clicked!") };
と書くべき
匿名メソッドと違って引数省略できないのが時々不便に感じるけど

409:デフォルトの名無しさん
09/03/06 22:52:26
匿名メソッドは List<T> 周りのメソッド眺めてみりゃどういう
感じに使うのかわかる気もするが…あえてイベントハンドラなら
一時オブジェクトに使う。WebClient とか

410:デフォルトの名無しさん
09/03/06 22:55:40
>>401
デバッグ用途で一時的に作ったようなボタンなんかだと、
それ用のイベントハンドラも短くなりがちになる。そこで、
Loadedイベントハンドラだけはxamlエディタで定義&割り当て
をしてもらって、そのLoadedイベントハンドラの中で
 
Button1.Click+=delegate{MessageBox.Show("Clicked!");};
 
って書いた方がゴミメソッドが増えなくて見やすいんだよね。
まあでも、書いたとおり、推奨はできない。

ただ、ある程度複雑なプログラムを書くと、デザイナもxamlも
あまり頼りにならなくて、コードでGUIをアレコレする必要が
出てくる場面は頻繁にある。特に動的な処理が必要な場合。

例えば、StackPanel1の子にButton1がなっているとして、
Button1のClickイベントハンドラで

Button1.IsEnabled = false;
Button Button2 = new Button() { Content = "Click Me!" };
Button2.Click += delegate {
 Button1.IsEnabled = true;
 StackPanel1.Children.Remove(Button2);
};
StackPanel1.Children.Add(Button2);

こんなの。これだと、Button2のVisiblityなりIsEnabledなり
をいじるイベントハンドラを書く方が自然なのでちょっと
人為的かな。

411:デフォルトの名無しさん
09/03/06 22:59:54
何の断りもなく当然のようにWPFw
初心者が混乱するよ

412:410
09/03/06 23:06:04
>>408
むしろ、その引数を省略できるという性質があるために、
引数を必要としないイベントハンドラの定義にはdelegate{}を
使っている。推奨はしない。あんまり、
void foo(object sender, EventArgs e){...}
みたいなのが増えるの好きじゃないんだよね、個人的に。

そんなわけだからイベントハンドラをメソッドとして作る場合にも
void Button1_Clicked(){
 MessageBox.Show("Clicked!");
}
と引数なしのメソッドを書いて
Loadedイベントハンドラの中とかで
Button1.Click+=delegate{Button1_Clicked();};
とか書く事すらある。これも推奨はできない。

413:410
09/03/06 23:08:40
>>412と類似しているけれど唯一推奨できるのは、次のケースかな。

void 処理1(){
ほにゃらら
}
void 処理2(){
ほにゃらら
}

みたいな処理の単位であるメソッドがあって、それをボタンから
呼び出させる場合。
Button1.Click+=delegate{処理1();処理2();};
みたいに書く。

VBでもWindows FormsでもWPFでも、
入門書に書いてある事を実践すると、イベントハンドラに
何でも書くスタイルを身に着けてしまう人が多いけれど、
本来は処理を適当な粒度で分割したメソッドを定義して、
イベントハンドラはそれらを呼び出すだけの簡潔なもので
あるべき。

Model-Viewスタイルとか良くは知らない趣味プログラマだけど、
こんな感覚でやっています。


414:デフォルトの名無しさん
09/03/06 23:10:40
WPFに限った話をすると,
デザイナでイベントハンドラ追加するのがちょっとだけ面倒だったり
動的にコントロールを追加することが多かったり
基底クラスのイベントでもオーバーライドじゃなくてイベントハンドラ使うことが多かったりするから
Button1.Click+=delegateみたいなことは比較的よくやる

415:410
09/03/06 23:18:53
ごめん、なんか脇に逸れすぎてた気がする。匿名メソッドorラムダ式
を用いて処理を委譲する時の一番の利点は文句なしに「継続」だった。
でも、LINQ以外でうまい例を作れないや。

とりあえず、
void Sum10(){
 int s=0;  
 for(int i=1;i<=10;i++){
  s+=i;
 }
 Button1.Click+=delegate{
  MessageBox.Show(s.ToString());
 }
}

ってやって、どこかでSum10()を呼び出すと、Sum10からは
ちゃんと処理が戻るんだけど、その後Button1をクリックすると
sの値55が表示される、って事を知っておいて。
匿名メソッドで一番重要なのはこれなんだけど、脇に逸れ過ぎた。

非同期処理なんかをする場合には超超超~重要なはずなので
誰か例を書いてくれ。

416:デフォルトの名無しさん
09/03/06 23:29:48
わかりづらいんであんまりそういうのは多用しない方がいいと思うよ
>>415の中でs++したりするとわけがわからなくなる(サンプルとしては面白いけどね)
ローカル変数を取り込めるメリットは,>>398のようなパターンが自然に使えること

417:デフォルトの名無しさん
09/03/06 23:36:52
引継でC#やる事になったんだけど、1ファイル5000行を越えるようなものがざらにあります。
一カ所直すのにも不要なものが目に付いて頭がグワングワンしてきます。
プロパティ、イベント、その他のメソッドという分類でファイル分割しようと思ってるんだけど、君らはどうしてるの?



418:デフォルトの名無しさん
09/03/06 23:40:42
#regionでよくね

419:410
09/03/06 23:45:31
うん、>>415は意図は何もないただのサンプル。

とりあえずUIの話の続きとして「継続」の利点を書いておくと
UI以外のスレッドで何か計算して、その結果を用いてUIを更新する場合、
匿名メソッドを使うのが一番素直に書ける。コードの流れがぶった切ら
れない的な意味で。

例えば
//UIと別スレッド
while(円周率の計算精度>閾値){
  円周率の計算の途中経過をtempPiに代入
  Window1.Dispatcher.Invoke((MethodInvoker)()=>{
   Window1.Label1.Content=tempPo.ToString();
  });
}
こういう場合にメソッド定義とInvokeの引数ありバージョンを使っていたら
訳がわからなくなる。

>>417
自分の場合は#region-#endregionで
・変数定義とコンストラクタ
・プライベートメソッド
・パブリックなメソッドとプロパティ
・(あれば)カスタム可能なメソッド、プロパティ
と分けている。Ctrl+M-M, Ctrl+M-O等のショートカットは知っておくと吉。

420:デフォルトの名無しさん
09/03/06 23:51:42
>>413
> 本来は処理を適当な粒度で分割したメソッドを定義して、
> イベントハンドラはそれらを呼び出すだけの簡潔なもので
> あるべき。

理念的にはその通りだと思うんだけど、若干反発も感じるのは
その基本に忠実な書き方をすると、ベタにイベントハンドラに書いた場合と比べて
「その処理」がイベントハンドラからのみ実行される処理だという明示性が
失われるんだよね。

421:デフォルトの名無しさん
09/03/06 23:59:16
>>420
多分、その、”「その処理」がイベントハンドラからのみ実行される”
という事を前提としたコーディングが、設計の柔軟な変更などを将来的に
阻害してしまう、っていうのが、Model-View-Controlerモデルとか
その派生系とかが繰り返し提案される理由なんじゃないかな。

シンプルなプログラムだと却って変な事になってしまう事が多いのも
確かだと思うけど。

422:419
09/03/07 00:09:11
419を1から100までの和を計算し、途中経過を表示するコードに書き直し
てみた。あと、MethodInvokerはWindows Formsのだから(デリゲート
だからシグネチャが正しいので通るけど)よくなかったのでActionにして
みた。このコードは、はじめのお題の、匿名メソッドの利用例としては、
”良い”利用例だと思う。他の方法だとめちゃめちゃごちゃごちゃになる。

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Thread sum100Thread = new Thread(new ThreadStart(sum100));
            sum100Thread.Start();
        }

        private void sum100()
        {
            int s = 0;
            for (int i = 1; i <= 100; i++) {
                s += i;
                this.Dispatcher.Invoke((Action)delegate{
                    this.Label1.Content = s.ToString("0000");
                });
            }
        }

xamlは
<Window x:Class="WpfApplication1.Window1" ほにゃらら  
Loaded="Window_Loaded">
        <Label Name="Label1"/>
</Window>
だけ。

423:デフォルトの名無しさん
09/03/07 00:30:28
それ全部100にならない?

424:423
09/03/07 00:33:36
100じゃなくて5050か

425:423
09/03/07 00:52:09
確認したけどやっぱり意味的に間違ってる
匿名メソッドは現在のスコープの変数そのものを取り込むんだ
ループ内で生成される全ての匿名メソッドが同一のsを参照してるから
ただ一つのsのインスタンスを共有することになる
ループの中でint ss = s;みたいに宣言し直してそっちを取り込むようにしないとだめ

426:デフォルトの名無しさん
09/03/07 00:56:32
え、ちゃんとくるくると1から5050まで行くけど。
コンピュータが速過ぎるんじゃない?

こういう、継続を必要とするデリゲートの場合
インナークラスが暗黙に定義されて、それがメソッドと
フィールドを持っている。デリゲートのインスタンス作成時には
このインナークラスのインスタンスが作成されて、フィールドに
必要な変数がコピーされる。これが参照型だと話がまたややこしく
なるけれど、値型ならば問題はないはず。

427:デフォルトの名無しさん
09/03/07 01:02:18
いや>>422のコードだと確実にsのインスタンス(sを保持する自動生成されたクラスのインスタンス)は
一つしか作られないよ。IL見ればわかる。
何でうまくいくのかは知らないけど意味的には確実に間違ってる。

428:デフォルトの名無しさん
09/03/07 01:12:10
ごめん、BeginInvokeじゃないから同期実行になっていた。
なんじゃこのオチ。

429:デフォルトの名無しさん
09/03/07 01:24:19
スレッドの非同期処理しか役に立たないってのもなんか寂しいな

430:428
09/03/07 01:45:16
というわけで
        private void sum100()
        {
            int s = 0;
            for (int i = 1; i <= 100; i++) {
                s += i;
                int s_ = s;
                this.Dispatcher.BeginInvoke((Action)delegate{
                    this.Label1.Content = s_.ToString("0000");
                });
                Thread.Sleep(0);
            }
        }
としてみたら希望通りの動作になったんだが、
                Thread.Sleep(0);
をコメントアウントすると、最後の5050しか表示されないんだけど、
ディスパッチャスレッドの優先度って低いの?

431:デフォルトの名無しさん
09/03/07 02:02:54
ようはメソッド内で使用するだけの、クラスのメンバに加えるまでもないメソッドを定義するのに便利ってこと?

432:デフォルトの名無しさん
09/03/07 02:03:06
タイムスライス内で終わってしまうからだろ。
ループもっと長くしろよ

433:デフォルトの名無しさん
09/03/07 02:06:09
あいからわずLanでつながらない…


ところで>>155さんのIPアドレスってつなぎたいSQL SERVERのPcでコマンドプロンプトIPCONFIGででる
IP アドレスですか?

おれは一体何週間これをやってるんだろうか
いろんなスレ放浪して迷惑掛けまくりで


>>170 SQL Serverのポート番号は Express Edition場合動的で コンフィグレイションマネージャーで固定する遺体です



434:デフォルトの名無しさん
09/03/07 02:12:48
>>433
まず、SQLSMSEで接続できるのか確かめなさいってば。
できた?

435:デフォルトの名無しさん
09/03/07 02:17:55
えっと・・ちょっとまって

436:デフォルトの名無しさん
09/03/07 02:19:38
サーバ名にIPアドレス、
SQLServer認証で、
設定したログイン名とパスワードで接続できる?

437:デフォルトの名無しさん
09/03/07 02:28:35
MS server management studio expressで
ファイル-オブジェクトエクスプローラで接続を選択
サーバー名を
コマンドプロンプトipconfigで得たipV4のアドレスを入れる

認証を:SQL Server認証する
ログイン:コントロールパネルのシステムにでてるフルコンピュータ名
パスワード:パソコンにログインするパスワード


でやったら・・・だめでした・・・
どこが違うのでしょう?

438:デフォルトの名無しさん
09/03/07 02:31:24
むむむ:設定した<<ログイン名>>これが、よくわかってない気がします・・・


439:デフォルトの名無しさん
09/03/07 02:33:17
フォームに関してです、BackColorにTransparencyKeyに設定した色を設定した場合、
同じバイナリを実行したときにwindows XPでは透明部分をクリックするとその背後にある別のアプリケーションをクリックすることができます。
windows vistaでは透明な部分をクリックするとそのフォームをクリックします。
vistaでxpと同様にするためにはどうすればいいでしょうか?

440:デフォルトの名無しさん
09/03/07 02:34:25
>>437
SQL Server認証は、SQL Server自体に設定する、
Windows認証(パソコンのコンピュータ名と、パソコンにログインするパスワード)とは別。
SQL ServerにSQL Server認証用のアカウントを別途設定して、
そのアカウントでログインする必要がある。

Windows認証でログインするのは、なんていうのかな、
アクティブディレクトリとか組んで、社内のネットワークに接続するのに必要な認証のことで、
それを認証の変わりと見なすってこと。
(SQLとネットワークの両方で認証したら面倒だから、ネットワークにログインする認証を
ユーザとして認めるっていうこと。Windows認証で今自分のアカウントで接続できるのはそういうこと。)

今は普通に家で勉強しているような感じだと思うので、
ネットワーク越しに接続するのにはWindows認証は関係ない。

441:デフォルトの名無しさん
09/03/07 02:43:13
SQL Server自体に設定する<<ここがよくわからないところです
MS server management studio expressで設定するのでしょうか?

442:デフォルトの名無しさん
09/03/07 02:45:14
わ もう3時か!
付きあわえて申し訳ない
もう少しググッテみます
でわっ

443:デフォルトの名無しさん
09/03/07 02:45:52
>>432
和を取るの100000までににしてみたら、ずっとマウスポインタが砂時計に
なって、最後の結果だけが表示された。

タイムスライスってそんなに長いの?数10ms単位で切り替わるんじゃないの?


444:デフォルトの名無しさん
09/03/07 02:48:48
>>441
SQL SMSEの左ペインのツリービューで、セキュリティ-ログインから設定する。
ログインを右クリして、新しいログインを作って、ログイン名を入力して、
SQL Server認証を選択して、パスワードを設定する。

さっきのリモートでのSMSEの接続には、ここで設定したSQL Server認証の
ログイン名とパスワードを設定すると接続できるということ。

バーチャルPCは、あなたのPCとは別のPCだから、
あなたのPCにログインするアカウントで、バーチャルPC内のSQLに接続はできないということ。
ただし、あなたのPCにインストされてるSQLServerは、あなたのPCにログインしているユーザを
SQLServerのユーザとしても認める設定をしているので、自分のPCのアカウントでも
ログインできましたってこと。

445:デフォルトの名無しさん
09/03/07 03:03:59
自PcからSQL Server認証試したけれどだめでした
Ipv6じゃないと だめなのかな?

446:デフォルトの名無しさん
09/03/07 03:07:40
だめですねー
V4V6同様に下記エラー

Microsoft SQL Server、エラー: 18452

444さんの通り新しいログイン作ったんですが

ミスったかな
試行錯誤してきます



447:デフォルトの名無しさん
09/03/07 03:09:37
V4でいける
SQL Server認証で通らないのなら、なんかの設定がおかしいんでしょ
バーチャルPCのファイアーウォール機能が働いていて、そもそも接続できないとか、
SQLの設定でTCP/IPの接続をそもそも許可していないとか、考えるときりがない。

448:デフォルトの名無しさん
09/03/07 03:11:16
>>446
その前にバーチャルPC上のSMSEで、そのSQLServerのアカウントでログインできる?
サーバ名に、そのバーチャルPCに割り当てられたIPアドレスを入力して。

449:デフォルトの名無しさん
09/03/07 03:14:55
いや今は自Pc(ローカル)でチャレンジ中
>>448 ハイ ちょいとおまちを

450:デフォルトの名無しさん
09/03/07 03:21:14
うは バーチャルpcにSMSEないや・・・・
ごめん

451:デフォルトの名無しさん
09/03/07 03:23:03
バーチャルPCにSMSEがないのに、
どうやってアカウントを設定できるんだ?

452:デフォルトの名無しさん
09/03/07 03:29:38
ベースのVISTA、ほうでアカウント設定したので  汗;


環境(Vista アルティメット(SMSEあり) <=  (ヴァーチャルPC Xp home (SMSEなし))

453:デフォルトの名無しさん
09/03/07 03:35:08
VirtualPCのSQLServerにアカウント設定しなきゃ、
UltimetのSMSEから接続できないでしょうよ

VirtualPCは、まったく別のところにあるPCだと思わなきゃだめよ

454:デフォルトの名無しさん
09/03/07 03:44:49
いや
VirtualPCのPGからUltimetのフォルダにあるMDFにコネクトしたいので・・・

うーん
VirtualPC側にアカウント必要なんですか?

455:デフォルトの名無しさん
09/03/07 03:46:06
遅くまでありがとう
もう少し頑張る気力がわきました

456:デフォルトの名無しさん
09/03/07 04:00:16
まだ起きてるなら、しばらく付き合ってやるけど?

457:デフォルトの名無しさん
09/03/07 04:01:38
>>454
SMSEをクライアントにみかけて、
TCP/IP経由でSQLServerに接続するテストをしてみなっていってるわけだから、
その例で言えば、VirtualPCのSMSEでUltimetのSQLServerに接続するってこと。
だから、設定用のSMSEと、接続実験用のSMSEの両方ないとだめでしょうよ。

UltimetにだけしかSMSEがないということは、UltimetのSQLServerにアカウント設定してたわけで、
それでUltimetからVirtualPCのSQLServerに接続できるわけないでしょ。

やってることが、どうもちぐはぐだな。

458:443
09/03/07 04:35:32
>>430の問題解決しました。
ディスパッチャのノーマルプライオリティのキューが一杯になってしまって、
和を取っているスレッドの処理が終わってからようやくキュー内の処理が
全て完了する、という形になっていたためでした。ディスパッチャスレッド
での処理の優先順位を下げる事で、ディスパッチャがキュー内の処理を全部
やっつけようとせず、順次こなしていくようになりました。

ディスパッチャスレッドでの処理の優先順位を上げなければならないと
全く逆に勘違いして大はまりしてしまった。
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Thread sum100Thread = new Thread(new ThreadStart(sum100));
            sum100Thread.Start();
        }
        private void sum100()
        {
            int s = 0;
            for (int i = 1; i <= 100; i++) {
                s += i;
                int s_ = s;
                this.Dispatcher.BeginInvoke((Action)delegate {
                    this.Label1.Content = s_.ToString("0");
                }, DispatcherPriority.Background, null);
            }
        }
これでようやく、UIを非同期的に更新する処理を匿名メソッドの
「継続」の利点を生かして簡潔に書く例になりました。

459:デフォルトの名無しさん
09/03/07 04:39:04
>>443
切り替わっても Dispatcher キュー処理するほうが時間かかってる
だけだろそれ。WPF は基本保持モード

460:デフォルトの名無しさん
09/03/07 05:36:38
>>459
そうです。マウスポインタが砂時計に変わることから、ようやく、
これ、UIスレッドの方が滞っているんじゃん、と気が付けました。

461:デフォルトの名無しさん
09/03/07 06:27:10
>>458
引数いらないなら、こっちの方が良いんじゃないか。(インテリセンスに出ないけど)

 Dispatcher.BeginInvoke(DispatcherPriority, Delegate)

あと、DispatcherExtensions クラスにある拡張メソッド使うと、

 Dispatcher.BeginInvoke(Action, DispatcherPriority)

が使えるらしい。(型推論が効く)


462:デフォルトの名無しさん
09/03/07 08:23:33
>>457 了解SMSEインストールしてきま・・

463:デフォルトの名無しさん
09/03/07 10:19:21
>>458
知らんかった。
[EditorBrowsable(EditorBrowsableState.Never)]
[Browsable(false)]
になっているBeginInvokeがあるのね。        
public DispatcherOperation BeginInvoke(DispatcherPriority priority, Delegate method);
public DispatcherOperation BeginInvoke(DispatcherPriority priority, Delegate method, object arg);
public DispatcherOperation BeginInvoke(DispatcherPriority priority, Delegate method, object arg, params object[] args);
と三つも。なんでこんな事になっているんだ?

464:デフォルトの名無しさん
09/03/07 16:22:37
疑問に思ったんだが、WPF の Dispatcher.Invoke には WinForms の
EventHandler、MethodInvoker、WaitCallback みたいに、
特別扱いされてるデリゲートは無いのかな

今夜にでもソース読んでみるか

465:デフォルトの名無しさん
09/03/07 16:41:02
>>389の質問に立ち戻る
まず、ジェネリクスに関しては、ある本でこんな例を見つけた(わりと一般的?)
タブベースのUIで、そのタブの中身はそれぞれ異なるビューであるときのベース。
namespace ContactManager.Presenters
{
    public class PresenterBase<T> : Notifier
    {
        private readonly string _tabHeaderPath;
        private readonly T _view;

        public PresenterBase(T view)
        {
            _view = view;
        }

        public PresenterBase(T view, string tabHeaderPath)
        {
            _view = view;
            _tabHeaderPath = tabHeaderPath;
        }

        public T View
        {
            get { return _view; }
        }

        public string TabHeaderPath
        {
            get { return _tabHeaderPath; }
        }
    }
}

466:デフォルトの名無しさん
09/03/07 16:46:03
匿名メソッドに関しては、別スレッドで画像がロードされたときに
メインのUIのサムネールを更新する例として(これはいままで議論されてたのと
基本的に同等のものだが)

Application.Current.Dispatcher.Invoke(
DispatcherPriority.Normal,
(Action)delegate { OnPropertyChanged("Thumbnail"); }


467:デフォルトの名無しさん
09/03/07 17:19:16
>>457

SMSEインスト完了  く^^


アカウント作れない・・・
このバージョンの Microsoft Windows では、MUST_CHANGE オプションはサポートされません。
がーん



468:デフォルトの名無しさん
09/03/07 17:21:16
SMSEはインストできたんだから、アカウントつくれる方に接続すればいいじゃん

469:デフォルトの名無しさん
09/03/07 18:51:15

>>468
むむむ諦めていたところに
良意見
試行錯誤中

470:デフォルトの名無しさん
09/03/07 19:05:47
C#になんの関係もないことに、そろそろ気付けよ・・・

471:デフォルトの名無しさん
09/03/07 19:07:45
C#でネットワーク越しにDBに接続できないから始まって、
ならまずはManagement Studioで接続できる?の話になってるから、
関係無いとも言えるし、継続してるから関係あるとも言える。

472:469
09/03/07 19:13:04

Vistaで作成したアカウントでXpのSEMSから接続
サーバーの種類 データーベースエンジン
サーバー名 IPアドレス 999.999.999.999(IPconfigでvistaから得た)
SQL Server 認証
ログイン名 ja
パスワード *****

結果
サーバーへの接続を確立しているときにエラーが発生しました。SQL Server 2005 に接続しているときときに
このエラーが発生した場合は、SQL Server の既定の設定がリモート接続を許可しないようになっていることが
エラーの原因である可能性があります。 (provider: 名前付きパイプ プロバイダ,
error: 40 - SQL Server への接続を開けませんでした) (Microsoft SQL Server、エラー: 1326)

・・・で、もって
Vistaのセキュリティー構成をリモート接続をTcpipのみしてみたが
だめだったので(Tcptip及びパイプ)へ戻すが・・・ここでひらめいたXpのリモート接続を(Tcptip及びパイプ)変更
サービス停止再起動

結果 上記と同じ・・・・だああああああああああああああああ<<<今ここ

473:デフォルトの名無しさん
09/03/07 19:15:11
他の方法でちゃんとつながるようになってから来い、ってことだわな。

474:469
09/03/07 19:15:50
>>470
それはすっごく気にしてる
申し訳ない
今まで(一週間位)指摘されないこともすごく感謝してました

「ありがとうそしてごめんなさい」としか言えない

475:469
09/03/07 19:17:24
>>473
ローカルでは繋がるんですけどね
今日でわからなかったら諦めるから
目をすぶってくれ

476:469
09/03/07 19:20:11
つぶってくれ ・・・

477:デフォルトの名無しさん
09/03/07 19:23:50
>>472
他の要因が原因に成りにくい方法から、一つずつ確実にテストしなくちゃだめだな。
なんで、VistaのSQLSMSEで、VistaのSQLに、SQL認証で、そのアカウントで接続できるかどうかが第一点。
1)接続できなかったら、アカウントの設定が間違ってる。
2)接続できたら、アカウントの設定は正しいので、ネットワーク越しの接続に不備がある。
・この場合、VistaやXPのファイアーウォールやアンチウィルスのファイアーウォールの可能性
・SQLServerの設定でTCP/IP越しの接続ができなくなってる
・SQLServer2005だと、Advanveなんちゃらをインストしてないと、リモート接続が許可されないとか、
そんなのもあった気がする。

478:デフォルトの名無しさん
09/03/07 19:26:07
アカウントってなんだよ・・・
SQL Server 認証に NT アカウントは関係ないぞ。(TCP/IP なら)

479:デフォルトの名無しさん
09/03/07 19:33:24
ログイン名:ja

↑こんなログイン作ったのか? 最初からあるのは「sa」だぞ?

あとは、ポート 1433 を開けてあるのか確認すれ。

480:469
09/03/07 20:25:54
うん
簡単にできたから面白くて
maとjaとか作った

vistaの
コンフィグレーションマネージャーで動的ポート消して
IPALLを1433に変えて再起動

ダメ
というより
ローカル(vista内)でさえSQLserver認証できてないような信頼がどうのかとか

481:デフォルトの名無しさん
09/03/07 20:30:31
もういいでしょ。SQLサーバの設定正しくできるようになってから、またおいで。

482:469
09/03/07 20:33:56
わかった
すまなかったごめんな
皆さん急がしいところ2週間もありがとうございました


483:デフォルトの名無しさん
09/03/07 20:52:54
>>481
本当に役立たずだなお前

484:デフォルトの名無しさん
09/03/07 21:06:56
在日がイライラしてんだろ察してやれ

485:デフォルトの名無しさん
09/03/07 21:09:32
うわ・・・

486:デフォルトの名無しさん
09/03/08 00:18:13
スレ違いは別にいいんだけどさ、勝手な略語を書き込みまくるのはやめれ

URLリンク(msdn.microsoft.com)(SQL.90).aspx

487:デフォルトの名無しさん
09/03/08 01:42:23
C#でWindows Formアプリーケーションを作成し、WebBrowserコンポーネントを
乗せています。
そこにSVGファイルを表示させたいのですが、実行するとコンポーネント内には

--------------------------------------------------------------------
取り消されたアクション

Internet Explorer は、要求された Web ページにリンクできませんでした。
要求された Web ページは現在、利用できない可能性があります。
--------------------------------------------------------------------

と表示され、別途IEが起動します。
別途起動したIEには「セキュリティ保護のため、コンピュータにアクセス
できる・・・」といういつものメッセージが表示され、
「ブロックされているコンテンツを許可」を選択すると正常に表示されます。

そのファイルをHTMLでラップするとIEの起動は止められますが、
コンポーネント内には空白と赤×のアイコンが出るだけです。

恐らくブラウザコンポーネントのセキュリティ設定の問題だと思うのですが
Windows Formアプリケーションから呼び出したときだけセキュリティの
レベルを下げることは可能なのでしょうか?
それとも別の開放があるのでしょうか?

ちなみに読み込ませるファイルはローカルにあり、自分で書いた安全な物です。

488:デフォルトの名無しさん
09/03/08 01:58:59
>>487
URLリンク(codezine.jp)

489:464
09/03/08 02:16:10
URLリンク(msdn.microsoft.com)
> ディスパッチャ操作にこのデリゲートを使用する必要はありませんが、
> DispatcherOperationCallback と SendOrPostCallback は動的な呼び出しを使用します。

この文章がまじで意味不明だったんだが、大体分かった。
DispatcherOperationCallback と SendOrPostCallback *以外は* DynamicInvoke() される。

で、>>461の DispatcherExtensions クラスの拡張メソッド BeginInvoke() を使うと、
Action を DispatcherOperationCallback でラップしてくれる。

490:デフォルトの名無しさん
09/03/08 02:30:09
>>488
COMですか・・・。
と言うことはWebBrowserコンポーネントじゃなく、COMのaxWebBrowserを
使うということでしょうか?
後、これは.Net 3.5、Visual Studio 2008でも通用するテクニックなのでしょうか?
明日試してみます。ありがとうございました。

491:488
09/03/08 03:15:24
>>490
ごめん、自分で実装したことはないから詳細は不明
とりあえず、
webbrowser IInternetSecurityManager
のキーワードで検索するといろいろ引っかかるから使えるかどうか調べてみてください

492:デフォルトの名無しさん
09/03/08 03:23:31
>>491
はい。とりあえずやってみます。

正直COMはあんまり良く理解してないのでWebBrowserコンポーネントで
何とかできるとありがたいのですが・・・。

493:デフォルトの名無しさん
09/03/08 12:47:41
>>489
型推論が効くって説明は誤っていると思っていたので気になって
いたんだけど、了解した。
Dispatcher.BeginInvoke((Action)delegate{},優先度);
って書くと呼び出しが高速になるって事だね。それで引数が必要ならば
拡張メソッドじゃない標準のBeginInvokeを使って
DispatcherOperationCallbackかSendOrPostCallback
を使えば良いと。

ところで、
using System.Windows.Threading;
しても、この拡張メソッドがInteliSenseに出てこなくて拡張メソッドが
有効になっていない気配だったので気になって調べて見たら
System.Windows.Presentation
への参照を追加するのが必要なのね。これでめでたくInteliSense
に出てきました。

494:デフォルトの名無しさん
09/03/08 13:45:57
C#2.0、ジェネリクスメソッドで、型のインスタンスを生成して返すことってできますか?
できるのなら、どうすればいいでしょうか。こんなことをやりたいです。

public T Hoge<T>()
{
 return new T();
}

495:デフォルトの名無しさん
09/03/08 13:53:14
public T Hoge<T>() : where T : new() { return new T(); }
ちなみにこのnew T()はActivator.CreateInstance<T>()のシンタックスシュガー

496:デフォルトの名無しさん
09/03/08 14:48:35
おお、できたありがとう!

497:デフォルトの名無しさん
09/03/08 19:56:56
GenericなFactory ですね

498:デフォルトの名無しさん
09/03/08 22:31:15
ジェネリックコレクションに格納されているデータで
引数で渡した値が存在するかをチェックしたいのですが
パフォーマンスが良いやり方を教えていただけないでしょうか?

↓こんなんじゃあパフォーマンス悪すぎですよね・・・
private bool Search(string keyword)
{
foreach(string value in this._data)
{
if(value == keyword)
{
return true;
}
}
return false;
}


499:デフォルトの名無しさん
09/03/08 22:35:47
一般にはそれしかない
_dataがList<T>や配列ならFindとか使えばいい


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch