この世界の冬は、案外短い…よく覚えていないが、元の世界は寒い時期がもっと長かったような?と、妙に早く感じるタカシであった。そうは言っても、窓の外は大雪なのだ。
「なんだか深々と雪が降るなあ…真っ白だ」とタカシは呟きながら、いつもように、ねこぴスティックのボタンを押して自席のモニタとリンクした。ボタンを 1 回押すと、しばらくしてモニタを経由して元の世界に居るねこぴが映った。
だだっ広い部屋で、全身の力が抜けてテーブルにペターっと頭をつけて汗をかいたねこぴがだらしなく寝ている。(あれっ寝ているのか?)「おーいねこぴ…起きろよ!」とタカシは笑いながら大声で言った。
「ウン…にゃ~タカシかあ…」と口元を拭いながらねこぴが眠そうな顔で言った。
「どうした?しんどいのか?」
「暑いのよ外も中も…もう 9 月も終わりにゃのに、こっちは 33℃ あるにゃ…しかもエアコンの調子が悪くて部屋も冷えないにゃ」とグッタリねこぴが言った。
(そんなに暑いなら、その被り物脱げばいいじゃん…。いや、身体の一部なら脱げないのか…?)と思いながらも「そりゃ大変だなあ…。けど、ボチボチ報告会始める?」とタカシは尋ねる。 その言葉に反応して、耳がピクピク高速に動きながら王冠が光り、シャッキーンッとねこぴが、いつもの雰囲気の表情に変わった。
「タカシ!そっちでは PowerBuilder のマイグレーション作業した後の動作検証で厄介な障害とかよく出たかにゃ?」
「エッ?あんまし聞いたことないなあ…なあアクーツク?」と斜め後ろを振り返り、背中を向けて作業しているアクーツクに確認した。
二人の会話が聞こえていたアクーツクは、「まあ、全く無いわけじゃなかったけど大したことは起きてない…ちなみに、ねこぴ…どんな現象があるんだ?」と尋ねる。タカシは、二人が対話しやすいようにモニタをアクーツクの方に向けて自身はその中間の位置で少しイスを引いて姿勢良く座り直した。
「おっアクーツクにゃ、久しぶりにゃ!元気かにゃ?」とねこぴが言うと「元気だ…早く話せ」とアクーツクは静かに返した。(ったく…笑…いつものアクーツクだな)
「ウッ…わ、わかったにゃ…。
最近 PowerBuilder2017 とか、その前の Sybase 版 PowerBuilder から PowerBuilder2022R3 へのバージョンアップのシステム案件が急増してるにゃ!
こっちでは OS 環境の Windows10 のサポートがいよいよ 2025 年 10 月 14日 で期限切れになるにゃ…!それで Windows11 に対応する中で、「せっかく PowerBuilder2022R3 でバージョン上げるなら…」って、従来の 32bit から 64bit バージョンへ変更したいお客様が増えているんだにゃ。
けど、そうしたお客様がマイグレーションして新しい 64bit システム環境で動作検証したらエラーメッセージもなく、突然システムが終了するって問い合わせがやたらと増えて困っているにゃ…」と一気にねこぴは説明した。
「だそうだ…」とタカシがアクーツクに向かって言う。
「フムフム…ねこぴ…その現象って PowerBuilder で開発したシステムから外部の…そうだな、例えば Windows API や C++ などほかの言語で作ったクラスライブラリにアクセスする時によく発生する現象か?」とアクーツクが、静かに尋ねた。 「だそうだ…」とタカシがねこぴに向かって言った。(やはりな…うんうん)
「なんでわかるにゃ?!そうにゃ!詳しい情報をお客様から聞いてみると、今アクーツクが言ったとこまではこちらもなんとかわかったんだにゃ。それをすぐ察知できるとは…お主…やりおるにゃ…!」驚いて目をパチクリさせるねこぴ。
「だそうだ…」
「『だそうだ』は、もういいタカシ!」とすかざずアクーツクは手でタカシを制した。
「褒めてもらうことではないがな…。けど、うむ…ねこぴにもわかるように説明することが難しいな…。
1 byte = 8 bit だから、32 bit が 4 byte なのはわかるな?この 1 bit で表せられるパターンは 0 か 1 の計 2 つだから、32 個のスイッチで表すことができる番号の数は、 2 の 32 乗になる…」とアクーツクは時計デバイスに入力しながら続ける。
「 42 億 9 千…要は約 43 億あるんだ。で、これが 64bit だと… 2 の 64 乗で……約 1,800 京。…まあ天文学的数字だな」と言った。
ねこぴは「??…番号ってなんにゃ?」と目をクルクルさせて言った。
「すまん、前提としてポインタの説明を省いたからな…。開発言語の中では [ポインタ] という概念があって、ちょうど住所番号が書いてあるメモ帳のようなものなんだ。それで地図の大きさが 32bit と 64bit では比較できないほど違うんだ…となると、扱えなきゃいけない住所番号の数も増える。簡単に言うと約 43 億の住所番号が記載できる住所録とさらに膨大な数の住所番号が載せられる分厚い住所録みたいなものだよ。」
「その住所録と住所番号の違いが、なにが問題になるんだにゃ?」とねこぴは頭を掻きながら呟く。
「最初にねこぴに質問した時に、PowerBuilder で開発したシステムから外部の違う言語で開発したライブラリにアクセス…と言ったよな?
まあ外部関数だけじゃないが、開発言語の中にはいろいろな関数があって、それぞれに特徴があるんだけど、関数によっては 64-bit という環境のメリットを存分に利用しようとするものもある。つまり、さっき言ったように分厚い住所録を使うようになるんだ。それによって、64bit のシステム移行の際には 32bit の時に使っていた変数では表現できない住所番号になる。だから、そうした変数は移行時にチェックして処理に適したデータ型に置き換えていく作業が必要なんだ。今回のケースは、そうした変数のデータ型をそのままで移行して、メモ帳に記載された住所番号を認識できなかったからじゃないか?」とアクーツクは優しく話した。
「フ~ムムム、要は 32bit の時に使っていた関数のまま、64bit に移行したことが原因なのかにゃ?」
「それが原因であることが、多い…まずマニュアルで関数を調べて見ることだ。後でタカシから、そちらのエンジニア向けの解決の糸口メールを送らせるから、それを渡すといい」とタカシに目配せをしてから、アクーツクはイスをクルリと回して自分のモニタ前に戻っていった。
「だそうにゃ!」
「ったく…!わかったよねこぴ、あとで送るよ。」とモニタの前に戻ったタカシはねこぴに言った。
「タカシ…こっちで Java はなんか、そんなに面倒なことは無いみたいかにゃ…?」と少し不安そうにねこぴが言う。
「ああ、基本的には同じだけど、ライブラリが充実していて外部の言語に頼ることが少ないからかな?…動くことは動くよ、けど事前検証はやっぱりするもんだよ。ま…こっちの世界では Java はもう…」とタカシは言いかけて止めて、「それより、早速メール作成して送るよ!今日はこれで終わり?」とねこぴに尋ねた。「そだにゃ!それそれ…早く送ってくれにゃ、待ってるにゃ!じゃあにゃ…タカシ」とねこぴもそそくさとモニタ前から消えた。(話が難しかったんだな…笑)
「さてと…」
(アクーツクの第一声で俺も気が付いた…。ねこぴの言う異常終了には、共通して外部関数の呼び出し部分が一つの要因だ。大抵の場合、問題が発生しているシステム内で外部関数の戻り値や引数で使用されているウィンドウハンドルなどの『ポインタ型』が Long 型で宣言されたままなんだと思う。
外部関数 {C/ C++ 言語} で『ポインタ型』はプロセスのビット数によってサイズが異なるからな。32-bit プロセスではサイズが 32 bit だけど 64-bit プロセスで実行すると 64 bit {8 byte} となる。でも、PowerBuilder の Long 型は 32 bit で固定だ。だから 64-bit で実行しているにもかかわらず、PowerBuilder 側でポインタの受け渡しのために Long 型を使用してしまうとオーバーフローが発生するんだ。
この問題を解決するには、戻り値や引数にポインタを取り扱う外部関数の宣言、およびポインタを格納する変数には LongPtr 型を使用しないといけない。
LongPtr 型はビルドされたビット数によって適切なサイズで動作するからだ。32-bit アプリケーションでは 32 bit {-2147483648 ~ 2147483647} 、64-bit アプリケーションでは 64 bit {-9223372036854775808 ~ 9223372036854775807} という具合だな。けど、これは外部関数に限った話じゃない。PowerBuilder 組み込みの関数でも、Handle 関数{オブジェクトやコントロールのハンドル}、PrintOpen や PrintText 等の印刷関数{印刷ジョブハンドル}、Send/Post 関数といった Windows メッセージの送信でもポインタを使用してるから、これらの関数でも LongPtr 型に置き換える必要がある。外部関数を使用するときはポインタに注意しろ!ってことだ。
外部関数についてもっとくわしく知りたい方はこちらのテクニカルブログもご覧ください👇
それと、こういう時はしっかりマニュアルを見て関数の取り扱いをよく理解することだ。そういう意味では、プラットフォーム依存型 IDE は、ハードウェア性能 UP で確かに移行検証はかかる。 でも、その分、エンジニアとして拘るクセというか?愛着と言うか…ちょっと思い出せないけど、味わい…?があるのかな)と思いながらタカシはメールを作成する。
タカシは、音楽を聴く…レコードとネット配信の違いを言いたかったのかもしれない。
そう…実はこの世界では、人間や天使、悪魔やドワーフ含めて Java という言語の存在は知っているものの、自分たちでは使わない。端的に言うとロボットが自ら開発しており、それで十分にシステムが成立しているからだ。過去には長きにわたって活用され、IDE などの支援ツールも含め環境も扱いやすかった。しかし、ある時から生成 AI で自動生成されて、品質向上も図れ今では AI エージェント、すなわちロボットがすべてを行えるようになっている。それで何も問題ない…ロジカルであり開発対象システムの操作性に不都合など一切発生しない。
タカシは、PowerBuilder もやがては…?と不安になる時もあるが、やはり DataWindow (データウィンドウ)の直感的な振る舞いやコーディング中や顧客とのテスト検証の際のやりとりからポっと浮かぶアイデアをすぐ試す、微調整する、などのプロセスの充実感にエンジニアとしての断固たる矜持を持っている。自分がすべてに関わっている感覚と当事者責任の在り方なのだろう。
(今日は、アクーツクが口酸っぱくいうマニュアルを読め…には、なんか納得したな…)と雪が深々と積もる窓の外を眺めながら、タカシは送信ボタンを押した。
PowerBuilder のヘルプには、 PowerBuilder IDE – 32-bit アプリケーションを 64-bit に移行する際の検討事項が掲載されているので、64-bit 化を検討しているユーザー様はぜひ一度ご確認ください。
なお、当ポータルサイトで公開中の日本語翻訳版のファイルをダウンロードすることで、ヘルプを日本語でご利用いただけます👇
[PowerBuilder Help – PowerBuilder IDE – 32-bit アプリケーションを 64-bit に移行する]🔎
最近多いお問い合わせの紹介では、「PowerBuilder IDE 自体 の 64-bit 化について」のお問い合わせにもくわしく解説しています。
こちらも併せてぜひご覧ください👇
異世界転生コラムシリーズ
前回までのお話はコチラから!