2011/06/30

Google Map APIを使って、簡単に地名などから緯度、経度に変換が出来るPythonのモジュール「googlemaps」を使ってみました



Google Map APIを使って、簡単に geocoding や reverse geocoding が出来るPythonのモジュールがあります。

googlemaps 1.0.2
http://pypi.python.org/pypi/googlemaps/


ジオコーディングとは、住所や地名、駅名などの情報から、緯度・経度の座標値に変換する技術のことです。

住所から、緯度、経度への変換
> python
Python 2.5.2 [MSC v.1310 32 bit (Intel)] onwin32
>>> from googlemaps import GoogleMaps
>>> gmaps = GoogleMaps('API_Key')
>>> address = u'岡山市'
>>> lat, lng = gmaps.address_to_latlng(address)
>>> print lat, lng
34.6551456 133.9195019

サンプルでは、Google MapのAPIキーを使っての説明をしていますが、Google Maps API v3からは、APIキーは不要になったので、APIキーを渡さなくても操作できます。
>>> from googlemaps import GoogleMaps
>>> gmaps = GoogleMaps()
>>> address = u'岡山市'
>>> lat, lng = gmaps.address_to_latlng(address)
>>> print lat, lng
34.6551456 133.9195019

Linux上でも同様に動きます。

$ python
Python 2.6 [GCC 3.4.4 20050721 (Red Hat 3.4.4-2)] on linux2
>>> from googlemaps import GoogleMaps
>>> gmaps = GoogleMaps()
>>> address = u'岡山市'
>>> lat, lng = gmaps.address_to_latlng(address)
>>> print lat, lng
34.6551456 133.9195019

逆(緯度、経度から住所への変換)も可能です。
>>> destination = gmaps.latlng_to_address(34.6551456,133.9195019)
>>> print destination
岡山市役所

その近辺の検索

「秋葉原周辺のWifiスポットのある喫茶店」?の検索結果の最初のもの「」Japan town acupuncture & Oriental Medicine, Inc.」がヒット
>>> local = gmaps.local_search('cafes w. free power near akihabara')
>>> print local['responseData']['results'][0]['titleNoFormatting']
Japan town acupuncture & Oriental Medicine, Inc.
「Okayama」に変ると「Ryokan Misono Kurashiki」がヒット
>>> local = gmaps.local_search('cafes w. free power near Okayama')
>>> print local['responseData']['results'][0]['titleNoFormatting']
Ryokan Misono Kurashiki
「Okayamaの近くのschool」の検索結果の4番目のもの
>>> local = gmaps.local_search('school near Okayama')
>>> print local['responseData']['results'][3]['titleNoFormatting']
フラップアップゼミ
「岡山市」に変ると「鬼ヶ島宮ノ松原キャンプ場」がヒット
>>> local = gmaps.local_search(u'school near 岡山市')
>>> print local['responseData']['results'][3]['titleNoFormatting']
鬼ヶ島宮ノ松原キャンプ場
「岡山市の近くの学校」に変ると「KLCセミナー倉敷校」がヒット
>>> local = gmaps.local_search(u'学校 near 岡山市')
>>> print local['responseData']['results'][3]['titleNoFormatting']
KLCセミナー倉敷校

2011/06/26

「RSSの中に含まれる名詞の集計表を作成する」のRSSの読み込みの不具合解消しました。



「RSSの中に含まれる名詞の集計表を作成する」のRSSの読み込みの不具合解消しました。

mecab-pythonを使って、RSSの中に含まれる名詞の集計表を作るソースを試してみました。
http://vivo-design.blogspot.com/2011/06/mecab-pythonrss.html

の続きです。


Yahooの提供するRSSであれば、問題なく読めるのですが、それ以外は、「Failed to parse feed」となる点が解消しました。修正したソースで作成した集計表です。Yahoo以外のRSSを読み込んで、集計が出来ました。私が試行錯誤していた時に追記したものが、不要なだけでした。


修正したソース

analysis_rss_feed.py
本体
#coding:utf-8
import re
import csv
import MeCab
import feedparser
from extractKeyword  import extractKeyword


#=====================
# ----- set URLs -----
#=====================

"""
# IT関連
URLs = ['http://headlines.yahoo.co.jp/rss/itmedia_ait.xml',
        'http://headlines.yahoo.co.jp/rss/bcn.xml',
        'http://headlines.yahoo.co.jp/rss/impress_c_sci.xml',
        'http://headlines.yahoo.co.jp/rss/rbb.xml',
        'http://headlines.yahoo.co.jp/rss/scan.xml']

# 雑誌関連
URLs = ['http://zasshi.news.yahoo.co.jp/rss/sspa.xml',
        'http://zasshi.news.yahoo.co.jp/rss/sasahi.xml',
        'http://zasshi.news.yahoo.co.jp/rss/shincho.xml',
        'http://zasshi.news.yahoo.co.jp/rss/sbunshun.xml',
        'http://zasshi.news.yahoo.co.jp/rss/chuokou.xml',
        'http://zasshi.news.yahoo.co.jp/rss/playboyz.xml',
        'http://zasshi.news.yahoo.co.jp/rss/gendaibiz.xml',
        'http://zasshi.news.yahoo.co.jp/rss/bshunju.xml']
"""
# 一般のニュース関連
URLs = ['http://rss.asahi.com/f/asahi_newsheadlines',
        'http://rss.rssad.jp/rss/mainichi/flash.rss',
        'http://rss.yomiuri.co.jp/rss/yol/topstories',
        'http://sankei.jp.msn.com/rss/news/points.xml',
        'http://www.jiji.com/rss/ranking.rdf',
        'http://www.kyodo.co.jp/feed/']


