kazuk は null に触れてしまった

C# / .NET 系技術ネタ縛りでお送りしております

カテゴリーアーカイブ: Metro Style Application

Windows 8 & RT でのサイドローディング


年末年始辺りから調べ初めて、一応これで確定かなと思える段階になりましたので記事おば。

サイドローディングって何ですか?

一般的に Windows 8 / RT ではアプリケーションはマイクロソフトの運営する Windows アプリストアから入手するようになっています。( Windows 8 のデスクトップ環境はこの限りではありません)

Windows アプリストアは全世界に向けて公開されている物なので、企業内利用を前提とするアプリケーション(いわゆるインハウスアプリケーション)の配布と展開には向きません。特に企業秘密なロジックやその他が外部に漏れないように管理したいという場合には向きません。

これにたいする回答がサイドローディングという事になり、Windowsアプリストアを経由せずにアプリケーションをインストールする事ができます。

サイドローディングが可能なクライアントOS

Windows 8 の場合には家庭向けの位置づけがされている無印エディションのみサイドローディングができません。

Windows 8 Enterprise の場合にはドメイン参加時点でサイドローディングが可能になります。

Windows 8 Pro ではOSに追加で Sideloading Activation Key を入手、インストールする事により Sideloading が可能になります。(ただし 一般の Retail 版 Windows Pro ではできません、ボリュームライセンスプログラムによって入手されたWindows 8 Pro が必要という事です。 参考情報1 )

Windows RT は Pro と同様に Sideloading Activation Key を入手、インストールする必要があります。

Sideloading Activation Key の入手

以下のいずれかのライセンスプログラムに加入していれば、ライセンスプログラムの特典として無償入手が可能です。

  • Select / Select Plus による Windows ソフトウェアアシュアランス
  • Windows を含む Enterprise Agreement / Enterprise Subscription Agreement
  • 教育組織では Windows を含む Enrollment of Education Solutions ないしは Campas/School Agreement

上記ライセンスプログラムに加入していない場合には、 Select / Select Plus から購入する事ができます。

製品名 「WinSdLdH 8 … 100Lic EntSideload」 …部にはライセンスプログラム固有なワードが入ります。

WinSdLdH EntSideload の Bing 検索結果

会社として付き合いのあるオープンライセンスのリセラーにこれで問い合わせれば見積もりくれるでしょうし、売ってくれるはずです。

最低でも 100 ライセンスのパックですので、数台の物にインストールするのは結構割に合わないと思います。

Side Loading Activation Key はマシン単位です、1ライセンスは1台にインストールでき、マシンと完全に結び付けされますので、マシンを廃棄その他した場合には消尽する物と考えてください。

ポリシーによるサイドローディングの許可

グループポリシーの「信頼できるすべてのアプリのインストールを許可する」を有効にします。

Sidelading Activation Key のインストール

コマンドロンプトで管理者権限で Slmgr を実行します。

image

/ipk オプションで Sideloading Activation Key の 25桁のプロダクトキーを入力してください。

サイドローディングアプリケーションの展開

手動インストールを行う場合 add-appxpackage PoweShell コマンドレットを使います。

Windows インストールイメージに付属させてアプリケーションを展開するには DISM コマンドの /Add-ProvisionedAppxPackage オプションを使うか、Add-AppxProvisionedPackage PoweShell コマンドレットを使います。

System Centerその他、Windows でアプリケーション展開を行う為の各種システムがサイドローディングに対応しているようです。(そちらは私は調べていません。)

サイドローディングされるアプリケーションの開発

サイドローディングされるアプリケーションは適切な署名がされている必要があります。(以下は自己署名証明書を利用する例です、企業レベルでCAを持っている場合、そのCAで証明書を発行する事が望ましいです)

コードサインニング証明書を作成します /eku オプションの 1.3.6.1.5.5.7.3.3 がコードサインニング証明書を生成する事の指定になっており 1.3.6.1.4.1.311.10.3.13 で証明書が無効になってもコードサインニング署名を有効にするためのオプションです。(これを指定していないと証明書が期限切れで無効になった時にアプリケーションを再署名する必要があります)

