f8g

現在地をGPSで取得してtwitterに送る

WSH。ActiveScriptRubyが必要。あと、GPSはコメットUSB/3とかいうやつ。

var user = "username";
var pass = "password";

var invGeocoderURL = "http://nishioka.sakura.ne.jp/google/ws.php";

var xhr = new ActiveXObject("MSXML2.XMLHTTP");
var sc = new ActiveXObject("ScriptControl");

sc.Language = "RubyScript";
sc.AddCode([
'require "wincom"',
'def open',
'	s = Serial.new',
'	s.open(7, 11, 4800, 8, 0, 0, 1024, 1)',
'	return s',
'end',
'def get(s)',
'	s.receive',
'end',
'def close(s)',
'	s.close()',
'end'].join("\n"));
var ruby = sc.CodeObject;

var gps = ruby.open();

while(true){
try{
		var data = ruby.get(gps).split("\n");
		WScript.Echo(data.join("\n"))

	for(var i = 0; i < data.length; i++){
		if( data[i].match(/\$GPGGA/) ){
			var GPGGA = data[i].split(",");
			var lat_s = GPGGA[2];
			var lng_s = GPGGA[4];
		}

		else if( data[i].match(/\$GPRMC/) ){
			var GPRMC = data[i].split(",");
			var lat_s = GPRMC[3];
			var lng_s = GPRMC[5];
		}
	}

	if(lat_s && lng_s){
		var lat = toLat(lat_s);
		var lng = toLng(lng_s);

		if( isNaN(lat) || isNaN(lng) ) gps_close();

		xhr.open("GET", invGeocoderURL + "?" + makeParam({lat:lat, lon:lng, format:"simple"}), false);
		xhr.send();

		var rXML = xhr.responseXML;
		var pref = rXML.getElementsByTagName("pref")[0].childNodes[0].nodeValue;
		var city = rXML.getElementsByTagName("city")[0].childNodes[0].nodeValue;
		WScript.Echo(["location:", pref, city]);

		xhr.open('POST', "http://twitter.com/statuses/update.json", false, user, pass);
		xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		xhr.setRequestHeader('X-Twitter-Client', 'SendLocationToTwitter');
		xhr.send( 'status=' + encodeURIComponent("Location: " + pref + city) );

		gps_close();
	}
}
	catch(e){ continue; }

	WScript.Sleep(1000);
}

function gps_close(){
	ruby.close(gps);
	WScript.Quit();
}

function toLat(s){
	return parseFloat( s.substr(0, 2) ) + parseFloat( s.substr(2, s.length - 1) ) / 60;
}

function toLng(s){
	return parseFloat( s.substr(0, 3) ) + parseFloat( s.substr(3, s.length - 1) ) / 60;
}

function makeParam(params){
	var param = [];
	for(var k in params)
		param.push(k + "=" + params[k]);
	return param.join("&");
}

逆ジオコーダーは、
http://www.knya.net/archives/2005/07/rest.html
のを使ってます。結構細かいところまで出ますが、cityまでしか送らないようにしてます。というか、あんまり当てになんない。
あーあと、Rubyのシリアルポートのは
http://d.hatena.ne.jp/arikui/20070410#1176197167
のやつ使ってます。Windows限定。

追記

見直してみたらダメな部分があるな。そのまま使わない方がいいですね。
追記2:直しておいた