2016年8月27日土曜日

Bluemixコンテナ よく使うコマンド

IBMのBluemix、他のサービスより制限のゆるい無料枠が多く設定されており実験レベルでは全然使えるので重宝している。 (いつまでこれが続くのかわからないが・・・) 以下よく利用するコマンドのまとめ。

Bluemixログイン

cf login -a https://api.ng.bluemix.net

IBM Containers にログイン

cf ic login

名前空間の確認方法

cf ic namespace get

利用できるイメージ一覧を表示

cf ic images

イメージを起動

cf ic run -p 9080 registry.ng.bluemix.net/ibmliberty:latest

実行中のコンテナを表示

cf ic ps

コンテナ一覧

cf ic ps -a

コンテナのPublic IPを要求

2つまで無料で取れる。
cf ic ip request

Public IP一覧

cf ic ip list

Public IPをコンテナに結び付け

cf ic ip bind  {IPアドレス} {コンテナのID}

IPの結び付け解除

cf ic ip unbind {IPアドレス} {コンテナのID}

コンテナを停止

cf ic stop {コンテナのID}

コンテナ削除

cf ic rm {コンテナのID}

Publicイメージを実行

Publicイメージを実行するには一旦privateリポジトリにコピーする。
cf ic cpi nginx registry.ng.bluemix.net/myapp/nginx
cf ic run -d -p 80 registry.ng.bluemix.net/myapp/nginx

2016年8月26日金曜日

mysqldump

mysqldumpで日本語名のテーブルをエクスポートしようと思ったが、指定したものとは別のテーブルがエクスポートされてしまう。 コマンドプロンプトからテーブル名を指定したので文字コードが中でおかしくなっているのかもしれない。 環境はWindows8.1のコマンドプロンプトから、DBはUTF-8で作成している。 今のところ解決方法が見つからず・・・・

2016年8月23日火曜日

JavaからJavaScriptを実行したときのパラメータ受け渡し

JavaでJavaScriptを実行するにはjavax.script.ScriptEngineを使用する。 実行の際にはパラメータを渡したり計算結果を受け取ったりするがそのための方法がリファレンスを読んでもわかりにくかったのでどう受け渡しができるのかを試してみた。

パラメータをひとつづつ渡す
パラメータを渡すにはScriptEngineのputメソッドにJavaScriptでの変数名を指定する。 JavaScript側では通常の変数として利用できる。

try {
  ScriptEngineManager factory = new ScriptEngineManager();
  ScriptEngine e = factory.getEngineByName("js");
  e.put("a", "hello");
  e.put("b", "world");
  
  String script = "ab=a + ' ' +b;";  
  Object ret = e.eval(script);
  Bindings b = e.getBindings(ScriptContext.ENGINE_SCOPE);
  for(String key : b.keySet()) {
    Object v= b.get(key);
    System.out.println("key=" + key + "; value=" + v + " (" + v.getClass() + ")");
  }
} catch (ScriptException ex) {
  ex.printStackTrace();
}
実行結果
key=a; value=hello (class java.lang.String)
key=b; value=world (class java.lang.String)
key=ab; value=hello world (class java.lang.String)

retには最後に実行した式の結果が入る。ここではabの値と同じ。 パラメータをMapで渡す
Mapで渡したパラメータはJavaScript側ではオブジェクトのプロパティとして使用できる。
try {
  ScriptEngineManager factory = new ScriptEngineManager();
  ScriptEngine e = factory.getEngineByName("js");
  Map<String, Object> map = new HashMap();
  map.put("x", "hello");
  map.put("y", "world");
  e.put("map", map);
  
  String script = "x = map.x; xy=map.x+' '+map.y;";  
  Object ret = e.eval(script);
  Bindings b = e.getBindings(ScriptContext.ENGINE_SCOPE);
  for(String key : b.keySet()) {
    Object v= b.get(key);
    System.out.println("key=" + key + "; value=" + v + " (" + v.getClass() + ")");
  }
} catch (ScriptException ex) {
  ex.printStackTrace();
}
実行結果
key=map; value={x=hello, y=world} (class java.util.HashMap)
key=x; value=hello (class java.lang.String)
key=xy; value=hello world (class java.lang.String)

パラメータをListで渡す
Listで渡したパラメータはJavaScript側では配列として使用できる。
try {
  ScriptEngineManager factory = new ScriptEngineManager();
  ScriptEngine e = factory.getEngineByName("js");
  List<String> list = new ArrayList();
  list.add("Tokyo");
  list.add("Nagoya");
  list.add("Osaka");
  e.put("list", list);
  
  String script = "list0=list[0]; list1=list[1]; list2=list[2]; length=list.size();";  
  Object ret = e.eval(script);
  Bindings b = e.getBindings(ScriptContext.ENGINE_SCOPE);
  for(String key : b.keySet()) {
    Object v= b.get(key);
    System.out.println("key=" + key + "; value=" + v + " (" + v.getClass() + ")");
  }
} catch (ScriptException ex) {
  ex.printStackTrace();
}
実行結果
key=list; value=[Tokyo, Nagoya, Osaka] (class java.util.ArrayList)
key=list0; value=Tokyo (class java.lang.String)
key=list1; value=Nagoya (class java.lang.String)
key=list2; value=Osaka (class java.lang.String)
key=length; value=3 (class java.lang.Integer)

Listの要素にMapを渡すこともできる。
try {
  ScriptEngineManager factory = new ScriptEngineManager();
  ScriptEngine e = factory.getEngineByName("js");
  List<Map<String, Object>> list = new ArrayList();
  Map<String, Object> map1 = new HashMap();
  map1.put("v1", 100);
  map1.put("v2", 200);
  map1.put("v3", 300);
  lista.add(map1);
  Map map2 = new HashMap();
  map2.put("v1", 110);
  map2.put("v2", 210);
  map2.put("v3", 310);
  lista.add(map2);
  e.put("list", list);
  
  String script = "list0_v1=lista[0].v1; list1_v1=lista[1].v1;";  
  Object ret = e.eval(script);
  Bindings b = e.getBindings(ScriptContext.ENGINE_SCOPE);
  for(String key : b.keySet()) {
    Object v= b.get(key);
    System.out.println("key=" + key + "; value=" + v + " (" + v.getClass() + ")");
  }
} catch (ScriptException ex) {
  ex.printStackTrace();
}
実行結果
key=list; value=[{v1=100, v2=200, v3=300}, {v1=110, v2=210, v3=310}] (class java.util.ArrayList)
key=list0_v1; value=100 (class java.lang.Integer)
key=list1_v1; value=110 (class java.lang.Integer)