2016年10月4日火曜日

お引っ越しします。

ご無沙汰してます。
Markdownの素晴らしさに触れてしまって、はてなブログが良いらしいという話を聞いたので、なにかと編集関係に不満があるBloggerからお引っ越しします。

新しいブログでもよろしくお願いします。
http://li-feel.hatenablog.com/

2016年6月10日金曜日

Haskellのメモ

Haskellの試験が某日にあって、いろいろと覚える必要があったので、Haskellの基礎の基礎だけまとめたペライチを作りました。

(TAT)な大学の講義でやった範囲を簡単にまとめただけですが…




ここまで作って試験ではエレガントに書けず、減点を食らいまくったようですが…
関数型難しい。

[備忘録]Trema & Open vSwitch をOpenFlowを使った実験のためにインストールするためのメモ

これなに?

りとるすです。ご無沙汰してます。OpenFlowのテスト環境のメモが発掘されてきたので、いろいろあったことだしメモしておきます。現在もこれで動くのかどうかは確認してませんが、たぶんバージョンが同じなら大丈夫なんじゃないですかね(適当)

作成する環境


  • Virtualbox
  • Ubuntu Server 14.04 LTS
  • Trema 0.4.7
  • Ruby 2.0.0-p643( with RVM )
  • Open vSwitch 2.0.2



TremaRubyのバージョンについて

ドキュメント量と、Trema側のソースコードが素直(ただしruby.h+C)なのでどうにかなりやすい
Rubyのバージョンは2.0.0-p647が、新しいモノの中でも一番安定して動くらしいため。
また、0.4.7は書籍のコードがまるっとそのまま使える最終版。それ以降はフォルダ構成が変わってるなどが原因でうまく動かない。ちなみに、Google検索に引っかかる一番新しいバージョンの情報は0.6.0。インストールのことだけ。
なお、Open vSwitchVirtual networkingのときも必要(になることがある。)なので、とりあえず同じやつに入れておくことをおすすめする。

Ubuntu Server 14.04VBoxAdditionのインストール

スペースを使ってSSH Serverだけ入るようにしてinstall
ネットワークアダプタの1つをNATにしておき、ポートフォワーディングでお好みのポートに「22(ssh)」を飛ばす
初期は思いっきり文字化けするので、ロケール情報を.bashrcに書いておく。
----
case $TERM in
     linux)LANG=C ;;
     *)LANG=ja_JP.UTF-8 ;;
esac
----

$ sudo apt-get install build-essential module-assistant

$ sudo apt-get install xserver-xorg xserver-xorg-core

ここで、CDドライブにGuest AdditionのディスクをGUI操作で挿入。
その後にマウント。
$ sudo mount /dev/cdrom /mnt

/mntに、VBoxAddition的なフォルダができるので、そのフォルダのlinuxと書かれたスクリプトを実行。
モジュールのコンパイルが始まる。

終了後、仮想マシンを再起動。
これで共有フォルダが使える。

rootはともかく、メインユーザーがマウントしたフォルダにアクセスできないから
$ sudo gpasswd -a takahiro vboxsf
として、権限をメインユーザーに与えておく。

Ruby(RVM)のインストール


$ curl -L https://get.rvm.io | bash -s stable

エラー出て死ぬので、gpgから始まるエラーではかれたコマンドを実行後、再度実行。このときSSHでないと死ぬほど面倒。
SSH設定しないなら、リダイレクトなどで取り出し。

.bashrcに追記。
-----
source $HOME/.rvm/scripts/rvm
-----
その後、
 source ~/.bashrc
で再読込。

$ rvm requirements
すると、必要なモノを勝手にapt-getしてくれる。勝手にsudoする。

$ rvm list known
すると、インストールできるrubyが一覧で出てくる。
2.0.0-p647あることが確認できるので、確認してから、

$ rvm install 2.0.0-p643

