Quantcast
Channel: プログラム の個人的なメモ
Viewing all 860 articles
Browse latest View live

【Java】Java のファイルの扱い

$
0
0

■ ファイルのコピー

 * Files.copy(sourcePath, destinationPath) を使う
上書き
 * Files.copy(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING) を使う

サンプル

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

public class Main {
  public static void main(String[] args) {
    try {
      Path source = Paths.get("etc", "sample.txt");
      Path destination = Paths.get("etc", "clone.txt");
      Files.copy(source, destination, StandardCopyOption.REPLACE_EXISTING);
    } catch (IOException ex) {
      ex.printStackTrace();
    }
  }
}


【Java】 匿名内部クラス / 無名内部クラス

$
0
0

■ はじめに

以下の関連記事
https://blogs.yahoo.co.jp/dk521123/32156111.html
https://blogs.yahoo.co.jp/dk521123/36602948.html
にあるように、List や Map を初期化するのに、以下のように行っていた。
~~~~~~~
List<Person> list = new ArrayList<Person>() {
    {
        add(perso1);
        add(perso2);
    }
};
~~~~~~~

ただ、以下「問題が発生したソース」のように組んだら
例外が発生して意図した通りに動かなかった。
結論から言うと、上記のように匿名内部クラスを利用してリストを初期化したのが原因でだったのだが
Java文法的に理解を深めるために、この「匿名内部クラス」を扱う。

ちなみに、以下の説明が分かり易いかも。
http://ichitcltk.hustle.ne.jp/gudon2/index.php?pageType=file&id=java009_AnonymousClass

問題が発生したソース

Person.java
import java.io.Serializable;

public class Person implements Serializable {
  private static final long serialVersionUID = 1L;

  private int id;
  private String name;

  public Person() {
    this(-1, null);
  }

  public Person(int id, String name) {
    this.id = id;
    this.name = name;
  }

  public int getId() {
    return this.id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public String getName() {
    return this.name;
  }

  public void setName(String name) {
    this.name = name;
  }
}
Main.java
import java.beans.XMLEncoder;
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

public class Main {

  public static void main(String[] args) {
    Main main = new Main();
    main.testNG();

    System.out.println();

    main.testOK();
  }

  public void testNG() {
    System.out.println("Start - testNG()");

    // NG case ★注目★
    List<Person> listNG = new ArrayList<Person>() {
      private static final long serialVersionUID = 1L;
      {
        add(new Person(1, "Mike"));
        add(new Person(2, "Tom"));
      }
    };

    saveXml(listNG);

    System.out.println("End - testNG()");
  }

  public void testOK() {
    System.out.println("Start - testOK()");

    // OK case
    List<Person> listOK = new ArrayList<Person>();
    listOK.add(new Person(1, "Mike"));
    listOK.add(new Person(2, "Tom"));

    saveXml(listOK);

    System.out.println("End - testOK()");
  }

  public static <T> void saveXml(T objectToSave) {
    try (XMLEncoder xMLEncoder = new XMLEncoder(new BufferedOutputStream(new FileOutputStream("test.xml")));) {
      xMLEncoder.writeObject(objectToSave);
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }
  }
}
出力結果
Start - testNG()
java.lang.InstantiationException: com.sample.anonymousinner.Main$1
Continuing ...
java.lang.Exception: XMLEncoder: discarding statement XMLEncoder.writeObject(Main$1);
Continuing ...
End - testNG()

Start - testOK()
End - testOK()

■ 匿名内部クラス (Anonymous Inner Class) / 無名内部クラス

 * 名前をつけることなく、クラス定義してインスタンスを生成したクラス

■ 構文

// [匿名クラスの親クラス]は、インターフェイスでもOK
new 匿名クラスの親クラス() {
   内部クラスのメソッド、データ
}
初期化子付き
new 匿名クラスの親クラス() {
   {
      初期化子(イニシャライザ/initializer)の処理
   }
   内部クラスのメソッド、データ
}

匿名内部クラスを使ったListの初期化

上記「問題が発生したソース」のNGケースを考える
// インスタンス変数『listOK』は、『ArrayList<Person>クラスを継承した匿名クラスのインスタンス』★今日の収穫★
List<Person> listOK = new ArrayList<Person>() { // [匿名クラスの親クラス] => ArrayList<Person>
  {
    // 初期化子を利用して、リストにインスタンスを追加している
    add(new Person(1, "Mike"));
    add(new Person(2, "Tom"));
  }
};


関連記事

【Java】コレクション ~ List 編~

https://blogs.yahoo.co.jp/dk521123/32156111.html

【Java】 コレクション ~ Map編 / あれこれ ~

https://blogs.yahoo.co.jp/dk521123/36602948.html

【Java】 匿名内部クラス / 無名内部クラス

$
0
0

■ はじめに

以下の関連記事
https://blogs.yahoo.co.jp/dk521123/32156111.html
https://blogs.yahoo.co.jp/dk521123/36602948.html
にあるように、List や Map を初期化するのに、以下のように行っていた。
~~~~~~~
List<Person> list = new ArrayList<Person>() {
    {
        add(person1);
        add(person2);
    }
};
~~~~~~~

ただ、以下「問題が発生したソース」のように組んだら
例外が発生して意図した通りに動かなかった。
結論から言うと、上記のように匿名内部クラスを利用してリストを初期化したのが原因でだったのだが
Java文法的に理解を深めるために、この「匿名内部クラス」を扱う。

ちなみに、以下の説明が分かり易いかも。
http://ichitcltk.hustle.ne.jp/gudon2/index.php?pageType=file&id=java009_AnonymousClass

問題が発生したソース

Person.java
import java.io.Serializable;

public class Person implements Serializable {
  private static final long serialVersionUID = 1L;

