C#, C♯, C#相談室 Pa ..
[2ch|▼Menu]
489:デフォルトの名無しさん
09/02/23 23:36:40
簡単なファイラーを作っていて
Windows Vistaなどの検索ボックスのように、
スペースで区切ったキーワードにヒットするファイルの一覧を取得したいのですが、
何かスマート(簡単な)方法はないでしょうか?

今のところ、ファイル名に対して、
スペースで区切られたキーワードの数だけstring.containsを行うくらいしか思いつかないんですが、
この方法だと大量のファイルがあった場合に処理が遅くなってしまうと思うので。
# どんな方法でもファイル数が多ければ多いほど時間は掛かると思いますが、もう少し高速に行える方法があればと考えています。

490:デフォルトの名無しさん
09/02/23 23:49:07
>>489
正規表現をコンパイルしたら速いんじゃないか?知らんけどな
Regex.Match(input, "AAA|BBB|CCC", RegexOptions.IgnoreCase | RegexOptions.Compiled);

491:デフォルトの名無しさん
09/02/23 23:52:32
入力内容は毎回変わるのにその正規表現をコンパイルしたら
検索のたびにメモリを食って解放されなくなるぞ

492:デフォルトの名無しさん
09/02/24 00:01:52
ファイル数なんてどんなに多めに見積もっても百万のオーダーとかじゃないのかな?
だとしたらベタにやっても抽出する処理そのものには1秒掛からないんじゃないか。
むしろボトルネックは言うまでもないんだろうけどディスクアクセスって気がする。

493:デフォルトの名無しさん
09/02/24 00:11:15
index seviceを使う。

494:デフォルトの名無しさん
09/02/24 00:23:49
>>490-493
皆様ありがとうございます。

>>492
なるほど。
一度試してみてパフォーマンスをみることにします。

>>493
そんな方法があったとは思いつきませんでした。
軽くググってみると
URLリンク(209.85.175.132)
確かに…、少し調べてみようと思います。

495:デフォルトの名無しさん
09/02/24 00:37:43
インデックスサービスってWindowsにある程度詳しいユーザはたいがい止めてるよ

496:デフォルトの名無しさん
09/02/24 00:51:30
api公開されてアプリケーションから使えるあまり素性が怪しくない無料のエンジンって言うと選択肢それぐらいしかないんじゃない?

497:デフォルトの名無しさん
09/02/24 07:31:14
ジェネリックコレクションの保存ってどうしたらいいんですか?

public class MyList<T> : List<T>
{
 public void Load(string fileName)
 {
  using (Stream stream = new FileStream(fileName, FileMode.Create))
  {
   using (BinaryWriter writer = new BinaryWriter(stream))
   {
    foreach (T item in this)
    {
     writer.Write(item);//コンパイルエラー
    }
   }
  }
 }
}

498:デフォルトの名無しさん
09/02/24 07:34:50
シリアライザ

499:デフォルトの名無しさん
09/02/24 07:34:52
>>497の補足
使いたいTはintやlongやdoubleなどの値型だけです。

500:デフォルトの名無しさん
09/02/24 07:40:15
typeidでわけるしかない。

501:デフォルトの名無しさん
09/02/24 07:56:44
おかげで道がひらけました
ありがとうございます

502:デフォルトの名無しさん
09/02/24 08:14:30
>>497
無理やりだけど、

var write = typeof(BinaryWriter).GetMethod("Write", new[] { typeof(T) });
write.Invoke(writer, new object[] { value });


503:デフォルトの名無しさん
09/02/24 08:24:47
LoadでWrite

504:デフォルトの名無しさん
09/02/24 11:45:19
XmlSerializer使えよ

