覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

sort と uniq で出現回数順にランキング

Linux なんかで、何かしらのコマンドの結果から重複したデータを出力して、
その結果を出現回数順に並べたいというのがまーまーよくあります。

ほぼ、イディオムみたいなもんです。(が、自分は毎日使うわけではなく忘れることがあるのでここにメモしておくことにしました)

やり方は、sortuniq コマンド利用して以下の通りです

{何かしらのコマンド等で重複データを出力した結果} | sort | uniq -c | sort -nr


例えばコマンドで以下のような重複するデータを含むIPアドレス群(例えばWebサーバへのアクセス元のIPアドレス群)が得られた場合

106.73.78.92
171.193.59.149.168
209 207.46.204.192
203 59.106.108.114
105.72.77.110
120 66.249.70.136
120 66.249.70.136
137 78.46.120.35
202 66.249.69.107
107.72.78.97
106 66.249.69.121
105.72.77.110
137 78.46.120.35
129 66.249.69.65
105.72.77.110
120 66.249.70.136
117 66.249.69.131
107.72.78.97
105.72.77.110
106 66.249.69.121

これらに対して先ほどのコマンドを実行すると結果は以下になります(出現回数とIPアドレスが出現回数の降順で表示されます)

   4 105.72.77.110
   3 120 66.249.70.136
   2 137 78.46.120.35
   2 107.72.78.97
   2 106 66.249.69.121
   1 209 207.46.204.192
   1 203 59.106.108.114
   1 202 66.249.69.107
   1 171.193.59.149.168
   1 129 66.249.69.65
   1 117 66.249.69.131
   1 106.73.78.92


このぐらいのコマンドの使い方は記憶しておけよって言われそうですが・・・。

Office365製品の画面がチラつく時の対策

Microsoft の Office製品(Office 2016のみ?)を使っていると、
急にウィンドウ内が白くなってそのウィンドウをクリックしないと実際にそこに書かれている内容が参照できない。
というような チラつき、画面の点滅 のような現象が発生することがあります。

一度発生すると、ずっと発生し続けて相当に面倒な状態になります。(まともに内容が表示されない、画面描画が遅い・・・)
私は、Outlook等 でこの現象に出くわしました。

端末環境にもよると思いますが、私の場合は
ハードウェア グラフィック アクセラレータを無効化することで本現象が発生しなくなりました。


設定手順は、対象製品を起動した上で、
[ファイル] > [オプション] > [詳細設定] > [ハードウェア グラフィック アクセラレータを無効にする] にチェックを入れる。 です。

設定画面は以下のようになっています。

f:id:nini_y:20190810083106p:plain


同じような現象にはまってしまってる人が、これで解消すればよいのですが・・・。

連続した整数の XOR(排他的論理和)

ある連続した整数群の XOR の結果を取得したい。

  • 引数は、MとN の2つの整数
  • M > 0
  • N > M
  • M から N までの連続した整数の XOR を結果として返す
    • 例えば X = 5, N = 8 の場合以下の通り(括弧で括った部分は2進数表現)
      • answer = 5 ^ 6 ^ 7 ^ 8 = (101 ^ 110 ^ 111 ^ 1000) = (011 ^ 1111) = (1100) = 12


愚直にやるなら以下の通りです。

public class Solution1 {

    public static int solution(int M, int N) {
        return xors(M, N);
    }

    public static int xors(int M, int N) {
        int value = M;
        for (int i = M; i < N; i++) {
            value = value ^ (i + 1);
        }
        return value;
    }
}


ただし、以下のコードでもいけるっぽい。

public class Solution2 {

    public static int solution(int M, int N) {
        return xORTrick(N) ^ xORTrick(M - 1);
    }

    private static int xORTrick(int n) {
        if (n % 4 == 0) {
            return n;
        }

        if (n % 4 == 1) {
            return 1;
        }

        if (n % 4 == 2) {
            return n + 1;
        }

        return 0;
    }
}

いけるっぽいと書いてるのは、私がコードの内容を理解してないからです・・・。
理解してないもの載せるのもどうかとは思いつつも、載せちゃいました(汗)。
(後者の方が圧倒的に高速に動作します)

LeetCode - Maximum Depth of N-ary Tree

LeetCode の Maximum Depth of N-ary Tree を解いてみます。

問題の概要

  • インプット(引数)
    • N個のNodeを持つツリー
  • アウトプット(引数)
    • ツリーの中の中の最大の深さ
    • 最大の深さ = root Nodeから最も遠いリーフNodeまでの最長パス上のNodeの数


ツリーの各Nodeを表現するクラスは以下のように定義されています

import java.util.List;

class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
}


答え

各リーフNode(childが存在しない)まで再帰的に探索して深さを導いて、その最大値を返します。

class Solution {
    public int maxDepth(Node root) {
        if (root == null) {
            return 0;
        }

        int max = 0;
        for (Node child : root.children) {
            max = Math.max(max, maxDepth(child));
        }
        return 1 + max;
    }
}

LeetCode - Reverse String

LeetCode の Reverse String を解いてみます。

問題の概要

  • インプット(引数)
    • charの配列
      • 例:[’h’, 'e', 'l', 'l', 'o']
  • アウトプット(引数)
    • 引数で与えられた配列を逆順にします。アウトプットは戻り値で返すのではなく、引数の配列の内容を逆順にします
    • 例にあげた引数の場合、['o', 'l', 'l', 'e' , 'h'] がアウトプットになります
  • 補足
    • 答えを求めるために新しい配列をallocate(生成)しないでくださいと書いてあります


答え

特に小細工もなく、配列の先頭から順に対応するindex同士の要素をswapするようにしています。
配列の中心位置まで進めば全て入れ替わって、逆順になっていることになります。

class Solution {
    public void reverseString(char[] s) {        
        if (s.length <= 1) {
            return;
        }
        
        int lastIndex = s.length - 1;

        char temp;
        for (int i = 0; i < s.length / 2; i++) {
            temp = s[i];
            s[i] = s[lastIndex - i];
            s[lastIndex - i] = temp;
        }
    }
}

特に難しさも無いのかなというイメージです。
理由は不明ですがこの問題の評価あんまり高くないです。