新・日々の暮らしに疲れてない?

一人バンド、火頭工房

楽曲「Carrier」を公開。

久しぶりにトラックを公開しました。

雨が降るたびに季節の変化を感じます。

 

soundcloud.com

バッチファイルを初めて自作して、その後。

どうも、火頭です。

 

こないだ生まれて初めてバッチファイルを自作しまして、せっかくなのでもっと作るべきものはないかと探して回ったというお話。

 

コマンドプロンプトってプログラミングの環境構築とかで触ったくらいで、正直コピペばかりしてたので何をするものか全然知らなかったんですよね。

 

ようやく自分の力で、動くものが作れて嬉しい!と言ったところ、今回作った「画面の明るさを時間帯で自動調整する君」が気に入ったので、もっと作れそうなものを考えてみたのですが、めぼしいものもなく...

 

ようやく絞りだしたのが、

その1 グーグルクロームで指定したURLを一括で立ち上げてくれるバッチ

その2 月末の会計関連のファイルを一括で立ち上げてくれるバッチ

です。

 

どっちもそのままですが、地味に役に立ちます。

 

その1のページを一括で立ち上げてくれるバッチは、開きたいURLをリストしたテキストファイルを読み込み、forループでURLごとに読み取り、それぞれクロームの新規タブで立ち上げる、というもの。朝一のメールチェック、ニュースサイト、2ちゃんのまとめサイトなど、日々のルーチンワークの助けに。

 

その2はただファイルをまとめて立ち上げるだけ。月末になると会計作業のためにあのファイルを立ち上げてこれ立ち上げて...とやっていたので、一括で。

 

他なんかあるかねぇ...以上。

画面の明るさを自動で調整してくれるバッチ。後日談その2。

珍しく同じテーマで3回目の投稿です。

 

以前作った、画面の明るさを時間によって調節してくれるバッチファイルですが...(詳細はこちら↓)

hiatama.hatenablog.com

 

どうやらタスクスケジューラの設定が上手くいっていなくて、思ったタイミングで作動しません。

 

まず最初に設定していたのは「スタートアップ時」に実行→ シャットダウンしたPCを立ち上げた時に発火してくれますが、スリープ解除や休止状態からの立ち上げには対応しない。

 

次「ログイン時」に実行→ ほぼ同上。スリープ解除や休止状態からの立ち上げには対応しない。

 

私は普段、休止状態にすることが多いのですが、これはウィンドウズさん的には再ログインの扱いではないらしい、あー面倒。

 

ちょっと調べてみると「イベント時」を選ぶのが正解だそう。どうやら休止やスリープを解除する時にログとして記録されるらしく、このログを監視するのが良いらしい。

 

検索で出てきた設定は、タスクスケジューラのトリガー設定で「イベント時」を選び

 

ログ:「システム」

ソース:「Power-Troubleshooter」

イベントID:「1」

 

だったのですが、試してみると発火に失敗しました。仕方ないので、そのイベントログを見に行くことに。

 

初めて見たイベントビューア。ウィンドウズイベントを見てみると、どうやらKernel-Generalが起動に関わっているっぽい、詳細の欄には、時間設定に関するうんぬん書いてあるけど...ものは試しでこれをタスクスケジューラで監視してみると、あっさり成功。

 

ということで、ついに完成しました。

正真正銘「時間によって画面の明るさを調整してくれる君」です。

画面の明るさを自動で調整してくれるバッチ。後日談。

前回のエントリー↓を公開した後、細かい調整をしました。

hiatama.hatenablog.com

 

元々、日中は少し明るい画面、夜は出来るだけ暗く、と考えていたので、明るさの設定を変えた二つのファイルを用意し、時間帯によってどちらを処理するか条件分岐させられるよう調べてみました。

 

最初はタスクスケジューラの方で時間帯による処理分けを考えたのですが...そもそも指定した時間にPCが起動していなければ処理が無視されるとか、私は自宅のPCは外出中は落とす派なんですよね。

 

タスクスケジューラで「無視された場合でも起動したら処理をする」などと設定したところで、もし朝も無視→夜も無視、と無視が溜まると次にログインした時はどうなるの? など、検証も面倒なので、バッチファイルの方で条件分岐させて頑張ってみることに。

 

必要だったのは...

 

・変数の書き方: SET 変数名=

イコールの前後にスペースを入ちゃいけないらしい、偏屈すぎる。

 

・時刻を取得: SET time=TIME

timeという変数を宣言し、そこに現在の時刻を代入しています、時、分、秒数が入ります。ちゃんと入っているかどうかは、ECHO %time% で確認できます。

 

