【python】睡眠時間管理するプログラム作った話

この記事は Aizu Advent Calendar 2017 の11日目の記事です

あぶすとらくと

pythonを使って日々の睡眠時間と起床時間を記録してグラフ化するシステムを作ってみたよ!

なぜ作ったの?

理由としては、

  • ここ数ヶ月ぐらい3時から4時就寝の生活が続いており、睡眠時間が死んでるのと単位がやばいので何とかしないとと思っていた

  • 睡眠時間を見える化して自分にプレッシャーを与えると結構いいらしい

  • 自分の使ってる睡眠管理アプリが2度寝した時に正確に記録できない

ということでじゃ自分で睡眠時間を記録できるもの作っちゃおうと思い立ち作ってみました

機能

具体的にはこんな機能を作成します

  • 標準入力からその日の就寝時間と起床時間を受け取る

  • 「8時30分」や「0:30」などどんなフォーマットで入力が来ても時間を取得できるようにする

  • 取得した就寝時間と起床時間を日付とともにcsvファイルに記録する

  • csvファイルから就寝時間と起床時間の推移をグラフイメージにプロットする

使ったもの

環境

開発言語

主なライブラリ

  • datetime (日付と時間のデータを扱うため)

  • pandas (データのcsvファイルへの読み書き)

  • matplotlib (グラフイメージ作成)

など

準備

pipでpandas,matplotlibライブラリをインストールしておく

実装

入力から時間を取得する関数

import re

ERROR = 0

# テキストから時間を抽出
def get_time(text):
    m = re.findall('[\d]+', text)
    if len(m) == 2:
        return m;

    return [ERROR,'何時かわかんないよ〜\nもう一度入力し直してね']

正規表現を使って文字列から数字を抽出します

import re正規表現を使うモジュールを読み込み、文字列の中のパターンとマッチする部分をすべてリストとして返すfindall関数を呼びます

引数[\d]+textから1つ以上の連続した数字を検出します

時、分をリストの要素として受け取るため、取得したリストの長さが2以外ならエラーを返します

csvファイルに日付、就寝時間、起床時間を記録する関数

import os
import pandas as pd
from datetime import date

CSV_PATH = "./timedata.csv"
today = date.today()

# csvファイルに時間を記録
def write_csv(sleep_time, wakeup_time):
    
    if not os.path.exists(CSV_PATH):
        # データフレームを作成
        df = pd.DataFrame(
            [[today, sleep_time, wakeup_time]],
            columns=['Date', 'Sleep_Time', 'Wake_Up_time']
            )
        df.to_csv(CSV_PATH, index=False, encoding="utf-8")
    else:
        w = pd.DataFrame([[today, sleep_time, wakeup_time]])
        w.to_csv(CSV_PATH, index=False, encoding="utf-8", mode='a', header=False)

最初にdatetimeモジュールのdate.today()で記録日の日付を取得しておきます

csvファイルが存在していない場合は新規作成します

その場合、データフレームを作成し、列のindexとして日付(Date)、就寝時間(Sleep_Time)、起床時間(Wake_Up_time)を指定し、to_csv関数でデータフレームをcsvファイルとして書き込みます

既にcsvファイルがあれば、データフレームに取得した日付、就寝時間、起床時間のデータを入れ、csvファイルに追記します

追記する場合はオプションでmode='a' header=Falseを追加します

csvファイルからグラフイメージを作成する関数

import pandas as pd
import matplotlib.pyplot as plt

CSV_PATH = "./timedata.csv"

# グラフイメージをプロット
def plot_graph():
    csv = pd.read_csv(CSV_PATH)
    plt.plot(csv.Date, csv.Sleep_Time, label='sleep time')
    plt.plot(csv.Date, csv.Wake_Up_time, label='wake up time')

    plt.legend()
    plt.savefig("./graph.png")

