ruby のブロック内の変数とif文とのスコープ的なアレ
ruby のブロック内の変数とメソッド内の
スコープ的なもののメモ (ruby 1.8.7 で実行)
復習
def dummy yield end def func foo = nil dummy{foo = :hoge} foo end func # => :hoge def func dummy{foo = :hoge} foo end func # => NameError: undefined local variable or method `foo' for main:Object
ここまでは問題無いと思う。
で、↓こんなコードがあったとき、
def dummy yield end def func(arg) if arg foo = :foo1 else dummy { foo = :foo2} end foo end
func(nil) だとどうなるか気になったので実行してみた。
func(true) # => :foo1 func(nil) # => :foo2
arg = nil のときのブロックの中の foo は外の foo になるらしい、
多分 if の中を先に評価して名前空間内に foo が出てくるんだと思う。
じゃあこんなの↓ならどうなる?
def func(arg) unless arg dummy{ foo = :foo3} else foo = :foo4 end foo end
func(true) # => :foo4
これは期待通り
func(nil) # => nil
上から見て先に出ないとブロック内の変数になる(その後のelse 内で出てくるから、NameError にはならない)。
この例ぐらい分かりやすい話なら気付くけど、複雑なコードだと面倒なバグの原因になるかもねー
おまけ
def func eval("foo = :foo5") foo end func # => NameError: undefined local variable or method `foo' for main:Object def func foo = nil eval("foo = :foo6") foo end func # => :foo6
vim make 時のconfigure
違うサーバでインストールするとき毎回忘れてヘルプ読んでる気がするので
Vim コンパイルしてインストールするときのソース取得, こんふぃぎゃー, makeメモ
ついでにはてなでのソースコード貼付けテスト
#!/bin/bash function make_work_dir(){ [ -d $1 ] || mkdir -p $1 || { echo "${1}: mkdir error"; exit 1; } } SRC_DIR=$HOME/src make_work_dir $SRC_DIR hg clone https://vim.googlecode.com/hg $SRC_DIR/vim cd $SRC_DIR/vim || { echo "${SRC_DIR}: cd error"; exit 1; } # before this, you should install ncurses and gettext BUILD_DIR=$HOME/build make_work_dir $BUILD_DIR ./configure --with-features=huge --enable-multibyte --enable-fontset --enable-rubyinterp --prefix=$HOME/build/vim73 --enable-nls make make install # dont forget set path at rc file
>|bash| はsyntax highlight は無いのね
Open vSwitch 1.4.0 変更点メモ
いつのまにか Open vSwitch 1.4.0 が出ていたので、リリースノートを日本語訳
誤訳してたらゴメンね てへぺろ(・ω<)v
http://openvswitch.org/releases/NEWS-1.4.0
- Linux Kernel 3.3 対応モジュール.
- "VLAN splinters" が古い Linux におけるバギーなデバイスドライバー回避のために導入された(この機能は将来当該ドライバが使われなくなったら廃止するつもり) 詳しくは ovs-vswitchd.conf.db(5) を見る
- OpenFlow:
- ovs-vswitchd:
- action が "normal" でないと Traffic mirror ができない縛りがなくなった
- Track packet と byte の統計情報が mirror ポートから送れるように.
- ovs-appctl:
- bridge の MAC 学習テーブルをフラッシュする "fdb/flush" コマンドが実装された.
- ovs-test:
- 新しいテストツール(Xen と RH では無いよん)
- RHEL パッケージングで Red Hat のネットワークスクリプトとの統合をサポート /etc/sysconfig/network-scripts/ifcfg-xxx で Open vSwitch のスイッチが設定可能に。詳しくは、ソースの rhel/README.RHEL に書いてある。
- bonding:
- デフォルトの bonding mode が balance-slb から active-backup に変更 (balance-slb のリスクについては vswitchd/INTERNALS 参照)
*1:Nicira Network の OpenFlow 拡張
Open vSwitch インストール
Open vSwitch 1.3 をインストールするまで
面倒なのでコピペ用にコマンド貼っとく
CentOS 6.1 でインスコ時に仮想化グループのパッケージのみ入れた状態
# prepare required packages yum install gcc make autoconf rpm-build redhat-rpm-config kernel-devel openssl-devel # version 2.64 autoconf is required ... wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.64.tar.gz tar -xzf ./autoconf-2.64.tar.gz pushd autoconf-2.64 ./configure make make install popd # get open vswitch src wget http://openvswitch.org/releases/openvswitch-1.3.0.tar.gz tar -xzf openvswitch-1.3.0.tar.gz pushd openvswitch-1.3.0 # should do below # git clone git://openvswitch.org/openvswitch # pushd openvswitch # build ./boot.sh ./configure --with-linux=/lib/modules/`uname -r`/build make dist # make rpm packages rpmdir=$HOME/rpmbuild if [ ! -d $rpmdir/SOURCES ];then mkdir -p $rpmdir/SOURCES fi mv ./openvswitch-*.tar.gz $rpmdir/SOURCES/ rpmbuild -bb --target=x86_64 rhel/openvswitch-kmod-rhel6.spec rpmbuild -bb --target=x86_64 rhel/openvswitch.spec cd $rpmdir/RPMS/x86_64/ rpm -ivh ./kmod-openvswitch-*.x86_64.rpm rpm -ivh ./openvswitch-*.x86_64.rpm rpm -ivh ./openvswitch-debuginfo-*.x86_64.rpm reboot # bridge compatible due to libvirt attachment modprobe -a brcompat_mod ovs-brcompatd --pidfile --detach
INSTALL.Linux では構成DBのスキーマ初期化したり、
内容初期化してたりするけど、
# TODO: insert above bridge compatible mode command to init.d/openvswitch