MIDI楽譜表示。UIはだいたいできてきた。今こんな感じ。

20100724


C++からC#への移行も兼ねてWPFで作ってるのだが,WPFで実装していくと,作った覚えのない部分が勝手に実装されていたりするのが気持ちいい。例えば下のプログレスバーは演奏箇所にBindingしているので演奏が進むと勝手にバーが進むようになっている。で,それとは別に楽譜の中にある赤いカーソルは,演奏している場所に合わせて描画している。こうしておくとプログレスバーを動かすとリアルタイムに赤いカーソルが動くようになる。そんなコードは作り込んでないのに勝手に動くのが素晴らしい。

とはいえ,今までのWin32プログラミングと比べて,どれだけコードをかかずにやりたいことを実現させるか,みたいなのに時間を使ってしまうので無駄に手間がかかってるような。


先週は右側のトラック表示部分をドラッグして並べ替えられるようにしていた。先月のMSDN Magazineにいい感じの記事があったので,それを参考に実装はできたのだが,ItemContainerGeneratorとか深い部分はまだ分かってない感じ。

最後にはまったのがドラッグ時のアニメーション。StoryboardのDurationにmillisecondを指定しても,アニメーションが途中で終わってしまって困ったのだが,StoryboardのDurationではなくてDoubleAnimationとかのDurationに指定しないといけないのか。Storyboardは0.3秒とかでもDoubleAnimationがデフォルトの1秒になってて途中で切れていたっぽい。

UIが完成したらもう一度楽譜に戻って未実装部分を作り込んで,とりあえず楽譜表示は完成か。

以前Windows 7 Media Center用地デジチューナを買ってみたが,GeForce Go 7950 GTXでは使用できず,ほとんど使っていなかった。で,最近Media CenterじゃなくてもAeroが有効なままの製品が出てきているので,新たにBUFFALO DT-H70/U2を買ってみた。地デジチューナでこんなに軽いのは初めて。付属ソフトも必要な機能は揃ってるぽいしかなりいい感じ。変なところは起動するたびにミュートになる,くらいか?

とりあえず管理人は特定のIPアドレスでしか発言できないようにしましたのでよろしくおねがいします>ぱじ。あと裏掲示板はホスト名が見えるようにしました。

ディスプレイ購入後,しばらくマルチディスプレイで使っている。で思ったのだが,複数のPCを使用しているときにもマルチディスプレイ的な操作がしたい。つまりメインのPCが右にあってサブPCが左にあったら,メインPCでマウスカーソルを左にはみ出させるとサブPCのマウスが動いて,さらにメインPCのキーボードでサブPCが操作できる感じ。技術的にも難しくはなさそうだったので2時間でプロトを作ってみた。SetWindowsHookExとSocket通信でなんとなく動くところまではいった。

で,ちゃんと作り始める前にネットで検索してみる。するとやっぱり同じ事考えている人はいますね。Avalonさんの「DOKODEMO」がまさにやりたかったことだった。というわけで開発は断念。今は真ん中ディスプレイ,右にメインノート,左にサブノートの環境なのだが,かなり快適になった。3台以上もOKだし,PC切替機なんか昔のテクノロジって感じになっちゃいますね。

マルチディスプレイと違う点としては,ウィンドウをドラッグできないこととオブジェクトをドラッグアンドドロップできないこと,か。テキストはクリップボード共有ができるのでいいのだが,ファイルのドラッグアンドドロップは無理かなあ。裏で共有フォルダ経由にするとかそれこそSocketで送ってしまうとか。もしこれができるとかなり便利な気がする。

Expression 4とSilverlight 4 Toolsがリリースされていたので入れてみた。これで.NET 3.5から.NET 4.0に移行できる,んだけどそうするとデフォルトで動かなくなってしまうのだろうか。

なんかお金が振り込まれていたのでキーボードとディスプレイを購入してみた。ノートPCを使ってるんだけど,姿勢が前屈みになるのがずっと気になっていてようやく購入という感じ。床に座ってたときから比べると,デスク・チェア→キーボード→ディスプレイとずいぶん環境がよくなった。

ディスプレイについては高くてもいいものないかなあ,といろいろ探していたのだが,最近はいい液晶ディスプレイってないんですね。24インチだとでかすぎとか今のノートがWUXGAだから同じくらいの解像度,っていうともう選択肢がない。で結局ナナオにしてみたのだが,いい感じ。DELLノートと大分色合いが違うっていうか白ってこんなに白かったのか。

