2010/07/24

デスクトップで使っているHikiのバージョンアップ

ここに載せないメモはデスクトップ上のUbuntuで動いている Hikiに残してきたのですが、いい加減にバージョンアップをサボっていたので約1年前にリリースされていた0.8.8.1にバージョンアップしました。

まぁ全部の変更点をあらかじめ管理しておけば良かったんですけど、いまさら嘆いてもしょうがないので地味な作業を始めます。

既存環境の確認

バージョンアップする前に確認するべきなのは次のような情報だと思います。 特にHikiはカスタマイズ部分とオリジナル部分との分離があいまいなので、注意が必要そうです。

  • hiki-0.8.4.tar.gzを展開したトップディレクトリ: ~/public_html/hiki/
  • データディレクトリ(hikiconf.rbファイル@data_pathエントリ): ~/data/hiki/data/
  • カスタマイズ (既存ファイルの書き換え個所)
    • 設定ファイル: ~/public_html/hiki/hikiconf.rb
    • サイト下部に表示されるHIKI_VERSION定数の書き換え: ~/public_html/hiki/hiki/config.rb
    • 左サイドナビの変更(既存ファイル変更): ~/public_html/hiki/data/text/SideMenu
    • ファイル添付対象ディレクトリ: ~/public_html/hiki/blob
  • カスタマイズ (追加したディレクトリ、ファイル)
    • .htaccessファイル: ~/public_html/hiki/.htaccess
    • 追加導入したテーマ: ~/public_html/hiki/theme/以下の"hiki"ディレクトリ、"hiki_base.css"以外のディレクトリ及びファイル
    • ファイル添付プラグイン: ~/public_html/hiki/attach.cgi
    • 自作プラグイン1: ~/public_html/hiki/misc/plugin/dirsort.rb
    • 自作プラグイン2: ~/public_html/hiki/misc/plugin/dirmenu.rb
    • 自作プラグイン2: ~/public_html/hiki/misc/plugin/showdir.rb
カスタマイズ内容を把握するための手掛り

繰り返しになりますが既存のトップディレクトリは既にカスタマイズが行なわれているため、オリジナルのhiki-0.8.4ディレクトリと比較することで変更個所を確認します。

$ cd ~/public_html/
$ mv hiki hiki-0.8.4.c
$ tar xvzf ~/hiki-0.8.4.tar.gz

オリジナルから書き換えたファイルだけをリストアップします。

$ rsync -alvcn hiki-0.8.4/. hiki-0.8.4.c/.

このディレクトリを入れ替えるとカスタマイズしたファイルに加えて、追加されたディレクトリ、ファイルも一緒に表示されます。 $ rsync -alvcn hiki-0.8.4.c/. hiki-0.8.4/.

カスタマイズもhikiシステムの機能になると良いんですけどね。

移行作業の開始

新パッケージの作成とリンクの作成
$ cd ~/public_html/
$ tar xvzf ~/hiki-0.8.8.1.tar.gz
$ ln -s hiki-0.8.8.1 hiki
既存ファイルの書き換え

まずはhikiconf.rbをテンプレート(hikiconf.rb.sample)からコピーして、使っていたものと同じになるように書き換えます。

0.8.4からコピーしても良いんですが、次回もオリジナルのhiki-0.8.8.1ディレクトリと比較する事を考えました。 そこで差分を最小にするために必要のない編集はしないようにしました。

てっとりばやく差分を確認するために、次のようにしました。

$ cd ~/public_html/
$ grep ^@ hiki/hikiconf.rb |sort > hikiconf.new
$ grep ^@ hiki-0.8.4.c/hikiconf.rb |sort > hikiconf.old
$ diff hikiconf.old hikiconf.new

編集作業を終えてから同じ事をすると変更内容が確認できます。

後は適当にdiffをとりながら作業を行なって、既存ファイルの編集は終了しました。

新規ファイルの配置

名前が重複しない限りは新規ファイル、ディレクトリの配置はcpコマンドだけで終りそうです。

