技術メモ

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

2019-01-01から1年間の記事一覧

perl の正規表現の最小マッチ

perl で、文字列の前後のスペースをトリムする時は、正規表現を利用して、 $str =~ s/^\s*(.*?)\s*$/$1/; というコードを書く。上記の (.*?) の中の「?」が何のために必要なのか、よく忘れてしまうので、ここにメモしておく。結論から言うと、perl の正規表…

深さ優先探索と幅優先探索

深さ優先探索(DFS)と幅優先探索(BFS)について、実装方法をよく忘れてしまうので、ここに簡単な例題を解く際の実装例としてメモしておく。今回は、以下のようなツリーをDFSとBFSで探索することにする。深さ優先探索(DFS)では、以下の順番で探索する。 0 -> 1 …

RHELでホスト名を変更する

これまで、RHELのホスト名を変更する時は、/etc/sysconfig/network ファイルの HOSTNAME 変数を変更して、RHEL上のネットワークサービスを再起動していた。 しかし、先日、RHELのマニュアルを見ていたら、以下の文言を見つけた。 /etc/sysconfig/network フ…

Java で wait() する時は synchronized が必要な理由

Java で wait() を呼ぶ時は、該当スレッドで synchronized していることが必要となる。これをしておかないと、wait() を読んだ時に、IllegalMonitorStateException が発生する。なので、これまでは無条件に synchronized してから wait() していた。 しかし…

Javaのプリミティブ型のラッパーオブジェクトはイミュータブル

整数の入ったリストを加算する場合、普段、以下のようなコードを書いている。 // リストから一個一個取り出して、加算して戻す。 List<Integer> numlist = new ArrayList<>(Arrays.asList(1, 2, 3)); for (int i = 0; i < numlist.size(); i++) { int num = numlist.g</integer>…

Listを走査しながら要素を削除する。

Java で、List を走査しながら要素を削除すると、ConcurrentModificationException が発生することがある。例えば、以下のようなケース。 List<Integer> nums = new ArrayList<>(); nums.add(1); nums.add(2); nums.add(3); nums.add(-1); nums.add(4); nums.add(-2);</integer>…

yaml ファイル内のハイフン

先日、yaml ファイルを扱う機会があった時、 person: - id: 1 name: xxx address: yyy nextItem: zzz と、 person: - id: 1 - name: xxx - address: yyy nextItem: zzz の違いについて理解するのに少し時間がかかったので、ここに纏めておく。Best Online YA…

Java の Map をソートする。

プログラミングの問題を解いていて必要になったので、Javaの Map をソートする方法を以下に纏める。調べてみたところ、いろんな方法があるようだが、自分で試してみてうまくいった方法をここにメモしておく。例えば、以下の map をソートするとする。 Map<Integer, String> ma</integer,>…

SNMPv3のエンジンIDは何に使うのか。

このブログでも何度かSNMPv3のエンジンIDについて書いたが、そもそもエンジンIDが何に使われるのか、ちゃんと調べたことはなかった。 そこで、今回、RFC など調べてみたところ、エンジンID は SNMPv3 通信において、認証や暗号化(復号化)を行う時の鍵として…

Javaで 2つの配列の共通部分を取得する。

競技プログラミングの問題を解いていて必要になったので、Javaで 2つの配列の共通部分を取得するメソッドを作成した。1つ目のメソッドは int 用で、2つ目は String 用。 // 二つの数値の配列のうち、共通する項目を取り出す。 int[] getCommonNumbers (in…

int型の配列に対する Arrays.asList().contains() は、意図通り動作しない。

