読者です 読者をやめる 読者になる 読者になる

くうと徒然なるままに

超高校生級のXamariner です。

de:code 2017 にCognitive Hands On のスタッフとして参加してきました。

De:code とは、 日本Microsoftが主催している開発者向け大規模イベントで、 東京タワーの近くのホテルを借りて行われています。

今回、私は、 EXPO の中にある、 Cognitive Hands On のスタッフとして参加してきました。

スタッフについて

de:code の EXPO エリアに Azure のブースがあります。その中に、Cognitive Service についてのハンズオンのエリアがあります。そこでサポートスタッフみたいなことをしてました。

具体的には、 Cognitive Service のデモアプリを見てもらった後に、 ハンズオンをしてもらいました! みんな、Cognitive Service は聞いたことあるけど、実際に使ったことない方が多かった感じです。 おすすめな Cognitive Service を聞かれたときに、 LUIS をごり押ししましたw

セッション・キーノートの感想

キーノートの感想

キーノートは、全体的に 「AIはいいぞ」というメッセージを強く感じました。

たとえば、SQLServer 2017 に機械学習エンジンが搭載され、CT スキャンの画像からガンがあるかどうかを判定できたり、 機械学習エンジンの Chainner との協業 が発表されたりしてました。

また、 少し前までは、 Mobile First & Cloud First というメッセージを発信してましたが、 「intelligent Cloud &Intelligence Edge」に代わってる感じがしました。 モバイルデバイスだけでなく、 すべてのデバイスクラウドにつながるようになるんでしょうね。

セッションの感想

今年は、スタッフをやっていたということで、あまりセッション数は見ることができませんした。しかし、見たいものは大体見ることができました。 一応、見たセッションは以下のものになります。

Day 1

MW 04 「Xamarin 入門」コード共通化で開発スピードアップ!AIを活用したクロスプラットフォームアプリをXamarin で作ってみよう!

「AI を活用した」というところに惹かれて聴講しました。ちょまどさんのは、安定でわかりやすいですね。

Day2

D113 ダウンタイムを最小に! ~Azure における障害/災害に耐えうるアーキテクチャ設計のポイント~

セッションレベルは400 らしく、ガツンとくる内容でした。正直朝一にこの内容はキツイw耐障害性に必要となる用語・計算方法について解説があった後に、各サービスでの耐障害性の対応状況、構築時のリファレンスモデルの紹介があった感じです。。

MR09 デスクトップ アプリをストアから配布するための A to Z

荒井セッションです。今年は、前年までと違い最後ではなく途中に配置されていました。 COM のお話とか、前年の内容をもとにさらなる応用的な内容が中心でした。UWP と、既存の Win32 アプリと Bridge された Win32 アプリとの動作時の制限の違いなどについての説明がありました。 おそらく、ここに書くためにはスペースが足りないのでここらへんまでにしておきます。詳しくは、 de:code 振り返り会で。で。

CT 05 Xamarin を支える技術 2017

榎本 温さんによる Chalk Talk です。 参加者に、どこかで顔を見たことがあるような方が多かった印象です。Chalk Talk へは参加するのが初めてでした。参加者と登壇者との双方向コミュニケーションが活発に行われるとうのは聞いていました。しかし、実際はXamarin に対する解説で時間がほとんど終わってしまったのが残念でした。 また、de:code は参加者が多いため難しいかもしれませんが、 30 人も同じ部屋に入って双方向コミュニケーションをするのは難しいのではないかと思いました。10 人ぐらいの人数が最適では?

知りたかったことを知れたし、スタッフもできたし、最高でした。 あと、意外にブログを見てます。って言われたので少しうれしかったですw

WPF の UserControl で コントロールの高さと幅を取得する

やりかた

WPF アプリに UserControl を追加します、以下のような コードを高さを幅を表示するために追加しておきます。

具体的には、 ActualHeight メソッドと、 ActualWidth メソッドを利用することで取得できます。

