とあるプロダーツプレイヤーの徒然日記

とあるプロダーツプレイヤーが徒然なるままによしなし事をそこはかとなく書きつくろいます

LINEBotって簡単じゃない?

本日は

最近、巷で流行りのBotですが、LINEボットって本当に簡単にできるんです。 ちょっと、会社で紹介する機会があったのでこちらでも。

まずは申請しましょう

https://business.line.me/ja/

申請画面

f:id:yamadagenki:20160623233303p:plain

こんな画面になる

f:id:yamadagenki:20160623233313p:plain

こんな画面になる(続き)

f:id:yamadagenki:20160623233247p:plain

この辺の値が大事

f:id:yamadagenki:20160623233254p:plain

ここのURLをちゃんと設定する

f:id:yamadagenki:20160623233240p:plain

ここのURLは

SSLじゃなくては行けないらしい。 ※巷では、Let's Encryptではダメとかいう都市伝説があるが、都市伝説です。

routes.rbを設定する

  # line bot
  post '/callback' => 'bot#callback'

設定を書く

CHANNEL_ID = ENV['LINE_CHANNEL_ID']
CHANNEL_SECRET = ENV['LINE_CHANNEL_SECRET']
CHANNEL_MID = ENV['LINE_CHANNEL_MID']

controllerを書く

# rubocop:disable all
def callback
  render nothing: true, status: 470 unless validate_signature? #アクセス制限
  result = params[:result][0]
  text_message = result['content']['text'] #送信された単語
  from_mid = result['content']['from'] #送信された相手

  client = Line::Bot::Client.new do |config|
    config.channel_id     = CHANNEL_ID
    config.channel_secret = CHANNEL_SECRET
    config.channel_mid    = CHANNEL_MID
  end

  client.send_text([送信先MID], text: text_message) #※※補足あり

  render nothing: true, status: :ok
end
# rubocop:enable all

LINEからのアクセスのみ許す

  # LINEからのアクセスか確認.
  # 認証に成功すればtrueを返す。
  def validate_signature?
    signature = request.headers['X-LINE-ChannelSignature']
    http_request_body = request.raw_post
    hash = OpenSSL::HMAC.digest(OpenSSL::Digest::SHA256.new,
                                CHANNEL_SECRET,
                                http_request_body)
    signature_answer = Base64.strict_encode64(hash)
    signature == signature_answer
  end

ちなみに

こんな便利なgemがある http://qiita.com/gogotanaka/items/9885ef202066e5d6eff9

gem 'line-bot'

言葉以外いろいろできる

client.send_text(["uxxxxxxxxxxxxx"],
  text: "Hi!"
)

client.send_image(["uxxxxxxxxxxxxx"],
  originalContentUrl: "http://example.com/original.jpg",
  previewImageUrl: "http://example.com/preview.jpg"
)

client.send_video(["uxxxxxxxxxxxxx"],
  originalContentUrl: "http://example.com/original.jpg",
  previewImageUrl: "http://example.com/preview.jpg"
)

client.send_audio(["uxxxxxxxxxxxxx"],
  originalContentUrl: "http://example.com/original.m4a",
  contentMetadata: {
    "AUDLEN" => "240000"
  }
)

更にちなみに

ユーザローカルという会社で人工知能会話APIを提供している(無料)

http://www.userlocal.jp/news/201605101/

スクリーンショット 2016-06-23 23.12.11.png (1.4 MB)

結果

f:id:yamadagenki:20160623233833p:plain

Instagramとの戦い(その1)

今回からもう少しライトな感じで頻度高く書いていこうと思う

SNSそろそろオワコン

こんなサービスが出てきて、世も末だな。 オンラインコミュニケーションなんてクソだな。 こんなのもはや完全マーケティングツールやん。

と思ってしまい、

それと同時に、「あ、おれこれ作れる」と思った。

hashlikes.jp

しかし

