« November 2008 | Main | January 2009 »

December 2008

2008.12.31

Domain0/Uのpgbenchの比較

 Domain0とDomainUとでpgbenchを行い、どの程度パフォーマンスに差が出てくるか? なお、ディスクアクセスを行う領域等を厳密に揃えているわけではないので、あくまでも参考資料に過ぎませんが(理想は、Domain0/Uの違い以外は全て揃えること)。

 YaSTからPostgreSQL(8.3.5)をインストール(パッケージとしては、postgresql/postgresql-contrib/postgresql-libs/postgresql-serverの4つ)。rootの状態から、

# su postgres
> initdb /var/lib/pgsql/data/
> logout
# /etc/init.d/postgresql start
# su postgres
> createdb benchmark
> pgbench -i -s 100 benchmark

でデータベースを準備。

 「スケーリングファクター>クライアント数」でなければ結果はあまり当てにならないとのことなので、スケーリングファクターを100で設定(1,000万件のデータを作成)。

Continue reading "Domain0/Uのpgbenchの比較"

| | Comments (0) | TrackBack (1)

2008.12.30

openSUSE + Xen

 openSUSE(11.1)でXen環境構築の勉強。Domain0もDomainUも全てopenSUSE11.1で構築。まぁ、用途毎に仮想マシンを分けるようなイメージですかね。

【XenのDomain0の構築】
 基本は通常のopenSUSEのインストールと同様。今回のポイントは、以下のようなところでしょうか。

・インストールモードを選択する画面で、「自動設定を利用する」のチェックを外しておく(ここのチェックが入っていると、ホスト名やIPアドレスの設定をインストール後に行うこととなる)。
・デスクトップとして、Xfceを選択。Domain0用なので、X Serverすらインストールしないという選択肢もありますが、そこまでのスキルがないので・・・。
・パーティションとして2GBをSwapに40GBを/に割当。残りの領域(HDDは320GB)は仮想マシン用に残しておく。
・ユーザ名をセットする際、「このパスワードをシステム管理者用のものとしても使用する」および「自動ログイン」のチェックを外す。
・インストール対象とするソフトウェアを設定。デスクトップ機能から、「マルチメディア」「グラフィックス」「ゲーム」を「決してインストールしない」に変更。サーバ機能から「印刷サーバ」を「決してインストールしない」に変更。サーバ機能から「Xen仮想マシンホストサーバ」を「インストールする」に変更。

 再起動後の設定のポイントは、以下のような感じ。

・ホスト名とドメインを設定するところで、「DHCPでホスト名を変更」のチェックを外す。
・ファイアウォールの設定で、sshポートを開放。
・ネットワークインタフェースの「ネットワークブリッジ」に対して、IPアドレス(固定IPアドレスを割当)を設定。
・ネットワークの設定で、ネームサーバ、デフォルトゲートウェイを設定(今回は、ルータのIPアドレスを指定)。

 インストール完了後、PCの電源を入れた時にXenモードで起動してくるように/boot/grub/menu.lstファイル内のdefault 0の部分をdefault 2にする(正確には、Xen用のカーネルの設定番号を指定する)。また、DomainU用のディスクとして、40GBのパーティション(拡張パーティション)を複数作成しておく。なお、パーティションは、未フォーマットの状態(ファイルシステムとしては0x83 Linuxを選択)かつマウントしない状態としておく。「マウントに失敗しました」というメッセージが表示されるが、とりあえずは気にせずに続行(元々マウントを行おうとしていないのに、何故失敗するのか気になるところではありますが・・・)。

Continue reading "openSUSE + Xen"

| | Comments (0) | TrackBack (0)

2008.12.25

Xen徹底入門

 ひょんなことからXenを使うことになりそうな気配・・・。Xenがだいたいどういうものか知ってはいるものの、実際に使ったことがあるわけではなく。Webでもいろいろな情報はありますが、とりあえず一通りの内容をざっくりと勉強するために、「Xen徹底入門」なる本を購入。

 Domain0を可能な限りシンプルな状態にするというのは、ちょうどやりたいことでもあったのでなかなかいい感じです。コマンドの解説に関しても一通り(?)記載されているので、Xenで環境構築を行おうという場合には手頃な書籍なのではないかと。
 もっとも、試しにインストール(@openSUSE)した程度で、まだまだ勉強中の状態ではありますが。冬休みの課題かなぁ(笑)。

2009/01/04追記
 正誤表が公開されているようです。