・文字の切り取り: SET time=%TIME:~0,2%

今回必要なのは、時、分、秒のうち、「時」の部分だけですので、そこだけ切り取ります、20時とか07時とか。

:~切り取り開始位置,切り取る文字数 という書式です。

 

・IF構文: IF 条件(処理) else (その他の場合の処理)

 

・比較演算子:%time% geq 18

geqはgreater or equal で、「18か、それより大きければ」となります。一覧は以下。

 

[数値1] equ [数値2] [数値1]と[数値2]が等しい
[数値1] neq [数値2] [数値1]と[数値2]が等しくない
[数値1] lss [数値2] [数値1]が[数値2]より小さい
[数値1] leq [数値2] [数値1]が[数値2]以下
[数値1] gtr [数値2] [数値1]が[数値2]より大きい
[数値1] geq [数値2] [数値1]が[数値2]以上


ちなみにANDに相当するモノがないようで驚愕しました。

今回の処理で必要なのが、0時~7時→暗い、7時~18時→少し明るい、18時~0時→暗い だったので、

 

IF %time% geq 7 AND %time% leq 18 (少し明るい処理) else (暗い処理)

 

的に考えていました。

 

ともあれ、これで目的だった「時間によって画面の明るさを変える」が達成できました。

以上。

画面の明るさを自動で調整してくれるバッチ。

寄せる年波うんたらで、PCやスマホの画面の明るさが厳しいこの頃です。

 

スマホは外で見ることも多いので多少明るくてもいいのですが、PCの画面の明るさの設定は夜なら一番暗く、昼ならそれより少し明るいくらい(20%とか?)がちょうど良いです。

 

一応そのように設定をしていますが(個人設定→電源オプションなど)なぜか毎回起動するたびに明るさマックスなんですよね、それを下げるのが日課みたいになっていたのであまり気にしていなかったのですが、ふと思い立って自動化してみることに。

 

画面の明るさを変更するバッチファイルを作ります。調べてみると以下。

 

コマンドプロンプトを管理者実行して powercfg.exe -l で設定に必要な各種のIDを取得。一覧から私が今使っているプランである省電力用のIDを控えておきます。

 

さらに必要な情報を表示するには powercfg /q  <SCHEME_GUID> <SUB_GUID> と打つのですが  <SCHEME_GUID>  にはさきほどのプランIDをいれ、<SUB_GUID>  はディスプレイをいじるためのIDと思われる 7516b95f-f776-4464-8c53-06167f40cc99 で置き換えます。

 

ずらずら色々とでてきます。ここにディスプレイの明るさ設定用のIDらしきものがありますので控える。

 

必要な情報が揃ったので、メモ帳でも開いて書いていきます。


powercfg -setacvalueindex <SCHEME_GUID> <SUB_GUID> <ディスプレイの明るさ用のID> 数値(0~100の間で)
powercfg -setactive <SCHEME_GUID>

 

これだけ。上はいわゆる書式だと思って頂いて、ID部分など置き換えます。

1行目で設定をして、2行目で実行する感じでしょうか。


保存して、ファイル名を「なんとか.cmd」に変更します、拡張子だけ注意。

 

このファイルを開いてみると...どーん!と明るさが変わりました。イエーイ。

 

これでバッチファイルの方は終了、次はこれをPC起動時に自動で実行してくれるように設定。方法は色々あるようですが、タスクスケジューラを使いました。

 

[Windowsキー]+R でタスクスケジューラを呼び出し。taskschd.msc と打つ。

 

このタスクスケジューラを見るのは初めてでした。開いてみると、結構余計なものが登録されていましたのでまず一掃。(無効になってたので影響はなかったのでしょうけど)

 

あとは新規フォルダを作り、さきほどのバッチファイルを登録し、起動のタイミングを設定し、簡単に終わりました。

 

な、なんと簡単な...。

このPC使い始めて4年目くらいでしょうか? 今まで設定変更に費やした時間を返して欲しいもんです、そしてその時間をかき集めてダークソウル2をプレイする時間に還元したいもんです(←数年ぶりにゲームソフトを買いました)。

 

おしまい

Chrome 拡張機能「YouTube Looper」を公開。後日談

先日公開したChrome 拡張機能YouTube Looper」、その後アレコレ改善点を考えたお話。

 

今回の機能は、動画全体を繰り返し再生+最初と最後の邪魔な部分をカット、という考え方ですが、やっぱどこでも好きな箇所を部分リピートくらいはできないとなぁ、ということで考えてみました。

 

