[ファイアウォール]


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

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

ヤマハの平野です。

今回は、Interop Tokyo 2010で参考出展したつぶやくルーター「@X10_v3」のLuaスクリプト大公開です。

【注意事項】

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

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

1分に1度、質問のつぶやきを取得して、それに対応する回答をつぶやきます。一定時間(120分とか)質問が無い場合には、独り言をつぶやくようになっています。

X10_v3_script

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

  • 漢字コード:
    ヤマハルーターで採用している漢字コードは、シフトJISなのですが、Twitterで利用できる文字コードは、UTF-8です。しかも、HTTP APIであるためURLエンコーディングも必要なので、UTF-8 + URLエンコーディングされた漢字(文字列)を埋め込んでいます。
  • Twitterの認証方式:
    Luaスクリプト機能で搭載予定のHTTPクライアント機能では、Basic認証しか対応しておりません。ヤマハルーターで実際にTwitterにつぶやく場合には、OAuth認証もしくはxAuth認証に対応する必要がありますが、現在の対応予定は未定です。
  • Twitterのアクセス間隔制限について:
    「60秒に1回のアクセス制限」は、rt.sleep()関数で60秒のインターバルを取って実現しています。
  • 通常の質問と回答は、テーブルになっています。when, how much, load, tempは、回答を作る関数を呼び出して、回答を作成しています。

【技術情報】

【Luaスクリプト一覧】

replies_v3.lua】 (720行)

--[[

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

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

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

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

]]

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

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

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

-- メッセージチェックの間隔(秒)…Twitterの制限値
interval = 60

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

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

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

-- 自動のつぶやきテーブル
auto_t = {
	-- 仲間は、Interop Tokyo 2010へ出張なう。
	"%E4%BB%B2%E9%96%93%E3%81%AF%E3%80%81Interop+Tokyo+2010%E3%81%B8%E5%87%BA%E5%BC%B5%E3%81%AA%E3%81%86%E3%80%82",
	-- 仲間は、幕張でお仕事なう。
	"%E4%BB%B2%E9%96%93%E3%81%AF%E3%80%81%E5%B9%95%E5%BC%B5%E3%81%A7%E3%81%8A%E4%BB%95%E4%BA%8B%E3%81%AA%E3%81%86%E3%80%82",
	-- 仲間は、幕張メッセへ出張なう。
	"%E4%BB%B2%E9%96%93%E3%81%AF%E3%80%81%E5%B9%95%E5%BC%B5%E3%83%A1%E3%83%83%E3%82%BB%E3%81%B8%E5%87%BA%E5%BC%B5%E3%81%AA%E3%81%86%E3%80%82",
	-- ヤマハ本社でお留守番なう。
	"%E3%83%A4%E3%83%9E%E3%83%8F%E6%9C%AC%E7%A4%BE%E3%81%A7%E3%81%8A%E7%95%99%E5%AE%88%E7%95%AA%E3%81%AA%E3%81%86%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",
	-- 質問キーワードを @X10_v3 宛てにつぶやいてください。
	"%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",
	-- 質問キーワードは、英数字の英単語を認識します。
	"%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",
	-- 名前は、 @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",
	-- 参考出品X10が質問にお答えしています。
	"%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",
	-- うなぎ食いてぇ~
	"%E3%81%86%E3%81%AA%E3%81%8E%E9%A3%9F%E3%81%84%E3%81%A6%E3%81%87%EF%BD%9E"
}


