プログラマってこんなかんじ??

アプリ作ったり歌ったりしてます

Android で 中洲ジャズアプリ(非公式) を勝手に作ってみました

福岡の中洲で毎年開催されているジャズフェス、中洲ジャズの非公式版クライアントアプリを勝手に作ってみました。

play.google.com

どんなアプリ?

全体のタイムスケジュールが見やすい!

公式サイトでは 「誰と誰の演奏がかぶっているか」 がちょっとわかりづらいです。本アプリでは、

  • 同じ時間帯に
  • 各ステージで
  • 誰の演奏があっているか

が、 横ならび で見れます!一目でわかります!!(誇張)

近くのコンビニの場所がわかる!

中洲ジャズは路上での無料イベント。ビール片手に歩きながら音楽を聴けるとか最高ですよね。ビール飲むとお手洗いも近くなりますよね。

  • ビールが買える場所
  • おつまみも買える場所
  • お手洗いがある場所

そう、コンビニ です。載せてます!

ジャズスポット載せてます!

ふだんあまり聴けないジャズの生演奏。最高ですよね。もっと聴いてみたくないですか?

  • お酒飲みながら
  • ジャズが聴ける
  • しかも至近距離で

そう、ジャズバー です。載せてます!

中洲近辺にはいくつかそんなお店があります。これを機会に足を運んでみてはいかがでしょうか?

なぜ作ったのか?

公式サイトのタイムスケジュールがよくわからない

上のほうにも書いたのですが、公式サイトの各アーティストのタイムスケジュール。・・これが自分にはなかなか見づらくて。

nakasujazz.net

自分が知りたい観点は

  • 各ステージで誰が演奏なのか?
  • おなじ時間帯に誰のライブがあっているのか?

これを何とか見やすくできないものか?と考えたのがきっかけです。公式サイトだと 前者 はわかるけど 後者 は・・という感じでした。聴きたいアーティストたくさんなので、効率よくまわらないといけないミッションがあるのです!

オフラインで情報を見たい

毎年恒例なのですが、開催期間中にサーバーがよく落ちます。。イベント当日にタイムスケジュールが見れないのはつらい。。自分のまわりでは、公式サイトのタイムスケジュールをキャプチャしたり画像保存して見てる人が多いです。

地元ミュージシャンの応援

自分の周りの友人たちから「生演奏が聴きたい」と話によくあがるのだけど、実は福岡でもたくさん聴ける場所あるし、今回もこんなにたくさんすごい地元ミュージシャンが演奏しているんだぜ、的なところを少しでも伝えれたらいいなーなんて。公式サイトの情報だと、演奏している方が「地元」の方なのかどこの方なのか一目でわからないのです。

自己スキルアップ

プログラマとしての話になるのですが、実は最近 Android アプリを実案件で作っていなかったので技術的に不安を感じていました。Android は、以前は OS のソースを読んでたくらい大好きな技術。最近は情報は追ってるけども「実際に使って試行錯誤する」というフェーズをほとんどできてない状態。アプリをしっかり作れば知見もたまるし一石二鳥かな、という点。

よかったこと

ひとまずリリースできた

最低限の機能を実装して最後までリリースできた、これは本当によかったです。公式サイトそのままよりは「少しだけ」見やすいものができた気がしてます。ひとまず目標達成。

Android の技術再確認

よく見る構成のアプリを「今の」「スタンダード技術」で 「丸ごと作成する勘所」はある程度身についたかなーと感じています。これで Android 老害な自分から少しは脱出できたかもしれませんw

よくなかったこと

UI 手戻り多すぎ

「とにかくコード書きたい!作りたい!」が先行してしまい。プログラムファーストで進めた結果、UI 部分で何度も手戻りが発生してしまいました。時間が少ない時こそ、先にUIプロトタイピングツール等を使って先に検討したほうがよかったのかなーなんて思います。

ひどい。

これもなかなか。

もがいてる感。

次回やりたいこと

ミュージシャン情報をもっと前面に表現したい

本当は地元ミュージシャンの特設ページ等を作りたかったのです。直接インタビューしたメッセージだったり、写真だったり。ミュージシャンのみなさま、来年はなにとぞご協力よろしくお願いいたします!!

地元の生演奏スポットへの誘導

中洲ジャズに行かれた方は、ジャズの生演奏を聴いて気持ちが高揚していると思うので、「ジャズバーや生演奏のお店に行ってみたい」という気持ちを後押しするような何かしらの導線を作りこみたかったです。

もっと見やすくしたい

正直まだまだ見にくいです。「どうせなら全ステージを同時に俯瞰したい」と友人からも意見をいただき。情報量を整理してうまいことできないかなーって思ってます。

モバイルサイトにすればいいのに

聞こえません。その話題には触れません。

アプリ作りの参考にしたもの

DroidKaigi 2017 official Android app

Android の技術イベント DroidKaigi の公式アプリです。アプリ内のパーツや作りは参考にさせていただいた部分が多いです。ソースの中身、非常に勉強になりました。Android オールスターズの集合知、すごい。 github.com

Material Design

