クラウディアタイマー2 part3 デスクトップ版公開

クラウディアタイマー2を色々と更新しました。

http://david9142.cloudapp.net/CT/

  • Webフォントを「あんず」に変更
  • ダウンロードするJSON形式のクラウディアを最適化して通信量を約25%削減
  • デスクトップ版を公開

最近「クラウディアタイマー」でググると検索結果に表示されるようになりました。再公開して1ヶ月近くになると思いますが、何で今までクロールされなかったんだろう。今回の更新内容を解説します。

Webフォントを「あんず」に変更

これまでデコもじの「ゆる字フォント」を使用していまいした、手書き風文字で気に入っていたのですが無償利用のためにはページ下部にロゴが表示されます。

image

これがデスクトップ版の作成時にネックになってしまうので、ロゴを表示しないフリーのフォントを探していました。フリーのWebフォントサービスはどこもロゴなりブログパーツのようなものを表示させなければならず(当たり前と言えば当たり前なんですが)、通常のフォントをサーバー上にアップロードしてWebフォントとして使用させることにしました。手書き風フォントってかなりたくさんありますが、どれも2MB級なんですよね…フルブラウザ版だと10MB超えJSONのダウンロードを要求するサイトなので、更にフォント2MBもダウンロードさせるわけにはいきません。

サイズの小さい手描き風フォントとして見つけたのは「あんずもじ始」です。漢字を小学校で習う約1000文字に限定してサイズを抑えている(900KB)ようです。以下のサイトで公開されています。

あんずいろapricot×color

http://www8.plala.or.jp/p_dolce/index.html

ただでさえMB級のJSON形式データを転送しているWebロールの負荷を減らそうと思い、フォントはBlobストレージに置きました。するとChromeではちゃんと表示されるのに、IE9ではフォントが表示されません。「F12開発者ツール」で調べてみると、コンソールに

「CSS3117: @font-face が cross-origin 要求に失敗しました。リソースアクセスが制限されています」と表示されていました。

image

詳しくは調べてはいませんが、異なるドメインでのリソースのアクセスがIE9では制限されているようです。Webロールは「*.cloudapp.net」、Blobストレージは「*.blob.core.windows.net」なので、ことなるドメインと判断されるようです、まぁ…ドメインが違うことは違うんですが、こちらとしては同じAzureのサービスとして使っているのですが…FireFoxやChromeではこのような制限がないようです。IEもインターネットオプションから設定を変更可能ですが、変更を強制するわけにいかないので、IE用のフォントファイルをWebロールに置くことにしました。CSSやJavaScriptは問題ないのに、なんでフォントだけ?とは思いますが、詳しく調べていません。

このようにフォントは表示されます、配布サイトと印象が異なるのはフォントサイズが違うからでしょうか。

image

image

JSONデータを約25%削減

このアプリ最大のネックをやや改善しました。フルブラウザ版では約13.5MB、モバイルブラウザ版でも4.4MBのJSON形式のクラウディアをダウンロードする必要がありました。(「JSON形式のクラウディア」という表現につっこまないでください)今回、約20~30%データ量を削減しました。

改善前 改善後 削減率
フルブラウザ版 13.5MB 10.1MB 25%
モバイルブラウザ版 4.4MB 3.0MB 31%

 

一応、削減したことを証明する画像を貼っておきます。

フルブラウザ版

image

モバイルブラウザ版

image

データの削減に当たっては、まず画像を小さくしました。フルブラウザ版は1376×768でも縦スクロールが表示されないように、モバイルブラウザ版はデスクトップ版と共通の大きさにしました。あとは、canvasに長方形を描画する際に「X軸、Y軸、縦幅、横幅、色情報」の5つのプロパティを持ったJSON化するオブジェクトを作成していましたが、縦幅を1に固定してデータを作成することで描画する長方形の数が増えました(約31000個)が、プロパティが1つ減ったことでJSONデータを小さくすることができました。

デスクトップ版を公開

デスクトップアプリ(Windows Form)用クラウディアタイマーを公開しました。これまでのクラウディアタイマーを踏襲したものになっています。Blobストレージ上にOneClickInstaller用のインストーラーを配置しているので、「for Desktop」のリンクをクリックするとインストールが開始されます。

image

もちろん証明書は使っていないので警告が出ますが、インストールを実行してください。

image

アプリが起動するとデスクトップ左上にモバイルブラウザ用のページが表示されます。位置は動かせません。

image

秒数を入力すると、モバイルブラウザ版のサイズでカウントダウンが表示されます。

image

他のウィンドウよりも前面に表示されます。このようにPowerPointを全面表示しても、その前面に表示されます。

image

アイコンはあの画像を使わせていただきました。問題があればすぐに変更します。

image

技術的な話を少し、このアプリはWindowsFormにWebBrowserコントロールを貼り付けてモバイル版のWebページを表示しています。ウィンドウの枠を表示させないために、「FormBorderStyle」をnoneに、前面に表示させるために「TopMost」をtrueに設定しています。あと、記述しているソースはこれだけです。

