Virtual PC上でdebianのeth0が消えた現象

Windows Vista Ultimate x32上のMicrosoft Virtual PCからWindows 7 Enterprise x64のWindows Virtual PCにDebian lennyの仮想マシンのデータをそっくり移して使おうとしたら、eth0がなぜか消えてしまった…

loしか残ってないという状況。

結論から言うと、/etc/udev/rules.d/70-persistent-net.rulesを削除した後、rebootしたら直りました。

/etc/init.d/networking restartとかでは直らず。

ゲストOSが64bitじゃないからいけないのかとか思ってdebianの64bit版とか別にインストールしようと試みて、ゲストOSには32bitしか受け付けないことを知ったり。なので、そこは問題ではなかった。


iPhoneな人への地図URLの送り方

iPhone/iPod touchでもPCでも共通で見られるGoogleマップのURLを作りたくなったのでメモ。

というか、iPhone上のSafariから、Googleで場所を検索すると出てくるリンクですね。iPhoneの場合、このURLを開くと地図アプリが開きます。

http://maps.google.co.jp/?q=東京都新宿区西新宿2丁目8−1

http://maps.google.co.jp/?q=248-0006

PCのGoogleマップで地図のURL開くとめちゃくちゃ長くなってしまうので、こういう指定の仕方覚えておくと便利かも。

何がやりたかったかって言うと、twitterで○○の場所どこ?って聞かれて、とっさに住所だけ答えてしまったけど、iPhoneで使える地図のURLにしたほうが便利だったな、って思って。


Silverlight3とBlend3とビヘイビア

Silverlightの開発、ビヘイビアが結構便利なのだけど、あまりまだ洗練されてないのと情報少ないので発見したこと共有しておきます。

まとめを書きたいけどちょっと時間取れないので、ざっくり、どんなものかを書いておきます。

とにかくコードを書かなくて良くなる

コード書く量が減れば、コードをビジネスロジックに集中できるので、見通しが良くなります。デザイナに渡すのも楽かもしれないですね。

簡単な処理はストーリーボードも不要

全部ストーリーボードでやろうとしていたら、結局制御のためにプログラムを書かなきゃいけない事態になっていたので、これも便利ですね。イージングもかけられます。

ときどき動かない条件があるらしい?

マウスオーバーで画像を切り替える処理をやりたくて、ChangePropertyActionに親コントロール(Image)のSourceを切り替える処理をやらせたら、Silverlight自体表示されなくなってしまいました。ローディング100%の状態で先に進まない…。

他にもHyperlinkActionに直接http://から始まるURLを書いたら同じ現象になりました。使い方間違ってるだけだとは思うけど。これについての情報はこっちで解決。

Blend 3 silverlight application & website

<HyperlinkButton Tag="/Views/Page1.xaml" Background="Black" Height="47" HorizontalAlignment="Left" VerticalAlignment="Top" Width="133" NavigateUri="/Page1.xaml" Cursor="Stylus" />

ビヘイビア使わずにHyperlinkButtonにするってことですね…

状態を制するとインターフェースの設計が楽になる

やっぱりインターフェースを重点的に考えられているだけあって、状態を作ってしまえば、あとは状態の遷移だけ意識すればいいという点で便利。

マウスオーバーでずるっと出てくるメニューとか、GoToStateActionを使うと簡単に作れます。状態を先に保存しておいて、それぞれの状態を切り替える処理をクリックイベントだのチェックボックスのチェックだののイベントに関連付けられます。

ただし、「状態」を使うために別コントロールにしておく必要あり。あと、別コントロールにしたあと、一度ビルドしないとプロジェクト内の他のXAMLから使えないっぽい?アセットにコントロールが出てこないと焦ったときはとりあえずビルド。

マウスオーバーでずるっと出てくるメニューはストーリーボードでやらないほうがいい

なぜならアニメーション中にフォーカス外れたとき、MouseLeaveイベントにストーリーボードのBeginとか書いてあると、メニューが出きっていないのにストーリーボードのスタート地点で出きった位置に飛ばされるからです。

