JuniperのMXでport-mirroringしたときのメモ。

MXでのポートミラーリングには2種類あって、L3(family inet)とL2(family bridge)のミラーリングがある。
L2ポートをミラーできるのはミラー元もミラー先もL2じゃなきゃできない。
つまり、IPの振ってあるポートからL2のポートにはミラーできない。

とりあえず、L2のコンフィグを。

###ミラー先インタフェースの設定
[interfaces ge-X/X/X]
encapsulation ethernet-bridge;
unit 0 {
    family bridge;
}

[forwarding-options]
port-mirroring {
    input {
        rate 1;
        run-length 0;
    }
    family vpls {
        output {
            interface ge-X/X/X.0;
            no-filter-check;
        }
    }
}

##Bridge Domainの設定
[bridge-domains]
mirror {
    domain-type bridge;
    interface ge-X/X/X.0;
}

で、このフィルターをミラー元インタフェースに適用する。
これによってミラーリングされる。
[firewall family bridge]
filter mirror {
    interface-specific;
    term 1 {
        then {
            accept;
            port-mirror;
        }
    }
}

bridge-domainとかrun-lengthとか新しい言葉がでてきましたが、これらについてはまた今度。
JuniperのEXスイッチはもっと簡単にポートミラーできるようです。
Juniper MX Series/Oreilly & Associates Inc
¥7,126
Amazon.co.jp
これで出来てるのかな?
一応IPSEC SAは確立できているみたいだけど。
やっぱエンドエンドで確認したいな。

●コンフィグ

vyatta@vyatta# show | no-more 
 interfaces {
     ethernet eth0 {
         address dhcp
         hw-id 08:00:27:77:2d:19
     }
     ethernet eth1 {
         address 172.20.0.1/16
         hw-id 08:00:27:c1:64:8c
     }
     loopback lo {
     }
 }
 protocols {
     static {
         route 0.0.0.0/0 {
             next-hop 192.168.0.1 {
             }
         }
     }
 }
 service {
     ssh {
     }
 }
 system {
     config-management {
         commit-revisions 20
     }
     console {
     }
     login {
         user vyatta {
             authentication {
                 encrypted-password $1$4XHPj9eT$G3ww9B/pYDLSXC8YVvazP0
             }
             level admin
         }
     }
     ntp {
         server 0.vyatta.pool.ntp.org {
         }
         server 1.vyatta.pool.ntp.org {
         }
         server 2.vyatta.pool.ntp.org {
         }
     }
     package {
         repository community {
             components main
             distribution stable
             url http://packages.vyatta.com/vyatta
         }
     }
     syslog {
         global {
             facility all {
                 level notice
             }
             facility protocols {
                 level debug
             }
         }
     }
 }
 vpn {
     ipsec {
         esp-group IPSEC {
             lifetime 3600
             pfs enable
             proposal 1 {
                 encryption 3des
                 hash sha1
             }
         }
         ike-group IPSEC {
             lifetime 28800
             proposal 1 {
                 dh-group 2
                 encryption 3des
                 hash sha1
             }
         }
         ipsec-interfaces {
             interface eth0
         }
         site-to-site {
             peer 192.168.0.7 {
                 authentication {
                     mode pre-shared-secret
                     pre-shared-secret ipsec
                 }
                 ike-group IPSEC
                 local-address 192.168.0.6
                 tunnel 1 {
                     esp-group IPSEC
                     local {
                         prefix 172.20.0.0/16
                     }
                     remote {
                         prefix 172.16.0.0/16
                     }
                 }
             }
         }
     }
 }
[edit]
vyatta@vyatta# 

●確認手順
ISAKMP SAの確認(フェーズ1)
vyatta@vyatta:~$ show vpn ike sa 
Peer ID / IP                            Local ID / IP               
------------                            -------------
192.168.0.7                             192.168.0.6                            

    State  Encrypt  Hash  D-H Grp  NAT-T  A-Time  L-Time
    -----  -------  ----  -------  -----  ------  ------
    up     3des     sha1  2        no     1460    28800  

IPSEC SAの確認(フェーズ2)
vyatta@vyatta:~$ show vpn ipsec sa 
Peer ID / IP                            Local ID / IP               
------------                            -------------
192.168.0.7                             192.168.0.6                            

    Tunnel  State  Bytes Out/In   Encrypt  Hash  NAT-T  A-Time  L-Time  Proto
    ------  -----  -------------  -------  ----  -----  ------  ------  -----
    1       up     38.4K/38.8K    3des     sha1  no     1428    3600    all

 