C:\Users\kazuk>MakeCert /n “CN=Kazuk” /r /h 0 /eku “1.3.6.1.5.5.7.3.3,1.3.6.1.4.1.311.10.3.13” /e “08/01/2013” /sv MyKey.pvk MyKey.cer
Succeeded

数回パスワードをどう設定するか聞いてきますのでパスワードを設定すると Succeeded 表示されファイルが作成されます。

Pvk2Pfx ユーティリティで pfx ファイルを作成します。

C:\Users\kazuk>Pvk2Pfx /pvk MyKey.pvk /pi 検閲削除 /spc MyKey.cer /pfx MyKey.pfx

/pi のパラメータは 証明書のパスワードです。 /po オプションで pfx を利用する際のパスワードを設定できます。

作成された MyKey.cer は展開されるマシンの証明書ストアに配置する必要があり、pfx はアプリケーションの開発に必要になりますので、pvk 含めてちゃんと保存、管理してください。

開発者はプロジェクトに pfx を配置するか証明書ストアに pfxをインポートします。

imageimage

ファイルを選択すると証明書のパスワードを要求されるので、これを入力すると署名が設定されます。

完全な証明書の表示を行うと、MakeCert 時に設定した日付までになっていますので、正しく署名がされる事が確認できます。

cer ファイルを展開先マシンの「信頼される発行元」の証明書ストアに登録する事で、このpfxで署名されたアプリケーションは展開先で信頼されます。(今回は自己署名証明書のため、ルート証明機関にも登録する必要があります)

サイドローディングされるアプリケーションで、Windows Runtime に存在しないAPIを利用する

ポータブルクラスライブラリでインターフェースを宣言し、それを実装する通常のクラスライブラリを作成してMEFでロードすればいけます。これを使うとLOBアプリケーションで SQL Server 等のRDBMSを利用する事も普通にできます。

 

参考情報

1. sideloading product activation key + Windows 8 : MSDN Forum

その他 MSDN や TechNet 見ろ

まとめ

個人事業主としてサイドローディングされるLOBアプリケーションの受注開発、ないしは開発プロジェクトに対しての技術支援等行っておりますので、ご相談ください。

Metro Style Application 開発の為の Visual Studio Project Template(1)


Visual Studio 2012 RC には Metro Style Application のためのプロジェクトテンプレートが幾つか含まれています。

これらのプロジェクトテンプレートからプロジェクトを起こしてみての解説を2回ぐらい書きましたが、今回はこのプロジェクトテンプレートの実体がどのように定義されているか、その内容を確認するとともに今後の開発で使うプロジェクトテンプレートの準備などに焦点を当ててみたいと思います。

標準のプロジェクトテンプレートのインストール場所

Visual Studio 2010 RC においてプロジェクトテンプレートの標準のインストールパスは以下の通りです。(Windows 8 RP x64にインストールした場合)

C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ProjectTemplates\CSharp\Windows Metro style

このフォルダを開くと1041フォルダ配下に実際のプロジェクトテンプレート毎にフォルダがあり、プロジェクトテンプレートの実体が格納されています。

imageimage

このファイル群をベースに、プロジェクトテンプレートを修正してもいいですし、プロジェクトテンプレートを新規に作成してもいいでしょう。

Visual Studio SDK によるプロジェクトテンプレートの作成

プロジェクトテンプレートを作成するには簡単な方法としてはある程度作りこんだプロジェクトを元に Visual Studio から [ファイル]-[テンプレートのエクスポート]があるのですが。根がマゾいので簡単な方法は使わずにプロジェクトテンプレートを一から作成する事にしましょう。

この作業を行うには Visual Studio SDK が必要になります。

Download: Visual Studio 2012 RC SDK – Microsoft Download Center – Download Details

をインストールしてください。インストールを完了すると Visual Studio からプロジェクトの作成時に機能拡張配下からプロジェクトテンプレートが作成できるようになります。

image

今回はMetro Style Application の為のクラスライブラリを単体テストプロジェクトと共に生成し、ビルドのカスタマイズ等も(比較的)簡単にできるようビルドのカスタマイズプロジェクトも設定するという形でちょっと規模の大きいプロジェクトテンプレートを作成してみます。

