昭和の日なので「ああっ女神さまっ」を振り返ってみる

たまたま先日立ち読みしたアフタヌーンで「ああっ女神さまっ」が最終回だったので記録的に書いておこう。

連載が始まった頃にちょうど大学生で、なんかちょうどリアルタイムな時期でした。その前の「逮捕しちゃうぞ」のあたりと、その後の「サクラ大戦」があって、江川達也の「Be Free」からの系列で、アシスタントということで、理系ということもあって初回から単行本は買っていたわけですが、同時期にあった「月下の棋士」とか「無限の住人」に比べるとコメディの具合となかなか進展しない恋の具合は「宮本君から君へ」という漫画もあったりして、まあ、江川達也風でどう行くのだろうか?という感じでした。もちろん、前作の「逮捕しちゃうぞ」の頃からバイク・車とメカニカルな描写が得意なわけで、そっち方面は猫実工大にも表れているし、変な先輩あたりは当時の大学の雰囲気もあって、そういう変な感じを許容する昭和な時代だったかなと。いやいや、後から振り返れば、バブルな時代であって、ちょうどそのまま就職すれば会社入るまえにハワイ旅行で拘束なんて時代でしたから、最初の頃はそんな雰囲気も漂っていますよね。

絵柄がミュシャ風になったのは「女神」だったからなのか、そういう路線に変更にしたのかは不思議なところですが、士郎正宗の「攻殻機動隊」が細いラインで細かく描かれていた(その前の「アップルシード」とは異なる)メカニカルなものが、車やバイクのエンジンの描写ではなく、そのままベルダンディの衣装の描写になったのかな、と推測しています。一方で江川達也は細い線で「東京大学物語」を書いていたわけで(その前は「タルるーとくん」あたりだったけ?)、考えててみれば「ジョジョの奇妙な冒険」も似た時期ですよね。そんな中でごった煮な月刊アフタヌーンがあったわけでして。

と実は40巻ぐらいまでだらだらと買っていたのですが、ちょっと追わなくなったんですよね。年齢的にもそういう漫画を読む歳ではなくなった…つーか、いや、そういう感じ読んでいる訳ではなけど、さすがにあれや、正直「いつまで続くんだろー」ぐらいな感じになっておりました。連載途中からアフタヌーン一押しになってしまって(最初からそうだったのか覚えていないのですが、あの「江川達也」のアシスタント、「逮捕~」の次の作品、ってことで期待は大きかったハズです)、そのミュシャ風のグッズに寄った時点からついていけなくなった感じ?いや、なんだろう、10次元の話あたりは覚えているし、その後のエピソードのそこそこ覚えているのですが、んー、うる星やつらの「ビューティフル・ドリーマー」を何度も見せられる既視感というか、先に進まなさというか、いや先に進まないのはうる星やつらあたりで経験済みなので、そういう楽しみ方もありなんですが、なんだろう、メカニカルなところと無理矢理つなげている趣味的なところがあったのが、いつの間にかなくなってしまったところですかね。嘘くさい理系的な薀蓄をあきらめてしまったあたりからかな。

んがしかし、25年も連載を続けられるのは、体力的にも営業的にもアレなので、それはそれ。Kindle版も売っているようなので、買い直してみるかな。

カテゴリー: 雑談 | 昭和の日なので「ああっ女神さまっ」を振り返ってみる はコメントを受け付けていません

F#でWPFアプリを作る方法

F#でGUIを扱うのはなかなか大変なのですが、できないことはありません…と思っていましたが、WPFアプリならばプロジェクトテンプレートがあるよ、ってのを最近知りました。

Visual Studio 2013 で「オンラインテープレートの検索」で「F# WPF」で検索してみます。すると、いつか F# で Windows アプリを作るテンプレートがあるんですね。

image

が…、WPF アプリと、WPF+MVVM アプリのプロジェクトをダウンロードしたものの、いまいちよく分からなくて途方に暮れます。WPF アプリのほうは中身が空っぽ(Emptyなのでそりゃそうなんですが)で先がわからなく、WPF+MVVMは、グリッドへの DataBind の例なんですが、ふつうの DataBind がどうするのかわかりません。