[DllImport("urlmon.dll", CharSet = CharSet.Ansi)]

private static extern int UrlMkSetSessionOption(int dwOption, string str, int nLength, int dwReserved);

 

private void Form1_Load(object sender, EventArgs e)

{

    this.StartPosition = FormStartPosition.Manual;

    this.DesktopLocation = new Point(0, 0);

 

    const int URLMON_OPTION_USERAGENT = 0x10000001;

    string ua = "iPhone";

    UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, ua, ua.Length, 0);

 

    webBrowser1.Navigate(http://david9142.cloudapp.net/CT/);

}

画面左上に表示させるために、StartPositionプロパティをManualに設定して、DestopPositionを(0,0)のいちに設定しています。また、モバイル用のページを表示させるために、ブラウザのUser-Agent文字列を”iPhone”にしています。

ソースはこちらからダウンロード可能です。「ClaudiaTimer2_part3.zip」をダウンロードしてください。ソースのビルドにはVisual Studio 11 Beta Express for Web(たぶんVisual Web Developer 2010でも可)と、ASP.NET MVC4 Betaが必要です。

Windows Azure上にたった3時間でサービスを公開してみた

Windows Developer Daysの2日目の基調講演で公開された映像、「Through the Window」は約1分半しかありません。いわゆる「Shortバージョン」と呼ばれる長さです。おそらく作成されてはいないのでしょうが、フルバージョンを見たいという思いがありました。自分と同じようにフルバージョンの動画を見たいと思っている人はいるはずなので、その人たちのコメントを集めるサイトを作ってみました。

http://david9142.cloudapp.net/TTW/

image

実はこのサイトを作ろうと計画していたわけではなく、5/1の朝Twitterでリツイートされた @metamon30 さんのツイートをみてほぼ衝動的に作りました。ところどころハマりましたが、ほぼ3時間でサイトを公開することができたので、「Windows Azureならたった3時間でサイトを公開できる」みたいな感じで記録を残しておきます。

前提

まったくのゼロからサイトの作成を始めたわけではなく、クラウド(Windows Azure)上のサブスクリプションとローカルの開発環境は整備済みでした。具体的には以下の環境は事前に構築済みです。

  • Windows Azure上にホステッドサービス・ストレージサービスが作成済みで、いつでもアプリケーションがデプロイ可能な状態になっている
  • Visual Studio 2010 (Visual Web Developer 2010)とWindows Azure SDKがインストール済み

プロジェクトの新規作成

Visual Web Developerで新規プロジェクトを作成します。テンプレートは「Windows Azureプロジェクト」、ロールは「ASP.NET MVC4」を選択し、MVC4のインターネットアプリケーションテンプレートを使用しました。

モデルの作成

コメントを登録する機能を実装していきます。EntiryFrameworkのCodeFirst機能を使用する予定なので、コメント用のも出るクラスを作成します。本当に単純なクラスです。

    public class CommentModels

    {

        public int ID { get; set; }

 

        public string Name { get; set; }

 

        public string Comment { get; set; }

    }

コントローラー、ビューの作成(スキャフォールディング)

スキャフォールディング+EntityFramework(CodeFirst)の機能を利用して一気にControllerクラス、Viewを作成します。Controllersの追加から、以下のように指定して一気に自動生成させます。

image

実はここで少しハマりました。コントローラーを作成すると「オブジェクト参照がオブジェクト インスタンスに設定されていません。」と表示され、エラーになってしまいました。NugetでEntityFrameworkをアップデートしたら発生しなくなりました、なぜかはよくわかっていません。

これでコメントを登録・削除・編集する機能が一気に自動生成されました。単純なCRUD操作をするだけならあっという間に完成してしまうので、本当にスキャフォールディングの機能は便利です。

ビューの修正

ビュー(*.cshtml)を修正します。コメント機能に関して、以下の変更を行なっています。

  • トップページ(/Home/Index)から、コメント一覧画面(/Comment/Index)へのリンクを追加
  • コメント一覧画面からコメントを編集・削除するためのリンクを削除
  • コメント一覧画面に現在のコメント件数を表示

コメントは一覧・登録機能だけを提供することにしました。トップページのデザインを作成するのと、コメント一覧へのリンクをつけています。ASP.NET MVC4のインターネットアプリケーションテンプレートをそのまま利用しているので、分かる人には「あぁ、MVC4つかってるんだな」とバレてしまうと思います。

これでアプリケーションは完成です(笑) F5キーからAzureエミュレータを起動し、Webブラウザからコメントを登録すると、ローカルのSQL Server Expressにデータベース・テーブルが自動的に作成され、データが登録されます。CodeFirst機能の素晴らしいところはRDBMSのスキーマを意識せず、コードに集中できる点ですね。モデルの定義以外は自動生成コードしか使用していないので、動作確認もあっさり終了です。

SQL Azureサーバーの作成

