このブログを検索

2010/11/05

print reverse<>;

引数に指定したファイルの内容をすべて表示するperlスクリプトを書け、と言われたら、私なら以下のように書く。

open IN,"<".$ARGV[0];

while(){
    print;
}


そしてperlって簡単だなァ・・・とニタニタする。しかし、実は以下のように書けばいいのである。

while(<>){
    print;
}


そしてもっと恐ろしいことには、

print <>;


でよい。そして、このときの引数は複数あってもよい。指定されただけのファイルについて、内容を表示する。そして、以下のようにすると、ファイル内容を逆順に、つまり最後の行から順に先頭の行まで表示する・・・

print reverse<>;


・・・・・。これは、実は一番最後のスクリプトを見たのである。そして、これでこうならもしかして、と、今書いたのと逆にさかのぼっていったのである。

これは、「初めてのPerl」からのネタです。「初P」では「ダイヤモンド演算子」ということでその使い方が説明してあるのでそれを読んでいればわかることですが、私はここを飛ばしていたのです。そして5章のハッシュのところを読み、最後の問題の答えを見ていたら、6章の答えである

print reverse<>;


が目に入ったわけです。今日は仕事がちょっとヒマだったので「初P」を読んでいたのですが、何度か吹き出しました。こういう冗談って、なかなか書けないですよね。絵文字も、(笑)ともかかずに、マジメな顔してあきらかに冗談であることがわかる文章を書くのって、難しいものです。

オブジェクト指向@perl

これもほぼ丸パクリである。

元は車だったのだが、人間に変えた。

package Man;

sub new{

    my $this = shift;
    my ( $name, $gender ) = @_ ;

    print "$nameさんが誕生しました。\n" ;

    my $man = {"Name" => $name,
    "Gender" => $gender,
    "Age" => 0,
    "Money" => 0 } ;

    bless $man, $this;
    return $man ;

}

# デストラクタ
sub DESTROY{

    my $this = shift;
    print "$this->{Name}($this->{Age})さんが死にました。\n";

}

sub tosi{
    $this = shift ;
    $this->{Age}++;
    print "$this->{Name}さんが$this->{Age}才になりました。\n\n" ;
}

sub tellage{
    my $this = shift;
    print "わたしは$this->{Name}、$this->{Age}才です。\n";
}

package main;

my $taro = new Man "太郎", "Male";

my $hanako = new Man "花子", "Female";

$taro->tosi;

print"\n";

$taro->tosi;

$hanako->tellage;
$hanako->tosi;
$hanako->tosi;
$hanako->tosi;
$hanako->tosi;
$hanako->tellage;

print"\n";


実行した結果。

C:\>perl man.pl
太郎さんが誕生しました。
花子さんが誕生しました。
太郎さんが1才になりました。


太郎さんが2才になりました。

わたしは花子、0才です。
花子さんが1才になりました。

花子さんが2才になりました。

花子さんが3才になりました。

花子さんが4才になりました。

わたしは花子、4才です。

太郎(2)さんが死にました。
花子(4)さんが死にました。

C:\>


最後の「死にました」は、何もしていないのに表示される。

終了するときに自動的にデストラクタが動いているようだ。

こういうものは、「C++入門」とかを読んで何度かやってみたことがあるが、いつもサンプルを写して、一部を今回のように変えて、「フーン・・・」で終わっている。おもしろそうだな、とは思うのだが・・・。

2010/10/31

動的に二次元配列を作成する

$ref_array1 = [apple, banana, cherry, donkey];
$ref_array2 = [monkey, dog, cat, fish, horse, sheep];

push(@a,$ref_array);
push(@a,$ref_array2);

このようにして、配列のリファレンスを変数に格納し、それを配列にpushしていくことはできる。

しかし、STDINとか、ファイルを読むとかして作る配列を、同じようにpushできない。

while(){
    chomp;
    @b=split / /, $_;
    push (@a,@b);
}


こういう風にすると、単に配列を追加するだけになる。そうではなくて、2次元配列にしたい。

dog cat horse
orange banana apple


と入力したら、

@a=([dog cat horse],[orange banana apple]);


