goo blog サービス終了のお知らせ 

AccessとLinux

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

Currentdb.Execute と Docmd.Runsql

2025年05月06日 13時01分50秒 | Weblog
随分以前になるが、「Currentdb.Executeは同期でDocmd.Runsql非同期なので、Currentdb.Executeを使うべき」という記事を読んで、 Currentdb.Executeを使うようにしていた。
今回、うまく更新クエリーが実行できなかったので、Docmd.Runsqlに変更して実行してみたところ、Currentdb.Executeをより詳細なエラーが表示され、エラーの原因を知ることができた。
ODBC経由で実行しているので、Access内でクエリーを実行する場合とは異なるのだろうが、詳細なエラー表示ができる点を考えれば、ODBC経由ではDocmd.Runsqlを使った方がよさそう。
サーバーで実行されるクエリーの同期、非同期は関係ないのではないかと思う。

最近勉強してる

2024年09月01日 17時29分25秒 | Weblog
最近、販売管理システムの引継ぎをしている。
実務としてはAccessのプログラム廻りばかりの作成や修正ばかりやっていたので、
PostgreSQLの勉強は全くしていなかったし、SQLについてもAccessのクエリービルダーで
作っていたので、SQLもほとんどわからない状態だった。
担当者がSQLの勉強をしていて、本に書いてある用語を言われてもわからなかったり、引継ぎするのにさすがに恥ずかしいので、長い盆休みもあり少し勉強した。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
[改訂3版]内部構造から学ぶPostgreSQL―設計・運用計画の鉄則 (Software Design plus) 単行本(ソフトカバー) – 2022/11/26
上原 一樹 (著), 勝俣 智成 (著), 佐伯 昌樹 (著), 原田 登志 (著)


PostgreSQLもYouTubeに色々解説動画があって、勉強になった。
いい時代になったもんだ。

2003年から運用して当時PostgreSQLのバージョンが7.4?だったか、自動vacuum機能がなくて、夜12時にvacuumするスクリプトを書いたような記憶がある。そんなこともあったけど、最近 vaccum fullするのをすっかり忘れていた。もう、何年もやってない。これまでのサーバーの不具合はvacuum full してなかったからだろうか?
これから1ケ月に1度は忘れないで実行しよう。

pg_hba.confの設定もまずかったので修正。postgrsql.confの設定もPCが高機能化しているのに、従来の設定のまま使っていた。shared_buffesの設定を4GBに修正してヒット率が今のところ92%から95%に上がった。(変更後4週間で97%まで上昇)
統計情報が徐々に更新されているので、最終的にどのくらいまで上がるか様子見中。
どのクライアントもスーパーユーザで使っていたけど、ロールも修正予定。

やっぱり、勉強は必要だなと実感。

バックアップ。
毎日、論理バックアップを取ってる。また、昔は「同時に3ケ所に保存」って言ってたので、サーバー、クライアント、USBと3ケ所同じデータを保存している。クラッシュした時、一番、現状復帰に近い状態にするためにはWALの保存と、物理バックアップを取っておかなければならないようだけど、WALの保管は容量が大きく管理が大変そうなのであまり気が進まない。
事務所が使っているデータは必ず紙データが残っているので、昨日のバックアップデータから復旧するのはそれほと難しくない。
PostgreSQLになってクラッシュしたことは一度もないのだが、以前、Btrieveを使っている時、データを壊してしまったことがある。それもバックアップ最中に。

Btrieveは使用中、物理バックアップがとれないのでクラアントを止めてもらってバックアップしていたのだが、マウス操作(当時はボール式)ミスでデータを無くしてしまった。
クラッシュに備えてバックアップ取ってるのに、バックアップ中にデータ壊してしまうなんて本末転倒。そんなことがあったので、あまりゴチャゴチャ、バックアップ作業をする気にならない

