タイガー!タイガー!じれったいぞー!(SE編)

AS400, Java, JavaEE, JSF等の開発、習慣など。日々の気づきをまとめたブログ(備忘録)

【MQ】 JavaでローカルキューにPutしてみる

以前に宣言した通り、今回より、IBM MQを検証した結果を掲載していこうと思います。

キューマネージャ、ローカルキュー、コネクション・オブジェクトを作成し、メッセージをPutするところから始めましょう。

まずは、基本を理解していきたいところ。

IBM MQとは?

IBM MQ(Message Queuing)は、IBMが提供するメッセージングソフトウェアの製品。

分散環境でアプリケーションやシステム間でメッセージを安全かつ信頼性高くやり取りするためのメッセージング・ミドルウェアを提供し、異なるプラットフォームやアプリケーション間で非同期のメッセージのやり取りを可能するものです。

検証環境について

  • O/S: Windows Server 2022 Server Standard Edition
    ファイアウォール設定: 受信規則追加 TCP(1414-1415)を許可
    ・ユーザー情報: t_yamada を追加し、mqmグループに追加
  • MQ Server: IBM MQ Ver 9.3.4.0
  • InstPath: C:¥Program Files\IBM\MQ
  • DataPath: C:¥ProgramData\IBM\MQ

事前準備

IBM MQ9.3のインストール

  • カスタムで「MQIクライアント」を選択する
  • 9.3から「MQエクスプローラー」が付属されなくなったみたい。男は黙ってCUIとする!

IBM MQ 9.3.0以降、 IBM MQ ExplorerIBM MQ インストール・パッケージから削除されました。
これは、 Fix Centralから入手できるスタンドアロン・ダウンロードとして引き続き入手できます。
(IBM MQ Explorer の概要より)

キューマネージャー

まず作成から起動です。

  • q: デフォルト設定
  • lc: 循環ロギング
> crtmqm -q -lc TSQMGR
> strmqm TSQMGR

確認方法

>dspmq
QMNAME(TSQMGR)                   STATUS(実行中)

停止方法

  • w:正常終了、すべてのアプリの終了を待つ
> endmqm -w TSQMGR

ローカルキュー

次は、ローカルキュー作成です。

> runmqsc TSQMGR  
   
DEFINE QL(QL.A) DESCR('QL.A Text')  
END  

確認(ローカルキューの全属性表示)はこちら。

> runmqsc TSQMGR  
  
DISPLAY QL(QL.A)  
END  

認証設定

作成したキューマネージャーへは、ServerにあるIDとPASSでのみ接続可能とします(これで合っているのかな?)

> runmqsc TSQMGR  
   
DEFINE AUTHINFO('MY.AUTHINFO') AUTHTYPE(IDPWOS) CHCKCLNT(REQUIRED) REPLACE  
ALTER QMGR CONNAUTH('MY.AUTHINFO')  
REFRESH SECURITY  
END  

この設定で、サーバとは別のPC上のJavaアプリケーションから、サーバ上に所属するIDとそのPASSでのみ接続できるようになりました。 CHCKCLNT(OPTIONAL)だと、別のPCのログインIDがサーバに存在しているだけでアクセス可能となりました。

MQクライアント

SVRCONNチャネルを定義し、MQクライアントが外部から接続できるにします。

> runmqsc TSQMGR  
DEFINE CHL(TSQMGR_CLNT) CHLTYPE(SVRCONN) TRPTYPE(TCP)  
ALTER QMGR CHLAUTH(DISABLED) CONNAUTH(' ')  
REFRESH SECURITY  
END  

リスナー・プロセスを起動して、クライアントの接続を待ちます。 1414ポートを開けることを忘れずに...。

> runmqlsr -t TCP –p 1414 -m TSQMGR

このコマンドで応答を待ち続けることになるので、別のDOS窓で実行するといいでしょう。

サンプルコード

ここまで来たら、javaアプリケーションの準備です。

IBM MQ classes for Java and JMSを取得します。

https://mvnrepository.com/artifact/com.ibm.mq/com.ibm.mq.allclient/9.3.4.0

