Home

Web 酒 肴

«前へ || 1 | 2 | 3 |...| 11 | 12 | 13 || 次へ»

[MODx]MODxのSEO対策は優秀?

  • 2008-01-31 (Thu)
  • MODx

僕は別の場所でちょっとしたRuby言語を紹介する連載(プログラマよ、Rubyで輝け!)などしているのですが、そこではサイト構築にMODxを使用しています。 で、僕の連載している内容はというと、これまた中身スカスカで大したことなくて(オイ)、とりあえずコンテンツの数を増やすために書いてる(だからオイ)、みたいな程度なのですが、先日アクセス解析で面白いことがわかりました。

「ruby ハッシュ変数」のキーワードでGoogle検索からたどり着いた人がいたので、何気なくそのキーワードで検索してみたのですが、なんと検索結果第一位です!(2008/1/31現在)。

第一位!

「え~~~!!」

て感じでした。 もしかしてMODxってとんでもないSEO対策能力を持っているのでは・・・と思ったのもつかの間。 検索結果が330件しかないことに気づく・・・。

330件・・・

Rubyの世界ではあまりハッシュ変数とかって言い方しないのね。。。 さて、そろそろ飲むか。

追記

「MODx アクセス解析」のようなキーワードでここにたどり着いた人へ。

そのサイトではslim statを使用してアクセス解析しています。だけどデフォルトでは検索キーワードの日本語が文字化けしたり、色々めんどくさかったです。今はさらにGoogle Analyticsも追加して、こちらのほうがいい感じ。これで十分ではないかと思っています。

[Nucleus]ブログごとのRSS(ATOM)を出力 ※CustomURL使用環境

注意

このエントリーには正しくない情報が含まれていたので2008/2/25大幅に修正しました。

環境

  • Nucleus 3.3
  • 複数ブログ構築
  • CustomizedURL使用

上記環境の場合、以下のURLでRSSにアクセスできる。

http://(サイトのURL)/(ブログの短縮名)/rss2.xml

サイドバーなどでRSSやATOMへのリンクがある個所を以下のように修正します。 (修正内容は太字部分)

<li class="rss"><a href="<%CustomURL%>rss2.xml">RSS2.0</a></li>
<li class="atom"><a href="<%CustomURL%>atom.xml">ATOM</a></li>

しかし、feeds/rss20テンプレートが出力するURLがCustomizedURLに対応したものではない。
なので以下サイトを参考に修正を加えた。

Nucleus - RSSとAtomのFancyURL化

修正部分は同じだが、修正内容はCustomizedURL用にアレンジしなければいけないだろう。

間違い発覚により修正(2008/02/25)