そんなわけで、上をベースにして簡単なサンプルを作りました。
moonmile/SampleFSharpUI
https://github.com/moonmile/SampleFSharpUI

これも簡単すぎて実務には足りないんですが、取っ掛かりぐらいにはなるかと。WPF + F# の組み合わせはふつうに XAML デザイナを使ってアプリを作れるので、C# と同じように作れます。ただし、コードビハインドの仕組みがないので、ボタンのクリックイベントは自前で用意する必要がありますね。以下、ざっと説明を。

■SampleFSharpUI.WPF

先の F# empty windows app をベースにして XAML にテキストボックスを並べます。テンプレートの XAML では Grid タグをつけ忘れているので、それを追加するところから。

image

MainWindow.xaml.fs のようなコードビハインドはなくて、App.fs にある

type MainWindow = XAML<&quot;MainWindow.xaml&quot;>

が、その役割を果たします。TypeProvider.XAML でコーディング時に MainWindow.xaml を解析して、クラス(type)に割り付けます。こうしておくと、

let window = MainWindow()
...
let x = Convert.ToInt32( window.text1.Text )

な感じで x:Name=”text1” で指定した名前を、window.text1 のようにプロパティとして参照できるようになります。TypeProvider 自体がよくわからないのですが、なんかファイルか文字列を読み込んで型にして返してくれるものみたい。

ボタンのクリックイベントは

   window.button1.Click.Add( fun _ -> 
    let x = Convert.ToInt32( window.text1.Text )
    let y = Convert.ToInt32( window.text2.Text )
    let ans = x + y
    window.text3.Text <- ans.ToString()
   )

と書いていますが、window.button1.Click |> Event.add を使って

   window.button1.Click 
    |> Event.add( fun _ -> 
    let x = Convert.ToInt32( window.text1.Text )
    let y = Convert.ToInt32( window.text2.Text )
    let ans = x + y
    window.text3.Text <- ans.ToString()
    )

のように書くこともできます。まあ、普通にメソッドにしたほうがいい気も。

アプリの起動自体は

 [<STAThread>]
(new Application()).Run(loadWindow()) |> ignore

となって、最初の loadWindow を呼び出すわけですが、この書き方だとすべてグローバル変数扱いになってしまうので、実務的には適度にクラスかモジュール分けが必要ですよね。

■SampleFSharpUI.MVVM

MVVM では、INotifyPropertyChanged を継承した ViewModelBase クラスを作っておいて、DataModel クラスを作ってます。MVVM の ViewModel にあたるクラスなんですが、Model クラスがないのは気持ち悪いのでこんな名前にしています。

type DataModel() =
    inherit ViewModelBase()
    let mutable _X : int = 10
    let mutable _Y : int = 20
    let mutable _ANS : int = 30

    member this.X 
        with get() = _X
        and set(value) = 
            _X <- value
            base.OnPropertyChanged &quot;X&quot; 

    member this.Y
        with get() = _Y
        and set(value) = 
            _Y <- value
            base.OnPropertyChanged &quot;Y&quot; 

    member this.ANS
        with get() = _ANS
        and set(value) = 
            _ANS <- value
            base.OnPropertyChanged &quot;ANS&quot; 

プロパティの get/set の並べ方はこんな感じで。クラスの最初に mutable を置かなければいけないのと(これでよかったっけ?)、OnPropertyChanged メソッドに「メソッド名」を渡さないといけないのがいまいちですね。CallerMemberName 属性を使って、コンパイル時にチェックしたいところです。

XAML へのバインドは C# と同じで Text=”{Binding X, Mode=TwoWay}” のように書けます。この方法で C# とビューが共有できます。

type MainWindow = XAML<&quot;MainWindow.xaml&quot;>

let _model = new DataModel()

