このブログを検索

2012/11/21

ブリッジとスイッチの本質的な違い


Ethernet, TCP/IPについて勉強し始めた頃、「ブリッジとスイッチ(L2スイッチ、スイッチングハブ)の違いは何か?」という疑問を抱いたことのある人は多いと思う。

よく言われることは、「スイッチはマルチポートである」「スイッチはHW処理である」「スイッチは転送方式が異なる(カットアンドスルー等)」などであるが、私はそれらの違いのどれもブリッジとスイッチの本質的な違いを説明しているようには思えなかった。

しかし、私はようやく本質的な違いを理解した。それはすでに挙げたことであるが「マルチポートであること」である。マルチポートであるというのは単にポート数が増えただけで本質的ではないように思えるが、そうではないのだ。

ブリッジもスイッチもアドレス学習機能を持ち、その原理は同じである。フレームを受信するとその送信元MACアドレスは受信したポートに接続されていると認識し記憶する。その後、記憶してあるMACアドレス宛のフレームを受信したら、そのポートへ送信する。記憶していない未学習のMACアドレス宛のフレームを受信した場合は、受信ポート以外のポートから、そのフレームをコピーして送出する。

このアドレス学習機能の目的は何だろうか?それは「不要なフレーム転送の抑制」である。「あるMACアドレスがどのポートに所属しているかの区別」ではない。確かにこの学習においてアドレスとポートの関連付けはおこなわれるのであるが、それは目的ではなく手段である。

アドレス学習機能の目的が「不要な転送の抑制」であることがわかると、どうしてスイッチがスイッチと呼ばれるようになったかがわかる。スイッチとは初期は単なるマルチポートブリッジでしかなかった。アドレス未学習のときにフレームを受信したポート以外から転送することはポート数が2個だろうとそれより多かろうと同じである。

しかし、ポート数が2個であれば、ブリッジのすることはそのフレームを受信ポートでないひとつのポートから送出するか否かを判断することでしかないが、マルチポートつまり3個以上になると、「受信ポートでない複数のポートのどこから送出するか」を判断することになる。

ブリッジというと、二つの場所を「接続する」というイメージがある。実際に接続することにはなるのだが、そもそもブリッジが登場した目的はノード数の増加とともに増大するコリジョンを削減するためであった。ひとつの大きなコリジョンドメインを分割する目的で考え出された装置なのである。

ブリッジが3つ以上の場所を接続することになっても、それは同じであるが、接続する場所が3つ以上になったことにより、それまでは「出すか出さないか」でしかなかった判断が「どこに出すか」という判断になった。それを判断するための原理は2ポートの時と同じでも機能したのであるが、単なる不要な転送の抑制だけが目的であったのに加え、「どのポートへ転送するか」という目的も兼ねるようになったのである。これは2ポートの場合にはなかったことである。

HW処理になったり、転送方式が改良されたりしたのも、この新しい目的の為である。だからブリッジとスイッチの一番本質的な違いはマルチポートであることである。

2012/11/13

javascriptによる画像ビューア

javascriptがアツい。 javascriptのコンパクトな画像ビューアがあったので、 cgiの中に入れることにした。 ヒアドキュメントを使ったら、文字化けしている。 それは、変数展開によるものであった。

print <<"END_OF_TXT";

apple
banana
$test

END_OF_TXT


とやると、$testが変数展開されてしまう。 それをさせないようにするには、

print <<'END_OF_TXT';


とすればよい。ちなみにそのjavascriptによるビューアは動きが重かったので不採用。




ファイルの拡張子を取り出そうと調べたら、以下のようなソースがあった。

$name = "aaa.jpg";

if( index($name, '.', 0) != -1){
$suffix = (split(/\./, $name))[-1];
}

print $suffix."\n";


なるほどね、ピリオドで区切ってsplitすればいいのか・・・ と思ったがsplitしたものの取り出し方がちょっと変わっている。 私だったら、

@tmp = split /\./, $name;
$suffix = pop(@tmp);


とやるところだ。 おそらくそれを一発でできるのだろうが、どういうことなのかよくわからない。

[-1]で配列の最後を意味するのかな?




2012/09/19

重複ファイルの検索

picasaで写真から顔を検出する機能があっておもしろいなあと見ていたら、同じ画像ファイルがやたらとたくさんあるのが気になった。もう最近はハードディスクの空き容量がなくなるということがすっかりなくなったが、やっぱり同じファイルがたくさんあるのは気持ち悪いので、重複する画像ファイルを探してリストアップしようと思った。しばらく前にperlでそれを作ってあったので動かしてみたがなかなか終わらない。おかしいなと調べてみるとある場所をずっと繰り返して検索している。以前はちゃんと動いたはずなのに・・・最近perlは使っていず忘れていたのと、pythonの勉強を兼ねてpythonで作ろうとしてみた。しかし、数時間かけたがうまくいかない。

