オルタナティブ・ブログ > 吉政忠志のベンチャービジネス千里眼 >

IT業界でベンチャービジネスの支援をしている執筆者が日々の活動ログと感じたことを、徒然なるままに書き綴っていきます。

CTC教育サービス5月号メルマガ「VMware認定コースキャンペーン実施中!」

»

おはようございます。私が編集支援しているCTC教育サービスで表記メルマガのバックナンバーの公開許可が得られましたので、全文掲載いたします。

興味がある方はご参考ください。

┏□■━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━■□┓
    CTC教育サービス News&Topics         2015年5月号
┗□■━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━■□┛
発行元:CTC教育サービス

目次
■キャンペーン 【期間延長】 VMware認定トレーニングの受講料割引!
■トピック   Inst. Tech View 第49回
        "Cisco Catalyst SDMテンプレートの変更"
■コラム    スーパーエンジニアの独り言第46回 "深海マリア"

-----------------------------------
         ★技術コラム続々更新中!!★
5月更新最新コラム
・第66回 機械学習でナンバープレート認識の謎を解く?!(その1)
     (RedHat 中井様)
・第2回 高い可用性を持つMicrosoft Azure IaaSのデータセンターについて
     (マイクロソフト 武田様)
・第24回 業務システムのマイナンバー対応チェックポイント
     (吉政創成 吉政様)
http://dm.ctc-g.co.jp/c?c=2093&m=42385&v=deca48bb
-----------------------------------

 キ┃ャ┃ン┃ペ┃ー┃ン┃
 ━┛━┛━┛━┛━┛━┛━━━━━━━━━━━━━━━━━━━━━━━━
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
◆◇  【期間延長】VMware認定トレーニングの受講料割引!        ◇◆
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

5月より実施している弊社VMwareトレーニングの割引受講キャンペーンが、
2016年3月末まで延長となりました!

対象コースも7コースと大きく増えましたので、ご受講を検討されている方は、
この機会に是非ご受講ください!

詳しくはこちら
http://dm.ctc-g.co.jp/c?c=2094&m=42385&v=109ab413


 ト┃ピ┃ッ┃ク┃
 ━┛━┛━┛━┛━━━━━━━━━━━━━━━━━━━━━━━━━━━
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
◆◇ 『 Inst. Tech View ~Cisco Catalyst SDMテンプレートの変更~ 』  ◇◆
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

先日、Cisco認定資格であるCCNP(Cisco Certified Network Professional)
Routing and Switching がアップデートされました。
それに伴い、認定コースのカリキュラムに関しても、新項目が追加されています。

今回はSWITCHコースに新しく追加されました「SDM(Switch Database Management)
テンプレート」につきまして、紹介させていただきたいと思います。

Cisco Catalyst 2960, 3560, 3750などのスイッチにおいては、
SDMテンプレートによりCAM・TCAMのリソース割り当てを管理しています。

例えば、Catalyst 3560の場合、デフォルトのSDMテンプレートでは、
L2スイッチング、IPv4ルーティングを実行できますが、IPv6ルーティングに関して
は実行できません。
Catalyst 3560においてIPv6ルーティングを行いたい場合は、
SDMテンプレートを変更して、TCAMのリソースをIPv6ルーティングに割り当てる
必要があります。

それでは、実際にSDMテンプレートの変更手順を紹介していきます。
今回は、次のスイッチを用いて説明します。

デバイス:WS-C3560-24PS
IOS:Version 12.2(55)SE9, IPService

デバイスの型番やIOSのバージョン、フィーチャーセットにより対応の可否は
異なりますので、予めご了承ください。

1.SDMテンプレートの確認

SDMテンプレートを変更する前に、現在のテンプレートをshow sdm prefer
コマンドで確認します。

C3560#show sdm prefer
The current template is "desktop default" template.
The selected template optimizes the resources in
the switch to support this level of features for
8 routed interfaces and 1024 VLANs.

number of unicast mac addresses: 6K
number of IPv4 IGMP groups + multicast routes: 1K
number of IPv4 unicast routes: 8K
number of directly-connected IPv4 hosts: 6K
number of indirect IPv4 routes: 2K
number of IPv4 policy based routing aces: 0
number of IPv4/MAC qos aces: 0.5K
number of IPv4/MAC security aces: 1K

