‘作ってみた’ カテゴリーのアーカイブ

crecoのロゴをつくってみた

20090109  

そろそろ自宅から名古屋へ拠点が移るので、crecoのサイトを本格的につくろうと思ったのです。

そこで、ビジュアル的にコーポレートロゴもあったほうがよいと思い、ロゴつくりに勤しんでいたのですが、シンプルに伝えなきゃいけないロゴだけに、考えなきゃいけないことが沢山ありますね。正直なめてました。

20090109_2

上のアイデア変遷を見てもらえればわかるんですが、最初はコーポレートカラーでcrecoの『c』を形象化してたんだけど、いまいちパッとしないねー。

そのうち、地図とかで使うPOI(Point of Interest)を表すのに使われるマーカーが浮かんできて、自然な形のロゴっぽくみせていくために、形状の大きさを試行錯誤して、数時間後に最終案の完成に至りました。

ロゴひとつでも大変><

イーモバイルのサービスエリアをGoogle Earthに重ねてみる

20080811  

携帯電話のサービスエリアって繋がるのが当然になってあまり気にしなくなっていたんだけど、イーモバイルはサービスエリアが都市部に限定されてるから、否が応でも気にしないと大変なことになる。

それで、イーモバイルのサイトにはEM モバイルブロードバンドサービスエリアとしてサービス提供地域が確認できるようになってるんだけど、Googleマップみたいにドラッグでスクロールできるわけでもなく、いまいちな使い勝手。
他にはPDFでもダウンロードできるようになってて、印刷するには丁度いいんだけど、サイト上で見られる提供地域よりも古い情報(2008年5月)となってるし、解像度がいまいち。

上の画像はサイトのPNG画像とPDFを比較してみた図。

そこで、サイトのPNG画像を取得してGoogle Earthにオーバーレイできればよくない?いいんじゃね!

ということで作ってみる。

イーモバイルの画像ファイルについての考察1

まず、重ね合わせる元となるPNG画像を取ってこないといけないんだけど、ファイル名の命名規則を調べて、効率的に取ってこないと駄目だよね。

イーモバイルサイトで表示サービスエリアの移動操作はJavaScriptを使ってるので、そのソースを見て、なんとなく動作を理解する。

どうやら、緯度・経度がファイル名に対応しているらしい。第一段階はこんな具合。

http://emobile.jp/area/area/map1/5236/5236.png
map1:ズーム(横幅)。map1は横幅160km。
5236:前の2桁が緯度の軸、後ろの2桁が経度の軸。んで、後から色々試してわかったんだけど、前の2桁は2/3でかけると緯度となり、後ろの2桁は100を足すと経度となる。
加えて画像ファイルの表示範囲は上下左右位置の画像ファイルと半分重なるようになっている。

