月別アーカイブ: 2016年2月

【Android】HTTP通信がSPモードフィルタに引っかかる

以前紹介したOKHttpを用いたサーバとのHTTP通信ですが、普段使いの端末ではやたら長いHTMLタグの羅列がレスポンスとして返ってきます。

こんな感じ。

Screenshot_2016-02-25-02-45-33

文字列が長過ぎて見切れてしまっているのでAndroid Stutio上のログを確認。すると

「アクセス制限エラー http://www.xxxにアクセスできません」

の見慣れた文字が。

どうやら未成年Docomoユーザならお馴染みのSPモードフィルタによってサーバとの接続が制限されているようです。

フィルタリングサービスは携帯の契約時に加入させられ、その後成人しても解除せずにずるずると使い続けています。まさか自作で立てたサーバが制限対象になるとは思いませんでした。

他の開発者さんはどうやって対策をしているのでしょう。どこかに申請すればフィルタリング対象から外してもらえるとか?ググってもしっくりくる情報が得られません。

とにかく、アプリ開発時にHTTP通信を行う際にはフィルタリングに引っかからないように手を打つ必要があるようです。せっかくアプリをダウンロードしてもらっても使えないんじゃ意味無いですからね。

アプリ開発 打ち切りの危機

インターネッツ巡りをしていたらこんなニュースを見つけてしまいました。

Google、機械学習で向上していく画像認識Google Cloud Vision APIがβ版

内容はタイトル通り。googleから画像認識/分類APIである「Cloud Vision API」がβ版として公開され、利用者登録さえすれば誰でも使えるようになりました。

ここ数日でCloud Visionに関する日本語サイトがポンポン上がっておりエンジニアたちの関心の的になっているようです。

で、何故このブログで取り上げたかというとCloud Visionは現在開発中のアンドロイドアプリの上位互換になってしまうからです。

そもそも開発中のアプリでは、

①アンドロイド端末上で、写真撮影/ギャラリーから画像選択してサーバにアップロード

②サーバ側で画像分類ソフト「Caffe」を用いて画像を分類する

③結果をアンドロイド端末で表示する

を行おうと考えていました。

今日では様々な機械学習のライブラリや画像分類ツールがオープンソース化されています。しかしどれも専門的知識を要したり、導入が面倒だったり、動かせる環境が限られたりと何かしらの難点があるように思えます。

誰もがスマホで手軽に画像分類を試せるようになってほしい。沢山の人に機械学習の凄さを知ってほしい。あわよくば一儲けしたい。

そう思ってこの画像分類アプリの開発に着手しました。

ところが今述べたことは数日前に公開されたCloud Visionのサンプルプロジェクトで実現できてしまうんです。ダウンロードしたサンプルプロジェクトをAndroid Studioにインポートし、取得したAPIキーの名前をコード中に書き込むだけで画像分類可能。そのうちCloud Visionを用いたアプリがPlayストアに並ぶことでしょう。

このまま開発を進めてもGoogleのAPIに太刀打ち出来きるとは思えません。Cloud VisionはGoogleが提供する学習データを使うのに対しCaffeは自分でデータを用意する事ができるため、分野を限定してより精細な分類をすることができれば差別化出来るのでしょうが、果たして現実味があるかどうか。

とにかく今後の方針を考えなおさなければいけないですね。ここで開発を放り投げるのか突き進めるのか。それともCloud Visionを使ってまた別のことに挑戦するのか。

これは現実逃避してないで就活に専念しろってことですかね…。

【Android】プログレスダイアログ(処理待ちのぐるぐる)を表示する

以前こちらの記事で端末内のデータをサーバに送信するためのコードを書きましたが、処理を開始してから結果が返ってくるまで若干時間がかかってしまいます。ボタンを押しても画面が白いままでは味気ないので処理中にプログレスダイアログを表示することにします。

参考にさせていただいたサイトはこちら

技術脳塗 非同期(スレッド)処理中にプログレスダイアログを表示する (シンプル)
https://sites.google.com/site/technoute/android/thread/thread_progress

上記サイト中の青文字の部分を自分のプログラムにコピペしただけで動きました。Nexus 5のエミュレータ上ではこのように表示されます。
amarecco0046

 

蛇足かもしれませんがコードも載せておきます。参考サイト中のコードはとてもシンプルでわかりやすいのですが、そこから更にプログレスダイアログ以外の部分を削げ落としております。とりあえず動かしたい人向けです。

【PHP】Android上でPHPスクリプトの実行に手間取った話。

開発中のアンドロイドアプリにてサーバにアクセスし、phpスクリプトを実行して結果を表示する機能を実装しようと試みました。

スクリプト内では外部コマンドを実行する関数(shell_exec)を使ってpythonのスクリプトを動かしています。このphp、ターミナル上では問題なく実行できるのですが、アンドロイドでは上手く行かず端末の画面は真っ白のままです。

原因を探るためにshell_execの部分に「2>&1」オプションを追加しました。

echo shell_exec( 'python ファイル名.py 2>&1' );

コマンド実行時にエラーが発生した際、通常はnullが返ってくるのですが「2>&1」オプションをつけるとエラーメッセージが返ってきます。

オプション追加後アンドロイドから実行すると画面には「ImportError: No module named xxx」と表示されるようになりました。どうやらモジュールのインポートに失敗しているようです。

恐らくですが、アンドロイド端末からの実行の際にはPYTHONPATHの設定が適用されないのだと思います。

そこでpythonスクリプトに以下の文を追加しました。

import sys
sys.path.append("/xxx/xxx")

/xxx/xxxにはエラーメッセージ中に書かれていたモジュールが格納されているディレクトリの絶対パスが入ります。これを記述することでライブラリを読み込むディレクトリのパスをpythonスクリプト内から指定できます。

これでようやくアンドロイドアプリでphpスクリプトの実行ができるようになりました。

【Android】OKHttpで画像ファイルをPOSTする

OKHttpを使ってjpegファイルをサーバにアップロード出来るようになったのでコードを載せておきます。

コメントが付いている部分だけ変更すればとりあえず動くはずです。コメント無いところはおまじないです。

サーバ側のPHP
ファイルを受け取ったら自身と同じディレクトリに保存する。