Xaml コード

<StackPanel>
    <TextBlock Name="Height"></TextBlock>
    <TextBlock Name="Width"></TextBlock>
</StackPanel>

CSharp コード

public UserControl1()
{
    InitializeComponent();

    Height.Text = ActualHeight.ToString();
    Width.Text = ActualWidth.ToString();
}

しかし、取得できない

2つ並べたテキストブロックに UserControl の高さと幅が表示されることが想定されますが、実際には、表示されていません。

解決策

非同期 で ActualHeight メソッドと、 ActualWidth メソッド を実行する

この問題は、一見同期的に実行されるように見えるメソッドが非同期で実行されるところに問題があります。 具体的には、以下のメソッドは、 Xaml を解析したり、コントロールを配置したりするメソッドです。このメソッドが非同期的に実行されます。

InitializeComponent()

そのため、

InitializeComponent() が呼び出されたすぐ後に、 UserControl の高さと幅を取得しても、 0 になってしまいます。

ということで、 今回は、 Dispatcher.BeginInvoke() メソッドを使って解決していきます。

CSharp コード

 public UserControl1()
        {
            InitializeComponent();

            Dispatcher.BeginInvoke(new Action(() =>
            {
                Height.Text = ActualHeight.ToString();
                Width.Text = ActualWidth.ToString();
            }),
            DispatcherPriority.Loaded);
        }

実行結果

できました。

解決策②

実際に使うときは、ウィンドウの大きさを変えたときにも対応できるようにしたいといけないため、対応できるコードも置いておきます。

SizeChanged += (sender, args) =>
{
    Height.Text = ActualHeight.ToString();
    Width.Text = ActualWidth.ToString();
};

実行結果

Live Unit Testing がサポートされてないプロジェクトで動かないようにする方法

Live Unit Testing とは

ちょまど さんの ブログ を引用します。

Live Unit Testingでは、コードの編集中にバックグラウンドで影響範囲のユニットテストが実行され、 その結果やテスト範囲がリアルタイムでエディターにわかりやすく表示されます。

短いスパンでユニットテストを回して、バグを早期に見つけることをサポートしてくれる機能です。

Live Unit Testing がサポートしていないプロジェクトは?

結論から先に書くと

.NET Core, UWP Project では動きませんでした。

MSDN Blog によると、現在はサポートしていませんが、将来的にはサポートしたいと書いてありました。

Q: Does Live Unit Testing work with .NET Core? A: Live Unit Testing currently does not work with .NET Core. We are working to add this support in future. blogs.msdn.microsoft.com

Live Unit Testing がサポートしていなプロジェクトがソリューションに含まれている状態で Live Unit Testing が動くとどうなる?

Live Unit Testing のウィンドウに以下のようなエラーメッセージが出ます。うざいので消していきます。

[20:32:18.981 Info] Live Unit Testing は、プロジェクト ‘{UWP Peoject Path}’ で必要な Windows ユニバーサル アプリ コンテナーをまだサポートしていません。このメッセージを非表示にするには、'<BuildForLiveUnitTesting>false</BuildForLiveUnitTesting>' をプロジェクトに追加します。

[20:32:19.118 Info] Live Unit Testing は、プロジェクト ‘{NET CORE Project Path}’ で必要な .NET Core をまだサポートしていません。このメッセージを非表示にするには、'<BuildForLiveUnitTesting>false</BuildForLiveUnitTesting>' をプロジェクトに追加します。

サポートしていないプロジェクトを早速設定していく

Project Folder に入っている .csprj を VSCode で開いて編集していきます。 Project Folder は Visual Studio で編集したいプロジェクトのコンテキストメニューから開けます。

<BuildForLiveUnitTesting>false</BuildForLiveUnitTesting> という文字列を <PropertyGroup></PropertyGroup> のところに追記します。

Visual Studio 15.2 で Can not resolve reference: C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/ja/mscorlib.resources.dll {iOS Project Name} というエラーが出る