#===============================
# ----- category selection -----
#===============================
class_num = 0
word_classes = [u'名詞',u'動詞',u'形容詞',u'副詞',u'助詞',u'助動詞']
word_class = word_classes[class_num]

#==============================
# ----- defined functions -----
#==============================
def getwordcounts(url):
    """RSSフィードのタイトルと、単語の頻度のディクショナリを返す"""
    # フィードをパースする
    d = feedparser.parse(url)
    wc={}
    
    # すべてのエントリをループする
    # RSSの種類によって,記事に相当する部分が異なることに対応する
    for e in d.entries:

        # 追加したこの部分が不要でした
        # if 'summary_detail' in e: summary = e.summary_detail
        if 'summary' in e: summary = e.summary

        elif 'description' in e: summary = e.description
        else: summary = e.link

        # 単語のリストを取り出す
        words = getwords(e.title+' '+summary)
        # extractKeywordを用いるため,単語を連結してテキスト化
        txt = ''
        for i in range(len(words)):
            txt += words[i]
        words_sub = extractKeyword(txt,word_class)
        
        for word in words_sub:
            # dict型のkeyにwordがなければ,value=0として新設
            wc.setdefault(word,0)
            wc[word] += 1
    return d.feed.title,wc

def getwords(html):
    """すべてのHTMLタグを取り除き,単語リストを返す"""

    # htmlから'<[^>]+>'を''に置き換える
    txt = re.compile(r'<[^>]+>').sub('',html)
    tagger = MeCab.Tagger('-Owakati')
    txt = txt.encode('utf-8')
    return tagger.parse(str(txt)).split(' ')
    # return tagger.parse(txt.encode('utf-8')).split(' ')
    # return tagger.parse(txt.encode('euc-jp')).split(' ')

def main():
    apcount = {}
    wordcounts = {}
    feedlist = [line for line in URLs]
    for feedurl in feedlist:
        wc = {}
        try:
            title,wc_ini = getwordcounts(feedurl)

            for w,bc in wc_ini.items():

                # csvで日本語を表示させるため,Shift_JIS化
                # この部分はエンコードをかけると、どの文字コード
                # でも、エラーになりました。
                # wc.setdefault(w.encode('sjis'),bc)

                wc.setdefault(w,bc)

            wordcounts[title] = wc

            # for word,count in wc.items():
            for word,count in wc.items():
                apcount.setdefault(word,0)
                if count>1:
                    # それぞれの単語が出現するフィードの数を数える
                    apcount[word]+=1
        except:
            # urlが認識できなければエラー表示
            print 'Failed to parse feed %s' % feedurl
    
    # でたらめな単語が存在するフィードがあることや
    # 一般的な単語の除外を考慮し,単語の出現率に敷居値を設定する
    wordlist = []
    for w,bc in apcount.items():
        frac = float(bc)/len(feedlist)
        if frac>0.1 and frac<0.5: wordlist.append(w)
    
    # csvへの書き込み用リストを生成
    header = ['Feed_name']+wordlist
    rows = []
    for blog,wc in wordcounts.items():
        # row = [blog.encode('sjis')]
        row = [blog.encode('utf-8')]
        for word in wordlist:
            if word in wc: row.append(wc[word])
            else: row.append('0')
        rows.append(row)
    
    # csvへ書き込み
    csv_writer = csv.writer(open('rss_data.csv','w'),lineterminator='\n')
    csv_writer.writerow(header)
    csv_writer.writerows(rows)    
    
if __name__ == "__main__":
    main()
修正したのは、下記の2箇所
# 一般のニュース関連
URLs = ['http://rss.asahi.com/f/asahi_newsheadlines',
        'http://rss.rssad.jp/rss/mainichi/flash.rss',
        'http://rss.yomiuri.co.jp/rss/yol/topstories',
        'http://sankei.jp.msn.com/rss/news/points.xml',
        'http://www.jiji.com/rss/ranking.rdf',
        'http://www.kyodo.co.jp/feed/']

途中略

# 追加したこの部分が不要でした
# if 'summary_detail' in e: summary = e.summary_detail
if 'summary' in e: summary = e.summary

この部分が無くても、どのRSSでも正常に動作しました。

mecab-pythonを使って、RSSの中に含まれる名詞の集計表を作るソースを試してみました。



