まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

2015/06

マウスコンピュータから販売された「格安 Windows スマホ」MADOSMA。とりあえず初回版の入手が出来て、1日弱使ってみたので、その感想を書きます。



まず「軽い」と感じました。日本のスマホには少ないのですが、東南アジアなどでたまに見る「背面がプラスチック」製です。悪くいえば「安っぽい」のですが、軽量化と加えてコスト削減には適していると思ってます。個人的にはこういう安いスマホをもっと日本でも買えるようにしてほしい。

コスパはまあいいと思います。SIM フリースマホ本体に 16GB の MicroSD カードまでついて3万円台前半。「3万円ちょっとで SIM フリースマホが(24ヶ月縛りとか関係なく)買える」という事実だけでもそこそこ需要があると思います。

冷静に考えると当たり前なのですが、標準ブラウザがモバイル版の IE なんですよね。そのせいなのか、自分の作ったウェブアプリも非対応でうまく表示されないものがあったりしました。そういうケースが想定されているのでこんなのも需要があるんでしょうね。

そして(正式アナウンスがあったわけではないですが)Windows Phone 10 のアップデートが予定されている、という情報も気になる所。現時点で日本で入手できる端末の中では唯一の Windows Phone 10 対応(予定)機なんじゃないかな?


そもそも Windows Phone にあまり興味のない人が買ってしまうと孤独感に苛まれる可能性が高い端末ではありますが、Windows Phone 目当てで買うとしたら悪くないんじゃないかと思います。




 

IBM が2015年3月にニューラルネットワーク型の人工知能 API を SaaS として提供していた AlchemyAPI 社を買収しました。早速 IBM Bluemix からも利用可能なサービスとして提供されています。Watson 同様、AlchemyAPI からも多くの種類の人工知能 Web API が提供されていますが、その中でも比較的話題としてはホットになりつつある Face Detection(顔認識) API を実際に PHP から使うサンプルアプリを作ってみました。


最初にこのサービスの内容を簡単に紹介します。まずはこちらのデモサイトにアクセスしてみてください:
http://www.alchemyapi.com/products/demo/face-detection

2015061701

実はこのままデモサイトを使いはじめることもできますが、タイミングによっては API の実行回数が1日の制限を超えて使えなくなっている可能性があります。問題なくデモが行えるよう、自分専用の API キーを取得しておきましょう。画面右上の "Free API Key" と書かれた箇所をクリックします。

するとこのような申し込み画面になります。名前やメールアドレス、利用目的などを入力しておきます:
2015061702


最後に Terms of Service を確認してチェックし、"REGISTER FOR API KEY" ボタンで登録します:
2015061703


しばらく待つと AlchemyAPI から登録メールアドレスにメールが届きます。その中に自分専用の API Key が記載されています。これをメモするなりして大切に保存しておきます。他の人に使われてしまうと、(無料枠の上限に達して)自分が使えなくなったりするので流出しないように気をつけましょう:
2015061704


ではこの API Key を使ってデモを試してみます。改めてデモサイトに行き、"Enter your own API Key" と書かれた箇所をクリックします:
2015061705


テキストフィールドが現れるので、メールで届いた内容を入力して "Enter Key" をクリックします:
2015061706


ボタンのキャプションが "Using Key" になれば成功です:
2015061707


では改めてデモサイトを使ってみます。並んだサンプル画像の中から一番右の、女性が二人並んだ画像をクリックします。このデモではクリックした画像の中にある顔を探して、その性別と年齢帯、そしてある程度の有名人であれば「誰か」まで含めて探す、というデモです:
2015061708


しばらく(数秒)するとこのような画面になります。指定した画像のどの位置にどのような属性の人の顔があったのかを示した画像が表示されます:
2015061709


この結果は "Visual" タブでしたが、"JSON" タブを選ぶと実際の API の返り値である JSON が表示されます。つまり API の結果は先程の画像ではなく、あくまで JSON です。この JSON の情報を元に(HTML5 や Canvas などを使って元画像と結果テキストを合成したりすることで)先程のような結果画像が生成できる、という点を注意してください:
2015061710


この JSON はこのような内容になっています。imageFaces の中に結果が(複数の顔を識別した時のために)配列で格納されており、画像のどの位置に顔があるかという情報に加えて、推測した年齢とその確率、そして推測した性別とその確率が含まれていることが分かります:
{
  "status": "OK",
  "usage": "By accessing AlchemyAPI or using information generated by AlchemyAPI, you are agreeing to be bound by the AlchemyAPI Terms of Use: http://www.alchemyapi.com/company/terms.html",
  "url": "http://demo1.alchemyapi.com/images/vision/mother-daughter.jpg",
  "totalTransactions": "5",
  "imageFaces": [
    {
      "age": {
        "ageRange": "55-64",
        "score": "0.413964"
      },
      "gender": {
        "gender": "FEMALE",
        "score": "0.982014"
      },
      "height": "88",
      "positionX": "134",
      "positionY": "40",
      "width": "88"
    },
    {
      "age": {
        "ageRange": "35-44",
        "score": "0.499654"
      },
      "gender": {
        "gender": "FEMALE",
        "score": "0.991837"
      },
      "height": "94",
      "positionX": "54",
      "positionY": "43",
      "width": "94"
    }
  ]
}

試しにもう一つ別の、1つ左の男性二人の画像をクリックしてみるとこのような結果になります。"Will Farrel" さんと "Chad Smith" さんだそうです。これはピンポイントに人物を特定できたケースです:
2015061711


このケースの JSON がこちらです。先程の結果には含まれていなかったのですが、"identity" 内に識別した顔が誰で、その確率と、他のその人物に関する情報が含まれていることが分かります。ある程度の有名人だとこんなこともできるんですね:
2015061712

なお、この API の詳細な情報はドキュメントを参照ください:
http://www.alchemyapi.com/api/face-detection/urls.html


さてデモサイトを使ってみてどんなことができる API なのかはなんとなくわかったのではないかと思います。では実際にこの API を使ったプログラミング例を紹介します。今回も PHP を使いますが、簡単な REST API を呼び出すだけなので、他の言語でも同様に記述することができると思います。

では IBM Bluemix にログインし、(PHP の)ランタイムを1つ作成してください。ここまでの手順がよく分からない場合はこちらのエントリを参照してください:

この例では dotnsf-facedetect という名前の PHP ランタイム(アプリケーションサーバー)を1つ作成しています:
2015061701


ではこの PHP ランタイム上で動かすアプリケーションを記述します。こんな内容の facedetect.php というファイルを自分の PC 上に用意しました。url=XXXX (XXXX は画像のURL)という形でパラメータを付けて実行すると、指定したパラメータの画像に含まれる顔を調べて結果を JSON のまま出力する、というものです。基本的には特定の URL に GET アクセスするだけなので、PHP だとラクチンです:
<?php
// API Key
$key = '(AlchemyAPI から取得した自分の API Key の値)';

// 結果
$json = 'No url parameter.';

// エンドポイント
$api = 'http://access.alchemyapi.com/calls/url/URLGetRankedImageFaceTags?apikey=' . $key
 . '&outputMode=json&knowledgeGraph=1&url=';

// パラメータ
if( isset( $_GET['url'] ) ){
  $url = $_GET['url'];
  if( $url ){
    $api .= urlencode( $url );
    $json = file_get_contents( $api );
  }
}

echo( $json );
?>

このファイルを cf ツールなどを使って PHP アプリケーションサーバー(ランタイム)上にプッシュします。Bluemix 上のランタイムである必要はなく、独自環境内の PHP サーバー上にコピーしていただいても構いません。

そして実行してみます。ネット上で「顔」で画像検索を行い、こちらの画像を見つけたのでこの画像の URL (http://howcollect.cdn-donuts.jp/files/20130130070521-1152-769_thumbnail.jpg)を使わせていただきます:
2015061702


先程アプリケーションサーバー上に転送した facedetect.php を url=http://howcollect.cdn-donuts.jp/files/20130130070521-1152-769_thumbnail.jpg というパラメータを付けて実行します。何やら JSON で結果が返ってきています:
2015061703


結果の JSON を見やすくするとこんな感じでした。93.7% の確率で女性、そして 92.8% の確率で18歳以下だそうです:
{
 "status": "OK",
 "usage": "By accessing AlchemyAPI or using information generated by AlchemyAPI, you are agreeing to be bound by the AlchemyAPI Terms of Use: http://www.alchemyapi.com/company/terms.html",
 "url": "http://howcollect.cdn-donuts.jp/files/20130130070521-1152-769_thumbnail.jpg",
 "totalTransactions": "5",
 "imageFaces": [
  {
   "age": {
    "ageRange": "<18",
    "score": "0.927939"
   },
   "gender": {
    "gender": "FEMALE",
    "score": "0.937027"
   },
   "height": "174",
   "positionX": "152",
   "positionY": "109",
   "width": "174"
  }
 ] 
} 

実際にはこの結果をちゃんとパースして値だけを取り出して、場合によっては元画像と重ねて表示したり・・という処理が必要になると思います。ただ API の実行までは簡単に実現できてしまいました。

AlchemyAPI では画像認識だけでなく、様々な種類のコグニティブ API が用意されており、全ての API が1つの apiKey につき1日に 1000 回まで無料で使えます(異なる種類の API を1回ずつ実行した場合は2回と換算します)。開発やテスト段階であれば充分な無料枠だと思います。もちろんこの条件を超えた使い方も有料サービスとして提供されています:
2015061704


AlchemyAPI の価格について、詳しくはこちらを参照ください:
Pricing - Alchemy API


先日、IBM Bluemix の利用料金を計算するカリキュレーターをブログで紹介しました:
IBM Bluemix の料金シミュレーター

で、
  「計算方法はわかったけど、実際の見積もりのサンプルが欲しい」
という声を約1名から聞きました。まあ1回実例を見ておくとわかりやすいですよね。
というわけで、早速サンプルを1つ作りました、ここで紹介します。

今回のサンプルは IoT ファンデーションを使った場合のアプリ料金です。Node-RED エディタは無料提供だし、Node.js ランタイムも無料枠があるので利用料金がかかるの? という疑問があるかもしれません。まあ開発段階では無料でできると思いますが、実用段階ではそうはいかなくなる、とご理解ください。以下詳細を説明します。

まず、この見積りをする上でいくつか前提条件を決めておく必要があります。今回 Node-RED エディタを使って作成する IoT アプリは以下の様なデバイスデータを収集するものであるとします:
 (1)センサーは50台
 (2)1つのセンサーが2秒おきに100バイトのデバイスデータを出力する
 (3)全センサーからのデータを集計目的で SQL Database に格納する、格納期間は1年間とする
 (4)開発費用は含めない(純粋に Bluemix の利用料金だけを計算する)

まずセンサーデータはどの程度の量になるでしょうか? 1つのセンサーが1回100バイトのデータを2秒おきに出力する、ということは1日に 43200 回出力することになります。そのデータ量は 100 x 43200 = 4320K バイトです。これが 50 台あるので 4320K x 50 = 216M バイト。1ヶ月を30日とすると、216M x 30 = 6.48G バイトのデータ通信が送られてくることになります。

今回の前提ではデータは1年間格納しておくことになっています。ということは貯めておくデータの総量(=データベースに必要なサイズ)は 6.48G * 12 = 77.76G バイトです。


ではまずこのデータを扱う Node-RED アプリケーションのランタイムに必要なスペックを考えます。実際にはきちんとテストして決める必要がありますが、仮にメモリ 2GB のサーバーが1インスタンス必要であるとすると、その月額料金は 7.35 * 24(Hour) * 30(Day) * 2(GB) = 10,584 円です(無料枠は別のアプリで使っていて、このアプリには適用されないものとします)。

次に複数台のセンサーデータを扱うには Node-RED フローエディタの QuickStart だけでは機能が足りません。IoT サービスを使うことになり、今回は50台なので月額 2,100 円のブロンズエディションが該当します:
2015061601

このブロンズエディションには月に 100MB までのデータ通信量が含まれています。今回のデータ通信量は上記のように月間 6.48 GB が見込まれます。つまり 6.38 GB 分がプランを超過します。超過分は 1MB あたり 1.05 円なので、このデータ通信にかかる料金は 1.05 x 6380 = 6,699 円です。

最後にデータベースです。今回の前提では 77.76 GB のデータを格納する必要があります。どのデータベースに格納するかによって価格は変わりますが、Node-RED フローエディタから簡単に使えることと、集計用データと考えると NoSQL だとクエリーが使えなくて色々不便なこともあると思うので、今回は SQL Database(DB2) で見積もります。このデータ量であればプレミアム・エディション1インスタンスが必要です(月額42,000円)。
2015061602


と、これで今回の見積もりに必要な全ランタイムおよびサービスの個別見積もりが出来ました。結論としては
 10,584 + 2,100 + 6,699 + 42,000 = 61,383
が1ヶ月に必要な料金、という結果が出せました。


IoT アプリケーションのコストを見積もる際の参考になったでしょうか? 要は無料枠内で済むような使い方をしている間はいいのですが、ある程度のデータ量が見込まれるようになるとランタイムも IoT ファンデーションもそれなりのスペックのものが必要になり、またデータを保存しておこうとすることによってデータベースも追加する必要が生じます。本格的な利用を想定すると、このようなデータ量に基づく見積もりも必要になってくる、ということになります。

#更に言うと、この例だとデータを1年間クラウドに保存する想定にしていますが、1年後のデータをどうするか?はプランに入れていません。バックアップを取るとして、そのバックアップデータをクラウドに保存するのか(その場合は追加料金)、手元に転送して自分たちで管理するのか(その管理方法は別途考える必要あり)、・・・という問題もあります。この辺りからは個別の事情の要素が大きくなってくるのでしょうね。


これは僕の個人的な見解でもあって、 Bluemix だけの話ではないのですが、DBのバックアップをクラウドに保存するのは(そのためだけの目的だとしたら)まだちょっとコスト高いかなあ、と感じてます。こういった辺りでオンプレミス連携が必要なんだろうなあ、と。



 

先日のブログエントリで IBM Bluemix の各サービスの運用状態を確認するためのエスタドを紹介しました:
Bluemix の各サービス運用状態を調べる

が、この中に入っていないサービスがあります。その1つが IDS(IBM Devops Services) です。IDS は IBM Bluemix のユーザーであれば誰でも無料で使うことができるウェブ上のプロジェクト管理&統合開発環境です。このサービスの運用状態はエスタドには表示されないようです。

で、どうやって運用ステータスを確認するかというか、専用のサポートページが用意されていました。まずこちらは
ステータス確認サイトです:
http://status.hub.jazz.net/
2015061601



一方、こちらは今後のメンテナンススケジュールです。あ、ちょうど明日朝にメンテナンス予定あるのね、調べておいてよかった(汗):
https://developer.ibm.com/devops-services/support/#maintenance
2015061602

 
これらと前述のエスタドを組み合わせて使うことで IBM Bluemix の運用状況を確認できることになります。
 

IBM Bluemix はサインアップから30日間は無料で全てのサービスをお使いいただけます(現在開催中のアプリケーション開発コンテスト Bluemix Challenge 2015 に参加表明していただくと、無料利用は90日間に延長されます)。 またこの無料期間終了後もクレジットカードを登録することで無償枠が設定され、その枠内で利用する限りは料金は発生しません。その方法について、詳しくは以下を参照ください:
IBM Bluemix をトライアル期間(1ヶ月)を超えても無料で使う


で、今日は無償ではなく、有償で(つまりは本格的なビジネスの話として)IBM Bluemix を使っていただく際の、その料金についての話です。


IBM Bluemix は基本的には従量課金制です。使ったサービスを使った分だけ、1ヶ月単位でお支払いいただく、というモデルです。まあこの形態自体は他のクラウドと同様だと思っています。

ただ少しわかりにくいかなあ、と思うのは「いろんなサービスが、それも IBM のものだったり、ビジネスパートナー様のものだったり、オープンソース製品だったりするサービスが提供されていて、それぞれの課金体系が異なるので、直感的に見積もりにくい」ことです。

例えばこんな構成例を考えてみます:
 1. Java アプリケーションサーバー x 1台(メモリ1GB)
 2. SQL DB(DB2) x 1台(データ2GB)

よくある「ざっくりとした」システム構成例だと思いますが、これで「1ヶ月の利用料金がだいたいいくらになるか」を見積もることがあると思います。或いは「データベースを SQL DB ではなく Claudant にしたら、どのくらい高くなるか/安くなるか」を知りたいこともあると思います。

ランタイム(アプリケーションサーバー)部分についてはともかく、Bluemix ではサービス部分の料金はサービスの種類によって異なります。「ざっくり」とした見積もりであってもそもそもの料金体系を頭に入れておくのが難しいのでした。

で、自分は普段どうしているかという話です。答としては料金カリキュレーター(シミュレーター)を使っています:
料金カリキュレーター


このサービスを使って上記構成例を見積もってみます。まずは Java アプリケーションサーバー(ランタイム)の見積もりです。メモリ 1GB の1インスタンス。本来は $48.3 ですが、他にランタイムを使っていなければ無料枠が使えるので、これらの情報を入力すると、その差額の $24.15 が表示されます:
2015061501



続けて SQL DB の見積もりです。こちらはデータ量が 2GB であれば small エディションでまかなえるので small インスタンスを1つ指定して、結果 $30 です:
2015061502



一方、Claundant の場合はこちら、ちょっとややこしくなります。データ量は 2GB なので無料枠内です。読み込み API も月間20万回であれば無料枠内。こちらは1000回単位(1000回につき$0.15)なので、20万回は 200 と指定します。で、その額は $0.15 X 100 = $15 です:
2015061503

というわけで、このケースでの月額料金は以下のようになります:
・Java ランタイム + SQL DB だと 24.15 + 30 = $54.15
・Java ランタイム + Claudant だと 24.15 + 15 = $39.15


料金カリキュレーターの使い方はこんな感じです。繰り返しますが、サービスの内容によって料金体系が異なる(上記のようにデータベースであってもデータ量だけで決まるサービスもあれば、API の実行回数まで含めて料金が決まるサービスもある)ので、まずはカリキュレーターを見て利用を考えているサービスの料金計算方法を確認した上で利用量を見積もって入力する、という流れになります。




このページのトップヘ