という配列にしたいのである。

while(){
    chomp;
    @b=split / /, $_;
    $ref=\@b;
    push (@a,$ref);
}

for $i (0 .. $#a) {
    for $j (0 .. $#{$a[$i]}) {
        print '$a[' . $i . '][' . $j . ']=' . $a[$i][$j] . '   ';
    }
    print "\n";
}





固定文字列のときは、スカラー変数に[]で囲った配列を代入し、そのスカラー変数を配列にpushしたから、

$ref=\@b


として、それを同じように配列にpushしたらできるのかと思ったら、

a b c
d e f
^Z

$a[0][0]=d   $a[0][1]=e   $a[0][2]=f
$a[1][0]=d   $a[1][1]=e   $a[1][2]=f


という風になってしまう。2行目は望みどおりの結果なのだが、1行目も2行目と同じになってしまっている。


「スカラー変数」
「配列」
「リファレンス」
「[]で囲って,で区切ったた複数の文字列」
「()で囲って,で区切った複数の文字列」
「配列に\をつけたもの \@array」
「スカラー変数に\をつけたもの \$var」

これらの意味がよくわからず混同している。

[]で囲った文字列を「無名配列」と呼び、

$ref = ["apple", "orange", "banana"];

のようにした時、$ref に代入されるのは「無名配列へのリファレンス」だそうだ。

つまり、$ref には配列そのものの値が入っているのではなく、配列へのポインタが入っている。だから、さっきのスクリプトでSTDINが2行入力されたときに、1行目のポインタの内容が2行目で上書きされ、@aに入っているポインタが指す内容が同じになる、というわけか。

じゃあどうすればいいのか・・・。リファレンスについては、「続・はじめてのPerl」に書いてあるそうだ。買わなきゃだめか・・・。

while () {
    chomp();
    push(@a, [ split(" ") ]);
}

for $i (0 .. $#a) {
    for $j (0 .. $#{$a[$i]}) {
        print '$a[' . $i . '][' . $j . ']=' . $a[$i][$j] . '   ';
    }
    print "\n";
}

とりあえずこれで、やりたいことはできた。某所からの丸パクリであるが。

2010/10/23

MeCab

MeCabというものを知った。あの、食べる「めかぶ」だ。日本語の形態素解析をするソフトである。Yahooのapiとか、「ちゃせん」とかいろいろあるようだが、これが新しくて速いようだ。

形態素解析という言葉は、何度か耳にしている。初めて聞いたのは、コールセンターなどに寄せられた問い合わせ内容を分析するソフトの説明を聞いたときだ。その後、いわゆる「人口無能」というもの、「意味不明だがなんとなく文章として成立している」というものを作るのに使われているということだった。

「言葉をコンピュータで解析する」とか、自動翻訳とかいうものについては、私はとても否定的に考えている。つまり、「そんなのはムリだ」という考えである。実際、形態素解析を使って一番おもしろいのは「無能」であり、自動翻訳はせいぜい、その文章に含まれる単語を辞書で引いて並べるくらいのことしかできていない。

私は語学は好きだが、外国語を読むというのはつまり辞書を引くことである。そして、辞書を引くというのはある単語をリストのなかから探すことでは、ない。それだけなら、コンピューターでできるだろう。

しかし、まったく未知の文章を辞書をひいて理解しようとした人にはわかるだろうが、辞書があっても引けないことがある。まずは動詞の活用。辞書に載っている動詞は原型だけである。そして動詞の活用の仕方は多様で、単純に規則化することもできない。それから同音意義語や、特別な言い回し、とにかく例外だらけなのである。

文法という、なまじ法則化されたようなものがあるから、人は言葉を科学的に扱おうとするが、結局言葉は科学の対象にはならない。極端なことを言うと、言葉というのは科学を拒否するものである。自動翻訳の精度もずいぶん向上したようだが、聞いた話ではとにかく大量の例文を持つそうである。そしてその中から同じ表現をさがしてくる、という方法がとられているようだ。