dependencies {
    implementation group: 'com.ibm.mq', name: 'com.ibm.mq.allclient', version: '9.3.4.0'
}
import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQException;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQPutMessageOptions;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;
import com.ibm.mq.constants.CMQC;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class testPutMQ {
    // MQサーバーの接続情報
    private static final String HOST = "192.168.1.1";
    private static final int PORT = 1414;
    private static final int CCSID = 932;
    private static final String CHANNEL = "TSQMGR_CLNT";
    private static final String QMGR = "TSQMGR";
    private static final String QUEUE_NAME = "QL.A";
    private static final String USER = "t_yamada";
    private static final String PASSWORD = "password";
    
    public static void main(String[] args) {
        try {
            MQEnvironment.hostname = HOST;
            MQEnvironment.port = PORT;
            MQEnvironment.CCSID = CCSID;
            MQEnvironment.channel = CHANNEL;
            MQEnvironment.userID = USER;
            MQEnvironment.password = PASSWORD;

            MQQueueManager qmgr = new MQQueueManager(QMGR);
            MQQueue queue = qmgr.accessQueue(QUEUE_NAME, CMQC.MQOO_OUTPUT);

            MQMessage message = new MQMessage();
            //*** MQMD (Message descriptor) ***
            message.expiry = 600; //有効時間(ミリ秒)ex: 600: 60秒
            message.format = CMQC.MQFMT_STRING; //文字形式
            message.persistence = CMQC.MQPER_NOT_PERSISTENT; //Persistence
            message.characterSet = 932;
            //*** Origin Context ***
            DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSS");
            String formatNowDate = dtf1.format(LocalDateTime.now());
             String text = "Hello, MQ さん!: " + formatNowDate;
            message.write(text.getBytes("MS932"));

            MQPutMessageOptions pmo = new MQPutMessageOptions();
            pmo.options = CMQC.MQPMO_NO_SYNCPOINT;
            queue.put(message, pmo);
            System.out.println("Message sent successfully.");

            queue.close();
            qmgr.disconnect();

        } catch (MQException ex) {
            System.err.println("MQ Exception: " + ex.reasonCode + ", " + ex.getMessage());
            ex.printStackTrace();
        } catch (Exception ex) {
            System.err.println("Exception: " + ex.getMessage());
            ex.printStackTrace();
        }
    }
}

ローカルキューを確認

試しにJavaアプリからは2回実行してみました。

MQサーバ側で、すでに提供されているキューの中身を確認するコマンドを実施してみます。

>amqsgbr QL.A TSQMGR
   
Sample AMQSGBR0 (browse) start
TSQMGR
Messages for QL.A
1 <Hello, MQ さん!: 2024/03/12 18:22:56.433>
2 <Hello, MQ さん!: 2024/03/12 18:22:59.817>
no more messages
Sample AMQSGBR0 (browse) end

下記のプログラムだと、MQMDを含めてより詳しいメッセージの中身を確認することができます。

> amqsbcg QL.A TSQMGR

まずは、第一弾なので、今日はこんなところでオッケーでしょうか。

【Zoom】固定時刻なしの定期ミーティングの作り方

完全に個人的メモです。

以前は、Zoomでの「固定時刻なしでの定期ミーティング」を作る際には、ZoomのWindowsアプリから作成できていたのですが、いつからなのかわかりませんが、2024年3月現時点では、作れなくなっていました。

上記の通り、再実施の欄に「固定時刻なし」が無くなっています。

これは困った! 

しかしながらWebで調べてみたら、Web画面からならできるとのことでした。

Webブラウザから https://us06web.zoom.us/ にアクセスして、

ミーティングメニューから、「ミーティングをスケジュール」のリンクをクリックします。

「定期ミーティング」にチェックを入れますと、「再実施」のセレクトボックスの中に「固定時刻なし」が選べるようになっています!

こちらを選択することで、「定期ミーティング いつでも」のミーティングを作成することができました!

とりあえず、OKでございまーーーす!!!

原理・原則を「Udemy」で正しく学ぶ

普段、プログラム開発を行っていても、毎回決まり切ったコードになってしまいがち。

特にフレームワークを使っていると、頭を使ってコードを書いているとはいえず、ただの「作業」の繰り返しに思えてきます。

そうすると、よく書くコードはしっかり定着して使いこなせるのですが、普段書かないコードだったり、考え方だったりが薄れていくわけですね。

「これではいけない!」というわけで、来年末に「Udemy」で購入した「Web Developer Bootcamp 2023」を毎日、少しずつ視聴しています。

www.udemy.com

このコース、「Web入門」からはじまって、「HTML」「CSS」「JavaScript」はもちろんのこと、「Node.js」や「Express」「MongoDB」などまで幅広く学習できるプログラムなんです!

セクションの数: 60、レクチャーの数: 572、総時間: 67時間20分!!!

これだけ学べて、今なら2,000円ですか!

激安過ぎますね。

当講座では、実際にコーディングを行うことで、合否判定されるため、理解度チェックには最適です。

