Suspend on LANは無いのだろうか


 Nexus 7を買ったらもう俺PCに接続しまくりなのでWOLが必須なので色々と遊んでみました、という話の続き。

 電源投入とかスリープ復帰とかはすげー手軽なんですよ。クリック一発で。
 スリープさせるのも同じような感じで出来ないものか、と思うじゃん。思いませんか。俺は思った。
 何たらマネージメントインターフェース、みたいなので出来るのかもしれないけど調べるのめんどくせーから、WOLと同じような方法でやっちまえ、と思って、やってみた。

 まず、Windows PC側ではこんなの(パケット届いたらスリープするだけ)を走らせておいて、ファイアウォールもこのポートの受信を開けておいて、

import ctypes
import socket

HOST = '0.0.0.0'
PORT = 9  # 適当なUDPポート番号を入れる
MAGIC_PHRASE = 'Random String'  # ランダムな文字列とか適当に入れる

def suspend_self():
    ctypes.windll.PowrProf.SetSuspendState(0, 0, 0)

def server():
    sck = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sck.bind((HOST, PORT))
    while True:
        s = sck.recv(65536)
        if s == MAGIC_PHRASE:
            suspend_self()
    sck.close()

if __name__ == '__main__':
    server()

WOLの時と同じWeb鯖にこんなの(パケット投げるだけ)をCGIとして入れて、

#!/usr/bin/python
import socket

HOST = 'hostaddress'  # WindowsマシンのIPV4アドレス
PORT = 9  # もう一つのスクリプトの設定に合わせる
MAGIC_PHRASE = 'Random String'  # 同上

def send_sol_packet():
    sck = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sck.sendto(MAGIC_PHRASE, (HOST, PORT))
    sck.close()

def app():
    send_sol_packet()
    print 'Content-Type: text/plain\n\nDone.'

if __name__ == '__main__':
    app()

あとは叩けばスリープしてくれるだろうか。してくれた。よしよし。

 なお、よくソース貼り付けてるのは「ソースはどんどん公開しようぜ」主義なので。別にみんなでこれ使ってねとかは全く無いというか、こんな怪しい物を拾って食ったら腹壊すんじゃねーかなと俺も思ってるので。
 もちろんアレなところがあったらコメント欲しいけど(じゃなきゃ公開する意味が無いし)、あまりにも全面的にアレだとコメント入れる気もしないだろうしなーとか。うむ。

 つーかWOLより遥かに簡単なんだから、アプリがあったら結構喜ばれるんじゃねーかな。中継サーバ置いたらNAT越えも簡単そうだし、鯖使うなら有料ですよーとかでもいいよな。誰かやってないのかな。


俺PCへのLAN接続をようやくギガビットにする


 つーか、どこがどんな速度で接続されてるかさっぱり分からなくなってたんだけどさ。
 安定感は足りないけどVLAN必要だしまともなスイッチ高いしで仕方なく使ってるGS108Ev2、がですね。何だかまた不調で。最新ファームを確認に行ったら、一部が繋がらなくなる症状がしっかり更新履歴にあったんで、更新してみたんですよ。
 ちなみに、ファームを最新にすると、ProSafe Plus設定ユーティリティも最新にしないとパスワードが通らなくなって焦ります。何しろ英語なのに斜め読みで済ませたせいで、パスワードが何とかかんとかは一応見えてたんだけど全然理解してなかった。

 で。

 リンク速度の一覧をふと見ると、ほぼ全部が1000Mの中で、俺PCは100M、お客さん(主に小中学生)用端末は10M。つーか後者はCAT5e経由で1000BASE-T対応PCに直結されてるはずだから、単にシャットダウン中で10Mに落ちてるんだろう。つーことは、俺PCだけしょぼいです。
 FTPでバリバリに俺PCに通信するんだし、いい加減見直すべきだろー、ってことで、GS108Ev2から俺部屋へのめんどくさくて交換したくない15mくらいのケーブルを確認したら、CAT5だった。5なら一応は行ける筈だが。
 それじゃ俺部屋のハブのせいかな、と思って確認したら当たりだったので、さてどうするか。このハブは何の為にあるのか。PS2とDreamcastの為です。
 撤去決定。俺PCに直結に変更。

 FTP軽くなったーぜー。
 まあ、ファイルが大量にあるフォルダを開こうとすると相変わらず不自然に重いが。何だろうこれ。画像なんかは明らかに軽いけどなあ。
 文字化けの問題もあるし、pyftpdlibとか見ながらサーバ自作した方がいいんじゃねーのかマジで。