念のため -ip オプション付きで実行しましたが、特に問題になるような事はありませんでした。

稼働確認

ここまででhttp://localhost/~user01/hiki/でアクセスできる事を確認しました。

自分以外にアクセスすることはないので ~/public_html/hiki を作成してから作業をしました。 もし誰かがアクセスする可能性があればdataディレクトリ全体をコピーしつつ、別の場所で確認してからhikiconf.rbの@data_pathを変更した方が良いでしょうね。

まとめ

作業全体は特に問題なく終りました。

次回からはちゃんとメモを取りながら変更したいと一応は思うんですが、同じ事を繰り返すような気がします。

2010/07/19

PS3 linux (Fedra Core 9)にMARSライブラリを導入してみる

いまさらですが、 フィックスターズのWebサイトをみていてMARSライブラリを導入してみました。 fixstarsのサイトでは1.1.4までの情報が載っていますが、現時点での最新版は1.1.5のようです。

コンパイル済みのバイナリパッケージも配布されていましたが、自分の環境にフィットするか自信がなかったのでパッケージを作成することにしました。

今回の作業はFedra Core 9にCellSDK 3.1の環境で行なっています。

~/.rpmmacrosの準備とパッケージの作成

一般ユーザのHOMEディレクトリ以下で作業をするために~/.rpmmacrosファイルを準備します。 これがないと/usr/src/redhatにファイルが作成されるためrootユーザで作業をしなければいけませんが、そうする利点はないので、一般ユーザで作業を進めます。

$ echo %_topdir $HOME/rpm > ~/.rpmmacros

.rpmmacros ファイルで指定するディレクトリ名には ~/ などは使えないので、 ユーザ毎にフィアルを配布せずにskeltonファイルを準備したい場合には次のようにするのが良さそうです。

ディレクトリ名を決め打ちしない~/.rpmmacrosファイル

%_topdir %(echo $HOME)/rpm

.rpmmacrosファイルの準備ができたらパッケージを作成します。

$ sudo yum update
$ wget http://ftp.uk.linux.org/pub/linux/Sony-PS3/mars/latest/mars-1.1.5-1.src.rpm

ビルドに必要なディレクトリはあらかじめ作っておく必要があります。 簡単なのは決め打ちでディレクトリを作成しておく方法でしょう。

$ mkdir -p ~/rpm/{BUILD,RPMS/ppc64,SOURCES,SPECS}
$ rpm -ivh mars-1.1.5-1.src.rpm

これで~/rpm/SPECS/以下にmars.specファイルが作成されたので、rpmbuildコマンドでパッケージを作成します。


specファイルを編集する必要がなければ、"rpm -ivh"と"rpmbuild -bb"を合わせて次のコマンドでもパッケージを作成することができます。

$ rpmbuild --rebuild mars-1.1.5-1.src.rpm

いずれの方法でもrpmbuildを実行してエラーになります。

依存関係にある未インストールのパッケージを示すエラーメッセージ

error: Failed build dependencies:
	numactl-devel is needed by mars-1.1.5-1.ppc64

numactlパッケージもwww.bsc.esで配布されています。 apt-getでは入れられないので、やはりパッケージを作成しました。

$ wget http://www.bsc.es/projects/deepcomputing/linuxoncell/cellsimulator/sdk3.0/SRPMS/numactl-0.9.10-1.src.rpm
$ rpm -ivh numactl-0.9.10-1.src.rpm
$ cd ~/rpm/SPECS
$ rpmbuild -bb numactl.spec
$ sudo rpm -ivh ~/rpm/RPMS/ppc64/numactl-devel-0.9.10-1.ppc64.rpm
$ rpmbuild -bb mars.spec
$ sudo rpm -ivh ~/rpm/RPMS/ppc64/mars-*.rpm

ここまでで、一応パッケージは出きたのですが、spu版のzlib, opnessh-engineを試す際に32bit版ライブラリがないために問題がでました。

32bit版marsライブラリの作成

