/dev/null

(◞‸◟)

SublimeText2でSphinx-Build

ドキュメント書くのにSphinxを使い始めましたが書いたテキストをプレビューするにはmake htmlしたりする必要があります。

毎度コンソールから叩くのが面倒です。どうせならSublimeTextなどでbuildしたいです。

ということでSublimeTextにBuildコマンドを登録します。(for Mac)

SublimeTextの[Tools]→[Build System]→[New Build System]で新しいbuildコマンドを作ります。

{
    "cmd": ["make", "html"],
    "working_dir": "${project_path:${folder}}"
}

中身は上記に変更。

それをsphinxとか名前にして保存。

rstファイルを開いて

[Tools]→ [Build System]→[sphinx]にして⌘+Bでbuildが実行出来ます。

が、自分の環境ではコレではダメでエラー出ました。

Makefile:12: *** The 'sphinx-build' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the 'sphinx-build' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/.  Stop.
[Finished in 0.1s with exit code 2]

sphinx-buildのコマンドパスが見つからないエラー。

SublimeのPATHは⌘+,で


    "build_env":
    {
        "PATH": "/usr/local/bin:/usr/local/sbin:/usr/local/share:/usr/bin"
    }

を設定。

そうすると

sphinx-build -b html -d _build/doctrees   . _build/html
Running Sphinx v1.2.2
loading pickled environment... done
building [html]: targets for 0 source files that are out of date
updating environment: 0 added, 0 changed, 0 removed
looking for now-outdated files... none found
no targets are out of date.
make: echo: No such file or directory
make: *** [html] Error 1
[Finished in 0.6s with exit code 2]

これもまたエラー。

中途半端にエラーになってて辛いのでドキュメントフォルダにあるMakefileを編集して

  4 # You can set these variables from the command line.
  5 SPHINXOPTS    =
  6 SPHINXBUILD   = sphinx-build
  7 PAPER         =
  8 BUILDDIR      = _build

の6行目を/usr/local/bin/sphinx-buildに変更しておくとbuildが通る。

Docker Meetup Tokyo #2 まとめ #dockerjp

Docker Meetup Tokyo #2 に行ってきました。

Docker Meetup Tokyo #2 - connpass

 #1は行ってないですしDocker自体、全然触れてないですが先着入れたので。

メインの発表は3本。

@mainyaaさんの「今からでも間に合うDocker基礎+Docker 0.9概要+Docker 0.10概要 」

Dockerの基礎から説明してくれていたので、Noobな自分でも大体の概要はわかった感じ。

VagrantVM立てるのと違うんだなーってのがわかっただけでも大収穫。

AUFSでレイヤー構造になってるってのが理解しておくのが大事。省メモリだしディスクも取らない差分だけだから。

途中のデモで使ったこのサービスが最高な感じあった。

ターミナルの録画

asciinema - Record and share your terminal sessions, the right way




@ten_forwardさんの「Linux kernel のコンテナ機能」

"あの"ファーストサーバの方だそうで。

LinuxにおけるLXCの他のコンテナのお話とか、LXCのこととか。

ちょっとレイヤが低くて自分には難しかったけど、NameSpaceとかCgroupとか勉強になった。

LXCのman pageとかの翻訳の協力者を探しているようですので興味ある方はぜひ。




@naoya_ito さんの「Dockerアプリケーションのポータビリティを考える」

みんな大好きImmutable Infrastructure

Dockerはその武器になり得そうな感じ。

docker run atlassian/jira

って打つだけでjira環境立つ。便利。

アプリケーションをDocker形式(Image)にして配布。使いたい人はライブラリとか依存とか気にせずdocker runすれば動く。幸福っぽい。

Dockerはコンテナ、コンテナは廃棄されることが前提、じゃあ再現性がなければいけない(廃棄して作りなおしても同じものが出来ないと意味が無い)

必然的にアプリケーションを構築する際に再現性、ポータビリティが求められる。

環境がアプリケーションに一定の制約を持たせる感じ、結構良いと思う。

デモも用意されてた

GitHub - naoya/docker-paas-example

実用がどうこうじゃなく、アプリケーションとDockerの方向性を知るためにある感じ。

プルリクエストに対してこれができれば、レビューとかするのに楽な気がする。コードだけのレビューだけとは限らず期待した動作をするのかを試したいときは多い。

環境のimageをたくさん作っておくほうが楽っぽい。




ここでピザとビールで懇親会。

オシャレピザっぽくて美味しかった。

で、そのままLT。

@inokaraさんの「コンテナ内で複数のサービスを管理する試み」

