いつかエンジニアになりたい

Nothing is too late to start

自分 Release Notes - (ver 0.32.10)

じぶん Release Notes - (ver 0.32.10)がリリースされました。更新内容は下記のとおりです。

仕事

  • 転職して4ヶ月目。だんだん、担当案件が増えてきた。MSPという業種の難しさを少しずつ実感
    • 様々なインフラ、クラウドに関われるのはすごく魅力的だが、お客様のサービスなので、主体的に決められない部分が多く、お客様に左右されるところがある
  • 業務的にクラウドはもちろん、Kubernetesとか最新技術に関われているのので、しっかりと学習して、学んだ知識を自身の技術力にする

プライベート

■ 遊び(目標:毎月新しいことを1つやる)

  • 登山(西穂高、北横岳)
    • 乗鞍岳に行くつもりが前の日が台風で交通止めになっていて、結局、西穂高、北横岳に行った
    • 天気が悪く、ガスっていて全然景色が見えなかったのが残念。西穂はまた行きたいなー。(北横岳は何回も行ったので、もういいかな)
  • 野球観戦(ヤクルトVS広島@神宮)
    • 初めての野球観戦。劇的な試合で面白かった
    • 一人では行かないけど、たまにみんなで行くにはいいなと思った。ただ、野球は時間が決まっていないので、長かった。
  • フットサル参加(2回)
    • 今月は2回参加できた。良い傾向。運動しないと太るので意識して、運動する
  • 座席表生成のPythonスクリプト作成
    • 知り合いから頼まれた法事の座席表作成をPythonで作成できた
    • 手では大変だったのでプログラムで書いた+リスト読み込んで、一人ひとり毎の座席表をEXCELで生成する簡単なものだが、すぐにできてよかった
    • PythonでのEXCEL操作は昔やったのに完全に忘れていた。やらないと忘れるのは仕方ない
    • プログラミング言語を忘れないように、これからも積極的に書くように心がける

■ 映画

  • 天気の子

前評判をあまり聞かなかったので、期待していなかったが、面白かった。じわじわずっと面白かった。 filmarks.com

実写はすごいけど、アニメ映画のほうが好き。最後まで違和感が抜けなかった

filmarks.com

■ 読書・ブログ(目標:毎月1冊、1記事以上)

WEB+DB PRESS Vol.112

gihyo.jp

入門 Kubernetes

入門 Kubernetes

入門 Kubernetes

Kubernetes実践入門 プロダクションレディなコンテナ&アプリケーションの作り方

Kubernetes実践入門 プロダクションレディなコンテナ&アプリケーションの作り方 (Software Design plusシリーズ)

Kubernetes実践入門 プロダクションレディなコンテナ&アプリケーションの作り方 (Software Design plusシリーズ)

■ 資格

AWSの資格取得。これで、やっとAWSの資格3冠(スペシャリストは取得する気はないので、あと3つ・・・)。今回は何とか合格してよかったが、試験勉強をほとんどやっていなかったので、本当に危なかった。本当に良かった(試験結果が出るまで不合格を覚悟していた)。今回は、ある程度普段から業務で触ってる状態で受けたが、結構、分かる内容が多く、業務で触っていれば試験勉強不要説はあるのかも(アソシエイトレベルまでであれば)。今月頭にはDVA予定なので、しっかりと計画を立てて合格を目指す。

■ 勉強会・イベント(目標:毎月1回以上)

  • HISUCON2019

HISUCON2019(=社内版 ISUCON)に参加。運よく優勝(ほとんど役にたたず)。改めて、モニタリングの重要性を感じた。今年は間に合わなかったけど、来年は本家ISUCONも出てみたい。今年中に一緒に出てくれる仲間集め、及び、過去問とかをやってチューニング力を上げたい。

buildersconに初参加。キャッシュレスの話が多かったイメージ。大学の先輩、後輩に多数会って、狭い業界だなと改めて感じた。そして改めて勉強しなきゃと感じた。業務で利用できる知識は少なくとも、せめてアウトプットしないとだめだ。勉強会に参加したらブログを書こう。

builderscon.io

PyCon JPに初参加。英語のセッション多かった。パッケージング、配布とかTips的な話を聞きたくて参加したがあまりなかった。Youtubeで配信していたので、来年はリモート参加でもいいかなと感じた

pycon.jp

KPT

■ Keep

  • 会社での週次振り返り、リリースノートが実施できた。継続する
  • 振り返ってみると、登山、映画など新しいことが比較的できた。継続する
  • 休日に勉強できている。継続する

■ Problem

  • アウトプットができていない
    • 社内勉強会などで積極的にアウトプットする。社外勉強会に参加した場合は参加レポートとか書くようにする。もったいない
  • 資格勉強が計画的にできていない
    • 試験を予約する。計画を立て、計画的に勉強する。資格を取る
  • 週次振り返りと自分ReleaseNoteの範囲が被っている
    • しばらく続けてみて、書くこと、やり方などを考えてみる。まずは振り返ることが大事なので、とりあえずは現状維持
    • そもそも自分リリースノート≠振り返りではないのかもしれない。全体的な振り返りというよりは、もっと目標に対する振り返りにしたほうがいいのかも
    • ただ、現状でも月イチだと、その時の反省点とかを忘れる、かつ、月初めにすべてまとめるのは大変なので、都度、下書きに書いていく
  • プログラミングを毎月実施する的な振り返りができていないので、いつまでたってもプログラミングできない
    • やらないと忘れるので、継続する仕組みが必要

■ Try

  • AWS 認定 Developer – アソシエイトの試験を予約する。試験勉強する範囲を決めて、実施する
  • 自分ReleaseNoteはなるべくこまめに下書きしておく
  • プログラミングを継続できる具体的な仕組みを検討し、導入する

「じぶん Release Notes」を真似してみる

真似しようと思った背景

最近、振り返りの重要性を非常に感じる。

なぜなら、年齢も32歳になり、人生の残り時間も短くなってきた。記憶能力も、頭の回転も、昔に比較して低下した気がする。

一方で、なりたいエンジニア像に一向に近づいていない現状に焦りだけが日々日々募る。 (昔はフロントエンドエンジニアもできるインフラエンジニア、やりたいことを自分で作れるエンジニアを目指していたのに、いつの間にかそんな目標も忘れていた)

今後は、情報を取捨選択し、1歩1歩前進、成長できるように、今まで以上に効率的に学習し、成長する必要がある。

そのために、しっかりと振り返りを実施し、「何をやったのか」、「何が良くて、何が悪かったのか」、「今後、何をすればいいのか」を明確にするために、きちんと振り返りしようと思った。

(正直、新卒からIT業界に7年間以上いるのにも関わらず、ふと、自分は何をしてきたんだろうと思うと何も具体的に思い出せず、恥ずかしいし、何より悲しい。折角の経験が無駄になってしまっていると感じる今日このごろ)

人間の記憶は曖昧で、人間は忘れる生き物なので、記憶に頼らず、しっかりと自分自身のログを残していこうと思った。

そんなときに見つけたのが、id:a-know さんの「じぶん Release Notes」。すごくいい。全力で真似する。

blog.a-know.me

参照元の記事を読んでみると、 id:a-knowさんも他の方の記事を参考に始めたらしいが、2016年からずっと継続しているらしい。すごい

