テストとjQueryのeachっぽい何かを書いてみた

jQueryは便利だけど、わざわざjQueryをロードせずともできるだけ同じようなことがしたいというときに便利。jQueryほどセレクタの指定ができないが、forEachでぐるぐると実行してくれるので便利。おまけにテストも書いてみました。 使う場面としたら、Chrome拡張やブックマークレットくらいでしょうか。
<script>


/* スクリプト
-------------------------------------------------------------------------------*/
var tags, classes, id;
(function(){
    var a = function(o){return Array.prototype.slice.apply(o)},
    d = document,
    g = function(t){return d.getElementsByTagName(t)};
 
    tags = function(t, f, h) {
        var c = 0;
        a((h == undefined ? g(t) : h.getElementsByTagName(t))).forEach(function(h) {
            f.call(h, c);
            c++;
        });
    };
 
 
    classes = function(l, f, h) {
        var o = 0;
        a((h == undefined ? g("*") : h.getElementsByTagName("*"))).forEach(function(h) {
            var c = h.className.split(" ");
            for (var i = 0; i < c.length; i++) {
                if (c[i] == l) {
                    f.call(h, o);
                    o++;
                    break;
                }
            };
        });
    };
 
    id = function(i, f) {
        f.call(d.getElementById(i));
    };
}).call(this);



/* テストスクリプト
-------------------------------------------------------------------------------*/

var testResult = "";
var print = function(_print) {
    testResult += _print;
};

var testData = function() {
    document.write(new Array(100).join("-")+"<br/>");
    document.write("テストデータ<br/>");
    document.write(new Array(100).join("-")+"<br/><br/>");
};



var testLog = function(){
    document.write("<br/><br/>");
    document.write(new Array(100).join("-")+"<br/>");
    document.write("テスト結果<br/>");
    document.write(new Array(100).join("-")+"<br/>");
    document.write(testResult);
};


var suite = function(_suite) {
    print("<br/>■ "+_suite+"<br/>");
};

var test = function(_name){

    var result = 1;
    for (var i = 1; i < arguments.length; i++) {
        if (typeof(arguments[i]) == "function") {
            try {
                result = result && arguments[i]();    
            }
            catch (_error) {
                result = 0;
                throw (_error);
            }
            break;
        }
    };

    print((result ? "○" : "×")+" ");
    print(_name);
    print("<br/>");
};


testData();
</script>


<!-- テスト用データ
=============================================================================== -->
<meta charset="UTF-8">
<div>hoge</div>
<div class="hoge">hoge</div>
<div>hoge</div>
<div id="fufu">hoge</div>
<div class="hage hoge test">
    <span>aaa</span>
    <span>aaa</span>
    <span>aaa</span>
    <span>aaa</span>
</div>
<div class="test">
    <span>bbb</span>
    <span>bbb</span>
    <span>bbb</span>
    <span class="test">bbb</span>
    <span class="test">bbb</span>
    <span>bbb</span>
    <span>bbb</span>
</div>


<script>

/* テスト実行
-------------------------------------------------------------------------------*/

suite("tags");

test("ちゃんとtagsが実行された", function(){
    var count = 0;
    tags("div", function(){
        count++;
    });
    return count == 6;
});

test("インデックスが一致している", function(){
    var count = 0;
    var flag = 1;
    tags("div", function(i){
        count++;
        if (count == i) {
            flag = 0;
        }
    });
    return flag;
});

test("二階層目のspanを取得できる", function(){
    var count = 0;
    tags("div", function(i){
        if (i == 5) {
            tags("span", function() {
                count++;
            }, this);
        }
    });
    return count == 7;
});

suite("classes");

test("classesが実行できた", function(){
    var count = 0;
    classes("hoge", function(){
        count++;
    });
    return count == 2;
});

test("インデックスが一致している", function(){
    var count = 0;
    var flag = 1;
    classes("hoge", function(i){
        count++;
        if (count == i) {
            flag = 0;
        }
    });
    return flag;
});

test("カウンタが数値である", function(){
    var flag = 1;
    classes("hoge", function(i){
        if (typeof(i) != "number") {
            flag = 0;
        }
    });
    return flag;
});

test("二階層目のclassを取得できている", function(){
    var count = 0;
    classes("test", function(i){
        if (i == 1) {
            console.log(this);
            classes("test", function() {
                console.log(this);
                count++;
            }, this);
        }
    });
    return count == 2;
});

suite("id");

test("idが実行できた", function(){
    var count = 0;
    id("fufu", function(){
        count++;
    });
    return count == 1;
});