部分リピートするには動画の長さを取得することがマストになります。動画の長さを取得するには、YouTubeのページに埋め込んだスクリプトから、document.getElementById('movie_player').getDuration(); で出来ますが、この結果をどうにかしてコンテンツスクリプト側に伝える必要があります、この方法については以前のエントリーで少し触れました、昔の苦労がいい感じに役に立ってくれました。訳のわからない関数を使うので好きになれませんが、ページで実行した関数の結果をコンテンツスクリプト側で受け取れます。

 

長さを取得できればこっちのものです、コンテンツスクリプトとポップアップページ間のメッセージのやり取りは定番のやり方があります。この関数↓

chrome.tabs.sendMessage();

 

これでポップアップ側で動画の長さを反映させれば好きな秒数を指定して部分リピートが可能になります。ところが...

 

部分リピート機能は普通特定の動画のみに適応する機能で、使いまわしをしません。私が当初考えた機能はわりと汎用性のあるものとして作ったので、設定をわけないといけなくなりました。

 

なんとなくめんどくさくなって、作業中断(別にそんな大変じゃないんですが)。

 

あと発見したエラー↓

・別のタブで作業している時はループが効かない(うわぁ致命的ぃ)。

・ループを効かせた状態で動画を試聴し、つべのメインページとか履歴のページに飛ぶと...なんと動画の音だけが再生されるという謎のバグが...つべの仕様で履歴のページにもプレイヤーが存在するんですかね。

Chrome 拡張機能「YouTube Looper」を公開。

お久しぶりです、火頭です。

 

実に久しぶりにクローム拡張機能を作りました。

YouTubeの動画でジャズスタンダードのバッキングトラックを流してアドリブ練習って誰でもするじゃないですか? で、ツーコーラスくらいで終わる動画だと3、4分くらいしかアドリブできないじゃないですか? でマウスのカーソルをシークバー開始位置に置いといていちいちクリックして頭出ししたりするじゃないですか?

 

メンドクサイわ、って話です。

 

まぁ20分くらい繰り返してくれる動画もあるんですが、バッキングが気にいらなかったり、キーが合わなかったりで、良い動画って貴重なんですよね。で、これが4分くらいの動画だと、あああああ!!ってなるわけです。

 

で、ループ再生してくれる拡張機能を作りました。

chrome.google.com

YouTubeapiは不思議なもので、ページの埋め込み動画に関するapiは豊富に用意されているのですが、本家ページで操作できることはかなり少ないのです。イタズラされるのが怖いのかしらん。

 

私などは本家ページが大好きなものですから、埋め込みでの機能が豊富でも嬉しくない。そして本家ではループ再生用のapiが用意されてないので、自分でムリヤリやるしかないわけです。そういえばつべのプレイヤーの機能って結構進化してますよね、気づけば再生速度が変えられたり。もしかしたらそのうちループ再生も実装されるかも知れません。←動画を右クリックでループ再生を選べました 笑。

 

ふん、まぁせっかく自前で用意するのだから本家がやらないこともやります。

 

まず、動画の最初って余白みたいなもので、自分の宣伝や、曲名をドデーンと写したり、無駄な部分が多い、同じく動画の最後も「よかったら私のサイトに来てね!」的なものだったりする。

 

そこでループ再生の開始位置を10秒まで、終了位置を20秒まで調整できるようにしました。要するにあまり凝っていない部分再生的なものです。

 

実装に関しては、結構無茶しています。用意されている関数で出来ることは...

・動画の長さ(時間)を取得

・再生中の動画の現在の位置を秒数で取得

・シーク機能

・プレイヤーの状態を取得

など。

 

ループさせるには、動画の再生位置を見張り、指定した位置(ループ終了位置)を超えたらループ開始位置にシークで戻る。これだけ。

 

でもどうやって見張るんだ?ってお話。最初は、プレイヤーの状態を取得できるので、再生が終了したら状態が変わるから、それをトリガーにすれば?と思ったのですが、それだと動画を最後まで見ることになり、邪魔な宣伝部分をカットできないので却下。

 

仕方なくタイマー機能的なものに頼ることに、なんか負荷がかかりそうで嫌なんですけどね。自分のサイトでなにかしら描画するのに使っている window.requestAnimationFrame()

という関数に頼りました。これをいじって1秒ごとに動画の現在再生位置を取得し、ループ終了位置と見比べる感じです。

 

以上、ループ終了機能はつけていないのでほうっておくと永遠ループするのでご注意。