原理・原則や、新しいスキルを学ぶのに、「Udemy」や「スクー」は欠かすことができない教材ですね!

学びまくって、昨日の自分を越えていきましょう!

スプレッドシートの関数を学ぶ

毎日数ページずつ、職場で「スキルアップのための読書」を行っていますが、昨年末から読んでいるのがこちら!

簡単なコードを書いて、ブラウザで実行してみる。

ただただ、この繰り返しです。

それにより、どんなことができるのか、今はできないのかがわかってくるのです。

その学びの最中で、「Googleスプレッドシート」の関数に触れる機会があったので、ちょっとだけご紹介します!

翻訳関数

まさか「スプレッドシート」の中にも「翻訳こんにゃく」があるなんて!

=GOOGLETRANSLATE(B3,"ja","en")

上記は、B3に日本語を入力して、関数に英語に変換してもらいました。

これは便利です。

英語学習にも使えそう!

株価、為替算出

アメリカ株」や「米ドル/日本円」などを瞬時に出力してくれます。

下記は、アップル株の最新値を。時間の経過と共に値が変動していきます。

=GOOGLEFINANCE("AAPL")

下記は、「米ドル/日本円」の最新値。

=GOOGLEFINANCE("USDJPY")

過去の期間を一括で発行することもできるなんて!

=GOOGLEFINANCE("NASDAQ:GOOGL","price","2024/02/01","2024/02/15","DAILY")

ただし、現時点では、日本株の銘柄をパラメータに指定することはできないようです。

spread-sheets.com

数ヶ月後には実現できるようになるのでしょうか!?

他の便利な関数

調べてみると、まだまだたくさんあるようです。

rakumo.com

今日のところは、「GOOGLETRANSLATE関数」と「GOOGLEFINANCE関数」までにしておきます。

それにしても、株価や為替を期間指定で回答が返ってくるので、個人的なデータの蓄積は不要になってきそうです。

AIの「Bird」も「Gemini」に変更になったばかりですが、
今後とも、Googleからは目が離せませんね!

個人で使う「クラウド・ストレージサービス」を調査してみた

最近、「楽天ドライブ」なるサービスが発表されました。

pc.watch.impress.co.jp

楽天、じわじわと動き出してきた感じですね!

現在、私は「Google One」にお世話になりっぱなしで、ほとんどアクセスすることがなくなりました。 個人のNASを持っていますが、バックアップの格納庫としての役割になっています。

なので今回、「クラウド・ストレージ」にフォーカスして、今の現状を軽く調査をしてみました。

個人向けクラウド・ストレージの比較

独断と偏見で、選んでいます。2024年2月14日時点での調査結果です。
なお、「年払」の欄は、年間費用を12カ月で割ったものであり、実際は「×12回」の金額が年払いの金額になります。

サービス名 プラン名 年払 月払 容量 備考
Dropbox Plus個人用 1,200 1,500 2TB 30日以内に削除されたファイルの復元
Dropbox Essentialsプロフェッショナル向け 2,200 2,700 3TB 180日以内に削除されたファイルの復元
Google One ベーシック 208 250 100GB 複数の特典あり(ダークウェブのモニタリング、VPN保護など)
Google One スタンダード 317 380 200GB 複数の特典あり(ダークウェブのモニタリング、VPN保護など)
Google One プレミアム 1,083 1,300 2TB 複数の特典あり(上記+Meetのビデオ通話拡張、YouTubeライブ配信など)
Google One プレミアム 2,708 3,250 5TB 複数の特典あり(上記+Meetのビデオ通話拡張、YouTubeライブ配信など)
Microsoft OneDrive Basic家庭向け 203 - 100GB 1人用, Outlook
Microsoft OneDrive Personal家庭向け 1,241 - 1TB 1人用, Outlook, 最新のデスクトップ版MS Office
Microsoft OneDrive Family家庭向け 1,750 - 6TB 最大6人用, Outlook, 最新のデスクトップ版MS Office
box Personal Pro個人向け 1,390 1,320 100GB バージョン履歴:10
楽天ドライブ 無料 0 0 10GB リンクの有効期限=48時間
楽天ドライブ PRO 680 800 1TB リンクの有効期限=自由に設定(最大30日)

MS Officeをバリバリお使いになる方だと「Microsoft OneDrive Personal」が魅力的に映りますが、個人的には、やはり「Google」押しです!

あくまでも主観ではありますが。

2TBで1,083円!

その容量は「GMail」「Google Photo」でも使われますし、そろそろプライベートでは「脱MS Office」を考えていきたいところ。

