<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Hirolog</title>
    <link rel="alternate" type="text/html" href="http://blog.hiroaki.jp/" />
    <link rel="self" type="application/atom+xml" href="http://blog.hiroaki.jp/atom.xml" />
    <id>tag:blog.hiroaki.jp,2009-09-30://2</id>
    <updated>2011-01-15T17:45:47Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/" version="5.04">Movable Type Pro</generator>

<entry>
    <title>さくらVPSへ移行しました</title>
    <link rel="alternate" type="text/html" href="http://blog.hiroaki.jp/2011/01/000479.html" />
    <id>tag:blog.hiroaki.jp,2011://2.479</id>

    <published>2011-01-15T17:40:02Z</published>
    <updated>2011-01-15T17:45:47Z</updated>

    <summary>今までウェブサーバを、自前でサーバを立て職場の隅に置かせてもらって動かしていまし...</summary>
    <author>
        <name>Hiroaki</name>
        
    </author>
    
        <category term="Movable Type" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.hiroaki.jp/">
        今までウェブサーバを、自前でサーバを立て職場の隅に置かせてもらって動かしていましたが、肩身が狭いというのと、セキュリティ周りで何かやらかすと他の人にも迷惑がかかる可能性があるので、仕事が一段落したのを機に[さくらVPS](http://vps.sakura.ad.jp/)に移行しました。

ウェブ上でボタン一発でOSがインストールされるなんてなんだか隔世の感です。


ひとまずブログが移行できたのでエントリを立ててみました。
これからはできるだけ頻繁にエントリを更新していこうと思います。

なお、MovableTypeを最新版にしてみましたが、何か変わったのかな...？
        
    </content>
</entry>

<entry>
    <title>S98Player for iPhone 1.0.1 リリースされました</title>
    <link rel="alternate" type="text/html" href="http://blog.hiroaki.jp/2010/10/000478.html" />
    <id>tag:blog.hiroaki.jp,2010://2.478</id>

    <published>2010-10-06T03:32:24Z</published>
    <updated>2010-10-06T03:37:20Z</updated>

    <summary>表題の通り、S98Player for iPhone 1.0.1のリリースです。...</summary>
    <author>
        <name>Hiroaki</name>
        
    </author>
    
        <category term="S98Player" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.hiroaki.jp/">
        表題の通り、S98Player for iPhone 1.0.1のリリースです。今回は審査にちょっと時間がかかった感じです。

内容は主にバグフィックスです。

- フェードアウト中に再生を止めて再び再生を開始すると一曲スキップされてしまう問題
- 一部の曲が再生されずに再生画面のまま固まってしまう問題
- 一部の曲が曲リストに出てきた瞬間にクラッシュしてしまう問題
- 再生時間の計算がまれに誤る問題
- イヤホンが再生中に抜けて自動停止する際に再生ヘッドだけカウントアップし続ける問題

などが修正されています。また、起動直後のスクロールが微妙に早くなっていたりしますが、気づく人はほとんどいないでしょう^^;


上記三番目のバグについては、S98ファイルの途中から再生開始されるように設定しているファイルなどが該当しますので、結構あるかもしれません。

どうぞよろしくお願いします。
        
    </content>
</entry>

<entry>
    <title>RX-8リアルタイム情報をグラフを使ってもっと分かりやすく表示してみる</title>
    <link rel="alternate" type="text/html" href="http://blog.hiroaki.jp/2010/10/000477.html" />
    <id>tag:blog.hiroaki.jp,2010://2.477</id>

    <published>2010-10-02T23:12:45Z</published>
    <updated>2010-10-02T23:15:11Z</updated>

    <summary>【ニコニコ動画】RX-8リアルタイム情報をグラフを使ってもっと分かりやすく表示し...</summary>
    <author>
        <name>Hiroaki</name>
        
    </author>
    
        <category term="Auto" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="CAN" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="OBD" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Technology" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.hiroaki.jp/">
        <![CDATA[<iframe width="312" height="176" src="http://ext.nicovideo.jp/thumb/sm12307062" scrolling="no" style="border:solid 1px #CCC;" frameborder="0"><a href="http://www.nicovideo.jp/watch/sm12307062">【ニコニコ動画】RX-8リアルタイム情報をグラフを使ってもっと分かりやすく表示してみる</a></iframe>

前回の動画でアイドリング時の燃費について動画にしたわけですが、アイドリング時ってことで信号待ちばかりで見ている人には退屈な動画になってしまいました^^;  
そこで、きちんと走っているところを取り出して再編集。

ただ、単に再編集しても楽しくないのでグラフを一緒に載っけることにしました。これで、一瞬で数値が変わってしまうものでもいろいろ比較できます。]]>
        
    </content>
</entry>

<entry>
    <title>RX-8車載動画にリアルタイム燃費情報を表示して懐具合に思いを馳せる</title>
    <link rel="alternate" type="text/html" href="http://blog.hiroaki.jp/2010/09/000476.html" />
    <id>tag:blog.hiroaki.jp,2010://2.476</id>

    <published>2010-09-28T16:54:15Z</published>
    <updated>2011-01-12T02:30:11Z</updated>

    <summary>【ニコニコ動画】RX-8車載動画にリアルタイム燃費情報を表示して懐具合に思いを馳...</summary>
    <author>
        <name>Hiroaki</name>
        
    </author>
    
        <category term="Auto" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="CAN" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="OBD" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Quartz Composer" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.hiroaki.jp/">
        <![CDATA[<iframe width="312" height="176" src="http://ext.nicovideo.jp/thumb/sm12263944" scrolling="no" style="border:solid 1px #CCC;" frameborder="0"><a href="http://www.nicovideo.jp/watch/sm12263944">【ニコニコ動画】RX-8車載動画にリアルタイム燃費情報を表示して懐具合に思いを馳せる</a></iframe>

というわけで、今度はRX-8の燃料消費状況をモニターして、リアルタイムの燃費情報を車載動画に重ね合わせてみました。

吹かしたときに燃料を消費するのは体感的にも理解できるのですが、信号待ちなどアイドリング時にこれほどまでに燃料を使うのかと驚きました。百聞は一見にしかず、ですね。]]>
        
    </content>
</entry>

<entry>
    <title>mixiチェックをMovableTypeで導入してみる</title>
    <link rel="alternate" type="text/html" href="http://blog.hiroaki.jp/2010/09/000475.html" />
    <id>tag:blog.hiroaki.jp,2010://2.475</id>

    <published>2010-09-10T11:00:00Z</published>
    <updated>2010-09-11T06:01:43Z</updated>

    <summary>mixi meetup 2010にて先日公開されたmixiチェックが一般ユーザに...</summary>
    <author>
        <name>Hiroaki</name>
        
    </author>
    
        <category term="Movable Type" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Technology" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.hiroaki.jp/">
        mixi meetup 2010にて先日公開されたmixiチェックが一般ユーザにも公開されると発表されました。（[TechCrunchの記事など](http://jp.techcrunch.com/archives/jp-20100910-mixi-meetup-2010-finally-mixi-open-their-traffic-to-the-world-mixi-will-be-a-social-graph-provider/)）

そんなわけで、ネットの片隅の当ブログにも設置してみました。
設置はそれほど難しくありません。mixi Developer Centerにある[mixiチェックの技術仕様](http://developer.mixi.co.jp/connect/mixi_plugin/mixi_check/spec_mixi_check)に沿ってテンプレートを書き換えればOKです。

...と思ったら、[MT5用には既にプラグインが配布されてる](http://communities.movabletype.jp/plugins/2010/09/mixicheck.html)のね（うちはいまんとこまだMT4）。まぁ、MT5の人はそれを使ってください^^;  
こんなプラグインじゃ小回り効かないぜ、...なんていう方はこのエントリを参考にしてみてください。


そうそう、[サービス管理](http://developer.mixi.co.jp/connect/mixi_plugin/mixi_check/mixicheck)のページを参考に、サービスの登録と認証キー（チェックキー）の取得を忘れずに。

具体的な内容は続きに。
        <![CDATA[よくできてると思ったのは、mixiチェックボタンを埋め込むタグに、毎回タイトルや本文を埋め込まなくてもいいということです。

ブログだと、個別エントリ以外にもインデックスページなどがあり、そこにもボタンを埋め込みたいと思うことがあります。そんなときに手っ取り早いのは、ボタンと一緒にタイトルやら本文などを埋め込むことでしょう。  
 mixiチェックの場合はそういうことはせず、ボタンには該当エントリのURLを埋め込みます。そうするとmixiチェック側で該当エントリのHTMLを読み込み、その中に埋め込まれたタイトルと本文を抽出する、という仕組みになっているようです。

ですので、該当エントリ内にはタイトルと本文を指定する必要があります。  
テンプレートにもよりますが、MovableTypeではおおむね

<pre><code>&lt;meta name="description" content="&lt;$MTEntryExcerpt remove_html="1" ltrim="1"$&gt;" /&gt;
</code></pre>

といった感じで概要が埋め込まれており、何も指定しなければこれがそのまま使われるようです。タイトルに関しても、何も指定しなければ&lt;title&gt;タグ内が使われます。


&lt;$MTEntryExcerpt$&gt;は、エントリに概要を記載していない場合本文から一部分をとってくるのですが、それがどうやら40文字程度で、mixiチェック用としては少々短いように感じたため、自分は以下のタグに変えました。

<pre><code>&lt;meta name="description" content="&lt;$MTEntryBody remove_html="1" words="N"$&gt;" /&gt;
</code></pre>

words="N"のNの部分には文字数を入れます。


また、もしタイトル部分を変えたいならば、&lt;$MTEntryTitle$&gt;を使えばタイトルが拾えるので、&lt;head&gt;内に

<pre><code>&lt;meta property="og:title" content="「&lt;$MTEntryTitle$&gt;」" />
</code></pre>

などとして上書きすることができます（上記はタイトルの前後に「」をつけた例）。

ひとつ前のエントリでmixiチェックを試してみたところ（ボタンを押しただけでsubmitまではしてない）、エントリに埋め込まれたイメージも自動的に読み取るようで、なかなか良く出来ている印象です。  
あとは何人がそのチェックにコメントしたかが分かるようになればさらに良いように思います。]]>
    </content>
</entry>

<entry>
    <title>S98Player for iPhone 1.0 リリースされました</title>
    <link rel="alternate" type="text/html" href="http://blog.hiroaki.jp/2010/09/000474.html" />
    <id>tag:blog.hiroaki.jp,2010://2.474</id>

    <published>2010-09-01T05:00:36Z</published>
    <updated>2010-09-01T05:26:52Z</updated>

    <summary> S98Player for iPhone 1.0がAppStoreからダウンロ...</summary>
    <author>
        <name>Hiroaki</name>
        
    </author>
    
        <category term="Programming" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="S98Player" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.hiroaki.jp/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="s98icon.png" src="http://blog.hiroaki.jp/images/s98icon.png" width="191" height="184" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span>

S98Player for iPhone 1.0がAppStoreからダウンロード出来るようになりました。
ご興味のある方は、[こちらのリンク](http://itunes.apple.com/jp/app/s98player-for-iphone/id388838337?mt=8)よりAppStoreへどうぞ。

詳細はAppStoreのほうに記載してあります。
また、[前回のエントリ](http://blog.hiroaki.jp/2010/08/000473.html)にもMac版と比べての改善点などが記載されておりますので、よろしければご覧ください。

当初のAppStoreでのレビュー期間を知る、という目標は達成です（笑　結果としては、

- 8/25未明にバイナリをアップロード
- 8/28未明にステータスがIn Reviewに
- 9/1未明にステータスがProcessing for App Store、Ready for Saleに

といった感じでした。

レビューにはS98ファイルが必要と思い、いくつかサーバに上げておいたのですが、レビュアーさんからとおぼしきファイルアクセスがあってから3分後にはステータスがProcessing for App Storeに変わっていました（笑]]>
        AppStoreに申請に出す前にそこそこ長い期間プライベートで使っていたのでそこまでバグはでないと思っていましたが、審査中にすでにいくつか見つけてしまいました...。

- ヘッドホンで視聴中にヘッドホンを（誤って）抜いた場合に音声が停止するが、画面内の再生時間がカウントアップし続けてしまう。
- ホームボタン二回押し＋左画面にスワイプでiPod controlが現れるが、何かの拍子にそのcontrolが見えなくなる（標準のiPod用になってしまう）ことがある。
- OPM用のS98ファイルに再生できないものがある（のだけど、OPMの仕様など分からないためなんとも...）

あとは、一番最初に立ち上げる時に、スプラッシュスクリーンで止まってしまうことがあるそうです（自分は未確認）。しばらく待っても立ち上がらないときには、一度アプリを終了させてから再度立ち上げてみてください。


最近はS98ファイルも巷で見なくなっていますので、再生できないファイルがあってもうまく対応できないことがあるかもしれません。差し支えない場合にはそのファイルをお渡し頂ければ原因がわかるかもしれません。どうぞよろしくお願いします。

もう少し様子を見てから（その他のバグと、そしてダウンロード数と^^;）、バグフィックス版をリリースしようと思います。
    </content>
</entry>

<entry>
    <title>S98Player for iPhoneを申請してみた</title>
    <link rel="alternate" type="text/html" href="http://blog.hiroaki.jp/2010/08/000473.html" />
    <id>tag:blog.hiroaki.jp,2010://2.473</id>

    <published>2010-08-25T03:18:25Z</published>
    <updated>2010-08-25T03:32:25Z</updated>

    <summary> S98Playerのダウンロード数から見ても明らかに需要があるとは思えないiP...</summary>
    <author>
        <name>Hiroaki</name>
        
    </author>
    
        <category term="MIDI" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Mac" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="S98Player" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.hiroaki.jp/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.hiroaki.jp/assets_c/2010/08/スクリーンショット（2010-08-25 12.16.59）-37.html" onclick="window.open('http://blog.hiroaki.jp/assets_c/2010/08/スクリーンショット（2010-08-25 12.16.59）-37.html','popup','width=478,height=264,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.hiroaki.jp/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%EF%BC%882010-08-25%2012.16.59%EF%BC%89.png" width="478" height="264" /></a></span>

S98Playerのダウンロード数から見ても明らかに需要があるとは思えないiPhone版のS98Playerですが、思うところあってAppStoreへ申請しました。

現在ステータスがWaiting for Reviewの段階です。
上のスクリーンショットでは21日に申請となっていますが、その後バグが見つかって自分で再投稿したりしていることもあり、まだ審査は始まっていません。]]>
        Mac版と比べて、

- ファイルリストに曲名や演奏時間などが出る
- イコライザが使える
- ループ再生が終了する際にきちんとフェードアウトする
- OPMも対応している
- 複数音源を使うデータにも対応している（パン振りは対応してない）

などの点から高機能です（誰も使わないだろうけど）。バックグラウンド再生にも当然ですが対応しています。

また、内部の構造を見なおして無駄をだいぶ省いたので、使用するメモリ量も減りました。


まぁS98ファイルなんて既に巷には出回っていませんから、「S98ナニソレ？」な人には今のところ全く恩恵はないと思います。
ただ、時間に余裕ができたら（来年あたり...？）iPad向けにFM音源用のシーケンサを作ろうと思っています。その保存データをS98ファイルに書き出せれば、S98Playerも多少日の目をみることもあるかな、と。

せっかく[ciscさんのfmgen](http://www.retropc.net/cisc/m88/)がiPhoneでも動くのだから、活用していろいろやってみたいところです。
    </content>
</entry>

<entry>
    <title>S98Player Ver. 0.2を作った</title>
    <link rel="alternate" type="text/html" href="http://blog.hiroaki.jp/2010/05/000472.html" />
    <id>tag:blog.hiroaki.jp,2010://2.472</id>

    <published>2010-05-15T10:00:00Z</published>
    <updated>2010-08-21T16:39:11Z</updated>

    <summary>4年ほど前にFM音源のサウンドログを再生するアプリを作ったのですが，最近FM音源...</summary>
    <author>
        <name>Hiroaki</name>
        
    </author>
    
        <category term="Mac" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Programming" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="S98Player" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.hiroaki.jp/">
        4年ほど前にFM音源の[サウンドログを再生するアプリを作った](http://blog.hiroaki.jp/2006/01/000330.html)のですが，最近FM音源づいていてちょっとだけコードを修正したので公開します．機能は全く変わっておらず，使い勝手も悪いままですが．

...そして誰も使わないとは思いますが．

アプリはこちらからどうぞ→[S98Player0.2.zip](http://blog.hiroaki.jp/misc/S98Player0.2.zip)


修正点は以下の通り．

- サンプリング周波数を44100Hzから55466Hzに変更．原音に近くなりました．
- S98v3のヘッダをもう少しきちんと読むように．UTF8，SJIS両方読めます．
- しかし基本的にOPNAのみの対応...．
- 10.5SDK上でコンパイルしたので10.5以降でしか動かないかも．

OPNへの対応は，サウンドログファイルをもってないのでチェックできないんですよね．ま，基本的に自分用アプリなので問題ないんですけどね（無駄にiPhone向けに移植して一人楽しんでます）．
        
    </content>
</entry>

<entry>
    <title>続・FM音源の仕組みを視覚的に理解する</title>
    <link rel="alternate" type="text/html" href="http://blog.hiroaki.jp/2010/05/000471.html" />
    <id>tag:blog.hiroaki.jp,2010://2.471</id>

    <published>2010-05-06T19:00:00Z</published>
    <updated>2010-05-16T08:24:44Z</updated>

    <summary> 前回のエントリで簡単なFM音源もどきを作ったわけですが、どうも物足りなく感じた...</summary>
    <author>
        <name>Hiroaki</name>
        
    </author>
    
        <category term="MIDI" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Mac" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Programming" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Technology" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.hiroaki.jp/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.hiroaki.jp/assets_c/2010/05/MacFM_Parallel-34.html" onclick="window.open('http://blog.hiroaki.jp/assets_c/2010/05/MacFM_Parallel-34.html','popup','width=1304,height=902,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.hiroaki.jp/assets_c/2010/05/MacFM_Parallel-thumb-640x442-34.png" width="640" height="442" alt="MacFM_Parallel2.png" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></span>
[前回のエントリ](http://blog.hiroaki.jp/2010/05/000470.html)で簡単なFM音源もどきを作ったわけですが、どうも物足りなく感じたため（というか、なんとなく達成感がないというか...）、並列接続も可能な4オペレータ版を作成しました。

そして、オペレータ接続アルゴリズムも8種類から選べるようにしました。


単音しかなりませんが、機能的には、往年のYM-2203音源などと同じ程度のパラメータをいじれます（多少少ないんですが）。]]>
        <![CDATA[## FM音源って？

という方は、是非[前エントリ](http://blog.hiroaki.jp/2010/05/000470.html)をご一読ください。

## ダウンロード

アプリケーション： [MacFM2_app.zip](http://blog.hiroaki.jp/misc/MacFM2_app.zip)

ソース： [MacFM2_source.zip](http://blog.hiroaki.jp/misc/MacFM2_source.zip)

となります。


## 使い方

まぁ、大したことができないのは相変わらずですが...。

右下のプルダウンメニューでアルゴリズムが選べますので、それを選ぶと各オペレータの接続アルゴリズムが変わります。用意した接続アルゴリズムは8種類で、これはYAMAHAのOPN系音源に準じています。

接続アルゴリズムを選ぶと、プルダウンメニューの下に接続の模式図が現れますので、雰囲気はつかめるはずです。


## 感想

単純な直列だけだと「ふーん」ってな感じでしたが、並列もできるようになるとかなり音が「それっぽい」感じになりました。

最終の出力の手前部分が並列になっているもの（Algorithm 4など）は特に、直列では聞けなかった音が合成されますので、楽しいです。


## まとめ
<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=hirolog-22&o=9&p=8&l=as1&m=amazon&f=ifr&md=1X69VDGQCMF7Z30FM082&asins=4797355158" style="width:120px;height:240px;float:right;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
相変わらず実用性皆無のアプリではありますが、往年のYAMAHA製FM音源であるOPN系音源における音色作成くらいは追体験できるのではないかと思います。

気に入った方がいたら、是非アフィリエイトサイトで本でも買ってやってください（笑）]]>
    </content>
</entry>

<entry>
    <title>FM音源の仕組みを視覚的に理解する</title>
    <link rel="alternate" type="text/html" href="http://blog.hiroaki.jp/2010/05/000470.html" />
    <id>tag:blog.hiroaki.jp,2010://2.470</id>

    <published>2010-05-05T16:20:00Z</published>
    <updated>2010-05-12T18:43:06Z</updated>

    <summary> FM音源って知ってますか？ 今じゃ表立って耳にする機会も少ないですが、つい最近...</summary>
    <author>
        <name>Hiroaki</name>
        
    </author>
    
        <category term="MIDI" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Mac" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Programming" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Technology" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.hiroaki.jp/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.hiroaki.jp/assets_c/2010/05/sin-28.html" onclick="window.open('http://blog.hiroaki.jp/assets_c/2010/05/sin-28.html','popup','width=956,height=923,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.hiroaki.jp/assets_c/2010/05/sin-thumb-640x617-28.jpg" width="640" height="617" alt="MacFM" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></span>

FM音源って知ってますか？
今じゃ表立って耳にする機会も少ないですが、つい最近まで携帯電話の着メロなんかはこのFM音源を使ってました。

「機械っぽい音」なんていわれるとまぁその通りではあるんですが、往年の[NEC製PC](http://ja.wikipedia.org/wiki/PC-9800シリーズ)などで使われていたこともあり、独特な音にファンも少なからずいたりします。


このFM音源、「FM (Frequency Modulation)」と名のつく通り「周波数変調」を利用して音を作っているのですが、これがイマイチよく分かりません。いや、[Wikipediaの当該ページ](http://ja.wikipedia.org/wiki/FM音源)を見ると波形を導き出す式も載っていますし、それはそれで分かるんですが、その式をいくら見たところで「どんな音がするか」がよく分からない...。

様々なサイトで「周波数変調は、扇風機の前で声を出すと*あ"あ"あ"あ"あ"〜〜〜*と音が変わるのと同じ原理です」なんて説明されていたりするのですが、この説明は*周波数変調がわかっている人にしか理解できない*ものだと思うのです。


...というわけで、式を見ても分からないなら手を動かせ、ということで、単純なFM音源を鳴らすプログラムを組んでみました。
各オペレータの波形をリアルタイムに表示させて、パラメータをいじるとどのように波形が変わるのかが分かるようにしてみました。]]>
        <![CDATA[## とりあえずお披露目

Cocoaアプリを作りました。何も考えずに作ったのですが、もしかしたらSnow Leopardでしか動かないかもしれません。
ソースも置いておきます。他人に見せるために書いてないので汚くてコメントないですが...。

アプリ： [MacFM_app.zip](http://blog.hiroaki.jp/misc/MacFM_app.zip)

ソース： [MacFM_source.zip](http://blog.hiroaki.jp/misc/MacFM_source.zip)

ま、適当にいじってみてください。大したことはできませんが...。
頭では原理がわかっていても、パラメータをいじると実際に波形が変わるので、見てるだけで（個人的には）楽しいです。
また、パラメータだけだと想像つかなかった音色も、波形を見ればだいぶ想像しやすくなる気がします。


## FM音源のキホン

[Wikipediaの説明](http://ja.wikipedia.org/wiki/FM音源)を読むと、FM音源の基本は*周波数を変調すること*だそうですが、どう変調するか、そこがキモのようです。
昔の数学やら物理やらの授業の記憶を掘り返し、頑張って[正弦波](http://ja.wikipedia.org/wiki/正弦波)（sin波）の基本公式を思い出してください（笑）
> y = A sin (2 π f t + φ)

ってやつですね（Aは振幅、fが周波数、φが初期位相、tが時間）。

この中でA, f, φが一定であれば普通の正弦波になるわけですが（tだけ時間に合わせて値が変わる）、FM音源は、ここのφの部分も時間に応じて変化させて複雑な音を作り出します。


## φをどうやって時間変化させるか

基本的なFM音源の場合、φを、さらに別の正弦波を使って時間変化させます。
これが、キャリアとモジュレータの関係みたいですね。キャリアがメインとなる正弦波を作るオシレータ、モジュレータがキャリアのφを時間変化させるオシレータです。

キャリアとモジュレータの周波数は同じでなくても構いません。
ただ、モジュレータの周波数がキャリアの周波数の整数倍でないと、音がキャリア周波数の高さに聴こえません。
これは、整数倍でないときに
> y = A sin (2 π f t + φ)

のsinの中身が、キャリアの1周期ごとに0にならなくなってしまうからです（ちょっと計算してみるとわかります）。


## エンベロープジェネレータを使ってさらに変化させる

エンベロープジェネレータの説明は[Wikipedia](http://ja.wikipedia.org/wiki/ADSR)などを読んでいただくとして。
楽器から音が出始めてから終わるまで、音量は一定ではありません。オルガンなどは鍵盤を押した瞬間に最大音量となり、離すと音がプツリと消えますが、ピアノであれば鍵盤を話しても弦が揺れて少しのあいだ音が鳴り続けますし、バイオリンなどは音の出始めがゆっくりです。

FM音源の場合、キャリアに対してエンベロープ変化をつけると、上記のように「オルガンっぽい音の出だし」から「バイオリンっぽい音の出だし」といったように音量を変化させることができます。

しかしさらに複雑なことに、モジュレータの出力に対してもエンベロープジェネレータを使って変化させることができます。
これによって、キャリアから出力される波形が*最初は普通の正弦波なんだけどだんだんφが大きくなって違う音*になります。つまり、エンベロープジェネレータをモジュレータの出力にかけることによって、音量だけでなく音色まで変化させることができるようになるわけです。


##どうやってコーディングしてるか

FM音源のオペレータは、構造体で以下のように定義されています。
<pre><code>struct _FMInfo{
	double isFB;
	int isEnabled;
	
	double carrierFreq;
	double freqIndex;
	double modIndex;
	
	double attack;
	double decay;
	double sustain;
	double release;
	
	int numOfParents;
	FMInfo** parents;
};</code></pre>

そして、ある時間の波形の高さは、以下の関数で計算しています。ほんとに、上記の公式を愚直に計算してます（笑

<pre><code>double fmGetValue(FMInfo* fm, double sec){
	
	double parentPhase = 0.0;
	
	for (int i = 0; i < fm->numOfParents; i++){
		parentPhase += fmGetValue(fm->parents[i], sec);
	}
	
	if (fm->isFB > 0){
		double value = 0.0;
		double beta = M_PI * fm->isFB / 8.0;
		
		for (int i = 0; i < 20; i++){
			value = sin(2.0 * M_PI * (fm->carrierFreq * fm->freqIndex) * sec + beta * value);
		}
		
		return fm->modIndex * value * fmGetPower(fm, sec);
		
	}
	
	return fm->modIndex * sin(2 * M_PI * (fm->carrierFreq * fm->freqIndex) * sec + parentPhase) * fmGetPower(fm, sec);
}</code></pre>

fmGetPowerという関数はエンベロープジェネレータでの高さを計算する部分です。
今回は、「鍵盤を離した」部分は「音が鳴り始めたら4秒」と決め打ちにしているので、以下のようなコードになっています。

<pre><code>double fmGetPower(FMInfo* fm, double sec){
	
	double power = 1.0;
	
	if (sec < fm->attack){
		power = sec / fm->attack;
	}else if (sec < fm->decay + fm->attack) {
		double t = sec - fm->attack;
		double w = (1.0 - fm->sustain) * t / fm->decay;
		
		power = 1.0 - w;
	}else if( sec < 4){
		power = fm->sustain;
	}else if (sec > 4 && sec < (4 + fm->release)) {
		double t = sec - 4.0;
		power = fm->sustain * (1.0 - t / fm->release);
		
	}else if (sec >  + fm->release){
		power = 0;
	}

	return power;
}</code></pre>

興味のある方はソース中にあるOperator.hおよびOperator.cをご覧下さい。綺麗ではありませんが、どうなっているかは理解できるのではないかと思います。


## オペレータの並列接続

今回のアプリは、キャリアとモジュレータ2つの3オペレータを直列につないだものしか音が出せないのですが、実際には並列接続のものもあります。
並列接続は、いわゆる波形の合成です。周波数をいじるのではなくて、単純に足し算ですね。

上記のコードを読んだ方はお気づきかもしれませんが、コード内では既に並列接続の計算もできるようになっています。ただアプリのUIが複雑になるため、今回はパスしました。暇があったら作るかもしれません。...作らないかもしれません。


## まとめ

FM音源の原理はわかっていてもイマイチどういう音が出てくるのか想像できなかったため、簡単なFM音源もどきを実際に作りました。
パラメータをいじって音色を確かめられるだけではなく、波形がリアルタイムに変わることで、パラメータを意図して変化させることも容易になるかもしれません。

今回のアプリではオペレータの並列接続はサポートしていませんが、いつか暇ができたら（そして興味がつづいていたら）実装するかもしれません。
AudioUnitで動く音源を作るのも面白そうですが、そこまでできるかなー。


## 蛇足

<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=hirolog-22&o=9&p=8&l=as1&m=amazon&f=ifr&md=1X69VDGQCMF7Z30FM082&asins=4797355158" style="width:120px;height:240px;float:right;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
エントリと直接関係ありませんが、右にある本はiPhoneでCoreAudioをいじくるにはとても良い本です。少々値段が高いのですが、iPhone / iPad / iPod touchで音楽をいじるにはこの本は必須だと思います。どうもCoreAudio系はAppleの技術文書が少ないイメージがあり、このように系統だって（それも日本語で！）まとめられた本があるのは助かります。

実はこの本の中にシンプルなFM音源ドラムマシンの実装があり、最初はこれを参考にiPadアプリを作ろうとしていました（オペレータ間の接続をタッチで行ったりできると楽しいなぁ、と）。

ただiPadよりもまずは慣れたMacでやろうということで、ひとまず上記のアプリになりました。また、波形生成のアルゴリズム部分に関しても、オペレータの並列・直列やフィードバックなどを盛り込んだため、異なった実装になっています。


## 補足
[次のエントリ](http://blog.hiroaki.jp/2010/05/000471.html)に4オペレータ版で並列配置も可能なものを公開しました。よろしければご覧になってください。
]]>
    </content>
</entry>

<entry>
    <title>On-vehicle movie overlaying vehicle information using CANUSB</title>
    <link rel="alternate" type="text/html" href="http://blog.hiroaki.jp/2010/04/000469.html" />
    <id>tag:blog.hiroaki.jp,2010://2.469</id>

    <published>2010-04-04T13:00:00Z</published>
    <updated>2011-01-12T02:31:06Z</updated>

    <summary> I overlaid various vehicle information ...</summary>
    <author>
        <name>Hiroaki</name>
        
    </author>
    
        <category term="Auto" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="CAN" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="OBD" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Programming" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Quartz Composer" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.hiroaki.jp/">
        <![CDATA[<object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/1P50xbqpcZQ&hl=ja_JP&fs=1&rel=0&color1=0x3a3a3a&color2=0x999999"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/1P50xbqpcZQ&hl=ja_JP&fs=1&rel=0&color1=0x3a3a3a&color2=0x999999" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object>

I overlaid various vehicle information (i.e. speed, rpm, and so on) extracted by [CANUSB](http://www.canusb.com/) on my on-vehicle movie.]]>
        ##HS-CAN Data

At first, I tried to use information posted by [Madox.NET](http://www.madox.net/blog/projects/mazda-can-bus/), but unfortunately HS-CAN Data extracted by my RX-8 look totally different from Madox&apos;s one.

I&apos;m not sure why there are big differences. But one possible reason is that Madox&apos;s RX-8 is AT. My RX-8 is 2007 5MT model.

- RPM: ID 0x201, (data[0] * 256 + data[1]) / 4
- Vehicle Speed(km/h): ID 0x201, (data[4] * 256 + data[5] - 10000) / 100
- Accel Throttle Position(0 - 255): ID 0x201, data[6]
- Hand Brake(on/off): ID 0x212, (data[4] &amp; 0x40)
- Foot Brake(on/off): ID 0x212, (data[5] &amp; 0x08)
- Declutching(on/off): ID 0x231, (data[0] &amp; 0xf0)
- Engine Coolant Temp(degree celsius): ID 0x240, data[3] - 40
- Intake Air Temp(degree celsius): ID 0x250, data[3] - 40

Here is what I analyzed.

I want to extract some more information such as steering column angle, but I haven&apos;t yet.


##Overlaying

I used Apple&apos;s [Quartz Composer](http://developer.apple.com/mac/library/documentation/GraphicsImaging/Conceptual/QuartzComposer/qc_intro/qc_intro.html) for overlaying information.
    </content>
</entry>

<entry>
    <title>CAN + Quartz Composer + 車載動画 = PS4動画?</title>
    <link rel="alternate" type="text/html" href="http://blog.hiroaki.jp/2010/04/000468.html" />
    <id>tag:blog.hiroaki.jp,2010://2.468</id>

    <published>2010-04-02T05:45:00Z</published>
    <updated>2011-01-12T02:32:05Z</updated>

    <summary>【ニコニコ動画】RX-8 CANデータと車載動画を組み合わせてPS4的動画を作る...</summary>
    <author>
        <name>Hiroaki</name>
        
    </author>
    
        <category term="Auto" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="CAN" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Mac" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="OBD" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Programming" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Quartz Composer" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.hiroaki.jp/">
        <![CDATA[<iframe width="312" height="176" src="http://ext.nicovideo.jp/thumb/sm10248572" scrolling="no" style="border:solid 1px #CCC;" frameborder="0"><a href="http://www.nicovideo.jp/watch/sm10248572">【ニコニコ動画】RX-8 CANデータと車載動画を組み合わせてPS4的動画を作る</a></iframe>

CANデータを使った動画、もう少し派手めに...ということで、作ってみました。
といっても、CANのデータからいちいち速度などの情報を手で入力していては日がくれてしまうので、それらを自動でレンダリングする術を考えなければなりません。


今回は、Quartz Composerのカスタムパッチを作ることでCANログをQuartz Composerに取り込むことにしました。]]>
        ##Quartz Composer?
[Quartz Composer](http://developer.apple.com/mac/library/documentation/GraphicsImaging/Conceptual/QuartzComposer/qc_intro/qc_intro.html)は、いわゆるビジュアルプログラミング環境です。Mac OS Xの開発環境（無料）に同梱されています。

これを使うと簡単にモーショングラフィクスを作成できるのですが、当然のことながらCANデータログを読み込んでくれるようなパッチはありませんので、それを自作することにしました。

昔はカスタムパッチの作成手順は公開されていなかったので面倒でしたが、今はオフィシャルの情報をたどると簡単に作ることができます。
Objective-C 2.0のプロパティなどを使うことで、パッチのポートの宣言なども煩雑にならずにできるようになりました。

##Quartz Composerのオフラインレンダリング
QuickTime 7の時代には、QuickTime PlayerをPro版にするとQuartz Composerのパッチを動画として書きだすことができました。
Mac OS X 10.6になってQuickTimeはQuickTime Xに刷新されましたが、一応オプションでQuickTime 7をインストールすることができます。

最初はこれでなんとかなるかと思っていたのですが、どうやらカスタムパッチを含むコンポジションの場合は、セキュリティなどの問題でQuartz Composer以外では無効にされてしまうようです。

Appleのデベロッパ向けのサイトに[Quartz Composer Offline Rendering](http://developer.apple.com/mac/library/samplecode/QuartzComposerOffline/index.html)というサンプルコード（最初の10フレームを書き出す）があるのですが、どうもコードが古いせいか、きちんと静止画を書きだすことができませんでした。色味などがおかしい...。

しかし、Leopard時代から書き出し関係で新しいメソッドが用意されており、そちらに書き換えるとうまく静止画を書き出すことができました。それらを30fpsで全フレームをレンダリングし、最後にフレームをまとめて動画にする、というようにプログラムを書き換えました。

このOffline Renderingに関してはそこそこ需要があるような気がするので（そもそもQuickTime 7を入れたくないですし、Proにするのが無料じゃないですし）、次のエントリでまとめて説明、配布しようと思います。


##まとめ
CANデータを車載動画にかぶせるようなものを作るため、Quartz Composerのカスタムパッチを作成してレンダリングしてみました。

今回の動画は、ビデオカメラで撮影した動画を運転終了後にCANのログと重ねあわせましたが、USB接続のWebカメラなどを使えばリアルタイムレンダリングも可能だと思います。

これで生放送とかしても面白そうですね。
    </content>
</entry>

<entry>
    <title>CANデータを見るプログラムを動画にしてみた</title>
    <link rel="alternate" type="text/html" href="http://blog.hiroaki.jp/2010/03/000467.html" />
    <id>tag:blog.hiroaki.jp,2010://2.467</id>

    <published>2010-03-25T08:15:00Z</published>
    <updated>2010-03-25T08:12:40Z</updated>

    <summary>【ニコニコ動画】走行中のRX-8車内コンピュータデータを読み取ってみる 先般のエ...</summary>
    <author>
        <name>Hiroaki</name>
        
    </author>
    
        <category term="Auto" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="CAN" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Programming" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Technology" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.hiroaki.jp/">
        <![CDATA[<iframe width="312" height="176" src="http://ext.nicovideo.jp/thumb/sm10150763" scrolling="no" style="border:solid 1px #CCC;" frameborder="0"><a href="http://www.nicovideo.jp/watch/sm10150763">【ニコニコ動画】走行中のRX-8車内コンピュータデータを読み取ってみる</a></iframe>

[先般のエントリ](http://blog.hiroaki.jp/2010/02/000463.html)にてRX-8のCANデータをグラフにしてみましたが、リアルタイム情報を車載動画にピクチャインピクチャとして重ね合わせた動画をつくり、ニコニコ動画にアップロードしました。

今までは見る専門だったので、どの程度の方に見て頂けるかはまったく未知数でしたが、一日経たない間に300人以上の方に見て頂けたようで。
人気動画とは比べものになりませんが、場末のブログにひっそり置いておくよりはよっぽど見て頂けるので嬉しいです。

次はもう少し派手目に作ります。]]>
        
    </content>
</entry>

<entry>
    <title>iPhoneのSafariを使って走行中の道路名をtweetしてみた</title>
    <link rel="alternate" type="text/html" href="http://blog.hiroaki.jp/2010/03/000466.html" />
    <id>tag:blog.hiroaki.jp,2010://2.466</id>

    <published>2010-03-17T10:05:00Z</published>
    <updated>2010-03-17T10:03:57Z</updated>

    <summary> というわけで、サーバに展開した国交省のデータを使って、実際にTwitterでつ...</summary>
    <author>
        <name>Hiroaki</name>
        
    </author>
    
        <category term="Auto" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Device" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="OBD" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Programming" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Technology" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.hiroaki.jp/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.hiroaki.jp/assets_c/2010/03/roadName_tweet-25.html" onclick="window.open('http://blog.hiroaki.jp/assets_c/2010/03/roadName_tweet-25.html','popup','width=650,height=493,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.hiroaki.jp/assets_c/2010/03/roadName_tweet-thumb-640x485-25.png" width="640" height="360" alt="roadName_tweet.png" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></span>

というわけで、サーバに展開した国交省のデータを使って、実際にTwitterでつぶやくようなアプリを作ってみました。

といっても、専用アプリを書くのは面倒なので、ひとまずはiPhoneのSafariからGPS情報をサーバに送りつぶやくようにしてみました。]]>
        <![CDATA[## 仕組み
iPhoneのSafariは、JavaScriptを利用して現在位置を取得するGeolocation APIに準拠しています。そこで、定期的にiPhoneから現在位置をサーバに投げてやり、サーバ側で道路名を解析してTwitterにツイートさせてやるような仕組みを作りました。
iPhoneのSafariでGPS情報を扱う方法は、[Ascii.jpのiPhoneのGPSをJavaScriptで操ろう](http://ascii.jp/elem/000/000/433/433470/)という記事が参考になります。

...というか、今回やったことはこの[6ページ目](http://ascii.jp/elem/000/000/433/433470/index-6.html)にあるサンプル03をちょいといじっただけです。

ここのソースコードにupdate関数があり、位置情報が更新された際に呼び出されます。結構これは頻繁に呼び出されるので、たとえば10分おきにサーバに情報を伝えたい、なんてときには、update関数の最後あたりに

<pre>
var now = new Date();
if ((now.getTime() - before.getTime() ) > (1000 * 60 * 10)){
    before = new Date();
    updateStatus();
}
</pre>

こんなのを埋め込んで、10分おきにupdateStatus関数が呼ばれるようにすれば良いです。


そして、updateStatus関数内では、lat変数とlng変数を利用してサーバ側にデータを渡してやります。ここではXMLHttpRequestを使います。たとえばこんな感じに。

<pre>
var url = "http://your_site.com/rest.jsp?lat=" + lat + "&lng=" + lng;
var myRequest = new XMLHttpRequest();
myRequest.open("GET", url);
myRequest.onreadystatechange = function(){ 
    //readyState値は4で受信完了
    if (httpoj.readyState==4){ 
        getServerResponse(httpoj)
    }
}
myRequest.send(null);
</pre>

そしてまぁ、urlからの返答如何によっては再送したりなんなりをgetServerResponse内で実装してやれば良いです。

サーバ側では、前回までに作ったDBで[Hibernate](https://www.hibernate.org/)を利用しつつ道路名を割り出し、[Twitter4J](http://twitter4j.org/)を使ってツイートをしています。


## できばえ
まず大学まで、いつもとは全然違う道をとおって走ってみましたが、うまくいきませんでした。これは単純に道路名割り出しルーチン内で、しきい値がやたらシビアだったためでした。

そのため大学でちょっとプログラムを書き直し、またいつもとは全然違う道を走って動作確認をしたところ、そこそこうまくいっているようです（それが上の図）。
ただまぁ、例によって15年前のデータなので「浦和東村山線」なんて道路名が出てきたりしてますが、現在は「さいたま東村山線」だったりするようです。

最新のデータについては、先日国交省にもらえないのかメールしてみました。担当者に確認の後返事を頂けるようですが、どうも「公開していない理由」を担当者に確認するみたいな雰囲気なので、あまり期待せずに待っています^^;

## まとめ
常にツイートし続けるのはどうかと思いますが、どっか遠出するときとかはおもしろいかもしれません。そこそこうまくツイートできてるっぽいですし。
今は一定間隔でツイートしてますが、道路が変わったらツイートする、なんてのも面白いかもしれませんね。]]>
    </content>
</entry>

<entry>
    <title>せっかくなので道路をGoogleMaps上にプロットする</title>
    <link rel="alternate" type="text/html" href="http://blog.hiroaki.jp/2010/03/000465.html" />
    <id>tag:blog.hiroaki.jp,2010://2.465</id>

    <published>2010-03-13T19:03:04Z</published>
    <updated>2010-03-13T20:09:24Z</updated>

    <summary> 前回のエントリで記したとおり、自分が道路上にいるかどうかを調べるためには、そも...</summary>
    <author>
        <name>Hiroaki</name>
        
    </author>
    
        <category term="Auto" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Programming" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.hiroaki.jp/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.hiroaki.jp/assets_c/2010/03/road_plot-22.html" onclick="window.open('http://blog.hiroaki.jp/assets_c/2010/03/road_plot-22.html','popup','width=1074,height=747,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.hiroaki.jp/assets_c/2010/03/road_plot-thumb-640x445-22.png" width="640" height="445" alt="road_plot.png" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></a></span>

[前回のエントリ](http://blog.hiroaki.jp/2010/03/000464.html)で記したとおり、自分が道路上にいるかどうかを調べるためには、そもそも道路のデータを保持していなければなりません。

このデータを使って地図上に高速道路や国道のラインをプロットすることが出来ます。


最初、前回のエントリで作ったデモに組み込もうと思って試しにやってみたんですが、位置データが多すぎるため、blazedsを使って単純にサーバからクライアントにプッシュするとTomcatが落ちてしまいました...（たぶんシリアル化する時に落ちてる）。

GoogleMaps APIを調べてみると位置データをエンコード化して読み込ませるというオプションがあったので、サーバ側でデータをエンコードした上でクライアントにプッシュすることで、そちらを実装してみたらうまくいったので公開します。

あ、そうそう、前回のデモでは関東圏だけしか動きませんでしたが、DBをアップデートしたので、今は日本全国調べられます。]]>
        ## 説明

前回のデモに追加で実装したので、[前回のサイト](http://blog.hiroaki.jp:8400/roadgis/FlexMap.html)を訪れて同じように動かすだけです。

前回は、地図中心点に道路があるかどうかを調べ、道路に名前がついていればその旨表示するだけでしたが、今回はそのあとに表示されている地図の範囲の道路位置データをダウンロードしてGoogleMaps上にプロットします。
ダウンロードするのに最大で10秒くらいかかるかもしれないので、気長にお待ちください。

また、ある程度地図の拡大率が低い場合には、中心付近を一部だけロードするようにしています。DBのロード、データエンコード、クライアントへのプッシュ、クライアント側での描画、ととんでもなく時間がかかるためです。

また、手抜きプログラミングのため、同じ場所を拡大したとしても再度全てのデータを読み込み直します。ほんとはバッファとか用意した方が良いんでしょうが、重複判定するのも面倒だったりします。クライアント側にDB持ってるとそのあたりも柔軟にできるかもですが。


## なんでこんなの作ったか

前回の道路名を調べるデモですが、結構条件がシビアで、きちんと場所を合わせているつもりでも道路名が出てこないことがあり、（作った本人が）いらいらしておりました。

まぁ、どこまで判定をシビアにするかというのはパラメータをいじれば済むのですが、あると思っていた道路が95年現在はなかったため道路名が表示されない、とか、そもそも道路名が登録されていないために表示されない、といった場合には、その場では原因がよく分からず「おかしい...」と悩んでしまったのでした。

であれば、DBに登録してある道路を周辺地区だけでもプロットし、そもそもDBに登録されているのか否かを調べられるとよろしい、ということで作ったのでした。


## その他

現在は高速から一般道まで全て同じ色で表示していますが、色を変えたり、チェックボックスで表示する道路を選択できたりすると面白いかもしれません。

位置データのエンコードは、[エンコード化ポリライン アルゴリズム方式](http://code.google.com/intl/ja/apis/maps/documentation/polylinealgorithm.html)というGoogleのページで説明されているのですが、いまいち日本語がよくわからず...。
検索したら、[こちらのサイト](http://blog.livedoor.jp/g0031067/archives/51496182.html)にて、まさに合点のいかないところがシンプルに説明されており助かりました。
    </content>
</entry>

</feed>

