AccessとLinux

中小企業での販売管理プログラムの作成についての所感

create conversion その後

2007年12月30日 00時36分48秒 | Weblog
create conversionの件は結局うまくいきました。取りあえずこれでいつでもPostgreSQL8.2.*に移行できます。

下記ホームページを参考にしました。
http://ml.postgresql.jp/pipermail/pgsql-jp/2007-January/021518.html
http://ml.postgresql.jp/pipermail/pgsql-jp/2007-January/021520.html
http://ml.postgresql.jp/pipermail/pgsql-jp/2007-January/021522.html

上記のホームページでもそうですが、私の場合もPostgreSQL8.1.3から8.2.5へデータ移行時に変換エラーがでました。今後、8.2以降のバージョンを使用するのであれば、やはりencodingはUTF8に変更しておく必要があるのではないかと思います。

変換エラーの原因を調べてみるとEUC_JP値の
f5a1
f5a2
f5a3
f5a8
f5a9
f5ae
で変換エラーになります。これはEUC_JPでは定義されていない番号です。どうもBetrieve+Windows95で使用していた時の外字データがそのまま残っていたもののようです。現在使用しているWindowsXP、Vistaでは外字を使用していないので表示されませんし、Linux側(PostgreSQL側)の変換テーブルに値があるハズもありません。

そこで、次回サーバーのバージョンアップ時にUTF8に移行するための手順。

1.変換テーブルを修正してmakeする必要があるので、Linuxインストール時、PostgreSQLにパッケージはインストールしない。PostgreSQLのソースコードをダンロードして使用する。

2.上記のEUC_JP値が変換マップに無いことがわかっているので、PostgreSQLのEUC_JP<->UTF8の変換マップに未登録分のEUC_JP値を追加してmakeする。
/usr/local/src/postgresql8.2.5/src/backend/utils/mb/Unicode/euc_jp_to_utf8.map
を変更する。挿入する場所はEUC_JP側のコード順に並んでいる必要がある。
取りあえず全く使用していない、ユーロ記号に変換するものとして。
{0xf5a1, 0xe282ac}
{0xf5a2, 0xe282ac}
{0xf5a3, 0xe282ac}
{0xf5a8, 0xe282ac}
{0xf5a9, 0xe282ac}
{0xf5ae, 0xe282ac}
を追加する。
(もし最初からスペースに変換できれば後からreplaceする必要がないのだか、試験していないので何とも言えない。スペースのUTF-8を調べると0x20の半角なので、半角2文字0x2020にしなければならないのかもしれないが、よくわからない。全角を半角1文字に変換するのはどうも抵抗がある。)

3.旧サーバーのdumpデータはEUC_JPになっているので、map変更後一端、いつも手順で--encoding=EUC_JPでcreateする。
$ cd /usr/local/src/postgresql-8.2.5
$ ./configure
$ make all
$ make install
$ pg_ctl start
$ initdb --no-locale --encoding=EUC_JP
$ createdb databasename
$ psql databasename -e </home/pub/dumpdata_EUC_JP
4.UTF8ダンプデータの作成
$ pg_dump databasename --encoding=UTF8 > /home/pub/dumpdata_UTF8
                        (/home/pubは例えば)
この時、もし変換エラーがでればアンインストールして2に戻ってEUC_JP値をeuc_jp_to_utf8.mapに追加して再度makeする。アンインストールは
$ make uninstall

(特にアンインストールしなくても、上記ホームページにあるようにmapに追加した後、make clean;make; make installでも良いと思います。)

UTF8変換後データは大きくなる、ちなみに180MByteが220MByteになった.

5.UTF8でデータベースを作成。
最初、--encoding=EUC_JPでinitdbしてしまったので、今度は--encoding=UTF8でinitdbする。
(別に、initdb時でなくてもcreatedb時にencodingを指定してやれば良いのだが、いままでcreatedb時にencodingを指定してこなかったので、ついつい忘れてしまいそうになる、そのためinitdb時にUTF8に指定しておいた方が私の場合はよさそう。)
$ make uninstall
$ make all
$ make install
$ pg_ctl start
$ initdb --no-locale --encoding=UTF8
$ createdb databasename
$ psql databasename -e </home/pub/dumpdata_UTF8 これで、以前の外字がユーロマークになるが、必要ならWindows側でPGAdminのSQLから各テーブルを
  update table set mei = replace(mei, 'ユーロマーク', '')