read_csv関数でcsvファイルをデータフレームとして読み込み、plot関数のx軸に日付、y軸に就寝時間と起床時間を指定し、分かりやすいように凡例名(label)を指定しました

余談ですが、このplot関数に日付を入れる時にdatetimeオブジェクトを作成して指定するとなぜか日付が小数値で出力されるという現象が起こり、半日ぐらいハマってました...

最終的にcsvの日付をとりあえず突っ込んでみたらちゃんと表示されてるし、なぜだろう...

話を戻して、次のlegend関数でグラフの凡例をつけています

最後にsavefig関数でグラフイメージを保存します

全体の実装

import os
from datetime import date
import datetime
import re
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

CSV_PATH = "./timedata.csv"
ERROR = 0

today = date.today()


# csvファイルに時間を記録
def write_csv(sleep_time, wakeup_time):
    
    if not os.path.exists(CSV_PATH):
        # データフレームを作成
        df = pd.DataFrame(
            [[today, sleep_time, wakeup_time]],
            columns=['Date', 'Sleep_Time', 'Wake_Up_time']
            )
        df.to_csv(CSV_PATH, index=False, encoding="utf-8")
    else:
        w = pd.DataFrame([[today, sleep_time, wakeup_time]])
        w.to_csv(CSV_PATH, index=False, encoding="utf-8", mode='a', header=False)


# テキストから時間を抽出
def get_time(text):
    m = re.findall('[\d]+', text)
    if len(m) == 2:
        return m;

    return [ERROR,'何時かわかんないよ〜\nもう一度入力し直してね']


# グラフイメージをプロット
def plot_graph():
    csv = pd.read_csv(CSV_PATH)
    plt.plot(csv.Date, csv.Sleep_Time, label='sleep time')
    plt.plot(csv.Date, csv.Wake_Up_time, label='wake up time')

    plt.legend()
    plt.savefig("./graph.png")


if __name__ == '__main__':
    
    count = 0
    sleep_time = datetime.datetime.now()
    wakeup_time = datetime.datetime.now()

    while count < 2:
        if count == 0:
            print('昨日の就寝時間を入力してください')
            input_str = str(input())
            time = get_time(input_str)
        else:
            print('今日の起床時間を入力してください')
            input_str = str(input())
            time = get_time(input_str)

        if not time[0]:
            print(time[1])
            continue

        #時間を整形
        if len(time[0]) == 1:
            time[0] = '0' + time[0]
        if len(time[1]) == 1:
            time[1] = '0' + time[1]

        if count == 0:
            str_time = time[0] + ':' + time[1] + ':00'
            sleep_time = datetime.datetime.strptime(str_time, '%H:%M:%S')
            sleep_time = sleep_time.time()
        else:
            str_time = time[0] + ':' + time[1] + ':00'
            wakeup_time = datetime.datetime.strptime(str_time, '%H:%M:%S')
            wakeup_time = wakeup_time.time()
    
        count+=1
    
    write_csv(sleep_time, wakeup_time)
    plot_graph()

全体として上記のような実装になっています

mainのコードでは主に就寝時間と起床時間の入力を施し、時間を取得してフォーマットを整形ののちcsvファイルにデータを保存する関数とグラフイメージを作成する関数を呼ぶという流れになっています

結果

Date Sleep_Time Wake_Up_time
2017-12-04 03:27:00 09:10:00
2017-12-05 02:44:00 08:24:00
2017-12-06 03:48:00 09:14:00
2017-12-07 04:44:00 09:55:00

f:id:sansuke05:20171207143314p:plain

現状ひどいですね...😅😅

おわりに

pandasやmatplotlibはデータ解析用のライブラリで今回は触りぐらいしか使ってませんが、調べてみるとかなり奥が深かったです

現状のプログラムだと多分飽きて使わなくなるだろうと思うので、現在開発中のTwitter Botからリプがくるようにするようなシステムを考案中です

カムバック!!朝型生活!!