let loadWindow() =
    let window = MainWindow()
   
    // Your awesome code goes here and you have strongly typed access to the XAML via &quot;window&quot;

    // 初期値
    _model.X <- 0
    _model.Y <- 0   
    _model.ANS <- 0
    window.button1.Click.Add( fun _ -> 
        // データバインドで設定
        _model.ANS <- _model.X + _model.Y 
    )
    window.Root.DataContext <- _model
    window.Root

あとは、_model オブジェクトを作って DataContext にバインドすれば OK です。XAML のデザイン時に Binding でインテリセンスを効かせたいときは、C# のときと同じようにデザイン時のバインドを使えば OK です。

d:DataContext="{d:DesignInstance {x:Type local:DataModel}, IsDesignTimeCreatable=True}"

実行結果はこんな感じ

image

■Window Store App ではどうするのか?

タイププロバイダで XAML が読めるんだから、ストアアプリの XAML も読めるはず…なんですが、F# でストアアプリを作ろうとすると XAML デザイナがうまく認識しません。さらに言うと、そのままでは、参照設定がうまく WinRT にほうにできません。どうやらコンパイル時の *.targets をうまく設定しないといけないんですよね。現時点ではうまくできてません。

XAML 用のデザイナは C:/Program Files (x86)/MSBuild/Microsoft/WindowsXaml/v12.0/ あたりを見ているので、ここに FSharp 版をつくらないとダメな模様

あとプロジェクトテンプレートのGUIDが BC8A1FFA-BEE3-4634-8014-F334798102B3 で、C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/CommonExtensions/Microsoft/WindowsXamlFlavor/Microsoft.VisualStudio.Windows.UI.Xaml.Project.pkgdef になるので、これを参考にしながら F# 版を作らないとダメかも。

カテゴリー: F# | 1件のコメント

C#によるiOS、Android、Windows対応のアプリ開発 — 予約中

C#によるiOS、Android、Windows対応のアプリ開発
http://www.amazon.co.jp/dp/4822298345/

表紙がまだできていませんが、Amazon で予約開始です。そのうち日経BPさんのサイトにも載ると思います。サブタイトルがないけど「Xamarin + Visual Studio で作成する~」みたいな感じですね。Xmarin + Visual Studio で iOS アプリ、Android アプリ、Windows ストアアプリを同時並行で作っていきます。

image

概要はAmazon に書いてある「内容紹介」の通りです、もっと具体的に言えば、MVP Community Camp 2014 で発表しました。 | Moonmile Solutions Blog で作ったサンプルが元です…と言いますから、執筆途中の原稿のちらみせがスライド資料の発表になります。

更に具体的に言うと http://www.moonmile.net/blog/archives/category/dev/xamarin のカテゴリにある内容が 280 ページ(まだ、途中なので確定ではありませんが)に詰まっていると思ってください。ブログのほうでは調査も含めてぱらぱらと書き散らかしていきましたが、モバイル機器(iPhone/iPad、Android、Windowsタブレット)でどうやったら共有して開発できるだろうか?という指針あるいは方向性になります。途中で Build 2014、Windows 8.1 Update、Visual Studio Update 2 RC、すまべん@関東 が挟まっているので、それも込み。榎本さんの記事 を参考にしつつ重ならないように注意しながら内容を絞り込んでいます。 Windows Phone 8.1 のほうは時期的に間に合わなかったのでさわりの部分だけ、将来的に Xamarin Studio で共有プロジェクトができると Xamarin.iOS/Android も含めたユニバーサルアプリができる可能性があります(ユニバーサルアプリで使っているSharedプロジェクトをXamarin.iOSで使う で手作業でプロジェクトファイルを書き変えると代替はいけるかと。Xamarin Studio for Mac の対応待ちになるのですが)。

そんな訳では、発売日は 5/29 だそうです。ええ、de:code の日ですね。ってことは、de:code 行かねばならぬのかーと、営業的に捻出中です。ええ、word の稟議書を眺めながら(自営だし)。

カテゴリー: Xamarin | C#によるiOS、Android、Windows対応のアプリ開発 — 予約中 はコメントを受け付けていません

