<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-9016404448327222924</atom:id><lastBuildDate>Sun, 07 Mar 2010 23:56:35 +0000</lastBuildDate><title>守破離でいこう!!</title><description>プログラムについてあれこれ</description><link>http://www.r-stone.net/blogs/ishikawa/</link><managingEditor>noreply@blogger.com (naoki)</managingEditor><generator>Blogger</generator><openSearch:totalResults>76</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9016404448327222924.post-5237369741983677729</guid><pubDate>Fri, 27 Nov 2009 15:57:00 +0000</pubDate><atom:updated>2009-12-10T10:55:25.269+09:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>gmail</category><category domain='http://www.blogger.com/atom/ns#'>chrome</category><title>Gmail Template Switcher for Chrome Extension</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.r-stone.net/blogs/ishikawa/uploaded_images/gtsforextension-760913.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 201px;" src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/gtsforextension-760910.jpg" border="0" alt="" /&gt;&lt;/a&gt;
&lt;p&gt;しばらく前から、Gmail Template Switcher が Google Chrome の User Scripts で動かなくなっていました。&lt;br /&gt;
Google Chrome 4 からの仕様変更の影響で、ページ側のコンテキストにアクセスできなくなったことが原因でした。&lt;/p&gt;
&lt;p&gt;時間を見つけては対応策を検討しましたが、結局、Extension に移行するのが早い。ということです。&lt;/p&gt;
&lt;p&gt;というわけで、Chrome Extension 版の Gmail Template Switcher を作成しましたので、 Extension が有効な Chrome をお使いの方はどうぞお試しください。&lt;/p&gt;
&lt;p&gt;&lt;span style="color:red"&gt;update: &lt;/span&gt;
&lt;a href="https://chrome.google.com/extensions/" title="Google Chrome Extensions" target="_blank"&gt;Google Chrome Extensions Gallery&lt;/a&gt;からのインストールは&lt;a href="https://chrome.google.com/extensions/detail/dcafmdckachnenigiihdmmkjaenneoca" title="Google Chrome Extensions: Gmail Template Switcher for Chrome Extension" target="_blank"&gt;こちら&lt;/a&gt;からどうぞ。
&lt;/p&gt;
&lt;p&gt;&lt;a style="
font-weight: bold;
font-family: inherit;
text-align: center;
color: #2b333c;
background: orange;
border: 1px solid;
border-color: #c4cccc #acb5b5 #6f7777 #acb5b5;
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=0, OffY=1, Color=#AAAAAA);
box-shadow: 0 1px 2px #AAA;
padding: .2em 1.5ex;
_padding: .2em 2ex;
_width/**/:1px;
_white-space: nowrap;
overflow: visible; /* fix button width for IE 5.5 to 7 */
cursor: pointer;
_cursor: hand;" href="http://sites.google.com/a/r-stone.net/river-stone-resource/resource-2/gts.crx" target="_blank"&gt;Gmail Template Switcher for Chrome Extension&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;参考：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://code.google.com/chrome/extensions/index.html" title="Developer Documentation - Google Chrome Extensions - Google Code" target="_blank"&gt;Developer Documentation - Google Chrome Extensions - Google Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9016404448327222924-5237369741983677729?l=www.r-stone.net%2Fblogs%2Fishikawa' alt='' /&gt;&lt;/div&gt;</description><link>http://www.r-stone.net/blogs/ishikawa/2009/11/gmail-template-switcher-for-chrome.html</link><author>noreply@blogger.com (naoki)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9016404448327222924.post-3365543627888533515</guid><pubDate>Tue, 27 Oct 2009 10:28:00 +0000</pubDate><atom:updated>2009-10-27T19:28:00.616+09:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>android</category><title>Android 1.6 にバージョンアップ</title><description>&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/android-donut-775302.png" border="0" alt="Android 1.6 Donut" /&gt;
&lt;p&gt;先日 &lt;a href="http://www.nttdocomo.co.jp/support/utilization/software_update/version_up/ht03a/" title="HT-03Aのバージョンアップ情報 : HT-03Aのバージョンアップ内容 | お客様サポート | NTTドコモ" target="_blank"&gt;docomo の android 携帯「HT-03A」がバージョンアップ&lt;/a&gt;し、Android 1.6 になりました。&lt;/p&gt;
&lt;p&gt;そこで、手元の &lt;a href="http://www.r-stone.net/blogs/ishikawa/2009/06/google-developer-day-2009.html" title="守破離でいこう!!: Google Developer Day 2009" target="_blank"&gt;GDD携帯&lt;/a&gt;もバージョンアップしてみました。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://fx-gp.seesaa.net/article/130344574.html" title="Android GDDJ-09 システムイメージ 1.6アップデートまとめ | 開発" target="_blank"&gt;Android GDDJ-09 システムイメージ 1.6アップデートまとめ | 開発&lt;/a&gt; を参考に、数ステップで完了です。&lt;/p&gt;
&lt;p&gt;途中 &lt;a href="http://www.htc.com/jp/support/android/gddj-09.html#update-recovery" title="HTC - Support - GDDJ-09" target="_blank"&gt;手順5&lt;/a&gt;の、イメージファイルをダウンロードし本体に転送する際に、下記のメッセージが表示された場合は、SDカードをアンマウントしてから再度実行します。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&gt;adb push signed-jdd-ota-14721.zip /sdcard/update.zip
failed to copy 'signed-jdd-ota-14721.zip' to '/sdcard/update.zip': Permission denied&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Android 1.6 では、Androidマーケットや YouTubeアプリなどのインターフェイスが刷新されかっこよくなっています。&lt;br /&gt;
また、全体的に動作が軽快になっていて、いい感じです。&lt;br /&gt;
ハードの性能アップなしにソフトをバージョンアップすると重くなると思っていたので、バージョンアップで動作が軽快になるのはとてもうれしいですね。&lt;/p&gt;

&lt;p&gt;参考：&lt;/p&gt;
&lt;blockquote cite="http://fx-gp.seesaa.net/article/130344574.html"&gt;
    &lt;p&gt;Android GDDJ-09 システムイメージ 1.6アップデートまとめ&lt;/p&gt;
    &lt;p&gt;htcのサポートページに書かれた手順を参考に行った。縦に長めのページだが、実際に必要なのはその一部なので以下に抜き出してまとめる（「fastboot 方式の場合のみ」必要な手順の記述が多い）。&lt;br /&gt;
「概要」では２つの方法が提示されているが、おすすめ通りに「リカバリ イメージ方式」で行った（逆に1.6から1.5へ戻すには、「リカバリ イメージ方式」では無理なので「fastboot 方式」を使う必要があるようだ）。&lt;/p&gt;
    &lt;p&gt;&lt;a href="http://fx-gp.seesaa.net/article/130344574.html" title="Android GDDJ-09 システムイメージ 1.6アップデートまとめ | 開発" target="_blank"&gt;Android GDDJ-09 システムイメージ 1.6アップデートまとめ | 開発&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9016404448327222924-3365543627888533515?l=www.r-stone.net%2Fblogs%2Fishikawa' alt='' /&gt;&lt;/div&gt;</description><link>http://www.r-stone.net/blogs/ishikawa/2009/10/android-16.html</link><author>noreply@blogger.com (naoki)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9016404448327222924.post-5516391738314208611</guid><pubDate>Fri, 16 Oct 2009 10:46:00 +0000</pubDate><atom:updated>2009-10-16T19:46:00.631+09:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>mysql</category><category domain='http://www.blogger.com/atom/ns#'>rails</category><title>[rails] Mysql で Incorrect datetime value が発生</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.r-stone.net/blogs/ishikawa/uploaded_images/railsmysql-749895.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 239px;" src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/railsmysql-749891.jpg" border="0" alt="" /&gt;&lt;/a&gt;
&lt;p&gt;Rails 2.3.4 と Mysql 5.0 (Windows) の環境で、Unit Test を実行すると下記のエラーが発生。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&gt;rake test:units
  1) Error:
test_should_authenticate_user(UserTest):
ActiveRecord::StatementInvalid: Mysql::Error: Incorrect datetime value: '2009-10-16 07:56:13 UTC' for column 'remember_token_expires_at' at row 1: INSERT INTO `users` (`salt`, `updated_at`, `crypted_password`, `remember_token_expires_at`, `id`, `remember_token`, `login`, `created_at`, `email`) VALUES ('356a192b7913b04c54574d18c28d46e6395428ab', '2009-10-15 07:56:13', '39e3509c8a1dff4e5b35850d970992321c4f1358', '2009-10-16 07:56:13 UTC', 1, '77de68daecd823babbb58edb1c8e14d7106e83bb', 'quentin', '2009-10-10 07:56:12', 'quentin@example.com')&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mysql の sql-mode を空白に設定することで解決しました。&lt;/p&gt;
&lt;span style="font-weight: bold"&gt;my.ini&lt;/span&gt;
&lt;pre&gt;&lt;code&gt;# Set the SQL mode to strict
#sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
sql-mode=''
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;参考：&lt;/p&gt;
&lt;blockquote cite="http://www.mail-archive.com/rubyonrails-talk@googlegroups.com/msg00775.html"&gt;
  &lt;p&gt;Now, open the my.ini file located at c:program files/MySQL/MySQL&lt;br /&gt;
Server X.x/my.ini.&lt;br /&gt;
Add a # at the begining of the line: sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"&lt;br /&gt;
Type sql_mode='' on the next line and save the file.&lt;br /&gt;
restart mysql&lt;br /&gt;
&lt;br /&gt;
fixed it&lt;/p&gt;
  &lt;p&gt;&lt;a href="http://www.mail-archive.com/rubyonrails-talk@googlegroups.com/msg00775.html" title="[Rails] Re: restful_authentication rspec failures &amp;quot;Mysql::Error: Incorre" target="_blank"&gt;[Rails] Re: restful_authentication rspec failures &amp;quot;Mysql::Error: Incorre&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9016404448327222924-5516391738314208611?l=www.r-stone.net%2Fblogs%2Fishikawa' alt='' /&gt;&lt;/div&gt;</description><link>http://www.r-stone.net/blogs/ishikawa/2009/10/rails-mysql-incorrect-datetime-value.html</link><author>noreply@blogger.com (naoki)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9016404448327222924.post-2779784879782296596</guid><pubDate>Thu, 15 Oct 2009 10:01:00 +0000</pubDate><atom:updated>2009-10-15T19:01:00.514+09:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>heatmap</category><category domain='http://www.blogger.com/atom/ns#'>webservice</category><title>[User Heat]ヒートマップ・ツールを試してみました</title><description>&lt;p&gt;先日話題になった、訪問者がWebのページのどこの段落を注目して読んでいるのかを可視化する、 &lt;a href="http://userheat.com/" title="User Heat : どこが読まれているか見える！無料ヒートマップ・ツール" target="_blank"&gt;User Heat&lt;/a&gt; を試してみました。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.r-stone.net/blogs/ishikawa/uploaded_images/Heat-Map-Results-756445.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 184px;" src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/Heat-Map-Results-756434.png" border="0" alt="" /&gt;&lt;/a&gt;
&lt;p&gt;ユーザーヒートでは、「マウスの軌跡」、「クリック場所」、「読まれた場所」の3つを分析可能です。&lt;br /&gt;
上の画像は、「クリック場所」を示す Click Map で、クリックした回数が多い箇所ほど赤く表示されるようです。&lt;/p&gt;
&lt;p&gt;しばらく前から仕込んでおいたのですが、分析には十分なアクセスが必要なようで、残念ながらまだヒートマップは見れないようです・・。&lt;/p&gt;
&lt;p&gt;サイトがどのように見られているのかが可視化できるのはいいですね！&lt;br /&gt;
ただ、あまりアクセスがないサイトだと、分析結果が出るまでに時間がかかりそうです・・・。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9016404448327222924-2779784879782296596?l=www.r-stone.net%2Fblogs%2Fishikawa' alt='' /&gt;&lt;/div&gt;</description><link>http://www.r-stone.net/blogs/ishikawa/2009/10/user-heat.html</link><author>noreply@blogger.com (naoki)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9016404448327222924.post-5026149601995265970</guid><pubDate>Mon, 07 Sep 2009 09:35:00 +0000</pubDate><atom:updated>2009-09-07T18:35:00.190+09:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>gaeo</category><category domain='http://www.blogger.com/atom/ns#'>google</category><category domain='http://www.blogger.com/atom/ns#'>gae</category><title>Google App Engine Oil で twitter もどき STEP 1</title><description>&lt;p&gt;&lt;a href="http://www.r-stone.net/blogs/ishikawa/2009/08/google-app-engine-oil.html" title="守破離でいこう!!: Google App Engine Oil" target="_blank"&gt;前回&lt;/a&gt;、Webアプリケーションをさくっと手軽に構築できてしまう &lt;a href="http://code.google.com/intl/ja/appengine/" title="Google App Engine - Google Code" target="_blank"&gt;Google App Engine (GAE)&lt;/a&gt; を試してみましたが、今回は、もう少しまともなアプリケーションを作ってみます。&lt;/p&gt;
&lt;p&gt;作成する前に、つい先日 &lt;a href="http://code.google.com/p/google-app-engine-oil/downloads/list" title="Downloads - google-app-engine-oil - Project Hosting on Google Code" target="_blank"&gt;GAEO が 0.3 にバージョンアップ&lt;/a&gt;しているようなので、早速最新のリリースを試してみましょう。&lt;/p&gt;
&lt;p&gt;バージョンアップ作業は、環境変数のパスを新しいバージョンのものに変更しただけです。&lt;/p&gt;

&lt;a href="http://twitter.com/" title="Twitter" target="_blank"&gt;&lt;img src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/twitter-745104.jpg" alt="Twitter" /&gt;&lt;/a&gt;
&lt;p&gt;&lt;a href="http://twitter.com/" title="Twitter" target="_blank"&gt;Twitter&lt;/a&gt; は、140文字以下の短いメッセージをつぶやきあうシンプルなサービスです。現在とても注目されているサービスですね。&lt;br /&gt;シンプルでわかりやすいですので、今回は Twitter もどきのアプリケーションを作成してみます。&lt;/p&gt;

&lt;h4&gt;mockker&lt;/h4&gt;

&lt;p&gt;それでは、Twitter もどきの「mockker」というプロジェクトを作成します。&lt;br /&gt;とりえあず今回は、データの登録ができればOKとします。また、アカウントは Google App Engine の ユーザーサービスを使用し、Google アカウントと連携させます。&lt;/p&gt;
&lt;pre&gt;&lt;code class="prettyprint"&gt;gaeo.py mockker
cd mockker&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;まずは、つぶやきの scaffold を作成します。&lt;/p&gt;
&lt;pre&gt;&lt;code class="prettyprint"&gt;gaeogen.py scaffold status create show "text:StringProperty()" "user:UserProperty()" "created_at:DateTimeProperty(auto_now_add=True)"&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;ルーティング&lt;/h4&gt;

&lt;p&gt;デフォルトのルートへのルーティングを、welcome/index から status/index へ変更します。&lt;/p&gt;
&lt;span style="font-weight: bold"&gt;gaeo/dispatch/router.py&lt;/span&gt;
&lt;pre&gt;&lt;code class="prettyprint"&gt;class Router:

  """ Handles the url routing... """


  class __impl:

    def __init__(self):
      self.__routing_root = {'controller': 'status',
                   'action': 'index'}

&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;model&lt;/h4&gt;
&lt;p&gt;scaffold により、 application/model/status.py が作成されます。&lt;/p&gt;

&lt;span style="font-weight: bold"&gt;application/model/status.p&lt;/span&gt;
&lt;pre&gt;&lt;code class="prettyprint"&gt;from google.appengine.ext import db
from gaeo.model import BaseModel, SearchableBaseModel

class Status(BaseModel):
  created_at = db.DateTimeProperty(auto_now_add=True)
  text = db.StringProperty()
  user = db.UserProperty()
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;controller&lt;/h4&gt;

&lt;p&gt;scaffold により作成された status コントローラを次のように修正します。&lt;/p&gt;
&lt;span style="font-weight: bold"&gt;application/controller/status.py&lt;/span&gt;
&lt;pre&gt;&lt;code class="prettyprint"&gt;import cgi
import logging

