<?xml version="1.0" encoding="UTF-8"?>

<feed xml:lang="ja" xmlns="http://www.w3.org/2005/Atom">
    <title>Web　酒　肴</title>
    <subtitle>Flex, ActionScript, CMS, Ruby on Rails, Java, NetBeansなどの技術情報その他</subtitle>
    <id>http://blog.garden-place.jp/oborobeer/:2</id>

    <link rel="alternate" type="text/html" href="http://blog.garden-place.jp/oborobeer/" />
    <link rel="self" type="application/atom+xml" href="http://blog.garden-place.jp/oborobeer/" />
    <generator uri="http://nucleuscms.org/">Nucleus CMS v3.31SP1</generator>
    <updated>2008-02-18T16:44:26Z</updated>

    <entry>
 <title type="html"><![CDATA[[RoR]Ruby on Railsチュートリアル #1]]></title>
 <link rel="alternate" type="text/html" href="http://blog.garden-place.jp/oborobeer/item_115.html" />
 <author>
  <name>obanetty</name>
 </author>
 <updated>2008-02-18T16:44:26Z</updated>
 <published>2008-02-19T01:44:26+09:00</published>
 <content type="html"><![CDATA[<p>久しぶりにRailsでちょっとしたアプリを作ろうとしたら、かなり色々忘れてて大変だった。
今度忘れた時のためにちょっとまとめとこう。</p>

<h2>環境</h2>

<p>さくらインターネットでRailsアプリを新たに作成した際、以下の作業を忘れてはいけない。</p>

<p><em>public/.htaccessの修正</em></p>

<pre><code># 以下の3行をコメントアウト(先頭に#を付ける)します 
AddHandler fastcgi-script .fcgi 
AddHandler cgi-script .cgi 
Options +FollowSymLinks +ExecCGI 
</code></pre>

<p><em>config/environment.rbの修正</em></p>

<pre><code>以下の2行を追加してください
$LOAD_PATH.push("$HOME/ruby/lib/ruby/site_ruby/1.8") 
$LOAD_PATH.push("$HOME/ruby/lib/ruby") 
</code></pre>

<p><em>apacheから見えるように設定</em></p>

<pre><code>cd $HOME/www 
ln -s $HOME/work/hoge/public {$APP} 
</code></pre>

<p>以上、参照元：<a href="http://tomonori855.sakura.ne.jp/recipe/2006/05/ruby_on_rails.html">Ruby on Rails を入れる(さくらインターネット)</a></p>

<p><em>routes.rbの修正</em></p>

<p>これは必須ではないが、URLを単純化するために。
設定内容は以下のサイトが詳しい。</p>

<p><a href="http://wota.jp/ac/?date=20050725">優しいRailsの育て方 - ノk|*‘－‘)＜ノリマツ！愛だよ、愛！</a></p>

<h2>controller系</h2>

<p><em>他のアクションと同じ画面遷移をさせる</em></p>

<pre><code>render :action =&gt; "他のアクション名"
</code></pre>

<p><em>リファラの参照</em></p>

<pre><code>request.referer
</code></pre>

<p>その他のrequestオブジェクトの中身はこちらの記事参照。つーか、ここめっちゃ見やすい。このエントリーもぶっちゃけこのサイトの真似だったりする。</p>

<p><a href="http://underrails.seesaa.net/article/60912496.html">requestオブジェクトの中身 - Rails開発日記</a></p>

<h2>その他Rubyの基本</h2>

<p><em>クラスの初期化はinitializeコンストラクタで</em></p>

<p>つーか、そこまで忘れてどうする。インスタンス変数を作成するのに四苦八苦。</p>
]]></content>
 <id>http://blog.garden-place.jp/oborobeer/:2:115</id>
</entry><entry>
 <title type="html"><![CDATA[[RoR]routes.rbの更新が反映されない]]></title>
 <link rel="alternate" type="text/html" href="http://blog.garden-place.jp/oborobeer/item_112.html" />
 <author>
  <name>obanetty</name>
 </author>
 <updated>2008-02-15T08:55:41Z</updated>
 <published>2008-02-15T17:55:41+09:00</published>
 <content type="html"><![CDATA[<p>さくらインターネットのレンタルサーバでRuby on Railsを動かしている。
ふとデフォルトのwelcome画面をそのままにしていたことに気付き、config/routes.rbを修正。
これでTOPページのURLが単純化された、、、はず。</p>

<p>ところがroutes.rbの変更をどうやって反映したらいいのかわからない。共用のレンタルサーバだからApacheの再起動とかもできないし。</p>

<p>色々と調べていくうちにrakeタスクの中で設定を更新するようなものもあった。しかしconfig/boot.rbとかそんなんばっか。肝心のroutes.rbを更新するタスクは見つからなかった。</p>

<p>悩んだ挙句、welcomeページに表示されているpublic/index.htmlを削除したらうまくいくことに気付いた。う～ん、なんか釈然としない。だけどindex.htmlを削除するってのはよく考えたら基本だな。以前翻訳した記事でもそう書いてた（って何のために翻訳したんだか。）</p>

<p>翻訳記事<br />
↓<br />
<a href="http://blog.garden-place.jp/oborobeer/item_74.html">[勝手に日本語訳] Getting Started With Ruby and Rails</a></p>
]]></content>
 <id>http://blog.garden-place.jp/oborobeer/:2:112</id>
</entry><entry>
 <title type="html"><![CDATA[GoogleMapでマッシュアップの練習（Rails編） #7]]></title>
 <link rel="alternate" type="text/html" href="http://blog.garden-place.jp/oborobeer/item_58.html" />
 <author>
  <name>obanetty</name>
 </author>
 <updated>2008-01-09T13:40:47Z</updated>
 <published>2008-01-09T22:40:47+09:00</published>
 <content type="html"><![CDATA[<p>では最終的に作ったソースをもとに解説していく。</p>

<h3>main_controller.rb</h3>

<pre><code>require 'net/http'
require 'rexml/document'
require 'cgi'

class MainController &lt; ApplicationController

  def index
  end
  def search
    #HTTP通信設定（rgoecode）
    site = Net::HTTP.start('refits.cgk.affrc.go.jp')

    #地名情報取得  ← 1
    response = site.get("/tsrv/jp/rgeocode.php?lon=#{params[:x]}&amp;lat=#{params[:y]}")
    resXML = response.body
    site.finish

    #XML要素から都道府県名と都市名を取得する  ← 2
    @got, @pref, @munic = get_name_of_place(resXML)

    unless @got then   # ← 3 
      @resText = "Error!"
      render(:layout =&gt; false)
      return
    end

    #HTTP通信設定（郵便番号）
    site = Net::HTTP.start('webservice.est.co.jp')

    #郵便番号情報取得  ← 4 
    response = site.post("/zipcode/SearchEngine.asmx/FromAddress2", "Address=" + CGI.escape(@pref + @munic))
    @got, @zipcode = get_zipcode(response.body)  # ← 5 
    unless @got then  # ← 6
      response = site.post("/zipcode/SearchEngine.asmx/FromAddress2", "Address=" + CGI.escape(@pref))
      @got, @zipcode = get_zipcode(response.body)
    end
    site.finish

    #HTTP通信設定（旅行記）
    site = Net::HTTP.start('api.4travel.jp')

    #旅行記情報取得  ← 7 
    response = site.get("/Ver1/SearchAlbum.php?zip=#{@zipcode}&amp;oc=utf8")
    @travel_info = TravelInfo.new response.body   # ← 8 
    site.finish

    #郵便番号に-（ハイフンを入れる）
    @zipcode.insert(3, "-")
  end

  def get_name_of_place xml
    #XMLツリー作成
    docTree = REXML::Document.new xml

    #ステータス取得（地名の取得が成功したかどうか）

    status = docTree.elements.each("/rgeocode/status"){}[0].text
    return false, "取得失敗", "取得失敗" if status != "true"

    #都道府県取得
    @pref = docTree.elements.each("/rgeocode/prefecture/pname"){}[0].text

    #都市名取得
    @munic = docTree.elements.each("/rgeocode/municipality/mname"){}[0].text

    return true, @pref, @munic
  end


  def get_zipcode xml
    #XMLツリー作成
    docTree = REXML::Document.new xml

    #ステータス取得（地名の取得が成功したかどうか）
    status = docTree.elements.each("/FindList/TotalFindCount"){}[0].text
    return false, "" if status == "0"

    #郵便番号取得
    zipcode = docTree.elements.each("/FindList/Item/FindItem/ZipCode"){}[0].text

    return true, zipcode
  end
end
</code></pre>

<p>メインはsearchメソッド。<br />
これがGoogleMapの地図上をクリックしたときに呼び出されるメソッド。</p>

<p>番号をつけているあたりで以下の処理をしている。</p>

<ol>
<li>ジオコードから地名をXML形式で取得</li>
<li>取得したXMLから都市名、町名などを取得（get_name_of_placeメソッド呼び出し）</li>
<li>取得できなければ終了</li>
<li>地名をもとに郵便番号をXML形式で取得</li>
<li>取得したXMLから郵便番号を取得（get_zipcodeメソッド呼び出し）</li>
<li>取得に失敗したらリトライ（町名は外して県名のみで取得）</li>
<li>郵便番号をもとに旅行記をXML形式で取得</li>
<li>取得したXMLから旅行記の配列を取得（TravelInfoクラス　※ソースは下）</li>
</ol>

<p>旅行記のXMLを解析し、Travelogueというクラスのインスタンスにする。<br />
それを旅行記の配列をTravelInfoが保持している。<br />
この２つのクラスはコントローラから呼び出せるようにhelpersの下に配備する。</p>

<h3>travel_info.rb</h3>

<pre><code>require 'rexml/document'

class Travelogue
  attr_accessor :album_title, :album_url, :traveler, :traveler_url, :picture_url, :picture_link, :area, :area_url, :description
  def initialize(doc)
    @album_title = doc.elements.each("albumtitle"){}[0].text
    @album_url = doc.elements.each("albumurl"){}[0].text
    @traveler = doc.elements.each("traveler"){}[0].text
    @traveler_url = doc.elements.each("travelerurl"){}[0].text
    picture_url = doc.elements.each("picture"){}
    picture_url = doc.elements.each("pictlist/picturl"){} unless picture_url
    @picture_url = picture_url[0].text if picture_url.size &gt; 0
    picture_link = doc.elements.each("pictlist/pictlink"){}
    @picture_link = picture_link[0].text if picture_link.size &gt; 0
    area = doc.elements.each("area"){}
    @area = area[0].text if area.size &gt; 0
    area_url = doc.elements.each("areaurl"){}
    @area_url = area_url[0].text if area_url.size &gt; 0
    description = doc.elements.each("description"){}
    @description = description[0].text.split(//u)[0..100].join.gsub /\r?\n/, "&lt;br /&gt;\r\n" if description.size &gt; 0
  end
end

class TravelInfo
  attr_accessor :num_of_results, :travelogue_array
  def initialize(xml)
    #XMLツリー作成
    docTree = REXML::Document.new xml

    #検索結果件数取得（旅行記の取得が成功したかどうか）
    num_of_results = docTree.elements.each("/results/numofresult"){}
    if num_of_results.size &gt; 0
      @num_of_results = num_of_results[0].text 
    else
      @num_of_results = 0
    end
    @travelogue_array = []

    if @num_of_results != 0 then
      docTree.elements.each("/results/travelogue/item"){|travelogue|
        @travelogue_array &lt;&lt; Travelogue.new(travelogue)
      }
    end
  end
end
</code></pre>

<p>さて、これで必要な情報は取得できたわけだが、それを画面上に表示できるようにHTMLに変換してやる必要がある。<br />
これはsearchメソッドと結びつくviews/main/search.rhtmlを作成すれば自動的に呼び出される。</p>

<h3>search.rhtml</h3>

<pre><code>&lt;div id="search_area"&gt;
  &lt;div class="search_info"&gt;
    &lt;h3&gt;検索条件&lt;/h3&gt;
    &lt;div class="search_parts"&gt;
      &lt;div class="search_lable"&gt;都道府県名&lt;/div&gt;
      &lt;div class="search_word"&gt;&lt;%= @pref %&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="search_parts"&gt;
      &lt;div class="search_lable"&gt;都市名&lt;/div&gt;
      &lt;div class="search_word"&gt;&lt;%= @munic %&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="search_parts"&gt;
  &lt;%
    if @got then
  -%&gt;
      &lt;div class="search_lable"&gt;郵便番号&lt;/div&gt;
      &lt;div class="search_word"&gt;&lt;%= @zipcode %&gt;&lt;/div&gt;
  &lt;% else -%&gt;
      &lt;div class="search_lable"&gt;郵便番号&lt;/div&gt;
      &lt;div class="search_word"&gt;取得失敗&lt;/div&gt;
  &lt;% end -%&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div id="search_result"&gt;
&lt;%
    if @travel_info != nil &amp;&amp; @travel_info.num_of_results != 0 then
      @travel_info.travelogue_array.each{|t|
-%&gt;
    &lt;div class="an_result"&gt;
      &lt;div class="travel_title"&gt;
        &lt;a href="&lt;%= t.album_url %&gt;" target="_blank"&gt;&lt;%= t.album_title %&gt;&lt;/a&gt;
        &lt;% if t.area %&gt;
        （&lt;a href="&lt;%= t.area_url %&gt;" target="_blank"&gt;&lt;%= t.area %&gt;&lt;/a&gt;）
        &lt;% end %&gt;
      &lt;/div&gt;
      &lt;div class="travel_description"&gt;
      &lt;% if t.picture_url %&gt;
      &lt;a href="&lt;%= t.album_url %&gt;" target="_blank"&gt;&lt;img src="&lt;%= t.picture_url %&gt;" align="left"/&gt;&lt;/a&gt;
      &lt;% end %&gt;
      &lt;% if t.description %&gt;
      &lt;%= t.description %&gt;
      &lt;% end %&gt;
      &lt;/div&gt;
      &lt;div class="traveller"&gt;
        &lt;a href="&lt;%= t.traveler_url %&gt;" target="_blank"&gt;&lt;%= t.traveler %&gt;&lt;/a&gt;
      &lt;/div&gt;
      &lt;br style="clear: both;" /&gt;
    &lt;/div&gt;
  &lt;% } %&gt;
  &lt;% else %&gt;
  見つかりませんでした.
  &lt;% end %&gt;
  &lt;/div&gt;
&lt;/div&gt;
</code></pre>

<p>eRubyがわかれば特に難しい事はしていない。<br />
検索情報と、検索結果をHTMLにしているだけだ。<br />
ただし、作る方はこういうデザインに一番時間がかかるんだけどね。<br />
そしてそれっぽく見えるスタイルシートをフリー配布のところからダウンロードしてきて適用。<br />
最終的にこんな感じになりました。</p>

<p><a href="http://ukkyo.sakura.ne.jp/map/main/">旅行記検索サイト</a></p>
]]></content>
 <id>http://blog.garden-place.jp/oborobeer/:2:58</id>
</entry><entry>
 <title type="html"><![CDATA[GoogleMapでマッシュアップの練習（Rails編） #6]]></title>
 <link rel="alternate" type="text/html" href="http://blog.garden-place.jp/oborobeer/gmap1_6.html" />
 <author>
  <name>obanetty</name>
 </author>
 <updated>2008-01-06T03:48:29Z</updated>
 <published>2008-01-06T12:48:29+09:00</published>
 <content type="html"><![CDATA[<p>エマージェンシー発生</p>

<p>フォートラベルのAPIを再確認してみたところ、地名からの旅行記取得の仕様が期待していたものと違う。「北海道」とかいうパラメータで旅行記が取得できると思っていたけど、それは無理。「hokkaido」というアルファベット形式で送信しなくてはならない。漢字の地名をいちいちアルファベットに変換なんて面倒だしやりたくない。ということで別の方法を考えなくては。こういう見切り発車な性格は災いもおおいけど、勢いがなくては何も始められない。と肯定的に捉えてみる。</p>

<p>調査を続けるとフォートラベルでは残された方法は一つしかなかった。それは郵便番号による検索。</p>

<p>ということで住所から郵便番号を取得する処理を一つ追加する。APIは<a href="http://www.postan.jp/postanws.htm">ぽすたん</a>というサービスを見つけた。さっそく組み込んでみる。</p>

<p>処理内容はこういうふうになる。</p>

<p>[修正前]</p>

<ol>
<li>GoogleMAP上をクリック</li>
<li>住所取得（京都市など）</li>
<li>旅行記取得（これができない）</li>
</ol>

<p>[修正後]</p>

<ol>
<li>GoogleMAP上をクリック</li>
<li>住所取得（京都市など）</li>
<li>郵便番号取得(605xxxxなど）</li>
<li>旅行記取得</li>
</ol>

<p>上記処理を実装するのに、あれやこれやと結構時間を食ってしまって。<br />
その経緯をブログに残すのを忘れてた・・・。<br />
突然だけど、急転直下で次回完成！！！<br />
（テキトーですみません）</p>
]]></content>
 <id>http://blog.garden-place.jp/oborobeer/:2:24</id>
</entry><entry>
 <title type="html"><![CDATA[GoogleMapでマッシュアップの練習（Rails編） #5]]></title>
 <link rel="alternate" type="text/html" href="http://blog.garden-place.jp/oborobeer/gmap1_5.html" />
 <author>
  <name>obanetty</name>
 </author>
 <updated>2007-12-31T09:28:14Z</updated>
 <published>2007-12-31T18:28:14+09:00</published>
 <content type="html"><![CDATA[<p>4travelにパラメータとして地名を送信するには、返されたXMLの中から地名だけを取りだす必要がある。難しいことはしないけどRubyでXMLをいじった経験はなし。きっとそういうライブラリがあるはず、と思って探すとREXMLというものを発見。日本語情報が少なくここを参考になんとかやってみた。</p>

<p><a href="http://japan.internet.com/developer/20070703/27.html">REXML：RubyによるXML処理</a></p>

<p>どうもREXMLの日本語情報が少ないようで、これ以上調べるのも時間がかかりそうな気がしたので、見よう見まねでかなり強引に作ってみた。きっともっとスマートな方法があるはず。main_controller.rbにget_name_of_placeというメソッドを追加し、そこにXMLのデータを渡すと都道府県名と都市名を別々にようにした。取得失敗時は取得失敗という文字を返す。</p>

<h3>main_controller.rb</h3>

<pre><code>require 'net/http'
require 'rexml/document'

class MainController &lt; ApplicationController

  def index
  end
  def search
    #HTTP通信設定
    site = Net::HTTP.start('refits.cgk.affrc.go.jp')

    #地名情報取得
    response = site.get("/tsrv/jp/rgeocode.php?lon=#{params[:x]}&amp;lat=#{params[:y]}")
    resXML = response.body
    site.finish

    #XML要素から都道府県名と都市名を取得する
    pref, munic = get_name_of_place(resXML)

    #画面表示用のテキスト整形
    @resText = "都道府県名：#{pref}  都市名：#{munic}"

    render(:layout =&gt; false)
  end

  def get_name_of_place xml
    #XMLツリー作成
    docTree = REXML::Document.new xml

    #ステータス取得（地名の取得が成功したかどうか）
    status = docTree.elements.each("/rgeocode/status"){}[0].text
    return "取得失敗", "取得失敗" if status != "true"

    #都道府県取得
    pref = docTree.elements.each("/rgeocode/prefecture/pname"){}[0].text

    #都市名取得
    munic = docTree.elements.each("/rgeocode/municipality/mname"){}[0].text

    return pref, munic
  end
end
</code></pre>

<p>今回もサーバサイドのみの変更なのでそのまま地図をクリック。よし、成功！僕の住んでる近辺を狙って何度かクリックするものの、なかなか難しい。よし、面白くなってきたぞ。</p>

<p><img src="http://blog.garden-place.jp/media/2/20070917-map2.jpg" width="628" height="575" alt="家からは少し離れてるけど・・・" title="家からは少し離れてるけど・・・" /></p>
]]></content>
 <id>http://blog.garden-place.jp/oborobeer/:2:19</id>
</entry><entry>
 <title type="html"><![CDATA[GoogleMapでマッシュアップの練習（Rails編） #4]]></title>
 <link rel="alternate" type="text/html" href="http://blog.garden-place.jp/oborobeer/gmap1_4.html" />
 <author>
  <name>obanetty</name>
 </author>
 <updated>2007-11-03T07:40:30Z</updated>
 <published>2007-11-03T16:40:30+09:00</published>
 <content type="html"><![CDATA[<p>今度はダミーの文字ではなくて実際にデータを取得しましょう。4travelの旅行記取得APIの仕様を調べたところ、緯度と経度から取得はできないようです。残念。終了。。。。。。。</p>

<p>というわけにもいかないので、何とか実現可能な方法を模索します。地名から旅行記は取得できるようですので地名を取得する方法を考えましょう。Google検索でこんな素晴らしい質問がヒットしました。僕も人力検索使おうかな。</p>

<p><a href="http://q.hatena.ne.jp/1153841036">人力検索はてな 緯度経度からだいだいの地名（○県○市くらいの精度で十分です）を得る方法を教えてください。</a></p>

<p>ここの回答No9の方が紹介されているサイトがこちら（URLは変更されてた。）</p>

<p><a href="http://refits.cgk.affrc.go.jp/tsrv/jp/rgeocode.html">逆ジオコーディングサービス</a></p>

<p>これで方針決定。以下のような2段階処理をすることにしよう。</p>

<ul>
<li>緯度、経度から地名（都道府県、都市名）を取得</li>
<li>その地名で旅行記を取得</li>
</ul>

<p>まずは1つ目、地名を取得する処理をサーバ側で実装。これはmain_controller.rbのsearchメソッドを修正。ブラウザから送信されたx, yのパラメータを逆ジオコーディングのlon, latパラメータに代入してリクエスト送信でOK。とりあえず返ってきた文字列をそのまま表示するため@resXMLに全文字列を代入。</p>

<h4>main_controller.rb</h4>

<pre><code>require 'net/http'

class MainController &lt; ApplicationController

  def index
  end

  def search
    #HTTP通信設定
    site = Net::HTTP.start('refits.cgk.affrc.go.jp')

    #地名情報取得
    response = site.get("/tsrv/jp/rgeocode.php?lon=#{params[:x]}&amp;lat=#{params[:y]}")
    @resXML = response.body #とりあえず全結果文字列を表示させる
    site.finish

    render(:layout =&gt; false)
  end

  def getNameOfPlace
    #XML要素から都道府県名と都市名を取得する

  end
end
</code></pre>

<h4>resXMLを返信するためにviewを変更</h4>

<p>app/views/main/search.rhtml</p>

<pre><code>&lt;%= @resXML %&gt;
</code></pre>

<p>今度の修正はサーバ上のみなのでブラウザの再読み込みは必要なし。そのまま先ほどと同じように地図上をクリック。マジで動いた・・・・。すげぇ。</p>

<p><img src="/media/2/20071231-20070917-map1.jpg" alt="成功図" title="成功！" /></p>
]]></content>
 <id>http://blog.garden-place.jp/oborobeer/:2:16</id>
</entry><entry>
 <title type="html"><![CDATA[GoogleMapでマッシュアップの練習（Rails編） #3]]></title>
 <link rel="alternate" type="text/html" href="http://blog.garden-place.jp/oborobeer/gmap1_3.html" />
 <author>
  <name>obanetty</name>
 </author>
 <updated>2007-11-03T07:12:47Z</updated>
 <published>2007-11-03T16:12:47+09:00</published>
 <content type="html"><![CDATA[<p>クリックしたら場所をサーバに送信して旅行情報を取得・表示を行う。まずはサーバと通信するところだけを作ってみよう。どこぞのGoogleMapのサンプルで以下のようなコードを拾ってきた。ほぼそのまま使っている。</p>

<h4>サーバとの通信部分</h4>

<pre><code>function xmlRpc(point){
  var req = GXmlHttp.create();
  req.open("GET", "main/search?x=" + point.x + "&amp;y=" + point.y, true);
  req.onreadystatechange = function(){
    if(req.readyState == 4){
      //dummy
      alert(req.responseXML);
    }
  }

  req.setRequestHeader("Content-Type", "text/html; charset=UTF-8");
  req.send(null);
}
</code></pre>

<p>これをトップページに組み込んでクリック時のリスナ関数から呼び出すようにする。</p>

<pre><code>GEvent.addListener(map, 'click', function(overlay, point) {
if (point) {
    alert("x = " + point.x + ", y = " + point.y);
    xmlRpc(point);
  }
});
</code></pre>

<p>全体としてこうなった。</p>

<pre><code>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;head&gt;
&lt;meta http-equiv="content-type" content="text/html; charset=utf-8"/&gt;
&lt;title&gt;Google Mapテスト&lt;/title&gt;
&lt;script src="http://maps.google.com/maps?file=api&amp;amp;v=2&amp;amp;key=ABQIAAAABWYMASZTPMzQMXu2alSa6xTvcRCYKSpWpPqDL-sNMuxVdHFI_BTd8zF9kdpV97QhhvGd0NWsQckXsw"
  type="text/javascript"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id="map" style="width: 500px; height: 500px"&gt;&lt;/div&gt;
&lt;script type="text/javascript"&gt;
//&lt;![CDATA[

if (GBrowserIsCompatible()) {
    var map = new GMap2(document.getElementById("map"));
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
    map.setCenter(new GLatLng(38, 138), 5);
    map.disableDragging();
}

GEvent.addListener(map, 'click', function(overlay, point) {
    if (point) {
        alert("x = " + point.x + ", y = " + point.y);
        //map.openInfoWindow(point,
        //document.createTextNode("openInfoWindow Test"));

        xmlRpc(point);
    }
});

function xmlRpc(point){
    var req = GXmlHttp.create();
    req.open("GET", "main/search?x=" + point.x + "&amp;y=" + point.y, true); //app/controllers/main_controller.rb のsearchメソッドが呼び出される（パラメータはxが経度、yが緯度）
    req.onreadystatechange = function(){
        if(req.readyState == 4){
            //dummy
            alert(req.responseXML); (←とりあえず結果を表示させるだけ）
        }
    }

    req.setRequestHeader("Content-Type", "text/html; charset=UTF-8");
    req.send(null);
}
//]]&gt;
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>

<p>次はサーバ側の処理。app/controllers/main_controller.rbにsearchメソッドを追加。</p>

<pre><code>class MainController &lt; ApplicationController

    def index
    end

    def search
        render(:layout =&gt; false)
    end
end
</code></pre>

<p>レイアウトは使用してないけど、画面表示をさせないということから念の為に無効化しています。次にviewを作成。app/views/main/search.rhtmlを以下のように作成します。</p>

<pre><code>dummyString!!
</code></pre>

<p>で、ページを再読み込みして地図上をクリック。
緯度、経度が表示された後、「dummyString!!」が表示されれば・・・・</p>

<p>されない・・・</p>

<p>nullが表示されます。なぜだ？と調査開始。サーバのログを見るとsearchメソッドは正常に呼び出されてHTTPレスポンスコードも200。つまりサーバに問題はない。それならクライアント側ってことで、JavaScript部分を見直していると気になったのはこの部分。</p>

<pre><code>alert(req.responseXML);
</code></pre>

<p>メソッド名から察するに結果XMLを取得しているわけだが、今回は結果は単なる文字列であってXMLではない。そう思って調査していると以下のページを見つけた。予想は正しくreq.responseTextじゃないというメソッドもあるようだ。</p>

<p><a href="http://www.7korobi8oki.com/mt/archives/000049.html">XMLHttpRequest入門【メソッド等の確認とシンプルなコード】</a></p>

<p>修正後、ページを再読み込みして画面クリックすると、見ごとに「dummyString!!」が表示された。今回はここまで。</p>
]]></content>
 <id>http://blog.garden-place.jp/oborobeer/:2:13</id>
</entry><entry>
 <title type="html"><![CDATA[GoogleMapでマッシュアップの練習（Rails編） #2]]></title>
 <link rel="alternate" type="text/html" href="http://blog.garden-place.jp/oborobeer/gmap1_2.html" />
 <author>
  <name>obanetty</name>
 </author>
 <updated>2007-10-19T02:51:38Z</updated>
 <published>2007-10-19T11:51:38+09:00</published>
 <content type="html"><![CDATA[<h3>環境</h3>

<ul>
<li>Windows上でVMwareにFedoraCore4 + Ruby On Rails（Rubyともにバージョンは現在2007/09/17の最新←テキトーだな）</li>
<li>Puttyで接続してvimで開発</li>
<li>Googleでキー取得のときに申請したホスト名は本番環境用なので、暫定的にHostsファイルをいじってローカルのFedoraのIPを割り当てる。</li>
</ul>

<h3>Rails でアプリ作成（アプリ名：map）</h3>

<pre><code>[obanetty@fedora ~]$rails map
</code></pre>

<h3>トップページ用のmainコントローラとindexページ作成</h3>

<pre><code>　
[obanetty@fedora ~]$script/generate controller main index
　
</code></pre>

<h3>トップページであるapp/views/main/index.rhtmlにGoogleMapを設置</h3>

<p>もう、このサイトの言う通りにやったらすぐにできました。
素晴らしいです。</p>

<p><a href="http://www.geekpage.jp/web/google-maps-api/">Geekなぺーじ - Google MAPS APIプログラミング</a></p>

<h3>app/views/main/index.rhtmlの内容</h3>

<hr />

<pre><code>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
  &lt;head&gt;
    &lt;meta http-equiv="content-type" content="text/html; charset=utf-8"/&gt;
    &lt;title&gt;Google Mapテスト&lt;/title&gt;
    &lt;script src="http://maps.google.com/maps?file=api&amp;amp;v=2&amp;amp;key=ABQIAAAABWYMASZTPMzQMXu2alSa6xTvcRCYKSpWpPqDL-sNMuxVdHFI_BTd8zF9kdpV97QhhvGd0NWsQckXsw"
      type="text/javascript"&gt;&lt;/script&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;div id="map" style="width: 500px; height: 500px"&gt;&lt;/div&gt;
    &lt;script type="text/javascript"&gt;
    //&lt;![CDATA[
    if (GBrowserIsCompatible()) {
      var map = new GMap2(document.getElementById("map"));
      map.addControl(new GLargeMapControl());
      map.addControl(new GMapTypeControl());
      map.setCenter(new GLatLng(38, 138), 5);
      map.disableDragging();
    }
    GEvent.addListener(map, 'click', function(overlay, point) {
      if (point) {
          alert("x = " + point.x + ", y = " + point.y);
          map.openInfoWindow(point,
          document.createTextNode("openInfoWindow Test"));
      }
    });
    //]]&gt;
    &lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre>

<p>設定内容は以下（日本列島だけを表示するようにした）
+ 初期化位置を指定する
+ コントロールボタンを表示する
+ 地図をドラッグで移動できないようにする
+ クリック処理</p>

<p>クリックしたポイントの緯度と経度をalert表示させる処理も入れておいた。alertのスペルを忘れてて２、３度苦戦。</p>

<h3>　サーバ起動</h3>

<pre><code>[obanetty@fedora map]$ script/server -p 80
</code></pre>

<p>80番ポートで起動しないと申請した内容と変わるため。んで80番ポートを使用するには管理者権限が必要だった。</p>

<p>以降はサーバ起動したままで別のPutty窓からアプリを編集。この方がサーバの再起動が必要ないから楽。これはRailのWebrickサーバがデフォルト指定ではdevelopmentモードで起動し、サーバの再起動なしに動的にアプリケーションを読み込んでくれるから。</p>
]]></content>
 <id>http://blog.garden-place.jp/oborobeer/:2:40</id>
</entry>
</feed>