Windows Phone 8.1 と Xamarin.iOS/Android で PCL を使う方法

moonmile/XamarinXmlSerialize なところの説明を少し。手元のシリアライザ練習用に作ったものですが、ついでにユニバーサルアプリにを追加して Xamarin.iOS/Android から PCL を参照させてみました。

image

こんな風な、ソリューションの構成になっているところで

image

こんな風な PCL を作ります。普通に作ると Windows Phone 8.1 と Xamarin.iOS/Android の両方はチェックできないのですが、いずれ「できる」だろうってことで先取りします。

方法は簡単です。以前やってみた PCL のターゲットフレームワークに Xamarin をインストールせずに Xamarin.Android を追加する | Moonmile Solutions Blog の方法を使います。PCL の参照設定の「.NET」を選択してプロパティウィンドウを見ると、パスが出てきます。

image

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.5\Profile\Profile111

このパスをエクスプローラーで開いて、SupportedFrameworks フォルダに Xamarin.iOS.xml と Xamarin.Android.xml をコピーするだけです。この2つのファイルは Profile7 あたりにあります。Profile111 は、今回の VS2013 Update 2 RC でできたフォルダで、まだ Xamarin.iOS/Android が対応していないだけ(と思われる)です。将来的には対応されるでしょう。

image

そうすると、Xamarin.iOS/Android から PCL を参照できるようになるので、Windows Phone 8.1 とも共有が可能です。

先のサンプルでは、もう少し手を入れていて、Shared フォルダに BasicMain.xaml のコードビハインドを分離させています。

image

こんな風に、partial にしておいて、ボタンイベントだけをこっちの共有プロジェクトに書き出します。Windows ストアと Windows Phone の xaml には、「Click=”ClickLoad”」のようにイベントを設定するので、複数のビューとコードビハイドがうまく分離できますね、という方法です。考えてみたら、ファイルのリンクの追加でもできた話なのですが、まあ共有プロジェクトのほうが効果的かと。

image

で、共有プロジェクトは現在、Windows ストアと Windows Phone にしか出てきませんが、ユニバーサルアプリで使っているSharedプロジェクトをXamarin.iOSで使う | Moonmile Solutions Blog な方法を使うと、Xamarin.iOS/Android からも使えます。これも先行きは Xamarin で対応されるでしょう。となると、メソッド名と引数の並びが同じであればいいわけで、うまくやると、iOS の Storyboard と Android の axml と共有できるかもしれません(MvvmCross でもうまくいくかも)。

Android の場合は、「void ClickLoad(object sender, EventArgs e)」となるので引数の型が EventArgs の型だけ異なります。iOS の場合は IBAction の関係から「partial void clickCalc(MonoTouch.Foundation.NSObject sender)」となるので、引数の型が全く違います。まあ、#if ディレクティブで区切ればいいのですが、いちいち #if で分岐させるのも面倒ですよね。C/C++ ならば #define マクロで逃れるところですが、C# だとそれもできない。VB6 の頃のようにボタンクリックイベントから、別のクラスあるいはCOMを逐一呼び出すよう名な形にはしたくない。このあたりはちょっと考えどころ。

カテゴリー: WinRT, Xamarin | Windows Phone 8.1 と Xamarin.iOS/Android で PCL を使う方法 はコメントを受け付けていません

Azure Mobile Service は Nuget版とXamarin Components版があるので注意

半日ほど嵌ったのでメモ書き。

Azure Mobile Services を扱うときにはライブラリを使うのが常なのですが、Microsoft.WindowsAzure.MobileServices は Nuget版と Xamarin Componets 版の2種類があります。

Azure ポータルの「Xamarin」でダウンロードするサンプルは Xamarin Componets 版

image

Windows ストアサンプルは Nuget版

image

Nugetでダウンロードできるのは当然 Nuget 版。

image

ソリューションエクスプローラーで「Componets」→「Edit Components」で拾えるのが Xamarin Components 版

image

image

