whole_func_string: function parallel(tasks) {
  
  
              if (!isArray(tasks)) {
                  throw new Error('tasks is not array.');
              }
  
              if (isArrayEmpty(tasks)) {
                  return this.add(function passEmpty(err, res, next) {
                      next(null, new ParallelHandler(0).resultObj);
                  });
              }
  
              // normalize each task
              for (var i = 0, l = tasks.length; i < l; i++) {
                  var t = tasks[i];
                  tasks[i] = this._normalizeTask(t);
              }
  
              return this.add(function callParallel(err, res, next) {
  
                  var parallelHandler = new ParallelHandler(tasks.length);
                  parallelHandler.onFinish(function onFinishParallel(resultObj) {
  
                      // pass a latest error, if exists
                      var e;
                      for (var i = 0, l = resultObj.err.length; i < l; i++) {
                          var anError = resultObj.err[i];
                          if (anError !== undefined && anError !== null) {
                              e = anError;
                          }
                      }
                      next(e, resultObj);
                  });
  
                  tasks.forEach(function callEachTask(t, idx) {
  
                      setTimeout(function callTaskAsync() { // call async
                          new Bucks().add(t).end(function (e, r) {
                              if (e) {
                                  parallelHandler.successOne(idx, e, null);
                              } else {
                                  parallelHandler.successOne(idx, null, r[0]);
                              }
                          });
                      }, 0);
                  });
              });
          }
func_code_string: function parallel(tasks) {
  
  
              if (!isArray(tasks)) {
                  throw new Error('tasks is not array.');
              }
  
              if (isArrayEmpty(tasks)) {
                  return this.add(function passEmpty(err, res, next) {
                      next(null, new ParallelHandler(0).resultObj);
                  });
              }
  
              // normalize each task
              for (var i = 0, l = tasks.length; i < l; i++) {
                  var t = tasks[i];
                  tasks[i] = this._normalizeTask(t);
              }
  
              return this.add(function callParallel(err, res, next) {
  
                  var parallelHandler = new ParallelHandler(tasks.length);
                  parallelHandler.onFinish(function onFinishParallel(resultObj) {
  
                      // pass a latest error, if exists
                      var e;
                      for (var i = 0, l = resultObj.err.length; i < l; i++) {
                          var anError = resultObj.err[i];
                          if (anError !== undefined && anError !== null) {
                              e = anError;
                          }
                      }
                      next(e, resultObj);
                  });
  
                  tasks.forEach(function callEachTask(t, idx) {
  
                      setTimeout(function callTaskAsync() { // call async
                          new Bucks().add(t).end(function (e, r) {
                              if (e) {
                                  parallelHandler.successOne(idx, e, null);
                              } else {
                                  parallelHandler.successOne(idx, null, r[0]);
                              }
                          });
                      }, 0);
                  });
              });
          }
func_documentation_string: 複数タスクを並行して実行します。各タスクの結果が　{res:[], err:[]}
  として次に渡ります。res, errはそれぞれタスクと同じサイズの配列で
  結果が無い部分はnullになります。
  @memberof Bucks
  @instance
  @param {Array} tasks タスクの配列です。タスクの形式は addと同様です
  @return {Bucks}