技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

Java

Javaの整数型の最大値

最近、仕事と関連していて頭を使う新たな趣味を始めようと思い、週末などに競技プログラミング (AtCoder) の過去問を黙々と解いている。言語は、速度やライブラリの充実度を考えると C++ が良さそうだったのだが、仕事で一番馴染んでいるのがJavaだったので…

SSLサーバ証明書を生成する時の alias について

先日、Java の keytool コマンドを使用して、SSLサーバ証明書を生成しようと思ったら、コマンドの引数に指定する「-alias」オプションに何を指定して良いのか分からなくてちょっと調べたので、防備としてここにメモしておく。 「-alias」オプションには、生…

jarファイルの署名の削除

テストのため一時的に Java の jarファイルの署名を削除したいことがある。その時の手順について簡単に纏める。 jarファイルを開く。(7zipやWinZipを使用) jarファイルの META-INF ディレクトリ内の署名関係のファイル(*.SF, *.RSA) を削除する。 META-INF …

Javaの例外設計

Javaでプログラミングしていると、どこでどの例外をキャッチすべきか悩むことが多い。特にチェック例外はどこかにキャッチ処理を書かないとコンパイルが通らないので、その数が増えるとコードがキャッチ処理で埋め尽くされて煩雑になってしまう。 この悩みに…

Javaで時刻間の差分を出す

Javaで引数で受け取った2つの時刻間の差分を出すプログラム(calcTimeDiff)を作成した。ログ解析などをしていて、ログ内のある時刻からある時刻までの正確な経過時間が欲しい時、脳内でいちいち計算するのが面倒だったので、これを作成した。使い方は、 java…

Javaのプロセスに対して外部からGCを実行させる。

Javaのプロセスに対して外部からGC(ガベージ・コレクション)を実行させる方法についてちょっと調べた。幾つか方法があるようだが、自分でやってみてうまくいったのは以下の方法。 jconsole コマンドを実行して立ち上がるGUI上で、対象のJavaプロセスを選択し…

JavaでSNMPトラップ送信

