Webアプリを創る 😊クリエイティブWeb

カテゴリー: プログラミング

Cordova vs Xamarin vs Swift

2015年1月7日

今年初めてのブログなので、今年の抱負とかを書こうと思ったのですが、昨年の後半はスマートフォン・アプリを作ろうと思っていろいろ検討してきたので、そのメモをしておきます。

Cordova

PhoneGap といった方が有名ですが、HTML+Javascriptの技術を使って、iPhone/Androidのネイティブアプリケーションの開発が可能になります。以前に使ってみたときには、デバッグがしづらいと思っていたのですが、Microsoft から Visual Studio Tools for Apache Cordova が公開されて、開発がすごく楽になっています。Webアプリにプッシュ通知だけをつけたい場合のように、少しだけネイティブの機能を追加したい場合には適していると思います。

Visual Studio Tools for Apache Cordova は、VS の Express ではインストールできません。しかし、昨年の11月に個人や5人以下の企業向けに Visual Studio Community 2013 が公開され無料で利用できるので一度試して見るといいと思います。

Xamarin

Xamarin は、C#やF#といった.NET系の技術を用いてiPhone/Android のアプリ開発を可能にするクロスプラットフォームツールです。Xamarin 自体は、各プラットフォームの API の薄いラッパーで、アプリのUIを作る場合には各プラットフォームのことを知っていないと作れないのでかなり苦労しています。Model の部分は共通で使えるので、アプリ側で多くのロジックが必要な場合には適していると思います。

昨年の5月に公開された Xamarin.Forms は、UI 部分も共通化しようというもので魅力のある製品ですが、実際に使ってみるとまだまだベータ状況という感じがしています。製品として早く成熟して欲しいと思っています。

Swift

iOS のソフトらしいヌルヌル動作するアプリを作りたければ、Apple 純正の Swift を使うのがいいようです。C# を知っていれば Objective-C よりはモダンになっているのでかなり取っつきやすいと思います。Apple が Swift を公開したことに対して、また独自の言語を開発してという非難をする人がいますが、iOS の特徴を生かすための言語が必要というのはやむを得ないことだと思います。

ベストな開発環境を確認するのはその環境を熟知していないと無理なので、結局は自分の能力や作りたいアプリの特徴に応じてだいたいのところで選択するしかないというのが実態のようです。今年は、Webアプリのスマートフォンアプリ版を作りたいと思っていますが、最初は、Xamarin から始めようと思っています。最終的にはどうなるかはわかりませんが、ぜひ公開できるようにしたいと思っています。

Xamarin から始めようと思っているのは、現在は ASP.NET MVC で Web サイトを作っているためです。Cordova を使うためには、Razor が使えなくなって、HTML + CSS + JavaScript だけで画面を作る必要があります。そういう制作方法に変更してもいいとは思うのですが、Xamarin であれば、WebView で Razor も使えるので Web アプリと iOS/Android アプリの共通部分を増やせるのではないかと思っています。

C#で経済指標巡回プログラムを作成しました

2014年12月30日

Rubyで経済指標自動巡回プログラム作成しました。 - 人生、徒然なるままに。」というブログをみて、このブログの筆者は、.Net や Java を使えるのに、なぜ、新たに勉強してまで Ruby を使ったのかということに興味があったので、同じようなものを C# で作り、GitHubで公開(https://github.com/awoni/GetMarketCalendar)してみました。

今回のプログラムでは、データの取得には HTTPClient を使って直接 Url をたたいて該当ページのHTMLを取得しています。一方で、Ruby の方では、「フレームワークとしてCapybara、レンダリングドライバー・javascriptドライバーとして poltergeist, PhantomJS」を選択しているそうで、プログラムでボタンをクリックして取得したデータをもとに解析しています。今回のデータの場合は、HTML のみで必要なデータが取得できましたが、JavaScriptを使ったインターラクティブな Webページが増加しているので、Javascriptが動作する環境でブラウジングしてデータを取得する必要がある場合も多くなってくると思います。

Html のパースには、Html Agility Pack を使っています。LINQ を使って記述していますが、意外と簡単にパースすることができます。

