KOJI & HIRO Joint Live Happy New Year 2018 Special LIVE

1/6の1日目に行って来た。前日に公式サイトを覗いたら、握手会のお知らせが載っていて、これは行くしかないぞ!と物販目当てに早めに渋谷へ行くことにした。

第1部のアコースティックライブのチケットは持っていなかったので、渋谷で時間を潰す気だったんだけど、当日券が販売されるとのことで急遽第1部にも参加することにした。

入り口にTAKAさんからの花が届いていて、おお!これは!と思った。

第1部アコースティックスタイル

和装姿のKOJI&HIROが登場し、春の海を演奏。正月感がすごかった。

そのあとラクリマの曲と寺尾聰ルビーの指輪を演奏。

約1時間かつ最後尾での立ち見だったけど、すごくよかった。アコースティックでLa'cryma Christiの曲を聴けることに感動した。あとHIROさんの歌声が良い。

第2部バンドスタイル

第2部は真ん中の左あたりで見ることが出来た。KOJIさんがほんとすぐそこにいる。

始まった瞬間に、あーやっぱバンドの音いいな、っていうかササブチさんのドラムの音がめちゃめちゃカッコいい。一瞬で好きになってしまった。Creature Creatureもいこうかな、、、(今回のツアーで休止だし)

前半は2人のソロ曲を交互に披露。やっぱり2人でそれぞれのソロをやるスタイルいいなーと思った。大変だろうけど。

ベースの見せ場ではNATCHINさんに注目したりした。2人の主役を支えるサポートのお二人の演奏もめちゃめちゃカッコよかったのだ。

1回目のアンコールでは、にゃんごすたーさん(ちゃん?)とゲストボーカルの田澤孝介さんが登場、まさかのカバー曲を2曲とLa'cryma Christiの曲を1曲披露。

HIROさんのギターであの曲のイントロ聴けるとかもう、、、やばかった。

田澤さんの声めちゃよかったので、Rayflowerもチェックした方が良い気がして来ている。

あと取って置きのお年玉を会場の全員がもらった。内容は書けないけど、これは嬉しかった。すごいスペシャルなこと。

2回目のアンコールでは、La'cryma Christiの楽曲をボーカルなしで2曲。1曲目がまさかのWhite Periodで、音源持ってないのダメだ〜と痛感した。先日La'cryma Christiの音源ほぼコンプートしたのに唯一そこだけもってないんだよなあ探そう。

ラストはThe Scentで、生で聴けたのが本当に嬉しくて泣きそうだった。特にKOJIさんのソロパートな。高校生の頃どんだけ聴いたかと思うと感慨深かった。

握手会

先行販売でウッカリHIROさんの握手券しかゲット出来てなかったので、終演後にKOJIさんグッツも買いカレンダーがダブるという。

まあ、それでも直接話出来るとか、La'cryma Christi好きにはたまらないし、次いつチャンスがあるかわからんので、2人とも握手してもらいつつサインもらって来た。サイン対象はグッツに限らないとのことで、私物に書いてもらった。2人ともマジでいいの?って驚いてたけど本当嬉しい。今度会った人には見せます。

2人のソロアルバムを聴いて思わずギター始めたことを伝えたら、2人ともすげー嬉しくなるようなことを言ってくれて本当に励みになった。さらに憧れのギタリスト2人と手の大きさも比べさせてもらって、まじやる気がみなぎった。(次の日、首を寝違えて練習が出来なかったけどw)

探し回ってLa'cryma Christiのバンドスコアも2冊手に入れたし、今年から少しづつでも死ぬまでには弾けるようにがんばるぞぉという気持ちになれた。

HYDE Christmas Concert 2017 -黑ミサ TOKYO 2日目

HYDE Christmas Concert 2017 -黑ミサ TOKYOに行くことが出来たのでメモ。

www.instagram.com

ファンクラブの当日券が取れたので、急遽行って来た。

HYDE「昨日来た人たちはクリスマスイブに予定のあるリア充で、今日来ているひとたちは、、、訳ありのひとたちかな?」

あっ。

ROENTGENの曲がたくさん聴けてやばかった。

