カウンター

2013年9月28日土曜日

DynamicDNS

前回の記事で、Wake on Lanについて書いた時に、ちらっとダイナミックDNSに触れたのでそれについて書こうと思います。

Dynamic DNSとは、ちょこちょこ変動するグローバルIPを、固定のFQDNに紐づけてくれるサービスのことです。登録しておくと、一定のFQDNでインターネットから自宅にアクセスできます。私の目的はもちろん、自宅PCの電源ONのためです。

サービス自体はDynDNS等プロバイダは様々ですが、今回は私がやってみた無料のmyDNSのやり方を紹介します。

URL:http://www.mydns.jp/

「JOIN US」ページでユーザ登録を行うと、メールでIDとパスワードが届きます。再度上記ページに行き、送られてきたIDでログインして、左側メニューの"DOMAIN INFO"のページでドメイン名を登録します。

???.mydns.jp
???.mydns.bz
???.mydns.vc
???.mydns.tw
???.0am.jp
???.0g0.jp
???.0j0.jp
???.0t0.jp
???.pgw.jp
???.wjg.jp
???.server-on.net
???.live-on.net
???.keyword-on.net
???.dix.asia(NEW!)
???.daemon.asia(NEW!)

無料ドメインだと上記で選択できるようです。おこのみで。






















DomainのところにアクセスしたいFQDN、したの"A"って書いてあるとこはサブドメインの名前解決用です。サブドメインを利用しない場合は"*"でOKです。