環境

解決策

1. Visual Studio 2017 のインストールフォルダを開く

パスは、 C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Xamarin

2. Xamarin.Apple.Sdk.targets ファイルを管理権限付きで編集画面を開く(VSCode とかで開けばOK

3. 編集をする

100 行目にある以下の箇所に一文挿入する

$(TargetFrameworkRootPath)$(TargetFrameworkIdentifier)\$(TargetFrameworkVersion)

Before

After

情報源

forums.xamarin.com

UWP アプリからブラウザで指定したURLを開く

やること

UWP アプリ からブラウザで指定したURLを開く

方法

コード

適当なボタンを置いて、コードビハインドで、以下のようなコードを書きます。

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
        {
            LanchSite();
        }

        public async void LanchSite()
        {
            await Launcher.LaunchUriAsync(new Uri("http://www.keyakizaka46.com/s/k46o/?ima=0000"));
        }

実行例

UWP アプリ で インターネット上にある画像を表示する

環境

まえがき

一般的に、 UWP アプリで画像を表示するためには、 <image /> を利用します。

では、インターネット上にある画像、例えば、 https://www.google.co.jp/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png とか。 を表示すればいいのかなと思ってやってみました。

やりかた

以下のように Image タグの Source プロパティで 画像のURLを指定してあげるだけです。
今回も、例のごとく 欅坂46 のアイコンを表示させてみました。

コード

<Image Source="http://48pedia.org/images/a/a3/%E6%AC%85%E5%9D%82%E3%83%AD%E3%82%B4.jpg"></Image>

実行イメージ

VisualStateManager を listView の中で 使う方法 in UWP App

VisualStateManager.aspx) は、デスクトップやモバイルなどのマルチデバイスに対応するUIを作るときに使用する技術です詳しくは、リンク先を見てください。

やったこと

サンプルコードとして、欅坂46 のアイコン画像をリスト表示するようなコードを書きました。

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" >
      <Pivot>
        <PivotItem>
          <PivotItem.Header>Hello World</PivotItem.Header>
            <ListView ItemsSource="{Binding Datas}">
              <ListView.ItemTemplate>
                <DataTemplate>
                    <UserControl>
                        <Grid>
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="SizeStateGroup">
                                    <VisualState x:Name="Min">
                                        <VisualState.StateTriggers>
                                            <AdaptiveTrigger MinWindowWidth="0" />
                                        </VisualState.StateTriggers>
                                        <VisualState.Setters>
                                            <Setter Target="Image.Height" Value="100" />
                                        </VisualState.Setters>
                                    </VisualState>
                                    <VisualState x:Name="Middle">
                                        <VisualState.StateTriggers>
                                            <AdaptiveTrigger MinWindowWidth="651" />
                                        </VisualState.StateTriggers>
                                        <VisualState.Setters>
                                            <Setter Target="Image.Height" Value="200" />
                                        </VisualState.Setters>
                                    </VisualState>
                                    <VisualState x:Name="Wide">
                                        <VisualState.StateTriggers>
                                            <AdaptiveTrigger MinWindowWidth="1000" />
                                        </VisualState.StateTriggers>
                                        <VisualState.Setters>
                                            <Setter Target="Image.Height" Value="300" />
                                        </VisualState.Setters>
                                    </VisualState>
                                </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                            <Image x:Name="Image" Source="http://48pedia.org/images/a/a3/%E6%AC%85%E5%9D%82%E3%83%AD%E3%82%B4.jpg"></Image>
                        </Grid>
                    </UserControl>
                </DataTemplate>
              </ListView.ItemTemplate>
            </ListView>
        </PivotItem>
      </Pivot>
  </Grid>

キーポイント

DataTemplate を UserControl で囲んでいる点

調べていて原因まで特定することはできませんでしたが、 UserControl で囲めば、行けるようです。 Control Root でしか VisualStateManager が使えないのと関係してるのかな。。。

参考情報

stackoverflow.com