上記出力より、現在使用しているデフォルトのテンプレート(desktop default)
では、リソースはIPv6に割り当てされていません。また、現時点では下記のよう
にIPv6関連のコマンドをサポートしていないことが確認できます。

C3560(config)#ipv6 ?
% Unrecognized command


2.SDMテンプレートの変更

SDMテンプレートを変更するには、sdm preferコマンドを実行します。
今回はIPv6を有効にしてみたいと思いますので、IPv4/IPv6デュアルスタックの
テンプレートを適用します。

C3560(config)#sdm prefer dual-ipv4-and-ipv6 default
Changes to the running SDM preferences have been stored, but cannot take effect
until the next reload.
Use 'show sdm prefer' to see what SDM preference is currently active.

変更したSDMテンプレートを有効にするためには、デバイスを再起動する必要
があります。

C3560#reload

System configuration has been modified. Save? [yes/no]: yes
Proceed with reload? [confirm]

再起動が完了しましたら、再度SDMテンプレートを確認します。

C3560#show sdm prefer
The current template is "desktop IPv4 and IPv6 default" template.
The selected template optimizes the resources in
the switch to support this level of features for
8 routed interfaces and 1024 VLANs.

number of unicast mac addresses: 2K
number of IPv4 IGMP groups + multicast routes: 1K
number of IPv4 unicast routes: 3K
number of directly-connected IPv4 hosts: 2K
number of indirect IPv4 routes: 1K
number of IPv6 multicast groups: 1.125k
number of directly-connected IPv6 addresses: 2K
number of indirect IPv6 unicast routes: 1K
number of IPv4 policy based routing aces: 0
number of IPv4/MAC qos aces: 0.5K
number of IPv4/MAC security aces: 1K
number of IPv6 policy based routing aces: 0
number of IPv6 qos aces: 0.625k
number of IPv6 security aces: 0.5K

上記出力より、SDMテンプレートが変更された(desktop IPv4 and IPv6 default)
結果、IPv6ルーティングにリソースが割り当てされていることが確認できます。
また、下記のようにipv6 unicast-routingコマンドを用いて、IPv6ルーティング
を有効にできます。

C3560(config)#ipv6 unicast-routing

C3560#show ipv6 route
IPv6 Routing Table - Default - 3 entries
Codes: C - Connected, L - Local, S - Static, U - Per-user Static route
B - BGP, R - RIP, D - EIGRP, EX - EIGRP external
ND - Neighbor Discovery
O - OSPF Intra, OI - OSPF Inter, OE1 - OSPF ext 1, OE2 - OSPF ext 2
ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2
C 2001:DB8:C0F:FEE::/64 [0/0]
via Vlan1, directly connected
L 2001:DB8:C0F:FEE::1/128 [0/0]
via Vlan1, receive
L FF00::/8 [0/0]
via Null0, receive

今回はSDMテンプレートの変更の一例として、
Catalyst 3560におけるIPv6ルーティングの有効化について紹介いたしました。
SWITCHコースにおいては、設定の詳細なオプションや変更時の注意点に関して
紹介しています。

また、CTC教育サービスでは、実機を用いた演習環境をご用意しており、
現行のCCNP Routing and Switching対応の各コースを提供してます。
資格取得を目指している方、
現在のネットワーク構築に求められる機能、設定時の注意点を体系的に
学習されたい方など、是非受講をご検討いただければ幸いです。


CCNP Routing and Switching関連コースの詳細情報はこちら:

N535:ROUTEv2.0(Implementing Cisco IP Routing)
期間:5日間
価格:バウチャーあり(N535V)\260,000(税抜)
   バウチャーなし(N535)\235,000(税抜)
日程:7/6~7/10 8/3~8/7
http://dm.ctc-g.co.jp/c?c=2095&m=42385&v=b511241d

N536:SWITCHv2.0(Implementing Cisco IP Switched Networks)
期間:5日間
価格:バウチャーあり(N536V)\260,000(税抜)
   バウチャーなし(N536)\235,000(税抜)