話がそれたが、perlでmecabを使ってみた。職場のWindows XPで、active perlで使ってみた。おもしろそうなので続きは家で、と思ったら、xpで使えたモジュールがvistaでインストールできなかった。vistaはよく俺を困らせる。

しかし、私はvistaを使うことをやめない。もうvistaもリリースされてずいぶんたつ。これだけたってvistaに移植されていないのには、理由があるのだ。だが、私にはさくらインターネットのレンタルサーバがある。さくらに最近mecabがインストールされたという情報を見て、sshで入って使えることを確認している。cygwinも、virtual pcもいらない。私はすでにfreebsd(だっけ)が動くサーバを持っているのだ。

さて、ではさくらでめかぶを。と、その前にcgiを動かすだけでひと騒動。まず、cgiを動かすディレクトリは決めてある。そしてパスワードを設定してある。パスワードが何か忘れている。なんとか思い出す。mecabを呼ぶperlが動くことをsshで確認する。しかしcgiにするとinternal server errorになる。いろいろ悩んだ末、permissionが777だと動かないことがわかる。755にしたら、動く。

#!/usr/bin/perl -w

use strict;
use Encode;
use MeCab 0.97;

open IN,"<jpsjis.txt";

print "Content-type: text/html\n";
print "\n";
print "<h3>mecab test</h3>\n";

while(<IN>){
    my $str = $_;

    my $t = new MeCab::Tagger("-Owakati");

    Encode::from_to($str, "Shift_JIS", "EUC-JP");
    $str = $t->parse($str);

    Encode::from_to($str, "EUC-JP", "Shift_JIS");
    print "<p>$str</p>\n";
}
close IN;


このソースは、shift_jisで保存してあり、読み込むファイル 「jpsjis.txt」もshift_jisである。そのため、エンコード処理が入っている。

私のcgiは全部UTF8にしており、これもUTF8にしてエンコードなどしたくなかったのだが、utf8だとどうしてもうまくいかない。mecabがeuc-jpなのだろうか?cgiをやるときはいつも日本語の文字コードで悩む。日本人のハンデである。

このスクリプトは日本語でかかれた文章を形態素で「分かち書き」するだけのものである。とりあえずmecabをcgiで動かすテスト用スクリプトである。

本当にやりたいことのひとつが、アクセスログの検索後から名詞を抜き出すことだ。webalizerの検索語一覧は、複数の検索文字列をそのまま表示するので、同じ名詞が含まれていても別の検索語としてカウントされる。

"delphi  ics ftp"
"delphi コンポーネント テキスト ルビ"
"delphi ハードコピー bitblt"


というようになる。この場合、"delphi"というキーワードを数えたいのである。私のサイトだと、"delphi", "tokai", "トーカイ", "whea-logger" などがこれで数えられて上位にランクされるはずだ。

次にやりたいのが、人口無能、あるいはbot、のようなもの。すでにtwitterにたくさんあるbotである。

これらは形態素解析するだけでなく、それを再構成する必要がある。このときに使われるのが「マルコフ連鎖」とかいうリクツである。マルコフなんたらがどういうことなのかはなんとなくわかるのだが、はっきりとはわからない。だが、少なくとも形態素で分解できてその品詞まで判定してもらえば、あとはなんとかなりそうだ。

#!/usr/bin/perl -w

use strict;
use Encode;
use MeCab 0.97;

open IN,"<jpsjis.txt" or die;

print "Content-type: text/html\n";
print "\n";
print "<h3>mecab test</h3>\n";


while(<IN>){
    my $m = new MeCab::Tagger ("");
    my $str2 = $_;

    Encode::from_to($str2, "Shift_JIS", "EUC-JP");

    for (my $n = $m->parseToNode ($str2); $n ; $n = $n->{next}) {
        if($n->{posid}==38){
            my $surf=$n->{surface};
            Encode::from_to($surf, "EUC-JP", "Shift_JIS");
            print $surf."<br>";
        }
    }
}

close IN;


これで名詞だけを抜き出せる。$n->{posid} というのが品詞IDで、これは自由に設定できるようだが、さくらでは38になっていた。区別さえできればよいので、そのまま、「38だったらと」いう条件で$n-{surface}を表示した。