すると、rubyが勝手にコンパイル始まって、インストールできる。
もちろんパスも前述のsourceさえ設定していれば勝手に通る。

Trema 0.4.7のインストール


 必要なパッケージをapt-get
$ sudo apt-get install gcc make libpcap-dev libsqlite3-dev git libssl-dev pkg-config glib-2.0
バージョン指定のgemsであっさり入ってしまう。
$ gem install trema -v 0.4.7

以上。
trema内蔵の仮想ネットワークもこの時点で使用できるようになる。


仮想環境上にOpenvswitchを設定

 OpenvSwitch自体は実際あっさり入ってしまう。
$ apt-get install openvswitch-switch
 Ubuntu 14.04であれば、勝手に2.0.1が入る。

今回の環境でのネットワークの接続は次の通り。Virtualbox側で設定。
 advexp_vnet_sw (OpenvswitchTremaが動くマシン)
NIC1:NAT(SSH操作用)
NIC2:Host-only adapter(ホスト-ゲストマシン間)
NIC3:内部ネットワーク[internalA]
NIC4:内部ネットワーク[internalB]

 advexp_vnet_srv (コンテンツを置いているサーバ)
NIC1:NAT(SSH操作用)
NIC2:内部ネットワーク[internalA]

内部ネットワークと名前はついているが、トンネル的な使い方をする。同じ名前をつけた内部ネットワークでマシン同士をつないであげればよい。つまり、マシンを増やすときはinternalBを設定してつないであげれば良い。

両方のマシンとも、
$ sudo vi /etc/network/interfaces
で、NICを認識させる設定を書く。(Ubuntuは自動でNIC認識しない)
とりあえずサーバ(advexp-vnet-srv)に設定していく。

@advexp-vnet-srv
-----
(追記する)
 auto eth1
 iface eth0 inet static
 address 192.168.56.11
 network 192.168.56.0
 netmask 255.255.255.0
-----

設定し終えたら、
$ sudo /etc/init.d/networking restart
するか、
$ sudo shutdown -r now
で再起動。

$ ifconfig -a
で、NICの状態を確認可能。GUIで設定されているMACアドレスと対応がとれてるか確認しておしまい。

ハマるポイント

もし、host-only networkを使いたいときに、gatewayを書いてしまうとうまく動かない可能性がubuntu debianでは非常に多い。CentOSは大丈夫らしい。
また、後述のIPアドレスの範囲もhost-only networkを含む場合は要注意。

Host-only networkが動かないとき

Kaspersky Internet Securityが動いている時も動かない。
この手順をやってからVirtualboxを再インストールするとうまくいった。

OpenVswitchにポートを設定

openvswitchにポートなどを設定する。
/etc/network/interfacesにも設定値を書いておく。
ただし、設定値が反映されないので、ポートの追加は別途行う。IPアドレスは振ってしまうとわけがわからなくなる上、動作しなくなる。

@advexp_vnet_sw
----
(追記)
allow-ovs br0
iface br0 inet manual
ovs_type OVSBridge
ovs_ports eth1 eth2 eth3

allow-br0 eth1
iface eth1 inet manual
ovs_bridge br0
ovd_type OVSPort

allow-br0 eth2
iface eth2 inet manual
ovs_bridge br0
ovd_type OVSPort

allow-br0 eth3
iface eth3 inet manual
ovs_bridge br0
ovd_type OVSPort
----
これは、Virtualboxで設定したNIC14に、eth0eth3という名前が振られているから。
基本的にLinuxのネットワークは0 origin記述。

追記後、networkingを再起動。
再起動して、(マシン自体の方が望ましい)
$ sudo ovs-vsctl show
したときに、eth1-eth3までが見えない場合はうまく動かないので、
$ sudo ovs-vsctl add-port br0 eth1
$ sudo ovs-vsctl add-port br0 eth2
$ sudo ovs-vsctl add-port br0 eth3
して、再度確認を行う。
$ sudo ovs-vsctl show
すると、追加されたポートとブリッジが見れる。
controllerのところにis_connectedとあれば接続ができている。

