2009-12-04

Windows バッチファイル : 待ち時間を設定したい


Windows バッチファイルで待ち時間を設定したい



ping localhost -n 1




メモ
1 秒待機。
環境によっては sleep コマンドとか言うのがあるらしい。




環境
Microsoft Windows [Version 5.2.3790]
(C) Copyright 1985-2003 Microsoft Corp.

2009-08-24

Java : 自然比較メソッドを実装したい


Java で自然比較メソッドを実装したい



import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main1 {

    public static void main(String[] args) {
        Main1.sample1();
    }

    public static void sample1() {
        List<FooInfo> list = createSample1List();
        System.out.println("before");
        for (FooInfo info : list) {
            System.out.println(info.toString());
        }
        Collections.sort(list);
        System.out.println("after");
        for (FooInfo info : list) {
            System.out.println(info.toString());
        }
    }

    private static List<FooInfo> createSample1List() {
        List<FooInfo> list = new ArrayList<FooInfo>();
        FooInfo info = null;

        info = new FooInfo();
        info.set("5", "A");
        list.add(info);

        info = new FooInfo();
        info.set("1", "B");
        list.add(info);

        info = new FooInfo();
        info.set("3", "C");
        list.add(info);

        info = new FooInfo();
        info.set("4", "D");
        list.add(info);

        info = new FooInfo();
        info.set("2", "E");
        list.add(info);

        return list;
    }
}

public class FooInfo implements Comparable {

    private String code;
    private String name;
    
    public FooInfo() {
    }

    public void set(String code, String name) {
        this.code = code;
        this.name = name;
    }

    public String getCode() {
        return code;
    }

    public String getName() {
        return name;
    }

    public int compareTo(FooInfo obj) {
         return getCode().compareTo(obj.getCode());
     }

    @Override
    public String toString() {
        return "code=[" + code + "],name=[" + name + "]";
    }
}



Oracle JDeveloper 11g 11.1.1.0.2
コンパイラ Javac
JavaSE JDev にくっついてくるやる(デフォルト 1.6.0_05)



で、ビルドしてみる。


Error(xx):  警告:[unchecked] 無検査メソッド呼び出し: java.util.Collections の <T>sort(java.util.List<T>) は (java.util.List<FooInfo>) に適用されます。



なんて出てた。警告なのに、エラー ... 。画面上、特に警告文ない。因みにコンパイラを Ojc にすると、問題ない。以前のバージョンだと警告が出ただけな気がする。
IDE 使わずに Javac でコンパイルすると警告だけ出た。

型の問題?カタカタ。

