[ファイアウォール]


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

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

ヤマハの平野です。

Interop Tokyo 2010期間中からずっと浜松でQ and A対応して成長した(?)つぶやくルーター「@X10_v3」の改造Luaスクリプト大公開です。

【注意事項】

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

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

@X10_v3の改造版の基本構造は同じです。回答を増やしたり、質問解析で質問を拾いやすくするような改造をしています。また、6/28からタイムスタンプに内部温度を表示しています。動作イメージは、次の図を参照してください。

X10_v3kai

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

  • 変更した関数は、answer()、ans_load()、time_stamp()です。
  • answer()⇒文中の質問キーワードに対する回答
  • ans_load()⇒忙しい/暇の表示をCPU負荷で示していたが、CPU負荷が無い環境なので、時間帯を識別して回答するようにした。
  • time_stamp()⇒タイムスタンプに筐体内温度表示を追記
  • 漢字コード:
    ヤマハルーターで採用している漢字コードは、シフトJISなのですが、Twitterで利用できる文字コードは、UTF-8です。しかも、HTTP APIであるためURLエンコーディングも必要なので、UTF-8 + URLエンコーディングされた漢字(文字列)を埋め込んでいます。
  • Twitterの認証方式:
    Luaスクリプト機能で搭載予定のHTTPクライアント機能では、Basic認証しか対応しておりません。ヤマハルーターで実際にTwitterにつぶやく場合には、OAuth認証もしくはxAuth認証に対応する必要がありますが、現在の対応予定は未定です。

【技術情報】

【Luaスクリプト一覧】

質問keyword一覧

  • 質問キーワード:44語(77パターン)+108語(210パターン)
    ⇒153語(287パターン)
  • 追加キーワードは、Interop期間中にTwitterで質問され、返事できなかったものが中心です。
Interop期間中の質問キーワード回答パターン数
cpu1
memory2
lan2
wan2
isdn4
pstn4
tel2
analog2
voip3
usb2
mobile3
microsd2
speed1
qos1
nat1
eco2
vpn2
ipsec1
pptp1
share2
winny2
concept4
ftth1
adsl1
catv1
rohs1
vcci1
power1
pppoe1
multicast1
setup1
name2
x102
price1
why1
what4
who2
when1
where2
how1
how much1
temp2
rtx12002
srt1001
追加の質問キーワード回答パターン数
bri4
line4
speed1
voltage3
dc3
ac3
fan4
watt1
vrrp1
vlan1
snmp1
arp2
mtbf1
gui1
http1
console1
serial1
ipv61
log3
syslog3
dhcp1
restart2
rip1
bgp1
ospf1
route
ping2
init1
download1
ipaddress1
address1
lan13
lan22
ip1
sleep3
save1
manual2
help2
listen2
hello2
show1
config1
size2
weight1
piafs2
dsu2
nas1
pp1
netvolante4
wifi1
color3
lua3
script3
schedule1
root2
password1
switch6
ntp2
filter2
virus1
dcc1
mail2
soho3
bug3
jan1
green3
it2
qac1
firewall1
telnet3
dmz1
port1
upnp1
foma2
ipip1
pbx2
lamp1
body1
developer3
co23
keepalive1
hostname2
ten2
rtx8002
x13
rt58i2
x92
nine2
release2
interop3
yamaha6
twitter4
breakfast2
lunch2
dinner2
speaker1
hakata1
mode2
syn2
eel2
unagi2
genkotsu2
onigiri2
shinkado2
akaden3
pai4
unagipai2
unagipaivsop2

replies_v3kai.lua】  (1513行)

--[[

 ● 質問キーワードに対して、回答をつぶやくスクリプト(replies_v3kai.lua)

 ・Twitterから自分宛のつぶやきを収集し、質問キーワードを発見したら、
  回答をつぶやきます。

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

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

]]

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

--------------------------##  設定値  ##--------------------------------

-- ユーザー名、パスワード
user = "(TwitterのユーザーID)"
pass = "(Twitterのパスワード)"

-- メッセージチェックの間隔(秒)
interval = 60

-- 最後の質問を保存するテーブル
last_q = {
	name = "dummy",
	msg  = "dummy",
	guid = 0
}

