ページ

2012年12月31日月曜日

rvmからrbenvに乗り換え

年越し環境構築を。
rvmからrbenvに乗り換えてみる。

まずはrvmをアンインストール。
rvmをアンインストールするにはrvm implodeもしくはrvm seppukuコマンドを使う(切腹ってなんだよ)。
% rvm seppuku
zshrcとかに書いてあるrvm関連の行も消す。

続いてrbenvとruby-buildのインストール、Homebrewで。

% brew install rbenv ruby-build

eval "$(rbenv init -)" をzshrcとかzshenvとかに書く(僕はzshenvに書いた)。

rbenv installでrubyをインストールする
% rbenv install 2.0.0-preview2
自分でコンパイルして ~/.rbenv/versions/ に置いてやるんでもいいらしい。

追記:
ruby2はMacデフォルトのopensslとは互換性がないとかなんとか。
https://github.com/sstephenson/ruby-build/issues/197

なのでopensslもhomebrewでインストールして、rubyもオプション付けてインストールし直した。
% brew install openssl
% brew link openssl
% RUBY_CONFIGURE_OPTS=--with-openssl-dir=`brew --prefix openssl` rbenv install 2.0.0-preview2

2013/04/21 追記
readlineも指定してやらないとirbとかpryで日本語使えなかった
% brew install readline
% CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl` --with-readline-dir=`brew --prefix readline`" rbenv install 2.0.0-p0

インストールしたら、rbenvでは以下のコマンドが必要になるそうな。
% rbenv rehash
rbenvではこれをよく使うらしく、新しくrubyをインストールしたときとか、実行可能なgemをインストールしたときにもrehashしてやらないといけないらしい。
(rbenv-rehashっていうgemを各rubyに入れておいてやることで勝手にやってくれるようになるらしいが、まあなんとなく鬱陶しいな)

デフォルトで使うrubyのバージョンはrbenv globalで指定する。
% rbenv global 2.0.0-preview2
β版的なものをデフォルトにするのは止めたほうがいいと思う。

尚、MacRubyに関しては、rbenv-macrubyというプラグインがあり、こいつを使えばMacRubyもrbenvで管理できる。

2012年12月23日日曜日

[Mac]Guardによる自動テスト

久々に環境構築おじさん的なことを。

これまでRSpecとautotest(zentest)を使ってたのだけど、最近はみんなminitestだな、とかなんとか聞いたのでminitestも使ってみる。
で、自動実行するためにGuardを使う。Rails4とかで使われてるのかな?

gemspecに書いてbundle install
gem.add_development_dependency "guard-minitest"
もちろん普通にgem installしてもいいし、Gemfileに書いてもいい。

Guardfileという設定ファイルを生成するために
% bundle exec guard init minitest
Guardfileの基本的なところについては割愛。

ファイル保存のタイミングでテストするためにrb-fsevent使う(WindowsとかLinuxの場合はほかのものを使う)
gem.add_development_dependency "rb-fsevent"
テスト書いて、
% guard
すると、ファイル保存のたびにテストされる。


以下、Growlで通知させる話。

gem growlを使う。
gem.add_development_dependency "growl"
を追加して、bundle installしてguardし直す。

が、通知されない。

Growl2.0になって、GrowlNotifyを入れてないせいだった。
http://growl.info/downloads#generaldownloads からダウンロードしてインストール。

改めて
% guard
適当にファイルいじって保存してテストを走らせる。

通知出た。
が、何故か1回ファイル保存するごとに2回ずつ通知される。
よくみたらテスト自体が2回ずつ実行されてる。

Guardfileにguard 'minitest' do endが2個あった。
guard init minitestをしたときに、Gemfileがあるならbundle execしたほうがいいんじゃない?って出力されたのでもう一回bundle exec guard init minitestしたらGuardfileに追記されていたせいだった。

もう一回guard initしてみたら3個になって、
There are 3 definitions in your Guardfile for 'minitest', you may want to clean up your Guardfile as this could cause issues.
っていうのが出てた。2回目のときにも出ていたんだろう。
必要ない分を消したらちゃんと1回だけ実行されて通知も1個になった。

2012年11月28日水曜日

Playでライブラリ使おうとしてどハマりした

Playの中で、dispatchを使おうとしてハマったのでメモ。

結論から述べると、Build.scalaに以下のように書いて、
    val appDependencies = Seq(
      // Add your project dependencies here,
      "net.databinder.dispatch" %% "dispatch-core" % "0.9.4"
    )
% playしてreloadしてupdateしてcompileしてrunしたら動いた。


以下、ダメだったこと。
libraryDependencies += "net.databinder.dispatch" %% "dispatch-core" % "0.9.4"
をPlugins.sbtに書いてもmodule not foundとかdispatchなんて定義されてないぜ、とか言ってくる。
そんなはずあるかよく探せ、などと言ってみても見つかりませんの一点張り。

ダメ元で、
addSbtPlugin("net.databinder.dispatch" % "dispatch-core" % "0.9.4")
とか書いてみてももちろんダメ。

ついでにbuild.sbtを自分で作ってそこに書いてみてもダメだった。

2012年10月21日日曜日

SinatraでAsset Pipeline

Padrino::Sprocketsを使う。

最初rubygems.orgに公開されているバージョンを使ったら動かなくてハマった。githubから持ってきて使う。

Gemfileに以下を書く
gem 'padrino-sprockets', :git => "https://github.com/nightsailer/padrino-sprockets.git", :require => "padrino/sprockets"

app.rb的なところでregisterする
class App < Sinatra::Base
  register Padrino::Sprockets
  sprockets

  get "/" do
    slim :"index"
  end
end

これで、下のパスに対応するファイルを置けば良い。
app/assets/javascripts
app/assets/images
app/assets/stylesheets

そうすると、 /assets/application.js に対しては
app/assets/javascripts/application.js
app/assets/javascripts/application.js.coffee
app/assets/javascripts/application.js.erb

とかを探してくれるようになる。

appとかassetsの部分は変えられるようだ。

参考:
SinatraとCoffeeScriptでわかる、Sprocketsの使い方 « blog.udzura.jp
nightsailer/padrino-sprockets

2012年10月16日火曜日

gemで実行ファイルがインストールされなくてハマった

ざくにく定食: BundlerでGem作って公開、アップデートまで
で書いたような、Bundlerで生成したファイルの中から必要な分だけを既存のディレクトリに突っ込んで、rake build とrake installしてもbin以下にある実行ファイルがコマンドとしてインストールされなかった。

散々悩んだが、gemspecを見ていて原因がわかった。
gem.files = `git ls-files`.split($\)
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
git ls-filesの結果を使っているが、bin以下をまだgit addしていなかった。
git addしてから改めてやってみたらいけた。

BundlerでGem作って公開、アップデートまで

% bundle gem mygem
で、スケルトンが生成される。
--bin もしくは -b をつけるとbin以下も生成される。

mygem.gemspecを編集してTODOになってるとことか書く。
依存するgemとかも書く。

ビルド
% rake build

インストール
% rake install

そしてリリース
% rake release

リリースすると、バージョン番号でタグを打ち、リモートリポジトリにpushして、rubygems.orgの公開までやってくれる。

アップデートするときはlib/mygem/version.rbを書き換えてrake release。

参考:bundlerを使ってrubygem「Tupper」を作る | Kwappa研究開発室
Bundlerを使ったGem作成メモ (自分用) - ただのにっき(2012-02-18)

2012年9月17日月曜日

MobiRubyでhello world

% gem install xcodeproj
% gem install nokogiri
% git clone https://github.com/mobiruby/mobiruby-ios.git
% cd mobiruby-ios
% sh setup.sh
% open mobiruby-ios.xcodeproj

で、XcodeでRunしてみるとビルドエラーが出た。

RVMのgemでインストールしてたせいだった。

% rvm system
してからgemを入れ直す
% sudo gem install xcodeproj
% sudo gem install nokogiri

で、あらためてRun。動いた。



後でREADME見なおしてみたら最初からこうなってた。この通りにやればよかった。
% sudo /usr/bin/gem install xcodeproj
% sudo /usr/bin/gem install nokogiri

参考: mobiruby/mobiruby-ios

2012年9月15日土曜日

brew updateでコケた

% brew update
error: The following untracked working tree files would be overwritten by merge:
Library/Formula/argp-standalone.rb
Please move or remove them before you can merge.
Aborting
Error: Failure while executing: git pull -q origin refs/heads/master:refs/remotes/origin/master

以下で直った。

% cd `brew --prefix`
% git fetch origin
% git reset --hard origin/master
% brew update

参考: homebrewのupdateが失敗した時 - まめ畑

2012年9月9日日曜日

ctags使おうとしたらハマった

ctagsを使ったことがなかったので、とりあえず使ってみようとしたらハマった。
% ctags -R
すると
ctags: no input files specified.
Try `ctags --help' for a complete list of options.
って頑に言われる。

