タブの一覧表示メニュー(#alltabs-popup)のミドルクリックでタブを閉じる.uc.js

動作確認

たまにタブを開きすぎてどうにもならないことがあるので一覧表示メニューから閉じられたら便利そうだと思いまして。
#alltabs-popup > menuitem には menuitem.tab というのがあってそれでタブ操作がしやすくなってます。

ダウンロード: middle-click-close-tab-in-alltabs-popup.uc.js

セキュアなサイトでURLバーの背景色を変えるやつ.uc.js

動作確認

緑色の鍵マーク表示するだけじゃ分かりづらい!
と感じてuserChrome.cssである程度指定できていたのがFirefox 38あたりから使えなくなったので、鍵アイコン(identity-box)と同じような属性持ってきてCSSで背景色を変更してます。
XPCOMなのでそのうち使えなくなります。

HTTPS: 青っぽくする
url_ssl

HTTPS (EV SSL): 緑っぽくする
url_evssl

混在コンテンツ: 黄色っぽくする
url_mixed

ダウンロード: secure-site-urlbar-color.uc.js

// テーマによっては変になるかもしれないのでこの部分の色を変更するといいかもしれない
var colors = {'insecure': '#fff', 'secure': '#def0f7', 'ev': '#def2d7', 'broken': '#ffffdd'},

ELECOMのBluetoothレシーバー LBT-PAR500AVを買ったのだが

スペック的なアレ
Bluetooth 4.0、aptX/AAC対応、デュアルアンプ(よく分からん)、NFC(要らん)、連続待受350時間(すごい)、連続再生18時間(すごい)、それで比較的安い(4000円以下)。
イヤフォンはZERO AUDIOのTENOREを短く切ったやつ。

これ、Xperia Z3 Compactとペアリングしてると「再生/停止ボタン長押し」でリダイヤルするみたい。ググってもあまり出てこないから不良品かと思うだろ。

もちろんELECOMはクオリティ高いから説明書にそんなことは書いてない。察しろ。

で、横をつまむと自然と押してしまう再生ボタンの位置がもうダメすぎな上に撫でる程度で反応するので構造的にかなりクソだ。

なんだけどバッテリー長持ちするので渋々使ってる。

誰だよi-parcelも多少マシになったとかいうやつは!? 1ヶ月以上かかったぞ!という話。

こんな思いをするくらいなら花や草に生まれたかった。

2015年12月6日

今使ってるグラボ(GTX660)だとCoD:BO3できなくもないけど、若干厳しいので新しいのを買おうと各サイトをチェックしてたところ11月ごろに発売されたSapphire NITRO R9 380XがAmazon.comで$229.99という送料なんかを考慮してもかなりお手頃価格になってたのでポチった。
Shipping + Import Fees Deposit あわせて$260 (あとでクレジットカードの明細みると約32600円)

この時点では国内価格39000~43000円。

2015年12月9日

Amazon.comから出荷したとメール。i-parcelの追跡番号が書かれていた。

2015年12月??日(出荷から数日)

そろそろ追跡番号も反映されてるかなと思ってi-parcelのサイトで追跡すると

i-parcel

年末だし2週間ぐらい待てばたぶん届いてるはず… (まだ余裕)

2015年12月20日

i-parcelの追跡が全く更新されないし心配になってきてAmazon.comのカスタマーサービスに
「i-parcelのサイトで追跡すると “invalid tracking number or this tracking number is not using a trackable service” と表示されるのだけど、荷物はどこにあるの?」
というようなメールを送る。

Amazon.comから早速返信がきて
「いろいろ申し訳ない!遅くとも12月28日には届けますから!i-parcelにも早くするよう伝えます!あと送料は返金しときます!」

どうなってるか問い合わせただけなのに遅いと送料返金されることもあるらしい。

2015年12月21日

refund

返金されてた。

2015年12月28日

やっぱり届かない。(年末だから…!と必死で平常心を装う)

2016年1月4日

再度Amazon.comに「まだ届いてないけど今荷物はどこにあるの?」的なメールを送る。

小一時間でAmazon.comから返信きて「申し訳ない。商品はまだ(Amazon.comに)戻ってきてません。住所はあってますか?」というメール。住所あってます。

2016年1月6日

Amazon.comのオーダーステータス見たら「Return received」「2~3日で返金」となっていたので、よく分からないしもう一度カスタマーサービスにどうなってるか問い合わせ。

2時間後、Amazon.comから
「本当に申し訳ない。パッケージが破損していたので戻ってきました。交換するか返金するか連絡ください。」
(!!!!!?????)

破損してた!

別のを買うにしても面倒なので「同じやつ再送で頼む」と返信。

Amazon.com
「再送の手配しました。配送は一番早いAmazon Global Priority Shippingです。追加料金とかは必要ありません。」

amazonglobal

再送用のオーダーID作られてて0円。

2016年1月8日

Amazon.comから出荷。今度はUPSで到着予定は14日らしい。

2016年1月12日

不在でした。

ups

2016年1月13日

到着。長かった…。

r9_380x

最終的にAmazon.comの履歴はこうなってます。カード明細更新されてて送料の返金額は1326円だった。

amazon_r9

海外での買い物でトラブルがあると英語でのやりとりが最高に面倒臭いし、この間に国内でも値下がりしてたしでなかなかに酷い年末年始だった。

検索バーのマウスホイールスクロールで検索エンジンを切り替えるやつ.uc.js

wheel_search

動作確認

検索バー上のホイールスクロールで検索エンジン切り替えるだけです。
Firefox 43以降では検索エンジンのアイコンも変えるようにしてます。

ダウンロード: wheelscroll-to-change-search-engine.uc.js
GitHub: wheelscroll-to-change-search-engine.uc.js

中止ボタンがXboxのアレに見えて困る

xbox_no_are

何を馬鹿な、きっと疲れてるんですよ。
あ、すいません…… しいたけのぱくりですwww

というノリで作ったやつを4年ぶりに更新してFirefox 43以降でも使えるよう署名付けました。

Firefox 43で確認。
インストール: xbox_no_are-1.1.1-fx.xpi

※アドオン形式にしましたがStylishやuserChrome.cssだけでいけます。

JavaScriptのtypeofって大雑把すぎんじゃね?というやつ

JavaScriptでオブジェクトの型を判別するのにtypeof演算子使うとツラいよね – Qiita
で is(‘型’, 値) という関数が便利なのだけど typeof と比較して10倍ぐらい遅い。
なので、それなりに速度を上げてarrayやnull(とついでにNaN)も判定する関数を考えた。

typeofでなくてtypeOf()です。

ES6が使えない場合は Number.isNaN がダメなので typeof val === ‘number’ && isNaN(val) とする必要があります。

node-mysqlのコールバック地獄をES6 GeneratorとPromiseでなんとかする

node-mysqlのコールバック地獄をthunkifyでなんとかする でやったthunkify使わずにPromiseでやるやつです。

thunkifyより柔軟な処理ができるかもしれません。
db.query(‘SELECT … ‘, function(err, rows) {}) の代わりにPromiseな db.exec() も同じように用意してます。

'use strict';
// pool connection + Promise
var mysql = require('mysql2'),
    pool;

function getPoolConnection() {
    if (!pool) pool = mysql.createPool({host: '***', user: '***', password: '***'});
     return new Promise(function(resolve, reject) {
         pool.getConnection(function(err, connection) {
             if (err) {
                 reject(err);
             } else {
                 // conn.exec = <Promise>
                 connection.exec = function(query) {
                     return new Promise(function(res, rej) {
                         connection.query(query, function(err, rows) {
                             err ? rej(err) : res(rows);
                         });
                     });
                 }
                 resolve(connection);
             }
         });
     });
}
// then, catchを使う…… と、あまり変わらないけれど
function example1() {
    getPoolConnection()
        .then(function(db) {
            db.exec('SELECT * FROM ... ')
              .then(function(rows) {
                  console.log(rows);
                  db.release();
              })
        })

}

// generator functionを使う
function* example2() {
    var db = yield getPoolConnection();
    var res = yield db.exec('SELECT * FROM ....');
    console.log(res);
    db.release();
}

// coでもいい
co(function* () {
    var db = yield getPoolConnection();
    var res = yield db.exec('SELECT * FROM ....');
    console.log(res);
    db.release();
})

UserScriptLoader.uc.jsの@requireが動かない

@requireでjQueryやunderscore.jsを読み込んでるユーザースクリプトを使うとき、requireディレクトリにキャッシュがない場合、saveURI()で失敗するようになってます。
調べるとFirefox 36以降でパラメータが増えてるのが原因っぽいです。

void saveURI(
  in nsIURI aURI,
  in nsISupports aCacheKey,
  in nsIURI aReferrer,
  in long aReferrerPolicy,
  in nsIInputStream aPostData,
  in string aExtraHeaders,
  in nsISupports aFile,
  in nsILoadContext aPrivacyContext
);

ということで wbp.saveURI(uri, null, null, null, null, aFile, null); となってる箇所の4番目(in long aReferrerPolicy)に null を追加すると保存されます。

	wbp.persistFlags = Ci.nsIWebBrowserPersist.PERSIST_FLAGS_BYPASS_CACHE;
	wbp.persistFlags |= Ci.nsIWebBrowserPersist.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION;
	wbp.saveURI(uri, null, null, null, null, null, aFile, null);
	USL.debug("getContents: " + aURL);

同じようにメニューのSave Scriptをクリックしたときに保存できないのもsaveURIのパラメータが足りないからです。
こんな感じで null 追加。

			var loadContext = win.QueryInterface(Ci.nsIInterfaceRequestor)
				.getInterface(Ci.nsIWebNavigation)
				.QueryInterface(Ci.nsILoadContext);
			wbp.saveURI(uri, null, uri, null, null, null, fp.file, loadContext);

XPCOM廃止するとか言ってんのに今さら仕様変更すんなよ……。

録画したファイルをHandBrakeでまとめてエンコードするやつ

特定のフォルダに保存した *.ts ファイルをHandBrakeでエンコードするやつです。
ファイルサイズを小さくするのが目的なので2pass 1500kbpsでわりとエンコード速度遅い設定です。
字幕が入ってたらそれとなく突っ込むようにしてますが外字が含まれてた場合は[外: hogehoge]になるか消えるかします。どのCaption.dllを使うかによるみたい。

必要なもの

このbatファイルをWindowsのタスクスケジューラで毎日4時(大体の放送が終わってそうな時間)に実行するようにしてるので寝てる間にフォルダに4~6ファイル突っ込んで起きるころには終わってるようなアレ。

へっぽこスクリプト・スタイルシート