新婚さんいらっしゃいに出てたらしい。

Dashingっていうダッシュボードを簡単に作れるやつで、Dockerコンテナを管理するものを作ってた。

すべてのコンテナの数とか、アクティブなコンテナとか。便利そう。

追記:ブログにスライド掲載されてました

Docker Meetup Tokyo #2 で LT させて頂きましたの巻 #dockerjp - ようへいの日々精進XP




@smokeymonkey さんの「Docker +serverspecで作るconfigspec CI 」

冪等性とか厳密に考えないでconfigする感じの構成ツール?ちょっとスライドが駆け足だったのでまとめきれない感じ。

と思ったらブログ記事にすでになってた。さすがクラスメソッド。

Docker Meetup Tokyo #2でLTしてきた:「Docker+serverspecで作るconfigspec CI」 #dockerjp | DevelopersIO




@takipone さんの「Docker meets AWS OpsWorks」

AWSのOpsWorksの話だったり。

そんな厳密な冪等性いらないよねーみたいな。chefでexecuteモリモリ使ってるとか。

追記:ブログ追加

Docker Meetup Tokyo #2 LT「Docker meets AWS OpsWorks」の続き #dockerjp | DevelopersIO




@futoaseさんの「Aiming解析チームでのDockerの利用」

GrowthForecastとかHRForecastをDockerで。

Perlbrewとか確かにメンドイしポータブルで動くの良さそうだ。

Docker Meetup Tokyo #2




@syoyoさんの「GCE+Docker+etcdでレイトレ」

今日一番会場盛り上がったんじゃないかっていう。

10k nodeとか使ってGCEでレイトレ。

このサイトで動いてる

Welcome to CentOS

バイナリが70MBくらいあるらしいんだけどClangとかをincludeしているかららしい。凄すぎてよくわからん世界。




@kazunori_279 さんの「Fluent Dashboard+Norikraでリアルタイムダッシュボードを7分で作る話」

Qiitaを拡大表示してスクロールさせてスライド風にするメソッド。ウケる。

Fluent Dashboard+Norikraでリアルタイムダッシュボードを7分で作る話 #dockerjp - Qiita

ほぼリアルタイムでfluentdから送られきたサマリデータをスプレッドシートに表示。

3分くらいで設定できる。

GCEインスタンスををNorikra,nginx,AB用で3つたててそれをDockerイメージに登録しておくと即環境出来る。凄い。

ほぼリアルタイムなのでソシャゲのイベント測定とかに便利に使えるんじゃないのかなぁ。




@deeeetさんの「Docker ApplicationをDaaSにデプロイ」

DasS「Docker as a Service」

OrchardとかいうDasSが安いし、Dockerコマンドとほぼ変わらない感じのラッパーコマンドでDockerで管理してるWEBアプリケーションを公開できて便利とか。

https://orchardup.com/

ngrokというのも紹介されてた

ngrok - secure introspectable tunnels to localhost




DG0426 さんの「Docker地雷n本勝負」

0.7時代に使ってたようで結構地雷踏んでたみたい。

SymLinkしたら削除出来なくてDiscFullとか、ビルドは壊れてないのに立ち上がらないとか。大体すでに0.10では直ってるそうです。

追記:スライド追加




@jxta さんの 「Data Center to Distributed Cloud」

なんか規模感でかい。データセンターをクラウド上に構築?みたいな?

自分の知識の範囲外過ぎて何も書けない。







発表はこんな感じ。

GoogleさんがGCEの$500無料コードくれたり。ステッカーもらったり。

Googleの中の人が、GCEでもAWSでも好きに使ってくれて構わないしその発表も歓迎だしそのFBがあると色々ハッピーだよねっていう話してて凄いよかった。

とりあえずまず手元で動かして面白さを体感しないとだな。 あと行くまでは、インフラ関係の仕事メインな人が多いのかなと思ったけど話した限りアプリケーション周りの人が多い。 多分WEBの人とかは、何でも自分でやらなきゃいけない状況な人が多くてそこら辺の構築をいかに手軽に速く出来るかとかに興味ある人多いのかなーとか思ったり。 フルスタックエンジニアってなんでも屋みたいなもんだしな。

Immutable Infrastructureとかなかなか身近になる気はしないけど、カジュアルに環境とかが作れて廃棄出来てっていう状態は開発のサイクルを高速に回す上で必須だしそれをエンジニアが自分でさくさく出来るためのDocker、とてもいい気がする。

プロダクションで使ってる人の話とか聞きたい。

ここらの話はどうなんだろ

ssig33.com - Docker をプロダクトのデプロイに使う

