2014年7月20日日曜日

監視カメラTENVIS JPT-3815で息子の悪行を外出先からIP Cam Viewerで見られるようにする

先ほど設定したように、これでうちの室内にあるカメラと中華カメラメーカーがアジアのどこかに用意した中継サーバが接続された。

<元の記事>
http://e-gadgetlife.blogspot.jp/2014/07/tenvis-jpt-3815.html

次は外出先から見られるように、iPhone、iPad、またはAndroidから使えるようにしてみよう。

まずはiPhone/iPadであればAppleストア、AndroidであればPlayストアにアクセスして、IP Cam Viewerで検索してみよう。いくつかのカメラ閲覧用ソフトが引っ掛かってくる。有償のものもあるが、まずは無償のものを試してみればいいだろう。


インストールができたら、まずiPhoneの設定画面から無線LANをOFFにした。家にいるときは家の無線LANにつながる設定になっているので、そのままだと外出先と同じ状況にならないからだ。4G電話回線から接続することで、これで外出先と同じ設定になる。

最初にデモというかサンプルのライブカメラ映像が入っているが、そちらは無視して、右下のメニューボタンからメニューを開き、「Manage Cameras」を選ぶ。

以下のような管理下にあるカメラのリストが表示される。下にある「Add Camera」をクリックして新しいカメラを追加する。すでに設定された家庭内ネットワークのカメラなので、「IP Camera」を指定した。


以下のような設定画面が表示される。ここで先般カメラ側のネットワーク設定(末尾の画面ショット)に表示されていたインターネット上のダイナミックDNSサーバのアドレスを指定する。

ここで「IP/Host」とあるところには、前回指定したときに(下図参照)出ていたhttp://で始まるネットワークアドレスを入れる。ここは文字ベースでも数字ベースでも構わない。「Port」には、末尾の「:」で区切られた以降の数字を入力する。


最後の「User」と「Pass」は最初にカメラを設定したときに決めた監視カメラの設定画面に入るときの「ID」と「PW」を指定する。初期値はどちらも「admin」だが、いちおう鬼や悪魔も棲んでいるインターネットの世界に自分の私生活を晒すというリスクがあるので、絶対にある程度複雑な自分だけのパスワードを設定しておくべきである。

また、使用する必要がないときは、カメラの電源を抜いておくのがよいだろう。機器の電源が入っていなければ、どんな天才ハッカーでも勝手に使うことはできないのだから。

監視カメラTENVIS JPT-3815を導入する

劣等性の小学生の息子が夏休みに入った。親たちが外に働きに出ているが、まだ涼しい朝のうちにしっかり夏休みの宿題や家庭勉強をやってほしいところだが、親がいるときでさえ、サザエさんの弟のカツオくんのように脱走してしまう。

これではグローバル化された世界どころか地域社会でも生きていけないではないか、と思い(こころのどこかでは、おバカでも五体満足で日本語を解して挨拶ができれば、何とかなるような気はしているが)、ここは監視カメラを導入して、きちんと朝は勉学に励ませたいと思った。

あまり性能はいらないし、コストをかける気はないが、あまりに粗悪でも困るとかいろいろ考えつつAmazonと楽天を見るが、結局書き込み件数の多いTenvis JPT3815Wという小型家庭用監視カメラを選んだ。




Amazonde送料込みで4,480円。何でも不良品に当たったとか、ハードウェアやファームウェアのバージョンによってバラつきが大きいとか不安な書き込みもあったが、運試しと思って買った。色は他のルーターやネットワークハードディスクの筐体に合わせて黒くした。

翌日、すぐに馴染みのヤマトさんのお兄さんがAmazonの箱を抱えてやってきた。玄関に箱を置いておくと息子が「パパ、これ何?」と無邪気に叫びながら勝手に箱を開けてしまった。ロボットのような監視カメラを見て怪訝そうな顔をするが、「これはパソコン用のデジカメだ」、「これで車から道路を走っている風景が撮れるぞ」とか適当な説明をしていると、「なんだ、オモチャじゃないのか」という顔をして、どこかに行ってしまった。赤頭巾ちゃんの狼ではないが、「これはお前の悪事をよく見るための目だよ」というのが正解だ。

