LoL League of Legends Unspecified Error Occured at 32% patch 5.7

solution: http://boards.eune.leagueoflegends.com/en/c/help-support-en/O2gELyLf-resolved-update-failed

こんなエラーがたくさん出る。

000037.329| 0.0000kb| 0.0000kb added| WARN| Riot::RADS::Patching::UpdateAndInstallShared::CheckFile: Found the file "C:/Riot Games/League of Legends/RADS/projects/lol_air_client/releases/0.0.1.139/deploy/mod/lsi/assets/championBanners/league_header_ZYRA.jpg", but MD5 did not match.
000037.329| 0.0000kb| 0.0000kb added| WARN| Riot::RADS::Patching::UpdateAndInstallShared::`anonymous-namespace'::ExtractDownloadResult: Failed to validate file after download: C:/Riot Games/League of Legends/RADS/projects/lol_air_client/releases/0.0.1.139/deploy/mod/lsi/assets/championBanners/league_header_ZYRA.jpg.

どうやら画像のMD5が一致しないと。
Softbankテザリングで通信してたんですが。

"上記コンテンツ・サービスなどをご利用の際、通信速度の制御や各種ファイルの最適化を行う場合があります"
http://www.softbank.jp/mobile/info/personal/news/support/201211091811300000/

クソすぎる。勝手に通信改ざんするなよ…。

SSL通信盗聴

ここに書いてあるとおりにやれば出来る。
http://blog.opensecurityresearch.com/2012/05/mallory-mitm-fix-ssl-decryption.html?m=1

最後の信頼する証明書を追加するフェーズは盗聴されたい人の環境によるが、windowsでは「証明書ダブルクリック→信頼された機関で登録」すればとりあえずは上手くいった。明らかに危険なのですぐに消した。消すには、certmgr.exe。偽証明書が無駄にそれっぽい名前でわかりにくい。Verisign GA ほにゃららとかいうやつが偽物。

要するに、
1.偽証明書をwindowsに信頼させる
2.攻撃役をデフォルトゲートウェイにする
3.mallaryがうまくプロキシしてくれる

ニコ生メモ

モチベーション: Chrome Cast でニコ生見たい
事前予想: Chrome Cast は Flash 不可だしrtmpは対応してない。でもiPhoneアプリはHLSらしい*1ので原理的にはいけるはず。

結果: iPadSafariでTS視聴に成功。放送中のものは視聴には至らなかった。

手順は、
0. iPhoneのパケットを盗聴 (cf. Burp Proxy)
1. iPhoneニコニコ動画アプリでTS視聴開始
2. PUT http://uthaa21.live.nicovideo.jp/v1/programs/lv*********/sessions/597ad16f100be319ce3a18769bee031a8eeac0a09c9a4e8a39029687986d0316?_format=json みたいなリクエストをかくにん
3. 直後の http://uthaa21.live.nicovideo.jp/v1/programs/lv*********/sessions/597ad16f100be319ce3a18769bee031a8eeac0a09c9a4e8a39029687986d0316/streams/main/variant.m3u8 こんな感じのURLをコピー
4. iPadSafariにURLをペースト。

iPhoneの方とほぼ同時の動画が流れてくる。

5. iPhoneで視聴やめる
6. DELETE http://uthaa21.live.nicovideo.jp/v1/programs/lv*********/sessions/597ad16f100be319ce3a18769bee031a8eeac0a09c9a4e8a39029687986d0316?_format=json みたいなリクエストが飛ぶ。
7. iPadのほうも切れる

察するに、TS視聴するたびにサーバ側で、録画ファイルをストリーミングするプログラムが立ち上げられてる感じですかね

手順5でかわりにシークバーをいじると新しくPUTが飛んで新しいセッションが始まる。(ちなみにDELETEが飛ばない。これは意図してない動作な感じが…。)

PUTより前のこまごまとしたHTTPのやりとりから再現すればChromecast単体でニコ生TS視聴もできそう。放送中のが見れないのも何かミスってるだけでしょう…。
実装は時間もやる気も足りない。まだまだ嵌まりそうだし。

追記:CORS (Cross-Origin Resource Shareing) ヘッダ、即ち

Access-Control-Allow-Headers:Content-Type
Access-Control-Allow-Methods:GET,PUT,POST,DELETE
Access-Control-Allow-Origin:*

が(m3u8のレスポンスに?)付いてないとダメみたい?なので無理(一応確度低い)。TSを横流しするサーバでも建てるならともかく。

Linux Mint 17
HDMI接続で音が出ない

Mint 14 からアップデートしたらノートPCからは音が出るが、HDMI出力では出なくなった。Windows 7では出る。

以下のページの一番下のコマンド打ったら音が出た
http://arstechnica.com/civis/viewtopic.php?f=16&t=1252881

何も理解してないけどまあいいでしょ…。

Sikuliメモ

Settings.WaitScanRate: 1秒間のクロック数。
Settings.MinSimilarity: 1に近いほど厳しくなる。
Settings.MoveMouseDelay: 0でテレポートするようになる。

r.clickやr.existsにすることで高速化。existsは見つからない時は遅い。exists(img, 0.01)。

いつでも止められるようにする。そのページに必ずあるアイコンのexistsで判断するとCtrl+Tとかで止められて便利。

可能な限りシンプルにすることがスクリプトの安定性・高速性につながる。

プロセス名でウィンドウハンドル取得 コピペ用

Process[] ps = Process.GetProcessesByName("hogehoge");

/*
Process[] ps = Process.GetProcesses();
foreach(var p in ps) {
  Console.WriteLine(p.ProcessName);
}
*/

if (!ps.Any())
{
    return;
}

IntPtr hWnd = ps[0].MainWindowHandle;
RECT rect = new RECT();
GetWindowRect(hWnd, out rect);

Win32API コピペ用

using System.Runtime.InteropServices;
using System.Diagnostics;
        #region GetWindowRect
        [StructLayout(LayoutKind.Sequential, Pack = 4)]
        private struct RECT
        {
            public int left;
            public int top;
            public int right;
            public int bottom;
        }    
        [DllImport("User32.Dll")]
        static extern int GetWindowRect(IntPtr hWnd, out RECT rect);
        #endregion

        #region SendInput
        [StructLayout(LayoutKind.Sequential)]
        private struct MOUSEINPUT
        {
            public int dx;
            public int dy;
            public int mouseData;
            public int dwFlags;
            public int time;
            public int dwExtraInfo;
        };

        [StructLayout(LayoutKind.Sequential)]
        private struct KEYBDINPUT
        {
            public short wVk;
            public short wScan;
            public int dwFlags;
            public int time;
            public int dwExtraInfo;
        };

        [StructLayout(LayoutKind.Sequential)]
        private struct HARDWAREINPUT
        {
            public int uMsg;
            public short wParamL;
            public short wParamH;
        };

        [StructLayout(LayoutKind.Explicit)]
        private struct INPUT
        {
            [FieldOffset(0)]
            public int type;
            [FieldOffset(4)]
            public MOUSEINPUT no;
            [FieldOffset(4)]
            public KEYBDINPUT ki;
            [FieldOffset(4)]
            public HARDWAREINPUT hi;
        };

        [DllImport("user32.dll")]
        private extern static void SendInput(int nInputs, ref INPUT pInputs, int cbsize);
        [DllImport("user32.dll", EntryPoint = "MapVirtualKeyA")]
        private extern static int MapVirtualKey(int wCode, int wMapType);

        private const int INPUT_KEYBOARD = 1;
        private const int KEYEVENTF_KEYDOWN = 0x0;
        private const int KEYEVENTF_KEYUP = 0x2;
        private const int KEYEVENTF_EXTENDEDKEY = 0x1;

        public static void Send(short key)
        {
            INPUT inp = new INPUT();

            inp.type = INPUT_KEYBOARD;
            inp.ki.wVk = key;
            inp.ki.wScan = (short)MapVirtualKey(key, 0);
            inp.ki.dwFlags = KEYEVENTF_KEYDOWN;
            inp.ki.time = 0;
            inp.ki.dwExtraInfo = 0;
            SendInput(1, ref inp, Marshal.SizeOf(inp));

            System.Threading.Thread.Sleep(10);

            inp.ki.dwFlags = KEYEVENTF_KEYUP;
            SendInput(1, ref inp, Marshal.SizeOf(inp));

        }
        #endregion

        #region SetForegroundWindow
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool SetForegroundWindow(IntPtr hWnd);

        [DllImport("user32.dll")]
        private static extern IntPtr GetForegroundWindow();

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool ShowWindow(IntPtr hWnd, int cmd);
        const int SW_RESTORE = 9;
        #endregion

        #region SetCursorPos, mouse_event
        [DllImport("USER32.dll", CallingConvention = CallingConvention.StdCall)]
        static extern void SetCursorPos(int X, int Y);

        [DllImport("USER32.dll", CallingConvention = CallingConvention.StdCall)]
        static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

        private const int MOUSEEVENTF_LEFTDOWN = 0x2;
        private const int MOUSEEVENTF_LEFTUP = 0x4;

        private void Click()
        {
            mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
            mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
        }
        #endregion