-- 自動つぶやきのカウンタ
auto_c = 1
auto_n = 1

-- 何分質問がなかったら自動でつぶやくか
no_question = 120

-- 自動のつぶやきテーブル
-- 
-- メッセージの文字コードを「UTF-8」にした後、URLエンコーディングしたものを埋め込むこと。
-- 
auto_t = {
	-- 仲間は、帰還なう。
	"%E4%BB%B2%E9%96%93%E3%81%AF%E3%80%81%E5%B8%B0%E9%82%84%E3%81%AA%E3%81%86%E3%80%82",
	-- げんこつハンバーグ食いてぇ~
	"%E3%81%92%E3%82%93%E3%81%93%E3%81%A4%E3%83%8F%E3%83%B3%E3%83%90%E3%83%BC%E3%82%B0%E9%A3%9F%E3%81%84%E3%81%A6%E3%81%87%EF%BD%9E",
	-- .@X10_1gou は、サーバー監視なう。 http://bit.ly/bE10Yr 
	".%40X10_1gou+%E3%81%AF%E3%80%81%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E7%9B%A3%E8%A6%96%E3%81%AA%E3%81%86%E3%80%82+http%3A%2F%2Fbit.ly%2FbE10Yr+",
	-- .@X10_2gou は、LAN監視なう。 http://bit.ly/bE10Yr 
	".%40X10_2gou+%E3%81%AF%E3%80%81LAN%E7%9B%A3%E8%A6%96%E3%81%AA%E3%81%86%E3%80%82+http%3A%2F%2Fbit.ly%2FbE10Yr+",
	-- うなぎ食いてぇ~
	"%E3%81%86%E3%81%AA%E3%81%8E%E9%A3%9F%E3%81%84%E3%81%A6%E3%81%87%EF%BD%9E",
	-- おにぎりハンバーグ食いてぇ~
	"%E3%81%8A%E3%81%AB%E3%81%8E%E3%82%8A%E3%83%8F%E3%83%B3%E3%83%90%E3%83%BC%E3%82%B0%E9%A3%9F%E3%81%84%E3%81%A6%E3%81%87%EF%BD%9E",

	-- ルーターに搭載されたLuaスクリプト機能によりつぶやけるようになりました。
	"%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%AB%E3%82%88%E3%82%8A%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",
	-- Interopで参考出品しているX10がつぶやいています。
	"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%82%8BX10%E3%81%8C%E3%81%A4%E3%81%B6%E3%82%84%E3%81%84%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82++http%3A%2F%2Fbit.ly%2Fds3Ovz",
	-- .@X10_v3 宛ての初期の質問キーワードを公開中。 http://bit.ly/bE10Yr+ 
	".%40X10_v3+%E5%AE%9B%E3%81%A6%E3%81%AE%E5%88%9D%E6%9C%9F%E3%81%AE%E8%B3%AA%E5%95%8F%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E5%85%AC%E9%96%8B%E4%B8%AD%E3%80%82+http%3A%2F%2Fbit.ly%2FbE10Yr%2B+",
	-- 質問キーワードを @X10_v3 宛てにつぶやいてください。 http://bit.ly/ds3Ovz 
	"%E8%B3%AA%E5%95%8F%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92+%40X10_v3+%E5%AE%9B%E3%81%A6%E3%81%AB%E3%81%A4%E3%81%B6%E3%82%84%E3%81%84%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82+http%3A%2F%2Fbit.ly%2Fds3Ovz+",
	-- 質問キーワードは、英数字の英単語を認識します。 http://bit.ly/ds3Ovz 
	"%E8%B3%AA%E5%95%8F%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89%E3%81%AF%E3%80%81%E8%8B%B1%E6%95%B0%E5%AD%97%E3%81%AE%E8%8B%B1%E5%8D%98%E8%AA%9E%E3%82%92%E8%AA%8D%E8%AD%98%E3%81%97%E3%81%BE%E3%81%99%E3%80%82+http%3A%2F%2Fbit.ly%2Fds3Ovz+",
	-- 名前は、 @X10_v3 です。
	"%E5%90%8D%E5%89%8D%E3%81%AF%E3%80%81+%40X10_v3+%E3%81%A7%E3%81%99%E3%80%82",
	-- Luaスクリプト機能にHTTPクライアント機能を拡張し、Twitter APIを叩いています。
	"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%E5%AE%9F%E8%A3%85%E3%81%97%E3%80%81Twitter+API%E3%82%92%E5%8F%A9%E3%81%84%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82",
	-- 参考出品X10が質問にお答えしています。 http://bit.ly/ds3Ovz 
	"%E5%8F%82%E8%80%83%E5%87%BA%E5%93%81X10%E3%81%8C%E8%B3%AA%E5%95%8F%E3%81%AB%E3%81%8A%E7%AD%94%E3%81%88%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82+http%3A%2F%2Fbit.ly%2Fds3Ovz+",
	-- 質問方法は、こちらを見てください。 http://bit.ly/ds3Ovz 
	"%E8%B3%AA%E5%95%8F%E6%96%B9%E6%B3%95%E3%81%AF%E3%80%81%E3%81%93%E3%81%A1%E3%82%89%E3%82%92%E8%A6%8B%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82+http%3A%2F%2Fbit.ly%2Fds3Ovz+"
}