ssig33.com - 普通の人が Docker を使う理由

運営の方、スピーカーの方、Google、そして話してくれた方、ありがとうございました。

次回もあるなら行きたいですね。

org.apache.http.impl.cookie.BestMatchSpec.formatCookiesでTomcatが突然の死

運用中のTomcatがある日突然死ぬ。

死ぬタイミングは不定

その時のcatalina.outなログは

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGVSIGSEGV (0xb) at pc=0x00007fc028c69528, pid=3634, tid=140460796401408
#
#
# JRE version: 7.0_21-b11
# Java VM: Java HotSpot(TM) 64-Bit Server VM (23.21-b01 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# # Problematic frame:
# J  org.apache.http.impl.cookie.BestMatchSpec.formatCookies(Ljava/util/List;)Ljava/util/List;
#
# # Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /home/XXXXXXX/hs_err_pid3634.log
#
# If you would like to submit a bug report, please visit:
#
#   http://bugreport.sun.com/bugreport/crash.jsp
#

的なもの。

org.apache.http.impl.cookie.BestMatchSpec.formatCookies辺りが怪しいらしいけど、動かしてるWEBアプリケーション上でそ上記を使っている(明示的に呼び出している)部分は存在しない。

色々調べてみるとどうやらJDKのバグっぽい。

辛い。

http://bugs.java.com/view_bug.do?bug_id=8025398

fixされたコード何言ってるかさっぱりですけど

http://hg.openjdk.java.net/hsx/jdk7u/hotspot/rev/8ada83878f30

で、JDK7u60ではfixされる。

がJDK7u60はまだEarly Access。Production環境で使うにはなんとなく不安ですね。

このバグの実証コードが載っているページを見てみます。

GitHub - rholder/jvm-loop-unswitching-bug: Cause the JVM to produce a segmentation fault from org.apache.http.impl.cookie.BestMatchSpec.formatCookies

どうやらJVMの起動オプションに

-XX:-LoopUnswitching

というものをつけて起動すると当座は回避出来るよう。

実際つけて起動して数週間起動しても問題なく落ちていない状態になった。

解決といえば解決なんだけど、突然落ちるようになったのなんなんだろうと思ったので調べてみる。

org.apache.http.impl.cookie.BestMatchSpec.formatCookies

が悪さをしているらしいが呼んだこと覚えのないメソッド。

ってことは外部ライブラリがこれらを使っているんだろうと予想。

で最近入れたライブラリはjava-apns。

https://github.com/notnoop/java-apns

が呼び出してない。。

もう1回自分のところのコードを追うと、確かにapache.HttpClientを使っている箇所がありそこではAppleへの課金問い合わせ的なことをしている。

そこでのResponseをよく見るとログに、

[ajp-bio-8009-exec-3104] WARN  org.apache.http.client.protocol.ResponseProcessCookies - Cookie rejected: "[version: 1][name: ns-mzf-inst][value: 183-169-80-243-18-8141-592396-59-st13][domain: .apple.com][path: /][expiry: Thu Apr 03 09:54:21 JST 2014]". Domain attribute ".apple.com" violates RFC 2109: host minus domain may not contain any dots

モロにCookie関連でWARN出てる。

なんかAppleの課金鯖のドメインがRFC2109のCookie形式に違反してるっぽいのかなと。