Googleの2TBと同じ容量の「Dropbox Plus」も気になるところ。
ソースネクストで買うと、割引があって、月額換算で「1,186円」になりますね!

www.sourcenext.com

私は、大切なドキュメントだけをGoogleに預けているので、「100GB」で足りていますが、そろそろ「200GB」へのアップグレードが必要になるかもしれません。

なお、価格については、値上げなどが頻繁に起こると考えられますので、こちらの情報は2024年2月現在だということをご了承ください。

WindowsPCのバックアップ

先日、久しぶりに「Windows11」のバックアップを取ろうと思ったら、なんと見慣れないアプリがあることに気が付きました!

緑のアイコンの「Window バックアップ」というソフトウェアです。

www.lifehacker.jp

しかしながら、組織内では使用できませんでした。

MSログインしていないと駄目っぽいですね。

こうなったら、元からある「バックアップと復元(Windows 7)」を使うしかないでしょうか!?

懐かしの「コントロールパネル」のメニューから選択可能です。

今回は、まだバックアップを実施していませんが、しっかりバックアップと復元テストを実施した上で、また別の機会にご紹介させていただきますね。

昨今は、Windowsが起動しない、立ち上がってこない!という問題は、激減しましたが、
予期せぬ「障害」はある日突然やってくるのです。

備えあれば憂いなし!

また「PCワーカー」として、1つずつスキルを思い出し、
さらに新しいことを吸収して、スキルアップをしていこうと考えています。

【Payara】 外部サーバ更新により、パブリックSSL証明書をインポートした話

運用中の業務アプリにおいて、外部サーバと連携しているものがあったのですが、
先月、その機能が突然、例外を吐き出すようになってしまったのです。

Caused by: com.sun.xml.ws.client.ClientTransportException: HTTPトランスポート・エラー
        : javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException
        : PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException
        : unable to find valid certification path to requested target
    at com.sun.xml.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:131)
    at com.sun.xml.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:223)
    at com.sun.xml.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:145)
    at com.sun.xml.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:110)
:

原因

その発生原因は、相手先サーバの更新作業が行われたようでした。

はじめて見る例外だと、多少慌ててしまいますね。

スタックトレースを見れば、一目瞭然です。

まあ、APサーバが古いのが問題なのでしょうね。

解決方法

一言で言えば、ブラウザで相手先サーバに接続し、新しい証明書を入手し、Payaraが管理する「Java キーストア(JKSファイル)」の中に、その証明書を格納して、サーバ再起動で復旧できました!

(1) 新しいパブリックSSL証明書を取得

相手先サーバへアクセスし、証明書をエクスポートして、入手します。

画面はChromeの例になります。

(2) JKSファイル管理ツール「portecle」を入手

次にサードパーティ製のアプリケーション「portecle」をダウンロードします。
「portecle」とは、キーストアをGUIでメンテナンスできるツールです。

portecle.sourceforge.net

(3) portecleツールで証明書を追加

portecleを起動します。

>cd C:\apps\portecle-1.11\portecle-1.11

>dir

 C:\apps\portecle-1.11\portecle-1.11 のディレクトリ

2024/02/01  17:40    <DIR>          .
2024/02/01  17:40    <DIR>          ..
2024/02/01  17:40           785,915 bcpkix.jar
2024/02/01  17:40         3,955,990 bcprov.jar
2024/02/01  17:40    <DIR>          icons
2024/02/01  17:40             1,110 LICENSE.bouncycastle.txt
2024/02/01  17:40            18,092 LICENSE.txt
2024/02/01  17:40             1,542 net.sf.portecle.appdata.xml
2024/02/01  17:40               662 net.sf.portecle.desktop
2024/02/01  17:40            10,051 NEWS.txt
2024/02/01  17:40           456,080 portecle.jar
2024/02/01  17:40             6,260 README.md
               9 個のファイル           5,235,702 バイト
               3 個のディレクトリ  191,387,426,816 バイトの空き領域

>java -jar portecle.jar

次に、APサーバが管理している「キーストア」を選択して、OPEN。

私の環境では、「PAYARA_HOME\184\payara5\glassfish\domains\domain1\config\cacert.jks」を指定。

パスワードが求められます(既定値:changeit)

パスワードが通ると、証明書一覧が表示されました。

さらにエクスポートした証明書を選択して、追加します。

順に進めていくと......

格納されました!

キーストアファイルは、忘れずに保存してください。

(4) Payara再起動

最後に、payaraを再起動することで、JKSファイルが再読み込みされます。

systemctl restart payara

結果、元の通り、外部サーバにもアクセスすることができました。

オッケー、オッケー!!!