root取った超取った


 取りましたよroot。一気に面白くなってきやがりそうだぜ…!

 root取るに至った理由はですね。
 何かESファイルエクスプローラーでCIFSが全然繋がらなくなって、Perfect ViewerでもComittoNでも繋がらなくて。サーバ側でnetstat -a -nしたらestablishedなので、TCPは繋がってるんだよなあ。
 他PCからファイル鯖へ接続してみたら繋がる。Nexus 7からはファイル鯖にも別のNASにも繋がらない。何なんだ。
 Wi-Fi APを再起動してみても駄目だし、おっかしーなーと思ってるうちに何か変なとこの糸が切れて、八つ当たり気味にroot化しました。

 そして、CifsManagerを入れて、マウントしてみようとしました。繋がらない。うむ。そうであろうなあ。
 念の為もう一度ファイル鯖のnetstatを見たらコネクション来てないんで、さっきは見間違えたのかも、と思って、そういえば経路にGS108Ev2がいたので再起動してもCifsManager繋がらず。No such deviceとか出てるな。
 カッとなってCifsManager "No such device"で検索したら、何かAndroid 4.2でCifsManagerがうまく動かない的な話題がぞろぞろと。もしや、と思ってESファイルエクスプローラーを開いたら普通にCIFS繋がるし。おのれこんちくしょうめ…!

 ということで、別にrootとか無くても当面は困らなくなりましたが。

 切り分けが甘いので犯人は良く分からないけど、何となくGS108Ev2を疑いの目で見てしまうのだった。前科多いからなあ。つっても2011/11に買ってからの14ヶ月ほどで、確実にこいつが犯人だったのは一回、こいつを再起動したら直ったけど犯人かどうかは分からないのが二回だから、んー。んんー。様子見かなあ…。安いしなあ…。

 で、CIFSのマウントについては、調べるのめんどいからそのうちやろう、と思いました。
 root取っただけで何もしてないな俺(笑)。


root欲しい超欲しい


 rootとか無しでも我慢出来るならした方がいいよなーと。思ってたんですよ。もうね。ほんとにね。ホントヨ。
 でも、OOM killerの香りがした日には、swap導入出来るんじゃねーかと思っちゃうし、port forwardingしたいよなー1024以下で、とか思っちゃうし、むしろさっさと色々マウントしたいし、日に日に欲しくなるrootであった。Linuxマシンを多少なりとも触ってると、Androidでroot無しに我慢するのは辛いなあ。
 標準でswap導入と何かしらのネットワーク経由のマウントだけでも可能になってたら、まだまだ我慢出来るんだろうけどなあ。

 つーか、何で我慢してるんだろう(笑)。


Array.concat()さんの存在を知る


 JavaScriptを見よう見まねで適当に弄って色々遊んでる訳ですが、Array.concatの存在を今日知った。ハハハ。くそう便利じゃねーか…!
 つーか、concat的な挙動の関数ねーのかなー、と思いながら、何故かconcatで素直に検索していなかったらしい。

 で、何やらconcat使わない方がいいかもみたいなページが上位にヒットするんで、何か罠でもあるのかなーと思って読んでみたら、だいぶ変なことが書いてあって、んー何だこれと思ったら下の方に「いっぱい反論された、やらかした」みたいなことが書いてあった。ああ、なるほど。良く見たら冒頭にも「多くの誤りを含んでます」ってあった。あるある。俺もきっと山ほどやってそうな気がするな。
 そして思うのだが、こういうことで被参照が増えても検索上位に行ってしまうのだろうなあ、と。何だか不幸な話ではある。
 あと、意外に冒頭の注記とか読み飛ばすもんだなー、と思った。

 それと、結局concatでも解決しなくて、Array.prototype.*.callで解決したのだった。
 JSってWeb向けなんだし、短く書けるのを重視した言語にして欲しかったなあ。多分さんざん言われてるだろうし今更無理だけど。


FTPさんからSMBさんに乗り換えた


 ちょっと前まではもしかしてFTPサーバ入れとくの最高なんじゃねとか言ってた気もしました。
 Androidのアプリがさー。CIFSが一番ちゃんと動くのですよ。そうなのよ。対応してるアプリも多いしさ。畜生め。
 FTPで、画像が直接開けて、スワイプで次の画像に行けて、ってアプリがそもそも滅多に無い。そんなアプリも、FTPだと何かもう接続切れたり固まったりロード失敗したり異様に重くなったりしまくって大変です。何故だ。

 鯖のせいかもしれないと思って、Filezilla Serverの代わりにpyftpdlibで即席FTP鯖も書いてみたりしたんですよ。ソースもサンプルまんまに近いけど一応載せとくか。