参考にしたサイト

qiita.com

qiita.com

qiita.com

【fish】ターミナル環境をかっこよくしてみた話

こないだターミナルの環境を色々と変更して自分的にけっこういい感じになったので紹介

具体的にはMacにiTermとfishとfishermanを導入していろいろやったって感じです

きっかけ

大学の勉強会で後輩の子のMacをさわらせてもらったときに自分のデフォルトのターミナルと全然違ったので「すげー!俺もこんないい感じのターミナル使いてー!」ってなったのがきっかけです

その後輩の子から、iTermっていう端末エミュレータ使っているということを聞き、早速導入してみることに

完成形

最終的にこんな感じになるのを目指します

iTermって何?

Macのデフォルトのターミナルは標準的な事は出来るものの少し物足りないことがあります。そんな時にオススメなのがiTerm。 画面の色を変えるのは勿論、色々便利な機能が盛り沢山です。

MacのターミナルアプリにはiTermがオススメ - Qiita より引用

らしいです

まぁ、デフォのターミナルよりいい感じにできるよって感じの端末エミュレータですかね

iTermの導入

まずは iTerm なるものをここからインストールします

f:id:sansuke05:20171103105318p:plain

ダウンロードして来たiTerm.appを開くとこんな画面が出るのでMove to Applications Folderを選択

これでとりあえずiTermが使えるようになりますが、デフォだとあれなので設定を変えます

iTerm2 -> Preference -> Profiles -> Colors -> Color Presets でカラースキームを設定することができます

デフォルトでもいくつか用意されていますが、Visit Online Galleryでカラースキームが配布されているページから取ってくることもできます

自分は今のとこデフォのTango Darkを使っています

f:id:sansuke05:20171103111627p:plain

とりあえず、ここまででこんな感じになりました。

ん、あんま変わってないって?

これからですよこれから

fishの導入

iTermと一緒にzshを入れようという記事は結構出てくるのですが、自分のzshのイメージが初期設定が色々めんどくさそうだしちょっとzsh使うのはなーと思ってたので、zshの代わりになりそうなshellを探したところfishなるshellがあるらしい

なんと、fishはとりあえず入れるだけでかなり便利な機能が使えるらしくプラグインも簡単に入れられるそうなので、これは使うしか!と思って入れてみました

インストール

homebrewでインストールします

$ brew install fish
$ fish -v
fish, version 2.6.0

これでインストールできたのでデフォルトシェルを変更します

$ sudo vim /etc/shells   #  末尾に /usr/local/bin/fish を追加
$ chsh -s /usr/local/bin/fish 

iTermを再起動すると色々変わってると思います。

設定ファイルはbashzshなどとは違い、~/.config/fish/config.fish のパスになります

Fishermanの導入

fishにはoh-my-fishというfishのパッケージ管理フレームワークがあるのですが、古いとか著作権問題がどーのこーので停止してたとか結構ディスられてました

そこで、Fishermanというプラグインマネージャーがいいということだったので、Fishermanを導入してみることに(なんと日本語対応のクイックスタートガイドもあるとのこと)

インストール

curlで以下を叩く

$ curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs git.io/fisherman
$ fisher -v
fisherman version 2.13.2 ~/.config/fish/functions/fisher.fish

テーマの変更

Fishermanからテーマをインストールします

オススメのプラグイン導入とかも書きたいですが、今回は見た目をかっこよくすることが目的なのでそっちの方は省きます。

今回はagnostrというテーマをインストールしました

元々oh-my-fishのテーマらしいのでomf/をつけて、テーマ名の前にtheme-を書きます

$ fisher omf/theme-agnoster

これでテーマが変更されましたが、記号が文字化けしてしまいます

これを解決するためPowerline fontsをインストールします

$ git clone https://github.com/powerline/fonts.git
$ cd fonts/
$ ./install.sh

インストールしたフォントをiTerm2に設定します

