2009/11/28

Gmail Template Switcher for Chrome Extension

しばらく前から、Gmail Template Switcher が Google Chrome の User Scripts で動かなくなっていました。
Google Chrome 4 からの仕様変更の影響で、ページ側のコンテキストにアクセスできなくなったことが原因でした。

時間を見つけては対応策を検討しましたが、結局、Extension に移行するのが早い。ということです。

というわけで、Chrome Extension 版の Gmail Template Switcher を作成しましたので、 Extension が有効な Chrome をお使いの方はどうぞお試しください。

update: Google Chrome Extensions Galleryからのインストールはこちらからどうぞ。

Gmail Template Switcher for Chrome Extension

参考:

2009/10/27

Android 1.6 にバージョンアップ

Android 1.6 Donut

先日 docomo の android 携帯「HT-03A」がバージョンアップし、Android 1.6 になりました。

そこで、手元の GDD携帯もバージョンアップしてみました。

Android GDDJ-09 システムイメージ 1.6アップデートまとめ | 開発 を参考に、数ステップで完了です。

途中 手順5の、イメージファイルをダウンロードし本体に転送する際に、下記のメッセージが表示された場合は、SDカードをアンマウントしてから再度実行します。

>adb push signed-jdd-ota-14721.zip /sdcard/update.zip
failed to copy 'signed-jdd-ota-14721.zip' to '/sdcard/update.zip': Permission denied

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

参考:

Android GDDJ-09 システムイメージ 1.6アップデートまとめ

htcのサポートページに書かれた手順を参考に行った。縦に長めのページだが、実際に必要なのはその一部なので以下に抜き出してまとめる(「fastboot 方式の場合のみ」必要な手順の記述が多い)。
「概要」では2つの方法が提示されているが、おすすめ通りに「リカバリ イメージ方式」で行った(逆に1.6から1.5へ戻すには、「リカバリ イメージ方式」では無理なので「fastboot 方式」を使う必要があるようだ)。

Android GDDJ-09 システムイメージ 1.6アップデートまとめ | 開発

2009/10/16

[rails] Mysql で Incorrect datetime value が発生

Rails 2.3.4 と Mysql 5.0 (Windows) の環境で、Unit Test を実行すると下記のエラーが発生。

>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')

Mysql の sql-mode を空白に設定することで解決しました。

my.ini
# Set the SQL mode to strict
#sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
sql-mode=''

参考:

Now, open the my.ini file located at c:program files/MySQL/MySQL
Server X.x/my.ini.
Add a # at the begining of the line: sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Type sql_mode='' on the next line and save the file.
restart mysql

fixed it

[Rails] Re: restful_authentication rspec failures "Mysql::Error: Incorre

2009/10/15

[User Heat]ヒートマップ・ツールを試してみました

先日話題になった、訪問者がWebのページのどこの段落を注目して読んでいるのかを可視化する、 User Heat を試してみました。

ユーザーヒートでは、「マウスの軌跡」、「クリック場所」、「読まれた場所」の3つを分析可能です。
上の画像は、「クリック場所」を示す Click Map で、クリックした回数が多い箇所ほど赤く表示されるようです。

しばらく前から仕込んでおいたのですが、分析には十分なアクセスが必要なようで、残念ながらまだヒートマップは見れないようです・・。

サイトがどのように見られているのかが可視化できるのはいいですね!
ただ、あまりアクセスがないサイトだと、分析結果が出るまでに時間がかかりそうです・・・。

2009/09/07

Google App Engine Oil で twitter もどき STEP 1

前回、Webアプリケーションをさくっと手軽に構築できてしまう Google App Engine (GAE) を試してみましたが、今回は、もう少しまともなアプリケーションを作ってみます。

作成する前に、つい先日 GAEO が 0.3 にバージョンアップしているようなので、早速最新のリリースを試してみましょう。

バージョンアップ作業は、環境変数のパスを新しいバージョンのものに変更しただけです。

Twitter

Twitter は、140文字以下の短いメッセージをつぶやきあうシンプルなサービスです。現在とても注目されているサービスですね。
シンプルでわかりやすいですので、今回は Twitter もどきのアプリケーションを作成してみます。

mockker

それでは、Twitter もどきの「mockker」というプロジェクトを作成します。
とりえあず今回は、データの登録ができればOKとします。また、アカウントは Google App Engine の ユーザーサービスを使用し、Google アカウントと連携させます。

gaeo.py mockker
cd mockker

まずは、つぶやきの scaffold を作成します。

gaeogen.py scaffold status create show "text:StringProperty()" "user:UserProperty()" "created_at:DateTimeProperty(auto_now_add=True)"

ルーティング

デフォルトのルートへのルーティングを、welcome/index から status/index へ変更します。

gaeo/dispatch/router.py
class Router:

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


  class __impl:

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

model

scaffold により、 application/model/status.py が作成されます。

application/model/status.p
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()

controller

scaffold により作成された status コントローラを次のように修正します。

application/controller/status.py
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('/')

