2008年05月27日

VistaでDrag&Dropできない

   このエントリーをはてなブックマークに追加 Clip to Evernote
エクスプローラからファイルをドラッグ&ドロップできるWindowsFormアプリケーションを作ってみたのですが、どうしても上手くいきません。
前に作ったときには上手くいったのになぜ?
プロパティ設定に誤りがあるんだろうか?それともVisual Studio 2008では、何か仕様変更があったのか...

1時間くらい悩みましたが、答えはここ「Vista上のVS2005 C# Windowsアプリのドラッグ&ドロップ機能での注意点」にありました


Vistaの場合、Visual Studioを理者権限で起動させているのですが、その場合、Visual Studio から起動されるアプリケーションも管理者権限で動作することになります。
一方エクスプローラは、ユーザ権限で動作しているらしく、権限の高い管理者権限で動作しているアプリへは、ドラッグ&ドロップできないらしいです。

作成したプログラムをVisual Studioからではなく、エクスプローラから起動したら、ちゃんとできました。

試しに、このプログラムを管理者権限で動作させてみたら、やはり、ドラッグ&ドロップできませんでした。
なんで、こんな仕様になってるんでしょう?  

Posted by gushwell at 21:59Comments(11)TrackBack(0)

2008年05月26日

メルマガ:C#プログラミングレッスン  読者数1600名突破

   このエントリーをはてなブックマークに追加 Clip to Evernote
メールマガジン「C#プログラミングレッスン」の読者数が1600名を突破しました。

応援してくださっている皆さん、どうもありがとうございます。
感謝です。

現在は、LINQ to Objectについて連載中です。

  
Posted by gushwell at 21:07Comments(2)TrackBack(0)

2008年05月25日

Microsoft Bootvis

   このエントリーをはてなブックマークに追加 Clip to Evernote
自宅のWindows XPのパフォーマンスチューニングを実施。
1.ディスククリーンアップ
2.ディスクデフラグ
3.不要なスタートアッププログラムの削除 (窓の手を利用)
4.不要なサービスプログラムの無効化
5.Microsoft Bootvis
6.レジストリの整理 (Advanced WindowsCare を利用)
7.その他の設定変更 (Win高速化PC+を利用)
などを実施。

Microsoft BootVisは、ブートファイルのデフラグソフトだが、
タスクスケジューラが起動していないとエラーになってしまう。
「不要なサービスプログラムの無効化」でタスクスケジューラを無効にしていたので、上手く動かず手こずってしまった。

タスクスケジューラを再度有効化することで、無事ブートファイルのデフラグも完了。

時間測定はしていなかったが、起動時間が随分と短くなり、効果があったと思う。
  
Posted by gushwell at 09:52Comments(0)TrackBack(0)

2008年05月22日

ジェネリックなSingleton

   このエントリーをはてなブックマークに追加 Clip to Evernote
こんなクラスを書いてみた。

public sealed class Singleton<T> where T : class {
public static T Instance {
get { return singleton; }
}
static Singleton() {
Type t = typeof(T);
var obj = Activator.CreateInstance(t, true);
singleton = obj as T;
}
private static readonly T singleton = null;
}


このクラスを使えば、

Sample o = Singleton<Sample>.Instance;


なんていう書き方ができる。
そして、Sampleクラスのコンストラクタを privateにすれば、

Sample o = new Sample();


という書き方もできなくなる。
リフレクションを使っているはそのためだ。  
Posted by gushwell at 21:27Comments(4)TrackBack(0)

2008年05月17日

favicon

   このエントリーをはてなブックマークに追加 Clip to Evernote
Gushwell's C# Programing Page「窓際プログラマーの独り言」別館にfaviconを設定してみた。

ビットマップファイルを作って、それをFavIcon from Picsのサービスを利用し、faviconを作成。
それを、サイトにアップロードし、headタグに、<link rel="shortcut icon" href="favicon.ico" >と入れればいいだけ。

実に簡単だ。
でも、このブログには、faviconが設定できない。
livedoorブログは、拡張子icoがアップロードできない仕様になっているらしく、
favicon.icoをアップロードするとエラーとなってしまう。  
Posted by gushwell at 00:09Comments(0)TrackBack(0)

