だいぶ周回遅れですが、リコリス・リコイルの最終回を見てました。最終回に限らず銃撃アクションはどの回も良かったな〜と思います。設定はイマイチ良くわからないですけど、あまり気にしても仕方ないです。それはさておき。ニコニコ動画は、
があって、有料版はちょっと変わってるらしいので、試しに契約してみました。サブスクリプション方式でした、月額440円だそうです。
現在のニコニコ動画の配信方式はHLS(HTTP Live Streaming, 規格は RFC8216 にて規定)といいまして、MPEG2-TSファイルを細かく(3〜10秒程度)分割して、クライアントから再生要求された位置から順に送るだけのシンプルな方式です。MPEG2-TSの弱点はインデックスなどの情報が一切なくてサーチが大変なことですが、あらかじめ分割しているため苦労してサーチをする必要がありません。
ちなみにリコリス・リコイルの無料放送版の場合、コーデックは見ての通りでFull HDじゃないです……。有料版でもHD 720pですから、画質が気になる方にはイマイチかもしれません。他のアニメも同じなのでしょうか?調べていないのでわかりませんけど。
HLSではプレイリスト(ファイル名が*.m3u8)も一緒に送られてきて、リストにTSファイル名が全て載っています。プレイリストにあるTSを順番にダウンロードし、単純連結するだけで動画全体のTSファイルが引っこ抜けます。これはセキュリティホールとかではなく元々HLSはこういう仕様です。
有料版も同様にHLSで配信されていますがAES-128-CBC暗号化されていて、TSファイルを引っこ抜いても再生できません。しかしなぜか無料版は暗号化されておらずTSファイルを引っこ抜くと再生できてしまいます。設定ミス……?わざと?まあどっちでもいいですけど。
キャプチャだとわかりにくいかもしれませんが、右下に「ニコニコ」の透かしが入っています。有料版は入っていません。
TSファイルのサイズを比較(AES-128-CBC暗号化でファイルサイズは変化しないので、この比較には意味がある)してみましょうか。使ったのはリコリス・リコイル最終話です。
有料版(dアニメ支店版)は100MBくらい小さいです。無料版は先ほど説明したように右下に透かしを入れるために再エンコードしていると思いますが、再エンコードだけでは説明できないほどサイズが違います。なんで?と思って調べてみたら、どうやら、
になっているようです。オープニングのエレベータが降りていくシーンが非常にわかりやすいです。高速(120fpsとか)で動画が撮れるカメラを使うと、無料版は5コマに1回、画が止まることがわかります。
有料版(24fps)が
1 2 3 4 5 6 7 8
このような出方だとして、無料版(30fps)は
1 2 3 4 4 5 6 7 8 8
みたいな出方をします。
意図通りか間違えたか知りませんが、無料版だけ30fpsに変換しているためファイルサイズがやたらデカいようで、暗号化もされていません。どちらかといえば無料版の方が不思議な作りですね。
メモ: 技術系の話はFacebookから転記しておくことにした。色々と加筆修正。
ニンテンドーのポイントが期限切れになるぞよ、とメールが来ていたのでゼルダの伝説スカイウォードソードに出てくるボム袋を模した巾着をもらいました。思っていたよりでかい。
ゼルダの伝説はほとんどやったことがなくて、家に届いた巾着を見ても何の模様かわからなかったのですが、奥さんに見せたら一発で「あ!ボム袋だ!」って気づいてました。ゲーム画面のキャプチャを観ると思っていたより再現度が高いです(ゲームのボム袋の方がもう少し背が低いくらい)。良いですね。
なぜかシューティングの練習で使うフロンガス缶のサイズと、この巾着のサイズが超ぴったりでした。フロンガス缶はそんなに種類があるわけじゃない(マルイ、レイラックス、サンダーシュート、ウッドランドがメジャーどころ?)し、同じ種類のガス缶を使っている人も多くて紛らわしいので、こういう個性的&コンパクトな袋はありがたいです。
メモ: 技術系?の話はFacebookから転記しておくことにした。色々と加筆修正。
目次: Windows
先日(2022年9月19日の日記参照)はJavaScriptと画面起動ロックAPI(Screen Wake Lock API)にてWindows PCの画面ロックを妨害する方法を紹介しました。
今回はWindows API(SetThreadExecutionState)を使って同様の機能を実現します。詳細はMicrosoftのAPIドキュメント(SetThreadExecutionState function (winbase.h) - Microsoft Learn)と、スリープに関する日本語の解説(システム スリープ条件 - Microsoft Learn)が参考になります。
そういえばWindows APIのドキュメント、今の名前はMicrosoft Learnになっていますね。昔はMSDN OnlineとかMicrosoft Docsとか呼ばれてた気がしますが、統合されて消えてしまったのかな……?
さておきコードはこんな感じです。簡単すぎるのでわざわざ載せるまでもないですけども。
#include <iostream>
#include <windows.h>
#include <winbase.h>
int main()
{
EXECUTION_STATE r;
r = SetThreadExecutionState(ES_CONTINUOUS | ES_AWAYMODE_REQUIRED);
if (r == NULL) {
std::cout << "failed!" << std::endl;
}
std::string hoge;
std::cin >> hoge;
return 0;
}
アプリケーション実行中にpowercfgでチェックすると、こんな風になるはずです。なおpowercfgを実行するには管理者権限でコマンドプロンプトを起動する必要があります。アプリケーション名は適当に読み替えてください。
C:\Windows\system32>powercfg /requests DISPLAY: なし。 SYSTEM: なし。 AWAYMODE: [PROCESS] \Device\HarddiskVolume3\dat\projects\c\ConsoleApplication1\x64\Debug\ConsoleApplication1.exe 実行: なし。 PERFBOOST: なし。 ACTIVELOCKSCREEN: なし。
画面起動ロックAPIはDISPLAYモードを要求していましたが、今回はAWAYMODEを要求しているので違うカテゴリに表示されています。もちろんAPIの引数を適切に変更すればDISPLAYも要求できます。
画面ロックの妨害機能のユーザーは意外と多いです。前回挙げたPowerPointの他に、Teamsのような会議アプリケーション、メディアプレーヤーなども使っているようです。個人的に意外だったものとしてはセットアッププログラムです。
例えば、下記はVisual Studioのセットアップ中にpowercfgを実行した結果です。
C:\Windows\system32>powercfg /requests DISPLAY: なし。 SYSTEM: なし。 AWAYMODE: なし。 実行: [PROCESS] \Device\HarddiskVolume3\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe Visual Studioインストーラー PERFBOOST: なし。 ACTIVELOCKSCREEN: なし。
普通はセットアップ中にスリープされることなんて想定していませんから、セットアップがエラーになる可能性があります。不都合が起きなかったとしても、スリープ中はセットアップが進みません。と、考えると時間がかかるセットアップ中にスリープを妨害するのは筋が通ってますね。
目次: Windows
ノートPCは下記のようなセキュリティ設定で運用している人が多いと思います。会社のPCもこういう設定が多いと思います。
この設定はセキュリティ上は素晴らしいです。ただし展示で使うときはちょっと困るんですよね……。自分のアカウントで画面ロックが掛かると、当然自分しか解除ができませんから自分がPCの前を離れられなくなります。
展示のためだけにセキュリティ設定を緩めるのも何だかイマイチですし、一時的に使える方法はないか?と思ったらありました。ヒントはPowerPointの全画面表示で、スライドショーを開始するとWindowsの画面ロックは発動しないのです。ほほう。
PowerPointに画面ロックの妨害ができるなら、そこらのアプリでも画面ロックの妨害を実現できるはずです。
どのWindowsのAPIを呼んだらいいのか?と思って調べていましたが、JavaScriptで手軽に実現する手段がありました。今のところChrome限定っぽいですが、
function addEvent(obj, name_event, func_event)
{
var func_prev = obj[name_event];
if (func_event == null) {
return;
}
if (func_prev == null) {
obj[name_event] = function() { func_event(); };
} else {
obj[name_event] = function() { func_prev(); func_event(); };
}
}
function f_resolve()
{
var statusElem = document.getElementById('status');
statusElem.textContent += 'Success. ';
}
function f_reject()
{
var statusElem = document.getElementById('status');
statusElem.textContent += 'Rejected. ';
}
function f_release()
{
var statusElem = document.getElementById('status');
statusElem.textContent += 'Released. ';
}
function testWakeLock()
{
var statusElem = document.getElementById('status');
var isSupported = false;
if ('wakeLock' in navigator) {
isSupported = true;
statusElem.textContent += 'Support wakeLock. ';
} else {
statusElem.textContent += 'Not support wakeLock. ';
return;
}
var wakeLock = null;
try {
wakeLock = navigator.wakeLock.request('screen');
} catch (err) {
statusElem.textContent += `${err.name}, ${err.message}`;
}
statusElem.textContent += 'Request. ';
wakeLock.then(f_resolve, f_reject);
wakeLock.addEventListener('release', f_release);
}
addEvent(window, "onload", testWakeLock);
この画面起動ロック(MDNへのリンク)機能を使うと、タブを切り替えたりしない限り画面ロックを妨害できるようです。
私の環境で試した限りでは、なぜかReleaseイベントが一切来ないのと、ブラウザをバックグラウンドに持っていくと動作が不安定(たまに効かない = 画面ロックしてしまう)ですが、一応効き目がありました。
画面起動ロックが効いているかどうかはpowercfgを使うとわかります。管理者モードでコマンドプロンプトを起動しpowercfg /requestsと /requestsoverrideを実行します(powercfgのヘルプ)。私の環境では /requestsの方に表示されていました。
C:\Windows\system32>powercfg /requests DISPLAY: [PROCESS] \Device\HarddiskVolume3\Program Files\Google\Chrome\Application\chrome.exe Blink Wake Lock SYSTEM: なし。 AWAYMODE: なし。 実行: なし。 PERFBOOST: なし。 ACTIVELOCKSCREEN: なし。
先ほどのスクリプトを実行したタブを切り替えると、
C:\Windows\system32>powercfg /requests DISPLAY: なし。 SYSTEM: なし。 AWAYMODE: なし。 実行: なし。 PERFBOOST: なし。 ACTIVELOCKSCREEN: なし。
となるはず、です。
在宅勤務の時、会社のWindowsノートPC(常時コミュニケーション用のツールが入っている)がすぐに画面ロックしてしまって、コミュニケーションツールにアクセスしづらいのと非常にウザくて困ってました。画面ロックを無効にもできなくて困っていたんですが、画面起動ロックで画面ロックを妨害できるようになってだいぶ使いやすくなりました。
画面ロックを仕込んだページを作られたら、画面ロックできなくなるんですかね?どうなるんだろうな?(追記: ローカルファイルじゃないと動作しませんでした)まあ、時限式の画面ロックに頼って、PCの前から立ち去るような運用はそもそも論外なのですが……。
理屈は良いので動くものがほしいせっかちな方へお送りします。 動作するページへのリンクです。注意点はネットワーク上のサイトでは機能しません(Not supportになります)ので、ローカルにダウンロードしてから開いてください。
不安な方はローカルに保存して開く前に中身をご確認ください。もしくは上記のスクリプトを見て&理解してご自身でページを作成くださいませ。
< | 2022 | > | ||||
<< | < | 10 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | - | - | - | - | 1 |
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 | - | - | - | - | - |
合計:
本日: