MacVimでコピペできないのって仕様?
MacVimに他のアプリケーションでコピーしたものを貼り付けられないのって仕様? いろいろ調べてみたけどストライクな解決方法はないみたい。結局CLIのVim使ってる。
MacVimに他のアプリケーションでコピーしたものを貼り付けられないのって仕様? いろいろ調べてみたけどストライクな解決方法はないみたい。結局CLIのVim使ってる。
ポータルシットを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 --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 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
と表示される。こんな感じで、一つのクラスから複数のインスタンスを生成するときに使うのがインスタンス変数って理解でオーケーなのかなと思います。
NECの安サーバーを買ってサーバーを作ってるんですけど、SSHでエラーが出て困ってます。OSはUbuntu Server 10.04.1 LTS。
まずSSHのおさらいを。クライアント側で
$ mkdir -p .ssh
$ ssh-keygen -t rsa (以下略)
したのち、サーバー側の /etc/ssh/sshd_config
の PasswordAuthentication
を on
にし、パスワードでSSH接続できるようにして
$ scp id_rsa.pub username@hoge.com:.ssh/authorized_keys
するか、あるいはUSBフラッシュメモリで鍵をサーバーに移す。その後サーバー側で .ssh/
と .ssh/authorized_keys
のパーミッションをそれぞれ700と600に変えてあげるわけですよね。
いっぺんクライアント側で id_rsa.pub
を作ってたらそれ以降は単純にこれを接続先のサーバーにコピーしてあげればおk。ここまで合ってますかね?
前から使ってる職場内だけで使うサーバーにも同じUbuntu Serverを入れてるんですけど、こっちでは全くトラブルがない。それなのに新しいサーバーでは
Permission denied (publickey).
というエラーが頻繁にお出になるのですよ。
しかしこのエラー、常に出る訳じゃないんですね。サーバーを直接操作して
$ sudo /etc/init.d/ssh restart
してあげると消える訳ですね。そんでしばらくクライアントからSSHで接続したり切断したりを繰り返していると、あるとき突然、
Permission denied (publickey).
となるわけです。まじでストレスフル。つか、このサーバーは公開用に使うものなので、こんな感じでSSHが不安定だとかまじで困るんですけど。
前述の PasswordAuthentication
を on
にしとけば、公開鍵認証に失敗した後もパスワードで認証することができるんですが、パスワード認証はなんだか怖いので使いたくないのですよね。どいうしたものか。
ググったらSSHのプロトコルを1と2併用にしたら解決するという情報が出てきたのですけど、これやったら "Disabling protocol version 1. Could not load host key" というエラー?が出てしまったので多分僕の環境では意味なし。「RSAキーやめてDSAにしたらエラーでなくなった」(ぷらぷらブログ | OpenSSH を導入。接続に四苦八苦!)という情報もあるけど面倒くさいのでまだ試していません。