じぶん Release Note のルールをどうするか

正直、自分はめんどくさがりで飽き性、意思に弱い人間だと自負している。

いつも、何かをやると決意したあと、どうやるか、自分なりの緩いルールを簡単に決めて、継続するための仕組みを何かしら導入して、なお、ギリギリ達成するくらいの意思の弱さ。 (ルールを決めないとやらない。また、ルールが厳しすぎるとやらないので、緩いルール。かつ、継続するためのリマインダーなどの仕組み(最近は Habitify というアプリで自身を煽っている)などがないと達成できない)

なので、自分でも達成できるように最低限のルールを設けつつ、毎月1回更新するを絶対的に達成する最も重要な、かつ、最低限の目標として、簡単なルールを考える。

内容は、こだわりすぎてもあれなので、最低限、「今月何をやったのか」がログとして残せればいいと思っている。

むしろ、まずはそれが一番重要かもしれない。KPTまでやらなくても、まずは、やったことをしっかり残せればいいのかな。

yamash.hateblo.jp

hihihiroro.hatenablog.com

じぶん Release Note の更新ルール

自分みたいな凡人でも達成できるような緩いリリースノートは以下になる。やってみて、試行錯誤しつつ、内容も考えていければよい。

更新ルール

毎月の月初めに必ず更新する(まずは、1日とか決めない)

タイトル

タイトルは、一旦、元記事を真似る(2019年とか西暦を入れたくなったが、記事の更新月もあるし、いらないか)

自分 Release Notes - (ver 0.xx.mm) ※「xx」は自分自身の年齢、mmは更新月を入力する

内容

他の方の内容を参考に、自分なりに必要な項目に絞る。とりあえずは以下の内容で考えてみる

じぶん Release Notes - (ver 0.xx.mm)がリリースされました。更新内容は下記のとおりです。

## 仕事

## プライベート

### 勉強会・イベント(目標:毎月1回以上)

### 読書・ブログ(目標:毎月1冊、1記事以上)

### 遊び(目標:毎月新しいことを1つやる)

## KPT

### Keep

### Problem

### Try

元記事みたいに成果をグラフとかで見れたらいいな。ただ、まだ何を指標にするとかが決めていないとりあえずはなしでいく。 (ブログのアクセス数でもいいし、id:a-knowさんの作成したGrass-Graphってやつでもいいかもしれないなー)

以上、まずは来月から頑張ってみる!1回目から忘れそうで自分が怖い。

CentOS7にNagios4をインストールする

f:id:berukann:20190626222204p:plain

Nagiosという有名な監視ソフトウェアがあります。最近では、Mackerel、Datadog、NewRelicなどSaaSの監視ソリューションを利用する機会が多いとは思いますが、業務上、利用方法を覚える必要があったため、今更ながら勉強しました。

Nagios とは

  • Nagios(ナギオス)は、代表的な統合監視ソフトウェアの1つです。よくZabbixと比較されることが多い
  • 1999年頃に NetSaint の名称で開発が開始。2002年に現在のNagiosという名称に変更され、現在でも開発は続いている(2019年06月現在v4.4.3)
  • Nagiosは、「OSS版のNagios」と「商用版のNagios」(Nagios XI) が存在するが、後述では「OSS版のNagios」について記載する

Nagiosの特徴

Nagios本体はあくまでもスケジューリングしか実施せず、監視自体はしない

設定、データなどはすべてテキストファイルベースで保持する

  • Nagiosは、設定、データなどをDBではなく、 すべてテキストファイルで保持するため、インストールは非常に容易。WEBサーバーが必要なくらい

非常にシンプルなGUIのみであり、設定変更等はすべて基本的にファイルを編集する必要がある

  • NagiosGUIは非常にシンプルな簡易UIしかないので、監視項目、現在の状態確認や通知の有効・無効くらいしかできない
  • デフォルトでメトリクスのグラフ等はないため、OSSの可視化ツール(例:nagiosgraph)を利用したり、Grafana等で可視化する仕組みを整える必要がある
  • この点において、GUIでほとんどの事が可能なZABBIXとは圧倒的に違いがある
  • 大規模な環境を監視する場合は、Nagiosの設定ファイルを統合的に管理する仕組み、ルール作りが必須

主要なコンポーネント

Nagiosは、大きく以下の3つのコンポーネントから構成されて

  • Nagios Core
    • Nagiosの本体部分。Nagios Pluginのスケジューリング、通知を実施する
  • Nagios Plugin
    • Nagiosの監視部分。実際に監視、値の取得を実施し、Nagios Core に結果を返す
    • 2019年現在、公式のプラグインだけで50以上、コミュニティを合わせると3000を超えるプラグインが存在している
  • Nagios Addon
    • Nagiosの機能を拡張してくれるものであり、こちらもコミュニティに100を超えるアドオンが存在している
    • 例:NRPE、NSCA、NSClient++、NDOUtils etc ...

上記の通り、Nagios Coreは、あくまでもNagios Pluginをキックするだけなので、何か監視を実施したい場合は、何かしらのプラグインを監視先サーバーにインストールする必要がある。

例えば、Webページにアクセスできるかなどの外形監視ではなく、監視対象サーバー上のCPUリソースなどを取得したい場合、Nagiosプラグインを監視先サーバーにインストール後、NRPEというNagios Addonを起動させ、監視サーバー(監視対象元)からキックするイメージ。

f:id:berukann:20190627230305p:plain

Nagios インストール方法

Nagiosをインストールする方法は(1)ソースからビルドする か(2)パッケージ管理システム経由でインストールする の2種類がある。今回、インストールするのが初めてなので、両方のパターンでインストールを実施してみる

インストール環境

今回、Vagrant経由でCentOS7のVMを起動し、VM上にNagiosCoreをインストールする。また、NagiosCoreだけでは監視ができないため、公式のNagiosPluginも合わせてインストールし、設定ファイルの場所を確認する

macOS Mojava 10.14.5(ホスト)
Vagrant 2.2.4(ホスト)
CentOS 7.6(ゲスト)

(1)ソースからビルドする

1.1. Installing The Nagios

$ mkdir centos7-source; cd centos7-source
$ vagrant init centos/7
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
  • Nagiosを起動した際に8080ポートでアクセスできるよう、ポートフォワードの設定を有効後、VMを起動する
