Groovy でマジックパケットを表現してみる

Wake on LAN してみる』のマジックパケットを Groovy 化してみた。


JavaFX Script だと こんな感じだったのが...

def macAddress = "AA:BB:CC:DD:EE:FF";

[ for (i in [1..6]) { 0xff },
  for (i in [1..16], b in macAddress.split(":")) { Integer.parseInt(b, 16) } ]


Groovy だとこんな感じになる。

def macAddress = "AA:BB:CC:DD:EE:FF";

[ (1..6).collect { 0xff },
  (1..16).collect { macAddress.split(":").collect { Integer.parseInt(it, 16) } } ].flatten();

Groovy でもほとんど同じ程度のコーディング量で表現できる。
Groovy の for は 式ではないので JavaFX Script のように結果を返さないが 同等のことが collect を使えば簡単に実現できる。
また、JavaFX Script のシーケンスは 1次元しかサポートしていないので シーケンスの中にシーケンスを入れても勝手に flatten されて1次元に変換されていたが Groovy のリストは多次元もサポートしているので 明示的に flatten して 一次元のリストに変換しないとダメ。これは当然のことだけど...
ちなみに Groovy は + 演算子でリスト同士を結合できるので それを使っても良いかもしれないが 繰り返しリストを結合するのは効率が悪そうなのでやめた。

後は Groovy Console から このマジックパケットを DatagramPacket でブロードキャストアドレスに送信するだけで Wake on LAN を搭載した PC を起動することができてしまうのだ。