2014年9月9日火曜日

MySQLでERROR:1093を回避する

まー些細なことなんですけどね。

エラーになる(as tmpが意味をなしてない)
update hoge set code = 0
where id IN 
(select id from hoge as tmp where id = 1 group by id  order by id)
;

こんなエラー
ERROR 1093 (HY000): You can't specify target table 'hoge' for update in 
FROM clause
mysqlって同じテーブルに対するサブクエリからの操作ができないんですよね。

リファレンスマニュアルより
http://dev.mysql.com/doc/refman/5.1/ja/subquery-errors.html

サブクエリは、SELECT ステートメント同様 UPDATE と DELETE ステートメント内で正当なので、UPDATE ステートメント内で、割り当ての為にサブクエリを利用する事ができます。しかし、同じテーブルを(この場合、テーブル t1)サブクエリの FROM 条項と更新ターゲットの両方に対して利用する事はできません。

ではどうするかというと、いっこ別に fromでtmpを受け取ってあげれば実はOK

うまくいく
update hoge set code = 0
where id IN (
select id from 
(select id from hoge where id = 1 group by id  order by id) as tmp
)
;

2014年6月30日月曜日

ImageMagickのコマンドラインツールで画像の情報をさくっと見てみる

環境はCentOS 6系 ImageMagick入れる
$ sudo yum install ImageMagick
identifyコマンドでチェック
$ identify -verbose newwindow.png

Image: newwindow.png
  Format: PNG (Portable Network Graphics)
  Class: DirectClass
  Geometry: 11x9+0+0
  Resolution: 72x72
  Print size: 0.152778x0.125
  Units: Undefined
  Type: PaletteMatte
  Endianess: Undefined
  Colorspace: RGB
  Depth: 8-bit
  Channel depth:
    red: 8-bit
    green: 8-bit
    blue: 8-bit
    alpha: 1-bit
  Channel statistics:
    red:
      min: 117 (0.458824)
      max: 255 (1)
      mean: 207.97 (0.815567)
      standard deviation: 58.2078 (0.228266)
      kurtosis: -1.58905
      skewness: -0.506753
    green:
      min: 0 (0)
      max: 255 (1)
      mean: 170.879 (0.670113)
      standard deviation: 108.467 (0.425361)
      kurtosis: -1.28129
      skewness: -0.68968
    blue:
      min: 0 (0)
      max: 255 (1)
      mean: 170.879 (0.670113)
      standard deviation: 108.467 (0.425361)
      kurtosis: -1.28129
      skewness: -0.68968
    alpha:
      min: 0 (0)
      max: 255 (1)
      mean: 167.424 (0.656566)
      standard deviation: 121.088 (0.474855)
      kurtosis: -1.56516
      skewness: 0.659425
  Image statistics:
    Overall:
      min: 0 (0)
      max: 255 (1)
      mean: 159.326 (0.624807)
      standard deviation: 111.088 (0.435638)
      kurtosis: -1.49685
      skewness: -0.508195
  Alpha: rgba(255,255,255,0)   #FFFFFF00
  Histogram:
        16: (117,117,117,255) #757575 grey46
        24: (153,  0,  0,255) #990000 rgba(153,0,0,1)
        34: (255,255,255,  0) #FFFFFF00 rgba(255,255,255,0)
        25: (255,255,255,255) #FFFFFF white
  Rendering intent: Undefined
  Gamma: 0.45
  Interlace: None
  Background color: white
  Border color: rgba(223,223,223,1)
  Matte color: grey74
  Transparent color: none
  Page geometry: 11x9+0+0
  Dispose: Undefined
  Iterations: 0
  Compression: Zip
  Orientation: Undefined
  Properties:
    date:create: 2014-06-30T19:11:35+09:00
    date:modify: 2014-06-30T19:11:35+09:00
    signature: 2c79c5cc4298064485707a3e8c1e0ceba9f7241dd7366ff9a9dcb505a8b14936
    Software: Adobe ImageReady
  Artifacts:
    verbose: true
  Tainted: False
  Filesize: 220b
  Number pixels: 99b
  Version: ImageMagick 6.5.4-7 2014-02-10 Q16 OpenMP http://www.imagemagick.org
ずらーっとでてくる 例えば色空間(RGBとかCMYKとか)だったら
identify -verbose newwindow.png |grep Colorspace
  Colorspace: RGB
Colorspaceを見ればよいね。

2014年6月24日火曜日

jmxtermで手軽にJMX経由でmbeanの値を見てみる

ちょっと凝ったことをしたいときは、Javaだったり、JRubyなんかでスクリプト書いたほうがいいと思うんだけど。。。

単純に特定の値を見たい、そんなときはコマンドラインでカジュアルにチェックできると嬉しいよね、ってことで、jmxtermです。

ちなみに、グラフとか見たい時はJConsoleもいいけど、VisualVMのほうが見た目がよいね。最近のJavaならJAVA_HOME/bin配下にjvisualvmってのがあるから、そいつです。

 (閑話休題)