| | Comments (0) | TrackBack (0)

2008.12.23

unboundをインストールしてみた

 某所で使用しているサーバ(VPS)は、Virtuozzo上で稼働しています。どうもメモリ不足っぽいエラーが出ている(利用可能メモリは最大で約500MB)なぁ・・・と思ったら、文字通り、メモリ不足でした(汗)。Virtuozzoの場合、メモリ消費量はtopfreeで確認するのではなく、cat /proc/user_beancounters の結果の privvmpages の値でチェックする必要があるようです(他にも重要なパラメータはあるようですが)。

 ちなみに、プロセス毎のメモリ使用量に関しては、ps auxの結果の VSZ の値を参考にすればいいようです(VSZとRSSとスワップも参照)。

【参考資料】
 [VPS] Virtuozzoのメモリはfreeやtopでなくてprivvmpagesを見るべし

 さてさて、どのようにしてメモリ消費量を抑えるか・・・? 参考にしたのが、Virtuozzo系VPSにおけるメモリの節約方法 のページ。

 今回とりあえずターゲットとできそうだったのが、
・httpd(prefork)のプロセス数を減らす
・MySQLのメモリ消費量を減らす
・BINDのメモリ消費量を減らす
の3点。

Continue reading "unboundをインストールしてみた"

| | Comments (0) | TrackBack (1)

2008.12.15

JavaでMail送信

TeedaとJavaMailと千葉の仕事と にコメントしたメール送信の際の文字コードの件ですが、私のところでは以下のような感じで書いています。もしかしたら完全な対応はできていないかも知れませんが、今のところ問題なく動いているようです(^^;

public MimeMessage getMimeMessage(Session session) {
  MimeMessage mimeMessage = new MimeMessage(session);
  try {
    if (from != null) mimeMessage.addFrom(getAddresses(from));
    if (checkListContainValue(replyTo)) mimeMessage.setReplyTo(getAddresses(replyTo));
    if (checkListContainValue(to)) mimeMessage.setRecipients(RecipientType.TO, getAddresses(to));
    if (checkListContainValue(cc)) mimeMessage.setRecipients(RecipientType.CC, getAddresses(cc));
    if (checkListContainValue(bcc)) mimeMessage.setRecipients(RecipientType.BCC, getAddresses(bcc));
    
    mimeMessage.setSubject(MailUtility.encodeWordJIS(subject));
    String text = body;
    if (text.endsWith("\n")) {
      text = text + "\n";
    }
    mimeMessage.setDataHandler(new DataHandler(new JISDataSource(text)));

    //  文字コードに関するヘッダーを無条件で付加
    mimeMessage.setHeader("Content-Type","text/plain; charset=ISO-2022-JP");
    mimeMessage.setHeader("Content-Transfer-Encoding", "7bit");
    mimeMessage.setSentDate(getDate());
    mimeMessage.saveChanges();
    
    return mimeMessage;
  } catch (MessagingException e) {
    throw new RuntimeException(e);
  }
}

上記メソッドはある自作クラスの一部なので、様々なgetterを呼び出してはいますが、

  • mimeMessage.setSubject(MailUtility.encodeWordJIS(subject));
  • mimeMessage.setDataHandler(new DataHandler(new JISDataSource(text)));

のような感じで文字コードの処理を行っています。ただ、これだけでは上手く受け取れないクライアントがあったので、最終的にたどり着いた部分が

  • mimeMessage.setHeader("Content-Type","text/plain; charset=ISO-2022-JP");mimeMessage.setHeader("Content-Transfer-Encoding", "7bit");
だったような気がします。

| | Comments (2) | TrackBack (1)

2008.12.14

同義語検索機能

Tracに同義語検索機能を追加してみる。

 そういえば、OmniFindには「同義語設定」なんてものがあったなぁ~ってことで、同じような機能を追加してみました。

| | Comments (0) | TrackBack (0)

2008.12.08

Transformerが反応しない・・・?

 TracのWikiページの外部ページへのリンクにおいてtarget="_blank"を付加しようと思い、

filter = Transformer('//a[@class="ext-link"]')
stream |= filter.attr('target', '_blank')

って処理を書いているのに、何故かtarget属性が追加されない・・・。

 なお、pythonインタプリタを起動して、手動で(?)Transformerの処理をしてみると、問題なくtarget属性が付加されます。

 試しに、Transformerの引数を //a だけにして全部のリンクにtarget属性を付加しようとしてみたのですが、これはこれで謎な結果に。target属性が付加されるリンクと付加されないリンクが混在する状況に・・・。う~ん・・・??

 何が悪いんだろうか・・・。

| | Comments (0) | TrackBack (0)

2008.12.07

JDBCで外部キー情報を取得する

 JDBCであるテーブルの外部キー(ForeignKey)情報を取得する場合は、DatabaseMetaData#getCrossReferenceメソッドを利用すればいいようです。

 あるテーブルを参照している外部キーの一覧を取得したい場合は後ろ3つの引数にnullをセット(『親テーブル』を指定)、あるテーブルが参照している外部キーの一覧を取得したい場合は前3つの引数にnullをセットすれば、欲しい情報が取得できるような感じです。

例)testスキーマのsample1テーブル参照している外部キー情報を取得する。

