メモの日々


2004年09月08日(水)

  • 加藤あいと鈴木杏樹がちょっと似てた。

[dev][java] Sun Enterprise Newsより

いくつかなんとなくメモ。要会員登録。

JFluid は、Sun の研究機関である Sun Labs にて開発されたツールです。もともとは実験的なプロジェクトでしたが、JFluid のプロファイリング機能の実現を望む声が多くありました。そのため現在、JFluidで提供されている機能がオープンソースの開発ツール Netbeans にて統合される予定となっています。

[windows] 「Port Reporter ツールの概要と入手方法」 (マイクロソフト)

Port Reporter ツールは Windows Server 2003、Windows XP、および Windows 2000 を実行しているコンピュータ上のサービスとして動作し、TCP ポートおよび UDP ポートの動作状況をログに記録します。

JPCERT/CC REPORTより。

[tdiary] 「ReferrerSPAM」 (HSBT Hiki)

tDiaryでのReferer spam対策がまとめられている。tDiary-users-talk MLより。

[link] 「Perfect Suit FActory」

スーツを買えるオンラインストアがあったのでメモ。

アフィリエイトもやっているようだから広告表示してみようかな。でもおれのサイトから辿って洋服を買う人なんかいないか。

やること

  • プリンタ処分
  • リンク元のスリム化
  • 蛍光灯の紐

2008年09月08日(月)

  • 何もやる気にならず週末ずっとゴロゴロしてしまった。これはいかんよ。掃除しないと。
  • 外出したとしても雷ゴロゴロで大変だったけどな。
  • ずっと忙しい。才能なーい。
  • ずっと健康だったが昨日から体調不良気味。最近暑かったり寒かったりするからなあ。

[java][net] JavaでIPv4とIPv6の判別

文字列で与えられたIPアドレスがIPv4なのかIPv6なのかを判別したいとき、Javaではどう書けばいいのか。

InetAddress#getByName()の戻り値をinstanceofでチェックする方法しか思いつかなかった。次のテストは成功したのでメモ。

import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import static org.junit.Assert.*;
import org.junit.Test;

public class InetAddressTest {
    @Test
    public void v4test() throws Exception {
        InetAddress address = InetAddress.getByName("192.0.2.10");
        assertTrue(address instanceof Inet4Address);
    }

    @Test
    public void v6test() throws Exception {
        InetAddress address = InetAddress.getByName("2001:DB8::10");
        assertTrue(address instanceof Inet6Address);
    }
}

2009年09月08日(火)

[life] コンタクトレンズを紛失した

コンタクトを装着しようとしたらケースに片方のレンズがセットされていないことに気づいた。ケースから出すときに飛ばしちゃったのかと思って周りを探したけれど見つからない。無い。

昨日外して仕舞うときに無くしちゃったのかも。もう何年も使ったものなので諦めはつく。でもコンタクトがないと不便だし、新調するの面倒だなあ。

[life] コンタクトレンズあった

家に帰ってコンタクトのケースをもう一度調べたら、片側に2枚のレンズが重なって入っていることに気づいた。

昼間もそれを疑って調べはしたのだけれど、そんなことありえないと思ってきちんと調べられていなかったみたい。2枚のレンズがぴったりとくっついていたのだ。

仕舞うときに間違えたんだろうなあ。もっと集中して生活しないといかん。

レンズに傷がついていないか心配だけれど、明日試してみる。


2013年09月08日(日)

[java] java.util.PropertiesでWindowsのパス表記をエスケープせずに読み込みたい

問題点

Javaのプログラムで

path = C:\aaa\bbb bbb\あああ\ccc

とWindowsのパス表記で書いたファイルを次のコードのようにしてjava.util.Properties#load()を使って読み込むと、

C:aaabbb bbbあああccc

とバックスラッシュが削除されてしまう。

import java.io.IOException;
import java.io.Reader;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Properties;

public class PropertiesでのWindowsパス表記読込 {
    public static void main(String[] args) throws IOException {
        try (Reader r = Files.newBufferedReader(
                Paths.get("test.properties"), Charset.forName("UTF-8"))) {
            Properties p = new Properties();
            p.load(r);
            System.out.println(p.getProperty("path"));
        }
    }
}

こうなるのは、load()メソッドが

このメソッドは、無効なエスケープ文字の前のバックスラッシュ文字 \ をエラーとして処理しない。バックスラッシュは自動的に削除される。

という仕様だから。

この問題はパス区切りのバックスラッシュを2つ重ねて書くかバックスラッシュの代わりにスラッシュを使うようにすれば解決されるんだけど、この対処は面倒だ。そんなことせずにそのまま読み込みたい。

そもそもPropertiesクラスがバックスラッシュを特別扱いする機能って必要なのかな?なんでこんな仕様なんだっけ…

バックスラッシュを二重化するフィルタを挟んで対処してみる

バックスラッシュを特別扱いする機能は要らない(バックスラッシュは単にバックスラッシュとして解釈すればよい)ので、ファイル内の「\」を「\\」に変換するフィルタを作ってそれを挟んで読み込むようにしたらどうだろうか。

import java.io.FilterReader;
import java.io.IOException;
import java.io.Reader;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Properties;

public class PropertiesでのWindowsパス表記読込2 {
    public static void main(String[] args) throws IOException {
        try (Reader r = new Backslash二重化フィルタ(Files.newBufferedReader(
                Paths.get("test.properties"), Charset.forName("UTF-8")))) {
            Properties p = new Properties();
            p.load(r);
            System.out.println(p.getProperty("path"));
        }
    }
}

class Backslash二重化フィルタ extends FilterReader {
    private boolean inInBackslash = false;

    public Backslash二重化フィルタ(Reader r) { super(r); }

    @Override
    public int read() throws IOException {
        synchronized (lock) { return read1(); }
    }

    @Override
    public int read(char[] cbuf, int off, int len) throws IOException {
        if (len <= 0) return 0;
        int result = 0;
        synchronized (lock) {
            for (int i = 0; i < len; ++i) {
                int c = read1();
                if (c < 0) break;
                cbuf[off + i] = (char)c;
                ++result;
            }
        }
        return result == 0 ? -1 : result;
    }

    @Override
    public long skip(long n) throws IOException {
        throw new IOException("not supported");
    }

    @Override
    public boolean ready() throws IOException { return inInBackslash; }

    @Override
    public boolean markSupported() { return false; }

    @Override
    public void mark(int readAheadLimit) throws IOException {
        throw new IOException("not supported");
    }

    @Override
    public void reset() throws IOException {
        throw new IOException("not supported");
    }

    private int read1() throws IOException {
        if (inInBackslash) {
            inInBackslash = false;
            return '\\';
        }
        int result = super.read();
        if (result == '\\') inInBackslash = true;
        return result;
    }
}

このプログラムを動かすと、

C:\aaa\bbb bbb\あああ\ccc

とファイルに書いた文字列がそのまま表示された。OKOK。

こういう対処は見かけないけれど、何か問題あるかな?