public void Save<T>(List<T> list)
{
byte[] bytes;
using (MemoryStream ms = new MemoryStream(0x10000))
{
new XmlSerializer(typeof(List<T).Serialize(ms, list);
bytes = ms.ToArray();
}

using (Stream stream = new FileStream(fileName, FileMode.Create))
using (BinaryWriter writer = new BinaryWriter(stream))
{
writer.Write(bytes);
}
}

505:デフォルトの名無しさん
09/02/24 17:24:53
>>497
Loadで保存w

506:デフォルトの名無しさん
09/02/24 18:45:49
>>502が簡単でよさそうだがBinaryReaderでもやろうとすると面倒だな
なんでreadとwriteでこんなにも非対称なコードになるんだ

507:デフォルトの名無しさん
09/02/24 18:49:31
objectで返したらボックス化が発生するからな
標準のライブラリでRead<T>//(注)プリミティブ型のみ
なんて素人臭いことするわけにもいかないし

508:デフォルトの名無しさん
09/02/24 18:56:57
プリミティブ型じゃなくても、そんな大げさにならずに簡単にできるの?

509:デフォルトの名無しさん
09/02/24 19:11:28
参照型のフィールドを含まない構造体限定なら
Marshal.StructureToPtrみたいな外道な方法を用いれば簡単にできる

510:デフォルトの名無しさん
09/02/24 19:13:19
ふんじゃあ、素人臭くてもいいじゃんw


511:デフォルトの名無しさん
09/02/24 21:21:41
他のアプリケーションのアイコン上に、あるテキストファイルをドラッグする処理(と同じ事)を
自作アプリケーション内で行いたいのですが、どのような方法があるのでしょうか・・・?
ドラッグ対象となるアプリケーションはコンソールアプリケーションです。
てぃんこでかい人よろしくおねがいします。


512:デフォルトの名無しさん
09/02/24 21:23:31
Main() の String[] args から取れなかったっけ?

513:デフォルトの名無しさん
09/02/24 21:28:21
その「他のアプリケーション」をプログラムから起動したいってことなら
System.DiagnosticsのProcess
エクスプローラで実行ファイルに何かのファイルをドロップするのは
その何かのファイルを引数に実行ファイルを起動するのと同じ

514:デフォルトの名無しさん
09/02/24 21:32:53
>>513
とても有益なヒントありがとうございました。
ちんこもでかくてありがとうございました。
試行錯誤してみます。


515:デフォルトの名無しさん
09/02/24 21:42:24
ちんこ小さいから回答できなかった

516:511
09/02/24 21:49:03
うーーん。以下のようにしても
ファイルを指定せずに実行ファイルを起動したような動作になっちゃう・・・

proc.StartInfo.Arguments ="あるテキストファイルのパス";
proc.StartInfo.FileName ="受け取り側の実行ファイルのパス";
proc.Start();

517:デフォルトの名無しさん
09/02/24 21:51:11
ちんこついてないから答えられない

518:デフォルトの名無しさん
09/02/24 21:51:29
>>516
「あるテキストファイルのパス」に空白が含まれるなら、""で囲まないとダメ。
具体的には、
proc.StartInfo.Arguments = "\"あるテキストファイルのパス\"";

519:511
09/02/24 21:54:34
こんな感じでしょうか?
""ではかこんでいます。

proc.StartInfo.Arguments = @"C:\sample.xml";
proc.StartInfo.FileName = @"C:\Document and setting\APPLE.exe";
proc.Start();

520:511
09/02/24 22:05:58
>>518
あああいけました
いけました。ありがとうございました。
ちんこにもよろしくお伝えください。

521:sage
09/02/24 23:19:27
RichTextBoxのスクロールバーをつまみで移動させると
ピクセル単位で動くのですが、TextBoxのように行単位で動かせるような方法ないですか?

URLリンク(wawatete.ddo.jp)
にあるような別途スクロールバーを作りたくなくて
RichTextBox備え付けのスクロールバーで実現したいのですが。。。

RichTextBoxのWndProcでつまみスクロールのイベントが来たら
SendMessage(rich1.Handle, EM_SCROLL, SB_LINEDOWN, 0)
で独自で1行スクロールとか試みたんですが、微妙にずれてしまって。。。

ちなみに上記URLと同じ目的ですが、RichTextBoxの左に
行番号を作りたいのですが、テキストが中途半端な表示されると
困るために、行単位でスクロールさせたい次第です。

教えてエライ人!

522:デフォルトの名無しさん
09/02/24 23:37:28
>>521
ボクはGDI+を使って書いた

523:デフォルトの名無しさん
09/02/24 23:38:33
さすがに行番行表示までやるならはじめから自前で作るべきだな

524:521
09/02/24 23:48:13
>>522
kwsk・・・、じゃなくておさわりだけでもいいんで
どんな流れか教えてください。

因みに自分は、クライアント領域が表示されてる分だけ左側に
Labelを配置して、スクロールされたら配置されてる全Labelに
メッセージなげて、Label.Textを変えて行番号を表示する方式を
考えてました。

525:デフォルトの名無しさん
09/02/24 23:50:13
>>506
Reader 側はもっと無理やりだけど、↓でできる。

var read = typeof(BinaryReader).GetMethod("Read" + typeof(T).Name, new Type[0]);
return (T)read.Invoke(reader, new object[0]);


526:デフォルトの名無しさん
09/02/24 23:53:45
ググれ若人

527:デフォルトの名無しさん
09/02/25 00:49:32
VS2008EEのC#でwebBrowser使ってpdfを表示したまま終了すると必ずエラー出すんだけど、これってどうにかできないの?
AdobeReader8ならエラー出なくて9だと出るって事はしばらくしたら改善される?

Delphi2006なら大丈夫だけどあっちはunicodeのテキスト読むのめんどいし、いい方法はないものかね?

528:デフォルトの名無しさん
09/02/25 01:10:55
>527
別のページを表示してから終了とか頑張ってみたけどどうしようもなくて
終了時だけなのでエラーを握り潰して無視したよ。

529:デフォルトの名無しさん
09/02/25 10:04:22
>>497
こんなのはどうかね
public abstract class ReaderWriter<T> : IDisposable
{
protected FileStream stream;
protected BinaryWriter writer;
protected BinaryReader reader;
public abstract void Write(T item);
public abstract T Read();
public virtual void Seek(long offset, SeekOrigin origin) { this.stream.Seek(offset, origin); }
public void Dispose()
{
if (this.reader != null) this.reader.Close();
if (this.writer != null) this.writer.Close();
if (this.stream != null) this.stream.Close();
}
}
public class IntReaderWriter : ReaderWriter<int>
{
public IntReaderWriter(string fileName)
{
this.stream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
this.reader = new BinaryReader(this.stream);
this.writer = new BinaryWriter(this.stream);
}
public override void Write(int item) { this.writer.Write(item); }
public override int Read() { return this.reader.ReadInt32(); }
}

530:デフォルトの名無しさん
09/02/25 10:05:22
>>529の続き
public class MyList<T> : List<T>
{
public void Save(ReaderWriter<T> writer)
{
if (writer == null) return;
foreach (T item in this) writer.Write(item);
}
public void Load(ReaderWriter<T> reader, int count)
{
if (reader == null) return;
for (int i = 0; i < count; i++) this.Add(reader.Read());
}
}

static void Main(string[] args)
{
MyList<int> list = new MyList<int>();
using (IntReaderWriter writer = new IntReaderWriter("test.bin"))
list.Save(writer);
using (IntReaderWriter reader = new IntReaderWriter("test.bin"))
list.Load(reader, 100);
}
終わり

531:デフォルトの名無しさん
09/02/25 12:51:34
型ごとにReaderWriter<T>実装しないといけないなら全く意味ないなそれ
普通にSaveInt32とか型ごとに保存・読み込みメソッドを定義するのと変わらん

532:デフォルトの名無しさん
09/02/25 13:53:57
generic<typename TSrc, typename TDst>
where TSrc : value class where TDst : value class
void BlockCopy(
 array<TSrc>^ src, int srcOffset, array<TDst>^ dst, int dstOffset, int count) {
 using namespace System;
 pin_ptr<TSrc> pSrc = &src[0];
 Byte* pSrcByte = reinterpret_cast<Byte*>(pSrc);
 pin_ptr<TDst> pDst = &dst[0];
 Byte* pDstByte = reinterpret_cast<Byte*>(pDst);
 for (int i = 0; i < count; i++) pDstByte[srcOffset + i] = pSrcByte[dstOffset + i];
}
こういうのをC++/CLIで用意しておけば解決w

533:デフォルトの名無しさん
09/02/25 14:35:22
Application.DoEvents();
と等価の処理を別コードで書きたいんだけど
なにかいい方法はないかなぁ…
PeekMessageとかコレ系つかうとたまに応答なし
になってしまう。

timerとかBackGroundworkerだとプログラムが
みにくくなってしまうし悩んでます。


534:デフォルトの名無しさん
09/02/25 14:42:03
AというクラスにAクラスを返す
例えば
public virtual A CreateA(){ return new A(); }
があります。
このAを継承した
BというクラスはこのCreateAをオーバーライドしてBを返すようにしたいのですが
こういう事はできますか?
CreateBを新たに作らないと駄目ですか?

535:デフォルトの名無しさん
09/02/25 14:46:45
>>533
timerやbackgroundworkerで見にくくなる理由も不明だが、
Application.DoEvents()ではだめな理由も謎だな。

536:デフォルトの名無しさん
09/02/25 14:48:25
>>534
class B : A {} だったら
public override A CreateA(){ return new B(); } でいいじゃね。
戻り値の型をBにしたいなら、CreateBを作ることになるだろうけど。

537:デフォルトの名無しさん
09/02/25 14:52:55
そうですか…有り難うございます

538:533
09/02/25 14:58:27
>>535
URLリンク(d.hatena.ne.jp)
DoEventsを使うとたまに応答なしになったりひどい挙動を起こすことが
あるんですよ。
これを完全に回避したいんです。


539:デフォルトの名無しさん
09/02/25 15:00:24
class Base{
  public virtual Base Create();
}
class Base<T>:Base where T:Base<T>, new(){
  public override Base Create(){
    return (Base)(new T());
  }
  public T Create(){return new T();}
}
こんな方法もあるかも。未テストかつ変態的なので動くか不明。

なお、使う時は
class B:Base<B>{
 ...
}
class C:Base<B>{
 ...
}
みたいにする。

540:デフォルトの名無しさん
09/02/25 15:00:40
もう一つ良いですか?
同じクラスAに
class A
{
public const int i = 100;
public void D()
{
Console.Write(i);
}
}

とこれを継承したクラスB,に
public const int i=10;
としてBからDを呼び出すとiは10として処理されますか?
100として処理されますか。

541:デフォルトの名無しさん
09/02/25 15:03:18
あ、間違った。
class Base{
  public virtual Base CreateBase();
}
class Base<T>:Base where T:Base<T>, new(){
  public override Base CreateBase(){
    return (Base)(new T());
  }
  public T Create(){return new T();}
}
みたいにメソッド名は変えなきゃ駄目だ。
後、使い方の方も(まあ気が付くと思うけど)
class B:Base<B>{
 ...
}
class C:Base<C>{
 ...
}
ね。

542:デフォルトの名無しさん
09/02/25 15:05:09
>>540
それくらいなら、やってみりゃいいじゃん。

543:デフォルトの名無しさん
09/02/25 15:09:50
>>538
等価のコードを書いたら結局Application.DoEventsと同じ作用をもたらすだろ
素直にイベント駆動の脳になれ

544:デフォルトの名無しさん
09/02/25 15:10:27
>>540
やってみました
継承元の100が入ってきますね

どうにかして10にすることは出来ませんか?
>>539
やってみます

545:デフォルトの名無しさん
09/02/25 15:11:18
virtualなプロパティにすればよろし

546:デフォルトの名無しさん
09/02/25 15:15:34
>>545
できました有り難うございます。

547:539,541
09/02/25 15:44:40
>>544
共通の基底クラスが必要なければ、

class Base<T> where T : Base<T>, new()
{
  public static T Create() { return new T(); }
}
class A : Base<A> { }
class B : Base<B> { }

でも可だと思う。A:Base<foo>と書く時のfooはAのみに制約されて、それ以外を書くとコンパイル
エラーではねられる。継承先のクラスのインスタンスをプロパティの設定などの処理とともに生成
するメソッドを持つクラスを作る(変態的だけど)わりと一般的なテクニック。

548:デフォルトの名無しさん
09/02/25 15:48:35
>>547
成る程
よく分かりました
ついでにやっと何となくwhereが分かりました

549:デフォルトの名無しさん
09/02/25 15:49:24
>>548
class B:Base<B>{}があると、class A:Base<B>はコンパイルエラーにならないので注意してね。

550:デフォルトの名無しさん
09/02/25 22:09:43
>538
タイマーにしておけ。
見やすくなるように整理して書くだけだろ。

551:デフォルトの名無しさん
09/02/25 22:32:27
処理内容にもよると思いますが、

void BigMethod()
{
...
    if (〜) { ...//百行くらい }
    else { ...//百行くらい }
...
}

よりも、

void BigMethod()
{
...
    if (〜) { Method1(...); }
    else { Method2(...); }
...
}

Method1(...);//百行くらい
Method2(...);//百行くらい
...

の方が大抵の場合で速くなるのはなぜでしょう?

552:デフォルトの名無しさん
09/02/25 22:38:57
>>551
気のせいじゃね?

553:デフォルトの名無しさん
09/02/25 22:40:53
↓のようなリストを作成しており、条件としてKeyだけを
用いてそれと一致するbdListのindexを取得したいのですが
foreachなどで一つ一つチェックするしかないのでしょうか。

BindingList<Data> bdList;

public class Data
    {
        private string _Key;
        private string _Value;
        private int _Count;
        public string Key
        {
            set { this._Key = value; }
            get { return this._Key; }
        }
        public string Value
        {
            set { this._Value = value; }
            get { return this._Value; }
        }
        public int Count
        {
            set { this._Count = value; }
            get { return this._Count; }
        }
    }

554:デフォルトの名無しさん
09/02/25 22:47:54
>>553
リスト構造なら辿るしかないだろ

そういう意味じゃないならlinqとか

555:デフォルトの名無しさん
09/02/25 23:08:17
>551
実行時に最適化されてるんだよ。
呼び出しの初回にメソッド全体がJITコンパイルされるか小さなメソッド単位でJITコンパイルされるかだよ。
細かなプロパティやメソッドの呼び出しなんか結構インライン展開されてるしある程度分割した方がいいと思うよ。

試しにBigMethod内で呼び出しているけど条件に合わなくて呼び出されない箇所で
参照してるアセンブリのメソッドを削除してdllを差し替えてそのまま実行すると
上はBigMethodメソッド呼び出しで実行される前のタイミングで落ちるけど、
下はMethod1かMethod2が不完全でも呼ばれなければ動いたりする。

>553
.Select((data, index) => new {Data=data, Index=index}).ToLookup(i => i.Data.Key).ToDictionary(i => i.Key, i.First().Index)["探したいキー"]
とでもすればいいんじゃないかな。
素直にforで辿った方がいいよ。

556:553
09/02/25 23:13:06
>>554
有り難う御座いました。2005環境なのでLinqは使えません…。
.Containsや.IndexOfが内部的にforeachで回しているのであれば
諦めつくのですが、件数が増えてきたときに効率が悪いかと思いまして。
データ構造を見直した方がいいんですかね…。

557:デフォルトの名無しさん
09/02/25 23:13:35
LINQ使う場合、
bdList.OfType<Data>.Where(d=>条件).Select(d=>bdList.IndexOf(d));
が書き方的には自然だけど、IndexOfのコストが絶対に問題になる。
Enumerable.Range(0,bdList.Count).Where(i=>bdList[i].Key==ほにゃらら);
とかすべき。

558:デフォルトの名無しさん
09/02/25 23:15:52
そりゃ普通のリストならO(n)掛かるのはどうにもならんだろ。

559:デフォルトの名無しさん
09/02/25 23:17:52
>>556
LINQ使えないのなら、
Enumerable.Range(0,bdList.Count).Where(i=>bdList[i].Key==ほにゃらら);
と同等の処理をforで書けば良いと思う。.Containsや.IndexOfがO(N)で嫌だという
感覚は正解で、インデックスによる参照がO(1)だから、そっちを使うべき。

560:デフォルトの名無しさん
09/02/25 23:31:07
内部にDictionary<string, Data>持っとくとか

561:553
09/02/25 23:42:04
親切に有り難う御座いました。
Dictionaryでもう少し効率良く出来るのであればそれも
視野に入れて色々試してみます。

562:デフォルトの名無しさん
09/02/25 23:43:42
>>560
Dictionaryって、重複を許すモノホンのハッシュじゃないよね?

563:デフォルトの名無しさん
09/02/25 23:50:29
ごめん、>>562はハッシュについて勘違いしていた。
それと、そもそも異なるValueに同じKeyが対応する事がないのなら、確かにDictionary一択だね。

564:デフォルトの名無しさん
09/02/26 02:16:03
>>555
1回のみしか呼ばれないならJITコンパイル時の時間分だけ短縮しているというのは理解できるのですが、
BigMethod自体が複数回呼ばれる場合でも下の方が速いというのがちょっとわからないのですが…
呼び出し回数は、で、BigMethod1回につきMethod1またはMethod2が1回なのですが、
複数回呼ばれる間にどちらも呼ばれます。回数自体はそこまで多くなく、メソッド呼び出しのオーバーヘッド
は大きくないはずですが、なぜ分割した方が速くなるのでしょうか?
処理をメソッドに分割した方がうまく最適化されやすいのでしょうか?

565:デフォルトの名無しさん
09/02/26 03:28:31
レジスタ変数をうまいこと選択できるとか?
いや知らんけど。

566:デフォルトの名無しさん
09/02/26 03:28:38
>>564
基本的なことだけど速度計測の時に最適化が有効になってるか確かめた?

デバッグビルドは最適化が働かないよ。
リリースビルドでもF5実行の場合は最適化が抑止されるよ。

567:デフォルトの名無しさん
09/02/26 10:20:45
初歩的な質問で恐縮ですが
C++のSTLとかアルゴリズムを利用したコードってC#でも使用できますか?

568:デフォルトの名無しさん
09/02/26 10:28:12
コードってC++のソースコードなのかコンパイル済みのコードなのかどっちなんだ

569:デフォルトの名無しさん
09/02/26 10:28:33
>>565
一応BigMethodをビルドしてからReflectorでILを見てみると、.maxstackの値が22から10に減っていました。

>>566
Debug、Releaseビルドどちらの場合でも分割している方が速かったです。
一応実行時はリビルドを実行してからVS上ではなく直接exeを起動して計測しています。

570:デフォルトの名無しさん
09/02/26 10:46:38
>>568
どちらでも可能であればかまいません
C#でSTLを使いたいのです

571:デフォルトの名無しさん
09/02/26 10:47:56
無理 テンプレートが使えないからな
C++/CLIでSTL/CLRでも使えば?

572:デフォルトの名無しさん
09/02/26 10:53:58
C#使う以上は問答無用でSystem.Collections.Generic使え

573:デフォルトの名無しさん
09/02/26 11:16:30
拝承

574:デフォルトの名無しさん
09/02/26 11:21:53
調べてないのだけど、C++/CLIってunsafeキーワード書かなくても、
ポインター使ったプログラムを掛けるのかな?

575:デフォルトの名無しさん
09/02/26 11:24:05
書けるよ。
manageとunmanageの区別は自分で意識してやらないとならんが。

576:デフォルトの名無しさん
09/02/26 11:31:35
コンパイルオプションでポインタを使えなくすることもできるけどな

577:デフォルトの名無しさん
09/02/26 11:32:18
pinできなくなるってこと?

578:デフォルトの名無しさん
09/02/26 12:05:27
pin_ptrはできる。GCHandleType.Pinned使ったGCHandle.Allocと意味的に同じだし。
でもT*にキャストはできない。
pin_ptrからIntPtr作ることはできてMarshalでアクセスはできる。
つまりは/unsafe使わないC#とほぼ同じ。

579:デフォルトの名無しさん
09/02/26 12:52:53
あくまで相互運用のためにあるので全部がC++/CLIのアプリケーションは作るな莫迦者って誰かが言ってたな

580:デフォルトの名無しさん
09/02/26 13:03:47
MS自身そういうスタンスだからな
STL/CLRとかいう迷惑なものはなかったことにするべき
こんなもんがはびこったりしたら何のための.NETかわからなくなる

581:デフォルトの名無しさん
09/02/26 13:26:44
いや、.NETのジェネリックは糞過ぎるから、
テンプレートとして使えるコレクションライブラリは欲しい。

582:デフォルトの名無しさん
09/02/26 13:40:18
C++コードとの互換性を含めるべきだったんだよ、MSは!

583:デフォルトの名無しさん
09/02/26 15:01:34
プリプロセッサで変態マクロが定義できる言語には二度と触りたくない。マクロのすごい版として
テンプレートを導入したC++は何をかいわんや。オブジェクト指向的な構造さえしっかりしていれば
むやみやたらな自由度なんていらない。.NETのジェネリックはコードが変態にならない点で優れて
いると思う。その分できない事が多すぎるというのは理解するが。

584:デフォルトの名無しさん
09/02/26 15:07:25
そしてやっぱりダージリンの新開発待望論が高まる

585:デフォルトの名無しさん
09/02/26 22:47:21
自分が書いたものですら、昔のものはまるで読めないような変態言語は勘弁して。

586:デフォルトの名無しさん
09/02/26 23:05:07
今の仕事が左から流れてきたデータをより分けたり下から流れてきたデータと組み合わせたりして
右に流すようなやつなんだがLINQ使い倒せて実に気分がいい
趣味でいじる分にはピンと来ないgroup byとか爽快だ
だが後でメンテする人は果たして読めるんだろうかアレ
いやまあできる限り読みやすく書いてるつもりだが

でも最大の責任は同じ名前のクラス3つも4つも作った奴だから文句はそいつに言ってくれ
なんで一つのメソッド内に別々のInformationクラスが3つも出てくるんだ畜生

587:デフォルトの名無しさん
09/02/26 23:30:55
ネームスペース別でも、機能が似たようなInformationが、
3つ同じ名前で実装されてるってか?w


588:デフォルトの名無しさん
09/02/26 23:46:17
それは酷いww

589:デフォルトの名無しさん
09/02/27 00:09:44
まさか担当者ごとにネームスペースを分けちゃいないだろうな。
Kaishamei.Suzuki.Information, Kaishamei.Sato.Information みたいな……

590:デフォルトの名無しさん
09/02/27 00:52:18
苗字だけじゃなくちゃんと名前でわけてるわ!

591:デフォルトの名無しさん
09/02/27 07:51:01
ならおk

592:デフォルトの名無しさん
09/02/27 09:05:09
でも将来的に似てても一部違う機能を実装するならそれもありとかでは?
と素人が申しております

593:デフォルトの名無しさん
09/02/27 20:03:12
便乗質問。

2chにはあまりこういう仕事してる人いないかもしれないけど、
例えばFooTech社のBAR1234というインターフェイスカード(DIOとか
モーションコントローラとかいろいろ)を操作するためのクラスライブラリを
作るときって、名前空間名はどうしてる?

FooTech.BAR1234 ?
MyCompany.BAR1234 ?
MyCompany.FooTech.BAR1234 ?

594:デフォルトの名無しさん
09/02/27 20:26:33
三番目以外にする理由がわからない

595:デフォルトの名無しさん
09/02/27 20:41:43
発注元にもよるんじゃ

596:デフォルトの名無しさん
09/02/28 01:49:05
>593
3番目でやってるよ。
結局名前空間だけじゃなくアセンブリも分けてあって
プラグインのように呼び出せるようにしてある。

597:デフォルトの名無しさん
09/02/28 05:22:52
仮面さんとこから転記

名前空間のネーミング方法
CompanyName.TechnologyName[.Feature][.Design] というパターン。

例: Uchukamen.MultiMedia.Movie.Viewer
.NET Framework 名前空間で使用されている名前は使わない。
Class Console →だめ。
意味的に適切な場合は、複数形の名前空間名を使用する。
例: Collections
例外: 省略形 System.IOs 誤 → System.IO 正。
名前空間とクラスに同じ名前を使用しない。

namespace MySystem;

class MySystem; // 誤り。名前空間とクラスに同じ名前を使用しない。


598:デフォルトの名無しさん
09/02/28 07:02:32
趣味で作ってる場合CompanyNameはどうすればいいんだ・・・
本名使うには抵抗が・・・

599:デフォルトの名無しさん
09/02/28 07:11:28
趣味ならウェブサイト名とか。公開しないなら個人名でもいいだろう。

600:デフォルトの名無しさん
09/02/28 08:09:42
600

601:デフォルトの名無しさん
09/02/28 10:23:05
趣味やオープンソースならプロジェクト名だけでいいと思う

602:デフォルトの名無しさん
09/02/28 11:56:24
メッセンジャーを作ろうと思うのですが、
どうやったらインターネット越しの相手と通信できますか?

603:デフォルトの名無しさん
09/02/28 12:22:53
キミニハムリダ

604:デフォルトの名無しさん
09/02/28 14:00:03
カムサハムニダ

605:デフォルトの名無しさん
09/02/28 14:03:22
ヨンドンサリの

606:デフォルトの名無しさん
09/02/28 14:18:49
UPnPでポートをあけてpushできるようにして、
マイクから音声を取得するようにして、
その音声を圧縮して、tcpかudpで送って、それを受信側で元に戻して再生するお

UPnPつかわないで擬似的にpushしてるソフトあるけど
どうやってんだろ

607:デフォルトの名無しさん
09/02/28 14:23:27
擬似的なpushって受信側からのポーリングじゃね

608:デフォルトの名無しさん
09/02/28 14:28:51
>>599
ニックネーム

609:デフォルトの名無しさん
09/02/28 18:26:02
>>608
じゃおれの場合はHannsamubo-iにすればいいのか

610:デフォルトの名無しさん
09/02/28 22:06:48
おまえ、ハンサムボーイって呼ばれてるのか
イジメじゃないか

611:デフォルトの名無しさん
09/02/28 22:17:46
>>610
ごめんごめんhandsomeboyの間違いだった

612:デフォルトの名無しさん
09/02/28 23:21:45
>>598
GUID

613:デフォルトの名無しさん
09/03/01 01:43:04
>>612
おまえとは仕事したくないなwwwww

614:デフォルトの名無しさん
09/03/01 01:56:29
むしろうちに欲しい

615:デフォルトの名無しさん
09/03/01 01:57:34
仕事欲しい

616:デフォルトの名無しさん
09/03/01 01:58:37
彼女欲しい

617:デフォルトの名無しさん
09/03/01 02:04:12
仕事さえあれば彼女ができる自信はある

618:デフォルトの名無しさん
09/03/01 02:35:51
いたって簡単なことだが、ずっと家に居たって何も始まらない。
2chなんてすぐに断って家を発って職安に行くんだ。

619:デフォルトの名無しさん
09/03/01 02:38:30
いやーん

620:デフォルトの名無しさん
09/03/01 03:52:57
>>618
じゃあ一緒に行こうか

621:デフォルトの名無しさん
09/03/01 15:47:48
現地集合な

622:デフォルトの名無しさん
09/03/01 16:54:25
NEETでなぜ悪いっ

623:デフォルトの名無しさん
09/03/01 18:03:45
悪いに決まってるだろJK
親や周りの人に負担ばかりかけて
無駄に消費するだけして
周囲や社会には何も貢献してないんだから

624:デフォルトの名無しさん
09/03/01 18:34:33
>親や周りの人に負担ばかりかけて
>無駄に消費するだけして
>周囲や社会には何も貢献してないんだから
まさに2ちゃんねるにレスすることとまったく同じだな

625:デフォルトの名無しさん
09/03/01 19:13:01
ばーか
上の世代が貯金ばかりして経済が停滞してるというのに
ニートはそれを消費に回して経済活性化に寄与してるんだよ


626:デフォルトの名無しさん
09/03/01 19:19:21
>>622
.NETでなぜ悪いっ

に見えた

627:デフォルトの名無しさん
09/03/01 19:36:07
悪いに決まってるだろJK
メモリやディスクに負担ばかりかけて
無駄にリソースを消費して
周囲や社会には何も貢献してないんだから

628:デフォルトの名無しさん
09/03/01 20:45:01
>メモリやディスクに負担ばかりかけて
>無駄にリソースを消費して
>周囲や社会には何も貢献してないんだから
まさに2ちゃんねるにレスすることとまったく同じだな

629:デフォルトの名無しさん
09/03/01 20:51:56
NEET、NEETを語る

630:デフォルトの名無しさん
09/03/02 10:40:11
NEETな午後3時

631:デフォルトの名無しさん
09/03/02 21:04:39
TCPListenerを使って接続を受け付けるために、
BeginAcceptTcpClientで接続を受け付けています。

while (isAlive == true)
{
tcpListener.BeginAcceptTcpClient(new AsyncCallback(TCPListenAcceptCallback), tcpListener);

autoResetEventTCPReceive.WaitOne();
}

ここで、プログラムを終了させるためにisAliveをfalseにしているのですが、
BeginAcceptTcpClientでブロックされてしまい、プログラムがいつまでも終了
しない状態になってしまいます。

そもそもプログラムの終了方法が悪いのかもしれませんが、
何か良い方法があれば教えてください。

よろしくお願いいたします。

632:デフォルトの名無しさん
09/03/02 21:30:17
せっかくBegin使ってるのにその直後に無限待機しちゃ意味無いじゃん
適当にWaitOneにタイムアウト秒数与えなよ

633:631
09/03/02 22:02:43
>>632
ありがとうございます。
WaitOneにタイムアウトを持たせることで解決しました。
# 若干プログラムの終了まで時間が掛かりますが、問題になる範囲ではないですよね?

634:デフォルトの名無しさん
09/03/02 23:29:23
CLR ProfilerでFormアプリケーションのメモリ生成を見ようとしいます。CLRプロファイラのメインフォームからアプリケーションをスタートするとアプリケーションはスタートするんですが、
"Waiting for application to start common language runtime" とでたままプロファイラがアプリケーションにアタッチできません。
デバッガーで見るとCLRProFiler.MainForm.WaitForProcessToConnectの中のpipe.Readで毎回IO.Exceptionが発生しています。
例外内容は"プロセスがパイプの他端を開くのを待っています。"とのこと。
ぐぐってみると同じような現象が出ているのはあったんですが、サービスで発生した場合でアイデンテイティをシステムで立ち上げるとかうんたら。
URLリンク(forums.asp.net)
アプリケーションの場合にどうするのかわかりません・・・
securityがらみぽいのですが、これは環境がVistaだからでしょうか。

635:634
09/03/03 12:30:25
事故解決。
CLRProfiler.exeをエクスプローラから右クリで管理者として実行でいけました(=゚ω゚)ノ
でもタスクマネージャーでワーキングセットが500Mぐらい食って減らないもののプロファイルしたかったんだがProfilerでみても、10Mぐらいしかアロケートしてないといわれる・・・
見方が悪いんだかよくわからん。逝ってくるノシ

636:デフォルトの名無しさん
09/03/05 14:39:07
出来上がったexeをバイナリエディタで覗くとプロジェクトのフルパスが埋め込まれちゃってるんだけど、消す方法ある?


637:デフォルトの名無しさん
09/03/05 14:53:06
バイナリエディタがあるなら消せるだろ。

638:デフォルトの名無しさん
09/03/05 14:53:12
プロジェクトのじゃなくてpdbファイルのじゃね?
pdbファイルの出力ならプロジェクトのプロパティでビルドの詳細設定>デバッグ情報あたりで制御できる

639:デフォルトの名無しさん
09/03/05 17:05:04
>>637
消して動作に影響あるかもしれんのじゃないか?


640:デフォルトの名無しさん
09/03/05 21:28:21
ハッシュで弾かれないか?

641:デフォルトの名無しさん
09/03/05 21:58:53
pdbはデバッグ用だろ

642:デフォルトの名無しさん
09/03/06 00:52:45
>636
デバッグビルドしてない?と思ったけど
VS2005かVS2008からReleaseビルドでもpdbを作るのがデフォルトになってるんだった。
ビルドの詳細設定から出力のデバッグ情報をnoneに変更する。

643:デフォルトの名無しさん
09/03/06 07:37:47
おお本当だ
Release設定のデバッグ情報noneで埋め込まれなくなった
みんなありがとう

しかしこれ気付かずにそのままリリースしたら、プロジェクトのフォルダに個人名使ってたら色々と問題になりそうじゃない?


644:デフォルトの名無しさん
09/03/06 07:45:30
普通の観察力があれば気づく

645:デフォルトの名無しさん
09/03/06 07:48:19
dotfucator使ってればその辺の情報は消えてるだろ

646:デフォルトの名無しさん
09/03/06 08:57:50
"要.NET Framework3"でググって出てきたのをいくつか見てみたけど消してる人は少ないな


647:デフォルトの名無しさん
09/03/06 09:13:34
普通はexe(dll)と設定ファイル以外出さないでしょ

648:デフォルトの名無しさん
09/03/06 10:47:53
pdbファイルがどうこうの話じゃなくて、本名バレしてる人いるんじゃね?って話
本名でユーザー作っててマイドキュメントの下にプロジェクト置いてたらアウアウ


649:デフォルトの名無しさん
09/03/06 11:07:34
そういう事故がままあるからうちではユーザー名に本名を使わなくなった

650:デフォルトの名無しさん
09/03/06 11:20:06
タスマネのユーザー名を消さずにスクショうpしてあうあうとかリアルにあるからな

651:デフォルトの名無しさん
09/03/06 14:12:41
ユーザ名は嫁の名前使ってます。

脳内嫁ですが。

652:デフォルトの名無しさん
09/03/06 14:44:15
>>646
蛇足だが、100%アンマネージドなVC++アプリでも
デフォルトのリリースビルドの設定だとPDBのパスが埋め込まれるのは同じ。

653:デフォルトの名無しさん
09/03/06 15:27:08
リリースするときって、msbuildとか使ってバッチビルドするもんでしょ

654:デフォルトの名無しさん
09/03/06 16:27:40
高度な話題禁止!

655:デフォルトの名無しさん
09/03/06 22:05:03
高度な話はしてないので続けてOK

656:デフォルトの名無しさん
09/03/06 22:43:50
>>653
おれはいまだにGNUのmake

657:デフォルトの名無しさん
09/03/07 03:35:05
俺は何も考えずにReleaseに切り替えてリビルドして出来上がったexeを配布してるな

658:デフォルトの名無しさん
09/03/07 12:01:20
うちは専用のビルド用PCでやってるんで個人名とか入らない。

659:デフォルトの名無しさん
09/03/07 12:13:36
レポジトリにコミットしたらHudsonが自動ビルドしてくれる

660:デフォルトの名無しさん
09/03/08 19:33:22
VS2008のC#でプログラムを組んでいます。

たくさんの線や長方形、円をアルファ値30%ぐらいで重ね合わせて描画しています。
これを印刷しようとして躓いてしまいました。
プリンタへは、きれいに印刷できました。でも、プリンタドライバ型のPDF出力を行うと、
不完全なディザみたいになってしまいます。どうも、PDF自体が半透明な描画ができないようです。

それで、いったんBitmapに描画してから、プリンタに転送しようとしました。
サイズが小さいときにはこれでPDF出力もうまくいったのですが、A3サイズになると、プリンタの
解像度と用紙サイズでBitmapを作成しようとした時点でエラーになってしまいました。
縦横のピクセルサイズが大きすぎるのだと思います。

こんなときはどうすればいいのでしょうか。やっぱりバンディングみたいにすこしずつ処理でしょうか。



661:デフォルトの名無しさん
09/03/08 20:08:52
>>660
大きすぎるならそのBitmapを縮小すれば良いんじゃね?

662:デフォルトの名無しさん
09/03/08 20:36:47
A3が11.7" x 16.5"で、300dpiだと3500px x 5000pxあたりか。

そのくらいでエラーになるのはおかしい。

663:デフォルトの名無しさん
09/03/08 21:23:44
本当に仮想プリンタのせいだとしたら、
まず仮想プリンタを変えて試すべきじゃないんだろうか?

フリーのだけでも数種類あったはずだよね?

664:デフォルトの名無しさん
09/03/08 22:24:47
ありがとうございます。
>>662
仮想プリンタ側で4800dpiみたいな設定ができて、C#プログラムの中からはこれが
そのまま解像度として見えています。
現実的には、600dpiぐらいで良いので、それぐらいで考えてみます。

>>663
Primo、BullZip、Acrobat Pro(これは評価版)を試してみたのですが、色のアルファ
ブレンドはうまくできませんでした。

665:661
09/03/08 23:02:24
>>664
おいてめーw形式だけでも俺様に礼の一文を書けwww

666:デフォルトの名無しさん
09/03/08 23:11:08
>>665
ああっすみません。
4800dpi→600dpiは>>661さんのご提案を取り入れての判断でした。

667:デフォルトの名無しさん
09/03/08 23:43:20
その程度のことで礼を求めるなよ
だせえ

668:デフォルトの名無しさん
09/03/09 00:24:11
さすが大物さんは違いますね。
まあ会社でも鼻つまみ者だろうけどw

669:デフォルトの名無しさん
09/03/09 00:48:19
中学生でも思いつくようなアドバイスで霊を要求するってw

670:デフォルトの名無しさん
09/03/09 01:20:05
661は馬鹿なの?

671:デフォルトの名無しさん
09/03/09 01:39:59
うん

672:デフォルトの名無しさん
09/03/09 02:35:30
冗談もわかんねーのかよwお前らほんと低脳だなwww

673:デフォルトの名無しさん
09/03/09 02:42:08
そんなに悔しかったのか(プ

674:デフォルトの名無しさん
09/03/09 02:52:26
雑誌のグラビア写真でも300dpiくらいだよな


675:デフォルトの名無しさん
09/03/09 09:25:54
661が馬鹿なのはどうでもいい
それより664が大人なのが重要

こんな人間に私はなりたい

676:デフォルトの名無しさん
09/03/09 14:04:49
C# Express2008にてC#を勉強中です。
質問なのですが、ToolStrip上にtoolStripLabelを置いて、そのバックカラーを
変更したいのですが、BackColorプロパティーをいじっても変化ありません。
他のどこをいじれば変更できるのでしょうか?
そもそも、変更できない?


677:デフォルトの名無しさん
09/03/09 14:49:38
あんまり簡単ではないがToolStripRendererの派生クラスで制御できる
一通りヘルプの解説読んでググってみたりしても"さっぱり"理解できないのなら手を出すには早いかもね

678:デフォルトの名無しさん
09/03/09 14:56:15
Visual Styleに依存するのでむやみに変更するのは非推奨

679:デフォルトの名無しさん
09/03/09 15:28:37
皆様、ありがとうございます。

なるほど、そのtoolStripLabelが乗ってるtoolStripのRendererModeで動作が変わるんですね。
RendererModeをSystemにしたら変更が反映されました。
ありがとうございます。



680:デフォルトの名無しさん
09/03/11 14:47:19
ボタンクリックイベントとかで一時的に使ったBitmapとかImageってそこの処理抜ける前にDisposeした方がいいの?
それともそのスコープ抜けたときに勝手に開放してくれる?


681:デフォルトの名無しさん
09/03/11 14:53:40
Disposeしたほうがいい

682:デフォルトの名無しさん
09/03/11 17:24:03
一時的に作ってローカルな範囲だけで使って
外に漏らしてないと断言できるならならあえてDisposeしない理由がない

683:デフォルトの名無しさん
09/03/11 17:47:50
>>680
using使おうや


684:デフォルトの名無しさん
09/03/11 18:24:21
usingといえば、StreamReaderが元のStreamまで根こそぎ閉じるの勘弁して欲しいな

685:デフォルトの名無しさん
09/03/11 19:46:42
複数のオブジェクト間で受け渡したりするときはTextReaderを通すことが多いからな

686:デフォルトの名無しさん
09/03/11 19:53:39
>>684
なんで合理的な仕様じゃん。
そう思えないなら、ふらっとスレの議論じゃないけどDispoeのそもそもの意義が
わかってないんでしょ。

687:デフォルトの名無しさん
09/03/11 20:52:53
実際のとこスコープ外れたオブジェクトって即時消去されずに残ってるもんなの?
例えばこういう場合に明示的にDisposeするべきなのか、しなくてもいいのか迷う

private void hogehoge(string fname)
{
  Bitmap bmp = new Bitmap(fname);
  this.pictureBox0.Image = (Image)bmp.Clone();
  //bmp.Dispose();
}


688:デフォルトの名無しさん
09/03/11 20:54:48
そんなに頻繁に呼ばれないのならしなくても問題にはならないだろうけど
できるのにわざわざしない意味がない

689:デフォルトの名無しさん
09/03/11 21:01:27
>>688
できるのにしないのは、C#ってそもそもそういう部分を気にせずにコーディングできるのが強みだから
使わなくなった変数やオブジェクトはGCで自動的に開放してくれるからC++みたいにメモリ管理で苦労しなくていいって触れ込みだった気がする


690:デフォルトの名無しさん
09/03/11 21:10:08
GCはオブジェクトの生存範囲が分からない場合には有効だけど
>>687ではusingを書くか書かないかだけの違いだろ

691:デフォルトの名無しさん
09/03/11 21:10:13
using!using!

692:デフォルトの名無しさん
09/03/11 21:54:24
メモリで大きな画像を持ってると大変なことになりそうだしな 特にサーバなんかでは
必要無くなったら破棄するのが良いよ

693:デフォルトの名無しさん
09/03/11 22:08:44
>>687
.NETのBitmapは参照用途のつもりでもファイルをロックしてしまう
この例では pictureBox0 にクローンしたものを
わたしているから bmp は不要なんだが、Disposeしないと
GCが動くタイミングまで(いつかは不明)ファイルがロックされたままとなり、
結果、ファイルを削除あるいは移動しようと失敗してしまうことがありうる
よって、Disposeしとくべき


694:デフォルトの名無しさん
09/03/11 23:38:22
質問です。

開発上、とあるライブラリを仕様せよとの指令が下りました。

APIマニュアルはそれなりに整備されています。

しかしメソッドはプロパティーにアクセスした時に、
発行しうるExceptionの記述がまったく無いマニュアルでした。

そこでどのようなExceptionが発生するのか調査したいのですが、
ソースを直接参照できないため行き詰っております。

このような場合は、どのような調査を行ったほうが良いでしょうか・・・


695:デフォルトの名無しさん
09/03/11 23:42:46
逆コンパイル

696:デフォルトの名無しさん
09/03/11 23:47:10
C#をC++に変換してくれるツールないっすか?

697:デフォルトの名無しさん
09/03/11 23:47:44
ないよ

698:デフォルトの名無しさん
09/03/11 23:54:11
C#からC++/CLIへの変換なら簡単なのだけどねぇ

Instant C++ (C# Edition) ってのがあるけど、どの程度使える代物なのかは知らん

699:デフォルトの名無しさん
09/03/12 00:26:12
>>695
アドバイスありがとうございます。

C# 逆コンパイルで引っかかったものに Reflector というものがあるのですが、
こちらはこの手の会席で使う定番ツールみたいですね。

700:デフォルトの名無しさん
09/03/12 00:39:19
このサイトってどうなの?

++C++;// 未確認飛行 C
URLリンク(ufcpp.net)

701:デフォルトの名無しさん
09/03/12 00:46:02
普通に良いサイト

702:デフォルトの名無しさん
09/03/12 11:23:56
>>693
.NET3.5はその辺大丈夫みたいよ
3.0からなのか3.5からなのかはわからないけどロックされることがなくなったっぽい


703:デフォルトの名無しさん
09/03/12 15:19:06
一度MemoryStreamにコピーすれば問題ない。

704:デフォルトの名無しさん
09/03/12 19:32:35
>>702
むしろロックしない仕様の方に問題があると思うんだが。。
ロックしない仕様の方を大丈夫と表現する感覚が理解できない。

705:デフォルトの名無しさん
09/03/12 19:37:50
本来,メモリに読み込むときにしかファイルアクセスはいらないだろ

706:デフォルトの名無しさん
09/03/12 19:42:25
メモリを占有するのが嫌だからファイルをロックするんだよw
何言ってんだか。

707:デフォルトの名無しさん
09/03/13 09:16:06
質問です
メンバ変数hogeとコンストラクタやメソッドhoge()があるとき
this.a = foo;
とやると曖昧と言われてエラーが出るのですが
名称変更せずにこれを解決する方法はないでしょうか?

708:デフォルトの名無しさん
09/03/13 09:31:12
hogeはどこいった
どこに何があるのか分からん
曖昧と言われてエラーって台詞そのものが曖昧

709:デフォルトの名無しさん
09/03/13 09:36:47
707
なにがなんだかわからない

710:デフォルトの名無しさん
09/03/13 09:47:16
>>707
ぐだぐだ言わずにソースコード出せよ
お前の稚拙な説明では意味不明だ

711:デフォルトの名無しさん
09/03/13 10:19:15
>>707
吹いたwww

712:デフォルトの名無しさん
09/03/13 11:14:40
>>707
ワロタ
赤くしとこ

713:デフォルトの名無しさん
09/03/13 12:31:09
うわー恥ずかしい

class hoge
{
int hoge;

public hoge()
{
}
public void hoge()
{
}

public void hoge(int foo)
{
this.hoge = foo;//エラー
}

}

こんな感じなのですが


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

5372日前に更新/228 KB
担当:undef