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

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

モノに囲まれた暮らしの終焉

今年の1月中旬に、賃貸マンションの配管が不調で、急遽、一時的な引っ越しをすることになった。
先週、一時引っ越し先から戻ってきたのだが、新しい気付きがあったのでシェアしておきたい。

とにもかくにも、一言で言うと「モノ、いらねーーー!」である。

約3カ月間、家族の持ち物がほとんど無い暮らしを体験できた。
もちろん、数カ月間使う衣類や書籍は、一時引っ越し先には持ってきていたが、大概のモノは、もとの場所に置いてきたので、モノが少ない部屋で過ごせたわけだ。

これが実にいい!

あらためて、元の住まいに戻ってきて、そのことに気がついたのである。

その勢いで、衣服は2~3着は捨ててみた。

買ってから一度も袖を通していない服。購入したのは、4、5年前かもしれない。

後は、書籍類である。

見渡す限りでは、ざっと600~700冊はあるだろうか。

うち、7割近くは積読本である。

整理収納アドバイザーとしては、許せない事態だ。

まずは、必要と不要に分けて、最終的には「マイセレクション100」にするのはどうだろう?

100に絞りきれるかは自信が無いが、今はKindleがある。

電子本で買いなおせばいいし、その方が場所は取らない。

さあ、それではいつ結構しようか。

いきなり全部をやろうとすると、頓挫するのはわかっているので、まずは1つの書籍ボックスの中の本をざっと目を通して、今の自分に価値が無いと思われる本をどんどん捨ててみたいと思う。

まずは、10冊の廃棄。

売れそうなものは、売却するとして、ここで手間をかけるとブレーキがかかる。

もう捨ててしまって問題ないかもしれない。

早速、あさっての休みの日に、10冊捨ててみよう。

もう裁断もしない。実際の書籍だけでなく、読んでいない電子本もたくさんあるのだ。

死ぬまでに読み切れるはずが無いので、目の前からノイズを減らして、シンプルな暮らしをしていきたいと思う。

今回の引っ越し、最高の気づきをありがとう!!!

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

間隔が空きましたが、MQの話です。

前回、ローカルキューにPutしてみました。

tigertaizo.hatenablog.com

今回は、数回Putした後で、そのローカルキューからGetして、取得したメッセージを表示するサンプリアプリを作ってみました。

サンプルコード

import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQException;
import com.ibm.mq.MQGetMessageOptions;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;
import com.ibm.mq.constants.CMQC;

public class testGetMQ {
    // 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);
            // キューをOPENして、キュー定義のデフォルトを使用してメッセージを取得 | MQOPEN呼出しは、QMGRが静止状態になっている場合は失敗する
            int openOptions = CMQC.MQOO_INPUT_AS_Q_DEF | CMQC.MQOO_FAIL_IF_QUIESCING;
            MQQueue queue = qmgr.accessQueue(QUEUE_NAME, openOptions);

            // キューがなくなるまでメッセージを取得
            while (true) {
                MQMessage message = new MQMessage();
                MQGetMessageOptions gmo = new MQGetMessageOptions();
                // 適切なメッセージが到着するまで待機 | MQOPEN呼出しは、QMGRが静止状態になっている場合は失敗する
                gmo.options = CMQC.MQGMO_WAIT | CMQC.MQGMO_FAIL_IF_QUIESCING;
                // アプリケーションが待機する最大時間(ミリ秒)
                gmo.waitInterval = 5000;

                try {
                    queue.get(message, gmo);
                    System.out.println("Received message: " + message.readLine());
                } catch (MQException mqe) {
                    if (mqe.reasonCode == CMQC.MQRC_NO_MSG_AVAILABLE) {
                        // キューが空の場合
                        System.out.println("Queue is empty. Exiting...");
                        break;
                    } else {
                        throw mqe;
                    }
                }
            }
            queue.close();
            qmgr.disconnect();

        } catch (MQException ex) {
            if (ex.reasonCode == CMQC.MQRC_NO_MSG_AVAILABLE) {
                System.out.println("No messages available in the queue.");
            } else {
                ex.printStackTrace();
            }
        } catch (Exception ex) {
            System.err.println("Exception: " + ex.getMessage());
            ex.printStackTrace();
        }
    }
}

実行結果

下記は、2件のメッセージがローカルキューに溜まっている状態で、上記サンプルコードを実行した結果です。

Received message: Hello, MQ さん!: 2024/04/12 18:24:57.171
Received message: Hello, MQ さん!: 2024/04/12 18:25:00.201
Queue is empty. Exiting...

サンプルでは、ローカルキューにあるメッセージを繰り返し取得します。

結果より、2件のメッセージを取得できています。

インターバル(サンプルでは5秒)の時間が経過したことで、「Queue is empty. Exiting...」をメッセージを書き出し、ループを抜けました。

次回は、2つのキューマネージャを準備し、「リクエスト/リプライ・メッセージ型」の環境を構築したいと思います。

【Windows】値貼り付けのショートカットキーが超便利!

私は、職場でも自宅でもPCはWindowsです。

Mac」を使っていた時期もありますが、もうWinに慣れました。

今回は、ショートカット・キーの話です。

定番のショートカットキーと言えば、切り取り、コピー、貼り付けでしょうか。