ローカルにあるSQL Server Expressで動作確認を行ってきましたが、アプリケーションはWindows Azure上にデプロイするのでデータベースもクラウド(Windows Azure上)に用意する必要があります。SQL Azureサーバーの作成はウィザードに従えば一瞬です。他のWindows Azureサービスからアクセスできるようにファイヤーウォールを構成します。ファイヤーウォール設定の適用に約5分かかるところは注意点です。Web.configの接続文字列を変更しつつ待ちます。

image

Windows Azure上へのデプロイ

もう最後のプロセスです、ここまでの経過時間は約2時間です。アプリケーションをWindows Azureへデプロイします、自分はVisual Web Developerからパッケージを作成し、Windows Azure管理ポータルから「新規運用環境へのデプロイ」で行う派です。デプロイ実行後、Twitterで「デプローーーイ!!」とつぶやきます。(ここ重要)デプロイ完了後wktkしてページを確認すると、文字化けが...しかも、_Layout.cshtmlとHome/Index.cshtmlのみ文字化けしているようです。@normalianさんからアドバイスを頂いて文字コードを確認してみると、なぜかこの2つのファイルのみsjisになっていました。なぜかは分かりませんが。

テキストエディターを使って文字コードをutf-8に変更し、再デプロイします。次はコメント登録時に名前は登録されるのに、コメントの内容が登録されない現象が...コメント入力テキストボックスの長さを変更した時に、<input>のname属性を変更していました...name属性を自動生成値のまま、テキストボックスの長さを変更するように変更して、再々デプロイします。ここまでの経過時間は約2時間半です。

完成

サイト完成です!ここまでの経過時間は約3時間です。そのうちデプロイ後の修正・再デプロイを2回行なっているので、2時間半でのサイト構築も可能だと思います。WindowsAzureはもちろんですが、ASP.NET MVC4, EntityFrameworkの恩恵に預かる部分も大きいと思います。

このサイトのソースはこちらで公開しています、「TTWAzure.zip」をダウンロードしてください。ソリューションを開くにはVisual Web Developer 2010, ASP.NET MVC4 Beta, Windows Azure SDKが必要です。

.NETラボ4月勉強会に参加しました

.NETラボ4月勉強会でVisual Studio11 Express Editionsについてお話させていただきました。

製品版Visual Studioが進化しているのと同様に、Express EditionのVisual Studioも大きく進化しています。 個人的には「TFS Express」と「for Web」の超進化に注目しています。今まで提供されなかったTFS Expressが提供され 、しかも一通りの機能がそろった状態です。TFSを使い始める人にとって不足の機能はないと思います。小規模な開発チームであればTFSExpressでいいのではないかと思わせてしまいます。

MetroStyleAppでHTML+JavaScriptが開発言語として採用されたこともあってか、Visual Studio Express for Web (以前のVisual Web Developer)が大きく進化しています。言語が違うので単純な比較はできませんが、C#やVBと同じ感覚でインテリセンスが効き、非常に気持ちよくプログラムを書くことができます。この部分は言葉では表現しにくい部分なので、VWD2010を使用していて、HTML,JavaScriptが書きにくいと感じる人はぜひ使って欲しいと思います。

TFSExpressが提供されたこともあり、クライアントのExpress EditionからTFSExpressにアクセスし、チェックイン・作業項目管理・自動ビルドの設定を行うことができます。恐らく、製品版のTFSにも接続することができると思います。Windoew PhoneやMetroアプリケーションを作成するチームは、他のパッケージアプリケーションに比べて小規模となることが多いと思います。また、個人のホビープログラマーが開発することもあり、マーケット公開前にマイクロソフトによる審査が行われるため、Express Editionが「プログラミング・ビルド・配布するツール」から「小規模チーム/個人でも審査を通るアプリケーションを作成できるツール」 に変わった気がします。TFS、単体テスト機能がExpress Editionに提供されたことは、象徴的なことだと思います。

これまでもGit,Subversion/NUnit,XUnit などで代用することができましたが、IDEからこれらの機能が利用可能になったことが非常に大きな変化だと思います。今後、アプリケーションはWebなどを通じて個人の任意のタイミングで公開することができなくなり、マイクロソフトの審査を通すことで開発者の中での完成とマーケットでの公開にタイムラグが発生します。審査中でも新機能を追加するための開発を継続することもあるでしょうし、審査でNGが出て修正を行わなければならないケースが発生します。そのため、これまで以上にソースのバージョン管理と、どのバージョンにどんな変更を加えなければならないのか(作業項目管理)が重要になってきます。また、審査を通るためには開発者でもきちんとしたテストを事前に行っておく必要があると思います。Express Editionで作成したアプリケーションでも審査を通ることができるようにツールを進化させたのだと思います。

推測ですが、マイクロソフトのメッセージとしては

「Express Editionを大幅に進化してやったから、ちゃんと審査に通るアプリを作れよ」ということでしょうか。

ということでしょうか。