ユーザー認証のため、base コントローラの before_action を次のように修正します。
これにより、全てのアクションの前にユーザー認証が実行されます。

gaeo/controller/__init__.py
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()

view

view を次のように修正します。

application/templates/base.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>{% block title %}{% endblock %}</title>
  <link rel="stylesheet" href="/css/common.css" type="text/css" media="screen" />
  {% if signed_in %}
  <link rel="stylesheet" href="/css/login.css" type="text/css" media="screen" />
  {% endif %}
  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
  <script type="text/javascript" src="/js/application.js"></script>

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

  {% block content %}{% endblock %}
  </div>
</div>

<div id="footer">
  <div id="footer_inner">
  <div class="column">
    <ul>
    <li><a href="/" title="Home">Home</a></li>
    </ul>
  </div>
  </div>
</div>
</body>
</html>
application/templates/status/index.html
{% extends "../base.html" %}

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

{% block content %}

<div id="statuses">
{% for r in result %}

  <div id="status_{{ r.key }}" class="status">
  <div class="info">

    <p class="who_when">
    {{ r.user.nickname }}<br />
    {{ r.created_at }}
    </p>

    <p class="actions">
    </p>
  </div>

  <div class="text">
    {{ r.text }}
  </div>
  </div>
{% endfor %}
</div>


{% endblock %}

あとは、Javascript や CSS などで、見栄えを整えます。

実行

dev_appserver.py .

登録したデータをクリアしたい場合は、「--clear_datastore」オプションをつけて実行します。

dev_appserver.py --clear_datastore .

以上で、自分だけがつぶやくことができる、独り言アプリケーションの完成ですw
次回は、他人のつぶやきを表示できるようにしてみたいと思います。

2009/08/04

Google App Engine Oil

Google App Engine Oil

Webアプリケーションをさくっと手軽に構築できてしまう Google App Engine (GAE) ですが、この Google 製のエンジンに、あるオイルを入れてやると、さらに激速なマシンができるようです。

Google App Engine Oil(GAEO) というこのオイルは、Ruby on Rails を参考にして作られた App Engine 専用の レーシングスペックのエンジンオイル(Webアプリケーションフレームワーク)です。

GAEO をインストール

まず、GAEO は GAE 上で実行されますので、予め Python や、GAE SDK をインストールします。
なお、以下は Windows での解説です。

プロジェクトホーム からパッケージ(gaeo-0.2.1.zip など)をダウンロードし、好きなところに解凍します。

GAEO スクリプトを利用するために、解凍先の bin ディレクトリへのパスを、環境変数 PATH に追加します。

パスを設定しましたら、gaeo.py コマンドを実行し、下記のようになるとインストール完了です。

>gaeo.py
Usage: C:\<install dir>\bin\gaeo.py <project name>

Hello GAEO

では、早速 Hello GAEOプロジェクトを作ってみます

GAEO でのプロジェクトを作成するには、作業ディレクトリで、次のコマンドを実行します。

gaeo.py hello

hello プロジェクトを作成すると、hello ディレクトリには、下記のコンテンツが生成されます。Rails そっくりです。

  • app.yaml, favicon.ico, main.py

    app.yaml と main.py は、GAE のメイン設定ファイルです。

  • application/

    アプリケーションのコードの置き場所。基本的にこの中のファイルを編集していきます。

  • assets/

    javascript や css ファイルの置き場所。app.yaml で設定可能です。

  • gaeo/

    GAEO のコアライブラリ。GAEO のアップグレードは、このディレクトリのファイルを入れ替えるとOKです。

  • plugins/

    プラグインのインストールディレクトリです。

アプリケーションの起動と確認

次のコマンドで GAE を起動し、作成したアプリケーションの動作を確認します。
なお、コマンドはアプリケーションのルートディレクトリで実行します。

hello>dev_appserver.py .
 Running application hello on port 8080: http://localhost:8080

http://localhost:8080/ にアクセスして、「It works!!」と表示されればOKです。

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

Google App Engine Oil で twitter もどき
Google App Engine Oil で twitter もどき STEP 1

参考:

2009/07/16

[Gmail][Greasemonkey]Gmail Template Switcher を Update

しばらくぶりに、Gmail Tempolate Switcherアップデートしました。

変更点は下記の2点です。

  • Google Chrome User Scripts に対応
  • リッチテキストに対応

最近の僕は、Google Chrome がメインブラウザになりつつあります。
Firefox は、Firebug を使いたいときや、動作確認程度になってしまいました。

Chrome は、なんといっても動作速度がお気に入りです。とにかく早いですね。これで Google ツールバーがあれば最高なんですけど。

そんな Chrome ですが、先日、Chrome のバージョンが上がり、これまで Greasemetal 上で動作させていた Greasemonkey Script が動かなくなってしまいました。これはまずいということで、Google Chrome User Scripts 対応にアップデートです。

そして、またまた先日。今度は、右上の返信ボタンから返信しようとすると、強制的にリッチテキスト形式になってしまう現象が発生していました。
テンプレートが反映されず、これはまずいということで、リッチテキスト形式対応にアップデートです。