rpmbuildコマンドに --target ppc を渡すことで32bit版のパッケージを作成することができます。

$ mkdir ~/rpm/RPMS/ppc
$ cd ~/rpm/SPECS
$ rpmbuild -bb --target ppc numactl.spec
$ sudo rpm -ivh ../RPMS/ppc/numactl-devel-0.9.10-1.ppc.rpm
$ rpmbuild -bb --target ppc mars.spec
$ sudo rpm -ivh ../RPMS/ppc/mars-1.1.5-1.ppc.rpm

とりあえずこれでzlibやopenssh-enginesのコードをコンパイルする準備が出きました。

zlibからのmgzipの作成

srcパッケージを配布しているディレクトリにgzipの圧縮をspu対応にさせたサンプルが置かれています。

ただ対応しているバージョンのzlib-1.2.3は不具合がみつかり、zlib-1.2.5に置き換えられていて、現在はダウンロードができずにサンプルをコンパイルする事ができませんでした。

とりあえずMakefileを編集して、1.2.5をダウンロードするように修正しました。

zlib-mars/Makefileの編集個所

--- Makefile.orig	2010-07-18 09:44:32.482284357 +0900
+++ Makefile	2010-07-18 02:24:15.255286359 +0900
@@ -27,7 +27,7 @@
 # POSSIBILITY OF SUCH DAMAGE.
 #
 
-ZLIB=zlib-1.2.3
+ZLIB=zlib-1.2.5
 MGZIP=smp_mgzip_1.2c
 HOST_FLAG=-m32
 LIBS=-lspe2 -lmars_task -lmars_base

zlib-1.2.5_mars.patchファイルが作成できていないので、makeはエラーで停止します。 そこから手動で修正作業をして、最終的にzlib-1.2.5_mars.patchファイルを作成します。

$ cd zlib-1.2.5
$ patch -p1 < ../zlib-1.2.3_mars.patch

手動でzlib-1.2.5に対してzlib-1.2.3_mars.patchを当てた後は、*.rejファイルをみながら手で編集していきました。

zlib-1.2.3_mars.patch適用後の

diff -upNr zlib-1.2.5/zconf.h zlib-1.2.5.ported/zconf.h
--- zlib-1.2.5/zconf.h  2010-07-18 09:35:03.643539354 +0900
+++ zlib-1.2.5.ported/zconf.h   2010-07-18 09:18:52.314278202 +0900
@@ -356,7 +356,7 @@ typedef uLong FAR uLongf;
    typedef Byte       *voidp;
 #endif
 
-#ifdef HAVE_UNISTD_H    /* may be set to #if 1 by ./configure */
+#if 1    /* was set to #if 1 by ./configure */
 #  define Z_HAVE_UNISTD_H
 #endif
 
diff -upNr zlib-1.2.5/zlib.h zlib-1.2.5.ported/zlib.h
--- zlib-1.2.5/zlib.h   2010-07-18 09:35:03.651543213 +0900
+++ zlib-1.2.5.ported/zlib.h    2010-07-18 02:53:42.232281033 +0900
@@ -179,6 +179,7 @@ typedef gz_header FAR *gz_headerp;
 #define Z_MEM_ERROR    (-4)
 #define Z_BUF_ERROR    (-5)
 #define Z_VERSION_ERROR (-6)
+#define Z_CELL_ERROR   (-7)
 /* Return codes for the compression/decompression functions. Negative values
  * are errors, positive values are used for special but normal events.
  */

Makefile.inはMakefile.in.rejファイルを見ながら手で修正しましたが、1.2.5では共有ライブラリも作成できるように1.2.3と比較して変更点が多いため、./configure --staticは通りますが、共有ライブラリも作成できる完全なMakefile.inはできていません。

それでもzlib-1.2.5_mars.patchを作成してみると、mgzipコマンドを手に入れることができました。