/* テスト結果出力
-------------------------------------------------------------------------------*/
testLog();

</script>

Code language: JavaScript (javascript)

こんなかんじでブックマークレットも作れる
var tags,classes,id;(function(){var a=function(o){return Array.prototype.slice.apply(o)},d=document,g=function(t){return d.getElementsByTagName(t)};tags=function(t,f,h){var c=0;a(h==undefined?g(t):h.getElementsByTagName(t)).forEach(function(h){f.call(h,c);c++})};classes=function(l,f,h){var o=0;a(h==undefined?g("*"):h.getElementsByTagName("*")).forEach(function(h){var c=h.className.split(" ");for(var i=0;i<c.length;i++)if(c[i]==l){f.call(h,o);o++;break}})};id=function(i,f){f.call(d.getElementById(i))}}).call(this);
tags("td",function(){var that=this;tags("a",function(){if(this.innerHTML.indexOf("\\u4ed9\\u53f0")+1)that.style.background="orange"},this)});Code language: JavaScript (javascript)

何も考えないスパム対策

最近このブログにもスパムコメントが結構くるようになった。WordPressを使っているのでしょうがないけど、一度リストに登録されてしまったら頻繁にきてうざったくなってくる。

しょうがなので対策しようと思い至ったわけだが、ここでひとつ面白いスパム対策を紹介したいと思う。スパムは基本botが書き込みをするわけだけど、botは投稿用のURLを直接叩いてきたりするのでなかなか防ぎようがない。だから、人間しか読めないような文字を表示させて入力させるといった認証方式がよく使われるようになってきているけどめんどくさい。

そんなときは、「メールアドレスを隠す」やり方が楽だし簡単。コメントフォームからメールアドレスの入力欄を完全に消さないまでも、人の目から見えないようにしておく、1pxとか、display; none; くらいのサイズにしておく。

そうすると、人間はメールアドレスを入力せず、botだけなぜか入力するという現象がおきる。これをフラグにとって、

メールアドレスが入力された場合は投稿を拒否するようにする。とても簡単かつ効果的なやり方だったりする。

意外と知らないMacの便利なショートカットキー

Macではショートカットを覚えておくと作業が結構楽になることが多々あります。どこにも載っていないような、そんな便利なショートカットを紹介したいと思います。「」で囲まれているのはショートカットキーの組み合わせです。

ファイルを開く

Finderでファイルを選択後、 「Cmd + O」

ファイルを削除

Finderでファイルを選択後、「Cmd + delete」

画像のプレビュー

Finderで画像ファイルを選択後、「スペース」

Dockで画像をプレビュー

Dockでフォルダを開き、画像にカーソルをあわせて「スペース」

タブでアプリケーションを切り替え中にウィンドウも切り替える

「Cmd+Tab」でアプリケーションにフォーカスを合わせた後、そのままキーを離さずに矢印キーの「↑」または「↓」を押してウィンドウを選択し、全てのキーを離し「Enter」

スクリーンショットの部分撮影

「Shift+Cmd+4」のあと部分選択

スクリーンショットの部分クリップボードコピー

「Ctrl+Shift+Cmd+4」のあと部分選択

ウィンドウの部分撮影

「Shift+Cmd+4」のあと、カーソルをウィンドウに合わせ「スペース」を押し「クリック」

ウィンドウの部分クリップボードコピー

「Ctrl+Shift+Cmd+4」のあと、カーソルをウィンドウに合わせ「スペース」を押し「クリック」

スクリーンショット部分撮影時に撮影サイズを維持したまま領域のみ移動する

部分選択を維持しながら(マウスを離さずに)「スペース長押し」

行の最初に移動

テキストエディタ上で、「Cmd+←」

行の最後に移動

テキストエディタ上で、「Cmd+→」

一行選択

テキストエディタ上で、「Cmd+←」、「Shift+Cmd+→」
もしくはマウスで「トリプルクリック」

ファイル保存画面でデスクトップにジャンプ

「Cmd+D」

Finderまたはファイル保存画面で指定したディレクトリに移動

「Shift+Cmd+G」 または「/」、「~」(保存画面のみ)

しかもタブキーでディレクトリを補完してくれます。
~/Destop というように~を使うとホームディレクトリからパスが開始されます。

  • ~/des と入力後「Tab」(Cmd+D) → デスクトップ
  • ~/dow と入力後「Tab」→ 書類
  • ~/pic と入力後「Tab」→ ピクチャ
  • ~/use と入力後「Tab」→ ユーザーフォルダ一覧
  • ~/mus と入力後「Tab」→ ミュージック
  • ~/dow と入力後「Tab」→ ダウンロード
  • ~/mov と入力後「Tab」→ ムービー
  • ~/lib と入力後「Tab」→ ライブラリ