何かあったら eclipse (違。
eclipse を立ち上げてみる。


eclipse-SDK-3.3.1.1-win32
jdk 1.6.0_06



ビルドすると警告だけ出た。
ソースの画面を眺める。


public class FooInfo implements Comparable {

Comparable is a raw type. References to generic type Comparable<T> should be parameterized



の「Comparable」ところで警告が出てた。それと。


Collections.sort(list);

Type safety: Unchecked invocation sort(List<FooInfo>) of the generic method sort(List<T>) of type Collections



ああ。そういうこと。
FooInfo クラスをごにょごにょ。


public class FooInfo implements Comparable<FooInfo> {

    private String code;
    private String name;
    
    public FooInfo() {
    }

    public void set(String code, String name) {
        this.code = code;
        this.name = name;
    }

    public String getCode() {
        return code;
    }

    public String getName() {
        return name;
    }

    public int compareTo(FooInfo obj) {
         return getCode().compareTo(obj.getCode());
     }

    @Override
    public String toString() {
        return "code=[" + code + "],name=[" + name + "]";
    }
}



警告も出なくなった。
そして、うっすらとへこんだ。

2009-07-15

Java : 参照渡しのメモ


Class1.java
import java.util.ArrayList;
import java.util.List;

public class Class1 {

    public static void main(String[] args) {
      Class1.sample1();
      Class1.sample2();
      Class1.sample3();
    }

    private static void sample1() {
      System.out.println("sample 1 ");

      List<Info> listA = new ArrayList<Info>();
      for (int i=0; i<4; i++) {
        Info info = new Info();
        info.init("id_" + Integer.toString(i), "name_" + Integer.toString(i));
        listA.add(info);
      }
      List<Info> listB = new ArrayList<Info>(listA);
        
      print(listA, listB);
    }

    private static void sample2() {
        System.out.println("sample 2 ");

        List<Info> listA = new ArrayList<Info>();
        for (int i=0; i<4; i++) {
            Info info = new Info();
            info.init("id_" + Integer.toString(i), "name_" + Integer.toString(i));
            listA.add(info);
        }
        List<Info> listB = (ArrayList<Info>) ((ArrayList<Info>) listA).clone();

      print(listA, listB);
    }

    private static void sample3() {
      System.out.println("sample 3 ");

        List<Info> listA = new ArrayList<Info>() {
            @Override
            public Object clone() {
                List<Info> list = new ArrayList<Info>();
                for (Info info : this) {
                    list.add(info.clone());
                }
                return list;
            }
        };
      for (int i=0; i<4; i++) {
        Info info = new Info();
        info.init("id_" + Integer.toString(i), "name_" + Integer.toString(i));
        listA.add(info);
      }
      List<Info> listB = (ArrayList<Info>) ((ArrayList<Info>) listA).clone();

      print(listA, listB);
    }

    private static void print(List<Info> listA, List<Info> listB) {
      System.out.println("list A : " + listA.toString());
      System.out.println("list B : " + listB.toString());
    }
}


Info.java
public class Info implements Cloneable {

    private String id;
    private String name;

    public Info() {
    }

    public void init(String i, String n) {
        this.id = i;
        this.name = n;
    }

    public Info clone() {
        Info newInfo = new Info();
        newInfo.init(this.id, this.name);
        return newInfo;
    }
}


実行結果
sample 1 
list A : [Info@1bc4459, Info@12b6651, Info@4a5ab2, Info@1888759]
list B : [Info@1bc4459, Info@12b6651, Info@4a5ab2, Info@1888759]
sample 2 
list A : [Info@6e1408, Info@e53108, Info@f62373, Info@19189e1]
list B : [Info@6e1408, Info@e53108, Info@f62373, Info@19189e1]
sample 3 
list A : [Info@7c6768, Info@1690726, Info@5483cd, Info@9931f5]
list B : [Info@19ee1ac, Info@1f1fba0, Info@1befab0, Info@13c5982]




うへぇ。 sample3 は実用的ではないね。
しかし、 java.util.ArrayList#clone() では java.lang.CloneNotSupportedException は発生しないのか。



環境
java : jdk160_05(JDev11g 付属)
OS : Windows XP Pro sp2

2009-06-24

keepalived のインストール

 
keepalived-1.1.17.tar.gz
cd /usr/local/src
wget http://www.keepalived.org/software/keepalived-1.1.17.tar.gz
tar zxvfl ./keepalived-1.1.17.tar.gz
cd /usr/local/src/keepalived-1.1.17
./configure
make
make install



備考

最初は RedHat にインストールされていたぽい OpenSSL を使って configure してみたら下記のエラーがでた。

checking openssl/ssl.h usability... no
checking openssl/ssl.h presence... no
checking for openssl/ssl.h... no
configure: error:
!!! OpenSSL is not properly installed on your system. !!!
!!! Can not include OpenSSL headers files. !!!

openssl-0.9.8i.tar.gz を make までしたのがあったので、 シンボリックリンクとやらで /usr/local/include/openssl なんかをごにょごにょしてみた。
うん。うまくいった。
OpenSSL だけのパスはきれないぽい。


Forums の書き込みにこんなのがあったので違う OpenSSL 使ってみたのだ。

On RedHat systems, OpenSSL lib install is a little broken. So I would recommand removing any other previous OpenSSL release and re-instal using the openssl.org tarball. (and all the include libs must be configured : /usr/include/openssl, and lib and shared lib).


少し壊れてるってどういうこと?詳しいことは ... いいや。
それより、今はこいつがナニモノなのかわからずにインストールしていることの方が ... (ry。



環境
cat /etc/redhat-release
Red Hat Linux release 9 (Shrike)

 

2009-06-23

Java : Process を使ってコマンドを実行したい


Java で Process を使ってコマンドを実行したい ... とか思ってはいない



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;


public class Sample {

    public static void main(String[] args) {
        execute1("ipconfig");
        execute2("ipconfig");
    }

    private static void execute1(String command) {
        System.out.println("::: ProcessBuilder :::::");
        Process p = null;
        try {
            p = new ProcessBuilder(command).start(); 
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (p == null) {
            return ;
        }
        InputStream is = p.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String line = null;
        try {
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (is != null) {
                try { is.close(); } catch (IOException e) {}
            }
            if (p != null) {
                p.destroy();
            }
        }
    }

    private static void execute2(String command) {
        System.out.println("::: Runtime :::::");
        Runtime r = Runtime.getRuntime();
        Process p = null;
        try {
            p = r.exec(command);
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (p == null) {
            return ;
        }
        InputStream is = p.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String line = null;
        try {
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (is != null) {
                try { is.close(); } catch (IOException e) {}
            }
            if (p != null) {
                p.destroy();
            }
        }
    }
}



ぐだぐだ。
こんなことしたかったんじゃないんだ。



環境
java : jdk160_05(JDev11g 付属)
OS : Windows XP Pro sp2

Java : あるアドレスに到達可能かどうかをテストしたい


Java であるアドレスに到達可能かどうかをテストしたい



import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class Sample {

   public static void main(String[] args) {
       System.out.println("結果 : " + ping("www.exsample.com"));
       System.out.println("結果 : " + ping("www.google.co.jp"));
       System.out.println("結果 : " + ping("www.yahoo.co.jp"));
   }

   private static boolean ping(String host) {
       final int timeout = 5 * 1000;        // 5 秒
       InetAddress address = null;
       try {
           address = InetAddress.getByName(host);
       } catch (UnknownHostException e) {
           System.err.println(e.toString());
       }
       if (address == null) {
           return false;
       }
       System.out.println("ping : " + address.getHostName() + " [" + address.getHostAddress() + "]");
       boolean retval = false;
       try {
           retval = address.isReachable(timeout);
       } catch (IOException e) {
           System.err.println(e.toString());
       }
       return retval;
   }
}

簡単に書いたら下記の通り。
InetAddress.getByName(host).isReachable(timeout);




メモ
コマンドラインから ping を実行するとすべて true が返ってきた。
Windows で実行すると exsample は true が google、yahoo は false が返ってきた。
CentOS で実行するとすべて true が返ってきた。
※ それ以上は調べてない。



参考



環境 1
java : jdk160_05(JDev11g 付属)
OS : Windows XP Pro sp2


環境 2
java : jdk1.6.0_04
OS : CentOS 5.x

2009-06-18

特定のネットワークのトラフィックのダンプを出力したい

 
特定のネットワークのトラフィックのダンプを出力したい



tcpdump -n -i [interface] host [host] -w [file]

tcpdump のオプション(一部のみ)
  • -x : すべてのパケットを 16 進数で表示する
  • -n : アドレスを名前に変換しない
  • -i [interface] : 指定したインタフェースを監視する
  • host [host] : ホストと一致するパケットのみ監視する
  • -w [file] : ファイルに出力する



出力したダンプを読みたい



tcpdump -r [file]

tcpdump のオプション(一部のみ)
  • -r [file] : パケットを -w オプションで作成したファイルから読み込む



メモ
man tcpdump




環境
#cat /etc/redhat-release
CentOS release 5 (Final)

 

2009-06-12

Java : マシン上のネットワークインタフェース名を取得したい


Java でマシン上のネットワークインタフェース名を取得したい



import java.net.*;
import java.util.*;

public class Sample {
   public static void main(String[] args) {
       try {
           Enumeration nis = NetworkInterface.getNetworkInterfaces();
           while (nis.hasMoreElements()) {
               NetworkInterface ni = nis.nextElement();
               System.out.println("Name : " + ni.getName());
           }
       } catch (SocketException e) {
           e.printStackTrace();
       }
   }
}




参考



環境 1
java : jdk160_05(JDev11g 付属)
OS : Windows XP Pro sp2


環境 2
java : jdk1.6.0_04
OS : CentOS 5.x

2009-06-01

vsftpd のインストール

 
vsftpd-1.1.3.tar.gz
cd /usr/local/src
wget ftp://vsftpd.beasts.org/users/cevans/vsftpd-1.1.3.tar.gz
tar zxvfl ./vsftpd-1.1.3.tar.gz
cd /usr/local/src/vsftpd-1.1.3
make
make install



備考

先に vsftpd-2.1.1.tar.gz を make したら下記のエラーがでた。
sysdeputil.c: 関数 `vsf_sysutil_fork_isolate_failok' 内:
sysdeputil.c:1243: `__NR_clone' が宣言されていません (この関数内で最初に利用)
sysdeputil.c:1243: (未宣言の各変数については、それが最初に現われたそれぞれの関数
sysdeputil.c:1243: に対して一度だけ報告されます。)
sysdeputil.c:1244: `errno' が宣言されていません (この関数内で最初に利用)
sysdeputil.c:1244: `EINVAL' が宣言されていません (この関数内で最初に利用)
sysdeputil.c: 関数 `vsf_sysutil_getpid_nocache' 内:
sysdeputil.c:1261: `__NR_getpid' が宣言されていません (この関数内で最初に利用)
make: *** [sysdeputil.o] エラー 1

vsftpd-2.1.0.tar.gz を make したら別のファイルでエラーがでた。
これかなぁ。

Q) Help! vsftpd doesn't build, it complains about problems with incomplete types in sysutil.c.
A) Your system probably doesn't have IPv6 support. Either use a more modern system, use an older vsftpd (e.g. v1.1.3), or wait for a version of vsftpd without this problem!


v1.1.3 で問題ない ... というか rpm パッケージをインストールしてもらったのでどうでもよくなった。
ので、以下略。



環境
cat /etc/redhat-release
Red Hat Linux release 9 (Shrike)

 

2009-05-19

特定のIPアドレス+ポート番号だけアクセスを許可したい

 
特定のIPアドレス+ポート番号だけアクセスを許可したい



iptables -A INPUT -s [address] -p tcp --dport [port] -j ACCEPT

iptables のオプション(一部のみ)
  • -A : 追加
  • -D : 削除
  • --dport [port] : 自分へのアクセスを許可するポート
  • --sport : 自分が他へアクセス後に、アクセス先からのアクセスを許可するポート




そのうち iptables を使えれるやうになる ... なりたい。



環境
#cat /etc/redhat-release
CentOS release 5 (Final)

 

2009-05-12

tinc のインストール

 
tinc-1.0.9.tar.gz
cd /usr/local/src
wget http://www.tinc-vpn.org/packages/tinc-1.0.9.tar.gz
tar -zxvf tinc-1.0.9.tar.gz
cd /usr/local/src/tinc-1.0.9
make
make install



備考
  • tinc
  • OpenSSL, zlib, lzo くらいは事前にインストールされていること



環境
#cat /etc/redhat-release
CentOS release 5 (Final)

 

CMake のインストール

 
cmake-2.6.4.tar.gz
cd /usr/local/src
wget http://www.cmake.org/files/v2.6/cmake-2.6.4.tar.gz
tar -zxvf cmake-2.6.4.tar.gz
cd /usr/local/src/cmake-2.6.4
./bootstrap --prefix=/usr/local
make
make install



備考



環境
#cat /etc/redhat-release
CentOS release 5 (Final)

 

GnuTLS のインストール

 
gnutls-2.6.6.tar.bz2
cd /usr/local/src
wget ftp://ftp.gnupg.org/gcrypt/gnutls/gnutls-2.6.6.tar.bz2
tar -jxvf gnutls-2.6.6.tar.bz2
cd /usr/local/src/gnutls-2.6.6
./configure --prefix=/usr/local
make
make install



備考

gnutls-2.6.6 + libcrypt-1.2.4 ではコンパイルエラーがでた。
mac-libgcrypt.c:123: error: 'GCRY_MD_SHA224' undeclared (first use in this function)

該当箇所をコメントアウトしてコンパイルすれば問題なさ気なのだけれどもそれはどうかわからない。
gnutls-2.6.6 + libcrypt-1.4.4 だと問題ない。



環境
#cat /etc/redhat-release
CentOS release 5 (Final)

 

libgcrypt のインストール

 
libgcrypt-1.2.4.tar.gz
cd /usr/local/src
wget ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.2.4.tar.gz
tar -zxvf libgcrypt-1.4.4.tar.gz
cd /usr/local/src/libgcrypt-1.4.4
./configure --prefix=/usr/local
make
make install



備考
  • libgpg-error くらいは事前にインストールされていること
  • libgcryptlibmcrypt はベツモノ!
  • 諸事情により libgcrypt-1.2.4 をインストール
  • たぶん libgcrypt-1.4.4 の方がよいに違いない



環境
#cat /etc/redhat-release
CentOS release 5 (Final)

 

libgpg-error のインストール

 
libgpg-error-1.7.tar.gz
cd /usr/local/src
wget ftp://ftp.gnupg.org/gcrypt/libgpg-error/libgpg-error-1.7.tar.gz
tar -zxvf libgpg-error-1.7.tar.gz
cd /usr/local/src/libgpg-error-1.7
./configure --prefix=/usr/local
make
make install



備考

TODO


環境
#cat /etc/redhat-release
CentOS release 5 (Final)

 

lzo のインストール

 
lzo-2.03.tar.gz
cd /usr/local/src
wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.03.tar.gz
tar -zxvf lzo-2.03.tar.gz
cd /usr/local/src/lzo-2.03
./configure --prefix=/usr/local
make
make install



備考



環境
#cat /etc/redhat-release
CentOS release 5 (Final)

 

zlib のインストール

 
zlib-1.2.3.tar.gz
cd /usr/local/src
wget http://www.zlib.net/zlib-1.2.3.tar.gz
tar -zxvf zlib-1.2.3.tar.gz
cd /usr/local/src/zlib-1.2.3/
./configure --prefix=/usr/local
make
make install



備考



環境
#cat /etc/redhat-release
CentOS release 5 (Final)

 

OpenSSL のインストール

 
openssl-0.9.8k.tar.gz
cd /usr/local/src
wget http://www.openssl.org/source/openssl-0.9.8k.tar.gz
tar -zxvf openssl-0.9.8k.tar.gz
cd /usr/local/src/openssl-0.9.8k
./config --prefix=/usr/local
make
make install



備考



環境
#cat /etc/redhat-release
CentOS release 5 (Final)

 

2009-05-07

VPN いろいろ

 
めもめも。



GPL

CIPE
  • サポート:Linux, Windows NT/2000

CloudVPN
  • サポート:Linux, FreeBSD, OpenBSD, Windows

L2gvpn
  • サポート:Linux, FreeBSD ( MacOSX, Win32 も? )

n2n
  • サポート:Unix (including Linux, *BSD, Solaris, and MacOSX), Win32 (Win95 and above including Vista)

OpenVPN

Openswan

PPTP ( PPTP Client, Poptop )

SSL-Explorer
  • ※ 2008-11-17 Barracuda Networks に買収

Social VPN
  • サポート:Linux, Windows
  • システム必要条件:Microsoft .NET Framework 2.0

tinc
  • サポート:Linux, FreeBSD, OpenBSD, NetBSD, MacOSX, Solaris, Windows 2000/XP

UltraVPN
  • サポート:MacOSX, Windows

VTun




GPL 以外

Hamachi
PacketiX VPN 2.0 (SoftEther 1.0 の後継)
TinyVPN
WallCooler VPN



参考
 

2009-04-20

プロセスの使用メモリを確認したい

 
プロセスの使用メモリを確認したい



ps alx

ps のオプション(一部のみ)
  • a : すべてのユーザが実行中のプロセスを表示する
  • l : 詳細を表示する
  • x : ユーザが実行せずに実行中のプロセスを表示する
ps の表示項目(一部のみ)
  • VSZ : 仮想メモリのサイズ
  • RSS : 使用中の物理メモリのサイズ


top -p pid [,pid ...]

top のオプション(一部のみ)
  • -p : PID を指定して監視する(20個まで?)
top の表示項目(一部のみ)
  • %CPU : CPU 使用率
  • %MEN : メモリ使用率
  • VIRT : タスクが使用中の仮想メモリのサイズ
  • SWAP : スワップされたサイズ
  • RES : タスクが使用中の物理メモリのサイズ(RES = VIRT - SWAP)



メモ
  • [ps] オプションが「l」と「-l」のときで表示される項目が異った
  • [ps] SystemV 系のオプションは異なるらしい
  • [top] 動的



環境
#cat /etc/redhat-release
CentOS release 5 (Final)




参考


 

ポート情報を確認したい

 
ポート情報を確認したい



netstat -anp

netstat のオプション(一部のみ)
  • a : すべてのソケットを表示する
  • l : listen しているソケットを表示する
  • n : 名前解決を行わない
  • p : ポートをオープンしたサービスの PID を表示する


lsof -i -n

lsof のオプション(一部のみ)
  • i : IPv[46] を表示する
  • n : 名前解決を行わない




メモ
nmap とかいうのをインストールしてみたらよいのかもしれない。



環境
#cat /etc/redhat-release
CentOS release 5 (Final)




参考

 

2009-04-15

Windows バッチファイル : 改行を出力したい


Windows バッチファイルで改行を出力したい

詳細
  • foo.txt に出力する



@echo off

echo;> foo.txt




メモ
@echo off

echo; > foo.txt

こう書くと「半角スペース+改行」になった。



環境
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

2009-04-09

Windows バッチファイル : テキストファイルからある文字列を検索したい


Windows バッチファイルでテキスト・ファイルから文字列を検索したい。

詳細
  • sample.txt に「foo boo」と一致する文字があるか検索する
  • 一致した文字列は出力しない
  • 一致した場合は「一致」、一致しなかった場合は「不一致」をコンソールに表示する



@echo off

FINDSTR /c:"foo boo" sample.txt > NUL
IF %ERRORLEVEL% EQU 0 (
   echo 一致
) ELSE (
   echo 不一致
)




環境
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.




参考

Windows バッチファイル : ファイルの内容を読み込みたい


Windows バッチファイルでファイルの内容を読み込みたい。
一行ずつ読み込んだデータをコンソールに出力してみる。



@echo off

FOR /F "delims=" %%a IN (sample.txt) DO (
   @ECHO %%a
)

※ delims オプションは区切り文字を設定
※ 既定の区切り文字はスペース(半角・全角)とタブ



下記を追加してみる。
詳細
  • sample.txt のデータは半角カンマ区切りで作成する
  • 各行の 1 番目と 3 番目のトークンを出力する



@echo off

FOR /F "tokens=1,3 delims=," %%a IN (sample.txt) DO (
   @ECHO %%a %%b
)

※ %a は for 文で明示的に宣言される
※ %b は takens オプションで暗黙的に宣言される



環境
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.



関連

任意の項目数の CSV ファイルの内容を読み込んで、その項目を処理する必要に迫られたので
 → Windows バッチファイル : 任意の項目数の CSV ファイルの内容を読み込みたい

2009-04-08

Windows バッチファイル : プログラムが正常終了したかどうかを判断したい


Windows バッチファイルで実行しているプログラムが正常終了したかどうかを判断したい。



@echo off

"C:\work\sample.exe"
IF %ERRORLEVEL% EQU 0 (
   echo OK
) ELSE (
   echo NG
)




とかやってみたけど C:\work\sample.exe が正常終了時に終了コードを「0」、異常終了時は「0 以外」とかを戻していないと意味がない。(正常・異常ともに終了コードが「0」だと判断できない)。



メモ
比較演算子
  • EQU - 等しい
  • NEQ - 等しくない
  • LSS - より小さい
  • LEQ - 以下
  • GTR - より大きい
  • GEQ - 以上




環境
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.




参考

Windows バッチファイル : 指定したファイルが存在しない場合は、処理を途中で終わりたい


Windows バッチファイルで指定したファイルが存在しない場合は、処理を途中で終わりたい。



@echo off

IF NOT EXIST "C:\work\sample.txt" (
    echo ファイルが存在しません.処理を終了します.
    GOTO :EOF
)

echo 後続の処理を続けます.

※ 「GOTO :EOF」はコマンド拡張機能


@echo off

IF NOT EXIST "C:\work\sample.txt" (
    GOTO :FILE_NOT_FOUND
)

echo 後続の処理を続けます.

GOTO :END

:FILE_NOT_FOUND
    echo ファイルが存在しません.処理を終了します.
    GOTO :END

:END




エラーメッセージをどこに記述するかだなぁ。



環境
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

2009-04-02

Java : JTable の特定の行の文字色を変えたい - 2


JTable の特定の行の文字色を変えたい

詳細
  • 特定の値(error フラグが true の場合)を含む行の文字色を赤色にしたい



import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

public class Sample extends JFrame {

    public Sample(List<SampleInfo> infoList) {
        SampleTable table = new SampleTable();
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        table.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 14));
        table.setData(infoList);
        JScrollPane sp = new JScrollPane(table);
        sp.setPreferredSize(new Dimension(500, 200));
        JPanel panel = new JPanel();
        panel.add(sp);
        getContentPane().add(panel);
    }

    public static void main(String[] args) {
        Sample frame = new Sample(createData());
        frame.setTitle("sample");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(60, 60, 600, 260);
        frame.setVisible(true);
    }

    private static List<SampleInfo> createData() {
        List<SampleInfo> list = new ArrayList<SampleInfo>();
        SampleInfo info = null;

        info = new SampleInfo();
        info.init("0", "a", true);
        list.add(info);
        info = new SampleInfo();
        info.init("1", "b", false);
        list.add(info);
        info = new SampleInfo();
        info.init("2", "c", false);
        list.add(info);
        info = new SampleInfo();
        info.init("3", "d", true);
        list.add(info);

        return list;
    }

    public class SampleTable extends JTable {

        private Map<String, SampleInfo> infoMap;

        public SampleTable() {
            super(new DefaultTableModel(new String[] { "key", "value" }, 0));
        }

        @Override
        public Component prepareRenderer(TableCellRenderer tcr, int row, int column) {
            Component c = super.prepareRenderer(tcr, row, column);
            String value = getValueAt(row, 0).toString();
            if (infoMap != null && !infoMap.isEmpty()) {
                SampleInfo info = infoMap.get(value);
                if (info.isError()) {
                    c.setForeground(Color.RED);
                } else {
                    c.setForeground(Color.BLACK);
                }
            } else {
                c.setForeground(Color.BLACK);
            }
            return c;
        }
        
        public void setData(List<SampleInfo> infoList) {
            if (infoList == null || infoList.isEmpty()) {
                return ;
            }

            DefaultTableModel model = (DefaultTableModel) getModel();
            if (model == null) {
                model = new DefaultTableModel();
            } else {
                for (int i=model.getRowCount()-1; i>-1; i--) {
                    model.removeRow(i);
                }
            }
            
            this.infoMap = new HashMap<String, SampleInfo>();
            for (SampleInfo info : infoList) {
                if (info != null) {
                    infoMap.put(info.getKey(), info);
                    model.addRow(info.getData());
                }
            }
        }

        public void clear() {
            DefaultTableModel model = (DefaultTableModel) getModel();
            if (model != null) {
                for (int i=model.getRowCount()-1; i>-1; i--) {
                    model.removeRow(i);
                }
            }
        }
    }

    public static class SampleInfo {

        private String key;
        private String value;
        private boolean error;

        public SampleInfo() {
        }

        public void init(String k, String v, boolean e) {
            this.key = k;
            this.value = v;
            this.error = e;
        }

        public String getKey() {
            return key;
        }
        public String getValue() {
            return value;
        }
        public boolean isError() {
            return error;
        }

        public Object[] getData() {
            List<Object> list = new ArrayList<Object>();
            list.add(createObject(key));
            list.add(createObject(value));
            return list.toArray();
        }

        private Object createObject(final String item) {
            return new Object() {
                @Override
                public String toString() {
                    return item;
                }
            };
        }
    }
}



前回 ので、特定のカラム(前回の場合は 6 カラム目(項目 F の列))を非表示にできればよかったのだけれども、提供されてる API でできるのかどうかもわからなかったので javax.swing.JTable クラスを拡張してみた。

どうだろか。SampleTable#setData(java.util.List) がなんだかどうにかならないものかと思ったり思わなかったり。まぁ、いいや。



環境
OS   : Windows XP Pro sp2
java : jdk1.6.0_11

Java : JTable の特定の行の文字色を変えたい - 1


JTable の特定の行の文字色を変えたい

詳細
  • 各行の 6 カラム目(項目 F の列)の値が“red”の場合、その行の文字色を赤色にしたい



import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class Sample extends JFrame {

  private String[] columnNames = { "A", "B", "C", "D", "E", "F" };

  private String[][] sampleData = {{ "a", "1", "い", "", "1234567890", "red"}
                                      , { "b", "2", "ろ", "", "4444444444", "0"}
                                      , { "c", "3", "は", "", "wwwwwwwwww", "0"}
                                      , { "d", "4", "に", "", "IIIIIIIIII", "red"}
                                  };

  public Sample() {
      JTable table = new JTable(sampleData, columnNames) {
          @Override
          public Component prepareRenderer(TableCellRenderer tcr, int row, int column) {
              Component c = super.prepareRenderer(tcr, row, column);
              if ("red".equals(getValueAt(row, 5))) {
                  c.setForeground(Color.RED);
              } else {
                  c.setForeground(getForeground());
              }
              return c;
          }
    
      };
      table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
      table.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 14));
      JScrollPane sp = new JScrollPane(table);
      sp.setPreferredSize(new Dimension(500, 200));
      JPanel panel = new JPanel();
      panel.add(sp);
      getContentPane().add(panel);
  }

  public static void main(String[] args) {
      Sample frame = new Sample();
      frame.setTitle("sample");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setBounds(60, 60, 600, 600);
      frame.setVisible(true);
  }
}

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class Sample extends JFrame {

  private String[] columnNames = { "A", "B", "C", "D", "E", "F" };

  private String[][] sampleData = {{ "a", "1", "い", "", "1234567890", "red"}
                                      , { "b", "2", "ろ", "", "4444444444", "0"}
                                      , { "c", "3", "は", "", "wwwwwwwwww", "0"}
                                      , { "d", "4", "に", "", "IIIIIIIIII", "red"}
                                  };

  public Sample() {
      JTable table = new JTable(sampleData, columnNames);
      table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
      table.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 14));
      table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
          @Override
          public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
              super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
              if ("red".equals(table.getValueAt(row, 5))) {
                  setForeground(Color.RED);
              } else {
                  setForeground(table.getForeground());
              }
              return this;
          }
      });
      JScrollPane sp = new JScrollPane(table);
      sp.setPreferredSize(new Dimension(500, 200));
      JPanel panel = new JPanel();
      panel.add(sp);
      getContentPane().add(panel);
  }

  public static void main(String[] args) {
      Sample frame = new Sample();
      frame.setTitle("sample");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setBounds(60, 60, 600, 600);
      frame.setVisible(true);
  }
}