from google.appengine.ext import db
from google.appengine.api import users

from gaeo.controller import BaseController

from model.status import Status

class StatusController(BaseController):
    def create(self):
        r = Status(
            # Uncomment all required properties here.
            # text = self.params.get('text', None),
            # created_at = self.params.get('created_at', None),
            user = users.get_current_user(),
        )
        for prop in Status.properties():
            if prop in self.params:
                setattr(r, prop, self.params.get(prop))
        r.put()
        self.flash['notice'] = u"独り言を更新したよ"
        self.redirect('/')

    def index(self):
        notice = self.flash.get('notice', '')
        self.msg = notice
        if self.current_user:
            query = Status.all().filter('user = ', self.current_user)
            query.order("-created_at")
            self.result = query.fetch(limit=10)

    def show(self):
        r = Status.get(self.params.get('id'))
        if r:
            for prop in Status.properties():
                setattr(self, prop, getattr(r, prop))
        else:
            self.redirect('/')
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ユーザー認証のため、base コントローラの before_action を次のように修正します。&lt;br /&gt;
これにより、全てのアクションの前にユーザー認証が実行されます。&lt;/p&gt;
&lt;span style="font-weight: bold"&gt;gaeo/controller/__init__.py&lt;/span&gt;
&lt;pre&gt;&lt;code class="prettyprint"&gt;from google.appengine.api import users

  def before_action(self):
    self.current_user = users.get_current_user()
    if not self.current_user:
      self.signed_in = False
      self.login_url = users.create_login_url(self.request.uri)
      #self.redirect(users.create_login_url(self.request.uri))
    else:
      self.signed_in = True
      self.logout_url = users.create_logout_url(self.request.uri)
      self.nickname = self.current_user.nickname()&lt;/code&gt;&lt;/pre&gt;


&lt;h4&gt;view&lt;/h4&gt;

&lt;p&gt;view を次のように修正します。&lt;/p&gt;
&lt;span style="font-weight: bold"&gt;application/templates/base.html&lt;/span&gt;
&lt;pre&gt;&lt;code class="prettyprint"&gt;&amp;lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd"&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&amp;gt;
  &amp;lt;title&amp;gt;{% block title %}{% endblock %}&amp;lt;/title&amp;gt;
  &amp;lt;link rel="stylesheet" href="/css/common.css" type="text/css" media="screen" /&amp;gt;
  {% if signed_in %}
  &amp;lt;link rel="stylesheet" href="/css/login.css" type="text/css" media="screen" /&amp;gt;
  {% endif %}
  &amp;lt;script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script type="text/javascript" src="/js/application.js"&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div id="header"&amp;gt;
  &amp;lt;div id="header_inner"&amp;gt;
  &amp;lt;h3&amp;gt;&amp;lt;a href="/" title="Mockker"&amp;gt;Mockker&amp;lt;/a&amp;gt;&amp;lt;/h3&amp;gt;
  {% if signed_in %}
  &amp;lt;ul id="nav"&amp;gt;
    &amp;lt;li&amp;gt;&amp;lt;a href="{{ logout_url }}" title="Logout"&amp;gt;Logout&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
  &amp;lt;/ul&amp;gt;
  {% else %}
  &amp;lt;ul id="nav"&amp;gt;
    &amp;lt;li&amp;gt;&amp;lt;a href="{{ login_url }}" title="Login"&amp;gt;Login&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
  &amp;lt;/ul&amp;gt;
  {% endif %}
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div id="content"&amp;gt;
  &amp;lt;div id="content_inner"&amp;gt;
  {% if msg %}
  &amp;lt;div class="flash"&amp;gt;
    &amp;lt;div class="notice"&amp;gt;
    &amp;lt;p&amp;gt;{{ msg }}&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
  {% endif %}
  {% if signed_in %}
  &amp;lt;div id="update"&amp;gt;
    &amp;lt;form method="post" action="/status/create"&amp;gt;
    &amp;lt;span id="countdown"&amp;gt;140&amp;lt;/span&amp;gt;
    &amp;lt;label for="text"&amp;gt;何か言いたいことは？&amp;lt;/label&amp;gt;
    &amp;lt;textarea id="text" name="text" rows="10" cols="10"&amp;gt;&amp;lt;/textarea&amp;gt;
    &amp;lt;input type="submit" name="update" value="Update" /&amp;gt;
    &amp;lt;/form&amp;gt;
  &amp;lt;/div&amp;gt;
  {% endif %}

  {% block content %}{% endblock %}
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;div id="footer"&amp;gt;
  &amp;lt;div id="footer_inner"&amp;gt;
  &amp;lt;div class="column"&amp;gt;
    &amp;lt;ul&amp;gt;
    &amp;lt;li&amp;gt;&amp;lt;a href="/" title="Home"&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;span style="font-weight: bold"&gt;application/templates/status/index.html&lt;/span&gt;
&lt;pre&gt;&lt;code class="prettyprint"&gt;{% extends "../base.html" %}

{% block title %}StatusController#index{% endblock %}

{% block content %}

&amp;lt;div id="statuses"&amp;gt;
{% for r in result %}

  &amp;lt;div id="status_{{ r.key }}" class="status"&amp;gt;
  &amp;lt;div class="info"&amp;gt;

    &amp;lt;p class="who_when"&amp;gt;
    {{ r.user.nickname }}&amp;lt;br /&amp;gt;
    {{ r.created_at }}
    &amp;lt;/p&amp;gt;

    &amp;lt;p class="actions"&amp;gt;
    &amp;lt;/p&amp;gt;
  &amp;lt;/div&amp;gt;

  &amp;lt;div class="text"&amp;gt;
    {{ r.text }}
  &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
{% endfor %}
&amp;lt;/div&amp;gt;


{% endblock %}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;あとは、Javascript や CSS などで、見栄えを整えます。&lt;/p&gt;

&lt;h4&gt;実行&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;dev_appserver.py .&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;登録したデータをクリアしたい場合は、「--clear_datastore」オプションをつけて実行します。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dev_appserver.py --clear_datastore .&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.r-stone.net/blogs/ishikawa/uploaded_images/mockker-724628.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 194px;" src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/mockker-724626.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;以上で、自分だけがつぶやくことができる、独り言アプリケーションの完成ですｗ&lt;br /&gt;
次回は、他人のつぶやきを表示できるようにしてみたいと思います。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9016404448327222924-5026149601995265970?l=www.r-stone.net%2Fblogs%2Fishikawa' alt='' /&gt;&lt;/div&gt;</description><link>http://www.r-stone.net/blogs/ishikawa/2009/09/google-app-engine-oil-twitter-step-1.html</link><author>noreply@blogger.com (naoki)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9016404448327222924.post-8216045929841674991</guid><pubDate>Tue, 04 Aug 2009 13:34:00 +0000</pubDate><atom:updated>2009-09-08T09:35:11.767+09:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>gaeo</category><category domain='http://www.blogger.com/atom/ns#'>google</category><category domain='http://www.blogger.com/atom/ns#'>gae</category><title>Google App Engine Oil</title><description>&lt;a href="http://code.google.com/p/google-app-engine-oil/" title="google-app-engine-oil - Project Hosting on Google Code" target="_blank"&gt;&lt;img src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/gaeo-701663.png" alt="Google App Engine Oil" /&gt;&lt;/a&gt;
&lt;p&gt;Webアプリケーションをさくっと手軽に構築できてしまう &lt;a href="http://code.google.com/intl/ja/appengine/" title="Google App Engine - Google Code" target="_blank"&gt;Google App Engine (GAE)&lt;/a&gt; ですが、この Google 製のエンジンに、あるオイルを入れてやると、さらに激速なマシンができるようです。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://code.google.com/p/google-app-engine-oil/" title="google-app-engine-oil - Project Hosting on Google Code" target="_blank"&gt;Google App Engine Oil(GAEO)&lt;/a&gt; というこのオイルは、&lt;a href="http://rubyonrails.org/" title="Ruby on Rails" target="_blank"&gt;Ruby on Rails&lt;/a&gt; を参考にして作られた App Engine 専用の レーシングスペックのエンジンオイル（Webアプリケーションフレームワーク）です。&lt;/p&gt;

&lt;h4&gt;GAEO をインストール&lt;/h4&gt;
&lt;p&gt;まず、GAEO は GAE 上で実行されますので、予め &lt;a href="http://www.python.org/download/" title="Download Python Software" target="_blank"&gt;Python&lt;/a&gt; や、&lt;a href="http://code.google.com/intl/ja/appengine/downloads.html" title="ダウンロード - Google App Engine - Google Code" target="_blank"&gt;GAE SDK&lt;/a&gt; をインストールします。&lt;br /&gt;
なお、以下は Windows での解説です。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://code.google.com/p/google-app-engine-oil/" title="google-app-engine-oil - Project Hosting on Google Code" target="_blank"&gt;プロジェクトホーム&lt;/a&gt; からパッケージ（gaeo-0.2.1.zip など）をダウンロードし、好きなところに解凍します。&lt;/p&gt;
&lt;p&gt;GAEO スクリプトを利用するために、解凍先の bin ディレクトリへのパスを、環境変数 PATH に追加します。&lt;/p&gt;
&lt;p&gt;パスを設定しましたら、gaeo.py コマンドを実行し、下記のようになるとインストール完了です。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&gt;gaeo.py
Usage: C:\&amp;lt;install dir&amp;gt;\bin\gaeo.py &amp;lt;project name&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;Hello GAEO&lt;/h4&gt;
&lt;p&gt;では、早速 Hello GAEOプロジェクトを作ってみます&lt;/p&gt;
&lt;p&gt;GAEO でのプロジェクトを作成するには、作業ディレクトリで、次のコマンドを実行します。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gaeo.py hello&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;hello プロジェクトを作成すると、hello ディレクトリには、下記のコンテンツが生成されます。Rails そっくりです。&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;app.yaml, favicon.ico, main.py
  &lt;p&gt;app.yaml と main.py は、GAE のメイン設定ファイルです。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;application/
  &lt;p&gt;アプリケーションのコードの置き場所。基本的にこの中のファイルを編集していきます。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;assets/
  &lt;p&gt;javascript や css ファイルの置き場所。app.yaml で設定可能です。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;gaeo/
  &lt;p&gt;GAEO のコアライブラリ。GAEO のアップグレードは、このディレクトリのファイルを入れ替えるとOKです。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;plugins/
  &lt;p&gt;プラグインのインストールディレクトリです。&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;アプリケーションの起動と確認&lt;/h4&gt;
&lt;p&gt;次のコマンドで GAE を起動し、作成したアプリケーションの動作を確認します。&lt;br /&gt;
なお、コマンドはアプリケーションのルートディレクトリで実行します。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hello&gt;dev_appserver.py .
 Running application hello on port 8080: http://localhost:8080&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;http://localhost:8080/ にアクセスして、「It works!!」と表示されればOKです。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.r-stone.net/blogs/ishikawa/uploaded_images/itworks-749422.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 200px;" src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/itworks-749420.jpg" border="0" alt="" /&gt;&lt;/a&gt;

&lt;p&gt;なかなか刺激的な体験ですが、次はちょっとしたアプリケーションを作ってみたいと思います。&lt;/p&gt;

&lt;dl&gt;
    &lt;dt&gt;Google App Engine Oil で twitter もどき&lt;/dt&gt;
    &lt;dd&gt;&lt;a href="http://www.r-stone.net/blogs/ishikawa/2009/09/google-app-engine-oil-twitter-step-1.html" title="守破離でいこう!!: Google App Engine Oil で twitter もどき STEP 1" target="_blank"&gt;Google App Engine Oil で twitter もどき STEP 1&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;参考：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://doc-ja.gaeo.org/" title="ホーム ‎(GAEO ドキュメント日本語和訳バージョン)" target="_blank"&gt;GAEO ドキュメント日本語和訳バージョン&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9016404448327222924-8216045929841674991?l=www.r-stone.net%2Fblogs%2Fishikawa' alt='' /&gt;&lt;/div&gt;</description><link>http://www.r-stone.net/blogs/ishikawa/2009/08/google-app-engine-oil.html</link><author>noreply@blogger.com (naoki)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9016404448327222924.post-5867007645027500928</guid><pubDate>Thu, 16 Jul 2009 10:25:00 +0000</pubDate><atom:updated>2009-07-16T19:25:01.002+09:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>greasemonkey</category><category domain='http://www.blogger.com/atom/ns#'>gmail</category><category domain='http://www.blogger.com/atom/ns#'>chrome</category><title>[Gmail][Greasemonkey]Gmail Template Switcher を Update</title><description>&lt;a href="http://d.hatena.ne.jp/re_guzy/20070904/p1" title="Gmail にテンプレート切り替え機能を付けてみた - 記憶は削除の方向で" target="_blank"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 192px; height: 116px;" src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/GTS-708038.jpg" border="0" alt="" /&gt;&lt;/a&gt;
&lt;p&gt;しばらくぶりに、&lt;a href="http://www.r-stone.net/blogs/ishikawa/2008/05/gmail-20.html" title="守破離でいこう!!: Gmail 2.0 で複数の署名を切り替える" target="_blank"&gt;Gmail Tempolate Switcher&lt;/a&gt; を&lt;a href="http://userscripts.org/scripts/show/26426" title="Gmail Template Switcher - v 2.0 for Greasemonkey" target="_blank"&gt;アップデート&lt;/a&gt;しました。&lt;/p&gt;
&lt;p&gt;変更点は下記の2点です。&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Google Chrome User Scripts に対応&lt;/li&gt;
  &lt;li&gt;リッチテキストに対応&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最近の僕は、&lt;a href="http://www.google.com/chrome/intl/ja/landing.html" title="Google Chrome - ブラウザのダウンロード" target="_blank"&gt;Google Chrome&lt;/a&gt; がメインブラウザになりつつあります。&lt;br /&gt;
Firefox は、Firebug を使いたいときや、動作確認程度になってしまいました。&lt;/p&gt;
&lt;p&gt;Chrome は、なんといっても動作速度がお気に入りです。とにかく早いですね。これで Google ツールバーがあれば最高なんですけど。&lt;/p&gt;
&lt;p&gt;そんな Chrome ですが、先日、Chrome のバージョンが上がり、これまで Greasemetal 上で動作させていた Greasemonkey Script が動かなくなってしまいました。これはまずいということで、Google Chrome User Scripts 対応にアップデートです。&lt;/p&gt;
&lt;p&gt;そして、またまた先日。今度は、右上の返信ボタンから返信しようとすると、強制的にリッチテキスト形式になってしまう現象が発生していました。&lt;br /&gt;
テンプレートが反映されず、これはまずいということで、リッチテキスト形式対応にアップデートです。&lt;p&gt;
&lt;p&gt;また、コメントでもご意見いただきありがとうございます。&lt;/p&gt;

