【bash】 ディレクトリ下の全rarファイルをzipに変換する

変換する、というか展開して、zipに固め直します。

#!/bin/sh

for dir in *.rar;
do
    echo $dir
    bn="${dir%.*}"
    echo $bn
    mkdir "${bn}"
    cd "${bn}"
    unrar e "../${dir}"
    cd ..
    zip -r "${bn}".zip ./"${bn}"/
done

展開したファイルは消してません。
unrarとかzipとかは先にインストールしておきましょう。

【kafka】 kafkaの中身が見たいとき

trifectaを使います。

バイナリがあるので、ビルドは必要ありません。

wget https://github.com/ldaniels528/trifecta/releases/download/v0.22.0rc8-0.9.0.1/trifecta-cli-0.22.0rc8b-0.9.0.1.bin.jar
wget https://github.com/ldaniels528/trifecta/releases/download/v0.22.0rc8-0.9.0.1/trifecta-ui-0.22.0rc8b-0.9.0.1.zip
unzip trifecta-ui-0.22.0rc8b-0.9.0.1.zip
cd trifecta-ui-0.22.0rc8b-0.9.0.1/bin/
./trifecta-ui &

設定が必要なら、$HOME/.trifecta/config.properties を適当に編集して./trifecta-ui &を起動し直します。

ブラウザで hostname:9000 にアクセスします。

“Observe”のタブからkafkaの中身を見れます。

【Java】 kafkaStreams.cleanUp(); がstate dirのファイルをうまく消せなくてエラーになる場合

おそらくwindows環境だけの問題です。

        KafkaStreams kafkaStreams = new KafkaStreams(builder.build(), streamsConfiguration);
        kafkaStreams.cleanUp();

の前に

        final File baseDir = new File(streamsConfiguration.get(StreamsConfig.STATE_DIR_CONFIG).toString());
        final File stateDir = new File(baseDir, streamsConfiguration.get(StreamsConfig.APPLICATION_ID_CONFIG).toString());
        //System.out.println(stateDir);
        try {
            FileUtils.deleteDirectory(stateDir);
        } catch (IOException e) {
            System.out.println("delete error");
        }

を突っ込みます。

import org.apache.commons.io.FileUtils; などが必要になります。

【debezium/kafka】 kafkaに外部から繋ぎたいとき

デフォルトだとkafka:9092に外から繋げません(たぶん)。

docker-compose.yamlに

kafka:
    (snip)
    environment:
        ADVERTISED_LISTENERS: "PLAINTEXT://xxx.xxx.xxx.xxx:9092"

xxx.xxx.xxx.xxxに外部から接続したい、ホストのアドレスを入れるとつながるようになります。

上記のようにした場合は、SECURITY_PROTOCOL_CONFIGをPLAINTEXTにして繋ぐのをお忘れなく。

【チェコ/ポーランド】 プラハからクラクフまで列車で移動する

チェコのプラハからポルトガルのポルトに行きたかったのですが、安い飛行機がありません。
ですが、ポーランドのクラクフというところからRyanAirがポルトまで飛んでいて、かなり安いです。
それで、プラハからクラクフまで列車で移動することにしました。

切符は https://www.cd.cz/en/ からかなり前もって購入することができます。
早く購入すると割引になるみたいで、私たちは2人で728Kc(3450円くらい)でした。

EC115列車、10:24プラハ発、17:25クラクフ着でした。

プラハからクラクフに行くEC115列車はボフミンで機関車および客車のワルシャワに行く部分と切り離され、ブダペストから来たEC130列車の機関車と客車に接続されます。
この映像はEC115列車側から見たボフミンでのEC130列車の機関車と客車との接続の場面です。

食堂車がさいこうでした。

プラハを出てすぐに食堂車は満席になってしまうので、早めに行くのがお勧めです。
ハッピーアワーもあり、食事もビールも安なくります。

食堂車のメニューは https://www.jidelnivozy.cz/ から見ることができます。

【ESXi6.5】 VMware Host Client および ssh接続でvmを複製する

vmOSが CentOS 7.6-1810 での例

ESXiは6.5

ESXiにsshログインする

cd /vmfs/volumes/datastore1
mkdir NEW_VM_NAME
cd NEW_VM_NAME
vmkfstools -i "/vmfs/volumes/datastore1/NAME_OF_VM_COPY_FROM/NAME_OF_VM_COPY_FROM_0.vmdk" -d thin "NEW_VM_NAME_0.vmdk"
cp ../NAME_OF_VM_COPY_FROM/NAME_OF_VM_COPY_FROM.vm* .
mv NAME_OF_VM_COPY_FROM.vmx NEW_VM_NAME.vmx
mv NAME_OF_VM_COPY_FROM.vmsd NEW_VM_NAME.vmsd
cp ../NAME_OF_VM_COPY_FROM/NAME_OF_VM_COPY_FROM.nvram NEW_VM_NAME.nvram
sed -i s/NAME_OF_VM_COPY_FROM/NEW_VM_NAME/g NEW_VM_NAME.vmx