Metro Style Application の為のプロジェクト要件の確認

ここで既存のプロジェクトテンプレートの内容を確認しましょう。プロジェクトテンプレートの中核を担うのは vstemplate という拡張子がついたファイルで、このファイルをもとに関連ファイルが取り込まれてプロジェクトが生成されますので Metro Style Application としての基本的な設定事項を把握しなければ話が始まりませんが、歴代の vstemplate はその詳細まで解説された事は殆ど皆無じゃないかな程度に情報量が少ないので、自分達の手元にあるVSにインストールされた vstemplateを見るのを最初にするのをおすすめです。

標準のプロジェクトテンプレートの ClassLibrary の vstemplate の内容とプロジェクトテンプレートを作成する場合の vstemplate には以下の要素に違いがある事がわかります。

<TemplateGroupID>WinRT-Managed</TemplateGroupID>
<RequiredFrameworkVersion>4.5</RequiredFrameworkVersion>
<TargetPlatformName>Windows</TargetPlatformName>
<RequiredPlatformVersion>8</RequiredPlatformVersion>
<CreateInPlace>true</CreateInPlace>

実際には当然に TemplateID などは違うのですが、そりゃテンプレートが違えばちがうわなで今回はスルーします。

TargetPlatformName や RequiredPlatformVersion 等が明らかに増えていますので、これを持つ vstemplate を作ります。

Metro Style Application の為の csproj 設定

いやー増えてますねー、Any CPU, x86, x64, ARM それぞれに Debug/Release でビルドするので当然ですが。全部ビルドしようとかすると単純に時間は20~30%増しって計算にちょっとgkbr

さて、大きな変更がありますね、vs2010までの csproj では Microsoft.CSharp.targets を見ていた物が $(MSBuildExtensionsPath)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets を見ています。

XAMLのコンパイルタスクが必要なのはわかるのですが、このターゲットの解決に Visual Studio Version が入るってことは本気に Visual Studio インストールしないと(SDKだけだと)ビルドもできないのかも。ビルドサーバを用意する上でこれはちょっと難点ですね。最低限のExpressでも入れとけばビルドできるといえばそうなのかもしれませんけど。(ビルドしかできないかもしれませんけどね)

細かい詳細は基本的には丸コピー以外の選択肢は殆ど無い気がします、各 Configuration 毎に最低限のビルドオプションを設定したうえでソースはCompile ItemGroupにというのが基本的なクラスライブラリプロジェクトの構造です。

次の段階として、関連するテストを収容するための単体テスト用プロジェクトもこのテンプレートに取り込むのですが、順番にやるのが良いでしょう、ここで一旦 (1) として区切りをつけようと思います。

(1) までのまとめ

とりあえず github に push しときました。

リポジトリはこちら https://github.com/kazuk/MetroAppBase

ここまでの内容のコミットはこちら https://github.com/kazuk/MetroAppBase/commit/28e89e2623d54991cf9bcb57ea69dc5d270f0a29

予習したい人の為に (2) で何をするかという事で MSDN ドキュメントの参照リンクなど

方法 : 複数プロジェクトのテンプレートを作成する

(2)ではMetroスタイルアプリケーションのテストプロジェクトについて調べた上で、このプロジェクトテンプレートに組み込む事でクラスライブラリを作成と同時に単体テストを活用した開発ができる様にしようと思います。

まとめでは無いこと

MS的には Visual Studio 2012から TFS Express を使ってねとか色々あるみたいなんですが、少なくともこれまで経験から 「TFS は肌に馴染みませんでした。」(いいなーと思うところも無いわけではないけど、VSが落ちるとか落ちるとか落ちるとかで寧ろ足を引っ張られる印象の方が強く)というわけでVS2012での自分の開発環境での採用は無い感じです。

VS2012世代で自分の目論む開発環境ですが、基本的には git / github をソース管理のメインに据えてこれをビルドするビルドサーバは TeamCity か Jenkins か検討中、現状は VS2012のUltimateを90日試用期間で使ってますが(OSがCP/RP/RTMと行く流れで再インストールになりながらそれぞれ最大90日使えればまぁお得!)、最終的には Premium 辺りに落ち着くんじゃないかと思っています。