としてやればユーロマークは削除される。
(これがいやなら、最初のmap加工時にスペースなりに対応させておけばテーブルを選んでreplaceする必要は無くなる。多分。)


コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

結局うまくいかなかった

2007年12月24日 14時26分45秒 | Weblog
自宅のSolarisサーバーの電源が壊れてしまい、CentOSをインストールして別途、PostgreSQL8.2.5をインストールしてサーバーを新たに作ろうとしましたが、結局あきらめました。電源を購入して(約4000円)、以前から使用しているサーバーを修理しました。
(販売管理プログラムの修正が多くて、これ以上時間が作れないので新しいサーバーはまた、時間がある時に検討します。)

うまく動作しているように思ったPostgreSQLでしたが、

 ODBC--呼び出しが失敗しました。
 ERROR; character Oxf5a2 of encoding "EUC_JP" has no equivalent in "UTF8";
というエラーでてしまい。サーバーからうまくselectできません。
キャラクターコードの変換エラーなので、元々インストールされている、PostgreSQLのconfigure設定が悪いのかと思い、CentOSに最初から入っているPostgreSQLをアンインストールしました。

# pg_ctl stop
# yum remove postgresql
# userdel postgres

一応再起動して、Windowsパソコンからダウンロードしてきた、PostgreSQL8.2.5のソースコードをSamba経由でCentOSに持ってきます。インストールは
http://honana.com/postgresql/82/install.html
を参考にしました。

# useradd postgres
# passwd postgres

としておいて、/home/postgres/.bashrcにいつもの環境設定をします。

$ source /home/postgres/.bashrc

いつもの手順でソースコードを解凍してconfigureしますが、「readlineとzlibが無い」というエラーがでるので、

$ configure: error: readline library not found
# yum -y install readline-devel zlib-devel

としてネットワークインストールします。再度configureすると今度は問題なし。ソースファイルのディレクトリで

$ ./configure
$ make all
$ make install
$ initdb --no-locale --encoding=EUC_JP
$ createdb databasename
$ psql databasename -e <dump_data これでうまくいくようなのですが、以前Solarisに移行した時も同じようなことがありましたが、EUC_JPの

0xff5e
0xf5a1
0xf5a2

が、UTF8に対しての変換マップがないようで、エラーが出ます。syslogの設定のよってはエラーがでませんが、CentOSのデフォルトのPostgreSQLではダンプデータ取込時に

$ psql databasename -e <dump_data > 1.txt

何てしてやると、画面にはエラーだけが表示されていました。./configureしてインストールした時はsyslogオプションを設定していなかったためか、あるいはその後confファイルを編集していないためか、エラーが画面表示されませんでした。結局、CentOSデフォルトのPostgreSQLと同様に./configureしたPostgreSQLも上記文字がマッピングからもれているために、Windowsの販売管理プログラムからテーブルを開いてやるとエラーがでてしまいます。
(CentOSに最初からインストールされているPostgreSQLもinitdb時にエンコードを指定してやるので、実は問題なかった。エラーの原因は文字変換マップにありました。)

エラーがでるのは取りあえずそのままにして、自動起動の設定を下記でします。
# install -o root -g root -m 755 /usr/local/src/postgresql-8.2.5/contrib/start-scripts/linux

/etc/rc.d/init.d/pgsql
# chkconfig --add pgsql

これまで自動起動のクリプトは、石井先生の「PostgreSQL完全攻略ガイド」中のコードを使用していましたが、今回はソースコードに含まれているものが使用します。

自動起動までこぎつけたものの、WindowsパソコンからODBC接続してテーブル(商品テーブル)を開くとエラーがでてしまいます。上記の3つ?の文字が変換できません。以前もこの3文字については他の文字に変換してからdumpしたような記憶があります。「~」となんだったかよく覚えていません。
このコード番号はEUCの一般的なマップには含まれていないようでした。定義されていない番号になっていました。LinuxでEUC_JPとして定義されているのでしょう。どの文字が該当するのかよくわかりません。

