ほぼPython

Not技術ブログBut勉強ブログ 内容には誤りがあることが多いです

ツイート数を可視化するWebアプリケーションを作った

Pythonの勉強を始めてから6回目の制作です。これまでは、コードだけを書くのが基本でしたが、今回は実際にユーザーが使えるようなものを作ろうと思い、Webアプリケーションの作成に取り掛かりました。

今回作ったWebアプリケーションは「任意のユーザーの特定の期間における曜日ごとのツイート数を棒グラフとして可視化する」ものです。

 

 

目次

 

 

【Webアプリケーションの紹介】

 

概要

トップページはこんな感じです。

f:id:short_4010:20180223165905p:plain



分析したいユーザーのTwitterIDを入力して分析期間を選択すると分析します。

 

PCから見たときの理想の結果画面はこんな感じです。

 

f:id:short_4010:20180223165613p:plain

 

自分のPC以外からみるとレイアウトが崩れてるかもしれません。あと、スマホ版はこれらのグラフをすべて縦に並べました。(残念ながらIEでは表示されないっぽいです)

任意のユーザー名を入力すれば、その人の特定期間の曜日ごとのツイート数をグラフとして見ることができます。デザインをなんとかしようとしているときに、棒グラフだけだと寂しかったので曜日ごとのツイート数の割合と、その期間でよくリプしたユーザー名も表示するようにしました。

 

サイトへはこちらから。(読み込みに時間がかかりリンク先がNot Foundと表示されますが、ちゃんとあります。そして、かなり重いです。いつか改良します。)

statwit.herokuapp.com

 

新規性

ツイートの可視化サイトはいくらでもありますが、「期間を指定して」「曜日ごとのツイート数を」「任意のユーザーに対して」「棒グラフで表示」するというすべての条件を満たしたグラフ化サイトはちょっとググっただけでは出てこなかったです。特に「期間指定」かつ「曜日ごとにグラフ化」というところがポイントです。

 

想定している用途

生活スタイルの予測に使えるかなあといった感じです。例えば、友達がいる人は平日のお昼の時間帯にツイート数が多くなることはなかなかないと思います。なぜなら友達とご飯を食べておりなかなかツイートする時間がないからです。しかし、友達がいない人はお昼こそ暇でツイート数が増えると思います。なので、グラフから、そのユーザーが友達が多いか少ないかを推測できるわけです。こんな感じで、ツイートだけからは読み取れないようなその人の行動などを曜日ごとのツイート数のグラフとして表すことで読み取ることができるんじゃないか、そんな感じです。(まあ本音を言えば、webアプリを作る勉強って感じなんで実用性はほぼ0ですけどね)

 

 

【技術的な話】

 

サーバーサイドの話

Pythonのプログラムをどうやってサーバーサイドの言語として使うのか、これを調べるのにすこし時間がかかりました。

 

PHPはHTMLに埋め込めましたが、Pythonではそれが出来なかったので、どうすればいいんだ?という感じでした。

 

最初はPython対応のレンタルサーバーに直接アップロードして使うことを考えていました。しかし実際にPython対応のレンタルサーバーにアップロードしてみると、たしかにPythonを使うことはできたのですが、モジュールのインポートがうまくいかず、まったく使えませんでした。

 

次に、DjangoというWebアプリケーション用のフレームワークがあることを知ったので使おうと頑張ってみました。しかし、初心者にはちょっと難しく(というか面倒くさく)断念しました。

 

もうwebアプリケーション制作は諦めようかと思っていたら、Django同様に有名なフレームワークとしてFlaskというものがあることを知り、これでチャレンジしてみました。

 

Flaskはとても使いやすく、簡単に使えそうだったのでこれを使って作成に取り掛かりました。

 

とりあえず、Flaskを使って、サーバーで処理したものをHTMLにレンダリングするということがローカルサーバー上で出来たので、実際にどこかのサーバーにアップしてみようと考えました。

 

Flaskについて調べているうちにHerokuとかいうレンタルサーバーの進化版があるという知識を得ていたので早速、Herokuに挙げてみました。(デプロイというらしい)

見事、デプロイはうまくいきました。

 

実際にデプロイしてみると、処理待ちの時間がかなり気になりました。

 

ツイートを長い期間取得しようと思うと「グラフ化」を押してからグラフが表示されるまで結構な時間がかかり、かなりのストレスでした。よくある処理待ちぐるぐるマークをつけようとおもいました。しかし、これがまた非常に大変でした。

 

非同期通信すればすぐだろうと思っていましたが、同じページ内で非同期通信する方法(例えば、フォームに値を入力しその値をそのページに更新せずに追加するなど)はいくらでも調べれば出てきましたが、サーバー側にFlaskを使っており、なおかつページをまたいでajaxで非同期通信を行う方法はどこを調べても出てきませんでした。

 

結果的にFlaskのドキュメントを見たり自分で考えたりしてなんとか実装に成功しましたが、たった処理待ち時間にぐるぐる画像を表示するという機能だけで丸一日かかってしまいました。

 

そうはいっても様々なモジュールのおかげでサーバー側のプログラムはすぐに完成したので今後24時間以内に完成するだろうという楽観的な気持ちでいましたが、フロントエンドで死ぬほど苦労しました。

 

フロントエンドの話

 フロントエンド、特に、デザイン。。。デザインには苦労しました。cssで何かわからないことがあったとか思うような位置にレイアウトできないとかそういう問題ではなく、単純にデザインに苦労しました。

 

いまのデザインになるまでに2つのデザインが存在していましたが、結果的にそれら2つはボツとなりました。そのせいで、今回の開発期間の9割以上はデザイン。という悲惨なことになってしまいました。

 

そもそもデザインしても結果に納得がいったことがないのでデザイン自体やりたくないですが、今回もっとも大きな反省点として、「デザインのデモを作ることなくCSSでデザインをし、完成してみたら予想と違ってボツ」という非効率の極み的なことをしてしまった点が挙げられます。

 

基本的な話ですが、今後もしデザインをしなければいけない状況に陥ったらしっかりとデザインのデモを作ってからcssで実装しようと決意しました。(あ、デザインのデモとか作るのにおすすめのサイトとかあったらぜひ教えてください)

 

【感想】

いろいろと苦労しましたが、一番苦労したのはユーザビリティの向上とデザイン性です。やはりwebアプリとして公開するからにはその点をすごく考えなければいけないので大変でした。(というか一部は非実装)しかし、Python自体は面白いことが簡単にできるのでこれからもより一層勉強し、いろんなプログラムを書いていきたいと思います。特に、ここからは統計処理のあたりをやっていきたいと思います。

 

最後まで読んでいただき、ありがとうございました。