去年と今年と

もう年が明けて5日になってしまいましたが、去年の総括と今年についてつらつらと。

12月末日で今の会社に入ってからちょうど5年が経ちました。 社会人生活に入ってからここまで長く勤めた会社ってのは初めてなので、 まあ、今までで一番合っている会社なんだと思う。 熊本には4年7か月。まだまだ居続けることになりそう。

3年続けないと効果がわからない

3年ぐらいやらないとその人が本当に優秀なのかというのはわからないと思いました。 単年度でものすごい実績を上げれる人はいるのですが、その実績が2年目、3年目も続くかというとそういうわけではない。 東芝のチャレンジもそうでしたが、会計、その他を操ることでその年の実績を上澄みすることができるけど、組織として無理してたら次の年はぼろぼろになるよねぇという。 すごい実績を上げたんですよといいつつ1、2年で次の会社へってことをやってる人がいるけど、どれだけの屍が後ろに積みあがってるんだろうかという。 いや、本当に優秀なのかもしれないけど。

もちろんベンチャーとかだと速度が価値なので、一方向からの見方でしかないのだけれども、まあ、難しいよねぇという感じ。 特に何か結論があるわけではない。

今年はマネージメントにコミットしなければならなくなりそうなので、ちょっと気を付けたいと思いました。

筋トレ

始めてから6年。そろそろこれ以上は筋肉増やさなくても良い感じである。

クラウドは楽

本格的にAWSを使った案件に入ることになってさくっとネットワーク設計とかしたけれども、本当に楽。 オンプレだとげんなりするようなことがマウスポチポチだけで簡単にできる。 サーバールームとか考えなくていいのでビルの部屋割りとかも考えなくてよいから本当に素晴らしい。 という、8年遅れぐらいの感想です。 AWS資格を今年はいくつか取りたい。

人材採用は難しい

いや、本当に。 採用周りはログが残るわけではないから人事がくそみたいなことをやってることもあり、ちょっとずつでも改善していかなければいけないなぁという感じ。 他の会社の採用面接を受けたときに、面接官がバイネームでほかの人の個人情報をべらべらとしゃべり始めたときについてはどうすればよいかと思いました。 リファラル採用とか、社員の友達だから友達感覚でしゃべりたくなるんだろうけれども、お前と私は友達じゃない。 採用活動なんて会社のアンチを作りやすい活動でもあるので、気をつけんとなぁ・・・・・

アウトプットが消えた

去年は本当にアウトプットがなかった・・・・・ついでにインプットも少なかった気がするので、今年は頑張ろう。

モンハン

めざせMR999。

引っ越し

今年(1月中に)結婚することになったので年末からずっと引っ越しとか新居選びとかで忙しい感じです。 結婚報告はまた後程。

まとめ

今年も頑張る。

Oracle DBがWindowsの再起動時に自動で立ち上がらなくなった場合

Oracle DBをサービスとして登録してあり自動で起動するように設定されていて、TNSリスナーは自動で立ち上がるのにOracle DBに接続できない場合があります。 データベースを再作成した時にそうなることがあるのですが、そちらについての確認方法と対処方法を記入します。

今回のケースでは、DBにDBA権限で接続したときにマウント及びオープンされていないので、とりあえず、以下のコマンドを入力することでDBに接続できるようになります。

C:\Users\oracle>sqlplus /nolog

SQL*Plus: Release 11.2.0.2.0 Production on 水 12月 4 13:49:43 2019

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

//sysdba権限でログイン
SQL> CONN / AS SYSDBA
アイドル・インスタンスに接続しました。

//DBの起動
SQL> STARTUP
ORACLEインスタンスが起動しました。

Total System Global Area  ********* bytes
Fixed Size                  ********** bytes
Variable Size             ********** bytes
Database Buffers          ********** bytes
Redo Buffers                *********** bytes
データベースがマウントされました。
データベースがオープンされました。

Oracle DBを使用するためにはサービスとして起動するほかに、マウント、オープンを行う必要があります。 マウント、オープンする設定がレジストリにあるのですが、オフになっているもしくは不整合が発生している可能性があります。

regeditを管理者権限で開いて、以下のキーを参照してください。 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_[HomeName]

以下のような観点で確認してください。

  • ORA[ServiceName]AUTOSTARTがtrueになっているか
  • 初期化パラメーターファイル等の設定ファイルの場所があっているか

詳細はレジストリ・パラメータの概要に。