また、
$ sudo ovs-ofctl show br0
とするとそれぞれのNICの稼働状況が見れる。
DOWN_LINKは動いていないので、
$ sudo ifup ethx
などして起こす。
(なお、/etc/network/interfacesbr0のポートについての記述がある場合は、sudo ifup br0としてもリンクアップできる)

 tremaは推奨ポートではなくTCP:6653で動作するので、それについて設定を追加。
$ sudo ovs-vsctl set-controller br0

:127.0.0.1:6653
ちなみに、tremaが起動してopenvswitchとの疎通がとれているかどうかは、sudo ovs-vsctl showでコントローラーの設定値としてis_connectedが出ればOK。少々反映に時間がかかる。30秒くらい。
$ trema run xxxxxx.rb
ただし、tremaでコンソールが一つつぶれるので、SSHなどをしてバックで動かせるように工夫するべき。
リアルタイムログがとれるので、末尾に&で別起動するのはあまり得策ではない。

 tremaを起動して、別端末にて、
$ sudo ovs-ofctl show br0
を実行すると、フローエントリの一覧が見える。


自動化したほうがいいけどやってないこと

NICの自動起動
UbuntuなどのDebianの場合は、結構NICの自動起動に失敗するとのこと。
このことから、基本動作前にNICifupしなければならない手間があるので、省けるなら省くべき。
海外では、/etc/network/interfacesの中身を読み込んでNICをひたすらifupするだけのスクリプトがあるらしい。

ハマるポイント

Host-only adapterを持つネットワークで設定できるIPの範囲
192.168.56.1host-only adapterなら、192.168.56.2~99までが無難。それ以上だと、サブネットマスクに収まっていても危ない。
また、スイッチのポートとなるNICIPアドレスを絶対に振らないこと。

下はPORT_DOWNしている構成。この状態では動かないので、eth0-eth3まで sudo ifup ethxしないといけない。
/etc/network/interfaceに何か書けばなんとかなるらしい?)


ちなみに

Controllerconnectedすると、設定されているflow-tableはすべてリセット。disconnectしただけではリセットされない模様。

OpenVswitchがなんかおかしいなと思ったら

/var/log/openvswichの中身を眺める
/var/run/openvswitchの中身のpidkillしまくってから、
$ /etc/init.d/openvswitch-switch stop
$ /etc/init.d/openvsiwtch-switch start

これで解決しなければ、明らかにシステムおかしいのでOSから入れ直した方が話が早い。

2015年2月17日火曜日

夢の国の技術考察:「立体視」、結局どうなってんの?(1)

こんばんは。大学のレポートも落ち着き、ようやく春休みがやってきました。
ブログ始めた当初から「(覚え書き程度でも)書かないとなー」と思ってたネタをそろそろ。
まあ、ディズニーネタですね。これをちゃんと調べたのは2年前くらいになりますが、思い出しながら、もう一度まとめておきたいと思います。(主に自分のために)

(夢壊す要素を取り扱います。苦手な人は引き返して。)

 

東京ディズニーリゾートには、「ミッキーのフィルハーマジック」や、「マジックランプシアター」、過去には「ミクロアドベンチャー」、「キャプテンEO」などといったように、3D映画を映画館でよく見られるようになる前に3Dシアタータイプのアトラクションを運営していた経歴があります。

BtrxgcJCMAA01A6

最近では、ライドに3D映像を組み合わせたトイストーリー・マニア!や「スターツアーズ:ザ・アドベンチャーズ・コンティニュー」もスタートしました。

BtrXq0tCUAA4qes DSC_0642

とにかく、ディズニーと3D(立体視)はわりと切っても切れない関係にあります。ところで、立体視って結局どうやってやってるかご存じですか?
今回は立体視の手法に焦点を当てて、適当にメモしていきます。

