[ファイアウォール]


<Interop2010(その22)-つぶやくルーターX10( @X10_1gou )の改造Luaスクリプト #yamaha_X10>

[ファイアウォール] Interop2010(その22)-つぶやくルーターX10( @X10_1gou )の改造Luaスクリプト #yamaha_X10

ヤマハの平野です。

Interop Tokyo 2010から帰還し、6月24日から再稼動したつぶやくルーター「@X10_1gou」の改造Luaスクリプト大公開です。

【注意事項】

  • Luaスクリプト機能における「HTTPクライアント機能拡張」が利用できるファームウェアは、2010年6月時点で一般公開されておりません。
    ※今後のリリース時期は、未定です。
  • 今回公開したLuaスクリプトのTwitterアクセスでは、Basic認証を利用しているため、2010年 6月30日 8月16日以降はご利用いただけません。
    ※OAuth認証もしくはxAuth認証への対応は、未定です。
  • 楽しめたとか、つまらなかったとか、わからなかったとか、ビジネスに生かせる可能性を感じられたとか、セキュリティはどうすんだとか、ご意見がありましたら、rt100i-users当blogへのコメントなどお願いします。

@X10_1gouの改造Luaスクリプト構成】

@X10_1gouの改造版では、いくつかのWebサーバーなどへのpingによる疎通確認と独り言をランダムにつぶやかせるようにしました。動作イメージは、次の図を参照してください。

X10_1goukai

@X10_1gouのLuaスクリプトのポイント】

  • 乱数関数
  • pingコマンドの実行と実行結果の取得、表示
    "match()関数"の使い方が特殊な感じです。よく理解して、使いこなすのが重要です。
  • 一定時間のスリープ動作
  • 論理確認のためのprint()関数とtweet()関数またはrt.httprequest()関数の使い分け。
    プログラムの論理検討段階では、print()関数で動作確認をしていました。論理の確認が出来たところで、漢字コード変換などをして、つぶやき型に一気に切り替えました。今回は、両方のプログラムを紹介します。
  • 漢字コード:
    ヤマハルーターで採用している漢字コードは、シフトJISなのですが、Twitterで利用できる文字コードは、UTF-8です。しかも、HTTP APIであるためURLエンコーディングも必要なので、UTF-8 + URLエンコーディングされた漢字(文字列)を埋め込んでいます。
  • Twitterの認証方式:
    Luaスクリプト機能で搭載予定のHTTPクライアント機能では、Basic認証しか対応しておりません。ヤマハルーターで実際にTwitterにつぶやく場合には、OAuth認証もしくはxAuth認証に対応する必要がありますが、現在の対応予定は未定です。

【pingコマンド実行結果】

Luaスクリプトからpingコマンドを実行すると実行結果が文字列で返ってくるので、そこから必要とする情報を抜き出して、つぶやいている。今回利用している文字列は、に色付けしておいた。は、成功/失敗の判断に。は、結果表示に。

pingコマンドの実施結果例:返事がある。
# ping -c 10 192.168.100.1
192.168.100.1から受信: シーケンス番号=0 ttl=255 時間=0.095ミリ秒
192.168.100.1から受信: シーケンス番号=1 ttl=255 時間=0.053ミリ秒
192.168.100.1から受信: シーケンス番号=2 ttl=255 時間=0.052ミリ秒
192.168.100.1から受信: シーケンス番号=3 ttl=255 時間=0.052ミリ秒
192.168.100.1から受信: シーケンス番号=4 ttl=255 時間=0.052ミリ秒
192.168.100.1から受信: シーケンス番号=5 ttl=255 時間=0.052ミリ秒
192.168.100.1から受信: シーケンス番号=6 ttl=255 時間=0.052ミリ秒
192.168.100.1から受信: シーケンス番号=7 ttl=255 時間=0.052ミリ秒
192.168.100.1から受信: シーケンス番号=8 ttl=255 時間=0.052ミリ秒
192.168.100.1から受信: シーケンス番号=9 ttl=255 時間=0.052ミリ秒