設定画面のフォント名を以下のように変更します

f:id:sansuke05:20171103125445p:plain

フォントサイズは自由ですが、自分は13ptにしています

コマンドのカラーを変更する

最後にコマンドのカラーを変更します

fishではこういった設定は

$ fish_config

でローカル環境でサーバが起動しWebブラウザから設定できます

f:id:sansuke05:20171103130203p:plain

現在の自分の環境では、fish defaultからパスの色を緑、コメントの色をオレンジに設定して使っています

完成

これで、上で紹介したような見た目になったかと思います。

iTerm、fish、Fishermanには他にも便利な機能やカスタマイズができますので、ぜひ自分のお気に入りのターミナル環境を構築してみてください

--- 追記 ---

なんかデフォルトシェルをfishにしてしまうとdockerとか使うときにまずいという話を聞いたので、デフォルトシェルはbashのままでbashからfishを起動してくれる方法も追記しておきます。

まず、デフォルトシェルをbashに戻します。

$ chsh -s /bin/bash

そして、.bashrcに以下の1行を追記すればiTerm起動時にbashからfishを起動してくれます。

exec fish

参考

qiita.com

qiita.com

jnst.hateblo.jp

fishの設定ファイルなどはGitHubの方からも見れます。

Mashup Awards 2017 会津予選に参加してきました。

「ブログを書くまでがハッカソンです!」

あれ、なんか1ヶ月ちょっと前にもおんなじようなことをmi○iさんで聞いたような…

まぁそれはさておき、10月29日から30日の2日間に会津大学で開催された Mashup Awards 2017 の会津予選に参加してきました。

大学1年生の頃に初参加して毎年参加してて、これが3回目の参加でした。

結論から言うと、特に賞などはもらえませんでしたが、とても有意義なイベントだったんじゃないかなと思います。

1日目

イデア決めからのチームビルディング

初日は、まず各企業の方から提供される技術説明と、アイデア出し、チームビルディング、ハック開始というふうに進行していきました。

私は、今回は特に作りたいものやチームも最初から決まっているわけではなかったので、その場でアイデアを考えてチームビルディングまで行いました。

チームは後輩の2年生2人と作ることになったのですが、その時考えていたアイデアがもう既に実現されていそうなものだったのでチームでアイデアの練り直しを行い、自分が雨の日に歩きだったりで大変という思いがあったので、最終的に大学内でUberみたいなサービスを作ろうというアイデアに決まりました。

役割分担は、自分がAndroidが書けて、2年生2人がサーバーができるということだったので、自分がクライアントで他2人がサーバーサイドの開発という感じでとりあえず開発に取りかかりました。

そう…この時もっとシステムの要件を考えておけばと後々後悔することになろうとは知らずに…

ハック

とりあえずクライアントで、今回のもっともアピールできるであろう、ドライバーのリストを表示して載せて欲しい人にリクエストを送るところをまず実装しようと作業に取りかかりました。

その頃、サーバーサイドの方は開発言語をPHPにして、環境構築をしていたのですが、結構手間取っていたので、先にモックをいくつか完成させてから一緒にテストできるぐらいの感じになるかなーとこの時は考えていました。

しかし、サーバーの環境構築が終わり、いざAPIの仕様を考えてみると、現在位置情報の取得やログイン処理用の画面など、必要な機能がどんどんインフレしていき、クライアントの方で開発が追いつかなくなるんじゃないかという感じになって1日目を終えることになりました。

2日目

2日目は15時半まで開発を行い、それから各チームのプレゼン、プロダクトの体験会、結果発表、懇親会という感じの進行でした。

開発の方は、前日なんとかドライバーの登録画面まで作成していましたが、現在位置情報がうまく取得できずに悪戦苦闘を強いられていました。

サーバーサイドのAPIやデータベースの方は、環境構築こそ大変だったものの、結構順調に作成しているようで、昨日とは打って変わってクライアントの方の進捗をかなり心配されていました。