立体視の原理?(ほぼおさらい)

立体視に用いられる手法は様々なものがありますが、基本的に原理はすべて同じです。人間の目は、網膜に映る像を認識するようになっていますが、2つの目でもってようやく3次元の物体を認知することが出来ます。
これはホイートストンのステレオスコープによって実証されていますね。
(実際の生活上には、それは立体であるという認識がすでにあるために、片目を閉じていてもモノが立体物であることを認知できるようです。立体視に使われるスクリーンは平面ですから、意識による奥行き感はないことになります。)

で、2つの目は物理的に数cm離れていますから、図(適当でごめんなさい)のように、網膜に現れる像に差が出ます。これを両眼視差といいます。
両眼視差が奥行き感を作り出している正体です。つまり、両眼視差どうこうの計算はともかく、手法的には、右目と左目で別の像を見せられればOKというわけです。
とりあえずはこんな感じで。今回は手法に焦点を当てるので、原理は別の像を見せられればいいということだけ覚えておいてくれればOKです。

image

手法にはどんなのがあるの?

今現在、映画館やディズニーリゾートなどで使われている立体視の手法には次のようなものがあります。

アナグリフ方式

一昔前の俗に言う「赤青メガネ」を用いるタイプです。ディスプレイにも、プロジェクターにも使えます。
欠点は、恐ろしく目がちかちかすることと、色がRとBの1色ずつしか各目に出ないので、色の表現が恐ろしく苦手です。
利点は、メガネが色つきプラ板だけでなんとかなるので、超安価だということ。
今では殆ど見なくなりました。

液晶シャッター方式

液晶を用いたメガネを使って、リアルタイムで通信を行うことで立体視させる方式です。XpanDやnvidia 3D visionなど。液晶・プロジェクターを問いません。
利点は、色情報が抜け落ちないので、きれいなままで映像がみれること。また、メガネの透明度が高めなので、基本的にシルバースクリーン(後述)が必要ない点。
また、方式の特性上、どうしてもちらつきやすいという欠点と、メガネに電池が必要だったり、赤外線通信用のエミッタが必要などの欠点があります。
あと、プロジェクタもかなり高速なフレームレートに耐えられるような、高価なものでなければなりません。その代わり、プロジェクタの台数は1台でOKです。

偏光方式

偏光の方向によって更に分類があります。TOHOシネマズのRealD方式(円偏光)や、IMAX 3D方式(直線偏光)などなど。
ある一定方向の波のみ通し、それ以外はシャットアウトする偏光板を用いる方式です。シアター系ではこれが主流です。なお、液晶では使えません。
利点は、メガネが偏光フィルタを用いるだけでつくれるので、比較的安価です。
欠点は、ゴーストと呼ばれる上手く焦点が合わないときに発生する残像が出やすいことです。そのため、映像に下処理をしておく必要があります。
さらに、シルバースクリーン(銀粉を均一に塗布したスクリーン)を用意する必要があります。これは、偏光フィルターを通したときに輝度が落ちるためです。ただし、このシルバースクリーン、通常のスクリーンの数十倍の値段がするそうで。あと、プロジェクターもL・R用に2台必要です。
(これは直線偏光の場合のみですが、頭が動くと立体視効果が薄れやすいようです)

☆ディズニーリゾートでは、「ミッキーのフィルハーマジック」や、「マジックランプシアター」、「トイストーリー・マニア!」「ミクロアドベンチャー|キャプテンEO」(この2つはそもそも同じ建物)で採用されています。

分光方式

特殊なフィルター(フィルターホイール)を用いて色の波長を分解し、分光メガネを用いて左右に別々の像を送ります。こちらも液晶だと使えません。
色の表現がものすごくきれいですが、メガネとフィルターホイールがめちゃくちゃ高いです。しかし、プロジェクタが1台で済むなどの利点もあります。
この方式であれば、シルバースクリーンを用意するのも、赤外線エミッタも不要です。ただフィルターホイールを取り付けて、メガネを用意するだけでOKです。
☆ディズニーリゾートでは、「スターツアーズ:ザ・アドベンチャーズ・コンティニュー」で採用されています。

