2014年11月22日土曜日

PICT8 Preview 3 ベータテストのご案内

( PICT8 は 2014年12月にリリースされました。Windows ストア からダウンロードできます。)

作成中の画像ビューア+PDF/Zipリーダ PICT8 について、アプリをインストールして試していただけるベータテストを実施中です。

Note - English description available at the bottom of this post.


PICT8 とは?

近日中にWindows ストアでの販売(売り切り・広告無し)を予定している、画像ビューア+PDF/Zipリーダ アプリです。
特徴は
・軽快な動作、アニメGIF表示可能
・片手持ちでPDF/Zipを読むためのCommander UI
・他のストアアプリでファイルを開く際にPICT8が使えるファイルピッカー機能

現在は初版に予定していた機能がほぼ入り、これからパフォーマンス調整・バグ潰しなどを行おう、という段階になっています。



何をテストするの?

基本一人作業を続けているため、自分だけだとどうしても気づかない所・甘くなっている所が多いです。
なので、お手隙で、このような画像ビューア、自炊本リーダアプリに興味がおありでしたらちょっと試してみて頂いて、ご意見を伺おう、という趣旨です。

また今回、不具合報告や提案等を投稿して頂ける 「UserVoice」 のサイトを用意しました。掲示板のような形式で、提案の投稿や、他の提案への投票が可能になっています。
何かありましたら、こちらに投稿して頂けると有難いです。

DDLG UserVoice
https://ddlg.uservoice.com/

https://ddlg.uservoice.com/

必要なもの


  • Windows 8.1 / 8.1 RT
  • Microsoft アカウント … 後述の開発者アカウント作成に必要です。
  • 開発者アカウント … 今回はストアを通さない配布のため、この「開発者アカウント」を作成して頂く必要があります。料金は掛かりません。アカウントを持っていない場合、インストール中にアカウント作成の案内が出ますのでそれに従ってください。
  • 何か気の付いた事があったらUserVoiceに投稿してくださる施しの心(任意です)

ダウンロード

http://1drv.ms/1yyRw2u

インストール方法

  1. パッケージのZipファイルをダウンロードします。
  2. Zipファイルをローカルフォルダにすべて展開します(Zipのままではダメです)。
  3. ファイル Add-AppDevPackage.ps1 を右クリックし、「PowerShell で実行」をクリックします。
  4. PowerShell が開きますので、以降画面の指示に従います。
Zipを全部展開して、
Add-AppDevPackage.ps1 を右クリックして、
「PowerShell で実行」をクリック

PICT8 の使い方

Help等はまだ出来ていません。説明なしで一発使ってみて、わからなかったらわからんとUserVoiceに投げるなりして頂けると助かります。


備考


  • 今回のVersionはアプリ内部で使用期限を12月1日までに設定しています。12月1日を越えると起動できません。
  • PICT8 は Microsoft Application Insights を使用しています。これはアプリケーションの使用状況を個人を特定できない形で収集し、アプリケーションの品質向上・改善のために利用するものです。今回はApplication Insights 標準のデータに加え、フォルダ・PDF・Zipを開く際のItem・Page数情報を収集しています。

---------

PICT8 Preview 3 Beta Test

What is 'PICT8' ?

PICT8 is Picture Viewer + PDF/Zip reader application.
Features:

  • First and fluid experience, Animated GIF support
  • New commander UI for one-handed reading.
  • File Picker Contract support - You can use PICT8 from any other Windows Store Apps as Preview-enabled File Picker.

Release date is not determined yet.

If you have suggestions...

You can post your suggestions to our UserVoice page. Your suggestions would be really appreciated.

DDLG UserVoice
https://ddlg.uservoice.com/

Prerequests


  • Windows 8.1 / 8.1 RT
  • Microsoft Account
  • Developer Account - This is required because this beta version is distributing at outside of Windows Store. But you can create it during installation, without fees.

Download

http://1drv.ms/1yyRw2u

