Hatena::Grouperlang

檜山正幸のErlang未確認情報 RSSフィード

 | 

2009-03-13 (金)

例外で投げるReasonデータについて考える

| 18:04

だいぶ前に小さなモジュールcommon_errrorを書いた(最後に付ける)。動機やラショネール*1の説明をしておこう。

Erlangの標準ランタイムエラー

Erlangの標準ランタイムエラーについては次で書いている。

この記事のなかにある表の原典は、

再掲しておく。

番号 Reasonデータ 説明
1 badarg 引数の型が不正。
2 badarith 算術演算引数が不正。
3{badmatch,V} パターンマッチが失敗。値Vがマッチしない。
4 function_clause 関数呼び出しにおいて、マッチする関数節が見つからない。
5{case_clause,V} case式において、マッチする分岐が見つからない。値Vがマッチしない。
6 if_clause if式において、真となる分岐が見つからない。
7{try_clause,V} try式のof節において、マッチする分岐が見つからない。値Vがマッチしない。
8 undef 関数呼び出しにおいて、関数が見つからない。
9 {badfun,F} 関数Fに関してなにか不具合がある。
10 {badarity,F} fun式に対する引数の個数が食い違っている。Fはfun式の実体と引数を記述するタプル。
11 timeout_value receive after式のタイムアウト値が、整数でもinfinityでもない。
12 noproc 存在しないプロセスにリンクしようとした。
13 {nocatch,V} catchの外でthrow式を評価しようとした。Vはthrowしたターム。
14 system_limit システムリミットに到達した。システムリミットに関する情報は「Efficiency Guide」を参照。

Reasonデータが実際に投げられるデータだが、次のどちらかの形をしている。

  1. atom() (単一のアトム)
  2. {atom(), term()} (アトムと任意のタームのタプル)

アトムをErrId、付随するタームをHintと呼ぶことにする。この言葉を使ってあらためて述べれば:

  1. 形式1 ErrId : エラーの種別を表す単一のアトム。ランタイムエラーの一部や、POSIXエラーで使用される。
  2. 形式2 {ErrId, Hint} : エラーの種別を表す単一のアトムと、ヒントとなるタームの組。ランタイムエラーの一部で使用される。

この2つの形式をユーザーライブラリで使うのは勧められない。

ユーザーライブラリで使うReasonデータの形式

次がいいと思われる。

  • 形式3 {{Mod, ErrId}, (Hint|none)}

ErrId, Hintの意味は、標準ランタイムエラーと同じ。だが、エラーの種別を、モジュールMod(アトム)とエラー種別ErrIdの組 {Mod, ErrId}とする。ヒントが特にないときは、第二要素をnoneとする。ヒントがないときに {Mod, ErrId} としてしまうと、先の {ErrId, Hint} とパターンで区別ができなくなる。

例えば、user_dbというモジュールでalready_registeredというエラーが発生し、ヒント情報としてターム{"hiyama", "hiyama at chimaira dot org", male}を投げたいときは、次を実行する。

throw({{user_db, already_registered}, % エラー識別
       {"hiyama", "hiyama at chimaira dot org", male} % ヒント・ターム
      })

この例外をキャッチした側が人間可読メッセージを生成したいときは、次の関数common_error:format_error/1に、受け取ったReasonデータをそのまま渡す。

%% module  common_error

format_error(Reason = {{Mod, ErrId}, Hint}) when is_atom(Mod) ->
  try
    Mod:format_error(Reason)
  catch
    error:undef ->
      S = atom_to_list(ErrId) ++ 
        if 
          Hint =:= none -> 
            "";
          true -> 
            io_lib:format(" ~p", [Hint])
        end,
      lists:flatten(S)
  end;

common_error:format_errro/1 は、実質的に Mod:format_error(Reason) を呼び出すだけ。ここで、Modは例外の発生源となったモジュール(より正確な解釈は、下の「エラー識別子の解釈と指針」を参照)。

ユーザーライブラリ側のformat_error/1

次のような感じの関数を準備する。Mod:format_error/1は、入れ子になった文字リスト(iolist()型データ)を返してもいい。

%% module  user_db

format_error(_Reason = {{?MODULE, ErrId}, Hint}) ->
  case Hint of
    none ->
      do_format_error(ErrId);
    _ ->
      do_format_error(ErrId, Hint)
  end.

do_format_error(not_started) ->
  "manager process is not started".

do_format_error(illegal_data, Hint) ->
  io_lib:format("illegal data: ~p", [Hint]);
do_format_error(already_registered, Hint) ->
  io_lib:format("already registered: ~p", [Hint]).

武士道プログラミングにのっとり余計なことは書かない。エラー処理でエラーが起きる事態まで考えてもしょうがない、ランタイムエラーに任せよう。

エラー識別子の解釈と指針

