Vistaには痛い目にあった。
何度ブルースクリーンが出ただろうか?
歴代Windowsの中で間違いなく最高である。100回はくだらない。
寿命(パソコンではない、自分の)も2週間くらい縮まったのではないだろうか。
7は軽くなって好評なようだが、高い。いつのまにWindowsはこんなに高価になってしまったのか。
このブログを検索
2009/12/31
2009/12/26
encodeモジュールでのdecode失敗
デコードで失敗する場合がある。
まず、goo.ne.jpの検索文字列はeuc-jpでエンコードされている。
今までは全部utf-8としてデコードしていたが、gooだけはeuc-jpを指定した。
今までもたびたび失敗する場合があったので調べてみると、googleの検索でもshiftjisになる場合があるようだ。
そして、Encodeモジュールにはguessという、文字コード判別機能がある。
なんだ、最初からこれを使えばよかった、と、shift-jisとutf-8を判別できるようになった、と思ったら、今度は判別に失敗して死んでしまう場合がある。
そこで、guessはgoogleだけに使い、guessに失敗したら今までどおりutf-8固定にして、成功したらもう一度guess指定でデコードした。
成功したときに2回デコードするのがアレだが、とりあえず動くので、後で直す。
というわけで、いつの間にか、6種類ものサーチエンジンに対応していた。
google, yahoo, baidu, bing, biglobe, goo
guessに失敗したときにutf-8にしてもダメな場合がある。euc-jpの場合もあるようだ。
結局、3種類全部試す必要があるのか・・・
decodeに失敗すると?がならぶ。いくつ並ぶかはわからないが、とりあえず二つ並んだら失敗とみなせるかな・・・
検索すると「失敗することがある」という情報がたくさん見つかるけどさ、これ、単にEncodeのバグじゃないの?
まず、goo.ne.jpの検索文字列はeuc-jpでエンコードされている。
今までは全部utf-8としてデコードしていたが、gooだけはeuc-jpを指定した。
今までもたびたび失敗する場合があったので調べてみると、googleの検索でもshiftjisになる場合があるようだ。
そして、Encodeモジュールにはguessという、文字コード判別機能がある。
なんだ、最初からこれを使えばよかった、と、shift-jisとutf-8を判別できるようになった、と思ったら、今度は判別に失敗して死んでしまう場合がある。
そこで、guessはgoogleだけに使い、guessに失敗したら今までどおりutf-8固定にして、成功したらもう一度guess指定でデコードした。
成功したときに2回デコードするのがアレだが、とりあえず動くので、後で直す。
というわけで、いつの間にか、6種類ものサーチエンジンに対応していた。
google, yahoo, baidu, bing, biglobe, goo
guessに失敗したときにutf-8にしてもダメな場合がある。euc-jpの場合もあるようだ。
結局、3種類全部試す必要があるのか・・・
decodeに失敗すると?がならぶ。いくつ並ぶかはわからないが、とりあえず二つ並んだら失敗とみなせるかな・・・
検索すると「失敗することがある」という情報がたくさん見つかるけどさ、これ、単にEncodeのバグじゃないの?
2009/12/04
MACアドレステーブルとarpテーブル
この両者は混同される場合があるが、この区別は重要である。そして、この2者が別物でありさらに混同しがちであることまで含めて理解している必要がある。macアドレステーブルとはmacアドレスとポートの対応表、arpテーブルはipアドレスとmacアドレスの対応表である。
ルータの場合macアドレステーブルを意識することは少ないだろう。これを意識するのはL3スイッチとか、インタフェースに複数ポートがあるブロードバンドルータのようなものの場合である。L2スイッチ、スイッチングハブでもこのテーブルが使用されているはずだが、スイッチのmacアドレステーブルを確認するような事態は、そうないだろう。わたしも全くなかった。macアドレステーブルの使用法というか動作原理については、CCNAなどの試験勉強できいた話であるが、それを実際に確認する機会はなかった。例の、「学習していないMACアドレス宛のフレームはすべてのポートからフラッディングする」というヤツである。
これが何で意識しにくいかというと、以下のような理由がある。これは以前にも書いた記憶があるがもう一度書く。あるL2スイッチ(スイッチングハブ)にポートが8つあって、すべてのポートにPC等が接続されているとする。このスイッチは新しく設置したもので、電源をいれたばかりだったとする。
このときPC1からPC2にpingを打ったら、どうなるのか。「すべてのポートにpingがフラッディング」されるか?されない。「L2レベルの話だからpingは関係ない」。それでは、arpリクエストがフラッディングされるか?たしかにarpリクエストはすべてのポートから転送されるが、それはmacアドレスを学習していないために起こるフラッディングではない。arp requestはブロードキャストだからだ。
そしてarp requestでたずねられているIPアドレスを持っているPC2が、arp requestに対してreplyを返すと、それがPC2が接続しているportに届き、そこでアドレスが学習される。そしてPC1のmacは先ほどのarp requestですでに学習されているので、arp replyはPC1の接続しているポートからのみ、送信される。この段階で、スイッチはPC1とPC2のmacアドレスと接続しているポートの対応を学習し終えている。しかも、それを学習する過程において「学習していないmacアドレス宛へのフレームはフラッディングする」ということは発生していないのだ。
どうしてこういうことになるかというと、われわれが現在パソコンなどで通信を行おうとする場合、ほとんどがTCP/IPで通信するからだ。そしてTCP/IPとはL2/L3を、つまりmacアドレスとipアドレスを組み合わせて通信し、それらは不可分である。階層的には物理、データリンク、ネットワークという風に積み上がってはいるが、ユーザからはデータリンク層はほとんど隠されている。ケーブルがつながった相手の装置のIPアドレス宛に通信をおこなうのである。L3が先にあって、その後でL2で補完するようなイメージである。
「学習してないからフラッディングする」という動作が起こるのは、一体どんな場合だろうか?L2だけで完結する、arp動作がない通信ならそれがあるだろうが、先ほどの例であげた、PCでTCP/IPを使用している場合は。つまり、フラッディングをするフレームはユニキャストフレームである。ブロードキャストの場合はフラッディングとは違う。そしてユニキャストフレームを送信するには相手のmacアドレスがわかっていなければならない。そのためにはarp通信がおこなわれる。
テーブルからage outした場合?arp cacheには残っているがmac アドレステーブルからは消える、などという事態が起こりうるだろうか?
通信を会話にたとえてみれば、物理層というのは「声が聞こえる近くに行く」、データリンク層というのは「うめき声とかため息とかではなくて言葉」、ネットワーク層というのは「日本語、英語などの言語の種類」・・・というところだろうか。そのような階層の意識というものは、誰にでも自然に意識しているというか、意識しなくても自然に理解していることである。
ガイジンとしゃべっていたら、「英語がわからない」と困惑する。そのときに、「俺がこの人と会話ができないのは、言語の問題か、距離が遠すぎるのか、会話の内容がわからないのか?切り分けしよう」などということにはならない。TCP/IPや各プロトコルが神様みたいにあがめられているが、
通信できないときにその理由がすぐにわからないのは装置やプロトコルが悪いのである。意味不明な番号や英数字をダラダラと表示してダンマリを決め込む通信機器には、本当に毎日イライラさせられる。
2台のPCでpingを打つという例をあげたが、おそらくこの場合、スイッチは電源をいれてすぐに、各ポートに接続しているPCのMACを学習するはずである。それはPCのNICがリンクアップしたとたんにgratuitous arpを出すからである。そして、各ポートに接続しているPCは、gratuitous arpを受信して、同じブロードキャストドメインに存在するPCのmacアドレスを学習する・・・?だから、pingを打つときにはarpの送受信なしにいきなりecho requestが送信される・・・?ような気がするがこれは未確認である。
ルータの場合macアドレステーブルを意識することは少ないだろう。これを意識するのはL3スイッチとか、インタフェースに複数ポートがあるブロードバンドルータのようなものの場合である。L2スイッチ、スイッチングハブでもこのテーブルが使用されているはずだが、スイッチのmacアドレステーブルを確認するような事態は、そうないだろう。わたしも全くなかった。macアドレステーブルの使用法というか動作原理については、CCNAなどの試験勉強できいた話であるが、それを実際に確認する機会はなかった。例の、「学習していないMACアドレス宛のフレームはすべてのポートからフラッディングする」というヤツである。
これが何で意識しにくいかというと、以下のような理由がある。これは以前にも書いた記憶があるがもう一度書く。あるL2スイッチ(スイッチングハブ)にポートが8つあって、すべてのポートにPC等が接続されているとする。このスイッチは新しく設置したもので、電源をいれたばかりだったとする。
このときPC1からPC2にpingを打ったら、どうなるのか。「すべてのポートにpingがフラッディング」されるか?されない。「L2レベルの話だからpingは関係ない」。それでは、arpリクエストがフラッディングされるか?たしかにarpリクエストはすべてのポートから転送されるが、それはmacアドレスを学習していないために起こるフラッディングではない。arp requestはブロードキャストだからだ。
そしてarp requestでたずねられているIPアドレスを持っているPC2が、arp requestに対してreplyを返すと、それがPC2が接続しているportに届き、そこでアドレスが学習される。そしてPC1のmacは先ほどのarp requestですでに学習されているので、arp replyはPC1の接続しているポートからのみ、送信される。この段階で、スイッチはPC1とPC2のmacアドレスと接続しているポートの対応を学習し終えている。しかも、それを学習する過程において「学習していないmacアドレス宛へのフレームはフラッディングする」ということは発生していないのだ。
どうしてこういうことになるかというと、われわれが現在パソコンなどで通信を行おうとする場合、ほとんどがTCP/IPで通信するからだ。そしてTCP/IPとはL2/L3を、つまりmacアドレスとipアドレスを組み合わせて通信し、それらは不可分である。階層的には物理、データリンク、ネットワークという風に積み上がってはいるが、ユーザからはデータリンク層はほとんど隠されている。ケーブルがつながった相手の装置のIPアドレス宛に通信をおこなうのである。L3が先にあって、その後でL2で補完するようなイメージである。
「学習してないからフラッディングする」という動作が起こるのは、一体どんな場合だろうか?L2だけで完結する、arp動作がない通信ならそれがあるだろうが、先ほどの例であげた、PCでTCP/IPを使用している場合は。つまり、フラッディングをするフレームはユニキャストフレームである。ブロードキャストの場合はフラッディングとは違う。そしてユニキャストフレームを送信するには相手のmacアドレスがわかっていなければならない。そのためにはarp通信がおこなわれる。
テーブルからage outした場合?arp cacheには残っているがmac アドレステーブルからは消える、などという事態が起こりうるだろうか?
通信を会話にたとえてみれば、物理層というのは「声が聞こえる近くに行く」、データリンク層というのは「うめき声とかため息とかではなくて言葉」、ネットワーク層というのは「日本語、英語などの言語の種類」・・・というところだろうか。そのような階層の意識というものは、誰にでも自然に意識しているというか、意識しなくても自然に理解していることである。
ガイジンとしゃべっていたら、「英語がわからない」と困惑する。そのときに、「俺がこの人と会話ができないのは、言語の問題か、距離が遠すぎるのか、会話の内容がわからないのか?切り分けしよう」などということにはならない。TCP/IPや各プロトコルが神様みたいにあがめられているが、
通信できないときにその理由がすぐにわからないのは装置やプロトコルが悪いのである。意味不明な番号や英数字をダラダラと表示してダンマリを決め込む通信機器には、本当に毎日イライラさせられる。
2台のPCでpingを打つという例をあげたが、おそらくこの場合、スイッチは電源をいれてすぐに、各ポートに接続しているPCのMACを学習するはずである。それはPCのNICがリンクアップしたとたんにgratuitous arpを出すからである。そして、各ポートに接続しているPCは、gratuitous arpを受信して、同じブロードキャストドメインに存在するPCのmacアドレスを学習する・・・?だから、pingを打つときにはarpの送受信なしにいきなりecho requestが送信される・・・?ような気がするがこれは未確認である。