Java で、int型の配列に特定の値が入っているかどうか確認するために、以下のようなコードを書いたら、意図通りに動かなかった。 int[] intArray = new int[]{0, 1, 2}; if (Arrays.asList(intArray).contains(1)) { System.out.print("Found from intArray"…

指定した桁数の全ての2進数文字列を生成する。

競技プログラミングの問題を解いていて必要になったので、Javaで、指定した桁数の全ての2進数文字列のリストを生成するメソッドを作成した。 List<String> generateZeroOneCombination (int length) { if (length < 1) { throw new IllegalArgumentException("Input </string>…

SNMPのnoSuchNameとnoSuchObject/noSuchInstanceとの違い

主題の件について、簡単に纏める。 どちらも、SNMPエージェント内に対象のMIBが存在しないことを示すものだが、noSuchName はSNMPのエラー・ステータスであり、noSuchObject/noSuchInstance は varbind に入ってくるもの(MIB値)なので、そもそも種類が違うも…

Javaの優先度付きキュー

Javaで複数条件でソートする。 - ITエンジニアの技術メモ で扱った題材を優先度付きキュー PriorityQueue を使って実装してみた。以下のような感じになる。 Queue<Work> queue = new PriorityQueue(Comparator. comparing(Work::getReward, Comparator.reverseOrde</work>…

Javaで複数条件でソートする。

Javaでリストを複数の条件でソートしたい時は、Comparator クラスの comparing() と thenComparing() を使うと簡単に実現できる。例えば、以下の Work クラスのオブジェクトが複数入った List があるとする。 class Work { private int timeToFinish; // 仕…

SNMPのCounterBasedGauge64型について

以前、https://akrad.hatenablog.com/entry/2019/08/21/232701 の記事を書いた後、ネット上で、CounterBasedGauge64 という型があるという情報を見つけた。 「SNMPに Counter64型以外で64bitの範囲の値を表現できる型があるのかな?」と思ったが、さらに調べ…

Javaで Stringの配列中の単語の出現回数をカウントする。

競技プログラミングの問題を解く際の時間短縮のため、主題のメソッドを作成した。 // Stringの配列の中で、単語の出現回数をカウントする。 Map<String, Integer> countWordsAppearance(String[] words) { if (words == null || words.length == 0) { throw new IllegalArgume</string,>…

Javaで配列が昇順 or 降順かを調べる

競技プログラミングの問題を解く際の時間短縮のため、Javaで配列が昇順 or 降順かを調べるメソッドを作成した。配列の要素が一個しかない場合、どう判定しようか迷ったが、そもそも要素が一個しかない場合、このメソッドを使うべきではないので、例外を上げ…

JavaプログラムのCPU使用率高騰

JavaプログラムのCPU使用率が高騰するパターンの一つについて簡単に纏める。 一時的に負荷が上がり、Javaプログラムのメモリ使用量が増大する。 メモリリソースが逼迫し、Javaが不要なメモリを解放するため、GCが頻繁に走るようになる。 GCがCPUリソースを消…

Javaで配列の要素が全て同じか調べる

競プロの問題を解いていて必要になったので、今後の時間短縮のため、主題のメソッドを作成した。 // 配列の要素がすべて同じか調べる boolean isAllSame (int[] array) { if (array == null || array.length == 0) { throw new IllegalArgumentException("In…

Javaで文字列を反転する

競プロの問題を解いていると、文字列の反転が必要になることがある。以前は、文字列 (String) を char 型の配列に toCharArray() で変換し、char 型の配列を反転するロジックを自作してそれを使用し、その後に String.valueOf() で String に戻していた。 し…

Javaで配列中の最大値と2番目に大きい値を取得する。

Javaで、配列中の最大値を取得するメソッドと、2番目に大きい値を取得するメソッドを作成した。Javaにはこれらをする標準メソッドがないようなので、競プロの問題を解く時の時間短縮のため自作した。 // 配列の中の最大値を求める int getMax (int[] array) …

Javaでラムダ式を使ってListのソートを行う。

競技プログラミングで良く使う List のソートについて書く。例えば、以下のクラスのインスタンスを保持する List があって、それを age が若い順(昇順)にソートしたいとする。 class Person { String name; int age; Person(String name, int age) { this.na…

Javaで平方数かどうかを判定する。

Javaで平方数かどうかを判定するメソッドを作成した。 // 平方数かどうかを調べる。 boolean isSquareNumber (int number) { if (number < 0) { throw new IllegalArgumentException("Argument must be 0 and over."); } double sqrtOfNumber = Math.sqrt(nu…

Javaで最大公約数、最小公倍数を求める。

Javaで最大公約数、最小公倍数を求めるメソッドを作成した。引数で受け取った2つの引数の最大公約数、最小公倍数をそれぞれ求めて返す。 // 最大公約数を求める。 int calcGcd(int m, int n) { if (m <= 0 || n <= 0) { throw new IllegalArgumentException(…

Javaで配列のソート

Javaで配列をソートするには Arrays.sort() を使用する。ただ、Arrays.sort() では、プリミティブ型の配列に対しては昇順にしかソートできないので、プリミティブ型の配列を降順でソートするには、一度 Arrays.sort() で昇順にしてから逆順にするなどの手間…

Javaで、組み合わせ、順列、階乗を計算する。

競技プログラミングの問題を解く際、組み合わせ(nCr)、順列(nPr)、階乗(n!) の計算を行うことがちょくちょくあるので、今後の時短のため以下のメソッドを作成した。 // nCr を計算する。 // 計算結果は int max を超えやすいので long 型としている。 // lon…

Javaの整数型の最大値

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

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

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

文字参照を含むファイルを通常の文字列に変換して出力する

html の文字参照を含むファイルを通常の文字列に変換して出力する perl スクリプトを作成した。使い方は、perl "スクリプト名" "文字参照を含むファイル" use strict; use warnings; use HTML::Entities; use Encode; my $file = $ARGV[0]; open(my $in, "< …