LINEBotって簡単じゃない?
本日は
最近、巷で流行りのBotですが、LINEボットって本当に簡単にできるんです。 ちょっと、会社で紹介する機会があったのでこちらでも。
まずは申請しましょう
申請画面
こんな画面になる
こんな画面になる(続き)
この辺の値が大事
ここのURLをちゃんと設定する
ここの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/
結果
Instagramとの戦い(その1)
今回からもう少しライトな感じで頻度高く書いていこうと思う
SNSそろそろオワコン化
こんなサービスが出てきて、世も末だな。 オンラインコミュニケーションなんてクソだな。 こんなのもはや完全マーケティングツールやん。
と思ってしまい、
それと同時に、「あ、おれこれ作れる」と思った。
しかし
InstagramのAPIを調べてみると、利用条件が結構厳しく、 ちゃんとしたサービス作らないと使わせてやんないよ。的なことが書いてある。 (※サンドボックスモードではかなりアクセスに制限がある)
つらい。
Instagram Developer Documentation
でも、
でも、違った角度からせめて見ようと思ったので、続きに期待。
とりあえず、インスタグラムとの戦いは続く。
【備忘録】htmlにおける斜めの要素
概要
PROJECTS | aircordがかっこ良くて
この斜めの要素ってどうやって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つの軌道があると言われているので、それぞれの動画と考察をしてみた。
表抜き
矢の表面が風の抵抗を受ける投げ方のことを指す(らしい)
このように、矢が下を向いて急速に下降する。
投げてみた感想
- 後ろを押し出すようにして投げる
- 投げてすぐに下降が始まりコントロールしづらい
- 空気抵抗を考えるとスピードついて下降していくので、矢速がつく
裏抜き
矢の裏面が風の抵抗を受ける投げ方のことを指す(らしい)
このように、一瞬は矢が上を向くが、空気抵抗によって下向きに変わり。 刺さる際には下向きに刺さる。
投げてみた感想
- 後ろを引っ掛ける用に投げる
- 慣れの問題なのか、飛び方の予測が付きづらくどうやって刺さっているダーツに当たるか読めない
- ふんわりして飛んでいる感覚
芯抜き
矢の芯を押し出して、真っ直ぐ飛ばす投げ方のことを指す(らしい)
本当に真っ直ぐ、スーッと飛ばすイメージ
投げてみた感想
- 力を伝えてなげられるので気持ちいい
- 真っ直ぐ飛ぶ
- 普段、芯抜きで投げているので気持ちいい
まとめ
とりあえず、いろいろ投げてまとめてみました。
個人的にはやっぱり、芯抜きが気持ちいいですね。 飛んでる感あるので。
しかし大事なのは、何が自分に合っているのか見つけることです。 なので、自分にあった投げ方を見つけてみてください。
AWSのELBのSSL証明書をLet's Encryptを使い更新する
概要
AWSのELBのSSL証明書をLet's Encryptを使い更新した時の話。
Let's Encryptの証明書は90日で切れるため、それを自動的に更新しなければならない。 その時の作業をした際の備忘録的な事を記す。
基本的に
基本的に
Let's Encrypt 証明書の自動発行とELB自動登録を行ったログ - Qiita
に従う。非常にいい記事でした
ハマったポイント
アクセス許可
において、http通信を任意のIPから通信できるようにする。
regionの指定
に於いて、
# 新しい証明書を 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
セキュリティチェック
みなさん、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 のようなディレクトリにどのファイルがどれくらいテストコードによって網羅されているのかを視覚化できます。
これをクリックすると こんなのができて、テストコードを各側のKPIとしても使うことができます。
Mutationテストなど、もっと複雑な指標を持ち出す方法に関してどなたか知っていたら教えていただければ。
デプロイ
ブランチプッシュしたら、正直デプロイするコマンド叩くのもだるいので、デプロイも自動化します。 下記のように書くと、masterブランチがgithubにpushされたら、自動でデプロイしてくれます。
deployment: production: branch: master commands: - bundle exec cap production deploy deploy:restart --trace
但し、 https://circleci.com/gh///edit#ssh のようなところから、サーバーにアクセスするための鍵を設定しなければいけません。
他にも使用する環境変数をCI環境に設定するための画面があり、適宜隠蔽したい情報を環境変数に埋め込むことをおすすめします。
※もともとCircleCIで定義されている環境変数に関しては CircleCI 上で、最初から定義されている環境変数について | Carpe Diemを参照してください。
なお、ブランチによっては、テストとかすっ飛ばしてデプロイだけして欲しかったりします。 そんな時は、CircleCIでは個別に設定できないので spec/rails_helper.rbで
exit if ENV['CIRCLE_BRANCH'] == 'sandbox'
のように冒頭に一行追加しましょう。 rspec側でテストをスキップするのです。
最後に
個人開発していると、本当にいろいろとだるいので、なるべく寝てる間にいろいろと終わってて欲しいです。
怠惰はプログラマとしての最高の美徳だというので、プログラマとしては怠惰になり、 ダーツプレイヤーとしては地道に努力を惜しまず生きていこうと思います。
他にもなにか便利な使い方があったら知りたいです。
video_tagで動画を再生させる
概要
railsで動画再生する際にちょっとハマったので備忘録程度に記す
やってみる
手順は、ざっと言うと以下の通りである。
- 画像を変換する
- 画像をアップする
- video_tagを使って読み込ませる
では、一つ一つ見ていく
画像を変換する
いろいろ調べると、ブラウザによって、再生できる動画ファイルの形式が違うらしい。 なので、手始めに動画ファイルの形式を変換する。(手っ取り早くwebm形式にする)
- linuxの人はConverting M4V to MP4 and WEBM with FFmpegを参考に
- windowsの人は本ブログのサポート対象外ですが、オンラインでできるM4V をWEBMに変換します。オンラインで無料です- Convertioを使えば良いのではないかと
画像をアップロードする
public/videos/以下に置く or assets/videos/(未検証)におけばいいのではないかと。
public/videosは間違いない
video_tagを使って読み込ませる
下記のようなコードをかけばよい。
video_tagの仕様は下記のとおりだが、 video_tag - リファレンス - - Railsドキュメント
実際には、
に載ってるオプションも使える。
= video_tag 'test.webm', autoplay: true, muted: true, controls: true, preload: true
感想
webm形式の画像に変換するという予備知識が必要だったので、つまずいた。 webm形式にするのもいいが、いろんな形式の動画を用意しといて、ブラウザに合わせて出し分けるのがよりよい方法っぽい。 その場合は、htmlコードを直に書く必要があるのかも?