微妙だ。
無名クラスでやるより、javax.swing.JTable クラスか javax.swing.table.DefaultTableCellRenderer クラスの拡張クラスを用意した方がよいのかもしれない。(多分、前者)。



参考

2009-04-01

Java : JTable のセルの幅を設定したい


JTable のセルの幅を設定したい。
※ 但し、表示後のサイズ変更は可としてみる



import java.awt.Dimension;
import java.awt.Font;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableColumnModel;

public class Sample extends JFrame {

    private String[] columnNames = { "A", "B", "C", "D", "E" };

    private String[][] sampleData = {{ "a", "1", "い", "", "1234567890"}
                                    , { "b", "2", "ろ", "", "4444444444"}
                                    , { "c", "3", "は", "", "wwwwwwwwww"}
                                    , { "d", "4", "に", "", "IIIIIIIIII"}};

    public Sample() {
        JTable table = new JTable(sampleData, columnNames);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        table.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 14));
        // ヘッダ
        DefaultTableColumnModel colHeaderModel = (DefaultTableColumnModel) table.getTableHeader().getColumnModel();
        for (int i=0; i<colHeaderModel.getColumnCount(); i++) {
            colHeaderModel.getColumn(i).setPreferredWidth(((i+1) * 30));        // ヘッダセルの幅を設定
        }
        // データ
        DefaultTableColumnModel colModel = (DefaultTableColumnModel) table.getColumnModel();
        for (int i=0; i<colModel.getColumnCount(); i++) {
            colModel.getColumn(i).sizeWidthToFit();                             // ヘッダセルの幅に合うように設定
        }
        JScrollPane sp = new JScrollPane(table);
        sp.setPreferredSize(new Dimension(500, 200));
        JPanel panel = new JPanel();
        panel.add(sp);
        getContentPane().add(panel);
    }

    public static void main(String[] args) {
        Sample frame = new Sample();
        frame.setTitle("sample");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(60, 60, 600, 600);
        frame.setVisible(true);
    }
}

