C#, C♯, C#相談室 Part59at TECH
C#, C♯, C#相談室 Part59 - 暇つぶし2ch331:デフォルトの名無しさん
10/06/05 00:35:07
>>328
試せよ
配列なら自動的に中身が表示される

332:デフォルトの名無しさん
10/06/05 03:09:17
なるほど

333:デフォルトの名無しさん
10/06/05 07:37:53
>>329結構使う
ブレイクさせて関数への引数変えて返り血みてみたいとか
変数の値直で変えたり、デバッグ用のテストコードにすりゃいいんだろうけど、その場限りの時はつかうかなぁ

334:デフォルトの名無しさん
10/06/05 07:40:06
痛そう

335:デフォルトの名無しさん
10/06/05 07:59:58
イミディエイトウィンドウでの実行の仕方がなかなかわからなくて
結構こまってた。
インテリセンスするためだけのウィンドウだと思ってたよ・・・

336:デフォルトの名無しさん
10/06/05 10:12:47
>>329
あそこでバグ修正用コードとか
半分コーディングしにかかるレベル

337:デフォルトの名無しさん
10/06/05 10:51:59
>>333
そのあたりはクイックウォッチからもできるから。
イミディエイトウィンドウじゃないとできないことって何だろう?

338:デフォルトの名無しさん
10/06/05 12:23:40
object o = null;

(クイック)ウォッチでやるとこんなメッセージがでる
> 宣言ステートメントは、イミディエイト ウィンドウでのみ許可されています


339:デフォルトの名無しさん
10/06/05 14:13:04
当たり前だっ

340:デフォルトの名無しさん
10/06/05 14:42:48
なにおいっているのら・・・・

341:デフォルトの名無しさん
10/06/05 15:56:08
プロパティでクラスを返す時読み取り専用に
する方法はありますか?

class a : ICloneable {
int value = 0;
//以下略
}
class b {
private a = new _a();
public a REF {
get{ return _a; }
set{ _a = value; }
}
public a CLONE {
get{ return _a.Clone(); }
set{ _a = value; }
}
}
b = new obj();
b.REF = new a(); //更新をこれだけにしたい(CLONEも)
b.REF.value = 5 //禁止したい
b.CLONE.value = 5 //意図しない動作なので禁止したい



342:デフォルトの名無しさん
10/06/05 16:05:00
ない
中身を変更できないようにクラスを作る
あとICloneableを重視してらっしゃるようだけど今は非推奨になってるから実装しなくていいよ

343:デフォルトの名無しさん
10/06/05 16:06:44
aクラスに読み取り専用のValueプロパティを作る

344:デフォルトの名無しさん
10/06/05 16:18:37
aを変更不可にしてしまえばいいんだが一般にはそれよりも
bにpublic int AValue { get { return a.value; } }を付けた方がいい
もちろん場合によるけどbを利用する側がaを知らなくて済む

345:デフォルトの名無しさん
10/06/05 16:21:36
>>342, 343
ありがとう
簡単にはいかなそうですね・・。
場所によっては変更が必要なのでprivate protectedを
駆使して試して見ます
てか、ICloneableが非推奨というのは驚きました。




346:デフォルトの名無しさん
10/06/05 16:24:41
URLリンク(blogs.msdn.com)
これだな
Cloneとだけ書かれてもどんなコピーが返ってくるのか全くわからん。
むしろわけのわからないネーミングを助長するだけ。DeepCopyとか自分で実装してくれ。ということらしい。

347:デフォルトの名無しさん
10/06/05 20:03:23
LabelのAutosizeをtrueにした時の伸びしろを最小限に抑えることってできないのかな?

labelを密に横並びに配置しているのだけれど、どうも隣と被さって文字が見えなくなってしまう。
Autosizeをfalseにして文字を限界まで詰めると隣のラベルとかぶることはなくなるけどなぜか文字が途中までしか表示されなくなるし。



348:デフォルトの名無しさん
10/06/05 20:14:31
>>347
悪いけど全体的に何をいいたいのかよくわからん。
てか「なぜか」ってそれのどこが疑問なのか意味わからんし。

349:デフォルトの名無しさん
10/06/05 20:46:00
久しぶりに逆襲のシャアみてたのでニュータイプになったつもりで
回答してみるとだな・・・

>>347
適当なコンテナで制御するのが一番かもね

350:デフォルトの名無しさん
10/06/05 23:12:58
C井の質問もここでよろしいのでしょうか。

351:デフォルトの名無しさん
10/06/05 23:17:38
なにそのイニシャルトーク

352:デフォルトの名無しさん
10/06/05 23:21:37
逆シャアって最後のところでアムロとシャアって
死んだとされてるけどMSが弾き飛ばされてる
はずなのに軌道がそれるのが確定したときに
二つ何かが飛び去るシーンがあるんだよね・・・

スレチ

353:デフォルトの名無しさん
10/06/05 23:42:28
二人が自由になるための作戦
死んだ事にして別人を名乗って気楽に生きていくために

354:デフォルトの名無しさん
10/06/06 00:28:16
嬉し恥ずかしボーイズラブですね

355:デフォルトの名無しさん
10/06/06 02:23:22
>>347
たぶんそこら辺面倒なくしたければテーブルを使うのが気楽でよいよ

356:デフォルトの名無しさん
10/06/06 04:01:34
Datagridviewの使い方が解りません。だからラベルをチマチマ貼ってます。
マウスで綺麗に配置した積りだけど、どうも隣と被さってる気がします。
とエスパーしてみる。

357:デフォルトの名無しさん
10/06/06 07:02:30
ほぼ正解

358:デフォルトの名無しさん
10/06/06 09:15:18
>>347
TableLayoutPanelコントロールを使えばOK

359:デフォルトの名無しさん
10/06/06 12:33:22
入力チェックについて相談させてください。
フォーム内に登録されているコントール全ての Validating イベントを発生させるには
どうしたらよいのでしょうか?

現在、それぞれの項目の入力チェックは Validating イベントの中で処理し、
内容が正しくない場合は ErrorProvider を使用してアイコンを表示するようにしています。

このままですと一度もフォーカスを得ないままのコントロールは入力チェックがなされないままになってしまいます。

なので、登録ボタンを押下したタイミングでも全ての項目の入力チェックを行なおうと考えたのですが
うまい方法が思いつきませんでした。
ContainerControl の Validate メソッドで子コントロール全てを Validate できるのかと思ってためしたのですが
だめでした・・・

360:デフォルトの名無しさん
10/06/06 14:06:01
つValidateGroup

361:デフォルトの名無しさん
10/06/06 14:37:35
>>360
ValidatingGroup ですね。
ASP.NET 用ですか・・・ Windows Form では使えなさそうですね。

362:デフォルトの名無しさん
10/06/06 14:46:57
ContainerControl.ValidateChildrenは?

363:デフォルトの名無しさん
10/06/06 15:20:58
>>362
おおお! まさしくそれです
ありがとうございます
実装してみたところ期待通りの動作となりました


しかし・・・
なぜか自分ところの環境(VSEE2008)だと
ValidateChildren がインテリセンスにもオブジェクトブラウザにも出てこない・・・
ターゲットは .NET 2.0 にしてるしビルド自体は通るから問題なさそうなんだけどなんでなんだろう


364:デフォルトの名無しさん
10/06/06 15:24:10
Browsable(false)属性付きだから
なんでそうしてるかは.NETの中の人に聞かないといけないが

365:デフォルトの名無しさん
10/06/06 15:34:56
なるほど。
Form の方では Browsable(true) になっていました。
メソッドの性質を考えるとなるべく上位で使って欲しいからとかそんなとこなんでしょうかね。

重ね重ねありがとうございます。

366:デフォルトの名無しさん
10/06/06 16:38:40
やるな

367:デフォルトの名無しさん
10/06/06 17:01:44
ADO.NETで質問なんですが、
DataRow一行だけを編集するような画面を作る場合でも
TextBoxとかComboBoxにバインドするのが一般的な作り方なんでしょうか?
それとも一々内容を移しかえるやり方が一般的なんでしょうか?

368:デフォルトの名無しさん
10/06/06 17:15:30
たった1行でも入力項目が多ければバインドする~

369:デフォルトの名無しさん
10/06/06 19:02:49
ADOは見通しが悪いよね

370:デフォルトの名無しさん
10/06/06 19:07:50
手書きのADO.NETはそう悪くないんだけど
ウィザード生成の型付きデータセットが意外と解り辛くて不評。


371:デフォルトの名無しさん
10/06/06 22:06:03
WebRequestでのFTPPUTはたまにリモートサーバーに接続できないエラーになるけど、
やはり、ソケットで作らないとだめなのかしら?

372:デフォルトの名無しさん
10/06/06 22:11:05
んなことはない。

373:デフォルトの名無しさん
10/06/06 22:18:06
IEのHTTP/GETだってたまにリモートサーバーに接続できないエラーになるぜ

374:デフォルトの名無しさん
10/06/07 04:51:02
いやそれはルータが腐ってるw

375:デフォルトの名無しさん
10/06/07 09:11:05
ルーターも然り、相手の環境のせいも然りってことでしょ。
いろんな環境原因も含めてHTTPやFTP、その他の通信でも失敗することはある。

376:デフォルトの名無しさん
10/06/07 12:12:39
FFFTPとかのいい加減枯れてるツールでも結構なるしな
そう言うモンだと思って回復手段作り込むしかあんめ

377:デフォルトの名無しさん
10/06/07 12:21:13
タイムアウト、リトライ、リジュームあたりを実装したら、
FTPはまともな動きになるだろう。

378:デフォルトの名無しさん
10/06/07 20:51:14
そこまで望む場合は自分で作ればいい。
FTPなんてチョー簡単だし。(PASV実装とかチョイ面倒くさい程度)

379:デフォルトの名無しさん
10/06/07 21:33:36
>>378
.net frameworkだけで手軽に実装できるだろ。

380:デフォルトの名無しさん
10/06/07 23:19:51
Windowsアプリケーションにて、画像の上に透過的な四角い枠線(色付き)を重ねたいのですが、
どのように実装したらよいでしょうか?
宜しくお願いします。

381:デフォルトの名無しさん
10/06/07 23:50:40
>>380
Panelでできないっけ。
今もPanelあるんだっけ。

382:デフォルトの名無しさん
10/06/08 00:02:47
>>380
現状ではコントロールは親コントロールに対してしか透過してくれないんだよね。
まぁ動かしたりするんなら糞重たくなるけど、その枠が乗る範囲が対象の画像のどこにあたるかを計算してその部分の画像データを枠を描画するコントロールの背景に描画とか。

まぁサクサク動いて透過もできてってなるといっそのことDirectXやOpenGLに2次元的な描画をするしかない。

383:デフォルトの名無しさん
10/06/08 00:58:16
PictureBoxの子に枠線のPictureBoxなり追加すりゃいんでね

384:デフォルトの名無しさん
10/06/08 08:05:10
>>383
WinFormだと透過を扱うのは面倒だよ

385:デフォルトの名無しさん
10/06/08 08:31:38
OnPaintの内部で好きなように描けばいい。

386:デフォルトの名無しさん
10/06/08 10:13:32
PictureBoxをはみ出す可能性があるなら厄介
OnPaintだったら一切コントロール使わずに重なる可能性のあるもの全部
自分で描かないといけない

387:デフォルトの名無しさん
10/06/08 10:32:26
どのレベルの運用なんだろう?

例えばユーザーがドラッグドロップした部分に枠を描画してそれを消したりすることが出来なければいけないなら
自分でレイヤーみたいなデータを順番に記憶してクリックされたら枠線描画して移動できるようにする

とかいろいろ考えられるけど


388:デフォルトの名無しさん
10/06/08 11:33:45
透明なウィンドウを重ねるのが確実
そういうの多用するんだったら努力するだけ時間の無駄だからさっさとWPFへ

389:デフォルトの名無しさん
10/06/08 23:31:04
FtpWebRequestのAbort忘れかも。

390:デフォルトの名無しさん
10/06/09 02:02:52
枠引くくらいなら枠線用のPictureBoxなどを配置して上に置いて
Regionで内側を切り出すのがほどほど楽だと思うよ。

391:デフォルトの名無しさん
10/06/09 05:21:48
コントロールの重ね合わせは数が増えると重くなるからスピードが必要ならDirectX