PostgreSQLの論理バックアップは使用中でもバックアップ取れるので、簡単。容量が11GBくらいになったので、zip(容量4GB、圧縮率87%になる)してそれぞれに保管している。
zip化してpg_dumpもできるようなのだが、デバッグをWindows版のPostgreSQLでやっていて、クラアントに保管したバックアップデータをWinodowsで展開後、Windows版PostgreSQLにリストアしている。なので、Linuxでも手動でzipした方がその後が楽。
(「デバッグ中のデータを壊した」という失敗例がデータベース本の例え話で書いてあることがあるが、
insert、update、deleteがからんだデバッグは絶対に本機ではやらない。なので、Winodows版ではあるが、リストア作業を日常的にやってる。dropdb、createdb、pgsql、まあ簡単な作業なんだが。)

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ
ミック (著)

中小企業向けAccess開発実践ノウハウ 単行本 – 2007/1/1
前野 好太郎 (著)

SQLでこんなことまでできるのかとビックリ。
だけどやっぱり、フロントエンドとしてのAccessは最高の開発環境だと思った。

これまで、「クエリーのネスト(入れ子構造)」を常態的に使ってきた。
複雑な集計もクエリーを組み合わせて作成した。
「Access開発実践ノウハウ」だと「必ずしも偏見を持たないで使ってもいいか!?」ということだけど、そんなこと全く知らないで使っていた。確かに修正がし辛い面はあるけど、長く難しいクエリーを書いてもやっぱり修正は難しいだろう。「入れ子構造」だと名前付けを工夫さえすれば、クエリーが分解されている分、まだましかもしれない。

集計クエリーがらみでAccessにないPostgreSQLの便利な関数を使ってパススルークエリーすれば、簡単に集計できるのかもしれないが、こういった場合はあっさりPostgreSQLにviewを定義してAccessのリンクテーブルとして参照してきた。なので、パススルークエリーはほとんど使ってない。
大抵、こういった集計は売上資料(レポート)のソースとして使うので、リンクテーブルにしたおいた方が楽だ。

Accessのクエリーの組み合わせで難しい場合は、Accessにレポートソース用のテーブルを作っていた。このやり方にしても、Accessがデータベース機能を持っているからできる。Accessにデータベース機能がなければ、PostgreSQLにテンポラリーテーブルを作って、レポートソースにすることになるだろうけど、共有しているサーバーに負荷をかけたくない。使用後は削除してしまうわけだし、クライアントごとにテーブル名を決めなければならないのもいやだ。クライアント側でテンポラリーテーブルを作成できるのもAccessのいいところだ。

dnf でPostgreSQL16をインストール

2024年08月29日 11時35分18秒 | Weblog
テストサーバーにdnfでPostgreSQL16をインストールしてみた。

Oracle Linux 9.4
SSD 250G

Linuxインストール時、ユーザーpostgresを作らない
postgresqlのデータが「/var/lib/pgsql/」に作られるので、「/home」の大きさを減らして
「/」を大きくしておく。自動で割り当てられる、「/var」は10Gくらいしかなかった。

/home 100GiB
/ 31.8GiB (余りの量を設定)
/var 100GiB
/boot 1024M (自動で作った時の大きさそのまま)

SELinuxとファイヤーフォールを止める

1.インストール可能なバージョンを確認

# dnf module list postgresql

2.PostgreSQL16のインストール

# dnf module install postgresql:16

3.postgresのパスワードを設定

# passwd postgres

postgresqlをインストールして初めて、ユーザーpostgresが作成されるので、
postgresqlインストール後、パスワードを設定する。

4.PostgreSQLの初期セットアップ

# su postgres
$ initdb --no-locale --encoding=UTF8 -D /var/lib/pgsql/data

----------------------------------------------------
# postgresql-setup --initdb --unit postgresql

ここでエラー。
再度、initdbを実行しようとすると、「『data』ディレクトリが空じゃないので無理!」っていうエラーがでるので、ディレクトリごと一度削除

# rm -rf /var/lib/pgsql/data

再度、postgresでinitdb