まずはネットワークケーブルをもってきて、有線LANでルーターにつなげる。ACアダプターを入れるとギーギー音がして左右に動いていたが、そのうち位置が決まったようで大人しくなった。次に以下のメーカーサイトに接続してWindows用のTENVIS Search Toolというユーティリティを入手してインストールした。

http://apps.tenvis.com/

これを入れると、まずファイアウォールを解除していいか訊いてくるので、いちおう解除した。外部とデータのやり取りをする以上は仕方ない。

やがてツールが起動し、ネットワークにつながったカメラがリストに表示された。普通はルーターの設定で自動的にネットワーク上の住所となる番号(IPアドレス)が割り振られてしまうが、外部とやり取りする必要があるので、このツールを使って固定した番号に割り振ることにした。毎回アドレスが変わってしまうと、あとで家側ネットワークと外界(インターネット)で通信する際に、監視カメラと外部の中継サーバのデータの連携ができなくなるリスクがあるからだ。


いつものブラウザを起動して、ここの「IP Address」に表示されているアドレスを一字一句間違えずに指定すれば、以下のような監視カメラに内蔵されている管理プログラム(管理画面)に接続することができる。


ちなみに特別に固定アドレスを設定している以外は、通常は当家も、そして貴家も毎回インターネットサービス業者側から異なるアドレスを割り振られたうえでインターネットに通信している。これでは外出先から家の監視カメラを見ようとしても、接続先の住所が毎回変わってしまうので、まともに通信できなくなる。

この問題点を回避するために、この監視カメラでは「ダイナミックDNS」という仕組みを利用している。これはいま当家のネットワーク上の住所は2500番であるとすると、この仕組みで「Motokiさんの家(のネットワーク住所)=2500」という情報が登録される。

ここで俺が出先から監視カメラを見ようとしてアドレスにアクセスすると、「Motokiの家」と指定すれば、機械の方で2500番にマッチングさせて、その住所でつないでくれる。

これが時折接続がリフレッシュされるので、来週は2812番になってしまうかもしれない。それでもダイナミックDNSでは変更時に変更したという内容をサーバ側に知らせるので、「Motokiさんの家=2812」という情報に更新される。

で、俺がまた監視カメラを使おうとして「俺の家」と打ち込むと、ダイナミックDNSサーバが2812番を探し出してくれるというわけだ。これで自前のサーバがなくても、住所の割り振りが変わったとき、また定期的にサーバ側に変更届を出しておくことで、いつでも自宅のシステムとやり取りができるという優れものだ。

最近は自前のインターネットアドレスやURLを安く取れるようになったので昔ほど使われなくなったと思っていたが、まだまだしっかりとこの仕組みは生きているということだ。

つまり、この監視カメラを外から使えるかどうかの鍵は、このダイナミックDNSの設定ができるかどうかに掛かっている。

ここでまず固定IPアドレスをカメラに割り振ったら、次に家のネットワークの大元である、無線LANルーターのアドレス変換設定をする必要がある。

うちはホワイトBBというソフトバンクとYahoo!BBが提供するADSLサービスを使っているので(ちなみに巨大データをしょっちゅうやり取りするわけでないのに光ファイバー通信に毎月7千円も払っているのが馬鹿らしくなり、ソフトバンクユーザーであれば2千円で入れて通話料もディスカウントされるこちらに切り替えた)、Yahoo!モデムを切り替えることになる。

Yahoo!モデムの管理画面であるアドレス172.16.255.254にアクセスして、内蔵ルーターの管理画面にログインし、そこからアドレスを指定する。