ResultSet result = metadata.getCrossReference(null,"test","sample1",null, null, null);

例)hogeスキーマのfugaテーブル参照している外部キー情報を取得する。

ResultSet result = metadata.getCrossReference(null,null, null, null,"hoge","fuga");

2008/12/11追記
データベースによっては、DatabaseMetaData#getCrossReferenceにおいて、テーブル名にnullを指定できない(3つ目と6つ目の引数は、いずれもnull以外の値でなければならない)ものもあるようです(試した範囲では、PostgreSQLはnullを許容しますが、DB2は駄目でした)。そういう場合は、getImportedKeys(指定したテーブル参照している外部キー情報を取得)あるいはgetExportedKeys(指定したテーブル参照している外部キー情報を取得)を利用すればOKです・・・というか、こっちを使う方が正当派?(^^;

| | Comments (0) | TrackBack (0)

2008.12.06

Wikiページの更新状況を表示する

リンク先のWikiページの最終更新日などの情報を表示するカスタマイズを行ってみました。

Wikiページへのリンクに情報を付加する

| | Comments (0) | TrackBack (0)

2008.12.04

Ticketの添付ファイルのファイル名を加工する(3)

Ticketの添付ファイルのファイル名を加工する
Ticketの添付ファイルのファイル名を加工する(2)

 Firefoxの場合は問題ないのですが、IEの場合に正しく処理できていませんでした・・・。どうも、Firefoxの場合は「ファイル名」のみがリクエストパラメータに含まれるのに対し、IEの場合は「パスを含んだファイル名(フルパス)」が送られてきていたのが原因のようです。

 ってことで、Trac本体のattachment.pyを参考に修正してみました。
ダウンロードはこちらから: TicketAttachmentId-r185.zip (1.7K)

| | Comments (0) | TrackBack (0)

2008.12.03

Tracで複数選択可能な入力項目を使用する

 Tracで複数選択可能なリストを使いたいなぁ・・・
⇒ってことで。Trac/MultiSelectListPlugin

#とりあえず、それなりに動いてくれているようです。

| | Comments (0) | TrackBack (0)

2008.12.02

unfuddleリポジトリのバックアップ

 unfuddleにおいては、200MBまでのリポジトリを無料で利用することができます。200MBを超えそうになった場合の選択肢としては・・・おそらく、「有償版に乗り換える」「別のところを探す(あるいは自前で準備する)」といったところになるかと思います。

 仮に別のところを探すとした場合、問題となるのが、「リポジトリのデータの移行は可能かどうか?」ということ。shellを通してsvnadminコマンドを実行できるような環境なら特に悩む必要もないとは思いますが、残念ながらunfuddleではそれはできません。もっとも、200MBに近づいてきた時点で、svnadminのダンプ結果を保管するだけの空き容量があるかどうかは別問題ですが。

Continue reading "unfuddleリポジトリのバックアップ"

| | Comments (0) | TrackBack (0)

2008.12.01

検索ページの結果件数を設定できるように

 Tracの検索ページの結果件数は、標準状態では10件固定となっています。

 trac/search/web_ui.py ファイルの

RESULTS_PER_PAGE = 10

の部分を
RESULTS_PER_PAGE = IntOption('search', 'results_per_page', 10,
u"""1ページ毎に表示する検索結果件数を設定します。""")

のような感じの内容に書き換えればOK。iniファイルにて設定できるようになります(当然ながら、IniAdminPluginが入っているとWebから設定可能となります)。

 ただし、あまり大きな数値にしすぎると、弊害が出てくるかも知れません(^^;

| | Comments (0) | TrackBack (0)

« November 2008 | Main | January 2009 »