-- 質問への回答
-- 
-- メッセージの文字コードを「UTF-8」にした後、URLエンコーディングしたものを埋め込むこと。
-- 
ans_t = {
	cpu = {
		-- 非公開です。 
		"%E9%9D%9E%E5%85%AC%E9%96%8B%E3%81%A7%E3%81%99%E3%80%82"
	},
--	...
-- 約150語の回答文は、省略。
-- 	...
}

-- 回答カウンター
ans_cnt_t = {
	cpu = 1,
--	...
-- 約150語のカウンターは、省略。
-- 	...
}

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

--------------------------------------------------------
-- twitterAPI用 HTTPリクエストヘッダ                  --
--------------------------------------------------------

-- replies 取得用
rep_t = {
	url = "http://twitter.com/statuses/replies.rss",
	method = "GET",
	auth_type = "basic",
	auth_name = user,
	auth_pass = pass
}

-- status 更新用
update_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"
}

--------------------------------------------------------
-- HTTPリクエストを発行し、bodyを返す関数             --
--------------------------------------------------------
function get_http_msg(req_t)
	local r = rt.httprequest(req_t)

	-- rtn1がNG or 200 OK 以外
	if (not r.rtn1) or (r.code ~= 200) then
		return nil
	end

	return r.body
end

--------------------------------------------------------
-- 最上位の質問を取得する関数                         --
--------------------------------------------------------
function get_top_q()
	local body, item
	local q = {}

	-- replies.rssを取得
	body = get_http_msg(rep_t)
	if (body) then
		item = get_tag_str(body, "item")
		if (item) then
			q = get_q_info(item)
		end
	end

	return q
end

--------------------------------------------------
-- 質問を解析する関数                           --
--------------------------------------------------
function get_q_info(str)
	local a1, a2, b1, b2, des, guid
	local t = {}
	local ptn = "(%w+)%:%s+%@" .. user .. "%s+"
	local ptn_tw = "twitter.com%/"
	local ptn_st = "%/statuses"

	-- descriptionタグの中身を抜き出す
	des = get_tag_str(str, "description")
	print(des)

	-- uidと発言内容を取得
	if (des) then
		a1, a2 = des:find(ptn)
		if (a1) and (a2) then
			t.msg = string.lower(des:sub(a2 + 1))
		end
	end

	-- guidタグの中身を抜き出す
	guid = get_tag_str(str, "guid")
	print(guid)

	if (guid) then
		a1, a2 = guid:find(ptn_tw)
		b1, b2 = guid:find(ptn_st)
		if (a1) and (a2) and (b1) and (b2) then
			t.name = guid:sub(a2 + 1, b1 - 1)
		end

		a1, a2, t.guid = guid:find("statuses/(%d+)")
	end

	return t
end