そして文章のなかで名詞の出現回数をかぞえるには、名詞を保存していき、すでにあるかを検索して、

なかったら追加する、ということをすればよい。私がやろうとしている規模であればたいしたことはないが、大量に処理するならDBが必要かな。

今、「英単語はどうなるのかな」と思ってアクセスログを読ませてみたら、逆に英単語しか表示されない。そう、日本語はエンコードされているからデコードしないといけないのだ。メンドクサイ・・・。

ログから検索文字列を抜き出し、それをデコードする処理が必要だ。これは以前作ってある。

さっきeuc_jpでデコードするのがどうこう、と言っていた件は、めかぶの辞書がeuc_jpだからだそうだ。そして辞書をUTF8に変更できるようだ。あとでやろう。

さくらのログを表示させようとして、残っているのが前日の日付であることに気づいた。1日引けば・・・と思ったところで月初だったら、年初だったら・・・とそう単純ではないことに気づいたが、

調べると簡単にできた。

my $yesterday = DateTime->now->subtract( days => 1 );


とりあえずmecabがどんなものか試すスクリプト。htmlからpostしたテキストを形態素に分割して品詞等を表示する。

#!/usr/bin/perl -w

use strict;
use CGI;
use utf8;
use Encode;
use MeCab 0.97;


my $q= CGI->new;

my $value=$q->param('text');

print $q->header(-charset=>'utf-8'),
$q->start_html(-title=>'mecab'),
$q->p($value),
$q->br;


print "\n";
print "<hr>\n";

my $m = new MeCab::Tagger ("");
my $str2 = $value;

Encode::from_to($str2, "UTF8", "EUC-JP");

for (my $n = $m->parseToNode ($str2); $n ; $n = $n->{next}) {

    my $surf=$n->{surface};
    Encode::from_to($surf, "EUC-JP", "UTF8");
    print '<font size="5">'.$surf.' </font>';

    my $feature=$n->{feature};
    Encode::from_to($feature, "EUC-JP", "UTF8");

    print '<font size="2">'.$feature.' </font>';

    print '<font size="1">'.$n->{posid}.' </font>';

    if($n->{posid}==4){
        print "<br><br>";
    }
    if($n->{posid}==9){
        print "<br>";
    }
}

print $q->end_html;

exit;





cgiを呼び出すhtml。cgiもこのhtmlファイルも、文字コードはutf-8で保存する。

<html lang="ja" xml:lang="ja" xmlns="hxtp://www.w3.org/1999/xhtml">
<head>
<meta hxtp-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>just post</title>
</head>
<body>
<form action="meca6.cgi" target=_self method=post>
<textarea name="text" rows="20" class=input cols="100"></textarea><br>
<input type=submit value="post">
</form>
</body></html>


とりあえず名詞の抽出をする。頻出単語を数えるなどをしてみるが、一般名詞と固有名詞の区別も簡単ではない。たとえば「中国国家発展改革委員会」という言葉は

中国[47]国家[38]発展[36]改革[36]委員[38]会[51]

という風に分離される。カッコ内の数字は品詞の種類を表す数値である。こういうものはくっつけたいが、なんでもくっつけるわけにもいかない。とりあえず、いろんな文章を形態素分離させてみて、どういうパターンがあるかを見て、38->36はくっつける、などとひとつひとつ決めていくしかないか。

「人口無能」であれば、その辺はテキトーにやって、頻度や乱数をつかって文章を切り貼りしていけばいい。だが、まったくの「無能」ではやっぱり面白くない。「圧縮新聞」はそれを新聞でやることによって、ある程度のもっともらしさを保っている。ツイッターのツイートやブログなどでは、文体が多様すぎて混沌としすぎる。

2010/10/02

BSCI合格

受かった・・・。844点・・・。危なかった・・・。「簡単じゃん」と思ったが、どうやらシミュレーションを間違えたようだ。シミュレーションはあまり時間をかけられないと思いろくに確認せずに終わった。確認コマンドで何を入力したかも採点されるのか?それはないか・・・。時間は10分くらいあまったかな。最後に「次へ」を押してかなり待った。3分くらい?もっと?待ちながら、『だいじょぶだいじょぶ、受かったって、絶対ダイジョブ、900点くらい取れてるって』と心の中でつぶやいていた・・・。達成感よりも安堵感、そして得点がイマイチだったことにちょっとがっかりした。