-- 質問への回答
ans_t = {
	cpu = {
		-- 非公開です。 
		"%E9%9D%9E%E5%85%AC%E9%96%8B%E3%81%A7%E3%81%99%E3%80%82"
	},
	memory = {
		-- 非公開です。 
		"%E9%9D%9E%E5%85%AC%E9%96%8B%E3%81%A7%E3%81%99%E3%80%82"
	},
	lan = {
		-- GbEに対応しています。
		"GbE%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82",
		-- L2スイッチは、4ポートです。
		"L2%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E3%81%AF%E3%80%814%E3%83%9D%E3%83%BC%E3%83%88%E3%81%A7%E3%81%99%E3%80%82"
	},
	wan = {
		-- GbEに対応しています。
		"GbE%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82",
		-- L2スイッチは、4ポートです。
		"1%E3%83%9D%E3%83%BC%E3%83%88%E3%81%A7%E3%81%99%E3%80%82"
	},
	isdn = {
		-- 64kbit/secで同時2回線利用できる電話回線です。
		"64kbit%2Fsec%E3%81%A7%E5%90%8C%E6%99%822%E5%9B%9E%E7%B7%9A%E5%88%A9%E7%94%A8%E3%81%A7%E3%81%8D%E3%82%8B%E9%9B%BB%E8%A9%B1%E5%9B%9E%E7%B7%9A%E3%81%A7%E3%81%99%E3%80%82",
		-- 1ポートです。
		"1%E3%83%9D%E3%83%BC%E3%83%88%E3%81%A7%E3%81%99%E3%80%82",
		-- 1回線利用可能です。
		"1%E5%9B%9E%E7%B7%9A%E5%88%A9%E7%94%A8%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99%E3%80%82",
		-- PSTN回線(アナログ電話回線)と併用できません。
		"PSTN%E5%9B%9E%E7%B7%9A%28%E3%82%A2%E3%83%8A%E3%83%AD%E3%82%B0%E9%9B%BB%E8%A9%B1%E5%9B%9E%E7%B7%9A%29%E3%81%A8%E4%BD%B5%E7%94%A8%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82"
	},
	pstn = {
		-- アナログ電話回線です。
		"%E3%82%A2%E3%83%8A%E3%83%AD%E3%82%B0%E9%9B%BB%E8%A9%B1%E5%9B%9E%E7%B7%9A%E3%81%A7%E3%81%99%E3%80%82",
		-- 1ポートです。
		"1%E3%83%9D%E3%83%BC%E3%83%88%E3%81%A7%E3%81%99%E3%80%82",
		-- 1回線利用可能です。
		"1%E5%9B%9E%E7%B7%9A%E5%88%A9%E7%94%A8%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99%E3%80%82",
		-- ISDN回線とは併用できません。
		"ISDN%E5%9B%9E%E7%B7%9A%E3%81%A8%E3%81%AF%E4%BD%B5%E7%94%A8%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82"
	},
	tel = {
		-- 2ポートです。
		"2%E3%83%9D%E3%83%BC%E3%83%88%E3%81%A7%E3%81%99%E3%80%82",
		-- ISDN電話、PSTN電話(アナログ電話回線)、フレッツ光ネクスト版ひかり電話に接続可能です。
		"ISDN%E9%9B%BB%E8%A9%B1%E3%80%81PSTN%E9%9B%BB%E8%A9%B1%28%E3%82%A2%E3%83%8A%E3%83%AD%E3%82%B0%E9%9B%BB%E8%A9%B1%E5%9B%9E%E7%B7%9A%29%E3%80%81%E3%83%95%E3%83%AC%E3%83%83%E3%83%84%E5%85%89%E3%83%8D%E3%82%AF%E3%82%B9%E3%83%88%E7%89%88%E3%81%B2%E3%81%8B%E3%82%8A%E9%9B%BB%E8%A9%B1%E3%81%AB%E6%8E%A5%E7%B6%9A%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99%E3%80%82"
	},
	analog = {
		-- アナログ電話機をTELポートに接続して利用できます。
		"%E3%82%A2%E3%83%8A%E3%83%AD%E3%82%B0%E9%9B%BB%E8%A9%B1%E6%A9%9F%E3%82%92TEL%E3%83%9D%E3%83%BC%E3%83%88%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%97%E3%81%A6%E5%88%A9%E7%94%A8%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82",
		-- TELポートは、2ポートです。
		"TEL%E3%83%9D%E3%83%BC%E3%83%88%E3%81%AF%E3%80%812%E3%83%9D%E3%83%BC%E3%83%88%E3%81%A7%E3%81%99%E3%80%82"
	},
	voip = {
		-- フレッツ光ネクスト版ひかり電話に接続可能です。
		"%E3%83%95%E3%83%AC%E3%83%83%E3%83%84%E5%85%89%E3%83%8D%E3%82%AF%E3%82%B9%E3%83%88%E7%89%88%E3%81%B2%E3%81%8B%E3%82%8A%E9%9B%BB%E8%A9%B1%E3%81%AB%E6%8E%A5%E7%B6%9A%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99%E3%80%82",
		-- ネットボランチ電話が利用可能です。
		"%E3%83%8D%E3%83%83%E3%83%88%E3%83%9C%E3%83%A9%E3%83%B3%E3%83%81%E9%9B%BB%E8%A9%B1%E3%81%8C%E5%88%A9%E7%94%A8%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99%E3%80%82",
		-- 内線IP電話が利用可能です。
		"%E5%86%85%E7%B7%9AIP%E9%9B%BB%E8%A9%B1%E3%81%8C%E5%88%A9%E7%94%A8%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99%E3%80%823"
	},
	usb = {
		-- 2ポートです。
		"2%E3%83%9D%E3%83%BC%E3%83%88%E3%81%A7%E3%81%99%E3%80%82",
		-- USBメモリー、USB-HDD、携帯データ通信端末が接続可能です。
		"USB%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%BC%E3%80%81USB-HDD%E3%80%81%E6%90%BA%E5%B8%AF%E3%83%87%E3%83%BC%E3%82%BF%E9%80%9A%E4%BF%A1%E7%AB%AF%E6%9C%AB%E3%81%8C%E6%8E%A5%E7%B6%9A%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99%E3%80%82"
	},
	mobile = {
		-- 1回線利用可能です。
		"1%E5%9B%9E%E7%B7%9A%E5%88%A9%E7%94%A8%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99%E3%80%82",
		-- 携帯データ通信端末で、インターネットにアクセス可能です。
		"%E6%90%BA%E5%B8%AF%E3%83%87%E3%83%BC%E3%82%BF%E9%80%9A%E4%BF%A1%E7%AB%AF%E6%9C%AB%E3%81%A7%E3%80%81%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99%E3%80%82",
		-- USBに携帯データ通信端末を1台接続可能です。
		"USB%E3%81%AB%E6%90%BA%E5%B8%AF%E3%83%87%E3%83%BC%E3%82%BF%E9%80%9A%E4%BF%A1%E7%AB%AF%E6%9C%AB%E3%82%921%E5%8F%B0%E6%8E%A5%E7%B6%9A%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99%E3%80%82",
	},
	microsd = {
		-- 1ポートです。
		"1%E3%83%9D%E3%83%BC%E3%83%88%E3%81%A7%E3%81%99%E3%80%82",
		-- microSDメモリとmicroSDHCメモリが接続可能です。
		"microSD%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%A8microSDHC%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%8C%E6%8E%A5%E7%B6%9A%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99%E3%80%82"
	},
	speed = {
		-- 最大スループットは、1Gbpsの予定です。
		"%E6%9C%80%E5%A4%A7%E3%82%B9%E3%83%AB%E3%83%BC%E3%83%97%E3%83%83%E3%83%88%E3%81%AF%E3%80%811Gbps%E3%81%AE%E4%BA%88%E5%AE%9A%E3%81%A7%E3%81%99%E3%80%82"
	},
	qos = {
		-- 優先制御が利用可能です。
		"%E5%84%AA%E5%85%88%E5%88%B6%E5%BE%A1%E3%81%8C%E5%88%A9%E7%94%A8%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99%E3%80%82"
	},
	nat = {
		-- NATテーブルは、4,096個です。
		"NAT%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AF%E3%80%814%2C096%E5%80%8B%E3%81%A7%E3%81%99%E3%80%82"
	},
	eco = {
		-- 省エネモードを用意いたしました。
		"%E7%9C%81%E3%82%A8%E3%83%8D%E3%83%A2%E3%83%BC%E3%83%89%E3%82%92%E7%94%A8%E6%84%8F%E3%81%84%E3%81%9F%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82",
		-- 使用しないインタフェースの電源を自動的にoffする機能があります。
		"%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%AA%E3%81%84%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9%E3%81%AE%E9%9B%BB%E6%BA%90%E3%82%92%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%ABoff%E3%81%99%E3%82%8B%E6%A9%9F%E8%83%BD%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82"
	},
	vpn = {
		-- PPTPは、同時4対地です。
		"PPTP%E3%81%AF%E3%80%81%E5%90%8C%E6%99%824%E5%AF%BE%E5%9C%B0%E3%81%A7%E3%81%99%E3%80%82",
		-- IPsecは、搭載しておりません。
		"IPsec%E3%81%AF%E3%80%81%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"
	},
	ipsec = {
		-- IPsecは、搭載しておりません。
		"IPsec%E3%81%AF%E3%80%81%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"
	},
	pptp = {
		-- PPTPは、同時4対地です。
		"PPTP%E3%81%AF%E3%80%81%E5%90%8C%E6%99%824%E5%AF%BE%E5%9C%B0%E3%81%A7%E3%81%99%E3%80%82"
	},
	share = {
		-- Shareフィルター機能を搭載しています。
		"Share%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E6%A9%9F%E8%83%BD%E3%82%92%E6%90%AD%E8%BC%89%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82",
		-- Shareフィルターは、"Share Version 1.0EX2"に対応しています。
		"Share%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%81%AF%E3%80%81%22Share+Version+1.0EX2%22%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82"
	},
	winny = {
		-- Winnyフィルター機能を搭載しています。
		"Winny%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E6%A9%9F%E8%83%BD%E3%82%92%E6%90%AD%E8%BC%89%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82",
		-- Winnyフィルターは、"Winny Version 2"に対応しています。
		"Winny%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%81%AF%E3%80%81%22Winny+Version+2%22%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82"
	},
	concept = {
		-- 「新しい価値の提案」です。
		"%E3%80%8C%E6%96%B0%E3%81%97%E3%81%84%E4%BE%A1%E5%80%A4%E3%81%AE%E6%8F%90%E6%A1%88%E3%80%8D%E3%81%A7%E3%81%99%E3%80%82",
		-- フレッツ光ネクストのひかり電話が利用可能になります。
		"%E3%83%95%E3%83%AC%E3%83%83%E3%83%84%E5%85%89%E3%83%8D%E3%82%AF%E3%82%B9%E3%83%88%E3%81%AE%E3%81%B2%E3%81%8B%E3%82%8A%E9%9B%BB%E8%A9%B1%E3%81%8C%E5%88%A9%E7%94%A8%E5%8F%AF%E8%83%BD%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82",
		-- 固定回線が施設できない地域でモバイルインターネットが利用可能になります。
		"%E5%9B%BA%E5%AE%9A%E5%9B%9E%E7%B7%9A%E3%81%8C%E6%96%BD%E8%A8%AD%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E5%9C%B0%E5%9F%9F%E3%81%A7%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%8C%E5%88%A9%E7%94%A8%E5%8F%AF%E8%83%BD%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82",
		-- LuaスクリプトやカスタムGUIで、カスタマイズしやすくなります。
		"Lua%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%84%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0GUI%E3%81%A7%E3%80%81%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%81%97%E3%82%84%E3%81%99%E3%81%8F%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82"
	},
	ftth = {
		-- 1Gbpsまでの光ファイバー回線に接続可能になります。
		"1Gbps%E3%81%BE%E3%81%A7%E3%81%AE%E5%85%89%E3%83%95%E3%82%A1%E3%82%A4%E3%83%90%E3%83%BC%E5%9B%9E%E7%B7%9A%E3%81%AB%E6%8E%A5%E7%B6%9A%E5%8F%AF%E8%83%BD%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82"
	},
	adsl = {
		-- 別途ADSLモデムをご利用いただくことで、接続可能になります。
		"%E5%88%A5%E9%80%94ADSL%E3%83%A2%E3%83%87%E3%83%A0%E3%82%92%E3%81%94%E5%88%A9%E7%94%A8%E3%81%84%E3%81%9F%E3%81%A0%E3%81%8F%E3%81%93%E3%81%A8%E3%81%A7%E3%80%81%E6%8E%A5%E7%B6%9A%E5%8F%AF%E8%83%BD%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82"
	},
	catv = {
		-- 別途ケーブルモデムをご利用いただくことで、接続可能になります。
		"%E5%88%A5%E9%80%94%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E3%83%A2%E3%83%87%E3%83%A0%E3%82%92%E3%81%94%E5%88%A9%E7%94%A8%E3%81%84%E3%81%9F%E3%81%A0%E3%81%8F%E3%81%93%E3%81%A8%E3%81%A7%E3%80%81%E6%8E%A5%E7%B6%9A%E5%8F%AF%E8%83%BD%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82"
	},
	rohs = {
		-- RoHSに対応しています。
		"RoHS%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82"
	},
	vcci = {
		-- クラスAです。
		"%E3%82%AF%E3%83%A9%E3%82%B9A%E3%81%A7%E3%81%99%E3%80%82"
	},
	power = {
		-- AC 100V (50Hz/60Hz)です。
		"AC+100V+%2850Hz%2F60Hz%29%E3%81%A7%E3%81%99%E3%80%82"
	},
	pppoe = {
		-- 同時5セッションが利用可能です。
		"%E5%90%8C%E6%99%825%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%8C%E5%88%A9%E7%94%A8%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99%E3%80%82"
	},
	multicast = {
		-- IPv6マルチキャストに対応します。
		"IPv6%E3%83%9E%E3%83%AB%E3%83%81%E3%82%AD%E3%83%A3%E3%82%B9%E3%83%88%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%97%E3%81%BE%E3%81%99%E3%80%82"
	},
	setup = {
		-- WWWブラウザで設定することができます。
		"WWW%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%A7%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82"
	},
	name = {
		-- Interopに参考出品していたX10です。
		"Interop%E3%81%AB%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%A7%E3%81%99%E3%80%82",
		-- 正式名称は、未定です。
		"%E6%AD%A3%E5%BC%8F%E5%90%8D%E7%A7%B0%E3%81%AF%E3%80%81%E6%9C%AA%E5%AE%9A%E3%81%A7%E3%81%99%E3%80%82"
	},
	x10 = {
		-- Interopに参考出品していたX10です。
		"Interop%E3%81%AB%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%A7%E3%81%99%E3%80%82",
		-- 正式名称は、未定です。
		"%E6%AD%A3%E5%BC%8F%E5%90%8D%E7%A7%B0%E3%81%AF%E3%80%81%E6%9C%AA%E5%AE%9A%E3%81%A7%E3%81%99%E3%80%82"
	},
	price = {
		-- 販売価格は、未定です。
		"%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"
	},
	why = {
		-- Luaスクリプト機能のデモとして、Twitterにつぶやいています。
		"Lua%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E6%A9%9F%E8%83%BD%E3%81%AE%E3%83%87%E3%83%A2%E3%81%A8%E3%81%97%E3%81%A6%E3%80%81Twitter%E3%81%AB%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"
	},
	what = {
		-- つぶやくルーターです。
		"%E3%81%A4%E3%81%B6%E3%82%84%E3%81%8F%E3%83%AB%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%A7%E3%81%99%E3%80%82",
		-- GbEに対応したルーターです。
		"GbE%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%97%E3%81%9F%E3%83%AB%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%A7%E3%81%99%E3%80%82",
		-- ISDNに対応したルーターです。
		"ISDN%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%97%E3%81%9F%E3%83%AB%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%A7%E3%81%99%E3%80%82",
		-- モバイル・インターネットに対応したルーターです。
		"%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%97%E3%81%9F%E3%83%AB%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%A7%E3%81%99%E3%80%82"
	},
	who = {
		-- Interop Tokyo 2010に参考出品しているX10です。
		"Interop+Tokyo+2010%E3%81%AB%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%A7%E3%81%99%E3%80%82",
		-- 正式名称は、決まっておりません。
		"%E6%AD%A3%E5%BC%8F%E5%90%8D%E7%A7%B0%E3%81%AF%E3%80%81%E6%B1%BA%E3%81%BE%E3%81%A3%E3%81%A6%E3%81%8A%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82"
	},
	where = {
		-- 浜松市のヤマハ本社です。
		"%E6%B5%9C%E6%9D%BE%E5%B8%82%E3%81%AE%E3%83%A4%E3%83%9E%E3%83%8F%E6%9C%AC%E7%A4%BE%E3%81%A7%E3%81%99%E3%80%82",
		-- 浜松なう。
		"%E6%B5%9C%E6%9D%BE%E3%81%AA%E3%81%86%E3%80%82"
	},
	how = {
		-- ルーターに搭載された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",
		-- 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"
	},
	rtx1200 = {
		-- ばれた~。実は、RTX1200でLuaスクリプトが稼働中です。
		"%E3%81%B0%E3%82%8C%E3%81%9F%EF%BD%9E%E3%80%82%E5%AE%9F%E3%81%AF%E3%80%81RTX1200%E3%81%A7Lua%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%8C%E7%A8%BC%E5%83%8D%E4%B8%AD%E3%81%A7%E3%81%99%E3%80%82",
		-- RTX1200のHTTPクライアント機能は、未定です。
		"RTX1200%E3%81%AEHTTP%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%81%AF%E3%80%81%E6%9C%AA%E5%AE%9A%E3%81%A7%E3%81%99%E3%80%82"
	},
	srt100 = {
		-- SRT100のHTTPクライアント機能は、未定です。
		"SRT100%E3%81%AEHTTP%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%81%AF%E3%80%81%E6%9C%AA%E5%AE%9A%E3%81%A7%E3%81%99%E3%80%82"
	}
}