  private int id;
  private String name;

  public Person() {
    this(-1, null);
  }

  public Person(int id, String name) {
    this.id = id;
    this.name = name;
  }

  public int getId() {
    return this.id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public String getName() {
    return this.name;
  }

  public void setName(String name) {
    this.name = name;
  }
}
Main.java
import java.beans.XMLEncoder;
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

public class Main {

  public static void main(String[] args) {
    Main main = new Main();
    main.testNG();

    System.out.println();

    main.testOK();
  }

  public void testNG() {
    System.out.println("Start - testNG()");

    // NG case ★注目★
    List<Person> listNG = new ArrayList<Person>() {
      private static final long serialVersionUID = 1L;
      {
        add(new Person(1, "Mike"));
        add(new Person(2, "Tom"));
      }
    };

    saveXml(listNG);

    System.out.println("End - testNG()");
  }

  public void testOK() {
    System.out.println("Start - testOK()");

    // OK case
    List<Person> listOK = new ArrayList<Person>();
    listOK.add(new Person(1, "Mike"));
    listOK.add(new Person(2, "Tom"));

    saveXml(listOK);

    System.out.println("End - testOK()");
  }

  public static <T> void saveXml(T objectToSave) {
    try (XMLEncoder xMLEncoder = new XMLEncoder(new BufferedOutputStream(new FileOutputStream("test.xml")));) {
      xMLEncoder.writeObject(objectToSave);
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }
  }
}
出力結果
Start - testNG()
java.lang.InstantiationException: com.sample.anonymousinner.Main$1
Continuing ...
java.lang.Exception: XMLEncoder: discarding statement XMLEncoder.writeObject(Main$1);
Continuing ...
End - testNG()

Start - testOK()
End - testOK()

■ 匿名内部クラス (Anonymous Inner Class) / 無名内部クラス

 * 名前をつけることなく、クラス定義してインスタンスを生成したクラス

■ 構文

// [匿名クラスの親クラス]は、インターフェイスでもOK
new 匿名クラスの親クラス() {
   内部クラスのメソッド、データ
}
初期化子付き
new 匿名クラスの親クラス() {
   {
      初期化子(イニシャライザ/initializer)の処理
   }
   内部クラスのメソッド、データ
}

匿名内部クラスを使ったListの初期化について考える

上記「問題が発生したソース」のNGケースを考える
// インスタンス変数『listOK』は、『ArrayList<Person>クラスを継承した匿名クラスのインスタンス』★今日の収穫★
//  => 『listOK』は、決して List<Person> のインスタンスではない
List<Person> listOK = new ArrayList<Person>() { // [匿名クラスの親クラス] => ArrayList<Person>
  {
    // 初期化子を利用して、リストにインスタンスを追加している
    add(new Person(1, "Mike"));
    add(new Person(2, "Tom"));
  }
};


関連記事

【Java】コレクション ~ List 編~

https://blogs.yahoo.co.jp/dk521123/32156111.html

【Java】 コレクション ~ Map編 / あれこれ ~

https://blogs.yahoo.co.jp/dk521123/36602948.html

【プロトコル】NTP / SNTP ~ 時間同期に関するプロトコル ~

$
0
0

■ NTP

NTP : Network Time Protocol
 * ネットワーク上で時間を同期するプロトコル
 * UDP
 * ポート番号 123

注意:

http://jjy.nict.go.jp/ntp/
 * ファイアウォールの内側から直接利用することはできない

■ SNTP

SNTP : Simple Network Time Protocol
 * NTPの簡易版

【Java】boolean / Boolean

$
0
0

■ Boolean.valueOf() / Boolean.getBoolean()

 * Boolean.getBoolean()ってあったので、 true / false に変換すると勘違いしてたのでメモ。

Boolean.valueOf(文字列)