データの保存については、データベースではなくて、そのままで API として使いやすい Json で保存するようにしてみました。 Newtonsoft の Json.NET でシリアライズしています。設定ファイルについても、Json にしてみました。

その他に NuGetのパッケージとしては、NLog を使っています。Html のパースルーティンでは、どの程度までエラー処理をすべきかが問題になりますが、画面の変更に対応しようと思うとプログラムがどんどん複雑になってくるので、自分としては、プログラムは余り複雑にせずに、画面の変更によるエラーに早く気づくようにした方がいいのではないかと思っています。NLog をログのメール送信にも対応しているので、こういう点に関しては便利だと思います。ただ、今回公開しているプログラムでは、時間の関係でとりあえずの状況なのですが、実際にアプリケーションを作る場合は、ログをどうとるかは結構重要だと思っています。

C#で実際に同じようなプログラムを書いてみて、実務的にいえば C# は十分優秀だと思います。LINQ や 今回は使っていませんが await async による非同期処理は便利です。ではどこが Ruby より劣るのかということを考えてみると、ブログの筆者のいう「rubyは面白いらしい」ということに尽きるのではないかと思います。それに、日本では情報量の差も大きいと思っています。

C#がどうすれば面白くなるかはよくわかりませんが、ブログの作者が巡回プログラムを作る動機になった「Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例」という本は、amazon.co.jp の「ソフトウェア・開発言語」で7位にランクされています。クローラーは意外と興味がある人が多いようなので、自分もクローラーであれば結構ネタはあるので、時々ブログに書いてみようと思っています。

モバイル開発ツールを Google トレンドでみてみた

2014年11月22日

モバイル開発ツールの動向を Google トレンドで少し調べてみました。まず、主要な開発ツールの Xcode、Android SDK、Adobe AIR、PhoneGap、Xamarin を比較してみました。やはり純正の Xcode、Android SDK は強いです。そして、Adobe のツールの人気度が低下し、Xamarinの人気度が上昇中です。

image

日本で見てみると、iPhone 人気のためか Android SDK の人気度が低くなっています。

image

次にマルチプラットフォーム開発ツールだけにしてみると、Xamarin の人気度が急上昇しているのがよくわかります。

image

日本では、Xamarin の人気度はまだまだのようです。

image

開発ツールに関しては、基本としては自分の好きなものを選択すればいいのだけど、開発中止になると痛いので動向を簡単には抑えておいたほうがいいと思います。

JavaScript は PHP より10倍速い!

2014年6月25日

JavaScript の処理速度が予想以上に速くなってきている。最近、スマートフォン用のアプリケーションをどうするか試行錯誤していたがその際の正直な実感だ。熾烈なブラウザー競争の結果 JavaScript の JIT コンパイラーが優秀になってきているのが原因だろう。

俺の言語がこんなに遅いわけがない!? 〜C, Java, PHP, Python, Rubyによるプログラミング言語 速度比較〜」というブログの記事の結果に、C# と JavaScript の処理時間を追加すると以下のようなグラフになる。プログラム言語の処理速度は、C < C# ≒ Java < JavaScript << PHP のようだ。

image 

JavaScript に数値を入れていないのは、同じ計測方法がとれなかったためで、概略で図を描いたもので詳しくは下で説明している。この結果は、プログラミング言語についての計算速度を測定するサイトである Computer Language Benchmarks Game の JavaScript と PHP を比較したデータを一番下に示しているが、処理速度に大きな差があるので概略値としては間違っていないと思っている。

普通の Web サイトでは、数値計算を大量にすることは殆どなくて、データベースとのやり取りや文字列処理が中心なので、PHP 等のスクリプト言語でも十分に実用的である。しかし、ユーザーインターフェースを本当によくしようと思えば、計算量が飛躍的に増大するので、プログラム言語の選択は重要になってきている。

