macのVMの仮想ディスクの場所を変えられるようになるようです。cloneすると他のブランチの情報とかも管理ディレクトリに持ってきている状態なのでディスク容量も食うし、cloneする時間もかかる。cloneするのが良い。[リポジトリ]こうすると、ブランチの最新のリビジョンだけを持ってきてくれる。Exceeded」と言われる事が多くなり、定期的にワーカーの再起動をしたいと思ってました。見る限り、swapも出てしまい、レスポンスも遅くなっているようです。このような場合、heroku以外だと、unicornを使うので、unicorn_worker_killerを入れるのですがherokuだとpuma推薦なのでpuma使っていました。killer系の物があるのかな?と探してたところpuma_worker_killerがあるようなので、使ってみました。Restarts」というのを使うのが推薦のようなのでその設定で行ってみました。hoursendデフォルトだと6時間ごとに再起動ということになるので、ひとまず様子見で3時間に設定してみます。以下が、3時間でリスタートがかかるようにした設定になります。PumaWorkerKiller.enable_rolling_restartendこちらを設定したところピーク時は少しswapが出る時もあるものの、割と落ち着いたのかなと思います。この状態で様子見をし、アラートがまた増えるような感じであれば再度調整という事にしようと思います。bataがリリースされ、早速インストールしてみました。アプリケーションディレクトリに入れて、このアイコンをダブルクリックするだけでDockerの環境が自動的に構築されるようです。メニューバーにはDockerのアイコンが表示されるようになります。ToolboxでDockerを使っていた場合、この初回の起動時に既存環境を新しい環境で使えるように変換が行われます。(yesにした場合)今回は、全く新しい環境にインストールをしているので変換も何もなく、すぐにインストールが終わりました。変換した場合には、既存環境に応じて、それなりのディスク消費があるのでディスクの空きが少ない場合は要注意です。Dockerの環境としては、まだこれから試してみる事はたくさんありそうですがここで出てきた問題が、タイトルの通りpowと相性が悪そう、という点です。powは、Rackサーバで、ローカルでバーチャルホストを提供します。test-appというプロジェクトであれば、http://test-app.devでアクセスができるようになりますがtest-app.devは127.0.0.1になるので、localhostです。Macもポートを80番で指定してコンテナを起動したりするとhttp://localhost/でアクセスができるようになります。toolboxとは違いMac上でネイティブにハイパーバイザーを使って環境を構築しているようです。標準の設定のままだと、これらが衝突し、Dockerのコンテナにアクセスできない、といった状況が発生します。自分でもこのあたりが今出来る設定で回避可能なのかどうかは、調査中ではありますが覚書として書いてみました。watchの機能をフルに使ったデプロイになります。watchで起動されるデプロイツールがstretcherになります。s3://example/manifest.ymlクラスタリスタートさせる場合/etc/consul.d/web.confに定義出来るnameservicetagsの設定で頑張る事でなんとかなりそう。s3://example/manifest-prerelease.ymlとして手で叩くでも良い。prereleaseとすると、サーバ1だけにイベントが飛びます。productionとすると、サーバ1とサーバ2にイベントが飛びます。stagingとすると、サーバ3だけにイベントが飛びます。reloadすれば、設定が更新されます。s3://example/manifest-prerelease.ymlとすれば、1台だけリリース可能。全台デプロイを検知する仕組みとしてconsulの持つKey/Valueの仕組みを利用すると実現可能。http://localhost:8500/v1/kv/deployFailureをしておく。http://localhost:8500/v1/kv/deployFailure/{`hostname`}としておく。http://localhost:8500/v1/kv/deploy/?keysを監視。http://localhost:8500/v1/kv/deployFailure/?keysを取得しエラーがないことをチェックしてデプロイフローの完了となる。感想という事で、イベントを送る先をtagsで良い感じに制御出来ればconsulとstretcherによるデプロイは良さそうな気がします。全台デプロイ完了の検知は、consulのイベントとかステータスとかだけでやりたかった。引き続き良い方法があれば調べたい。manifest.ymlはデプロイスクリプト(capistrano?)で自動で更新されるようにしたいため、ここにhook処理が羅列されるのは嬉しくない。ソースを固めてs3に上げてmanifest.ymlを作るという部分はまだ考慮しきれていない。各サーバでserviceにcheckという設定(このページではconsulの基本的な設定のweb.json)を付けると、指定したチェックが通るまではserviceとしては追加されないのでロードバランサにぶら下げるときにもconsulのヘルスチェックを見てゴニョゴニョ出来たらいいのかと思ったりしました。gitにExcelファイルあげちゃった。gitにExcelファイルあげちゃった。エンジニア以外にもgithubを使い出しているところが増えつつありますが、このような要望が少なくありません。エンジニアとしては、それはExcelがちょっと・・・という感じかもしれませんが非エンジニアとしてはExcelが自分の仕事の表現手段、というかやはり操作感は他のツールとは別格かと思います。そこにエンジニア目線で別のツールを押しつけるのもどうかと思ったりもします。※別のツールを提供した方が効率が上がるケースももちろんあるので、その場合は提供した方が良いです。いうことで、Excelファイルをgitにあげて管理したい、しかも差分も見たいと言った場合gitの設定を少しいじると雑ですが差分が出るようにはなります。PATH=$PATH:~/git-xlsx-textconv/bin"~/.gitconfigを開きます。cloneしたリポジトリの直下に.gitattributeファイルを作成します。diff=xlsxを追記します。これでxlsxの結果が比較できるようになりました。Editorで、プロジェクト内のファイルが多すぎてキーワード検索をかけると結果が多すぎて、そこからさらに検索かけたくなったりします。このディレクトリ内だけ検索したい、なんて感じで条件が指定出来れば随分絞り込めると思います。Project普段、検索する時はこんな感じで検索画面が開くと思います。この3段目、検索する場所を絞る設定になっています。lib配下だけを検索したい場合にはここにlib1libと入れれば良い訳です。複数の場所から検索したい場合はlib,app,public1lib,app,publicとすれば、libとappとpublicのディレクトリから検索出来ます。publicの下に無駄に大きいassetsのautocompile結果が同時に格納されていたとしてその下は検索したくない、なんていう時はlib,app,public,!public/assets1lib,app,public,!public/assetsとすれば、public/assets配下は無視されるようになります。応用で、gitでsubmoduleを多用している場合、.git配下も検索対象になってしまいますが!.git1!.gitとしておくだけで、.git配下は無視するようになります。*という感じでしょうか。Dockerを使っていく上で避けて通れないChef,ansibleとの付き合い方こんにちは。最近はローカルの開発環境も、ほとんどDockerに移行した感じです。そこで、本番も見据えたDockerという事で気になることの一つ構成管理ツールchef、ansibleなどなどとの兼ね合い、どうするかな?と言ったところ考えてみようと思います。Dockerはコンテナ作成・管理ツールという性質上、コンテナ内部のパッケージやアプリの配備などをDockerfileで行う仕組みになっています。いうことは、端的に言ってしまうとchef、ansibleなどがなくてもコンテナを作れてしまいます。Dockerで作ったコンテナに対してchefを流して環境を作る、とか意味がありません。Dockerfileの中でChefを呼ぶのはありか?という所ですが個人的にはこれもあまり嬉しくないなと思います。Dockerfileを見るだけで、そのコンテナがどんな環境になるのか、というのが一発でわかるようにしたいです。構成管理ではないですが、Dockerでシェル叩いていたり、起動する単一プロセスに構成設定のシェルを指定しているDockerfileが割と多かったりしますが、これも実際何しているのか?というのをシェル見ないと分からなくなってしまうので避けるようにしています。使わないのか?と言われると、NOでDockerをそもそも動かすホストマシン側の構成管理についてはChef、ansibleが使える物と思っています。swarmあたりのインストールを自動化しとくのが良いと思います。することで、ホストマシンが自前だろうがAWSだろうがIDCFだろうがさくらだろうがさらにOSがUbuntuでもCentOSでも、ホストマシンを自動で構築することも可能になってきます。engineさえ入っていればコンテナが動くわけです。docker-machineを使う場合、docker-machineが対応しているクラウドサービスの場合は構成管理しなくても良い位手軽に起動する事が出来たりします。これは、docker-machineのcreateで作成されるホストには、docker-machineが自動で上記のモジュール類を入れて環境設定してしまうためです。Dockerを本気で使っている方々には当然の内容ではありますが、以上、一つの考え方として参考にしていただけたらと思います。ベンチャー・中小企業における開発チームのあり方どうも、GENDOSUです。今回は今までの経験から、少しだけベンチャー・中小企業における開発チームについて思った事などを書きます。開発メンバーは他のメンバーを信頼することが必要まず「短期間で動くものを作る必要がある」については、ベンチャーに限らずサービスを作っていく上で、競合よりも遅れてリリーする事は、その分野での先行優位性を失う事にほかならない。「リーダー(CEO)の想像するものを理解・共感し、形に出来る必要がある」これはメンバーがそれぞれCEOの考える未来を理解・共感できていなければ、少しの認識のずれから思いがけない意志の断絶が起きる可能性がある。差し迫った締め切りを守れるかどうかという時には体力(気力)が重要になってくる。「開発メンバーは他のメンバーを信頼することが必要」ベンチャーは小規模から始める事が多く、その少ないメンバーの中で信頼できないメンバーがいる事はチーム崩壊を招く恐れがある。メンバーとしては優秀であるが、人を信頼できないメンバーも同様のリスクがある。すべての業務を自分が把握しなければいけないと思っている(各メンバーが皆そうであることが理想ではある)人が他のメンバーを信頼できないことにより、タスクを抱え込んでしまい業務が集中し潰れてしまう事があるためだ。信頼されないという事で他のメンバーのモチベーションが下がるという事も起こり得る。これらはベンチャーの開発チームを立ち上げ・維持する上で重要な事柄であり、採用時には採用側・応募者側のそれぞれがお互いを見定めなければいけない。採用側の視点で見ると、他のメンバーと技術レベルが近いか、その会社の雰囲気に合うか、人として問題ないか、プロダクトに共感しているか、将来像が想像できるか、などに比重を置く。対して、応募者側としては、この会社のプロダクトに共感でき、10年後20年後まで自分が働いていけそうか(倒産するかしないか?という意味ではなく)、面接官だけではなくて、出来るだけ一緒に働く事になるメンバーとの接点を設けてもらう。その上でチームに馴染めそうかを確認する。出来たら、数日実際の作業をしてもらいつつお互いが納得した上で採用が決まる事が望ましい。いう事を個人的意見として述べてみました。はまった(いや、かなり)Mithril.jsを始めてみて、早速というか、すごく初歩的な事かもしれないけどバーチャルDOMという事での罠にはまりました。バーチャルDOMはバーチャルな訳ですよ。バーチャルということは、実際にリアルにはそこに無いわけで何を言っているかわからないと思うがもう少し具体例を出すとMithril.jsで動的にul・liのリスト構造を表示させる。このul・liの各アイテムは、ドラッグ&ドロップ出来るようにする。ドラッグ&ドロップは、sortable.jsという感じの別のjsライブラリを使う。$('#sortedList').sortable({});といった感じでリストを出力したいと思います。このリストをドラッグ&ドロップにしたいときに、最初は上記のようにm.mountの行の下に置いてみました。この場合、たまに動くけど、たまに動かないといった微妙な挙動になり、結構悩みました。考えたら、m.mountをした時点でバーチャルがギリギリリアルになっていないのではないか?という事でした。これはビンゴで、実際どのように解決したのかというとmというメソッドの第2パラメータにconfigアトリビュートを追加します。configというのは、リアルDOMの描画が終わった後に処理をさせたい内容を定義できる特殊なアトリビュートという事のようです。MyComponent);先ほどのコードを、このような形に修正することで、$(‘#sortedList’)が実際に描画された後に、sortableLoadというメソッドが呼び出されるようになります。https://lhorie.github.io/mithril/今回、社内で使う管理画面の一部に、動的な制御入れたいな~という要望がありその要望に対して自前で作るとデータの流れとかを考えたときにかなりややこしくなりそうだなと思いそれならクライアントサイドのjavascriptフレームワークを使おう、という事でReact.jsとMithril.jsで比較検討しました。比較内容としては、他のサイトでも出ていると思うので、それはググっていただくとして今回自分がMithril.jsを選んだ理由それは学習コストが低い!これにつきると思います。低いのか?というと覚えるメソッドがこれだけです。MyComponent)これだけで、bodyに動的にレンダリングしてくれます。m.componentの書き方とか、非同期でリクエスト取りに行ったりするであるとか書き方として覚えなければいけない部分はありますが、それでも他のフレームワークと比べて簡単に導入できました。次回以降、使ってみた感想というか、はまった場所、解決方法etcなどを順次上げていけたらと思います。composeを使う)dockerを開発環境で使うに当たって前回「gendosu流、dockerの使い方」という内容を書きました。run(start)をして起動していかないといけないです。コンテナ間にリンクを張っている場合は起動順序も考慮する必要があります。そこで、今回はDocker-composeを使ってみたいと思います。こちらのツールはDockerのオフィシャルで配布されているツールになります。簡単に言うと、複数コンテナの情報を1ファイルに集約して、そのファイルを元に1コマンドで全コンテナを起動できるようにするツールという事になると思います。composeのインストールはhttps://docs.docker.com/compose/install/をみて作業を進めます。/usr/local/bin/docker-composeこれでdocker-composeというコマンドが入りました。docker-composeを使うにはコマンドを実行するディレクトリ配下にdocker-compose.ymlというファイルを作成します。※ディレクトリ構成example/Dockerfilesupervisor/sshd.confdocker-compose.yml12345example/Dockerfilesupervisor/sshd.confdocker-compose.yml今回は前回の構成webとmysqlという2つのコンテナを起動するような構成でファイルを作ってみたいと思います。Dockerfile(supervisordのディレクトリも)は前回の物を流用します。|chpasswdEXPOSEとCMDは、次のdocker-compose.ymlで設定するので、ここでは設定してません。"3306"これで設定ファイルの準備が完了しました。起動はdocker-composeにオプションを指定して実行します。docker-composeのオプションで、代表的な物はupコンテナをイメージから作り直して起動するstopすでに起動しているコンテナを終了するstart停止しているコンテナを起動させるあたりかと思います。upupというオプションを指定して起動させました。Dockerfileのビルドが走った後に各イメージからコンテナが生成されて起動された事が確認できると思います。(startsecs)あとは、前回同様、ポート2200を指定してsshすることでwebコンテナへログインする事が出来ます。以前よりローカルでの仮想環境の生成・破棄は容易になったような気がしますがVagrantでは、インスタンスの生成、破棄のコストが高い気がするのでそこのところをDockerを使ってやってみるようにしてみました。64bitの仮想マシンを立ち上げます。これは、VagrantでもVMwareでも問題ないです。今後、頻繁にアクセスすることになるので、vmのIPをhostsに登録してしまいます。local-vmとして登録しちゃいます。root@local-vmという感じでログインできるようになりました。ここから、dockerのセットアップをします。/etc/bash_completion.d/docker.ioとやってインストールします。これで、入ったので、dockerにコンテナを作ってみます。普通にやるとコンテナ内へのアクセスが面倒なので各コンテナ内にsshを起動してしまいます。これで、ポート指定で外部からssh接続できるコンテナになります。やり方ですがDockerfileを作ってイメージを作成するようにします。[&quot;/usr/bin/supervisord&quot;]というファイルを作成します。同じ階層にsupervisord/ssh.confを作成します。buildでイメージにします。.これで、sshdが起動するdockerコンテナのイメージが作成されました。このイメージを元に、「run-ubuntu-ssh」という名前でコンテナを起動します。my/ubuntu-ssh:latestこれで、2200番のポートを指定してssh接続が出来るようになりました。各コンテナでsshが起動するのは無駄な気がしますがアクセスが容易になる分、開発環境では便利になるのではないでしょうか。sshdは起動しましたが、たいていの場合MySQLとかも同時に入れたりしたくなったりします。MySQLの場合は、別のコンテナでMySQLだけが入ったものを用意します。これは、Docker.ioのdockerhubから持ってきます。https://registry.hub.docker.com/この中に、MySQLというリンクがあるので、ここを開いて、手順通りにやるとMySQLの入ったコンテナが起動できます。runに、別のコンテナへのリンクを追加するというオプションがあります。今回はそのオプションを追加します。rmでコンテナを破棄します。my/ubuntu-ssh:latestmysqlという名のコンテナに対してリンクを張っています。run-ubuntu-sshコンテナの内部からは、mysqlという名前でmysqlコンテナへ接続できるようになっています。-hmysqlというコマンドでMySQLへ接続できていればOKです。2200:22のところを2201:22という感じにインクリメントしていくことで、比較的容易にコンテナを管理できると思います。リリースされてました。オブジェクトのガーベージコレクトができるようになりました。オブジェクトについてのメモリ使用が削減されます。必須とされる予定です。参照してください)との事なので、今後のことを考えると、早めにRubyもバージョンをあげてしまいたいなと思ったりします。display:という表示が出てエラーになる。SSHの処理がパスワード入力ダイアログを出したいらしい。これに関連する環境変数がSSH_ASKPASSという事で、これをunsetして見ます。clone出来るかと思います。TortoiseSVN・TortoiseGitでマージツールにお悩みの場合にはP4MergeをTortoiseSVNや、TortoiseGitで、競合が発生した場合に使用するTortoiseMergeですが、あまり使い勝手が良いとはいえないです。そんなときは、P4Mergeを入れてみましょう。インストールはhttp://www.perforce.com/product/components/perforce-visual-merge-and-diff-toolsから。Toolのみを有効にして、後は無効にします。インストールが完了したら、TortoiseGitの設定をします。設定画面を開き、マージツールの項目を選択。外部を選択してから、P4Mergeのパスを設定します。これで、設定は完了です。Windowsに複数バージョンのRubyをインストールする今回の要件Windowsに複数のバージョンのRubyをインストールする。バージョンの切り替えを出来るようにする。ネイティブなgemもインストールしたい。jsonとかダウンロードということで、まずは必要なRubyのダウンロード。以下のページからインストーラをダウンロードします。http://rubyinstaller.org/downloads/※http://ruby-lang.org/からもリンクがあります。今回はシステム側に2.0.0、切り替え用として1.8.7をインストールします。ダウンロードページから2.0.0のインストーラと1.8.7のインストーラをダウンロード。KITをダウンロードします。DevKit-tdm-32-4.5.2-20111229-1559-sfx.exeDevKit-mingw64-64-4.7.2-20130224-1432-sfx.exeRuby本体をインストールまずは、2.0.0のインストーラで普通にインストールします。[インストーラ画面割愛]インストールパスはC:\Ruby200-x64とします。システム環境変数へは、C:\Ruby200-x64\binをPathに追加設定します。つづいて、1.8.7のインストーラを起動してインストールします。インストーラ画面割愛インストールパスはC:\Ruby187とします。この1.8.7の場合はシステム環境変数へはパスを追加しないようにしてインストールします。これで二つのバージョンをインストールしました。これを切り替えるためのツールをインストールします。切り替えるにはpikというツールを使います。Linuxな環境とかだと、rvmのようなイメージです。pikは以下のページよりダウンロードします。https://github.com/vertiginous/pik/downloads今回はインストーラ形式のものをダウンロードします。インストールパスはC:\pikと指定します。path.にチェックを入れておきます。インストールが完了すると、プロンプト画面でpikコマンドが使えるようになります。pikコマンドでは、rvmと同様、インストール出来るRubyのバージョンが一覧表示できます。-r今回はすでに2.0.0と1.8.7をインストールしてあるので、これをpikのconfig.ymlに登録します。C:\Ruby187\binpikの設定はc:\Users/hoge/.pikというディレクトリに出来上がるconfig.ymlを編集します。listとかをたたくと、出来上がると思います。それでも出来上がらない場合、手で作りましょう。設定がファイルに入ったことを確認します。c:\Users/hoge/.pikというディレクトリに出来上がるconfig.ymlを確認します。{}設定をしたら、設定内容をpikからも確認してみます。listのコマンド結果で矢印の位置が1.8.7の前に来ていると思います。Rubyのバージョンを確認してみましょう。[i386-mingw32]<pre>これで切り替えられるようになったので、そのまま1.8.7の環境にdevkitを入れます。先ほどダウンロードしたdevkit(DevKit-tdm-32-4.5.2-20111229-1559-sfx.exe)をインストールします。インストールパスはC:/Ruby187とします。これで、c:\Ruby187にdevkitのファイル群が追加でインストールされます。これで切り替えられるようになったので、そのまま1.8.7の環境にdevkitを入れます。先ほどダウンロードしたdevkit(DevKit-tdm-32-4.5.2-20111229-1559-sfx.exe)をインストールします。インストールパスはC:/Ruby187とします。これで、c:\Ruby187にdevkitのファイル群が追加でインストールされます。installを実行。これで、devkitがインストール完了です。ネイティブなgemがインストール出来るか確認します。ネイティブなgemをインストールする時にエラーが出る場合、オプションに–platform=rubyという指定をつけます。試しにjsonを入れてみます。jsonこれで問題なくインストール出来ていれば、完了です。同様の作業をc:\Ruby200に対しても行います。2.0.0用のdevkitは、また別のインストーラなので、それを使ってインストールします。標準状態ではyumでgitをインストール出来ない模様。RPMforgeを使ってyumにリポジトリを追加してからgitをインストールして見ます。http://repoforge.org/use/このページを参考に、該当のrpmファイルをダウンロードします。ダウンロードしたパッケージファイルをインストールします。package-filenameyumで検索してみます。repositories見つかったので、yumでgitをインストールします。unicorn_railsこれを実行すると、~/.rvm/binにstart_unicorn_railsというファイルが出来上がるこのファイルに対してunicorn_railsに指定するパラメータを指定してやるとrvmを読み込んだ状態でunicorn_railsを実行してくれる。