 * 文字列を true / false に変換する

Boolean.getBoolean(文字列)

https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Boolean.html#getBoolean-java.lang.String-
 * 引数によって指定されたシステム・プロパティが存在し、それが文字列"true"に等しい場合にだけ、trueを返します

【Java】Java から別のJava(JARファイル)を実行するには...

$
0
0

サンプル

OtherJava.java

別プロセスとして実行したいJava。 OtherJava.jar にする
public class OtherJava {
  public static void main(String[] args) throws Exception {
    if (args == null || args.length < 1) {
      throw new IllegalArgumentException("Illegal Arguments");
    }

    String input = args[0];
    if (input.equals("error")) {
      System.err.println("error...");
      throw new Exception("error");
    } else if (input.equals("return_code_10")) {
      System.out.println("Return Code 10...");
      System.exit(10);
    }

    System.out.println("Hello World, " + input);
  }
}

Main.java

呼び出し側
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {

  public static void main(String[] args) throws InterruptedException {
    System.out.println("Test0");
    execute("java", "-jar", "OtherJava.jar");
    Thread.sleep(1000L);
    System.out.println();

    System.out.println("Test1");
    execute("java", "-jar", "OtherJava.jar", "error");
    Thread.sleep(1000L);
    System.out.println();

    System.out.println("Test2");
    execute("java", "-jar", "OtherJava.jar", "return_code_10");
    Thread.sleep(1000L);
    System.out.println();

    System.out.println("Test3");
    execute("java", "-jar", "OtherJava.jar", "Mike");
    Thread.sleep(1000L);
    System.out.println();

    System.out.println("Done");
  }

  private static void execute(String... commands) {
    ProcessBuilder processBuilder = new ProcessBuilder(commands);

    try {
      Process process = processBuilder.start();
      int result = process.waitFor();
      System.out.println("Result Code : " + result);

      try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
        String line;
        while ((line = bufferedReader.readLine()) != null) {
          System.out.println(line);
        }
      }
      try (BufferedReader errorBufferedreader = new BufferedReader(new InputStreamReader(process.getErrorStream()))) {
        String errorLine;
        while ((errorLine = errorBufferedreader.readLine()) != null) {
          System.err.println(errorLine);
        }
      }
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

出力結果

Test0
Result Code : 1
Exception in thread "main" java.lang.IllegalArgumentException: Illegal Arguments
	at com.sample.proc.OtherJava.main(OtherJava.java:6)

Test1
Result Code : 1
error...
Exception in thread "main" java.lang.Exception: error
	at com.sample.proc.OtherJava.main(OtherJava.java:12)

Test2
Result Code : 10
Return Code 10...

Test3
Result Code : 0
Hello World, Mike

Done


関連記事

【Java】プロセス情報(PIDなど) に関するあれこれ

https://blogs.yahoo.co.jp/dk521123/37013520.html

【Java】 外部プログラム/コマンドを実行するには ~ ProcessBuilder ~

https://blogs.yahoo.co.jp/dk521123/34842155.html

【Java】プロキシ設定のチェック機能を考える

https://blogs.yahoo.co.jp/dk521123/37181766.html

【Java】プロキシ設定のチェック機能を考える

$
0
0

■ はじめに

プロキシ設定のチェックを以下の関連記事であるようなコードで試してみた。
https://blogs.yahoo.co.jp/dk521123/37019179.html
しかし、Basic認証が設定してあるプロキシサーバで
「Basic認証が認証が通った後に、認証NGになる設定をおこなった際に
前回のBasic認証が通っているのでエラーにならない」という問題が出た。
サーバに細工をし、「HTTPコード 407(プロキシ認証が必要)」を返せば
ログアウト的なことをできるらしいができればアプリだけで完結したいので
そのやり方を考える

■ サンプル

以下の環境下を想定する

 * プロキシサーバ   :192.168.211.123
 * プロキシサーバポート:3128
 * 認証ID       :admin
 * 認証パスワード   :password

ProxySettingChecker.java

別プロセスとして実行したいJava。 ProxySettingChecker.jar にする
import java.io.IOException;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.PasswordAuthentication;
import java.net.Proxy;
import java.net.URL;

public class ProxySettingChecker {

  private static final int TIMEOUT = 5_000;

  /**
   *
   * @param args
   *
   *          <pre>
   * args[0] : 対象URL(http://xxxx) (Required)
   * args[1] : Proxy Host (Required)
   * args[2] : Proxy Port (Required)
   * args[3] : User Name (Optional)
   * args[4] : Password (Optional)
   *          </pre>
   *
   * @throws Exception
   */
  public static void main(String[] args) throws Exception {
    if (args == null || args.length < 3) {
      throw new IllegalArgumentException("Illegal Arguments");
    }
    System.out.println("args.length : " + args.length);

    String targetUrl = args[0];
    String proxyHost = args[1];
    int proxyPort = Integer.valueOf(args[2]);

    if (args.length >= 5) {
      String userName = args[3];
      String password = args[4];
      if (userName != null && password != null) {
        System.out.println(userName + " " + password);
        Authenticator.setDefault(new Authenticator() {
          @Override
          protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(userName, password.toCharArray());
          }
        });
      }
    }

    int responseCode = ProxySettingChecker.connectUsingProxy(proxyHost, proxyPort, targetUrl, TIMEOUT);
    if (ProxySettingChecker.isValidResponse(responseCode)) {
      System.out.println("OK Setting");
      return;
    }
    System.err.println("NG Setting");
    System.exit(responseCode);
  }

  private static int connectUsingProxy(String proxyHost, int proxyPort, String url, int timeout) {
    try {
      URL targetUrl = new URL(url);
      Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));
      HttpURLConnection connection = (HttpURLConnection) targetUrl.openConnection(proxy);
      connection.setConnectTimeout(timeout);
      connection.setReadTimeout(timeout);
      connection.setRequestMethod("HEAD");
      return connection.getResponseCode();
    } catch (IOException ex) {
      return -1;
    }
  }

