今こそ!git の branch を vim のステータスラインに表示!!するとき!!!

当然、ターミナルのプロンプトには表示させてますよね?zshならvcs_infoとか使えばいいですし。では、Vimはどうですか?各種git操作はVimからしないって?甘い、甘い。

git の branch を vim のステータスラインに表示 - #生存戦略 、それは - subtech
2008年3月のエントリですが、大変そうですね。でも今なら簡単です!fugitive を使えばいいんです!!

ギットギトなVimmerにはすっかりお馴染みかもしれないfugitiveです。それ自体は VimmerなGit使いはfugitive.vimを今すぐ入れたほうがいい - SELECT * FROM life;Vim-users.jp - Hack #219: Gitを使う2 – Fugitive.vim あたりが詳しいです。
:Gstatusからのstage/unstageが便利すぎますね!

%{fugitive#statusline()}

ここからが、まだ日本語では言及されてないっぽい情報。%{fugitive#statusline()}というのがあるんです。これをstatuslineに書けばいいんです。たとえばこんな感じ。

set statusline=%<%f\ %h%m%r%{fugitive#statusline()}%=%-14.(%l,%c%V%)\ %P
https://github.com/tpope/vim-fugitive/blob/a27c0fc633efcd2b294c07e09f2565df258f83e8/doc/fugitive.txt#L198-206

f:id:marutanm:20110708211702p:image
ブランチだけではなく、開いているファイルのリビジョンも表示してくれます。これで:Gdiffしてどっちがどっちかわからなくなることもないですね。

QuaterClockで時計を再発明しました


上記ツイートURLの写真で全てを理解してもらえると思います。

アーリーアダプターな皆様につきましては、初代iPhone、3G、3G S、4、4ホワイトとすでに4台どころではなくiPhoneをお持ちかと思われます。ぜひお試しくださいませ。23:59 → 00:00 へのアニメーションはけっこう壮観ですよ。

最近スマートフォンアプリエンジニアの求人がアツいみたいなので、1年くらい前につくってもうちょっとクオリティを高めたいと思いつつ放置していたのを、ふとビルドしてAppStoreにだしてみました。これと同様に、出来栄えにこだわらなければ、そしてビルドさえすればストアに出せるのが他に何個もあるんですが、それはどうしましょうね。

Objective-CiPhoneアプリ開発をかじったことがあれば、さわった感じで予想がつくかと思うのですが、UIScrollViewを使っています。それから文字盤の縦スクロールには UIViewでのアニメーションiOS4.0対応版 - Meltdown Countdown で書いたようなblocksをつかったUIViewのアニメーションを使っています。当時の最新の書き方ですね!!今でもアニメーション周りは特に書き方変わっていないようですが。

ソースコードがみたいという奇特な方がおられましたらmarutanm/QuarterClock · GitHubをご参照ください。ろくにテストもせず、ろくにコメントもない、公開していいのか疑問の残る状態です。

公開後、ランチにサーモンづくしを食べていた方からこんな反応もいただきました。


あばちゃん様、ありがとうございます。

iTunes Store へ接続中です。

スキーマレスなMongoDBでmethod_missingを避ける

MongoDBです。ORMにMongoidです。
ご存知の通り、スキーマレスなわけですよ。スキーマレスということはあれですよ、ドキュメントによってフィールドがあったりなかったりしちゃうわけです。

通常、Modelの各フィールドに対してはMongoidがうまいことやってくれるアクセサをとおしてやりとりします。

class Person
  include Mongoid::Document
  field :name, type: String
end

上記のようなドキュメントのフィールドに対して、次のようにアクセスできちゃうのです

person.name

ところが、例えばfirst_nameがnilの場合、メソッドチェーンなんかしてしまうとmethod_missingとなることがあります。
アプリ側で例外処理をしてもいいのですが、DB側でうまいことやってほしい場合もあります。
そんなとき、Mongoidならこんな手があります。

If the attribute does not already exist on the document, Mongoid will not provide you with the getters and setters and will enforce normal method_missing behavior. In this case you must use the other provided accessor methods: ( and =) or (read_attribute and write_attribute).

# Raise a NoMethodError if value isn't set.
person.gender
person.gender = "Male"

# Retrieve a dynamic field safely.
person[:gender]
person.read_attribute(:gender)

# Write a dynamic field safely.
person[:gender] = "Male"
person.write_attribute(:gender, "Male")
http://mongoid.org/docs/documents/dynamic.html

[] あるいは read_attribute、write_attribute を使うことで、method_missingを避けられます。

デーモンとして産れいづる存在としてのMongoDB

MacでMongoDBをDaemon化して自動起動させる - Meltdown Countdown

以前に、上記エントリを書きましが、Starting and Stopping Mongo - MongoDB という公式のドキュメントにデーモンとして起動するならこうしろというコマンドが書いてました*1

This will fork the Mongo server and redirect its output to a logfile. As with --dbpath, you must create the log path yourself, Mongo will not create parent directories for you.

 $ ./mongod --fork --logpath /var/log/mongodb.log --logappend
http://www.mongodb.org/display/DOCS/Starting+and+Stopping+Mongo#StartingandStoppingMongo-RunningasaDaemon

forkオプションを指定しています。これについては Command Line Parameters - MongoDB か、mongod --helpで調べられます。
曰く、サーバプロセスをforkします、と。それによってバックグラウンドで動作しますよ、と。アンパサンドをつけてバックグラウンドで動作させてもいいのかもしれませんが、その場合プロセスの優先度が低くなるという違いがあるようです*2。それによってMongoDBとしてのパフォーマンスが低下するかもしれません。

Macならば冒頭のエントリで書いたlaunchctl を使うと、内部的な挙動は違うかもしれませんがforkオプションを指定せずともデーモンとして動作しています。それ以外の環境でデーモンとして動かしたいときにはこのforkオプションを使えばよい、と。

ちなみに、logappendオプションを指定すると、ログファイル上書きではなく、追記になる。ログファイル肥大化しそうなので、ケースバイケースで。

*1:ただし英語ドキュメントに限る

*2:ps aux で確認

既存の不可視ディレクトリをGitHub for Macで管理する

GitHub for Mac が公開されましたね。ローカルのリポジトリとgithubで公開しているリポジトリと簡単に連携できて、良い感じです。
ふつうのgit管理しているディレクトリならドラッグアンドドロップするなり、GitHub for MacのPreferenceからScanするなりして表示させられます。GUIツールでヒストリを見れたりするのはやっぱりいいですよね*1
ところでローカルに ~/.vim というgitリポジトリがあります。リモートは github/marutanm/.vim と対応しています。これをGitHub for MacのMy Repositoriesに表示してやりたいわけですが、ドットではじまる不可視ディレクトリなのでどうしたものか。

方針1 不可視ディレクトリを可視化しちゃう

Finderの設定を変えます。調べればどこかに手順書いていると思います。Finderから見えるようになれば、あとはドラッグアンドドロップするなりなんなり。
なんか今さらFinderの設定を変えるのもなー。却下。

方針2 改めてcloneする

cloneして、既存のものと置き換える
ただし、ローカルにだけあるブランチなんかは消えちゃうし、ignoreしているものも消えちゃう。
今回だとvundleで管理しているプラグインが入っている bundle/ 配下をignoreしちゃっているので、この手法はやりたくない。

方針3 githubコマンドを入れる

GitHub for Macからgithubコマンドを入れることができます。これはGitHub for Macの起動コマンドであり、git管理下で実行すればそのリポジトリをGitHub for Macで認識してくれます。
というわけで今回の場合、 ~/.vim から実行してやれば完了。
ちなみにこのgithubコマンドは /usr/local/bin に入ります。homebrewで入るコマンドと同じところですね。

まとめ

というわけで、ローカルに散乱しているgitリポジトリをガンガンGitHub for Macに突っ込んで一覧することができます。いいですね。
しかも、そのリポジトリにリモートリポジトリが既に設定してあればそれを認識してくれるし、それがgithubリポジトリであれば便利にsyncできますし。
ちなみに、syncする場合、ブランチの扱いってどうなるんですかね?ローカルの全branchがpushされたりするんですかね?ためしてみないと。

関連
Announcing GitHub for Mac · GitHub

*1:ちなみに今までは[http://gitx.frim.nl/:title=GitX]を使っていました。リポジトリツリーの表示とかけっこう良いですよ

SCSSはSASSより出でてSASSよりSASSy

そもそもsassyってどういう意味なんですかね?スペースアルクによると、もともとはsaucyで、生意気なとかそういう意味みたいですね。flickrで検索したらこんな感じらしいです。

プライベートでつくっている何かで、Viewを書く段階になってようやくスタイルシートはどうしようか考え始めました。padrinoを使っているので、対応しているのはsass, less, scss, compassの4つ。

誤解を恐れずにいえば、scssはsassの別の書き方。compassも公式サイトに"uses Sass”なんて書いてるのでsassの別の書き方。だもんで、実質の選択肢はsassかlessかなんですね。

では、素直にsassを使おうかと思って調べていると、scssが new main syntaxとの記述が公式サイトに。公式のリファレンスも参照すると、要点は次のような感じ。

  • SCSS
    • 有効なCSSファイルはSCSSファイルとしても有効
    • ほとんどのCSSハックやブラウザ固有の構文が使える
    • 拡張子.scss
  • SASS
    • 括弧とセミコロンの代わりに、インデントでネストを示す
    • 読みやすく、書きやすい人もいる
    • もはや、プライマリではないけどまだサポートしてるよ
    • 拡張子.sass

そして、互いに変換可能。両者の構文の違いは公式サイトを参照のこと。
セミコロン、ブラケットを使わないぶんだけsassのほうがタイプ数は減りそう。一方でscssはcss互換というのが嬉しいところなのかな。