その点、GoToStateActionはその辺もきれいに処理してくれるので便利。

ずるずる並び替えられる処理もビヘイビアで

FluidMoveBehaviorを使えばパネルの中の要素をドラッグアンドドロップで変更する処理を一発で設定できるらしいです。試してないけど。

動画あった。これかな?

Animated WPF Panels (animating collection views) | Software and UX

トリガーはビヘイビアを選択したときにプロパティに出てくる

もう一度言う、「トリガーはビヘイビアを選択したときにプロパティに出てくる」。わかりにくい探しにくい…一度覚えてしまえば大丈夫なのだろうけど…

ついでに言うと、状態の選択を解除するには状態タブの中のベースを選択しておけばいいと思う。

その他、デモとか

色々解説してくれているサイトがあったので、紹介しておきます。

kirupa.com – Using Custom Visual States, Page 1 (Visual StatesとGoToStateActionの話)

kirupa.com – Using the FluidMove Behavior, Page 1 (FluidMoveBehaviorのデモあり)

サイト上で全部のデモを見られないのが残念だけど、ソース公開してくれているので、一度ダウンロードして動きを見てみるといいと思いますよ。


SilverlightのTestPage.htm自動生成をやめる

やめる、というか、HTMLのobject要素内にparamとか追加したかったので、別ページを用意して、そのファイルをビルド時に実行してくれるようにしたいのです。

ASP.NETのプロジェクトがくっついている場合はそちらを修正すればいいのですが、Silverlightプロジェクトを単体で作ってしまった場合用。

環境はVisual Studio 2010 ベータを使っています。

メニューの[プロジェクト]から、[新しい項目の追加]、[HTMLファイル]を選択して1ページ作成してやります。

スケルトンのHTMLがエディタに表示されるので、Silverlightを呼び出すタグを書きます。自動生成されたTestPage.htmの内容でもコピーして作ると楽。

ちなみに実行自体はプロジェクトのルートフォルダにできるので、xapファイルのパスの前にBin/debug/などをつけてやる必要あり。(出力ディレクトリにコピーできるけど、コピーしてもそちらが実行されるわけではない)

で、プロジェクトのプロパティで、デバッグ→開始動作のラジオボタンを[テスト ページを動的に生成する]から[ページを指定する]に変更して、htmlファイルを選択。完了。


Encoding.GetString(Byte[])はSilverlightで使えない

今日のびっくり。

‘System.Text.Encoding.GetString(byte[])’ はアクセスできない保護レベルになっています。

Encoding.UTF8.GetString(data);

こんなコードを書くとビルド時エラーになります。

なぜか、Encoding.GetString(Byte[], Int32, Int32)は使えます。

Encoding.UTF8.GetString(data, 0, data.Length);

こうしておけばOK。何だろう、この仕様。


今日の微妙エラー

コントロールはひとつの case ラベル (‘default:’) から別のラベルへ流れ落ちることはできません。

switch (message)
{
    case "hoge":
        funcA();
        break;
    default:
        funcB();
        break; // これがないとエラー
}

他の言語のクセでbreak書かなかったら起きた。

「フォールスルー」ってことなんですね。

ちなみにcaseのあとのブロックにコードを書かなければフォールスルーはできるという話。