エラー識別子{Mod, ErrId}のモジュール名部分Modは、ErrIdに対する名前空間を提供する。モジュールfooに属する関数がエラーを投げるとき、その識別子を必ず {foo, Id} にする必然性はない。{Mod, ErrId} のMod部分は、エラーのカテゴリーモジュール名で代用したものだから。

複数のモジュール foo, bar, baz に対して、単一の識別子zotを割り当てて、エラー識別子は {zot, Id}を使ってもよい。この場合、モジュールzotは、format_error/1を公開するだけで、他の関数を含まなくてもよい。Erlangでは、モジュールのグループをアプリケーションと呼ぶから、アプリケーションに対して1つのエラーカテゴリーを割り当てるのが妥当かもしれない。

アプリケーション名がAppのとき、App.erl にformat_error/1を用意し、実際のエラーメッセージなどはApp_errors.erlのような別モジュールにまとめるほうが管理しやすいだろう。

いずれにしても、common_errorとライブラリの利用者は、Reasonデータの詳細には無関係に、common_error:format_error/1 を呼び出して人間可読メッセージを手に入れることができる。

[追記]実際に使ってみると、面倒なのでエラーカテゴリーもたいてい ?MODULE にしちゃうな。複数のモジュールに共通したエラーがあるときは、例外を投げるモジュールとformat_errorを実装するモジュールが違う事態になるけど、それってけっこう大規模なときだろう。[/追記]

その他のReasonデータ形式

common_error:format_error/1 は、次の形式のReasonデータも処理できる。

  1. 形式4 {{Mod, ErrId}, (Hint|none), MsgStr}
  2. 形式5 {{Mod, ErrId}, (Hint|none), MsgStr, MsgArg}

これは、エラーを投げる側が、その場でメッセージ文字列を生成したいときに使う形式。滅多に使わないと思う。

メッセージ文字列の書き方

Erlangの文化と習慣では:

  1. 英語(自然言語)の文だけを含む。ヒント情報がその文に含まれていてもよい。
  2. 文の先頭を大文字にしない。
  3. 文末にピリオドも改行も付けない。
  4. その他、余計な装飾は付けない。
  5. 戻り値は iolist() 型(http://erlang.org/doc/man/file.html)でよい。

ランタイムエラー/POSIXエラーと、それに対するメッセージの実例は、次のソースコードを参照。

  1. stdlib/src/lib.erl のexplain_reason/5
  2. stdlib/src/erl_posix_msg.erl の message/1

エラーメッセージの例

実際のメッセージ文字列を挙げておく。こんなふうに書く。文頭の大文字化、ピリオドの付加なども、最終的な表示を作る際に加工することを前提に、「中間段階で余計なことはしない」という方針。まー、Erlangらしい。

stdlib/erl_posix_msg.erl :

message(e2big) -> "argument list too long";
message(eacces) -> "permission denied";
message(eaddrinuse) -> "address already in use";
message(eaddrnotavail) -> "can't assign requested address";
message(eadv) -> "advertise error";
message(eafnosupport) -> "address family not supported by protocol family";
message(eagain) -> "resource temporarily unavailable";
message(ealign) -> "EALIGN";
message(ealready) -> "operation already in progress";
message(ebade) -> "bad exchange descriptor";
message(ebadf) -> "bad file number";
message(ebadfd) -> "file descriptor in bad state";
message(ebadmsg) -> "not a data message";
message(ebadr) -> "bad request descriptor";
message(ebadrpc) -> "RPC structure is bad";
message(ebadrqc) -> "bad request code";
message(ebadslt) -> "invalid slot";
message(ebfont) -> "bad font file format";
%%
%% ... 途中省略 ...
%%
message(exfull) -> "message tables full";
message(nxdomain) -> "non-existing domain";
message(_) -> "unknown POSIX error".

"EALIGN" はさぼっているか、ちゃんと書くのを忘れているな。「その他のエラー」は "unknown XXXX error" と書くのがよろし。

参考

ランタイムエラー、POSIXエラーのフォーマット化に対しては、

  1. lib:format_exception/6, escript:format_exception/2(プライベート),
  2. shell:report_exception/4(プライベート)、
  3. file:format_error/1

モジュールごとにformat_error/1を準備する方法に関しては、次に記されている。

ここ(common_error)で使った方法は、ioモジュールとは若干異なっている(精神は同じだ)。

同じような方法は次でも使われている(これで全部かどうかは分からない)。

  1. kernal/src/file_io_server.erl
  2. syntax_tools/src/epp_dodger.erl
  3. stdlib/src/erl_lint.erl
  4. stdlib/src/erl_parse.erl
  5. stdlib/src/erl_scan.erl
  6. stdlib/src/ms_transform.erl
  7. stdlib/src/erl_tar.erl
  8. stdlib/src/beam_lib.erl

[追記]「無限大を含む整数算術」でcommon_error用にformat_errorを書いていたわ。[/追記]

common_errorモジュールのソース:

%% -*- coding: utf-8 -*-

%  %@doc 人間可読エラーメッセージの生成を支援する.
%% @docfile "common_error.edoc"

-module(common_error).
%-compile(export_all).
-export([format_error/1]).

%% 
%% @type error_reason() =   ErrId |
%%                         {ErrId, Hint} |
%%                         {{Mod, ErrId}, (Hint|none)} |
%%                         {{Mod, ErrId}, (Hint|none), MsgStr} |
%%                         {{Mod, ErrId}, (Hint|none), MsgStr, MsgArg}
%% where
%%  ErrId = atom(),
%%  Hint = any(),
%%  Mod = atom(),
%%  MsgStr = string(),
%%  MsgArg = [any()].
%%  これらは例外として投げるデータ。


%% @doc 例外として投げられたデータから、人間可読メッセージ文字列を生成する.
%% @spec (error_reason()) -> string()
format_error(Reason) when is_atom(Reason) ->
  atom_to_list(Reason);
format_error({ErrId, Hint}) when is_atom(ErrId) ->
  S = atom_to_list(ErrId) ++ io_lib:format(" ~p", [Hint]),
  lists:flatten(S);

format_error(Reason = {{Mod, ErrId}, Hint}) when is_atom(Mod) ->
  try
    Mod:format_error(Reason)
  catch
    error:undef ->
      S = atom_to_list(ErrId) ++ 
        if 
          Hint =:= none -> 
            "";
          true -> 
            io_lib:format(" ~p", [Hint])
        end,
      lists:flatten(S)
  end;
  
format_error({{_Mod, _ErrId}, _Hint, MsgStr}) ->
  MsgStr;

format_error({{_Mod, _ErrId}, _Hint, MsgStr, MsgArg}) ->
  S = io_lib:format(MsgStr, MsgArg),
  lists:flatten(S);
    
format_error(_Other) ->
  "unknown error".

*1:rationale、僕は、某氏の影響でこの言葉を口頭でしょっちゅう口にするけど、あまり一般的じゃないみたい。

JohnettaJohnetta2011/09/20 10:08There's a terrific aonumt of knowledge in this article!

idihtrvmidihtrvm2011/09/20 22:58Ae3uCQ <a href="http://olosettxchao.com/">olosettxchao</a>

sngxpjsngxpj2011/09/21 03:11ayOhXp , [url=http://zdziauunxamo.com/]zdziauunxamo[/url], [link=http://wtbahyieqovf.com/]wtbahyieqovf[/link], http://ozvgbmmbijrb.com/

ndincwbndincwb2011/09/25 02:04ON6kwd <a href="http://kcwkfgrvmnmy.com/">kcwkfgrvmnmy</a>

rjbiggyerjbiggye2011/10/03 22:37JsPlJf , [url=http://cqbwbbmunyno.com/]cqbwbbmunyno[/url], [link=http://fbfwknufklze.com/]fbfwknufklze[/link], http://qgontgbvollb.com/

MargarethMargareth2012/12/26 17:53Keep on wriitng and chugging away!

aeduguecaeduguec2012/12/28 17:05Tw7ofP , [url=http://yxsisfncoryo.com/]yxsisfncoryo[/url], [link=http://zdhwawfdimqa.com/]zdhwawfdimqa[/link], http://vvwqnyvdmkze.com/

hrrcbgrjvwhrrcbgrjvw2014/12/03 18:13majbwfsmboh, <a href="http://www.vaunvrflwj.com/">xopycnkhum</a> , [url=http://www.rxvsuexcfd.com/]xhxjttevzg[/url], http://www.ubizlzcddr.com/ xopycnkhum

LesnughLesnugh2018/04/20 19:05Propecia En Exceso <a href=http://cialiorder.com>cialis no prescription</a> Propecia Substitutes Prescription Viagra Rezeptfrei 25 Mg

ytaletnublytaletnubl2018/08/01 09:31<a href="http://motechautomotive.com">buy generic cialis online safely</a> cheap cialis 60 mg http://motechautomotive.com

ytaletkogxytaletkogx2018/08/02 08:09<a href="http://gigawatt6.com">order cialis usa</a> generic cialis canada online pharmacy http://gigawatt6.com

rtaletnqtqrtaletnqtq2018/08/03 05:53<a href="http://psychologytweets.com">mail order cialis from canada</a> cheap cialis prices uk http://psychologytweets.com

vtaletfhtavtaletfhta2018/08/04 05:45<a href="http://baymontelreno.com">buy cialis canada pharmacy</a> cheap cialis sale online http://baymontelreno.com

ttaletemjtttaletemjt2018/08/05 13:35<a href="http://onevoicemethod.com">cheap viagra</a> female viagra http://onevoicemethod.com

italetelsvitaletelsv2018/08/06 06:43<a href="http://bakerssign.com">cost of levitra</a> active ingredient in levitra http://bakerssign.com

btaletbgolbtaletbgol2018/08/07 02:06<a href="http://gigawatt6.com">generic cialis 100mg</a> cheap cialis 20mg http://gigawatt6.com

htaletmccvhtaletmccv2018/08/08 17:40<a href="http://psychologytweets.com">buy cialis online safely</a> viagra cialis online http://psychologytweets.com

ptaletgehkptaletgehk2018/08/18 09:47<a href="http://istanbulexpressonline.com">best viagra without side effects</a> can i take two 25 mg viagra http://istanbulexpressonline.com

ptaletdhswptaletdhsw2018/08/18 14:48<a href="http://mphasset.com">what are the effects of viagra on females</a> how long does it take for viagra to start working http://mphasset.com

qtaletplqpqtaletplqp2018/08/18 15:10<a href="http://missreplicawatches.com">cialis use</a> how many mg of cialis http://missreplicawatches.com

gtaletfpytgtaletfpyt2018/08/18 18:51<a href="http://mphasset.com">best non prescription viagra</a> viagra facts information http://mphasset.com

utaletnmqlutaletnmql2018/08/18 19:12<a href="http://istanbulexpressonline.com">can i buy viagra over the counter in uk</a> viagra online canada http://istanbulexpressonline.com

wtaletktygwtaletktyg2018/08/19 01:38<a href="http://gigawatt6.com">cialis dosage side effects</a> daily use cialis http://gigawatt6.com

ktaletrexlktaletrexl2018/08/19 04:48<a href="http://baymontelreno.com">how to buy cialis cheap</a> cialis commercials http://baymontelreno.com

mtaletuckgmtaletuckg2018/08/19 05:06<a href="http://bullsac.com">sale levitra</a> levitra prices http://bullsac.com

gtaletfvmzgtaletfvmz2018/08/19 10:33<a href="http://missreplicawatches.com">cialis discount coupon</a> price for cialis http://missreplicawatches.com

dtaletdkqmdtaletdkqm2018/08/19 10:50<a href="http://psychologytweets.com">cialis nose bleed</a> cialis not working anxiety http://psychologytweets.com

ataletnyvzataletnyvz2018/08/19 13:38<a href="http://psychologytweets.com">cialis street value</a> cialis c20 review http://psychologytweets.com

italetyjwiitaletyjwi2018/08/19 16:24<a href="http://psychologytweets.com">cialis 50mg</a> is cialis better than levitra http://psychologytweets.com

dtaletamgddtaletamgd2018/08/20 03:47<a href="http://psychologytweets.com">can i buy cialis over the counter</a> cialis timing http://psychologytweets.com

ptaletxlflptaletxlfl2018/08/20 04:05<a href="http://bakerssign.com">levitra tablets</a> levitra expiration date http://bakerssign.com

italetpqbqitaletpqbq2018/08/20 06:50<a href="http://psychologytweets.com">cialis dont work</a> cipla cialis http://psychologytweets.com

ytaletiwauytaletiwau2018/08/20 07:09<a href="http://psychologytweets.com">how long does cialis take</a> cialis prescribing information http://psychologytweets.com

wtaletcjdlwtaletcjdl2018/09/11 09:09<a href="http://istanbulexpressonline.com">cost of generic viagra</a> is there a womens viagra http://istanbulexpressonline.com

qtaletvwmvqtaletvwmv2018/09/11 12:53<a href="http://missreplicawatches.com">cialis 40mg</a> cialis use in women http://missreplicawatches.com

ltaletgnjxltaletgnjx2018/09/11 13:43<a href="http://mphasset.com">how long for viagra to kick in</a> viagra sale online http://mphasset.com

qtaletaszyqtaletaszy2018/09/11 15:11<a href="http://mphasset.com">substitute to viagra</a> viagra free trial http://mphasset.com

etaletrnimetaletrnim2018/09/11 16:15<a href="http://mphasset.com">can using viagra make you impotent</a> use of viagra for men http://mphasset.com

utaletocosutaletocos2018/09/11 18:28<a href="http://baymontelreno.com">buy cialis otc</a> free cialis pills http://baymontelreno.com

dtaletgwiddtaletgwid2018/09/11 23:41<a href="http://psychologytweets.com">taking 2 5mg cialis</a> fda approved cialis http://psychologytweets.com

ctaletmqrictaletmqri2018/09/12 03:09<a href="http://top-monterey-salinas-dentists.com">viagra vs cialis vs levitra</a> levitra 20 mg how long does it last http://top-monterey-salinas-dentists.com

qtaletcnynqtaletcnyn2018/09/12 06:50<a href="http://missreplicawatches.com">cheapest place to buy cialis</a> buy cialis in canada http://missreplicawatches.com

mtaletjtxjmtaletjtxj2018/09/12 07:54<a href="http://canadian-pharmasale.com">cheap cialis online usa</a> cialis 5mg best price http://canadian-pharmasale.com

ctaletimlqctaletimlq2018/09/12 09:31<a href="http://unishade.com">generic cialis 60 mg</a> cheap cialis canada http://unishade.com

otaletyvanotaletyvan2018/09/12 16:03<a href="http://rabbitinahat.com">buy cialis online prescription</a> cheap cialis 20mg pills http://rabbitinahat.com

jtaletxjsgjtaletxjsg2018/09/12 16:23<a href="http://buyviagraonl1ne.us">generic viagra online canadian pharmacy</a> generic viagra without prescription http://buyviagraonl1ne.us

etaletymibetaletymib2018/09/12 16:49<a href="http://canadian-pharmaonline.com">viagra online prescription</a> order viagra online overnight http://canadian-pharmaonline.com

utaletwpzqutaletwpzq2018/09/12 17:55<a href="http://buycialisonl1ne.us">order cialis online from canada</a> how to order cialis http://buycialisonl1ne.us

xtaletwtzmxtaletwtzm2018/09/12 20:49<a href="http://vico4me.com">buy viagra online legally</a> generic viagra no prescription http://vico4me.com

gtaletmwkmgtaletmwkm2018/09/12 23:23<a href="http://rabbitinahat.com">cheap cialis black</a> ordering cialis online http://rabbitinahat.com

gtaletcypkgtaletcypk2018/09/13 00:04<a href="http://vico4me.com">viagra online uk</a> generic viagra 50mg http://vico4me.com

ztaletyjiqztaletyjiq2018/09/13 00:42<a href="http://motechautomotive.com">order generic cialis india</a> buy cialis http://motechautomotive.com

btaletoorubtaletooru2018/09/13 07:27<a href="http://motechautomotive.com">buy cheap cialis australia</a> cheap cialis online canadian pharmacy http://motechautomotive.com

jtalethwyqjtalethwyq2018/09/13 08:44<a href="http://unishade.com">buy cialis daily online</a> order generic cialis online canada http://unishade.com

qtaletyvpcqtaletyvpc2018/09/13 08:52<a href="http://buycialisonlineglka.com">order cialis pills online</a> cialis pills http://buycialisonlineglka.com

staletaesdstaletaesd2018/09/13 12:52<a href="http://canadian-pharmaonline.com">best generic viagra online</a> cheap female viagra http://canadian-pharmaonline.com

etaletknbretaletknbr2018/09/13 17:32<a href="http://rabbitinahat.com">buy cialis online canada pharmacy</a> order cialis online in canada http://rabbitinahat.com

etaletwonmetaletwonm2018/09/13 20:45<a href="http://viciolatino.com">order viagra from india</a> generic viagra without prescription http://viciolatino.com

utaletxoqputaletxoqp2018/09/14 00:45<a href="http://zbloggers.com">propecia prescription</a> propecia lawsuit http://zbloggers.com

ctaletpzmxctaletpzmx2018/09/14 01:09<a href="http://valladium.com">discount cialis pills</a> order cialis online canada http://valladium.com

otaletevawotaletevaw2018/09/14 01:54<a href="http://buycialisonlineglka.com">cheap cialis canadian</a> cheapest cialis online http://buycialisonlineglka.com

vtaletoyzwvtaletoyzw2018/09/14 03:22<a href="http://vico4me.com">brand viagra online</a> buy generic viagra cheap http://vico4me.com

utaletrhrhutaletrhrh2018/09/14 03:34<a href="http://valladium.com">cheapest place to buy cialis</a> buy cialis without prescription http://valladium.com

ltaletieohltaletieoh2018/09/14 09:10<a href="http://valladium.com">generic cialis 5mg online</a> order cialis with no prescription http://valladium.com

vtaletpeutvtaletpeut2018/09/14 10:47<a href="http://baymontelreno.com">cheapest generic cialis</a> generic cialis without a prescription http://baymontelreno.com

vtalettxatvtalettxat2018/09/14 12:03<a href="http://buycialisonlineglka.com">cheap cialis in australia</a> cheap cialis 20mg online http://buycialisonlineglka.com

ktaletommuktaletommu2018/09/14 13:45<a href="http://zbloggers.com">propecia success rate</a> is propecia worth it http://zbloggers.com

dtaletrompdtaletromp2018/09/14 17:25<a href="http://usedrestaurantequipmentaz.com">order cialis from canada</a> cheap cialis tablet http://usedrestaurantequipmentaz.com

ctaletmkprctaletmkpr2018/09/14 19:21<a href="http://motechautomotive.com">order cialis online in canada</a> cheapest place to buy cialis http://motechautomotive.com

ftaletemeaftaletemea2018/09/14 20:21<a href="http://valladium.com">cheap cialis soft tabs</a> buy generic cialis online http://valladium.com

rtaletrhwortaletrhwo2018/09/14 21:00<a href="http://canadian-pharmasale.com">order cheap cialis</a> cialis online usa http://canadian-pharmasale.com

utaletvmkqutaletvmkq2018/09/15 02:59<a href="http://bullsac.com">viagra cialis levitra</a> levitra free trial http://bullsac.com

jtaletabbdjtaletabbd2018/09/15 06:38<a href="http://gigawatt6.com">order cialis paypal</a> generic cialis usa http://gigawatt6.com

ftaletpksiftaletpksi2018/09/15 06:52<a href="http://bullsac.com">how does levitra work</a> what is levitra http://bullsac.com

xtalethqjsxtalethqjs2018/09/15 07:30<a href="http://bullsac.com">which is better viagra levitra or cialis</a> levitra heartburn http://bullsac.com

etaletlfiuetaletlfiu2018/09/15 08:09<a href="http://gigawatt6.com">cheapest generic cialis online</a> buy cheap cialis australia http://gigawatt6.com

qtaletbdinqtaletbdin2018/09/15 09:07<a href="http://missreplicawatches.com">cheap cialis pills online</a> cheap viagra cialis uk http://missreplicawatches.com

ctaletilhictaletilhi2018/09/15 17:42<a href="http://top-monterey-salinas-dentists.com">where can i get levitra</a> how long does levitra take to start working http://top-monterey-salinas-dentists.com

rtaletzxyertaletzxye2018/09/15 17:46<a href="http://h-m-j.com">best place to buy viagra online</a> viagra coupon http://h-m-j.com

ntaletyaqpntaletyaqp2018/09/15 18:15<a href="http://h-m-j.com">viagra cheap online canada</a> canadian pharmacy generic viagra http://h-m-j.com

ttaletbbwzttaletbbwz2018/09/15 18:40<a href="http://missreplicawatches.com">order cialis australia</a> order generic cialis online canada http://missreplicawatches.com

htaletgvofhtaletgvof2018/09/15 19:53<a href="http://valladium.com">best generic cialis</a> order cialis online http://valladium.com

ptaletujgjptaletujgj2018/09/15 23:26<a href="http://top-monterey-salinas-dentists.com">levitra canadian online pharmacy</a> levitra 20 mg film coated tablets http://top-monterey-salinas-dentists.com

etaletgyidetaletgyid2018/09/16 01:39<a href="http://buyviagraonl1ne.us">cheap viagra sale</a> cheap viagra pills for sale http://buyviagraonl1ne.us

ttaletunlbttaletunlb2018/09/16 02:24<a href="http://bullsac.com">levitra free sample</a> how long does levitra 10mg last http://bullsac.com

htaletlbwphtaletlbwp2018/09/16 08:27<a href="http://buyviagraonl1ne.us">order viagra canada</a> order herbal viagra http://buyviagraonl1ne.us

ztaletmbzhztaletmbzh2018/09/16 08:46<a href="http://bullsac.com">levitra vs cialis vs viagra reviews</a> is cialis better than levitra http://bullsac.com

ftaletbtuyftaletbtuy2018/09/16 09:07<a href="http://zbloggers.com">propecia alternative</a> propecia pills http://zbloggers.com

ktaletefzaktaletefza2018/09/16 19:46<a href="http://buycialisonl1ne.us">cialis coupons</a> order generic cialis india http://buycialisonl1ne.us

ztaletmogqztaletmogq2018/09/17 05:44<a href="http://canadian-pharmasale.com">buy cialis 5mg online</a> cialis 20mg price http://canadian-pharmasale.com

ataletpafcataletpafc2018/09/17 06:08<a href="http://usedrestaurantequipmentaz.com">cheapest generic cialis online</a> buy cialis online http://usedrestaurantequipmentaz.com

ctaletxydmctaletxydm2018/09/17 08:03<a href="http://usedrestaurantequipmentaz.com">cheap cialis prices</a> best site to order cialis http://usedrestaurantequipmentaz.com

qtalettftvqtalettftv2018/09/17 10:43<a href="http://viciolatino.com">buy generic viagra</a> order viagra using paypal http://viciolatino.com

gtaletgvbfgtaletgvbf2018/09/17 14:10<a href="http://unishade.com">buy cialis 5mg</a> buy cialis online india http://unishade.com

dtaletofeudtaletofeu2018/09/17 19:57<a href="http://waltzweekend.com">generic viagra professional</a> discount viagra pills http://waltzweekend.com

wtaletpzrpwtaletpzrp2018/09/18 00:18<a href="http://missreplicawatches.com">cheap cialis online canadian pharmacy</a> buy cheap cialis 20mg http://missreplicawatches.com

rtaletkhusrtaletkhus2018/09/18 09:23<a href="http://usedrestaurantequipmentaz.com">cheap cialis tablets</a> best online pharmacy for cialis http://usedrestaurantequipmentaz.com

ntaletlqtmntaletlqtm2018/09/18 10:00<a href="http://top-monterey-salinas-dentists.com">levitra 20mg</a> discount coupons for levitra http://top-monterey-salinas-dentists.com

ntaletsghjntaletsghj2018/09/18 13:55<a href="http://gigawatt6.com">buy cialis overnight delivery</a> buy genuine cialis online http://gigawatt6.com

ctaletfymgctaletfymg2018/09/18 15:02<a href="http://waltzweekend.com">order brand viagra</a> cheapest generic viagra prices online http://waltzweekend.com

ttaletkxouttaletkxou2018/09/18 16:44<a href="http://motechautomotive.com">generic cialis without prescription</a> order cialis online no prescription http://motechautomotive.com

ShaylaInvixShaylaInvix2018/09/18 19:26SEO / SMMソフトウェア「XRumer 16.0 + XEvil 4.0」の革新的なアップデート:
Google(ReCaptcha-2とReCaptcha-3)、Facebook、BitFinex、Bing、Hotmail、SolveMedia、Yandex、
8400以上の別のタイプのキャプチャ、
最高精度(80..100%)と最高速度(100μg/秒)を備えています。
iMacros、XRumer、GSA SER、ZenoPoster、Srapebox、Senukeなど100以上の他のプログラムで、XEvil 4.0を最も人気のあるSEO / SMMソフトウェアで使用できます。

興味がある? YouTubeにはXEvilに関するビデオが多数紹介されています。
じゃあまたね ;)

utaletjzceutaletjzce2018/09/18 21:11<a href="http://top-monterey-salinas-dentists.com">levitra 20 mg cost</a> what do levitra pills look like http://top-monterey-salinas-dentists.com

btaletkrmqbtaletkrmq2018/09/19 00:50<a href="http://canadian-pharmabuy.com">discount viagra online</a> buy cheap generic viagra online http://canadian-pharmabuy.com

ctaletslytctaletslyt2018/09/19 01:15<a href="http://gigawatt6.com">order cialis online canada</a> order cialis australia http://gigawatt6.com

ltaletoiidltaletoiid2018/09/19 04:12<a href="http://valladium.com">buy cialis online safely</a> generic cialis 100mg http://valladium.com

gtaletvdtpgtaletvdtp2018/09/19 08:21<a href="http://h-m-j.com">buy viagra online cheap</a> viagra pills sale http://h-m-j.com

ytaletevzsytaletevzs2018/09/19 10:03<a href="http://gigawatt6.com">buy cheap cialis australia</a> brand cialis name online order http://gigawatt6.com

otaletoizfotaletoizf2018/09/19 15:40<a href="http://top-monterey-salinas-dentists.com">levitra pill</a> cheapest generic levitra http://top-monterey-salinas-dentists.com

wtaletptkgwtaletptkg2018/09/19 15:52<a href="http://valladium.com">buy cialis online prescription</a> order cialis no prescription canada http://valladium.com

ltaletsmvjltaletsmvj2018/09/19 19:59<a href="http://baymontelreno.com">cheap cialis pills online</a> buy cialis no prescription http://baymontelreno.com

ftaletnwczftaletnwcz2018/09/19 20:52<a href="http://missreplicawatches.com">buy cialis online prescription</a> cheap cialis canada http://missreplicawatches.com

etaletpezretaletpezr2018/09/20 03:02<a href="http://top-monterey-salinas-dentists.com">levitra 20 mg film coated tablets</a> levitra generic name http://top-monterey-salinas-dentists.com

staletmzhestaletmzhe2018/09/20 03:39<a href="http://gigawatt6.com">cialis pills</a> order generic cialis india http://gigawatt6.com

ztalettwrcztalettwrc2018/09/20 04:22<a href="http://baymontelreno.com">cheap cialis prices</a> cialis online us pharmacy http://baymontelreno.com

mtaletrzicmtaletrzic2018/09/20 04:38<a href="http://missreplicawatches.com">order brand cialis online</a> cialis order online uk http://missreplicawatches.com

etaletskevetaletskev2018/09/20 07:34<a href="http://timsbmw.com">buy levitra online</a> does levitra work better than viagra http://timsbmw.com

mtaletsnxfmtaletsnxf2018/09/20 09:55<a href="http://buycialisonlineglka.com">cheap cialis in australia</a> generic cialis online http://buycialisonlineglka.com

mtaletubppmtaletubpp2018/09/20 11:20<a href="http://missreplicawatches.com">can i buy cialis over the counter</a> order cialis online without prescription http://missreplicawatches.com

wtaletkuglwtaletkugl2018/09/20 12:09<a href="http://istanbulexpressonline.com">viagra online no prescription</a> viagra online paypal http://istanbulexpressonline.com

ftaletgwmxftaletgwmx2018/09/20 13:18<a href="http://buycialisonlineglka.com">canadian cialis generic</a> cheap cialis nz http://buycialisonlineglka.com

ttaletvjglttaletvjgl2018/09/20 15:37<a href="http://bullsac.com">women levitra</a> levitra brand online http://bullsac.com

ptaletmatcptaletmatc2018/09/20 19:41<a href="http://valladium.com">generic cialis</a> cheap cialis http://valladium.com

mtaletdxximtaletdxxi2018/09/20 21:30<a href="http://missreplicawatches.com">buy brand cialis</a> buy cialis online us http://missreplicawatches.com

ctaletnmqpctaletnmqp2018/09/20 21:41<a href="http://valladium.com">cheap cialis nz</a> cheap cialis online canadian pharmacy http://valladium.com

ntaletbnvontaletbnvo2018/09/20 22:11<a href="http://gigawatt6.com">order cialis from india</a> cialis online with prescription http://gigawatt6.com

jtalettlrljtalettlrl2018/09/21 02:09<a href="http://istanbulexpressonline.com">cheap pill viagra</a> best place to buy viagra online http://istanbulexpressonline.com

ttaletypzrttaletypzr2018/09/21 05:08<a href="http://gigawatt6.com">cheap cialis uk</a> cheap generic cialis canadian pharmacy http://gigawatt6.com

ztalettxjbztalettxjb2018/09/21 11:30<a href="http://timsbmw.com">buy levitra on line</a> side effects of levitra vs viagra http://timsbmw.com

ztaletqhxmztaletqhxm2018/09/24 03:42<a href="http://usedrestaurantequipmentaz.com">generic cialis cheapest price</a> cialis 5mg http://usedrestaurantequipmentaz.com

otaletpzitotaletpzit2018/09/24 07:30<a href="http://canadian-pharmaonline.com">viagra mail order usa</a> real viagra online http://canadian-pharmaonline.com

ktaletfdeaktaletfdea2018/09/24 07:41<a href="http://canadian-pharmacheap.com">buy cialis online cheap</a> order cialis http://canadian-pharmacheap.com

htaletvtcehtaletvtce2018/09/24 08:44<a href="http://bullsac.com">40 mg levitra one dose</a> levitra heartburn http://bullsac.com

rtaletrjfartaletrjfa2018/09/24 10:40<a href="http://buycialisonlineglka.com">buy cialis online in usa</a> order generic cialis india http://buycialisonlineglka.com

ptaletoaugptaletoaug2018/09/24 10:58<a href="http://canadian-pharmaonline.com">buy viagra internet</a> cheap herbal viagra http://canadian-pharmaonline.com

ltaletkiyzltaletkiyz2018/09/24 14:47<a href="http://canadian-pharmasale.com">generic cialis online usa</a> buy cialis online pharmacy http://canadian-pharmasale.com

ptaletiibqptaletiibq2018/09/24 18:57<a href="http://usedrestaurantequipmentaz.com">canadian pharmacy online cialis</a> mail order cialis online http://usedrestaurantequipmentaz.com

etaletfcvsetaletfcvs2018/09/24 20:07<a href="http://canadian-pharmacyiorder.com">cialis india cheap order</a> cialis cheap price http://canadian-pharmacyiorder.com

wtaletuphowtaletupho2018/09/24 21:29<a href="http://canadian-pharmacyionline.com">buy viagra internet</a> cheap viagra with prescription http://canadian-pharmacyionline.com

jtaletwzosjtaletwzos2018/09/24 21:35<a href="http://buyviagraonl1ne.us">buy viagra uk</a> discount viagra online http://buyviagraonl1ne.us

italetnhreitaletnhre2018/09/25 00:32<a href="http://baymontelreno.com">order viagra online without prescription</a> mail order viagra canada http://baymontelreno.com

utaletjhjlutaletjhjl2018/09/25 01:21<a href="http://canadian-pharmacyisale.com">buy generic viagra online canada</a> cheap viagra from canada http://canadian-pharmacyisale.com

rtaletxmnfrtaletxmnf2018/09/25 05:16<a href="http://buycialisonlineglka.com">non prescription cialis online pharmacy</a> buy cialis with prescription http://buycialisonlineglka.com

italetyysoitaletyyso2018/09/25 06:33<a href="http://canadian-pharmacyionline.com">purchase viagra online</a> cheap viagra sydney http://canadian-pharmacyionline.com

ptaletknonptaletknon2018/09/25 06:42<a href="http://baymontelreno.com">generic viagra price</a> buy viagra no prescription http://baymontelreno.com

qtaletphalqtaletphal2018/09/25 10:08<a href="http://vico4me.com">generic viagra usa</a> cheapest viagra online http://vico4me.com

mtaletgertmtaletgert2018/09/25 11:17<a href="http://unishade.com">cheap cialis online canadian pharmacy</a> buy cialis http://unishade.com

ktaletixxrktaletixxr2018/09/25 12:29<a href="http://canadian-pharmacheap.com">buy cialis online no prescription</a> cialis 20 mg http://canadian-pharmacheap.com

vtaletciogvtaletciog2018/09/25 18:11<a href="http://canadian-pharmacyisale.com">buy viagra in canada</a> cheap viagra paypal http://canadian-pharmacyisale.com

ktaletxmrmktaletxmrm2018/09/25 18:25<a href="http://canadian-pharmacyionline.com">order viagra softtabs</a> order brand viagra online http://canadian-pharmacyionline.com

qtaletxeloqtaletxelo2018/09/25 19:33<a href="http://valladium.com">cialis 40 mg online</a> cialis pill http://valladium.com

 |