というわけで、チートシート風に。例では、hazelcastの値を取っていますが、別にhazelcastでなくてももちろんかまいません。

JMXを有効にするには、最低4つJVMの起動パラメータに追加してください。
(あたりまえだけど、外に晒される環境でああれば、適切なアクセス制限してください)

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=適当に
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

で、JVMを起動させたら、繋いでみる。
インタラクティブシェルとして操作もできるけど、パイプからコマンド投げたほうがなにかと便利。
javaが実行できる環境で叩いてください。これはMacで使用している例。

// ドメイン一覧
echo domains | java -jar ./jmxterm-1.0-alpha-4-uber.jar -l host:port
 
// bean一覧
echo beans -d com.hazelcast | java -jar ./jmxterm-1.0-alpha-4-uber.jar -l host:port
 
// info取得
echo 'info -b instance=sessions,name=hoge,type=IMap -d com.hazelcast' | java -jar ./jmxterm-1.0-alpha-4-uber.jar -l host:port
 
// 対象の値全部
echo 'get -b instance=sessions,name=hoge,type=IMap -d com.hazelcast *' | java -jar ./jmxterm-1.0-alpha-4-uber.jar -l host:port
 
// 特定の値
echo 'get -b instance=sessions,name=hoge,type=IMap -d com.hazelcast localHeapCost' | java -jar ./jmxterm-1.0-alpha-4-uber.jar -l host:port
 
// keyは要らんからvalueだけ
echo 'get -b instance=sessions,name=hoge,type=IMap -d com.hazelcast -s localHeapCost' | java -jar ./jmxterm-1.0-alpha-4-uber.jar -l host:port


らくちんですなー

2014年5月16日金曜日

Excelからのcsvをjava.nioで読んだらMalformedInputException

環境

  • Mac OS X Lion
  • Java 7
  • 元ファイルは素性のしれないxlsx
  • Excel 2011

経緯


素性のしれないxlsxをExcelでcsvにした

こんな読み込みをしていて
こんな例外が

java.nio.charset.MalformedInputException: Input length = 1

元のファイルを見てみる

$ file --mime fuga.csv
fuga.csv: text/plain; charset=unknown-8bit

unknownとかいっちゃってる。

sublime Textで、UTF-8 で保存しなおす。

$ file --mime fuga.csv
fuga.csv: text/plain; charset=utf-8

わーい。
これで読み込めた。


追記

そもそもなんだけど、Excelでcsv出力すると、S-JIS(固定)らしい。

別件で、InputStream扱うときに

BufferedReader br = new BufferedReader(new InputStreamReader(hoge.getInputStream(), "SJIS"));

List<String> stringList = new ArrayList<>();
while(br.ready()) {
    stringList.add(br.readLine());
}
br.close();

とかで読み込みできた。

ちなみに、hogeはSpringのMultipartFileです。


2014年4月30日水曜日

SpringMVCのform:selectだけど、optionのlabelが使いたい

結論から言うと、妥協してるのでいい方法があったら教えて欲しい。

元のやつ

<form:select class="hoge-form" items="${hogeMap}" path="hogeId" required="required">


hogeMapはSpringMVCのControllerで定義されているMap<Integer,String>である。
上記のようなタグは、実行されるとこんな感じになる。

<select id="hogeId" name="hogeId" class="hoge-form" required="required">
<option value="1">リスト1</option>
<option value="2">リスト2</option>
</select>

このoptionのところにlabelをつけたいんだけど、form:selectだとどうにもうまくいかなくて妥協したのがコレ

<select id="hogeId" name="hogeId" required="required">
<c:forEach var="hoge" items="${hogeMap}" varStatus="hogeStatus">
<option value="${hogeMap.key}" label="${hogeStatus.index}.${hoge.value}" class="hoge-form" />
</c:forEach>
</select>

生成されるのはこんなん

<select id="hogeId" name="hogeId" required="required">
<option value="1" label="0.リスト1" class="hoge-form"></option>
<option value="2" label="1.リスト2" class="hoge-form"></option>
</select>

びみょ

追記

別途modelMapになにかのmodelがあって、form:selectのpathに指定したやつがmodelMapのmodelのプロパティにあると勝手にそれをselectedにしてくれる機能を使ってる場合は別途、<option>にこんな指定が必要です。


${(model.hogeId eq hoge.key)?'selected="selected"' : ''


2014年4月22日火曜日

Basic認証ついてるAPIをSpringのRestTemplateでPOSTするサンプル

タイトルまんま。例えばcurlで


curl http://example.com/hoget -X POST -u shase:p@$$w0rd

こんな感じで使えるAPIをRestTemplateで使おうと思った時はこんなコードでOK



こちら参考にしました(リンク先はGETの例)
http://springinpractice.com/2013/10/02/quick-tip-basic-authentication-with-spring-resttemplate