Symfoware

Symfowareについての考察blog

java 8 jjsスクリプト sshトンネルを経由し、MariaDBのデータを取得する

java8から搭載されたjjsスクリプトを試しています。
OpenJDK 8 jjsコマンドでJavaScriptを実行する


SSHトンネルを経由してデータベースに接続できることを知りました。
HeidiSQL SSH tunnel経由でMySQL(MariaDB)に接続する

jjsスクリプトでデータベースに接続する方法もわかりました。
java 8 jjsスクリプト JDBCドライバを使用してデータベースに接続する


これらを踏まえ、jjsスクリプトを使用し、sshトンネル経由でMariaDBのデータを取得してみます。
こちらを参考にさせていただきました。
JDBCでSSHトンネルを経由してMySQLに接続する方法



jsch



javaでssh接続を行うには、jschを使用するのが良さそうです。
http://www.jcraft.com/jsch/

jsch-0.1.54.jarをダウンロードしました。

726_01.png


jsch-0.1.54.jarをこれから作成するjjsスクリプトと同じ階層にコピーしておきます。





サンプル




ホスト:192.168.1.103

sshユーザー:sshuser
sshパスワード:sshuser123
sshポート:22

データベースユーザー:root
データベースパスワード:P@ssw0rd
データベース名:sample
テーブル:test




上記の条件で接続してみます。

・sample.js


  1. var jsch = new com.jcraft.jsch.JSch()
  2. // ユーザー、サーバー名、ポートを指定
  3. var session = jsch.getSession('sshuser', '192.168.1.103', 22)
  4. // ssh接続のパスワードを指定
  5. session.setPassword('sshuser123')
  6. var config = new java.util.Properties()
  7. config.put("StrictHostKeyChecking", "no")
  8. session.setConfig(config)
  9. session.connect()
  10. // 3307 <-> 3036でsshトンネルを生成
  11. var remoteHost = "127.0.0.1"
  12. var localPort = 3307
  13. var remotePort = 3306
  14. session.setPortForwardingL(localPort, remoteHost, remotePort)
  15. // データベース接続
  16. var prop = new java.util.Properties()
  17. prop.setProperty('user', 'root')
  18. prop.setProperty('password', 'P@ssw0rd')
  19. // ポート番号の指定は「3307」であることに注意
  20. var url = "jdbc:mariadb://localhost:3307/sample"
  21. var driver = new org.mariadb.jdbc.Driver()
  22. var con = driver.connect(url, prop)
  23. var stmt = con.createStatement()
  24. var rs = stmt.executeQuery('select * from test')
  25. while(rs.next()){
  26.     print(rs.getInt('id') + ':' + rs.getString('item'))
  27. }
  28. session.disconnect()
  29. print('ok')





JDBCドライバーとjschのクラスパスを指定して実行。


$ jjs -cp mariadb-java-client-1.5.6.jar:jsch-0.1.54.jar sample.js
1:test1
2:test2
3:test3
4:test4
5:test5
ok




ちゃんとsshトンネル経由でデータベースに接続できたようです。



【参考URL】

JDBCでSSHトンネルを経由してMySQLに接続する方法

HeidiSQL SSH tunnel経由でMySQL(MariaDB)に接続する

java 8 jjsスクリプト JDBCドライバを使用してデータベースに接続する

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/01/15(日) 22:01:31|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

java 8 jjsスクリプト http接続とjsonデータのデコード

java8から搭載されたjjsスクリプトを試しています。
OpenJDK 8 jjsコマンドでJavaScriptを実行する

http接続を実行し、json形式のデータを取得。
取得したjsonデータをパースし、表示してみます。


サーバー側のソース



phpで適当にJSONデータを返却するプログラムを準備しておきました。

・sample.php


  1. <?php
  2. $t = [
  3.     'a' => '日本語',
  4.     'b' => 'テストです',
  5.     'c' => [
  6.         'c-1' => 'テスト1',
  7.         'c-2' => 'テスト2',
  8.         'c-3' => 'テスト3',
  9.     ],
  10. ];
  11. echo json_encode($t);




