The net is vast
プログラミングや、コンピュータなどの備忘録です。 主にRuby, Java, Linux, 等を扱います。アルゴリズムも扱いたいな。
6:42

VMのシンプロビジョニングの謎 sparse file

Category: By jx
KVMなどを触っているとシンプロビジョニングを行えるqcow2等のフォーマットのファイルによく出くわします。lsをしてみると、40Gのファイルが出来ていたりするのですが、実際には4Gくらいしか使っていません。今までどういう仕組なのかわからなかったのですが、これはsparse fileという名前で実際に書きこまれていない領域は確保しないという仕組みのようです。作り方は簡単で、Rubyで書くと次のようになります。
open('a.txt', 'w') do |f|
  f.seek 10000000
  f.puts 'a'
end
つまり、実際に書き込まずseekすれば良いということですね。ちなみにこういうファイルをコピーするときにはちゃんと気をつけてコピーしてあげなければいけません。cpコマンドは良きに計らってくれるようですが、rsyncについて自分で指定してあげないといけないのだとか。
rsync --sparse
tarでもまとめるときにも余分な部分を削除して通常ファイルを作ってくれます。
tar --sparse
これでVMのシンプロビジョニングも怖く有りません。
 
14:01

git cleanで追跡されていないファイルを削除する

Category: By jx
gitで途中までファイルを追加してしまったんだけど、元に戻したいときってありますよね?
そういうときはgit clean。
追跡されていないファイルを奇麗に削除してくれます。

ただし、オプションで -f をつけないと削除してくれません。

git clean -f
 
0:00

dreamhost(linux) + rsyncで差分バックアップをする方法

Category: By jx
中学校の頃からデジカメで写真を撮ってきて、バックアップをろくにとっていませんでした。いつもバックアップしようと思うのですが、当時はCD-Rに入りきらないし、DVD-Rがでてもその頃にはDVD-Rにも入りきらない状態でした。だからいつも億劫になってしまってバックアップを取ってこなかったのです。

それじゃまずいだろということで、さすがに良い歳にもなったのでそろそろまじめにバックアップを考えました。調べてみると最近はいろいろと手段があるようでした。WebサービスであればDropboxが有名ですが、これは容量制限が結構小さいので無理ですし、最近でてきたトレンドマイクロ オンラインストレージ SafeSyncもあまり使い勝手が良くないようです。

ここは、技術者の端くれとしてバックアップスクリプトを自分で書くのだということで、調べているとrsyncがバックアップしてくれるらしい記述を発見。--link-destというオプションをつけると、差分バックを取ってくれるようです。仕組みは意外とシンプルで、linuxの仕組みを使っていて感心しました。

ext2系のファイルフォーマットではi-nodeという仕組みでファイルを管理しています。ハードリンクを使うと同じi-nodeを指し示す別名のファイルを作成する事ができるのです。つまり、ファイル名は異なっても指し示しているファイルは同じ物です。つまり、このrsync --link-destを使ってバックアップを使用している限り、任意の時点からの差分バックアップが簡単にとれるのです。

また、私はDreamHostでサーバをレンタルしているのですが、このDreamHostはディスク容量が無制限なので、自由にバックアップする事ができます。しかし、本当に無制限で大丈夫なんでしょうかね?まぁちゃんとunlimited diskと書いてあるのでありがたく使わせてもらいましょう。

肝心のスクリプトですが、こんな感じになりました。これを定期的に実行すればバックアップは完璧ですね!
SOURCE_DIR=~/Documents/backuped
DEST_HOST=user@dreamhost.com
DEST_DIR=/home/user/backup
DATE=`TZ=JST-9 date "+%Y%m%d%H%M%S"`

CURRENT=$DEST_DIR/current
RELATIVE_CURRENT=../current
THIS_TIME=$DEST_DIR/$DATE

rsync -av --delete --link-dest $RELATIVE_CURRENT $SOURCE_DIR $DEST_HOST:$THIS_TIME
ssh $DEST_HOST "rm -fr $CURRENT; ln -s $THIS_TIME $CURRENT"
 
0:52

OSXでRuby1.9.2にバージョンアップしたらgemが動かなかった

Category: , By jx
Snow Leopardのportsでrubyを1.9.1から1.9.2にバージョンアップした。そうしたらgemが動かなくなってしまったんです。
$ gem1.9

/opt/local/lib/ruby1.9/site_ruby/1.9.1/rubygems/source_index.rb:68:in `installed_spec_directories’: undefined method `path’ for Gem:Module (NoMethodError)
from /opt/local/lib/ruby1.9/site_ruby/1.9.1/rubygems/source_index.rb:58:in `from_installed_gems’
from /opt/local/lib/ruby1.9/site_ruby/1.9.1/rubygems.rb:883:in `source_index’
from /opt/local/lib/ruby1.9/site_ruby/1.9.1/rubygems/gem_path_searcher.rb:81:in `init_gemspecs’
from /opt/local/lib/ruby1.9/site_ruby/1.9.1/rubygems/gem_path_searcher.rb:13:in `initialize’
from /opt/local/lib/ruby1.9/site_ruby/1.9.1/rubygems.rb:841:in `new’
from /opt/local/lib/ruby1.9/site_ruby/1.9.1/rubygems.rb:841:in `block in searcher’
from :10:in `synchronize’
<…and so on…>

どうした物かとググってみてたらPreston Lee's Blogに書いてありました。まさに的確な対処法。

要するに以下のコマンドを叩けばよい。ただ下のコマンドはファイルを完全に削除してしまうので注意してくださいね。
sudo rm -rf /opt/local/lib/ruby1.9/site_ruby/

実際に叩いてみるとあっさり動くようになりました。
どうやら以前のバージョンのgemを見てしまうのが問題だそうです。

詳しくはPreston Lee's Blogを参照してください。