コマンドからだとoradimコマンドで修正もできます。 詳細はORADIMを使用したOracle Databaseインスタンスの管理についてに。

教えていただいた @takashitel さんありがとうございました。

特定の文字がWindows-31J(Shift_JIS)で扱えるかどうかをJavaで確認する。

現時点では、以下のコードが一番よさそう。

    private static final Charset windows31J = Charset.forName("Windows-31J");

    public boolean canEncodeWithWindows31J(CharSequence str) {
        CharsetEncoder encoder = windows31J.newEncoder();
        return encoder.canEncode(str);

    }

CharsetEncoder (Java SE 11 & JDK 11 )

Hitachi Cosminexusの新規採用は止めましょう。

Java EE(Jakarta EE)の仕様検討ワーキンググループへの参加を止めてしまい、最新仕様への追従も数年前から止めてしまっているようなので、導入するのは止めましょう。 仮に導入しても、レガシーAPIしか使用できず、生産性の向上は望めません。

Java EE(Jakarta EE)サーバーを選択する場合は、少なくとも以下のページに名前の挙がっているベンダーから選択することが推奨されます。

jakarta.ee

WindowsでOracle 18c XEのインストール時に管理者権限があるのに管理者権限がないと怒られて失敗する場合

ドメインに参加しているWindowsドメインユーザーを使用してOracle 18c XEをインストールしようとすると、管理者権限がついていたとしても管理者権限がないといわれて怒られる。

その場合、同名のローカルユーザーを作って管理者権限を付けてあげると、ドメインユーザーでもインストールすることが出来るようになる。*1

*1:どう考えてもダメだと思う

Servlet APIとJPA APIの日本語翻訳を独自ドメインに移動させました。

タイトルのとおり。

古いページにアクセスしても自動でリダイレクトされるはずですが、ご連絡として。

中身はgithub pagesのままで何も変わってないです。

https://github.megascus.dev/

よくある質問と答え

  • なんでドメインを移動させたんですか?
    • github pagesのドメインだと社内プロキシに阻まれてアクセスできないという苦情を受けたためです。

Oracle DBのPL/SQLからOffice365(starttls)を利用してメールを送信する

君がこれを読んでいるということは非常につらい状態に置かれているということだろう。 公式ドキュメント通りにやっても動かないという人向けに記す。

以下についてはきちんと読みましょう。

docs.microsoft.com

https://support.microsoft.com/ja-jp/help/4458479/improvements-in-smtp-authenticated-submission-client-protocolsupport.microsoft.com

サマリー

  • ほかの手段があるならやらないほうが良い。回れ右をすること。
  • STARTTLS(TLS接続)を利用するためには証明書のキーストアとしてOracle Walletを使用する必要がある。デフォルトでは何の証明書も入っていないため、必要な証明書については自分で持ってきて、定期的な更新作業も自分で行う必要がある。
  • ACLは適切に設定しよう。
  • OracleのUTL_SMTPはメール送信をするためのパッケージではなく、SMTPプロトコルを会話するためのユーティリティなので、SMTPの会話内容を抑えているなら容易い。
  • SMTPプロトコルが理解できていないなら、JavaMail等、メール送信を行うためのライブラリを利用して、そのデバッグログ等でSMTPプロトコル内容を把握してから使うべき。

Oracle Walletを設定する。

Oracle Walletはいわゆる証明書のキーストアです。Web標準では公開鍵式暗号を使用しており、事前に公開鍵をインポートしておく必要があります。 通常、ブラウザ等では信頼性が高いとされている公開鍵をデフォルトで保持しており、また、セキュリティパッチ等で自動的に更新されるのですが、Oracle DBではデフォルトでは公開鍵をひとつも持っていないため、インストールする必要があります。

Office365の場合は以下からダウンロードすることができます。

support.office.com

証明書のOracle Wallet(証明書のキーストア)への取り込みはOracle Wallet Managerを使用することで行えます。マニュアル通りなので、そちらを参照してください。

docs.oracle.com

作成したOracle Walletファイル(ディレクトリごと)はローカルの適切な場所に配置します。

Oracle Walletに保存した証明書は適時手動で更新する必要があります。注意してください。

Oracle Walletに保存した証明書は適時手動で更新する必要があります。注意してください。

Oracle Walletに保存した証明書は適時手動で更新する必要があります。注意してください。

大事なことなので3回書いておきます。

ACLを設定する

ACLはアクセスコントロールリストです。Oracle DBから接続できる外部サイトを指定します。 DBMS_NETWORK_ACL_ADMINのマニュアル通りに設定してください。