CGIでWake on LANさせてみた


 SplashtopやらESファイルエクスプローラーやらで俺PCを弄るにあたって、やっぱスリープやシャットダウンから遠隔で復帰させたい訳ですよ。
 となれば必然的にWOLなのだが、PC側はUEFIとドライバをちょちょいと設定してやればいいとして、パケットをどう届かせるか。
 まあ、今はLANの中だから普通にWOLなアプリでも入れときゃ動くんだけど、いずれWANからやりたくなるだろうしなあ。

 で、うちのLANには24時間稼働してるWeb鯖があって外からも繋がるから、そこにWOLパケットを送信するCGIでも置いときゃいいじゃん、と。
 PHPが書けたら、PHP対応のWeb鯖を立てる機能の付いたNASとかにも使えて便利なんだろうけど、この程度の目的だとPHP覚える気力も出ないんで、ちゃちゃっとPythonでCGIにしてしまおう。

#!/usr/bin/python
import os
import socket
import binascii

def send_wol_packet(mac_addr_str, port=9):
    s = mac_addr_str.replace(':', '').replace('-', '')
    if len(s) != 2 * 6:
        raise TypeError('Invalid MAC address length')
    mac_addr_bin = binascii.a2b_hex(s)
    wol_packet = '\xff' * 6 + mac_addr_bin * 16
    sck = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sck.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    sck.sendto(wol_packet, ('<broadcast>', port))
    sck.close()

def app(env):
    mac_addr_str = env.get('QUERY_STRING')
    send_wol_packet(mac_addr_str)
    print 'Content-Type: text/plain\n\nDone.'

if __name__ == '__main__':
    app(os.environ)

 あとは、これをhttp://host/cgi-bin/wakeup.cgi?12-34-56-78-90-ABみたいに叩けば、と。行けた行けた。

 いやーもう何か、凄いわ。Nexus 7が遊べすぎてヤバい。アプリが作りたくなったらSL4A辺りでも良さそうだし。
 まあ、HTML5な方向性でも結構遊べそうですが。先にそっちかなあ。XPかつIEな人が気になるけど、XPな人はIE捨ててください、それも無理ならご縁が無かったらしいです、でもいいんじゃね。趣味で作る時なら。

 今んとこタブレットの最大の不満はキーボードだろうか。
 持ち歩ける画面サイズと重量で全面タッチパネルなことは物凄く重要だから、そこらを全く犠牲にせずに、画面も全く邪魔せずに、キーボードのタッチタイピングと自由なカーソル操作が持ち込めたら本当に素晴らしいのに。既存の製品だとレーザー投影くらいしか思い付かないけど、あれ凄く微妙らしいしなあ。
 何か画期的な発明無いだろか。それともレーザー投影をどうにか実用的にするとか。誰かマジで作ってくれ。