あきらめて、とりあえず画像ファイルをすべてリストアップしてテキストに書き出し、それをexcelで開いてファイル名で並べ替えて重複をチェックしてみた。しかし、ファイル名だけではちぇっくにならない。「1.jpg」という名前でも全然違うファイルがある。perlで作ったときは、ファイルサイズも調べて、サイズと名前が一致するものを重複候補とした。そこまですれば、後は目視でチェックしてもそれほど手間ではなかった。が、pythonで同じ事をやろうとしたがうまくできなかった。くやしいな・・・・




こんなものを作ってみた。

class MyFile:
def __init__(self,name1,size1,path1):
self.name = name1
self.size = size1
self.path = path1
def getName(self):
return self.name
def getSize(self):
return self.size
def getPath(self):
return self.path
file1 = MyFile("taro",110,"c:\\file\\")
file2 = MyFile("jiro",120,"c:\\file\\")
file3 = MyFile("saburo",130,"c:\\file\\")
print file1.getName()
print file2.getPath()
print file2.getSize()


実行してみた。

C:\>python ob.py
taro
c:\file\
120


"MyFile"というクラスを作ってみた。「クラス」というのは、プロトタイプのようなものだ。「概念」と言えばいいだろうか。クラスそのものは実体ではない。

file1 = MyFile("taro",110,"c:\\file\\")


とやって、初めて file1 という「実体」が存在する。これを「インスタンス」と呼ぶ。このクラスを使って、PCに存在するファイルの名前、サイズ、パスを記録するにはどうすればいいか。このクラスを配列にすることができるか?もしくはインスタンス名を変数にすることができるか?・・・・わからない。

考え方を変える。配列に「ファイルサイズ(スペース)ファイル名」、「パス」という順番に記録していく。そしてその配列を全部読んで、別のリストに「ファイルサイズ(スペース)ファイル名」が存在しなければ記録していく。このときすでに存在していれば、サイズとファイル名が両方同じファイルだということになる。

import os
list1=[]
filelist=[]
duplicate_count =0
file_count=0
rootdir = "/"
for (root, dirs, files) in os.walk(rootdir):
for f in files:
name, ext = os.path.splitext(f)
if ext == (".jpg" or ".png" or ".bmp"):
try:
fsize=os.path.getsize(os.path.join(root, f))
except:
print "some error happened. keep on going anyway..."
str1 = str(fsize) + " " + f
list1.append(str1)
list1.append(os.path.join(root, f))
for i in range(len(list1)):
#    print list1[i]
if ((i % 2) == 0):
file_count += 1
if list1[i] in filelist:
print "already exists:  " + list1[i]
duplicate_count += 1
else:
filelist.append(list1[i])

2012/09/18

twitterでblockしているユーザの一覧

python-twitterには block 関連が実装されていない。自分がblockしているユーザを知りたい。これくらいしかわざわざAPIを使おうと思う機会はない。直接APIを呼ぼうかと思ったがわからず、tweepyがあることを知る。

ついでに easy_install という、perlのppmみたいなものがあることを知る。pythonのインストールフォルダの下に scripts というフォルダがあり、そこにインストールされている。さっきsetup_toolsとかいうのをインストールしたときにインストールされたのかな?それとも最初からあったのかな?不明。pathに c:\python27\scripts を追加すると、コマンドプロンプトで以下のようにしてtweepyをインストールできた

easy_install tweepy
では、ブロックユーザ一覧のサンプルです。
import tweepy
consumer_key = '***'
consumer_secret = ' *** '
access_key = ' *** '
access_secret = ' *** '
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_key, access_secret)
api = tweepy.API(auth_handler=auth)
results = api.blocks()
for result in results:
print result.screen_name

How simple!
最後を以下のようにすれば、block解除できる。
for result in results:
api.destroy_block(result.id)

perlよりいいかも。ちなみに、access_key と access_secret は、twitterのアプリケーション登録画面で取得できる。もし、第三者にAPIを利用させたい場合は、これらをユーザの了解のうえで取得することができる。「Authorize app」とかいうボタンが表示されるあの画面である。今回のように、自分のPCでちゃちゃっと使うような場合はソースの中に直接書いてしまえばよい。

2012/09/17

python-twitter

twitter apiを使ってみる。モジュールのダウンロードとインストールが必要。ちょっと多い。

まずpython-twitter

http://code.google.com/p/python-twitter/


python-twitterを使うには以下のモジュールが必要。

http://cheeseshop.python.org/pypi/simplejson
http://code.google.com/p/httplib2/
http://github.com/simplegeo/python-oauth2


さらに、python-oauth2をインストールするには setuptoolsというモジュールが必要。

http://pypi.python.org/pypi/setuptools#files


必要なモジュールがそろったら、以下の順にインストールする。

setuptools→ simplejson, httplib2, oauth2 → python-twitter

setuptoolsはwindows用のインストーラがある。

次の3つのモジュールは皆、解凍したフォルダの中で以下のコマンドでインストールできる。

python setup.py install


python-twitterは、以下のようにbuild と installが必要。

C:\python-twitter-0.8.1>python setup.py build
C:\python-twitter-0.8.1>python setup.py install


・・・やっぱりperlのCPANみたいに楽ではない。




<サンプル>

import twitter
api = twitter.Api()
statuses = api.GetPublicTimeline()