また、コメントでもご意見いただきありがとうございます。

そんなわけで、最新版の Gmail Tempolate Switcher は、下記からダウンロードしてください。

Gmail Template Switcher - v 2.0

2009/06/15

Google Developer Day 2009

Google Developer Day

今年も Google Developer Day に参加してきました。

すでに恒例のイベントとなっていますが、年々内容が洗練され、とてもすばらしい内容になってきました。

今回の主な内容は、次のもの。

Google Developer Day

なかでも、HTML5Google Wave はあらたな時代を感じさせるすばらしいものでした。
ブラウザだけで(HTML + Javascript)、2D や 3D といったリッチな表現を可能にする、HTML5。
これまでの メール 主体のコミュニケーションを大きく変えてしまうパワーがある、Google Wave。
実際に普及となるとまだ先だとは思いますが、

Android についても、もうすぐ日本でも docomo から発売されますので、これから非常に注目されるものです。

Open Social は、ついに日本最大の SNS である mixi が完全対応ということで、多くのユーザにリーチできるという点で、マーケティング的にも非常に魅力的なものになりました。
Android と Open Social の組み合わせは、非常に刺激的なものです。

そして、Google AppsGoogle App Engine の組み合わせによる、Enterprise なアプローチは、クラウド化する今日において、対企業へ非常に魅力的なソリューションを提供できるようになります。

Google Maps は、久しぶりのバージョンアップにより、Ver 3 になります。
iPhone や、Android といったモバイル端末上で快適に動作するように最適化がなされるようです。
GPS が普及し、地図分野はますます便利になっていきますね。

Google Developer Day 2009 Android

今回の GDD では、Google I/O 同様サプライズとして、Google Dev Phone の新版が無料配布されました。
すでにあった Dev Phone 1 (Android 1.0) を、Android 1.5 にアップデートしようかと思っていたところだったので、ちょうどいいタイミングです。
しかも、ロケールに日本語があって、日本語での文字入力も可能。すばらしいです。
これで、Android 1.5 でも実機テストが可能ですね。

会場でも、iPhone を片手に講演を聴いている方が多数いて、やはり、昨年とは会場の雰囲気も違いました。
来年はきっと、僕も Android を片手に講演を聴いているでしょう・・。

思いついたアイディアが、たとえ先見の明があったとしても、それが時期尚早だったりすることがあります。
しかし、それが今ならなんだかいけそうな気がする!と、今年の GDDD は、そんな気になりました。

今一度、過去のアイディアを整理してみるのもいいかもしれません。

2009/05/24

Excel VBA の ADO で、メモリリークが発生する

BUG: Memory leak occurs when you query an open Excel worksheet by using ActiveX Data Objects (ADO)

Excel をデータベースとして使用すると、VBA の ADO や DAO でデータを操作した方が便利なことがあります。

例えば、単純にデータの集計をしたり、特定の列のある値の行を選択したい場合は、ADO や DAO で SQL 操作すると結構便利だったりします。

しかしながら、すでに開いている Excel ファイルに対し ADO や DAO による操作をすると、メモリリークが発生するバグがあるようです。

Microsoft ActiveX データ オブジェクト (ADO) を取得すると Excel プロセスで、メモリ リークが Excel で開いている Excel ワークシートから Recordset が発生します。 反復クエリ、最終的に Excel にメモリ不足のため実行しでエラーが発生するか応答を停止したように Excel があります。

[BUG]: ActiveX データ オブジェクト (ADO) を使用して、開いている Excel ワークシートをクエリすると、メモリ リークが発生します。

数回の使用ならば気付かないかもしれませんが、繰り返し UPDATE などで更新をかけたりしていると、ものすごい勢いで使用メモリが増加していきます。

ADO や DAO を使用して Excel を操作する場合は、データファイルを別に用意するなどして、開いている Excel ファイルに対して操作しないように注意する必要がありますね。

参考:■ADOのメモリリーク - 半角チルダ

2009/04/17

Google Earth で、ツアーを作ってみる

Google Earth

先日 TechCrunch より、 Google Earthのフライスルーがブラウザで閲覧できるようになった という衝撃の記事を発見しました。



今週初め、GoogleはGoogle Earthツアーをブラウザから直接閲覧できるプラグインをリリースした。2月に公開されたGoogle Earthのリリース5.0でも導入されたツアー機能を使えばGoogle Earthで表示できる場所のどこででもバーチャル・フライスルーを作成することができる。これによってなかなか印象的な作品を作り出すこともできる。Googleではいくつものベストツアーをギャラリーに集めており、ハドソン川に緊急着水したFlight 1549の歴史的なフライトの再現やサンフランシスコの疾風ツアーが紹介されている。



というわけで、早速試してみました。

ビデオによるツアーの作成方法は こちら から。




そして、実際に作成してみたツアーが下のものです。プラグインをインストールすると見えるようになります。