視差バリア方式

眼鏡がいらない、液晶TVなどに搭載されています。3DSや液晶TVなど。
あんまり詳しくないので書けない…

 

ぶっちゃけライド系のアトラクションについてではないので、ディズニーの技術っぽくないですが、(2)ではそれぞれの仕組みについてもーちょい書きたいと思います。
(続く)

References

原理端折りまくったので、この辺で補完していただければ。

http://www.kitakyu-u.ac.jp/env/_static/page/env/images/_p17-18.164ad101d6477f0956edc8e6d108389e.pdf
http://kagaku-jiten.com/cognitive-psychology/perception/depth.html

2014年12月23日火曜日

チーム開発とかでSlackを使うといろいろと捗る話

こんばんは。毎日更新してますが、暇って訳じゃないです。

最近は、Slackを使っていろいろとやっています。
Slackは、(ある程度は無料で使える)企業向けのチャットツールです。

Slackの特にすごいところは、「他のツールと連携(Integration)できるところ」ですね。これほんとすごい。
RedmineやBitbucketなど、わりと様々な開発で必要なツールが連携できます。

こういうツールには、AtlassianのHipChatとかもあるんですが、HipChatはチャネルごとに通知設定ができなかったりとわりと不便なところが多い。
最近HipChatは基本料無料化されましたけど、デザインがダサいちょっと受け付けない感じだったので(昔のIRCを想像してもらえるといいと思います)、Slackを導入するに至りました。

僕自身は、大学入ってからというもの、高校の友達数人とCakePHPで開発してみたりしているのですが、そのときにチャットツールにLINEを使用してました。
LINEはやっぱり既読でどれくらい読んでもらえたのかがわかるのがとてもいいところなんですが、如何せん過去ログが追いにくい(最近検索機能とかついたみたいです)、PCとの連携もなんか1台ずつで面倒、さらにはモバイルデバイスは1台のみという明らかに使い勝手が悪い感じで、どうにかならんかなーといった感じでした。
Skypeのボイスチャットも同時に稼働してましたが、やっぱりグループを作るのが面倒って感じでした。

あと、Bitbucketの課題ツールの運用が、ちょっと前に失敗してしまったのです。理由は「見ない」。遠隔地で開発をやってるからこそ起こりそうな問題に直面してました。

そこで、課題ツールの通知もみれたらいいねーという話になって、とても強いIntegrationを持つSlackを導入したわけですね。

Slackですが、残念なことにIntegrationを無料では5つまでしか利用できません。残念。
あと、メインで使い始めたCodebreakなんていう弱小あまり話を聞かないサービスのIntegrationなどあるわけがなく…と思っていたら、Slackの公式で紹介されていた「Hammock」なるツールがあるとのこと。こいつは、一言でいうとオレオレIntegrationを作るためのツールです。なんとピュアなPHPとSmartyという最近はあまり聞かなくなった構成で動きます。

Hammockのプラグインを書くことで、簡単にSlackのIntegrationを作ることができます。あと、こいつはIntegration上限には含まれないので、Integrationの数をけちれます。Webhook飛ばしてくるのはこいつにまとめてしまえばかなり便利です。SlackのAPIのブリッジになっているだけなので、Slackに実装されている「Incoming Webhook」を自前で実装することができます。

スクリーンショット_122314_092638_PM

まあ、実際にSlackではこんな感じでHookされてきた情報が表示されるわけです。大変便利。

Slackの導入方法とかは、検索すれば山ほど出てきますが、チームメンバーがわかんない!って言ったので、ちょっとマニュアルを作ったのです。今度公開しようと思います。
HammockプラグインでCodebreak Integrationを書いた話も今度。