[root@cent64 ~]# dmesg | grep eth
e1000 0000:00:03.0: eth0: (PCI:33MHz:32-bit) 08:00:27:36:c7:f0
e1000 0000:00:03.0: eth0: Intel(R) PRO/1000 Network Connection
e1000 0000:00:08.0: eth1: (PCI:33MHz:32-bit) 08:00:27:21:ee:96
e1000 0000:00:08.0: eth1: Intel(R) PRO/1000 Network Connection
udev: renamed network interface eth1 to eth2
e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
eth0: no IPv6 routers present
ADDRCONF(NETDEV_UP): eth2: link is not ready
e1000: eth2 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
ADDRCONF(NETDEV_CHANGE): eth2: link becomes ready
8021q: adding VLAN 0 to HW filter on device eth0
8021q: adding VLAN 0 to HW filter on device eth2
eth2: no IPv6 routers present
e1000: eth0 NIC Link is Down
e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
device eth0 entered promiscuous mode
device eth0 left promiscuous mode

たまに迷うのでメモメモ。

.append( content [, content] )
・appendChildに近い動作をする
・$(A).append(B)とした場合、A要素の末尾(終了タグ前)にBが追加される
-------------------
<body>
  <p>I would like to say: </p>
<script>
  $("p").append("<strong>Hello</strong>");
</script>
</body>
--------------------
結果:I would like to say: Hello



続いてappendTo()

.appendTo( target )
・引数がtargetであることに注意!!(コレ大事!!)
・$(A).appendTo(B)とした場合、BにAが追加される

-----------------------------
<body>
  <span>I have nothing more to say... </span>
  <div id="foo">FOO! </div>
<script>$("span").appendTo("#foo"); // check append() examples</script>
</body>
----------------------------
結果:FOO! I have nothing more to say...

なるほど。
TomcatのdoGetメソッドのソースを読んでみました。

今回読んだのはこのファイルです。
\apache-tomcat-7.0.27-src\java\javax\servlet\http\HttpServlet.java

doGetメソッドと言えば、サーブレットでオーバーライドする基本的なメソッドなので相当量のコードが書いてあると思いきや、たった数行でした。
--------------------------
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException
    {
        String protocol = req.getProtocol();
        String msg = lStrings.getString("http.method_get_not_supported");
        if (protocol.endsWith("1.1")) {
            resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
        } else {
            resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
        }
    }

-----------------------------------

処理の流れとしては、プロトコルがHTTP1.1だったら、if節を実行する。それ以外だったら、else節を実行するという感じだと思います。

で、if、elseどちらもsendErrorというメソッド名からなんらかのエラーを送信していると思われます。
つまり、doGetメソッドをオーバーライドしなければエラーが出るという仕組みになっているようです。実際にオーバーライドせずに実行してみると

「HTTPステータス 405 - HTTPのGETメソッドは、このURLではサポートされていません。」

と表示されます。
抽象クラスやインタフェースではなく、オーバーライドが必要ないために、こういったワザができるんだと思います。

ちなみにdoPostメソッドも同じようなコードでした。


Javaの練習がてらPythonの組み込み関数であるrangeを作ってみました。



import java.util.ArrayList;

public class MyPy {
public static final ArrayList<Integer> range(int stop) {
return range(0, stop, 1);
}

public static final ArrayList<Integer> range(int start, int stop) {
return range(start, stop, 1);
}

public static final ArrayList<Integer> range(int start, int stop, int step)
throws IllegalArgumentException {
ArrayList<Integer> result = new ArrayList<Integer>();

if (step == 0) {
throw new IllegalArgumentException(
"ValueError: range() step argument must not be zero");
}

if ((start > stop && step > 0) || (start < stop && step < 0)
|| (step == 0)) {
return result;
}

for (int i = start; (step > 0 ? i < stop : i > stop); i += step) {
result.add(i);
}
return result;
}
}


スーパークラスのクラス変数はサブクラスにも共有されます。
もちろん、サブクラスで同じ名前の変数の利用は可能です。