2009-03-18

Java : iアプリで着信履歴を取得したい


iアプリで着信履歴を取得したい。



Q. iアプリで着信履歴を取ってこれるか?

A.
DoJa-3.0 から発着信履歴が取ってこれるようなことができるらしい。
-> DoJa-3.x プロファイルについて - Q. トラステッドiアプリ(iアプリDX)ではどのようなことが可能になりますか? を参照


Q. トラステッドiアプリ(iアプリDX)って?

A.
iモードメニューからじゃないと配信できないアプリっぽい?
-> 「iMenu」の「メニューリスト」でコンテンツ提供の申し込みは NTT DOCOMO IP申込 から



Q. まぁ、発着信履歴ってどうやって取得するの?

A.
※ API:DoJa-5.xプロファイル向けiアプリに関する技術資料 - iアプリコンテンツ開発ガイド for DoJa-5.0 APIリファレンス編

com.nttdocomo.system.CallRecord

携帯電話のネイティブの音声発着信履歴機能にアクセスする手段を提供します。

音声発着信履歴データの取得機能を提供します。 getLastRecordメソッドを実行することにより、 端末に保存されている最新の音声発着信履歴を取得することができます。 取得されたエントリには、 相手の電話番号(XString)、 相手の電話番号が登録されている電話帳エントリのID、 日時(XStringとして取得可能)、 接続が成功したか否かの情報、 発着信の種別 が設定されています。