  private static boolean isValidResponse(int responseCode) {
    return 200 <= responseCode && responseCode <= 399;
  }
}

Main.java

呼び出し側
//import java.io.BufferedReader;
//import java.io.InputStreamReader;

public class Main {
  public static void main(String[] args) {
    System.out.println("Test1-1 : OK");
    try {
      execute("java", "-jar", "ProxySettingChecker.jar", "http://www.msn.com/ja-jp","192.168.211.123", "3128", "admin", "password");
      Thread.sleep(1000L);
      System.out.println();
    } catch (Exception ex) {
      ex.printStackTrace();
    }

    System.out.println("Test1-2 : NG");
    try {
      execute("java", "-jar", "ProxySettingChecker.jar", "http://www.msn.com/ja-jp","192.168.211.123", "3128", "admin", "dummy");
      Thread.sleep(1000L);
      System.out.println();
    } catch (Exception ex) {
      ex.printStackTrace();
    }

    System.out.println("Test1-3 : NG");
    try {
      execute("java", "-jar", "ProxySettingChecker.jar", "http://www.msn.com/ja-jp","192.168.211.123", "3128", "dummy", "password");
      Thread.sleep(1000L);
      System.out.println();
    } catch (Exception ex) {
      ex.printStackTrace();
    }

    System.out.println("Test1-4 : NG");
    try {
      execute("java", "-jar", "ProxySettingChecker.jar", "http://www.msn.com/ja-jp","192.168.211.123", "3128");
      Thread.sleep(1000L);
      System.out.println();
    } catch (Exception ex) {
      ex.printStackTrace();
    }

    System.out.println("Test2-1 : NG");
    try {
      execute("java", "-jar", "ProxySettingChecker.jar", "http://www.msn.com/ja-jp","192.168.211.1", "3128", "admin", "password");
      Thread.sleep(1000L);
      System.out.println();
    } catch (Exception ex) {
      ex.printStackTrace();
    }

    System.out.println("Test2-2 : NG");
    try {
      execute("java", "-jar", "ProxySettingChecker.jar", "http://www.msn.com/ja-jp","192.168.211.123", "3129", "admin", "password");
      Thread.sleep(1000L);
      System.out.println();
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }

  private static void execute(String... commands) {
    ProcessBuilder processBuilder = new ProcessBuilder(commands);

    try {
      Process process = processBuilder.start();
      int result = process.waitFor();
      System.out.println("Result Code : " + result);
      if (result != 0) {
        System.err.println("Error!");
      }
//      try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
//        String line;
//        while ((line = bufferedReader.readLine()) != null) {
//          System.out.println(line);
//        }
//      }
//      try (BufferedReader errorBufferedreader = new BufferedReader(new InputStreamReader(process.getErrorStream()))) {
//        String errorLine;
//        while ((errorLine = errorBufferedreader.readLine()) != null) {
//          System.err.println(errorLine);
//        }
//      }
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

出力結果

Test1-1 : OK
Result Code : 0

Test1-2 : NG
Result Code : 407
Error!

Test1-3 : NG
Result Code : 407
Error!

Test1-4 : NG
Result Code : 407
Error!

Test2-1 : NG
Result Code : -1
Error!

Test2-2 : NG
Result Code : -1
Error!

関連記事

Java で ping を考える

https://blogs.yahoo.co.jp/dk521123/37019179.html

Java から別のJava(JARファイル)を実行するには...

https://blogs.yahoo.co.jp/dk521123/37181644.html

【Java】プロキシ設定のチェック機能を考える ~ その1 ~

$
0
0

■ はじめに

プロキシ設定のチェックを以下の関連記事であるようなコードで試してみた。
Java で ping を考える
https://blogs.yahoo.co.jp/dk521123/37019179.html
しかし、以下の「問題点」が出た。

問題点

 Basic認証が設定してあるプロキシサーバで
Basic認証が認証が通った後に、認証NGになる設定をおこなった際に
前回のBasic認証が通っているのでエラーにならない

■ 原因

 * 以下のバグ表に載ってる問題で、2017/10/23現在でも解決できていない模様「Resolution: Unresolved」
JDK-6626700 : Request for ability to turn off authentication caching in HttpURLConnection
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6626700

解決策

sun の API を使うと解決できる
import sun.net.www.protocol.http.AuthCacheValue;
import sun.net.www.protocol.http.AuthCacheImpl;

・・・略・・・

AuthCacheValue.setAuthCache(new AuthCacheImpl());

■ サンプル

https://blogs.yahoo.co.jp/dk521123/36962466.html
でプロキシ環境を構築する。以下の環境下を想定する。

 * プロキシサーバ   :192.168.211.123
 * プロキシサーバポート:3128
 * 認証ID       :admin
 * 認証パスワード   :password

環境設定(Eclipse)

* Eclipseの場合、エラーになるので、以下のように対処
 * プロジェクト名を右クリックし、
   [Properties]-[Java Compiler]-[Errors/Warnings]-[Deprecated and restricted API]で
  「Forbidden reference(access rules)」で「Error」⇒「Error」以外(「Warning」「Info」「Ignore」)にする

NetworkChecker.java

https://blogs.yahoo.co.jp/dk521123/37019179.html
をベースに作成する
import java.io.IOException;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.PasswordAuthentication;
import java.net.Proxy;
import java.net.URL;

public class NetworkChecker {

  public static void main(String[] args) {
    System.out.println(
        "Result(OK) : " + ping("http://freerice.com/#/english-vocabulary/1528", 3000, "192.168.211.123", 3128, "admin", "password"));
    System.out.println("Result(NG) : " + ping("http://freerice.com/#/english-vocabulary/1528", 3000, "192.168.211.123", 3128, "admin", "password1"));
  }

  public static boolean ping(String url, int timeout, String proxyHost, int proxyPort, String userName,
      String password) {
    if (userName != null && password != null) {
      // See https://qiita.com/kaakaa_hoe/items/d4fb11a3af035a287972
      System.setProperty("jdk.http.auth.tunneling.disabledSchemes", "");

      // ★ここに注目★
      NetworkChecker.clearAuthCache();

      Authenticator.setDefault(new Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
          return new PasswordAuthentication(userName, password.toCharArray());
        }
      });
    }

    try {
      URL targetUrl = new URL(url);
      HttpURLConnection connection;
      if (proxyHost == null) {
        connection = (HttpURLConnection) targetUrl.openConnection();
      } else {
        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));
        connection = (HttpURLConnection) targetUrl.openConnection(proxy);
      }
      connection.setConnectTimeout(timeout);
      connection.setReadTimeout(timeout);
      connection.setRequestMethod("HEAD");
      int responseCode = connection.getResponseCode();
      System.out.println("Response Code : " + responseCode);
      return (HttpURLConnection.HTTP_OK <= responseCode && responseCode <= 399);
    } catch (IOException exception) {
      return false;
    }
  }