10個のパケットを送信し、10個のパケットを受信しました。0.0%パケットロス
往復遅延 最低/平均/最大 = 0.052/0.056/0.095 ミリ秒
# 
pingコマンドの実施結果例:返事が無い。
# ping -c 10 192.168.100.100

10個のパケットを送信し、0個のパケットを受信しました。100.0%パケットロス
# 

【技術情報】

【Luaスクリプト一覧】

ping_1goukaidebug.lua】  (行)

--[[

 ● ping結果をつぶやくスクリプト(ping_1goudebug.lua)

 ・pingの実行結果をtwitterに状況を投稿する開発過程のスクリプトです。

 ・このファイルをRTFSに保存し、schedule atコマンドで実行してください。
 ・複数実行しないでください。
 ・スクリプトを停止するときは terminate lua コマンドを実行してください。
  再実行するには lua コマンドで実行します。

  2010/06/24 created by mya

 <ノート>
 ・つぶやきたいことは、UTF-8に変換後、URLエンコーディングする必要があります。
  このサイトなどで変換してください。(http://hogehoge.tk/tool/)
 ・本スクリプトファイルを編集する場合、文字コードは必ず Shift-JIS を使用してください。

]]

--------------------------------------------------
-- グローバル変数の設定                         --
--------------------------------------------------

--------------------------##  設定値  ##--------------------------------
-- twitterの設定
user = "(TwitterのユーザーID)"
pass = "(Twitterのパスワード)"

msg_monologue = {
	-- Interopで参考出品していたX10がつぶやいてます。 http://bit.ly/ds3Ovz 
	"Interopで参考出品していたX10がつぶやいてます。 http://bit.ly/ds3Ovz ",
	-- つぶやくルーターX10 ( @X10_1gou )です。 http://bit.ly/ds3Ovz 
	"つぶやくルーターX10 ( @X10_1gou )です。 http://bit.ly/ds3Ovz ",
	-- Luaスクリプト機能にHTTPクライアント機能を拡張して、Twitter APIを叩いてます。 http://bit.ly/ds3Ovz 
	"Luaスクリプト機能にHTTPクライアント機能を拡張して、Twitter APIを叩いてます。 http://bit.ly/ds3Ovz ",
	-- ルーターに搭載されたLuaスクリプト機能があるので、つぶやけるようになりました。 http://bit.ly/ds3Ovz 
	"ルーターに搭載されたLuaスクリプト機能があるので、つぶやけるようになりました。 http://bit.ly/ds3Ovz ",
	-- ヤマハの本社なう。
	"ヤマハの本社なう。",
	-- つぶやくルーターX10 ( @X10_v3 )が質問に回答なう。 http://bit.ly/ds3Ovz 
	"つぶやくルーターX10 ( @X10_v3 )が質問に回答なう。 http://bit.ly/ds3Ovz ",
	--説明はこちらをご覧ください。 http://bit.ly/ds3Ovz 
	"説明はこちらをご覧ください。 http://bit.ly/ds3Ovz ",
	-- 名前は、 @X10_1gou です。 http://bit.ly/ds3Ovz 
	"名前は、 @X10_1gou です。 http://bit.ly/ds3Ovz ",
	-- いくつかのサーバーを監視しています。
	"いくつかのサーバーを監視しています。",
	-- なにか( @X10_v3 )に質問はありませんか? http://bit.ly/ds3Ovz 
	"なにか( @X10_v3 )に質問はありませんか? http://bit.ly/ds3Ovz ",
	-- 浜松なう
	"浜松なう"
}

-- ping を実行する宛先 IP アドレス
dst_tbl = {				-- ★
	"www.yamaha.co.jp",
	"netvolante.jp",
	"netvolante-dns.netvolante.jp"
}

-- ping を実行する宛先名
name_tbl = {				-- ★
	-- ヤマハホームページ
	"ヤマハホームページ",
	-- ネットボランチホームページ
	"ネットボランチホームページ",
	-- ネットボランチDNSサーバー
	"ネットボランチDNSサーバー"
}

----------------------##  設定値ここまで  ##----------------------------

-- httpリクエストテーブル
http_t = {
	url = "http://twitter.com/statuses/update.xml",
	method = "POST",
	auth_type = "basic",
	auth_name = user,
	auth_pass = pass,
	content_type = "application/x-www-form-urlencoded"
}

--------------------------------------------------
-- つぶやく関数                                 --
--------------------------------------------------
function tweet(str)
	local r

	http_t.post_text = "status=" .. str .. time_stamp()
	r = rt.httprequest(http_t)

	if (r.code ~= 200) then
		print("[twitter] Failed to update status.")
	end
end

--------------------------------------------------
-- 日付と時刻、ハッシュタグ関数を返す関数       --
--------------------------------------------------
function time_stamp()
	local t = os.date("*t")
	return string.format("%%28%02d%%2F%02d+%02d%%3A%02d%%3A%02d%%29+%%23yamaha_X10", 
		t.month, t.day, t.hour, t.min, t.sec)
end

--------------------------------------------------
-- twitterへの接続テストをする関数                
--------------------------------------------------
function test_tweet()
	local t = {
		url = "http://twitter.com/help/test.xml",
		method = "GET"
	}

	r = rt.httprequest(t)
	return r.code
end

------------------------------------------------------------
-- "ping -c 10 [HOST]" を実行し、到達したかどうかを返す関数 --
------------------------------------------------------------
function ping_reach(adr)
	local rtn, str, loss
	local reach = false
	local cmd = "ping -c 10 " .. adr
	local ptn = "(%d+)%.%d+%%"

	rtn, str = rt.command(cmd)
	if (rtn) and (str) then
		loss = str:match(ptn)
		if (loss) then
			loss = tonumber(loss)
			if (loss == 0) then
        			reach = true
      			end
    		end
  	end

	return rtn, reach, str
end

--------------------------------------------------
-- メイン                                       --
--------------------------------------------------
local exec_f
local rtn, reach, str
local ping_msg
local msg_count = 1

math.randomseed(os.time())		-- 乱数初期化

-- syslog debug on を設定
assert(rt.command("syslog debug on"), "\r\nスクリプトの初期化に失敗しました。\r\n")
if (test_tweet() ~= 200) then
	print ("ネットワーク接続を確認してください。\r\n")
end

-- LAN1監視し始めたなう。
--tweet("LAN1%E7%9B%A3%E8%A6%96%E3%81%97%E5%A7%8B%E3%82%81%E3%81%9F%E3%81%AA%E3%81%86%E3%80%82")

while (true) do
	exec_f = math.random( #dst_tbl+2 )
	if( exec_f > #dst_tbl ) then
		print ("ping_1goukai.lua: メッセージ",exec_f, msg_monologue[msg_count])  -- debug --
		-- 一定時間経過後の独り言
		print(msg_monologue[msg_count]) -- debug --
--		tweet(msg_monologue[msg_count])
		msg_count = msg_count + 1
		if (msg_count > #msg_monologue) then
			msg_count = 1
		end
	else
		print ("ping_1goukai.lua: ping実行", exec_f, dst_tbl[exec_f], name_tbl[exec_f])  -- debug --

		-- 指定ホストの疎通確認 (ping -c 10 の実行)
		rtn, reach, str = ping_reach(dst_tbl[exec_f])
		ping_msg = name_tbl[exec_f]
		if(str:match("往復遅延")) then
			-- ping 成功
			ping_msg = ping_msg .. "の応答がありました。往復遅延は、最低/平均/最大 "
			ping_msg = ping_msg .. string.format("= %d.%03d/%d.%03d/%d.%03d",
				str:match("= (%d+).(%d+)%/(%d+).(%d+)%/(%d+).(%d+)") )
			ping_msg = ping_msg .. "ミリ秒でした。",
--			ping_msg = ping_msg .. "%E3%81%AE%E5%BF%9C%E7%AD%94%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%E5%BE%80%E5%BE%A9%E9%81%85%E5%BB%B6%E3%81%AF%E3%80%81%E6%9C%80%E4%BD%8E%2F%E5%B9%B3%E5%9D%87%2F%E6%9C%80%E5%A4%A7+%3D+"
--			ping_msg = ping_msg .. string.format("%d.%03d%%2F%d.%03d%%2F%d.%03d",
--				str:match("= (%d+).(%d+)%/(%d+).(%d+)%/(%d+).(%d+)") )
--			ping_msg = ping_msg .. "%E3%83%9F%E3%83%AA%E7%A7%92%E3%81%A7%E3%81%97%E3%81%9F%E3%80%82"
--
		else
			-- ping 失敗
			ping_msg = ping_msg .. "は、pingの応答がありませんでした。大丈夫かな?"
--			ping_msg = ping_msg .. "%E3%81%AF%E3%80%81ping%E3%81%AE%E5%BF%9C%E7%AD%94%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%81%A7%E3%81%97%E3%81%9F%E3%80%82%E5%A4%A7%E4%B8%88%E5%A4%AB%E3%81%8B%E3%81%AA%3F"
		end
		print(ping_msg) -- debug --
--		tweet(ping_msg)
	end

	rt.sleep(math.random(30, 60))  -- 30秒~60秒の待機
end

print("end")

ping_1goukai.lua】  (194行)

--[[

 ● ping結果をつぶやくスクリプト(ping_1goudebug.lua)

 ・pingの実行結果をtwitterに状況を投稿する開発過程のスクリプトです。

 ・このファイルをRTFSに保存し、schedule atコマンドで実行してください。
 ・複数実行しないでください。
 ・スクリプトを停止するときは terminate lua コマンドを実行してください。
  再実行するには lua コマンドで実行します。

  2010/06/24 created by mya

 <ノート>
 ・つぶやきたいことは、UTF-8に変換後、URLエンコーディングする必要があります。
  このサイトなどで変換してください。(http://hogehoge.tk/tool/)
 ・本スクリプトファイルを編集する場合、文字コードは必ず Shift-JIS を使用してください。

]]

--------------------------------------------------
-- グローバル変数の設定                         --
--------------------------------------------------

--------------------------##  設定値  ##--------------------------------
-- twitterの設定
user = "(TwitterのユーザーID)"
pass = "(Twitterのパスワード)"

msg_monologue = {
	--Interopで参考出品していたX10がつぶやいてます。 http://bit.ly/ds3Ovz 
	"Interop%E3%81%A7%E5%8F%82%E8%80%83%E5%87%BA%E5%93%81%E3%81%97%E3%81%A6%E3%81%84%E3%81%9FX10%E3%81%8C%E3%81%A4%E3%81%B6%E3%82%84%E3%81%84%E3%81%A6%E3%81%BE%E3%81%99%E3%80%82+http%3A%2F%2Fbit.ly%2Fds3Ovz+",
	-- つぶやくルーターX10 ( @X10_1gou )です。 http://bit.ly/ds3Ovz 
	"%E3%81%A4%E3%81%B6%E3%82%84%E3%81%8F%E3%83%AB%E3%83%BC%E3%82%BF%E3%83%BCX10+%28+%40X10_1gou+%29%E3%81%A7%E3%81%99%E3%80%82+http%3A%2F%2Fbit.ly%2Fds3Ovz+",
	-- Luaスクリプト機能にHTTPクライアント機能を拡張して、Twitter APIを叩いてます。 http://bit.ly/ds3Ovz 
	"Lua%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E6%A9%9F%E8%83%BD%E3%81%ABHTTP%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E6%A9%9F%E8%83%BD%E3%82%92%E6%8B%A1%E5%BC%B5%E3%81%97%E3%81%A6%E3%80%81Twitter+API%E3%82%92%E5%8F%A9%E3%81%84%E3%81%A6%E3%81%BE%E3%81%99%E3%80%82+http%3A%2F%2Fbit.ly%2Fds3Ovz+",
	-- ルーターに搭載されたLuaスクリプト機能があるので、つぶやけるようになりました。 http://bit.ly/ds3Ovz 
	"%E3%83%AB%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%AB%E6%90%AD%E8%BC%89%E3%81%95%E3%82%8C%E3%81%9FLua%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E6%A9%9F%E8%83%BD%E3%81%8C%E3%81%82%E3%82%8B%E3%81%AE%E3%81%A7%E3%80%81%E3%81%A4%E3%81%B6%E3%82%84%E3%81%91%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82+http%3A%2F%2Fbit.ly%2Fds3Ovz+",
	-- ヤマハの本社なう。
	"%E3%83%A4%E3%83%9E%E3%83%8F%E3%81%AE%E6%9C%AC%E7%A4%BE%E3%81%AA%E3%81%86%E3%80%82",
	-- つぶやくルーターX10 ( @X10_v3 )が質問に回答なう。 http://bit.ly/ds3Ovz 
	"%E3%81%A4%E3%81%B6%E3%82%84%E3%81%8F%E3%83%AB%E3%83%BC%E3%82%BF%E3%83%BCX10+%28+%40X10_v3+%29%E3%81%8C%E8%B3%AA%E5%95%8F%E3%81%AB%E5%9B%9E%E7%AD%94%E3%81%AA%E3%81%86%E3%80%82+http%3A%2F%2Fbit.ly%2Fds3Ovz+",
	--説明はこちらをご覧ください。 http://bit.ly/ds3Ovz 
	"%E8%AA%AC%E6%98%8E%E3%81%AF%E3%81%93%E3%81%A1%E3%82%89%E3%82%92%E3%81%94%E8%A6%A7%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82+http%3A%2F%2Fbit.ly%2Fds3Ovz+",
	-- 名前は、 @X10_1gou です。 http://bit.ly/ds3Ovz 
	"%E5%90%8D%E5%89%8D%E3%81%AF%E3%80%81+%40X10_1gou+%E3%81%A7%E3%81%99%E3%80%82+http%3A%2F%2Fbit.ly%2Fds3Ovz+",
	--いくつかのサーバーを監視しています。
	"%E3%81%84%E3%81%8F%E3%81%A4%E3%81%8B%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92%E7%9B%A3%E8%A6%96%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82",
	-- なにか( @X10_v3 )に質問はありませんか? http://bit.ly/ds3Ovz 
	"%E3%81%AA%E3%81%AB%E3%81%8B%28+%40X10_v3+%29%E3%81%AB%E8%B3%AA%E5%95%8F%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%81%8B%3F+http%3A%2F%2Fbit.ly%2Fds3Ovz+",
	-- 浜松なう
	"%E6%B5%9C%E6%9D%BE%E3%81%AA%E3%81%86"
}

-- ping を実行する宛先 IP アドレス
dst_tbl = {				-- ★
	"www.yamaha.co.jp",
	"netvolante.jp",
	"netvolante-dns.netvolante.jp"
}

-- ping を実行する宛先名
name_tbl = {				-- ★
	-- ヤマハホームページ
	"%E3%83%A4%E3%83%9E%E3%83%8F%E3%83%9B%E3%83%BC%E3%83%A0%E3%83%9A%E3%83%BC%E3%82%B8",
	-- ネットボランチホームページ
	"%E3%83%8D%E3%83%83%E3%83%88%E3%83%9C%E3%83%A9%E3%83%B3%E3%83%81%E3%83%9B%E3%83%BC%E3%83%A0%E3%83%9A%E3%83%BC%E3%82%B8",
	-- ネットボランチDNSサーバー
	"%E3%83%8D%E3%83%83%E3%83%88%E3%83%9C%E3%83%A9%E3%83%B3%E3%83%81DNS%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC"
}

----------------------##  設定値ここまで  ##----------------------------

-- httpリクエストテーブル
http_t = {
	url = "http://twitter.com/statuses/update.xml",
	method = "POST",
	auth_type = "basic",
	auth_name = user,
	auth_pass = pass,
	content_type = "application/x-www-form-urlencoded"
}

--------------------------------------------------
-- つぶやく関数                                 --
--------------------------------------------------
function tweet(str)
	local r

	http_t.post_text = "status=" .. str .. time_stamp()
	r = rt.httprequest(http_t)

	if (r.code ~= 200) then
		print("[twitter] Failed to update status.")
	end
end

--------------------------------------------------
-- 日付と時刻、ハッシュタグ関数を返す関数       --
--------------------------------------------------
function time_stamp()
	local t = os.date("*t")
	return string.format("%%28%02d%%2F%02d+%02d%%3A%02d%%3A%02d%%29+%%23yamaha_X10", 
		t.month, t.day, t.hour, t.min, t.sec)
end

--------------------------------------------------
-- twitterへの接続テストをする関数                
--------------------------------------------------
function test_tweet()
	local t = {
		url = "http://twitter.com/help/test.xml",
		method = "GET"
	}

	r = rt.httprequest(t)
	return r.code
end

------------------------------------------------------------
-- "ping -c 10 [HOST]" を実行し、到達したかどうかを返す関数 --
------------------------------------------------------------
function ping_reach(adr)
	local rtn, str, loss
	local reach = false
	local cmd = "ping -c 10 " .. adr
	local ptn = "(%d+)%.%d+%%"

	rtn, str = rt.command(cmd)
	if (rtn) and (str) then
		loss = str:match(ptn)
		if (loss) then
			loss = tonumber(loss)
			if (loss == 0) then
        			reach = true
      			end
    		end
  	end

	return rtn, reach, str
end

--------------------------------------------------
-- メイン                                       --
--------------------------------------------------
local exec_f
local rtn, reach, str
local ping_msg
local msg_count = 1

math.randomseed(os.time())		-- 乱数初期化

-- syslog debug on を設定
assert(rt.command("syslog debug on"), "\r\nスクリプトの初期化に失敗しました。\r\n")
if (test_tweet() ~= 200) then
	print ("ネットワーク接続を確認してください。\r\n")
end

-- LAN1監視し始めたなう。
--tweet("LAN1%E7%9B%A3%E8%A6%96%E3%81%97%E5%A7%8B%E3%82%81%E3%81%9F%E3%81%AA%E3%81%86%E3%80%82")

while (true) do
	exec_f = math.random( #dst_tbl+2 )
	if( exec_f > #dst_tbl ) then
		-- 一定時間経過後の独り言
		tweet(msg_monologue[msg_count])
		msg_count = msg_count + 1
		if (msg_count > #msg_monologue) then
			msg_count = 1
		end
	else
		-- 指定ホストの疎通確認 (ping -c 10 の実行)
		rtn, reach, str = ping_reach(dst_tbl[exec_f])
		ping_msg = name_tbl[exec_f]
		if(str:match("往復遅延")) then
			-- ping 成功
			ping_msg = ping_msg .. "%E3%81%AE%E5%BF%9C%E7%AD%94%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%E5%BE%80%E5%BE%A9%E9%81%85%E5%BB%B6%E3%81%AF%E3%80%81%E6%9C%80%E4%BD%8E%2F%E5%B9%B3%E5%9D%87%2F%E6%9C%80%E5%A4%A7+%3D+"
			ping_msg = ping_msg .. string.format("%d.%03d%%2F%d.%03d%%2F%d.%03d",
				str:match("= (%d+).(%d+)%/(%d+).(%d+)%/(%d+).(%d+)") )
			ping_msg = ping_msg .. "+%E3%83%9F%E3%83%AA%E7%A7%92%E3%81%A7%E3%81%97%E3%81%9F%E3%80%82"

		else
			-- ping 失敗
			ping_msg = ping_msg .. "%E3%81%AF%E3%80%81ping%E3%81%AE%E5%BF%9C%E7%AD%94%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%81%A7%E3%81%97%E3%81%9F%E3%80%82%E5%A4%A7%E4%B8%88%E5%A4%AB%E3%81%8B%E3%81%AA%3F"
		end
		tweet(ping_msg)
	end

	rt.sleep(math.random(1800, 5400))  -- 30分(1800)~90分(5400)の待機
end

print("end")

【Interop Tokyo 2010記事】


トラックバック

このページのトラックバックURL:
http://www.typepad.jp/t/trackback/240314/6969950

このページへのトラックバック一覧


コメント

コメントを投稿



ヤマハのネットワーク製品

プロジェクトフォン

「音」をソリューションとした製品で快適なコミュニケーション・働き方改革などを支援します。

ヤマハネットワーク機器

「見える・つなぐ・ヤマハ」- ヤマハネットワーク機器で運用管理を簡単に。より信頼性の高いネットワークセキュリティを実現します。