Hatena::ブログ(Diary)

当面C#と.NETな記録 このページをアンテナに追加 RSSフィード

2009/10/30 (金)

[] VS2010テキストエディターの矩形操作  VS2010テキストエディターの矩形操作を含むブックマーク  VS2010テキストエディターの矩形操作のブックマークコメント

http://blogs.msdn.com/visualstudio/archive/2009/10/26/box-selection-and-multi-line-editing.aspx

ビデオがわかりやすい。

  • Alt + マウス操作で矩形選択
  • Alt + Shift + カーソルで矩形選択 (ビデオでこれしゃべってる?とにかく試したらこれでいけた)
  • 矩形を選んでまとめて編集できる!

プロポーショナルフォントでもできた。無駄にすごいw

[] .NET4.0 の並列処理を試してみた その3 : サーバー GC  .NET4.0 の並列処理を試してみた その3 : サーバー GCを含むブックマーク  .NET4.0 の並列処理を試してみた その3 : サーバー GCのブックマークコメント

id:siokoshou:20090717id:siokoshou:20090721id:siokoshou:20090722 に続く TPL の記事。ベータ2の改良点がパラレルチームの blog に投稿されています。

でも、今回はそんなのがどうでもよくなるほど驚いたネタ。

ベータ2で7月に試したコードを実行してみると特にパフォーマンスに変化はありませんでした。しかし、掲示板でコアが多いほうが遅いんだけどなんで?って質問があって、その答えにこんなものが。

In addition to Andy's good questions, have you tried enabling the server GC? If not, you should try that as well, by creating a .config file for your application containing:

<configuration>

<runtime>

<gcServer enabled="true"/>

</runtime>

</configuration>

Parallel.For Slows Down with more cores

サーバーGCを試してみてとのこと。

さっそく試してみると、パフォーマンスがぐぐっとアップしました。前回はタスクを大量につくらないように変更してパフォーマンスを上げましたが、そのような小細工をしていないコードがそれにせまるほどの約2倍も高速化しました。一番速いのはやはりタスクをほとんど作らないパターンで、これもごくごくわずかですが速くなりました。

プロセッサが 2 つ以上のコンピュータでは、サーバーのガベージ コレクションが最速のオプションとなります。

<gcServer> 要素

え?そうだったの!?ちょっといろいろ試してみる…。

結論 : コアが多い場合はサーバー GC を試してみるといいことあるかも。

トラックバック - http://d.hatena.ne.jp/siokoshou/20091030

2009/10/29 (木)

[] 2010ベータ2  2010ベータ2を含むブックマーク  2010ベータ2のブックマークコメント