最終的に、トップ画面、ドライバー情報の取得、ドライバの出発情報登録(モック)、会員登録(モック)というところまで作成しました。本当は乗りたい!というボタンを押して通知がいくという、一番会場で「おー!」となりそうなとこを作りたかったですが、ボタンが反応しないバグが出たり、通知方法の作成が大変だったりして、そこまで完成に至りませんでした。

感想

今回のハッカソンは、短期間でチーム開発する上で色々と課題が出て、それを意識するいい機会になったなと思います。

具体的には

  • 開発の前に仕様をしっかりチームメンバーが共有する
  • 時間がないので、何を優先的に作るのかといった優先順位をつける(今回だとプレゼンでいい感じになりそうな乗りたいボタンからの通知の実装)
  • 役割を超えた円滑なコミュニケーション(今回はサーバーサイド同士はよく話せていたが、クライアントとサーバーサイドの意思疎通があまりできていなかった)

などなど

今後、学内でチーム開発するプロジェクトも控えているので、今回学んだことを是非とも生かしていけるようにしていきたいと思います。

そして何より、2日間大変だったけど、とても楽しかった!

来年ももし時間があったらまた参加したいと思います!

【python】ドールのTwitterBotを作った話 1

ドールはいいぞ!

うちにはドールが2人います。

そのうちの1人、そらという名前の身長50cmのドールがいます。

f:id:sansuke05:20171011002635j:plain

1年と半年ほど前にお迎えしてからというもの、日々可愛がっているのですが、なんか普通にTwitterに写真上げるだけだと面白くないな〜と最近少し思う節があって、そらをもっと知ってもらって写真で癒しを届けられるいい方法ないかな〜と思っていました。

そんな時、丁度Twitterで近頃絡んでる人たちが自分の創作キャラでTwitter Botを作っているというのを知って、「これドールのそらでやってみたら面白いんじゃね?」と思い立ち、うちのそらでTwitter Botを作ることにしました。

どんなBotにするか?

まず、Botのそらにどんなことをさせたいかを考えてみました。

とりあえず、定期的な日々のつぶやきは欲しいのと、リプライ、TLへの反応などのTwitterにいる標準的なキャラクターBotの機能は欲しいなと。

後は、目的が「知ってもらう」「癒しを届ける」なので、定期的な写真ツイートとリプライと一緒に写真も届けられるといいなという感じになりました。

とりあえずコード書いてツイートしてみる

どんなBotにするか決まったとこで、とりあえずプログラムの方からツイートするまでのコードを実装してみました。

言語はPythonでやりました。

使ったもの

準備

Twitter Appにアクセスして以下4つのキーを取得しておきます。

  • Consumer Key
  • Consumer Secret
  • Access Token
  • Access Token Secret

また、pipでtwitter-pythonライブラリを導入しておきます。

$ pip install twitter

コーディング

とりあえずsora.pyという名前で作りました。 APIキーは./system/conf.pyから呼び出しています。

import twitter
from system import conf

auth = twitter.OAuth(
    consumer_key=conf.CONSUMER_KEY,
    consumer_secret=conf.CONSUMER_SECRET,
    token=conf.ACCESS_TOKEN_KEY,
    token_secret=conf.ACCESS_TOKEN_SECRET,
    )

t = twitter.Twitter(auth=auth)

def tweet():
    status = "this is test tweet" #投稿するツイート
    print(status)

    f = t.statuses.update(status=status)
    print(f)

tweet()

./system/conf.py

# -*- coding: utf-8 -*-

CONSUMER_KEY = ' xxxx '
CONSUMER_SECRET = ' xxxx '
ACCESS_TOKEN_KEY = ' xxxx '
ACCESS_TOKEN_SECRET = ' xxxx '

コードはこれだけです。ライブラリありがたや…

結果

こんな感じでツイートしてくれました。