元がノートなので簡単にマルチディスプレイにできるのだが,ノートと外部ディスプレイの組合せだとちょっと使いづらい。

最近サポート掲示板への書き込みが増えているのだが,SPAM対策のため,一部の発言については一旦保留にしている。保留になった発言は後で人が判定してSPAMでなければ本物の掲示板に移動するようにしているわけだが,どうしても数日のラグが出る場合がある。なので保留中の発言が見られるよう掲示板の方にリンクを貼っておいた。最近の掲示板SPAMの傾向をチェックしたい方も必見。

そういえばSPAM投稿を手で削除していた頃はSPAM投稿がうっとおしかったが,SPAM対策を入れてから逆にSPAM投稿が待ち遠しくなった。自作の掲示板だとこんなふうにいろいろカスタマイズできていい感じ。

歯茎が腫れたので歯茎をめくって膿をとってもらった。根は大丈夫だったので保存治療になったけど,もう少しほっておいたら抜歯だったかも。

と書くと普通の日記なので無理矢理コンピュータの話に持って行くと,最近はアレですね。身体に不調があった場合,症状を検索するとだいたいどんな病気で治療法とか最悪ケースとかわかりますね。こういうときネットがない時代ってどうやってたんだろう,って思う。

掲示板のDirectPlay初期化の件。エラー処理を除くと以下のようなコードになっていて,Initializeで止まっていると思われる。多分DirectPlayを使用するゲームは全て動かないのだろう。Dumpを送ってもらえば何か分かるかも知れないが,何百MBとかだし,DirectPlayが原因と分かってMSに聞いたとしてももはやサポート外で答えてくれない気もする。

LogOut(_T("DirectPlay: 初期化開始"));

::CoCreateInstance(CLSID_DirectPlay8Peer, NULL, CLSCTX_INPROC_SERVER, IID_IDirectPlay8Peer, (LPVOID *)&m_pDirectPlay);

m_pDirectPlay->Initialize(this, MessageHandlerStatic, 0);

LogOut(_T("DirectPlay: 初期化完了"));

掲示板にはぱじさんの方から回答が出ているが,逆襲のもげぇたんの人数制限についてこっちに補足。マルチプレイ脱出ゲームの人数は本来もっと少なくてもいいと思っている。5人くらいがいいような気がするがそれだと入りづらい感じもするので,ゲームが成り立つぎりぎりの人数ということで7人に設定した。なのでこれ以上人数を増やすとゲームが成り立たなくなるわけで,チャットルームのためにゲーム性を犠牲にするのはちょっと違うかな,という話。

WPFのローカリゼーション。どうもMS的にはLocBamlを使う方法を推奨している感じがするが,リソースDLLをビルドしてからバイナリを編集するというのはちょっと気持ち悪い。ということでresxを使うことに。これで合ってるか分からないけどとりあえず最小限のやり方。

  • 最初から入っているResources.resxと同じようにResources.ja-JP.resxを作成し,Propertiesに入れておく。
  • 英語と日本語で同じNameのリソースを作成。
  • .csファイルからはProperties.Resources.XXXで参照する。
  • .xamlファイルからは「xmlns:s="clr-namespace:project.Properties"」のようにネームスペースを参照しておき,{x:Static s:Resources.XXX}として参照する。

なおこれだと言語はOSの表示言語に従うことになる。切り替えたい場合はThread.CurrentThread.CurrentUICultureで切り替えればいいはず。試してないけど。


ここまで作成したものをXPで試してみたが,xmlparseでエラーが発生し,起動できなかった。しばらく調べてみたが原因不明。まあXPは対象外にする予定だからまあいいか。

ゴールデンウィ。なんだか特命でアセンブラ書いてたりする。アセンブラを読むのは割と日常だが,書くのはPC-6001のZ80以来なので懐かしい。とりあえずブートの仕方をネットで探して組んでいるが,特に参考になるのがウイルスのコードだったりして複雑な気分。


長期休暇で実家にいるので久々にテレビと新聞を見ているわけだが,もはやネットな人とテレビな人では完全に住む世界が違う感じですね。きっしー(誰)の宮崎県が大変なことになってるけどどこもやってないし。仮に報道規制だとしても,ネットな人はいくらでも調べられるわけで,どんどん情報格差が広がってますね。

# 情報規制はデマらしい。つまりテレビ業界は口蹄疫なんて報道する価値なしと判断してたってことですね。