今回はガイドも買わず、クラムメディア問題集もやらず、買ったのは黒本のみ。マルチキャストの本も買ったがほとんど読まず。実機は2610を3台、合計で1万円くらいを買って、dynamipsも使った。これなしには絶対に受からなかっただろう。2610のみでも、dynamipsのみでもダメだったと思う。勉強期間は、3ヶ月弱。けっこう時間はかけた。効率はあまりよくなかったかもしれないが。おかげで問題を読んで意味がわからないものはほとんどなかった。いつもは数問は何を言っているのかすらわからないものがあるものだが。


ciscoのCLIは、何の変哲もないようで、非常に工夫されていて使いやすい。
今仕事で使っているルータとは雲泥の差だ。というのが一番感じたことだ。

だが、各プロトコルによる実装の違い、サマリーの仕方とか、パラメータの変更の仕方とか、show コマンドの名前の付け方とか、もうちょっと統一した一貫性のあるものにできないのかな、と思った。
おそらくプロトコルごとに開発者が違うのだろう・・・。

さて次だが、3月までにTSHOOTか、ISCWとONTのどちらかをとらねばならない。
TSHOOTは英語本を買ってあるのだが、パラパラと見るとcatalystとかwirelessとかQoSとかRIPngとか、いろいろあって大変そうだ。まあ、科目数が減ったわけだから試験範囲は広いのだろう・・・。英語でTSHOOTをとる気で、それも年内に、いたが、まず無理だろうな・・・。でも、それを目指すくらいで勉強してちょうどいいくらいだろう。

2010/10/01

BSCIの準備 BGPいろいろ

show ip bgp route というコマンドはない。 weightと、local preferenceと、MED、この3つの意味がさっぱりわからない。 WEBからの引用を貼る。

local preference
LOCAL_PREF属性は,IBGP専用の属性で,AS内のBGPスピーカーに,経路情報の優先度を知らせる用途で使います。 「低速回線のピアよりも高速回線のピアを使いたい」などという場合に使います。 IBGPで同じあて先の経路情報を複数取得したとき,LOCAL_PREF値の大きい方をベストパスとして採用します。 設定できる値は0~4294967295で,何も設定しなければデフォルトで100が設定されます。
内部ASのネイバールータに対して、外部ASへの優先パスを示す属性です。Local Preferenceはルータ自身に設定される値であり、Local Preference値はデフォルトで「 100 」です。この値は高い値を持つパスが優先され使用されます。Local Preference値は、同一のAS内のルータ間でのみ交換され、発信トラフィックに影響します。
Local Preference属性は、発信トラフィックに影響を与える属性。内部ASのネイバールータに対して、外部ASへの優先パスを示す。ルータ自身に設定する。デフォルト値は「100」。高い値を持つパスが優先される。
Local Preference値は、同一のAS内のルータ間でのみ交換され、発信トラフィックに影響する。
自AS内部において、他ASに行くときに、どの対外ルータを経由すべきか指定。 AS_PATHの長さよりもLOCAL_PREFの値が優先される。 上りのトラフィック制御に適用。
ローカル プリファレンスは AS に対する指標で、その AS から特定のネットワークに到達する際にどのパスが優先されるかを示します。ローカル プリファレンス値の高いパスが優先されます。ローカル プリファレンスのデフォルト値は 100 です。
ローカル ルータにだけ関連するウェイト アトリビュートとは異なり、ローカル プリファレンスは、同じ AS 内のルータ間で交換されるアトリビュートです。
MED
着信トラフィックに影響を与える属性
  • 外部ASのネイバールータに対して、自身のAS内への優先パスを示す。
  • 外部ASから自身のASへ、どのパスを優先させるのかを指示する唯一の属性
  • デフォルト値は、「0」
  • 低い値を持つパスが優先される。
  • MED属性を加えた経路情報が伝わるのはは隣接するASまでで、その次のASには伝わらない。

