アーカイブ:  « 2008年1月 | メイン | 2008年3月 »

2008年2月28日

tracの初期設定をする

tracの初期設定について説明する。tracは/install_path/tracに構築されたものとして説明しているので、適宜読み替えて欲しい。

# cd /install_path/
# trac-admin trac
Welcome to trac-admin 0.10.4
Interactive Trac administration console.
Copyright (c) 2003-2006 Edgewall Software

Type: '?' or 'help' for help on commands.

Trac [/install_path/trac]> permission list

もし以下のようになる場合には、ログイン時の権限があるかどうか確認して欲しい。通常はapacheが所有者になっているから、rootユーザーとなるか、グループへの権限を付与するなどをしなければならなくなるだろう。

Command failed: The user XXXX requires read _and_ write permission to the database file /install_path/trac/db/trac.db and the directory it is located in.


User Action
--------------------------
anonymous BROWSER_VIEW
anonymous CHANGESET_VIEW
anonymous FILE_VIEW
anonymous LOG_VIEW
anonymous MILESTONE_VIEW
anonymous REPORT_SQL_VIEW
anonymous REPORT_VIEW
anonymous ROADMAP_VIEW
anonymous SEARCH_VIEW
anonymous TICKET_CREATE
anonymous TICKET_MODIFY
anonymous TICKET_VIEW
anonymous TIMELINE_VIEW
anonymous WIKI_CREATE
anonymous WIKI_MODIFY
anonymous WIKI_VIEW


Available actions:
CONFIG_VIEW, MILESTONE_ADMIN, MILESTONE_CREATE, MILESTONE_DELETE,
MILESTONE_MODIFY, MILESTONE_VIEW, REPORT_ADMIN, REPORT_CREATE,
REPORT_DELETE, REPORT_MODIFY, REPORT_SQL_VIEW, REPORT_VIEW, ROADMAP_ADMIN,
ROADMAP_VIEW, SEARCH_VIEW, TICKET_ADMIN, TICKET_APPEND, TICKET_CHGPROP,
TICKET_CREATE, TICKET_MODIFY, TICKET_VIEW, TIMELINE_VIEW, TRAC_ADMIN,
WIKI_ADMIN, WIKI_CREATE, WIKI_DELETE, WIKI_MODIFY, WIKI_VIEW


# trac-admin trac permission add (ログインユーザー名) TRAC_ADMIN
# trac-admin trac/ permission list

User Action
--------------------------
anonymous BROWSER_VIEW
anonymous CHANGESET_VIEW
anonymous FILE_VIEW
anonymous LOG_VIEW
anonymous MILESTONE_VIEW
anonymous REPORT_SQL_VIEW
anonymous REPORT_VIEW
anonymous ROADMAP_VIEW
anonymous SEARCH_VIEW
anonymous TICKET_CREATE
anonymous TICKET_MODIFY
anonymous TICKET_VIEW
anonymous TIMELINE_VIEW
anonymous WIKI_CREATE
anonymous WIKI_MODIFY
anonymous WIKI_VIEW
matsuda TRAC_ADMIN

TRAC_ADMINだとロードマップにおけるマイルストーンの追加や削除を画面上からすることができます。anonymous権限はデフォルトを意味するので、この権限表に存在しないユーザーはanonymousとみなされます。バグ報告などをしてもらうユーザーをデフォルトとするならば、WIKI_CREATE を削除すると良いと思います。(変更されたくない場合には読み取り専用にするにすれば、所有者しか変更できなくなります)
なお、removeする際にマッチしないユーザーがいてもエラーにならないので、削除した後は必ずpermission listを確認する。
詳しい権限については、Tracの権限設定(http://hackmylife.net/2007/02/trac.html)が参考になります。


Trac [/install_path/trac]> component list

Name Owner
--------------------
component1 somebody
component2 somebody

Trac [/install_path/trac]> component add (コンポーネント) somebody
Trac [/install_path/trac]> priority list

Possible Values
---------------
blocker
critical
major
minor
trivial

Trac [/install_path/trac]> priority remove blocker
Trac [/install_path/trac]> priority add "その他"

Trac [/install_path/trac]> version list
Trac [/install_path/trac]> version remove 2.0
選択肢がない場合にはチケット属性の項目から表示されなくなる。

分類の項目をカスタマイズする。

Trac [/install_path/trac]> ticket_type list
Trac [/install_path/trac]> ticket_type remove defect
Trac [/install_path/trac]> ticket_type add "不具合"
Trac [/install_path/trac]> ticket_type add "機能改善"
Trac [/install_path/trac]> ticket_type add "その他"

もし、機能改善を上にしたいのなら、
Trac [/install_path/trac]> ticket_type order "機能改善" up
とするだけだ。

そして終了する。
Trac [/install_path/trac]> exit


お勧めの使い方。
まず、ロードマップにあるマイルストーンをすべて(milestone1~milestone4)削除します。
ある目標ごとにマイルストーンを作成します。(ベータリリースとか公開リリースとか)

trac.ini

[notification]
always_notify_owner = false
always_notify_reporter = false

〇参考サイト
Server/trac/使い方
http://www.takebay.net/~nao/index.php?Server%2Ftrac%2F%BB%C8%A4%A4%CA%FD
http://ameblo.jp/itboy/entry-10036354850.html

2008年2月22日

ORA-12518: TNS:listener could not hand off client connection

生肉さんの暇潰し@hatenaがとても役に立つ。

Windowsではoracle.exeのプロセスが1つしかないため、SGA領域を大きく取ろうとするとこのエラーが起こる。アプリケーションサーバー再起動時にエラーがすぐ起こればよいが、接続数が多くなってきたときにこのエラーが起こると運用上問題があるので、SGA領域を変更するのであれば、十分な設計が必要。

パフォーマンスモニタでカウンタの追加を行い、
パフォーマンスオブジェクト Process
カウンタ Virtual Bytes
インスタンス oracle
で2GBを超えるかどうかで判断。

チューニングすべきパラメータはSGA_TARGET, PGA_AGGREGATE_TARGETであり、通常はOracle Enterprise Managerを利用して変更できる。コマンドラインから変更する方法については、Oracle管理者のためのSQLリファレンスが詳しい。

2008年2月20日

5万円切るモバイル端末「Eee PC」はどれだけ「使える」のか?

「Eee PC」の記事がBCNランキングに掲載されていた。機能がよさそうな記事になっていたので、スペックが気になり2ページ目のスペックを見てみたら、、、、

■「Eee PC 4G-X」の主なスペック

●OS:WindowsR XP Home Edition
●CPU:インテルモバイルCPU
●画面:7型ワイド
●メモリ:512MB
●フラッシュメモリドライブ:4GB
●無線LAN:IEEE802.11b/g
●USB端子:USB2.0×3
●サイズ:幅225×奥行き164×高さ22-37mm
●重量:約920kg

重量が920kgだなんてまったくモバイルできそうにない・・・・(笑

マスメディアにいる人間としてちゃんと記事は校正をしてほしいものだ。

2008年2月19日

postfixでバーチャルドメイン運用

/etc/postfix/main.cf のmydomainにabc.comが定義されており、hogehoge@def.com でもhogehoge@abc.com と同じように abcユーザーのメールボックスに入ってよい場合
⇒/etc/postfix/main.cf のmydestination に def.com を追加する

ユーザーアカウントならびにドメインごとに異なる メールボックスに配送する必要がある場合。ももしくは、/etc/postfix/main.cf のmydomainにドメインが定義されて場合
⇒/etc/postfix/main.cf に
virtual_alias_maps = hash:/etc/postfix/virutal
と定義した上で、
/etc/postfix/virtual に
ドメイン名 anything
メールアドレス 配送先アカウント
という記述を行う。

なお、
@ドメイン名 配送先アカウント
と記述すると該当ドメインにおいてメールアドレスが定義されていないものは指定されたアカウントへ配送できる。

qmailのログの見方

一連のメール配送の流れをつかむためには、ログのフォーマットについて理解が不可欠だが、qmail のある暮らしがとてもわかりやすい。

2008年2月 7日

sendmailで複数ドメイン運用

あまりやりたくない運用だけれども、やらざるを得ないときもあるということで設定するための方法は以下のとおり。

1./etc/mail/local-host-namesにローカル配送するためのドメインを記述する
aaa.com
のような感じ。この設定を変更した場合には、サービスの再起移動が必要。

2./etc/mail/virtusertableにエイリアスを設定する。
たとえば、xxx@aaa.com宛てのメールを zzz@bbb.com に転送するときは
xxx@aaa.com zzz@bbb.com
とする。

3.makemap hash /etc/mail/virtusertable.db < /etc/mail/virtusertable
を実行して、登録内容を更新する。なお、virtusertableを変更してmakemapしたらサービスの再起動は不要。

ちなみにsendmailのキューは /var/spool/mqueue にたまるので、うまくメールが受信できないようであれば、トラブルシュートの手段のひとつとして、ここにたまっていないか確認する必要がある。

2008年2月 4日

検索結果が正しくない

なぜか「中」を含む文字列を調べようとしているのに、「団」とか「台」が検索されてしまう。
どうやらMySQLをrpmでインストールするとlatin1がデフォルト文字コードセットになってしまっていてそれでマルチバイトの検索がうまくいかないことがあるようだ。

現在の文字コード設定をチェックしてみる。
mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

binaryというのは無変換を示している。現在は、入力された文字がlatin1と見なされ、latin1のデータベースに登録されるため、例えばEUCの文字で登録した場合でもデータが破壊されることはない。

データベースのデフォルト文字コードをEUCにするためには、/etc/my.iniに以下のように設定して再起動すればよい。

[mysqld]
default-character-set=ujis
skip-character-set-client-handshake

何もデータがない状態であれば、これでよいのだが、もうすでに運用済みの場合にはこれではデータが破壊されてしまう。(登録済みデータがlatin1なのに変更後はEUCと見なされて処理されるため)

不幸なことに、自分はUTF-8で運用しているデータベースもあれば、EUC-JPで運用しているデータベースもあるため、一括で変換することも難しい。

今回はいろいろ調べた結果、特定のデータベースの文字コードセットだけを変更する方法があったので紹介したい。hogehogeデータベースに対してlatin1からEUC-JPへ変換する方法をご紹介する。

#ダンプ(hogehoge.dmp)を取得する。
mysqldump --default-character-set=binary -u root news --password=XXXX > hogehoge.dmp
#MySQLへログインし、データベースのcharacter_set_databaseを変換する。
alter database hogehoge character set ujis;
#hogehoge.dmp の中のSQL文にcharsetが指定されている箇所があるので、viなどで開きlatin1からujisへ置換しておく。
mysql -u root -p hogehoge --default-character-set=ujis < hogehoge.dmp で取り込む

これで正しく取り込めるのだが、問題はクライアントの問い合わせ方法になる。
alter database news character set ujis; のSQLで変更されているのはcharacter_set_databaseだけであることが分かる。

mysql -u root -p hogehoge
mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | ujis |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

このままだと、発行されるクエリはlatin1と見なされるが、データベースの内部文字コードはEUCなので、SELECT文はマッチしないだろうし、INSERT文などを発行すればデータが破壊されてしまう。
そこで、以下のSQLを事前に発行すると・・・

mysql> set names ujis;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | ujis |
| character_set_connection | ujis |
| character_set_database | ujis |
| character_set_filesystem | binary |
| character_set_results | ujis |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

となる。つまり、SET NAMES ujis文によってcharacter_set_client、character_set_connection、character_set_databaseがEUCとなる。ちなみにcharacter_set_serverはデフォルト文字コードセットなので、latin1となっているが特に問題は発生しない。またcharater_set_systemはUTF-8固定でありこちらも処理上は問題はない。

※SET NAMES ujis; とおなじクエリを接続時にパラメータとして渡すこともできる。
mysql -u root -p hogehoge --default-character-set=ujis
mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | ujis |
| character_set_connection | ujis |
| character_set_database | ujis |
| character_set_filesystem | binary |
| character_set_results | ujis |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)


もしPHPなどのプログラムによってクエリを発行する場合には、データベースへ接続後
set names ujis;
を実行する必要がある。

今回の問題について非常に有益となったサイトを最後にご紹介する。
http://www.mysql.gr.jp/frame/modules/bwiki/index.php?FAQ#fb74bab6
MySQLの文字コードに関するメモ

2008年2月 2日

Fedora Coreにtracをインストールする

何人かで開発をしようとしても、なかなかバグの修正管理がうまくいかないとか、ドキュメントがいろんなところに転がってしまい情報が分散化したり、作ったけれども使われないとか。。。
そんななかでtracは情報の集約化とバグ管理を統合的に行える。
実際にインストールをしてみた。結構インストールが面倒くさいだろうと二の足を踏んでいたが、以外に簡単にできることが分かった。

1.Tracをインストールする
Fedora Coreであれば、そのままyumコマンドでインストールできる。

# yum install trac


Loading "installonlyn" plugin
Setting up Install Process
Setting up repositories
Reading repository metadata in from local files
Parsing package install arguments
Resolving Dependencies
--> Populating transaction set with selected packages. Please wait.
---> Package trac.noarch 0:0.10.4-1.fc6 set to be updated
--> Running transaction check
--> Processing Dependency: subversion >= 1.1 for package: trac
--> Processing Dependency: python-clearsilver >= 0.9.3 for package: trac
--> Restarting Dependency Resolution with new changes.
--> Populating transaction set with selected packages. Please wait.
---> Package subversion.i386 0:1.4.3-2.fc6 set to be updated
---> Package python-clearsilver.i386 0:0.10.4-4.fc6 set to be updated
--> Running transaction check

Dependencies Resolved

=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
trac noarch 0.10.4-1.fc6 extras 773 k
Installing for dependencies:
python-clearsilver i386 0.10.4-4.fc6 extras 132 k
subversion i386 1.4.3-2.fc6 updates 2.3 M

Transaction Summary
=============================================================================
Install 3 Package(s)
Update 0 Package(s)
Remove 0 Package(s)

Total download size: 3.2 M
Is this ok [y/N]: y
Downloading Packages:
(1/3): subversion-1.4.3-2 100% |=========================| 2.3 MB 00:02
(2/3): python-clearsilver 100% |=========================| 132 kB 00:00
(3/3): trac-0.10.4-1.fc6. 100% |=========================| 773 kB 00:00
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing: python-clearsilver ######################### [1/3]
Installing: subversion ######################### [2/3]
Installing: trac ######################### [3/3]

Installed: trac.noarch 0:0.10.4-1.fc6
Dependency Installed: python-clearsilver.i386 0:0.10.4-4.fc6 subversion.i386 0:1.4.3-2.fc6
Complete!


2.次に一般ユーザーでプロジェクトを作成する。ここでは/root/path/tracというフォルダ(そのようなフォルダは一般的にはありません)にプロジェクトを作成したと仮定して説明する。
$ trac-admin trac/ initenv


Creating a new Trac environment at /root/path/trac

Trac will first ask a few questions about your environment
in order to initalize and prepare the project database.

Please enter the name of your project.
This name will be used in page titles and descriptions.

Project Name [My Project]> (ここにプロジェクト名を入れる)

Please specify the connection string for the database to use.
By default, a local SQLite database is created in the environment
directory. It is also possible to use an already existing
PostgreSQL database (check the Trac documentation for the exact
connection string syntax).

Database connection string [sqlite:db/trac.db]>(何も入力しない)

Please specify the type of version control system,
By default, it will be svn.

If you don't want to use Trac with version control integration,
choose the default here and don't specify a repository directory.
in the next question.

Repository type [svn]>(何も入力しない)

Please specify the absolute path to the version control
repository, or leave it blank to use Trac without a repository.
You can also set the repository location later.

Path to repository [/path/to/repos]> (何も入力しない)

Please enter location of Trac page templates.
Default is the location of the site-wide templates installed with Trac.

Templates directory [/usr/share/trac/templates]>(何も入力しない)

Creating and Initializing Project
Installing default wiki pages
/usr/share/trac/wiki-default/WikiDeletePage => WikiDeletePage
/usr/share/trac/wiki-default/TracImport => TracImport
/usr/share/trac/wiki-default/TracReports => TracReports
/usr/share/trac/wiki-default/TracRoadmap => TracRoadmap
/usr/share/trac/wiki-default/WikiRestructuredText => WikiRestructuredText
/usr/share/trac/wiki-default/TracSearch => TracSearch
/usr/share/trac/wiki-default/TracInstall => TracInstall
/usr/share/trac/wiki-default/TracWiki => TracWiki
/usr/share/trac/wiki-default/TracEnvironment => TracEnvironment
/usr/share/trac/wiki-default/TracLinks => TracLinks
/usr/share/trac/wiki-default/TracInterfaceCustomization => TracInterfaceCustomization
/usr/share/trac/wiki-default/TracSupport => TracSupport
/usr/share/trac/wiki-default/TracQuery => TracQuery
/usr/share/trac/wiki-default/TracAccessibility => TracAccessibility
/usr/share/trac/wiki-default/TitleIndex => TitleIndex
/usr/share/trac/wiki-default/WikiRestructuredTextLinks => WikiRestructuredTextLinks
/usr/share/trac/wiki-default/WikiPageNames => WikiPageNames
/usr/share/trac/wiki-default/TracFastCgi => TracFastCgi
/usr/share/trac/wiki-default/InterMapTxt => InterMapTxt
/usr/share/trac/wiki-default/TracRss => TracRss
/usr/share/trac/wiki-default/TracLogging => TracLogging
/usr/share/trac/wiki-default/TracPlugins => TracPlugins
/usr/share/trac/wiki-default/TracBrowser => TracBrowser
/usr/share/trac/wiki-default/TracTickets => TracTickets
/usr/share/trac/wiki-default/TracTicketsCustomFields => TracTicketsCustomFields
/usr/share/trac/wiki-default/InterTrac => InterTrac
/usr/share/trac/wiki-default/WikiMacros => WikiMacros
/usr/share/trac/wiki-default/TracModPython => TracModPython
/usr/share/trac/wiki-default/TracGuide => TracGuide
/usr/share/trac/wiki-default/TracStandalone => TracStandalone
/usr/share/trac/wiki-default/TracBackup => TracBackup
/usr/share/trac/wiki-default/TracIni => TracIni
/usr/share/trac/wiki-default/WikiNewPage => WikiNewPage
/usr/share/trac/wiki-default/TracTimeline => TracTimeline
/usr/share/trac/wiki-default/RecentChanges => RecentChanges
/usr/share/trac/wiki-default/TracCgi => TracCgi
/usr/share/trac/wiki-default/WikiStart => WikiStart
/usr/share/trac/wiki-default/TracChangeset => TracChangeset
/usr/share/trac/wiki-default/TracUnicode => TracUnicode
/usr/share/trac/wiki-default/TracNotification => TracNotification
/usr/share/trac/wiki-default/SandBox => SandBox
/usr/share/trac/wiki-default/TracAdmin => TracAdmin
/usr/share/trac/wiki-default/TracUpgrade => TracUpgrade
/usr/share/trac/wiki-default/WikiProcessors => WikiProcessors
/usr/share/trac/wiki-default/TracRevisionLog => TracRevisionLog
/usr/share/trac/wiki-default/WikiFormatting => WikiFormatting
/usr/share/trac/wiki-default/CamelCase => CamelCase
/usr/share/trac/wiki-default/TracSyntaxColoring => TracSyntaxColoring
/usr/share/trac/wiki-default/WikiHtml => WikiHtml
/usr/share/trac/wiki-default/InterWiki => InterWiki
/usr/share/trac/wiki-default/TracPermissions => TracPermissions

Warning:

You should install the SVN bindings

---------------------------------------------------------------------
Project environment for 'Kataude Project' created.

You may now configure the environment by editing the file:

/root/path/trac/conf/trac.ini

If you'd like to take this new project environment for a test drive,
try running the Trac standalone web server `tracd`:

tracd --port 8000 /root/path/trac

Then point your browser to http://localhost:8000/trac.
There you can also browse the documentation for your installed
version of Trac, including information on further setup (such as
deploying Trac to a real web server).

The latest documentation can also always be found on the project
website:

http://trac.edgewall.org/

Congratulations!


3.作成できたフォルダの所有者をapacheにする。
# chown -R apache trac/


4.apacheの設定ファイルに以下の記述をする。なお、ここではprojというパスに対してアクセスがあった場合に見せるようにする。
Alias /trac /usr/share/trac/htdocs
ScriptAlias /proj /var/www/cgi-bin/trac.cgi

SetEnv TRAC_ENV "/root/path/trac"

5.apacheを再起動して、登録したパスにアクセスすれば、正しく表示できていることを確認できる。
http://hogehoge.com/proj


6.ただ、日本語化されていないので、インタアクト株式会社の日本語化ツールをダウンロードして、解凍する。
$ cd /tmp
$ wget http://www.i-act.co.jp/project/products/downloads/trac-0.10.4-ja-1.zip
$ unzip trac-0.10.4-ja-1.zip


7./usr/share/trac/にあるオリジナルのtemplatesならびにwiki-defaultのバックアップを取って、解凍した日本語版をコピーする。
# cd /usr/share/trac/
# mv templates/ templates.org
# mv wiki-default/ wiki-default.org
# cp -pR /tmp/trac-0.10.4-ja-1/templates/ ./
# cp -pR /tmp/trac-0.10.4-ja-1/templates/ ./
# cp -pR /tmp/trac-0.10.4-ja-1/wiki-default/ ./


8.もう一度アクセスすると日本語化されているのが分かる。ただ、anonymousユーザーでアクセスできてしまうので、ユーザー認証したいところ。これについては次回説明したい。(なお、AnonymousだとLoginしようとしてもエラーになる)

このドキュメント作成に当たり参考にさせていただいたサイトは以下のとおりです。
CentOSでyumからTracをインストール
Trac をインストールしてみたよ

/root/path/trac/conf/trac.iniを以下のようにApacheで設定したLocationにあわせて修正したほうが良い。(デフォルトのままだと左上のアイコンをクリックしてもエラーになってしまう)
[header_logo]
link = /proj

2008年2月 1日

qmailについて

qmailでキューにどれくらいのメールがあるか確認する方法について。

キューの数を確認する
/var/qmail/bin/qmail-qstat

キューの内容を確認する
/var/qmail/bin/qmail-qread

qmailの設定で注意すべき点。いろいろなqmailのインストール紹介サイトで
echo > /var/qmail/alias/.postmaster-alias
という記述が見られるが、

/var/qmail/alias/.postmaster-alias
が0byteだとpostmaster宛に送信することで /var/qmail/control/queuelifetime 秒間だけキューにたまり続けてしまい、多少なりとも負荷がかかる。メール爆弾を受けたらサーバーのサービスが止まるかもしれない。

なお、queuelifetimeを過ぎると
Unable to chdir to maildir. (#4.2.1)
I'm not going to try again; this message has been in the queue too long.
が送信元に返される。

ちなみに、ウィルスチェックソフト qmail-scannerが動作すると1メールあたりの処理時間が長くなるので高負荷になりやすく、alias対策は必須だ。

いろいろ調べている時に役に立ったのが、サーバー構築/ウェブアプリケーション開発 Program Rabo . 時間がある時にいろいろ見てみると良いと思う。