Install procedure


  1. Extract downloaded .zip file to your local folder.
  2. Right-click the file 'Add-AppDevPackage.ps1' then click 'Open by PowerShell'.
  3. Follow the instructions.


Notes


  • This test period will ended at Dec 1, 2014.
  • PICT8 use Microsoft Application Insights service. This service collects usage of apps in a way that can not identify the individual user to improve this application.


2014年11月3日月曜日

MSCC に参戦しています

Microsoft Community Champion 、略称 MSCC に参加しています。

Microsoft Community Champion
https://microsoft-worldwide-community-champion-ja-jp.azurewebsites.net/Home

台湾Microsoft が主催するアプリケーション・サービスのコンテストで、台湾・マレーシア・日本、3つの国と地域で共催されます。
詳しい所は上のURLでわかるとして、一番大事なバックストーリーをTextに起こしますと、

戦いのはじまり

遥か昔に封印された闇の妖魔ネロ族が、復讐の欲望を満たすべく自らその封印を破り、
光の王国エスポワールに侵入した。

民衆の希望であった王国の姫ルミエールが、闇の魔王オスクリダの手により誘拐され、
混乱に乗じた略奪と侵略により荒廃し、闇に陥るエスポワール王国…

王国に光を取り戻すべく、ルミエール姫を救出するために勇者たちが立ち上がり、
強靱な Tech パワーで闇の妖魔ネロ族と、
すべての闇を支配する魔王オスクリダの討伐に向かう。

コンテスト参加者は勇者であり、強靱なTechパワーで魔王オスクリダを倒すのです。

私は「チームDDLG」で独り参戦しています。
闇の妖魔ネロ族そして魔王オスクリダに立ち向かう得物は、今作っている途中の 画像ビュアー+PDF/Zipリーダー「PICT8」です。


このPICT8で!必ずや絶世の美女にして超可愛いくてアニメ声のルミエール姫を救い!お礼に姫様にチューとかして貰って!!エスポワール王国に光を!取り戻そうではないか!!!


参戦している様子(イメージ映像)

2014年10月27日月曜日

PICT8 最近の状況

( PICT8 は 2014年12月にリリースされました。Windows ストア からダウンロードできます。)

お盆に出来るかなといいつつまだ作業中という画像ビュアー+Zip/Pdf リーダー PICT8、最近はこんな感じになっています。



右隅の四角い奴はCommander、片手操作用のコントローラです。サイズ・位置・角度はドラッグやピンチイン・アウトで自由に変えられます。タブレット持って寝っ転がって読む用に作りましたが、マウスでもフローティングツールバー的に使えてそこそこ便利です。

11月頭の開発者の寄合い Devcussion #5 に持っていく予定です。
も少し動けばBetaTestもやってみたいのですが。うーn。





2014年10月1日水曜日

ストアアプリ開発の視点から見る Windows 10 の発表イベント

次期Windowsの名称が「Windows 10」であることが発表されました。
それに伴い、開発者向けのBlogに Windows 10に関するPostがあったのですが…

Universal Windows apps get better with Windows 10
http://blogs.windows.com/buildingapps/2014/09/30/universal-windows-apps-get-better-with-windows-10/

びっくりするほど情報が出ていない。
良く読むと「何も書いて無い」んですねこれ。

StoreがUnifiedになる、とは書いてあるのですが…具体的に何がどうなるのかという情報は全然載っていないです。
今年4月、Universal Windows App が発表になった時に「将来的にはWindowsとPhoneでストアを一緒にする」旨の話がありましたが、その時に言っていた事から一歩も出ていないと言っていいと思います。
Win/Phone以外、Xbox Oneや他のPlatformとの統合についても何も言っていません。

一つだけ「新しい」、今まで言って無いと思えるのは

・企業ユーザー向けに、社内用のStoreを作成できるようになったこと:
今のLOB…Line of business 向けのStoreAppの配布スキーマは正直あまり出来の宜しいものでは無いので、企業内ローカルStoreの形で配布・アップデートができるのは大きな進歩だと思います。企業ユースの内製StoreAppのようなソリューションが組みやすくなります。

その他、何か新しいAPI使えるようになるの?機能は?配布は?等、StoreApp開発から見て知りたい事は今回の発表では一切無しと・・・

つまり、開発者向けへのメッセージを汲み取るならば、

「来年4月の開発者イベント //buildまで待っててね!」

であると。待ちましょう。

あ、後、10月1日からTechnical Preview が配布になりますが、こちらは


  • 搭載してるWindows Storeは8.1のもの
  • みんな大好きWACKが動作しない
  • だからメインの開発マシンに入れちゃダメダヨ(当たり前)

という話も上掲の開発者向けPostに出ているのでご注意下さい。


・・・・・・・

余談
上はBlog Postに基づいた話ですが、
ここからは私の予想&妄想です。怪しげですよ!

新しいAPIセットを開発者イベント…PDCやWinHEC、最近だと//build…で発表してから実際にそれが使える製品が出るまではある程度のバッファとなる日数があります。
発表時点ではまだ製品は完成していませんし、完成までの間にISV…ソフト屋さんはBeta版の製品を使い、新技術を学習して自社製品で使えるかどうかの評価を行い、いけるならば実装する、期間が必要な訳です。

最近のApp開発絡みのイベントで考えると

Win 8.1 build2013 6月  ... Win8.1RTM 10月
Win 8  build2011 2011年4月 ... DP 2011年9月 ...  CP 2012年2月 ... RP 2012年6月 ... RTM 2012年10月

と、Win8のStoreAppの様な丸ごと新技術の場合は1年以上のバッファ
Win8.1 のようなAPIの追加・Updateは半年程度のバッファ

的な感じになります。ISV側のリリーススケジュール的にもこのあたりが妥当なのでしょう。

で、今回のWin 10の場合… build2015 4月 ... Win10RTM は判りませんが…ホリデーシーズン狙いでしょうから、そうするとRTMは10月Limit辺りでしょう。

つまり…今回のWin10だと、スケジュール的にはそーーんなに大改造、超技術を大発表!!!みたいな面白い事は出来ないだろうと想像できます。
Win8.1の時のような漸進的な進化になるのではないかな、と予想しています。
(ぐだぐだ書かなくても、そりゃそうだろよという話ではありますが)


2014年9月28日日曜日

ごみ出しカレンダー を公開しました


ごみ出しカレンダー
Windows 8.1 / Windows Phone 8.1 で動作します

ストアアプリ 「ごみ出しカレンダー」を公開しました。
 Windows 8.1 / Windows Phone 8.1 でお使い頂ける Universal Windows App になっています。無料です。

Windows ストア からダウンロード
Windows Phone ストアからダウンロード

ごみ出しカレンダー で できる事


  • ごみ出し専用のカレンダー アプリです。
  • アプリ上で入力した曜日毎のごみ分別情報を、スタート画面上のタイルに表示します。
  • 同じMicrosoft アカウント を使用しているWindows / Windows Phone 上で同じごみ出しデータを共有します。例えば、Desktop・TabletでWin8.1、スマホはWindows Phone 8.1を使っているハワイ在住のAさんの場合、どれか一つでごみ出しデータを更新すると、数分~数十分で他のSystem でも同じデータが表示されるようになります。

スタート画面上のタイル表示


…今回のアプリ、技術的にやっていることは気絶するほど単純ですし、また機能的にも…OS標準のカレンダーで別にいいんじゃん?と言われると全くその通りです。

(OS標準カレンダーの貴重なスペースを、Weeklyなゴミ出し予定で埋めたくないという所はあり、そこは便利とは思うのですが)

では何で作ったかというと、Windows / Windows Phone で多くのCodeを共有できるUniversal Windows App の作成を頭からお尻まで通して行っておきたい、という学習目的です。
futa8 も、今作っているPICT8 も、Code baseはそこそこ大きいサイズなので…気軽に色々ひょいと試せる感じでは無くなっており、Universal App化のようなChallengeを気軽に試せるものを作っておきたかったというのも大きいです。

...

実際、実アプリとして書いてみることで収穫は多かったです。

正直な所、Universal Appっつっても同じBinary動く訳では無いし…と若干引いて見ている所が僕にはあったのですが、実際やってみると所謂Data Source側では気を付けて書く事でかなりそのままいけるなぁと。

UIはそのままとは行かないのですが、WinRT のUI コンポーネントの互換性はかなり高いので、例えばメイン画面の月別カレンダー作るところ等はサイズを変えている以外、Code BehindもXAMLも全く同じCodeになっています。編集ページもサイズ変更だけでほぼそのままです。

逆に、共用できないXAML部分をなるべくコピペで済ませるために、サイズ部分をなるべくStyleで外に出しておく的な(ダメな?当たり前?)知識も身につきました。

反面、Template Defaultでの各Pageの遷移、Instance化ではWinとWPでは違うところも多く、うお何これ!?という所も多かったです。

手を動かすと経験値上がるな!という当たり前の話を噛み締めているところです。



StoreApp で位置情報を扱う

この項では、
  1. 位置情報を取得する
  2. 位置情報を住所の文字列に変換する
方法について書きます。

1. 位置情報の取得


現在の位置情報を取得


Namespace Windows.Devices.Geolocation にあるGeolocator Class を使います。

 

// Appの初期化の辺りで一発Geolocatorを作成しておき、
this.geolocator = new Geolocator();
...
// 位置情報が必要な時にGetGeopositionAsyncを呼ぶ。
var pos = await this.geolocator.GetGeopositionAsync();

ここで要注意なのは、
  1. 位置情報を取得するアプリは、AppxManifest.xml内で位置情報の使用を宣言する必要があること
  2. 起動後初回の使用では「位置情報の取得」の確認メッセージが出ること
  3. GetGeopositionAsync では緯度経度のみが取得でき、住所データは取得出来ない事(今のところ)
1. については、VSのManifest Designerでチェックを入れるだけです。又、ストア上にはこのアプリが位置情報を使用する旨が表示されます。

2. これはAPIをCallしたところ(上の例だとGetGeopositionAsync)で問答無用に表示されます。
このため、なるべく、Userの操作の結果(ボタン押下のハンドラ等)…「○○をやろうとした結果」として呼ばれるところでAPIをCallすべきと思います。
Userの操作の無い所…初期化中等…でいきなりこれを出すのはあまり上品では無いように思います。そういうアプリたまに見ますが。

3. GetPositionAsync の返り値 として帰るGeoposition Classには以下二つのProperty…
  • CivicAddress
  • Coordinate
があり、前者には住所文字列、後者には緯度経度が入る、事になっています。
が、前者CivicAddressは、Address Provider、緯度経度を住所に変換するプロバイダがインストールされていない場合常に空文字列で返ります。
そして、現在のところAddress Providerは何処からも提供されていないです。

画像の位置情報を取得


JPEG画像にEXIF データとして位置情報が埋め込まれている場合があります。
これは大変に簡単で、画像ファイルのStorageFileからImagePropertiesを取得します。もし緯度経度データが存在すれば、ImageProperties.LatitudeとLongitudeにデータが詰まっています。

※ 画像が「ファイル」である場合…Storage上のFileにはこれでいけるのですが…例えば、一度OpenFileAsyncしてStreamに全部ガーっと呼んだメモリ上のデータや、Httpか何かでがーっとDLしてまだファイルに落として無いデータ、に対して使用することは出来ないです。困った。


2. 位置情報を住所文字列に変換する


上で触れたようにWinRT組み込みのGeolocator Classだけでは不可能で、Bing.Maps APIを使う事になります。
緯度経度をAPI経由でBingに投げると、住所に変換して返してくれるという感じです。

Bing APIの使用には
  • アカウント登録とAPI Keyの作成
  • Bing Maps SDKのインストールと参照の追加
