anywhere-chatというものをつくってみた

MSペイントの文字入力をリアルタイムで共有できるみたいなものです。
複数ブラウザひらいてためしてみてください。
クリック→入力→エンター。
anywhere chat

とても公開できるようなものではありませんが、ソースはとりあえずgithubに置いてます。
marutanm/anywhere-chat · GitHub

原動力となったり参考になったりしたもの

ベータテストをさせていただき、ただならぬ刺激をうけました。
画面のどこかでなにかしたのがリアルタイムでどうにかなるという点が似ているかもしれません。(比べものにならないほど、及びませんが)

浜辺氏によるNodeでのチャットのサンプルなど。

構成しているもの
  • Sinatra
  • CoffeeScript
  • Puhser
  • Heroku
感想など
  • WebSocketでリアルタイム、面白い
    • でも、使いどころが思いつかない
  • ソースもっと綺麗にしないと
    • フロントエンドをどうにかする技術力がなさすぎる

実践!Pull Request対応

Ginatra というものがあります。SinatraとGritでできたGitリポジトリビューアです。Githubクローンというよりは、進化版gitwebといった感じ。
機能は良いのですが、いかんせん見た目が今一歩。これをforkして、Twitter Bootstrapを使って簡単によさげな見た目にしていたわけです。
marutanm/ginatra · GitHub
見た目のほかには、erbだったのをhaml化したりとか、ちょっとルーティング変えたりとか。
そうこうしていたらPull Requestがきたのです。なぜか本家のほうではなく、こっちに。なんとも喜ばしいですね!!
せっかくなので、Pull Requestがきたときにどう対応するか、まとめてみましょう。

Auto merging

一番かんたんなのは、 Merge Buttonを使うことですね。
f:id:marutanm:20110927203212p:image

画像の右下にあるのが、それ。これを押すとPull Requestをマージして、クローズまで自動でやってくれます。
コミットログもよきにはからってくれます。ファッキン便利ですね!!
もちろん、Pull Requestに含まれるコミットがどんな変更なのかは事前に確認しましょうね。もちろん、github上で見られます。

The Merge Button · GitHub

pull and push

上記ボタンはGithubが提供してくれる機能ですが、Git単体でリモートリポジトリのコミットを取り込む手段があります。それがgit-pullです。
Pull Requestの内容を確認、問題なければpullします。そしてpushすれば完了ですね。結果的には上記と同じことなので、せっかくgithubを使っているならMerge Buttonを使ったほうがシンプル簡単でいいですね。

fetch and merge (and push)

場合によっては、コミット内容に問題がありそうで素直にPullできないことや、手元で動作確認したいことがあります。そんなときはひとまずfetchし、その後でよろしくmergeしてやりましょう。
コマンドがよくわからなくても、問題なし。よくあるi印をおすとgithubが教えてくれます。
f:id:marutanm:20110927210847p:image

新しくブランチを切って、そこにマージ対象(Pull Requestされたもの)をpull。確認なりしたあとで、masterからmergeしてやります(そしてgithubにpush)。
こんな感じ。

# masterからdocunext-masterブランチを作成、同時にチェックアウト
$ git checkout -b new-branch master
# githubからpull
$ git pull remote/repos.git master
# masterに戻ってマージ、githubにpush
$ git checkout master
$ git merge new-branch
$ git push origin master

fetch and mergeと題しましたが、正確にはブランチをきってpullしていますね。

さて、単純にmergeしたくない場合はどうしましょう?適切にコミットが分割されていればgit-cherry-pickなりできるのですが、必ずしもそうではありません。hunk単位でmergeしたい、どうする?
とりあえずmergeしちゃいましょう、--no-commit指定で。

$ git merge --no-commit --no-ff new-branch

これで、準備完了。あとは、コミットしたくない点をunstageなり何なりしてcommitしましょう。
ちなみに、今回の場合はfast-forwardでマージできてしまうので--no-commitだけ指定だと自動的にコミットされてしまいました。そこで--no-ffも併せて指定して、マージだけをするようにしました。