Fiderで目的のファイルまたはフォルダにフォーカスを当てる

Finderを開き、「Mail」というフォルダにフォーカスを当てたい場合は、早く「ma」とキーボードで入力するとそのファイルまたはフォルダにフォーカスが当たる。そして「Cmd+O」を押せばすぐにファイルまたフォルダが開ける

フォルダのサイズを簡単に調べる

Finderでフォルダにフォーカスを当て、「スペース」

保存しますか?確認画面ですぐキャンセルする

「Cmd+D」

タブ切り替えでアプリケーションを終了

「Cmd+Tab」でアプリケーション切り替え中にタブキーを離して「Cmd+Q」
Cmdを押しながらタブキーとQを連打すれば全てのアプリケーションを消せる。

アプリケーションの強制終了

「Option」を押しながらドックでアプリケーションを右クリックし、メニューから強制終了。

画像のサムネイル一覧表示

Finderで画像のたくさんあるフォルダを開き、「Cmd+A」のあと「スペース」。
そして、このボタンを押す。

フルスクリーンで画像のサムネイル一覧表示

Finderで画像のたくさんあるフォルダを開き、「Cmd+A」のあと「Option+スペース」。
フルスクリーンでプレビューが表示されるので、すぐに下のボタンを押す。 

再生ボタンを押せばスライドショーも楽しめる。

スライドショー

Finderで画像のたくさんあるフォルダを開き、「Cmd+A」のあと「option+Cmd+Y」

ショートカット(エイリアス)の作成

Finderでファイルを選択後、「Cmd+L」

ファイルの複製

Finderでファイルを選択後、「Cmd+D」

エイリアスのオリジナル表示

Finderでエイリアスを選択後、「Cmd+R」

新しいフォルダを作る

Finderで「Shift+Cmd+N」

Finderのサイドバーにフォルダ、アプリケーション、ファイルを追加する

Finderでフォルダ、ファイル、アプリケーション、ファイルを選択後、「Cmd+T」
通常のドラッグ&ドロップではファイルは、ファイルとアプリケーションが追加できないので大変便利です。

Finderでファイルの表示方法を切り替える

アイコン表示「Cmd+1」
一覧表示「Cmd+2」
カラム表示「Cmd+3」
プレビュー表示「Cmd+4」

ウィンドウを隠す

「Cmd+H」

デスクトップにジャンプ

Finderで「Cmd+Shift+D」

マイファイルにジャンプ

Finderで「Cmd+Shift+F」

ルートディレクトリにジャンプ

Finderで「Cmd+Shift+C」

ホームディレクトリにジャンプ

Finderで「Cmd+Shift+H」

アプリケーションディレクトリにジャンプ

Finderで「Cmd+Shift+A」

ユーティリティディレクトリにジャンプ

Finderで「Cmd+Shift+U」

ネットワークディレクトリにジャンプ

Finderで「Cmd+Shift+K」

AirDropにジャンプ

Finderで「Cmd+Shift+R」

書類にジャンプ

Finderで「Cmd+Shift+O」

ダウンロードディレクトリにジャンプ

Finderで「Option+Cmd+L」

現在アクティブなウィンドウのみ表示し、他のウィンドウを隠す

「Cmd+Option+H」

前の階層のディレクトリに移動

Finderで「ウィンドウタイトルを右クリック」

スリープせずにディスプレイだけオフにする

「Ctrl+Shift+⏏」
ホットコーナーに設定する方法も便利です。

スリープする

「Cmd+Option+⏏」

テキストエディタでカーソルのある位置にウィンドウをスクロールする

「Ctrl+L」

テキストエディタで周囲の書式設定に合わせてペーストする

「command+shift+option+V」

細かくボリュームを調整する

「shift+option」を押しながらボリューム調整キーを押す。

細かく明るさを調整する

「shift+option」を押しながら明るさ調整キーを押す。

出力装置と入力装置を切り替える

「option」を押しながらスピーカーアイコンをクリック

番外編: ファイルのパスを取得

ターミナルを起動後 ターミナルにファイルまたはフォルダをドラッグ&ドロップ

番外編: ターミナルでファイルまたはフォルダまたはアプリケーションを開く

open を使う。フォルダの場合はFinderでフォルダが開かれ、ファイルの場合はファイルに関連付けられたアプリケーションが起動する。アプリケーションの場合はそのままアプリケーションが起動する。