$ cp Vagrantfile Vagrantfile.org
$ vim Vagrantfile
$diff Vagrantfile Vagrantfile.org
26c26
<   config.vm.network "forwarded_port", guest: 80, host: 8080
---
>   # config.vm.network "forwarded_port", guest: 80, host: 8080

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'centos/7'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'centos/7' version '1902.01' is up to date...
==> default: Setting the name of the VM: centos7-source_default_1561561101101_88523
・・・
Redirecting to /bin/systemctl start vboxadd.service
Redirecting to /bin/systemctl start vboxadd-service.service
Unmounting Virtualbox Guest Additions ISO from: /mnt
==> default: Checking for guest additions in VM...
==> default: Rsyncing folder: /Users/xxxxx/work/centos7-source/ => /vagrant
$ vagrant ssh
[vagrant@localhost ~]$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[vagrant@localhost ~]$ sudo su -
Last login: 水  626 15:08:12 UTC 2019 on pts/0
[root@localhost ~]# localectl set-locale LANG=ja_JP.utf8
[root@localhost ~]# timedatectl set-timezone Asia/Tokyo
[root@localhost ~]# sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install -y gcc glibc glibc-common wget unzip httpd php gd gd-devel perl postfix
[root@localhost ~]# cd /tmp
[root@localhost tmp]# wget -O nagioscore.tar.gz https://github.com/NagiosEnterprises/nagioscore/archive/nagios-4.4.3.tar.gz
[root@localhost tmp]# tar xzf nagioscore.tar.gz
[root@localhost tmp]# cd /tmp/nagioscore-nagios-4.4.3/
[root@localhost nagioscore-nagios-4.4.3]# ./configure
[root@localhost nagioscore-nagios-4.4.3]# make all
[root@localhost nagioscore-nagios-4.4.3]# make install-groups-users
[root@localhost nagioscore-nagios-4.4.3]# usermod -a -G nagios apache
[root@localhost nagioscore-nagios-4.4.3]# make install
[root@localhost nagioscore-nagios-4.4.3]# make install-daemoninit
[root@localhost nagioscore-nagios-4.4.3]# systemctl enable httpd.service
[root@localhost nagioscore-nagios-4.4.3]# make install-commandmode
[root@localhost nagioscore-nagios-4.4.3]# make install-config
[root@localhost nagioscore-nagios-4.4.3]# make install-webconf
[root@localhost nagioscore-nagios-4.4.3]# firewall-cmd --zone=public --add-port=80/tcp
[root@localhost nagioscore-nagios-4.4.3]# firewall-cmd --zone=public --add-port=80/tcp --permanent
[root@localhost nagioscore-nagios-4.4.3]# htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin # NagiosのWebUIへのログインパスワードを入力
New password:
Re-type new password:
Adding password for user nagiosadmin
[root@localhost nagioscore-nagios-4.4.3]# systemctl start httpd.service
[root@localhost nagioscore-nagios-4.4.3]# systemctl start nagios.service

1.2. Installing The Nagios Plugins

  • Nagios Pluginをソースからビルドし、インストールする
[root@localhost ~]# yum install -y gcc glibc glibc-common make gettext automake autoconf wget openssl-devel net-snmp net-snmp-utils epel-release
[root@localhost ~]# yum install -y perl-Net-SNMP
[root@localhost ~]# cd /tmp
[root@localhost ~]# wget --no-check-certificate -O nagios-plugins.tar.gz https://github.com/nagios-plugins/nagios-plugins/archive/release-2.2.1.tar.gz
[root@localhost ~]# tar zxf nagios-plugins.tar.gz
[root@localhost ~]# cd /tmp/nagios-plugins-release-2.2.1/
[root@localhost ~]# ./tools/setup
[root@localhost ~]# ./configure
[root@localhost ~]# make
[root@localhost ~]# make install
[root@localhost ~]# systemctl start httpd.service
[root@localhost ~]# systemctl start nagios.service

(2)パッケージ管理システム経由でインストールする

2.1. Installing The Nagios

$ mkdir centos7-yum; cd centos7-yum
$ vagrant init centos/7
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
  • Nagiosを起動した際に8081ポートでアクセスできるよう、ポートフォワードの設定を有効後、VMを起動する
$ cp Vagrantfile Vagrantfile.org
$ vim Vagrantfile

$diff Vagrantfile Vagrantfile.org
26c26
<   config.vm.network "forwarded_port", guest: 80, host: 8081
---
>   # config.vm.network "forwarded_port", guest: 80, host: 8080

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'centos/7'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'centos/7' version '1902.01' is up to date...
==> default: Setting the name of the VM: centos7-source_default_1561561101101_88523
・・・
Redirecting to /bin/systemctl start vboxadd.service
Redirecting to /bin/systemctl start vboxadd-service.service
Unmounting Virtualbox Guest Additions ISO from: /mnt
==> default: Checking for guest additions in VM...
==> default: Rsyncing folder: /Users/xxxxx/work/centos7-source/ => /vagrant
$ vagrant ssh
[vagrant@localhost ~]$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
  • NagiosCoreをYUM経由でインストールする
[vagrant@localhost ~]$ sudo su -
Last login: 水  626 15:08:12 UTC 2019 on pts/0
[root@localhost ~]# localectl set-locale LANG=ja_JP.utf8
[root@localhost ~]# timedatectl set-timezone Asia/Tokyo
[root@localhost ~]# sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install -y epel-release
[root@localhost ~]# yum install -y nagios

[root@localhost ~]# htpasswd -c /etc/nagios/passwd nagiosadmin # NagiosのWebUIへのログインパスワードを入力
New password:
Re-type new password:
Adding password for user nagiosadmin
[root@localhost ~]# systemctl start httpd.service
[root@localhost ~]# systemctl start nagios.service

2.2. Installing The Nagios Plugins

  • Nagios PluginをYUM経由でインストールする
[root@localhost ~]# yum install -y nagios-plugins-all
[root@localhost ~]# systemctl start httpd.service
[root@localhost ~]# systemctl start httpd.service

インストール方法ごとのインストールディレクトリ比較

項目 ソース経由 YUM経由
NagiosCore Install Directory /etc/nagios/ /usr/local/nagios/etc/
NagiosPlugin Install Directory /usr/local/nagios/libexec/ /usr/lib64/nagios/plugins/

まとめ

  • Nagiosは、予想以上にシンプルだが、柔軟性が高く、非常に強力な監視ツール
  • Nagiosは、商用版とOSS版がある。また、Nagiosという名前は総称であり、コンポーネントが3つある。中でも、実際に監視を実施しているのはプラグイン
  • 当たり前だが、ソースでビルドした場合とパッケージ管理システムでインストールした場合ではインストールディレクトリが違うので注意
  • これも当たり前だが、パッケージ管理システムでインストールすると本当にあっという間だと感じた
  • 今後は、NRPEを用いた監視やNagiosデータのグラフ化、Slack通知など実用的な部分を検証していく

補足1:参考ページ

www.atmarkit.co.jp

techblog.gmo-ap.jp

tech.pepabo.com

補足2:監視ツールの Google Trend

Zabbixは結構頑張ってるけど、Nagiosは減ってきている。枯れてるっていうのもあるけど。期間を5年でやってるから、Zabbix、Nagiosが圧倒的に見えるけど、最近だとSaaSが強すぎる・・・。

Hugoで生成した記事をGitHub Pagesで公開する(1)

概要

  • 現在、会社では、GHEを利用しており、「GitHub Pages」が利用できる
  • あまり「GitHub Pages」を利用したことがなかったので、今回、情報を整理してみる
  • 今回の記事では、「GitHub Pages」に整理し、次回の記事で Hugo を利用した記事を公開してみる

GitHub Pages

GitHub Pages」とは

f:id:berukann:20180812150655p:plain

  • GitHub Pages」は、GitHubのレポジトリから直接、静的サイト*1ホスティングできるサービスです
  • GitHub社から提供されており、基本的に無料で利用することができ、OSSのドキュメント等で利用されていることが多いです
  • GitHub Pages」は、静的ページホスティングサービスであるため、PHPRubyPythonなどのサーバーサイドのコードは動作しません

