「JavaScript」タグアーカイブ

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

Node.js は –harmony を付けて起動、 io.js ならそのまま使えるのでちょろい。

まず、node-mysql (node-mysql2) の createConnection を使う場合。そこまで変なことしないで thunkify(db.query.bind(db)) にだけ気をつけたらいけます。
ググるとこの方法使ってるのよく見ます。

var mysql    = require('mysql2'),
    thunkify = require('thunkify'),
    co       = require('co');

var db = mysql.createConnection({host: '***', user: '***', password: '***'}),
    query = thunkify(db.query.bind(db));

co(function* () {
    var res = yield query('SELECT * FROM hoge');
    console.log(res);
    db.end();
})

そして、createPoolを使う場合。
pool.getConnection(function(err, db){}) をやってから thunkify(db.query.bind(db)) とするのでちょっと面倒臭いです。

// pool connection 普通のやつ

var pool = mysql.createPool({ ... });

pool.getConnection(function(err, db) {
    db.query(' ... ', function(e, res) {
        console.log(res);
    });
    db.release();
});

このなんかすっきりしないコールバックを下のような感じにすれば、それなりに便利な書き方ができるんじゃないでしょうか。

// pool connection + thunkify

var mysql    = require('mysql2'),
    thunkify = require('thunkify'),
    co       = require('co'),
    pool;

function* getConn() {
    if (!pool) pool = mysql.createPool({host: '***', user: '***', password: '***'});
    var db    = yield thunkify(pool.getConnection.bind(pool))(),
        query = thunkify(db.query.bind(db));

    // db.query を残したまま ES6 generator 用の db.exec を作る
    db.exec = function* () {
        return yield query.apply(null, arguments);
    }
    return db;
}

co(function* () {
    var db  = yield getConn(),
        res = yield db.exec('SELECT * FROM hoge');

    console.log(res);
    db.release();
})