ソース管理の基本が TFS から git/github になる事で自分の開発環境整備(包丁を研ぐ段階)の物が表に出せるし出てしまうので晒しでやっていこうかなとか。git/github に出してる物は MIT ライセンスのつもり(どこに書くんだろう)なのでお好きにパクッテって頂戴。

githubでの pull request とか貰った事ないので、なんか楽しい変更があれば pull request も遠慮なく。

個人事業主になりまして昼間は他のお仕事しながら夜のお勉強タイム確保+お子ちゃま台風上陸という私事もありまして一日一時間も勉強に取れないので遅々として進まずの可能性もなきにしもですが今後うん十年仕事する上での準備なので着実に書いていければなーという感じです。

Metro アプリケーションテンプレートを読み解く 「新しいアプリケーション」プロジェクトテンプレート


続いて「新しいアプリケーション」のプロジェクトテンプレートを読み解いていきましょう。

image

プロジェクトテンプレートから作成した状態で以下の通りのアプリケーションが作られます。

image

Common 配下は前回の Grid アプリケーションと一緒の気がしますね、クラスライブラリとして共有してしまえば一つ育てれば全部育つという読みは正しい気がします。

DataModel ディレクトリ自体が消えてなくなっていますが BindableBase.cs はあるわけで、好きにモデル作れって事でなくGridテンプレートでの SampleDataSource.cs は実装サンプルとしては重要です。

App.xaml / App.xaml.cs も内容に変化は有りません。

BlankPage.xaml は当然に表示する物が無いのでえらくシンプルになっていて、BlankPage.xaml.cs はLayoutAwarePage の継承ではなくなっています。どうなんでしょう、此処をLayoutAwarePage の派生にしない理由が良く解りません。

xaml 定義をPage から Common のLayoutAwarePage にするには以下、xaml.cs 側のベースクラス変更も行えば普通に動きますので基本としてやっとく方が良いんじゃないでしょうか、DataContext が基本としてDefaultViewModelで見えて ObservableDictionary になっている方が何かとコードも共通化しやすいし。

<common:LayoutAwarePage
    x:Class="FirstPlainApplication1.BlankPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:FirstPlainApplication1"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:common="using:FirstPlainApplication1.Common"
    mc:Ignorable="d">

xmlns:common での記述内容はアプリケーションの名前空間の影響を受けますが、Commonをクラスライブラリにしてしまいそれを参照すれば固定される様になりますね。

実際プロジェクトへの項目の追加で基本ページを追加すると LayoutAwarePage の派生が作られます。

image

<common:LayoutAwarePage
    x:Name="pageRoot"
    x:Class="FirstPlainApplication1.BasicPage1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:FirstPlainApplication1"
    xmlns:common="using:FirstPlainApplication1.Common"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

Common をクラスライブラリとして切り離すのはここでちょっと待ったがかかりますね、項目テンプレートとか全部置き換えないといけませんので。まぁ、プロジェクトテンプレート全体を自作するつもりになればたいした話ではないのですが。その気になった人は以下のフォルダの zip を色々いじってみれば良いんじゃないかな。(デフォルトのインストールの場合)

C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\VSWinExpress\ProjectTemplates\CSharp\Windows Metro style\1041

image

プロジェクトテンプレートや項目テンプレートをいじるのが新規環境に対して道具を研ぎあげるという感じの自分なので自分はきっとやりますけどね。

んで、このテンプレートそのものでは LayoutAwarePage も BindableBase も使われていませんので Common をぶちっと削除する事ができます。最少のテンプレートを目指す人はそれも良いでしょう。

使われている要素が少ないのでちょっとした事を試すには良いですが、項目テンプレートで使われている何かをサポートする為の余計なファイルが多いので初心者が道に迷う可能性多々ありな気もしないでもないです。

Metro アプリケーションテンプレート Gridアプリケーションテンプレートを読み解く