InstagramAPIを調べてみると、利用条件が結構厳しく、 ちゃんとしたサービス作らないと使わせてやんないよ。的なことが書いてある。 (※サンドボックスモードではかなりアクセスに制限がある)

つらい。

Instagram Developer Documentation

でも、

でも、違った角度からせめて見ようと思ったので、続きに期待。

とりあえず、インスタグラムとの戦いは続く。

【備忘録】htmlにおける斜めの要素

概要

PROJECTS | aircordがかっこ良くて f:id:yamadagenki:20160229081300p:plain:w500

この斜めの要素ってどうやってcss書いてるんだろうと調べた時の備忘録

やり方

transform:skew()-CSS3リファレンス に従う。

やってみる

まずはcss

    .yamadagenki-20160229{
      position: relative;
      background-color: limegreen;
      width: 200px;
      height: 200px;
    }

    .yamadagenki-20160229 .naname1{
      position: absolute;
      top: 50px;
      left: 50px;
      background-color: red;
      transform: skewX(20deg);
      width: 100px;
      height: 100px;
    }

    .yamadagenki-20160229 .naname2{
      position: absolute;
      top: 50px;
      left: 50px;
      background-color: red;
      transform: skewY(20deg);
      width: 100px;
      height: 100px;
    }

    .yamadagenki-20160229 .naname3{
      position: absolute;
      top: 50px;
      left: 50px;
      background-color: red;
      transform: skew(-20deg,-20deg);
      width: 100px;
      height: 100px;
    }
    .yamadagenki-20160229 .naname4{
      position: absolute;
      top: 50px;
      left: 50px;
      transform: skew(20deg,20deg);
      width: 100px;
      height: 100px;
    }

X方向に。。。

    <div class="yamadagenki-20160229">
      <div class="naname1">てへへ</div>
    </div>
てへへ

Y方向に。。。

    <div class="yamadagenki-20160229">
      <div class="naname2">てへへ</div>
    </div>
てへへ

字だけまっすぐに。。。

    <div class="yamadagenki-20160229">
      <div class="naname3"><p class="naname4">てへへ</p></div>
    </div>

てへへ

まとめ

これ使いこなして、かっこいいデザインやってみたいなぁ。

ダーツの軌道について

概要

ダーツを投げる上で最近話題のダーツの軌道について、 動画とともに実践してみる。

3つの軌道

3つの軌道があると言われているので、それぞれの動画と考察をしてみた。

表抜き

矢の表面が風の抵抗を受ける投げ方のことを指す(らしい)

youtu.be

このように、矢が下を向いて急速に下降する。

f:id:yamadagenki:20160210100827p:plain:w500

投げてみた感想
  • 後ろを押し出すようにして投げる
  • 投げてすぐに下降が始まりコントロールしづらい
  • 空気抵抗を考えるとスピードついて下降していくので、矢速がつく

裏抜き

矢の裏面が風の抵抗を受ける投げ方のことを指す(らしい)

youtu.be

このように、一瞬は矢が上を向くが、空気抵抗によって下向きに変わり。 刺さる際には下向きに刺さる。

f:id:yamadagenki:20160228204050p:plain:w500

投げてみた感想
  • 後ろを引っ掛ける用に投げる
  • 慣れの問題なのか、飛び方の予測が付きづらくどうやって刺さっているダーツに当たるか読めない
  • ふんわりして飛んでいる感覚

芯抜き

矢の芯を押し出して、真っ直ぐ飛ばす投げ方のことを指す(らしい)

youtu.be

本当に真っ直ぐ、スーッと飛ばすイメージ

f:id:yamadagenki:20160228210207p:plain:w500

投げてみた感想
  • 力を伝えてなげられるので気持ちいい
  • 真っ直ぐ飛ぶ
  • 普段、芯抜きで投げているので気持ちいい

まとめ

とりあえず、いろいろ投げてまとめてみました。

個人的にはやっぱり、芯抜きが気持ちいいですね。 飛んでる感あるので。