docs.oracle.com

以下のような感じになります。

    DBMS_NETWORK_ACL_ADMIN.CREATE_ACL('ACL.xml', 'ACL for SMTP Server', SCHEMANAME, TRUE, 'connect');
    DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE('ACL.xml', SCHEMANAME, TRUE, 'resolve');
    DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL('ACL.xml', 'smtp.office365.com');

UTL_SMTPを利用してメールを送信する

インフラ対応が終わったので、ここからUTL_SMTPを利用してメールを送信するプログラムを書いていきます。 UTL_SMTPはメールを送信するためのパッケージではなく、SMTPプロトコルで会話するためのパッケージなので、使用するためにはSMTPプロトコルを理解する必要があります。

気力がある人は以下あたりを読みましょう。

https://www.ietf.org/rfc/rfc3207.txt

https://www.ietf.org/rfc/rfc5321.txt

読むのが面倒くさいので、ここではぐぐれば出てくるJavaMailの適切な設定を行い、デバッグログ出力を利用することで、何をすればいいのかというのを調べます。 Office365ではSTARTTLSが利用されており、以下のような感じでメール送信プロセスが行われるようです。 本当はデバッグログがもうちょっと出ますが、今回は必要な通信部分のみ抜粋しました。

>から始まる行はクライアントからサーバーへの送信。それ以外の行はサーバー側からクライアントへの受信です。

(接続)
220 OSAPR01CA0250.outlook.office365.com Microsoft ESMTP MAIL Service ready at Sun, 14 Apr 2019 06:52:53 +0000
> EHLO XXXXXXXXXXXXXXXXXXX
250-OSAPR01CA0250.outlook.office365.com Hello [180.52.91.76]
250-SIZE 157286400
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-STARTTLS
250-8BITMIME
250-BINARYMIME
250-CHUNKING
250 SMTPUTF8
> STARTTLS
220 2.0.0 SMTP server ready
> EHLO XXXXXXXXXXXXXXXXXXX
250-OSAPR01CA0250.outlook.office365.com Hello [180.52.91.76]
250-SIZE 157286400
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-AUTH LOGIN XOAUTH2
250-8BITMIME
250-BINARYMIME
250-CHUNKING
250 SMTPUTF8
(ここでログインメカニズムを実行)
> MAIL FROM:<sender's office365 mail address>
250 2.1.0 Sender OK
> RCPT TO:<receiver's office365 mail address>
250 2.1.5 Recipient OK
> DATA
354 Start mail input; end with <CRLF>.<CRLF>
> Date: Sun, 14 Apr 2019 15:52:53 +0900 (JST)
> From: sender's office365 mail address
> To: receiver's office365 mail address
> Message-ID: <###message id###>
> Subject: subject
> MIME-Version: 1.0
> Content-Type: text/plain; charset=us-ascii
> Content-Transfer-Encoding: 7bit
> 
> content
> .

この通信を模したPL/SQLは以下のようになります。 変数の型については適時UTL_SMTPのドキュメントを参照して補ってください。

conn := UTL_SMTP.open_connection(
          host => 'smtp.office365.com',
          port => '587',
          tx_timeout => 60,
          wallet_path => 'file:path_to_wallet',
          wallet_password => 'password',
          secure_connection_before_smtp => false);
UTL_SMTP.EHLO(conn, 'my host name');
UTL_SMTP.STARTTLS(conn);
UTL_SMTP.EHLO(conn, 'my host name');
UTL_SMTP.AUTH(
          c => conn,
          username => 'sender's office365 mail address',
          password => 'office365 password',
          schemes => 'LOGIN XOAUTH2');
UTL_SMTP.MAIL(conn, 'sender's office365 mail address');
~~~ 以下、UTL_SMTPパッケージのマニュアル通り ~~~

docs.oracle.com

ポイントは以下の通りです。

  • SMTPプロトコルでの会話内容を愚直に守る。
  • UTL_SMTP.AUTHのschemesの値は、サーバーにEHLOコマンドで問い合わせた結果、AUTHに入ってくる値を使用する。
  • wallet_pathはfileプロトコルの形式で書いてくれとマニュアルに記載があるが、Windowsの場合はfile:c:/hogehogeの形式でないと受け付けてくれない。(file:///c:/hogehogeのようにfile:の後に/を入れるとエラーになる)

まとめ

という感じで。

この知識が生かされないことを祈ります。。。。