backstage

合唱音源の新着情報の舞台裏

Pebble Timeのウォッチフェイスを作ってみた

先日Pebble Timeを購入しました。

f:id:s2terminal:20160612165635j:plain:w250

Microsoft BandやAppleWatch、AndroidWearも迷ったのですが、以下の理由でPebbleTimeを選びました。

Pebble Timeのソフトウェア開発

Pebbleのアプリとウォッチフェイスは、CloudPebbleを使えばブラウザ上で簡単に作ることができます。

最低限の機能を抑えたIDEエミュレータがブラウザ上で動作するので、SDKのインストールなどをせずともすぐに開発を始めることができます。 (SDKも公開されているので、UNIX上で開発もできるようです)

言語はCとJavaScriptが選べますが、JavaScriptはできる事が少ないようなのでC言語で開発します。

ウォッチフェイスの開発

ためしに、現在時刻としてUNIXTIMEを表示する簡単なウォッチフェイスを作ってみました。

公式のドキュメントが充実しており、チュートリアルに沿って適当にコードを書いていけば時刻を表示するウォッチフェイスを作ることができます。

developer.pebble.com

これに手を加えて行けば、簡単に開発を進めることができます。

また、時刻以外にもPebble側の情報にアクセスするためのAPIが用意されており、ドキュメントも充実しております。

たとえば歩数を取得するには以下のようにします。

health_service_sum_today(HealthMetricStepCount);

developer.pebble.com

CloudPebbleはGitHubと連携することができ、コードをGitHubで公開することができます。 今回作った物は以下です。

github.com

実際に書いたのはmain.cのみで、こんな感じです。

ビルド

COMPILATIONから、エミュレータか実機のどちらにビルドするかを選ぶことができます。

エミュレータでの動作はこんな感じです。

f:id:s2terminal:20160612165056p:plain

実機の方はすこし時間がかかりますが、実機ビルドが完了するとPebble本体がぶるぶる震えますので、他事をしながら適当に待ちましょう。 この 「ビルド完了すると通知が来る」 って一見当たり前のような気もしますが、開発者としてはかなり快適です。

なお、「COMPILATION→PHONE→INSTALL AND RUN」でビルドするとPreparingのまま数十分待ってもなぜかビルドできないことがありました。 その時はSOURCE FILESから「SAVE, BUILD, INSTALL AND RUN」を押すとビルドできました。

まとめ

簡単にウォッチフェイスを開発することができました。

Twitterのフォロワー数とかRT数、ブログのPVのような、 毎日確認したいKPIをウォッチフェイスに表示させる ようにしたらアツいと思うのですが、認証とか非同期処理とか面倒くさいのでまた今度。

【機械学習】AzureMLで合唱音楽レコメンドシステムTwitter Librarian作ってみた

Microsoft Azure Machine Learning(Azure ML)を使って、

以上を組み合わせて、RTを評点としてAzure Match Box Recommender モジュールに突っ込むことで、おすすめのツイートを取得するシステムTwitter Librarianを作りました。

f:id:s2terminal:20160410194651p:plain

現在はサービスとして公開はしておりません。 ローカルで調整中の段階ですが、 約3,000件のリツイート情報、約800件のツイート投稿データ、約1,500件のツイート詳細データ(タグ情報)を用いることで、指定したTwitterユーザに対するおすすめツイートを取得できるようになっています。

作曲者や演奏者情報がツイート詳細データとして入力されて学習に用いられるので、好きな作曲家や合唱団の傾向が反映されるのではないかと思います。

APIを叩くソースコード

f:id:s2terminal:20160410203902p:plain

Azure ML上でWeb APIにデプロイすると C#PythonR言語の3種類のクライアント用サンプルコードを提供してもらえます。 しかしRubyは無かったので自前で書きました。

その他の技術的な詳細は多分そのうち書きます。

課題

f:id:s2terminal:20160410200810p:plain

RTが多いツイートのレコメンドに偏ってしまう

普段2,3RTしかされないアカウントの中に極稀に70RTとかの投稿があるので、誰に対してもそういう特定のツイートばかりレコメンドされてしまいます。言われてみればそうなのですが、人によって様々な結果が返ってこないと面白くありません。