次回の Google Developper Day 2009 の開催地である、パシフィコ横浜 へ一気にジャンプするだけですが、ブラウザだけで見れるのはなかなかですね。


サイトへの埋め込みは、 Embedded Tour Player Google gadget で、Google Earth で作成した KML ファイルを指定するだけ。あとは作成されたガジェットのコードをペーストすればいいんですね。
これはおもしろいです!

2009/03/05

[Server]Apcupsd で UPS(APC Smart-UPS) を制御する



UPS(無停電電源装置) とは、停電や瞬断(瞬間停電)などの電力障害時でも、パソコンやサーバなどのコンピュータに電力を安定供給するための装置です。


UPS がない場合、システムの稼働中に停電が発生するとシステムが強制シャットダウンされ、ファイルが破損したり機器が故障したりする可能性があります。


そんなわけで、サーバには欠かせない UPS ですが、 通常、UPS とシリアルケーブルでつないだ 1台のサーバしか安全にシャットダウンすることができません。しかしながら、1台の UPS を複数のサーバで共有している場合、それでは困ります。


そこで、Apcupsd というソフトを使い、ネットワークでつながっている他のサーバも安全にシャットダウンできるようにします。



Apcupsd とは


Apcupsd とは、APC SmartUPS を制御、監視するソフトウェアで、Linux, Mac OC/X, Windows などの OS で動作可能です。



Apcupsd のインストール


今回は、NIS (Network Information Server) mode で構成します。この構成は、UPS と接続された NIS Server と、ネットワーク経由で情報を共有する NIS Client で構成されます。

従来の Master/Slave mode に置き換わるものです。


今回は、CentOS 4 の Linux サーバを NIS Server に、Windows マシンを NIS Client として構成します。



CentOS 4 へのインストール


SourceForge.net から、rpm パッケージをダウンロードします。CentOS 4 は、Red Hat Enterprise Linux (RHEL) のクローンですので、el4 の rpm をダウンロードし、インストールです。



$ wget http://jaist.dl.sourceforge.net/sourceforge/apcupsd/apcupsd-3.14.5-1.el4.i386.rpm
$ sudo rpm -ivh apcupsd-3.14.5-1.el4.i386.rpm


Windows へのインストール


SourceForge.net から、Windows バイナリをダウンロードします。インストールは、画面の指示に従い、すべてデフォルトでOKです。




Apcupsd の設定


設定ファイルである、 /etc/apcupsd/apcupsd.conf (Windows は C:\apcupsd\etc\apcupsd\apcupsd.conf) を各モードに合わせて編集します。


UPSTYPE や、UPSCABLE の設定は、各環境により異なります。詳しくはマニュアルを参照してください。


NIS Server/Client 共通の設定




UPSNAME SMART-UPS_700

ログ等に使用される UPS 識別名

UPSMODE net

ネットワーク機能を有効

NETACCESS true

ネットワークアクセスを有効



NIS Server の設定





UPSCABLE 940-0024C

SmartUPS 付属のケーブルを指定

UPSTYPE apcsmart

UPS の接続タイプを指定

DEVICE /dev/ttyS0

シリアルポートのデバイス名

KILLDELAY 180

apcupsd がシステムの再起動をコントロールできない時、UPS 自体をシャットダウンさせる

NETSERVER on

NIS を有効

NISIP 0.0.0.0

リクエストを受け付ける IP アドレス

NISPORT 3551

NIS Server の Port 番号
Firewall の設定で指定ポート(TCP)を開いてください

UPSCLASS standalone

APC ShareUPS を使用している場合以外は、通常 standalone

UPSMODE disable

APC ShareUPS を使用している場合以外は、通常 disable



NIS Client の設定





UPSCABLE ether

ネットワーク経由の設定

UPSTYPE net

UPS の接続タイプを指定

DEVICE 192.168.0.80:3551

NIS Server の IP:Port を指定

NETSERVER on

NIS を有効

UPSCLASS standalone

APC ShareUPS を使用している場合以外は、通常 standalone

UPSMODE disable

APC ShareUPS を使用している場合以外は、通常 disable



Apcupsd の起動および、動作確認



NIS Server の確認


起動は下記コマンドから。ついでに自動起動も設定します。


$ sudo /etc/rc.d/init.d/apcupsd start
$ sudo /sbin/chkconfig apcupsd on


設定の確認は、下記コマンドを実行します。下記のようにズラズラと出てくれば接続成功です。


$ apcaccess status
APC : 001,052,1243
DATE : Fri Feb 06 17:40:30 JST 2009
HOSTNAME : example
RELEASE : 3.14.5
VERSION : 3.14.5 (10 January 2009) redhat
UPSNAME : UPS_IDEN
CABLE : APC Cable 940-0024C
MODEL : SMART-UPS 700
.
.
.


NIS Client の確認


Windows の場合は、自動的に起動時に apcupsd サービスが起動するようになっています。


タスクトレイにあるアイコンをダブルクリックすると、状態を確認できます。



Apcupsd をブラウザから管理


Apcupsd には、CGI で UPS の状態を参照できるスクリプトが用意されています。このスクリプトを利用し、Web 経由で状態を確認できるようにします。


SourceForge.net から、rpm パッケージをダウンロードします。apcupsd-multimon-x.x.x.rpm をダウンロードし、インストールです。



$ wget http://jaist.dl.sourceforge.net/sourceforge/apcupsd/apcupsd-multimon-3.14.5-1.el4.i386.rpm
$ rpm -ivh apcupsd-multimon-3.14.5-1.el4.i386.rpm


次のようなエラーが出た場合は、gd を更新 します。


エラー: Failed dependencies:
gd >= 2.0 is needed by apcupsd-multimon-3.14.5-1.i386
libgd.so.2 is needed by apcupsd-multimon-3.14.5-1.i386
Suggested resolutions:
/home/buildcentos/CENTOS/en/4.0/i386/CentOS/RPMS/gd-2.0.28-5.4E.i386.rpm

$ wget ftp://mirror.switch.ch/pool/3/mirror/centos/4.6/os/i386/CentOS/RPMS/gd-2.0.28-5.4E.i386.rpm
$ sudo rpm -Uvh gd-2.0.28-5.4E.i386.rpm


インストール後は、 /var/www/cgi-bin にある次のファイルを、Web サーバの cgi ディレクトリにコピーします。



  • multimon.cgi

  • upsfstats.cgi

  • upsimage.cgi

  • upsstats.cgi


ブラウザから http://example/cgi-bin/multimon.cgi へ Web 経由でアクセスし、次のような画面が表示されれば成功です。



Apcupsd をテストする



最後に、実際に電源障害があった事態を想定しテストをしてみます。


テストのため、設定ファイル (/etc/apcupsd/apcupsd.conf) の下記ディレクティブの TIMEOUT を変更しておきます。

BATTERYLEVEL, MINUTES, そして TIMEOUT は、どれか早い方の条件が満たされた場合にシャットダウンが開始されます。

設定変更後は、 Apcupsd の再起動を忘れずに。


なお、電源復旧時にマシンが自動的に起動するためには、BIOS 設定が必要になります。デフォルトでは、電源復旧時に自動起動する設定は OFF になっていることが多いので、確認が必要です。



BATTERYLEVEL 5

バッテリ残量が指定値以下(%)

MINUTES 3

バッテリ駆動が可能な予想残り時間が指定値以下(分)

TIMEOUT 300

バッテリ駆動となってからの時間が指定値経過(秒)




短期停電


UPS がバッテリ駆動となり、サーバがシャットダウンが開始される前に電源が復旧した場合を想定します。



  1. UPS の電源コードを引っこ抜きます

    • UPS の警告音が鳴り響き、UPS がバッテリ駆動になります

    • ログに Power failure on UPS UPSNAME. Running on batteries. と表示されます



  2. UPS の電源コードを接続します

    • UPS が商用電源モードに復旧します

    • ログに Power is back. UPS running on mains. と表示されます




apcupsd[3505]: Power failure.
apcupsd[3505]: Running on UPS batteries.

Broadcast message from root :

Power failure on UPS SMART-UPS_700. Running on batteries.
wall[15799]: wall: user root broadcasted 1 lines (59 chars)

Broadcast message from root :

Power has returned on UPS SMART-UPS_700...
apcupsd[3505]: Mains returned. No longer on UPS batteries.
apcupsd[3505]: Power is back. UPS running on mains.
wall[15861]: wall: user root broadcasted 1 lines (44 chars)

上記の Apcupsd からのメッセージは、root 宛てにメールでも送信されます。



長期停電


UPS がバッテリ駆動となり、サーバがシャットダウンが開始された後に電源が復旧した場合を想定します。



  1. UPS の電源コードを引っこ抜きます

    • UPS の警告音が鳴り響き、UPS がバッテリ駆動になります

    • ログに Power failure on UPS UPSNAME. Running on batteries. と表示されます



  2. 設定したシャットダウン条件を満たすまで放置します

    • ログに Reached run time limit on batteries. と表示されます

    • 接続されたマシンがシャットダウンされます



  3. 接続されたマシンがすべてシャットダウンした後に、UPS もシャットダウンされるまで放置します

    • UPS がシャットダウンされます

      ※Smart-UPS では、フロントパネルの LED が連続的に点灯する状態になります



  4. UPS の電源コードを接続します

    • UPS が再起動します

    • UPS が商用電源モードに復旧します

    • 接続されたマシンが再起動します

      ※自動で再起動しない場合は、BIOS の設定を見直してください。




apcupsd[3280]: Power failure.
apcupsd[3280]: Running on UPS batteries.
wall[4761]: wall: user root broadcasted 1 lines (59 chars)
apcupsd[3280]: Reached run time limit on batteries.
apcupsd[3280]: Initiating system shutdown!
apcupsd[3280]: User logins prohibited
wall[5185]: wall: user root broadcasted 1 lines (67 chars)
wall[5188]: wall: user root broadcasted 1 lines (47 chars)
shutdown: shutting down for system halt


参考:


2009/03/04

WebObjects 5.2.4 を Apache 2.2 (CentOS 5.2) で動かす

アップル - WebObjects

WebObjects とは、アップル社が開発した、Java による Webアプリケーションフレームワークで、強力なWebサービスを簡単に構築することができる素晴らしいツールです。


Apple社自身でも、Apple Store, MobileMe(旧.Mac), iTunes Store などを WebObjects で構築しています。


そんな WebObjects ですが、弊社で使用している WebObjects 5.2 は、Linux の場合 Apache 1.3 でないと動いてくれません。


しかしながら、最近の OS はより高機能な Apache 2.2 系が搭載されており、できれば Apache 2.2 系で動作させたいものです。

これまで何度かチャレンジしたものの、なかなかうまく動いてくれませんでした・・・。


今回やっとうまくいったのでメモしておきます。



Java のインストール


WebObjects 5.2.4 では、Java 1.4 系を使用します。


$ chmod +x j2re-1_4_2_19-linux-i586-rpm.bin
$ ./j2re-1_4_2_19-linux-i586-rpm.bin
inflating: j2re-1_4_2_19-linux-i586.rpm
Done.

$ sudo rpm -ihv j2re-1_4_2_19-linux-i586.rpm
########################################### [100%]

$ sudo vi /etc/profile.d/java.sh
# Java
export JAVA_HOME=/usr/java/j2re1.4.2_19
export PATH=$PATH:$JAVA_HOME/bin

$ sudo chmod +x /etc/profile.d/java.sh
$ source /etc/profile.d/java.sh

$ java -version
java version "1.4.2_19"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_19-b04)
Java HotSpot(TM) Client VM (build 1.4.2_19-b04, mixed mode)

$ java -version -server
java version "1.4.2_19"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_19-b04)
Java HotSpot(TM) Server VM (build 1.4.2_19-b04, mixed mode)


WebObjects 5.2 のインストール


さて、本体のインストールです。インストールCDの Deployment/SOLARIS フォルダを ftp でアップしています。


はじめに install.sh を修正します。修正内容は、"-pxZf" を "-pxzf" に修正します。(3か所あります)


$ 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

INSTALLATION:
Beginning WebObjects 5.2 full installation:

. Creating WebObjects installation directory ...
. Creating WebObjects' Applications and Frameworks directories ...
. Installing WebObjects Adaptor source ...
. Installing WebObjects Deployment ...
. Installing WODocumentRoot frameworks into document root ...
. Creating startup scripts ...
. ... Done.

WebObjects 5.2 Deployment, Full Install is now installed.

$ sudo chmod +x /etc/profile.d/webobjects.sh
# WebObjects
export NEXT_ROOT=/opt/Apple

$ sudo chmod +x /etc/profile.d/webobjects.sh
$ source /etc/profile.d/webobjects.sh


WebObjects 5.2 を WebObjects 5.2.4 へ


WebObjects 5.2 の最終バージョンは 5.2.4 ですので、アップデートします。アップデートファイルはこちらから。


$ wget http://download.info.apple.com/Apple_Support_Area/Apple_Software_Updates/MultiCountry/Enterprise/webobjects/patches/5.2/WO524Solaris.tar.gzip
$ wget http://download.info.apple.com/Apple_Support_Area/Apple_Software_Updates/MultiCountry/Enterprise/scripts/patcher.sh
$ vi patcher.sh
# COMPRESS=Z # gnutar compress flag: 'Z' or 'z' or ''
# Z を z に修正
COMPRESS=z # gnutar compress flag: 'Z' or 'z' or ''

$ chmod 511 patcher.sh
$ sudo ln -s /bin/tar /bin/gnutar
$ sudo ./patcher.sh -install WO524Solaris.tar.gzip -next_root $NEXT_ROOT
No errors, extracting patch

Install of wo524/WO524Solaris.tar.gzip successful

$ sudo cp -rf $NEXT_ROOT/Library/WebObjects/WODocumentRoot/WebObjects /var/www/html/

$ sudo vi $NEXT_ROOT/Library/Frameworks/JavaWebObjects.framework/Resources/WebServerConfig.plist
//DocumentRoot = "/Library/WebServer/Documents";
DocumentRoot = "/var/www/html";



アダプタの作成


いよいよ本番、Apache 2.2 対応のアダプタを作成します。ソースは Project Wonder から取得します。


$ sudo yum install httpd-devel
$ wget http://webobjects.mdimension.com/wonder/releases/Wonder-5.0.0.8972-Source.tar.gz
$ tar -zxvf Wonder-5.0.0.8972-Source.tar.gz
$ cd Wonder/Utilities/Adaptors/

$ vi make.config
#ADAPTOR_OS = MACOS
ADAPTOR_OS = LINUX
CC = gcc

$ make
$ cd Apache2.2/
$ sudo /usr/sbin/apxs -i -a -n WebObjects mod_WebObjects.la

$ vi apache.conf
LoadModule WebObjects_module modules/mod_WebObjects.so
#LoadModule WebObjects_module modules/mod_WebObjects.so

$ sudo cp apache.conf /etc/httpd/conf.d/webobjects.conf
$ sudo chmod 644 /etc/httpd/conf.d/webobjects.conf

$ sudo vi /etc/httpd/conf/httpd.conf
#ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

$ sudo /usr/sbin/httpd -M
Loaded Modules:
WebObjects_module (shared)
Syntax OK

$ sudo /etc/rc.d/init.d/httpd restart


SELinux


SELinux を使っている場合は、httpd よる 1085 ポート(wotaskd)への接続が拒否されてしまいます。


setroubleshoot: SELinux は http デーモンによるネットワークポート 1085 ヘの接続を阻止しています。 For complete SELinux messages.

次のようにして httpd がネットワークポートに接続するのを許可します。


$ sudo /usr/sbin/setsebool -P httpd_can_network_connect=1


動作確認


最後に、起動スクリプトの作成と自動起動です。


$ sudo vi /etc/rc.d/init.d/WOServices
#!/bin/sh
#
# Startup script for the WebObjects
#
# chkconfig: 345 85 15
# description: WebObject services
#

# Source function library.
. /etc/rc.d/init.d/functions

export PATH=/usr/java/j2re1.4.2_19/bin/:$PATH
WOSERVICES_SCRIPT="/opt/Apple/Library/WebObjects/Executables/WOServices"

# See how we were called.
case "$1" in
start)
echo -n "Starting WebObjects: "
daemon ${WOSERVICES_SCRIPT} start
echo
touch /var/lock/subsys/WebObjects
;;
stop)
echo -n "Shutting down WebObjects: "
${WOSERVICES_SCRIPT} stop
echo
rm -f /var/lock/subsys/WebObjects
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac

exit 0


$ sudo chmod +x /etc/rc.d/init.d/WOServices
$ sudo /etc/rc.d/init.d/WOServices start
Starting WebObjects: Beginning WebObjects services startup...
[ OK ]
$ sudo /sbin/chkconfig --add WOServices


root より JavaMonitor が起動できればOKです。


# $NEXT_ROOT/Library/WebObjects/JavaApplications/JavaMonitor.woa/JavaMonitor -WOPort 56789 &

Monitor for WebObjects 5

参考:


2009/02/27

CentOS 5.2 の vsftpd

www.centos.org - The Community ENTerprise Operating System

CentOS 5.2 標準の FTPサーバ vsftpd ですが、設定は間違ってないはずなのになぜかログインできません。


FTP クライアントのログには次のように出力されています。


500 OOPS: cannot change directory:/home/xxx
500 OOPS: child died
ログインできません.


サーバのログを見ると・・・


setroubleshoot: SELinux は ftp デーモンによるユーザーのホームディレ クトリ (./home) の読み込みを阻止しています。 For complete SELinux messages.


どうやら、OS のセキュリティを高める機能である、SELinux が vsftp によるホームディレクトリへのアクセスを拒否していたようです。


次のようにすることで、解除できます。


$ sudo /usr/sbin/setsebool -P ftp_home_dir 1

これで問題なくアクセスできます。

2009/02/26

MySQL 3.23.58 を CentOS 5.2 にインストールする

MySQL ::  世界でもっとも普及している、オープン ソース データベース
[10.09.15 update]ソースファイルのリンクを修正

自社サーバを一台新調することになったのですが、とある事情から MySQL は Ver 3.23.58 を使用しなければならず、でも Apache は 2.2 系を使いたい!

というわけで、OS やその他の環境は最新の CentOS 5.2 を使用し、MySQL 3.23.58 はソースからインストールすることにしました。

しかしながら、最新の環境にきわめて古いソフトをインストールすると、ほぼ間違いなく躓くもので。


ダウンロード


まずはダウンロードですが、もはや公式サイトのアーカイブにも見当たりません・・・

ので、MySQL日本正規代理店の SoftAgency 様から拝借いたします。

既に SoftAgency 様にも見当たらなくなってしまいました。
ですので、ソースファイルはこちらにアップしておきます。

>> Download MySQL-3.23.58

$ wget http://download.softagency.net/MySQL/Downloads/MySQL-3.23/mysql-3.23.58.tar.gz
$ tar -zxvf mysql-3.23.58.tar.gz
$ cd mysql-3.23.58/


Configure


Makefile ファイルを作成するために、configure を実行します。

$ ./configure \
 --prefix=/usr/local/mysql \
 --with-charset=sjis \
 --with-extra-charsets=all \
 --with-mysqld-user=mysql \
 --without-bench \
 --localstatedir=/home/mysql/data

checking "LinuxThreads"... "Not found"
configure: error: This is a linux system and Linuxthreads was not
found. On linux Linuxthreads should be used.  Please install Linuxthreads
(or a new glibc) and try again.  See the Installation chapter in the
Reference Manual for more information.

やっぱりエラーが。