次はIPの登録です。"IP ADDRESS DIRECT"というメニューで、自宅のグローバルIPアドレスを登録してください。グローバルIPアドレスは、確認くん(http://www.ugtop.com/spill.shtml)で見れます。
何もしてなければ基本「動的IP」なのでそれを選んでください。
IPv6のところはそのままでOKです。

以上で登録自体は完了です。
思った以上に簡単でした。

待ってたらそのうちアクセスできます。
確認は、コマンドプロンプトを開いて、

nslookup [登録したFQDN]

でグローバルIPが返ってきたらOKです。
数時間でiphone 3Gからもアクセスで切るようになりました。

一応これで使えるのですが、もう少し設定をしないといけません。
ダイナミックDNSって、動的なIPと固定のドメインを紐付けてくれるのですが、IPが変わった時にDNSサーバに教えてあげる必要があります。(IPが変わるタイミングはわかりません、プロバイダによると思います。感覚的には1週間に1度くらいでしょう。)

なので、定期的に教えてあげる仕組みを作りましょう。myDNSでは、POP3・FTP・HTTP等で特定のアクセス先にアクセスすればOKです。電源つけっぱなしで定期的にアクセスしにいくような仕組みにしたくなかったので、今回はログインのたびに自動でFTPアクセスする、というbatを作りました。

下記2つのファイルを作成して適当なところに保存しておいてください。

1.ftp.bat
==================================
ftp -i-s:ftpcmd.txt
==================================

2.ftpcmd.txt
==================================
open ftp.mydns.jp
[ID]
[パスワード]
==================================

の3行でOKです。スタートアップのディレクトリにショートカットを作ってあげればログインのたびに勝手に実行され、FTPでアクセスしてくれます。


以上です。

無料でできるのはすばらしーですね!

2013年9月25日水曜日

Wake on Lan

現在我が家では、自作パソコンのstation TVにてTV録画しております。

予約録画のためには、電源が入っている必要があり、
録画して撮りためておくのが好きなのでちょいちょい予約するのですが、
つけっぱなしにしておくと相方に怒られますwww

予約を入れてても、電源が入っていないと録画されず、
家に帰ったら、あーーー撮れてなかったー、ってのがちょいちょいあります。。。

時間になったら勝手に電源が入ればいいのになあ。
→誰か知っていたら教えてください。。。


時間になったら電源オン、は無理そうなので、

出先でiphoneから自宅のPCの電源をつける!!!

という目的とします。
そこで、(天下り的ですが)前から話を聞いていた「Wake on Lan」を試してみることに。
wake on lan(wol)とは、リモートでPCのスイッチをオンにする、という機能です。
この時起動命令用に送信されるパケットを、”マジックパケット”と言います。

幸い、録画PCではwolに対応していたので下記設定
をして利用できる状態にしました。

・BIOS設定
・デバイスマネージャでNICのプロパティ→WOLをオン

まずは同セグメント(LAN内)の端末から起動させてみます。
起動は、Wake up On Lan tool・MagicBoot等のツールをダウンロードして、

・IPアドレス
・サブネットマスク
・MACアドレス

を設定します。IPアドレスは起動したいPCのIPでもいいですが、LANのブロードキャストアドレス(例えば、192.168.0.255)にすると、確実にいけます。

iphoneでもできます。私は下記アプリをインストールしました。(どっちでもOKでした)
・RemoteBoot
・mWOL

結構サクッとできました!うれしいですね。


本題はここからです。
当初の目的は、インターネット経由で家のPCの電源をつける、ということでした。


元々LAN内を想定した技術のようなので、これが中々厄介です。

色々調べたのですが、下記4つの方法ができそうだとわかりました。

1.ルータからWOL(VPN経由)
2.ルータからWOL(直アクセス)
3.l同セグメントの別端末からWOL
4.ルータからポートフォワード


最初に書いておきますが、インターネット経由で家のネットワークにアクセスするには、
グローバルIPが必要です。
通常のプロバイダ契約の方もグローバルIPが当然あるのでできますが、
通常契約の場合グローバルIPは頻繁に変わりますので、別途グローバルIPを取得するか、ダイナミックDNSを利用するか、という方法があります。

ダイナミックDNSは、myDNS等が無料で利用できるので、おすすめです。




では、改めて1個ずつ見ていきます。

1.ルータからWOL(VPN経由)

うちのルータは、バッファローのWHR-G301Nなのですが、
WOL機能がありました!!!
ルータの管理画面から操作するようです。

同ルータのPTPPサーバ機能を利用してVPNでアクセスし、
そこで管理画面→WOL、でできました。


2.ルータからWOL(直アクセス)

こっちは、管理画面にアクセスするのにインターネットから直でアクセスする、
というものです。
他のルータは知りませんが、バッファローのルータの管理画面の認証は
ベーシック認証という、古びた認証でリスクが高いです。。。(ID,PWが暗号化されない)

やめましょう。。。


3.同セグメントの別端末からWOL

こちらは、同セグメントにつけっぱなしの別PCがいて、
そいつを操作してマジックパケットを送信してもらうものです。

色々やり方はあると思いますが、
Webサーバとして構築しておいて、外部ネットワークから

http://[グローバルIP]/wol.cgi

にアクセスしたらcgiがマジックパケットを送る、というやり方があるのかな、と思います。
家でPCをつけっぱなしにできないので、この選択肢は残念ながら取れません。。。

4.ルータからポートフォワード

今回、これをやりたくて色々試行錯誤しました。 
このやり方では、ルータでポートフォワードの設定をしておいて、
ルータ経由で当該PCにマジックパケットを送付する、というものです。

具体的には、ルータ上で「このポートに来たパケットは、あのIPのPCに送ってね!」
という設定をしておきます。














↑設定はこんな感じです。
192.168.11.2は、電源を付けたいPCのプライベートIPです。

ここで大きな問題が、、、

イーサネットでは、MACアドレスを見てパケットを対象PCに送信します。
もうちょっと言うと、LAN内ではIPアドレスからMACアドレスに変換し、当該MACアドレスにパケットを送信します。その変換を実行するためのMACアドレスとIPアドレスの紐づけである、「arpテーブル」ってのを各機器で持っています。

この場合はルータの持っているarpテーブルですが、対象のPCの電源が消えてしばらくすると(5分程度で)消えてしまいます。(仕様にもよりますが、このルータはそうっぽい)
つまり、電源が消えて時間が経ったPCは、ルータから見てどこにいるかわかんないわけです。

「あのPCに送ってね!」ではできないようですので、
じゃなく「すべてのPCに送ってね!」とします。

つまり、ブロードキャストです。
ポートフォワードの設定で、ブロードキャストアドレス(例えば192.168.0.255)にフォワードする設定を入れましょう!!!


ルータの管理画面にて設定しようとしたら、
「そのアドレスは設定できません。」















ちーん。

できるルータもあるみたいですね。(NEC製ルータ等)
残念です。。。

2013年9月13日金曜日

おすすめ情報検索システム

久しぶりの更新です。

今日は自作システムの「おすすめ情報検索」を紹介したいと思います。
このシステムでは、あるキーワードに関連するキーワードを教えてくれます。
例えば、”iphone”というキーワードを入力すると、”docomo”と返したりします。

原理的にはツイッターのタイムラインから関連ワードを拾ってきてるだけです。


使い方はいたって簡単で、ツイッターで

@recTopic

というアカウントに、キーワードをリプライするだけです。

ご自由にお使いください。

なお、pythonで実装しています。
#日本語の扱いに苦労しました。。。


ご興味がある方は、下記サイトをご参考いただければ。
http://d.hatena.ne.jp/killinsun/20130606/1370542828


※注意
twitterの制約上1分につき1回しか稼働できません。。。
1分に複数のリプライが来ると、1リプライしか拾えません。。。

2013年5月14日火曜日

食玩問題その3

前回、誕生日のパラドックスをPRISMで解いたので、
調子に乗って食玩問題もモデル化してみたらできましたので
紹介させて頂きます。

いたって簡単です。

dtmc
const int NUM_BOX; // 購入数
const int OMAKE;   // おまけの種類

module omake

  n : [0..OMAKE] init 0;   // 既に手に入れたおまけの個数
  b : [0..NUM_BOX] init 1; // 購入済みの個数

  [] (n<OMAKE)&(b<NUM_BOX) -> (OMAKE-n)/OMAKE : (n'=n+1)&(b'=b+1) + 1-(OMAKE-n)/OMAKE : (n'=n)&(b'=b+1);
  [] (n=OMAKE)&(b<NUM_BOX) -> (b'=b+1);

endmodule

定数としては、単純に問題のパラメータとして、
購入する予定の数と、おまけがいくつ混入しているか、
というものを与えています。

状態遷移の定義ですが、おまけがまだ全種類集まっていないとき、かつ購入予定数に
到達していないときに、残りの当たっていないおまけが当たるか当たらないか、
に遷移します。
当たり終わったら購入予定数にいくまで買い続けます。


というシンプルなモデルで表現できました。


前回同様、「おまけがすべて揃う確率」をPRISMで求め、
購入数を増やしていったときのおまけの当たる確率を計算してみましょう。



横軸が商品の購入数で、凡例にある4つの数値がおまけの種類です。
おまけの種類が増えるにつれ、やはり揃う確率も減ってきていますね。
15種類だと100個買えばほぼ100%の確率で揃っていたのですが、20個となると
当たる確率の上昇がゆるやかになっていますね。

ただ、前の記事にも書いていましたが当たる確率って均等じゃないですよね。
ものによってはレアなおまけもあるでしょうし。

例えば、おまけが「正規分布」で出現する場合に、
いくつ買えば全種類揃う確率が高いのか、というような感じで、
おまけの出方を変えたりするとまた面白いのかなー。。。

2013年5月12日日曜日

誕生日のパラドックスその2


その2です。
これは、「同じクラスに、同じ誕生日の人がいる確率は?」という問題でした。
直感的には、1年365日なのでとても確率が低そうに見えます。

その1だと、同じ誕生月の人がいるか、という考察しかしていなかったので
今回きちんと解を算出したいと思います。


普通に解いても面白く無いので、今回PRISMというツールを利用して解析したいと思います。
学生時代研究で利用していたのですが、確率モデルを解析するツールです。

参考までに、公式ページです。
http://www.prismmodelchecker.org/


まず確率モデルを設計していきます。
PRISMで書くと下記になります。















=================================
文法を簡単に説明します。
dtmcってのは、モデルの種類を定義していて、今回は
「Discrete-Time Markov Chain(離散時間マルコフ連鎖)」というモデルです。
定数をNで定義し、モデルの変数を8行目~9行目で定義しています。
実際の遷移定義は13行目~16行目です。
例えば、ある状態から、0.3で遷移先状態①に遷移し、
0.7の確率で遷移先状態②に遷移する場合、下記のように記述します。

【ある状態】 -> 0.3 : 【遷移先状態①】 + 0.7 : 【遷移先状態②】
=================================

単純に"N"人分誕生日を同じか確認していく、というモデルです。

今回の問題は、普通に解くと場合分けが必要なのですが、
それを考えなくていいように、"day"という変数を使って、
 誕生日が同じ⇒dayを減らさない
 誕生日が違う⇒dayを減らす
という方法で「任意の誰かが誕生日が同じであるかどうか」
を解くようにしています。

各変数の意味:
 s   : "1"の時、計算終了状態
 n   : 誕生日確認済み人数
  day : 誕生日が違う人がいると-1される
 m   : 誕生日が同じ人の数

13行目が最もメインで、
 誕生日が違う場合は、dayを減らし、残りの確認人数nを減らします。
 誕生日が同じ場合は、誕生日が同じ人の数mを増やし、残りの確認人数nを減らします。
ってな感じです。
14行目は、「すべての誕生日で同じペアが存在した」という状態を想定しており、
確率1で遷移します。で、人数nが0になったら状態s=1に遷移し、計算を終了します。


では、計算してみましょう。

PRISMは、「モデルに対してある性質を満たす確率を計算する」ツールです。
今回は、「s=1かつmが1以上の状態に到達する確率」を求めることで、誕生日のパラドックスを解きたいと思います。


またPRISMでは、定数をある範囲で動かして、各値での計算結果をグラフに
出してくれます。便利ですね。

今回は、クラスにいる人数をNとしていますので、クラス内の人数を
3~100で動かしてみましょう。


40人のクラスだと、ほぼ90%ですね。
(値としては0.891でした)

問題を解くよりは「PRISMの紹介」メインになってしまいましたが、
同じ誕生日がいる確率って結構高いんですね。

私は自分と同じ誕生日の人に出会ったこと無いので、
この結果は信じておりませんがw


2013年5月11日土曜日

TVサーバの構築(1)


すっごく久しぶりの更新です。(3年空きました)

最近は仕事でもプライベートでも色々調べたり手を動かすことが
多いので、せっかくなのでそれらについて色々書いていこうとおもいます。

なので、元々「問題の解説」というテーマでしたが、IT関連の情報も発信していきます。


今回のテーマは、「TVサーバ」です。
最近、会社の先輩がnasneを買ったらしく、家の中で色々な端末で見れるだけでなく、
タブレットにダウンロードして、出先でも見れるようにしてるみたいです。

自分もそれしたい!と考えて、色々調べました。

nasneを買うのが早いのかなと思っていましたが、
FAT32というファイルシステムの制約で2GBまでだそうですので、なんか微妙だなと。

調べていると、今の自作PCに取り付けているPIXELA社の「PIX-DT230-PE0」
というキャプチャボードのStation TVというソフトにTVサーバの機能があるみたいです。

早速それを更新してサーバを立てて、試しにローカルでそのTVサーバにアクセスしてみました。
利用したのは、XBMCというDLNA接続ができるクライアントです。

TVサーバ、見つかった!
あれ、でも見れない。。。

どうやら、DLNAだけでなく、DTCP-IPというTVサーバ用の保護された接続方式に対応した
ソフトでないとダメなようです。

今のところ、フリーソフトは無いようで(当然か?)

・Dixim Digital TV plus
・SoftDMA

の2つが主だったツールのようです。
両方ともシェアウェアですが、体験版があったので使ってみました。

今回は「Dixim Digital TV plus」でやってみました。
TVサーバが見つからない!!なんでや!って一人で騒いでいましたが、
しばらく放置していたら見つかりました。(ちょっと読み込みに時間がかかるようです)


しかし、「著作権保護に対応していません」と出ました。
どうやらディスプレイの接続方式が、「HDCP」という映像データの暗号化技術に
対応しているディスプレイでないと再生させないようです。

今のディスプレイは接続方式がアナログのD-sub15ピン(青いやつ)なので、
だめです。厳しいですね。

これを解決するには、ディスプレイごと買えないとなので一旦こっちは保留、
もう一台のノートPCでLAN経由で接続してみましたが、今度は、

「お使いのパソコンのセキュリティ設定やネットワーク環境、
サーバー機器の症状を確認して下さい。」

って出ました。もう疲れました。
また今度トライします。