この間作った Bot は一定時間経つと死ぬことがわかった
さっそく職場で動かしてみたんですが、半日くらい放置してると死ぬことがわかりました。
そもそも
Ruby で Bot を作るなら、こちらの slack-ruby-bot
を使うほうが良さそうです。
slack-ruby-client
の README にも、Bot 作るなら slack-ruby-bot
使えよって書いてあります。
後述しますが、今回僕が作った Bot が死んでる原因にもちゃんと対策されているので、slack-ruby-bot
を使うのがいいんじゃないでしょうか。
やむを得ない事情
職場の Slack に Bot をチャンネルに invite する権限がなくて、今は slack-ruby-bot
の採用を断念してます。*1
そのうち権限を要求したい。
というわけで自前の Bot を無理やり直しました
原因
どうやら、RTM API のコネクション (WebSocket) は一定時間でサーバ側から切断されるようです。そりゃそうか。
対策
RTM API のコネクションが切れたら新しい接続を開始するようにしました。
def start! # RTM Connection client = Slack::RealTime::Client.new client.on :hello do ... client.on :message do |data| ... client.on :closed do |_data| puts "Client has disconnected successfully!" start! end end start!
でもこういうやり方でいいのかしら。ちょっと不安。
Bot の発言に反応する Slack Bot を Ruby で作ってました。
2 月から転職して新しい職場でバタバタしたり、風邪でダウンしたりでなかなかブログが書けませんでした。 いろいろ落ち着いてきたので、これからは週1くらいで何か書けたらなと思っています。
ことのはじまり
https://your-workspace.slack.com/customize/slackbot
つくりました
動作に必要な環境
- docker
- docker-compose
- WebSocket が通信できる環境
準備
1. Bot を Workspace に追加する
追加すると API Token が見れるので、控えておく。
反応するチャンネルに Bot を招待する
2. コードを clone
して .env
をつくる
$ git clone https://github.com/ikasam/slack-bot.git
$ cd slack-bot
$ cp .env.sample .env
.env
に設定する項目
SLACK_BOT_TOKEN=xoxp-XXXXXXXXXXX <- さっき控えた API Token SLACK_CHANNEL=#general <- 反応するチャンネル SLACK_CHANNEL_OPS=#bot-test <- (省略可) 接続成功をお知らせするチャンネル KEYWORD=hoge <- 反応するキーワード
これで準備は完了。
実行
$ docker-compose up -d
これだけ。
動作確認
SLACK_CHANNEL_OPS
を設定しているときは、接続成功時に以下のようにメッセージが飛んできます。
Bot の発言にも反応してくれている!
解説
slack-ruby-client とう gem をつかって作りました。
- Real Time Messaging API というものを使います。WebSocket で通信するので、プロキシ環境下だと動かないかも。
# RTM Connection client = Slack::RealTime::Client.new
- 接続がうまくいったら、Slack が
hello
を送信してきます。
client.on :hello do # 接続時の処理 end
- あらゆるイベントは
message
で送られてきます。
client.on :message do |data| if (not KEYWORD.empty?) and data.channel == CHANNEL_ID case data.text when /#{KEYWORD}/ then client.message channel: data.channel, text: "<!channel> yo!" when /#{BOT_USER_ID}/ then client.message channel: data.channel, text: "<@#{data.user}> Hi." end end end
もっと細かいことをしたいなら、Slack API のドキュメントを読みながらやると良いと思います。
参考
Slack API のドキュメント api.slack.com
slack-ruby-client を使わない実装。Real Time Messaging API の勉強になる。 studio-andy.hatenablog.com
Docker 上の PHP 環境に Composer コンテナでパッケージをインストールする
https://hub.docker.com/r/composer/composer/
リンク先に書いてあることが全てなんですが、それだとあんまりなのでちょっと説明しておきます。
ざっくりいうと、PHP 環境のコンテナとは別に Composer の入ったコンテナを用意して、
docker run --rm
でスポット的に動かします。
1. イメージを pull する
$ docker pull composer/composer
これを書いている時点で、Hub に push されているイメージのバージョンは 1.2.0 でした。
$ docker run --rm composer/composer --version Composer version 1.2.0 2016-07-19 01:28:52
最新のものがほしければ、ソースからビルドすればよいです。
2. composer.json
を書く
適当に欲しいものを書いてください。
{ "require": { "smarty/smarty": "~3.1", "ezyang/htmlpurifier": "*" } }
3. 実行する
$ docker run --rm -v $(pwd):/app composer/composer install Loading composer repositories with package information Updating dependencies (including require-dev) - Installing smarty/smarty (v3.1.31) Downloading: 100% - Installing ezyang/htmlpurifier (v4.9.3) Downloading: 100% Writing lock file Generating autoload files
4. docker run
がめんどくさい人は
PATH
が通ったところにシェルスクリプトを置きましょう。
$ sudo sh -c "cat >/usr/local/bin/composer" <<'EOF' #!/bin/sh export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin echo "Current working directory: '"$(pwd)"'" docker run --rm -v $(pwd):/app -v ~/.ssh:/root/.ssh composer/composer $@ EOF $ sudo chmod +x /usr/local/bin/composer $ composer --version Current working directory: '/home/ikasamak/work/docker-lamp/html/selfphp' Composer version 1.2.0 2016-07-19 01:28:52
docker-compose で PHP の実行環境を作る
PHP の勉強をはじめるにあたって、最初に取り組んだのが実行環境の構築です。 この記事ではそれを振り返ってみます。
そんなことをしなくても
今時は PHP を書いて実行できる Web サービスはいくらでもあるので、 そういう面倒なのはいいから PHP を書いて動かすことだけしたいという人はそっちを当たると良いと思います。 知っている範囲だと Cloud9 や paiza.io なんてのがあります。
ぼくは今後役立つだろうと思ったので、あえて手元に実行環境を作る方を選びました。
前提知識
- Linux はそこそこ触ったことがある
- Docker についてはなんとなく知っているけれど、使ったことはない
つくる環境
- いわゆる LAMP 環境です
- CentOS 7 上に Docker をインストールして使います
- Docker コンテナ上で PHP, Apache, MySQL を動かします
- コンテナの立ち上げには docker-compose を使います
環境構築手順
1. Docker インストール
2017年12月27日現在、サポートされている CentOS のバージョンは 7 です。 6 以下だったら上げときましょう。
CentOS の Docker CE x86_64 をインストールします。
Docker のインストールに必要なパッケージ。なかったら先にインストールしましょう。
$ sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
Docker CE のリポジトリを追加します。
$ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
Docker をインストール。
$ sudo yum install docker-ce
docker -v
でバージョンが表示されたらインストール成功です。
$ docker -v
Docker version 17.03.1-ce, build c6d412e
ちなみに、docker
を動かすためには root 権限が必要です。
$ docker images
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.27/images/json: dial unix /var/run/docker.sock: connect: permission denied
それが面倒なら、docker
コマンドを実行するユーザを docker
グループに所属させましょう。
$ sudo gpasswd -a <username> docker
2. docker-compose インストール
こちらはさくっと終わります。
sudo curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
3. Dockerfile
や docker-compose.yml
の準備
ぼくが使っているものは以下にあります。これをクローンしても動きます。たぶん。
https://github.com/ikasam/docker-lamp
docker-compose.yml
version: '2' services: mysql: build: ./mysql environment: MYSQL_ROOT_PASSWORD: pass volumes: - db:/var/lib/mysql php: build: ./php ports: - '8080:80' volumes: - ./html:/var/www/html depends_on: - mysql volumes: db:
mysql/Dockerfile
FROM mysql:5.7 COPY ./charset-utf8.cnf /etc/mysql/conf.d/
php/Dockerfile
FROM php:7-apache COPY php.ini /usr/local/etc/php/ RUN apt-get update \ && docker-php-ext-install pdo_mysql mysqli mbstring
4. コンテナの起動
docker-compose.yml
があるディレクトリ上で、以下のコマンドを実行します。
$ docker-compose up -d
5. 動作確認
phpMyAdmin を置いて、PHP の動作と MySQL との連携を確かめます。
$ cd html/ $ wget https://files.phpmyadmin.net/phpMyAdmin/4.4.13.1/phpMyAdmin-4.4.13.1-all-languages.tar.gz $ tar zxf phpMyAdmin-4.4.13.1-all-languages.tar.gz $ mv phpMyAdmin-4.4.13.1-all-languages myadmin $ cd myadmin/ $ cp config.sample.inc.php config.inc.php
config.inc.php
に書いてある接続先を、localhost
から mysql
に変更します。
$cfg['Servers'][$i]['host'] = 'mysql';
ブラウザでアクセスします。
今回の例では port を 8080 にしているので、http://<IPアドレス>:8080/myadmin
でアクセスします。
id:root、パスワード:pass でログインできれば成功です。
適当な SQL でも投げてみましょう。
参考文献
環境作成にあたって、以下の記事を参考しました。 各設定の詳しい解説はそちらを参照してください。 また、docker-compose 等のコードも fork して使用させていただいています。
PHP の勉強をはじめました
タイトルのとおりです。まずは基礎を独学でがんばります。
書籍を読んで、練習問題とかに取り組んだり取り組まなかったりしています。
使っている教材はこれ。独習できそうな感じですね。
- 作者: 山田祥寛
- 出版社/メーカー: 翔泳社
- 発売日: 2016/05/11
- メディア: Kindle版
- この商品を含むブログを見る
書いたコードはこちら。
きっかけ
開発環境
CentOS 上の Docker でやってます。もっと簡単なのもあったと思うけど、Docker の勉強がてらに。
ほとんどは先人の書いた記事を参考にしたんですけど、この辺について別の記事で書きたいと思ってます。
今後の目標
書籍を一通り消化したら、次はフレームワークの勉強をしたいですね。
CakePHP を使うみたいなので、とりあえずはその勉強かな?
いい教材があったら教えて欲しい。
*1:入社までにマスターしますと豪語してしまった……。
一からやり直すことにした。
1年くらい前に作ったこのブログにはロクなことが書かれてなくて一瞬で飽きていたので全部の記事を削除した。 勉強したこととか調べたことを記録するところにできたらいいなと思っています。