外部ASのネイバールータに対して、自身のAS内への優先パスを示す属性です。MEDはAS内部にどのようにしてトラフィックを流し込むのかを制御できる唯一の属性です。MED値はデフォルトで「 0 」です。MED値は低い値を持つパスが優先され使用されます。MED値はAS間で交換され、その渡されたAS内では搬送されそのAS内で使用されますが次のASに送信される事はありません。MEDは着信トラフィックに影響を与えます。
MED はオプションの非推移的なアトリビュートです。 MED は、複数のエントリ ポイントがある Autonomous System(AS; 自律システム)への優先パスに関して、外部隣接ルータへの手掛りとなります。 MED は、ルートの外部メトリックとしても認識されています。 大きな MED 値よりも、小さい MED 値の方が優先されます。
weight
ウェイト アトリビュートは、Cisco で定義されたアトリビュートです。このアトリビュートは、ウェイトを使用して最適なパスを選択します。ウェイトは、ルータにローカルに割り当てられます。この値が意味を持つのは、特定のルータだけです。この値は、別のルータに伝搬されたり、ルート アップデートによって伝達されたりはしません。ウェイトは 0 ~ 65,535 の数値を取ることができます。このルータが発信元のパスのウェイトはデフォルトで 32,768 に設定されており、他のパスのウェイトは 0 に設定されています。
WEIGHT属性はCisco独自の属性で、対象のルータでのみ使用される属性であり他のルータに伝達されることはありません。そのルータ自身が接続しているルートにはデフォルトで"32768"の値が割り当てられ、それ以外のルートの値は"0"になります。(WEIGHT値は0~65535で割り当てられる。)WEIGHT属性が大きいパスが優先されます。
メトリック
メトリック アトリビュートは、MULTI_EXIT_DISCRIMINATOR、MED(BGP4)、または INTER_AS(BGP3)とも呼ばれます。このアトリビュートは、AS への優先パスに関する外部隣接ルータへのヒントです。このアトリビュートは、AS への入口ポイントが複数ある場合に、特定のルートに到達するように、別の AS に対して動的に影響を与える方法を提供します。メトリックの値の小さい方が優先されます。
ローカル プリファレンスとは異なり、メトリックは AS 間で交換されます。別の AS に伝達されたメトリックは、その AS からさらに別の AS へ伝達されることはありません。特定のメトリックを持つアップデートが AS に到達すると、AS 内部ではメトリックを使用してルートが決定されます。同じアップデートが第 3 の AS に送信される場合、メトリックは 0 に戻ります。このセクションの図は、メトリックの設定を示しています。メトリックのデフォルト値は 0 です。
multi exit だから、出て行くトラフィックの区別かと思ったら逆で、入ってくるトラフィックを制御するとか・・・ でも、そもそも経路の比較に使うんだから、着信も発信もないと思うんだけどな・・・ ルーティングってのは全部出て行くトラフィックのためにあるんじゃないのか・・・?

BSCIの準備 bgp peer group

BGPのピアグループを設定してみる。

R1(config-router)#neighbor 10.1.1.2 ?
  activate                 Enable the Address Family for this Neighbor
  advertise-map            specify route-map for conditional advertisement
  advertisement-interval   Minimum interval between sending BGP routing updates
  allowas-in               Accept as-path with my AS present in it
  capability               Advertise capability to the peer
  default-originate        Originate default route to this neighbor
  description              Neighbor specific description
  disable-connected-check  One-hop away EBGP peer using loopback address
  distribute-list          Filter updates to/from this neighbor
  dmzlink-bw               Propagate the DMZ link bandwidth
  ebgp-multihop            Allow EBGP neighbors not on directly connected
                           networks
  fall-over                session fall on peer route lost
  filter-list              Establish BGP filters
  inherit                  Inherit a template
  local-as                 Specify a local-as number
  maximum-prefix           Maximum number of prefixes accepted from this peer
  next-hop-self            Disable the next hop calculation for this neighbor
  next-hop-unchanged       Propagate the iBGP paths's next hop unchanged for
                           this neighbor
  password                 Set a password
  peer-group               Member of the peer-group
  prefix-list              Filter updates to/from this neighbor
  remote-as                Specify a BGP neighbor
  remove-private-as        Remove private AS number from outbound updates
  route-map                Apply route map to neighbor
  route-reflector-client   Configure a neighbor as Route Reflector client
  send-community           Send Community attribute to this neighbor
  shutdown                 Administratively shut down this neighbor
  soft-reconfiguration     Per neighbor soft reconfiguration
  timers                   BGP per neighbor timers
  translate-update         Translate Update to MBGP format
  transport                Transport options
  ttl-security             BGP ttl security check
  unsuppress-map           Route-map to selectively unsuppress suppressed
                           routes
  update-source            Source of routing updates
  version                  Set the BGP version to match a neighbor
  weight                   Set default weight for routes from this neighbor

R1(config-router)#neighbor 10.1.1.2 peer-group ?
  WORD  peer-group name

R1(config-router)#neighbor 10.1.1.2 peer-group GROUP1
% Configure the peer-group first


まずpeer-groupを作りなさい、と言われる。
どこで作るのか?さがしたがわからない。
bgpでしか使わないから config-routerモードだと思うのだが・・・
調べてようやくわかった。

R1(config-router)#neighbor ?
  A.B.C.D     Neighbor address
  WORD        Neighbor tag
  X:X:X:X::X  Neighbor IPv6 address

R1(config-router)#neighbor GROUP1 ?
  activate                 Enable the Address Family for this Neighbor
  advertise-map            specify route-map for conditional advertisement
  advertisement-interval   Minimum interval between sending BGP routing updates
  allowas-in               Accept as-path with my AS present in it
  capability               Advertise capability to the peer
  default-originate        Originate default route to this neighbor
  description              Neighbor specific description
  disable-connected-check  One-hop away EBGP peer using loopback address
  distribute-list          Filter updates to/from this neighbor
  dmzlink-bw               Propagate the DMZ link bandwidth
  ebgp-multihop            Allow EBGP neighbors not on directly connected
                           networks
  fall-over                session fall on peer route lost
  filter-list              Establish BGP filters
  inherit                  Inherit a template
  local-as                 Specify a local-as number
  maximum-prefix           Maximum number of prefixes accepted from this peer
  next-hop-self            Disable the next hop calculation for this neighbor
  next-hop-unchanged       Propagate the iBGP paths's next hop unchanged for
                           this neighbor
  password                 Set a password
  peer-group               Configure peer-group
  prefix-list              Filter updates to/from this neighbor
  remote-as                Specify a BGP neighbor
  remove-private-as        Remove private AS number from outbound updates
  route-map                Apply route map to neighbor
  route-reflector-client   Configure a neighbor as Route Reflector client
  send-community           Send Community attribute to this neighbor
  shutdown                 Administratively shut down this neighbor
  soft-reconfiguration     Per neighbor soft reconfiguration
  timers                   BGP per neighbor timers
  translate-update         Translate Update to MBGP format
  transport                Transport options
  ttl-security             BGP ttl security check
  unsuppress-map           Route-map to selectively unsuppress suppressed
                           routes
  update-source            Source of routing updates
  version                  Set the BGP version to match a neighbor
  weight                   Set default weight for routes from this neighbor

R1(config-router)#neighbor GROUP1 peer-group ?
  nlri  Specify nlri type supported by peer-group
  <cr>

R1(config-router)#neighbor GROUP1 peer-group
R1(config-router)#neighbor 10.1.1.2 peer-group GROUP1
% Specify remote-as or peer-group remote AS first


remote-asを先に設定する。

R1(config-router)#neighbor 10.1.1.2 remote-as 65000

R1(config-router)#neighbor 10.1.1.2 peer-group GROUP1
R1(config-router)#end
R1#sho run

!
router bgp 65000
 no synchronization
 bgp log-neighbor-changes
 neighbor GROUP1 peer-group
 neighbor 10.1.1.2 remote-as 65000
 neighbor 10.1.1.2 peer-group GROUP1
 no auto-summary
!
!


やれやれ・・・