&lt;p&gt;そんなわけで、最新版の Gmail Tempolate Switcher は、下記からダウンロードしてください。&lt;/p&gt;
&lt;p&gt;&lt;a style=" font-weight: bold; font-family: inherit; text-align: center; color: #2b333c; background: orange; border: 1px solid; border-color: #c4cccc #acb5b5 #6f7777 #acb5b5; -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=0, OffY=1, Color=#AAAAAA); box-shadow: 0 1px 2px #AAA; padding: .2em 1.5ex; _padding: .2em 2ex; _width/**/:1px; _white-space: nowrap; overflow: visible; /* fix button width for IE 5.5 to 7 */ cursor: pointer; _cursor: hand;" href="http://userscripts.org/scripts/show/26426" target="_blank"&gt;Gmail Template Switcher - v 2.0&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9016404448327222924-5867007645027500928?l=www.r-stone.net%2Fblogs%2Fishikawa' alt='' /&gt;&lt;/div&gt;</description><link>http://www.r-stone.net/blogs/ishikawa/2009/07/gmailgreasemonkeygmail-template.html</link><author>noreply@blogger.com (naoki)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9016404448327222924.post-1316249019825750966</guid><pubDate>Mon, 15 Jun 2009 09:52:00 +0000</pubDate><atom:updated>2009-06-29T10:32:51.882+09:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>GDD09JP</category><category domain='http://www.blogger.com/atom/ns#'>google</category><category domain='http://www.blogger.com/atom/ns#'>GDD09</category><title>Google Developer Day 2009</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://code.google.com/intl/ja/events/developerday/2009/home.html" title="Google Developer Day"&gt;&lt;img src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/gddlogo-713036.jpg" border="0" alt="Google Developer Day" /&gt;&lt;/a&gt;
&lt;p&gt;今年も &lt;a href="http://code.google.com/intl/ja/events/developerday/2009/home.html" title="Google Developer Day" target="_blank"&gt;Google Developer Day&lt;/a&gt; に参加してきました。&lt;/p&gt;
&lt;p&gt;すでに恒例のイベントとなっていますが、年々内容が洗練され、とてもすばらしい内容になってきました。&lt;/p&gt;
&lt;p&gt;今回の主な内容は、次のもの。&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://www.html5.jp/" title="HTML5.JP - 次世代HTML標準 HTML5情報サイト" target="_blank"&gt;HTML5&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://wave.google.com/" title="Google Wave Preview" target="_blank"&gt;Google Wave&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.google.co.jp/mobile/android/" title="Google モバイル - Android" target="_blank"&gt;Android&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://code.google.com/intl/ja/apis/opensocial/" title="OpenSocial - Google Code" target="_blank"&gt;Open Social&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://code.google.com/intl/ja/appengine/" title="Google App Engine - Google Code" target="_blank"&gt;Google App Engine&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.google.com/a/help/intl/ja/index.html" title="Google Apps へようこそ" target="_blank"&gt;Google Apps&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://sites.google.com/site/gmapsapi3/" title="Google Maps API Version3 日本語ドキュメント" target="_blank"&gt;Google Maps&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.r-stone.net/blogs/ishikawa/uploaded_images/IMG_2010-732834.JPG" title="Google Developer Day"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 213px;" src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/IMG_2010-732535.JPG" border="0" alt="Google Developer Day" /&gt;&lt;/a&gt;
&lt;p&gt;なかでも、&lt;a href="http://www.html5.jp/" title="HTML5.JP - 次世代HTML標準 HTML5情報サイト" target="_blank"&gt;HTML5&lt;/a&gt; と &lt;a href="http://wave.google.com/" title="Google Wave Preview" target="_blank"&gt;Google Wave&lt;/a&gt; はあらたな時代を感じさせるすばらしいものでした。&lt;br /&gt;
ブラウザだけで（HTML + Javascript）、2D や 3D といったリッチな表現を可能にする、HTML5。&lt;br /&gt;
これまでの メール 主体のコミュニケーションを大きく変えてしまうパワーがある、Google Wave。&lt;br /&gt;
実際に普及となるとまだ先だとは思いますが、
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.google.co.jp/mobile/android/" title="Google モバイル - Android" target="_blank"&gt;Android&lt;/a&gt; についても、もうすぐ日本でも &lt;a href="http://ht-03a.nttdocomo.co.jp/index.html" title="ケータイするGoogle(TM)って？" target="_blank"&gt;docomo から発売&lt;/a&gt;されますので、これから非常に注目されるものです。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://code.google.com/intl/ja/apis/opensocial/" title="OpenSocial - Google Code" target="_blank"&gt;Open Social&lt;/a&gt; は、ついに日本最大の SNS である mixi が完全対応ということで、多くのユーザにリーチできるという点で、マーケティング的にも非常に魅力的なものになりました。&lt;br /&gt;
Android と Open Social の組み合わせは、非常に刺激的なものです。&lt;/p&gt;
&lt;p&gt;そして、&lt;a href="http://www.google.com/a/help/intl/ja/index.html" title="Google Apps へようこそ" target="_blank"&gt;Google Apps&lt;/a&gt; と &lt;a href="http://code.google.com/intl/ja/appengine/" title="Google App Engine - Google Code" target="_blank"&gt;Google App Engine&lt;/a&gt; の組み合わせによる、Enterprise なアプローチは、クラウド化する今日において、対企業へ非常に魅力的なソリューションを提供できるようになります。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sites.google.com/site/gmapsapi3/" title="Google Maps API Version3 日本語ドキュメント" target="_blank"&gt;Google Maps&lt;/a&gt; は、久しぶりのバージョンアップにより、Ver 3 になります。&lt;br /&gt;
iPhone や、Android といったモバイル端末上で快適に動作するように最適化がなされるようです。&lt;br /&gt;
GPS が普及し、地図分野はますます便利になっていきますね。&lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.r-stone.net/blogs/ishikawa/uploaded_images/IMG_2065-778875.JPG" title="Google Developer Day 2009 Android"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 272px;" src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/IMG_2065-778115.JPG" border="0" alt="Google Developer Day 2009 Android" /&gt;&lt;/a&gt;
&lt;p&gt;今回の GDD では、Google I/O 同様サプライズとして、Google Dev Phone の新版が無料配布されました。&lt;br /&gt;
すでにあった Dev Phone 1 (Android 1.0) を、Android 1.5 にアップデートしようかと思っていたところだったので、ちょうどいいタイミングです。&lt;br /&gt;
しかも、ロケールに日本語があって、日本語での文字入力も可能。すばらしいです。&lt;br /&gt;
これで、Android 1.5 でも実機テストが可能ですね。&lt;/p&gt;
&lt;p&gt;会場でも、iPhone を片手に講演を聴いている方が多数いて、やはり、昨年とは会場の雰囲気も違いました。&lt;br /&gt;
来年はきっと、僕も Android を片手に講演を聴いているでしょう・・。&lt;/p&gt;
&lt;p&gt;思いついたアイディアが、たとえ先見の明があったとしても、それが時期尚早だったりすることがあります。&lt;br /&gt;
しかし、それが今ならなんだかいけそうな気がする！と、今年の GDDD は、そんな気になりました。&lt;/p&gt;
&lt;p&gt;今一度、過去のアイディアを整理してみるのもいいかもしれません。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9016404448327222924-1316249019825750966?l=www.r-stone.net%2Fblogs%2Fishikawa' alt='' /&gt;&lt;/div&gt;</description><link>http://www.r-stone.net/blogs/ishikawa/2009/06/google-developer-day-2009.html</link><author>noreply@blogger.com (naoki)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9016404448327222924.post-7224706730545480985</guid><pubDate>Sun, 24 May 2009 09:00:00 +0000</pubDate><atom:updated>2009-05-25T09:17:01.804+09:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>excel</category><category domain='http://www.blogger.com/atom/ns#'>vba</category><title>Excel VBA の ADO で、メモリリークが発生する</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://support.microsoft.com/kb/319998/en-us" title="BUG&amp;#58; Memory leak occurs when you query an open Excel worksheet by using ActiveX Data Objects &amp;#40;ADO&amp;#41;" target="_blank"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 213px;" src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/ado-717103.jpg" border="0" alt="BUG&amp;#58; Memory leak occurs when you query an open Excel worksheet by using ActiveX Data Objects &amp;#40;ADO&amp;#41;" /&gt;&lt;/a&gt;
&lt;p&gt;Excel をデータベースとして使用すると、VBA の ADO や DAO でデータを操作した方が便利なことがあります。&lt;/p&gt;
&lt;p&gt;例えば、単純にデータの集計をしたり、特定の列のある値の行を選択したい場合は、ADO や DAO で SQL 操作すると結構便利だったりします。&lt;/p&gt;
&lt;p&gt;しかしながら、すでに開いている Excel ファイルに対し ADO や DAO による操作をすると、メモリリークが発生するバグがあるようです。 &lt;/p&gt;
&lt;blockquote cite="http://support.microsoft.com/kb/319998/ja"&gt;
    &lt;p&gt;Microsoft ActiveX データ オブジェクト (ADO) を取得すると Excel プロセスで、メモリ リークが Excel で開いている Excel ワークシートから Recordset が発生します。 反復クエリ、最終的に Excel にメモリ不足のため実行しでエラーが発生するか応答を停止したように Excel があります。&lt;/p&gt;
    &lt;p&gt;&lt;a href="http://support.microsoft.com/kb/319998/ja" title="[BUG]: ActiveX データ オブジェクト (ADO) を使用して、開いている Excel ワークシートをクエリすると、メモリ リークが発生します。" target="_blank"&gt;[BUG]: ActiveX データ オブジェクト (ADO) を使用して、開いている Excel ワークシートをクエリすると、メモリ リークが発生します。&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;数回の使用ならば気付かないかもしれませんが、繰り返し UPDATE などで更新をかけたりしていると、ものすごい勢いで使用メモリが増加していきます。&lt;/p&gt;
