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

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

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 人(上限値)
  • 現在は 200 人超(2018/3/2 現在)
  • アクセス数は 80 アクセス/日

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

開発環境

PaaS には GAE/J(standard) を使用してます。

が・・無料枠での運用は spinup/spindown がきびしいです。BOT は応答が命。flexible にして札束運用で解決するか、別構成にするか。今後の課題です。

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

Google Apps Script で spreadsheet のデータを JSON として読み込む

Android アプリに限らず、JSON データを表示するようなアプリって作ること多いですよね。で、自分はその時いつもサーバサイド作るのがめんどくさくなっちゃう。なので、spreadsheet のデータをそのまま JSON として返すようなサーバーサイドアプリを GAS(Google Apps Script) で書いてみました。いまさら何言ってんだ、いつのネタだよという感じだけど、がしがし開発するときにこういうのあるとやっぱり便利だった。

目的

こんな感じで spreadsheet に定義したデータが JSON で一括で欲しい。


f:id:dai4649:20140208155408p:plain


やること

  • spreadsheet 作成
    • 1行目は タイトル行(JSON のキーに該当)
    • 2行目以降は データ行
  • spreadsheet のスクリプトエディタに以下の gas を貼り付け
  • gas 内に以下を自分の環境に合わせて修正
    • spreadsheet のURL
    • spreadsheet のシート名
  • gas をウェブアプリケーションとして公開

確認

cURL で確認。

# curl -L 'GASの公開URL'
[{"name":"あああ","memo":"ジェッタシー"},{"name":"いいい","memo":"早寝早起き"},{"name":"ううう","memo":"ロングブレス"},{"name":"えええ","memo":"Aチーム"}]

ちなみに「curl 'GASの公開URL'」だとエラーになるので注意。


所感

GAS 便利。超便利。


Android Design のパターンを実装してみた(Patterns - Multi-pane Layouts)

Android Advent Calendar 2012 12/18(裏) 担当の @daichan4649 です。
よろしくお願いします。


経緯

Android Design のサイト、ありますよね。Android公式から提示されてるガイドライン。アプリはこう作ってねとか、画面遷移はこういう風に、とか、アイコンはこういうサイズで、とか。しかし、コード例へのリンクがない。理想のパターンを定義するなら一緒にコードも公開してくれたらいいのに。

なんて思いから 「自分ならこう実装する」 というのをやってみました。実際にはどう実装するのがベストプラクティスなのかわからないので、コード晒すのでみなさまぼこぼこにしてください。 #ドM


Multi-pane Layouts

Android Design にはいろんなパターンが書いてありますが、まずは Patterns の中から Multi-pane Layouts をチョイスしてみました。

Combining Multiple Views Into One
1. 同一apk で 小さい端末では 1pane 、画面大きめな端末では 2pane にする
2. 親(リスト) を選択すると 子(詳細) を表示する

よくある 2pane なアプリのパターンについて、ですね。とりあえず、このパターンのサンプルアプリ作ってみました。サイトではタブ表示になってるけども、今回そこは関係ないのであえて無視してます。


スクリーンショットです。


小さめの端末(Galaxy Nexus)

初期表示
f:id:dai4649:20121217235708p:plain

リスト選択
f:id:dai4649:20121217235722p:plain


大きめの端末(Nexus7)

初期表示
f:id:dai4649:20121217235746p:plain

リスト選択
f:id:dai4649:20121217235937p:plain


それではアプリの実装について説明してみます。


1. クラス構成

  • Activity 1つ
  • Fragment(リスト)
  • Fragment(詳細)

ここはシンプルに。


2. レイアウト

本当はもっと細かくサイズ指定すべきなんだろうけど、めんどくさいのでこんなかんじで2つ用意。

  • 画面小さめな端末向け(/layout)
  • 画面大きめな端末向け(/layout-large)



3. Fragment の表示/入れ替えロジック

画面小さめな端末(1pane)
  • 初期表示
    • コンテナ(android.R.id.container) を Fragment(リスト) で replace
  • リスト選択時
    • コンテナ(android.R.id.container) を Fragment(詳細) で replace
画面大きめな端末(2pane)
  • 初期表示
    • 左側に Fragment(リスト) を表示
    • 右側に コンテナ を表示(空)
  • リスト選択時
    • 右側のコンテナ を Fragment(詳細) で replace

xml ごとに構成を変えます。



で、この手の Activity1つ、Fragment複数、なパターンを使ったときにいつも悩むのが データの管理。コンフィグ変更(縦横切替等) で Activity が再生成された際の挙動を考慮して、こんな感じで考えてみました。


4. データ管理

CRUD

Fragment から Activity を参照(Fragment#getActivity)し、「必ず」 Activity 経由でデータをいじる。

保持

Activity 内でデータ保持


今回は 「コンフィグ変更(Activity#onDestroy)時にデータ破棄」 するような作りにしているため、Activity で単純にデータ保持しています。「コンフィグ変更時にデータ破棄」 させたくない場合は Fragment#setRetainInstance(true) な Fragment で管理すべき、だと考えてます。このあたりについては前に以下のエントリでまとめてみました。


Activity再生成時のデータの保存・復元(Fragment#setRetainInstance)



これを基にすると、各 Fragment でデータを表示するまでの流れはこのようになります。


5. Fragment でデータ表示するまでの流れ

  • Fragment(リスト)
    • Fragment のインスタンスは Activity 表示時 にレイアウトから生成
    • onActivityCreated で Activityからデータ取得
    • adapter に取得したデータを設定
  • Fragment(詳細)
    • Fragment のインスタンスは リスト選択時 にコードから生成(引数: 選択位置)
    • 生成時に引数で渡された 選択位置 を内部保持(Fragment#setArguments)
    • onCreateView で ↑の 選択位置 を基にして Activity から 表示用データ を取得(Fragment#getArguments)



アプリの構造、設計はざっくりこんなかんじです。コード本体は ここ(github) に置いてます。今回記載した以外のパターンについても実装したら(需要はおいといて)公開していこうと思っています。


最後に

去年 に引き続き、今年もこのようなすばらしい企画に参加させていただき、主催の @youten_redoさん、参加者の皆さま、本当にありがとうございます。来年も参加できたらいいな!明日 12/19 の担当は @androidsolaさん(表)、@furusin_oriverさん(裏) です!


追記

事件です。最新のADT (21.0.1 現在)では、マルチペインな雛形を自動生成できることが発覚しました!!m9(^Д^)
あれ、目から水が。