というわけで、Metro 開発始めました。 Windows 8 Consumer Preview と Visual Studio 11 Express for Windows 8 を開発環境として利用してアプリケーションを開発する上で、テンプレートから Grid Application テンプレートで開発スタートしてみたので、このテンプレートの基本構成その他読み取った物をつらつらとメモがきしてみます。

プロジェクトのファイル構成

パッと見でCommon, DataModel に多少の C# ファイルがある事のトップに XAML ファイルがあり、XAMLに関連づいた C#ファイルがあります。

image

Common/BindableBase.cs

Common の BindableBase.cs が INotifyPropertyChanged 等データバインディングの為の基本実装をしているようです。INotifyPropertyChanged の実装コードのシグネチャとしては以下のような感じ

protected bool SetProperty<T>(
ref T storage,
T value,
[
CallerMemberName] String propertyName = null)

さっそくC#の新機能が使われていますね CallerMemberName 属性で SetProperty はプロパティ名を引きとっています。

ref T storage で指定されたフィールドに value で指定された値を突っ込み OnPropertyChanged でイベントを発火するというのが基本になってます。 object.Equals で比較して変化の無い場合にはフィールド更新およびイベントの発火をショートカットする様になっています。

object.Equals で比較しているので null チェックが行われてから obj1.Equals(obj2) と同義になりますね。

object Equals( object other ) ですので、object への暗黙変換が発生し、boxing が発生するなんて細かい事に気づいてチューニングする必要は殆どありません。この程度で影響があるとしたらプロパティの連鎖更新が大量に発生する酷いモデルをあなたが作っているという事です。

酷いモデルもあるはずって事でちょっと見てみたのですが、何かがオカシイです。

image

System.Runtime.dll の System.Type をILDASM で見た所、IsClass が無いですよね。

ドキュメントを見た限りでは IsClass は存在する事になっているのですが見当たりません。

IsClass が false であれば object への暗黙変換で boxing が発生するからそれを避けるとかいうコードを書きたくてもどうにもなりません。どうにもならないので次のソースを見る事にします。

Common/BooleanNegationConverter.cs

とりあえずbool値を反転するIValueConverterですねテンプレート内の何処かで使われてる気はしません(検索でヒットせず、コメントアウトしてビルド、実行で問題無し)、うざいと思う人は消しちゃって良いでしょう。ぶっちゃけてノイズだと思います。

Common/BooleanToVisibilityConverter.cs

同じく bool 値をVisibility に変換する IValueConverterで、同様にどこも使ってません。なぜ Common に共通定義してるのか解らない物なので邪魔ならば消してしまいましょう。

Common/LayoutAwarePage.cs

テンプレート内に定義されている各 XAML ページの基本クラスになっています。

いくつかイベントハンドラーが定義されています、GoHome は Frame.CanGoBack が true の間 Frame.GoBack を繰り返すという形で実装されています。

FrameはWindows.UI.Xaml.Controls.Frameで、Metro UI Framework において進む、戻るの一連のUIの進行状況を管理する仕組みを構成しています。(しかし、MSDNのメニューシステム、なんとかならんのでしょうか、日本語でMSDN使うと翻訳できてる部分しかメニューに出てこなくてメニューが全くつながらずで困ります)

このテンプレートでのナビゲーションはこのFrameに一任されていますので正しくFrameを使う事という事が画面遷移に関しての必要事項でありテスト項目となりそうですね。

残念ながらFrameはINavigateを実装していますが、INavigate がカバーしているメソッドセットには CanGoBack や GoBack は含まれていませんのでFakeするのに多少困る面が残りそうです。

Common/RichTextCollumns.cs

Panelを派生したカスタムコントロールによって最終的な詳細ビューで使われるリッチテキスト表示を実装しています。これがここにある意味は「お前らこれぐらいのコントロール自分で書けよ、サンプルをテンプレートに入れてるんだから」って事でしょうね。

完全な表示用コントロールなのでサイズ計算ロジックの置き換えである MeasureOverride ArrangeOverride が主体で後は関連プロパティを実装しているだけですね。

サイズ計算ロジックとしては単純に LoadContent が返した内容をRichTextBlockOverflowとして見て OverflowContent があれば次のブロックを生成する事の繰り返しです。

この実装の中には仮定が含まれている事がコードの見た目で解ります。