# su postgres
$ initdb --no-locale --encodint=UTF8 -D /var/lib/pgsql/data
(ここで /home/pgsq/dataを作って、パーミッションとか設定して、このディレクトリを指定してinitdbすると、正常終了するが、
postgresql を起動する時、「postmaster が/var/lib/pgsql/dataに無い!」とか言ってきて起動できなかった。$PGDATAが/var/lib/pgsql/dataで設定されているよう。)
----------------------------------------------------

5.PostgreSQLの起動

# systemctl enable --now postgresql
# su postgres
$ createdb DatabaseMei -E UTF-8 -l ja_JP.UTF-8 -T template0
$ psql DatabaseMei < DumpData

サーバーの更新結果 引継ぎ作業

2024年08月11日 09時04分52秒 | Weblog
原因がよくわからないまま、サーバーを更新したが、レコードの一部が保存されないエラーは解消した。
さすがに気持ち悪いが、このまま使う。

動作は2割くらい速くなったのではないかと思う。
これもよくわからない。2秒で済んでたとこころが、1.6秒になってもあまり実感がない。

ーーーーーーーーーーーーーーーーーーーーーーーー

定年まで後、2年を切った。
自作した販売管理システムの引継ぎをどうしようかと思っている。

このブログは販売管理システムの運用を開始した頃から始めて、開発の様子を残しておくためだった。
今、当時のブログを読み返してみると、バグも多かったけれど、ハードの高性能化で良くなった面が相当ある。
YouTubeで「業務システムは自作できる」とか、Accessの説明動画が色々アップされているけど、実際、今なら中小企業で自作する環境が十分整っていると思う。

Microsoft Officeにしてもサブスクリプションになって利用し易くなった。端末を安価に増減できる。

PCが64bitになって速度、容量も十分だし、ネットも高速化して拠点間のVPNスループットも随分よくなった。
まあ、速いとは言えないけれど、商品を引き取りに来られたお客様に待ってもらっても、それほど不都合でない速度で伝票発行できる。

ストレージにしてもHDD→SSD→M.2になってものすごく速くなった。PostgreSQLのキャッシュヒット率は95%程度だけど、遅いっていう印象は全くない。

今に始まったことではないのだが、調子悪いなと思うのはAccessが凍ったり、印刷できなかったりすることで、相変わらず、デコンパイルしたり、Windowsを再起動したり、Officeの再インストールとかしている。どうしてもバグ出ししているPCは調子悪くなりやすい。これは仕方ない。

販売管理システムの開発当初はサーバーサイドスクリプトでやってれば、永遠に更新無しで使えるんでは、と思っていたが、とんでもないことだった。そもそもブラウザがどんどんアップグレードして、修正無しでは動作しない。政府のe-Govなんて出力ファイルはIEモードでなければ表示されない。一般化しているPDFは特定の企業に与していると考えているのか、、、

Accessで作っていて本当に良かった。VBも検討してたけど、これも.Netになってしまい、コードが大幅に変わってしまった。最近、勉強を始めてもらった担当者から「AccessのVBAも変更されて動作しなくなるかもしれないので、マクロを使った方よいのでは?」と言われたが、AccessのVBAの変更なんて微々たるもんで、Office95のコードがそのまま動く。

全然変更が無かったわけでも無い。
  mdbがaccdbに変わった時
  32bit版が64bit版に変わった時

accdbに変わった時、コードはそれほど直した記憶がない。レポートの特定の部分(ヘッダーの下部だったか?)に不要な線が追加されて修正した。
64bit版に変わった時はAPIをDeclare宣言する時の引数の型が64bit対応の型に変更しなければならなかった。
修正といってもそのくらいで、大幅なコードの変更はなかった。
VBAのコードの継続性ってすごい!

「VBAなんてプログラミングではないよ!」っていうブログもよくみたけど、「そんなの関係ない!」、作ったもん勝ちだ。書かなければならないコードの量は少ないに越したことはないし、Accessのレポートは超優れもの。自作するなら選択肢はAccess一択だ。