ひとまず言われた通り ctags --help してみると
-Rオプションのところに
-R, --no-regex
Don't create tags from regexps for the following files.
とか書いてある。なんかおかしい。

ctags --versionしてみると
ctags (GNU Emacs 24.1)
Copyright (C) 2012 Free Software Foundation, Inc.
This program is distributed under the terms in ETAGS.README

なんか違う。
前にhomebrewでemacs24入れたりしたときにおかしくなったのだろうか。

ともあれ、コレジャナイので入れ直す。
% brew install ctags

Error: The linking step did not complete successfully
The formula built, but is not symlinked into /usr/local
You can try again using `brew link ctags'
とか言われたので、言われた通りにする。
% brew link ctags

できたようなのであらためて
% ctags -R

ちゃんとtagsファイル出来た。

2012年7月22日日曜日

[Mac]Scalaで日本語使う

日本語を出力しようとしたら文字化けした。

JAVA_TOOL_OPTIONS='-Dfile.encoding=UTF8' をつけて実行すれば文字化けしない。
% JAVA_TOOL_OPTIONS='-Dfile.encoding=UTF8' scala hoge.scala

.zshrcに以下を追加。
export JAVA_OPTS="-Dfile.encoding=UTF-8"
REPLでも日本語使えるようになるけど、書いて消すとズレたりするありがちな感じになる。

参考: Scala, Mac and -Dfile.encoding=UTF-8 - Kato Kazuyoshi

2012年7月16日月曜日

Sinatraの自動リロード

2012/7/16 10:00 指摘によりsinatra-contribを使う旨を追記&修正

未だにshotgun使ってた。

参考:
モノクロームの中: sinatra (2) - オートリロード -
Sinatra::Reloader (part of Sinatra::Contrib)

gemをインストール
% gem install sinatra-contrib

Classicスタイル
require "sinatra"
require "sinatra/reloader" if development?

Modularスタイル
require "sinatra/base"
require "sinatra/reloader"

class MyApp < Sinatra::Base
  configure :development do
    register Sinatra::Reloader
  end
end
developmentモードで起動したときに有効になる。(デフォルトでdevelopmentモード)

ところでrackup -E で設定できるのってdevelopmentとtestとproductionだけで合ってるんだろうか。ハッキリとこれです!って言ってるのが見つけられなかった。


あと、Bundler使うパターン

Gemfileがこう
source :rubygems

gem 'sinatra', require: 'sinatra/base'

group :development do
  gem 'sinatra-contrib', require: 'sinatra/reloader'
end
で、本体のほうがこう
class App < Sinatra::Base
  configure :development do
    Bundler.require :development
    register Sinatra::Reloader
  end
end
bundle exec rackupで起動しよう。

ファイル単位でもリロードの設定を変えられるようだ。
http://www.sinatrarb.com/contrib/reloader


今回の、shokaiさんはいつからやっていた?は2年と3ヶ月前でした。
sinatra開発時に自動リロードする - 橋本詳解

2012年6月29日金曜日

Playをインストール & Play Scala動かす

最近は仕事とかいうものにかまけていたせいでブログを書いてなかった。

% brew search play
したらplay出てきたけど、こういう一般的な言葉が名前だと合ってるのか不安極まりない。

% brew info play

play 2.0
http://www.playframework.org/
Not installed
https://github.com/mxcl/homebrew/commits/master/Library/Formula/play.rb

どうやら合っているようなのでインストールする。

% brew install play

なかなかの重量級なようでダウンロードにも時間がかかった。

と思ったらインストールが終わってた。ディレクトリを移動しただけだったようだ。


とりあえずJavaには興味がないのでScalaのプロジェクト作る
% play new calas --with scala
そしたらなんか聞かれた
What is the application name?
> calas
え?calasって言ったじゃないですか。ご丁寧にデフォルトでcalasって入ってるし。

まあプロジェクト名とアプリ名は違うこともあるか。しょうがないしょうがない。

Which template do you want to use for this new application?

1 - Create a simple Scala application
2 - Create a simple Java application
3 - Create an empty project

>
え?Scalaでって言ったじゃないですか。しかも今度はデフォルト入ってないし。
1番を選択。(2番だとどうなるんだろう)

できたら動かす
% cd calas
% play run
やけに時間がかかった。初回の初回だからか?

ポート9000で動いているようなのでlocalhost:9000にアクセス。
Playの公式サイトと同じような画面が表示される。

これはしかしなかなかの全部入り感でいじるにはちょっと萎えますね。
3番選ぶとよかったのかな。

2012年5月22日火曜日

Padrinoでこんにちはしてみた

http://jp.padrinorb.com/

インストール
% gem install padrino

プロジェクトの生成
% padrino g project padrino-test

gはgenerateのg。genとかgenerateでも良い。

projectのところに生成するものを指定。
生成できるのは project, app, mailer, controller, model, migration, plugin, admin, admin_page。

padrino-testはプロジェクト名。適当。

デフォルトだとこんなんが生成される。
.
├── Gemfile
├── app
│   ├── app.rb
│   ├── controllers
│   ├── helpers
│   └── views
│   └── layouts
├── config
│   ├── apps.rb
│   └── boot.rb
├── config.ru
├── public
│   ├── favicon.ico
│   ├── images
│   ├── javascripts
│   └── stylesheets
└── tmp

ちなみに --tiny オプションをつけて生成するとcontroller、helper、mailerフォルダーがrbファイルと化す。
.
├── Gemfile
├── app
│   ├── app.rb
│   ├── controllers.rb
│   ├── helpers.rb
│   └── mailers.rb
├── config
│   ├── apps.rb
│   └── boot.rb
├── config.ru
├── public
│   ├── favicon.ico
│   ├── images
│   ├── javascripts
│   └── stylesheets
└── tmp

生成のときにはコンポーネントを色々選べる。僕の趣味で選ぶとこんな感じかしら。
% padrino g project padrino-slim -d mongoid -t rspec -s jquery -e slim -c sass -m mocha -b
-b つけるとbundle installまでやってくれる(自分でやらなくても、最初にアプリケーション起動するときに勝手にbundle installしてくれるらしい。最初って初回って意味だろうか)。

もっと適当な感じのときは
% padrino g project feeling --tiny -e slim -c sass -b
とかか。Slimは外せない。


jqueryとprototype.js両方使いたいときとかあるんじゃないか?と思って
% padrino g project -s prototype -s jquery
とかやってみたら後に指定したほうになるみたいだった。cucumberとrspec両方使う人とかいると思うけどね?
(と思ってこっちもやってみたら、cucumber指定したらデフォでrspecの分も生成されてる?)

ともあれ、生成したら動かしてみる。
ルートディレクトリに入って
% padrino s

http://0.0.0.0:3000 で動き出す。
ログもカラフルに吐き出される。

http://0.0.0.0:3000 にアクセスしてみると404の画面になる。

app/app.rbを編集
get '/' do
  "something"
end
とか適当に書く。

shotgunとか使わなくても自動リロードされてるようだ。

なぜかここまで書くのに3日ぐらいを費やしてしまったので(padrino自体をいじったのは10分ぐらいなのに)、とりあえず一区切り。

2012年5月9日水曜日

Ubuntu + Passenger + Nginx インストール

Rubyはrvmで入れた1.9.3。
% gem install passenger
% rvmsudo passenger-install-nginx-module

そしたら
Curl development headers with SSL support... not found
って出た。

足りないのはこれだけだったので、指示に従ってインストール
% sudo aptitude install libcurl4-openssl-dev
そして改めて
% rvmsudo passenger-install-nginx-module

途中、選択肢が出るので選択する。人生は選択の連続。

インストール先も設定できるが 、何のこだわりもないのでデフォルトの /opt/nginx 。
設定ファイルの場所は /opt/nginx/conf/nginx.conf になる。

編集する。
pid /var/run/nginx.pid;

server {
listen 8080;
server_name hogehoge.jp;

# publicを指定するらしい
root /var/www/hogeapp/public;

passenger_enabled on;
}


Nginx-init-ubuntuの起動スクリプトを/etc/init.d/nginxにコピペ&ちょっと編集。
DAEMON=/opt/nginx/sbin/nginx
NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"
にする。

% sudo chmod a+x /etc/init.d/nginx
% sudo update-rc.d -f nginx defaults

参考:
Rails 3 on Ubuntu 10.10 with RVM, Passenger and Nginx « theKindOfMe
Ubuntu 10.04 TLS に nginx + passenger + sinatra を入れたメモ(1) - Moderation is a fatal thing. Nothing succeeds like excess.
Ubuntuに、passenger-install-nginx-moduleした « blog.udzura.jp

2012年3月31日土曜日

CoffeeScriptのREPLでUnderscore.js使おうとしてハマった

結論を先に書くと、nodeとかcoffeeのREPLでは, _(アンダースコア)に最後の式の結果が入る。

なので
> _ = require 'underscore'
~略~

> _.VERSION
'1.3.1'

> _.VERSION
undefined

> _
'1.3.1'
みたいなことになる。

余談だけど、この性質があるので最初の _ への代入はわざわざ書かなくても
require 'underscore'
だけ書けば、少なくとも次の一回はUnderscore.jsとしての_を使えるね。

2012年3月21日水曜日

XcodeでMacRubyのgemを使う

Xcodeのバージョンは4.3.1
MacRubyはRVMで入れたのを使う。

% rvm use macruby-nightly
% rvm info

で出力される中に書いてあるGEM_HOMEとGEM_PATHをXcodeの環境変数に入れる。

やり方。

下の画像、Deploymentって書いてあるところをクリックすると出てくる「Edit Schme...」的なやつを選択。

ArgumentsにあるEnvironment Variablesにこんな感じで追加してやる。


で、require 'rubygems' すればgemが使えた。
(MacRubyってRuby1.9系 な気がしたんだけど、require 'rubygems'がいるのはなんでだっけ)
これでちゃんと合ってるのかわかんないんだけど、間違ってたらそのうち誰かが指摘してくれると信じてる。


あと、デプロイするときにgemを含めたい場合は、この画面で

Argumenstのところに
--gem なんとか --gem かんとか
って書いてやればいいようだ。


3/22 追記: MacRuby DoJoに書いてあった
CRuby 1.9 では require 'rubygems' が不要なのですが、MacRuby で RubyGems を利用する際には必須となります。「MacRuby の起動にさらに時間がかかるので、rubygems をロードしていない」というのが理由です。

MacRubyをRVMでインストールしてXcodeで使う

Xcodeのバージョンは4.3.1

macruby-0.10はXcode4.3に対応していないらしいので、nightly-buildを使う。
% rvm install macruby-nightly

インストールして、XcodeでMacRuby Applicationを新しく作ると、こういう風にMacRuby.frameworkのところが赤くなってる。
(RVMを使わないでMacRubyをインストールしておいた場合にもなるのかは知らない)

赤くなってるMacRuby.frameworkはdeleteキーを一押しして消してしまい、/Library/Frameworks/ にMacRuby.frameworkがあるのでそいつをD&Dしてやればいい。

左のツリーにあるFrameworksの中にあるMacRuby.frameworkも赤くなってるので、消してやって、読み込まれたMacRuby.frameworkをそこに移動させればすっきり。

2012年3月18日日曜日

Stylus気に入った

今や数あるCSSテンプレートの一つだろう、ぐらいに思っていたら

http://learnboost.github.com/stylus/docs/css-style.html

普通のCSS を書いても大丈夫だった。

ちょいとコピペしてきたのを試すときにも変換したりする必要がないし、stylus式の書き方を完全に覚えてなく てもなんとなく書けるのはとてもいい。

expressコマンドのオプションとして指定できるだけのことはあるな。

追記: ていうかExpressとStylusの開発者同じじゃん

2012年3月11日日曜日

MongoDBのコレクションからランダムなドキュメントを取り出す

色々間違ってそうで不安だ。

http://eric.lubow.org/2010/databases/mongodb/getting-a-random-record-from-a-mongodb-collection/
ググるとこういうやり方が出て来るのだけど、実際やってみるとこれではランダムにならない。

上のやり方を僕の理解でなんとなく説明してみると
{id:1, random:9}
{id:2, random:2}
{id:3, random:5}
{id:4, random:1}
みたいな、あらかじめそれぞれのドキュメントがランダムな値を持ってるコレクションがあって
db.docs.findOne( { random : { $gte : rand } } )
みたいな感じでドキュメントを取り出すと、randよりも大きいrandom(先述したランダムな値)を持ってるドキュメントを一つ取り出す。

このrandってのはドキュメントを取り出そうとするたびに変わる値で、それゆえにrandよりも大きいrandomを持つドキュメントは毎回変わるということ。

問題はここから。

findOne()ってのはfind()したやつの中の1個を返して来る。
find()で返ってくるのはカーソルっていうハッシュみたいなやつらしく、 どうやら中身がid順で並んでる。

例えばrandが8のとき、8より大きいrandomを持つのはid:1のドキュメントだけなのでそれが取り出される。これはいい。
次に、randが3のとき、この場合はid:1とid:3が該当する。

この2つ
{:id1, random:9}
{:id3, random:5}

このとき出てきて欲しいのは、3より大きいrandomの中では一番小さい5を持つドキュメント。
でも、実際取り出されるのは並んでるのの1個目なのでid:1のドキュメント。

つまり、idが若くてrandomの値が大きいやつに偏って取り出されてしまう。

どうしたものかと考えていたらこんな解決法があった。
http://cookbook.mongodb.org/patterns/random-attribute/#comment-452243980

地理空間のインデックスを利用して、randから"一番近い"randomを持ってるやつを検索取得するようにしてる。


最初にrandomフィールドに地理空間のインデックスを作成しておく。
db.docs.ensureIndex( { random: '2d' } )

そのあとの流れは上のと大体同じ。
// それぞれのX軸の値をランダムにする
for ( i = 0; i < 10; ++i ) db.docs.insert( { key: i, random: [Math.random(), 0] } );

// $nearを使うことでランダムな値に近いやつを取れる
db.docs.findOne( {random : { $near : [Math.random(), 0] } } ) 

// 任意の個数取り出すこともできる
db.docs.find( { random : { $near : [Math.random(), 0] } } ).limit( 4 ) 


あと、そんなに早くなくてもいいからとりあえず1個取り出したいようなときはこれだけでもいける。

参考: http://stackoverflow.com/questions/2824157/random-record-from-mongodb/2824166#2824166

Vimでrbファイル作成時にマジックコメントつける

参考: Rubyのエンコード指定マジックコメントを##<esc>で挿入できるようにした - LazyLoadLife

~/.vim/templates/rb.tpl を作成。
中身はマジックコメント
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

で、~/.vimrc に以下を追加。
autocmd BufNewFile *.rb 0r ~/.vim/templates/rb.tpl

自動生成したファイルとか、既存のファイルにつけるにはこんなのがあった。
https://github.com/m-ryan/magic_encoding

Gyaimで変換候補ウィンドウが出なくなったときの対処

Gyaimを使ってると何かの拍子に変換候補ウィンドウが出なくなることがある。

そんなときは一度
% killall Gyaim
してやればいい。

Pryで日本語入力できるようにする

pryの読み方って「ぷらい」なんですね。「ぷりい」って読んでた。

% rvm pkg install readline

するとreadlineが /Users/zakuni/.rvm/usr とかにインストールされるので
そいつを使ってrubyをreinstallする

% rvm reinstall ruby-1.9.3 --with-readline-dir=/Users/zakuni/.rvm/usr

これでPryで日本語入力できる。

参考: irbやpryで日本語を入力できるようにする - IwazerReport

Vimの日本語入力がおかしかった

vimで日本語を入力しようとすると、入力してる途中で確定されてしまい、変換前のひらがなとアルファベットが入り混じることがあった。

コメントで入力しようとすると大丈夫だったりするのでAutocomplpopあたりが怪しい気もするのだけど、とりあえず以下で解決した。

.gvimrcにこれを追加
set imdisable

2012年1月24日火曜日

AutoComplPopをほんの少しいじる

tabで補完するために以下を.vimrcに書く。

"<TAB>で補完
" {{{ Autocompletion using the TAB key
" This function determines, wether we are on the start of the line text (then tab indents) or
" if we want to try autocompletion
function! InsertTabWrapper()
        let col = col('.') - 1
        if !col || getline('.')[col - 1] !~ '\k'
                return "\<TAB>"
        else
                if pumvisible()
                        return "\<C-N>"
                else
                        return "\<C-N>\<C-P>"
                end
        endif
endfunction
" Remap the tab key to select action with InsertTabWrapper
inoremap <tab> <c-r>=InsertTabWrapper()<cr>
" }}} Autocompletion using the TAB key

でしばらく使ってたんだけどしっくり来ない。

補完の第一候補が最初から選択されているので、returnキーならそのまま確定するのだけどtabを押すと二個目が選択されちゃって戻ったりしなきゃいけない。

これはストレスなので.vim/bundle/AutoComplPop/autoload/acp.vimの中身を見て、
function acp#onPopupPost()
  " to clear <C-r>= expression on command-line
  echo ''
  if pumvisible()
    inoremap <silent> <expr> <C-h> acp#onBs()
    inoremap <silent> <expr> <BS>  acp#onBs()
    " a command to restore to original text and select the first match
    return (s:behavsCurrent[s:iBehavs].command =~# "\<C-p>" ? "\<C-n>\<Up>"  : "\<C-p>\<Down>")
の部分をこう書き換えた
function acp#onPopupPost()
  " to clear <C-r>= expression on command-line
  echo ''
  if pumvisible()
    inoremap <silent> <expr> <C-h> acp#onBs()
    inoremap <silent> <expr> <BS>  acp#onBs()
    inoremap <expr> <CR> pumvisible() ? "\<C-Y>\<CR>" : "\<CR>"
    " a command to restore to original text and select the first match
    return (s:behavsCurrent[s:iBehavs].command =~# "\<C-p>" ? "\<C-n>\<Up>\<C-n>"  : "\<C-p>\<Down>\<C-p>")
最後のところは<Up>と<Down>を消すだけでもいいけど、なんとなく消すのが嫌だったのでこうした。
これで、tabを押したタイミングで第一候補から選択、returnは補完があろうがなかろうが改行になった。

参考:
autocomplpop.vimでリアルタイムにキーワード補完 - ナレッジエース
autocomplpop.vim -自動補完プラグイン- « Labs@doya.in

2012年1月8日日曜日

Vundleを使う

EmacsとVimの二刀流になるべくVimをメインに使い始めて数カ月。

プラグインを入れるのにはpathogenを使っていたのだが、どうやら近頃はVundleなるもののほうがよさげ。というわけで乗り換える。

というかpathogen使ってるのに、プラグイン追加するときgit submodule addとかするのすっかり忘れてた。意味ねー


ドットファイルをgitで管理しているのでsubmoduleとして取り込む
% cd ~/dotfiles
% git submodule add http://github.com/gmarik/vundle.git .vim/bundle/vundle

.vimrcに記述
filetype off

if has('win32') || has('win64')
  let $DOTVIM = expand('~/vimfiles')
else
  let $DOTVIM = expand('~/.vim')
endif
set rtp+=$DOTVIM/bundle/vundle/
call vundle#rc()

" let Vundle manage Vundle
" required!
Bundle 'gmarik/vundle'

" My Bundles here:
"
" original repos on github
Bundle 'tpope/vim-fugitive'
Bundle 'Lokaltog/vim-easymotion'
Bundle 'rstacruz/sparkup', {'rtp': 'vim/'}
Bundle 'tpope/vim-rails.git'
" vim-scripts repos
Bundle 'L9'
Bundle 'FuzzyFinder'
" non github repos
Bundle 'git://git.wincent.com/command-t.git'
" ...

filetype plugin indent on " required!

後半を編集して自分の入れたいものを書く。

先に:BundleInstall!してVundle自体を最新にしておいたほうがいいかも。

書いたらVimを起動して:BundleInstallすると書いたものが~/.vim/bundle/にインストールされる。

参考:
Vim-users.jp - Hack #215: Vundle で plugin をモダンに管理する
Vim のプラグイン管理を pathogen から Vundle に移行した - present
gmarik/vundle - GitHub

各種設定ファイルをgitで管理する

.emacsとか.vimrcとか.zshrcとか、それらをまとめて管理することにした。

dotfilesフォルダを作って、各種設定ファイルを突っ込み、個別にシンボリックリンクを貼る

こんな感じ
% mkdir ~/dotfiles
% mv .emacs dotfiles/
% ln -s dotfiles/.emacs ~/.emacs

で、dotfilesフォルダをgitで管理する。

2012年1月4日水曜日

Nodeのデーモン化

foreverを使う
% npm install forever

% forever start app.js

これだけ。簡単。

Node + Nginxの設定をする

見よう見まねで設定。やたら手こずってしまった。

ExpressアプリをNginxで動かす。

/home/zakuni/hoge/ にapp.jsがあり、それをhogehoge.comで動かしたいとする。
% sudo vi /etc/nginx/sites-available/hoge

/etc/nginx/sites-available/hoge
server {
  listen 80;
  server_name http://hogehoge.com;
  access_log /var/log/nginx/hoge_access.log;
  error_log /var/log/nginx/hoge_error.log;

  location / {
   root /home/zakuni/hoge/;
   index /;
   proxy_pass http://localhost:3000;
  }
}

リンクを貼る
% sudo ln -s /etc/nginx/sites-available/domain1.com /etc/nginx/sites-enabled/domain1.com

nginxを再起動。
% sudo /etc/init.d/nginx restart


参考:
nginx @ ウィキ - nginx バーチャルホスト
nginx設定メモ - おおにしあきらの日記
node.js + nginx - And now? - Stack Overflow