やっと入れた。WPFアプリを作ってみた。さっそくVSが固まった(´Д`)=3

[] WPF のカルチャー  WPF のカルチャーを含むブックマーク  WPF のカルチャーのブックマークコメント

f:id:siokoshou:20091029201453j:image

WPF で以下の XAML を書いて実行すると、日付と時刻が「10/29/2009 7:56:33 PM」と en-US カルチャーで表示されてしまいます。

<Window x:Class="LangTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    Title="LangTest"
    SizeToContent="WidthAndHeight">
    <TextBlock Margin="30"
        Text="{Binding Source={x:Static sys:DateTime.Now}}"/>
</Window>

これを「2009/10/29 19:56:33」のように ja-JP カルチャーで表示するには、App クラスの OnStartup をオーバーライドしてカルチャーを指定すれば OK です。

protected override void OnStartup( StartupEventArgs e )
{
    FrameworkElement.LanguageProperty.OverrideMetadata(
      typeof( FrameworkElement ),
        new FrameworkPropertyMetadata(
          XmlLanguage.GetLanguage( CultureInfo.CurrentCulture.IetfLanguageTag ) ) );

    base.OnStartup( e );
}

ほかにも XAML で xml:lang="ja-JP" を付ける、Language="ja-JP" を付けるなどの方法もあります。

そして、これはバグではなくデザインだそうです。以下の connect にあります。

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=442569

回答はとても興味深いもので、従来の .NET の国際化まわりのチェックをしなかったのはよくなかったと考えており、きちんと明示させる方向を選んだそうです。FxCop はこのあたりをうるさく指摘しますよね。WPF のこの仕組みにより、デザイナー(美術さんじゃなくアプリデザイナーのことだと思います)がきちんとカルチャーについて考えるようにしむけたいようです。

まあ、でも、ネットを見るとこの問題は FAQ で、上のコードを書けという答えばかりで、カルチャーを意識させるのは失敗しているようです…(^^;

id:siokoshou:20090310 に書いた Binding チートシートの最後にもこのコードだけが載ってます。

トラックバック - http://d.hatena.ne.jp/siokoshou/20091029

2009/10/27 (火)

[] WPF と BackgroundWorker  WPF と BackgroundWorkerを含むブックマーク  WPF と BackgroundWorkerのブックマークコメント

WPF で BackgroundWorker は使ってもいいのかな?と調べてみました。結果は OK です。

BackgroundWorker 内部で使っている SynchronizationContext は WPF 用の新しい派生クラスが使われています。

  • WinForm … System.Windows.Forms.WindowsFormsSynchronizationContext
  • WPF … System.Windows.Threading.DispatcherSynchronizationContext

そして、とても良い記事がありました。後半のちゃぶ台返しに注目。

http://msdn.microsoft.com/ja-jp/magazine/cc163328.aspx

WPF は System.ComponentModel を無視しようとしているように見えるので気になったのでした。

gushwellgushwell 2009/10/27 21:49 Dispatcher を使用するのが、WPFの流儀かと思ってました。

BackgroundWorkerが使えるとなると、慣れているBackgroundWorkerのほうがいいですね。

siokoshousiokoshou 2009/10/28 08:49 BackgroundWorker 便利ですよね。
DispatcherSynchronizationContext で UI スレッドに処理を Post する部分は結局 Dispatcher.BeginInvoke してます。

以下脱線ですが、どーして BackgroundWorker が便利なのか考えてみたんですが、これって Template Method パターンですね!見た目はだいぶかけ離れてますケド。
UI の裏で長時間掛かる処理、キャンセルできる、というよくある処理をカプセル化して、スレッドのスイッチはライブラリ側で面倒を見た上で、残りの「裏でやる処理、UI での経過報告、UI での事後処理」をきれいに分けて穴埋めさせてます。
見た目は Template Method パターンとだいぶ違いますが、お手本にしたいほど上手な Template Method パターンの使い方だなーと気づきました。

gushwellgushwell 2009/10/28 21:27 継承使うだけが、Template Method パターンじゃないってことですね。
たしかに、これも、りっぱなTemplate Method パターンですね。

トラックバック - http://d.hatena.ne.jp/siokoshou/20091027

2009/10/25 (日)

[] CAS はやめちゃうそうです  CAS はやめちゃうそうですを含むブックマーク  CAS はやめちゃうそうですのブックマークコメント

http://blogs.msdn.com/shawnfa/archive/2009/06/12/clr-v4-security-policy-roundup.aspx

.NET4 のセキュリティは簡単にするとは聞くものの、じゃあどうなるの?ってところを聞いたことがなかったのでメモしておきます。

難しい上に意味がない CAS はやめて、砂場だけ残すようです。ちゃんと読んでないので以上。5ヵ月後に日本語情報が出たらそれを読もうかな程度の関心しかないもので…。

トラックバック - http://d.hatena.ne.jp/siokoshou/20091025

2009/10/24 (土)

[] Windows 7 でタスクバーにピンで留めれないプログラムの名前  Windows 7 でタスクバーにピンで留めれないプログラムの名前を含むブックマーク  Windows 7 でタスクバーにピンで留めれないプログラムの名前のブックマークコメント

via http://west-wind.com/weblog/posts/32765.aspx

ちょっと笑える記事w

実行ファイルの名前に「Documentation;Help;Install;More Info;Readme;Read me;Read First;Setup;Support;What's New;Remove」が含まれると「タスク バーにこのプログラムを表示する」が表示されなくてピンで留めることができないそうな。

開発者はご注意を。

キーワードは以下のレジストリにあるそうです。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileAssociation\AddRemoveNames

kkamegawakkamegawa 2009/10/25 09:31 これはユーザーが間違って止めちゃわないように…というか、この手のファイル名をデスクトップに張り付ける人が多かったからタスクバーにも止めないようにって配慮なんでしょうかね?確かに笑えるけど、やろうとしてなんだこれは!って人が言う人が多そうな。

siokoshousiokoshou 2009/10/25 09:56 配慮なんでしょうけど、ちょっと余計なお世話っぽい気もしますね。
ReadMeをちょっと留めておくのに使うとか、ありな気がします。
私は既にいつも使うものばかりか、どこいったか探してしまうものを留めておくのに使ってしまってますしw

siokoshousiokoshou 2009/10/25 10:14 あ、実行ファイルしか留めれないか!ReadMe留めるのはハナから無理ですねw

rockeccorockecco 2016/02/29 18:54 自作プログラムが登録できないので、検索したところ、この記事にたどり着きました。
なるほど、そういう制約があったのですね。
プログラム名を変えるか・・・。

トラックバック - http://d.hatena.ne.jp/siokoshou/20091024

2009/10/17 (土)

[] コード公開  コード公開を含むブックマーク  コード公開のブックマークコメント

http://referencesource.microsoft.com/netframework.aspx

Dotnetfx_4016_VistaSP2

Dotnetfx_35.1_Win7

出た!

久しぶりに .NET の中のコードにステップインできるようになった。なんだかすごくうれしい。

関連 http://d.hatena.ne.jp/siokoshou/20090824

トラックバック - http://d.hatena.ne.jp/siokoshou/20091017

2009/10/14 (水)

[] 素朴な疑問  素朴な疑問を含むブックマーク  素朴な疑問のブックマークコメント

ブレークポイントはなぜ「張る」なんだろ?

元になってるメタファーはなんだろ?

GUI のデバッガだとブレークポイントがシールっぽいから?

でも、GUI 以前から使ってそうな気もする(根拠なし)。

dsystemdsystem 2010/02/12 10:01 GUI以前は、ブレークポイントを「仕掛ける」と言ってたような気がします(根拠なし)

ほげほげほげほげ 2010/02/27 12:53 網を張る、っぽく聞こえるなあ。張って、待ち構えていて、おしきたーー、ってニュアンス。

siokoshousiokoshou 2010/07/05 15:36 > 網を張る
あーそうかもしれないですねぇ。ものすごい納得できます。

トラックバック - http://d.hatena.ne.jp/siokoshou/20091014

2009/10/9 (金)

[] Caps Lock キーがいらない  Caps Lock キーがいらないを含むブックマーク  Caps Lock キーがいらないのブックマークコメント

http://slashdot.jp/polls/431

選択肢にどーして Caps Lock キーがないんだ。

間違って押して困ったり、間違って押して PC がおかしくなったと助けを求められたりするための罠キーなのに。

パスワード間違ったときの画面にも Caps Lock うんぬんは定番だし。誰得。

2009/10/7 (水)

[][] Reactive Framework (Rx) で遊んでみた  Reactive Framework (Rx) で遊んでみたを含むブックマーク  Reactive Framework (Rx) で遊んでみたのブックマークコメント

Rx とは

このごろじわじわと情報が出てきている Rx こと Reactive Framework で遊んでみました。x はどっから出てきたの?ってつっこむのがお約束らしいw

pull 型の IEnumerable/IEnumerator をひっくり返して、push 型な IObservable/IObserver を作ったそうです。だから Iterator と Subject/Observer パターンは双対の関係(ひっくり返した関係)にある!大発見!というのが現時点の話題の中心っぽいです。モナドとコモナドらしい。圏論わかりません。ひっくり返す説明は NyaRuRu さんがあげてるビデオで見れますが、文章で読みたければこちらをどうぞ。

細かいところはわからないけど、ひっくり返すとか、おもしろいこと考える世界ですねぇ。自分でも何かひっくり返してみたくなりますw

  • IObservable … 発行者。パフリッシャ。サブジェクト。観測できる。
  • IObserver … 購読者。サブスクライバ。オブザーバ。観測者。

イベントを関数型っぽく扱えるようですが、いまいちメリットがわかりません。Java に一歩歩み寄りたいんでしょうかw

.NET だと Observer パターンを簡単にした event があるので特に困ってないので、Rx はややこしい場合にでも使うのかな?例えば、ネット越しに通知するカプセル化された方法とか、サブジェクトをこねくりまわしたりとかかなぁとビデオを見ながら思ったものの、英語が聞き取れないのでよくわかりませんw

ドキュメントやサンプルを待ちながらエリックメイヤーさんのビデオを見てるのがよさそうと思ってたら、おもしろいビデオを見つけて試したくなってしまいました。

http://langnetsymposium.com/2009/talks/23-ErikMeijer-LiveLabsReactiveFramework.html

姿は見えませんが、ノリノリの声はまちがいなくエリックさんw きっとまたハデな服着てるんでしょうw

おもしろそうなのが 28:36 のマウスのコード。変なコードで二つのイベントの情報を使って一つのイベントに合成してるように見えます。副作用を扱うには IObservable.Let を使えばいいようで、メモ化するのかな?副作用があるのは Zip だと思います。


遊んでみた

Toolkit は Ms-PL ライセンスなので、配っていいよね!?というわけでデモはこちら。マウスの動いた方向を矢印で表示します。これを変なコードで書いてみました。

Visual Studio で Silverlight3 のプロジェクトを作って、http://silverlight.codeplex.com/ から Sliverlight3 用の Toolkit を落としてきて、Microsoft SDKs\Silverlight\v3.0\Toolkit\Jul09\Source\Source code\Binaries (テストに使ってる)にある System.Reactive を参照に追加したら後は遊ぶだけ。関係ないけど Toolkit の DataForm がすごい。

まずは MouseMove イベントを IObservable に。基本形 + Select の合わせ技。

var mouseMove = Observable.FromEvent<MouseEventArgs>( this, "MouseMove" )
  .Select( x => x.EventArgs.GetPosition( this ) );

Observable.FromEvent は IObservable<Event<MouseEventArgs>> を返してきます。Event<T> はイベントハンドラで受け取るいつものあれ、sender と EventArgs を一つにしただけのクラス。つまりここでの IObservable<Event<MouseEventArgs>> はイベント通知をオブジェクトにしたシーケンスというイメージ。

シーケンスなの?と疑問に思うけど、シーケンスとして扱えるよと示しているのが Select。IObservable には Select などの Linq とゆかいな仲間たちメソッドが用意されてます。ここでは座標だけを取り出します。

発行者をいじる行為は event ではできないので新鮮です。

次。

var mouseDiffs = mouseMove.Let( move =>
  from diff in move.Skip( 1 ).Zip( move, ( l, r ) => new { l, r } )
  select new { dx = diff.l.X - diff.r.X, dy = diff.l.Y - diff.r.Y } );

Zip で一つ前の座標と現在の座標をまとめて、差分を取りました。イベントの合成…なのかな?よくわかりません。Let もよくわかりませんが副作用を扱うために必要らしい。Rx の話じゃないけど、このへんとか参考になるかも。きっと同じようにメモ化してると予想。mouseDiffs は IObservable< { dx, dy } >。まだ発行者のまま。

次ははしょるけど mouseDiffs を IObservable<string> にして、最後に購読の申し込み。

direction.Subscribe( e => { ...; this.tb1.Text = str; } );

つまりイベントハンドラの登録。

イベントの登録解除をするにはこうやるようです。賢い。

var unSubscribe = direction.Subscribe( e => ... );
unSubscribe.Dispose();

イベントの世界も関数型っぽく扱えるようです。まだ何がなんだかよくわかりませんがw

以下、醤油。

MainPage.xaml.cs

using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Windows.Controls;
using System.Windows.Input;

namespace RxTest
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();

            // MouseMove イベントを IObservable にする
            // Select など Linq なメソッドたちが実装してある
            var mouseMove = Observable.FromEvent<MouseEventArgs>( this, "MouseMove" )
                .Select( x => x.EventArgs.GetPosition( this ) );
            //mouseMove.Subscribe( e => Debug.WriteLine( e ) );

            // イベントの合成…なのか?
            var mouseDiffs = mouseMove.Let( move =>
                from diff in move.Skip( 1 ).Zip( move, ( l, r ) => new { l, r } )
                select new { dx = diff.l.X - diff.r.X, dy = diff.l.Y - diff.r.Y } );
            //mouseDiffs.Subscribe( e => Debug.WriteLine( e ) );

            // マウスが動いた方向を矢印で表現する
            var direction = mouseDiffs.Select( d =>
            {
                string s = ( d.dx < 0 ) ? "←"
                         : ( 0 < d.dx ) ? "→" : "";
                s += ( d.dy < 0 ) ? "↑"
                   : ( 0 < d.dy ) ? "↓" : "";
                return s;
            } );
            //direction.Subscribe( e => Debug.WriteLine( e ) );

            //Debug.WriteLine( "ID init : " + Thread.CurrentThread.ManagedThreadId );

            string str = "";
            // 購読する
            direction.Subscribe( e =>
                {
                    // この場合イベントはメインスレッドで動いているようです
                    //Debug.WriteLine( "ID event : " + Thread.CurrentThread.ManagedThreadId );

                    // 最新30行だけ表示する
                    var ss = str.Split( '\n' ).Concat( new[] { e } );
                    str = string.Join( "\n",
                        ss.SkipWhile( ( _, i ) => 30 < ss.Count() - i )
                          .ToArray() );
                    this.tb1.Text = str;
                } );
        }
    }
}

MainPage.xaml

<UserControl x:Class="RxTest.MainPage"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">
  <Grid x:Name="LayoutRoot">
    <TextBlock Name="tb1" TextWrapping="Wrap" TextAlignment="Center" />
  </Grid>
</UserControl>

リンク集

コードだけ載せようと思ったのに長くなった…

(追記)書いてから気づいた。

イベントをシリアル化してデータのシーケンスとして扱えるようにしたよ!ってところが本質かも。

トラックバック - http://d.hatena.ne.jp/siokoshou/20091007

2009/10/3 (土)

[] Atomic  Atomicを含むブックマーク  Atomicのブックマークコメント

Atomic の実験をしてみました。下のコードの Reader スレッドでは表示されることはなさそうに見えますが、実際には何度も何度もいろいろな値が表示されます。

x86 ではボコボコ表示されます。

x64 では試した限りでは起きませんでした。でも起きないことは保障されてないハズ。半端なアライメントから値の領域がはじまったら2回のアクセスで読み書きするんじゃなかったかな。

using System;
using System.Threading;

namespace AtomicTest
{
    class Program
    {
        private long value = 0;

        static void Main()
        {
            var p = new Program();
            Action w = p.Writer;
            Action r = p.Reader;

            w.BeginInvoke( null, null );
            r.BeginInvoke( null, null );

            Console.WriteLine( long.MaxValue ); // 参考のため
            Console.WriteLine();

            Console.ReadKey();
        }

        void Writer()
        {
            while ( true )
            {
                if ( this.value == 0 )
                    this.value = long.MaxValue;
                else if ( this.value == long.MaxValue )
                    this.value = 0;
            }
        }

        void Reader()
        {
            while ( true )
            {
                if ( this.value != 0 && this.value != long.MaxValue )
                    Console.WriteLine( this.value );

                Thread.Sleep( 100 );
            }
        }

    }
}

C# の仕様書より引用。

5.5 変数参照の分割不能性

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

long の読み書きはアトミックじゃない。

ついでに long に volatile もつけれない。

最後にお約束。BeginInvoke したら EndInvoke を呼ぶように。ごめんねいつもさぼって。

トラックバック - http://d.hatena.ne.jp/siokoshou/20091003

2009/10/2 (金)

[][] スマートタグを開くショートカットキーは Ctrl+.  スマートタグを開くショートカットキーは Ctrl+.を含むブックマーク  スマートタグを開くショートカットキーは Ctrl+.のブックマークコメント

using を補完したり、インターフェイスの実装を補完するときに使うスマートタグ。

これをキーボードで開くショートカットは「Ctrl+.」。

. じゃ見えないかもしれないので日本語でも書いておくと「コントロール + ピリオド(ドット)」ねw

f:id:siokoshou:20091002144459j:image

f:id:siokoshou:20091002144500j:image

これを知るまでいちいちマウスでやってた(><)

インジケータがものすごい小さいんだこれがまた(><)

Shift+Alt+F10 というショートカットもあるようです。


前回の「Visual Studio で一行だけコピーや削除するときには行を選択しなくてもよかった件について」は知らなかった告白が相次いで、よかった自分だけじゃなかったとほっとしてますw

ちなみに前回と、この記事は「Essential Visual Studio Tips & Tricks that Every Developer Should Know」からでした。こちらの記事には 11件の Tips が載ってるので気になる人はどーぞ。

スマートタグもインテリセンスもオフィスではパッとしなかった(過去形w)のに、Visual Studio だと大活躍ですね。次はリボンか?

ちなみにリボン肯定派です。リボンになってもあれはどこいったと探し回ってるけどw

トラックバック - http://d.hatena.ne.jp/siokoshou/20091002
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 06 | 09 | 11 | 12 |
2007 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 08 | 09 | 10 | 12 |
2009 | 01 | 03 | 04 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 07 |
2011 | 04 | 07 | 10 |
2012 | 04 | 12 |
2013 | 08 |
2014 | 03 | 08 |
2017 | 09 |
Connection: close