-----------------------------------------------
class ClassA {
public static ClassA last = null;
public String name;
public static int count;

public ClassA(String name) {
System.out.println("Here is ClassA.");
this.name = name;
last = this;
count++;
}

public ClassA() {
}
}

class ClassB extends ClassA {
public ClassB(String name) {
super(name);
System.out.println("Here is ClassB.");

}

public ClassB() {
}
}

class ClassC extends ClassB {
// クラス変数の上書きは可能
// public static int count = 123;

public ClassC(String name) {
super(name);
System.out.println("Here is ClassC.");
}
}

public class ClassVariable {
public static void main(String[] args) {
ClassA a1 = new ClassA("mito");
ClassA a2 = new ClassA("Tom");

System.out.println();
ClassB b1 = new ClassB("furo");

System.out.println();

ClassC c1 = new ClassC("mopu");

System.out.println(ClassA.last.name);
System.out.println(ClassB.last.name);
System.out.println(ClassC.last.name);

System.out.println(ClassA.count);
System.out.println(ClassB.count);
System.out.println(ClassC.count);
}
}
----------------------------------------------

ClassAを継承しているClassB、ClassCのインスタンスを生成してもClassAのクラス変数であるcountがインクリメントされます。

Javaを初めて2週間、焦らず足元から固めていきます。


先日ミスった問題。

本来はガベージコレクションの問題ですが、オブジェクト指向の基本が理解できていなかったので、書きます。
------------------------------------------
public class Test {

public static int num1 = 90;
public int num2 = 80;

// main
public static void main(String[] args) {
System.out.println(num1);
System.out.println(num2);

}
}
------------------------------------------ 

実はこれコンパイルエラーになります(当たり前?)

num1はクラス変数なので問題ありませんが、num2はインスタンス変数なので、Testクラスをインスタンス化しないと使えません。
故に、num2をsysoutしている箇所でコンパイルエラーが発生します。


考えてみれば単純なことですが、見逃してしまったwww

現在、ボクは修士課程を修了し社会人になろうとしています。
周りからはただのニート学生と見られている気がしますが、個人的には収穫があったのでそれについて書きます。


●大学院で学んだたったひとつの事
ボクが大学院で学んだ最も大きな事は、『型のパワー』だ。
「型」とは、フレームワーク(枠組み)であり、先人たちによって築かれてきたものである。
平たく言えば先人の知恵である。
具体的な型の例としては、英語の構造、論文の構造、思考法、作曲法、ファッションなどあらゆるレベルのものがあげられる。


それぞれの型には目には見えない空欄があり、そこにパラメータを設定するだけで、ある程度の品質のものが完成する。
英語を例にすると、型とはいわゆる文法、パラメータは名詞、動詞、副詞、形容詞など各種要素である。

論文の場合は、型とは「はじめに」~「おわりに」の流れで、パラメータは各パラグラフとなる。
パラグラフ内の構造もパターンが限られており、共通するのはトピックセンテンスを修飾するということだ。
(これはパラグラフライティングというヤツ)

また、思考法というと広いので、アイデアのつくり方という側面で言うと型は「情報収集」→「資料の咀嚼、加工」(ここで絶望を味わう)→「放置」→「ひらめき」の過程、パラメータは情報収集フェーズにおける資料や放置フェーズの刺激といえる。(詳しくは、ジェームズ・ヤングの「アイデアのつくり方」を参考に)


ここで重要なのはこれらの型は技術であり、センスとは関係なく習得可能であるということだ。
センスが必要なのはその先である。
英語を読み書きするのも技術であり、アイデアを出すのも技術、作曲もある程度までは技術である。
このようにそれぞれの領域ごとに適切な型を学べば、初心者でも一定の品質のアウトプットができる。
原理が分からなくても答えを導ける、数学の公式のようなものだ。


型のもう一つのパワーとして、成果物に型の一部が包含されていると、スタンダードな型との差異から成果物を評価することができるという点がある。
例えば、英文のSVOという平叙文がVSOとなったら平叙文と差異が発生し、この差異部分が重要であることが分かる。


スタンダードな型からどのような差異を発生させるか、ここが難しいところだ。

まとめると、ボクが学んだのは、英文法やライティング技法など個々の知識、技術ではなく、あらゆることにフレームワークが存在し、それらは技術であるため習得可能であるということです。