さて、うまいことマージできたら普段通りにpushしましょう。githubはマージコミットを認識して自動的にPull Requestをクローズしてくれます。便利ですね!

--no-ff
    • no-ffはマージコミットを作成するかどうかの指定なのですが、普段どうするかはリポジトリの方針次第ですよね。今まではあまり気にせずgitまかせでmergeしていたのですが、トピックブランチで機能追加した場合はマージコミットを残したいですが、トピックブランチとするほどではない細かい修正なんかはfast-forwardで一本道にしたいですね、なんとなく。

fast-forwardマージが可能なときに、--no-ff指定あり/なしでマージをしてみると違いはすぐに理解できると思います。git-reset --hard HEAD^ なんかですぐにマージ前の状態に戻せますし。

まとめ

Pull Requestをもらえるとか、とても喜ばしいことですよね。ささやかな修正でもいいので、どんどんコミットを送り付けて互いに幸せになれるといいですね!!(リポジトリによっては指針があって、テスト通したりとか必要なことはもちろん予めやらなくてはなりませんけれども)
せっかくもらったPull Requestには最大限に敬意をはらいつつも、自分にいちばん都合がいいようにマージしたいですね。
gitそしてgithubという素晴らしいツールを最大限に利用し、望ましい形にコミットログを残せるよう、うまいことやりましょう。

tcommentメモ

Vimテクニックバイブル が手に入ったので、読みながらVim環境をカイゼンしていっている。
今まで、コメントアウト/アンコメントにはNERD Commenterを使っていたんだけど、tcommentというのが紹介されていたので乗り換えてみた。

:TCommentはデフォルトだとにバインドされている。US配列キーボードだと"_"はシフト押下しながら"-"なので嫌な予感がしたけど、でも動作してくれるので杞憂。(このあたりVimの内部処理どうなっているんだろう?)

その他、gccでカレント行のコメントするしないトグル、gc{motion}でモーション範囲のコメントするしないトグル。このあたりをとりあえず覚えておきたい。

あとは、使っていきつつ適宜キーバインド設定していく。

デモ動画とか
vimsomnia: The tcomment vim plugin

Vimテクニックバイブル ?作業効率をカイゼンする150の技

Vimテクニックバイブル ?作業効率をカイゼンする150の技

homebrewで入れたreadlineを使いつつruby-buildでruby入れてみた

ローカルのruby環境を管理するのにrbenvを使っているのですが、こういう場合はrvmを使ったほうが簡単です、たぶん。
rbenvは複数バージョンのrubyをすぐ切り替えられるということのみにフォーカスしてて、ruby本体をインストールするのは自前でmake等します。毎回それは面倒すぎる。そこで、ruby各バージョンのビルド内容のレシピをもっててコマンド一発でやってくれるよう、補助的に用意されているのがruby-buildなわけです。わー、ruby-build便利!

ところが、ruby-buildのREADMEのまま、なにも考えずにいれた1.9.2ではreadlineが有効になっておらず、earthquake.gemがちゃんと動いてくれませんでした。
現状、ruby-buildではconfigure時のオプションを指定できないので、お勉強も兼ねてソースを少し書き換えて動かしてみました。

手順

readline

Homebrew+RVMでreadline/iconvを使う - どっかのBlogの前置きのような
こちらを参考に、brew-linkを忘れずに。

ruby-build


以上、diff。
ruby本体のビルドのためにメソッドをわけて、configureオプションを直接書いたかんじです。

まとめ

ruby-buildにモンキーパッチをあてて、configureオプションを指定してrubyをビルドしたわけです。
問題は、これをもとにruby-build本体にどう貢献するか。
こういうIssueもありますが、そもそもruby-buildの便利なのはレシピの内容を気にしなくていいってことなんです(と思っています)。
configureオプションを指定しようとした時点で嫌が応にもそれは崩壊します。それなら、ruby-build使わずとも自分でソースからビルドすればいいわけですよ。
というわけで、はたしてconfigureオプション指定できるようになっていくのか?しばらく見守りつつ、なにか貢献できるか考えてみます。