知らない曲を発掘してくれるようなシステムでないとあまり意味がありません。 RT数が少ないツイートに対して高い評点を付けるよう調整することで対策を予定しています。

データを増やしたい

現状TwitterのRT情報しか取れていません。 いいね(お気に入り)も取りたいのですが、Twitter APIが存在しません。

Facebookのお気に入り/シェア情報も、数が増えてきたら付け加えようと思います。

料金が難解

azure.microsoft.com

上記によると、たとえばスタジオ実験時間で時間割り102円?とあります。 実験時間が何を指しているのか不明ですが万が一実験しっぱなしだったとして1日2,400円??1ヶ月で7万5千円???となると恐ろしいです。iPadが買えます。

しばらく運用してみないとよく分かりません。 課金アラートを厳重に設定して、あとは様子を見てみます。

blogs.msdn.microsoft.com

参考文献

追記

喋りました↓

www.slideshare.net

AMP対応に必要なschema.org構造化データ

先週、以下のような記事を書きました。

s2terminal.hatenablog.com

上記の対応をして、Fetch as Googleでラブコールを送って待つこと5日。 下記のお返事が届きました。

f:id:s2terminal:20160327173936p:plain

AMP ページへの必須構造化データの追加について

http://合唱音源の新着情報.com/ の所有者様

お客様の AMP ページの一部に、AMP 関連機能を搭載した Google 検索結果への表示に必要な構造化データがないことを Google のシステムが検出しました。以下のレポートにはこうしたエラー(およびその他のエラー)が発生しているページの例が記載されています。

どうやらAMPで何かエラーになってしまったようです。 とりあえず「スタイルシートもう少しマジメに書けよ」みたいなエラーではないようで少し安心です。

Google Search Consoleで確認してみると、下記のエラーが出ていました。

f:id:s2terminal:20160327174000p:plain

どうやらAMP対応には、対応したテンプレートを用意するだけでなく schema.org構造化データ対応によるリッチスニペット有効化 が必要なようです。

詳しい仕様などは下記で紹介されていました。

www.suzukikenichi.com

Google公式のドキュメントにロゴの仕様などもありました。

https://developers.google.com/structured-data/carousels/top-stories

ロゴも必須ですが、仕様に対応するようなロゴ画像は持っていないのでテキストを適当にpng化して貼り付けてその場をしのぎます。

RailsでAMP用schema.org構造化データ対応

  • 110文字以下の 見出し
  • 画像
  • 投稿者情報
  • 著者情報
  • 投稿日
  • 更新日

上記データをschema.orgに沿った形で表示する必要があるようです。

こんな感じでモデルのインスタンスメソッドJSON情報を定義して

  # AMP用構造化データ
  def schema_org_news_article
    {
      "@context": "http://schema.org",
      "@type":    "NewsArticle",
      "mainEntityOfPage": {
        "@type": "WebPage",
        "@id": self.url_for,
      },
      "headline":       self.title(110),
      "description":    self.tweet_text,
      "image":          self.thumbnail_json,
      "datePublished":  self.created_at.iso8601,
      "dateModified":   self.updated_at.iso8601,
      "publisher": {
        "@type": "Organization",
        "name":  "合唱音源の新着情報",
        "logo":  self.logo_json,
      },
      "author": {
        "@type": "Person",
        "name":  "suzuki.sh",
      },
    }
  end

テンプレートで呼び出しました。

    <script type="application/ld+json">
      <%= @tweet.schema_org_news_article.to_json.html_safe %>
    </script>

構造化データテストツールで確認します。

f:id:s2terminal:20160327174025p:plain

「問題ありません」と表示されたので、これでOKのはずです。

クロールエラーと異なり、エラーが解決したことを報告する機能は無いようなので、Fetch as Googleを送って気長に待ちます。

上手く行っていれば、数日の間にGoogle Search Console上に何らかの反応があると思います。

【Rails】AMP(Accelerated Mobile Pages)に合唱音源の新着情報.comを無理矢理対応させる

昨年、Google等によってAMP (Accelerated Mobile Pages)というプロジェクトが公開されました。

www.suzukikenichi.com