ROENTGEN

ROENTGEN

 

THE CAPE OF STORMSはガチで鳥肌がたった。まさか、生で聴ける日が来るとはなあ。『下弦の月』を部屋で1人見ながら、なんていういい曲なんだ、、、と感動していた頃が懐かしい。それを生で聴ける。本当に感動した。はー。

下弦の月 ~ラスト・クォーター [DVD]

下弦の月 ~ラスト・クォーター [DVD]

 

www.youtube.com

EVERGREENも良かった。

www.youtube.com

KENが出てきてからのラルク曲もよかった。なんで今日は「KENちゃん」ではなく「KENさん」だったのだろう?

ラルク曲、特にラストの未来世界はやばかったなあ。ほんとに泣いた。子供が生まれてからはこの曲がより一層特別なものになったなあ。

www.uta-net.com

このライブの映像化されるといいな。マニアックだけど、本当に良いライブだった。HYDEを神と崇めているひとにはオススメ。

www.instagram.com

他のレポ

BARKSのレポが詳しくてヨカッタ。当日を思い出せる。

www.barks.jp

あと個人的にこの方のレポが好きで、ラルク関連のライブの後はよく読ませてもらってます。当日のことがハッキリと思い出せて嬉しいツイート。

HYDEさんの来年の活動は未定らしいけど、ライブやってくれるといいな、また参戦したい。

Sendagaya.rb の2017年忘年会のLTで今年やったことをふりかえってみた

コミュニティに参加したら、ブログを書くまでが「参加」である。みたいな話を聞いたことがあるような内容な気がしたので、書きます。

スライドに書いたことを掘り下げた記事にしてもいいんだけども、誤解のないように口頭で話したほうがいいかもしれない内容を含むので、どこかで会ったときにこの記事のあの話なんすけど、みたいな質問をしてもらえるといいかも知れません。特に顧問業周りは、色々話せることがあるようでないような、まだうまく言語化出来てないナニカがあるので、そのうちまとめたいです。やっていたことをベースで整理すると、どちらかというとメンター業という方がしっくりきそう。

以下、スライド内のリンクです。

esa

pplog

顧問業

登壇

他のLT

みなの個性が溢れていて、楽しかったです。

  • 何に興味があって
  • 何を伝えたいのか

というのは、Rubyのコミュニティに限らず、コミュニティに参加するときに持っていたい姿勢ですね。 いろいろあって途中退出しなければならずに最後まではいられずに残念でした。その場に居ないと体験できない空気ってのはコミュニティならではですね。

Sendagaya.rb

@fukajun@tkawaさんが中心となって、毎週月曜日に開催しているRubyコミュニティです。最近は青山にあるランチェスターさんのオフィスで開催されていることが多いみたいです。今回みたいに忘年会はmofmofさんのオフィスで、みたいなこともある模様。

最近顔出してなかったんですが、忘年会には顔出したいと思っていたので、少しでも参加できて良かったです。自分にとって原点みたいな場所がずっと続いているのはすごいことだなあと思いました。

HIROさんライブのよさ

おふぇくと、ふくもりくんと、みなちゃんとでHIROさんの1stソロライブのBlu-rayを鑑賞していた。

www.youtube.com

そもそも、おふぇくってだれかというと、id: fakestarbabyことふぇくさん。 出会いとかを話すと長くなるけど、便利な記事があるのでそっちに任せる。 http://blog.fakestarbaby.com/entry/2017/02/28/080936

ふくもりくん。前前前職の同僚で前前前前職の同僚でもあり、もとはといえば、前前前前前前職の同僚である。そして今はふぇくさんと一緒にキッズスターで働いている。通称はなげ。

みなちゃん。湊川さんである。あだ名を付けた。「みなとがわさん」マジ長いので、「みなちゃん」と呼んでいる。名付けたばかりの頃はウッカリ敬語でさん付けしがちだったけど、最近慣れてきた。誰かって言うと、マンガでわかるWEBデザインのひと。わかばちゃんの生みの親。とにかくポジティブなパワーが強い。ポジティブスト2とかあったらボスとかだと思う。