しかし大事なのは、何が自分に合っているのか見つけることです。 なので、自分にあった投げ方を見つけてみてください。

AWSのELBのSSL証明書をLet's Encryptを使い更新する

概要

AWSのELBのSSL証明書をLet's Encryptを使い更新した時の話。

Let's Encryptの証明書は90日で切れるため、それを自動的に更新しなければならない。 その時の作業をした際の備忘録的な事を記す。

基本的に

基本的に

Let's Encrypt 証明書の自動発行とELB自動登録を行ったログ - Qiita

に従う。非常にいい記事でした

ハマったポイント

アクセス許可

http://qiita.com/hidekuro/items/482520f220a305dc147b#4-nginx-%E3%81%AB%E7%A9%B4%E3%82%92%E9%96%8B%E3%81%91%E3%82%8B

において、http通信を任意のIPから通信できるようにする。

regionの指定

http://qiita.com/hidekuro/items/482520f220a305dc147b#5-%E8%87%AA%E5%8B%95%E5%8C%96%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88

に於いて、

# 新しい証明書を IAM にアップロード
$EXEC_AWS iam upload-server-certificate --server-certificate-name $NEW_SERVER_CERT_NAME \
  --certificate-body file://$CERT_PATH \
  --private-key file://$PRIVKEY_PATH \
  --region ap-northeast-1 ## リージョンを指定する必要がある。
  --certificate-chain file://$CHAIN_PATH

まとめ

基本的にQiita記事どおりにやればいいので、完全に備忘録でした。

個人開発を支えるRailsにおけるCI環境

概要

一人で開発してると、とにかく自動でいろいろやりたいです。 - コードの静的解析 - テストコード実行 - セキュリティチェック - デプロイ など、手元の環境で毎回行うのはひどく時間がかかるし、めんどくさいの一言に尽きると思います。

自分なりに工夫して設定したCI環境(CircleCI使用)についてやっていることを見直しがてら書いてみます。

CircleCIを使ったCI環境

現在使っているCircleCIの設定をベースに書いていきます。

静的コード解析

使用gem:bbatsov/rubocop - Ruby - GitHub

コードを綺麗に保つことって大事ですよね。 ってことで、コードの静的解析ツールを入れます。

test:
  pre:
    - bundle exec rubocop

こんな感じに、testを行う前にやりましょう。 これはとても大事なことで、なぜならテストは失敗する可能性があり、無駄に時間が(相対的に)長いからです。 rubocopの設定は、各自行っていただければと。 実際これは結構厳しいので、ゆるめた方がいいと思います。

https://github.com/yamadagenki/mypage/blob/develop/.rubocop.yml

セキュリティチェック

使用gem:GitHub - presidentbeef/brakeman: A static analysis security vulnerability scanner for Ruby on Rails applications

みなさん、Railsアプリケーションのセキュリティってどうやってチェックしてますか? brakemanというgemはそこそこ紹介されていますが、実際にCIツールと連携して自動でチェックさせるとその効果がより発揮されます。

test:
  pre:
    - bundle exec brakeman -4 -A -w 1 -z

上記のように設定することで、 - warning level 1(-w 1)のマックスレベルでチェック - セキュリティ的になにか問題あったらそこでCI失敗させる(-z)

とでき、セキュリティ的にまずかったらCIの実行を失敗させることができます。

他にも、様々なオプションがあるので、プロジェクトに合わせて適宜設定すること。

テスト

使用gem:GitHub - rspec/rspec: RSpec meta-gem that depends on the other components

言わずと知れたテストコードのgemです。 実際CI環境では下記の用に設定すると、設定してやると動きます。

  override:
    - bundle exec rspec --format RspecJunitFormatter --out $CIRCLE_TEST_REPORTS/rspec.xml --format progress:
        parallel: true
        files:
          - spec/**/*_spec.rb

ここで、非常に重要なのが、テストにこだわるならやはりカバレッジレートは気にしなくてはいけません。