Accessの自作推薦動画ではMicrosoft SQL Serverを勧めているものが多いが、これは費用がかなりかかる。Accessで自作しようとしている人なら、クライアントが2台以上になるのなら、あっさりLinuxサーバーを立てることを勧める。費用はハードの分だけ。セキュリティ云々を全く、無視してしまえば、それほど難しくない。Linuxそのものはrootでなければ設定変更できないし、PostgreSQLもpostgresだけ管理していれば、心配ないと思う。細かいことを言ってたらきりがない。実際、Windowsのコマンドプロンプトさえ開いたことがない人ばかりの職場でセキュリティの心配をする必要なんて全くない。壊すつもりなら、バット持ってきてサーバーをぶったたけば、それで終わりだ。

引継ぎの件。

Accessの引継ぎは実際問題、無理。コードを書いた本人でさえ、「もう、ここはさわりたくない!」「見てもよくわからんな~」と思うところばかりで、他の人が見ても直せるわけがない。
なので、修正が必要な時は別画面を作成して、サーバーのデータを直接書き変えるしかないのではないかと思う。既存のコードはそのまんま。

PostgreSQLサーバーセットアップについては定型作業なので、これはチャント引継ぎしておく。
5年に1回はサーバーを更新してもらいたい。

サーバーの更新

2024年06月26日 14時26分57秒 | Weblog
受注伝票の一部がデータ更新されないエラーが発生。
何度か繰り返す。原因不明で、とりあえずサーバーを更新してみた。
4年で更新。

パソコン工房で購入。

ISoDEi-M07M-A147-UHCXB(SOLUTION-M07M-147-UHX)

CPU:
インテル Core i7 プロセッサー 14700
[5.4GHz(P2.1GHz-5.3GHz/E1.5GHz-4.2GHz)/20コア(P8+E12)/28スレッド/33MBキャッシュ/TDP 65W-219W]

メモリー:
16GB(8GB×2) [DDR5-4800 / デュアルチャンネル]

ストレージ:
500GB SSD / NVMe M.2

グラフィックボード:
インテル UHD Graphics 770 (CPU統合グラフィックス)

チップセット:
インテル B760 チップセット

Oracle Linux 9.4
PostgreSQL 16.3


作業中、エラーメッセージが「□□□」で表示される時はローケールを一時的に変更する。
どんなに調整しても日本語では表示されないらしいので、英語表示させて確認後、元に戻す。

使用可能なロケールのリスト表示
# localectl list-locales

ja_JP.UTF-8 → en_US.UTF-8 (2023/10/24 これが無かった。結局、エラーメッセージが表示できなかった)

# localectl set-locale LANG=en_US.UTF-8

エラーメッセージを確認したら、元に戻しておく

# localectl set-locale LANG=ja_JP.UTF-8



(1)Oracle Linuxをインストールする時の設定
インストール先
 未使用領域の作り方、ドライブを選んで「完了」を押すと、パーティション操作の画面に移行する
ネットワーク設定
 IPv4を設定(IP、DNS、ファイアフォール)(チャント設定しておくこと、後から設定ファイルの編集が楽)
 IPv6は無効化
 最小インストール
 rootのパスワードを入力
 ユーザpostgresを作成
 セキュリティーポリシーの無効化

(2)SELinuxを止める
/etc/sysconfig/selinuxを編集
SELINUX=disabled
#SELINUXTYPE=targeted コメントアウトした

(3)ファイアフォールを止める
# systemctl disable firewalld

(4)sambaのインストール
# yum -y install samba samba-common
# mkdir /home/pub
# chmod 777 /home/pub
# chown nobody:nobody /home/pub

/etc/samba/smb.confの編集
プリンター関係の設定は全てコメントアウトした。
また、どうせ使わないので[home]セクションもコメントアウト。

[global]
workgroup = DOMAIN
security = user
map to guest = Bad User(これがないと、ユーザー認証画面が表示されてしまう)
[pub]
path = /home/pub
public = yes
writeable = yes
guest ok = yes
guest only = yes
create mask = 0777
directory mask = 0777