  /**
   * 認証キャッシュのクリア(★ここに注目★).
   */
  @SuppressWarnings("restriction")
  private static void clearAuthCache() {
    sun.net.www.protocol.http.AuthCacheValue.setAuthCache(new sun.net.www.protocol.http.AuthCacheImpl());
  }
}

出力結果

Response Code : 200
Result(OK) : true
Response Code : 407
Result(NG) : false



関連記事

【Java】プロキシ設定のチェック機能を考える ~ その2 ~

https://blogs.yahoo.co.jp/dk521123/37181766.html

【Linux】プロキシサーバソフト [2] ~ Squid / Basic認証編 ~

https://blogs.yahoo.co.jp/dk521123/36962466.html

【Raspberry PI】XRDP で、ラズパイにリモートデスクトップ接続する

$
0
0

■ 環境設定

構築環境

 * OS : Windows10
 * Raspberry PI :raspberrypi3 raspbian Jessie (Debian8ベース)

インストール

# realvnc-vnc-serverを削除
sudo apt-get purge realvnc-vnc-server

# インストール
sudo apt-get update
sudo apt-get install xrdp

日本語キーボード設定

cd /etc/xrdp/

sudo wget http://w.vmeta.jp/temp/km-0411.ini

sudo ln -s km-0411.ini km-e0200411.ini
sudo ln -s km-0411.ini km-e0010411.ini
sudo ln -s km-0411.ini km-e0210411.ini

sudo service xrdp restart

■ リモートデスクトップ接続

ifconfig などで、IPアドレスをメモっとく

Windows側

[1] Windowsマーク + R で、ファイル名を指定して実行ダイアログ画面で名前に「mstsc」を入力
[2] リモートデスクトップ接続画面でIPアドレスを入力し接続
[3] 以下を入力(ユーザ名、パスワードはデフォルトの場合)
  + Session :Xorg (そのまま)
  + username:pi
  + password:raspberry

 => ラズパイの画面がでてきたらOK


関連記事

【Linux】 XRDP

https://blogs.yahoo.co.jp/dk521123/34967040.html

XRDP に関するトラブルシューティング

https://blogs.yahoo.co.jp/dk521123/35018361.html

【コマンド】lsofコマンド

$
0
0

■ lsof

LiSt Open Files : 開いているファイル群を列挙する
 * 待機ポートやプロセスで開かれているファイルを確認する

■ 用途

 * ファイルのオープンなどで別プロセスがつかんでいる場合の調査
 * 特定ポートを使用しているプロセスの調査

■ 環境設定

 * 「lsof」でコマンドが受け入れなかった場合

インストール

RedHat系
sudo yum -y install lsof
Debian系
sudo apt-get install lsof

インストールできない場合

http://shohonoho.g.hatena.ne.jp/talk/20110118/1295336715
より
netstat -tanp

■ コマンド例

ポート80番を使用しているプロセスを確認

sudo lsof -i:80


【Java】 キーストア / トラストストア

$
0
0

用語の整理

キーストア (Key Store)