こんな感じでその他のコンポーネントもダウンロードできる。

image

で、普段はどちらかしかダウンロードしないので、はまることはあまりないのですが、こんな風に Mobile Services を PCL 化して、iOS/Android/Windowsストアで共有しようとしたときに、PCL では Nuget版しかダウンロードできない。けれども、iOS/Android のほうで、Xamarin Componets 版をインストールすると、実行時にエラーがでます。変だなー、ってことに。

image

Xamarin Componets 版では、こんな感じに。

image

サンプルコードもどちらを使っているのか判別しづらいのですが、「CurrentPlatform.Init();」を使っている場合が Xamarin Componets版、使っていないのが Nuget版です。Nuget版には CurrentPlatform というクラスがありません。そのほか実装されているクラスは同じなのか?

追記 2014/04/17
いや、どちらも同じく CurrentPlatform.Init() はある。なので、区別がつかないかも。

Xamarin で Windows Azure モバイルサービスを使う(その1) – Qiita
http://qiita.com/amay077/items/40bd5918284fd40d0edc

MobileServiceClient がメインクラスですが、これを使う前に CurrentPlatform.Init() が必要です(DI だか IoC だかですかね)。

かも。

追記 2014/04/17 どちらもソースコードは https://github.com/Azure/azure-mobile-services になってる。

Nuget 版で作ったものは、こちら。

moonmile/XamarinAzureMobile · GitHub
https://github.com/moonmile/XamarinAzureMobile

ところで、アプリケーションキーって、サンプルをダウンロードしてみるしかないんですかね? Azure ポータルに見当たらない…と思ったけど、「モバイルサービス」→「キーの管理」で見れる。

カテゴリー: Xamarin | Azure Mobile Service は Nuget版とXamarin Components版があるので注意 はコメントを受け付けていません

Windows 8.1 Update でプルダウメニューが左開きになった時の対処

と、Windows 8.1 Update のせいか定かではないのですが、4/9 の Windows Update でなった現象として、こんな風にプルダウンメニューが左開きになることがあります。

20140410_03

メニューって、右へ右へと開いていたはずなのに、突如として左へ左へと開き始めます。突然、Microsoft 社が方針を変えたのか?と思って色々調べて、英語版Windows 8.1でもUpdateをかけて調べていたのですが、原因が分からず。バグかな?と思っていたのですが、

 

とのアドバイスがッ!!! コントロールパネルで「タブレットPC」で検索するとありました。どうしてなのか謎なのですが、デスクトップPCがタブレットPCに誤認識されて(タッチタイプじゃないディスプレイなんですけど)、利き手の設定が「右きき」になっています。このために、左側にメニューが表示されていたんですね。

image

そんな訳で、ここの設定を「左きき」に直すと、無事いつも通りにメニューが右開きに戻りました。どの Windows Update でこうなってしまったのか分からないのですが、誤認識されない場合はコントロールパネルで「タブレットPC」を検索しても出てきません。この場合は、いつも Windows Update をしても右開きのままです。

コントロールパネルでみつからないけど、メニューは左開きという変な状態になっている場合は、レジストリを直接書き換えます。「MenuDropAlignment」で検索して、「0」(左きき)にします。PC を再起動して反映すればOK。

image

調べてみると、結構よくある誤認識らしいですね。再起動したときに、↓のように「タッチキーボード」が出ていると誤認識しているようです。確か起動時にキーボードを認識でないときに出るので、日本語キーボード全般で出てるのかも。

image

ついに Microsoft は Windows 8.1 Update で普通の PC をタブレット PC にする技術を発明したッ!!! のかもしれませんね。あの Windows 8 の発売の感動をもう一度…なのか?

カテゴリー: 開発 | Windows 8.1 Update でプルダウメニューが左開きになった時の対処 はコメントを受け付けていません

Splashtopを使ってWindows PCからMacへリモート接続する