この画面はルーターによって異なるので、詳細はそれぞれ手持ちの機種の取扱説明書を読むしかないが、WAN側(インターネット側)はモデムの管理画面にあるダイナミックDNSのアドレスを指定し、LAN側(家の内部のネットワーク側)は、先ほど指定した監視カメラ自身のIPアドレスとポート番号を指定する。

特に同じ住所でもいくつか通路があり、これをポートという。1つのコンピュータ機器で複数のネット機能を使うためには、このポート番号も併せて使用する必要があるので、必ず指定する必要がある。

この表の目的は、外から来た番号を家の中の機器の番号に変換するパターンを指定することなので、たとえば外部のダイナミックDNSサーバで7777番が指定されていて、内部の監視カメラには82番を割り振っている場合には、WAN側ポート番号に7777番を指定し、内部カメラには先ほど設定した82番を使う。

これで、ダイナミックDNSサーバから送られてきた信号には必ず7777番という札が貼られており、ルーターはこの札のある信号を受信すると、この表に沿って監視カメラの82番に送ってくるようになる。この設定ができれば、外出先からカメラを見られるようになる。


右下の「再起動」ボタンを押してモデムを再起動させると、上記の設定が反映され、外部サーバと家のネットワーク内の監視カメラ間の接続経路が確保される。

とりあえず運試しという意味では、自分には運があったということでよかった。


さて、次は、外からiPhoneで見られるようにしてみよう。

http://e-gadgetlife.blogspot.jp/2014/07/tenvis-jpt-3815ip-cam-viewer.html

2014年7月13日日曜日

銘機NS-10M直系の子孫、YAMAHA NS-BP200の音質は十分満足できる

高校生くらいの頃、まだレコーディングがOTARIの24chアナログレコーダーなどで行われていた頃(のちに世田谷区に住むようになって、車で近隣の調布を通ったときに、オタリの会社があってちょっと感動したことがある)、プロ用の中型スピーカーはAURATONEという16cmくらいのフルレンジスピーカーを搭載したキューブ型スピーカーと、YAMAHA NS-10Mのいずれかと相場が決まっていた。


この頃からYAMAHA NS-10Mに憧れていたのだが、残念ながら生産中止になってしまった。後に実家近くのハードオフで5,000円で買った弟分のYAMAHA NS-10MMをつないでいたのだが、いかんせんこちらはマイクロスピーカーで低音が出ず、さらにうちの居間が安い合板建材でこれでもかと音が乱反射する環境なので、残念ながらあまりいい音ではなかった。

そうこうするうちに、最近ホームスピーカーのYAMAHA NS-BP200というのがあるのを知った。時折Amazonや楽天で調べていたが、売値がスピーカー2本で9千円前後と何だか驚きの価格である。

ときどきAmazonから「スピーカーをお探しですか?」というメールが来るので、つい値段を見ていたが、ついにほぼ8千円まで来た上、在庫が残り3個とか出てくるので、ついポチしてしまった。翌日の朝、ヤマト運輸の見慣れた配送員の方が(見慣れるほど買うな、という感じだが)届けてくれた。

箱は縦、横、高さとも40cmくらいでさすがにPC用小型スピーカーよりは大きく感じる。


さっそくNS-10MMを取り外し、こちらに載せ換える。これまで15cmもなかった奥行きが30cm近くなり、スピーカーの容積が見た目でも4倍になったのが分かる。横で見ていた愚妻の琴線に触れたようで、みるみるうちに般若の正体を現してきた。心の中で「悪霊退散」とか「急急律令如」とか「色即是空」とか知る限りの魔除けの呪文を唱えつつ、スピーカーケーブルをつなぐ作業を続ける。

周波数特性は下は55Hzだが上は何と80KHz、俺の最近遠くなってきた聴力からは信じられないほどのワイドレンジだ。実際に自分のリファレンスである伝説のブラスロックバンド、スペクトラムのCDを再生する。ブラスの響きから低音部で暴れるベースラインなど、バランスよく再生された。