392:デフォルトの名無しさん
10/06/09 09:55:17
C#2.0 マルチスレッドで質問です

short型の変数Aがあるとします。
メインスレッドはある変数Aを読み込むだけ
サブスレッドはある変数Aを書き換えるだけ

上記のような状態で通常
書き込み時に適当なオブジェクト等を使用してロック・読み込み時もロック
するような気はするんですが

仮に
両方ロックしない場合で

サブスレッドで
変数Aが 0(16bit全てOFF)の値になっている時に
変数Aを65535(16bit全てON)に変更したとします。

この場合変数Aは限りなく瞬間的に全てのビットを順番にONしていくと思うのですが、
その途中にメインスレッドが読み取りを行った場合に例えば8bitだけONになったりしている状態を読み取る場合ってあるのでしょうか?

ちょっと質問の仕方が微妙かもしれませんがお願いいたします。



393:デフォルトの名無しさん
10/06/09 10:18:11
CPU命令の最小単位考えたらわかるべ

394:デフォルトの名無しさん
10/06/09 10:21:15
>>392
> この場合変数Aは限りなく瞬間的に全てのビットを順番にONしていくと思うのですが、
> その途中にメインスレッドが読み取りを行った場合に例えば8bitだけONになったりしている状態を読み取る場合ってあるのでしょうか?
32bitプロセスでは32bitまでならアトミック
そんなの気にするよりvolatile

395:デフォルトの名無しさん
10/06/09 22:28:13
>>392
URLリンク(download.intel.com)
この資料のp.258に
> インテルPentium 4 プロセッサ、インテルXeon プロセッサ、P6 ファミリ・プロセッサ、
> インテルPentium プロセッサ、Intel486 プロセッサでは、キャッシュ可能メモリへのア
> クセスで、バス幅、キャッシュ・ライン、ページ境界をまたがっているものは、アト
> ミック操作が保証されない。
とあるので、そういう状況が起こる可能性はゼロじゃない。
本当にアトミック操作が必要な場合は、あなたの言うとおり、ロックするなりアトミック操作
命令をつかうなりする。

396:デフォルトの名無しさん
10/06/09 23:29:37
shortの変数がそれらをまたがる可能性があるということか

397:デフォルトの名無しさん
10/06/09 23:46:29
C#の場合はアライメント境界整列は保証されるとどっかで読んだ記憶が
まあ将来に渡って保証されてる訳でもないだろうけどな

398:デフォルトの名無しさん
10/06/10 00:46:26
MSDNのInterlocked.Readとか読んでると保証されるとも取れるようなことが書いてあるよ

399:デフォルトの名無しさん
10/06/10 01:13:01
StructLayoutした構造体でも適用されるのだろうか・・・
マーシャリング機構が魔法を使ってくれてるかもしれないから否定しているわけじゃない。

400:デフォルトの名無しさん
10/06/10 02:10:54
>>392
それやると大抵は読み込むだけのスレッド側の処理は最適化で消えて読み込まなくなるから
中途半端に読み込む状態を仮定する以前の動作になるよ。

401:デフォルトの名無しさん
10/06/10 02:52:11
volatileぐらいわかるよバカやろう

402:デフォルトの名無しさん
10/06/10 03:34:05
>>392
なんでそういう事をわざわざ考えるのかよくわからないけど
ReaderWriterLockつかえば解決とか言う話でもないの?

403:デフォルトの名無しさん
10/06/10 03:38:57
アトミックな操作が本当にそうなのかについて疑問に思ったんじゃないの?
いいことだと思うよ。

404:デフォルトの名無しさん
10/06/10 06:40:13
なんでそうなるのかとかは知っといた方がおもしろいよね。

405:デフォルトの名無しさん
10/06/10 12:34:40
GCが配置する時に8バイト境界にするってどこかで見た覚えがあるんだがどこだったかな

406:デフォルトの名無しさん
10/06/10 12:42:42
レジスタのビット書き換えフェーズ中に割り込みか同時読み込みできる
そういうすごいCPUの話じゃないの?


407:デフォルトの名無しさん
10/06/10 13:36:17
>>392
short型ならすべてのビットが同時に書き換えられる。1ビットずつ順番ではない。
もちろんプログラムが1ビットずつ書き換えるように作ってあれば話は別だけど、単純に

A = 0;
A = 65535;

のように代入するだけならすべてのビットが同時に変更される。
もし中途半端な状態が発生したら、それはメモリの故障。

408:デフォルトの名無しさん
10/06/10 13:51:19
>>406
物理コアが複数だと、そう言い切れなかったりする
上でも何回か出ているアライメント境界の問題で、
複数回フェッチが起こる可能性があるからだ
ここらはキャッシュコヒーレンシとか色々関係しててややこしい

409:デフォルトの名無しさん
10/06/10 15:08:02
横レスなんだけど
>>407
いろいろ読む限り仮にこれが32bitOSでLongだったら書き換えは複数回に分割されてしまうということなんだろうか?


410:デフォルトの名無しさん
10/06/10 15:28:17
仕様としてはどうなっているんだ?

411:デフォルトの名無しさん
10/06/10 15:50:08
5.5 変数参照の分割不能性
bool、char、byte、sbyte、short、ushort、uint、int、float の
各データ型および参照型の読み取りと書き込みは分割不可能です。
また、上記の型を基になる型に持つ列挙型の読み取りと書き込みも
分割不可能です。long、ulong、double、decimal などのその他の
データ型、およびユーザー定義型の読み取りと書き込みは、分割不可能
であることが保証されていません。この目的で設計されたライブラリ関数を
除いて、インクリメントやデクリメントの場合などでの分割不可能な
読み取り/変更/書き込みは保証されていません。


412:デフォルトの名無しさん
10/06/10 19:34:34
>>411
CPUレベルではともかく、CLRレベルでは保証されてるってことか。

413:デフォルトの名無しさん
10/06/10 20:38:48
32bit以上での実装を事実上想定しているわけだ。

414:デフォルトの名無しさん
10/06/10 21:36:58
16ビットCPUだったらintも16ビット長じゃね?
.netが16ビットでも動くかは知らんけど

415:デフォルトの名無しさん
10/06/10 21:41:29
intは32bitと決められている。

416:デフォルトの名無しさん
10/06/10 21:50:44
intが可変な言語って数えるほどしかない

417:デフォルトの名無しさん
10/06/10 21:52:51
CLRは32ビットプロセスなら32ビット境界に、64ビットプロセスなら64ビット境界に整列することを保証してる。
もちろんライアウトを変えた場合は別。

だから、少なくとも32ビット以下のプリミティブ型の読み書きはアトミック保障。


418:デフォルトの名無しさん
10/06/10 21:53:06
そういう言語では組み込み型はそのまま使わずにtypedefしてサイズを固定するという
アホらしいノウハウが定着してる事実

419:デフォルトの名無しさん
10/06/10 21:53:57
ああ書き方おかしかった。
ライアウト→レイアウト。
で、そういうことやってない限りは保障されてる。


420:デフォルトの名無しさん
10/06/10 21:56:44
>>402
何のためだよw


421:デフォルトの名無しさん
10/06/10 21:58:16
つうわけで現実的には、32ビット以下ならvolatil変数、
32ビットを超えるものはlockするのが簡単。


422:デフォルトの名無しさん
10/06/10 22:09:14
ところでlongはvolatileにできないけど
IntPtrや参照型のvolatileは64bitプロセスでどうなってるんだろう?

423:デフォルトの名無しさん
10/06/10 23:33:39
64bit環境なら普通に問題ないだろ。

424:デフォルトの名無しさん
10/06/10 23:38:28
64ビット環境では当然64ビットの読み書きは分割不可能。


425:デフォルトの名無しさん
10/06/10 23:47:07
x64とia64で違ったりしないのかな

426:デフォルトの名無しさん
10/06/11 01:13:50
分割「不可能」って表現はどうなんだろうねえ。

427:デフォルトの名無しさん
10/06/11 01:19:47
atomicの定訳がないからねえ。「不可分」で良さそうなもんだが。

428:デフォルトの名無しさん
10/06/11 01:40:34
相談室の方だしアトミックとだけ言っとけば通じるんじゃないか?

429:デフォルトの名無しさん
10/06/11 02:33:51
今更このスレでアトミックや分割不可能の意味がわからん奴もいないと思うんだが・・・
まぁMSDNにもそう書いてあるんだし、そのままでいいんじゃないか?

というか、やっぱPGて細かく突き詰めると深いよなぁ と改めて思う

430:デフォルトの名無しさん
10/06/11 11:50:42
なぁ、紐づく・紐付ける・紐づいたXX って英語でなんていうんだ?
てか、紐づくの語源はどっから?

431:デフォルトの名無しさん
10/06/11 12:00:03
そんなの
関係する
とかに置き換えたらいかんの?

語源はググってくれ

432:デフォルトの名無しさん
10/06/11 12:34:12
そう言えば、英語と1対1な用語じゃないような気がするねえ。
link,bind,relationshipのいずれかを局面に応じて使うんじゃないかな。

433:デフォルトの名無しさん
10/06/11 12:47:27
associateとかもあるな

434:デフォルトの名無しさん
10/06/11 18:55:47
A (which is) tied together with B とか

435:デフォルトの名無しさん
10/06/11 22:53:09
assigned とかは?
命名スレ行きかな

436:デフォルトの名無しさん
10/06/12 18:00:58
wiredだな

437:デフォルトの名無しさん
10/06/13 01:55:45
weirdとな

438:デフォルトの名無しさん
10/06/13 13:04:54
URLリンク(techbank.jp)
この記事の意味わかる人いる?


439:デフォルトの名無しさん
10/06/13 13:11:10
確かに全くわからない
new { trueValue = new BitVector32(-1), falseValue = new BitVector32(0) }と
new { trueValue = new BitArray(1)[0] = true, falseValue = new BitArray(1)[0] = false }
を比較したら処理速度以前に値型と参照型の違いで前者が速いに決まってる
何がしたいのかも意味不明

440:デフォルトの名無しさん
10/06/13 13:24:00
>new BitVector32(-1)[(int)BitFlag.TrueIndex]
BitFlag.TrueIndexは0のことだから、

>new BitVector32(-1)
-1じゃなくても何を渡してもたとえ0でもTrueになるしな。


441:デフォルトの名無しさん
10/06/13 13:26:43
>new { trueValue = new BitArray(1)[0] = true, falseValue = new BitArray(1)[0] = false }
これに至ってはビットセットしてるつもりで実は取得しかしてない気がする。


442:デフォルトの名無しさん
10/06/13 13:27:44
Microsoft MVPかよw

443:デフォルトの名無しさん
10/06/13 13:41:36
>>441

設定はしてるけど取得はしてない
trueValueに代入されるのはリテラルのtrue

444:デフォルトの名無しさん
10/06/13 14:10:33
(int16)trueが1になったり-1になったりする!大発見!スイーツ(笑)
ってことか?

445:デフォルトの名無しさん
10/06/13 14:16:21
回数増やすと差が開くのはGCが動くからかな?
なんにせよそんなBitArrayの使い方ありえない

446:デフォルトの名無しさん
10/06/13 14:30:00
本人も言ってるけど、本当に
> プログラミング言語論やアルゴリズムに元々興味がなかった
んだろうな。

447:デフォルトの名無しさん
10/06/13 14:42:15
そうだとしてもこれ普通に仕事に支障が出るレベルじゃね