com.nttdocomo.system.CallRecord#getLastRecord

public static CallRecord getLastRecord(int type)

発着信履歴の最新のエントリを取得します。 最後の発着信ではなく、発着信履歴に残っている最新のエントリを返します。

取得されたエントリには、 相手の電話番号(XString)、 相手の電話番号が登録されている電話帳エントリのID、 日時(XStringとして取得可能)、 接続が成功したか否かの情報、 発着信の種別が設定されています。

ただし、発信履歴の場合、 日時、接続が成功したか否かの情報、 ならびに発信の種別が設定されているかどうかは機種依存です。

パーミッションとして携帯電話情報の参照が許可されている トラステッドiアプリのみこのメソッドを呼び出すことができます。



... 最新の 1 件しか取ってこれないじゃないか!?




先ずは、実装して動かしてるか ... 。




※ 開発環境:DoJa-5.0 + J2SE1.4.2_18 + NetBeans4.1
※ 実行環境:DoJa-5.0プロファイル向けiアプリ開発ツール(iαppli Development Kit for DoJa-5.0)


下記で、プロジェクトの構築で dx.jar と dx.jam を生成

Sample.java
package dx;

public class Sample extends IApplication {

public void start() {
    Display.setCurrent(new SamplePanel());
}

/*
 * 最新の着信履歴を取得し、画面上に電話番号を表示する
 */
class SamplePanel extends Panel {
    public SamplePanel() {
        try {
            CallRecord record = CallRecord.getLastRecord(CallRecord.CALL_IN);
            XString number = new XString("");
            if (record == null) {
                number = new XString("not history.");
            } else {
                number = record.getPhoneNumber();
            }
            this.add(new Label(number));
        } catch (Throwable e) {
            this.add(new Label("internal error."));
        }

    }
}
}