WPFでボタンをデザイン。C++MFCだとオーナードローでこんなボタンを作ったらそれだけで数日はかかりそうだが,C#+WPF+Expression Blendなら慣れれば1時間くらいでできそう。今までめんどくさくてUIに凝ることもなかったが,これだけの開発環境を用意されるとUI作るのが楽しくなってくる。

2010042001


ちなみに作り方をメモっておく。Expression Blendで普通のボタンを作ってテンプレートの編集。ボタンの中身をごっそり削除して,Ellipseを配置してグラデーションをいい感じに設定。中身にcontaintPresenterをはりつけておく。ここまででデザインは完了。これだとボタンを押しても見た目が変わらないので,トリガータブの「+プロパティ」でIsPressedとかIsMouseOverとか必要なものを追加して,デザインを適当にいじるとイベントが起きたときに差分が適用されるようになる。ここまででスタイル作成完了。Mainのウィンドウに戻って今作ったスタイルをボタンのStyleとして設定。最後にボタンの中身にExpression Designとかで作った絵を貼り付けて完成。

2010042002


ついでにツールチップも付けてみた。色合いを変えて半透明にするためにStyleを変更してみたが,以下のようなコードを書くと,Expression Blendで編集する際に「’ToolTip’は,論理親またはビジュアル親を持つことができません。」というエラーになる。Expression Blendで編集できないだけでVisual Studio 2010ではビルドできて普通に動くのだが,これでいいのだろうか。

2010042003

<ResourceDictionary>
    <Style x:Key="Tip" TargetType="{x:Type ToolTip}">
        <Setter Property="Background" Value="#202020"/>
        <Setter Property="Foreground" Value="White"/>
        <Setter Property="Opacity" Value="0.8"/>
    </Style>
</ResourceDictionary>
----
<Window>
    <Button Style="{DynamicResource PanelButton}">
        <Button.ToolTip><ToolTip Style="{DynamicResource Tip}">次のページ</ToolTip></Button.ToolTip>
            <Canvas Width="16" Height="16" Background="{DynamicResource NextButton}"/"
    </Button>
</Window>
		

Visual Studio 2010がリリースされたので会社を休んでインストールしてみた。これでようやく作ったものを配布できる。って言っても配布するものがないけど。

で最近はずっとC#でWPF開発をしているが,WPFの考えが面白くて,開発と言うより勉強しかしてない。

MIDIの楽譜化が少しずつできてきた。今こんな感じ。ホントはもっときれいな楽譜もあるのだが,著作権うんぬんがあるので,自作曲の手入力MIDIのサンプル。

20100318

今の自分のPCの解像度が1920×1200なのだが,それに合わせて作っているので,解像度が低いと見にくい。一応ベクタグラフィックなのでそれなりに縮小できるがやっぱり限界がある感じ。ぱじさんが「最近の画面解像度の統計あるよ」って言ってたので見せてもらったところ,1024×768が堂々の1位! ってマジですか。Windows 3.1の頃に一般的だった解像度なんですが・・・。

 


ぱじさんの「人喰い掲示板の噂」はなかなか進んでないっぽい。

「人喰い掲示板の噂 二日目」公開。1/11に1日目公開,2/22に2日目公開ってことは・・・!。

ぱじさんからそろそろ2日目が完成との連絡があった。なかなかよいかと思います。

発売したときから気になっていたC Magazine CompleteのDVD。199冊分の雑誌がDVD 1枚に入って定価55000円。一見高いように見えるが199冊分なので実はそうでもない。のか? 入手困難になる前にとりあえず買ってみた。BASIC マガジン Completeだったら倍の値段でも即買うんだけど・・・。

最初の方からコラム中心に読み直していってるけどNifty全盛時代って感じで懐かしい。

しばらく確認していなかったが,サブのサーバが落ちているっぽい。影響があるのはワードサーバだけ,かなあ。

Visual Studio 2010 RC版公開。とりあえずダウンロードして明日いじってみよう。

BranchCache。分散キャッシュモードでやってみたら割と簡単にできた。パケットキャプチャで動作を見ているとちゃんとP2P的な動きをしていて,ファイルを64KBごとに分割し,複数のサーバからSMB/HTTPで分割ダウンロードしているのが確認できた。

掲示板。「人喰い掲示板の噂」についての発言が結構あるが,放置する形になっている。これは,制作者側としては攻略系の質問には答えられないためで,ぱじさんも私もバグとか要望とかのみにレスをしていく方針。攻略系の質問は,ユーザ間での情報共有に任せるということで。