GoogleにWebページの情報をキャッシュさせて検索結果と一緒に返すことで、検索結果表示を高速化するというモノです。 特に合唱音源の新着情報.comのような弱小サーバ上に適当設定で動いており3ヶ月に1度くらい定期的にサービスダウンするようなWebサイトの管理者にとっては、Googleの強固なサーバ上で高速にキャッシュを返してくれる仕組みが提供されるのは朗報です。

以下に日本語の公式情報もあります。

googledevjp.blogspot.jp

詳細は上記のブログ等の方が詳しいので説明は置いておいて、さっそく対応してみたいと思いました。

前提条件

$ rails --version
Rails 4.2.1

http://合唱音源の新着情報.com/request/sound/615 というURLに対して
http://合唱音源の新着情報.com/request/sound/615.amp というURLでAMP版のテンプレートを表示させようと思います。

ampテンプレート追加対応

まず、Railsで .ampというテンプレートファイルを読み込むようにします。

コントローラに下記追加

    respond_to do |format|
      format.html
      format.amp{
        request.format = :amp
      }
    end

config/initializers/mime_types.rbに下記追加

Mime::Type.register "text/html", :amp

これで、sound.html.erbという普段使っているテンプレートファイルに対して、新たにsound.amp.erbというファイルでamp版テンプレートを表示できるようになりました。

AMPの仕様に沿ってコーディング

AMPはだいたい通常のHTMLに準拠していますが、ところどころ仕様が異なります。

まずはGitHubからサンプルテンプレートを持ってきて、なにも考えずにsound.amp.erbに貼り付けてみました。

https://github.com/ampproject/amphtml/tree/master/examples

GoogleChromeに搭載されているチェックツールを使って、文法をチェックできる ようなので、このツールが吐き出すログを見ながらコーディングしていきます。

URLの末尾に「#development=1」と付けて開発者ツールを起動すると、デバッグ情報が表示されます。

f:id:s2terminal:20160321233645p:plain

コンソール上に「AMP validation successful.」と出れば成功です。

さてここから本来のページにあるコンテンツを持って来ます。 適当にコピペしてChromeのチェックツールを調べると色々とエラー箇所を教えてくれますので、それに沿ってコーディングしていきます。

合唱音源の新着情報は大した情報のないペラペラなWebページですので、簡単に移植できるはずです。

twitterを埋め込む

AMPではJavaScriptを使えないようですが、サンプルテンプレートのtwitter.amp.htmlにある通り、AMPは <amp-twitter> という独自タグによるtwitter埋め込みをサポートしています。 合唱音源の新着情報はtwitterに過度に依存したWebサービスであるため、これを使わない手は無さそうです。

<amp-twitter width=390 height=330 layout="responsive" data-tweetid=<%= @tweet.tweet_id %>></amp-twitter>

これだけの記述でtwitterを埋め込むことができます。

CSSを埋め込む

AMPは外部CSSを使うことができず、テンプレート内 <style> タグに記述しなければなりません。 ガラケーを思い出すような仕様です。

AssetPipelineを使っているので、コンパイル済みのアセットファイルの中身だけをうまくテンプレート内に吐き出したかったのですが、どうにもスマートな方法がありそうで見当たりません。 なので AssetPipelineを通して配信されたCSSファイルのURLをhttpクライアントでぶっ叩いてダウンロードする という力技を使います。

Rails標準のstylesheet_link_tagヘルパー の実装を参考に、下記のようなヘルパーを作って読み込ませてみます。 (ホスト名ベタ打ちな所とか良い子は真似しないように)

  def css_tag_amp(*sources)
    options = sources.extract_options!.stringify_keys
    path_options = options.extract!('protocol').symbolize_keys

    sources.uniq.map { |source|
      require 'open-uri'
      host = '合唱音源の新着情報.com'
      path = path_to_stylesheet(source, {host: host}.merge!(path_options))
      content_tag(:style, URI(path).read.encode("UTF-8"), options)
    }.join("\n").html_safe
  end

これでCSSファイルの内容をテンプレート内に表示できました。

が、下記のエラーが出てしまいます。

f:id:s2terminal:20160321234456p:plain