--------------------------------------------------
-- xmlのタグ内の文字列を抜き出す関数            --
--------------------------------------------------
function get_tag_str(src, tag, init)
	local a1, a2, b1, b2, str
	local head = string.format("<%s>", tag)
	local tail = string.format("", tag)

	if (init) then
		a1 = init
	else
		a1 = 1
	end

	a1, a2 = src:find(head, a1)
	if (a1) and (a2) then
		b1, b2 = src:find(tail, a2 + 1)
		str = src:sub(a2 + 1, b1 - 1)
	end
	
	return str, b2 + 1
end

--------------------------------------------------------
-- 質問が新しいかを調べる関数                         --
--------------------------------------------------------
function comp_q(new_q)
	-- デバッグ情報→コンソールに質問情報を出力
	for k, v in pairs(new_q) do
		print(k,last_q[k],v)
	end

	-- 欠けた情報があればNG
	if (not new_q.name) or (not new_q.msg) or (not new_q.guid) then
		return false
	end

	-- guidが違えば、新しい質問とみなす
	if (new_q.guid == last_q.guid) then
		return false
	end

	-- 前回の質問を記録する。
	for k, v in pairs(new_q) do
		last_q[k] = v
	end

	return true
end

--------------------------------------------------------
-- 質問が新しいとき、返答する関数                     --
--------------------------------------------------------
function answer()
	local str

	-- 特別な質問
	if (last_q.msg == "when") or (last_q.msg:match("when%s+")) or (last_q.msg:match("%s+when")) then
		str = ans_when()
	elseif (last_q.msg == "how much") or (last_q.msg:match("how much%s+")) or (last_q.msg:match("%s+how much")) then
		str = ans_howmuch()
	elseif (last_q.msg == "load") or (last_q.msg:match("load%s+")) or (last_q.msg:match("%s+load")) then
		str = ans_load()
	elseif (last_q.msg == "temp") or (last_q.msg:match("temp%s+")) or (last_q.msg:match("%s+temp")) then
		str = ans_temp()
	-- 通常の質問
	else
		for k, v in pairs(ans_t) do
			for word in last_q.msg:gmatch("(%w+)") do
				if (word == k) then
					str = ans_normal(k)
					break;
				end
			end
		end
	end


	-- 回答があればReTweet、なければ「質問が理解できませんでした。」
	if not (str) then
		str = "%E8%B3%AA%E5%95%8F%E3%81%8C%E7%90%86%E8%A7%A3%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%81%A7%E3%81%97%E3%81%9F%E3%80%82"
	end

	retweet(str)
	auto_n = 1
end