GitHub Pages」の種類

  • GitHub Pages」は、大きく分けて以下の二種類があります
    • ユーザ・グループページ:ユーザ、グループに紐づくページ。ユーザ、グループごとに1つだけ作成できる
    • プロジェクトページ:プロジェクトに紐づくページ。レポジトリごとに1つずつ作成できる
  • ページ毎の「GitHub Pages」は以下の通りになります*2 f:id:berukann:20180812174738p:plain
  • 例えば、ユーザ「berukann」でパブリックのGithubを利用した場合、GHEで独自ドメイン(ghe.beru.io)を利用した場合のURLは以下になります
Domain Type Page Type Repository Name URL
Normal User Page berukann/berukann.github.io https://berukann.github.io/
Normal Project Page berukann/gh-pages-001 https://berukann.github.io/gh-pages-001/
Custom User Page berukann/berukann.ghe.beru.io https://ghe.beru.io/pages/berukann/
Custom Project Page berukann/gh-pages-001 https://ghe.beru.io/pages/berukann/gh-pages-001/

GitHub Pages」で公開されるフォルダについて

  • GitHub Page」で公開されるフォルダは、以下から選択ができます
    • A. [gh-pages] ブランチのルートフォルダ
    • B. [master] ブランチのルートフォルダ
    • C. [master] ブランチのdocsフォルダ配下
  • 以前は [gh-pages] ブランチでしか公開されない仕様だったようですが、現状は「master」ブランチでも公開できます(ただ、現在でも [gh-pages] ブランチでも公開は可能)。詳細は 2016年新機能! GitHubのmasterブランチをWebページとして公開する手順@Qiita を参照にしてください))
  • 公式ページに記載の通り、「GitHub Pages」は、プライベートリポジトリ(GHE除く)であっても、インターネット上に公開されるため注意してください

GitHub Pages」を作成してみる

  • 試しに、以下の流れでテストプロジェクトを作成し、「GitHub Pages」を表示してみる ※ 公開するフォルダは上記の [B] パターン

  • (1)テストリポジトリ(gh-pages-001)を作成する

  • (2)「GitHub Pages」を有効にする
  • (3)テストページを「GitHub Pages」に表示させる

(1)テストリポジトリ(gh-pages-001)を作成する

  • GitHub にアクセスし、右上の「+」より、[New repository] を選択、テストリポジトリを作成する ※ ここでは「gh-pages-001」で作成 f:id:berukann:20180812151513p:plain
  • 今回は、[master] ブランチを公開するため、TerminalにてリポジトリをCloneし、 [master] ブランチを作成しておく
➜  ~ git clone git@github.com:berukann/gh-pages-001.git
Cloning into 'gh-pages-001'...
warning: You appear to have cloned an empty repository.
➜  ~ cd gh-pages-001/
➜  gh-pages-001 git:(master) echo "# gh-pages-001" >> README.md
➜  gh-pages-001 git:(master) git init
➜  gh-pages-001 git:(master) git add README.md
➜  gh-pages-001 git:(master) git commit -m "first commit"
➜  gh-pages-001 git:(master) git remote add origin git@github.com:berukann/gh-pages-001.git
➜  gh-pages-001 git:(master) git push -u origin master

(2)「GitHub Pages」を有効にする

  • 作成したリポジトリの [Settings] を選択し、「GitHub Pages」が「None」になっていることを確認 f:id:berukann:20180915115754p:plain
  • [Select source] にて [master branch] を選択し、[Save]を実施する。これで「GitHub Pages」が有効になる f:id:berukann:20180812152554p:plain
  • 再度、[Settings]->[GitHub Pages] を確認すると、URLが表示されてことを確認 f:id:berukann:20180812152735p:plain
  • ブラウザから上記URLにアクセスし、「404. There isn't a GitHub Pages site here.」が表示されることを確認 f:id:berukann:20180812153410p:plain
  • 補足:「GitHub Pages」を有効にしていない状態で上記URLにアクセスした場合、「404. File not found.」が表示されます f:id:berukann:20180812153545p:plain

(3)テストページを「Github Pages」に表示させる

  • Terminalにて、上記で作成したリポジトリをクローンし、テストページをプッシュする
➜  ~ cd gh-pages-001/
➜  gh-pages-001 git:(master) git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
➜  gh-pages-001 git:(master) vim index.html
➜  gh-pages-001 git:(master) cat index.html
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>GitHub Pages Test</title>
    </head>
    <body>
        <main>
            <h1>GitHub Pages Test</h1>
        </main>
    </body>
</html>
➜  gh-pages-001 git:(master) git add .
➜  gh-pages-001 git:(master) git commit -m "second commit."
➜  gh-pages-001 git:(master) git push origin master
  • GitHubのページにアクセスし、正常にテストページが表示されていることを確認 f:id:berukann:20180812154710p:plain

補足:[gh-pages] ブランチで作成した場合の挙動について

  • よくブログに書かれている [gh-pages] ブランチでプッシュした場合の挙動についても念の為、確認した
  • レポジトリ設定から「GitHub Pages」を有効にしないまま、「gh-pages」ブランチにプッシュしてみたが、「GitHub Pages」は正常に表示された
  • GitHub Pages」の [Settings] -> [GitHub Pages] を確認すると、[Select source] に [gh-pages branch] が追加されていた f:id:berukann:20180812155830p:plain
  • 公式ドキュメントで確認すると、「gh-pages」ブランチについて記載もあり、未対応になったわけではなさそうだが、わざわざ利用する必要もなさそう

まとめ

  • GitHub Pages」は、[master]、[gh-pages] ブランチ、もしくは、[master] ブランチの docs フォルダを公開フォルダとして指定できる
  • 次回は、静的ジェネレータである「Hugo」を利用した記事を [GitHub Pages] で公開する方法について整理する

*1:静的サイトとはHTMLベースのサイトであり、事前に生成したページを表示するだけなので、サーバー負荷が低く、高速に動作する

*2:GHEなどで、独自ドメインを設定している場合、URLが変わるため注意してください。詳細は 公式ページ を参照してください

「botpress」でSlackBotを作成してみる

はじめに

  • どうも。業務では Javascript を利用しないので、SlackBotを作るときはもっぱら、無理矢理にでも Python で書くのは私です
  • 今日、たまたま会社の先輩が「Botpress」に反応していて、調べてみるとダッシュボードがかっこよかったので、どんな感じのツールか試してみました
  • 基本的にはほぼほぼチュートリアルのままなので、気になる方はドキュメントを読んでいただけると幸いです

botpressとは

f:id:berukann:20180219232139p:plain

