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 を起動することができてしまうのだ。