特命があったので,BranchCacheを実験。BranchCacheはWindows 2008 R2とWindows 7でファイル共有やWebのキャッシングをするものだが,設定が割と大変。結局キャッシュされてるようでされてないような微妙な状態で時間切れ。解決してないけど,次にやったときのためにメモっておく

  • PC1。VMWareにWindows 2008 R2を入れ,ブリッジモードに設定してAD/ファイルサーバ/BranchCacheを入れる。ドメインポリシーで「ネットワーク-LAN Manager サーバー-BranchCache のハッシュの発行」を設定。共有フォルダでBranchCacheを有効化。
  • PC2。VMWareにWindows 2008 R2を入れ,NATモードに設定して証明機関/BranchCacheを入れる。CAの証明書をインストールし,Webサーバ証明書を発行してインストール。「netsh branchcache set service mode=HOSTEDSERVER」「NETSH HTTP ADD SSLCERT IPPORT=0.0.0.0:443 CERTHASH=<拇印> APPID={d673f5ee-a714-454d-8de2-492e4c1bd8f8}」を設定。
  • PC3。VMWareにWindows 7を入れ,NATモードに設定して「set service mode=HOSTEDCLIENT location=PC2の名前」「netsh branchcache smb set latency 0」を設定

パケットキャプチャで見ると,PC1からPC3にダウンロードした後,PC3からPC2にキャッシュを置きに行っているような感じなんだけど,PC2で「nets branchcache show status all」でキャッシュサイズを見ても増えていない。たまに増えることもある,みたいな。

楽譜表示。何度も作り替えているが,結局WPFで作ることに。ベクターグラフィックをそのまま使えるので拡大縮小しても綺麗なままというのがいい。2000だと動かない,XPだと汚くなるとかあるけど,もはやVista以降前提でもいいですよね,ってことで。

ぱじさんからFlashゲーム最新作が届く。まださわりの部分だけで続きは順次更新予定とのこと。とりあえずシングルプレイでネットワークはこれからなのか。

MSDN コンプリヘンシブキットが届いた。以前の経験から,かなり大量に来るかと思っていたが,意外と普通で,Win 7/Win 2008R2/Office 2007/Expression 3/その他もろもろでDVD20枚くらい?だった。これ以上来ても前送られたのとかぶるから丁度いいのだが。


Windows 7ではDPI設定を変更した場合の動作が以前に比べてよくなっているらしい。んでそのためかインストール時に勝手にDPIが設定されるという噂。ウェザタイが心配なので軽くテストしてみたが,125%,150%ともになんとなくうまくいっていた。XPとかの頃はDPI設定を変更したらデザインが崩れてどうしようもなかった記憶があるが,自然に拡大されている感じ。もしかしたら,実はAero無効だと汚いとかあるのかも知れないが,とりあえずはいいか。

休み中ずっとWPFをいじっていた。C#のインテリセンス具合とかベクタグラフィックを直接扱えるのとかいい感じ。

ひさびさにウェザタイロビーへ行って「あけまして」だけ言ってきた。

Visual Studio Professional with MSDN Premium納品。早い。とりあえずOffice 2010 Betaを入れてみた。ついにOfficeも64bitか,ってMSDNの意味ないじゃん,みたいな。

恒例のdenasu忘年会12周年。恒例といいつつ参加は5年ぶりくらいだが,ITの発達のお陰で遠隔飲み会ができる時代となった。来年は是非全員オンラインでゆっくり音声合成でやりましょう。

MSDN更新案内がくる。「今ならITバリューアップキャンペーンでお徳! 今すぐここにアクセス!」とかいう怪しいDMが入っていたので騙されて申し込んでみた。今までProfessionalだったのが,Premiumに変わって年間換算で+2万くらい。これでOfficeもExpressionもServer類も手に入るってことで。Visual Studio 2010が出ればTeam Foundation Serverも付いてくるらしいのでお徳,なのか? 今まで個人でPremium入ってた人はあんまりいないような気がするがこのキャンペーンで結構増えるような気がしないでもない。

Visual Studio 2010で遊んでいるのだが,C++0xに一部対応ってことでいろいろ面白いことができるようになっている。個人的にはクロージャのサポートとか正規表現の標準ライブラリ化とかメルセンヌツイスターの乱数発生とかが嬉しいところ。

なんかC++もC#もJavaもお互いに機能を取り入れまくっていて,よく似た言語が3つできあがっているだけのような気が・・・。それでいてヌルポはnullじゃなくてnullptrになってたりして意味が分からない。

# と思ったらregexなんかはVS2008 SP1からあるんですね。SPで機能が追加されるとは・・・。