お布団宇宙ねこ

にゃーん

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日のトライアル期間を過ぎての利用は、無料/有料に関わらずクレジットカードの登録が必要みたいです。

料金 - IBM Bluemix

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)は各自が自由に設定できます。

それでは実際に動いているかどうか見てみましょう。

f:id:ku00:20160321210232p:plain

大丈夫そうですね(´・_・`)

まとめ

Bluemixを使って神様を24時間稼働させることができました。

日本語対応してるのでわかりやすくて触りやすかったですね。

それでは。

参考

RubyKaigi2015に参加した話(1日目)

rubykaigi.org

会社からスポンサーチケットをいただいたので行ってきた。こういったカンファレンスは YAPC 以来2回目だったからどんな発表が聴けるかわくわくしてたら...

最高(´・_・`)

以下、聴いたトーク。

ちなみにレポート内容が箇条書きになっているのは自分の知識不足の表れなので戒めのためにそのまま残しておいた。

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の仕組みを全て把握していなくても速くすることができる
  • ベンチマーク
    • benchmark-ipsというgemで測ってる
    • コンパイルレンダリングの時間を計測
    • stackprof(gem)
    • 推測するな計測しよう
      • 改善に対する評価をちゃんと行う
  • テンプレートエンジンのためのライブラリ、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だし出してる
    • でも公平性を保つために誰が書いたのかは知らずに採点をしている
  • 宣伝
  • 去年は日本からのエントリーしかなかった
    • 今年になって少し外国の割合が増えたけどまだまだ日本以外のエントリーが少ない
  • 今年の作品
    • コップの中のコインがどこにあるのか当てるプログラム
    • rubyスキーマ両方で解釈できるプルグラム
    • プログラムと同じ模様を返すプログラム
    • 数独ソルバ
    • アンフェスバエナプログラム。自分自身を時計回りに複製していく

所感

英語のトーク試しに聴いてみたらなにを言っているのかほとんどわからなかった...。スライドで脳内補完することでなんとか大筋の内容は掴めたけれど。

TRICKのトークはコードを読んでもなにをやっているのかわからないけれどすごいものができているという印象だった。このメソッドはこのプログラムを作るために作られたとか言ってて言語開発者ですらそんなことを思うメソッドが存在するのかと。

知らない用語が出てくるととりあえず記憶の片隅に留めておいて聴くことにしていたけれど、トークを聴き終わったあとに結局なにが言いたかったんだっけってなることが結構あった。YAPCとはベクトルが違うかもしれないけれど、トークを聴いた時に面白いことやってるって感覚を持てたらいいと思ってるから、次回行ける機会があればもう少し知識を増やしてから臨みたい。

「師弟登壇2015」に参加してきた話

pepabo.connpass.com

同期の2人(@orzup, @chinu_t )が登壇するとのことだったからその応援に行ってきた。

登壇者の方々へ挨拶まわりしたときに登壇者でもないのにくっついてまわってた眼鏡が自分です。

気になる企業の新卒研修でどんなことをやっているのか知ることができた良いイベントだった。 農業体験をやっているところや、同じ新卒が違う職種の人にWebサービスを作れるよう指導する研修をやっていたりと面白い話がたくさん聴けた。 そして師匠(メンター)の方々がどういった意図で研修作って実行しているのかを聴くことで、 ただ単純に面白い研修をやっているなあという感想で終わりにならないから、そういった面でも学びが多かった印象。

眼鏡を新調したせいか目がとても疲れていたから寿司は食べずに帰ったよ🍣

S3上にyumリポジトリを構築した話(後編)

前回のあらすじ

ku00.hatenablog.com

前編では以下の3つ検証手順のうちの1,2をやった。

  1. 必要なファイルやディレクトリ構成など、 rpm の配布方法について調査する
  2. Vagrant 上で2台 linux サーバを立ち上げて、一方を rpm を置いたリポジトリサーバにして、もう一方から yum でインストールしてみる
  3. S3 上にリポジトリサーバを構築、上で立ち上げた Vagrant サーバから同じように yum でインストールしてみる

今回はブログタイトルでもある本題の3をやるぞ。

S3 上の yum リポジトリyum install

S3上の yum リポジトリには ngx_mruby-package-builder で生成した rpm を置いておきたいから、リポジトリ作成に入る前に用意しておこう。本題ではないから docker-toolbox のインストール解説とかは特にやらない。

まず、 ngx_mruby の rpm パッケージを x86_64 以下に置いて createrepo コマンドでリポジトリの準備を行う。 そして、ホストマシン側に以下のものを落としておく。

  • rpm パッケージ
  • repodata (repomd.xml とデータベースファイルを含んだディレクトリ)
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 まで作っておく。