データストアブラウザから新機材の.vmxファイルを右クリックし、仮想マシンの登録

ネットワークカードを削除し、また同一のものを作成する(macアドレスが”自動”になってれば不要)

vm起動時、コピーしたのか移動したのか聞かれるので、コピーと答える

vmを起動したら以下のコマンドでホスト名とipアドレスを変更する

vi /etc/hostname
vi /etc/sysconfig/network-scripts/ifcfg-ens192

以上

【CentOS7】 ESXiでrootパーティションの容量を増やす

CentOS 7.6-1810 での例

この方法では、拡張したいパーティションの末尾を変更して拡張するため、fdisk -l とし、当該パーティションが当該ディスクの一番後ろのパーティションであることを確認しておきます。私の環境の場合、/dev/sda2 でした。

確認したら、ESXi側でディスクの容量を増やしておきます。

vmをリブートして、 fdisk /dev/sda とし、拡張したいパーティションを削除し、同じ番号でディスクの最後まで使い切ったパーティションを作成します。pで確認、wで保存するのを忘れずに。

vmをリブートします。

pvresize /dev/sda2
lvextend -l +100%FREE /dev/centos/root
xfs_growfs /dev/mapper/centos-root

と続けて実行します。

以上。

【マレーシア】トレンガヌのカパス島

マレーシア、トレンガヌのカパス島

海が大好きです。
東南アジアをウロウロした結果、私の中で1番の海がマレーシアのトレンガヌにあるカパス島、カパスタートルバレーのプライベートビーチです。
オランダ人のご家族が趣味でやってるみたいなバンガローで、そこのビーチはサンゴがすごいです。
少し潜ると、踏みつけられて死んでしまってるサンゴじゃなくて、元気に生きてて、綺麗な色のサンゴがずっと遠くまで森のように見えます。
小さな色とりどりのお魚はもちろん、タコと魚の食い合いとか、大きなエイとか、魚を追ってるサメとか、自然が豊富すぎて疲れてしまう事もあるので、そういう時は反対側のKBCビーチまで歩きます。
そこは白砂のビーチで、サンゴは少ないですが、白い砂の水中を泳ぎ回る綺麗なお魚が見えます。
サンゴの森の中で見るいろんな生き物もいいし、白い砂の上を泳ぐ魚を見るのもいいし、水温も高くて最高です。
因みにオランダ人の奥さんが作ってくれるご飯は最高に美味しい。
マレーシアではチーズとか高いのに、チーズをふんだんに使って(それもマレーシアで売ってないタイプのだからご自身で持ち込んでるのかな〜??)家庭的な西洋料理作ってもらって、3泊4日ご飯もビールも混みで二人で三万円弱でした。
カパスタートルバレーまた行きます!

【Java】 xmlファイルから設定を読み込む

まずxmlファイル(ここではconfig.xml)を読み込んでおきます。

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse("config.xml");
        Element root = document.getDocumentElement();

単一の設定(Stringで返す)用と、複数の設定(ArrayListで返す)用に、関数を用意します。

    public static String getconfig(Element root, String tag) {
        NodeList nodeList = root.getElementsByTagName(tag);
        Node node = nodeList.item(0);
        String str=node.getTextContent();
        return str;
    }

    public static ArrayList<String> getconfigarr(Element root, String tag) {
        NodeList nodeList = root.getElementsByTagName(tag);
        ArrayList<String> a = new ArrayList<>();
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node node = nodeList.item(i);
            a.add(node.getTextContent());
        }
        return a;
    }

以下のように利用します。

        String filename=getconfig(root,"filename");
        ArrayList<String> fromAddresses = getconfigarr(root,"fromaddress");
        int pictureWidth=Integer.parseInt(getconfig(root,"pictureWidth"));
        boolean debug=Boolean.parseBoolean(getconfig(root,"debug"));

【Java】 swing JFrame マルチディスプレイ環境で特定のディスプレイにウインドウを表示する

https://github.com/BigMarker/deskshare-public/blob/master/jnlp/src/main/java/com/bigmarker/client/deskshare/ScreenCap.java にあった showOnScreen という関数を利用させてもらう。

    private static void showOnScreen(int screen, JFrame frame) {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice[] gd = ge.getScreenDevices();
        if (screen > -1 && screen < gd.length) {
            frame.setLocation(gd[screen].getDefaultConfiguration().getBounds().x, frame.getY());
        } else if (gd.length > 0) {
            frame.setLocation(gd[0].getDefaultConfiguration().getBounds().x, frame.getY());
        } else {
            throw new RuntimeException("No Screens Found");
        }
    }