pow-indexをrubygem化しました

旅の恥はかき捨てといいますが、エンジニアのコードは書き捨てるべきではありません。断じて。
DRYに、わかりやすく、再利用しやすい良質なものとするべきです。
そういったことを考えると、ここ最近の活動がエンジニアとしての価値を高めているのか、それとも恥を全世界に大公開し続けているのかがわかりません。

はい、公開できる品質なのか甚だ疑問ではあるのですが、gem化しました。
pow-index | RubyGems.org | your community gem host

それによって、導入が簡単になりました。

$ gem install pow-index

下記コマンドで~/.powにシンボリックリンクが作成されます。linknameは指定しなければindexとなります。

$ pow-index [linkname]

少し機能も追加して、cleanupボタンでリンク先のないシンボリックリンクをまとめて消したりできます。

ソースはこちらです。
あとは特に機能追加をするつもりはなく、せいぜい見栄えをよくしたり、最終更新日やリンク先パスの表示、それから表のソートができるようにするかもくらいですね。
前述のようにソースは汚い。主にjQueryの素人っぷりがひどい。
フィードバックなり、pull-requestなりいただけると、私の勉強になるだけではなく、gemをダウンロードしてくれた誰かも幸せになれるかもしれません。

Powにはindexが必要だと思うんです

Rackアプリをつくっては放置つくっては放置していると、ローカルにPowでアクセス可能なものが散乱していくんですよねー

そこでこれです。
marutanm/Pow-index · GitHub

f:id:marutanm:20110906121025p:image:w360

これはなに?

Powでアクセス可能なプロジェクトの一覧ページを提供してくれます。

どうやって使うの?

git-cloneしてシンボリックリンクをはりましょう。

$ git clone git://github.com/marutanm/Pow-index.git
$ ln -s Pow-index ~/.pow/index

あとは、http://index.dev にアクセス。

仕組みは?

Sinatraで~/.powにあるシンボリックリンクの一覧を取得・表示しているだけです。hamlテンプレ含めてソース25行。
Twitter Bootstrapを読み込んでみているんですが、むしろ読み込みで遅くなっているかも。

デジャヴ?

Powderをもっと便利にしようとしています - Meltdown Countdown で書いたindexサブコマンドがさっぱりマージされる気配がないので、独立してつくりました。
cleanupのほうはマージされたので、そのうち配布版のgemに含まれると思います。

todo

  • gem化

導入、管理をもっと簡単にしたい

  • README

ちゃんと書こう

Twitter Bootstrapわざわざ入れなくても

rbenvのサブコマンドを補完したい

はい、あります → rbenv/completions at master · sstephenson/rbenv · GitHub
zsh用はv0.1.2から追加されています。
homebrewでrbenvをインストールした場合、/usr/local/Cellar/rbenv/0.1.2/completions/ あたりにあるかと思います。

使い方

環境変数${fpath} に入っているディレクトリに、上記補完設定ファイルを置いてやります。
たとえばこんな感じ。

% ln -s /usr/local/Cellar/rbenv/0.1.2/completions/rbenv.zsh .zsh/functions/_rbenv

すると、こうなります

% rbenv [TAB]
commands  exec  help  init  prefix  rehash  set-default  set-local  version  version-name  version-origin  versions  whence  which

サブコマンドが出てくれるだけでもとても助かりますね。

ちなみに

homebrewの補完設定ファイルは /usr/local/Library/Contributions/brew_zsh_completion.zsh にあったりします。
homebrewでgitをいれると、補完シェルが /usr/local/etc/bash_completion.d に入ったりしてます。
願わくば、rbenvの補完設定ファイルもバージョン番号と切り離されたところに入ってほしいですね。