ちょっと長くなったような気もしますが、 co(function* () … の中身がスッキリして見やすくなりました。
今使ってるio.jsのオレオレRSSリーダーでcreateConnectionよりcreatePoolの方がほんの少し速いので、しばらくこれでいこうかなと。

Firefoxのブックマークツールバーにあるフォルダをマウスオーバーで開くだけ.uc.js

動作確認

フォルダ開くのに1クリックすら面倒くさい。
そんな感じでしたがマウスオーバーで開くと逆に鬱陶しく感じるようになって使ってないので動作確認しただけです。

ダウンロード: mouseover-open-bookmark-folder.uc.js
GitHub: mouseover-open-bookmark-folder.uc.js

「キャッシュを消す」メニューを追加する (Firefox 34, HTTP cache v2).uc.xul

clear-cache-v2

動作確認

2014年8月ぐらいにHTTP cache v1 API disabledとなってたようで、以前書いたキャッシュを消すスクリプトだとFirefox 32以降の HTTP cache v2 API (cache2フォルダに保存されてるやつ)に対応できてなかったので作り直しました。

.uc.jsじゃなくて.uc.xulになってますが document.createElement(‘menuitem’) とか書いてるのが面倒臭くなっただけです。

基本機能はツールメニューに「キャッシュを消去」を追加するだけです。

Firefox ESR 31でもabout:configでHTTP cache v2を使うようにすればいけます。

ダウンロード : clear-all-cache-v2.uc.xul
GitHub : clear-all-cache-v2.uc.xul

<script type="application/x-javascript"><![CDATA[
var ucjsCacheClear = function() {
    var cacheSS = Cc["@mozilla.org/netwerk/cache-storage-service;1"].getService(Ci.nsICacheStorageService);
    try {
        cacheSS.clear();
    } catch (e) {
    }
    // Vimperator
    var liberator = document.getElementById("liberator-message");
    if (liberator) {
        liberator.value = 'キャッシュ消去';
    }
}
]]></script>
<menupopup id="menu_ToolsPopup">
    <menuitem id="menu_ToolsCacheClear"
              label="キャッシュを消去"
              accesskey="c"
              oncommand="ucjsCacheClear()"/>
</menupopup>

タブを閉じたとき直前に開いていたタブにフォーカスするだけじゃなくなった.uc.js

動作確認

そんなアドオンあったのですが自分が使いたい動作じゃなかったので作ってるとやたら機能が増えて困ってしまったやつ。

開いたり選択するとタイムスタンプを更新していって閉じたときに直前に開いていたタブにフォーカスするというのが基本動作ですが、未読タブがあるときは未読を優先的にフォーカスします。

追加機能としてタブバー上のShift+マウスホイールでタイムスタンプ順に切り替えます。
ただのマウスホイールで普通に切り替えるアドオンとかありそうなのでShift付きです。

さらに、タブ関係のアドオン入れてなくてどのタブが未読か分からなかったので自前でCSS付け足すことも可能になったり、既読タブにもう一度未読属性付け直したりもできます。
flt-unread
CSSサンプルは未読に赤い線付けるような感じです。テーマによってズレまくるので分かる人向け。
簡単に太字とか色を変える程度でも十分ではと。

prefs.jsで新規タブはバックグラウンドで開くようにしてるので(“browser.tabs.loadInBackground”, true)、未読だけ見たいときにそのタブを開いた順番(ここだけ逆順)にフォーカスしていきます。作り込みが甘いので未読関係のは変な動作するかもしれません。

あと、Session store APIを使ってタイムスタンプ等を保存してるのでFirefoxを閉じてもセッション情報が残ってたらタブを開いた順番や未読も次回に持ち越しできます。

セッションを自動で保存するアドオン Session Manager との併用もたぶん大丈夫っぽいです。

ダウンロード: focus-last-tab.uc.js
GitHub: focus-last-tab.uc.js

最近の修正内容とか

Firefoxのタブバー上ミドルクリックで閉じたタブを元に戻すだけ.uc.js

動作確認

Tab Mix PlusやTab Utilitiesは使ってなくてこの機能だけ欲しかったので。
タブ開きすぎるとクリックする場所がないので「新しいタブを開く」ボタンのミドルクリックでも閉じたタブを復元します。

ダウンロード : middle-click-undo-close-tab.uc.js
GitHub : middle-click-undo-close-tab.uc.js

検索エンジンメニューのミドルクリックで検索エンジンを切り替えてさらに貼り付けて検索.uc.js

select-and-paste-and-search
この検索エンジン選ぶメニューのミドルクリックです。分かりづらいです。

動作確認

「検索エンジン切り替え→貼り付けて検索」をするのに「クリック(メニュー出す)→クリック(検索エンジン選択)→右クリック→貼り付けて検索」とわりと手間が掛かるのでそこ一気にやってしまおうというやつです。

ノリで作ったのであまり確認してません。
たぶん同じmenuitem.labelがあると最初のやつになるような気がします。

すでに検索エンジン選択したあとだったら検索エンジンのアイコンをそのままミドルクリックするだけで貼り付けて検索します。

ダウンロード: search-engine-select-and-paste-and-search.uc.js
GitHub: search-engine-select-and-paste-and-search.uc.js

最近の修正内容とか

タブのダブルクリックでピン留め切り替えるだけ.uc.js

動作確認

タブ関連のアドオンは無駄な機能多くて入れたくないけど、ミドルクリックでタブ復元みたいな「これだけ欲しい!」という事が結構あるのですよ。

というわけで、タブのダブルクリックで「タブをピン留め」、もう一度ダブルクリックで「ピン留めを外す」です。

ダウンロード : dblclick-tab-pinned.uc.js
GitHub : dblclick-tab-pinned.uc.js

FirefoxのCtrl+Fで検索バーの表示/非表示に置き換えるやつ.uc.xul

動作確認

通常はCtrl+Fで検索バーが表示されますが、もう一度Ctrl+Fで非表示にするというアレです。

Firefoxまとめサイト userChrome.jsにあった「Ctrl+F押したらFindbarが出るけどもう一回押したら消える.uc.xul」はFirefox 4に対応してなかったので。

ドメイン失効したやつのリンクになってたのでURL修正。ついでに最新っぽいFirefoxでも動作確認。

ダウンロード : toggle-findbar.uc.xul
GitHub: toggle-findbar.uc.xul

<script type="application/x-javascript"><![CDATA[
var ucjsToggleFindBar = function() {
    gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
}
]]></script>
<window id="main-window">
  <keyset id="mainKeyset"><key id="key_find" oncommand="ucjsToggleFindBar()" /></keyset>
  <commandset id="mainCommandSet"><command id="cmd_find" oncommand="ucjsToggleFindBar()" /></commandset>
</window>

検索バーを自動でリセットする.uc.js として動作するはずだった

動作確認

検索開始したら2秒後ぐらいに一番上の検索エンジンに戻してキーワードクリアします。それだけです。

Firefox 34で動かなかったので作り直しました。それぞれaddEventListenerでみてるので修正しやすくなったのではと思います。

※動かないみたいなんでファイル消してます。git cloneでもしてください。

ダウンロード : auto-reset-searchbar.uc.js

更新した履歴

  • 2014.12.10 やっぱり動かないらしいです。自分しか使えないなら意味ないので消しました
  • 2014.12.10 デフォルトで2秒後にリセット、検索バーにフォーカスしてもタイマー止めない
  • 2014.12.09 定数名にプレフィックス
  • 2014.12.09 最初の定数でどの場合にリセットするか
  • 2014.12.09 Firefox 34で動かないので作り直した
  • // このへんを true / false 入れ替えたり タイマー(ミリ秒)の時間を変えるといいかもしれん
    
    (function() {
        // リセットするまでにちょっと時間をおくかどうか [true=タイマー使う, false=即時クリア]
        const ARS_USE_TIMER = true;
        // リセットするまでの時間(ミリ秒) [3000=3秒]
        const ARS_TIMER_MS  = 2000;
        // 検索したら一番上の検索エンジンに戻すかどうか [true=戻す, false=そのまま]
        const ARS_USE_DEFAULT_ENGINE = true;
        // リセットタイマーが動いてるときに検索バーにフォーカスでタイマーを止めるかどうか [true=止める, false=止めない]
        const ARS_USE_FOCUS = false;
        // 検索ボタンクリックでクリアするかどうか [true=クリア, false=そのまま]
        const ARS_USE_CLICK = true;
        // 貼り付けて検索のときにクリアするかどうか [true=クリア]
        const ARS_USE_COMMAND = true;
        // Enterキーで検索のときにクリアするかどうか [true=クリア]
        const ARS_USE_ENTER = true;
    
    
    
    

Firefox 31で移動できないボタン(進む・戻る・リロード)をブックマークボタンの左に持ってくるだけ.uc.js

fx31

Firefox 31でもこの配置にしたかっただけなんや……。
テーマによってはロケーションバーと進む・戻るが一体化してるようなのがあるのでuserChrome.cssなんかで修正が必要かもしれません。
リロードボタンもたぶんズレます。

ダウンロード: move_back_and_forward_button.uc.js

// ==UserScript==
// @name           Move back & forward button
// @description    進む・戻る・リロードボタンをブックマークボタンの左に持ってくるだけ
// @version        1.0
// @author         oflow
// @compatibility  Firefox 31
// @namespace      http://oflow.me/archives/1216
// ==/UserScript==

(function() {
    Components.utils.import('resource:///modules/CustomizableUI.jsm');
    var id = 'bookmarks-menu-button',
        buttonIds = ['back-button', 'forward-button', 'urlbar-reload-button', 'urlbar-stop-button'];

    // ブックマークボタンをナビゲーションバーの先頭に移動させとく
    var ids = CustomizableUI.getWidgetIdsInArea(CustomizableUI.AREA_NAVBAR);
    if (ids.indexOf(id) == -1) {
        CustomizableUI.addWidgetToArea(id, CustomizableUI.AREA_NAVBAR, -1);
    }

    var before = document.getElementById(id);
    buttonIds.forEach(function(buttonId) {
        var button = document.getElementById(buttonId);
        before.parentNode.insertBefore(button, before);
    });
})();