The author stylesheet specified in tag 'style amp-custom' is too long - we saw 254121 bytes whereas the limit is 50000 bytes. (see https://www.ampproject.org/docs/reference/spec.html#maximum-size)

とのことで、CSSファイルは50KBまでだそうですが、254KBもあるそうです。 そりゃ、bootstrapの本体まるごと突っ込んでまとめてコンパイルなどしていればそうなると思います。

面倒だったのでとりあえず CSSは無し で行きます。 AMP用の軽量CSSの手配は今後の課題ということで...

そんなこんなで色々やって、エラーをひとつずつ処理していきます。 細かいところだと、bullet の画面下部に出るエラーメッセージもAMPにおいてはエラーとなってしまうため、AMPのデバッグ時には消したりしました。

  Bullet.add_footer   = false

必要なコンテンツを盛り込んだ上でコンソール上に「AMP validation successful.」と出れば成功です。

f:id:s2terminal:20160321234710p:plain

CSSが無いせいで ◯知県合唱連盟の公式サイトのような 20世紀のホームページのような見た目になってしまいましたが、これが2016年の最新のトレンドであるAMP用Webページです。

忘れずに、元のページからAMPページヘlink rel=amphtml を貼るようにして完成です。

まとめ

いくつか課題はありますが、無事にAMP対応のページを公開できました。 例:今年を歌おうプロジェクト 松下耕『今年』の合唱動画 - 合唱音源の新着情報.com

実際にGoogle検索結果へAMPはまだ対応されていませんので、このページを検索結果上で確認することはできません。正しく対応できているのかどうかは不明です。(上手く行っていれば、数日の間にGoogle Search Console上に何らかの反応があると思います)

課題としてはCSSファイルをなんとかスマートな方法で用意したいのですが、AMPと通常Webページのダブルメンテになるとつらいです。 RSS配信のように極力AMP側の装飾を薄くするか、AMP版と通常WebページとでうまくCSSを共有する仕組みを作っておきたいと思いました。

本格的に導入するならばAMPのバリデーションは自動テストもしたい所です。 GoogleによるとChromeの開発者ツールだけでなくバリデーション用のAPIが公開される予定のようですので、そちらに期待です。

追記

追加で 構造化データマークアップが必要だった ので、対応しました。

s2terminal.hatenablog.com

参考文献

Splatoonがフェスで稼いでいるのは本当か考える

半年ほど前、Splatoonのタイアップフェスによるビジネスについて考察しました。

s2terminal.hatenablog.com

考察の結果、 フェス1回あたりのアクティブユーザー数が50万人程度だとして、任天堂はタイアップフェス1回あたり数百万円の収入を得ているのではないだろうか? という結論に至りました。

あれから半年、Splatoonは国内のみで100万本以上を売り上げ、アクティブユーザー数も大きく伸びたと思われます。 また、ゲームの考察やバランス調整が進むに従って、フェスでしか貰えない限定アイテム 「スーパーサザエ」の価値もより高くなってきたのではないか と思います。

私も昔はメインギアのみを揃えて戦っていましたが、最近はすこし厳選をしてスペシャル増加+スペシャル延長+もみじシューターでスーパーセンサーを連発したり、インク回復+メイン効率+.96ガロンで弾幕を張ったりしたくなり、スーパーサザエをよく消費するようになりました。 おかげでウデマエもB-からA+まで上りました。

f:id:s2terminal:20160207191421j:plain

ではフェスがその後どうなったのかをまとめてみます。

フェス10回分のまとめ

開始日 陣営 タイアップ
2015/06/13 ごはん VS パン -
2015/07/03 赤いきつね VS 緑のたぬき 東洋水産 マルちゃん
2015/07/25 レモンティー VS ミルクティー KILIN 午後の紅茶
2015/08/22 キリギリス VS アリ -
2015/09/12 ボケ VS ツッコミ -
2015/10/10 イカ VS タコ 無添くら寿司
2015/10/31 愛 VS お金 -
2015/11/21 山の幸 VS 海の幸 佐賀県
2015/12/26 赤いきつね VS 緑のたぬき 東洋水産 マルちゃん
2016/01/23 カンペキなカラダ VS カンペキな頭脳 -

タイアップフェスの回数は一気に減ってしまいました。 前回の考察(8月9日)から7回のフェスが行われたのちタイアップした題材は、劇中のテーマと親和性の高い くら寿司営利団体ではないので一概にカウントできない 佐賀県 、そして2度目の協力となる 東洋水産 の3つだけでした。

フェス自体は1ヶ月に1回以上のペースで行われていますが、タイアップはそこまで積極的ではないようです。

フェスのアクティブユーザー

先日公表された任天堂の決算資料に、具体的な数字が記載されていました。

www.nintendo.co.jp

国内で1月23日、24日に実施した10回目の「フェス」では、約69万人と、過去最大の参加ユーザー数となりました。

とあるので、 フェス1回あたりのアクティブユーザー数が50万人規模という見立てはだいたい正しかった ようです。

海外のフェス

海外のフェスは北米・欧州で別々になります。タイアップが行われたかを見てみましょう。 なお各情報はNintendo of America、Nintendo of Europeの各公式サイトと公式Twitterから引用しています。

北米のフェス

開始日 陣営 タイアップ
2015/06/04 イヌ VS ネコ -
2015/07/18 ジェットコースター VS ウォータースライダー -
2015/08/09 マシュマロ VS ホットドッグ -
2015/08/28 サイバトロン VS デストロン ハズブロ社 トランスフォーマー
2015/09/12 芸術 VS 科学 -
2015/10/08 車 VS 飛行機 -
2015/10/30 海賊 VS ニンジャ -
2016/12/? ハンバーガー VS ピザ -
2016/12/? 下品 VS 上品 -
2016/01/15 過去 VS 未来 -

海外のフェスは上記の通り。 北米で一度だけ トランスフォーマー」とのタイアップ がありました。日本でも話題になっていましたね。

正義の陣営「サイバトロン(AUTOBOTS)」と、悪の陣営「デストロン(DECEPTICONS)」で戦ったそうです。日本で言うとアンパンマンVSバイキンマンみたいな物でしょう。

フェスTのデザインも凝っていて、PAX(北米開催のゲームショウ)にて実際にTシャツも制作されるなどNintendo of Americaの力の入れようが分かります。

ちなみに日本のフェスではタイアップするとき、劇中の告知ニュース、看板、公式Twitterのアナウンスでも タイアップ提供企業名 が記載されていました。

しかしこのトランスフォーマーフェスのタイアップ企業である Hasbro社 の名前はなかなか出てきません。恐らく任天堂公式サイトのニュースリリースのみ?調べたところ、劇中に名前は出てこないようでした。

www.nintendo.com

このトランスフォーマータイアップは、広告色の強い日本のタイアップフェスとは様子が異なるのかもしれません。

欧州のフェス

欧州のフェスは日本・北米とはまた異なっています。

開始日 陣営 タイアップ
2015/06/27 ロック VS ポップ -
2015/07/18 食べる VS 寝る -
2015/08/08 北極 VS 南極 -
2015/08/29 歌う VS 踊る -
2015/09/? 雑 VS きれい好き -
2015/10/17 ネコ VS イヌ -
2015/11/07 ゾンビ VS 幽霊 -
2015/12/12 ピザにパイナップルを入れるのは?イカす VS ダサい -
2016/01/01 健康 VS 裕福 -
2016/01/30 野蛮人 VS ニンジャ -

文化の違いなのか結構不思議な題材が見受けられますが、とりあえず 欧州では一度もタイアップが行われていない ようです。

任天堂は本当にタイアップで稼いでいるのか

任天堂は数千億円を売り上げる大企業ですので、たった数百万円程度の数字というのは決算資料にいちいち表れてきません。 そこまでタイアップフェスも盛んに行われてはいませんし、結局Splatoonのフェスによる収益がうまくいっているのかどうか、そもそも本当に収益を得ているのかどうかも定かではありません。

ですが「長らくソフトウェアのパッケージ販売で利益を上げてきた」「ゲーム内課金モデルにはためらいがある」任天堂にとって、あらたなビジネスモデル・マネタイズ基盤の確立は急務であると思います。 前回の決算説明会質疑応答でも、そのあたりが論点になっている感があります。

www.nintendo.co.jp

そんな中で、Splatoonのタイアップによるマネタイズは上手く行って欲しいなと思っていたので、その後が雲行き怪しいのは少し残念です。もっとたくさん稼いで広告ビジネスモデルを確固たるものにして欲しかったと思います。

誰かSplatoonのフェスに広告を出してみませんか?