mecab-pythonを使って、何か面白いサンプルは無いかなと探していたら、下記の記事を見つけました。

RSSフィードから単一品詞の単語別出現数を取得してみた.
http://d.hatena.ne.jp/r_e10/20110420/1303326055


面白そうなので、試してみました。今回は、自宅のサーバのPython2.6(fedoraの古いバージョン)で試します。

出来た集計表が下記のものです。

RSSの中に含まれる名詞を取り出し、その名詞の出現数を集計したCSVの表を作成するものです。


しかし、なかなか上手くいきませんでした。起こったエラーをまとめます。

エラーその1 そもそもRSSのフィードが読めない

「Failed to parse feed」というエラーが出ます。Yahooの提供するものであれば、問題なく読めるのですが、それ以外は、「Failed to parse feed」となります。各feedの構成を調べれば、解決するのかもしれませんが、現時点では、YahooのRSSだけで動作させてみます。

エラーその2 UnicodeEncodeError

色々なUnicode系のエラーが出ました。色々な対応を試しすぎて、結局、どれが有効なのか、はっきりとは分かっていません。まず、下記のサイトの記述を参考に、mecab-ipadic(辞書)のインストールをし直しました。

Python による日本語自然言語処理
http://nltk.googlecode.com/svn/trunk/doc/book-jp/ch12.html
MeCabの文字コードはデフォルトのEUC-JPからUTF-8に変更
Unix環境においては、辞書をインストールする際に、

% ./configure --with-charset=utf8
% make
% su
# make install

ソースコードの修正

analysis_rss_feed.py
本体のファイル
#coding:utf-8
import re
import csv
import MeCab
import feedparser
from extractKeyword  import extractKeyword


#=====================
# ----- set URLs -----
#=====================

"""
# IT関連
URLs = ['http://headlines.yahoo.co.jp/rss/itmedia_ait.xml',
        'http://headlines.yahoo.co.jp/rss/bcn.xml',
        'http://headlines.yahoo.co.jp/rss/impress_c_sci.xml',
        'http://headlines.yahoo.co.jp/rss/rbb.xml',
        'http://headlines.yahoo.co.jp/rss/scan.xml']
"""

# 雑誌関連
URLs = ['http://zasshi.news.yahoo.co.jp/rss/sspa.xml',
        'http://zasshi.news.yahoo.co.jp/rss/sasahi.xml',
        'http://zasshi.news.yahoo.co.jp/rss/shincho.xml',
        'http://zasshi.news.yahoo.co.jp/rss/sbunshun.xml',
        'http://zasshi.news.yahoo.co.jp/rss/chuokou.xml',
        'http://zasshi.news.yahoo.co.jp/rss/playboyz.xml',
        'http://zasshi.news.yahoo.co.jp/rss/gendaibiz.xml',
        'http://zasshi.news.yahoo.co.jp/rss/bshunju.xml']

#===============================
# ----- category selection -----
#===============================
class_num = 0
word_classes = [u'名詞',u'動詞',u'形容詞',u'副詞',u'助詞',u'助動詞']
word_class = word_classes[class_num]

#==============================
# ----- defined functions -----
#==============================
def getwordcounts(url):
    """RSSフィードのタイトルと、単語の頻度のディクショナリを返す"""
    # フィードをパースする
    d = feedparser.parse(url)
    wc={}
    
    # すべてのエントリをループする
    # RSSの種類によって,記事に相当する部分が異なることに対応する
    for e in d.entries:
        if 'summary' in e: summary = e.summary

        #  add for yahoo.co.jp_rss
        if 'summary_detail' in e: summary = e.summary_detail

        elif 'description' in e: summary = e.description
        else: summary = e.link

        # 単語のリストを取り出す
        words = getwords(e.title+' '+summary)
        # extractKeywordを用いるため,単語を連結してテキスト化
        txt = ''
        for i in range(len(words)):
            txt += words[i]
        words_sub = extractKeyword(txt,word_class)
        
        for word in words_sub:
            # dict型のkeyにwordがなければ,value=0として新設
            wc.setdefault(word,0)
            wc[word] += 1
    return d.feed.title,wc

def getwords(html):
    """すべてのHTMLタグを取り除き,単語リストを返す"""

    # htmlから'<[^>]+>'を''に置き換える
    txt = re.compile(r'<[^>]+>').sub('',html)
    tagger = MeCab.Tagger('-Owakati')
    txt = txt.encode('utf-8')
    return tagger.parse(str(txt)).split(' ')