character 0xf5a1 of encoding "EUC_JP" has no equivalent in "UTF8"

というエラーなので、EUC_JPにあってUTF8に無いようなのですが。

ここに参考になる説明があります。
http://ml.postgresql.jp/pipermail/pgsql-jp/2004-September/017522.html

create conversionすれば良いようなのですが。

一応、変換テーブルに上記文字コードのマップを追加することも検討してみました。

create function fncf5a1U_E returns voie as '
begin

  conv_proc(
integer, -- 変換元符号化方式ID
integer, -- 変換先符号化方式ID
cstring, -- 変換元文字列(ヌルで終わるC言語文字列)
internal, -- 変換先文字列(ヌルで埋められたC言語文字列)
integer -- 変換元文字列長
  ) RETURNS void;

end;'
language 'plpgsql';
create conversion cf5a1U_E for 'UTF8' TO 'EUC_JP' from fncf5a1U_E;

create function fncf5a1E_U returns voie as '
begin

  conv_proc(
integer, -- 変換元符号化方式ID
integer, -- 変換先符号化方式ID
cstring, -- 変換元文字列(ヌルで終わるC言語文字列)
internal, -- 変換先文字列(ヌルで埋められたC言語文字列)
integer -- 変換元文字列長
  ) RETURNS void;

end;'
language 'plpgsql';
create conversion cf5a1E_U for 'EUC_JP' to 'UTF8' from fncf5a1E_U;

といったことのようなのですが、肝心のconv_porcの書き方がわからない。
上記ホームページのコードでは変換テーブルをまるまる書き換えてしまうようなので、そこまでしなくても良く、問題になっている3文字の変換を追加したいところです。
一応、上記ホームページから変換コードをダウンロードしてmakeしてみましたが、そのままではエラーになってしまいます。

取りあえず時間も無いので、今回はここまでとして、conv_procの書き方は追々調べていくことにします。

しかし、問題となる文字をSolarisのマップに追加した覚えはありません。自動でマップに追加されるのだろうか? SolarisのPostgreSQLは最初からインストールされているものを使用しているのだが。(次回、サーバー更新時に問題になりそうなので、よく調べておかなければならない。)

また、CentOSのコンソールでは日本語を表示できるような設定にしていないので、TeraTermProからPostgreSQLを操作するのですが、その時のコードはrecieve、transmit共にEUC。

それからもう一つ、これまでencodingはいつもEUC_JPとしてきましたが、石井先生の対策の中に、「PostgreSQL側もUTF8にしてしまう」というのもあって、どうせAccessからしかデータベースを操作しないので、UTF8の方が今後、問題が少ないと思いました。現状はEUC_JPとして使用しているので、次回サーバー更新時にdumpデータEUC_JPからUTF8に変換してしまうことも検討したいと思います。

pg_dump databasename --encoding=UTF8 > databasename_UTF8
とするとEUC_JPからUTF8に変換できない文字がwarningとして表示される。
warning以降はそのテーブルのデータは無視されるようです。

ダンプデータをバイナリエディッタでDANDP(EUC表示が可能)で調べてみると、どうも以前外字として定義していたml(ミリリットル)、手書き文字のリトッル、m3(リュウベ)といった文字が未だに残っているようで、実際、Solarisでもこの文字は表示されずに空白になっている。やはり、次回更新時にUTF8にして綺麗に整理する必要がありそう。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

CentOSのネットワークインストール2

2007年12月16日 21時03分08秒 | Weblog
最小限のパッケージをインストールしました。
パッケージグループで「Server」を主として個別のパッケージを選択しました。
使用するのはSamba、PostgreSQL、telnet-serverです。