どうやら CentOS 5 では Linuxthreads はサポートされなくなったようで(CentOS 4 まではサポートされていたようです)、configure のオプションで thread の方法を指定します。

$ ./configure \
 --prefix=/usr/local/mysql \
 --with-charset=sjis \
 --with-extra-charsets=all \
 --with-mysqld-user=mysql \
 --without-bench \
 --localstatedir=/home/mysql/data \
 --with-named-thread-libs="-lpthread"

checking for termcap functions library... configure: error: No curses/termcap library found

今度は、curses library がないとおっしゃいます。インストールし、再チャレンジ。

$ yum search ncurses
ncurses.i386 : A terminal handling library
ncurses-devel.i386 : Development files for the ncurses library

$ sudo yum install ncurses.i386
Package ncurses - 5.5-24.20060715.i386 is already installed.

$ sudo yum install ncurses-devel.i386
Installed: ncurses-devel.i386 0:5.5-24.20060715
Complete!

$ ./configure \
 --prefix=/usr/local/mysql \
 --with-charset=sjis \
 --with-extra-charsets=all \
 --with-mysqld-user=mysql \
 --without-bench \
 --localstatedir=/home/mysql/data \
 --with-named-thread-libs="-lpthread"

MySQL has a Web site at http://www.mysql.com/ which carries details on the
latest release, upcoming features, and other information to make your
work or play with MySQL more productive. There you can also find
information about mailing lists for MySQL discussion.

Remember to check the platform specific part of the reference manual for
hints about installing MySQL on your platform. Also have a look at the
files in the Docs directory.

Thank you for choosing MySQL!

OK! うまくいきました!


Make


さて、お次はコンパイルです。

$ make
mysqld.o: In function `main':
mysqld.cc:(.text+0x3450): undefined reference to `my_fast_mutexattr'
mysqld.cc:(.text+0x3464): undefined reference to `my_fast_mutexattr'
mysqld.cc:(.text+0x3478): undefined reference to `my_fast_mutexattr'
mysqld.o:mysqld.cc:(.text+0x34a0): more undefined references to `my_fast_mutexattr' follow
collect2: ld returned 1 exit status
make[4]: *** [mysqld] エラー 1

my_fast_mutexattr が定義されてないと。

そこで、定義を強制するように修正します。

$ vi mysys/my_thr_init.c
/my_fast_mutexattr

#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
pthread_mutexattr_t my_fast_mutexattr;
#endif

これを、下記のようにします。

//#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
pthread_mutexattr_t my_fast_mutexattr;
//#endif

これでなんとかコンパイルができました。


Maike Install


最後にインストールです。ここまでくればOKでしょう。

$ sudo make install

お疲れ様です!

2009/01/23

[GAE]Google App Engine を使ってみる Hello, webapp World!

前回は、単純な CGI を試してみましたが、今回は、Google App Engine に提供されている webapp というフレームワークを使ってみます。



Hello, webapp!


webapp は次の3つのパートからなります。



  • リクエストの処理と、レスポンスを生成する、RequestHandler クラス

  • URL に従ってリクエストをルーティングする、WSGIApplication インスタンス

  • WSGIApplication を起動する、メインルーチン


さっそく、helloworld.py を書き換えてみます。


helloworld/helloworld.py
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

class MainPage(webapp.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write('Hello, webapp World!')

application = webapp.WSGIApplication(
[('/', MainPage)],
debug=True)

def main():
run_wsgi_app(application)

if __name__ == "__main__":
main()


開発サーバを起動し、http://localhost:8080 にアクセスします。

ブラウザに Hello, webapp World! が表示されれば成功です!




参考:


2009/01/22

[GAE]Google App Engine を使ってみる Hello, World!


昨年の4月にリリースされた、Google App Engine ですが、アカウントを申請したままずっと放置していました。


「一年の計は元旦にあり」ということで、今後ますますクラウド化していく世の中に備え、Google App Engine、Amazon Web Services は押さえておかなければなりません。


そこで、まずは Google App Engine を使ってみました。



使い始めるのは簡単で、



  1. Python のインストール

  2. Google App Engine SDK のインストール


これですぐにローカルで開発が始められます。


Hello, World!


なにはともあれ、まずは Hello, World! ですね。


シンプルな Request Handler を作成

helloworld ディレクトリを作成し、その中に helloworld.py を作成します。


helloworld/helloworld.py
print 'Content-Type: text/plain'
print ''
print 'Hello, World!'

設定ファイルを作成

helloworld ディレクトリに、app.yml を作成します。


helloworld/app.yml
application: helloworld
version: 1
runtime: python
api_version: 1

handlers:
- url: /.*
script: helloworld.py

アプリケーションのテスト

dev_appserver.py を実行し、ウェブサーバを起動します。実行するアプリケーションディレクトリのパスを渡します。


google_appengine/dev_appserver.py helloworld/

開発サーバが起動したら、http://localhost:8080 にアクセスします。

ブラウザに Hello, World! が表示されれば成功です!



参考: