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

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

海が大好きです。
東南アジアをウロウロした結果、私の中で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");
        }
    }

【Java】swing JFrame ウインドウに画像を表示する ついでに画像をリサイズする

リサイズ後のサイズを pictureWidth, pictureHeight にセットしておく。
イメージのファイル名は filename に。

    JFrame.setDefaultLookAndFeelDecorated(true);
    JFrame frame = new JFrame();
    frame.setLayout(new GridLayout(1, 1));

    BufferedImage img = null;
    img = ImageIO.read(new File(filename));

    Image dimg = img.getScaledInstance(pictureWidth, pictureHeight, Image.SCALE_SMOOTH);

    ImageIcon image;
    image = new ImageIcon(dimg);
    image.getImage().flush();

    JLabel label = new JLabel(image);
    frame.add(label);

    frame.pack();

    frame.setVisible(true);

【Java】 javaでusbカメラ、内蔵カメラを操作する

こちらのライブラリがとても便利です。
https://github.com/sarxos/webcam-capture

使い方はこちら
youtube: Java Webcam Capture for Beginners#1 : Introduction and Capture webcam image with 3 lines of code
https://www.youtube.com/watch?v=2BHyL_XK8YQ

本気で三行から始められます。

キャプチャしてファイルに保存するサンプル
https://github.com/sarxos/webcam-capture/blob/master/webcam-capture/src/example/java/TakePictureExample.java

カメラ映像をライブでウインドウに表示するサンプル
https://github.com/sarxos/webcam-capture/blob/master/webcam-capture/src/example/java/WebcamPanelExample.java


おまけ

webcamの解像度を設定したいとき

        Dimension[] nonStandardResolutions = new Dimension[] {
            WebcamResolution.PAL.getSize(),
            WebcamResolution.HD.getSize(),
            new Dimension(720, 480),
            new Dimension(1280, 720),
            new Dimension(1000, 500),
        };

などとしておいて

        webcam.setCustomViewSizes(nonStandardResolutions);
        webcam.setViewSize(new Dimension(1280, 720));

パネルに出るデバグ情報を消す

        WebcamPanel panel = new WebcamPanel(webcam);
        panel.setFPSDisplayed(false);
        panel.setDisplayDebugInfo(false);
        panel.setImageSizeDisplayed(false);
        panel.setMirrored(false);

2つ以上カメラが接続されてる場合、任意のカメラを操作する
webcamnoに1とか2とか入れて

        List<Webcam> webcams = Webcam.getWebcams();
        //Webcam webcam = Webcam.getDefault();
        Webcam webcam = webcams.get(webcamno); 

RIMOWA OPALのプルタブハンドルを交換する

リモワのOPAL 80CMモデルを長年愛用していますが、プルタブ(サイドハンドル)の根元が割れてしまい、使えなくなってしまいました。

前キャスターの接地する部分もボロボロになってしまい、これはどちらも修理しなければ、ということで、銀座のリモワまで持って行きました。

キャスターは色は変わりましたがごらんの通りすっかり直してもらえました。交換費用は前キャスター二個で5000円くらいでした。

ですが、プルタブ(サイドハンドル)は在庫がないようで、修理を断られてしまいました。
修理不能、ということは自分で直すしかないな…ということになり、良さげなパーツを探しておりますと、amazonでいいのが見つかりました。こちらです。


B Blesiya フライトケース/スピーカーキャビネット用 スプリング式 ドロップハンドル 107.5mmx 81mm

注文して10日くらいで届きました。黒色かと思ったんですが、シルバーのが届きました。
スーツケースに当ててみるとサイズはぴったりです。
このハンドルは作りがとてもしっかりしていて、なかなか良さそうです。
もちろん、もともとのプルタブと同じで、90度でしっかり止まり、またオリジナルのプルタブより強いスプリングで、手を離すとパシッとスーツケースのへこみに収納されます。

ハンドル側の穴は三つ開いているのですが、スーツケースのふた側になってしまう左端の穴は使えません。またもちろん、スーツケース側の同じ位置に穴を開けないと残りの二つの穴も使えません。
最初、スーツケース側に穴を二つ開けて、2カ所で固定すればいいかな、と思ったのですが、たまたま新しい鉄工ドリルがあったので、ハンドル側にもう一個穴を開けて、三点で固定することにしました。
スーツケース側はプラスチックなので、普通のドリルで簡単に穴を開けることができます。

仕上がりはご覧の通りです。あと10年くらいは使えるのではないでしょうか。

【iptables】 CentOS6でkeepalivedが両マスタ(スプリットブレイン)になってしまうのを解消する

CentOS6でkeepalivedを複数台にインストールして、起動して /var/log/messages を見てみたら、各サーバで Entering MASTER STATE になったまま、一向に Entering BACKUP STATE になる気配がない。
ip a コマンドを叩くと各サーバで仮想ipがバインドされてしまっている。

という問題の原因は、おそらく iptables の設定で、VRRPパケットが REJECT されてしまい、VRRPパケットがサーバ間で疏通してないからです。

iptables-save コマンドでiptablesの設定を確認し、 -A INPUT -p vrrp -j ACCEPT-A INPUT -j REJECT ...(--reject-with icmp-host-prohibited とか)より上に入っているようにします。
-A OUTPUT -p vrrp -j ACCEPT も必要です。

具体的には

iptables -D INPUT -j REJECT --reject-with icmp-host-prohibited
iptables -A INPUT -p vrrp -j ACCEPT
iptables -A OUTPUT -p vrrp -j ACCEPT
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited
iptables-save   (設定を表示して確認)

service iptables save   (設定をセーブ)

service iptables restart

という感じになるかと思います。

ちなみにVRRPはプロトコル番号112のIPプロトコルで、UDP(プロトコル番号17),TCP(プロトコル番号6),ICMP(プロトコル番号1) とは別のプロトコルですので、TCPやUDPなどは内部セグメントで全部通してるのになんで疏通しないのかな、と思いがちですね。

【マレーシア】マラッカの美味しくて安いチキンライス

マラッカの美味しくて安いチキンライス

マレーシアのガイドブックなどを見ると必ずチキンライスとかチキンライスボールとか載ってます。
有名どころもいいのかもしれませんが、暑い中で長く行列してたり、観光客価格だったり、日本語メニューがあるようなあざといお店が大嫌いな私たちは、働く地元の方々が昼休憩に食べに来るようなお店を見つけたいとウロウロしてます。
友人宅にいた時、朝八時半にニンニクの香ばしい匂いをプンプンさせてる店を発見しました。と言っても友人宅からは二車線道路、小川、一車線道路を挟んでるのでそれなりの距離です。にもかかわらず、すごくいい香りがするので気になってはいたのですが、別の日に朝ごはんを食べようとフードコートでワンタンミー(これもレベル高いです)食べてて、同じフードコートに入ってるチキンライス屋台のおじさんがそのにんにくの香りの発信源だと気付きました。
チキンは大きな鍋いっぱいの油にまるごと沈めて蓋をしてあげてます。にんにくの匂いははどうやらご飯の方から漂ってきます。
チキンライスは白いご飯(と言ってもココナツの味とかマレーシアの人がよく使ういい香りのするパンダンリーフで香りづけしてある感じ)の事が多いですが、ここのはニンニクとパンダンリーフとダシ(?)が入って茶色です。
お昼になると近所で働く若者や大学生が列をなしてます。しかもよその二倍くらいの肉をのっけても7リンギット(189円)でお腹ぽんぽんでした。

ここに来て四年近く経って初めて美味しいと思えるチキンライスに会えました!

木曜日お休みです。