このブログを検索

2010/03/25

hash

hashの例。
$members;

while (<>){
    chomp;
    @inputs = split / /;
    $members{$inputs[0]} = $inputs[1];
}

while (<>){
    chomp;
    print $members{$_}."\n";
}
まず、フルネームを入力する。first nameとlast nameの間はスペースをいれる。

すると、それぞれのfirst nameをキーとして、family nameをハッシュとして登録する。いったんCtrl+Zを押す。今度は、first nameのみを入力する。

すると、それに対応するfamily nameが表示される。

C:\Users\t>perl mem.pl
John Lennon
Bob Dylan
Pete Townshend
^Z
John
Lennon
Pete
Townshend
John
Lennon
Bob
Dylan

2010/03/20

リファレンスによる多次元配列

while(<>){
    @tmp = split;
    push @LoL, [ @tmp ];
}

for $array_ref ( @LoL ) {
    print "\t [ @$array_ref ], \n";
}

リファレンスによる多次元配列の作り方と表示の仕方である。たったこれだけである。いろいろ情報をさがしたが、この7行に尽きる。プログラミングperlの4章にある。

public_timeline

public timelineというAPIがある。これは、そのときの最新の20個のつぶやきを表示するものである。APIはURLで指定し、xmlで帰ってくる。perlでは LWP::Simpleを使って、xmlを変数に格納する。

そこでかっこつけて「xmlをパースしよう」などと考えたのだが、めんどくさいので正規表現で必要なものを取り出してhtmlとして書いた。とりあえず、textと、アイコンと、screen_name。リロードしていくと、まず同じアイコンは見当たらない。なんせ世界中のtweetを見てるわけだから。「風速」はどれくらいなんだろう?

これだけ速くてなんの脈絡もないと、もはやtweetを読まないので、プロフィールにリンクしたアイコンだけを並べた。ひたすらF5を押して、目に留まったアイコンがあったらプロフィールを開く。

public_timelineは、url形式のapiを呼ぶことができたが、friends_timelineは、Net::Twitterを使った。これは便利ではあるが、さくらサーバで使えない。friendsも、homeも、url形式で使いたい。

2010/03/18

MACアドレステーブルとarpテーブル again

ぱっと聞くと両者は同じように思えるが別物である。利用者にはあまり意識することのないテーブルであり、とくにmac addressテーブルを参照することはほとんどないだろう。この二つのテーブルをそれぞれ一言で説明すると、arpテーブルとは、macアドレスとipアドレスの対応表、mac addressテーブルとは、macアドレスとポートの対応表である。arpテーブルはL3通信で使用され、mac addressテーブルはL2通信で使用される。L3通信というのはL2通信を含むので、そういう意味ではL3通信をおこなう際には両方のテーブルを使用すると言うことができる。

arpテーブルの原理はわかりやすい。送信したい相手のIPアドレスに対応するMACアドレスを探すのである。テーブルに該当するIPアドレスがなかったらどうなるか?arpリクエストを送信して、その答えを待つ。先ほどL3通信といったが、arpキャッシュを参照するL3通信というのは、L3通信であっても同一ネットワーク内での通信に限られる。L3通信というのは、異なるネットワーク外への通信を含み、本来、それが目的の通信である。同一ネットワーク内の通信であれば、macアドレスだけでよいのである。

ルータはルーティングテーブルを見て、宛先IPアドレスがconnectedの経路であることを知ると、arpキャッシュを参照する。そして宛先macアドレスを知る。普通のルータであればここで話は終わる。ここから先はL3スイッチとか、ルータでもLAN側に複数ポートがあるようなものの話だ。

ブロードバンドルータでもそのようなものが多い、というかほとんどがそうであろう。この時には、出力ポートを選ぶのにMACアドレステーブルを使用する。MACアドレスとポートの対応表である。arpキャッシュの場合は見つからないときにはarp requestを送信したが、L2通信の場合は見つからないときはすべてのポートから送信する。これをフラッディングという。

MACアドレスを学習するのはフレームを受信したときで、そのときにそのポートにそのMACアドレスを持つ装置が接続していえることを学習するのである。

half duplexとfull duplex