日程:6/22~6/26 7/13~7/17 8/24~8/28
http://dm.ctc-g.co.jp/c?c=2096&m=42385&v=80fc924e

N537:TSHOOTv2.0(Troubleshooting and Maintaining Cisco IP Networks)
期間:4日間
価格:バウチャーあり(N537V)\260,000(税抜)
   バウチャーなし(N537)\235,000(税抜)
日程:6/15~6/18 7/21~7/24 9/8~9/11
http://dm.ctc-g.co.jp/c?c=2097&m=42385&v=25770240


 コ┃ラ┃ム┃
 ━┛━┛━┛━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
◆◇『スーパーエンジニアの独り言 第46回 "深海マリア"』 ◇◆
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

昨年末に上梓された「Rubyのしくみ」(原題:Ruby Under a Microscope,
顕微鏡の下でのRuby)という本を手にしました。Rubyのしくみを知りたい、
Rubyを深く知りたいという欲求からの行為です。

そこで今回はRubyの内部構造 "Ruby Internals" の理解の助けになればという
願いを込めて少しでも深層に近づくために潜ってみたいと思います。
ちなみに筆者は金槌です。
いつも謎に満ちているRubyのオブジェクトとクラスについて、その素顔を
垣間見ることができれば嬉しいという試みです。