AWS CLI をインストール

以下のリンクにインストール方法等が書かれているのでその通りにやる。

http://docs.aws.amazon.com/ja_jp/kinesis/latest/dev/kinesis-tutorial-cli-installation.html

アクセスキーの作成と登録

以下のリンクの通りにやる。先ほどインストールした AWS CLI を使って aws configure でアクセスキーが登録できる。また、登録した情報は ~/.aws/credentials から確認できる

https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSGettingStartedGuide/AWSCredentials.html

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年ほどやっているスクフェスが最近マンネリ気味だったから、気分転換に先週あたりからデレステを始めてみたら見事にハマって気がついたらアニメのデレマスまで全話消化していた。そんな近況。

ところで本題。

ということで先日弊社OJTyumリポジトリを作った。それもS3上に。

OJT?

弊社の新卒OJTではいろいろなことをやってる。今回やった仕事もそのOJTのうちの一つ。詳しくは以下のリンクからどうぞ。

blog.hifumi.info

以前はこんな研修もやってた。

blog.hifumi.info

blog.hifumi.info

blog.hifumi.info

背景

以下のパッケージビルダーを落としてきて、 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日間しか時間がなかったため)

そのために以下の手順で検証を進めることにした。

  1. 必要なファイルやディレクトリ構成など、 rpm の配布方法について調査する
  2. Vagrant 上で2台 linux サーバを立ち上げて、一方を rpm を置いたリポジトリサーバにして、もう一方から yum でインストールしてみる
  3. S3 上にリポジトリサーバを構築、上で立ち上げた Vagrant サーバから同じように yum でインストールしてみる

では、1,2までやってみよう。

rpmの配布方法

ディレクトリの構成は特に指定は無さそうだけど、 nginx.org で公開されている rpm の構成がわかりやすくて良い気がする。 間違いがあったらごめんなさい :bow:

nginx.org/packages/centos/7/x86_64/RPMS/

そして、配布に必要なのは以下の3つ。

  • rpm パッケージ
  • repomd.xml
  • データベースファイル

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 リポジトリ構築は次回に。

後編も書けたぞ

ku00.hatenablog.com

YAPC::Asia Tokyo 2015に参加してきた話 (前夜祭+1日目)

ブログにするのがだいぶ遅くなってしまった。

8月20,21,22の3日間、YAPC::Asia Tokyo 2015というイベントに参加してきた。

最初で最後のYAPCの感想みたいなものを書いてく。

前夜祭

会社を早退して会場へ向かった。酒があった。 てっきりこうゆうイベントってレッドブルとかエナジードリンクがピラミッドの如く積まれているところを想像していたのだけれどそんなことはなかった。 自分はほろよいを飲んでた。

以下、聴いたトーク。

言語開発の現場

Rubyがどんな風に開発されてるかなど裏側の話。

Rubyというと人によって示す範囲が違うことや、デベロッパーミーティングは対面でやってることだとか、とても人間味のある話が聴けた。

はてなブックマークのトピックページの裏側

はてブのトピックページの作り方の話。

Elasticsearchはインターンで多少触ったことがあったからスコア計算とかクエリあたりの話は理解しやすかった。トピックの妥当性についてはまだ開発者の主観で判断してるらしく、日本語を扱った自然言語処理技術はイメージ通り大変そうだなあという印象を受けた。

技術ブログを書くことについて語るときに僕の語ること

どうやったらブクマがつくかについて語るだけのトークだった。

タイトルが9割決まると言って、◯◯論とか、アメリカという単語を混ぜると釣れるなどのネタを混ぜつつ、残りの1割で結構大事な話をしていた気がする。この部分の話は弊社のキャリアキーノートでも何人かのエンジニアが話していた内容と重複していた。やっぱり大事らしい。

1日目

この日も朝から参加。普段会社に行く時間帯よりも早くに家を出なければならなかったため気持ち的に少しつらかった。

以下、聴いたトーク。

メリークリスマス!

英語のトークと聴いて理解できるかなと心配していたが、同時翻訳機があったため杞憂に終わった。むしろ心配するべきは英語ではなかった。

どういうことかというと、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駆動開発っぽい。

まとめ

自分の技術力に合っていて理解できそうなトークを選んで参加していたから比較的楽しく聴くことができた。自分の力として取り込めるような話ばかりではなかったけれど、たくさんの刺激をいただいた。がんばって何かしらの形にして還元していきたいな。