画像が提供されないエリアについては、下のソースみたくJavaScriptでフラグが管理されてあるのでそれを読み取ってエクセルにマッピングしてみた。

    var inflag;
    inflag = 1;
    if (Mesh_1_XX <= 21) {
        inflag = 1;
    }
    else if (Mesh_1_XX <= 25) {
        if (Mesh_1_YY >= 36 && Mesh_1_YY <= 38) {
            inflag = 0;
        };
    }
    else if (Mesh_1_XX <= 27) {
        if (Mesh_1_YY >= 36 && Mesh_1_YY <= 40) {
            inflag = 0;
(以下省略)

20080811_2

これで、第一段階のKMLはPHPで生成して完成。

<?php

print '<?xml version="1.0" encoding="UTF-8"?>'."n";
print '<kml xmlns="http://earth.google.com/kml/2.2">'."n";
print '<Document>'."n";
print '	<name>emobile</name>'."n";

for($i=36;$i<=68;$i++){
	for($j=22;$j<=45;$j++){

		$inflag = 1;

		if ($j <= 21) {
			$inflag = 1;
		}elseif ($j <= 25) {
			if ($i >= 36 && $i <= 38) {
				$inflag = 0;
			};
		}elseif ($j <= 27) {
			if ($i >= 36 && $i <= 40) {
				$inflag = 0;
			};
		}elseif ($j <= 29) {
			if ($i >= 39 && $i <= 52) {
				$inflag = 0;
			};
		}elseif ($j <= 30) {
			if ($i >= 42 && $i <= 52) {
				$inflag = 0;
			};
		}elseif ($j <= 31) {
			if ($i >= 45 && $i <= 52) {
				$inflag = 0;
			};
		}elseif ($j <= 35) {
			if ($i >= 49 && $i <= 54) {
				$inflag = 0;
			};
		}elseif ($j <= 38) {
			if ($i >= 49 && $i <= 57) {
				$inflag = 0;
			};
		}elseif ($j <= 39) {
			if ($i >= 49 && $i <= 64) {
				$inflag = 0;
			};
		}elseif ($j <= 41) {
			if ($i >= 52 && $i <= 68) {
				$inflag = 0;
			};
		}elseif ($j <= 42) {
			if ($i >= 58 && $i <= 68) {
				$inflag = 0;
			};
		}elseif ($j <= 43) {
			if ($i >= 62 && $i <= 67) {
				$inflag = 0;
			};
		}elseif ($j <= 45) {
			if ($i >= 64 && $i <= 66) {
				$inflag = 0;
			};
		};

		if($inflag){
			continue;
		}

		print '	<GroundOverlay>'."n";
		print '		<name>emobile</name>'."n";
		print '		<Icon>'."n";
		print '			<href>http://emobile.jp/area/area/map1/'.$i.$j.'/'.$i.$j.'.png</href>'."n";
		print '		</Icon>'."n";
		print '		<LatLonBox>'."n";
		print '			<north>'.(($i+2)/3*2).'</north>'."n";
		print '			<south>'.($i/3*2).'</south>'."n";
		print '			<east>'.($j+2+100).'</east>'."n";
		print '			<west>'.($j+100).'</west>'."n";
		print '		</LatLonBox>'."n";
		print '	</GroundOverlay>'."n";
	}
}

print '</Document>'."n";
print '</kml>'."n";

?>

イーモバイルの画像ファイルについての考察2

第一段階では解像度になっとくできないので、第二段階(横幅40km)を取ってくることにする。

http://emobile.jp/area/area/map2/5236/52364D.png

52364D:前の4桁については第一段階と同じ、後ろの2文字は第一段階のエリアを16分割した場所を示す。

上を北にした地図表現だと次のような場所。

3C 3D 4C 4D
3A 3B 4A 4B
1C 1D 2C 2D
1A 1B 2A 2B

これさえわかれば、あとは同じなので、KMLにしてGoogle Earthで表示してみる。

死亡。

オーバーレイの画像をインターネットから取得して読み込んでいき、沖縄から九州まで時間をかけながら徐々に埋まっていくんだけど、福岡が見えないうちに動作が重たくなって、しまいにはGoogle Earthが落ちた。

よく考えれば、4000枚ものPNG画像をダウンロードしながら表示させるなんて無理ありすぎです。ごめんなさい。

それならば画像を合成してやればok

何度も画像をダウンロードしてるようだとイーモバイルに怒られるので、一旦ローカルに保存してから、それをPHPで16枚を1枚の画像に合成。

あとは第一段階のKMLを修正(重ね合わせの範囲が違うので)して、ようやくやりたいことができた!

20080811_3

発展としては、サービス提供エリアを画像認識でトレース→ベクトルデータに変換→SWFに。

イーモバイルだけじゃなく他の3キャリアのサービス提供エリアも同じことをする(調べたところ、全キャリアで画像によるサービスエリア表示をしていたので可能)。

全キャリアの重ね合わせをトグルできるようにして、キャリアごとにサービスエリアを比較できるようになっちゃう!!!

需要あるのかわかんないけど、勉強がてら近いうちにやってみたい。

Xactiの自転車マウントを作ってみた

20080803_2 

PeerCastで葡萄さんの自転車配信を見てて、Xactiのマウントの作り方を訊いて、教えてもらったので、早速ホームセンターに行って、材料買って、作ってみた。

20080803_3

 使った材料
アルミ カナオレ GB ALA-60…315円
ミニカナグ LK12…136円×4
マゲイタ クロ NO.60…315円×1
キャップ(ボルト) 5×40…260円
キャップ(ボルト) 5×15…260円
スベリドメ…128円
自転車取り付け金具…以前のマウントであるベロムービーを流用
蝶ナット…家にあったもの

作り方

  1. 「アルミ ナカオレ」を「自転車取り付け金具」に15mmのボルトで固定
  2. L字型の「ミニカナグ」を「アルミ ナカオレ」に15mmのボルトで固定。2つをまとめて上下2ヵ所
  3. Xactiと「ミニカナグ」の接触部を「スベリドメ」で巻いて、万能ボンドでくっつける、極めつけにホットボンドで固定
  4. 「アルミ ナカオレ」にサイズ間違えて中途半端に人力で曲げた「マゲイタ クロ」を取り付ける(これ、あまり必要ない)
  5. 「アルミ ナカオレ」の穴に40mmのボルトを通して、「蝶ナット」で締め上げれば

    できあがり^^

    意外と簡単に、安価に、しっかりと固定できるようなマウントができたー。ちょっと走りに行ってくる

Pythonおもしろくなってきたかも

20080730

ぶっちゃけていうと、素のままではできることが少なく、最初からいろんな関数があたえられてるPHPと比べると大変なんだけど、シンプルさとソースの見やすさから好きになりそうな言語。わかりやすいし。

それで、GPSとのシリアル通信のプログラムなんだけど、
今まで readline() で読んでたところを、timeout値を1秒近辺(後述)にし read() で取ってやるとつまりもなく、非常にスムース

GPSからの出力データは1秒おきにどばっとくる。そこで、timeout値は0.9秒にしてやって、データがシンクロできるようにとPythonの計算時間を考慮して、一定のコンマ秒で read() する時間を逐次調節するように

ソースは以下の通り

#!/usr/bin/python

import sys, os, os.path, serial, urllib, urllib2, socket, thread, time

socket.setdefaulttimeout(10)

serialPort = 'COM6' #EeePC usb
#serialPort = 'COM3' #EeePC bluetooth
url = 'hogehoge'

tryCount = 0
baseTime = 0

def getGprmcSentence():
	global baseTime

	while True:
		try :
			buffer = ser.read(1000)
		except :
			print "error"
			return "error"

		if int(time.time()) + baseTime - time.time() > 0:
			time.sleep(int(time.time()) + baseTime - time.time() )

		if buffer[0:6] != '$GPGGA':
			print 'sync...'+"\n"
			time.sleep(0.1)
			if baseTime > 0.9:
				baseTime -= 0.9
			else:
				baseTime += 0.1

		if buffer[12:13] == '0':
			lines = buffer.split("\r\n")
			data = []

			for line in lines:
				nmea = line.split(',')

				if nmea[0] == '$GPGGA':
					if len(nmea) == 15 and nmea[14][0:1] == '*':
						data.append(nmea[9])
				elif nmea[0] == '$GPRMC':
					if len(nmea) == 13 and nmea[12][1:2] == '*':
						data.append(nmea[3])
						data.append(nmea[5])
						data.append(nmea[7])
						data.append(nmea[8])
						data.append(nmea[9])
						data.append(nmea[1])

			args = (data,)
			print "thread start..."
			thread.start_new_thread(putGpsData, args)

def putGpsData(args) :

	global tryCount

	params = {
	    "date" : args[5],
	    "time" : args[6],
	    "latitude" : args[1],
	    "longitude" : args[2],
	    "altitude" : args[0],
	    "speed" : args[3],
	    "heading" : args[4],
	}

	try:
		urllib2.urlopen(url, urllib.urlencode(params))
	except urllib2.HTTPError, e:
		print e

	tryCount = tryCount+1

	print tryCount
	print args
	print "\n"

def connect() :
	global ser, baseTime

	try:
		ser = serial.Serial(serialPort, 38400, bytesize=8, parity='N', stopbits=1, timeout=0.9, xonxoff=0, rtscts=0)
	except serial.SerialException, e:
		print e

	baseTime = time.time() - int(time.time());

	while True:
		temp = getGprmcSentence()
		if temp == "error":
			ser.close()
			return

	ser.close()

while True:
	connect()
	time.sleep(5)
	print "reconnect..."

んで、あとはGPSのデータから読み取ったデータにおいて10秒おきにスレッドでPUTしてやる。

そのPUTもhttpのタイムアウト値が10秒以上超してしまうと、整合性があわなくなるので、httpのタイムアウト値も10秒に設定

以前は、NMEAフォーマットのRMCセンテンスだけしかとってなかったので高度が取得できなかったけど、GGAセンテンスも読み取って高度をゲットや!

最後に、USBやBluetoothが途中に抜かれたり、通信エラーしても復帰できるように例外処理からsleep()かけて5秒後に復帰処理するように

PHPのほうは、Ajaxによる更新時間とGPSデータの更新時間が近すぎるとタイミングによってデータの2重取得や取得逃しが発生するので、GPSデータの更新時間から5秒後に更新する(実際にはサーバ時間で秒数の一桁が5秒のとき・・・サーバ時間が正しいことが前提だけどね)ように初回Ajax更新時間を調節

いろんなところにいって早く試したいなw

千石電商から「プラグ」が届いたヨ

20080727  

以前のサイクリングで壊れた MyBatteryExpert n とXactiを繋ぐためのケーブルを強固なものでつくれないかという考えた結果がこれ。

MyBatteryExpert n の出力ジャックにあうプラグとXactiのDCアダプタにあうプラグが両端にあるケーブルを作っちゃえばいいじゃん。

ということで、千石電商にプラグやケーブルやらを諸々頼んだのが届いていたので、早速つくることにした。

20080727_2

  • MyBatteryExpert n は内径1.3、外形3.4でセンタープラス
  • Xactiは極性統一プラグ#2

    です。

    プラグの加工は上の画像の通り。
    まず、半田付けして、熱収縮チューブで絶縁と引っ張りの強化を図り、ホットボンドで固定と防水をするというやり過ぎも否めない作り方。
    久しく半田ごて握ってなかったけど、たまには工作も楽しいな。

20080727_3

ついでに、12Vの電池とEeePCのDCジャックにあう極性統一プラグ#3を使って、電池でACアダプタの代わりになるかを試してみる。

予想してたことだけど、電流が足りずに充電になったり内部バッテリーになったり、実際には使い物にならない。並列にすればokなのかも。