UI、デザイン知識がほぼ皆無なので、色や各パーツの配置等はなるべくマテリアルデザインの原則に基づくように作ってみました。 material.io

最後に

実案件ではいくつかリリースしてるものがあるのですが、個人でアプリ作成してリリースしたのは今回初でした。副産物として、各種データのスクレイピングツールなどもできました。いまの実業務ではあまり使わないようなスキルが芋づる式に必要になってくるので、刺激も多くてやってて本当に面白かったです。エンジニアとしてチャレンジしてよかったなー、来年はもっと「ユーザ目線で」「実用的な」ものを作れたらなーって思ってます。

リリース後

いろんな方からアドバイスいただいたのですが、イベント当日までの期間が迫っており、すべてを対応することができませんでした。時間があればできたのに・・エンジニアとして悔しい気持ちです。特に @konifar さん、@fkm さん、@yuki930 さんに感謝。ありがとうございました。今後のアプリづくりと来年の中洲ジャズアプリに活かします!

LINE 上で福岡のジャズライブを検索できるサービス(LINE BOT) を 10ヶ月 運用して思うこと (ライブ情報の収集)

daichan4649.hatenablog.jp

jazzspot-fukuoka が配信している「ライブ情報」。これはどこかにまとまっているものを単純に出しているわけではなく、管理人が自力で 収集したデータをもとに配信しています。

今回はどうやってこれを実現しているかを書いてみます。本当はすべてシステム化して ドヤァ したかったのですけど、基本的に多少強引気味な気合運用してます。なにかしらの参考になれば幸いです。

ライブ情報の種類と取得難易度

現在対応している店舗は 9店舗。実は店舗ごとに配信方法がさまざまなんです。これにすべて対応しなくてはなりません。最初はさてどうしたものか・・と頭を抱えました。みんな同じだったら楽なのですが、そうもいかない。

難易度順 に羅列するとこんな感じです。

更新タイミングは 月初・月末・毎週末 の3回を基本的に行っています。まだ店舗数が少ないので何とか対応できてます。

それでは、実際どのように取得しているかを 難易度 ごとに書いてみます。

難易度 低

Google Calendar

Google Calendar API でそのまま取得してます。うれしい!神!!リアルタイム更新もできるし、更新も楽。すべての店舗が Google Calendar で情報配信してくれると本当にうれしいです。。

developers.google.com

REST API

対象のサイトはもともと REST API 対応されていませんでした。サイト管理者が同業者だったので(笑)、お願いしていい感じで取れるようにしてもらいました。感謝。API たたいて JSON 処理するだけなのでこれも楽でした。

backstage.fukuoka.jp

難易度 中

スクレイピング その1 (Jsoup)

対象のサイトは table タグで構成されている手作り系サイトでしたが、正規表現頑張るだけでいけました。サイトの構成が大幅に変わるとキケンだけど、大幅リニューアルはしばらくないだろう。。と考えて決行。

qiita.com

スクレイピング その2 (spreadsheet)

なんとなく IMPORTXML 関数が面白かったので勉強がてらやってみました。おかげで簡単な HTML なら spreadsheet のみでスクレイピング楽勝。いい知見。

qiita.com

実際の spreadsheet (管理画面もどき) では、こんな処理を実装してます。

難易度 高

人力入力

気合です。フリーフォーマットなテキスト情報は、マスターの文字入力の癖によってスクレイピング失敗する可能性が高い。というわけで、念のため目視確認しながら人力でやってます。まだ対象のお店が少ない (4店舗) からいいのですけど、

  • 対応店舗数が増える
  • 情報更新頻度が高くなる
  • 情報量が多くなる

となってくると、ひとりで更新するのはもう無理かな・・と限界感じてます。

収集方法の今後

自動取得が不可なサイトについては「各店舗のマスターに 直談判&レクチャー してすべて Google Calendar 化する」が実現できたらいちばん嬉しいです。すべてのサイトがこれであればもっと嬉しいですね。

が、ジャズ関係の店舗のマスター様は年配の方が多いこともあるし、個人的には「IT を押し付けたくない」という思いもあります。Google Calendar の UI はわかりにくい部分もあるし。。もっとわかりやすい便利な管理画面を作成して使っていただくことも検討しています。さてどうしたものか・・

同じようなことをされてる方、運用アイデアをいただければ嬉しいです。

LINE 上で福岡のジャズライブを検索できるサービス(LINE BOT) を 10ヶ月 運用して思うこと

趣味でこんな LINE BOT を作って運用してます。

https://jazzspot.jp/fukuoka/

LINE で友だち追加

なんとなくひと区切りしたので、いろいろと思うことをまとめてみました。

どんな BOT

「福岡のジャズスポットのスケジュールを横断検索できる」検索型 BOT です。

  • ジャズミュージシャン
  • ジャズライブに行くリスナーの方
  • 対象エリアは 福岡 のみ

がターゲット層です。非常にニッチです。

どんなシチュエーションで使えるか、を簡単に紹介してみます。

場面「今日は何のライブがあってる??」