JavaでSNMPトラップを送信するコードを作成した。snmp4j (https://www.snmp4j.org/) を使用しているので、コンパイル&実行には snmp4j-x.x.x.jar が必要。(実機検証は Java1.8 + snmp4j-2.6.2.jar で実施した) 実行方法 java TrapSender [-v {1|2c|2}] [-a …

完全コンストラクタパターン

オブジェクト指向の勉強をしていて、「完全コンストラクタパターン」というものが出てきた。これは、オブジェクト生成時にコンストラクタに必要な情報を全て渡して、後からそのオブジェクトの状態(フィールド変数)を変更しない設計方式。つまり、オブジェク…

JavaのInetAddressクラスのメソッドで名前解決(逆引き)する時は正引きも行われている。

JavaのInetAddressクラスのgetHostName()やgetCanonicalHostName()で、IPアドレスからホスト名への名前解決(逆引き)を実行すると、裏で正引き(ホスト名⇒IPアドレス)も行われるようだ。詳細は以下の通り。InetAddressクラスのソースを確認すると、getHostName…

J2EEのEntity Manager経由でDBから取得したオブジェクト

J2EEのEntity Manager経由でDBから取得したオブジェクトを、そのオブジェクトがEntity Managerの管理下にある状態の時に変更すると、それがDBに反映されるので注意が必要である。 例えば、 User user = entityManager.find(User.class, id); として取得した …

Javaの名前解決のキャッシュ

Javaの名前解決では、以下のようにキャッシュを使っているので、OS(hosts)やDNSで名前解決を変更しても、すぐに反映されるわけではない。 networkaddress.cache.ttl java.securityで指定して、ネーム・サービスからの名前の検索に成功した場合のキャッシング…

Javaのvolatile変数

Javaの「volatile」は、「synchronized の軽量版」という認識しか持っておらず、あまり理解できていない気がしたので、ちょっと調べてみた。マルチスレッド処理において、フィールド変数に volatile を付けると、各スレッドはその変数を参照する際、スレッド…

JavaのインタフェースとC言語のヘッダファイルの共通点

JavaのインタフェースとC言語のヘッダファイル(*.h)は、以下の点で共通点があると思う。 実装クラスや実装ファイルが外部に公開する、定数、メソッド/関数の情報を記載する。 機能を使う側、つまり取り込む側で インタフェースやヘッダファイルの情報(ファ…

Javaの各数値型の最大値・最小値

Javaの各数値型の最大値・最小値で一目で確認できるようにしたかったので、以下のプログラムを作成した。 public class ShowMaxMin { public static void main(String[] args) { System.out.println("Byte Min: " + Byte.MIN_VALUE); System.out.println("By…

JavaでSNMP GetBulk

JavaでSNMP Get Bulk を実行するコードを作ってみた。とりあえずざっと作ってみただけなので、SNMP要求を出すターゲットの情報などはソース中にハードコードしている。 実行すると、localhost上のSNMPエージェントに対して、.1.3.6.1.2.1.1 から数えて20個の…

MessageListenerクラスのonMessageメソッド

JavaのJMS(Java Message Service)の受信側でコールされるMessageListener#onMessage()は、並列して走ることがあるのか調べてみた。 まず、JavaDocを読んでみる。 ・・・the onMessage method is not called with the next message until the session has com…

staticな内部クラス

Javaではクラスの中にクラスを定義することができる。これを内部クラスと言う。この内部クラスを定義する際、staticを付けることができる。今日はどういう時に内部クラスにstaticを付けるべきなのか書く。 結論から言ってしまうと、内部クラスにはstaticを付…

ソースコードを解析する時のコツ

大規模なJavaプログラムのソース(内部仕様書なし)を解析することが多いので、その際に身に付けたソース解析テクニックについて纏めてみる。 マニュアルなどでプログラムの外部仕様を把握しておく これが分かっていないと、ソースを見ても???となってしま…

Javaにおける処理の失敗の伝え方

Javaのメソッド内の処理の失敗を上位に伝える方法として、以下がある。 例外で伝える 戻り値で伝える C言語出身の自分としては、まず「戻り値で伝える」から入ったが、Javaのような例外処理機構を持った言語では例外を使って使っていった方が良いのではない…

Javaの内部の文字コード

Javaの内部の文字コードは UTF-16 である。 http://www.atmarkit.co.jp/ait/articles/0706/21/news129_2.html なので、Javaのプログラムが外部から読み込んだ SJISやUTF-8などの文字列は、JavaのStringオブジェクトになる際に (内部コードである) UTF-16 に…

Javaでスレッドを作成する時の注意点

まず、Javaでスレッドを作成する基本的な方法は、以下の2つである。 Threadクラスを継承したクラスのオブジェクトを生成して、そのオブジェクトのstart()メソッドを実行する。 Runnableインタフェースを実装したクラスのオブジェクトを生成し、それを引数と…

Javaのスタックトレースを解析する時のコツ

フレームワークなどを多用した大規模なJavaプログラムにおいて、エラーが起きてログにスタックトレースが出ると、その量が膨大過ぎてどうやって解析すれば良いのか困ることがある。そんな時に自分が心掛けていることを書く。 まず、アプリケーション独自の部…

メソッド間で変数をやり取りする方法

Javaでメソッド間で変数をやり取りする方法について書く。まずは一覧。 引数で渡す メンバ変数に格納して渡す static変数に格納して渡す シングルトンなクラスのオブジェクトに格納して渡す 以下、それぞれの使いどころと注意点について、少し詳しく説明する…

JavaのExecutorServiceで簡単マルチスレッド

Javaでマルチスレッドなプログラムを書く場合、Java1.5から導入された ExecutorService を使うと簡単に書ける。 以下は ExecutorService を使った簡単なサンプルプログラムである。 import java.util.Date; import java.util.concurrent.Callable; import ja…

Javaでsnmpwalk

Javaでsnmpwalkするソースを作成してみた。ちなみに、snmpwalkとは、内部でsnmp get-next-request を繰り返して、SNMPエージェントからMIBツリー配下のMIBを次々取ること。 SNMPの通信のところを一から作るのは難しいので、snmp4j ライブラリを使用している…

byte型とint型の変換

以前、Javaのbyte型とint型との変換について勉強するために作成したテストコード。 public class TestByte { public static void main(String[] args) { // Test1 byte byteData = (byte) 0xC7; // 11000111 // If there is no "(byte)", 0xC7 is looked as …

バイト列と16進ダンプとの変換

バイト列と16進ダンプ文字列との変換について勉強するために作成したテストコード。 binToHexString()は、バイト配列を16進ダンプ文字列に変換するメソッドで、hexStrToBin()は、その逆を行うメソッドになっている。 public class ChangeBinHex { public sta…

keystoreとtruststore

たびたび目にするJavaのkeystoreとtruststore。よく忘れてしまい、そのたびに調べるので、、ここに概要を書いておく。 keystore:自サーバの証明書(公開鍵を内包)と、それに対応する秘密鍵が入っている。自サーバの証明書が証明書発行局(CA)から配布されたも…