登場人物の紹介が終わった。

待って、HIROさんな。肝心な人物の紹介がまだだった。 La'cryma Christi(ラクリマ)というバンドのギタリストだ。 https://ja.wikipedia.org/wiki/La%27cryma_Christi

今年の4月頃、HIROさんがソロライブをやったのだ。 https://www.barks.jp/news/?id=1000137777

色々あって、いまLa'cryma Christiは活動が停止中なので、ソロライブなのな。

今日はそのソロライブの映像を観る会をやってた。部室で。 イメージとしては友達を家に呼んでピザ食って、DVDみよーぜ!みたいな感じ。 実際には仕事中のみなちゃんのところに押しかけておっさん3人が昔のビジュアル系バンドのギタリストのソロライブ映像を観るという迷惑極まりない会であった。

元々ふぇくさんとはラクリマの思い出話をしがちな、単なる懐古厨おじさんという仲なんだけど、どうやらふくもりくんもだいぶいける口だということで今回の鑑賞会に誘ったわけ。ていうか、長い付き合いなのでいける口なのはぶっちゃけ知ってたし、自然と誘った。

ラクリマってのはビジュアル系バンド全盛期にビジュアル四天王と呼ばれていた中で技術力や楽曲が一つ飛び抜けていたバンドだった。正直、リアルタイムでは理解できない曲もあったくらい。でもとにかくこいつらは他のバンドとマジ違うぞやべええみたいな気持ちがあって、ギリギリ理解できる曲はパッと聴いた感じにはキャッチーだったのでよく聴いてた。いや、聴いてたというか、いまだに聴いている。たぶん20年近くずっと聴いている。10年ぐらい過ぎてようやく分かってきた曲とかもある。

まあとにかく好きなんすよ。そんなバンドのメインのサウンドメーカーだったHIROさんのね、HIROさん節大炸裂のインストソロアルバムが出たんですよ。

La'cryma ChristiのギタリストHIRO ファースト・ソロ・アルバム 『Gale』

La'cryma ChristiのギタリストHIRO ファースト・ソロ・アルバム 『Gale』

 

そのソロアルバムをひっさげたソロライブなわけね、どう考えても興奮するんすよ、なんなら興奮した。もう済です。この興奮を分け合うための会でした。どれだけ興奮したかというと、何度も諦めたギターの夢を再度追いかけ始めたほど。あれからギター買いに行って毎日練習するほど。なんなんだ、ギター少年か!

ふう、今日の話がまだ出てこない。

そう、そんなライブ映像をね、みなで見ながら「おれって副音声かな?」というぐらいに補足だとか解説をしながら見てたのですよ。そしたら、おれの感じた興奮とか感動とかが、おふぇくやふくもりくんに伝わって本当に良かった。2人もちょっとラクリマの曲を口ずさんだりしてた。

HIROさんのソロライブなのに、なんでラクリマの曲を口ずさむんだよって話なんだけど、今回のライブのサポートメンバーがね、ベース: SHUSE、ドラム: LEVINっていう、ラクリマのメンバーなんすよね。ソロアルバムで演奏しているのも彼ら。もうラクリマじゃん!ッテ感じのライブを観ると興奮しちゃうんすよね。やばいよね。

で、極めつけにはアンコールで相方のギターのKOJIも参戦してラクリマの曲もインストでやるわけね。残すは後ボーカルのTAKAだけなわけ。ボーカルはいろいろあって今この場にいなくてな、、、。待っている感がすごいのよ。ソロ曲だってインストなのに、この曲は、ギタリストとしてボーカルの斜め後ろで弾いてますね〜弾いてますよね〜みたいな曲があったりして、そういうのをひたすら「いいね〜、待ってるね〜、はー悲しいね〜」とつぶやきながら見てた。一言で言うととにかく気持ち悪いおじさんたちだった。

そんなおいおいって感じのおじさんたちがおじさんバンドに興奮していたら、みなちゃんも、いいっすね〜と言ってくれて、この娘の吸収力なんなんだ〜〜〜と感心してた。たぶん接待的な気遣いだと思う。すまねえ。