Windowsだと、切り取りは「コントロール+X」、コピーは「コントロール+C」、貼り付けは「コントロール+V」。

特にExcelで、大活躍しますよね。

ここまではおなじみなのですが、MS365の更新なのか、Windows Updateでの更新なのかわかりませんが、「コントロール+シフト+V」だと、値貼り付け(書式は無視した値だけの貼り付け)になることを先月、知ったのです!

これは超・便利!!!

Excel」と「Googleスプレッドシート」それぞれでショートカットキーで「値貼り付け」してみました。

Excel

Googleスプレッドシート

挙動を理解した上で、この「コントロール+シフト+V」のショートカットもどんどん活用していきましょう!

今、自分はコーチャブルであるか?

今日のタイトルにある「コーチャブル」という言葉を知ったのは、名著『1兆ドルコーチ』からであった。

コーチャブルとは、コーチングを受けられる状態、受けられる人を指す言葉。

いつでもコーチャブルであるということは、自分自身がリソースフルな状態であるってこと。

それは、「正直さ」と「謙虚さ」を合わせ持っていて、

「あきらめない」「努力を惜しまない」姿勢であり、

「学ぶ意欲」も高い状態。

コーチングでは、ありのままの自分をさらけ出す必要があり、そんな状態であれば、最高のパフォーマンスを発揮できるのかもしれない。

だからこそ、毎日、自分自身に問いかけしたい質問、

「今、自分はコーチャブルであるか?」

先日、瞑想の師匠にお会いして、メンタルは絶好調だが、カラダの疲れがまったく取れていないことに気づいた。

次の休み(日曜日)は、ぼーと過ごそう。

角煮でも作ってみるとするか!

仕事で「ドーパミン」を出しまくるには?

スマホドーパミン製造装置である

スマホとの向き合い方をここ2ヵ月間近く考えてきました。

結局、スマホの基本設計は、我々の時間を奪う仕様なんだということに気付かされました。

一般的に言われることですが、以前のゲームは、「ドラクエ」や「スーパーマリオ」など、クリアすることが目的であって、コンプリートできたことで達成感で一杯になったかと思います。

しかし今のゲームは、まったく違います。

ガチャ、イベント、レアアイテム、他ユーザーとの繋がりなど、いかに人にその場に居続けさせるための工夫が多数ちりばめられているのです。

「クリアしたら終わり」という世界では無くなってしまった。

ゲームだけでなく、SNSやゴシップニュース記事などでも時間は簡単に消費していきますよね。

つまり、ドーパミンをユーザーにずっと放出させまくるツール、それがスマホの正体だったのです。

まさに「ドーパミン製造装置」!!!

仕事でもドーパミンを活かせないのか?

ふと思ったのです。

スマホドーパミンを出しまくることができるのなら、仕事でも応用がきくのではないかと。

私なりに考えてみました。

(1) 目的思考!

まずは何と言っても、目的をとことん考えて仕事をするにつきそうです。

どんな雑用であっても、その作業の意味を考える。

これが無駄だと思うのなら、回避する方法を考える。

「無駄な時間を有意義な時間に変えるには?」と問いを立ててもいいかもしれません。

さらに、目的を考えたら、行動に移すことになりますが、しっかり行動をチャンクダウン(細分化)して、ToDoリストに落とし込みましょう。

たとえ、小さなアクションであっても、ToDoを1つクリアしたら、すぐにToDoリストから、そのタスクを完了扱いにしてください。

「よし! 1つ終わった。前進できた!」という感覚で、ドーパミンを放出されていくはずです!

(2) 成長マインド!

2つ目は、成長マインドを持つということです。

現在、トイレの置き本になっている本はこちら!

「硬直マインド」と「しなやかマインド」の対比が心地よく、スラスラ頭に入ってきます。名著です!

ゲーム感覚で、自分という主人公のレベルを上げていく感覚が大事。

体力を使う仕事をしたなら、体力のパラメータが1ポイントアップ!

アイディア出しなどで、頭脳を使いまくったあとなら、知力がアップ!

上司や客先に理不尽に怒られたとしても、忍耐力がアップ!(そう簡単には思えないときもありますが……)

昔、空手教室で師範代が言っていた言葉が、「人間、棺桶に入る直前まで成長できる!」というもの。

今も私にとっての宝物です!

(3) こまめに報酬!

最後は、自分を労るために「自分ご褒美」というやつですね。

スマホゲームにも、定期的に報酬があるように、仕事の達成度合いに応じて、こまめに報酬を与えましょう。

好きな食べ物・買い物、時間の使い方、イベントや飲みに行くなどなど。

何でも選択肢はありそうですね。

時にはこの報酬のためにがんばれることもあるでしょう。

いいじゃないですか、人なんですから。

まとめ

というわけで、仕事で「ドーパミン」を上手に出すというテーマで書いてみました。

自分自身、(1) と (2) はできているつもりですが、どうも (3) が苦手なんです。
1つ達成しても、すぐ次の仕事に目を向けがちなので。

今年は、自分への報酬を意識してみようかな。

ドーパミンの量に変化があると信じて、仕事に打ち込んでいこうと思っています。

【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でございまーーーす!!!