from pyftpdlib import ftpserver
HOST = '0.0.0.0'
PORT = 21
USER_LIST = (
    # (username, password, homedir[, perm])
    ('hogeuser', 'hogeplainpassword', 'D:/hogefolder'),
    ('piyouser', 'piyoplainpassword', 'D:/piyofolder'),
    )
FTP_TIMEOUT = 2
DTP_TIMEOUT = 2
IN_BUFFER_SIZE = 1048576
OUT_BUFFER_SIZE = 1048576

def ftp_server():
    authorizer = ftpserver.DummyAuthorizer()
    for user in USER_LIST:
        authorizer.add_user(*user)

    dtp_handler = ftpserver.DTPHandler
    dtp_handler.timeout = DTP_TIMEOUT
    dtp_handler.ac_in_buffer_size = IN_BUFFER_SIZE
    dtp_handler.ac_out_buffer_size = OUT_BUFFER_SIZE

    handler = ftpserver.FTPHandler
    handler.authorizer = authorizer
    handler.timeout = FTP_TIMEOUT
    handler.dtp_handler = dtp_handler

    address = (HOST, PORT)
    ftpd = ftpserver.FTPServer(address, handler)
    ftpd.serve_forever()

if __name__ == '__main__':
    ftp_server()

 即席テストなのでもう平文パスワードとか男らしいコードに惚れて火傷するぜ。
 ファイル名はCP932になっちゃうけど、元々CP932なFTP鯖が欲しかったのでちょうど良かった。
 バカみたいに短いタイムアウトになってるのは、Androidの色々なファイルマネージャーからFTP掛けてログ見てると結構怪しい挙動のが多くて、つーかFTPの仕様自体が曖昧なのかもだけど、まー色々あって短くしてみたのだった。でも、あちらを立てればこちらが立たず的な状況になったので、多分こんな短くない方がいい気はしました。
 つーかFTP諦めたんで、この辺は全部どうでもいい話である。

 で、CIFSでやってみたらド安定だったので。うむ。Androidでも便利だし、Windowsではもちろん超便利だし。
 WANになったらまた掌を返すかもしれんけどさ。

 つーことで、何かめんどくさいイメージだったけど、ちゃんと調べたらそうでもなかった、という話。
 いやまー「結局どれがファイル共有の設定なんですか」「これで動いてるけど本当に大丈夫なのか」って感じの面倒さは物凄いですが。
 まあ、Windowsはどうしてもなあ。過去の資産の膨大さがとてつもないから、機能を整理する訳にも行かずに増築を繰り返すとこうなってしまうのかもしれない、とは思うのですよ。もちろん、MSはアホウなんじゃねーのかな、という感じのソレも多々ありますが。つーか良く考えたら7で動かないソフトとか結構あるもんな。ハハハ。何が過去の資産だ。

 で。

 適当なサーバソフトなんかで「アクセスにはIDとパスワードが必要なようにしたいぜー(普通そうだろ)」となると、ユーザー情報はソフトの設定で登録するだけみたいなのが多いんで気楽だけど、Windowsのファイル共有の場合、IDとパスワードはWindowsのユーザーとして登録してやらんと駄目、ってのがまず面倒そうだなーと思ってた。ユーザー作成っつーと、コンパネ→ユーザーアカウント、しか知らなかったし。あれで作るとフォルダとか作られるよなあ。
 でも、コンピュータの管理の中からユーザー作れば良かったのな。簡単じゃないか。
 ただ、それだけだとユーザーの切り替えとかの画面にはユーザー名が出ちゃうんで、ログイン可能にしつつも名前は出さない、という設定を探したら、

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList]
"hogeuser"=dword:00000000

みたいなレジストリを登録すれば行けるのな。少なくともXPとVistaと7では行けるらしい。うちの7では行けた。
 hogeuserは対象ユーザー名で。複数書けば複数行ける模様。まあ、SpecialAccounts\UserListとかで検索すればもっとまともな解説に当たることでしょう。

 んで、ファイル共有の設定も、フォルダのプロパティ→共有→詳細な共有、から適当にそれっぽく設定したら行けた。パスワードを必要にする設定は、アクセス許可のとこでEveryone消して、適当なユーザーを追加してフルコントロールでも与えといて、と。
 これでいいのかどうか物凄く怪しいのだが。間違ってたら教えてください是非。
 つーか十分めんどくさかったんで、いっそSambaのWindows版とか無いものかと探しそうになりました。落ち着け、Sambaも面倒だ。

 で、今んとこ実に快適ではあります。それはそれはもう。
 ただ、何だかんだ面倒な気がするし、NASでも買った方が格段に楽そうだけど。でもバックアップも考えると結構な費用になるしなあ。


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越えも簡単そうだし、鯖使うなら有料ですよーとかでもいいよな。誰かやってないのかな。