アクセスすると、こんな表示になります。

725_01.png





jjsスクリプト




java.net.URLを使用してサーバー側のリソースを取得。
JavaでのHttpClientサンプル

JSON.parseで取得したjsonな文字列をデコードします。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON



・sample.js


  1. // サーバーからデータを取得
  2. var url = new java.net.URL('http://192.168.1.103/sample.php')
  3. var con = url.openConnection()
  4. con.setRequestMethod("GET")
  5. // 取得したデータを文字列として取得
  6. var isr = new java.io.InputStreamReader(con.getInputStream(), java.nio.charset.StandardCharsets.UTF_8)
  7. var reader = new java.io.BufferedReader(isr)
  8. var json_value = ''
  9. while ((line = reader.readLine()) != null) {
  10.     json_value += line
  11. }
  12. // 文字列からオブジェクトに変換し表示
  13. var json = JSON.parse(json_value)
  14. print(json['a'])
  15. print(json['b'])
  16. print(json['c'])
  17. print(json['c']['c-1'])
  18. print(json['c']['c-2'])
  19. print(json['c']['c-3'])




ちゃんとJSON形式の文字列が連想配列に変換できたようです。


$ jjs sample.js
日本語
テストです
[object Object]
テスト1
テスト2
テスト3





【参考URL】

JavaでのHttpClientサンプル

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/01/15(日) 21:27:59|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

java 8 jjsスクリプト JDBCドライバを使用してデータベースに接続する

java8から搭載されたjjsスクリプトを試しています。
OpenJDK 8 jjsコマンドでJavaScriptを実行する

JDBCドライバをロードし、データベースに接続。
データの取得が行えるか試してみます。


JDBCドライバの入手



MariaDBへの接続を試してみます。

まず、こちらを参考にJDBCドライバを入手しました。
MariaDB 10にJDBCドライバ(MariaDB Connector/J 1.1.9)で接続する

ダウンロードURLはこちら。


Download MariaDB Connector/Jをクリック

724_01.png


Download 1.5.6 Stable Now!をクリック

724_02.png


MariaDB Connector/J .jar をクリック

724_03.png


mariadb-java-client-1.5.6.jarをダウンロードしました。

724_04.png


ダウンロードしたjarファイルは、これから作成するスクリプトファイルと
同じ階層に保存しておきます。




サンプルプログラム




サーバー:192.168.1.103
ユーザー:admin
パスワード:P@ssw0rd
データベース:sample
テーブル:test



上記条件のデータベースに接続するサンプルを書いてみます。


・sample.js


  1. var url = "jdbc:mariadb://192.168.1.103:3306/sample"
  2. var con = java.sql.DriverManager.getConnection(url, 'admin', 'P@ssw0rd')
  3. var stmt = con.createStatement()
  4. var rs = stmt.executeQuery('select * from test')
  5. while(rs.next()){
  6.     print(rs.getInt('id') + ':' + rs.getString('item'))
  7. }
  8. print('ok')




jjsの引数を見ると「-cp」でクラスパスを指定できる模様。
ダウンロードした「mariadb-java-client-1.5.6.jar」を指定して実行するとエラーになります。


$ jjs -cp mariadb-java-client-1.5.6.jar sample.js
Exception in thread "main" java.lang.RuntimeException: java.sql.SQLException:
No suitable driver found for jdbc:mariadb://192.168.1.103:3306/sample




JDBCドライバは使用できないのかな?と悩んでいたところ、この記事を見つけました。
how to specify the CLASSPATH for for jjs/Nashorn javascript?


「-J-Djava.class.path=」でドライバのjarファイルを指定しろとのこと。
-Jオプションは、Java仮想マシン(JVM)に対するオプションのようです。
https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/javac.html


オプションを変更して、再度実行。


$ jjs -J-Djava.class.path=mariadb-java-client-1.5.6.jar sample.js
1:test1
2:test2
3:test3
4:test4
5:test5
ok



ちゃんとデータベースに接続し、データの取得が行えました。






もうひとつのサンプル