OpenShiftでRedmineを設置して、Bitbucket連携を完璧にキメるまでの話

こんばんは。OpenShift楽しくて、ドはまりしています。
さて、先日Redmineを2.6にして、インストールしましたが、次のような問題があります。

  1. プラグインのGemfileが自動読み込みされなくなった
  2. GitにOpenShiftからのSSHができなくて困る
  3. Redmine_Bitbucketを入れたときに、デプロイするごとにリポジトリがすっ飛ぶ
とりあえず、これらの問題を解決しないと、残念な結果になること間違いなしです。
設定にはそこそこの時間と工夫を要したので、メモしておくことにします。

1.プラグインのGemfileが自動読み込みされない

OpenShiftでは、デプロイ時にはGemfile.lockを参照するようになっています。というわけで、Gemfile.lockを自動で変更させていきたいのですが、なかなかそうは行かない。
前回は、応急処置的に、Gemfile.lock.ruby-1.9をbundle install --no-deploymentで作成したGemfile.lockの内容に書き換えればいいとかいいましたが、やはりオリジナルからGemfileをもって気やすいようにしたいところです。
ここは考えて、.openshift/action_hooks/pre_buildをいじって対応します。

===.openshift/action_hooks/pre_build===
pushd "$OPENSHIFT_REPO_DIR" > /dev/null
#[ ! -f Gemfile.lock ] && cp -f "Gemfile.lock.ruby-$OPENSHIFT_RUBY_VERSION" Gemfile.lock
cp config/database.yml-$OPENSHIFT_RUBY_VERSION config/database.yml
popd > /dev/null
======

まあ、cpでrubyバージョンごとのGemfile.lockを作らないようにしてるんですな。んじゃあデプロイするには、この状態でどうするかというと、
  1. Rubyプラグインぶち込む
  2. rm ./Gemfile.lock
  3. bundle install --no-deploymentでGemfile.lockを作る
  4. 作られたGemfile.lockをGitリポジトリにぶち込む
これで、プラグインのGemfileが取得できて、Gemfile.lockに反映されるはず。あんまり頭のいい方法じゃないね。
注意点は、Gemfile.lockがgitgnoreで例外化されている場合があること。これはもうgitgnoreいじるしかない。

2.GitのOpenShiftからのSSHができなくて困る。

ここをみてわかったのですが、どうやらOpenShiftには秘密鍵のアクセス権がなかったりで、どうもGitに向いてない模様。
しょうがないので、Git-syncの時にも使った、GIT_SSH環境変数に再度ご活躍いただきます。やってることは前回と同じ、SSHコマンドをラップしてあげるだけです。
しかし、配置場所は、{$OPENSHIFT_DATA_DIR}にしなければなりません。それ以外のフォルダに関しては、デプロイですべて消し飛ぶ可能性があるので、使用しないことを推奨されています。


次のファイルは、{$OPENSHIFT_DATA_DIR}に配置する必要があります。リポジトリに放り込んでも意味がありません。(もちろん秘密鍵、公開鍵はssh-keygenで発行させます)
  • {$OPENSHIFT_DATA_DIR}ssh/git-ssh.sh (モード700で)
  • {$OPENSHIFT_DATA_DIR}ssh/id_rsa
  • ({$OPENSHIFT_DATA_DIR}ssh/id_rsa.pub)
これで、SSH-GITを使う準備はOKなのですが、hookしたときに、リポジトリが取り出せなくて詰みます。理由は、Redmine側に、GIT_SSHのコマンドを使うための用意がないからです。というわけで、「Redmine Bitbucket Plugin」に追記します。(こんなことしなくても、configuration.ymlのscm_git_commandを設定すればいいだけという。あとは、bash_profileにaliasでもいいみたいだけど、個人的に同名コマンドにaliasを張るつもりないからなあ)

