おっさんだけど夢を見てる。うんこしながら情熱プログラマーとか小さなチーム、大きな仕事とかを繰り返し読んでる。技術書も買ってるけど全然読めてない。積ん読してるだけ。なんとか状況を良くしたいと思ってるけど、なかなか状況は良くならない。時間だけが過ぎていく。
MacVimでコピペできないんですけど…
MacVimでコピペできないのって仕様?
MacVimに他のアプリケーションでコピーしたものを貼り付けられないのって仕様? いろいろ調べてみたけどストライクな解決方法はないみたい。結局CLIのVim使ってる。
DataMapperでAUTO INCREMENT値をリセットする
ポータルシットをLokkaに置き換えたくていろいろやってる。ポータルシットの過去記事をYAMLでエクスポートし、それをLokkaのDBに取り込む作業をやってる。TDD BootCampに参加したので、テストファーストしながらの作業。RSpecでテストコードを書き、ログが正しくインポートできることを確認する。テスト終了時 after(:all) フックで、取り込んだログを削除してる。コードはこんな感じ。ちなみにLokkaはDataMapperをORMに採用してるので以下はDataMapperでの話。
after(:all) do
Category.all.destroy
Entry.all.destroy
endしかしこれでは AUTO INCREMENT の値がリセットされず、テストを繰り返す度に AUTO INCREMENT の値が増えていってうざかった。
DataMapperの機能で AUTO INCREMENT 値をリセットするのってないのかなと5秒くらい探してみたけど見つからなかったので、SQLを直接実行する方法を採用した。
ちなみにRDBMSに採用してるのはSQLite3。SQLiteでは UPDTE sqlite_sequence SET seq=0 WHERE name='テーブル名'; みたいなコードで AUTO INCREMENT 値を任意の値に設定できるみたい。
最終的な after(:all) フックはこんな感じ。
after(:all) do
Category.all.destroy
Entry.all.destroy
Entry.repository.adapter.execute('update sqlite_sequence set seq=0 where name="entries";')
endテスト実行後にはすべてのデータがデータベースから削除されて、AUTO INCREMENT の値もリセットされる。人畜無害なテストコード万歳。
Jekyllで関連ポストを表示する
関連記事表示
Jekyllで関連記事を表示するようにした。jekyllを実行するときに jekyll --lsi とするんだけど、Classifierというgemが必要。ただしClassifierを入れてるだけだと似てる記事を探すのにすんごい時間がかかるので、gslというgemを入れる。しかしこれはただ単に gem install gsl しただけでは以下のようなエラーが出る。
Fetching: narray-0.5.9.9.gem (100%)
Building native extensions. This could take a while...
Fetching: gsl-1.14.7.gem (100%)
Building native extensions. This could take a while...
ERROR: Error installing gsl:
ERROR: Failed to build gem native extension.
/Users/morygonzalez/.rvm/rubies/ruby-1.9.2-p136/bin/ruby extconf.rb
checking gsl version... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers. Check the mkmf.log file for more
details. You may need configuration options.
Provided configuration options:
--with-opt-dir
--without-opt-dir
--with-opt-include
--without-opt-include=${opt-dir}/include
--with-opt-lib
--without-opt-lib=${opt-dir}/lib
--with-make-prog
--without-make-prog
--srcdir=.
--curdir
--ruby=/Users/morygonzalez/.rvm/rubies/ruby-1.9.2-p136/bin/ruby
extconf.rb:237:in `rescue in <main>': Check GSL>=0.9.4 is installed, and the command "gsl-config" is in search path. (RuntimeError)
from extconf.rb:138:in `<main>'GSL(GNU Scientific Library)が入ってないのがダメらしい。Homebrewでインストールする。
$ brew install gslそんでもう一回 gem install gsl するとうまく入った。 _config.yaml に lsi: true という記述を追記して jekyll を実行すると関連記事が表示されるようになった。
最近の記事表示
ついでに見た目を調整した。サイドバーに全部の記事が表示されてたのがうざかったので10件だけ表示するようにした。
8c72..2c84ea5 100644
--- a/_layouts/post.html
+++ b/_layouts/post.html
7 +69,7 @@
<h3>Latest Posts</h3>
<ul>
- {`% for post in site.posts `%}
+ {`% for post in site.posts limit:10 `%}
<li><a href="{{ post.url }}">{{ post.title }}</a></li>
{`% endfor `%}
</ul>(↑Liquidでエスケープする方法がわからんかったので {`% とかなってますけど、正しくは {% です)
Liquidでは配列に対して {% for post in site.posts limit:10 %} という書き方をすることでループ処理の回数をコントロールできるみたい。
全体的に見やすくなりすっきりした。
確認ダイアログを出しながら削除するスクリプト
確認ダイアログを出しながらディレクトリやファイルを削除するスクリプトを書いた。大したコード書いてないし逆引きRubyに載ってたコードをまるパクリしてるところもあるけど便利だと思う。
そのディレクトリにあるファイル/ディレクトリ一覧を取得した後、「このファイル/ディレクトリは作られてから何日経っています。削除しますか? (y/n)」というダイアログ(英語)を表示する。y が入力されると削除を行う。地味に使える。
RubyのFileUtilsはすごく便利だと思う。シェルスクリプトでしこしこ書くのがアホらしくなる。RubyがPerlなみにあらゆるuni*x系のサーバーに入るようになったらさぞかし便利だろうと思う。
iTermでVimを使うと矢印キーでカーソル移動できない
iTerm 2が素晴らしいということなのでiTermをぼちぼち使ってるんですけど、Vimを起動したときに矢印キーで移動できないことが分かった。「Vimで矢印キーでカーソル移動とか小学生かよ」みたいなご意見もあるでしょうけど、入力モードのときに移動したくなったら j, k, h, l じゃ移動できないでしょ? そこで矢印キーですよ。
iTermでVimを使っているときも矢印キーでカーソル移動できないものかと、軽くググってみたところ次のような記事に遭遇した。
これを参考にとりあえず以下のように .zshrc に書いた。
case "${TERM_PROGRAM}" in
iTerm*)
export TERM=dtterm
esacしかし、これはちょっと自分的にはいただけなかった。
export TERM=dttermってやると、termcap的な何かの作用で、Vimを閉じたときにコンソールを復元できなくなる(参照: Vimで編集を終了した後、元のコンソールの状態を復元したい)。僕はVimを閉じた後はコンソールを復元したい派なので、このやり方は受け入れられなかった。
.termcap に何か書くことも考えたけど、 .termcap で条件分岐する書き方が分からなかったのでさらにググってみた。すると外人が「iTermの設定で何とかできる」みたいなことを書いてるのを発見した。
なるほど、 .vimrc とか .zshrc とか側で回避する方法ばかり考えていたけどiTermで回避する方法を考えればよいわけか。
で、iTermを開いてみたところ、iTerm 1の頃から引き継いでいるBookmarkのDefaultの設定がよくなかったみたい。具体的には矢印キーそれぞれに ^[[A とか ^[[B みたいなキーが割り振られていて、このせいで矢印キーが使えなくなっていたわけだ。
Load Presetから "Use xterm Defaults" を選んでみたところ、無事矢印キーでカーソル移動できるようになった。めでたしめでたし。
インスタンス変数
一個前の記事(Rubyがエレガントだって言われるのがわかってきたような気がする | tech.portalshit.net - CakePHP, Rails, JavaScript)をcxxさんに添削してもらったところ、Rubyの方のコードには問題があったらしい。Rubyでは変数を宣言だけして終わりみたいな初期化をしちゃダメだそうで、必ず何かを代入しないといけないらしい。
そういうわけで正しくは、
class Hoge
def initialize
@a = ""
end
def hoge
@a = "hogehoge"
end
end
fuga = Hoge.new
puts fuga.hogeと書くそうです。
ところでなんで自分は前回、 @a というインスタンス変数を使ったのかがよく分からない。Railsでコードを書いていて、Controllerで定義した変数をViewで使うときにインスタンス変数を使うので、そういう風に思い込んでいるのかな。上のコードでは別にインスタンス変数を使う必要はなくて、
class Hoge
def initialize
a = ""
end
def hoge
a = "hogehoge"
end
end
fuga = Hoge.new
puts fuga.hogeでも同じ結果を出力しますね。
インスタンス変数と普通の変数の違いが分かってなかったので、たのしいRuby(第2版)を開いて復習してみたところ、以下のような記述があった。(たのしいRuby 第2版 pp.123-124)
@で始まる変数は インスタンス変数 といいます。ローカル変数とは違って、このメソッドを抜けてもその値は保存されますが、インスタンスごとに違う値を割り当てられる変数です。(たのしいRuby 第2版 pp.123-124)
なるほど! 例えば上のコードを引数つきのものに改造したとしましょう。
class Hoge
def initialize(b="")
@a = b
end
def hoge
print @a, "
"
end
end
fuga = Hoge.new("Fuga")
piyo = Hoge.new("Piyo")
fuga.hoge
piyo.hogeで、これを実行すると
Fuga
Piyoと表示される。こんな感じで、一つのクラスから複数のインスタンスを生成するときに使うのがインスタンス変数って理解でオーケーなのかなと思います。