 * 鍵データを保管するためのファイル

トラストストア (Trust Store)

 * Javaアプリがサーバ側の証明書を検証するために、サーバ側の証明書を管理するファイル
 * デフォルトのトラストストア : %JAVA_HOME%/lib/security/cacerts

参考文献

Oracle本家のドキュメント

https://docs.oracle.com/cd/E19416-01/820-5959/ggffo/index.html

関連記事

Javaで、キーストアから証明書を追加・削除などを行う

https://blogs.yahoo.co.jp/dk521123/37097725.html

X.500 識別名(X500Principal)の文字列形式をCNやOUなど個別に扱えるようにする

https://blogs.yahoo.co.jp/dk521123/37112129.html

Javaで、キーストアファイルをロードし、一覧表示する

https://blogs.yahoo.co.jp/dk521123/37020660.html

Javaオブジェクト「X509Certificate」 ⇔ 証明書ファイル

https://blogs.yahoo.co.jp/dk521123/36989612.html

SSL証明書の拇印/フィンガープリントを生成するには...

https://blogs.yahoo.co.jp/dk521123/37002407.html

【Java】byte に関するあれこれ

$
0
0

■ byte[] ⇔ 文字列

文字列 => byte[]
byte[] bytes = 【文字列】.getBytes(StandardCharsets.UTF_8);
byte[] => 文字列
String text = new String(【byte[]】, StandardCharsets.UTF_8);

サンプル

import java.nio.charset.StandardCharsets;

public class Main {
  public static void main(String[] args) {
    String target = "This is a sample";
    byte[] targetInBytes = target.getBytes(StandardCharsets.UTF_8);
    String copy = new String(targetInBytes, StandardCharsets.UTF_8);
    System.out.println(target + " = " + copy);
  }
}

【Raspberry PI】ネットワーク周りに関するあれこれ

$
0
0

■ 変更したネットワークを反映させる

# wpa_supplicantを強制終了
sudo wpa_cli -i wlan0 terminate

# systemd のリロード(systemd管理下のファイルをリロードして、依存関係の階層を再構築する)
sudo systemctl daemon-reload

# network の再起動
sudo sytemctl restart networking

補足:用語整理

WPA(Wi-Fi Protected Access)
 * 無線LANの暗号化方式の規格
サプリカント(Supplicant)
 * Supplicant = 嘆願者、懇願者
 * ネットワーク上のユーザ認証・端末認証において、認証要求する側の機器又はソフトウェア
PSK (Pre Shared Key = 事前共有鍵)
 * 通信を暗号化する際に、事前に共有しておく暗号鍵

【Spark Framework】Spark Framework [4] ~ + GSONを使って REST API を作成する ~

$
0
0

前提条件

http://blogs.yahoo.co.jp/dk521123/36426276.html
のように設定されていること

■ 環境設定

 * 以下の「build.gradle」を参考に、GSONを追加し、
   Eclipseの対象プロジェクトを右クリックし、[Gradle (STS)]-[Refresh Dependencies]を選択

build.gradle

dependencies {
    compile 'com.sparkjava:spark-core:2.6.0'
    compile 'org.slf4j:slf4j-simple:1.7.25'
    compile 'com.google.code.gson:gson:2.8.2' # GSON の追加
    testCompile group: 'junit', name: 'junit', version: '4.+'
}

■ サンプル

Person.java

public class Person {
  private long id;
  private String name;

  public Person(long id, String name) {
    this.id = id;
    this.name = name;
  }

  public long getId() {
    return id;
  }
  public void setId(long id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}

HelloWorld.java

import static spark.Spark.get;

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

import com.google.gson.Gson;

import spark.Request;
import spark.Response;

public class HelloWorld {

  public static void main(String[] args) {
    Gson gson = new Gson();
    get("/", HelloWorld::getPeople, gson::toJson);
  }

