PostgreSQL ODBC ドライバ。VB からアクセスしているが,どうも書き込めない。Access でもできなかったのだが,ドライバの設定が読みとり専用になっていた。デフォルトが書き込み禁止なのか。覚えとかないと。
某ソフトのユーザー登録。オンライン登録はいいんだけど,以下の(見慣れた)エラーが出た。
データベースが実行できませんでした。
-2147217900
[Microsoft][ODBC SQL Server Driver][SQL Server]PRIMARY KEY 違反、制約 ‘XXX’: オフ゛シ゛ェクト ‘XXX’ に重複したキーを挿入しようとしました。
要するに他の人と主キーがかぶってるワケだが,まさか氏名だけで主キーにしてるワケではないだろう,と,ふとハガキの方を見ると,「ユーザー登録をデータベース化する上で、同姓同名の場合の判断を生年月日で行いますので、ご記入をお願いしております。」とか書いてあった。この世界に同じ氏名で同じ生年月日の人は絶対いないと思ってるのだろうか。
あとエラーって出るのはいいけど SQL Server のエラーメッセージを一般人に見せられても困るし。ユーザーへの簡単なエラーメッセージとどうすればいいかを書いて,詳しいエラーメッセージはサーバーのログに残すようにするって仕様にはできなかったのか。
# 実は某ウィルスチェッカソフトなんですが,いまいち信用がおけないなぁ,と思う昨今でした。まあパターンファイルはダウンロードできるしいいか。データベースの整合性はおかしくなるかも知れないけど私の知ったこっちゃない。
というかなんかぐちゃぐちゃな感じが。昨日 C で C++ っぽくプログラムを組んでそのソースを Perl で TeX 形式にして Pha-jtd 氏の HTML を添削したりして,今日 VB と SQL と C++ をやってるワケで,VB で ‘文字列’ とかやるし。ワケ分からん。
DLL の登録場所。
HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionSharedDLLs
VB で小数点以下 n 桁四捨五入。なんか方法があるのかも知れないが,ヘルプで見つからなかったので。
Int(a * 100 + 0.5) / 100
#その後の情報によると Format を使うらしい。
しばらく Visual Basic をやっているが,C に戻ってみると,
if(a = 1)
とやってしまう。ちなみにやりたいのは ==。
メンバに string を入れると他の string が破壊されるという現象に悩まされる。こんな怪現象にはリビルドだ,とか思ってリビルドしても直らない。結局 1 日悩んだが,インクルードパスに古いバージョンが残っていて,ファイルごとにインクルードするファイルのバージョンが違うということだった。ふう。
そういえば書いてなかったような気がするが,HTML Help Workshop は起動するたびに *.log を関連づけてくれる。こんな拡張子をしかもほとんど関係ないソフトがとるってのはどうだろう。Word の Doc 以上ですな。
Pha-jtd 氏から,CGI が動かないとメールが届く。原因は#!/usr/local/bin/perl
を#!/user/local/bin/perl
と書いていたから。
#ってここで書いていいですか > Pha-jtd 様
大学のレポートプログラムでコンパイルエラー。何故か for を使うとエラーになるというものだが,for 文の中でローカル変数を使っていたからだった。
課題自体は「C 言語」で簡単な計算機を作るというものだが,スタック作るのに template を使えないので
#define name2(x, y) x##y #define declare(x, y) name2(x, declare)(y) #define implement(x, y) name2(x, implement)(y)
とかやって実装したりして。ていうか C++ か Java くらい教えるようにして欲しいけど > 某大学情報工学科。
画像の階調特性を入力しようとしたら会長特製とか出た。いや,プログラム関係ないけど。
Perl。引数を処理しようとしてうまく行かない。
if(@argv < 5) { }
とかやっていたが,引数を表すのは @ARGV つまり大文字だった。
ふとある .cpp を見てみると,
#ifndef XXX_CPP #define XXX_CPP
とか書いてあった。いつの間にこんなの書いたのか。
TeX で表に番号とキャプションを付ける。tabular を begin{table} end{table} で囲み,label と caption を付ける。はずだが,うまく出ない。参照すると節番号になってしまう。でネットをあさって原因が判明。label は caption の後に書くらしい。確かに既にうまくいってる「図」はそうなっている。で,そのようにして XXX.aux を消し,再コンパイルすると見事に正常に表示された。
# でも TeX でこういう順番気にしなきゃいけない事なんてなかったからなあ。普通気にしないような。
ある 2 つのビューがあり,A はマウスのクリックでマウスをキャプチャーする。B はフォーカスがなくなった時にダイアログを出すとする。(B にエディットボックスがあり,そこで編集を行うが,フォーカスがなくなったら値チェックを行う,など。もっと分かりやすい例は後で。)
ここで,B で編集をし,そのまま A をクリックするとどうなるかという問題である。この場合,
- B のフォーカスが失われる
- ダイアログが出現し,OK ボタンを押す
- A に WM_LBUTTONDOWN メッセージが来て,マウスがキャプチャーされる
という具合になるのだが,ここで問題が生じる。A の WM_LBUTTONUP が呼ばれないのだ。よってマウスのリリースができず,困った状況になる。で,解決するために結構悩んだんだが,そういえばエクスプローラも同じ事をやっている。以下の手順で試してみて欲しい。
- ツリービューでフォルダ名を編集し,* とかにする
- 編集中のままリストビューをクリック
- エラーが出るので,OK。
さて,どうなっただろうか。答えは「マウスボタンは離しているのにラバーバンドが現れる」だ。なあんだ。エクスプローラもできてないのか。
もう 1 つエクスプローラの問題。同様に
- リストビューでファイル名を編集し,* とかにする
- 編集中のまま真ん中の境界線をクリックし,素早くサイズ変更
- エラーが出るので,OK。
さて,今度はどうなっただろうか。境界を右に動かした方はリストビューが欠けてしまい,逆に左に動かした方は白い変な領域ができたと思う。これは誰も気付かなかったバグなのか,それとも対応不可能なバグなのか。ちなみに私が試したのは Win98 だけなので他ではどうなるか分からない。
#後で試したところ,NT も同様だった。
Install Sield,ファイルコピー中のファイル名で,カタカナのア・カ行辺りが文字化けする。
Enable(INDVFILESTATUS);
を消し,表示そのものを行わないようにする。
いつか hr みたいな線の作り方を書いたけど,それよりよさそうな方法。
- ピクチャーコントロールを貼り付ける
- スタイルのくぼみをチェックする
これだけ。
MFC 利用スタティックライブラリで
定義されていない基本クラス
とか言われる。StdAfx.h に
#include <afxext.h>
を追加。
複数のプロジェクトを扱う時,他のプロジェクトを変更したときにリコンパイルする方法。プロジェクトの依存関係で依存するプロジェクトをチェック。
libjpeg を入れる。
- VC98bin にある Vcvars32.bat を実行。
- jconfig.vc を jconfig.h に,makefile.vc を makefile に直す。
- nmake でデバッグ版が完成。
- namke nodebug=1 でリリース版が完成。
ちなみに環境変数の領域が足りない場合は config.sys に
shell=c:command.com /e:4096 /p
を追加。(前書いたっけ?)
修正追加。内部コードを EUC に変更したので,ismbblead,ismbbtrail(自作)を EUC にした。
VC++ + SQL Server で作っていたクラス群を Linux + Postgres へ移植。Turbo Linux 4.0 の gcc とかなり違っていて大変だが,今回修正が必要だった部分を書いておく。以下,gcc と書いたら Turbo Linux 4.0 付属のものとする(多分現時点で最新だと思う)。
- VC では ios_base があるが,gcc では古い ios しかない。
- ソースファイルは EUC にしないと変なエラーが出ることがある。
- stringstream がない。代わりに古い(?)strstream がある。ちなみに istrstream のコンストラクタは string ではなく char * をとる。
- basic_string::compare(size_type, size_type, const string &) がない。これは const string & が最初の引数になっていた。
- VC では <cxxx> が std 名前空間になっていないが,gcc ではちゃんと std 名前空間になっている。
- stream の ! 演算子がない(* もかな?)。good() などで代用。
- VC の stricmp は gcc では strcasecmp になっている。
- VC の itoa がない(と思う)。
- <iostream> がなく,<iostream.h>。
全体的には,コンパイラは gcc の方が標準に準拠しているが,標準 C++ ライブラリ,STL は VC++ の方が新しいという感じ。てことは STL だけ Linux でコンパイルすれば最高の環境になるのか,な。どうだろ。
失敗。
class a { a{f()}; virtual f() = 0; }; class b { b{}; virtual f(){}; };
とかやって b::f() が呼ばれなくて悩んだ。原因はコンストラクタからは派生クラスの仮想関数が呼ばれないから。っていうか前もこんなことやったような気がする。
ワケあって NT を再びインストール。HD を換装した際に 3GB の方が余ったのでそれにインストール。
で,今回はサービスパックを入れる前にディスプレイドライバを入れたが,うまくいった。ちゃんと 800×600 24bpp になった。でその後サービスパック 4 を入れると起動しなくなる。結局サービスパックとは相性が悪いのかな。
環境移行終了。3GB の内蔵 HD から 4GB の内蔵 HD に移行した,って地味に聞こえますが。2GB-2GB に分けて Win98 と Linux を入れたのだ。以前は FIPS で分割できなかったパーティションもさすがに入れたばっかりの Win98 は分割でき,快適インストール。
Turbo Linux のウィンドウマネージャ(だっけ)は KDE にしてみる。今まで Gnome + Enlightenment だったが,KDE は何か日本語でいい。さらにエクスプローラみたいのとかいろんなところがウィンドウズっぽくて割と使いやすい。これからはこれにしよう。その内 Java + Swing でエディタを作りたい。
今回初めて LILO を使う。LILO は Linux とウィンドウズとかを起動時に切り替えるものだが,最初はデフォルトで Turbo Linux になっていた。で,/etc/lilo.conf の中身をデフォルトウィンドウズに書き換えるが,変更されない。結局 Linux 上で lilo と打ち込んで LILO を書き込むことで変更できた。考えてみればそりゃそうな気がするが,できればマニュアルに書いて欲しかった。
今回の移行でウィンドウズ環境を大きく変える。内蔵 2GB は OS のみにし,外付けにユーザーデータと開発環境その他ツールを思う存分入れる。本当はユーザーデータとツールを内蔵に入れたいが,さすがに 2GB では不安なので。その内 8GB が出回ったら乗り換えを考えたい。
ついでにオフィス 2000 をインストール。メニューが「普段使うもの」と「あんまり使わないもの」に分かれているのがなかなか面白いと思う。
PostgreSQL。今までどうしてもホスト名を指定するとできなかったが,PostMaster の起動時に,-i オプションを付けると,ネットワーク経由でアクセスできるようになる。
/etc/rc.d/init.d/postgresql su -l postgres -c '/usr/bin/postmaster -S -i -D/var/lib/pgsql'
でも localhost ではいいんだけど Lelie じゃダメ。何故?
PostgreSQL を使用する C++ プログラムのコンパイル。
gcc pgtest.cpp -o pgtest -I/usr/include/pgsql -lpq -lcrypt -ftemplate-depth-30 -lstdc++
ちなみに -ftemplate-depth-30 -lstdc++ はいらなければ必要ない。
総統から電話。「ウィンドウズが起動しない」とか。グラフィックアクセラレータの設定をいじったということなので,Safe Mode で起動。
- DOS モードでなんとか起動させる
- ATTRIB -s -h msdos.sys で msdos.sys を DOS から見えるようにする
- EDIT で msdos.sys の [options] に以下を追加
BootMenu=1
BootMenuDefault=1
BootMenuDelay=10 - ATTRIB +s +h msdos.sys で属性を元に戻す
- Safe Mode で起動し,設定を元に戻す
で完了。ていうか Win95 だと起動時に F8 でメニューが出てきたハズなんだけど出てこなかったので上のようにした。また Win98 だと起動時に Help らしいけどうちのメビウスには Help キーがありません。
内蔵 HD を換装。I・O データの HDNV-N4.3 を買ってくる。6GB とか 8GB とかが欲しいんだけど見あたらないし高そうなのでこれ。で WindowsNT と Linux を入れようとしたんだけど,うまくいかない。
まず HD を入れ替える。ウチの内蔵 HD はリムーバブルなので,スコンと取ってパチンと付けられると思ってたが,結局ネジはいるのね。気軽にってワケにはいかないのか。まあ普通のよりは入れ替えやすいけど。ちなみに外し方は,HD のカバーを開けて中の爪を上げたまま思いっきりカバーを引く。なかなか外れないが,輪っか状になっている金具とかで引っかかりに引っかけるとまあ楽。
NT インストール。インストール自体はすぐできた。途中ネットワークカードのインストールもまあうまくいく。で間髪入れずサービスパック 5 を入れる。
次に Sharp の Web ページからダウンロードしたドライバを 1 コ 1 コ試す。だいたいうまくいったが,ディスプレイドライバだけ起動時にエラーになって,どうしてもうまくいかない。ウチの機種用って書いてあって NT も入れたばっかりなのにダメとはどういうことなのだろう。さすがに 16 色では開発も何もできないので中断。
Linux。前までは外付けの HD に入れて PCMCIA カード経由で無理矢理起動していたが,内蔵に移そうかという感じでインストール。インストール自体は何度もやってるので問題ない。で,起動すると何にもでてこない。下のメニューとかはどうやって起動するんでしょうか。前の時は自動で出てきたんだけどな。とりあえずそのまま。
#後で分かったが,これはウィンドウマネージャの選択で Enlightenment を選択していたからで,Gnome(+ Enlightenment?)にすれば前のになった。
てとこで忙しくなってきたので,とりあえず元に戻して封印しておく。
Turbo Linux で X 使用のプログラムをコンパイル。
gcc -lm -L /usr/X11R6/lib -lX11
Turbo Linux に PostgreSQL のインストールをする。postgresql,postgresql-client,postgresql-devel をインストールし,手元の本(石井 達夫「PC UNIX ユーザのための PostgreSQL 完全攻略ガイド」(技術評論社,1999))のような設定を行っただけで使えるようになった。日本語もちゃんと使えるし起動時に postmaster を起動してくれるし。便利。
今まで ls を白黒(?)で使っていたが,色で表示するようにする。.bashrc にあるコメントどうりにコメントを外したりするだけでできた。
メビウス購入以来ずーっと悩んでたことだが,エクスプローラの動作が異常に重いというのがある。とにかくフォルダの中身を表示するの
に時間がかかるのだ。最初は普通だが,使っていくうちに遅くなり,最終的にはフォルダ開くのに 10 秒とかかかるのだ。ハードが原因とは思えないので,OS か IE の問題っぽい。でも他にこんな症例は聞いたことがない。とりあえず Win98 を捨てて NT にでもしてみようかと思っていた。
しかし,今ふとハードディスクを全共有(もちろんパスワード付きだが)して,ネットワーク越しにアクセスしてみた。するとみちがえるように早く! なったのかはしばらく使ってみないと分からないんだが,感覚的には早いような気がする。ネットワークで使うのでパスが UNC になるのが心配だが,まあ問題ないだろう。これで解決すればこれでいこうと思う。
実はこの問題は今までメビウス使ってて最大最高の問題であり,これが解決したら私のメビウスは完全無欠仕事効率も 150% アップ,世界が変わる! ってくらいの非常に重要な問題なワケで。
# でも NT 計画は実行するかも。唯一の問題 DirectX は Windows2000 で解決するらしいし。
おっきなファイルを送る。が,何故か途中でサーバーからの応答がなくなる。まあこれは仕方がないとして,途中で強制切断されてしまう。で,もう一回やってみて原因が判明。接続後 20 分たつと自動的に「切断しますか?」と聞かれ,答えないと切断されるらしい。ウーン。確かにそれでいいんだけど,20 分もつないでるってことは何かしてるわけで,その間本読んでて気付かないかもしれないのに。って警告音とか全て OFF にしてるのがまずいのか。実は。
プログラムではないが。エクセルの行を固定する方法。固定したい行の次の行を選択し,[ウィンドウ]-[ウィンドウ枠の固定] を選択。
あるウィンドウで IME 入力を禁止する方法
ImmAssociateContext
で,第 1 引数をハンドル,第 2 引数を NULL にして呼び出す。
リサイズ時のちらつきをなくす。PreCreateWindow を以下のようにする。
if(!CView::PreCreateWindow(cs)) { return FALSE; } // CS_HREDRAW,CS_VREDRAW を外す cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS, AfxGetApp()->LoadStandardCursor(IDC_ARROW), (HBRUSH)(COLOR_WINDOW + 1));
これをビューに対して行うときは,メインフレームにも追加すること。今回はこれをしないで悩んだ。
リストボックスに水平スクロールバーを表示させる。リストボックスは勝手に付けてくれないので,自分で大きさを計算する必要がある。
int nSize = 0; CClientDC dc(&m_listboxFile); CFont *pOldFont = dc.SelectObject(m_listbox.GetFont()); for(int i = 0; i < m_listbox.GetCount(); i++) { CString str; m_listbox.GetText(i, str); if(dc.GetTextExtent(str).cx > nSize) { nSize = dc.GetTextExtent(str).cx; } } nSize += LIST_MARGIN; m_listbox.SetHorizontalExtent(nSize); dc.SelectObject(pOldFont);
こんな感じ。この際なかなかサイズが合わず,とりあえずフォントを設定したらやっとうまくいった。CClientDC では自動でフォントを合わせてくれないのね。
スクロールバーの右下のやつ。最初は自分で描画していたが,どうしても更新がうまくいかないので独立したウィンドウにしてしまう。しかし Spy++ で VS を調べると ScrollBar になっている。なんかもっとちゃんとした方法があるのだろうか。
アイコンの 16×16 とかの削除。リソースエディタで [イメージ]-[デバイスイメージの削除] で削除できる。
ウィンドウの破棄。今更って感じだが,実は詳しく知らなかった。ウィンドウは通常外部から直接 delete はせず,以下の手順で行う。詳細はMSDN「テクニカル ノート 17: ウィンドウ オブジェクトの破棄」参照。
- CWnd::PostNcDestroy をオーバーライドし,delete this を行う(親クラスの呼び出しはいらない。)
- 破棄するときは pWnd->DestroyWindow() のように行う。その際,子ウィンドウの場合は親ウィンドウの破棄時に自動的の行われるので考えなくてよい。
Install Shield。ライセンスの文字列を変える。が,ファイルを修正しても一向に反映されない。かなり悩んだが,[ビルド]-[メディア]-[ビルド] を行うことで解決。ていうか VS そっくりにするんだったらこの項目は [ビルド]-[コンパイル] の下にもってきて欲しい。
ファイルの関連づけがうまくいかない。
aaa.Documentshellopencommand
に実行ファイル名とパラメータを設定しているのだが。起動はするんだが,ちゃんとファイルを読み込まない。で 1 回起動するとうまくいく。レジストリの違いは,自分で設定したものはロングファイル名だが,自動で設定されたものはショートファイル名ってとこ。で,自動でショートファイル名を指定したらうまくいった。ウーム。他にないんですかね。ちなみにファイル名をダブルクォーテーションで囲ってもダメだった。
開発環境の入っていないソーテックマシンでインストールを試みる。で関連づけを試す。が,どうしてもメモ帳が立ち上がる。何故だろう。と思ったら,ファイル名の最後に .txt が付けられてた。「登録されている拡張子は表示しない」になっていたのだ。うぅ。