これから

とりあえず長くなるのもあれなので続きは別記事で書こうかなと思います。

参考

以下のサイトを参考にさせてもらいました。

mhr380.hatenablog.com

qiita.com

また、ソースコードの方もGithubの方で公開しています。ソースコードはMITライセンスです。

mixi の git challenge に参加してきました。

「Blog に書くまでが git challenge です」

ということらしいので、mixiで開催された git challenge に参加してきましたので感想など書こうと思います

参加に到るまで

git challengeを知ったのは大学で行われたインターンシップ説明会に来られていたmixiの方から、git challengeっていうイベントやってるよと紹介されたのがきっかけでした

最初は、そんなのあるんだーぐらいで考えてましたが、丁度実家から東京に戻ってくる時期と被ってたので、じゃぁ参加してみるかと締め切り前日に決めて応募しました(前日まで忘れてたので間に合ってよかった…)

git challenge 当日

mixi本社に11時集合でしたが、なぜか前日Streaming APIいじろうとか思い立って深夜までいじってたせいで渋谷駅にギリギリ到着&駅で迷うというハプニングで15分遅れでの参加でした

まずはmixi社内でどうgitが使われているかの説明があった後、git challengeのチュートリアルがありました

その後、ランチをとって、いよいよワークが始まりました

問題は、難易度ごとに星の数で表されており、★1つから★5つ(★6まであったかも?)の問題まで用意されていました

普段add,commit,pushぐらいしかやってない人なので、相方の人とも話し合ってとりあえず★1つの奇数問題から挑戦しました

が、まず1問目からハマりました

あまり詳しいことは書けませんが、fast forwardでマージしてはいけないことに気づかず悩んで時間を取られてしましました

その他にも、コミット履歴を変更する問題や、コミットを1対1対応させる問題などを解き、最終的に自分は4問ぐらいしか解くことができませんでしたが、相方の方がかなり解いてくださって、途中経過で1位になることもあったので、相方の方には本当に感謝です

そして、あっという間にワークの方も終了し、問題解説となりました

解説聞いてて、え、あれ引っ掛けだったの?とかこのコマンド知らないなぁというものが多くあり、Git奥が深いなぁと思いました

その後懇親会があり終了という形でした

感想

ざっと1日どんなことがあったか書いてみました

事前に公開されていた練習問題もやっていたせいか、似たような問題を解けるようになってたのはよかったなと思いました

しかし、まだまだGitの知識が浅く、もっと勉強しないとなぁということを痛感した一日でもありました

また、昼休みや懇親会で、他大学生やmixiの若手社員の方と話ができ、就活のことや、他大学生がどんなことやってるのか、好きな技術の話、そして、mixi内での開発がどのように行われているのかなど、普段聞けないような貴重な話も聞くことができ、とても為になったし楽しかったです

中々に濃厚な一日で、参加してよかったなと心から思えるイベントでした

AndroidからEmotion APIを使ってみる

7/28から7/30に開催された石巻ハッカソンに参加してきました。

そこでAndroidからMicrosoft Cognitive Services のEmotion APIを使うことがあったので、その時のメモとして書いておこうと思います。

実装にあたって以下のサイトを参考にしました。

qiita.com

qiita.com

 

公式の実装サンプルにjavaのコードはあったのですが、Android6.0からApache HTTP Clientのサポートが切られているため、HttpUrlConnectionを使う必要がありました。

 

準備 

APIの利用にはSubscription Keyが必要になるため、ここからMicrosoftアカウントでログインしてSubscription Keyを取得します。

HTTP通信を行うので、INTERNETパーミッションを追加しておきます。

<uses-permission android:name="android.permission.INTERNET" />

 

実装例

 まず、通信用のスレッドを立てるためにAsyncTaskを継承したクラスを作成します。

