Pythonでリストの深いコピー
Pythonのリストの代入は参照渡しなので、普通に代入すると内容は同じものを指します。
>>> hoge = [1, 2, 3] >>> fuga = hoge >>> id(hoge) 4359788304 >>> id(fuga) 4359788304 >>>
参照を渡すだけでなく、複製したい場合は以下のようなやりかたでできます。
>>> hoge = [1, 2, 3] >>> fuga = list(hoge) # その1 >>> piyo = hoge[:] # その2 >>> id(hoge) 4359425992 >>> id(fuga) 4359327896 >>> id(piyo) 4359788304 >>> import copy >>> moga = copy.copy(hoge) # その3 >>> id(moga) 4359328544
ただし、リストの中身が辞書のような参照先のあるオブジェクトである場合は、上記の方法でリストのコピーができても、中身の辞書は参照先が渡されるためコピーできません。
>>> hoge = [{"a": 1}] >>> fuga = list(hoge) >>> id(hoge[0]) 140553539258480 >>> id(fuga[0]) 140553539258480
中身もコピーしたい場合はcopyモジュールのdeepcopy関数を利用します。
8.17. copy — 浅いコピーおよび深いコピー操作 — Python 2.7ja1 documentation
>>> hoge = [{"a": 1}] >>> import copy >>> fuga = copy.deepcopy(hoge) >>> id(hoge[0]) 140553539161136 >>> id(fuga[0]) 140553539260496
こういうコピーを「深いコピー」というそうです。
「ちゃんとリストをコピーしたはずなのに中身の辞書が同じものを指してるっぽい!なんで??」と悩んだことがあったため記録しておきます。
おわり。
rbenvとは、gemとは何か?
はじめに
Chefの勉強をするにあたってruby環境を作ったのですが、 ruby関係のことばでよく聞く
- rbenv
- gem
についてちゃんと理解してなかったためぐぐってみました。
rbenvとは?
Rubyのバージョンをかんたんに切り替えてくれるやつ!
ふむふむ。 プロジェクトごとにRubyのバージョンが異なるということはよくありそうなので、簡単に切り替えられるのは便利そうですね。
インストール方法
環境はMac OS X 10.8.5です。 githubからcloneしてきます。
# rbenvをclone git clone https://github.com/sstephenson/rbenv.git ~/.rbenv # PATHの設定 echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc echo 'eval "$(rbenv init -)"' >> ~/.zshrc # rubyをインストールするためにruby-buildというプラグインが必要らしいのでcloneする git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
Homebrewでもインストールできるみたいです。
簡単な使い方です。
# インストール可能なバージョン一覧を表示 rbenv install -l # バージョン 2.0.0-p353 をインストール rbenv install 2.0.0-p353 # インストール済み一覧表示 rbenv versions # インストールしたバージョンに切り替える # globalを指定するとPC全体のrubyのバージョンが切り替わる # localを指定するとカレントディレクトリのみ切り替わる rbenv global 2.0.0-p353 # 現在のバージョン確認 ruby --version
参考
https://github.com/sstephenson/rbenv https://github.com/sstephenson/ruby-build
ちなみに、gccが入っていないとrubyのインストールに失敗してしまいます。 Macの場合、Xcodeのコマンドラインツールをインストールするとgccがコマンドラインで使えるようになるそうです。
参考
http://kawairi.jp/weblog/vita/201204255985
gemとは?
Rubyに付属しているRubyGemsというパッケージングシステムでライブラリの作成・公開・インストールができるらしいです。
ライブラリのインストール方法はよく知られているとおりこんなかんじです。
gem install hoge
参考
Bundler
gemライブラリの種類やバージョンを管理するのにBundlerというツールを使うとよさそうです。
参考
http://bundler.io/ http://blog.mirakui.com/entry/20100703/1278165723 http://www.rubylife.jp/rails/ini/index2.html
おわりに
Rubyでがりがりプロジェクトを作るとしたらrbenvとかbundlerは必須なのかなーと思いました。 Chefを使いたいというぐらいだったらここまでしなくてもよいかなーと思いましたが、あまりシステムのRuby環境をいじりたくなかったので導入してよかったと思います。
おわり。
さくらVPS初期設定メモ
以下を参考にして設定。