Visual Studio で Xamarin.iOS を使っていると、デザイナとiOSシミュレータは Mac 上で動くために Mac の操作が必須になってきます。2台並べて作業をすればよいのですが、マウスとキーボードを置くスペースは無駄だし、いちいちマウスを持ち替えるのも面倒です。他には、Xamarin Studio for Mac で完結させてしまう。Mac に Fusion などの仮想環境を入れて、Windows + Visual Studio を仮想環境で動かす。という方法もあるのですが、まあ、高機能な Windows デスクトップを使いたいわけで(慣れとか、PC のほうが安いってのもあるけど)、普段使いは Windows なので、Mac へリモートデスクトップで操作をしたい訳です。

で、いままでは VNC を使って Mac の画面を操作していたのですが、VNC の描画が遅くて結構もたついてしまうのと、mac mini の場合は PC 側の jis 109 キーボードの認識が変で「@」マーク等のキーコードが Mac に伝えられないという不都合があります(Mac book Air などでは、そういうことはありません)。そんな訳で、最近 splashstop を使い始めました。

トップリモートデスクトップアプリ | iPad からコンピューターにアクセス | Splashtop Personal | Splashtop って、以前 iPad から PC へリモート接続ができる、ってんで話題になってたもので、Apple Store では「splashtop 2」が 500円になってます。iTunes の App Store で配信中の iPhone、iPod touch、iPad 用 Splashtop 2 – Remote Desktop 以前のバージョンは 85円だった気もするのですが、それはさておき。ちなみに、iPad から艦これができるっていう話題もありますね。SplashtopのIP直打ち設定で艦これリモートプレイが簡単にできてしまった | はげあたま.org どうせならば、PC 側に WPF で iPad のサイズで艦これビューアを作って接続するといいかも、とか。まあ、WiFi が必須なんですが。

で、私の場合は、Mac をホスト/サーバー(Splashtopでは「Streamer」)にして、Windows PC をクライアントにします。この環境は無料で構築できます。ただし、条件があって「インターネットに接続していて、splashtop へログインできる環境が必要」です。接続するときにログインIDを求められるので、外部接続が必須ですね。なので、ローカルに閉鎖された状態のプライベートネットワークではダメかも。まあ、そういう場合は VNC とか他のリモート接続の環境を用意するとして。

■インストール方法

http://www2.splashtop.com/ja/personal からパーソナル版をダウンロードします。

image

クライアント(リモート接続するPC)のアプリをダウンロードしてインストール

image

Streamer(リモート接続されるほうのPC/Mac)のアプリをダウンロードしてインストール

image

■Streamer(サーバー)側の設定

単純に起動しておけばOKです。接続されるとこんな感じになります。

image

Mac Book Air の場合、カバーを閉じて作業をすることが多いので(画面を見る必要がないので立てかけてしまってもいいし)カバーを閉じてもスリープしないようにしておきます。たぶん、Splashtopを入れたときに初期化されているのかもしれません。以下で「スリープ設定の変更」をクリックして、

image

環境設定で省エネルギーを設定しなおします。省電力を考えて「3時間」にしていますが、使っている限りは動くのでこれでよいかと。

image

■クライアントの設定

Windows PC のほうでは、最初にログイン画面が出た後に、こんな風に接続先が出てきます。ポートを探って、なんでも出てしまうので社内ネットワークとかで PC が多い場合は混乱するかも。そのあたりは、Business 版を買うんでしょうか?いや、アカウントでわかれるから大丈夫かな。

image

接続するときの解像度を選択できます。相手の解像度を判別しているのかは分かりません。ちなみに「ローカルコンピューターのネイティブ解像度」を選択しても、画面一杯に広がる訳ではありませんでした。Mac Book Air だからなのかな。

image

うまく接続ができると、こんな風に表示されます。ウィンドウを小さくすると、そのまま画面が小さくなるので、隅において監視したいときは便利です。タイトルの↓に「v」がにはメニューがあります。「100%」表示に戻すときに便利ですね。「切り替え画面」というのがあるので、マルチディスプレイに対応しているのかもしれません。

image