巷では PHP が人気のようだが、これから新しくプログラム言語を覚えるのであれば JavaScript の方がお勧めだと思うのだがどうだろうか。JavaScript の方が速度的にも遙かに優位だし、PHPだけではリッチなクライアントのプログラムをすることは不可能で、結局は JavaScript を使わないといけなくなる。一方、JavaScript だとクライアントでの親和性は抜群だし、サーバー側でも node.js を使えるので、JavaScript だけを覚えればサーバー側もクライアント側もそれだけで処理ができてしまう。

そういえば、PHP も JIT を実装する方向で動いているようだ。やはり処理速度は重要だということだろう。

最後に処理時間の計測方法についてメモしておく。C#については、「俺の言語がこんなに遅いわけがない!? 〜C, Java, PHP, Python, Rubyによるプログラミング言語 速度比較〜」の例にならって、以下のコンソールアプリケーションのプログラムを書いた。

class Program
{
    private const int N = 10000;
    static void Main(string[] args)
    {
        Console.WriteLine("C# start.");
        var sw = new Stopwatch();
        sw.Start();
        var result = new int[N];
        for (int count = 1; count <= N; count++)
            result[count - 1] = SumUp(count);
        sw.Stop();
        Console.WriteLine(sw.ElapsedMilliseconds + "ミリ秒");
        Console.WriteLine("C# end.");
    }

    static int SumUp(int n)
    {
        int sum = 0;
        for (int i = 1; i <= n; i++)
            sum += i;
        return sum;
    }
}

C#は、マイクロソフトが開発したプログラム言語で、Java や Delphi の影響を受けているといわれており 2000年に登場した比較的新しい言語である。マイクロソフトの言語と思われているが、ISO で標準化されており、最近では、Mono や Xamarin によって、Linux、Mac、iPhone、Android 等でも動作する。

テスト環境は、例と同じくアマゾン・ウェブサービス(AWS)の t1.micro インスタンスを使ったが、Linux ではなくて、Windows Sever 2008 の 32ビット版を使用した。Linux のように単純に time コマンドで時間を計測はできないので、PowerShell のスクリプトを次のように作成して起動させて時間を計測した。

$wmi = Get-WmiObject -Class Win32_OperatingSystem
echo $wmi.LocalDateTime
.\ProgramTest.exe
$wmi = Get-WmiObject -Class Win32_OperatingSystem
echo $wmi.LocalDateTime

測定結果は、実行時間が161ミリ秒で、計算部分だけだと53ミリ秒だった。例のJavaの場合、集計に long を使っているので、C# でも sum を int から long に変更すると、実行時間が187ミリ秒になり、Java より少し遅いという結果になった。C# と Java は処理方法が似ているので実行時間もほぼ同じということになると思われる。

次に、JavaScript の実行時間の計測だが、例の方法に準じてテストをするには node.js をインストールしてテストするのがいいと思ったが、今興味があるのはブラウザーでの処理なので、計算部分の処理時間だけで C# と比較することにした。

JavaScript に関しては、以下のページに公開しているので、ソースはそちらを見てください。また、実際にテストもできます。

自分のPCだと計算時間は、C#の場合で13ミリ秒、Chrome、IE11はともに 42ミリ秒~100ミリ秒で計算時間は安定していない。iPhone の場合は、C#73ミリ秒、Safari は約282ミリ秒だった。計算部分の処理時間については、概ねC#の4倍といったところだと思う。JavaScriptの場合は、計算部分の前後の処理については、下にPCの場合のタイムラインを表示しておくけどそれほど時間は要さないと考えられる。

image

なお、例の方のグラフでは、C の実行時間は255ミリ秒となっているが、Cで最適化オプションをつけてコンパイルすると58ミリ秒になったという記載があるのでそちらを採用している。

Computer Language Benchmarks Game での JavaScript と PHP の処理時間の比較

image

Apple Swift の人気が凄い

2014年6月9日

6月1日に「Google トレンドでみるモバイルアプリ開発ツールの動向」という記事を書いたのですが、翌日のWWDC2014で新言語 Swift が発表されて話題になっています。Google トレンドでみても下の図のように凄い人気度です。

Swift の公開で iPhone アプリの作成もかなりやりやすくなるようなので、今後 Web アプリとネイティブアプリとの競争が一段と激しくなるように思っています。

image

image