ライブ映像後は、YouTubeラクリマ時代の全員揃ったライブ映像とかPVを観たり、KOJIが抜け後の解散ライブの切なさなどを語ったりしていた。そうやって過去色々あったバンドが今おじさんになって、プレイも成熟して人間も丸くなり、バンドとしてすごくいい状態になっているのに、肝心のボーカルが色々あってアレってのがすごく残念で悲しい、でもすげーパワーをくれる!なんなの、だいたい思い出補正じゃね?ああそうかも、きっとそう。みたいな感じでした。

はー、よかった。またこの手の高校生みたいな集まりやりたい。

pplog iOS で push 通知をAmazon SNSに変えた

先日、pplog4歳になったタイミングのちょいまえにバージョンアップしたpplog iOSだけども、いくつか新しいことをナンカしている。それを記録がてら記事にしていこうというこのシリーズ。ネタとしては3回分ぐらいはある。今回は push 通知周りのお話。

新生 pplog iOS で push 通知を Amazon SNS

aws.amazon.com

で送るように変えた。

Swift側

特筆することがないので省略。紹介すると言いつつ、いきなり紹介しない。

Rails側

Rails側の機能を洗い出すと以下のようになる

  • iOSからのデバイストークンの受取
    • Amazon SNSにEndPointを生成
  • iOSからのデバイストークンの削除
    • Amazon SNSからEndPointを削除
  • ユーザーのアクションを Trigger にした push通知配信
    • Amazon SNSのEndPointに配信指示

次に、これらの機能をブレイクダウンする。

iOSからのデバイストークンの受取

  • ユーザーが push 通知に同意した際の処理
  • AppDeviceToken#create するリソースを定義(routingの設定とcontrollerの作成をしておく)
    • 普通のCRUDの一つなので今回は省略

iOSからのデバイストークンの削除

  • ユーザーがログアウトとした際に一旦デバイストークンを消す
  • AppDeviceToken#destroy するリソースを定義(routingの設定とcontrollerの作成をしておく)
    • 普通のCRUDの一つなので今回は省略

ユーザーのアクションを Trigger にした push通知配信

  • あるユーザーがポエムを書くと購読しているユーザーに通知を配信
  • あるユーザーがポエムを「読んだよ」して「足あと」を付けると、ポエムを書いたユーザーへ通知を配信

紹介するコード

  • ActiveRecordモデル
  • Amazon SNS クライアント
  • 通知周りのActiveJob

あたりを紹介しておく。

token保存用のテーブル定義

ユーザーのテーブルからhas_many :apple_device_tokensで関連付けるイメージ。

class CreateAppleDeviceTokens < ActiveRecord::Migration[5.1]
  def change
    create_table :apple_device_tokens do |t|
      t.references :user, null: false, foreign_key: true
      t.string :token, null: false, index: { unique: true }
      t.string :endpoint_arn, null: false, default: ''
      t.integer :via, null: false, default: 0
      t.timestamps
    end
  end
end
  • token: APNから取得するデバイストークン
  • endpoint_arn: Amazon SNS の Endpoint の ARN
  • via: iOS アプリの push 通知証明書が sandbox 用か、プロダクション用かを示す

token保存用モデル

Aws::SNS::Errors::EndpointDisabledが発生するのは、APN側で無効となったデバイストークンだったり、サンドボックスのものをプロダクションに送ったりした場合など。 その場合は、Amazon SNS上で勝手にdisabledになっているので、RDB側からも消しておくわけ。

ActiveRecordのモデルにしては責務が多い気もするのでクラスを分けても良いかもしれない。