$ mv zlib-1.2.5 zlib-1.2.5.ported
$ tar xvzf zlib-1.2.5.tar.gz
$ diff -upNr zlib-1.2.5 zlib-1.2.5.ported > zlib-1.2.5_mars.patch
$ make HOST_FLAG=-m32

timeコマンドの出力は変な感じでしたが、実時間だけでみてもmgzipは2〜3倍程度の速度差があるようです。 これが自分でできるかというと時間がかかり過ぎる感じですが、なんとなく雰囲気は感じられたと思います。

marsサンプルのコンパイル

mars-samplesパッケージを導入すると/usr/share/mars-1.1.5/samples以下にサンプルが導入できます。 このコンパイルには32bit版のライブラリは必要ありませんでした。

そのままrootユーザ権限でmakeしても良いのですが、パッケージとして管理されている領域とは別の場所で行なうのがベストだと思います。

$ cp -r /usr/share/mars-1.1.5/samples .
$ cd samples
$ make

ここにあるhelloディレクトリやscheduleディレクトリにあるサンプルを眺めると、なんとなく概要は掴めると思います。

サンプルのコードを読んで気になったところ

host.cでexternされている変数の定義場所

ディレクトリに配置されている*.cファイルには定義されていない変数(mpu_task_prog)が唐突にexternされているように見えます。

MARSのドキュメントには何も書かれていませんが、makeの出力を確認するとppu-embedspuコマンドの引数にmpu_task_progが表われています。

このコマンドを引数なしに起動すると次のようなメッセージが表示され、symbol名が指定できることがわかりました。

Usage: embedspu [flags] symbol_name input_filename output_filename

        input_filename:  SPU ELF executable to be embedded
        output_filename: Resulting PowerPC object file
        symbol_name:     Name of program handle struct to be defined
        flags:           GCC flags defining PowerPC object file format
                         (e.g. -m32 or -m64)

元々SPEプログラムを組込むための仕組みとして準備されているもののようで、作成されたファイルに定義されているsymbol名をnmコマンドで表示させると変化の様子がわかります。

$ nm mpu_task2.task_o
         U mars_task_get_kernel_id
         U mars_task_get_name
00000000 T mars_task_main
         U printf
$ nm mpu_task2.task_eo 
0000000000000000 D mpu_task2_prog

自分で少し試すだけならMakefileを流用して、同じようなネーミングルールでコードを作成するのが楽そうです。

2010/07/01

QT4でのconnect()メモリリーク

QT Creator 2.0がリリースされたのでUbuntu 10.04にQT SDK 2010/04を入れてみました。

いろいろ試してみましたが、ロケールファイルはあるのに日本語化されない問題があったり、QT SDK 2010/02で作成したUIの変更が反映されなかったり、微妙な感じだったので、ひとまずQT SDK 2010/02を使っています。

qmakeを毎回PATHに配置するのが面倒なので…

QT Creatorはqmakeコマンドをパスから探すようになっているので、オプションから変更はできますが、起動用のスクリプトを使うようにしました。

/opt/qtsdk-2010.02/bin/qtcreator.sh

#!/bin/bash
### QTCreator Startup Shell
### @author: Yasuhiro ABE <yasu@yasundial.org>
### @note: Please place this script at the qtcreator directory.

BASEDIR=$(dirname $0)

PATH=$BASEDIR:$BASEDIR/../qt/bin:$PATH
export PATH

umask 022

exec ${BASEDIR}/qtcreator

connect関数のメモリリーク?

QTでは基本的にコンテナになるクラスがオブジェクトを置き換えたりする際に、deleteを呼んでくれるのでメモリリークが起きにくい構造になっています。

QTimerを使うところでサンプルをそのままループに入れて気がついたのですが、connect()を繰り返し呼んでいくと、簡単にメモリを使いきってくれます。

本来不要な処理をしているので、問題ないのですが、connect()を動的に呼び出すような作りは気をつける必要がありそうです。

サンプルにあるようにコンストラクタで必要なオブジェクトの生成とconnect()処理が完了するような作りにするべきなんでしょうね。