検索エンジン順位チェックAPIを公開します。

検索エンジン順位チェックツール」はこのAPIを経由して、
結果を表示させています。

検索エンジン順位チェックAPI

20100223-001

 

よろしければ使ってみてください。

 

Google App Engineで動いてますので、
CPUの使用量が規定を超えた場合、
サーバーが止まると思います。

そのときは、クローンを作ります。

 

ソースコードもそのうち公開しようと思っています。

ソースコードを公開するのは初めてですが、
がんばります。

開発サーバー立ち上げようとしたり、
モジュールをインストールしようとしたりすると、
エラーになる。

json関連がうまく動いてないっぽいところまではわかった。
jsonを扱っているところをコメントアウトしたら動いたから。

$ dev_appserver.rb .
=> Booting DevAppServer
=> Press Ctrl-C to shutdown server
=> Bundling gems
Calculating dependencies...
Updating source: http://gems.rubyforge.org
Installing json (1.2.0)
Building native extensions.  This could take a while...
/Library/Ruby/Site/1.8/rubygems/installer.rb:485: warning: conflicting chdir during another chdir block
/Library/Ruby/Site/1.8/rubygems/installer.rb:506: warning: conflicting chdir during another chdir block
ERROR:  While executing gem ... (Gem::Installer::ExtensionBuildError)
    ERROR: Failed to build gem native extension.

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby extconf.rb
mkmf.rb can't find header files for ruby at /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/ruby.h

Gem files will remain installed in /***/.gems/bundler_gems/jruby/1.8/gems/json-1.2.0 for inspection.
Results logged to /***/.gems/bundler_gems/jruby/1.8/gems/json-1.2.0/ext/json/ext/generator/gem_make.out

うーん、わからん。
未解決。

 

WEB-INF/web.xmlを編集して、
特定のアドレスにアクセス制限をかけようとしたけど、
開発用サーバーを立ち上げると、
web.xmlが上書きされて、消えちゃう。

web.xmlは下記のサイトを参考にして、編集してる。

GoogleAppEngine + JRubyでクリスマスまでに彼女をつくる方法 : tech.kayac.com – KAYAC engineers’ blog