def main():
    apcount = {}
    wordcounts = {}
    feedlist = [line for line in URLs]
    for feedurl in feedlist:
        wc = {}
        try:
            title,wc_ini = getwordcounts(feedurl)

            for w,bc in wc_ini.items():

                # csvで日本語を表示させるため,Shift_JIS化
                # この部分はエンコードをかけると、どの文字コード
                # でも、エラーになりました。
                # wc.setdefault(w.encode('sjis'),bc)

                wc.setdefault(w,bc)

            wordcounts[title] = wc

            # for word,count in wc.items():
            for word,count in wc.items():
                apcount.setdefault(word,0)
                if count>1:
                    # それぞれの単語が出現するフィードの数を数える
                    apcount[word]+=1
        except:
            # urlが認識できなければエラー表示
            print 'Failed to parse feed %s' % feedurl
    
    # でたらめな単語が存在するフィードがあることや
    # 一般的な単語の除外を考慮し,単語の出現率に敷居値を設定する
    wordlist = []
    for w,bc in apcount.items():
        frac = float(bc)/len(feedlist)
        if frac>0.1 and frac<0.5: wordlist.append(w)
    
    # csvへの書き込み用リストを生成
    header = ['Feed_name']+wordlist
    rows = []
    for blog,wc in wordcounts.items():
        # row = [blog.encode('sjis')]
        row = [blog.encode('utf-8')]
        for word in wordlist:
            if word in wc: row.append(wc[word])
            else: row.append('0')
        rows.append(row)
    
    # csvへ書き込み
    csv_writer = csv.writer(open('rss_data.csv','w'),lineterminator='\n')
    csv_writer.writerow(header)
    csv_writer.writerows(rows)    
    
if __name__ == "__main__":
    main()
修正したのは、下記の3箇所
#  add for yahoo.co.jp_rss
if 'summary_detail' in e: summary = e.summary_detail

# wc.setdefault(w.encode('sjis'),bc)
wc.setdefault(w,bc)

# row = [blog.encode('sjis')]
row = [blog.encode('utf-8')]
extractKeyword.py テキストを形態素解析して、名詞のみのリストを返すためファイル
#coding:utf-8
import MeCab

#=====================
# ----- set text -----
#=====================
test_txt = u'PythonからMeCabの形態素解析機能を使ってみました。'

#===============================
# ----- category selection -----
#===============================
class_num = 0
word_classes = [u'名詞',u'動詞',u'形容詞',u'副詞',u'助詞',u'助動詞']
word_class = word_classes[class_num]

#==============================
# ----- defined functions -----
#==============================

def extractKeyword(text,word_class):
    """textを形態素解析して、名詞のみのリストを返す"""
    
    tagger = MeCab.Tagger('-Ochasen')
    # node = tagger.parseToNode(text.encode('utf-8'))
    node = tagger.parseToNode(text)
    keywords = []
    while node:
        # if node.feature.split(",")[0] == word_class:
        if node.feature.split(",")[0] == word_class.encode('utf-8'):
            keywords.append(node.surface)
        node = node.next
    return keywords

def main():
    keywords = extractKeyword(test_txt)
    for w in keywords:
        print w,

if __name__ == "__main__":
    main()
修正したのは、下記の2箇所
# node = tagger.parseToNode(text.encode('utf-8'))
node = tagger.parseToNode(text)

# if node.feature.split(",")[0] == word_class:
if node.feature.split(",")[0] == word_class.encode('utf-8'):

2011/06/22

MeCab(オープンソース形態素解析エンジン)のPythonのバインディングをインストールしてみました。



MeCabとは、オープンソース形態素解析エンジンです。形態素解析とは、自然言語で書かれた文を、形態素(言語で意味を持つ最小単位)に分割する技術のこと。MeCabは、いくつかある形態素解析エンジンのひとつです。

MeCab (和布蕪)とは
http://mecab.sourceforge.net/


MeCabのスクリプト言語バインディングより、Pythonによるバインディング「mecab-python」をインストールしてみました。

MeCabのスクリプト言語のバインディング
http://mecab.sourceforge.net/bindings.html

さくらのVPSにインストールしてみました。

mecabのインストール
$ wget http://sourceforge.net/projects/mecab/files/mecab/0.98/mecab-0.98.tar.gz
$ tar vxzf mecab-0.98.tar.gz
$ cd mecab-0.98.tar.gz
$ ./configure
$ make
$ sudo make install

mecab-ipadic(辞書)のインストール
$ wget http://sourceforge.net/projects/mecab/files/mecab-ipadic/2.7.0-20070801/mecab-ipadic-2.7.0-20070801.tar.gz
$ tar vxzf mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801
$ ./configure
$ make
$ sudo make install

mecab-pythonのインストール
$ wget http://sourceforge.net/projects/mecab/files/mecab-python/0.98/mecab-python-0.98.tar.gz
$ tar vxzf mecab-python-0.98.tar.gz
$ cd mecab-python-0.98
$ python setup.py build
$ su
# python setup.py install