オープンソースとして公開されているRuby実行環境であるインタープリター
(interpreter)の代表は、まつもとゆきひろ氏によって開発された
MRI(Matz' Ruby Implementation)です。
MRIはC言語で実装されたRubyの公式処理系であり、すべてのプラットフォームで
動作可能として提供されています。MRIは最も広く使われているRubyの
インタープリターです(MRI以外にもRubyはオープンソースであるが故に多数の
処理系が実装されています)。

先ずは安全第一に救命胴衣を着用して(「Rubyのしくみ」を片手に携えて)、
MRIのソースコード(Rubyバージョン2.2.2)をダウンロードしてみました。

ソースコード海の中に浮遊するヘッダーファイルを覗くとその底にはRubyの
オブジェクトが、RObjectという構造体で表現されていました。

struct RObject {
struct RBasic basic;
union {
struct {
long numiv;
VALUE *ivptr;
struct st_table *iv_index_tbl;
} heap;
VALUE ary[ROBJECT_EMBED_LEN_MAX];
} as;
};

RObjectがRubyの汎用のオブジェクトとして用意されている構造体です。

unionで共有体として指定されているその内部にある構造体がインスタンスの値を
指し示している様子です。numiv(number of instance variables)がインスタンス
変数の「個数」、ivptr(instance variables pointer)にはそのオブジェクトの
インスタンス変数の「値」が格納された配列へのポインタが保存される様子です。
そしてiv_index_tblは、後述するRClassと連動しており、個々のインスタンス変数
の「変数名とインデックス」が対応付けられたハッシュテーブルへのポインタと
なっているそうです。(因みにデータ型の st_table がC言語でのハッシュテーブル
実装であり、Rubyでもハッシュの基礎となっているのでiv_index_tblは本質的に
ハッシュだそうです)
つまり、RObjectが保持するのはそのオブジェクトが固有に保持するインスタンス
変数の値であり、変数名というインスタンス変数そのものの情報はクラスにある
ことになります。インスタンス変数は、クラスで定義しているのですから納得
できる構造です。

ここでRObjectで冒頭に記載されているメンバーが、RBasicとなっています。
RBasic構造体を探すと以下のようになっていました。

struct RBasic {
VALUE flags;
const VALUE klass;
}

flagsにはオブジェクトの状態を示す frozen, tainted などの情報がフラグとして
格納されます。もう一つのメンバーであるklassはクラスポインタを表現しており、
現在のオブジェクトのクラスを指すのです。
オブジェクト共通に必要な情報がRBasic構造体なのです。逆説的には、すべての
インスタンスはRBasic構造体を含むのだと考えて概ね良さそうです。
ここでklassが指している先にあるのが、クラスを表現しているRClass構造体です。

struct RClass {
struct RBasic basic;
VALUE super;
rb_classext_t *ptr;
struct method_table_wrapper *m_tbl_wrapper;
};

RObjectと同様にRBasicをメンバーに持っていることから、クラスもオブジェクト
であることが分かります。それに加えてRClassは、superポインタをメンバーに
持っており、これにより継承元であるスーパークラスを指し示しているのでしょう。
またメンバーであるptrポインタはクラス固有の情報を持っているようです。
ptrの型であるrb_classext_tはtypedefされており、rb_classext_struct構造体を
意味しています。

struct rb_classext_struct {
struct st_table *iv_index_tbl;
struct st_table *iv_tbl;
struct st_table *const_tbl;
rb_subclass_entry_t *subclasses;
rb_subclass_entry_t **parent_subclasses;
rb_subclass_entry_t **module_subclasses;
rb_serial_t class_serial;
VALUE origin;
VALUE refined_class;
rb_alloc_func_t allocator;
};

同様にmethod_table_wrapperも構造体です。

struct method_table_wrapper {
st_table *tbl;
size_t serial;
};

それぞれクラス固有の情報とインスタンスメソッドの定義を指していると
考えられます。
ここまでで分かったことは、すべてのRubyオブジェクトは、クラスへのポインタ
とインスタンス変数の組み合わせだということになります。
これがRubyオブジェクトの定義なのです。例えば、下記のようなRubyのサンプル
コードで考えてみます。

class Deepsea
attr_accessor :depth
attr_accessor :latitude
attr_accessor :longitude
attr_accessor :date
end

maria = Deepsea.new
maria.depth = 5815
maria.latitude = 25.31
maria.longitude = 143.275
maria.date = "1992/09/21"
p maria

ここでインスタンスとして生成された変数名mariaが参照する実体はRObjectで
あり、このmariaを生成する基となったDeepseaクラスはRClassが実体となる
はずです。
そして変数名mariaとして参照されるRObjectに内包しているRBasicのメンバー
であるklassポインタがDeepseaクラスであるRClassを指しているという構図と
理解できます。

そしてこの時に変数名mariaとして参照されるRObjectのメンバーであるnumiv
にはインスタンス変数の合計数として「4」という数値が入っており、そして
ivptrポインタはこのオブジェクトのインスタンス変数の値となる要素を四つ
持っている配列を参照していることになります。

この水深でもかなり息苦しくて金槌の筆者は溺れそうになってきましたが、
ついでにもう少しだけ潜ってみることにします。

ここまでのソースコードでivptrやklassなどの各所でポインタの型として指定
されているのがVALUEですが、このVALUE型を探してみるとtypedefされていました。

typedef uintptr_t VALUE;
もしくは、
typedef unsigned long VALUE;

内部的にRubyは何等かの値への参照は、すべてVALUEポインタを用いるのだそうです。
先ほど例示したRubyのコードでは、変数mariaの本性がまさにVALUEポインタで
あります。つまり、ユーザ定義のインスタンスを生成してそのオブジェクトを
指し示す際の変数、まさにこの変数の実体がVALUEポインタであり、インスタンス
であるRObjectを指しているのです。

VALUEについてはもう一つ大事な情報があります。

Rubyの世界ではすべての値がオブジェクトとして用意されることで、プログラム
中で透過的に扱えることがとても有効なのですが、組み込みタイプの基本データ
型である整数や文字列、浮動小数点数、シンボルなどのオブジェクトも実体は
RObjectであると考えるのが妥当ですが、どうやら違うのだそうです。

基本データ型は汎用的なRObjectではなく、異なる構造体を用いるのだそうです。
例えば、文字列だと RString構造体が用意されています。

struct RString {
struct RBasic basic;
union {
struct {
long len;
char *ptr;
union {
long capa;
VALUE shared;
} aux;
} heap;
char ary[RSTRING_EMBED_LEN_MAX + 1];
} as;
};

そして浮動小数点数にはRFloat構造体がありました。

struct RFloat {
struct RBasic basic;
double float_value;
};

同様に配列にはRArray、正規表現にはRRegexp構造体がそれぞれ用意されますし、
他にもハッシュやIO、File、Socketなども専用の構造体が用いられます。
これらはユーザ定義クラスとは異なり、基本データ型として特定の情報を保持
できるように最適化されていると考えることができます。
但し、RStringもRObjectと同じくRBasicが含まれていることから、ちゃんと特定の
クラスであることを示すことができますのでRubyオブジェクトとして同等に扱える
仕組みとなっていることが理解できます。

加えて、小さな整数(Fixnum)やシンボル(Symbol)のオブジェクトに至っては
更なる最適化が為されていました。VALUEポインタ自体に値を保持しているのです。

前述の様にVALUEは数値型ですから、そのままVALUEに整数値を保持しているのです。
そして下位ビットをフラグとして使うことで、どのオブジェクトかを表現するのです。
Fixnumの場合には、最下位ビットを「1」とすることで数値のクラスだと分かるのです。
この様にすることで余計な構造体を使わずに値そのものをVALUEに埋め込み、その上に
オブジェクトであることも表現しています。これにより最適化に大きく貢献できる
という工夫がされているのです。

列挙型として定義されているフラグの一覧を見つけました。

enum ruby_special_consts {
#if USE_FLONUM
RUBY_Qfalse = 0x00, /* ...0000 0000 */
RUBY_Qtrue = 0x14, /* ...0001 0100 */
RUBY_Qnil = 0x08, /* ...0000 1000 */
RUBY_Qundef = 0x34, /* ...0011 0100 */

RUBY_IMMEDIATE_MASK = 0x07,
RUBY_FIXNUM_FLAG = 0x01, /* ...xxxx xxx1 */
RUBY_FLONUM_MASK = 0x03,
RUBY_FLONUM_FLAG = 0x02, /* ...xxxx xx10 */
RUBY_SYMBOL_FLAG = 0x0c, /* ...0000 1100 */
#else
(省略)
};

整数(Fixnum)のみならず、シンボル(Symbol)やtrue, false, nilなどの
擬似変数までもが同じくフラグで表現されていることが伺い知れましょう。

ここまでの海底散策では、Rubyではオブジェクトの実体を構造体など(RObject,
RString, ... )で表現し、扱うときは常にVALUEポインタ経由で扱います。
構造体はクラスによっては違う型を使いますが、ポインタはどの構造体を指し
示す場合でも常にVALUE型を使います。そして時にはVALUE型がポインタではなく
値そのものである事までもが分かりました。

今回は深淵なるRubyの海の底に向かって、ちょっとだけ深く潜ってみました。
続きの機会があれば、また潜ってみたいと思います。
くどいですが筆者は金槌なのです。
それでも、深い海の底で聖母に逢えたような気がしたので「深海マリア」と
題させて頂きました。ご本尊のほうが、もっとしっくりくるかもしれません。

タイトルとした「深海マリア」ですが、日本のバンドである "VANIRU" の
1st アルバム 「MASQUERADE OF COSMIC」(マスカレード・オブ・コズミック)
に収録されている楽曲名でもあります。今年3月に発売された2nd シングル
「LOVE AGAIN」にも「深海マリア」の別バージョンがカップリングとして収録
されています。最近のヘビーローテーションです。

そして以前のニュースなのですが、日本列島から南方百キロの海底にある
小笠原海台で日本の潜水調査船「しんかい6500」が奇妙なものを見つけたのが
話題になりました。その奇妙なものとは、水深約五千八百メートルでみつけた
珊瑚礁が変成した巨大な石灰岩ですが、まるで「やさしく微笑む聖母マリア像の
ようだ」と見つけた研究者は思われたそうです。まさしく「深海マリア」です。
ご興味あればですが、海洋研究開発機構(JAMSTEC)のホームページで
「しんかい6500」の撮影した映像が公開されており、このマリア像をご覧に
なれます。

この奇蹟のマリア像も数万年後には消えてしまう運命だそうです。しかしながら、
数万年という膨大な時間軸を前に置かれてしまいますと、見られる対象よりも
見る側そのものが一瞬で消え去ってしまうのではと考えてしまい、何を以て儚い
と云えるのかが微妙ではないのかと拙い妄想に駆られてしまいます。

次回もお楽しみに。


■お問合せ・ご意見・ご感想は◆CTC教育サービス◆窓口まで━━━━━━━
シーティーシー・テクノロジー株式会社 エデュケーションサービス部
E-Mail: kyouiku@ctc-g.co.jp / TEL: 03-5712-8700

Comment(0)