Amazon S3からGlacierを使うアレで請求額が激減してたとか


 Amazon S3にバックアップする仕組みをずっと動かしてたんだけど、Amazon GlacierのAPIに切り替えるのめんどくせーから、S3からGlacierを使える奴で0日でGlacier化する設定にして一ヶ月使ってみて請求額を見てみよう、という話の続き。

 まあ、普通に激減であった。以前は9.233GB使って$1.16だったのが、10.449GB使って$0.14に下がるのはなあ。
 ちなみにS3自体のお値段もこないだ地味に値下げがあったんだけど、それは10GB程度じゃ影響ほとんど無し。もしも10.449GBをGlacier化せずにS3の値下げ後で計算すると、$1.01になっていたと思う。Glacier化だけで1/7以下である。
 つーか10GB程度だと何かほんとどうでもいい請求額だな。まあ試しておきたくはあったし、鯖関係の支払いは俺持ちなので100円でも嬉しいけど(笑)。あとあれだな、ゲームで0.01秒を削りたくなる気分とかに近いものが。またはボトルネックでもないのにクロック削っちゃう気分とか。
 なお、0日でGlacier化させる設定だと、大抵一日弱くらいはStandardなオブジェクトのままなんだけど、その間は完全にStandard扱いで金取られるのかなーと思ってたら全然そうでもない感じで、確かにStandardの料金が取られてはいるんだけど、0日設定のTransition待ち一回につき約30分相当くらいしか取られてないような。これなら従来通りにS3にバックアップする仕組みのまま続けててもいいな。10GB程度じゃStandard利用分は余裕で$0.01のままだったので。

 で、14セントって今何円だろうと思ったら、カードの請求額は12円でした。ハハハ。うまい棒より若干高いな。


もしかしてFTPサーバ入れとくの最高なんじゃね


 Nexus 7を買って、それはもう何だか素晴らしく楽しい日々である。AndWobbleで俺キャラのOMC画像のおっぱいが揺れるライブ壁紙になったりな!
 おっぱい揺れるせいで電池が切れちゃうならモバイルバッテリー買えばいいんだぜ?
 いやまあ、自宅の中で使う分には全然余裕なんだけど、実際ライブ壁紙にしたらAndroid OS名義のバッテリー使用率が急伸してるからなあ(笑)。だがその程度で俺を止められるとは思わないことだ。おっぱいだからな。
 あっさり飽きて止まるかもしれませんが。

 で。

 俺PCの有り余るHDD(つってもたかが1TB)を全てのベースにしたいんだけど、事務所PCと俺PCの間はDropboxで受け渡ししてたんで、狭いわ重いわで。
 Androidとの受け渡しはFTP経由にしたから楽勝なのになー、と思ったんで、そうだWindowsもFTPをマウントするフリーソフトとかあるんじゃね、と思って探してみた。

 結論としては、Windowsのデフォ機能だけで行けました。あれー。こんなんあったっけ?
 窓の杜で紹介されてたFtpUseとか使ってみて、UTF-8対応してねーじゃん畜生め、とかやってたのがアホのようです。つーか、UTF-8対応してたら今頃Windowsの標準機能に気付かなかったんだな。危ない危ない。
 FTPが駄目ならWebDAVも考えたけど、FTPで行けるならこのまま行くべ。既にUTF-8なFTP鯖を立ててあるんだし。NAT関連で面倒になるかもしれんけど、そうなったらその時に頑張ろう。

 で、やり方も一応書いてみる。Windows 7しか今使ってないんで、7の方法しか書けないけど。まあ他所で詳しく紹介してるとこもあるでしょうハハハ。
 「コンピューター」を開いて、ドライブ一覧とかあるとこの空白を右クリで「ネットワークの場所を追加する」で、場所をftp://マシン名みたいにすれば、あとは流れで。余裕余裕。

 いやー、何かもう、今まで一体何をやってたんだろうというくらい便利で。
 つっても、まだ自宅内での運用ですが。モバイルルータを買ったら、何が何でもWANから使えるように頑張るだろうなあ俺。ということで早く出ろL-03E。かなりマジで。

追記:
 マウントされるのとは違って、例えば画像を開こうとするとブラウザで開いたりするんで、ファイル移動用以外の使い方を期待すると微妙げ。
 有料でいいならWebDriveがいいらしいけど、くっそ高いです。
 あと、波ダッシュだか全角チルダだかを入れたファイル名とか突っ込んだら普通に物凄い文字化けしたりしてるんで、さてどうしたものか。

さらに追記:
 結局、SMBに移行したのであった。