最近のPCおよびルータ、スイッチは、ほぼ100%full duplexで運用されているはずです。しかも、固定ではなくauto設定で、ユーザーはもちろん管理者もduplexについてはほとんど意識することはないでしょう。

しかし、最新の装置でも、固定設定は可能でhalf duplexを設定することもでき、half duplexで通信することができます。

half duplexというのは、2つのノード間で通信をおこなう際に、送信と受信を交互におこない、送受信を同時におこなうことができません。

full duplexでは送受信が同時に可能であり、100Mbpsのfull duplexであれば、送信を100Mbps、受信を100Mbpsで同時に通信できるので、実質200Mbpsの通信が可能ということになります。

あるノード間がhalf duplexでリンクされている場合に、各ノードから同時に通信をおこなうと、コリジョンが発生し、完全な通信がおこなえません。

では、どうしてhalf duplexが設定できるようになっているのでしょうか?
half duplexを設定しなければならないのはどういう場合でしょうか?

「full duplexに未対応の装置との互換性を保つため」というのが答えだと考える人が多いでしょう。

しかし、厳密に言うとそうではなく、「Ethernetの規格を満たすため」です。

half duplexの通信がおこなえない装置はethernetの規格を満たしているとは言えないためです。

では、どうしてethernetの規格はhalf duplexを規格に残しているのでしょうか。
ここまで考えていくと、ようやくhalf duplexが何であるかが理解できます。

現在のethernetはノード同士が「リンク」によって接続されているが、ethernet初期はそうではなく「バス」によって接続されていた。

バスというのは、一本のケーブルにたくさんのノードがぶら下がるような形である。

現在のetherネットでも見ようによってはバスに見えるかもしれないが、ノードを接続するには、直接ケーブルで接続するか、間にスイッチやルータを経由する必要があり、それらの装置はノードであって、その間はリンクで接続されるから、バスとは異なるのである。

バス型のethernetでは、通信をおこなえるノードが3台以上存在できる。
これを Mixing Segmentと呼ぶ。

一方、現在使用されているUTPケーブルなどはケーブル上にノードが2台までしか存在できない。
これを Link Segment と呼ぶ。
そしてLink Segmentでは送受信用のケーブルが対になっているために衝突が発生しないので、
全二重通信がおこなえる。

こうしてみてくると、「半二重通信はMixing Segmentでの通信方法」だということがわかる。
可能ならば全二重通信のほうがよいにきまっている。

2010/03/14

新科目 TSHOOT

そろそろ試験を受けようと思ってciscoのページを見に行ったら、どうしても受ける気にならなかったONTとISCWの2科目がなくなって、TSHOOTという科目ができるようだ。
しかもこれを取ればCCNPになれる。まだベータで、英語だけど。

2010/03/10

friends_timeline

こんどは、皆の発言を表示させてみた。私は公式のWEBでほとんど十分なのだが、オートリロードしないのだけが不満だったので、それだけをやりたかった。tweetdeckとかtweenとかを使ってみたが、みなフォントが小さすぎるのだ。もっと大きく表示させたい。

friendsというAPIがあって、簡単に表示させることができた。適当に整形しながら、一向に発言内容が更新されないことに気付いていた。APIのアクセス制限にしては早すぎる。しばらく時間を置くと更新されたが、また更新されない。調べると、デフォルトでは100件しか表示できないとのことだった。更新日時を指定すれば、最近の発言を表示させることができる。が、それをどうやるのか・・・?

と、よく見たら、friends APIというのは、followしている人の一覧から、最後のtweetを集めて、100件まで表示するものだった。最近フォローした人からチェックしていき、100人分のつぶやきを表示したところで終わり。これは「フォローしている人の一覧」を表示するのと同じことだ。公式のWEBだと、ページ指定で100人以上表示させられる。Net::Twitter ではページ指定ができないようだ。表示したいのは、「自分がフォローしている人達の発言の中で、最新のもの」であるから、これではない。

friendsで取得して並びかえる必要があるのかな?面倒なので、その前にsearchを試してみる。

さっきのは、friends_timeline というAPIだった。簡単にできた。

おっと、フランス語が化けている。ファイルをutf-8で保存しないといけない。