技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

IoTとM2Mの違い

最近、IoT(Internet of Things) と M2M(Machine to Machine) を良く聞くようになった。この2つの違いがあまり分かっていなかったので、ちょっと調べてみた。

 

ざっくり言うと、こういうことらしい。

  • M2M:マシン同士が通信を行い、情報収集やマシンの制御を行う。
  • IoT:M2Mで収集した情報をインターネット上に集め、ビッグデータとして扱う。

つまり、IoTのスコープはM2Mのスコープを含んでいる。

ちなみに、以下のサイトの説明が分かり易くて参考になった。

https://www.oki.com/jp/iot/doc/2016/16vol_10.html

VBSの実行方法

VBSのスクリプトを実行するには WSH (Windows Script Host) を呼び出す必要がある。それには、wscript 経由で呼び出す方法と cscript 経由で呼び出す方法がある。

この2つの使い分けは、ウィンドウを出すなど対話向けの処理なら wscript 経由で、バッチ処理などバックグラウンドの処理なら cscript 経由となっている。

ちなみに、VBSをダブルクリックしたり、cmd 上で単にVBSを実行すると、wscript 経由となる。

 

注意点としては、バックグラウンドでバッチ処理をしたいのに、明示的に cscript 経由にしなかったせいで wscript 経由でVBSが実行されると、VBSが対話処理のところで止まってしまいバッチ処理が進まない、ということがある。

VBSから外部コマンドを呼び出す

VBS内から外部コマンドを呼び出す方法としては、Runメソッドを使う方法とExecメソッドを使う方法がある。それぞれの説明は以下の通り。

Run メソッド

Exec メソッド

 

どちらを使うべきかについては、以下のページが分かりやすい。

https://blogs.technet.microsoft.com/jpilmblg/2009/06/11/vbscript-123/

 上記によると、Runメソッドは、Windows アプリケーションを実行する際に表示状態を操作できるというメリットがあり、Execメソッドは、外部コマンドの実行結果の情報をより詳しく取得できるというメリットがあるようだ。

あと、Execメソッドは非同期関数なので、抜けて来たからといって外部コマンドが終了しているとは限らない。外部コマンドの終了を待つ必要がある場合は、上記のURLにあるように 、戻り値のオブジェクトの Status の値を確認する。

MIB取得の終了について

例えばnet-snmpのsnmpwalkコマンドなど、SNMP GetNextRequestを繰り返してMIBを次々取得するアプリケーションは、どのようにしてエージェント側のMIBの終了を知ることができるのか、についてちょっと調べてみた。

 

これについては rfc に以下の記載がある。

When an SNMPv2 access to MIB data returns a variable binding
containing an endOfMibView exception, it indicates that there are no
object instances available which lexicographically follow the object
in the request. In an SNMPv1 agent, this condition normally results
in a noSuchName error, and so the error-status field of the response
PDU SHALL be set to noSuchName. Also, the error-index field SHALL be
set to the index of the variable binding for which an exception
occurred (there may be more than one and it is an implementation
decision as to which is used), and the variable binding list from the
original request SHALL be returned with the response PDU.

https://www.ietf.org/rfc/rfc2576.txt

 

これによると、SNMPv2の場合は、エージェントがvarbindに endOfMibView を入れてくるので、MIB取得側ではそれを以って「エージェントはもう返すMIBがないんだな」と知ることができる。一方で、SNMPv1の場合は noSuchName エラーが返ってくるようだ。

指定したディレクトリ配下のファイル内のタブをスペースに変換するスクリプト

指定したディレクトリ配下のファイル内のタブをスペースに変換するperlスクリプト replaceTabToSpace.pl を作成した。使い方は簡単で「perl replaceTabToSpace.pl "ディレクトリのパス"」で実行できる。

例えば、ソースコード内にタブとスペースが混在していて見にくい状態になっていて、それらを全てスペースに統一したい時に使うと便利。対象となるファイル数が少なかったら、テキストエディタの置換機能で1ファイルずつタブ⇒スペースへの置換を行えば良いが、対象となるファイル数が多数あった時は1ファイルずつ対処すると面倒なので、このスクリプトを作成した。

use strict;
use warnings;

my $dir = $ARGV[0];
if(! -d $dir) {
    die "Invalid argument. Specify a dir...";
}

my $NUM_OF_SPACE = 4;
my $spaces = ' ' x $NUM_OF_SPACE;

my @fileList;
getFileList($dir, \@fileList);

foreach my $file (@fileList) {
    if(-f $file) {
        my $tmpOutFile = "$file.replaced";
        open(my $in,  $file)          or die "Failed to open $file: $!";
        open(my $out, ">$tmpOutFile") or die "Failed to open $tmpOutFile: $!";
        
        foreach my $line (<$in>) {
            $line =~ s/\t/$spaces/g;
            print($out $line);
        }
        close($in);
        close($out);
        rename($tmpOutFile, $file) or die "Failed to rename $tmpOutFile to $file: $!";
    }
}


sub getFileList {
    my $dir = shift;
    my $ref_fileList = shift; # for output.
    
    opendir(my $dh, $dir) or die "Failed to open $dir: $!";
    my @fileList = readdir($dh);
    closedir($dh);
    
    foreach my $file (sort @fileList) {
        if($file =~ /^\.{1,2}$/) {
            next;
        }
        if( -d "$dir/$file") {
            getFileList("$dir/$file", $ref_fileList);
        }
        else {
            push(@$ref_fileList, "$dir/$file");
        }
    }
}


なお、タブをスペース幾つに変換するかは、上記の

my $NUM_OF_SPACE = 4;

で指定する。

VLANにIPを割り振る意味

昨日に引き続き、VLANに関するメモ。

 

VLANはL2の技術である。VLANを作成することによって、スイッチでブロードキャストドメインを分割することができる。

 一方、VLANにはIPアドレスを割り振ることができる。(正確には、L3スイッチの持つ VLANインタフェースに対してIPアドレスを割り振っているのだが)

 

ここで、以前、VLANはL2の技術なのに、何故L3の情報であるIPアドレスを割り振るの?という疑問を持っていた。

 

これに対して、現在のところは以下のように理解している。

そもそもVLANにIPアドレスを割り振ることは必須ではない。IPアドレスを割り振らなくてもブロードキャストドメインの分割はできる。ただ、VLAN間の通信を行おうとするとルーティングが必要になるので、VLAN(VLANインタフェース)にIPアドレスを割り振る必要が出てくる。

 

上記を明確に書いてある記事は見つかなかったが、この理解でVLANのIPアドレスに関する多数の記事を読んでみて矛盾を感じなかったので、おそらく合っていると思っている。

L3スイッチのVLANインタフェース

L3スイッチのVLANインタフェースについて簡単に説明する。

 

L3スイッチは、「L2スイッチ+内部ルータ」で構成される。この内部ルータは、L2スイッチが区切ったVLAN間のルーティングを可能にする。

 VLAN間通信で内部ルータを経由する際、内部ルータの持つVLAN用のインタフェースを通過するのだが、この時に通過するインタフェースがVLANインタフェースである。

 

以上を踏まえ、ざっくり言うと、VLANインタフェースとは、

L3スイッチ内でVLAN間で通信する時に通過する、L3スイッチの内部ルータのVLAN用のインタフェース 

ということ。

 

ちなみに、以下のページの説明がとても分かり易くて参考になった。

http://wa3.i-3-i.info/word12586.html