  private static List<Person> getPeople(Request request, Response response) {
    List<Person> people = new ArrayList<>();
    people.add(new Person(1L, "Mike"));
    people.add(new Person(2L, "Tom"));
    people.add(new Person(3L, "Kevin"));
    return people;
  }
}

出力結果

ブラウザを立ち上げて、以下のURLにアクセスする
[[http://localhost:4567]]
[{"id":1,"name":"Mike"},{"id":2,"name":"Tom"},{"id":3,"name":"Kevin"}]

関連記事

Spark Framework [1] ~ 入門編 / 環境構築(Gradle Project)からHello Worldまで ~

http://blogs.yahoo.co.jp/dk521123/36426276.html

【Java】JSON ~JSONライブラリ:GSONを用いた場合~

https://blogs.yahoo.co.jp/dk521123/32813165.html

【Java】【Eclipse】Gradleプラグイン ~ Buildship ~

$
0
0

■ はじめに

 * 以下の関連記事で、プラグイン「Gradle IDE Pack 3.8.X+1.0.X+2.2.X」をいれたのだが
   Eclipseを立ち上げると以下の「ダイアログ表示」が表示されるので、Buildship を調べてみる
https://blogs.yahoo.co.jp/dk521123/36426276.html

ダイアログ表示

Migration from STS Gradle to Buildship
【訳】STS GradleからBuildshipへの移行

The STS Gradle plugin is under minimal maintenance and may be discontinued in the future.
【訳】STS gradleプラグインは、最小限のメンテナンスで行われており、今後継続が中断される可能性があります。

A doument explaining the migration process from STS Gradle to Buildship can be found here.
【訳】STS GradleからBuildshipへの移行プロセスを説明してあるドキュメントは、こちら(以下のURL)です。
リンク「here」 をクリックすると以下のURLに繋がる
https://github.com/eclipse/buildship/wiki/Migration-guide-from-STS-Gradle-to-Buildship


関連記事

Spark Framework [1] ~ 入門編 / 環境構築(Gradle Project)からHello Worldまで ~

https://blogs.yahoo.co.jp/dk521123/36426276.html

【Java】ラムダ式 ~ 基本編 / メソッド参照 ~

$
0
0

メソッド参照 (method reference)

 * Java 1.8 から追加された機能

構文

コロン2つ「::」
【クラス名】::【メソッド名】

【インスタンス名】::【メソッド名】


関連記事

ラムダ式 ~入門編~

https://blogs.yahoo.co.jp/dk521123/34188394.html

ラムダ式 ~ 基本編 / Stream API ~

https://blogs.yahoo.co.jp/dk521123/34192426.html

Spark Framework + GSONを使って REST API を作成する

https://blogs.yahoo.co.jp/dk521123/37203509.html

【Java】関数型インターフェイス

$
0
0

■ 関数型インタフェース

 * Java 1.8 から追加
 * 抽象メソッドを1つ持っているインターフェイス
 * defaultやstaticは対象外

■ FunctionalInterfaceアノテーション / @FunctionalInterface

API仕様
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/FunctionalInterface.html
 * 関数型インタフェースとすることを目的としていることを示すために使われる情報目的の注釈型
 * インタフェースが、java.lang.Objectのpublicメソッドの1つをオーバーライドする抽象メソッドを宣言する場合も、
   それはインタフェースの抽象メソッド数に反映されません
    => 理由は、そのインタフェースのいずれかの実装にjava.lang.Objectまたは他の場所からの実装が含まれるから
 * コンパイラは関数型インタフェースの定義を満たすどのインタフェースも関数型インタフェースとして扱います。

@FunctionalInterface
public interface IHelloWorld {
  String sayHello(String name);
}
NG (コンパイルエラー)
@FunctionalInterface
public interface IHelloWorld {
  String sayHello(String name);
  void hello(String name);
}

■ java.util.functionパッケージ

[1] Function<T,R> R apply(T t)

* 引数が1つで、戻り値がある
import java.util.function.Function;

public class Demo {
  public static void main(String[] args) {
    // Function
    Function<String, String> function = (name) -> {
      return "Hello, " + name + "!";
    };
    String result = function.apply("Mike");
    System.out.println(result); // Hello, Mike!
  }
}

[2] Consumer<T> void accept(T t)

* 引数が1つで、戻り値がない
import java.util.function.Consumer;

public class Demo {
  public static void main(String[] args) {
    // Consumer
    Consumer<String> consumer = (name) -> {
      System.out.println("Hi, " + name + "!!"); // Hi, Tom!!
    };
    consumer.accept("Tom");
  }
}

[3] Predicate<T> boolean test(T t)

引数が1つで、戻り値がboolean型
import java.util.function.Predicate;

public class Demo {
  public static void main(String[] args) {
    // Predicate
    Predicate<String> predicate = (name) -> {
      return "Kevin".equals(name);
    };
    String name = "Kevin";
    System.out.println("He is " + name + "? => " + predicate.test(name)); // He is Kevin? => true
  }
}

[4] Supplier<T> T get()

引数がなくて、戻り値がある
import java.util.function.Supplier;

public class Demo {
  public static void main(String[] args) {
    // Supplier
    Supplier<String> supplier = () -> {
      return "Happy New Year, Sam!";
    };
    System.out.println("Result => " + supplier.get()); // Result => Happy New Year, Sam!
  }
}


関連記事

【Java】 匿名内部クラス / 無名内部クラス

https://blogs.yahoo.co.jp/dk521123/37174760.html

【Java】メソッド参照

https://blogs.yahoo.co.jp/dk521123/37204926.html

【Java】ラムダ式 ~入門編~

https://blogs.yahoo.co.jp/dk521123/34188394.html

【Java】コマンドライン引数のパーサー

【Spark Framework】Spark Framework + args4j を使ってコマンドライン引数から設定値を変更

$
0
0

■ はじめに

 コマンドライン引数のパーサー である args4j を使って、
ポートなどのSpark Frameworkの設定値を変更する。

 なお、 args4j については、以下の関連記事を参照のこと。
https://blogs.yahoo.co.jp/dk521123/37206429.html

■ 前提条件

https://blogs.yahoo.co.jp/dk521123/37204914.html
のように設定されていること

■ 環境設定

 * 以下の「build.gradle」を参考に、args4jを追加し、
   Eclipseの対象プロジェクトを右クリックし、[Gradle]-[Refresh Gradle Project]を選択
build.gradle
dependencies {
    # 途中略

    compile 'com.sparkjava:spark-core:2.6.0'
    compile 'org.slf4j:slf4j-simple:1.7.25'
    compile 'com.google.code.gson:gson:2.8.2'
    compile 'args4j:args4j:2.33' # args4j の追加

    // Use JUnit test framework
    testImplementation 'junit:junit:4.12'
}

■ サンプル

DemoService.java

package com.sample.spark;

import com.google.gson.Gson;
import com.sample.spark.controllers.HelloWorldController;

import spark.Service;

public class DemoService {
  public static void main(String[] args) {
    ServiceConfig config = ServiceConfig.create(args);
    DemoService sparkService = new DemoService(config);
    sparkService.initialize();
    sparkService.start();
  }

  private Service service;

  private DemoService(ServiceConfig config) {
    this.service = Service.ignite().port(config.getPort()).threadPool(config.getMaxThreads());
  }

  public void initialize() {
    Gson gson = new Gson();
    HelloWorldController controller = new HelloWorldController();

    this.service.get("/", controller::getPeople, gson::toJson);
  }

  public void start() {
  }
}

ServiceConfig.java

package com.sample.spark;

import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.Option;

public class ServiceConfig {
  private static final int DEFAULT_PORT = 8080;
  private static final int DEFAULT_MAX_THREADS = 6;
  private static final boolean DEFAULT_IS_DEBUG = false;

  @Option(name = "-p", aliases="--port", required=false, usage="Port this server listens on")
  private int port;

  @Option(name = "-t", aliases="--threads", required=false, usage="Max Threads")
  private int maxThreads;

  @Option(name="-d", aliases="--debug", required=false, usage="debug option")
  private boolean isDebug;

  private ServiceConfig() {
    this.port = DEFAULT_PORT;
    this.maxThreads = DEFAULT_MAX_THREADS;
    this.isDebug = DEFAULT_IS_DEBUG;
  }

  public int getPort() {
    return this.port;
  }
  public void setPort(int port) {
    this.port = port;
  }

  public int getMaxThreads() {
    return this.maxThreads;
  }
  public void setMaxThreads(int maxThreads) {
    this.maxThreads = maxThreads;
  }

  public boolean isDebug() {
    return this.isDebug;
  }
  public void setDebug(boolean isDebug) {
    this.isDebug = isDebug;
  }

  public static ServiceConfig create(String[] args) {
    if (args == null || args.length == 0) {
      return new ServiceConfig();
    }

    try {
      ServiceConfig serviceConfig = new ServiceConfig();
      CmdLineParser parser = new CmdLineParser(serviceConfig);
      parser.parseArgument(args);
      return serviceConfig;
    } catch (CmdLineException ex) {
      return new ServiceConfig();
    }
  }
}

HelloWorldController.java

package com.sample.spark.controllers;

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

import com.sample.spark.models.Person;

import spark.Request;
import spark.Response;

public class HelloWorldController {
  public List<Person> getPeople(Request request, Response response) {
    List<Person> people = new ArrayList<>();
    people.add(new Person(1L, "Mike"));
    people.add(new Person(2L, "Tom"));
    people.add(new Person(3L, "Kevin"));
    return people;
  }
}

Person.java

package com.sample.spark.models;

public class Person {
  private long id;
  private String name;

  public Person(long id, String name) {
    this.id = id;
    this.name = name;
  }

  public long getId() {
    return id;
  }
  public void setId(long id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}

関連記事

Spark Framework + GSONを使って REST API を作成する

https://blogs.yahoo.co.jp/dk521123/37203509.html

【Java】コマンドライン引数のパーサー

https://blogs.yahoo.co.jp/dk521123/37206429.html

【Spark Framework】静的ファイルを設定するには...

$
0
0

■ 設定

[1] Eclipse で対象パッケージ名を右クリックし、[New]-[Source folder]を選択
[2] 「Folder name」欄に『src/main/resources』を入力し、「Finish」ボタン押下
[3] [2]で作成した「src/main/resources」を右クリックし、[New]-[Other...][General]-[Folder]を選択
[4] 「Folder name」欄に『public』を入力し、「Finish」ボタン押下
 => この『public』配下に、静的ファイル(今回は「index.html」)を格納する

■ サンプル

HelloWorld.java

import static spark.Spark.staticFiles;

public class HelloWorld {

  public static void main(String[] args) {
    staticFiles.location("/public");
  }
}

index.html

<html><body>
Hello World!!!!!</body></html>


関連記事

【Spark Framework】初期設定 ~ 環境構築(Gradle Project)からHello Worldまで / 新版 ~

https://blogs.yahoo.co.jp/dk521123/37204914.html

【Spark Framework】REST API + knockout.jsを使って データバインドする

https://blogs.yahoo.co.jp/dk521123/37208334.html
Viewing all 860 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>