Pythonでの確認 import MeCabでエラーが出ます
$ python
Python 2.4.3 (#1, May  5 2011, 16:39:10)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-50)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import MeCab
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "MeCab.py", line 25, in <module>
    _MeCab = swig_import_helper()
  File "MeCab.py", line 17, in swig_import_helper
    import _MeCab
ImportError: libmecab.so.1: cannot open shared object file: No such file or directory

共有モジュールを認識してないので、認識させます
$ sudo vi /etc/ld.so.conf
/usr/local/lib を追加
$ sudo /sbin/ldconfig

再度pythonでの確認
$ python
Python 2.4.3 (#1, May  5 2011, 16:39:10)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-50)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import MeCab
>>> m = MeCab.Tagger()
>>> print m.parse("また企業公式ページの「いいね!」を押したことがある人に、ページを見た後その企業に対して何かアクションをとったかどうかを聞いたところ")
また    接続詞,*,*,*,*,*,また,マタ,マタ
企業    名詞,一般,*,*,*,*,企業,キギョウ,キギョー
公式    名詞,形容動詞語幹,*,*,*,*,公式,コウシキ,コーシキ
ページ  名詞,一般,*,*,*,*,ページ,ページ,ページ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
「      記号,括弧開,*,*,*,*,「,「,「
いい    形容詞,自立,*,*,形容詞・イイ,基本形,いい,イイ,イイ
ね      助詞,終助詞,*,*,*,*,ね,ネ,ネ
!      記号,一般,*,*,*,*,!,!,!
」      記号,括弧閉,*,*,*,*,」,」,」
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
押し    動詞,自立,*,*,五段・サ行,連用形,押す,オシ,オシ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
こと    名詞,非自立,一般,*,*,*,こと,コト,コト
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
ある    動詞,自立,*,*,五段・ラ行,基本形,ある,アル,アル
人      名詞,一般,*,*,*,*,人,ヒト,ヒト
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
、      記号,読点,*,*,*,*,、,、,、
ページ  名詞,一般,*,*,*,*,ページ,ページ,ページ
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見      動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
後      名詞,非自立,副詞可能,*,*,*,後,ノチ,ノチ
その    連体詞,*,*,*,*,*,その,ソノ,ソノ
企業    名詞,一般,*,*,*,*,企業,キギョウ,キギョー
に対して        助詞,格助詞,連語,*,*,*,に対して,ニタイシテ,ニタイシテ
何      名詞,代名詞,一般,*,*,*,何,ナニ,ナニ
か      助詞,副助詞/並立助詞/終助詞,*,*,*,*,か,カ,カ
アクション      名詞,一般,*,*,*,*,アクション,アクション,アクション
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
とっ    動詞,自立,*,*,五段・ラ行,連用タ接続,とる,トッ,トッ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
か      助詞,副助詞/並立助詞/終助詞,*,*,*,*,か,カ,カ
どう    副詞,助詞類接続,*,*,*,*,どう,ドウ,ドー
か      助詞,副助詞/並立助詞/終助詞,*,*,*,*,か,カ,カ
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
聞い    動詞,自立,*,*,五段・カ行イ音便,連用タ接続,聞く,キイ,キイ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
ところ  名詞,非自立,副詞可能,*,*,*,ところ,トコロ,トコロ
EOS

形態素解析が出来ました。

2011/06/18

さくらのVPSにインストールしたRails3を使ったscaffoldジェネレータチュートリアルの続きです。



さくらのVPSにインストールしたRails3を使ったscaffoldジェネレータチュートリアルの続きです。「Ruby on Rails入門のscaffoldジェネレータ」のチュートリアルで、前回、mysql2の設定で終わったところの続きです。


scaffoldジェネレータの実行
http://www.rubylife.jp/rails/scaffold/index3.html

scaffoldジェネレータを実行します。
$ ./script/rails g scaffold infomation id:integer name:string
invoke  active_record
create    db/migrate/20110618033416_create_infomations.rb
create    app/models/infomation.rb
invoke    test_unit
create      test/unit/infomation_test.rb
create      test/fixtures/infomations.yml
 route  resources :infomations
invoke  scaffold_controller
create    app/controllers/infomations_controller.rb
invoke    erb
create      app/views/infomations
create      app/views/infomations/index.html.erb
create      app/views/infomations/edit.html.erb
create      app/views/infomations/show.html.erb
create      app/views/infomations/new.html.erb
create      app/views/infomations/_form.html.erb
invoke    test_unit
create      test/functional/infomations_controller_test.rb
invoke    helper
create      app/helpers/infomations_helper.rb
invoke      test_unit
create        test/unit/helpers/infomations_helper_test.rb
invoke  stylesheets
create    public/stylesheets/scaffold.css

scaffoldジェネレータによって作成されたマイグレーション定義ファイルを使ってテーブルを作成します。WARNINGが表示されましたが、テーブル作成は出来たようです。
$ rake db:migrate
WARNING: Global access to Rake DSL methods is deprecated.  Please include
    ...  Rake::DSL into classes and modules which use the Rake DSL methods.
WARNING: DSL method Customer::Application#task called at /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/application.rb:215:in `initialize_tasks'
==  CreateInfomations: migrating =============
-- create_table(:infomations)
   -> 0.0065s
==  CreateInfomations: migrated (0.0071s) ====

WEBrickサーバを起動して、アプリの動作確認すると、正常動作しますが、日本語が文字化けします。




下記のサイトの記述を参考にMySQLの文字コード設定を変更します。

Ruby on RailsとMySQLで日本語(UTF-8)を使う
http://www.amatiny.com/blog/2008/02/ruby-on-railsmysqlutf8.html

一度、MySQLの該当のテーブルを削除します。
mysql> show tables;
+-------------------+
| Tables_in_railsdb |
+-------------------+
| infomations       |
| schema_migrations |
+-------------------+
2 rows in set (0.00 sec)

mysql> drop table infomations;
Query OK, 0 rows affected (0.02 sec)

mysql> drop table schema_migrations;
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
Empty set (0.00 sec)

etc/my.cnfを下記の設定に変更します。
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
default-character-set = utf8

# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
# symbolic-links=0

[mysql.server]
user=mysql
basedir=/var/lib
default-character-set = utf8

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
default-character-set = utf8

[mysql]
default-character-set = utf8

再度、テーブルを作成します。
$ rake db:migrate

WEBrickサーバを起動します。
$ ./script/rails s

今度は日本語が化けませんでした。


さくらのVPSにインストールしたRails3を使ってチュートリアルをしてみます。



さくらのVPSにインストールしたRails3を使ってチュートリアルをしてみます。「Ruby on Rails入門」というサイトの内容を試してみます。但し、コマンドは、Rails3以前のものなので、コマンドの部分は読み替えていきます。

Ruby on Rails入門
http://www.rubylife.jp/rails/


「コントローラとアクションの作成」「ビューの作成」「アプリケーションへのアクセス」を確認します。mainというコントローラーを作成し、2つのビューを作成します。
$ ./script/rails g controller main
$ vi hello.html.erb
$ vi bye.html.erb

WEBrickサーバを起動します。
$ ./script/rails s

「Routing Error」が表示されました。routes.rb にある最下部の一行のコメントアウトを外すと解決しました。
# match ':controller(/:action(/:id(.:format)))'
下記に変更
match ':controller(/:action(/:id(.:format)))'

次に「scaffoldジェネレータの利用」を試します。

scaffoldジェネレータの利用
http://www.rubylife.jp/rails/scaffold/

MySQLを使用したアプリケーションを作成します。
$ rails new customer -d mysql

MySQLのデータベースを用意します。
$ mysql -u root
mysql> create database railsdb;
mysql> grant all on railsdb.* to foo@localhost identified by 'somepassword';

WEBrickサーバを起動すると、エラーが表示されます。
$ ./script/rails s
Could not find gem 'mysql2 (>= 0, runtime)' in any of the gem sources listed in your Gemfile.

mysql-develが入っていなかったのが原因らしいのでyumで入れます。
$ sudo yum -y install mysql-devel

依存関係をもったプログラムを一気にインストールします。
$ sudo bundle install
Fetching source index for http://rubygems.org/
Installing rake (0.9.2)
Using abstract (1.0.0)
Using activesupport (3.0.7)
Using builder (2.1.2)
Using i18n (0.5.0)
Using activemodel (3.0.7)
Using erubis (2.6.6)
Using rack (1.2.3)
Using rack-mount (0.6.14)
Using rack-test (0.5.7)
Installing tzinfo (0.3.28)
Using actionpack (3.0.7)
Using mime-types (1.16)
Using polyglot (0.3.1)
Using treetop (1.4.9)
Using mail (2.2.19)
Using actionmailer (3.0.7)
Using arel (2.0.10)
Using activerecord (3.0.7)
Using activeresource (3.0.7)
Using bundler (1.0.14)
Installing mysql2 (0.3.6) with native extensions
Using thor (0.14.6)
Using railties (3.0.7)
Using rails (3.0.7)
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.

WEBrickサーバを再度起動します。無事起動しましたが、「About your application’s environment」のクリックで エラーが発生します。
RuntimeError (Please install the mysql2 adapter: `
gem install activerecord-mysql2-adapter` 
(no such file to load -- active_record/connection_adapters/mysql2_adapter)):

エラーメッセージに従い、activerecord-mysql2-adapter をインストールしますが、エラーになります。
ERROR:  Could not find a valid gem 'activerecord-mysql2-adapter' (>= 0) in any repository

mysql2アダプタの0.3系のバージョンは、Rails 3.1向けのようです。Rails 3.0で使うには、mysql2の0.2系を指定する必要があるとのこと。Gemfileのgem 'mysql2'の行を以下のように変更します。
gem 'mysql2', '< 0.3'
再度、bundle installします。
$ sudo bundle install

WEBrickサーバを再度起動、起動確認、表示OK、「About your application’s environment」も正常に表示されました。

「scaffoldジェネレータの利用」については、次回に。

2011/06/16

さくらVPSサーバにa-blog cmsをインストールしてみました。



CMSの構築には、a-blog cmsが使いやすいですよ。と教えてもらったので、試してみました。さくらのVPSサーバに試しにインストールしてみます。

a-blog cms - Web制作者のためのCMS
http://www.a-blogcms.jp/


インストールマニュアルには、動作環境は、下記のように記載されています。

• PHP 5.0 以降
• MySQL 5.0 以降
• ionCubeローダー(無料)が動作すること。
• PHP用グラフィックライブラリGDが使用可能であること。
• PHP 5.2.5以前の場合は、php.ini の safe_mode が Off であるか、
 またはphp.iniが編集が可能であること。PHP
 5.2.5以降の場合はphp.iniが編集可能であること。
• 「.htaccess」の設定が可能であること。

まず、インストール可能なPHPの環境を調べます。
$ sudo yum list | grep php
php53.x86_64           5.3.3-1.el5_6.1  updates
php53-bcmath.x86_64    5.3.3-1.el5_6.1  updates
php53-cli.x86_64       5.3.3-1.el5_6.1  updates
php53-common.x86_64    5.3.3-1.el5_6.1  updates
php53-dba.x86_64       5.3.3-1.el5_6.1  updates
php53-devel.x86_64     5.3.3-1.el5_6.1  updates
php53-gd.x86_64        5.3.3-1.el5_6.1  updates
php53-imap.x86_64      5.3.3-1.el5_6.1  updates
php53-intl.x86_64      5.3.3-1.el5_6.1  updates
php53-ldap.x86_64      5.3.3-1.el5_6.1  updates
php53-mbstring.x86_64  5.3.3-1.el5_6.1  updates
php53-mysql.x86_64     5.3.3-1.el5_6.1  updates
php53-odbc.x86_64      5.3.3-1.el5_6.1  updates
php53-pdo.x86_64       5.3.3-1.el5_6.1  updates
php53-pgsql.x86_64     5.3.3-1.el5_6.1  updates
php53-process.x86_64   5.3.3-1.el5_6.1  updates
php53-pspell.x86_64    5.3.3-1.el5_6.1  updates
php53-snmp.x86_64      5.3.3-1.el5_6.1  updates
php53-soap.x86_64      5.3.3-1.el5_6.1  updates
php53-xml.x86_64       5.3.3-1.el5_6.1  updates
php53-xmlrpc.x86_64    5.3.3-1.el5_6.1  updates

PHP5.3がインストールできるようなので、必要になるかも知れないものも含めてインストールします。
sudo yum -y install php53 php53-devel php53-gd php53-mbstring php53-xml php53-mysql

Apacheのバージョンを調べます。
$ sudo yum list | grep http
httpd.x86_64  2.2.3-45.el5.centos.1  installed

.htaccessが使える必要があるので、設定しておきます。
vi /etc/httpd/conf/httpd.conf

MySQLの5.5をインストールしようと思って、レポジトリを追加してインストールしたのですが・・・
sudo rpm -ivh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
sudo rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
sudo yum --enablerepo=remi-test install mysql mysql-server  

インストールされたのは、MySQL5.0でした。
$ sudo yum list | grep mysql
mysql.i386           5.0.77-4.el5_6.6  installed
mysql.x86_64         5.0.77-4.el5_6.6  installed
mysql-server.x86_64  5.0.77-4.el5_6.6  installed

a-blog cms用のデータベースをMySQLに用意しておきます。
mysql> CREATE DATABASE ablogcms;
mysql> grant all on ablogcms.* to foo@localhost identified by 'somepassword';

後は、a-blog cmsのインストールマニュアルに従ってインストールしていきます。



インストール完了後、トップページは表示されましたが、大量にエラーが表示されました。php.iniにtimezoneの設定をしていないのが原因のようでした。下記の設定をして、エラーは表示されなくなりました。
date.timezone = Asia/Tokyo


トップページから、別のページに行くと(ログインページ、カレンダーページなど)すべて、Not Foundの表示になります。公開ディレクトリのサブディレクトリにa-blog cmsをインストールしたので、.htaccessのRewriteBaseの設定が必要でした。
RewriteBase /
これを
RewriteBase /hogehoge
に修正

正常にリンクが動作するようになりました。




確かに使いやすそうです。まずは、お試し期間中 しばらく触ってみます。

2011/06/13

天然温泉「大家族の湯」に行ってきました。



岡山市久米に最近出来た「岡山みやび温泉 大家族の湯」に行って来ました。出来たばかりなので、中はどこをみてもキレイで気持ちいいです。

天然温泉 大家族の湯【岡山市北区久米】
http://www.daikazokunoyu.com/okayama/


いろいろなお風呂があり、子どもたちも楽しんでいました。子どもたちが気に入ったのは「あるき湯」でした。全長18メートルあるお風呂で、腰まで浸かりながら水流に逆らいながら歩くと、いい運動になります。露天風呂には、テレビが設置されていて、テレビをみながらお湯に浸かることが出来ます。また行きたいと思います。

2011/06/07

Adobe® Dreamweaver® CS5.5を使って、PhoneGapでAndroidおよびiOSのネイティブアプリケーションを構築できるそうです。



Adobe® Dreamweaver® CS5.5を使って、PhoneGapでAndroidおよびiOSのネイティブアプリケーションを構築できるそうです。会社のミーティングにて、スタッフに教えてもらいました。


Dreamweaver製品概要
http://www.adobe.com/jp/products/dreamweaver.html
PhoneGapでAndroidおよびiOSのネイティブアプリケーションを構築

スタッフミーティングにて紹介してもらったテスト用のアンドロイドアプリをHT-03A(Android 1.6)にインストールしてみました。動作しました。



2011/06/05

折りたたみ自転車BD-1(Birdy)を玄関のスペースに置くための自転車スタンドを探しています。



「BD-1(Birdy)」とは、ドイツのメーカー「riese & muller」社の折りたたみ自転車です。折りたたみで小さくなるので、玄関に置いているのですが、子どもが大きくなるにつれて、玄関がだんだんと狭くなってきました。「BD-1(Birdy)」を玄関に収納できる方法を探しています。


riese & muller BD-1(Birdy)のメーカー
http://www.r-m.de/

Birdy(BD-1)の折りたたみ方の分かるページ
http://www.r-m.de/produkte/produktfinder/faltgenie/birdy/

下記のどちらかがいいかと思っていますが、「BD-1(Birdy)」を折りたたんだ状態で、スタンドに掛けることが出来るかどうかがわからないので、調べています。





標準のアタッチメントで掛けることができるのかどうか・・・

2011/06/04

さくらVPSへruby on railsをインストールしてみました。



さくらVPSへruby on railsをインストールしてみました。色々なサイトの記載を参考にRails 3.0.7をインストールしました。


Rubyのコンパイルに必要なものをインストールします。
$ sudo yum install openssl-devel zlib-devel readline-devel

Ruby1.9.2をインストールします。
$ wget ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.9.2-rc2.tar.gz
$ tar xfvz ruby-1.9.2-rc2.tar.gz
$ cd ruby-1.9.2-rc2
$ ./configure
$ make
$ sudo make install

この後、rubygemsをインストールしました。(後で分かったのですが、このインストールは不要でした。)
$ wget http://rubyforge.org/frs/download.php/69365/rubygems-1.3.6.tgz
$ tar xvzf rubygems-1.3.6.tgz
$ cd rubygems-1.3.6
$ ruby setup.rb

rubygemsの確認をすると、エラーが表示されます。
$ gem -v
/usr/local/lib/ruby/site_ruby/1.9.1/rubygems/gem_runner.rb:86:in `': undefined method `load_plugins' for Gem:Module (NoMethodError)
        from /usr/local/bin/gem:9:in `require'
        from /usr/local/bin/gem:9:in `
'

調べてみると、Ruby1.9.2には、gemは含まれているようなので、rubygemsのインストールが不要でした。2つのgemをインストールしたことによって、PATHに何か不具合が発生したような感じです。ruby-1.9.2-rc2とrubygems-1.3.6でインストールしたものを一度削除して、再度、ruby-1.9.2-rc2をインストールしました。

この状態で、各バージョンを確認
$ ruby -v
ruby 1.9.2dev (2010-07-11 revision 28618) [x86_64-linux]
$ gem -v
1.3.7

ここから、ruby on railsのインストール
$ sudo gem install rails --include-dependencies

railsのアプリケーションを作成します。
$ rails new ~/hoge_rails

データベースは、sqlite3を使うようにするので、インストールします。yumのインストールでは、sqlite3.3.6以上は、インストールできないとのこと、sqlite3.6.16以上が必要なので、ソースからインストールします。
$ wget http://www.sqlite.org/sqlite-autoconf-3070603.tar.gz
$ tar vxzf sqlite-autoconf-3070603.tar.gz
$ ./configure
$ make
$ sudo make install

sqlite3用Rubyのライブラリをインストールします。
$ sudo gem install sqlite3-ruby

railsのアプリケーションの階層にある起動スクリプトで、サーバを立ち上げます。
$ ./script/rails server
=> Booting WEBrick
=> Rails 3.0.7 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2011-06-04 17:57:52] INFO  WEBrick 1.3.1
[2011-06-04 17:57:52] INFO  ruby 1.9.2 (2010-07-11) [x86_64-linux]
[2011-06-04 17:57:52] INFO  WEBrick::HTTPServer#start: pid=30103 port=3000

該当URLの3000番ポートにアクセスすると、正常に表示されました。

Zope3入門篇 第9章「国際化」第10章「サイトのレイアウトをカスタマイズする」を確認しました



さくらのVPSサーバへインストールしたZope3.4.1を使って、「Zope3入門篇」の第9章「国際化」第10章「サイトのレイアウトをカスタマイズする」を確認しました。



Zope2からそうですが、Zope3でも、国際化対応の機能を元々持っています。Zope3入門篇では、Worldcookeryという世界中のレシピを投稿、収集するという架空のサイトを元に機能の説明が進みます。

人気の投稿 (過去 30 日間)