===plugins/redmine_bitbucket/lib/bitbucket_rb.git===
class BitbucketGit < SystemCommand

  #GIT_BIN = Redmine::Configuration['scm_git_command'] || "git"
  GIT_BIN = "GIT_SSH="+ENV["OPENSHIFT_DATA_DIR"]+"ssh/git-ssh.sh git"

  def self.scm_class
    Repository::Git
  end
======

まあ追記して、Git-sshを実行できるようにしたわけです。とりあえず、GitへSSHはこんな感じで実装します。

3.Redmine_Bitbucketを入れたときに、デプロイするごとにリポジトリがすっ飛ぶ

Redmine Bitbucketのリポジトリは、APPROOTの直下にフォルダが作成されて、そこにmirrorするようになっているようですが、Openshiftでは例外なく吹っ飛ぶので、設定が必要です。
ポピュラーな設定として、Symbolic linkがあるので、とりあえずそれで利用します。
まずは、bitbucket_reposというフォルダを作っておいておくことを言い忘れておりました。
作ってから作業スタートです。

===.openshift/action_hooks/post_deploy===
...
ln -sf ${OPENSHIFT_DATA_DIR}files ${OPENSHIFT_REPO_DIR}files
ln -sf ${OPENSHIFT_DATA_DIR}bitbucket_repos ${OPENSHIFT_REPO_DIR}bitbucket_repos
======

こんな感じで、bitbucket_reposにシンボリックリンクを張っておくと吹き飛ばなくてすみます。
あと、どうやらこのプラグイン、pushされたタイミングじゃないと読み込みがされないようで。厳しいのう。なんで、作られてなくてもとりあえず落ちつてDeployすればいいってことですね。${OPENSHIFT_DATA_DIR}filesフォルダがないなら、ちゃんと作っておきます。

おまけ:/bin/bash^M

改行コードエラーだったようです。LinuxでWindowsの改行コードを使用すると、この出力とともにシェルスクリプトが反応しなくなります。要注意。

総括

やっぱり、いろいろなことしないと正常に動かない印象。スマートな方法が欲しいなあ。

2014年12月22日月曜日

Gitのリモートリポジトリ間で単方向の同期をとる

こんばんは。最近はブログ書きまくってますね。いい調子。

さて、最近はクラウド型のCIツール(Werckerとか、Shippableとか)が何かと流行ってますが、使おうと思ったときにBitbucketやGithubを強制されるんですよね。プライベートな開発で、Bitbucketのコラボレーション制限とかが邪魔をして、ちょっと人数のいる開発とかをやろうとすると、CIツールが使えないという大変残念な結果に。

しょうがないので、他のGitホスティング(あまり評判よくないけどCodebreakとか)と、Bitbucketを同期をとって、CIツールでデプロイするときはBitbucketを参照し、自分たちがプッシュする先はCodebreakにするってことをやってみました。

まあ、とりあえず方法としては、CodebreakにもあるWebhookを利用して、プッシュされたら外部サーバーにHookして、Bitbucketと連携させるスクリプトを書いてみることにしました。

Web言語は何にしようかなーと思ったりとかはしたんですが、サーバーであっさり動くし慣れ親しんでるのでPHPで動かすことにして、シェルスクリプトをたたくだけにしてみました。

肝心のGitとの同期ですが、--mirrorオプションを使ってサクッとクローンして、--mirrorなbareとして動作させています。その方が楽だしね。

あと、スクリプトを置く場所で、SSH秘密鍵を共有したくなかったので、GIT_SSH環境変数を使って、sshコマンドをラップして、任意の秘密鍵を用いるようにしました。秘密鍵の生成はssh-keygenで場所を指定して生成すれば全然問題になりません。

毎度毎度コマンドがりがりのくせに、今回ばかりは成果物ができたので、成果物をGithubに放り込んでみました。もしよければ使ってやってください。あまり検証してないので、セキュリティ的にヤバイかも?
https://github.com/litols0816/git-sync