ページ内の全てのスクロールバーを一番上に移動する
はじめに
「Firefoxにて,ページ内の全てのスクロールバーを一番上に移動したい」という状況が生じたのでメモ.
方法を簡単に言うと,ページ内の全てのDOM要素についてscrollTop要素が無いかチェックし,もしあれば0を代入する.
※今回用いるevaluateメソッドは,firefox以外では使えないので注意.
やりかた
//XPathを用いて,ページ内DOM要素を全取得(ただし,返り値はイテレータ) let xpathResult = document.evaluate("//*",document,null,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null); //各DOM要素を巡回し,もしscrollTopプロパティがあれば一番上に let itr = xpathResult.iterateNext(); while(itr) { if(itr.scrollTop) { itr.scrollTop = 0; } itr = xpathResult.iterateNext(); }
evaluateにてscrollTopプロパティを持つ要素のみを取得したかったけれど,やり方が分からなかった…
もしご存知の方いらっしゃったら教えて下さいm(_ _)m
.NETのParallel.For的な処理をbashで
はじめに
「.NETやopenMPのparallel for的な処理をbashでやりたい」という状況が生じたのでメモ.
方法を簡単に言うと,xargsにseqでループカウンタを渡して,各処理をパラレルに処理する.
※xargsによる並列処理については以前に書いた*1.
やりかた
$ seq [カウンタ開始値] [カウンタ終了値] | xargs -P[並列数] -Ix bash -c '[具体的な処理]'
seqでループカウンタを生成して*2,それをxargsに渡して処理する.
ただし,各処理におけるループカウンタ値はxで参照する*3.
これは,C#(.NET)における次のようなコードと対応する.
Parallel.For([カウンタ開始値], [カウンタ終了値], new ParallelOptions() {MaxDegreeOfParallelism = [並列数]}, x => [具体的な処理])
具体例
$ seq 1 10 | xargs -P8 -Ix bash -c 'echo x'
実行結果は次のようになる.
3 1 2 4 5 6 7 8 9 10
ただし,結果の出力順序は毎回変化する.
これは,xargsにおける並列処理の終了順序に依存するためである.
xargsで並列処理
はじめに
「コマンドライン引数を色々試したいけど,各処理がシングルスレッドで回って遅い…」という状況が生じたのでメモ.
対処法を簡単に言うと,xargsにより各処理をパラレルに処理することにより高速化する.
言ってしまえば,ターミナルを複数立ち上げて実行するのを1つのターミナルでやってしまうようなもの.
具体的な方法
$ for ((param=0; param<10; param++)) ; do echo ./program $param >> commands.sh; done $ cat commands.sh | xargs -P8 -I{} -t bash -c '{}'
1行目でスクリプトを作成し,
2行目で1行目のスクリプトを並列処理する.
これは,一行にまとめて
$ for ((param=0; param<10; param++)) ; do echo ./program $param >> commands.sh; done | xargs -P8 -I{} -t bash -c '{}'
としても勿論OKであるが,どんなパラメータで実行したのかログを残すという意味で
一旦shに書き出しておいたほうがいいのかも.
xargsの引数について補足すると,
-Iはパイプされた文字列を続く変数名に格納.ここでは変数名{}にコマンドを格納.
-tはxargsで実行したコマンドを標準出力.
*1:リソースを最大限使うように並列数を自動的に設定する
MySQLで全テーブルのカラム名取得
はじめに
「カラム名だけが分かっており,それがどのテーブルに含まれるのかが不明」という状況が生じたのでその対処法をメモ.
全テーブルのカラム名を取得
$ mysql -u[ユーザ名] -p[パスワード] -D[データベース名] -e "show tables;" 2>/dev/null \ | xargs -I{} bash -c " echo -e '\n-----<< {} >>-----'; \ mysql -u[ユーザ名] -p[パスワード] -D[データベース名] -e 'desc {};' \ | perl -nle 'print [split(/\t/,\$_)]->[0]' \ | grep -v 'Field'" 2>/dev/null
すると,下のような標準出力が得られる.
-----<< テーブル名1 >>----- カラム名1 カラム名2 カラム名3 . . . -----<< テーブル名2 >>----- カラム名1 カラム名2 カラム名3 . . .
RSpecによるテスト記述
はじめに
RSpec2の書き方について,考えがまとまってきたので残しておきます.
テスト作成における全体流れとしては,
- メソッドレベルでテストケースを作成
- 1.をRSpecに落としこむ
ただし,1.におけるテストケースは2.に向けて書きます.
1. メソッドレベルでテストケースを作成
具体的には,下のようなテストケース表を作ります.
#ケース | テストケース名 | 入力1:input_1 | 出力 | 例外 |
---|---|---|---|---|
1 | 正常系:〜のとき,〜を返却すること | |||
2 | 異常系:〜のとき,〜の例外を投げること | 例外名, 例外メッセージ |
具体例を考えてみます.
例えば,以下のようなクラスに対するテストケースを考えてみます.
# -*- mode:ruby; coding:utf-8 -*- class ClassName def self.method_name(input_1, input_2) return input_1 + input_2 end end
#ケース | テストケース名 | 入力1:input_1 | 入力2:input_2 | 出力 | 例外 |
---|---|---|---|---|---|
1 | 正常系:入力値がともに文字列であるとき,それらを連結した文字列を返却すること | 'hoge' | 'fuga' | 'hogefuga' | |
2 | 異常系:input_1が文字列以外であるとき,例外を投げること | nil | 'fuga' | ArgumentError, '入力値が不正です.input_1が文字列以外です.' | |
3 | 異常系:input_2が文字列以外であるとき,例外を投げること | 'hoge' | 3 | ArgumentError, '入力値が不正です.input_2が文字列以外です.' |
テストケースの作成方法については,ここでは要因分析*1に基いて考えています.
*1:入力引数それぞれについて,規定の型であるかどうか等