まだエイジングしていないのと、横にいる悪霊をまだ退散できていないので、大きな音量で複数の音源を聴くことはできないが、いずれいろいろ楽しんでみたい。

<同日夜に追記>
ようやく妻が買い物に出掛けた隙をついて、いくつかのソースを再現してみた。音質はいいし、黒光りするボディの質感はYAMAHAの他の廉価サブウーファーを彷彿させるものがあり、低音がしっかり出ているのには感動した。

低音は下は55Hzまで。もう少しハイエンドになると50Hzまで出るようでBP200では若干低音が弱いのかもしれない。

とはいえ、ボディ内部のダクトで低音を鳴らす構造になっているためか、十分に低音が出ているのを感じる。物足りない時は、アンプ内蔵の、もしくはiPhone/iPad本体のイコライザー(バスブースター)などで低音を強めにセットするといいだろう。

また分解能も素晴らしく、ウィーンフィル、カラヤン指揮のチャイコフスキー、くるみ割り人形より、「花のワルツ」を再生してみたが、バックで微妙にアクセントをつけるコントラバスの音から、右手奥で時折鳴るトライアングルの音までしっかり再現されていた。

まあ昔のアナログ時代の音源や木製スピーカーに比べるとどこか硬い感じはあるが、BBEアンプ7千円、このスピーカー8千円、合計15,000円でこれは何だか神に対する冒涜といっていいレベルだ。まあ俺は無宗教だが。

圧縮オーディオを補うために、Buffalo BBEデジタルアンプのBBEを全部オンにするという下駄を履かせた音であったとはいえ、8千円ちょいでこれなら、もしかして死ぬまでこのスピーカーでいいような気さえした。










<関連記事>
たとえ17K円でも真空管アンプは音も温度も暖かい

2014年7月10日木曜日

とりあえず最低限の機能を実装した仮想CPU

とりあえずRubyを使って以下のように試作してみた。

本来オブジェクト指向言語なので、CPUクラスを作って、プロパティとしてレジスターとか個々の要素やモジュールを設定し、メソッドとして命令やその動作を実装すればよいが、何だかPerlのような使い方で、オブジェクト指向どころか構造かさえしていないが、思いついたところまで書いてみた。

メモリ管理やI/Oをどう表現するかはいいアイデアが出ないので、また気が向いたら考えたい。

#==========

# MyCPU running with Assembler

inbuf = "abc" ;
artmp = Array.new ;

regA = 0 ;
regB = 0 ;
flgC = 0 ;
flgZ = 0 ;
tmpvar = 0 ;

while inbuf != "byr" do
  print "--> " ;
  inbuf = gets.chomp ;
  artmp = inbuf.split(" ") ;

### Print function for debug ################
  print "Input[0] is ", artmp[0], "\n" ;
  print "Input[1] is ", artmp[1], "\n" ;
  print "Input[2] is ", artmp[2], "\n" ;
#############################################

if artmp[0] == "ADD" && artmp[1] == "A" && artmp[2] == "B" then
     regA = regA + regB ;

     if regA > 255 then
        flgC = 1 ;
     end

 elsif artmp[0] == "ADD" && artmp[1] == "A" && artmp[2] != "B" then
     regA = regA + artmp[2].to_i ;

     if regA > 255 then
        flgC = 1 ;
     end

 elsif artmp[0] == "ADD" && artmp[1] == "B" then
     regB = regB + artmp[2].to_i ;

     if regB > 255 then
        flgC = 1 ;
     end

### MIN ###
 elsif artmp[0] == "MIN" && artmp[1] == "A" && artmp[2] == "B" then
     regA = regA - regB ;

     if regA < 0 then
        flgZ = 1 ;
     end

 elsif artmp[0] == "MIN" && artmp[1] == "A" && artmp[2] != "B" then
     regA = regA - artmp[2].to_i ;

     if regA < 0 then
        flgZ = 1 ;
     end

 elsif artmp[0] == "MIN" && artmp[1] == "B" then
     regB = regB - artmp[2].to_i ;

     if regB < 0 then
        flgZ = 1 ;
     end