これでいけると思ったが、困ったことにどうやらテンプレート内部では<%sitevar()%>などのスキン変数が使えないみたいだ。 ここで2日ほどハマった。 で、ネットを徘徊して見つけた糸口が。 このプラグインを使用すればいけそう。 [NP_BlogInfo](http://japan.nucleuscms.org.whsites.net/wiki/plugins:bloginfo) これはテンプレート内部でも<%blogsetting()%>のようなスキン変数のように働くもののようだ。 てことで導入。

実際はプラグインなど入れなくてもCustomURLデフォルトの機能でいけたみたい。CustomURLナメすぎでした。ていうか、すいません。。
RSSとATOMのテンプレートのURL部分を以下のように修正(同じく2008/2/25更新)

feeds/atom/entries

修正前

<link rel="alternate" type="text/html" href="<%blogurl%>index.php?itemid=<%itemid%>" />

修正後

<link rel="alternate" type="text/html" href="<%CustomURL%>" />

feeds/rss20

修正前

<link><%blogurl%>index.php?itemid=<%itemid%></link>

修正後

<link><%CustomURL%></link>

もう一か所

修正前

<comments><%blogurl%>index.php?itemid=<%itemid%></comments>

修正後

<comments><%CustomURL%></comments>

これでうまくいった気がする。
しばらくこれで様子を見よう。

さらに追記 2008/2/25

これでカテゴリ毎のRSS取得もできるようになったけど、MultipleCategoriesのサブカテゴリには対応できていない。 これはやっぱり無理なのかな?とりあえず保留で。

[Nucleus]NP_Markdown利用者に嬉しいプラグイン NP_MarkdownEditor

NP_MarkdownEditor v0.1

NP_Markdown利用者は上記のプラグインを入れることで、以下のことが簡単にできるようになる。

  • リンクテキスト挿入
  • ページ内リンク(脚注など)挿入
  • リスト記述
  • 引用文記述
  • 改行処理
  • HTMLエンティティ変換

そして何よりも嬉しいのが編集中の記事のプレビューができること。
これ欲しかった。

ブラウザはFirefox推奨のようですが、Nucleusの編集はFirefoxでやってので僕にはちょうどよかった。
今後、他のブラウザ対応も進めていただけるとさらに助かります。

[Nucleus]Nucleusの構築

ここのブログはNucleusで構築されています。
いくつかのプラグインを入れ、スキンなども変更したけど、まだまだ思い通りにいかない。
とりあえず今までのまとめ。

代表的なプラグイン

NP_CustomURL

標準実装のFancyURLよりも簡単にURLを静的でわかりやすくする。 テンプレート内で<%CustomURL(path)%>を使うことで記事のリンクを表示できるみたいだが、この情報を見つけるのに苦労した。上記の解説サイトでも見当たらない。

SendPing

ブログ更新時に更新pingを送る。 まだ正常に動作するか未検証。

Blacklist(JP)

コメントスパム対策だったと思う。イマイチどういう効果があるのか検証していない。 NP_Captchaのほうがいいのかな?

TrackBack

トラックバック機能をつけるためのプラグイン。 最近トラックバックって廃れてるのかな?スパムも多いし。 トラックバック辞めるかも。

MultiTags

記事のカテゴリを階層化できるもの、だったっけ。。 まだちゃんと使ってない。

Markdown

Markdown記法という、Wiki記法にも似た感じでHTML文書を作成できる。 リンクや見出し、リストや引用文、画像なども独自の記法で簡単に書けます。 記法を覚えればだけどね・・・。 今はまだ記法を都度調べながら書いてます。

現在の課題

  • スキンとテンプレートの関係がいまだはっきりと理解できていない
  • 更新PINGの動作未検証

GoogleMapでマッシュアップの練習(Rails編) #7

では最終的に作ったソースをもとに解説していく。

main_controller.rb

require 'net/http'
require 'rexml/document'
require 'cgi'

class MainController < 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]}&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 => 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}&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

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

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

  1. ジオコードから地名をXML形式で取得
  2. 取得したXMLから都市名、町名などを取得(get_name_of_placeメソッド呼び出し)
  3. 取得できなければ終了
  4. 地名をもとに郵便番号をXML形式で取得
  5. 取得したXMLから郵便番号を取得(get_zipcodeメソッド呼び出し)
  6. 取得に失敗したらリトライ(町名は外して県名のみで取得)
  7. 郵便番号をもとに旅行記をXML形式で取得
  8. 取得したXMLから旅行記の配列を取得(TravelInfoクラス ※ソースは下)

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

travel_info.rb

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 > 0
    picture_link = doc.elements.each("pictlist/pictlink"){}
    @picture_link = picture_link[0].text if picture_link.size > 0
    area = doc.elements.each("area"){}
    @area = area[0].text if area.size > 0
    area_url = doc.elements.each("areaurl"){}
    @area_url = area_url[0].text if area_url.size > 0
    description = doc.elements.each("description"){}
    @description = description[0].text.split(//u)[0..100].join.gsub /\r?\n/, "<br />\r\n" if description.size > 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 > 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 << Travelogue.new(travelogue)
      }
    end
  end
end

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

search.rhtml

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

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

旅行記検索サイト

GoogleMapでマッシュアップの練習(Rails編) #6

エマージェンシー発生

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

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

ということで住所から郵便番号を取得する処理を一つ追加する。APIはぽすたんというサービスを見つけた。さっそく組み込んでみる。

処理内容はこういうふうになる。

[修正前]

  1. GoogleMAP上をクリック
  2. 住所取得(京都市など)
  3. 旅行記取得(これができない)

[修正後]

  1. GoogleMAP上をクリック
  2. 住所取得(京都市など)
  3. 郵便番号取得(605xxxxなど)
  4. 旅行記取得

上記処理を実装するのに、あれやこれやと結構時間を食ってしまって。
その経緯をブログに残すのを忘れてた・・・。
突然だけど、急転直下で次回完成!!!
(テキトーですみません)

GoogleMapでマッシュアップの練習(Rails編) #5

4travelにパラメータとして地名を送信するには、返されたXMLの中から地名だけを取りだす必要がある。難しいことはしないけどRubyでXMLをいじった経験はなし。きっとそういうライブラリがあるはず、と思って探すとREXMLというものを発見。日本語情報が少なくここを参考になんとかやってみた。

REXML:RubyによるXML処理

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

main_controller.rb

require 'net/http'
require 'rexml/document'

class MainController < 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]}&lat=#{params[:y]}")
    resXML = response.body
    site.finish

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

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

    render(:layout => 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

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

家からは少し離れてるけど・・・

«前へ || 1 | 2 | 3 |...| 11 | 12 | 13 || 次へ»

Home

Search
Feeds

Page Top