hasciiの日記

多分プログラミング関係

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:
    • IPv6 flow label マッチ機能追加 ( NXM*1 を使用).
    • IPv4, IPv6 の ECN bit フィールドを使用したマッチ機能追加 ( NXM を使用).
    • IPv4, IPv6TTL フィールドを使用したマッチ機能追加 ( NXM を使用).
    • ( action で ?) IPv4 の ECN フィールドを変更できる機能追加
    • ( action で ?) IPv4TTL フィールドを変更できる機能追加
  • 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