public class ConnectToEmotionAPI extends AsyncTask<Void, Void, JSONObject> {
    @Override
    protected void onPreExecute() {
    }
    @Override
    protected JSONObject doInBackground(Void... params) {
    }
    @Override
    protected void onPostExecute(JSONObject result) {
    }
}

Emotion APIから画像を分析した結果がJSONで返ってくるので、doInBackgroundの戻り値はJSONObjectにします。

次に、doInBackground内に通信処理を書いていきます。

HttpURLConnection con = null;
URL url = null;
String urlStr = "https://westus.api.cognitive.microsoft.com/emotion/v1.0/recognize";
String key = "{Your Key}";                  //Subscription Key
DataOutputStream os = null;
BufferedReader reader;
JSONObject json = null;

try {
            url = new URL(urlStr);
            con = (HttpURLConnection)url.openConnection();
            con.setReadTimeout(10000);
            con.setConnectTimeout(20000);
            con.setRequestMethod("POST");
            con.setDoInput(true);
            con.setDoOutput(true);
            //リクエストヘッダーの設定
            con.setRequestProperty("Content-Type", "application/octet-stream");
            con.setRequestProperty("Ocp-Apim-Subscription-Key", key);

            // リクエストボディの作成
            Resources r = main_.getResources();
            Bitmap bmp = BitmapFactory.decodeResource(r, R.drawable.face_small);

            // 画像をバイナリデータに変換
            byte[] byteArray;
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            bmp.compress(Bitmap.CompressFormat.JPEG, 100, bos);
            byteArray = bos.toByteArray();

            os = new DataOutputStream(con.getOutputStream());
            for(int i =  0 ; i < byteArray.length;i++){
                   os.writeByte(byteArray[i]);
            }

            // APIに接続
            con.connect();
            os.close();
            
            int status = con.getResponseCode();

            switch (status) {
                case HttpURLConnection.HTTP_OK:
                    InputStream in = con.getInputStream();
                    reader = new BufferedReader(new InputStreamReader(in));
                    String line;
                    String readStr = new String();

                    while (null != (line = reader.readLine())){
                        readStr += line;
                    }
                    Log.d("EmotionAPI","read string: " + readStr);

                    in.close();

                    json = new JSONArray(readStr).getJSONObject(0);
                    break;

                case HttpURLConnection.HTTP_UNAUTHORIZED:
                    break;
                default:
                    break;
            }

} catch (MalformedURLException e){
            e.printStackTrace();
} catch (JSONException e){
            e.printStackTrace();
} catch (IOException e){
            e.printStackTrace();
}

return json;

画像を送信するにあたり、バイナリデータで送信するため、ByteArrayOutputStreamを使用します。

返ってくるJSONは配列形式なのでJSONArrayを使ってJSONをパースします。

最後にonPostExecuteで取得したJSONをオブジェクト名ごとにパースしています。

    @Override
    protected void onPostExecute(JSONObject result) {
        super.onPostExecute(result);

        JSONObject jsonData;
        String[] str = new String[2];
        try {
            jsonData = result.getJSONObject("scores");
            str[0] = jsonData.getString("happiness");
            str[1] = jsonData.getString("anger");
        } catch (Exception e){
            e.printStackTrace();
        }

        if (isSmile(str[0])) {
            Log.d("EmotionAPI","素敵な笑顔です!");
        } else if (isAnger(str[1])) {
            Log.d("EmotionAPI","そんなに怒らないでくださいよ~");
        } else {
            Log.d("EmotionAPI","つまんないです。何かリアクションしてください");
        }
    }

    public boolean isSmile(String strValue){

        double value = Double.parseDouble(strValue);
        if (value > 0.5) return true;
        else return false;
    }

    public boolean isAnger(String strValue){

        double value = Double.parseDouble(strValue);
        if (value > 0.5) return true;
        else return false;
    }

ハッカソンで実装したコードの方はGitHubに公開しているので、全体の実装の方はそちらをご覧ください。

github.com