--------------------------------------------------------
-- 通常の質問に返答する関数                           --
--------------------------------------------------------
function ans_normal(key)
	local str = ans_t[key][ans_cnt_t[key]]

	-- 回答カウンタをインクリメント
	ans_cnt_t[key] = ans_cnt_t[key] + 1
	if (ans_cnt_t[key] > #ans_t[key]) then
		ans_cnt_t[key] = 1
	end

	return str
end

--------------------------------------------------------
-- 質問 "when" に返答する関数                         --
--------------------------------------------------------
function ans_when()
	local str, t

	if (ans_cnt_t["when"] == 1) then
		t = os.date("*t")
		str = string.format("%d%%E6%%99%%82%d%%E5%%88%%86%%E3%%81%%AA%%E3%%81%%86%%E3%%80%%82", t.hour, t.min)
		ans_cnt_t["when"] = 2
	else
		str = "%E7%99%BA%E5%A3%B2%E6%99%82%E6%9C%9F%E3%81%AF%E3%80%81%E6%9C%AA%E5%AE%9A%E3%81%A7%E3%81%99%E3%80%82"
		ans_cnt_t["when"] = 1
	end

	return str
end

--------------------------------------------------------
-- 質問 "how much" に返答する関数                      --
--------------------------------------------------------
function ans_howmuch()
	return "%E8%B2%A9%E5%A3%B2%E4%BE%A1%E6%A0%BC%E3%81%AF%E3%80%81%E6%9C%AA%E5%AE%9A%E3%81%A7%E3%81%99%E3%80%82"
end

--------------------------------------------------------
-- 質問 "load" に返答する関数                         --
--------------------------------------------------------
--
-- 6/17 8:00-17:00は忙しいと答える。
--
function ans_load()
	local t = os.date("*t")

	if (t.hour > 8) and (t.hour < 17) then
		return "%E5%BF%99%E3%81%97%E3%81%84%E3%81%A7%E3%81%99%E3%80%82"
	elseif (t.hour == 17) and (t.min == 0) then
		return "%E5%BF%99%E3%81%97%E3%81%84%E3%81%A7%E3%81%99%E3%80%82"
	else
		return "%E6%9A%87%E3%81%A7%E3%81%99%E3%80%82"
	end
end

--------------------------------------------------------
-- 質問 "temp" に返答する関数                         --
--------------------------------------------------------
function ans_temp()
	local str, th, err, tmp

	if (ans_cnt_t["temp"] == 1) then
		-- 温度計は搭載しておりません。
		str = "%E6%B8%A9%E5%BA%A6%E8%A8%88%E3%81%AF%E6%90%AD%E8%BC%89%E3%81%97%E3%81%A6%E3%81%8A%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82"
		ans_cnt_t["temp"] = 2
	else
		-- 開発中の未公開ライブラリを利用している。
		th, err = rt.hw.open("thermometer1")
		if (th) then
			tmp= th:read()
			th:close()
		else
			tmp = 38
			print(err)
		end

		-- xx度です。でも、X10は温度計を搭載していません。
		str = tostring(tmp) .. "%E5%BA%A6%E3%81%A7%E3%81%99%E3%80%82%E3%81%A7%E3%82%82%E3%80%81X10%E3%81%AF%E6%B8%A9%E5%BA%A6%E8%A8%88%E3%82%92%E6%90%AD%E8%BC%89%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82"
		ans_cnt_t["temp"] = 1
	end

	return str
end

--------------------------------------------------------
-- 新しい質問がないとき、リストから自動でつぶやく関数 --
--------------------------------------------------------
function auto_tweet()
	if (auto_n == no_question) then			--- 一定時間質問がなければ、独り言をつぶやく。
		tweet(auto_t[auto_c])

		auto_n = 1

		auto_c = auto_c + 1
		if (auto_c > #auto_t) then
			auto_c = 1
		end
	else
		print("auto_tweet: count = ", auto_n)
		auto_n = auto_n + 1
	end
end

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

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

	if (r.code == 200) then
		print("[twitter] tweet OK.")
	else
		print("[twitter] tweet NG. (status: " .. tostring(r.code) .. ")")
	end
end

--------------------------------------------------
-- retweetする関数                              --
--------------------------------------------------
function retweet(str)
	local r
	local msg

	msg = "in_reply_to=" .. last_q.name .. "&in_reply_to_status_id=" .. tostring(last_q.guid)
	msg = msg .. "&status=" .. str .. " RT @" .. last_q.name .. ": " .. last_q.msg  .. " " ..time_stamp()
	update_t.post_text = msg
	r = rt.httprequest(update_t)

	if (r.code == 200) then
		print("[twitter] retweet OK.")
	else
		print("[twitter] retweet NG. (status: " .. tostring(r.code) .. ")")
	end
end

--------------------------------------------------
-- 日付と時刻、筐体内温度、ハッシュタグ関数を返す関数  --
--------------------------------------------------
function time_stamp()
	local t = os.date("*t")
	local tmp,thermo,err

	-- 筐体内温度取得
	thermo, err = rt.hw.open("thermometer1")
	if (thermo) then
		tmp= thermo:read()
		thermo:close()
	else
		tmp = 38
	end
	--timestamp+筐体内温度+ハッシュタグ
	return string.format("%%28%02d%%2F%02d+%02d%%3A%02d%%3A%02d%%2C%d%%E5%%BA%%A6%%29+%%23yamaha_X10", 
		t.month, t.day, t.hour, t.min, t.sec, tmp)
	--timestamp+ハッシュタグ
--	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

--------------------------------------------------
-- メイン関数                                   --
--------------------------------------------------
while (true) do
	if (comp_q(get_top_q())) then
		print("answer")
		answer()
	else
		print("auto")
		auto_tweet()
	end

	rt.sleep(interval)
end

【Interop Tokyo 2010記事】


トラックバック

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

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


コメント

コメントを投稿



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

プロジェクトフォン

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

ヤマハネットワーク機器

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