hubotをHerokuからIBM Bluemixに移した話
IBM Bluemixを使ってbotを動かす記事を見かけたので、自分もやってみることにしました。
今回移行させるのは、Slack上で稼働させている同期の神様のbotです。
GitHub - ku00/chi-chan: chi-chan is GOD.
Good Bye Heroku...
Herokuから稼働させているアプリを消します。確認は特にいらないのでconfirmオプションを付けて実行します。
heroku apps:destroy --app bot-name --confirm bot-name
さよならHeroku(´・_・`)
Hello Bluemix!
Bluemixのアカウント登録
こちらの記事を参考に、まずはBluemixのアカウント登録をやってみます。
IBM Bluemixフリートライアルアカウント作成手順 - Qiita
無料枠ならばクレジットカードの登録はいらないみたいです。ただし、30日のトライアル期間を過ぎての利用は、無料/有料に関わらずクレジットカードの登録が必要みたいです。
hubotの修正
Bluemixにデプロイするためには、 procfile
の代わりに manifest.yml
を用意する必要があります。インスタンスやメモリは無料枠に合わせて、次のように書きました。
manifest.yml
applications: - buildpack: https://github.com/jthomas/nodejs-v4-buildpack.git command: ./bin/hubot -a slack -n chi-bot path: . instances: 1 memory: 256M
コードの準備はこれだけです。
Bluemixへのデプロイ
hubotをBluemixへデプロイする方法は、基本的には以下のドキュメント通りにやれば大丈夫です。
hubot/bluemix.md at master · github/hubot
デプロイは cf
コマンドで行います。
cf
コマンドはbrewでインストールできます。
brew tap cloudfoundry/tap brew install cf-cli
それではデプロイしてみましょう。
cf api https://api.au-syd.bluemix.net cf set-env bot-name HUBOT_SLACK_TOKEN token-value cf login -u bluemix-id -o org-name -s space-name cf push bot-name
以上でデプロイ完了です。
cf api
で設定するAPIのエンドポイントは、データセンターの地域によって異なるので事前に確認しておきましょう(自分の場合はシドニーだったのでau-syd
)。cf login
のオプションで指定している組織(org-name)とスペース(space-name)は各自が自由に設定できます。
それでは実際に動いているかどうか見てみましょう。
大丈夫そうですね(´・_・`)
まとめ
Bluemixを使って神様を24時間稼働させることができました。
日本語対応してるのでわかりやすくて触りやすかったですね。
それでは。
参考
RubyKaigi2015に参加した話(1日目)
会社からスポンサーチケットをいただいたので行ってきた。こういったカンファレンスは YAPC 以来2回目だったからどんな発表が聴けるかわくわくしてたら...
朝からスプラッシュマウンテンばりの水を浴びることができて最高って感じだ
— わさびのり太郎 (@ku00_) December 11, 2015
最高(´・_・`)
以下、聴いたトーク。
- Saving people from typos
- Time files like an arrow: Fruit files like a banana. Parsers for Great Good
- High Performance Template Engine: Guide to optimize your Ruby code
- TRICK 2015: The second Transcendental Ruby Imbroglio Contest for RubyKaigi
ちなみにレポート内容が箇条書きになっているのは自分の知識不足の表れなので戒めのためにそのまま残しておいた。
Saving people from typos
- did_you_meanというgemを作った人
- kaminariのメンテナーもしてるよ
- 誤ったメソッドなどの入力に対して正しいと思われるものをサジェストする
- gitのcliやグーグルの検索にも同じようなものが使われている
- 検出されるエラーの種類によって使う辞書を変える
- タイピングミスとスペルミスは違う
Time files like an arrow: Fruit files like a banana. Parsers for Great Good
- パーサのお話
- 区切り方で文章は意味が変わってくる(likeでも「好き」と「のような」の2つの意味がある)
- 分解してみる
- 数学の足し算や引き算を例にあげると、数字のあとは必ず演算子がくる規則がある
- これがわかっていると少しずつ式を分解することができる
- カッコがかかっているものはさらに小さく分解ができる
- 分解したものを構文木にして書いてみるとわかりやすい
- スタックという形で分解した順に積み上げて表現することもできる
High Performance Template Engine: Guide to optimize your Ruby code
- テンプレートエンジンの話
- erb, haml, slim
- テンプレートエンジンによってテンプレートをrubyのコードにコンパイル、それをhtmlにレンダリングすることで使える
- ちょっとしたテクニックを使えばrubyの仕組みを全て把握していなくても速くすることができる
- ベンチマーク
- テンプレートエンジンのためのライブラリ、temple
- rubyをパースする、parser gem
- attributesの種類
- static(高速)
- dynamic(コンパイル時まで値がわからない。けどそれなりに速い)
- runtime(遅い)
- dynamicコンパイルはエラー時に行番号がずれることがある
- 速くするためにC拡張を使う(これはクックパッド本体でも使われている)
- あまり使われない機能を削ることで計算そのものをなくして速くする
- C拡張もちょこちょこやる
- 修正をPRで送ったらリジェクトされたので仕様らしい
TRICK 2015: The second Transcendental Ruby Imbroglio Contest for RubyKaigi
- "TRICK" というrubyのプログラミングコンテストがある
- 2015で2回目
- 同じようなことをしているコンテストは別言語でいくつかある
- 2013年には、ポエムに見えるコードや実行するとバッハの音楽が流れる音符の形のコードなどが作品として出てきた
- 目的としては、とにかく利益のない意味不明なプログラムを書く
- 審査員も出してOKだし出してる
- でも公平性を保つために誰が書いたのかは知らずに採点をしている
- 宣伝
- 去年は日本からのエントリーしかなかった
- 今年になって少し外国の割合が増えたけどまだまだ日本以外のエントリーが少ない
- 今年の作品
所感
英語のトーク試しに聴いてみたらなにを言っているのかほとんどわからなかった...。スライドで脳内補完することでなんとか大筋の内容は掴めたけれど。
TRICKのトークはコードを読んでもなにをやっているのかわからないけれどすごいものができているという印象だった。このメソッドはこのプログラムを作るために作られたとか言ってて言語開発者ですらそんなことを思うメソッドが存在するのかと。
知らない用語が出てくるととりあえず記憶の片隅に留めておいて聴くことにしていたけれど、トークを聴き終わったあとに結局なにが言いたかったんだっけってなることが結構あった。YAPCとはベクトルが違うかもしれないけれど、トークを聴いた時に面白いことやってるって感覚を持てたらいいと思ってるから、次回行ける機会があればもう少し知識を増やしてから臨みたい。
「師弟登壇2015」に参加してきた話
同期の2人(@orzup, @chinu_t )が登壇するとのことだったからその応援に行ってきた。
同期見守り隊
— わさびのり太郎 (@ku00_) December 6, 2015
登壇者の方々へ挨拶まわりしたときに登壇者でもないのにくっついてまわってた眼鏡が自分です。
気になる企業の新卒研修でどんなことをやっているのか知ることができた良いイベントだった。 農業体験をやっているところや、同じ新卒が違う職種の人にWebサービスを作れるよう指導する研修をやっていたりと面白い話がたくさん聴けた。 そして師匠(メンター)の方々がどういった意図で研修作って実行しているのかを聴くことで、 ただ単純に面白い研修をやっているなあという感想で終わりにならないから、そういった面でも学びが多かった印象。
眼鏡を新調したせいか目がとても疲れていたから寿司は食べずに帰ったよ🍣
S3上にyumリポジトリを構築した話(後編)
前回のあらすじ
前編では以下の3つ検証手順のうちの1,2をやった。
- 必要なファイルやディレクトリ構成など、 rpm の配布方法について調査する
- Vagrant 上で2台 linux サーバを立ち上げて、一方を rpm を置いたリポジトリサーバにして、もう一方から yum でインストールしてみる
- S3 上にリポジトリサーバを構築、上で立ち上げた Vagrant サーバから同じように yum でインストールしてみる
今回はブログタイトルでもある本題の3をやるぞ。
S3 上の yum リポジトリで yum install
S3上の yum リポジトリには ngx_mruby-package-builder で生成した rpm を置いておきたいから、リポジトリ作成に入る前に用意しておこう。本題ではないから docker-toolbox のインストール解説とかは特にやらない。
まず、 ngx_mruby の rpm パッケージを x86_64 以下に置いて createrepo コマンドでリポジトリの準備を行う。 そして、ホストマシン側に以下のものを落としておく。
mkdir pkg vagrant ssh rpm-repo-server createrepo /var/www/repos/cent7/x86_64/ exit scp -F ssh.config -r vagrant@rpm-repo-server:/var/www/repos/cent7/x86_64/ ./pkg
次に、上で用意したものを S3 へアップロードするための準備を行う。
S3 バケットの作成
バケット名は今回は rpm-repos にした。また、ディレクトリは rpm-repos/centos/7/x86_64
まで作っておく。
以下のリンクにインストール方法等が書かれているのでその通りにやる。
http://docs.aws.amazon.com/ja_jp/kinesis/latest/dev/kinesis-tutorial-cli-installation.html
アクセスキーの作成と登録
以下のリンクの通りにやる。先ほどインストールした AWS CLI を使って aws configure
でアクセスキーが登録できる。また、登録した情報は ~/.aws/credentials
から確認できる
S3 へのアクセスを許可
IAM コンソールのユーザから登録したユーザを選択して、アクセス許可からポリシーのアタッチで S3 のポリシーを追加する。 aws s3 ls
でバケットが表示されればOK
ホスティングの有効化
バケットのプロパティから有効にする。インデックスドキュメントおよびエラードキュメントは適当に存在しないファイルでもいいと思う。今回は index.html
と入力しておいた。
そして先ほどホストマシンに落としてきたファイルを S3 へアップロードする。
aws s3 cp --recursive --acl public-read pkg/ s3://rpm-repos/centos/7/x86_64/
これでリポジトリの準備は完了。下のような repo ファイルを用意して yum install してみよう。 今回は前回の記事で使った rpm-repo-client を使う。
- /etc/yum.repos.d/nginx-mruby.repo
[nginx-mruby] name=nginx-mruby rpm repo test baseurl=http://rpm-repos.s3-website-ap-northeast-1.amazonaws.com/centos/7/$basearch/ gpgcheck=0 enabled=1
yum clean all yum list all | grep nginx yum remove nginx yum install nginx yum list installed | grep nginx
以上。
あとはインストールした ngx_mruby の動作確認もやる。 nginx の conf ファイルに下のようなサンプルコードを追加してみる。
- /etc/nginx/conf.d/default.conf
location /hello { mruby_content_handler_code ' Nginx.rputs "hello" Nginx.echo "world!" '; }
そして起動。
systemctl start nginx
[VagrantのIP]/hello
にアクセスして helloworld!
が表示されていれば成功。
まとめ
hsbt さん指導のもと、いくつかのステップに分けて調査と検証を繰り返すことでなんとか S3 上に yum リポジトリを構築して yum install できるようになった。hsbt さんありがとうございました。おかげで粗い点がたくさんあったもののなんとかゴールすることができました。
また、実際に構築した yum リポジトリからインストールした ngx_mruby の動作確認にご協力いただいた おっくん さん、 ひろやん さん、 けんちゃんくん さんもありがとうございました。
今回は検証用に粗く作っただけだけど、近いうちに弊社の公式リポジトリができて、世界中からインストールできる日が来るかもしれない。
参考サイト
S3上にyumリポジトリを構築した話(前編)
2年ほどやっているスクフェスが最近マンネリ気味だったから、気分転換に先週あたりからデレステを始めてみたら見事にハマって気がついたらアニメのデレマスまで全話消化していた。そんな近況。
ところで本題。
新卒 OJT で ngx_mruby の yumrepo 作ってもらったら便利だった
— SHIBATA Hiroshi (@hsbt) October 30, 2015
ということで先日弊社OJTでyumリポジトリを作った。それもS3上に。
OJT?
弊社の新卒OJTではいろいろなことをやってる。今回やった仕事もそのOJTのうちの一つ。詳しくは以下のリンクからどうぞ。
以前はこんな研修もやってた。
背景
以下のパッケージビルダーを落としてきて、 docker-toolbox でビルドすることで ngx_mruby の rpm パッケージが生成される。 でもいちいち手元でビルドしないといけないのは面倒だから yum install で生成される rpm をインストールできたらいいよね、というのがはじまり。
GitHub - hsbt/ngx_mruby-package-builder: Package Builder of ngx_mruby with Docker
検証手順
そこで今回やったのは、運用とかは考えずにS3上にリポジトリを立ててみて yum install できるか検証すること。 (検証だけなのは2日間しか時間がなかったため)
そのために以下の手順で検証を進めることにした。
- 必要なファイルやディレクトリ構成など、 rpm の配布方法について調査する
- Vagrant 上で2台 linux サーバを立ち上げて、一方を rpm を置いたリポジトリサーバにして、もう一方から yum でインストールしてみる
- S3 上にリポジトリサーバを構築、上で立ち上げた Vagrant サーバから同じように yum でインストールしてみる
では、1,2までやってみよう。
rpmの配布方法
ディレクトリの構成は特に指定は無さそうだけど、 nginx.org で公開されている rpm の構成がわかりやすくて良い気がする。 間違いがあったらごめんなさい :bow:
nginx.org/packages/centos/7/x86_64/RPMS/
そして、配布に必要なのは以下の3つ。
repomd.xml にはリポジトリの情報が、データベースファイルには rpm パッケージに関する情報がそれぞれ格納されている。
最低限必要そうなものはわかったので、Vagrant 上でリポジトリを構築して yum install できるかどうか検証してみる。
Vagrant 上の yum リポジトリで yum install
適当に Vagrantfile を用意してそこに httpd で Web サーバを立ててみる。今回は CentOS 7 。
vagrant up rpm-repo-server vagrant ssh rpm-repo-server yum install -y httpd rm -f /etc/httpd/conf.d/welcome.conf systemctl stop firewalld systemctl disable firewalld systemctl start httpd systemctl enable httpd exit vagrant reload
リポジトリの準備を行う。 配布に使う rpm パッケージは nginx.org ですでに配布されているパッケージを置いてみる。
mkdir -p /var/www/html/repos/cent7/{i386,i686,x86_64,SRPMS} yum install -y createrepo yum install -y wget wget http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.8.0-1.el7.ngx.x86_64.rpm mv nginx-1.8.0-1.el7.ngx.x86_64.rpm /var/www/html/repos/cent7/x86_64/ createrepo -v /var/www/html/repos/cent7/x86_64/
rpm を取ってくるための VM を用意する。 Vagrant 間で通信できるよう Vagrantfile にて virtualbox__intnet オプションを追記しておくこと。
vagrant up rpm-repo-client
立てた yum リポジトリから yum install してみる。 インストールするためには repo ファイルが必要。 repo ファイルは下みたいにセキュリティ云々気にしない方向ならこれでよさそう。
- /etc/yum.repos.d/nginx-test.repo
[nginx-test] name=nginx rpm repo test baseurl=http://192.168.33.10/cent7/$basearch/ gpgcheck=0 enabled=1
作ってみる。
vagrant ssh rpm-repo-client vi /etc/yum.repos.d/nginx-test.repo yum clean all yum list all | grep nginx yum install nginx
yum list installed | grep nginx
で確認して表示されていればとりあえずOK。
nginx.x86_64 1:1.8.0-1.el7.ngx @nginx-test
まとめ
雑に作業手順をまとめてみたけれどこれでできるはず。
長くなりそうだから S3 での yum リポジトリ構築は次回に。
後編も書けたぞ
YAPC::Asia Tokyo 2015に参加してきた話 (前夜祭+1日目)
ブログにするのがだいぶ遅くなってしまった。
8月20,21,22の3日間、YAPC::Asia Tokyo 2015というイベントに参加してきた。
最初で最後のYAPCの感想みたいなものを書いてく。
前夜祭
会社を早退して会場へ向かった。酒があった。 てっきりこうゆうイベントってレッドブルとかエナジードリンクがピラミッドの如く積まれているところを想像していたのだけれどそんなことはなかった。 自分はほろよいを飲んでた。
酒だ!酒があるぞ!
— わさびのり太郎 (@ku00_) August 20, 2015
以下、聴いたトーク。
言語開発の現場
Rubyがどんな風に開発されてるかなど裏側の話。
Rubyというと人によって示す範囲が違うことや、デベロッパーミーティングは対面でやってることだとか、とても人間味のある話が聴けた。
はてなブックマークのトピックページの裏側
はてブのトピックページの作り方の話。
Elasticsearchはインターンで多少触ったことがあったからスコア計算とかクエリあたりの話は理解しやすかった。トピックの妥当性についてはまだ開発者の主観で判断してるらしく、日本語を扱った自然言語処理技術はイメージ通り大変そうだなあという印象を受けた。
技術ブログを書くことについて語るときに僕の語ること
どうやったらブクマがつくかについて語るだけのトークだった。
タイトルが9割決まると言って、◯◯論とか、アメリカという単語を混ぜると釣れるなどのネタを混ぜつつ、残りの1割で結構大事な話をしていた気がする。この部分の話は弊社のキャリアキーノートでも何人かのエンジニアが話していた内容と重複していた。やっぱり大事らしい。
1日目
この日も朝から参加。普段会社に行く時間帯よりも早くに家を出なければならなかったため気持ち的に少しつらかった。
以下、聴いたトーク。
- メリークリスマス!
- 世界展開する大規模ウェブサービスのデプロイを支える技術
- どうしてもPerlでドローンを飛ばしたい人のためのハードウェアハック概論
- Yet Another Perl Cooking
- esa.io - 趣味から育てたWebサービスで生きていく
- LT
メリークリスマス!
英語のトークと聴いて理解できるかなと心配していたが、同時翻訳機があったため杞憂に終わった。むしろ心配するべきは英語ではなかった。
どういうことかというと、Pealの話かと思ったら『ホビットの冒険(Hobbit)』と『指輪物語(LotR)』の話が始まったのだ。どちらの作品も読んだことも映画で観たこともないので全く話についていけなかった、かなしい。
トークを聴いてる間、ずっと同時通訳機で話している翻訳者の人について考えていた。技術的な用語だったり、話のいたるところで出てくるHobbitやLotRのことまで翻訳をしていて、自分よりも技術力高いだろうなと思っていた。
世界展開する大規模ウェブサービスのデプロイを支える技術
任天堂が運営しているMiiverseというWebサービス、そのサービスのデプロイはどうやってるのという話。
ちょうど2,3週間前にインフラ構築の研修をやっていたのもあり、他社がどのような運用をしているのか気になっていた。
デプロイにはcapistrano2とgitを用いたpull型の配布手法を採用しているけど、Consulとstretcherでやってみたら40倍も早くなったらしい。stretcherというデプロイツールは初めて聞いた。
どうしてもPerlでドローンを飛ばしたい人のためのハードウェアハック概論
ドローンはどうやったらハックできたり自作できるのかの話。
ドローンを飛ばすところが見られるかもと思い行ってみた。
PID値とか回路の話はよく理解できなかったものの、MultiWiiとかLeapMotionでドローンを操作しているところを想像したらすごいワクワクした。
Yet Another Perl Cooking
Twitterでこの人見たことある!と思って行ってみた。内容は料理をがんばって自動化してローストビーフをつくった話。
煮崩れしない温度は40度だとか、66度以上で肉を調理するとパサつくなどの料理の知識をエンジニアから得られる珍しいトークだった。ソースコードがレシピになる時代早く来てほしいと思う。あとローストビーフ美味しそうだった。
esa.io - 趣味から育てたWebサービスで生きていく
esaというドキュメント共有サービスがどのようにして作られたかの話。
esaのキャラクターの鳥がかわいい。開発スケジュールをあえて決めないでユーザからの要望に沿って開発するのは少人数ならではだなと感じた。それと楽しさやモチベーションは直接コントロールできないから、それらを生み出せそうな行動を心掛けるっていうのはなるほどと思った。
LT
各LTの合間に出てきて宣伝していたネコトーストラボの存在感がすごかった。LTのそれぞれの内容は思い出せなくてもこれだけは覚えているって人かなりいそう。個人的にはhubotで二次元嫁のbotをつくる話が面白かった。最高のbot駆動開発っぽい。
まとめ
自分の技術力に合っていて理解できそうなトークを選んで参加していたから比較的楽しく聴くことができた。自分の力として取り込めるような話ばかりではなかったけれど、たくさんの刺激をいただいた。がんばって何かしらの形にして還元していきたいな。
プルリクがマージされた話
初マージだったからうれしさある