-- 回答カウンター
ans_cnt_t = {
	cpu = 1,
	memory = 1,
	lan = 1,
	wan = 1,
	isdn = 1,
	pstn = 1,
	tel = 1,
	analog = 1,
	voip = 1,
	usb = 1,
	mobile = 1,
	microsd = 1,
	speed = 1,
	qos = 1,
	nat = 1,
	eco = 1,
	vpn = 1,
	ipsec = 1,
	pptp = 1,
	share = 1,
	winny = 1,
	concept = 1,
	ftth = 1,
	adsl = 1,
	catv = 1,
	rohs = 1,
	vcci = 1,
	power = 1,
	pppoe = 1,
	multicast = 1,
	setup = 1,
	name = 1,
	x10 = 1,
	price = 1,
	why = 1,
	what = 1,
	who = 1,
	where = 1,
	when = 1,
	how = 1,
	temp = 1,
	rtx1200 = 1,
	srt100 = 1
}

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

--------------------------------------------------------
-- 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") then
		str = ans_when()
	elseif (last_q.msg == "how much") then
		str = ans_howmuch()
	elseif (last_q.msg == "load") then
		str = ans_load()
	elseif (last_q.msg == "temp") then
		str = ans_temp()
	end

	-- 通常の質問
	if (ans_t[last_q.msg]) then
		str = ans_normal()
	end

	-- 回答があればReTweet、なければ独り言
	if (str) then
		retweet(str)
		auto_n = 1
	else
		auto_tweet()
	end
