Home > Java Archive

Java Archive

Java: インターフェースとローカルのIPv6, IPv4アドレスの取得 - NetworkInterfaceクラス

下記のコードはネットワークインターフェース情報取得し、IPv6とIPv4のアドレスを取得、表示するサンプルコードです。

ソースコード

import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;

/**
 * ネットワークインターフェースの取得
 */
public class InetAddressesInfo {
  private HashMap<NetworkInterface, ArrayList<InetAddress>> interfaceMap;

  public InetAddressesInfo() {
    interfaceMap = new HashMap<NetworkInterface, ArrayList<InetAddress>>();
  }

  public void getInterfaces() {
    interfaceMap.clear();
    try {
      Enumeration<NetworkInterface> interfaceList = NetworkInterface.getNetworkInterfaces();
      if (interfaceList == null) {
        System.out.println("Message: No interfaces found");
      } else {
        while (interfaceList.hasMoreElements()) {
          NetworkInterface iface = interfaceList.nextElement();
          Enumeration<InetAddress> addrList = iface.getInetAddresses();
          if (!addrList.hasMoreElements()) continue;
          ArrayList<InetAddress> iaddress = new ArrayList<InetAddress>();
          while (addrList.hasMoreElements())
            iaddress.add(addrList.nextElement());
          interfaceMap.put(iface, iaddress);
        }
      }
    } catch (SocketException se) {
      System.out.println("Error getting network interfaces: " + se.getMessage());
    }
  }

  public void show() {
    for (NetworkInterface n : interfaceMap.keySet()) {
      System.out.println("Interface " + n.getName() + ": ");
      for (InetAddress a : interfaceMap.get(n)) {
        System.out.print("\tAddress " + ((a instanceof Inet4Address ? "(IPv4)"
            : (a instanceof Inet6Address ? "(IPv6)" : "(?)"))));
        System.out.println(": " + a.getHostAddress());
      }
    }
  }

  public HashMap<NetworkInterface, ArrayList<InetAddress>> getInterfaceMap() {
    return interfaceMap;
  }

  public void setInterfaceMap(
      HashMap<NetworkInterface, ArrayList<InetAddress>> interfaceMap) {
    this.interfaceMap = interfaceMap;
  }

  public static void main(String[] args) {
    InetAddressesInfo i =  new InetAddressesInfo();
    i.getInterfaces();
    i.show();
  }

}

実行結果

Interface lo:
	Address (IPv6): 0:0:0:0:0:0:0:1
	Address (IPv4): 127.0.0.1
Interface net4:
	Address (IPv6): fe80:0:0:0:0:5efe:c0a8:10a%12
Interface net5:
	Address (IPv6): 2001:0:4137:9e76:8ae:1cf7:3f57:fef5
	Address (IPv6): fe80:0:0:0:8ae:1cf7:3f57:fef5%13
Interface eth3:
	Address (IPv6): 2001:c90:33d:21d4:919c:836b:2d1a:cf33
	Address (IPv6): 2001:c90:33d:21d4:8856:aef1:d0bd:db64
	Address (IPv6): fe80:0:0:0:919c:836b:2d1a:cf33%11
	Address (IPv4): 192.168.1.10

ドキュメント

NetworkInterface (Java Platform SE 6)

Java: ServletからJSPへリクエストをフォワード

目的

Servletで処理した結果をJSPファイルに転送し、HTMLを生成する。これによって、MVCモデルにおけるViewの分離ができる。

方法

protected void doGet(HttpServletRequest req, HttpServletResponse res)
	throws ServletException, IOException {
	ArrayList<String[]> table = new ArrayList<String[]>(); // 転送データ
<中略>
	req.setAttribute("table", table);
	req.getRequestDispatcher("jsp/view.jsp").forward(req, res);

上記のServletコード上のtableという変数をview.jspに渡したす場合、HttpServletRequest #setAttributeで変数を登録し、getRequestDispatcherとforwardでリクエストをフォワードする。

JSP側で登録した変数を取り出すには、下記のコードを用いる。

<% ArrayList<String[]> table = (ArrayList<String[]>)request.getAttribute("table"); %>

Java: 形態素解析Senをインストール(Windows編)

ダウンロードするソフト

1.ActivePerl(ActivePerl, Download Perl for Windows, Mac, Linux, AIX, HP-UX & Solaris)
2.Apache Ant(Apache Ant - Binary Distributions)
3.Sen(sen: ドキュメント & ファイル: release)

ActivePerlはインストーラーに従いインストールする。
ダウンロードしたAntとSenはC:\work以下に解凍し、フォルダ名をそれぞれapache-ant、senとリネームする。

環境変数の設定

PATH(追加) C:\work\apache-ant\bin;
ANT_HOME C:\work\apache-ant
SEN_HOME C:\work\sen
JAVA_HOME C:\Sun\SDK\jdk
この後、上記の環境変数が適応されているか下記のコマンドを用いて確認する。

C:\>echo %ANT_HOME%
C:\work\apache-ant (←OK、パスが適応されている)

適応されていなければ再起動する。

辞書のインストール方法

カレントディレクトリをdicに設定後、辞書をインストールする。

C:\>cd work/sen/dic (←カレントディレクトリを移動)
C:\work\sen\dic>ant -Dperl.bin=C:\Perl\bin\perl.exe (←辞書のインストール)
Buildfile: C:\work\sen\dic\build.xml
<中略>
BUILD SUCCESSFUL
Total time: 1 minute 2 seconds
C:\work\sen\dic>

動作確認

%SEN_HOME%\sen.batをダブルクリックする。

C:\work\sen\bin>rem set classpath
C:\work\sen\bin>SET CLASSPATH=C:\work\sen\lib\sen.jar
C:\work\sen\bin>SET CLASSPATH=C:\work\sen\lib\sen.jar;C:\work\sen\lib\commons-logging.jar
done.
Please input Japanese sentence:
2010/03/25 0:29:44 net.java.sen.Dictionary 
情報: token file = C:\work\sen\dic/token.sen
2010/03/25 0:29:44 net.java.sen.Dictionary 
情報: time to load posInfo file = 16[ms]
2010/03/25 0:29:44 net.java.sen.Dictionary 
情報: double array trie dictionary = C:\work\sen\dic/da.sen
2010/03/25 0:29:44 net.java.sen.util.DoubleArrayTrie load
情報: loading double array trie dict = C:\work\sen\dic/da.sen
2010/03/25 0:29:45 net.java.sen.util.DoubleArrayTrie load
情報: loaded time = 0.453[ms]
2010/03/25 0:29:45 net.java.sen.Dictionary 
情報: pos info file = C:\work\sen\dic/posInfo.sen
2010/03/25 0:29:45 net.java.sen.Dictionary 
情報: time to load pos info file = 0[ms]
2010/03/25 0:29:45 net.java.sen.Tokenizer loadConnectCost
情報: connection file = C:\work\sen\dic\matrix.sen
2010/03/25 0:29:45 net.java.sen.Tokenizer loadConnectCost
情報: time to load connect cost file = 141[ms]
hello
hello   (hello) 未知語(0,5,5)   null    null
こんにちは
こんにちは      (こんにちは)    感動詞(0,5,5)   コンニチハ      コンニチワ

Java, Servlet: No suitable driver found for "~" の原因と解決法

事象 - NullPointerException on java.sql.Connection

JDBCを用いてServletからMySQLのテーブルへアクセスする過程で、DriverManager.getConnectionメソッドの呼び出しの後、NullPointerExceptionが送出された(アプリケーション・サーバーはTomcat)。

<前略>
Connection conn = null;
    try {
      conn = DriverManager.getConnection(URL, USER, PASS);
      Statement stmt = conn.createStatement();
      ResultSet rs = stmt.executeQuery("<SQL文>");
<後略>

tomcat_error_nullpointer

原因 - No suitable driver found for "~"

デバックトレースを行ったところ、No suitable driver found for "~"というメッセージが出力されていた。JDBC Driver のクラスパスを設定していなかった為、今回のエラーが発生した。

対策 - JDBC Driverのクラスパス設定

JDBC Driver ファイル(.jar)をクラスパスに追加する。Eclipse上での設定方法は「実行」→「実行の構成」から「クラスパス」タブ内の「ユーザー・エントリー」を選択、「外部JARの追加」ボタンから、Driverを設定する。

雑感

ありがちー、なミスをしてしまったー。

Java: OR論理演算子の評価条件

以前、OR演算の2つのオペランドが両方評価されるか否かがあやふやだったので以下のコードを以て改めて確認してみます。

public class Sample1 {
  public static void main(String[] args) {
    int i = 5, j = 10, k =15;
    if ((i++ < j) | (k-- > j))
      System.out.println("values of i: " + i + " values of k: " + k);
    if ((i < j) || (--k > j))
      System.out.println("values of k: " + k);
  }
}

実行結果は

values of i: 6 values of k: 14
values of k: 14

となります。
1つめのif文で使われている演算子はビット論理OR演算子で左右の両オペランドを評価します。よって式i++とk--が評価されているため結果はvalues of i: 6 values of k: 14となります。

2つめのif文で使われているのは短絡論理OR演算子で、評価順序は||の左側のオペランドを先ず評価し、それがtrueなら右側は評価せず(ORは片方が真ならもう片方の結果にかかわらず真ですから)、falseなら評価します。よって、if ((i < j) || (--k > j))ではi < jがtrueとなるため--k > jは評価されずkはデクリメントされません。よってkの値は変わらず、上記のような実行結果となります。

Page 1 of 512345

Home > Java Archive

バックナンバー
最近のコメント
最近のトラックバック
メタ情報

Return to page top