Apple.comはいいけどbuy.itunes.apple.comは駄目みたいな(ドメインは適当

ドメインの中に.があってはいけない、みたいな?

きちんとしたCookiePolicy呼ぶとかすればいいっぽかったりするらしい。

HttpClientを実装していてIllegal domain attributeのCookie rejectedを回避したい時… | shinodogg.com

とりあえず、JVMのバグでTomcat突然死するとエンジニアも突然死するという話でした。

JenkinsのSVNポーリングによるBuildが2回走る現象を直した

この前

【解決】JenkinsのSVNポーリングによるBuildが2回走る現象について - /dev/null

というものを書いた。

で、直せた。

SVNのcommitをトリガーにしているジョブのソースコード管理→SubVersion→モジュール→リポジトリURLでSVNリポジトリのURLを指定するのだが

そのURLの最後に@HEADをつける。

で、直る

https://yoursvn.com/yourproject/trunk

を指定してる場合に

https://yoursvn.com/yourproject/trunk@HEAD

とする。

理由はようわからんけど@HEADをつけないと最新を追従してくれないっぽい。

SVNプラグインのソース読んでも大丈夫っぽいだけどなんでだろ。

GitHub - jenkinsci/subversion-plugin: Jenkins subversion plugin

とりあえず実用に耐えられるレベルになったのでよし。

MacのVPN+SSHを延命させるためにやった2つのこと

社内だとVPNを使ってサーバー等に接続することが多いのですが、そのVPN接続がやたら落ちる、などいうことは往々にしてあると思います。

VPNが落ちる原因として、単純にVPN鯖のスペッコがアレで社内の多くの人が繋げるとトラフィック云々で死ぬというのが大きなものです。 それにWindowsMacも関係ありません。

しかし、MacにはWindowsと違って他にも原因があります。 それを解消することでWindowsよりも長く接続させることも可能だったりします。



そもそもMacのCiscoIPSec VPNクライアントは接続してから45分程度経つと接続がぶった切られる糞仕様。 ぶった切られるというか、パスワードを求められたりする。

Built-in IPsec VPN randomly drops to Cisc… - Apple Community


まずはそれを解除します。

このサイトの通り。

Getting a Cisco IPSec VPN to not disconnect after 45 minutes on Mac OS X Mountain Lion · wincent.com




  • まず普通にVPMを繋げる(設定ファイルが作られる)
  • 作られた設定ファイルを/etc/racoon にcopyする $ sudo cp /var/run/racoon/x.x.x.x.conf /etc/racoon x.x.x.xはVPNサーバーのアドレス
  • 設定ファイルを編集 $ sudo vim /etc/racoon/racoon.conf
  • 下の方にある include "/var/run/racoon/*.conf" ; という文字列をコメントアウトする →#include "/var/run/racoon/*.conf" ;
  • コメントアウトした代わりに行を追記する include "/etc/racoon/x.x.x.x.conf" ; ←さっきのVPN鯖のファイル名にする
  • コピーしたファイルを編集する $ sudo vim /etc/racoon/1.1.1.1.conf
  • dead peer detectionを無効にする dpd_delay 0 ; DPDに関して

IPsec DPD * proposal checkを obeyからclaimに変更する proposal_check claim; * proposed lifetime を3600秒から24時間(任意)に変更する liftetime time 24 hours

ここで重要なのはlifetime の部分は数カ所あるのでそれぞれ全て変更すること。


それと、24時間だと長すぎて反映されないこともある。12時間、ないしは8時間などで試すのも良い
  • 一旦VPNを落として再接続(Macの再起動したほうがよいかもしれない)
  • ここまでやると45分制約はなくなる



実際、これで結構VPN持つようになります。MacIPsecクライアントは鯖の負荷で接続が切れてもそのまま接続を張ろうとすると再接続してくれたりするのでWindowsよりなんとかなります。

しかし、もう一つ問題が。

上記の接続を張ればなんとかなる、というものやつは、クライアントからサーバーに向かって何かしらのアクションをおこしていなければならないということ。

簡単に言うとSSH張ってる時に一瞬VPN落ちたらひたすらEnter押してればいい。

が、現実問題そんなことは不可能なのでSSH接続してるよ〜〜ってクライアントから言ってあげてればいい。



.ssh/configを編集(デフォルトでは存在しない)
$ vi ~/.ssh/config ServerAliveInterval 15

これを入れることで5秒毎にサーバーへ応答をしてあげるのでSSH接続が切れない(そもそもVPNなしでもこの設定入れないとSSHは適当なタイミングで死ぬ)

ここまでやると、1時間に1回VPN+SSH接続が切れて、俺がキレるみたいなことが減り10時間接続しっぱなし!みたいな状況が実現されてるのでとても幸福感があります。

社内サイボウズガルーンの予定をGoogleカレンダーに同期させてみた話

社内のグループウェアサイボウズ(ガルーン)が使われているところは多いかと思います。

で、思うのはGoogleカレンダーにその予定が同期されてれば、お昼ごはん食べに外に出ていって「この後予定あったっけ...」などという残念極まりないミスが減らすことができるのではないかという妄想。

そもそもちゃんと予定を確認して外に出ろという根本対策は取れません。

まず、前提としてそのサイボウズからは社内端末からしかアクセス出来ないということです。

個人のスマフォ、PCなどを社内に持ってきて飛んでるWi-Fiに繋いでも登録済みな端末(MACアドレスとかでみてるのかな)しかアクセスは不可能です。

一応公式でiCal形式での書き出しに対応しているのでimport自体は可能です。

月予定などを表示して右上の「iCalendarファイルへの書き出し 」を開けばiCalが落ちてくるのでそれをよしなに登録すればいいのですが、毎回手動で入れるのだるい。

探してみます。

https://chrome.google.com/webstore/detail/cybozu-to-google-calendar/ohmpmeclfhjhcbcmdjalfaccndhfpgke

良さげなChrome拡張ですが結局手動っぽいので不適な感じ。

GitHub - manbow/garoon-to-google-calendar: ガルーンのスケジュールをgoogleカレンダーに入れる

自分で鯖にphpスクリプトを置いてicsサーバーを作る感じ。

これは自動で変更とかも見れそうじゃないかな?と思ったんですが、外部の鯖からサイボウズにアクセス出来ないので動かせません。

社内PCでApache立てて動かしてみたら確かに動いたんですが、今度はGoogleカレンダー側から社内PCにアクセス出来なければいけませんのでセキュリティ的なアウトですね。

ちなみにこの上記のphpスクリプト、生成されたicsファイルはそのままだと動かないかもしれない(Macのカレンダーに投げたらエラー)ので、テキストエディタで開いて+0900となってるところを削除しましょう。

    $page = preg_replace("/DTSTART:[0-9A-Z]+/","$0+0900",$page);
    $page = preg_replace("/DTEND:[0-9A-Z]+/","$0+0900",$page);

ココらへん削除するのがいいかもしれない。

これはどうやってもアレな気がしてきたのですが、一つアプリを見つけました。

ガルーン同期 - Apps on Google Play

その名の通り、URLとIDとパスを入れればガルーンとGoogleカレンダーが同期してくれる便利Androidアプリ。

これを端末にインストールすればいいのですが、個人端末に入れても社内ネットワークに属していないので結局使えません。詰んでる!

で、どうしたかというと、社内PCにAndroidエミュレーターを入れてその中でこのアプリ動かせば、ネットワークは社内だし、Androidアプリで同期できるし最高な感じあります。

で、Androidエミュレーターは公式のがクッソ重くて使い物にならないので代替を使います

Genymotion – Android Emulator for app testing Cross-platform Android Emulator for manual and automated app testing

導入は説明メンドイんでこれ。

Miix2 8 レビュー20―『Genymotion』で「Google Play」をインストールする方法

で、あとはGoogle Playからさっきのアプリを入れてよしなにURLなどを設定して同期。

httpsな社内鯖の場合は「無効なSSL証明書を許可」にチェックだけ入れましょう。

GenyMotionで起動したエミュレータは終了せずにそっと放置。あとは社内PCが起動している間は予定が同期されます。

PC終了させると同期は止まるけど、家に帰るときくらいだし、流石にそこでスケジュール変わっても問題ないでしょう。家では休もう。

この方法の最大の弱点はエミュレータがそれなりにメモリを食うので、たかだか同期させるために1GB程度のRAMが使われることですね。

マシンスペックに余裕がある方はいかがでしょうか。

まぁ、ここまでやって思うことは

こんな事する必要ないし、そこまでしてスケジュール把握出来ないと困る状況を作るな

余談として、アプリのレビュー見てると、自社サーバーでもいけるようにしてくれとかあるけど、お前の環境が悪いだけだろって感じですねぇ。

Mac用YammerクライアントGabbleを導入

なんかYammerとかいう企業向けSNSというかそんなよくわからんものがありまして

Yammer: Work Smarter, Work Together

で、そのデスクトップ版クライアントが公式から出てるんですが、それがAdobe Air製なので重いわRetina対応じゃなくてボケボケだわで大分fxxk

というわけで他にクライアントないのかなと探してみたらMac AppStoreに発見

https://itunes.apple.com/jp/app/scuttlebutt-for-yammer/id645460067?mt=12&uo=4&at=10l8JW&ct=hatenablog

でも1000円だし経費で絶対落ちないし他のを探します。

するとGabbleというのを発見。なんだか良さそう。アップデートとかしばらくしてなさそうだけど。

HugeDomains.com

macos - What Yammer clients available on the Mac? - Ask Different

導入します。

DLして起動するだけで認証画面が出るのでWebからAuth。

ところがなんだか問題が発生しました的な。

f:id:gitpub:20140129101057p:plain

何度やっても同じ画面なんですが、この画面のときのURLをよく確認します。

https://www.yammer.com/mycompany/oauth/authorized?consumer_token=NNN&oauth_verifier=XXXX

的なURLだと思うのですが、このoauth_verifierパラメータについてる文字列、この場合XXXXをGabbleの認証コードとして入力してあげると認証通るのでした。

どうなんだこれ。

なにはともあれこんな感じなそこそこ素敵インターフェイス。モザイクでなんもわかんねーけど

f:id:gitpub:20140129102814p:plain

公式アプリよりはマシなので良い。