end

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

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

	return str
end

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

	if (ans_cnt_t["when"] == 1) then
		t = os.date("*t")
		-- xx時xx分なう。
		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" に返答する関数                         --
--------------------------------------------------------
function ans_load()
	local cpu, err
	local t

	-- 開発中の未公開ライブラリを利用している。
	cpu, err = rt.hw.open("cpu1")
	if (cpu) then
		t = cpu:read()
		cpu:close()
	else
		print(err)
		-- 忙しいです。
		return "%E5%BF%99%E3%81%97%E3%81%84%E3%81%A7%E3%81%99%E3%80%82"
	end

	if (tonumber(t.load_1m) > 50) 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

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


コメント

rt.httprequest() は中々便利そうな関数ですね、是非リリースファームウェアにも載せて欲しいです。
あと、できれば luasocket も 組み込んでいただけると、さらに色々と楽しいことができそうで嬉しいです。

ヤマハの平野です。
ご意見ありがとうございます。検討させていただきます。

開発関係者からのコメント:
そんなものもあったねぇ。ところで、LPegってどう思う?

Lpegとは、これかな。
http://www.inf.puc-rio.br/~roberto/lpeg/lpeg.html

コメントを投稿



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

プロジェクトフォン

会議システムとは、手軽に遠隔地と連絡や議論を行うためのもの。実際は、ハウリングしたり、声が途切れたり、返事が聞こえなかったり。プロジェクトフォンは、会議の音を改善する新しい会議システムです。

ルータ&ファイアウォール



 1995年よりISDN応用製品のひとつとして始めたヤマハルーター。常にSOHO、中堅・中小企業の皆様に最先端のネットワークソリューションを提供し、多くの実績をお客様と共に作って参りました。SRT100は、より信頼性の高いネットワークセキュリティを実現します。