が必要になります。方法はMSのサイトでも見て頂ければいいのですが、無料の場合、
  • キーは3つまで
  • 50,000 Transaction/Day
となっています。間違えていると怖いのでご自分でご確認下さい。

※ Bing Maps API は Architecture毎のNative BinaryとしてBuildされています。このため、このAPIを「使う」Moduleは(.NETで書いたC#であっても)「Any CPU」としてBuildすることが出来なくなります。

Bing Maps API を使用した住所の取得


ここまで行くとソース見たほうが早いべ、という事でソースを貼って終わります。
注意点としては、LocationData は複数返ってくるので、中の属性を見て必要なものだけ拾う、という所です。

※ 以下の例は、アプリ「ごみ出しカレンダー」で使っているCodeです。
ごみ種別の入力画面でアプリバー上の「検索」ボタンを押すと、PCの現在地を使ってごみ収集ページを検索してあげる、という機能です。(自治体ごとに千差万別のごみ出しページをスクレイピングとかやってられないので、そこから先は手動です)

ごみ出しカレンダー
http://apps.microsoft.com/windows/app/c3cdaa23-5b99-4b28-803f-00b90c86a601


 
private async void GetAddressAppBarButton_Click(object sender, RoutedEventArgs e)
        {
             //「PCの位置情報から自治体のごみ出しページを検索してあげる」

            var loader = new Windows.ApplicationModel.Resources.ResourceLoader();

            var pos = await this.geolocator.GetGeopositionAsync();
            
            Bing.Maps.Search.ReverseGeocodeRequestOptions requestOptions =
                new Bing.Maps.Search.ReverseGeocodeRequestOptions(new Location(pos.Coordinate.Point.Position.Latitude, pos.Coordinate.Point.Position.Longitude));

            var searchManager = this.bingMaps.SearchManager;
            var response = await searchManager.ReverseGeocodeAsync(requestOptions);

            string query = "";
            Bing.Maps.Search.GeocodeAddress addr = null;

            if (null != response && 0 < response.LocationData.Count)
            {
                for (int i = 0; i < response.LocationData.Count; i++)
                {
                    /// 住所表示に使うLocationDataを探すCode
                    /// Bing.Mapsでは、Responseに複数のLocationDataが詰まって返ってくることがある。(普通は一個だが、たまに二つ)
                    /// 一つは地図上での住所表示用データ ... GeocodeLocationUsageType 'Display'
                    /// もう一つはナビ用の道路情報。 ... GeocodeLocationUsageType 'Route' または 'Both'.
                    /// 後者については住所の文字列が入っていないので、今回は必要が無いデータとなる。それを弾いて住所表示用だけをPickする。
                    /// (後者は大体Nameに「MajorRoad」とかが入ってる)

                    if (null != response.LocationData[i].GeocodeLocations && 0 < response.LocationData[i].GeocodeLocations.Count)
                    {
                        if (Bing.Maps.Search.GeocodeLocationUsageType.Display == response.LocationData[i].GeocodeLocations[0].UsageType)
                        {
                            /// 'Display'が複数ある場合は… 知らないし 最初の一つだけPickする
                            addr = response.LocationData[i].Address;
                            break;
                        }
                    }
                }

                if( null != addr )
                {
                    /// StrWebQuery ... "ごみ+収集日+"
                    /// AdminDistrict ... "神奈川県" 大体県まで
                    /// AdminDistrict2 ... データ見たこと無いのだけど 郡とか?
                    /// Locality ... "川崎市高津区" 大体市+区まで
                    /// AddressLine ... "foo町bar丁目1-2-3" 最後のアドレス ごみ収集日検索では却って結果出なくなるので使わない
                    
                    query = loader.GetString("StrWebQuery"); 
                    if( 0 < addr.AdminDistrict.Count() ) query += (addr.AdminDistrict + "+");
                    if( 0 < addr.AdminDistrict2.Count() ) query += (addr.AdminDistrict2 + "+");
                    if( 0 < addr.Locality.Count() ) query += (addr.Locality );
                }

                // URL形式にエンコ %1234...みたいなやつ
                query = System.Net.WebUtility.UrlEncode(query);

                // ブラウザ起動
                await Windows.System.Launcher.LaunchUriAsync(new Uri( "http://www.google.com/search?q=" + query));
            }
            else
            {
                // 何もすることが無い
                // Errormsgも出さなくていいかなと
            }
        }
    }