print '<html><head><title>tl</title><meta charset="utf-8"></head>'
print "<body>"


for s in statuses:
print "<p>"
print "<b>" + s.GetUser().GetScreenName()+ "</b><br>",
s.GetText().encode("utf-8","replace") + "<br>"
print "</p>"

print "</body></html>"


python twi.py > tl.html


とやってブラウザで見てください。




tweetするやつ。

# -*- coding: utf-8 -*-
import twitter
from urllib import urlencode
from oauth2 import Client, Consumer, Token
account_name = 'your_account_name'
account_pass = 'your_password'
consumer_key = 'your_consumer_key'
consumer_secret = 'your_consumer_secret'
access_token_key = 'your_access_token_key'
access_token_secret = 'your_access_token_secret'
client = Client(Consumer(consumer_key, consumer_secret),
Token(access_token_key, access_token_secret))
client.request('http://api.twitter.com/1/statuses/update.xml',
'POST',
urlencode({'status':'GOOD MORNING'}))





2012/09/16

python

暇なのでpythonを使ってみた。

pythonのインタープリタをインストールする。

c:\python27


というフォルダにインストールされた。

バージョンは2系列あるそうだが、日本pythonユーザ会とかいうサイトに、

どちらか迷ったら2.7にしましょうとあったのでそうする。

windowsのpathに上記のフォルダを追加する。

コマンドプロンプトで python とやるとインタプリタが起動する。

終了は ctrl+z + enter

ファイルを実行する場合は

python sample1.py


というようにする。

.py じゃないとダメかは知らない。




<サンプル1>

名前を入力すると挨拶する。

文字列の連結は + を使う。

name=raw_input('enter your name: ')
print 'hello, ' + name


<サンプル2>

ファイルの中身を表示する。

for とか if の後ろにはコロンがいる。

for line in open('readme.txt','r'):
print line


<サンプル3>

指定したキーワードを含むyoutubeの動画タイトルを表示する。

(gdata-python-clientのダウンロードとインストールが必要。すぐ終わる。)

# -*- coding: utf-8 -*-
import sys
import gdata.youtube
import gdata.youtube.service
argvs = sys.argv
argc = len(argvs)
if (argc != 2):
quit()
client = gdata.youtube.service.YouTubeService()
query = gdata.youtube.service.YouTubeVideoQuery()
query.vq = 'argvs[1]'
query.max_results = 25
query.start_index = 1
query.racy = 'exclude'
query.orderby = 'relevance'
feed = client.YouTubeQuery(query)
for entry in feed.entry:
print entry.title.text


perlの代替になるかと思っているのだが、perlほど自由奔放な感じはなく、

キッチリしている感じ。




2012/08/16

「名前を付けて保存」について

「名前を付けて保存」ということを、仕事でも家でも、パソコンを使っているとする。画像にしてもテキストにしても、コンピュータに保存するには名前を付けないと、それがなんなのかわからなくなってしまうから名前を付けるのは当然のことだと、いつの間にか思うようになった。だが、この「ファイルに名前を付ける」という行為は、たいしたことがないようでいて結構めんどくさくて、トラブルの種になりさえする。それは、「ファイルの中身と名前には何の正当な関連性は保証されない」からだ。これも当たり前のことだが、女の子の写真に「おじいさん.jpg」という名前をつけて保存することができる。もっというと、「bible.doc」という名前をつけることさえできる。「拡張子」というものも、利用者が任意に変更できる。テキストファイルに.jpgとつけたり、動画ファイルに .doc とつけることができる。それらのファイルをダブルクリックすると、「テキストではありません」というエラーが表示されたり、意味のわからない文字列が表示されたりするだろう。Windowsの場合。

iPhoneを使うようになってしばらくして、iPhoneでは「名前を付ける」という行為がほとんどないことに気づいた。ほとんどといったのは、アイコンを重ねたときに生成されるフォルダ名を変更できることが思い浮かんだからだ。だがそれ以外はiPhoneでファイルやフォルダに名前をつけた記憶がない。WEBで(safariで)、いいなと思う画像があったら、なんかのアイコンをタップして「Save image」とやると、画像は保存される。どのフォルダに、なんという名前でなどを指定する必要はない。画像を保存する場所は決まっているからだ。画像が保存されているフォルダをひらくと、サムネイルが表示される。名前はない。もちろん、拡張子なんかない。この仕組みになれると、Windowsで仕事をするのがめんどくさくなってくる。多くの会社はWindows XPとIEを使っている。Vista以降、ビジネスではMSの最新を追うことをしなくなった。一番大きな理由は「セキュリティ」なのだろうか。PCを使うことが非常におっくうになった。つまらなくなった。多少のバグやフリーズなどがあっても、新しいことがより速くかんたんにできるようになるのはおもしろかった。

しかし今は、コンピュータもネットワークも携帯端末も、重荷でしかなくなりつつある。コンピュータの導入後、かえって紙が増えたということが言われたが、それがようやくなくなって、ペーパーレス化がようやく実現できたと思ったら、また思わぬコンピューティングをはばむものの登場だ。人はそれを「コンプライアンス」と呼ぶ。