<?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; Objective-C</title>
	<atom:link href="http://creco.net/tag/objective-c/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/objective-c/feed/" />
		<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>ジオポの符号化、復号化をいろんな言語で書いてみる</title>
		<link>http://creco.net/2009/03/05/write_codes_in_variaous_languages/</link>
		<comments>http://creco.net/2009/03/05/write_codes_in_variaous_languages/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 08:55:22 +0000</pubDate>
		<dc:creator>inagaki</dc:creator>
				<category><![CDATA[日記]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[エクセル]]></category>
		<category><![CDATA[ジオポ]]></category>

		<guid isPermaLink="false">http://creco.net/2009/03/05/write_codes_in_variaous_languages/</guid>
		<description><![CDATA[位置情報をいくら短縮して色んなことに応用できるといっても、ユーザーが使ってくれるまでの敷居が高い（今のブラウザ経由の符号化じゃ、ダメってこと）とどうしようもない。
そんな理由で、まずはユーザーが接するアプリケーションの開 [...]]]></description>
			<content:encoded><![CDATA[<p>位置情報をいくら短縮して色んなことに応用できるといっても、ユーザーが使ってくれるまでの敷居が高い（今のブラウザ経由の符号化じゃ、ダメってこと）とどうしようもない。</p>
<p>そんな理由で、まずはユーザーが接するアプリケーションの開発者サイドにジオポ実装を働きかけていきたい。そのためにも、具体的なサンプルコードをプログラミング苦手な僕が書いてみた。</p>
<p>と、その前に&#8230;   <br />ジオポが<a href="http://netafull.net/" target="_blank">ネタフル</a>で紹介されたよ！    <br /><a href="http://netafull.net/tech/029580.html" target="_blank">位置情報を短縮したURLに変換するウェブサービス「ジオポ」</a></p>
<p>スクリーンショット付きで丁寧に紹介していただきありがとうございます。モチベーションあがりました！</p>
<p> <span id="more-129"></span><br />
<h4>実装するアルゴリズム</h4>
<p><a href="http://geopo.at/intl/ja/developer/" target="_blank">ジオポ 開発者向け情報</a>にも書いたんだけど、ジオポの符号化はいろんな方法が考えられる。</p>
<p>その中でも、一番わかりやすいと思われる方法を各サンプルコードで実装することにする。</p>
<blockquote><h6>ジオポの符号化の実装</h6>
<p>ジオポの符号化方法ですが、こちらで紹介する方法以外にもアルゴリズム（8進数化してビット演算など）はあると思います。ここでは、一番わかりやすいアルゴリズムを紹介します。また、文字ではわかりにくいと思いますので、実際にいろいろな言語で実装したコードは、<a href="http://geopo.at/intl/ja/developer/#appendix">付録</a>をご覧ください。</p>
<p>変換する緯度・経度は度数法での度（D）表記での数値です。もし、度分（DM）表記や度分秒（DMS）表記の場合は、前もって度へと変換してください。     <br />また、南緯と西経はそれぞれマイナス値となります。 </p>
<p>緯度・経度からジオポへの符号化を実装するには、まず度数法で与えられる緯度・経度を十進数に変換します。     <br />緯度と経度をそれぞれ90と180を足して正の値とします。それから、それぞれ90と180で割り、0から1までの値になります。最後に、8の10乗をかけます。 </p>
<p>続いて、十進数化した緯度・経度がジオポ符号でのどのエリアにあたるかを算出します。     <br />緯度は、8を9から縮尺を引いた回数だけ乗じた数字で割ってやり、さらに、その数値を8で割ったあまりを取り出します。経度も同様に、8を9から縮尺を引いた回数だけ乗じた数字で割ってやり、さらに、その数値を8で割ったあまりを取り出し、経度には8をかけてやります。その2つの数値を足すと0から63の数値となり、それに対応する文字がジオポ符号ということになります。 </p>
<p>次の符号を上のルーチンを繰り返しますが、8を9から縮尺を引いた回数だけ乗じた数字という部分が変化する点に注意してください。この繰り返す回数により、ジオポコードの縮尺（Scale）を決定することができます。 </p>
<h6>復号化（デコード）</h6>
<p>復号化する方法は符号化の逆をすることで実装できます（ジオポコードは可逆性を持ちます）。 </p>
<p>ただし、ジオポは小縮尺にも対応しているため、小縮尺になるほど符号化した位置情報との誤差が大きくなります。その誤差をできるだけ平均にするため、緯度・経度をエリアの代表緯度・経度（エリアの真ん中の緯度・経度）へと変換する式が含まれています。 </p>
<p>ジオポをクライアントソフト側で独自に復号化して緯度・経度を取り出したい場合は、ジオポURLからジオポコードを抽出する必要があります。     <br />下記の正規表現を用いれば、ジオポコードを抽出することができます。 </p>
</blockquote>
<ul>
<li>四則演算</li>
<li>forループ</li>
<li>べき乗、切り捨て、余り の数学関数</li>
<li>文字列の長さ、指定したサイズでの文字列の切り出し、文字列の中にある文字の位置 の文字列関数</li>
</ul>
<p>キーとなる所はこんだけで、各言語にある関数などを言語間の違いに注意して実装してみる。</p>
<h4>実際に実装</h4>
<h5>JavaScript</h5>
<p>
<div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:b44dd511-e4bb-4235-8664-baba02e474ba" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="js">/*
 * GeoPo Encode in JavaScript
 * @author : Shintaro Inagaki
 * @param location (Object)
 * @return geopo (String)
 */
function geopoEncode(location){
	// 64characters (number + big and small letter + hyphen + underscore)
	var chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_";

	var geopo = new String();
	var lat = parseFloat(location.lat); // Parse as float
	var lng = parseFloat(location.lng); // Parse as float
	var scale = parseInt(location.scale); // Parse as int

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

	// Compute a GeoPo code from head and concatenate
	for(var 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);
	}
	return geopo;
}

/*
 * GeoPo Decode in JavaScript
 * @author : Shintaro Inagaki
 * @param geopo (String)
 * @return location (Object)
 */
function geopoDecode(geopo){
	// 64characters (number + big and small letter + hyphen + underscore)
	var chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_";

	var location = new Object();
	var lat = 0;
	var lng = 0;
	var scale = geopo.length; // Scale is length of GeoPo code
	var order = 0;

	for (var i = 0; i &lt; scale; i++) {
		// What number of character that equal to a GeoPo code (0-63)
		order = chars.indexOf(geopo.substr(i, 1));
		// Lat/Lng plus geolocation value of scale
		lat = lat + Math.floor(order % 8) * Math.pow(8, 9 - i);
		lng = lng + Math.floor(order / 8) * Math.pow(8, 9 - i);
	}

	// Change a decimal number to a degree measure, and plus revised value that shift center of area
	location.lat = lat * 180 / Math.pow(8, 10) + 180 / Math.pow(8, scale) / 2 - 90;
	location.lng = lng * 360 / Math.pow(8, 10) + 360 / Math.pow(8, scale) / 2 - 180;
	location.scale = scale;

	return location;
}		</pre>
</div>
<p>僕はジオポを最初にJavaScriptで作ったので、いわばこれが原型。</p>
<p>パラメーターがString型でそのまま入ってくるといけないので、最初に<strong>parseFloat()</strong>と<strong>parseInt()</strong>でそれぞれ型を決めてやる。</p>
<p>そして、べき乗には<strong>Math.pow()</strong>、切り捨てには<strong>Math.floor()</strong>という数学関数があるので利用。</p>
<p>文字列。String.<strong>length</strong>は文字の長さ。JavaScriptの文字列の結合は<strong>+</strong>で、String.<strong>substr()</strong>メソッドによって文字列を切り出してやる。文字列の中にある文字の位置を取ってくるのは String.<strong>indexOf()</strong>メソッド。</p>
<p>JavaScriptはTry&amp;Errorがしやすいから、実装の基本にするのに向いてるのかも。amachangさんが言ってたように、ブラウザさえあればどこでもプログラミングできるメリットもあるしね。</p>
<h5>PHP</h5>
<p><div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:6db8bab2-2b9b-497a-8f56-ea95895bede1" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="php">/*
 * GeoPo Encode in PHP
 * @author : Shintaro Inagaki
 * @param $location (Array)
 * @return $geopo (String)
 */
function geopoEncode($location) {
	// 64characters (number + big and small letter + hyphen + underscore)
	$chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_";

	$geopo = "";
	$lat = $location['lat'];
	$lng = $location['lng'];
	$scale = $location['scale'];

	// Change a degree measure to a decimal number
	$lat = ($lat + 90) / 180 * pow(8, 10);
	$lng = ($lng + 180) / 360 * pow(8, 10);

	// Compute a GeoPo code from head and concatenate
	for($i = 0; $i &lt; $scale; $i++) {
		$geopo .= substr($chars, floor($lat / pow(8, 9 - $i) % 8) + floor($lng / pow(8, 9 - $i) % 8) * 8, 1);
	}
	return $geopo;
}		

/*
 * GeoPo Decode in PHP
 * @author : Shintaro Inagaki
 * @param $geopo (String)
 * @return $location (Array)
 */
function geopoDecode($geopo) {
	// 64characters (number + big and small letter + hyphen + underscore)
	$chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_";
	// Array for geolocation
	$location = array ();

	for ($i = 0; $i &lt; strlen($geopo); $i++) {
		// What number of character that equal to a GeoPo code (0-63)
		$order = strpos($chars, substr($geopo, $i, 1));
		// Lat/Lng plus geolocation value of scale
		$location['lat'] = $location['lat'] + floor($order % 8) * pow(8, 9 - $i);
		$location['lng'] = $location['lng'] + floor($order / 8) * pow(8, 9 - $i);
	}

	// Change a decimal number to a degree measure, and plus revised value that shift center of area
	$location['lat'] = $location['lat'] * 180 / pow(8, 10) + 180 / pow(8, strlen($geopo)) / 2 - 90;
	$location['lng'] = $location['lng'] * 360 / pow(8, 10) + 360 / pow(8, strlen($geopo)) / 2 - 180;
	$location['scale'] = strlen($geopo);

	return $location;
}		</pre>
</div>
<p>なんちゃってPerlerからPHPに移行してもう何年も経つけど、やっぱりPHPが好き。未だに知らない関数ばかりだけどね ＞＜</p>
<p>べき乗は<strong>pow()</strong>、切り捨ては<strong>floor()</strong>。文字列の長さは<strong>strlen()</strong>、文字列の切り出しは<strong>substr()</strong>、文字列の中にある文字の位置は<strong>strpos()</strong>。</p>
<p>こういう関数あるかなぁってマニュアル見ると、大抵あるから、CHM形式のマニュアルが手元にあると便利です。</p>
<h5>Objective-C</h5>
<p><div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:d88f016a-8581-4dfd-a40a-333a3c108cad" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c">/*
 * GeoPo Encode in Objective-C
 * @author : Shintaro Inagaki
 * @param geopo, latitude, longitude, scale (pointer)
 */
-(void)encodeGeopo:(id)geopo latitude:(double *)lat longitude:(double *)lng scale:(int *)scale {
	NSString *chars = @"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_";

	*lat = (*lat + 90) / 180 * pow(8.0, 10.0);
	*lng = (*lng + 180) / 360 * pow(8.0, 10.0);

	for(int i = 0; i &lt; *scale; i++){
		[geopo appendString:[chars substringWithRange:NSMakeRange(floor(fmod(*lat / pow(8.0, 9.0 - i), 8.0)) + floor(fmod(*lng / pow(8.0, 9.0 - i), 8.0)) * 8, 1)]];
	}
}		

/*
 * GeoPo Decode in Objective-C
 * @author : Shintaro Inagaki
 * @param geopo, latitude, longitude, scale (pointer)
 */
-(void)decodeGeopo:(id)geopo latitude:(double *)lat longitude:(double *)lng scale:(int *)scale {
	NSString *chars = @"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_";
	int order;

	*scale = [geopo length];

	for (int i = 0; i &lt; *scale; i++) {
		order = NSMaxRange([chars rangeOfString:[geopo substringWithRange:NSMakeRange(i, 1)]]) - 1;
		*lat += (order % 8) * pow(8, 9 - i);
		*lng += floor(order / 8) * pow(8, 9 - i);
	}

	*lat = *lat * 180 / pow(8, 10) + 180 / pow(8, *scale) / 2 - 90;
	*lng = *lng * 360 / pow(8, 10) + 360 / pow(8, *scale) / 2 - 180;
}		</pre>
</div>
<p>iPhone開発者に媚びを売るにはObjective-Cでの実装も必須だよね。でも、素直にCで書いたほうがよかったかもって後から思った。そんな、ダメダメなサンプルコード。つっこみ歓迎。</p>
<p>パラメーターはポインタで渡す。で、未だに理解できてないけど idやdoubleなどのプリミティブなオブジェクトを使うらしい。</p>
<p>整数のintなら<strong>%</strong>が余りとして利用できるんだけど、doubleなど浮動小数点になると<strong>fmod()</strong>を使わなきゃならん。べき乗の<strong>pow()</strong>の中身も小数点付いてますよってことをアピールしてるんだけど、これって意味あったっけ？（c++の場合はこうじゃないと叱られた気がする）<strong> floor()</strong>で切り捨て。</p>
<p>文字列を切り出すには<strong>substringWithRange:</strong> 使うんだけど、これの引数はNSRange型なので中で<strong>NSMakeRange()</strong>使ってNSRange型を作って渡してやる。そして、文字列をくっつけるには<strong>appendString:</strong>。ただし、こうやって可変な文字列を扱うには文字列の型をNSMutableStringにしないとダメ（ここでいうgeopoの宣言）だから注意してね。</p>
<p>こっからが難問ｗ 復号化のほう</p>
<p>文字列の中にある文字の位置を取ってきたいんだけど、一発でできるようなものはなかった＞＜<br />
  <br />仕方がないので、<strong>substringWithRange:</strong>で文字列を切り出してやって、それがどこの位置かを<strong>rangeOfString:</strong>で取り出すという二段構成に。ただ、それだけだとNSRange型が返ってきて、希望するintではないから<strong>NSMaxRange()</strong>で整数値にするという三段構成に。そうすると、先頭からの位置+1になり、帳尻をあわせるために最後に-1。</p>
<p>ひょっとすると、もっと簡単にサクッとできるような関数があるのかもしれない。あったら教えてくださいな。</p>
<p>しっかし、Objective-Cと他の言語を混ぜて考えると関数の形で混乱するわｗ<br />
  <br />iPhoneアプリ作りは、ゆっくりとした休日にやろうと思った。</p>
<h5>エクセル</h5>
<div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:9dcd44c9-7919-4681-97c3-2a1051d16443" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="xml">
ジオポのエンコード方法（エクセル関数）

以下で利用している【】はセルの位置です（A1、B4等）。各自読み替えて利用してください。

緯度を入力するセルの位置を【緯度】とします。
経度を入力するセルの位置を【経度】とします。
符号化に使用する文字列のあるセルを【符号】とし、
「0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_」
を入力します（「」は除いてください）。

ジオポコードの1文字目を出力したいセルに、
「=MID(【符号】,INT(MOD((【緯度】+90)/180*POWER(8,10)/POWER(8,9),8))+INT(MOD((【経度】+180)/360*POWER(8,10)/POWER(8,9),8))*8+1,1)」
とすると、1文字目のジオポコードが得られます。
同様に、
「=MID(【符号】,INT(MOD((【緯度】+90)/180*POWER(8,10)/POWER(8,8),8))+INT(MOD((【経度】+180)/360*POWER(8,10)/POWER(8,8),8))*8+1,1)」
とPOWERの2番目の引数を1引いてやると、2文字目のジオポコードとなり、2文字目以降も同じ繰り返しとなります。

それぞれのジオポコードのセルを&amp;で結合してやれば、ジオポコードの文字列となります。

（例）
A1に緯度、B1に経度、C1に符号化文字列を入力。
A2に「=MID(C1,INT(MOD((A1+90)/180*POWER(8,10)/POWER(8,9),8))+INT(MOD((B1+180)/360*POWER(8,10)/POWER(8,9),8))*8+1,1)」と入力。
B2に「=MID(C1,INT(MOD((A1+90)/180*POWER(8,10)/POWER(8,8),8))+INT(MOD((B1+180)/360*POWER(8,10)/POWER(8,8),8))*8+1,1)」と入力。
C2に「=MID(C1,INT(MOD((A1+90)/180*POWER(8,10)/POWER(8,7),8))+INT(MOD((B1+180)/360*POWER(8,10)/POWER(8,7),8))*8+1,1)」と入力。
D2に「=MID(C1,INT(MOD((A1+90)/180*POWER(8,10)/POWER(8,6),8))+INT(MOD((B1+180)/360*POWER(8,10)/POWER(8,6),8))*8+1,1)」と入力。
E2に「=MID(C1,INT(MOD((A1+90)/180*POWER(8,10)/POWER(8,5),8))+INT(MOD((B1+180)/360*POWER(8,10)/POWER(8,5),8))*8+1,1)」と入力。
F2に「=MID(C1,INT(MOD((A1+90)/180*POWER(8,10)/POWER(8,4),8))+INT(MOD((B1+180)/360*POWER(8,10)/POWER(8,4),8))*8+1,1)」と入力。
A3に「=A2&amp;B2&amp;C2&amp;D2&amp;E2&amp;F2」と入力すれば、A3で6文字のジオポコードが得られます。
		</pre>
</div>
<p>最後にネタ的なエクセル関数を使った実装。</p>
<p>型の宣言しないで計算できるし好き。べき乗は<strong>POWER()</strong>、切り捨ては<strong>INT()</strong>、余りは<strong>MOD()</strong>。</p>
<p>そして、<strong>MID()</strong>は指定した範囲の文字列を取ってこれて、文字を結合するには<strong>&amp;</strong>で繋げるだけ。</p>
<p>無駄が多くて関数が長くなったり、途中計算用のセルが必要になったりするけど、単純なエクセル関数でも実装できるってことが重要。Scale（縮尺）がないけど気にしない。</p>
<h4>まとめ</h4>
<p>簡単に実装できることを実証したかったんだけど、Objective-Cは時間がかかって気づいたら朝になってた&#8230;</p>
<p>いろんな言語に触れてみるのは楽しいね。今度は、C、Perl、Pythonあたりを挑戦してみるつもり。</p>
]]></content:encoded>
			<wfw:commentRss>http://creco.net/2009/03/05/write_codes_in_variaous_languages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://creco.net/2009/03/05/write_codes_in_variaous_languages/" />
	</item>
	</channel>
</rss>