<security-constraint>
  <web-resource-collection>
    <url-pattern>/cron/*</url>
  </web>
  <auth-constraint>
    <role-name>admin</role>
  </auth>
</security>

うーん、わからん。
未解決。

Twitterのパズーbotとシータbotを作りました。
まだ無さそうだったので。

ドーラbotは2つ(@madora_bot@Dolabot)あるのにね。

正直、まだ未完成だけど、とりあえず公開ってことで。

パズーbot
シータbot

 

仕様

2時間に1回、自動的にセリフをpostします。
(1時間に1回は多いと思ったので。)

リプライには反応しません。
(そのうち実装したい。)

セリフはフィルムコミックを参考にしたから、
映画とちょっと違うところがあるかも。

ご意見、ご要望はDMかコメントかメールでお願いします。

cronはcron-job.orgを使っています。
なので、たまに止まるかも。
(Google App Engineのcronがうまく設定できなかったので。そのうち対応する。)

技術的にはGoogle App Engine + JRuby + Sinatraです。
Sinatraの機能はあんまり使ってないけど。

Google App Engine、まだまだよくわかんないことがある。。。
勉強しないと。。。

 

今回のわからなかったこと

Google App Engineのcronがうまく設定できない。

下記サイトと同じようにやってるんだけどなぁ。

GoogleAppEngine + JRubyでクリスマスまでに彼女をつくる方法

$ appcfg.rb update_cron .

で、cron設定のみデプロイしたときの表示は下記。

$ appcfg.rb update_cron .
=> Running AppCfg
Reading application configuration data...
Beginning server interaction for ***...
0% Uploading cron jobs.
Unable to update cron entries for app: Error posting to URL: http://appengine.google.com/api/datastore/cron/update?app_id=***&version=1&
400 Bad Request
Empty cron configuration.

何かがダメらしい。
URLは間違ってないはずなんだけど。。。

 

Twitterのjsonの文字コード

Twitterのjsonを扱う文字コード関連がよくわからん。
どうやってutf-8に変換するの。。。

この問題が解決したら、リプライに反応するようにする。

 

ところで。

これ作るためにフィルムブック買ったよ。

DVDは以前から持ってたよ。

DVDは一家に一個、標準装備だよね。

天空の城ラピュタ [DVD]
天空の城ラピュタ [DVD]

天空の城ラピュタ (1) (アニメージュコミックススペシャル―アニメーション)
天空の城ラピュタ (1) (アニメージュコミックススペシャル―アニメーション)

天空の城ラピュタ (2) (アニメージュコミックススペシャル―アニメーション)
天空の城ラピュタ (2) (アニメージュコミックススペシャル―アニメーション)

天空の城ラピュタ (3) (アニメージュコミックススペシャル―アニメーション)
天空の城ラピュタ (3) (アニメージュコミックススペシャル―アニメーション)

天空の城ラピュタ (4) (アニメージュコミックススペシャル―アニメーション)
天空の城ラピュタ (4) (アニメージュコミックススペシャル―アニメーション)

OSを入れ直して、
GoogleAppEngineの設定をし直したら、
dev_appserver.rb が command not found と言われた。

コマンドのパスが通ってなかったっぽいので、
以下の方法でパスを通した。

export PATH=~/.gem/ruby/1.8/bin:$PATH

無事、dev_appserver.rb が実行できました。

めでたし、めでたし。

 

と思ったら、ターミナルを再起動するとパスが通らなくなる。
なので、「~/.bash_profile」に上記コマンドを追加したらOKでした。

めでたし、めでたし。

なんか、やってみたくなった。

GoogleAppEngineもJavaもRubyも初めてなんですけど、
できますかねぇ。。。

目標は潮ったーをGAEで動かす。

ちなみに環境は、Snow LeopardなMacBookです。

 

GoogleAppEngineのアカウント作成

下記リンクから適当に。

Applications Overview

 

Javaの環境確認

$ java -version
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04-248-10M3025)
Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01-101, mixed mode)

Javaは入ってるっぽい。

 

MacPortsのインストール

MacPortsをインストールしてなかった。。。

下記サイトよりSnow Leopard版をダウンロードして、インストール。

The MacPorts Project — Download & Installation

.bashrcに以下の2行を追加してパスを通す。

export PATH=/opt/local/bin:/opt/local/sbin/:$PATH
export MANPATH=/opt/local/man:$MANPATH

MacPortsのアップデート。

$ sudo port -d selfupdate

インストールできるソフトウェア一覧を更新。

$ sudo port -d sync

これで、MacPortsの準備はOK。
selfupdateとsyncは定期的に実行するといいらしいです。

 

Rubyのインストール

$ sudo port install ruby

ライブラリはいらないのかな。
わからん。

とりあえず、ライブラリの確認だけしておく。

$ sudo port list rb-*

 

Gemのインストール

Gemってなんだ。
初めて聞いた。

ググってみたら、「Rubyのパッケージマネジメントシステム」らしい。
へー。

portでインストールを試みる。

$ sudo port install rb-rubygems

Gemをインストールできたけど、
gemからgoogle-appengineをインストールするには、
バージョン1.3.5以上が必要らしい。

portから入れたgemは1.3.4でした。
なのでアンインストール。

$ sudo port uninstall rb-rubygems

gemをソースからインストールしようと思ったら、
wgetコマンドがないことが判明。
wgetをportでインストール。

$ sudo port install wget

改めてgemをソースからインストール。

$ wget http://rubyforge.org/frs/download.php/60718/rubygems-1.3.5.tgz
$ tar vzfx rubygems-1.3.5.tgz
$ cd rubygems-1.3.5
$ sudo ruby setup.rb
$ gem --version
1.3.5

gem 1.3.5 のインストール完了。

そしてダウンロードしたファイルの削除。

$ cd ../
$ rm -rf rubygems-1.3.5*

 

GoogleAppEngineのインストール

gemからgoogle-appengineのインストール。

$ sudo gem install google-appengine

 

Sinatraを動かす

とりあえず、下記サイトのまんま。
あとで復習すること。
自分に言ってます。

GoogleAppEngine + JRubyでクリスマスまでに彼女をつくる方法 : tech.kayac.com – KAYAC engineers’ blog

$ mkdir helloworld
$ cd helloworld
$ vi Gemfile
# Critical default settings:
disable_system_gems
disable_rubygems
bundle_path ".gems/bundler_gems"

# List gems to bundle here:
gem "sinatra"
gem "json"
gem "appengine-apis"

$ vi config.ru
require 'appengine-rack'

AppEngine::Rack.configure_app(
  :application => 'gae-project-name',
  :version => 1
)

require 'main'

run Sinatra::Application

$ vi main.rb
require 'rubygems'
require 'sinatra'

get '/' do
  'Hello World!!'
end

Gemfile内に書かれているモジュールをインストール。

$ appcfg.rb bundle .

開発用サーバーを立ち上げる。

$ dev_appserver.rb .

http://localhost:8080/にアクセスして「Hello World!!」と表示されればOK。

開発できたら、GoogleAppEngineにデプロイ。

$ appcfg.rb update .

デプロイって何だ。。。

デプロイとは 【deploy】 – 意味/解説/説明/定義 : IT用語辞典

 

http://[Your Application Identifier].appspot.com/ に「Hello World!!」と表示されればOK。

 

これで準備完了。
あとは開発するだけですな。
まずは、Sinatraの勉強からかな。。。

 

【参考】

「@shiotter_bot ○○(地域名)」で、
その地域の天気、潮、干潮、満潮、日の出、日の入りをリプライで返すTwitter Botを作りました。

釣りが趣味の方、是非使ってみてください。

潮ったー

 

技術的な事は、潮ったー@名古屋とほとんど同じです。
全国各地に対応したのと、リプライを返すようにしただけです。

 

使い方

  1. 「潮ったー」をフォローしてください。
  2. 「@shiotter ○○(地域名)」と話しかけてください。
  3. 5分ほど待つと、リプライが返ってきます。

 

明日、明後日の情報が知りたい場合

「@shiotter_bot ○○(地域名)の明日」とすると明日の情報を、
「@shiotter_bot ○○(地域名)の明後日」とすると明後日の情報をお知らせします。

「@shiotter_bot あしたの○○(地域名)」や「@shiotter_bot あさっての○○(地域名)」でも大丈夫です。

 

対応地域

対応している地域は下記の通りです。

  • 稚内
  • 留萌
  • 網走
  • 根室
  • 釧路
  • 室蘭
  • 浦河
  • 函館
  • 江差
  • 青森
  • 八戸
  • 秋田
  • 宮古
  • 大船渡
  • 酒田
  • 浜松
  • 名古屋
  • 富山
  • 金沢
  • 輪島
  • 新潟
  • 東京
  • 八丈島
  • 父島
  • 千葉
  • 銚子
  • 館山
  • 横浜
  • 舞鶴
  • 大阪
  • 神戸
  • 豊岡
  • 和歌山
  • 潮岬
  • 広島
  • 浜田
  • 西郷
  • 下関
  • 日和佐
  • 高松
  • 松山
  • 新居浜
  • 宇和島
  • 高知
  • 室戸
  • 清水
  • 大分
  • 長崎
  • 佐世保
  • 福江
  • 熊本
  • 宮崎
  • 鹿児島
  • 種子島
  • 名瀬
  • 那覇
  • 南大東島
  • 石垣島
  • 与那国島

上記以外の地域がなぜ対応していないかというと、
APIやWebサイトが対応していなかったからです。

だから、お探しの地域が対応していなかったらごめんなさい。

今後APIやWebサイトの対応地域が増えたら、対応できるかも。

 

今後の予定

作ってみて分かったけど、
これってTwitterである必要ないんじゃないかな。

普通のWebサイトでもいいし、
iPhoneアプリもいいかも。

ってことで、
次の予定としては、
Webサイト版とiPhone版を作ろうかな。

作れたらいいなぁ。

名古屋の天気、潮、干潮、満潮、日の出、日の入をお知らせするtwitter botを作りました。
最近釣りを趣味にした人に頼まれて作りました。)

毎日、午前6時にTwitterへ投稿します。
(2009年10月11日追記:午後6時に明日の情報をTwitterへ投稿する機能を追加しました。)

釣りが趣味の方、是非フォローしてください。

潮ったー@名古屋

 

天気は下記のWebAPIを利用しました。

お天気Webサービス仕様 – Weather Hacks – livedoor 天気情報

 

日の出、日の入は下記のWebAPIを利用しました。

日の出・日の入り時刻計算 Web API | おはこん番地は!? | ビットラボ | 株式会社ビットマイスター

 

潮、干潮、満潮はWebAPIが見つからなかったので、
tenki.jpの名古屋の情報をスクレイピングしました。
(怒られないよね。。。?)

波と潮位 – 名古屋 – 日本気象協会 tenki.jp

 

ちなみに、干潮、満潮の時間を取得するWebAPIはあったけど、
半年毎に申請するっていう規約があったので、
今回は利用しませんでした。

ktailab潮位API

 

スクレイピングの方法は下記サイトを参考にさせていただきました。

PHPでHTMLをパースする。 – purazumakoiの[はてな]
funkychicken.info blog | 【PHP】HTML Parserを使ってHTMLをパースする

PHP5だと比較的簡単にスクレイピングできるらしいけど、
自サバがPHP4なので、上記の方法を利用しました。

 

cronは、使ってみたかったcron-job.orgを使ってみました。
ドイツのサービスなので、下記のサイトを参考にユーザー登録など行いました。

cron タスクの設定 【 Cron-job.org の利用】 | ≡ Drupal Japan ≡

ちなみに、ドイツとの時差は7時間あるようです。
午前6時に実行しようと思ったら、
午後11時(23時)に実行するよう設定をしなければいけません。

 

今後の予定としては、
任意の地域の天気、潮、干潮、満潮、日の出、日の入の情報をお知らせする「潮ったー@全国版」を作る。

作りたい。
がんばる。

 

【2009年12月2日追記】

cron-job.orgが不安定なので、
サーバーのcronを使う事にしました。

[root@*** ~]# crontab -e
00 06,18 * * * php -f /***/***.php

cronの書き方は下記サイトを参考にさせていただきました。

crontabの書き方 — server-memo.net
Linuxのcronについての質問です。 PHPファイルを、cronで実行設定したところ正しく動作しませんでした。 解決策・原因などをご教示ください。 ※Linuxについての知識はあま.. – 人力検索はてな