2014年8月26日火曜日

PICT8

( PICT8 は 2014年12月にリリースされました。Windows ストア からダウンロードできます。)

PICT8 とは


軽快な動作の画像ファイル閲覧と、Zip/Pdf 見開き表示が出来る画像ビュアーです。
Windows ストアでの販売(売り切り、広告無し)を予定しています。
※開発中

軽快な画像ファイル閲覧

素早い画像サムネイル表示と、左右スワイプでの画像切り替え。
先読みキャッシュと多段階デコードで軽快な画像ブラウズを行うことができます。
アニメーションGIFを表示できます。
既定ではピクチャ ライブラリが閲覧可能で、適宜任意(ローカル フォルダ、OneDrive、ネットワークドライブ、ホームネットワーク…)のフォルダを追加できます。

片手での操作を追究したブックモード

「片手フリーな状態で本を読みたい」これはPICT8 開発の最大の理由でもあります。
手の大きさ・タブレットのサイズにも寄る所は大きいのですが、片手でタブを掴んだまま指一本で操作するためのCommander UI を搭載しています。

Commander UI とは?

ページ送り・戻し、注目点移動/スクロール、次の本・前の本へ移動…を小さくまとめたものです。
タブレットを片手で掴んだ状態で、親指・人差し指等で操作が可能です。
Commander UIは画面の何処にでも置くことができ、またサイズ・角度も変更できます。

またマウス操作でも、操作の範囲が小面積で収まるCommander UIはフローティングツールバーのように便利にお使い頂けます。

ブックモードは、Zip・PDF・フォルダ に対応しています。
既定ではタブレット横位置で両開き、縦位置で1P表示です。

他のストアアプリからも使えます

Windows 8/8.1のストアアプリで画像を開く場合、普通はOS標準のファイル ピッカーを使うのですが…

・ファイル名が表示されない場合がある
・画像サイズ・撮影日等がわからない場合がある
・サムネイルが小さすぎて何が映ってるのかわからない

等、不満の多い所です。
PICT8 をインストールすると、画像を開くすべてのストア アプリで、PICT8 のUIを使って画像を選択することが出来るようになります。

・ファイル名表示
・撮影日・カメラメーカー・画像の縦横サイズ・ファイルサイズ等のプロパティ表示
・画像に位置情報が含まれる場合、住所に変換して表示
・画像のプレビュー・拡大表示

等、OS標準のファイルピッカーには無い多くの機能を全てのストアアプリで使うことができます。

PICT8 の弱点

いわゆる画像ビュアー、コミックビュアーとは少し違うところがあります。

・「画像編集機能」はありません。

画像の回転、エフェクトのような機能は一つも持っていません。
PhotoShop Express のような専用ソフトがありますので、そちらをお使頂いたほうが便利です。
ですが、PhotoShop Express のようなストアアプリから画像を開く際には PICT8 を使う事ができます!

・「本棚」はありません。

コミックビューアー、漫画ビュアー的なアプリの多くは「本棚UI」を採用しています。
アプリからファイル ピッカー経由でフォルダを開き、ファイルを探して「登録」するとアプリ上の「本棚」に表示される、というタイプのものです。
PICT8では、その代わりにアプリ上でフォルダそのものを高速に表示しますので、そこから直接ファイルを開いて頂ければと考えています。
そのかわり、ZipやPDFのファイル本体に対してサムネイルを表示することができません。

・まだ完成していません…

上に挙げた機能は入っているのですが、Integration, 摺合せがまだまだでして…