448:デフォルトの名無しさん
10/06/13 14:44:24
Console.WriteLine("BitVector32の-1: {0}", ....

そりゃ何やったって-1が出るよな。

449:デフォルトの名無しさん
10/06/13 14:53:20
>>440
BitVector32の仕様を理解してない? インデクサの引数をマスクじゃなく
インデックスだと思っているとか。

450:デフォルトの名無しさん
10/06/13 14:54:15
>>438
あれ? コメント消えた?

451:デフォルトの名無しさん
10/06/13 15:07:19


452:デフォルトの名無しさん
10/06/13 15:08:41
貼ったのは本人かよwwwwww

453:デフォルトの名無しさん
10/06/13 15:13:54
というか記事自体消えたw

454:デフォルトの名無しさん
10/06/13 15:26:45
流石はMVPだな

455:デフォルトの名無しさん
10/06/13 19:55:01
丸ごと消して逃げるってのは技術者の態度としては酷いなあ
別に誰だって間違いはあるんだから、素直に分かってませんでした、でいいのに。

456:デフォルトの名無しさん
10/06/13 20:05:52
…ほかの記事も全部巻き込んでコメント消えたな…
どうなってんだ…真面目に聞いてたのに…

あーあ、どうせ荒らされたからコメント停止したとか、そういうことにされてんだろうな

457:デフォルトの名無しさん
10/06/13 20:12:09
まあそれぐらいで許してやれよ。
打たれ強い人ばかりじゃないんだ

458:デフォルトの名無しさん
10/06/13 20:28:22
誰かコメントできっついことでも書いたか?
気づいたらもう消えてたから経過が分からん、まあおそらくはそうなんだろうけど。

しかしこれじゃ記事で気になることがあってもどうしようもないな。
techbank.jp って書籍とかも出してるからそれなりに影響力ありそうなんだが…
ユーザ登録して掲示板に書けってことか…面倒な…


459:デフォルトの名無しさん
10/06/13 20:59:29
カエル女あわれ・・・

460:デフォルトの名無しさん
10/06/13 21:38:47
>>458
キツいことは書かれてたね。
言葉はキツかったけど正しい指摘ではあった。
確かに誰もが打たれ強いわけじゃないってのは分かるけど
書籍出したり、MVPだったりする人間が技術的な指摘に逃げ腰ってのはダメだよ。

461:デフォルトの名無しさん
10/06/13 21:49:30
そのとおり。

462:デフォルトの名無しさん
10/06/13 22:39:03
>>460
あれ書いたの俺なんだけど、まさか丸ごと消されるとは思わなかった。
MVPだし、本出してるし、コミュニティの運営にも積極的な人みたいだから、
反論するにせよ訂正するにせよ、少なくとも真摯な態度で答えてもらえるもんだと
思っていたんだよね。

まあ、確かに言葉はきつかったけど、まともな質問に上から目線で適当な回答をしてるのが
腹立たしかったもんでね。

残念だね。

463:デフォルトの名無しさん
10/06/13 22:46:10
RSSには
BitVector32 vs BitArray を掲載しました
ってのが残ってるけど、どんな中身だったのか分からない
どっかに中身のっけてくれ

464:デフォルトの名無しさん
10/06/13 22:47:34
MVP事務局に、報告しといた方がいいと思う。

465:デフォルトの名無しさん
10/06/13 22:49:57
まゆみちゃーん

466:デフォルトの名無しさん
10/06/13 22:50:22
>>463
Googleのキャッシュで記事はまだ見れるね。

467:デフォルトの名無しさん
10/06/13 22:52:50
URLリンク(cache.yahoofs.jp)

これか。何が間違ってるのかわからんw

468:デフォルトの名無しさん
10/06/13 22:55:24
間違ってるというより何一つ意味を為してないんだな
書いてる本人が自分で何やってるのかわかってないからわざと曖昧に書いてるのが伝わってくる

469:462
10/06/13 23:02:40
あんまり突っ込みどころが多いから、逐一指摘してたらコメントが長くなるし
変な人だと思われそうだから、1点に絞って突っ込んだんだけどね。
いっそ高木浩光ばりに突っ込みまくった方が良かったのだろうか?

470:デフォルトの名無しさん
10/06/13 23:07:48
>>469
あー、私知らなかったわー。って感じの文章なんだから、もっとソフトにやってあげてもいいんじゃない。

471:デフォルトの名無しさん
10/06/13 23:08:30
どんなコメントだったん?

472:デフォルトの名無しさん
10/06/13 23:10:28
GoogleもYahooもキャッシュにコメントがないなあ
Bingはキャッシュすらないし

473:462
10/06/13 23:17:13
細かい文章は覚えてないが、

BitVector32::ItemsとBitArray::Itemsの戻り値を整数として評価すると異なる値になると
あなたは言っていますが、.NetのBoolean型は整数と可換なものではないので、整数として
評価することに意味はありません。また、内部的にも1ビットの整数として実装されていますので、
整数に変換した結果は毎回同じです。-1が出力されているのは、あなたがConsole.WriteLineの
フォーマット文字列に“-1”と書いたからです。
基本的なデータ型について理解していないのはあなたの方です。正当な疑問に木で鼻をくくったような
返答をする態度は非常に不愉快です。

といったところ。最後に余計なことを言っているけど、これは以前にコメントをしていた人に、
ビット操作の概念を勉強しないとこの記事は理解できないよ、というような返答をしていたので、
それに対するもの。

474:デフォルトの名無しさん
10/06/13 23:21:55
.NETのboolは8ビットで0がfalseで0以外がtrueじゃなかったっけ
記事の間違いは別問題だが

475:デフォルトの名無しさん
10/06/13 23:22:23
記事ごと消すほどのコメントじゃないわな。

476:デフォルトの名無しさん
10/06/13 23:31:53
たまたま残ってたから一応書いておこう。
最初のコメント
----
> まとめると、
> BitVector32 BitArray
> true -1 を表す 1 を表す
> false 0 を表す 0 を表す
> となります。
これはいったいどういう意味でしょうか?
----

その返答
----
ビットフラグがONの場合がTrue、ビットフラグがOFFの場合はFalseです。
このON/OFFを数値で表した場合、BitArrayとBitVector32とではON/OFFの数値の意味が異なるという対比表になります。
そもそもビットの概念がわかっていないと、このBlogの説明に書いてある説明を理解しようとしても無理ですので、もし貴方がビットの考え方が良くわからないという場合は、
入門書籍やほかのWebサイトでその辺りを勉強してから、このBlogに書いてある意味を汲み取ってください。
----


477:デフォルトの名無しさん
10/06/13 23:36:23
いきなり攻撃的な返答だな。あの日だったりしたのか?w

478:デフォルトの名無しさん
10/06/13 23:37:23
記事は消えても画像は残ってるんだな

URLリンク(techbank.jp)

479:デフォルトの名無しさん
10/06/14 01:01:27
マルチスレッドで教えてください。
ソケットプログラミングで、受信スレッドがキューにデータを溜めて、
メインスレッドは順次データを読み出して処理するというプログラムを書いています。

メインスレッドはキューにデータが無ければ受信するまで待機したいのですが、
一般的にどう実装するものでしょうか?

とりあえず作った受信スレッドは、
Monitor.Enter(obj);
受信ループ
 キューに格納
 Monitor.Exit(obj);
 Monitor.Enter(obj);
ループEnd
Monitor.Exit(obj);

受信の都度Exitしてメインスレッドに所有権を明け渡しています。
動作には問題なさそう?なんですけど、なんかスマートじゃないというか。。。


480:デフォルトの名無しさん
10/06/14 01:05:17
AutoResetEventつかう

481:デフォルトの名無しさん
10/06/14 01:12:17
lock (q)
ループ開始
}

482:デフォルトの名無しさん
10/06/14 01:13:28
ミスって書きこんじまった、なしなしな


483:デフォルトの名無しさん
10/06/14 01:16:31
BlockingQueue系統を使うのが定石だが、
.NET 4より前にはなかったな確か。
BlockingQueueとか実装はそこらに転がってそうだが。


484:デフォルトの名無しさん
10/06/14 01:19:51
>>479
.Net4が使えるなら BlockingCollection<T> 一択。
つかえないなら、↓こういう同期機能付きコレクションを使う。
URLリンク(www.codeproject.com)

いずれにしても、そういうパターン(いわゆるProducer-Consumerパターン)では
同期機能はキューに持たせるのが一般的。で、Producer(この場合は受信スレッド)は
データをキューに入れるだけ、Consumer(この場合はメインスレッド)はキューから
取得するだけにする。

485:デフォルトの名無しさん
10/06/14 07:08:32
MVPって最初の頃(2003年とかその頃)はいいなと思ってたんだが、わんくま同盟とか言い出した頃から
馴れ合い色が強くなってきて、なんていうか、このブログの主はMVPになる条件を満たしていないにも
かかわらず、推薦制度を悪用してMVPになった感があるな。

こんなんがアドバイザとして高い金を取ってるかと思うとなんともいえない気持ちになる。
MVPを専属で引っ張ると100万/週ぐらい取らなかったか?

次回剥奪されると良いが。

486:デフォルトの名無しさん
10/06/14 07:29:51
>>485
> MVPを専属で引っ張ると100万/週ぐらい取らなかったか?
そんなに価値あるのか?
まあ、すごいのはいる。

487:デフォルトの名無しさん
10/06/14 07:47:51
nyaruruとかって本業何してんの?

488:デフォルトの名無しさん
10/06/14 07:52:15
そんなに取れません。n氏はGoogleに・・・。

489:デフォルトの名無しさん
10/06/14 08:00:19
GoogleだとWindows使えなくなるじゃん
大丈夫かな

490:デフォルトの名無しさん
10/06/14 08:30:10
CodeProjectでじゃんじゃん記事書きまくってる奴とか、凄いのがいる。
日本語サイトでMVPを名乗ってる奴の中には、こういうしょうもないのが時々いるから
あんまり信用はしてないけど。
この人も結構メディアに露出しているけど、信用をなくすような行動取って大丈夫なのか?
「わかってませんでした。精進します」って言えば済んだことなのに。

491:デフォルトの名無しさん
10/06/14 09:32:56
>MVPを名乗ってる奴の中には
MVPは別に実力に関係ないしな

まぁ色々特典もらえるのは正直うらやましい

492:デフォルトの名無しさん
10/06/14 13:33:26
どこがじゃ

493:デフォルトの名無しさん
10/06/14 13:49:43
>>492
MVP乙

494:デフォルトの名無しさん
10/06/14 20:33:37
まあMVPに実力は関係ないな。
でも、一つのテーマでコミュニティ築く力は凄いと思わない。

495:デフォルトの名無しさん
10/06/14 21:05:26
うん。思わない。

496:デフォルトの名無しさん
10/06/14 21:47:57
思わないんかいw
MVPって数結構多いよね。

497:デフォルトの名無しさん
10/06/14 21:50:59
一時期、ものすごい増えて、今は多少減ったみたい。

498:デフォルトの名無しさん
10/06/14 22:26:37
高い金取るのってエバンジェリストとかそういうのじゃないっけ?
コンサル

499:デフォルトの名無しさん
10/06/14 22:36:01
>>480-484
レスサンクスです。
Producer-Consumerパターンでぐぐったらズバリ出てきました。
こんな一般的な話だったなんて・・・orz

500:デフォルトの名無しさん
10/06/14 22:43:43
シングルスレッドではproducerとconsumerの同期がとれないってのが、
プログラムをマルチスレッド化する大きな動機の一つだもんな。

501:デフォルトの名無しさん
10/06/14 23:32:24
うん。