<Samba>
いつも使っているので、簡単設定できるかと思っていましたが、なかなかうまくいきませんでした。原因はファイアウォールとSELinuxが有効になっている為でした。
これまでCDからインストールする時はインストール時にファイアウォールを有効にするかどうかチェックする画面がありましたが、今回のインストールでは一度も聞いてきませんでした。それで気がつかなかったのですが、Windowsからサーバーが見えなかったり、見えてもホルダーが開けなかったりしました。
CentOSからsetupコマンドを実行するとファイアウォールを設定が可能で、ファイアウォールとSELinuxを無効にすると動作するようになりました。
インストール時のパッケージの選択によってはsetupコマンドがインストールされない場合もあります。その時にはrootで
  yum install "*setup*"
とやってやると、setupコマンドが通るようになります。

<PostgreSQL>
PostgreSQLはSolarisの場合と同様、最初からパッケージでインストールされているものを使用しました。
ロケールがCでconfigureされているようなので、一端、dataホルダーの中身を削除してしまいます。
 rm -rf /var/lib/pgsql/data/*
 initdb --encoding=EUC_JP --no-locale
 createdb --encoding=EUC_JP databasename
 psql databasename -e <dump_data
<自動起動>
samba、postgresal共にデフォルトでは自動起動されないので、
chkconfig --level 3 smb on
chkconfig --level 3 postgresql on
として自動起動するようにします。

<telnet-server> 
telnet-serverのインストールは下記を参考にしました。
http://kajuhome.com/telnet.shtml#n02

<USBメモリのマウント>
sambaがなかなかうまくいかなかったので、USBメモリでデータを取り込むことも検討しました。CentOSの/devをみると全く空になっています。取りあえず
  mkdir /dev/usb
としてマウントポイントを作っておいて、
  mount -t vfat /dev/sda1 /mnt/usb
でマウントできました。
/dev/sda1はUSBメモリを挿すと認識した旨、メッセージがでますが、そのメッセージ中に/dev/sdaと表示されていました。以前なら、sdaは1番目のSCSIディスクといったところです。「1」は1番目のSCSIディスクの第一パーティションという意味です。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

CentOSのネットワークインストール1

2007年12月16日 21時02分11秒 | Weblog
自宅のサーバーが壊れてしまったので、空きのパソコンにCentOSをインストールすることにしました。
いままで使っていたサーバーは電源が入らなくなってしまいました。電源を買ってきて交換すれば良いのですが5000円くらいするので、チョット大義。
そこで空きのパソコンを使用しますが、これがCDをまともに読み込まない代物で、何度か読み込んでいるとたまに「動いた!」というようなものです。一応、最初はCentOSのイメージをダウンロードしてきて6枚のCDに焼いてインストールしようとしましたが、途中で読み込みが中断してしまいます。
仕方ないので、CD-ROMからの読み込みが最小になるようにネットワークインストールすることにしました。
以下その手順です。

このホームページを参考にしてインストールしました。
http://mizushima.ne.jp/Linux/CentOS/CentOS-install1.php

CentOSのミラーサイトからイメージ
CentOS-5.1-i386-netinstall.iso 7430KB
をダウンロードしてCD-Rに焼きます。
このCDから起動して、後は上記のホームページ通りですが、バージョンが5.1に変わったので一部変更があり

ました。FTPからインストールするのですが、
 FTP site name: ftp.riken.go.jp
 CentOS directory: /Linux/centos/5.1/os/i386
となります。


------------------------
CentOSをインストールする前に、Windows VistaにWindows版PostgreSQL8.2.5をインストールしてみました。
途中、Vistaでデフォルトで有効になっている「ユーザーアカウント制御」をはずしてやらなければならなりません。
その手順は
「コントロールパネル」
「ユーザーアカウント」(クラシック表示の場合)
「ユーザーアカウント制御の有効化または無効化」(メニューの一番下です。)「ユーザーアカウント制御(UAC)を使ってコンピュータの保護に役立たせる」のチェックをはずす。
また、サービスを追加する権限をpostgresに与えてやらなければなりません。ローカルセキリティポリシーを変更します。
(後から気がついたのですが、うっかり、postgreでユーザーアカウントを作ってしまい、途中からおかしくなってしまいました。一端開始したサービスが途中で終了してしまいます。そんなことなので、VistaでPostgreSQL8.2がちゃんと動作するか確認できませんでした。正式には8.3からサポートされることになっています。)
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする