Elaboration in, Garbage out

Twitt*r ではメモできない何かそれ的なモノ・コトを

社内で slack のようなやつ使いたいから Let's Chat 使ってみる

Intro

Slack 使いたい。でも社外に社内の情報おくのってどうなのーっていう理由で、社内サーバの導入可能なチャットアプリをデプロイできるようにしてみた。

本題

Slack 使いたいけど社内の情報を SaaS に上げるのってどうなのよオーラが出ている 会社でつらい。 環境だと、自社サーバー(または VM)で使えるものじゃないと使えないという制約がありますよね。だからといっていきなり HipChat はおたかい。

っていうわけで、色々探してみるとやっぱり同じこと考えている人はいるようです。

github.com

このサイトの中で自社サーバーで動かすもの、いわば Bring your own Server(BYOS)のオープンソースは次の3つぐらい。

ひかくなう

  • kandan
    • よさげ。
    • Hubot との連携可能。
    • 商用ライセンス版があるらしい。
    • コード読めばそれ以外に特徴もあるかもしれない。
  • Let's Chat
    • 非常に良さげ。
    • 機能は例えばこんな感じ。
      • もちろん Hubot アダプター有り。
      • REST Like API (多分完全な REST ではない)
      • ファイルアップロードできて、それを S3 における。認証も LDAP とか Kerberos 対応。
    • Security Compass · Security Compass で、稼働 10 % は自由に使っていいみたいなアレのプロジェクトで作られているものらしい。
    • 認証がしっかりしているのは多分 Security Compass さんがセキュリティにうるさい体質なんだろうという憶測。
    • SaaS じゃだめで S3 はいいの?っていうツッコミはナシで。その辺り、また次の記事に書こうかなーと。
  • mogo-chat
    • github のコミットのグラフを見ると、開発が終わっている模様。
  • echoplex
    • ぼちぼち。コード読めば特徴でるかも。

というわけで、Let's Chat を使ってみようという決断しましたとさ。

Deploy

なぜか CentOS 好きが周りに多い それでUbuntu 使いたいけど使えない ので、CentOS に Ansible で Let's Chat を構築するスクリプトを書いてみました。galaxy にも初登録。

Ken24/ansible-lets-chat · GitHub Ansible Galaxy | Find, reuse, and share the best Ansible content

LDAP とか kerberos とか S3 とかのモジュール追加はまだやってないし、なかで使う MongoDB を他のサーバーと共用して使うとかなるとまた別途設定が必要。 とりあえず、お試し的に使うとか、チームごとに物理的にも仮想的にも独立した用途で VM ガーッと作っちゃうっていう分にはいいかも。

ちなみに、Ubuntu だと Docker とか Vagrant で設定してまうコードが提供されています。Ansible のスクリプト作る意味あるんでしたっけーっていうのは、ほら、MongoDB とか他に追加するかもだし、Kerberos サーバーとの連携もしたいですし(震え声)。

イメージ

こんな感じ。写真はサムネイルが表示される。設定しだいではエクセルとか pdf とか色々アップロード可能(サムネイルはもちろん無し)。

f:id:huacha:20150416230232p:plain

Outro

HipChat のサーバ版使いたい←

Chef だと面倒くさいけど Ansible だとできること:踏み台構成

前提

本業で本格的に ansible 使うようになるんだけれども、本業では次のよーなサーバ構成になっている。

(操作端末)→(踏み台)→(サーバ郡)

これで ansible 使えるんだっけーっていうの調べてた。ついでに Chef も。 この踏み台がなんのためにあるかってのは、DeMilitarized Zone と Militarized Zone を分かつためにあるってことで*1

本題

で、こんな環境で構成管理ツール使う場合、おそらく次のようになると思う。

構成 Chef Ansible
操作端末だけで可能 knife-zero, knife-solo のみ?
サーバ郡に構成管理サーバを導入

サーバ郡に構成管理サーバを導入すればできるってのは、例えば通信が(Install で download すること以外)MZ 内のみで閉じるっていうことなんでほぼ当たり前ですね。

多段 SSH

そもそも踏み台があるなかで直接サーバ群にアクセスするには

  1. netcatコマンドを利用
  2. sshの-Wオプションを利用

をすれば多段 ssh がかんたんにできるよう。

ちなみに -W の説明はこんな感じ

-W host:port
    Requests that standard input and output on the client be forwarded to host on port over the secure channel.  Implies -N, -T,
    ExitOnForwardFailure and ClearAllForwardings.  Works with Protocol version 2 only.

つまり、踏み台サーバには

  1. netcat コマンドが使える
  2. SSHv2 に対応

という条件がそれぞれ必要。

参考になるぺーじ

netcat コマンドを利用する場合は、

-W オプションで行う場合には

が参考になるっぽい。(2015/3/1 追記:リンク間違えてたので修正しました)

余談

  • chef の場合、knife-{zero|solo} を使う場合 ssh-config を読み込めるので使える かもしれない
    • *2 公式の knife には -W オプション入っていないので、踏み台経由ではできないかもしれない 。頑張って調べればできるかもしれない。
  • 踏み台って英語でなんて言うんだろうって調べると、jump host というのが一般的らしい。が、特にセキュリティ担保のための踏み台は Bastion Host ともいうらしい(↓のリンク参照)。

*1:DMZ、MZ の詳しい説明は一番最後のリンク参照

*2:継続性の観点では、knife-{zero|solo} はほぼ個人でしか作成されていないので、いつか開発が止まるリスクは ansible に比べると大きい。っていうことも考えると

Hatena Engineer Seminar #4 参加レポ

まえがき

求人倍率 3 倍の Hatena Engineer Seminar にあたってしまったので参加レポを報告するんだってばよ!なぜかこの口調に慣れたんだってばよ!

セミナーそれぞれの感想

Goで書かれたmackerel-agentのOSS化や自動化にまつわるあれこれ

感想

  • 「ソース公開するだけではうまく回らない」
  • 「プルリクは公平に」

などなど,多分オープンソース業界では当たり前のことなんだろう.でも,その当たり前を知らない身としては非常に参考になる情報.ただ作ってポーイでは無いんだね(当然)

  • 「自動化するツールもテストしないと,結局誰もメンテできなくなるよ」

う……心がいたい……

その他

「Go は素朴,Scala むずかしい」

はてなのサービスの開発環境

感想

Vagrant 導入後の話が非常に有益.いやほら,「自動化イェイイェイ」みたいなノリで自動化しても結局誰もメンテできなくなるって,結局意味あったんだっけってなるでしょ.

  • 「(Vagrant でプロビジョニングのコード書いても)頬って置くと壊れる」

それで Ansible とか chef の出番かと思ったんだけれども,(Kernel とか PostgraSQL とかの)バージョンアップの対応していかないとそうなるのね.っていうのは自動化して運用してみないとわかんないでしょ.

ところで,「本番と別個に構成管理するコストかかる」とおっしゃっていたのが気になった.Chef とかだと開発環境用と本番環境用とでプロビジョニングのコード分けられるはずなんだけれども,それでも別個にかかるもんなのかなー.もともと一緒にやっちゃえ一緒にドンドコドンみたいなノリだったような気もするので.

その他

いたるところに出てくる余談の切れ味がすごい.

はてなブックマークの新機能における自然言語処理の活用

一番聞きたかった内容.むかーし Finding Scientific Topics という論文まねて,年ごとの論文盛り上がりトピック抽出したことがあって,それと同じノリだと思ってんだけれどももっと泥臭かった.とりあえず ES 便利.

だんだんレポート書く元気がなくなってきてるのは秘密,ではなく,本当は,多分書いたらまずい内容も喋ってくれている気がするっていうぐらい濃い内容.

はてなiOSアプリとSwift

Objective-C は三日坊主なのでよくわからんが,さわるなら Swift ということがわかった.

TypeScript で実現する MVP アーキテクチャパターン

今やってるプロジェクトで TypeScript 使いたくなるようなセミナーだった.ひたすら生 javascript つらい→学習コストほぼなし+移行コストはコード 5 行で TypeScript 移ってはっぴーだと言われたら使いたくなるじゃないですか. からの,はやりは違うやつって言われて,ズコッってなったのは秘密.

まとめ

自社にだいたい技術があるって素晴らしい,ということをしみじみ感じたセミナーでした.こんな会社いいよなー.

配列の凍結?

今動かしてるプログラム(Ruby, non rails *1)で,

can't modify frozen Array

っていうエラーが出てくる.なぜかごくたまに.配列が凍結ってなんやねん,と思いいろいろ調べたら,例えばコマンドラインから受け取る引数とか,よーく考えなくても変更ができない配列については frozen になっているらしい.そーゆー場合は,

list = ARGV[0].dup

とか duplicate しましょうっていうことで.

追記

Nokogiri でごくたまに取り出せない項目がある場合,Nil になることがわかった *2.それはいいとして,配列の中に Nil がある場合に配列を pop しようとすると,上記のエラーが発生するよう.ふーん.
とりあえず.Nil は "Nil" にしましょうってことで,暫定処置.

*1:"ruby non rails" の検索結果:約 623 件 (0.47 秒)

*2:例えば li で並んでる項目の中に,何故か一個だけ違うものが混じってるとか.

ipython notebook behind nginx

ipython notebook を nginx のリバースプロキシ経由で使おうとしたら,けっこー手こずったのでメモ.なんでそげなことするのか,っていうのは,通信路を暗号化させるためだけに SSL を設定するのに ipython notebook とか gitbukect ごとにオレオレ認証局たてるのはちょっとどうなのっていうことで,SSL の部分はすべて nginx にまるなげさせようって目的です.

環境

(ずっと同じだけど一応)

  • Ubuntu 14.04
  • nginx 1.6.2 (add-apt-repository ppa:nginx/stable で最新の安定版追加)
  • python 2.7.6
  • ipython 2.3.1
  • tornado 3.2.0 (pip で指定した)

症状

↓こんな感じでエラーがでる.

WebSocket connection failed

A WebSocket connection could not be established. You will NOT be able to run code. Check your network connection or notebook server configuration.

↓ここに載ってるやつ試してもダメだった.

解決方法

ここを読むと対処法が分かった.

で,設定例

location /ipython {
    # redirect
    proxy_pass http://localhost:9999;
    # setting for ipython
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Origin "http://localhost:9999";
}

WebSocket での,http ヘッダ?内?の? origin と host が違って?相違があると ipython/zmqhandlers.py at master · ipython/ipython · GitHub の 123 行目からのブロックの処理で弾いてる感満載,という感じらしい.

なんで origin と host とかが違うとダメやねん,ていうのは多分 WebSocket とか HTTP とかの勉強せなアカン感じ.ぐぬぬ

でもまだバグがある.

safari v8.0 ではやっぱりエラーが出ます.

ここみたら,tornado 3.2 を指定してるしーーなんだが,おかしい.chrome で動くからまーいーやってことで.

chef Server on Ubuntu 14.04

Chef Server 12 を cloudn にインストールしようと思ったら,なぜか動かなかったので,メモ.

環境

症状

おもいっきりエラーのテキストをメモり忘れたんだが,

STOUT: Waiting for rabbit@localhost
(中略)
STERR: process_not_running chef server

みたいなものが出ていたはず.なぜか RabbitMQ が動いてないっぽい.

対処

/etc/hosts に 127.0.0.1 localhost を追加した,だけ.cloudnさんェ…….

経緯としては,

chef-server-ctl tail

ってうったら,empd で localhost に繋がんないよ〜〜って怒られ続けていた.もしかしてーと思い

telnet localhost 22

とかやっても localhost 見つかりません〜〜って出た.まじか.

追記

ここChef Server Installation on EC2 Ubuntu 14.04 - 2014によると,ubuntu14.04 じゃ chef server は動かないらしい.まじか.

しけん

Docker を調べるなら CloudFoundry との比較もしなきゃなーと思いつつスルー.続いてそろそろまじめに Unit Test をやんないといけないし,諸事情で Ruby から python に移るのも今のうちだ,と思ったので,python の unit test について調べた.


unit testing - Python - doctest vs. unittest - Stack Overflow

いろいろ調べたけれども,このコメントが一番秀逸.ドキュメントも書きつつ,unittest は nose 使って分離を行うっていう.それぞれの一長一短を考えて,両方の長所だけを使ってますっていうことですね.それにしても doctest すごく便利だな.

あと,このスライドシェアがザクザクくるので一応メモ程度に保存.

自動テストの誤解とアンチパターン in 楽天 Tech Talk