502:デフォルトの名無しさん
10/06/15 06:54:05
マルチスレッドといえば.Net4使ってるのに生のthreadやらthreadpoolやらを使ってる奴は何がしたいのかわからん
どれだけ俺様ライブラリを量産したいのかと小一時間(ry

503:デフォルトの名無しさん
10/06/15 12:20:19
Producer-Consumerパターンなら生だろうとBackgroundWorkerだろうと大して変わらんだろ

504:デフォルトの名無しさん
10/06/15 21:08:21
そういうことじゃないだろ。


505:デフォルトの名無しさん
10/06/15 21:18:56
ほう

506:デフォルトの名無しさん
10/06/15 21:49:26
>>502はプロデューサーコンシューマーに限った話はしてないよね。

507:デフォルトの名無しさん
10/06/15 22:04:20
そんなMSの俺様クラス作られても、いつサポートされなくなるか分からないしな。

508:デフォルトの名無しさん
10/06/15 22:36:19
しかしまぁ大手のマルチスレッド関連の記事は古いものばかりだな
忙しくなけりゃ俺が寄稿してあげたいぐらいだわ

509:デフォルトの名無しさん
10/06/15 22:37:49
>>508
ブログにでも書け

キーワードさえうまく配置してればそのうち広まるよ

510:デフォルトの名無しさん
10/06/15 22:38:57
俺様ライブラリ(車輪の再発明)批判はいいとして、
それがどうして「生のthreadやらthreadpoolやらを使」うことがそれだって言うの?

そっちの方が意味がわからんよ。

511:デフォルトの名無しさん
10/06/15 22:46:06
>>458
んーこのblogなんとなく見てたら気になるとこいっぱいあるな…
でももうコメントもできんし。
っていうかだれかすでにコメントしてて消えちまったのかもしれんが。


512:デフォルトの名無しさん
10/06/15 23:52:40
>>504
.NET4触ってないからよくわからないんだが、Threading.threadは使わずにBackgroundWorker使えって事?
それとも.NET4はもっと便利なのがあるってこと?

513:デフォルトの名無しさん
10/06/16 00:06:43
あるよ

514:デフォルトの名無しさん
10/06/16 00:34:11
>>512
Task クラスとか、Parallel クラスとかが増えた。

515:デフォルトの名無しさん
10/06/16 06:25:10
目的が異なるものを比較する意味がわからん

516:デフォルトの名無しさん
10/06/16 06:41:52
え?w

517:デフォルトの名無しさん
10/06/16 09:26:18
は?

518:デフォルトの名無しさん
10/06/16 10:08:53
あ?w

519:デフォルトの名無しさん
10/06/16 10:10:59
お?

520:デフォルトの名無しさん
10/06/16 11:26:09
並列用のパラレルAPIやParallel Linqで、GUIの非ブロック化処理を書いちゃうわけか。
それはそれでやばげだな。

521:デフォルトの名無しさん
10/06/16 12:30:20
誰かいないのか?
それはそれでやばげだなって言ってんだろ!

522:デフォルトの名無しさん
10/06/16 14:07:14
ふざけんな!
俺がやばげだなつってるんだから反応しやがれ!

523:デフォルトの名無しさん
10/06/16 16:01:52
だあれもいない(´・ω・`)ショボーン

524:デフォルトの名無しさん
10/06/16 17:36:48
それはそれでやばげだが、それもありなんじゃないかなって、今はそう思えます。

525:デフォルトの名無しさん
10/06/16 20:29:38
.net4はキャンセルフレームワークが追加されたのがいいな
これでマルチスレッドを使う人がちゃんとキャンセル実装をするようになればいいが…

526:デフォルトの名無しさん
10/06/16 20:34:27
耳毛、鼻毛を笑う。

527:デフォルトの名無しさん
10/06/16 21:27:25
しかし、そんなスレッドを酷使するような計算量のアプリって書いたことないなぁ。
あると欣喜雀躍する人がいるのは分かるがパンピーなプログラマでそんなもの要るの?
ちゃんとプロファイリングしてれば、キャンセルなんて考える必要なんて無いのが経験則。

それとも皆、もしかして物理シミュレーションとか暗号鍵解読とかでもやってるのか?

528:デフォルトの名無しさん
10/06/16 21:32:56
スレッドを酷使するかどうかとキャンセルを考えるかどうかがなんで同列に並んでんの?
俺の経験からいけばそれらは関係がないんだけど。

529:デフォルトの名無しさん
10/06/16 21:37:11
いや、長時間じゃなくてもGUIアプリで計算しようとしたら別スレッドにするだろ。
しない?なら言う事は何も無いな。

530:デフォルトの名無しさん
10/06/16 21:38:45
C#でGUIアプリをつくったらそれを別スレッドで行わないことが困難だろう。

531:デフォルトの名無しさん
10/06/16 21:40:50
パラレルを活用するのはそれなりに限られてるけど、
タスク系統は普通に使うでしょ。


532:デフォルトの名無しさん
10/06/16 21:45:24
>>527はどうしようもないバカ
スレッドのキャンセル書けないバカは一生マルチスレッドするな。

533:デフォルトの名無しさん
10/06/16 22:25:39
こうやってみるといかにマルチスレッドを使いこなしてないかわかるな
まぁちゃんとわかって仕事で使ってる人間なんてほんの一握りなわけだが

534:デフォルトの名無しさん
10/06/16 22:32:55
むしろよくわからないなら使わない方が良いとは思う。
大抵のビジネスアプリは使わんでも何の問題もない。

535:デフォルトの名無しさん
10/06/16 22:44:38
俺はビジネスアプリ作ってるけどかなり多用してるな
とはいえあまり見ないのもたしか
UIがフリーズしたり複数のタスクが同時に出来ないアプリが多い事多い事…

536:デフォルトの名無しさん
10/06/16 22:51:31
仕事だと危険すぎてやらせる気にならんのだよね。
自分だけで作る部分ならいいんだが。


537:デフォルトの名無しさん
10/06/16 22:51:45
ぶっちゃけスレッドって難しいじゃん
サンプル程度のものなら簡単に理解できるし実装も簡単だけど
いざちゃんとやろうと思ったら同期、同調、排他、例外処理、キャンセル、etc...と糞難しい
設計力も数段上の力が求められるしさー
業務系とかそれが出来ないからモーダルウィンドウに逃げてる人多いじゃんよ

538:デフォルトの名無しさん
10/06/16 23:00:14
中級者御用達のクック本。
その中でも最も難易度の高い非同期項目みて”超初心者向けだな”とか思える人が集まらないと実務じゃ無理。

539:デフォルトの名無しさん
10/06/16 23:03:48
マルチスレッドは怖いです

540:デフォルトの名無しさん
10/06/16 23:04:36
はいはい

541:デフォルトの名無しさん
10/06/16 23:06:39
実際のところ、UI止めたくないから裏でスレッド、くらいにしか使ってない。

542:デフォルトの名無しさん
10/06/16 23:11:53
GUIの裏で計算だとか通信だとかするならbackgroundworkerでよくね?
MSもこういう用途のために作ったんじゃないのかね
普通の受託開発屋なら通信部分って自前で書かない場合多いし

543:デフォルトの名無しさん
10/06/16 23:12:20
低能だからね。

544:デフォルトの名無しさん
10/06/16 23:30:05
>>542
だってそれ使うと同調しにくいじゃん…
スレッドも一本しか使わないし…
それ以上にUIにベッタリな仕様だからビジネスロジック部分には不向き

複数のスレッドで別々の処理をやってある時点で非同期に集計してその後にまた別の処理を…
なーんてことやると一気に難易度がググーーーンと上がっちゃいます!><

545:デフォルトの名無しさん
10/06/17 00:05:35
出来るならやりゃいいと思うけど
適当に人あつめると出来ない人の方が多いからなあ。
低い方に合わせて作らんと死ぬよね


546:デフォルトの名無しさん
10/06/17 00:17:18
UI止めないのは操作感の改良だから、多重の並列処理はできないようにしてるが、
特に客から文句言われた事ないな。
計算が遅けりゃ十中八九はデータの持ち方とかに問題があって遅いから、遅いと
文句言われたら改良する。
文句言われなけい限り、保守とかが楽な方に意図的に流してる。

でもスレッドとか(あと信じられないことにコレクション)をヘルプのサンプル引き写し
レベルで使ってるだけで、マニアックだとか難しくて他の人が保守出来ないから
チーム作業ではやめてくれないかとか罵倒されて
(´・ω・`)。。。(いくらなんでもあんたらが時代遅れだろ)
とか思うが相手が大多数なので言えない。
これは俺の勤め先がブラックなんだよな、な?一般的じゃないよな?(マ板行け自分)

547:デフォルトの名無しさん
10/06/17 00:19:42
>>544
勝手に上がればーーーーか(´・ω・`)

548:デフォルトの名無しさん
10/06/17 00:23:53
>>544
そういう時はほかの方法でやるだろうよ。


549:デフォルトの名無しさん
10/06/17 00:40:39
外資の俺が言うのも何だが未だに国内で組んでるエンジニアはレベルが低いな…
スレッドぐらい使いこなせよ…

550:デフォルトの名無しさん
10/06/17 00:43:35
>>549
>スレッドぐらい使いこなせよ

レベルの低い会社に勤めてるのですねw

551:デフォルトの名無しさん
10/06/17 01:00:29
まあ自称分かってるやつが一番地雷なんだけどな。

552:デフォルトの名無しさん
10/06/17 01:08:08
使いこなせてる俺はいつの間にやら上級PGだったようだ
おまえ等、俺に挨拶は?

553:デフォルトの名無しさん
10/06/17 01:08:35
URLリンク(blogs.msdn.com)
なんでvolatileなのに問題が発生するのか説明してみて。


554:デフォルトの名無しさん
10/06/17 01:15:18
>>553
説明もなにも二つのスレッドが協調すべきなのにその操作をいれてないからだろ
そのブログじゃ同時に実行される云々いってるがスケジューラの指定が無い以上どっちが優先されるのかはプロセッサ任せ
つーかロックすらかけてない互いの状態弄って何がしたいのかわけわからん
volatileは全く関係ねぇよ

ふー、やっぱ俺って天才だわ
上級PGなめんなよ!

555:デフォルトの名無しさん
10/06/17 01:29:58
>>554
何を言ってるんだお前は…


556:デフォルトの名無しさん
10/06/17 01:35:27
volatileには順序保障の役割がある。
・volatile読み込みより前の書き込みは必ず先に実行される
・volatile書き込みより後の読み込みは必ず後に実行される
にも関わらず>>553ではすべての読み書きがvolatileなのに順序問題が起こる。
これはなぜか説明してみろという話。


557:デフォルトの名無しさん
10/06/17 01:42:14
いや、
・volatile書き込みより前の書き込みは必ず先に実行される
・volatile読み込みより後の読み込みは必ず後に実行される
かな

558:デフォルトの名無しさん
10/06/17 01:58:43
だからレジスタ依存=プロセッサに依存するつってんだろー
それを阻止する為に~やりましょうとかずれてるわけで
ちゃんとやるならロックや適切なスケジューラを指定するのが常なんだよ!

上級PGなめんなよ!

559:デフォルトの名無しさん
10/06/17 02:06:04
上級な土方

560:デフォルトの名無しさん
10/06/17 02:09:16
まったく何でかが知りたいならO-o-Oでググれや

上級PGなめんな!

561:デフォルトの名無しさん
10/06/17 02:16:05
え、volatileに同期処理なんてあるの?初耳だわ。

562:デフォルトの名無しさん
10/06/17 02:22:54
同期じゃねぇよ
ただのコンパイラ最適化防止の為じゃ
そして>>553の記事は最適化は防げてもプロセッサの最適化(OoOのね)は防げないから任意でThread.MemoryBarrier()挟んでメモリバリアしろよタコ助共つーこと

上級PGなめんなよ!
つーかスレッド使う予備知識の基礎中の基礎だろ!

563:デフォルトの名無しさん
10/06/17 03:30:13
>>546
俺もいい言葉を言われたことがあるので伝えておくよ。
「ジェネリクスは信用してないから禁止」

564:デフォルトの名無しさん
10/06/17 03:57:44
>>561
C++のvolatileと混同してない?C#のにはあるよ。
ただOoOに対しては有効じゃないのかなぁ。

565:デフォルトの名無しさん
10/06/17 04:49:42
初鼻だわ。

566:デフォルトの名無しさん
10/06/17 05:59:33
あのな、スレッド関係で、順序保障の機能ってのはOoOの順序問題とかの解決に使う。
当然、C#のvolatileは順序を保証するために使える。

ではなんで>>553では全部volatileなのに順序問題が発生するのか。


567:デフォルトの名無しさん
10/06/17 06:14:20
参考
URLリンク(msdn.microsoft.com)


568:デフォルトの名無しさん
10/06/17 06:32:28
つまり>>551


569:デフォルトの名無しさん
10/06/17 06:42:49
参考
URLリンク(www.microsoft.com)
この辺が詳しいな。


570:デフォルトの名無しさん
10/06/17 06:56:55
>>563
デリゲート禁止ってのもあった・・・

571:デフォルトの名無しさん
10/06/17 08:55:56
いつからvolatileがOoOの順序保障が行われるようになったのやら
ほんとレベル低いな

572:デフォルトの名無しさん
10/06/17 10:30:22
>>563
医者が扱う薬の話かよ

573:デフォルトの名無しさん
10/06/17 10:51:05
/ufcpp.net/study/csharp/sp_thread.html
volatileって何だろうと思って凄腕の人の解釈見たらコンパイラの最適化防止ってかいてあるお

ゆとりPGをなめんなおっおっ( ^ω^)

574:デフォルトの名無しさん
10/06/17 13:38:23
>>573
最適化でその変数がなかったことにされるのを防ぐだけ

575:デフォルトの名無しさん
10/06/17 13:41:28
何のために?

576:デフォルトの名無しさん
10/06/17 13:43:09
グローバル変数的に使うために用意した変数が、同ファイル中で手をくわえられてないから最適化で削除されちゃう
とかを防ぐためじゃなかったっけ。

577:デフォルトの名無しさん
10/06/17 13:43:56
コンパイラが不要だと思っても、実は他のスレッドが
必要としているかもしれないから。

578:デフォルトの名無しさん
10/06/17 13:44:31
volatileは順序保障するとか言ってた奴出てこいw

579:デフォルトの名無しさん
10/06/17 13:46:14
あぁ、スレッドであれこれするときに読むんだけど、おまえそのスレッドでその変数変更してねえのになんで読むんだよ
それいらねえだろってコンパイラが言ったら、それは別のスレッドが書き変えてるかもしれないの!って注意してやるんだったか

580:デフォルトの名無しさん
10/06/17 13:52:45
C言語のvolatileが想定してたのはSignalなどのCPU割り込み処理で、
スレッドのことは考えてなかった。
よくvolatileをスレッドで使うなというのはこのため。
C#やJavaのようなはじめからスレッドを想定してる言語では意味を拡張していて、
スレッドに対して使えるようになっている。

>>553の他の記事を見たが他のはエラーが起きたときのダイアログやメッセージを
イメージでアップしているが、この記事にはない。
おそらく手元の環境でエラーが起きなくて脳内で書いてるんじゃないのかな。
誰かこのプログラムでAssertが起きた人いる?

581:デフォルトの名無しさん
10/06/17 15:29:45
並列化で思い出したが、SIMD対応ってもうやる気無いのかね?
昔はJITの利点の一つとして喧伝してたもんだったが

582:デフォルトの名無しさん
10/06/17 16:05:48
環境に応じてスカラでXMMレジスタを使ってるらしい。
ベクトル化はMono.Simdのようなやり方しかないのだろうか。

583:デフォルトの名無しさん
10/06/17 17:01:13
Matrixとか折角あるのに対応してないのかね
つーかアレDirectX由来だっけ?

584:デフォルトの名無しさん
10/06/17 17:06:53
もともとMatrixはJpegやMpegの展開のために用意されたんじゃなかったっけ?
これからはマルチメディアの時代だとか言って。
今はビデオの展開はGPUの仕事になっちゃってるからCPUのMatrixはあんまり使ってないような。

585:デフォルトの名無しさん
10/06/17 17:27:28
Matrixの主な用途はTransformだと思ってた俺

586:デフォルトの名無しさん
10/06/17 17:53:49
>>585
君が正しい

587:デフォルトの名無しさん
10/06/17 19:44:11
var hoge = new hogehoge()
「新人がわかんないだろ、意地悪すんなよ」って言われた

588:デフォルトの名無しさん
10/06/17 19:56:13
新人いじめかよ
最低だな

589:デフォルトの名無しさん
10/06/17 20:02:15
volatileはメモリの読み書きを最適化して消さないだけ
それ以外は特に何も保証しない

590:デフォルトの名無しさん
10/06/17 20:07:59
>>578
ここはでたらめ言うだらけだな。

URLリンク(msdn.microsoft.com)
URLリンク(msdn.microsoft.com)
URLリンク(www.microsoft.com)

>>574
URLリンク(www.microsoft.com)
この辺読みゃ分かるが、よく誤解されてるように読み込みそのものが削除されるようなことは普通はない。


591:デフォルトの名無しさん
10/06/17 20:08:57
ぜんぜん前の書き込みを読まない奴だな。それはCの話だ。

592:デフォルトの名無しさん
10/06/17 20:11:32
>>589
そろそろ痛いから言語仕様でも読んでみな。
>>590の最初のリンクだけでも十分だ。

>>580
>>553のソースでしっかりAsser起こる。
一瞬なんで?って思ったが、まあよく考えてみれば確かに起こってもおかしくはないのかな…って感じ。


593:デフォルトの名無しさん
10/06/17 20:16:33
なんかごっちゃになっている奴がいるようだけど、volatile保証するが読み書きの順序と、
複数のスレッドが変数にアクセスする順序は別の問題だから。

594:デフォルトの名無しさん
10/06/17 20:19:05
>>593
未だに>>553の意味わかってないだろ。


595:デフォルトの名無しさん
10/06/17 20:20:35
いや、微妙だな、わかっていっているようにも読める。


596:デフォルトの名無しさん
10/06/17 20:22:20
C#の話だったのか

597:デフォルトの名無しさん
10/06/17 20:23:49
スレタイ読んでなかったのか

598:デフォルトの名無しさん
10/06/17 20:24:10
>>590
遠まわしな説明でよく解らんな。

メモリバリアの機能を含んでいるどうかだけ書けば1行ですむのに。

599:デフォルトの名無しさん
10/06/17 20:28:07
というか、>>553の例はコンパイラが無意味に見える命令を削除しているだけじゃないのか?

600:デフォルトの名無しさん
10/06/17 20:28:59
はい?


601:デフォルトの名無しさん
10/06/17 20:30:50
volatileは最適化をなくし削除しなくなるんじゃなかったのかよw


602:デフォルトの名無しさん
10/06/17 20:32:08
こんな風に分かってるつもりのやつがでたらめなことばっかり言うから、
危なくて使えないんだよ。


603:デフォルトの名無しさん
10/06/17 20:36:47
>>598
>メモリバリアの機能を含んでいるどうかだけ書けば1行ですむのに。

メモリバリアの機能を含んでるならなんで>>553はAssert起こって、
明示的にメモリバリア命令入れたら起こらなくなるの?

って思うわな普通。
メモリバリアって言っても一言で言えるほど単純な話じゃない。


604:デフォルトの名無しさん
10/06/17 20:42:36
volatile は確かに最適化を抑止するんだが、それは一つのスレッド内で変数の参照順を
変更するようなものに限られるんだよ。

605:デフォルトの名無しさん
10/06/17 20:58:58
10.4.3 Volatile フィールド
他のスレッドによる volatile 書き込みは、それらが実行された順にすべてのスレッドで行われます。


606:デフォルトの名無しさん
10/06/17 21:38:57
趣味でしかプログラミングをしない俺にはサッパリだ。

607:デフォルトの名無しさん
10/06/17 21:54:02
まあ、そこの原文の
These restrictions ensure that all threads will observe volatile writes performed by any other thread in the order in which they were performed.
A conforming implementation is not required to provide a single total ordering of volatile writes as seen from all threads of execution.
2行目の全順序は要求されないってのが結局>>533の理由なのかな。


608:デフォルトの名無しさん
10/06/17 21:55:08
>>553だったorz


609:デフォルトの名無しさん
10/06/17 21:58:07
>全順序は要求されない
「単一」の全順序は要求されない
が重要か。


610:デフォルトの名無しさん
10/06/17 22:00:41
特定のスレッドを特定のCPUコアで動かすのってどうやるんだっけ?

611:デフォルトの名無しさん
10/06/17 22:07:31
そんなこと考えてる前にlockしちゃうなぁ。
var obj = new Object();
としといて
lock (obj) { s_x = 1; s_ya = s_y; }

lock (obj) { s_y = 1; s_xa = s_x; }
で、俺的には万事解決。
色々深遠な問題もあるだろうけど、そんなこと知ったこっちゃねー♪

612:デフォルトの名無しさん
10/06/17 22:18:21
まあそもそもこんな処理は普通は出てこないからなー。
これはあくまで予想と異なる結果になることがあるのを示しているだけで。

ただ、こういうコードを、無意識のうちに、動作を無意識に期待して書いてしまう可能性はあるかもしれない。
まあ普通はマルチスレッドで何かを書く場合は常に同期のタイミングは考慮しながら書くから、
多分めったなことはないとは思うけどね。


613:デフォルトの名無しさん
10/06/17 22:24:25
でもいるんだよ。
既存の処理をなんにも考えずにマルチスレッドにしちゃうのが・・・

614:デフォルトの名無しさん
10/06/17 22:52:56
>>604
参照順は変更されるんじゃないの?
volatile読み込みは他の読み込みよりも早く行われるんでしょ?

615:デフォルトの名無しさん
10/06/17 22:56:00
>>614
まあね。orz

616:デフォルトの名無しさん
10/06/17 23:00:46
>>614
変更されないよ。

>volatile読み込みは他の読み込みよりも早く行われるんでしょ?
そうじゃない。
volatile読み取りよりも後ろにある読み取りが、
volatile読み取りよりも前に移動されるような最適化は行われない
ってこと。


617:デフォルトの名無しさん
10/06/17 23:07:25
>>616
あぁー、そう読むのかぁ。
もっと精進します。

618:デフォルトの名無しさん
10/06/17 23:10:04
そもそもvolatileの順序保障をどういう風に使うかというと、
例えば
int data1;
int data2;
volatile bool completed;
みたいな変数定義を行って、
スレッドAで、
data1 = 1
data2 = 2
completed = true;
みたいなことをして、
スレッドBで、
if (completed)
{
//data1とdata2を読み取り
}

みたいにしたとき、data1とdata2の読み取りで、
確実にスレッドAで更新された結果にアクセスできる。
これは、
volatile書き込みより前の書き込みは必ずvolatile書き込みより前に行われ、
volatile読み取りより後の読み取りは、必ずvolatile読み取りより後に行われることが保証されてるから。


619:デフォルトの名無しさん
10/06/17 23:12:58
もしこの保証がないと、スレッドBでの読み取りで、
data1とdata2が、スレッドAが書き込んだ結果であることを保証できない。


620:デフォルトの名無しさん
10/06/17 23:14:24
>>618
> volatile書き込みより前の書き込みは必ずvolatile書き込みより前に行われ、
> volatile読み取りより後の読み取りは、必ずvolatile読み取りより後に行われる
リンク先にも確かにかいてあるけれど、これに当てはまらないものはすべて保障されていないと考えるべきなのかな。

volatile書き込みより後ろの書き込みが、volatile書き込みより前に行われる可能性とかそういうの。

621:デフォルトの名無しさん
10/06/17 23:24:01
C#の言語仕様では保証されてないはず。
ECMAのCLIのメモリモデルでも、
・読み取りと書き込みは、volatile の読み取り前に移動することができない。
・読み取りと書き込みは、volatile の書き込み後に移動することができない。
というルールしかないので保証されない。
ただし、CLR2.0のメモリモデルではもう少し保証が強い。
詳しくは
URLリンク(www.microsoft.com)
なんだけど、分かりにくいなw

少なくとも書き込み順序は変更されないはず。
なぜなら、CLR2.0では実質書き込みは全て「解放形式」になっているらしいので。

622:デフォルトの名無しさん
10/06/17 23:26:36
おっと、そこのリンクの
4.書き込みは、同一スレッドからの別の書き込みを超えて移動することができない。
があるので、書き込み順序はたとえvolatileでなくとも、変更されることはないな。


623:デフォルトの名無しさん
10/06/17 23:42:25
順序がどうとか、なんでそういう話になるのか意味がわからんよ。
volatileの意味は文字通りその変数を非同期的に変更されうるものとして
扱うという意味以上でも以下でもないはずだと思うんだけど....

624:デフォルトの名無しさん
10/06/17 23:48:23
>>623
俺もそれだけの意味だと思っていたんだけど、C#では違うということを恥ずかしながら今日知りました。

625:デフォルトの名無しさん
10/06/17 23:52:24
なんだよ、結局またわかってないヤツが暴れてただけかよw

626:デフォルトの名無しさん
10/06/18 00:02:39
俺は暴れてはいないつもりなので、他にも分かってない人がいたのでしょう。

627:デフォルトの名無しさん
10/06/18 00:04:30
>>626
お前だろ

628:デフォルトの名無しさん
10/06/18 00:08:54
俺のようなヘボプログラマにとっての結論は、
マルチスレッドではvolatileに頼るなということだな。

629:デフォルトの名無しさん
10/06/18 00:08:57
そんな、高速だけど分かってる奴でもとっちらかって間違いかねない仕掛けで書くより、
遅くても排他処理でガチガチ泥臭く書いたほうがメンテナンスとか考えると現実的じゃね?
忘れた頃に見直す度に一々頭の中で再検証すんのかよ、って話。

630:デフォルトの名無しさん
10/06/18 00:10:43
だね。メモリバリアメソッドも用がなさそうだし、当面lockステートメントでいいやって思った。
ちゃんと理解できたら正しく速く動作するライブラリを書きたいものです。

631:デフォルトの名無しさん
10/06/18 00:13:12
>>627
なんだ、暴れたのがいまさら恥ずかしくなったか?

632:デフォルトの名無しさん
10/06/18 01:05:25
>>623
こいつがどこまでもバカなだけ。


633:デフォルトの名無しさん
10/06/18 01:07:47
>>630
基本的には正しい判断だと思うよ。
lockだって別にそんなに重いわけじゃない(状況によるが)。


634:デフォルトの名無しさん
10/06/18 01:09:53
>>623
言語仕様からMSDNマガジンの詳細な記事から
何から何まで何度も示されてるのに意味が分からないなら
お前は本当に頭が悪いんだろう。


635:デフォルトの名無しさん
10/06/18 01:57:39
>>553のって
s_x = 1;
s_ya = s_y;
の部分について、s_yの読み取りが先に行われて、
s_xの書き込み、s_yaの書き込みが行われたってことになるの?

636:デフォルトの名無しさん
10/06/18 05:13:58
どうなの?

637:デフォルトの名無しさん
10/06/18 06:28:32
>>629
鉄板でしょう。


638:デフォルトの名無しさん
10/06/18 08:58:25
C#の言語仕様のダウンロードURI教えてください。

639:デフォルトの名無しさん
10/06/18 09:10:49
VS2010のフォルダ内にありましたorz

640:デフォルトの名無しさん
10/06/18 09:58:10
object[] a = string[]{"a"};
string[] b = a as string[];

この処理は純粋にaへの代入とbへのキャストが行われているだけで、
List<object>とList<string>を型変換するときのようなインスタンス
の新規作成はされないと考えてよいのでしょうか?

641:デフォルトの名無しさん
10/06/18 13:53:30
ちょっとした疑問

class A {
object lockobj = new object;

string _a;
public a {
get {
lock(lockobj){
return _a;
}
}
set {
lock(lockobj){
_a = value;
}
}
}

これって、ちゃんとロック掛かるんだろうか?

642:デフォルトの名無しさん
10/06/18 13:54:34


643:デフォルトの名無しさん
10/06/18 13:56:56
>>641
はい

644:デフォルトの名無しさん
10/06/18 15:16:12
>>641
いいえ、コンパイルすらできません

645:デフォルトの名無しさん
10/06/18 15:25:20
>>635ってどうなの?
なんで頭いい人たちみんなスルーなの

646:デフォルトの名無しさん
10/06/18 15:31:28
OoOについてggrks

647:デフォルトの名無しさん
10/06/18 16:28:23
>>644
型がないからってか?
質問の意図はそうじゃないだろ・・・

648:デフォルトの名無しさん
10/06/18 17:16:46
>>641
質問のポイントはLockのスコープからのreturnだろ?
ロックはreturnステートメントの実行直後にはずれるから普通に使える。

649:デフォルトの名無しさん
10/06/18 18:46:23
>>635
>>553の件少し判った気がする。
環境依存があるようだからここにいる人たちも確認してもらえると助かる。

Releaseモードでも確認できるように修正。コンソールに出力させるようにする。
>Debug.Assert(s_xa == 1 || s_ya == 1);
if (!(s_xa == 1 || s_ya == 1)) Console.WriteLine("* {0}, {1}", s_xa, s_ya); 

こちらの環境で確認できたこと。
マルチCPU、マルチコア、ハイパースレッディングでも起きる。
シングルCPU環境では起きない。
Relaseビルド、Debugビルドはどちらでも良い。
Debug実行時に起きる。Debugなしで実行では起きない。

結論
予想が当たってればOoOとか高尚な問題でなく、IDEのデバッガのバグの可能性がある。

650:デフォルトの名無しさん
10/06/18 19:06:46
>>646
すっこんでろ

651:デフォルトの名無しさん
10/06/18 20:41:20
>>649
俺の環境では、デバッグなし実行でも起こってる。


652:デフォルトの名無しさん
10/06/18 20:43:41
>>641
ちゃんとロックかかるってのはどういう意味で言ってる?
ロック自体はもちろん期待通り普通にかかるが、
objA.A =
objA.A + "hoge";
なんてのをアトミックに実行することは当然ながらできない。


653:デフォルトの名無しさん
10/06/18 20:44:30
改行入った…
objA.A = objA.A + "hoge";
な。


654:デフォルトの名無しさん
10/06/18 21:15:29
>>618
なんか違わないか?
その例だと、スレッドBでdata1,data2が「正しく」読める保証は何もないのでは?

でなきゃ、そもそもvolatileって何だって話になる。


655:デフォルトの名無しさん
10/06/18 21:26:12
>>654
>でなきゃ、そもそもvolatileって何だって話になる。
どういう意味??
何言ってるのかわからない。

そりゃまあ>>618には実際にはいろいろ前提があるのは確かだが、
文脈で言いたい事柄の意図は通じると思うが。



656:デフォルトの名無しさん
10/06/18 21:29:24
>>654の指摘が何を言おうとしてるのかわからないので、そうだな、
>その例だと、スレッドBでdata1,data2が「正しく」読める保証は何もないのでは?
なぜ保証がないのかを具体的に書けばそちらの意図はわかるかもしれん。


657:デフォルトの名無しさん
10/06/18 21:33:09
無意味な実装検証してもしょうがないような

658:デフォルトの名無しさん
10/06/18 21:35:39
>>656
そもそもその保証がない(コンパイラの最適化によって変数そのものには
アクセスしない可能性がある)から、そういう可能性を排除するためのvolatileの
はずなんだけど....

どうもこのスレ、分かってるのか分かってないのかよく分からん人が多いよな

659:デフォルトの名無しさん
10/06/18 21:38:32
volatileの使い方?を勘違いしてる

660:デフォルトの名無しさん
10/06/18 21:42:04
ひょっとして>>590の後半に書いてるような、よくある誤解をしてるクチかな?


661:デフォルトの名無しさん
10/06/18 21:43:49
よくある誤解、ねえ....

662:デフォルトの名無しさん
10/06/18 21:44:48
>>658
それがよくある誤解。そんなことは起こらない。
何度も何度も何度も出してるけど
URLリンク(www.microsoft.com)
でも読んでみ。
※今はC#のvolatileの話だぜ


663:デフォルトの名無しさん
10/06/18 21:49:59
volatileの意味を誤読してるとか

664:デフォルトの名無しさん
10/06/18 21:51:18
>>658
メモリモデルの意味を全く理解してないな。

だったら、例えばもしlockで排他制御してた場合に、
他スレッドで更新した変数をlock内できちんと読めるのはなぜか考えてみな。
最適化で削除されるならそれすら保証されなくなる。

lock内では削除したらダメってコンパイラにはわかってるだろとか考えなしなこと言うなよ。
lock内から呼び出される普通のメソッドだってあるんだからな。
コンパイル時にそこがlock内かどうかなんて判断は無意味なこと。


665:デフォルトの名無しさん
10/06/18 21:53:01
>>662
だからvolatileの話じゃないし。
その参照先のどこにも「C#ではキャッシュを読む最適化は行われない」
とは書いてないように思うが。

666:デフォルトの名無しさん
10/06/18 21:58:40
メモリモデルのルールをよく読め。
------
読み取りが、同一スレッドから同一ロケーションに対する別の読み取りに隣接している場合、その読み取りは削除のみ可能。
書き込みが、同一スレッドから同一ロケーションに対する別の書き込みに隣接している場合、その書き込みは削除のみ可能。
規則 5 により、複数の読み取りまたは書き込みを隣接させてから、本規則を適用することが可能です。
------


667:デフォルトの名無しさん
10/06/18 22:01:01
>その参照先のどこにも「C#ではキャッシュを読む最適化は行われない」
>とは書いてないように思うが。

あのな、volatile読み取りより後の読み取りは必ずvolatile読み取りより後で実行されるってのは、
CPUのキャッシュ制御を含んだ話だよ。
>>618
ではvolatile読み取りの後に変数にアクセスしてるだろうが。
だから必ずキャッシュではなく(別スレッドで更新された)最新の値が読み取られる。
っていうかそのためのvolatileだって話。


668:デフォルトの名無しさん
10/06/18 22:02:41
どれとも
>その参照先のどこにも「C#ではキャッシュを読む最適化は行われない」
>とは書いてないように思うが。
これはCPUキャッシュじゃなくて、レジスタにキャッシュするとか、そういう意味で書いてるのか?
それなら、それこそ>>666の話だ。
隣接する同一ロケーションからの読み取り以外で、読み取りが最適化によって削除されることはない。


669:デフォルトの名無しさん
10/06/18 22:10:40
>>666
「ケースAの場合、readのみが削除可能」という文章は、
「readが削除されるのはケースAの場合のみである」という意味ではない。
大丈夫?

>>667
どう読んでも君が思ってるような意味には解釈できないと思うが...

「処理Aと処理Bはシーケンシャルに実行されます」の意味は、
処理Aに続いて行われる処理Bに対して最適化が行われない、などということを意味しない。

670:デフォルトの名無しさん
10/06/18 23:40:03
ふえ?

671:デフォルトの名無しさん
10/06/19 00:00:00
>「ケースAの場合、readのみが削除可能」という文章は、
>「readが削除されるのはケースAの場合のみである」という意味ではない。
>大丈夫?

あほくさいこと言う前にそのページ全体をよく読んでみろよ。
メモリモデルをどのように定義してるか書いてあるから。
「メモリ モデルは、順次一貫性モデル (最も制限的かつ厳密なモデル) をベースとし、」ってとこらへんな。
だいたいそんなこと言ったら書いてないことだらけなんだから、そういう読み方じゃおかしいことくらいわかろうに。

>「処理Aと処理Bはシーケンシャルに実行されます」の意味は、
>処理Aに続いて行われる処理Bに対して最適化が行われない、などということを意味しない。
どこの記述のことを言ってるのかわからんがな、処理Bの最適かって具体的に何のことを言ってる?
読み取りの最適化なら、前に読んだ値をキャッシュしておくくらいしかないだろ。
メモリモデルでは、そういうのを読み取りを前に移動するという風に定義してるんだよ、上のページにちゃんと書いてある。
そして読み取りはvolatile読み取りより前に移動できない、
つまり、volatile読み取りより前に読み取りをキャッシュしておくという最適化は許されない。
全部書いてある。


672:デフォルトの名無しさん
10/06/19 00:04:49
もういちいち説明するのめんどくさい、勝手に自分流解釈しとけ。
メモリモデルのこととかある程度わかってる人間ならすぐに理解できる話だ。
volatile絡みのルールの話も、マルチスレッドでのメモリモデルの一般的な話を理解してるなら
はっきり言って常識レベルの話(ごくごく一般的なルール、javaのメモリモデルも同じようなルール)。
一回マルチスレッドのメモリモデルや順序について詳しく調べてみ。

673:デフォルトの名無しさん
10/06/19 00:17:33
>>658
お前が分かってないことははっきりしてる。


674:デフォルトの名無しさん
10/06/19 00:27:55
>>658
>そもそもその保証がない(コンパイラの最適化によって変数そのものには
>アクセスしない可能性がある)から、そういう可能性を排除するためのvolatileの
>はずなんだけど....

URLリンク(msdn.microsoft.com)

Cとかの感覚で言ってるのかもしれないが、今どきのマルチスレッドを前提とした
havaやC#のような言語では、そう簡単にアクセスそのものが消されることはないよ。

マルチスレッドで正常な動作を保証するために(保証するようなコーディングができるようにするために)、
メモリモデルというものを定義して、そのルール内で最適化を行うようになってる。
だからlockやvolatileなどをルールに従って使用して、正常に動作することが保証できるコーディングを行える。


675:デフォルトの名無しさん
10/06/19 00:36:38
Wordドキュメントになってるc#言語仕様の、10.5.3 Volatile フィールドの説明でも、
>>618のような動作を正常に行えるようにvolatileを使う例が書いてあるな。
まあ日本語がおかしくて意味不明な感じに読めてしまうけどな。
言ってることはまさに>>618と同じ。


676:デフォルトの名無しさん
10/06/19 00:38:40
using System;
using System.Threading;
class Test
{
public static int result;
public static volatile bool finished;
static void Thread2() {
result = 143;
finished = true;
}
static void Main() {
finished = false;
// Run Thread2() in a new thread
new Thread(new ThreadStart(Thread2)).Start();
// Wait for Thread2 to signal that it has a result by setting
// finished to true.
for (;;) {
if (finished) {
Console.WriteLine("result = {0}", result);
return;
}
}
}
}
この例では、次のように出力されます。
result = 143
この例では、Main メソッドが Thread2 メソッドを実行する新しいスレッドを開始します。このメソッドは、値を result という非 volatile フィールドに格納し、
次に volatile フィールド finished に true を格納します。メイン スレッドは、フィールド finished が true に設定された時点で、フィールド result を読み込みます。
finished は volatile として宣言されているため、メイン スレッドはフィールド result から値 143 を読み込む必要があります。
フィールド finished が volatile として宣言されていない場合は、finished への格納後に result への格納がメイン スレッドから参照可能になります。
その結果、メイン スレッドがフィールド result から読み込む値は 0 になります。finished を volatile フィールドとして宣言すると、このような矛盾を回避できます。


677:デフォルトの名無しさん
10/06/19 00:46:04
あっそ

678:デフォルトの名無しさん
10/06/19 13:25:41
>>658
かたくなにそう信じてるやつがいるんだな…
元々意味のない参照ならそうなる場合はあるが、
普通ほとんどの場合は違うのに。


679:デフォルトの名無しさん
10/06/19 13:38:21
>>669
キリッ
ついていけないならくだらんケチつけなきゃいいのに


680:デフォルトの名無しさん
10/06/19 16:08:49
また同じヤツが暴れてるのかw
お前はもうマルチスレッドとか無理だからあきらめろw

681:デフォルトの名無しさん
10/06/19 18:18:54
クラスアセンブリ(dll)を許可するプロジェクトだけに読み込ませるにはどうすればいいのん?

682:デフォルトの名無しさん
10/06/19 18:31:32
>>681
コールしているアセンブリの署名を調べる。

683:デフォルトの名無しさん
10/06/19 18:41:02
>>682
kwsk!
ちなみにクラスアセンブリは自前のソース月の物でありまする><

684:デフォルトの名無しさん
10/06/19 19:09:18
署名は改ざん検知出来るだけ
DLLのアクセス制限云々の機能ではない

685:デフォルトの名無しさん
10/06/19 19:29:04
やっぱりそうなんですね
がっくし・・・・
ProjectA ---{OK}--- A.dll
第三者のProject ---{NG}--- A.dll
みたいな事をやりたい時はみんなどうしてるのん?

686:デフォルトの名無しさん
10/06/19 19:32:12
そんなことをやりたいと思ったことがない。

687:デフォルトの名無しさん
10/06/19 19:35:14
えー社内ライブラリとかどう管理してるのー?
不正リンクされて盗まれても「でへへっ!」とか言うだけ?
うそーん><

688:デフォルトの名無しさん
10/06/19 19:38:50
>>685
DLLのファイルかフォルダにNTFSのアクセス権つければよくね?

689:デフォルトの名無しさん
10/06/19 19:47:26
制限出来れば
リフレクション使ってクラス調査→不正リンク→(゚∀゚ )アヒャヒャ
という.net固有の糞みたいな問題が解決するけど
未だに対策は難読化しかない。

690:デフォルトの名無しさん
10/06/19 19:53:51
別になぁ。そもそもアセンブリじゃないDLLなら呼び放題だし。
売り物ならライセンス処理つけるだろうし。
お買い上げありがとうございました。だろ?

691:デフォルトの名無しさん
10/06/19 19:55:50
オープンソース時代だから別にいいじゃんw
盗まれたら裁判すればいいし(キリッ

692:デフォルトの名無しさん
10/06/19 19:58:48
>>691
盗んだほうはC++で書きましたってオチだ

693:デフォルトの名無しさん
10/06/19 20:08:44
.NETでなくても、製品の実行ファイルや図版を勝手に使われたらどうするんだよ。
そういうときは法務部門や顧問弁護士の出番。

694:デフォルトの名無しさん
10/06/19 20:18:14
まっ、やり放題な業種だからどうしようもないってこった
裁判なんざ普通は起こせないしそもそも把握すること事態が不可能

695:デフォルトの名無しさん
10/06/19 20:47:43
ヤリ放題な業種だと自分に言い聞かせてるのか?こっちまで巻き込むなよ。

696:デフォルトの名無しさん
10/06/19 20:50:51
巻き込むも何も対策方法が何もない現状
自作パッカー作ったところで焼け石に水
理想は寝て言え

697:デフォルトの名無しさん
10/06/19 20:50:51
>>683
どのアセンブリからコールされているかはわかるだろ。
そして、そのアセンブリがどのような署名されているかを調べる。
逆コンパイル防止はそれ以前の問題。

698:デフォルトの名無しさん
10/06/19 21:05:35
毎回、毎回、クラス毎に調べるのか?
手間かかりすぎだろ

699:デフォルトの名無しさん
10/06/19 21:07:48
いたるところで StrongNameIdentityPermission でDemandでもしとけ。
まあ改ざんされたらもうだめだけどな。


700:デフォルトの名無しさん
10/06/19 21:45:18
単純に
public class MyLicence : License {
public override void Dispose() {}
public override string LicenseKey { get { return ""; } }
}
public class MyLicenceProvider : LicenseProvider {
public override License GetLicense(LicenseContext context, Type type, object instance, bool allowExceptions) {
if (allowExceptions) {
string exename = Path.GetFileName(Assembly.GetEntryAssembly().Location);
if (! exename.Equals("MyLicenceTest.exe")) {
throw new LicenseException(type, instance, "do't licenced");
}
}
return new MyLicence();
}
}
[LicenseProvider(typeof(MyLicenceProvider))]
public class TestClass {
License license;
public TestClass() {
license = LicenseManager.Validate(typeof(TestClass), this);
}
}
とかでもいいんじゃね?呼び出し元exe名縛り。

701:デフォルトの名無しさん
10/06/19 21:54:35
こんな抽象クラスあったのか。
中々面白いアプローチだと思う。

702:デフォルトの名無しさん
10/06/19 21:59:05
ほぉ、これはなかなか…

703:デフォルトの名無しさん
10/06/19 22:05:48
>>701-702
そりゃどうも。えっへん!

704:デフォルトの名無しさん
10/06/19 22:06:08
Licenseは破棄が必要だぜ…


705:デフォルトの名無しさん
10/06/19 22:07:59
と思ったけど必要なければ別に実害はないのか…


706:デフォルトの名無しさん
10/06/19 22:10:53
リソース持ってないし、いいかな?と省略したけど、実装する際は通常通り
Dispose()しといたほうがいいだろね。

707:デフォルトの名無しさん
10/06/19 22:14:16
リソースというか取得したライセンスを開放する処理を好きに定義するだけでしょ
同時利用数をデクリメントするとか
空でも全く問題ない

708:デフォルトの名無しさん
10/06/19 22:20:59
ってことみたいね。


709:デフォルトの名無しさん
10/06/19 22:48:04
というか、キモはexeのファイル名を確認するところなんだから、実装の仕方は人それぞれでしょう。

710:デフォルトの名無しさん
10/06/19 23:10:48
ってことみたいね。

711:デフォルトの名無しさん
10/06/19 23:30:09
>>700をoverrideとか使わずにもっと分かり易く書いてくれ

712:デフォルトの名無しさん
10/06/19 23:33:20
webアプリで
FileSecurity filesecurity = File.GetAccessControl(path);
(pathはstring型でファイルの絶対パスが代入されています)
としました。
このファイルを他のアカウントで作成して、
アクセス権限も拒否にしたら、デバッグ環境でですが、

'/'アプリケーションサーバーエラーが発生しました。

と出て、実行できませんでした。
とりあえず、try catchを使い、アクセス禁止として
処理すれば、実行エラーは回避できました。
DACLとかいまいちわかっていないのですが、
なにか他の回避方法はあるでしょうか?
よろしくお願いします。

713:デフォルトの名無しさん
10/06/19 23:33:38
そんなレベルだったら余計なこと気にするな
どうせその他の部分で穴だらけ

714:デフォルトの名無しさん
10/06/20 00:00:25
>>711
public class Hoge
{
  private Hoge() {}

  public static Hoge()
  {
    string exename = Path.GetFileName(Assembly.GetEntryAssembly().Location);
    if (exename != "hoge.exe")
      throw new Exception();

    return new Hoge();
  }
}

でも、リフレクションやLCGを使われたらどうなるの?

715:デフォルトの名無しさん
10/06/20 00:27:30
LicenseProviderって使ったことなかったからそのサンプルコードとしては
参考になったけど、正直実用的な意味があるとは思えんなあ…

アセンブリがロードされた時に何らかのスタティックメソッドの実行を強制できれば
いろいろ面白いことが出来そうな気がするんだけど

716:デフォルトの名無しさん
10/06/20 00:43:56
そうそう、今回の話とは別に、それ前からほしかったんだよね。


717:デフォルトの名無しさん
10/06/20 01:26:14
実用的には例えばSIDとかMACとかUSBメディアのPNPDeviceIDとか
※ SID : GetComputerName、LookupAccountName API参照
※ MAC : NetworkInterface.GetPhysicalAddress 参照
※ PNPDeviceID : WMI で Win32_DiskDrive, Win32_DiskDriveToDiskPartition, Win32_LogicalDiskToPartition, Win32_LogicalDisk 参照
そういった利用者を一意に特定出来る情報をプロダクトキーと一緒に公開鍵で
暗号化してライセンス認証サーバに送って、サーバで認証後に秘密鍵で
特定情報を暗号化して送り返してもらったものを記録。
その情報を公開鍵で復号して動作環境での取得値と一致していなかったら
ライセンス違反と判断・・・とかメンドクサい実装は必要に応じて。

718:デフォルトの名無しさん
10/06/20 01:53:37
うんまあ改ざんされたら意味ないんだけどね。


719:デフォルトの名無しさん
10/06/20 02:49:16
それを言ったらどんなアプリ、ExcelだろうとWindowsOSだろうと、リエンジニアリング
されてライセンス処理部を改ざんされたら無理。
それを言うことに意味はあるのかな?

720:デフォルトの名無しさん
10/06/20 03:02:30
簡単さが違うって話。


721:デフォルトの名無しさん
10/06/20 05:35:33
確かにDllMain的なのは欲しいよな。

722:デフォルトの名無しさん
10/06/20 11:42:56
static イニシャライザでチェックしちゃいかんの?

723:デフォルトの名無しさん
10/06/20 11:47:55
staticコンストラクタはいつ呼ばれるかわからない

724:デフォルトの名無しさん
10/06/20 12:00:08
アセンブリに属性をつけておいて
その属性にstaticコンストラクタを仕込んでおけば
dllを読みこんだタイミングで実行されたりしないかなあ

725:デフォルトの名無しさん
10/06/20 12:00:32
ふーん

726:デフォルトの名無しさん
10/06/20 12:08:28
>>724
されない
カスタム属性っていうのはあくまでメターデータのラッパークラスなので
インスタンスが作られるのはその属性を参照しようとしたとき

727:デフォルトの名無しさん
10/06/20 12:26:53
お前ら釣り耐性低すぎだろ

728:デフォルトの名無しさん
10/06/20 12:32:24
>>726
(゚∀゚)

729:デフォルトの名無しさん
10/06/20 18:55:14
>>700みて何じゃこりゃとおもったけど>>714見たら恐ろしく単純w

730:デフォルトの名無しさん
10/06/20 19:30:28
何十個もクラスをライセンス管理しないなら >>714 で充分だね。

731:デフォルトの名無しさん
10/06/20 19:53:32
>>729
遅い

732:デフォルトの名無しさん
10/06/20 21:27:20
>>700でも充分簡単じゃねぇか。
あんなのすら分からなかったらそもそもコードかけねぇだろ。

733:デフォルトの名無しさん
10/06/20 21:46:45
>>732
インデントの差だろ

734:デフォルトの名無しさん
10/06/20 22:42:20
まあ確実に言えることは、>>700 程度のコードが複雑に見えるんじゃライセンス保護
なんて当分は無縁だということ。

735:デフォルトの名無しさん
10/06/20 22:50:21
>>733
専ブラで>>700をポップアップさせて見ればいい

736:デフォルトの名無しさん
10/06/21 00:53:37
うほ

737:デフォルトの名無しさん
10/06/21 10:19:51
先生!
thread.spinwaitとthread.sleepってどう違うんですかっ?
MSDN読んでも引数の違いぐらいしかわからないです!
高度な技術を持ってる人、おすえて!

738:デフォルトの名無しさん
10/06/21 10:31:49
解説読めよ。

739:デフォルトの名無しさん
10/06/21 11:41:25
>>738
わかりません!

740:デフォルトの名無しさん
10/06/21 18:04:49
Windowsフォームアプリを作るとメインウィンドウのクラスがめっちゃ大きくなっちゃうんですが、仕方ないんでしょうか?
それともpartialで分割するべきですか?(あまり意味ないと思いますが)

741:デフォルトの名無しさん
10/06/21 18:11:42
partialの分割は意味ない。
ユーザーコントロールにするとか、ビジネスロジックを別クラスにするとか、
そんな感じ。

742:デフォルトの名無しさん
10/06/21 18:49:35
ApplicationContext使って、MainFormにはインタフェースレベルのプログラムしか書かないとかかな。

743:デフォルトの名無しさん
10/06/21 20:37:11
それでもコントロールの量が多いとイベントメソッドだけでもめっちゃ多くなっちゃうんですよね。
そこそこ普通のフリーツールくらいの規模でもメインウィンドウのクラスだけで何千行にもなっちゃう。

744:デフォルトの名無しさん
10/06/21 20:40:43
だから、そーゆーのはユーザーコントロールにまとめるんだってば。

745:デフォルトの名無しさん
10/06/21 20:43:21
で、デザイナがバグって正常に表示されない、とw
あれたぶん2010でも放置なんだろうな

746:デフォルトの名無しさん
10/06/21 21:11:27
>>743 >>745
へったくそだなぁ

747:デフォルトの名無しさん
10/06/21 21:12:31
ユーザーコントロールが正常に動かないのは作り方が悪い

748:デフォルトの名無しさん
10/06/21 21:29:20
>>746
具体的に教えてよ

749:デフォルトの名無しさん
10/06/21 22:12:54
なんでそんなでかくなるんだろ。
イベントが盛りだくさんなの?

750:デフォルトの名無しさん
10/06/21 22:17:36
ボタンが百個あるので、イベントハンドラが百個なんでしょ。

751:デフォルトの名無しさん
10/06/21 22:28:16
ボタン1個にいくつのイベントがあると思ってんだ

752:デフォルトの名無しさん
10/06/21 23:05:11
はなし が かみあって ない

753:デフォルトの名無しさん
10/06/21 23:35:24
やっぱへったくそだな

754:デフォルトの名無しさん
10/06/21 23:50:20
>>746-747
素人臭い意見だな。
そんなわけないでしょw

実際ある程度やってみれば俺の言ってる意味がわかるよ。

755:デフォルトの名無しさん
10/06/21 23:54:22
自称玄人△

756:デフォルトの名無しさん
10/06/22 00:07:04
>>754
ユーザーコントロール使ったこともない自称玄人乙

757:デフォルトの名無しさん
10/06/22 00:12:58
IDEに表示されないという理由だけでユーザコントロールを避けるってどうなの?
#define BEGIN {
と同じくらいひどいと思うんだけど、素人だからですかね

758:デフォルトの名無しさん
10/06/22 00:15:09
それは言いすぎ。
IDEのコード生成は信用できないので禁止、くらいだろ。

759:デフォルトの名無しさん
10/06/22 00:24:31
・・・IDEに出ない?ツールボックスに出てきているコレはなんだろう?

760:デフォルトの名無しさん
10/06/22 00:29:02
>>757
「だから」避けろとか使うべきでない、などとは一言も言ってない。

761:デフォルトの名無しさん
10/06/22 00:31:03
揚げ足取り玄人ですね。かっこいいです!

762:デフォルトの名無しさん
10/06/22 00:34:15
>>760
デザイナがバグって正常に表示されないというのは素人がよくハマる部分だから
気をつけろって言う意味?

763:デフォルトの名無しさん
10/06/22 00:36:18
ガキ臭い揚げ足取りしてるのはどっちだよ。
ネトウヨみたいなよくわからん被害妄想だなおい。

こっちは単にVSのデザイナはユーザーコントロールを使うとバグって
正常に表示されなくなる場合がある、という事実を言ってるだけ。

っていうか、この程度の経験もない奴が偉そうに「ユーザーコントロール使え」
とか人に講釈垂れてるっていい根性してるよな。

764:デフォルトの名無しさん
10/06/22 00:40:46
>>762
VS自体のバグだから使う側が玄人か素人か関係ないし、
気をつけようもないんだけどさだから。

765:デフォルトの名無しさん
10/06/22 01:53:37
該当バグのURL晒したらすぐ済むことなのに

766:デフォルトの名無しさん
10/06/22 02:11:16
VS2008でデザイナがしょっちゅう腐ることがあるやつを
VS2010に持ってきたが、いまのとこ一度も腐ってない

767:デフォルトの名無しさん
10/06/22 02:36:55
2002や2003に比べたら2008の安定ぷりったらないんだけど、2010はさらに調子良いのか
これは楽しみ

768:デフォルトの名無しさん
10/06/22 03:24:29
コントロール多くてもほとんどユーザーコントロールだから、フォーム側に実装する事ほとんど無いなぁ。
そんなにフォーム固有の処理って多いもん?

769:デフォルトの名無しさん
10/06/22 03:50:48
>>768
ユーザコントロール作ったらバグるって言われるよ

770:デフォルトの名無しさん
10/06/22 04:23:34
ボタンにクリックイベント一個付けるだけでもわざわざ一個のユーザーコントロール作るの?

771:デフォルトの名無しさん
10/06/22 04:25:56
そうすべきだと思ったらそうするな

772:デフォルトの名無しさん
10/06/22 04:29:59
>>770
ボタンコントロールにだけ関連する処理ならユーザーコントロールか
継承したクラス作ってそこへ入れてしまえばいいんじゃね?

Formにだらだら書くよりすっきりするよ

773:デフォルトの名無しさん
10/06/22 04:35:29
継承したらそりゃコードは分割出来るけど
デザイナの意味を成さなくなってくるな

774:デフォルトの名無しさん
10/06/22 04:40:23
Visual Studioの登場で、内部はどんどん複雑に、表面は簡単になったおかげで
基本や構造を理解せずに何となくソフトを作るプログラマーが増えた

マシンパワーが有り余ってるから、いいかげんな作りのソフトでもそれなりに動いてしまうのも善し悪し

775:デフォルトの名無しさん
10/06/22 05:00:27
>>773
もう少し詳しく。
適当に予想してレスすると怒られる流れっぽいので。

776:デフォルトの名無しさん
10/06/22 05:11:51
>>773
成すよ
まあこのあたりみてくれ
URLリンク(cs2ch.blog123.fc2.com)

777:デフォルトの名無しさん
10/06/22 05:33:54
>>775
イベント追加する時に+=を書かなくちゃいけなくなるとか

778:デフォルトの名無しさん
10/06/22 05:35:24
>>777
hoge.Click +=
とか書いてTAB2回押せば勝手につくってくれるじゃん

779:デフォルトの名無しさん
10/06/22 05:47:02
>>778
プロパティのイベントを選べないじゃん

780:デフォルトの名無しさん
10/06/22 05:54:13
>>779
だからその辺は>>776読めって
一旦デバックすれば継承したクラスも同じように操作できるから
それができないとFormを継承したForm1の設定はどうやって実現するんだよ
普段コードをごりごり書いてるのはFormを継承したクラスだぞ

781:デフォルトの名無しさん
10/06/22 06:01:54
>>780
MainFormのデザイナから継承させたコントロールのイベントを
プロパティウィンドウからメソッド生成させると
結局MainFormのクラス内にメソッドが追加されないか?
これじゃ分割出来てないんだが

782:デフォルトの名無しさん
10/06/22 10:25:36
ボタン100個あって、100個クリックイベントを書くのは愚の骨頂だろ。
インタフェースの仕事としては、どのボタンがクリックされたかを伝えるだけで良いんだからさ。

それ以上に、動かす用途によって書き方は変わると思うんだが。

783:デフォルトの名無しさん
10/06/22 11:17:47
100個あるボタンそれぞれが全く別の処理を行うというのは考えづらい
ツールボタン的なものや、データ行それぞれに対するコマンドあたりだろうけど
そういうのは共通の入り口から振り分けられる

784:デフォルトの名無しさん
10/06/22 12:30:02
だね

785:デフォルトの名無しさん
10/06/22 13:01:54
private void button1_clickClick(object sender, EventArgs e)
{
  MessageBox.Show("1");
}

private void button2_clickClick(object sender, EventArgs e)
{
  MessageBox.Show("2");
}

...

private void button100_clickClick(object sender, EventArgs e)
{
  MessageBox.Show("100");
}

なんてコードがあったら継承して、一つに纏めろと言いたくなるわな。

786:デフォルトの名無しさん
10/06/22 13:34:52
さすがにそれは・・・w
使う方も大変だな、ボタン100個

787:デフォルトの名無しさん
10/06/22 14:01:28
ソフトウェア和文タイプキーボードとか

788:デフォルトの名無しさん
10/06/22 14:03:54
>>787
TagでもNameでもいいので識別に使う情報も足せておけば
イベントハンドラで余裕で処理できるよ

789:デフォルトの名無しさん
10/06/22 14:10:08
>TagでもNameでもいいので識別に使う情報も足せておけば
>イベントハンドラで余裕で処理できるよ
TagでもNameでもいいので識別に使う情報持たせておけば
一つのイベントハンドラで余裕で処理できるよ

790:デフォルトの名無しさん
10/06/22 14:40:49
>>785
継承も何も、一つだけ作って後は全部同じの指定しろって感じ?w
IDEからもできるしな!

791:デフォルトの名無しさん
10/06/22 14:46:51
>>777
部品化したにもかかわらず、何処かのフォームの勝手な理由で部品を変更しようとするの?

>>790
MessageTextみたいなプロパティをつくり、IDEからも操作できるようにしておき、
クリックされた時にMessageBox.Show(MessageText)を行うようなボタンを作成すれば
IDEで配置→MessageTextを設定
という作業になるよ

792:デフォルトの名無しさん
10/06/22 14:49:52
わざわざつくるのめんどくさくてこうしてしそう。

private void Form1_Load(object sender, eventargs e)
{
    Foreach (Control c in Panel1.Controls)
    {
        if(typeof(c)==typeof(Button)) ((Button)c).Click += new EventHandler(softkeys_button_click);
    }
}
private void softkeys_button_click(object sender, eventargs e)
{
    Textbox1.Text = String.concat(Textbox1.Text, ((Button)sender).Text);
}


793:デフォルトの名無しさん
10/06/22 15:05:21
デザイナで出来ない云々

794:デフォルトの名無しさん
10/06/22 18:05:57
>>785
この例だと継承なんていらないでしょ。
button_clickに全てまとめて自分自身を判別すればいいんじゃまいか。

795:デフォルトの名無しさん
10/06/22 18:09:31
>>794
自分自身を判断する際に適当なプロパティがあるかどうかってところだな。

796:デフォルトの名無しさん
10/06/22 18:15:47
>>795
Tagになんでも設定できるので識別情報を入れるか
Nameにbuttonxxxと言った感じでxxxの部分に識別情報を入れておけばOK

797:デフォルトの名無しさん
10/06/22 18:24:57
>>795
Tagってそういうのに使っちゃダメなの?

798:デフォルトの名無しさん
10/06/22 18:28:35
ボタン10個あってそれぞれに10個のイベントがあったら100イベント。
その他のコントロールもあったら数百個のイベントがあってもおかしくない。
そしてそれらが共通しない機能なのも普通にあり得る。
そういう状況の時にユーザコントロールを使えって話じゃないの?
でもそれだとイベントを関連付けるときにプロパティウィンドウは使えませんよーって話。

799:デフォルトの名無しさん
10/06/22 18:37:59
>>798
>イベントを関連付けるときにプロパティウィンドウは使えませんよ
・・・お前は何を言ってるんだ・・・?
継承したのもカスタムのも、普通にプロパティ窓からイベント付けられるぞ?


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