2008年05月14日

もう一つの数学パズルをC#で解いてみる

   このエントリーをはてなブックマークに追加 Clip to Evernote
Haskellでといた問題をC#で解いてみる。
普通に書けばこんな感じ。

for (int n = 1000; n < 9999; n++) {
int r = ReverseNumber(n);
if ( n != r && (n % r == 0) && (r > 1000) )
Console.WriteLine(n);
}
private static int ReverseNumber(int n) {
int ans = 0;
while (n > 0) {
int remainder = n % 10;
ans = ans * 10 + remainder;
n /= 10;
}
return ans;
}


C#3.0+LINQだと、

Enumerable.Range(1000, 8999)
.Where(n => {
int revnum = n.ReverseEnumerable().Aggregate(0, (a, x) => a * 10 + x);
return ((revnum != n) && (revnum >= 1000) && (n % revnum == 0));
})
.ToList().ForEach(s => Console.WriteLine(s));

static class IntExtenstions {
public static IEnumerable<int> ReverseEnumerable(this int n) {
while (n > 0) {
int remainder = n % 10;
n /= 10;
yield return remainder;
}
}
}

Haskellの影響を受け、普段使わないAggregateを無理やり使ってみた。
でも、全然短くならない orz...

C#3.0 + Achiral だと、

1000.UpTo(9999)
.Where(n => {
int revnum = n.ReverseEnumerable().Aggregate(0, (a, x) => a * 10 + x);
return ((revnum != n) && (revnum >= 1000) && (n % revnum == 0));
}).ConsoleWriteLine();

だ。ReverseEnumerable()は省略
うーん、普通のコードが一番簡潔だ。
やはり、なんでもかんでも、LINQを使おうってのは間違いかな。  
Posted by gushwell at 21:15Comments(2)TrackBack(1)

2008年05月12日

[Haskell] もう一つの数学パズル

   このエントリーをはてなブックマークに追加 Clip to Evernote
問題
4桁の数値を順序を逆転させた数値(例えば、5432の場合は2345が逆転させた数値)で割ったときに、割り切れる4桁の数を求めよ。
(つまり、5432 / 2345 が割り切れればよい)
ただし、商が1のものや、割る数が4桁でないものは除外する。

この問題をHaskellで解いてみる。

import System
import Data.List

main = do print $ workout [1000..9999]

workout :: [Integer] -> [(Integer,Integer)]
workout nums = filter (\(a,b) -> (a /= b) && (b >= 1000) && (a `mod` b == 0)) maketuplelist
where
maketuplelist = zip nums ( map revnum nums )
revnum = (read :: String -> Integer) . reverse . show


別の方法も考えてみる。
今度は、タプルを使わないようにしてみた。

main = mapM_ print [n | n <- [1000..9999], cond n]

cond n = (n `mod` r == 0) && (n /= r) && (r >= 1000)
where
r = read $ reverse $ show n

ただ、ここで疑問。
r は、condの条件式の中で、3回も出てくるが、3回計算されるのだろうか?  
Posted by gushwell at 22:57Comments(2)TrackBack(1)

2008年05月09日

String型のインテリセンス

   このエントリーをはてなブックマークに追加 Clip to Evernote
昨日の記事「簡単な数学パズルを解く(2)」

"123456789".ToCharArray().All(c => s.Contains(c));

と書いたけれど、NyaRuRuさんのコード

"123456789".Except(..);

を見て、はたと気が付いた。
Stringは、IEnumerable<char>を実装しているんだってことを。

つまり、ToCharArray()は必要なく、
"123456789".All(c => s.Contains(c));

と書けるんですね。

インテリセンスでは、Except()、All()とかの拡張メソッドが出てこないので、使えないと思っていた。

で、MSDNドキュメントを見てみたら、Stringは、IEnumerable<string>を実装しているって書いてある????
IEnumerable<char>の間違いですね。

結局、なんで、インテリセンスで拡張メソッドが出てこないのかは不明。
混乱の元なので、あえて出していないのかな。
  
Posted by gushwell at 22:41Comments(2)TrackBack(0)