Windows 8.1 から Mac に接続していると、途中でクライアントのウィンドウが固まります。何故かよくわからないのですが、設定で「ネットワークに最適化」を OFF にすると直りました。通常は有線LANを使うからこれでいいと思います。クライアントには「Windows ストアアプリ版」があるのですが、どうなんだろう…デスクトップ版で十分な気がするんですが。

image

iPad から Mac/Windows への [D] 爆速リモートデスクトップSplashtop 2でMacとの付き合い方が変った! あたりが詳しいです。

そうそう、splashtop と Windows 標準のリモートデスクトップの違いは、リモートデスクトップが PC を占有してしまうけど、splashtop の場合は占有しないことです。VNC接続でもそうなのですが、どちらの PC/Mac でもマウスとキーボードの操作が可能なので、隣においてちょっとだけ Mac のキーボードで操作するってのも可能です。

カテゴリー: 開発 | 2件のコメント

C#とVBでXAMLを共有プロジェクトで使える…かと思ったけどできなかったの巻

C#とVBで共有プロジェクトを使おうと思ったけど、コードのプラグマは #if と #if … Then の違いがあって微妙に違って共有できないので、XAMLファイルを共有しようかと思ってやってみました。そう、*.xaml ファイルだけ共有します。コードビハイドは、それぞれの *.cs, *.vb を参照させます。

image

以下、作成手順

  1. ユニバーサルアプリから、shared プロジェクトを引っこ抜く。
  2. *.shproj に、MainPage.xaml だけ追加する。
  3. MainPage.xaml のクラス名を「XamlShare.MainPage」のように共通で使えるように変更
  4. *.csproj をエディタで開いて、MainPage.xaml.cs から MainPage.xaml を連結させている箇所を消す。
  5. *.csproj をエディタで開いて、XamlShare.Shared.projitems への Import を追加する。
  6. 同様に *.vbproj から MainPage.xaml.cs から MainPage.xaml を連結させている箇所を消す
  7. *.vbproj をエディタで開いて、XamlShare.Shared.projitems への Import を追加する。
  8. C# と VB の namespace を揃える。

とやると、上記の形になります。これで C# のプロジェクトは無事コンパイルができるのですが、VB の場合は、

エラー    1    ファイル “obj\Debug\D:\work\blog\src\XamlShare\XamlShare.Shared\MainPage.xbf” を “bin\Debug\D:\work\blog\src\XamlShare\XamlShare.Shared\MainPage.xbf” にコピーできません。指定されたパスのフォーマットはサポートされていません。    XamlShare.VB

のような謎なエラーを残してビルドができません。obj\Debug\D:\work\… のように変な形でドライブがついてしまっているのでビルド型式がおかしくなっているんでしょうね。共有プロジェクトのために、Update 2 で C# のビルド型式に修正を入れたのだと思います。残念。

よく見ると、VB のほうにはユニバーサルアプリがないという結果に。

image

で、ユニバーサルアプリのある C++ ならば、と思ってやってみるとビルドが通りました。うまくいかなかったと思ったけど、どこか手順をミスしたみたい。

サンプルは XamlShare-v0.2-src.zip から。

これは「空のアプリ」になっているので、後で中身を追加してみましょう。

カテゴリー: 開発 | C#とVBでXAMLを共有プロジェクトで使える…かと思ったけどできなかったの巻 はコメントを受け付けていません

共有プロジェクトをコンソールアプリでも使ってみる

ユニバーサルアプリで使っているSharedプロジェクトをXamarin.iOSで使う | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/5696

の続きです。

コード共有できることが分かったのだから、本当に「ユニバーサルにしてしまおう」という訳で、

  • コンソールアプリ
  • Windows フォームアプリ
  • WPFアプリ
  • Silverlight

も追加してみました。サンプルソースは、こちらから。

image

当たり前ですが、すべて動きます。

コンソールで

image

Windows フォームで

image

WPF で

image

Silverlight で

image

ネタ的に

カテゴリー: 開発 | 共有プロジェクトをコンソールアプリでも使ってみる はコメントを受け付けていません

ユニバーサルアプリで使っているSharedプロジェクトをXamarin.iOSで使う

Visual Studio 2013 Update で追加された「ユニバーサルアプリ」で、

Universal Windows appを見てみた – かずきのBlog@hatena
http://okazuki.hatenablog.com/entry/2014/04/03/220347

この中に「*.Shared」というプロジェクトがあります。このプロジェクトは何をやっているかというと、手っ取り早く言えばファイルをリンクで共有しているだけかなと。であれば、ユニバーサルアプリだけでなくて、Xamarin.iOSやXamarin.Androidとか、他のプロジェクトでも使えるはずで、ちょっと試してみます。

コード共有のプロジェクトは通常のプロジェクトの追加では出てきません。ならば、「ファイル」→「テンプレートのエクスポート」で自作してみれば?と思ったのですが、これを作ってもプロジェクトの追加では出てきません。これが、RC2 だからなのか、先行き追加されるのか解りませんが…仕方がないので *.csporj ファイルを編集します。

  • ユニバーサルアプリのプロジェクトを作成する。
  • *.Shared.csproj をコピーして、自作のプロジェクトファイルを作る。

ここではプロジェクトの名前を「AppShare.Shared」にしておきます。

  • AppShare.Shared.projitmes にリネームする。
  • SharedGUID をユニークになるように変更する。

  • AppShare.Shared.csproj に以下の行を追加する。
  <Import Project=&quot;AppShare.Shared.projitems&quot; Label=&quot;Shared&quot; />
  • ソリューションエクスプローラーで、AppShare.Shared.csproj を追加する。
  • 参照するプロジェクト(AppShare.ioS.csproj など)に以下の行を追加する。
  • 「参照設定」から追加できないので、これも直接書き換えます。

  <Import Project=&quot;..\AppShare.Shared\AppShare.Shared.projitems&quot; Label=&quot;Shared&quot; />

うまく追加できると、次の図のように共有コードのプロジェクトが参照できる状態になります。

このプロジェクトはファイル共有しているだけなので、コードだけじゃなくてコントロールなども置けますね。書き方によれば、partial class も置けるし、インターフェースなしで本体を参照する dack コードも書けます。いわゆる、プロジェクトにファイルを追加するときに「リンクとして追加」と同じ機能になると思います。なので、各プロジェクトのシンボル(プラグマ)が使えるということで、切り替えは #if を使えば OK。

チープですが、共有コードに、ShareClass を作っておいて、

using System;
using System.Collections.Generic;
using System.Text;

namespace AppShare.Shared
{
    class ShareClass
    {
        public int Add( int x, int y )
        {
            return x + y;
        }
    }
}

AppShare.Androidプロジェクトのほうでコードを書きます。

void button_Click(object sender, EventArgs e)
{
    var edit1 = FindViewById<EditText>(Resource.Id.editText1);
    var edit2 = FindViewById<EditText>(Resource.Id.editText2);
    var text1 = FindViewById<TextView>(Resource.Id.textView1);

    int x = int.Parse(edit1.Text);
    int y = int.Parse(edit2.Text);
    var obj = new Shared.ShareClass();
    int ans = obj.Add(x, y);
    text1.Text = ans.ToString();
}

AppShare.iOSでも同じ感じで。

partial void clickCalc(MonoTouch.Foundation.NSObject sender)
{
    int x = int.Parse(text1.Text);
    int y = int.Parse(text2.Text);
    var obj = new Shared.ShareClass();
    int ans = obj.Add(x, y);
    lable1.Text = ans.ToString();
}


サンプルコードはこちらから http://1drv.ms/1jbhVNq

ちなみに、Xamarin StudioでAndroidのほうはビルドできるのですが、Xamarin Studio for Mac で iOSのほうはビルドができませんでした。Visual Studio限定の技かも。

カテゴリー: 開発, Android, WinRT, Xamarin, iOS | ユニバーサルアプリで使っているSharedプロジェクトをXamarin.iOSで使う はコメントを受け付けていません