&lt;p&gt;ADO や DAO を使用して Excel を操作する場合は、データファイルを別に用意するなどして、開いている Excel ファイルに対して操作しないように注意する必要がありますね。&lt;/p&gt;
&lt;p&gt;参考：&lt;a href="http://blog.goo.ne.jp/end-u/e/097cc7b7924061b082817cb27f7a7563" title="■ADOのメモリリーク - 半角チルダ" target="_blank"&gt;■ADOのメモリリーク - 半角チルダ&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9016404448327222924-7224706730545480985?l=www.r-stone.net%2Fblogs%2Fishikawa' alt='' /&gt;&lt;/div&gt;</description><link>http://www.r-stone.net/blogs/ishikawa/2009/05/excel-vba-ado.html</link><author>noreply@blogger.com (naoki)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9016404448327222924.post-4055393955292511048</guid><pubDate>Fri, 17 Apr 2009 09:14:00 +0000</pubDate><atom:updated>2009-04-23T15:24:23.837+09:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>gadget</category><category domain='http://www.blogger.com/atom/ns#'>googleearth</category><category domain='http://www.blogger.com/atom/ns#'>google</category><title>Google Earth で、ツアーを作ってみる</title><description>&lt;a href="http://earth.google.co.jp/" title="Google Earth" target="_blank"&gt;&lt;img src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/google_earth_logo-769855.jpg" border="0" title="Google Earth" alt="Google Earth" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;先日 &lt;a href="http://jp.techcrunch.com/" title="TechCrunch Japan" target="_blank"&gt;TechCrunch&lt;/a&gt; より、 &lt;a href="http://jp.techcrunch.com/archives/20090410google-earth-flythroughs-come-to-the-browser/" title="Google Earthのフライスルーがブラウザで閲覧できるようになった" target="_blank"&gt;Google Earthのフライスルーがブラウザで閲覧できるようになった&lt;/a&gt; という衝撃の記事を発見しました。&lt;/p&gt;&lt;br /&gt;&lt;blockquote cite="http://jp.techcrunch.com/archives/20090410google-earth-flythroughs-come-to-the-browser/"&gt;&lt;br /&gt;    &lt;p&gt;今週初め、GoogleはGoogle Earthツアーをブラウザから直接閲覧できる&lt;a href="http://google-latlong.blogspot.com/2009/04/explore-google-earth-tours-in-your.html" target="_blank"&gt;プラグイン&lt;/a&gt;をリリースした。2月に公開されたGoogle Earthのリリース5.0でも導入されたツアー機能を使えばGoogle Earthで表示できる場所のどこででもバーチャル・フライスルーを作成することができる。これによってなかなか印象的な作品を作り出すこともできる。Googleではいくつものベストツアーを&lt;a href="http://earth.google.com/plugin/tours/" target="_blank"&gt;ギャラリー&lt;/a&gt;に集めており、ハドソン川に緊急着水したFlight 1549の歴史的なフライトの再現やサンフランシスコの疾風ツアーが紹介されている。&lt;/p&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;というわけで、早速試してみました。&lt;br /&gt;&lt;br /&gt;ビデオによるツアーの作成方法は &lt;a href="http://www.youtube.com/watch?v=jYF3UFmHyNQ" title="YouTube - Google Earth 5.0 - Record your Tour Feature" target="_blank"&gt;こちら&lt;/a&gt; から。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/jYF3UFmHyNQ&amp;hl=ja&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/jYF3UFmHyNQ&amp;hl=ja&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;そして、実際に作成してみたツアーが下のものです。プラグインをインストールすると見えるようになります。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://www.gmodules.com/ig/ifr?url=http://code.google.com/apis/kml/embed/tourgadget.xml&amp;amp;up_kml_url=http%3A%2F%2Fwww.r-stone.net%2Fblogs%2Fishikawa%2Fresources%2FGoogleDeveloperDay2009.kmz&amp;amp;up_tour_index=1&amp;amp;up_tour_autoplay=0&amp;amp;up_show_navcontrols=0&amp;amp;up_show_buildings=0&amp;amp;up_show_terrain=1&amp;amp;up_show_roads=0&amp;amp;up_show_borders=0&amp;amp;up_type_mars=0&amp;amp;synd=open&amp;amp;w=500&amp;amp;h=400&amp;amp;title=%E3%83%91%E3%82%B7%E3%83%95%E3%82%A3%E3%82%B3%E6%A8%AA%E6%B5%9C%E3%81%B8Go!&amp;amp;border=%23ffffff%7C3px%2C1px+solid+%23999999&amp;amp;output=js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;次回の &lt;a href="http://code.google.com/intl/ja/events/developerday/2009/home.html" title="Google Developer Day" target="_blank"&gt;Google Developper Day 2009&lt;/a&gt; の開催地である、パシフィコ横浜 へ一気にジャンプするだけですが、ブラウザだけで見れるのはなかなかですね。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;サイトへの埋め込みは、 &lt;a href="http://www.gmodules.com/ig/creator?synd=open&amp;url=http://code.google.com/apis/kml/embed/tourgadget.xml" title="Embedded Tour Player Google gadget" target="_blank"&gt;Embedded Tour Player Google gadget&lt;/a&gt; で、Google Earth で作成した KML ファイルを指定するだけ。あとは作成されたガジェットのコードをペーストすればいいんですね。&lt;br /&gt;これはおもしろいです！&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9016404448327222924-4055393955292511048?l=www.r-stone.net%2Fblogs%2Fishikawa' alt='' /&gt;&lt;/div&gt;</description><link>http://www.r-stone.net/blogs/ishikawa/2009/04/google-earth.html</link><author>noreply@blogger.com (naoki)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9016404448327222924.post-4490287147010008418</guid><pubDate>Thu, 05 Mar 2009 11:04:00 +0000</pubDate><atom:updated>2009-04-23T15:24:23.837+09:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>server</category><category domain='http://www.blogger.com/atom/ns#'>ups</category><category domain='http://www.blogger.com/atom/ns#'>apcupsd</category><title>[Server]Apcupsd で UPS(APC Smart-UPS) を制御する</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.apcupsd.org/" title="Apcupsd, a daemon for controlling APC UPSes" target="_blank"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 35px;" src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/apcupsd-733012.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;UPS(無停電電源装置) とは、停電や瞬断(瞬間停電)などの電力障害時でも、パソコンやサーバなどのコンピュータに電力を安定供給するための装置です。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;UPS がない場合、システムの稼働中に停電が発生するとシステムが強制シャットダウンされ、ファイルが破損したり機器が故障したりする可能性があります。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;そんなわけで、サーバには欠かせない UPS ですが、 通常、UPS とシリアルケーブルでつないだ 1台のサーバしか安全にシャットダウンすることができません。しかしながら、1台の UPS を複数のサーバで共有している場合、それでは困ります。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;そこで、&lt;a href="http://www.apcupsd.org/" title="Apcupsd, a daemon for controlling APC UPSes" target="_blank"&gt;Apcupsd&lt;/a&gt; というソフトを使い、ネットワークでつながっている他のサーバも安全にシャットダウンできるようにします。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Apcupsd とは&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Apcupsd とは、APC SmartUPS を制御、監視するソフトウェアで、Linux, Mac OC/X, Windows などの OS で動作可能です。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Apcupsd のインストール&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;今回は、NIS (Network Information Server) mode で構成します。この構成は、UPS と接続された NIS Server と、ネットワーク経由で情報を共有する NIS Client で構成されます。&lt;br /&gt;&lt;br /&gt;従来の Master/Slave mode に置き換わるものです。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;今回は、CentOS 4 の Linux サーバを NIS Server に、Windows マシンを NIS Client として構成します。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;CentOS 4 へのインストール&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://sourceforge.net/projects/apcupsd/" title="SourceForge.net: Apcupsd UPS control software" target="_blank"&gt;SourceForge.net&lt;/a&gt; から、rpm パッケージをダウンロードします。CentOS 4 は、Red Hat Enterprise Linux (RHEL) のクローンですので、el4 の rpm をダウンロードし、インストールです。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint"&gt;$ wget http://jaist.dl.sourceforge.net/sourceforge/apcupsd/apcupsd-3.14.5-1.el4.i386.rpm&lt;br /&gt;$ sudo rpm -ivh apcupsd-3.14.5-1.el4.i386.rpm&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Windows へのインストール&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://sourceforge.net/projects/apcupsd/" title="SourceForge.net: Apcupsd UPS control software" target="_blank"&gt;SourceForge.net&lt;/a&gt; から、Windows バイナリをダウンロードします。インストールは、画面の指示に従い、すべてデフォルトでOKです。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Apcupsd の設定&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;設定ファイルである、 /etc/apcupsd/apcupsd.conf (Windows は C:\apcupsd\etc\apcupsd\apcupsd.conf) を各モードに合わせて編集します。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;UPSTYPE や、UPSCABLE の設定は、各環境により異なります。詳しくは&lt;a href="http://www.apcupsd.org/manual/Supported_UPSes_Cables.html#type_005ftable" title="Supported UPSes and Cables" target="_blank"&gt;マニュアルを参照&lt;/a&gt;してください。&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;NIS Server/Client 共通の設定&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;    &lt;dt&gt;UPSNAME &lt;strong&gt;SMART-UPS_700&lt;/strong&gt;&lt;/dt&gt;&lt;br /&gt;      &lt;dd&gt;ログ等に使用される UPS 識別名&lt;/dd&gt;&lt;br /&gt;    &lt;dt&gt;UPSMODE &lt;strong&gt;net&lt;/strong&gt;&lt;/dt&gt;&lt;br /&gt;      &lt;dd&gt;ネットワーク機能を有効&lt;/dd&gt;&lt;br /&gt;    &lt;dt&gt;NETACCESS &lt;strong&gt;true&lt;/strong&gt;&lt;/dt&gt;&lt;br /&gt;      &lt;dd&gt;ネットワークアクセスを有効&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;NIS Server の設定&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;    &lt;dt&gt;UPSCABLE &lt;strong&gt;940-0024C&lt;/strong&gt;&lt;/dt&gt;&lt;br /&gt;      &lt;dd&gt;SmartUPS 付属のケーブルを指定&lt;/dd&gt;&lt;br /&gt;    &lt;dt&gt;UPSTYPE &lt;strong&gt;apcsmart&lt;/strong&gt;&lt;/dt&gt;&lt;br /&gt;      &lt;dd&gt;UPS の接続タイプを指定&lt;/dd&gt;&lt;br /&gt;    &lt;dt&gt;DEVICE &lt;strong&gt;/dev/ttyS0&lt;/strong&gt;&lt;/dt&gt;&lt;br /&gt;      &lt;dd&gt;シリアルポートのデバイス名&lt;/dd&gt;&lt;br /&gt;    &lt;dt&gt;KILLDELAY &lt;strong&gt;180&lt;/strong&gt;&lt;/dt&gt;&lt;br /&gt;      &lt;dd&gt;apcupsd がシステムの再起動をコントロールできない時、UPS 自体をシャットダウンさせる&lt;/dd&gt;&lt;br /&gt;    &lt;dt&gt;NETSERVER &lt;strong&gt;on&lt;/strong&gt;&lt;/dt&gt;&lt;br /&gt;      &lt;dd&gt;NIS を有効&lt;/dd&gt;&lt;br /&gt;    &lt;dt&gt;NISIP &lt;strong&gt;0.0.0.0&lt;/strong&gt;&lt;/dt&gt;&lt;br /&gt;      &lt;dd&gt;リクエストを受け付ける IP アドレス&lt;/dd&gt;&lt;br /&gt;    &lt;dd&gt;NISPORT &lt;strong&gt;3551&lt;/strong&gt;&lt;/dd&gt;&lt;br /&gt;      &lt;dd&gt;NIS Server の Port 番号&lt;br /&gt;&lt;span style="color:green"&gt;Firewall の設定で指定ポート（TCP）を開いてください&lt;/span&gt;&lt;/dd&gt;&lt;br /&gt;    &lt;dt&gt;UPSCLASS &lt;strong&gt;standalone&lt;/strong&gt;&lt;/dt&gt;&lt;br /&gt;      &lt;dd&gt;APC ShareUPS を使用している場合以外は、通常 standalone&lt;/dd&gt;&lt;br /&gt;    &lt;dt&gt;UPSMODE &lt;strong&gt;disable&lt;/strong&gt;&lt;/dt&gt;&lt;br /&gt;      &lt;dd&gt;APC ShareUPS を使用している場合以外は、通常 disable&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;NIS Client の設定&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;    &lt;dt&gt;UPSCABLE &lt;strong&gt;ether&lt;/strong&gt;&lt;/dt&gt;&lt;br /&gt;      &lt;dd&gt;ネットワーク経由の設定&lt;/dd&gt;&lt;br /&gt;    &lt;dt&gt;UPSTYPE &lt;strong&gt;net&lt;/strong&gt;&lt;/dt&gt;&lt;br /&gt;      &lt;dd&gt;UPS の接続タイプを指定&lt;/dd&gt;&lt;br /&gt;    &lt;dt&gt;DEVICE &lt;strong&gt;192.168.0.80:3551&lt;/strong&gt;&lt;/dt&gt;&lt;br /&gt;      &lt;dd&gt;NIS Server の IP:Port を指定&lt;/dd&gt;&lt;br /&gt;    &lt;dt&gt;NETSERVER &lt;strong&gt;on&lt;/strong&gt;&lt;/dt&gt;&lt;br /&gt;      &lt;dd&gt;NIS を有効&lt;/dd&gt;&lt;br /&gt;    &lt;dt&gt;UPSCLASS &lt;strong&gt;standalone&lt;/strong&gt;&lt;/dt&gt;&lt;br /&gt;      &lt;dd&gt;APC ShareUPS を使用している場合以外は、通常 standalone&lt;/dd&gt;&lt;br /&gt;    &lt;dt&gt;UPSMODE &lt;strong&gt;disable&lt;/strong&gt;&lt;/dt&gt;&lt;br /&gt;      &lt;dd&gt;APC ShareUPS を使用している場合以外は、通常 disable&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Apcupsd の起動および、動作確認&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;NIS Server の確認&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;起動は下記コマンドから。ついでに自動起動も設定します。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint"&gt;$ sudo /etc/rc.d/init.d/apcupsd start&lt;br /&gt;$ sudo /sbin/chkconfig apcupsd on&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;設定の確認は、下記コマンドを実行します。下記のようにズラズラと出てくれば接続成功です。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint"&gt;$ apcaccess status&lt;br /&gt;APC      : 001,052,1243&lt;br /&gt;DATE     : Fri Feb 06 17:40:30 JST 2009&lt;br /&gt;HOSTNAME : example&lt;br /&gt;RELEASE  : 3.14.5&lt;br /&gt;VERSION  : 3.14.5 (10 January 2009) redhat&lt;br /&gt;UPSNAME  : UPS_IDEN&lt;br /&gt;CABLE    : APC Cable 940-0024C&lt;br /&gt;MODEL    : SMART-UPS 700&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;NIS Client の確認&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;Windows の場合は、自動的に起動時に apcupsd サービスが起動するようになっています。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;タスクトレイにあるアイコンをダブルクリックすると、状態を確認できます。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Apcupsd をブラウザから管理&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Apcupsd には、CGI で UPS の状態を参照できるスクリプトが用意されています。このスクリプトを利用し、Web 経由で状態を確認できるようにします。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://sourceforge.net/projects/apcupsd/" title="SourceForge.net: Apcupsd UPS control software" target="_blank"&gt;SourceForge.net&lt;/a&gt; から、rpm パッケージをダウンロードします。apcupsd-multimon-x.x.x.rpm をダウンロードし、インストールです。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint"&gt;$ wget http://jaist.dl.sourceforge.net/sourceforge/apcupsd/apcupsd-multimon-3.14.5-1.el4.i386.rpm&lt;br /&gt;$ rpm -ivh apcupsd-multimon-3.14.5-1.el4.i386.rpm&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;次のようなエラーが出た場合は、&lt;a href="http://rpm.pbone.net/index.php3/stat/4/idpl/5595133/com/gd-2.0.28-5.4E.i386.rpm.html" title="RPM Search gd-2.0.28-5.4E.i386.rpm" target="_blank"&gt;gd を更新&lt;/a&gt; します。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint"&gt;エラー: Failed dependencies:&lt;br /&gt;        gd &gt;= 2.0 is needed by apcupsd-multimon-3.14.5-1.i386&lt;br /&gt;        libgd.so.2 is needed by apcupsd-multimon-3.14.5-1.i386&lt;br /&gt;    Suggested resolutions:&lt;br /&gt;        /home/buildcentos/CENTOS/en/4.0/i386/CentOS/RPMS/gd-2.0.28-5.4E.i386.rpm&lt;br /&gt;&lt;br /&gt;$ wget ftp://mirror.switch.ch/pool/3/mirror/centos/4.6/os/i386/CentOS/RPMS/gd-2.0.28-5.4E.i386.rpm&lt;br /&gt;$ sudo rpm -Uvh gd-2.0.28-5.4E.i386.rpm&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;インストール後は、 /var/www/cgi-bin にある次のファイルを、Web サーバの cgi ディレクトリにコピーします。&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;multimon.cgi&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;upsfstats.cgi&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;upsimage.cgi&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;upsstats.cgi&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;ブラウザから http://example/cgi-bin/multimon.cgi へ Web 経由でアクセスし、次のような画面が表示されれば成功です。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Apcupsd をテストする&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;最後に、実際に電源障害があった事態を想定しテストをしてみます。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;テストのため、設定ファイル (/etc/apcupsd/apcupsd.conf) の下記ディレクティブの TIMEOUT を変更しておきます。&lt;br /&gt;&lt;br /&gt;BATTERYLEVEL, MINUTES, そして TIMEOUT は、どれか早い方の条件が満たされた場合にシャットダウンが開始されます。&lt;br /&gt;&lt;br /&gt;設定変更後は、 Apcupsd の再起動を忘れずに。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;なお、電源復旧時にマシンが自動的に起動するためには、BIOS 設定が必要になります。デフォルトでは、電源復旧時に自動起動する設定は OFF になっていることが多いので、確認が必要です。&lt;/p&gt;&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;    &lt;dt&gt;BATTERYLEVEL &lt;strong&gt;5&lt;/strong&gt;&lt;/dt&gt;&lt;br /&gt;      &lt;dd&gt;バッテリ残量が指定値以下（％）&lt;/dd&gt;&lt;br /&gt;    &lt;dt&gt;MINUTES &lt;strong&gt;3&lt;/strong&gt;&lt;/dt&gt;&lt;br /&gt;      &lt;dd&gt;バッテリ駆動が可能な予想残り時間が指定値以下（分）&lt;/dd&gt;&lt;br /&gt;    &lt;dt&gt;TIMEOUT &lt;strong&gt;300&lt;/strong&gt;&lt;/dt&gt;&lt;br /&gt;      &lt;dd&gt;バッテリ駆動となってからの時間が指定値経過（秒）&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;短期停電&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;UPS がバッテリ駆動となり、サーバがシャットダウンが開始される前に電源が復旧した場合を想定します。&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;  &lt;li&gt;UPS の電源コードを引っこ抜きます&lt;br /&gt;    &lt;ul&gt;&lt;br /&gt;      &lt;li&gt;UPS の警告音が鳴り響き、UPS がバッテリ駆動になります&lt;/li&gt;&lt;br /&gt;      &lt;li&gt;ログに Power failure on UPS UPSNAME. Running on batteries. と表示されます&lt;/li&gt;&lt;br /&gt;    &lt;/ul&gt;&lt;br /&gt;  &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;UPS の電源コードを接続します&lt;br /&gt;    &lt;ul&gt;&lt;br /&gt;      &lt;li&gt;UPS が商用電源モードに復旧します&lt;/li&gt;&lt;br /&gt;      &lt;li&gt;ログに Power is back. UPS running on mains. と表示されます&lt;/li&gt;&lt;br /&gt;    &lt;/ul&gt;&lt;br /&gt;  &lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;apcupsd[3505]: Power failure.&lt;br /&gt;apcupsd[3505]: Running on UPS batteries.&lt;br /&gt;&lt;br /&gt;Broadcast message from root :&lt;br /&gt;&lt;br /&gt;Power failure on UPS SMART-UPS_700. Running on batteries.&lt;br /&gt;wall[15799]: wall: user root broadcasted 1 lines (59 chars)&lt;br /&gt;&lt;br /&gt;Broadcast message from root :&lt;br /&gt;&lt;br /&gt;Power has returned on UPS SMART-UPS_700...&lt;br /&gt;apcupsd[3505]: Mains returned. No longer on UPS batteries.&lt;br /&gt;apcupsd[3505]: Power is back. UPS running on mains.&lt;br /&gt;wall[15861]: wall: user root broadcasted 1 lines (44 chars)&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;上記の Apcupsd からのメッセージは、root 宛てにメールでも送信されます。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;長期停電&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;UPS がバッテリ駆動となり、サーバがシャットダウンが開始された後に電源が復旧した場合を想定します。&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;  &lt;li&gt;UPS の電源コードを引っこ抜きます&lt;br /&gt;    &lt;ul&gt;&lt;br /&gt;      &lt;li&gt;UPS の警告音が鳴り響き、UPS がバッテリ駆動になります&lt;/li&gt;&lt;br /&gt;      &lt;li&gt;ログに Power failure on UPS UPSNAME. Running on batteries. と表示されます&lt;/li&gt;&lt;br /&gt;    &lt;/ul&gt;&lt;br /&gt;  &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;設定したシャットダウン条件を満たすまで放置します&lt;br /&gt;    &lt;ul&gt;&lt;br /&gt;      &lt;li&gt;ログに Reached run time limit on batteries. と表示されます&lt;/li&gt;&lt;br /&gt;      &lt;li&gt;接続されたマシンがシャットダウンされます&lt;/li&gt;&lt;br /&gt;    &lt;/ul&gt;&lt;br /&gt;  &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;接続されたマシンがすべてシャットダウンした後に、UPS もシャットダウンされるまで放置します&lt;br /&gt;    &lt;ul&gt;&lt;br /&gt;      &lt;li&gt;UPS がシャットダウンされます&lt;br /&gt;&lt;br /&gt;      ※Smart-UPS では、フロントパネルの LED が連続的に点灯する状態になります&lt;/li&gt;&lt;br /&gt;    &lt;/ul&gt;&lt;br /&gt;  &lt;/li&gt;&lt;br /&gt;  &lt;li&gt;UPS の電源コードを接続します&lt;br /&gt;    &lt;ul&gt;&lt;br /&gt;      &lt;li&gt;UPS が再起動します&lt;/li&gt;&lt;br /&gt;      &lt;li&gt;UPS が商用電源モードに復旧します&lt;/li&gt;&lt;br /&gt;      &lt;li&gt;接続されたマシンが再起動します&lt;br /&gt;&lt;br /&gt;      ※自動で再起動しない場合は、BIOS の設定を見直してください。&lt;/li&gt;&lt;br /&gt;    &lt;/ul&gt;&lt;br /&gt;  &lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;apcupsd[3280]: Power failure.&lt;br /&gt;apcupsd[3280]: Running on UPS batteries.&lt;br /&gt;wall[4761]: wall: user root broadcasted 1 lines (59 chars)&lt;br /&gt;apcupsd[3280]: Reached run time limit on batteries.&lt;br /&gt;apcupsd[3280]: Initiating system shutdown!&lt;br /&gt;apcupsd[3280]: User logins prohibited&lt;br /&gt;wall[5185]: wall: user root broadcasted 1 lines (67 chars)&lt;br /&gt;wall[5188]: wall: user root broadcasted 1 lines (47 chars)&lt;br /&gt;shutdown: shutting down for system halt&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;参考：&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;    &lt;li&gt;&lt;a href="http://www.apcupsd.org/" title="Apcupsd, a daemon for controlling APC UPSes" target="_blank"&gt;Apcupsd, a daemon for controlling APC UPSes&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;a href="http://homepage1.nifty.com/Que/plamo/apc-ups/manual/index.html" title="Linuxの下のAPC UPS管理" target="_blank"&gt;Linuxの下のAPC UPS管理&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;a href="http://www.tm-site.net/linuxroom/UPS.htm" title="Apcupsd(UPS監視ソフト)" target="_blank"&gt;Apcupsd(UPS監視ソフト)&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9016404448327222924-4490287147010008418?l=www.r-stone.net%2Fblogs%2Fishikawa' alt='' /&gt;&lt;/div&gt;</description><link>http://www.r-stone.net/blogs/ishikawa/2009/03/serverapcupsd-upsapc-smart-ups.html</link><author>noreply@blogger.com (naoki)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9016404448327222924.post-6772094989404880202</guid><pubDate>Wed, 04 Mar 2009 09:11:00 +0000</pubDate><atom:updated>2009-04-23T15:24:23.838+09:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>server</category><category domain='http://www.blogger.com/atom/ns#'>webobjects</category><category domain='http://www.blogger.com/atom/ns#'>centos</category><category domain='http://www.blogger.com/atom/ns#'>apache</category><title>WebObjects 5.2.4 を Apache 2.2 (CentOS 5.2) で動かす</title><description>&lt;img src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/webobjects-754711.jpg" border="0" title="アップル - WebObjects" alt="アップル - WebObjects" /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.apple.com/jp/webobjects/" title="アップル - WebObjects" target="_blank"&gt;WebObjects&lt;/a&gt; とは、&lt;a href="http://www.apple.com/jp/" title="アップル" target="_blank"&gt;アップル&lt;/a&gt;社が開発した、Java による Webアプリケーションフレームワークで、強力なWebサービスを簡単に構築することができる素晴らしいツールです。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Apple社自身でも、&lt;a href="http://store.apple.com/jp" title="Apple Storeへようこそ - Apple Store (Japan)" target="_blank"&gt;Apple Store&lt;/a&gt;, &lt;a href="http://www.apple.com/jp/mobileme/" title="アップル - MobileMe" target="_blank"&gt;MobileMe(旧.Mac)&lt;/a&gt;, &lt;a href="http://www.apple.com/jp/itunes/whatson/" title="アップル - iTunes - iTunesで何をしよう？ - 概要" target="_blank"&gt;iTunes Store&lt;/a&gt; などを WebObjects で構築しています。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;そんな WebObjects ですが、弊社で使用している WebObjects 5.2 は、Linux の場合 Apache 1.3 でないと動いてくれません。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;しかしながら、最近の OS はより高機能な Apache 2.2 系が搭載されており、できれば Apache 2.2 系で動作させたいものです。&lt;br /&gt;&lt;br /&gt;これまで何度かチャレンジしたものの、なかなかうまく動いてくれませんでした・・・。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;今回やっとうまくいったのでメモしておきます。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Java のインストール&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;WebObjects 5.2.4 では、Java 1.4 系を使用します。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ chmod +x j2re-1_4_2_19-linux-i586-rpm.bin&lt;br /&gt;$ ./j2re-1_4_2_19-linux-i586-rpm.bin&lt;br /&gt;  inflating: j2re-1_4_2_19-linux-i586.rpm  &lt;br /&gt;Done.&lt;br /&gt;&lt;br /&gt;$ sudo rpm -ihv j2re-1_4_2_19-linux-i586.rpm&lt;br /&gt;########################################### [100%]&lt;br /&gt;&lt;br /&gt;$ sudo vi /etc/profile.d/java.sh&lt;br /&gt;# Java&lt;br /&gt;export JAVA_HOME=/usr/java/j2re1.4.2_19&lt;br /&gt;export PATH=$PATH:$JAVA_HOME/bin&lt;br /&gt;&lt;br /&gt;$ sudo chmod +x /etc/profile.d/java.sh&lt;br /&gt;$ source /etc/profile.d/java.sh&lt;br /&gt;&lt;br /&gt;$ java -version&lt;br /&gt;java version "1.4.2_19"&lt;br /&gt;Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_19-b04)&lt;br /&gt;Java HotSpot(TM) Client VM (build 1.4.2_19-b04, mixed mode)&lt;br /&gt;&lt;br /&gt;$ java -version -server&lt;br /&gt;java version "1.4.2_19"&lt;br /&gt;Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_19-b04)&lt;br /&gt;Java HotSpot(TM) Server VM (build 1.4.2_19-b04, mixed mode)&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;WebObjects 5.2 のインストール&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;さて、本体のインストールです。インストールCDの Deployment/SOLARIS フォルダを ftp でアップしています。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;はじめに install.sh を修正します。修正内容は、"-pxZf" を "-pxzf" に修正します。（3か所あります）&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ sudo ./install.sh -license X-NNN-XXX-NNN-XXX-NNN-XXX-NNN-XXX-NNN -adaptorsOnly NO -minimalInstall NO -cgibin /var/www/cgi-bin -docroot /var/www/html -woroot /opt/Apple&lt;br /&gt;&lt;br /&gt;INSTALLATION:&lt;br /&gt;   Beginning WebObjects 5.2 full installation:&lt;br /&gt;&lt;br /&gt;  .  Creating WebObjects installation directory ...&lt;br /&gt;  .  Creating WebObjects' Applications and Frameworks directories ...&lt;br /&gt;  .  Installing WebObjects Adaptor source ...&lt;br /&gt;  .  Installing WebObjects Deployment ...&lt;br /&gt;  .  Installing WODocumentRoot frameworks into document root ...&lt;br /&gt;  .  Creating startup scripts ...&lt;br /&gt;  .  ... Done.&lt;br /&gt;&lt;br /&gt;  WebObjects 5.2 Deployment, Full Install is now installed.&lt;br /&gt;&lt;br /&gt;$ sudo chmod +x /etc/profile.d/webobjects.sh&lt;br /&gt;# WebObjects&lt;br /&gt;export NEXT_ROOT=/opt/Apple&lt;br /&gt;&lt;br /&gt;$ sudo chmod +x /etc/profile.d/webobjects.sh&lt;br /&gt;$ source /etc/profile.d/webobjects.sh&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;WebObjects 5.2 を WebObjects 5.2.4 へ&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;WebObjects 5.2 の最終バージョンは 5.2.4 ですので、アップデートします。アップデートファイルは&lt;a href="http://support.apple.com/kb/TA23122?viewlocale=en_US" title="About the WebObjects 5.2.4 Update" target="_blank"&gt;こちら&lt;/a&gt;から。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ wget http://download.info.apple.com/Apple_Support_Area/Apple_Software_Updates/MultiCountry/Enterprise/webobjects/patches/5.2/WO524Solaris.tar.gzip&lt;br /&gt;$ wget http://download.info.apple.com/Apple_Support_Area/Apple_Software_Updates/MultiCountry/Enterprise/scripts/patcher.sh&lt;br /&gt;$ vi patcher.sh&lt;br /&gt;# COMPRESS=Z                      # gnutar compress flag: 'Z' or 'z' or ''&lt;br /&gt;# Z を z に修正&lt;br /&gt;COMPRESS=z                      # gnutar compress flag: 'Z' or 'z' or ''&lt;br /&gt;&lt;br /&gt;$ chmod 511 patcher.sh&lt;br /&gt;$ sudo ln -s /bin/tar /bin/gnutar&lt;br /&gt;$ sudo ./patcher.sh -install WO524Solaris.tar.gzip -next_root $NEXT_ROOT&lt;br /&gt;No errors, extracting patch&lt;br /&gt;&lt;br /&gt;Install of wo524/WO524Solaris.tar.gzip successful&lt;br /&gt;&lt;br /&gt;$ sudo cp -rf $NEXT_ROOT/Library/WebObjects/WODocumentRoot/WebObjects /var/www/html/&lt;br /&gt;&lt;br /&gt;$ sudo vi $NEXT_ROOT/Library/Frameworks/JavaWebObjects.framework/Resources/WebServerConfig.plist&lt;br /&gt;    //DocumentRoot = "/Library/WebServer/Documents";&lt;br /&gt;    DocumentRoot = "/var/www/html";&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;アダプタの作成&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;いよいよ本番、Apache 2.2 対応のアダプタを作成します。ソースは &lt;a href="http://projectwonder.blogspot.com/" title="Project Wonder" target="_blank"&gt;Project Wonder&lt;/a&gt; から&lt;a href="http://webobjects.mdimension.com/wonder/releases/" title="Index of /wonder/releases" target="_blank"&gt;取得&lt;/a&gt;します。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ sudo yum install httpd-devel&lt;br /&gt;$ wget http://webobjects.mdimension.com/wonder/releases/Wonder-5.0.0.8972-Source.tar.gz&lt;br /&gt;$ tar -zxvf Wonder-5.0.0.8972-Source.tar.gz&lt;br /&gt;$ cd Wonder/Utilities/Adaptors/&lt;br /&gt;&lt;br /&gt;$ vi make.config&lt;br /&gt;#ADAPTOR_OS = MACOS&lt;br /&gt;ADAPTOR_OS = LINUX&lt;br /&gt;CC = gcc&lt;br /&gt;&lt;br /&gt;$ make&lt;br /&gt;$ cd Apache2.2/&lt;br /&gt;$ sudo /usr/sbin/apxs -i -a -n WebObjects mod_WebObjects.la&lt;br /&gt;&lt;br /&gt;$ vi apache.conf&lt;br /&gt;LoadModule WebObjects_module           modules/mod_WebObjects.so&lt;br /&gt;#LoadModule WebObjects_module           modules/mod_WebObjects.so&lt;br /&gt;&lt;br /&gt;$ sudo cp apache.conf /etc/httpd/conf.d/webobjects.conf&lt;br /&gt;$ sudo chmod 644 /etc/httpd/conf.d/webobjects.conf&lt;br /&gt;&lt;br /&gt;$ sudo vi /etc/httpd/conf/httpd.conf&lt;br /&gt;#ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"&lt;br /&gt;&lt;br /&gt;$ sudo /usr/sbin/httpd -M&lt;br /&gt;Loaded Modules:&lt;br /&gt; WebObjects_module (shared)&lt;br /&gt;Syntax OK&lt;br /&gt;&lt;br /&gt;$ sudo /etc/rc.d/init.d/httpd restart&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;SELinux&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;SELinux を使っている場合は、httpd よる 1085 ポート（wotaskd）への接続が拒否されてしまいます。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;setroubleshoot: SELinux は http デーモンによるネットワークポート 1085 ヘの接続を阻止しています。 For complete SELinux messages.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;次のようにして httpd がネットワークポートに接続するのを許可します。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ sudo /usr/sbin/setsebool -P httpd_can_network_connect=1&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;動作確認&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;最後に、起動スクリプトの作成と自動起動です。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ sudo vi /etc/rc.d/init.d/WOServices&lt;br /&gt;#!/bin/sh&lt;br /&gt;#&lt;br /&gt;# Startup script for the WebObjects&lt;br /&gt;#&lt;br /&gt;# chkconfig: 345 85 15&lt;br /&gt;# description: WebObject services&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;# Source function library.&lt;br /&gt;. /etc/rc.d/init.d/functions&lt;br /&gt;&lt;br /&gt;export PATH=/usr/java/j2re1.4.2_19/bin/:$PATH&lt;br /&gt;WOSERVICES_SCRIPT="/opt/Apple/Library/WebObjects/Executables/WOServices"&lt;br /&gt;&lt;br /&gt;# See how we were called.&lt;br /&gt;case "$1" in&lt;br /&gt;start)&lt;br /&gt;echo -n "Starting WebObjects: "&lt;br /&gt;daemon ${WOSERVICES_SCRIPT} start&lt;br /&gt;echo&lt;br /&gt;touch /var/lock/subsys/WebObjects&lt;br /&gt;;;&lt;br /&gt;stop)&lt;br /&gt;echo -n "Shutting down WebObjects: "&lt;br /&gt;${WOSERVICES_SCRIPT} stop&lt;br /&gt;echo&lt;br /&gt;rm -f /var/lock/subsys/WebObjects&lt;br /&gt;;;&lt;br /&gt;restart)&lt;br /&gt;$0 stop&lt;br /&gt;$0 start&lt;br /&gt;;;&lt;br /&gt;*)&lt;br /&gt;echo "Usage: $0 {start|stop|restart}"&lt;br /&gt;exit 1&lt;br /&gt;esac&lt;br /&gt;&lt;br /&gt;exit 0&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ sudo chmod +x /etc/rc.d/init.d/WOServices&lt;br /&gt;$ sudo /etc/rc.d/init.d/WOServices start&lt;br /&gt;Starting WebObjects: Beginning WebObjects services startup...&lt;br /&gt;                                                           [  OK  ]&lt;br /&gt;$ sudo /sbin/chkconfig --add WOServices&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;root より JavaMonitor が起動できればOKです。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;# $NEXT_ROOT/Library/WebObjects/JavaApplications/JavaMonitor.woa/JavaMonitor -WOPort 56789 &amp;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.r-stone.net/blogs/ishikawa/uploaded_images/Monitor-for-WebObjects-5-721459.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 148px;" src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/Monitor-for-WebObjects-5-721455.jpg" border="0" title="Monitor for WebObjects 5" alt="Monitor for WebObjects 5" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;参考：&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;&lt;a href="http://wiki.objectstyle.org/confluence/display/WO/Installing+WO+5.3+or+WO+5.4+on+Linux" title="Installing WO 5.3 or WO 5.4 on Linux - WebObjects - Confluence" target="_blank"&gt;Installing WO 5.3 or WO 5.4 on Linux - WebObjects - Confluence&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;a href="http://www.piyosystems.com/kuki/B2060435708/C1792090254/E20080915154529/index.html" title="WebObjects5.2.4のdeployment onCentOS5.2のメモ" target="_blank"&gt;WebObjects5.2.4のdeployment onCentOS5.2のメモ&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9016404448327222924-6772094989404880202?l=www.r-stone.net%2Fblogs%2Fishikawa' alt='' /&gt;&lt;/div&gt;</description><link>http://www.r-stone.net/blogs/ishikawa/2009/03/webobjects-524-apache-22-centos-52.html</link><author>noreply@blogger.com (naoki)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9016404448327222924.post-2022402068886738253</guid><pubDate>Fri, 27 Feb 2009 09:07:00 +0000</pubDate><atom:updated>2009-04-23T15:24:23.838+09:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>server</category><category domain='http://www.blogger.com/atom/ns#'>centos</category><category domain='http://www.blogger.com/atom/ns#'>vsftpd</category><title>CentOS 5.2 の vsftpd</title><description>&lt;a href="http://www.centos.org/" title="www.centos.org - The Community ENTerprise Operating System" target="_blank"&gt;&lt;img src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/centos-705303.jpg" border="0" alt="www.centos.org - The Community ENTerprise Operating System" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;CentOS 5.2 標準の FTPサーバ vsftpd ですが、設定は間違ってないはずなのになぜかログインできません。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;FTP クライアントのログには次のように出力されています。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;500 OOPS: cannot change directory:/home/xxx&lt;br /&gt;500 OOPS: child died&lt;br /&gt;ログインできません.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;サーバのログを見ると・・・&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;setroubleshoot: SELinux は ftp デーモンによるユーザーのホームディレ クトリ (./home) の読み込みを阻止しています。 For complete SELinux messages.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;どうやら、OS のセキュリティを高める機能である、SELinux が vsftp によるホームディレクトリへのアクセスを拒否していたようです。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;次のようにすることで、解除できます。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ sudo /usr/sbin/setsebool -P ftp_home_dir 1&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;これで問題なくアクセスできます。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9016404448327222924-2022402068886738253?l=www.r-stone.net%2Fblogs%2Fishikawa' alt='' /&gt;&lt;/div&gt;</description><link>http://www.r-stone.net/blogs/ishikawa/2009/02/centos-52-vsftpd.html</link><author>noreply@blogger.com (naoki)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9016404448327222924.post-4056038121036167897</guid><pubDate>Thu, 26 Feb 2009 10:31:00 +0000</pubDate><atom:updated>2009-04-23T15:24:23.838+09:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>server</category><category domain='http://www.blogger.com/atom/ns#'>mysql</category><category domain='http://www.blogger.com/atom/ns#'>centos</category><title>MySQL 3.23.58 を CentOS 5.2 にインストールする</title><description>&lt;a href="http://www-jp.mysql.com/" title="MySQL ::  世界でもっとも普及している、オープン ソース データベース" target="_blank"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 275px; height: 207px;" src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/mysql-752723.jpg" border="0" alt="MySQL ::  世界でもっとも普及している、オープン ソース データベース" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;自社サーバを一台新調することになったのですが、とある事情から MySQL は Ver 3.23.58 を使用しなければならず、でも Apache は 2.2 系を使いたい！&lt;/p&gt;&lt;br /&gt;&lt;p&gt;というわけで、OS やその他の環境は最新の CentOS 5.2 を使用し、MySQL 3.23.58 はソースからインストールすることにしました。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;しかしながら、最新の環境にきわめて古いソフトをインストールすると、ほぼ間違いなく躓くもので。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;ダウンロード&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;まずはダウンロードですが、もはや&lt;a href="http://downloads.mysql.com/archives.php" title="MySQL ::  MySQL Product Archives" target="_blank"&gt;公式サイトのアーカイブ&lt;/a&gt;にも見当たりません・・・&lt;br /&gt;&lt;br /&gt;ので、MySQL日本正規代理店の &lt;a href="http://www.softagency.co.jp/" title="株式会社ソフトエイジェンシー MySQL ・ InnoDB ・ BitDefender ・ IP-PBX" target="_blank"&gt;SoftAgency&lt;/a&gt; 様から&lt;a href="http://download.softagency.net/MySQL/Downloads/MySQL-3.23/" title="Index of /MySQL/Downloads/MySQL-3.23" target="_blank"&gt;拝借&lt;/a&gt;いたします。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ wget http://download.softagency.net/MySQL/Downloads/MySQL-3.23/mysql-3.23.58.tar.gz&lt;br /&gt;$ tar -zxvf mysql-3.23.58.tar.gz&lt;br /&gt;$ cd mysql-3.23.58/&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Configure&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Makefile ファイルを作成するために、configure を実行します。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ ./configure \&lt;br /&gt; --prefix=/usr/local/mysql \&lt;br /&gt; --with-charset=sjis \&lt;br /&gt; --with-extra-charsets=all \&lt;br /&gt; --with-mysqld-user=mysql \&lt;br /&gt; --without-bench \&lt;br /&gt; --localstatedir=/home/mysql/data&lt;br /&gt;&lt;br /&gt;checking "LinuxThreads"... "Not found"&lt;br /&gt;configure: error: This is a linux system and Linuxthreads was not&lt;br /&gt;found. On linux Linuxthreads should be used.  Please install Linuxthreads&lt;br /&gt;(or a new glibc) and try again.  See the Installation chapter in the&lt;br /&gt;Reference Manual for more information.&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;やっぱりエラーが。&lt;br /&gt;&lt;br /&gt;どうやら CentOS 5 では Linuxthreads はサポートされなくなったようで（CentOS 4 まではサポートされていたようです）、configure のオプションで thread の方法を指定します。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ ./configure \&lt;br /&gt; --prefix=/usr/local/mysql \&lt;br /&gt; --with-charset=sjis \&lt;br /&gt; --with-extra-charsets=all \&lt;br /&gt; --with-mysqld-user=mysql \&lt;br /&gt; --without-bench \&lt;br /&gt; --localstatedir=/home/mysql/data \&lt;br /&gt; --with-named-thread-libs="-lpthread"&lt;br /&gt;&lt;br /&gt;checking for termcap functions library... configure: error: No curses/termcap library found&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;今度は、curses library がないとおっしゃいます。インストールし、再チャレンジ。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ yum search ncurses&lt;br /&gt;ncurses.i386 : A terminal handling library&lt;br /&gt;ncurses-devel.i386 : Development files for the ncurses library&lt;br /&gt;&lt;br /&gt;$ sudo yum install ncurses.i386&lt;br /&gt;Package ncurses - 5.5-24.20060715.i386 is already installed.&lt;br /&gt;&lt;br /&gt;$ sudo yum install ncurses-devel.i386&lt;br /&gt;Installed: ncurses-devel.i386 0:5.5-24.20060715&lt;br /&gt;Complete!&lt;br /&gt;&lt;br /&gt;$ ./configure \&lt;br /&gt; --prefix=/usr/local/mysql \&lt;br /&gt; --with-charset=sjis \&lt;br /&gt; --with-extra-charsets=all \&lt;br /&gt; --with-mysqld-user=mysql \&lt;br /&gt; --without-bench \&lt;br /&gt; --localstatedir=/home/mysql/data \&lt;br /&gt; --with-named-thread-libs="-lpthread"&lt;br /&gt;&lt;br /&gt;MySQL has a Web site at http://www.mysql.com/ which carries details on the&lt;br /&gt;latest release, upcoming features, and other information to make your&lt;br /&gt;work or play with MySQL more productive. There you can also find&lt;br /&gt;information about mailing lists for MySQL discussion.&lt;br /&gt;&lt;br /&gt;Remember to check the platform specific part of the reference manual for&lt;br /&gt;hints about installing MySQL on your platform. Also have a look at the&lt;br /&gt;files in the Docs directory.&lt;br /&gt;&lt;br /&gt;Thank you for choosing MySQL!&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;OK! うまくいきました！&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Make&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;さて、お次はコンパイルです。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ make&lt;br /&gt;mysqld.o: In function `main':&lt;br /&gt;mysqld.cc:(.text+0x3450): undefined reference to `my_fast_mutexattr'&lt;br /&gt;mysqld.cc:(.text+0x3464): undefined reference to `my_fast_mutexattr'&lt;br /&gt;mysqld.cc:(.text+0x3478): undefined reference to `my_fast_mutexattr'&lt;br /&gt;mysqld.o:mysqld.cc:(.text+0x34a0): more undefined references to `my_fast_mutexattr' follow&lt;br /&gt;collect2: ld returned 1 exit status&lt;br /&gt;make[4]: *** [mysqld] エラー 1&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;my_fast_mutexattr が定義されてないと。&lt;br /&gt;&lt;br /&gt;そこで、定義を強制するように修正します。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ vi mysys/my_thr_init.c&lt;br /&gt;/my_fast_mutexattr&lt;br /&gt;&lt;br /&gt;#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP&lt;br /&gt;pthread_mutexattr_t my_fast_mutexattr;&lt;br /&gt;#endif&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;これを、下記のようにします。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;//#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP&lt;br /&gt;pthread_mutexattr_t my_fast_mutexattr;&lt;br /&gt;//#endif&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;これでなんとかコンパイルができました。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Maike Install&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;最後にインストールです。ここまでくればOKでしょう。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ sudo make install&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;お疲れ様です！&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9016404448327222924-4056038121036167897?l=www.r-stone.net%2Fblogs%2Fishikawa' alt='' /&gt;&lt;/div&gt;</description><link>http://www.r-stone.net/blogs/ishikawa/2009/02/mysql-32358-centos-52.html</link><author>noreply@blogger.com (naoki)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9016404448327222924.post-8745515722983207209</guid><pubDate>Fri, 23 Jan 2009 07:53:00 +0000</pubDate><atom:updated>2009-04-23T15:24:23.838+09:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>google</category><category domain='http://www.blogger.com/atom/ns#'>gae</category><title>[GAE]Google App Engine を使ってみる Hello, webapp World!</title><description>&lt;p&gt;&lt;a href="http://www.r-stone.net/blogs/ishikawa/2009/01/gaegoogle-app-engine-hello-world.html" title="[GAE]Google App Engine を使ってみる Hello, World!" target="_blank"&gt;前回&lt;/a&gt;は、単純な CGI を試してみましたが、今回は、Google App Engine に提供されている webapp というフレームワークを使ってみます。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Hello, webapp!&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;webapp は次の3つのパートからなります。&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;    &lt;li&gt;リクエストの処理と、レスポンスを生成する、RequestHandler クラス&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;URL に従ってリクエストをルーティングする、WSGIApplication インスタンス&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;WSGIApplication を起動する、メインルーチン&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;さっそく、helloworld.py を書き換えてみます。&lt;/p&gt;&lt;br /&gt;&lt;span style="font-weight: bold"&gt;helloworld/helloworld.py&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint"&gt;from google.appengine.ext import webapp&lt;br /&gt;from google.appengine.ext.webapp.util import run_wsgi_app&lt;br /&gt;&lt;br /&gt;class MainPage(webapp.RequestHandler):&lt;br /&gt;  def get(self):&lt;br /&gt;    self.response.headers['Content-Type'] = 'text/plain'&lt;br /&gt;    self.response.out.write('Hello, webapp World!')&lt;br /&gt;&lt;br /&gt;application = webapp.WSGIApplication(&lt;br /&gt;                                     [('/', MainPage)],&lt;br /&gt;                                     debug=True)&lt;br /&gt;&lt;br /&gt;def main():&lt;br /&gt;  run_wsgi_app(application)&lt;br /&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;  main()&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;開発サーバを起動し、http://localhost:8080 にアクセスします。&lt;br /&gt;&lt;br /&gt;ブラウザに Hello, webapp World! が表示されれば成功です！&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;参考：&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;    &lt;li&gt;&lt;a href="http://code.google.com/intl/ja/appengine/docs/python/gettingstarted/usingwebapp.html" title="Using the webapp Framework - Google App Engine - Google Code" target="_blank"&gt;Using the webapp Framework - Google App Engine - Google Code&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9016404448327222924-8745515722983207209?l=www.r-stone.net%2Fblogs%2Fishikawa' alt='' /&gt;&lt;/div&gt;</description><link>http://www.r-stone.net/blogs/ishikawa/2009/01/gaegoogle-app-engine-hello-webapp-world.html</link><author>noreply@blogger.com (naoki)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9016404448327222924.post-7909729792614787981</guid><pubDate>Thu, 22 Jan 2009 09:41:00 +0000</pubDate><atom:updated>2009-04-23T15:24:23.838+09:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>google</category><category domain='http://www.blogger.com/atom/ns#'>gae</category><title>[GAE]Google App Engine を使ってみる Hello, World!</title><description>&lt;a href="http://code.google.com/intl/ja/appengine/" title="Google App Engine - Google Code" target="_blank"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 250px; height: 250px;" src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/google_appengine-779483.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://jp.techcrunch.com/archives/20080407google-jumps-head-first-into-web-services-with-google-app-engine/" title="Google、ウェブサービスに参入―「Google App Engine」で一挙に急発進" target="_blank"&gt;昨年の4月にリリース&lt;/a&gt;された、&lt;a href="http://code.google.com/intl/ja/appengine/" title="Google App Engine - Google Code" target="_blank"&gt;Google App Engine&lt;/a&gt; ですが、アカウントを申請したままずっと放置していました。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;「一年の計は元旦にあり」ということで、今後ますますクラウド化していく世の中に備え、Google App Engine、Amazon Web Services は押さえておかなければなりません。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;そこで、まずは Google App Engine を使ってみました。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;使い始めるのは簡単で、&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;    &lt;li&gt;&lt;a href="http://www.python.org/download/releases/2.5.4/" title="Python 2.5.4 Release" target="_blank"&gt;Python のインストール&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;a href="http://code.google.com/intl/ja/appengine/downloads.html" title="ダウンロード - Google App Engine - Google Code" target="_blank"&gt;Google App Engine SDK のインストール&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;これですぐにローカルで開発が始められます。&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;Hello, World!&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;なにはともあれ、まずは Hello, World! ですね。&lt;/p&gt;&lt;br /&gt;&lt;h5&gt;シンプルな Request Handler を作成&lt;/h5&gt;&lt;br /&gt;&lt;p&gt;helloworld ディレクトリを作成し、その中に helloworld.py を作成します。&lt;/p&gt;&lt;br /&gt;&lt;span style="font-weight: bold"&gt;helloworld/helloworld.py&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint"&gt;print 'Content-Type: text/plain'&lt;br /&gt;print ''&lt;br /&gt;print 'Hello, World!'&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h5&gt;設定ファイルを作成&lt;/h5&gt;&lt;br /&gt;&lt;p&gt;helloworld ディレクトリに、app.yml を作成します。&lt;/p&gt;&lt;br /&gt;&lt;span style="font-weight: bold"&gt;helloworld/app.yml&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint"&gt;application: helloworld&lt;br /&gt;version: 1&lt;br /&gt;runtime: python&lt;br /&gt;api_version: 1&lt;br /&gt;&lt;br /&gt;handlers:&lt;br /&gt;- url: /.*&lt;br /&gt;  script: helloworld.py&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h5&gt;アプリケーションのテスト&lt;/h5&gt;&lt;br /&gt;&lt;p&gt;dev_appserver.py を実行し、ウェブサーバを起動します。実行するアプリケーションディレクトリのパスを渡します。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint"&gt;google_appengine/dev_appserver.py helloworld/&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;開発サーバが起動したら、http://localhost:8080 にアクセスします。&lt;br /&gt;&lt;br /&gt;ブラウザに Hello, World! が表示されれば成功です！&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;参考：&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;    &lt;li&gt;&lt;a href="http://code.google.com/intl/ja/appengine/docs/python/gettingstarted/helloworld.html" title="Hello, World! - Google App Engine - Google Code" target="_blank"&gt;Hello, World! - Google App Engine - Google Code&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9016404448327222924-7909729792614787981?l=www.r-stone.net%2Fblogs%2Fishikawa' alt='' /&gt;&lt;/div&gt;</description><link>http://www.r-stone.net/blogs/ishikawa/2009/01/gaegoogle-app-engine-hello-world.html</link><author>noreply@blogger.com (naoki)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9016404448327222924.post-8890481223124250802</guid><pubDate>Sat, 27 Dec 2008 06:49:00 +0000</pubDate><atom:updated>2009-04-23T15:24:23.839+09:00</atom:updated><title>End Of 2008年</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.r-stone.net/blogs/ishikawa/uploaded_images/syoutikubai-703876.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 263px;" src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/syoutikubai-703845.png" border="0" alt="本年はお世話になりました。来年も変わらぬご愛顧のほど、よろしくお願い申しあげます。" title="本年はお世話になりました。来年も変わらぬご愛顧のほど、よろしくお願い申しあげます。" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;本年お世話になったお客様、誠にありがとうございます。&lt;br /&gt;&lt;br /&gt;来年も変わらぬご愛顧のほど、よろしくお願い申しあげます。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;さてさて、はやくも2008年が終わろうとしています。&lt;br /&gt;&lt;br /&gt;昨年の反省から、情報に埋もれることなく、的確に情報をさばくことを一つの目標としてきまして、相変わらず Google Reaser の未読フィード数は 1000+ ですが、未読を気にせず、Mark all as read する勇気を持つことができました(ｗ)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;今年は、Twitter, OpenSocial, Facebook, iPhone, Android と、ますますソーシャルになっていくインターネットですが、この流れはしばらく衰えそうにありませんね。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;来年には、docomo, KDDI あたりから、Android 携帯が発表されるらしいので、日本でもすごいことになるのではないでしょうか。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;幸い弊社では、iPhone, Android と、実機がそろっていますので、なにか面白いものをつくれるといいなと思います。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;そろそろ「破」の段階にきた「守破離」ですが、まだまだ覚えることはたくさんあります。&lt;br /&gt;&lt;br /&gt;常に初心を忘れず、さらなる精進を重ねていこうと思う次第です。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;span&gt;&lt;a href="http://web.cc.yamaguchi-u.ac.jp/~c066eb/senjin.syuhari.htm" title="先人の教え　守破離" target"_blank"&gt;守破離とは&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote cite="http://web.cc.yamaguchi-u.ac.jp/~c066eb/senjin.syuhari.htm"&gt;&lt;br /&gt;&lt;p align="center"&gt;「守」とは、&lt;/p&gt;&lt;br /&gt;&lt;p align="center"&gt;師匠の教えを正確かつ忠実に守り、剣道における基本の作法、礼法、技法を身に付ける、いわば「学び」の段階をいいます。&lt;/p&gt;&lt;br /&gt;&lt;p align="center"&gt;「破」とは、&lt;/p&gt;&lt;br /&gt;&lt;p align="center"&gt;それまで身に付けた技や形をさらに洗練させ、自己の個性を創造する段階をいい、&lt;/p&gt;&lt;br /&gt;&lt;p align="center"&gt;「離」とは、&lt;/p&gt;&lt;br /&gt;&lt;p align="center"&gt;さらに前進させ、自らの新しい独自の道を確立させる最終段階のことをいいます。自己を常に発展させるべく修行、精進を重ねていく終わりのない道です。&lt;/p&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;それでは、皆様、よいお年を！&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9016404448327222924-8890481223124250802?l=www.r-stone.net%2Fblogs%2Fishikawa' alt='' /&gt;&lt;/div&gt;</description><link>http://www.r-stone.net/blogs/ishikawa/2008/12/end-of-2008.html</link><author>noreply@blogger.com (naoki)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9016404448327222924.post-435224817332697015</guid><pubDate>Fri, 26 Dec 2008 09:09:00 +0000</pubDate><atom:updated>2009-04-23T15:24:23.839+09:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>blogger</category><title>[Blogger]java.net.ConnectException: Connection timed out</title><description>&lt;img src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/blogger-792859.png" border="0" alt="Blogger" title="Blogger" /&gt;&lt;br /&gt;&lt;p&gt;Blogger を使っていて、FTP 経由で公開している場合、たまによくわからないエラーに遭遇し、投稿に失敗する場合があります。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;その一つが、「&lt;strong&gt;java.net.ConnectException: Connection timed out&lt;/strong&gt;」ですね。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;FTPでブログを作成し、初めてのこのエラーが発生した場合は、大概、passive（PASV / パッシブ） FTP が原因です。&lt;br /&gt;&lt;br /&gt;Blogger では、アクティブ FTP はサポートされていないため、使用するサーバーでアクティブ FTP を要求していないことを確認します。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;しかし、今まで正常に動作していたのに、突然このエラーが出てくることもあります。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;そんな時は、次のことをトライしてみるといいかもしれません。&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;  &lt;li&gt;試しにテストの記事を投稿し、すぐに削除する。その後に再構築をする。&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;アーカイブのファイルか、atom.xml ファイルをサーバ上から削除し、再構築をする。&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;しばらく様子を見る&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;今回僕が遭遇したこのエラーでは、&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;記事を再投稿し、再構築 ・・・ だめ&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;サーバ上から記事のファイルすべてを削除し、再構築 ・・・ だめ&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;テスト記事を投稿し、削除。再構築 ・・・ だめ&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;しばらく様子を見る ・・・ だめ&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;アーカイブファイルのみを削除し、再構築 ・・・ OK！&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;という感じでした。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;原因は全く不明ですが、同様の問題が発生した場合は参考になれば幸いです。&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;参考サイト：&lt;/h4&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;&lt;a href="http://blogger-support-issues.blogspot.com/2006/02/001-javanetconnectexception-connection.html" title="Blogger/BlogSpot "Unanswered" Support Issues: 001 java.net.ConnectException: Connection timed out..." target="_blank"&gt;Blogger/BlogSpot "Unanswered" Support Issues: 001 java.net.ConnectException: Connection timed out...&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;a href="http://help.blogger.com/bin/answer.py?hl=jp&amp;answer=41410" title="FTP 投稿に問題が発生した場合はどうすればよいですか。 - Blogger Help Center" target="_blank"&gt;FTP 投稿に問題が発生した場合はどうすればよいですか。 - Blogger Help Center&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9016404448327222924-435224817332697015?l=www.r-stone.net%2Fblogs%2Fishikawa' alt='' /&gt;&lt;/div&gt;</description><link>http://www.r-stone.net/blogs/ishikawa/2008/12/bloggerjavanetconnectexception.html</link><author>noreply@blogger.com (naoki)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9016404448327222924.post-2568450511189117683</guid><pubDate>Wed, 24 Dec 2008 14:45:00 +0000</pubDate><atom:updated>2009-04-23T15:24:23.839+09:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>google</category><category domain='http://www.blogger.com/atom/ns#'>android</category><title>Google Android Dev Phone 1</title><description>&lt;a href="http://code.google.com/intl/ja/android/" target="_blank" title="Android"&gt;&lt;img src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/logo_android-782562.gif" border="0" alt="Android" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;弊社CEOから、&lt;strong&gt;クリスマスプレゼント&lt;/strong&gt;ということで、開発者向けテスト機として Google から販売されている、Android Dev Phone 1 を渡されました。&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.r-stone.net/blogs/ishikawa/uploaded_images/200812250915000-732912.jpg" title="Android"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/200812250915000-732908.jpg" border="0" alt="Android" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;使い始めるにあたり、次の事項に注意しました。&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;  &lt;li&gt;アクティベーションに、データ接続が必要なので、あらかじめ &lt;a href="http://www.mopera.net/" title="ドコモの定額データプラン対応のインターネット接続プロバイダ「mopera U （モペラユー）」" target="_blank"&gt;Mopera U (docomo)&lt;/a&gt; を契約&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;アクティベーション完了後に、Gmail 同期が行われるので、受信トレイをアーカイブしておく&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;SIMカードは、現在使用中のFOMA携帯用のものでOKでした。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;気になるパケット代は、受信トレイをアーカイブしておいたので、mopera U の基本料金300円 + 200円程度のパケット料で済んだようです。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;さっそく使ってみると、肝心の WiFi が認識しません！&lt;br /&gt;&lt;br /&gt;あれこれ試して、結局、無線LANのチャネルの設定を変更して認識。接続成功です。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;使用感は、iPhone に負けないくらいすばらしいですね。&lt;br /&gt;&lt;br /&gt;まさに、PC と Mac といった感じでしょうか（良くも悪くも）。&lt;br /&gt;&lt;br /&gt;iPhone のマルチタッチは使いやすいですが、Android のシングルタッチ + トラックボールもかなり使いやすいですね。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;というわけで、日本で Android 携帯が発売される前には、なにかアプリを作ってみたいですね。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9016404448327222924-2568450511189117683?l=www.r-stone.net%2Fblogs%2Fishikawa' alt='' /&gt;&lt;/div&gt;</description><link>http://www.r-stone.net/blogs/ishikawa/2008/12/google-android-dev-phone-1.html</link><author>noreply@blogger.com (naoki)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9016404448327222924.post-4702509186883614880</guid><pubDate>Sun, 30 Nov 2008 14:49:00 +0000</pubDate><atom:updated>2009-11-28T01:30:46.251+09:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>greasemonkey</category><category domain='http://www.blogger.com/atom/ns#'>gmail</category><title>[Gmail][Greasemonkey]Gmail Template Switcher を Safari, Google Chrome, Opera でも</title><description>&lt;img src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/browser-739670.jpg" border="0" alt="Firefox, Safari, Chrome, Opera" /&gt;&lt;br/&gt;&lt;img src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/GTS-737406.jpg" border="0" alt="Gmail Template Switcher" /&gt;&lt;br/&gt;&lt;a href="http://d.hatena.ne.jp/re_guzy/20070904/p1" title="Gmail にテンプレート切り替え機能を付けてみた - 記憶は削除の方向で" target="_blank"&gt;&lt;img src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/GTS-767172.png" alt="Gmail Template Switch" border="0" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;複数のアカウントで使用したり、差出人によって署名・挨拶文を変えたい場合に非常に便利なGreasemonkey、&lt;a href="http://www.r-stone.net/blogs/ishikawa/2008/05/gmail-20.html" title="守破離でいこう!!: Gmail 2.0 で複数の署名を切り替える" target="_blank"&gt;Gmail Tempolate Switcher&lt;/a&gt; ですが、&lt;br/&gt;&lt;br /&gt;しばらく前に、Safariでも利用したいとのコメントをいただき、ようやく Greasekit 上の Safari でも動作を確認しました。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Safari 対応に伴い、Greasemetal での Google Chrome と、Opera でも動作を確認しました。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;最新版のダウンロードは、こちらから。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a style="
font-weight: bold;
font-family: inherit;
text-align: center;
color: #2b333c;
background: orange;
border: 1px solid;
border-color: #c4cccc #acb5b5 #6f7777 #acb5b5;
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=0, OffY=1, Color=#AAAAAA);
box-shadow: 0 1px 2px #AAA;
padding: .2em 1.5ex;
_padding: .2em 2ex;
_width/**/:1px;
_white-space: nowrap;
overflow: visible; /* fix button width for IE 5.5 to 7 */
cursor: pointer;
_cursor: hand;" href="http://userscripts.org/scripts/show/26426" target="_blank"&gt;Gmail Template Switcher - v 2.0&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;なお、ご利用方法は、&lt;a href="http://d.hatena.ne.jp/re_guzy/20070904/p1" title="Gmail にテンプレート切り替え機能を付けてみた - 記憶は削除の方向で" target="_blank"&gt;Gmail にテンプレート切り替え機能を付けてみた - 記憶は削除の方向で&lt;/a&gt; をご覧ください。&lt;/p&gt;
&lt;p&gt;&lt;span style="font-weight:bold;color:red"&gt;Update:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.r-stone.net/blogs/ishikawa/2009/11/gmail-template-switcher-for-chrome.html" title="守破離でいこう!!: Gmail Template Switcher for Chrome Extension"&gt;Google Chrome Extension 版を作成しました。&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9016404448327222924-4702509186883614880?l=www.r-stone.net%2Fblogs%2Fishikawa' alt='' /&gt;&lt;/div&gt;</description><link>http://www.r-stone.net/blogs/ishikawa/2008/11/gmailgreasemonkeygmail-template.html</link><author>noreply@blogger.com (naoki)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9016404448327222924.post-4465197391563556173</guid><pubDate>Tue, 11 Nov 2008 11:33:00 +0000</pubDate><atom:updated>2009-04-23T15:24:23.840+09:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>rails</category><title>[Rails][Plugins] multimodel-forms プラグインがすごい便利</title><description>&lt;p&gt;has_many な関連を、ひとつのフォームで登録したいことはよくありますが、そんなときにおすすめなのが、 &lt;a href="http://code.google.com/p/multimodel-forms/" title="Ruby on Rails plugin to create multi model forms" target="_blank"&gt;multimodel-forms&lt;/a&gt; プラグインです。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;たとえば、ひとつの記事に複数のコメントの場合は、以下のようになります。&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;まずは、ベースプロジェクトを作成です。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;rails sample&lt;br /&gt;cd sample&lt;br /&gt;ruby script/generate scaffold article title:string body:text&lt;br /&gt;ruby script/generate model comment body:text article_id:integer&lt;br /&gt;rake db:migrate&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint"&gt;# ---------- app/models/article.rb ----------&lt;br /&gt;class Article &amp;lt; ActiveRecord::Base&lt;br /&gt;  has_many :comments&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint"&gt;# ---------- app/models/comment.rb ----------&lt;br /&gt;class Comment &amp;lt; ActiveRecord::Base&lt;br /&gt;  belongs_to :article&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;multimodel-forms プラグインをインストール&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;ruby script/plugin install git://github.com/sudothinker/multimodel-forms.git&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;model を修正&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint"&gt;# ---------- app/models/article.rb ----------&lt;br /&gt;class Article &amp;lt; ActiveRecord::Base&lt;br /&gt;  has_many_with_attributes :comments&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;view を修正&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint"&gt;# ---------- app/views/layouts/articles.html.erb ----------&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"&lt;br /&gt;       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;  &amp;lt;meta http-equiv="content-type" content="text/html;charset=UTF-8" /&amp;gt;&lt;br /&gt;  &amp;lt;title&amp;gt;Articles: &amp;lt;%= controller.action_name %&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;  &amp;lt;%= stylesheet_link_tag 'scaffold' %&amp;gt;&lt;br /&gt;  &amp;lt;%= javascript_include_tag :defaults %&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p style="color: green"&amp;gt;&amp;lt;%= flash[:notice] %&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%= yield  %&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint"&gt;# ---------- app/views/articles/show.html.erb ----------&lt;br /&gt;&amp;lt;p&amp;gt;&lt;br /&gt;  &amp;lt;b&amp;gt;Title:&amp;lt;/b&amp;gt;&lt;br /&gt;  &amp;lt;%=h @article.title %&amp;gt;&lt;br /&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;&lt;br /&gt;  &amp;lt;b&amp;gt;Body:&amp;lt;/b&amp;gt;&lt;br /&gt;  &amp;lt;%= simple_format(h(@article.body)) %&amp;gt;&lt;br /&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;h2&amp;gt;Comments&amp;lt;/h2&amp;gt;&lt;br /&gt;&amp;lt;ol&amp;gt;&lt;br /&gt;&amp;lt;% @article.comments.each do |c| %&amp;gt;&lt;br /&gt;  &amp;lt;li&amp;gt;&amp;lt;%= simple_format(h(c.body)) %&amp;gt; &amp;lt;small&amp;gt;(commented &amp;lt;%= time_ago_in_words(c.created_at) %&amp;gt; ago)&amp;lt;/small&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;% end %&amp;gt;&lt;br /&gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%= link_to 'Edit', edit_article_path(@article) %&amp;gt; |&lt;br /&gt;&amp;lt;%= link_to 'Back', articles_path %&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint"&gt;# ---------- app/views/articles/new.html.erb ----------&lt;br /&gt;&amp;lt;h1&amp;gt;New article&amp;lt;/h1&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;% form_for(@article) do |f| %&amp;gt;&lt;br /&gt;  &amp;lt;%= f.error_messages %&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;%= render :partial =&amp;gt; 'form', :locals =&amp;gt; { :f =&amp;gt; f } %&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;&lt;br /&gt;    &amp;lt;%= f.submit "Create" %&amp;gt;&lt;br /&gt;  &amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;% end %&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%= link_to 'Back', articles_path %&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint"&gt;# ---------- app/views/articles/edit.html.erb ----------&lt;br /&gt;&amp;lt;h1&amp;gt;Editing article&amp;lt;/h1&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;% form_for(@article) do |f| %&amp;gt;&lt;br /&gt;  &amp;lt;%= f.error_messages %&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;%= render :partial =&amp;gt; 'form', :locals =&amp;gt; { :f =&amp;gt; f } %&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;&lt;br /&gt;    &amp;lt;%= f.submit "Update" %&amp;gt;&lt;br /&gt;  &amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;% end %&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%= link_to 'Show', @article %&amp;gt; |&lt;br /&gt;&amp;lt;%= link_to 'Back', articles_path %&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;_form.html.erb を追加&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint"&gt;# ---------- app/views/articles/_form.html.erb ----------&lt;br /&gt;  &amp;lt;p&amp;gt;&lt;br /&gt;    &amp;lt;%= f.label :title %&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;    &amp;lt;%= f.text_field :title %&amp;gt;&lt;br /&gt;  &amp;lt;/p&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;&lt;br /&gt;    &amp;lt;%= f.label :body %&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;    &amp;lt;%= f.text_area :body, :rows =&amp;gt; 7 %&amp;gt;&lt;br /&gt;  &amp;lt;/p&amp;gt;&lt;br /&gt;  &lt;br /&gt;  &amp;lt;h3&amp;gt;Comments&amp;lt;/h3&amp;gt;&lt;br /&gt;  &amp;lt;div id="comments"&amp;gt;&lt;br /&gt;    &amp;lt;%= render :partial =&amp;gt; 'comments/comment', :collection =&amp;gt; @article.comments %&amp;gt;&lt;br /&gt;  &amp;lt;/div&amp;gt;&lt;br /&gt;  &lt;br /&gt;  &amp;lt;%= add_link "Add Comment", :comment %&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;comments/_comment.html.erb を追加&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint"&gt;# ---------- app/views/comments/_comment.html.erb ----------&lt;br /&gt;  &amp;lt;p class="comment"&amp;gt;&lt;br /&gt;    &amp;lt;% fields_for_associated :article, comment do |comment_form| %&amp;gt;&lt;br /&gt;      &amp;lt;%= comment_form.text_area :body, :rows =&amp;gt; 2, :index =&amp;gt; nil %&amp;gt;&lt;br /&gt;      &amp;lt;%= delete_link_for(comment, "Delete", comment_form) %&amp;gt;&lt;br /&gt;    &amp;lt;% end %&amp;gt;&lt;br /&gt;  &amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;さっそく動作確認です。&lt;/p&gt;&lt;br /&gt;&lt;a href="http://sample-multimodelforms-plugin.heroku.com/articles" title="multi model forms" target="_blank"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 305px; height: 320px;" src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/mulimodel-forms-778646.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;非常に便利な、 multimodel-forms プラグインですが、 acts_as_list をサポートしているので、並び替えも簡単にできるようになります。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9016404448327222924-4465197391563556173?l=www.r-stone.net%2Fblogs%2Fishikawa' alt='' /&gt;&lt;/div&gt;</description><link>http://www.r-stone.net/blogs/ishikawa/2008/11/railsplugins-multimodel-forms.html</link><author>noreply@blogger.com (naoki)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9016404448327222924.post-7258790110588620498</guid><pubDate>Thu, 04 Sep 2008 09:46:00 +0000</pubDate><atom:updated>2009-04-23T15:24:23.840+09:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>rails</category><title>Windows で git</title><description>&lt;img src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/github-733094.png" border="0" alt="" /&gt;&lt;br /&gt;&lt;img src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/octocat-733137.png" border="0" alt="" /&gt;&lt;br /&gt;&lt;p&gt;Rails の Plugin をインストールしようとしたら、.git な GitHub（ぎっとはぶ）のもので、インストールできませんでした。 &lt;/p&gt;&lt;br /&gt;&lt;span&gt;GitHub とは&lt;/span&gt;&lt;br /&gt;&lt;blockquote cite="http://d.hatena.ne.jp/keyword/github"&gt;&lt;br /&gt; &lt;p&gt;git のホスティングサービス。Rails で作成されており、使いやすいインターフェイスが特徴。&lt;/p&gt;&lt;br /&gt; &lt;p&gt;Rails や RSpec 等、また http://gems.github.com/ の Rubygems のレポジトリソース等、Ruby 関係のライブラリのコードを中心とした様々なオープンソースの開発の場所ともなっている。無料で 100M 使えるアカウントを作ることができ、git レポジトリの作成、公開が可能。もちろん Web 上から変更履歴等も参照可能である。&lt;/p&gt;&lt;br /&gt; &lt;p&gt;またワンクリックで github で公開されている OSS のコードを fork して開発することが可能で、自分の変更を加えたレポジトリを pull してほしい、等の要望もワンクリックで可能である。&lt;/p&gt;&lt;br /&gt; &lt;p&gt;参考：&lt;a href="http://d.hatena.ne.jp/keyword/github" title="githubとは - はてなキーワード" target="_blank"&gt;githubとは - はてなキーワード&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;というわけで、Rails 界では今後 GitHub に移行していくようなので、後ればせながら、git をインストールしました。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;git は、 &lt;a href="http://www.moongift.jp/2008/08/msysgit/" title="MOONGIFT: &amp;raquo; WindowsでGitをはじめるなら「msysGit」:オープンソースを毎日紹介" target="_blank"&gt;MOONGIFT: &amp;raquo; WindowsでGitをはじめるなら「msysGit」:オープンソースを毎日紹介&lt;/a&gt; を参考に、 &lt;a href="http://code.google.com/p/msysgit/" title="msysgit - Google Code" target="_blank"&gt;msysGit&lt;/a&gt; をインストール。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;これで、 GitHub にあるプラグインもインストールできるようになります。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint"&gt;ruby script/plugin install git://github.com/rubypond/semantic_form_builder.git&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9016404448327222924-7258790110588620498?l=www.r-stone.net%2Fblogs%2Fishikawa' alt='' /&gt;&lt;/div&gt;</description><link>http://www.r-stone.net/blogs/ishikawa/2008/09/windows-git.html</link><author>noreply@blogger.com (naoki)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9016404448327222924.post-2019631147379696366</guid><pubDate>Fri, 29 Aug 2008 09:29:00 +0000</pubDate><atom:updated>2009-04-23T15:24:23.840+09:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>rails</category><title>Rails で、アプリケーションから ER図 を生成できる RailRoad を試してみる</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.r-stone.net/blogs/ishikawa/uploaded_images/depot_models_full-778607.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/depot_models_full-778604.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.r-stone.net/blogs/ishikawa/uploaded_images/depot_controllers_full-778685.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://www.r-stone.net/blogs/ishikawa/uploaded_images/depot_controllers_full-778683.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Rails には、アプリケーションのモデル・コントローラの内容や関係が記述されたクラス図を、リバースエンジニアリングして生成してくれる &lt;a href="http://railroad.rubyforge.org/" title="RailRoad diagrams generator" target="_blank"&gt;RailRoad&lt;/a&gt; という便利なツールがあります。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;設計は軽くすませて、すぐにプログラミングしていくことが多い Rails アプリケーションですが、全体像を把握したい場合や、他の人に見せたい場合などは、こういうツールがあると便利ですね。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;というわけで、実際に使ってみました。&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;インストール&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.graphviz.org/" title="Graphviz - Graph Visualization Software" target="_blank"&gt;Graphviz&lt;/a&gt; をまずはインストール&lt;/p&gt;&lt;br /&gt;&lt;p&gt;railroad をインストール&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;gem install railroad&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Rake タスクとして実行できるようにする&lt;/h3&gt;&lt;br /&gt;&lt;span&gt;lib/task/diagrams.rake&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint"&gt;namespace :doc do&lt;br /&gt;  namespace :diagram do&lt;br /&gt;    desc "Generate Model diagrams."&lt;br /&gt;    task :models do&lt;br /&gt;      # SVG&lt;br /&gt;      sh "railroad -i -l -a -m -M | dot -Tsvg | sed 's/font-size:14.00/font-size:11.00/g' &amp;gt; doc/models.svg"&lt;br /&gt;      # PNG&lt;br /&gt;      sh "railroad -i -l -a -m -M | dot -Tpng &amp;gt; doc/models.png"&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    desc "Generate Controller diagrams."&lt;br /&gt;    task :controllers do&lt;br /&gt;      # SVG&lt;br /&gt;      sh "railroad -i -l -C | neato -Tsvg | sed 's/font-size:14.00/font-size:11.00/g' &amp;gt; doc/controllers.svg"&lt;br /&gt;      # PNG&lt;br /&gt;      sh "railroad -i -l -C | neato -Tpng &amp;gt; doc/controllers.png"&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  desc "Generate Model and Controller diagrams."&lt;br /&gt;  task :diagrams =&amp;gt; %w(diagram:models diagram:controllers)&lt;br /&gt;end&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;クラス図の生成&lt;/h3&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;rake doc:diagrams&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;すばらしいですね。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9016404448327222924-2019631147379696366?l=www.r-stone.net%2Fblogs%2Fishikawa' alt='' /&gt;&lt;/div&gt;</description><link>http://www.r-stone.net/blogs/ishikawa/2008/08/rails-er-railroad.html</link><author>noreply@blogger.com (naoki)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9016404448327222924.post-3081684328128335085</guid><pubDate>Thu, 28 Aug 2008 12:15:00 +0000</pubDate><atom:updated>2009-04-23T15:24:23.840+09:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>rails</category><title>Rails で migration 時に、Column Comment を設定する</title><description>&lt;p&gt;Railsで、マイグレーション作成時に、カラムにコメントを設定し、それをデータベースに設定する &lt;a href="http://blog.inquirylabs.com/2006/09/01/updated-columncomments-plugin-v12/" title="Updated ColumnComments Plugin (v.1.2)" target="_blank"&gt;ColumnComments&lt;/a&gt; という便利なプラグインがあります。&lt;br /&gt;&lt;br /&gt;というか、標準では設定できないんですね・・・。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;インストールは次の通りです。&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://blog.inquirylabs.com/2006/09/01/updated-columncomments-plugin-v12/" title="Updated ColumnComments Plugin (v.1.2)" target="_blank"&gt;こちら&lt;/a&gt;より、ZIPファイルをダウンロード&lt;/li&gt;&lt;br /&gt; &lt;li&gt;解凍して column_comments ディレクトリを vendor/plugins へコピー&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;使い方は、マイグレーション時に次のように記述します。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint"&gt;Example migration:&lt;br /&gt;&lt;br /&gt;  def self.up&lt;br /&gt; create_table "users" do |t|&lt;br /&gt;   t.column "first_name", :string, :comment =&amp;gt; "The member's given name."&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt; column_comment "tags", "id", "The unique ID of any tag in the system."&lt;br /&gt;  end&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;そしてさらに、テーブルの情報を model と fixture にコメントとして書き込んでくれる &lt;a href="http://agilewebdevelopment.com/plugins/annotate_models" title="Plugins - Annotate models - Agile Web Development&lt;br /&gt;" target="_blank"&gt;annotate_models&lt;/a&gt; プラグインもバンドルされています。が、 annotate_models.rb が古いので、こちらは本家のものと置き換えて、コメントを表示するように修正します。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;ついでに、 &lt;a href="http://blog.s21g.com/articles/318" title="annotate_modelsにindexの情報を付加する - Hello, world! - s21g&lt;br /&gt;" target="_blank"&gt;annotate_modelsにindexの情報を付加する - Hello, world! - s21g&lt;/a&gt; を参考に、インデックス情報もつけちゃいます。&lt;/p&gt;&lt;br /&gt;&lt;span&gt;vendor/plugins/column_comments/lib/annotate_models.rb - self.get_schema_info&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint"&gt;  def self.get_schema_info(klass, header)&lt;br /&gt; info = "# #{header}\n#\n"&lt;br /&gt; info &amp;lt;&amp;lt; "# Table name: #{klass.table_name}\n#\n"&lt;br /&gt;&lt;br /&gt; # index info by http://blog.s21g.com/articles/318&lt;br /&gt; indices = {}&lt;br /&gt; klass.connection.indexes(klass.table_name).each do |index|&lt;br /&gt;   index.columns.each do |column_name|&lt;br /&gt;  indices[column_name] ||= []&lt;br /&gt;  indices[column_name] &amp;lt;&amp;lt; "#{index.name}"&lt;br /&gt;  indices[column_name].last &amp;lt;&amp;lt; "(unique)" if index.unique&lt;br /&gt;   end&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt; max_size = klass.column_names.collect{|name| name.size}.max + 1&lt;br /&gt; klass.columns.each do |col|&lt;br /&gt;   attrs = []&lt;br /&gt;   attrs &amp;lt;&amp;lt; "default(#{quote(col.default)})" if col.default&lt;br /&gt;   attrs &amp;lt;&amp;lt; "not null" unless col.null&lt;br /&gt;   attrs &amp;lt;&amp;lt; "primary key" if col.name == klass.primary_key&lt;br /&gt;   if index = indices[col.name]&lt;br /&gt;  attrs &amp;lt;&amp;lt; index.join(' ')&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;   col_type = col.type.to_s&lt;br /&gt;   if col_type == "decimal"&lt;br /&gt;  col_type &amp;lt;&amp;lt; "(#{col.precision}, #{col.scale})"&lt;br /&gt;   else&lt;br /&gt;  col_type &amp;lt;&amp;lt; "(#{col.limit})" if col.limit&lt;br /&gt;   end&lt;br /&gt;   info &amp;lt;&amp;lt; sprintf("#  %-#{max_size}.#{max_size}s:%-15.15s %s", col.name, col_type, attrs.join(", ")).rstrip&lt;br /&gt;   info &amp;lt;&amp;lt; "\n"&lt;br /&gt;   # column comment&lt;br /&gt;   unless col.comment.blank?&lt;br /&gt;  info &amp;lt;&amp;lt; "#    #{col.comment}"&lt;br /&gt;  info &amp;lt;&amp;lt; "\n"&lt;br /&gt;   end&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt; info &amp;lt;&amp;lt; "#\n\n"&lt;br /&gt;  end&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;使い方は、次の Rake タスクを実行します。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint"&gt;rake annotate_models&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;これでもう、テーブルのカラム名を調べるためにデータベースを見る必要はなくなりそうです。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9016404448327222924-3081684328128335085?l=www.r-stone.net%2Fblogs%2Fishikawa' alt='' /&gt;&lt;/div&gt;</description><link>http://www.r-stone.net/blogs/ishikawa/2008/08/rails-migration-column-comment.html</link><author>noreply@blogger.com (naoki)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-9016404448327222924.post-8964985947382615540</guid><pubDate>Wed, 27 Aug 2008 12:30:00 +0000</pubDate><atom:updated>2009-04-23T15:24:23.840+09:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>rails</category><title>Rails で Database から Fixture を抽出したい</title><description>&lt;p&gt;Rails で、データベースから yaml（やむる） 形式のフィクスチャを抽出するには、&lt;a href="http://topfunky.net/svn/plugins/ar_fixtures/" title="ar_fixtures" target="_blank"&gt;ar_fixtures&lt;/a&gt; が有名です（手元の &lt;a href="http://www.amazon.co.jp/gp/product/4839928266?ie=UTF8&amp;tag=lesgowisy-22&amp;linkCode=as2&amp;camp=247&amp;creative=1211&amp;creativeASIN=4839928266"&gt;Ruby on Rails 逆引きクイックリファレンス Rails 2.0対応&lt;/a&gt;&lt;img src="http://www.assoc-amazon.jp/e/ir?t=lesgowisy-22&amp;l=as2&amp;o=9&amp;a=4839928266" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt; でも紹介されています）。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;ですが、実際使ってみると、日本語（UTF8）がうまく表示されなかったり、項目の並びが適当だったりと、あまりよろしくありませんでした。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;そこで、&lt;a href="http://d.hatena.ne.jp/elm200/20070928/1190947947" title="データベースからテストフィクスチャを抽出する(to_yaml 不使用) - Rails で行こう！ - Ruby on Rails を学ぶ" target="_blank"&gt;データベースからテストフィクスチャを抽出する(to_yaml 不使用) - Rails で行こう！ - Ruby on Rails を学ぶ&lt;/a&gt; で紹介されている Rake タスクを使うとばっちりうまくいきます。&lt;/p&gt;&lt;br /&gt;&lt;blockquote cite="http://d.hatena.ne.jp/elm200/20070928/1190947947"&gt;&lt;br /&gt;    &lt;p&gt;ar_fixtures は内部的に to_yaml というメソッドを使っていて、これが &lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/UTF%2d8"&gt;UTF-8&lt;/a&gt; の文字列をうまく扱えない。そこで、&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;      &lt;p&gt;&lt;a href="http://d.hatena.ne.jp/Rommy/20061229/1167406811" target="_blank"&gt;日本語をto_yamlするとエンコードされてしまう問題を安直な方法で解決する&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;      &lt;p&gt;&lt;a href="http://kakutani.com/20070105.html#p01" target="_blank"&gt;to_yamlでUTF-8な日本語がbinaryになってしまう問題を回避するRailsプラグイン&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;      &lt;p&gt;みたいな hack が必要になってくる。&lt;/p&gt;&lt;br /&gt;      &lt;p&gt;そんなわけで、&lt;a href="http://www.amazon.co.jp/Rails%E3%83%AC%E3%82%B7%E3%83%94-Chad-Fowler/dp/4873113121" target="_blank"&gt;Chad Flower「Rails レシピ」&lt;/a&gt;のレシピ41「生データからのテストフィクスチャの抽出」(p155) のソースコードをベースに次のような Rake タスクを作ってみた。to_yaml は使ってないので、UTF-8 文字列にまつわる頭痛とも無縁だ。興味があれば、使ってみてほしい。&lt;/p&gt;&lt;br /&gt;      &lt;p&gt;&lt;/p&gt;&lt;br /&gt;      &lt;p&gt;参考：&lt;a href="http://d.hatena.ne.jp/elm200/20070928/1190947947" title="データベースからテストフィクスチャを抽出する(to_yaml 不使用) - Rails で行こう！ - Ruby on Rails を学ぶ" target="_blank"&gt;データベースからテストフィクスチャを抽出する(to_yaml 不使用) - Rails で行こう！ - Ruby on Rails を学ぶ&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9016404448327222924-8964985947382615540?l=www.r-stone.net%2Fblogs%2Fishikawa' alt='' /&gt;&lt;/div&gt;</description><link>http://www.r-stone.net/blogs/ishikawa/2008/08/rails-database-fixture.html</link><author>noreply@blogger.com (naoki)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item></channel></rss>