インストール

  • 実行環境は「macOS High Sierra」になり、インストールしたツールは以下になります
    • nodebrew (version: 0.9.8
    • node.js (version: 9.5.0
    • ngrock (version: 2.2.8
    • botpress (verssion: 1.1.13

インストール(nodebrew+node.js)

  • 「botpress」をインストールするために node.js が必要なのでインストールする
  • 今後のことも考えて、node.js は nodebrew でインストールする
  • node.js のバージョンは 4.6 以上であればいいらしく、最新版をインストールしておく
$ curl -L git.io/nodebrew | perl - setup
$ echo PATH=$HOME/.nodebrew/current/bin:$PATH >> .zshrc
[daicho]% nodebrew list
not installed
current: none
[daicho]% nodebrew install-binary latest
Fetching: https://nodejs.org/dist/v9.5.0/node-v9.5.0-darwin-x64.tar.gz
######################################################################## 100.0%
Installed successfully
[daicho]% nodebrew use latest
use v9.5.0
[daicho]% nodebrew list
v9.5.0
current: v9.5.0
[daicho]% node -v
v9.5.0

インストール(botpress)

[daicho]% npm install -g botpress
npm WARN deprecated nodemailer@2.7.2: All versions below 4.0.1 of Nodemailer are deprecated. See https://nodemailer.com/status/
npm WARN deprecated email-templates@2.7.1: 📫  Please upgrade to v3.1.5 (v3.0.x had a core bug with attachments and v3.1.5 now supports Node v6.4.0+). Also read the breaking changes for upgrading from v2 to v3 at https://github.com/niftylettuce/email-templates#v3-breaking-changes 📫
/Users/daicho/.nodebrew/node/v9.5.0/bin/bp -> /Users/daicho/.nodebrew/node/v9.5.0/lib/node_modules/botpress/bin/botpress
/Users/daicho/.nodebrew/node/v9.5.0/bin/botpress -> /Users/daicho/.nodebrew/node/v9.5.0/lib/node_modules/botpress/bin/botpress
> fsevents@1.1.3 install /Users/daicho/.nodebrew/node/v9.5.0/lib/node_modules/botpress/node_modules/fsevents
> node install
[fsevents] Success: "/Users/daicho/.nodebrew/node/v9.5.0/lib/node_modules/botpress/node_modules/fsevents/lib/binding/Release/node-v59-darwin-x64/fse.node" is installed via remote
> sqlite3@3.1.13 install /Users/daicho/.nodebrew/node/v9.5.0/lib/node_modules/botpress/node_modules/sqlite3
> node-pre-gyp install --fallback-to-build       
[sqlite3] Success: "/Users/daicho/.nodebrew/node/v9.5.0/lib/node_modules/botpress/node_modules/sqlite3/lib/binding/node-v59-darwin-x64/node_sqlite3.node" is installed via remote       
> nodemon@1.15.0 postinstall /Users/daicho/.nodebrew/node/v9.5.0/lib/node_modules/botpress/node_modules/nodemon
> node -e "console.log('\u001b[32mLove nodemon? You can now support the project via the open collective:\u001b[22m\u001b[39m\n > \u001b[96m\u001b[1mhttps://opencollective.com/nodemon/donate\u001b[0m\n')" || exit 0     
Love nodemon? You can now support the project via the open collective:
> https://opencollective.com/nodemon/donate      
npm WARN react-jsonschema-form@0.49.0 requires a peer of react@^15.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN react-codemirror@1.0.0 requires a peer of react@>=15.5 <16 but none is installed. You must install peer dependencies yourself.
npm WARN react-codemirror@1.0.0 requires a peer of react-dom@>=15.5 <16 but none is installed. You must install peer dependencies yourself.       
+ botpress@1.1.13
added 957 packages in 35.529s
[daicho]% botpress --version
1.1.13
[daicho]% botpress init test-bot
[botpress]
Hey there, thanks for using botpress!
We'll walk you through the creation of your new bot.
For more information or help, please visit http://github.com/botpress/botpress
---------------
name: (test-bot)
description: Say hello World
author: daicho
version: (0.0.1)
[botpress]       please wait, we are installing everything for you...
npm WARN deprecated email-templates@2.7.1: 📫  Please upgrade to v3.1.5 (v3.0.x had a core bug with attachments and v3.1.5 now supports Node v6.4.0+). Also read the breaking changes for upgrading from v2 to v3 at https://github.com/niftylettuce/email-templates#v3-breaking-changes 📫
npm WARN deprecated nodemailer@2.7.2: All versions below 4.0.1 of Nodemailer are deprecated. See https://nodemailer.com/status/

> fsevents@1.1.3 install /Users/daicho/test-bot/node_modules/fsevents
> node install

[fsevents] Success: "/Users/daicho/test-bot/node_modules/fsevents/lib/binding/Release/node-v59-darwin-x64/fse.node" is installed via remote

> sqlite3@3.1.13 install /Users/daicho/test-bot/node_modules/sqlite3
> node-pre-gyp install --fallback-to-build

[sqlite3] Success: "/Users/daicho/test-bot/node_modules/sqlite3/lib/binding/node-v59-darwin-x64/node_sqlite3.node" is installed via remote

> nodemon@1.15.0 postinstall /Users/daicho/test-bot/node_modules/nodemon
> node -e "console.log('\u001b[32mLove nodemon? You can now support the project via the open collective:\u001b[22m\u001b[39m\n > \u001b[96m\u001b[1mhttps://opencollective.com/nodemon/donate\u001b[0m\n')" || exit 0

Love nodemon? You can now support the project via the open collective:
 > https://opencollective.com/nodemon/donate

npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN react-codemirror@1.0.0 requires a peer of react@>=15.5 <16 but none is installed. You must install peer dependencies yourself.
npm WARN react-codemirror@1.0.0 requires a peer of react-dom@>=15.5 <16 but none is installed. You must install peer dependencies yourself.
npm WARN react-jsonschema-form@0.49.0 requires a peer of react@^15.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN test-bot@0.0.1 No repository field.
npm WARN test-bot@0.0.1 license should be a valid SPDX license expression

added 958 packages in 22.682s
[botpress]       OK installation has completed successfully
[botpress]       now run `bp start` in your terminal
[daicho]% cd test-bot
[daicho]% ls
LICENSE            content.yml        index.js           node_modules/      package.json
botfile.js         data/              modules_config/    package-lock.json
[daicho]% botpress start
20:34:32 - info: Starting botpress version 1.1.13
20:34:33 - verbose: [UMM] Enabled for slack
20:34:33 - info: Loaded botpress-slack, version 1.0.23
20:34:33 - verbose: [UMM] Enabled for web
20:34:33 - info: Loaded botpress-web, version 1.2.3
20:34:33 - info: Loaded 2 modules
20:34:33 - debug: Loading middleware: UMM.instrumentation
20:34:33 - debug: Loading middleware: hear
20:34:33 - debug: Loading middleware: conversations
20:34:33 - debug: Loading middleware: slack.sendMessages
20:34:33 - debug: Loading middleware: web.sendMessages
20:34:33 - debug: Loading middleware: fallback
20:34:33 - info: Bot launched. Visit: http://localhost:3000

「botpress」でSlackBotを作成する

  • botpressがインストールできたので、早速、SlackBotを作成してみる
  • 「botpress」でのSlackBotの作成方法は、「botpress」のSlackモジュールのドキュメントに記載の通りになります
  • 主に必要な作業は以下になりますが、今回はテストなので、ドキュメント通りにngrockを利用しています
    • (1)botpressにSlackモジュールをインストールする
    • (2)ngrockを利用して、ローカルホストを外部からアクセスできるようにする
    • (3)SlackBot用にSlack側でアプリを作成し、設定する
    • (4)作成した内容を元にbotpress側に登録する
    • (5)SlackBotの動作確認をする

(1)botpressにSlackモジュールをインストールする

  • ブラウザで「http://localhost:3000」にアクセスし、サイドバーの「Modules」を選択し、検索バーに「Slack」と入力して、Slackのコネクターをインストールする
  • CLIから実施したい場合は、以下のコマンドでも可能
botpress install slack

(2)ngrockを利用して、ローカルホストを外部からアクセスできるようにする

  • ngrock」は、ローカルで動作するアプリケーションをトンネリングして、外部からアクセスできるようにするサービス
  • 今回は、ローカルに立てたbotpress(http://localhost:3000)に外部からアクセスできるようにするために利用する
  • Basic認証が利用したかったので、アカウント登録を実施しました ※Basic認証とか利用しない場合はアカウント登録不要なので、そのままngrok http 3000を実行して下さい
  • ブラウザよりngrockにアクセスしアカウントを作成。ダッシュボードからAuthTokenを追加するコマンドを確認し、ターミナルにて実行する
[daicho]% brew cask install ngrok
==> Satisfying dependencies
==> Downloading https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-darwin-amd64.zip
######################################################################## 100.0%
==> No checksum defined for Cask ngrok, skipping verification
==> Installing Cask ngrok
==> Extracting nested container ngrok
==> Linking Binary 'ngrok' to '/usr/local/bin/ngrok'.
🍺  ngrok was successfully installed!
[daicho]% ngrok authtoken XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Authtoken saved to configuration file: /Users/daicho/.ngrok2/ngrok.yml
[daicho]% ngrok http --auth='admin:passw0rd' 3000 
  • 以下の画面が出力され、ForwardingされているURL(例: http://82aaf557.ngrok.io)にアクセスすると、http://localhost:3000と同様の画面が出力されることを確認する ※ Basic認証上記で入力したID/PASS f:id:berukann:20180220004553p:plain
  • 上記のコマンドは、実行毎に新しいURLになるため、一度、実行したらそのままにしておく

(3)SlackBot用にSlack側でアプリを作成し、設定する

  • Slackにログインした状態で「Create Slack App」にアクセスし、新規アプリを登録する
  • [App Name]にアプリ名、[Development Slack Workspace]にBotを作成したいSlackを選択する f:id:berukann:20180220005257p:plain
  • 左メニューより「Basic Information」を選択し、Client ID と Client Secret を確認する
  • 左メニューより「OAuth & Permissions」を選択し、Redirect URLsを追加する
  • 左メニューより「Bot Users」を選択し、Botユーザを作成する f:id:berukann:20180220010537p:plain
  • 左メニューより「Interactive Components」を選択し、Request URLを記載し、「Enable Interactive Components」を選択する

(4)作成した内容を元にbotpress側に登録する

  • ブラウザより「botpress」にアクセスし、(3)で確認した内容を元に記載し、「Authenticate & Connect」を選択する f:id:berukann:20180220012818p:plain
  • 正常に進むと、以下のような画面がでるので、Botがポストしたいチャンネルを選択し、「Authorize」を選択する ※今回はテスト用のチャンネル「testbot-room」を事前に作成 f:id:berukann:20180220013439p:plain
  • botpressの画面に戻されて、API token や Bot token が追加されていたら成功 f:id:berukann:20180220013829p:plain

(5)SlackBotの動作確認をする

  • (4)で認証したチャンネルを確認すると作成したintegrationが追加されている f:id:berukann:20180220014124p:plain
  • 対象のチャネルにボットユーザを招待して、hiというと返事してくれる f:id:berukann:20180220014414p:plain

SlackBotをカスタマイズする

  • はい。ここまでは、デフォルトのBotを起動しただけなので、カスタマイズしてみる
  • 「botpress」は、botpress init [bot-name] を実行するとファイルが自動されるが、中でも以下のファイルが重要
    • index.js
      • Botのロジックを記述するファイル
    • content.yaml
      • Botが話したい会話内容をすべて記載するファイル
      • UMM (Universal Message Markdown)と呼ばれ、Botpress特有のファイル
    • botfile.js
      • Botの設定ファイル。ファイルパスとか設定ファイル名とかを記載
  • 詳細は公式ドキュメントのfoundamentalsを確認して下さい

修造Botを作ってみる

  • 試しに hubot-syuzo みたいな修造Botを書いてみる
  •  一度、「botpress」をCtrl-C,Ctrl-Cで停止する ※ ngrockは停止しない
  • index.jsに以下のコードを記載する
/*
  CONGRATULATIONS on creating your first Botpress bot!
*/
module.exports = function(bp) {
  bp.hear({
        platform: 'slack',
        type: 'message',
        text: /(無理|むり|ムリ)|(でき|出来)(ない|ません|ん)/i } , (event, next) => {¬
        event.reply('#syuzo-img-link')
  })
}
  • content.ymlに以下のコードを記載後に、botpress startを再実行する
syuzo-img-link:
  - text:
    - "http://i.imgur.com/lCvSmkc.jpg"
    - "http://i.imgur.com/wRuO0T6.png"
    - "http://i.imgur.com/9pJcmPA.jpg"
    - "http://i.imgur.com/JoFiX17.jpg"
    - "http://i.imgur.com/0GJdUlW.jpg"
    - "http://i.imgur.com/cxLWi2Q.jpg"
    - "http://i.imgur.com/ht6Ng0J.jpg"
    - "http://i.imgur.com/p85gjPX.jpg"
    - "http://i.imgur.com/NDikSI4.jpg"
    - "http://i.imgur.com/UrFocgg.jpg"
    - "http://i.imgur.com/vLvuVqv.jpg"
    - "http://i.imgur.com/BCOFvKK.jpg"
    - "http://i.imgur.com/nNMuElm.png"
    - "http://i.imgur.com/pJP3lBn.jpg"
    - "http://i.imgur.com/5HhGuXB.jpg"
    - "http://i.imgur.com/RyLBvgs.jpg"
    - "http://i.imgur.com/MWEsCFG.jpg"
    - "http://i.imgur.com/3jEkEvI.jpg"
    - "http://i.imgur.com/ftZsjy3.jpg"
    - "http://i.imgur.com/QKQft3B.jpg"
    - "http://i.imgur.com/VNPx3B4.jpg"
    - "http://i.imgur.com/AD8tHQV.jpg"
    - "http://i.imgur.com/OMeB9Sf.png"
    - "http://i.imgur.com/3jcYzDR.jpg"
    - "http://i.imgur.com/E7BGbel.jpg"
    - "http://i.imgur.com/B7Op7MS.jpg"
    - "http://i.imgur.com/TbZkSrI.jpg"
    - "http://i.imgur.com/pDmMheZ.jpg"
    - "http://i.imgur.com/Mj81q08.jpg"
    - "http://i.imgur.com/xhOnNwd.jpg"
    - "http://i.imgur.com/HGpEk8E.jpg"
  • Slackで無理と発言すると反応する。Javascript力がなさすぎて、サンプルコードより劣化したコードになってしまった f:id:berukann:20180220104118p:plain

補足:他のモジュール「analytics」も試す

  • ChatbotのWordpressを目指しているだけあって、Connecter以外にもモジュールはありそう ※ npmのパッケージで検索すると全部で52個くらい?
  • 試しにUIから「analytics」をインストールしてみると、なんかかっこいいUIキタ━━━━(゚∀゚)━━━━!! f:id:berukann:20180220105236p:plain
  • ちなみに何か設定がいるのか、botpressでエラーを吐きまくってた
10:51:22 - info: slack connector is authenticated
10:51:22 - info: slack connector is connected
10:51:25 - error: Unhandled Rejection in Promise:  Promise {
  _bitField: 18087936,
  _fulfillmentHandler0: TypeError: Cannot read property 'startsWith' of undefined
    at Object.saveInteractionOut [as saveOutgoing] (/Users/daicho/test-bot/node_modules/botpress-analytics/bin/webpack:/src/db.js:68:15)
    at outgoingMiddleware (/Users/daicho/test-bot/node_modules/botpress-analytics/bin/webpack:/src/index.js:40:8)
    at exec (/Users/daicho/test-bot/node_modules/mware/index.js:50:23)
    at Function.run (/Users/daicho/test-bot/node_modules/mware/index.js:63:7)
    at Object.dispatch (webpack-internal:///54:74:10)
    at Object.eval [as sendOutgoing] (webpack-internal:///54:197:31)
    at eval (webpack-internal:///72:365:28)
    at tryCatcher (/Users/daicho/test-bot/node_modules/bluebird/js/release/util.js:16:23)
    at Object.gotValue (/Users/daicho/test-bot/node_modules/bluebird/js/release/reduce.js:155:18)
    at Object.gotAccum (/Users/daicho/test-bot/node_modules/bluebird/js/release/reduce.js:144:25)
    at Object.tryCatcher (/Users/daicho/test-bot/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/Users/daicho/test-bot/node_modules/bluebird/js/release/promise.js:512:31)
    at Promise._settlePromise (/Users/daicho/test-bot/node_modules/bluebird/js/release/promise.js:569:18)
    at Promise._settlePromiseCtx (/Users/daicho/test-bot/node_modules/bluebird/js/release/promise.js:606:10)
    at Async._drainQueue (/Users/daicho/test-bot/node_modules/bluebird/js/release/async.js:138:12)
    at Async._drainQueues (/Users/daicho/test-bot/node_modules/bluebird/js/release/async.js:143:10)
    at Immediate.Async.drainQueues [as _onImmediate] (/Users/daicho/test-bot/node_modules/bluebird/js/release/async.js:17:14)
    at runCallback (timers.js:756:18)
    at tryOnImmediate (timers.js:717:5)
    at processImmediate [as _immediateCallback] (timers.js:697:5),
  _rejectionHandler0: undefined,
  _promise0: undefined,
  _receiver0: undefined } Reason: TypeError: Cannot read property 'startsWith' of undefined
    at Object.saveInteractionOut [as saveOutgoing] (/Users/daicho/test-bot/node_modules/botpress-analytics/bin/webpack:/src/db.js:68:15)
    at outgoingMiddleware (/Users/daicho/test-bot/node_modules/botpress-analytics/bin/webpack:/src/index.js:40:8)
    at exec (/Users/daicho/test-bot/node_modules/mware/index.js:50:23)
    at Function.run (/Users/daicho/test-bot/node_modules/mware/index.js:63:7)
    at Object.dispatch (webpack-internal:///54:74:10)
    at Object.eval [as sendOutgoing] (webpack-internal:///54:197:31)
    at eval (webpack-internal:///72:365:28)
    at tryCatcher (/Users/daicho/test-bot/node_modules/bluebird/js/release/util.js:16:23)
    at Object.gotValue (/Users/daicho/test-bot/node_modules/bluebird/js/release/reduce.js:155:18)
    at Object.gotAccum (/Users/daicho/test-bot/node_modules/bluebird/js/release/reduce.js:144:25)
    at Object.tryCatcher (/Users/daicho/test-bot/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/Users/daicho/test-bot/node_modules/bluebird/js/release/promise.js:512:31)
    at Promise._settlePromise (/Users/daicho/test-bot/node_modules/bluebird/js/release/promise.js:569:18)
    at Promise._settlePromiseCtx (/Users/daicho/test-bot/node_modules/bluebird/js/release/promise.js:606:10)
    at Async._drainQueue (/Users/daicho/test-bot/node_modules/bluebird/js/release/async.js:138:12)
    at Async._drainQueues (/Users/daicho/test-bot/node_modules/bluebird/js/release/async.js:143:10)
    at Immediate.Async.drainQueues [as _onImmediate] (/Users/daicho/test-bot/node_modules/bluebird/js/release/async.js:17:14)
    at runCallback (timers.js:756:18)
    at tryOnImmediate (timers.js:717:5)
    at processImmediate [as _immediateCallback] (timers.js:697:5)
10:51:25 - error: TypeError: Cannot read property 'startsWith' of undefined
    at Object.saveInteractionOut [as saveOutgoing] (/Users/daicho/test-bot/node_modules/botpress-analytics/bin/webpack:/src/db.js:68:15)
    at outgoingMiddleware (/Users/daicho/test-bot/node_modules/botpress-analytics/bin/webpack:/src/index.js:40:8)
    at exec (/Users/daicho/test-bot/node_modules/mware/index.js:50:23)
    at Function.run (/Users/daicho/test-bot/node_modules/mware/index.js:63:7)
    at Object.dispatch (webpack-internal:///54:74:10)
    at Object.eval [as sendOutgoing] (webpack-internal:///54:197:31)
    at eval (webpack-internal:///72:365:28)
    at tryCatcher (/Users/daicho/test-bot/node_modules/bluebird/js/release/util.js:16:23)
    at Object.gotValue (/Users/daicho/test-bot/node_modules/bluebird/js/release/reduce.js:155:18)
    at Object.gotAccum (/Users/daicho/test-bot/node_modules/bluebird/js/release/reduce.js:144:25)
    at Object.tryCatcher (/Users/daicho/test-bot/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/Users/daicho/test-bot/node_modules/bluebird/js/release/promise.js:512:31)
    at Promise._settlePromise (/Users/daicho/test-bot/node_modules/bluebird/js/release/promise.js:569:18)
    at Promise._settlePromiseCtx (/Users/daicho/test-bot/node_modules/bluebird/js/release/promise.js:606:10)
    at Async._drainQueue (/Users/daicho/test-bot/node_modules/bluebird/js/release/async.js:138:12)
    at Async._drainQueues (/Users/daicho/test-bot/node_modules/bluebird/js/release/async.js:143:10)
    at Immediate.Async.drainQueues [as _onImmediate] (/Users/daicho/test-bot/node_modules/bluebird/js/release/async.js:17:14)
    at runCallback (timers.js:756:18)
    at tryOnImmediate (timers.js:717:5)
    at processImmediate [as _immediateCallback] (timers.js:697:5)
  • 気になってbotpress-analyticsのページにいったら、Slackは非対応でした・・・
Support connectors: ** botpress-messenger

まとめ

  • 会社で話題に出た「botpress」を試してみた
  • SaaSとかじゃなくて、オンプレ、ローカルで動かせるのがいい
  • Javascript好きな人にとったらとても良さそう ※それを言い出すと、そもそもhubotとかも・・・
  • まだまだモジュールは少ないけど、今後増えたらもっと便利になりそう
  • ただ、Botは増えていくので統合管理したかったんだけど、そういうツールではなさそう

参考記事:

Zabbix3.4でWindowsOSの自動起動のトリガーを一部のサービスのみ除外する方法

概要

  • Zabbix3.4でWindowsOSのテンプレートを適用した際に自動起動サービスの監視アラートがうざい
    • 例:Service "sppsvc" (Software Protection) is not running (startup type automatic delayed)
    • 例:Service "RemoteRegistry" (Remote Registry) is not running (startup type automatic)
  • ただ、トリガー自体は無効にしたくないため、不要と判断したサービスのみ除外する

環境

  • Zabbix 3.4
  • 監視対象:Windows 2012 R2

問題

  • Windows OS のテンプレートを Windows 2012 R2 に適用した際に自動起動のサービスが起動していない旨の警告がうざい f:id:berukann:20171224032023p:plain

解決策

  • 除外したいサービスのみのディスカバリから除外する。具体的な方法は以下になります
  • [Administration]->[General]を選択し、右のプルダウンから[Regular expressions]を選択する f:id:berukann:20171224032550p:plain
  • [Windows service names for discovery]を選択し、[Expression]に除外したいサービスを追記する
  • 修正前: ^(MMCSS|gupdate|SysmonLog|clr_optimization_v2.0.50727_32|clr_optimization_v4.0.30319_32)$
  • 修正後: ^(MMCSS|gupdate|wuauserv|TrustedInstaller|sppsvc|RemoteRegistry|SysmonLog|clr_optimization_v2.0.50727_32|clr_optimization_v4.0.30319_32)$
  • 監視対象をZabbixから一度消し、再登録すると、除外したサービスがディスカバリされなくなる

参考

「npm install」がエラー「pyenv: python2: command not found」で失敗する

概要

  • npm install 時に python2 周りのエラーが発生してインストールが失敗する
  • pyenv利用環境下で「python2」コマンドが利用できないのが原因

環境

  • macOS Sierra version 10.12.2
  • npm version 4.0.5
  • node version 7.4.0
  • pyenv version 1.0.6

問題

  • npm install 時に以下のエラーがでてインストールが失敗 -「pyenv: python2: command not found」からpython2コマンドがない
➜  dasher git:(master) npm install

> socketwatcher@0.3.0 install /Users/daicho/work/dasher/node_modules/socketwatcher
> node-gyp rebuild

gyp ERR! configure error 
gyp ERR! stack Error: Command failed: /Users/daicho/.pyenv/shims/python2 -c import platform; print(platform.python_version());
gyp ERR! stack pyenv: python2: command not found
gyp ERR! stack 
gyp ERR! stack The `python2' command exists in these Python versions:
gyp ERR! stack   2.7.13
gyp ERR! stack 
gyp ERR! stack 
gyp ERR! stack     at ChildProcess.exithandler (child_process.js:211:12)
gyp ERR! stack     at emitTwo (events.js:106:13)
gyp ERR! stack     at ChildProcess.emit (events.js:191:7)
gyp ERR! stack     at maybeClose (internal/child_process.js:885:16)
gyp ERR! stack     at Socket.<anonymous> (internal/child_process.js:334:11)
gyp ERR! stack     at emitOne (events.js:96:13)
gyp ERR! stack     at Socket.emit (events.js:188:7)
gyp ERR! stack     at Pipe._handle.close [as _onclose] (net.js:501:12)
gyp ERR! System Darwin 16.3.0
gyp ERR! command "/Users/daicho/.nodebrew/node/v7.4.0/bin/node" "/Users/daicho/.nodebrew/node/v7.4.0/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /Users/daicho/work/dasher/node_modules/socketwatcher
gyp ERR! node -v v7.4.0
gyp ERR! node-gyp -v v3.4.0
gyp ERR! not ok 
npm ERR! Darwin 16.3.0
npm ERR! argv "/Users/daicho/.nodebrew/node/v7.4.0/bin/node" "/Users/daicho/.nodebrew/current/bin/npm" "install"
npm ERR! node v7.4.0
npm ERR! npm  v4.0.5
npm ERR! code ELIFECYCLE

npm ERR! socketwatcher@0.3.0 install: `node-gyp rebuild`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the socketwatcher@0.3.0 install script 'node-gyp rebuild'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the socketwatcher package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node-gyp rebuild
npm ERR! You can get information on how to open an issue for this project with:
npm ERR!     npm bugs socketwatcher
npm ERR! Or if that isn't available, you can get their info via:
npm ERR!     npm owner ls socketwatcher
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     /Users/daicho/work/dasher/npm-debug.log

原因

  •  pyenvでpython2コマンドを利用できるように設定できておらず、インストール時に利用するpython2コマンドが見つからなかったため
➜  ~ python2 -V
pyenv: python2: command not found

The `python2' command exists in these Python versions:
  2.7.13

解決策

  • python3しかglobalに設定していなかったため、python2もglobalに設定する
  • 以下の記事の通り、pyenvではpython2.x、3.xの両方を設定できる
  • 自分の環境で実施した結果は以下になる
➜  ~ python2 -V
pyenv: python2: command not found

The `python2' command exists in these Python versions:
  2.7.13
➜  ~ pyenv versions  
  system
  2.7.13
* 3.6.0 (set by /Users/daicho/.pyenv/version
➜  ~ pyenv global 3.6.0 2.7.13
➜  ~ pyenv rehash  
➜  ~ python -V
Python 3.6.0
➜  ~ python2 -V
Python 2.7.13
➜  ~ python3 -V
Python 3.6.0
➜  dasher git:(master) npm install

> socketwatcher@0.3.0 install /Users/daicho/work/dasher/node_modules/socketwatcher
> node-gyp rebuild

xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance

xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance

  CXX(target) Release/obj.target/socketwatcher/socket_watcher.o
../socket_watcher.cpp:104:37: warning: 'NewInstance' is deprecated [-Wdeprecated-declarations]
    info.GetReturnValue().Set(cons->NewInstance());
                                    ^
/Users/daicho/.node-gyp/7.4.0/include/node/v8.h:3292:52: note: 'NewInstance' has been explicitly marked deprecated here
  V8_DEPRECATED("Use maybe version", Local<Object> NewInstance() const);
                                                   ^
1 warning generated.
  SOLINK_MODULE(target) Release/socketwatcher.node

> pcap@2.0.0 install /Users/daicho/work/dasher/node_modules/pcap
> node-gyp rebuild

xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance

xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance

  CXX(target) Release/obj.target/pcap_binding/pcap_binding.o
  CXX(target) Release/obj.target/pcap_binding/pcap_session.o
../pcap_session.cc:46:37: warning: 'NewInstance' is deprecated [-Wdeprecated-declarations]
    info.GetReturnValue().Set(cons->NewInstance());
                                    ^
/Users/daicho/.node-gyp/7.4.0/include/node/v8.h:3292:52: note: 'NewInstance' has been explicitly marked deprecated here
  V8_DEPRECATED("Use maybe version", Local<Object> NewInstance() const);
                                                   ^
1 warning generated.
  SOLINK_MODULE(target) Release/pcap_binding.node
dasher@1.1.1 /Users/daicho/work/dasher
└─┬ node-dash-button@0.6.1 
  └─┬ pcap@2.0.0  (git+https://github.com/mranney/node_pcap.git#d920204745c8b00ef4b7a3fe27d902b263cdb70f)
    └── socketwatcher@0.3.0 

参考

shinespark.hatenablog.com