Xamarinといえば。
iOSやAndroidのアプリをC#で作れる、というものです。
どうやら理屈的には「C#のコードをネイティブに変換し、それをコンパイルする」ということで。
なにやらApple Storeの申請も通るらしいです。
恐ろしいですね。
けど、本当に恐ろしいのはコードの手数の少なさとネットワーク関連のバックグラウンドのやりやすさです。
なんと、最近のバージョンはasync~awaitが使えてしまいます。
そのおかげでコーディングが楽で楽で。
Xamarinといえば。
iOSやAndroidのアプリをC#で作れる、というものです。
どうやら理屈的には「C#のコードをネイティブに変換し、それをコンパイルする」ということで。
なにやらApple Storeの申請も通るらしいです。
恐ろしいですね。
けど、本当に恐ろしいのはコードの手数の少なさとネットワーク関連のバックグラウンドのやりやすさです。
なんと、最近のバージョンはasync~awaitが使えてしまいます。
そのおかげでコーディングが楽で楽で。
C#.exe → win32.dll → Java.jar → c++/cli.dllときまして。
cliのオブジェクトを操作する段階まで来ました。
ところが、cliのオブジェクトってC++のポインタみたいに数値で記憶しておく、ってことができないのですね。
最初の目論見ではJavaのクラスにネイティブのポインタを保存するint型のフィールドでも作って管理しておけばいいんじゃね?
くらいに考えていたのですが。
見事にその目論見は達成できなくなってしまったのです orz
少し前に「WindowsでJNI」ってブログ書いたんですけど。
ここ数日またJNIやってました。
一番時間がかかるのは各々のインターフェイスがちゃんとつながったかテストするのに時間かかってて。
というのもちゃんと動いてくれないからなんですが。
で、やっと動くようになってきまして。
今まで気づかなかった自分が悪いのですが。
Visual Studio 2013のWebのプロジェクト、普通に作るとMVC5で、Visual Studio 2012を選ぶとMVC4のプロジェクトになるんですね。
気づかなかったですw
というわけで、先日書いたOWINのネタは、MVC4で作っていた様です。
先日別ログで書いた、「WebRoleにOWINでNancyでRazorしてみる」ですが。
試しにWebSitesでも試してみました。
Windows8.1のストアアプリでInternetに繋がっているか判定するには、以下の判定を行う。
ConnectionProfile cProf =
NetworkInformation.GetInternetConnectionProfile();
if (cProf != null &&
cProf.GetNetworkConnectivityLevel() == NetworkConnectivityLevel.InternetAccess) {
Debug.WriteLine(“Connecting internet”);
}
else
{
Debug.WriteLine(“Disconnected internet”);
}
GetInternetConnectionProfileで有効な接続を取得し、InternetAccessと比べることで接続しているか調べる。
Hyper-Vやら動かしてたら、GetInternetConnectionProfile() != nullだけでは調べられなくて、InternetAccessも見ないと正しい状態がわからないのです。
この辺りをしっかり調べてユーザーへ警告しないとStoreでは落とされちゃうので注意。
別Blogの方にOWINの記事を書いたら、大間違いでした。
そういえばローカルのデバッグ環境だけでテストしていたような。
物書くときはちゃんとデプロイしてから書きましょう。
すみませんでした。
jQuery UIを使用できるようにした状態のJadeファイルに
#error_message.ui-widget
.ui-state-error.ui-corner-all
p(style='white-space: nowrap;')
span.ui-icon.ui-icon-alert(style='float: left;')
span#error_message_text
こう書いておいて、JavaScriptで
$(‘#error_message_text’).html(‘内部エラーです’);
$(‘#error_message’).show(‘blind’);
とかするわけです。
Windows8.1ストアアプリのAppBarの中身はCommandBarってビューになってます。
つまり、こう。
<Page.BottomAppBar>
<CommandBar>
<CommandBar.PrimaryCommands>
<AppBarButton Icon=”Home” Label=”Home”/>
</CommandBar.PrimaryCommands>
</CommandBar>
</Page.ButtomAppBar>
んで、このAppBar中にカスタムなコントロールを入れるには、ICommandBarElementを継承したコントロールを作ればいいんですね。
これは簡単で、UserControlを作って、ICommandBarElementも継承させればよかったりします。
つまり、こう。
namespace TestApp
{
public sealed partial class TestControl : UserControl, ICommandBarElement
{
こんな感じでUserControl継承のコントロール作って、後ろに付け加えれば。
CommandBar.[Primary|Secondary]Commandsの中に入れられるコントロールになりますですよ。
ちょっとした事情でWindowsでJNIやってみました。
またこれがクセもので。
というか、やろうとしたことが、クセ球な方法だったのですが。
ファイルを読み込んで既存のJavaライブラリ(Android用のw)に食わせて結果を受ける、という。
…全部Javaでやれよ、という話もありますが。
しがらみで、呼び元はC#なのです。
てなわけで。
C#→Win32→Java→C++→C#
という呼び出し順。
…出力先がAzureのStorageなので。
で、今日は前半、Javaまで。
ところが、JNI_CreateVM呼ぶとアプリもろとも落ちるわ、読み込むJarの指定方法ははっきりしないわで。
(Jarファイルが複数ある場合)
CreateVMの方はLoadLibrary経由にすることで回避、Jarは再度Jarする事で一本に。
そうして何とかJavaまで呼び出す事ができる様になりました。
ああ、もちろんAndroid Frameworkの部分は偽物クラス作って動かすのです。
JNIでC#にまで処理をもっていくのですね。
そこは明日以降ということに。
まあでも、これできれば開発スピード上がるわ。
楽でいいね。jQuery ui。
Node.jsとjadeとjQuery uiで組み合わせるとかなり楽で。
Jadeで
#progress
ってやって、JavaScriptで
$('#progress').progressbar({value:false}).show('blind');
ってやるだけでプログレスバーがグリグリ動いてくれるんだから。
もうなんだか手抜きしまくりになってしまいそうです。