https://github.com/colszowka/simplecovを導入し、spec/rails_helper.rbの冒頭に

require 'simplecov'
SimpleCov.coverage_dir File.join(ENV['CIRCLE_ARTIFACTS'], 'coverage') if ENV['CIRCLE_ARTIFACTS']
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([SimpleCov::Formatter::HTMLFormatter])
SimpleCov.start do
  add_filter '/vendor/'
  add_filter '/spec/'
  add_filter '/config/'
  add_filter '/db/'
end

と追加することで https://circleci.com/*/#artifacts のようなディレクトリにどのファイルがどれくらいテストコードによって網羅されているのかを視覚化できます。

f:id:yamadagenki:20160209105438p:plain これをクリックすると f:id:yamadagenki:20160209105509p:plain こんなのができて、テストコードを各側のKPIとしても使うことができます。

Mutationテストなど、もっと複雑な指標を持ち出す方法に関してどなたか知っていたら教えていただければ。

デプロイ

ブランチプッシュしたら、正直デプロイするコマンド叩くのもだるいので、デプロイも自動化します。 下記のように書くと、masterブランチがgithubにpushされたら、自動でデプロイしてくれます。

deployment:
  production:
    branch: master
    commands:
      - bundle exec cap production deploy deploy:restart --trace

但し、 https://circleci.com/gh///edit#ssh のようなところから、サーバーにアクセスするための鍵を設定しなければいけません。 f:id:yamadagenki:20160209105918p:plain

他にも使用する環境変数をCI環境に設定するための画面があり、適宜隠蔽したい情報を環境変数に埋め込むことをおすすめします。 f:id:yamadagenki:20160209110021p:plain

※もともとCircleCIで定義されている環境変数に関しては CircleCI 上で、最初から定義されている環境変数について | Carpe Diemを参照してください。

なお、ブランチによっては、テストとかすっ飛ばしてデプロイだけして欲しかったりします。 そんな時は、CircleCIでは個別に設定できないので spec/rails_helper.rbで

exit if ENV['CIRCLE_BRANCH'] == 'sandbox'

のように冒頭に一行追加しましょう。 rspec側でテストをスキップするのです。

最後に

個人開発していると、本当にいろいろとだるいので、なるべく寝てる間にいろいろと終わってて欲しいです。

怠惰はプログラマとしての最高の美徳だというので、プログラマとしては怠惰になり、 ダーツプレイヤーとしては地道に努力を惜しまず生きていこうと思います。

他にもなにか便利な使い方があったら知りたいです。

video_tagで動画を再生させる

概要

railsで動画再生する際にちょっとハマったので備忘録程度に記す

やってみる

手順は、ざっと言うと以下の通りである。

  • 画像を変換する
  • 画像をアップする
  • video_tagを使って読み込ませる

では、一つ一つ見ていく

画像を変換する

いろいろ調べると、ブラウザによって、再生できる動画ファイルの形式が違うらしい。 なので、手始めに動画ファイルの形式を変換する。(手っ取り早くwebm形式にする)

画像をアップロードする

public/videos/以下に置く or assets/videos/(未検証)におけばいいのではないかと。

public/videosは間違いない

video_tagを使って読み込ませる

下記のようなコードをかけばよい。

video_tagの仕様は下記のとおりだが、 video_tag - リファレンス - - Railsドキュメント

実際には、

video 要素 - HTML | MDN

に載ってるオプションも使える。

= video_tag 'test.webm', autoplay: true, muted: true, controls: true, preload: true

感想

webm形式の画像に変換するという予備知識が必要だったので、つまずいた。 webm形式にするのもいいが、いろんな形式の動画を用意しといて、ブラウザに合わせて出し分けるのがよりよい方法っぽい。 その場合は、htmlコードを直に書く必要があるのかも?

HTML5 の audio 要素と video 要素でサポートされているメディアフォーマット - HTML | MDN