日付でライブ情報を 全店舗まとめて 表示する機能です。

  • メニューで “今日” を選択
  • メニューで “明日” を選択
  • 日付を直接入力

することで検索が可能です。

場面「フリーワードで検索したい」

ライブ情報を入力された フリーワードで検索 する機能です。

ジャズ関係だと、ミュージシャン名 や “セッション” といったワードを使うことが多い気がします。福岡には「川上さん」という自分が大好きな素晴らしいベーシストな方がいらっしゃるのですが、この例は、

  • 川上さんの演奏はいつ演奏あるかな
  • “川上” と入力
  • スケジュールが表示される

という検索例です。

場面「お店ごとの情報が見たい」

BOT が対応している お店のライブ情報 を表示する機能です。

  • スケジュール
  • 公式サイト
  • 地図

をカルーセル型を使ってわかりやすく見れるようにしてみました。

場面「演者からお客様にメッセージを届けたい」

演者からの メッセージ、想い を伝える機能です。(LINE Beacon を使った機能)

SNS 等で繋がってなかったら、「ライブ後に演者とお客様でコミュニケーションとる」のはなかなか難しいと思うのですよね。演者としてもせっかくライブに来てくれたお客様と連絡とりたいだろうし。

  • ライブ終了後にお店から出る
  • 演者からメッセージが届く
    • 「本日はありがとうございました!」とか
    • 今日のライブのセットリスト一覧とか
    • 今日のライブのアンケートとか
    • 次回のライブ案内(フライヤー画像)とか

「ライブ終了後の気持ちがアツい状態」に演者から直接メッセージが届くとすごくうれしいと思うのです。個人的にはこのタイミングは特に絶妙だと思います。この状態だと「アンケートにも答えてみようかな」なんてなると思うし。こんな状況を想定しています。

なぜ作ろうと思ったのか

自分はここ数年ジャズがすごく好きで、ジャズのお店に頻繁に行くようになりまして。で、ライブに行きたい時は

  • お店のサイト
  • ブログ
  • SNS

毎回このあたりを見てまわるのですね。10店舗近く。しかし、これがとにかく面倒で不便。ポータルサイトもない。なので、1つ1つ見てまわる → 面倒くさくなる → 行くのやめる、みたいなことが多くて。自分が面倒くさがりなので、これを IT 力でなんとか楽にならないかと思い、勝手に作ったのがこの BOT になります。

運用状況

BOT 自体は Trial 時代より実運用しています。

  • Trial 版(2016/5~)
  • Messenger API 版(2016/11~)

また、

  • 登録人数は Trial 時代は 50 人(上限値)
  • 現在は 140 人超(2017/3/2 現在)
  • アクセス数は 80 アクセス/日

と、ユーザ数は決して多くはありませんが、BOT の用途やターゲット層を考慮すると、なかなか使っていただいている気がします!うれしい!

開発環境

PaaS には GAE/J(standard) を使用しました。主にこのへんを使ってます。

検索系の機能実装

その他運用系 (DataStore 関係)

所感

環境選定ミスりました!!!\(^o^)/

というのも、GAE/J(standard) の無料枠での運用は spinup/spindown 的にちょっときびしかった・・flexible にして札束運用すれば解決なのですけども・・運用しててつらい話もたくさんありますので、詳しいことは別エントリで書いてみます。

daichan4649.hatenablog.jp

AndroidStudio+GAE/J+JAX-RS(Jersey)

Java でサーバサイド書きたいけど Eclipse に戻りたくない、という理由で、まずは GAE/J+JAX-RS(Jersey) の環境構築手順を調べてみた。

手順

module 作成

  • [File > New > New Module] を選択
  • [Google Cloud Module] を選択
  • [App Engine Java Servlet Module] を選択

build.gradle

Servlet 作成

  • Jersey 実装した Servlet を作成

web.xml

コード

gist.github.com

動作確認

  • [Run > Run モジュール名] で作成した module を実行
  • アクセスして JSON 返却されることを確認
curl localhost:8080/jersey/events | jq .

f:id:dai4649:20160404130556p:plain

参考

qiita.com

Google Apps Script で spreadsheet から Googleカレンダーへイベント一括登録(2016/3/23 時点)

Googleカレンダーにイベントを一括登録したい事案が発生したので調べてみた。Calendar 系は使ったことなかったけど、予想以上にお手軽だった。

このデータ達がー

こうなる。

手順

  • データ登録(spreadsheet)

    • date: イベントの日程
    • title: イベントのタイトル
    • description: イベントの詳細
  • calendar

    • 出力先のカレンダーの カレンダーID をメモる
  • gas

    • spreadsheet のスクリプトエディタに以下の script を貼り付け
    • 定義部分(spreadsheet の URL とか)を修正
  • spreadsheet

    • 「メニュー>管理者用>カレンダーへ登録」を実行

コード(gas)

課題

  • スクリプト複数回実行すると、同じイベントが複数登録されてしまう(同一イベントなら更新したい)
  • カレンダーに一度に登録できるイベント数が上限が50くらい

解決。 stackoverflow.com

参考

daichan4649.hatenablog.jp blog.goo.ne.jp