せっかく-cpオプションがあるので、この指定だけでデータベースに接続できないか考えてみます。

以前、JDBCドライバについて調べた時のことが役に立ちました。
JDBC over Thriftを作成する その1(JDBCドライバの作り方)


DriverManagerを使用せず、直接対象のJDBCドライバーを生成。
コネクションを取得してやります。


  1. var prop = new java.util.Properties()
  2. prop.setProperty('user', 'admin')
  3. prop.setProperty('password', 'P@ssw0rd')
  4. var url = "jdbc:mariadb://192.168.1.103:3306/sample"
  5. var driver = new org.mariadb.jdbc.Driver()
  6. var con = driver.connect(url, prop)
  7. var stmt = con.createStatement()
  8. var rs = stmt.executeQuery('select * from test')
  9. while(rs.next()){
  10.     print(rs.getInt('id') + ':' + rs.getString('item'))
  11. }
  12. print('ok')




強引ですが、この書き方であれば-cpオプションにJDBCドライバのjarファイルを
指定することで実行可能となります。


$ jjs -cp mariadb-java-client-1.5.6.jar sample.js
1:test1
2:test2
3:test3
4:test4
5:test5
ok





【参考URL】

MariaDB 10にJDBCドライバ(MariaDB Connector/J 1.1.9)で接続する

how to specify the CLASSPATH for for jjs/Nashorn javascript?

https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/javac.html

JDBC over Thriftを作成する その1(JDBCドライバの作り方)

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/01/15(日) 21:14:41|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

OpenJDK 8 jjs javafxの画面を作成する

jjs scriptでjavafxの画面が作れるのですね。
Windowsのバッチファイルにjjs scriptを書く

Ubuntu 16.04 + OpenJDK 8で試してみます。

ソースは参考URLのものそのままです。

・sample.js


  1. load("fx:base.js");
  2. load("fx:controls.js");
  3. load("fx:graphics.js");
  4. $STAGE.title = "Hello World!";
  5. var button = new Button();
  6. button.text = "Say 'Hello World'";
  7. button.onAction = function() print("Hello World!");
  8. var root = new StackPane();
  9. root.children.add(button);
  10. $STAGE.scene = new Scene(root, 300, 250);
  11. $STAGE.show();






実行



普通に実行すると、JavaFX runtime not foundというエラーになります。


$ jjs sample.js
fx:base.js:51:8 Error: JavaFX runtime not found




javafx関連の呼び出しを行いたい場合は、「-fx」オプションを指定します。


$ jjs -fx sample.js
JavaFX is not available.




今度はjavafxが存在しないと怒られました。

Why is JavaFX is not included in OpenJDK 8 on Ubuntu Wily (15.10)?
こちらを参考に、openjfxをインストールします。


$ sudo apt-get install openjfx




再度jjsスクリプトを実行すると、見事画面が表示されました。


$ jjs -fx sample.js



723_01.png



jjsスクリプトでここまで出来るとは...

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/01/12(木) 22:11:27|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

OpenJDK 8 jjs 別のファイルに記載した関数を取り込む

OpenJDK 8のjjsを触ってみています。
OpenJDK 8 jjsコマンドでJavaScriptを実行する


今回は別のファイルに記載した処理を実行する方法を試してみます。
通常のjavaだとimportでしょうか。


サンプル



組み込み関数のloadを使用して、別のファイルを読み込みます。
https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/shell.html


処理を分けたjsファイル

・test.js


  1. function called_func(value) {
  2.     print('hello ' + value)
  3. }




test.jsを読み込むサンプル

・sample.js


  1. // test.jsをロード
  2. load('test.js')
  3. // test.jsの関数を呼び出し
  4. called_func('symfo')





実行してみると、ちゃんとtest.jsの関数が呼び出せていますね。


$ jjs sample.js
hello symfo




ファイルの指定は、相対・絶対パスに加えweb上のリソース(http://www.example.com/test.js)でも良いようです。


【参考URL】

https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/shell.html

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/01/12(木) 22:04:02|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
次のページ