まずRichTextBlockOverflow へのキャストです。キャストは戻り値の型が違えば失敗しますが LoadContent が帰した物をノーチェックでキャストしていますので、DataTemplate.LoadContentはRichTextBlockOverflow を返さなければなりません。

そこのところに防御的なアプローチは全く見えませんので全くの専用コントロールという事が見て取れます。

DataModel/SampleDataSource.cs

いわゆる ViewModel と Model のハイブリッドな物がここに実装されています。アプリケーションにする場合には何かしら意味のあるデータにする為にまず此処に手を入れる事になるでしょう。

Model に相当しているのは SampleDataSource クラスです、ここで他のクラスのインスタンスを単純にnew しまくってデータモデルを構成しています。何かしらのサーバないしはデータを持っている物を検索して new する様に変更すればアプリケーションは意味あるデータを表示する様になるでしょう。

SampleDataGroup と SampleDataItem が共通基底 SampleDataCommon から派生されていてそれぞれグループと要素を表現しています。

SampleDataGroup が ObservableCollection<SampleDataItem> を保持し、SampleDataItem はコンテンツとなる文字列を持っています。SampleDataCommon は共通となるタイトルやイメージを保持しているわけでそれほど面倒な構造ではありません。

SampleDataCommon が Common 配下で定義された BindableBase から派生されていますのでINotifyPropertyChanged でのプロパティ更新通知がサポートされます。

アプリケーションとしては完全な参照系なので SampleDataSource であるモデルには更新系が存在しません。サンプルとしてはいかがなものかとか言いませんよね、自分で考えやがれと突き放されただけです。

所でフォルダがDataModel で名前空間がData って気持ち悪くねぇ?気持ち悪い人はテンプレートを直しやがれが例題なのでしょうか?

App.xaml と App.xaml.cs

xaml 側は Common/StandardStyles.xaml をResourceDictionaryとして取り込んでいるほかAppName としてアプリケーション名をリソース定義しているだけです。アプリケーション固有のリソース定義したければここで好きにしやがれって事でしょう。

App.xaml.cs がアプリケーションの開始処理としての非常に重要な事を実装しています。

「コードビハインドにコードを書いたら負けだと思っている」な自分としては非常に気になるわけですが、実装内容としては OnLaunched でモデルからのデータローディング(PreviousExecutionState が Terminated であれば Suspendからの復帰も)と rootFrameの生成と初期Navigate、 OnSuspending でのアプリケーション状態の保存なわけで絶対にアプリケーション固有な領域なので致し方ないかなな気持ちもあります。

他の xaml と xaml.cs

基本的な表示等はすべて xaml側での記述になっておりxaml.csでデータをコネコネは基本しない構造になっています。xaml.cs での記述内容は OnNavigateTo で画面遷移してきた時にDataContextに結び付けられている DefaultViewModel にデータを突っ込んでいる事と Click での FrameへのNavigate 発行だけです。

思いつく例題とか

  1. Common 名前空間に含まれる実装をクラスライブラリに切り出ししなさい。

    特にBindableBase はこの先あなたのお供として延々育てていくべきコードになるでしょう。これをあなたが育て続けられる環境に移すか他のMVVMインフラを導入するかの選択時期は早々に訪れるはずです。どっちにしても作ったアプリケーション毎に微妙に異なる Commonを延々メンテナンスするのが嫌ならCommonの実装が共有できるようになっていなければなりません。
  2. SampleDataSource.cs に相当するソースを自動生成するテキストテンプレートを記述しなさい。

    1をやると意味が出ますが各種データモデルの細かい修正でプロパティの所の記述をチマチマ SetProperty 呼び出しするとか書いてると疲れますのでもっと軽い仕組みにしましょう。

    Office XML を解釈してExcel 方眼紙からデータモデルの実装が自動で起こせるとかすると Excel でプログラムが書けます(やめましょう)し、テキストテンプレートでSQL Server のスキーマを参照すればDBテーブルを射影するのに必要なデータモデルが生成できる事になります。

  3. Suspending / Lounching をちゃんとして、Suspendされて終了された時に元の場所に戻る様にしようよ。