Windowsフォームへの、やたら簡単なSilverlightホスティング方法

  1. VisualStudioでフォームをひとつ作ります。
  2. WebBrowserコントロールを配置します。
  3. フォームのLoadイベントに以下を記述。
        private void Form1_Load(object sender, EventArgs e)
        {
            string html = @"<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"">
<!-- saved from url=(0014)about:internet -->

<html xmlns=""http://www.w3.org/1999/xhtml"" >
 <head>
  <title>Test</title>

  <script type=""text/xaml"" id=""testXaml"">
<?xml version=""1.0""?>
<Canvas xmlns=""http://schemas.microsoft.com/client/2007"">
 <Ellipse Fill=""Pink"" Width=""200"" Height=""100"" Canvas.Left=""40"" Canvas.Top=""30"" />
 <Rectangle Fill=""Orange"" Width=""100"" Height=""160"" Canvas.Left=""150"" Canvas.Top=""50"" />
 <TextBlock Text=""This is text on Silverlight"" Canvas.Left=""10"" Canvas.Top=""150"">
  <TextBlock.RenderTransform>
   <RotateTransform Angle=""-30"" />
  </TextBlock.RenderTransform>
 </TextBlock>
</Canvas>
  </script>
 </head>

 <body>
   <object type=""application/x-silverlight-2"" width=""800"" height=""600"">
   <param name=""source"" value=""#testXaml""/>
  </object>
 </body>
</html>";
            if (webBrowser1.Document == null)
            {
                webBrowser1.Navigate("about:blank");
            }
            webBrowser1.Document.OpenNew(true);
            webBrowser1.Document.Write(html);
        }

結果

20100127103949

XAMLソースはこちらから拝借。

【コラム】The Silverlight Times (16) 覚えておきたい「インラインXAML」 | ネット | マイコミジャーナル

WebBrowserの使い方はこちらを参考にしました。

WebBrowserコントロールのコンテンツを文字列により設定するには?[2.0、C#、VB] - @IT


ビルド時ぬるり

以前Visual Studio 2005で作ったプロジェクトをベータ版のVisual Studio 2010に持ってきて、NotifyIconとContextMenuStripを追加しようとしたら、ビルド時に
オブジェクト参照がオブジェクト インスタンスに設定されていません。 Form1.resx
というエラーが発生。

どうも.NET Frameworkの2.0のDLLを参照しているのにForm1.resxでは4.0とか書いてあるのが問題のような気がするのだけど…?
参照先のパスはこんな感じ。
C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll

何とか変更しようと試みたけど、参照削除→新しいファイル追加でも、古いほうのDLLを見に行ってしまうみたいで、書き換えられず。
結局プロジェクトのターゲットフレームワークを.NET 3.5にしていたのが問題のようなので、4.0にしてみたら一応通りました。

配布できるのか?これ。


Windows 7 x64でのVirtual PCとdebian

Windows 7 x64環境のWindows Virtual PCに、以前Vista 32bit版のMicrosoft Virtual PC 2007で使っていたdebian Lennyの仮想マシンを持ってきて起動させようとしたら、ブートの途中で何もエラーも表示せずに応答しなくなってしまったので対策を調査。

多分Windows 7どうこうではなくて、64bit版だということが問題っぽい。

MicrosoftVirtualPc2007/lenny – Debian Wiki

noreplace-paravirtパラメータを追加しておけば良いだけ。

まぁ、すでに設定していた場合は何もせずに移行できたって話ですね。Windows Virtual PCとVirtual PC 2007間での互換性問題はほとんどなさそう。

追記

NICを認識しない…やっぱりdebianを64bit版にするしかないのか…?


自作ドライバを配布するためのインストーラー

DPInst.exeというものがとにかく便利すぎたのでメモ。

何せ上記実行ファイルを配布したいinfと同じフォルダに置くだけ。DPInst.exeを実行すればインストールが開始されます。

参考にしたのはこちらのサイト。

DPInst.exeの使い方 / How to use DPInst.exe WinUSB.sys事始め/ウェブリブログ

インストール画面をカスタマイズしたい場合に限り、定義XMLファイルを設置すればいいようです。

サンプルとして使えるXMLや画像一式は以下のフォルダにあります。

C:\WinDDK\7600.16385.0\src\setup\DPInst

日本語の場合はlanguage codeに0x0411をセット。

<language code="0x0411">

あとはUTF-8にして日本語で記述できます。

0x0411を定義しておかないと、

現在の言語では、デバイス ドライバのインストール ウィザードはサポートされません。

このパッケージを提供した製造元に問い合わせてください。

と表示されて先に進めません。

ちなみにNSISでやることを最初考えていて、それは以下のページに書いてありました。

Driver installation and update – NSIS

こっちはまだ試していないのですが、アプリケーションとかも一緒にインストールする場合にはNSISの方が便利かも。