編集後
# systemctl enable smb
# systemctl enable nmb

起動
# systemctl smb start

再起動は
# service smb restart
(restartしてもクライアントから「pub」が見えなかったので、再起動した)

(5)telnetサーバーのインストール
# yum -y install telnet-server
# systemctl enable telnet.socket

(6)chronyのインストール
今回から。
4年間、時間合わせを行わなかったら、30分くらい時間がずれていたので。
# yum install chrony

/etc/chrony.conf の編集(編集前に.bkを付けて保存)
既存のpool行をコメントアウトして、下記を追加
server ntp.nict.jp iburst
server 0.jp.pool.ntp.org iburst
server 1.jp.pool.ntp.org iburst

allow

編集後
# systemctl start chronyd
# systemctl enable chronyd

(7)その他のインストール
# yum -y install zip
# yum -y install unzip
# yum -y install gcc (「開発ツール」がインストールされていないので)
# yum -y install readline
# yum -y install readline-devel (PostgreSQLのコンパイルに必要)
# yum -y install zlib
# yum -y install zlib-devel  (PostgreSQLのコンパイルに必要)
# yum -y install tar
# yum -y install make 
# yum -y install icu

(8)不要なサービスの停止
とりあえず
# systemctl disable crond

(9)usbメモリーのマウント(必要なファイルは共有した「pub」にWindowsパソコンから移動するので不要?)
/etc/fstabに下記を追加
/dev/sdb /mnt auto noauto,user 0 0

(9)PostgreSQLのインストール
ソースをmakeしてインストール
データフォルダは/home/pgdata

・アカウントの作成
rootでログイン
# /usr/sbin/adduser postgres
# /usr/bin/passwd postgres

・フォルダーの作成
# mkdir /home/pgdata
# chown postgres:potgres /home/pgdata
# mkdir /usr/local/pgsql
# chown postgres:postgres /usr/local/pgsql
# chown posrgres:postgres /usr/local/src (フォルダーは既にあるので、オーナーだけ変更)

・ソースの展開
sambaで共有した/home/pubにダウンロードしてきたPostgreSQLのソース、tar.gzを用意して

# su postgres
$ cd /usr/local/src
$ tar xfz /home/pub/ソースファイル

・コンパイル
$ cd /usr/local/src/p*
$ ./configure --without-icu
(yumでicuがインストールできたが、オプションがないとエラーで止まる)
($ ./configure オプション無し)
$ make all
$ make install

・初期化
postgresで/home/postgres/.bashrcに下記を追加
PATH="$PATH":/usr/local/pgsql/bin
export PGDATA=/home/pgdata

$source ~/.bashrc

PGDATAが環境変数として設定されているか確認
$ env
($ printenv)

$ initdb --no-locale --encoding=UTF8 
(2017/4/6
オプション無しで使ってみるとソートした時に並びが変だった)

/home/pgdata/pg_hba.confの編集、編集前に元ファイルを.bkを付けて保存しておく
$ cd /home/pgdata
$ cp pg_hba.conf pg_hba.conf.bk
下記を追加
host all all 192.168.1.0/24 trust
host all all 192.168.2.0/24 trust
(host all all 0.0.0.0/0 trust )

/home/pgdata/postgresql.confの編集(編集前に元ファイルを.bkを付けて保存しておく)
listen_addresses = '*'
max_connection = 32
shared_buffers = 4GB (旧160MB)
temp_buffers = 8MB (2024/8/20 旧40MB → 8MB テンポラリーテーブルを使ってないので、既定値に戻した)
work_mem = 40MB (旧10MB→16MB→32MB(旧2024/8/20))
random_page_cost = 1.0 (2024/8/19 seq_page_cost = 1.0 に合わせた)

・postgresql.serviceの自動起動
下記を/lib/systemd/systemディレクトリに作成し"postgresql.service"というファイル名で保存

[Unit]
Description=PostgreSQL database server
After=network.target