ADF 設定(NetBeans4.1 -> メニュー -> (プロジェクトを選択して)DoJa-5.0 -> ADF/トラステッド動作設定)
AppName = Sample
AppClass = dx.Sample

※ 設定項目のみ記述


エミュレータで実行
SecurityViolation: x getLastRecord 0


セキュリティ違反!?


トラステッドiアプリ(iアプリDX)では TrustedAPID の設定をしないといけないらしい。
なので、TrustedAPID の項目に適当に数字 11 桁を設定してみる。

ADF 設定(NetBeans4.1 -> メニュー -> (プロジェクトを選択して)DoJa-5.0 -> ADF/トラステッド動作設定)
TrustedAPID = 12345678901

※ 設定項目のみ記述
※ 構築後に生成される dx.jam を直接書き換えてもいいんじゃないかとか



で、プロジェクトを再構築、エミュレータで実行してみる。
うごいたうごいた。



次は、適当にサーバを用意してそこから実機でダウンロード

download.html
<HTML>
 <HEAD>
   <TITLE>download</TITLE>
 </HEAD>
 <BODY>
   <OBJECT declare id="dx" data="dx.jam" type="application/x-jam"></OBJECT><BR>
   <A ijam="#dx" href="no.html">DOWNLOAD</A>
 </BODY>
</HTML>

no.html
<HTML>
 <HEAD>
   <TITLE>error</TITLE>
 </HEAD>
 <BODY>
   iアプリをダウンロードできません。<br>
 </BODY>
</HTML>



実機での実行結果
「ソフトに誤りがあるため、ダウンロードできません」




NTT docomo から TrustedAPID をもらわないとどうにもならないね。



参考
iアプリ
iアプリ | サービス・機能 | NTTドコモ
TrustedAPID
TrustedAPIDに関する推察 - 試行錯誤と創意工夫(S!アプリ開発日記+α)

2009-03-11

Java : iアプリの開発環境(DoJa-5.0 + J2SE1.4.2_18 + NetBeans4.1)を整えてみる


iアプリの開発環境(DoJa-5.0 + J2SE1.4.2_18 + NetBeans4.1)を整えてみる。




DoJa-5.0 プロファイル向けiアプリ開発ツール(iαppli Development Kit for DoJa-5.0)なんてものを使おうとしたら システム要件 の注意に

注意2 Jave2 SDK, Standard EditionVersion 1.4.2以外の動作確認はしておりません。
注意4 NetBeans IDE 4.1以外での動作確認はしておりません。

とかとか。


それはさておき、下記の順番でダウンロードしてインストール。
続いて、ごにょごにょ。詳細は DoJa-5.0 をインストールしてできたディレクトリの直下にある DevGuide.pdf の p.269 くらいから読めば十分だと思う。


んで、サンプルをつくって、いざプロジェクトを構築。... エラー。

com.nttdocomo.ui.IApplication クラスが見つからない

とな。(エラーとってなかったのでどんなエラーだったかはもう不明)
Javaのソースクラスパスに「$DOJA_HOME\lib\classes.zip」「$DOJA_HOME\iDKDoJa5.0\lib\doja_classes.zip」へ通さないといけない?でも、そんなことガイドには書いてない。IDE 使わないときに必要なんだろ。



悩むこと小一時間。



DoJa-5.0 はデフォルトだと $DOJA_HOME は

C:\iDKDoJa5.0

なのだけれども、個人的な嗜好により

C:\Program Files\...\iDKDoJa5.0

にした。それが悪かった ... 。なので、

C:\mobile\iDKDoJa5.0

に変えて再インストール。
何事もなかったかのように、プロジェクトは構築され、実行できた。
ああ。そこはかとなく 「Apache Group」というものを思い出した。



追記。
あ、DoJa-5.1 を使ってるつもりが、DoJa-5.0 だった。まいっか。

2009-03-04

Java : JavaMail を使って gmail 経由でメールを送信してみる


gmail でちょっとごにょごにょ。


public static void send(String to, String subject, String text) throws Exception {
    Properties properties = new Properties();
    properties.setProperty("mail.smtp.host", "smtp.gmail.com");
    properties.setProperty("mail.smtp.port", "587");
    properties.setProperty("mail.smtp.starttls.enable", "true");
    properties.setProperty("mail.smtp.auth", "true");
    Session session = Session.getInstance(properties, new Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("user_name", "password");
        }
    });
    MimeMessage message = new MimeMessage(session);
    try {
        message.setFrom(new InternetAddress("xxx@gmail.com"));
        message.setRecipients(Message.RecipientType.TO, "piyo@foo.co.jp");
        message.setSubject("test", "iso-2022-jp");
        message.setText("fooboo", "iso-2022-jp");
        Transport.send(message);
    } catch (Exception e) {
        throw e;
    }
}



なんてのを、スケジュールで定期的に実行していたら ... 。


This is an automatically generated Delivery Status Notification

Delivery to the following recipient failed permanently:

    piyo@foo.co.jp

Technical details of permanent failure:
Message rejected.  See http://mail.google.com/support/bin/answer.py?answer=69585 for more information.

  ----- Original message -----

(以下略)



とかとか。
一旦は送信されるらしい(送信済みメールに履歴が残る)けど受信トレイに素敵なメッセージとともに戻ってくる。(仮に送信されっぱなしの場合は、数時間後に送信先へ到着)

AUTH LOGIN で頻繁に認証を行うとスパムに認定されてしまうのか。
けど、他にも認定要素は盛り沢山。


下記は、あきらかに Java で実行してますな Message-ID。
Message-ID: <00000000.0.0000000000000.JavaMail.javamailuser@localhost>



参考



ちょっとやらなくちゃいけないことがあったんだ。

2009-02-26

Java : JavaMail を使ってメールを送信してみる


JavaMail を使ってメールを送信してみる