class AppleDeviceToken < ApplicationRecord
  enum via: {
    sandbox: 0,
    prod: 1
  }

  belongs_to :user

  validates :token, presence: true, uniqueness: true

  after_commit :fetch_endpoint_arn_async, on: :create

  def fetch_endpoint_arn!
    created_response = client.create_platform_endpoint(
      token: token,
      custom_user_data: { user_id: self.user.id }.to_json
    )

    if created_response.successful?
      update!(endpoint_arn: created_response.endpoint_arn)
    end
  end

  def send!(alert:, path:)
    return if self.endpoint_arn.blank?
    return if alert.nil? || path.nil?

    message = {
      default: alert,
      json_root => {
        aps: {
          alert: alert
        },
        path: path
      }.to_json
    }

    # http://docs.aws.amazon.com/sdkforruby/api/Aws/SNS/Client.html#publish-instance_method
    client.publish(
      target_arn: self.endpoint_arn,
      message: message.to_json,
      message_structure: 'json'
    )
  rescue Aws::SNS::Errors::EndpointDisabled
    self.destroy!
  end

  private

  attr_reader :client

  def client
    @client ||= self.sandbox? ? AwsSnsClient.sandbox : AwsSnsClient.prod
  end

  def json_root
    sandbox? ? 'APNS_SANDBOX' : 'APNS'
  end

  def fetch_endpoint_arn_async
    SnsEndpointJob.perform_later(self)
  end
end

AwsSnsClient

Amazon SNS の処理。今回使う API に特化して雑なクライアント設計となった。まあ最小限でいいかという判断。

ポイントは、already exists with the same Token, but different attributes.が返ってきたら、雑に一旦消して投げ直す処理かな。

class AwsSnsClient
  APP_ARN = ENV.fetch('SNS_APP_ARN_PROD_ENDPOINT')
  APP_ARN_SANDBOX = ENV.fetch('APP_ARN_SANDBOX_ENDPOINT')

  def initialize(app_arn:)
    @aws = Aws::SNS::Client.new(
      access_key_id: ENV.fetch('AWS_ACCESS_KEY_ID'),
      secret_access_key: ENV.fetch('AWS_SECRET_ACCESS_KEY'),
      region: ENV.fetch('AWS_SNS_REGION'))
    @app_arn = app_arn
  end

  def create_platform_endpoint(token:, custom_user_data: nil)
    aws.create_platform_endpoint(
      platform_application_arn: app_arn,
      token: token,
      custom_user_data: custom_user_data
    )
  rescue Aws::SNS::Errors::InvalidParameter => e
    if e.message =~ /already exists with the same Token, but different attributes./
      if end_point_arn = e.message.scan(/arn:aws:sns[\S]+/).first
        delete_endpoint(endpoint_arn: end_point_arn)
        retry
      end
    end
  end

  def delete_endpoint(endpoint_arn:)
    aws.delete_endpoint(
      endpoint_arn: endpoint_arn
    )
  end

  def publish(options = {})
    aws.publish(options)
  end

  class << self
    def prod
      self.new(app_arn: APP_ARN)
    end

    def sandbox
      self.new(app_arn: APP_ARN_SANDBOX)
    end
  end

  private

  attr_reader :aws, :app_arn
end

Active Job

  • EndPointを登録するJob
  • EndPointに配信するJob

の2つを定義した。

SnsEndpointJob

EndPointを登録するジョブ。

class SnsEndpointJob < ApplicationJob
  queue_as :aws_sns

  def perform(apple_device_token)
    apple_device_token.fetch_endpoint_arn!
  end
end

SnsSendingJob

EndPointに配信するジョブ。

通知のメッセージをモデルに定義したくなかったので、app/views/application配下にメッセージのテンプレートを置いて、ApplicationController.render()でレンダリングして配信メッセージとして送るようにした。

class SnsSendingJob < ApplicationJob
  queue_as :aws_sns

  def perform(apple_device_token, trigger)
    payload_json = ApplicationController.render(
      "apple_push_notification_for_#{trigger.class.name.downcase}",
      assigns: {
        trigger: trigger
      }
    )
    payload = JSON.parse(payload_json)

    apple_device_token.send!(alert: payload['alert'], path: payload['path'])
  end
end

以下のように呼ぶ

user.apple_device_tokens.each do |apple_device_token|
  SnsSendingJob.perform_later(apple_device_token, trigger)
end

感想

Amazon SNSに雑に投げれば良いのはホント楽だったけど、GAEでもはもっと楽かもしれない。知らない。もっとあれなら検討しても良いかも。