どこでも見れるメモ帳

とあるSEの備忘録。何かあれば気軽にコメントください〜

ページ内の全てのスクロールバーを一番上に移動する


はじめに

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における並列処理の終了順序に依存するためである.

*1:http://d.hatena.ne.jp/ni66ling/20140122/1390378406

*2:ここでは$ seq [カウンタ開始値] [カウンタ終了値]としているが,$ seq [カウンタ開始値] [カウンタ増加値] [カウンタ終了値]としてカウンタ増加値を設定することもできる.

*3:パラメタ-Ixにて,入力をxで参照することを宣言したため.-I{}とすることが多い.

xargsで並列処理


はじめに

コマンドライン引数を色々試したいけど,各処理がシングルスレッドで回って遅い…」という状況が生じたのでメモ.
対処法を簡単に言うと,xargsにより各処理をパラレルに処理することにより高速化する.
言ってしまえば,ターミナルを複数立ち上げて実行するのを1つのターミナルでやってしまうようなもの.

xargsによる並列処理

xargs -P

により,並列処理する.-Pは並列の意味.
並列数は-Pの後に記述する.-P8なら8並列化.
また,-P0とすれば並列数が自動的に決定される*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
.
.
.

カラム名からテーブル名を探す場合は,grepすればOK.

RSpecによるテスト記述

f:id:ni66ling:20160611144301p:plain

はじめに

RSpec2の書き方について,考えがまとまってきたので残しておきます.
テスト作成における全体流れとしては,

  1. メソッドレベルでテストケースを作成
  2. 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:入力引数それぞれについて,規定の型であるかどうか等

続きを読む