<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>クレコ &#187; Twitter</title>
	<atom:link href="http://creco.net/tag/twitter/feed/" rel="self" type="application/rss+xml" />
	<link>http://creco.net</link>
	<description>East or west, home is best.</description>
	<lastBuildDate>Fri, 27 Nov 2009 13:26:56 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://creco.net/tag/twitter/feed/" />
		<item>
		<title>TwitterをSoftalkのゆっくりボイスでしゃべらせる 2</title>
		<link>http://creco.net/2009/07/17/softalk_twitter_to_bring_out_slowly_in_a_voice_of/</link>
		<comments>http://creco.net/2009/07/17/softalk_twitter_to_bring_out_slowly_in_a_voice_of/#comments</comments>
		<pubDate>Thu, 16 Jul 2009 22:39:31 +0000</pubDate>
		<dc:creator>inagaki</dc:creator>
				<category><![CDATA[作ってみた]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Softalk]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://creco.net/2009/07/17/softalk_twitter_to_bring_out_slowly_in_a_voice_of/</guid>
		<description><![CDATA[TwitterをSoftalkのゆっくりボイスでしゃべらせる &#124; クレコ
では、python-twitterというライブラリを使っていたわけですが、そもそもタイムライン、メンションを読むだけなら、そこまで高機能なのはいら [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://creco.net/2009/04/13/softalk_tweet_timeline_of_twitter/">TwitterをSoftalkのゆっくりボイスでしゃべらせる | クレコ</a></p>
<p>では、python-twitterというライブラリを使っていたわけですが、そもそもタイムライン、メンションを読むだけなら、そこまで高機能なのはいらない！それに、導入するのが面倒！ってわけで、簡単お気軽に導入できるようにしてみた。</p>
<p> <span id="more-714"></span><br />
<h3>ソース</h3>
<pre class="csharpcode"># -*- coding: utf-8 -*-

import feedparser, os, nkf, re, time

# config
userName = <span class="str">&quot;USERNAME&quot;</span>
passWord = <span class="str">&quot;PASSWORD&quot;</span>
softalkPath = <span class="str">&quot;C:\softalk\softalk.exe&quot;</span>
softalkSpeed = <span class="str">&quot;120&quot;</span>
lastSinceId = 1
lastGetTime = 0

# convert <span class="kwrd">string</span>
def convertString(<span class="kwrd">string</span>):
    # remove HTML entity
    <span class="kwrd">string</span> = re.sub(<span class="str">'&amp;.+;'</span>, <span class="str">' '</span>, <span class="kwrd">string</span>)
    # remove URL
    <span class="kwrd">string</span> = re.sub(<span class="str">'(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&amp;=+\$,%#]+)'</span>, u<span class="str">'ウェブ'</span>, <span class="kwrd">string</span>)

    # remove quote
    <span class="kwrd">string</span> = re.sub(<span class="str">'&quot;'</span>, <span class="str">' '</span>, <span class="kwrd">string</span>)
    <span class="kwrd">string</span> = re.sub(<span class="str">&quot;'&quot;</span>, <span class="str">' '</span>, <span class="kwrd">string</span>)
    <span class="kwrd">string</span> = re.sub(<span class="str">'\/'</span>, <span class="str">' '</span>, <span class="kwrd">string</span>)

    # remove my username
    <span class="kwrd">string</span> = re.sub(<span class="str">'@'</span> + userName , u<span class="str">'あなた'</span>, <span class="kwrd">string</span>)

    # convert unicode to sjis <span class="kwrd">using</span> nkf module
    <span class="kwrd">string</span> = nkf.nkf(<span class="str">&quot;-sX&quot;</span>, <span class="kwrd">string</span>.encode(<span class="str">&quot;utf8&quot;</span>))

    <span class="kwrd">return</span> <span class="kwrd">string</span>

# get twitter timeline
def getTimeline():
    global lastSinceId

    rss = feedparser.parse(<span class="str">'https://'</span> + userName + <span class="str">':'</span> + passWord + <span class="str">'@twitter.com/statuses/mentions.rss?since_id='</span> + str(lastSinceId) )
#    rss = feedparser.parse(<span class="str">'https://'</span> + userName + <span class="str">':'</span> + passWord + <span class="str">'@twitter.com/statuses/friends_timeline.rss?since_id='</span> + str(lastSinceId) )

    <span class="kwrd">if</span> len(rss.entries) &gt; 0:
        lastSinceId = re.search(<span class="str">'\d+$'</span>, rss.entries[0].guid).group()

    reversed(rss.entries)

    <span class="kwrd">for</span> i <span class="kwrd">in</span> rss.entries[::-1]:
        print <span class="str">&quot;%s&quot;</span> % (convertString(i.title))
        os.system(<span class="str">'&quot;'</span> + softalkPath + <span class="str">'&quot; /V:60 /S:'</span>+softalkSpeed+<span class="str">' /T:3 /W:'</span> + convertString(i.title))

<span class="kwrd">while</span> True:
    # time span of get timeline
    <span class="kwrd">if</span> time.time() &gt; lastGetTime + 60:
        lastGetTime = time.time()
        getTimeline()
    <span class="kwrd">else</span>:
        time.sleep(5)</pre>
<h3>解説</h3>
<h4>導入するもの<br />
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
</h4>
<ul>
<li>Python実行環境</li>
<li><a href="http://www.feedparser.org/">feedparser</a></li>
<li>nkf</li>
<li>SofTalk ver0151（複数起動ができるバージョン）</li>
</ul>
<h4>やっていること</h4>
<p>今回は、feedparser使ってRSSで取得をしています。since_idで最新のものだけを取得しますが、20件以上あった場合のページ処理はしていませんので注意！20件以上あると読み上げが追いつかなくなりそうですけど。</p>
<p>あとは取得した本文をフィルタかけて読み上げるだけ。前はURLとかも全部読ませていたけど、URLなんて読み上げられたところでどうしようもないので、省略して「ウェブ」とだけ読み上げるようにしました。</p>
<p>これも、適当にカスタマイズして使ってもらえればうれしいです。ではでは！</p>
]]></content:encoded>
			<wfw:commentRss>http://creco.net/2009/07/17/softalk_twitter_to_bring_out_slowly_in_a_voice_of/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://creco.net/2009/07/17/softalk_twitter_to_bring_out_slowly_in_a_voice_of/" />
	</item>
		<item>
		<title>iPhone OS 3.0 のブラウザから使えるようになったGPS現在位置情報をTwitterに投稿するJavaScript</title>
		<link>http://creco.net/2009/06/17/iphone-os-3_with_w3c_geolocation_api/</link>
		<comments>http://creco.net/2009/06/17/iphone-os-3_with_w3c_geolocation_api/#comments</comments>
		<pubDate>Wed, 17 Jun 2009 13:09:47 +0000</pubDate>
		<dc:creator>inagaki</dc:creator>
				<category><![CDATA[作ってみた]]></category>
		<category><![CDATA[Geolocation]]></category>
		<category><![CDATA[GPS]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[ジオポ]]></category>

		<guid isPermaLink="false">http://creco.net/2009/06/17/iphone-os-3_with_w3c_geolocation_api/</guid>
		<description><![CDATA[
Google Maps API V3 と Gears Geolocation API 使って Android のブラウザで現在位置情報を取得する &#124; クレコ では、Androidのブラウザで現在位置情報取得してTwit [...]]]></description>
			<content:encoded><![CDATA[<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="iphone" border="0" alt="iphone" src="http://creco.net/wp-content/uploads/iphone.jpg" width="192" height="365" /></p>
<p><a href="http://creco.net/2009/06/11/google_maps_api_v3_with_gears_geolocation_api/">Google Maps API V3 と Gears Geolocation API 使って Android のブラウザで現在位置情報を取得する | クレコ</a> では、Androidのブラウザで現在位置情報取得してTwitterにポストするというJavaScriptを作りました。</p>
<p>今回は、それのiPhone版です。要 iPhone OS 3.0以上なので、まだアップデートされてない方は本日のアップデートを楽しみに待ちましょう。</p>
<p> <span id="more-573"></span><br />
<h3>iPhone OS 3.0 のブラウザ Mobile Safari でGPS現在位置情報が取得できるようになった</h3>
<h4>Mobile Safari の W3C Geolocation API 対応</h4>
<p><a href="http://lab.cirius.co.jp/blog/2009/06/-iphone-safari.php">ついに iPhone Safari ブラウザから位置情報を取得できるようになります &#8211; Cirius Lab. ブログ</a> から知ったのですが、iPhone OS 3.0 に標準搭載されているブラウザ Mobile Safari が W3C の Geolocation API に対応して、ブラウザから JavaScript を用いることによって、GPSの現在位置情報を取得することが可能になりました。</p>
<p>これによって、いままでネイティブアプリでしかできなかったことが、簡単に敷居なく実装することが可能です。</p>
<h4>W3CのGeolocation API って？</h4>
<p><a href="http://www.w3.org/TR/geolocation-API/">Geolocation API Specification</a>     <br />W3Cで標準化を進めている、位置情報を取得するためのAPI使用のことです。</p>
<p>位置情報を取得するメソッドには、<strong>getCurrentPosition()</strong> と <strong>watchPosition()</strong> があり、前者は現在の位置情報を取得するメソッド、後者は連続した位置情報を取得するメソッドとなっています。</p>
<p>つまり、従来の携帯電話ではできなかった、連続した位置情報を扱うGPSトラッキングなどもJavaScriptを記述するだけで実現できるのです！</p>
<h3>実際に現在位置情報をTwitterへポストするJavaScriptを作ってみた</h3>
<h4>JavaScript ソース</h4>
<pre class="csharpcode">&lt;html&gt;
&lt;head&gt;
&lt;meta name=<span class="str">&quot;viewport&quot;</span> content=<span class="str">&quot;initial-scale=1.0, user-scalable=no&quot;</span> /&gt;
&lt;meta http-equiv=<span class="str">&quot;content-type&quot;</span> content=<span class="str">&quot;text/html; charset=UTF-8&quot;</span>/&gt;
&lt;title&gt;GeoPo : Mobile Safari&lt;/title&gt;
&lt;script type=<span class="str">&quot;text/javascript&quot;</span> src=<span class="str">&quot;http://maps.google.com/maps/api/js?sensor=true&quot;</span>&gt;&lt;/script&gt;
&lt;script type=<span class="str">&quot;text/javascript&quot;</span>&gt;

<span class="rem">/*</span>
<span class="rem"> * GeoPo Encode in JavaScript</span>
<span class="rem"> * @author : Shintaro Inagaki</span>
<span class="rem"> * @param location (Object)</span>
<span class="rem"> * @return geopo (String)</span>
<span class="rem"> */</span>
<span class="kwrd">function</span> geopoEncode(location){
    <span class="rem">// 64characters (number + big and small letter + hyphen + underscore)</span>
    <span class="kwrd">var</span> chars = <span class="str">&quot;0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_&quot;</span>;

    <span class="kwrd">var</span> geopo = <span class="kwrd">new</span> String();
    <span class="kwrd">var</span> lat = parseFloat(location.lat); <span class="rem">// Parse as float</span>
    <span class="kwrd">var</span> lng = parseFloat(location.lng); <span class="rem">// Parse as float</span>
    <span class="kwrd">var</span> scale = parseInt(location.scale); <span class="rem">// Parse as int</span>

    <span class="rem">// Change a degree measure to a decimal number</span>
    lat = (lat + 90) / 180 * Math.pow(8, 10);
    lng = (lng + 180) / 360 * Math.pow(8, 10);

    <span class="rem">// Compute a GeoPo code from head and concatenate</span>
    <span class="kwrd">for</span>(<span class="kwrd">var</span> i = 0; i &lt; scale; i++) {
        geopo = geopo + chars.substr(Math.floor(lat / Math.pow(8, 9 - i) % 8) + Math.floor(lng / Math.pow(8, 9 - i) % 8) * 8, 1);
    }
    <span class="kwrd">return</span> geopo;
}

<span class="kwrd">var</span> lat;
<span class="kwrd">var</span> lng;
<span class="kwrd">var</span> latLng;
<span class="kwrd">var</span> geocoder = <span class="kwrd">new</span> google.maps.Geocoder();
<span class="kwrd">var</span> map;
<span class="kwrd">var</span> infowindow = <span class="kwrd">new</span> google.maps.InfoWindow();
<span class="kwrd">var</span> marker;
<span class="kwrd">var</span> watchId;

<span class="kwrd">function</span> update(position) {
    lat = position.coords.latitude;
    lng = position.coords.longitude;
    latLng = <span class="kwrd">new</span> google.maps.LatLng(lat,lng);

    <span class="kwrd">if</span>(!map){
        <span class="kwrd">var</span> options = {
            zoom: 15,
            center: latLng,
            mapTypeId: google.maps.MapTypeId.ROADMAP,
            scaleControl: <span class="kwrd">true</span>,
        }
        map = <span class="kwrd">new</span> google.maps.Map(document.getElementById(<span class="str">&quot;map_canvas&quot;</span>), options);
    } <span class="kwrd">else</span>{
        map.set_center(latLng);
    }

    <span class="kwrd">if</span>(!marker){
        marker = <span class="kwrd">new</span> google.maps.Marker({
            position: latLng,
            map: map,
            title: <span class="str">&quot;現在地&quot;</span>,
        });
        google.maps.<span class="kwrd">event</span>.addListener(marker, <span class="str">'click'</span>, <span class="kwrd">function</span>() {
            stopUpdate()
            geocoding();
        });
        google.maps.<span class="kwrd">event</span>.addListener(infowindow, <span class="str">'closeclick'</span>, <span class="kwrd">function</span>() {
            startUpdate()
        });
    } <span class="kwrd">else</span>{
        marker.set_position(latLng);
    }
}

<span class="kwrd">function</span> geocoding() {
    <span class="rem">// geopo</span>
    <span class="kwrd">var</span> location = <span class="kwrd">new</span> Object();
    location.lat = lat;
    location.lng = lng;
    location.scale = 7;
    <span class="kwrd">var</span> geopo = geopoEncode(location);

    geocoder.geocode({<span class="str">'latLng'</span>: latLng}, <span class="kwrd">function</span>(results, status) {
        <span class="kwrd">if</span> (status == google.maps.GeocoderStatus.OK) {
            <span class="kwrd">var</span> geocodeAddress;
            <span class="kwrd">for</span>(i=1; i&lt;results.length; i++){
                <span class="kwrd">if</span> (results[i].types.length &gt;= 2 &amp;&amp; results[i].types[1] == <span class="str">&quot;political&quot;</span>) {
                    <span class="kwrd">if</span>(results[i].formatted_address.indexOf(<span class="str">&quot;日本&quot;</span>) != -1){
                        geocodeAddress = results[i].formatted_address.substring(2);
                    }<span class="kwrd">else</span>{
                        geocodeAddress = results[i].formatted_address;
                    }
                    <span class="kwrd">break</span>;
                }
            }
            <span class="kwrd">if</span>(geocodeAddress){
                infowindow.set_content(<span class="str">'&lt;strong&gt;現在地：&lt;/strong&gt;&lt;br /&gt;&lt;span style=&quot;font-size:80%&quot;&gt;'</span> + geocodeAddress + <span class="str">'&lt;/span&gt;&lt;hr /&gt;&lt;a href=&quot;http://twitter.com/home?status='</span> + encodeURIComponent(<span class="str">' L:'</span> + geocodeAddress + <span class="str">' http://geopo.at/'</span> + geopo) + <span class="str">'&quot; target=&quot;twitter&quot;&gt;&lt;img src=&quot;icon_twitter.gif&quot; width=&quot;14&quot; height=&quot;16&quot; border=&quot;0&quot; align=&quot;bottom&quot; hspace=&quot;5&quot; /&gt;TwitterにPOSTする&lt;/a&gt;'</span>);
                infowindow.open(map, marker);
            } <span class="kwrd">else</span> {
                alert(<span class="str">&quot;現在地が取得できませんでした＞＜&quot;</span>);
            }
        } <span class="kwrd">else</span> {
            alert(<span class="str">&quot;Geocoder failed due to: &quot;</span> + status);
        }
    });
}

<span class="kwrd">function</span> startUpdate() {
    watchId = navigator.geolocation.watchPosition(update);
}

<span class="kwrd">function</span> stopUpdate() {
    navigator.geolocation.clearWatch(watchId);
}

startUpdate();

&lt;/script&gt;
&lt;/head&gt;
&lt;body style=<span class="str">&quot;margin:0px; padding:0px;&quot;</span>&gt;
&lt;div id=<span class="str">&quot;map_canvas&quot;</span> style=<span class="str">&quot;width: 100%; height: 100%;&quot;</span>&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<h4>前回の数倍丁寧に解説<br />
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
</h4>
<p>前回のAndroid版では説明が省略されすぎて、説明になってなかった反省を踏まえて丁寧に解説。</p>
<h5>HTML</h5>
<p>前回と同様、<a href="http://code.google.com/intl/ja/apis/maps/documentation/v3/">Google Maps API V3</a> を使います。</p>
<pre class="csharpcode">&lt;meta name=<span class="str">&quot;viewport&quot;</span> content=<span class="str">&quot;initial-scale=1.0, user-scalable=no&quot;</span> /&gt;</pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>これは、iPhoneのためのmeta要素です。地図上でピンチイン、ピンチアウトを使った拡大縮小できるように、<strong>user-scalable</strong>はnoにして、HTMLでの拡大縮小はできなくしてます。</p>
<pre class="csharpcode">&lt;script type=<span class="str">&quot;text/javascript&quot;</span> src=<span class="str">&quot;http://maps.google.com/maps/api/js?sensor=true&quot;</span>&gt;&lt;/script&gt;</pre>
<p>Google Maps API V3のJavaScript読み込みですが、位置情報を取得できるデバイスでは<strong>sensor</strong>パラメータをtrueにします。</p>
<pre class="csharpcode">&lt;body style=<span class="str">&quot;margin:0px; padding:0px;&quot;</span>&gt;
&lt;div id=<span class="str">&quot;map_canvas&quot;</span> style=<span class="str">&quot;width: 100%; height: 100%;&quot;</span>&gt;&lt;/div&gt;
&lt;/body&gt;</pre>
<p>divタグで地図を表示する領域を作成、めいっぱいにするため、縦横100%にし、bodyタグでは余白をなしにするCSS。</p>
<p>うん、丁寧な説明ですね。</p>
<h5>GeoPoエンコードライブラリ</h5>
<p><a href="http://geopo.at/">ジオポ &#8211; 位置情報を短縮して使いやすく</a></p>
<p><strong>GeoPo</strong>（ジオポ）というのは、私が作成したWebサービスで。</p>
<blockquote>
<p>ジオポは位置情報を表す緯度・経度を短縮したURLに変換し、受け取る側のブラウザに合わせた地図を表示するウェブサービスで、会員登録なしに誰でも無料で利用できます。</p>
</blockquote>
<p>という、Twitterに位置情報を付加したいときに使うといいよ！的なサービス。詳しくは、<a href="http://geopo.at/intl/ja/help/feature.html">ジオポの特徴</a> や <a href="http://geopo.at/intl/ja/developer/">開発者向け情報</a> を見てね。よかったら、実装してください。</p>
<p>ソース上では、</p>
<pre class="csharpcode"><span class="rem">/*</span>
<span class="rem"> * GeoPo Encode in JavaScript</span>
<span class="rem"> * @author : Shintaro Inagaki</span>
<span class="rem"> * @param location (Object)</span>
<span class="rem"> * @return geopo (String)</span>
<span class="rem"> */</span>
<span class="kwrd">function</span> geopoEncode(location){
    <span class="rem">// 64characters (number + big and small letter + hyphen + underscore)</span>
    <span class="kwrd">var</span> chars = <span class="str">&quot;0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_&quot;</span>;

    <span class="kwrd">var</span> geopo = <span class="kwrd">new</span> String();
    <span class="kwrd">var</span> lat = parseFloat(location.lat); <span class="rem">// Parse as float</span>
    <span class="kwrd">var</span> lng = parseFloat(location.lng); <span class="rem">// Parse as float</span>
    <span class="kwrd">var</span> scale = parseInt(location.scale); <span class="rem">// Parse as int</span>

    <span class="rem">// Change a degree measure to a decimal number</span>
    lat = (lat + 90) / 180 * Math.pow(8, 10);
    lng = (lng + 180) / 360 * Math.pow(8, 10);

    <span class="rem">// Compute a GeoPo code from head and concatenate</span>
    <span class="kwrd">for</span>(<span class="kwrd">var</span> i = 0; i &lt; scale; i++) {
        geopo = geopo + chars.substr(Math.floor(lat / Math.pow(8, 9 - i) % 8) + Math.floor(lng / Math.pow(8, 9 - i) % 8) * 8, 1);
    }
    <span class="kwrd">return</span> geopo;
}
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</pre>
<p>という GeoPoエンコード ライブラリ部分と、</p>
<pre class="csharpcode">    <span class="rem">// geopo</span>
    <span class="kwrd">var</span> location = <span class="kwrd">new</span> Object();
    location.lat = lat;
    location.lng = lng;
    location.scale = 7;
    <span class="kwrd">var</span> geopo = geopoEncode(location);</pre>
<p>呼び出し部分。</p>
<p>lat：緯度、lng：経度、scale：縮尺を渡して、geopoというジオポコードの文字列が返ってくる。</p>
<h5>位置情報の取得制御<br />
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
</h5>
<p>W3CのGeolocation APIを使って、現在位置情報を取得する。</p>
<pre class="csharpcode"><span class="kwrd">function</span> startUpdate() {
    watchId = navigator.geolocation.watchPosition(update);
}

<span class="kwrd">function</span> stopUpdate() {
    navigator.geolocation.clearWatch(watchId);
}

startUpdate();</pre>
<p>ここでは、watchPosition() を使う。というのも、iPhoneでは getCurrentPosition() がうまく動かなかった。また、最初の1回だけの位置情報取得では位置情報の精度がかなり荒いので、連続して取得し精度が高くなった段階で、その位置情報を採用するという形にしたかったというのもある。</p>
<p>ここで、startUpdate() と stopUpdate() とわざわざ関数にしているのは、後々に取得動作の制御したいためです。</p>
<h5>位置情報の加工と地図の表示</h5>
<p>位置情報が取得できたときに呼ばれる update() では、位置情報を加工して、地図を表示するようにします。</p>
<pre class="csharpcode"><span class="kwrd">var</span> lat;
<span class="kwrd">var</span> lng;
<span class="kwrd">var</span> latLng;
<span class="kwrd">var</span> geocoder = <span class="kwrd">new</span> google.maps.Geocoder();
<span class="kwrd">var</span> map;
<span class="kwrd">var</span> infowindow = <span class="kwrd">new</span> google.maps.InfoWindow();
<span class="kwrd">var</span> marker;
<span class="kwrd">var</span> watchId;

<span class="kwrd">function</span> update(position) {
    lat = position.coords.latitude;
    lng = position.coords.longitude;
    latLng = <span class="kwrd">new</span> google.maps.LatLng(lat,lng);

    <span class="kwrd">if</span>(!map){
        <span class="kwrd">var</span> options = {
            zoom: 15,
            center: latLng,
            mapTypeId: google.maps.MapTypeId.ROADMAP,
            scaleControl: <span class="kwrd">true</span>,
        }
        map = <span class="kwrd">new</span> google.maps.Map(document.getElementById(<span class="str">&quot;map_canvas&quot;</span>), options);
    } <span class="kwrd">else</span>{
        map.set_center(latLng);
    }

    <span class="kwrd">if</span>(!marker){
        marker = <span class="kwrd">new</span> google.maps.Marker({
            position: latLng,
            map: map,
            title: <span class="str">&quot;現在地&quot;</span>,
        });
        google.maps.<span class="kwrd">event</span>.addListener(marker, <span class="str">'click'</span>, <span class="kwrd">function</span>() {
            stopUpdate()
            geocoding();
        });
        google.maps.<span class="kwrd">event</span>.addListener(infowindow, <span class="str">'closeclick'</span>, <span class="kwrd">function</span>() {
            startUpdate()
        });
    } <span class="kwrd">else</span>{
        marker.set_position(latLng);
    }
}</pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>position.coords.latitude には緯度、 position.coords.longitude には経度</p>
<blockquote>
<pre>  interface <dfn>Coordinates</dfn> {
    readonly attribute double <a href="http://www.w3.org/TR/geolocation-API/#lat">latitude</a>;
    readonly attribute double <a href="http://www.w3.org/TR/geolocation-API/#lon">longitude</a>;
    readonly attribute double <a href="http://www.w3.org/TR/geolocation-API/#altitude">altitude</a>;
    readonly attribute double <a href="http://www.w3.org/TR/geolocation-API/#accuracy">accuracy</a>;
    readonly attribute double <a href="http://www.w3.org/TR/geolocation-API/#altitude-accuracy">altitudeAccuracy</a>;
    readonly attribute double <a href="http://www.w3.org/TR/geolocation-API/#heading">heading</a>;
    readonly attribute double <a href="http://www.w3.org/TR/geolocation-API/#speed">speed</a>;
  };</pre>
</blockquote>
<p>他にも、altitude：高度、accuracy：水平方向の精度、altitudeAccuracy：垂直方向の精度、heading：方向、speed：速度 といった属性があります。iPhone 3G S では、コンパスによって方向なども取得できるかもしれません。iPhone 3Gでは、方向には null値、速度には 0 が入るようです。</p>
<p>map や marker は、初回はインスタンスを生成し、2回目以降の呼び出しでは地図は中心地への移動、マーカーは位置情報取得値への書き換えを行います。</p>
<p>marker の初回で、イベントリスナーを作成。上のイベントは、マーカーをクリックしたら位置情報取得動作を止めて情報ウィンドウ（ geocoding() で現在位置の住所やTwitterへポストするアンカーを記載）の表示、下のイベントは、情報ウィンドウを閉じたら位置情報取得動作の再開。</p>
<p>ここで、位置情報の取得動作を操作してるのには次の理由があります。</p>
<ol>
<li>情報ウィンドウが表示されるときに、位置情報が更新されて地図表示が移動されたりすると使い勝手が悪い。 </li>
<li>位置情報の取得のたびに情報ウィンドウの中身を更新すると大変（逆ジオコーディングとか）。 </li>
</ol>
<h5>情報ウィンドウの更新（逆ジオコーディング）</h5>
<p>現在位置の住所取得（逆ジオコーディング）とジオポコードの作成、Twitterへポストするためのアンカーを情報ウィンドウの中に書き込むための処理を geocoding() でやります。</p>
<pre class="csharpcode"><span class="kwrd">function</span> geocoding() {
    <span class="rem">// geopo</span>
    <span class="kwrd">var</span> location = <span class="kwrd">new</span> Object();
    location.lat = lat;
    location.lng = lng;
    location.scale = 7;
    <span class="kwrd">var</span> geopo = geopoEncode(location);

    geocoder.geocode({<span class="str">'latLng'</span>: latLng}, <span class="kwrd">function</span>(results, status) {
        <span class="kwrd">if</span> (status == google.maps.GeocoderStatus.OK) {
            <span class="kwrd">var</span> geocodeAddress;
            <span class="kwrd">for</span>(i=1; i&lt;results.length; i++){
                <span class="kwrd">if</span> (results[i].types.length &gt;= 2 &amp;&amp; results[i].types[1] == <span class="str">&quot;political&quot;</span>) {
                    <span class="kwrd">if</span>(results[i].formatted_address.indexOf(<span class="str">&quot;日本&quot;</span>) != -1){
                        geocodeAddress = results[i].formatted_address.substring(2);
                    }<span class="kwrd">else</span>{
                        geocodeAddress = results[i].formatted_address;
                    }
                    <span class="kwrd">break</span>;
                }
            }
            <span class="kwrd">if</span>(geocodeAddress){
                infowindow.set_content(<span class="str">'&lt;strong&gt;現在地：&lt;/strong&gt;&lt;br /&gt;&lt;span style=&quot;font-size:80%&quot;&gt;'</span> + geocodeAddress + <span class="str">'&lt;/span&gt;&lt;hr /&gt;&lt;a href=&quot;http://twitter.com/home?status='</span> + encodeURIComponent(<span class="str">' L:'</span> + geocodeAddress + <span class="str">' http://geopo.at/'</span> + geopo) + <span class="str">'&quot; target=&quot;twitter&quot;&gt;&lt;img src=&quot;icon_twitter.gif&quot; width=&quot;14&quot; height=&quot;16&quot; border=&quot;0&quot; align=&quot;bottom&quot; hspace=&quot;5&quot; /&gt;TwitterにPOSTする&lt;/a&gt;'</span>);
                infowindow.open(map, marker);
            } <span class="kwrd">else</span> {
                alert(<span class="str">&quot;現在地が取得できませんでした＞＜&quot;</span>);
            }
        } <span class="kwrd">else</span> {
            alert(<span class="str">&quot;Geocoder failed due to: &quot;</span> + status);
        }
    });
}</pre>
<p>前回のAndroid版とほぼ同じです（多少変えたってこと）。</p>
<p>逆ジオコーディングした結果で、郵便番号や道路名ってのをフィルタリングし、formatted_address には「日本」という文字が入るのが気にくわないので、「日本」を取り除いてやる。という内容。</p>
<h4>実装して iPhone OS 3.0 で動作させてみる</h4>
<p>実際に動作させてみる。</p>
<p><a href="http://inagaki.co.uk/test/safari.html">GeoPo : Mobile Safari</a> ＠inagaki.co.uk に作ったものをおいたので、自由に試してみてください。ソースコードも自由に使ってください。</p>
<h5>iPhoneでの位置情報利用の確認</h5>
<p><a href="http://creco.net/wp-content/uploads/1.jpg" rel="lightbox[573]"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="1" border="0" alt="1" src="http://creco.net/wp-content/uploads/1_thumb.jpg" width="162" height="242" /></a> <a href="http://creco.net/wp-content/uploads/2.jpg" rel="lightbox[573]"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="2" border="0" alt="2" src="http://creco.net/wp-content/uploads/2_thumb.jpg" width="162" height="242" /></a> </p>
<p>初回のみSafariでの位置情報利用と、ドメイン単位での位置情報利用の確認があります。<br />
  <br />#これ、ドメイン単位の位置情報利用確認ってリセットする方法あるんですかね？</p>
<h5>地図と情報ウィンドウの表示</h5>
<p><a href="http://creco.net/wp-content/uploads/3.jpg" rel="lightbox[573]"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="3" border="0" alt="3" src="http://creco.net/wp-content/uploads/3_thumb.jpg" width="162" height="242" /></a> <a href="http://creco.net/wp-content/uploads/4.jpg" rel="lightbox[573]"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="4" border="0" alt="4" src="http://creco.net/wp-content/uploads/4_thumb.jpg" width="162" height="242" /></a> </p>
<p>ブックマークなどからURLを読み出せば、そのまま現在位置を取得して地図を表示するという一連の動作ができます。</p>
<p>そして、この地図はスマートフォンに最適化された Google Maps API V3 で作成していますので、まるでネイティブアプリのような感覚でシームレスなスクロールが可能。</p>
<p>マーカーをクリックすることで、情報ウィンドウを表示。このときに、位置情報取得動作をストップさせて、逆ジオコーディングを行い住所を取得。</p>
<p>住所表示の下にある、アンカーをクリックすることで別ウィンドウが立ち上がりTwitterへ現在地情報のついたポストが行えます。</p>
<p>情報ウィンドウの右上の×印をクリックすれば、情報ウィンドウは非表示になり、位置情報取得取得動作を再開させます。現在地が移動した場合はリロードしなくても、情報ウィンドウの開閉だけで位置情報取得のコントロールができます。</p>
<h5>Twitterへ現在地情報の投稿</h5>
<p><a href="http://creco.net/wp-content/uploads/5.jpg" rel="lightbox[573]"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="5" border="0" alt="5" src="http://creco.net/wp-content/uploads/5_thumb.jpg" width="162" height="242" /></a> <a href="http://creco.net/wp-content/uploads/6.jpg" rel="lightbox[573]"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="6" border="0" alt="6" src="http://creco.net/wp-content/uploads/6_thumb.jpg" width="162" height="242" /></a> </p>
<p>アンカーをクリックするとTwitterの投稿のために新しいウィンドウが立ち上がります。このときに、Twitterへログインされてない場合は、ログイン画面となるので、ログインを行ってください。</p>
<p>また、iPhoneからTwitterを使用する場合、デフォルトではモバイル版の画面表示となっています。しかし、モバイル版の画面表示ですと、アンカーをクリックした際に伝える住所やジオポURLが反映されないので、ページ下部にある「スタンダード版で見る」をクリックし、スタンダード版でTwitterを表示させてください。<br />
  <br />#これ、回避方法を知ってる方いましたら教えてください</p>
<p>スタンダード版では、いまなにしてる？のテキストエリアの中に、住所とジオポURLが反映されている状態となります。そこから、メッセージを加えたり、<a href="http://geopo.at/intl/ja/help/feature.html">ジオポURLの縮尺精度変更操作</a>を行うことができます。</p>
<h3>感想、まとまらないまとめ</h3>
<p>連続した位置情報が取得できるのは熱いですね！！でも、iPhoneも熱くなります ＞＜<br />
  <br />位置情報を連続取得させるのは非常にバッテリーを消費します、ほどほどにしましょう。</p>
<p>今までGPSロガーなどがないとGPSトラッキングできなかったのですが、それがJavaScriptだけで実現できるのは魅力的です。私もiPhone単体でできるGPSトラッキングサービスを早速作りたいと思っていますよ。</p>
<p>また、すでにあるGPSトラッキングサービスでも簡単（上のソースを数行いじるだけ）に実現できるので、<a href="http://imakoko-gps.appspot.com/">今ココなう！(β)</a> などの人気のあるサービスが対応すれば一気に対応端末が増えるようになるんじゃないでしょうか？位置情報を使うことの面白さがいろんな人に伝わってくれるとうれしいですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://creco.net/2009/06/17/iphone-os-3_with_w3c_geolocation_api/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://creco.net/2009/06/17/iphone-os-3_with_w3c_geolocation_api/" />
	</item>
		<item>
		<title>自転車通勤GPSライブトラッキングをやってみた</title>
		<link>http://creco.net/2009/05/01/cycle_to_work_with_live_tracking/</link>
		<comments>http://creco.net/2009/05/01/cycle_to_work_with_live_tracking/#comments</comments>
		<pubDate>Thu, 30 Apr 2009 17:51:14 +0000</pubDate>
		<dc:creator>inagaki</dc:creator>
				<category><![CDATA[野外活動]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[自転車]]></category>

		<guid isPermaLink="false">http://creco.net/2009/05/01/cycle_to_work_with_live_tracking/</guid>
		<description><![CDATA[
電車の通勤定期がようやく切れたので、自転車通勤生活はじまる。
前の会社では、刈谷から名古屋の栄まで自転車通勤していたんだけど、今のオフィスは尾頭橋にあるので単純に距離が短くなった。だけど、ブランクが1年以上あるし、体力 [...]]]></description>
			<content:encoded><![CDATA[<p><object id="otv_o_845968" height="320" width="400"  classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"><param value="http://www.ustream.tv/flash/video/1437400" name="movie" /><param value="true" name="allowFullScreen" /><param value="always" name="allowScriptAccess" /><param value="transparent" name="wmode" /><param value="viewcount=true&amp;autoplay=false&amp;brand=embed&amp;" name="flashvars" /><embed name="otv_e_879660" id="otv_e_301323" flashvars="viewcount=true&amp;autoplay=false&amp;brand=embed&amp;" height="320" width="400" allowfullscreen="true" allowscriptaccess="always" wmode="transparent" src="http://www.ustream.tv/flash/video/1437400" type="application/x-shockwave-flash" /></object></p>
<p>電車の通勤定期がようやく切れたので、自転車通勤生活はじまる。</p>
<p>前の会社では、刈谷から名古屋の栄まで自転車通勤していたんだけど、今のオフィスは尾頭橋にあるので単純に距離が短くなった。だけど、ブランクが1年以上あるし、体力と筋力も衰えまくってるので、今となってはハードな運動です。</p>
<p>そして、なんというかライブ配信もやりたくなるわけで、今年になってからの初ものを同時にやってみた。</p>
<p> <span id="more-526"></span><br />
<h4>ライブトラッキングシステム変更点</h4>
<h5>2ch式掲示板 → Twitter TL</h5>
<p>以前つくった   <br /><a href="http://creco.net/2009/04/13/softalk_tweet_timeline_of_twitter/">TwitterをSoftalkのゆっくりボイスでしゃべらせる | クレコ</a>    <br />を利用して、Twitterのタイムラインを読む。</p>
<h5>PeerCast → Ustream</h5>
<p>前は、PeerCastでファイアウォールの設定・P2P枝の管理・KP（チャンネル）への登録・WMEでのエンコード設定とかが必要なくなって、</p>
<p>Ustreamにログインして、BroadCastボタンをクリックするだけ。こんだけ。</p>
<h5>Bluetoothヘッドセットの変更</h5>
<p>TOSHIBAプロファイルがEeePC内蔵のBluetoothレシーバーで使えなかったため、Bluetoothレシーバーを追加していたというかっこ悪い構成を打開するために、Sony（TOSHIBAプロファイルではない）のBluetoothヘッドセットを使う。</p>
<h4>やってみた</h4>
<p>上のはUstreamの録画映像。</p>
<p>大府駅あたりからオフィスのある尾頭橋まで。GPSでの現在位置は前のと同じ   <br /><a href="http://inagaki.co.uk/misc/gps/">GPS Live Tracking</a>    <br />を使う。</p>
<p>Ustreamを配信はじめて、TwitterにチャンネルとGPS Live Trackingのアドレスをコピペ。そしてスタート。</p>
<p>動画を再生してもらえれば分かるけど、風切り音がひどいのでボリュームは抑えめにしたほうがいいかも。   <br />Bluetoothヘッドセットも耳にしっくりはまらなく、Softalkのしゃべる音声がほとんど聞き取れず。</p>
<p>最後のほうに2人の方からReplyが来たのみで双方向コミュニケーション的なことはまったくできない。まぁ、通勤途中なんで指示受けても困るだけだけどｗ</p>
<p>ぐだぐだのまま、オフィスに到着。終了です。</p>
<h4>いろいろ反省</h4>
<ul>
<li>Bluetoothヘッドセットの風切り音対策をしないとダメ</li>
<li>それと、Bluetoothの出力が弱いのか、通信で聞こえてくる音声が不安定＆最初の数秒聞こえない</li>
<li>Twitterのタイムラインを読むならリプライだけにしたほうがよい</li>
<li>予想以上に反応ないｗｗｗでもめげない。PeerCastとかだとチャンネル通知システムとかちゃんとしてるので、少なくとも30人以上視聴してくれて、それなりにレスももらえるんだけどね</li>
<li>Ustreamは 画質＞フレーム数。5fpsくらいでてくれないけど、妥協できる画質だと思う。エンコードを考えなくていいってのはとても楽</li>
</ul>
<h4>深夜にやってみた</h4>
<p>深夜2時くらいから自転車通勤したらどうなるんだろって思って、真夜中に準備してやってみたｗ</p>
<p>夜中の国道1号線とかはトラックがびゅんびゅん走ってるイメージがあったけど、意外にガラガラで危険なこともない。</p>
<p>自転車にとって天敵であるバスやタクシーと競争するようなこともなく、自分のペースで走ることができた。</p>
<p>深夜自転車通勤<strong>オススメ</strong></p>
<p>&#160;</p>
<p>GPSライブトラッキングやってくれる人が周りに増えると嬉しいので、興味を持った方は是非やりましょう</p>
]]></content:encoded>
			<wfw:commentRss>http://creco.net/2009/05/01/cycle_to_work_with_live_tracking/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://creco.net/2009/05/01/cycle_to_work_with_live_tracking/" />
	</item>
		<item>
		<title>TwitterをSoftalkのゆっくりボイスでしゃべらせる</title>
		<link>http://creco.net/2009/04/13/softalk_tweet_timeline_of_twitter/</link>
		<comments>http://creco.net/2009/04/13/softalk_tweet_timeline_of_twitter/#comments</comments>
		<pubDate>Sun, 12 Apr 2009 23:09:02 +0000</pubDate>
		<dc:creator>inagaki</dc:creator>
				<category><![CDATA[作ってみた]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Softalk]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://creco.net/2009/04/13/softalk_tweet_timeline_of_twitter/</guid>
		<description><![CDATA[




（完成動画。時々でてる音は録画用に使ったMacの音です、紛らわしくてごめん。）
2chのスレやしたらば、カキコなどの掲示板をSoftalkで読ませるフロントエンドはあるんだけど、Twitterのタイムラインを読 [...]]]></description>
			<content:encoded><![CDATA[<div id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:4dbd3db4-dda8-47ba-af4a-e900c0262666" class="wlWriterEditableSmartContent" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<div id="8ef7f156-15c7-477a-bdeb-090127dbb58f" style="margin: 0px; padding: 0px; display: inline;">
<div><a href="http://www.youtube.com/watch?v=XA-KpNdgjCY&amp;hl=ja&amp;fs=1&amp;rel=0" target="_new"><img style="border-style: none" src="http://creco.net/wp-content/uploads/video814103ce00161.jpg" alt="" /></a></div>
</div>
</div>
<p>（完成動画。時々でてる音は録画用に使ったMacの音です、紛らわしくてごめん。）</p>
<p>2chのスレやしたらば、カキコなどの掲示板を<a href="http://cncc.hp.infoseek.co.jp/">Softalk</a>で読ませるフロントエンドはあるんだけど、Twitterのタイムラインを読ませるっていうのは見つからなかったので作ってみた。</p>
<p>TwitterのAPIを読むだけなので、スクラッチで書いてもそんなに難しいものではないんだけど、勉強がてらPythonのpython-twitterというライブラリを使ってみる。</p>
<h5>追記：新しくエントリーを書きました</h5>
<p><a href="../2009/07/17/softalk_twitter_to_bring_out_slowly_in_a_voice_of/">TwitterをSoftalkのゆっくりボイスでしゃべらせる  2 | クレコ</a></p>
<p><span id="more-350"></span></p>
<h4>python-twitterの導入</h4>
<p>実はこれがくそめんどいｗ</p>
<p><a href="http://d.hatena.ne.jp/ama-ch/20080514/1210757894">python-twitterまとめ ～導入まで &#8211; テックノート＠ama-ch</a><br />
を参考にして導入する。</p>
<p>simplejsonは、WindowsでCのコンパイラ環境が必要になったりする。詳しくないので、書いてある通りに実行していった。</p>
<h5>Python 2.6ではhashlibなんちゃらの警告がでます</h5>
<p>別にそのままつかっても問題ないけど毎回警告がでるので直し方。</p>
<p>@aoshimanさんに教えていただいた解決法、<br />
<a href="http://d.hatena.ne.jp/nakku/20090218#1234963425">2009-02-18 &#8211; nakkuの日記</a> [python]python2.6にtwitterのモジュールを入れる<br />
にpatchがあるので、twitter.pyを書き換えればいい。</p>
<p>具体的には、simplejsonモジュールを使っているところをjsonモジュール、md5モジュールを使っているところをhashlibモジュールを使うようにそれぞれ書き換える。</p>
<h4>TwitterのTLをSoftalkでしゃべらせるPythonスクリプト</h4>
<pre class="csharpcode">import twitter, os, nkf, re, time

# config
userName = <span class="str">"username"</span>
passWord = <span class="str">"password"</span>
softalkPath = <span class="str">"C:\hogehoge\softalk.exe"</span>
softalkSpeed = <span class="str">"120"</span>
lastSinceTime = 0
lastGetTime = 0

# convert <span class="kwrd">string</span>
def convertString(<span class="kwrd">string</span>):
    # remove HTML entity
    <span class="kwrd">string</span> = re.sub(<span class="str">'&amp;.+;'</span>, <span class="str">' '</span>, <span class="kwrd">string</span>)
    # remove quote
    <span class="kwrd">string</span> = re.sub(<span class="str">'"'</span>, <span class="str">' '</span>, <span class="kwrd">string</span>)
    <span class="kwrd">string</span> = re.sub(<span class="str">"'"</span>, <span class="str">' '</span>, <span class="kwrd">string</span>)

    # remove my username
    <span class="kwrd">string</span> = re.sub(<span class="str">'^@'</span> + userName + <span class="str">' '</span>, <span class="str">''</span>, <span class="kwrd">string</span>)

    # convert unicode to sjis <span class="kwrd">using</span> nkf module
    <span class="kwrd">string</span> = nkf.nkf(<span class="str">"-sX"</span>, <span class="kwrd">string</span>.encode(<span class="str">"utf8"</span>))

    <span class="kwrd">return</span> <span class="kwrd">string</span>

# get twitter timeline
def getTimeline():
    global lastSinceTime

    api = twitter.Api(userName, passWord)
    statuses = api.GetFriendsTimeline(userName)
    #statuses = api.GetUserTimeline(userName)
    #statuses = api.GetReplies()

    <span class="kwrd">for</span> i <span class="kwrd">in</span> statuses[::-1]:
        <span class="kwrd">if</span> i.created_at_in_seconds &gt; lastSinceTime:
            print <span class="str">"%s : %s"</span> % (convertString(i.user.name), convertString(i.text))
            os.system(<span class="str">'"'</span> + softalkPath + <span class="str">'" /V:60 /S:'</span>+softalkSpeed+<span class="str">' /T:1 /W:'</span> + convertString(i.user.name))

            # when find my name and change voice
            <span class="kwrd">if</span> re.search(userName, i.text):
                os.system(<span class="str">'"'</span> + softalkPath + <span class="str">'" /V:60 /S:'</span>+softalkSpeed+<span class="str">' /T:0 /W:'</span> + convertString(i.text))
            <span class="kwrd">else</span>:
                os.system(<span class="str">'"'</span> + softalkPath + <span class="str">'" /V:60 /S:'</span>+softalkSpeed+<span class="str">' /T:3 /W:'</span> + convertString(i.text))
            lastSinceTime = i.created_at_in_seconds

<span class="kwrd">while</span> True:
    # time span of get timeline
    <span class="kwrd">if</span> time.time() &gt; lastGetTime + 60:
        lastGetTime = time.time()
        getTimeline()
    <span class="kwrd">else</span>:
        time.sleep(5)</pre>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt  { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<h5>twitterモジュール</h5>
<blockquote><p>api = twitter.Api(userName, passWord)</p>
<p>statuses = api.GetFriendsTimeline(userName)</p></blockquote>
<p>で、認証してタイムライン（ここではFriendTimeline）を取ってくる。</p>
<p>んで、そのリストは時系列昇順にしゃべらせるために、スライスを使って逆順にし、forで回してやる。</p>
<h5>osモジュール</h5>
<blockquote><p>os.system(<span class="str">&#8216;&#8221;&#8216;</span> + softalkPath + <span class="str">&#8216;&#8221; /V:60 /S:&#8217;</span>+softalkSpeed+<span class="str">&#8216; /T:1 /W:&#8217;</span> + convertString(i.user.name))</p></blockquote>
<p>外部コマンドでSoftalkを実行する。softalkPathにsoftalk.exeの位置を設定して、あとはパラメータ。つぶやきの中に自分のユーザー名があったら音声を変えたり。</p>
<p>/V:ボリューム、/S:スピード、/T:音声パターン、/W:しゃべらせたいテキスト</p>
<p>Softalkのソフトについては後述。</p>
<h5>nkfモジュール</h5>
<p><a href="http://city.plala.jp/moin/NkfPython">NkfPython – Ma2</a></p>
<p>Softalkにコマンド引数として値を渡すときに、UnicodeからS-JISへ変換してやる必要があるんだけど、この変換でencode()を使うとウムラウトとかが原因でエラー。</p>
<p>nkfを使えばいいらしいので、nkf使って変換。</p>
<blockquote><p><span class="kwrd">string</span> = nkf.nkf(<span class="str">&#8220;-sX&#8221;</span>, <span class="kwrd">string</span>.encode(<span class="str">&#8220;utf8&#8243;</span>))</p></blockquote>
<h5>reモジュール</h5>
<blockquote><p>string = re.sub(&#8216;&amp;.+;&#8217;, &#8216; &#8216;, string)</p></blockquote>
<p>HTMLエンティティをそのまま渡すと、コマンド引数が途切れたりしたので、HTMLエンティティはばっさり消しちゃうことにした。re.sub()は正規表現で置き換え。</p>
<p>同様に、先頭に自分のユーザー名が来てるようなreplyメッセージでのユーザー名とか、クォート符号も消す。</p>
<p>他にも何かエラー引き起こす文字があったら、深く考えないで消す。とても適当でごめんなさい。</p>
<h5>timeモジュール</h5>
<p>実行したら無限ループに入れてやり、前回の取得時間より1分以上経っていたら取得しに行く、それ以外なら5秒スリープしてループの先頭に戻る。</p>
<h4>利用するSoftalkのバージョン</h4>
<p>実行してみると、Softalkが実行するときにいちいちWindowがピョコンとでてきて、終了をしてあげないと次のつぶやきをしゃべってくれない。</p>
<p>なんか以前と違うなぁって不思議に思っていたんだけど、</p>
<p>ニコニコ動画のニコ生（生で配信）用のツール</p>
<p><a href="http://d.hatena.ne.jp/ExceptionError/20090318/1237359366">NicoRequest Ver.2.3.2 – ExceptionErrorMessage</a></p>
<p>NicoRequestのドキュメントを読んでみると、どうやらSoftalkの最新バージョンで挙動が変わったらしい。</p>
<p>ver0151に置き換えて実行してみたところ、ちゃんとうまくいって、一番はじめの動画のようにゆっくりボイスでしゃべってくれた。</p>
<h4>感想</h4>
<ul>
<li>声でタイムラインを読んでくれるっていうのは新鮮でおもしろいよ</li>
<li>Softalkは英語が不得意なので、無理にローマ字読みして何いってるかわからないことしばしば</li>
<li>移動体ライブ配信の読み上げに使おうとおもったけど、よく考えると60秒更新スパンくらいが負荷で限界なので、ものすっごくタイムラグ発生するかもね</li>
<li>PythonよりもNicoRequestみたいにJavaScriptで実現したほうがいいかも</li>
<li>SoftalkとそのライブラリAques TalkはWindows版でしか無償でつかえないので、環境を選ぶ</li>
</ul>
<p>つぶやきを送ると、ゆっくりボイスで変換してくれるBOTとか作ったら面白そう。</p>
]]></content:encoded>
			<wfw:commentRss>http://creco.net/2009/04/13/softalk_tweet_timeline_of_twitter/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://creco.net/2009/04/13/softalk_tweet_timeline_of_twitter/" />
	</item>
		<item>
		<title>山手線ウォーキング 田端から池袋</title>
		<link>http://creco.net/2009/04/06/yamanote-line_walking_final/</link>
		<comments>http://creco.net/2009/04/06/yamanote-line_walking_final/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 06:32:54 +0000</pubDate>
		<dc:creator>inagaki</dc:creator>
				<category><![CDATA[野外活動]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[ウォーキング]]></category>
		<category><![CDATA[ジオポ]]></category>

		<guid isPermaLink="false">http://creco.net/2009/04/06/yamanote-line_walking_final/</guid>
		<description><![CDATA[&#160;
暇を見つけては行っている山手線ウォーキング。これまで、

新宿～恵比寿      5年くらい前に恵比寿の写真美術館でやってたファミコン展覧会に行くため 
新宿～池袋      東京に出稼ぎしてやってたT○S [...]]]></description>
			<content:encoded><![CDATA[<p><img title="20090406_yamanotesen-walkin" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="274" alt="20090406_yamanotesen-walkin" src="http://creco.net/wp-content/uploads/20090406-yamanotesenwalkin.jpg" width="424" border="0" />&#160;</p>
<p>暇を見つけては行っている山手線ウォーキング。これまで、</p>
<ul>
<li>新宿～恵比寿      <br />5年くらい前に恵比寿の<a href="http://game.watch.impress.co.jp/docs/20031009/syabi.htm">写真美術館でやってたファミコン展覧会</a>に行くため </li>
<li>新宿～池袋      <br />東京に出稼ぎしてやってたT○Sの仕事が終わり、会津若松に徒歩で帰るも、栃木県宇都宮で断念 </li>
<li>恵比寿～目黒      <br />前の会社の東京オフィスからデブサミにいくため </li>
<li>田端～東京      <br />半年前くらい、待ち合わせの時間まで暇だったから。TwitterとGPSトラッキング </li>
<li>東京～目黒      <br /><a href="http://creco.net/2009/02/18/yamanote-line_walking_with_twinkle/">今年の2月12日、デブサミにいくため</a>。Twinkle(Twitter)でコミュニケーションしながら </li>
</ul>
<p>と、ほとんどの山手線ウォーキングは制覇しており、残す区間は田端から池袋を残すのみとなった。</p>
<p>たまたま池袋に用事ができ、それならばと田端から池袋まで歩くことにしたので、今回で長きに渡ってちまちまと歩いてきた山手線ウォーキングは終了ということになる。</p>
<p> <span id="more-302"></span><br />
<h4>準備</h4>
<p>久しぶりの移動体GPSトラッキング配信をやりたかったのだが、QcamのWebカメラが壊れており（USBでの接続エラー）、残念ながら映像を配信することはできなかった。</p>
<p>GPSロガーも久しぶりに使うので、コールドスタートでのGPS衛星捕捉時間の長さに戸惑いながらもなんとか扱えた。</p>
<p>それに加えて、先日作成した、iPhone用ジオポ対応Twitterクライアント「<a href="http://creco.net/2009/03/29/twiter_client_with_geopo_for_iphone/">GeoPo Twitter（俺専用）</a>」でのつぶやきをGPSトラッキングを試すことにする。</p>
<h5>とりあえず池袋に</h5>
<p>東京に昼過ぎにつき、渋谷でいつもの美容院でカットしてもらい、池袋に向かう。</p>
<p>渋谷から池袋までは初めて乗る副都心線。すっごい空いてるよｗ</p>
<p>池袋到着。先日オープンしたばかりのエチカをスルーして、MacBookやらが入った重たいビジネスバッグをコインロッカーに収納して、準備おｋ。田端に向かう。</p>
<p><img title="20090406_yamanotesen_2" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="274" alt="20090406_yamanotesen_2" src="http://creco.net/wp-content/uploads/20090406-yamanotesen-2.jpg" width="424" border="0" /> </p>
<p>田端駅南口から北口？へ歩いた途中、桜並木がきれいだった。</p>
<h4>山手線ウォーキング 田端から池袋 スタート</h4>
<p><a href="http://creco.net/wp-content/uploads/20090403_yamanotesen-walking.kml">アップされたGPSログ</a>と<a href="http://maps.google.com/maps?q=http://creco.net/wp-content/uploads/20090403_yamanotesen-walking.kml">Googleマップでのルート表示</a>。</p>
<h5>15:27 田端駅前マックにて</h5>
<blockquote><p>Twitterがタイムアウトになる＞＜ 今田端。これから池袋まで山手線ウォーキングしてきます。      <br /><a href="http://twitter.com/shinagaki/status/1443801005">3:27 PM Apr 3rd</a> from web</p>
</blockquote>
<p>田端駅前マックに入って準備。だけどTwitterの調子が悪くて、しばらく様子見してた。    <br />なんとか、復活したみたいでスタート。</p>
<blockquote><p>GPS Live Tracking <a href="http://inagaki.co.uk/misc/gps/">http://inagaki.co.uk/misc/gps/</a> and GeoPo Track <a href="http://geopo.at/track/shina...">http://geopo.at/track/shina&#8230;</a>       <br /><a href="http://twitter.com/shinagaki/status/1443832357">3:37 PM Apr 3rd</a> from web</p>
</blockquote>
<p>GPSトラッキングのURLとジオポトラックの場所をアナウンス。今回、なんの告知もしてないし果たして見てる人はいるんだろか？</p>
<h5>15:42 田端駅をようやくスタート</h5>
<blockquote><p>田端スタート <a href="http://geopo.at/Z4RRa0">http://geopo.at/Z4RRa0</a>       <br /><a href="http://twitter.com/shinagaki/status/1443848069">3:42 PM Apr 3rd</a> from web</p>
</blockquote>
<p>最短距離で駒込まで行こうとすると路地を抜けていく形になり、道に迷う心配があるから、山手線の線路に沿っていくことにした。</p>
<h5>15:52 駒込駅到着</h5>
<p><img title="DSCN0150" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="319" alt="DSCN0150" src="http://creco.net/wp-content/uploads/dscn0150.jpg" width="424" border="0" /> </p>
<blockquote><p>駒込到着ですよと やっぱ歩いてると暑いな <a href="http://geopo.at/Z4RR2V">http://geopo.at/Z4RR2V</a>       <br /><a href="http://twitter.com/shinagaki/status/1443878939">3:52 PM Apr 3rd</a> from web</p>
</blockquote>
<p>この日は、暑かったね－。</p>
<blockquote><p>メモリ解放してないからあかんのかな？ <a href="http://geopo.at/Z4RR1e">http://geopo.at/Z4RR1e</a>       <br /><a href="http://twitter.com/shinagaki/status/1443885467">3:54 PM Apr 3rd</a> from web</p>
</blockquote>
<p>上のジオポが変な位置を示してるから、こんな発言。</p>
<p>後でGClueの佐々木さんに訊いてわかったんだけど、どうやらiPhoneのGPSは位置情報が取れない場合に前回の位置情報を返す時があるみたい。そのため、別の変数を用意してゴニョゴニョとかしないとダメらしい。</p>
<p>このときは、そんなことをしらなかったので、単純にメモリをリリースするとかちゃんとしたメモリ管理してないからこんなことになるんかなって思い込んでいた。</p>
<p>そして、他のアプリを立ち上げるとかで無理矢理メモリを待避させることを考えたりしてなんとかやりすごしてたｗ</p>
<blockquote><p>街の美観と健康のため歩こう！ 現在山手線ウォーク中 <a href="http://tinyurl.com/dkkq7b">http://tinyurl.com/dkkq7b</a>       <br /><a href="http://twitter.com/shinagaki/status/1443929669">4:09 PM Apr 3rd</a> from <a href="http://twitter.com/twinkleking">Twinkle</a></p>
</blockquote>
<p>前みたいに、「がんばって！」とか声援がなかったので、寂しくなってTwinkleにポスト。東京のTwinkleも昼間は殺伐としてんな。</p>
<h5>16:10 巣鴨駅到着</h5>
<blockquote><p>巣鴨 少し急がないと遅刻するwww <a href="http://geopo.at/Z4RJUn">http://geopo.at/Z4RJUn</a>       <br /><a href="http://twitter.com/shinagaki/status/1443934039">4:10 PM Apr 3rd</a> from web</p>
</blockquote>
<p>今回は17:00には立教大学行ってジオメディアサミットの準備する予定だったので、悠長に散歩気分でもいられなかった。だいたい１時間半くらいのコースかなぁって見積もってたので、少し早歩きで。</p>
<p><a href="http://creco.net/wp-content/uploads/dscn0151.jpg" rel="lightbox[302]"><img title="DSCN0151" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="335" alt="DSCN0151" src="http://creco.net/wp-content/uploads/dscn0151-thumb.jpg" width="439" border="0" /></a> </p>
<p>巣鴨と大塚の間、山手線沿線の桜並木。桜祭りみたいなのも行われてたと思う。    <br />こういう風景は好き。</p>
<h5>16:22 大塚駅到着</h5>
<p><img title="DSCN0152" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="319" alt="DSCN0152" src="http://creco.net/wp-content/uploads/dscn0152.jpg" width="424" border="0" /> </p>
<blockquote><p>大塚通過 あと池袋だっけ <a href="http://geopo.at/Z4RJUe">http://geopo.at/Z4RJUe</a>       <br /><a href="http://twitter.com/shinagaki/status/1443970286">4:22 PM Apr 3rd</a> from web</p>
</blockquote>
<p>急げ！急げ！</p>
<blockquote><p>またミス <a href="http://geopo.at/Z4RJMs">http://geopo.at/Z4RJMs</a>       <br /><a href="http://twitter.com/shinagaki/status/1443972943">4:23 PM Apr 3rd</a> from web</p>
</blockquote>
<blockquote><p>荒川線向原 <a href="http://geopo.at/Z4RJEX">http://geopo.at/Z4RJEX</a>       <br /><a href="http://twitter.com/shinagaki/status/1443996685">4:31 PM Apr 3rd</a> from web</p>
</blockquote>
<p>都電荒川線の駅。ここから完全に都市部に入っていくため、歩いてても面白みは少ないね。</p>
<blockquote><p>ポロロッカ <a href="http://geopo.at/Z4RJEC">http://geopo.at/Z4RJEC</a>       <br /><a href="http://twitter.com/shinagaki/status/1444012965">4:37 PM Apr 3rd</a> from web</p>
</blockquote>
<p>さよなら絶望先生できいたようなワード。ただの食品スーパーなのかな？</p>
<h5>16:45 池袋駅にゴール</h5>
<blockquote><p>池袋到着です。お疲れさまでした さて立教大学目指そう <a href="http://geopo.at/Z4RJwW">http://geopo.at/Z4RJwW</a>       <br /><a href="http://twitter.com/shinagaki/status/1444035392">4:45 PM Apr 3rd</a> from web</p>
</blockquote>
<p>サンシャインシティとか馴染みのある風景が見えてきて、ようやく池袋に到着。スタートから１時間強くらい。</p>
<p>ホッとしてる余裕もないので、コインロッカーの荷物を回収して、立教大学へ。</p>
<blockquote><p>立教大学入学式やってるwwww <a href="http://geopo.at/Z4RJwc">http://geopo.at/Z4RJwc</a>       <br /><a href="http://twitter.com/shinagaki/status/1444075100">4:59 PM Apr 3rd</a> from web</p>
</blockquote>
<h5>17:04 立教大学８号館のジオメディアサミット会場に到着</h5>
<blockquote><p>ついた！！！！！疲れた！！！自分乙 *Tw*      <br /><a href="http://twitter.com/shinagaki/status/1444089758">5:04 PM Apr 3rd</a> from <a href="http://cheebow.info/chemt/archives/2007/04/twitterwindowst.html">Twit</a></p>
</blockquote>
<p><img title="DSCN0153" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="319" alt="DSCN0153" src="http://creco.net/wp-content/uploads/dscn0153.jpg" width="424" border="0" /> </p>
<p>ふー。</p>
<p>続きは <a href="http://creco.net/2009/04/06/geomedia_summit_3/">第３回ジオメディアサミットに参加してきた</a> で。</p>
<h4>山手線ウォーキングを完走した感想</h4>
<p>点が繋がることで、街の本来の姿が見えてくるし、実体感として長さ・広さ・高低を把握できるのは地図を見るだけじゃわかんないこと。</p>
<p>高低も少なく、僕みたいに少しずつでも気軽に暇な時間でウォーキングできるのでオススメ。    <br />谷中銀座と上野あたりが面白いかな。</p>
<h5>次からどこ歩こう？</h5>
<p>特に考えてないけど、ウォーターフロントあたりはどうなってんだろ？レインボーブリッジって歩いてわたれたよね。</p>
<p>オススメあったら教えてください。ではでは。</p>
]]></content:encoded>
			<wfw:commentRss>http://creco.net/2009/04/06/yamanote-line_walking_final/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://creco.net/2009/04/06/yamanote-line_walking_final/" />
	</item>
		<item>
		<title>GeoPo Twitterクライアントを自分用に作ってみた</title>
		<link>http://creco.net/2009/03/29/twiter_client_with_geopo_for_iphone/</link>
		<comments>http://creco.net/2009/03/29/twiter_client_with_geopo_for_iphone/#comments</comments>
		<pubDate>Sun, 29 Mar 2009 08:56:01 +0000</pubDate>
		<dc:creator>inagaki</dc:creator>
				<category><![CDATA[作ってみた]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[ジオポ]]></category>

		<guid isPermaLink="false">http://creco.net/2009/03/29/twiter_client_with_geopo_for_iphone/</guid>
		<description><![CDATA[&#160; 
自分で使うためだけにGeoPoを付加できるiPhoneのTwitterクライアントを作ってみた。
NatsuLiphone 1.00のソースを公開しました &#8211; takuma104.log
gi [...]]]></description>
			<content:encoded><![CDATA[<p><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="274" alt="20090329_geopotwitter" src="http://creco.net/wp-content/uploads/20090329-geopotwitter.jpg" width="424" border="0" />&#160; </p>
<p>自分で使うためだけに<a href="http://geopo.at/">GeoPo</a>を付加できるiPhoneのTwitterクライアントを作ってみた。</p>
<p><a href="http://d.hatena.ne.jp/takuma104/20081024/1224838928">NatsuLiphone 1.00のソースを公開しました &#8211; takuma104.log</a></p>
<p>githubで公開されているものを利用させていただいたので、僕は多少のUIとイベント、そしてジオポの符号化ソースを加えるだけ。とても有益なものを公開していただき、ありがとうございます。</p>
<p> <span id="more-243"></span><br />
<h4>Xcodeで実装</h4>
<h5>ジオポの符号化をコピペ</h5>
<p><a href="http://geopo.at/intl/ja/developer/sample_code.html#objective-c">ジオポ / 開発者向け情報</a> GeoPo符号化 サンプルコード in Objective-C</p>
<p>以前に作ったObjective-Cのサンプルコードをそのままコピペ。すげー、変な処理（無駄な）してると自覚してるコードなんだけど、誰からも突っ込みがないのでそのまま使う。この部分の効率を高めたとしても全体的な効率に貢献できるわけでもないしね（でも、突っ込み歓迎だよ）。</p>
<h5>UIのボタンを作る</h5>
<p>&#160;<img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="89" alt="20090329_geopotwitter_2" src="http://creco.net/wp-content/uploads/20090329-geopotwitter-2.jpg" width="324" border="0" /> </p>
<p>InterfaceBuilderで残り文字数とpostボタンの間にGeoPoボタンを入れる。んで、ビルドしてシミュレーターで確認するも反映されない ＞＜</p>
<p>どうやら、InterfaceBuilderのファイルがあるものの、UIはコードの中に埋め込まれていた。なので、コードでボタンを設置。ついでにイベントも。</p>
<h5>GeoPoボタンを押したときのイベントを作る</h5>
<ol>
<li>GeoPoボタンを押す</li>
<li>位置情報を取得</li>
<li>ジオポ符号化</li>
<li>「<a href="http://geopo.at/">http://geopo.at/</a>」に符号化したコードを加える</li>
<li>Tweetの本文に4.を加える</li>
</ol>
<p>以上のようなフローで処理を展開させる。</p>
<h5>位置情報を取得</h5>
<p><a href="http://www.gclue.com/top.html">GClue</a>の佐々木さんが作ったチュートリアルがわかりやすい。    <br /><a href="http://sites.google.com/a/gclue.jp/iphone-app-docs/iphoneapurinyuumon--gps">iPhoneアプリ入門(GPS) &#8206;(iPhone App Docs)&#8206;</a> GClue</p>
<p>ただ、このままだと位置情報をとり続けるので、位置情報を取得したあとは、</p>
<p>
<div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:857b00f0-0137-4621-9d19-ea75f6a3a4c3" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="php">[locationManager stopUpdatingLocation];</pre>
</div>
<p>してください。</p>
<p>そのタイミングなんだけど、精度が高まるまでチェックするとか、何秒後とかいろいろやり方あると思うけど、めんどくさいから僕はupdateをcountして2回目を取るとか、適当すぎる作り。</p>
<h5>Tweetに反映</h5>
<p>これで、ボタンを押せばTweetのテキストにジオポURLが付け加えられるようになった。</p>
<p>位置情報を取得している間は、本来ならば、プログレスアイコン（処理中を示すぐるぐる回ってるアレ）を表示させて、操作はできないようにすべきなんだけど、めんどくさいｋ（ｒｙ</p>
<h5>アイコンと、ロード中画像を作って完成</h5>
<p>47pxの正方形アイコンと起動時の画像を用意してあげて完成。</p>
<h6>余談</h6>
<p>iPhoneシミュレーターの位置情報デフォルト値はクパチーノのApple本社近くなんですね。それも、デフォルトアプリ「マップ」のアイコンデザインと同じとこ。<br />
  <br /><a href="http://geopo.at/dlipAo">ジオポ @ CAクパチーノ</a></p>
<p>あと、シミュレーターでは複数回の位置情報アップデートがされない（値変わらないから）ことに注意してください。</p>
<p>Twitterクライアントの名前を残したい（このままだとfrom Webになる）ところだけど、メールでの申請が必要らしいので、自分専用クライアントのGeoPo Twitterでは無理。パス。</p>
<h4>実機で使ってみる</h4>
<p><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="315" alt="20090329_1" src="http://creco.net/wp-content/uploads/20090329-1.jpg" width="210" border="0" /> </p>
<p>アイコン。</p>
<p><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="315" alt="20090329_2" src="http://creco.net/wp-content/uploads/20090329-2.jpg" width="210" border="0" /> </p>
<p>夏Lion for iPhoneそのまま。</p>
<p><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="315" alt="20090329_3" src="http://creco.net/wp-content/uploads/20090329-3.jpg" width="210" border="0" /> </p>
<p>Tweetを入力して、GeoPoボタンを押すとGPSを使った現在位置のジオポURLを付加してくれる。</p>
<p><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="315" alt="20090329_4" src="http://creco.net/wp-content/uploads/20090329-4.jpg" width="210" border="0" /> </p>
<p>GeoPo Twitterからタイムラインのジオポをクリックして、アプリ内蔵のブラウザを通して地図を表示した様子。</p>
<p>GeoPoの仕様は最初、iPhoneからは直接デフォルトアプリの「マップ」に飛ばすようになっていたんだけど、アプリを跨ぐのが非常に煩わしいので、携帯版ジオポと同様、スタティックな地図を表示させて、地図下部にあるリンクからデフォルトアプリを呼べるように仕様変更した。</p>
<p>こっちのほうがいいと思う。うん。</p>
<p><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="315" alt="20090329_5" src="http://creco.net/wp-content/uploads/20090329-5.jpg" width="210" border="0" /> </p>
<p>別のTwitterクライアントであるTwitterFonで表示した様子。</p>
<p>TwitterFonの場合、タイトルが上部に表示されるので、住所も表示されていい感じ。</p>
<h4>まとめ</h4>
<p>僕はほとんど何もしてない。簡単にTwitterクライアントが作れることを実証。</p>
<p>Twitterクライアント開発者のみなさん、ジオポを実装してみませんか？詳しくは<br />
  <br /><a href="http://geopo.at/intl/ja/developer/sample_code.html">ジオポ / 開発者向け情報</a></p>
<p>来週、東京で山手線ウォーキングをする予定なので、そのときにコレを活用してみる。Twitterでつぶやきが地図になり、つぶやきの連続がGPSトラッキングになるっていう面白さを伝えるためにね。</p>
]]></content:encoded>
			<wfw:commentRss>http://creco.net/2009/03/29/twiter_client_with_geopo_for_iphone/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://creco.net/2009/03/29/twiter_client_with_geopo_for_iphone/" />
	</item>
		<item>
		<title>ジオポTrack（仮）を作ったよ</title>
		<link>http://creco.net/2009/02/24/geopo_track_is_live_tracking_service_using_twitter/</link>
		<comments>http://creco.net/2009/02/24/geopo_track_is_live_tracking_service_using_twitter/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 10:40:07 +0000</pubDate>
		<dc:creator>inagaki</dc:creator>
				<category><![CDATA[作ってみた]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[ジオポ]]></category>
		<category><![CDATA[トラッキングサービス]]></category>

		<guid isPermaLink="false">http://creco.net/2009/02/24/geopo_track_is_live_tracking_service_using_twitter/</guid>
		<description><![CDATA[
 まだ、（仮）なので実用に乏しいけど、形だけでも作っておいた。   http://geopo.at/track/index.php?creco_test    注意：URLは仮ですので、リンクしてもなくなっちゃう可能性 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://creco.net/wp-content/uploads/20090224-geopotrack.jpg" rel="lightbox[104]"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="212" alt="20090224_geopotrack" src="http://creco.net/wp-content/uploads/20090224-geopotrack-thumb.jpg" width="404" border="0" /></a></p>
<p> まだ、（仮）なので実用に乏しいけど、形だけでも作っておいた。   <br /><a title="http://geopo.at/track/index.php?creco_test" href="http://geopo.at/track/index.php?creco_test">http://geopo.at/track/index.php?creco_test</a>    <br />注意：URLは仮ですので、リンクしてもなくなっちゃう可能性があります。</p>
<p>どういうサービスかというと、   <br />Twitterにジオポを付加してポストしていくと、それがそのままルートとして地図上に表示してくれるというライブトラッキングサービス。</p>
<p>Ajaxで1分ごとに自動更新され、Twitterのタイムラインを読みにいくので、もし頻繁にジオポをポストするユーザをフォローしてるなら、かなり正確なトラッキングルートができるはず。</p>
<h4>ぶっちゃけ</h4>
<p>全部JavaScriptで動いてるので、サーバは必要なかったりする。ユーザのマシンでタイムライン取りに行ってもらった方が効率いいしね。</p>
]]></content:encoded>
			<wfw:commentRss>http://creco.net/2009/02/24/geopo_track_is_live_tracking_service_using_twitter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://creco.net/2009/02/24/geopo_track_is_live_tracking_service_using_twitter/" />
	</item>
		<item>
		<title>ジオポ &#8211; 位置情報の短縮URLサービス</title>
		<link>http://creco.net/2009/02/20/geopo_web-service_as_shrinking_geolocation/</link>
		<comments>http://creco.net/2009/02/20/geopo_web-service_as_shrinking_geolocation/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 15:35:09 +0000</pubDate>
		<dc:creator>inagaki</dc:creator>
				<category><![CDATA[作ってみた]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[ジオポ]]></category>

		<guid isPermaLink="false">http://creco.net/2009/02/20/geopo_web-service_as_shrinking_geolocation/</guid>
		<description><![CDATA[
昨日の夜、全然眠れなくていろんなことがアイデアとして浮かんできたんだけど、とりあえず、そのうちの一つを今日がんばって作ってみた。
ジオポ
http://geopo.at     Geolocation Pointer略 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://creco.net/wp-content/uploads/20090219-geopo.jpg" rel="lightbox[86]"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="134" alt="20090219_geopo" src="http://creco.net/wp-content/uploads/20090219-geopo-thumb.jpg" width="260" border="0" /></a></p>
<p>昨日の夜、全然眠れなくていろんなことがアイデアとして浮かんできたんだけど、とりあえず、そのうちの一つを今日がんばって作ってみた。</p>
<h3>ジオポ</h3>
<p><a title="ジオポ Geolocation Pointer" href="http://geopo.at">http://geopo.at</a>     <br />Geolocation Pointer略してジオポ。</p>
<p>Twitterで「ココにいるよ！」などといった位置情報が送りたいときに、ジオポを使えばtwitterの140文字制限を気にすることなく、少ない文字数で位置情報を添付できて、地図を確認してもらえるよ。</p>
<p>使い方は<strike>簡単</strike>（今はメンドクサイ）、ジオポのトップページから緯度と経度を入力してジオポURLを作るだけ！（そんなのメンドクサイから、Twitterクライアント作ってる方に実装してもらえるように努力しますヨ。）     <br />上部に作成されたジオポURLをTwitterなどにコピペすればokだよ。</p>
<p>で、これ使って何か利点あるの？</p>
<p> <span id="more-86"></span><br />
<h4>ジオポの利点</h4>
<h5>今までは入りきらなかった地図のリンクを短縮！Twitterに位置情報を</h5>
<p>Twitterのメッセージが相手に届くのは半角で140文字まで！地図のリンクとか入れるのは絶対無理＞＜</p>
<p>ジオポなら、URLが半角で19文字から24文字（位置情報部分は3文字から8文字）。    <br />これだけで地図を表示することができます。</p>
<p>今まで、Twitterで位置情報を残す方法としては、</p>
<ol>
<li>住所の一部を文字列として書く&#8594;精度が低いし、保存性が悪い </li>
<li>特殊な記述方法で文字列を書く&#8594;一部のクライアントしか使えない </li>
<li>プロフィールの居住所に書く&#8594;使い方が間違ってる </li>
<li>写真にジオタグを埋め込む&#8594;写真投稿しないとダメ </li>
</ol>
<p>どれも、一長一短で単に位置情報を記録するためには使い勝手がよくない。</p>
<p>写真の投稿にTwitPicがあるみたいに、位置情報の記録にジオポを使ってみてください。</p>
<h5>世界中の位置情報を短縮可能。日本だけのサービスじゃないよ</h5>
<p>日本だけの位置情報を短縮しているから、こんなに短くなるわけじゃなくて、世界中の位置情報でもこの短さです。</p>
<p>後で、英語のサイトを作るので、海外の方々にも安心して使ってもらえます。</p>
<h5>可逆性なので簡単にデコード・エンコードができる</h5>
<p>短縮URLサービスと聞くと、TinyURLみたいなサービスを想像するかもしれないけど、TinyURLは短縮したいURLをサーバのDBに保存して、それを読み出す形だから、サーバへの問い合わせしないと、短縮URLが何を示しているのかわからない。</p>
<p>一方、ジオポの位置情報が圧縮（エンコード）された部分は、誰でも、どんなプログラム言語でも復元（デコード）することが可能です。</p>
<p>こちらも後で、仕様などを解説したサイト（といってもやってることはスッゴク単純！）を作るので、よかったら見てください。JavaScriptの実装ならソース見ればok！</p>
<h5>ジオポは誰でも利用できるし、どんなことに使っても問題ないよ</h5>
<p>位置情報の扱いを簡単にするために作ったジオポなので、自由に使ってもらうことは大歓迎です。個人・企業、商用・非商用問わず、誰に許可を得る必要もありません。</p>
<p>面白い使い方を見つけたらぜひ教えてください！</p>
<h5>位置情報の精度を後からでも変更できるスケーラビリティをもってるよ</h5>
<p>実はジオポはたった1文字だけでも位置情報をもっています。単純に言うと最初の1文字で全世界を64のエリアに分割して、次の1文字でそのエリアを64のエリアに分割するといった具合で、どんどん詳細な位置情報になっていくの。</p>
<p>例えば、8文字のジオポを作ったんだけど、これだと位置情報の精度が詳細すぎて、自宅の住所が丸わかり、プライバシーに関わるわって場合。後から、そのジオポを後ろの文字から削っていけばいい。1つ文字を削る度に64倍のエリアを示すジオポに変化！さっきの逆ですね。</p>
<h5>たった3文字でも40km&#215;60kmメッシュ、7文字だと10m&#215;15mメッシュ</h5>
<p>先ほどの項でのエリア、その細かさを表すためにメッシュという言葉を使います。</p>
<p>東京の場合（緯度によって、経度の間隔幅は変わるので）、</p>
<ul>
<li>3文字のジオポだと 緯度（縦方向）約39km &#215; 経度（横方向）約63.6km </li>
<li>4文字のジオポだと 約4.88km &#215; 約7.96km </li>
<li>5文字のジオポだと 約609.5m &#215; 約994.5m </li>
<li>6文字のジオポだと 約76.18m &#215; 約124.31m </li>
<li>7文字のジオポだと 約9.523m &#215; 約15.539m </li>
<li>8文字のジオポだと 約1.190m &#215; 約1.942m </li>
</ul>
<p>どういうことかというと、メッシュの端側にいる場合、最大誤差がメッシュの中央との距離分生まれるということ（6文字で角端にいる場合は、38mと62mをそれぞれ二乗して足してルートをとった距離ってことです）。</p>
<h5>ジオポはURLなので、地図へのアクセシビリティがあるよ</h5>
<p>ジオポがジオポだと分かる理由は、http://geopo.at/ （ジオポ ドット アット）というURLが付いているから。知っている人が見れば、これは位置情報を表してるんだなってすぐわかる（名前空間みたいなもの）。</p>
<p>知らない人が見ても、URLだから単純にアクセスしてしまえばすぐに理解できる。こうやって、ジオポユーザーが広がっていくといいな。</p>
<h5>受け手側の環境にあわせた地図表示ができるよ</h5>
<p>今まで、地図のリンクを相手に送ろうとした場合、その人にあわせたリンクを作ってあげなくちゃダメでしたよね。相手が携帯なのにパソコンでしか見られないGoogle Mapsのリンクを送った失敗などあるのでは？</p>
<p>ジオポの場合、受け手側の表示環境（パソコンなのか携帯電話なのかテレビからなのか、はたまたゲーム機からか）にあわせて、表示する地図を変更してあげることができます。パソコン用と携帯用の2つの地図を用意する必要がなくなります。</p>
<p>（注意：まだできてません。明日ぐらいに実装します）   <br />02/20 とりあえず、<a href="http://geopo.localhost/images/img_geopo_cap_keitai.jpg" rel="lightbox[86]">携帯用表示</a>と<a href="http://geopo.localhost/images/img_geopo_cap_iphone.jpg" rel="lightbox[86]">iPhone用表示</a>に対応しました</p>
<h5>Twitterのタイムラインで簡単にリアルタイムトラッキングするサービスができるよ</h5>
<p>Twitterで自分がどこにいて、何をしているかを簡単に伝えることができると便利ですよね。</p>
<p>ジオポのTwitterサービスを使えば、今まで色んな準備をしないと実現できなかったリアルタイムトラッキングサービス（現在位置が地図上で動いて表示される）を使えるよ！</p>
<p>（注意：まだできてません。早めに実装します）</p>
<h4>今後、僕がやらないといけないこと</h4>
<ol>
<li>実装 </li>
<li>英語 </li>
<li>根回し </li>
<li>プレスリリース </li>
<li>宣伝 </li>
</ol>
<p>以上。</p>
]]></content:encoded>
			<wfw:commentRss>http://creco.net/2009/02/20/geopo_web-service_as_shrinking_geolocation/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://creco.net/2009/02/20/geopo_web-service_as_shrinking_geolocation/" />
	</item>
		<item>
		<title>山手線ウォーキング with Twinkle</title>
		<link>http://creco.net/2009/02/18/yamanote-line_walking_with_twinkle/</link>
		<comments>http://creco.net/2009/02/18/yamanote-line_walking_with_twinkle/#comments</comments>
		<pubDate>Wed, 18 Feb 2009 10:11:31 +0000</pubDate>
		<dc:creator>inagaki</dc:creator>
				<category><![CDATA[野外活動]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[ウォーキング]]></category>

		<guid isPermaLink="false">http://creco.net/2009/02/18/%e5%b1%b1%e6%89%8b%e7%b7%9a%e3%82%a6%e3%82%a9%e3%83%bc%e3%82%ad%e3%83%b3%e3%82%b0-with-twinkle/</guid>
		<description><![CDATA[東京で暇さえあれば、ウォーキングしてるんだけど、今回はiPhoneというガジェットを持ち、Twinkleで投稿しながらウォーキングしてみたので、そのレポート。
今まで、山手線をウォーキングしたことあるのは、田端～東京間と [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://creco.net/wp-content/uploads/20090218-twinkle.jpg" rel="lightbox[72]"><img style="float: right" src="http://creco.net/wp-content/uploads/20090218-twinkle-thumb.jpg" border="0" alt="20090218_twinkle" width="160" height="240" /></a>東京で暇さえあれば、ウォーキングしてるんだけど、今回はiPhoneというガジェットを持ち、Twinkleで投稿しながらウォーキングしてみたので、そのレポート。</p>
<p>今まで、山手線をウォーキングしたことあるのは、田端～東京間と目黒～池袋間、だから今回は東京から目黒に向かってみる。丁度、デブサミ会場である目黒に行きたかったのもある。</p>
<p>歩きながら東京から目黒までの各駅でTwinkleに写真付きで投稿するという方法。改めて、Twinkleというアプリを説明すると、GPSからの現在位置情報を元にして周囲のつぶやきを拾ってくるTwitterクライアント（正確にはTwinkleとTwitterの２つにポストするということになる）。</p>
<p>それでは、スタート。</p>
<hr class="space" /><span id="more-72"></span></p>
<h4>05:12 東京駅出発</h4>
<p><a href="http://creco.net/wp-content/uploads/20090218-01.jpg" rel="lightbox[72]"><img src="http://creco.net/wp-content/uploads/20090218-01-thumb.jpg" border="0" alt="20090218_01" width="244" height="184" /></a></p>
<p>写真は投稿したiPhoneで撮ったもので、引用部はtwitterのログです。</p>
<blockquote><p>さて歩いてデブサミ会場まで行くか 現在東京駅 <a href="http://twitpic.com/1fqp9">http://twitpic.com/1fqp9</a><br />
<a href="http://twitter.com/shinagaki/status/1200186300">5:12 AM Feb 12th</a> from <a href="http://twitterfon.net/">TwitterFon</a></p></blockquote>
<p>２月１２日の午前５時。</p>
<p>高速バスで名古屋からやってきて疲れているのにも関わらず、そのままウォーキング。<br />
バスの客は、東京駅構内に入ってたのにも関わらず、そのままウォーキング。<br />
八重洲口のバスターミナル（降車専用）から、呉服橋のほうへ出て、それから南下。</p>
<p>この時間は人も車もまばら。</p>
<blockquote><p>その前にカロリー摂取 <a href="http://twitpic.com/1fqwb">http://twitpic.com/1fqwb</a><br />
<a href="http://twitter.com/shinagaki/status/1200217846">5:21 AM Feb 12th</a> from <a href="http://twitterfon.net/">TwitterFon</a></p></blockquote>
<p>朝ご飯食べてないので、松屋で朝定食。</p>
<h4>05:47 有楽町駅</h4>
<p><a href="http://creco.net/wp-content/uploads/20090218-02.jpg" rel="lightbox[72]"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://creco.net/wp-content/uploads/20090218-02-thumb.jpg" border="0" alt="20090218_02" width="244" height="184" /></a></p>
<blockquote><p>山手線ウォーキング中 有楽町到着！ <a href="http://snipurl.com/bpjp1">http://snipurl.com/bpjp1</a><br />
<a href="http://twitter.com/shinagaki/status/1200303236">5:47 AM Feb 12th</a> from <a href="http://twitter.com/twinkleking">Twinkle</a></p></blockquote>
<p>駅の奥がビックカメラ。やけに月がキレイで、別のデジカメで写真撮ってたりしながらウォーキング。まだ人もまばら。</p>
<h4>06:03 新橋駅</h4>
<p><a href="http://creco.net/wp-content/uploads/20090218-03.jpg" rel="lightbox[72]"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://creco.net/wp-content/uploads/20090218-03-thumb.jpg" border="0" alt="20090218_03" width="184" height="244" /></a></p>
<blockquote><p>新橋到着 明るくなってきた <a href="http://twitpic.com/1frox">http://twitpic.com/1frox</a><br />
<a href="http://twitter.com/shinagaki/status/1200354882">6:03 AM Feb 12th</a> from <a href="http://twitterfon.net/">TwitterFon</a></p></blockquote>
<p>早い出勤の方々とかいて、少し忙しかった新橋駅周辺。</p>
<p>新橋駅までは一直線だったけど、新橋駅で山手線と平行した道がなくなる。１５号線のでっかい道路に沿って歩くことにした。</p>
<h4>06:24 浜松町駅</h4>
<p><a href="http://creco.net/wp-content/uploads/20090218-04.jpg" rel="lightbox[72]"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://creco.net/wp-content/uploads/20090218-04-thumb.jpg" border="0" alt="20090218_04" width="244" height="184" /></a></p>
<blockquote><p>浜松町 この時間たなると人がけっこういるねぇ <a href="http://snipurl.com/bpm43">http://snipurl.com/bpm43</a><br />
<a href="http://twitter.com/shinagaki/status/1200424653">6:24 AM Feb 12th</a> from <a href="http://twitter.com/twinkleking">Twinkle</a></p></blockquote>
<p>完全に出勤の人たちに混じって悠長にウォーキングしてます、本当にありがとうございました。</p>
<p>浜松町駅は１５号線から少しだけ東に外れるから、わざわざ駅を撮影しにいった。よくわかんない、ルールが暗黙の了解であるみたい。</p>
<h4>06:43 田町駅</h4>
<p><a href="http://creco.net/wp-content/uploads/20090218-05.jpg" rel="lightbox[72]"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://creco.net/wp-content/uploads/20090218-05-thumb.jpg" border="0" alt="20090218_05" width="244" height="184" /></a></p>
<blockquote><p>田町 ちょうどいいペースかな <a href="http://snipurl.com/bpndt">http://snipurl.com/bpndt</a><br />
<a href="http://twitter.com/shinagaki/status/1200486028">6:43 AM Feb 12th</a> from <a href="http://twitter.com/twinkleking">Twinkle</a></p></blockquote>
<p>完全に朝です。</p>
<p>東京泊で来たので、荷物が重かったり（ノートパソコンとか入ってるし、そもそもビジネスバッグだし＞＜）してウォーキングに向いてない格好だということにこの頃気づく。</p>
<h4>07:08 品川駅</h4>
<p><a href="http://creco.net/wp-content/uploads/20090218-06.jpg" rel="lightbox[72]"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://creco.net/wp-content/uploads/20090218-06-thumb.jpg" border="0" alt="20090218_06" width="244" height="184" /></a></p>
<blockquote><p>品川 田町から意外と遠かったよ <a href="http://snipurl.com/bpp1q">http://snipurl.com/bpp1q</a><br />
<a href="http://twitter.com/shinagaki/status/1200567662">7:08 AM Feb 12th</a> from <a href="http://twitter.com/twinkleking">Twinkle</a></p></blockquote>
<p>田町から品川って、近いように思っていたんだけど結構歩いた。左手がずっと線路で画変わりしないから単調になってくるのかな？</p>
<h4>07:35 大崎駅</h4>
<p><a href="http://creco.net/wp-content/uploads/20090218-07.jpg" rel="lightbox[72]"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://creco.net/wp-content/uploads/20090218-07-thumb.jpg" border="0" alt="20090218_07" width="244" height="184" /></a></p>
<blockquote><p>大崎到着 こっち側からだと駅だとわからんね 途中はジョギングの人が多かった <a href="http://snipurl.com/bpqrb">http://snipurl.com/bpqrb</a><br />
<a href="http://twitter.com/shinagaki/status/1200653181">7:35 AM Feb 12th</a> from <a href="http://twitter.com/twinkleking">Twinkle</a></p></blockquote>
<p>方向音痴の僕にとって最高に難易度が高かった。品川からは、御殿山のカーブを上って、下って、御殿山小学校で路地に入って、大崎駅近辺まで細い道を進んだ。</p>
<h4>07:50 五反田駅</h4>
<p><a href="http://creco.net/wp-content/uploads/20090218-08.jpg" rel="lightbox[72]"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://creco.net/wp-content/uploads/20090218-08-thumb.jpg" border="0" alt="20090218_08" width="244" height="184" /></a></p>
<blockquote><p>五反田 次の目黒でラスト 案外早くいけたなぁ <a href="http://snipurl.com/bprmb">http://snipurl.com/bprmb</a><br />
<a href="http://twitter.com/shinagaki/status/1200698522">7:50 AM Feb 12th</a> from <a href="http://twitter.com/twinkleking">Twinkle</a></p></blockquote>
<p>大崎で山手通りの高架を上ってそのまま道沿いに、五反田駅をくぐって山手線の内側の道で目黒を目指す。</p>
<h4>08:09 目黒駅到着</h4>
<p><a href="http://creco.net/wp-content/uploads/20090218-09.jpg" rel="lightbox[72]"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://creco.net/wp-content/uploads/20090218-09-thumb.jpg" border="0" alt="20090218_09" width="244" height="184" /></a></p>
<blockquote><p>目黒到着お疲れさまでした まだデブサミの開場まで時間あるからプラプラしてくる <a href="http://snipurl.com/bpst6">http://snipurl.com/bpst6</a><br />
<a href="http://twitter.com/shinagaki/status/1200757535">8:09 AM Feb 12th</a> from <a href="http://twitter.com/twinkleking">Twinkle</a></p></blockquote>
<p>ゴール。感情を表に出すとタダのきもいひとなので、心の中で達成感を感じてました。</p>
<p>朝早くにも関わらず、途中で何人もの人から「がんばってください」とか「おはよう」などTwinkleでメッセージが届けられ励みになりました。ありがとう。</p>
<p>今回は特に迷うところなどなかったし、目指す場所はきまっていたのですが、Twinkleみたいに現在位置をベースにしたコミュニティだと、その土地に詳しい人が多いだろうから、迷ったら助けてもらえたり、オススメの食事とかを気兼ねなく訊けそう。</p>
<p>iPhoneもってるだけで誰でもできるので、やってみるといいよ。</p>
]]></content:encoded>
			<wfw:commentRss>http://creco.net/2009/02/18/yamanote-line_walking_with_twinkle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://creco.net/2009/02/18/yamanote-line_walking_with_twinkle/" />
	</item>
	</channel>
</rss>