[Service]
Type=forking
PIDFile=/home/pgdata/postmaster.pid
User=postgres
ExecStart=/usr/local/pgsql/bin/pg_ctl -s -D /home/pgdata start
ExecStop=/usr/local/pgsql/bin/pg_ctl -s -D /home/pgdata stop -m fast

[Install]
WantedBy=multi-user.target

# chown postgres:postgres /lib/systemd/system/postgresql.service
# systemctl enable postgresql.service

として登録。再起動してpostgresql.serviceが起動しているか確認。

# systemctl --type service

・データベースの作成
$ createdb DataBaseMei -E UTF-8 -l ja_JP.UTF-8 -T template0
$ psql DataBaseMei < ダンプデータ

----------------------------------------------------------------------------------------------------
ここで失敗してしまった場合は一度、postgresql をアンインストールしてinitdbし直す

サービスを止める
# systemctl stop postgresql.service
postgresqlをアンインストール
$ cd /usr/local/src/p*
$ make uninstall
データフォルダーを削除
# rm -rf /home/pgdata
再作成
# mkdir /home/pgdata
# chown postgres:postgres /home/data
postgresqlを再インストール
$ cd /usr/local/src/p*
$ make install
環境変数PGDATAを確認して初期化
$ printenv
$ initdb --no-locale --encoding=UTF8
後、同様に下記を編集
/home/pgdata/pg_hba.conf
/home/pgdata/postgresql.conf
----------------------------------------------------------------------------------------------------

・ユーザーの作成(スーパーユーザーとして)
ユーザーは手動で登録、データベースを取り込んでもユーザーは登録されない。

ユーザー一覧
$ psql DataBaseMei
nhs=# select * from pg_user;

スーパーユーザーでユーザー登録 の場合
$ createuser -s UserMei

一般ユーザーでロール付与の場合
$ createuser UserMei
$ psql DataBaseMei
DataBaseMei=# grant pg_read_all_data to UserMei;
DataBaseMei=# grant pg_write_all_data to UserMei;

パスワードの設定
DataBaseMei=# alter role UserMei with password 'PASUWAAD';

・ユーザーの削除
$ dropuser Namae

------------------------------------------------------------

2019/8/21
1.sambaが開かなかった、telnetがつながらなかったので、
# systemctl disable firewalld

2.ホスト名の変更
ホスト名の確認
# hostnamectl
ホスト名の変更
# hostnamectl set-hostname [ホスト名]

3.IPアドレスの変更
IPアドレスの確認
# ip a

デバイスを確認
# nmcli d

IPアドレス、サブネットマスクを変更
/etc/NetworkManager/system-connections/enp0s31f6 (例えば)を修正
コメントアウトは#を付ける
インストール時に自動で作成された、IPアドレスだけ変更する

------------------------------------------------------------
インストール終了後、テスト環境ではピアツーピアでクライアントPC接続している。
その場合にクラアントPCからの接続が遅くなってしまう時
は設定したDNSは見えなくなっているので。コメントアウト(#を付ける)する。
それでも遅い場合は/hostsにクライアントPCを追加する。
------------------------------------------------------------

4.サービスの状態確認
起動中のサービス一覧を見たい場合は、以下のようにコマンドを実行します。
# systemctl list-units --type=service
サービスの自動起動を無効にしたい場合は、以下のようにコマンドを実行します。
# systemctl disable SeviceMei

5.ブートダンプ
$ dmesg | less

2024/6/25
6.GRUB2の編集
再起動した時、所要のOSが既定になっていない場合
一覧OSを上から0, 1, 2,・・・・
上から2番目を既定にしたい場合は

# grub2-set-default 1
# grub2-mkconfig -o /boot/grub2/grub.cfg

------------------------------------------------------------
AromaLinux 2024/9/26
パスワード設定時に「文字数が足りない」などエラーが出た時
/etc/pam.d/common-passwordが無いので、system-autuを編集
例えば、次のように最小文字数を変更できます。
password requisite pam_pwquality.so retry=3 minlen=6 dcredit=-1 ucredit=-1 ocredot=-1
------------------------------------------------------------