### LOAD ###
 elsif artmp[0] == "LD" && artmp[1] == "A" && artmp[2] != "B" then
     regA = artmp[2].to_i ;
 elsif artmp[0] == "LD" && artmp[1] == "B" then
     regB = artmp[2].to_i ;
 elsif artmp[0] == "SWP" then
     tmpvar = regA ;
     regA = regB ;
     regB = tmpvar ;
 elsif artmp[0] != nil then
     print "Code unknown!\n" ;
     break ;
end

# Display values of registers & flags
  print "A: ", regA, "\t", "B: ", regB, "\n" ;

  if flgC == 0 then
     print "Carry: Inactive / " ;
  else
     print "Carry: Active / " ;
  end

# ここはメモリがないと意味がないので、まだ実装していない
  if flgZ == 0 then
     print "Zero: non-Zero\t" ;
  else
     print "Zero: Zero\t" ;
  end

  print "\n" ;
end


2014年7月1日火曜日

突如として仮想CPUを考える

久々に学研4ビットマイコンに電池を入れて遊んだ。といってもこれ自体が別のマイコン上でかつての学研電子ブロックFXで使われていた4ビットマイコンを模しているエミュレータなのだった。


















これで遊んでいるうちに、自分でも簡単なエミュレータを作ってみようと思い立った。

まずは仕様を決めた。4ビットでは小さすぎて却って使いにくいので、ロングセラーZ80と同じ8ビットにすることとした。

次に演算や処理のデータを置いておくレジスターだが、まずAとBという2つの汎用レジスターを用意した。この2つでキャッチボールすれば最低限の演算はできるだろう。

次に計算結果を示すフラグとして0かそれ以下になったことを示すゼロフラグと、計算結果が大きすぎて桁あふれになったことを示すキャリーフラグを考えた。あとはいまアドレスのどこにいるかを示すプログラムカウンター(PC)も必要だ。

次に命令だが、自分のおおざっぱな理解では、CPUの命令は、データ転送、演算、比較、それにCPUの制御の4種類に大別できると思っている。ということで命令セットもシンプルに考えた。

まずデータ転送だが、レジスター同士のやり取り、レジスターからメモリ、メモリからレジスターへのやり取りを想定した。メモリからメモリもあり得るが、それはメモリからレジスターに転送し、次にレジスターから指定先のメモリに移せばいいので、割愛した。以下のような命令になる。

LD A B
LD B A
LD A (メモリ番地)
LD (メモリ番地) A
**LDはLoadを意味する

次に演算だが、レジスター同士の足し算(加算)と引き算(減算)を考えた。掛け算(乗算)と割り算(除算)は割り切れば何回も加算・減算をすれば実現できるので、シンプルCPUには実装しないこととした。

ADD A B (結果はレジスターAに格納される)
MIN A B (結果はレジスターAに格納される)

次は比較だが、2つのレジスターの値を比較し、その結果によってゼロフラグやキャリーフラグの状態を変えることになる。ちなみに先ほどの演算の結果も、フラグの状態に影響を及ぼす。

CMP A B
**Compareの意味

このとき(A-B)がゼロかマイナスになると、ゼロフラグがセットされる。

そして、それらの結果によって、以下のように指定した番地に飛ぶ命令が必要になってくる。

JZ (メモリ番地)
JNZ (メモリ番地)
**Jump Zero もしくはJump Non-Zeroの意味

これはゼロフラグの状態によって特定の処理をさせたい場合に使う命令だ。

ほかにも何も処理しない時間稼ぎの命令とか、リセットとかいくつか想定するべきだが、何だか面倒になってきたので、プログラムの練習がてら、Rubyで書いてみようと思う。