public static void send() {
    try {
        Properties properties = new Properties();
        properties.setProperty("mail.smtp.host", "foo.co.jp");
        properties.setProperty("mail.smtp.port", "25");
        properties.setProperty("mail.host", "foo.co.jp");
        MimeMessage msg = new MimeMessage(Session.getDefaultInstance(properties, null));
        msg.setRecipient(Message.RecipientType.TO, new InternetAddress("piyo@foo.co.jp", "piyo", "iso-2022-jp"));
        msg.setFrom(new InternetAddress("boo@foo.co.jp", "boo", "iso-2022-jp"));
        msg.setSubject("test");
        Transport.send(msg);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

javax.mail.MessagingException: IOException while sending message;
  nested exception is:
        java.io.IOException: No content
        at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:676)
        at javax.mail.Transport.send0(Transport.java:189)
        at javax.mail.Transport.send(Transport.java:118)
    (以下略)



で、
メッセージに明示的に本文が設定されていないと Exception が発生する。

ことはわかった。
なんでかは、まだソース見てない。あとで。

2009-01-22

Java : log4j を使ってログを syslog に出力してみる(in CentOS5) - 3


log4j を使ってログを大量に syslog に出力してみる。in CentOS5

条件
  • 外部ファイルを使用しない
  • カテゴリ名は syslog とする
  • Facility は local0 とする
  • Facility が local0 のログは /home/work/logs/sample.log に出力する
  • ログレベルが INFO のメッセージを 100,000 件出力する


※ sample.jar(Test.java) 以外は 前回 と同じ


sample.jar(Test.java)
package foo.boo;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.net.SyslogAppender;

public class Test {

    static Logger logger= Logger.getLogger("syslog");

    public static void main(String[] args) {
        PatternLayout layout = new PatternLayout();
        layout.setConversionPattern("%6p %c{1} - %m%n\n");
        SyslogAppender appender = new SyslogAppender();
        appender.setSyslogHost("127.0.0.1");
        appender.setLayout(layout);
        appender.setFacility("locel0");
        appender.activateOptions();
        logger.addAppender(appender);
        logger.setLevel(Level.ALL);

        for (int i=1; i<100000; i++) {
            logger.info("test message " + i);
        }
    }
}
 


結果
10 万件中、大体 1 万件が出力された。


考察

... なぜ、取りこぼし?
先ずは、ソースを追っかけてみた。

  • syslog に出力するので org.apache.log4j.net.SyslogAppender を使っている
  • org.apache.log4j.net.SyslogAppender は org.apache.log4j.helpers.SyslogQuietWriter#write(-) を使って出力している
  • org.apache.log4j.helpers.SyslogQuietWriter#write(-) は java.net.DatagramSocket / DatagramPacket を使って通信している


ただ、 前々回 になんてやっているにもかかわらず。


ついでに、514/udp ポートの確認。
# netstat -an | grep -i udp | grep 514



そろそろ気がつこう。


ログ転送によるメリット/デメリット

デメリットに挙げた「UDPによる転送のため取りこぼしの可能性が生じる」は、UDPはTCPと違い相手に届いたかどうかの確認を行わず、また再送もしないため(*その代償として、「TCPよりも高速なデータの配送」が得られる。)、ログの損失の可能性が生じる。その確率は、ログが大量かつ頻繁に発生するにつれ高くなる。




log4j の org.apache.log4j.net.SyslogAppender はリモートの syslogd へ 514/udp ポートを介してログを送信している。はず。
プロトコル上、取りこぼしはどうしやうもない。

2009-01-21

Java : log4j を使ってログを syslog に出力してみる(in CentOS5) - 2

log4j を使ってログを syslog に出力してみる。in CentOS5

条件
  • 外部ファイルを使用しない
  • カテゴリ名は syslog とする
  • Facility は local0 とする
  • Facility が local0 のログは /home/work/logs/sample.log に出力する
  • ログレベルが WARN 以上のメッセージを出力する


※ 構成、sample.jar(Test.java)、run.sh 以外は 前回 と同じ


構成
/home
└ /work
├ /jar
│  ├ sample.jar
│  └ log4j-1.2.15.jar
├ /logs
└ run.sh
 



ファイル作成

sample.jar(Test.java)
package foo.boo;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.net.SyslogAppender;

public class Test {

    static Logger logger= Logger.getLogger("syslog");

    public static void main(String[] args) {
        PatternLayout layout = new PatternLayout();
        layout.setConversionPattern("%6p %c{1} - %m%n\n");
        SyslogAppender appender = new SyslogAppender();
        appender.setSyslogHost("127.0.0.1");
        appender.setLayout(layout);
        appender.setFacility("locel0");
        appender.activateOptions();
        logger.addAppender(appender);
        logger.setLevel(Level.WARM);
        logger.debug("debug.");
        logger.info("info.");
        logger.warn("warn.");
        logger.error("error.");
        logger.fatal("fatal.");
    }
}
 


run.sh
#!/bin/sh

SAMPLE_HOME=${PWD}

export LIBS=${SAMPLE_HOME}/jar/log4j-1.2.15.jar:${SAMPLE_HOME}/jar/sample.jar

JAVA_CMD=$JAVA_HOME/bin/java

CMD=${JAVA_CMD}" -classpath "${LIBS}" foo.boo.Test"

${CMD}
 






なんら前回と大差ない。
log4j.properties を削除して、ソース内に設定内容を保持しただけ。

2009-01-20

Java : log4j を使ってログを syslog に出力してみる(in CentOS5) - 1


log4j を使ってログを syslog に出力してみる。in CentOS5

条件
  • 外部ファイル(log4j.properties)から設定内容を取得する
  • カテゴリ名は syslog とする
  • Facility は local0 とする
  • Facility が local0 のログは /home/work/logs/sample.log に出力する
  • ログレベルが WARN 以上のメッセージを出力する


構成
/home
└ /work
├ /jar
│  ├ sample.jar
│  └ log4j-1.2.15.jar
├ /logs
├ log4j.properties
└ run.sh
 



環境
  • jdk1.6.0_04
  • log4j-1.2.15
  • CentOS5


ファイル作成

sample.jar(Test.java)
package foo.boo;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class Test {

static Logger logger= Logger.getLogger("syslog");

    public static void main(String[] args) {
        PropertyConfigurator.configure(args[0]);
        logger.debug("debug.");
        logger.info("info.");
        logger.warn("warn.");
        logger.error("error.");
        logger.fatal("fatal.");
    }
}
 


log4j.properties
#rootLogger
log4j.rootLogger=DEBUG

# syslog
log4j.logger.syslog=WARN,syslog

#  APPENDER syslog
log4j.appender.syslog=org.apache.log4j.net.SyslogAppender
log4j.appender.syslog.SyslogHost=127.0.0.1
log4j.appender.syslog.Facility=local0

log4j.appender.syslog.layout=org.apache.log4j.PatternLayout
log4j.appender.syslog.layout.ConversionPattern=%6p %c{1} - %m%n
 

参考:(Apache Log4j 1.2.15 API)


run.sh
#!/bin/sh

SAMPLE_HOME=${PWD}

export LIBS=${SAMPLE_HOME}/jar/log4j-1.2.15.jar:${SAMPLE_HOME}/jar/sample.jar

JAVA_CMD=$JAVA_HOME/bin/java

CMD=${JAVA_CMD}" -classpath "${LIBS}" foo.boo.Test "${SAMPLE_HOME}"/log4j.properties"

${CMD}
 



CentOS の設定

/etc/syslog.conf に追加。
/etc/sysconfig/syslog を変更。
syslogd の再起動。
ついでに、514/udp ポートの確認。
# vi /etc/syslog.conf
----- ----- -----
# 追加
local0.* /home/work/logs/sample.log

# vi /etc/sysconfig/syslog
----- ----- -----
# 変更前
# SYSLOGD_OPTIONS="-m 0"
# 変更後
SYSLOGD_OPTIONS="-m 0 -r"

# service syslog restart

# netstat -an | grep -i udp | grep 514
 

参考


実行。
# /home/work/run.sh
 


で、/home/work/logs/sample.log にログが出力された。

2009-01-17

『 vol.9 ライフハック祭り 2009 』

 
vol.9 ライフハック祭り 2009 へ参加してきました。


内容
大橋 悦夫さんのお話し。
堀 E. 正岳さんのお話し。
LT 6 名くらい。


感想
参加するも相変わらず講師の方とはお話ししなかった。
堀さんの自己紹介を聞いてバタフライ計画( 順列都市 )が巡ってた。
そもそも、ライフハックってなんだろなぁとか途中から思っていたり。
参加者の職種が限定されてなくって、雰囲気がそこはかとなく違和感があったり。

懇親会も参加。
適度に名刺交換を行うも、ここのブログは名刺に URL のっけてないとか思いながら、まいっかとか。
名刺の管理の仕方をちと聞いてみた。んで、どこでいつ知り合ったのかで、時系列に分類してみやうと思った。
あと、数ヶ月ちと思っていたことを聞くも即否定されてしまった。( これ に参加されて変な飲み物持って帰った人だと思っていた)。
そんで、関西ライフハック研究会で今回初めて女性の方と喋った!!

何はともあれ愉しかったのです。
ただ、自由人にライフハックは難しいとか思いました。



次週(1/24)は
らしいです。
でも、XP 祭り関西 2009 はもう申し込み締め切られてる。